ZGlmZiAtLWdpdCBhL1JFQURNRS5wYWdlc3BlZWQgYi9SRUFETUUucGFnZXNwZWVkCmluZGV4IDlhM2ViMmMuLjJiYzY0NTYgMTAwNjQ0Ci0tLSBhL1JFQURNRS5wYWdlc3BlZWQKKysrIGIvUkVBRE1FLnBhZ2VzcGVlZApAQCAtMTIsNCArMTIsNSBAQAogb3RoZXIgc2ltaWxhciB0b29scywgcmVhZCB0aGUgUE5HLVRlY2ggYXJ0aWNsZSAiQSBndWlkZSB0byBQTkcKIG9wdGltaXphdGlvbiIuCiAKLUxvY2FsIE1vZGlmaWNhdGlvbnM6IE5vbmUKK0xvY2FsIE1vZGlmaWNhdGlvbnM6IAorKiBvbmx5IHRoZSBvcG5ncmVkdWMgY29tcG9uZW50IG9mIG9wdGlwbmcgaXMgaW5jbHVkZWQuCmRpZmYgLS1naXQgYS9zcmMvY2V4Y2VwdC9SRUFETUUgYi9zcmMvY2V4Y2VwdC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiN2EzOGMuLjAwMDAwMDAKLS0tIGEvc3JjL2NleGNlcHQvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLWNleGNlcHQ6IFJFQURNRSAyLjAuMS1vcHRpcG5nICgyMDExLUp1bC0yMikKLVVwZGF0ZWQgYnkgQ29zbWluIFRydXRhCi0KLWh0dHA6Ly93d3cubmljZW1pY2UubmV0L2NleGNlcHQvCi0KLUFkYW0gTS4gQ29zdGVsbG8KLWh0dHA6Ly93d3cubmljZW1pY2UubmV0L2FtYy8KLQotY2V4Y2VwdCAocHJvbm91bmNlZCAic2VlIGV4Y2VwdCIgaW4gRW5nbGlzaCkgaXMgYSBwYWNrYWdlIHByb3ZpZGluZwotYSBUcnkvQ2F0Y2gvVGhyb3cgZXhjZXB0aW9uIGhhbmRsaW5nIGludGVyZmFjZSBmb3IgQU5TSSBDIChDODkgYW5kCi1zdWJzZXF1ZW50IElTTyBzdGFuZGFyZHMpLiAgSXQgZG9lcyBub3QgYXR0ZW1wdCB0byBoYW5kbGUgc3lzdGVtCi1leGNlcHRpb25zIGxpa2UgZmxvYXRpbmctcG9pbnQgZXhjZXB0aW9ucyBvciBhZGRyZXNzaW5nIGV4Y2VwdGlvbnMsIG5vcgotY29tcGlsZXItZ2VuZXJhdGVkIGV4Y2VwdGlvbnMgbGlrZSBDKysgZXhjZXB0aW9uczsgaXQgaXMgaW50ZW5kZWQgYXMgYW4KLWVuaGFuY2VkIHVzZXItZnJpZW5kbHkgYWx0ZXJuYXRpdmUgdG8gc2V0am1wKCkgYW5kIGxvbmdqbXAoKS4KLQotVGhlIHBhY2thZ2UgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmaWxlczoKLQotICAgIG5hbWUgICAgICAgIHZlcnNpb24KLSAgICAtLS0tLS0tLS0tICAtLS0tLS0tCi0gICAgUkVBRE1FICAgICAgIDIuMC4xLW9wdGlwbmcKLSAgICBjZXhjZXB0LmggICAgMi4wLjEtb3B0aXBuZwotICAgIGV4YW1wbGUxLmMgICAyLjAuMAotICAgIGV4YW1wbGUyLmMgICAyLjAuMAotICAgIHJhdGlvbmFsZSAgICAyLjAuMAotCi1UaGUgcGFja2FnZSBpcyBib3RoIGZyZWUtYXMtaW4tc3BlZWNoIGFuZCBmcmVlLWFzLWluLWJlZXI6Ci0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwOCBBZGFtIE0uIENvc3RlbGxvIGFuZCBDb3NtaW4gVHJ1dGEuCi0gICAgVGhpcyBwYWNrYWdlIG1heSBiZSBtb2RpZmllZCBvbmx5IGlmIGl0cyBhdXRob3IgYW5kIHZlcnNpb24KLSAgICBpbmZvcm1hdGlvbiBpcyB1cGRhdGVkIGFjY3VyYXRlbHksIGFuZCBtYXkgYmUgcmVkaXN0cmlidXRlZAotICAgIG9ubHkgaWYgYWNjb21wYW5pZWQgYnkgdGhpcyB1bmFsdGVyZWQgbm90aWNlLiAgU3ViamVjdCB0byB0aG9zZQotICAgIHJlc3RyaWN0aW9ucywgcGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byBkbyBhbnl0aGluZyB3aXRoCi0gICAgdGhpcyBwYWNrYWdlLiAgVGhlIGNvcHlyaWdodCBob2xkZXJzIG1ha2Ugbm8gZ3VhcmFudGVlcyByZWdhcmRpbmcKLSAgICB0aGlzIHBhY2thZ2UsIGFuZCBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBhbnkgZGFtYWdlIHJlc3VsdGluZyBmcm9tCi0gICAgaXRzIHVzZS4KLQotVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgUkVBRE1FIGZpbGUgY2FuIGJlIGNvbnNpZGVyZWQgdGhlIHZlcnNpb24KLW51bWJlciBvZiB0aGUgd2hvbGUgcGFja2FnZS4KLQotVGhlIGZpbGUgY2V4Y2VwdC5oIGNvbnRhaW5zIHRoZSBkb2N1bWVudGF0aW9uIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLWludGVyZmFjZS4gIFRoZSBvdGhlciBmaWxlcyBhcmUgc3VwcG9ydGluZyBkb2N1bWVudHMuCi0KLVRoZSBwcm9qZWN0IHdlYiBwYWdlIGlzOgotCi0gICAgaHR0cDovL3d3dy5uaWNlbWljZS5uZXQvY2V4Y2VwdC8KLQotSGVyZSBpcyBhbm90aGVyIHBsYWNlIHRvIG9idGFpbiB0aGUgcGFja2FnZSwgbm90IGd1YXJhbnRlZWQgdG8gYWx3YXlzCi1oYXZlIHRoZSB2ZXJ5IGxhdGVzdCB2ZXJzaW9uLCBidXQgcHJvYmFibHkgbW9yZSBoaWdobHkgYXZhaWxhYmxlOgotCi0gICAgaHR0cDovL2NleGNlcHQuc291cmNlZm9yZ2UubmV0LwotCi1UaGUgcmVtYWluZGVyIG9mIHRoaXMgZmlsZSBpcyBhIGxvZyBvZiBjaGFuZ2VzLgotCi0KLTIwMTEtSnVsLTIyLUZyaQotCi0gIGNleGNlcHQuaCAyLjAuMSAtLT4gMi4wLjEtb3B0aXBuZwotICAgICogTWFkZSBleGNlcHRpb25fX3ByZXYgdm9sYXRpbGUgdG8gYXZvaWQgInZhcmlhYmxlIG1pZ2h0IGJlIGNsb2JiZXJlZAotICAgICAgYnkgbG9uZ2ptcCIgd2FybmluZ3Mgd2hlbiBhIGZ1bmN0aW9uIGNvbnRhaW5zIG11bHRpcGxlIFRyeSBibG9ja3MuCi0KLTIwMDgtSnVsLTIzLVdlZAotCi0gIGNleGNlcHQuaCAyLjAuMCAtLT4gMi4wLjEKLSAgICAqIENsYXJpZmllZCB0aGUgbGljZW5zZS4KLSAgICAqIFJld29yZGVkIHRoZSBpbnRyb2R1Y3RvcnkgY29tbWVudHMuCi0gICAgKiBCdWcgZml4OiAgVGhlIHN0YXRlbWVudCBmb2xsb3dpbmcgVHJ5IGNvdWxkIG5vdCBiZSBhbiBpZi1zdGF0ZW1lbnQKLSAgICAgICh3aXRob3V0IGVsc2UpOyB0aGUgQ2F0Y2ggd291bGQgdGhlbiBiZSBwYXJzZWQgd3JvbmcuCi0gICAgKiBRdWlldGVkIGEgbmV3IHdhcm5pbmcgaW4gZ2NjIDQuMi4KLQotICBSRUFETUUgMi4wLjAgLS0+IDIuMC4xCi0gICAgKiBSZXdvcmRlZCB0aGUgbGljZW5zZSB0byBhZ3JlZSB3aXRoIGNleGNlcHQuaC4KLSAgICAqIFVwZGF0ZWQgdGhlIFVSTHMuCi0KLTIwMDEtSnVsLTEyLVRodQotCi0gIGNleGNlcHQuaCAxLjAuMCAtLT4gMi4wLjAKLSAgICAqIFRoZSBkb2N1bWVudGF0aW9uIGhhZCBuZWdsZWN0ZWQgdG8gbWVudGlvbiB0aGF0IHRoZSBDYXRjaAotICAgICAgZXhwcmVzc2lvbiB3YXMgZXZhbHVhdGVkIGJlZm9yZSB0aGUgVHJ5IGNsYXVzZSB3YXMgZXhlY3V0ZWQuCi0gICAgICBSYXRoZXIgdGhhbiBkb2N1bWVudCB0aGlzIHVuaW50dWl0aXZlIGJlaGF2aW9yLCB3ZSBoYXZlIGNoYW5nZWQKLSAgICAgIHRoZSBpbnRlcmZhY2Ugc28gdGhhdCB0aGUgQ2F0Y2ggZXhwcmVzc2lvbiBpcyBub3QgZXZhbHVhdGVkIHVubGVzcwotICAgICAgYW5kIHVudGlsIGFuIGV4Y2VwdGlvbiBpcyBjYXVnaHQuICBUaGlzIGNoYW5nZSB3aWxsIG5vdCBhZmZlY3QKLSAgICAgIGFwcGxpY2F0aW9ucyB0aGF0IG5ldmVyIHVzZWQgQ2F0Y2ggZXhwcmVzc2lvbnMgd2l0aCBzaWRlIGVmZmVjdHMuCi0gICAgKiBUaGUgaW1wbGVtZW50YXRpb24gaGFkIGJlZW4gdGVjaG5pY2FsbHkgaW5jb3JyZWN0IGJlY2F1c2UgaXQKLSAgICAgIG1vZGlmaWVkIHRoZSBvYmplY3QgbmFtZWQgYnkgdGhlIENhdGNoIGV4cHJlc3Npb24gYmV0d2VlbiB0aGUKLSAgICAgIHNldGptcCBhbmQgbG9uZ2ptcCBjYWxscywgZXZlbiB0aG91Z2ggaXQgbWlnaHQgYmUgYSBub24tdm9sYXRpbGUKLSAgICAgIGF1dG9tYXRpYyBvYmplY3QgKHdoaWNoIGl0IHdhcyBpbiBleGFtcGxlLmMpLiAgVGhlIHByb2JsZW0gKHdoaWNoCi0gICAgICBhZmZlY3RlZCBubyBrbm93biBjb21waWxlcnMpIGhhcyBiZWVuIGNvcnJlY3RlZCBieSBwZXJmb3JtaW5nIHR3bwotICAgICAgY29waWVzOiBmaXJzdCBpbnRvIHZvbGF0aWxlIHRlbXBvcmFyeSBzdG9yYWdlIGJlZm9yZSB0aGUgbG9uZ2ptcCwKLSAgICAgIHRoZW4gaW50byB0aGUgQ2F0Y2ggZXhwcmVzc2lvbiBhZnRlciB0aGUgbG9uZ2ptcC4KLSAgICAqIFRoZSByZXF1aXJlbWVudCB0aGF0IHRoZSBDYXRjaCBleHByZXNzaW9uIGhhdmUgdGhlICJleGFjdCBzYW1lCi0gICAgICB0eXBlIiB0aGF0IHdhcyBwYXNzZWQgdG8gZGVmaW5lX2V4Y2VwdGlvbl90eXBlKCkgaGFzIGJlZW4gc2xpZ2h0bHkKLSAgICAgIHJlbGF4ZWQgdG8gZGlzcmVnYXJkIHR5cGUgcXVhbGlmaWVycy4KLSAgICAqIEluIHRoZSBsaWNlbnNlLCAibm8gZ3VhcmFudGVlcyBhYm91dCB0aGUgY29ycmVjdG5lc3Mgb2YgdGhpcyBmaWxlIgotICAgICAgaGFzIGJlZW4gY2hhbmdlZCB0byAibm8gZ3VhcmFudGVlcyByZWdhcmRpbmcgdGhpcyBmaWxlIi4KLSAgICAqIE5vdGVzIGhhdmUgYmVlbiBhZGRlZCB0aGF0ICJyZWFsIiBleGNlcHRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLCBhbmQKLSAgICAgIHRoZSBzaXplIG9mIHRoZSBleGNlcHRpb24gdHlwZSBoYXMgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLgotCi0gIHJhdGlvbmFsZSAxLjAuMCAtLT4gMi4wLjAKLSAgICAqIFJlbW92ZWQgdGhlIG9ic29sZXRlIHF1ZXN0aW9uIGFib3V0IHdoeSB0aGUgQ2F0Y2ggZXhwcmVzc2lvbiBpcwotICAgICAgYWx3YXlzIGV2YWx1YXRlZC4KLSAgICAqIFVwZGF0ZWQgdGhlIGFuc3dlciB0byB0aGUgcXVlc3Rpb24gYWJvdXQgdGhlIHR5cGUgb2YgdGhlIENhdGNoCi0gICAgICBleHByZXNzaW9uLCB0byBjb3JyZXNwb25kIHRvIHRoZSBuZXcgaW1wbGVtZW50YXRpb24uCi0gICAgKiBBZGRlZCBhIHF1ZXN0aW9uIGFib3V0IHdoeSB0d28gY29waWVzIGFyZSBuZWNlc3NhcnkuCi0gICAgKiBBZGRlZCBhIHF1ZXN0aW9uIGFib3V0IHdoeSAicmVhbCIgZXhjZXB0aW9ucyBjYW5ub3QgYmUgY2F1Z2h0LgotCi0gIGV4YW1wbGUuYyAxLjAuMCAtLT4gZXhhbXBsZTEuYyAyLjAuMAotICBleGFtcGxlMi5jIDEuMC4wIC0tPiAyLjAuMAotICAgICogUmVuYW1lZCBleGFtcGxlLmMgdG8gZXhhbXBsZTEuYy4KLSAgICAqIENoYW5nZWQgdGhlIHZlcnNpb24gbnVtYmVyIHRvIGFncmVlIHdpdGggY2V4Y2VwdC5oIGluIHRoZSBmaXJzdAotICAgICAgdHdvIHBsYWNlcyAoMi4wLiopLgotCi0gIFJFQURNRSAxLjAuMCAtLT4gMi4wLjAKLSAgICAqIFJld29yZGVkIHRoZSBsaWNlbnNlIHRvIGFncmVlIHdpdGggY2V4Y2VwdC5oLgotICAgICogQ2hhbmdlZCB0aGUgdmVyc2lvbiBudW1iZXIgdG8gYWdyZWUgd2l0aCBjZXhjZXB0LmggaW4gdGhlIGZpcnN0Ci0gICAgICB0d28gcGxhY2VzICgyLjAuKikuCi0KLQotMjAwMC1KdW4tMjEtV2VkCi0KLSAgY2V4Y2VwdC5oIDAuNi4xIC0tPiAxLjAuMAotICAgICogQ2hhbmdlZCB0aGUgdmVyc2lvbiBudW1iZXIgdG8gaW5kaWNhdGUgc3RhYmlsaXR5LgotICAgICogQ2hhbmdlZCAiYW4gbHZhbHVlIiB0byAiYSBtb2RpZmlhYmxlIGx2YWx1ZSIgdG8gYWdyZWUgd2l0aCB0aGUKLSAgICAgIGxhbmd1YWdlIGluIHRoZSBJU08gQyBTdGFuZGFyZC4KLSAgICAqIEFkZGVkIGhpbnRzIGFib3V0IGRlYWxpbmcgd2l0aCB0aGUgaW5hYmlsaXR5IHRvIHJldHVybiBmcm9tIGEgVHJ5Ci0gICAgICBjbGF1c2UsIGFuZCB3aXRoIGF1dG9tYXRpYyB2YXJpYWJsZXMgbW9kaWZpZWQgd2l0aGluIGEgVHJ5IGNsYXVzZS4KLSAgICAqIENsYXJpZmllZCB0aGUgcmVzdHJpY3Rpb24gb24gVGhyb3cnaW5nIGEgY29tbWEtZXhwcmVzc2lvbi4KLQotICBleGFtcGxlLmMgMC42LjAgLS0+IDEuMC4wCi0gICAgKiBDaGFuZ2VkIHRoZSB2ZXJzaW9uIG51bWJlciB0byBhZ3JlZSB3aXRoIGNleGNlcHQuaCBpbiB0aGUgZmlyc3QKLSAgICAgIHR3byBwbGFjZXMgKDEuMC4qKS4KLQotICBleGFtcGxlMi5jIDAuNi4wIC0tPiAxLjAuMAotICAgICogQ2hhbmdlZCB0aGUgdmVyc2lvbiBudW1iZXIgdG8gYWdyZWUgd2l0aCBjZXhjZXB0LmggaW4gdGhlIGZpcnN0Ci0gICAgICB0d28gcGxhY2VzICgxLjAuKikuCi0KLSAgcmF0aW9uYWxlIDAuNi4xIC0tPiAxLjAuMAotICAgICogQ2hhbmdlZCB0aGUgdmVyc2lvbiBudW1iZXIgdG8gYWdyZWUgd2l0aCBjZXhjZXB0LmggaW4gdGhlIGZpcnN0Ci0gICAgICB0d28gcGxhY2VzICgxLjAuKikuCi0KLSAgUkVBRE1FIDAuNi4zIC0tPiAxLjAuMAotICAgICogQ2hhbmdlZCB0aGUgdmVyc2lvbiBudW1iZXIgdG8gYWdyZWUgd2l0aCBjZXhjZXB0LmggaW4gdGhlIGZpcnN0Ci0gICAgICB0d28gcGxhY2VzICgxLjAuKikuCi0KLQotMjAwMC1BcHItMjItU2F0Ci0KLSAgY2V4Y2VwdC5oIDAuNi4wIC0tPiAwLjYuMQotICAgICogQ2xhcmlmaWVkIHRoYXQgdGhlIHdyYXBwZXIgLmggZmlsZSBpcyBuZWVkZWQgb25seSB3aGVuIHRoZXJlIGFyZQotICAgICAgbXVsdGlwbGUgLmMgZmlsZXMuCi0KLQotMjAwMC1BcHItMDgtU2F0Ci0KLSAgcmF0aW9uYWxlIDAuNi4wIC0tPiAwLjYuMQotICAgICogQWRkZWQgcmF0aW9uYWxlIGZvciBkaXNhbGxvd2luZyBqdW1waW5nIGluL291dCBvZiBUcnkgY2xhdXNlcy4KLSAgICAqIEV4cGFuZGVkIHRoZSBkaXNjdXNzaW9uIG9mIGZpbmFsbHkgY2xhdXNlcy4KLSAgICAqIEFkZGVkIHJhdGlvbmFsZSBmb3IgdGhlIGxhY2sgb2YgZXhwcmVzc2lvbmxlc3MgVGhyb3cuCi0KLQotMjAwMC1BcHItMDctRnJpCi0KLSAgQ3JlYXRlZCBSRUFETUUsIHdoaWNoIGluY29ycG9yYXRlcyBjaGFuZ2Vsb2cuCi0KLSAgY2V4Y2VwdC5oIGFtYy4wLjUuMyAtLT4gMC42LjAKLSAgICAqIFRoZSBleHByZXNzaW9uIHBhc3NlZCB0byBDYXRjaCBtdXN0IG5vdyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgdHlwZQotICAgICAgcGFzc2VkIHRvIGRlZmluZV9leGNlcHRpb25fdHlwZSgpLCBhbmQgaXQgaXMgYWx3YXlzIGV2YWx1YXRlZAotICAgICAgZXhhY3RseSBvbmNlLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW4gZXhjZXB0aW9uIGlzIGNhdWdodC4KLSAgICAqIEFkZGVkIENhdGNoX2Fub255bW91cy4KLSAgICAqIENoYW5nZWQgaW5pdF9leGNlcHRpb25fY29udGV4dCgpIHRvIHRha2UgYW4gYXJndW1lbnQsIGFuZCB0byBiZQotICAgICAgb3B0aW9uYWwgZm9yIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGNvbnRleHRzLgotICAgICogQ2xhcmlmaWVkIGFsbG93YWJsZSBleGNlcHRpb24gdHlwZXMsIGFkZGVkIGV4YW1wbGVzLgotICAgICogQ2xhcmlmaWVkIHRoZSByZXN0cmljdGlvbnMgb24ganVtcGluZyBpbiBUcnkvQ2F0Y2ggc3RhdGVtZW50cy4KLSAgICAqIFJld29yZGVkIHNvbWUgb3RoZXIgcGFydHMgb2YgdGhlIGRvY3VtZW50YXRpb24uCi0KLSAgY2V4Y2VwdC1leGFtcGxlLmMgYW1jLjAuNS4wIC0tPiBleGFtcGxlLmMgMC42LjAKLSAgICAqIE5vdyB1c2VzIHRoZSAwLjYuKiBpbnRlcmZhY2UsIGFuZCBkZW1vbnN0cmF0ZXMgQ2F0Y2hfYW5vbnltb3VzLgotCi0gIGNleGNlcHQtZXhhbXBsZTIuYyBhbWMuMC41LjAgLS0+IGV4YW1wbGUyLmMgMC42LjAKLSAgICAqIE5vdyB1c2VzIHRoZSAwLjYuKiBpbnRlcmZhY2UuCi0KLSAgY2V4Y2VwdC1yYXRpb25hbGUgYW1jLjAuNS4xIC0tPiByYXRpb25hbGUgMC42LjAKLSAgICAqIEFkZGVkIHJhdGlvbmFsZSBmb3IgdGhlIG5ldyBDYXRjaCBleHByZXNzaW9uIHNlbWFudGljcy4KLQotCi0yMDAwLUFwci0wMS1GcmkKLQotICBjZXhjZXB0LmggYW1jLjAuNS4yIC0tPiBhbWMuMC41LjMKLSAgICAqIEVsaW1pbmF0ZWQgYSBjb21waWxlciB3YXJuaW5nIGFib3V0IGFuIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUuCi0gICAgKiBJbXByb3ZlZCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhbGxvd2FibGUgZXhjZXB0aW9uIHR5cGVzLgotICAgICogQWRkZWQgYWR2aWNlIGFib3V0IHVzaW5nIGEgbWFjcm8gZm9yIHRoZV9leGNlcHRpb25fY29udGV4dCwgYW5kCi0gICAgICBjaGFuZ2VkIHRoZSBleGFtcGxlIGFjY29yZGluZ2x5LgotICAgICogSW1wcm92ZWQgdGhlIGRvY3VtZW50YXRpb24gcmVnYXJkaW5nIGp1bXBpbmcgb3V0IG9mIFRyeSBhbmQgQ2F0Y2guCi0KLQotRWFybGllciBjaGFuZ2VzIHdlcmUgbm90IGxvZ2dlZC4KZGlmZiAtLWdpdCBhL3NyYy9jZXhjZXB0L1JFQURNRS5vcHRpcG5nLnR4dCBiL3NyYy9jZXhjZXB0L1JFQURNRS5vcHRpcG5nLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUxMmNhZi4uMDAwMDAwMAotLS0gYS9zcmMvY2V4Y2VwdC9SRUFETUUub3B0aXBuZy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1OYW1lOiBjZXhjZXB0Ci1TdW1tYXJ5OiBFeGNlcHRpb24gaGFuZGxpbmcgaW4gQwotQXV0aG9yczogQWRhbSBNLiBDb3N0ZWxsbyBhbmQgQ29zbWluIFRydXRhCi1WZXJzaW9uOiAyLjAuMS1vcHRpcG5nCi1CYXNlIHZlcnNpb246IDIuMC4xCi1VUkw6IGh0dHA6Ly93d3cubmljZW1pY2UubmV0L2NleGNlcHQvCi0KLUNoYW5nZXM6Ci0tIE1hZGUgZXhjZXB0aW9uX19wcmV2IHZvbGF0aWxlIHRvIGF2b2lkICJ2YXJpYWJsZSBtaWdodCBiZSBjbG9iYmVyZWQKLSAgYnkgbG9uZ2ptcCIgd2FybmluZ3Mgd2hlbiBhIGZ1bmN0aW9uIGNvbnRhaW5zIG11bHRpcGxlIFRyeSBibG9ja3MuCi0KLVBhdGNoOiBjZXhjZXB0LTItMC0xLW9wdGlwbmcuZGlmZgpkaWZmIC0tZ2l0IGEvc3JjL2NleGNlcHQvY2V4Y2VwdC0yLTAtMS1vcHRpcG5nLmRpZmYgYi9zcmMvY2V4Y2VwdC9jZXhjZXB0LTItMC0xLW9wdGlwbmcuZGlmZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc3ZDdkNy4uMDAwMDAwMAotLS0gYS9zcmMvY2V4Y2VwdC9jZXhjZXB0LTItMC0xLW9wdGlwbmcuZGlmZgorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLWRpZmYgLXJ1IGNleGNlcHQtMi0wLTEvY2V4Y2VwdC5oIGNleGNlcHQtMi0wLTEtb3B0aXBuZy9jZXhjZXB0LmgKLS0tLSBjZXhjZXB0LTItMC0xL2NleGNlcHQuaAkyMDA4LTA3LTIzIDE1OjM1OjUxLjAwMDAwMDAwMCAtMDQwMAotKysrIGNleGNlcHQtMi0wLTEtb3B0aXBuZy9jZXhjZXB0LmgJMjAxMS0wNy0yMiAwMDo0OTowMC4wMDAwMDAwMDAgLTA0MDAKLUBAIC0xLDYgKzEsOSBAQAotIC8qPT09Ci0tY2V4Y2VwdC5oIDIuMC4xICgyMDA4LUp1bC0xOS1TYXQpCi0rY2V4Y2VwdC5oIDIuMC4xLW9wdGlwbmcgKDIwMTEtSnVsLTIyKQotK0Rlcml2ZWQgZnJvbSBjZXhjZXB0LmggMi4wLjEgYnkgQ29zbWluIFRydXRhCi0rCi0gaHR0cDovL3d3dy5uaWNlbWljZS5uZXQvY2V4Y2VwdC8KLSsKLSBBZGFtIE0uIENvc3RlbGxvCi0gaHR0cDovL3d3dy5uaWNlbWljZS5uZXQvYW1jLwotIAotQEAgLTIxMCw3ICsyMTMsOCBAQAotIAotICNkZWZpbmUgVHJ5IFwKLSAgIHsgXAotLSAgICBqbXBfYnVmICpleGNlcHRpb25fX3ByZXYsIGV4Y2VwdGlvbl9fZW52OyBcCi0rICAgIGptcF9idWYgKiB2b2xhdGlsZSBleGNlcHRpb25fX3ByZXY7IFwKLSsgICAgam1wX2J1ZiBleGNlcHRpb25fX2VudjsgXAotICAgICBleGNlcHRpb25fX3ByZXYgPSB0aGVfZXhjZXB0aW9uX2NvbnRleHQtPnBlbnY7IFwKLSAgICAgdGhlX2V4Y2VwdGlvbl9jb250ZXh0LT5wZW52ID0gJmV4Y2VwdGlvbl9fZW52OyBcCi0gICAgIGlmIChzZXRqbXAoZXhjZXB0aW9uX19lbnYpID09IDApIHsgXAotZGlmZiAtcnUgY2V4Y2VwdC0yLTAtMS9SRUFETUUgY2V4Y2VwdC0yLTAtMS1vcHRpcG5nL1JFQURNRQotLS0tIGNleGNlcHQtMi0wLTEvUkVBRE1FCTIwMDgtMDctMjMgMTU6MzU6NTEuMDAwMDAwMDAwIC0wNDAwCi0rKysgY2V4Y2VwdC0yLTAtMS1vcHRpcG5nL1JFQURNRQkyMDExLTA3LTIyIDAwOjQ5OjAwLjAwMDAwMDAwMCAtMDQwMAotQEAgLTEsNSArMSw4IEBACi0tY2V4Y2VwdDogUkVBRE1FIDIuMC4xICgyMDA4LUp1bC0yMy1XZWQpCi0rY2V4Y2VwdDogUkVBRE1FIDIuMC4xLW9wdGlwbmcgKDIwMTEtSnVsLTIyKQotK1VwZGF0ZWQgYnkgQ29zbWluIFRydXRhCi0rCi0gaHR0cDovL3d3dy5uaWNlbWljZS5uZXQvY2V4Y2VwdC8KLSsKLSBBZGFtIE0uIENvc3RlbGxvCi0gaHR0cDovL3d3dy5uaWNlbWljZS5uZXQvYW1jLwotIAotQEAgLTE0LDggKzE3LDggQEAKLSAKLSAgICAgbmFtZSAgICAgICAgdmVyc2lvbgotICAgICAtLS0tLS0tLS0tICAtLS0tLS0tCi0tICAgIFJFQURNRSAgICAgICAyLjAuMQotLSAgICBjZXhjZXB0LmggICAgMi4wLjEKLSsgICAgUkVBRE1FICAgICAgIDIuMC4xLW9wdGlwbmcKLSsgICAgY2V4Y2VwdC5oICAgIDIuMC4xLW9wdGlwbmcKLSAgICAgZXhhbXBsZTEuYyAgIDIuMC4wCi0gICAgIGV4YW1wbGUyLmMgICAyLjAuMAotICAgICByYXRpb25hbGUgICAgMi4wLjAKLUBAIC00OSw2ICs1MiwxMiBAQAotIFRoZSByZW1haW5kZXIgb2YgdGhpcyBmaWxlIGlzIGEgbG9nIG9mIGNoYW5nZXMuCi0gCi0gCi0rMjAxMS1KdWwtMjItRnJpCi0rCi0rICBjZXhjZXB0LmggMi4wLjEgLS0+IDIuMC4xLW9wdGlwbmcKLSsgICAgKiBNYWRlIGV4Y2VwdGlvbl9fcHJldiB2b2xhdGlsZSB0byBhdm9pZCAidmFyaWFibGUgbWlnaHQgYmUgY2xvYmJlcmVkCi0rICAgICAgYnkgbG9uZ2ptcCIgd2FybmluZ3Mgd2hlbiBhIGZ1bmN0aW9uIGNvbnRhaW5zIG11bHRpcGxlIFRyeSBibG9ja3MuCi0rCi0gMjAwOC1KdWwtMjMtV2VkCi0gCi0gICBjZXhjZXB0LmggMi4wLjAgLS0+IDIuMC4xCmRpZmYgLS1naXQgYS9zcmMvY2V4Y2VwdC9jZXhjZXB0LmggYi9zcmMvY2V4Y2VwdC9jZXhjZXB0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNGRmOTkuLjAwMDAwMDAKLS0tIGEvc3JjL2NleGNlcHQvY2V4Y2VwdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qPT09Ci1jZXhjZXB0LmggMi4wLjEtb3B0aXBuZyAoMjAxMS1KdWwtMjIpCi1EZXJpdmVkIGZyb20gY2V4Y2VwdC5oIDIuMC4xIGJ5IENvc21pbiBUcnV0YQotCi1odHRwOi8vd3d3Lm5pY2VtaWNlLm5ldC9jZXhjZXB0LwotCi1BZGFtIE0uIENvc3RlbGxvCi1odHRwOi8vd3d3Lm5pY2VtaWNlLm5ldC9hbWMvCi0KLUFuIGludGVyZmFjZSBmb3IgZXhjZXB0aW9uLWhhbmRsaW5nIGluIEFOU0kgQyAoQzg5IGFuZCBzdWJzZXF1ZW50IElTTwotc3RhbmRhcmRzKSwgZGV2ZWxvcGVkIGpvaW50bHkgd2l0aCBDb3NtaW4gVHJ1dGEuCi0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwOCBBZGFtIE0uIENvc3RlbGxvIGFuZCBDb3NtaW4gVHJ1dGEuCi0gICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgbW9kaWZpZWQgb25seSBpZiBpdHMgYXV0aG9yIGFuZCB2ZXJzaW9uCi0gICAgaW5mb3JtYXRpb24gaXMgdXBkYXRlZCBhY2N1cmF0ZWx5LCBhbmQgbWF5IGJlIHJlZGlzdHJpYnV0ZWQKLSAgICBvbmx5IGlmIGFjY29tcGFuaWVkIGJ5IHRoaXMgdW5hbHRlcmVkIG5vdGljZS4gIFN1YmplY3QgdG8gdGhvc2UKLSAgICByZXN0cmljdGlvbnMsIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gZG8gYW55dGhpbmcKLSAgICB3aXRoIHRoaXMgc29mdHdhcmUuICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZSBubyBndWFyYW50ZWVzCi0gICAgcmVnYXJkaW5nIHRoaXMgc29mdHdhcmUsIGFuZCBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBhbnkgZGFtYWdlCi0gICAgcmVzdWx0aW5nIGZyb20gaXRzIHVzZS4KLQotVGhlIGNleGNlcHQgaW50ZXJmYWNlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggYW5kIGNhbm5vdCBpbnRlcmFjdAotd2l0aCBzeXN0ZW0gZXhjZXB0aW9ucyAobGlrZSBkaXZpc2lvbiBieSB6ZXJvIG9yIG1lbW9yeSBzZWdtZW50YXRpb24KLXZpb2xhdGlvbiksIGNvbXBpbGVyLWdlbmVyYXRlZCBleGNlcHRpb25zIChsaWtlIEMrKyBleGNlcHRpb25zKSwgb3IKLW90aGVyIGV4Y2VwdGlvbi1oYW5kbGluZyBpbnRlcmZhY2VzLgotCi1XaGVuIHVzaW5nIHRoaXMgaW50ZXJmYWNlIGFjcm9zcyBtdWx0aXBsZSAuYyBmaWxlcywgZG8gbm90IGluY2x1ZGUKLXRoaXMgaGVhZGVyIGZpbGUgZGlyZWN0bHkuICBJbnN0ZWFkLCBjcmVhdGUgYSB3cmFwcGVyIGhlYWRlciBmaWxlIHRoYXQKLWluY2x1ZGVzIHRoaXMgaGVhZGVyIGZpbGUgYW5kIHRoZW4gaW52b2tlcyB0aGUgZGVmaW5lX2V4Y2VwdGlvbl90eXBlCi1tYWNybyAoc2VlIGJlbG93KS4gIFRoZSAuYyBmaWxlcyBzaG91bGQgdGhlbiBpbmNsdWRlIHRoYXQgaGVhZGVyIGZpbGUuCi0KLVRoZSBpbnRlcmZhY2UgY29uc2lzdHMgb2Ygb25lIHR5cGUsIG9uZSB3ZWxsLWtub3duIG5hbWUsIGFuZCBzaXggbWFjcm9zLgotCi0KLWRlZmluZV9leGNlcHRpb25fdHlwZSh0eXBlX25hbWUpOwotCi0gICAgVGhpcyBtYWNybyBpcyB1c2VkIGxpa2UgYW4gZXh0ZXJuYWwgZGVjbGFyYXRpb24uICBJdCBzcGVjaWZpZXMKLSAgICB0aGUgdHlwZSBvZiBvYmplY3QgdGhhdCBnZXRzIGNvcGllZCBmcm9tIHRoZSBleGNlcHRpb24gdGhyb3dlciB0bwotICAgIHRoZSBleGNlcHRpb24gY2F0Y2hlci4gIFRoZSB0eXBlX25hbWUgY2FuIGJlIGFueSB0eXBlIHRoYXQgY2FuIGJlCi0gICAgYXNzaWduZWQgdG8sIHRoYXQgaXMsIGEgbm9uLWNvbnN0YW50IGFyaXRobWV0aWMgdHlwZSwgc3RydWN0LCB1bmlvbiwKLSAgICBvciBwb2ludGVyLiAgRXhhbXBsZXM6Ci0KLSAgICAgICAgZGVmaW5lX2V4Y2VwdGlvbl90eXBlKGludCk7Ci0KLSAgICAgICAgZW51bSBleGNlcHRpb24geyBvdXRfb2ZfbWVtb3J5LCBiYWRfYXJndW1lbnRzLCBkaXNrX2Z1bGwgfTsKLSAgICAgICAgZGVmaW5lX2V4Y2VwdGlvbl90eXBlKGVudW0gZXhjZXB0aW9uKTsKLQotICAgICAgICBzdHJ1Y3QgZXhjZXB0aW9uIHsgaW50IGNvZGU7IGNvbnN0IGNoYXIgKm1zZzsgfTsKLSAgICAgICAgZGVmaW5lX2V4Y2VwdGlvbl90eXBlKHN0cnVjdCBleGNlcHRpb24pOwotCi0gICAgQmVjYXVzZSB0aHJvd2luZyBhbiBleGNlcHRpb24gY2F1c2VzIHRoZSBvYmplY3QgdG8gYmUgY29waWVkIChub3QKLSAgICBqdXN0IG9uY2UsIGJ1dCB0d2ljZSksIHByb2dyYW1tZXJzIG1heSB3aXNoIHRvIGNvbnNpZGVyIHNpemUgd2hlbgotICAgIGNob29zaW5nIHRoZSBleGNlcHRpb24gdHlwZS4KLQotCi1zdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQ7Ci0KLSAgICBUaGlzIHR5cGUgbWF5IGJlIHVzZWQgYWZ0ZXIgdGhlIGRlZmluZV9leGNlcHRpb25fdHlwZSgpIG1hY3JvIGhhcwotICAgIGJlZW4gaW52b2tlZC4gIEEgc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0IG11c3QgYmUga25vd24gdG8gYm90aAotICAgIHRoZSB0aHJvd2VyIGFuZCB0aGUgY2F0Y2hlci4gIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlcmUgYmUgb25lCi0gICAgY29udGV4dCBmb3IgZWFjaCB0aHJlYWQgdGhhdCB1c2VzIGV4Y2VwdGlvbnMuICBJdCB3b3VsZCBjZXJ0YWlubHkKLSAgICBiZSBkYW5nZXJvdXMgZm9yIG11bHRpcGxlIHRocmVhZHMgdG8gYWNjZXNzIHRoZSBzYW1lIGNvbnRleHQuCi0gICAgT25lIHRocmVhZCBjYW4gdXNlIG11bHRpcGxlIGNvbnRleHRzLCBidXQgdGhhdCBpcyBsaWtlbHkgdG8gYmUKLSAgICBjb25mdXNpbmcgYW5kIG5vdCB0eXBpY2FsbHkgdXNlZnVsLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiBhbGxvY2F0ZQotICAgIHRoaXMgc3RydWN0dXJlIGluIGFueSB3YXkgaXQgcGxlYXNlcy0tYXV0b21hdGljLCBzdGF0aWMsIG9yIGR5bmFtaWMuCi0gICAgVGhlIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIgc2hvdWxkIHByZXRlbmQgbm90IHRvIGtub3cgdGhlIHN0cnVjdHVyZQotICAgIG1lbWJlcnMsIHdoaWNoIGFyZSBzdWJqZWN0IHRvIGNoYW5nZS4KLQotCi1zdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgKnRoZV9leGNlcHRpb25fY29udGV4dDsKLQotICAgIFRoZSBUcnkvQ2F0Y2ggYW5kIFRocm93IHN0YXRlbWVudHMgKGRlc2NyaWJlZCBiZWxvdykgaW1wbGljaXRseQotICAgIHJlZmVyIHRvIGEgY29udGV4dCwgdXNpbmcgdGhlIG5hbWUgdGhlX2V4Y2VwdGlvbl9jb250ZXh0LiAgSXQgaXMKLSAgICB0aGUgYXBwbGljYXRpb24ncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIG5hbWUgeWllbGRzCi0gICAgdGhlIGFkZHJlc3Mgb2YgYSBtdXRhYmxlIChub24tY29uc3RhbnQpIHN0cnVjdCBleGNlcHRpb25fY29udGV4dAotICAgIHdoZXJldmVyIHRob3NlIHN0YXRlbWVudHMgYXJlIHVzZWQuICBTdWJqZWN0IHRvIHRoYXQgY29uc3RyYWludCwgdGhlCi0gICAgYXBwbGljYXRpb24gbWF5IGRlY2xhcmUgYSB2YXJpYWJsZSBvZiB0aGlzIG5hbWUgYW55d2hlcmUgaXQgbGlrZXMKLSAgICAoaW5zaWRlIGEgZnVuY3Rpb24sIGluIGEgcGFyYW1ldGVyIGxpc3QsIG9yIGV4dGVybmFsbHkpLCBhbmQgbWF5Ci0gICAgdXNlIHdoYXRldmVyIHN0b3JhZ2UgY2xhc3Mgc3BlY2lmaWVycyAoc3RhdGljLCBleHRlcm4sIGV0Yykgb3IgdHlwZQotICAgIHF1YWxpZmllcnMgKGNvbnN0LCB2b2xhdGlsZSwgZXRjKSBpdCBsaWtlcy4gIEV4YW1wbGVzOgotCi0gICAgICAgIHN0YXRpYyBzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQKLSAgICAgICAgICAqIGNvbnN0IHRoZV9leGNlcHRpb25fY29udGV4dCA9ICZmb287Ci0KLSAgICAgICAgeyBzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgKnRoZV9leGNlcHRpb25fY29udGV4dCA9IGJhcjsgLi4uIH0KLQotICAgICAgICBpbnQgYmxhaChzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgKnRoZV9leGNlcHRpb25fY29udGV4dCwgLi4uKTsKLQotICAgICAgICBleHRlcm4gc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0IHRoZV9leGNlcHRpb25fY29udGV4dFsxXTsKLQotICAgIFRoZSBsYXN0IGV4YW1wbGUgaWxsdXN0cmF0ZXMgYSB0cmljayB0aGF0IGF2b2lkcyBjcmVhdGluZyBhIHBvaW50ZXIKLSAgICBvYmplY3Qgc2VwYXJhdGUgZnJvbSB0aGUgc3RydWN0dXJlIG9iamVjdC4KLQotICAgIFRoZSBuYW1lIGNvdWxkIGV2ZW4gYmUgYSBtYWNybywgZm9yIGV4YW1wbGU6Ci0KLSAgICAgICAgc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0IGVjX2FycmF5W251bXRocmVhZHNdOwotICAgICAgICAjZGVmaW5lIHRoZV9leGNlcHRpb25fY29udGV4dCAoZWNfYXJyYXkgKyB0aHJlYWRfaWQpCi0KLSAgICBCZSBhd2FyZSB0aGF0IHRoZV9leGNlcHRpb25fY29udGV4dCBpcyB1c2VkIHNldmVyYWwgdGltZXMgYnkgdGhlCi0gICAgVHJ5L0NhdGNoL1Rocm93IG1hY3Jvcywgc28gaXQgc2hvdWxkbid0IGJlIGV4cGVuc2l2ZSBvciBoYXZlIHNpZGUKLSAgICBlZmZlY3RzLiAgVGhlIGV4cGFuc2lvbiBtdXN0IGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYW4KLSAgICBpZGVudGlmaWVyLCBzbyBpdCdzIHNhZmVzdCB0byBwdXQgcGFyZW50aGVzZXMgYXJvdW5kIGl0LgotCi0KLXZvaWQgaW5pdF9leGNlcHRpb25fY29udGV4dChzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgKmVjKTsKLQotICAgIEZvciBjb250ZXh0IHN0cnVjdHVyZXMgYWxsb2NhdGVkIHN0YXRpY2FsbHkgKGJ5IGFuIGV4dGVybmFsCi0gICAgZGVmaW5pdGlvbiBvciB1c2luZyB0aGUgInN0YXRpYyIga2V5d29yZCksIHRoZSBpbXBsaWNpdAotICAgIGluaXRpYWxpemF0aW9uIHRvIGFsbCB6ZXJvcyBpcyBzdWZmaWNpZW50LCBidXQgY29udGV4dHMgYWxsb2NhdGVkCi0gICAgYnkgb3RoZXIgbWVhbnMgbXVzdCBiZSBpbml0aWFsaXplZCB1c2luZyB0aGlzIG1hY3JvIGJlZm9yZSB0aGV5Ci0gICAgYXJlIHVzZWQgYnkgYSBUcnkvQ2F0Y2ggc3RhdGVtZW50LiAgSXQgZG9lcyBubyBoYXJtIHRvIGluaXRpYWxpemUKLSAgICBhIGNvbnRleHQgbW9yZSB0aGFuIG9uY2UgKGJ5IHVzaW5nIHRoaXMgbWFjcm8gb24gYSBzdGF0aWNhbGx5Ci0gICAgYWxsb2NhdGVkIGNvbnRleHQsIG9yIHVzaW5nIHRoaXMgbWFjcm8gdHdpY2Ugb24gdGhlIHNhbWUgY29udGV4dCksCi0gICAgYnV0IGEgY29udGV4dCBtdXN0IG5vdCBiZSByZS1pbml0aWFsaXplZCBhZnRlciBpdCBoYXMgYmVlbiB1c2VkIGJ5IGEKLSAgICBUcnkvQ2F0Y2ggc3RhdGVtZW50LgotCi0KLVRyeSBzdGF0ZW1lbnQKLUNhdGNoIChleHByZXNzaW9uKSBzdGF0ZW1lbnQKLQotICAgIFRoZSBUcnkvQ2F0Y2gvVGhyb3cgbWFjcm9zIGFyZSBjYXBpdGFsaXplZCBpbiBvcmRlciB0byBhdm9pZAotICAgIGNvbmZ1c2lvbiB3aXRoIHRoZSBDKysga2V5d29yZHMsIHdoaWNoIGhhdmUgc3VidGx5IGRpZmZlcmVudAotICAgIHNlbWFudGljcy4KLQotICAgIEEgVHJ5L0NhdGNoIHN0YXRlbWVudCBoYXMgYSBzeW50YXggc2ltaWxhciB0byBhbiBpZi9lbHNlIHN0YXRlbWVudCwKLSAgICBleGNlcHQgdGhhdCB0aGUgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIGdvZXMgYWZ0ZXIgdGhlIHNlY29uZAotICAgIGtleXdvcmQgcmF0aGVyIHRoYW4gdGhlIGZpcnN0LiAgQXMgd2l0aCBpZi9lbHNlLCB0aGVyZSBhcmUgdHdvCi0gICAgY2xhdXNlcywgZWFjaCBvZiB3aGljaCBtYXkgYmUgYSBzaW1wbGUgc3RhdGVtZW50IGVuZGluZyB3aXRoIGEKLSAgICBzZW1pY29sb24gb3IgYSBicmFjZS1lbmNsb3NlZCBjb21wb3VuZCBzdGF0ZW1lbnQuICBCdXQgd2hlcmVhcwotICAgIHRoZSBlbHNlIGNsYXVzZSBpcyBvcHRpb25hbCwgdGhlIENhdGNoIGNsYXVzZSBpcyByZXF1aXJlZC4gIFRoZQotICAgIGV4cHJlc3Npb24gbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlIChzb21ldGhpbmcgY2FwYWJsZSBvZiBiZWluZwotICAgIGFzc2lnbmVkIHRvKSBvZiB0aGUgc2FtZSB0eXBlIChkaXNyZWdhcmRpbmcgdHlwZSBxdWFsaWZpZXJzKSB0aGF0Ci0gICAgd2FzIHBhc3NlZCB0byBkZWZpbmVfZXhjZXB0aW9uX3R5cGUoKS4KLQotICAgIElmIGEgVGhyb3cgdGhhdCB1c2VzIHRoZSBzYW1lIGV4Y2VwdGlvbiBjb250ZXh0IGFzIHRoZSBUcnkvQ2F0Y2ggaXMKLSAgICBleGVjdXRlZCB3aXRoaW4gdGhlIFRyeSBjbGF1c2UgKHR5cGljYWxseSB3aXRoaW4gYSBmdW5jdGlvbiBjYWxsZWQKLSAgICBieSB0aGUgVHJ5IGNsYXVzZSksIGFuZCB0aGUgZXhjZXB0aW9uIGlzIG5vdCBjYXVnaHQgYnkgYSBuZXN0ZWQKLSAgICBUcnkvQ2F0Y2ggc3RhdGVtZW50LCB0aGVuIGEgY29weSBvZiB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgYXNzaWduZWQKLSAgICB0byB0aGUgZXhwcmVzc2lvbiwgYW5kIGNvbnRyb2wgd2lsbCBqdW1wIHRvIHRoZSBDYXRjaCBjbGF1c2UuICBJZiBubwotICAgIHN1Y2ggVGhyb3cgaXMgZXhlY3V0ZWQsIHRoZW4gdGhlIGFzc2lnbm1lbnQgaXMgbm90IHBlcmZvcm1lZCwgYW5kCi0gICAgdGhlIENhdGNoIGNsYXVzZSBpcyBub3QgZXhlY3V0ZWQuCi0KLSAgICBUaGUgZXhwcmVzc2lvbiBpcyBub3QgZXZhbHVhdGVkIHVubGVzcyBhbmQgdW50aWwgdGhlIGV4Y2VwdGlvbiBpcwotICAgIGNhdWdodCwgd2hpY2ggaXMgc2lnbmlmaWNhbnQgaWYgaXQgaGFzIHNpZGUgZWZmZWN0cywgZm9yIGV4YW1wbGU6Ci0KLSAgICAgICAgVHJ5IGZvbygpOwotICAgICAgICBDYXRjaCAocFsrK2ldLmUpIHsgLi4uIH0KLQotICAgIElNUE9SVEFOVDogSnVtcGluZyBpbnRvIG9yIG91dCBvZiBhIFRyeSBjbGF1c2UgKGZvciBleGFtcGxlIHZpYQotICAgIHJldHVybiwgYnJlYWssIGNvbnRpbnVlLCBnb3RvLCBsb25nam1wKSBpcyBmb3JiaWRkZW4tLXRoZSBjb21waWxlcgotICAgIHdpbGwgbm90IGNvbXBsYWluLCBidXQgYmFkIHRoaW5ncyB3aWxsIGhhcHBlbiBhdCBydW4tdGltZS4gIEp1bXBpbmcKLSAgICBpbnRvIG9yIG91dCBvZiBhIENhdGNoIGNsYXVzZSBpcyBva2F5LCBhbmQgc28gaXMganVtcGluZyBhcm91bmQKLSAgICBpbnNpZGUgYSBUcnkgY2xhdXNlLiAgSW4gbWFueSBjYXNlcyB3aGVyZSBvbmUgaXMgdGVtcHRlZCB0byByZXR1cm4KLSAgICBmcm9tIGEgVHJ5IGNsYXVzZSwgaXQgd2lsbCBzdWZmaWNlIHRvIHVzZSBUaHJvdywgYW5kIHRoZW4gcmV0dXJuCi0gICAgZnJvbSB0aGUgQ2F0Y2ggY2xhdXNlLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gc2V0IGEgZmxhZyB2YXJpYWJsZSBhbmQKLSAgICB1c2UgZ290byB0byBqdW1wIHRvIHRoZSBlbmQgb2YgdGhlIFRyeSBjbGF1c2UsIHRoZW4gY2hlY2sgdGhlIGZsYWcKLSAgICBhZnRlciB0aGUgVHJ5L0NhdGNoIHN0YXRlbWVudC4KLQotICAgIElNUE9SVEFOVDogVGhlIHZhbHVlcyBvZiBhbnkgbm9uLXZvbGF0aWxlIGF1dG9tYXRpYyB2YXJpYWJsZXMKLSAgICBjaGFuZ2VkIHdpdGhpbiB0aGUgVHJ5IGNsYXVzZSBhcmUgdW5kZWZpbmVkIGFmdGVyIGFuIGV4Y2VwdGlvbiBpcwotICAgIGNhdWdodC4gIFRoZXJlZm9yZSwgdmFyaWFibGVzIG1vZGlmaWVkIGluc2lkZSB0aGUgVHJ5IGJsb2NrIHdob3NlCi0gICAgdmFsdWVzIGFyZSBuZWVkZWQgbGF0ZXIgb3V0c2lkZSB0aGUgVHJ5IGJsb2NrIG11c3QgZWl0aGVyIHVzZSBzdGF0aWMKLSAgICBzdG9yYWdlIG9yIGJlIGRlY2xhcmVkIHdpdGggdGhlICJ2b2xhdGlsZSIgdHlwZSBxdWFsaWZpZXIuCi0KLQotVGhyb3cgZXhwcmVzc2lvbjsKLQotICAgIEEgVGhyb3cgc3RhdGVtZW50IGlzIHZlcnkgbXVjaCBsaWtlIGEgcmV0dXJuIHN0YXRlbWVudCwgZXhjZXB0IHRoYXQKLSAgICB0aGUgZXhwcmVzc2lvbiBpcyByZXF1aXJlZC4gIFdoZXJlYXMgcmV0dXJuIGp1bXBzIGJhY2sgdG8gdGhlIHBsYWNlCi0gICAgd2hlcmUgdGhlIGN1cnJlbnQgZnVuY3Rpb24gd2FzIGNhbGxlZCwgVGhyb3cganVtcHMgYmFjayB0byB0aGUgQ2F0Y2gKLSAgICBjbGF1c2Ugb2YgdGhlIGlubmVybW9zdCBlbmNsb3NpbmcgVHJ5IGNsYXVzZS4gIFRoZSBleHByZXNzaW9uIG11c3QKLSAgICBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHR5cGUgcGFzc2VkIHRvIGRlZmluZV9leGNlcHRpb25fdHlwZSgpLiAgVGhlCi0gICAgZXhjZXB0aW9uIG11c3QgYmUgY2F1Z2h0LCBvdGhlcndpc2UgdGhlIHByb2dyYW0gbWF5IGNyYXNoLgotCi0gICAgU2xpZ2h0IGxpbWl0YXRpb246ICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBhIGNvbW1hLWV4cHJlc3Npb24sIGl0IG11c3QKLSAgICBiZSBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcy4KLQotCi1Ucnkgc3RhdGVtZW50Ci1DYXRjaF9hbm9ueW1vdXMgc3RhdGVtZW50Ci0KLSAgICBXaGVuIHRoZSB2YWx1ZSBvZiB0aGUgZXhjZXB0aW9uIGlzIG5vdCBuZWVkZWQsIGEgVHJ5L0NhdGNoIHN0YXRlbWVudAotICAgIGNhbiB1c2UgQ2F0Y2hfYW5vbnltb3VzIGluc3RlYWQgb2YgQ2F0Y2ggKGV4cHJlc3Npb24pLgotCi0KLUV2ZXJ5dGhpbmcgYmVsb3cgdGhpcyBwb2ludCBpcyBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlIGNvbXBpbGVyLiAgVGhlCi1hcHBsaWNhdGlvbiBwcm9ncmFtbWVyIHNob3VsZCBwcmV0ZW5kIG5vdCB0byBrbm93IGFueSBvZiBpdCwgYmVjYXVzZSBpdAotaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0KLT09PSovCi0KLQotI2lmbmRlZiBDRVhDRVBUX0gKLSNkZWZpbmUgQ0VYQ0VQVF9ICi0KLQotI2luY2x1ZGUgPHNldGptcC5oPgotCi0jZGVmaW5lIGRlZmluZV9leGNlcHRpb25fdHlwZShldHlwZSkgXAotc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0IHsgXAotICBqbXBfYnVmICpwZW52OyBcCi0gIGludCBjYXVnaHQ7IFwKLSAgdm9sYXRpbGUgc3RydWN0IHsgZXR5cGUgZXRtcDsgfSB2OyBcCi19Ci0KLS8qIGV0bXAgbXVzdCBiZSB2b2xhdGlsZSBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiBtaWdodCB1c2UgYXV0b21hdGljICovCi0vKiBzdG9yYWdlIGZvciB0aGVfZXhjZXB0aW9uX2NvbnRleHQsIGFuZCBldG1wIGlzIG1vZGlmaWVkIGJldHdlZW4gICAqLwotLyogdGhlIGNhbGxzIHRvIHNldGptcCgpIGFuZCBsb25nam1wKCkuICBBIHdyYXBwZXIgc3RydWN0IGlzIHVzZWQgdG8gKi8KLS8qIGF2b2lkIHdhcm5pbmdzIGFib3V0IGEgZHVwbGljYXRlIHZvbGF0aWxlIHF1YWxpZmllciBpbiBjYXNlIGV0eXBlICovCi0vKiBhbHJlYWR5IGluY2x1ZGVzIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIGluaXRfZXhjZXB0aW9uX2NvbnRleHQoZWMpICgodm9pZCkoKGVjKS0+cGVudiA9IDApKQotCi0jZGVmaW5lIFRyeSBcCi0gIHsgXAotICAgIGptcF9idWYgKiB2b2xhdGlsZSBleGNlcHRpb25fX3ByZXY7IFwKLSAgICBqbXBfYnVmIGV4Y2VwdGlvbl9fZW52OyBcCi0gICAgZXhjZXB0aW9uX19wcmV2ID0gdGhlX2V4Y2VwdGlvbl9jb250ZXh0LT5wZW52OyBcCi0gICAgdGhlX2V4Y2VwdGlvbl9jb250ZXh0LT5wZW52ID0gJmV4Y2VwdGlvbl9fZW52OyBcCi0gICAgaWYgKHNldGptcChleGNlcHRpb25fX2VudikgPT0gMCkgeyBcCi0gICAgICBkbwotCi0jZGVmaW5lIGV4Y2VwdGlvbl9fY2F0Y2goYWN0aW9uKSBcCi0gICAgICB3aGlsZSAodGhlX2V4Y2VwdGlvbl9jb250ZXh0LT5jYXVnaHQgPSAwLCBcCi0gICAgICAgICAgICAgdGhlX2V4Y2VwdGlvbl9jb250ZXh0LT5jYXVnaHQpOyBcCi0gICAgfSBcCi0gICAgZWxzZSB7IFwKLSAgICAgIHRoZV9leGNlcHRpb25fY29udGV4dC0+Y2F1Z2h0ID0gMTsgXAotICAgIH0gXAotICAgIHRoZV9leGNlcHRpb25fY29udGV4dC0+cGVudiA9IGV4Y2VwdGlvbl9fcHJldjsgXAotICB9IFwKLSAgaWYgKCF0aGVfZXhjZXB0aW9uX2NvbnRleHQtPmNhdWdodCB8fCBhY3Rpb24pIHsgfSBcCi0gIGVsc2UKLQotI2RlZmluZSBDYXRjaChlKSBleGNlcHRpb25fX2NhdGNoKCgoZSkgPSB0aGVfZXhjZXB0aW9uX2NvbnRleHQtPnYuZXRtcCwgMCkpCi0jZGVmaW5lIENhdGNoX2Fub255bW91cyBleGNlcHRpb25fX2NhdGNoKDApCi0KLS8qIFRyeSBlbmRzIHdpdGggZG8sIGFuZCBDYXRjaCBiZWdpbnMgd2l0aCB3aGlsZSgwKSBhbmQgZW5kcyB3aXRoICAgICAqLwotLyogZWxzZSwgdG8gZW5zdXJlIHRoYXQgVHJ5L0NhdGNoIHN5bnRheCBpcyBzaW1pbGFyIHRvIGlmL2Vsc2UgICAgICAgICovCi0vKiBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIDAgaW4gd2hpbGUoMCkgaXMgZXhwcmVzc2VkIGFzIHg9MCx4IGluIG9yZGVyIHRvIGFwcGVhc2UgICAgICAgICovCi0vKiBjb21waWxlcnMgdGhhdCB3YXJuIGFib3V0IGNvbnN0YW50IGV4cHJlc3Npb25zIGluc2lkZSB3aGlsZSgpLiAgICAgKi8KLS8qIE1vc3QgY29tcGlsZXJzIHNob3VsZCBzdGlsbCByZWNvZ25pemUgdGhhdCB0aGUgY29uZGl0aW9uIGlzIGFsd2F5cyAqLwotLyogZmFsc2UgYW5kIGF2b2lkIGdlbmVyYXRpbmcgY29kZSBmb3IgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgVGhyb3cgXAotICBmb3IgKDs7IGxvbmdqbXAoKnRoZV9leGNlcHRpb25fY29udGV4dC0+cGVudiwgMSkpIFwKLSAgICB0aGVfZXhjZXB0aW9uX2NvbnRleHQtPnYuZXRtcCA9Ci0KLQotI2VuZGlmIC8qIENFWENFUFRfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NleGNlcHQvZXhhbXBsZTEuYyBiL3NyYy9jZXhjZXB0L2V4YW1wbGUxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NjUxODEuLjAwMDAwMDAKLS0tIGEvc3JjL2NleGNlcHQvZXhhbXBsZTEuYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qPT09Ci1jZXhjZXB0OiBleGFtcGxlMS5jIDIuMC4wICgyMDAxLUp1bC0xMi1UaHUpCi1BZGFtIE0uIENvc3RlbGxvIDxhbWNAY3MuYmVya2VsZXkuZWR1PgotCi1BbiBleGFtcGxlIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgdmVyc2lvbiAyLjAuKiBvZiB0aGUKLWNleGNlcHQuaCBpbnRlcmZhY2UuICBTZWUgUkVBRE1FIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24uCi0KLVRoaXMgYXBwbGljYXRpb24gaXMgc2luZ2xlLXRocmVhZGVkIGFuZCB1c2VzIGEgZ2xvYmFsIGV4Y2VwdGlvbiBjb250ZXh0LgotCi1TZWUgZXhhbXBsZTIuYyBmb3IgYSBkZW1vbnN0cmF0aW9uIG9mIG5lc3RlZCBUcnkgYmxvY2tzLCBhdm9pZGFuY2Ugb2YKLWdsb2JhbCB2YXJpYWJsZXMgYnkgcGFzc2luZyB0aGUgY29udGV4dCBpbiBmdW5jdGlvbiBhcmd1bWVudHMsIGFuZCB0aGUKLXVzZSBvZiBhIHBvbHltb3JwaGljIGV4Y2VwdGlvbiB0eXBlLgotCi09PT0qLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0KLS8qIFRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb25zIHdvdWxkIG5vcm1hbGx5IGdvIGluIGEgc2VwYXJhdGUgLmggZmlsZTogKi8KLQotI2luY2x1ZGUgImNleGNlcHQuaCIKLWRlZmluZV9leGNlcHRpb25fdHlwZShpbnQpOwotZXh0ZXJuIHN0cnVjdCBleGNlcHRpb25fY29udGV4dCB0aGVfZXhjZXB0aW9uX2NvbnRleHRbMV07Ci0KLS8qIEVuZCBvZiBzZXBhcmF0ZSAuaCBmaWxlLiAqLwotCi0KLXZvaWQgZGVtb190aHJvdyhpbnQgZmFpbCkKLXsKLSAgZnByaW50ZihzdGRlcnIsICJlbnRlciBkZW1vX3Rocm93KCVkKVxuIiwgZmFpbCk7Ci0gIGlmIChmYWlsKSBUaHJvdyA0MjsKLSAgZnByaW50ZihzdGRlcnIsICJyZXR1cm4gZnJvbSBkZW1vX3Rocm93KCVkKVxuIiwgZmFpbCk7Ci19Ci0KLQotdm9pZCBmb28oaW50IGZhaWwpCi17Ci0gIGZwcmludGYoc3RkZXJyLCAiZW50ZXIgZm9vKCVkKVxuIiwgZmFpbCk7Ci0gIGRlbW9fdGhyb3coZmFpbCk7Ci0gIGZwcmludGYoc3RkZXJyLCAicmV0dXJuIGZyb20gZm9vKCVkKVxuIiwgZmFpbCk7Ci19Ci0KLQotLyogR2xvYmFsbHkgYWNjZXNzaWJsZSBzdG9yYWdlIGZvciB0aGUgZXhjZXB0aW9uIGNvbnRleHQ6ICovCi0KLXN0cnVjdCBleGNlcHRpb25fY29udGV4dCB0aGVfZXhjZXB0aW9uX2NvbnRleHRbMV07Ci0KLQotaW50IG1haW4oKQotewotICBpbnQgZTsKLQotICBUcnkgewotICAgIGZvbygwKTsKLSAgICBmb28oMSk7Ci0gICAgZm9vKDIpOwotICB9Ci0gIENhdGNoIChlKSBmcHJpbnRmKHN0ZGVyciwgImV4Y2VwdGlvbiAlZFxuIiwgZSk7Ci0KLSAgVHJ5IGZvbygzKTsKLSAgQ2F0Y2hfYW5vbnltb3VzIGZwcmludGYoc3RkZXJyLCAiYW5vbnltb3VzIGV4Y2VwdGlvblxuIik7Ci0KLSAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jZXhjZXB0L2V4YW1wbGUyLmMgYi9zcmMvY2V4Y2VwdC9leGFtcGxlMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWY2NGM0Li4wMDAwMDAwCi0tLSBhL3NyYy9jZXhjZXB0L2V4YW1wbGUyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyo9PT0KLWNleGNlcHQ6IGV4YW1wbGUyLmMgMi4wLjAgKDIwMDEtTWFyLTIxLVdlZCkKLUFkYW0gTS4gQ29zdGVsbG8gPGFtY0Bjcy5iZXJrZWxleS5lZHU+Ci0KLUFuIGV4YW1wbGUgYXBwbGljYXRpb24gdGhhdCBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSB2ZXJzaW9uIDIuMC4qIG9mIHRoZQotY2V4Y2VwdC5oIGludGVyZmFjZSB0byBwcm92aWRlIHBvbHltb3JwaGljIGV4Y2VwdGlvbnMsIHdoaWxlIGF2b2lkaW5nCi10aGUgdXNlIG9mIGdsb2JhbCB2YXJpYWJsZXMuICBJdCBhbHNvIGlsbHVzdHJhdGVzIHRoZSB1c2Ugb2YgZHluYW1pY2FsbHkKLW5lc3RlZCBUcnkgYmxvY2tzLgotCi1TZWUgUkVBRE1FIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24uCi0KLVNlZSBleGFtcGxlLmMgZm9yIGEgc2ltcGxlciBleGFtcGxlLgotCi09PT0qLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0KLS8qIFRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb25zIHdvdWxkIG5vcm1hbGx5IGdvIGluIGEgc2VwYXJhdGUgLmggZmlsZTogKi8KLQotI2luY2x1ZGUgImNleGNlcHQuaCIKLQotZW51bSBleGNlcHRpb25fZmxhdm9yIHsgb2theSwgb29wcywgc2NyZXd1cCwgYmFyZiB9OwotCi1zdHJ1Y3QgZXhjZXB0aW9uIHsKLSAgZW51bSBleGNlcHRpb25fZmxhdm9yIGZsYXZvcjsKLSAgY29uc3QgY2hhciAqbXNnOwotICB1bmlvbiB7Ci0gICAgaW50IG9vcHM7Ci0gICAgbG9uZyBzY3Jld3VwOwotICAgIGNoYXIgYmFyZls4XTsKLSAgfSBpbmZvOwotfTsKLQotZGVmaW5lX2V4Y2VwdGlvbl90eXBlKHN0cnVjdCBleGNlcHRpb24pOwotCi0vKiBFbmQgb2Ygc2VwYXJhdGUgLmggZmlsZS4gKi8KLQotCi1zdHJ1Y3QgdGhyZWFkX3N0YXRlIHsKLSAgaW50IGJsYWg7Ci0gIHN0cnVjdCBleGNlcHRpb25fY29udGV4dCBlY1sxXTsKLSAgdW5zaWduZWQgbG9uZyBqdW5rOwotfTsKLQotCi12b2lkIGRlbW9fdGhyb3coc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0ICp0aGVfZXhjZXB0aW9uX2NvbnRleHQpCi17Ci0gIHN0YXRpYyBpbnQgY291bnQgPSAwOwotICBzdHJ1Y3QgZXhjZXB0aW9uIGU7Ci0KLSAgZnByaW50ZihzdGRlcnIsICJlbnRlciBkZW1vX3Rocm93XG4iKTsKLQotICArK2NvdW50OwotCi0gIGlmIChjb3VudCA9PSAyKSB7Ci0gICAgZS5mbGF2b3IgPSBvb3BzOwotICAgIGUubXNnID0gImRlbW8gb29wcyBtZXNzYWdlIjsKLSAgICBlLmluZm8ub29wcyA9IDE3OwotICAgIFRocm93IGU7Ci0gIH0KLSAgZWxzZSBpZiAoY291bnQgPT0gMykgewotICAgIGUuZmxhdm9yID0gYmFyZjsKLSAgICBlLm1zZyA9ICJkZW1vIGJhcmYgbWVzc2FnZSI7Ci0gICAgc3RyY3B5KGUuaW5mby5iYXJmLCAiQUJDREVGRyIpOwotICAgIFRocm93IGU7Ci0gIH0KLSAgZWxzZSBpZiAoY291bnQgPT0gNCkgewotICAgIGUuZmxhdm9yID0gc2NyZXd1cDsKLSAgICBlLm1zZyA9ICJkZW1vIHNjcmV3dXAgbWVzc2FnZSI7Ci0gICAgZS5pbmZvLnNjcmV3dXAgPSA5ODc2NTQzMjE7Ci0gICAgVGhyb3cgZTsKLSAgfQotCi0gIGZwcmludGYoc3RkZXJyLCAicmV0dXJuIGZyb20gZGVtb190aHJvd1xuIik7Ci19Ci0KLQotdm9pZCBmb28oc3RydWN0IHRocmVhZF9zdGF0ZSAqc3RhdGUpCi17Ci0gIGZwcmludGYoc3RkZXJyLCAiZW50ZXIgZm9vXG4iKTsKLSAgZGVtb190aHJvdyhzdGF0ZS0+ZWMpOwotICBmcHJpbnRmKHN0ZGVyciwgInJldHVybiBmcm9tIGZvb1xuIik7Ci19Ci0KLQotdm9pZCBiYXIoc3RydWN0IHRocmVhZF9zdGF0ZSAqc3RhdGUpCi17Ci0gIHN0cnVjdCBleGNlcHRpb25fY29udGV4dCAqdGhlX2V4Y2VwdGlvbl9jb250ZXh0ID0gc3RhdGUtPmVjOwotICBzdHJ1Y3QgZXhjZXB0aW9uIGU7Ci0KLSAgZnByaW50ZihzdGRlcnIsICJlbnRlciBiYXJcbiIpOwotCi0gIFRyeSBmb28oc3RhdGUpOwotICBDYXRjaCAoZSkgewotICAgIHN3aXRjaCAoZS5mbGF2b3IpIHsKLSAgICAgIGNhc2Ugb2theTogYnJlYWs7Ci0gICAgICBjYXNlIG9vcHM6IGZwcmludGYoc3RkZXJyLCAiYmFyIGNhdWdodCBvb3BzIChpbmZvID09ICVkKTogJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZS5pbmZvLm9vcHMsIGUubXNnKTsKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IFRocm93IGU7Ci0gICAgfQotICB9Ci0KLSAgZnByaW50ZihzdGRlcnIsICJyZXR1cm4gZnJvbSBiYXJcbiIpOwotfQotCi0KLWludCBtYWluKCkKLXsKLSAgc3RydWN0IHRocmVhZF9zdGF0ZSBzdGF0ZVsxXTsKLSAgc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0ICp0aGVfZXhjZXB0aW9uX2NvbnRleHQgPSBzdGF0ZS0+ZWM7Ci0gIHN0cnVjdCBleGNlcHRpb24gZTsKLQotICBpbml0X2V4Y2VwdGlvbl9jb250ZXh0KHRoZV9leGNlcHRpb25fY29udGV4dCk7Ci0KLSAgVHJ5IHsKLSAgICBiYXIoc3RhdGUpOyAgLyogbm8gZXhjZXB0aW9ucyAqLwotICAgIGJhcihzdGF0ZSk7ICAvKiBleGNlcHRpb24gd2lsbCBiZSBjYXVnaHQgYnkgYmFyKCksIGxvb2tzIG9rYXkgdG8gdXMgKi8KLSAgICBiYXIoc3RhdGUpOyAgLyogYmFyKCkgd2lsbCByZXRocm93IHRoZSBleGNlcHRpb24gKi8KLSAgICBmcHJpbnRmKHN0ZGVyciwgIndlIHdvbid0IGdldCBoZXJlXG4iKTsKLSAgfQotICBDYXRjaCAoZSkgewotICAgIHN3aXRjaCAoZS5mbGF2b3IpIHsKLSAgICAgICAgIGNhc2Ugb2theTogYnJlYWs7Ci0gICAgICAgICBjYXNlIGJhcmY6IGZwcmludGYoc3RkZXJyLCAibWFpbiBjYXVnaHQgYmFyZiAoaW5mbyA9PSAlcyk6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaW5mby5iYXJmLCBlLm1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBzY3Jld3VwOiBmcHJpbnRmKHN0ZGVyciwgIm1haW4gY2F1Z2h0IHNjcmV3dXAgKGluZm8gPT0gJWxkKTogJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5pbmZvLnNjcmV3dXAsIGUubXNnKTsKLSAgICAgICAgICAgZGVmYXVsdDogZnByaW50ZihzdGRlcnIsICJtYWluIGNhdWdodCB1bmtub3duIGV4Y2VwdGlvblxuIik7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jZXhjZXB0L3JhdGlvbmFsZSBiL3NyYy9jZXhjZXB0L3JhdGlvbmFsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiYmEwOC4uMDAwMDAwMAotLS0gYS9zcmMvY2V4Y2VwdC9yYXRpb25hbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotY2V4Y2VwdDogcmF0aW9uYWxlIDIuMC4wICgyMDAxLUp1bC0xMi1UaHUpCi1BZGFtIE0uIENvc3RlbGxvIDxhbWNAY3MuYmVya2VsZXkuZWR1PgotCi1SYXRpb25hbGUgZm9yIHNvbWUgb2YgdGhlIGRlc2lnbiBkZWNpc2lvbnMgYmVoaW5kIHZlcnNpb24gMi4wLiogb2YgdGhlCi1jZXhjZXB0LmggaW50ZXJmYWNlLiAgU2VlIFJFQURNRSBmb3IgY29weXJpZ2h0IGluZm9ybWF0aW9uLgotCi0KLVF1ZXN0aW9ucyBhbnN3ZXJlZCBiZWxvdzoKLSAgKiBXaHkgYXJlbid0IG11bHRpcGxlIENhdGNoIGNsYXVzZXMgYWxsb3dlZD8KLSAgKiBXaHkgY2FuJ3QgSSBzYXkgQ2F0Y2ggKGludCBlKSBsaWtlIGluIEMrKyBvciBKYXZhPwotICAqIFdoeSBjYW4ndCBJIGp1bXAgaW50byBvciBvdXQgb2YgYSBUcnkgY2xhdXNlPwotICAqIFdoeSBpc24ndCBhIEZpbmFsbHkgY2xhdXNlIHN1cHBvcnRlZD8KLSAgKiBXaHkgY2FuJ3QgSSB1c2UgVGhyb3cgd2l0aG91dCBhbiBleHByZXNzaW9uIHRvIHJlLXRocm93IGFuIGV4Y2VwdGlvbj8KLSAgKiBXaHkgY2FuJ3QgInJlYWwiIGV4Y2VwdGlvbnMgYmUgY2F1Z2h0PwotICAqIFdoeSBtdXN0IHRoZSBDYXRjaCBleHByZXNzaW9uIGhhdmUgdGhlIHNhbWUgdHlwZSB0aGF0IHdhcyBwYXNzZWQgdG8KLSAgICBkZWZpbmVfZXhjZXB0aW9uX3R5cGUoKT8gIEkgY2FuIGFzc2lnbiBhIGRvdWJsZSB2YWx1ZSB0byBhbiBpbnQsIHNvCi0gICAgd2h5IGNhbid0IEkgY2F0Y2ggYSBkb3VibGUgZXhjZXB0aW9uIGluIGFuIGludCB2YXJpYWJsZT8KLSAgKiBXaHkgZG9lcyB0aGUgaW1wbGVtZW50YXRpb24gY29weSB0aGUgZXhjZXB0aW9uIHR3aWNlPwotICAqIFdoeSBhcmUgdGhlIG1hY3JvcyBzcGVsbGVkIFRyeSwgQ2F0Y2gsIFRocm93IHJhdGhlciB0aGFuLi4uPwotCi0KLVdoeSBhcmVuJ3QgbXVsdGlwbGUgQ2F0Y2ggY2xhdXNlcyBhbGxvd2VkPwotCi0gICAgVGhlIHB1cnBvc2Ugb2YgbXVsdGlwbGUgY2F0Y2ggY2xhdXNlcyBpbiBDKysgb3IgSmF2YSBpcyB0byBhbGxvdyB5b3UKLSAgICB0byBjYXRjaCBtdWx0aXBsZSBleGNlcHRpb24gdHlwZXMuICBUaGlzIGlzIG5hdHVyYWwgaW4gYSBsYW5ndWFnZQotICAgIHRoYXQgc3VwcG9ydHMgcG9seW1vcnBoaXNtLCB3aGVyZSB5b3UgY2FuIHN1YnN0aXR1dGUgb2JqZWN0cyBvZgotICAgIGRpZmZlcmVudCB0eXBlcyBpbnRvIHRoZSBzYW1lIGV4cHJlc3Npb24gYW5kIGNhdXNlIGRpZmZlcmVudCBjb2RlIHRvCi0gICAgYmUgZXhlY3V0ZWQuICBJbiBzdWNoIGEgbGFuZ3VhZ2UgeW91IGNhbiB0aHJvdyBhbnkgdHlwZSBvZiBvYmplY3QsCi0gICAgYW5kIHRoZSBhcHByb3ByaWF0ZSBjYXRjaCBjbGF1c2Ugd2lsbCBiZSBzZWxlY3RlZCBhdXRvbWF0aWNhbGx5LgotCi0gICAgQyBkb2VzIG5vdCBzdXBwb3J0IHBvbHltb3JwaGlzbSAoZXhjZXB0IGZvciB1bmlvbnMgYW5kIHZvaWQKLSAgICBwb2ludGVycykuICBUaGVyZWZvcmUgaXQgaXMgbmF0dXJhbCBpbiBDIHRvIGhhdmUganVzdCBvbmUgZXhjZXB0aW9uCi0gICAgdHlwZSwgYW5kIHRoZXJlZm9yZSBvbmUgQ2F0Y2ggY2xhdXNlIGlzIHN1ZmZpY2llbnQuICBUaGUgYXBwbGljYXRpb24KLSAgICBwcm9ncmFtbWVyIGlzIGZyZWUgdG8gdXNlIGFueSB0eXBlIGZvciB0aGUgZXhjZXB0aW9uIHR5cGUsIGFuZCBtYXkKLSAgICB1c2UgYSB1bmlvbiB0byBzaW11bGF0ZSBwb2x5bW9ycGhpc20gKHNlZSBleGFtcGxlMi5jIGZvciBhbiBleGFtcGxlCi0gICAgb2YgdGhpcykuICBCdXQgZm9yIG1hbnkgYXBwbGljYXRpb25zIGFuIGludCwgZW51bSwgb3Igc21hbGwgc3RydWN0Ci0gICAgd2lsbCBiZSBzdWZmaWNpZW50LgotCi0KLUJ1dCBjb3VsZG4ndCB0cmlja3MgYmUgcGxheWVkIHRvIGFsbG93IG11bHRpcGxlIGV4Y2VwdGlvbiB0eXBlcz8KLQotICAgIFllcywgYnV0IGNleGNlcHQuaCBpcyBpbnRlbmRlZCBmb3IgQyBwcm9ncmFtcyBhbmQgQyBwcm9ncmFtbWVycy4gIElmCi0gICAgdGhlIGNvbmNlcHQgb2YgcG9seW1vcnBoaXNtIHdlcmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGludGVyZmFjZSwKLSAgICB0aGUgaW50ZXJmYWNlIHdvdWxkIGJlY29tZSBsZXNzIGludHVpdGl2ZSB0byBtYW55IG9mIHRoZSBwZW9wbGUKLSAgICBpdCBpcyBkZXNpZ25lZCBmb3IuICBCdXQgaWYgYW4gYXBwbGljYXRpb24gcHJvZ3JhbW1lciB1c2VzIHVuaW9ucwotICAgIHRvIHNpbXVsYXRlIG11bHRpcGxlIGV4Y2VwdGlvbiB0eXBlcywgdGhlIHJlc3VsdGluZyBjb2RlIHdpbGwgYmUKLSAgICBwZXJmZWN0bHkgdW5kZXJzdGFuZGFibGUgdG8gb3RoZXIgQyBwcm9ncmFtbWVycywgZXZlbiBpZiB0aGV5IGhhdmUKLSAgICBubyBleHBlcmllbmNlIHdpdGggcG9seW1vcnBoaXNtLgotCi0KLVdoeSBjYW4ndCBJIHNheSBDYXRjaCAoaW50IGUpIGxpa2UgaW4gQysrIG9yIEphdmE/Ci0KLSAgICBBZ2FpbiwgdGhlIGludGVyZmFjZSB0cmllcyB0byBiZSBpbnR1aXRpdmUgdG8gQyBwcm9ncmFtbWVycy4gIEluIEMsCi0gICAgZGVjbGFyYXRpb25zIGdvIGF0IHRoZSBiZWdpbm5pbmdzIG9mIGJsb2Nrcy4gIFRoZSBjZXhjZXB0IHN5bnRheCBpcwotICAgIGFjdHVhbGx5IG1vcmUgZmxleGlibGUgaW4gYSB3YXksIGJlY2F1c2UgYW55IGx2YWx1ZSBjYW4gZ28gaW4gdGhlCi0gICAgcGFyZW50aGVzZXMsIGZvciBleGFtcGxlOiBDYXRjaCAocC0+ZSkKLQotCi1XaHkgY2FuJ3QgSSBqdW1wIGludG8gb3Igb3V0IG9mIGEgVHJ5IGNsYXVzZT8KLQotICAgIFRoZXJlIGlzIHNvbWUgaGlkZGVuIHNldHVwIGFuZCBjbGVhbnVwIHRoYXQgbmVlZHMgdG8gYmUgZG9uZQotICAgIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbiBleGNlcHRpb24gaXMgY2F1Z2h0LiAgSnVtcGluZyBpbnRvIGEgVHJ5Ci0gICAgY2xhdXNlIHdvdWxkIGF2b2lkIGRvaW5nIHRoZSBzZXR1cCwgYW5kIGp1bXBpbmcgb3V0IG9mIGl0IHdvdWxkCi0gICAgYXZvaWQgZG9pbmcgdGhlIGNsZWFudXAuCi0KLQotV2h5IGlzbid0IGEgRmluYWxseSBjbGF1c2Ugc3VwcG9ydGVkPwotCi0gICAgVGhlcmUncyBubyB3YXkgdG8gaW1wbGVtZW50IGl0LiAgSW4gSmF2YSwgdGhlIG1haW4gZGlmZmVyZW5jZQotICAgIGJldHdlZW4gcHV0dGluZyBjb2RlIGluIGEgZmluYWxseSBjbGF1c2UgdmVyc3VzIHB1dHRpbmcgdGhlIGNvZGUKLSAgICBhZnRlciB0aGUgdHJ5L2NhdGNoIHN0YXRlbWVudCBpcyB0aGF0IHRoZSBmaW5hbGx5IGNsYXVzZSB3aWxsIGdldAotICAgIGV4ZWN1dGVkIGV2ZW4gaWYgYSByZXR1cm4gb3IgdGhyb3cgb2NjdXJzIHdpdGhpbiB0aGUgdHJ5IGNsYXVzZSBvcgotICAgIGNhdGNoIGNsYXVzZS4gIEJ1dCBpbiBDLCBhIHJldHVybiBzdGF0ZW1lbnQgcmV0dXJucyBpbW1lZGlhdGVseS4KLQotICAgIEluIEphdmEgb25lIGNvdWxkIG1ha2UgZG8gd2l0aG91dCBhIGZpbmFsbHkgY2xhdXNlIGJ5IGRlZmVycmluZwotICAgIGFueSByZXR1cm4gZnJvbSB0aGUgdHJ5IGNsYXVzZSAoYnkgc3RvcmluZyB0aGUgcmV0dXJuIHZhbHVlIGluIGEKLSAgICB2YXJpYWJsZSksIGFuZCBtb3Zpbmcgc29tZSBvciBhbGwgb2YgdGhlIGNhdGNoIGNvZGUgb3V0c2lkZSB0aGUKLSAgICB0cnkvY2F0Y2ggc3RhdGVtZW50LCBsaWtlIHNvOgotCi0gICAgICAgIEV4Y2VwdGlvbiBlID0gbnVsbDsKLQotICAgICAgICB0cnkgeyAuLi4gfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHRtcCkgeyBlID0gdG1wOyB9Ci0KLSAgICAgICAgLy8gRG8gY2xlYW51cCBoZXJlLgotCi0gICAgICAgIGlmIChlIGluc3RhbmNlb2YgRm9vKSB7IC4uLiB9Ci0gICAgICAgIGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBCYXIpIHsgLi4uIH0KLSAgICAgICAgLi4uCi0gICAgICAgIGVsc2UgaWYgKGUgIT0gbnVsbCkgdGhyb3cgZTsKLQotICAgIEEgc2ltaWxhciB0ZWNobmlxdWUgY2FuIGJlIHVzZWQgd2l0aCBjZXhjZXB0OgotCi0gICAgICAgIG15X2V4Y2VwdGlvbl90eXBlIGUgPSBzb21lIG51bGwgdmFsdWUgdGhhdCB3aWxsIG5vdCBiZSB0aHJvd247Ci0KLSAgICAgICAgVHJ5IHsgLi4uIH0KLSAgICAgICAgQ2F0Y2ggKGUpIHsgfQotCi0gICAgICAgIC8qIERvIGNsZWFudXAgaGVyZS4gKi8KLQotICAgICAgICBpZiAoZSBpcyBub3QgdGhhdCBudWxsIHZhbHVlKSB7IC4uLiB9Ci0KLQotV2h5IGNhbid0IEkgdXNlIFRocm93IHdpdGhvdXQgYW4gZXhwcmVzc2lvbiB0byByZS10aHJvdyBhbiBleGNlcHRpb24/Ci0KLSAgICBUaGUgdXNlIG9mIHRocm93IHdpdGhvdXQgYW4gZXhwcmVzc2lvbiBpcyBuZWVkZWQgaW4gQysrIGJlY2F1c2UgaXQncwotICAgIHRoZSBvbmx5IHdheSB0byByZS10aHJvdyBhbiBleGNlcHRpb24gb2YgdW5rbm93biB0eXBlOgotCi0gICAgICAgIGNhdGNoICguLi4pIHsKLSAgICAgICAgICAvLyBkbyBzb21lIHN0dWZmCi0gICAgICAgICAgdGhyb3c7Ci0gICAgICAgIH0KLQotICAgIFRoaXMgc3ludGF4IGlzIG5vdCBwcm92aWRlZCBpbiBKYXZhIGJlY2F1c2UgdGhlIGZhY3QgdGhhdCBhbGwKLSAgICBleGNlcHRpb25zIGFyZSBpbnN0YW5jZXMgb2YgRXhjZXB0aW9uIGVsaW1pbmF0ZXMgdGhlIHByb2JsZW06Ci0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgLy8gZG8gc29tZSBzdHVmZgotICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLQotICAgIFNpbWlsYXJseSwgd2l0aCBjZXhjZXB0LCB0aGUgdHlwZSBvZiBleGNlcHRpb25zIGlzIGFsd2F5cyBrbm93biwgc28KLSAgICBhbiBleHByZXNzaW9ubGVzcyBUaHJvdyBpcyBub3QgbmVlZGVkLiAgQmVzaWRlcywgdGhlIHN5bnRheCB3b3VsZCBiZQotICAgIHZlcnkgZGlmZmljdWx0LCBpZiBub3QgaW1wb3NzaWJsZSwgdG8gaW1wbGVtZW50LgotCi0KLVdoeSBjYW4ndCAicmVhbCIgZXhjZXB0aW9ucyBiZSBjYXVnaHQ/Ci0KLSAgICAiUmVhbCIgZXhjZXB0aW9ucyAobGlrZSBmbG9hdGluZy1wb2ludCBleGNlcHRpb25zIGFuZAotICAgIGFkZHJlc3NpbmcgZXhjZXB0aW9ucykgYXJlIHBsYXRmb3JtLWRlcGVuZGVudCwgYnV0IGNleGNlcHQgaXMgYQotICAgIHBsYXRmb3JtLWluZGVwZW5kZW50IGFic3RyYWN0aW9uIG9mIHNldGptcC9sb25nam1wLiAgVGhlIG9ubHkgd2F5Ci0gICAgdG8ganVtcCB0byBhIHNldGptcCgpIGlzIGZyb20gYSBsb25nam1wKCksIHNvIGEgQ2F0Y2ggcmVxdWlyZXMgYW4KLSAgICBleHBsaWNpdCBUaHJvdy4KLQotICAgIE9uIFBPU0lYIHN5c3RlbXMsIGl0IGlzIHBvc3NpYmxlIHRvIGNhbGwgc2V0am1wKCkgZnJvbSB3aXRoaW4gYQotICAgIHNpZ25hbCBoYW5kbGVyLCBhbmQgaGVuY2UgcG9zc2libGUgdG8gdXNlIFRocm93IHdpdGhpbiBhIHNpZ25hbAotICAgIGhhbmRsZXIsIGJ1dCB0aGlzIGlzIHZlcnkgbGlrZWx5IHRvIGNhdXNlIHN1YnRsZSBidWdzIGFuZCBpcyBub3QKLSAgICByZWNvbW1lbmRlZC4gIElmIGEgcHJvZ3JhbSB1c2VzIGJvdGggc2lnbmFscyBhbmQgY2V4Y2VwdCwgaXQgbWF5Ci0gICAgd2lzaCB0byBtb2RpZnkgY2V4Y2VwdC5oIHRvIHVzZSB0aGUgUE9TSVggZnVuY3Rpb25zIHNpZ3NldGptcCgpIGFuZAotICAgIHNpZ2xvbmdqbXAoKSBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBDIGxpYnJhcnkgZnVuY3Rpb25zIHNldGptcCgpCi0gICAgYW5kIGxvbmdqbXAoKS4KLQotCi1XaHkgbXVzdCB0aGUgQ2F0Y2ggZXhwcmVzc2lvbiBoYXZlIHRoZSBzYW1lIHR5cGUgdGhhdCB3YXMgcGFzc2VkIHRvCi1kZWZpbmVfZXhjZXB0aW9uX3R5cGUoKT8gIEkgY2FuIGFzc2lnbiBhIGRvdWJsZSB2YWx1ZSB0byBhbiBpbnQsIHNvIHdoeQotY2FuJ3QgSSBjYXRjaCBhIGRvdWJsZSBleGNlcHRpb24gaW4gYW4gaW50IHZhcmlhYmxlPwotCi0gICAgVGhlIGludHVpdGl2ZSBleHBlY3RhdGlvbiBpcyB0aGF0ICJUaHJvdyB2IiBhbmQgIkNhdGNoIChlKSIgc2hvdWxkCi0gICAgaGF2ZSBhbiBlZmZlY3QgZXF1aXZhbGVudCB0byAiZSA9IHYiLiAgVGhlIGxhdHRlciBjb252ZXJ0cyB2IHRvIHRoZQotICAgIHR5cGUgb2YgZSwgYnV0IHRoZSBUaHJvdyBzdGF0ZW1lbnQgaGFzIG5vIHdheSBvZiBrbm93aW5nIHRoZSB0eXBlIG9mCi0gICAgZSwgc28gaXQgY29udmVydHMgdiB0byB0aGUgdHlwZSBwYXNzZWQgdG8gZGVmaW5lX2V4Y2VwdGlvbl90eXBlKCkuCi0gICAgRGVwZW5kaW5nIG9uIGhvdyBjZXhjZXB0IGlzIGltcGxlbWVudGVkLCB1bmludHVpdGl2ZSBvciBldmVuCi0gICAgdW5kZWZpbmVkIGJlaGF2aW9yIGNvdWxkIHJlc3VsdCBpZiBlIGhhcyBhIGRpZmZlcmVudCB0eXBlLgotCi0KLVdoeSBkb2VzIHRoZSBpbXBsZW1lbnRhdGlvbiBjb3B5IHRoZSBleGNlcHRpb24gdHdpY2U/Ci0KLSAgICBUaGUgVGhyb3cgc3RhdGVtZW50IG11c3Qgc3RvcmUgdGhlIGV4Y2VwdGlvbiB2YWx1ZSBzb21ld2hlcmUuICBJZiBpdAotICAgIHN0b3JlcyBkaXJlY3RseSBpbnRvIHRoZSBvYmplY3QgbmFtZWQgYnkgdGhlIENhdGNoIGV4cHJlc3Npb24sIHRoZW4KLSAgICB0aGF0IG9iamVjdCBtdXN0IG5vdCBiZSBhIG5vbi12b2xhdGlsZSBhdXRvbWF0aWMgb2JqZWN0LiAgSXQgd2FzCi0gICAgZGVlbWVkIHByZWZlcmFibGUgdG8gY29weSB0aGUgZXhjZXB0aW9uIHR3aWNlIHJhdGhlciB0aGFuIHByb2hpYml0Ci0gICAgYXBwbGljYXRpb24gcHJvZ3JhbW1lcnMgZnJvbSBjYXRjaGluZyBleGNlcHRpb25zIGluIG5vbi12b2xhdGlsZQotICAgIGF1dG9tYXRpYyBvYmplY3RzICh3aGljaCBpcyB3aGF0IHRoZXkgd291bGQgbW9zdCBvZnRlbiBiZSBpbmNsaW5lZAotICAgIHRvIHVzZSkuCi0KLQotV2h5IGFyZSB0aGUgbWFjcm9zIHNwZWxsZWQgVHJ5LCBDYXRjaCwgVGhyb3cgcmF0aGVyIHRoYW4uLi4/Ci0KLSAgICBXZSBjb25zaWRlcmVkIG1hbnkgb3RoZXIgcG9zc2liaWxpdGllczoKLQotICAgICAgICB0cnkgY2F0Y2ggdGhyb3cKLSAgICAgICAgVFJZIENBVENIIFRIUk9XCi0gICAgICAgIGN0cnkgY2NhdGNoIGN0aHJvdwotICAgICAgICBjX3RyeSBjX2NhdGNoIGNfdGhyb3cKLSAgICAgICAgY2V4X3RyeSBjZXhfY2F0Y2ggY2V4X3Rocm93Ci0gICAgICAgIENFWF9UUlkgQ0VYX0NBVENIIENFWF9USFJPVwotICAgICAgICBjZXhjZXB0X3RyeSBjZXhjZXB0X2NhdGNoIGNleGNlcHRfdGhyb3cKLSAgICAgICAgdHJ5X3VudGlsX2V4Y2VwdGlvbiBjYXRjaF9leGNlcHRpb24gdGhyb3dfZXhjZXB0aW9uCi0KLSAgICBXZSB3YW50ZWQgbmFtZXMgdGhhdCB3b3VsZCBiZSBlYXN5IHRvIHJlYWQsIGVhc3kgdG8gdHlwZSwgaW50dWl0aXZlLAotICAgIGFuZCB1bmxpa2VseSB0byBjb25mbGljdCB3aXRoIGV4aXN0aW5nIG5hbWVzLiAgVWx0aW1hdGVseSB3ZSBzZXR0bGVkCi0gICAgb24gVHJ5LCBDYXRjaCwgYW5kIFRocm93IGFzIHRoZSBiZXN0IGNvbXByb21pc2UgYW1vbmcgYWxsIHRoZXNlCi0gICAgY3JpdGVyaWEuCmRpZmYgLS1naXQgYS9zcmMvZ2lmcmVhZC9Eb3h5ZmlsZSBiL3NyYy9naWZyZWFkL0RveHlmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWVmNjQ3Li4wMDAwMDAwCi0tLSBhL3NyYy9naWZyZWFkL0RveHlmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLSMgRG94eWZpbGUgMS43LjMKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1ET1hZRklMRV9FTkNPRElORyAgICAgID0gVVRGLTgKLVBST0pFQ1RfTkFNRSAgICAgICAgICAgPSBnaWZyZWFkCi1QUk9KRUNUX05VTUJFUiAgICAgICAgID0KLVBST0pFQ1RfQlJJRUYgICAgICAgICAgPQotUFJPSkVDVF9MT0dPICAgICAgICAgICA9Ci1PVVRQVVRfRElSRUNUT1JZICAgICAgID0KLUNSRUFURV9TVUJESVJTICAgICAgICAgPSBOTwotT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKLUJSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMKLVJFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKLUFCQlJFVklBVEVfQlJJRUYgICAgICAgPQotQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCi1JTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gTk8KLUZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBZRVMKLVNUUklQX0ZST01fUEFUSCAgICAgICAgPQotU1RSSVBfRlJPTV9JTkNfUEFUSCAgICA9Ci1TSE9SVF9OQU1FUyAgICAgICAgICAgID0gTk8KLSNKQVZBRE9DX0FVVE9CUklFRiAgICAgPSBOTwotSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IFlFUwotI1FUX0FVVE9CUklFRiAgICAgICAgICA9IE5PCi1RVF9BVVRPQlJJRUYgICAgICAgICAgID0gWUVTCi1NVUxUSUxJTkVfQ1BQX0lTX0JSSUVGID0gTk8KLUlOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKLVNFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTwotVEFCX1NJWkUgICAgICAgICAgICAgICA9IDgKLUFMSUFTRVMgICAgICAgICAgICAgICAgPQotI09QVElNSVpFX09VVFBVVF9GT1JfQyA9IE5PCi1PUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gWUVTCi1PUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8KLU9QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTwotT1BUSU1JWkVfT1VUUFVUX1ZIREwgICA9IE5PCi1FWFRFTlNJT05fTUFQUElORyAgICAgID0KLUJVSUxUSU5fU1RMX1NVUFBPUlQgICAgPSBOTwotQ1BQX0NMSV9TVVBQT1JUICAgICAgICA9IE5PCi1TSVBfU1VQUE9SVCAgICAgICAgICAgID0gTk8KLUlETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBZRVMKLURJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTwotU1VCR1JPVVBJTkcgICAgICAgICAgICA9IFlFUwotVFlQRURFRl9ISURFU19TVFJVQ1QgICA9IE5PCi1TWU1CT0xfQ0FDSEVfU0laRSAgICAgID0gMAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBCdWlsZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVhUUkFDVF9BTEwgICAgICAgICAgICA9IE5PCi1FWFRSQUNUX1BSSVZBVEUgICAgICAgID0gTk8KLUVYVFJBQ1RfU1RBVElDICAgICAgICAgPSBOTwotRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IFlFUwotRVhUUkFDVF9MT0NBTF9NRVRIT0RTICA9IE5PCi1FWFRSQUNUX0FOT05fTlNQQUNFUyAgID0gTk8KLUhJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBOTwotSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCi1ISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KLUhJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTwotSU5URVJOQUxfRE9DUyAgICAgICAgICA9IE5PCi1DQVNFX1NFTlNFX05BTUVTICAgICAgID0gTk8KLUhJREVfU0NPUEVfTkFNRVMgICAgICAgPSBOTwotU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUwotRk9SQ0VfTE9DQUxfSU5DTFVERVMgICA9IE5PCi1JTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCi1TT1JUX01FTUJFUl9ET0NTICAgICAgID0gWUVTCi1TT1JUX0JSSUVGX0RPQ1MgICAgICAgID0gTk8KLVNPUlRfTUVNQkVSU19DVE9SU18xU1QgPSBOTwotU09SVF9HUk9VUF9OQU1FUyAgICAgICA9IE5PCi1TT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8KLVNUUklDVF9QUk9UT19NQVRDSElORyAgPSBOTwotR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUwotR0VORVJBVEVfVEVTVExJU1QgICAgICA9IFlFUwotR0VORVJBVEVfQlVHTElTVCAgICAgICA9IFlFUwotR0VORVJBVEVfREVQUkVDQVRFRExJU1Q9IFlFUwotRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9Ci1NQVhfSU5JVElBTElaRVJfTElORVMgID0gMzAKLVNIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBZRVMKLVNIT1dfRElSRUNUT1JJRVMgICAgICAgPSBOTwotU0hPV19GSUxFUyAgICAgICAgICAgICA9IFlFUwotU0hPV19OQU1FU1BBQ0VTICAgICAgICA9IFlFUwotRklMRV9WRVJTSU9OX0ZJTFRFUiAgICA9Ci1MQVlPVVRfRklMRSAgICAgICAgICAgID0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVFVSUVUICAgICAgICAgICAgICAgICAgPSBOTwotV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUwotI1dBUk5fSUZfVU5ET0NVTUVOVEVEICA9IFlFUwotV0FSTl9JRl9VTkRPQ1VNRU5URUQgICA9IE5PCi1XQVJOX0lGX0RPQ19FUlJPUiAgICAgID0gWUVTCi1XQVJOX05PX1BBUkFNRE9DICAgICAgID0gTk8KLVdBUk5fRk9STUFUICAgICAgICAgICAgPSAiJGZpbGU6JGxpbmU6ICR0ZXh0IgotV0FSTl9MT0dGSUxFICAgICAgICAgICA9Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotSU5QVVQgICAgICAgICAgICAgICAgICA9Ci1JTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgKLUZJTEVfUEFUVEVSTlMgICAgICAgICAgPQotUkVDVVJTSVZFICAgICAgICAgICAgICA9IE5PCi1FWENMVURFICAgICAgICAgICAgICAgID0KLUVYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTwotRVhDTFVERV9QQVRURVJOUyAgICAgICA9Ci1FWENMVURFX1NZTUJPTFMgICAgICAgID0KLUVYQU1QTEVfUEFUSCAgICAgICAgICAgPQotRVhBTVBMRV9QQVRURVJOUyAgICAgICA9Ci1FWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8KLUlNQUdFX1BBVEggICAgICAgICAgICAgPQotSU5QVVRfRklMVEVSICAgICAgICAgICA9Ci1GSUxURVJfUEFUVEVSTlMgICAgICAgID0KLUZJTFRFUl9TT1VSQ0VfRklMRVMgICAgPSBOTwotRklMVEVSX1NPVVJDRV9QQVRURVJOUyA9Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU09VUkNFX0JST1dTRVIgICAgICAgICA9IE5PCi1JTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8KLVNUUklQX0NPREVfQ09NTUVOVFMgICAgPSBZRVMKLVJFRkVSRU5DRURfQllfUkVMQVRJT04gPSBOTwotUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IE5PCi1SRUZFUkVOQ0VTX0xJTktfU09VUkNFID0gWUVTCi1VU0VfSFRBR1MgICAgICAgICAgICAgID0gTk8KLVZFUkJBVElNX0hFQURFUlMgICAgICAgPSBZRVMKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IFlFUwotQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKLUlHTk9SRV9QUkVGSVggICAgICAgICAgPQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgSFRNTCBvdXRwdXQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUdFTkVSQVRFX0hUTUwgICAgICAgICAgPSBZRVMKLUhUTUxfT1VUUFVUICAgICAgICAgICAgPSBodG1sCi1IVE1MX0ZJTEVfRVhURU5TSU9OICAgID0gLmh0bWwKLUhUTUxfSEVBREVSICAgICAgICAgICAgPQotSFRNTF9GT09URVIgICAgICAgICAgICA9Ci1IVE1MX1NUWUxFU0hFRVQgICAgICAgID0KLUhUTUxfQ09MT1JTVFlMRV9IVUUgICAgPSAyMjAKLUhUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDAKLUhUTUxfQ09MT1JTVFlMRV9HQU1NQSAgPSA4MAotSFRNTF9USU1FU1RBTVAgICAgICAgICA9IFlFUwotSFRNTF9BTElHTl9NRU1CRVJTICAgICA9IFlFUwotSFRNTF9EWU5BTUlDX1NFQ1RJT05TICA9IE5PCi1HRU5FUkFURV9ET0NTRVQgICAgICAgID0gTk8KLURPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyIKLURPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0Ci1ET0NTRVRfUFVCTElTSEVSX0lEICAgID0gb3JnLmRveHlnZW4uUHVibGlzaGVyCi1ET0NTRVRfUFVCTElTSEVSX05BTUUgID0gUHVibGlzaGVyCi1HRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8KLUNITV9GSUxFICAgICAgICAgICAgICAgPQotSEhDX0xPQ0FUSU9OICAgICAgICAgICA9Ci1HRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KLUNITV9JTkRFWF9FTkNPRElORyAgICAgPQotQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCi1UT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8KLUdFTkVSQVRFX1FIUCAgICAgICAgICAgPSBOTwotUUNIX0ZJTEUgICAgICAgICAgICAgICA9Ci1RSFBfTkFNRVNQQUNFICAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAotUUhQX1ZJUlRVQUxfRk9MREVSICAgICA9IGRvYwotUUhQX0NVU1RfRklMVEVSX05BTUUgICA9Ci1RSFBfQ1VTVF9GSUxURVJfQVRUUlMgID0KLVFIUF9TRUNUX0ZJTFRFUl9BVFRSUyAgPQotUUhHX0xPQ0FUSU9OICAgICAgICAgICA9Ci1HRU5FUkFURV9FQ0xJUFNFSEVMUCAgID0gTk8KLUVDTElQU0VfRE9DX0lEICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0Ci1ESVNBQkxFX0lOREVYICAgICAgICAgID0gTk8KLUVOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSA0Ci1HRU5FUkFURV9UUkVFVklFVyAgICAgID0gTk8KLVVTRV9JTkxJTkVfVFJFRVMgICAgICAgPSBOTwotVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MAotRVhUX0xJTktTX0lOX1dJTkRPVyAgICA9IE5PCi1GT1JNVUxBX0ZPTlRTSVpFICAgICAgID0gMTAKLUZPUk1VTEFfVFJBTlNQQVJFTlQgICAgPSBZRVMKLVVTRV9NQVRISkFYICAgICAgICAgICAgPSBOTwotTUFUSEpBWF9SRUxQQVRIICAgICAgICA9IGh0dHA6Ly93d3cubWF0aGpheC5vcmcvbWF0aGpheAotU0VBUkNIRU5HSU5FICAgICAgICAgICA9IFlFUwotU0VSVkVSX0JBU0VEX1NFQVJDSCAgICA9IE5PCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNHRU5FUkFURV9MQVRFWCAgICAgICAgPSBZRVMKLUdFTkVSQVRFX0xBVEVYICAgICAgICAgPSBOTwotTEFURVhfT1VUUFVUICAgICAgICAgICA9IGxhdGV4Ci1MQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgKLU1BS0VJTkRFWF9DTURfTkFNRSAgICAgPSBtYWtlaW5kZXgKLUNPTVBBQ1RfTEFURVggICAgICAgICAgPSBOTwotUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0Ci1FWFRSQV9QQUNLQUdFUyAgICAgICAgID0KLUxBVEVYX0hFQURFUiAgICAgICAgICAgPQotUERGX0hZUEVSTElOS1MgICAgICAgICA9IFlFUwotVVNFX1BERkxBVEVYICAgICAgICAgICA9IFlFUwotTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCi1MQVRFWF9ISURFX0lORElDRVMgICAgID0gTk8KLUxBVEVYX1NPVVJDRV9DT0RFICAgICAgPSBOTwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotR0VORVJBVEVfUlRGICAgICAgICAgICA9IE5PCi1SVEZfT1VUUFVUICAgICAgICAgICAgID0gcnRmCi1DT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KLVJURl9IWVBFUkxJTktTICAgICAgICAgPSBOTwotUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9Ci1SVEZfRVhURU5TSU9OU19GSUxFICAgID0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotR0VORVJBVEVfTUFOICAgICAgICAgICA9IE5PCi1NQU5fT1VUUFVUICAgICAgICAgICAgID0gbWFuCi1NQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKLU1BTl9MSU5LUyAgICAgICAgICAgICAgPSBOTwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCi1YTUxfT1VUUFVUICAgICAgICAgICAgID0geG1sCi1YTUxfU0NIRU1BICAgICAgICAgICAgID0KLVhNTF9EVEQgICAgICAgICAgICAgICAgPQotWE1MX1BST0dSQU1MSVNUSU5HICAgICA9IFlFUwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotR0VORVJBVEVfQVVUT0dFTl9ERUYgICA9IE5PCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUdFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTwotUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PCi1QRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTCi1QRVJMTU9EX01BS0VWQVJfUFJFRklYID0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvcgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUwotTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IE5PCi1FWFBBTkRfT05MWV9QUkVERUYgICAgID0gTk8KLVNFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMKLUlOQ0xVREVfUEFUSCAgICAgICAgICAgPQotSU5DTFVERV9GSUxFX1BBVFRFUk5TICA9Ci1QUkVERUZJTkVEICAgICAgICAgICAgID0KLUVYUEFORF9BU19ERUZJTkVEICAgICAgPQotU0tJUF9GVU5DVElPTl9NQUNST1MgICA9IFlFUwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb25maWd1cmF0aW9uOjphZGRpdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UQUdGSUxFUyAgICAgICAgICAgICAgID0KLUdFTkVSQVRFX1RBR0ZJTEUgICAgICAgPQotQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCi1FWFRFUk5BTF9HUk9VUFMgICAgICAgID0gWUVTCi1QRVJMX1BBVEggICAgICAgICAgICAgID0gL3Vzci9iaW4vcGVybAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgZG90IHRvb2wKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNMQVNTX0RJQUdSQU1TICAgICAgICAgPSBZRVMKLU1TQ0dFTl9QQVRIICAgICAgICAgICAgPQotSElERV9VTkRPQ19SRUxBVElPTlMgICA9IFlFUwotSEFWRV9ET1QgICAgICAgICAgICAgICA9IE5PCi1ET1RfTlVNX1RIUkVBRFMgICAgICAgID0gMAotRE9UX0ZPTlROQU1FICAgICAgICAgICA9IEhlbHZldGljYQotRE9UX0ZPTlRTSVpFICAgICAgICAgICA9IDEwCi1ET1RfRk9OVFBBVEggICAgICAgICAgID0KLUNMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMKLUNPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMKLUdST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMKLVVNTF9MT09LICAgICAgICAgICAgICAgPSBOTwotVEVNUExBVEVfUkVMQVRJT05TICAgICA9IE5PCi1JTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTCi1JTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTCi1DQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8KLUNBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTwotR1JBUEhJQ0FMX0hJRVJBUkNIWSAgICA9IFlFUwotRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUwotRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZwotRE9UX1BBVEggICAgICAgICAgICAgICA9Ci1ET1RGSUxFX0RJUlMgICAgICAgICAgID0KLU1TQ0ZJTEVfRElSUyAgICAgICAgICAgPQotRE9UX0dSQVBIX01BWF9OT0RFUyAgICA9IDUwCi1NQVhfRE9UX0dSQVBIX0RFUFRIICAgID0gMAotRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PCi1ET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8KLUdFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMKLURPVF9DTEVBTlVQICAgICAgICAgICAgPSBZRVMKZGlmZiAtLWdpdCBhL3NyYy9naWZyZWFkL01ha2VmaWxlLmluIGIvc3JjL2dpZnJlYWQvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxODg1MWEuLjAwMDAwMDAKLS0tIGEvc3JjL2dpZnJlYWQvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0uUEhPTlk6IGFsbCB0ZXN0IGNoZWNrIGNsZWFuIGRpc3RjbGVhbgotLlBSRUNJT1VTOiBNYWtlZmlsZQotLlNVRkZJWEVTOiAuYyAubyAuYQotCi1DQyA9IEBDQ0AKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFAgPSBAQ1BQQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1MRCA9IEBMREAKLUxERkxBR1MgPSBATERGTEFHU0AKLUFSID0gQEFSQAotQVJGTEFHUyA9IEBBUkZMQUdTQAotUkFOTElCID0gQFJBTkxJQkAKLUxJQlMgPSBATElCU0AKLVJNX0YgPSBAUk1fRkAKLQotR0lGUkVBRF9MSUIgPSBsaWJnaWZyZWFkLmEKLUdJRlJFQURfT0JKUyA9IGdpZnJlYWQubwotR0lGRFVNUCA9IHRlc3QvZ2lmZHVtcCQoRVhFRVhUKQotR0lGRFVNUF9PQkpTID0gdGVzdC9naWZkdW1wLm8KLUdJRkRVTVBfT1VUID0gdGVzdC8qLmdpZmR1bXAub3V0Ci0KLWFsbDogJChHSUZSRUFEX0xJQikgJChHSUZEVU1QKQotCi10ZXN0OiAkKEdJRkRVTVApCi0JJChHSUZEVU1QKSBpbWcvY29tcGFzcy5naWYgPiB0ZXN0L2NvbXBhc3MuZ2lmZHVtcC5vdXQKLQktQGVjaG8gZ2lmZHVtcCB0ZXN0IC4uLiBvawotCi1jaGVjazogdGVzdAotCi0uYy5vOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi0kKEdJRlJFQURfTElCKTogJChHSUZSRUFEX09CSlMpCi0JJChBUikgJChBUkZMQUdTKSAkQCAkKEdJRlJFQURfT0JKUykKLQkkKFJBTkxJQikgJEAKLQotJChHSUZEVU1QKTogJChHSUZEVU1QX09CSlMpICQoR0lGUkVBRF9MSUIpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKEdJRkRVTVBfT0JKUykgJChHSUZSRUFEX0xJQikgJChMSUJTKQotCi1naWZyZWFkLm86IGdpZnJlYWQuYyBnaWZyZWFkLmgKLQotdGVzdC9naWZkdW1wLm86IHRlc3QvZ2lmZHVtcC5jIGdpZnJlYWQuaAotCSQoQ0MpIC1jIC1JLiAkKENQUEZMQUdTKSAkKENGTEFHUykgLW8gJEAgJCouYwotCi1jbGVhbjoKLQktJChSTV9GKSAkKEdJRlJFQURfTElCKSAkKEdJRlJFQURfT0JKUykKLQktJChSTV9GKSAkKEdJRkRVTVApICQoR0lGRFVNUF9PQkpTKSAkKEdJRkRVTVBfT1VUKQotCi1kaXN0Y2xlYW46IGNsZWFuCi0JLSQoUk1fRikgTWFrZWZpbGUKZGlmZiAtLWdpdCBhL3NyYy9naWZyZWFkL1JFQURNRS5vcHRpcG5nLnR4dCBiL3NyYy9naWZyZWFkL1JFQURNRS5vcHRpcG5nLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkOTUyNy4uMDAwMDAwMAotLS0gYS9zcmMvZ2lmcmVhZC9SRUFETUUub3B0aXBuZy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLU5hbWU6IGdpZnJlYWQKLVN1bW1hcnk6IEEgc2ltcGxlIEdJRiByZWFkZXIKLUF1dGhvcjogQ29zbWluIFRydXRhCi1MaWNlbnNlOiBCU0QtbGlrZTsgc2VlIGdpZnJlYWQuaApkaWZmIC0tZ2l0IGEvc3JjL2dpZnJlYWQvZ2lmcmVhZC5jIGIvc3JjL2dpZnJlYWQvZ2lmcmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjRhYTZlLi4wMDAwMDAwCi0tLSBhL3NyYy9naWZyZWFkL2dpZnJlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDcyMyArMCwwIEBACi0vKioKLSAqIEBmaWxlIGdpZnJlYWQuYwotICogQSBzaW1wbGUgR0lGIHJlYWRlci4KLSAqCi0gKiBAYXV0aG9yIENvc21pbiBUcnV0YQotICoKLSAqIEBzZWN0aW9uIENvcHlyaWdodAotICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMTEgQ29zbWluIFRydXRhLgotICogVGhpcyBzb2Z0d2FyZSB3YXMgZGVyaXZlZCBmcm9tICJnaWZ0b3BubS5jIiBieSBEYXZpZCBLb2JsYXMsCi0gKiBhbmQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgY29weXJpZ2h0IGFuZCB3YXJyYW50eSB0ZXJtcy4KLSAqCi0gKiBUaGUgb3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBpcyBwcm92aWRlZCBiZWxvdy4KLSAqIDxwcmU+Ci0gKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqIHwgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTMsIERhdmlkIEtvYmxhcy4gIChrb2JsYXNAbmV0Y29tLmNvbSkgICAgfAotICogfCAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgICB8Ci0gKiB8ICAgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IHwKLSAqIHwgICBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgfAotICogfCAgIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uICB8Ci0gKiB8ICAgbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBUaGlzIHNvZnR3YXJlIGlzICAgIHwKLSAqIHwgICBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LiAgICAgICAgICAgfAotICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiA8L3ByZT4KLSAqCi0gKiBAYnVnIEdJRi9MWlcgZGVjb21wcmVzc2lvbiBpcyBub3QgdGhyZWFkLXNhZmUuCi0gKiovCi0KLSNpbmNsdWRlICJnaWZyZWFkLmgiCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0KLSNpZiBVQ0hBUl9NQVggPT0gMjU1Ci0jZGVmaW5lIEdJRl9VQ0hBUl9NQVggMjU1Ci0jZWxzZQotI2Vycm9yIFRoaXMgbW9kdWxlIHJlcXVpcmVzIDgtYml0IGJ5dGVzLgotI2VuZGlmCi0KLSNkZWZpbmUgTFpXX0JJVFNfTUFYIDEyCi0jZGVmaW5lIExaV19DT0RFX01BWCAoKDEgPDwgTFpXX0JJVFNfTUFYKSAtIDEpCi0KLSNkZWZpbmUgTFpXX0ZBTFNFIDAKLSNkZWZpbmUgTFpXX1RSVUUgIDEKLQotCi1zdGF0aWMgdm9pZCBHSUZSZWFkTmV4dEltYWdlKHN0cnVjdCBHSUZJbWFnZSAqaW1hZ2UsIEZJTEUgKnN0cmVhbSk7Ci1zdGF0aWMgdm9pZCBHSUZSZWFkSW1hZ2VEYXRhKHN0cnVjdCBHSUZJbWFnZSAqaW1hZ2UsIEZJTEUgKnN0cmVhbSk7Ci1zdGF0aWMgaW50ICBHSUZSZWFkRGF0YUJsb2NrKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgRklMRSAqc3RyZWFtKTsKLXN0YXRpYyB2b2lkIEdJRlNraXBEYXRhQmxvY2tzKEZJTEUgKnN0cmVhbSk7Ci1zdGF0aWMgaW50ICBMWldHZXRDb2RlKGludCBjb2RlX3NpemUsIGludCBpbml0X2ZsYWcsIEZJTEUgKnN0cmVhbSk7Ci1zdGF0aWMgaW50ICBMWldSZWFkQnl0ZShpbnQgaW5pdF9mbGFnLCBpbnQgaW5wdXRfY29kZV9zaXplLCBGSUxFICpzdHJlYW0pOwotc3RhdGljIHZvaWQgR0lGUmVhZE5leHRFeHRlbnNpb24oc3RydWN0IEdJRkV4dGVuc2lvbiAqZXh0LCBGSUxFICpzdHJlYW0pOwotCi1zdGF0aWMgdm9pZCBEZWZhdWx0RXJyb3IoY29uc3QgY2hhciAqbWVzc2FnZSk7Ci1zdGF0aWMgdm9pZCBEZWZhdWx0V2FybmluZyhjb25zdCBjaGFyICptZXNzYWdlKTsKLXN0YXRpYyB2b2lkIE1lbW9yeUVycm9yKHZvaWQpOwotc3RhdGljIHZvaWQgUmVhZEVycm9yKHZvaWQpOwotCi0KLSNkZWZpbmUgR0lGX0dFVFcoYnVmZmVyKSBcCi0gICAgKChidWZmZXIpWzBdICsgKChidWZmZXIpWzFdIDw8IDgpKQotCi0jZGVmaW5lIEdJRl9GR0VUQyhjaCwgZmlsZSkgXAotICAgIHsgaWYgKChjaCA9IGdldGMoZmlsZSkpID09IEVPRikgUmVhZEVycm9yKCk7IH0KLQotI2RlZmluZSBHSUZfRlJFQUQoYnVmZmVyLCBsZW4sIGZpbGUpIFwKLSAgICB7IGlmIChmcmVhZChidWZmZXIsIGxlbiwgMSwgZmlsZSkgPD0gMCkgUmVhZEVycm9yKCk7IH0KLQotI2lmZGVmIEdJRl9ERUJVRwotI2RlZmluZSBHSUZfVFJBQ0UoYXJncykgKHByaW50ZiBhcmdzKQotI2Vsc2UKLSNkZWZpbmUgR0lGX1RSQUNFKGFyZ3MpICgodm9pZCkwKQotI2VuZGlmCi0KLQotLyoKLSAqIFJlYWRzIHRoZSBHSUYgc2NyZWVuIGFuZCB0aGUgZ2xvYmFsIGNvbG9yIHRhYmxlLgotICovCi12b2lkIEdJRlJlYWRTY3JlZW4oc3RydWN0IEdJRlNjcmVlbiAqc2NyZWVuLCBGSUxFICpzdHJlYW0pCi17Ci0gICAgdW5zaWduZWQgY2hhciBidWZmZXJbN107Ci0KLSAgICBHSUZfVFJBQ0UoKCJSZWFkaW5nIEhlYWRlclxuIikpOwotICAgIEdJRl9GUkVBRChidWZmZXIsIDYsIHN0cmVhbSk7Ci0gICAgaWYgKG1lbWNtcChidWZmZXIsICJHSUYiLCAzKSAhPSAwKQotICAgICAgICBHSUZFcnJvcigiTm90IGEgR0lGIGZpbGUiKTsKLSAgICBpZiAoKG1lbWNtcChidWZmZXIgKyAzLCAiODdhIiwgMykgIT0gMCkgJiYKLSAgICAgICAgICAgIChtZW1jbXAoYnVmZmVyICsgMywgIjg5YSIsIDMpICE9IDApKQotICAgICAgICBHSUZXYXJuaW5nKCJJbnZhbGlkIEdJRiB2ZXJzaW9uIG51bWJlciwgbm90IFwiODdhXCIgb3IgXCI4OWFcIiIpOwotCi0gICAgR0lGX1RSQUNFKCgiUmVhZGluZyBMb2dpY2FsIFNjcmVlbiBEZXNjcmlwdG9yXG4iKSk7Ci0gICAgR0lGX0ZSRUFEKGJ1ZmZlciwgNywgc3RyZWFtKTsKLSAgICBzY3JlZW4tPldpZHRoICAgICAgICAgICAgPSBHSUZfR0VUVyhidWZmZXIgKyAwKTsKLSAgICBzY3JlZW4tPkhlaWdodCAgICAgICAgICAgPSBHSUZfR0VUVyhidWZmZXIgKyAyKTsKLSAgICBzY3JlZW4tPkdsb2JhbENvbG9yRmxhZyAgPSAoYnVmZmVyWzRdICYgMHg4MCkgPyAxIDogMDsKLSAgICBzY3JlZW4tPkNvbG9yUmVzb2x1dGlvbiAgPSAoKGJ1ZmZlcls0XSAmIDB4NzApID4+IDMpICsgMTsKLSAgICBzY3JlZW4tPlNvcnRGbGFnICAgICAgICAgPSAoYnVmZmVyWzRdICYgMHgwOCkgPyAxIDogMDsKLSAgICBzY3JlZW4tPkdsb2JhbE51bUNvbG9ycyAgPSAyIDw8IChidWZmZXJbNF0gJiAweDA3KTsKLSAgICBzY3JlZW4tPkJhY2tncm91bmQgICAgICAgPSBidWZmZXJbNV07Ci0gICAgc2NyZWVuLT5QaXhlbEFzcGVjdFJhdGlvID0gYnVmZmVyWzZdOwotCi0gICAgaWYgKHNjcmVlbi0+R2xvYmFsQ29sb3JGbGFnKQotICAgIHsKLSAgICAgICAgR0lGX1RSQUNFKCgiUmVhZGluZyBHbG9iYWwgQ29sb3IgVGFibGVcbiIpKTsKLSAgICAgICAgR0lGX0ZSRUFEKHNjcmVlbi0+R2xvYmFsQ29sb3JUYWJsZSwgMyAqIHNjcmVlbi0+R2xvYmFsTnVtQ29sb3JzLAotICAgICAgICAgICAgc3RyZWFtKTsKLSAgICB9Ci0KLSAgICBHSUZfVFJBQ0UoKCJWYWxpZGF0aW5nIExvZ2ljYWwgU2NyZWVuIERlc2NyaXB0b3JcbiIpKTsKLSAgICBpZiAoc2NyZWVuLT5XaWR0aCA9PSAwIHx8IHNjcmVlbi0+SGVpZ2h0ID09IDApCi0gICAgICAgIEdJRkVycm9yKCJJbnZhbGlkIGltYWdlIGRpbWVuc2lvbnMiKTsKLSAgICBpZiAoc2NyZWVuLT5CYWNrZ3JvdW5kID4gMCkKLSAgICB7Ci0gICAgICAgIGlmICgoc2NyZWVuLT5HbG9iYWxDb2xvckZsYWcgJiYKLSAgICAgICAgICAgICAoc2NyZWVuLT5CYWNrZ3JvdW5kID49IHNjcmVlbi0+R2xvYmFsTnVtQ29sb3JzKSkgfHwKLSAgICAgICAgICAgICFzY3JlZW4tPkdsb2JhbENvbG9yRmxhZykKLSAgICAgICAgewotI2lmIDAgICAgICAgLyogdG9vIG5vaXN5ICovCi0gICAgICAgICAgICBHSUZXYXJuaW5nKCJJbnZhbGlkIGJhY2tncm91bmQgY29sb3IgaW5kZXgiKTsKLSNlbmRpZgotICAgICAgICAgICAgc2NyZWVuLT5CYWNrZ3JvdW5kID0gMDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoKLSAqIEluaXRpYWxpemVzIGEgR0lGIGltYWdlIG9iamVjdC4KLSAqLwotdm9pZCBHSUZJbml0SW1hZ2Uoc3RydWN0IEdJRkltYWdlICppbWFnZSwKLSAgICAgICAgICAgICAgICAgIHN0cnVjdCBHSUZTY3JlZW4gKnNjcmVlbiwgdW5zaWduZWQgY2hhciAqKnJvd3MpCi17Ci0gICAgaW1hZ2UtPlNjcmVlbiA9IHNjcmVlbjsKLSAgICBpbWFnZS0+Um93cyAgID0gcm93czsKLX0KLQotLyoKLSAqIERlc3Ryb3lzIGEgR0lGIGltYWdlIG9iamVjdC4KLSAqLwotdm9pZCBHSUZEZXN0cm95SW1hZ2Uoc3RydWN0IEdJRkltYWdlICppbWFnZSkKLXsKLSAgICAodm9pZClpbWFnZTsgIC8qIG5vdGhpbmcgdG8gZG8gKi8KLX0KLQotLyoKLSAqIFJlYWRzIHRoZSBuZXh0IEdJRiBibG9jayBpbnRvIGFuIGltYWdlIG9yIGV4dGVuc2lvbiBvYmplY3QuCi0gKi8KLWludCBHSUZSZWFkTmV4dEJsb2NrKHN0cnVjdCBHSUZJbWFnZSAqaW1hZ2UsIHN0cnVjdCBHSUZFeHRlbnNpb24gKmV4dCwKLSAgICAgICAgICAgICAgICAgICAgIEZJTEUgKnN0cmVhbSkKLXsKLSAgICBpbnQgY2g7Ci0gICAgaW50IGZvdW5kQm9ndXM7Ci0KLSAgICBmb3VuZEJvZ3VzID0gMDsKLSAgICBmb3IgKCA7IDsgKQotICAgIHsKLSAgICAgICAgR0lGX0ZHRVRDKGNoLCBzdHJlYW0pOwotICAgICAgICBzd2l0Y2ggKGNoKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgR0lGX0lNQUdFOiAgICAgICAvKiAnLCcgKi8KLSAgICAgICAgICAgIEdJRlJlYWROZXh0SW1hZ2UoaW1hZ2UsIHN0cmVhbSk7Ci0gICAgICAgICAgICByZXR1cm4gY2g7Ci0gICAgICAgIGNhc2UgR0lGX0VYVEVOU0lPTjogICAvKiAnIScgKi8KLSAgICAgICAgICAgIEdJRlJlYWROZXh0RXh0ZW5zaW9uKGV4dCwgc3RyZWFtKTsKLSAgICAgICAgICAgIHJldHVybiBjaDsKLSAgICAgICAgY2FzZSBHSUZfVEVSTUlOQVRPUjogIC8qICc7JyAqLwotICAgICAgICAgICAgcmV0dXJuIGNoOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKCFmb3VuZEJvZ3VzKQotICAgICAgICAgICAgICAgIEdJRldhcm5pbmcoIkJvZ3VzIGRhdGEgaW4gR0lGIik7Ci0gICAgICAgICAgICBmb3VuZEJvZ3VzID0gMTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoKLSAqIFJlYWRzIHRoZSBuZXh0IEdJRiBpbWFnZSBhbmQgbG9jYWwgY29sb3IgdGFibGUuCi0gKi8KLXN0YXRpYyB2b2lkIEdJRlJlYWROZXh0SW1hZ2Uoc3RydWN0IEdJRkltYWdlICppbWFnZSwgRklMRSAqc3RyZWFtKQotewotICAgIHN0cnVjdCBHSUZTY3JlZW4gKnNjcmVlbjsKLSAgICB1bnNpZ25lZCBjaGFyICAgIGJ1ZmZlcls5XTsKLQotICAgIEdJRl9UUkFDRSgoIlJlYWRpbmcgTG9jYWwgSW1hZ2UgRGVzY3JpcHRvclxuIikpOwotICAgIEdJRl9GUkVBRChidWZmZXIsIDksIHN0cmVhbSk7Ci0gICAgaWYgKGltYWdlID09IE5VTEwpCi0gICAgewotICAgICAgICBHSUZTa2lwRGF0YUJsb2NrcyhzdHJlYW0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW1hZ2UtPkxlZnRQb3MgICAgICAgID0gR0lGX0dFVFcoYnVmZmVyICsgMCk7Ci0gICAgaW1hZ2UtPlRvcFBvcyAgICAgICAgID0gR0lGX0dFVFcoYnVmZmVyICsgMik7Ci0gICAgaW1hZ2UtPldpZHRoICAgICAgICAgID0gR0lGX0dFVFcoYnVmZmVyICsgNCk7Ci0gICAgaW1hZ2UtPkhlaWdodCAgICAgICAgID0gR0lGX0dFVFcoYnVmZmVyICsgNik7Ci0gICAgaW1hZ2UtPkxvY2FsQ29sb3JGbGFnID0gKGJ1ZmZlcls4XSAmIDB4ODApID8gMSA6IDA7Ci0gICAgaW1hZ2UtPkludGVybGFjZUZsYWcgID0gKGJ1ZmZlcls4XSAmIDB4NDApID8gMSA6IDA7Ci0gICAgaW1hZ2UtPlNvcnRGbGFnICAgICAgID0gKGJ1ZmZlcls4XSAmIDB4MjApID8gMSA6IDA7Ci0gICAgaW1hZ2UtPkxvY2FsTnVtQ29sb3JzID0gaW1hZ2UtPkxvY2FsQ29sb3JGbGFnID8gKDIgPDwgKGJ1ZmZlcls4XSAmIDB4MDcpKSA6IDA7Ci0KLSAgICBpZiAoaW1hZ2UtPkxvY2FsQ29sb3JGbGFnKQotICAgIHsKLSAgICAgICAgR0lGX1RSQUNFKCgiUmVhZGluZyBMb2NhbCBDb2xvciBUYWJsZVxuIikpOwotICAgICAgICBHSUZfRlJFQUQoaW1hZ2UtPkxvY2FsQ29sb3JUYWJsZSwgMyAqIGltYWdlLT5Mb2NhbE51bUNvbG9ycywgc3RyZWFtKTsKLSAgICB9Ci0KLSAgICBHSUZfVFJBQ0UoKCJWYWxpZGF0aW5nIExvZ2ljYWwgU2NyZWVuIERlc2NyaXB0b3JcbiIpKTsKLSAgICBzY3JlZW4gPSBpbWFnZS0+U2NyZWVuOwotCi0gICAgaWYgKGltYWdlLT5XaWR0aCA9PSAwIHx8IGltYWdlLT5IZWlnaHQgPT0gMCB8fAotICAgICAgICAgICAgaW1hZ2UtPkxlZnRQb3MgKyBpbWFnZS0+V2lkdGggPiBzY3JlZW4tPldpZHRoIHx8Ci0gICAgICAgICAgICBpbWFnZS0+VG9wUG9zICsgaW1hZ2UtPkhlaWdodCA+IHNjcmVlbi0+SGVpZ2h0KQotICAgICAgICBHSUZFcnJvcigiSW52YWxpZCBpbWFnZSBkaW1lbnNpb25zIik7Ci0KLSAgICBHSUZSZWFkSW1hZ2VEYXRhKGltYWdlLCBzdHJlYW0pOwotfQotCi1zdGF0aWMgdm9pZCBHSUZSZWFkSW1hZ2VEYXRhKHN0cnVjdCBHSUZJbWFnZSAqaW1hZ2UsIEZJTEUgKnN0cmVhbSkKLXsKLSAgICBpbnQgICAgICAgICAgIG1pbkNvZGVTaXplOwotICAgIHVuc2lnbmVkIGNoYXIgKipyb3dzOwotICAgIHVuc2lnbmVkIGludCAgd2lkdGgsIGhlaWdodCwgaW50ZXJsYWNlZDsKLSAgICB1bnNpZ25lZCBjaGFyICpjb2xvcnM7Ci0gICAgdW5zaWduZWQgaW50ICBudW1Db2xvcnM7Ci0gICAgdW5zaWduZWQgaW50ICB4cG9zLCB5cG9zOwotICAgIGludCAgICAgICAgICAgcGFzcywgdmFsOwotCi0gICAgR0lGX1RSQUNFKCgiUmVhZGluZyBJbWFnZSBEYXRhXG4iKSk7Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBjb21wcmVzc2lvbiByb3V0aW5lcy4gKi8KLSAgICBHSUZfRkdFVEMobWluQ29kZVNpemUsIHN0cmVhbSk7Ci0gICAgaWYgKG1pbkNvZGVTaXplID49IExaV19CSVRTX01BWCkgIC8qIHRoaXMgc2hvdWxkIGJlIGluIGZhY3QgPD0gOCAqLwotICAgICAgICBHSUZFcnJvcigiR0lGL0xaVyBlcnJvcjogaW52YWxpZCBMWlcgY29kZSBzaXplIik7Ci0KLSAgICBpZiAoTFpXUmVhZEJ5dGUoTFpXX1RSVUUsIG1pbkNvZGVTaXplLCBzdHJlYW0pIDwgMCkKLSAgICAgICAgR0lGRXJyb3IoIkVycm9yIHJlYWRpbmcgR0lGIGltYWdlIik7Ci0KLSAgICAvKiBJZ25vcmUgdGhlIHBpY3R1cmUgaWYgaXQgaXMgInVuaW50ZXJlc3RpbmciLiAqLwotICAgIHJvd3MgPSBpbWFnZS0+Um93czsKLSAgICBpZiAocm93cyA9PSBOVUxMKQotICAgIHsKLSNpZiAwCi0gICAgICAgIHdoaWxlIChMWldSZWFkQnl0ZShMWldfRkFMU0UsIG1pbkNvZGVTaXplLCBzdHJlYW0pID49IDApCi0gICAgICAgIHsKLSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgLyogVGhpcyBpcyBmYXN0ZXIsIGJ1dCBwb3NzaWJsZSBMWlcgZXJyb3JzIG1heSBnbyB1bmRldGVjdGVkLiAqLwotICAgICAgICBHSUZTa2lwRGF0YUJsb2NrcyhzdHJlYW0pOwotI2VuZGlmCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3aWR0aCAgICAgID0gaW1hZ2UtPldpZHRoOwotICAgIGhlaWdodCAgICAgPSBpbWFnZS0+SGVpZ2h0OwotICAgIGludGVybGFjZWQgPSBpbWFnZS0+SW50ZXJsYWNlRmxhZzsKLSAgICBHSUZHZXRDb2xvclRhYmxlKCZjb2xvcnMsICZudW1Db2xvcnMsIGltYWdlKTsKLSAgICB4cG9zID0geXBvcyA9IDA7Ci0gICAgcGFzcyA9IDA7Ci0gICAgd2hpbGUgKCh2YWwgPSBMWldSZWFkQnl0ZShMWldfRkFMU0UsIG1pbkNvZGVTaXplLCBzdHJlYW0pKSA+PSAwKQotICAgIHsKLSAgICAgICAgaWYgKCh1bnNpZ25lZCBpbnQpdmFsID49IG51bUNvbG9ycykKLSAgICAgICAgewotICAgICAgICAgICAgR0lGV2FybmluZygiUGl4ZWwgdmFsdWUgb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgICAgICB2YWwgPSBudW1Db2xvcnMgLSAxOwotICAgICAgICB9Ci0gICAgICAgIHJvd3NbeXBvc11beHBvc10gPSAodW5zaWduZWQgY2hhcil2YWw7Ci0gICAgICAgIGlmICgrK3hwb3MgPT0gd2lkdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHhwb3MgPSAwOwotICAgICAgICAgICAgaWYgKGludGVybGFjZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChwYXNzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICB5cG9zICs9IDg7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgeXBvcyArPSA0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgIHlwb3MgKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh5cG9zID49IGhlaWdodCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKytwYXNzKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIHlwb3MgPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHlwb3MgPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHlwb3MgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgKyt5cG9zOwotICAgICAgICB9Ci0gICAgICAgIGlmICh5cG9zID49IGhlaWdodCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLWZpbmk6Ci0gICAgLyogSWdub3JlIHRoZSB0cmFpbGluZyBnYXJiYWdlLiAqLwotICAgIHdoaWxlIChMWldSZWFkQnl0ZShMWldfRkFMU0UsIG1pbkNvZGVTaXplLCBzdHJlYW0pID49IDApCi0gICAgewotICAgIH0KLX0KLQotc3RhdGljIGludCBEYXRhQmxvY2tTaXplID0gMDsKLQotc3RhdGljIGludCBHSUZSZWFkRGF0YUJsb2NrKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgRklMRSAqc3RyZWFtKQotewotICAgIGludCBjb3VudDsKLQotICAgIEdJRl9GR0VUQyhjb3VudCwgc3RyZWFtKTsKLSAgICBEYXRhQmxvY2tTaXplID0gY291bnQ7Ci0gICAgaWYgKGNvdW50ID4gMCkKLSAgICB7Ci0gICAgICAgIEdJRl9GUkVBRChidWZmZXIsICh1bnNpZ25lZCBpbnQpY291bnQsIHN0cmVhbSk7Ci0gICAgfQotICAgIHJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHZvaWQgR0lGU2tpcERhdGFCbG9ja3MoRklMRSAqc3RyZWFtKQotewotICAgIGludCAgICAgICAgICAgY291bnQ7Ci0gICAgdW5zaWduZWQgY2hhciBidWZmZXJbR0lGX1VDSEFSX01BWCArIDFdOwotCi0gICAgZm9yICggOyA7ICkKLSAgICB7Ci0gICAgICAgIEdJRl9GR0VUQyhjb3VudCwgc3RyZWFtKQotICAgICAgICBpZiAoY291bnQgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBHSUZfRlJFQUQoYnVmZmVyLCAodW5zaWduZWQgaW50KWNvdW50LCBzdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgTFpXR2V0Q29kZShpbnQgY29kZV9zaXplLCBpbnQgaW5pdF9mbGFnLCBGSUxFICpzdHJlYW0pCi17Ci0gICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzI4MF07Ci0gICAgc3RhdGljIGludCAgICAgICAgICAgY3VyYml0LCBsYXN0Yml0LCBkb25lLCBsYXN0X2J5dGU7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgY291bnQsIGksIGosIHJldDsKLQotICAgIGlmIChpbml0X2ZsYWcpCi0gICAgewotICAgICAgICBjdXJiaXQgPSAwOwotICAgICAgICBsYXN0Yml0ID0gMDsKLSAgICAgICAgZG9uZSA9IExaV19GQUxTRTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKChjdXJiaXQgKyBjb2RlX3NpemUpID49IGxhc3RiaXQpCi0gICAgewotICAgICAgICBpZiAoZG9uZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGN1cmJpdCA+PSBsYXN0Yml0KQotICAgICAgICAgICAgICAgIEdJRkVycm9yKCJHSUYvTFpXIGVycm9yOiByYW4gb2ZmIHRoZSBlbmQgb2YgbXkgYml0cyIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlclswXSA9IGJ1ZmZlcltsYXN0X2J5dGUtMl07Ci0gICAgICAgIGJ1ZmZlclsxXSA9IGJ1ZmZlcltsYXN0X2J5dGUtMV07Ci0KLSAgICAgICAgaWYgKChjb3VudCA9IEdJRlJlYWREYXRhQmxvY2soJmJ1ZmZlclsyXSwgc3RyZWFtKSkgPT0gMCkKLSAgICAgICAgICAgIGRvbmUgPSBMWldfVFJVRTsKLQotICAgICAgICBsYXN0X2J5dGUgPSAyICsgY291bnQ7Ci0gICAgICAgIGN1cmJpdCA9IChjdXJiaXQgLSBsYXN0Yml0KSArIDE2OwotICAgICAgICBsYXN0Yml0ID0gKDIgKyBjb3VudCkgKiA4OwotICAgIH0KLQotICAgIHJldCA9IDA7Ci0gICAgZm9yIChpID0gY3VyYml0LCBqID0gMDsgaiA8IGNvZGVfc2l6ZTsgKytpLCArK2opCi0gICAgICAgIHJldCB8PSAoKGJ1ZmZlclsgaSAvIDggXSAmICgxIDw8IChpICUgOCkpKSAhPSAwKSA8PCBqOwotCi0gICAgY3VyYml0ICs9IGNvZGVfc2l6ZTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IExaV1JlYWRCeXRlKGludCBpbml0X2ZsYWcsIGludCBpbnB1dF9jb2RlX3NpemUsIEZJTEUgKnN0cmVhbSkKLXsKLSAgICBzdGF0aWMgaW50IGZyZXNoID0gTFpXX0ZBTFNFOwotICAgIGludCAgICAgICAgY29kZSwgaW5jb2RlOwotICAgIHN0YXRpYyBpbnQgY29kZV9zaXplLCBzZXRfY29kZV9zaXplOwotICAgIHN0YXRpYyBpbnQgbWF4X2NvZGUsIG1heF9jb2RlX3NpemU7Ci0gICAgc3RhdGljIGludCBmaXJzdGNvZGUsIG9sZGNvZGU7Ci0gICAgc3RhdGljIGludCBjbGVhcl9jb2RlLCBlbmRfY29kZTsKLSAgICBzdGF0aWMgaW50IHRhYmxlWzJdW0xaV19DT0RFX01BWCArIDFdOwotICAgIHN0YXRpYyBpbnQgc3RhY2tbKExaV19DT0RFX01BWCArIDEpICogMl0sICpzcDsKLSAgICBpbnQgICAgICAgIGk7Ci0KLSAgICBpZiAoaW5pdF9mbGFnKQotICAgIHsKLSAgICAgICAgc2V0X2NvZGVfc2l6ZSA9IGlucHV0X2NvZGVfc2l6ZTsKLSAgICAgICAgY29kZV9zaXplID0gc2V0X2NvZGVfc2l6ZSsxOwotICAgICAgICBjbGVhcl9jb2RlID0gMSA8PCBzZXRfY29kZV9zaXplOwotICAgICAgICBlbmRfY29kZSA9IGNsZWFyX2NvZGUgKyAxOwotICAgICAgICBtYXhfY29kZV9zaXplID0gMiAqIGNsZWFyX2NvZGU7Ci0gICAgICAgIG1heF9jb2RlID0gY2xlYXJfY29kZSArIDI7Ci0KLSAgICAgICAgTFpXR2V0Q29kZSgwLCBMWldfVFJVRSwgc3RyZWFtKTsKLQotICAgICAgICBmcmVzaCA9IExaV19UUlVFOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbGVhcl9jb2RlOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhYmxlWzBdW2ldID0gMDsKLSAgICAgICAgICAgIHRhYmxlWzFdW2ldID0gaTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKCA7IGkgPD0gTFpXX0NPREVfTUFYOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhYmxlWzBdW2ldID0gMDsKLSAgICAgICAgICAgIHRhYmxlWzFdW2ldID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHNwID0gc3RhY2s7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlbHNlIGlmIChmcmVzaCkKLSAgICB7Ci0gICAgICAgIGZyZXNoID0gTFpXX0ZBTFNFOwotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgICBmaXJzdGNvZGUgPSBvbGRjb2RlID0KLSAgICAgICAgICAgICAgICBMWldHZXRDb2RlKGNvZGVfc2l6ZSwgTFpXX0ZBTFNFLCBzdHJlYW0pOwotICAgICAgICB9IHdoaWxlIChmaXJzdGNvZGUgPT0gY2xlYXJfY29kZSk7Ci0gICAgICAgIHJldHVybiBmaXJzdGNvZGU7Ci0gICAgfQotCi0gICAgaWYgKHNwID4gc3RhY2spCi0gICAgICAgIHJldHVybiAqLS1zcDsKLQotICAgIHdoaWxlICgoY29kZSA9IExaV0dldENvZGUoY29kZV9zaXplLCBMWldfRkFMU0UsIHN0cmVhbSkpID49IDApCi0gICAgewotICAgICAgICBpZiAoY29kZSA9PSBjbGVhcl9jb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2xlYXJfY29kZTsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhYmxlWzBdW2ldID0gMDsKLSAgICAgICAgICAgICAgICB0YWJsZVsxXVtpXSA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKCA7IGkgPD0gTFpXX0NPREVfTUFYOyArK2kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFibGVbMF1baV0gPSAwOwotICAgICAgICAgICAgICAgIHRhYmxlWzFdW2ldID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29kZV9zaXplID0gc2V0X2NvZGVfc2l6ZSsxOwotICAgICAgICAgICAgbWF4X2NvZGVfc2l6ZSA9IDIqY2xlYXJfY29kZTsKLSAgICAgICAgICAgIG1heF9jb2RlID0gY2xlYXJfY29kZSsyOwotICAgICAgICAgICAgc3AgPSBzdGFjazsKLSAgICAgICAgICAgIGZpcnN0Y29kZSA9IG9sZGNvZGUgPQotICAgICAgICAgICAgICAgIExaV0dldENvZGUoY29kZV9zaXplLCBMWldfRkFMU0UsIHN0cmVhbSk7Ci0gICAgICAgICAgICByZXR1cm4gZmlyc3Rjb2RlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvZGUgPT0gZW5kX2NvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCAgICAgICAgICAgY291bnQ7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsyNjBdOwotCi0gICAgICAgICAgICBpZiAoRGF0YUJsb2NrU2l6ZSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiAtMjsKLQotICAgICAgICAgICAgd2hpbGUgKChjb3VudCA9IEdJRlJlYWREYXRhQmxvY2soYnVmZmVyLCBzdHJlYW0pKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0KLSNpZiAwICAgICAgIC8qIHRvbyBub2lzeSAqLwotICAgICAgICAgICAgaWYgKGNvdW50ICE9IDApCi0gICAgICAgICAgICAgICAgR0lGV2FybmluZygibWlzc2luZyBFT0QgaW4gZGF0YSBzdHJlYW0gKGNvbW1vbiBvY2N1cmVuY2UpIik7Ci0jZWxzZQotICAgICAgICAgICAgKHZvaWQpY291bnQ7Ci0jZW5kaWYKLSAgICAgICAgICAgIHJldHVybiAtMjsKLSAgICAgICAgfQotCi0gICAgICAgIGluY29kZSA9IGNvZGU7Ci0KLSAgICAgICAgaWYgKGNvZGUgPj0gbWF4X2NvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpzcCsrID0gZmlyc3Rjb2RlOwotICAgICAgICAgICAgY29kZSA9IG9sZGNvZGU7Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoY29kZSA+PSBjbGVhcl9jb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICAqc3ArKyA9IHRhYmxlWzFdW2NvZGVdOwotICAgICAgICAgICAgaWYgKGNvZGUgPT0gdGFibGVbMF1bY29kZV0pCi0gICAgICAgICAgICAgICAgR0lGRXJyb3IoIkdJRi9MWlcgZXJyb3I6IGNpcmN1bGFyIHRhYmxlIGVudHJ5Iik7Ci0gICAgICAgICAgICBjb2RlID0gdGFibGVbMF1bY29kZV07Ci0gICAgICAgIH0KLQotICAgICAgICAqc3ArKyA9IGZpcnN0Y29kZSA9IHRhYmxlWzFdW2NvZGVdOwotCi0gICAgICAgIGlmICgoY29kZSA9IG1heF9jb2RlKSA8PSBMWldfQ09ERV9NQVgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhYmxlWzBdW2NvZGVdID0gb2xkY29kZTsKLSAgICAgICAgICAgIHRhYmxlWzFdW2NvZGVdID0gZmlyc3Rjb2RlOwotICAgICAgICAgICAgKyttYXhfY29kZTsKLSAgICAgICAgICAgIGlmICgobWF4X2NvZGUgPj0gbWF4X2NvZGVfc2l6ZSkgJiYgKG1heF9jb2RlX3NpemUgPD0gTFpXX0NPREVfTUFYKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYXhfY29kZV9zaXplICo9IDI7Ci0gICAgICAgICAgICAgICAgKytjb2RlX3NpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBvbGRjb2RlID0gaW5jb2RlOwotCi0gICAgICAgIGlmIChzcCA+IHN0YWNrKQotICAgICAgICAgICAgcmV0dXJuICotLXNwOwotICAgIH0KLSAgICByZXR1cm4gY29kZTsKLX0KLQotLyoKLSAqIFRoZSBHSUYgc3BlYyBzYXlzIHRoYXQgaWYgbmVpdGhlciBnbG9iYWwgbm9yIGxvY2FsCi0gKiBjb2xvciBtYXBzIGFyZSBwcmVzZW50LCB0aGUgZGVjb2RlciBzaG91bGQgdXNlIGEgc3lzdGVtCi0gKiBkZWZhdWx0IG1hcCwgd2hpY2ggc2hvdWxkIGhhdmUgYmxhY2sgYW5kIHdoaXRlIGFzIHRoZQotICogZmlyc3QgdHdvIGNvbG9ycy4gU28gd2UgdXNlIGJsYWNrLCB3aGl0ZSwgcmVkLCBncmVlbiwgYmx1ZSwKLSAqIHllbGxvdywgcHVycGxlIGFuZCBjeWFuLgotICogTWlzc2luZyBjb2xvciB0YWJsZXMgYXJlIG5vdCBhIGNvbW1vbiBjYXNlLCBhbmQgYXJlIG5vdAotICogaGFuZGxlZCBieSBtb3N0IEdJRiByZWFkZXJzLgotICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBEZWZhdWx0Q29sb3JUYWJsZVtdID0KLXsKLSAgICAgIDAsICAgMCwgICAwLCAgLyogYmxhY2sgICovCi0gICAgMjU1LCAyNTUsIDI1NSwgIC8qIHdoaXRlICAqLwotICAgIDI1NSwgICAwLCAgIDAsICAvKiByZWQgICAgKi8KLSAgICAgIDAsIDI1NSwgMjU1LCAgLyogY3lhbiAgICovCi0gICAgICAwLCAyNTUsICAgMCwgIC8qIGdyZWVuICAqLwotICAgIDI1NSwgICAwLCAyNTUsICAvKiBwdXJwbGUgKi8KLSAgICAgIDAsICAgMCwgMjU1LCAgLyogYmx1ZSAgICovCi0gICAgMjU1LCAyNTUsICAgMCwgIC8qIHllbGxvdyAqLwotfTsKLQotLyoKLSAqIFJldHVybnMgdGhlIGxvY2FsIG9yIHRoZSBnbG9iYWwgY29sb3IgdGFibGUgKHdoaWNoZXZlciBpcyBhcHBsaWNhYmxlKSwKLSAqIG9yIGEgcHJlZGVmaW5lZCBjb2xvciB0YWJsZSBpZiBib3RoIG9mIHRoZXNlIHRhYmxlcyBhcmUgbWlzc2luZy4KLSAqLwotdm9pZCBHSUZHZXRDb2xvclRhYmxlKHVuc2lnbmVkIGNoYXIgKipjb2xvcnMsIHVuc2lnbmVkIGludCAqbnVtQ29sb3JzLAotICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBHSUZJbWFnZSAqaW1hZ2UpCi17Ci0gICAgc3RydWN0IEdJRlNjcmVlbiAqc2NyZWVuOwotCi0gICAgaWYgKGltYWdlLT5Mb2NhbENvbG9yRmxhZykKLSAgICB7Ci0gICAgICAgIEdJRl9UUkFDRSgoIkxvYWRpbmcgTG9jYWwgQ29sb3IgVGFibGVcbiIpKTsKLSAgICAgICAgKmNvbG9ycyA9IGltYWdlLT5Mb2NhbENvbG9yVGFibGU7Ci0gICAgICAgICpudW1Db2xvcnMgPSBpbWFnZS0+TG9jYWxOdW1Db2xvcnM7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzY3JlZW4gPSBpbWFnZS0+U2NyZWVuOwotICAgIGlmIChzY3JlZW4tPkdsb2JhbENvbG9yRmxhZykKLSAgICB7Ci0gICAgICAgIEdJRl9UUkFDRSgoIkxvYWRpbmcgR2xvYmFsIENvbG9yIFRhYmxlXG4iKSk7Ci0gICAgICAgICpjb2xvcnMgPSBzY3JlZW4tPkdsb2JhbENvbG9yVGFibGU7Ci0gICAgICAgICpudW1Db2xvcnMgPSBzY3JlZW4tPkdsb2JhbE51bUNvbG9yczsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEdJRl9UUkFDRSgoIkxvYWRpbmcgRGVmYXVsdCBDb2xvciBUYWJsZVxuIikpOwotICAgICpjb2xvcnMgPSBEZWZhdWx0Q29sb3JUYWJsZTsKLSAgICAqbnVtQ29sb3JzID0gc2l6ZW9mKERlZmF1bHRDb2xvclRhYmxlKSAvIDM7Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXplcyBhIEdJRiBleHRlbnNpb24gb2JqZWN0LgotICovCi12b2lkIEdJRkluaXRFeHRlbnNpb24oc3RydWN0IEdJRkV4dGVuc2lvbiAqZXh0LAotICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBHSUZTY3JlZW4gKnNjcmVlbiwgdW5zaWduZWQgaW50IGluaXRCdWZmZXJTaXplKQotewotICAgIHVuc2lnbmVkIGNoYXIgKm5ld0J1ZmZlcjsKLQotICAgIGV4dC0+U2NyZWVuICAgICA9IHNjcmVlbjsKLSAgICBpZiAoaW5pdEJ1ZmZlclNpemUgPiAwKQotICAgIHsKLSAgICAgICAgbmV3QnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MoaW5pdEJ1ZmZlclNpemUpOwotICAgICAgICBpZiAobmV3QnVmZmVyID09IE5VTEwpCi0gICAgICAgICAgICBNZW1vcnlFcnJvcigpOwotICAgICAgICBleHQtPkJ1ZmZlciAgICAgPSBuZXdCdWZmZXI7Ci0gICAgICAgIGV4dC0+QnVmZmVyU2l6ZSA9IGluaXRCdWZmZXJTaXplOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBleHQtPkJ1ZmZlciAgICAgPSBOVUxMOwotICAgICAgICBleHQtPkJ1ZmZlclNpemUgPSAwOwotICAgIH0KLX0KLQotLyoKLSAqIERlc3Ryb3lzIGEgR0lGIGV4dGVuc2lvbiBvYmplY3QuCi0gKi8KLXZvaWQgR0lGRGVzdHJveUV4dGVuc2lvbihzdHJ1Y3QgR0lGRXh0ZW5zaW9uICpleHQpCi17Ci0gICAgZnJlZShleHQtPkJ1ZmZlcik7Ci19Ci0KLS8qCi0gKiBSZWFkcyB0aGUgbmV4dCBHSUYgZXh0ZW5zaW9uLgotICovCi1zdGF0aWMgdm9pZCBHSUZSZWFkTmV4dEV4dGVuc2lvbihzdHJ1Y3QgR0lGRXh0ZW5zaW9uICpleHQsIEZJTEUgKnN0cmVhbSkKLXsKLSAgICB1bnNpZ25lZCBjaGFyICpuZXdCdWZmZXI7Ci0gICAgdW5zaWduZWQgaW50ICBuZXdCdWZmZXJTaXplOwotICAgIHVuc2lnbmVkIGludCAgb2Zmc2V0LCBsZW47Ci0gICAgaW50ICAgICAgICAgICBjb3VudCwgbGFiZWw7Ci0KLSAgICBHSUZfRkdFVEMobGFiZWwsIHN0cmVhbSk7Ci0gICAgR0lGX1RSQUNFKCgiUmVhZGluZyBFeHRlbnNpb24gKDB4JVgpXG4iLCBsYWJlbCkpOwotICAgIGlmIChleHQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIEdJRlNraXBEYXRhQmxvY2tzKHN0cmVhbSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZXh0LT5MYWJlbCA9ICh1bnNpZ25lZCBjaGFyKWxhYmVsOwotCi0gICAgb2Zmc2V0ID0gMDsKLSAgICBsZW4gPSBleHQtPkJ1ZmZlclNpemU7Ci0gICAgZm9yICggOyA7ICkKLSAgICB7Ci0gICAgICAgIGlmIChsZW4gPCBHSUZfVUNIQVJfTUFYKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXdCdWZmZXJTaXplID0gZXh0LT5CdWZmZXJTaXplICsgMTAyNDsKLSAgICAgICAgICAgIG5ld0J1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopcmVhbGxvYyhleHQtPkJ1ZmZlciwgbmV3QnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICBpZiAobmV3QnVmZmVyID09IE5VTEwpCi0gICAgICAgICAgICAgICAgTWVtb3J5RXJyb3IoKTsKLSAgICAgICAgICAgIGV4dC0+QnVmZmVyU2l6ZSA9IG5ld0J1ZmZlclNpemU7Ci0gICAgICAgICAgICBleHQtPkJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICAgICAgICAgIGxlbiArPSAxMDI0OwotICAgICAgICB9Ci0gICAgICAgIGNvdW50ID0gR0lGUmVhZERhdGFCbG9jayhleHQtPkJ1ZmZlciArIG9mZnNldCwgc3RyZWFtKTsKLSAgICAgICAgaWYgKGNvdW50ID09IDApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgb2Zmc2V0ICs9IGNvdW50OwotICAgICAgICBsZW4gLT0gY291bnQ7Ci0gICAgfQotfQotCi0vKgotICogQ29uc3RydWN0cyBhIEdJRiBncmFwaGljIGNvbnRyb2wgZXh0ZW5zaW9uIG9iamVjdAotICogZnJvbSBhIHJhdyBleHRlbnNpb24gb2JqZWN0LgotICovCi12b2lkIEdJRkdldEdyYXBoaWNDdGwoc3RydWN0IEdJRkdyYXBoaWNDdGxFeHQgKmdyYXBoaWNFeHQsCi0gICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEdJRkV4dGVuc2lvbiAqZXh0KQotewotICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLQotICAgIEdJRl9UUkFDRSgoIkxvYWRpbmcgR3JhcGhpYyBDb250cm9sIEV4dGVuc2lvblxuIikpOwotICAgIGlmIChleHQtPkxhYmVsICE9IEdJRl9HUkFQSElDQ1RMKQotICAgIHsKLSAgICAgICAgR0lGV2FybmluZygiTm90IGEgZ3JhcGhpYyBjb250cm9sIGV4dGVuc2lvbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChleHQtPkJ1ZmZlclNpemUgPCA0KQotICAgIHsKLSAgICAgICAgR0lGV2FybmluZygiQnJva2VuIGdyYXBoaWMgY29udHJvbCBleHRlbnNpb24iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJ1ZmZlciA9IGV4dC0+QnVmZmVyOwotICAgIGdyYXBoaWNFeHQtPkRpc3Bvc2FsTWV0aG9kICA9IChidWZmZXJbMF0gPj4gMikgJiAweDA3OwotICAgIGdyYXBoaWNFeHQtPklucHV0RmxhZyAgICAgICA9IChidWZmZXJbMF0gPj4gMSkgJiAweDAxOwotICAgIGdyYXBoaWNFeHQtPlRyYW5zcGFyZW50RmxhZyA9IGJ1ZmZlclswXSAmIDB4MDE7Ci0gICAgZ3JhcGhpY0V4dC0+RGVsYXlUaW1lICAgICAgID0gR0lGX0dFVFcoYnVmZmVyICsgMSk7Ci0gICAgZ3JhcGhpY0V4dC0+VHJhbnNwYXJlbnQgICAgID0gYnVmZmVyWzNdOwotfQotCi0KLS8qCi0gKiBUaGUgZGVmYXVsdCBlcnJvciBoYW5kbGVyLgotICovCi1zdGF0aWMgdm9pZCBEZWZhdWx0RXJyb3IoY29uc3QgY2hhciAqbWVzc2FnZSkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBtZXNzYWdlKTsKLSAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci19Ci0KLS8qCi0gKiBUaGUgZGVmYXVsdCB3YXJuaW5nIGhhbmRsZXIuCi0gKi8KLXN0YXRpYyB2b2lkIERlZmF1bHRXYXJuaW5nKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgbWVzc2FnZSk7Ci19Ci0KLS8qCi0gKiBUaGUgY29tbW9uIG1lbW9yeSBlcnJvciBoYW5kbGVyLgotICovCi1zdGF0aWMgdm9pZCBNZW1vcnlFcnJvcih2b2lkKQotewotICAgIEdJRkVycm9yKCJPdXQgb2YgbWVtb3J5Iik7Ci19Ci0KLS8qCi0gKiBUaGUgY29tbW9uIHJlYWQgZXJyb3IgaGFuZGxlci4KLSAqLwotc3RhdGljIHZvaWQgUmVhZEVycm9yKHZvaWQpCi17Ci0gICAgR0lGRXJyb3IoIkVycm9yIHJlYWRpbmcgZmlsZSBvciB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci19Ci0KLS8qCi0gKiBUaGUgZXJyb3IgaGFuZGxpbmcgY2FsbGJhY2suCi0gKi8KLXZvaWQgKCpHSUZFcnJvcikoY29uc3QgY2hhciAqbWVzc2FnZSkgPSBEZWZhdWx0RXJyb3I7Ci0KLS8qCi0gKiBUaGUgd2FybmluZyBoYW5kbGluZyBjYWxsYmFjay4KLSAqLwotdm9pZCAoKkdJRldhcm5pbmcpKGNvbnN0IGNoYXIgKm1lc3NhZ2UpID0gRGVmYXVsdFdhcm5pbmc7Ci0KZGlmZiAtLWdpdCBhL3NyYy9naWZyZWFkL2dpZnJlYWQuaCBiL3NyYy9naWZyZWFkL2dpZnJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdlYjRlOS4uMDAwMDAwMAotLS0gYS9zcmMvZ2lmcmVhZC9naWZyZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqCi0gKiBAZmlsZSBnaWZyZWFkLmgKLSAqIEEgc2ltcGxlIEdJRiByZWFkZXIuCi0gKgotICogQGF1dGhvciBDb3NtaW4gVHJ1dGEKLSAqCi0gKiBAc2VjdGlvbiBDb3B5cmlnaHQKLSAqIENvcHlyaWdodCAoQykgMjAwMy0yMDExIENvc21pbiBUcnV0YS4KLSAqIFRoaXMgc29mdHdhcmUgd2FzIGRlcml2ZWQgZnJvbSAiZ2lmdG9wbm0uYyIgYnkgRGF2aWQgS29ibGFzLAotICogYW5kIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGNvcHlyaWdodCBhbmQgd2FycmFudHkgdGVybXMuCi0gKgotICogVGhlIG9yaWdpbmFsIGNvcHlyaWdodCBub3RpY2UgaXMgcHJvdmlkZWQgYmVsb3cuCi0gKiA8cHJlPgotICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiB8IENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkzLCBEYXZpZCBLb2JsYXMuICAoa29ibGFzQG5ldGNvbS5jb20pICAgIHwKLSAqIHwgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlICAgfAotICogfCAgIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSB8Ci0gKiB8ICAgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIHwKLSAqIHwgICBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiAgfAotICogfCAgIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgVGhpcyBzb2Z0d2FyZSBpcyAgICB8Ci0gKiB8ICAgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4gICAgICAgICAgIHwKLSAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICogPC9wcmU+Ci0gKiovCi0KLSNpZm5kZWYgR0lGUkVBRF9ICi0jZGVmaW5lIEdJRlJFQURfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotI2RlZmluZSBHSUZfUExBSU5URVhUICAgMHgwMQotI2RlZmluZSBHSUZfRVhURU5TSU9OICAgMHgyMSAgLyogJyEnICovCi0jZGVmaW5lIEdJRl9JTUFHRSAgICAgICAweDJjICAvKiAnLCcgKi8KLSNkZWZpbmUgR0lGX1RFUk1JTkFUT1IgIDB4M2IgIC8qICc7JyAqLwotI2RlZmluZSBHSUZfR1JBUEhJQ0NUTCAgMHhmOQotI2RlZmluZSBHSUZfQ09NTUVOVCAgICAgMHhmZQotI2RlZmluZSBHSUZfQVBQTElDQVRJT04gMHhmZgotCi0jZGVmaW5lIEdJRl9OVU1DT0xPUlNfTUFYIDI1NgotCi0jZGVmaW5lIEdJRl9JTkRfUkVEICAgMAotI2RlZmluZSBHSUZfSU5EX0dSRUVOIDEKLSNkZWZpbmUgR0lGX0lORF9CTFVFICAyCi0KLQotLyoqCi0gKiBUaGUgR0lGIHNjcmVlbiBzdHJ1Y3R1cmUuCi0gKiovCi1zdHJ1Y3QgR0lGU2NyZWVuCi17Ci0gICAgdW5zaWduZWQgaW50ICBXaWR0aDsKLSAgICB1bnNpZ25lZCBpbnQgIEhlaWdodDsKLSAgICB1bnNpZ25lZCBpbnQgIEdsb2JhbENvbG9yRmxhZzsKLSAgICB1bnNpZ25lZCBpbnQgIENvbG9yUmVzb2x1dGlvbjsKLSAgICB1bnNpZ25lZCBpbnQgIFNvcnRGbGFnOwotICAgIHVuc2lnbmVkIGludCAgR2xvYmFsTnVtQ29sb3JzOwotICAgIHVuc2lnbmVkIGludCAgQmFja2dyb3VuZDsKLSAgICB1bnNpZ25lZCBpbnQgIFBpeGVsQXNwZWN0UmF0aW87Ci0gICAgdW5zaWduZWQgY2hhciBHbG9iYWxDb2xvclRhYmxlW0dJRl9OVU1DT0xPUlNfTUFYICogM107Ci19OwotCi0vKioKLSAqIFRoZSBHSUYgaW1hZ2Ugc3RydWN0dXJlLgotICoqLwotc3RydWN0IEdJRkltYWdlCi17Ci0gICAgc3RydWN0IEdJRlNjcmVlbiAqU2NyZWVuOwotICAgIHVuc2lnbmVkIGludCAgTGVmdFBvczsKLSAgICB1bnNpZ25lZCBpbnQgIFRvcFBvczsKLSAgICB1bnNpZ25lZCBpbnQgIFdpZHRoOwotICAgIHVuc2lnbmVkIGludCAgSGVpZ2h0OwotICAgIHVuc2lnbmVkIGludCAgTG9jYWxDb2xvckZsYWc7Ci0gICAgdW5zaWduZWQgaW50ICBJbnRlcmxhY2VGbGFnOwotICAgIHVuc2lnbmVkIGludCAgU29ydEZsYWc7Ci0gICAgdW5zaWduZWQgaW50ICBMb2NhbE51bUNvbG9yczsKLSAgICB1bnNpZ25lZCBjaGFyIExvY2FsQ29sb3JUYWJsZVtHSUZfTlVNQ09MT1JTX01BWCAqIDNdOwotICAgIHVuc2lnbmVkIGNoYXIgKipSb3dzOwotfTsKLQotLyoqCi0gKiBUaGUgR0lGIGV4dGVuc2lvbiBzdHJ1Y3R1cmUuCi0gKiovCi1zdHJ1Y3QgR0lGRXh0ZW5zaW9uCi17Ci0gICAgc3RydWN0IEdJRlNjcmVlbiAqU2NyZWVuOwotICAgIHVuc2lnbmVkIGNoYXIgKkJ1ZmZlcjsKLSAgICB1bnNpZ25lZCBpbnQgIEJ1ZmZlclNpemU7Ci0gICAgdW5zaWduZWQgY2hhciBMYWJlbDsKLX07Ci0KLS8qKgotICogVGhlIEdJRiBncmFwaGljIGNvbnRyb2wgZXh0ZW5zaW9uIHN0cnVjdHVyZS4KLSAqKi8KLXN0cnVjdCBHSUZHcmFwaGljQ3RsRXh0Ci17Ci0gICAgdW5zaWduZWQgaW50IERpc3Bvc2FsTWV0aG9kOwotICAgIHVuc2lnbmVkIGludCBJbnB1dEZsYWc7Ci0gICAgdW5zaWduZWQgaW50IFRyYW5zcGFyZW50RmxhZzsKLSAgICB1bnNpZ25lZCBpbnQgRGVsYXlUaW1lOwotICAgIHVuc2lnbmVkIGludCBUcmFuc3BhcmVudDsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyB0aGUgR0lGIHNjcmVlbiBhbmQgdGhlIGdsb2JhbCBjb2xvciB0YWJsZS4KLSAqIEBwYXJhbSBzY3JlZW4gIHRoZSBkZXN0aW5hdGlvbiBzY3JlZW4uCi0gKiBAcGFyYW0gc3RyZWFtICBhIGZpbGUgc3RyZWFtLgotICoqLwotdm9pZCBHSUZSZWFkU2NyZWVuKHN0cnVjdCBHSUZTY3JlZW4gKnNjcmVlbiwgRklMRSAqc3RyZWFtKTsKLQotLyoqCi0gKiBJbml0aWFsaXplcyBhIEdJRiBpbWFnZSBvYmplY3QuCi0gKiBAcGFyYW0gaW1hZ2UgICB0aGUgcmVzdWx0aW5nIGltYWdlLgotICogQHBhcmFtIHNjcmVlbiAgYSBzY3JlZW4uCi0gKiBAcGFyYW0gcm93cyAgICBhbiBhcnJheSBvZiByb3dzOyBjYW4gYmUgTlVMTC4KLSAqKi8KLXZvaWQgR0lGSW5pdEltYWdlKHN0cnVjdCBHSUZJbWFnZSAqaW1hZ2UsCi0gICAgICAgICAgICAgICAgICBzdHJ1Y3QgR0lGU2NyZWVuICpzY3JlZW4sIHVuc2lnbmVkIGNoYXIgKipyb3dzKTsKLQotLyoqCi0gKiBEZXN0cm95cyBhIEdJRiBpbWFnZSBvYmplY3QuCi0gKiBAcGFyYW0gaW1hZ2UgIGFuIGltYWdlLgotICoqLwotdm9pZCBHSUZEZXN0cm95SW1hZ2Uoc3RydWN0IEdJRkltYWdlICppbWFnZSk7Ci0KLS8qKgotICogUmVhZHMgdGhlIG5leHQgR0lGIGJsb2NrIGludG8gYW4gaW1hZ2Ugb3IgZXh0ZW5zaW9uIG9iamVjdC4KLSAqIEBwYXJhbSBpbWFnZSAgIHRoZSBkZXN0aW5hdGlvbiBpbWFnZTsgY2FuIGJlIE5VTEwuCi0gKiBAcGFyYW0gZXh0ICAgICB0aGUgZGVzdGluYXRpb24gZXh0ZW5zaW9uOyBjYW4gYmUgTlVMTC4KLSAqIEBwYXJhbSBzdHJlYW0gIGEgZmlsZSBzdHJlYW0uCi0gKiBAcmV0dXJuICAgICAgICB0aGUgYmxvY2sgY29kZSBvciBFT0YuCi0gKiovCi1pbnQgR0lGUmVhZE5leHRCbG9jayhzdHJ1Y3QgR0lGSW1hZ2UgKmltYWdlLCBzdHJ1Y3QgR0lGRXh0ZW5zaW9uICpleHQsCi0gICAgICAgICAgICAgICAgICAgICBGSUxFICpzdHJlYW0pOwotCi0vKioKLSAqIFJldHVybnMgdGhlIGxvY2FsIG9yIHRoZSBnbG9iYWwgY29sb3IgdGFibGUgKHdoaWNoZXZlciBpcyBhcHBsaWNhYmxlKSwKLSAqIG9yIGEgcHJlZGVmaW5lZCBjb2xvciB0YWJsZSBpZiBib3RoIG9mIHRoZXNlIHRhYmxlcyBhcmUgbWlzc2luZy4KLSAqIEBwYXJhbSBjb2xvcnMgICAgIHRoZSByZXN1bHRpbmcgY29sb3IgdGFibGUuCi0gKiBAcGFyYW0gbnVtQ29sb3JzICB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIGNvbG9yIHRhYmxlLgotICogQHBhcmFtIGltYWdlICAgICAgYW4gaW1hZ2UuCi0gKiovCi12b2lkIEdJRkdldENvbG9yVGFibGUodW5zaWduZWQgY2hhciAqKmNvbG9ycywgdW5zaWduZWQgaW50ICpudW1Db2xvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEdJRkltYWdlICppbWFnZSk7Ci0KLS8qKgotICogSW5pdGlhbGl6ZXMgYSBHSUYgZXh0ZW5zaW9uIG9iamVjdC4KLSAqIEBwYXJhbSBleHQgICAgICAgICAgICAgdGhlIHJlc3VsdGluZyBleHRlbnNpb24uCi0gKiBAcGFyYW0gc2NyZWVuICAgICAgICAgIGEgc2NyZWVuLgotICogQHBhcmFtIGluaXRCdWZmZXJTaXplICBhbiBpbml0aWFsIGJ1ZmZlciBzaXplOyBjYW4gYmUgMC4KLSAqKi8KLXZvaWQgR0lGSW5pdEV4dGVuc2lvbihzdHJ1Y3QgR0lGRXh0ZW5zaW9uICpleHQsCi0gICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEdJRlNjcmVlbiAqc2NyZWVuLCB1bnNpZ25lZCBpbnQgaW5pdEJ1ZmZlclNpemUpOwotCi0vKioKLSAqIERlc3Ryb3lzIGEgR0lGIGV4dGVuc2lvbiBvYmplY3QuCi0gKiBAcGFyYW0gZXh0ICBhbiBleHRlbnNpb24uCi0gKiovCi12b2lkIEdJRkRlc3Ryb3lFeHRlbnNpb24oc3RydWN0IEdJRkV4dGVuc2lvbiAqZXh0KTsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgR0lGIGdyYXBoaWMgY29udHJvbCBleHRlbnNpb24gb2JqZWN0Ci0gKiBmcm9tIGEgcmF3IGV4dGVuc2lvbiBvYmplY3QuCi0gKiBAcGFyYW0gZ3JhcGhpY0V4dCAgdGhlIHJlc3VsdGluZyBncmFwaGljIGNvbnRyb2wgZXh0ZW5zaW9uLgotICogQHBhcmFtIGV4dCAgICAgICAgIGEgcmF3IGV4dGVuc2lvbi4KLSAqKi8KLXZvaWQgR0lGR2V0R3JhcGhpY0N0bChzdHJ1Y3QgR0lGR3JhcGhpY0N0bEV4dCAqZ3JhcGhpY0V4dCwKLSAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgR0lGRXh0ZW5zaW9uICpleHQpOwotCi0KLS8qKgotICogVGhlIGVycm9yIGhhbmRsaW5nIGNhbGxiYWNrLgotICogQHBhcmFtIG1lc3NhZ2UgIGFuIGVycm9yIG1lc3NhZ2UuCi0gKiovCi1leHRlcm4gdm9pZCAoKkdJRkVycm9yKShjb25zdCBjaGFyICptZXNzYWdlKTsKLQotLyoqCi0gKiBUaGUgd2FybmluZyBoYW5kbGluZyBjYWxsYmFjay4KLSAqIEBwYXJhbSBtZXNzYWdlICBhIHdhcm5pbmcgbWVzc2FnZS4KLSAqKi8KLWV4dGVybiB2b2lkICgqR0lGV2FybmluZykoY29uc3QgY2hhciAqbWVzc2FnZSk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvKiBleHRlcm4gIkMiICovCi0jZW5kaWYKLQotCi0jZW5kaWYgIC8qIEdJRlJFQURfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2dpZnJlYWQvaW1nL2NvbXBhc3MuZ2lmIGIvc3JjL2dpZnJlYWQvaW1nL2NvbXBhc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjZmZDE5Li4wMDAwMDAwCi0tLSBhL3NyYy9naWZyZWFkL2ltZy9jb21wYXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9naWZyZWFkL2ltZy9pbmRleC50eHQgYi9zcmMvZ2lmcmVhZC9pbWcvaW5kZXgudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjRjZWM4Li4wMDAwMDAwCi0tLSBhL3NyYy9naWZyZWFkL2ltZy9pbmRleC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1jb21wYXNzLmdpZjogVGhlIGZhbW91cyBhYm91dDpqd3ogY29tcGFzcy4KZGlmZiAtLWdpdCBhL3NyYy9naWZyZWFkL3Rlc3QvZ2lmZHVtcC5jIGIvc3JjL2dpZnJlYWQvdGVzdC9naWZkdW1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOWZkMTEuLjAwMDAwMDAKLS0tIGEvc3JjL2dpZnJlYWQvdGVzdC9naWZkdW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIGdpZmR1bXAuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMy0yMDExIENvc21pbiBUcnV0YS4KLSAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zaW5nIGFuZCB3YXJyYW50eSB0ZXJtcwotICogYXMgZ2lmcmVhZC5jLgotICovCi0KLSNpbmNsdWRlICJnaWZyZWFkLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotCi0vKgotICogRHVtcHMgdGhlIHN0cnVjdHVyZSBvZiBhIEdJRiBpbWFnZSBmaWxlLgotICovCi1pbnQgR0lGRHVtcChjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICBpbnQgcmVzdWx0OwotICAgIEZJTEUgKnN0cmVhbTsKLSAgICBzdHJ1Y3QgR0lGU2NyZWVuIHNjcmVlbjsKLSAgICBzdHJ1Y3QgR0lGSW1hZ2UgaW1hZ2U7Ci0gICAgc3RydWN0IEdJRkV4dGVuc2lvbiBleHQ7Ci0gICAgc3RydWN0IEdJRkdyYXBoaWNDdGxFeHQgZ3JhcGhpY0V4dDsKLSAgICBpbnQgbG9vcDsKLQotICAgIHN0cmVhbSA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKTsKLSAgICBpZiAoc3RyZWFtID09IE5VTEwpCi0gICAgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBDYW4ndCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICByZXN1bHQgPSAwOwotICAgIHByaW50ZigiRmlsZTogJXNcbiIsIGZpbGVuYW1lKTsKLQotICAgIEdJRlJlYWRTY3JlZW4oJnNjcmVlbiwgc3RyZWFtKTsKLSAgICBwcmludGYoIlNjcmVlbjogJXUgeCAldVxuIiwgc2NyZWVuLldpZHRoLCBzY3JlZW4uSGVpZ2h0KTsKLSAgICBpZiAoc2NyZWVuLkdsb2JhbENvbG9yRmxhZykKLSAgICAgICAgcHJpbnRmKCIgIEdsb2JhbCBjb2xvcnM6ICV1XG4iLCBzY3JlZW4uR2xvYmFsTnVtQ29sb3JzKTsKLSAgICBpZiAoc2NyZWVuLlBpeGVsQXNwZWN0UmF0aW8gIT0gMCkKLSAgICAgICAgcHJpbnRmKCIgIFBpeGVsIGFzcGVjdCByYXRpbyA9ICV1XG4iLCBzY3JlZW4uUGl4ZWxBc3BlY3RSYXRpbyk7Ci0KLSAgICBHSUZJbml0SW1hZ2UoJmltYWdlLCAmc2NyZWVuLCBOVUxMKTsKLSAgICBHSUZJbml0RXh0ZW5zaW9uKCZleHQsICZzY3JlZW4sIDI1Nik7Ci0KLSAgICBsb29wID0gMTsKLSAgICB3aGlsZSAobG9vcCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoR0lGUmVhZE5leHRCbG9jaygmaW1hZ2UsICZleHQsIHN0cmVhbSkpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBHSUZfVEVSTUlOQVRPUjogIC8qICc7JyAqLwotICAgICAgICAgICAgbG9vcCA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHSUZfSU1BR0U6ICAgICAgIC8qICcsJyAqLwotICAgICAgICAgICAgKytyZXN1bHQ7Ci0gICAgICAgICAgICBwcmludGYoIkltYWdlOiAldSB4ICV1IEAgKCV1LCAldSlcbiIsCi0gICAgICAgICAgICAgICAgICAgaW1hZ2UuV2lkdGgsIGltYWdlLkhlaWdodCwgaW1hZ2UuTGVmdFBvcywgaW1hZ2UuVG9wUG9zKTsKLSAgICAgICAgICAgIGlmIChpbWFnZS5Mb2NhbENvbG9yRmxhZykKLSAgICAgICAgICAgICAgICBwcmludGYoIiAgTG9jYWwgY29sb3JzOiAldVxuIiwgaW1hZ2UuTG9jYWxOdW1Db2xvcnMpOwotICAgICAgICAgICAgcHJpbnRmKCIgIEludGVybGFjZWQ6ICVzXG4iLCBpbWFnZS5JbnRlcmxhY2VGbGFnID8gIllFUyIgOiAiTk8iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdJRl9FWFRFTlNJT046ICAgLyogJyEnICovCi0gICAgICAgICAgICBpZiAoZXh0LkxhYmVsID09IEdJRl9HUkFQSElDQ1RMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEdJRkdldEdyYXBoaWNDdGwoJmdyYXBoaWNFeHQsICZleHQpOwotICAgICAgICAgICAgICAgIHByaW50ZigiR3JhcGhpYyBDb250cm9sIEV4dGVuc2lvbjogMHglMDJYXG4iLCBleHQuTGFiZWwpOwotICAgICAgICAgICAgICAgIHByaW50ZigiICBEaXNwb3NhbCBtZXRob2Q6ICV1XG4iLCBncmFwaGljRXh0LkRpc3Bvc2FsTWV0aG9kKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiAgVXNlciBpbnB1dCBmbGFnOiAldVxuIiwgZ3JhcGhpY0V4dC5JbnB1dEZsYWcpOwotICAgICAgICAgICAgICAgIHByaW50ZigiICBEZWxheSB0aW1lICAgICA6ICV1XG4iLCBncmFwaGljRXh0LkRlbGF5VGltZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGdyYXBoaWNFeHQuVHJhbnNwYXJlbnRGbGFnKQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgVHJhbnNwYXJlbnQgICAgOiAldVxuIiwgZ3JhcGhpY0V4dC5UcmFuc3BhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJFeHRlbnNpb246IDB4JTAyWFxuIiwgZXh0LkxhYmVsKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmVzdWx0ID0gLTE7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBVbmV4cGVjdGVkIGRhdGEgaW4gJXNcbiIsIGZpbGVuYW1lKTsKLSAgICAgICAgICAgIGxvb3AgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZmNsb3NlKHN0cmVhbSk7Ci0KLSAgICBpZiAocmVzdWx0ID09IDApCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IE5vIGltYWdlIGluICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLSAqIG1haW4KLSAqLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBpbnQgcmVzdWx0OwotICAgIGludCBpOwotCi0gICAgaWYgKGFyZ2MgPD0gMSkKLSAgICB7Ci0gICAgICAgIHByaW50ZigiVXNhZ2U6IGdpZmR1bXAgPGZpbGVzLmdpZi4uLj5cbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXN1bHQgPSAwOwotICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyArK2kpCi0gICAgewotICAgICAgICBpZiAoR0lGRHVtcChhcmd2W2ldKSA8PSAwKQotICAgICAgICAgICAgcmVzdWx0ID0gMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9BTk5PVU5DRSBiL3NyYy9saWJwbmcvQU5OT1VOQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNjY3ZDkuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9BTk5PVU5DRQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLQotTGlicG5nIDEuNC4xMiAtIEp1bHkgMTAsIDIwMTIKLQotVGhpcyBpcyBhIHB1YmxpYyByZWxlYXNlIG9mIGxpYnBuZywgaW50ZW5kZWQgZm9yIHVzZSBpbiBwcm9kdWN0aW9uIGNvZGVzLgotCi1GaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkOgotCi1Tb3VyY2UgZmlsZXMgd2l0aCBMRiBsaW5lIGVuZGluZ3MgKGZvciBVbml4L0xpbnV4KSBhbmQgd2l0aCBhCi0iY29uZmlndXJlIiBzY3JpcHQKLQotICAgbGlicG5nLTEuNC4xMi50YXIueHogKExaTUEtY29tcHJlc3NlZCwgcmVjb21tZW5kZWQpCi0gICBsaWJwbmctMS40LjEyLnRhci5negotICAgbGlicG5nLTEuNC4xMi50YXIuYnoyCi0KLVNvdXJjZSBmaWxlcyB3aXRoIENSTEYgbGluZSBlbmRpbmdzIChmb3IgV2luZG93cyksIHdpdGhvdXQgdGhlCi0iY29uZmlndXJlIiBzY3JpcHQKLQotICAgbHBuZzE0MTIuN3ogKExaTUEtY29tcHJlc3NlZCwgcmVjb21tZW5kZWQpCi0gICBscG5nMTQxMi56aXAKLQotT3RoZXIgaW5mb3JtYXRpb246Ci0KLSAgIGxpYnBuZy0xLjQuMTItUkVBRE1FLnR4dAotICAgbGlicG5nLTEuNC4xMi1MSUNFTlNFLnR4dAotCi1DaGFuZ2VzIHNpbmNlIHRoZSBsYXN0IHB1YmxpYyByZWxlYXNlICgxLjQuMTEpOgotICBBZGRlZCB0d28gaW1hZ2VzIHRvIGNvbnRyaWIvcG5nc3VpdGUgKDEtYml0IGFuZCAyLWJpdCB0cmFuc3BhcmVudCBncmF5c2NhbGUpLAotICAgIGFuZCByZW5hbWVkIHRocmVlIHdob3NlIG5hbWVzIHdlcmUgaW5jb25zaXN0ZW50IHdpdGggdGhvc2UgaW4KLSAgICBwbmdzdWl0ZS9SRUFETUUudHh0LgotICBDaGFuZ2VkICJhK3ciIHRvICJ1K3ciIGluIE1ha2VmaWxlLmluIHRvIGZpeCBDVkUtMjAxMi0zMzg2LgotCi1TZW5kIGNvbW1lbnRzL2NvcnJlY3Rpb25zL2NvbW1lbmRhdGlvbnMgdG8gZ2xlbm5ycCBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKLW9yIHRvIHBuZy1tbmctaW1wbGVtZW50IGF0IGxpc3RzLnNmLm5ldCAoc3Vic2NyaXB0aW9uIHJlcXVpcmVkOyB2aXNpdAotaHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vcG5nLW1uZy1pbXBsZW1lbnQpLgotCi1HbGVubiBSLVAKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvQ0hBTkdFUyBiL3NyYy9saWJwbmcvQ0hBTkdFUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4NGEwOC4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL0NIQU5HRVMKKysrIC9kZXYvbnVsbApAQCAtMSwyODgyICswLDAgQEAKLSNpZiAwCi1DSEFOR0VTIC0gY2hhbmdlcyBmb3IgbGlicG5nCi0KLXZlcnNpb24gMC4yCi0gIGFkZGVkIHJlYWRlciBpbnRvIHBuZy5oCi0gIGZpeGVkIHNtYWxsIHByb2JsZW1zIGluIHN0dWIgZmlsZQotCi12ZXJzaW9uIDAuMwotICBhZGRlZCBwdWxsIHJlYWRlcgotICBzcGxpdCB1cCBwbmd3cml0ZS5jIHRvIHNldmVyYWwgZmlsZXMKLSAgYWRkZWQgcG5nbGliLnR4dAotICBhZGRlZCBleGFtcGxlLmMKLSAgY2xlYW5lZCB1cCB3cml0ZXIsIGFkZGluZyBhIGZldyBuZXcgdHJhbnNmb3JtYXRpb25zCi0gIGZpeGVkIHNvbWUgYnVncyBpbiB3cml0ZXIKLSAgaW50ZXJmYWNlZCB3aXRoIHpsaWIgMC41Ci0gIGFkZGVkIEsmUiBzdXBwb3J0Ci0gIGFkZGVkIGNoZWNrIGZvciA2NCBLQiBibG9ja3MgZm9yIDE2IGJpdCBtYWNoaW5lcwotCi12ZXJzaW9uIDAuNAotICBjbGVhbmVkIHVwIGNvZGUgYW5kIGNvbW1lbnRlZCBjb2RlCi0gIHNpbXBsaWZpZWQgdGltZSBoYW5kbGluZyBpbnRvIHBuZ190aW1lCi0gIGNyZWF0ZWQgcG5nX2NvbG9yXzE2IGFuZCBwbmdfY29sb3JfOCB0byBoYW5kbGUgY29sb3IgbmVlZHMKLSAgY2xlYW5lZCB1cCBjb2xvciB0eXBlIGRlZmluZXMKLSAgZml4ZWQgdmFyaW91cyBidWdzCi0gIG1hZGUgdmFyaW91cyBuYW1lcyBtb3JlIGNvbnNpc3RlbnQKLSAgaW50ZXJmYWNlZCB3aXRoIHpsaWIgMC43MQotICBjbGVhbmVkIHVwIHpUWHQgcmVhZGVyIGFuZCB3cml0ZXIgKHVzaW5nIHpsaWIncyBSZXNldCBmdW5jdGlvbnMpCi0gIHNwbGl0IHRyYW5zZm9ybWF0aW9ucyBpbnRvIHBuZ3J0cmFuLmMgYW5kIHBuZ3d0cmFuLmMKLQotdmVyc2lvbiAwLjUKLSAgaW50ZXJmYWNlZCB3aXRoIHpsaWIgMC44Ci0gIGZpeGVkIG1hbnkgcmVhZGluZyBhbmQgd3JpdGluZyBidWdzCi0gIHNhdmVkIHVzaW5nIDMgc3BhY2VzIGluc3RlYWQgb2YgdGFicwotCi12ZXJzaW9uIDAuNgotICBhZGRlZCBwbmdfbGFyZ2VfbWFsbG9jKCkgYW5kIHBuZ19sYXJnZV9mcmVlKCkKLSAgYWRkZWQgcG5nX3NpemVfdAotICBjbGVhbmVkIHVwIHNvbWUgY29tcGlsZXIgd2FybmluZ3MKLSAgYWRkZWQgcG5nX3N0YXJ0X3JlYWRfaW1hZ2UoKQotCi12ZXJzaW9uIDAuNwotICBjbGVhbmVkIHVwIGxvdHMgb2YgYnVncwotICBmaW5pc2hlZCBkaXRoZXJpbmcgYW5kIG90aGVyIHN0dWZmCi0gIGFkZGVkIHRlc3QgcHJvZ3JhbQotICBjaGFuZ2VkIG5hbWUgZnJvbSBwbmdsaWIgdG8gbGlicG5nCi0KLXZlcnNpb24gMC43MSBbSnVuZSwgMTk5NV0KLSAgY2hhbmdlZCBwbmd0ZXN0LnBuZyBmb3IgemxpYiAwLjkzCi0gIGZpeGVkIGVycm9yIGluIGxpYnBuZy50eHQgYW5kIGV4YW1wbGUuYwotCi12ZXJzaW9uIDAuOAotICBjbGVhbmVkIHVwIHNvbWUgYnVncwotICBhZGRlZCBwbmdfc2V0X2ZpbGxlcigpCi0gIHNwbGl0IHVwIHBuZ3N0dWIuYyBpbnRvIHBuZ21lbS5jLCBwbmdpby5jLCBhbmQgcG5nZXJyb3IuYwotICBhZGRlZCAjZGVmaW5lJ3MgdG8gcmVtb3ZlIHVud2FudGVkIGNvZGUKLSAgbW92ZWQgcG5nX2luZm9faW5pdCgpIHRvIHBuZy5jCi0gIGFkZGVkIG9sZF9zaXplIGludG8gcG5nX3JlYWxsb2MoKQotICBhZGRlZCBmdW5jdGlvbnMgdG8gbWFudWFsbHkgc2V0IGZpbHRlcmluZyBhbmQgY29tcHJlc3Npb24gaW5mbwotICBjaGFuZ2VkIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYmFzZWQgb24gaW1hZ2UgdHlwZQotICBvcHRpbWl6ZWQgZmlsdGVyIHNlbGVjdGlvbiBjb2RlCi0gIGFkZGVkIHZlcnNpb24gaW5mbwotICBjaGFuZ2VkIGV4dGVybmFsIGZ1bmN0aW9ucyBwYXNzaW5nIGZsb2F0cyB0byBkb3VibGVzIChrJnIgcHJvYmxlbXM/KQotICBwdXQgYWxsIHRoZSBjb25maWd1cmFibGUgc3R1ZmYgaW4gcG5nY29uZi5oCi0gIGVuYWJsZWQgcG5nX3NldF9zaGlmdCB0byB3b3JrIHdpdGggcGFsZXR0ZWQgaW1hZ2VzIG9uIHJlYWQKLSAgYWRkZWQgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSAtIHVwZGF0ZXMgaW5mbyBzdHJ1Y3R1cmUgd2l0aAotICAgICB0cmFuc2Zvcm1hdGlvbnMKLQotdmVyc2lvbiAwLjgxIFtBdWd1c3QsIDE5OTVdCi0gIGluY29ycG9yYXRlZCBUaW0gV2VnbmVyJ3MgbWVkaXVtIG1vZGVsIGNvZGUgKHRoYW5rcywgVGltKQotCi12ZXJzaW9uIDAuODIgW1NlcHRlbWJlciwgMTk5NV0KLSAgW3Vuc3BlY2lmaWVkIGNoYW5nZXNdCi0KLXZlcnNpb24gMC44NSBbRGVjZW1iZXIsIDE5OTVdCi0gIGFkZGVkIG1vcmUgbWVkaXVtIG1vZGVsIGNvZGUgKGFsbW9zdCBldmVyeXRoaW5nJ3MgYSBmYXIpCi0gIGFkZGVkIGkvbywgZXJyb3IsIGFuZCBtZW1vcnkgY2FsbGJhY2sgZnVuY3Rpb25zCi0gIGZpeGVkIHNvbWUgYnVncyAoMTYgYml0LCA0IGJpdCBpbnRlcmxhY2VkLCBldGMuKQotICBhZGRlZCBmaXJzdCBydW4gcHJvZ3Jlc3NpdmUgcmVhZGVyIChiYXJlbHkgdGVzdGVkKQotCi12ZXJzaW9uIDAuODYgW0phbnVhcnksIDE5OTZdCi0gIGZpeGVkIGJ1Z3MKLSAgaW1wcm92ZWQgZG9jdW1lbnRhdGlvbgotCi12ZXJzaW9uIDAuODcgW0phbnVhcnksIDE5OTZdCi0gIGZpeGVkIG1lZGl1bSBtb2RlbCBidWdzCi0gIGZpeGVkIG90aGVyIGJ1Z3MgaW50cm9kdWNlZCBpbiAwLjg1IGFuZCAwLjg2Ci0gIGFkZGVkIHNvbWUgbWlub3IgZG9jdW1lbnRhdGlvbgotCi12ZXJzaW9uIDAuODggW0phbnVhcnksIDE5OTZdCi0gIGZpeGVkIHByb2dyZXNzaXZlIGJ1Z3MKLSAgcmVwbGFjZWQgdGFicyB3aXRoIHNwYWNlcwotICBjbGVhbmVkIHVwIGRvY3VtZW50YXRpb24KLSAgYWRkZWQgY2FsbGJhY2tzIGZvciByZWFkL3dyaXRlIGFuZCB3YXJuaW5nL2Vycm9yIGZ1bmN0aW9ucwotCi12ZXJzaW9uIDAuODkgW0p1bHksIDE5OTZdCi0gIGFkZGVkIG5ldyBpbml0aWFsaXphdGlvbiBBUEkgdG8gbWFrZSBsaWJwbmcgd29yayBiZXR0ZXIgd2l0aCBzaGFyZWQgbGlicwotICAgICB3ZSBub3cgaGF2ZSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCksIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KCksCi0gICAgIHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QoKSwgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoKSwgYW5kCi0gICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgpIGluc3RlYWQgb2YgdGhlIHNlcGFyYXRlIGNhbGxzIHRvCi0gICAgIG1hbGxvYyBhbmQgcG5nX3JlYWRfaW5pdCgpLCBwbmdfaW5mb19pbml0KCksIGFuZCBwbmdfd3JpdGVfaW5pdCgpCi0gIGNoYW5nZWQgd2FybmluZy9lcnJvciBjYWxsYmFjayBmdW5jdGlvbnMgdG8gZml4IGJ1ZyAtIHRoaXMgbWVhbnMgeW91Ci0gICAgIHNob3VsZCB1c2UgdGhlIG5ldyBpbml0aWFsaXphdGlvbiBBUEkgaWYgeW91IHdlcmUgdXNpbmcgdGhlIG9sZAotICAgICBwbmdfc2V0X21lc3NhZ2VfZm4oKSBjYWxscywgYW5kIHRoYXQgdGhlIG9sZCBBUEkgbm8gbG9uZ2VyIGV4aXN0cwotICAgICBzbyB0aGF0IHBlb3BsZSBhcmUgYXdhcmUgdGhhdCB0aGV5IG5lZWQgdG8gY2hhbmdlIHRoZWlyIGNvZGUKLSAgY2hhbmdlZCBmaWx0ZXIgc2VsZWN0aW9uIEFQSSB0byBhbGxvdyBzZWxlY3Rpb24gb2YgbXVsdGlwbGUgZmlsdGVycwotICAgICBzaW5jZSBpdCBkaWRuJ3Qgd29yayBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBsaWJwbmcgYW55d2F5cwotICBvcHRpbWl6ZWQgZmlsdGVyIHNlbGVjdGlvbiBjb2RlCi0gIGZpeGVkIHBuZ19zZXRfYmFja2dyb3VuZCgpIHRvIGFsbG93IHVzaW5nIGFuIGFyYml0cmFyeSBSR0IgY29sb3IgZm9yCi0gICAgIHBhbGV0dGVkIGltYWdlcwotICBmaXhlZCBnYW1tYSBhbmQgYmFja2dyb3VuZCBjb3JyZWN0aW9uIGZvciBwYWxldHRlZCBpbWFnZXMsIHNvCi0gICAgIHBuZ19jb3JyZWN0X3BhbGV0dGUgaXMgbm90IG5lZWRlZCB1bmxlc3MgeW91IGFyZSBjb3JyZWN0aW5nIGFuCi0gICAgIGV4dGVybmFsIHBhbGV0dGUgKHlvdSB3aWxsIG5lZWQgdG8gI2RlZmluZSBQTkdfQ09SUkVDVF9QQUxFVFRFX1NVUFBPUlRFRAotICAgICBpbiBwbmdjb25mLmgpIC0gaWYgbm9ib2R5IHVzZXMgdGhpcywgaXQgbWF5IGRpc2FwcGVhciBpbiB0aGUgZnV0dXJlLgotICBmaXhlZCBidWcgd2l0aCBCb3JsYW5kIDY0SyBtZW1vcnkgYWxsb2NhdGlvbiAoQWxleGFuZGVyIExlaG1hbm4pCi0gIGZpeGVkIGJ1ZyBpbiBpbnRlcmxhY2UgaGFuZGxpbmcgKFNtYXJhc2RlcmFnZCwgSSB0aGluaykKLSAgYWRkZWQgbW9yZSBlcnJvciBjaGVja2luZyBmb3Igd3JpdGluZyBhbmQgaW1hZ2UgdG8gcmVkdWNlIGludmFsaWQgZmlsZXMKLSAgc2VwYXJhdGVkIHJlYWQgYW5kIHdyaXRlIGZ1bmN0aW9ucyBzbyB0aGF0IHRoZXkgd29uJ3QgYm90aCBiZSBsaW5rZWQKLSAgICAgaW50byBhIGJpbmFyeSB3aGVuIG9ubHkgcmVhZGluZyBvciB3cml0aW5nIGZ1bmN0aW9uYWxpdHkgaXMgdXNlZAotICBuZXcgcG5ndGVzdCBpbWFnZSBhbHNvIGhhcyBpbnRlcmxhY2luZyBhbmQgelRYdAotICB1cGRhdGVkIGRvY3VtZW50YXRpb24gdG8gcmVmbGVjdCBuZXcgQVBJCi0KLXZlcnNpb24gMC45MCBbSmFudWFyeSwgMTk5N10KLSAgbWFkZSBDUkMgZXJyb3JzL3dhcm5pbmdzIG9uIGNyaXRpY2FsIGFuZCBhbmNpbGxhcnkgY2h1bmtzIGNvbmZpZ3VyYWJsZQotICBsaWJwbmcgd2lsbCB1c2UgdGhlIHpsaWIgQ1JDIHJvdXRpbmVzIGJ5IChjb21waWxlLXRpbWUpIGRlZmF1bHQKLSAgY2hhbmdlZCBET1Mgc21hbGwvbWVkaXVtIG1vZGVsIG1lbW9yeSBzdXBwb3J0IC0gbmVlZHMgemxpYiAxLjA0IChUaW0gV2VnbmVyKQotICBhZGRlZCBleHRlcm5hbCBDKysgd3JhcHBlciBzdGF0ZW1lbnRzIHRvIHBuZy5oIChHaWxsZXMgRGF1cGhpbikKLSAgYWxsb3cgUE5HIGZpbGUgdG8gYmUgcmVhZCB3aGVuIHNvbWUgb3IgYWxsIG9mIGZpbGUgc2lnbmF0dXJlIGhhcyBhbHJlYWR5Ci0gICAgIGJlZW4gcmVhZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbS4gICoqKipUaGlzIGFmZmVjdHMgdGhlIHNpemUKLSAgICAgb2YgaW5mb19zdHJ1Y3QgYW5kIGludmFsaWRhdGVzIGFsbCBwcm9ncmFtcyB0aGF0IHVzZSBhIHNoYXJlZCBsaWJwbmcqKioqCi0gIGZpeGVkIHBuZ19maWxsZXIoKSBkZWNsYXJhdGlvbnMKLSAgZml4ZWQ/IGJhY2tncm91bmQgY29sb3IgY29udmVyc2lvbnMKLSAgZml4ZWQgb3JkZXIgb2YgZXJyb3IgZnVuY3Rpb24gcG9pbnRlcnMgdG8gbWF0Y2ggZG9jdW1lbnRhdGlvbgotICBjdXJyZW50IGNodW5rIG5hbWUgaXMgbm93IGF2YWlsYWJsZSBpbiBwbmdfc3RydWN0IHRvIHJlZHVjZSB0aGUgbnVtYmVyCi0gICAgIG9mIG5lYXJseSBpZGVudGljYWwgZXJyb3IgbWVzc2FnZXMgKHdpbGwgc2ltcGxpZnkgbXVsdGktbGluZ3VhbAotICAgICBzdXBwb3J0IHdoZW4gYXZhaWxhYmxlKQotICB0cnkgdG8gZ2V0IHJlYWR5IGZvciB1bmtub3duLWNodW5rIGNhbGxiYWNrIGZ1bmN0aW9uczoKLSAgICAgLSBwcmV2aW91c2x5IHJlYWQgY3JpdGljYWwgY2h1bmtzIGFyZSBmbGFnZ2VkLCBzbyB0aGUgY2h1bmsgaGFuZGxpbmcKLSAgICAgICByb3V0aW5lcyBjYW4gZGV0ZXJtaW5lIGlmIHRoZSBjaHVuayBpcyBpbiB0aGUgcmlnaHQgcGxhY2UKLSAgICAgLSBhbGwgY2h1bmsgaGFuZGxpbmcgcm91dGluZXMgaGF2ZSB0aGUgc2FtZSBwcm90b3R5cGVzLCBzbyB3ZSB3aWxsCi0gICAgICAgYmUgYWJsZSB0byBoYW5kbGUgYWxsIGNodW5rcyB2aWEgYSBjYWxsYmFjayBtZWNoYW5pc20KLSAgdHJ5IHRvIGZpeCBMaW51eCAic2V0am1wIiBidWZmZXIgc2l6ZSBwcm9ibGVtcwotICByZW1vdmVkIHBuZ19sYXJnZV9tYWxsb2MsIHBuZ19sYXJnZV9mcmVlLCBhbmQgcG5nX3JlYWxsb2MgZnVuY3Rpb25zLgotCi12ZXJzaW9uIDAuOTUgW01hcmNoLCAxOTk3XQotICBmaXhlZCBidWcgaW4gcG5nd3V0aWwuYyBhbGxvY2F0aW5nICJ1cF9yb3ciIHR3aWNlIGFuZCAiYXZnX3JvdyIgbmV2ZXIKLSAgZml4ZWQgYnVnIGluIFBORyBmaWxlIHNpZ25hdHVyZSBjb21wYXJlcyB3aGVuIHN0YXJ0ICE9IDAKLSAgY2hhbmdlZCBwYXJhbWV0ZXIgdHlwZSBvZiBwbmdfc2V0X2ZpbGxlciguLi5maWxsZXIuLi4pIGZyb20gcG5nX2J5dGUKLSAgICAgdG8gcG5nX3VpbnRfMzIKLSAgYWRkZWQgdGVzdCBmb3IgTUFDT1MgdG8gZW5zdXJlIHRoYXQgYm90aCBtYXRoLmggYW5kIGZwLmggYXJlIG5vdCAjaW5jbHVkZWQKLSAgYWRkZWQgbWFjcm9zIGZvciBsaWJwbmcgdG8gYmUgY29tcGlsZWQgYXMgYSBXaW5kb3dzIERMTCAoQW5kcmVhcyBLdXByaWVzKQotICBhZGRlZCAicGFja3N3YXAiIHRyYW5zZm9ybWF0aW9uLCB3aGljaCBjaGFuZ2VzIHRoZSBlbmRpYW5uZXNzIG9mCi0gICAgIHBhY2tlZC1waXhlbCBieXRlcyAoS2V2aW4gQnJhY2V5KQotICBhZGRlZCAic3RyaXBfYWxwaGEiIHRyYW5zZm9ybWF0aW9uLCB3aGljaCByZW1vdmVzIHRoZSBhbHBoYSBjaGFubmVsIG9mCi0gICAgIGlucHV0IGltYWdlcyB3aXRob3V0IHVzaW5nIGl0IChub3QgbmVjZXNzYXJpbHkgYSBnb29kIGlkZWEpCi0gIGFkZGVkICJzd2FwX2FscGhhIiB0cmFuc2Zvcm1hdGlvbiwgd2hpY2ggcHV0cyB0aGUgYWxwaGEgY2hhbm5lbCBpbiBmcm9udAotICAgICBvZiB0aGUgY29sb3IgYnl0ZXMgaW5zdGVhZCBvZiBhZnRlcgotICByZW1vdmVkIGFsbCBpbXBsaWNpdCB2YXJpYWJsZSB0ZXN0cyB3aGljaCBhc3N1bWUgTlVMTCA9PSAwIChJIHRoaW5rKQotICBjaGFuZ2VkIHNldmVyYWwgdmFyaWFibGVzIHRvICJwbmdfc2l6ZV90IiB0byBzaG93IDE2LzMyLWJpdCBsaW1pdGF0aW9ucwotICBhZGRlZCBuZXcgcENBTCBjaHVuayByZWFkL3dyaXRlIHN1cHBvcnQKLSAgYWRkZWQgZXhwZXJpbWVudGFsIGZpbHRlciBzZWxlY3Rpb24gd2VpZ2h0aW5nIChHcmVnIFJvZWxvZnMpCi0gIHJlbW92ZWQgb2xkIHBuZ19zZXRfcmdieCgpIGFuZCBwbmdfc2V0X3hyZ2IoKSBmdW5jdGlvbnMgdGhhdCBoYXZlIGJlZW4KLSAgICAgb2Jzb2xldGUgZm9yIGFib3V0IDIgeWVhcnMgbm93ICh1c2UgcG5nX3NldF9maWxsZXIoKSBpbnN0ZWFkKQotICBhZGRlZCBtYWNyb3MgdG8gcmVhZCAxNi0gYW5kIDMyLWJpdCBpbnRzIGRpcmVjdGx5IGZyb20gYnVmZmVyLCB0byBiZQotICAgICB1c2VkIG9ubHkgb24gdGhvc2Ugc3lzdGVtcyB0aGF0IHN1cHBvcnQgaXQgKG5hbWVseSBQb3dlclBDIGFuZCA2ODB4MCkKLSAgICAgV2l0aCBzb21lIHRlc3RpbmcsIHRoaXMgbWF5IGJlY29tZSB0aGUgZGVmYXVsdCBmb3IgTUFDT1MvUFBDIHN5c3RlbXMuCi0gIG9ubHkgY2FsY3VsYXRlIENSQyBvbiBkYXRhIGlmIHdlIGFyZSBnb2luZyB0byB1c2UgaXQKLSAgYWRkZWQgbWFjcm9zIGZvciB6VFh0IGNvbXByZXNzaW9uIHR5cGUgUE5HX3pUWHRfQ09NUFJFU1NJT05fPz8/Ci0gIGFkZGVkIG1hY3JvcyBmb3Igc2ltcGxlIGxpYnBuZyBkZWJ1Z2dpbmcgb3V0cHV0IHNlbGVjdGFibGUgYXQgY29tcGlsZSB0aW1lCi0gIHJlbW92ZWQgUE5HX1JFQURfRU5EX01PREUgaW4gcHJvZ3Jlc3NpdmUgcmVhZGVyIChTbWFyYXNkZXJhZ2QpCi0gIG1vcmUgZGVzY3JpcHRpb24gb2YgaW5mb19zdHJ1Y3QgaW4gbGlicG5nLnR4dCBhbmQgcG5nLmgKLSAgbW9yZSBpbnN0cnVjdGlvbnMgaW4gZXhhbXBsZS5jCi0gIG1vcmUgY2h1bmsgdHlwZXMgdGVzdGVkIGluIHBuZ3Rlc3QuYwotICByZW5hbWVkIHBuZ3JjYi5jIHRvIHBuZ3NldC5jLCBhbmQgYWxsIHBuZ19yZWFkXzxjaHVuaz4gZnVuY3Rpb25zIHRvIGJlCi0gICAgIHBuZ19zZXRfPGNodW5rPi4gIFdlIG5vdyBoYXZlIGNvcnJlc3BvbmRpbmcgcG5nX2dldF88Y2h1bms+Ci0gICAgIGZ1bmN0aW9ucyBpbiBwbmdnZXQuYyB0byBnZXQgaW5mb3JtYXRpb24gaW4gaW5mb19wdHIuICBUaGlzIGlzb2xhdGVzCi0gICAgIHRoZSBhcHBsaWNhdGlvbiBmcm9tIHRoZSBpbnRlcm5hbCBvcmdhbml6YXRpb24gb2YgcG5nX2luZm9fc3RydWN0Ci0gICAgIChnb29kIGZvciBzaGFyZWQgbGlicmFyeSBpbXBsZW1lbnRhdGlvbnMpLgotCi12ZXJzaW9uIDAuOTYgW01heSwgMTk5N10KLSAgZml4ZWQgc2VyaW91cyBidWcgd2l0aCA8IDhicHAgaW1hZ2VzIGludHJvZHVjZWQgaW4gMC45NQotICBmaXhlZCAyNTYtY29sb3IgdHJhbnNwYXJlbmN5IGJ1ZyAoR3JlZyBSb2Vsb2ZzKQotICBmaXhlZCB1cCBkb2N1bWVudGF0aW9uIChHcmVnIFJvZWxvZnMsIExhc3psbyBOeXVsKQotICBmaXhlZCAiZXJyb3IiIGluIHBuZ2NvbmYuaCBmb3IgTGludXggc2V0am1wKCkgYmVoYXZpb3VyCi0gIGZpeGVkIERPUyBtZWRpdW0gbW9kZWwgc3VwcG9ydCAoVGltIFdlZ25lcikKLSAgZml4ZWQgcG5nX2NoZWNrX2tleXdvcmQoKSBmb3IgY2FzZSB3aXRoIGVycm9yIGluIHN0YXRpYyBzdHJpbmcgdGV4dAotICBhZGRlZCByZWFkIG9mIENSQyBhZnRlciBJRU5EIGNodW5rIGZvciBlbWJlZGRlZCBQTkdzIChMYXN6bG8gTnl1bCkKLSAgYWRkZWQgdHlwZWNhc3RzIHRvIHF1aWV0IGNvbXBpbGVyIGVycm9ycwotICBhZGRlZCBtb3JlIGRlYnVnZ2luZyBpbmZvCi0KLXZlcnNpb24gMC45NyBbSmFudWFyeSwgMTk5OF0KLSAgcmVtb3ZlZCBQTkdfVVNFX09XTl9DUkMgY2FwYWJpbGl0eQotICByZWxvY2F0ZWQgcG5nX3NldF9jcmNfYWN0aW9uIGZyb20gcG5ncnV0aWwuYyB0byBwbmdydHJhbi5jCi0gIGZpeGVkIHR5cGVjYXN0cyBvZiAibmV3X2tleSIsIGV0Yy4gKEFuZHJlYXMgRGlsZ2VyKQotICBhZGRlZCBSRkMgMTE1MiBbc2ljXSBkYXRlIHN1cHBvcnQKLSAgZml4ZWQgYnVnIGluIGdhbW1hIGhhbmRsaW5nIG9mIDQtYml0IGdyYXlzY2FsZQotICBhZGRlZCAyLWJpdCBncmF5c2NhbGUgZ2FtbWEgaGFuZGxpbmcgKEdsZW5uIFItUCkKLSAgYWRkZWQgbW9yZSB0eXBlY2FzdHMuIDY1NTM2TCBiZWNvbWVzIChwbmdfdWludF8zMik2NTUzNkwsIGV0Yy4gKEdsZW5uIFItUCkKLSAgbWlub3IgY29ycmVjdGlvbnMgaW4gbGlicG5nLnR4dAotICBhZGRlZCBzaW1wbGUgc1JHQiBzdXBwb3J0IChHbGVubiBSLVApCi0gIGVhc2llciBjb25kaXRpb25hbCBjb21waWxpbmcsIGUuZy4gZGVmaW5lIFBOR19SRUFEL1dSSVRFX05PVF9GVUxMWV9TVVBQT1JURUQ7Ci0gICAgIGFsbCBjb25maWd1cmFibGUgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgZnJvbSBjb21tYW5kLWxpbmUgaW5zdGVhZAotICAgICBvZiBoYXZpbmcgdG8gZWRpdCBwbmdjb25mLmggKEdsZW5uIFItUCkKLSAgZml4ZWQgbWVtb3J5IGxlYWsgaW4gcG5nd3JpdGUuYyAoZnJlZSBpbmZvX3B0ci0+dGV4dCkgKEdsZW5uIFItUCkKLSAgYWRkZWQgbW9yZSBjb25kaXRpb25zIGZvciBwbmdfZG9fYmFja2dyb3VuZCwgdG8gYXZvaWQgY2hhbmdpbmcKLSAgICAgYmxhY2sgcGl4ZWxzIHRvIGJhY2tncm91bmQgd2hlbiBhIGJhY2tncm91bmQgaXMgc3VwcGxpZWQgYW5kCi0gICAgIG5vIHBpeGVscyBhcmUgdHJhbnNwYXJlbnQKLSAgcmVwYWlyZWQgUE5HX05PX1NURElPIGJlaGF2aW91cgotICB0ZXN0ZWQgTk9ESVYgc3VwcG9ydCBhbmQgbWFkZSBpdCBkZWZhdWx0IGJlaGF2aW91ciAoR3JlZyBSb2Vsb2ZzKQotICBhZGRlZCAiLW0iIG9wdGlvbiBhbmQgUE5HVEVTVF9ERUJVR19NRU1PUlkgdG8gcG5ndGVzdCAoSm9obiBCb3dsZXIpCi0gIHJlZ3VsYXJpemVkIHZlcnNpb24gbnVtYmVyaW5nIHNjaGVtZSBhbmQgYnVtcGVkIHNoYXJlZC1saWJyYXJ5IG1ham9yCi0gICAgIHZlcnNpb24gbnVtYmVyIHRvIDIgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBsaWJwbmcgMC44OSBhcHBzIChHcmVnIFJvZWxvZnMpCi0KLXZlcnNpb24gMC45OCBbSmFudWFyeSwgMTk5OF0KLSAgY2xlYW5lZCB1cCBzb21lIHR5cG9zIGluIGxpYnBuZy50eHQgYW5kIGluIGNvZGUgZG9jdW1lbnRhdGlvbgotICBmaXhlZCBtZW1vcnkgbGVha3MgaW4gcENBTCBjaHVuayBwcm9jZXNzaW5nIChHbGVubiBSLVAgYW5kIEpvaG4gQm93bGVyKQotICBjb3NtZXRpYyBjaGFuZ2UgImRpc3BsYXlfZ2FtbWEiIHRvICJzY3JlZW5fZ2FtbWEiIGluIHBuZ3J0cmFuLmMKLSAgY2hhbmdlZCByZWNvbW1lbmRhdGlvbiBhYm91dCBmaWxlX2dhbW1hIGZvciBQQyBpbWFnZXMgdG8gLjUxIGZyb20gLjQ1LAotICAgICBpbiBleGFtcGxlLmMgYW5kIGxpYnBuZy50eHQsIGFkZGVkIGNvbW1lbnRzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KLSAgICAgc2NyZWVuX2dhbW1hLCB2aWV3aW5nX2dhbW1hLCBhbmQgZGlzcGxheV9nYW1tYS4KLSAgY2hhbmdlZCBhbGwgcmVmZXJlbmNlcyB0byBSRkMxMTUyIHRvIHJlYWQgUkZDMTEyMyBhbmQgY2hhbmdlZCB0aGUKLSAgICAgUE5HX1RJTUVfUkZDMTE1Ml9TVVBQT1JURUQgbWFjcm8gdG8gUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQKLSAgYWRkZWQgcG5nX2ludmVydF9hbHBoYSBjYXBhYmlsaXR5IChHbGVubiBSLVAgLS0gc3VnZ2VzdGlvbiBieSBKb24gVmluY2VudCkKLSAgY2hhbmdlZCBzcmdiX2ludGVudCBmcm9tIHBuZ19ieXRlIHRvIGludCB0byBhdm9pZCBjb21waWxlciBidWdzCi0KLXZlcnNpb24gMC45OSBbSmFudWFyeSAzMCwgMTk5OF0KLSAgZnJlZSBpbmZvX3B0ci0+dGV4dCBpbnN0ZWFkIG9mIGVuZF9pbmZvX3B0ci0+dGV4dCBpbiBwbmdyZWFkLmMgKEpvaG4gQm93bGVyKQotICBmaXhlZCBhIGxvbmdzdGFuZGluZyAicGFja3N3YXAiIGJ1ZyBpbiBwbmd0cmFucy5jCi0gIGZpeGVkIHNvbWUgaW5jb25zaXN0ZW5jaWVzIGluIHBuZ2NvbmYuaCB0aGF0IHByZXZlbnRlZCBjb21waWxpbmcgd2l0aAotICAgICBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQgYW5kIFBOR19SRUFEX2hJU1RfU1VQUE9SVEVEIHVuZGVmaW5lZAotICBmaXhlZCBzb21lIHR5cG9zIGFuZCBtYWRlIG90aGVyIG1pbm9yIHJlYXJyYW5nZW1lbnQgb2YgbGlicG5nLnR4dCAoQW5kcmVhcykKLSAgY2hhbmdlZCByZWNvbW1lbmRhdGlvbiBhYm91dCBmaWxlX2dhbW1hIGZvciBQQyBpbWFnZXMgdG8gLjUwIGZyb20gLjUxIGluCi0gICAgIGV4YW1wbGUuYyBhbmQgbGlicG5nLnR4dCwgYW5kIGNoYW5nZWQgZmlsZV9nYW1tYSBmb3Igc1JHQiBpbWFnZXMgdG8gLjQ1Ci0gIGFkZGVkIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucyB0byBhY2Nlc3MgaW5mb3JtYXRpb24gZnJvbSB0aGUgcG5nIHN0cnVjdHVyZQotICAgICBwbmdfZ2V0X2ltYWdlX2hlaWdodCgpLCBldGMuIChHbGVubiBSLVAsIHN1Z2dlc3Rpb24gYnkgQnJhZCBQZXR0aXQpCi0gIGFkZGVkIFRBUkdFVF9NQUNPUyBzaW1pbGFyIHRvIHpsaWItMS4wLjgKLSAgZGVmaW5lIFBOR19BTFdBWVNfRVhURVJOIHdoZW4gX19NV0VSS1NfXyAmJiBXSU4zMiBhcmUgZGVmaW5lZAotICBhZGRlZCB0eXBlIGNhc3RpbmcgdG8gYWxsIHBuZ19tYWxsb2MoKSBmdW5jdGlvbiBjYWxscwotdmVyc2lvbiAwLjk5YSBbSmFudWFyeSAzMSwgMTk5OF0KLSAgQWRkZWQgdHlwZSBjYXN0cyBhbmQgcGFyZW50aGVzZXMgdG8gYWxsIHJldHVybnMgdGhhdCByZXR1cm4gYSB2YWx1ZS4oVGltIFcuKQotdmVyc2lvbiAwLjk5YiBbRmVicnVhcnkgNCwgMTk5OF0KLSAgQWRkZWQgdHlwZSBjYXN0IHBuZ191aW50XzMyIG9uIG1hbGxvYyBmdW5jdGlvbiBjYWxscyB3aGVyZSBuZWVkZWQuCi0gIENoYW5nZWQgdHlwZSBvZiBudW1faGlzdCBmcm9tIHBuZ191aW50XzMyIHRvIGludCAoc2FtZSBhcyBudW1fcGFsZXR0ZSkuCi0gIEFkZGVkIGNoZWNrcyBmb3Igcm93Ynl0ZXMgb3ZlcmZsb3csIGluIGNhc2UgcG5nX3NpemVfdCBpcyBsZXNzIHRoYW4gMzIgYml0cy4KLSAgUmVuYW1lZCBtYWtlZmlsZS5lbGYgdG8gbWFrZWZpbGUubG54LgotdmVyc2lvbiAwLjk5YyBbRmVicnVhcnkgNywgMTk5OF0KLSAgTW9yZSB0eXBlIGNhc3RpbmcuICBSZW1vdmVkIGVycm9uZW91cyBvdmVyZmxvdyB0ZXN0IGluIHBuZ21lbS5jLgotICBBZGRlZCBwbmdfYnVmZmVyZWRfbWVtY3B5KCkgYW5kIHBuZ19idWZmZXJlZF9tZW1zZXQoKSwgYXBwbHkgdGhlbSB0byByb3dieXRlcy4KLSAgQWRkZWQgVU5JWCBtYW51YWwgcGFnZXMgbGlicG5nLjMgKGluY29ycG9yYXRpbmcgbGlicG5nLnR4dCkgYW5kICBwbmcuNS4KLXZlcnNpb24gMC45OWQgW0ZlYnJ1YXJ5IDExLCAxOTk4XQotICBSZW5hbWVkICJmYXJfdG9fbmVhcigpIiAicG5nX2Zhcl90b19uZWFyKCkiCi0gIFJldmlzZWQgbGlicG5nLjMKLSAgVmVyc2lvbiA5OWMgImJ1ZmZlcmVkIiBvcGVyYXRpb25zIGRpZG4ndCB3b3JrIGFzIGludGVuZGVkLiAgUmVwbGFjZWQgdGhlbQotICAgIHdpdGggcG5nX21lbWNweV9jaGVjaygpIGFuZCBwbmdfbWVtc2V0X2NoZWNrKCkuCi0gIEFkZGVkIG1hbnkgImlmIChwbmdfcHRyID09IE5VTEwpIHJldHVybiIgdG8gcXVlbGwgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQKLSAgICB1bnVzZWQgcG5nX3B0ciwgbW9zdGx5IGluIHBuZ2dldC5jIGFuZCBwbmdzZXQuYy4KLSAgQ2hlY2sgZm9yIG92ZXJsZW5ndGggdFJOUyBjaHVuayBwcmVzZW50IHdoZW4gaW5kZXhlZC1jb2xvciBQTFRFIGlzIHJlYWQuCi0gIENsZWFuZWQgdXAgc3BlbGxpbmcgZXJyb3JzIGluIGxpYnBuZy4zL2xpYnBuZy50eHQKLSAgQ29ycmVjdGVkIGEgcHJvYmxlbSB3aXRoIHBuZ19nZXRfdFJOUygpIHdoaWNoIHJldHVybmVkIHVuZGVmaW5lZCB0cmFucyBhcnJheQotdmVyc2lvbiAwLjk5ZSBbRmVicnVhcnkgMjgsIDE5OThdCi0gIENvcnJlY3RlZCBwbmdfZ2V0X3RSTlMoKSBhZ2Fpbi4KLSAgQWRkIHBhcmVudGhlc2VzIGZvciBlYXNpZXIgcmVhZGluZyBvZiBwbmdnZXQuYywgZml4ZWQgInx8IiBzaG91bGQgYmUgIiYmIi4KLSAgVG91Y2hlZCB1cCBleGFtcGxlLmMgdG8gbWFrZSBtb3JlIG9mIGl0IGNvbXBpbGVhYmxlLCBhbHRob3VnaCB0aGUgZW50aXJlCi0gICAgZmlsZSBzdGlsbCBjYW4ndCBiZSBjb21waWxlZCAoV2lsbGVtIHZhbiBTY2hhaWspCi0gIEZpeGVkIGEgYnVnIGluIHBuZ19kb19zaGlmdCgpIChCcnlhbiBUc2FpKQotICBBZGRlZCBhIHNwYWNlIGluIHBuZy5oIHByb3RvdHlwZSBmb3IgcG5nX3dyaXRlX2NodW5rX3N0YXJ0KCkKLSAgUmVwbGFjZWQgcG5ndGVzdC5wbmcgd2l0aCBvbmUgY3JlYXRlZCB3aXRoIHpsaWIgMS4xLjEKLSAgQ2hhbmdlZCBwbmd0ZXN0IHRvIHJlcG9ydCBQQVNTIGV2ZW4gd2hlbiBmaWxlIHNpemUgaXMgZGlmZmVyZW50IChKZWFuLWxvdXAgRy4pCi0gIENvcnJlY3RlZCBzb21lIGxvZ2ljIGVycm9ycyBpbiBwbmdfZG9faW52ZXJ0X2FscGhhKCkgKENocmlzIFBhdHRlcnNvbikKLXZlcnNpb24gMC45OWYgW01hcmNoIDUsIDE5OThdCi0gIENvcnJlY3RlZCBhIGJ1ZyBpbiBwbmdwcmVhZCgpIGludHJvZHVjZWQgaW4gdmVyc2lvbiA5OWMgKEtldmluIEJyYWNleSkKLSAgTW92ZWQgbWFrZWZpbGVzIGludG8gYSAic2NyaXB0cyIgZGlyZWN0b3J5LCBhbmQgYWRkZWQgSU5TVEFMTCBpbnN0cnVjdGlvbiBmaWxlCi0gIEFkZGVkIG1ha2VmaWxlLm9zMiBhbmQgcG5nb3MyLmRlZiAoQS4gWmFib2xvdG55KSBhbmQgbWFrZWZpbGUuczJ4IChXLiBTZWJvaykKLSAgQWRkZWQgcG9pbnRlcnMgdG8gIm5vdGUgb24gbGlicG5nIHZlcnNpb25zIiBpbiBtYWtlZmlsZS5sbnggYW5kIFJFQURNRQotICBBZGRlZCByb3cgY2FsbGJhY2sgZmVhdHVyZSB3aGVuIHJlYWRpbmcgYW5kIHdyaXRpbmcgbm9ucHJvZ3Jlc3NpdmUgcm93cwotICAgICBhbmQgYWRkZWQgYSB0ZXN0IG9mIHRoaXMgZmVhdHVyZSBpbiBwbmd0ZXN0LmMKLSAgQWRkZWQgdXNlciB0cmFuc2Zvcm0gY2FsbGJhY2tzLCB3aXRoIHRlc3Qgb2YgdGhlIGZlYXR1cmUgaW4gcG5ndGVzdC5jCi12ZXJzaW9uIDAuOTlnIFtNYXJjaCA2LCAxOTk4LCBtb3JuaW5nXQotICBNaW5vciBjaGFuZ2VzIHRvIHBuZ3Rlc3QuYyB0byBzdXBwcmVzcyBjb21waWxlciB3YXJuaW5ncy4KLSAgUmVtb3ZlZCAiYmV0YSIgbGFuZ3VhZ2UgZnJvbSBkb2N1bWVudGF0aW9uLgotdmVyc2lvbiAwLjk5aCBbTWFyY2ggNiwgMTk5OCwgZXZlbmluZ10KLSAgTWlub3IgY2hhbmdlcyB0byBwcmV2aW91cyBtaW5vciBjaGFuZ2VzIHRvIHBuZ3Rlc3QuYwotICBDaGFuZ2VkIFBOR19SRUFEX05PVF9GVUxMWV9TVVBQT1JURUQgdG8gUE5HX1JFQURfVFJBTlNGT1JNU19OT1RfU1VQUE9SVEVECi0gIGFuZCBhZGRlZCBQTkdfUFJPR1JFU1NJVkVfUkVBRF9OT1RfU1VQUE9SVEVEIG1hY3JvCi0gIEFkZGVkIHVzZXIgdHJhbnNmb3JtIGNhcGFiaWxpdHkKLQotdmVyc2lvbiAxLjAwIFtNYXJjaCA3LCAxOTk4XQotICBDaGFuZ2VkIHNldmVyYWwgdHlwZWRlZnMgaW4gcG5ncnV0aWwuYwotICBBZGRlZCBtYWtlZmlsZS53YXQgKFBhd2VsIE1yb2NoZW4pLCB1cGRhdGVkIG1ha2VmaWxlLnRjMyAoV2lsbGVtIHZhbiBTY2hhaWspCi0gIHJlcGxhY2VkICJ3aGlsZSgxKSIgd2l0aCAiZm9yKDs7KSIKLSAgYWRkZWQgUE5HQVJHKCkgdG8gcHJvdG90eXBlcyBpbiBwbmd0ZXN0LmMgYW5kIHJlbW92ZWQgc29tZSBwcm90b3R5cGVzCi0gIHVwZGF0ZWQgc29tZSBvZiB0aGUgbWFrZWZpbGVzIChUb20gTGFuZSkKLSAgY2hhbmdlZCBzb21lIHR5cGVkZWZzIChzX3N0YXJ0LCBldGMuKSBpbiBwbmdydXRpbC5jCi0gIGZpeGVkIGRpbWVuc2lvbnMgb2YgInNob3J0X21vbnRocyIgYXJyYXkgaW4gcG5nd3JpdGUuYwotICBSZXBsYWNlZCBhbnNpMmtuci5jIHdpdGggdGhlIG9uZSBmcm9tIGpwZWctdjYKLQotdmVyc2lvbiAxLjAuMCBbTWFyY2ggOCwgMTk5OF0KLSAgQ2hhbmdlZCBuYW1lIGZyb20gMS4wMCB0byAxLjAuMCAoQWRhbSBDb3N0ZWxsbykKLSAgQWRkZWQgc21ha2VmaWxlLnBwYyAod2l0aCBTQ09QVElPTlMucHBjKSBmb3IgQW1pZ2EgUFBDIChBbmRyZWFzIEtsZWluZXJ0KQotdmVyc2lvbiAxLjAuMGEgW01hcmNoIDksIDE5OThdCi0gIEZpeGVkIHRocmVlIGJ1Z3MgaW4gcG5ncnRyYW4uYyB0byBtYWtlIGdhbW1hK2JhY2tncm91bmQgaGFuZGxpbmcgY29uc2lzdGVudAotICAoR3JlZyBSb2Vsb2ZzKQotICBDaGFuZ2VkIGZvcm1hdCBvZiB0aGUgUE5HX0xJQlBOR19WRVIgaW50ZWdlciB0byB4eXl6eiBpbnN0ZWFkIG9mIHh5egotICBmb3IgbWFqb3IsIG1pbm9yLCBhbmQgYnVnZml4IHJlbGVhc2VzLiAgVGhpcyBpcyAxMDAwMS4gKEFkYW0gQ29zdGVsbG8sCi0gIFRvbSBMYW5lKQotICBNYWtlIG1vbnRocyByYW5nZSBmcm9tIDEtMTIgaW4gcG5nX2NvbnZlcnRfdG9fcmZjMTEyMwotdmVyc2lvbiAxLjAuMGIgW01hcmNoIDEzLCAxOTk4XQotICBRdWlldGVkIGNvbXBpbGVyIGNvbXBsYWludHMgYWJvdXQgdHdvIGVtcHR5ICJmb3IiIGxvb3BzIGluIHBuZ3J1dGlsLmMKLSAgTWlub3IgY2hhbmdlcyB0byBtYWtlZmlsZS5zMngKLSAgUmVtb3ZlZCAjaWZkZWYvI2VuZGlmIGFyb3VuZCBhIHBuZ19mcmVlKCkgaW4gcG5ncmVhZC5jCi0KLXZlcnNpb24gMS4wLjEgW01hcmNoIDE0LCAxOTk4XQotICBDaGFuZ2VkIG1ha2VmaWxlLnMyeCB0byByZWR1Y2Ugc2VjdXJpdHkgcmlzayBvZiB1c2luZyBhIHJlbGF0aXZlIHBhdGhuYW1lCi0gIEZpeGVkIHNvbWUgdHlwb3MgaW4gdGhlIGRvY3VtZW50YXRpb24gKEdyZWcpLgotICBGaXhlZCBhIHByb2JsZW0gd2l0aCB2YWx1ZSBvZiAiY2hhbm5lbHMiIHJldHVybmVkIGJ5IHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkKLXZlcnNpb24gMS4wLjFhIFtBcHJpbCAyMSwgMTk5OF0KLSAgT3B0aW1pemVkIFBhZXRoIGNhbGN1bGF0aW9ucyBieSByZXBsYWNpbmcgYWJzKCkgZnVuY3Rpb24gY2FsbHMgd2l0aCBpbnRyaW5zaWNzCi0gIHBsdXMgb3RoZXIgbG9vcCBvcHRpbWl6YXRpb25zLiBJbXByb3ZlcyBhdmcgZGVjb2Rpbmcgc3BlZWQgYnkgYWJvdXQgMjAlLgotICBDb21tZW50ZWQgb3V0IGkzODZpc3RpYyAiYWxpZ24iIGNvbXBpbGVyIGZsYWdzIGluIG1ha2VmaWxlLmxueC4KLSAgUmVkdWNlZCB0aGUgZGVmYXVsdCB3YXJuaW5nIGxldmVsIGluIHNvbWUgbWFrZWZpbGVzLCB0byBtYWtlIHRoZW0gY29uc2lzdGVudC4KLSAgUmVtb3ZlZCByZWZlcmVuY2VzIHRvIElKRyBhbmQgSlBFRyBpbiB0aGUgYW5zaTJrbnIuYyBjb3B5cmlnaHQgc3RhdGVtZW50LgotICBGaXhlZCBhIGJ1ZyBpbiBwbmdfZG9fc3RyaXBfZmlsbGVyIHdpdGggWFhSUkdHQkIgPT4gUlJHR0JCIHRyYW5zZm9ybWF0aW9uLgotICBBZGRlZCBncmF5c2NhbGUgYW5kIDE2LWJpdCBjYXBhYmlsaXR5IHRvIHBuZ19kb19yZWFkX2ZpbGxlcigpLgotICBGaXhlZCBhIGJ1ZyBpbiBwbmdzZXQuYywgaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDAuOTljLCB0aGF0IHNldHMgcm93Ynl0ZXMKLSAgICB0b28gbGFyZ2Ugd2hlbiB3cml0aW5nIGFuIGltYWdlIHdpdGggYml0X2RlcHRoIDwgOCAoQm9iIERlbGxhY2EpLgotICBDb3JyZWN0ZWQgc29tZSBidWdzIGluIHRoZSBleHBlcmltZW50YWwgd2VpZ2h0ZWQgZmlsdGVyaW5nIGhldXJpc3RpY3MuCi0gIE1vdmVkIGEgbWlzcGxhY2VkIHBuZ3J1dGlsIGNvZGUgYmxvY2sgdGhhdCB0cnVuY2F0ZXMgdFJOUyBpZiBpdCBoYXMgbW9yZQotICAgIHRoYW4gbnVtX3BhbGV0dGUgZW50cmllcyAtLSB0ZXN0IHdhcyBkb25lIGJlZm9yZSBudW1fcGFsZXR0ZSB3YXMgZGVmaW5lZC4KLSAgRml4ZWQgYSBwbmdfY29udmVydF90b19yZmMxMTIzKCkgYnVnIHRoYXQgY29udmVydHMgZGF5IDMxIHRvIDAgKFN0ZXZlIEVkZGlucykuCi0gIENoYW5nZWQgY29tcGlsZXIgZmxhZ3MgaW4gbWFrZWZpbGUud2F0IGZvciBiZXR0ZXIgb3B0aW1pemF0aW9uIChQYXdlbCBNcm9jaGVuKS4KLXZlcnNpb24gMS4wLjFiIFtNYXkgMiwgMTk5OF0KLSAgUmVsb2NhdGVkIHBuZ19kb19ncmF5X3RvX3JnYigpIHdpdGhpbiBwbmdfZG9fcmVhZF90cmFuc2Zvcm1hdGlvbnMoKSAoR3JlZykuCi0gIFJlbG9jYXRlZCB0aGUgcG5nX2NvbXBvc2l0ZSBtYWNyb3MgZnJvbSBwbmdydHJhbi5jIHRvIHBuZy5oIChHcmVnKS4KLSAgQWRkZWQgbWFrZWZpbGUuc2NvIChjb250cmlidXRlZCBieSBNaWtlIEhvcGtpcmspLgotICBGaXhlZCB0d28gYnVncyAobWlzc2luZyBkZWZpbml0aW9ucyBvZiAiaXN0b3AiKSBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjAuMWEuCi0gIEZpeGVkIGEgYnVnIGluIHBuZ3J0cmFuLmMgdGhhdCB3b3VsZCBzZXQgY2hhbm5lbHM9NSB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMuCi0gIE1vcmUgd29yayBvbiB0aGUgUGFldGgtZmlsdGVyaW5nLCBhY2hpZXZpbmcgaW1wZXJjZXB0aWJsZSBzcGVlZHVwIChBIEtsZWluZXJ0KS4KLSAgTW9yZSB3b3JrIG9uIGxvb3Agb3B0aW1pemF0aW9uIHdoaWNoIG1heSBoZWxwIHdoZW4gY29tcGlsZWQgd2l0aCBDKysgY29tcGlsZXJzLgotICBBZGRlZCB3YXJuaW5ncyB3aGVuIHBlb3BsZSB0cnkgdG8gdXNlIHRyYW5zZm9ybXMgdGhleSd2ZSBkZWZpbmVkIG91dC4KLSAgQ29sbGFwc2VkIDQgImkiIGFuZCAiYyIgbG9vcHMgaW50byBzaW5nbGUgImkiIGxvb3BzIGluIHBuZ3J0cmFuIGFuZCBwbmd3dHJhbi4KLSAgUmV2aXNlZCBwYXJhZ3JhcGggYWJvdXQgcG5nX3NldF9leHBhbmQoKSBpbiBsaWJwbmcudHh0IGFuZCBsaWJwbmcuMyAoR3JlZykKLXZlcnNpb24gMS4wLjFjIFtNYXkgMTEsIDE5OThdCi0gIEZpeGVkIGEgYnVnIGluIHBuZ3J0cmFuLmMgKGludHJvZHVjZWQgaW4gbGlicG5nLTEuMC4xYSkgd2hlcmUgdGhlIG1hc2tzIGZvcgotICAgIGZpbGxlciBieXRlcyBzaG91bGQgaGF2ZSBiZWVuIDB4ZmYgaW5zdGVhZCBvZiAweGYuCi0gIEFkZGVkIG1heF9waXhlbF9kZXB0aD0zMiBpbiBwbmdydXRpbC5jIHdoZW4gdXNpbmcgRklMTEVSIHdpdGggcGFsZXR0ZSBpbWFnZXMuCi0gIE1vdmVkIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEIGFuZCBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECi0gICAgb3V0IG9mIHRoZSBQTkdfV1JJVEVfVFJBTlNGT1JNU19OT1RfU1VQUE9SVEVEIGJsb2NrIG9mIHBuZ2NvbmYuaAotICBBZGRlZCAiUE5HX05PX1dSSVRFX1RSQU5TRk9STVMiIGV0Yy4sIGFzIGFsdGVybmF0aXZlcyBmb3IgKl9OT1RfU1VQUE9SVEVELAotICAgIGZvciBjb25zaXN0ZW5jeSwgaW4gcG5nY29uZi5oCi0gIEFkZGVkIGluZGl2aWR1YWwgImlmbmRlZiBQTkdfTk9fW0NBUEFCSUxJVFldIiBpbiBwbmdjb25mLmggdG8gbWFrZSBpdCBlYXNpZXIKLSAgICB0byByZW1vdmUgdW53YW50ZWQgY2FwYWJpbGl0aWVzIHZpYSB0aGUgY29tcGlsZSBsaW5lCi0gIE1hZGUgc29tZSBjb3JyZWN0aW9ucyB0byBncmFtbWFyICh3aGljaCwgaXQncykgaW4gZG9jdW1lbnRhdGlvbiAoR3JlZykuCi0gIENvcnJlY3RlZCBleGFtcGxlLmMsIHVzZSBvZiByb3dfcG9pbnRlcnMgaW4gcG5nX3dyaXRlX2ltYWdlKCkuCi12ZXJzaW9uIDEuMC4xZCBbTWF5IDI0LCAxOTk4XQotICBDb3JyZWN0ZWQgc2V2ZXJhbCBzdGF0ZW1lbnRzIHRoYXQgdXNlZCBzaWRlIGVmZmVjdHMgaWxsZWdhbGx5IGluIHBuZ3J1dGlsLmMKLSAgICBhbmQgcG5ndHJhbnMuYywgdGhhdCB3ZXJlIGludHJvZHVjZWQgaW4gdmVyc2lvbiAxLjAuMWIKLSAgUmV2aXNlZCBwbmdfcmVhZF9yb3dzKCkgdG8gYXZvaWQgcmVwZWF0ZWQgaWYtdGVzdGluZyBmb3IgTlVMTCAoQSBLbGVpbmVydCkKLSAgTW9yZSBjb3JyZWN0aW9ucyB0byBleGFtcGxlLmMsIHVzZSBvZiByb3dfcG9pbnRlcnMgaW4gcG5nX3dyaXRlX2ltYWdlKCkKLSAgICBhbmQgcG5nX3JlYWRfcm93cygpLgotICBBZGRlZCBwbmdkbGwubWFrIGFuZCBwbmdkZWYucGFzIHRvIHNjcmlwdHMgZGlyZWN0b3J5LCBjb250cmlidXRlZCBieQotICAgIEJvYiBEZWxsYWNhLCB0byBtYWtlIGEgcG5nMzJiZC5kbGwgd2l0aCBCb3JsYW5kIEMrKyA0LjUKLSAgRml4ZWQgZXJyb3IgaW4gZXhhbXBsZS5jIHdpdGggcG5nX3NldF90ZXh0OiBudW1fdGV4dCBpcyAzLCBub3QgMiAoR3VpZG8gVi4pCi0gIENoYW5nZWQgc2V2ZXJhbCBsb29wcyBmcm9tIGNvdW50LWRvd24gdG8gY291bnQtdXAsIGZvciBjb25zaXN0ZW5jeS4KLXZlcnNpb24gMS4wLjFlIFtKdW5lIDYsIDE5OThdCi0gIFJldmlzZWQgbGlicG5nLnR4dCBhbmQgbGlicG5nLjMgZGVzY3JpcHRpb24gb2YgcG5nX3NldF9yZWFkfHdyaXRlX2ZuKCksIGFuZAotICAgIGFkZGVkIHdhcm5pbmdzIHdoZW4gcGVvcGxlIHRyeSB0byBzZXQgcG5nX3JlYWRfZm4gYW5kIHBuZ193cml0ZV9mbiBpbgotICAgIHRoZSBzYW1lIHN0cnVjdHVyZS4KLSAgQWRkZWQgYSB0ZXN0IHN1Y2ggdGhhdCBwbmdfZG9fZ2FtbWEgd2lsbCBiZSBkb25lIHdoZW4gbnVtX3RyYW5zPT0wCi0gICAgZm9yIHRydWVjb2xvciBpbWFnZXMgdGhhdCBoYXZlIGRlZmluZWQgYSBiYWNrZ3JvdW5kLiAgVGhpcyBjb3JyZWN0cyBhbgotICAgIGVycm9yIHRoYXQgd2FzIGludHJvZHVjZWQgaW4gbGlicG5nLTAuOTAgdGhhdCBjYW4gY2F1c2UgZ2FtbWEgcHJvY2Vzc2luZwotICAgIHRvIGJlIHNraXBwZWQuCi0gIEFkZGVkIHRlc3RzIGluIHBuZy5oIHRvIGluY2x1ZGUgInRyYW5zIiBhbmQgInRyYW5zX3ZhbHVlcyIgaW4gc3RydWN0dXJlcwotICAgIHdoZW4gUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQgb3IgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCBpcyBkZWZpbmVkLgotICBBZGQgcG5nX2ZyZWUocG5nX3B0ci0+dGltZV9idWZmZXIpIGluIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCkKLSAgTW92ZWQgcG5nX2NvbnZlcnRfdG9fcmZjXzExMjMoKSBmcm9tIHBuZ3dyaXRlLmMgdG8gcG5nLmMKLSAgQWRkZWQgY2FwYWJpbGl0eSBmb3IgdXNlci1wcm92aWRlZCBtYWxsb2NfZm4oKSBhbmQgZnJlZV9mbigpIGZ1bmN0aW9ucywKLSAgICBhbmQgcmV2aXNlZCBwbmd0ZXN0LmMgdG8gZGVtb25zdHJhdGUgdGhlaXIgdXNlLCByZXBsYWNpbmcgdGhlCi0gICAgUE5HVEVTVF9ERUJVR19NRU0gZmVhdHVyZS4KLSAgQWRkZWQgbWFrZWZpbGUudzMyLCBmb3IgTWljcm9zb2Z0IEMrKyA0LjAgYW5kIGxhdGVyIChUaW0gV2VnbmVyKS4KLQotdmVyc2lvbiAxLjAuMiBbSnVuZSAxNCwgMTk5OF0KLSAgRml4ZWQgdHdvIGJ1Z3MgaW4gbWFrZWZpbGUuYm9yIC4KLXZlcnNpb24gMS4wLjJhIFtEZWNlbWJlciAzMCwgMTk5OF0KLSAgUmVwbGFjZWQgYW5kIGV4dGVuZGVkIGNvZGUgdGhhdCB3YXMgcmVtb3ZlZCBmcm9tIHBuZ19zZXRfZmlsbGVyKCkgaW4gMS4wLjFhLgotICBGaXhlZCBhIGJ1ZyBpbiBwbmdfZG9fZmlsbGVyKCkgdGhhdCBtYWRlIGl0IGZhaWwgdG8gd3JpdGUgZmlsbGVyIGJ5dGVzIGluCi0gICAgdGhlIGxlZnQtbW9zdCBwaXhlbCBvZiBlYWNoIHJvdyAoS2V2aW4gQnJhY2V5KS4KLSAgQ2hhbmdlZCAic3RhdGljIHBuZ2NoYXJwIHRJTUVfc3RyaW5nIiB0byAic3RhdGljIGNoYXIgdElNRV9zdHJpbmdbMzBdIgotICAgIGluIHBuZ3Rlc3QuYyAoRHVuY2FuIFNpbXBzb24pLgotICBGaXhlZCBhIGJ1ZyBpbiBwbmd0ZXN0LmMgdGhhdCBjYXVzZWQgcG5ndGVzdCB0byB0cnkgdG8gd3JpdGUgYSB0SU1FIGNodW5rCi0gICAgZXZlbiB3aGVuIG5vIHRJTUUgY2h1bmsgd2FzIHByZXNlbnQgaW4gdGhlIHNvdXJjZSBmaWxlLgotICBGaXhlZCBhIHByb2JsZW0gaW4gcG5ncnV0aWwuYzogZ3JheV90b19yZ2IgZGlkbid0IGFsd2F5cyB3b3JrIHdpdGggMTYtYml0LgotICBGaXhlZCBhIHByb2JsZW0gaW4gcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KCksIHdoaWNoIHdvdWxkIG5vdCBza2lwIHNvbWUKLSAgICBwYXNzZXMgdGhhdCBpdCBzaG91bGQgc2tpcCwgZm9yIGltYWdlcyB0aGF0IGFyZSBsZXNzIHRoYW4gMyBwaXhlbHMgaGlnaC4KLSAgSW50ZXJjaGFuZ2VkIHRoZSBvcmRlciBvZiBjYWxscyB0byBwbmdfZG9fc3dhcCgpIGFuZCBwbmdfZG9fc2hpZnQoKQotICAgIGluIHBuZ3d0cmFuLmMgKEpvaG4gQ3JvbWVyKS4KLSAgQWRkZWQgI2lmZGVmIFBOR19ERUJVRy8jZW5kaWYgc3Vycm91bmRpbmcgdXNlIG9mIFBOR19ERUJVRyBpbiBwbmcuaCAuCi0gIENoYW5nZWQgImJhZCBhZGFwdGl2ZSBmaWx0ZXIgdHlwZSIgZnJvbSBlcnJvciB0byB3YXJuaW5nIGluIHBuZ3J1dGlsLmMgLgotICBGaXhlZCBhIGRvY3VtZW50YXRpb24gZXJyb3IgYWJvdXQgZGVmYXVsdCBmaWx0ZXJpbmcgd2l0aCA4LWJpdCBpbmRleGVkLWNvbG9yLgotICBTZXBhcmF0ZWQgdGhlIFBOR19OT19TVERJTyBtYWNybyBpbnRvIFBOR19OT19TVERJTyBhbmQgUE5HX05PX0NPTlNPTEVfSU8KLSAgICAoTC4gUGV0ZXIgRGV1dHNjaCkuCi0gIEFkZGVkIHBuZ19zZXRfcmdiX3RvX2dyYXkoKSBhbmQgcG5nX2dldF9yZ2JfdG9fZ3JheV9zdGF0dXMoKSBmdW5jdGlvbnMuCi0gIEFkZGVkIHBuZ19nZXRfY29weXJpZ2h0KCkgYW5kIHBuZ19nZXRfaGVhZGVyX3ZlcnNpb24oKSBmdW5jdGlvbnMuCi0gIFJldmlzZWQgY29tbWVudHMgb24gcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKCkgaW4gbGlicG5nLnR4dCBhbmQgZXhhbXBsZS5jCi0gIEFkZGVkIGluZm9ybWF0aW9uIGFib3V0IGRlYnVnZ2luZyBpbiBsaWJwbmcudHh0IGFuZCBsaWJwbmcuMyAuCi0gIENoYW5nZWQgImxuIC1zZiIgdG8gImxuIC1zIC1mIiBpbiBtYWtlZmlsZS5zMngsIG1ha2VmaWxlLmxueCwgYW5kIG1ha2VmaWxlLnNjby4KLSAgUmVtb3ZlZCBsaW5lcyBhZnRlciBEeW5hbWljIERlcGVuZGVuY2llcyIgaW4gbWFrZWZpbGUuYWNvIC4KLSAgUmV2aXNlZCBtYWtlZmlsZS5kZWMgdG8gbWFrZSBhIHNoYXJlZCBsaWJyYXJ5IChKZXJlbWllIFBldGl0KS4KLSAgUmVtb3ZlZCB0cmFpbGluZyBibGFua3MgZnJvbSBhbGwgZmlsZXMuCi12ZXJzaW9uIDEuMC4yYSBbSmFudWFyeSA2LCAxOTk5XQotICBSZW1vdmVkIG1pc3BsYWNlZCAjZW5kaWYgYW5kICNpZmRlZiBQTkdfTk9fRVhURVJOIG5lYXIgdGhlIGVuZCBvZiBwbmcuaAotICBBZGRlZCAiaWYiIHRlc3RzIHRvIHNpbGVuY2UgY29tcGxhaW50cyBhYm91dCB1bnVzZWQgcG5nX3B0ciBpbiBwbmcuaCBhbmQgcG5nLmMKLSAgQ2hhbmdlZCAiY2hlY2tfaWZfcG5nIiBmdW5jdGlvbiBpbiBleGFtcGxlLmMgdG8gcmV0dXJuIHRydWUgKG5vbnplcm8pIGlmIFBORy4KLSAgQ2hhbmdlZCBsaWJwbmcudHh0IHRvIGRlbW9uc3RyYXRlIHBuZ19zaWdfY21wKCkgaW5zdGVhZCBvZiBwbmdfY2hlY2tfc2lnKCkKLSAgICB3aGljaCBpcyBvYnNvbGV0ZS4KLQotdmVyc2lvbiAxLjAuMyBbSmFudWFyeSAxNCwgMTk5OV0KLSAgQWRkZWQgbWFrZWZpbGUuaHV4LCBmb3IgSGV3bGV0dCBQYWNrYXJkIEhQVVggMTAuMjAgYW5kIDExLjAwIChKaW0gUmljZSkKLSAgQWRkZWQgYSBzdGF0ZW1lbnQgb2YgWTJLIGNvbXBsaWFuY2UgaW4gcG5nLmgsIGxpYnBuZy4zLCBhbmQgWTJLSU5GTy4KLXZlcnNpb24gMS4wLjNhIFtBdWd1c3QgMTIsIDE5OTldCi0gIEFkZGVkIGNoZWNrIGZvciBQTkdfUkVBRF9JTlRFUkxBQ0VfU1VQUE9SVEVEIGluIHBuZ3JlYWQuYzsgaXNzdWUgYSB3YXJuaW5nCi0gICAgIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byByZWFkIGFuIGludGVybGFjZWQgaW1hZ2Ugd2hlbiBpdCdzIG5vdCBzdXBwb3J0ZWQuCi0gIEFkZGVkIGNoZWNrIGlmIHBuZ19wdHItPnRyYW5zIGlzIGRlZmluZWQgYmVmb3JlIGZyZWVpbmcgaXQgaW4gcG5ncmVhZC5jCi0gIE1vZGlmaWVkIHRoZSBZMksgc3RhdGVtZW50IHRvIGluY2x1ZGUgdmVyc2lvbnMgYmFjayB0byB2ZXJzaW9uIDAuNzEKLSAgRml4ZWQgYSBidWcgaW4gdGhlIGNoZWNrIGZvciB2YWxpZCBJSERSIGJpdF9kZXB0aC9jb2xvcl90eXBlcyBpbiBwbmdydXRpbC5jCi0gIE1vZGlmaWVkIG1ha2VmaWxlLndhdCAoYWRkZWQgLXpwOCBmbGFnLCAiLnN5bWJvbGljIiwgY2hhbmdlZCBzb21lIGNvbW1lbnRzKQotICBSZXBsYWNlZCBsZWFkaW5nIGJsYW5rcyB3aXRoIHRhYiBjaGFyYWN0ZXJzIGluIG1ha2VmaWxlLmh1eAotICBDaGFuZ2VkICJkd29ya2luLnd1c3RsLmVkdSIgdG8gImNjcmMud3VzdGwuZWR1IiBpbiB2YXJpb3VzIGRvY3VtZW50cy4KLSAgQ2hhbmdlZCAoZmxvYXQpcmVkIGFuZCAoZmxvYXQpZ3JlZW4gdG8gKGRvdWJsZSlyZWQsIChkb3VibGUpZ3JlZW4KLSAgICAgaW4gcG5nX3NldF9yZ2JfdG9fZ3JheSgpIHRvIGF2b2lkICJwcm9tb3Rpb24iIHByb2JsZW1zIGluIEFJWC4KLSAgRml4ZWQgYSBidWcgaW4gcG5nY29uZi5oIHRoYXQgb21pdHRlZCA8c3RkaW8uaD4gd2hlbiBQTkdfREVCVUc9PTAgKEsgQnJhY2V5KS4KLSAgUmVmb3JtYXR0ZWQgbGlicG5nLjMgYW5kIGxpYnBuZ3BmLjMgd2l0aCBwcm9wZXIgZm9udHMgKHNjcmlwdCBieSBKLiB2YW5aYW5kdCkuCi0gIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiB0byByZWZlciB0byB0aGUgUE5HLTEuMiBzcGVjaWZpY2F0aW9uLgotICBSZW1vdmVkIGFuc2kya25yLmMgYW5kIGxlZnQgcG9pbnRlcnMgdG8gdGhlIGxhdGVzdCBzb3VyY2UgZm9yIGFuc2kya25yLmMKLSAgICBpbiBtYWtlZmlsZS5rbnIsIElOU1RBTEwsIGFuZCBSRUFETUUgKEwuIFBldGVyIERldXRzY2gpCi0gIEZpeGVkIGJ1Z3MgaW4gY2FsY3VsYXRpb24gb2YgdGhlIGxlbmd0aCBvZiByb3dieXRlcyB3aGVuIGFkZGluZyBhbHBoYQotICAgIGNoYW5uZWxzIHRvIDE2LWJpdCBpbWFnZXMsIGluIHBuZ3J0cmFuLmMgKENocmlzIE5va2xlYmVyZykKLSAgQWRkZWQgZnVuY3Rpb24gcG5nX3NldF91c2VyX3RyYW5zZm9ybV9pbmZvKCkgdG8gc3RvcmUgdXNlcl90cmFuc2Zvcm1fcHRyLAotICAgIHVzZXJfZGVwdGgsIGFuZCB1c2VyX2NoYW5uZWxzIGludG8gdGhlIHBuZ19zdHJ1Y3QsIGFuZCBhIGZ1bmN0aW9uCi0gICAgcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIoKSB0byByZXRyaWV2ZSB0aGUgcG9pbnRlciAoQ2hyaXMgTm9rbGViZXJnKQotICBBZGRlZCBmdW5jdGlvbiBwbmdfc2V0X2VtcHR5X3BsdGVfcGVybWl0dGVkKCkgdG8gbWFrZSBsaWJwbmcgdXNlYWJsZQotICAgIGluIE1ORyBhcHBsaWNhdGlvbnMuCi0gIENvcnJlY3RlZCB0aGUgdHlwZWRlZiBmb3IgcG5nX2ZyZWVfcHRyIGluIHBuZy5oIChKZXNzZSBKb25lcykuCi0gIENvcnJlY3QgZ2FtbWEgd2l0aCBzcmdiIGlzIDQ1NDU1IGluc3RlYWQgb2YgNDUwMDAgaW4gcG5ncnV0aWwuYywgdG8gYmUKLSAgICBjb25zaXN0ZW50IHdpdGggUE5HLTEuMiwgYW5kIGFsbG93IHZhcmlhbmNlIG9mIDUwMCBiZWZvcmUgY29tcGxhaW5pbmcuCi0gIEFkZGVkIGFzc2VtYmxlciBjb2RlIGNvbnRyaWJ1dGVkIGJ5IEludGVsIGluIGZpbGUgcG5ndmNyZC5jIGFuZCBtb2RpZmllZAotICAgIG1ha2VmaWxlLnczMiB0byB1c2UgaXQgKE5pcmF2IENoaGF0cmFwYXRpLCBJTlRFTCBDb3Jwb3JhdGlvbiwgR2lsbGVzIFZvbGxhbnQpCi0gIENoYW5nZWQgImxuIC1zIC1mIiB0byAibG4gLWYgLXMiIGluIHRoZSBtYWtlZmlsZXMgdG8gbWFrZSBTb2xhcmlzIGhhcHB5LgotICBBZGRlZCBzb21lIGFsaWFzZXMgZm9yIHBuZ19zZXRfZXhwYW5kKCkgaW4gcG5ncnRyYW4uYywgbmFtZWx5Ci0gICAgcG5nX3NldF9leHBhbmRfUExURSgpLCBwbmdfc2V0X2V4cGFuZF9kZXB0aCgpLCBhbmQgcG5nX3NldF9leHBhbmRfdFJOUygpCi0gICAgKEdyZWcgUm9lbG9mcywgaW4gIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUiKS4KLSAgQWRkZWQgbWFrZWZpbGUuYmVvIGZvciBCRU9TIG9uIFg4NiwgY29udHJpYnV0ZWQgYnkgU2FuZGVyIFN0b2suCi12ZXJzaW9uIDEuMC4zYiBbQXVndXN0IDI2LCAxOTk5XQotICBSZXBsYWNlZCAyMTQ3NDgzNjQ3TCBzZXZlcmFsIHBsYWNlcyB3aXRoIFBOR19NQVhfVUlOVCBtYWNybywgZGVmaW5lZCBpbiBwbmcuaAotICBDaGFuZ2VkIGxlYWRpbmcgYmxhbmtzIHRvIHRhYnMgaW4gYWxsIG1ha2VmaWxlcy4KLSAgRGVmaW5lIFBOR19VU0VfUE5HVkNSRCBpbiBtYWtlZmlsZS53MzIsIHRvIGdldCBNTVggYXNzZW1ibGVyIGNvZGUuCi0gIE1hZGUgYWx0ZXJuYXRlIHZlcnNpb25zIG9mICBwbmdfc2V0X2V4cGFuZCgpIGluIHBuZ3J0cmFuLmMsIG5hbWVseQotICAgIHBuZ19zZXRfZ3JheV8xXzJfNF90b184LCBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiLCBhbmQgcG5nX3NldF90Uk5TX3RvX2FscGhhCi0gICAgKEdyZWcgUm9lbG9mcywgaW4gIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUiKS4gIERlbGV0ZWQgdGhlIDEuMC4zYSBhbGlhc2VzLgotICBSZWxvY2F0ZWQgc3RhcnQgb2YgJ2V4dGVybiAiQyInIGJsb2NrIGluIHBuZy5oIHNvIGl0IGRvZXNuJ3QgaW5jbHVkZSBwbmdjb25mLmgKLSAgUmV2aXNlZCBjYWxjdWxhdGlvbiBvZiBudW1fYmxvY2tzIGluIHBuZ21lbS5jIHRvIGF2b2lkIGEgcG90ZW50aWFsbHkKLSAgICBuZWdhdGl2ZSBzaGlmdCBkaXN0YW5jZSwgd2hvc2UgcmVzdWx0cyBhcmUgdW5kZWZpbmVkIGluIHRoZSBDIGxhbmd1YWdlLgotICBBZGRlZCBhIGNoZWNrIGluIHBuZ3NldC5jIHRvIHByZXZlbnQgd3JpdGluZyBtdWx0aXBsZSB0SU1FIGNodW5rcy4KLSAgQWRkZWQgYSBjaGVjayBpbiBwbmd3cml0ZS5jIHRvIGRldGVjdCBpbnZhbGlkIHNtYWxsIHdpbmRvd19iaXRzIHNpemVzLgotdmVyc2lvbiAxLjAuM2QgW1NlcHRlbWJlciA0LCAxOTk5XQotICBGaXhlZCB0eXBlIGNhc3Rpbmcgb2YgaWdhbW1hIGluIHBuZ3J1dGlsLmMKLSAgQWRkZWQgbmV3IHBuZ19leHBhbmQgZnVuY3Rpb25zIHRvIHNjcmlwdHMvcG5nZGVmLnBhcyBhbmQgcG5nb3MyLmRlZgotICBBZGRlZCBhIGRlbW8gcmVhZF91c2VyX3RyYW5zZm9ybV9mbiB0aGF0IGV4YW1pbmVzIHRoZSByb3cgZmlsdGVycyBpbiBwbmd0ZXN0LmMKLQotdmVyc2lvbiAxLjAuNCBbU2VwdGVtYmVyIDI0LCAxOTk5XQotICBEZWZpbmUgUE5HX0FMV0FZU19FWFRFUk4gaW4gcG5nY29uZi5oIGlmIF9fU1REQ19fIGlzIGRlZmluZWQKLSAgRGVsZXRlICNkZWZpbmUgUE5HX0lOVEVSTkFMIGFuZCBpbmNsdWRlICJwbmcuaCIgZnJvbSBwbmdhc21yZC5oCi0gIE1hZGUgc2V2ZXJhbCBtaW5vciBjb3JyZWN0aW9ucyB0byBwbmd0ZXN0LmMKLSAgUmVuYW1lZCB0aGUgbWFrZWZpbGVzIHdpdGggbG9uZ2VyIGJ1dCBtb3JlIHVzZXIgZnJpZW5kbHkgZXh0ZW5zaW9ucy4KLSAgQ29waWVkIHRoZSBQTkcgY29weXJpZ2h0IGFuZCBsaWNlbnNlIHRvIGEgc2VwYXJhdGUgTElDRU5TRSBmaWxlLgotICBSZXZpc2VkIGRvY3VtZW50YXRpb24sIHBuZy5oLCBhbmQgZXhhbXBsZS5jIHRvIHJlbW92ZSByZWZlcmVuY2UgdG8KLSAgICAidmlld2luZ19nYW1tYSIgd2hpY2ggbm8gbG9uZ2VyIGFwcGVhcnMgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uLgotICBSZXZpc2VkIHBuZ3ZjcmQuYyB0byB1c2UgTU1YIGNvZGUgZm9yIGludGVybGFjaW5nIG9ubHkgb24gdGhlIGZpbmFsIHBhc3MuCi0gIFVwZGF0ZWQgcG5ndmNyZC5jIHRvIHVzZSB0aGUgZmFzdGVyIEMgZmlsdGVyIGFsZ29yaXRobXMgZnJvbSBsaWJwbmctMS4wLjFhCi0gIFNwbGl0IG1ha2VmaWxlLndpbjMydmMgaW50byB0d28gdmVyc2lvbnMsIG1ha2VmaWxlLnZjYXdpbjMyICh1c2VzIE1NWAotICAgIGFzc2VtYmxlciBjb2RlKSBhbmQgbWFrZWZpbGUudmN3aW4zMiAoZG9lc24ndCkuCi0gIEFkZGVkIGEgQ1BVIHRpbWluZyByZXBvcnQgdG8gcG5ndGVzdC5jIChlbmFibGVkIGJ5IGRlZmluaW5nIFBOR1RFU1RfVElNSU5HKQotICBBZGRlZCBhIGNvcHkgb2YgcG5nbm93LnBuZyB0byB0aGUgZGlzdHJpYnV0aW9uLgotdmVyc2lvbiAxLjAuNGEgW1NlcHRlbWJlciAyNSwgMTk5OV0KLSAgSW5jcmVhc2UgbWF4X3BpeGVsX2RlcHRoIGluIHBuZ3J1dGlsLmMgaWYgYSB1c2VyIHRyYW5zZm9ybSBuZWVkcyBpdC4KLSAgQ2hhbmdlZCBzZXZlcmFsIGRpdmlzaW9uIG9wZXJhdGlvbnMgdG8gcmlnaHQtc2hpZnRzIGluIHBuZ3ZjcmQuYwotdmVyc2lvbiAxLjAuNGIgW1NlcHRlbWJlciAzMCwgMTk5OV0KLSAgQWRkZWQgcGFyZW50aGVzZXMgaW4gbGluZSAzNzMyIG9mIHBuZ3ZjcmQuYwotICBBZGRlZCBhIGNvbW1lbnQgaW4gbWFrZWZpbGUubGludXggd2FybmluZyBhYm91dCBidWdneSAtTzMgaW4gcGdjYyAyLjk1LjEKLXZlcnNpb24gMS4wLjRjIFtPY3RvYmVyIDEsIDE5OTldCi0gIEFkZGVkIGEgInBuZ19jaGVja192ZXJzaW9uIiBmdW5jdGlvbiBpbiBwbmcuYyBhbmQgcG5ndGVzdC5jIHRoYXQgd2lsbCBnZW5lcmF0ZQotICAgIGEgaGVscGZ1bCBjb21waWxlciBlcnJvciBpZiBhbiBvbGQgcG5nLmggaXMgZm91bmQgaW4gdGhlIHNlYXJjaCBwYXRoLgotICBDaGFuZ2VkIHR5cGUgb2YgcG5nX3VzZXJfdHJhbnNmb3JtX2RlcHRofGNoYW5uZWxzIGZyb20gaW50IHRvIHBuZ19ieXRlLgotdmVyc2lvbiAxLjAuNGQgW09jdG9iZXIgNiwgMTk5OV0KLSAgQ2hhbmdlZCAwLjQ1IHRvIDAuNDU0NTUgaW4gcG5nX3NldF9zUkdCKCkKLSAgUmVtb3ZlZCB1bnVzZWQgUExURSBlbnRyaWVzIGZyb20gcG5nbm93LnBuZwotICBSZS1lbmFibGVkIHNvbWUgcGFydHMgb2YgcG5ndmNyZC5jIChwbmdfY29tYmluZV9yb3cpIHRoYXQgd29yayBwcm9wZXJseS4KLXZlcnNpb24gMS4wLjRlIFtPY3RvYmVyIDEwLCAxOTk5XQotICBGaXhlZCBzaWduIGVycm9yIGluIHBuZ3ZjcmQuYyAoR3JlZyBSb2Vsb2ZzKQotICBSZXBsYWNlZCBzb21lIGluc3RhbmNlcyBvZiBtZW1jcHkgd2l0aCBzaW1wbGUgYXNzaWdubWVudHMgaW4gcG5ndmNyZCAoR1ItUCkKLXZlcnNpb24gMS4wLjRmIFtPY3RvYmVyIDE1LCAxOTk5XQotICBTdXJyb3VuZGVkIGV4YW1wbGUuYyBjb2RlIHdpdGggI2lmIDAgLi4gI2VuZGlmIHRvIHByZXZlbnQgcGVvcGxlIGZyb20KLSAgICBpbmFkdmVydGVudGx5IHRyeWluZyB0byBjb21waWxlIGl0LgotICBDaGFuZ2VkIHBuZ19nZXRfaGVhZGVyX3ZlcnNpb24oKSBmcm9tIGEgZnVuY3Rpb24gdG8gYSBtYWNybyBpbiBwbmcuaAotICBBZGRlZCB0eXBlIGNhc3RpbmcgbW9zdGx5IGluIHBuZ3J0cmFuLmMgYW5kIHBuZ3d0cmFuLmMKLSAgUmVtb3ZlZCBzb21lIHBvaW50bGVzcyAicHRyID0gTlVMTCIgaW4gcG5nbWVtLmMKLSAgQWRkZWQgYSAiY29udHJpYiIgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBjb2RlIGZyb20gR3JlZydzIGJvb2suCi0KLXZlcnNpb24gMS4wLjUgW09jdG9iZXIgMTUsIDE5OTldCi0gIE1pbm9yIGVkaXRpbmcgb2YgdGhlIElOU1RBTEwgYW5kIFJFQURNRSBmaWxlcy4KLXZlcnNpb24gMS4wLjVhIFtPY3RvYmVyIDIzLCAxOTk5XQotICBBZGRlZCBjb250cmliL3BuZ3N1aXRlIGFuZCBjb250cmliL3BuZ21pbnVzIChXaWxsZW0gdmFuIFNjaGFpaykKLSAgRml4ZWQgYSB0eXBvIGluIHRoZSBwbmdfc2V0X3NSR0IoKSBmdW5jdGlvbiBjYWxsIGluIGV4YW1wbGUuYyAoSmFuIE5panRtYW5zKQotICBGdXJ0aGVyIG9wdGltaXphdGlvbiBhbmQgYnVnZml4IG9mIHBuZ3ZjcmQuYwotICBSZXZpc2VkIHBuZ3NldC5jIHNvIHRoYXQgaXQgZG9lcyBub3QgYWxsb2NhdGUgb3IgZnJlZSBtZW1vcnkgaW4gdGhlIHVzZXIncwotICAgIHRleHRfcHRyIHN0cnVjdHVyZS4gIEluc3RlYWQsIGl0IG1ha2VzIGl0cyBvd24gY29weS4KLSAgQ3JlYXRlZCBzZXBhcmF0ZSB3cml0ZV9lbmRfaW5mb19zdHJ1Y3QgaW4gcG5ndGVzdC5jIGZvciBhIG1vcmUgc2V2ZXJlIHRlc3QuCi0gIEFkZGVkIGNvZGUgaW4gcG5nd3JpdGUuYyB0byBmcmVlIGluZm9fcHRyLT50ZXh0W2ldLmtleSB0byBzdG9wIGEgbWVtb3J5IGxlYWsuCi12ZXJzaW9uIDEuMC41YiBbTm92ZW1iZXIgMjMsIDE5OTldCi0gIE1vdmVkIFBOR19GTEFHX0hBVkVfQ0hVTktfSEVBREVSLCBQTkdfRkxBR19CQUNLR1JPVU5EX0lTX0dSQVkgYW5kCi0gICAgUE5HX0ZMQUdfV1JPVEVfdElNRSBmcm9tIGZsYWdzIHRvIG1vZGUuCi0gIEFkZGVkIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFKCkgZnVuY3Rpb24uCi0gIEZpeGVkIHNvbWUgdHlwZWNhc3RpbmcgaW4gY29udHJpYi9ncmVnYm9vay8qLmMKLSAgVXBkYXRlZCBzY3JpcHRzL21ha2V2bXMuY29tIGFuZCBhZGRlZCBtYWtldm1zLmNvbSB0byBjb250cmliL2dyZWdib29rCi0gICAgYW5kIGNvbnRyaWIvcG5nbWludXMgKE1hcnRpbiBaaW5zZXIpCi12ZXJzaW9uIDEuMC41YyBbTm92ZW1iZXIgMjYsIDE5OTldCi0gIE1vdmVkIHBuZ19nZXRfaGVhZGVyX3ZlcnNpb24gZnJvbSBwbmcuaCB0byBwbmcuYywgdG8gYWNjb21tb2RhdGUgYW5zaTJrbnIuCi0gIFJlbW92ZWQgYWxsIGdsb2JhbCBhcnJheXMgKGFjY29yZGluZyB0byBQTkdfTk9fR0xPQkFMX0FSUkFZUyBtYWNybyksIHRvCi0gICAgYWNjb21tb2RhdGUgbWFraW5nIERMTCdzOiBNb3ZlZCB1c3JfcG5nX3ZlciBmcm9tIGdsb2JhbCB2YXJpYWJsZSB0byBmdW5jdGlvbgotICAgIHBuZ19nZXRfaGVhZGVyX3ZlcigpIGluIHBuZy5jLiAgTW92ZWQgcG5nX3NpZyB0byBwbmdfc2lnX2J5dGVzIGluIHBuZy5jIGFuZAotICAgIGVsaW1pbmF0ZWQgdXNlIG9mIHBuZ19zaWcgaW4gcG5nd3V0aWwuYy4gIE1vdmVkIHRoZSB2YXJpb3VzIHBuZ19DSE5LIGFycmF5cwotICAgIGludG8gcG5ndHlwZXMuaC4gIEVsaW1pbmF0ZWQgdXNlIG9mIGdsb2JhbCBwbmdfcGFzcyBhcnJheXMuICBEZWNsYXJlZCB0aGUKLSAgICBwbmdfQ0hOSyBhbmQgcG5nX3Bhc3MgYXJyYXlzIHRvIGJlICJjb25zdCIuICBNYWRlIHRoZSBnbG9iYWwgYXJyYXlzCi0gICAgYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucyAoYWx0aG91Z2ggbm9uZSBhcmUgdXNlZCBpbiBsaWJwbmcgaXRzZWxmKSB3aGVuCi0gICAgUE5HX05PX0dMT0JBTF9BUlJBWVMgaXMgbm90IGRlZmluZWQgb3Igd2hlbiBQTkdfR0xPQkFMX0FSUkFZUyBpcyBkZWZpbmVkLgotICBSZW1vdmVkIHNvbWUgZXh0cmFuZW91cyAiLUkiIGZyb20gY29udHJpYi9wbmdtaW51cy9tYWtlZmlsZS5zdGQKLSAgQ2hhbmdlZCB0aGUgUE5HX3NSR0JfSU5URU5UIG1hY3JvcyBpbiBwbmcuaCB0byBiZSBjb25zaXN0ZW50IHdpdGggUE5HLTEuMi4KLSAgQ2hhbmdlIFBOR19TUkdCX0lOVEVOVCB0byBQTkdfc1JHQl9JTlRFTlQgaW4gbGlicG5nLnR4dCBhbmQgbGlicG5nLjMKLXZlcnNpb24gMS4wLjVkIFtOb3ZlbWJlciAyOSwgMTk5OV0KLSAgQWRkIHR5cGUgY2FzdCAocG5nX2NvbnN0X2NoYXJwKSB0d28gcGxhY2VzIGluIHBuZy5jCi0gIEVsaW1pbmF0ZWQgcG5ndHlwZXMuaDsgdXNlIG1hY3JvcyBpbnN0ZWFkIHRvIGRlY2xhcmUgUE5HX0NITksgYXJyYXlzLgotICBSZW5hbWVkICJQTkdfR0xPQkFMX0FSUkFZUyIgdG8gIlBOR19VU0VfR0xPQkFMX0FSUkFZUyIgYW5kIG1hZGUgYXZhaWxhYmxlCi0gICAgdG8gYXBwbGljYXRpb25zIGEgbWFjcm8gIlBOR19VU0VfTE9DQUxfQVJSQVlTIi4KLSAgY29tbWVudCBvdXQgKHdpdGggI2lmZGVmKSBhbGwgdGhlIG5ldyBkZWNsYXJhdGlvbnMgd2hlbgotICAgIFBOR19VU0VfR0xPQkFMX0FSUkFZUyBpcyBkZWZpbmVkLgotICBBZGRlZCBQTkdfRVhQT1JUX1ZBUiBtYWNybyB0byBhY2NvbW1vZGF0ZSBtYWtpbmcgRExMJ3MuCi12ZXJzaW9uIDEuMC41ZSBbTm92ZW1iZXIgMzAsIDE5OTldCi0gIEFkZGVkIGlDQ1AsIGlUWHQsIGFuZCBzUExUIHN1cHBvcnQ7IGFkZGVkICJsYW5nIiBtZW1iZXIgdG8gdGhlIHBuZ190ZXh0Ci0gICAgc3RydWN0dXJlOyByZWZhY3RvcmVkIHRoZSBpbmZsYXRlL2RlZmxhdGUgc3VwcG9ydCB0byBtYWtlIGFkZGluZyBuZXcgY2h1bmtzCi0gICAgd2l0aCB0cmFpbGluZyBjb21wcmVzc2VkIHBhcnRzIGVhc2llciBpbiB0aGUgZnV0dXJlLCBhbmQgYWRkZWQgbmV3IGZ1bmN0aW9ucwotICAgIHBuZ19mcmVlX2lDQ1AsIHBuZ19mcmVlX3BDQUwsIHBuZ19mcmVlX3NQTFQsIHBuZ19mcmVlX3RleHQsIHBuZ19nZXRfaUNDUCwKLSAgICBwbmdfZ2V0X3NwYWxldHRlcywgcG5nX3NldF9pQ0NQLCBwbmdfc2V0X3NwYWxldHRlcyAoRXJpYyBTLiBSYXltb25kKS4KLSAgTk9URTogQXBwbGljYXRpb25zIHRoYXQgd3JpdGUgdGV4dCBjaHVua3MgTVVTVCBkZWZpbmUgcG5nX3RleHQtPmxhbmcKLSAgICBiZWZvcmUgY2FsbGluZyBwbmdfc2V0X3RleHQoKS4gSXQgbXVzdCBiZSBzZXQgdG8gTlVMTCBpZiB5b3Ugd2FudCB0bwotICAgIHdyaXRlIHRFWHQgb3IgelRYdCBjaHVua3MuICBJZiB5b3Ugd2FudCB5b3VyIGFwcGxpY2F0aW9uIHRvIGJlIGFibGUgdG8KLSAgICBydW4gd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBsaWJwbmcsIHVzZQotCi0gICAgICAjaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECi0gICAgICAgICBwbmdfdGV4dFtpXS5sYW5nID0gTlVMTDsKLSAgICAgICNlbmRpZgotCi0gIENoYW5nZWQgcG5nX2dldF9vRkZzKCkgYW5kIHBuZ19zZXRfb0ZGcygpIHRvIHVzZSBzaWduZWQgcmF0aGVyIHRoYW4gdW5zaWduZWQKLSAgICBvZmZzZXRzIChFcmljIFMuIFJheW1vbmQpLgotICBDb21iaW5lZCBQTkdfUkVBRF9jSE5LX1NVUFBPUlRFRCBhbmQgUE5HX1dSSVRFX2NITktfU1VQUE9SVEVEIG1hY3JvcyBpbnRvCi0gICAgUE5HX2NITktfU1VQUE9SVEVEIGFuZCBjb21iaW5lZCB0aGUgdGhyZWUgdHlwZXMgb2YgUE5HX3RleHRfU1VQUE9SVEVECi0gICAgbWFjcm9zLCBsZWF2aW5nIHRoZSBzZXBhcmF0ZSBtYWNyb3MgYWxzbyBhdmFpbGFibGUuCi0gIFJlbW92ZWQgY29tbWVudHMgb24gI2VuZGlmcyBhdCB0aGUgZW5kIG9mIG1hbnkgc2hvcnQsIG5vbi1uZXN0ZWQgI2lmLWJsb2Nrcy4KLXZlcnNpb24gMS4wLjVmIFtEZWNlbWJlciA2LCAxOTk5XQotICBDaGFuZ2VkIG1ha2VmaWxlLnNvbGFyaXMgdG8gaXNzdWUgYSB3YXJuaW5nIGFib3V0IHBvdGVudGlhbCBwcm9ibGVtcyB3aGVuCi0gICAgdGhlIHVjYiAibGQiIGlzIGluIHRoZSBwYXRoIGFoZWFkIG9mIHRoZSBjY3MgImxkIi4KLSAgUmVtb3ZlZCAiLSBbZGF0ZV0iIGZyb20gdGhlICJzeW5vcHNpcyIgbGluZSBpbiBsaWJwbmcuMyBhbmQgbGlicG5ncGYuMy4KLSAgQWRkZWQgc0NBTCBjaHVuayBzdXBwb3J0IChFcmljIFMuIFJheW1vbmQpLgotdmVyc2lvbiAxLjAuNWcgW0RlY2VtYmVyIDcsIDE5OTldCi0gIEZpeGVkICJwbmdfZnJlZV9zcGFsbGV0dGVzIiB0eXBvIGluIHBuZy5oCi0gIEFkZGVkIGNvZGUgdG8gaGFuZGxlIG5ldyBjaHVua3MgaW4gcG5ncHJlYWQuYwotICBNb3ZlZCBQTkdfQ0hOSyBzdHJpbmcgbWFjcm8gZGVmaW5pdGlvbnMgb3V0c2lkZSBvZiBQTkdfTk9fRVhURVJOIGJsb2NrCi0gIEFkZGVkICJ0cmFuc2xhdGVkX2tleSIgdG8gcG5nX3RleHQgc3RydWN0dXJlIGFuZCBwbmdfd3JpdGVfaVRYdCgpLgotICBBZGRlZCBjb2RlIGluIHBuZ3dyaXRlLmMgdG8gd29yayBhcm91bmQgYSBuZXdseSBkaXNjb3ZlcmVkIHpsaWIgYnVnLgotdmVyc2lvbiAxLjAuNWggW0RlY2VtYmVyIDEwLCAxOTk5XQotICBOT1RFOiByZWdhcmRpbmcgdGhlIG5vdGUgZm9yIHZlcnNpb24gMS4wLjVlLCB0aGUgZm9sbG93aW5nIG11c3QgYWxzbwotICAgIGJlIGluY2x1ZGVkIGluIHlvdXIgY29kZToKLSAgICAgICAgcG5nX3RleHRbaV0udHJhbnNsYXRlZF9rZXkgPSBOVUxMOwotICBVbmtub3duIGNodW5rIGhhbmRsaW5nIGlzIG5vdyBzdXBwb3J0ZWQuCi0gIE9wdGlvbiB0byBlbGltaW5hdGUgYWxsIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgd2FzIGFkZGVkLiAgU29tZSBuZXcKLSAgICBmaXhlZC1wb2ludCBmdW5jdGlvbnMgc3VjaCBhcyBwbmdfc2V0X2dBTUFfZml4ZWQoKSB3ZXJlIGFkZGVkLgotICBFeHBhbmRlZCB0YWJzIGFuZCByZW1vdmVkIHRyYWlsaW5nIGJsYW5rcyBpbiBzb3VyY2UgZmlsZXMuCi12ZXJzaW9uIDEuMC41aSBbRGVjZW1iZXIgMTMsIDE5OTldCi0gIEFkZGVkIHNvbWUgdHlwZSBjYXN0cyB0byBzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdzLgotICBSZW5hbWVkICJwbmdfZnJlZV9zcGFsZXR0ZSIgdG8gInBuZ19mcmVlX3NwYWxldHRlcyIgZm9yIGNvbnNpc3RlbmN5LgotICBSZW1vdmVkIGxlYWRpbmcgYmxhbmtzIGZyb20gYSAjZGVmaW5lIGluIHBuZ3ZjcmQuYwotICBBZGRlZCBzb21lIHBhcmFtZXRlcnMgdG8gdGhlIG5ldyBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSBmdW5jdGlvbi4KLSAgQWRkZWQgYSB0ZXN0IGZvciB1cC0+bG9jYXRpb24gIT0gMCBpbiB0aGUgZmlyc3QgaW5zdGFuY2Ugb2Ygd3JpdGluZwotICAgIHVua25vd24gY2h1bmtzIGluIHBuZ3dyaXRlLmMKLSAgQ2hhbmdlZCAibnVtIiB0byAiaSIgaW4gcG5nX2ZyZWVfc3BhbGV0dGVzKCkgYW5kIHBuZ19mcmVlX3Vua25vd25zKCkgdG8KLSAgICBwcmV2ZW50IHJlY3Vyc2lvbi4KLSAgQWRkZWQgcG5nX2ZyZWVfaElTVCgpIGZ1bmN0aW9uLgotICBWYXJpb3VzIHBhdGNoZXMgdG8gZml4IGJ1Z3MgaW4gdGhlIHNDQUwgYW5kIGludGVnZXIgY0hSTSBwcm9jZXNzaW5nLAotICAgIGFuZCB0byBhZGQgc29tZSBjb252ZW5pZW5jZSBtYWNyb3MgZm9yIHVzZSB3aXRoIHNDQUwuCi12ZXJzaW9uIDEuMC41aiBbRGVjZW1iZXIgMjEsIDE5OTldCi0gIENoYW5nZWQgInVuaXQiIHBhcmFtZXRlciBvZiBwbmdfd3JpdGVfc0NBTCBmcm9tIHBuZ19ieXRlIHRvIGludCwgdG8gd29yawotICAgIGFyb3VuZCBidWdneSBjb21waWxlcnMuCi0gIEFkZGVkIG5ldyB0eXBlICJwbmdfZml4ZWRfcG9pbnQiIGZvciBpbnRlZ2VycyB0aGF0IGhvbGQgZmxvYXQqMTAwMDAwIHZhbHVlcwotICBSZXN0b3JlZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9mIHRFWHQvelRYdCBjaHVuayBwcm9jZXNzaW5nOgotICAgIFJlc3RvcmVkIHRoZSBmaXJzdCBmb3VyIG1lbWJlcnMgb2YgcG5nX3RleHQgdG8gdGhlIHNhbWUgb3JkZXIgYXMgdi4xLjAuNWQuCi0gICAgQWRkZWQgbWVtYmVycyAibGFuZ19rZXkiIGFuZCAiaXR4dF9sZW5ndGgiIHRvIHBuZ190ZXh0IHN0cnVjdC4gIFNldAotICAgIHRleHRfbGVuZ3RoPTAgd2hlbiAidGV4dCIgY29udGFpbnMgaVRYdCBkYXRhLiAgVXNlIHRoZSAiY29tcHJlc3Npb24iCi0gICAgbWVtYmVyIHRvIGRpc3Rpbmd1aXNoIGFtb25nIHRFWHQvelRYdC9pVFh0IHR5cGVzLiAgQWRkZWQKLSAgICBQTkdfSVRYVF9DT01QUkVTU0lPTl9OT05FICgxKSBhbmQgUE5HX0lUWFRfQ09NUFJFU1NJT05felRYdCgyKSBtYWNyb3MuCi0gICAgVGhlICJOb3RlIiBhYm92ZSwgYWJvdXQgYmFja3dhcmQgaW5jb21wYXRpYmlsaXR5IG9mIGxpYnBuZy0xLjAuNWUsIG5vCi0gICAgbG9uZ2VyIGFwcGxpZXMuCi0gIEZpeGVkIHBuZ19yZWFkfHdyaXRlX2lUWHQoKSB0byByZWFkfHdyaXRlIHBhcmFtZXRlcnMgaW4gdGhlIHJpZ2h0IG9yZGVyLAotICAgIGFuZCB0byB3cml0ZSB0aGUgaVRYdCBjaHVuayBhZnRlciBJREFUIGlmIGl0IGFwcGVhcnMgaW4gdGhlIGVuZF9wdHIuCi0gIEFkZGVkIHBuZ2djY3JkLmMsIHZlcnNpb24gb2YgcG5ndmNyZC5jIEludGVsIGFzc2VtYmxlciBmb3IgZ2NjIChHcmVnIFJvZWxvZnMpCi0gIFJldmVyc2VkIHRoZSBvcmRlciBvZiB0cnlpbmcgdG8gd3JpdGUgZmxvYXRpbmctcG9pbnQgYW5kIGZpeGVkLXBvaW50IGdBTUEuCi12ZXJzaW9uIDEuMC41ayBbRGVjZW1iZXIgMjcsIDE5OTldCi0gIEFkZGVkIG1hbnkgcGFyZW50aGVzZXMsIGUuZy4sICJpZiAoYSAmJiBiICYgYykiIGJlY29tZXMgImlmIChhICYmIChiICYgYykpIgotICBBZGRlZCBwbmdfaGFuZGxlX2FzX3Vua25vd24oKSBmdW5jdGlvbiAoR2xlbm4pCi0gIEFkZGVkIHBuZ19mcmVlX2NodW5rX2xpc3QoKSBmdW5jdGlvbiBhbmQgY2h1bmtfbGlzdCBhbmQgbnVtX2NodW5rX2xpc3QgbWVtYmVycwotICAgIG9mIHBuZ19wdHIuCi0gIEVsaW1pbmF0ZWQgZXJyb25lb3VzIHdhcm5pbmdzIGFib3V0IG11bHRpcGxlIHNQTFQgY2h1bmtzIGFuZCBzUExULWFmdGVyLVBMVEUuCi0gIEZpeGVkIGEgbGlicG5nLTEuMC41aCBidWcgaW4gcG5ncnV0aWwuYyB0aGF0IHdhcyBpc3N1aW5nIGVycm9uZW91cyB3YXJuaW5ncwotICAgIGFib3V0IGlnbm9yaW5nIGluY29ycmVjdCBnQU1BIHdpdGggc1JHQiAoZ0FNQSB3YXMgaW4gZmFjdCBub3QgaWdub3JlZCkKLSAgQWRkZWQgcG5nX2ZyZWVfdFJOUygpOyBwbmdfc2V0X3RSTlMoKSBub3cgbWFsbG9jJ3MgaXRzIG93biB0cmFucyBhcnJheSAoRVNSKS4KLSAgRGVmaW5lIHBuZ19nZXRfaW50XzMyIHdoZW4gb0ZGcyBjaHVuayBpcyBzdXBwb3J0ZWQgYXMgd2VsbCBhcyB3aGVuIHBDQUwgaXMuCi0gIENoYW5nZWQgdHlwZSBvZiBwcm9mbGVuIGZyb20gcG5nX2ludF8zMiB0byBwbmdfdWludF8zMiBpbiBwbmdfZ2V0X2lDQ1AoKS4KLXZlcnNpb24gMS4wLjVsIFtKYW51YXJ5IDEsIDIwMDBdCi0gIEFkZGVkIGZ1bmN0aW9ucyBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbigpIGFuZCBwbmdfZ2V0X3VzZXJfY2h1bmtfcHRyKCkKLSAgICBmb3Igc2V0dGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSB1bmtub3duIGNodW5rcyBhbmQgZm9yCi0gICAgcmV0cmlldmluZyB0aGUgYXNzb2NpYXRlZCB1c2VyIHBvaW50ZXIgKEdsZW5uKS4KLXZlcnNpb24gMS4wLjVtIFtKYW51YXJ5IDcsIDIwMDBdCi0gIEFkZGVkIGhpZ2gtbGV2ZWwgZnVuY3Rpb25zIHBuZ19yZWFkX3BuZygpLCBwbmdfd3JpdGVfcG5nKCksIHBuZ19mcmVlX3BpeGVscygpLgotdmVyc2lvbiAxLjAuNW4gW0phbnVhcnkgOSwgMjAwMF0KLSAgQWRkZWQgcG5nX2ZyZWVfUExURSgpIGZ1bmN0aW9uLCBhbmQgbW9kaWZpZWQgcG5nX3NldF9QTFRFKCkgdG8gbWFsbG9jIGl0cwotICAgIG93biBtZW1vcnkgZm9yIGluZm9fcHRyLT5wYWxldHRlLiAgVGhpcyBtYWtlcyBpdCBzYWZlIGZvciB0aGUgY2FsbGluZwotICAgIGFwcGxpY2F0aW9uIHRvIGZyZWUgaXRzIGNvcHkgb2YgdGhlIHBhbGV0dGUgYW55IHRpbWUgYWZ0ZXIgaXQgY2FsbHMKLSAgICBwbmdfc2V0X1BMVEUoKS4KLXZlcnNpb24gMS4wLjVvIFtKYW51YXJ5IDIwLCAyMDAwXQotICBDb3NtZXRpYyBjaGFuZ2VzIG9ubHkgKHJlbW92ZWQgc29tZSB0cmFpbGluZyBibGFua3MgYW5kIFRBQnMpCi12ZXJzaW9uIDEuMC41cCBbSmFudWFyeSAzMSwgMjAwMF0KLSAgUmVuYW1lZCBwbmdkbGwubWFrIHRvIG1ha2VmaWxlLmJkMzIKLSAgQ29zbWV0aWMgY2hhbmdlcyBpbiBwbmd0ZXN0LmMKLXZlcnNpb24gMS4wLjVxIFtGZWJydWFyeSA1LCAyMDAwXQotICBSZWxvY2F0ZWQgdGhlIG1ha2VmaWxlLnNvbGFyaXMgd2FybmluZyBhYm91dCBQQVRIIHByb2JsZW1zLgotICBGaXhlZCBwbmd2Y3JkLmMgYnVnIGJ5IHB1c2hpbmcvcG9wcGluZyByZWdpc3RlcnMgaW4gbW14c3VwcG9ydCAoQnJ1Y2UgT2JlcmcpCi0gIFJldmlzZWQgbWFrZWZpbGUuZ2NtbXgKLSAgQWRkZWQgUE5HX1NFVEpNUF9TVVBQT1JURUQsIFBOR19TRVRKTVBfTk9UX1NVUFBPUlRFRCwgYW5kIFBOR19BQk9SVCgpIG1hY3JvcwotdmVyc2lvbiAxLjAuNXIgW0ZlYnJ1YXJ5IDcsIDIwMDBdCi0gIFJlbW92ZWQgc3VwZXJmbHVvdXMgcHJvdG90eXBlIGZvciBwbmdfZ2V0X2l0eHQgZnJvbSBwbmcuaAotICBGaXhlZCBhIGJ1ZyBpbiBwbmdydHJhbi5jIHRoYXQgaW1wcm9wZXJseSBleHBhbmRlZCB0aGUgYmFja2dyb3VuZCBjb2xvci4KLSAgUmV0dXJuICpudW1fdGV4dD0wIGZyb20gcG5nX2dldF90ZXh0KCkgd2hlbiBhcHByb3ByaWF0ZSwgYW5kIGZpeCBkb2N1bWVudGF0aW9uCi0gICAgb2YgcG5nX2dldF90ZXh0KCkgaW4gbGlicG5nLnR4dC9saWJwbmcuMy4KLXZlcnNpb24gMS4wLjVzIFtGZWJydWFyeSAxOCwgMjAwMF0KLSAgQWRkZWQgInBuZ19qbXBfZW52KCkiIG1hY3JvIHRvIHBuZ2NvbmYuaCwgdG8gaGVscCBwZW9wbGUgbWlncmF0ZSB0byB0aGUKLSAgICBuZXcgZXJyb3IgaGFuZGxlciB0aGF0J3MgcGxhbm5lZCBmb3IgdGhlIG5leHQgbGlicG5nIHJlbGVhc2UsIGFuZCBjaGFuZ2VkCi0gICAgZXhhbXBsZS5jLCBwbmd0ZXN0LmMsIGFuZCBjb250cmliIHByb2dyYW1zIHRvIHVzZSB0aGlzIG1hY3JvLgotICBSZXZpc2VkIHNvbWUgb2YgdGhlIERMTC1leHBvcnQgbWFjcm9zIGluIHBuZ2NvbmYuaCAoR3JlZyBSb2Vsb2ZzKQotICBGaXhlZCBhIGJ1ZyBpbiBwbmdfcmVhZF9wbmcoKSB0aGF0IGNhdXNlZCBpdCB0byBmYWlsIHRvIGV4cGFuZCBzb21lIGltYWdlcwotICAgIHRoYXQgaXQgc2hvdWxkIGhhdmUgZXhwYW5kZWQuCi0gIEZpeGVkIHNvbWUgbWlzdGFrZXMgaW4gdGhlIHVudXNlZCBhbmQgdW5kb2N1bWVudGVkIElOQ0hfQ09OVkVSU0lPTlMgZnVuY3Rpb25zCi0gICAgaW4gcG5nZ2V0LmMKLSAgQ2hhbmdlZCB0aGUgYWxsb2NhdGlvbiBvZiBwYWxldHRlLCBoaXN0b3J5LCBhbmQgdHJhbnMgYXJyYXlzIGJhY2sgdG8KLSAgICB0aGUgdmVyc2lvbiAxLjAuNSBtZXRob2QgKGxpbmtpbmcgaW5zdGVhZCBvZiBjb3B5aW5nKSB3aGljaCByZXN0b3JlcwotICAgIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9uIDEuMC41LiAgQWRkZWQgc29tZSByZW1hcmtzIGFib3V0Ci0gICAgdGhhdCBpbiBleGFtcGxlLmMuICBBZGRlZCAiZnJlZV9tZSIgbWVtYmVyIHRvIGluZm9fcHRyIGFuZCBwbmdfcHRyCi0gICAgYW5kIGFkZGVkIHBuZ19mcmVlX2RhdGEoKSBmdW5jdGlvbi4KLSAgVXBkYXRlZCBtYWtlZmlsZS5saW51eCBhbmQgbWFrZWZpbGUuZ2NjbW14IHRvIG1ha2UgZGlyZWN0b3JpZXMgY29uZGl0aW9uYWxseS4KLSAgTWFkZSBjb3NtZXRpYyBjaGFuZ2VzIHRvIHBuZ2FzbXJkLmgKLSAgQWRkZWQgcG5nX3NldF9yb3dzKCkgYW5kIHBuZ19nZXRfcm93cygpLCBmb3IgdXNlIHdpdGggcG5nX3JlYWR8d3JpdGVfcG5nKCkuCi0gIE1vZGlmaWVkIHBuZ19yZWFkX3BuZygpIHRvIGFsbG9jYXRlIGluZm9fcHRyLT5yb3dfcG9pbnRlcnMgb25seSBpZiBpdAotICAgIGhhc24ndCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLgotdmVyc2lvbiAxLjAuNXQgW01hcmNoIDQsIDIwMDBdCi0gIENoYW5nZWQgcG5nX2ptcF9lbnYoKSBtaWdyYXRpb24gYWlkaW5nIG1hY3JvIHRvIHBuZ19qbXBidWYoKS4KLSAgRml4ZWQgImludGVybGFjZSIgdHlwbyAoc2hvdWxkIGJlICJpbnRlcmxhY2VkIikgaW4gY29udHJpYi9ncmVnYm9vay9yZWFkMi14LmMKLSAgRml4ZWQgYnVnIHdpdGggdXNlIG9mIFBOR19CRUZPUkVfSUhEUiBiaXQgaW4gcG5nX3B0ci0+bW9kZSwgaW50cm9kdWNlZCB3aGVuCi0gICAgUE5HX0ZMQUdfSEFWRV9DSFVOS19IRUFERVIgd2FzIG1vdmVkIGludG8gcG5nX3B0ci0+bW9kZSBpbiB2ZXJzaW9uIDEuMC41YgotICBGaWxlcyBpbiBjb250cmliL2dyZWdib29rIHdlcmUgcmV2aXNlZCB0byB1c2UgcG5nX2ptcGJ1ZigpIGFuZCB0byBzZWxlY3QKLSAgICBhIDI0LWJpdCB2aXN1YWwgaWYgb25lIGlzIGF2YWlsYWJsZSwgYW5kIHRvIGFsbG93IGFiYnJldmlhdGVkIG9wdGlvbnMuCi0gIEZpbGVzIGluIGNvbnRyaWIvcG5nbWludXMgd2VyZSByZXZpc2VkIHRvIHVzZSB0aGUgcG5nX2ptcGJ1ZigpIG1hY3JvLgotICBSZW1vdmVkIHNwYWNlcyBpbiBtYWtlZmlsZS5saW51eCBhbmQgbWFrZWZpbGUuZ2NtbXgsIGludHJvZHVjZWQgaW4gMS4wLjVzCi12ZXJzaW9uIDEuMC41dSBbTWFyY2ggNSwgMjAwMF0KLSAgU2ltcGxpZmllZCB0aGUgY29kZSB0aGF0IGRldGVjdHMgb2xkIHBuZy5oIGluIHBuZy5jIGFuZCBwbmd0ZXN0LmMKLSAgUmVuYW1lZCBwbmdfc3BhbGV0dGUgKF9wLCBfcHApIHRvIHBuZ19zUExUX3QgKF90cCwgX3RwcCkKLSAgSW5jcmVhc2VkIHByZWNpc2lvbiBvZiByZ2JfdG9fZ3JheSBjYWxjdWxhdGlvbnMgZnJvbSA4IHRvIDE1IGJpdHMgYW5kCi0gICAgYWRkZWQgcG5nX3NldF9yZ2JfdG9fZ3JheV9maXhlZCgpIGZ1bmN0aW9uLgotICBBZGRlZCBtYWtlZmlsZS5iYzMyICgzMi1iaXQgQm9ybGFuZCBDKyssIEMgbW9kZSkKLXZlcnNpb24gMS4wLjV2IFtNYXJjaCAxMSwgMjAwMF0KLSAgQWRkZWQgc29tZSBwYXJlbnRoZXNlcyB0byB0aGUgcG5nX2ptcGJ1ZiBtYWNybyBkZWZpbml0aW9uLgotICBVcGRhdGVkIHJlZmVyZW5jZXMgdG8gdGhlIHpsaWIgaG9tZSBwYWdlLCB3aGljaCBoYXMgbW92ZWQgdG8gZnJlZXNvZnR3YXJlLmNvbS4KLSAgQ29ycmVjdGVkIGJ1Z3MgaW4gZG9jdW1lbnRhdGlvbiByZWdhcmRpbmcgcG5nX3JlYWRfcm93KCkgYW5kIHBuZ193cml0ZV9yb3coKS4KLSAgVXBkYXRlZCBkb2N1bWVudGF0aW9uIG9mIHBuZ19yZ2JfdG9fZ3JheSBjYWxjdWxhdGlvbnMgaW4gbGlicG5nLjMvbGlicG5nLnR4dC4KLSAgUmVuYW1lZCBtYWtlZmlsZS5ib3JsYW5kLHR1cmJvYzMgYmFjayB0byBtYWtlZmlsZS5ib3IsdGMzIGFzIGluIHZlcnNpb24gMS4wLjMsCi0gICAgcmV2aXNlZCBib3JsYW5kIG1ha2VmaWxlczsgYWRkZWQgbWFrZWZpbGUuaWJtdmFjMyBhbmQgbWFrZWZpbGUuZ2NjIChDb3NtaW4pCi0KLXZlcnNpb24gMS4wLjYgW01hcmNoIDIwLCAyMDAwXQotICBNaW5vciByZXZpc2lvbnMgb2YgbWFrZWZpbGUuYm9yLCBsaWJwbmcudHh0LCBhbmQgZ3JlZ2Jvb2svcnBuZzItd2luLmMKLSAgQWRkZWQgbWFrZWZpbGUuc2dnY2MgKFNHSSBJUklYIHdpdGggZ2NjKQotdmVyc2lvbiAxLjAuNmQgW0FwcmlsIDcsIDIwMDBdCi0gIENoYW5nZWQgc3ByaW50ZigpIHRvIHN0cmNweSgpIGluIHBuZ193cml0ZV9zQ0FMX3MoKSB0byB3b3JrIHdpdGhvdXQgU1RESU8KLSAgQWRkZWQgZGF0YV9sZW5ndGggcGFyYW1ldGVyIHRvIHBuZ19kZWNvbXByZXNzX2NodW5rKCkgZnVuY3Rpb24KLSAgUmV2aXNlZCBkb2N1bWVudGF0aW9uIHRvIHJlbW92ZSByZWZlcmVuY2UgdG8gYWJhbmRvbmVkIHBuZ19mcmVlX2NobmsgZnVuY3Rpb25zCi0gIEZpeGVkIGFuIGVycm9yIGluIHBuZ19yZ2JfdG9fZ3JheV9maXhlZCgpCi0gIFJldmlzZWQgZXhhbXBsZS5jLCB1c2FnZSBvZiBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKS4KLSAgUmVuYW1lZCBtYWtlZmlsZS5pYm12YWMzIHRvIG1ha2VmaWxlLmlibWMsIGFkZGVkIGxpYnBuZy5pY2MgSUJNIHByb2plY3QgZmlsZQotICBBZGRlZCBhIGNoZWNrIGZvciBpbmZvX3B0ci0+ZnJlZV9tZSZQTkdfRlJFRV9URVhUIHdoZW4gZnJlZWluZyB0ZXh0IGluIHBuZy5jCi0gIFNpbXBsaWZ5IHBuZ19zaWdfYnl0ZXMoKSBmdW5jdGlvbiB0byByZW1vdmUgdXNlIG9mIG5vbi1JU08tQyBzdHJkdXAoKS4KLXZlcnNpb24gMS4wLjZlIFtBcHJpbCA5LCAyMDAwXQotICBBZGRlZCBwbmdfZGF0YV9mcmVlcigpIGZ1bmN0aW9uLgotICBJbiB0aGUgY29kZSB0aGF0IGNoZWNrcyBmb3Igb3Zlci1sZW5ndGggdFJOUyBjaHVua3MsIGFkZGVkIGNoZWNrIG9mCi0gICAgaW5mb19wdHItPm51bV90cmFucyBhcyB3ZWxsIGFzIHBuZ19wdHItPm51bV90cmFucyAoTWF0dGhpYXMgQmVuY2ttYW5uKQotICBNaW5vciByZXZpc2lvbnMgb2YgbGlicG5nLnR4dC9saWJwbmcuMy4KLSAgQ2hlY2sgZm9yIGV4aXN0aW5nIGRhdGEgYW5kIGZyZWUgaXQgaWYgdGhlIGZyZWVfbWUgZmxhZyBpcyBzZXQsIGluIHBuZ19zZXRfKigpCi0gICAgYW5kIHBuZ19oYW5kbGVfKigpLgotICBPbmx5IGRlZmluZSBQTkdfV0VJR0hURURfRklMVEVSU19TVVBQT1JURUQgd2hlbiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICAgaXMgZGVmaW5lZC4KLSAgQ2hhbmdlZCBzZXZlcmFsIGluc3RhbmNlcyBvZiBQTkdfTk9fQ09OU09MRV9JRCB0byBQTkdfTk9fU1RESU8gaW4gcG5ncnV0aWwuYwotICAgIGFuZCBtZW50aW9uZWQgdGhlIHB1cnBvc2VzIG9mIHRoZSB0d28gbWFjcm9zIGluIGxpYnBuZy50eHQvbGlicG5nLjMuCi12ZXJzaW9uIDEuMC42ZiBbQXByaWwgMTQsIDIwMDBdCi0gIFJldmlzZWQgcG5nX3NldF9pQ0NQKCkgYW5kIHBuZ19zZXRfcm93cygpIHRvIGF2b2lkIHByZW1hdHVyZWx5IGZyZWVpbmcgZGF0YS4KLSAgQWRkIGNoZWNrcyBpbiBwbmdfc2V0X3RleHQoKSBmb3IgTlVMTCBtZW1iZXJzIG9mIHRoZSBpbnB1dCB0ZXh0IHN0cnVjdHVyZS4KLSAgUmV2aXNlZCBsaWJwbmcudHh0L2xpYnBuZy4zLgotICBSZW1vdmVkIHN1cGVyZmx1b3VzIHByb3RvdHlwZSBmb3IgcG5nX3NldF9pdHh0IGZyb20gcG5nLmgKLSAgUmVtb3ZlZCAiZWxzZSIgZnJvbSBwbmdyZWFkLmMsIGFmdGVyIHBuZ19lcnJvcigpLCBhbmQgY2hhbmdlZCAiMCIgdG8gImxlbmd0aCIuCi0gIENoYW5nZWQgc2V2ZXJhbCBwbmdfZXJyb3JzIGFib3V0IG1hbGZvcm1lZCBhbmNpbGxhcnkgY2h1bmtzIHRvIHBuZ193YXJuaW5ncy4KLXZlcnNpb24gMS4wLjZnIFtBcHJpbCAyNCwgMjAwMF0KLSAgQWRkZWQgcG5nX3Bhc3MtKiBhcnJheXMgdG8gcG5nZ2NjcmQuYyB3aGVuIFBOR19VU0VfTE9DQUxfQVJSQVlTIGlzIGRlZmluZWQuCi0gIFJlbG9jYXRlZCBwYXJhZ3JhcGggYWJvdXQgcG5nX3NldF9iYWNrZ3JvdW5kKCkgaW4gbGlicG5nLjMvbGlicG5nLnR4dAotICAgIGFuZCBvdGhlciByZXZpc2lvbnMgKE1hdHRoaWFzIEJlbmNrbWFubikKLSAgUmVsb2NhdGVkIGluZm9fcHRyLT5mcmVlX21lLCBwbmdfcHRyLT5mcmVlX21lLCBhbmQgb3RoZXIgaW5mb19wdHIgYW5kCi0gICAgcG5nX3B0ciBtZW1iZXJzIHRvIHJlc3RvcmUgYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aCBsaWJwbmctMS4wLjUKLSAgICAoYnJlYWtzIGNvbXBhdGliaWxpdHkgd2l0aCBsaWJwbmctMS4wLjYpLgotdmVyc2lvbiAxLjAuNmggW0FwcmlsIDI0LCAyMDAwXQotICBDaGFuZ2VkIHNoYXJlZCBsaWJyYXJ5IHNvLW51bWJlciBwYXR0ZXJuIGZyb20gMi54LnkueiB0byB4eS56ICh0aGlzIGJ1aWxkcwotICAgIGxpYnBuZy5zby4xMCAmIGxpYnBuZy5zby4xMC42aCBpbnN0ZWFkIG9mIGxpYnBuZy5zby4yICYgbGlicG5nLnNvLjIuMS4wLjZoKQotICAgIFRoaXMgaXMgYSB0ZW1wb3JhcnkgY2hhbmdlIGZvciB0ZXN0IHB1cnBvc2VzLgotdmVyc2lvbiAxLjAuNmkgW01heSAyLCAyMDAwXQotICBSZWFycmFuZ2VkIHNvbWUgbWVtYmVycyBhdCB0aGUgZW5kIG9mIHBuZ19pbmZvIGFuZCBwbmdfc3RydWN0LCB0byBwdXQKLSAgICB1bmtub3duX2NodW5rc19udW0gYW5kIGZyZWVfbWUgd2l0aGluIHRoZSBvcmlnaW5hbCBzaXplIG9mIHRoZSBwbmdfc3RydWN0cwotICAgIGFuZCBmcmVlX21lLCBwbmdfcmVhZF91c2VyX2ZuLCBhbmQgcG5nX2ZyZWVfZm4gd2l0aGluIHRoZSBvcmlnaW5hbCBwbmdfaW5mbywKLSAgICBiZWNhdXNlIHNvbWUgb2xkIGFwcGxpY2F0aW9ucyBhbGxvY2F0ZSB0aGUgc3RydWN0cyBkaXJlY3RseSBpbnN0ZWFkIG9mCi0gICAgdXNpbmcgcG5nX2NyZWF0ZV8qKCkuCi0gIEFkZGVkIGRvY3VtZW50YXRpb24gb2YgdXNlciBtZW1vcnkgZnVuY3Rpb25zIGluIGxpYnBuZy50eHQvbGlicG5nLjMKLSAgTW9kaWZpZWQgcG5nX3JlYWRfcG5nIHNvIHRoYXQgaXQgd2lsbCB1c2UgdXNlcl9hbGxvY2F0ZWQgcm93X3BvaW50ZXJzCi0gICAgaWYgcHJlc2VudCwgdW5sZXNzIGZyZWVfbWUgZGlyZWN0cyB0aGF0IGl0IGJlIGZyZWVkLCBhbmQgYWRkZWQgZGVzY3JpcHRpb24KLSAgICBvZiB0aGUgdXNlIG9mIHBuZ19zZXRfcm93cygpIGFuZCBwbmdfZ2V0X3Jvd3MoKSBpbiBsaWJwbmcudHh0L2xpYnBuZy4zLgotICBBZGRlZCBQTkdfTEVHQUNZX1NVUFBPUlRFRCBtYWNybywgYW5kICNpZmRlZiBvdXQgYWxsIG5ldyAoc2luY2UgdmVyc2lvbgotICAgIDEuMDApIG1lbWJlcnMgb2YgcG5nX3N0cnVjdCBhbmQgcG5nX2luZm8sIHRvIHJlZ2FpbiBiaW5hcnkgY29tcGF0aWJpbGl0eQotICAgIHdoZW4geW91IGRlZmluZSB0aGlzIG1hY3JvLiAgQ2FwYWJpbGl0aWVzIGxvc3QgaW4gdGhpcyBldmVudAotICAgIGFyZSB1c2VyIHRyYW5zZm9ybXMgKG5ldyBpbiB2ZXJzaW9uIDEuMC4wKSx0aGUgdXNlciB0cmFuc2Zvcm0gcG9pbnRlcgotICAgIChuZXcgaW4gdmVyc2lvbiAxLjAuMiksIHJnYl90b19ncmF5IChuZXcgaW4gMS4wLjUpLCBpQ0NQLCBzQ0FMLCBzUExULAotICAgIHRoZSBoaWdoLWxldmVsIGludGVyZmFjZSwgYW5kIHVua25vd24gY2h1bmtzIHN1cHBvcnQgKGFsbCBuZXcgaW4gMS4wLjYpLgotICAgIFRoaXMgd2FzIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIG9sZCBhcHBsaWNhdGlvbnMgdGhhdCBhbGxvY2F0ZSB0aGUgc3RydWN0cwotICAgIGRpcmVjdGx5IGFzIGF1dGhvcnMgd2VyZSBpbnN0cnVjdGVkIHRvIGRvIGluIGxpYnBuZy0wLjg4IGFuZCBlYXJsaWVyLAotICAgIGluc3RlYWQgb2YgdXNpbmcgcG5nX2NyZWF0ZV8qKCkuCi0gIEFkZGVkIG1vZGVzIFBOR19DUkVBVEVEX1JFQURfU1RSVUNUIGFuZCBQTkdfQ1JFQVRFRF9XUklURV9TVFJVQ1Qgd2hpY2gKLSAgICBjYW4gYmUgdXNlZCB0byBkZXRlY3QgY29kZXMgdGhhdCBkaXJlY3RseSBhbGxvY2F0ZSB0aGUgc3RydWN0cywgYW5kCi0gICAgY29kZSB0byBjaGVjayB0aGVzZSBtb2RlcyBpbiBwbmdfcmVhZF9pbml0KCkgYW5kIHBuZ193cml0ZV9pbml0KCkgYW5kCi0gICAgZ2VuZXJhdGUgYSBsaWJwbmcgZXJyb3IgaWYgdGhlIG1vZGVzIGFyZW4ndCBzZXQgYW5kIFBOR19MRUdBQ1lfU1VQUE9SVEVECi0gICAgd2FzIG5vdCBkZWZpbmVkLgotICBBZGRlZCBtYWtlZmlsZS5pbnRlbCBhbmQgdXBkYXRlZCBtYWtlZmlsZS53YXRjb20gKFBhd2VsIE1yb2NoZW4pCi12ZXJzaW9uIDEuMC42aiBbTWF5IDMsIDIwMDBdCi0gIE92ZXJsb2FkZWQgcG5nX3JlYWRfaW5pdCgpIGFuZCBwbmdfd3JpdGVfaW5pdCgpIHdpdGggbWFjcm9zIHRoYXQgY29udmVydAotICAgIGNhbGxzIHRvIHBuZ19yZWFkX2luaXRfMigpIG9yIHBuZ193cml0ZV9pbml0XzIoKSB0aGF0IGNoZWNrIHRoZSB2ZXJzaW9uCi0gICAgYW5kIHN0cnVjdHVyZSBzaXplcy4KLXZlcnNpb24gMS4wLjdiZXRhMTEgW01heSA3LCAyMDAwXQotICBSZW1vdmVkIHRoZSBuZXcgUE5HX0NSRUFURURfUkVBRF9TVFJVQ1QgYW5kIFBOR19DUkVBVEVEX1dSSVRFX1NUUlVDVCBtb2RlcwotICAgIHdoaWNoIGFyZSBubyBsb25nZXIgdXNlZC4KLSAgRWxpbWluYXRlZCB0aGUgdGhyZWUgbmV3IG1lbWJlcnMgb2YgcG5nX3RleHQgd2hlbiBQTkdfTEVHQUNZX1NVUFBPUlRFRCBpcwotICAgIGRlZmluZWQgb3Igd2hlbiBuZWl0aGVyIFBOR19SRUFEX2lUWHRfU1VQUE9SVEVEIG5vciBQTkdfV1JJVEVfaVRYVF9TVVBQT1JURUQKLSAgICBpcyBkZWZpbmVkLgotICBNYWRlIFBOR19OT19SRUFEfFdSSVRFX2lUWHQgdGhlIGRlZmF1bHQgc2V0dGluZywgdG8gYXZvaWQgbWVtb3J5Ci0gICAgb3ZlcnJ1biB3aGVuIG9sZCBhcHBsaWNhdGlvbnMgZmlsbCB0aGUgaW5mb19wdHItPnRleHQgc3RydWN0dXJlIGRpcmVjdGx5LgotICBBZGRlZCBQTkdBUEkgbWFjcm8sIGFuZCBhZGRlZCBpdCB0byB0aGUgZGVmaW5pdGlvbnMgb2YgYWxsIGV4cG9ydGVkIGZ1bmN0aW9ucy4KLSAgUmVsb2NhdGVkIHZlcnNpb24gbWFjcm8gZGVmaW5pdGlvbnMgYWhlYWQgb2YgdGhlIGluY2x1ZGVzIG9mIHpsaWIuaCBhbmQKLSAgICBwbmdjb25mLmggaW4gcG5nLmguCi12ZXJzaW9uIDEuMC43YmV0YTEyIFtNYXkgMTIsIDIwMDBdCi0gIFJldmlzZWQgcG5nc2V0LmMgdG8gYXZvaWQgYSBwcm9ibGVtIHdpdGggZXhwYW5kaW5nIHRoZSBwbmdfZGVidWcgbWFjcm8uCi0gIERlbGV0ZWQgc29tZSBleHRyYW5lb3VzIGRlZmluZXMgZnJvbSBwbmdjb25mLmgKLSAgTWFkZSBQTkdfTk9fQ09OU09MRV9JTyB0aGUgZGVmYXVsdCBjb25kaXRpb24gd2hlbiBQTkdfQlVJTERfRExMIGlzIGRlZmluZWQuCi0gIFVzZSBNU0MgX1JQVG4gZGVidWdnaW5nIGluc3RlYWQgb2YgZnByaW50ZiBpZiBfTVNDX1ZFUiBpcyBkZWZpbmVkLgotICBBZGRlZCBwbmdfYWNjZXNzX3ZlcnNpb25fbnVtYmVyKCkgZnVuY3Rpb24uCi0gIENoZWNrIGZvciBtYXNrJlBOR19GUkVFX0NITksgKGZvciBURVhULCBTQ0FMLCBQQ0FMKSBpbiBwbmdfZnJlZV9kYXRhKCkuCi0gIEV4cGFuZGVkIGxpYnBuZy4zL2xpYnBuZy50eHQgaW5mb3JtYXRpb24gYWJvdXQgcG5nX2RhdGFfZnJlZXIoKS4KLXZlcnNpb24gMS4wLjdiZXRhMTQgW01heSAxNywgMjAwMF0gKGJldGExMyB3YXMgbm90IHB1Ymxpc2hlZCkKLSAgQ2hhbmdlZCBwbmdnY2NyZC5jIGFuZCBwbmd2Y3JkLmMgdG8gaGFuZGxlIGJhZCBhZGFwdGl2ZSBmaWx0ZXIgdHlwZXMgYXMKLSAgICB3YXJuaW5ncyBpbnN0ZWFkIG9mIGVycm9ycywgYXMgcG5ncnV0aWwuYyBkb2VzLgotICBTZXQgdGhlIFBOR19JTkZPX0lEQVQgdmFsaWQgZmxhZyBpbiBwbmdfc2V0X3Jvd3MoKSBzbyBwbmdfd3JpdGVfcG5nKCkKLSAgICB3aWxsIGFjdHVhbGx5IHdyaXRlIElEQVRzLgotICBNYWRlIHRoZSBkZWZhdWx0IFBOR19VU0VfTE9DQUxfQVJSQVlTIGRlcGVuZCBvbiBQTkdfRExMIGluc3RlYWQgb2YgV0lOMzIuCi0gIE1ha2UgcG5nX2ZyZWVfZGF0YSgpIGlnbm9yZSBpdHMgZmluYWwgcGFyYW1ldGVyIGV4Y2VwdCB3aGVuIGZyZWVpbmcgZGF0YQotICAgIHRoYXQgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzICh0ZXh0LCBzUExULCB1bmtub3ducykuCi0gIEZpeGVkIGEgbmV3IGJ1ZyBpbiBwbmdfc2V0X3Jvd3MoKS4KLSAgUmVtb3ZlZCBpbmZvX3B0ci0+dmFsaWQgdGVzdHMgZnJvbSBwbmdfZnJlZV9kYXRhKCksIGFzIGluIHZlcnNpb24gMS4wLjUuCi0gIEFkZGVkIHBuZ19zZXRfaW52YWxpZCgpIGZ1bmN0aW9uLgotICBGaXhlZCBpbmNvcnJlY3QgaWxsdXN0cmF0aW9ucyBvZiBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKSBpbiBleGFtcGxlLmMuCi12ZXJzaW9uIDEuMC43YmV0YTE1IFtNYXkgMzAsIDIwMDBdCi0gIFJldmlzZWQgdGhlIGRlbGliZXJhdGVseSBlcnJvbmVvdXMgTGludXggc2V0am1wIGNvZGUgaW4gcG5nY29uZi5oIHRvIHByb2R1Y2UKLSAgICBmZXdlciBlcnJvciBtZXNzYWdlcy4KLSAgUmVhcnJhbmdlZCBjaGVja3MgZm9yIFpfT0sgdG8gY2hlY2sgdGhlIG1vc3QgbGlrZWx5IHBhdGggZmlyc3QgaW4gcG5ncHJlYWQuYwotICAgIGFuZCBwbmd3dXRpbC5jLgotICBBZGRlZCBjaGVja3MgaW4gcG5ndGVzdC5jIGZvciBwbmdfY3JlYXRlXyooKSByZXR1cm5pbmcgTlVMTCwgYW5kIG1lbnRpb25lZAotICAgIGluIGxpYnBuZy50eHQvbGlicG5nLjMgdGhlIG5lZWQgZm9yIGFwcGxpY2F0aW9ucyB0byBjaGVjayB0aGlzLgotICBDaGFuZ2VkIG5hbWVzIG9mIHBuZ19kZWZhdWx0XyooKSBmdW5jdGlvbnMgaW4gcG5ndGVzdCB0byBwbmd0ZXN0XyooKS4KLSAgQ2hhbmdlZCByZXR1cm4gdHlwZSBvZiBwbmdfZ2V0X3h8eV9vZmZzZXRfKigpIGZyb20gcG5nX3VpbnRfMzIgdG8gcG5nX2ludF8zMi4KLSAgRml4ZWQgc29tZSBidWdzIGluIHRoZSB1bnVzZWQgUE5HX0lOQ0hfQ09OVkVSU0lPTlMgZnVuY3Rpb25zIGluIHBuZ2dldC5jCi0gIFNldCBlYWNoIHBvaW50ZXIgdG8gTlVMTCBhZnRlciBmcmVlaW5nIGl0IGluIHBuZ19mcmVlX2RhdGEoKS4KLSAgV29ya2VkIGFyb3VuZCBhIHByb2JsZW0gaW4gcG5nY29uZi5oOyBBSVgncyBzdHJpbmdzLmggZGVmaW5lcyBhbiAiaW5kZXgiCi0gICAgbWFjcm8gdGhhdCBjb25mbGljdHMgd2l0aCBsaWJwbmcncyBwbmdfY29sb3JfMTYuaW5kZXguIChEaW1pdHJpIFBhcGFkYXBvdWxvcykKLSAgQWRkZWQgIm1zdmMiIGRpcmVjdG9yeSB3aXRoIE1TVkMrKyBwcm9qZWN0IGZpbGVzIChTaW1vbi1QaWVycmUgQ2FkaWV1eCkuCi12ZXJzaW9uIDEuMC43YmV0YTE2IFtKdW5lIDQsIDIwMDBdCi0gIFJldmlzZWQgdGhlIHdvcmthcm91bmQgb2YgQUlYIHN0cmluZy5oICJpbmRleCIgYnVnLgotICBBZGRlZCBhIGNoZWNrIGZvciBvdmVybGVuZ3RoIFBMVEUgY2h1bmsgaW4gcG5ncnV0aWwuYy4KLSAgQWRkZWQgUE5HX05PX1BPSU5URVJfSU5ERVhJTkcgbWFjcm8gdG8gdXNlIGFycmF5LWluZGV4aW5nIGluc3RlYWQgb2YgcG9pbnRlcgotICAgIGluZGV4aW5nIGluIHBuZ3J1dGlsLmMgYW5kIHBuZ3d1dGlsLmMgdG8gYWNjb21tb2RhdGUgYSBidWdneSBjb21waWxlci4KLSAgQWRkZWQgYSB3YXJuaW5nIGluIHBuZ19kZWNvbXByZXNzX2NodW5rKCkgd2hlbiBpdCBydW5zIG91dCBvZiBkYXRhLCBlLmcuCi0gICAgd2hlbiBpdCB0cmllcyB0byByZWFkIGFuIGVycm9uZW91cyBQaG90b1Nob3AgaUNDUCBjaHVuay4KLSAgQWRkZWQgUE5HX1VTRV9ETEwgbWFjcm8uCi0gIFJldmlzZWQgdGhlIGNvcHlyaWdodC9kaXNjbGFpbWVyL2xpY2Vuc2Ugbm90aWNlLgotICBBZGRlZCBjb250cmliL21zdmN0ZXN0IGRpcmVjdG9yeQotdmVyc2lvbiAxLjAuN3JjMSBbSnVuZSA5LCAyMDAwXQotICBDb3JyZWN0ZWQgdGhlIGRlZmluaXRpb24gb2YgUE5HX1RSQU5TRk9STV9JTlZFUlRfQUxQSEEgICgweDA0MDAgbm90IDB4MDIwMCkKLSAgQWRkZWQgY29udHJpYi92aXN1cG5nIGRpcmVjdG9yeSAoV2lsbGVtIHZhbiBTY2hhaWspCi12ZXJzaW9uIDEuMC43YmV0YTE4IFtKdW5lIDIzLCAyMDAwXQotICBSZXZpc2VkIFBOR0FQSSBkZWZpbml0aW9uLCBhbmQgcG5ndmNyZC5jIHRvIHdvcmsgd2l0aCBfX0dDQ19fCi0gICAgYW5kIGRvIG5vdCByZWRlZmluZSBQTkdBUEkgaWYgaXQgaXMgcGFzc2VkIGluIHZpYSBhIGNvbXBpbGVyIGRpcmVjdGl2ZS4KLSAgUmV2aXNlZCB2aXN1cG5nL1BuZ0ZpbGUuYyB0byByZW1vdmUgcmV0dXJucyBmcm9tIHdpdGhpbiB0aGUgVHJ5IGJsb2NrLgotICBSZW1vdmVkIGxlYWRpbmcgdW5kZXJzY29yZXMgZnJvbSAiX1BOR19IIiBhbmQgIl9QTkdfU0FWRV9CU0RfU09VUkNFIiBtYWNyb3MuCi0gIFVwZGF0ZWQgY29udHJpYi92aXN1cG5nL2NleGNlcHQuaCB0byB2ZXJzaW9uIDEuMC4wLgotICBGaXhlZCBidWdzIGluIHBuZ3dyaXRlLmMgYW5kIHBuZ3d1dGlsLmMgdGhhdCBwcmV2ZW50ZWQgd3JpdGluZyBpQ0NQIGNodW5rcy4KLXZlcnNpb24gMS4wLjdyYzIgW0p1bmUgMjgsIDIwMDBdCi0gIFVwZGF0ZWQgbGljZW5zZSB0byBpbmNsdWRlIGRpc2NsYWltZXJzIHJlcXVpcmVkIGJ5IFVDSVRBLgotICBGaXhlZCAiREpCUFAiIHR5cG8gaW4gcG5nZ2NjcmQuYyBpbnRyb2R1Y2VkIGluIGJldGExOC4KLQotdmVyc2lvbiAxLjAuNyBbSnVseSAxLCAyMDAwXQotICBSZXZpc2VkIHRoZSBkZWZpbml0aW9uIG9mICJ0cmFuc192YWx1ZXMiIGluIGxpYnBuZy4zL2xpYnBuZy50eHQKLXZlcnNpb24gMS4wLjhiZXRhMSBbSnVseSA4LCAyMDAwXQotICBBZGRlZCBwbmdfZnJlZShwbmdfcHRyLCBrZXkpIHR3byBwbGFjZXMgaW4gcG5ncHJlYWQuYyB0byBzdG9wIG1lbW9yeSBsZWFrcy4KLSAgQ2hhbmdlZCBQTkdfTk9fU1RESU8gdG8gUE5HX05PX0NPTlNPTEVfSU8sIHNldmVyYWwgcGxhY2VzIGluIHBuZ3J1dGlsLmMgYW5kCi0gICAgIHBuZ3d1dGlsLmMuCi0gIENoYW5nZWQgUE5HX0VYUE9SVF9WQVIgdG8gdXNlIFBOR19JTVBFWFAsIGluIHBuZ2NvbmYuaC4KLSAgUmVtb3ZlZCB1bnVzZWQgIiNpbmNsdWRlIDxhc3NlcnQuaD4iIGZyb20gcG5nLmMKLSAgQWRkZWQgV2luZG93c0NFIHN1cHBvcnQuCi0gIFJldmlzZWQgcG5nZ2NjcmQuYyB0byB3b3JrIHdpdGggZ2NjLTIuOTUuMiBhbmQgaW4gdGhlIEN5Z3dpbiBlbnZpcm9ubWVudC4KLXZlcnNpb24gMS4wLjhiZXRhMiBbSnVseSAxMCwgMjAwMF0KLSAgQWRkZWQgcHJvamVjdCBmaWxlcyB0byB0aGUgd2luY2UgZGlyZWN0b3J5IGFuZCBtYWRlIGZ1cnRoZXIgcmV2aXNpb25zCi0gICAgIG9mIHBuZ3Rlc3QuYywgcG5ncmlvLmMsIGFuZCBwbmd3aW8uYyBpbiBzdXBwb3J0IG9mIFdpbmRvd3NDRS4KLXZlcnNpb24gMS4wLjhiZXRhMyBbSnVseSAxMSwgMjAwMF0KLSAgT25seSBzZXQgdGhlIFBOR19GTEFHX0ZSRUVfVFJOUyBvciBQTkdfRlJFRV9UUk5TIGZsYWcgaW4gcG5nX2hhbmRsZV90Uk5TKCkKLSAgICAgZm9yIGluZGV4ZWQtY29sb3IgaW5wdXQgZmlsZXMgdG8gYXZvaWQgcG90ZW50aWFsIGRvdWJsZS1mcmVlaW5nIHRyYW5zIGFycmF5Ci0gICAgIHVuZGVyIHNvbWUgdW51c3VhbCBjb25kaXRpb25zOyBwcm9ibGVtIHdhcyBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMS4wLjZmLgotICBGdXJ0aGVyIHJldmlzaW9ucyB0byBwbmd0ZXN0LmMgYW5kIGZpbGVzIGluIHRoZSB3aW5jZSBzdWJkaXJlY3RvcnkuCi12ZXJzaW9uIDEuMC44YmV0YTQgW0p1bHkgMTQsIDIwMDBdCi0gIEFkZGVkIHRoZSBmaWxlcyBwbmdiYXIucG5nIGFuZCBwbmdiYXIuanBnIHRvIHRoZSBkaXN0cmlidXRpb24uCi0gIEFkZGVkIG1ha2VmaWxlLmN5Z3dpbiwgYW5kIGN5Z3dpbiBzdXBwb3J0IGluIHBuZ2NvbmYuaAotICBBZGRlZCBQTkdfTk9fWkFMTE9DX1pFUk8gbWFjcm8gKG1ha2VzIHBuZ196YWxsb2Mgc2tpcCB6ZXJvaW5nIG1lbW9yeSkKLXZlcnNpb24gMS4wLjhyYzEgW0p1bHkgMTYsIDIwMDBdCi0gIFJldmlzZWQgcG5nX2RlYnVnKCkgbWFjcm9zIGFuZCBzdGF0ZW1lbnRzIHRvIGVsaW1pbmF0ZSBjb21waWxlciB3YXJuaW5ncy4KLQotdmVyc2lvbiAxLjAuOCBbSnVseSAyNCwgMjAwMF0KLSAgQWRkZWQgcG5nX2ZsdXNoKCkgaW4gcG5nd3JpdGUuYywgYWZ0ZXIgcG5nX3dyaXRlX0lFTkQoKS4KLSAgVXBkYXRlZCBtYWtlZmlsZS5ocHV4IHRvIGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkuCi12ZXJzaW9uIDEuMC45YmV0YTEgW05vdmVtYmVyIDEwLCAyMDAwXQotICBGaXhlZCB0eXBvIGluIHNjcmlwdHMvbWFrZWZpbGUuaHB1eAotICBVcGRhdGVkIG1ha2V2bXMuY29tIGluIHNjcmlwdHMgYW5kIGNvbnRyaWIvKiBhbmQgY29udHJpYi8qIChNYXJ0aW4gWmluc2VyKQotICBGaXhlZCBzZXFlbmNlLXBvaW50IGJ1ZyBpbiBjb250cmliL3BuZ21pbnVzL3BuZzJwbm0gKE1hcnRpbiBaaW5zZXIpCi0gIENoYW5nZWQgImNkcm9tLmNvbSIgaW4gZG9jdW1lbnRhdGlvbiB0byAibGlicG5nLm9yZyIKLSAgUmV2aXNlZCBwbmdnY2NyZC5jIHRvIGdldCBpdCBhbGwgd29ya2luZywgYW5kIHVwZGF0ZWQgbWFrZWZpbGUuZ2NtbXggKEdyZWcpLgotICBDaGFuZ2VkIHR5cGUgb2YgInBhcmFtcyIgZnJvbSB2b2lkcCB0byBwbmdfdm9pZHAgaW4gcG5nX3JlYWR8d3JpdGVfcG5nKCkuCi0gIE1ha2Ugc3VyZSBQTkdBUEkgYW5kIFBOR19JTVBFWFAgYXJlIGRlZmluZWQgaW4gcG5nY29uZi5oLgotICBSZXZpc2VkIHRoZSAzIGluc3RhbmNlcyBvZiBXUklURUZJTEUgaW4gcG5ndGVzdC5jLgotICBSZWxvY2F0ZWQgIm1zdmMiIGFuZCAid2luY2UiIHByb2plY3Qgc3ViZGlyZWN0b3JpZXMgaW50byAiZGxsIiBzdWJkaXJlY3RvcnkuCi0gIFVwZGF0ZWQgcG5nLnJjIGluIGRsbC9tc3ZjIHByb2plY3QKLSAgUmV2aXNlZCBtYWtlZmlsZS5kZWMgdG8gZGVmaW5lIGFuZCB1c2UgTElCUEFUSCBhbmQgSU5DUEFUSAotICBJbmNyZWFzZWQgc2l6ZSBvZiBnbG9iYWwgcG5nX2xpYnBuZ192ZXJbXSBhcnJheSBmcm9tIDEyIHRvIDE4IGNoYXJzLgotICBNYWRlIGdsb2JhbCBwbmdfbGlicG5nX3ZlcltdLCBwbmdfc2lnW10gYW5kIHBuZ19wYXNzXypbXSBhcnJheXMgY29uc3QuCi0gIFJlbW92ZWQgZHVwbGljYXRlIHBuZ19jcmNfZmluaXNoKCkgZnJvbSBwbmdfaGFuZGxlX2JLR0QoKSBmdW5jdGlvbi4KLSAgQWRkZWQgYSB3YXJuaW5nIHdoZW4gYXBwbGljYXRpb24gY2FsbHMgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBtdWx0aXBsZSB0aW1lcy4KLSAgUmV2aXNlZCBtYWtlZmlsZS5jeWd3aW4KLSAgRml4ZWQgYnVncyBpbiBpQ0NQIHN1cHBvcnQgaW4gcG5ncnV0aWwuYyBhbmQgcG5nd3V0aWwuYy4KLSAgUmVwbGFjZWQgcG5nX3NldF9lbXB0eV9wbHRlX3Blcm1pdHRlZCgpIHdpdGggcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMoKS4KLXZlcnNpb24gMS4wLjliZXRhMiBbTm92ZW1iZXIgMTksIDIwMDBdCi0gIFJlbmFtZWQgdGhlICJkbGwiIHN1YmRpcmVjdG9yeSAicHJvamVjdHMiLgotICBBZGRlZCBib3JsYW5kIHByb2plY3QgZmlsZXMgdG8gInByb2plY3RzIiBzdWJkaXJlY3RvcnkuCi0gIFNldCBWU19GRl9QUkVSRUxFQVNFIGFuZCBWU19GRl9QQVRDSEVEIGZsYWdzIGluIG1zdmMvcG5nLnJjIHdoZW4gYXBwcm9wcmlhdGUuCi0gIEFkZCBlcnJvciBtZXNzYWdlIGluIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUoKSB3aGVuIG1hbGxvYyBmYWlscy4KLXZlcnNpb24gMS4wLjliZXRhMyBbTm92ZW1iZXIgMjMsIDIwMDBdCi0gIFJldmlzZWQgUE5HX0xJQlBOR19CVUlMRF9UWVBFIG1hY3JvIGluIHBuZy5oLCB1c2VkIGluIHRoZSBtc3ZjIHByb2plY3QuCi0gIFJlbW92ZWQgdGhlIHBuZ19mbHVzaCgpIGluIHBuZ3dyaXRlLmMgdGhhdCBjcmFzaGVzIHNvbWUgYXBwbGljYXRpb25zCi0gICAgdGhhdCBkb24ndCBzZXQgcG5nX291dHB1dF9mbHVzaF9mbi4KLSAgQWRkZWQgbWFrZWZpbGUubWFjb3N4IGFuZCBtYWtlZmlsZS5haXggdG8gc2NyaXB0cyBkaXJlY3RvcnkuCi12ZXJzaW9uIDEuMC45YmV0YTQgW0RlY2VtYmVyIDEsIDIwMDBdCi0gIENoYW5nZSBwbmdfY2h1bmtfd2FybmluZyB0byBwbmdfd2FybmluZyBpbiBwbmdfY2hlY2tfa2V5d29yZCgpLgotICBJbmNyZWFzZWQgdGhlIGZpcnN0IHBhcnQgb2YgbXNnIGJ1ZmZlciBmcm9tIDE2IHRvIDE4IGluIHBuZ19jaHVua19lcnJvcigpLgotdmVyc2lvbiAxLjAuOWJldGE1IFtEZWNlbWJlciAxNSwgMjAwMF0KLSAgQWRkZWQgc3VwcG9ydCBmb3IgZmlsdGVyIG1ldGhvZCA2NCAoZm9yIFBORyBkYXRhc3RyZWFtcyBlbWJlZGRlZCBpbiBNTkcpLgotdmVyc2lvbiAxLjAuOWJldGE2IFtEZWNlbWJlciAxOCwgMjAwMF0KLSAgUmV2aXNlZCBwbmdfc2V0X2ZpbHRlcigpIHRvIGFjY2VwdCBmaWx0ZXIgbWV0aG9kIDY0IHdoZW4gYXBwcm9wcmlhdGUuCi0gIEFkZGVkIG5ldyBQTkdfSEFWRV9QTkdfU0lHTkFUVVJFIGJpdCB0byBwbmdfcHRyLT5tb2RlIGFuZCB1c2UgaXQgdG8KLSAgICBoZWxwIHByZXZlbnQgYXBwbGljYXRpb25zIGZyb20gdXNpbmcgTU5HIGZlYXR1cmVzIGluIFBORyBkYXRhc3RyZWFtcy4KLSAgQWRkZWQgcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMoKSBmdW5jdGlvbi4KLSAgUmV2aXNlZCBsaWJwbmcuMy9saWJwbmcudHh0LiAgQ2hhbmdlZCAiZmlsdGVyIHR5cGUiIHRvICJmaWx0ZXIgbWV0aG9kIi4KLXZlcnNpb24gMS4wLjlyYzEgW0RlY2VtYmVyIDIzLCAyMDAwXQotICBSZXZpc2VkIHRlc3QgZm9yIFBOR19IQVZFX1BOR19TSUdOQVRVUkUgaW4gcG5ncnV0aWwuYwotICBGaXhlZCBlcnJvciBoYW5kbGluZyBvZiB1bmtub3duIGNvbXByZXNzaW9uIHR5cGUgaW4gcG5nX2RlY29tcHJlc3NfY2h1bmsoKS4KLSAgSW4gcG5nY29uZi5oLCBkZWZpbmUgX19jZGVjbCB3aGVuIF9NU0NfVkVSIGlzIGRlZmluZWQuCi12ZXJzaW9uIDEuMC45YmV0YTcgW0RlY2VtYmVyIDI4LCAyMDAwXQotICBDaGFuZ2VkIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQgdG8gUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSBzZXZlcmFsIHBsYWNlcy4KLSAgUmV2aXNlZCBtZW1vcnkgbWFuYWdlbWVudCBpbiBwbmdfc2V0X2hJU1QgYW5kIHBuZ19oYW5kbGVfaElTVCBpbiBhIGJhY2t3YXJkCi0gICAgY29tcGF0aWJsZSBtYW5uZXIuICBQTFRFIGFuZCB0Uk5TIHdlcmUgcmV2aXNlZCBzaW1pbGFybHkuCi0gIFJldmlzZWQgdGhlIGlDQ1AgY2h1bmsgcmVhZGVyIHRvIGlnbm9yZSB0cmFpbGluZyBnYXJiYWdlLgotdmVyc2lvbiAxLjAuOWJldGE4IFtKYW51YXJ5IDEyLCAyMDAxXQotICBNb3ZlZCBwbmdhc21yZC5oIGludG8gcG5nY29uZi5oLgotICBJbXByb3ZlZCBoYW5kbGluZyBvZiBvdXQtb2Ytc3BlYyBnYXJiYWdlIGlDQ1AgY2h1bmtzIGdlbmVyYXRlZCBieSBQaG90b1Nob3AuCi12ZXJzaW9uIDEuMC45YmV0YTkgW0phbnVhcnkgMTUsIDIwMDFdCi0gIEFkZGVkIHBuZ19zZXRfaW52YWxpZCwgcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMsIGFuZCBwbmdfbW14X3N1cHBvcnRlZCB0bwotICAgIHdpbmNlIGFuZCBtc3ZjIHByb2plY3QgbW9kdWxlIGRlZmluaXRpb24gZmlsZXMuCi0gIE1pbm9yIHJldmlzaW9uIG9mIG1ha2VmaWxlLmN5Z3dpbi4KLSAgRml4ZWQgYnVnIHdpdGggcHJvZ3Jlc3NpdmUgcmVhZGluZyBvZiBuYXJyb3cgaW50ZXJsYWNlZCBpbWFnZXMgaW4gcG5ncHJlYWQuYwotdmVyc2lvbiAxLjAuOWJldGExMCBbSmFudWFyeSAxNiwgMjAwMV0KLSAgRG8gbm90IHR5cGVkZWYgcG5nX0ZJTEVfcCBpbiBwbmdjb25mLmggd2hlbiBQTkdfTk9fU1RESU8gaXMgZGVmaW5lZC4KLSAgRml4ZWQgInBuZ19tbXhfc3VwcG9ydGVkIiB0eXBvIGluIHByb2plY3QgZGVmaW5pdGlvbiBmaWxlcy4KLXZlcnNpb24gMS4wLjliZXRhMTEgW0phbnVhcnkgMTksIDIwMDFdCi0gIFVwZGF0ZWQgbWFrZWZpbGUuc2dpIHRvIG1ha2Ugc2hhcmVkIGxpYnJhcnkuCi0gIFJlbW92ZWQgcG5nX21teF9zdXBwb3J0KCkgZnVuY3Rpb24gYW5kIGRpc2FibGVkIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECi0gICAgYnkgZGVmYXVsdCwgZm9yIHRoZSBiZW5lZml0IG9mIERMTCBmb3J3YXJkIGNvbXBhdGliaWxpdHkuICBUaGVzZSB3aWxsCi0gICAgYmUgcmUtZW5hYmxlZCBpbiB2ZXJzaW9uIDEuMi4wLgotdmVyc2lvbiAxLjAuOXJjMiBbSmFudWFyeSAyMiwgMjAwMV0KLSAgUmV2aXNlZCBjeWd3aW4gc3VwcG9ydC4KLQotdmVyc2lvbiAxLjAuOSBbSmFudWFyeSAzMSwgMjAwMV0KLSAgQWRkZWQgY2hlY2sgb2YgY3lnd2luJ3MgQUxMX1NUQVRJQyBpbiBwbmdjb25mLmgKLSAgQWRkZWQgIi1ub21teCIgcGFyYW1ldGVyIHRvIGNvbnRyaWIvZ3JlZ2Jvb2svcnBuZzItd2luIGFuZCBycG5nMi14IGRlbW9zLgotdmVyc2lvbiAxLjAuMTBiZXRhMSBbTWFyY2ggMTQsIDIwMDFdCi0gIFJldmlzZWQgbWFrZWZpbGUuZGVjLCBtYWtlZmlsZS5zZ2ksIGFuZCBtYWtlZmlsZS5zZ2djYzsgYWRkZWQgbWFrZWZpbGUuaHBnY2MuCi0gIFJlZm9ybWF0dGVkIGxpYnBuZy4zIHRvIGVsaW1pbmF0ZSBiYWQgbGluZSBicmVha3MuCi0gIEFkZGVkIGNoZWNrcyBmb3IgX21teF9zdXBwb3J0ZWQgaW4gdGhlIHJlYWRfZmlsdGVyX3JvdyBmdW5jdGlvbiBvZiBwbmdnY2NyZC5jCi0gIEFkZGVkIHByb3RvdHlwZSBmb3IgcG5nX21teF9zdXBwb3J0KCkgbmVhciB0aGUgdG9wIG9mIHBuZ2djY3JkLmMKLSAgTW92ZWQgc29tZSBlcnJvciBjaGVja2luZyBmcm9tIHBuZ19oYW5kbGVfSUhEUiB0byBwbmdfc2V0X0lIRFIuCi0gIEFkZGVkIFBOR19OT19SRUFEX1NVUFBPUlRFRCBhbmQgUE5HX05PX1dSSVRFX1NVUFBPUlRFRCBtYWNyb3MuCi0gIFJldmlzZWQgcG5nX21teF9zdXBwb3J0KCkgZnVuY3Rpb24gaW4gcG5nZ2NjcmQuYwotICBSZXN0b3JlZCB2ZXJzaW9uIDEuMC44IFBOR19XUklURV9FTVBUWV9QTFRFX1NVUFBPUlRFRCBiZWhhdmlvciBpbiBwbmd3dXRpbC5jCi0gIEZpeGVkIG1lbW9yeSBsZWFrIGluIGNvbnRyaWIvdmlzdXBuZy9QbmdGaWxlLmMKLSAgRml4ZWQgYnVncyBpbiBwbmdfY29tYmluZV9yb3coKSBpbiBwbmdnY2NyZC5jIGFuZCBwbmd2Y3JkLmMgKEMgdmVyc2lvbikKLSAgQWRkZWQgd2FybmluZ3Mgd2hlbiByZXRyaWV2aW5nIG9yIHNldHRpbmcgZ2FtbWE9MC4KLSAgSW5jcmVhc2VkIHRoZSBmaXJzdCBwYXJ0IG9mIG1zZyBidWZmZXIgZnJvbSAxNiB0byAxOCBpbiBwbmdfY2h1bmtfd2FybmluZygpLgotdmVyc2lvbiAxLjAuMTByYzEgW01hcmNoIDIzLCAyMDAxXQotICBDaGFuZ2VkIGFsbCBpbnN0YW5jZXMgb2YgbWVtY3B5LCBzdHJjcHksIGFuZCBzdHJsZW4gdG8gcG5nX21lbWNweSwgcG5nX3N0cmNweSwKLSAgICBhbmQgcG5nX3N0cmxlbi4KLSAgUmV2aXNlZCBwbmdfbW14X3N1cHBvcnRlZCgpIGZ1bmN0aW9uIGluIHBuZ2djY3JkLmMgdG8gcmV0dXJuIHByb3BlciB2YWx1ZS4KLSAgRml4ZWQgYnVnIGluIHByb2dyZXNzaXZlIHJlYWRpbmcgKHBuZ3ByZWFkLmMpIHdpdGggc21hbGwgaW1hZ2VzIChoZWlnaHQgPCA4KS4KLQotdmVyc2lvbiAxLjAuMTAgW01hcmNoIDMwLCAyMDAxXQotICBEZWxldGVkIGV4dHJhbmVvdXMgc3BhY2UgKGludHJvZHVjZWQgaW4gMS4wLjkpIGZyb20gbGluZSA0MiBvZiBtYWtlZmlsZS5jeWd3aW4KLSAgQWRkZWQgYmVvcyBwcm9qZWN0IGZpbGVzIChDaHJpcyBIZXJib3J0aCkKLXZlcnNpb24gMS4wLjExYmV0YTEgW0FwcmlsIDMsIDIwMDFdCi0gIEFkZGVkIHR5cGUgY2FzdHMgb24gc2V2ZXJhbCBwbmdfbWFsbG9jKCkgY2FsbHMgKERpbWl0cmkgUGFwYWRhcG91bG9zKS4KLSAgUmVtb3ZlZCBhIG5vLWxvbmdlciBuZWVkZWQgQUlYIHdvcmstYXJvdW5kIGZyb20gcG5nY29uZi5oCi0gIENoYW5nZWQgc2V2ZXJhbCAiLy8iIHNpbmdsZS1saW5lIGNvbW1lbnRzIHRvIEMtc3R5bGUgaW4gcG5nZ2NjcmQuYwotdmVyc2lvbiAxLjAuMTFiZXRhMiBbQXByaWwgMTEsIDIwMDFdCi0gIFJlbW92ZWQgUE5HQVBJIGZyb20gc2V2ZXJhbCBmdW5jdGlvbnMgd2hvc2UgcHJvdG90eXBlcyBkaWQgbm90IGhhdmUgUE5HQVBJLgotICBVcGRhdGVkIHNjcmlwdHMvcG5nb3MyLmRlZgotdmVyc2lvbiAxLjAuMTFiZXRhMyBbQXByaWwgMTQsIDIwMDFdCi0gIEFkZGVkIGNoZWNraW5nIHRoZSByZXN1bHRzIG9mIG1hbnkgaW5zdGFuY2VzIG9mIHBuZ19tYWxsb2MoKSBmb3IgTlVMTAotdmVyc2lvbiAxLjAuMTFiZXRhNCBbQXByaWwgMjAsIDIwMDFdCi0gIFVuZGlkIHRoZSBjaGFuZ2VzIGZyb20gdmVyc2lvbiAxLjAuMTFiZXRhMy4gIEFkZGVkIGEgY2hlY2sgZm9yIE5VTEwgcmV0dXJuCi0gICAgZnJvbSB1c2VyJ3MgbWFsbG9jX2ZuKCkuCi0gIFJlbW92ZWQgc29tZSB1c2VsZXNzIHR5cGUgY2FzdHMgb2YgdGhlIE5VTEwgcG9pbnRlci4KLSAgQWRkZWQgbWFrZWZpbGUubmV0YnNkCi0KLXZlcnNpb24gMS4wLjExIFtBcHJpbCAyNywgMjAwMV0KLSAgUmV2aXNlZCBtYWtlZmlsZS5uZXRic2QKLXZlcnNpb24gMS4wLjEyYmV0YTEgW01heSAxNCwgMjAwMV0KLSAgVGVzdCBmb3IgV2luZG93cyBwbGF0Zm9ybSBpbiBwbmdjb25mLmggd2hlbiBpbmNsdWRpbmcgbWFsbG9jLmggKEVtbWFudWVsIEJsb3QpCi0gIFVwZGF0ZWQgbWFrZWZpbGUuY3lnd2luIGFuZCBoYW5kbGluZyBvZiBDeWd3aW4ncyBBTExfU1RBVElDIGluIHBuZ2NvbmYuaAotICBBZGRlZCBzb21lIG5ldmVyLXRvLWJlLWV4ZWN1dGVkIGNvZGUgaW4gcG5nZ2NjcmQuYyB0byBxdWlldCBjb21waWxlciB3YXJuaW5ncy4KLSAgRWxpbWluYXRlZCB0aGUgcG5nX2Vycm9yIGFib3V0IGFwcHMgdXNpbmcgcG5nX3JlYWR8d3JpdGVfaW5pdCgpLiAgSW5zdGVhZCwKLSAgICBsaWJwbmcgd2lsbCByZWFsbG9jYXRlIHRoZSBwbmdfc3RydWN0IGFuZCBpbmZvX3N0cnVjdCBpZiB0aGV5IGFyZSB0b28gc21hbGwuCi0gICAgVGhpcyByZXRhaW5zIGZ1dHVyZSBiaW5hcnkgY29tcGF0aWJpbGl0eSBmb3Igb2xkIGFwcGxpY2F0aW9ucyB3cml0dGVuIGZvcgotICAgIGxpYnBuZy0wLjg4IGFuZCBlYXJsaWVyLgotdmVyc2lvbiAxLjIuMGJldGExIFtNYXkgNiwgMjAwMV0KLSAgQnVtcGVkIERMTE5VTSB0byAyLgotICBSZS1lbmFibGVkIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEIGFuZCBlbmFibGVkIFBOR19BU1NFTUJMRVJfQ09ERV9TVVBQT1JURUQKLSAgICBieSBkZWZhdWx0LgotICBBZGRlZCBydW50aW1lIHNlbGVjdGlvbiBvZiBNTVggZmVhdHVyZXMuCi0gIEFkZGVkIHBuZ19zZXRfc3RyaXBfZXJyb3JfbnVtYmVycyBmdW5jdGlvbiBhbmQgcmVsYXRlZCBtYWNyb3MuCi12ZXJzaW9uIDEuMi4wYmV0YTIgW01heSA3LCAyMDAxXQotICBGaW5pc2hlZCBtZXJnaW5nIDEuMi4wYmV0YTEgd2l0aCB2ZXJzaW9uIDEuMC4xMQotICBBZGRlZCBhIGNoZWNrIGZvciBhdHRlbXB0cyB0byByZWFkIG9yIHdyaXRlIFBMVEUgaW4gZ3JheXNjYWxlIFBORyBkYXRhc3RyZWFtcy4KLXZlcnNpb24gMS4yLjBiZXRhMyBbTWF5IDE3LCAyMDAxXQotICBFbmFibGVkIHVzZXIgbWVtb3J5IGZ1bmN0aW9uIGJ5IGRlZmF1bHQuCi0gIE1vZGlmaWVkIHBuZ19jcmVhdGVfc3RydWN0IHNvIGl0IHBhc3NlcyB1c2VyIG1lbV9wdHIgdG8gdXNlciBtZW1vcnkgYWxsb2NhdG9yLgotICBJbmNyZWFzZWQgcG5nX21uZ19mZWF0dXJlcyBmbGFnIGZyb20gcG5nX2J5dGUgdG8gcG5nX3VpbnRfMzIuCi0gIEJ1bXBlZCBzaGFyZWQtbGlicmFyeSAoc28tbnVtYmVyKSBhbmQgZGxsLW51bWJlciB0byAzLgotdmVyc2lvbiAxLjIuMGJldGE0IFtKdW5lIDIzLCAyMDAxXQotICBDaGVjayBmb3IgbWlzc2luZyBwcm9maWxlIGxlbmd0aCBmaWVsZCBpbiBpQ0NQIGNodW5rIGFuZCBmcmVlIGNodW5rX2RhdGEKLSAgICAgaW4gY2FzZSBvZiB0cnVuY2F0ZWQgaUNDUCBjaHVuay4KLSAgQnVtcGVkIHNoYXJlZC1saWJyYXJ5IG51bWJlciB0byAzIGluIG1ha2VmaWxlLnNnaSBhbmQgbWFrZWZpbGUuc2dnY2MKLSAgQnVtcGVkIGRsbC1udW1iZXIgZnJvbSAyIHRvIDMgaW4gbWFrZWZpbGUuY3lnd2luCi0gIFJldmlzZWQgY29udHJpYi9ncmVnYm9vay9ycG5nKi14LmMgdG8gYXZvaWQgYSBtZW1vcnkgbGVhayBhbmQgdG8gZXhpdCBjbGVhbmx5Ci0gICAgIGlmIHVzZXIgYXR0ZW1wdHMgdG8gcnVuIGl0IG9uIGFuIDgtYml0IGRpc3BsYXkuCi0gIFVwZGF0ZWQgY29udHJpYi9ncmVnYm9vawotICBVc2UgcG5nX21hbGxvYyBpbnN0ZWFkIG9mIHBuZ196YWxsb2MgdG8gYWxsb2NhdGUgcGFsZXR0ZSBpbiBwbmdzZXQuYwotICBVcGRhdGVkIG1ha2VmaWxlLmlibWMKLSAgQWRkZWQgc29tZSB0eXBlY2FzdHMgdG8gZWxpbWluYXRlIGdjYyAzLjAgd2FybmluZ3MuICBDaGFuZ2VkIHByb3RvdHlwZXMKLSAgICAgb2YgcG5nX3dyaXRlX29GRlMgd2lkdGggYW5kIGhlaWdodCBmcm9tIHBuZ191aW50XzMyIHRvIHBuZ19pbnRfMzIuCi0gIFVwZGF0ZWQgZXhhbXBsZS5jCi0gIFJldmlzZWQgcHJvdG90eXBlcyBmb3IgcG5nX2RlYnVnX21hbGxvYyBhbmQgcG5nX2RlYnVnX2ZyZWUgaW4gcG5ndGVzdC5jCi12ZXJzaW9uIDEuMi4wYmV0YTUgW0F1Z3VzdCA4LCAyMDAxXQotICBSZXZpc2VkIGNvbnRyaWIvZ3JlZ2Jvb2sKLSAgUmV2aXNlZCBtYWtlZmlsZS5nY21teAotICBSZXZpc2VkIHBuZ2djY3JkLmMgdG8gY29uZGl0aW9uYWxseSBjb21waWxlIHNvbWUgdGhyZWFkLXVuc2FmZSBjb2RlIG9ubHkKLSAgICAgd2hlbiBQTkdfVEhSRUFEX1VOU0FGRV9PSyBpcyBkZWZpbmVkLgotICBBZGRlZCB0ZXN0cyB0byBwcmV2ZW50IHBuZ3d1dGlsLmMgZnJvbSB3cml0aW5nIGEgYktHRCBvciB0Uk5TIGNodW5rIHdpdGgKLSAgICAgdmFsdWUgZXhjZWVkaW5nIDJeYml0X2RlcHRoLTEKLSAgUmV2aXNlZCBtYWtlZmlsZS5zZ2kgYW5kIG1ha2VmaWxlLnNnZ2NjCi0gIFJlcGxhY2VkIGNhbGxzIHRvIGZwcmludGYoc3RkZXJyLC4uLikgd2l0aCBwbmdfd2FybmluZygpIGluIHBuZ2djY3JkLmMKLSAgUmVtb3ZlZCByZXN0cmljdGlvbiB0aGF0IGRvX2ludmVydF9tb25vIG9ubHkgb3BlcmF0ZSBvbiAxLWJpdCBvcGFxdWUgZmlsZXMKLQotdmVyc2lvbiAxLjIuMCBbU2VwdGVtYmVyIDEsIDIwMDFdCi0gIENoYW5nZWQgYSBwbmdfd2FybmluZygpIHRvIHBuZ19kZWJ1ZygpIGluIHBuZ2djY3JkLmMKLSAgRml4ZWQgY29udHJpYi9ncmVnYm9vay9ycG5nLXguYywgcnBuZzIteC5jIHRvIGF2b2lkIGNyYXNoIHdpdGggWEZyZWVHQygpLgotdmVyc2lvbiAxLjIuMWJldGExIFtPY3RvYmVyIDE5LCAyMDAxXQotICBSZXZpc2VkIG1ha2VmaWxlLnN0ZCBpbiBjb250cmliL3BuZ21pbnVzCi0gIEluY2x1ZGUgYmFja2dyb3VuZF8xIGluIHBuZ19zdHJ1Y3QgcmVnYXJkbGVzcyBvZiBnYW1tYSBzdXBwb3J0LgotICBSZXZpc2VkIG1ha2VmaWxlLm5ldGJzZCBhbmQgbWFrZWZpbGUubWFjb3N4LCBhZGRlZCBtYWtlZmlsZS5kYXJ3aW4uCi0gIFJldmlzZWQgZXhhbXBsZS5jIHRvIHByb3ZpZGUgbW9yZSBkZXRhaWxzIGFib3V0IHVzaW5nIHJvd19jYWxsYmFjaygpLgotdmVyc2lvbiAxLjIuMWJldGEyIFtPY3RvYmVyIDI1LCAyMDAxXQotICBBZGRlZCB0eXBlIGNhc3QgdG8gZWFjaCBOVUxMIGFwcGVhcmluZyBpbiBhIGZ1bmN0aW9uIGNhbGwsIGV4Y2VwdCBmb3IKLSAgICBXSU5DRSBmdW5jdGlvbnMuCi0gIEFkZGVkIG1ha2VmaWxlLnNvOS4KLXZlcnNpb24gMS4yLjFiZXRhMyBbT2N0b2JlciAyNywgMjAwMV0KLSAgUmVtb3ZlZCB0eXBlIGNhc3RzIGZyb20gYWxsIE5VTExzLgotICBTaW1wbGlmaWVkIHBuZ19jcmVhdGVfc3RydWN0XzIoKS4KLXZlcnNpb24gMS4yLjFiZXRhNCBbTm92ZW1iZXIgNywgMjAwMV0KLSAgUmV2aXNlZCBwbmdfY3JlYXRlX2luZm9fc3RydWN0KCkgYW5kIHBuZ19jcmVhdF9zdHJ1Y3RfMigpLgotICBBZGRlZCBlcnJvciBtZXNzYWdlIGlmIHBuZ193cml0ZV9pbmZvKCkgd2FzIG9taXR0ZWQuCi0gIFR5cGUgY2FzdCBOVUxMcyBhcHBlYXJpbmcgaW4gZnVuY3Rpb24gY2FsbHMgd2hlbiBfTk9fUFJPVE8gb3IKLSAgICBQTkdfVFlQRUNBU1RfTlVMTCBpcyBkZWZpbmVkLgotdmVyc2lvbiAxLjIuMXJjMSBbTm92ZW1iZXIgMjQsIDIwMDFdCi0gIFR5cGUgY2FzdCBOVUxMcyBhcHBlYXJpbmcgaW4gZnVuY3Rpb24gY2FsbHMgZXhjZXB0IHdoZW4gUE5HX05PX1RZUEVDQVNUX05VTEwKLSAgICBpcyBkZWZpbmVkLgotICBDaGFuZ2VkIHR5cGVjYXN0IG9mICJzaXplIiBhcmd1bWVudCB0byBwbmdfc2l6ZV90IGluIHBuZ21lbS5jIGNhbGxzIHRvCi0gICAgdGhlIHVzZXIgbWFsbG9jX2ZuLCB0byBhZ3JlZSB3aXRoIHRoZSBwcm90b3R5cGUgaW4gcG5nLmgKLSAgQWRkZWQgYSBwb3AvcHVzaCBvcGVyYXRpb24gdG8gcG5nZ2NjcmQuYywgdG8gcHJlc2VydmUgRWZsYWcgKE1heGltIFNvYm9sZXYpCi0gIFVwZGF0ZWQgbWFrZWZpbGUuc2dpIHRvIHJlY29nbml6ZSBMSUJQQVRIIGFuZCBJTkNQQVRILgotICBVcGRhdGVkIHZhcmlvdXMgbWFrZWZpbGVzIHNvICJtYWtlIGNsZWFuIiBkb2VzIG5vdCByZW1vdmUgcHJldmlvdXMgbWFqb3IKLSAgICB2ZXJzaW9uIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4KLXZlcnNpb24gMS4yLjFyYzIgW0RlY2VtYmVyIDQsIDIwMDFdCi0gIEFsd2F5cyBhbGxvY2F0ZSAyNTYtZW50cnkgaW50ZXJuYWwgcGFsZXR0ZSwgaGlzdCwgYW5kIHRyYW5zIGFycmF5cywgdG8KLSAgICBhdm9pZCBvdXQtb2YtYm91bmRzIG1lbW9yeSByZWZlcmVuY2UgY2F1c2VkIGJ5IGludmFsaWQgUE5HIGRhdGFzdHJlYW1zLgotICBBZGRlZCBhIGNoZWNrIGZvciBwcmVmaXhfbGVuZ3RoID4gZGF0YV9sZW5ndGggaW4gaUNDUCBjaHVuayBoYW5kbGVyLgotCi12ZXJzaW9uIDEuMi4xIFtEZWNlbWJlciA3LCAyMDAxXQotICBOb25lLgotdmVyc2lvbiAxLjIuMmJldGExIFtGZWJydWFyeSAyMiwgMjAwMl0KLSAgRml4ZWQgYSBidWcgd2l0aCByZWFkaW5nIHRoZSBsZW5ndGggb2YgaUNDUCBwcm9maWxlcyAoTGFycnkgUmVldmVzKS4KLSAgUmV2aXNlZCBtYWtlZmlsZS5saW51eCwgbWFrZWZpbGUuZ2NtbXgsIGFuZCBtYWtlZmlsZS5zZ2kgdG8gZ2VuZXJhdGUKLSAgICBsaWJwbmcuYSwgbGlicG5nMTIuc28gKG5vdCBsaWJwbmcuc28uMyksIGFuZCBsaWJwbmcxMi9wbmcuaAotICBSZXZpc2VkIG1ha2VmaWxlLmRhcndpbiB0byByZW1vdmUgIi11bmRlZmluZWQgc3VwcHJlc3MiIG9wdGlvbi4KLSAgQWRkZWQgY2hlY2tzIGZvciBnYW1tYSBhbmQgY2hyb21hdGljaXR5IHZhbHVlcyBvdmVyIDIxNDc0LjgzLCB3aGljaCBleGNlZWQKLSAgICB0aGUgbGltaXQgZm9yIFBORyB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlcnMgd2hlbiBlbmNvZGVkLgotICBSZXZpc2VkIGNhbGxzIHRvIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoKSBhbmQgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoKQotICAgIGZvciBzaW1wbGVyIGRlYnVnZ2luZy4KLSAgUmV2aXNlZCBwbmdfemFsbG9jKCkgc28gemxpYiBoYW5kbGVzIGVycm9ycyAodXNlcyBQTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0spCi12ZXJzaW9uIDEuMi4yYmV0YTIgW0ZlYnJ1YXJ5IDIzLCAyMDAyXQotICBDaGVjayBjaHVua19sZW5ndGggYW5kIGlkYXRfc2l6ZSBmb3IgaW52YWxpZCAob3ZlciBQTkdfTUFYX1VJTlQpIGxlbmd0aHMuCi0gIENoZWNrIGZvciBpbnZhbGlkIGltYWdlIGRpbWVuc2lvbnMgaW4gcG5nX2dldF9JSERSLgotICBBZGRlZCBtaXNzaW5nICJmaTsiIGluIHRoZSBpbnN0YWxsIHRhcmdldCBvZiB0aGUgU0dJIG1ha2VmaWxlcy4KLSAgQWRkZWQgaW5zdGFsbC1zdGF0aWMgdG8gYWxsIG1ha2VmaWxlcyB0aGF0IG1ha2Ugc2hhcmVkIGxpYnJhcmllcy4KLSAgQWx3YXlzIGRvIGdhbW1hIGNvbXBlbnNhdGlvbiB3aGVuIGltYWdlIGlzIHBhcnRpYWxseSB0cmFuc3BhcmVudC4KLXZlcnNpb24gMS4yLjJiZXRhMyBbTWFyY2ggNywgMjAwMl0KLSAgQ29tcHV0ZSBiYWNrZ3JvdW5kLmdyYXkgYW5kIGJhY2tncm91bmRfMS5ncmF5IGV2ZW4gd2hlbiBjb2xvcl90eXBlIGlzIFJHQgotICAgIGluIGNhc2UgaW1hZ2UgZ2V0cyByZWR1Y2VkIHRvIGdyYXkgbGF0ZXIuCi0gIE1vZGlmaWVkIHNoYXJlZC1saWJyYXJ5IG1ha2VmaWxlcyB0byBpbnN0YWxsIHBrZ2NvbmZpZy9saWJwbmdOTi5wYy4KLSAgRXhwb3J0ICh3aXRoIFBOR0FQSSkgcG5nX3phbGxvYywgcG5nX3pmcmVlLCBhbmQgcG5nX2hhbmRsZV9hc191bmtub3duCi0gIFJlbW92ZWQgdW51c2VkIHBuZ193cml0ZV9kZXN0cm95X2luZm8gcHJvdG90eXBlIGZyb20gcG5nLmgKLSAgRWxpbWluYXRlZCBpbmNvcnJlY3QgdXNlIG9mIHdpZHRoX21teCBmcm9tIHBuZ2djY3JkLmMgaW4gcGl4ZWxfYnl0ZXMgPT0gOCBjYXNlCi0gIEFkZGVkIGluc3RhbGwtc2hhcmVkIHRhcmdldCB0byBhbGwgbWFrZWZpbGVzIHRoYXQgbWFrZSBzaGFyZWQgbGlicmFyaWVzLgotICBTdG9wcGVkIGEgZG91YmxlIGZyZWUgb2YgcGFsZXR0ZSwgaGlzdCwgYW5kIHRyYW5zIHdoZW4gbm90IHVzaW5nIGZyZWVfbWUuCi0gIEFkZGVkIG1ha2VmaWxlLjMyc3VudSBmb3IgU3VuIFVsdHJhIDMyIGFuZCBtYWtlZmlsZS42NHN1bnUgZm9yIFN1biBVbHRyYSA2NC4KLXZlcnNpb24gMS4yLjJiZXRhNCBbTWFyY2ggOCwgMjAwMl0KLSAgQ29tcHV0ZSBiYWNrZ3JvdW5kLmdyYXkgYW5kIGJhY2tncm91bmRfMS5ncmF5IGV2ZW4gd2hlbiBjb2xvcl90eXBlIGlzIFJHQgotICAgIGluIGNhc2UgaW1hZ2UgZ2V0cyByZWR1Y2VkIHRvIGdyYXkgbGF0ZXIgKEphc29uIFN1bW1lcnMpLgotICBSZWxvY2F0ZWQgYSBtaXNwbGFjZWQgL2Jpbi9ybSBpbiB0aGUgImluc3RhbGwtc2hhcmVkIiBtYWtlZmlsZSB0YXJnZXRzCi0gIEFkZGVkIFBOR18xXzBfWCBtYWNybyB3aGljaCBjYW4gYmUgdXNlZCB0byBidWlsZCBhIDEuMC54LWNvbXBhdGlibGUgbGlicmFyeS4KLXZlcnNpb24gMS4yLjJiZXRhNSBbTWFyY2ggMjYsIDIwMDJdCi0gIEFkZGVkIG1pc3NpbmcgUE5HQVBJIHRvIHNldmVyYWwgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCi0gIENoZWNrIGZvciBpbnZhbGlkIGJpdF9kZXB0aCBvciBjb2xvcl90eXBlIGluIHBuZ19nZXRfSUhEUigpLCBhbmQKLSAgICBjaGVjayBmb3IgbWlzc2luZyBQTFRFIG9yIElIRFIgaW4gcG5nX3B1c2hfcmVhZF9jaHVuaygpIChNYXR0aGlhcyBDbGFzZW4pLgotICBSZXZpc2VkIGlUWHQgc3VwcG9ydCB0byBhY2NlcHQgTlVMTCBmb3IgbGFuZyBhbmQgbGFuZ19rZXkuCi0gIENvbXB1dGUgZ2FtbWEgZm9yIGNvbG9yIGNvbXBvbmVudHMgb2YgYmFja2dyb3VuZCBldmVuIHdoZW4gY29sb3JfdHlwZSBpcyBncmF5LgotICBDaGFuZ2VkICIoKSIgdG8gInt9IiBpbiBzY3JpcHRzL2xpYnBuZy5wYy5pbi4KLSAgUmV2aXNlZCBtYWtlZmlsZXMgdG8gcHV0IHBuZy5oIGFuZCBwbmdjb25mLmggb25seSBpbiAkcHJlZml4L2luY2x1ZGUvbGlicG5nTk4KLSAgUmV2aXNlZCBtYWtlZmlsZXMgdG8gbWFrZSBzeW1saW5rIHRvIGxpYnBuZy5zby5OTiBpbiBhZGRpdGlvbiB0byBsaWJwbmdOTi5zbwotdmVyc2lvbiAxLjIuMmJldGE2IFtNYXJjaCAzMSwgMjAwMl0KLXZlcnNpb24gMS4wLjEzYmV0YTEgW01hcmNoIDMxLCAyMDAyXQotICBQcmV2ZW50IHBuZ196YWxsb2MoKSBmcm9tIHRyeWluZyB0byBtZW1zZXQgbWVtb3J5IHRoYXQgaXQgZmFpbGVkIHRvIGFjcXVpcmUuCi0gIEFkZCB0eXBlY2FzdHMgb2YgUE5HX01BWF9VSU5UIGluIHBuZ3NldF9jSFJNX2ZpeGVkKCkgKE1hdHQgSG9sZ2F0ZSkuCi0gIEVuc3VyZSB0aGF0IHRoZSByaWdodCBmdW5jdGlvbiAodXNlciBvciBkZWZhdWx0KSBpcyB1c2VkIHRvIGZyZWUgdGhlCi0gICAgcG5nX3N0cnVjdCBhZnRlciBhbiBlcnJvciBpbiBwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIoKS4KLXZlcnNpb24gMS4yLjJyYzEgW0FwcmlsIDcsIDIwMDJdCi12ZXJzaW9uIDEuMC4xM3JjMSBbQXByaWwgNywgMjAwMl0KLSAgU2F2ZSB0aGUgZWJ4IHJlZ2lzdGVyIGluIHBuZ2djY3JkLmMgKFNhbWkgRmFyaW4pCi0gIEFkZCAibWVtX3B0ciA9IHBuZ19wdHItPm1lbV9wdHIiIGluIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgpIChQYXVsIEdhcmRuZXIpLgotICBVcGRhdGVkIG1ha2VmaWxlcyB0byBwdXQgaGVhZGVycyBpbiBpbmNsdWRlL2xpYnBuZyBhbmQgcmVtb3ZlIG9sZCBpbmNsdWRlLyouaC4KLQotdmVyc2lvbiAxLjIuMiBbQXByaWwgMTUsIDIwMDJdCi12ZXJzaW9uIDEuMC4xMyBbQXByaWwgMTUsIDIwMDJdCi0gIFJldmlzZWQgZGVzY3JpcHRpb24gb2YgcG5nX3NldF9maWx0ZXIoKSBpbiBsaWJwbmcuMy9saWJwbmcudHh0LgotICBSZXZpc2VkIG1ha2VmaWxlLm5ldGJzZCBhbmQgYWRkZWQgbWFrZWZpbGUubmVOTmJzZCBhbmQgbWFrZWZpbGUuZnJlZWJzZAotdmVyc2lvbiAxLjAuMTNwYXRjaDAxIFtBcHJpbCAxNywgMjAwMl0KLXZlcnNpb24gMS4yLjJwYXRjaDAxIFtBcHJpbCAxNywgMjAwMl0KLSAgQ2hhbmdlZCAke1BOR01BSn0uJHtQTkdWRVJ9IGJ1ZyB0byAke1BOR1ZFUn0gaW4gbWFrZWZpbGUuc2dpIGFuZCBtYWtlZmlsZS5zZ2djYwotICBGaXhlZCBWRVIgLT4gUE5HVkVSIHR5cG8gaW4gbWFrZWZpbGUubWFjb3N4IGFuZCBhZGRlZCBpbnN0YWxsLXN0YXRpYyB0byBpbnN0YWxsCi0gIEFkZGVkIGluc3RhbGw6IHRhcmdldCB0byBtYWtlZmlsZS4zMnN1bnUgYW5kIG1ha2VmaWxlLjY0c3VudQotdmVyc2lvbiAxLjAuMTNwYXRjaDAzIFtBcHJpbCAxOCwgMjAwMl0KLXZlcnNpb24gMS4yLjJwYXRjaDAzIFtBcHJpbCAxOCwgMjAwMl0KLSAgUmV2aXNlZCAxNSBtYWtlZmlsZXMgdG8gbGluayBsaWJwbmcuYSB0byBsaWJwbmdOTi5hIGFuZCB0aGUgaW5jbHVkZSBsaWJwbmcKLSAgc3ViZGlyZWN0b3J5IHRvIGxpYnBuZ05OIHN1YmRpcmVjdG9yeSB3aXRob3V0IHRoZSBmdWxsIHBhdGhuYW1lLgotICBNb3ZlZCBnZW5lcmF0aW9uIG9mIGxpYnBuZy5wYyBmcm9tICJpbnN0YWxsIiB0byAiYWxsIiBpbiAxNSBtYWtlZmlsZXMuCi12ZXJzaW9uIDEuMi4zcmMxIFtBcHJpbCAyOCwgMjAwMl0KLSAgQWRkZWQgaW5zdGFsbC1tYW4gdGFyZ2V0IHRvIDE1IG1ha2VmaWxlcyAoRGltaXRyaSBQYXBhZG9wb2xvdXMtT3JmYW5vcykuCi0gIEFkZGVkICQoREVTVERJUikgZmVhdHVyZSB0byAyNCBtYWtlZmlsZXMgKFRpbSBNb29uZXkpCi0gIEZpeGVkIGJ1ZyB3aXRoICRwcmVmaXgsIHNob3VsZCBiZSAkKHByZWZpeCkgaW4gbWFrZWZpbGUuaHB1eC4KLSAgVXBkYXRlZCBjeWd3aW4tc3BlY2lmaWMgcG9ydGlvbiBvZiBwbmdjb25mLmggYW5kIHJldmlzZWQgbWFrZWZpbGUuY3lnd2luCi0gIEFkZGVkIGEgbGluayBmcm9tIGxpYnBuZ05OLnBjIHRvIGxpYnBuZy5wYyBpbiAxNSBtYWtlZmlsZXMuCi0gIEFkZGVkIGxpbmtzIGZyb20gaW5jbHVkZS9saWJwbmdOTi8qLmggdG8gaW5jbHVkZS8qLmggaW4gMjQgbWFrZWZpbGVzLgotICBSZXZpc2VkIG1ha2VmaWxlLmRhcndpbiB0byBtYWtlIHJlbGF0aXZlIGxpbmtzIHdpdGhvdXQgZnVsbCBwYXRobmFtZS4KLSAgQWRkZWQgc2V0am1wKCkgYXQgdGhlIGVuZCBvZiBwbmdfY3JlYXRlXypfc3RydWN0XzIoKSBpbiBjYXNlIHVzZXIgZm9yZ2V0cwotICAgIHRvIHB1dCBvbmUgaW4gdGhlaXIgYXBwbGljYXRpb24uCi0gIFJlc3RvcmVkIHBuZ196YWxsb2MoKSBhbmQgcG5nX3pmcmVlKCkgcHJvdG90eXBlcyB0byB2ZXJzaW9uIDEuMi4xIGFuZAotICAgIHJlbW92ZWQgdGhlbSBmcm9tIG1vZHVsZSBkZWZpbml0aW9uIGZpbGVzLgotdmVyc2lvbiAxLjIuM3JjMiBbTWF5IDEsIDIwMDJdCi0gIEZpeGVkIGJ1ZyBpbiByZXBvcnRpbmcgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHBuZ2dldC5jIGFuZCBwbmdzZXQuYywKLSAgICB0aGF0IHdhcyBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMS4yLjJiZXRhNS4KLSAgRXhwb3J0ZWQgcG5nX3phbGxvYygpLCBwbmdfemZyZWUoKSwgcG5nX2RlZmF1bHRfcmVhZCgpLCBwbmdfZGVmYXVsdF93cml0ZSgpLAotICAgIHBuZ19kZWZhdWx0X2ZsdXNoKCksIGFuZCBwbmdfcHVzaF9maWxsX2J1ZmZlcigpIGFuZCBpbmNsdWRlZCB0aGVtIGluCi0gICAgbW9kdWxlIGRlZmluaXRpb24gZmlsZXMuCi0gIEFkZGVkICJsaWJwbmcucGMiIGRlcGVuZGVuY3kgdG8gdGhlICJpbnN0YWxsLXNoYXJlZCIgdGFyZ2V0IGluIDE1IG1ha2VmaWxlcy4KLXZlcnNpb24gMS4yLjNyYzMgW01heSAxLCAyMDAyXQotICBSZXZpc2VkIHByb3RvdHlwZSBmb3IgcG5nX2RlZmF1bHRfZmx1c2goKQotICBSZW1vdmUgb2xkIGxpYnBuZy5wYyBhbmQgbGlicG5nTk4ucGMgYmVmb3JlIGluc3RhbGxpbmcgbmV3IG9uZXMuCi12ZXJzaW9uIDEuMi4zcmM0IFtNYXkgMiwgMjAwMl0KLSAgVHlwb3MgaW4gKi5kZWYgZmlsZXMgKHBuZ19kZWZhdWx0X3JlYWR8d3JpdGUgLT4gcG5nX2RlZmF1bHRfcmVhZHx3cml0ZV9kYXRhKQotICBJbiBtYWtlZmlsZXMsIGNoYW5nZWQgcm0gbGlicG5nLk5OLnBjIHRvIHJtIGxpYnBuZ05OLnBjCi0gIEFkZGVkIGxpYnBuZy1jb25maWcgYW5kIGxpYnBuZ05OLWNvbmZpZyBhbmQgbW9kaWZpZWQgbWFrZWZpbGVzIHRvIGluc3RhbGwgdGhlbS4KLSAgQ2hhbmdlZCAkKE1BTlBBVEgpIHRvICQoREVTVERJUikkKE1BTlBBVEgpIGluIG1ha2VmaWxlcwotICBBZGRlZCAiV2luMzIgRExMIFZCIiBjb25maWd1cmF0aW9uIHRvIHByb2plY3RzL21zdmMvbGlicG5nLmRzcAotdmVyc2lvbiAxLjIuM3JjNSBbTWF5IDExLCAyMDAyXQotICBDaGFuZ2VkICJlcnJvciIgYW5kICJtZXNzYWdlIiBpbiBwcm90b3R5cGVzIHRvICJlcnJvcl9tZXNzYWdlIiBhbmQKLSAgICAid2FybmluZ19tZXNzYWdlIiB0byBhdm9pZCBuYW1lc3BhY2UgY29uZmxpY3QuCi0gIFJldmlzZWQgMTUgbWFrZWZpbGVzIHRvIGJ1aWxkIGxpYnBuZy1jb25maWcgZnJvbSBsaWJwbmctY29uZmlnLSouaW4KLSAgT25jZSBtb3JlIHJlc3RvcmVkIHBuZ196YWxsb2MgYW5kIHBuZ196ZnJlZSB0byByZWd1bGFyIG5vbmV4cG9ydGVkIGZvcm0uCi0gIFJlc3RvcmVkIHBuZ19kZWZhdWx0X3JlYWR8d3JpdGVfZGF0YSwgcG5nX2RlZmF1bHRfZmx1c2gsIHBuZ19yZWFkX2ZpbGxfYnVmZmVyCi0gICAgdG8gbm9uZXhwb3J0ZWQgZm9ybSwgYnV0IHdpdGggUE5HQVBJLCBhbmQgcmVtb3ZlZCB0aGVtIGZyb20gbW9kdWxlIGRlZiBmaWxlcy4KLXZlcnNpb24gMS4yLjNyYzYgW01heSAxNCwgMjAwMl0KLSAgUmVtb3ZlZCAiUE5HQVBJIiBmcm9tIHBuZ196YWxsb2MoKSBhbmQgcG5nX3pmcmVlKCkgaW4gcG5nLmMKLSAgQ2hhbmdlZCAiR3oiIHRvICJHZCIgaW4gcHJvamVjdHMvbXN2Yy9saWJwbmcuZHNwIGFuZCB6bGliLmRzcC4KLSAgUmVtb3ZlZCBsZWZ0b3ZlciBsaWJwbmctY29uZmlnICJzZWQiIHNjcmlwdCBmcm9tIGZvdXIgbWFrZWZpbGVzLgotICBSZXZpc2VkIGxpYnBuZy1jb25maWcgY3JlYXRpbmcgc2NyaXB0IGluIDE2IG1ha2VmaWxlcy4KLQotdmVyc2lvbiAxLjIuMyBbTWF5IDIyLCAyMDAyXQotICBSZXZpc2VkIGxpYnBuZy1jb25maWcgdGFyZ2V0IGluIG1ha2VmaWxlLmN5Z3dpbi4KLSAgUmVtb3ZlZCBkZXNjcmlwdGlvbiBvZiBwbmdfc2V0X21lbV9mbigpIGZyb20gZG9jdW1lbnRhdGlvbi4KLSAgUmV2aXNlZCBtYWtlZmlsZS5mcmVlYnNkLgotICBNaW5vciBjb3NtZXRpYyBjaGFuZ2VzIHRvIDE1IG1ha2VmaWxlcywgZS5nLiwgJChESSkgPSAkKERFU1RESVIpLyQoSU5DRElSKS4KLSAgUmV2aXNlZCBwcm9qZWN0cy9tc3ZjL1JFQURNRS50eHQKLSAgQ2hhbmdlZCAtbHBuZyB0byAtbHBuZ05OIGluIExERkxBR1MgaW4gc2V2ZXJhbCBtYWtlZmlsZXMuCi12ZXJzaW9uIDEuMi40YmV0YTEgW01heSAyNCwgMjAwMl0KLSAgQWRkZWQgbGlicG5nLnBjIGFuZCBsaWJwbmctY29uZmlnIHRvICJhbGw6IiB0YXJnZXQgaW4gMTYgbWFrZWZpbGVzLgotICBGaXhlZCBidWcgaW4gMTYgbWFrZWZpbGVzOiAkKERFU1RESVIpLyQoTElCUEFUSCkgdG8gJChERVNURElSKSQoTElCUEFUSCkKLSAgQWRkZWQgbWlzc2luZyAiXCIgYmVmb3JlIGNsb3NpbmcgZG91YmxlIHF1b3RlIGluIG1ha2VmaWxlLmdjbW14LgotICBQbHVnZ2VkIHZhcmlvdXMgbWVtb3J5IGxlYWtzOyBhZGRlZCBwbmdfbWFsbG9jX3dhcm4oKSBhbmQgcG5nX3NldF90ZXh0XzIoKQotICAgIGZ1bmN0aW9ucy4KLXZlcnNpb24gMS4yLjRiZXRhMiBbSnVuZSAyNSwgMjAwMl0KLSAgUGx1Z2dlZCBtZW1vcnkgbGVhayBvZiBwbmdfcHRyLT5jdXJyZW50X3RleHQgKE1hdHQgSG9sZ2F0ZSkuCi0gIENoZWNrIGZvciBidWZmZXIgb3ZlcmZsb3cgYmVmb3JlIHJlYWRpbmcgQ1JDIGluIHBuZ3ByZWFkLmMgKFdhcndpY2sgQWxsaXNvbikKLSAgQWRkZWQgLXNvbmFtZSB0byB0aGUgbG9hZGVyIGZsYWdzIGluIG1ha2VmaWxlLmRlYywgbWFrZWZpbGUuc2dpLCBhbmQKLSAgICBtYWtlZmlsZS5zZ2djYy4KLSAgQWRkZWQgInRlc3QtaW5zdGFsbGVkIiB0YXJnZXQgdG8gbWFrZWZpbGUubGludXgsIG1ha2VmaWxlLmdjbW14LAotICAgIG1ha2VmaWxlLnNnaSwgYW5kIG1ha2VmaWxlLnNnZ2NjLgotdmVyc2lvbiAxLjIuNGJldGEzIFtKdW5lIDI4LCAyMDAyXQotICBQbHVnZ2VkIG1lbW9yeSBsZWFrIG9mIHJvd19idWYgaW4gcG5ndGVzdC5jIHdoZW4gdGhlcmUgaXMgYSBwbmdfZXJyb3IoKS4KLSAgRGV0ZWN0IGJ1ZmZlciBvdmVyZmxvdyBpbiBwbmdwcmVhZC5jIHdoZW4gSURBVCBpcyBjb3JydXB0ZWQgd2l0aCBleHRyYSBkYXRhLgotICBBZGRlZCAidGVzdC1pbnN0YWxsZWQiIHRhcmdldCB0byBtYWtlZmlsZS4zMnN1bnUsIG1ha2VmaWxlLjY0c3VudSwKLSAgICBtYWtlZmlsZS5iZW9zLCBtYWtlZmlsZS5kYXJ3aW4sIG1ha2VmaWxlLmRlYywgbWFrZWZpbGUubWFjb3N4LAotICAgIG1ha2VmaWxlLnNvbGFyaXMsIG1ha2VmaWxlLmhwdXgsIG1ha2VmaWxlLmhwZ2NjLCBhbmQgbWFrZWZpbGUuc285LgotdmVyc2lvbiAxLjIuNHJjMSBhbmQgMS4wLjE0cmMxIFtKdWx5IDIsIDIwMDJdCi0gIEFkZGVkICJ0ZXN0LWluc3RhbGxlZCIgdGFyZ2V0IHRvIG1ha2VmaWxlLmN5Z3dpbiBhbmQgbWFrZWZpbGUuc2NvLgotICBSZXZpc2VkIHBuZ2djY3JkLmMgdG8gYmUgYWJsZSB0byBiYWNrIG91dCB2ZXJzaW9uIDEuMC54IHZpYSBQTkdfMV8wX1ggbWFjcm8uCi0KLXZlcnNpb24gMS4yLjQgYW5kIDEuMC4xNCBbSnVseSA4LCAyMDAyXQotICBDaGFuZ2VkIHBuZ193YXJuaW5nKCkgdG8gcG5nX2Vycm9yKCkgd2hlbiB3aWR0aCBpcyB0b28gbGFyZ2UgdG8gcHJvY2Vzcy4KLXZlcnNpb24gMS4yLjRwYXRjaDAxIFtKdWx5IDIwLCAyMDAyXQotICBSZXZpc2VkIG1ha2VmaWxlLmN5Z3dpbiB0byB1c2UgRExMIG51bWJlciAxMiBpbnN0ZWFkIG9mIDEzLgotdmVyc2lvbiAxLjIuNWJldGExIFtBdWd1c3QgNiwgMjAwMl0KLSAgQWRkZWQgY29kZSB0byBjb250cmliL2dyZWdib29rL3JlYWRwbmcyLmMgdG8gaWdub3JlIHVudXNlZCBjaHVua3MuCi0gIFJlcGxhY2VkIHRvdWNhbi5wbmcgaW4gY29udHJpYi9ncmVnYm9vayAoaXQgaGFzIGJlZW4gY29ycnVwdCBzaW5jZSAxLjAuMTEpCi0gIFJlbW92ZWQgc29tZSBzdHJheSAqLm8gZmlsZXMgZnJvbSBjb250cmliL2dyZWdib29rLgotICBDaGFuZ2VkIHBuZ19lcnJvcigpIHRvIHBuZ193YXJuaW5nKCkgYWJvdXQgIlRvbyBtdWNoIGRhdGEiIGluIHBuZ3ByZWFkLmMKLSAgICBhbmQgYWJvdXQgIkV4dHJhIGNvbXByZXNzZWQgZGF0YSIgaW4gcG5ncnV0aWwuYy4KLSAgUHJldmVudCBwbmdfcHRyLT5wYXNzIGZyb20gZXhjZWVkaW5nIDcgaW4gcG5nX3B1c2hfZmluaXNoX3JvdygpLgotICBVcGRhdGVkIG1ha2VmaWxlLmhwZ2NjCi0gIFVwZGF0ZWQgcG5nLmMgYW5kIHBuZ2djY3JkLmMgaGFuZGxpbmcgb2YgcmV0dXJuIGZyb20gcG5nX21teF9zdXBwb3J0KCkKLXZlcnNpb24gMS4yLjViZXRhMiBbQXVndXN0IDE1LCAyMDAyXQotICBPbmx5IGlzc3VlIHBuZ193YXJuaW5nKCkgYWJvdXQgIlRvbyBtdWNoIGRhdGEiIGluIHBuZ3ByZWFkLmMgd2hlbiBhdmFpbF9pbgotICAgIGlzIG5vbnplcm8uCi0gIFVwZGF0ZWQgbWFrZWZpbGVzIHRvIGluc3RhbGwgYSBzZXBhcmF0ZSBsaWJwbmcuc28uMyB3aXRoIGl0cyBvd24gcnBhdGguCi12ZXJzaW9uIDEuMi41cmMxIGFuZCAxLjAuMTVyYzEgW0F1Z3VzdCAyNCwgMjAwMl0KLSAgUmV2aXNlZCBtYWtlZmlsZXMgdG8gbm90IHJlbW92ZSBwcmV2aW91cyBtaW5vciB2ZXJzaW9ucyBvZiBzaGFyZWQgbGlicmFyaWVzLgotdmVyc2lvbiAxLjIuNXJjMiBhbmQgMS4wLjE1cmMyIFtTZXB0ZW1iZXIgMTYsIDIwMDJdCi0gIFJldmlzZWQgMTMgbWFrZWZpbGVzIHRvIHJlbW92ZSAiLWx6IiBhbmQgIi1MJChaTElCTElCKSIsIGV0Yy4sIGZyb20gc2hhcmVkCi0gICAgbGlicmFyeSBsb2FkZXIgZGlyZWN0aXZlLgotICBBZGRlZCBtaXNzaW5nICIkT0JKU0RMTCIgbGluZSB0byBtYWtlZmlsZS5nY21teC4KLSAgQWRkZWQgbWlzc2luZyAiOyBmaSIgdG8gbWFrZWZpbGUuMzJzdW51LgotdmVyc2lvbiAxLjIuNXJjMyBhbmQgMS4wLjE1cmMzIFtTZXB0ZW1iZXIgMTgsIDIwMDJdCi0gIFJldmlzZWQgbGlicG5nLWNvbmZpZyBzY3JpcHQuCi0KLXZlcnNpb24gMS4yLjUgYW5kIDEuMC4xNSBbT2N0b2JlciAzLCAyMDAyXQotICBSZXZpc2VkIG1ha2VmaWxlLm1hY29zeCwgbWFrZWZpbGUuZGFyd2luLCBtYWtlZmlsZS5ocGdjYywgYW5kIG1ha2VmaWxlLmhwdXgsCi0gICAgYW5kIG1ha2VmaWxlLmFpeC4KLSAgUmVsb2NhdGVkIHR3byBtaXNwbGFjZWQgUE5HQVBJIGxpbmVzIGluIHBuZ3Rlc3QuYwotdmVyc2lvbiAxLjIuNmJldGExIFtPY3RvYmVyIDIyLCAyMDAyXQotICBDb21tZW50ZWQgb3V0IHdhcm5pbmcgYWJvdXQgdW5pbml0aWFsaXplZCBtbXhfc3VwcG9ydCBpbiBwbmdnY2NyZC5jLgotICBDaGFuZ2VkICJJQk1DUFBfXyIgZmxhZyB0byAiX19JQk1DUFBfXyIgaW4gcG5nY29uZi5oLgotICBSZWxvY2F0ZWQgdHdvIG1vcmUgbWlzcGxhY2VkIFBOR0FQSSBsaW5lcyBpbiBwbmd0ZXN0LmMKLSAgRml4ZWQgbWVtb3J5IG92ZXJydW4gYnVnIGluIHBuZ19kb19yZWFkX2ZpbGxlcigpIHdpdGggMTYtYml0IGRhdGFzdHJlYW1zLAotICAgIGludHJvZHVjZWQgaW4gdmVyc2lvbiAxLjAuMi4KLSAgUmV2aXNlZCBtYWtlZmlsZS5tYWNvc3gsIG1ha2VmaWxlLmRlYywgbWFrZWZpbGUuYWl4LCBhbmQgbWFrZWZpbGUuMzJzdW51LgotdmVyc2lvbiAxLjIuNmJldGEyIFtOb3ZlbWJlciAxLCAyMDAyXQotICBBZGRlZCBsaWJwbmctY29uZmlnICItLWxkb3B0cyIgb3V0cHV0LgotICBBZGRlZCAiQVI9YXIiIGFuZCAiQVJGTEFHUz1yYyIgYW5kIGNoYW5nZWQgImFyIHJjIiB0byAiJChBUikgJChBUkZMQUdTKSIKLSAgICBpbiBtYWtlZmlsZXMuCi12ZXJzaW9uIDEuMi42YmV0YTMgW0p1bHkgMTgsIDIwMDRdCi0gIFJldmVydGVkIG1ha2VmaWxlIGNoYW5nZXMgZnJvbSB2ZXJzaW9uIDEuMi42YmV0YTIgYW5kIHNvbWUgb2YgdGhlIGNoYW5nZXMKLSAgICBmcm9tIHZlcnNpb24gMS4yLjZiZXRhMTsgdGhlc2Ugd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgdmVyc2lvbiAxLjIuNy4KLSAgICBWZXJzaW9uIDEuMi42IGlzIGdvaW5nIHRvIGJlIGEgc2ltcGxlIGJ1Z2ZpeCByZWxlYXNlLgotICBDaGFuZ2VkIHRoZSBvbmUgaW5zdGFuY2Ugb2YgImxuIC1zZiIgdG8gImxuIC1mIC1zIiBpbiBlYWNoIFN1biBtYWtlZmlsZS4KLSAgRml4ZWQgcG90ZW50aWFsIG92ZXJydW4gaW4gcG5nZXJyb3IuYyBieSB1c2luZyBzdHJuY3B5IGluc3RlYWQgb2YgbWVtY3B5LgotICBBZGRlZCAiIyEvYmluL3NoIiBhdCB0aGUgdG9wIG9mIGNvbmZpZ3VyZSwgZm9yIHJlY29nbml0aW9uIG9mIHRoZQotICAgICd4JyBmbGFnIHVuZGVyIEN5Z3dpbiAoQ29zbWluKS4KLSAgT3B0aW1pemVkIHZhY3VvdXMgdGVzdHMgdGhhdCBzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdzLCBpbiBwbmcuYyAoQ29zbWluKS4KLSAgQWRkZWQgc3VwcG9ydCBmb3IgUE5HX1VTRVJfQ09ORklHLCBpbiBwbmdjb25mLmggKENvc21pbikuCi0gIEZpeGVkIHRoZSBzcGVjaWFsIG1lbW9yeSBoYW5kbGVyIGZvciBCb3JsYW5kIEMgdW5kZXIgRE9TLCBpbiBwbmdtZW0uYwotICAgIChDb3NtaW4pLgotICBSZW1vdmVkIHNvbWUgc3B1cmlvdXMgYXNzaWdubWVudHMgaW4gcG5ncnV0aWwuYyAoQ29zbWluKS4KLSAgUmVwbGFjZWQgNjU1MzYgd2l0aCA2NTUzNkwsIGFuZCAweGZmZmYgd2l0aCAweGZmZmZMLCB0byBzaWxlbmNlIHdhcm5pbmdzCi0gICAgb24gMTYtYml0IHBsYXRmb3JtcyAoQ29zbWluKS4KLSAgRW5jbG9zZWQgc2hpZnQgb3AgZXhwcmVzc2lvbnMgaW4gcGFyZW50aGVzZXMsIHRvIHNpbGVuY2Ugd2FybmluZ3MgKENvc21pbikuCi0gIFVzZWQgcHJvcGVyIHR5cGUgcG5nX2ZpeGVkX3BvaW50LCB0byBhdm9pZCBwcm9ibGVtcyBvbiAxNi1iaXQgcGxhdGZvcm1zLAotICAgIGluIHBuZ19oYW5kbGVfc1JHQigpIChDb3NtaW4pLgotICBBZGRlZCBjb21wcmVzc2lvbl90eXBlIHRvIHBuZ19zdHJ1Y3QsIGFuZCBvcHRpbWl6ZWQgdGhlIHdpbmRvdyBzaXplCi0gICAgaW5zaWRlIHRoZSBkZWZsYXRlIHN0cmVhbSAoQ29zbWluKS4KLSAgRml4ZWQgZGVmaW5pdGlvbiBvZiBpc25vbmFscGhhKCksIGluIHBuZ2Vycm9yLmMgYW5kIHBuZ3J1dGlsLmMgKENvc21pbikuCi0gIEZpeGVkIGhhbmRsaW5nIG9mIHVua25vd24gY2h1bmtzIHRoYXQgY29tZSBhZnRlciBJREFUIChDb3NtaW4pLgotICBBbGxvd2VkIHBuZ19lcnJvcigpIGFuZCBwbmdfd2FybmluZygpIHRvIHdvcmsgZXZlbiBpZiBwbmdfcHRyID09IE5VTEwKLSAgICAoQ29zbWluKS4KLSAgUmVwbGFjZWQgcm93X2luZm8tPnJvd2J5dGVzIHdpdGggcm93X2J5dGVzIGluIHBuZ193cml0ZV9maW5kX2ZpbHRlcigpCi0gICAgKENvc21pbikuCi0gIEZpeGVkIGRlZmluaXRpb24gb2YgUE5HX0xJQlBOR19WRVJfRExMTlVNIChTaW1vbi1QaWVycmUpLgotICBVc2VkIFBOR19MSUJQTkdfVkVSIGFuZCBQTkdfTElCUE5HX1ZFUl9TVFJJTkcgaW5zdGVhZCBvZiB0aGUgaGFyZGNvZGVkCi0gICAgdmFsdWVzIGluIHBuZy5jIChTaW1vbi1QaWVycmUsIENvc21pbikuCi0gIEluaXRpYWxpemVkIHBuZ19saWJwbmdfdmVyW10gd2l0aCBQTkdfTElCUE5HX1ZFUl9TVFJJTkcgKFNpbW9uLVBpZXJyZSkuCi0gIFJlcGxhY2VkIFBOR19MSUJQTkdfVkVSX01BSk9SIHdpdGggUE5HX0xJQlBOR19WRVJfRExMTlVNIGluIHBuZy5yYwotICAgIChTaW1vbi1QaWVycmUpLgotICBNb3ZlZCB0aGUgZGVmaW5pdGlvbiBvZiBQTkdfSEVBREVSX1ZFUlNJT05fU1RSSU5HIG5lYXIgdGhlIGRlZmluaXRpb25zCi0gICAgb2YgdGhlIG90aGVyIFBOR19MSUJQTkdfVkVSXy4uLiBzeW1ib2xzIGluIHBuZy5oIChDb3NtaW4pLgotICBSZWxvY2F0ZWQgI2lmbmRlZiBQTkdBUEkgZ3VhcmRzIGluIHBuZ2NvbmYuaCAoU2ltb24tUGllcnJlLCBDb3NtaW4pLgotICBVcGRhdGVkIHNjcmlwdHMvbWFrZWZpbGUudmMoYSl3aW4zMiAoQ29zbWluKS4KLSAgVXBkYXRlZCB0aGUgTVNWQyBwcm9qZWN0IChTaW1vbi1QaWVycmUsIENvc21pbikuCi0gIFVwZGF0ZWQgdGhlIEJvcmxhbmQgQysrIEJ1aWxkZXIgcHJvamVjdCAoQ29zbWluKS4KLSAgQXZvaWRlZCBhY2Nlc3MgdG8gYXNtX2ZsYWdzIGluIHBuZ3ZjcmQuYywgaWYgUE5HXzFfMF9YIGlzIGRlZmluZWQgKENvc21pbikuCi0gIENvbW1lbnRlZCBvdXQgd2FybmluZyBhYm91dCB1bmluaXRpYWxpemVkIG1teF9zdXBwb3J0IGluIHBuZ3ZjcmQuYyAoQ29zbWluKS4KLSAgUmVtb3ZlZCBzY3JpcHRzL21ha2VmaWxlLmJkMzIgYW5kIHNjcmlwdHMvcG5nZGVmLnBhcyAoQ29zbWluKS4KLSAgQWRkZWQgZXh0cmEgZ3VhcmQgYXJvdW5kIGluY2x1c2lvbiBvZiBUdXJibyBDIG1lbW9yeSBoZWFkZXJzLCBpbiBwbmdjb25mLmgKLSAgICAoQ29zbWluKS4KLSAgUmVuYW1lZCBwcm9qZWN0cy9tc3ZjLyB0byBwcm9qZWN0cy92aXN1YWxjNi8sIGFuZCBwcm9qZWN0cy9ib3JsYW5kLyB0bwotICAgIHByb2plY3RzL2NidWlsZGVyNS8gKENvc21pbikuCi0gIE1vdmVkIHByb2plY3RzL3Zpc3VhbGM2L3BuZzMybXMuZGVmIHRvIHNjcmlwdHMvcG5ndzMyLmRlZiwKLSAgICBhbmQgcHJvamVjdHMvdmlzdWFsYzYvcG5nLnJjIHRvIHNjcmlwdHMvcG5ndzMyLnJjIChDb3NtaW4pLgotICBBZGRlZCBwcm9qZWN0cy92aXN1YWxjNi9wbmd0ZXN0LmRzcDsgcmVtb3ZlZCBjb250cmliL21zdmN0ZXN0LyAoQ29zbWluKS4KLSAgQ2hhbmdlZCBsaW5lIGVuZGluZ3MgdG8gRE9TIHN0eWxlIGluIGNidWlsZGVyNSBhbmQgdmlzdWFsYzYgZmlsZXMsIGV2ZW4KLSAgICBpbiB0aGUgdGFyLiogZGlzdHJpYnV0aW9ucyAoQ29zbWluKS4KLSAgVXBkYXRlZCBjb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzcCAoQ29zbWluKS4KLSAgVXBkYXRlZCBjb250cmliL3Zpc3VwbmcvY2V4Y2VwdC5oIHRvIHZlcnNpb24gMi4wLjAgKENvc21pbikuCi0gIEFkZGVkIGEgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIHdpdGggImNvbmZpZ3VyZSIgYW5kIHN1cHBvcnRpbmcgZmlsZXMgKEp1bmljaGkpLgotdmVyc2lvbiAxLjIuNmJldGE0IFtKdWx5IDI4LCAyMDA0XQotICBBZGRlZCB1c2VyIGFiaWxpdHkgdG8gY2hhbmdlIHBuZ19zaXplX3QgdmlhIGEgUE5HX1NJWkVfVCBtYWNyby4KLSAgQWRkZWQgcG5nX3NpemVvZigpIGFuZCBwbmdfY29udmVydF9zaXplKCkgZnVuY3Rpb25zLgotICBBZGRlZCBQTkdfU0laRV9NQVggKG1heGltdW0gdmFsdWUgb2YgYSBwbmdfc2l6ZV90IHZhcmlhYmxlLgotICBBZGRlZCBjaGVjayBpbiBwbmdfbWFsbG9jX2RlZmF1bHQoKSBmb3IgKHNpemVfdClzaXplICE9IChwbmdfdWludF8zMilzaXplCi0gICAgd2hpY2ggd291bGQgaW5kaWNhdGUgYW4gb3ZlcmZsb3cuCi0gIENoYW5nZWQgc1BMVCBmYWlsdXJlIGFjdGlvbiBmcm9tIHBuZ19lcnJvciB0byBwbmdfd2FybmluZyBhbmQgYWJhbmRvbiBjaHVuay4KLSAgQ2hhbmdlZCBzQ0FMIGFuZCBpQ0NQIGZhaWx1cmVzIGZyb20gcG5nX2Vycm9yIHRvIHBuZ193YXJuaW5nIGFuZCBhYmFuZG9uLgotICBBZGRlZCBwbmdfZ2V0X3VpbnRfMzEocG5nX3B0ciwgYnVmKSBmdW5jdGlvbi4KLSAgQWRkZWQgUE5HX1VJTlRfMzJfTUFYIG1hY3JvLgotICBSZW5hbWVkIFBOR19NQVhfVUlOVCB0byBQTkdfVUlOVF8zMV9NQVguCi0gIE1hZGUgcG5nX3phbGxvYygpIGlzc3VlIGEgcG5nX3dhcm5pbmcgYW5kIHJldHVybiBOVUxMIG9uIHBvdGVudGlhbAotICAgIG92ZXJmbG93LgotICBUdXJuIG9uIFBOR19OT19aQUxMT0NfWkVSTyBieSBkZWZhdWx0IGluIHZlcnNpb24gMS4yLngKLSAgUmV2aXNlZCAiY2xvYmJlciBsaXN0IiBpbiBwbmdnY2NyZC5jIHNvIGl0IHdpbGwgY29tcGlsZSB1bmRlciBnY2MtMy40LgotICBSZXZpc2VkIEJvcmxhbmQgcG9ydGlvbiBvZiBwbmdfbWFsbG9jKCkgdG8gcmV0dXJuIE5VTEwgb3IgaXNzdWUKLSAgICBwbmdfZXJyb3IoKSBhY2NvcmRpbmcgdG8gc2V0dGluZyBvZiBQTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0suCi0gIEFkZGVkIFBOR19OT19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEIG1hY3JvIHRvIGNvbmRpdGlvbmFsbHkgcmVtb3ZlCi0gICAgc2VxdWVudGlhbCByZWFkIHN1cHBvcnQuCi0gIEFkZGVkIHNvbWUgIiNpZiBQTkdfV1JJVEVfU1VQUE9SVEVEIiBibG9ja3MuCi0gIEFkZGVkICNpZmRlZiB0byByZW1vdmUgc29tZSByZWR1bmRhbmN5IGluIHBuZ19tYWxsb2NfZGVmYXVsdCgpLgotICBVc2UgcG5nX21hbGxvYyBpbnN0ZWFkIG9mIHBuZ196YWxsb2MgdG8gYWxsb2NhdGUgdGhlIHBhbGxldGUuCi12ZXJzaW9uIDEuMC4xNnJjMSBhbmQgMS4yLjZyYzEgW0F1Z3VzdCA0LCAyMDA0XQotICBGaXhlZCBidWZmZXIgb3ZlcmZsb3cgdnVsbmVyYWJpbGl0eSBpbiBwbmdfaGFuZGxlX3RSTlMoKQotICBGaXhlZCBpbnRlZ2VyIGFyaXRobWV0aWMgb3ZlcmZsb3cgdnVsbmVyYWJpbGl0eSBpbiBwbmdfcmVhZF9wbmcoKS4KLSAgRml4ZWQgc29tZSBoYXJtbGVzcyBidWdzIGluIHBuZ19oYW5kbGVfc0JJVCwgZXRjLCB0aGF0IHdvdWxkIGNhdXNlCi0gICAgZHVwbGljYXRlIGNodW5rIHR5cGVzIHRvIGdvIHVuZGV0ZWN0ZWQuCi0gIEZpeGVkIHNvbWUgdGltZXN0YW1wcyBpbiB0aGUgLWNvbmZpZyB2ZXJzaW9uCi0gIFJlYXJyYW5nZWQgb3JkZXIgb2YgcHJvY2Vzc2luZyBvZiBjb2xvciB0eXBlcyBpbiBwbmdfaGFuZGxlX3RSTlMoKS4KLSAgQWRkZWQgUk9XQllURVMgbWFjcm8gdG8gY2FsY3VsYXRlIHJvd2J5dGVzIHdpdGhvdXQgaW50ZWdlciBvdmVyZmxvdy4KLSAgVXBkYXRlZCBtYWtlZmlsZS5kYXJ3aW4gYW5kIHJlbW92ZWQgbWFrZWZpbGUubWFjb3N4IGZyb20gc2NyaXB0cyBkaXJlY3RvcnkuCi0gIEltcG9zZWQgZGVmYXVsdCBvbmUgbWlsbGlvbiBjb2x1bW4sIG9uZS1taWxsaW9uIHJvdyBsaW1pdHMgb24gdGhlIGltYWdlCi0gICAgZGltZW5zaW9ucywgYW5kIGFkZGVkIHBuZ19zZXRfdXNlcl9saW1pdHMoKSBmdW5jdGlvbiB0byBvdmVycmlkZSB0aGVtLgotICBSZXZpc2VkIHVzZSBvZiBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRCBtYWNyby4KLSAgRml4ZWQgd3JvbmcgY2FzdCBvZiByZXR1cm5zIGZyb20gcG5nX2dldF91c2VyX3dpZHRofGhlaWdodF9tYXgoKS4KLSAgQ2hhbmdlZCBzb21lICJrZWVwIHRoZSBjb21waWxlciBoYXBweSIgZnJvbSBlbXB0eSBzdGF0ZW1lbnRzIHRvIHJldHVybnMsCi0gIFJldmlzZWQgbGlicG5nLnR4dCB0byByZW1vdmUgMS4yLnggc3R1ZmYgZnJvbSB0aGUgMS4wLnggZGlzdHJpYnV0aW9uCi12ZXJzaW9uIDEuMC4xNnJjMiBhbmQgMS4yLjZyYzIgW0F1Z3VzdCA3LCAyMDA0XQotICBSZXZpc2VkIG1ha2VmaWxlLmRhcndpbiBhbmQgbWFrZWZpbGUuc29sYXJpcy4gIFJlbW92ZWQgbWFrZWZpbGUubWFjb3N4LgotICBSZXZpc2VkIHBuZ3Rlc3QncyBwbmdfZGVidWdfbWFsbG9jKCkgdG8gdXNlIHBuZ19tYWxsb2MoKSBpbnN0ZWFkIG9mCi0gICAgcG5nX21hbGxvY19kZWZhdWx0KCkgd2hpY2ggaXMgbm90IHN1cHBvc2VkIHRvIGJlIGV4cG9ydGVkLgotICBGaXhlZCBvZmYtYnktb25lIGVycm9yIGluIG9uZSBvZiB0aGUgY29udmVyc2lvbnMgdG8gUE5HX1JPV0JZVEVTKCkgaW4KLSAgICBwbmdwcmVhZC5jLiAgQnVnIHdhcyBpbnRyb2R1Y2VkIGluIDEuMi42cmMxLgotICBGaXhlZCBidWcgaW4gUkdCIHRvIFJHQlggdHJhbnNmb3JtYXRpb24gaW50cm9kdWNlZCBpbiAxLjIuNnJjMS4KLSAgRml4ZWQgb2xkIGJ1ZyBpbiBSR0IgdG8gR3JheSB0cmFuc2Zvcm1hdGlvbi4KLSAgRml4ZWQgcHJvYmxlbSB3aXRoIDY0LWJpdCBjb21waWxlcnMgYnkgY2FzdGluZyBhcmd1bWVudHMgdG8gYWJzKCkKLSAgICB0byBwbmdfaW50XzMyLgotICBDaGFuZ2VkICJsbiAtc2YiIHRvICJsbiAtZiAtcyIgaW4gdGhyZWUgbWFrZWZpbGVzIChzb2xhcmlzLCBzY28sIHNvOSkuCi0gIENoYW5nZWQgIkhBTkRMRV9DSFVOS18qIiB0byAiUE5HX0hBTkRMRV9DSFVOS18qIiAoQ29zbWluKQotICBBZGRlZCAiLUAvYmluL3JtIC1mICQoREwpLyQoTElCTkFNRSkuc28uJChQTkdNQUopIiB0byAxNSAqTklYIG1ha2VmaWxlcy4KLSAgQWRkZWQgY29kZSB0byB1cGRhdGUgdGhlIHJvd19pbmZvLT5jb2xvcnR5cGUgaW4gcG5nX2RvX3JlYWRfZmlsbGVyKCkgKE1TQikuCi12ZXJzaW9uIDEuMC4xNnJjMyBhbmQgMS4yLjZyYzMgW0F1Z3VzdCA5LCAyMDA0XQotICBFbGltaW5hdGVkIHVzZSBvZiAiYWJzKCkiIGluIHRlc3RpbmcgY0hSTSBhbmQgZ0FNQSB2YWx1ZXMsIHRvIGF2b2lkCi0gICAgdHJvdWJsZSB3aXRoIHNvbWUgNjQtYml0IGNvbXBpbGVycy4gIENyZWF0ZWQgUE5HX09VVF9PRl9SQU5HRSgpIG1hY3JvLgotICBSZXZpc2VkIGRvY3VtZW50YXRpb24gb2YgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKCkuCi0gIENoZWNrIGhhbmRsZV9hc191bmtub3duIHN0YXR1cyBpbiBwbmdwcmVhZC5jLCBhcyBpbiBwbmdyZWFkLmMgcHJldmlvdXNseS4KLSAgTW92ZWQgICJQTkdfSEFORExFX0NIVU5LXyoiIG1hY3JvcyBvdXQgb2YgUE5HX0lOVEVSTkFMIHNlY3Rpb24gb2YgcG5nLmgKLSAgQWRkZWQgInJpbSIgZGVmaW5pdGlvbnMgZm9yIENPTlNUNCBhbmQgQ09OU1Q2IGluIHBuZ2djY3JkLmMKLXZlcnNpb24gMS4wLjE2cmM0IGFuZCAxLjIuNnJjNCBbQXVndXN0IDEwLCAyMDA0XQotICBGaXhlZCBtaXN0YWtlIGluIHBuZ3Rlc3QuYyBpbnRyb2R1Y2VkIGluIDEuMi42cmMyIChkZWNsYXJhdGlvbiBvZgotICAgICJwaW5mbyIgd2FzIG91dCBvZiBwbGFjZSkuCi12ZXJzaW9uIDEuMC4xNnJjNSBhbmQgMS4yLjZyYzUgW0F1Z3VzdCAxMCwgMjAwNF0KLSAgTW92ZWQgICJQTkdfSEFORExFX0NIVU5LXyoiIG1hY3JvcyBvdXQgb2YgUE5HX0FTU0VNQkxFUl9DT0RFX1NVUFBPUlRFRAotICAgICBzZWN0aW9uIG9mIHBuZy5oIHdoZXJlIHRoZXkgd2VyZSBpbmFkdmVydGVudGx5IHBsYWNlZCBpbiB2ZXJzaW9uIHJjMy4KLQotdmVyc2lvbiAxLjIuNiBhbmQgMS4wLjE2IFtBdWd1c3QgMTUsIDIwMDRdCi0gIFJldmlzZWQgcG5ndGVzdCBzbyBtZW1vcnkgYWxsb2NhdGlvbiB0ZXN0aW5nIGlzIG9ubHkgZG9uZSB3aGVuIFBOR19ERUJVRz09MS4KLXZlcnNpb24gMS4yLjdiZXRhMSBbQXVndXN0IDI2LCAyMDA0XQotICBSZW1vdmVkIHVudXNlZCBwbmdhc21yZC5oIGZpbGUuCi0gIFJlbW92ZWQgcmVmZXJlbmNlcyB0byB1dS5uZXQgZm9yIGFyY2hpdmVkIGZpbGVzLiAgQWRkZWQgcmVmZXJlbmNlcyB0bwotICAgIFBORyBTcGVjIChzZWNvbmQgZWRpdGlvbikgYW5kIHRoZSBQTkcgSVNPL0lFQyBTdGFuZGFyZC4KLSAgQWRkZWQgInRlc3QtZGQiIHRhcmdldCBpbiAxNSBtYWtlZmlsZXMsIHRvIHJ1biBwbmd0ZXN0IGluIERFU1RESVIuCi0gIEZpeGVkIGJ1ZyB3aXRoICJvcHRpbWl6ZWQgd2luZG93IHNpemUiIGluIHRoZSBJREFUIGRhdGFzdHJlYW0sIHRoYXQKLSAgICBjYXVzZXMgbGlicG5nIHRvIHdyaXRlIFBORyBmaWxlcyB3aXRoIGluY29ycmVjdCB6bGliIGhlYWRlciBieXRlcy4KLXZlcnNpb24gMS4yLjdiZXRhMiBbQXVndXN0IDI4LCAyMDA0XQotICBGaXhlZCBidWcgd2l0aCBzQ0FMIGNodW5rIGFuZCBiaWctZW5kaWFuIG1hY2hpbmVzIChEYXZpZCBNdW5ybykuCi0gIFVuZGlkIG5ldyBjb2RlIGFkZGVkIGluIDEuMi42cmMyIHRvIHVwZGF0ZSB0aGUgY29sb3JfdHlwZSBpbgotICAgIHBuZ19zZXRfZmlsbGVyKCkuCi0gIEFkZGVkIHBuZ19zZXRfYWRkX2FscGhhKCkgdGhhdCB1cGRhdGVzIGNvbG9yIHR5cGUuCi12ZXJzaW9uIDEuMC4xN3JjMSBhbmQgMS4yLjdyYzEgW1NlcHRlbWJlciA0LCAyMDA0XQotICBSZXZpc2VkIHBuZ19zZXRfc3RyaXBfZmlsbGVyKCkgdG8gbm90IHJlbW92ZSBhbHBoYSBpZiBjb2xvcl90eXBlIGhhcyBhbHBoYS4KLQotdmVyc2lvbiAxLjIuNyBhbmQgMS4wLjE3IFtTZXB0ZW1iZXIgMTIsIDIwMDRdCi0gIEFkZGVkIG1ha2VmaWxlLmhwNjQKLSAgQ2hhbmdlZCBwcm9qZWN0cy9tc3ZjL3BuZzMybXMuZGVmIHRvIHNjcmlwdHMvcG5nMzJtcy5kZWYgaW4gbWFrZWZpbGUuY3lnd2luCi12ZXJzaW9uIDEuMi44YmV0YTEgW05vdmVtYmVyIDEsIDIwMDRdCi0gIEZpeGVkIGJ1ZyBpbiBwbmdfdGV4dF9jb21wcmVzcygpIHRoYXQgd291bGQgZmFpbCB0byBjb21wbGV0ZSBhIGxhcmdlIGJsb2NrLgotICBGaXhlZCBidWcsIGludHJvZHVjZWQgaW4gbGlicG5nLTEuMi43LCB0aGF0IG92ZXJydW5zIGEgYnVmZmVyIGR1cmluZwotICAgIHN0cmlwIGFscGhhIG9wZXJhdGlvbiBpbiBwbmdfZG9fc3RyaXBfZmlsbGVyKCkuCi0gIEFkZGVkIFBOR18xXzJfWCBkZWZpbml0aW9uIGluIHBuZ2NvbmYuaAotICBVc2UgI2lmZGVmIHRvIGNvbW1lbnQgb3V0IHBuZ19pbmZvX2luaXQgaW4gcG5nLmMgYW5kIHBuZ19yZWFkX2luaXQgaW4KLSAgICBwbmdyZWFkLmMgKGFzIG9mIDEuMy4wKQotdmVyc2lvbiAxLjIuOGJldGEyIFtOb3ZlbWJlciAyLCAyMDA0XQotICBSZWR1Y2UgY29sb3JfdHlwZSB0byBhIG5vbmFscGhhIHR5cGUgYWZ0ZXIgc3RyaXAgYWxwaGEgb3BlcmF0aW9uIGluCi0gICAgcG5nX2RvX3N0cmlwX2ZpbGxlcigpLgotdmVyc2lvbiAxLjIuOGJldGEzIFtOb3ZlbWJlciAzLCAyMDA0XQotICBSZXZpc2VkIGRlZmluaXRpb25zIG9mIFBOR19NQVhfVUlOVF8zMiwgUE5HX01BWF9TSVpFLCBhbmQgUE5HX01BWFNVTQotdmVyc2lvbiAxLjIuOGJldGE0IFtOb3ZlbWJlciAxMiwgMjAwNF0KLSAgRml4ZWQgKGFnYWluKSBkZWZpbml0aW9uIG9mIFBOR19MSUJQTkdfVkVSX0RMTE5VTSBpbiBwbmcuaCAoQ29zbWluKS4KLSAgQWRkZWQgUE5HX0xJQlBOR19CVUlMRF9QUklWQVRFIGluIHBuZy5oIChDb3NtaW4pLgotICBTZXQgcG5nX3B0ci0+enN0cmVhbS5kYXRhX3R5cGUgdG8gWl9CSU5BUlksIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGRldGVjdGlvbgotICAgIG9mIGRhdGEgdHlwZSBpbiBkZWZsYXRlIChDb3NtaW4pLgotICBEZXByZWNhdGVkIGJ1dCBjb250aW51ZSB0byBzdXBwb3J0IFNQRUNJQUxCVUlMRCBhbmQgUFJJVkFURUJVSUxEIGluIGZhdm9yIG9mCi0gICAgUE5HX0xJQlBOR19CVUlMRF9TUEVDSUFMX1NUUklORyBhbmQgUE5HX0xJQlBOR19CVUlMRF9QUklWQVRFX1NUUklORy4KLXZlcnNpb24gMS4yLjhiZXRhNSBbTm92ZW1iZXIgMjAsIDIwMDRdCi0gIFVzZSBwbmdfcHRyLT5mbGFncyBpbnN0ZWFkIG9mIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB0byBwYXNzCi0gICAgUE5HX1NUUklQX0FMUEhBIGluZm8gdG8gcG5nX2RvX3N0cmlwX2ZpbGxlcigpLCB0byBwcmVzZXJ2ZSBBQkkKLSAgICBjb21wYXRpYmlsaXR5LgotICBSZXZpc2VkIGhhbmRsaW5nIG9mIFNQRUNJQUxCVUlMRCwgUFJJVkFURUJVSUxELAotICAgIFBOR19MSUJQTkdfQlVJTERfU1BFQ0lBTF9TVFJJTkcgYW5kIFBOR19MSUJQTkdfQlVJTERfUFJJVkFURV9TVFJJTkcuCi12ZXJzaW9uIDEuMi44cmMxIFtOb3ZlbWJlciAyNCwgMjAwNF0KLSAgTW92ZWQgaGFuZGxpbmcgb2YgQlVJTEQgbWFjcm9zIGZyb20gcG5nY29uZi5oIHRvIHBuZy5oCi0gIEFkZGVkIGRlZmluaXRpb24gb2YgUE5HX0xJQlBOR19CQVNFX1RZUEUgaW4gcG5nLmgsIGluYWR2ZXJ0ZW50bHkKLSAgICBvbWl0dGVkIGZyb20gYmV0YTUuCi0gIFJldmlzZWQgc2NyaXB0cy9wbmd3MzIucmMKLSAgRGVzcGFtbWVkIG1haWxpbmcgYWRkcmVzc2VzIGJ5IG1hc2tpbmcgIkAiIHdpdGggImF0Ii4KLSAgSW5hZHZlcnRlbnRseSBpbnN0YWxsZWQgYSBzdXBwb3NlZGx5IGZhc3RlciB0ZXN0IHZlcnNpb24gb2YgcG5ncnV0aWwuYwotdmVyc2lvbiAxLjIuOHJjMiBbTm92ZW1iZXIgMjYsIDIwMDRdCi0gIEFkZGVkIHR3byBtaXNzaW5nICJcIiBpbiBwbmcuaAotICBDaGFuZ2UgdGVzdHMgaW4gcG5ncmVhZC5jIGFuZCBwbmdwcmVhZC5jIHRvCi0gICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8fCAocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfU1RSSVBfQUxQSEEpKQotICAgICAgIHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucyhwbmdfcHRyKTsKLXZlcnNpb24gMS4yLjhyYzMgW05vdmVtYmVyIDI4LCAyMDA0XQotICBSZXZlcnRlZCBwbmdydXRpbC5jIHRvIHZlcnNpb24gbGlicG5nLTEuMi44YmV0YTUuCi0gIEFkZGVkIHNjcmlwdHMvbWFrZWZpbGUuZWxmIHdpdGggc3VwcG9ydGluZyBjb2RlIGluIHBuZ2NvbmYuaCBmb3Igc3ltYm9sCi0gICAgdmVyc2lvbmluZyAoSm9obiBCb3dsZXIpLgotdmVyc2lvbiAxLjIuOHJjNCBbTm92ZW1iZXIgMjksIDIwMDRdCi0gIEFkZGVkIHByb2plY3RzL3Zpc3VhbGM3IChTaW1vbi1waWVycmUpLgotdmVyc2lvbiAxLjIuOHJjNSBbTm92ZW1iZXIgMjksIDIwMDRdCi0gIEZpeGVkIG5ldyB0eXBvIGluIHNjcmlwdHMvcG5ndzMyLnJjCi0KLXZlcnNpb24gMS4yLjggW0RlY2VtYmVyIDMsIDIwMDRdCi0gIFJlbW92ZWQgcHJvamVjdHMvdmlzdWFsYzcsIGFkZGVkIHByb2plY3RzL3Zpc3VhbGM3MS4KLQotdmVyc2lvbiAxLjIuOWJldGExIFtGZWJydWFyeSAyMSwgMjAwNl0KLQotICBJbml0aWFsaXplZCBzb21lIHN0cnVjdHVyZSBtZW1iZXJzIGluIHBuZ3d1dGlsLmMgdG8gYXZvaWQgZ2NjLTQuMC4wIGNvbXBsYWludHMKLSAgUmV2aXNlZCBtYW4gcGFnZSBhbmQgbGlicG5nLnR4dCB0byBtYWtlIGl0IGNsZWFyIHRoYXQgb25lIHNob3VsZCBub3QgY2FsbAotICAgIHBuZ19yZWFkX2VuZCBvciBwbmdfd3JpdGVfZW5kIGFmdGVyIHBuZ19yZWFkX3BuZyBvciBwbmdfd3JpdGVfcG5nLgotICBVcGRhdGVkIHJlZmVyZW5jZXMgdG8gcG5nLW1uZy1pbXBsZW1lbnQgbWFpbGluZyBsaXN0LgotICBGaXhlZCBhbiBpbmNvcnJlY3QgdHlwZWNhc3QgaW4gcG5ncnV0aWwuYwotICBBZGRlZCBQTkdfTk9fUkVBRF9TVVBQT1JURUQgY29uZGl0aW9uYWwgZm9yIG1ha2luZyBhIHdyaXRlLW9ubHkgbGlicmFyeS4KLSAgQWRkZWQgUE5HX05PX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCBjb25kaXRpb25hbC4KLSAgT3B0aW1pemVkIGFscGhhLWludmVyc2lvbiBsb29wcyBpbiBwbmd3dHJhbi5jCi0gIE1vdmVkIHRlc3QgZm9yIG5vbnplcm8gZ2FtbWEgb3V0c2lkZSBvZiBwbmdfYnVpbGRfZ2FtbWFfdGFibGUoKSBpbiBwbmdydHJhbi5jCi0gIE1ha2Ugc3VyZSBudW1fdHJhbnMgaXMgPD0gMjU2IGJlZm9yZSBjb3B5aW5nIGRhdGEgaW4gcG5nX3NldF90Uk5TKCkuCi0gIE1ha2Ugc3VyZSBudW1fcGFsZXR0ZSBpcyA8PSAyNTYgYmVmb3JlIGNvcHlpbmcgZGF0YSBpbiBwbmdfc2V0X1BMVEUoKS4KLSAgSW50ZXJjaGFuZ2VkIG9yZGVyIG9mIHdyaXRlX3N3YXBfYWxwaGEgYW5kIHdyaXRlX2ludmVydF9hbHBoYSB0cmFuc2Zvcm1zLgotICBBZGRlZCBwYXJlbnRoZXNlcyBpbiB0aGUgZGVmaW5pdGlvbiBvZiBQTkdfTElCUE5HX0JVSUxEX1RZUEUgKENvc21pbikuCi0gIE9wdGltaXplZCB6bGliIHdpbmRvdyBmbGFnIChDSU5GTykgaW4gY29udHJpYi9wbmdzdWl0ZS8qLnBuZyAoQ29zbWluKS4KLSAgVXBkYXRlZCBzY3JpcHRzL21ha2VmaWxlLmJjMzIgZm9yIEJvcmxhbmQgQysrIDUuNiAoQ29zbWluKS4KLSAgRXhwb3J0ZWQgcG5nX2dldF91aW50XzMyLCBwbmdfc2F2ZV91aW50XzMyLCBwbmdfZ2V0X3VpbnRfMTYsIHBuZ19zYXZlX3VpbnRfMTYsCi0gICAgcG5nX2dldF9pbnRfMzIsIHBuZ19zYXZlX2ludF8zMiwgcG5nX2dldF91aW50XzMxIChDb3NtaW4pLgotICBBZGRlZCB0eXBlIGNhc3QgKHBuZ19ieXRlKSBpbiBwbmdfd3JpdGVfc0NBTCgpIChDb3NtaW4pLgotICBGaXhlZCBzY3JpcHRzL21ha2VmaWxlLmN5Z3dpbiAoQ2hyaXN0aWFuIEJpZXNpbmdlciwgQ29zbWluKS4KLSAgRGVmYXVsdCBpVFh0IHN1cHBvcnQgd2FzIGluYWR2ZXJ0ZW50bHkgZW5hYmxlZC4KLQotdmVyc2lvbiAxLjIuOWJldGEyIFtGZWJydWFyeSAyMSwgMjAwNl0KLQotICBDaGVjayBmb3IgcG5nX3JnYl90b19ncmF5IGFuZCBwbmdfZ3JheV90b19yZ2IgcmVhZCB0cmFuc2Zvcm1hdGlvbnMgYmVmb3JlCi0gICAgY2hlY2tpbmcgZm9yIHBuZ19yZWFkX2RpdGhlciBpbiBwbmdydHJhbi5jCi0gIFJldmlzZWQgY2hlY2tpbmcgb2YgY2hyb21hdGljaXR5IGxpbWl0cyB0byBhY2NvbW1vZGF0ZSBleHRlbmRlZCBSR0IKLSAgICBjb2xvcnNwYWNlIChKb2huIERlbmtlcikuCi0gIENoYW5nZWQgbGluZSBlbmRpbmdzIGluIHNvbWUgb2YgdGhlIHByb2plY3QgZmlsZXMgdG8gQ1JMRiwgZXZlbiBpbiB0aGUKLSAgICAiVW5peCIgdGFyIGRpc3RyaWJ1dGlvbnMgKENvc21pbikuCi0gIE1hZGUgcG5nX2dldF9pbnRfMzIgYW5kIHBuZ19zYXZlX2ludF8zMiBhbHdheXMgYXZhaWxhYmxlIChDb3NtaW4pLgotICBVcGRhdGVkIHNjcmlwdHMvcG5nb3MyLmRlZiwgc2NyaXB0cy9wbmd3MzIuZGVmIGFuZCBwcm9qZWN0cy93aW5jZS9wbmczMmNlLmRlZgotICAgIHdpdGggdGhlIG5ld2x5IGV4cG9ydGVkIGZ1bmN0aW9ucy4KLSAgRWxpbWluYXRlZCBkaXN0cmlidXRpb25zIHdpdGhvdXQgdGhlICJjb25maWd1cmUiIHNjcmlwdC4KLSAgVXBkYXRlZCBJTlNUQUxMIGluc3RydWN0aW9ucy4KLQotdmVyc2lvbiAxLjIuOWJldGEzIFtGZWJydWFyeSAyNCwgMjAwNl0KLQotICBGaXhlZCBDUkNSTEYgbGluZSBlbmRpbmdzIGluIGNvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcuZHNwCi0gIE1hZGUgbGlicG5nLnBjIHJlc3BlY3QgRVhFQ19QUkVGSVggKEQuIFAuIEtyZWlsLCBKLiBCb3dsZXIpCi0gIFJlbW92ZWQgcmVmZXJlbmNlIHRvIHBuZ2FzbXJkLmggZnJvbSBNYWtlZmlsZS5hbQotICBSZW5hbWVkIENIQU5HRVMgdG8gQ2hhbmdlTG9nLgotICBSZW5hbWVkIExJQ0VOU0UgdG8gQ09QWUlORy4KLSAgUmVuYW1lZCBBTk5PVU5DRSB0byBORVdTLgotICBDcmVhdGVkIEFVVEhPUlMgZmlsZS4KLQotdmVyc2lvbiAxLjIuOWJldGE0IFtNYXJjaCAzLCAyMDA2XQotCi0gIENoYW5nZWQgZGVmaW5pdGlvbiBvZiBQS0dDT05GSUcgZnJvbSAkcHJlZml4L2xpYiB0byAkbGliZGlyIGluIGNvbmZpZ3VyZS5hYwotICBSZXZlcnRlZCB0byBmaWxlbmFtZXMgTElDRU5TRSBhbmQgQU5OT1VOQ0U7IHJlbW92ZWQgQVVUSE9SUyBhbmQgQ09QWUlORy4KLSAgUmVtb3ZlZCBuZXdsaW5lIGZyb20gdGhlIGVuZCBvZiBzb21lIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzLgotICBSZW1vdmVkIHRlc3QgZm9yIHNxcnQoKSBmcm9tIGNvbmZpZ3VyZS5hYyBhbmQgY29uZmlndXJlLgotICBNYWRlIHN3YXAgdGFibGVzIGluIHBuZ3RyYW5zLmMgUE5HX0NPTlNUIChDYXJsbyBCcmFtaXgpLgotICBEaXNhYmxlZCBkZWZhdWx0IGlUWHQgc3VwcG9ydCB0aGF0IHdhcyBpbmFkdmVydGVudGx5IGVuYWJsZWQgaW4KLSAgICBsaWJwbmctMS4yLjliZXRhMS4KLSAgQWRkZWQgIk9TMiIgdG8gbGlzdCBvZiBzeXN0ZW1zIHRoYXQgZG9uJ3QgbmVlZCB1bmRlcnNjb3JlcywgaW4gcG5nZ2NjcmQuYwotICBSZW1vdmVkIGxpYnBuZyB2ZXJzaW9uIGFuZCBkYXRlIGZyb20gKi5jIGZpbGVzLgotCi12ZXJzaW9uIDEuMi45YmV0YTUgW01hcmNoIDQsIDIwMDZdCi0gIFJlbW92ZWQgdHJhaWxpbmcgYmxhbmtzIGZyb20gc291cmNlIGZpbGVzLgotICBQdXQgdmVyc2lvbiBhbmQgZGF0ZSBvZiBsYXRlc3QgY2hhbmdlIGluIGVhY2ggc291cmNlIGZpbGUsIGFuZCBjaGFuZ2VkCi0gICAgY29weXJpZ2h0IHllYXIgYWNjb3JkaW5nbHkuCi0gIE1vcmUgY2xlYW51cCBvZiBjb25maWd1cmUuYWMsIE1ha2VmaWxlLmFtLCBhbmQgYXNzb2NpYXRlZCBzY3JpcHRzLgotICBSZXN0b3JlZCBzY3JpcHRzL21ha2VmaWxlLmVsZiB3aGljaCB3YXMgaW5hZHZlcnRlbnRseSBkZWxldGVkLgotCi12ZXJzaW9uIDEuMi45YmV0YTYgW01hcmNoIDYsIDIwMDZdCi0gIEZpeGVkIHR5cG8gKFJFTEVBU0UpIGluIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLXZlcnNpb24gMS4yLjliZXRhNyBbTWFyY2ggNywgMjAwNl0KLSAgUmVtb3ZlZCBsaWJwbmcudmVycyBhbmQgbGlicG5nLnN5bSBmcm9tIGxpYnBuZzEyX2xhX1NPVVJDRVMgaW4gTWFrZWZpbGUuYW0KLSAgRml4ZWQgaW5jb25zaXN0ZW50ICNpZmRlZidzIGFyb3VuZCBwbmdfc2lnX2J5dGVzKCkgYW5kIHBuZ19zZXRfc0NBTF9zKCkKLSAgICBpbiBwbmcuaC4KLSAgVXBkYXRlZCBtYWtlZmlsZS5lbGYgYXMgc3VnZ2VzdGVkIGJ5IGRlYmlhbi4KLSAgTWFkZSBjb3NtZXRpYyBjaGFuZ2VzIHRvIHNvbWUgbWFrZWZpbGVzLCBhZGRpbmcgTE5fU0YgYW5kIG90aGVyIG1hY3Jvcy4KLSAgTWFkZSBzb21lIG1ha2VmaWxlcyBhY2NlcHQgImV4ZWNfcHJlZml4Ii4KLQotdmVyc2lvbiAxLjIuOWJldGE4IFtNYXJjaCA5LCAyMDA2XQotICBGaXhlZCBzb21lICIjaWYgZGVmaW5lZCAoLi4uIiB3aGljaCBzaG91bGQgYmUgIiNpZiBkZWZpbmVkKC4uLiIKLSAgICBCdWcgaW50cm9kdWNlZCBpbiBsaWJwbmctMS4yLjguCi0gIEZpeGVkIGluY29uc2lzdGVuY3kgaW4gZGVmaW5pdGlvbiBvZiBwbmdfZGVmYXVsdF9yZWFkX2RhdGEoKQotICBSZXN0b3JlZCBibGFuayB0aGF0IHdhcyBsb3N0IGZyb20gbWFrZWZpbGUuc2dnY2MgImNsZWFuIiB0YXJnZXQgaW4gYmV0YTcuCi0gIFJldmlzZWQgY2FsY3VsYXRpb24gb2YgImN1cnJlbnQiIGFuZCAibWFqb3IiIGZvciBpcml4IGluIGx0bWFpbi5zaAotICBDaGFuZ2VkICJta2RpciIgdG8gIk1LRElSX1AiIGluIHNvbWUgbWFrZWZpbGVzLgotICBTZXBhcmF0ZWQgUE5HX0VYUEFORCBhbmQgUE5HX0VYUEFORF90Uk5TLgotICBBZGRlZCBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKSBhbmQgZGVwcmVjYXRlZAotICAgIHBuZ19zZXRfZ3JheV8xXzJfNF90b184KCkgd2hpY2ggYWxzbyBleHBhbmRzIHRSTlMgdG8gYWxwaGEuCi0KLXZlcnNpb24gMS4yLjliZXRhOSBbTWFyY2ggMTAsIDIwMDZdCi0gIEluY2x1ZGUgImNvbmZpZy5oIiBpbiBwbmdjb25mLmggd2hlbiBhdmFpbGFibGUuCi0gIEFkZGVkIHNvbWUgY2hlY2tzIGZvciBOVUxMIHBuZ19wdHIgb3IgTlVMTCBpbmZvX3B0ciAodGltZWxlc3MpCi0KLXZlcnNpb24gMS4yLjliZXRhMTAgW01hcmNoIDIwLCAyMDA2XQotICBSZW1vdmVkIGV4dHJhIENSIGZyb20gY29udHJpYi92aXN1YWxwbmcvVmlzdWFsUG5nLmRzdyAoQ29zbWluKQotICBNYWRlIHBuZ2djY3JkLmMgUElDLWNvbXBsaWFudCAoQ2hyaXN0aWFuIEFpY2hpbmdlcikuCi0gIEFkZGVkIG1ha2VmaWxlLm1pbmd3IChXb2xmZ2FuZyBHbGFzKS4KLSAgUmV2aXNlZCBwbmdjb25mLmggTU1YIGNoZWNraW5nLgotCi12ZXJzaW9uIDEuMi45YmV0YTExIFtNYXJjaCAyMiwgMjAwNl0KLSAgRml4ZWQgb3V0LW9mLW9yZGVyIGRlY2xhcmF0aW9uIGluIHBuZ3dyaXRlLmMgdGhhdCB3YXMgaW50cm9kdWNlZCBpbiBiZXRhOQotICBTaW1wbGlmaWVkIHNvbWUgbWFrZWZpbGVzIGJ5IHVzaW5nIExJQlNPLCBMSUJTT01BSiwgYW5kIExJQlNPVkVSIG1hY3Jvcy4KLQotdmVyc2lvbiAxLjIuOXJjMSBbTWFyY2ggMzEsIDIwMDZdCi0gIERlZmluZWQgUE5HX1VTRVJfUFJJVkFURUJVSUxEIHdoZW4gaW5jbHVkaW5nICJwbmd1c3IuaCIgKENvc21pbikuCi0gIFJlbW92ZWQgbm9uc2Vuc2ljYWwgYXNzZXJ0aW9uIGNoZWNrIGZyb20gcG5ndGVzdC5jIChDb3NtaW4pLgotCi12ZXJzaW9uIDEuMi45IFtBcHJpbCAxNCwgMjAwNl0KLSAgUmV2aXNlZCBtYWtlZmlsZS5iZW9zIGFuZCBhZGRlZCAibm9uZSIgc2VsZWN0b3IgaW4gbHRtYWluLnNoCi0KLXZlcnNpb24gMS4yLjEwYmV0YTEgW0FwcmlsIDE1LCAyMDA2XQotICBSZW5hbWVkICJjb25maWcuaCIgdG8gInBuZ19jb25mLmgiIGFuZCByZXZpc2VkIE1ha2VmaWxlLmFtIHRvIGFkZAotICAgIC1EUE5HX0JVSUxESU5HX0xJQlBORyB0byBjb21waWxlIGRpcmVjdGl2ZSwgYW5kIG1vZGlmaWVkIHBuZ2NvbmYuaAotICAgIHRvIGluY2x1ZGUgcG5nX2NvbmYuaCBvbmx5IHdoZW4gUE5HX0JVSUxESU5HX0xJQlBORyBpcyBkZWZpbmVkLgotCi12ZXJzaW9uIDEuMi4xMGJldGEyIFtBcHJpbCAxNSwgMjAwNl0KLSAgTWFudWFsbHkgdXBkYXRlZCBNYWtlZmlsZS5pbiBhbmQgY29uZmlndXJlLiAgQ2hhbmdlZCBwbmdfY29uZi5oLmluCi0gICAgYmFjayB0byBjb25maWcuaC4KLQotdmVyc2lvbiAxLjIuMTBiZXRhMyBbQXByaWwgMTUsIDIwMDZdCi0gIENoYW5nZSBwbmdfY29uZi5oIGJhY2sgdG8gY29uZmlnLmggaW4gcG5nY29uZi5oLgotCi12ZXJzaW9uIDEuMi4xMGJldGE0IFtBcHJpbCAxNiwgMjAwNl0KLSAgQ2hhbmdlIFBOR19CVUlMRElOR19MSUJQTkcgdG8gUE5HX0NPTkZJR1VSRV9MSUJQTkcgaW4gY29uZmlnL01ha2VmaWxlKi4KLQotdmVyc2lvbiAxLjIuMTBiZXRhNSBbQXByaWwgMTYsIDIwMDZdCi0gIEFkZGVkIGEgY29uZmlndXJlIGNoZWNrIGZvciBjb21waWxpbmcgYXNzZW1ibGVyIGNvZGUgaW4gcG5nZ2NjcmQuYwotCi12ZXJzaW9uIDEuMi4xMGJldGE2IFtBcHJpbCAxNywgMjAwNl0KLSAgUmV2aXNlZCB0aGUgY29uZmlndXJlIGNoZWNrIGZvciBwbmdnY2NyZC5jCi0gIE1vdmVkIC1EUE5HX0NPTkZJR1VSRV9MSUJQTkcgaW50byBATElCUE5HX0RFRklORVNACi0gIEFkZGVkIEBMSUJQTkdfREVGSU5FU0AgdG8gYXJndW1lbnRzIHdoZW4gYnVpbGRpbmcgbGlicG5nLnN5bQotCi12ZXJzaW9uIDEuMi4xMGJldGE3IFtBcHJpbCAxOCwgMjAwNl0KLSAgQ2hhbmdlICJleGVjX3ByZWZpeD0kcHJlZml4IiB0byAiZXhlY19wcmVmaXg9JChwcmVmaXgpIiBpbiBtYWtlZmlsZXMuCi0KLXZlcnNpb24gMS4yLjEwcmMxIFtBcHJpbCAxOSwgMjAwNl0KLSAgRW5zdXJlIHBuZ2NvbmYuaCBkb2Vzbid0IGRlZmluZSBib3RoIFBOR19VU0VfUE5HR0NDUkQgYW5kIFBOR19VU0VfUE5HVkNSRAotICBGaXhlZCAiTE5fRlMiIHR5cG8gaW4gbWFrZWZpbGUuc2NvIGFuZCBtYWtlZmlsZS5zb2xhcmlzLgotCi12ZXJzaW9uIDEuMi4xMHJjMiBbQXByaWwgMjAsIDIwMDZdCi0gIEFkZGVkIGEgYmFja3NsYXNoIGJldHdlZW4gLURQTkdfQ09ORklHVVJFX0xJQlBORyBhbmQgLURQTkdfTk9fQVNTRU1CTEVSX0NPREUKLSAgIGluIGNvbmZpZ3VyZS5hYyBhbmQgY29uZmlndXJlCi0gIE1hZGUgdGhlIGNvbmZpZ3VyZSB3YXJuaW5nIGFib3V0IHZlcnNpb25lZCBzeW1ib2xzIGxlc3MgYXJyb2dhbnQuCi0KLXZlcnNpb24gMS4yLjEwcmMzIFtBcHJpbCAyMSwgMjAwNl0KLSAgQWRkZWQgYSBub3RlIGluIGxpYnBuZy50eHQgdGhhdCBwbmdfc2V0X3NpZ19ieXRlcyg4KSBjYW4gYmUgdXNlZCB3aGVuCi0gICAgd3JpdGluZyBhbiBlbWJlZGRlZCBQTkcgd2l0aG91dCB0aGUgOC1ieXRlIHNpZ25hdHVyZS4KLSAgUmV2aXNlZCBtYWtlZmlsZXMgYW5kIGNvbmZpZ3VyZSB0byBhdm9pZCBtYWtpbmcgbGlua3MgdG8gbGlicG5nLnNvLioKLQotdmVyc2lvbiAxLjIuMTAgW0FwcmlsIDIzLCAyMDA2XQotICBSZXZlcnRlZCBjb25maWd1cmUgdG8gInJjMiIgc3RhdGUuCi0KLXZlcnNpb24gMS4yLjExYmV0YTEgW01heSAzMSwgMjAwNl0KLSAgc2NyaXB0cy9saWJwbmcucGMuaW4gY29udGFpbmVkICJjb25maWd1cmUiIHN0eWxlIHZlcnNpb24gaW5mbyBhbmQgd291bGQKLSAgICBub3Qgd29yayB3aXRoIG1ha2VmaWxlcy4KLSAgVGhlIHNoYXJlZC1saWJyYXJ5IG1ha2VmaWxlcyB3ZXJlIGxpbmtpbmcgdG8gbGlicG5nLnNvLjAgaW5zdGVhZCBvZgotICAgIGxpYnBuZy5zby4zIGNvbXBhdGliaWxpdHkgYXMgdGhlIGxpYnJhcnkuCi0KLXZlcnNpb24gMS4yLjExYmV0YTIgW0p1bmUgMiwgMjAwNl0KLSAgSW5jcmVhc2VkIHNwcmludGYgYnVmZmVyIGZyb20gNTAgdG8gNTIgY2hhcnMgaW4gcG5ncnV0aWwuYyB0byBhdm9pZAotICAgIGJ1ZmZlciBvdmVyZmxvdy4KLSAgRml4ZWQgYnVnIGluIGV4YW1wbGUuYyAocG5nX3NldF9wYWxldHRlX3JnYiAtPiBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiKQotCi12ZXJzaW9uIDEuMi4xMWJldGEzIFtKdW5lIDUsIDIwMDZdCi0gIFByZXBlbmRlZCAiIyEgL2Jpbi9zaCIgdG8gbHRtYWlsLnNoIGFuZCBjb250cmliL3BuZ21pbnVzLyouc2ggKENvc21pbikuCi0gIFJlbW92ZWQgdGhlIGFjY2lkZW50YWwgbGVmdG92ZXIgTWFrZWZpbGUuaW5+IChDb3NtaW4pLgotICBBdm9pZGVkIHBvdGVudGlhbCBidWZmZXIgb3ZlcmZsb3cgYW5kIG9wdGltaXplZCBidWZmZXIgaW4KLSAgICBwbmdfd3JpdGVfc0NBTCgpLCBwbmdfd3JpdGVfc0NBTF9zKCkgKENvc21pbikuCi0gIFJlbW92ZWQgdGhlIGluY2x1ZGUgZGlyZWN0b3JpZXMgYW5kIGxpYnJhcmllcyBmcm9tIENGTEFHUyBhbmQgTERGTEFHUwotICAgIGluIHNjcmlwdHMvbWFrZWZpbGUuZ2NjIChOZWxzb24gQS4gZGUgT2xpdmVpcmEsIENvc21pbikuCi0KLXZlcnNpb24gMS4yLjExYmV0YTQgW0p1bmUgNiwgMjAwNl0KLSAgQWxsb3cgemVyby1sZW5ndGggSURBVCBjaHVua3MgYWZ0ZXIgdGhlIGVudGlyZSB6bGliIGRhdGFzdHJlYW0sIGJ1dCBub3QKLSAgICBhZnRlciBhbm90aGVyIGludGVydmVuaW5nIGNodW5rIHR5cGUuCi0KLXZlcnNpb24gMS4wLjE5cmMxLCAxLjIuMTFyYzEgW0p1bmUgMTMsIDIwMDZdCi0gIERlbGV0ZWQgZXh0cmFuZW91cyBzcXVhcmUgYnJhY2tldHMgZnJvbSBbY29uZmlnLmhdIGluIGNvbmZpZ3VyZS5hYwotCi12ZXJzaW9uIDEuMC4xOXJjMiwgMS4yLjExcmMyIFtKdW5lIDE0LCAyMDA2XQotICBBZGRlZCBwcm90b3R5cGVzIGZvciBQTkdfSU5DSF9DT05WRVJTSU9OUyBmdW5jdGlvbnMgdG8gcG5nLmgKLSAgUmV2aXNlZCBJTlNUQUxMIGFuZCBhdXRvZ2VuLnNoCi0gIEZpeGVkIHR5cG8gaW4gc2V2ZXJhbCBtYWtlZmlsZXMgKC1XMSBzaG91bGQgYmUgLVdsKQotICBBZGRlZCB0eXBlZGVmIGZvciBwbmdfaW50XzMyIGFuZCBwbmdfdWludF8zMiBvbiA2NC1iaXQgc3lzdGVtcy4KLQotdmVyc2lvbiAxLjAuMTlyYzMsIDEuMi4xMXJjMyBbSnVuZSAxNSwgMjAwNl0KLSAgUmVtb3ZlZCB0aGUgbmV3IHR5cGVkZWZzIGZvciA2NC1iaXQgc3lzdGVtcyAoZGVsYXkgdW50aWwgdmVyc2lvbiAxLjQuMCkKLSAgQWRkZWQgb25lIHplcm8gZWxlbWVudCB0byBwbmdfZ2FtbWFfc2hpZnRbXSBhcnJheSBpbiBwbmdydHJhbi5jIHRvIGF2b2lkCi0gICAgcmVhZGluZyBvdXQgb2YgYm91bmRzLgotCi12ZXJzaW9uIDEuMC4xOXJjNCwgMS4yLjExcmM0IFtKdW5lIDE1LCAyMDA2XQotICBSZWFsbHkgcmVtb3ZlZCB0aGUgbmV3IHR5cGVkZWZzIGZvciA2NC1iaXQgc3lzdGVtcy4KLQotdmVyc2lvbiAxLjAuMTlyYzUsIDEuMi4xMXJjNSBbSnVuZSAyMiwgMjAwNl0KLSAgUmVtb3ZlZCBwbmdfc2lnX2J5dGVzIGVudHJ5IGZyb20gc2NyaXB0cy9wbmd3MzIuZGVmCi0KLXZlcnNpb24gMS4wLjE5LCAxLjIuMTEgW0p1bmUgMjYsIDIwMDZdCi0gIE5vbmUuCi0KLXZlcnNpb24gMS4wLjIwLCAxLjIuMTIgW0p1bmUgMjcsIDIwMDZdCi0gIFJlYWxseSBpbmNyZWFzZWQgc3ByaW50ZiBidWZmZXIgZnJvbSA1MCB0byA1MiBjaGFycyBpbiBwbmdydXRpbC5jIHRvIGF2b2lkCi0gICAgYnVmZmVyIG92ZXJmbG93LgotCi12ZXJzaW9uIDEuMi4xM2JldGExIFtPY3RvYmVyIDIsIDIwMDZdCi0gIFJlbW92ZWQgQUNfRlVOQ19NQUxMT0MgZnJvbSBjb25maWd1cmUuYWMKLSAgV29yayBhcm91bmQgSW50ZWwtTWFjIGNvbXBpbGVyIGJ1ZyBieSBzZXR0aW5nIFBOR19OT19NTVhfQ09ERSBpbiBwbmdjb25mLmgKLSAgQ2hhbmdlICJsb2dpY2FsIiB0byAiYml0d2lzZSIgdGhyb3VnaG91dCBkb2N1bWVudGF0aW9uLgotICBEZXRlY3QgYW5kIGZpeCBhdHRlbXB0IHRvIHdyaXRlIHdyb25nIGlDQ1AgcHJvZmlsZSBsZW5ndGguCi0KLXZlcnNpb24gMS4wLjIxLCAxLjIuMTMgW05vdmVtYmVyIDE0LCAyMDA2XQotICBGaXggcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvdyBpbiBzUExUIGNodW5rIGhhbmRsZXIuCi0gIEZpeCBNYWtlZmlsZS5hbSB0byBub3QgdHJ5IHRvIGxpbmsgdG8gbm9leGlzdGVudCBmaWxlcy4KLSAgQ2hlY2sgYWxsIGV4cG9ydGVkIGZ1bmN0aW9ucyBmb3IgTlVMTCBwbmdfcHRyLgotCi12ZXJzaW9uIDEuMi4xNGJldGExIFtOb3ZlbWJlciAxNywgMjAwNl0KLSAgUmVsb2NhdGVkIHRocmVlIG1pc3BsYWNlZCB0ZXN0cyBmb3IgTlVMTCBwbmdfcHRyLgotICBCdWlsdCBNYWtlZmlsZS5pbiB3aXRoIGF1dG9tYWtlLTEuOS42IGluc3RlYWQgb2YgMS45LjIuCi0gIEJ1aWxkIGNvbmZpZ3VyZSB3aXRoIGF1dG9jb25mLTIuNjAgaW5zdGVhZCBvZiAyLjU5Ci0KLXZlcnNpb24gMS4yLjE0YmV0YTIgW05vdmVtYmVyIDE3LCAyMDA2XQotICBBZGRlZCBzb21lIHR5cGVjYXN0cyBpbiBwbmdfemFsbG9jKCkuCi0KLXZlcnNpb24gMS4yLjE0cmMxIFtOb3ZlbWJlciAyMCwgMjAwNl0KLSAgQ2hhbmdlZCAic3RydG9kIiB0byAicG5nX3N0cnRvZCIgaW4gcG5ncnV0aWwuYwotCi12ZXJzaW9uIDEuMC4yMiwgMS4yLjE0ICAgIFtOb3ZlbWJlciAyNywgMjAwNl0KLSAgQWRkZWQgbWlzc2luZyAiJChzcmNkaXIpIiBpbiBNYWtlZmlsZS5hbSBhbmQgTWFrZWZpbGUuaW4KLQotdmVyc2lvbiAxLjIuMTViZXRhMSBbRGVjZW1iZXIgMywgMjAwNl0KLSAgR2VuZXJhdGVkIGNvbmZpZ3VyZSB3aXRoIGF1dG9jb25mLTIuNjEgaW5zdGVhZCBvZiAyLjYwCi0gIFJldmlzZWQgY29uZmlndXJlLmFjIHRvIHVwZGF0ZSBsaWJwbmcucGMgYW5kIGxpYnBuZy1jb25maWcuCi0KLXZlcnNpb24gMS4yLjE1YmV0YTIgW0RlY2VtYmVyIDMsIDIwMDZdCi0gIEFsd2F5cyBleHBvcnQgTU1YIGFzbSBmdW5jdGlvbnMsIGp1c3Qgc3R1YnMgaWYgbm90IGJ1aWxkaW5nIHBuZ2djY3JkLmMKLQotdmVyc2lvbiAxLjIuMTViZXRhMyBbRGVjZW1iZXIgNCwgMjAwNl0KLSAgQWRkICJwbmdfYnl0ZXAiIHR5cGVjYXN0IHRvIHByb2ZpbGUgd2hpbGUgY2FsY3VsYXRpbmcgbGVuZ3RoIGluIHBuZ3d1dGlsLmMKLQotdmVyc2lvbiAxLjIuMTViZXRhNCBbRGVjZW1iZXIgNywgMjAwNl0KLSAgQWRkZWQgc2NyaXB0cy9DTWFrZUxpc3RzLnR4dAotICBDaGFuZ2VkIFBOR19OT19BU1NFTUJMRVJfQ09ERSB0byBQTkdfTk9fTU1YX0NPREUgaW4gc2NyaXB0cywgbGlrZSAxLjQuMGJldGEKLQotdmVyc2lvbiAxLjIuMTViZXRhNSBbRGVjZW1iZXIgNywgMjAwNl0KLSAgQ2hhbmdlZCBzb21lIGluc3RhbmNlcyBvZiBQTkdfQVNTRU1CTEVSXyogdG8gUE5HX01NWF8qIGluIHBuZ2djY3JkLmMKLSAgUmV2aXNlZCBzY3JpcHRzL0NNYWtlTGlzdHMudHh0Ci0KLXZlcnNpb24gMS4yLjE1YmV0YTYgW0RlY2VtYmVyIDEzLCAyMDA2XQotICBSZXZpc2VkIHNjcmlwdHMvQ01ha2VMaXN0cy50eHQgYW5kIGNvbmZpZ3VyZS5hYwotCi12ZXJzaW9uIDEuMi4xNXJjMSBbRGVjZW1iZXIgMTgsIDIwMDZdCi0gIFJldmlzZWQgc2NyaXB0cy9DTWFrZUxpc3RzLnR4dAotCi12ZXJzaW9uIDEuMi4xNXJjMiBbRGVjZW1iZXIgMjEsIDIwMDZdCi0gIEFkZGVkIGNvbmRpdGlvbmFsICN1bmRlZiBqbXBidWYgaW4gcG5ndGVzdC5jIHRvIHVuZG8gI2RlZmluZSBpbiBBSVggaGVhZGVycy4KLSAgQWRkZWQgc2NyaXB0cy9tYWtlZmlsZS5ub21teAotCi12ZXJzaW9uIDEuMi4xNXJjMyBbRGVjZW1iZXIgMjUsIDIwMDZdCi0gIEZpeGVkIHNoYXJlZCBsaWJyYXJ5IG51bWJlcmluZyBlcnJvciB0aGF0IHdhcyBpbnRyb2R1Y2VkIGluIDEuMi4xNWJldGE2LgotCi12ZXJzaW9uIDEuMi4xNXJjNCBbRGVjZW1iZXIgMjcsIDIwMDZdCi0gIEZpeGVkIGhhbmRsaW5nIG9mIHJnYl90b19ncmF5IHdoZW4gcG5nX3B0ci0+Y29sb3IuZ3JheSBpc24ndCBzZXQuCi0KLXZlcnNpb24gMS4yLjE1cmM1IFtEZWNlbWJlciAzMSwgMjAwNl0KLSAgUmV2aXNlZCBoYW5kbGluZyBvZiByZ2JfdG9fZ3JheS4KLQotdmVyc2lvbiAxLjIuMTUgW0phbnVhcnkgNSwgMjAwN10KLSAgQWRkZWQgc29tZSAodW5zaWduZWQgbG9uZykgdHlwZWNhc3RzIGluIHBuZ3Rlc3QuYyB0byBhdm9pZCBwcmludGluZyBlcnJvcnMuCi0KLXZlcnNpb24gMS4yLjE2YmV0YTEgW0phbnVhcnkgNiwgMjAwN10KLSAgRml4IGJ1Z3MgaW4gbWFrZWZpbGUubm9tbXgKLQotdmVyc2lvbiAxLjIuMTZiZXRhMiBbSmFudWFyeSAxNiwgMjAwN10KLSAgUmV2aXNlZCBzY3JpcHRzL0NNYWtlTGlzdHMudHh0Ci0KLXZlcnNpb24gMS4yLjE2IFtKYW51YXJ5IDMxLCAyMDA3XQotICBObyBjaGFuZ2VzLgotCi12ZXJzaW9uIDEuMi4xN2JldGExIFtNYXJjaCA2LCAyMDA3XQotICBSZXZpc2VkIHNjcmlwdHMvQ01ha2VMaXN0cy50eHQgdG8gaW5zdGFsbCBib3RoIHNoYXJlZCBhbmQgc3RhdGljIGxpYnJhcmllcy4KLSAgRGVsZXRlZCBhIHJlZHVuZGFudCBsaW5lIGZyb20gcG5nc2V0LmMuCi0KLXZlcnNpb24gMS4yLjE3YmV0YTIgW0FwcmlsIDI2LCAyMDA3XQotICBSZWxvY2F0ZWQgbWlzcGxhY2VkIHRlc3QgZm9yIHBuZ19wdHIgPT0gTlVMTCBpbiBwbmdwcmVhZC5jCi0gIENoYW5nZSAiPT0iIHRvICImIiBmb3IgdGVzdGluZyBQTkdfUkdCX1RPX0dSQVlfRVJSICYgUE5HX1JHQl9UT19HUkFZX1dBUk4KLSAgICBmbGFncy4KLSAgQ2hhbmdlZCByZW1haW5pbmcgaW5zdGFuY2VzIG9mIFBOR19BU1NFTUJMRVJfKiB0byBQTkdfTU1YXyoKLSAgQWRkZWQgcG5nZXJyb3IoKSB3aGVuIHdyaXRlX0lIRFIgZmFpbHMgaW4gZGVmbGF0ZUluaXQyKCkuCi0gIEFkZGVkICJjb25zdCIgdG8gc29tZSBhcnJheSBkZWNsYXJhdGlvbnMuCi0gIE1lbnRpb24gZXhhbXBsZXMgb2YgbGlicG5nIHVzYWdlIGluIHRoZSBsaWJwbmcqLnR4dCBhbmQgbGlicG5nLjMgZG9jdW1lbnRzLgotCi12ZXJzaW9uIDEuMi4xN3JjMSBbTWF5IDQsIDIwMDddCi0gIE5vIGNoYW5nZXMuCi0KLXZlcnNpb24gMS4yLjE3cmMyIFtNYXkgOCwgMjAwN10KLSAgTW92ZWQgc2V2ZXJhbCBQTkdfSEFWRV8qIG1hY3JvcyBvdXQgb2YgUE5HX0lOVEVSTkFMIGJlY2F1c2UgYXBwbGljYXRpb25zCi0gICAgY2FsbGluZyBzZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbigpIG5lZWQgdGhlbS4KLSAgQ2hhbmdlZCB0cmFuc2Zvcm1hdGlvbiBmbGFnIGZyb20gUE5HX0VYUEFORF90Uk5TIHRvIFBOR19FWFBBTkQgaW4KLSAgICBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKS4KLSAgQWRkZWQgcG5nX3B0ci0+dW5rbm93bl9jaHVuayB0byBob2xkIHdvcmtpbmcgdW5rbm93biBjaHVuayBkYXRhLCBzbyBpdAotICAgIGNhbiBiZSBmcmVlJ2VkIGluIGNhc2Ugb2YgZXJyb3IuICBSZXZpc2VkIHVua25vd24gY2h1bmsgaGFuZGxpbmcgaW4KLSAgICBwbmdydXRpbC5jIGFuZCBwbmdwcmVhZC5jIHRvIHVzZSB0aGlzIHN0cnVjdHVyZS4KLQotdmVyc2lvbiAxLjIuMTdyYzMgW01heSA4LCAyMDA3XQotICBSZXZpc2VkIHN5bWJvbC1oYW5kbGluZyBpbiBjb25maWd1cmUgc2NyaXB0LgotCi12ZXJzaW9uIDEuMi4xN3JjNCBbTWF5IDEwLCAyMDA3XQotICBSZXZpc2VkIHVua25vd24gY2h1bmsgaGFuZGxpbmcgdG8gYXZvaWQgc3RvcmluZyB1bmtub3duIGNyaXRpY2FsIGNodW5rcy4KLQotdmVyc2lvbiAxLjAuMjUgW01heSAxNSwgMjAwN10KLXZlcnNpb24gMS4yLjE3IFtNYXkgMTUsIDIwMDddCi0gIEFkZGVkICJwbmdfcHRyLT5udW1fdHJhbnM9MCIgYmVmb3JlIGVycm9yIHJldHVybiBpbiBwbmdfaGFuZGxlX3RSTlMsCi0gICAgdG8gZWxpbWluYXRlIGEgdnVsbmVyYWJpbGl0eSAoQ1ZFLTIwMDctMjQ0NSwgQ0VSVCBWVSM2ODQ2NjQpCi0KLXZlcnNpb24gMS4wLjI2IFtNYXkgMTUsIDIwMDddCi12ZXJzaW9uIDEuMi4xOCBbTWF5IDE1LCAyMDA3XQotICBSZXZlcnRlZCB0aGUgbGlicG5nLTEuMi4xN3JjMyBjaGFuZ2UgdG8gc3ltYm9sLWhhbmRsaW5nIGluIGNvbmZpZ3VyZSBzY3JpcHQKLQotdmVyc2lvbiAxLjIuMTliZXRhMSBbTWF5IDE4LCAyMDA3XQotICBDaGFuZ2VkICJjb25zdCBzdGF0aWMiIHRvICJzdGF0aWMgUE5HX0NPTlNUIiBldmVyeXdoZXJlLCBtb3N0bHkgdW5kb2luZwotICAgIGNoYW5nZSBvZiBsaWJwbmctMS4yLjE3YmV0YTIuICBDaGFuZ2VkIG90aGVyICJjb25zdCIgdG8gIlBOR19DT05TVCIKLSAgQ2hhbmdlZCBzb21lIGhhbmRsaW5nIG9mIHVudXNlZCBwYXJhbWV0ZXJzLCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4KLSAgICAiaWYgKHVudXNlZCA9PSBOVUxMKSByZXR1cm47IiBiZWNvbWVzICJ1bnVzZWQgPSB1bnVzZWQiLgotCi12ZXJzaW9uIDEuMi4xOWJldGEyIFtNYXkgMTgsIDIwMDddCi0gIE9ubHkgdXNlIHRoZSB2YWxpZCBiaXRzIG9mIHRSTlMgdmFsdWUgaW4gcG5nX2RvX2V4cGFuZCgpIChCcmlhbiBDYXJ0aWVyKQotCi12ZXJzaW9uIDEuMi4xOWJldGEzIFtNYXkgMTksIDIwMDddCi0gIEFkZCBzb21lICJwbmdfYnl0ZSIgdHlwZWNhc3RzIGluIHBuZ19jaGVja19rZXl3b3JkKCkgYW5kIHdyaXRlIG5ld19rZXkKLSAgaW5zdGVhZCBvZiBrZXkgaW4gelRYdCBjaHVuayAoS2V2aW4gUnlkZSkuCi0KLXZlcnNpb24gMS4yLjE5YmV0YTQgW01heSAyMSwgMjAwN10KLSAgQWRkIHBuZ19zbnByaW50ZigpIGZ1bmN0aW9uIGFuZCB1c2UgaXQgaW4gcGxhY2Ugb2Ygc3ByaW50KCkgZm9yIGltcHJvdmVkCi0gICAgZGVmZW5zZSBhZ2FpbnN0IGJ1ZmZlciBvdmVyZmxvd3MuCi0KLXZlcnNpb24gMS4yLjE5YmV0YTUgW01heSAyMSwgMjAwN10KLSAgRml4ZWQgcG5nX2hhbmRsZV90Uk5TKCkgdG8gb25seSB1c2UgdGhlIHZhbGlkIGJpdHMgb2YgdFJOUyB2YWx1ZS4KLSAgQ2hhbmdlZCBoYW5kbGluZyBvZiBtb3JlIHVudXNlZCBwYXJhbWV0ZXJzLCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4KLSAgUmVtb3ZlZCBzb21lIFBOR19DT05TVCBpbiBwbmd3dXRpbC5jIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotCi12ZXJzaW9uIDEuMi4xOWJldGE2IFtNYXkgMjIsIDIwMDddCi0gIEFkZGVkIHNvbWUgI2lmZGVmIFBOR19NTVhfQ09ERV9TVVBQT1JURUQgd2hlcmUgbmVlZGVkIGluIHBuZ3ZjcmQuYwotICBBZGRlZCBhIHNwZWNpYWwgIl9NU0NfVkVSIiBjYXNlIHRoYXQgZGVmaW5lcyBwbmdfc25wcmludGYgdG8gX3NucHJpbnRmCi0KLXZlcnNpb24gMS4yLjE5YmV0YTcgW01heSAyMiwgMjAwN10KLSAgU3F1ZWxjaGVkIHBuZ19zcXVlbGNoX3dhcm5pbmdzKCkgaW4gcG5nZ2NjcmQuYyBhbmQgYWRkZWQKLSAgICBhbiAjaWZkZWYgUE5HX01NWF9DT0RFX1NVUFBPUlRFRCBibG9jayBhcm91bmQgdGhlIGRlY2xhcmF0aW9ucyB0aGF0IGNhdXNlZAotICAgIHRoZSB3YXJuaW5ncyB0aGF0IHBuZ19zcXVlbGNoX3dhcm5pbmdzIHdhcyBzcXVlbGNoaW5nLgotCi12ZXJzaW9uIDEuMi4xOWJldGE4IFtNYXkgMjIsIDIwMDddCi0gIFJlbW92ZWQgX19NTVhfXyBmcm9tIHRlc3QgaW4gcG5nY29uZi5oLgotCi12ZXJzaW9uIDEuMi4xOWJldGE5IFtNYXkgMjMsIDIwMDddCi0gIE1hZGUgcG5nX3NxdWVsY2hfd2FybmluZ3MoKSBhdmFpbGFibGUgdmlhIFBOR19TUVVFTENIX1dBUk5JTkdTIG1hY3JvLgotICBSZXZpc2VkIHBuZ19zcXVlbGNoX3dhcm5pbmdzKCkgc28gaXQgbWlnaHQgd29yay4KLSAgVXBkYXRlZCBtYWtlZmlsZS5zZ2NjIGFuZCBtYWtlZmlsZS5zb2xhcmlzOyBhZGRlZCBtYWtlZmlsZS5zb2xhcmlzLXg4Ni4KLQotdmVyc2lvbiAxLjIuMTliZXRhMTAgW01heSAyNCwgMjAwN10KLSAgUmVzcXVlbGNoZWQgcG5nX3NxdWVsY2hfd2FybmluZ3MoKSwgdXNlICJfX2F0dHJpYnV0ZV9fKCh1c2VkKSkiIGluc3RlYWQuCi0KLXZlcnNpb24gMS40LjBiZXRhMSBbQXByaWwgMjAsIDIwMDZdCi0gIEVuYWJsZWQgaVRYdCBzdXBwb3J0IChjaGFuZ2VzIHBuZ19zdHJ1Y3QsIHRodXMgcmVxdWlyZXMgc28tbnVtYmVyIGNoYW5nZSkuCi0gIENsZWFuZWQgdXAgUE5HX0FTU0VNQkxFUl9DT0RFX1NVUFBPUlRFRCB2cyBQTkdfTU1YX0NPREVfU1VQUE9SVEVECi0gIEVsaW1pbmF0ZWQgUE5HXzFfMF9YIGFuZCBQTkdfMV8yX1ggbWFjcm9zLgotICBSZW1vdmVkIGRlcHJlY2F0ZWQgZnVuY3Rpb25zIHBuZ19yZWFkX2luaXQsIHBuZ193cml0ZV9pbml0LCBwbmdfaW5mb19pbml0LAotICAgIHBuZ19wZXJtaXRfZW1wdHlfcGx0ZSwgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgsIHBuZ19jaGVja19zaWcsIGFuZAotICAgIHJlbW92ZWQgdGhlIGRlcHJlY2F0ZWQgbWFjcm8gUE5HX01BWF9VSU5ULgotICBNb3ZlZCAiUE5HX0lOVEVSTkFMIiBwYXJ0cyBvZiBwbmcuaCBhbmQgcG5nY29uZi5oIGludG8gcG5naW50cm4uaAotICBSZW1vdmVkIG1hbnkgV0lOMzJfV0NFICNpZmRlZnMgKENvc21pbikuCi0gIFJlZHVjZWQgZGVwZW5kZW5jeSBvbiBDLXJ1bnRpbWUgbGlicmFyeSB3aGVuIG9uIFdpbmRvd3MgKFNpbW9uLVBpZXJyZSkKLSAgUmVwbGFjZWQgc3ByaW50ZigpIHdpdGggcG5nX3NwcmludGYoKSAoU2ltb24tUGllcnJlKQotCi12ZXJzaW9uIDEuNC4wYmV0YTIgW0FwcmlsIDIwLCAyMDA2XQotICBSZXZpc2VkIG1ha2VmaWxlcyBhbmQgY29uZmlndXJlIHRvIGF2b2lkIG1ha2luZyBsaW5rcyB0byBsaWJwbmcuc28uKgotICBNb3ZlZCBzb21lIGxlZnRvdmVyIE1NWC1yZWxhdGVkIGRlZmluZXMgZnJvbSBwbmdjb25mLmggdG8gcG5naW50cm4uaAotICBVcGRhdGVkIHNjcmlwdHMvcG5nb3MyLmRlZiwgcG5ndzMyLmRlZiwgYW5kIHByb2plY3RzL3dpbmNlL3BuZzMyY2UuZGVmCi0KLXZlcnNpb24gMS40LjBiZXRhMyBbTWF5IDEwLCAyMDA2XQotICBVcGRhdGVkIHNjcmlwdHMvcG5ndzMyLmRlZiB0byBjb21tZW50IG91dCBNTVggZnVuY3Rpb25zLgotICBBZGRlZCBQTkdfTk9fR0VUX0lOVF8zMiBhbmQgUE5HX05PX1NBVkVfSU5UXzMyIG1hY3Jvcy4KLSAgU2NyaXB0cy9saWJwbmcucGMuaW4gY29udGFpbmVkICJjb25maWd1cmUiIHN0eWxlIHZlcnNpb24gaW5mbyBhbmQgd291bGQKLSAgICBub3Qgd29yayB3aXRoIG1ha2VmaWxlcy4KLSAgUmV2aXNlZCBwbmdjb25mLmggYW5kIGFkZGVkIHBuZ2NvbmYuaC5pbiwgc28gbWFrZWZpbGVzIGFuZCBjb25maWd1cmUgY2FuCi0gICAgcGFzcyBkZWZpbmVzIHRvIGxpYnBuZyBhbmQgYXBwbGljYXRpb25zLgotCi12ZXJzaW9uIDEuNC4wYmV0YTQgW01heSAxMSwgMjAwNl0KLSAgUmV2aXNlZCBjb25maWd1cmUuYWMsIE1ha2VmaWxlLmFtLCBhbmQgbWFueSBvZiB0aGUgbWFrZWZpbGVzIHRvIHdyaXRlCi0gICAgdGhlaXIgZGVmaW5lcyBpbiBwbmdjb25mLmguCi0KLXZlcnNpb24gMS40LjBiZXRhNSBbTWF5IDE1LCAyMDA2XQotICBBZGRlZCBhIG1pc3Npbmcgc2VtaWNvbG9uIGluIE1ha2VmaWxlLmFtIGFuZCBNYWtlZmlsZS5pbgotICBEZWxldGVkIGV4dHJhbmVvdXMgc3F1YXJlIGJyYWNrZXRzIGZyb20gY29uZmlndXJlLmFjCi0KLXZlcnNpb24gMS40LjBiZXRhNiBbSnVuZSAyLCAyMDA2XQotICBJbmNyZWFzZWQgc3ByaW50ZiBidWZmZXIgZnJvbSA1MCB0byA1MiBjaGFycyBpbiBwbmdydXRpbC5jIHRvIGF2b2lkCi0gICAgYnVmZmVyIG92ZXJmbG93LgotICBDaGFuZ2VkIHNvbnVtIGZyb20gMCB0byAxLgotICBSZW1vdmVkIHVudXNlZCBwcm90b3R5cGUgZm9yIHBuZ19jaGVja19zaWcoKSBmcm9tIHBuZy5oCi0KLXZlcnNpb24gMS40LjBiZXRhNyBbSnVuZSAxNiwgMjAwNl0KLSAgRXhwb3J0ZWQgcG5nX3dyaXRlX3NpZyAoQ29zbWluKS4KLSAgT3B0aW1pemVkIGJ1ZmZlciBpbiBwbmdfaGFuZGxlX2NIUk0oKSAoQ29zbWluKS4KLSAgU2V0IHBIWXMgPSAyODM1IHggMjgzNSBwaXhlbHMgcGVyIG1ldGVyLCBhbmQgYWRkZWQKLSAgICBzQ0FMID0gMC4zNTI3NzhlLTMgeCAwLjM1Mjc3OGUtMyBtZXRlcnMsIGluIHBuZ3Rlc3QucG5nIChDb3NtaW4pLgotICBBZGRlZCBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMoKSwgcG5nX2Jlbmlnbl9lcnJvcigpLCBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKCkuCi0gIEFkZGVkIHR5cGVkZWYgZm9yIHBuZ19pbnRfMzIgYW5kIHBuZ191aW50XzMyIG9uIDY0LWJpdCBzeXN0ZW1zLgotICBBZGRlZCAiKHVuc2lnbmVkIGxvbmcpIiB0eXBlY2FzdCBvbiBwbmdfdWludF8zMiB2YXJpYWJsZXMgaW4gcHJpbnRmIGxpc3RzLgotCi12ZXJzaW9uIDEuNC4wYmV0YTggW0p1bmUgMjIsIDIwMDZdCi0gIEFkZGVkIGRlbW9uc3RyYXRpb24gb2YgdXNlciBjaHVuayBzdXBwb3J0IGluIHBuZ3Rlc3QuYywgdG8gc3VwcG9ydCB0aGUKLSAgICBwdWJsaWMgc1RFUiBjaHVuayBhbmQgYSBwcml2YXRlIHZwQWcgY2h1bmsuCi0KLXZlcnNpb24gMS40LjBiZXRhOSBbSnVseSAzLCAyMDA2XQotICBSZW1vdmVkIG9yZGluYWxzIGZyb20gc2NyaXB0cy9wbmd3MzIuZGVmIGFuZCByZW1vdmVkIHBuZ19pbmZvX2ludCBhbmQKLSAgICBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCBlbnRyaWVzLgotICBJbmxpbmUgY2FsbCBvZiBwbmdfZ2V0X3VpbnRfMzIoKSBpbiBwbmdfZ2V0X3VpbnRfMzEoKS4KLSAgVXNlIHBuZ19nZXRfdWludF8zMSgpIHRvIGdldCB2cEFnIHdpZHRoIGFuZCBoZWlnaHQgaW4gcG5ndGVzdC5jCi0gIFJlbW92ZWQgV0lOQ0UgYW5kIE5ldHdhcmUgcHJvamVjdHMuCi0gIFJlbW92ZWQgc3RhbmRhbG9uZSBZMktJTkZPIGZpbGUuCi0KLXZlcnNpb24gMS40LjBiZXRhMTAgW0p1bHkgMTIsIDIwMDZdCi0gIEVsaW1pbmF0ZWQgYXV0b21hdGljIGNvcHkgb2YgcG5nY29uZi5oIHRvIHBuZ2NvbmYuaC5pbiBmcm9tIGNvbmZpZ3VyZSBhbmQKLSAgICBzb21lIG1ha2VmaWxlcywgYmVjYXVzZSBpdCB3YXMgbm90IHdvcmtpbmcgcmVsaWFibHkuICBJbnN0ZWFkLCBkaXN0cmlidXRlCi0gICAgcG5nY29uZi5oLmluIGFsb25nIHdpdGggcG5nY29uZi5oIGFuZCBjYXVzZSBjb25maWd1cmUgYW5kIHNvbWUgb2YgdGhlCi0gICAgbWFrZWZpbGVzIHRvIHVwZGF0ZSBwbmdjb25mLmggZnJvbSBwbmdjb25mLmguaW4uCi0gIEFkZGVkIHBuZ2NvbmYuaCB0byBERVBFTkRFTkNJRVMgaW4gTWFrZWZpbGUuYW0KLQotdmVyc2lvbiAxLjQuMGJldGExMSBbQXVndXN0IDE5LCAyMDA2XQotICBSZW1vdmVkIEFDX0ZVTkNfTUFMTE9DIGZyb20gY29uZmlndXJlLmFjLgotICBBZGRlZCBhIHdhcm5pbmcgd2hlbiB3cml0aW5nIGlDQ1AgcHJvZmlsZSB3aXRoIG1pc21hdGNoZWQgcHJvZmlsZSBsZW5ndGguCi0gIFBhdGNoZWQgcG5nZ2NjcmQuYyB0byBhc3NlbWJsZSBvbiB4ODZfNjQgcGxhdGZvcm1zLgotICBNb3ZlZCBjaHVuayBoZWFkZXIgcmVhZGluZyBpbnRvIGEgc2VwYXJhdGUgZnVuY3Rpb24gcG5nX3JlYWRfY2h1bmtfaGVhZGVyKCkKLSAgICBpbiBwbmdydXRpbC5jLiAgVGhlIGNodW5rIGhlYWRlciAobGVuK3NpZykgaXMgbm93IHNlcmlhbGl6ZWQgaW4gYSBzaW5nbGUKLSAgICBvcGVyYXRpb24gKENvc21pbikuCi0gIEltcGxlbWVudGVkIHN1cHBvcnQgZm9yIEkvTyBzdGF0ZXMuIEFkZGVkIHBuZ19wdHIgbWVtYmVyIGlvX3N0YXRlLCBhbmQKLSAgICBmdW5jdGlvbnMgcG5nX2dldF9pb19jaHVua19uYW1lKCkgYW5kIHBuZ19nZXRfaW9fc3RhdGUoKSBpbiBwbmdnZXQuYwotICAgIChDb3NtaW4pLgotICBBZGRlZCBwbmdfZ2V0X2lvX2NodW5rX25hbWUgYW5kIHBuZ19nZXRfaW9fc3RhdGUgdG8gc2NyaXB0cy8qLmRlZiAoQ29zbWluKS4KLSAgUmVuYW1lZCBzY3JpcHRzL3BuZ3czMi4qIHRvIHNjcmlwdHMvcG5nd2luLiogKENvc21pbikuCi0gIFJlbW92ZWQgdGhlIGluY2x1ZGUgZGlyZWN0b3JpZXMgYW5kIGxpYnJhcmllcyBmcm9tIENGTEFHUyBhbmQgTERGTEFHUwotICAgIGluIHNjcmlwdHMvbWFrZWZpbGUuZ2NjIChDb3NtaW4pLgotICBVc2VkIHBuZ19zYXZlX3VpbnRfMzIoKSB0byBzZXQgdnBBZyB3aWR0aCBhbmQgaGVpZ2h0IGluIHBuZ3Rlc3QuYyAoQ29zbWluKS4KLSAgQ2FzdCB0byBwcm9wZXIgdHlwZSB3aGVuIGdldHRpbmcvc2V0dGluZyB2cEFnIHVuaXRzIGluIHBuZ3Rlc3QuYyAoQ29zbWluKS4KLSAgQWRkZWQgcG5naW50cm4uaCB0byB0aGUgVmlzdWFsIEMrKyBwcm9qZWN0cyAoQ29zbWluKS4KLSAgUmVtb3ZlZCBzY3JpcHRzL2xpc3QgKENvc21pbikuCi0gIFVwZGF0ZWQgY29weXJpZ2h0IHllYXIgaW4gc2NyaXB0cy9wbmd3aW4uZGVmIChDb3NtaW4pLgotICBSZW1vdmVkIFBOR19UWVBFQ0FTVF9OVUxMIGFuZCB1c2VkIHN0YW5kYXJkIE5VTEwgY29uc2lzdGVudGx5IChDb3NtaW4pLgotICBEaXNhbGxvd2VkIHRoZSB1c2VyIHRvIHJlZGVmaW5lIHBuZ19zaXplX3QsIGFuZCBlbmZvcmNlZCBhIGNvbnNpc3RlbnQgdXNlCi0gICAgb2YgcG5nX3NpemVfdCBhY3Jvc3MgbGlicG5nIChDb3NtaW4pLgotICBDaGFuZ2VkIHRoZSB0eXBlIG9mIHBuZ19wdHItPnJvd2J5dGVzLCBQTkdfUk9XQllURVMoKSBhbmQgZnJpZW5kcwotICAgIHRvIHBuZ19zaXplX3QgKENvc21pbikuCi0gIFJlbW92ZWQgcG5nX2NvbnZlcnRfc2l6ZSgpIGFuZCByZXBsYWNlZCBwbmdfc2l6ZW9mIHdpdGggc2l6ZW9mIChDb3NtaW4pLgotICBSZW1vdmVkIHNvbWUgdW5uZWNlc3NhcnkgdHlwZSBjYXN0cyAoQ29zbWluKS4KLSAgQ2hhbmdlZCBwcm90b3R5cGUgb2YgcG5nX2dldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSgpIGFuZAotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUoKSB0byB3b3JrIHdpdGggcG5nX3NpemVfdCBpbnN0ZWFkIG9mCi0gICAgcG5nX3VpbnRfMzIgKENvc21pbikuCi0gIFJlbW92ZWQgcG5nX21lbWNweV9jaGVjaygpIGFuZCBwbmdfbWVtc2V0X2NoZWNrKCkgKENvc21pbikuCi0gIEZpeGVkIGEgdHlwbyAocG5nX2J5dGUgLS0+IHBuZ19ieXRlcCkgaW4gbGlicG5nLjMgYW5kIGxpYnBuZy50eHQgKENvc21pbikuCi0gIENsYXJpZmllZCB0aGF0IHBuZ196YWxsb2MoKSBkb2VzIG5vdCBjbGVhciB0aGUgYWxsb2NhdGVkIG1lbW9yeSwKLSAgICBhbmQgcG5nX3phbGxvYygpIGFuZCBwbmdfemZyZWUoKSBjYW5ub3QgYmUgUE5HQVBJIChDb3NtaW4pLgotICBSZW5hbWVkIHBuZ19tZW1fc2l6ZV90IHRvIHBuZ19hbGxvY19zaXplX3QsIGZpeGVkIGl0cyBkZWZpbml0aW9uIGluCi0gICAgcG5nY29uZi5oLCBhbmQgdXNlZCBpdCBpbiBhbGwgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIChDb3NtaW4pLgotICBSZW5hbWVkIHBuZ2ludHJuLmggdG8gcG5ncHJpdi5oLCBhZGRlZCBhIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZQotICAgIG1lbnRpb25pbmcgdGhhdCB0aGUgc3ltYm9scyBkZWNsYXJlZCBpbiB0aGF0IGZpbGUgYXJlIHByaXZhdGUsIGFuZAotICAgIHVwZGF0ZWQgdGhlIHNjcmlwdHMgYW5kIHRoZSBWaXN1YWwgQysrIHByb2plY3RzIGFjY29yZGluZ2x5IChDb3NtaW4pLgotICBSZW1vdmVkIGNpcmN1bGFyIHJlZmVyZW5jZXMgYmV0d2VlbiBwbmdjb25mLmggYW5kIHBuZ2NvbmYuaC5pbiBpbgotICAgIHNjcmlwdHMvbWFrZWZpbGUudmMqd2luMzIgKENvc21pbikuCi0gIFJlbW92aW5nIHRyYWlsaW5nICcuJyBmcm9tIHRoZSB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcyAoQ29zbWluKS4KLSAgQWRkZWQgcG5nZGVmcy5oIHRoYXQgaXMgYnVpbHQgYnkgbWFrZWZpbGUgb3IgY29uZmlndXJlLCBpbnN0ZWFkIG9mCi0gICAgcG5nY29uZi5oLmluIChHbGVubikuCi0gIERldGVjdCBhbmQgZml4IGF0dGVtcHQgdG8gd3JpdGUgd3JvbmcgaUNDUCBwcm9maWxlIGxlbmd0aC4KLQotdmVyc2lvbiAxLjQuMGJldGExMiBbT2N0b2JlciAxOSwgMjAwNl0KLSAgQ2hhbmdlZCAibG9naWNhbCIgdG8gImJpdHdpc2UiIGluIHRoZSBkb2N1bWVudGF0aW9uLgotICBXb3JrIGFyb3VuZCBJbnRlbC1NYWMgY29tcGlsZXIgYnVnIGJ5IHNldHRpbmcgUE5HX05PX01NWF9DT0RFIGluIHBuZ2NvbmYuaAotICBBZGQgYSB0eXBlY2FzdCB0byBzdGlmbGUgY29tcGlsZXIgd2FybmluZyBpbiBwbmdydXRpbC5jCi0KLXZlcnNpb24gMS40LjBiZXRhMTMgW05vdmVtYmVyIDEwLCAyMDA2XQotICBGaXggcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvdyBpbiBzUExUIGNodW5rIGhhbmRsZXIuCi0gIEZpeCBNYWtlZmlsZS5hbSB0byBub3QgdHJ5IHRvIGxpbmsgdG8gbm9leGlzdGVudCBmaWxlcy4KLQotdmVyc2lvbiAxLjQuMGJldGExNCBbTm92ZW1iZXIgMTUsIDIwMDZdCi0gIENoZWNrIGFsbCBleHBvcnRlZCBmdW5jdGlvbnMgZm9yIE5VTEwgcG5nX3B0ci4KLQotdmVyc2lvbiAxLjQuMGJldGExNSBbTm92ZW1iZXIgMTcsIDIwMDZdCi0gIFJlbG9jYXRlZCB0d28gbWlzcGxhY2VkIHRlc3RzIGZvciBOVUxMIHBuZ19wdHIuCi0gIEJ1aWx0IE1ha2VmaWxlLmluIHdpdGggYXV0b21ha2UtMS45LjYgaW5zdGVhZCBvZiAxLjkuMi4KLSAgQnVpbGQgY29uZmlndXJlIHdpdGggYXV0b2NvbmYtMi42MCBpbnN0ZWFkIG9mIDIuNTkKLSAgQWRkICJpbnN0YWxsOiBhbGwiIGluIE1ha2VmaWxlLmFtIHNvICJjb25maWd1cmU7IG1ha2UgaW5zdGFsbCIgd2lsbCB3b3JrLgotCi12ZXJzaW9uIDEuNC4wYmV0YTE2IFtOb3ZlbWJlciAxNywgMjAwNl0KLSAgQWRkZWQgYSB0eXBlY2FzdCBpbiBwbmdfemFsbG9jKCkuCi0KLXZlcnNpb24gMS40LjBiZXRhMTcgW0RlY2VtYmVyIDQsIDIwMDZdCi0gIENoYW5nZWQgIm5ld19rZXlbNzldID0gJ1wwJzsiIHRvICIoKm5ld19rZXkpWzc5XSA9ICdcMCc7IiBpbiBwbmd3dXRpbC5jCi0gIEFkZCAicG5nX2J5dGVwIiB0eXBlY2FzdCB0byBwcm9maWxlIHdoaWxlIGNhbGN1bGF0aW5nIGxlbmd0aCBpbiBwbmd3dXRpbC5jCi0KLXZlcnNpb24gMS40LjBiZXRhMTggW0RlY2VtYmVyIDcsIDIwMDZdCi0gIEFkZGVkIHNjcmlwdHMvQ01ha2VMaXN0cy50eHQKLQotdmVyc2lvbiAxLjQuMGJldGExOSBbTWF5IDE2LCAyMDA3XQotICBSZXZpc2VkIHNjcmlwdHMvQ01ha2VMaXN0cy50eHQKLSAgUmVidWlsdCBjb25maWd1cmUgYW5kIE1ha2VmaWxlLmluIHdpdGggbmV3ZXIgdG9vbHMuCi0gIEFkZGVkIGNvbmRpdGlvbmFsICN1bmRlZiBqbXBidWYgaW4gcG5ndGVzdC5jIHRvIHVuZG8gI2RlZmluZSBpbiBBSVggaGVhZGVycy4KLSAgQWRkZWQgc2NyaXB0cy9tYWtlZmlsZS5ub21teAotCi12ZXJzaW9uIDEuNC4wYmV0YTIwIFtKdWx5IDksIDIwMDhdCi0gIE1vdmVkIHNldmVyYWwgUE5HX0hBVkVfKiBtYWNyb3MgZnJvbSBwbmdwcml2LmggdG8gcG5nLmggYmVjYXVzZSBhcHBsaWNhdGlvbnMKLSAgICBjYWxsaW5nIHNldF91bmtub3duX2NodW5rX2xvY2F0aW9uKCkgbmVlZCB0aGVtLgotICBNb3ZlZCBzZXZlcmFsIG1hY3JvIGRlZmluaXRpb25zIGZyb20gcG5ncHJpdi5oIHRvIHBuZ2NvbmYuaAotICBNZXJnZSB3aXRoIGNoYW5nZXMgdG8gdGhlIDEuMi5YIGJyYW5jaCwgYXMgb2YgMS4yLjMwYmV0YTA0LgotICBEZWxldGVkIGFsbCB1c2Ugb2YgdGhlIE1NWCBhc3NlbWJsZXIgY29kZSBhbmQgSW50ZWwtbGljZW5zZWQgb3B0aW1pemF0aW9ucy4KLSAgUmV2aXNlZCBtYWtlZmlsZS5taW5ndwotCi12ZXJzaW9uIDEuNC4wYmV0YTIxIFtKdWx5IDIxLCAyMDA4XQotICBNb3ZlZCBsb2NhbCBhcnJheSAiY2h1bmtkYXRhIiBmcm9tIHBuZ3J1dGlsLmMgdG8gdGhlIHBuZ19zdHJ1Y3QsIHNvCi0gICAgaXQgd2lsbCBiZSBmcmVlZCBieSBwbmdfcmVhZF9kZXN0cm95KCkgaW4gY2FzZSBvZiBhIHJlYWQgZXJyb3IgKEt1cnQKLSAgICBDaHJpc3RlbnNlbikuCi0KLXZlcnNpb24gMS40LjBiZXRhMjIgW0p1bHkgMjEsIDIwMDhdCi0gIENoYW5nZSAicHVycG9zZSIgYW5kICJidWZmZXIiIHRvIHBuZ19wdHItPmNodW5rZGF0YSB0byBhdm9pZCBtZW1vcnkgbGVha2luZy4KLQotdmVyc2lvbiAxLjQuMGJldGEyMyBbSnVseSAyMiwgMjAwOF0KLSAgQ2hhbmdlICJjaHVua2RhdGEgPSBOVUxMIiB0byAicG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTCIgc2V2ZXJhbCBwbGFjZXMgaW4KLSAgICBwbmdfZGVjb21wcmVzc19jaHVuaygpLgotCi12ZXJzaW9uIDEuNC4wYmV0YTI0IFtKdWx5IDI1LCAyMDA4XQotICBDaGFuZ2UgYWxsIHJlbWFpbmluZyAiY2h1bmtkYXRhIiB0byAicG5nX3B0ci0+Y2h1bmtkYXRhIiBpbgotICAgIHBuZ19kZWNvbXByZXNzX2NodW5rKCksIGFuZCByZW1vdmUgImNodW5rZGF0YSIgZnJvbSBwYXJhbWV0ZXIgbGlzdC4KLSAgUHV0IGEgY2FsbCB0byBwbmdfY2hlY2tfY2h1bmtfbmFtZSgpIGluIHBuZ19yZWFkX2NodW5rX2hlYWRlcigpLgotICBSZXZpc2VkIHBuZ19jaGVja19jaHVua19uYW1lKCkgdG8gcmVqZWN0IGEgbmFtZSB3aXRoIGEgbG93ZXJjYXNlIDNyZCBieXRlLgotICBSZW1vdmVkIHR3byBjYWxscyB0byBwbmdfY2hlY2tfY2h1bmtfbmFtZSgpIG9jY3VyaW5nIGxhdGVyIGluIHRoZSBwcm9jZXNzLgotICBEZWZpbmUgUE5HX05PX0VSUk9SX05VTUJFUlMgYnkgZGVmYXVsdCBpbiBwbmdjb25mLmgKLQotdmVyc2lvbiAxLjQuMGJldGEyNSBbSnVseSAzMCwgMjAwOF0KLSAgQWRkZWQgYSBjYWxsIHRvIHBuZ19jaGVja19jaHVua19uYW1lKCkgaW4gcG5ncHJlYWQuYwotICBSZXZlcnRlZCBwbmdfY2hlY2tfY2h1bmtfbmFtZSgpIHRvIGFjY2VwdCBhIG5hbWUgd2l0aCBhIGxvd2VyY2FzZSAzcmQgYnl0ZS4KLSAgQWRkZWQgcG5nX3B1c2hfaGF2ZV9idWZmZXIoKSBmdW5jdGlvbiB0byBwbmdwcmVhZC5jCi0gIEVsaW1pbmF0ZWQgUE5HX0JJR19FTkRJQU5fU1VQUE9SVEVEIGFuZCBhc3NvY2lhdGVkIHBuZ19nZXRfKiBtYWNyb3MuCi0gIE1hZGUgaW5saW5lIGV4cGFuc2lvbiBvZiBwbmdfZ2V0XyooKSBvcHRpb25hbCB3aXRoIFBOR19VU0VfUkVBRF9NQUNST1MuCi0gIEVsaW1pbmF0ZWQgYWxsIFBOR19VU0VMRVNTX1RFU1RTIGFuZCBQTkdfQ09SUkVDVF9QQUxFVFRFX1NVUFBPUlRFRCBjb2RlLgotICBTeW5jZWQgY29udHJpYiBkaXJlY3RvcnkgYW5kIGNvbmZpZ3VyZSBmaWxlcyB3aXRoIGxpYnBuZy0xLjIuMzBiZXRhMDYuCi0gIEVsaW1pbmF0ZWQgbm8tbG9uZ2VyLXVzZWQgcG5nZGVmcy5oIChidXQgaXQncyBzdGlsbCBidWlsdCBpbiB0aGUgbWFrZWZpbGVzKQotICBSZWxvY2F0ZWQgYSBtaXNwbGFjZWQgIiNlbmRpZiAvKiBQTkdfTk9fV1JJVEVfRklMVEVSICovIiBpbiBwbmd3dXRpbC5jCi0KLXZlcnNpb24gMS40LjBiZXRhMjYgW0F1Z3VzdCA0LCAyMDA4XQotICBSZW1vdmVkIHBuZ19wdXNoX2hhdmVfYnVmZmVyKCkgZnVuY3Rpb24gaW4gcG5ncHJlYWQuYy4gIEl0IGluY3JlYXNlZCB0aGUKLSAgICBjb21waWxlZCBsaWJyYXJ5IHNpemUgc2xpZ2h0bHkuCi0gIENoYW5nZWQgIi1XYWxsIiB0byAiLVcgLVdhbGwiIGluIHRoZSBDRkxBR1MgaW4gYWxsIG1ha2VmaWxlcyAoQ29zbWluIFRydXRhKQotICBEZWNsYXJlZCBwbmdfcHRyICJ2b2xhdGlsZSIgaW4gcG5ncmVhZC5jIGFuZCBwbmd3cml0ZS5jIHRvIGF2b2lkIHdhcm5pbmdzLgotICBVcGRhdGVkIGNvbnRyaWIvdmlzdXBuZy9jZXhjZXB0LmggdG8gdmVyc2lvbiAyLjAuMQotICBBZGRlZCBQTkdfTElURVJBTF9DSEFSQUNURVIgbWFjcm9zIGZvciAjLCBbLCBhbmQgXS4KLQotdmVyc2lvbiAxLjQuMGJldGEyNyBbQXVndXN0IDUsIDIwMDhdCi0gIFJldmlzZWQgdXNhZ2Ugb2YgUE5HX0xJVEVSQUxfU0hBUlAgaW4gcG5nZXJyb3IuYy4KLSAgTW92ZWQgbmV3bGluZSBjaGFyYWN0ZXIgZnJvbSBpbmRpdmlkdWFsIHBuZ19kZWJ1ZyBtZXNzYWdlcyBpbnRvIHRoZQotICAgIHBuZ19kZWJ1ZyBtYWNyb3MuCi0gIEFsbG93IHVzZXIgdG8gI2RlZmluZSB0aGVpciBvd24gcG5nX2RlYnVnLCBwbmdfZGVidWcxLCBhbmQgcG5nX2RlYnVnMi4KLQotdmVyc2lvbiAxLjQuMGJldGEyOCBbQXVndXN0IDUsIDIwMDhdCi0gIFJldmlzZWQgdXNhZ2Ugb2YgUE5HX0xJVEVSQUxfU0hBUlAgaW4gcG5nZXJyb3IuYy4KLSAgQWRkZWQgUE5HX1NUUklOR19ORVdMSU5FIG1hY3JvCi0KLXZlcnNpb24gMS40LjBiZXRhMjkgW0F1Z3VzdCA5LCAyMDA4XQotICBSZXZpc2VkIHVzYWdlIG9mIFBOR19TVFJJTkdfTkVXTElORSB0byB3b3JrIG9uIG5vbi1JU08gY29tcGlsZXJzLgotICBBZGRlZCBQTkdfU1RSSU5HX0NPUFlSSUdIVCBtYWNyby4KLSAgQWRkZWQgbm9uLUlTTyB2ZXJzaW9ucyBvZiBwbmdfZGVidWcgbWFjcm9zLgotCi12ZXJzaW9uIDEuNC4wYmV0YTMwIFtBdWd1c3QgMTQsIDIwMDhdCi0gIEFkZGVkIHByZW11bHRpcGxpZWQgYWxwaGEgZmVhdHVyZSAoVm9sa2VyIFdpZW5kbCkuCi0KLXZlcnNpb24gMS40LjBiZXRhMzEgW0F1Z3VzdCAxOCwgMjAwOF0KLSAgTW92ZWQgcG5nX3NldF9wcmVtdWx0aXBseV9hbHBoYSBmcm9tIHBuZ3RyYW5zLmMgdG8gcG5ncnRyYW4uYwotICBSZW1vdmVkIGV4dHJhIGNyYyBjaGVjayBhdCB0aGUgZW5kIG9mIHBuZ19oYW5kbGVfY0hSTSgpLiAgQnVnIGludHJvZHVjZWQKLSAgICBpbiBsaWJwbmctMS40LjBiZXRhMjAuCi0KLXZlcnNpb24gMS40LjBiZXRhMzIgW0F1Z3VzdCAxOSwgMjAwOF0KLSAgQWRkZWQgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRCBibG9jayBhcm91bmQgbmV3IHBuZ19mbHVzaCgpIGNhbGwuCi0gIFJldmlzZWQgUE5HX05PX1NURElPIHZlcnNpb24gb2YgcG5nX3dyaXRlX2ZsdXNoKCkKLQotdmVyc2lvbiAxLjQuMGJldGEzMyBbQXVndXN0IDIwLCAyMDA4XQotICBBZGRlZCBwbmdfZ2V0fHNldF9jaHVua19jYWNoZV9tYXgoKSB0byBsaW1pdCB0aGUgdG90YWwgbnVtYmVyIG9mIHNQTFQsCi0gICAgdGV4dCwgYW5kIHVua25vd24gY2h1bmtzIHRoYXQgY2FuIGJlIHN0b3JlZC4KLQotdmVyc2lvbiAxLjQuMGJldGEzNCBbU2VwdGVtYmVyIDYsIDIwMDhdCi0gIFNob3J0ZW5lZCB0SU1FX3N0cmluZyB0byAyOSBieXRlcyBpbiBwbmd0ZXN0LmMKLSAgRml4ZWQgb2ZmLWJ5LW9uZSBlcnJvciBpbnRyb2R1Y2VkIGluIHBuZ19wdXNoX3JlYWRfelRYdCgpIGZ1bmN0aW9uIGluCi0gICAgbGlicG5nLTEuMi4zMGJldGEwNC9wbmdwcmVhZC5jIChIYXJhbGQgdmFuIERpamspCi0KLXZlcnNpb24gMS40LjBiZXRhMzUgW09jdG9iZXIgNiwgMjAwOF0KLSAgQ2hhbmdlZCAidHJhbnNfdmFsdWVzIiB0byAidHJhbnNfY29sb3IiLgotICBDaGFuZ2VkIHNvLW51bWJlciBmcm9tIDAgdG8gMTQuICBTb21lIE9TIGRvIG5vdCBsaWtlIDAuCi0gIFJldmlzZWQgbWFrZWZpbGUuZGFyd2luIHRvIGZpeCBzaGFyZWQgbGlicmFyeSBudW1iZXJpbmcuCi0gIENoYW5nZSBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpIHRvIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpCi0gICAgaW4gZXhhbXBsZS5jIChkZWJpYW4gYnVnIHJlcG9ydCkKLQotdmVyc2lvbiAxLjQuMGJldGEzNiBbT2N0b2JlciAyNSwgMjAwOF0KLSAgU3luYyB3aXRoIHRFWHQgdnVsbmVyYWJpbGl0eSBmaXggaW4gbGlicG5nLTEuMi4zM3JjMDIuCi0KLXZlcnNpb24gMS40LjBiZXRhMzcgW05vdmVtYmVyIDEzLCAyMDA4XQotICBBZGRlZCBwbmdfY2hlY2tfY0hSTSBpbiBwbmcuYyBhbmQgbW92ZWQgY2hlY2tpbmcgZnJvbSBwbmdnZXQuYywgcG5ncnV0aWwuYywKLSAgICBhbmQgcG5nd3JpdGUuYwotCi12ZXJzaW9uIDEuNC4wYmV0YTM4IFtOb3ZlbWJlciAyMiwgMjAwOF0KLSAgQWRkZWQgY2hlY2sgZm9yIHplcm8tYXJlYSBSR0IgY0hSTSB0cmlhbmdsZSBpbiBwbmdfY2hlY2tfY0hSTSgpIGFuZAotICAgIHBuZ19jaGVja19jSFJNX2ZpeGVkKCkuCi0KLXZlcnNpb24gMS40LjBiZXRhMzkgW05vdmVtYmVyIDIzLCAyMDA4XQotICBSZXZpc2VkIHBuZ193YXJuaW5nKCkgdG8gd3JpdGUgaXRzIG1lc3NhZ2Ugb24gc3RhbmRhcmQgb3V0cHV0IGJ5IGRlZmF1bHQKLSAgICB3aGVuIHdhcm5pbmdfZm4gaXMgTlVMTC4KLQotdmVyc2lvbiAxLjQuMGJldGE0MCBbTm92ZW1iZXIgMjQsIDIwMDhdCi0gIEVsaW1pbmF0ZWQgcG5nX2NoZWNrX2NIUk0oKS4gIEluc3RlYWQsIGFsd2F5cyB1c2UgcG5nX2NoZWNrX2NIUk1fZml4ZWQoKS4KLSAgSW4gcG5nX2NoZWNrX2NIUk1fZml4ZWQoKSwgZW5zdXJlIHdoaXRlX3kgaXMgPiAwLCBhbmQgcmVtb3ZlZCByZWR1bmRhbnQKLSAgICBjaGVjayBmb3IgYWxsLXplcm8gY29vcmRpbmF0ZXMgdGhhdCBpcyBkZXRlY3RlZCBieSB0aGUgdHJpYW5nbGUgY2hlY2suCi0KLXZlcnNpb24gMS40LjBiZXRhNDEgW05vdmVtYmVyIDI2LCAyMDA4XQotICBGaXhlZCBzdHJpbmcgdnMgcG9pbnRlci10by1zdHJpbmcgZXJyb3IgaW4gcG5nX2NoZWNrX2tleXdvcmQoKS4KLSAgUmVhcnJhbmdlZCB0ZXN0IGV4cHJlc3Npb25zIGluIHBuZ19jaGVja19jSFJNX2ZpeGVkKCkgdG8gYXZvaWQgaW50ZXJuYWwKLSAgICBvdmVyZmxvd3MuCi0gIEFkZGVkIFBOR19OT19DSEVDS19jSFJNIGNvbmRpdGlvbmFsLgotCi12ZXJzaW9uIDEuNC4wYmV0YTQyLCA0MyBbRGVjZW1iZXIgMSwgMjAwOF0KLSAgTWVyZ2UgcG5nX2RlYnVnIHdpdGggdmVyc2lvbiAxLjIuMzRiZXRhMDQuCi0KLXZlcnNpb24gMS40LjBiZXRhNDQgW0RlY2VtYmVyIDYsIDIwMDhdCi0gIFJlbW92ZWQgcmVkdW5kYW50IGNoZWNrIGZvciBrZXk9PU5VTEwgYmVmb3JlIGNhbGxpbmcgcG5nX2NoZWNrX2tleXdvcmQoKQotICAgIHRvIGVuc3VyZSB0aGF0IG5ld19rZXkgZ2V0cyBpbml0aWFsaXplZCBhbmQgcmVtb3ZlZCBleHRyYSB3YXJuaW5nCi0gICAgKE1lcmdlIHdpdGggdmVyc2lvbiAxLjIuMzRiZXRhMDUgLS0gQXJ2YW4gUHJpdGNoYXJkKS4KLQotdmVyc2lvbiAxLjQuMGJldGE0NSBbRGVjZW1iZXIgOSwgMjAwOF0KLSAgSW4gcG5nX3dyaXRlX3BuZygpLCByZXNwZWN0IHRoZSBwbGFjZW1lbnQgb2YgdGhlIGZpbGxlciBieXRlcyBpbiBhbiBlYXJsaWVyCi0gICAgY2FsbCB0byBwbmdfc2V0X2ZpbGxlcigpIChKaW0gQmFycnkpLgotCi12ZXJzaW9uIDEuNC4wYmV0YTQ2IFtEZWNlbWJlciAxMCwgMjAwOF0KLSAgVW5kaWQgcHJldmlvdXMgY2hhbmdlIGFuZCBhZGRlZCBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUl9CRUZPUkUgYW5kCi0gICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQUZURVIgY29uZGl0aW9uYWxzIGFuZCBkZXByZWNhdGVkCi0gICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVIgKEppbSBCYXJyeSkuCi0KLXZlcnNpb24gMS40LjBiZXRhNDcgW0RlY2VtYmVyIDE1LCAyMDA4XQotICBTdXBwb3J0IGZvciBkaXRoZXJpbmcgd2FzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgaXQgaGFzIG5ldmVyCi0gICAgYmVlbiB3ZWxsIHRlc3RlZCBhbmQgZG9lc24ndCB3b3JrIHZlcnkgd2VsbC4gIFRoZSBjb2RlIGhhcyBub3QKLSAgICBiZWVuIHJlbW92ZWQsIGhvd2V2ZXIsIGFuZCBjYW4gYmUgZW5hYmxlZCBieSBidWlsZGluZyBsaWJwbmcgd2l0aAotICAgIFBOR19SRUFEX0RJVEhFUl9TVVBQT1JURUQgZGVmaW5lZC4KLQotdmVyc2lvbiAxLjQuMGJldGE0OCBbRmVicnVhcnkgMTQsIDIwMDldCi0gIEFkZGVkIG5ldyBleHBvcnRlZCBmdW5jdGlvbiBwbmdfY2FsbG9jKCkuCi0gIENvbWJpbmVkIHNldmVyYWwgaW5zdGFuY2VzIG9mIHBuZ19tYWxsb2MoKTsgcG5nX21lbXNldCgpIGludG8gcG5nX2NhbGxvYygpLgotICBSZW1vdmVkIHByb3RvdHlwZSBmb3IgcG5nX2ZyZWVwdHIoKSB0aGF0IHdhcyBhZGRlZCBpbiBsaWJwbmctMS40LjBiZXRhMjQKLSAgICBidXQgd2FzIG5ldmVyIGRlZmluZWQuCi0KLXZlcnNpb24gMS40LjBiZXRhNDkgW0ZlYnJ1YXJ5IDI4LCAyMDA5XQotICBBZGRlZCBwbmdfZmlsZW5vKCkgbWFjcm8gdG8gcG5nY29uZi5oLCB1c2VkIGluIHBuZ3dpby5jCi0gIENvcnJlY3RlZCBvcmRlciBvZiAjaWZkZWYncyBpbiBwbmdfZGVidWcgZGVmaW5pdGlvbiBpbiBwbmcuaAotICBGaXhlZCBidWcgaW50cm9kdWNlZCBpbiBsaWJwbmctMS40LjBiZXRhNDggd2l0aCB0aGUgbWVtc2V0IGFyZ3VtZW50cwotICAgIGZvciBwY2FsX3BhcmFtcy4KLSAgRml4ZWQgb3JkZXIgb2YgI2lmZGVmIGRpcmVjdGl2ZXMgaW4gdGhlIHBuZ19kZWJ1ZyBkZWZpbmVzIGluIHBuZy5oCi0gICAgKGJ1ZyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjIuMzQvMS40LjBiZXRhMjkpLgotICBSZXZpc2VkIGNvbW1lbnRzIGluIHBuZ19zZXRfcmVhZF9mbigpIGFuZCBwbmdfc2V0X3dyaXRlX2ZuKCkuCi0KLXZlcnNpb24gMS40LjBiZXRhNTAgW01hcmNoIDE4LCAyMDA5XQotICBVc2UgcG5nX2NhbGxvYygpIGluc3RlYWQgb2YgcG5nX21hbGxvYygpIHRvIGFsbG9jYXRlIGJpZ19yb3dfYnVmIHdoZW4KLSAgICByZWFkaW5nIGFuIGludGVybGFjZWQgZmlsZSwgdG8gYXZvaWQgYSBwb3NzaWJsZSBVTVIuCi0gIFVuZGlkIHJldmlzaW9uIG9mIFBOR19OT19TVERJTyB2ZXJzaW9uIG9mIHBuZ193cml0ZV9mbHVzaCgpLiAgVXNlcnMKLSAgICBoYXZpbmcgdHJvdWJsZSB3aXRoIGZmbHVzaCgpIGNhbiBidWlsZCB3aXRoIFBOR19OT19XUklURV9GTFVTSCBkZWZpbmVkCi0gICAgb3Igc3VwcGx5IHRoZWlyIG93biBmbHVzaF9mbigpIHJlcGxhY2VtZW50LgotICBSZXZpc2VkIGxpYnBuZyoudHh0IGFuZCBwbmcuaCBkb2N1bWVudGF0aW9uIGFib3V0IHVzZSBvZiBwbmdfd3JpdGVfZmx1c2goKQotICAgIGFuZCBwbmdfc2V0X3dyaXRlX2ZuKCkuCi0gIFJlbW92ZWQgZmZsdXNoKCkgZnJvbSBwbmd0ZXN0LmMuCi0gIEFkZGVkICIjZGVmaW5lIFBOR19OT19XUklURV9GTFVTSCIgdG8gY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL3BuZ3Vzci5oCi0KLXZlcnNpb24gMS40LjBiZXRhNTEgW01hcmNoIDIxLCAyMDA5XQotICBSZW1vdmVkIG5ldyBwbmdfZmlsZW5vKCkgbWFjcm8gZnJvbSBwbmdjb25mLmggLgotCi12ZXJzaW9uIDEuNC4wYmV0YTUyIFtNYXJjaCAyNywgMjAwOV0KLSAgUmVsb2NhdGVkIHBuZ19kb19jaG9wKCkgYWhlYWQgb2YgYnVpbGRpbmcgZ2FtbWEgdGFibGVzIGluIHBuZ3J0cmFuLmMKLSAgICBUaGlzIGF2b2lkcyBidWlsZGluZyAxNi1iaXQgZ2FtbWEgdGFibGVzIHVubmVjZXNzYXJpbHkuCi0gIFJlbW92ZWQgZmZsdXNoKCkgZnJvbSBwbmd0ZXN0LmMuCi0gIEFkZGVkICIjZGVmaW5lIFBOR19OT19XUklURV9GTFVTSCIgdG8gY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL3BuZ3Vzci5oCi0gIEFkZGVkIGEgc2VjdGlvbiBvbiBkaWZmZXJlbmNlcyBiZXR3ZWVuIDEuMC54IGFuZCAxLjIueCB0byBsaWJwbmcuMy9saWJwbmcudHh0Ci0KLXZlcnNpb24gMS40LjBiZXRhNTMgW0FwcmlsIDEsIDIwMDldCi0gIFJlbW92ZWQgc29tZSByZW1haW5pbmcgTU1YIG1hY3JvcyBmcm9tIHBuZ3ByaXYuaAotICBGaXhlZCBwb3RlbnRpYWwgbWVtb3J5IGxlYWsgb2YgIm5ld19uYW1lIiBpbiBwbmdfd3JpdGVfaUNDUCgpIChSYWxwaCBHaWxlcykKLQotdmVyc2lvbiAxLjQuMGJldGE1NCBbQXByaWwgMTMsIDIwMDldCi0gIEFkZGVkICJpZm5kZWYgUE5HX1NLSVBfU0VUSk1QX0NIRUNLIiBibG9jayBpbiBwbmdjb25mLmggdG8gYWxsb3cKLSAgICBhcHBsaWNhdGlvbiBjb2RlIHdyaXRlcnMgdG8gYnlwYXNzIHRoZSBjaGVjayBmb3IgbXVsdGlwbGUgaW5jbHVzaW9uCi0gICAgb2Ygc2V0am1wLmggd2hlbiB0aGV5IGtub3cgdGhhdCBpdCBpcyBzYWZlIHRvIGlnbm9yZSB0aGUgc2l0dWF0aW9uLgotICBFbGltaW5hdGVkIGludGVybmFsIHVzZSBvZiBzZXRqbXAoKSBpbiBwbmdyZWFkLmMgYW5kIHBuZ3dyaXRlLmMKLSAgUmVvcmRlcmVkIGFuY2lsbGFyeSBjaHVua3MgaW4gcG5ndGVzdC5wbmcgdG8gYmUgdGhlIHNhbWUgYXMgd2hhdAotICAgIHBuZ3Rlc3Qgbm93IHByb2R1Y2VzLCBhbmQgbWFkZSBzb21lIGNvc21ldGljIGNoYW5nZXMgdG8gcG5ndGVzdCBvdXRwdXQuCi0gIEVsaW1pbmF0ZWQgZGVwcmVjYXRlZCBwbmdfcmVhZF9pbml0XzMoKSBhbmQgcG5nX3dyaXRlX2luaXRfMygpIGZ1bmN0aW9ucy4KLQotdmVyc2lvbiAxLjQuMGJldGE1NSBbQXByaWwgMTUsIDIwMDldCi0gIFNpbXBsaWZpZWQgZXJyb3IgaGFuZGxpbmcgaW4gcG5ncmVhZC5jIGFuZCBwbmd3cml0ZS5jIGJ5IHB1dHRpbmcKLSAgICB0aGUgbmV3IHBuZ19yZWFkX2NsZWFudXAoKSBhbmQgcG5nX3dyaXRlX2NsZWFudXAoKSBmdW5jdGlvbnMgaW5saW5lLgotCi12ZXJzaW9uIDEuNC4wYmV0YTU2IFtBcHJpbCAyNSwgMjAwOV0KLSAgUmVuYW1lZCAidXNlcl9jaHVua19kYXRhIiB0byAibXlfdXNlcl9jaHVua19kYXRhIiBpbiBwbmd0ZXN0LmMgdG8gc3VwcHJlc3MKLSAgICAic2hhZG93ZWQgZGVjbGFyYXRpb24iIHdhcm5pbmcgZnJvbSBnY2MtNC4zLjMuCi0gIFJlbmFtZWQgImdhbW1hIiB0byAicG5nX2dhbW1hIiBpbiBwbmdzZXQuYyB0byBhdm9pZCAic2hhZG93ZWQgZGVjbGFyYXRpb24iCi0gICAgd2FybmluZyBhYm91dCBhIGdsb2JhbCAiZ2FtbWEiIHZhcmlhYmxlIGluIG1hdGguaCBvbiBzb21lIHBsYXRmb3Jtcy4KLQotdmVyc2lvbiAxLjQuMGJldGE1NyBbTWF5IDIsIDIwMDldCi0gIFJlbW92ZWQgcHJvdG90eXBlIGZvciBwbmdfZnJlZXB0cigpIHRoYXQgd2FzIGFkZGVkIGluIGxpYnBuZy0xLjQuMGJldGEyNAotICAgIGJ1dCB3YXMgbmV2ZXIgZGVmaW5lZCAoYWdhaW4pLgotICBSZWJ1aWx0IGNvbmZpZ3VyZSBzY3JpcHRzIHdpdGggYXV0b2NvbmYtMi42MyBpbnN0ZWFkIG9mIDIuNjIKLSAgUmVtb3ZlZCBwbmdwcmVmcy5oIGFuZCBNTVggZnJvbSBtYWtlZmlsZXMKLQotdmVyc2lvbiAxLjQuMGJldGE1OCBbTWF5IDE0LCAyMDA5XQotICBDaGFuZ2VkIHBuZ3czMi5kZWYgdG8gcG5nd2luLmRlZiBpbiBtYWtlZmlsZS5taW5ndyAodHlwbyB3YXMgaW50cm9kdWNlZAotICAgIGluIGJldGE1NykuCi0gIENsYXJpZmllZCB1c2FnZSBvZiBzaWdfYml0IHZlcnN1cyBzaWdfYml0X3AgaW4gZXhhbXBsZS5jIChWaW5jZW50IFRvcnJpKQotCi12ZXJzaW9uIDEuNC4wYmV0YTU5IFtNYXkgMTUsIDIwMDldCi0gIFJlZm9ybWF0ZWQgc291cmNlcyBpbiBsaWJwbmcgc3R5bGUgKDMtc3BhY2UgaW50ZW50YXRpb24sIGNvbW1lbnQgZm9ybWF0KQotICBGaXhlZCB0eXBvIGluIGxpYnBuZyBkb2NzIChQTkdfRklMVEVSX0FWRSBzaG91bGQgYmUgUE5HX0ZJTFRFUl9BVkcpCi0gIEFkZGVkIHNlY3Rpb25zIGFib3V0IHRoZSBnaXQgcmVwb3NpdG9yeSBhbmQgb3VyIGNvZGluZyBzdHlsZSB0byB0aGUKLSAgICBkb2N1bWVudGF0aW9uCi0gIFJlbG9jYXRlZCBtaXNwbGFjZWQgI2VuZGlmIGluIHBuZ3dyaXRlLmMsIHNDQUwgY2h1bmsgaGFuZGxlci4KLQotdmVyc2lvbiAxLjQuMGJldGE2MCBbTWF5IDE5LCAyMDA5XQotICBDb25kaXRpb25hbGx5IGNvbXBpbGUgcG5nX3JlYWRfZmluaXNoX3JvdygpIHdoaWNoIGlzIG5vdCB1c2VkIGJ5Ci0gICAgcHJvZ3Jlc3NpdmUgcmVhZGVycy4KLSAgQWRkZWQgY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyIHRvIGRlbW9uc3RyYXRlIGJ1aWxkaW5nIG1pbmltYWwgcHJvZ3Jlc3NpdmUKLSAgICBkZWNvZGVyLCBiYXNlZCBvbiBjb250cmliL2dyZWdib29rIHdpdGggZW1iZWRkZWQgbGlicG5nIGFuZCB6bGliLgotCi12ZXJzaW9uIDEuNC4wYmV0YTYxIFtNYXkgMjAsIDIwMDldCi0gIEluIGNvbnRyaWIvcG5nbWluaW0vKiwgcmVuYW1lZCAibWFrZWZpbGUuc3RkIiB0byAibWFrZWZpbGUiLCBzaW5jZSB0aGVyZQotICAgIGlzIG9ubHkgb25lIG1ha2VmaWxlIGluIHRob3NlIGRpcmVjdG9yaWVzLCBhbmQgcmV2aXNlZCB0aGUgUkVBRE1FIGZpbGVzCi0gICAgYWNjb3JkaW5nbHkuCi0gIE1vcmUgcmVmb3JtYXR0aW5nIG9mIGNvbW1lbnRzLCBtb3N0bHkgdG8gY2FwaXRhbGl6ZSBzZW50ZW5jZXMuCi0KLXZlcnNpb24gMS40LjBiZXRhNjIgW0p1bmUgMiwgMjAwOV0KLSAgQWRkZWQgIiNkZWZpbmUgUE5HX05PX1dSSVRFX1NXQVAiIHRvIGNvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9wbmd1c3IuaAotICAgIGFuZCAiZGVmaW5lIFBOR19OT19SRUFEX1NXQVAiIHRvIGRlY29kZXIvcG5ndXNyLmggYW5kIHByZWFkZXIvcG5ndXNyLmgKLSAgUmVmb3JtYXR0ZWQgc2V2ZXJhbCByZW1haW5pbmcgImVsc2Ugc3RhdGVtZW50IiBpbnRvIHR3byBsaW5lcy4KLSAgQWRkZWQgYSBzZWN0aW9uIHRvIHRoZSBsaWJwbmcgZG9jdW1lbnRhdGlvbiBhYm91dCB1c2luZyBwbmdfZ2V0X2lvX3B0cigpCi0gICAgaW4gY29uZmlndXJlIHNjcmlwdHMgdG8gZGV0ZWN0IHRoZSBwcmVzZW5jZSBvZiBsaWJwbmcuCi0KLXZlcnNpb24gMS40LjBiZXRhNjMgW0p1bmUgMTUsIDIwMDldCi0gIFJldmlzZWQgbGlicG5nKi50eHQgYW5kIGxpYnBuZy4zIHRvIG1lbnRpb24gY2FsbGluZyBwbmdfc2V0X0lIRFIoKQotICAgIG11bHRpcGxlIHRpbWVzIGFuZCB0byBzcGVjaWZ5IHRoZSBzYW1wbGUgb3JkZXIgaW4gdGhlIHRSTlMgY2h1bmssCi0gICAgYmVjYXVzZSB0aGUgSVNPIFBORyBzcGVjaWZpY2F0aW9uIGhhcyBhIHR5cG8gaW4gdGhlIHRSTlMgdGFibGUuCi0gIENoYW5nZWQgc2V2ZXJhbCBQTkdfVU5LTk9XTl9DSFVOS19TVVBQT1JURUQgdG8KLSAgICBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVELCB0byBtYWtlIHRoZSBwbmdfc2V0X2tlZXAgbWVjaGFuaXNtCi0gICAgYXZhaWxhYmxlIGZvciBpZ25vcmluZyBrbm93biBjaHVua3MgZXZlbiB3aGVuIG5vdCBzYXZpbmcgdW5rbm93biBjaHVua3MuCi0gIEFkb3B0ZWQgcHJlZmVyZW5jZSBmb3IgY29uc2lzdGVudCB1c2Ugb2YgIiNpZmRlZiIgYW5kICIjaWZuZGVmIiB2ZXJzdXMKLSAgICAiI2lmIGRlZmluZWQoKSIgYW5kICJpZiAhZGVmaW5lZCgpIiB3aGVyZSBwb3NzaWJsZS4KLQotdmVyc2lvbiAxLjQuMGJldGE2NCBbSnVuZSAyNCwgMjAwOV0KLSAgRWxpbWluYXRlZCBQTkdfTEVHQUNZX1NVUFBPUlRFRCBjb2RlLgotICBNb3ZlZCB0aGUgdmFyaW91cyB1bmtub3duIGNodW5rIG1hY3JvIGRlZmluaXRpb25zIG91dHNpZGUgb2YgdGhlCi0gICAgIFBOR19SRUFEfFdSSVRFX0FOQ0lMTEFSWV9DSFVOS19TVVBQT1JURUQgYmxvY2tzLgotCi12ZXJzaW9uIDEuNC4wYmV0YTY1IFtKdW5lIDI2LCAyMDA5XQotICBBZGRlZCBhIHJlZmVyZW5jZSB0byB0aGUgbGlicG5nIGxpY2Vuc2UgaW4gZWFjaCBmaWxlLgotCi12ZXJzaW9uIDEuNC4wYmV0YTY2IFtKdW5lIDI3LCAyMDA5XQotICBSZWZlciB0byB0aGUgbGlicG5nIGxpY2Vuc2UgaW5zdGVhZCBvZiB0aGUgbGlicG5nIGxpY2Vuc2UgaW4gZWFjaCBmaWxlLgotCi12ZXJzaW9uIDEuNC4wYmV0YTY3IFtKdWx5IDYsIDIwMDldCi0gIFJlbG9jYXRlZCBJTlZFUlRfQUxQSEEgd2l0aGluIHBuZ19yZWFkX3BuZygpIGFuZCBwbmdfd3JpdGVfcG5nKCkuCi0gIEFkZGVkIGhpZ2gtbGV2ZWwgQVBJIHRyYW5zZm9ybSBQTkdfVFJBTlNGT1JNX0dSQVlfVE9fUkdCLgotICBBZGRlZCBhbiAieGNvZGUiIHByb2plY3QgdG8gdGhlIHByb2plY3RzIGRpcmVjdG9yeSAoQWxhbSBBcmlhcykuCi0KLXZlcnNpb24gMS40LjBiZXRhNjggW0p1bHkgMTksIDIwMDldCi0gIEF2b2lkIHNvbWUgdGVzdHMgaW4gZmlsdGVyIHNlbGVjdGlvbiBpbiBwbmd3dXRpbC5jCi0KLXZlcnNpb24gMS40LjBiZXRhNjkgW0p1bHkgMjUsIDIwMDldCi0gIFNpbXBsaWZpZWQgdGhlIG5ldyBmaWx0ZXItc2VsZWN0aW9uIHRlc3QuICBUaGlzIHJ1bnMgZmFzdGVyIGluIHRoZQotICAgIGNvbW1vbiAiUE5HX0FMTF9GSUxURVJTIiBhbmQgUE5HX0ZJTFRFUl9OT05FIGNhc2VzLgotICBSZW1vdmVkIGV4dHJhbmVvdXMgZGVjbGFyYXRpb24gZnJvbSB0aGUgbmV3IGNhbGwgdG8gcG5nX3JlYWRfZ3JheV90b19yZ2IoKQotICAgIChidWcgaW50cm9kdWNlZCBpbiBsaWJwbmctMS40LjBiZXRhNjcpLgotICBGaXhlZCB1cCB4Y29kZSBwcm9qZWN0IChBbGFtIEFyaWFzKQotICBBZGRlZCBhIHByb3RvdHlwZSBmb3IgcG5nXzY0Yml0X3Byb2R1Y3QoKSBpbiBwbmcuYwotCi12ZXJzaW9uIDEuNC4wYmV0YTcwIFtKdWx5IDI3LCAyMDA5XQotICBBdm9pZCBhIHBvc3NpYmxlIE5VTEwgZGVyZWZlcmVuY2UgaW4gZGVidWcgYnVpbGQsIGluIHBuZ19zZXRfdGV4dF8yKCkuCi0gICAgKGJ1ZyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0wLjk1LCBkaXNjb3ZlcmVkIGJ5IEV2YW4gUm91YXVsdCkKLQotdmVyc2lvbiAxLjQuMGJldGE3MSBbSnVseSAyOSwgMjAwOV0KLSAgUmVidWlsdCBjb25maWd1cmUgc2NyaXB0cyB3aXRoIGF1dG9jb25mLTIuNjQuCi0KLXZlcnNpb24gMS40LjBiZXRhNzIgW0F1Z3VzdCAxLCAyMDA5XQotICBSZXBsYWNlZCAqLnRhci5sem1hIHdpdGggKi50YXIueHogaW4gZGlzdHJpYnV0aW9uLiAgR2V0IHRoZSB4eiBjb2RlYwotICAgIGZyb20gPGh0dHA6Ly90dWthYW5pLm9yZy94ej4uCi0KLXZlcnNpb24gMS40LjBiZXRhNzMgW0F1Z3VzdCAxLCAyMDA5XQotICBSZWplY3QgYXR0ZW1wdCB0byB3cml0ZSBpQ0NQIGNodW5rIHdpdGggbmVnYXRpdmUgZW1iZWRkZWQgcHJvZmlsZSBsZW5ndGgKLSAgICAoSkQgQ2hlbikKLQotdmVyc2lvbiAxLjQuMGJldGE3NCBbQXVndXN0IDgsIDIwMDldCi0gIENoYW5nZWQgcG5nX3B0ciBhbmQgaW5mb19wdHIgbWVtYmVyICJ0cmFucyIgdG8gInRyYW5zX2FscGhhIi4KLQotdmVyc2lvbiAxLjQuMGJldGE3NSBbQXVndXN0IDIxLCAyMDA5XQotICBSZW1vdmVkIGFuIGV4dHJhIHBuZ19kZWJ1ZygpIHJlY2VudGx5IGFkZGVkIHRvIHBuZ193cml0ZV9maW5kX2ZpbHRlcigpLgotICBGaXhlZCBpbmNvcnJlY3QgI2lmZGVmIGluIHBuZ3NldC5jIHJlZ2FyZGluZyB1bmtub3duIGNodW5rIHN1cHBvcnQuCi0KLXZlcnNpb24gMS40LjBiZXRhNzYgW0F1Z3VzdCAyMiwgMjAwOV0KLSAgTW92ZWQgYW4gaW5jb3JyZWN0bHkgbG9jYXRlZCB0ZXN0IGluIHBuZ19yZWFkX3JvdygpIGluIHBuZ3JlYWQuYwotCi12ZXJzaW9uIDEuNC4wYmV0YTc3IFtBdWd1c3QgMjcsIDIwMDldCi0gIFJlbW92ZWQgbHBYWVoudGFyLmJ6MiAod2l0aCBDUkxGKSwgS05PV05CVUcsIGxpYnBuZy14Lnkuei1LTk9XTkJVRy50eHQsCi0gICAgYW5kIHRoZSAibm9jb25maWciIGZpbGVzIGZyb20gdGhlIGRpc3RyaWJ1dGlvbi4KLSAgTW92ZWQgQ01ha2VMaXN0cy50eHQgZnJvbSBzY3JpcHRzIGludG8gdGhlIG1haW4gbGlicG5nIGRpcmVjdG9yeS4KLSAgVmFyaW91cyBidWdmaXhlcyBhbmQgaW1wcm92ZW1lbnRzIHRvIENNYWtlTGlzdHMudHh0IChQaGlsaXAgTG93bWFuKQotCi12ZXJzaW9uIDEuNC4wYmV0YTc4IFtBdWd1c3QgMzEsIDIwMDldCi0gIENvbnZlcnRlZCBhbGwgUE5HX05PXyogdGVzdHMgdG8gUE5HXypfU1VQUE9SVEVEIGV2ZXJ5d2hlcmUgZXhjZXB0IHBuZ2NvbmYuaAotICBFbGltaW5hdGVkIFBOR19OT19GUkVFX01FIGFuZCBQTkdfRlJFRV9NRV9TVVBQT1JURUQgbWFjcm9zLgotICBVc2UgcG5nX21hbGxvYyBwbHVzIGEgbG9vcCBpbnN0ZWFkIG9mIHBuZ19jYWxsb2MoKSB0byBpbml0aWFsaXplCi0gICAgcm93X3BvaW50ZXJzIGluIHBuZ19yZWFkX3BuZygpLgotCi12ZXJzaW9uIDEuNC4wYmV0YTc5IFtTZXB0ZW1iZXIgMSwgMjAwOV0KLSAgRWxpbWluYXRlZCBQTkdfR0xPQkFMX0FSUkFZUyBhbmQgUE5HX0xPQ0FMX0FSUkFZUzsgYWx3YXlzIHVzZSBsb2NhbCBhcnJheXMuCi0gIEVsaW1pbmF0ZWQgUE5HX0NBTExPQ19TVVBQT1JURUQgbWFjcm8gYW5kIGFsd2F5cyBwcm92aWRlIHBuZ19jYWxsb2MoKS4KLQotdmVyc2lvbiAxLjQuMGJldGE4MCBbU2VwdGVtYmVyIDE3LCAyMDA5XQotICBSZW1vdmVkIHNjcmlwdHMvbGlicG5nLmljYwotICBDaGFuZ2VkIHR5cGVjYXN0IG9mIGZpbGxlciBmcm9tIHBuZ19ieXRlIHRvIHBuZ191aW50XzE2IGluIHBuZ19zZXRfZmlsbGVyKCkuCi0gICAgKERlbm5pcyBHdXN0YWZzc29uKQotICBGaXhlZCB0eXBvIGludHJvZHVjZWQgaW4gYmV0YTc4IGluIHBuZ3Rlc3QuYyAoIiNpZiBkZWYgIiBzaG91bGQgYmUgIiNpZmRlZiAiKQotCi12ZXJzaW9uIDEuNC4wYmV0YTgxIFtTZXB0ZW1iZXIgMjMsIDIwMDldCi0gIEVsaW1pbmF0ZWQgdW51c2VkIFBOR19GTEFHX0ZSRUVfKiBkZWZpbmVzIGZyb20gcG5ncHJpdi5oCi0gIEV4cGFuZGVkIFRBQiBjaGFyYWN0ZXJzIGluIHBuZ3J0cmFuLmMKLSAgUmVtb3ZlZCBQTkdfQ09OU1QgZnJvbSBhbGwgIlBOR19DT05TVCBQTkdfQ0hOSyIgZGVjbGFyYXRpb25zIHRvIGF2b2lkCi0gICAgY29tcGlsZXIgY29tcGxhaW50cyBhYm91dCBkb3VibHkgZGVjbGFyaW5nIHRoaW5ncyAiY29uc3QiLgotICBDaGFuZ2VkIGFsbCAiI2lmIFshXWRlZmluZWQoWCkiIHRvICJpZltuXWRlZiBYIiB3aGVyZSBwb3NzaWJsZS4KLSAgRWxpbWluYXRlZCB1bnVzZWQgcG5nX3B0ci0+cm93X2J1Zl9zaXplCi0KLXZlcnNpb24gMS40LjBiZXRhODIgW1NlcHRlbWJlciAyNSwgMjAwOV0KLSAgTW92ZWQgcmVkdW5kYW50IElIRFIgY2hlY2tpbmcgaW50byBuZXcgcG5nX2NoZWNrX0lIRFIoKSBpbiBwbmcuYwotICAgIGFuZCByZXBvcnQgYWxsIGVycm9ycyBmb3VuZCBpbiB0aGUgSUhEUiBkYXRhLgotICBFbGltaW5hdGVkIHVzZWxlc3MgY2FsbCB0byBwbmdfY2hlY2tfY0hSTSgpIGZyb20gcG5nc2V0LmMKLQotdmVyc2lvbiAxLjQuMGJldGE4MyBbU2VwdGVtYmVyIDI1LCAyMDA5XQotICBSZXZpc2VkIHBuZ19jaGVja19JSERSKCkgdG8gZWxpbWluYXRlIGJvZ3VzIGNvbXBsYWludCBhYm91dCBmaWx0ZXJfdHlwZS4KLQotdmVyc2lvbiAxLjQuMGJldGE4NCBbU2VwdGVtYmVyIDMwLCAyMDA5XQotICBGaXhlZCBzb21lIGluY29uc2lzdGVudCBpbmRlbnRhdGlvbiBpbiBwbmdjb25mLmgKLSAgUmV2aXNlZCBwbmdfY2hlY2tfSUhEUigpIHRvIGFkZCBhIHRlc3QgZm9yIHdpZHRoIHZhcmlhYmxlIGxlc3MgdGhhbiAzMi1iaXQuCi0KLXZlcnNpb24gMS40LjBiZXRhODUgW09jdG9iZXIgMSwgMjAwOV0KLSAgUmV2aXNlZCBwbmdfY2hlY2tfSUhEUigpIGFnYWluLCB0byBjaGVjayBpbmZvX3B0ciBtZW1iZXJzIGluc3RlYWQgb2YKLSAgICB0aGUgY29udGVudHMgb2YgdGhlIHJldHVybmVkIHBhcmFtZXRlcnMuCi0KLXZlcnNpb24gMS40LjBiZXRhODYgW09jdG9iZXIgOSwgMjAwOV0KLSAgVXBkYXRlZCB0aGUgInhjb2RlIiBwcm9qZWN0IChBbGFtIEFyaWFzKS4KLSAgRWxpbWluYXRlZCBhIHNoYWRvd2VkIGRlY2xhcmF0aW9uIG9mICJwcCIgaW4gcG5nX2hhbmRsZV9zUExUKCkuCi0KLXZlcnNpb24gMS40LjByYzAxIFtPY3RvYmVyIDE5LCAyMDA5XQotICBUcml2aWFsIGNvc21ldGljIGNoYW5nZXMuCi0KLXZlcnNpb24gMS40LjBiZXRhODcgW09jdG9iZXIgMzAsIDIwMDldCi0gIE1vdmVkIHZlcnNpb24gMS40LjAgYmFjayBpbnRvIGJldGEuCi0KLXZlcnNpb24gMS40LjBiZXRhODggW09jdG9iZXIgMzAsIDIwMDldCi0gIFJldmlzZWQgbGlicG5nKi50eHQgc2VjdGlvbiBhYm91dCBkaWZmZXJlbmNlcyBiZXR3ZWVuIDEuMi54IGFuZCAxLjQuMAotICAgIGJlY2F1c2UgbW9zdCBvZiB0aGUgbmV3IGZlYXR1cmVzIGhhdmUgbm93IGJlZW4gcG9ydGVkIGJhY2sgdG8gMS4yLjQxCi0KLXZlcnNpb24gMS40LjBiZXRhODkgW05vdmVtYmVyIDEsIDIwMDldCi0gIE1vcmUgYnVnZml4ZXMgYW5kIGltcHJvdmVtZW50cyB0byBDTWFrZUxpc3RzLnR4dCAoUGhpbGlwIExvd21hbikKLSAgUmVtb3ZlZCBhIGhhcm1sZXNzIGV4dHJhIHBuZ19zZXRfaW52ZXJ0X2FscGhhKCkgZnJvbSBwbmd3cml0ZS5jCi0gIEFwcGx5IHBuZ191c2VyX2NodW5rX2NhY2hlX21heCB3aXRoaW4gcG5nX2RlY29tcHJlc3NfY2h1bmsoKS4KLSAgTWVyZ2VkIGxpYnBuZy0xLjIuNDEudHh0IHdpdGggbGlicG5nLTEuNC4wLnR4dCB3aGVyZSBhcHByb3ByaWF0ZS4KLQotdmVyc2lvbiAxLjQuMGJldGE5MCBbTm92ZW1iZXIgMiwgMjAwOV0KLSAgUmVtb3ZlZCBhbGwgcmVtYWluaW5nIFdJTjMyX1dDRSAjaWZkZWZzIGV4Y2VwdCB0aG9zZSBpbnZvbHZpbmcgdGhlCi0gICAgdGltZS5oICJ0bSIgc3RydWN0dXJlCi0KLXZlcnNpb24gMS40LjBiZXRhOTEgW05vdmVtYmVyIDMsIDIwMDldCi0gIFVwZGF0ZWQgc2NyaXB0cy9wbmd3MzIuZGVmIGFuZCBwcm9qZWN0cy93aW5jZS9wbmczMmNlLmRlZgotICBDb3BpZWQgcHJvamVjdHMvd2luY2UvcG5nMzJjZS5kZWYgdG8gdGhlIHNjcmlwdHMgZGlyZWN0b3J5LgotICBBZGRlZCBzY3JpcHRzL21ha2VmaWxlLndjZQotICBQYXRjaGVkIGx0bWFpbi5zaCBmb3Igd2luY2Ugc3VwcG9ydC4KLSAgQWRkZWQgUE5HX0NPTlZFUlRfdElNRV9TVVBQT1JURUQgbWFjcm8uCi0KLXZlcnNpb24gMS40LjBiZXRhOTIgW05vdmVtYmVyIDQsIDIwMDldCi0gIE1ha2UgaW5jbHVzaW9uIG9mIHRpbWUuaCBpbiBwbmdjb25mLmggZGVwZW5kIG9uIFBOR19DT05WRVJUX3RJTUVfU1VQUE9SVEVECi0gIE1ha2UgI2RlZmluZSBQTkdfQ09OVkVSVF90SU1FX1NVUFBPUlRFRCBkZXBlbmQgb24gUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVECi0gIFJldmlzZWQgbGlicG5nKi50eHQgdG8gZGVzY3JpYmUgZGlmZmVyZW5jZXMgZnJvbSAxLjIuNDAgdG8gMS40LjAgKGluc3RlYWQKLSAgICBvZiBkaWZmZXJlbmNlcyBmcm9tIDEuMi40MSB0byAxLjQuMCkKLQotdmVyc2lvbiAxLjQuMGJldGE5MyBbTm92ZW1iZXIgNywgMjAwOV0KLSAgQWRkZWQgUE5HX0RFUFNUUlVDVCwgUE5HX0RFUFJFQ0FURUQsIFBOR19VU0VfUkVTVUxULCBQTkdfTk9SRVRVUk4sIGFuZAotICAgIFBOR19BTExPQ0FURUQgbWFjcm9zIHRvIGRldGVjdCBkZXByZWNhdGVkIGRpcmVjdCBhY2Nlc3MgdG8gdGhlCi0gICAgcG5nX3N0cnVjdCBvciBpbmZvX3N0cnVjdCBtZW1iZXJzIGFuZCBvdGhlciBkZXByZWNhdGVkIHVzYWdlIGluCi0gICAgYXBwbGljYXRpb25zIChKb2huIEJvd2xlcikuCi0gIFVwZGF0ZWQgc2NyaXB0cy9tYWtlZmlsZSogdG8gYWRkICItRFBOR19DT05GSUdVUkVfTElCUE5HIiB0byBDRkxBR1MsCi0gICAgdG8gcHJldmVudCB3YXJuaW5ncyBhYm91dCBkaXJlY3QgYWNjZXNzIHRvIHBuZyBzdHJ1Y3RzIGJ5IGxpYnBuZwotICAgIGZ1bmN0aW9ucyB3aGlsZSBidWlsZGluZyBsaWJwbmcuICBUaGV5IG5lZWQgdG8gYmUgdGVzdGVkLCBlc3BlY2lhbGx5Ci0gICAgdGhvc2UgdXNpbmcgY29tcGlsZXJzIG90aGVyIHRoYW4gZ2NjLgotICBVcGRhdGVkIHByb2plY3RzL3Zpc3VhbGM2IGFuZCB2aXN1YWxjNzEgd2l0aCAiL2QgUE5HX0NPTkZJR1VSRV9MSUJQTkciLgotICAgIFRoZXkgc2hvdWxkIHdvcmsgYnV0IHN0aWxsIG5lZWQgdG8gYmUgdXBkYXRlZCB0byByZW1vdmUKLSAgICByZWZlcmVuY2VzIHRvIHBuZ2djY3JkLmMgb3IgcG5ndmNyZC5jIGFuZCBBU00gYnVpbGRpbmcuCi0gIEFkZGVkIFJFQURNRS50eHQgdG8gdGhlIGJlb3MsIGNidWlsZGVyNSwgbmV0d2FyZSwgYW5kIHhjb2RlIHByb2plY3RzIHdhcm5pbmcKLSAgICB0aGF0IHRoZXkgbmVlZCB0byBiZSB1cGRhdGVkLCB0byByZW1vdmUgcmVmZXJlbmNlcyB0byBwbmdnY2NyZC5jIGFuZAotICAgIHBuZ3ZjcmQuYyBhbmQgdG8gZGVwZW5kIG9uIHBuZ3ByaXYuaAotICBSZW1vdmVkIHRocmVlIGRpcmVjdCByZWZlcmVuY2VzIHRvIHJlYWRfaW5mb19wdHIgbWVtYmVycyBpbiBwbmd0ZXN0LmMKLSAgICB0aGF0IHdlcmUgZGV0ZWN0ZWQgYnkgdGhlIG5ldyBQTkdfREVQU1RSVUNUIG1hY3JvLgotICBNb3ZlZCB0aGUgcG5nX2RlYnVnIG1hY3JvIGRlZmluaXRpb25zIGFuZCB0aGUgcG5nX3JlYWRfZGVzdHJveSgpLAotICAgIHBuZ193cml0ZV9kZXN0cm95KCkgYW5kIHBuZ19mYXJfdG9fbmVhcigpIHByb3RvdHlwZXMgZnJvbSBwbmcuaAotICAgIHRvIHBuZ3ByaXYuaCAoSm9obiBCb3dsZXIpCi0gIE1vdmVkIHRoZSBzeW5vcHNpcyBsaW5lcyBmb3IgcG5nX3JlYWRfZGVzdHJveSgpLCBwbmdfd3JpdGVfZGVzdHJveSgpCi0gICAgcG5nX2RlYnVnKCksIHBuZ19kZWJ1ZzEoKSwgYW5kIHBuZ19kZWJ1ZzIoKSBmcm9tIGxpYnBuZy4zIHRvIGxpYnBuZ3BmLjMuCi0KLXZlcnNpb24gMS40LjBiZXRhOTQgW05vdmVtYmVyIDksIDIwMDldCi0gIFJlbW92ZWQgdGhlIG9ic29sZXRlLCB1bnVzZWQgcG5nZ2NjcmQuYyBhbmQgcG5ndmNyZC5jIGZpbGVzLgotICBVcGRhdGVkIENNYWtlTGlzdHMudHh0IHRvIGFkZCAiLURQTkdfQ09ORklHVVJFX0xJQlBORyIgdG8gdGhlIGRlZmluaXRpb25zLgotICBSZW1vdmVkIGRlcGVuZGVuY3kgb2YgcG5ndGVzdC5vIG9uIHBuZ3ByaXYuaCBpbiB0aGUgbWFrZWZpbGVzLgotICBPbmx5ICNkZWZpbmUgUE5HX0RFUFNUUlVDVCwgZXRjLiBpbiBwbmdjb25mLmggaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQotdmVyc2lvbiAxLjQuMGJldGE5NSBbTm92ZW1iZXIgMTAsIDIwMDldCi0gIENoYW5nZWQgcG5nX2NoZWNrX3NpZygpIHRvICFwbmdfc2lnX2NtcCgpIGluIGNvbnRyaWIgcHJvZ3JhbXMuCi0gIEFkZGVkIC1EUE5HX0NPTkZJR1VSRV9MSUJQTkcgdG8gY29udHJpYi9wbmdtaW5tLyovbWFrZWZpbGUKLSAgQ2hhbmdlZCBwbmdfY2hlY2tfc2lnKCkgdG8gIXBuZ19zaWdfY21wKCkgaW4gY29udHJpYiBwcm9ncmFtcy4KLSAgQ29ycmVjdGVkIHRoZSBwbmdfZ2V0X0lIRFIoKSBjYWxsIGluIGNvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZzIuYwotICBDaGFuZ2VkIHBuZ21pbmltLyovZ2F0aGVyLnNoIHRvIHN0b3AgdHJ5aW5nIHRvIHJlbW92ZSBwbmdnY2NyZC5jIGFuZCBwbmd2Y3JkLmMKLSAgQWRkZWQgZGVwZW5kZW5jeSBvbiBwbmdwcml2LmggaW4gY29udHJpYi9wbmdtaW5pbS8qL21ha2VmaWxlCi0KLXZlcnNpb24gMS40LjBiZXRhOTYgW05vdmVtYmVyIDEyLCAyMDA5XQotICBSZW5hbWVkIHNjcmlwdHMvbWFrZWZpbGUud2NlIHRvIHNjcmlwdHMvbWFrZWZpbGUuY2VnY2MKLSAgUmV2aXNlZCBNYWtlZmlsZS5hbSB0byB1c2UgbGlicG5nLnN5cyB3aGlsZSBidWlsZGluZyBsaWJwbmcuc28KLSAgICBzbyB0aGF0IG9ubHkgUE5HX0VYUE9SVCBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkLgotICBSZW1vdmVkIHRoZSBkZXByZWNhdGVkIHBuZ19jaGVja19zaWcoKSBmdW5jdGlvbi9tYWNyby4KLSAgUmVtb3ZlZCByZWNlbnRseSByZW1vdmVkIGZ1bmN0aW9uIG5hbWVzIGZyb20gc2NyaXB0cy8qLmRlZgotICBSZXZpc2VkIHBuZ3Rlc3QucG5nIHRvIHB1dCBjaHVua3MgaW4gdGhlIHNhbWUgb3JkZXIgd3JpdHRlbiBieSBwbmd0ZXN0Ci0gICAgKGV2aWRlbnRseSB0aGUgc2FtZSBjaGFuZ2UgbWFkZSBpbiBsaWJwbmctMS4wYmV0YTU0IHdhcyBsb3N0KS4KLSAgQWRkZWQgUE5HX1BSSVZBVEUgbWFjcm8gZGVmaW5pdGlvbiBpbiBwbmdjb25mLmggZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UuCi0KLXZlcnNpb24gMS40LjBiZXRhOTcgW05vdmVtYmVyIDEzLCAyMDA5XQotICBSZXN0b3JlZCBwbmd0ZXN0LnBuZyB0byB0aGUgbGlicG5nLTEuNC4wYmV0YTcgdmVyc2lvbi4KLSAgUmVtb3ZlZCBwcm9qZWN0cy9iZW9zIGFuZCBuZXR3YXJlLnR4dDsgbm8gb25lIHNlZW1zIHRvIGJlIHN1cHBvcnRpbmcgdGhlbS4KLSAgUmV2aXNlZCBNYWtlZmlsZS5pbgotCi12ZXJzaW9uIDEuNC4wYmV0YTk4IFtOb3ZlbWJlciAxMywgMjAwOV0KLSAgQWRkZWQgdGhlICJ4Y29kZSIgcHJvamVjdCB0byB6aXAgZGlzdHJpYnV0aW9ucywKLSAgRml4ZWQgYSB0eXBvIGluIHNjcmlwdHMvcG5nd2luLmRlZiBpbnRyb2R1Y2VkIGluIGJldGE5Ny4KLQotdmVyc2lvbiAxLjQuMGJldGE5OSBbTm92ZW1iZXIgMTQsIDIwMDldCi0gIE1vdmVkIGxpYnBuZy1jb25maWcuaW4gYW5kIGxpYnBuZy5wYy1jb25maWd1cmUuaW4gb3V0IG9mIHRoZSBzY3JpcHRzCi0gICAgZGlyZWN0b3J5LCB0byBsaWJwbmctY29uZmlnLmluIGFuZCBsaWJwbmctcGMuaW4sIHJlc3BlY3RpdmVseSwgYW5kCi0gICAgbW9kaWZpZWQgTWFrZWZpbGUuYW0gYW5kIGNvbmZpZ3VyZS5hYyBhY2NvcmRpbmdseS4gIE5vdyAiY29uZmlndXJlIgotICAgIG5lZWRzIG5vdGhpbmcgZnJvbSB0aGUgInNjcmlwdHMiIGRpcmVjdG9yeS4KLSAgQXZvaWQgcmVkZWZpbmluZyBQTkdfQ09OU1QgaW4gcG5nY29uZi5oCi0KLXZlcnNpb24gMS40LjBiZXRhMTAwIFtOb3ZlbWJlciAxNCwgMjAwOV0KLSAgUmVtb3ZlZCBBU00gYnVpbGRzIGZyb20gcHJvamVjdHMvdmlzdWFsYzYgYW5kIHByb2plY3RzL3Zpc3VhbGM3MQotICBSZW1vdmVkIHNjcmlwdHMvbWFrZWZpbGUubm9tbXggYW5kIG1ha2VmaWxlLnZjYXdpbjMyCi0gIFJldmlzZWQgQ01ha2VMaXN0cy50eHQgdG8gYWNjb3VudCBmb3IgbmV3IGxvY2F0aW9uIG9mIGxpYnBuZy1jb25maWcuaW4KLSAgICBhbmQgbGlicG5nLXBjLmluCi0gIFVwZGF0ZWQgSU5TVEFMTCB0byByZWZsZWN0IHJlbW92YWwgYW5kIHJlbG9jYXRpb24gb2YgZmlsZXMuCi0KLXZlcnNpb24gMS40LjBiZXRhMTAxIFtOb3ZlbWJlciAxNCwgMjAwOV0KLSAgUmVzdG9yZWQgdGhlIGJpbmFyeSBmaWxlcyAoKi5qcGcsICoucG5nLCBzb21lIHByb2plY3QgZmlsZXMpIHRoYXQgd2VyZQotICAgIGFjY2lkZW50YWxseSBkZWxldGVkIGZyb20gdGhlIHppcCBhbmQgN3ogZGlzdHJpYnV0aW9ucyB3aGVuIHRoZSB4Y29kZQotICAgIHByb2plY3Qgd2FzIGFkZGVkLgotCi12ZXJzaW9uIDEuNC4wYmV0YTEwMiBbTm92ZW1iZXIgMTgsIDIwMDldCi0gIEFkZGVkIGxpYnBuZy1jb25maWcuaW4gYW5kIGxpYnBuZy1wYy5pbiB0byB0aGUgemlwIGFuZCA3eiBkaXN0cmlidXRpb25zLgotICBGaXhlZCBhIHR5cG8gaW4gcHJvamVjdHMvdmlzdWFsYzYvcG5ndGVzdC5kc3AsIGludHJvZHVjZWQgaW4gYmV0YTEwMC4KLSAgTW92ZWQgZGVzY3JpcHRpb25zIG9mIG1ha2VmaWxlcyBhbmQgb3RoZXIgc2NyaXB0cyBvdXQgb2YgSU5TVEFMTCBpbnRvCi0gICAgc2NyaXB0cy9SRUFETUUudHh0Ci0gIFVwZGF0ZWQgdGhlIGNvcHlyaWdodCB5ZWFyIGluIHNjcmlwdHMvcG5nd2luLnJjIGZyb20gMjAwNiB0byAyMDA5LgotCi12ZXJzaW9uIDEuNC4wYmV0YTEwMyBbTm92ZW1iZXIgMjEsIDIwMDldCi0gIFJlbW92ZWQgb2Jzb2xldGUgY29tbWVudHMgYWJvdXQgQVNNIGZyb20gcHJvamVjdHMvdmlzdWFsYzcxL1JFQURNRV96bGliLnR4dAotICBBbGlnbiByb3dfYnVmIG9uIDE2LWJ5dGUgYm91bmRhcnkgaW4gbWVtb3J5LgotICBSZXN0b3JlZCB0aGUgUE5HX1dSSVRFX0ZMVVNIX0FGVEVSX0lFTkRfU1VQUE9SVEVEIGd1YXJkIGFyb3VuZCB0aGUgY2FsbAotICAgIHRvIHBuZ19mbHVzaCgpIGFmdGVyIHBuZ193cml0ZV9JRU5EKCkuICBTZWUgMS40LjBiZXRhMzIsIDEuNC4wYmV0YTUwCi0gICAgY2hhbmdlcyBhYm92ZSBhbmQgMS4yLjMwLCAxLjIuMzByYzAxIGFuZCByYzAzIGluIDEuMi40MSBDSEFOR0VTLiAgU29tZW9uZQotICAgIG5lZWRzIHRoaXMgZmVhdHVyZS4KLSAgTWFrZSB0aGUgJ3BuZ19qbXBidWYnIG1hY3JvIGV4cGFuZCB0byBhIGNhbGwgdGhhdCByZWNvcmRzIHRoZSBjb3JyZWN0Ci0gICAgbG9uZ2ptcCBmdW5jdGlvbiBhcyB3ZWxsIGFzIHJldHVybmluZyBhIHBvaW50ZXIgdG8gdGhlIHNldGptcAotICAgIGptcF9idWYgYnVmZmVyLCBhbmQgbWFya2VkIGRpcmVjdCBhY2Nlc3MgdG8gam1wYnVmICdkZXByZWNhdGVkJy4KLSAgICAoSm9obiBCb3dsZXIpCi0KLXZlcnNpb24gMS40LjBiZXRhMTA0IFtOb3ZlbWJlciAyMiwgMjAwOV0KLSAgUmVtb3ZlZCBwbmdfbG9uZ2ptcF9wdHIgZnJvbSBzY3JpcHRzLyouZGVmIGFuZCBsaWJwbmcuMwotICBSZWJ1aWx0IGNvbmZpZ3VyZSBzY3JpcHRzIHdpdGggYXV0b2NvbmYtMi42NQotCi12ZXJzaW9uIDEuNC4wYmV0YTEwNSBbTm92ZW1iZXIgMjUsIDIwMDldCi0gIFVzZSBmYXN0IGludGVnZXIgUE5HX0RJVklERV9CWV8yNTUoKSBvciBQTkdfRElWSURFX0JZXzY1NTM1KCkKLSAgICB0byBhY2NvbXBsaXNoIGFscGhhIHByZW11bHRpcGxpY2F0aW9uIHdoZW4KLSAgICBQTkdfUkVBRF9DT01QT1NJVEVfTk9ESVZfU1VQUE9SVEVEIGlzIGRlZmluZWQuCi0gIENoYW5nZWQgIi8yNTUiIHRvICIvMjU1LjAiIGluIGJhY2tncm91bmQgY2FsY3VsYXRpb25zIHRvIG1ha2UgaXQgY2xlYXIKLSAgICB0aGF0IHRoZSAyNTUgaXMgdXNlZCBhcyBhIGRvdWJsZS4KLQotdmVyc2lvbiAxLjQuMGJldGExMDYgW05vdmVtYmVyIDI3LCAyMDA5XQotICBSZW1vdmVkIHByZW11bHRpcGxpZWQgYWxwaGEgZmVhdHVyZS4KLQotdmVyc2lvbiAxLjQuMGJldGExMDcgW0RlY2VtYmVyIDQsIDIwMDldCi0gIFVwZGF0ZWQgUkVBRE1FCi0gIEFkZGVkICIjZGVmaW5lIFBOR19OT19QRURBTlRJQ19XQVJOSU5HUyIgaW4gdGhlIGxpYnBuZyBzb3VyY2UgZmlsZXMuCi0gIFJlbW92ZWQgIi1EUE5HX0NPTkZJR1VSRV9MSUJQTkciIGZyb20gdGhlIG1ha2VmaWxlcyBhbmQgcHJvamVjdHMuCi0gIFJldmlzZWQgc2NyaXB0cy9tYWtlZmlsZS5uZXRic2QsIG1ha2VmaWxlLm9wZW5ic2QsIGFuZCBtYWtlZmlsZS5zY28KLSAgICB0byBwdXQgcG5nLmggYW5kIHBuZ2NvbmYuaCBpbiAkcHJlZml4L2luY2x1ZGUsIGxpa2UgdGhlIG90aGVyIHNjcmlwdHMsCi0gICAgaW5zdGVhZCBvZiBpbiAkcHJlZml4L2luY2x1ZGUvbGlicG5nLiAgQWxzbyByZXZpc2VkIG1ha2VmaWxlLnNjbwotICAgIHRvIHB1dCB0aGVtIGluICRwcmVmaXgvaW5jbHVkZS9saWJwbmcxNCBpbnN0ZWFkIG9mIGluCi0gICAgJHByZWZpeC9pbmNsdWRlL2xpYnBuZy9saWJwbmcxNC4KLQotdmVyc2lvbiAxLjQuMGJldGExMDggW0RlY2VtYmVyIDExLCAyMDA5XQotICBSZW1vdmVkIGxlZnRvdmVyICItRFBOR19DT05GSUdVUkVfTElCUE5HIiBmcm9tIGNvbnRyaWIvcG5nbWluaW0vKi9tYWtlZmlsZQotICBSZWxvY2F0ZWQgcG5nX2RvX2Nob3AoKSB0byBpdHMgb3JpZ2luYWwgcG9zaXRpb24gaW4gcG5ncnRyYW4uYzsgdGhlCi0gICAgY2hhbmdlIGluIHZlcnNpb24gMS4yLjQxYmV0YTA4IGNhdXNlZCB0cmFuc3BhcmVuY3kgdG8gYmUgaGFuZGxlZCB3cm9uZwotICAgIGluIHNvbWUgMTYtYml0IGRhdGFzdHJlYW1zIChZdXNha3UgU3VnYWkpLgotCi12ZXJzaW9uIDEuNC4wYmV0YTEwOSBbRGVjZW1iZXIgMTMsIDIwMDldCi0gIEFkZGVkICJiaXRfZGVwdGgiIHBhcmFtZXRlciB0byB0aGUgcHJpdmF0ZSBwbmdfYnVpbGRfZ2FtbWFfdGFibGUoKSBmdW5jdGlvbi4KLSAgUGFzcyBiaXRfZGVwdGg9OCB0byBwbmdfYnVpbGRfZ2FtbWFfdGFibGUoKSB3aGVuIGJpdF9kZXB0aCBpcyAxNiBidXQgdGhlCi0gICAgUE5HXzE2X1RPXzggdHJhbnNmb3JtIGhhcyBiZWVuIHNldCwgdG8gYXZvaWQgdW5uZWNlc3NhcnkgYnVpbGQgb2YgMTYtYml0Ci0gICAgdGFibGVzLgotCi12ZXJzaW9uIDEuNC4wcmMwMiBbRGVjZW1iZXIgMjAsIDIwMDldCi0gIERlY2xhcmVkIHBuZ19jbGVhbnVwX25lZWRlZCAidm9sYXRpbGUiIGluIHBuZ3JlYWQuYyBhbmQgcG5nd3JpdGUuYwotCi12ZXJzaW9uIDEuNC4wcmMwMyBbRGVjZW1iZXIgMjIsIDIwMDldCi0gIFJlbmFtZWQgbGlicG5nLXBjLmluIGJhY2sgdG8gbGlicG5nLnBjLmluIGFuZCByZXZpc2VkIENNYWtlTGlzdHMudHh0Ci0gICAgKHJldmlzaW5nIHRoZSBjaGFuZ2UgaW4gMS40LjBiZXRhOTkpCi0KLXZlcnNpb24gMS40LjByYzA0IFtEZWNlbWJlciAyNSwgMjAwOV0KLSAgU3dhcHBlZCBQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEIGFuZCBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVECi0gICAgaW4gcG5nc2V0LmMgdG8gYmUgY29uc2lzdGVudCB3aXRoIG90aGVyIGNoYW5nZXMgaW4gdmVyc2lvbiAxLjIuMzguCi0KLXZlcnNpb24gMS40LjByYzA1IFtEZWNlbWJlciAyNSwgMjAwOV0KLSAgQ2hhbmdlZCAibGlicG5nLXBjLmluIiB0byAibGlicG5nLnBjLmluIiBpbiBjb25maWd1cmUuYWMsIGNvbmZpZ3VyZSwgYW5kCi0gICAgTWFrZWZpbGUuaW4gdG8gYmUgY29uc2lzdGVudCB3aXRoIGNoYW5nZXMgaW4gbGlicG5nLTEuNC4wcmMwMwotCi12ZXJzaW9uIDEuNC4wcmMwNiBbRGVjZW1iZXIgMjksIDIwMDldCi0gIFJldmVydGVkIHRoZSBnYW1tYV90YWJsZSBjaGFuZ2VzIGZyb20gbGlicG5nLTEuNC4wYmV0YTEwOS4KLSAgRml4ZWQgc29tZSBpbmRlbnRhdGlvbiBlcnJvcnMuCi0KLXZlcnNpb24gMS40LjByYzA3IFtKYW51YXJ5IDEsIDIwMTBdCi0gIFJldmlzZWQgbGlicG5nKi50eHQgYW5kIGxpYnBuZy4zIGFib3V0IDEuMi54LT4xLjQueCBkaWZmZXJlbmNlcy4KLSAgVXNlIHBuZ19jYWxsb2MoKSBpbnN0ZWFkIG9mIHBuZ19tYWxsb2MoKTsgcG5nX21lbXNldCgpIGluIHBuZ3J1dGlsLmMKLSAgVXBkYXRlIGNvcHlyaWdodCB5ZWFyIHRvIDIwMTAuCi0KLXZlcnNpb24gMS40LjByYzA4IFtKYW51YXJ5IDIsIDIwMTBdCi0gIEF2b2lkIGRlcHJlY2F0ZWQgcmVmZXJlbmNlcyB0byBwbmdfcHRyLWlvX3B0ciBhbmQgcG5nX3B0ci0+ZXJyb3JfcHRyCi0gICAgaW4gcG5ndGVzdC5jCi0KLXZlcnNpb24gMS40LjAgW0phbnVhcnkgMywgMjAxMF0KLSAgTm8gY2hhbmdlcy4KLQotdmVyc2lvbiAxLjQuMWJldGEwMSBbSmFudWFyeSA4LCAyMDEwXQotICBVcGRhdGVkIENNYWtlTGlzdHMudHh0IGZvciBjb25zaXN0ZW50IGluZGVudGF0aW9uIGFuZCB0byBhdm9pZCBhbgotICAgIHVuY2xvc2VkIGlmLXN0YXRlbWVudCB3YXJuaW5nIChQaGlsaXAgTG93bWFuKS4KLSAgUmV2aXNlZCBNYWtlZmlsZS5hbSBhbmQgTWFrZWZpbGUuaW4gdG8gcmVtb3ZlIHJlZmVyZW5jZXMgdG8gWTJLSU5GTywKLSAgICBLTk9XTkJVRywgYW5kIGxpYnBuZy5sYSAoUm9iZXJ0IFNjaHdlYmVsKS4KLSAgUmV2aXNlZCB0aGUgbWFrZWZpbGVzIHRvIGluc3RhbGwgdGhlIHNhbWUgZmlsZXMgYW5kIHN5bWJvbGljCi0gICAgbGlua3MgYXMgY29uZmlndXJlLCBleGNlcHQgZm9yIGxpYnBuZy5sYSBhbmQgbGlicG5nMTQubGEuCi0gIE1ha2UgcG5nX3NldHxnZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUoKSBhdmFpbGFibGUgZXZlbiB3aGVuCi0gICAgUE5HX1dSSVRFX1NVUFBPUlRFRCBpcyBub3QgZW5hYmxlZC4KLSAgUmV2aXNlZCBNYWtlZmlsZS5hbSBhbmQgTWFrZWZpbGUuaW4gdG8gc2ltcGxpZnkgdGhlaXIgbWFpbnRlbmFuY2UuCi0gIFJldmlzZWQgc2NyaXB0cy9tYWtlZmlsZS5saW51eCB0byBpbnN0YWxsIGEgbGluayB0byBsaWJwbmcxNC5zby4xNC4xCi0KLXZlcnNpb24gMS40LjFiZXRhMDIgW0phbnVhcnkgOSwgMjAxMF0KLSAgUmV2aXNlZCB0aGUgcmVzdCBvZiB0aGUgbWFrZWZpbGVzIHRvIGluc3RhbGwgYSBsaW5rIHRvIGxpYnBuZzE0LnNvLjE0LjEKLQotdmVyc2lvbiAxLjQuMWJldGEwMyBbSmFudWFyeSAxMCwgMjAxMF0KLSAgUmVtb3ZlZCBwbmdfc2V0X3ByZW11bHRpcGx5X2FscGhhKCkgZnJvbSBzY3JpcHRzLyouZGVmCi0KLXZlcnNpb24gMS40LjFyYzAxIFtKYW51YXJ5IDE2LCAyMDEwXQotICBObyBjaGFuZ2VzLgotCi12ZXJzaW9uIDEuNC4xYmV0YTA0IFtKYW51YXJ5IDIzLCAyMDEwXQotICBSZXZpc2VkIHBuZ19kZWNvbXByZXNzX2NodW5rKCkgdG8gaW1wcm92ZSBzcGVlZCBhbmQgbWVtb3J5IHVzYWdlIHdoZW4KLSAgICBkZWNvZGluZyBsYXJnZSBjaHVua3MuCi0gIEFkZGVkIHBuZ19zZXR8Z2V0X2NodW5rX21hbGxvY19tYXgoKSBmdW5jdGlvbnMuCi0KLXZlcnNpb24gMS40LjFiZXRhMDUgW0phbnVhcnkgMjYsIDIwMTBdCi0gIFJlbG9jYXRlZCAiaW50IGsiIGRlY2xhcmF0aW9uIGluIHBuZ3Rlc3QuYyB0byBtaW5pbWl6ZSBpdHMgc2NvcGUuCi0KLXZlcnNpb24gMS40LjFiZXRhMDYgW0phbnVhcnkgMjgsIDIwMTBdCi0gIFJldmlzZWQgcG5nX2RlY29tcHJlc3NfY2h1bmsoKSB0byB1c2UgYSB0d28tcGFzcyBtZXRob2Qgc3VnZ2VzdGVkIGJ5Ci0gICAgSm9obiBCb3dsZXIuCi0KLXZlcnNpb24gMS40LjFiZXRhMDcgW0ZlYnJ1YXJ5IDYsIDIwMTBdCi0gIEZvbGRlZCBzb21lIGxvbmcgbGluZXMgaW4gdGhlIHNvdXJjZSBmaWxlcy4KLSAgQWRkZWQgZGVmaW5lYWJsZSBQTkdfVVNFUl9DSFVOS19DQUNIRV9NQVgsIFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVgsCi0gICAgYW5kIGEgUE5HX1VTRVJfTElNSVRTX1NVUFBPUlRFRCBmbGFnLgotICBFbGltaW5hdGVkIHVzZSBvZiBwbmdfcHRyLT5pcm93Ynl0ZXMgYW5kIHJldXNlZCB0aGUgc2xvdCBpbiBwbmdfcHRyIGFzCi0gICAgcG5nX3B0ci0+cG5nX3VzZXJfY2h1bmtfbWFsbG9jX21heC4KLSAgUmV2aXNlZCBwbmdfcHVzaF9zYXZlX2J1ZmZlcigpIHRvIGRvIGZld2VyIGJ1dCBsYXJnZXIgcG5nX21hbGxvYygpIGNhbGxzLgotCi12ZXJzaW9uIDEuNC4xYmV0YTA4IFtGZWJydWFyeSA2LCAyMDEwXQotICBNaW5vciBjbGVhbnVwIGFuZCB1cGRhdGluZyBvZiBkYXRlcyBhbmQgY29weXJpZ2h0IHllYXIuCi0KLXZlcnNpb24gMS40LjFiZXRhMDkgW0ZlYnJ1YXJ5IDcsIDIwMTBdCi0gIFJldmVydGVkIHRvIG9yaWdpbmFsIHBuZ19wdXNoX3NhdmVfYnVmZmVyKCkgY29kZS4KLQotdmVyc2lvbiAxLjQuMWJldGExMCBbRmVicnVhcnkgOSwgMjAxMF0KLSAgUmV0dXJuIGFsbG9jYXRlZCAib2xkX2J1ZmZlciIgaW4gcG5nX3B1c2hfc2F2ZV9idWZmZXIoKSBiZWZvcmUgY2FsbGluZwotICAgIHBuZ19lcnJvcigpLCB0byBhdm9pZCBhIHBvdGVudGlhbCBtZW1vcnkgbGVhay4KLQotdmVyc2lvbiAxLjQuMWJldGExMSBbRmVicnVhcnkgMTIsIDIwMTBdCi0gIFJlbG9jYXRlZCBtaXNwbGFjZWQgY2xvc2luZyBjdXJsZXkgYnJhY2tldCBpbiBwbmdfZGVjb21wcmVzc19jaHVuaygpLgotICBSZW1vdmVkIHVudXNlZCAiYnVmZmVyX3NpemUiIHZhcmlhYmxlIGZyb20gcG5nX2RlY29tcHJlc3NfY2h1bmsoKS4KLSAgUmVtb3ZlZCB0aGUgY2J1aWxkZXI1IHByb2plY3QsIHdoaWNoIGhhcyBub3QgYmVlbiB1cGRhdGVkIHRvIDEuNC4wLgotICBDb21wbGV0ZSByZXdyaXRlIG9mIHR3by1wYXNzIHBuZ19kZWNvbXByZXNzX2NodW5rKCkgYnkgSm9obiBCb3dsZXIuCi0KLXZlcnNpb24gMS40LjFiZXRhMTIgW0ZlYnJ1YXJ5IDE0LCAyMDEwXQotICBGaXhlZCB0eXBlIGRlY2xhcmF0aW9uIG9mIHBuZ19nZXRfdXNlcl9tYWxsb2NfbWF4KCkgaW4gcG5nZ2V0LmMgKERhaXN1a2UKLSAgICBOaXNoaWthd2EpCi0KLXZlcnNpb24gMS40LjFyYzAyIFtKYW51YXJ5IDE4LCAyMDEwXQotICBObyBjaGFuZ2VzLgotCi12ZXJzaW9uIDEuNC4xcmMwMyBbRmVicnVhcnkgMTksIDIwMTBdCi0gIE5vdGVkIGluIHNjcmlwdHMvbWFrZWZpbGUubWluZ3cgdGhhdCBpdCBleHBlY3RzIHRvIGJlIHJ1biB1bmRlciBNU1lTLgotICBSZW1vdmVkIG9ic29sZXRlIHVudXNlZCBNTVgtcXVlcnlpbmcgc3VwcG9ydCBmcm9tIGNvbnRyaWIvZ3JlZ2Jvb2sKLSAgUmVtb3ZlZCB0aGUgQUlYIHJlZGVmaW5pdGlvbiBvZiBqbXBidWYgaW4gcG5nLmgKLSAgRGVmaW5lIF9BTExfU09VUkNFIGluIGNvbmZpZ3VyZS5hYywgbWFrZWZpbGUuYWl4LCBhbmQgQ01ha2VMaXN0cy50eHQKLSAgICB3aGVuIHVzaW5nIEFJWCBjb21waWxlci4KLQotdmVyc2lvbiAxLjQuMXJjMDQgW0ZlYnJ1YXJ5IDE5LCAyMDEwXQotICBSZW1vdmVkIHVudXNlZCBnemlvLmMgZnJvbSBjb250cmliL3BuZ21pbmltIGdhdGhlciBhbmQgbWFrZWZpbGUgc2NyaXB0cwotCi12ZXJzaW9uIDEuNC4xIFtGZWJydWFyeSAyNSwgMjAxMF0KLQotdmVyc2lvbiAxLjQuMmJldGEwMSBbQXByaWwgMSwgMjAxMF0KLSAgQ29uZGl0aW9uYWxseSBjb21waWxlIGFuICJlbHNlIiBzdGF0ZW1lbnQgaW4gcG5nX2RlY29tcHJlc3NfY2h1bmsoKS4KLSAgUmVzdG9yZWQgdGhlIG1hY3JvIGRlZmluaXRpb24gb2YgcG5nX2NoZWNrX3NpZygpLgotCi12ZXJzaW9uIDEuNC4ycmMwMSBbQXByaWwgMTAsIDIwMTBdCi0gIE5vIGNoYW5nZXMuCi0KLXZlcnNpb24gMS40LjJyYzAyIFtBcHJpbCAxNiwgMjAxMF0KLSAgRG9jdW1lbnRlZCB0aGUgZmFjdCB0aGF0IHBuZ19zZXRfZGl0aGVyKCkgd2FzIGRpc2FibGVkIHNpbmNlIGxpYnBuZy0xLjQuMC4KLSAgUmVlbmFibGVkIHBuZ19zZXRfZGl0aGVyKCkgYnV0IHJlbmFtZWQgaXQgdG8gcG5nX3NldF9xdWFudGl6ZSgpIHRvIHJlZmxlY3QKLSAgICBtb3JlIGFjY3VyYXRlbHkgd2hhdCBpdCBhY3R1YWxseSBkb2VzLiAgQXQgdGhlIHNhbWUgdGltZSwgcmVuYW1lZAotICAgIHRoZSBQTkdfRElUSEVSX1tSRUQsR1JFRU5fQkxVRV1fQklUUyBtYWNyb3MgdG8KLSAgICBQTkdfUVVBTlRJWkVfW1JFRCxHUkVFTixCTFVFXV9CSVRTLgotCi12ZXJzaW9uIDEuNC4ycmMwMyBbQXByaWwgMjQsIDIwMTBdCi0gIEFkZGVkIHNvbWUgIihsb25nKSIgdHlwZWNhc3RzIHRvIHByaW50ZiBjYWxscyBpbiBwbmdfaGFuZGxlX2NIUk0oKS4KLSAgUmVsYXhlZCB0aGUgb3Zlcmx5LXJlc3RyaWN0aXZlIHBlcm1pc3Npb25zIG9mIHNvbWUgZmlsZXMuCi0KLXZlcnNpb24gMS40LjJyYzA0IFtBcHJpbCAyOCwgMjAxMF0KLSAgQWRkZWQgdGhlICJ2c3R1ZGlvIiBwcm9qZWN0IHRvIHJlcGxhY2UgInZpc3VhbGM2IiBhbmQgInZpc3VhbGM3MSIgd2hpY2gKLSAgICB3aWxsIGJlIHJlbW92ZWQgZnJvbSBsaWJwbmctMS41LjAuCi0gIERlbW9uc3RyYXRlIGluIGV4YW1wbGUuYyB0aGF0IGxhbmdfa2V5IHNob3VsZCBiZSBpbml0aWFsaXplZC4KLSAgU2V0IFBOR19OT19SRUFEX0JHUiwgUE5HX05PX0lPX1NUQVRFLCBhbmQgUE5HX05PX1RJTUVfUkZDMTEyMyBpbgotICAgIGNvbnRyaWIvcG5nbWluaW0vZGVjb2Rlci9wbmd1c3IuaCB0byBtYWtlIGEgc21hbGxlciBkZWNvZGVyIGFwcGxpY2F0aW9uLgotCi12ZXJzaW9uIDEuNC4ycmMwNSBbQXByaWwgMjksIDIwMTBdCi0gIEluY2x1ZGUgcG5nX3Jlc2V0X3pzdHJlYW0oKSBpbiBwbmcuYyBvbmx5IHdoZW4gUE5HX1JFQURfU1VQUE9SVEVEIGlzIGRlZmluZWQuCi0gIFJlbW92ZWQgZHVtbXlfaW5mbGF0ZS5jIGFuZCB1bmNvbXByLmMgZnJvbSBjb250cmliL3BuZ21pbmltL2VuY29kZXIKLSAgQ29ycmVjdGVkIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQgdG8gUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAotICAgIGluIGdyZWdib29rL3JlYWRwbmcyLmMKLSAgQ29ycmVjdGVkIHByb3RlY3Rpb24gb2YgcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIuIFRoZSBBUEkgZGVjbGFyYXRpb24gaW4KLSAgICBwbmcuaCBpcyByZW1vdmVkIGlmIGJvdGggUkVBRCBhbmQgV1JJVEUgVVNFUl9UUkFOU0ZPUk0gYXJlIHR1cm5lZCBvZmYKLSAgICBidXQgd2FzIGxlZnQgZGVmaW5lZCBpbiBwbmd0cmFucy5jCi0KLXZlcnNpb24gMS40LjJyYzA2IFtNYXkgMywgMjAxMF0KLSAgTW92ZWQgZGVjbGFyYXRpb25zIG9mIHVtc2dbXSBpbnNpZGUgdGhlIHByb3BlciAjaWZkZWYgYmxvY2tzIGluIHBuZ3J1dGlsLmMKLQotdmVyc2lvbiAxLjQuMiBbTWF5IDYsIDIwMTBdCi0KLXZlcnNpb24gMS40LjNiZXRhMDEgW0p1bmUgMTgsIDIwMTBdCi0gIEFkZGVkIG1pc3NpbmcgcXVvdGF0aW9uIG1hcmtzIGluIHRoZSBhaXggYmxvY2sgb2YgY29uZmlndXJlLmFjCi0gIFRoZSBuZXcgInZzdHVkaW8iIHByb2plY3Qgd2FzIG1pc3NpbmcgZnJvbSB0aGUgemlwIGFuZCA3eiBkaXN0cmlidXRpb25zLgotICBJbiBwbmdwcmVhZC5jOiBwbmdfcHVzaF9oYXZlX3JvdygpIGFkZCBjaGVjayBmb3IgbmV3X3JvdyA+IGhlaWdodAotCi12ZXJzaW9uIDEuNC4zYmV0YTAyIFtKdW5lIDE4LCAyMDEwXQotICBSZW1vdmVkIHRoZSBub3ctcmVkdW5kYW50IGNoZWNrIGZvciBvdXQtb2YtYm91bmRzIG5ld19yb3cgZnJvbSBleGFtcGxlLmMKLQotdmVyc2lvbiAxLjQuM2JldGEwMyBbSnVuZSAxOCwgMjAxMF0KLSAgSW4gcG5ncHJlYWQuYzogcG5nX3B1c2hfZmluaXNoX3JvdygpIGFkZCBjaGVjayBmb3IgdG9vIG1hbnkgcm93cy4KLQotdmVyc2lvbiAxLjQuM2JldGEwNCBbSnVuZSAxOSwgMjAxMF0KLSAgSW4gcG5ncHJlYWQuYzogcG5nX3B1c2hfcHJvY2Vzc19yb3coKSBhZGQgY2hlY2sgZm9yIHRvbyBtYW55IHJvd3MuCi0gIFJlbW92ZWQgdGhlIGNoZWNrcyBhZGRlZCBpbiBiZXRhMDEgYW5kIGJldGEwMywgYXMgdGhleSBhcmUgbm93IHJlZHVuZGFudC4KLQotdmVyc2lvbiAxLjQuM2JldGEwNSBbSnVuZSAyMCwgMjAxMF0KLSAgUmV3cm90ZSBwbmdfcHJvY2Vzc19JREFUX2RhdGEgdG8gY29uc2lzdGVudGx5IHRyZWF0IGV4dHJhIGRhdGEgYXMgd2FybmluZ3MKLSAgICBhbmQgaGFuZGxlIGVuZCBjb25kaXRpb25zIG1vcmUgY2xlYW5seS4KLSAgUmVtb3ZlZCB0aGUgbmV3IChiZXRhMDQpIGNoZWNrIGluIHBuZ19wdXNoX3Byb2Nlc3Nfcm93KCkuCi0KLXZlcnNpb24gMS40LjNyYzAxIFtKdW5lIDIxLCAyMDEwXQotICBSZXZpc2VkIHNvbWUgY29tbWVudHMgaW4gcG5nX3Byb2Nlc3NfSURBVF9kYXRhKCkuCi0KLXZlcnNpb24gMS40LjNyYzAyIFtKdW5lIDIyLCAyMDEwXQotICBDaGFuZ2VkIGNoYXIgKm1zZyB0byBQTkdfQ09OU1QgY2hhciAqbXNnIGluIHBuZ3J1dGlsLmMKLSAgU3RvcCBtZW1vcnkgbGVhayB3aGVuIHJlYWRpbmcgYSBtYWxmb3JtZWQgc0NBTCBjaHVuay4KLSAgUmVtb3ZlZCBzb21lIHRyYWlsaW5nIGJsYW5rcy4KLQotdmVyc2lvbiAxLjQuM3JjMDMgW0p1bmUgMjMsIDIwMTBdCi0gIFJldmlzZWQgcG5ncHJlYWQuYyBwYXRjaCBvZiBiZXRhMDUgdG8gYXZvaWQgYW4gZW5kbGVzcyBsb29wLgotCi12ZXJzaW9uIDEuNC4zIFtKdW5lIDI2LCAyMDEwXQotICBVcGRhdGVkIHNvbWUgb2YgdGhlICJsYXN0IGNoYW5nZWQiIGRhdGVzLgotCi12ZXJzaW9uIDEuNC40YmV0YTAxIFtKdWx5IDEyLCAyMDEwXQotICBSZW1vdmVkIGV4dHJhbmVvdXMgbmV3X3B1c2hfcHJvY2Vzc19yb3cuYyBmaWxlLgotICBSZXZpc2VkIHRoZSAiU0VFIEFMU08iIHN0eWxlIG9mIGxpYnBuZy4zLCBsaWJwbmdwZi4zLCBhbmQgcG5nLjUKLSAgUmVtb3ZlZCBzb21lIG5ld2x5LWFkZGVkIFRBQiBjaGFyYWN0ZXJzIGZyb20gcG5ncHJlYWQuYy4KLSAgRml4ZWQgc29tZSBpbmRlbnRhdGlvbiBpbiBwbmdwcmVhZC5jIGFuZCBwbmdydXRpbC5jCi0gIENoYW5nZWQgImV4dGVybiBQTkdfRVhQT1JUIiB0byAiUE5HX0VYUE9SVCIgaW4gcG5nLmggKEphbiBOaWp0bWFucykKLSAgQ2hhbmdlZCAiZXh0ZXJuIiB0byAiUE5HX0VYVEVSTiIgaW4gcG5ncHJpdi5oIChleGNlcHQgZm9yIHRoZSAnZXh0ZXJuICJDIiB7JykKLSAgUHV0ICIjaWZuZGVmIFBOR19FWFRFUk4sICNlbmRpZiIgYXJvdW5kICIjZGVmaW5lIFBOR19FWFRFUk4iIGluIHBuZ3ByaXYuaAotCi12ZXJzaW9uIDEuNC40YmV0YTAyIFtKdWx5IDI0LCAyMDEwXQotICBBZGRlZCAtRE5PX1BOR19TTlBSSU5URiB0byBDRkxBR1MgaW4gc2NyaXB0cy9tYWtlZmlsZS5kajIKLSAgTW92ZWQgdGhlIGRlZmluaXRpb24gb2YgcG5nX3NucHJpbnRmKCkgb3V0c2lkZSBvZiB0aGUgZW5jbG9zaW5nCi0gICAgI2lmZGVmIGJsb2NrcyBpbiBwbmdjb25mLmgKLSAgQWRkZWQgYSBzcGVjaWFsIGNhc2UgdHlwZWRlZiBvZiBwbmdfbG9uZ2ptcF9wdHIgZm9yIFdBVENPTS4KLQotdmVyc2lvbiAxLjQuNGJldGEwMyBbSnVseSAyNCwgMjAxMF0KLSAgUmVtb3ZlZCByZWZlcmVuY2UgdG8gY2J1aWxkZXI1LyogZnJvbSBNYWtlZmlsZS5pbiBhbmQgTWFrZWZpbGUuYW0KLSAgRWxpbWluYXRlZCB0aGUgbmV3IHNwZWNpYWwgY2FzZSB0eXBlZGVmIG9mIHBuZ19sb25nam1wX3B0ciBmb3IgV0FUQ09NCi0gICAgYW5kIG1hZGUgYSBzcGVjaWFsIGNhc2UgIiNkZWZpbmUgUE5HQVBJIiBpbiBwbmdjb25mLmggaW5zdGVhZC4KLQotdmVyc2lvbiAxLjQuNGJldGEwNCBbSnVseSAzMSwgMjAxMF0KLSAgVXBkYXRlZCB0aGUgcmVhZCBtYWNyb3MgYW5kIGZ1bmN0aW9ucyBmcm9tIDEuNS4wYmV0YTM4LgotCi12ZXJzaW9uIDEuNC40YmV0YTA1IFtBdWd1c3QgNiwgMjAxMF0KLSAgVXBkYXRlZCBwcm9qZWN0cy92aXN1YWxjNzEgc28gaXQgY2FuIGZpbmQgc2NyaXB0cy9wbmdsaWJjb25mLmgKLSAgUmVtb3ZlZCB1bnVzZWQgcG5nX21lbV8qIGRlZmluZXMgZnJvbSBwbmdjb25mLmguCi0gIENvcnJlY3QgdXNlIG9mIF9XSU5ET1dTXyBpbiBwbmdjb25mLmgKLQotdmVyc2lvbiAxLjQuNGJldGEwNiBbQXVndXN0IDExLCAyMDEwXQotICBEb24ndCB0cnkgdG8gdXNlIHZlcnNpb24tc2NyaXB0IHdpdGggY3lnd2luL21pbmd3LgotICBSZXZpc2VkIGNvbnRyaWIvZ3JlZ2Jvb2sgdG8gd29yayB1bmRlciBjeWd3aW4vbWluZ3cuCi0KLXZlcnNpb24gMS40LjRiZXRhMDcgW0F1Z3VzdCAyNiwgMjAxMF0KLSAgVXBkYXRlZCBwcmVidWlsdCBhY2xvY2FsLm00IGFuZCBsdG1haW4uc2gKLSAgQWRkIC5kbGwuYSB0byB0aGUgbGlzdCBvZiBleHRlbnNpb25zIHRvIGJlIHN5bWxpbmtlZCBieSBNYWtlZmlsZS5hbSAoWWFha292KQotICBVcGRhdGVkIENNYWtlTGlzdHMudHh0IHRvIHVzZSBDTUFLRV9JTlNUQUxMX0xJQkRJUiB2YXJpYWJsZTsgdXNlZnVsIGZvcgotICAgIGluc3RhbGxpbmcgbGlicG5nIGluIC91c3IvbGliNjQgKEZ1bmRhIFdhbmcpLgotICBSZXZpc2VkIENNYWtlTGlzdHMudHh0IHRvIHB1dCB0aGUgbWFuIHBhZ2VzIGluIHNoYXJlL21hbi9tYW4qIG5vdCBtYW4vbWFuKgotICBSZXZpc2VkIENNYWtlTGlzdHMudHh0IHRvIG1ha2Ugc3ltbGlua3MgaW5zdGVhZCBvZiBjb3BpZXMgd2hlbiBpbnN0YWxsaW5nLgotICBDaGFuZ2VkIFBOR19MSUJfTkFNRSBmcm9tIHBuZ05OIHRvIGxpYnBuZ05OIGluIENNYWtlTGlzdHMudHh0IChQaGlsaXAgTG93bWFuKQotICBNb3ZlZCAiI2luY2x1ZGUgcG5ndXNyLmgiIGFoZWFkIG9mIFBOR19VU0VSX1BSSVZBVEVCVUlMRCB0ZXN0IGluIHBuZ2NvbmYuaAotICBFbGltaW5hdGVkIGEgZGVwcmVjYXRlZCByZWZlcmVuY2UgdG8gcG5nX3B0ci0+aW9fcHRyIGluIHBuZ3Rlc3QuYwotICBFbGltaW5hdGVkIG5ldyB1bm5lY2Vzc2FyeSAjaWYgdGVzdHMgcmVnYXJkaW5nIHRoZSBzQ0FMIGNodW5rIGZyb20gcG5ncnV0aWwuYwotCi12ZXJzaW9uIDEuNC40YmV0YTA4IFtTZXB0ZW1iZXIgMiwgMjAxMF0KLSAgVXBkYXRlZCB0aGUgeGNvZGUgcHJvamVjdCB0byB3b3JrIHdpdGggbGlicG5nLTEuNC54IGFuZCBhZGRlZCBpT1MgdGFyZ2V0cwotICAgIGZvciBzaW11bGF0b3IgYW5kIGRldmljZSAoUGhpbGlwcGUgSGF1c2xlcikuCi0KLXZlcnNpb24gMS40LjRyYzAxIFtTZXB0ZW1iZXIgMTAsIDIwMTBdCi0gIE5vIGNoYW5nZXMuCi0KLXZlcnNpb24gMS40LjRyYzAyIFtTZXB0ZW1iZXIgMTMsIDIwMTBdCi0gIFJldmlzZWQgQ01ha2VMaXN0cy50eHQgKFBoaWxpcCBMb3dtYW4pLgotCi12ZXJzaW9uIDEuNC40cmMwMyBbU2VwdGVtYmVyIDE0LCAyMDEwXQotICBSZW1vdmVkIGFuIGV4dHJhbmVvdXMgY2xvc2UtZG91YmxlLXF1b3RlIGZyb20gQ01ha2VMaXN0cy50eHQKLSAgRWxpbWluYXRlZCBhbm90aGVyIGRlcHJlY2F0ZWQgcmVmZXJlbmNlIHRvIHBuZ19wdHItPmlvX3B0ciBpbiBwbmd0ZXN0LmMKLQotdmVyc2lvbiAxLjQuNHJjMDQgW1NlcHRlbWJlciAxNiwgMjAxMF0KLSAgRml4ZWQgaW5kZW50YXRpb24gYW5kIHJlbW92ZWQgZGVidWdnaW5nIG1lc3NhZ2UgZnJvbSBDTWFrZUxpc3RzLnR4dAotICBSZXZpc2VkIGF1dG9nZW4uc2ggdG8gcmVjb2duaXplIGFuZCB1c2UgJEFVVE9DT05GLCAkQVVUT01BS0UsICRBVVRPSEVBREVSLAotICAgICRBVVRPUE9JTlQsICRBQ0xPQ0FMIGFuZCAkTElCVE9PTElaRQotCi12ZXJzaW9uIDEuNC40cmMwNSBbU2VwdGVtYmVyIDIwLCAyMDEwXQotICBSZWJ1aWx0IGNvbmZpZ3VyZSBzY3JpcHRzIHdpdGggYXV0b21ha2UtMS4xMS4xIGluc3RlYWQgb2YgYXV0b21ha2UtMS4xMS4KLSAgUmVtb3ZlZCB1bnVzZWQgbWtpbnN0YWxsZGlycyBmaWxlLgotCi12ZXJzaW9uIDEuNC40IFtTZXB0ZW1iZXIgMjMsIDIwMTBdCi0gIE5vIGNoYW5nZXMuCi0KLXZlcnNpb24gMS40LjViZXRhMDEgW1NlcHRlbWJlciAyNSwgMjAxMF0KLSAgRml4ZWQgcG9zc2libGUgY29uZmlndXJlLmFjIGJ1ZyBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMS40LjRyYzA1LgotICBSZWJ1aWx0IGNvbmZpZ3VyZSBzY3JpcHRzIHdpdGggYXV0b2NvbmYtMi42OCBpbnN0ZWFkIG9mIGF1dG9jb25mLTIuNjUKLQotdmVyc2lvbiAxLjQuNWJldGEwMiBbT2N0b2JlciA1LCAyMDEwXQotICBSZXZlcnRlZCBjb25maWd1cmUgc2NyaXB0cyB0byBhdXRvY29uZi0yLjY1Ci0gIEZpeGVkIHByb2JsZW0gd2l0aCBzeW1ib2xzIGNyZWF0aW9uIGluIE1ha2VmaWxlLmFtIHdoaWNoIHdhcyBhc3N1bWluZyB0aGF0Ci0gICAgYWxsIHZlcnNpb25zIG9mIGNwcCB3cml0ZSB0byBzdGFuZGFyZCBvdXRwdXQgYnkgZGVmYXVsdCAoTWFydGluIEJhbmt5KS4gVGhlCi0gICAgYnVnIHdhcyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjIuOWJldGE1LgotCi12ZXJzaW9uIDEuNC41YmV0YTAzIFtPY3RvYmVyIDgsIDIwMTBdCi0gIFdyYXBwZWQgbG9uZyBsaW5lcyBpbiBDTWFrZUxpc3RzLnR4dCBhbmQgaW50cm9kdWNlZCAke2xpYnBuZ19wdWJsaWNfaGRyc30KLSAgVW5kaWQgTWFrZWZpbGUuYW0gcmV2aXNpb24gb2YgMS40LjViZXRhMDIuCi0KLXZlcnNpb24gMS40LjViZXRhMDQgW05vdmVtYmVyIDgsIDIwMTBdCi0gIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgdGV4dCBjb21wcmVzc2lvbiBtb2RlIGluIHBuZ19zZXRfdGV4dCgpLgotCi12ZXJzaW9uIDEuNC41cmMwMSBbTm92ZW1iZXIgMTksIDIwMTBdCi0gIE5vIGNoYW5nZXMuCi0KLXZlcnNpb24gMS40LjViZXRhMDUgW05vdmVtYmVyIDIwLCAyMDEwXQotICBSZXZpc2VkIHBuZ19nZXRfdWludF8zMiwgcG5nX2dldF9pbnRfMzIsIHBuZ19nZXRfdWludF8xNiAoQ29zbWluKQotICBNb3ZlZCByZWFkaW5nIG9mIGZpbGUgc2lnbmF0dXJlIGludG8gcG5nX3JlYWRfc2lnIChDb3NtaW4pCi0gIEZpeGVkIGF0b21pY2l0eSBvZiBjaHVuayBoZWFkZXIgc2VyaWFsaXphdGlvbiAoQ29zbWluKQotICBBZGRlZCB0ZXN0IGZvciBpb19zdGF0ZSBpbiBwbmd0ZXN0LmMgKENvc21pbikKLSAgQWRkZWQgIiMhL2Jpbi9zaCIgYXQgdGhlIHRvcCBvZiBjb250cmliL3BuZ21pbmltLyovZ2F0aGVyLnNoIHNjcmlwdHMuCi0KLXZlcnNpb24gMS40LjViZXRhMDYgW05vdmVtYmVyIDIxLCAyMDEwXQotICBSZXN0b3JlZCB0aGUgcGFyZW50aGVzZXMgaW4gcG5ncnV0aWwuYzsgdGhleSBhcmUgbmVlZGVkIHdoZW4gdGhlCi0gICAgcG5nX2dldF8qaW50XyooKSBmdW5jdGlvbnMgYXJlIGNvbXBpbGVkIChpLmUuLCB3aGVuIFBOR19VU0VfUkVBRF9NQUNST1MKLSAgICBpcyBub3QgZGVmaW5lZCkuCi0gIE1ha2UgdGhlICJwbmdfZ2V0X3VpbnRfMTYiIG1hY3JvIHJldHVybiBhIHBuZ191aW50XzMyIGluIGxpYnBuZy0xLjQgZm9yIEFQSQotICAgIGNvbXBhdGliaWxpdHkuCi0gIENoYW5nZXMgdG8gcmVtb3ZlIGdjYyB3YXJuaW5ncyAoSm9obiBCb3dsZXIpCi0gICAgQ2VydGFpbiBvcHRpb25hbCBnY2Mgd2FybmluZyBmbGFncyByZXN1bHRlZCBpbiB3YXJuaW5ncyBpbiBsaWJwbmcgY29kZS4KLSAgICBXaXRoIHRoZXNlIGNoYW5nZXMgb25seSAtV2NvbnZlcnNpb24gYW5kIC1XY2FzdC1xdWFsIGNhbm5vdCBiZSB0dXJuZWQgb24uCi0gICAgQ2hhbmdlcyBhcmUgdHJpdmlhbCByZWFycmFuZ2VtZW50cyBvZiBjb2RlLiAgLVdjb252ZXJzaW9uIGlzIG5vdCBwb3NzaWJsZQotICAgIGZvciBwbmdydXRpbC5jIChiZWNhdXNlIG9mIHRoZSB3aWRlc3ByZWFkIHVzZSBvZiArPSBldCBhbCBvbiB2YXJpYWJsZXMKLSAgICBzbWFsbGVyIHRoYW4gKGludCkgb3IgKHVuc2lnbmVkIGludCkpIGFuZCAtV2Nhc3QtcXVhbCBpcyBub3QgcG9zc2libGUKLSAgICB3aXRoIHBuZ3dpby5jIGFuZCBwbmd3dXRpbC5jIGJlY2F1c2UgdGhlICd3cml0ZScgY2FsbGJhY2sgYW5kIHpsaWIKLSAgICBjb21wcmVzc2lvbiBib3RoIGZhaWwgdG8gZGVjbGFyZSB0aGVpciBpbnB1dCBidWZmZXJzIHdpdGggJ2NvbnN0Jy4KLQotdmVyc2lvbiAxLjQuNWJldGEwNyBbTm92ZW1iZXIgMjUsIDIwMTBdCi0gIFJldmVydGVkIHBuZ19nZXRfdWludF8xNiBtYWNybyB0byBiZXRhMDUgYW5kIGFkZGVkIGNvbW1lbnQgYWJvdXQgdGhlCi0gICAgcG90ZW50aWFsIEFQSSBpbmNvbXBhdGliaWxpdHkuCi0KLXZlcnNpb24gMS40LjVyYzAyIFtEZWNlbWJlciAyLCAyMDEwXQotICBObyBjaGFuZ2VzLgotCi12ZXJzaW9uIDEuNC41cmMwMyBbRGVjZW1iZXIgMywgMjAxMF0KLSAgQWRkZWQgbWlzc2luZyB2c3R1ZGlvLyovKi52Y3hwcm9qIGZpbGVzIHRvIHRoZSB6aXAgYW5kIDd6IGRpc3RyaWJ1dGlvbnMuCi0KLXZlcnNpb24gMS40LjUgW0RlY2VtYmVyIDksIDIwMTBdCi0gIFJlbW92ZWQgUE5HX05PX1dSSVRFX0dBTU1BIGZyb20gcG5nbWluaW0vZW5jb2Rlci9wbmd1c3IuaAotCi12ZXJzaW9uIDEuNC42YmV0YTAxIFtEZWNlbWJlciAyOSwgMjAxMF0KLSAgRml4ZWQgYnVnIGluIGJhY2tncm91bmQgdHJhbnNmb3JtYXRpb24gaGFuZGxpbmcgaW4gcG5ncnRyYW4uYyAoaXQgd2FzCi0gICAgbG9va2luZyBmb3IgdGhlIGZsYWcgaW4gcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIGluc3RlYWQgb2YgaW4KLSAgICBwbmdfcHRyLT5mbGFncykgKERhdmlkIFJheW1vbmQpLgotCi12ZXJzaW9uIDEuNC42YmV0YTAyIFtKYW51YXJ5IDE0LCAyMDExXQotICBGaXhlZCBtaXNzcGVsbGVkIG1hY3JvcyBpbiBjb250cmliL3BuZ21pbmltIChDb3NtaW4pLgotICBVcGRhdGVkIENNYWtlTGlzdHMudHh0IChDbGlmZm9yZCBZYXBwKS4KLQotdmVyc2lvbiAxLjQuNmJldGEwMyBbSmFudWFyeSAxNCwgMjAxMV0KLSAgRml4ZWQgc29tZSB0eXBlY2FzdHMgaW4gcG5nX2RlYnVnIHN0YXRlbWVudHMgKENvc21pbikuCi0KLXZlcnNpb24gMS40LjZiZXRhMDQgW0phbnVhcnkgMjIsIDIwMTFdCi0gIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBvZiBwbmdfc2V0fGdldF90Uk5TKCkgKFRob21hcyBLbGF1c25lcikuCi0gIEFkZGVkIHBuZ19jb25zdF9zdHJ1Y3RwIGFuZCBwbmdfY29uc3RfaW5mb3AgdHlwZXMsIGFuZCB1c2VkIHRoZW0gaW4KLSAgICBwcm90b3R5cGVzIGZvciBtb3N0IHBuZ19nZXRfKigpIGZ1bmN0aW9ucy4KLSAgSW4gdGhlIG1hbnVhbCwgZGVzY3JpYmUgdGhlIHBuZ19nZXRfSUhEUigpIGFyZ3VtZW50cyBpbiB0aGUgY29ycmVjdCBvcmRlci4KLSAgUG9ydGVkIGNoYW5nZSBpbiBwbmdfZG9fcmdiX3RvX2dyYXkoKSBmcm9tIGxpYnBuZy0xLjUuMSwgdG8gbWFrZQotICAgIGl0IG1vcmUgcm9idXN0IGFnYWluc3QgaW50ZXJuYWwgbGlicG5nIGNvZGluZyBlcnJvcnMuCi0KLXZlcnNpb24gMS40LjZiZXRhMDUgW0phbnVhcnkgMjMsIDIwMTFdCi0KLSAgVXBkYXRlZCB0aGUgc3lub3BzZXMgaW4gdGhlIG1hbnVhbCB0byByZWZsZWN0IHJlY2VudCBjaGFuZ2VzLgotICBGaXhlZCBhIHR5cG8gaW4gdGhlICouZGVmIGZpbGVzIGFuZCBkZWxldGVkIGVudHJpZXMgdGhhdCBhcmUgbm93Ci0gICAgZGVjbGFyZWQgaW4gcG5ncHJpdi5oCi0KLXZlcnNpb24gMS40LjZiZXRhMDYgW01hcmNoIDE5LCAyMDExXQotICBVcGRhdGVkIGNvbnRyaWIvcG5nc3VpdGUvUkVBRE1FIHRvIGFkZCB0aGUgd29yZCAibW9kaWZ5Ii4KLSAgQWRkZWQgdGhlIHByaXZhdGUgUE5HX1VOVVNFRCgpIG1hY3JvIGRlZmluaXRpb24gaW4gcG5nY29uZi5oLgotCi12ZXJzaW9uIDEuNC42YmV0YTA3IFtNYXJjaCAyMiwgMjAxMV0KLSAgaWZkZWYgb3V0IG1hc2sgYXJyYXlzIGluIHBuZ3JlYWQuYyB3aGVuIGludGVybGFjaW5nIGlzIG5vdCBzdXBwb3J0ZWQuCi0gIEFkZGVkIGF0dHJpYnV0ZSBkZWZpbml0aW9uICh3YXJuaW5ncykgZm9yIE1TQ19WRVIgPj0gMTMwMCBpbiBwbmdjb25mLmgKLSAgQWRkZWQgLURfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgdG8gQ0ZMQUdTIGluIG1ha2VmaWxlLnZjd2luMzIKLSAgRml4ZWQgbWlzdGFrZSBpbiB0aGUgZGVzY3JpcHRpb25zIG9mIHVzZXIgcmVhZF90cmFuc2Zvcm0gYW5kIHdyaXRlX3RyYW5zZm9ybQotICAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgaW4gdGhlIG1hbnVhbC4gIFRoZSByb3dfaW5mbyBzdHJ1Y3QgaXMgcG5nX3Jvd19pbmZvcC4KLSAgQWRkZWQgYSByZXF1ZXN0IGluIHRoZSBtYW51YWwgdGhhdCBhcHBsaWNhdGlvbnMgZG8gbm90IHVzZSAicG5nXyIgb3IKLSAgICAiUE5HXyIgdG8gYmVnaW4gYW55IG9mIHRoZWlyIG93biBzeW1ib2xzLgotICBGaXhlZCBpbmNvcnJlY3QgZXhhbXBsZXMgb2YgY2FsbGJhY2sgcHJvdG90eXBlcyBpbiB0aGUgbWFudWFsLCB0aGF0IHdlcmUKLSAgICBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjAuMC4KLSAgUmVtb3ZlZCAic3RyaXAiIGZyb20gY29udHJpYi9wbmdtaW5pbS8qL21ha2VmaWxlLgotICBGaXhlZCBhIGJ1ZyAocHJlc2VudCBzaW5jZSBsaWJwbmctMS4wLjcpIHRoYXQgbWFrZXMgcG5nX2hhbmRsZV9zUExUKCkgZmFpbAotICAgIHRvIGNvbXBpbGUgd2hlbiBQTkdfTk9fUE9JTlRFUl9JTkRFWElORyBpcyBkZWZpbmVkIChDaHViYW5vdiBLaXJpbGwpCi0KLXZlcnNpb24gMS40LjZyYzAxIFtNYXJjaCAzMSwgMjAxMV0KLSAgTm8gY2hhbmdlcy4KLQotdmVyc2lvbiAxLjQuNnJjMDIgW0FwcmlsIDYsIDIwMTFdCi0gIEltcHJvdmVkIHRoZSBvcHRpbWl6YXRpb24gb2YgdGhlIHpsaWIgQ01GIGJ5dGUgKHNlZSBsaWJwbmctMS4yLjZiZXRhMDMpLgotCi12ZXJzaW9uIDEuNC42IFtBcHJpbCA4LCAyMDExXQotICBObyBjaGFuZ2VzLgotCi12ZXJzaW9uIDEuNC43cmMwMSBbQXByaWwgOSwgMjAxMV0KLSAgUmVsb2NhdGVkIG1pc3BsYWNlZCBuZXcgZGVjbGFyYXRpb25zIGluIHBuZ3d1dGlsLmMuCi0KLXZlcnNpb24gMS40LjcgW0FwcmlsIDksIDIwMTFdCi0gIERpc2FibGVkIFBOR19QRURBTlRJQ19XQVJOSU5HUyBmb3IgYWxsIE1TQyB2ZXJzaW9ucyBhcyBpbiBsaWJwbmctMS40LjUuCi0KLXZlcnNpb24gMS40LjhiZXRhMDEgW0p1bmUgNCwgMjAxMV0KLSAgVW5kZWYgIl9BTExfU09VUkNFIiBmb3IgQUlYLCB0byBwcmV2ZW50ICJqbXBidWYiIGZyb20gYmVpbmcgcmVkZWZpbmVkLgotICBDb3BpZWQgcG5nX2RlYnVnIG1hY3JvcyBmcm9tIHBuZ3ByaXYuaCBpbnRvIHBuZ3Rlc3QuYyBhbmQgcmVtb3ZlZAotICAgICIjaW5jbHVkZSBwbmdwcml2LmgiIGZyb20gcG5ndGVzdC5jLCB0byBhdm9pZCBzZXR0aW5nIGEgYmFkIGV4YW1wbGUuCi0gIFBhc3MgIiIgaW5zdGVhZCBvZiAnXDAnIHRvIHBuZ19kZWZhdWx0X2Vycm9yKCkgaW4gcG5nX2VycigpLiAgVGhpcyBtaXN0YWtlCi0gICAgd2FzIGludHJvZHVjZWQgaW4gbGlicG5nLTEuMi4yMGJldGEwMS4KLSAgQ2hlY2sgZm9yIHVwLT5sb2NhdGlvbiAhUE5HX0FGVEVSX0lEQVQgd2hlbiB3cml0aW5nIHVua25vd24gY2h1bmtzCi0gICAgYmVmb3JlIElEQVQuCi0gIFBvcnRlZCBidWdmaXggaW4gcG5ncnRyYW4uYyBmcm9tIDEuNS4zOiB3aGVuIGV4cGFuZGluZyBhIHBhbGV0dGVkIGltYWdlLAotICAgIGFsd2F5cyBleHBhbmQgdG8gUkdCQSBpZiB0cmFuc3BhcmVuY3kgaXMgcHJlc2VudC4KLQotdmVyc2lvbiAxLjQuOGJldGEwMiBbSnVuZSA1LCAyMDExXQotICBQb3J0ZWQgYnVnZml4IGluIHBuZ3J0cmFuLmMgZnJvbSAxLjUuMzogRW5zdXJlIGNvZWZmaWNpZW50cyBhcmUgT0sgZm9yCi0gICAgcG5nX3JnYl90b19ncmF5X2ZpeGVkKCkuCi0KLXZlcnNpb24gMS40LjhiZXRhMDMgW0p1bmUgNiwgMjAxMV0KLSAgQ2hlY2sgZm9yIGludGVnZXIgb3ZlcmZsb3cgaW4gcG5nX3NldF9yZ2JfdG9fZ3JheSgpLgotCi12ZXJzaW9uIDEuNC44YmV0YTA0IFtKdW5lIDcsIDIwMTFdCi0gIEZpeGVkIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgaW4gcG5nX2Zvcm1hdF9idWZmZXIoKSAoQnVnIHJlcG9ydCBieQotICAgIEZyYW5rIEJ1c3NlLCByZWxhdGVkIHRvIENWRS0yMDA0LTA0MjEpLgotCi12ZXJzaW9uIDEuNC44YmV0YTA1IFtKdW5lIDE5LCAyMDExXQotICBGaXhlZCBlcnJvciBpbiAiQUNDVVJBVEUiIDE2LXRvLTggc2NhbGluZyAoSm9obiBCb3dsZXIpLgotICBDaGVjayBmb3Igc0NBTCBjaHVuayB0b28gc2hvcnQuCi0KLXZlcnNpb24gMS40LjhyYzAxIFtKdW5lIDMwLCAyMDExXQotICBObyBjaGFuZ2VzLgotCi12ZXJzaW9uIDEuNC44IFtKdWx5IDcsIDIwMTFdCi0gIE5vIGNoYW5nZXMuCi0KLXZlcnNpb24gMS40LjliZXRhMDEgW0ZlYnJ1YXJ5IDE2LCAyMDEyXQotICBBZGRlZCB2c3R1ZGlvLyogYW5kIENNYWtlTGlzdHMgdG8gRVhUUkFfRElTVCBpbiBNYWtlZmlsZS5pbiBhbmQgTWFrZWZpbGUuYW0KLSAgVXBkYXRlZCBjb250cmliL3BuZ21pbnVzL21ha2VmaWxlLnN0ZCAoU2FtdWxpIFNvdW1pbmVuKQotICBBZGRlZCBTdW5PUyBzdXBwb3J0IHRvIGNvbmZpZ3VyZS5hYyBhbmQgTWFrZWZpbGUuYW0gKGJ1dCBjb25maWd1cmUgYW5kCi0gICAgTWFrZWZpbGUuaW4gd2VyZSBub3QgdXBkYXRlZCkKLQotdmVyc2lvbiAxLjQuOXJjMDEgW0ZlYnJ1YXJ5IDE3LCAyMDEyXQotICBGaXhlZCBDVkUtMjAxMS0zMDI2IGJ1ZmZlciBvdmVycnVuIGJ1Zy4gIFRoaXMgYnVnIHdhcyBpbnRyb2R1Y2VkIHdoZW4KLSAgICBpQ0NQIGNodW5rIHN1cHBvcnQgd2FzIGFkZGVkIGF0IGxpYnBuZy0xLjAuNi4gRGVhbCBtb3JlIGNvcnJlY3RseSB3aXRoIHRoZQotICAgIHRlc3Qgb24gaUNDUCBjaHVuayBsZW5ndGguIEFsc28gcmVtb3ZlZCBzcHVyaW91cyBjYXN0cyB0aGF0IG1heSBoaWRlCi0gICAgcHJvYmxlbXMgb24gMTYtYml0IHN5c3RlbXMuCi0KLXZlcnNpb24gMS40LjkgW0ZlYnJ1YXJ5IDE4LCAyMDEyXQotICBObyBjaGFuZ2VzLgotCi12ZXJzaW9uIDEuNC4xMGJldGEwMSBbRmVicnVhcnkgMjcsIDIwMTFdCi0gIFJlbW92ZWQgdHdvIHVzZWxlc3MgI2lmZGVmIGRpcmVjdGl2ZXMgZnJvbSBwbmdyZWFkLmMgYW5kIG9uZSBmcm9tIHBuZ3J1dGlsLmMKLSAgRWxpbWluYXRlZCByZWR1bmRhbnQgcG5nX3B1c2hfcmVhZF90RVh0fHpUWHR8aVRYdHx1bmtub3duIGNvZGUgZnJvbQotICAgIHBuZ3ByZWFkLmMgYW5kIHVzZSB0aGUgc2VxdWVudGlhbCBwbmdfaGFuZGxlX3RFWHQsIGV0Yy4sIGluIHBuZ3J1dGlsLmM7Ci0gICAgbm93IHRoYXQgcG5nX3B0ci0+YnVmZmVyIGlzIGluYWNjZXNzaWJsZSB0byBhcHBsaWNhdGlvbnMsIHRoZSBzcGVjaWFsCi0gICAgaGFuZGxpbmcgaXMgbm8gbG9uZ2VyIHVzZWZ1bC4KLSAgRml4ZWQgYnVnIHdpdGggcG5nX2hhbmRsZV9oSVNUIHdpdGggb2RkIGNodW5rIGxlbmd0aCAoRnJhbmsgQnVzc2UpLgotICBGaXhlZCBpbmNvcnJlY3QgdHlwZSAoaW50IGNvcHkgc2hvdWxkIGJlIHBuZ19zaXplX3QgY29weSkgaW4gcG5nX2luZmxhdGUoKQotICAgIChmaXhlcyBDVkUtMjAxMS0zMDQ1KS4KLSAgRml4ZWQgb2ZmLWJ5LW9uZSBidWcgaW4gcG5nX2hhbmRsZV9zQ0FMKCkgd2hlbiB1c2luZyBmaXhlZCBwb2ludCBhcml0aG1ldGljLAotICAgIGNhdXNpbmcgb3V0LW9mLWJvdW5kcyByZWFkIGluIHBuZ19zZXRfc0NBTCgpIGJlY2F1c2Ugb2YgZmFpbHVyZSB0byBjb3B5Ci0gICAgdGhlIHN0cmluZyB0ZXJtaW5hdG9ycy4gIFRoaXMgYnVnIHdhcyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjAuNiAoRnJhbmsKLSAgICBCdXNzZSkuCi0KLXZlcnNpb24gMS40LjEwcmMwMSBbTWFyY2ggMiwgMjAxMl0KLSAgUmVtb3ZlZCB0aGUgcG5nX2ZyZWUoKSBvZiB1bnVzZWQgcG5nX3B0ci0+Y3VycmVudF90ZXh0IGZyb20gcG5ncmVhZC5jLgotCi12ZXJzaW9uIDEuNC4xMHJjMDIgW01hcmNoIDYsIDIwMTJdCi0gIEZpeGVkIFBOR19MSUJQTkdfQlVJTERfQkFTRV9UWVBFIGRlZmluaXRpb24gaW4gcG5nLmgKLQotdmVyc2lvbiAxLjQuMTAgW01hcmNoIDE1LCAyMDEyXQotICBObyBjaGFuZ2VzLgotCi12ZXJzaW9uIDEuNC4xMSBbTWFyY2ggMjksIDIwMTJdCi0gIFJldmlzZWQgcG5nX3NldF90ZXh0XzIoKSB0byBhdm9pZCBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24gKGZpeGVzCi0gICAgQ1ZFLTIwMTEtMzA0OCkuCi0gIFByZXZlbnQgUE5HX0VYUEFORCtQTkdfU0hJRlQgZG9pbmcgdGhlIHNoaWZ0IHR3aWNlLgotCi12ZXJzaW9uIDEuNC4xMiBbSnVseSAxMCwgMjAxMl0KLSAgQWRkZWQgdHdvIGltYWdlcyB0byBjb250cmliL3BuZ3N1aXRlICgxLWJpdCBhbmQgMi1iaXQgdHJhbnNwYXJlbnQgZ3JheXNjYWxlKSwKLSAgICBhbmQgcmVuYW1lZCB0aHJlZSB3aG9zZSBuYW1lcyB3ZXJlIGluY29uc2lzdGVudCB3aXRoIHRob3NlIGluCi0gICAgcG5nc3VpdGUvUkVBRE1FLnR4dC4KLSAgQ2hhbmdlZCAiYSt3IiB0byAidSt3IiBpbiBNYWtlZmlsZS5pbiB0byBmaXggQ1ZFLTIwMTItMzM4Ni4KLQotU2VuZCBjb21tZW50cy9jb3JyZWN0aW9ucy9jb21tZW5kYXRpb25zIHRvIGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0Ci1vciB0byBwbmctbW5nLWltcGxlbWVudCBhdCBsaXN0cy5zZi5uZXQgKHN1YnNjcmlwdGlvbiByZXF1aXJlZDsgdmlzaXQKLWh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3BuZy1tbmctaW1wbGVtZW50KS4KLQotR2xlbm4gUi1QCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvQ01ha2VMaXN0cy50eHQgYi9zcmMvbGlicG5nL0NNYWtlTGlzdHMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzM4MDU3Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvQ01ha2VMaXN0cy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuNC40KQotc2V0KENNQUtFX0FMTE9XX0xPT1NFX0xPT1BfQ09OU1RSVUNUUyB0cnVlKQotCi1pZihVTklYIEFORCBOT1QgREVGSU5FRCBDTUFLRV9CVUlMRF9UWVBFKQotICBpZihDTUFLRV9NQUpPUl9WRVJTSU9OIEVRVUFMIDIgQU5EIENNQUtFX01JTk9SX1ZFUlNJT04gRVFVQUwgNCkKLSAgICAjIHdvcmthcm91bmQgQ01ha2UgMi40LnggYnVnCi0gICAgc2V0KENNQUtFX0JVSUxEX1RZUEUgIlJlbFdpdGhEZWJJbmZvIiBDQUNIRSBTVFJJTkcKLSAgICAgICAgIkNob29zZSB0aGUgdHlwZSBvZiBidWlsZCwgb3B0aW9ucyBhcmU6Ci0gICAgICAgICAgIE5vbmUoQ01BS0VfQ1hYX0ZMQUdTIG9yIENNQUtFX0NfRkxBR1MgdXNlZCkKLSAgICAgICAgICAgRGVidWcKLSAgICAgICAgICAgUmVsZWFzZQotICAgICAgICAgICBSZWxXaXRoRGViSW5mbwotICAgICAgICAgICBNaW5TaXplUmVsLiIpCi0gIGVsc2UoKQotICAgIHNldChDTUFLRV9CVUlMRF9UWVBFICJSZWxXaXRoRGViSW5mbyIgQ0FDSEUgU1RSSU5HCi0gICAgICAgICJDaG9vc2UgdGhlIHR5cGUgb2YgYnVpbGQsIG9wdGlvbnMgYXJlOgotICAgICAgICAgICBOb25lKENNQUtFX0NYWF9GTEFHUyBvciBDTUFLRV9DX0ZMQUdTIHVzZWQpCi0gICAgICAgICAgIERlYnVnCi0gICAgICAgICAgIFJlbGVhc2UKLSAgICAgICAgICAgUmVsV2l0aERlYkluZm8KLSAgICAgICAgICAgTWluU2l6ZVJlbC4iKQotICBlbmRpZigpCi1lbmRpZigpCi0KLXByb2plY3QobGlicG5nIEMpCi1lbmFibGVfdGVzdGluZygpCi0KLSMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0KLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi1zZXQoUE5HTElCX01BSk9SIDEpCi1zZXQoUE5HTElCX01JTk9SIDQpCi1zZXQoUE5HTElCX1JFTEVBU0UgMTIpCi1zZXQoUE5HTElCX05BTUUgbGlicG5nJHtQTkdMSUJfTUFKT1J9JHtQTkdMSUJfTUlOT1J9KQotc2V0KFBOR0xJQl9WRVJTSU9OICR7UE5HTElCX01BSk9SfS4ke1BOR0xJQl9NSU5PUn0uJHtQTkdMSUJfUkVMRUFTRX0pCi0KLSMgbmVlZGVkIHBhY2thZ2VzCi1maW5kX3BhY2thZ2UoWkxJQiBSRVFVSVJFRCkKLWluY2x1ZGVfZGlyZWN0b3JpZXMoJHtaTElCX0lOQ0xVREVfRElSfSkKLQotaWYoTk9UIFdJTjMyKQotICBmaW5kX2xpYnJhcnkoTV9MSUJSQVJZCi0gICAgTkFNRVMgbQotICAgIFBBVEhTIC91c3IvbGliIC91c3IvbG9jYWwvbGliCi0gICkKLSAgaWYoTk9UIE1fTElCUkFSWSkKLSAgICBtZXNzYWdlKFNUQVRVUwotICAgICAgIm1hdGggbGlicmFyeSAnbGlibScgbm90IGZvdW5kIC0gZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBkaXNhYmxlZCIpCi0gIGVuZGlmKCkKLWVsc2UoKQotICAjIG5vdCBuZWVkZWQgb24gd2luZG93cwotICBzZXQoTV9MSUJSQVJZICIiKQotZW5kaWYoKQotCi0jIENPTU1BTkQgTElORSBPUFRJT05TCi1pZihERUZJTkVEIFBOR19TSEFSRUQpCi0gIG9wdGlvbihQTkdfU0hBUkVEICJCdWlsZCBzaGFyZWQgbGliIiAke1BOR19TSEFSRUR9KQotZWxzZSgpCi0gIG9wdGlvbihQTkdfU0hBUkVEICJCdWlsZCBzaGFyZWQgbGliIiBPTikKLWVuZGlmKCkKLWlmKERFRklORUQgUE5HX1NUQVRJQykKLSAgb3B0aW9uKFBOR19TVEFUSUMgIkJ1aWxkIHN0YXRpYyBsaWIiICR7UE5HX1NUQVRJQ30pCi1lbHNlKCkKLSAgb3B0aW9uKFBOR19TVEFUSUMgIkJ1aWxkIHN0YXRpYyBsaWIiIE9OKQotZW5kaWYoKQotCi1pZihNSU5HVykKLSAgb3B0aW9uKFBOR19URVNUUyAgIkJ1aWxkIHBuZ3Rlc3QiIE5PKQotZWxzZSgpCi0gIG9wdGlvbihQTkdfVEVTVFMgICJCdWlsZCBwbmd0ZXN0IiBZRVMpCi1lbmRpZigpCi0KLW9wdGlvbihQTkdfTk9fQ09OU09MRV9JTyAiRklYTUUiIFlFUykKLW9wdGlvbihQTkdfTk9fU1RESU8gICAgICAiRklYTUUiIFlFUykKLW9wdGlvbihQTkdfREVCVUcgICAgICAgICAiQnVpbGQgd2l0aCBkZWJ1ZyBvdXRwdXQiIE5PKQotb3B0aW9uKFBOR0FSRyAgICAgICAgICAgICJGSVhNRSIgWUVTKQotI1RPRE86Ci0jIFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRAotCi0jIG1heWJlIG5lZWRzIGltcHJvdmluZywgYnV0IGN1cnJlbnRseSBJIGRvbid0IGtub3cgd2hlbiB3ZSBjYW4gZW5hYmxlIHdoYXQgOikKLXNldChwbmdfYXNtX3RtcCAiT0ZGIikKLWlmKE5PVCBXSU4zMikKLSAgZmluZF9wcm9ncmFtKHVuYW1lX2V4ZWN1dGFibGUgTkFNRVMgdW5hbWUgUEFUSFMgL2JpbiAvdXNyL2JpbiAvdXNyL2xvY2FsL2JpbikKLSAgaWYodW5hbWVfZXhlY3V0YWJsZSkKLSAgICBleGVjX3Byb2dyYW0oJHt1bmFtZV9leGVjdXRhYmxlfQotICAgICAgICAgICAgICAgICBBUkdTIC0tbWFjaGluZSBPVVRQVVRfVkFSSUFCTEUgdW5hbWVfb3V0cHV0KQotICAgIGlmKCJ1bmFtZV9vdXRwdXQiIE1BVENIRVMgIl4uKmlbMS05XTg2LiokIikKLSAgICAgIHNldChwbmdfYXNtX3RtcCAiT04iKQotICAgIGVsc2UoInVuYW1lX291dHB1dCIgTUFUQ0hFUyAiXi4qaVsxLTldODYuKiQiKQotICAgICAgc2V0KHBuZ19hc21fdG1wICJPRkYiKQotICAgIGVuZGlmKCJ1bmFtZV9vdXRwdXQiIE1BVENIRVMgIl4uKmlbMS05XTg2LiokIikKLSAgZW5kaWYodW5hbWVfZXhlY3V0YWJsZSkKLWVsc2UoKQotICAjIHRoaXMgZW52IHZhciBpcyBub3JtYWxseSBvbmx5IHNldCBvbiB3aW42NAotICBzZXQoVEVYVCAiUHJvZ3JhbUZpbGVzKHg4NikiKQotICBpZigiJEVOVnske1RFWFR9fSIgU1RSRVFVQUwgIiIpCi0gICAgc2V0KHBuZ19hc21fdG1wICJPTiIpCi0gIGVuZGlmKCIkRU5WeyR7VEVYVH19IiBTVFJFUVVBTCAiIikKLWVuZGlmKCkKLQotIyBTRVQgTElCTkFNRQotc2V0KFBOR19MSUJfTkFNRSBwbmcke1BOR0xJQl9NQUpPUn0ke1BOR0xJQl9NSU5PUn0pCi0KLSMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBkZWJ1ZyBhbmQgcmVsZWFzZSBsaWIKLXNldChDTUFLRV9ERUJVR19QT1NURklYICJkIikKLQotIyBPVVIgU09VUkNFUwotc2V0KGxpYnBuZ19wdWJsaWNfaGRycwotICBwbmcuaAotICBwbmdjb25mLmgKLSkKLXNldChsaWJwbmdfc291cmNlcwotICAke2xpYnBuZ19wdWJsaWNfaGRyc30KLSAgcG5ncHJpdi5oCi0gIHBuZy5jCi0gIHBuZ2Vycm9yLmMKLSAgcG5nZ2V0LmMKLSAgcG5nbWVtLmMKLSAgcG5ncHJlYWQuYwotICBwbmdyZWFkLmMKLSAgcG5ncmlvLmMKLSAgcG5ncnRyYW4uYwotICBwbmdydXRpbC5jCi0gIHBuZ3NldC5jCi0gIHBuZ3RyYW5zLmMKLSAgcG5nd2lvLmMKLSAgcG5nd3JpdGUuYwotICBwbmd3dHJhbi5jCi0gIHBuZ3d1dGlsLmMKLSkKLXNldChwbmd0ZXN0X3NvdXJjZXMKLSAgcG5ndGVzdC5jCi0pCi0jIFNPTUUgTkVFREVEIERFRklOSVRJT05TCi0KLWFkZF9kZWZpbml0aW9ucygtRFBOR19DT05GSUdVUkVfTElCUE5HKQotCi1pZihfQUlYKQotICBhZGRfZGVmaW5pdGlvbnMoLURfQUxMX1NPVVJDRSkKLWVuZGlmKF9BSVgpCi0KLWlmKE1TVkMpCi0gIGFkZF9kZWZpbml0aW9ucygtRFBOR19OT19NT0RVTEVERUYgLURfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUpCi1lbmRpZihNU1ZDKQotCi1pZihQTkdfU0hBUkVEIE9SICBOT1QgTVNWQykKLSAgI2lmIGJ1aWxkaW5nIG1zdmMgc3RhdGljIHRoaXMgaGFzIE5PVCB0byBiZSBkZWZpbmVkCi0gIGFkZF9kZWZpbml0aW9ucygtRFpMSUJfRExMKQotZW5kaWYoKQotCi0KLWlmKFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRCkKLSAgYWRkX2RlZmluaXRpb25zKC1EUE5HX0NPTlNPTEVfSU9fU1VQUE9SVEVEKQotZW5kaWYoKQotCi1pZihQTkdfTk9fQ09OU09MRV9JTykKLSAgYWRkX2RlZmluaXRpb25zKC1EUE5HX05PX0NPTlNPTEVfSU8pCi1lbmRpZigpCi0KLWlmKFBOR19OT19TVERJTykKLSAgYWRkX2RlZmluaXRpb25zKC1EUE5HX05PX1NURElPKQotZW5kaWYoKQotCi1pZihQTkdfREVCVUcpCi0gIGFkZF9kZWZpbml0aW9ucygtRFBOR19ERUJVRykKLWVuZGlmKCkKLQotaWYoTk9UIE1fTElCUkFSWSBBTkQgTk9UIFdJTjMyKQotICBhZGRfZGVmaW5pdGlvbnMoLURQTkdfTk9fRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQotZW5kaWYoKQotCi0jIE5PVyBCVUlMRCBPVVIgVEFSR0VUCi1pbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSAke1pMSUJfSU5DTFVERV9ESVJ9KQotCi1pZihQTkdfU0hBUkVEKQotICBhZGRfbGlicmFyeSgke1BOR19MSUJfTkFNRX0gU0hBUkVEICR7bGlicG5nX3NvdXJjZXN9KQotICBpZihNU1ZDKQotICAgICMgbXN2YyBkb2VzIG5vdCBhcHBlbmQgJ2xpYicgLSBkbyBpdCBoZXJlIHRvIGhhdmUgY29uc2lzdGVudCBuYW1lCi0gICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7UE5HX0xJQl9OQU1FfSBQUk9QRVJUSUVTIFBSRUZJWCAibGliIikKLSAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtQTkdfTElCX05BTUV9IFBST1BFUlRJRVMgSU1QT1JUX1BSRUZJWCAibGliIikKLSAgZW5kaWYoKQotICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtQTkdfTElCX05BTUV9ICR7WkxJQl9MSUJSQVJZfSAke01fTElCUkFSWX0pCi1lbmRpZigpCi0KLWlmKFBOR19TVEFUSUMpCi0jIGRvZXMgbm90IHdvcmsgd2l0aG91dCBjaGFuZ2luZyBuYW1lCi0gIHNldChQTkdfTElCX05BTUVfU1RBVElDICR7UE5HX0xJQl9OQU1FfV9zdGF0aWMpCi0gIGFkZF9saWJyYXJ5KCR7UE5HX0xJQl9OQU1FX1NUQVRJQ30gU1RBVElDICR7bGlicG5nX3NvdXJjZXN9KQotICBpZihNU1ZDKQotICAgICMgbXN2YyBkb2VzIG5vdCBhcHBlbmQgJ2xpYicgLSBkbyBpdCBoZXJlIHRvIGhhdmUgY29uc2lzdGVudCBuYW1lCi0gICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7UE5HX0xJQl9OQU1FX1NUQVRJQ30gUFJPUEVSVElFUyBQUkVGSVggImxpYiIpCi0gIGVuZGlmKCkKLSAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7UE5HX0xJQl9OQU1FX1NUQVRJQ30gJHtaTElCX0xJQlJBUll9ICR7TV9MSUJSQVJZfSkKLWVuZGlmKCkKLQotCi1pZihQTkdfU0hBUkVEIEFORCBXSU4zMikKLSAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7UE5HX0xJQl9OQU1FfSBQUk9QRVJUSUVTIERFRklORV9TWU1CT0wgUE5HX0JVSUxEX0RMTCkKLWVuZGlmKCkKLQotaWYoUE5HX1RFU1RTIEFORCBQTkdfU0hBUkVEKQotICAjIGRvZXMgbm90IHdvcmsgd2l0aCBtc3ZjIGR1ZSB0byBwbmdfbGliX3ZlciBpc3N1ZQotICBhZGRfZXhlY3V0YWJsZShwbmd0ZXN0ICR7cG5ndGVzdF9zb3VyY2VzfSkKLSAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHBuZ3Rlc3QgJHtQTkdfTElCX05BTUV9KQotICBhZGRfdGVzdChwbmd0ZXN0IC4vcG5ndGVzdCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vcG5ndGVzdC5wbmcpCi1lbmRpZigpCi0KLSMKLSMgU2V0IGEgdmFyaWFibGUgd2l0aCBDTWFrZSBjb2RlIHdoaWNoOgotIyBDcmVhdGVzIGEgc3ltbGluayBmcm9tIHNyYyB0byBkZXN0IChpZiBwb3NzaWJsZSkgb3IgYWx0ZXJuYXRpdmVseQotIyBjb3BpZXMgaWYgZGlmZmVyZW50LgotbWFjcm8oX3BuZ19nZW5lcmF0ZV9zeW1saW5rX2NvZGUgQ09ERSBTUkMgREVTVCkKLSAgaWYoV0lOMzIgQU5EIE5PVCBDWUdXSU4pCi0gICAgc2V0KF9wbmdfZ3NjX21lc3NhZ2UgIkNvcHlpbmcgJHtTUkN9IHRvICR7REVTVH0gaWYgbmVlZGVkIikKLSAgICBzZXQoX3BuZ19nc2Nfb3BlcmF0aW9uICJjb3B5X2lmX2RpZmZlcmVudCIpCi0gIGVsc2UoKQotICAgIHNldChfcG5nX2dzY19tZXNzYWdlICJTeW1saW5raW5nICR7U1JDfSB0byAke0RFU1R9IikKLSAgICBzZXQoX3BuZ19nc2Nfb3BlcmF0aW9uICJjcmVhdGVfc3ltbGluayIpCi0gIGVuZGlmKCkKLQotICBzZXQoJHtDT0RFfSAiCi0gICAgbWVzc2FnZShTVEFUVVMgXCIke19wbmdfZ3NjX21lc3NhZ2V9XCIpCi0gICAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgXCR7Q01BS0VfQ09NTUFORH0gLUUgJHtfcG5nX2dzY19vcGVyYXRpb259Ci0gICAgICBcIiR7U1JDfVwiIFwiJHtERVNUfVwiKQotICAgICIpCi1lbmRtYWNybygpCi0KLSMgQ1JFQVRFIFBLR0NPTkZJRyBGSUxFUwotIyB3ZSB1c2UgdGhlIHNhbWUgZmlsZXMgbGlrZSAuL2NvbmZpZ3VyZSwgc28gd2UgaGF2ZSB0byBzZXQgaXRzIHZhcnMKLWlmKE5PVCBERUZJTkVEIENNQUtFX0lOU1RBTExfTElCRElSKQotICBzZXQoQ01BS0VfSU5TVEFMTF9MSUJESVIgbGliKQotZW5kaWYoTk9UIERFRklORUQgQ01BS0VfSU5TVEFMTF9MSUJESVIpCi1zZXQocHJlZml4ICAgICAgJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0pCi1zZXQoZXhlY19wcmVmaXggJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0pCi1zZXQobGliZGlyICAgICAgJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0pCi1zZXQoaW5jbHVkZWRpciAgJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vaW5jbHVkZSkKLXNldChMSUJTICAgICAgICAiLWx6IC1sbSIpCi1jb25maWd1cmVfZmlsZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGlicG5nLnBjLmluCi0gICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke1BOR0xJQl9OQU1FfS5wYyBAT05MWSkKLV9wbmdfZ2VuZXJhdGVfc3ltbGlua19jb2RlKFBOR19QQ19JTlNUQUxMX0NPREUKLSAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7UE5HTElCX05BTUV9LnBjCi0gICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9saWJwbmcucGMpCi1pbnN0YWxsKENPREUgJHtQTkdfUENfSU5TVEFMTF9DT0RFfSkKLQotY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpYnBuZy1jb25maWcuaW4KLSAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7UE5HTElCX05BTUV9LWNvbmZpZyBAT05MWSkKLV9wbmdfZ2VuZXJhdGVfc3ltbGlua19jb2RlKFBOR19DT05GSUdfSU5TVEFMTF9DT0RFCi0gICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke1BOR0xJQl9OQU1FfS1jb25maWcKLSAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYnBuZy1jb25maWcpCi1pbnN0YWxsKENPREUgJHtQTkdfQ09ORklHX0lOU1RBTExfQ09ERX0pCi0KLSMgU0VUIFVQIExJTktTCi1pZihQTkdfU0hBUkVEKQotICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtQTkdfTElCX05BTUV9IFBST1BFUlRJRVMKLSMgICBWRVJTSU9OIDE0LiR7UE5HTElCX1JFTEVBU0V9LjEuNC4xMgotICAgIFZFUlNJT04gMTQuJHtQTkdMSUJfUkVMRUFTRX0uMAotICAgIFNPVkVSU0lPTiAxNAotICAgIENMRUFOX0RJUkVDVF9PVVRQVVQgMSkKLWVuZGlmKCkKLWlmKFBOR19TVEFUSUMpCi0gICMgTVNWQyBkb2Vzbid0IHVzZSBhIGRpZmZlcmVudCBmaWxlIGV4dGVuc2lvbiBmb3Igc2hhcmVkIHZzLiBzdGF0aWMKLSAgIyBsaWJzLiAgV2UgYXJlIGFibGUgdG8gY2hhbmdlIE9VVFBVVF9OQU1FIHRvIHJlbW92ZSB0aGUgX3N0YXRpYwotICAjIGZvciBhbGwgb3RoZXIgcGxhdGZvcm1zLgotICBpZihOT1QgTVNWQykKLSAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtQTkdfTElCX05BTUVfU1RBVElDfSBQUk9QRVJUSUVTCi0gICAgICBPVVRQVVRfTkFNRSAke1BOR19MSUJfTkFNRX0KLSAgICAgIENMRUFOX0RJUkVDVF9PVVRQVVQgMSkKLSAgZW5kaWYoKQotZW5kaWYoKQotCi0jIElmIENNYWtlID4gMi40LngsIHdlIHNldCBhIHZhcmlhYmxlIHVzZWQgYmVsb3cgdG8gZXhwb3J0Ci0jIHRhcmdldHMgdG8gYW4gZXhwb3J0IGZpbGUuCi0jIFRPRE86IFVzZSBWRVJTSU9OX0dSRUFURVIgYWZ0ZXIgb3VyIGNtYWtlX21pbmltdW1fcmVxdWlyZWQgPj0gMi42LjIKLWlmKENNQUtFX01BSk9SX1ZFUlNJT04gR1JFQVRFUiAxIEFORCBDTUFLRV9NSU5PUl9WRVJTSU9OIEdSRUFURVIgNCkKLSAgc2V0KFBOR19FWFBPUlRfUlVMRSBFWFBPUlQgbGlicG5nKQotZWxzZWlmKENNQUtFX01BSk9SX1ZFUlNJT04gR1JFQVRFUiAyKSAjIGZ1dHVyZSBwcm9vZgotICBzZXQoUE5HX0VYUE9SVF9SVUxFIEVYUE9SVCBsaWJwbmcpCi1lbmRpZigpCi0KLSMgSU5TVEFMTAotaWYoTk9UIFNLSVBfSU5TVEFMTF9MSUJSQVJJRVMgQU5EIE5PVCBTS0lQX0lOU1RBTExfQUxMICkKLSAgaWYoUE5HX1NIQVJFRCkKLSAgICBpbnN0YWxsKFRBUkdFVFMgJHtQTkdfTElCX05BTUV9Ci0gICAgICAgICR7UE5HX0VYUE9SVF9SVUxFfQotICAgICAgICBSVU5USU1FIERFU1RJTkFUSU9OIGJpbgotICAgICAgICBMSUJSQVJZIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9Ci0gICAgICAgIEFSQ0hJVkUgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0pCi0KLSAgICAjIENyZWF0ZSBhIHN5bWxpbmsgZm9yIGxpYnBuZy5kbGwuYSA9PiBsaWJwbmcxNC5kbGwuYSBvbiBDeWd3aW4KLSAgICBpZihDWUdXSU4pCi0gICAgICBfcG5nX2dlbmVyYXRlX3N5bWxpbmtfY29kZShQTkdfU0hBUkVEX0lNUExJQl9JTlNUQUxMX0NPREUKLSAgICAgICAgJHtQTkdMSUJfTkFNRX0ke0NNQUtFX0lNUE9SVF9MSUJSQVJZX1NVRkZJWH0KLSAgICAgICAgbGlicG5nJHtDTUFLRV9JTVBPUlRfTElCUkFSWV9TVUZGSVh9KQotICAgICAgaW5zdGFsbChDT0RFICR7UE5HX1NIQVJFRF9JTVBMSUJfSU5TVEFMTF9DT0RFfSkKLSAgICAgIGluc3RhbGwoRklMRVMKLSAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYnBuZyR7Q01BS0VfSU1QT1JUX0xJQlJBUllfU1VGRklYfQotICAgICAgICBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfSkKLSAgICBlbmRpZigpCi0KLSAgICBpZihOT1QgV0lOMzIpCi0gICAgICBJRihDTUFLRV9MSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkpCi0gICAgICAgIF9wbmdfZ2VuZXJhdGVfc3ltbGlua19jb2RlKFBOR19TSEFSRURfSU5TVEFMTF9DT0RFCi0gJHtDTUFLRV9MSUJSQVJZX09VVFBVVF9ESVJFQ1RPUll9LyR7UE5HTElCX05BTUV9JHtDTUFLRV9TSEFSRURfTElCUkFSWV9TVUZGSVh9Ci0gJHtDTUFLRV9MSUJSQVJZX09VVFBVVF9ESVJFQ1RPUll9L2xpYnBuZyR7Q01BS0VfU0hBUkVEX0xJQlJBUllfU1VGRklYfSkKLSAgICAgICAgICAgICAgICBpbnN0YWxsKENPREUgJHtQTkdfU0hBUkVEX0lOU1RBTExfQ09ERX0pCi0gICAgICAgICAgICAgICAgaW5zdGFsbChGSUxFUwotICR7Q01BS0VfTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZfS9saWJwbmcke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWH0KLSAgICAgICAgICAgICAgICBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfSkKLSAgICAgIEVMU0UoQ01BS0VfTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZKQotICAgICAgICBfcG5nX2dlbmVyYXRlX3N5bWxpbmtfY29kZShQTkdfU0hBUkVEX0lOU1RBTExfQ09ERQotICAgICAgICAgICAke1BOR0xJQl9OQU1FfSR7Q01BS0VfU0hBUkVEX0xJQlJBUllfU1VGRklYfQotICAgICAgICAgICBsaWJwbmcke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWH0pCi0gICAgICAgIGluc3RhbGwoQ09ERSAke1BOR19TSEFSRURfSU5TVEFMTF9DT0RFfSkKLSAgICAgICAgaW5zdGFsbChGSUxFUwotICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGlicG5nJHtDTUFLRV9TSEFSRURfTElCUkFSWV9TVUZGSVh9Ci0gICAgICAgICAgICAgICAgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0pCi0gICAgICBFTkRJRihDTUFLRV9MSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkpCi0gICAgZW5kaWYoKQotICBlbmRpZigpCi0KLSAgaWYoUE5HX1NUQVRJQykKLSAgICBpbnN0YWxsKFRBUkdFVFMgJHtQTkdfTElCX05BTUVfU1RBVElDfQotICAgICAgICAke1BOR19FWFBPUlRfUlVMRX0KLSAgICAgICAgICAgIExJQlJBUlkgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0KLSAgICAgICAgICAgIEFSQ0hJVkUgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0pCi0gICAgaWYoTk9UIFdJTjMyIE9SIENZR1dJTikKLSAgICAgIElGKENNQUtFX0FSQ0hJVkVfT1VUUFVUX0RJUkVDVE9SWSkKLSAgICAgICAgIF9wbmdfZ2VuZXJhdGVfc3ltbGlua19jb2RlKFBOR19TVEFUSUNfSU5TVEFMTF9DT0RFCi0ke0NNQUtFX0FSQ0hJVkVfT1VUUFVUX0RJUkVDVE9SWX0vJHtQTkdMSUJfTkFNRX0ke0NNQUtFX1NUQVRJQ19MSUJSQVJZX1NVRkZJWH0KLSAgICAgICAgJHtDTUFLRV9BUkNISVZFX09VVFBVVF9ESVJFQ1RPUll9L2xpYnBuZyR7Q01BS0VfU1RBVElDX0xJQlJBUllfU1VGRklYfSkKLSAgICAgICAgaW5zdGFsbChDT0RFICR7UE5HX1NUQVRJQ19JTlNUQUxMX0NPREV9KQotICAgICAgICBpbnN0YWxsKEZJTEVTCi0gICAgICAgICAgJHtDTUFLRV9BUkNISVZFX09VVFBVVF9ESVJFQ1RPUll9L2xpYnBuZyR7Q01BS0VfU1RBVElDX0xJQlJBUllfU1VGRklYfQotICAgICAgICAgICAgIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9KQotICAgICAgRUxTRShDTUFLRV9BUkNISVZFX09VVFBVVF9ESVJFQ1RPUlkpCi0gICAgICAgIF9wbmdfZ2VuZXJhdGVfc3ltbGlua19jb2RlKFBOR19TVEFUSUNfSU5TVEFMTF9DT0RFCi0gICAgICAgICAgICR7UE5HTElCX05BTUV9JHtDTUFLRV9TVEFUSUNfTElCUkFSWV9TVUZGSVh9Ci0gICAgICAgICAgIGxpYnBuZyR7Q01BS0VfU1RBVElDX0xJQlJBUllfU1VGRklYfSkKLSAgICAgICAgaW5zdGFsbChDT0RFICR7UE5HX1NUQVRJQ19JTlNUQUxMX0NPREV9KQotICAgICAgICBpbnN0YWxsKEZJTEVTCi0gICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYnBuZyR7Q01BS0VfU1RBVElDX0xJQlJBUllfU1VGRklYfQotICAgICAgICAgICAgICAgICAgICAgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0pCi0gICAgICBFTkRJRihDTUFLRV9BUkNISVZFX09VVFBVVF9ESVJFQ1RPUlkpCi0gICAgZW5kaWYoKQotICBlbmRpZigpCi1lbmRpZigpCi0KLWlmKE5PVCBTS0lQX0lOU1RBTExfSEVBREVSUyBBTkQgTk9UIFNLSVBfSU5TVEFMTF9BTEwgKQotICBpbnN0YWxsKEZJTEVTICR7bGlicG5nX3B1YmxpY19oZHJzfSAgIERFU1RJTkFUSU9OIGluY2x1ZGUpCi0gIGluc3RhbGwoRklMRVMgJHtsaWJwbmdfcHVibGljX2hkcnN9ICAgREVTVElOQVRJT04gaW5jbHVkZS8ke1BOR0xJQl9OQU1FfSkKLWVuZGlmKCkKLWlmKE5PVCBTS0lQX0lOU1RBTExfRVhFQ1VUQUJMRVMgQU5EIE5PVCBTS0lQX0lOU1RBTExfQUxMICkKLSAgaW5zdGFsbChQUk9HUkFNUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGlicG5nLWNvbmZpZyBERVNUSU5BVElPTiBiaW4pCi0gIGluc3RhbGwoUFJPR1JBTVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7UE5HTElCX05BTUV9LWNvbmZpZwotICAgICAgICAgIERFU1RJTkFUSU9OIGJpbikKLWVuZGlmKCkKLWlmKE5PVCBTS0lQX0lOU1RBTExfRklMRVMgQU5EIE5PVCBTS0lQX0lOU1RBTExfQUxMICkKLSAgIyBJbnN0YWxsIG1hbiBwYWdlcwotICBpZihOT1QgUE5HX01BTl9ESVIpCi0gICAgc2V0KFBOR19NQU5fRElSICJzaGFyZS9tYW4iKQotICBlbmRpZigpCi0gIGluc3RhbGwoRklMRVMgbGlicG5nLjMgbGlicG5ncGYuMyAgICAgIERFU1RJTkFUSU9OICR7UE5HX01BTl9ESVJ9L21hbjMpCi0gIGluc3RhbGwoRklMRVMgcG5nLjUgICAgICAgICAgICAgICAgICAgIERFU1RJTkFUSU9OICR7UE5HX01BTl9ESVJ9L21hbjUpCi0gICMgSW5zdGFsbCBwa2ctY29uZmlnIGZpbGVzCi0gIGluc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYnBuZy5wYwotICAgICAgICAgIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9L3BrZ2NvbmZpZykKLSAgaW5zdGFsbChQUk9HUkFNUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGlicG5nLWNvbmZpZwotICAgICAgICAgIERFU1RJTkFUSU9OIGJpbikKLSAgaW5zdGFsbChGSUxFUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtQTkdMSUJfTkFNRX0ucGMKLSAgICAgICAgICBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfS9wa2djb25maWcpCi0gIGluc3RhbGwoUFJPR1JBTVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7UE5HTElCX05BTUV9LWNvbmZpZwotICAgICAgICAgIERFU1RJTkFUSU9OIGJpbikKLWVuZGlmKCkKLQotIyBPbiB2ZXJzaW9ucyBvZiBDTWFrZSB0aGF0IHN1cHBvcnQgaXQsIGNyZWF0ZSBhbiBleHBvcnQgZmlsZSBDTWFrZQotIyB1c2VycyBjYW4gaW5jbHVkZSgpIHRvIGltcG9ydCBvdXIgdGFyZ2V0cwotaWYoUE5HX0VYUE9SVF9SVUxFIEFORCBOT1QgU0tJUF9JTlNUQUxMX0VYUE9SVCBBTkQgTk9UIFNLSVBfSU5TVEFMTF9BTEwgKQotICBpbnN0YWxsKEVYUE9SVCBsaWJwbmcgREVTVElOQVRJT04gbGliL2xpYnBuZyBGSUxFIGxpYiR7UE5HX0xJQl9OQU1FfS5jbWFrZSkKLWVuZGlmKCkKLQotIyB3aGF0J3Mgd2l0aCBsaWJwbmctbWFudWFsLnR4dCBhbmQgYWxsIHRoZSBleHRyYSBmaWxlcz8KLQotCi0jIFVOSU5TVEFMTAotIyBkbyB3ZSBuZWVkIHRoaXM/Ci0KLQotIyBESVNUCi0jIGRvIHdlIG5lZWQgdGhpcz8KLQotIyB0byBjcmVhdGUgbXN2YyBpbXBvcnQgbGliIGZvciBtaW5ndyBjb21waWxlZCBzaGFyZWQgbGliCi0jIHBleHBvcnRzIGxpYnBuZy5kbGwgPiBsaWJwbmcuZGVmCi0jIGxpYiAvZGVmOmxpYnBuZy5kZWYgL21hY2hpbmU6eDg2Ci0KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvSU5TVEFMTCBiL3NyYy9saWJwbmcvSU5TVEFMTApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkYzJmNS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL0lOU1RBTEwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotCi1JbnN0YWxsaW5nIGxpYnBuZyB2ZXJzaW9uIDEuNC4xMiAtIEp1bHkgMTAsIDIwMTIKLQotT24gVW5peC9MaW51eCBhbmQgc2ltaWxhciBzeXN0ZW1zLCB5b3UgY2FuIHNpbXBseSB0eXBlCi0KLSAgICAuL2NvbmZpZ3VyZSBbLS1wcmVmaXg9L3BhdGhdCi0gICAgbWFrZSBjaGVjawotICAgIG1ha2UgaW5zdGFsbAotCi1hbmQgaWdub3JlIHRoZSByZXN0IG9mIHRoaXMgZG9jdW1lbnQuCi0KLUlmIGNvbmZpZ3VyZSBkb2VzIG5vdCB3b3JrIG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UgaGF2ZSBhIHJlYXNvbmFibHkKLXVwLXRvLWRhdGUgc2V0IG9mIHRvb2xzLCBydW5uaW5nIC4vYXV0b2dlbi5zaCBiZWZvcmUgcnVubmluZyAuL2NvbmZpZ3VyZQotbWF5IGZpeCB0aGUgcHJvYmxlbS4gIFlvdSBjYW4gYWxzbyBydW4gdGhlIGluZGl2aWR1YWwgY29tbWFuZHMgaW4KLWF1dG9nZW4uc2ggd2l0aCB0aGUgLS1mb3JjZSBvcHRpb24sIGlmIHN1cHBvcnRlZCBieSB5b3VyIHZlcnNpb24gb2YKLXRoZSB0b29scy4gIElmIHlvdSBydW4gJ2xpYnRvb2xpemUgLS1mb3JjZScsIHRob3VnaCwgdGhpcyB3aWxsIHJlcGxhY2UKLXRoZSBkaXN0cmlidXRlZCwgcGF0Y2hlZCwgdmVyc2lvbiBvZiBsdG1haW4uc2ggd2l0aCBhbiB1bnBhdGNoZWQgdmVyc2lvbgotYW5kIHlvdXIgc2hhcmVkIGxpYnJhcnkgYnVpbGRzIG1heSBmYWlsIHRvIHByb2R1Y2UgbGlicmFyaWVzIHdpdGggdGhlCi1jb3JyZWN0IHZlcnNpb24gbnVtYmVycy4KLQotSW5zdGVhZCwgeW91IGNhbiB1c2Ugb25lIG9mIHRoZSBjdXN0b20tYnVpbHQgbWFrZWZpbGVzIGluIHRoZQotInNjcmlwdHMiIGRpcmVjdG9yeQotCi0gICAgY3Agc2NyaXB0cy9tYWtlZmlsZS5zeXN0ZW0gbWFrZWZpbGUKLSAgICBtYWtlIHRlc3QKLSAgICBtYWtlIGluc3RhbGwKLQotVGhlIGZpbGVzIHRoYXQgYXJlIHByZXNlbnRseSBhdmFpbGFibGUgaW4gdGhlIHNjcmlwdHMgZGlyZWN0b3J5Ci1hcmUgbGlzdGVkIGFuZCBkZXNjcmliZWQgaW4gc2NyaXB0cy9SRUFETUUudHh0LgotCi1PciB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlICJwcm9qZWN0cyIgaW4gdGhlICJwcm9qZWN0cyIgZGlyZWN0b3J5LgotCi1CZWZvcmUgaW5zdGFsbGluZyBsaWJwbmcsIHlvdSBtdXN0IGZpcnN0IGluc3RhbGwgemxpYiwgaWYgaXQKLWlzIG5vdCBhbHJlYWR5IG9uIHlvdXIgc3lzdGVtLiAgemxpYiBjYW4gdXN1YWxseSBiZSBmb3VuZAotd2hlcmV2ZXIgeW91IGdvdCBsaWJwbmcuICB6bGliIGNhbiBiZSBwbGFjZWQgaW4gYW5vdGhlciBkaXJlY3RvcnksCi1hdCB0aGUgc2FtZSBsZXZlbCBhcyBsaWJwbmcuCi0KLUlmIHlvdSB3YW50IHRvIHVzZSAiY21ha2UiIChzZWUgd3d3LmNtYWtlLm9yZyksIHR5cGUKLQotICAgY21ha2UgLiAtRENNQUtFX0lOU1RBTExfUFJFRklYPS9wYXRoCi0gICBtYWtlCi0gICBtYWtlIGluc3RhbGwKLQotSWYgeW91ciBzeXN0ZW0gYWxyZWFkeSBoYXMgYSBwcmVpbnN0YWxsZWQgemxpYiB5b3Ugd2lsbCBzdGlsbCBuZWVkCi10byBoYXZlIGFjY2VzcyB0byB0aGUgemxpYi5oIGFuZCB6Y29uZi5oIGluY2x1ZGUgZmlsZXMgdGhhdAotY29ycmVzcG9uZCB0byB0aGUgdmVyc2lvbiBvZiB6bGliIHRoYXQncyBpbnN0YWxsZWQuCi0KLVlvdSBjYW4gcmVuYW1lIHRoZSBkaXJlY3RvcmllcyB0aGF0IHlvdSBkb3dubG9hZGVkICh0aGV5Ci1taWdodCBiZSBjYWxsZWQgImxpYnBuZy0xLjQuMTIiIG9yICJsaWJwbmcxNCIgYW5kICJ6bGliLTEuMi4zIgotb3IgInpsaWIxMjMiKSBzbyB0aGF0IHlvdSBoYXZlIGRpcmVjdG9yaWVzIGNhbGxlZCAiemxpYiIgYW5kICJsaWJwbmciLgotCi1Zb3VyIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgotCi0gICAuLiAgICAgICAodGhlIHBhcmVudCBkaXJlY3RvcnkpCi0gICAgICBsaWJwbmcgICh0aGlzIGRpcmVjdG9yeSkKLSAgICAgICAgICBJTlNUQUxMICh0aGlzIGZpbGUpCi0gICAgICAgICAgUkVBRE1FCi0gICAgICAgICAgKi5oCi0gICAgICAgICAgKi5jCi0gICAgICAgICAgQ01ha2VMaXN0cy50eHQgICAgPT4gICJjbWFrZSIgc2NyaXB0Ci0gICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlczoKLSAgICAgICAgICAgICBjb25maWd1cmUuYWMsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuYW0sIE1ha2VmaWxlLmluLAotICAgICAgICAgICAgIGF1dG9nZW4uc2gsIGNvbmZpZy5ndWVzcywgbHRtYWluLnNoLCBtaXNzaW5nLAotICAgICAgICAgICAgIGFjbG9jYWwubTQsIGNvbmZpZy5oLmluLCBjb25maWcuc3ViLAotICAgICAgICAgICAgIGRlcGNvbXAsIGluc3RhbGwtc2gsIHRlc3QtcG5ndGVzdC5zaAotICAgICAgICAgIGNvbnRyaWIKLSAgICAgICAgICAgICBncmVnYm9vawotICAgICAgICAgICAgIHBuZ21pbmltCi0gICAgICAgICAgICAgcG5nbWludXMKLSAgICAgICAgICAgICBwbmdzdWl0ZQotICAgICAgICAgICAgIHZpc3VwbmcKLSAgICAgICAgICBwcm9qZWN0cwotICAgICAgICAgICAgIGNidWlsZGVyNSAoQm9ybGFuZCkKLSAgICAgICAgICAgICB2aXN1YWxjNiAobXN2YykKLSAgICAgICAgICAgICB2aXN1YWxjNzEKLSAgICAgICAgICAgICB2c3R1ZGlvCi0gICAgICAgICAgICAgeGNvZGUKLSAgICAgICAgICBzY3JpcHRzCi0gICAgICAgICAgICAgbWFrZWZpbGUuKgotICAgICAgICAgICAgICouZGVmIChtb2R1bGUgZGVmaW5pdGlvbiBmaWxlcykKLSAgICAgICAgICBwbmd0ZXN0LnBuZwotICAgICAgICAgIGV0Yy4KLSAgICAgIHpsaWIKLSAgICAgICAgICBSRUFETUUKLSAgICAgICAgICAqLmgKLSAgICAgICAgICAqLmMKLSAgICAgICAgICBjb250cmliCi0gICAgICAgICAgZXRjLgotCi1JZiB0aGUgbGluZSBlbmRpbmdzIGluIHRoZSBmaWxlcyBsb29rIGZ1bm55LCB5b3UgbWF5IHdpc2ggdG8gZ2V0IHRoZSBvdGhlcgotZGlzdHJpYnV0aW9uIG9mIGxpYnBuZy4gIEl0IGlzIGF2YWlsYWJsZSBpbiBib3RoIHRhci5neiAoVU5JWCBzdHlsZSBsaW5lCi1lbmRpbmdzKSBhbmQgemlwIChET1Mgc3R5bGUgbGluZSBlbmRpbmdzKSBmb3JtYXRzLgotCi1JZiB5b3UgYXJlIGJ1aWxkaW5nIGxpYnBuZyB3aXRoIE1TVkMsIHlvdSBjYW4gZW50ZXIgdGhlCi1saWJwbmcgcHJvamVjdHNcdmlzdWFsYzYgb3IgdmlzdWFsYzcxIGRpcmVjdG9yeSBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMKLWluIFJFQURNRS50eHQuCi0KLU90aGVyd2lzZSBlbnRlciB0aGUgemxpYiBkaXJlY3RvcnkgYW5kIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHpsaWIvUkVBRE1FLAotdGhlbiBjb21lIGJhY2sgaGVyZSBhbmQgcnVuICJjb25maWd1cmUiIG9yIGNob29zZSB0aGUgYXBwcm9wcmlhdGUKLW1ha2VmaWxlLnN5cyBpbiB0aGUgc2NyaXB0cyBkaXJlY3RvcnkuCi0KLUNvcHkgdGhlIGZpbGUgKG9yIGZpbGVzKSB0aGF0IHlvdSBuZWVkIGZyb20gdGhlCi1zY3JpcHRzIGRpcmVjdG9yeSBpbnRvIHRoaXMgZGlyZWN0b3J5LCBmb3IgZXhhbXBsZQotCi0gICBNU0RPUyBleGFtcGxlOiBjb3B5IHNjcmlwdHNcbWFrZWZpbGUubXNjIG1ha2VmaWxlCi0gICBVTklYIGV4YW1wbGU6ICAgIGNwIHNjcmlwdHMvbWFrZWZpbGUuc3RkIG1ha2VmaWxlCi0KLVJlYWQgdGhlIG1ha2VmaWxlIHRvIHNlZSBpZiB5b3UgbmVlZCB0byBjaGFuZ2UgYW55IHNvdXJjZSBvcgotdGFyZ2V0IGRpcmVjdG9yaWVzIHRvIG1hdGNoIHlvdXIgcHJlZmVyZW5jZXMuCi0KLVRoZW4gcmVhZCBwbmdjb25mLmggdG8gc2VlIGlmIHlvdSB3YW50IHRvIG1ha2UgYW55IGNvbmZpZ3VyYXRpb24KLWNoYW5nZXMuCi0KLVRoZW4ganVzdCBydW4gIm1ha2UiIHdoaWNoIHdpbGwgY3JlYXRlIHRoZSBsaWJwbmcgbGlicmFyeSBpbgotdGhpcyBkaXJlY3RvcnkgYW5kICJtYWtlIHRlc3QiIHdoaWNoIHdpbGwgcnVuIGEgcXVpY2sgdGVzdCB0aGF0IHJlYWRzCi10aGUgInBuZ3Rlc3QucG5nIiBmaWxlIGFuZCB3cml0ZXMgYSAicG5nb3V0LnBuZyIgZmlsZSB0aGF0IHNob3VsZCBiZQotaWRlbnRpY2FsIHRvIGl0LiAgTG9vayBmb3IgIjk3ODIgemVybyBzYW1wbGVzIiBpbiB0aGUgb3V0cHV0IG9mIHRoZQotdGVzdC4gIEZvciBtb3JlIGNvbmZpZGVuY2UsIHlvdSBjYW4gcnVuIGFub3RoZXIgdGVzdCBieSB0eXBpbmcKLSJwbmd0ZXN0IHBuZ25vdy5wbmciIGFuZCBsb29raW5nIGZvciAiMjg5IHplcm8gc2FtcGxlcyIgaW4gdGhlIG91dHB1dC4KLUFsc28sIHlvdSBjYW4gcnVuICJwbmd0ZXN0IC1tIGNvbnRyaWIvcG5nc3VpdGUvKi5wbmciIGFuZCBjb21wYXJlCi15b3VyIG91dHB1dCB3aXRoIHRoZSByZXN1bHQgc2hvd24gaW4gY29udHJpYi9wbmdzdWl0ZS9SRUFETUUuCi0KLU1vc3Qgb2YgdGhlIG1ha2VmaWxlcyB3aWxsIGFsbG93IHlvdSB0byBydW4gIm1ha2UgaW5zdGFsbCIgdG8KLXB1dCB0aGUgbGlicmFyeSBpbiBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoaWYgeW91IHdhbnQgdG8KLWRvIHRoYXQsIHJ1biAibWFrZSBpbnN0YWxsIiBpbiB0aGUgemxpYiBkaXJlY3RvcnkgZmlyc3QgaWYgbmVjZXNzYXJ5KS4KLVNvbWUgYWxzbyBhbGxvdyB5b3UgdG8gcnVuICJtYWtlIHRlc3QtaW5zdGFsbGVkIiBhZnRlciB5b3UgaGF2ZQotcnVuICJtYWtlIGluc3RhbGwiLgotCi1JZiB5b3UgZW5jb3VudGVyIGEgY29tcGlsZXIgZXJyb3IgbWVzc2FnZSBjb21wbGFpbmluZyBhYm91dCB0aGUKLWxpbmVzCi0KLSAgICAgIF9fcG5nLmhfXyBhbHJlYWR5IGluY2x1ZGVzIHNldGptcC5oOwotICAgICAgX19kb250X18gaW5jbHVkZSBpdCBhZ2Fpbi47Ci0KLXRoaXMgbWVhbnMgeW91IGhhdmUgY29tcGlsZWQgYW5vdGhlciBtb2R1bGUgdGhhdCBpbmNsdWRlcyBzZXRqbXAuaCwKLXdoaWNoIGlzIGhhemFyZG91cyBiZWNhdXNlIHRoZSB0d28gbW9kdWxlcyBtaWdodCBub3QgaW5jbHVkZSBleGFjdGx5Ci10aGUgc2FtZSBzZXRqbXAuaC4gIElmIHlvdSBhcmUgc3VyZSB0aGF0IHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZwotYW5kIHRoYXQgdGhleSBhcmUgZXhhY3RseSB0aGUgc2FtZSwgdGhlbiB5b3UgY2FuIGNvbW1lbnQgb3V0IG9yCi1kZWxldGUgdGhlIHR3byBsaW5lcy4gIEJldHRlciB5ZXQsIHVzZSB0aGUgY2V4Y2VwdCBpbnRlcmZhY2UKLWluc3RlYWQsIGFzIGRlbW9uc3RyYXRlZCBpbiBjb250cmliL3Zpc3Vwbmcgb2YgdGhlIGxpYnBuZyBkaXN0cmlidXRpb24uCi0KLUZ1cnRoZXIgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSBSRUFETUUgYW5kIGxpYnBuZy50eHQKLWZpbGVzLCBpbiB0aGUgaW5kaXZpZHVhbCBtYWtlZmlsZXMsIGluIHBuZy5oLCBhbmQgdGhlIG1hbnVhbCBwYWdlcwotbGlicG5nLjMgYW5kIHBuZy41LgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9MSUNFTlNFIGIvc3JjL2xpYnBuZy9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWI5MmE0Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0KLVRoaXMgY29weSBvZiB0aGUgbGlicG5nIG5vdGljZXMgaXMgcHJvdmlkZWQgZm9yIHlvdXIgY29udmVuaWVuY2UuICBJbiBjYXNlIG9mCi1hbnkgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGlzIGNvcHkgYW5kIHRoZSBub3RpY2VzIGluIHRoZSBmaWxlIHBuZy5oIHRoYXQgaXMKLWluY2x1ZGVkIGluIHRoZSBsaWJwbmcgZGlzdHJpYnV0aW9uLCB0aGUgbGF0dGVyIHNoYWxsIHByZXZhaWwuCi0KLUNPUFlSSUdIVCBOT1RJQ0UsIERJU0NMQUlNRVIsIGFuZCBMSUNFTlNFOgotCi1JZiB5b3UgbW9kaWZ5IGxpYnBuZyB5b3UgbWF5IGluc2VydCBhZGRpdGlvbmFsIG5vdGljZXMgaW1tZWRpYXRlbHkgZm9sbG93aW5nCi10aGlzIHNlbnRlbmNlLgotCi1UaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotCi1saWJwbmcgdmVyc2lvbnMgMS4yLjYsIEF1Z3VzdCAxNSwgMjAwNCwgdGhyb3VnaCAxLjQuMTIsIEp1bHkgMTAsIDIwMTIsIGFyZQotQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2LTIwMTAgR2xlbm4gUmFuZGVycy1QZWhyc29uLCBhbmQgYXJlCi1kaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgZGlzY2xhaW1lciBhbmQgbGljZW5zZSBhcyBsaWJwbmctMS4yLjUKLXdpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFsIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzCi0KLSAgIENvc21pbiBUcnV0YQotCi1saWJwbmcgdmVyc2lvbnMgMS4wLjcsIEp1bHkgMSwgMjAwMCwgdGhyb3VnaCAxLjIuNSAtIE9jdG9iZXIgMywgMjAwMiwgYXJlCi1Db3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFuZCBhcmUKLWRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0xLjAuNgotd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzCi0KLSAgIFNpbW9uLVBpZXJyZSBDYWRpZXV4Ci0gICBFcmljIFMuIFJheW1vbmQKLSAgIEdpbGxlcyBWb2xsYW50Ci0KLWFuZCB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25zIHRvIHRoZSBkaXNjbGFpbWVyOgotCi0gICBUaGVyZSBpcyBubyB3YXJyYW50eSBhZ2FpbnN0IGludGVyZmVyZW5jZSB3aXRoIHlvdXIgZW5qb3ltZW50IG9mIHRoZQotICAgbGlicmFyeSBvciBhZ2FpbnN0IGluZnJpbmdlbWVudC4gIFRoZXJlIGlzIG5vIHdhcnJhbnR5IHRoYXQgb3VyCi0gICBlZmZvcnRzIG9yIHRoZSBsaWJyYXJ5IHdpbGwgZnVsZmlsbCBhbnkgb2YgeW91ciBwYXJ0aWN1bGFyIHB1cnBvc2VzCi0gICBvciBuZWVkcy4gIFRoaXMgbGlicmFyeSBpcyBwcm92aWRlZCB3aXRoIGFsbCBmYXVsdHMsIGFuZCB0aGUgZW50aXJlCi0gICByaXNrIG9mIHNhdGlzZmFjdG9yeSBxdWFsaXR5LCBwZXJmb3JtYW5jZSwgYWNjdXJhY3ksIGFuZCBlZmZvcnQgaXMgd2l0aAotICAgdGhlIHVzZXIuCi0KLWxpYnBuZyB2ZXJzaW9ucyAwLjk3LCBKYW51YXJ5IDE5OTgsIHRocm91Z2ggMS4wLjYsIE1hcmNoIDIwLCAyMDAwLCBhcmUKLUNvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFuZCBhcmUKLWRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0wLjk2LAotd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgotCi0gICBUb20gTGFuZQotICAgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gICBXaWxsZW0gdmFuIFNjaGFpawotCi1saWJwbmcgdmVyc2lvbnMgMC44OSwgSnVuZSAxOTk2LCB0aHJvdWdoIDAuOTYsIE1heSAxOTk3LCBhcmUKLUNvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgotRGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTAuODgsCi13aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6Ci0KLSAgIEpvaG4gQm93bGVyCi0gICBLZXZpbiBCcmFjZXkKLSAgIFNhbSBCdXNoZWxsCi0gICBNYWdudXMgSG9sbWdyZW4KLSAgIEdyZWcgUm9lbG9mcwotICAgVG9tIFRhbm5lcgotCi1saWJwbmcgdmVyc2lvbnMgMC41LCBNYXkgMTk5NSwgdGhyb3VnaCAwLjg4LCBKYW51YXJ5IDE5OTYsIGFyZQotQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotCi1Gb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgY29weXJpZ2h0IGFuZCBsaWNlbnNlLCAiQ29udHJpYnV0aW5nIEF1dGhvcnMiCi1pcyBkZWZpbmVkIGFzIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGluZGl2aWR1YWxzOgotCi0gICBBbmRyZWFzIERpbGdlcgotICAgRGF2ZSBNYXJ0aW5kYWxlCi0gICBHdXkgRXJpYyBTY2hhbG5hdAotICAgUGF1bCBTY2htaWR0Ci0gICBUaW0gV2VnbmVyCi0KLVRoZSBQTkcgUmVmZXJlbmNlIExpYnJhcnkgaXMgc3VwcGxpZWQgIkFTIElTIi4gIFRoZSBDb250cmlidXRpbmcgQXV0aG9ycwotYW5kIEdyb3VwIDQyLCBJbmMuIGRpc2NsYWltIGFsbCB3YXJyYW50aWVzLCBleHByZXNzZWQgb3IgaW1wbGllZCwKLWluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGUgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIG9mCi1maXRuZXNzIGZvciBhbnkgcHVycG9zZS4gIFRoZSBDb250cmlidXRpbmcgQXV0aG9ycyBhbmQgR3JvdXAgNDIsIEluYy4KLWFzc3VtZSBubyBsaWFiaWxpdHkgZm9yIGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKLW9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgd2hpY2ggbWF5IHJlc3VsdCBmcm9tIHRoZSB1c2Ugb2YgdGhlIFBORwotUmVmZXJlbmNlIExpYnJhcnksIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKLXNvdXJjZSBjb2RlLCBvciBwb3J0aW9ucyBoZXJlb2YsIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBmZWUsIHN1YmplY3QKLXRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0xLiBUaGUgb3JpZ2luIG9mIHRoaXMgc291cmNlIGNvZGUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQuCi0KLTIuIEFsdGVyZWQgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoIGFuZCBtdXN0IG5vdAotICAgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvdXJjZS4KLQotMy4gVGhpcyBDb3B5cmlnaHQgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55Ci0gICBzb3VyY2Ugb3IgYWx0ZXJlZCBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi1UaGUgQ29udHJpYnV0aW5nIEF1dGhvcnMgYW5kIEdyb3VwIDQyLCBJbmMuIHNwZWNpZmljYWxseSBwZXJtaXQsIHdpdGhvdXQKLWZlZSwgYW5kIGVuY291cmFnZSB0aGUgdXNlIG9mIHRoaXMgc291cmNlIGNvZGUgYXMgYSBjb21wb25lbnQgdG8KLXN1cHBvcnRpbmcgdGhlIFBORyBmaWxlIGZvcm1hdCBpbiBjb21tZXJjaWFsIHByb2R1Y3RzLiAgSWYgeW91IHVzZSB0aGlzCi1zb3VyY2UgY29kZSBpbiBhIHByb2R1Y3QsIGFja25vd2xlZGdtZW50IGlzIG5vdCByZXF1aXJlZCBidXQgd291bGQgYmUKLWFwcHJlY2lhdGVkLgotCi0KLUEgInBuZ19nZXRfY29weXJpZ2h0IiBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIGZvciBjb252ZW5pZW50IHVzZSBpbiAiYWJvdXQiCi1ib3hlcyBhbmQgdGhlIGxpa2U6Ci0KLSAgIHByaW50ZigiJXMiLHBuZ19nZXRfY29weXJpZ2h0KE5VTEwpKTsKLQotQWxzbywgdGhlIFBORyBsb2dvIChpbiBQTkcgZm9ybWF0LCBvZiBjb3Vyc2UpIGlzIHN1cHBsaWVkIGluIHRoZQotZmlsZXMgInBuZ2Jhci5wbmciIGFuZCAicG5nYmFyLmpwZyAoODh4MzEpIGFuZCAicG5nbm93LnBuZyIgKDk4eDMxKS4KLQotTGlicG5nIGlzIE9TSSBDZXJ0aWZpZWQgT3BlbiBTb3VyY2UgU29mdHdhcmUuICBPU0kgQ2VydGlmaWVkIE9wZW4gU291cmNlIGlzIGEKLWNlcnRpZmljYXRpb24gbWFyayBvZiB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KLQotR2xlbm4gUmFuZGVycy1QZWhyc29uCi1nbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldAotSnVseSAxMCwgMjAxMgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9NYWtlZmlsZS5hbSBiL3NyYy9saWJwbmcvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMGY5ZTIuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0jIE1ha2VmaWxlLmFtOgotIyAgIFNvdXJjZSBmaWxlIGZvciBNYWtlZmlsZS5pbiAoYW5kIGhlbmNlIE1ha2VmaWxlKQotIwotCi1QTkdMSUJfQkFTRU5BTUU9IGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAKLQotIyBsaWJwbmcgZG9lcyBub3QgZm9sbG93IEdOVSBmaWxlIG5hbWUgY29udmVudGlvbnMKLUFVVE9NQUtFX09QVElPTlMgPSBmb3JlaWduCi0KLSMgdGVzdCBwcm9ncmFtcyAtIHJ1biBvbiBtYWtlIGNoZWNrLCBtYWtlIGRpc3RjaGVjawotY2hlY2tfUFJPR1JBTVM9IHBuZ3Rlc3QKLXBuZ3Rlc3RfU09VUkNFUyA9IHBuZ3Rlc3QuYwotcG5ndGVzdF9MREFERCA9IGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAubGEKLVRFU1RTID0gdGVzdC1wbmd0ZXN0LnNoCi1URVNUU19FTlZJUk9OTUVOVD0gc3JjZGlyPSQoc3JjZGlyKQotCi0jIG1hbiBwYWdlcwotZGlzdF9tYW5fTUFOUz0gbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCi0jIGdlbmVyYXRlIHRoZSAtY29uZmlnIHNjcmlwdHMgaWYgcmVxdWlyZWQKLWJpbmNvbmZpZ3M9IGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAtY29uZmlnCi1FWFRSQV9TQ1JJUFRTPSBsaWJwbmctY29uZmlnIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAtY29uZmlnCi1iaW5fU0NSSVBUUz0gQGJpbmNvbmZpZ3NACi0KLSMgcnVsZXMgdG8gYnVpbGQgbGlicG5nLCBvbmx5IGJ1aWxkIHRoZSBvbGQgbGlicmFyeSBvbiByZXF1ZXN0Ci1saWJfTFRMSUJSQVJJRVM9bGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQC5sYQotIyBFWFRSQV9MVExJQlJBUklFUz0gbGlicG5nLmxhCi1saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX1NPVVJDRVMgPSBwbmcuYyBwbmdzZXQuYyBwbmdnZXQuYyBwbmdydXRpbC5jIFwKLQlwbmd0cmFucy5jIHBuZ3d1dGlsLmMgXAotCXBuZ3JlYWQuYyBwbmdyaW8uYyBwbmd3aW8uYyBwbmd3cml0ZS5jIHBuZ3J0cmFuLmMgXAotCXBuZ3d0cmFuLmMgcG5nbWVtLmMgcG5nZXJyb3IuYyBwbmdwcmVhZC5jIFwKLQlwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0KLWxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfQ1BQRkxBR1MgPSBATElCUE5HX0RFRklORVNACi0KLWxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfTERGTEFHUyA9IC1uby11bmRlZmluZWQgLWV4cG9ydC1keW5hbWljIFwKLQktdmVyc2lvbi1udW1iZXIgQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQDpAUE5HTElCX1JFTEVBU0VAOjAKLQotaWYgSEFWRV9MRF9WRVJTSU9OX1NDUklQVAotICAjIFZlcnNpb25lZCBzeW1ib2xzIGFuZCByZXN0cmljdGVkIGV4cG9ydHMKLQotaWYgSEFWRV9TT0xBUklTX0xECi0gIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfTERGTEFHUyArPSAtV2wsLU0gLVdsLGxpYnBuZy52ZXJzCi1lbHNlCi0gIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfTERGTEFHUyArPSAtV2wsLS12ZXJzaW9uLXNjcmlwdD1saWJwbmcudmVycwotZW5kaWYKLQotICBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0RFUEVOREVOQ0lFUyA9IGxpYnBuZy52ZXJzCi1lbHNlCi0gICMgT25seSByZXN0cmljdGVkIGV4cG9ydHMgd2hlbiBwb3NzaWJsZQotICBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0xERkxBR1MgKz0gLWV4cG9ydC1zeW1ib2xzIGxpYnBuZy5zeW0KLSAgbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9ERVBFTkRFTkNJRVMgPSBsaWJwbmcuc3ltCi1lbmRpZgotCi0jIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCi1BTiA9ICdfYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODknCi0KLSNkaXN0cmlidXRlIGhlYWRlcnMgaW4gL3Vzci9pbmNsdWRlL2xpYnBuZy8qCi1wa2dpbmNsdWRlZGlyPSAkKGluY2x1ZGVkaXIpLyQoUE5HTElCX0JBU0VOQU1FKQotcGtnaW5jbHVkZV9IRUFERVJTPSBwbmcuaCBwbmdjb25mLmgKLQotIyBwa2ctY29uZmlnIHN0dWZmLCBub3RlIHRoYXQgbGlicG5nLnBjIGlzIGFsd2F5cyByZXF1aXJlZCBpbiBvcmRlcgotIyB0byBnZXQgdGhlIGNvcnJlY3QgbGlicmFyeQotcGtnY29uZmlnZGlyID0gQHBrZ2NvbmZpZ2RpckAKLXBrZ2NvbmZpZ19EQVRBID0gbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQC5wYwotCi0jZXh0cmEgc291cmNlIGRpc3RyaWJ1dGlvbiBmaWxlcy4KLUVYVFJBX0RJU1Q9IFwKLQlBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgTElDRU5TRSBSRUFETUUgVE9ETyBcCi0JcG5ndGVzdC5wbmcgcG5nYmFyLnBuZyBwbmdub3cucG5nIHBuZ2Jhci5qcGcgYXV0b2dlbi5zaCBcCi0JJHtzcmNkaXJ9L3Byb2plY3RzL3Zpc3VhbGM2LyogXAotCSR7c3JjZGlyfS9wcm9qZWN0cy92aXN1YWxjNzEvKiBcCi0JJHtzcmNkaXJ9L3Byb2plY3RzL3ZzdHVkaW8vKiBcCi0JJHtzcmNkaXJ9L3Byb2plY3RzL3hjb2RlLyogXAotCSR7c3JjZGlyfS9zY3JpcHRzLyogXAotCSR7c3JjZGlyfS9jb250cmliL2dyZWdib29rLyogXAotCSR7c3JjZGlyfS9jb250cmliL3BuZ21pbmltLyogXAotCSR7c3JjZGlyfS9jb250cmliL3BuZ21pbnVzLyogXAotCSR7c3JjZGlyfS9jb250cmliL3BuZ3N1aXRlLyogXAotCSR7c3JjZGlyfS9jb250cmliL3Zpc3VwbmcvKiBcCi0JJChURVNUUykgXAotCWV4YW1wbGUuYyBsaWJwbmctMS40LjEyLnR4dAotCi1DTEVBTkZJTEVTPSBwbmdvdXQucG5nIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAucGMgbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQC1jb25maWcgbGlicG5nLnZlcnMgXAotbGlicG5nLnN5bQotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluIGFjbG9jYWwubTQgY29uZmlnLmd1ZXNzIGNvbmZpZy5oLmluIFwKLWNvbmZpZy5zdWIgY29uZmlndXJlIGRlcGNvbXAgaW5zdGFsbC1zaCBsdG1haW4uc2ggbWlzc2luZwotCi0kKFBOR0xJQl9CQVNFTkFNRSkucGM6IGxpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkQAotCi0kKFBOR0xJQl9CQVNFTkFNRSktY29uZmlnOiBsaWJwbmctY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkQAotCi1saWJwbmcuc3ltOiBwbmcuaCBwbmdjb25mLmgKLQlybSAtZiAkQCAkQC5uZXcKLQkkKENQUCkgQExJQlBOR19ERUZJTkVTQCAkKENQUEZMQUdTKSAtRFBOR19CVUlMRFNZTVMgJChzcmNkaXIpL3BuZy5oIHwgXAotCQkkKFNFRCkgLW4gLWUgXAotCQknc3xeLipQTkdfRlVOQ1RJT05fRVhQT1JUWyAJXSpcKFskKEFOKV0qXCkuKiQkfCQoU1lNQk9MX1BSRUZJWClcMXxwJyBcCi0JCS1lICdzfF4uKlBOR19EQVRBX0VYUE9SVFsgCV0qXChbJChBTildKlwpLiokJHwkKFNZTUJPTF9QUkVGSVgpXDF8cCcgXAotCQkJPiRALm5ldwotCW12ICRALm5ldyAkQAotCi1saWJwbmcudmVyczogbGlicG5nLnN5bQotCXJtIC1mICRAICRALm5ldwotCWVjaG8gUE5HQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF8wICd7Z2xvYmFsOicgPiAkQC5uZXcKLQkkKFNFRCkgcy8kJC9cOy8gbGlicG5nLnN5bSA+PiAkQC5uZXcKLQllY2hvICdsb2NhbDogKjsgfTsnID4+ICRALm5ldwotCW12ICRALm5ldyAkQAotCi10ZXN0OiBjaGVjawotCi0jIGluc3RhbGwgdGhlIC4uLi9pbmNsdWRlIGhlYWRlcnMgYXMgbGlua3MgdG8gdGhlIG5ldyBvbmVzCi1pbnN0YWxsLWRhdGEtaG9vazoKLQljZCAkKERFU1RESVIpJChpbmNsdWRlZGlyKTsgcm0gLWYgcG5nLmggcG5nY29uZi5oCi0JY2QgJChERVNURElSKSQoaW5jbHVkZWRpcik7ICQoTE5fUykgJChQTkdMSUJfQkFTRU5BTUUpL3BuZy5oIHBuZy5oCi0JY2QgJChERVNURElSKSQoaW5jbHVkZWRpcik7ICQoTE5fUykgJChQTkdMSUJfQkFTRU5BTUUpL3BuZ2NvbmYuaCBcCi0JCXBuZ2NvbmYuaAotCWNkICQoREVTVERJUikkKHBrZ2NvbmZpZ2Rpcik7IHJtIC1mIGxpYnBuZy5wYwotCWNkICQoREVTVERJUikkKHBrZ2NvbmZpZ2Rpcik7ICQoTE5fUykgJChQTkdMSUJfQkFTRU5BTUUpLnBjIGxpYnBuZy5wYwotCi0jIGRvIGV2aWwgdGhpbmdzIHRvIGxpYnBuZyB0byBjYXVzZSBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAIHRvIGJlIHVzZWQKLWluc3RhbGwtZXhlYy1ob29rOgotCWNkICQoREVTVERJUikkKGJpbmRpcik7IHJtIC1mIGxpYnBuZy1jb25maWcKLQljZCAkKERFU1RESVIpJChiaW5kaXIpOyAkKExOX1MpICQoUE5HTElCX0JBU0VOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZwotCUBzZXQgLXg7XAotCWNkICQoREVTVERJUikkKGxpYmRpcik7XAotCWZvciBleHQgaW4gYSBsYSBzbyBzby5AUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JALkBQTkdMSUJfUkVMRUFTRUAgc2wgZHlsaWIgZGxsLmE7IGRvXAotCQlybSAtZiBsaWJwbmcuJCRleHQ7XAotICAgICAgICAgICAgICAgIGlmIHRlc3QgLWYgJChQTkdMSUJfQkFTRU5BTUUpLiQkZXh0OyB0aGVuXAotICAgICAgICAgICAgICAgICAgICAgICAkKExOX1MpICQoUE5HTElCX0JBU0VOQU1FKS4kJGV4dCBsaWJwbmcuJCRleHQ7XAotICAgICAgICAgICAgICAgIGZpO1wKLQlkb25lCi0KLXVuaW5zdGFsbC1ob29rOgotCWNkICQoREVTVERJUikkKGluY2x1ZGVkaXIpOyBybSAtZiBwbmcuaCBwbmdjb25mLmgKLQlybSAtZiAkKERFU1RESVIpJChwa2djb25maWdkaXIpL2xpYnBuZy5wYwotCXJtIC1mICQoREVTVERJUikkKGJpbmRpcikvbGlicG5nLWNvbmZpZwpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9NYWtlZmlsZS5pbiBiL3NyYy9saWJwbmcvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTg4MzEuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEyNjIgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS4xIGZyb20gTWFrZWZpbGUuYW0uCi0jIEBjb25maWd1cmVfaW5wdXRACi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAotIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0jIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLUBTRVRfTUFLRUAKLQotIyBNYWtlZmlsZS5hbToKLSMgICBTb3VyY2UgZmlsZSBmb3IgTWFrZWZpbGUuaW4gKGFuZCBoZW5jZSBNYWtlZmlsZSkKLSMKLQotCi0KLQotVlBBVEggPSBAc3JjZGlyQAotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLWNoZWNrX1BST0dSQU1TID0gcG5ndGVzdCQoRVhFRVhUKQotQEhBVkVfTERfVkVSU0lPTl9TQ1JJUFRfVFJVRUBhbV9fYXBwZW5kXzEgPSAtV2wsLS12ZXJzaW9uLXNjcmlwdD1saWJwbmcudmVycwotQEhBVkVfTERfVkVSU0lPTl9TQ1JJUFRfRkFMU0VAYW1fX2FwcGVuZF8yID0gLWV4cG9ydC1zeW1ib2xzIGxpYnBuZy5zeW0KLXN1YmRpciA9IC4KLURJU1RfQ09NTU9OID0gUkVBRE1FICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAkKGRpc3RfbWFuX01BTlMpIFwKLQkkKHBrZ2luY2x1ZGVfSEVBREVSUykgJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKLQkkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChzcmNkaXIpL2NvbmZpZy5oLmluIFwKLQkkKHNyY2RpcikvbGlicG5nLWNvbmZpZy5pbiAkKHNyY2RpcikvbGlicG5nLnBjLmluIFwKLQkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSBJTlNUQUxMIFRPRE8gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgXAotCWRlcGNvbXAgaW5zdGFsbC1zaCBsdG1haW4uc2ggbWlzc2luZwotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCi1hbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAotCSQoQUNMT0NBTF9NNCkKLWFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTID0gY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBcCi0gY29uZmlndXJlLmxpbmVubyBjb25maWcuc3RhdHVzLmxpbmVubwotbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLUNPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9Ci1hbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKLWFtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCi0gICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKLSAgICAqKSBmPSQkcDs7IFwKLSAgZXNhYzsKLWFtX19zdHJpcF9kaXIgPSBmPWBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKLWFtX19pbnN0YWxsX21heCA9IDQwCi1hbV9fbm9iYXNlX3N0cmlwX3NldHVwID0gXAotICBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqfF0vXFxcXCYvZydgCi1hbV9fbm9iYXNlX3N0cmlwID0gXAotICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgLWUgInN8JCRzcmNkaXJzdHJpcC98fCIKLWFtX19ub2Jhc2VfbGlzdCA9ICQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IFwKLSAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKLSAgc2VkICJzfCAkJHNyY2RpcnN0cmlwL3wgfDsiJyAvIC4qXC8vIXMvIC4qLyAuLzsgcyxcKCAuKlwpL1teL10qJCQsXDEsJyB8IFwKLSAgJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIiB9IHsgZmlsZXNbJCQyXSA9IGZpbGVzWyQkMl0gIiAiICQkMTsgXAotICAgIGlmICgrK25bJCQyXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIFwKLSAgICAgIHsgcHJpbnQgJCQyLCBmaWxlc1skJDJdOyBuWyQkMl0gPSAwOyBmaWxlc1skJDJdID0gIiIgfSB9IFwKLSAgICBFTkQgeyBmb3IgKGRpciBpbiBmaWxlcykgcHJpbnQgZGlyLCBmaWxlc1tkaXJdIH0nCi1hbV9fYmFzZV9saXN0ID0gXAotICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnIHwgXAotICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCi1hbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQobGliZGlyKSIgIiQoREVTVERJUikkKGJpbmRpcikiIFwKLQkiJChERVNURElSKSQobWFuM2RpcikiICIkKERFU1RESVIpJChtYW41ZGlyKSIgXAotCSIkKERFU1RESVIpJChwa2djb25maWdkaXIpIiAiJChERVNURElSKSQocGtnaW5jbHVkZWRpcikiCi1MVExJQlJBUklFUyA9ICQobGliX0xUTElCUkFSSUVTKQotbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9MSUJBREQgPQotYW1fbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9PQkpFQ1RTID0gIFwKLQlsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZy5sbyBcCi0JbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdzZXQubG8gXAotCWxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nZ2V0LmxvIFwKLQlsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3J1dGlsLmxvIFwKLQlsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3RyYW5zLmxvIFwKLQlsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3d1dGlsLmxvIFwKLQlsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3JlYWQubG8gXAotCWxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncmlvLmxvIFwKLQlsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3dpby5sbyBcCi0JbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmd3cml0ZS5sbyBcCi0JbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdydHJhbi5sbyBcCi0JbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmd3dHJhbi5sbyBcCi0JbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdtZW0ubG8gXAotCWxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nZXJyb3IubG8gXAotCWxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncHJlYWQubG8KLWxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfT0JKRUNUUyA9ICBcCi0JJChhbV9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX09CSkVDVFMpCi1saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDIFwKLQkkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgXAotCSQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAotCSQobGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9MREZMQUdTKSAkKExERkxBR1MpIC1vIFwKLQkkQAotYW1fcG5ndGVzdF9PQkpFQ1RTID0gcG5ndGVzdC4kKE9CSkVYVCkKLXBuZ3Rlc3RfT0JKRUNUUyA9ICQoYW1fcG5ndGVzdF9PQkpFQ1RTKQotcG5ndGVzdF9ERVBFTkRFTkNJRVMgPSBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JALmxhCi1TQ1JJUFRTID0gJChiaW5fU0NSSVBUUykKLURFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNACi1kZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCi1hbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcwotYW1fX212ID0gbXYgLWYKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAotCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCi0JLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKLQkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAotCS0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpIFwKLQkkKExERkxBR1MpIC1vICRACi1TT1VSQ0VTID0gJChsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX1NPVVJDRVMpIFwKLQkkKHBuZ3Rlc3RfU09VUkNFUykKLURJU1RfU09VUkNFUyA9ICQobGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9TT1VSQ0VTKSBcCi0JJChwbmd0ZXN0X1NPVVJDRVMpCi1tYW4zZGlyID0gJChtYW5kaXIpL21hbjMKLW1hbjVkaXIgPSAkKG1hbmRpcikvbWFuNQotTlJPRkYgPSBucm9mZgotTUFOUyA9ICQoZGlzdF9tYW5fTUFOUykKLURBVEEgPSAkKHBrZ2NvbmZpZ19EQVRBKQotSEVBREVSUyA9ICQocGtnaW5jbHVkZV9IRUFERVJTKQotRVRBR1MgPSBldGFncwotQ1RBR1MgPSBjdGFncwotYW1fX3R0eV9jb2xvcnMgPSBcCi1yZWQ9OyBncm49OyBsZ249OyBibHU9OyBzdGQ9Ci1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi1hbV9fcmVtb3ZlX2Rpc3RkaXIgPSBcCi0gIHsgdGVzdCAhIC1kICIkKGRpc3RkaXIpIiBcCi0gICAgfHwgeyBmaW5kICIkKGRpc3RkaXIpIiAtdHlwZSBkICEgLXBlcm0gLTIwMCAtZXhlYyBjaG1vZCB1K3cge30gJzsnIFwKLSAgICAgICAgICYmIHJtIC1mciAiJChkaXN0ZGlyKSI7IH07IH0KLURJU1RfQVJDSElWRVMgPSAkKGRpc3RkaXIpLnRhci5negotR1pJUF9FTlYgPSAtLWJlc3QKLWRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKLWRpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcyA9IGZpbmQgLiAtdHlwZSBmIC1wcmludAotCi0jZGlzdHJpYnV0ZSBoZWFkZXJzIGluIC91c3IvaW5jbHVkZS9saWJwbmcvKgotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvJChQTkdMSUJfQkFTRU5BTUUpCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BTVRBUiA9IEBBTVRBUkAKLUFSID0gQEFSQAotQVMgPSBAQVNACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVdLID0gQEFXS0AKLUNDID0gQENDQAotQ0NERVBNT0RFID0gQENDREVQTU9ERUAKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFAgPSBAQ1BQQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1DWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAotREVGUyA9IEBERUZTQAotREVQRElSID0gQERFUERJUkAKLURMTFRPT0wgPSBARExMVE9PTEAKLURTWU1VVElMID0gQERTWU1VVElMQAotRFVNUEJJTiA9IEBEVU1QQklOQAotRUNIT19DID0gQEVDSE9fQ0AKLUVDSE9fTiA9IEBFQ0hPX05ACi1FQ0hPX1QgPSBARUNIT19UQAotRUdSRVAgPSBARUdSRVBACi1FWEVFWFQgPSBARVhFRVhUQAotRkdSRVAgPSBARkdSRVBACi1HUkVQID0gQEdSRVBACi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKLUxEID0gQExEQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCT0JKUyA9IEBMSUJPQkpTQAotTElCUE5HX0RFRklORVMgPSBATElCUE5HX0RFRklORVNACi1MSUJTID0gQExJQlNACi1MSUJUT09MID0gQExJQlRPT0xACi1MSVBPID0gQExJUE9ACi1MTl9TID0gQExOX1NACi1MVExJQk9CSlMgPSBATFRMSUJPQkpTQAotTUFJTlQgPSBATUFJTlRACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LRElSX1AgPSBATUtESVJfUEAKLU5NID0gQE5NQAotTk1FRElUID0gQE5NRURJVEAKLU9CSkRVTVAgPSBAT0JKRFVNUEAKLU9CSkVYVCA9IEBPQkpFWFRACi1PVE9PTCA9IEBPVE9PTEAKLU9UT09MNjQgPSBAT1RPT0w2NEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAotUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKLVBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAotUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKLVBBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAotUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKLVBBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAotUE5HTElCX01BSk9SID0gQFBOR0xJQl9NQUpPUkAKLVBOR0xJQl9NSU5PUiA9IEBQTkdMSUJfTUlOT1JACi1QTkdMSUJfUkVMRUFTRSA9IEBQTkdMSUJfUkVMRUFTRUAKLVBOR0xJQl9WRVJTSU9OID0gQFBOR0xJQl9WRVJTSU9OQAotUE9XX0xJQiA9IEBQT1dfTElCQAotUkFOTElCID0gQFJBTkxJQkAKLVNFRCA9IEBTRURACi1TRVRfTUFLRSA9IEBTRVRfTUFLRUAKLVNIRUxMID0gQFNIRUxMQAotU1RSSVAgPSBAU1RSSVBACi1TWU1CT0xfUFJFRklYID0gQFNZTUJPTF9QUkVGSVhACi1WRVJTSU9OID0gQFZFUlNJT05ACi1hYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAotYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAotYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAotYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACi1hY19jdF9DQyA9IEBhY19jdF9DQ0AKLWFjX2N0X0RVTVBCSU4gPSBAYWNfY3RfRFVNUEJJTkAKLWFtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAotYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKLWFtX19xdW90ZSA9IEBhbV9fcXVvdGVACi1hbV9fdGFyID0gQGFtX190YXJACi1hbV9fdW50YXIgPSBAYW1fX3VudGFyQAotCi0jIGdlbmVyYXRlIHRoZSAtY29uZmlnIHNjcmlwdHMgaWYgcmVxdWlyZWQKLWJpbmNvbmZpZ3MgPSBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JALWNvbmZpZwotYmluZGlyID0gQGJpbmRpckAKLWJ1aWxkID0gQGJ1aWxkQAotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF9jcHUgPSBAYnVpbGRfY3B1QAotYnVpbGRfb3MgPSBAYnVpbGRfb3NACi1idWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAotYnVpbGRkaXIgPSBAYnVpbGRkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1kYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKLWRvY2RpciA9IEBkb2NkaXJACi1kdmlkaXIgPSBAZHZpZGlyQAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1ob3N0ID0gQGhvc3RACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X2NwdSA9IEBob3N0X2NwdUAKLWhvc3Rfb3MgPSBAaG9zdF9vc0AKLWhvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAotaHRtbGRpciA9IEBodG1sZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotaW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAotbGliZGlyID0gQGxpYmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWxvY2FsZWRpciA9IEBsb2NhbGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotbWtkaXJfcCA9IEBta2Rpcl9wQAotb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAotcGRmZGlyID0gQHBkZmRpckAKLQotIyBwa2ctY29uZmlnIHN0dWZmLCBub3RlIHRoYXQgbGlicG5nLnBjIGlzIGFsd2F5cyByZXF1aXJlZCBpbiBvcmRlcgotIyB0byBnZXQgdGhlIGNvcnJlY3QgbGlicmFyeQotcGtnY29uZmlnZGlyID0gQHBrZ2NvbmZpZ2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi1wc2RpciA9IEBwc2RpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotc3JjZGlyID0gQHNyY2RpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACi10b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotUE5HTElCX0JBU0VOQU1FID0gbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQAotCi0jIGxpYnBuZyBkb2VzIG5vdCBmb2xsb3cgR05VIGZpbGUgbmFtZSBjb252ZW50aW9ucwotQVVUT01BS0VfT1BUSU9OUyA9IGZvcmVpZ24KLXBuZ3Rlc3RfU09VUkNFUyA9IHBuZ3Rlc3QuYwotcG5ndGVzdF9MREFERCA9IGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAubGEKLVRFU1RTID0gdGVzdC1wbmd0ZXN0LnNoCi1URVNUU19FTlZJUk9OTUVOVCA9IHNyY2Rpcj0kKHNyY2RpcikKLQotIyBtYW4gcGFnZXMKLWRpc3RfbWFuX01BTlMgPSBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci1FWFRSQV9TQ1JJUFRTID0gbGlicG5nLWNvbmZpZyBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JALWNvbmZpZwotYmluX1NDUklQVFMgPSBAYmluY29uZmlnc0AKLQotIyBydWxlcyB0byBidWlsZCBsaWJwbmcsIG9ubHkgYnVpbGQgdGhlIG9sZCBsaWJyYXJ5IG9uIHJlcXVlc3QKLWxpYl9MVExJQlJBUklFUyA9IGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAubGEKLSMgRVhUUkFfTFRMSUJSQVJJRVM9IGxpYnBuZy5sYQotbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9TT1VSQ0VTID0gcG5nLmMgcG5nc2V0LmMgcG5nZ2V0LmMgcG5ncnV0aWwuYyBcCi0JcG5ndHJhbnMuYyBwbmd3dXRpbC5jIFwKLQlwbmdyZWFkLmMgcG5ncmlvLmMgcG5nd2lvLmMgcG5nd3JpdGUuYyBwbmdydHJhbi5jIFwKLQlwbmd3dHJhbi5jIHBuZ21lbS5jIHBuZ2Vycm9yLmMgcG5ncHJlYWQuYyBcCi0JcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCi1saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0NQUEZMQUdTID0gQExJQlBOR19ERUZJTkVTQAotbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9MREZMQUdTID0gLW5vLXVuZGVmaW5lZCBcCi0JLWV4cG9ydC1keW5hbWljIC12ZXJzaW9uLW51bWJlciBcCi0JQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQDpAUE5HTElCX1JFTEVBU0VAOjAgXAotCSQoYW1fX2FwcGVuZF8xKSAkKGFtX19hcHBlbmRfMikKLUBIQVZFX0xEX1ZFUlNJT05fU0NSSVBUX0ZBTFNFQGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfREVQRU5ERU5DSUVTID0gbGlicG5nLnN5bQotQEhBVkVfTERfVkVSU0lPTl9TQ1JJUFRfVFJVRUBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0RFUEVOREVOQ0lFUyA9IGxpYnBuZy52ZXJzCi0KLSMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KLUFOID0gJ19hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OScKLXBrZ2luY2x1ZGVfSEVBREVSUyA9IHBuZy5oIHBuZ2NvbmYuaAotcGtnY29uZmlnX0RBVEEgPSBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JALnBjCi0KLSNleHRyYSBzb3VyY2UgZGlzdHJpYnV0aW9uIGZpbGVzLgotRVhUUkFfRElTVCA9IFwKLQlBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgTElDRU5TRSBSRUFETUUgVE9ETyBDTWFrZUxpc3RzLnR4dCBcCi0JcG5ndGVzdC5wbmcgcG5nYmFyLnBuZyBwbmdub3cucG5nIHBuZ2Jhci5qcGcgYXV0b2dlbi5zaCBcCi0JJHtzcmNkaXJ9L3Byb2plY3RzL3ZzdHVkaW8vKiBcCi0JJHtzcmNkaXJ9L3Byb2plY3RzL3Zpc3VhbGM2LyogXAotCSR7c3JjZGlyfS9wcm9qZWN0cy92aXN1YWxjNzEvKiBcCi0JJHtzcmNkaXJ9L3Byb2plY3RzL3hjb2RlLyogXAotCSR7c3JjZGlyfS9zY3JpcHRzLyogXAotCSR7c3JjZGlyfS9jb250cmliL2dyZWdib29rLyogXAotCSR7c3JjZGlyfS9jb250cmliL3BuZ21pbmltLyogXAotCSR7c3JjZGlyfS9jb250cmliL3BuZ21pbnVzLyogXAotCSR7c3JjZGlyfS9jb250cmliL3BuZ3N1aXRlLyogXAotCSR7c3JjZGlyfS9jb250cmliL3Zpc3VwbmcvKiBcCi0JJChURVNUUykgXAotCWV4YW1wbGUuYyBsaWJwbmctMS40LjEyLnR4dAotCi1DTEVBTkZJTEVTID0gcG5nb3V0LnBuZyBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JALnBjIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAtY29uZmlnIGxpYnBuZy52ZXJzIFwKLWxpYnBuZy5zeW0KLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbiBhY2xvY2FsLm00IGNvbmZpZy5ndWVzcyBjb25maWcuaC5pbiBcCi1jb25maWcuc3ViIGNvbmZpZ3VyZSBkZXBjb21wIGluc3RhbGwtc2ggbHRtYWluLnNoIG1pc3NpbmcKLQotYWxsOiBjb25maWcuaAotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1hbQotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5sbyAubyAub2JqCi1hbS0tcmVmcmVzaDoKLQlAOgotJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JQGZvciBkZXAgaW4gJD87IGRvIFwKLQkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAotCSAgICAqJCRkZXAqKSBcCi0JICAgICAgZWNobyAnIGNkICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24nOyBcCi0JICAgICAgJChhbV9fY2QpICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gXAotCQkmJiBleGl0IDA7IFwKLQkgICAgICBleGl0IDE7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiBNYWtlZmlsZSc7IFwKLQkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCi0JICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gTWFrZWZpbGUKLS5QUkVDSU9VUzogTWFrZWZpbGUKLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQlAY2FzZSAnJD8nIGluIFwKLQkgICpjb25maWcuc3RhdHVzKikgXAotCSAgICBlY2hvICcgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzJzsgXAotCSAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXM7OyBcCi0JICAqKSBcCi0JICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCi0JZXNhYzsKLQotJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi0kKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKLQkkKGFtX19jZCkgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0kKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKLQkkKGFtX19jZCkgJChzcmNkaXIpICYmICQoQUNMT0NBTCkgJChBQ0xPQ0FMX0FNRkxBR1MpCi0kKGFtX19hY2xvY2FsX200X2RlcHMpOgotCi1jb25maWcuaDogc3RhbXAtaDEKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkgIHJtIC1mIHN0YW1wLWgxOyBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBzdGFtcC1oMTsgXAotCWVsc2UgOjsgZmkKLQotc3RhbXAtaDE6ICQoc3JjZGlyKS9jb25maWcuaC5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBybSAtZiBzdGFtcC1oMQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgKLSQoc3JjZGlyKS9jb25maWcuaC5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKLQkoJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKSkKLQlybSAtZiBzdGFtcC1oMQotCXRvdWNoICRACi0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oIHN0YW1wLWgxCi1saWJwbmcucGM6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzICQoc3JjZGlyKS9saWJwbmcucGMuaW4KLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRACi1saWJwbmctY29uZmlnOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHNyY2RpcikvbGlicG5nLWNvbmZpZy5pbgotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAKLWluc3RhbGwtbGliTFRMSUJSQVJJRVM6ICQobGliX0xUTElCUkFSSUVTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCXRlc3QgLXogIiQobGliZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQobGliZGlyKSIKLQlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgdGVzdCAtbiAiJChsaWJkaXIpIiB8fCBsaXN0PTsgXAotCWxpc3QyPTsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGxpc3QyPSIkJGxpc3QyICQkcCI7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lOyBcCi0JdGVzdCAteiAiJCRsaXN0MiIgfHwgeyBcCi0JICBlY2hvICIgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJChJTlNUQUxMX1NUUklQX0ZMQUcpICQkbGlzdDIgJyQoREVTVERJUikkKGxpYmRpciknIjsgXAotCSAgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJChJTlNUQUxMX1NUUklQX0ZMQUcpICQkbGlzdDIgIiQoREVTVERJUikkKGxpYmRpcikiOyBcCi0JfQotCi11bmluc3RhbGwtbGliTFRMSUJSQVJJRVM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgdGVzdCAtbiAiJChsaWJkaXIpIiB8fCBsaXN0PTsgXAotCWZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgJChhbV9fc3RyaXBfZGlyKSBcCi0JICBlY2hvICIgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgJyQoREVTVERJUikkKGxpYmRpcikvJCRmJyI7IFwKLQkgICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICIkKERFU1RESVIpJChsaWJkaXIpLyQkZiI7IFwKLQlkb25lCi0KLWNsZWFuLWxpYkxUTElCUkFSSUVTOgotCS10ZXN0IC16ICIkKGxpYl9MVExJQlJBUklFUykiIHx8IHJtIC1mICQobGliX0xUTElCUkFSSUVTKQotCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGRpcj0iYGVjaG8gJCRwIHwgc2VkIC1lICdzfC9bXi9dKiQkfHwnYCI7IFwKLQkgIHRlc3QgIiQkZGlyIiAhPSAiJCRwIiB8fCBkaXI9LjsgXAotCSAgZWNobyAicm0gLWYgXCIkJHtkaXJ9L3NvX2xvY2F0aW9uc1wiIjsgXAotCSAgcm0gLWYgIiQke2Rpcn0vc29fbG9jYXRpb25zIjsgXAotCWRvbmUKLWxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAubGE6ICQobGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9PQkpFQ1RTKSAkKGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfREVQRU5ERU5DSUVTKQotCSQobGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9MSU5LKSAtcnBhdGggJChsaWJkaXIpICQobGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9PQkpFQ1RTKSAkKGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfTElCQUREKSAkKExJQlMpCi0KLWNsZWFuLWNoZWNrUFJPR1JBTVM6Ci0JQGxpc3Q9JyQoY2hlY2tfUFJPR1JBTVMpJzsgdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKLQllY2hvICIgcm0gLWYiICQkbGlzdDsgXAotCXJtIC1mICQkbGlzdCB8fCBleGl0ICQkPzsgXAotCXRlc3QgLW4gIiQoRVhFRVhUKSIgfHwgZXhpdCAwOyBcCi0JbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAotCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCi0Jcm0gLWYgJCRsaXN0Ci1wbmd0ZXN0JChFWEVFWFQpOiAkKHBuZ3Rlc3RfT0JKRUNUUykgJChwbmd0ZXN0X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgcG5ndGVzdCQoRVhFRVhUKQotCSQoTElOSykgJChwbmd0ZXN0X09CSkVDVFMpICQocG5ndGVzdF9MREFERCkgJChMSUJTKQotaW5zdGFsbC1iaW5TQ1JJUFRTOiAkKGJpbl9TQ1JJUFRTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCXRlc3QgLXogIiQoYmluZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQoYmluZGlyKSIKLQlAbGlzdD0nJChiaW5fU0NSSVBUUyknOyB0ZXN0IC1uICIkKGJpbmRpcikiIHx8IGxpc3Q9OyBcCi0JZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAotCSAgaWYgdGVzdCAtZiAiJCRkJCRwIjsgdGhlbiBlY2hvICIkJGQkJHAiOyBlY2hvICIkJHAiOyBlbHNlIDo7IGZpOyBcCi0JZG9uZSB8IFwKLQlzZWQgLWUgJ3A7cywuKi8sLDtuJyBcCi0JICAgIC1lICdoO3N8Lip8LnwnIFwKLQkgICAgLWUgJ3A7eDtzLC4qLywsOyQodHJhbnNmb3JtKScgfCBzZWQgJ047TjtOO3MsXG4sICxnJyB8IFwKLQkkKEFXSykgJ0JFR0lOIHsgZmlsZXNbIi4iXSA9ICIiOyBkaXJzWyIuIl0gPSAxOyB9IFwKLQkgIHsgZD0kJDM7IGlmIChkaXJzW2RdICE9IDEpIHsgcHJpbnQgImQiLCBkOyBkaXJzW2RdID0gMSB9IFwKLQkgICAgaWYgKCQkMiA9PSAkJDQpIHsgZmlsZXNbZF0gPSBmaWxlc1tkXSAiICIgJCQxOyBcCi0JICAgICAgaWYgKCsrbltkXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIHsgXAotCQlwcmludCAiZiIsIGQsIGZpbGVzW2RdOyBuW2RdID0gMDsgZmlsZXNbZF0gPSAiIiB9IH0gXAotCSAgICBlbHNlIHsgcHJpbnQgImYiLCBkICIvIiAkJDQsICQkMSB9IH0gXAotCSAgRU5EIHsgZm9yIChkIGluIGZpbGVzKSBwcmludCAiZiIsIGQsIGZpbGVzW2RdIH0nIHwgXAotCXdoaWxlIHJlYWQgdHlwZSBkaXIgZmlsZXM7IGRvIFwKLQkgICAgIGlmIHRlc3QgIiQkZGlyIiA9IC47IHRoZW4gZGlyPTsgZWxzZSBkaXI9LyQkZGlyOyBmaTsgXAotCSAgICAgdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCi0JICAgICAgIGVjaG8gIiAkKElOU1RBTExfU0NSSVBUKSAkJGZpbGVzICckKERFU1RESVIpJChiaW5kaXIpJCRkaXInIjsgXAotCSAgICAgICAkKElOU1RBTExfU0NSSVBUKSAkJGZpbGVzICIkKERFU1RESVIpJChiaW5kaXIpJCRkaXIiIHx8IGV4aXQgJCQ/OyBcCi0JICAgICB9IFwKLQk7IGRvbmUKLQotdW5pbnN0YWxsLWJpblNDUklQVFM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlAbGlzdD0nJChiaW5fU0NSSVBUUyknOyB0ZXN0IC1uICIkKGJpbmRpcikiIHx8IGV4aXQgMDsgXAotCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBcCi0JICAgICAgIHNlZCAtZSAncywuKi8sLDskKHRyYW5zZm9ybSknYDsgXAotCXRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCi0JZWNobyAiICggY2QgJyQoREVTVERJUikkKGJpbmRpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAotCWNkICIkKERFU1RESVIpJChiaW5kaXIpIiAmJiBybSAtZiAkJGZpbGVzCi0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICouJChPQkpFWFQpCi0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZy5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nZXJyb3IuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ2dldC5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nbWVtLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdwcmVhZC5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncmVhZC5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncmlvLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdydHJhbi5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncnV0aWwuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3NldC5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ndHJhbnMuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3dpby5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nd3JpdGUuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3d0cmFuLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmd3dXRpbC5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3BuZ3Rlc3QuUG9AYW1fX3F1b3RlQAotCi0uYy5vOgotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyAkPAotCi0uYy5vYmo6Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCi0uYy5sbzoKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoTFRDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBsbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKLQotbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmcubG86IHBuZy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZy5UcG8gLWMgLW8gbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmcubG8gYHRlc3QgLWYgJ3BuZy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmcuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZy5UcG8gJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nLlBsbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncG5nLmMnIG9iamVjdD0nbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmcubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmcubG8gYHRlc3QgLWYgJ3BuZy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmcuYwotCi1saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3NldC5sbzogcG5nc2V0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdzZXQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nc2V0LlRwbyAtYyAtbyBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3NldC5sbyBgdGVzdCAtZiAncG5nc2V0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3NldC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nc2V0LlRwbyAkKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdzZXQuUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmdzZXQuYycgb2JqZWN0PSdsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3NldC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3NldC5sbyBgdGVzdCAtZiAncG5nc2V0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3NldC5jCi0KLWxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nZ2V0LmxvOiBwbmdnZXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ2dldC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdnZXQuVHBvIC1jIC1vIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nZ2V0LmxvIGB0ZXN0IC1mICdwbmdnZXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5nZ2V0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdnZXQuVHBvICQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ2dldC5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuZ2dldC5jJyBvYmplY3Q9J2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nZ2V0LmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nZ2V0LmxvIGB0ZXN0IC1mICdwbmdnZXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5nZ2V0LmMKLQotbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdydXRpbC5sbzogcG5ncnV0aWwuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3J1dGlsLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3J1dGlsLlRwbyAtYyAtbyBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3J1dGlsLmxvIGB0ZXN0IC1mICdwbmdydXRpbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdydXRpbC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncnV0aWwuVHBvICQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3J1dGlsLlBsbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncG5ncnV0aWwuYycgb2JqZWN0PSdsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3J1dGlsLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncnV0aWwubG8gYHRlc3QgLWYgJ3BuZ3J1dGlsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3J1dGlsLmMKLQotbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmd0cmFucy5sbzogcG5ndHJhbnMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3RyYW5zLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3RyYW5zLlRwbyAtYyAtbyBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3RyYW5zLmxvIGB0ZXN0IC1mICdwbmd0cmFucy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bwbmd0cmFucy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ndHJhbnMuVHBvICQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3RyYW5zLlBsbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncG5ndHJhbnMuYycgb2JqZWN0PSdsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3RyYW5zLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ndHJhbnMubG8gYHRlc3QgLWYgJ3BuZ3RyYW5zLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3RyYW5zLmMKLQotbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmd3dXRpbC5sbzogcG5nd3V0aWwuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3d1dGlsLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3d1dGlsLlRwbyAtYyAtbyBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3d1dGlsLmxvIGB0ZXN0IC1mICdwbmd3dXRpbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bwbmd3dXRpbC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nd3V0aWwuVHBvICQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3d1dGlsLlBsbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncG5nd3V0aWwuYycgb2JqZWN0PSdsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3d1dGlsLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nd3V0aWwubG8gYHRlc3QgLWYgJ3BuZ3d1dGlsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3d1dGlsLmMKLQotbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdyZWFkLmxvOiBwbmdyZWFkLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdyZWFkLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3JlYWQuVHBvIC1jIC1vIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncmVhZC5sbyBgdGVzdCAtZiAncG5ncmVhZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdyZWFkLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdyZWFkLlRwbyAkKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdyZWFkLlBsbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncG5ncmVhZC5jJyBvYmplY3Q9J2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncmVhZC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3JlYWQubG8gYHRlc3QgLWYgJ3BuZ3JlYWQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5ncmVhZC5jCi0KLWxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncmlvLmxvOiBwbmdyaW8uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3Jpby5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdyaW8uVHBvIC1jIC1vIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncmlvLmxvIGB0ZXN0IC1mICdwbmdyaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5ncmlvLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdyaW8uVHBvICQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3Jpby5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuZ3Jpby5jJyBvYmplY3Q9J2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncmlvLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncmlvLmxvIGB0ZXN0IC1mICdwbmdyaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5ncmlvLmMKLQotbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmd3aW8ubG86IHBuZ3dpby5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nd2lvLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3dpby5UcG8gLWMgLW8gbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmd3aW8ubG8gYHRlc3QgLWYgJ3BuZ3dpby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bwbmd3aW8uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3dpby5UcG8gJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nd2lvLlBsbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncG5nd2lvLmMnIG9iamVjdD0nbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmd3aW8ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmd3aW8ubG8gYHRlc3QgLWYgJ3BuZ3dpby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bwbmd3aW8uYwotCi1saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3dyaXRlLmxvOiBwbmd3cml0ZS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nd3JpdGUubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nd3JpdGUuVHBvIC1jIC1vIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nd3JpdGUubG8gYHRlc3QgLWYgJ3BuZ3dyaXRlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3dyaXRlLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmd3cml0ZS5UcG8gJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nd3JpdGUuUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmd3cml0ZS5jJyBvYmplY3Q9J2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nd3JpdGUubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmd3cml0ZS5sbyBgdGVzdCAtZiAncG5nd3JpdGUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5nd3JpdGUuYwotCi1saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3J0cmFuLmxvOiBwbmdydHJhbi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncnRyYW4ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncnRyYW4uVHBvIC1jIC1vIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncnRyYW4ubG8gYHRlc3QgLWYgJ3BuZ3J0cmFuLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3J0cmFuLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdydHJhbi5UcG8gJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncnRyYW4uUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmdydHJhbi5jJyBvYmplY3Q9J2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncnRyYW4ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdydHJhbi5sbyBgdGVzdCAtZiAncG5ncnRyYW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5ncnRyYW4uYwotCi1saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3d0cmFuLmxvOiBwbmd3dHJhbi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nd3RyYW4ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nd3RyYW4uVHBvIC1jIC1vIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nd3RyYW4ubG8gYHRlc3QgLWYgJ3BuZ3d0cmFuLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3d0cmFuLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmd3dHJhbi5UcG8gJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nd3RyYW4uUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmd3dHJhbi5jJyBvYmplY3Q9J2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nd3RyYW4ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmd3dHJhbi5sbyBgdGVzdCAtZiAncG5nd3RyYW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5nd3RyYW4uYwotCi1saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ21lbS5sbzogcG5nbWVtLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdtZW0ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nbWVtLlRwbyAtYyAtbyBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ21lbS5sbyBgdGVzdCAtZiAncG5nbWVtLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ21lbS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nbWVtLlRwbyAkKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdtZW0uUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmdtZW0uYycgb2JqZWN0PSdsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ21lbS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ21lbS5sbyBgdGVzdCAtZiAncG5nbWVtLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ21lbS5jCi0KLWxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5nZXJyb3IubG86IHBuZ2Vycm9yLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdlcnJvci5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdlcnJvci5UcG8gLWMgLW8gbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdlcnJvci5sbyBgdGVzdCAtZiAncG5nZXJyb3IuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5nZXJyb3IuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ2Vycm9yLlRwbyAkKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdlcnJvci5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuZ2Vycm9yLmMnIG9iamVjdD0nbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdlcnJvci5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ2Vycm9yLmxvIGB0ZXN0IC1mICdwbmdlcnJvci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdlcnJvci5jCi0KLWxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGEtcG5ncHJlYWQubG86IHBuZ3ByZWFkLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdwcmVhZC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdwcmVhZC5UcG8gLWMgLW8gbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdwcmVhZC5sbyBgdGVzdCAtZiAncG5ncHJlYWQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5ncHJlYWQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3ByZWFkLlRwbyAkKERFUERJUikvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdwcmVhZC5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuZ3ByZWFkLmMnIG9iamVjdD0nbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYS1wbmdwcmVhZC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhLXBuZ3ByZWFkLmxvIGB0ZXN0IC1mICdwbmdwcmVhZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdwcmVhZC5jCi0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbi1saWJ0b29sOgotCS1ybSAtZiBsaWJ0b29sIGNvbmZpZy5sdAotaW5zdGFsbC1tYW4zOiAkKGRpc3RfbWFuX01BTlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JdGVzdCAteiAiJChtYW4zZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQobWFuM2RpcikiCi0JQGxpc3Q9Jyc7IHRlc3QgLW4gIiQobWFuM2RpcikiIHx8IGV4aXQgMDsgXAotCXsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICIkJGkiOyBkb25lOyBcCi0JbDI9JyQoZGlzdF9tYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBlY2hvICIkJGkiOyBkb25lIHwgXAotCSAgc2VkIC1uICcvXC4zW2Etel0qJCQvcCc7IFwKLQl9IHwgd2hpbGUgcmVhZCBwOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKLQkgIGVjaG8gIiQkZCQkcCI7IGVjaG8gIiQkcCI7IFwKLQlkb25lIHwgXAotCXNlZCAtZSAnbjtzLC4qLywsO3A7aDtzLC4qXC4sLDtzLF5bXjNdWzAtOWEtel0qJCQsMyw7eCcgXAotCSAgICAgIC1lICdzLFwuWzAtOWEtel0qJCQsLDskKHRyYW5zZm9ybSk7RztzLFxuLC4sJyB8IFwKLQlzZWQgJ047TjtzLFxuLCAsZycgfCB7IFwKLQlsaXN0PTsgd2hpbGUgcmVhZCBmaWxlIGJhc2UgaW5zdDsgZG8gXAotCSAgaWYgdGVzdCAiJCRiYXNlIiA9ICIkJGluc3QiOyB0aGVuIGxpc3Q9IiQkbGlzdCAkJGZpbGUiOyBlbHNlIFwKLQkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAnJCRmaWxlJyAnJChERVNURElSKSQobWFuM2RpcikvJCRpbnN0JyI7IFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICIkJGZpbGUiICIkKERFU1RESVIpJChtYW4zZGlyKS8kJGluc3QiIHx8IGV4aXQgJCQ/OyBcCi0JICBmaTsgXAotCWRvbmU7IFwKLQlmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAotCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKLQkgIHRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAotCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgJyQoREVTVERJUikkKG1hbjNkaXIpJyI7IFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgIiQoREVTVERJUikkKG1hbjNkaXIpIiB8fCBleGl0ICQkPzsgfTsgXAotCWRvbmU7IH0KLQotdW5pbnN0YWxsLW1hbjM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlAbGlzdD0nJzsgdGVzdCAtbiAiJChtYW4zZGlyKSIgfHwgZXhpdCAwOyBcCi0JZmlsZXM9YHsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICIkJGkiOyBkb25lOyBcCi0JbDI9JyQoZGlzdF9tYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBlY2hvICIkJGkiOyBkb25lIHwgXAotCSAgc2VkIC1uICcvXC4zW2Etel0qJCQvcCc7IFwKLQl9IHwgc2VkIC1lICdzLC4qLywsO2g7cywuKlwuLCw7cyxeW14zXVswLTlhLXpdKiQkLDMsO3gnIFwKLQkgICAgICAtZSAncyxcLlswLTlhLXpdKiQkLCw7JCh0cmFuc2Zvcm0pO0c7cyxcbiwuLCdgOyBcCi0JdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCi0JICBlY2hvICIgKCBjZCAnJChERVNURElSKSQobWFuM2RpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAotCSAgY2QgIiQoREVTVERJUikkKG1hbjNkaXIpIiAmJiBybSAtZiAkJGZpbGVzOyB9Ci1pbnN0YWxsLW1hbjU6ICQoZGlzdF9tYW5fTUFOUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQl0ZXN0IC16ICIkKG1hbjVkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChtYW41ZGlyKSIKLQlAbGlzdD0nJzsgdGVzdCAtbiAiJChtYW41ZGlyKSIgfHwgZXhpdCAwOyBcCi0JeyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmU7IFwKLQlsMj0nJChkaXN0X21hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIGVjaG8gIiQkaSI7IGRvbmUgfCBcCi0JICBzZWQgLW4gJy9cLjVbYS16XSokJC9wJzsgXAotCX0gfCB3aGlsZSByZWFkIHA7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAotCSAgZWNobyAiJCRkJCRwIjsgZWNobyAiJCRwIjsgXAotCWRvbmUgfCBcCi0Jc2VkIC1lICduO3MsLiovLCw7cDtoO3MsLipcLiwsO3MsXlteNV1bMC05YS16XSokJCw1LDt4JyBcCi0JICAgICAgLWUgJ3MsXC5bMC05YS16XSokJCwsOyQodHJhbnNmb3JtKTtHO3MsXG4sLiwnIHwgXAotCXNlZCAnTjtOO3MsXG4sICxnJyB8IHsgXAotCWxpc3Q9OyB3aGlsZSByZWFkIGZpbGUgYmFzZSBpbnN0OyBkbyBcCi0JICBpZiB0ZXN0ICIkJGJhc2UiID0gIiQkaW5zdCI7IHRoZW4gbGlzdD0iJCRsaXN0ICQkZmlsZSI7IGVsc2UgXAotCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICckJGZpbGUnICckKERFU1RESVIpJChtYW41ZGlyKS8kJGluc3QnIjsgXAotCSAgICAkKElOU1RBTExfREFUQSkgIiQkZmlsZSIgIiQoREVTVERJUikkKG1hbjVkaXIpLyQkaW5zdCIgfHwgZXhpdCAkJD87IFwKLQkgIGZpOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCi0Jd2hpbGUgcmVhZCBmaWxlczsgZG8gXAotCSAgdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCi0JICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAnJChERVNURElSKSQobWFuNWRpciknIjsgXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAiJChERVNURElSKSQobWFuNWRpcikiIHx8IGV4aXQgJCQ/OyB9OyBcCi0JZG9uZTsgfQotCi11bmluc3RhbGwtbWFuNToKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCUBsaXN0PScnOyB0ZXN0IC1uICIkKG1hbjVkaXIpIiB8fCBleGl0IDA7IFwKLQlmaWxlcz1geyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmU7IFwKLQlsMj0nJChkaXN0X21hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIGVjaG8gIiQkaSI7IGRvbmUgfCBcCi0JICBzZWQgLW4gJy9cLjVbYS16XSokJC9wJzsgXAotCX0gfCBzZWQgLWUgJ3MsLiovLCw7aDtzLC4qXC4sLDtzLF5bXjVdWzAtOWEtel0qJCQsNSw7eCcgXAotCSAgICAgIC1lICdzLFwuWzAtOWEtel0qJCQsLDskKHRyYW5zZm9ybSk7RztzLFxuLC4sJ2A7IFwKLQl0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKLQkgIGVjaG8gIiAoIGNkICckKERFU1RESVIpJChtYW41ZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCi0JICBjZCAiJChERVNURElSKSQobWFuNWRpcikiICYmIHJtIC1mICQkZmlsZXM7IH0KLWluc3RhbGwtcGtnY29uZmlnREFUQTogJChwa2djb25maWdfREFUQSkKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQl0ZXN0IC16ICIkKHBrZ2NvbmZpZ2RpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKHBrZ2NvbmZpZ2RpcikiCi0JQGxpc3Q9JyQocGtnY29uZmlnX0RBVEEpJzsgdGVzdCAtbiAiJChwa2djb25maWdkaXIpIiB8fCBsaXN0PTsgXAotCWZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKLQkgIGVjaG8gIiQkZCQkcCI7IFwKLQlkb25lIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKLQl3aGlsZSByZWFkIGZpbGVzOyBkbyBcCi0JICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgJyQoREVTVERJUikkKHBrZ2NvbmZpZ2RpciknIjsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgIiQoREVTVERJUikkKHBrZ2NvbmZpZ2RpcikiIHx8IGV4aXQgJCQ/OyBcCi0JZG9uZQotCi11bmluc3RhbGwtcGtnY29uZmlnREFUQToKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCUBsaXN0PSckKHBrZ2NvbmZpZ19EQVRBKSc7IHRlc3QgLW4gIiQocGtnY29uZmlnZGlyKSIgfHwgbGlzdD07IFwKLQlmaWxlcz1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICQkcDsgZG9uZSB8IHNlZCAtZSAnc3xeLiovfHwnYDsgXAotCXRlc3QgLW4gIiQkZmlsZXMiIHx8IGV4aXQgMDsgXAotCWVjaG8gIiAoIGNkICckKERFU1RESVIpJChwa2djb25maWdkaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKLQljZCAiJChERVNURElSKSQocGtnY29uZmlnZGlyKSIgJiYgcm0gLWYgJCRmaWxlcwotaW5zdGFsbC1wa2dpbmNsdWRlSEVBREVSUzogJChwa2dpbmNsdWRlX0hFQURFUlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JdGVzdCAteiAiJChwa2dpbmNsdWRlZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQocGtnaW5jbHVkZWRpcikiCi0JQGxpc3Q9JyQocGtnaW5jbHVkZV9IRUFERVJTKSc7IHRlc3QgLW4gIiQocGtnaW5jbHVkZWRpcikiIHx8IGxpc3Q9OyBcCi0JZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAotCSAgZWNobyAiJCRkJCRwIjsgXAotCWRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAotCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKLQkgIGVjaG8gIiAkKElOU1RBTExfSEVBREVSKSAkJGZpbGVzICckKERFU1RESVIpJChwa2dpbmNsdWRlZGlyKSciOyBcCi0JICAkKElOU1RBTExfSEVBREVSKSAkJGZpbGVzICIkKERFU1RESVIpJChwa2dpbmNsdWRlZGlyKSIgfHwgZXhpdCAkJD87IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1wa2dpbmNsdWRlSEVBREVSUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCUBsaXN0PSckKHBrZ2luY2x1ZGVfSEVBREVSUyknOyB0ZXN0IC1uICIkKHBrZ2luY2x1ZGVkaXIpIiB8fCBsaXN0PTsgXAotCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRwOyBkb25lIHwgc2VkIC1lICdzfF4uKi98fCdgOyBcCi0JdGVzdCAtbiAiJCRmaWxlcyIgfHwgZXhpdCAwOyBcCi0JZWNobyAiICggY2QgJyQoREVTVERJUikkKHBrZ2luY2x1ZGVkaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKLQljZCAiJChERVNURElSKSQocGtnaW5jbHVkZWRpcikiICYmIHJtIC1mICQkZmlsZXMKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlta2lkIC1mSUQgJCR1bmlxdWUKLXRhZ3M6IFRBR1MKLQotVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaC5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXNldCB4OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSBjb25maWcuaC5pbiAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCXNoaWZ0OyBcCi0JaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKLQkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKLQkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKLQkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCi0JICBlbHNlIFwKLQkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAgICQkdW5pcXVlOyBcCi0JICBmaTsgXAotCWZpCi1jdGFnczogQ1RBR1MKLUNUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5oLmluICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpIGNvbmZpZy5oLmluICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCi0JICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCi0JICAgICAkJHVuaXF1ZQotCi1HVEFHUzoKLQloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAotCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAotCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncwotCi1jaGVjay1URVNUUzogJChURVNUUykKLQlAZmFpbGVkPTA7IGFsbD0wOyB4ZmFpbD0wOyB4cGFzcz0wOyBza2lwPTA7IFwKLQlzcmNkaXI9JChzcmNkaXIpOyBleHBvcnQgc3JjZGlyOyBcCi0JbGlzdD0nICQoVEVTVFMpICc7IFwKLQkkKGFtX190dHlfY29sb3JzKTsgXAotCWlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXAotCSAgZm9yIHRzdCBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAuLyQkdHN0OyB0aGVuIGRpcj0uLzsgXAotCSAgICBlbGlmIHRlc3QgLWYgJCR0c3Q7IHRoZW4gZGlyPTsgXAotCSAgICBlbHNlIGRpcj0iJChzcmNkaXIpLyI7IGZpOyBcCi0JICAgIGlmICQoVEVTVFNfRU5WSVJPTk1FTlQpICQke2Rpcn0kJHRzdDsgdGhlbiBcCi0JICAgICAgYWxsPWBleHByICQkYWxsICsgMWA7IFwKLQkgICAgICBjYXNlICIgJChYRkFJTF9URVNUUykgIiBpbiBcCi0JICAgICAgKltcIFwJXSQkdHN0W1wgXAldKikgXAotCQl4cGFzcz1gZXhwciAkJHhwYXNzICsgMWA7IFwKLQkJZmFpbGVkPWBleHByICQkZmFpbGVkICsgMWA7IFwKLQkJY29sPSQkcmVkOyByZXM9WFBBU1M7IFwKLQkgICAgICA7OyBcCi0JICAgICAgKikgXAotCQljb2w9JCRncm47IHJlcz1QQVNTOyBcCi0JICAgICAgOzsgXAotCSAgICAgIGVzYWM7IFwKLQkgICAgZWxpZiB0ZXN0ICQkPyAtbmUgNzc7IHRoZW4gXAotCSAgICAgIGFsbD1gZXhwciAkJGFsbCArIDFgOyBcCi0JICAgICAgY2FzZSAiICQoWEZBSUxfVEVTVFMpICIgaW4gXAotCSAgICAgICpbXCBcCV0kJHRzdFtcIFwJXSopIFwKLQkJeGZhaWw9YGV4cHIgJCR4ZmFpbCArIDFgOyBcCi0JCWNvbD0kJGxnbjsgcmVzPVhGQUlMOyBcCi0JICAgICAgOzsgXAotCSAgICAgICopIFwKLQkJZmFpbGVkPWBleHByICQkZmFpbGVkICsgMWA7IFwKLQkJY29sPSQkcmVkOyByZXM9RkFJTDsgXAotCSAgICAgIDs7IFwKLQkgICAgICBlc2FjOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHNraXA9YGV4cHIgJCRza2lwICsgMWA7IFwKLQkgICAgICBjb2w9JCRibHU7IHJlcz1TS0lQOyBcCi0JICAgIGZpOyBcCi0JICAgIGVjaG8gIiQke2NvbH0kJHJlcyQke3N0ZH06ICQkdHN0IjsgXAotCSAgZG9uZTsgXAotCSAgaWYgdGVzdCAiJCRhbGwiIC1lcSAxOyB0aGVuIFwKLQkgICAgdGVzdHM9InRlc3QiOyBcCi0JICAgIEFsbD0iIjsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3RzPSJ0ZXN0cyI7IFwKLQkgICAgQWxsPSJBbGwgIjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgIiQkZmFpbGVkIiAtZXEgMDsgdGhlbiBcCi0JICAgIGlmIHRlc3QgIiQkeGZhaWwiIC1lcSAwOyB0aGVuIFwKLQkgICAgICBiYW5uZXI9IiQkQWxsJCRhbGwgJCR0ZXN0cyBwYXNzZWQiOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGlmIHRlc3QgIiQkeGZhaWwiIC1lcSAxOyB0aGVuIGZhaWx1cmVzPWZhaWx1cmU7IGVsc2UgZmFpbHVyZXM9ZmFpbHVyZXM7IGZpOyBcCi0JICAgICAgYmFubmVyPSIkJEFsbCQkYWxsICQkdGVzdHMgYmVoYXZlZCBhcyBleHBlY3RlZCAoJCR4ZmFpbCBleHBlY3RlZCAkJGZhaWx1cmVzKSI7IFwKLQkgICAgZmk7IFwKLQkgIGVsc2UgXAotCSAgICBpZiB0ZXN0ICIkJHhwYXNzIiAtZXEgMDsgdGhlbiBcCi0JICAgICAgYmFubmVyPSIkJGZhaWxlZCBvZiAkJGFsbCAkJHRlc3RzIGZhaWxlZCI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgaWYgdGVzdCAiJCR4cGFzcyIgLWVxIDE7IHRoZW4gcGFzc2VzPXBhc3M7IGVsc2UgcGFzc2VzPXBhc3NlczsgZmk7IFwKLQkgICAgICBiYW5uZXI9IiQkZmFpbGVkIG9mICQkYWxsICQkdGVzdHMgZGlkIG5vdCBiZWhhdmUgYXMgZXhwZWN0ZWQgKCQkeHBhc3MgdW5leHBlY3RlZCAkJHBhc3NlcykiOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCSAgZGFzaGVzPSIkJGJhbm5lciI7IFwKLQkgIHNraXBwZWQ9IiI7IFwKLQkgIGlmIHRlc3QgIiQkc2tpcCIgLW5lIDA7IHRoZW4gXAotCSAgICBpZiB0ZXN0ICIkJHNraXAiIC1lcSAxOyB0aGVuIFwKLQkgICAgICBza2lwcGVkPSIoJCRza2lwIHRlc3Qgd2FzIG5vdCBydW4pIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICBza2lwcGVkPSIoJCRza2lwIHRlc3RzIHdlcmUgbm90IHJ1bikiOyBcCi0JICAgIGZpOyBcCi0JICAgIHRlc3QgYGVjaG8gIiQkc2tpcHBlZCIgfCB3YyAtY2AgLWxlIGBlY2hvICIkJGJhbm5lciIgfCB3YyAtY2AgfHwgXAotCSAgICAgIGRhc2hlcz0iJCRza2lwcGVkIjsgXAotCSAgZmk7IFwKLQkgIHJlcG9ydD0iIjsgXAotCSAgaWYgdGVzdCAiJCRmYWlsZWQiIC1uZSAwICYmIHRlc3QgLW4gIiQoUEFDS0FHRV9CVUdSRVBPUlQpIjsgdGhlbiBcCi0JICAgIHJlcG9ydD0iUGxlYXNlIHJlcG9ydCB0byAkKFBBQ0tBR0VfQlVHUkVQT1JUKSI7IFwKLQkgICAgdGVzdCBgZWNobyAiJCRyZXBvcnQiIHwgd2MgLWNgIC1sZSBgZWNobyAiJCRiYW5uZXIiIHwgd2MgLWNgIHx8IFwKLQkgICAgICBkYXNoZXM9IiQkcmVwb3J0IjsgXAotCSAgZmk7IFwKLQkgIGRhc2hlcz1gZWNobyAiJCRkYXNoZXMiIHwgc2VkIHMvLi89L2dgOyBcCi0JICBpZiB0ZXN0ICIkJGZhaWxlZCIgLWVxIDA7IHRoZW4gXAotCSAgICBlY2hvICIkJGdybiQkZGFzaGVzIjsgXAotCSAgZWxzZSBcCi0JICAgIGVjaG8gIiQkcmVkJCRkYXNoZXMiOyBcCi0JICBmaTsgXAotCSAgZWNobyAiJCRiYW5uZXIiOyBcCi0JICB0ZXN0IC16ICIkJHNraXBwZWQiIHx8IGVjaG8gIiQkc2tpcHBlZCI7IFwKLQkgIHRlc3QgLXogIiQkcmVwb3J0IiB8fCBlY2hvICIkJHJlcG9ydCI7IFwKLQkgIGVjaG8gIiQkZGFzaGVzJCRzdGQiOyBcCi0JICB0ZXN0ICIkJGZhaWxlZCIgLWVxIDA7IFwKLQllbHNlIDo7IGZpCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCUBsaXN0PSckKE1BTlMpJzsgaWYgdGVzdCAtbiAiJCRsaXN0IjsgdGhlbiBcCi0JICBsaXN0PWBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkZCQkcCI7IHRoZW4gZWNobyAiJCRkJCRwIjsgZWxzZSA6OyBmaTsgZG9uZWA7IFwKLQkgIGlmIHRlc3QgLW4gIiQkbGlzdCIgJiYgXAotCSAgICBncmVwICdhYiBoZWxwMm1hbiBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGlzIHBhZ2UnICQkbGlzdCA+L2Rldi9udWxsOyB0aGVuIFwKLQkgICAgZWNobyAiZXJyb3I6IGZvdW5kIG1hbiBwYWdlcyBjb250YWluaW5nIHRoZSBcYG1pc3NpbmcgaGVscDJtYW4nIHJlcGxhY2VtZW50IHRleHQ6IiA+JjI7IFwKLQkgICAgZ3JlcCAtbCAnYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlJyAkJGxpc3QgfCBzZWQgJ3MvXi8gICAgICAgICAvJyA+JjI7IFwKLQkgICAgZWNobyAiICAgICAgIHRvIGZpeCB0aGVtLCBpbnN0YWxsIGhlbHAybWFuLCByZW1vdmUgYW5kIHJlZ2VuZXJhdGUgdGhlIG1hbiBwYWdlczsiID4mMjsgXAotCSAgICBlY2hvICIgICAgICAgdHlwaWNhbGx5IFxgbWFrZSBtYWludGFpbmVyLWNsZWFuJyB3aWxsIHJlbW92ZSB0aGVtIiA+JjI7IFwKLQkgICAgZXhpdCAxOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZWxzZSA6OyBmaQotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCXRlc3QgLWQgIiQoZGlzdGRpcikiIHx8IG1rZGlyICIkKGRpc3RkaXIpIgotCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JbGlzdD0nJChESVNURklMRVMpJzsgXAotCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKLQkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCi0JICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAotCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKLQkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKLQkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKLQkJCSAgIHNvcnQgLXVgIDs7IFwKLQllc2FjOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAotCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKLQkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCi0JICAgIGZpOyBcCi0JICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCS10ZXN0IC1uICIkKGFtX19za2lwX21vZGVfZml4KSIgXAotCXx8IGZpbmQgIiQoZGlzdGRpcikiIC10eXBlIGQgISAtcGVybSAtNzU1IFwKLQkJLWV4ZWMgY2htb2QgdStyd3gsZ28rcngge30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQ0NCAtbGlua3MgMSAtZXhlYyBjaG1vZCBhK3Ige30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQwMCAtZXhlYyBjaG1vZCBhK3Ige30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQ0NCAtZXhlYyAkKGluc3RhbGxfc2gpIC1jIC1tIGErciB7fSB7fSBcOyBcCi0JfHwgY2htb2QgLVIgYStyICIkKGRpc3RkaXIpIgotZGlzdC1nemlwOiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IEdaSVA9JChHWklQX0VOVikgZ3ppcCAtYyA+JChkaXN0ZGlyKS50YXIuZ3oKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC1iemlwMjogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBiemlwMiAtOSAtYyA+JChkaXN0ZGlyKS50YXIuYnoyCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QtbHptYTogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBsem1hIC05IC1jID4kKGRpc3RkaXIpLnRhci5sem1hCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QteHo6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgeHogLWMgPiQoZGlzdGRpcikudGFyLnh6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QtdGFyWjogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBjb21wcmVzcyAtYyA+JChkaXN0ZGlyKS50YXIuWgotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0LXNoYXI6IGRpc3RkaXIKLQlzaGFyICQoZGlzdGRpcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikuc2hhci5negotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0LXppcDogZGlzdGRpcgotCS1ybSAtZiAkKGRpc3RkaXIpLnppcAotCXppcCAtcnEgJChkaXN0ZGlyKS56aXAgJChkaXN0ZGlyKQotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0IGRpc3QtYWxsOiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IEdaSVA9JChHWklQX0VOVikgZ3ppcCAtYyA+JChkaXN0ZGlyKS50YXIuZ3oKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgotIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgotIyB0YXJmaWxlLgotZGlzdGNoZWNrOiBkaXN0Ci0JY2FzZSAnJChESVNUX0FSQ0hJVkVTKScgaW4gXAotCSoudGFyLmd6KikgXAotCSAgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1kYyAkKGRpc3RkaXIpLnRhci5neiB8ICQoYW1fX3VudGFyKSA7O1wKLQkqLnRhci5iejIqKSBcCi0JICBiemlwMiAtZGMgJChkaXN0ZGlyKS50YXIuYnoyIHwgJChhbV9fdW50YXIpIDs7XAotCSoudGFyLmx6bWEqKSBcCi0JICBsem1hIC1kYyAkKGRpc3RkaXIpLnRhci5sem1hIHwgJChhbV9fdW50YXIpIDs7XAotCSoudGFyLnh6KikgXAotCSAgeHogLWRjICQoZGlzdGRpcikudGFyLnh6IHwgJChhbV9fdW50YXIpIDs7XAotCSoudGFyLloqKSBcCi0JICB1bmNvbXByZXNzIC1jICQoZGlzdGRpcikudGFyLlogfCAkKGFtX191bnRhcikgOztcCi0JKi5zaGFyLmd6KikgXAotCSAgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1kYyAkKGRpc3RkaXIpLnNoYXIuZ3ogfCB1bnNoYXIgOztcCi0JKi56aXAqKSBcCi0JICB1bnppcCAkKGRpc3RkaXIpLnppcCA7O1wKLQllc2FjCi0JY2htb2QgLVIgYS13ICQoZGlzdGRpcik7IGNobW9kIHUrdyAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKS9fYnVpbGQKLQlta2RpciAkKGRpc3RkaXIpL19pbnN0Ci0JY2htb2QgYS13ICQoZGlzdGRpcikKLQl0ZXN0IC1kICQoZGlzdGRpcikvX2J1aWxkIHx8IGV4aXQgMDsgXAotCWRjX2luc3RhbGxfYmFzZT1gJChhbV9fY2QpICQoZGlzdGRpcikvX2luc3QgJiYgcHdkIHwgc2VkIC1lICdzLF5bXjpcXC9dOltcXC9dLC8sJ2AgXAotCSAgJiYgZGNfZGVzdGRpcj0iJCR7VE1QRElSLS90bXB9L2FtLWRjLSQkJCQvIiBcCi0JICAmJiBhbV9fY3dkPWBwd2RgIFwKLQkgICYmICQoYW1fX2NkKSAkKGRpc3RkaXIpL19idWlsZCBcCi0JICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9IiQkZGNfaW5zdGFsbF9iYXNlIiBcCi0JICAgICQoRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHVuaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0dW5pbnN0YWxsY2hlY2tfZGlyPSIkJGRjX2luc3RhbGxfYmFzZSIgXAotCSAgICAgICAgZGlzdHVuaW5zdGFsbGNoZWNrIFwKLQkgICYmIGNobW9kIC1SIGEtdyAiJCRkY19pbnN0YWxsX2Jhc2UiIFwKLQkgICYmICh7IFwKLQkgICAgICAgKGNkIC4uLy4uICYmIHVtYXNrIDA3NyAmJiBta2RpciAiJCRkY19kZXN0ZGlyIikgXAotCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIGluc3RhbGwgXAotCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIHVuaW5zdGFsbCBcCi0JICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgXAotCSAgICAgICAgICAgIGRpc3R1bmluc3RhbGxjaGVja19kaXI9IiQkZGNfZGVzdGRpciIgZGlzdHVuaW5zdGFsbGNoZWNrOyBcCi0JICAgICAgfSB8fCB7IHJtIC1yZiAiJCRkY19kZXN0ZGlyIjsgZXhpdCAxOyB9KSBcCi0JICAmJiBybSAtcmYgIiQkZGNfZGVzdGRpciIgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdCBcCi0JICAmJiBybSAtcmYgJChESVNUX0FSQ0hJVkVTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Y2xlYW5jaGVjayBcCi0JICAmJiBjZCAiJCRhbV9fY3dkIiBcCi0JICB8fCBleGl0IDEKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQlAKGVjaG8gIiQoZGlzdGRpcikgYXJjaGl2ZXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbjogIjsgXAotCSAgbGlzdD0nJChESVNUX0FSQ0hJVkVTKSc7IGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUpIHwgXAotCSAgc2VkIC1lIDFoIC1lIDFzLy4vPS9nIC1lIDFwIC1lIDF4IC1lICckJHAnIC1lICckJHgnCi1kaXN0dW5pbnN0YWxsY2hlY2s6Ci0JQCQoYW1fX2NkKSAnJChkaXN0dW5pbnN0YWxsY2hlY2tfZGlyKScgXAotCSYmIHRlc3QgYCQoZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcykgfCB3YyAtbGAgLWxlIDEgXAotCSAgIHx8IHsgZWNobyAiRVJST1I6IGZpbGVzIGxlZnQgYWZ0ZXIgdW5pbnN0YWxsOiIgOyBcCi0JICAgICAgICBpZiB0ZXN0IC1uICIkKERFU1RESVIpIjsgdGhlbiBcCi0JICAgICAgICAgIGVjaG8gIiAgKGNoZWNrIERFU1RESVIgc3VwcG9ydCkiOyBcCi0JICAgICAgICBmaSA7IFwKLQkgICAgICAgICQoZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcykgOyBcCi0JICAgICAgICBleGl0IDE7IH0gPiYyCi1kaXN0Y2xlYW5jaGVjazogZGlzdGNsZWFuCi0JQGlmIHRlc3QgJyQoc3JjZGlyKScgPSAuIDsgdGhlbiBcCi0JICBlY2hvICJFUlJPUjogZGlzdGNsZWFuY2hlY2sgY2FuIG9ubHkgcnVuIGZyb20gYSBWUEFUSCBidWlsZCIgOyBcCi0JICBleGl0IDEgOyBcCi0JZmkKLQlAdGVzdCBgJChkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMpIHwgd2MgLWxgIC1lcSAwIFwKLQkgIHx8IHsgZWNobyAiRVJST1I6IGZpbGVzIGxlZnQgaW4gYnVpbGQgZGlyZWN0b3J5IGFmdGVyIGRpc3RjbGVhbjoiIDsgXAotCSAgICAgICAkKGRpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcykgOyBcCi0JICAgICAgIGV4aXQgMTsgfSA+JjIKLWNoZWNrLWFtOiBhbGwtYW0KLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkKGNoZWNrX1BST0dSQU1TKQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrLVRFU1RTCi1jaGVjazogY2hlY2stYW0KLWFsbC1hbTogTWFrZWZpbGUgJChMVExJQlJBUklFUykgJChTQ1JJUFRTKSAkKE1BTlMpICQoREFUQSkgJChIRUFERVJTKSBcCi0JCWNvbmZpZy5oCi1pbnN0YWxsZGlyczoKLQlmb3IgZGlyIGluICIkKERFU1RESVIpJChsaWJkaXIpIiAiJChERVNURElSKSQoYmluZGlyKSIgIiQoREVTVERJUikkKG1hbjNkaXIpIiAiJChERVNURElSKSQobWFuNWRpcikiICIkKERFU1RESVIpJChwa2djb25maWdkaXIpIiAiJChERVNURElSKSQocGtnaW5jbHVkZWRpcikiOyBkbyBcCi0JICB0ZXN0IC16ICIkJGRpciIgfHwgJChNS0RJUl9QKSAiJCRkaXIiOyBcCi0JZG9uZQotaW5zdGFsbDogaW5zdGFsbC1hbQotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCi11bmluc3RhbGw6IHVuaW5zdGFsbC1hbQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCi0JICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKLQkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0KLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKLWNsZWFuOiBjbGVhbi1hbQotCi1jbGVhbi1hbTogY2xlYW4tY2hlY2tQUk9HUkFNUyBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYkxUTElCUkFSSUVTIFwKLQljbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLWFtCi0JLXJtIC1mICQoYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMpCi0JLXJtIC1yZiAuLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCi0JZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncwotCi1kdmk6IGR2aS1hbQotCi1kdmktYW06Ci0KLWh0bWw6IGh0bWwtYW0KLQotaHRtbC1hbToKLQotaW5mbzogaW5mby1hbQotCi1pbmZvLWFtOgotCi1pbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtbWFuIGluc3RhbGwtcGtnY29uZmlnREFUQSBcCi0JaW5zdGFsbC1wa2dpbmNsdWRlSEVBREVSUwotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZGF0YS1ob29rCi1pbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KLQotaW5zdGFsbC1kdmktYW06Ci0KLWluc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1iaW5TQ1JJUFRTIGluc3RhbGwtbGliTFRMSUJSQVJJRVMKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtaG9vawotaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KLQotaW5zdGFsbC1odG1sLWFtOgotCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQotCi1pbnN0YWxsLWluZm8tYW06Ci0KLWluc3RhbGwtbWFuOiBpbnN0YWxsLW1hbjMgaW5zdGFsbC1tYW41Ci0KLWluc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQotCi1pbnN0YWxsLXBkZi1hbToKLQotaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQotCi1pbnN0YWxsLXBzLWFtOgotCi1pbnN0YWxsY2hlY2stYW06Ci0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KLQktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKLQktcm0gLXJmICQodG9wX3NyY2RpcikvYXV0b200dGUuY2FjaGUKLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1tYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQotCi1tb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKLQltb3N0bHljbGVhbi1saWJ0b29sCi0KLXBkZjogcGRmLWFtCi0KLXBkZi1hbToKLQotcHM6IHBzLWFtCi0KLXBzLWFtOgotCi11bmluc3RhbGwtYW06IHVuaW5zdGFsbC1iaW5TQ1JJUFRTIHVuaW5zdGFsbC1saWJMVExJQlJBUklFUyBcCi0JdW5pbnN0YWxsLW1hbiB1bmluc3RhbGwtcGtnY29uZmlnREFUQSBcCi0JdW5pbnN0YWxsLXBrZ2luY2x1ZGVIRUFERVJTCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsLWhvb2sKLXVuaW5zdGFsbC1tYW46IHVuaW5zdGFsbC1tYW4zIHVuaW5zdGFsbC1tYW41Ci0KLS5NQUtFOiBhbGwgY2hlY2stYW0gaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1leGVjLWFtIFwKLQlpbnN0YWxsLXN0cmlwIHVuaW5zdGFsbC1hbQotCi0uUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gYW0tLXJlZnJlc2ggY2hlY2sgY2hlY2stVEVTVFMgY2hlY2stYW0gXAotCWNsZWFuIGNsZWFuLWNoZWNrUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJMVExJQlJBUklFUyBcCi0JY2xlYW4tbGlidG9vbCBjdGFncyBkaXN0IGRpc3QtYWxsIGRpc3QtYnppcDIgZGlzdC1nemlwIFwKLQlkaXN0LWx6bWEgZGlzdC1zaGFyIGRpc3QtdGFyWiBkaXN0LXh6IGRpc3QtemlwIGRpc3RjaGVjayBcCi0JZGlzdGNsZWFuIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1oZHIgXAotCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbmNoZWNrIGRpc3RkaXIgXAotCWRpc3R1bmluc3RhbGxjaGVjayBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAotCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWJpblNDUklQVFMgaW5zdGFsbC1kYXRhIFwKLQlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhLWhvb2sgaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAotCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjLWhvb2sgaW5zdGFsbC1odG1sIFwKLQlpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBcCi0JaW5zdGFsbC1saWJMVExJQlJBUklFUyBpbnN0YWxsLW1hbiBpbnN0YWxsLW1hbjMgaW5zdGFsbC1tYW41IFwKLQlpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBrZ2NvbmZpZ0RBVEEgXAotCWluc3RhbGwtcGtnaW5jbHVkZUhFQURFUlMgaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIFwKLQlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAotCW1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIFwKLQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCi0JcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gXAotCXVuaW5zdGFsbC1iaW5TQ1JJUFRTIHVuaW5zdGFsbC1ob29rIHVuaW5zdGFsbC1saWJMVExJQlJBUklFUyBcCi0JdW5pbnN0YWxsLW1hbiB1bmluc3RhbGwtbWFuMyB1bmluc3RhbGwtbWFuNSBcCi0JdW5pbnN0YWxsLXBrZ2NvbmZpZ0RBVEEgdW5pbnN0YWxsLXBrZ2luY2x1ZGVIRUFERVJTCi0KLQotQEhBVkVfTERfVkVSU0lPTl9TQ1JJUFRfVFJVRUAgICMgVmVyc2lvbmVkIHN5bWJvbHMgYW5kIHJlc3RyaWN0ZWQgZXhwb3J0cwotQEhBVkVfTERfVkVSU0lPTl9TQ1JJUFRfRkFMU0VAICAjIE9ubHkgcmVzdHJpY3RlZCBleHBvcnRzIHdoZW4gcG9zc2libGUKLQotJChQTkdMSUJfQkFTRU5BTUUpLnBjOiBsaWJwbmcucGMKLQljcCBsaWJwbmcucGMgJEAKLQotJChQTkdMSUJfQkFTRU5BTUUpLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJEAKLQotbGlicG5nLnN5bTogcG5nLmggcG5nY29uZi5oCi0Jcm0gLWYgJEAgJEAubmV3Ci0JJChDUFApIEBMSUJQTkdfREVGSU5FU0AgJChDUFBGTEFHUykgLURQTkdfQlVJTERTWU1TICQoc3JjZGlyKS9wbmcuaCB8IFwKLQkJJChTRUQpIC1uIC1lIFwKLQkJJ3N8Xi4qUE5HX0ZVTkNUSU9OX0VYUE9SVFsgCV0qXChbJChBTildKlwpLiokJHwkKFNZTUJPTF9QUkVGSVgpXDF8cCcgXAotCQktZSAnc3xeLipQTkdfREFUQV9FWFBPUlRbIAldKlwoWyQoQU4pXSpcKS4qJCR8JChTWU1CT0xfUFJFRklYKVwxfHAnIFwKLQkJCT4kQC5uZXcKLQltdiAkQC5uZXcgJEAKLQotbGlicG5nLnZlcnM6IGxpYnBuZy5zeW0KLQlybSAtZiAkQCAkQC5uZXcKLQllY2hvIFBOR0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfMCAne2dsb2JhbDonID4gJEAubmV3Ci0JJChTRUQpIHMvJCQvXDsvIGxpYnBuZy5zeW0gPj4gJEAubmV3Ci0JZWNobyAnbG9jYWw6ICo7IH07JyA+PiAkQC5uZXcKLQltdiAkQC5uZXcgJEAKLQotdGVzdDogY2hlY2sKLQotIyBpbnN0YWxsIHRoZSAuLi4vaW5jbHVkZSBoZWFkZXJzIGFzIGxpbmtzIHRvIHRoZSBuZXcgb25lcwotaW5zdGFsbC1kYXRhLWhvb2s6Ci0JY2QgJChERVNURElSKSQoaW5jbHVkZWRpcik7IHJtIC1mIHBuZy5oIHBuZ2NvbmYuaAotCWNkICQoREVTVERJUikkKGluY2x1ZGVkaXIpOyAkKExOX1MpICQoUE5HTElCX0JBU0VOQU1FKS9wbmcuaCBwbmcuaAotCWNkICQoREVTVERJUikkKGluY2x1ZGVkaXIpOyAkKExOX1MpICQoUE5HTElCX0JBU0VOQU1FKS9wbmdjb25mLmggXAotCQlwbmdjb25mLmgKLQljZCAkKERFU1RESVIpJChwa2djb25maWdkaXIpOyBybSAtZiBsaWJwbmcucGMKLQljZCAkKERFU1RESVIpJChwa2djb25maWdkaXIpOyAkKExOX1MpICQoUE5HTElCX0JBU0VOQU1FKS5wYyBsaWJwbmcucGMKLQotIyBkbyBldmlsIHRoaW5ncyB0byBsaWJwbmcgdG8gY2F1c2UgbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQCB0byBiZSB1c2VkCi1pbnN0YWxsLWV4ZWMtaG9vazoKLQljZCAkKERFU1RESVIpJChiaW5kaXIpOyBybSAtZiBsaWJwbmctY29uZmlnCi0JY2QgJChERVNURElSKSQoYmluZGlyKTsgJChMTl9TKSAkKFBOR0xJQl9CQVNFTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcKLQlAc2V0IC14O1wKLQljZCAkKERFU1RESVIpJChsaWJkaXIpO1wKLQlmb3IgZXh0IGluIGEgbGEgc28gc28uQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQC5AUE5HTElCX1JFTEVBU0VAIHNsIGR5bGliIGRsbC5hOyBkb1wKLQkJcm0gLWYgbGlicG5nLiQkZXh0O1wKLSAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICQoUE5HTElCX0JBU0VOQU1FKS4kJGV4dDsgdGhlblwKLSAgICAgICAgICAgICAgICAgICAgICAgJChMTl9TKSAkKFBOR0xJQl9CQVNFTkFNRSkuJCRleHQgbGlicG5nLiQkZXh0O1wKLSAgICAgICAgICAgICAgICBmaTtcCi0JZG9uZQotCi11bmluc3RhbGwtaG9vazoKLQljZCAkKERFU1RESVIpJChpbmNsdWRlZGlyKTsgcm0gLWYgcG5nLmggcG5nY29uZi5oCi0Jcm0gLWYgJChERVNURElSKSQocGtnY29uZmlnZGlyKS9saWJwbmcucGMKLQlybSAtZiAkKERFU1RESVIpJChiaW5kaXIpL2xpYnBuZy1jb25maWcKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9SRUFETUUgYi9zcmMvbGlicG5nL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmMzY3Ni4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi1SRUFETUUgZm9yIGxpYnBuZyB2ZXJzaW9uIDEuNC4xMiAtIEp1bHkgMTAsIDIwMTIgKHNoYXJlZCBsaWJyYXJ5IDE0LjApCi1TZWUgdGhlIG5vdGUgYWJvdXQgdmVyc2lvbiBudW1iZXJzIG5lYXIgdGhlIHRvcCBvZiBwbmcuaAotCi1TZWUgSU5TVEFMTCBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBpbnN0YWxsIGxpYnBuZy4KLQotTGlicG5nIGNvbWVzIGluIHNldmVyYWwgZGlzdHJpYnV0aW9uIGZvcm1hdHMuICBHZXQgbGlicG5nLSoudGFyLmd6LAotbGlicG5nLSoudGFyLnh6IG9yIGxpYnBuZy0qLnRhci5iejIgaWYgeW91IHdhbnQgVU5JWC1zdHlsZSBsaW5lIGVuZGluZ3MKLWluIHRoZSB0ZXh0IGZpbGVzLCBvciBscG5nKi56aXAgaWYgeW91IHdhbnQgRE9TLXN0eWxlIGxpbmUgZW5kaW5ncy4KLQotVmVyc2lvbiAwLjg5IHdhcyB0aGUgZmlyc3Qgb2ZmaWNpYWwgcmVsZWFzZSBvZiBsaWJwbmcuICBEb24ndCBsZXQgdGhlCi1mYWN0IHRoYXQgaXQncyB0aGUgZmlyc3QgcmVsZWFzZSBmb29sIHlvdS4gIFRoZSBsaWJwbmcgbGlicmFyeSBoYXMgYmVlbiBpbgotZXh0ZW5zaXZlIHVzZSBhbmQgdGVzdGluZyBzaW5jZSBtaWQtMTk5NS4gIEJ5IGxhdGUgMTk5NyBpdCBoYWQKLWZpbmFsbHkgZ290dGVuIHRvIHRoZSBzdGFnZSB3aGVyZSB0aGVyZSBoYWRuJ3QgYmVlbiBzaWduaWZpY2FudAotY2hhbmdlcyB0byB0aGUgQVBJIGluIHNvbWUgdGltZSwgYW5kIHBlb3BsZSBoYXZlIGEgYmFkIGZlZWxpbmcgYWJvdXQKLWxpYnJhcmllcyB3aXRoIHZlcnNpb25zIDwgMS4wLiAgVmVyc2lvbiAxLjAuMCB3YXMgcmVsZWFzZWQgaW4KLU1hcmNoIDE5OTguCi0KLSoqKioKLU5vdGUgdGhhdCBzb21lIG9mIHRoZSBjaGFuZ2VzIHRvIHRoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgcmVuZGVyIHRoaXMKLXZlcnNpb24gb2YgdGhlIGxpYnJhcnkgYmluYXJ5IGluY29tcGF0aWJsZSB3aXRoIGxpYnBuZy0wLjg5IG9yCi1lYXJsaWVyIHZlcnNpb25zIGlmIHlvdSBhcmUgdXNpbmcgYSBzaGFyZWQgbGlicmFyeS4gIFRoZSB0eXBlIG9mIHRoZQotImZpbGxlciIgcGFyYW1ldGVyIGZvciBwbmdfc2V0X2ZpbGxlcigpIGhhcyBjaGFuZ2VkIGZyb20gcG5nX2J5dGUgdG8KLXBuZ191aW50XzMyLCB3aGljaCB3aWxsIGFmZmVjdCBzaGFyZWQtbGlicmFyeSBhcHBsaWNhdGlvbnMgdGhhdCB1c2UKLXRoaXMgZnVuY3Rpb24uCi0KLVRvIGF2b2lkIHByb2JsZW1zIHdpdGggY2hhbmdlcyB0byB0aGUgaW50ZXJuYWxzIG9mIHBuZ19pbmZvX3N0cnVjdCwKLW5ldyBBUElzIGhhdmUgYmVlbiBtYWRlIGF2YWlsYWJsZSBpbiAwLjk1IHRvIGF2b2lkIGRpcmVjdCBhcHBsaWNhdGlvbgotYWNjZXNzIHRvIGluZm9fcHRyLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSB0aGUgcG5nX3NldF88Y2h1bms+IGFuZAotcG5nX2dldF88Y2h1bms+IGZ1bmN0aW9ucy4gIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZCB3aGVuCi1hY2Nlc3Npbmcvc3RvcmluZyB0aGUgaW5mb19zdHJ1Y3QgZGF0YSwgcmF0aGVyIHRoYW4gbWFuaXB1bGF0aW5nIGl0Ci1kaXJlY3RseSwgdG8gYXZvaWQgc3VjaCBwcm9ibGVtcyBpbiB0aGUgZnV0dXJlLgotCi1JdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSBBUElzIGRvIG5vdCBtYWtlIGN1cnJlbnQgcHJvZ3JhbXMKLXRoYXQgYWNjZXNzIHRoZSBpbmZvIHN0cnVjdCBkaXJlY3RseSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgbmV3Ci1saWJyYXJ5LiAgSG93ZXZlciwgaXQgaXMgc3Ryb25nbHkgc3VnZ2VzdGVkIHRoYXQgbmV3IHByb2dyYW1zIHVzZQotdGhlIG5ldyBBUElzIChhcyBzaG93biBpbiBleGFtcGxlLmMgYW5kIHBuZ3Rlc3QuYyksIGFuZCBvbGRlciBwcm9ncmFtcwotYmUgY29udmVydGVkIHRvIHRoZSBuZXcgZm9ybWF0LCB0byBmYWNpbGl0YXRlIHVwZ3JhZGVzIGluIHRoZSBmdXR1cmUuCi0qKioqCi0KLUFkZGl0aW9ucyBzaW5jZSAwLjkwIGluY2x1ZGUgdGhlIGFiaWxpdHkgdG8gY29tcGlsZSBsaWJwbmcgYXMgYQotV2luZG93cyBETEwsIGFuZCBuZXcgQVBJcyBmb3IgYWNjZXNzaW5nIGRhdGEgaW4gdGhlIGluZm8gc3RydWN0LgotRXhwZXJpbWVudGFsIGZ1bmN0aW9ucyBpbmNsdWRlIHRoZSBhYmlsaXR5IHRvIHNldCB3ZWlnaHRpbmcgYW5kIGNvc3QKLWZhY3RvcnMgZm9yIHJvdyBmaWx0ZXIgc2VsZWN0aW9uLCBkaXJlY3QgcmVhZHMgb2YgaW50ZWdlcnMgZnJvbSBidWZmZXJzCi1vbiBiaWctZW5kaWFuIHByb2Nlc3NvcnMgdGhhdCBzdXBwb3J0IG1pc2FsaWduZWQgZGF0YSBhY2Nlc3MsIGZhc3RlcgotbWV0aG9kcyBvZiBkb2luZyBhbHBoYSBjb21wb3NpdGlvbiwgYW5kIG1vcmUgYWNjdXJhdGUgMTYtPjggYml0IGNvbG9yCi1jb252ZXJzaW9uLgotCi1UaGUgYWRkaXRpb25zIHNpbmNlIDAuODkgaW5jbHVkZSB0aGUgYWJpbGl0eSB0byByZWFkIGZyb20gYSBQTkcgc3RyZWFtCi13aGljaCBoYXMgaGFkIHNvbWUgKG9yIGFsbCkgb2YgdGhlIHNpZ25hdHVyZSBieXRlcyByZWFkIGJ5IHRoZSBjYWxsaW5nCi1hcHBsaWNhdGlvbi4gIFRoaXMgYWxzbyBhbGxvd3MgdGhlIHJlYWRpbmcgb2YgZW1iZWRkZWQgUE5HIHN0cmVhbXMgdGhhdAotZG8gbm90IGhhdmUgdGhlIFBORyBmaWxlIHNpZ25hdHVyZS4gIEFzIHdlbGwsIGl0IGlzIG5vdyBwb3NzaWJsZSB0byBzZXQKLXRoZSBsaWJyYXJ5IGFjdGlvbiBvbiB0aGUgZGV0ZWN0aW9uIG9mIGNodW5rIENSQyBlcnJvcnMuICBJdCBpcyBwb3NzaWJsZQotdG8gc2V0IGRpZmZlcmVudCBhY3Rpb25zIGJhc2VkIG9uIHdoZXRoZXIgdGhlIENSQyBlcnJvciBvY2N1cnJlZCBpbiBhCi1jcml0aWNhbCBvciBhbiBhbmNpbGxhcnkgY2h1bmsuCi0KLVRoZSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGxpYnJhcnksIGFuZCBidWdzIGZpeGVkIGFyZSBiYXNlZCBvbiBkaXNjdXNzaW9ucwotb24gdGhlIFBORy1pbXBsZW1lbnQgbWFpbGluZyBsaXN0IGFuZCBub3Qgb24gbWF0ZXJpYWwgc3VibWl0dGVkCi1wcml2YXRlbHkgdG8gR3V5LCBBbmRyZWFzLCBvciBHbGVubi4gIFRoZXkgd2lsbCBmb3J3YXJkIGFueSBnb29kCi1zdWdnZXN0aW9ucyB0byB0aGUgbGlzdC4KLQotRm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb24gdXNpbmcgbGlicG5nLCByZWFkIGxpYnBuZy50eHQuICBGb3IKLWV4YW1wbGVzIG9mIGxpYnBuZyBpbiBhIHByb2dyYW0sIHNlZSBleGFtcGxlLmMgYW5kIHBuZ3Rlc3QuYy4gIEZvciB1c2FnZQotaW5mb3JtYXRpb24gYW5kIHJlc3RyaWN0aW9ucyAod2hhdCBsaXR0bGUgdGhleSBhcmUpIG9uIGxpYnBuZywgc2VlCi1wbmcuaC4gIEZvciBhIGRlc2NyaXB0aW9uIG9uIHVzaW5nIHpsaWIgKHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IHVzZWQgYnkKLWxpYnBuZykgYW5kIHpsaWIncyByZXN0cmljdGlvbnMsIHNlZSB6bGliLmgKLQotSSBoYXZlIGluY2x1ZGVkIGEgZ2VuZXJhbCBtYWtlZmlsZSwgYXMgd2VsbCBhcyBzZXZlcmFsIG1hY2hpbmUgYW5kCi1jb21waWxlciBzcGVjaWZpYyBvbmVzLCBidXQgeW91IG1heSBoYXZlIHRvIG1vZGlmeSBvbmUgZm9yIHlvdXIgb3duIG5lZWRzLgotCi1Zb3Ugc2hvdWxkIHVzZSB6bGliIDEuMC40IG9yIGxhdGVyIHRvIHJ1biB0aGlzLCBidXQgaXQgTUFZIHdvcmsgd2l0aAotdmVyc2lvbnMgYXMgb2xkIGFzIHpsaWIgMC45NS4gIEV2ZW4gc28sIHRoZXJlIGFyZSBidWdzIGluIG9sZGVyIHpsaWIKLXZlcnNpb25zIHdoaWNoIGNhbiBjYXVzZSB0aGUgb3V0cHV0IG9mIGludmFsaWQgY29tcHJlc3Npb24gc3RyZWFtcyBmb3IKLXNvbWUgaW1hZ2VzLiAgWW91IHdpbGwgZGVmaW5pdGVseSBuZWVkIHpsaWIgMS4wLjQgb3IgbGF0ZXIgaWYgeW91IGFyZQotdGFraW5nIGFkdmFudGFnZSBvZiB0aGUgTVMtRE9TICJmYXIiIHN0cnVjdHVyZSBhbGxvY2F0aW9uIGZvciB0aGUgc21hbGwKLWFuZCBtZWRpdW0gbWVtb3J5IG1vZGVscy4gIFlvdSBzaG91bGQgYWxzbyBub3RlIHRoYXQgemxpYiBpcyBhCi1jb21wcmVzc2lvbiBsaWJyYXJ5IHRoYXQgaXMgdXNlZnVsIGZvciBtb3JlIHRoaW5ncyB0aGFuIGp1c3QgUE5HIGZpbGVzLgotWW91IGNhbiB1c2UgemxpYiBhcyBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIGZyZWFkKCkgYW5kIGZ3cml0ZSgpIGlmCi15b3UgYXJlIHNvIGluY2xpbmVkLgotCi16bGliIHNob3VsZCBiZSBhdmFpbGFibGUgYXQgdGhlIHNhbWUgcGxhY2UgdGhhdCBsaWJwbmcgaXMsIG9yIGF0LgotZnRwOi8vZnRwLmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC96bGliCi0KLVlvdSBtYXkgYWxzbyB3YW50IGEgY29weSBvZiB0aGUgUE5HIHNwZWNpZmljYXRpb24uICBJdCBpcyBhdmFpbGFibGUKLWFzIGFuIFJGQywgYSBXM0MgUmVjb21tZW5kYXRpb24sIGFuZCBhbiBJU08vSUVDIFN0YW5kYXJkLiAgWW91IGNhbiBmaW5kCi10aGVzZSBhdCBodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9kb2N1bWVudHMvCi0KLVRoaXMgY29kZSBpcyBjdXJyZW50bHkgYmVpbmcgYXJjaGl2ZWQgYXQgbGlicG5nLnNmLm5ldCBpbiB0aGUKLVtET1dOTE9BRF0gYXJlYSwgYW5kIG9uIENvbXB1U2VydmUsIExpYiAyMCAoUE5HIFNVUFBPUlQpCi1hdCBHTyBHUkFQSFNVUC4gIElmIHlvdSBjYW4ndCBmaW5kIGl0IGluIGFueSBvZiB0aG9zZSBwbGFjZXMsCi1lLW1haWwgbWUsIGFuZCBJJ2xsIGhlbHAgeW91IGZpbmQgaXQuCi0KLUlmIHlvdSBoYXZlIGFueSBjb2RlIGNoYW5nZXMsIHJlcXVlc3RzLCBwcm9ibGVtcywgZXRjLiwgcGxlYXNlIGUtbWFpbAotdGhlbSB0byBtZS4gIEFsc28sIEknZCBhcHByZWNpYXRlIGFueSBtYWtlIGZpbGVzIG9yIHByb2plY3QgZmlsZXMsCi1hbmQgYW55IG1vZGlmaWNhdGlvbnMgeW91IG5lZWRlZCB0byBtYWtlIHRvIGdldCBsaWJwbmcgdG8gY29tcGlsZSwKLWFsb25nIHdpdGggYSAjZGVmaW5lIHZhcmlhYmxlIHRvIHRlbGwgd2hhdCBjb21waWxlci9zeXN0ZW0geW91IGFyZSBvbi4KLUlmIHlvdSBuZWVkZWQgdG8gYWRkIHRyYW5zZm9ybWF0aW9ucyB0byBsaWJwbmcsIG9yIHdpc2ggbGlicG5nIHdvdWxkCi1wcm92aWRlIHRoZSBpbWFnZSBpbiBhIGRpZmZlcmVudCB3YXksIGRyb3AgbWUgYSBub3RlIChhbmQgY29kZSwgaWYKLXBvc3NpYmxlKSwgc28gSSBjYW4gY29uc2lkZXIgc3VwcG9ydGluZyB0aGUgdHJhbnNmb3JtYXRpb24uCi1GaW5hbGx5LCBpZiB5b3UgZ2V0IGFueSB3YXJuaW5nIG1lc3NhZ2VzIHdoZW4gY29tcGlsaW5nIGxpYnBuZwotKG5vdGU6IG5vdCB6bGliKSwgYW5kIHRoZXkgYXJlIGVhc3kgdG8gZml4LCBJJ2QgYXBwcmVjaWF0ZSB0aGUKLWZpeC4gIFBsZWFzZSBtZW50aW9uICJsaWJwbmciIHNvbWV3aGVyZSBpbiB0aGUgc3ViamVjdCBsaW5lLiAgVGhhbmtzLgotCi1UaGlzIHJlbGVhc2Ugd2FzIGNyZWF0ZWQgYW5kIHdpbGwgYmUgc3VwcG9ydGVkIGJ5IG15c2VsZiAob2YgY291cnNlCi1iYXNlZCBpbiBhIGxhcmdlIHdheSBvbiBHdXkncyBhbmQgQW5kcmVhcycgZWFybGllciB3b3JrKSwgYW5kIHRoZSBQTkcKLWRldmVsb3BtZW50IGdyb3VwLgotCi1TZW5kIGNvbW1lbnRzL2NvcnJlY3Rpb25zL2NvbW1lbmRhdGlvbnMgdG8gcG5nLW1uZy1pbXBsZW1lbnQgYXQKLWxpc3RzLnNvdXJjZWZvcmdlLm5ldCAoc3Vic2NyaXB0aW9uIHJlcXVpcmVkOyB2aXNpdCAKLWh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3BuZy1tbmctaW1wbGVtZW50Ci10byBzdWJzY3JpYmUpIG9yIHRvIGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0Ci0KLVlvdSBjYW4ndCByZWFjaCBHdXksIHRoZSBvcmlnaW5hbCBsaWJwbmcgYXV0aG9yLCBhdCB0aGUgYWRkcmVzc2VzCi1naXZlbiBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzIGRvY3VtZW50LiAgSGUgYW5kIEFuZHJlYXMgd2lsbAotcmVhZCBtYWlsIGFkZHJlc3NlZCB0byB0aGUgcG5nLWltcGxlbWVudCBsaXN0LCBob3dldmVyLgotCi1QbGVhc2UgZG8gbm90IHNlbmQgZ2VuZXJhbCBxdWVzdGlvbnMgYWJvdXQgUE5HLiAgU2VuZCB0aGVtIHRvCi1wbmctbW5nLW1pc2MgYXQgbGlzdHMuc2YubmV0IChzdWJzY3JpcHRpb24gcmVxdWlyZWQ7IHZpc2l0Ci1odHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9wbmctbW5nLW1pc2MgdG8KLXN1YnNjcmliZSkuICBJZiB5b3UgaGF2ZSBhIHF1ZXN0aW9uIGFib3V0IHNvbWV0aGluZwotaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uIHRoYXQgaXMgcmVsYXRlZCB0byB1c2luZyBsaWJwbmcsIHNlbmQgaXQKLXRvIG1lLiAgU2VuZCBtZSBhbnkgcXVlc3Rpb25zIHRoYXQgc3RhcnQgd2l0aCAiSSB3YXMgdXNpbmcgbGlicG5nLAotYW5kIC4uLiIuICBJZiBpbiBkb3VidCwgc2VuZCBxdWVzdGlvbnMgdG8gbWUuICBJJ2xsIGJvdW5jZSB0aGVtCi10byBvdGhlcnMsIGlmIG5lY2Vzc2FyeS4KLQotUGxlYXNlIGRvIG5vdCBzZW5kIHN1Z2dlc3Rpb25zIG9uIGhvdyB0byBjaGFuZ2UgUE5HLiAgV2UgaGF2ZQotYmVlbiBkaXNjdXNzaW5nIFBORyBmb3Igc2l4dGVlbiB5ZWFycyBub3csIGFuZCBpdCBpcyBvZmZpY2lhbCBhbmQKLWZpbmlzaGVkLiAgSWYgeW91IGhhdmUgc3VnZ2VzdGlvbnMgZm9yIGxpYnBuZywgaG93ZXZlciwgSSdsbAotZ2xhZGx5IGxpc3Rlbi4gIEV2ZW4gaWYgeW91ciBzdWdnZXN0aW9uIGlzIG5vdCB1c2VkIGltbWVkaWF0ZWx5LAotaXQgbWF5IGJlIHVzZWQgbGF0ZXIuCi0KLUZpbGVzIGluIHRoaXMgZGlzdHJpYnV0aW9uOgotCi0gICAgICBBTk5PVU5DRSAgICAgID0+ICBBbm5vdW5jZW1lbnQgb2YgdGhpcyB2ZXJzaW9uLCB3aXRoIHJlY2VudCBjaGFuZ2VzCi0gICAgICBDSEFOR0VTICAgICAgID0+ICBEZXNjcmlwdGlvbiBvZiBjaGFuZ2VzIGJldHdlZW4gbGlicG5nIHZlcnNpb25zCi0gICAgICBLTk9XTkJVRyAgICAgID0+ICBMaXN0IG9mIGtub3duIGJ1Z3MgYW5kIGRlZmljaWVuY2llcwotICAgICAgTElDRU5TRSAgICAgICA9PiAgTGljZW5zZSB0byB1c2UgYW5kIHJlZGlzdHJpYnV0ZSBsaWJwbmcKLSAgICAgIFJFQURNRSAgICAgICAgPT4gIFRoaXMgZmlsZQotICAgICAgVE9ETyAgICAgICAgICA9PiAgVGhpbmdzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5Ci0gICAgICBZMktJTkZPICAgICAgID0+ICBTdGF0ZW1lbnQgb2YgWTJLIGNvbXBsaWFuY2UKLSAgICAgIGV4YW1wbGUuYyAgICAgPT4gIEV4YW1wbGUgY29kZSBmb3IgdXNpbmcgbGlicG5nIGZ1bmN0aW9ucwotICAgICAgbGlicG5nLjMgICAgICA9PiAgbWFudWFsIHBhZ2UgZm9yIGxpYnBuZyAoaW5jbHVkZXMgbGlicG5nLnR4dCkKLSAgICAgIGxpYnBuZy50eHQgICAgPT4gIERlc2NyaXB0aW9uIG9mIGxpYnBuZyBhbmQgaXRzIGZ1bmN0aW9ucwotICAgICAgbGlicG5ncGYuMyAgICA9PiAgbWFudWFsIHBhZ2UgZm9yIGxpYnBuZydzIHByaXZhdGUgZnVuY3Rpb25zCi0gICAgICBwbmcuNSAgICAgICAgID0+ICBtYW51YWwgcGFnZSBmb3IgdGhlIFBORyBmb3JtYXQKLSAgICAgIHBuZy5jICAgICAgICAgPT4gIEJhc2ljIGludGVyZmFjZSBmdW5jdGlvbnMgY29tbW9uIHRvIGxpYnJhcnkKLSAgICAgIHBuZy5oICAgICAgICAgPT4gIExpYnJhcnkgZnVuY3Rpb24gYW5kIGludGVyZmFjZSBkZWNsYXJhdGlvbnMKLSAgICAgIHBuZ2NvbmYuaCAgICAgPT4gIFN5c3RlbSBzcGVjaWZpYyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24KLSAgICAgIHBuZ2Vycm9yLmMgICAgPT4gIEVycm9yL3dhcm5pbmcgbWVzc2FnZSBJL08gZnVuY3Rpb25zCi0gICAgICBwbmdnZXQuYyAgICAgID0+ICBGdW5jdGlvbnMgZm9yIHJldHJpZXZpbmcgaW5mbyBmcm9tIHN0cnVjdAotICAgICAgcG5nbWVtLmMgICAgICA9PiAgTWVtb3J5IGhhbmRsaW5nIGZ1bmN0aW9ucwotICAgICAgcG5nYmFyLnBuZyAgICA9PiAgUE5HIGxvZ28sIDg4eDMxCi0gICAgICBwbmdub3cucG5nICAgID0+ICBQTkcgbG9nbywgOTh4MzEKLSAgICAgIHBuZ3ByZWFkLmMgICAgPT4gIFByb2dyZXNzaXZlIHJlYWRpbmcgZnVuY3Rpb25zCi0gICAgICBwbmdyZWFkLmMgICAgID0+ICBSZWFkIGRhdGEvaGVscGVyIGhpZ2gtbGV2ZWwgZnVuY3Rpb25zCi0gICAgICBwbmdyaW8uYyAgICAgID0+ICBMb3dlc3QtbGV2ZWwgZGF0YSByZWFkIEkvTyBmdW5jdGlvbnMKLSAgICAgIHBuZ3J0cmFuLmMgICAgPT4gIFJlYWQgZGF0YSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMKLSAgICAgIHBuZ3J1dGlsLmMgICAgPT4gIFJlYWQgZGF0YSB1dGlsaXR5IGZ1bmN0aW9ucwotICAgICAgcG5nc2V0LmMgICAgICA9PiAgRnVuY3Rpb25zIGZvciBzdG9yaW5nIGRhdGEgaW50byB0aGUgaW5mb19zdHJ1Y3QKLSAgICAgIHBuZ3Rlc3QuYyAgICAgPT4gIExpYnJhcnkgdGVzdCBwcm9ncmFtCi0gICAgICBwbmd0ZXN0LnBuZyAgID0+ICBMaWJyYXJ5IHRlc3Qgc2FtcGxlIGltYWdlCi0gICAgICBwbmd0cmFucy5jICAgID0+ICBDb21tb24gZGF0YSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMKLSAgICAgIHBuZ3dpby5jICAgICAgPT4gIExvd2VzdC1sZXZlbCB3cml0ZSBJL08gZnVuY3Rpb25zCi0gICAgICBwbmd3cml0ZS5jICAgID0+ICBIaWdoLWxldmVsIHdyaXRlIGZ1bmN0aW9ucwotICAgICAgcG5nd3RyYW4uYyAgICA9PiAgV3JpdGUgZGF0YSB0cmFuc2Zvcm1hdGlvbnMKLSAgICAgIHBuZ3d1dGlsLmMgICAgPT4gIFdyaXRlIHV0aWxpdHkgZnVuY3Rpb25zCi0gICAgICBjb250cmliICAgICAgID0+ICBDb250cmlidXRpb25zCi0gICAgICAgZ3JlZ2Jvb2sgICAgICAgICA9PiAgc291cmNlIGNvZGUgZm9yIFBORyByZWFkaW5nIGFuZCB3cml0aW5nLCBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JlZyBSb2Vsb2ZzJyAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTydSZWlsbHksIDE5OTkKLSAgICAgICBtc3ZjdGVzdCAgICAgPT4gIEJ1aWxkcyBhbmQgcnVucyBwbmd0ZXN0IHVzaW5nIGEgTVNWQyB3b3Jrc3BhY2UKLSAgICAgICBwbmdtaW51cyAgICAgPT4gIFNpbXBsZSBwbm0ycG5nIGFuZCBwbmcycG5tIHByb2dyYW1zCi0gICAgICAgcG5nc3VpdGUgICAgID0+ICBUZXN0IGltYWdlcwotICAgICAgIHZpc3VwbmcgICAgICA9PiAgQ29udGFpbnMgYSBNU1ZDIHdvcmtzcGFjZSBmb3IgVmlzdWFsUG5nCi0gICAgICBwcm9qZWN0cyAgICAgID0+ICBDb250YWlucyBwcm9qZWN0IGZpbGVzIGFuZCB3b3Jrc3BhY2VzIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRpbmcgYSBETEwKLSAgICAgICBjNWJ1aWxkZXIgICAgICAgID0+ICBDb250YWlucyBhIEJvcmxhbmQgd29ya3NwYWNlIGZvciBidWlsZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnBuZyBhbmQgemxpYgotICAgICAgIHZpc3VhbGM2ICAgICAgICAgPT4gIENvbnRhaW5zIGEgTWljcm9zb2Z0IFZpc3VhbCBDKysgKE1TVkMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NwYWNlIGZvciBidWlsZGluZyBsaWJwbmcgYW5kIHpsaWIKLSAgICAgIHNjcmlwdHMgICAgICAgPT4gIERpcmVjdG9yeSBjb250YWluaW5nIHNjcmlwdHMgZm9yIGJ1aWxkaW5nIGxpYnBuZzoKLSAgICAgICBkZXNjcmlwLm1tcyAgICAgID0+ICBWTVMgbWFrZWZpbGUgZm9yIE1NUyBvciBNTUsKLSAgICAgICBtYWtlZmlsZS5zdGQgICAgID0+ICBHZW5lcmljIFVOSVggbWFrZWZpbGUgKGNjLCBjcmVhdGVzIHN0YXRpYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnBuZy5hKQotICAgICAgIG1ha2VmaWxlLmVsZiAgICAgPT4gIExpbnV4L0VMRiBtYWtlZmlsZSBzeW1ib2wgdmVyc2lvbmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2NjLCBjcmVhdGVzIGxpYnBuZzE0LnNvLjE0LjEuNC4xMikKLSAgICAgICBtYWtlZmlsZS5saW51eCAgID0+ICBMaW51eC9FTEYgbWFrZWZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2NjLCBjcmVhdGVzIGxpYnBuZzE0LnNvLjE0LjEuNC4xMikKLSAgICAgICBtYWtlZmlsZS5nY2MgICAgID0+ICBHZW5lcmljIG1ha2VmaWxlIChnY2MsIGNyZWF0ZXMgc3RhdGljIGxpYnBuZy5hKQotICAgICAgIG1ha2VmaWxlLmtuciAgICAgPT4gIEFyY2hhaWMgVU5JWCBNYWtlZmlsZSB0aGF0IGNvbnZlcnRzIGZpbGVzIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnNpMmtuciAoUmVxdWlyZXMgYW5zaTJrbnIuYyBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwOi8vZnRwLmNzLndpc2MuZWR1L2dob3N0KQotICAgICAgIG1ha2VmaWxlLmFpeCAgICAgPT4gIEFJWCBtYWtlZmlsZQotICAgICAgIG1ha2VmaWxlLmN5Z3dpbiAgPT4gIEN5Z3dpbi9nY2MgbWFrZWZpbGUKLSAgICAgICBtYWtlZmlsZS5kYXJ3aW4gID0+ICBEYXJ3aW4gbWFrZWZpbGUKLSAgICAgICBtYWtlZmlsZS5kZWMgICAgID0+ICBERUMgQWxwaGEgVU5JWCBtYWtlZmlsZQotICAgICAgIG1ha2VmaWxlLmZyZWVic2QgPT4gIEZyZWVCU0QgbWFrZWZpbGUKLSAgICAgICBtYWtlZmlsZS5ocGdjYyAgID0+ICBIUFVYIG1ha2VmaWxlIHVzaW5nIGdjYwotICAgICAgIG1ha2VmaWxlLmhwdXggICAgPT4gIEhQVVggKDEwLjIwIGFuZCAxMS4wMCkgbWFrZWZpbGUKLSAgICAgICBtYWtlZmlsZS5ocDY0ICAgID0+ICBIUFVYICgxMC4yMCBhbmQgMTEuMDApIG1ha2VmaWxlLCA2NCBiaXQKLSAgICAgICBtYWtlZmlsZS5pYm1jICAgID0+ICBJQk0gQy9DKysgdmVyc2lvbiAzLnggZm9yIFdpbjMyIGFuZCBPUy8yIChzdGF0aWMpCi0gICAgICAgbWFrZWZpbGUuaW50ZWwgICA9PiAgSW50ZWwgQy9DKysgdmVyc2lvbiA0LjAgYW5kIGxhdGVyCi0gICAgICAgbWFrZWZpbGUubWluZ3cgICA9PiAgTWluZ3cvZ2NjIG1ha2VmaWxlCi0gICAgICAgbWFrZWZpbGUubmV0YnNkICA9PiAgTmV0QlNEL2NjIG1ha2VmaWxlLCBtYWtlcyBsaWJwbmcuc28uCi0gICAgICAgbWFrZWZpbGUubmUxNGJzZCAgPT4gIE5ldEJTRC9jYyBtYWtlZmlsZSwgbWFrZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJwbmcxNC5zbwotICAgICAgIG1ha2VmaWxlLm9wZW5ic2QgPT4gIE9wZW5CU0QgbWFrZWZpbGUKLSAgICAgICBtYWtlZmlsZS5zZ2kgICAgID0+ICBTaWxpY29uIEdyYXBoaWNzIElSSVggKGNjLCBjcmVhdGVzIHN0YXRpYyBsaWIpCi0gICAgICAgbWFrZWZpbGUuc2dnY2MgICA9PiAgU2lsaWNvbiBHcmFwaGljcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnY2MsIGNyZWF0ZXMgbGlicG5nMTQuc28uMTQuMS40LjEyKQotICAgICAgIG1ha2VmaWxlLnN1bm9zICAgPT4gIFN1biBtYWtlZmlsZQotICAgICAgIG1ha2VmaWxlLnNvbGFyaXMgPT4gIFNvbGFyaXMgMi5YIG1ha2VmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdjYywgY3JlYXRlcyBsaWJwbmcxNC5zby4xNC4xLjQuMTIpCi0gICAgICAgbWFrZWZpbGUuc285ICAgICA9PiAgU29sYXJpcyA5IG1ha2VmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdjYywgY3JlYXRlcyBsaWJwbmcxNC5zby4xNC4xLjQuMTIpCi0gICAgICAgbWFrZWZpbGUuMzJzdW51ICA9PiAgU3VuIFVsdHJhIDMyLWJpdCBtYWtlZmlsZQotICAgICAgIG1ha2VmaWxlLjY0c3VudSAgPT4gIFN1biBVbHRyYSA2NC1iaXQgbWFrZWZpbGUKLSAgICAgICBtYWtlZmlsZS5zY28gICAgID0+ICBGb3IgU0NPIE9TcjUgIEVMRiBhbmQgVW5peHdhcmUgNyB3aXRoIE5hdGl2ZSBjYwotICAgICAgIG1ha2VmaWxlLm1pcHMgICAgPT4gIE1JUFMgbWFrZWZpbGUKLSAgICAgICBtYWtlZmlsZS5hY29ybiAgID0+ICBBY29ybiBtYWtlZmlsZQotICAgICAgIG1ha2VmaWxlLmFtaWdhICAgPT4gIEFtaWdhIG1ha2VmaWxlCi0gICAgICAgc21ha2VmaWxlLnBwYyAgICA9PiAgQU1JR0Egc21ha2VmaWxlIGZvciBTQVMgQyBWNi41OC83LjAwIFBQQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyIChSZXF1aXJlcyBTQ09QVElPTlMsIGNvcGllZCBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cy9TQ09QVElPTlMucHBjKQotICAgICAgIG1ha2VmaWxlLmF0YXJpICAgPT4gIEF0YXJpIG1ha2VmaWxlCi0gICAgICAgbWFrZWZpbGUuYmVvcyAgICA9PiAgQkVPUyBtYWtlZmlsZSBmb3IgWDg2Ci0gICAgICAgbWFrZWZpbGUuYm9yICAgICA9PiAgQm9ybGFuZCBtYWtlZmlsZSAodXNlcyBiY2MpCi0gICAgICAgbWFrZWZpbGUuYmMzMiAgICA9PiAgMzItYml0IEJvcmxhbmQgQysrIChhbGwgbW9kdWxlcyBjb21waWxlZCBpbiBDIG1vZGUpCi0gICAgICAgbWFrZWZpbGUudGMzICAgICA9PiAgVHVyYm8gQyAzLjAgbWFrZWZpbGUKLSAgICAgICBtYWtlZmlsZS5kajIgICAgID0+ICBESkdQUCAyIG1ha2VmaWxlCi0gICAgICAgbWFrZWZpbGUubXNjICAgICA9PiAgTWljcm9zb2Z0IEMgbWFrZWZpbGUKLSAgICAgICBtYWtlZmlsZS52Y3dpbjMyID0+ICBtYWtlZmlsZSBmb3IgTWljcm9zb2Z0IFZpc3VhbCBDKysgNC4wIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVyIChkb2VzIG5vdCB1c2UgYXNzZW1ibGVyIGNvZGUpCi0gICAgICAgbWFrZWZpbGUub3MyICAgICA9PiAgT1MvMiBNYWtlZmlsZSAoZ2NjIGFuZCBlbXgsIHJlcXVpcmVzIHBuZ29zMi5kZWYpCi0gICAgICAgcG5nMzJjZS5kZWYgICAgICA9PiAgbW9kdWxlIGRlZmluaXRpb24gZm9yIG1ha2VmaWxlLmNlZ2NjZwotICAgICAgIHBuZ29zMi5kZWYgICAgICAgPT4gIE9TLzIgbW9kdWxlIGRlZmluaXRpb24gZmlsZSB1c2VkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZWZpbGUub3MyCi0gICAgICAgcG5nd2luLmRlZiAgICAgICA9PiAgbW9kdWxlIGRlZmluaXRpb24gZmlsZSB1c2VkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZWZpbGUuY3lnd2luIGFuZCBtYWtlZmlsZS5taW5ndwotICAgICAgIG1ha2VmaWxlLndhdGNvbSAgPT4gIFdhdGNvbSAxMGErIE1ha2VmaWxlLCAzMi1iaXQgZmxhdCBtZW1vcnkgbW9kZWwKLSAgICAgICBtYWtldm1zLmNvbSAgICAgID0+ICBWTVMgYnVpbGQgc2NyaXB0Ci0gICAgICAgU0NPUFRJT05TLnBwYyAgICA9PiAgVXNlZCB3aXRoIHNtYWtlZmlsZS5wcGMKLQotR29vZCBsdWNrLCBhbmQgaGFwcHkgY29kaW5nLgotCi0tR2xlbm4gUmFuZGVycy1QZWhyc29uIChjdXJyZW50IG1haW50YWluZXIsIHNpbmNlIDE5OTgpCi0gSW50ZXJuZXQ6IGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0Ci0KLS1BbmRyZWFzIEVyaWMgRGlsZ2VyIChmb3JtZXIgbWFpbnRhaW5lciwgMTk5Ni0xOTk3KQotIEludGVybmV0OiBhZGlsZ2VyIGF0IGVuZWwudWNhbGdhcnkuY2EKLSBXZWI6IGh0dHA6Ly93d3ctbWRkc3AuZW5lbC51Y2FsZ2FyeS5jYS9QZW9wbGUvYWRpbGdlci8KLQotLUd1eSBFcmljIFNjaGFsbmF0IChvcmlnaW5hbCBhdXRob3IgYW5kIGZvcm1lciBtYWludGFpbmVyLCAxOTk1LTE5OTYpCi0gKGZvcm1lcmx5IG9mIEdyb3VwIDQyLCBJbmMpCi0gSW50ZXJuZXQ6IGdzY2hhbCBhdCBpbmZpbmV0LmNvbQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9SRUFETUUub3B0aXBuZy50eHQgYi9zcmMvbGlicG5nL1JFQURNRS5vcHRpcG5nLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZkYTdlNi4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL1JFQURNRS5vcHRpcG5nLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU5hbWU6IGxpYnBuZwotU3VtbWFyeTogVGhlIFBORyByZWZlcmVuY2UgbGlicmFyeQotQXV0aG9yczogR2xlbm4gUmFuZGVycy1QZWhyc29uIGV0IGFsLgotVmVyc2lvbjogMS40LjEyCi1MaWNlbnNlOiB0aGUgbGlicG5nIGxpY2Vuc2UgKHpsaWItbGlrZSk7IHNlZSBMSUNFTlNFCi1VUkw6IGh0dHA6Ly9saWJwbmcub3JnLwotCi1DaGFuZ2VzOgotLSBEZWZpbmVkIFBOR19VU0VSX0NPTkZJRyBpbiBwbmdjb25mLmguCi0tIEFkZGVkIHBuZ3Vzci5oLgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9UT0RPIGIvc3JjL2xpYnBuZy9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWY4ZDgyLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi1UT0RPIC0gbGlzdCBvZiB0aGluZ3MgdG8gZG8gZm9yIGxpYnBuZzoKLQotRmluYWwgYnVnIGZpeGVzLgotSW1wcm92ZSBBUEkgYnkgaGlkaW5nIHRoZSBwbmdfc3RydWN0IGFuZCBwbmdfaW5mbyBzdHJ1Y3RzLgotRmluaXNoIHdvcmsgb24gdGhlIG5vLWZsb2F0aW5nLXBvaW50IHZlcnNpb24gKGluY2x1ZGluZyBnYW1tYSBjb21wZW5zYXRpb24pCi1CZXR0ZXIgQysrIHdyYXBwZXIvZnVsbCBDKysgaW1wbGVtZW50YXRpb24/Ci1GaXggcHJvYmxlbSB3aXRoIEMrKyBhbmQgRVhURVJOICJDIi4KLWNIUk0gdHJhbnNmb3JtYXRpb24uCi1JbXByb3ZlIHNldGptcC9sb25nam1wIHVzYWdlIG9yIHJlbW92ZSBpdCBpbiBmYXZvciBvZiByZXR1cm5pbmcgZXJyb3IgY29kZXMuCi1BZGQgImdyYXlzY2FsZS0+cGFsZXR0ZSIgdHJhbnNmb3JtYXRpb24gYW5kICJwYWxldHRlLT5ncmF5c2NhbGUiIGRldGVjdGlvbi4KLUltcHJvdmVkIHF1YW50aXppbmcgYW5kIGRpdGhlcmluZy4KLU11bHRpLWxpbmd1YWwgZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZSBzdXBwb3J0LgotQ29tcGxldGUgc1JHQiB0cmFuc2Zvcm1hdGlvbiAocHJlc2VudGx5IGl0IHNpbXBseSB1c2VzIGdhbW1hPTAuNDU0NTUpLgotTWFuIHBhZ2VzIGZvciBmdW5jdGlvbiBjYWxscy4KLUJldHRlciBkb2N1bWVudGF0aW9uLgotQmV0dGVyIGZpbHRlciBzZWxlY3Rpb24KLSAgIChjb3VudGluZyBodWZmbWFuIGJpdHMvcHJlY29tcHJlc3Npb24/ICBmaWx0ZXIgaW5lcnRpYT8gIGZpbHRlciBjb3N0cz8pLgotSGlzdG9ncmFtIGNyZWF0aW9uLgotVGV4dCBjb252ZXJzaW9uIGJldHdlZW4gZGlmZmVyZW50IGNvZGUgcGFnZXMgKExhdGluLTEgLT4gTWFjIGFuZCBET1MpLgotQnVpbGQgZ2FtbWEgdGFibGVzIHVzaW5nIGZpeGVkIHBvaW50IChhbmQgZG8gYXdheSB3aXRoIGZsb2F0aW5nIHBvaW50IGVudGlyZWx5KS4KLUF2b2lkIGJ1aWxkaW5nIGdhbW1hIHRhYmxlcyB3aGVuZXZlciBwb3NzaWJsZS4KLVVzZSBncmVhdGVyIHByZWNpc2lvbiB3aGVuIGNoYW5naW5nIHRvIGxpbmVhciBnYW1tYSBmb3IgY29tcG9zaXRpbmcgYWdhaW5zdAotICBiYWNrZ3JvdW5kIGFuZCBkb2luZyByZ2ItdG8tZ3JheSB0cmFuc2Zvcm1hdGlvbi4KLUludmVzdGlnYXRlIHByZS1pbmNyZW1lbnRlZCBsb29wIGNvdW50ZXJzIGFuZCBvdGhlciBsb29wIGNvbnN0cnVjdGlvbnMuCi1BZGQgaW50ZXJwb2xhdGVkIG1ldGhvZCBvZiBoYW5kbGluZyBpbnRlcmxhY2luZy4KLVByb3ZpZGUgZm9yIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIG9mIDE2LWJpdCBzdXBwb3J0IChleGNlcHQgZm9yIHRoZQotICBpbml0aWFsIHN0cmlwcGluZyBkb3duIHRvIDgtYml0cyB3aGVuIHJlYWRpbmcgYSAxNi1iaXQgUE5HIGRhdGFzdHJlYW0pLgotU3dpdGNoIHRvIHRoZSBzaW1wbGVyIHpsaWIgKHpsaWIvbGlicG5nKSBsaWNlbnNlIGlmIGxlZ2FsbHkgcG9zc2libGUuCi0KLSovCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2FjbG9jYWwubTQgYi9zcmMvbGlicG5nL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYjVkMmIuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9hY2xvY2FsLm00CisrKyAvZGV2L251bGwKQEAgLTEsOTAzNiArMCwwIEBACi0jIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS4xMS4xIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsCi0jIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1tNF9pZm5kZWYoW0FDX0FVVE9DT05GX1ZFUlNJT05dLAotICBbbTRfY29weShbbTRfUEFDS0FHRV9WRVJTSU9OXSwgW0FDX0FVVE9DT05GX1ZFUlNJT05dKV0pZG5sCi1tNF9pZihtNF9kZWZuKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSksIFsyLjY1XSwsCi1bbTRfd2FybmluZyhbdGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgZm9yIGF1dG9jb25mIDIuNjUuCi1Zb3UgaGF2ZSBhbm90aGVyIHZlcnNpb24gb2YgYXV0b2NvbmYuICBJdCBtYXkgd29yaywgYnV0IGlzIG5vdCBndWFyYW50ZWVkIHRvLgotSWYgeW91IGhhdmUgcHJvYmxlbXMsIHlvdSBtYXkgbmVlZCB0byByZWdlbmVyYXRlIHRoZSBidWlsZCBzeXN0ZW0gZW50aXJlbHkuCi1UbyBkbyBzbywgdXNlIHRoZSBwcm9jZWR1cmUgZG9jdW1lbnRlZCBieSB0aGUgcGFja2FnZSwgdHlwaWNhbGx5IGBhdXRvcmVjb25mJy5dKV0pCi0KLSMgbGlidG9vbC5tNCAtIENvbmZpZ3VyZSBsaWJ0b29sIGZvciB0aGUgaG9zdCBzeXN0ZW0uIC0qLUF1dG9jb25mLSotCi0jCi0jICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LAotIyAgICAgICAgICAgICAgICAgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0jICAgICAgICAgICAgICAgICBJbmMuCi0jICAgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCwgMTk5NgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcwotIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLW00X2RlZmluZShbX0xUX0NPUFlJTkddLCBbZG5sCi0jICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LAotIyAgICAgICAgICAgICAgICAgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0jICAgICAgICAgICAgICAgICBJbmMuCi0jICAgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCwgMTk5NgotIwotIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sLgotIwotIyBHTlUgTGlidG9vbCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotIyBpZiB5b3UgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gb3IgbGlicmFyeSB0aGF0Ci0jIGlzIGJ1aWx0IHVzaW5nIEdOVSBMaWJ0b29sLCB5b3UgbWF5IGluY2x1ZGUgdGhpcyBmaWxlIHVuZGVyIHRoZQotIyBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLSMKLSMgR05VIExpYnRvb2wgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIEdOVSBMaWJ0b29sOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgYSBjb3B5Ci0jIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sLCBvcgotIyBvYnRhaW5lZCBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0jIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotXSkKLQotIyBzZXJpYWwgNTcgTFRfSU5JVAotCi0KLSMgTFRfUFJFUkVRKFZFUlNJT04pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb21wbGFpbiBhbmQgZXhpdCBpZiB0aGlzIGxpYnRvb2wgdmVyc2lvbiBpcyBsZXNzIHRoYXQgVkVSU0lPTi4KLW00X2RlZnVuKFtMVF9QUkVSRVFdLAotW200X2lmKG00X3ZlcnNpb25fY29tcGFyZShtNF9kZWZuKFtMVF9QQUNLQUdFX1ZFUlNJT05dKSwgWyQxXSksIC0xLAotICAgICAgIFttNF9kZWZhdWx0KFskM10sCi0JCSAgIFttNF9mYXRhbChbTGlidG9vbCB2ZXJzaW9uICQxIG9yIGhpZ2hlciBpcyByZXF1aXJlZF0sCi0JCSAgICAgICAgICAgICA2MyldKV0sCi0gICAgICAgWyQyXSldKQotCi0KLSMgX0xUX0NIRUNLX0JVSUxERElSCi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb21wbGFpbiBpZiB0aGUgYWJzb2x1dGUgYnVpbGQgZGlyZWN0b3J5IG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzCi1tNF9kZWZ1bihbX0xUX0NIRUNLX0JVSUxERElSXSwKLVtjYXNlIGBwd2RgIGluCi0gICpcICogfCAqXAkqKQotICAgIEFDX01TR19XQVJOKFtMaWJ0b29sIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIHdoaXRlc3BhY2UgaW4gYHB3ZGBdKSA7OwotZXNhYwotXSkKLQotCi0jIExUX0lOSVQoW09QVElPTlNdKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtMVF9JTklUXSwKLVtBQ19QUkVSRVEoWzIuNThdKWRubCBXZSB1c2UgQUNfSU5DTFVERVNfREVGQVVMVAotQUNfUkVRVUlSRShbQUNfQ09ORklHX0FVWF9ESVJfREVGQVVMVF0pZG5sCi1BQ19CRUZPUkUoWyQwXSwgW0xUX0xBTkddKWRubAotQUNfQkVGT1JFKFskMF0sIFtMVF9PVVRQVVRdKWRubAotQUNfQkVGT1JFKFskMF0sIFtMVERMX0lOSVRdKWRubAotbTRfcmVxdWlyZShbX0xUX0NIRUNLX0JVSUxERElSXSlkbmwKLQotZG5sIEF1dG9jb25mIGRvZXNuJ3QgY2F0Y2ggdW5leHBhbmRlZCBMVF8gbWFjcm9zIGJ5IGRlZmF1bHQ6Ci1tNF9wYXR0ZXJuX2ZvcmJpZChbXl8/TFRfW0EtWl9dKyRdKWRubAotbTRfcGF0dGVybl9hbGxvdyhbXihfTFRfRU9GfExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1d8TFRfTVVMVElfTU9EVUxFKSRdKWRubAotZG5sIGFjbG9jYWwgZG9lc24ndCBwdWxsIGx0b3B0aW9ucy5tNCwgbHRzdWdhci5tNCwgb3IgbHR2ZXJzaW9uLm00Ci1kbmwgdW5sZXNzIHdlIHJlcXVpcmUgYW4gQUNfREVGVU5lZCBtYWNybzoKLUFDX1JFUVVJUkUoW0xUT1BUSU9OU19WRVJTSU9OXSlkbmwKLUFDX1JFUVVJUkUoW0xUU1VHQVJfVkVSU0lPTl0pZG5sCi1BQ19SRVFVSVJFKFtMVFZFUlNJT05fVkVSU0lPTl0pZG5sCi1BQ19SRVFVSVJFKFtMVE9CU09MRVRFX1ZFUlNJT05dKWRubAotbTRfcmVxdWlyZShbX0xUX1BST0dfTFRNQUlOXSlkbmwKLQotX0xUX1NIRUxMX0lOSVQoW1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9XSkKLQotZG5sIFBhcnNlIE9QVElPTlMKLV9MVF9TRVRfT1BUSU9OUyhbJDBdLCBbJDFdKQotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRsdG1haW4iCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLUFDX1NVQlNUKExJQlRPT0wpZG5sCi0KLV9MVF9TRVRVUAotCi0jIE9ubHkgZXhwYW5kIG9uY2U6Ci1tNF9kZWZpbmUoW0xUX0lOSVRdKQotXSkjIExUX0lOSVQKLQotIyBPbGQgbmFtZXM6Ci1BVV9BTElBUyhbQUNfUFJPR19MSUJUT09MXSwgW0xUX0lOSVRdKQotQVVfQUxJQVMoW0FNX1BST0dfTElCVE9PTF0sIFtMVF9JTklUXSkKLWRubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKLWRubCBBQ19ERUZVTihbQUNfUFJPR19MSUJUT09MXSwgW10pCi1kbmwgQUNfREVGVU4oW0FNX1BST0dfTElCVE9PTF0sIFtdKQotCi0KLSMgX0xUX0NDX0JBU0VOQU1FKENDKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENhbGN1bGF0ZSBjY19iYXNlbmFtZS4gIFNraXAga25vd24gY29tcGlsZXIgd3JhcHBlcnMgYW5kIGNyb3NzLXByZWZpeC4KLW00X2RlZnVuKFtfTFRfQ0NfQkFTRU5BTUVdLAotW2ZvciBjY190ZW1wIGluICQxIiI7IGRvCi0gIGNhc2UgJGNjX3RlbXAgaW4KLSAgICBjb21waWxlIHwgKltbXFwvXV1jb21waWxlIHwgY2NhY2hlIHwgKltbXFwvXV1jY2FjaGUgKSA7OwotICAgIGRpc3RjYyB8ICpbW1xcL11dZGlzdGNjIHwgcHVyaWZ5IHwgKltbXFwvXV1wdXJpZnkgKSA7OwotICAgIFwtKikgOzsKLSAgICAqKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWNjX2Jhc2VuYW1lPWAkRUNITyAiJGNjX3RlbXAiIHwgJFNFRCAicyUuKi8lJTsgcyVeJGhvc3RfYWxpYXMtJSUiYAotXSkKLQotCi0jIF9MVF9GSUxFVVRJTFNfREVGQVVMVFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBJdCBpcyBva2F5IHRvIHVzZSB0aGVzZSBmaWxlIGNvbW1hbmRzIGFuZCBhc3N1bWUgdGhleSBoYXZlIGJlZW4gc2V0Ci0jIHNlbnNpYmx5IGFmdGVyIGBtNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSknLgotbTRfZGVmdW4oW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdLAotWzogJHtDUD0iY3AgLWYifQotOiAke01WPSJtdiAtZiJ9Ci06ICR7Uk09InJtIC1mIn0KLV0pIyBfTFRfRklMRVVUSUxTX0RFRkFVTFRTCi0KLQotIyBfTFRfU0VUVVAKLSMgLS0tLS0tLS0tCi1tNF9kZWZ1bihbX0xUX1NFVFVQXSwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotQUNfUkVRVUlSRShbX0xUX1BSRVBBUkVfU0VEX1FVT1RFX1ZBUlNdKWRubAotQUNfUkVRVUlSRShbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdKWRubAotCi1fTFRfREVDTChbXSwgW2hvc3RfYWxpYXNdLCBbMF0sIFtUaGUgaG9zdCBzeXN0ZW1dKWRubAotX0xUX0RFQ0woW10sIFtob3N0XSwgWzBdKWRubAotX0xUX0RFQ0woW10sIFtob3N0X29zXSwgWzBdKWRubAotZG5sCi1fTFRfREVDTChbXSwgW2J1aWxkX2FsaWFzXSwgWzBdLCBbVGhlIGJ1aWxkIHN5c3RlbV0pZG5sCi1fTFRfREVDTChbXSwgW2J1aWxkXSwgWzBdKWRubAotX0xUX0RFQ0woW10sIFtidWlsZF9vc10sIFswXSlkbmwKLWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtMVF9QQVRIX0xEXSlkbmwKLUFDX1JFUVVJUkUoW0xUX1BBVEhfTk1dKWRubAotZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAotdGVzdCAteiAiJExOX1MiICYmIExOX1M9ImxuIC1zIgotX0xUX0RFQ0woW10sIFtMTl9TXSwgWzFdLCBbV2hldGhlciB3ZSBuZWVkIHNvZnQgb3IgaGFyZCBsaW5rc10pZG5sCi1kbmwKLUFDX1JFUVVJUkUoW0xUX0NNRF9NQVhfTEVOXSlkbmwKLV9MVF9ERUNMKFtvYmpleHRdLCBbYWNfb2JqZXh0XSwgWzBdLCBbT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpXSlkbmwKLV9MVF9ERUNMKFtdLCBbZXhlZXh0XSwgWzBdLCBbRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpXSlkbmwKLWRubAotbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCi1tNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVNdKWRubAotbTRfcmVxdWlyZShbX0xUX0NNRF9SRUxPQURdKWRubAotbTRfcmVxdWlyZShbX0xUX0NIRUNLX01BR0lDX01FVEhPRF0pZG5sCi1tNF9yZXF1aXJlKFtfTFRfQ01EX09MRF9BUkNISVZFXSlkbmwKLW00X3JlcXVpcmUoW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdKWRubAotCi1fTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbCi0jIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyCi0jIGNvbW1hbmRzIHRocm91Z2ggd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcyBJTklULgotaWYgdGVzdCAtbiAiXCR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCi0gICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZmkKLV0pCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgotICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWZpCi0KLV9MVF9DSEVDS19PQkpESVIKLQotbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDMqKQotICAjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKLSAgIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCi0gICMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLSAgaWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCi0gICAgQ09MTEVDVF9OQU1FUz0KLSAgICBleHBvcnQgQ09MTEVDVF9OQU1FUwotICBmaQotICA7OwotZXNhYwotCi0jIEdsb2JhbCB2YXJpYWJsZXM6Ci1vZmlsZT1saWJ0b29sCi1jYW5fYnVpbGRfc2hhcmVkPXllcwotCi0jIEFsbCBrbm93biBsaW5rZXJzIHJlcXVpcmUgYSBgLmEnIGFyY2hpdmUgZm9yIHN0YXRpYyBsaW5raW5nIChleGNlcHQgTVNWQywKLSMgd2hpY2ggbmVlZHMgJy5saWInKS4KLWxpYmV4dD1hCi0KLXdpdGhfZ251X2xkPSIkbHRfY3ZfcHJvZ19nbnVfbGQiCi0KLW9sZF9DQz0iJENDIgotb2xkX0NGTEFHUz0iJENGTEFHUyIKLQotIyBTZXQgc2FuZSBkZWZhdWx0cyBmb3IgdmFyaW91cyB2YXJpYWJsZXMKLXRlc3QgLXogIiRDQyIgJiYgQ0M9Y2MKLXRlc3QgLXogIiRMVENDIiAmJiBMVENDPSRDQwotdGVzdCAteiAiJExUQ0ZMQUdTIiAmJiBMVENGTEFHUz0kQ0ZMQUdTCi10ZXN0IC16ICIkTEQiICYmIExEPWxkCi10ZXN0IC16ICIkYWNfb2JqZXh0IiAmJiBhY19vYmpleHQ9bwotCi1fTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCi0KLSMgT25seSBwZXJmb3JtIHRoZSBjaGVjayBmb3IgZmlsZSwgaWYgdGhlIGNoZWNrIG1ldGhvZCByZXF1aXJlcyBpdAotdGVzdCAteiAiJE1BR0lDX0NNRCIgJiYgTUFHSUNfQ01EPWZpbGUKLWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCi1maWxlX21hZ2ljKikKLSAgaWYgdGVzdCAiJGZpbGVfbWFnaWNfY21kIiA9ICckTUFHSUNfQ01EJzsgdGhlbgotICAgIF9MVF9QQVRIX01BR0lDCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLSMgVXNlIEMgZm9yIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4gdGhlIGxpYnRvb2wgc2NyaXB0Ci1MVF9TVVBQT1JURURfVEFHKFtDQ10pCi1fTFRfTEFOR19DX0NPTkZJRwotX0xUX0xBTkdfREVGQVVMVF9DT05GSUcKLV9MVF9DT05GSUdfQ09NTUFORFMKLV0pIyBfTFRfU0VUVVAKLQotCi0jIF9MVF9QUkVQQVJFX1NFRF9RVU9URV9WQVJTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIERlZmluZSBhIGZldyBzZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscCB1cyBkbyByb2J1c3QgcXVvdGluZy4KLW00X2RlZnVuKFtfTFRfUFJFUEFSRV9TRURfUVVPVEVfVkFSU10sCi1bIyBCYWNrc2xhc2hpZnkgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbgotIyBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1zZWRfcXVvdGVfc3Vic3Q9J3MvXChbWyJgJFxcXV1cKS9cXFwxL2cnCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgotZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1siYFxcXV1cKS9cXFwxL2cnCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaGVsbCB2YXJpYWJsZSBpbiBhCi0jIGRvdWJsZV9xdW90ZV9zdWJzdCdlZCBzdHJpbmcuCi1kZWxheV92YXJpYWJsZV9zdWJzdD0ncy9cXFxcXFxcXFxcXCQvXFxcXFxcJC9nJwotCi0jIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2luZ2xlIHF1b3RlLgotZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0PSdzLydcJycvJ1wnXFxcXFxcXCdcJycvZycKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGF2b2lkIGFjY2lkZW50YWwgZ2xvYmJpbmcgaW4gZXZhbGVkIGV4cHJlc3Npb25zCi1ub19nbG9iX3N1YnN0PSdzL1wqL1xcXCovZycKLV0pCi0KLSMgX0xUX1BST0dfTFRNQUlOCi0jIC0tLS0tLS0tLS0tLS0tLQotIyBOb3RlIHRoYXQgdGhpcyBjb2RlIGlzIGNhbGxlZCBib3RoIGZyb20gYGNvbmZpZ3VyZScsIGFuZCBgY29uZmlnLnN0YXR1cycKLSMgbm93IHRoYXQgd2UgdXNlIEFDX0NPTkZJR19DT01NQU5EUyB0byBnZW5lcmF0ZSBsaWJ0b29sLiAgTm90YWJseSwKLSMgYGNvbmZpZy5zdGF0dXMnIGhhcyBubyB2YWx1ZSBmb3IgYWNfYXV4X2RpciB1bmxlc3Mgd2UgYXJlIHVzaW5nIEF1dG9tYWtlLAotIyBzbyB3ZSBwYXNzIGEgY29weSBhbG9uZyB0byBtYWtlIHN1cmUgaXQgaGFzIGEgc2Vuc2libGUgdmFsdWUgYW55d2F5LgotbTRfZGVmdW4oW19MVF9QUk9HX0xUTUFJTl0sCi1bbTRfaWZkZWYoW0FDX1JFUVVJUkVfQVVYX0ZJTEVdLCBbQUNfUkVRVUlSRV9BVVhfRklMRShbbHRtYWluLnNoXSldKWRubAotX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW2FjX2F1eF9kaXI9JyRhY19hdXhfZGlyJ10pCi1sdG1haW49IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLV0pIyBfTFRfUFJPR19MVE1BSU4KLQotCi0KLSMgU28gdGhhdCB3ZSBjYW4gcmVjcmVhdGUgYSBmdWxsIGxpYnRvb2wgc2NyaXB0IGluY2x1ZGluZyBhZGRpdGlvbmFsCi0jIHRhZ3MsIHdlIGFjY3VtdWxhdGUgdGhlIGNodW5rcyBvZiBjb2RlIHRvIHNlbmQgdG8gQUNfQ09ORklHX0NPTU1BTkRTCi0jIGluIG1hY3JvcyBhbmQgdGhlbiBtYWtlIGEgc2luZ2xlIGNhbGwgYXQgdGhlIGVuZCB1c2luZyB0aGUgYGxpYnRvb2wnCi0jIGxhYmVsLgotCi0KLSMgX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW0lOSVQtQ09NTUFORFNdKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFJlZ2lzdGVyIElOSVQtQ09NTUFORFMgdG8gYmUgcGFzc2VkIHRvIEFDX0NPTkZJR19DT01NQU5EUyBsYXRlci4KLW00X2RlZmluZShbX0xUX0NPTkZJR19MSUJUT09MX0lOSVRdLAotW200X2lmdmFsKFskMV0sCi0gICAgICAgICAgW200X2FwcGVuZChbX0xUX09VVFBVVF9MSUJUT09MX0lOSVRdLAotICAgICAgICAgICAgICAgICAgICAgWyQxCi1dKV0pXSkKLQotIyBJbml0aWFsaXplLgotbTRfZGVmaW5lKFtfTFRfT1VUUFVUX0xJQlRPT0xfSU5JVF0pCi0KLQotIyBfTFRfQ09ORklHX0xJQlRPT0woW0NPTU1BTkRTXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFJlZ2lzdGVyIENPTU1BTkRTIHRvIGJlIHBhc3NlZCB0byBBQ19DT05GSUdfQ09NTUFORFMgbGF0ZXIuCi1tNF9kZWZpbmUoW19MVF9DT05GSUdfTElCVE9PTF0sCi1bbTRfaWZ2YWwoWyQxXSwKLSAgICAgICAgICBbbTRfYXBwZW5kKFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNdLAotICAgICAgICAgICAgICAgICAgICAgWyQxCi1dKV0pXSkKLQotIyBJbml0aWFsaXplLgotbTRfZGVmaW5lKFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNdKQotCi0KLSMgX0xUX0NPTkZJR19TQVZFX0NPTU1BTkRTKFtDT01NQU5EU10sIFtJTklUX0NPTU1BTkRTXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZnVuKFtfTFRfQ09ORklHX1NBVkVfQ09NTUFORFNdLAotW19MVF9DT05GSUdfTElCVE9PTChbJDFdKQotX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoWyQyXSkKLV0pCi0KLQotIyBfTFRfRk9STUFUX0NPTU1FTlQoW0NPTU1FTlRdKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBBZGQgbGVhZGluZyBjb21tZW50IG1hcmtzIHRvIHRoZSBzdGFydCBvZiBlYWNoIGxpbmUsIGFuZCBhIHRyYWlsaW5nCi0jIGZ1bGwtc3RvcCB0byB0aGUgd2hvbGUgY29tbWVudCBpZiBvbmUgaXMgbm90IHByZXNlbnQgYWxyZWFkeS4KLW00X2RlZmluZShbX0xUX0ZPUk1BVF9DT01NRU5UXSwKLVttNF9pZnZhbChbJDFdLCBbCi1tNF9icGF0c3Vic3QoW200X2JwYXRzdWJzdChbJDFdLCBbXiAqXSwgWyMgXSldLAotICAgICAgICAgICAgICBbWydgJFxdXSwgW1xcXCZdKV1tNF9ibWF0Y2goWyQxXSwgW1shPy5dJF0sIFtdLCBbLl0pCi0pXSkKLQotCi0KLQotCi0jIF9MVF9ERUNMKFtDT05GSUdOQU1FXSwgVkFSTkFNRSwgVkFMVUUsIFtERVNDUklQVElPTl0sIFtJUy1UQUdHRUQ/XSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDT05GSUdOQU1FIGlzIHRoZSBuYW1lIGdpdmVuIHRvIHRoZSB2YWx1ZSBpbiB0aGUgbGlidG9vbCBzY3JpcHQuCi0jIFZBUk5BTUUgaXMgdGhlIChiYXNlKSBuYW1lIHVzZWQgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCi0jIFZBTFVFIG1heSBiZSAwLCAxIG9yIDIgZm9yIGEgY29tcHV0ZWQgcXVvdGUgZXNjYXBlZCB2YWx1ZSBiYXNlZCBvbgotIyBWQVJOQU1FLiAgQW55IG90aGVyIHZhbHVlIHdpbGwgYmUgdXNlZCBkaXJlY3RseS4KLW00X2RlZmluZShbX0xUX0RFQ0xdLAotW2x0X2lmX2FwcGVuZF91bmlxKFtsdF9kZWNsX3Zhcm5hbWVzXSwgWyQyXSwgWywgXSwKLSAgICBbbHRfZGljdF9hZGRfc3Via2V5KFtsdF9kZWNsX2RpY3RdLCBbJDJdLCBbbGlidG9vbF9uYW1lXSwKLQlbbTRfaWZ2YWwoWyQxXSwgWyQxXSwgWyQyXSldKQotICAgIGx0X2RpY3RfYWRkX3N1YmtleShbbHRfZGVjbF9kaWN0XSwgWyQyXSwgW3ZhbHVlXSwgWyQzXSkKLSAgICBtNF9pZnZhbChbJDRdLAotCVtsdF9kaWN0X2FkZF9zdWJrZXkoW2x0X2RlY2xfZGljdF0sIFskMl0sIFtkZXNjcmlwdGlvbl0sIFskNF0pXSkKLSAgICBsdF9kaWN0X2FkZF9zdWJrZXkoW2x0X2RlY2xfZGljdF0sIFskMl0sCi0JW3RhZ2dlZD9dLCBbbTRfaWZ2YWwoWyQ1XSwgW3llc10sIFtub10pXSldKQotXSkKLQotCi0jIF9MVF9UQUdERUNMKFtDT05GSUdOQU1FXSwgVkFSTkFNRSwgVkFMVUUsIFtERVNDUklQVElPTl0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1tNF9kZWZpbmUoW19MVF9UQUdERUNMXSwgW19MVF9ERUNMKFskMV0sIFskMl0sIFskM10sIFskNF0sIFt5ZXNdKV0pCi0KLQotIyBsdF9kZWNsX3RhZ192YXJuYW1lcyhbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi4uXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1tNF9kZWZpbmUoW2x0X2RlY2xfdGFnX3Zhcm5hbWVzXSwKLVtfbHRfZGVjbF9maWx0ZXIoW3RhZ2dlZD9dLCBbeWVzXSwgJEApXSkKLQotCi0jIF9sdF9kZWNsX2ZpbHRlcihTVUJLRVksIFZBTFVFLCBbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi5dKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZmluZShbX2x0X2RlY2xfZmlsdGVyXSwKLVttNF9jYXNlKFskI10sCi0gIFswXSwgW200X2ZhdGFsKFskMDogdG9vIGZldyBhcmd1bWVudHM6ICQjXSldLAotICBbMV0sIFttNF9mYXRhbChbJDA6IHRvbyBmZXcgYXJndW1lbnRzOiAkIzogJDFdKV0sCi0gIFsyXSwgW2x0X2RpY3RfZmlsdGVyKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbJDJdLCBbXSwgbHRfZGVjbF92YXJuYW1lcyldLAotICBbM10sIFtsdF9kaWN0X2ZpbHRlcihbbHRfZGVjbF9kaWN0XSwgWyQxXSwgWyQyXSwgWyQzXSwgbHRfZGVjbF92YXJuYW1lcyldLAotICBbbHRfZGljdF9maWx0ZXIoW2x0X2RlY2xfZGljdF0sICRAKV0pW11kbmwKLV0pCi0KLQotIyBsdF9kZWNsX3F1b3RlX3Zhcm5hbWVzKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmaW5lKFtsdF9kZWNsX3F1b3RlX3Zhcm5hbWVzXSwKLVtfbHRfZGVjbF9maWx0ZXIoW3ZhbHVlXSwgWzFdLCAkQCldKQotCi0KLSMgbHRfZGVjbF9kcXVvdGVfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmaW5lKFtsdF9kZWNsX2RxdW90ZV92YXJuYW1lc10sCi1bX2x0X2RlY2xfZmlsdGVyKFt2YWx1ZV0sIFsyXSwgJEApXSkKLQotCi0jIGx0X2RlY2xfdmFybmFtZXNfdGFnZ2VkKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZmluZShbbHRfZGVjbF92YXJuYW1lc190YWdnZWRdLAotW200X2Fzc2VydChbJCMgPD0gMl0pZG5sCi1fJDAobTRfcXVvdGUobTRfZGVmYXVsdChbJDFdLCBbWywgXV0pKSwKLSAgICBtNF9pZnZhbChbJDJdLCBbWyQyXV0sIFttNF9kcXVvdGUobHRfZGVjbF90YWdfdmFybmFtZXMpXSksCi0gICAgbTRfc3BsaXQobTRfbm9ybWFsaXplKG00X3F1b3RlKF9MVF9UQUdTKSksIFsgXSkpXSkKLW00X2RlZmluZShbX2x0X2RlY2xfdmFybmFtZXNfdGFnZ2VkXSwKLVttNF9pZnZhbChbJDNdLCBbbHRfY29tYmluZShbJDFdLCBbJDJdLCBbX10sICQzKV0pXSkKLQotCi0jIGx0X2RlY2xfYWxsX3Zhcm5hbWVzKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZmluZShbbHRfZGVjbF9hbGxfdmFybmFtZXNdLAotW18kMChtNF9xdW90ZShtNF9kZWZhdWx0KFskMV0sIFtbLCBdXSkpLAotICAgICBtNF9pZihbJDJdLCBbXSwKLQkgICBtNF9xdW90ZShsdF9kZWNsX3Zhcm5hbWVzKSwKLQltNF9xdW90ZShtNF9zaGlmdCgkQCkpKSlbXWRubAotXSkKLW00X2RlZmluZShbX2x0X2RlY2xfYWxsX3Zhcm5hbWVzXSwKLVtsdF9qb2luKCRALCBsdF9kZWNsX3Zhcm5hbWVzX3RhZ2dlZChbJDFdLAotCQkJbHRfZGVjbF90YWdfdmFybmFtZXMoW1ssIF1dLCBtNF9zaGlmdCgkQCkpKSlkbmwKLV0pCi0KLQotIyBfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJFKFtWQVJOQU1FXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFF1b3RlIGEgdmFyaWFibGUgdmFsdWUsIGFuZCBmb3J3YXJkIGl0IHRvIGBjb25maWcuc3RhdHVzJyBzbyB0aGF0IGl0cwotIyBkZWNsYXJhdGlvbiB0aGVyZSB3aWxsIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgaW4gYGNvbmZpZ3VyZScuICBWQVJOQU1FCi0jIG11c3QgaGF2ZSBhIHNpbmdsZSBxdW90ZSBkZWxpbWl0ZWQgdmFsdWUgZm9yIHRoaXMgdG8gd29yay4KLW00X2RlZmluZShbX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSRV0sCi1bJDE9J2AkRUNITyAiJF1bJDEiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJ10pCi0KLQotIyBfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJBVElPTlMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFdlIGRlbGltaXQgbGlidG9vbCBjb25maWcgdmFyaWFibGVzIHdpdGggc2luZ2xlIHF1b3Rlcywgc28gd2hlbgotIyB3ZSB3cml0ZSB0aGVtIHRvIGNvbmZpZy5zdGF0dXMsIHdlIGhhdmUgdG8gYmUgc3VyZSB0byBxdW90ZSBhbGwKLSMgZW1iZWRkZWQgc2luZ2xlIHF1b3RlcyBwcm9wZXJseS4gIEluIGNvbmZpZ3VyZSwgdGhpcyBtYWNybyBleHBhbmRzCi0jIGVhY2ggdmFyaWFibGUgZGVjbGFyZWQgd2l0aCBfTFRfREVDTCAoYW5kIF9MVF9UQUdERUNMKSBpbnRvOgotIwotIyAgICA8dmFyPj0nYCRFQ0hPICIkPHZhcj4iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbTRfZGVmdW4oW19MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkFUSU9OU10sCi1bbTRfZm9yZWFjaChbX2x0X3Zhcl0sIG00X3F1b3RlKGx0X2RlY2xfYWxsX3Zhcm5hbWVzKSwKLSAgICBbbTRfbihbX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSRShfbHRfdmFyKV0pXSldKQotCi0KLSMgX0xUX0xJQlRPT0xfVEFHUwotIyAtLS0tLS0tLS0tLS0tLS0tCi0jIE91dHB1dCBjb21tZW50IGFuZCBsaXN0IG9mIHRhZ3Mgc3VwcG9ydGVkIGJ5IHRoZSBzY3JpcHQKLW00X2RlZnVuKFtfTFRfTElCVE9PTF9UQUdTXSwKLVtfTFRfRk9STUFUX0NPTU1FTlQoW1RoZSBuYW1lcyBvZiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdF0pZG5sCi1hdmFpbGFibGVfdGFncz0iX0xUX1RBR1MiZG5sCi1dKQotCi0KLSMgX0xUX0xJQlRPT0xfREVDTEFSRShWQVJOQU1FLCBbVEFHXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRXh0cmFjdCB0aGUgZGljdGlvbmFyeSB2YWx1ZXMgZm9yIFZBUk5BTUUgKG9wdGlvbmFsbHkgd2l0aCBUQUcpIGFuZAotIyBleHBhbmQgdG8gYSBjb21tZW50ZWQgc2hlbGwgdmFyaWFibGUgc2V0dGluZzoKLSMKLSMgICAgIyBTb21lIGNvbW1lbnQgYWJvdXQgd2hhdCBWQVIgaXMgZm9yLgotIyAgICB2aXNpYmxlX25hbWU9JGx0X2ludGVybmFsX25hbWUKLW00X2RlZmluZShbX0xUX0xJQlRPT0xfREVDTEFSRV0sCi1bX0xUX0ZPUk1BVF9DT01NRU5UKG00X3F1b3RlKGx0X2RpY3RfZmV0Y2goW2x0X2RlY2xfZGljdF0sIFskMV0sCi0JCQkJCSAgIFtkZXNjcmlwdGlvbl0pKSlbXWRubAotbTRfcHVzaGRlZihbX2xpYnRvb2xfbmFtZV0sCi0gICAgbTRfcXVvdGUobHRfZGljdF9mZXRjaChbbHRfZGVjbF9kaWN0XSwgWyQxXSwgW2xpYnRvb2xfbmFtZV0pKSlbXWRubAotbTRfY2FzZShtNF9xdW90ZShsdF9kaWN0X2ZldGNoKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbdmFsdWVdKSksCi0gICAgWzBdLCBbX2xpYnRvb2xfbmFtZT1bJF0kMV0sCi0gICAgWzFdLCBbX2xpYnRvb2xfbmFtZT0kbHRfW10kMV0sCi0gICAgWzJdLCBbX2xpYnRvb2xfbmFtZT0kbHRfW10kMV0sCi0gICAgW19saWJ0b29sX25hbWU9bHRfZGljdF9mZXRjaChbbHRfZGVjbF9kaWN0XSwgWyQxXSwgW3ZhbHVlXSldKVtdZG5sCi1tNF9pZnZhbChbJDJdLCBbXyQyXSlbXW00X3BvcGRlZihbX2xpYnRvb2xfbmFtZV0pW11kbmwKLV0pCi0KLQotIyBfTFRfTElCVE9PTF9DT05GSUdfVkFSUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQcm9kdWNlIGNvbW1lbnRlZCBkZWNsYXJhdGlvbnMgb2Ygbm9uLXRhZ2dlZCBsaWJ0b29sIGNvbmZpZyB2YXJpYWJsZXMKLSMgc3VpdGFibGUgZm9yIGluc2VydGlvbiBpbiB0aGUgTElCVE9PTCBDT05GSUcgc2VjdGlvbiBvZiB0aGUgYGxpYnRvb2wnCi0jIHNjcmlwdC4gIFRhZ2dlZCBsaWJ0b29sIGNvbmZpZyB2YXJpYWJsZXMgKGV2ZW4gZm9yIHRoZSBMSUJUT09MIENPTkZJRwotIyBzZWN0aW9uKSBhcmUgcHJvZHVjZWQgYnkgX0xUX0xJQlRPT0xfVEFHX1ZBUlMuCi1tNF9kZWZ1bihbX0xUX0xJQlRPT0xfQ09ORklHX1ZBUlNdLAotW200X2ZvcmVhY2goW19sdF92YXJdLAotICAgIG00X3F1b3RlKF9sdF9kZWNsX2ZpbHRlcihbdGFnZ2VkP10sIFtub10sIFtdLCBsdF9kZWNsX3Zhcm5hbWVzKSksCi0gICAgW200X24oW19MVF9MSUJUT09MX0RFQ0xBUkUoX2x0X3ZhcildKV0pXSkKLQotCi0jIF9MVF9MSUJUT09MX1RBR19WQVJTKFRBRykKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmaW5lKFtfTFRfTElCVE9PTF9UQUdfVkFSU10sCi1bbTRfZm9yZWFjaChbX2x0X3Zhcl0sIG00X3F1b3RlKGx0X2RlY2xfdGFnX3Zhcm5hbWVzKSwKLSAgICBbbTRfbihbX0xUX0xJQlRPT0xfREVDTEFSRShfbHRfdmFyLCBbJDFdKV0pXSldKQotCi0KLSMgX0xUX1RBR1ZBUihWQVJOQU1FLCBbVEFHTkFNRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmaW5lKFtfTFRfVEFHVkFSXSwgW200X2lmdmFsKFskMl0sIFskMV8kMl0sIFskMV0pXSkKLQotCi0jIF9MVF9DT05GSUdfQ09NTUFORFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTZW5kIGFjY3VtdWxhdGVkIG91dHB1dCB0byAkQ09ORklHX1NUQVRVUy4gIFRoYW5rcyB0byB0aGUgbGlzdHMgb2YKLSMgdmFyaWFibGVzIGZvciBzaW5nbGUgYW5kIGRvdWJsZSBxdW90ZSBlc2NhcGluZyB3ZSBzYXZlZCBmcm9tIGNhbGxzCi0jIHRvIF9MVF9ERUNMLCB3ZSBjYW4gcHV0IHF1b3RlIGVzY2FwZWQgdmFyaWFibGVzIGRlY2xhcmF0aW9ucwotIyBpbnRvIGBjb25maWcuc3RhdHVzJywgYW5kIHRoZW4gdGhlIHNoZWxsIGNvZGUgdG8gcXVvdGUgZXNjYXBlIHRoZW0gaW4KLSMgZm9yIGxvb3BzIGluIGBjb25maWcuc3RhdHVzJy4gIEZpbmFsbHksIGFueSBhZGRpdGlvbmFsIGNvZGUgYWNjdW11bGF0ZWQKLSMgZnJvbSBjYWxscyB0byBfTFRfQ09ORklHX0xJQlRPT0xfSU5JVCBpcyBleHBhbmRlZC4KLW00X2RlZnVuKFtfTFRfQ09ORklHX0NPTU1BTkRTXSwKLVtBQ19QUk9WSURFX0lGRUxTRShbTFRfT1VUUFVUXSwKLQlkbmwgSWYgdGhlIGxpYnRvb2wgZ2VuZXJhdGlvbiBjb2RlIGhhcyBiZWVuIHBsYWNlZCBpbiAkQ09ORklHX0xULAotCWRubCBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIGl0IGFsbCBvdmVyIGFnYWluIGludG8gY29uZmlnLnN0YXR1cywKLQlkbmwgdGhlbiB3ZSB3aWxsIGhhdmUgY29uZmlnLnN0YXR1cyBydW4gJENPTkZJR19MVCBsYXRlciwgc28gaXQKLQlkbmwgbmVlZHMgdG8ga25vdyB3aGF0IG5hbWUgaXMgc3RvcmVkIHRoZXJlOgotICAgICAgICBbQUNfQ09ORklHX0NPTU1BTkRTKFtsaWJ0b29sXSwKLSAgICAgICAgICAgIFskU0hFTEwgJENPTkZJR19MVCB8fCBBU19FWElUKDEpXSwgW0NPTkZJR19MVD0nJENPTkZJR19MVCddKV0sCi0gICAgZG5sIElmIHRoZSBsaWJ0b29sIGdlbmVyYXRpb24gY29kZSBpcyBkZXN0aW5lZCBmb3IgY29uZmlnLnN0YXR1cywKLSAgICBkbmwgZXhwYW5kIHRoZSBhY2N1bXVsYXRlZCBjb21tYW5kcyBhbmQgaW5pdCBjb2RlIG5vdzoKLSAgICBbQUNfQ09ORklHX0NPTU1BTkRTKFtsaWJ0b29sXSwKLSAgICAgICAgW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU10sIFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNfSU5JVF0pXSkKLV0pI19MVF9DT05GSUdfQ09NTUFORFMKLQotCi0jIEluaXRpYWxpemUuCi1tNF9kZWZpbmUoW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU19JTklUXSwKLVsKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JwotZG91YmxlX3F1b3RlX3N1YnN0PSckZG91YmxlX3F1b3RlX3N1YnN0JwotZGVsYXlfdmFyaWFibGVfc3Vic3Q9JyRkZWxheV92YXJpYWJsZV9zdWJzdCcKLV9MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkFUSU9OUwotTFRDQz0nJExUQ0MnCi1MVENGTEFHUz0nJExUQ0ZMQUdTJwotY29tcGlsZXI9JyRjb21waWxlcl9ERUZBVUxUJwotCi0jIEEgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIHdoZW4gdGhlcmUgaXMgbm8gcHJpbnQgYnVpbHRpbiBvciBwcmludGYuCi1mdW5jX2ZhbGxiYWNrX2VjaG8gKCkKLXsKLSAgZXZhbCAnY2F0IDw8X0xURUNIT19FT0YKLVwkW10xCi1fTFRFQ0hPX0VPRicKLX0KLQotIyBRdW90ZSBldmFsZWQgc3RyaW5ncy4KLWZvciB2YXIgaW4gbHRfZGVjbF9hbGxfdmFybmFtZXMoW1sgXAotXV0sIGx0X2RlY2xfcXVvdGVfdmFybmFtZXMpOyBkbwotICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gXFxcXCIiXFxcXFwkXCR2YXIiXFxcXCJcYCBpbgotICAgICpbW1xcXFxcXFxgXFwiXFxcJF1dKikKLSAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFxgXFxcJEVDSE8gXFwiXFxcJFwkdmFyXFwiIHwgXFxcJFNFRCBcXCJcXFwkc2VkX3F1b3RlX3N1YnN0XFwiXFxcYFxcXFxcXCIiCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcJFwkdmFyXFxcXFxcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotZG9uZQotCi0jIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCi1mb3IgdmFyIGluIGx0X2RlY2xfYWxsX3Zhcm5hbWVzKFtbIFwKLV1dLCBsdF9kZWNsX2RxdW90ZV92YXJuYW1lcyk7IGRvCi0gICAgY2FzZSBcYGV2YWwgXFxcXFwkRUNITyBcXFxcIiJcXFxcXCRcJHZhciJcXFxcIlxgIGluCi0gICAgKltbXFxcXFxcXGBcXCJcXFwkXV0qKQotICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXGBcXFwkRUNITyBcXCJcXFwkXCR2YXJcXCIgfCBcXFwkU0VEIC1lIFxcIlxcXCRkb3VibGVfcXVvdGVfc3Vic3RcXCIgLWUgXFwiXFxcJHNlZF9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkZGVsYXlfdmFyaWFibGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFwkXCR2YXJcXFxcXFwiIgotICAgICAgOzsKLSAgICBlc2FjCi1kb25lCi0KLV9MVF9PVVRQVVRfTElCVE9PTF9JTklUCi1dKQotCi0jIF9MVF9HRU5FUkFURURfRklMRV9JTklUKEZJTEUsIFtDT01NRU5UXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEdlbmVyYXRlIGEgY2hpbGQgc2NyaXB0IEZJTEUgd2l0aCBhbGwgaW5pdGlhbGl6YXRpb24gbmVjZXNzYXJ5IHRvCi0jIHJldXNlIHRoZSBlbnZpcm9ubWVudCBsZWFybmVkIGJ5IHRoZSBwYXJlbnQgc2NyaXB0LCBhbmQgbWFrZSB0aGUKLSMgZmlsZSBleGVjdXRhYmxlLiAgSWYgQ09NTUVOVCBpcyBzdXBwbGllZCwgaXQgaXMgaW5zZXJ0ZWQgYWZ0ZXIgdGhlCi0jIGAjIScgc2VxdWVuY2UgYnV0IGJlZm9yZSBpbml0aWFsaXphdGlvbiB0ZXh0IGJlZ2lucy4gIEFmdGVyIHRoaXMKLSMgbWFjcm8sIGFkZGl0aW9uYWwgdGV4dCBjYW4gYmUgYXBwZW5kZWQgdG8gRklMRSB0byBmb3JtIHRoZSBib2R5IG9mCi0jIHRoZSBjaGlsZCBzY3JpcHQuICBUaGUgbWFjcm8gZW5kcyB3aXRoIG5vbi16ZXJvIHN0YXR1cyBpZiB0aGUKLSMgZmlsZSBjb3VsZCBub3QgYmUgZnVsbHkgd3JpdHRlbiAoc3VjaCBhcyBpZiB0aGUgZGlzayBpcyBmdWxsKS4KLW00X2lmZGVmKFtBU19JTklUX0dFTkVSQVRFRF0sCi1bbTRfZGVmdW4oW19MVF9HRU5FUkFURURfRklMRV9JTklUXSxbQVNfSU5JVF9HRU5FUkFURUQoJEApXSldLAotW200X2RlZnVuKFtfTFRfR0VORVJBVEVEX0ZJTEVfSU5JVF0sCi1bbTRfcmVxdWlyZShbQVNfUFJFUEFSRV0pXWRubAotW200X3B1c2hkZWYoW0FTX01FU1NBR0VfTE9HX0ZEXSldZG5sCi1bbHRfd3JpdGVfZmFpbD0wCi1jYXQgPiQxIDw8X0FTRU9GIHx8IGx0X3dyaXRlX2ZhaWw9MQotIyEgJFNIRUxMCi0jIEdlbmVyYXRlZCBieSAkYXNfbWUuCi0kMgotU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KLWV4cG9ydCBTSEVMTAotX0FTRU9GCi1jYXQgPj4kMSA8PFxfQVNFT0YgfHwgbHRfd3JpdGVfZmFpbD0xCi1BU19TSEVMTF9TQU5JVElaRQotX0FTX1BSRVBBUkUKLWV4ZWMgQVNfTUVTU0FHRV9GRD4mMQotX0FTRU9GCi10ZXN0ICRsdF93cml0ZV9mYWlsID0gMCAmJiBjaG1vZCAreCAkMVtdZG5sCi1tNF9wb3BkZWYoW0FTX01FU1NBR0VfTE9HX0ZEXSldKV0pIyBfTFRfR0VORVJBVEVEX0ZJTEVfSU5JVAotCi0jIExUX09VVFBVVAotIyAtLS0tLS0tLS0KLSMgVGhpcyBtYWNybyBhbGxvd3MgZWFybHkgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQgKGJlZm9yZQotIyBBQ19PVVRQVVQgaXMgY2FsbGVkKSwgaW5jYXNlIGl0IGlzIHVzZWQgaW4gY29uZmlndXJlIGZvciBjb21waWxhdGlvbgotIyB0ZXN0cy4KLUFDX0RFRlVOKFtMVF9PVVRQVVRdLAotWzogJHtDT05GSUdfTFQ9Li9jb25maWcubHR9Ci1BQ19NU0dfTk9USUNFKFtjcmVhdGluZyAkQ09ORklHX0xUXSkKLV9MVF9HRU5FUkFURURfRklMRV9JTklUKFsiJENPTkZJR19MVCJdLAotWyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSBhIGxpYnRvb2wgc3R1YiB3aXRoIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uXSkKLQotY2F0ID4+IiRDT05GSUdfTFQiIDw8XF9MVEVPRgotbHRfY2xfc2lsZW50PWZhbHNlCi1leGVjIEFTX01FU1NBR0VfTE9HX0ZEPj5jb25maWcubG9nCi17Ci0gIGVjaG8KLSAgQVNfQk9YKFtSdW5uaW5nICRhc19tZS5dKQotfSA+JkFTX01FU1NBR0VfTE9HX0ZECi0KLWx0X2NsX2hlbHA9IlwKLVxgJGFzX21lJyBjcmVhdGVzIGEgbG9jYWwgbGlidG9vbCBzdHViIGZyb20gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwKLWZvciB1c2UgaW4gZnVydGhlciBjb25maWd1cmUgdGltZSB0ZXN0cyBiZWZvcmUgdGhlIHJlYWwgbGlidG9vbCBpcwotZ2VuZXJhdGVkLgotCi1Vc2FnZTogJFswXSBbW09QVElPTlNdXQotCi0gIC1oLCAtLWhlbHAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtViwgLS12ZXJzaW9uICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAotICAtcSwgLS1xdWlldCAgICAgZG8gbm90IHByaW50IHByb2dyZXNzIG1lc3NhZ2VzCi0gIC1kLCAtLWRlYnVnICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCi0KLVJlcG9ydCBidWdzIHRvIDxidWctbGlidG9vbEBnbnUub3JnPi4iCi0KLWx0X2NsX3ZlcnNpb249IlwKLW00X2lmc2V0KFtBQ19QQUNLQUdFX05BTUVdLCBbQUNfUEFDS0FHRV9OQU1FIF0pY29uZmlnLmx0W11kbmwKLW00X2lmc2V0KFtBQ19QQUNLQUdFX1ZFUlNJT05dLCBbIEFDX1BBQ0tBR0VfVkVSU0lPTl0pCi1jb25maWd1cmVkIGJ5ICRbMF0sIGdlbmVyYXRlZCBieSBtNF9QQUNLQUdFX1NUUklORy4KLQotQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotVGhpcyBjb25maWcubHQgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLWdpdmVzIHVubGltaXRlZCBwZXJtaXNpb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKLQotd2hpbGUgdGVzdCAkWyNdICE9IDAKLWRvCi0gIGNhc2UgJFsxXSBpbgotICAgIC0tdmVyc2lvbiB8IC0tdiogfCAtViApCi0gICAgICBlY2hvICIkbHRfY2xfdmVyc2lvbiI7IGV4aXQgMCA7OwotICAgIC0taGVscCB8IC0taCogfCAtaCApCi0gICAgICBlY2hvICIkbHRfY2xfaGVscCI7IGV4aXQgMCA7OwotICAgIC0tZGVidWcgfCAtLWQqIHwgLWQgKQotICAgICAgZGVidWc9OiA7OwotICAgIC0tcXVpZXQgfCAtLXEqIHwgLS1zaWxlbnQgfCAtLXMqIHwgLXEgKQotICAgICAgbHRfY2xfc2lsZW50PTogOzsKLQotICAgIC0qKSBBQ19NU0dfRVJST1IoW3VucmVjb2duaXplZCBvcHRpb246ICRbMV0KLVRyeSBcYCRbMF0gLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5dKSA7OwotCi0gICAgKikgQUNfTVNHX0VSUk9SKFt1bnJlY29nbml6ZWQgYXJndW1lbnQ6ICRbMV0KLVRyeSBcYCRbMF0gLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5dKSA7OwotICBlc2FjCi0gIHNoaWZ0Ci1kb25lCi0KLWlmICRsdF9jbF9zaWxlbnQ7IHRoZW4KLSAgZXhlYyBBU19NRVNTQUdFX0ZEPi9kZXYvbnVsbAotZmkKLV9MVEVPRgotCi1jYXQgPj4iJENPTkZJR19MVCIgPDxfTFRFT0YKLV9MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU19JTklUCi1fTFRFT0YKLQotY2F0ID4+IiRDT05GSUdfTFQiIDw8XF9MVEVPRgotQUNfTVNHX05PVElDRShbY3JlYXRpbmcgJG9maWxlXSkKLV9MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EUwotQVNfRVhJVCgwKQotX0xURU9GCi1jaG1vZCAreCAiJENPTkZJR19MVCIKLQotIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBidXQgY29uZmlnLmx0IGRvZXMgaXRzIG93biByZWRpcmVjdGlvbiwKLSMgYXBwZW5kaW5nIHRvIGNvbmZpZy5sb2csIHdoaWNoIGZhaWxzIG9uIERPUywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0Ci0jIG9wZW4gYnkgY29uZmlndXJlLiAgSGVyZSB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsIGVmZmVjdGl2ZWx5IGNsb3NpbmcKLSMgY29uZmlnLmxvZywgc28gaXQgY2FuIGJlIHByb3Blcmx5IChyZSlvcGVuZWQgYW5kIGFwcGVuZGVkIHRvIGJ5IGNvbmZpZy5sdC4KLWx0X2NsX3N1Y2Nlc3M9OgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYKLSAgbHRfY29uZmlnX2x0X2FyZ3M9IiRsdF9jb25maWdfbHRfYXJncyAtLXF1aWV0IgotZXhlYyBBU19NRVNTQUdFX0xPR19GRD4vZGV2L251bGwKLSRTSEVMTCAiJENPTkZJR19MVCIgJGx0X2NvbmZpZ19sdF9hcmdzIHx8IGx0X2NsX3N1Y2Nlc3M9ZmFsc2UKLWV4ZWMgQVNfTUVTU0FHRV9MT0dfRkQ+PmNvbmZpZy5sb2cKLSRsdF9jbF9zdWNjZXNzIHx8IEFTX0VYSVQoMSkKLV0pIyBMVF9PVVRQVVQKLQotCi0jIF9MVF9DT05GSUcoVEFHKQotIyAtLS0tLS0tLS0tLS0tLS0KLSMgSWYgVEFHIGlzIHRoZSBidWlsdC1pbiB0YWcsIGNyZWF0ZSBhbiBpbml0aWFsIGxpYnRvb2wgc2NyaXB0IHdpdGggYQotIyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgdW50YWdnZWQgY29uZmlnIHZhcnMuICBPdGhlcndpc2UgYWRkIGNvZGUKLSMgdG8gY29uZmlnLnN0YXR1cyBmb3IgYXBwZW5kaW5nIHRoZSBjb25maWd1cmF0aW9uIG5hbWVkIGJ5IFRBRyBmcm9tIHRoZQotIyBtYXRjaGluZyB0YWdnZWQgY29uZmlnIHZhcnMuCi1tNF9kZWZ1bihbX0xUX0NPTkZJR10sCi1bbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCi1fTFRfQ09ORklHX1NBVkVfQ09NTUFORFMoWwotICBtNF9kZWZpbmUoW19MVF9UQUddLCBtNF9pZihbJDFdLCBbXSwgW0NdLCBbJDFdKSlkbmwKLSAgbTRfaWYoX0xUX1RBRywgW0NdLCBbCi0gICAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91cgotICAgICMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgotICAgIGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCi0gICAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotICAgIGZpCi0KLSAgICBjZmdmaWxlPSIke29maWxlfVQiCi0gICAgdHJhcCAiJFJNIFwiJGNmZ2ZpbGVcIjsgZXhpdCAxIiAxIDIgMTUKLSAgICAkUk0gIiRjZmdmaWxlIgotCi0gICAgY2F0IDw8X0xUX0VPRiA+PiAiJGNmZ2ZpbGUiCi0jISAkU0hFTEwKLQotIyBgJEVDSE8gIiRvZmlsZSIgfCBzZWQgJ3MlXi4qLyUlJ2AgLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJGFzX21lICgkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OCi0jIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jIE5PVEU6IENoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0OiBsb29rIGF0IGx0bWFpbi5zaC4KLSMKLV9MVF9DT1BZSU5HCi1fTFRfTElCVE9PTF9UQUdTCi0KLSMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCi1fTFRfTElCVE9PTF9DT05GSUdfVkFSUwotX0xUX0xJQlRPT0xfVEFHX1ZBUlMKLSMgIyMjIEVORCBMSUJUT09MIENPTkZJRwotCi1fTFRfRU9GCi0KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBhaXgzKikKLSAgICBjYXQgPDxcX0xUX0VPRiA+PiAiJGNmZ2ZpbGUiCi0jIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKLSMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcwotIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotaWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCi0gIENPTExFQ1RfTkFNRVM9Ci0gIGV4cG9ydCBDT0xMRUNUX05BTUVTCi1maQotX0xUX0VPRgotICAgIDs7Ci0gIGVzYWMKLQotICBfTFRfUFJPR19MVE1BSU4KLQotICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKLSAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgotICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQotICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPwotICBzZWQgJy9eIyBHZW5lcmF0ZWQgc2hlbGwgZnVuY3Rpb25zIGluc2VydGVkIGhlcmUvcScgIiRsdG1haW4iID4+ICIkY2ZnZmlsZSIgXAotICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCi0KLSAgX0xUX1BST0dfWFNJX1NIRUxMRk5TCi0KLSAgc2VkIC1uICcvXiMgR2VuZXJhdGVkIHNoZWxsIGZ1bmN0aW9ucyBpbnNlcnRlZCBoZXJlLywkcCcgIiRsdG1haW4iID4+ICIkY2ZnZmlsZSIgXAotICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCi0KLSAgbXYgLWYgIiRjZmdmaWxlIiAiJG9maWxlIiB8fAotICAgIChybSAtZiAiJG9maWxlIiAmJiBjcCAiJGNmZ2ZpbGUiICIkb2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZSIpCi0gIGNobW9kICt4ICIkb2ZpbGUiCi1dLAotW2NhdCA8PF9MVF9FT0YgPj4gIiRvZmlsZSIKLQotZG5sIFVuZm9ydHVuYXRlbHkgd2UgaGF2ZSB0byB1c2UgJDEgaGVyZSwgc2luY2UgX0xUX1RBRyBpcyBub3QgZXhwYW5kZWQKLWRubCBpbiBhIGNvbW1lbnQgKGllIGFmdGVyIGEgIykuCi0jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICQxCi1fTFRfTElCVE9PTF9UQUdfVkFSUyhfTFRfVEFHKQotIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJDEKLV9MVF9FT0YKLV0pZG5sIC9tNF9pZgotXSwKLVttNF9pZihbJDFdLCBbXSwgWwotICAgIFBBQ0tBR0U9JyRQQUNLQUdFJwotICAgIFZFUlNJT049JyRWRVJTSU9OJwotICAgIFRJTUVTVEFNUD0nJFRJTUVTVEFNUCcKLSAgICBSTT0nJFJNJwotICAgIG9maWxlPSckb2ZpbGUnXSwgW10pCi1dKWRubCAvX0xUX0NPTkZJR19TQVZFX0NPTU1BTkRTCi1dKSMgX0xUX0NPTkZJRwotCi0KLSMgTFRfU1VQUE9SVEVEX1RBRyhUQUcpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUcmFjZSB0aGlzIG1hY3JvIHRvIGRpc2NvdmVyIHdoYXQgdGFncyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBsaWJ0b29sCi0jIC0tdGFnIG9wdGlvbiwgdXNpbmc6Ci0jICAgIGF1dG9jb25mIC0tdHJhY2UgJ0xUX1NVUFBPUlRFRF9UQUc6JDEnCi1BQ19ERUZVTihbTFRfU1VQUE9SVEVEX1RBR10sIFtdKQotCi0KLSMgQyBzdXBwb3J0IGlzIGJ1aWx0LWluIGZvciBub3cKLW00X2RlZmluZShbX0xUX0xBTkdfQ19lbmFibGVkXSwgW10pCi1tNF9kZWZpbmUoW19MVF9UQUdTXSwgW10pCi0KLQotIyBMVF9MQU5HKExBTkcpCi0jIC0tLS0tLS0tLS0tLS0KLSMgRW5hYmxlIGxpYnRvb2wgc3VwcG9ydCBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlIGlmIG5vdCBhbHJlYWR5IGVuYWJsZWQuCi1BQ19ERUZVTihbTFRfTEFOR10sCi1bQUNfQkVGT1JFKFskMF0sIFtMVF9PVVRQVVRdKWRubAotbTRfY2FzZShbJDFdLAotICBbQ10sCQkJW19MVF9MQU5HKEMpXSwKLSAgW0MrK10sCQlbX0xUX0xBTkcoQ1hYKV0sCi0gIFtKYXZhXSwJCVtfTFRfTEFORyhHQ0opXSwKLSAgW0ZvcnRyYW4gNzddLAkJW19MVF9MQU5HKEY3NyldLAotICBbRm9ydHJhbl0sCQlbX0xUX0xBTkcoRkMpXSwKLSAgW1dpbmRvd3MgUmVzb3VyY2VdLAlbX0xUX0xBTkcoUkMpXSwKLSAgW200X2lmZGVmKFtfTFRfTEFOR19dJDFbX0NPTkZJR10sCi0gICAgW19MVF9MQU5HKCQxKV0sCi0gICAgW200X2ZhdGFsKFskMDogdW5zdXBwb3J0ZWQgbGFuZ3VhZ2U6ICIkMSJdKV0pXSlkbmwKLV0pIyBMVF9MQU5HCi0KLQotIyBfTFRfTEFORyhMQU5HTkFNRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tCi1tNF9kZWZ1bihbX0xUX0xBTkddLAotW200X2lmZGVmKFtfTFRfTEFOR19dJDFbX2VuYWJsZWRdLCBbXSwKLSAgW0xUX1NVUFBPUlRFRF9UQUcoWyQxXSlkbmwKLSAgbTRfYXBwZW5kKFtfTFRfVEFHU10sIFskMSBdKWRubAotICBtNF9kZWZpbmUoW19MVF9MQU5HX10kMVtfZW5hYmxlZF0sIFtdKWRubAotICBfTFRfTEFOR18kMV9DT05GSUcoJDEpXSlkbmwKLV0pIyBfTFRfTEFORwotCi0KLSMgX0xUX0xBTkdfREVGQVVMVF9DT05GSUcKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZnVuKFtfTFRfTEFOR19ERUZBVUxUX0NPTkZJR10sCi1bQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKLSAgW0xUX0xBTkcoQ1hYKV0sCi0gIFttNF9kZWZpbmUoW0FDX1BST0dfQ1hYXSwgZGVmbihbQUNfUFJPR19DWFhdKVtMVF9MQU5HKENYWCldKV0pCi0KLUFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0Y3N10sCi0gIFtMVF9MQU5HKEY3NyldLAotICBbbTRfZGVmaW5lKFtBQ19QUk9HX0Y3N10sIGRlZm4oW0FDX1BST0dfRjc3XSlbTFRfTEFORyhGNzcpXSldKQotCi1BQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19GQ10sCi0gIFtMVF9MQU5HKEZDKV0sCi0gIFttNF9kZWZpbmUoW0FDX1BST0dfRkNdLCBkZWZuKFtBQ19QUk9HX0ZDXSlbTFRfTEFORyhGQyldKV0pCi0KLWRubCBUaGUgY2FsbCB0byBbQV1bTV9QUk9HX0dDSl0gaXMgcXVvdGVkIGxpa2UgdGhhdCB0byBzdG9wIGFjbG9jYWwKLWRubCBwdWxsaW5nIHRoaW5ncyBpbiBuZWVkbGVzc2x5LgotQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfR0NKXSwKLSAgW0xUX0xBTkcoR0NKKV0sCi0gIFtBQ19QUk9WSURFX0lGRUxTRShbQV1bTV9QUk9HX0dDSl0sCi0gICAgW0xUX0xBTkcoR0NKKV0sCi0gICAgW0FDX1BST1ZJREVfSUZFTFNFKFtMVF9QUk9HX0dDSl0sCi0gICAgICBbTFRfTEFORyhHQ0opXSwKLSAgICAgIFttNF9pZmRlZihbQUNfUFJPR19HQ0pdLAotCVttNF9kZWZpbmUoW0FDX1BST0dfR0NKXSwgZGVmbihbQUNfUFJPR19HQ0pdKVtMVF9MQU5HKEdDSildKV0pCi0gICAgICAgbTRfaWZkZWYoW0FdW01fUFJPR19HQ0pdLAotCVttNF9kZWZpbmUoW0FdW01fUFJPR19HQ0pdLCBkZWZuKFtBXVtNX1BST0dfR0NKXSlbTFRfTEFORyhHQ0opXSldKQotICAgICAgIG00X2lmZGVmKFtMVF9QUk9HX0dDSl0sCi0JW200X2RlZmluZShbTFRfUFJPR19HQ0pdLCBkZWZuKFtMVF9QUk9HX0dDSl0pW0xUX0xBTkcoR0NKKV0pXSldKV0pXSkKLQotQUNfUFJPVklERV9JRkVMU0UoW0xUX1BST0dfUkNdLAotICBbTFRfTEFORyhSQyldLAotICBbbTRfZGVmaW5lKFtMVF9QUk9HX1JDXSwgZGVmbihbTFRfUFJPR19SQ10pW0xUX0xBTkcoUkMpXSldKQotXSkjIF9MVF9MQU5HX0RFRkFVTFRfQ09ORklHCi0KLSMgT2Jzb2xldGUgbWFjcm9zOgotQVVfREVGVU4oW0FDX0xJQlRPT0xfQ1hYXSwgW0xUX0xBTkcoQysrKV0pCi1BVV9ERUZVTihbQUNfTElCVE9PTF9GNzddLCBbTFRfTEFORyhGb3J0cmFuIDc3KV0pCi1BVV9ERUZVTihbQUNfTElCVE9PTF9GQ10sIFtMVF9MQU5HKEZvcnRyYW4pXSkKLUFVX0RFRlVOKFtBQ19MSUJUT09MX0dDSl0sIFtMVF9MQU5HKEphdmEpXSkKLUFVX0RFRlVOKFtBQ19MSUJUT09MX1JDXSwgW0xUX0xBTkcoV2luZG93cyBSZXNvdXJjZSldKQotZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgotZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0NYWF0sIFtdKQotZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0Y3N10sIFtdKQotZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0ZDXSwgW10pCi1kbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfR0NKXSwgW10pCi1kbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfUkNdLCBbXSkKLQotCi0jIF9MVF9UQUdfQ09NUElMRVIKLSMgLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmdW4oW19MVF9UQUdfQ09NUElMRVJdLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotCi1fTFRfREVDTChbTFRDQ10sIFtDQ10sIFsxXSwgW0EgQyBjb21waWxlcl0pZG5sCi1fTFRfREVDTChbTFRDRkxBR1NdLCBbQ0ZMQUdTXSwgWzFdLCBbTFRDQyBjb21waWxlciBmbGFnc10pZG5sCi1fTFRfVEFHREVDTChbQ0NdLCBbY29tcGlsZXJdLCBbMV0sIFtBIGxhbmd1YWdlIHNwZWNpZmljIGNvbXBpbGVyXSlkbmwKLV9MVF9UQUdERUNMKFt3aXRoX2djY10sIFtHQ0NdLCBbMF0sIFtJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBjb21waWxlcj9dKWRubAotCi0jIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgotTFRDQz0ke0xUQ0MtIiRDQyJ9Ci0KLSMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KLUxUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotY29tcGlsZXI9JENDCi1dKSMgX0xUX1RBR19DT01QSUxFUgotCi0KLSMgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayBmb3IgY29tcGlsZXIgYm9pbGVycGxhdGUgb3V0cHV0IG9yIHdhcm5pbmdzIHdpdGgKLSMgdGhlIHNpbXBsZSBjb21waWxlciB0ZXN0IGNvZGUuCi1tNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFXSwKLVttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1lY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAotZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCi1fbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCi0kUk0gY29uZnRlc3QqCi1dKSMgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCi0KLQotIyBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgZm9yIGxpbmtlciBib2lsZXJwbGF0ZSBvdXRwdXQgb3Igd2FybmluZ3Mgd2l0aAotIyB0aGUgc2ltcGxlIGxpbmsgdGVzdCBjb2RlLgotbTRfZGVmdW4oW19MVF9MSU5LRVJfQk9JTEVSUExBVEVdLAotW200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCi1hY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLWVjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCi0kUk0gLXIgY29uZnRlc3QqCi1dKSMgX0xUX0xJTktFUl9CT0lMRVJQTEFURQotCi0jIF9MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZnVuX29uY2UoW19MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTXSxbCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICByaGFwc29keSogfCBkYXJ3aW4qKQotICAgIEFDX0NIRUNLX1RPT0woW0RTWU1VVElMXSwgW2RzeW11dGlsXSwgWzpdKQotICAgIEFDX0NIRUNLX1RPT0woW05NRURJVF0sIFtubWVkaXRdLCBbOl0pCi0gICAgQUNfQ0hFQ0tfVE9PTChbTElQT10sIFtsaXBvXSwgWzpdKQotICAgIEFDX0NIRUNLX1RPT0woW09UT09MXSwgW290b29sXSwgWzpdKQotICAgIEFDX0NIRUNLX1RPT0woW09UT09MNjRdLCBbb3Rvb2w2NF0sIFs6XSkKLSAgICBfTFRfREVDTChbXSwgW0RTWU1VVElMXSwgWzFdLAotICAgICAgW1Rvb2wgdG8gbWFuaXB1bGF0ZSBhcmNoaXZlZCBEV0FSRiBkZWJ1ZyBzeW1ib2wgZmlsZXMgb24gTWFjIE9TIFhdKQotICAgIF9MVF9ERUNMKFtdLCBbTk1FRElUXSwgWzFdLAotICAgICAgW1Rvb2wgdG8gY2hhbmdlIGdsb2JhbCB0byBsb2NhbCBzeW1ib2xzIG9uIE1hYyBPUyBYXSkKLSAgICBfTFRfREVDTChbXSwgW0xJUE9dLCBbMV0sCi0gICAgICBbVG9vbCB0byBtYW5pcHVsYXRlIGZhdCBvYmplY3RzIGFuZCBhcmNoaXZlcyBvbiBNYWMgT1MgWF0pCi0gICAgX0xUX0RFQ0woW10sIFtPVE9PTF0sIFsxXSwKLSAgICAgIFtsZGQvcmVhZGVsZiBsaWtlIHRvb2wgZm9yIE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWF0pCi0gICAgX0xUX0RFQ0woW10sIFtPVE9PTDY0XSwgWzFdLAotICAgICAgW2xkZC9yZWFkZWxmIGxpa2UgdG9vbCBmb3IgNjQgYml0IE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWCAxMC40XSkKLQotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgLXNpbmdsZV9tb2R1bGUgbGlua2VyIGZsYWddLFtsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kXSwKLSAgICAgIFtsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kPW5vCi0gICAgICBpZiB0ZXN0IC16ICIke0xUX01VTFRJX01PRFVMRX0iOyB0aGVuCi0JIyBCeSBkZWZhdWx0IHdlIHdpbGwgYWRkIHRoZSAtc2luZ2xlX21vZHVsZSBmbGFnLiBZb3UgY2FuIG92ZXJyaWRlCi0JIyBieSBlaXRoZXIgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTFRfTVVMVElfTU9EVUxFCi0JIyBub24tZW1wdHkgYXQgY29uZmlndXJlIHRpbWUsIG9yIGJ5IGFkZGluZyAtbXVsdGlfbW9kdWxlIHRvIHRoZQotCSMgbGluayBmbGFncy4KLQlybSAtcmYgbGliY29uZnRlc3QuZHlsaWIqCi0JZWNobyAiaW50IGZvbyh2b2lkKXtyZXR1cm4gMTt9IiA+IGNvbmZ0ZXN0LmMKLQllY2hvICIkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAotLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMiID4mQVNfTUVTU0FHRV9MT0dfRkQKLQkkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAotCSAgLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMgMj5jb25mdGVzdC5lcnIKLSAgICAgICAgX2x0X3Jlc3VsdD0kPwotCWlmIHRlc3QgLWYgbGliY29uZnRlc3QuZHlsaWIgJiYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyciAmJiB0ZXN0ICRfbHRfcmVzdWx0ID0gMDsgdGhlbgotCSAgbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKLQllbHNlCi0JICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKLQlmaQotCXJtIC1yZiBsaWJjb25mdGVzdC5keWxpYioKLQlybSAtZiBjb25mdGVzdC4qCi0gICAgICBmaV0pCi0gICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGxpbmtlciBmbGFnXSwKLSAgICAgIFtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3RdLAotICAgICAgW2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdD1ubwotICAgICAgc2F2ZV9MREZMQUdTPSRMREZMQUdTCi0gICAgICBlY2hvICJfbWFpbiIgPiBjb25mdGVzdC5zeW0KLSAgICAgIExERkxBR1M9IiRMREZMQUdTIC1XbCwtZXhwb3J0ZWRfc3ltYm9sc19saXN0LGNvbmZ0ZXN0LnN5bSIKLSAgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW10sW10pXSwKLQlbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PXllc10sCi0JW2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdD1ub10pCi0JTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLSAgICBdKQotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgLWZvcmNlX2xvYWQgbGlua2VyIGZsYWddLFtsdF9jdl9sZF9mb3JjZV9sb2FkXSwKLSAgICAgIFtsdF9jdl9sZF9mb3JjZV9sb2FkPW5vCi0gICAgICBjYXQgPiBjb25mdGVzdC5jIDw8IF9MVF9FT0YKLWludCBmb3JjZWRfbG9hZGVkKCkgeyByZXR1cm4gMjt9Ci1fTFRfRU9GCi0gICAgICBlY2hvICIkTFRDQyAkTFRDRkxBR1MgLWMgLW8gY29uZnRlc3QubyBjb25mdGVzdC5jIiA+JkFTX01FU1NBR0VfTE9HX0ZECi0gICAgICAkTFRDQyAkTFRDRkxBR1MgLWMgLW8gY29uZnRlc3QubyBjb25mdGVzdC5jIDI+JkFTX01FU1NBR0VfTE9HX0ZECi0gICAgICBlY2hvICIkQVIgY3J1IGxpYmNvbmZ0ZXN0LmEgY29uZnRlc3QubyIgPiZBU19NRVNTQUdFX0xPR19GRAotICAgICAgJEFSIGNydSBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0Lm8gMj4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgICAgIGVjaG8gIiRSQU5MSUIgbGliY29uZnRlc3QuYSIgPiZBU19NRVNTQUdFX0xPR19GRAotICAgICAgJFJBTkxJQiBsaWJjb25mdGVzdC5hIDI+JkFTX01FU1NBR0VfTE9HX0ZECi0gICAgICBjYXQgPiBjb25mdGVzdC5jIDw8IF9MVF9FT0YKLWludCBtYWluKCkgeyByZXR1cm4gMDt9Ci1fTFRfRU9GCi0gICAgICBlY2hvICIkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAtV2wsLWZvcmNlX2xvYWQsLi9saWJjb25mdGVzdC5hIiA+JkFTX01FU1NBR0VfTE9HX0ZECi0gICAgICAkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAtV2wsLWZvcmNlX2xvYWQsLi9saWJjb25mdGVzdC5hIDI+Y29uZnRlc3QuZXJyCi0gICAgICBfbHRfcmVzdWx0PSQ/Ci0gICAgICBpZiB0ZXN0IC1mIGNvbmZ0ZXN0ICYmIHRlc3QgISAtcyBjb25mdGVzdC5lcnIgJiYgdGVzdCAkX2x0X3Jlc3VsdCA9IDAgJiYgJEdSRVAgZm9yY2VkX2xvYWQgY29uZnRlc3QgMj4mMSA+L2Rldi9udWxsOyB0aGVuCi0JbHRfY3ZfbGRfZm9yY2VfbG9hZD15ZXMKLSAgICAgIGVsc2UKLQljYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgICAgIGZpCi0gICAgICAgIHJtIC1mIGNvbmZ0ZXN0LmVyciBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMKLSAgICAgICAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KLSAgICBdKQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICByaGFwc29keSogfCBkYXJ3aW4xLltbMDEyXV0pCi0gICAgICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7Ci0gICAgZGFyd2luMS4qKQotICAgICAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJyA7OwotICAgIGRhcndpbiopICMgZGFyd2luIDUueCBvbgotICAgICAgIyBpZiBydW5uaW5nIG9uIDEwLjUgb3IgbGF0ZXIsIHRoZSBkZXBsb3ltZW50IHRhcmdldCBkZWZhdWx0cwotICAgICAgIyB0byB0aGUgT1MgdmVyc2lvbiwgaWYgb24geDg2LCBhbmQgMTAuNCwgdGhlIGRlcGxveW1lbnQKLSAgICAgICMgdGFyZ2V0IGRlZmF1bHRzIHRvIDEwLjQuIERvbid0IHlvdSBsb3ZlIGl0PwotICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVC0xMC4wfSwkaG9zdCBpbgotCTEwLjAsKjg2Ki1kYXJ3aW44KnwxMC4wLCotZGFyd2luW1s5MV1dKikKLQkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcgOzsKLQkxMC5bWzAxMl1dKikKLQkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKLQkxMC4qKQotCSAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJyA7OwotICAgICAgZXNhYwotICAgIDs7Ci0gIGVzYWMKLSAgICBpZiB0ZXN0ICIkbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPSAieWVzIjsgdGhlbgotICAgICAgX2x0X2Rhcl9zaW5nbGVfbW9kPSckc2luZ2xlX21vZHVsZScKLSAgICBmaQotICAgIGlmIHRlc3QgIiRsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3QiID0gInllcyI7IHRoZW4KLSAgICAgIF9sdF9kYXJfZXhwb3J0X3N5bXM9JyAke3dsfS1leHBvcnRlZF9zeW1ib2xzX2xpc3QsJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bScKLSAgICBlbHNlCi0gICAgICBfbHRfZGFyX2V4cG9ydF9zeW1zPSd+JE5NRURJVCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICBmaQotICAgIGlmIHRlc3QgIiREU1lNVVRJTCIgIT0gIjoiICYmIHRlc3QgIiRsdF9jdl9sZF9mb3JjZV9sb2FkIiA9ICJubyI7IHRoZW4KLSAgICAgIF9sdF9kc3ltdXRpbD0nfiREU1lNVVRJTCAkbGliIHx8IDonCi0gICAgZWxzZQotICAgICAgX2x0X2RzeW11dGlsPQotICAgIGZpCi0gICAgOzsKLSAgZXNhYwotXSkKLQotCi0jIF9MVF9EQVJXSU5fTElOS0VSX0ZFQVRVUkVTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrcyBmb3IgbGlua2VyIGFuZCBjb21waWxlciBmZWF0dXJlcyBvbiBkYXJ3aW4KLW00X2RlZnVuKFtfTFRfREFSV0lOX0xJTktFUl9GRUFUVVJFU10sCi1bCi0gIG00X3JlcXVpcmUoW19MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTXSkKLSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi0gIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLSAgX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT15ZXMKLSAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKLSAgaWYgdGVzdCAiJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID0gInllcyI7IHRoZW4KLSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9J2Bmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSAke3dsfS1mb3JjZV9sb2FkLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgJwotICBlbHNlCi0gICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScnCi0gIGZpCi0gIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9IiRfbHRfZGFyX2FsbG93X3VuZGVmaW5lZCIKLSAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgaWZvcnQqKSBfbHRfZGFyX2Nhbl9zaGFyZWQ9eWVzIDs7Ci0gICAgICopIF9sdF9kYXJfY2FuX3NoYXJlZD0kR0NDIDs7Ci0gIGVzYWMKLSAgaWYgdGVzdCAiJF9sdF9kYXJfY2FuX3NoYXJlZCIgPSAieWVzIjsgdGhlbgotICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPWZ1bmNfZWNob19hbGwKLSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSJcJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyAkX2x0X2Rhcl9zaW5nbGVfbW9kJHtfbHRfZHN5bXV0aWx9IgotICAgIF9MVF9UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0iXCRDQyBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIC1idW5kbGUgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzJHtfbHRfZHN5bXV0aWx9IgotICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJzZWQgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nICR7X2x0X2Rhcl9zaW5nbGVfbW9kfSR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCi0gICAgX0xUX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0ic2VkIC1lICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgLWJ1bmRsZSBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3Mke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgotICAgIG00X2lmKFskMV0sIFtDWFhdLAotWyAgIGlmIHRlc3QgIiRsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kIiAhPSAieWVzIjsgdGhlbgotICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0iXCRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vIFwke2xpYn0tbWFzdGVyLm8gXCRsaWJvYmpzflwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJHtsaWJ9LW1hc3Rlci5vIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyR7X2x0X2RzeW11dGlsfSIKLSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJzZWQgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyBcJHtsaWJ9LW1hc3Rlci5vIFwkbGlib2Jqc35cJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCR7bGlifS1tYXN0ZXIubyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgotICAgIGZpCi1dLFtdKQotICBlbHNlCi0gIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgZmkKLV0pCi0KLSMgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTGlua3MgYSBtaW5pbWFsIHByb2dyYW0gYW5kIGNoZWNrcyB0aGUgZXhlY3V0YWJsZQotIyBmb3IgdGhlIHN5c3RlbSBkZWZhdWx0IGhhcmRjb2RlZCBsaWJyYXJ5IHBhdGguIEluIG1vc3QgY2FzZXMsCi0jIHRoaXMgaXMgL3Vzci9saWI6L2xpYiwgYnV0IHdoZW4gdGhlIE1QSSBjb21waWxlcnMgYXJlIHVzZWQKLSMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21tdW5pY2F0aW9uIGFuZCBNUEkgbGlicyBhcmUgaW5jbHVkZWQgdG9vLgotIyBJZiB3ZSBkb24ndCBmaW5kIGFueXRoaW5nLCB1c2UgdGhlIGRlZmF1bHQgbGlicmFyeSBwYXRoIGFjY29yZGluZwotIyB0byB0aGUgYWl4IGxkIG1hbnVhbC4KLW00X2RlZnVuKFtfTFRfU1lTX01PRFVMRV9QQVRIX0FJWF0sCi1bbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKLUFDX0xJTktfSUZFTFNFKEFDX0xBTkdfUFJPR1JBTSxbCi1sdF9haXhfbGlicGF0aF9zZWQ9JwotICAgIC9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsKLQkvXjAvIHsKLQkgICAgcy9eMCAgKlwoLipcKSQvXDEvCi0JICAgIHAKLQl9Ci0gICAgfScKLWFpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAotIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbgotICBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKLWZpXSxbXSkKLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQotXSkjIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCi0KLQotIyBfTFRfU0hFTExfSU5JVChBUkcpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZmluZShbX0xUX1NIRUxMX0lOSVRdLAotW200X2RpdmVydF90ZXh0KFtNNFNILUlOSVRdLCBbJDEKLV0pXSkjIF9MVF9TSEVMTF9JTklUCi0KLQotCi0jIF9MVF9QUk9HX0VDSE9fQkFDS1NMQVNICi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEZpbmQgaG93IHdlIGNhbiBmYWtlIGFuIGVjaG8gY29tbWFuZCB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2guCi0jIEluIHBhcnRpY3VsYXIsIHdpdGggQXV0b2NvbmYgMi42MCBvciBsYXRlciB3ZSBhZGQgc29tZSBjb2RlIHRvIHRoZSBzdGFydAotIyBvZiB0aGUgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2ggd2lsbCBmaW5kIGEgc2hlbGwgd2l0aCBhIGJ1aWx0aW4KLSMgcHJpbnRmICh3aGljaCB3ZSBjYW4gdXNlIGFzIGFuIGVjaG8gY29tbWFuZCkuCi1tNF9kZWZ1bihbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdLAotW0VDSE89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCi1FQ0hPPSRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8KLUVDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCi0KLUFDX01TR19DSEVDS0lORyhbaG93IHRvIHByaW50IHN0cmluZ3NdKQotIyBUZXN0IHByaW50IGZpcnN0LCBiZWNhdXNlIGl0IHdpbGwgYmUgYSBidWlsdGluIGlmIHByZXNlbnQuCi1pZiB0ZXN0ICJYYHByaW50IC1yIC0tIC1uIDI+L2Rldi9udWxsYCIgPSBYLW4gJiYgXAotICAgdGVzdCAiWGBwcmludCAtciAtLSAkRUNITyAyPi9kZXYvbnVsbGAiID0gIlgkRUNITyI7IHRoZW4KLSAgRUNITz0ncHJpbnQgLXIgLS0nCi1lbGlmIHRlc3QgIlhgcHJpbnRmICVzICRFQ0hPIDI+L2Rldi9udWxsYCIgPSAiWCRFQ0hPIjsgdGhlbgotICBFQ0hPPSdwcmludGYgJXNcbicKLWVsc2UKLSAgIyBVc2UgdGhpcyBmdW5jdGlvbiBhcyBhIGZhbGxiYWNrIHRoYXQgYWx3YXlzIHdvcmtzLgotICBmdW5jX2ZhbGxiYWNrX2VjaG8gKCkKLSAgewotICAgIGV2YWwgJ2NhdCA8PF9MVEVDSE9fRU9GCi0kW10xCi1fTFRFQ0hPX0VPRicKLSAgfQotICBFQ0hPPSdmdW5jX2ZhbGxiYWNrX2VjaG8nCi1maQotCi0jIGZ1bmNfZWNob19hbGwgYXJnLi4uCi0jIEludm9rZSAkRUNITyB3aXRoIGFsbCBhcmdzLCBzcGFjZS1zZXBhcmF0ZWQuCi1mdW5jX2VjaG9fYWxsICgpCi17Ci0gICAgJEVDSE8gIiQqIiAKLX0KLQotY2FzZSAiJEVDSE8iIGluCi0gIHByaW50ZiopIEFDX01TR19SRVNVTFQoW3ByaW50Zl0pIDs7Ci0gIHByaW50KikgQUNfTVNHX1JFU1VMVChbcHJpbnQgLXJdKSA7OwotICAqKSBBQ19NU0dfUkVTVUxUKFtjYXRdKSA7OwotZXNhYwotCi1tNF9pZmRlZihbX0FTX0RFVEVDVF9TVUdHRVNURURdLAotW19BU19ERVRFQ1RfU1VHR0VTVEVEKFsKLSAgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9JHtCQVNIX1ZFUlNJT04rc2V0fSIgfHwgKAotICAgIEVDSE89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCi0gICAgRUNITz0kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCi0gICAgRUNITz0kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8KLSAgICBQQVRIPS9lbXB0eSBGUEFUSD0vZW1wdHk7IGV4cG9ydCBQQVRIIEZQQVRICi0gICAgdGVzdCAiWGBwcmludGYgJXMgJEVDSE9gIiA9ICJYJEVDSE8iIFwKLSAgICAgIHx8IHRlc3QgIlhgcHJpbnQgLXIgLS0gJEVDSE9gIiA9ICJYJEVDSE8iICldKV0pCi0KLV9MVF9ERUNMKFtdLCBbU0hFTExdLCBbMV0sIFtTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzXSkKLV9MVF9ERUNMKFtdLCBbRUNIT10sIFsxXSwgW0FuIGVjaG8gcHJvZ3JhbSB0aGF0IHByb3RlY3RzIGJhY2tzbGFzaGVzXSkKLV0pIyBfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSAotCi0KLSMgX0xUX0VOQUJMRV9MT0NLCi0jIC0tLS0tLS0tLS0tLS0tLQotbTRfZGVmdW4oW19MVF9FTkFCTEVfTE9DS10sCi1bQUNfQVJHX0VOQUJMRShbbGlidG9vbC1sb2NrXSwKLSAgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbGlidG9vbC1sb2NrXSwKLSAgICBbYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKV0pXSkKLXRlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICRob3N0IGluCi1pYTY0LSotaHB1eCopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCi0gICAgICAqRUxGLTMyKikKLQlIUFVYX0lBNjRfTU9ERT0iMzIiCi0JOzsKLSAgICAgICpFTEYtNjQqKQotCUhQVVhfSUE2NF9NT0RFPSI2NCIKLQk7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdbI11saW5lICckTElORU5PJyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgotICAgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgotCSozMi1iaXQqKQotCSAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJic21pcCIKLQkgIDs7Ci0JKk4zMiopCi0JICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJtaXBuMzIiCi0JICA7OwotCSo2NC1iaXQqKQotCSAgTEQ9IiR7TEQtbGR9IC1tZWxmNjRibWlwIgotCTs7Ci0gICAgICBlc2FjCi0gICAgZWxzZQotICAgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgotCSozMi1iaXQqKQotCSAgTEQ9IiR7TEQtbGR9IC0zMiIKLQkgIDs7Ci0JKk4zMiopCi0JICBMRD0iJHtMRC1sZH0gLW4zMiIKLQkgIDs7Ci0JKjY0LWJpdCopCi0JICBMRD0iJHtMRC1sZH0gLTY0IgotCSAgOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLXg4Nl82NC0qa2ZyZWVic2QqLWdudXx4ODZfNjQtKmxpbnV4KnxwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KnwgXAotczM5MCotKmxpbnV4KnxzMzkwKi0qdHBmKnxzcGFyYyotKmxpbnV4KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KLSAgICAgICozMi1iaXQqKQotCWNhc2UgJGhvc3QgaW4KLQkgIHg4Nl82NC0qa2ZyZWVic2QqLWdudSkKLQkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2X2Zic2QiCi0JICAgIDs7Ci0JICB4ODZfNjQtKmxpbnV4KikKLQkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2IgotCSAgICA7OwotCSAgcHBjNjQtKmxpbnV4Knxwb3dlcnBjNjQtKmxpbnV4KikKLQkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMycHBjbGludXgiCi0JICAgIDs7Ci0JICBzMzkweC0qbGludXgqKQotCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3MzOTAiCi0JICAgIDs7Ci0JICBzcGFyYzY0LSpsaW51eCopCi0JICAgIExEPSIke0xELWxkfSAtbSBlbGYzMl9zcGFyYyIKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgICo2NC1iaXQqKQotCWNhc2UgJGhvc3QgaW4KLQkgIHg4Nl82NC0qa2ZyZWVic2QqLWdudSkKLQkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjRfZmJzZCIKLQkgICAgOzsKLQkgIHg4Nl82NC0qbGludXgqKQotCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3g4Nl82NCIKLQkgICAgOzsKLQkgIHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqKQotCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRwcGMiCi0JICAgIDs7Ci0JICBzMzkwKi0qbGludXgqfHMzOTAqLSp0cGYqKQotCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfczM5MCIKLQkgICAgOzsKLQkgIHNwYXJjKi0qbGludXgqKQotCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAotICAgIFtBQ19MQU5HX1BVU0goQykKLSAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbW11dLFtbXV0pXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSkKLSAgICAgQUNfTEFOR19QT1BdKQotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7Owotc3BhcmMqLSpzb2xhcmlzKikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KLSAgICAqNjQtYml0KikKLSAgICAgIGNhc2UgJGx0X2N2X3Byb2dfZ251X2xkIGluCi0gICAgICB5ZXMqKSBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiIDs7Ci0gICAgICAqKQotCWlmICR7TEQtbGR9IC02NCAtciAtbyBjb25mdGVzdDIubyBjb25mdGVzdC5vID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgTEQ9IiR7TEQtbGR9IC02NCIKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotZXNhYwotCi1uZWVkX2xvY2tzPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKLV0pIyBfTFRfRU5BQkxFX0xPQ0sKLQotCi0jIF9MVF9DTURfT0xEX0FSQ0hJVkUKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmdW4oW19MVF9DTURfT0xEX0FSQ0hJVkVdLAotW0FDX0NIRUNLX1RPT0woQVIsIGFyLCBmYWxzZSkKLXRlc3QgLXogIiRBUiIgJiYgQVI9YXIKLXRlc3QgLXogIiRBUl9GTEFHUyIgJiYgQVJfRkxBR1M9Y3J1Ci1fTFRfREVDTChbXSwgW0FSXSwgWzFdLCBbVGhlIGFyY2hpdmVyXSkKLV9MVF9ERUNMKFtdLCBbQVJfRkxBR1NdLCBbMV0pCi0KLUFDX0NIRUNLX1RPT0woU1RSSVAsIHN0cmlwLCA6KQotdGVzdCAteiAiJFNUUklQIiAmJiBTVFJJUD06Ci1fTFRfREVDTChbXSwgW1NUUklQXSwgWzFdLCBbQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW1dKQotCi1BQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQotdGVzdCAteiAiJFJBTkxJQiIgJiYgUkFOTElCPToKLV9MVF9ERUNMKFtdLCBbUkFOTElCXSwgWzFdLAotICAgIFtDb21tYW5kcyB1c2VkIHRvIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmVdKQotCi0jIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KLW9sZF9hcmNoaXZlX2NtZHM9JyRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJwotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KLQotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBvcGVuYnNkKikKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIC10IFwkb2xkbGliIgotICAgIDs7Ci0gICopCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKLSAgICA7OwotICBlc2FjCi0gIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkb2xkbGliIgotZmkKLQotY2FzZSAkaG9zdF9vcyBpbgotICBkYXJ3aW4qKQotICAgIGxvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbj15ZXMgOzsKLSAgKikKLSAgICBsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb249bm8gOzsKLWVzYWMKLV9MVF9ERUNMKFtdLCBbb2xkX3Bvc3RpbnN0YWxsX2NtZHNdLCBbMl0pCi1fTFRfREVDTChbXSwgW29sZF9wb3N0dW5pbnN0YWxsX2NtZHNdLCBbMl0pCi1fTFRfVEFHREVDTChbXSwgW29sZF9hcmNoaXZlX2NtZHNdLCBbMl0sCi0gICAgW0NvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW4gb2xkLXN0eWxlIGFyY2hpdmVdKQotX0xUX0RFQ0woW10sIFtsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb25dLCBbMF0sCi0gICAgW1doZXRoZXIgdG8gdXNlIGEgbG9jayBmb3Igb2xkIGFyY2hpdmUgZXh0cmFjdGlvbl0pCi1dKSMgX0xUX0NNRF9PTERfQVJDSElWRQotCi0KLSMgX0xUX0NPTVBJTEVSX09QVElPTihNRVNTQUdFLCBWQVJJQUJMRS1OQU1FLCBGTEFHUywKLSMJCVtPVVRQVVQtRklMRV0sIFtBQ1RJT04tU1VDQ0VTU10sIFtBQ1RJT04tRkFJTFVSRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY29tcGlsZXIgb3B0aW9uIHdvcmtzCi1BQ19ERUZVTihbX0xUX0NPTVBJTEVSX09QVElPTl0sCi1bbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCi1tNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAotQUNfQ0FDSEVfQ0hFQ0soWyQxXSwgWyQyXSwKLSAgWyQyPW5vCi0gICBtNF9pZihbJDRdLCAsIFthY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHRdLCBbYWNfb3V0ZmlsZT0kNF0pCi0gICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGx0X2NvbXBpbGVyX2ZsYWc9IiQzIgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KLSAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAotICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAotICAgLWUgJ3M6IFtbXiBdXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRsdF9jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQotICAgYWNfc3RhdHVzPSQ/Ci0gICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JkFTX01FU1NBR0VfTE9HX0ZECi0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KLSAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KLSAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID5jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAkMj15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICAkUk0gY29uZnRlc3QqCi1dKQotCi1pZiB0ZXN0IHgiWyRdJDIiID0geHllczsgdGhlbgotICAgIG00X2lmKFskNV0sICwgOiwgWyQ1XSkKLWVsc2UKLSAgICBtNF9pZihbJDZdLCAsIDosIFskNl0pCi1maQotXSkjIF9MVF9DT01QSUxFUl9PUFRJT04KLQotIyBPbGQgbmFtZToKLUFVX0FMSUFTKFtBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTl0sIFtfTFRfQ09NUElMRVJfT1BUSU9OXSkKLWRubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKLWRubCBBQ19ERUZVTihbQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT05dLCBbXSkKLQotCi0jIF9MVF9MSU5LRVJfT1BUSU9OKE1FU1NBR0UsIFZBUklBQkxFLU5BTUUsIEZMQUdTLAotIyAgICAgICAgICAgICAgICAgIFtBQ1RJT04tU1VDQ0VTU10sIFtBQ1RJT04tRkFJTFVSRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gbGlua2VyIG9wdGlvbiB3b3JrcwotQUNfREVGVU4oW19MVF9MSU5LRVJfT1BUSU9OXSwKLVttNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKLW00X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCi1BQ19DQUNIRV9DSEVDSyhbJDFdLCBbJDJdLAotICBbJDI9bm8KLSAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCi0gICBMREZMQUdTPSIkTERGTEFHUyAkMyIKLSAgIGVjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgICAgICAkRUNITyAiJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gY29uZnRlc3QuZXhwCi0gICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgICQyPXllcwotICAgICAgIGZpCi0gICAgIGVsc2UKLSAgICAgICAkMj15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICAkUk0gLXIgY29uZnRlc3QqCi0gICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgotXSkKLQotaWYgdGVzdCB4IlskXSQyIiA9IHh5ZXM7IHRoZW4KLSAgICBtNF9pZihbJDRdLCAsIDosIFskNF0pCi1lbHNlCi0gICAgbTRfaWYoWyQ1XSwgLCA6LCBbJDVdKQotZmkKLV0pIyBfTFRfTElOS0VSX09QVElPTgotCi0jIE9sZCBuYW1lOgotQVVfQUxJQVMoW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0sIFtfTFRfTElOS0VSX09QVElPTl0pCi1kbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6Ci1kbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0sIFtdKQotCi0KLSMgTFRfQ01EX01BWF9MRU4KLSMtLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtMVF9DTURfTUFYX0xFTl0sCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotIyBmaW5kIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi1BQ19NU0dfQ0hFQ0tJTkcoW3RoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzXSkKLUFDX0NBQ0hFX1ZBTChbbHRfY3Zfc3lzX21heF9jbWRfbGVuXSwgW2RubAotICBpPTAKLSAgdGVzdHN0cmluZz0iQUJDRCIKLQotICBjYXNlICRidWlsZF9vcyBpbgotICBtc2Rvc2RqZ3BwKikKLSAgICAjIE9uIERKR1BQLCB0aGlzIHRlc3QgY2FuIGJsb3cgdXAgcHJldHR5IGJhZGx5IGR1ZSB0byBwcm9ibGVtcyBpbiBsaWJjCi0gICAgIyAoYW55IHNpbmdsZSBhcmd1bWVudCBleGNlZWRpbmcgMjAwMCBieXRlcyBjYXVzZXMgYSBidWZmZXIgb3ZlcnJ1bgotICAgICMgZHVyaW5nIGdsb2IgZXhwYW5zaW9uKS4gIEV2ZW4gaWYgaXQgd2VyZSBmaXhlZCwgdGhlIHJlc3VsdCBvZiB0aGlzCi0gICAgIyBjaGVjayB3b3VsZCBiZSBsYXJnZXIgdGhhbiBpdCBzaG91bGQgYmUuCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEyMjg4OyAgICAjIDEySyBpcyBhYm91dCByaWdodAotICAgIDs7Ci0KLSAgZ251KikKLSAgICAjIFVuZGVyIEdOVSBIdXJkLCB0aGlzIHRlc3QgaXMgbm90IHJlcXVpcmVkIGJlY2F1c2UgdGhlcmUgaXMKLSAgICAjIG5vIGxpbWl0IHRvIHRoZSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAgICAjIExpYnRvb2wgd2lsbCBpbnRlcnByZXQgLTEgYXMgbm8gbGltaXQgd2hhdHNvZXZlcgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMTsKLSAgICA7OwotCi0gIGN5Z3dpbiogfCBtaW5ndyogfCBjZWdjYyopCi0gICAgIyBPbiBXaW45eC9NRSwgdGhpcyB0ZXN0IGJsb3dzIHVwIC0tIGl0IHN1Y2NlZWRzLCBidXQgdGFrZXMKLSAgICAjIGFib3V0IDUgbWludXRlcyBhcyB0aGUgdGVzdHN0cmluZyBncm93cyBleHBvbmVudGlhbGx5LgotICAgICMgV29yc2UsIHNpbmNlIDl4L01FIGFyZSBub3QgcHJlLWVtcHRpdmVseSBtdWx0aXRhc2tpbmcsCi0gICAgIyB5b3UgZW5kIHVwIHdpdGggYSAiZnJvemVuIiBjb21wdXRlciwgZXZlbiB0aG91Z2ggd2l0aCBwYXRpZW5jZQotICAgICMgdGhlIHRlc3QgZXZlbnR1YWxseSBzdWNjZWVkcyAod2l0aCBhIG1heCBsaW5lIGxlbmd0aCBvZiAyNTZrKS4KLSAgICAjIEluc3RlYWQsIGxldCdzIGp1c3QgcHVudDogdXNlIHRoZSBtaW5pbXVtIGxpbmVsZW5ndGggcmVwb3J0ZWQgYnkKLSAgICAjIGFsbCBvZiB0aGUgc3VwcG9ydGVkIHBsYXRmb3JtczogODE5MiAob24gTlQvMksvWFApLgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOwotICAgIDs7Ci0KLSAgbWludCopCi0gICAgIyBPbiBNaU5UIHRoaXMgY2FuIHRha2UgYSBsb25nIHRpbWUgYW5kIHJ1biBvdXQgb2YgbWVtb3J5LgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOwotICAgIDs7Ci0KLSAgYW1pZ2FvcyopCi0gICAgIyBPbiBBbWlnYU9TIHdpdGggcGRrc2gsIHRoaXMgdGVzdCB0YWtlcyBob3VycywgbGl0ZXJhbGx5LgotICAgICMgU28gd2UganVzdCBwdW50IGFuZCB1c2UgYSBtaW5pbXVtIGxpbmUgbGVuZ3RoIG9mIDgxOTIuCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7Ci0gICAgOzsKLQotICBuZXRic2QqIHwgZnJlZWJzZCogfCBvcGVuYnNkKiB8IGRhcndpbiogfCBkcmFnb25mbHkqKQotICAgICMgVGhpcyBoYXMgYmVlbiBhcm91bmQgc2luY2UgMzg2QlNELCBhdCBsZWFzdC4gIExpa2VseSBmdXJ0aGVyLgotICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY3RsOyB0aGVuCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKLSAgICBlbGlmIHRlc3QgLXggL3Vzci9zYmluL3N5c2N0bDsgdGhlbgotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvdXNyL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAotICAgIGVsc2UKLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj02NTUzNgkjIHVzYWJsZSBkZWZhdWx0IGZvciBhbGwgQlNEcwotICAgIGZpCi0gICAgIyBBbmQgYWRkIGEgc2FmZXR5IHpvbmUKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyA0YAotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCi0gICAgOzsKLQotICBpbnRlcml4KikKLSAgICAjIFdlIGtub3cgdGhlIHZhbHVlIDI2MjE0NCBhbmQgaGFyZGNvZGUgaXQgd2l0aCBhIHNhZmV0eSB6b25lIChsaWtlIEJTRCkKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTk2NjA4Ci0gICAgOzsKLQotICBvc2YqKQotICAgICMgRHIuIEhhbnMgRWtrZWhhcmQgUGxlc3NlciByZXBvcnRzIHNlZWluZyBhIGtlcm5lbCBwYW5pYyBydW5uaW5nIGNvbmZpZ3VyZQotICAgICMgZHVlIHRvIHRoaXMgdGVzdCB3aGVuIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXQgaXMgMSBvbiBUcnU2NC4gSXQgaXMgbm90Ci0gICAgIyBuaWNlIHRvIGNhdXNlIGtlcm5lbCBwYW5pY3Mgc28gbGV0cyBhdm9pZCB0aGUgbG9vcCBiZWxvdy4KLSAgICAjIEZpcnN0IHNldCBhIHJlYXNvbmFibGUgZGVmYXVsdC4KLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTYzODQKLSAgICAjCi0gICAgaWYgdGVzdCAteCAvc2Jpbi9zeXNjb25maWc7IHRoZW4KLSAgICAgIGNhc2UgYC9zYmluL3N5c2NvbmZpZyAtcSBwcm9jIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXRgIGluCi0gICAgICAgICoxKikgbHRfY3Zfc3lzX21heF9jbWRfbGVuPS0xIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICA7OwotICBzY28zLjJ2NSopCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEwMjQwMAotICAgIDs7Ci0gIHN5c3Y1KiB8IHNjbzV2NiogfCBzeXN2NC4ydXcyKikKLSAgICBrYXJnbWF4PWBncmVwIEFSR19NQVggL2V0Yy9jb25mL2NmLmQvc3R1bmUgMj4vZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJGthcmdtYXgiOyB0aGVuCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGVjaG8gJGthcmdtYXggfCBzZWQgJ3MvLipbWwkgXV0vLydgCi0gICAgZWxzZQotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTMyNzY4Ci0gICAgZmkKLSAgICA7OwotICAqKQotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gKGdldGNvbmYgQVJHX01BWCkgMj4gL2Rldi9udWxsYAotICAgIGlmIHRlc3QgLW4gIiRsdF9jdl9zeXNfbWF4X2NtZF9sZW4iOyB0aGVuCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyA0YAotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXCogM2AKLSAgICBlbHNlCi0gICAgICAjIE1ha2UgdGVzdHN0cmluZyBhIGxpdHRsZSBiaWdnZXIgYmVmb3JlIHdlIGRvIGFueXRoaW5nIHdpdGggaXQuCi0gICAgICAjIGEgMUsgc3RyaW5nIHNob3VsZCBiZSBhIHJlYXNvbmFibGUgc3RhcnQuCi0gICAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNiA3IDggOyBkbwotICAgICAgICB0ZXN0c3RyaW5nPSR0ZXN0c3RyaW5nJHRlc3RzdHJpbmcKLSAgICAgIGRvbmUKLSAgICAgIFNIRUxMPSR7U0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19Ci0gICAgICAjIElmIHRlc3QgaXMgbm90IGEgc2hlbGwgYnVpbHQtaW4sIHdlJ2xsIHByb2JhYmx5IGVuZCB1cCBjb21wdXRpbmcgYQotICAgICAgIyBtYXhpbXVtIGxlbmd0aCB0aGF0IGlzIG9ubHkgaGFsZiBvZiB0aGUgYWN0dWFsIG1heGltdW0gbGVuZ3RoLCBidXQKLSAgICAgICMgd2UgY2FuJ3QgdGVsbC4KLSAgICAgIHdoaWxlIHsgdGVzdCAiWCJgZnVuY19mYWxsYmFja19lY2hvICIkdGVzdHN0cmluZyR0ZXN0c3RyaW5nIiAyPi9kZXYvbnVsbGAgXAotCSAgICAgICAgID0gIlgkdGVzdHN0cmluZyR0ZXN0c3RyaW5nIjsgfSA+L2Rldi9udWxsIDI+JjEgJiYKLQkgICAgICB0ZXN0ICRpICE9IDE3ICMgMS8yIE1CIHNob3VsZCBiZSBlbm91Z2gKLSAgICAgIGRvCi0gICAgICAgIGk9YGV4cHIgJGkgKyAxYAotICAgICAgICB0ZXN0c3RyaW5nPSR0ZXN0c3RyaW5nJHRlc3RzdHJpbmcKLSAgICAgIGRvbmUKLSAgICAgICMgT25seSBjaGVjayB0aGUgc3RyaW5nIGxlbmd0aCBvdXRzaWRlIHRoZSBsb29wLgotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICJYJHRlc3RzdHJpbmciIDogIi4qIiAyPiYxYAotICAgICAgdGVzdHN0cmluZz0KLSAgICAgICMgQWRkIGEgc2lnbmlmaWNhbnQgc2FmZXR5IGZhY3RvciBiZWNhdXNlIEMrKyBjb21waWxlcnMgY2FuIHRhY2sgb24KLSAgICAgICMgbWFzc2l2ZSBhbW91bnRzIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlCi0gICAgICAjIGxpbmtlci4gIEl0IGFwcGVhcnMgYXMgdGhvdWdoIDEvMiBpcyBhIHVzYWJsZSB2YWx1ZS4KLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDJgCi0gICAgZmkKLSAgICA7OwotICBlc2FjCi1dKQotaWYgdGVzdCAtbiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIDsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRsdF9jdl9zeXNfbWF4X2NtZF9sZW4pCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1tYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCi1fTFRfREVDTChbXSwgW21heF9jbWRfbGVuXSwgWzBdLAotICAgIFtXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/XSkKLV0pIyBMVF9DTURfTUFYX0xFTgotCi0jIE9sZCBuYW1lOgotQVVfQUxJQVMoW0FDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOXSwgW0xUX0NNRF9NQVhfTEVOXSkKLWRubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKLWRubCBBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfTUFYX0NNRF9MRU5dLCBbXSkKLQotCi0jIF9MVF9IRUFERVJfRExGQ04KLSMgLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmdW4oW19MVF9IRUFERVJfRExGQ05dLAotW0FDX0NIRUNLX0hFQURFUlMoW2RsZmNuLmhdLCBbXSwgW10sIFtBQ19JTkNMVURFU19ERUZBVUxUXSlkbmwKLV0pIyBfTFRfSEVBREVSX0RMRkNOCi0KLQotIyBfTFRfVFJZX0RMT1BFTl9TRUxGIChBQ1RJT04tSUYtVFJVRSwgQUNUSU9OLUlGLVRSVUUtVy1VU0NPUkUsCi0jICAgICAgICAgICAgICAgICAgICAgIEFDVElPTi1JRi1GQUxTRSwgQUNUSU9OLUlGLUNST1NTLUNPTVBJTElORykKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmdW4oW19MVF9UUllfRExPUEVOX1NFTEZdLAotW200X3JlcXVpcmUoW19MVF9IRUFERVJfRExGQ05dKWRubAotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICBbJDRdCi1lbHNlCi0gIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKLSAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKLVsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmIEhBVkVfRExGQ05fSAotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBSVExEX0dMT0JBTAotIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAotI2Vsc2UKLSMgIGlmZGVmIERMX0dMT0JBTAotIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAotIyAgZWxzZQotIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQotICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLwotI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCi0jICBpZmRlZiBSVExEX0xBWlkKLSMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQotIyAgZWxzZQotIyAgICBpZmRlZiBETF9MQVpZCi0jICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKLSMgICAgZWxzZQotIyAgICAgIGlmZGVmIFJUTERfTk9XCi0jICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVwotIyAgICAgIGVsc2UKLSMgICAgICAgIGlmZGVmIERMX05PVwotIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKLSMgICAgICAgIGVsc2UKLSMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAotIyAgICAgICAgZW5kaWYKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBXaGVuIC1mdmlzYmlsaXR5PWhpZGRlbiBpcyB1c2VkLCBhc3N1bWUgdGhlIGNvZGUgaGFzIGJlZW4gYW5ub3RhdGVkCi0gICBjb3JyZXNwb25kaW5nbHkgZm9yIHRoZSBzeW1ib2xzIG5lZWRlZC4gICovCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKCgoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fID49IDMpKSB8fCAoX19HTlVDX18gPiAzKSkKLXZvaWQgZm5vcmQgKCkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSk7Ci0jZW5kaWYKLQotdm9pZCBmbm9yZCAoKSB7IGludCBpPTQyOyB9Ci1pbnQgbWFpbiAoKQotewotICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKLSAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247Ci0KLSAgaWYgKHNlbGYpCi0gICAgewotICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLQkgIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpICBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKLSAgICAgICAgICBlbHNlIHB1dHMgKGRsZXJyb3IgKCkpOwotCX0KLSAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLwotICAgIH0KLSAgZWxzZQotICAgIHB1dHMgKGRsZXJyb3IgKCkpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19XQotX0xUX0VPRgotICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCi0gICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgPiZBU19NRVNTQUdFX0xPR19GRCAyPi9kZXYvbnVsbAotICAgIGx0X3N0YXR1cz0kPwotICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KLSAgICAgIHgkbHRfZGxub191c2NvcmUpICQxIDs7Ci0gICAgICB4JGx0X2RsbmVlZF91c2NvcmUpICQyIDs7Ci0gICAgICB4JGx0X2RsdW5rbm93bnx4KikgJDMgOzsKLSAgICBlc2FjCi0gIGVsc2UgOgotICAgICMgY29tcGlsYXRpb24gZmFpbGVkCi0gICAgJDMKLSAgZmkKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1dKSMgX0xUX1RSWV9ETE9QRU5fU0VMRgotCi0KLSMgTFRfU1lTX0RMT1BFTl9TRUxGCi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0xUX1NZU19ETE9QRU5fU0VMRl0sCi1bbTRfcmVxdWlyZShbX0xUX0hFQURFUl9ETEZDTl0pZG5sCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KLSAgZW5hYmxlX2Rsb3Blbj11bmtub3duCi0gIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCi0gIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgotZWxzZQotICBsdF9jdl9kbG9wZW49bm8KLSAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBiZW9zKikKLSAgICBsdF9jdl9kbG9wZW49ImxvYWRfYWRkX29uIgotICAgIGx0X2N2X2Rsb3Blbl9saWJzPQotICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcwotICAgIDs7Ci0KLSAgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCi0gICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKLSAgICBsdF9jdl9kbG9wZW5fbGlicz0KLSAgICA7OwotCi0gIGN5Z3dpbiopCi0gICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCi0gICAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0gICAgOzsKLQotICBkYXJ3aW4qKQotICAjIGlmIGxpYmRsIGlzIGluc3RhbGxlZCB3ZSBuZWVkIHRvIGxpbmsgYWdhaW5zdCBpdAotICAgIEFDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwKLQkJW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCJdLFsKLSAgICBsdF9jdl9kbG9wZW49ImR5bGQiCi0gICAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0gICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCi0gICAgXSkKLSAgICA7OwotCi0gICopCi0gICAgQUNfQ0hFQ0tfRlVOQyhbc2hsX2xvYWRdLAotCSAgW2x0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiXSwKLSAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtzaGxfbG9hZF0sCi0JICAgIFtsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiXSwKLQlbQUNfQ0hFQ0tfRlVOQyhbZGxvcGVuXSwKLQkgICAgICBbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iXSwKLQkgIFtBQ19DSEVDS19MSUIoW2RsXSwgW2Rsb3Blbl0sCi0JCVtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiXSwKLQkgICAgW0FDX0NIRUNLX0xJQihbc3ZsZF0sIFtkbG9wZW5dLAotCQkgIFtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sc3ZsZCJdLAotCSAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtkbGRfbGlua10sCi0JCSAgICBbbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGxkIl0pCi0JICAgICAgXSkKLQkgICAgXSkKLQkgIF0pCi0JXSkKLSAgICAgIF0pCi0gICAgOzsKLSAgZXNhYwotCi0gIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuIiAhPSB4bm87IHRoZW4KLSAgICBlbmFibGVfZGxvcGVuPXllcwotICBlbHNlCi0gICAgZW5hYmxlX2Rsb3Blbj1ubwotICBmaQotCi0gIGNhc2UgJGx0X2N2X2Rsb3BlbiBpbgotICBkbG9wZW4pCi0gICAgc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgotICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllcyAmJiBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgotCi0gICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLSAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCi0KLSAgICBzYXZlX0xJQlM9IiRMSUJTIgotICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKLQotICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCi0JICBsdF9jdl9kbG9wZW5fc2VsZiwgW2RubAotCSAgX0xUX1RSWV9ETE9QRU5fU0VMRigKLQkgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzLCBsdF9jdl9kbG9wZW5fc2VsZj15ZXMsCi0JICAgIGx0X2N2X2Rsb3Blbl9zZWxmPW5vLCBsdF9jdl9kbG9wZW5fc2VsZj1jcm9zcykKLSAgICBdKQotCi0gICAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW5fc2VsZiIgPSB4eWVzOyB0aGVuCi0gICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKLSAgICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCi0JICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMsIFtkbmwKLQkgIF9MVF9UUllfRExPUEVOX1NFTEYoCi0JICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMsIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMsCi0JICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubywgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1jcm9zcykKLSAgICAgIF0pCi0gICAgZmkKLQotICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKLSAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgotICAgIExJQlM9IiRzYXZlX0xJQlMiCi0gICAgOzsKLSAgZXNhYwotCi0gIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmIGluCi0gIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OwotICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OwotICBlc2FjCi0KLSAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIGluCi0gIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7Ci0gICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OwotICBlc2FjCi1maQotX0xUX0RFQ0woW2Rsb3Blbl9zdXBwb3J0XSwgW2VuYWJsZV9kbG9wZW5dLCBbMF0sCi0JIFtXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWRdKQotX0xUX0RFQ0woW2Rsb3Blbl9zZWxmXSwgW2VuYWJsZV9kbG9wZW5fc2VsZl0sIFswXSwKLQkgW1doZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZF0pCi1fTFRfREVDTChbZGxvcGVuX3NlbGZfc3RhdGljXSwgW2VuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWNdLCBbMF0sCi0JIFtXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWRdKQotXSkjIExUX1NZU19ETE9QRU5fU0VMRgotCi0jIE9sZCBuYW1lOgotQVVfQUxJQVMoW0FDX0xJQlRPT0xfRExPUEVOX1NFTEZdLCBbTFRfU1lTX0RMT1BFTl9TRUxGXSkKLWRubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKLWRubCBBQ19ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5fU0VMRl0sIFtdKQotCi0KLSMgX0xUX0NPTVBJTEVSX0NfTyhbVEFHTkFNRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtYyBhbmQgLW8gYXJlIHNpbXVsdGFuZW91c2x5IHN1cHBvcnRlZCBieSBjb21waWxlci4KLSMgVGhpcyBtYWNybyBkb2VzIG5vdCBoYXJkIGNvZGUgdGhlIGNvbXBpbGVyIGxpa2UgQUNfUFJPR19DQ19DX08uCi1tNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0NfT10sCi1bbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKLW00X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAotbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCi1BQ19DQUNIRV9DSEVDSyhbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dF0sCi0gIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSldLAotICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPW5vCi0gICAkUk0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKLSAgIG1rZGlyIGNvbmZ0ZXN0Ci0gICBjZCBjb25mdGVzdAotICAgbWtkaXIgb3V0Ci0gICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW1teIF1dKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKLSAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCi0gICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGx0X2NvbXBpbGVcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKLSAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQotICAgYWNfc3RhdHVzPSQ/Ci0gICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECi0gICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKLSAgIHRoZW4KLSAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKLSAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgIF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICBjaG1vZCB1K3cgLiAyPiZBU19NRVNTQUdFX0xPR19GRAotICAgJFJNIGNvbmZ0ZXN0KgotICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgotICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCi0gICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkUk0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCi0gICAkUk0gb3V0LyogJiYgcm1kaXIgb3V0Ci0gICBjZCAuLgotICAgJFJNIC1yIGNvbmZ0ZXN0Ci0gICAkUk0gY29uZnRlc3QqCi1dKQotX0xUX1RBR0RFQ0woW2NvbXBpbGVyX2Nfb10sIFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFsxXSwKLQlbRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zP10pCi1dKSMgX0xUX0NPTVBJTEVSX0NfTwotCi0KLSMgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoW1RBR05BTUVdKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZG8gaGFyZCBsaW5rcyB0byBsb2NrIHNvbWUgZmlsZXMgaWYgbmVlZGVkCi1tNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1NdLAotW200X3JlcXVpcmUoW19MVF9FTkFCTEVfTE9DS10pZG5sCi1tNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKLV9MVF9DT01QSUxFUl9DX08oWyQxXSkKLQotaGFyZF9saW5rcz0ibm90dGVzdGVkIgotaWYgdGVzdCAiJF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKSIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KLSAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCi0gIEFDX01TR19DSEVDS0lORyhbaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzXSkKLSAgaGFyZF9saW5rcz15ZXMKLSAgJFJNIGNvbmZ0ZXN0KgotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICB0b3VjaCBjb25mdGVzdC5hCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgQUNfTVNHX1JFU1VMVChbJGhhcmRfbGlua3NdKQotICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgotICAgIEFDX01TR19XQVJOKFtgJENDJyBkb2VzIG5vdCBzdXBwb3J0IGAtYyAtbycsIHNvIGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlXSkKLSAgICBuZWVkX2xvY2tzPXdhcm4KLSAgZmkKLWVsc2UKLSAgbmVlZF9sb2Nrcz1ubwotZmkKLV9MVF9ERUNMKFtdLCBbbmVlZF9sb2Nrc10sIFsxXSwgW011c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uP10pCi1dKSMgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MKLQotCi0jIF9MVF9DSEVDS19PQkpESVIKLSMgLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmdW4oW19MVF9DSEVDS19PQkpESVJdLAotW0FDX0NBQ0hFX0NIRUNLKFtmb3Igb2JqZGlyXSwgW2x0X2N2X29iamRpcl0sCi1bcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKLW1rZGlyIC5saWJzIDI+L2Rldi9udWxsCi1pZiB0ZXN0IC1kIC5saWJzOyB0aGVuCi0gIGx0X2N2X29iamRpcj0ubGlicwotZWxzZQotICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgotICBsdF9jdl9vYmpkaXI9X2xpYnMKLWZpCi1ybWRpciAubGlicyAyPi9kZXYvbnVsbF0pCi1vYmpkaXI9JGx0X2N2X29iamRpcgotX0xUX0RFQ0woW10sIFtvYmpkaXJdLCBbMF0sCi0gICAgICAgICBbVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzXSlkbmwKLW00X3BhdHRlcm5fYWxsb3coW0xUX09CSkRJUl0pZG5sCi1BQ19ERUZJTkVfVU5RVU9URUQoTFRfT0JKRElSLCAiJGx0X2N2X29iamRpci8iLAotICBbRGVmaW5lIHRvIHRoZSBzdWItZGlyZWN0b3J5IGluIHdoaWNoIGxpYnRvb2wgc3RvcmVzIHVuaW5zdGFsbGVkIGxpYnJhcmllcy5dKQotXSkjIF9MVF9DSEVDS19PQkpESVIKLQotCi0jIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSChbVEFHTkFNRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIGhhcmRjb2RpbmcgYXR0cmlidXRlcy4KLW00X2RlZnVuKFtfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEhdLAotW0FDX01TR19DSEVDS0lORyhbaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtc10pCi1fTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPQotaWYgdGVzdCAtbiAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIiB8fAotICAgdGVzdCAtbiAiJF9MVF9UQUdWQVIocnVucGF0aF92YXIsICQxKSIgfHwKLSAgIHRlc3QgIlgkX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKSIgPSAiWHllcyIgOyB0aGVuCi0KLSAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0ZW50IGRpcmVjdG9yaWVzLgotICBpZiB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKSIgIT0gbm8gJiYKLSAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQotICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5Ci0gICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKLSAgICAgIyMgdGVzdCAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpIiAhPSBubyAmJgotICAgICB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSkiICE9IG5vOyB0aGVuCi0gICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KLSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPXJlbGluawotICBlbHNlCi0gICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KLSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPWltbWVkaWF0ZQotICBmaQotZWxzZQotICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZwotICAjIGRpcmVjdG9yaWVzLgotICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPXVuc3VwcG9ydGVkCi1maQotQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSldKQotCi1pZiB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKSIgPSByZWxpbmsgfHwKLSAgIHRlc3QgIiRfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKSIgPSB5ZXM7IHRoZW4KLSAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLWVsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKLSAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KLSAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5Ci0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKLWZpCi1fTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2FjdGlvbl0sIFswXSwKLSAgICBbSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGVdKQotXSkjIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSAotCi0KLSMgX0xUX0NNRF9TVFJJUExJQgotIyAtLS0tLS0tLS0tLS0tLS0tCi1tNF9kZWZ1bihbX0xUX0NNRF9TVFJJUExJQl0sCi1bbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKQotc3RyaXBsaWI9Ci1vbGRfc3RyaXBsaWI9Ci1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZV0pCi1pZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgJEdSRVAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgotICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgotICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKLSAgQUNfTVNHX1JFU1VMVChbeWVzXSkKLWVsc2UKLSMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAotICBjYXNlICRob3N0X29zIGluCi0gIGRhcndpbiopCi0gICAgaWYgdGVzdCAtbiAiJFNUUklQIiA7IHRoZW4KLSAgICAgIHN0cmlwbGliPSIkU1RSSVAgLXgiCi0gICAgICBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtUyIKLSAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCi0gICAgZWxzZQotICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQotICAgIGZpCi0gICAgOzsKLSAgKikKLSAgICBBQ19NU0dfUkVTVUxUKFtub10pCi0gICAgOzsKLSAgZXNhYwotZmkKLV9MVF9ERUNMKFtdLCBbb2xkX3N0cmlwbGliXSwgWzFdLCBbQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzXSkKLV9MVF9ERUNMKFtdLCBbc3RyaXBsaWJdLCBbMV0pCi1dKSMgX0xUX0NNRF9TVFJJUExJQgotCi0KLSMgX0xUX1NZU19EWU5BTUlDX0xJTktFUihbVEFHXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUE9SVE1FIEZpbGwgaW4geW91ciBsZC5zbyBjaGFyYWN0ZXJpc3RpY3MKLW00X2RlZnVuKFtfTFRfU1lTX0RZTkFNSUNfTElOS0VSXSwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1tNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCi1tNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKLW00X3JlcXVpcmUoW19MVF9ERUNMX09CSkRVTVBdKWRubAotbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKLW00X3JlcXVpcmUoW19MVF9DSEVDS19TSEVMTF9GRUFUVVJFU10pZG5sCi1BQ19NU0dfQ0hFQ0tJTkcoW2R5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljc10pCi1tNF9pZihbJDFdLAotCVtdLCBbCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICBjYXNlICRob3N0X29zIGluCi0gICAgZGFyd2luKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LywvTFIvIiA7OwotICAgICopIGx0X2F3a19hcmc9Ii9ebGlicmFyaWVzOi8iIDs7Ci0gIGVzYWMKLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG1pbmd3KiB8IGNlZ2NjKikgbHRfc2VkX3N0cmlwX2VxPSJzLD1cKFtbQS1aYS16XV06XCksXDEsZyIgOzsKLSAgICAqKSBsdF9zZWRfc3RyaXBfZXE9InMsPS8sLyxnIiA7OwotICBlc2FjCi0gIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBhd2sgJGx0X2F3a19hcmcgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICRsdF9zZWRfc3RyaXBfZXFgCi0gIGNhc2UgJGx0X3NlYXJjaF9wYXRoX3NwZWMgaW4KLSAgKlw7KikKLSAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCi0gICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCi0gICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCi0gICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCi0gICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgJ3MvOy8gL2cnYAotICAgIDs7Ci0gICopCi0gICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gICAgOzsKLSAgZXNhYwotICAjIE9rLCBub3cgd2UgaGF2ZSB0aGUgcGF0aCwgc2VwYXJhdGVkIGJ5IHNwYWNlcywgd2UgY2FuIHN0ZXAgdGhyb3VnaCBpdAotICAjIGFuZCBhZGQgbXVsdGlsaWIgZGlyIGlmIG5lY2Vzc2FyeS4KLSAgbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9Ci0gIGx0X211bHRpX29zX2Rpcj1gJENDICRDUFBGTEFHUyAkQ0ZMQUdTICRMREZMQUdTIC1wcmludC1tdWx0aS1vcy1kaXJlY3RvcnkgMj4vZGV2L251bGxgCi0gIGZvciBsdF9zeXNfcGF0aCBpbiAkbHRfc2VhcmNoX3BhdGhfc3BlYzsgZG8KLSAgICBpZiB0ZXN0IC1kICIkbHRfc3lzX3BhdGgvJGx0X211bHRpX29zX2RpciI7IHRoZW4KLSAgICAgIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgJGx0X3N5c19wYXRoLyRsdF9tdWx0aV9vc19kaXIiCi0gICAgZWxzZQotICAgICAgdGVzdCAtZCAiJGx0X3N5c19wYXRoIiAmJiBcCi0JbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9IiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyAkbHRfc3lzX3BhdGgiCi0gICAgZmkKLSAgZG9uZQotICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjIiB8IGF3ayAnCi1CRUdJTiB7UlM9IiAiOyBGUz0iL3xcbiI7fSB7Ci0gIGx0X2Zvbz0iIjsKLSAgbHRfY291bnQ9MDsKLSAgZm9yIChsdF9pID0gTkY7IGx0X2kgPiAwOyBsdF9pLS0pIHsKLSAgICBpZiAoJGx0X2kgIT0gIiIgJiYgJGx0X2kgIT0gIi4iKSB7Ci0gICAgICBpZiAoJGx0X2kgPT0gIi4uIikgewotICAgICAgICBsdF9jb3VudCsrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGx0X2NvdW50ID09IDApIHsKLSAgICAgICAgICBsdF9mb289Ii8iICRsdF9pIGx0X2ZvbzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBsdF9jb3VudC0tOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGlmIChsdF9mb28gIT0gIiIpIHsgbHRfZnJlcVtbbHRfZm9vXV0rKzsgfQotICBpZiAobHRfZnJlcVtbbHRfZm9vXV0gPT0gMSkgeyBwcmludCBsdF9mb287IH0KLX0nYAotICAjIEFXSyBwcm9ncmFtIGFib3ZlIGVycm9uZW91c2x5IHByZXBlbmRzICcvJyB0byBDOi9kb3MvcGF0aHMKLSAgIyBmb3IgdGhlc2UgaG9zdHMuCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBtaW5ndyogfCBjZWdjYyopIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfFwKLSAgICAgICRTRUQgJ3MsL1woW1tBLVphLXpdXTpcKSxcMSxnJ2AgOzsKLSAgZXNhYwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkbHRfTkwyU1BgCi1lbHNlCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLWZpXSkKLWxpYnJhcnlfbmFtZXNfc3BlYz0KLWxpYm5hbWVfc3BlYz0nbGliJG5hbWUnCi1zb25hbWVfc3BlYz0KLXNocmV4dF9jbWRzPSIuc28iCi1wb3N0aW5zdGFsbF9jbWRzPQotcG9zdHVuaW5zdGFsbF9jbWRzPQotZmluaXNoX2NtZHM9Ci1maW5pc2hfZXZhbD0KLXNobGlicGF0aF92YXI9Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgotdmVyc2lvbl90eXBlPW5vbmUKLWR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgotbmVlZF9saWJfcHJlZml4PXVua25vd24KLWhhcmRjb2RlX2ludG9fbGlicz1ubwotCi0jIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KLSMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cwotbmVlZF92ZXJzaW9uPXVua25vd24KLQotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0KLSAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICA7OwotCi1haXhbWzQtOV1dKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGVsc2UKLSAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCi0gICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAotICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KLSAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgotICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4NCB8IGFpeDQuW1swMV1dIHwgYWl4NC5bWzAxXV0uKikKLSAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCi0JICAgZWNobyAnIHllcyAnCi0JICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCAkR1JFUCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKLSAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCi0gICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KLSAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLSAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbwotICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKLSAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIGVsc2UKLSAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCi0gICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJwotICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICBmaQotICAgIHNobGlicGF0aF92YXI9TElCUEFUSAotICBmaQotICA7OwotCi1hbWlnYW9zKikKLSAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgcG93ZXJwYykKLSAgICAjIFNpbmNlIEp1bHkgMjAwNyBBbWlnYU9TNCBvZmZpY2lhbGx5IHN1cHBvcnRzIC5zbyBsaWJyYXJpZXMuCi0gICAgIyBXaGVuIGNvbXBpbGluZyB0aGUgZXhlY3V0YWJsZSwgYWRkIC11c2UtZHlubGQgLUxzb2JqczogdG8gdGhlIGNvbXBpbGVsaW5lLgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIDs7Ci0gIG02OGspCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKLSAgICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgotICAgIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gZnVuY19lY2hvX2FsbCAiJGxpYiIgfCAkU0VEICdcJydzJV4uKi9cKFtbXi9dXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkUk0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICJjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIjsgY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSB8fCBleGl0IDE7IGRvbmUnCi0gICAgOzsKLSAgZXNhYwotICA7OwotCi1iZW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAotICA7OwotCi1ic2RpW1s0NV1dKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKLSAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93Ci0gICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcwotICA7OwotCi1jeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCi0gIHZlcnNpb25fdHlwZT13aW5kb3dzCi0gIHNocmV4dF9jbWRzPSIuZGxsIgotICBuZWVkX3ZlcnNpb249bm8KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0KLSAgY2FzZSAkR0NDLCRob3N0X29zIGluCi0gIHllcyxjeWd3aW4qIHwgeWVzLG1pbmd3KiB8IHllcyxwdzMyKiB8IHllcyxjZWdjYyopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKLSAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCi0gICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+Ci0gICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTsgZWNobyBcJGRsbmFtZSdcJydgfgotICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgotICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+Ci0gICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+Ci0gICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lfgotICAgICAgaWYgdGVzdCAtbiAnXCcnJHN0cmlwbWUnXCcnICYmIHRlc3QgLW4gJ1wnJyRzdHJpcGxpYidcJyc7IHRoZW4KLSAgICAgICAgZXZhbCAnXCcnJHN0cmlwbGliIFwkZGxkaXIvJGRsbmFtZSdcJycgfHwgZXhpdCBcJD87Ci0gICAgICBmaScKLSAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgotICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KLSAgICAgICAkUk0gXCRkbHBhdGgnCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGN5Z3dpbiopCi0gICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKLSAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotbTRfaWYoWyQxXSwgW10sWwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC91c3IvbGliL3czMmFwaSJdKQotICAgICAgOzsKLSAgICBtaW5ndyogfCBjZWdjYyopCi0gICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAotICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICA7OwotICAgIHB3MzIqKQotICAgICAgIyBwdzMyIERMTHMgdXNlICdwdycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0KLSAgKikKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJwotICAgIDs7Ci0gIGVzYWMKLSAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKLSAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCi0gIHNobGlicGF0aF92YXI9UEFUSAotICA7OwotCi1kYXJ3aW4qIHwgcmhhcHNvZHkqKQotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKLSAgdmVyc2lvbl90eXBlPWRhcndpbgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICi0gIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJwotbTRfaWYoWyQxXSwgW10sWwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL3Vzci9sb2NhbC9saWIiXSkKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCi0gIDs7Ci0KLWRndXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWZyZWVic2QxKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotZnJlZWJzZCogfCBkcmFnb25mbHkqKQotICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3Ci0gICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgotICBpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgotICAgIG9iamZvcm1hdD1gL3Vzci9iaW4vb2JqZm9ybWF0YAotICBlbHNlCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGZyZWVic2RbWzEyM11dKikgb2JqZm9ybWF0PWFvdXQgOzsKLSAgICAqKSBvYmpmb3JtYXQ9ZWxmIDs7Ci0gICAgZXNhYwotICBmaQotICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0Ci0gIGNhc2UgJHZlcnNpb25fdHlwZSBpbgotICAgIGZyZWVic2QtZWxmKikKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgICAgbmVlZF92ZXJzaW9uPW5vCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIDs7Ci0gICAgZnJlZWJzZC0qKQotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gICAgICBuZWVkX3ZlcnNpb249eWVzCi0gICAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgZnJlZWJzZDIqKQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICA7OwotICBmcmVlYnNkMy5bWzAxXV0qIHwgZnJlZWJzZGVsZjMuW1swMV1dKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLltbMi05XV0qIHwgZnJlZWJzZGVsZjMuW1syLTldXSogfCBcCi0gIGZyZWVic2Q0LltbMC01XV0gfCBmcmVlYnNkZWxmNC5bWzAtNV1dIHwgZnJlZWJzZDQuMS4xIHwgZnJlZWJzZGVsZjQuMS4xKQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICAqKSAjIGZyb20gNC42IG9uLCBhbmQgRHJhZ29uRmx5Ci0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1oYWlrdSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBydW50aW1lX2xvYWRlciIKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvYm9vdC9ob21lL2NvbmZpZy9saWIgL2Jvb3QvY29tbW9uL2xpYiAvYm9vdC9zeXN0ZW0vbGliJwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCi0gICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBjYXNlICRob3N0X2NwdSBpbgotICBpYTY0KikKLSAgICBzaHJleHRfY21kcz0nLnNvJwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKLSAgICBlbHNlCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCi0gICAgZmkKLSAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgOzsKLSAgaHBwYSo2NCopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCi0gICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotICAgIDs7Ci0gICopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICA7OwotICBlc2FjCi0gICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LCAuLi4KLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCi0gICMgb3IgZmFpbHMgb3V0cmlnaHQsIHNvIG92ZXJyaWRlIGF0b21pY2FsbHk6Ci0gIGluc3RhbGxfb3ZlcnJpZGVfbW9kZT01NTUKLSAgOzsKLQotaW50ZXJpeFtbMy05XV0qKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKLSAgICAqKQotCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KLQkJdmVyc2lvbl90eXBlPWxpbnV4Ci0JZWxzZQotCQl2ZXJzaW9uX3R5cGU9aXJpeAotCWZpIDs7Ci0gIGVzYWMKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgaXJpeDUqIHwgbm9uc3RvcHV4KikKLSAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9Ci0gICAgOzsKLSAgKikKLSAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECi0gICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKLSAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKLSAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQotICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7Ci0gICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCi0gICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OwotICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgotbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0KLSAgIyBTb21lIGJpbnV0aWxzIGxkIGFyZSBwYXRjaGVkIHRvIHNldCBEVF9SVU5QQVRICi0gIEFDX0NBQ0hFX1ZBTChbbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoXSwKLSAgICBbbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgc2F2ZV9MREZMQUdTPSRMREZMQUdTCi0gICAgc2F2ZV9saWJkaXI9JGxpYmRpcgotICAgIGV2YWwgImxpYmRpcj0vZm9vOyB3bD1cIiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKVwiOyBcCi0JIExERkxBR1M9XCJcJExERkxBR1MgJF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpXCIiCi0gICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSxbXSldLAotICAgICAgW0FTX0lGKFsgKCRPQkpEVU1QIC1wIGNvbmZ0ZXN0JGFjX2V4ZWV4dCkgMj4vZGV2L251bGwgfCBncmVwICJSVU5QQVRILiokbGliZGlyIiA+L2Rldi9udWxsXSwKLQkgW2x0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXNdKV0pCi0gICAgTERGTEFHUz0kc2F2ZV9MREZMQUdTCi0gICAgbGliZGlyPSRzYXZlX2xpYmRpcgotICAgIF0pCi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCi0KLSAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCi0gICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAotICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0KLSAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKLSAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KLSAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMgMj4vZGV2L251bGwiLCBcWyRdMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXFskXTA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87L15bCSBdKmh3Y2FwWwkgXS9kO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nO3MvIi8vZzsvXiQvZCcgfCB0ciAnXG4nICcgJ2AKLSAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAkbHRfbGRfZXh0cmEiCi0gIGZpCi0KLSAgIyBXZSB1c2VkIHRvIHRlc3QgZm9yIC9saWIvbGQuc28uMSBhbmQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIG9uCi0gICMgcG93ZXJwYywgYmVjYXVzZSBNa0xpbnV4IG9ubHkgc3VwcG9ydGVkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUKLSAgIyBHTlUgZHluYW1pYyBsaW5rZXIuICBTaW5jZSB0aGlzIHdhcyBicm9rZW4gd2l0aCBjcm9zcyBjb21waWxlcnMsCi0gICMgbW9zdCBwb3dlcnBjLWxpbnV4IGJveGVzIHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHRoZXNlIGRheXMgYW5kCi0gICMgcGVvcGxlIGNhbiBhbHdheXMgLS1kaXNhYmxlLXNoYXJlZCwgdGhlIHRlc3Qgd2FzIHJlbW92ZWQsIGFuZCB3ZQotICAjIGFzc3VtZSB0aGUgR05VL0xpbnV4IGR5bmFtaWMgbGlua2VyIGlzIGluIHVzZS4KLSAgZHluYW1pY19saW5rZXI9J0dOVS9MaW51eCBsZC5zbycKLSAgOzsKLQotbmV0YnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJwotICBlbHNlCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJwotICBmaQotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotbmV3c29zNikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLSpudG8qIHwgKnFueCopCi0gIHZlcnNpb25fdHlwZT1xbngKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J2xkcW54LnNvJwotICA7OwotCi1vcGVuYnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopCW5lZWRfdmVyc2lvbj15ZXMgOzsKLSAgICAqKQkJCQluZWVkX3ZlcnNpb249bm8gIDs7Ci0gIGVzYWMKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIG9wZW5ic2QyLltbODldXSB8IG9wZW5ic2QyLltbODldXS4qKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotCTs7Ci0gICAgICAqKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQk7OwotICAgICAgZXNhYwotICBlbHNlCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBmaQotICA7OwotCi1vczIqKQotICBsaWJuYW1lX3NwZWM9JyRuYW1lJwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCi0gIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKLSAgOzsKLQotcmRvcyopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLXNvbGFyaXMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCi0gIDs7Ci0KLXN1bm9zNCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgZmkKLSAgbmVlZF92ZXJzaW9uPXllcwotICA7OwotCi1zeXN2NCB8IHN5c3Y0LjMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gICAgc25pKQotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgICA7OwotICAgIHNpZW1lbnMpCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIDs7Ci0gICAgbW90b3JvbGEpCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJwotICAgICAgOzsKLSAgZXNhYwotICA7OwotCi1zeXN2NCpNUCopCi0gIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KLSAgICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJwotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGZpCi0gIDs7Ci0KLXN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQotICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJwotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIHNjbzMuMnY1KikKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCi0JOzsKLSAgICBlc2FjCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKLSAgOzsKLQotdHBmKikKLSAgIyBUUEYgaXMgYSBjcm9zcy10YXJnZXQgb25seS4gIFByZWZlcnJlZCBjcm9zcy1ob3N0ID0gR05VL0xpbnV4LgotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotdXRzNCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLWVzYWMKLUFDX01TR19SRVNVTFQoWyRkeW5hbWljX2xpbmtlcl0pCi10ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKLWZpCi0KLWlmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X2N2X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKLWZpCi1pZiB0ZXN0ICIke2x0X2N2X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiCi1maQotCi1fTFRfREVDTChbXSwgW3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rXSwgWzFdLAotICAgIFtWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKLSAgICByZXN0b3JlZCBhdCBsaW5rIHRpbWVdKQotX0xUX0RFQ0woW10sIFtuZWVkX2xpYl9wcmVmaXhdLCBbMF0sCi0gICAgW0RvIHdlIG5lZWQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcz9dKQotX0xUX0RFQ0woW10sIFtuZWVkX3ZlcnNpb25dLCBbMF0sIFtEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzP10pCi1fTFRfREVDTChbXSwgW3ZlcnNpb25fdHlwZV0sIFswXSwgW0xpYnJhcnkgdmVyc2lvbmluZyB0eXBlXSkKLV9MVF9ERUNMKFtdLCBbcnVucGF0aF92YXJdLCBbMF0sICBbU2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlXSkKLV9MVF9ERUNMKFtdLCBbc2hsaWJwYXRoX3Zhcl0sIFswXSxbU2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZV0pCi1fTFRfREVDTChbXSwgW3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aF0sIFswXSwKLSAgICBbSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoP10pCi1fTFRfREVDTChbXSwgW2xpYm5hbWVfc3BlY10sIFsxXSwgW0Zvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4XSkKLV9MVF9ERUNMKFtdLCBbbGlicmFyeV9uYW1lc19zcGVjXSwgWzFdLAotICAgIFtbTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KLSAgICBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FXV0pCi1fTFRfREVDTChbXSwgW3NvbmFtZV9zcGVjXSwgWzFdLAotICAgIFtbVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWVdXSkKLV9MVF9ERUNMKFtdLCBbaW5zdGFsbF9vdmVycmlkZV9tb2RlXSwgWzFdLAotICAgIFtQZXJtaXNzaW9uIG1vZGUgb3ZlcnJpZGUgZm9yIGluc3RhbGxhdGlvbiBvZiBzaGFyZWQgbGlicmFyaWVzXSkKLV9MVF9ERUNMKFtdLCBbcG9zdGluc3RhbGxfY21kc10sIFsyXSwKLSAgICBbQ29tbWFuZCB0byB1c2UgYWZ0ZXIgaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmVdKQotX0xUX0RFQ0woW10sIFtwb3N0dW5pbnN0YWxsX2NtZHNdLCBbMl0sCi0gICAgW0NvbW1hbmQgdG8gdXNlIGFmdGVyIHVuaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmVdKQotX0xUX0RFQ0woW10sIFtmaW5pc2hfY21kc10sIFsyXSwKLSAgICBbQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5XSkKLV9MVF9ERUNMKFtdLCBbZmluaXNoX2V2YWxdLCBbMV0sCi0gICAgW1tBcyAiZmluaXNoX2NtZHMiLCBleGNlcHQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQKLSAgICBub3Qgc2hvd25dXSkKLV9MVF9ERUNMKFtdLCBbaGFyZGNvZGVfaW50b19saWJzXSwgWzBdLAotICAgIFtXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzXSkKLV9MVF9ERUNMKFtdLCBbc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXSwgWzJdLAotICAgIFtDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXNdKQotX0xUX0RFQ0woW10sIFtzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlY10sIFsyXSwKLSAgICBbUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXNdKQotXSkjIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIKLQotCi0jIF9MVF9QQVRIX1RPT0xfUFJFRklYKFRPT0wpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGZpbmQgYSBmaWxlIHByb2dyYW0gd2hpY2ggY2FuIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyeQotQUNfREVGVU4oW19MVF9QQVRIX1RPT0xfUFJFRklYXSwKLVttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMV0pCi1BQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9NQUdJQ19DTUQsCi1bY2FzZSAkTUFHSUNfQ01EIGluCi1bW1xcLypdIHwgID86W1xcL10qXSkKLSAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotKikKLSAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZG5sICRhY19kdW1teSBmb3JjZXMgc3BsaXR0aW5nIG9uIGNvbnN0YW50IHVzZXItc3VwcGxpZWQgcGF0aHMuCi1kbmwgUE9TSVguMiB3b3JkIHNwbGl0dGluZyBpcyBkb25lIG9ubHkgb24gdGhlIG91dHB1dCBvZiB3b3JkIGV4cGFuc2lvbnMsCi1kbmwgbm90IGV2ZXJ5IHdvcmQuICBUaGlzIGNsb3NlcyBhIGxvbmdzdGFuZGluZyBzaCBzZWN1cml0eSBob2xlLgotICBhY19kdW1teT0ibTRfaWYoWyQyXSwgLCAkUEFUSCwgWyQyXSkiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyQxOyB0aGVuCi0gICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci8kMSIKLSAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KLQljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgotCSJmaWxlX21hZ2ljICIqKQotCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCi0JICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKLQkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKLQkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgOgotCSAgZWxzZQotCSAgICBjYXQgPDxfTFRfRU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKLSoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KLSoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcwotKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0Ci0qKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKLSoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKLSoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KLSoqKiBidWctbGlidG9vbEBnbnUub3JnCi0KLV9MVF9FT0YKLQkgIGZpIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCi0gIDs7Ci1lc2FjXSkKLU1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgotaWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVCgkTUFHSUNfQ01EKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLV9MVF9ERUNMKFtdLCBbTUFHSUNfQ01EXSwgWzBdLAotCSBbVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyB3aXRoICJmaWxlIl0pZG5sCi1dKSMgX0xUX1BBVEhfVE9PTF9QUkVGSVgKLQotIyBPbGQgbmFtZToKLUFVX0FMSUFTKFtBQ19QQVRIX1RPT0xfUFJFRklYXSwgW19MVF9QQVRIX1RPT0xfUFJFRklYXSkKLWRubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKLWRubCBBQ19ERUZVTihbQUNfUEFUSF9UT09MX1BSRUZJWF0sIFtdKQotCi0KLSMgX0xUX1BBVEhfTUFHSUMKLSMgLS0tLS0tLS0tLS0tLS0KLSMgZmluZCBhIGZpbGUgcHJvZ3JhbSB3aGljaCBjYW4gcmVjb2duaXplIGEgc2hhcmVkIGxpYnJhcnkKLW00X2RlZnVuKFtfTFRfUEFUSF9NQUdJQ10sCi1bX0xUX1BBVEhfVE9PTF9QUkVGSVgoJHthY190b29sX3ByZWZpeH1maWxlLCAvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIKQotaWYgdGVzdCAteiAiJGx0X2N2X3BhdGhfTUFHSUNfQ01EIjsgdGhlbgotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICAgX0xUX1BBVEhfVE9PTF9QUkVGSVgoZmlsZSwgL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCkKLSAgZWxzZQotICAgIE1BR0lDX0NNRD06Ci0gIGZpCi1maQotXSkjIF9MVF9QQVRIX01BR0lDCi0KLQotIyBMVF9QQVRIX0xECi0jIC0tLS0tLS0tLS0KLSMgZmluZCB0aGUgcGF0aG5hbWUgdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgotQUNfREVGVU4oW0xUX1BBVEhfTERdLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLW00X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCi1tNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCi1tNF9yZXF1aXJlKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pZG5sCi0KLUFDX0FSR19XSVRIKFtnbnUtbGRdLAotICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWdudS1sZF0sCi0JW2Fzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBAPDpAZGVmYXVsdD1ub0A6PkBdKV0sCi0gICAgW3Rlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllc10sCi0gICAgW3dpdGhfZ251X2xkPW5vXSlkbmwKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgJENDXSkKLSAgY2FzZSAkaG9zdCBpbgotICAqLSotbWluZ3cqKQotICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKLSAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7Ci0gICopCi0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OwotICBlc2FjCi0gIGNhc2UgJGFjX3Byb2cgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICBbW1xcL11dKiB8ID86W1tcXC9dXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bW14vXV1bW14vXV0qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGhuYW1lIG9mIGxkCi0gICAgICBhY19wcm9nPWAkRUNITyAiJGFjX3Byb2cifCAkU0VEICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlICRFQ0hPICIkYWNfcHJvZyIgfCAkR1JFUCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWAkRUNITyAkYWNfcHJvZ3wgJFNFRCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKLWVsc2UKLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCi1maQotQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfTEQsCi1baWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgotICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSB2YXJpYW50cyBvZiBHTlUgbGQgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGNhc2UgYCIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgotICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotCTs7Ci0gICAgICAqKQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0JOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGx0X3NhdmVfaWZzIgotZWxzZQotICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmldKQotTEQ9IiRsdF9jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRMRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi10ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQotX0xUX1BBVEhfTERfR05VCi1BQ19TVUJTVChbTERdKQotCi1fTFRfVEFHREVDTChbXSwgW0xEXSwgWzFdLCBbVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllc10pCi1dKSMgTFRfUEFUSF9MRAotCi0jIE9sZCBuYW1lczoKLUFVX0FMSUFTKFtBTV9QUk9HX0xEXSwgW0xUX1BBVEhfTERdKQotQVVfQUxJQVMoW0FDX1BST0dfTERdLCBbTFRfUEFUSF9MRF0pCi1kbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6Ci1kbmwgQUNfREVGVU4oW0FNX1BST0dfTERdLCBbXSkKLWRubCBBQ19ERUZVTihbQUNfUFJPR19MRF0sIFtdKQotCi0KLSMgX0xUX1BBVEhfTERfR05VCi0jLSAtLS0tLS0tLS0tLS0tLQotbTRfZGVmdW4oW19MVF9QQVRIX0xEX0dOVV0sCi1bQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgbHRfY3ZfcHJvZ19nbnVfbGQsCi1bIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgotY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KLSpHTlUqIHwgKid3aXRoIEJGRCcqKQotICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKLSAgOzsKLSopCi0gIGx0X2N2X3Byb2dfZ251X2xkPW5vCi0gIDs7Ci1lc2FjXSkKLXdpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAotXSkjIF9MVF9QQVRIX0xEX0dOVQotCi0KLSMgX0xUX0NNRF9SRUxPQUQKLSMgLS0tLS0tLS0tLS0tLS0KLSMgZmluZCByZWxvYWQgZmxhZyBmb3IgbGlua2VyCi0jICAgLS0gUE9SVE1FIFNvbWUgbGlua2VycyBtYXkgbmVlZCBhIGRpZmZlcmVudCByZWxvYWQgZmxhZy4KLW00X2RlZnVuKFtfTFRfQ01EX1JFTE9BRF0sCi1bQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXNdLAotICBsdF9jdl9sZF9yZWxvYWRfZmxhZywKLSAgW2x0X2N2X2xkX3JlbG9hZF9mbGFnPSctciddKQotcmVsb2FkX2ZsYWc9JGx0X2N2X2xkX3JlbG9hZF9mbGFnCi1jYXNlICRyZWxvYWRfZmxhZyBpbgotIiIgfCAiICIqKSA7OwotKikgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciIDs7Ci1lc2FjCi1yZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi1jYXNlICRob3N0X29zIGluCi0gIGRhcndpbiopCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICAgIHJlbG9hZF9jbWRzPSckTFRDQyAkTFRDRkxBR1MgLW5vc3RkbGliICR7d2x9LXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLSAgICBlbHNlCi0gICAgICByZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi0gICAgZmkKLSAgICA7OwotZXNhYwotX0xUX1RBR0RFQ0woW10sIFtyZWxvYWRfZmxhZ10sIFsxXSwgW0hvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXNdKWRubAotX0xUX1RBR0RFQ0woW10sIFtyZWxvYWRfY21kc10sIFsyXSlkbmwKLV0pIyBfTFRfQ01EX1JFTE9BRAotCi0KLSMgX0xUX0NIRUNLX01BR0lDX01FVEhPRAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGhvdyB0byBjaGVjayBmb3IgbGlicmFyeSBkZXBlbmRlbmNpZXMKLSMgIC0tIFBPUlRNRSBmaWxsIGluIHdpdGggdGhlIGR5bmFtaWMgbGlicmFyeSBjaGFyYWN0ZXJpc3RpY3MKLW00X2RlZnVuKFtfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9EXSwKLVttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pCi1tNF9yZXF1aXJlKFtfTFRfREVDTF9PQkpEVU1QXSkKLUFDX0NBQ0hFX0NIRUNLKFtob3cgdG8gcmVjb2duaXplIGRlcGVuZGVudCBsaWJyYXJpZXNdLAotbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QsCi1bbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRNQUdJQ19DTUQnCi1sdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0KLWx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSd1bmtub3duJwotIyBOZWVkIHRvIHNldCB0aGUgcHJlY2VkaW5nIHZhcmlhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0Ci0jIGludGVybGlicmFyeSBkZXBlbmRlbmNpZXMuCi0jICdub25lJyAtLSBkZXBlbmRlbmNpZXMgbm90IHN1cHBvcnRlZC4KLSMgYHVua25vd24nIC0tIHNhbWUgYXMgbm9uZSwgYnV0IGRvY3VtZW50cyB0aGF0IHdlIHJlYWxseSBkb24ndCBrbm93LgotIyAncGFzc19hbGwnIC0tIGFsbCBkZXBlbmRlbmNpZXMgcGFzc2VkIHdpdGggbm8gY2hlY2tzLgotIyAndGVzdF9jb21waWxlJyAtLSBjaGVjayBieSBtYWtpbmcgdGVzdCBwcm9ncmFtLgotIyAnZmlsZV9tYWdpYyBbW3JlZ2V4XV0nIC0tIGNoZWNrIGJ5IGxvb2tpbmcgZm9yIGZpbGVzIGluIGxpYnJhcnkgcGF0aAotIyB3aGljaCByZXNwb25kcyB0byB0aGUgJGZpbGVfbWFnaWNfY21kIHdpdGggYSBnaXZlbiBleHRlbmRlZCByZWdleC4KLSMgSWYgeW91IGhhdmUgYGZpbGUnIG9yIGVxdWl2YWxlbnQgb24geW91ciBzeXN0ZW0gYW5kIHlvdSdyZSBub3Qgc3VyZQotIyB3aGV0aGVyIGBwYXNzX2FsbCcgd2lsbCAqYWx3YXlzKiB3b3JrLCB5b3UgcHJvYmFibHkgd2FudCB0aGlzIG9uZS4KLQotY2FzZSAkaG9zdF9vcyBpbgotYWl4W1s0LTldXSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWJlb3MqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1ic2RpW1s0NV1dKikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpJwotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL3Vzci9iaW4vZmlsZSAtTCcKLSAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KLSAgOzsKLQotY3lnd2luKikKLSAgIyBmdW5jX3dpbjMyX2xpYmlkIGlzIGEgc2hlbGwgZnVuY3Rpb24gZGVmaW5lZCBpbiBsdG1haW4uc2gKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9J2Z1bmNfd2luMzJfbGliaWQnCi0gIDs7Ci0KLW1pbmd3KiB8IHB3MzIqKQotICAjIEJhc2UgTVNZUy9NaW5HVyBkbyBub3QgcHJvdmlkZSB0aGUgJ2ZpbGUnIGNvbW1hbmQgbmVlZGVkIGJ5Ci0gICMgZnVuY193aW4zMl9saWJpZCBzaGVsbCBmdW5jdGlvbiwgc28gdXNlIGEgd2Vha2VyIHRlc3QgYmFzZWQgb24gJ29iamR1bXAnLAotICAjIHVubGVzcyB3ZSBmaW5kICdmaWxlJywgZm9yIGV4YW1wbGUgYmVjYXVzZSB3ZSBhcmUgY3Jvc3MtY29tcGlsaW5nLgotICAjIGZ1bmNfd2luMzJfbGliaWQgYXNzdW1lcyBCU0Qgbm0sIHNvIGRpc2FsbG93IGl0IGlmIHVzaW5nIE1TIGR1bXBiaW4uCi0gIGlmICggdGVzdCAiJGx0X2N2X25tX2ludGVyZmFjZSIgPSAiQlNEIG5tIiAmJiBmaWxlIC8gKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBeeDg2IGFyY2hpdmUgaW1wb3J0fF54ODYgRExMJwotICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJwotICBlbHNlCi0gICAgIyBLZWVwIHRoaXMgcGF0dGVybiBpbiBzeW5jIHdpdGggdGhlIG9uZSBpbiBmdW5jX3dpbjMyX2xpYmlkLgotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IChwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpP3xwZS1hcm0td2luY2V8cGUteDg2LTY0KScKLSAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE9CSkRVTVAgLWYnCi0gIGZpCi0gIDs7Ci0KLWNlZ2NjKikKLSAgIyB1c2UgdGhlIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJy4gU2VlIG1pbmd3Ki4KLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGUtYXJtLS4qbGl0dGxlKC4qYXJjaGl0ZWN0dXJlOiBhcm0pPycKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJwotICA7OwotCi1kYXJ3aW4qIHwgcmhhcHNvZHkqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1mcmVlYnNkKiB8IGRyYWdvbmZseSopCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgotICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgaSo4NiApCi0gICAgICAjIE5vdCBzdXJlIHdoZXRoZXIgdGhlIHByZXNlbmNlIG9mIE9wZW5CU0QgaGVyZSB3YXMgYSBtaXN0YWtlLgotICAgICAgIyBMZXQncyBhY2NlcHQgYm90aCBvZiB0aGVtIHVudGlsIHRoaXMgaXMgY2xlYXJlZCB1cC4KLSAgICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChGcmVlQlNEfE9wZW5CU0R8RHJhZ29uRmx5KS9pW1szLTldXTg2IChjb21wYWN0ICk/ZGVtYW5kIHBhZ2VkIHNoYXJlZCBsaWJyYXJ5JwotICAgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICAgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zby4qYAotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICBmaQotICA7OwotCi1nbnUqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1oYWlrdSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWhwdXgxMC4yMCogfCBocHV4MTEqKQotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGNhc2UgJGhvc3RfY3B1IGluCi0gIGlhNjQqKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzW1swLTldXVtbMC05XV1bWzAtOV1dfEVMRi1bWzAtOV1dW1swLTldXSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gSUE2NCcKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9ocHV4MzIvbGliYy5zbwotICAgIDs7Ci0gIGhwcGEqNjQqKQotICAgIFtsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEZbIC1dWzAtOV1bMC05XSkoLWJpdCk/KCBbTE1dU0IpPyBzaGFyZWQgb2JqZWN0KCBmaWxlKT9bLCAtXSogUEEtUklTQyBbMC05XVwuWzAtOV0nXQotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL3BhMjBfNjQvbGliYy5zbAotICAgIDs7Ci0gICopCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbWzAtOV1dW1swLTldXVtbMC05XV18UEEtUklTQ1tbMC05XV1cLltbMC05XV0pIHNoYXJlZCBsaWJyYXJ5JwotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWludGVyaXhbWzMtOV1dKikKLSAgIyBQSUMgY29kZSBpcyBicm9rZW4gb24gSW50ZXJpeCAzLngsIHRoYXQncyB3aHkgfFwuYSBub3QgfF9waWNcLmEgaGVyZQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvfFwuYSkkJwotICA7OwotCi1pcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICBjYXNlICRMRCBpbgotICAqLTMyfCoiLTMyICIpIGxpYm1hZ2ljPTMyLWJpdDs7Ci0gICotbjMyfCoiLW4zMiAiKSBsaWJtYWdpYz1OMzI7OwotICAqLTY0fCoiLTY0ICIpIGxpYm1hZ2ljPTY0LWJpdDs7Ci0gICopIGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKLSAgZXNhYwotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi0jIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCi1saW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLW5ldGJzZCopCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xfcGljXC5hKSQnCi0gIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvfF9waWNcLmEpJCcKLSAgZmkKLSAgOzsKLQotbmV3b3M2KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKGV4ZWN1dGFibGV8ZHluYW1pYyBsaWIpJwotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYm5scy5zbwotICA7OwotCi0qbnRvKiB8ICpxbngqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1vcGVuYnNkKikKLSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xcLnNvfF9waWNcLmEpJCcKLSAgZWxzZQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xfcGljXC5hKSQnCi0gIGZpCi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotcmRvcyopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLXNvbGFyaXMqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1zeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotc3lzdjQgfCBzeXN2NC4zKikKLSAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLSAgbW90b3JvbGEpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpIE1bWzAtOV1dW1swLTldXSogVmVyc2lvbiBbWzAtOV1dJwotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAotICAgIDs7Ci0gIG5jcikKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICAgIDs7Ci0gIHNlcXVlbnQpCi0gICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW0xNXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJwotICAgIDs7Ci0gIHNuaSkKLSAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJwotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTE1dXVNCIGR5bmFtaWMgbGliIgotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbwotICAgIDs7Ci0gIHNpZW1lbnMpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgICA7OwotICBwYykKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotdHBmKikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLWVzYWMKLV0pCi1maWxlX21hZ2ljX2NtZD0kbHRfY3ZfZmlsZV9tYWdpY19jbWQKLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZAotdGVzdCAteiAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAmJiBkZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCi0KLV9MVF9ERUNMKFtdLCBbZGVwbGlic19jaGVja19tZXRob2RdLCBbMV0sCi0gICAgW01ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzXSkKLV9MVF9ERUNMKFtdLCBbZmlsZV9tYWdpY19jbWRdLCBbMV0sCi0gICAgW0NvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gImZpbGVfbWFnaWMiXSkKLV0pIyBfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9ECi0KLQotIyBMVF9QQVRIX05NCi0jIC0tLS0tLS0tLS0KLSMgZmluZCB0aGUgcGF0aG5hbWUgdG8gYSBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKLUFDX0RFRlVOKFtMVF9QQVRIX05NXSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX0NBQ0hFX0NIRUNLKFtmb3IgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyIChubSldLCBsdF9jdl9wYXRoX05NLAotW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGx0X2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgbHRfbm1fdG9fY2hlY2s9IiR7YWNfdG9vbF9wcmVmaXh9bm0iCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCIgJiYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KLSAgICBsdF9ubV90b19jaGVjaz0iJGx0X25tX3RvX2NoZWNrIG5tIgotICBmaQotICBmb3IgbHRfdG1wX25tIGluICRsdF9ubV90b19jaGVjazsgZG8KLSAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2Jpbi9lbGYgL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgICB0bXBfbm09IiRhY19kaXIvJGx0X3RtcF9ubSIKLSAgICAgIGlmIHRlc3QgLWYgIiR0bXBfbm0iIHx8IHRlc3QgLWYgIiR0bXBfbm0kYWNfZXhlZXh0IiA7IHRoZW4KLQkjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLQkjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotCSMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLQkjIFRydTY0J3Mgbm0gY29tcGxhaW5zIHRoYXQgL2Rldi9udWxsIGlzIGFuIGludmFsaWQgb2JqZWN0IGZpbGUKLQljYXNlIGAiJHRtcF9ubSIgLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KLQkqL2Rldi9udWxsKiB8IConSW52YWxpZCBmaWxlIG9yIG9iamVjdCB0eXBlJyopCi0JICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1CIgotCSAgYnJlYWsKLQkgIDs7Ci0JKikKLQkgIGNhc2UgYCIkdG1wX25tIiAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgotCSAgKi9kZXYvbnVsbCopCi0JICAgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLXAiCi0JICAgIGJyZWFrCi0JICAgIDs7Ci0JICAqKQotCSAgICBsdF9jdl9wYXRoX05NPSR7bHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCSAgICBjb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgZG9uZQotICA6ICR7bHRfY3ZfcGF0aF9OTT1ub30KLWZpXSkKLWlmIHRlc3QgIiRsdF9jdl9wYXRoX05NIiAhPSAibm8iOyB0aGVuCi0gIE5NPSIkbHRfY3ZfcGF0aF9OTSIKLWVsc2UKLSAgIyBEaWRuJ3QgZmluZCBhbnkgQlNEIGNvbXBhdGlibGUgbmFtZSBsaXN0ZXIsIGxvb2sgZm9yIGR1bXBiaW4uCi0gIGlmIHRlc3QgLW4gIiREVU1QQklOIjsgdGhlbiA6Ci0gICAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGVsc2UKLSAgICBBQ19DSEVDS19UT09MUyhEVU1QQklOLCBbZHVtcGJpbiAibGluayAtZHVtcCJdLCA6KQotICAgIGNhc2UgYCREVU1QQklOIC1zeW1ib2xzIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCi0gICAgKkNPRkYqKQotICAgICAgRFVNUEJJTj0iJERVTVBCSU4gLXN5bWJvbHMiCi0gICAgICA7OwotICAgICopCi0gICAgICBEVU1QQklOPToKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBBQ19TVUJTVChbRFVNUEJJTl0pCi0gIGlmIHRlc3QgIiREVU1QQklOIiAhPSAiOiI7IHRoZW4KLSAgICBOTT0iJERVTVBCSU4iCi0gIGZpCi1maQotdGVzdCAteiAiJE5NIiAmJiBOTT1ubQotQUNfU1VCU1QoW05NXSkKLV9MVF9ERUNMKFtdLCBbTk1dLCBbMV0sIFtBIEJTRC0gb3IgTVMtY29tcGF0aWJsZSBuYW1lIGxpc3Rlcl0pZG5sCi0KLUFDX0NBQ0hFX0NIRUNLKFt0aGUgbmFtZSBsaXN0ZXIgKCROTSkgaW50ZXJmYWNlXSwgW2x0X2N2X25tX2ludGVyZmFjZV0sCi0gIFtsdF9jdl9ubV9pbnRlcmZhY2U9IkJTRCBubSIKLSAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkYWNfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQotICAoZXZhbCAiJGFjX2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQotICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICROTSBcXFwiY29uZnRlc3QuJGFjX29iamV4dFxcXCJcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKLSAgKGV2YWwgIiROTSBcImNvbmZ0ZXN0LiRhY19vYmpleHRcIiIgMj5jb25mdGVzdC5lcnIgPiBjb25mdGVzdC5vdXQpCi0gIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAotICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogb3V0cHV0XCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCi0gIGNhdCBjb25mdGVzdC5vdXQgPiZBU19NRVNTQUdFX0xPR19GRAotICBpZiAkR1JFUCAnRXh0ZXJuYWwuKnNvbWVfdmFyaWFibGUnIGNvbmZ0ZXN0Lm91dCA+IC9kZXYvbnVsbDsgdGhlbgotICAgIGx0X2N2X25tX2ludGVyZmFjZT0iTVMgZHVtcGJpbiIKLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqXSkKLV0pIyBMVF9QQVRIX05NCi0KLSMgT2xkIG5hbWVzOgotQVVfQUxJQVMoW0FNX1BST0dfTk1dLCBbTFRfUEFUSF9OTV0pCi1BVV9BTElBUyhbQUNfUFJPR19OTV0sIFtMVF9QQVRIX05NXSkKLWRubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKLWRubCBBQ19ERUZVTihbQU1fUFJPR19OTV0sIFtdKQotZG5sIEFDX0RFRlVOKFtBQ19QUk9HX05NXSwgW10pCi0KLQotIyBMVF9MSUJfTQotIyAtLS0tLS0tLQotIyBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5Ci1BQ19ERUZVTihbTFRfTElCX01dLAotW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUxJQk09Ci1jYXNlICRob3N0IGluCi0qLSotYmVvcyogfCAqLSotY2VnY2MqIHwgKi0qLWN5Z3dpbiogfCAqLSotaGFpa3UqIHwgKi0qLXB3MzIqIHwgKi0qLWRhcndpbiopCi0gICMgVGhlc2Ugc3lzdGVtIGRvbid0IGhhdmUgbGlibSwgb3IgZG9uJ3QgbmVlZCBpdAotICA7OwotKi1uY3Itc3lzdjQuMyopCi0gIEFDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wsIExJQk09Ii1sbXciKQotICBBQ19DSEVDS19MSUIobSwgY29zLCBMSUJNPSIkTElCTSAtbG0iKQotICA7OwotKikKLSAgQUNfQ0hFQ0tfTElCKG0sIGNvcywgTElCTT0iLWxtIikKLSAgOzsKLWVzYWMKLUFDX1NVQlNUKFtMSUJNXSkKLV0pIyBMVF9MSUJfTQotCi0jIE9sZCBuYW1lOgotQVVfQUxJQVMoW0FDX0NIRUNLX0xJQk1dLCBbTFRfTElCX01dKQotZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgotZG5sIEFDX0RFRlVOKFtBQ19DSEVDS19MSUJNXSwgW10pCi0KLQotIyBfTFRfQ09NUElMRVJfTk9fUlRUSShbVEFHTkFNRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZnVuKFtfTFRfQ09NUElMRVJfTk9fUlRUSV0sCi1bbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCi0KLV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0KLQotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgbnZjYyopCi0gICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLVhjb21waWxlciAtZm5vLWJ1aWx0aW4nIDs7Ci0gICopCi0gICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLWZuby1idWlsdGluJyA7OwotICBlc2FjCi0KLSAgX0xUX0NPTVBJTEVSX09QVElPTihbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnNdLAotICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zLAotICAgIFstZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zXSwgW10sCi0gICAgW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0iJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKSAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIl0pCi1maQotX0xUX1RBR0RFQ0woW25vX2J1aWx0aW5fZmxhZ10sIFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFsxXSwKLQlbQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9uc10pCi1dKSMgX0xUX0NPTVBJTEVSX05PX1JUVEkKLQotCi0jIF9MVF9DTURfR0xPQkFMX1NZTUJPTFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmdW4oW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdLAotW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKWRubAotQUNfUkVRVUlSRShbTFRfUEFUSF9OTV0pZG5sCi1BQ19SRVFVSVJFKFtMVF9QQVRIX0xEXSlkbmwKLW00X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCi1tNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCi1tNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKLQotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLUFDX01TR19DSEVDS0lORyhbY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdF0pCi1BQ19DQUNIRV9WQUwoW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGVdLAotWwotIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQotCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1zeW1jb2RlPSdbW0JDREVHUlNUXV0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotc3ltcGF0PSdcKFtbX0EtWmEtel1dW1tfQS1aYS16MC05XV0qXCknCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICRob3N0X29zIGluCi1haXgqKQotICBzeW1jb2RlPSdbW0JDRFRdXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKLSAgc3ltY29kZT0nW1tBQkNER0lTVFddXScKLSAgOzsKLWhwdXgqKQotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgIHN5bWNvZGU9J1tbQUJDREVHUlNUXV0nCi0gIGZpCi0gIDs7Ci1pcml4KiB8IG5vbnN0b3B1eCopCi0gIHN5bWNvZGU9J1tbQkNERUdSU1RdXScKLSAgOzsKLW9zZiopCi0gIHN5bWNvZGU9J1tbQkNERUdRUlNUXV0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgc3ltY29kZT0nW1tCRFJUXV0nCi0gIDs7Ci1zY28zLjJ2NSopCi0gIHN5bWNvZGU9J1tbRFRdXScKLSAgOzsKLXN5c3Y0LjJ1dzIqKQotICBzeW1jb2RlPSdbW0RUXV0nCi0gIDs7Ci1zeXN2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQotICBzeW1jb2RlPSdbW0FCRFRdXScKLSAgOzsKLXN5c3Y0KQotICBzeW1jb2RlPSdbW0RGTlNUVV1dJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWNhc2UgYCROTSAtViAyPiYxYCBpbgotKkdOVSogfCAqJ3dpdGggQkZEJyopCi0gIHN5bWNvZGU9J1tbQUJDREdJUlNUV11dJyA7OwotZXNhYwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uLgotIyBTb21lIHN5c3RlbXMgKGVzcC4gb24gaWE2NCkgbGluayBkYXRhIGFuZCBjb2RlIHN5bWJvbHMgZGlmZmVyZW50bHksCi0jIHNvIHVzZSB0aGlzIGdlbmVyYWwgYXBwcm9hY2guCi1sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBzeW1ib2wgbmFtZSBhbmQgc3ltYm9sIGFkZHJlc3MKLWx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbW14gXV0qXCkgJC8gIHtcXFwiXDFcXFwiLCAodm9pZCAqKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFtbXiBdXSpcKSBcKFtbXiBdXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCciCi1sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4PSJzZWQgLW4gLWUgJ3MvXjogXChbW14gXV0qXCkgJC8gIHtcXFwiXDFcXFwiLCAodm9pZCAqKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFtbXiBdXSpcKSBcKGxpYltbXiBdXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFtbXiBdXSpcKSBcKFtbXiBdXSpcKSQvICB7XCJsaWJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCciCi0KLSMgSGFuZGxlIENSTEYgaW4gbWluZ3cgdG9vbCBjaGFpbgotb3B0X2NyPQotY2FzZSAkYnVpbGRfb3MgaW4KLW1pbmd3KikKLSAgb3B0X2NyPWAkRUNITyAneFx7MCwxXH0nIHwgdHIgeCAnXDAxNSdgICMgb3B0aW9uIGNyIGluIHJlZ2V4cAotICA7OwotZXNhYwotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyc2NvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICAjIFRyYW5zZm9ybSBzeW1jb2RlLCBzeW1wYXQsIGFuZCBzeW1wcmZ4IGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotICBzeW14ZnJtPSJcXDEgJGFjX3N5bXByZnhcXDIgXFwyIgotCi0gICMgV3JpdGUgdGhlIHJhdyBhbmQgQyBpZGVudGlmaWVycy4KLSAgaWYgdGVzdCAiJGx0X2N2X25tX2ludGVyZmFjZSIgPSAiTVMgZHVtcGJpbiI7IHRoZW4KLSAgICAjIEZha2UgaXQgZm9yIGR1bXBiaW4gYW5kIHNheSBUIGZvciBhbnkgbm9uLXN0YXRpYyBmdW5jdGlvbgotICAgICMgYW5kIEQgZm9yIGFueSBnbG9iYWwgdmFyaWFibGUuCi0gICAgIyBBbHNvIGZpbmQgQysrIGFuZCBfX2Zhc3RjYWxsIHN5bWJvbHMgZnJvbSBNU1ZDKyssCi0gICAgIyB3aGljaCBzdGFydCB3aXRoIEAgb3IgPy4KLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSIkQVdLIFsnIlwKLSIgICAgIHtsYXN0X3NlY3Rpb249c2VjdGlvbjsgc2VjdGlvbj1cJCAzfTsiXAotIiAgICAgL1NlY3Rpb24gbGVuZ3RoIC4qI3JlbG9jcy4qKHBpY2sgYW55KS97aGlkZVtsYXN0X3NlY3Rpb25dPTF9OyJcCi0iICAgICBcJCAwIX4vRXh0ZXJuYWwgKlx8L3tuZXh0fTsiXAotIiAgICAgLyAwKyBVTkRFRiAve25leHR9OyAvIFVOREVGIFwoW158XVwpKigpL3tuZXh0fTsiXAotIiAgICAge2lmKGhpZGVbc2VjdGlvbl0pIG5leHR9OyJcCi0iICAgICB7Zj0wfTsgXCQgMH4vXChcKS4qXHwve2Y9MX07IHtwcmludGYgZiA/IFwiVCBcIiA6IFwiRCBcIn07IlwKLSIgICAgIHtzcGxpdChcJCAwLCBhLCAvXHx8XHIvKTsgc3BsaXQoYVsyXSwgcyl9OyJcCi0iICAgICBzWzFdfi9eW0A/XS97cHJpbnQgc1sxXSwgc1sxXTsgbmV4dH07IlwKLSIgICAgIHNbMV1+cHJmeCB7c3BsaXQoc1sxXSx0LFwiQFwiKTsgcHJpbnQgdFsxXSwgc3Vic3RyKHRbMV0sbGVuZ3RoKHByZngpKX0iXAotIiAgICAgJyBwcmZ4PV4kYWNfc3ltcHJmeF0iCi0gIGVsc2UKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qW1sJIF1dXCgkc3ltY29kZSRzeW1jb2RlKlwpW1sJIF1dW1sJIF1dKiRhY19zeW1wcmZ4JHN5bXBhdCRvcHRfY3IkLyRzeW14ZnJtL3AnIgotICBmaQotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBwaXBlX3dvcmtzPW5vCi0KLSAgcm0gLWYgY29uZnRlc3QqCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmModm9pZCk7Ci12b2lkIG5tX3Rlc3RfZnVuYyh2b2lkKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jKCk7cmV0dXJuKDApO30KLV9MVF9FT0YKLQotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIG5saXN0PWNvbmZ0ZXN0Lm5tCi0gICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiIFw+ICRubGlzdCkgJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRubGlzdCIgfCB1bmlxID4gIiRubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiAkR1JFUCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmICRHUkVQICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8X0xUX0VPRiA+IGNvbmZ0ZXN0LiRhY19leHQKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotX0xUX0VPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IiB8ICRHUkVQIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dCcKLQotCSAgY2F0IDw8X0xUX0VPRiA+PiBjb25mdGVzdC4kYWNfZXh0Ci0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAgKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHZvaWQgICAgICAgKmFkZHJlc3M7Ci19Ci1sdF9fUFJPR1JBTV9fTFRYX3ByZWxvYWRlZF9zeW1ib2xzW1tdXSA9Ci17Ci0gIHsgIkBQUk9HUkFNQCIsICh2b2lkICopIDAgfSwKLV9MVF9FT0YKLQkgICRTRUQgInMvXiRzeW1jb2RlJHN5bWNvZGUqIFwoLipcKSBcKC4qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sLyIgPCAiJG5saXN0IiB8ICRHUkVQIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dAotCSAgY2F0IDw8XF9MVF9FT0YgPj4gY29uZnRlc3QuJGFjX2V4dAotICB7MCwgKHZvaWQgKikgMH0KLX07Ci0KLS8qIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSBpbiBGcmVlQlNEIGxpbmtlciAqLwotI2lmZGVmIEZSRUVCU0RfV09SS0FST1VORAotc3RhdGljIGNvbnN0IHZvaWQgKmx0X3ByZWxvYWRlZF9zZXR1cCgpIHsKLSAgcmV0dXJuIGx0X19QUk9HUkFNX19MVFhfcHJlbG9hZGVkX3N5bWJvbHM7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLV9MVF9FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0c3RtLiRhY19vYmpleHQKLQkgIGx0X3NhdmVfTElCUz0iJExJQlMiCi0JICBsdF9zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0c3RtLiRhY19vYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1MkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpIgotCSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotCSAgICBwaXBlX3dvcmtzPXllcwotCSAgZmkKLQkgIExJQlM9IiRsdF9zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRsdF9zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JkFTX01FU1NBR0VfTE9HX0ZECi0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBU19NRVNTQUdFX0xPR19GRAotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KiBjb25mdHN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJHBpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi1dKQotaWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQotZmkKLWlmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKGZhaWxlZCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChvaykKLWZpCi0KLV9MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3BpcGVdLCBbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZV0sIFsxXSwKLSAgICBbVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lc10pCi1fTFRfREVDTChbZ2xvYmFsX3N5bWJvbF90b19jZGVjbF0sIFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbF0sIFsxXSwKLSAgICBbVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbl0pCi1fTFRfREVDTChbZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc10sCi0gICAgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzXSwgWzFdLAotICAgIFtUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXJdKQotX0xUX0RFQ0woW2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeF0sCi0gICAgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXhdLCBbMV0sCi0gICAgW1RyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpciB3aGVuIGxpYiBwcmVmaXggaXMgbmVlZGVkXSkKLV0pICMgX0xUX0NNRF9HTE9CQUxfU1lNQk9MUwotCi0KLSMgX0xUX0NPTVBJTEVSX1BJQyhbVEFHTkFNRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmdW4oW19MVF9DT01QSUxFUl9QSUNdLAotW200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAotX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Ci1fTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Ci1fTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Ci0KLUFDX01TR19DSEVDS0lORyhbZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUNdKQotbTRfaWYoWyQxXSwgW0NYWF0sIFsKLSAgIyBDKysgc3BlY2lmaWMgY2FzZXMgZm9yIHBpYywgc3RhdGljLCB3bCwgZXRjLgotICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKLQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgqKQotICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIHBvd2VycGMpCi0gICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0Ci0gICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJwotICAgICAgICA7OwotICAgICAgbTY4aykKLSAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKLSAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAotICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KLSAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JwotICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgotICAgICAgOzsKLSAgICBtaW5ndyogfCBjeWd3aW4qIHwgb3MyKiB8IHB3MzIqIHwgY2VnY2MqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgICMgQWx0aG91Z2ggdGhlIGN5Z3dpbiBnY2MgaWdub3JlcyAtZlBJQywgc3RpbGwgbmVlZCB0aGlzIGZvciBvbGQtc3R5bGUKLSAgICAgICMgKC0tZGlzYWJsZS1hdXRvLWltcG9ydCkgbGlicmFyaWVzCi0gICAgICBtNF9pZihbJDFdLCBbR0NKXSwgW10sCi0JW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJ10pCi0gICAgICA7OwotICAgIGRhcndpbiogfCByaGFwc29keSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCi0gICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mbm8tY29tbW9uJwotICAgICAgOzsKLSAgICAqZGpncHAqKQotICAgICAgIyBESkdQUCBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgYXQgYWxsCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Ci0gICAgICA7OwotICAgIGhhaWt1KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBIYWlrdS4KLSAgICAgICMgVGhlICItc3RhdGljIiBmbGFnIGV4aXN0cywgYnV0IGlzIGJyb2tlbi4KLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0KLSAgICAgIDs7Ci0gICAgaW50ZXJpeFtbMy05XV0qKQotICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KLSAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgotICAgICAgOzsKLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0JX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPS1LY29uZm9ybV9waWMKLSAgICAgIGZpCi0gICAgICA7OwotICAgIGhwdXgqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIDY0LWJpdCBQQSBIUC1VWCwgYnV0IG5vdCBmb3IgMzItYml0Ci0gICAgICAjIFBBIEhQLVVYLiAgT24gSUE2NCBIUC1VWCwgUElDIGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGUgcGljIGZsYWcKLSAgICAgICMgc2V0cyB0aGUgZGVmYXVsdCBUTFMgbW9kZWwgYW5kIGFmZmVjdHMgaW5saW5pbmcuCi0gICAgICBjYXNlICRob3N0X2NwdSBpbgotICAgICAgaHBwYSo2NCopCi0JOzsKLSAgICAgICopCi0JX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLSAgICAqcW54KiB8ICpudG8qKQotICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKLSAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMgLXNoYXJlZCcKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIGFpeFtbNC05XV0qKQotCSMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLQlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSAgIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0JZWxzZQotCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCi0JZmkKLQk7OwotICAgICAgY2hvcnVzKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCWN4Y2g2OCopCi0JICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCSAgIyBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Ii0tbm9fYXV0b19pbnN0YW50aWF0aW9uIC11IF9fbWFpbiAtdSBfX3ByZW1haW4gLXUgX2Fib3J0IC1yICRDT09MX0RJUi9saWIvbGliT3JiLmEgJE1WTUVfRElSL2xpYi9DQy9saWJDLmEgJE1WTUVfRElSL2xpYi9jbGFzc2l4L2xpYmN4LnMuYSIKLQkgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBkZ3V4KikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgZWMrKyopCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0JICAgIDs7Ci0JICBnaGN4KikKLQkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKLQkjIEZyZWVCU0QgdXNlcyBHTlUgQysrCi0JOzsKLSAgICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBDQyopCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJwotCSAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KLQkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJwotCSAgICBmaQotCSAgICA7OwotCSAgYUNDKikKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCi0JICAgIGNhc2UgJGhvc3RfY3B1IGluCi0JICAgIGhwcGEqNjQqfGlhNjQqKQotCSAgICAgICMgK1ogdGhlIGRlZmF1bHQKLQkgICAgICA7OwotCSAgICAqKQotCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nK1onCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGludGVyaXgqKQotCSMgVGhpcyBpcyBjODksIHdoaWNoIGlzIE1TIFZpc3VhbCBDKysgKG5vIHNoYXJlZCBsaWJzKQotCSMgQW55b25lIHdhbnRzIHRvIGRvIGEgcG9ydD8KLQk7OwotICAgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgQ0MqKQotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKLQkgICAgIyBDQyBwaWMgZmxhZyAtS1BJQyBpcyB0aGUgZGVmYXVsdC4KLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIEtDQyopCi0JICAgICMgS0FJIEMrKyBDb21waWxlcgotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLS1iYWNrZW5kIC1XbCwnCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCi0JICAgIDs7Ci0JICBlY3BjKiApCi0JICAgICMgb2xkIEludGVsIEMrKyBmb3IgeDg2XzY0IHdoaWNoIHN0aWxsIHN1cHBvcnRlZCAtS1BJQy4KLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKLQkgICAgOzsKLQkgIGljcGMqICkKLQkgICAgIyBJbnRlbCBDKyssIHVzZWQgdG8gYmUgaW5jb21wYXRpYmxlIHdpdGggR0NDLgotCSAgICAjIElDQyAxMCBkb2Vzbid0IGFjY2VwdCAtS1BJQyBhbnkgbW9yZS4KLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKLQkgICAgOzsKLQkgIHBnQ0MqIHwgcGdjcHAqKQotCSAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlcgotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZnBpYycKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLQkgICAgOzsKLQkgIGN4eCopCi0JICAgICMgQ29tcGFxIEMrKwotCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCi0JICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJwotCSAgICA7OwotCSAgeGxjKiB8IHhsQyogfCBiZ3hsW1tjQ11dKiB8IG1waXhsW1tjQ11dKikKLQkgICAgIyBJQk0gWEwgOC4wLCA5LjAgb24gUFBDIGFuZCBCbHVlR2VuZQotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcXBpYycKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctcXN0YXRpY2xpbmsnCi0JICAgIDs7Ci0JICAqKQotCSAgICBjYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KLQkgICAgKlN1blwgQyopCi0JICAgICAgIyBTdW4gQysrIDUuOQotCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0JICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLQkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJwotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGx5bnhvcyopCi0JOzsKLSAgICAgIG04OGsqKQotCTs7Ci0gICAgICBtdnMqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBjeHgqKQotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1XIGMsZXhwb3J0YWxsJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIG5ldGJzZCopCi0JOzsKLSAgICAgICpxbngqIHwgKm50byopCi0gICAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCi0gICAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KLSAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJwotICAgICAgICA7OwotICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBLQ0MqKQotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLS1iYWNrZW5kIC1XbCwnCi0JICAgIDs7Ci0JICBSQ0MqKQotCSAgICAjIFJhdGlvbmFsIEMrKyAyLjQuMQotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCi0JICAgIDs7Ci0JICBjeHgqKQotCSAgICAjIERpZ2l0YWwvQ29tcGFxIEMrKwotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQotCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBwc29zKikKLQk7OwotICAgICAgc29sYXJpcyopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIENDKiB8IHN1bkNDKikKLQkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKwotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJwotCSAgICA7OwotCSAgZ2N4KikKLQkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIHN1bm9zNCopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIENDKikKLQkgICAgIyBTdW4gQysrIDQueAotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0JICAgIDs7Ci0JICBsY2MqKQotCSAgICAjIEx1Y2lkCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBDQyopCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgdGFuZGVtKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgTkNDKikKLQkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgdnh3b3JrcyopCi0JOzsKLSAgICAgICopCi0JX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubwotCTs7Ci0gICAgZXNhYwotICBmaQotXSwKLVsKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXgqKQotICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIHBvd2VycGMpCi0gICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0Ci0gICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJwotICAgICAgICA7OwotICAgICAgbTY4aykKLSAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKLSAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAotICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KLSAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JwotICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgotICAgICAgOzsKLQotICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiogfCBjZWdjYyopCi0gICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCi0gICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgotICAgICAgIyBBbHRob3VnaCB0aGUgY3lnd2luIGdjYyBpZ25vcmVzIC1mUElDLCBzdGlsbCBuZWVkIHRoaXMgZm9yIG9sZC1zdHlsZQotICAgICAgIyAoLS1kaXNhYmxlLWF1dG8taW1wb3J0KSBsaWJyYXJpZXMKLSAgICAgIG00X2lmKFskMV0sIFtHQ0pdLCBbXSwKLQlbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnXSkKLSAgICAgIDs7Ci0KLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZm5vLWNvbW1vbicKLSAgICAgIDs7Ci0KLSAgICBoYWlrdSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSGFpa3UuCi0gICAgICAjIFRoZSAiLXN0YXRpYyIgZmxhZyBleGlzdHMsIGJ1dCBpcyBicm9rZW4uCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Ci0gICAgICA7OwotCi0gICAgaHB1eCopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgNjQtYml0IFBBIEhQLVVYLCBidXQgbm90IGZvciAzMi1iaXQKLSAgICAgICMgUEEgSFAtVVguICBPbiBJQTY0IEhQLVVYLCBQSUMgaXMgdGhlIGRlZmF1bHQgYnV0IHRoZSBwaWMgZmxhZwotICAgICAgIyBzZXRzIHRoZSBkZWZhdWx0IFRMUyBtb2RlbCBhbmQgYWZmZWN0cyBpbmxpbmluZy4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KikKLQkjICtaIHRoZSBkZWZhdWx0Ci0JOzsKLSAgICAgICopCi0JX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIGludGVyaXhbWzMtOV1dKikKLSAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCi0gICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KLSAgICAgIDs7Ci0KLSAgICBtc2Rvc2RqZ3BwKikKLSAgICAgICMgSnVzdCBiZWNhdXNlIHdlIHVzZSBHQ0MgZG9lc24ndCBtZWFuIHdlIHN1ZGRlbmx5IGdldCBzaGFyZWQgbGlicmFyaWVzCi0gICAgICAjIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCi0gICAgICBlbmFibGVfc2hhcmVkPW5vCi0gICAgICA7OwotCi0gICAgKm50byogfCAqcW54KikKLSAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCi0gICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDIC1zaGFyZWQnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0tS2NvbmZvcm1fcGljCi0gICAgICBmaQotICAgICAgOzsKLQotICAgICopCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJwotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgIG52Y2MqKSAjIEN1ZGEgQ29tcGlsZXIgRHJpdmVyIDIuMgotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1YbGlua2VyICcKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVhjb21waWxlciAtZlBJQycKLSAgICAgIDs7Ci0gICAgZXNhYwotICBlbHNlCi0gICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgqKQotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCi0JX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLSAgICAgIGVsc2UKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgbWluZ3cqIHwgY3lnd2luKiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKLSAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKLSAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCi0gICAgICBtNF9pZihbJDFdLCBbR0NKXSwgW10sCi0JW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJ10pCi0gICAgICA7OwotCi0gICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAotICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIGhwcGEqNjQqfGlhNjQqKQotCSMgK1ogdGhlIGRlZmF1bHQKLQk7OwotICAgICAgKikKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJwotCTs7Ci0gICAgICBlc2FjCi0gICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCi0gICAgICA7OwotCi0gICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKLSAgICAgIDs7Ci0KLSAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgIyBvbGQgSW50ZWwgZm9yIHg4Nl82NCB3aGljaCBzdGlsbCBzdXBwb3J0ZWQgLUtQSUMuCi0gICAgICBlY2MqKQotCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0JX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJwotICAgICAgICA7OwotICAgICAgIyBpY2MgdXNlZCB0byBiZSBpbmNvbXBhdGlibGUgd2l0aCBHQ0MuCi0gICAgICAjIElDQyAxMCBkb2Vzbid0IGFjY2VwdCAtS1BJQyBhbnkgbW9yZS4KLSAgICAgIGljYyogfCBpZm9ydCopCi0JX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCi0gICAgICAgIDs7Ci0gICAgICAjIExhaGV5IEZvcnRyYW4gOC4xLgotICAgICAgbGY5NSopCi0JX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctLXNoYXJlZCcKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy0tc3RhdGljJwotCTs7Ci0gICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KiB8IHBnZm9ydHJhbiopCi0gICAgICAgICMgUG9ydGxhbmQgR3JvdXAgY29tcGlsZXJzICgqbm90KiB0aGUgUGVudGl1bSBnY2MgY29tcGlsZXIsCi0JIyB3aGljaCBsb29rcyB0byBiZSBhIGRlYWQgcHJvamVjdCkKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mcGljJwotCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0gICAgICAgIDs7Ci0gICAgICBjY2MqKQotICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLSAgICAgICAgIyBBbGwgQWxwaGEgY29kZSBpcyBQSUMuCi0gICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCi0gICAgICAgIDs7Ci0gICAgICB4bCogfCBiZ3hsKiB8IGJnZiogfCBtcGl4bCopCi0JIyBJQk0gWEwgQyA4LjAvRm9ydHJhbiAxMC4xLCAxMS4xIG9uIFBQQyBhbmQgQmx1ZUdlbmUKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1xcGljJwotCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXFzdGF0aWNsaW5rJwotCTs7Ci0gICAgICAqKQotCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgotCSpTdW5cIEYqIHwgKlN1bipGb3J0cmFuKikKLQkgICMgU3VuIEZvcnRyYW4gOC4zIHBhc3NlcyBhbGwgdW5yZWNvZ25pemVkIGZsYWdzIHRvIHRoZSBsaW5rZXIKLQkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0JICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9JycKLQkgIDs7Ci0JKlN1blwgQyopCi0JICAjIFN1biBDIDUuOQotCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKLQkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0JICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQkgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgbmV3c29zNikKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgICpudG8qIHwgKnFueCopCi0gICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQotICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJwotICAgICAgOzsKLQotICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJwotICAgICAgOzsKLQotICAgIHJkb3MqKQotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIGY3NyogfCBmOTAqIHwgZjk1KiB8IHN1bmY3NyogfCBzdW5mOTAqIHwgc3VuZjk1KikKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJzs7Ci0gICAgICAqKQotCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJzs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1QSUMnCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKikKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtjb25mb3JtX3BpYycKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICB1bmljb3MqKQotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgdXRzNCopCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgICopCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLV0pCi1jYXNlICRob3N0X29zIGluCi0gICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgotICAqZGpncHAqKQotICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KLSAgICA7OwotICAqKQotICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0iJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKUAmdEBtNF9pZihbJDFdLFtdLFsgLURQSUNdLFttNF9pZihbJDFdLFtDWFhdLFsgLURQSUNdLFtdKV0pIgotICAgIDs7Ci1lc2FjCi1BQ19NU0dfUkVTVUxUKFskX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpXSkKLV9MVF9UQUdERUNMKFt3bF0sIFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgWzFdLAotCVtIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyXSkKLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgotIwotaWYgdGVzdCAtbiAiJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSI7IHRoZW4KLSAgX0xUX0NPTVBJTEVSX09QVElPTihbaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkgd29ya3NdLAotICAgIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzLCAkMSldLAotICAgIFskX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpQCZ0QG00X2lmKFskMV0sW10sWyAtRFBJQ10sW200X2lmKFskMV0sW0NYWF0sWyAtRFBJQ10sW10pXSldLCBbXSwKLSAgICBbY2FzZSAkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIGluCi0gICAgICIiIHwgIiAiKikgOzsKLSAgICAgKikgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSIgJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSIgOzsKLSAgICAgZXNhY10sCi0gICAgW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KLSAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ub10pCi1maQotX0xUX1RBR0RFQ0woW3BpY19mbGFnXSwgW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgWzFdLAotCVtBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHNdKQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi13bD0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkgZXZhbCBsdF90bXBfc3RhdGljX2ZsYWc9XCIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpXCIKLV9MVF9MSU5LRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrc10sCi0gIF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MsICQxKSwKLSAgJGx0X3RtcF9zdGF0aWNfZmxhZywKLSAgW10sCi0gIFtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9XSkKLV9MVF9UQUdERUNMKFtsaW5rX3N0YXRpY19mbGFnXSwgW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgWzFdLAotCVtDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nXSkKLV0pIyBfTFRfQ09NUElMRVJfUElDCi0KLQotIyBfTFRfTElOS0VSX1NITElCUyhbVEFHTkFNRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgU2VlIGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLW00X2RlZnVuKFtfTFRfTElOS0VSX1NITElCU10sCi1bQUNfUkVRVUlSRShbTFRfUEFUSF9MRF0pZG5sCi1BQ19SRVFVSVJFKFtMVF9QQVRIX05NXSlkbmwKLW00X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAotbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAotbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKLW00X3JlcXVpcmUoW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdKWRubAotbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCi1tNF9pZihbJDFdLCBbQ1hYXSwgWwotICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICBjYXNlICRob3N0X29zIGluCi0gIGFpeFtbNC05XV0qKQotICAgICMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgotICAgICMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KLSAgICAjIEFsc28sIEFJWCBubSB0cmVhdHMgd2VhayBkZWZpbmVkIHN5bWJvbHMgbGlrZSBvdGhlciBnbG9iYWwgZGVmaW5lZAotICAgICMgc3ltYm9scywgd2hlcmVhcyBHTlUgbm0gbWFya3MgdGhlbSBhcyAiVyIuCi0gICAgaWYgJE5NIC1WIDI+JjEgfCAkR1JFUCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpIHx8IChcJCAyID09ICJXIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotICAgIGVsc2UKLSAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotICAgIGZpCi0gICAgOzsKLSAgcHczMiopCi0gICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9IiRsdGRsbF9jbWRzIgotICA7OwotICBjeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQotICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW1tCQ0RHUlNdXVtbIF1dL3MvLipbWyBdXVwoW1teIF1dKlwpL1wxIERBVEEvOy9eLipbWyBdXV9fbm1fXy9zL14uKltbIF1dX19ubV9fXChbW14gXV0qXClbWyBdXVtbXiBdXSovXDEgREFUQS87L15JW1sgXV0vZDsvXltbQUlUV11dW1sgXV0vcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgOzsKLSAgKikKLSAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICA7OwotICBlc2FjCi0gIF9MVF9UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9WydfR0xPQkFMX09GRlNFVF9UQUJMRV98X0dMT0JBTF9fRltJRF1fLionXQotXSwgWwotICBydW5wYXRoX3Zhcj0KLSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQotICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCi0gIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9Ci0gIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQotICBfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPW5vCi0gIF9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCi0gIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9Ci0gIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0gIF9MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KLSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPW5vCi0gIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQotICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KLSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9Ci0gIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCi0gIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCi0gIF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCi0gIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KLSAgX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQotICBfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQotICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0KLSAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcywgJDEpPQotICBfTFRfVEFHVkFSKHRocmVhZF9zYWZlX2ZsYWdfc3BlYywgJDEpPQotICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Ci0gICMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKLSAgIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKLSAgX0xUX1RBR1ZBUihpbmNsdWRlX2V4cHN5bXMsICQxKT0KLSAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKLSAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgotICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCi0gICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgotICBfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPVsnX0dMT0JBTF9PRkZTRVRfVEFCTEVffF9HTE9CQUxfX0ZbSURdXy4qJ10KLSAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0Ci0gICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgotICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKLSAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCi0gICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCi0gICMgRXhjbHVkZSBzaGFyZWQgbGlicmFyeSBpbml0aWFsaXphdGlvbi9maW5hbGl6YXRpb24gc3ltYm9scy4KLWRubCBOb3RlIGFsc28gYWRqdXN0IGV4Y2x1ZGVfZXhwc3ltcyBmb3IgQysrIGFib3ZlLgotICBleHRyYWN0X2V4cHN5bXNfY21kcz0KLQotICBjYXNlICRob3N0X29zIGluCi0gIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKLSAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCi0gICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgotICAgICAgd2l0aF9nbnVfbGQ9bm8KLSAgICBmaQotICAgIDs7Ci0gIGludGVyaXgqKQotICAgICMgd2UganVzdCBob3BlL2Fzc3VtZSB0aGlzIGlzIGdjYyBhbmQgbm90IGM4OSAoPSBNU1ZDKyspCi0gICAgd2l0aF9nbnVfbGQ9eWVzCi0gICAgOzsKLSAgb3BlbmJzZCopCi0gICAgd2l0aF9nbnVfbGQ9bm8KLSAgICA7OwotICBlc2FjCi0KLSAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKLQotICAjIE9uIHNvbWUgdGFyZ2V0cywgR05VIGxkIGlzIGNvbXBhdGlibGUgZW5vdWdoIHdpdGggdGhlIG5hdGl2ZSBsaW5rZXIKLSAgIyB0aGF0IHdlJ3JlIGJldHRlciBvZmYgdXNpbmcgdGhlIG5hdGl2ZSBpbnRlcmZhY2UgZm9yIGJvdGguCi0gIGx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlPW5vCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXgqKQotCSMgVGhlIEFJWCBwb3J0IG9mIEdOVSBsZCBoYXMgYWx3YXlzIGFzcGlyZWQgdG8gY29tcGF0aWJpbGl0eQotCSMgd2l0aCB0aGUgbmF0aXZlIGxpbmtlci4gIEhvd2V2ZXIsIGFzIHRoZSB3YXJuaW5nIGluIHRoZSBHTlUgbGQKLQkjIGJsb2NrIHNheXMsIHZlcnNpb25zIGJlZm9yZSAyLjE5LjUqIGNvdWxkbid0IHJlYWxseSBjcmVhdGUgd29ya2luZwotCSMgc2hhcmVkIGxpYnJhcmllcywgcmVnYXJkbGVzcyBvZiB0aGUgaW50ZXJmYWNlIHVzZWQuCi0JY2FzZSBgJExEIC12IDI+JjFgIGluCi0JICAqXCBcKEdOVVwgQmludXRpbHNcKVwgMi4xOS41KikgOzsKLQkgICpcIFwoR05VXCBCaW51dGlsc1wpXCAyLltbMi05XV0qKSA7OwotCSAgKlwgXChHTlVcIEJpbnV0aWxzXClcIFtbMy05XV0qKSA7OwotCSAgKikKLQkgICAgbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9eWVzCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICAqKQotCWx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlPXllcwotCTs7Ci0gICAgZXNhYwotICBmaQotCi0gIGlmIHRlc3QgIiRsdF91c2VfZ251X2xkX2ludGVyZmFjZSIgPSB5ZXM7IHRoZW4KLSAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQotICAgIHdsYXJjPScke3dsfScKLQotICAgICMgU2V0IHNvbWUgZGVmYXVsdHMgZm9yIEdOVSBsZCB3aXRoIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuIFRoZXNlCi0gICAgIyBhcmUgcmVzZXQgbGF0ZXIgaWYgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gUHV0dGluZyB0aGVtCi0gICAgIyBoZXJlIGFsbG93cyB0aGVtIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVjZXNzYXJ5LgotICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0gICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJwotICAgIGVsc2UKLSAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KLSAgICBmaQotICAgIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz1ubwotICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgotICAgICAgKkdOVVwgZ29sZCopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKLSAgICAgICpcIFtbMDFdXS4qIHwgKlwgMi5bWzAtOV1dLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCi0gICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgotICAgICAgKlwgMi4xMS45Mi4wLjEyXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgTWFuZHJha2UgOC4yIC4uLgotICAgICAgKlwgMi4xMS4qKSA7OyAjIG90aGVyIDIuMTEgdmVyc2lvbnMKLSAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKLSAgICBlc2FjCi0KLSAgICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4W1szLTldXSopCi0gICAgICAjIE9uIEFJWC9QUEMsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KLQlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JY2F0IDw8X0xUX0VPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjE5LCBpcyByZXBvcnRlZAotKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCi0qKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKLSoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIGluc3RhbGwgYmludXRpbHMKLSoqKiAyLjIwIG9yIGFib3ZlLCBvciBtb2RpZnkgeW91ciBQQVRIIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZC4KLSoqKiBZb3Ugd2lsbCB0aGVuIG5lZWQgdG8gcmVzdGFydCB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzLgotCi1fTFRfRU9GCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIHBvd2VycGMpCi0gICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0Ci0gICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPScnCi0gICAgICAgIDs7Ci0gICAgICBtNjhrKQotICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKLSAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCi0gICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBiZW9zKikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKLQkjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCi0JIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKLSAgICAgICMgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCi0gICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKLSAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtYWxsLXN5bWJvbHMnCi0gICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKLSAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KLSAgICAgIF9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcwotICAgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bW0JDREdSU11dW1sgXV0vcy8uKltbIF1dXChbW14gXV0qXCkvXDEgREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bW0FJVFddXVtbIF1dL3MvLipbWyBdXS8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKLQkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgotCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgotCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCWVsc2UKLQkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQlmaX4KLQkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLSAgICAgIGVsc2UKLQlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGhhaWt1KikKLSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCi0gICAgICA7OwotCi0gICAgaW50ZXJpeFtbMy05XV0qKQotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJwotICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKLSAgICAgICMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KLSAgICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKLSAgICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKLSAgICAgICMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKLSAgICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKLSAgICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgotICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJwotICAgICAgOzsKLQotICAgIGdudSogfCBsaW51eCogfCB0cGYqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQotICAgICAgdG1wX2RpZXQ9bm8KLSAgICAgIGlmIHRlc3QgIiRob3N0X29zIiA9IGxpbnV4LWRpZXRsaWJjOyB0aGVuCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIGRpZXRcICopIHRtcF9kaWV0PXllczs7CSMgbGludXgtZGlldGxpYmMgd2l0aCBzdGF0aWMgbGlua2luZyAoIWRpZXQtZHluKQotCWVzYWMKLSAgICAgIGZpCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkRUdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbCBcCi0JICYmIHRlc3QgIiR0bXBfZGlldCIgPSBubwotICAgICAgdGhlbgotCXRtcF9hZGRmbGFnPQotCXRtcF9zaGFyZWRmbGFnPSctc2hhcmVkJwotCWNhc2UgJGNjX2Jhc2VuYW1lLCRob3N0X2NwdSBpbgotICAgICAgICBwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCi0JICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcnCi0JICA7OwotCXBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KiB8IHBnZm9ydHJhbiopCi0JCQkJCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCi0JICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7Ci0JZWNjKixpYTY0KiB8IGljYyosaWE2NCopCSMgSW50ZWwgQyBjb21waWxlciBvbiBpYTY0Ci0JICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMnIDs7Ci0JZWZjKixpYTY0KiB8IGlmb3J0KixpYTY0KikJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyIG9uIGlhNjQKLQkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYyAtbm9mb3JfbWFpbicgOzsKLQlpZmMqIHwgaWZvcnQqKQkJCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlcgotCSAgdG1wX2FkZGZsYWc9JyAtbm9mb3JfbWFpbicgOzsKLQlsZjk1KikJCQkJIyBMYWhleSBGb3J0cmFuIDguMQotCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQotCSAgdG1wX3NoYXJlZGZsYWc9Jy0tc2hhcmVkJyA7OwotCXhsW1tjQ11dKiB8IGJneGxbW2NDXV0qIHwgbXBpeGxbW2NDXV0qKSAjIElCTSBYTCBDIDguMCBvbiBQUEMgKGRlYWwgd2l0aCB4bGYgYmVsb3cpCi0JICB0bXBfc2hhcmVkZmxhZz0nLXFta3Nocm9iaicKLQkgIHRtcF9hZGRmbGFnPSA7OwotCW52Y2MqKQkjIEN1ZGEgQ29tcGlsZXIgRHJpdmVyIDIuMgotCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIF9MVF9UQUdWQVIoY29tcGlsZXJfbmVlZHNfb2JqZWN0LCAkMSk9eWVzCi0JICA7OwotCWVzYWMKLQljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KLQkqU3VuXCBDKikJCQkjIFN1biBDIDUuOQotCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBuZXdfY29udmVuaWVuY2U9OyBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC16IFwiJGNvbnZcIiB8fCBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCSAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT15ZXMKLQkgIHRtcF9zaGFyZWRmbGFnPSctRycgOzsKLQkqU3VuXCBGKikJCQkjIFN1biBGb3J0cmFuIDguMwotCSAgdG1wX3NoYXJlZGZsYWc9Jy1HJyA7OwotCWVzYWMKLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCi0gICAgICAgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KLSAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLQkgICAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotCSAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLQkgICAgJENDICciJHRtcF9zaGFyZWRmbGFnIiIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKLSAgICAgICAgZmkKLQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JeGxmKiB8IGJnZiogfCBiZ3hsZiogfCBtcGl4bGYqKQotCSAgIyBJQk0gWEwgRm9ydHJhbiAxMC4xIG9uIFBQQyBjYW5ub3QgY3JlYXRlIHNoYXJlZCBsaWJzIGl0c2VsZgotCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSctLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgLS1uby13aG9sZS1hcmNoaXZlJwotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Ci0JICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0nLXJwYXRoICRsaWJkaXInCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtbyAkbGliJwotCSAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgotCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLQkgICAgICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0JICAgICAgZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0JICAgICAgJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgLXZlcnNpb24tc2NyaXB0ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJwotCSAgZmkKLQkgIDs7Ci0JZXNhYwotICAgICAgZWxzZQotICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG5ldGJzZCopCi0gICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCi0Jd2xhcmM9Ci0gICAgICBlbHNlCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIGlmICRMRCAtdiAyPiYxIHwgJEdSRVAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgotCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQljYXQgPDxfTFRfRU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKLSoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKLSoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKLSoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5Ci0qKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcwotKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLV9MVF9FT0YKLSAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCi0gICAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KLSAgICAgICAgKlwgW1swMV1dLiogfCAqXCAyLltbMC05XV0uKiB8ICpcIDIuMVtbMC01XV0uKikKLQlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JY2F0IDw8X0xUX0VPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBSZWxlYXNlcyBvZiB0aGUgR05VIGxpbmtlciBwcmlvciB0byAyLjE2LjkxLjAuMyBjYW4gbm90Ci0qKiogcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU0NPIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKLSoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKLSoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuMTYuOTEuMC4zIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5Ci0qKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcwotKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLV9MVF9FT0YKLQk7OwotCSopCi0JICAjIEZvciBzZWN1cml0eSByZWFzb25zLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYWx3YXlzCi0JICAjIHVzZSBhYnNvbHV0ZSBwYXRocyBmb3IgbmFtaW5nIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBleGNsdWRlIHRoZQotCSAgIyBEVF9SVU5QQVRIIHRhZyBmcm9tIGV4ZWN1dGFibGVzIGFuZCBsaWJyYXJpZXMuICBCdXQgZG9pbmcgc28KLQkgICMgcmVxdWlyZXMgdGhhdCB5b3UgY29tcGlsZSBldmVyeXRoaW5nIHR3aWNlLCB3aGljaCBpcyBhIHBhaW4uCi0JICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0JICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0JICBlbHNlCi0JICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQkgIGZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIHdsYXJjPQotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBlbHNlCi0JX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAiJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSkiID0gbm87IHRoZW4KLSAgICAgIHJ1bnBhdGhfdmFyPQotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Ci0gICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQotICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQotICAgIGZpCi0gIGVsc2UKLSAgICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeDMqKQotICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCi0gICAgICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcwotICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRMRCAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLWJFOiRleHBvcnRfc3ltYm9scyAtVDUxMiAtSDUxMiAtYk06U1JFfiRBUiAkQVJfRkxBR1MgJGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lJwotICAgICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKLSAgICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAteiAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIjsgdGhlbgotCSMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQotCSMgYnJva2VuIGNvbGxlY3QyLgotCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9dW5zdXBwb3J0ZWQKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYWl4W1s0LTldXSopCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKLQkjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KLQlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0JZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKLQlub19lbnRyeV9mbGFnPSIiCi0gICAgICBlbHNlCi0JIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCi0JIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQotCSMgQWxzbywgQUlYIG5tIHRyZWF0cyB3ZWFrIGRlZmluZWQgc3ltYm9scyBsaWtlIG90aGVyIGdsb2JhbAotCSMgZGVmaW5lZCBzeW1ib2xzLCB3aGVyZWFzIEdOVSBubSBtYXJrcyB0aGVtIGFzICJXIi4KLQlpZiAkTk0gLVYgMj4mMSB8ICRHUkVQICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCi0JICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikgfHwgKFwkIDIgPT0gIlciKSkgJiYgKFtzdWJzdHJdKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCi0JZWxzZQotCSAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCi0JZmkKLQlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0KLQkjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKLQkjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKLQkjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgotCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzIzXV18YWl4NC5bWzIzXV0uKnxhaXhbWzUtOV1dKikKLQkgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbwotCSAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KLQkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKLQkgICAgYnJlYWsKLQkgIGZpCi0JICBkb25lCi0JICA7OwotCWVzYWMKLQotCWV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCi0Jbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JwotICAgICAgZmkKLQotICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgotICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5Ci0gICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bwotICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKLSAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgotCi0gICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPScnCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JwotICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCi0gICAgICBfTFRfVEFHVkFSKGZpbGVfbGlzdF9zcGVjLCAkMSk9JyR7d2x9LWYsJwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzAxMl1dfGFpeDQuW1swMTJdXS4qKQotCSMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjawotCSMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKwotCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAotCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYKLQkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8ICRHUkVQIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAotCSAgdGhlbgotCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCi0JICA6Ci0JICBlbHNlCi0JICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCi0JICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCi0JICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCi0JICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAotCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCi0JICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKLQkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCi0JICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KLQkgIGZpCi0JICA7OwotCWVzYWMKLQlzaGFyZWRfZmxhZz0nLXNoYXJlZCcKLQlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJwotCWZpCi0gICAgICBlbHNlCi0JIyBub3QgdXNpbmcgZ2NjCi0JaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQotCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6Ci0JICBzaGFyZWRfZmxhZz0nLUcnCi0JZWxzZQotCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJwotCSAgZWxzZQotCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJwotCSAgZmkKLQlmaQotICAgICAgZmkKLQotICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmV4cGFsbCcKLSAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAotICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KLSAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCi0gICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKLQkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0JX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSctYmVyb2snCi0gICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgotICAgICAgICAjIGVtcHR5IGV4ZWN1dGFibGUuCi0gICAgICAgIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCi0gICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZnVuY19lY2hvX2FsbCAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKLSAgICAgIGVsc2UKLQlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJwotCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIteiBub2RlZnMiCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKLQllbHNlCi0JICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgotCSAjIGVtcHR5IGV4ZWN1dGFibGUuCi0JIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCi0JIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKLQkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQkgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm5vdG9rJwotCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCi0JICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0JICAgICMgV2Ugb25seSB1c2UgdGhpcyBjb2RlIGZvciBHTlUgbGRzIHRoYXQgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUuCi0JICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0JICBlbHNlCi0JICAgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcwotCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKLQkgIGZpCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCi0JICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLQlmaQotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBwb3dlcnBjKQotICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAotICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJwotICAgICAgICA7OwotICAgICAgbTY4aykKLSAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgYnNkaVtbNDVdXSopCi0gICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPS1yZHluYW1pYwotICAgICAgOzsKLQotICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKLSAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcwotICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScgJwotICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCi0gICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgotICAgICAgbGliZXh0PWxpYgotICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCi0gICAgICBzaHJleHRfY21kcz0iLmRsbCIKLSAgICAgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KLSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgZnVuY19lY2hvX2FsbCAiJGRlcGxpYnMiIHwgJFNFRCAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JwotICAgICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KLSAgICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPSd0cnVlJwotICAgICAgIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KLSAgICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSdsaWIgLU9VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCi0gICAgICBfTFRfVEFHVkFSKGZpeF9zcmNmaWxlX3BhdGgsICQxKT0nYGN5Z3BhdGggLXcgIiRzcmNmaWxlImAnCi0gICAgICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKLSAgICAgIDs7Ci0KLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMoJDEpCi0gICAgICA7OwotCi0gICAgZGd1eCopCi0gICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICBmcmVlYnNkMSopCi0gICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICA7OwotCi0gICAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCi0gICAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCi0gICAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCi0gICAgIyBleHRyYSBzcGFjZSkuCi0gICAgZnJlZWJzZDIuMiopCi0gICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KLSAgICBmcmVlYnNkMiopCi0gICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQotICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgaHB1eDkqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZWxzZQotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZmkKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0KLSAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0gICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKLSAgICAgIDs7Ci0KLSAgICBocHV4MTAqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKLQlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0nK2IgJGxpYmRpcicKLQlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0JX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLQlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcwotCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCi0JIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQlfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaHB1eDExKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCWNhc2UgJGhvc3RfY3B1IGluCi0JaHBwYSo2NCopCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JaWE2NCopCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JKikKLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWVzYWMKLSAgICAgIGVsc2UKLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqKQotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQlpYTY0KikKLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JKikKLQltNF9pZigkMSwgW10sIFsKLQkgICMgT2xkZXIgdmVyc2lvbnMgb2YgdGhlIDExLjAwIGNvbXBpbGVyIGRvIG5vdCB1bmRlcnN0YW5kIC1iIHlldAotCSAgIyAoSFA5MjQ1My0wMSBBLjExLjAxLjIwIGRvZXNuJ3QsIEhQOTI0NTMtMDEgQi4xMS5YLjM1MTc1LTM1MTc2LkdQIGRvZXMpCi0JICBfTFRfTElOS0VSX09QVElPTihbaWYgJENDIHVuZGVyc3RhbmRzIC1iXSwKLQkgICAgX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX19iLCAkMSksIFstYl0sCi0JICAgIFtfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyddLAotCSAgICBbX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyddKV0sCi0JICBbX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnXSkKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKLQlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqfGlhNjQqKQotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLQkgIDs7Ci0JKikKLQkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0JICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcwotCSAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKLQotCSAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JIyBUcnkgdG8gdXNlIHRoZSAtZXhwb3J0ZWRfc3ltYm9sIGxkIG9wdGlvbiwgaWYgaXQgZG9lcyBub3QKLQkjIHdvcmssIGFzc3VtZSB0aGF0IC1leHBvcnRzX2ZpbGUgZG9lcyBub3Qgd29yayBlaXRoZXIgYW5kCi0JIyBpbXBsaWNpdGx5IGV4cG9ydCBhbGwgc3ltYm9scy4KLSAgICAgICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLSAgICAgICAgTERGTEFHUz0iJExERkxBR1MgLXNoYXJlZCAke3dsfS1leHBvcnRlZF9zeW1ib2wgJHt3bH1mb28gJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9L2Rldi9udWxsIgotICAgICAgICBBQ19MSU5LX0lGRUxTRShpbnQgZm9vKHZvaWQpIHt9LAotICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgJHt3bH0tZXhwb3J0c19maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICAgICkKLSAgICAgICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLSAgICAgIGVsc2UKLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1leHBvcnRzX2ZpbGUgJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBmaQotICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPSdubycKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0gICAgICBfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT15ZXMKLSAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotICAgICAgOzsKLQotICAgIG5ldGJzZCopCi0gICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAjIGEub3V0Ci0gICAgICBlbHNlCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgICAgICMgRUxGCi0gICAgICBmaQotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgIG5ld3NvczYpCi0gICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgKm50byogfCAqcW54KikKLSAgICAgIDs7Ci0KLSAgICBvcGVuYnNkKikKLSAgICAgIGlmIHRlc3QgLWYgL3Vzci9saWJleGVjL2xkLnNvOyB0aGVuCi0JX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLQlfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCi0JaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKLQkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJwotCSAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKLQllbHNlCi0JICBjYXNlICRob3N0X29zIGluCi0JICAgb3BlbmJzZFtbMDFdXS4qIHwgb3BlbmJzZDIuW1swLTddXSB8IG9wZW5ic2QyLltbMC03XV0uKikKLQkgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJwotCSAgICAgOzsKLQkgICAqKQotCSAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JICAgICA7OwotCSAgZXNhYwotCWZpCi0gICAgICBlbHNlCi0JX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBvczIqKQotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCi0gICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckRUNITyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRFQ0hPICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lY2hvIERBVEEgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCi0gICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgICAgOzsKLQotICAgIG9zZjMqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBlbHNlCi0JX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBmaQotICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPSdubycKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0gICAgICA7OwotCi0gICAgb3NmNCogfCBvc2Y1KikJIyBhcyBvc2YzKiB3aXRoIHRoZSBhZGRpdGlvbiBvZiAtbXN5bSBmbGFnCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBlbHNlCi0JX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZTsgcHJpbnRmICIlc1xcbiIgIi1oaWRkZW4iPj4gJGxpYi5leHB+Ci0JJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICRjb21waWxlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kUk0gJGxpYi5leHAnCi0KLQkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5Ci0JX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1ycGF0aCAkbGliZGlyJwotICAgICAgZmkKLSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT0nbm8nCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAteiBkZWZzJwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQl3bGFyYz0nJHt3bH0nCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0teiAke3dsfXRleHQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkgICRDQyAtc2hhcmVkICR7d2x9LXogJHt3bH10ZXh0ICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCi0gICAgICBlbHNlCi0JY2FzZSBgJENDIC1WIDI+JjFgIGluCi0JKiJDb21waWxlcnMgNS4wIiopCi0JICB3bGFyYz0nJwotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCSAgJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JFJNICRsaWIuZXhwJwotCSAgOzsKLQkqKQotCSAgd2xhcmM9JyR7d2x9JwotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JICAkQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgc29sYXJpczIuW1swLTVdXSB8IHNvbGFyaXMyLltbMC01XV0uKikgOzsKLSAgICAgICopCi0JIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBhbmQgcmVvcmRlciBsaW5rZXIgb3B0aW9ucywKLQkjIGJ1dCB1bmRlcnN0YW5kcyBgLXogbGlua2VyX2ZsYWcnLiAgR0NDIGRpc2NhcmRzIGl0IHdpdGhvdXQgYCR3bCcsCi0JIyBidXQgaXMgY2FyZWZ1bCBlbm91Z2ggbm90IHRvIHJlb3JkZXIuCi0JIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKLQlpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdCRjb252ZW5pZW5jZSAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnCi0JZWxzZQotCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JwotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotICAgICAgOzsKLQotICAgIHN1bm9zNCopCi0gICAgICBpZiB0ZXN0ICJ4JGhvc3RfdmVuZG9yIiA9IHhzZXF1ZW50OyB0aGVuCi0JIyBVc2UgJENDIHRvIGxpbmsgdW5kZXIgc2VxdWVudCwgYmVjYXVzZSBpdCB0aHJvd3MgaW4gc29tZSBleHRyYSAubwotCSMgZmlsZXMgdGhhdCBtYWtlIC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucyB3b3JrLgotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICBzeXN2NCkKLSAgICAgIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0Jc25pKQotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/Ci0JOzsKLQlzaWVtZW5zKQotCSAgIyMgTEQgaXMgbGQgaXQgbWFrZXMgYSBQTEFNTElCCi0JICAjIyBDQyBqdXN0IG1ha2VzIGEgR3Jvc3NNb2R1bGUuCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSckQ0MgLXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLQkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLSAgICAgICAgOzsKLQltb3Rvcm9sYSkKLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8gI01vdG9yb2xhIG1hbnVhbCBzYXlzIHllcywgYnV0IG15IHRlc3RzIHNheSB0aGV5IGxpZQotCTs7Ci0gICAgICBlc2FjCi0gICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0LjMqKQotICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9Jy1CZXhwb3J0JwotICAgICAgOzsKLQotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLQlydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotCWhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcwotCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LltbMDFdXS5bWzEwXV0qIHwgdW5peHdhcmU3KiB8IHNjbzMuMnY1LjAuW1swMjRdXSopCi0gICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKLSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQotICAgICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKLSAgICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KLSAgICAgICMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAotICAgICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAotICAgICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCi0gICAgICAjIGFzIC16IGRlZnMuCi0gICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKLSAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teixub2RlZnMnCi0gICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiwkbGliZGlyJwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCi0gICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKLSAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUJleHBvcnQnCi0gICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCi0KLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgdXRzNCopCi0gICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0IHgkaG9zdF92ZW5kb3IgPSB4c25pOyB0aGVuCi0gICAgICBjYXNlICRob3N0IGluCi0gICAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCi0JX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tQmxhcmdlZHluc3ltJwotCTs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgZmkKLV0pCi1BQ19NU0dfUkVTVUxUKFskX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKV0pCi10ZXN0ICIkX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLV9MVF9UQUdWQVIod2l0aF9nbnVfbGQsICQxKT0kd2l0aF9nbnVfbGQKLQotX0xUX0RFQ0woW10sIFtsaWJleHRdLCBbMF0sIFtPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIildKWRubAotX0xUX0RFQ0woW10sIFtzaHJleHRfY21kc10sIFsxXSwgW1NoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpXSlkbmwKLV9MVF9ERUNMKFtdLCBbZXh0cmFjdF9leHBzeW1zX2NtZHNdLCBbMl0sCi0gICAgW1RoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmVdKQotCi0jCi0jIERvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGxpYmM/Ci0jCi1jYXNlICJ4JF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKSIgaW4KLXh8eHllcykKLSAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAotICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCi0KLSAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgY2FzZSAkX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKSBpbgotICAgIConficqKQotICAgICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgotICAgICAgOzsKLSAgICAnJENDICcqKQotICAgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQotICAgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCi0gICAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KLSAgICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW5dLAotCVtsdF9jdl9dX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpLAotCVskUk0gY29uZnRlc3QqCi0JZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0KLQlpZiBBQ19UUllfRVZBTChhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgotCSAgc29uYW1lPWNvbmZ0ZXN0Ci0JICBsaWI9Y29uZnRlc3QKLQkgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAotCSAgZGVwbGlicz0KLQkgIHdsPSRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKQotCSAgcGljX2ZsYWc9JF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKQotCSAgY29tcGlsZXJfZmxhZ3M9LXYKLQkgIGxpbmtlcl9mbGFncz0tdgotCSAgdmVyc3RyaW5nPQotCSAgb3V0cHV0X29iamRpcj0uCi0JICBsaWJuYW1lPWNvbmZ0ZXN0Ci0JICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSkKLQkgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KLQkgIGlmIEFDX1RSWV9FVkFMKF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgMlw+XCYxIFx8ICRHUkVQIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpCi0JICB0aGVuCi0JICAgIGx0X2N2X1tdX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi0JICBlbHNlCi0JICAgIGx0X2N2X1tdX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcwotCSAgZmkKLQkgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZwotCWVsc2UKLQkgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotCWZpCi0JJFJNIGNvbmZ0ZXN0KgotCV0pCi0gICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9JGx0X2N2X1tdX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgOzsKLWVzYWMKLQotX0xUX1RBR0RFQ0woW2J1aWxkX2xpYnRvb2xfbmVlZF9sY10sIFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFswXSwKLSAgICBbV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllc10pCi1fTFRfVEFHREVDTChbYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwKLSAgICBbZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc10sIFswXSwKLSAgICBbV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpY10pCi1fTFRfVEFHREVDTChbXSwgW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFsxXSwKLSAgICBbQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVuc10pCi1fTFRfVEFHREVDTChbXSwgW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgWzFdLAotICAgIFtDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXNdKQotX0xUX1RBR0RFQ0woW10sIFtjb21waWxlcl9uZWVkc19vYmplY3RdLCBbMV0sCi0gICAgW1doZXRoZXIgdGhlIGNvbXBpbGVyIGNvcGVzIHdpdGggcGFzc2luZyBubyBvYmplY3RzIGRpcmVjdGx5XSkKLV9MVF9UQUdERUNMKFtdLCBbb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc10sIFsyXSwKLSAgICBbQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZV0pCi1fTFRfVEFHREVDTChbXSwgW29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzXSwgWzJdLAotICAgIFtDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmVdKQotX0xUX1RBR0RFQ0woW10sIFthcmNoaXZlX2NtZHNdLCBbMl0sIFtDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgc2hhcmVkIGFyY2hpdmVdKQotX0xUX1RBR0RFQ0woW10sIFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgWzJdKQotX0xUX1RBR0RFQ0woW10sIFttb2R1bGVfY21kc10sIFsyXSwKLSAgICBbQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSBpZiBkaWZmZXJlbnQgZnJvbSBidWlsZGluZwotICAgIGEgc2hhcmVkIGFyY2hpdmUuXSkKLV9MVF9UQUdERUNMKFtdLCBbbW9kdWxlX2V4cHN5bV9jbWRzXSwgWzJdKQotX0xUX1RBR0RFQ0woW10sIFt3aXRoX2dudV9sZF0sIFsxXSwKLSAgICBbV2hldGhlciB3ZSBhcmUgYnVpbGRpbmcgd2l0aCBHTlUgbGQgb3Igbm90XSkKLV9MVF9UQUdERUNMKFtdLCBbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbMV0sCi0gICAgW0ZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0XSkKLV9MVF9UQUdERUNMKFtdLCBbbm9fdW5kZWZpbmVkX2ZsYWddLCBbMV0sCi0gICAgW0ZsYWcgdGhhdCBlbmZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9sc10pCi1fTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbMV0sCi0gICAgW0ZsYWcgdG8gaGFyZGNvZGUgJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgotICAgIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgJGxpYmRpciBkb2VzIG5vdCBleGlzdF0pCi1fTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRdLCBbMV0sCi0gICAgW1tJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSAkbGliZGlyIGludG8gYSBiaW5hcnkKLSAgICBkdXJpbmcgbGlua2luZy4gIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgJGxpYmRpciBkb2VzIG5vdCBleGlzdF1dKQotX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgWzFdLAotICAgIFtXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgIi1ycGF0aCIgZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50XSkKLV9MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfZGlyZWN0XSwgWzBdLAotICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcwotICAgIERJUiBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5XSkKLV9MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlXSwgWzBdLAotICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcwotICAgIERJUiBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5IGFuZCB0aGUgcmVzdWx0aW5nIGxpYnJhcnkgZGVwZW5kZW5jeSBpcwotICAgICJhYnNvbHV0ZSIsIGkuZSBpbXBvc3NpYmxlIHRvIGNoYW5nZSBieSBzZXR0aW5nICR7c2hsaWJwYXRoX3Zhcn0gaWYgdGhlCi0gICAgbGlicmFyeSBpcyByZWxvY2F0ZWRdKQotX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9taW51c19MXSwgWzBdLAotICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUgotICAgIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnldKQotX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgWzBdLAotICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUgotICAgIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnldKQotX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbMF0sCi0gICAgW1NldCB0byAieWVzIiBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUgotICAgIGludG8gdGhlIGxpYnJhcnkgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkCi0gICAgYWdhaW5zdCBpdF0pCi1fTFRfVEFHREVDTChbXSwgW2luaGVyaXRfcnBhdGhdLCBbMF0sCi0gICAgW1NldCB0byB5ZXMgaWYgbGlua2VyIGFkZHMgcnVudGltZSBwYXRocyBvZiBkZXBlbmRlbnQgbGlicmFyaWVzCi0gICAgdG8gcnVudGltZSBwYXRoIGxpc3RdKQotX0xUX1RBR0RFQ0woW10sIFtsaW5rX2FsbF9kZXBsaWJzXSwgWzBdLAotICAgIFtXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXNdKQotX0xUX1RBR0RFQ0woW10sIFtmaXhfc3JjZmlsZV9wYXRoXSwgWzFdLAotICAgIFtGaXggdGhlIHNoZWxsIHZhcmlhYmxlICRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXJdKQotX0xUX1RBR0RFQ0woW10sIFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbMF0sCi0gICAgW1NldCB0byAieWVzIiBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZF0pCi1fTFRfVEFHREVDTChbXSwgW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbMl0sCi0gICAgW1RoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHNdKQotX0xUX1RBR0RFQ0woW10sIFtleGNsdWRlX2V4cHN5bXNdLCBbMV0sCi0gICAgW1N5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHNdKQotX0xUX1RBR0RFQ0woW10sIFtpbmNsdWRlX2V4cHN5bXNdLCBbMV0sCi0gICAgW1N5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZF0pCi1fTFRfVEFHREVDTChbXSwgW3ByZWxpbmtfY21kc10sIFsyXSwKLSAgICBbQ29tbWFuZHMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHByb2dyYW1zIChhZ2FpbnN0IGxpYnJhcmllcykgd2l0aCB0ZW1wbGF0ZXNdKQotX0xUX1RBR0RFQ0woW10sIFtmaWxlX2xpc3Rfc3BlY10sIFsxXSwKLSAgICBbU3BlY2lmeSBmaWxlbmFtZSBjb250YWluaW5nIGlucHV0IGZpbGVzXSkKLWRubCBGSVhNRTogTm90IHlldCBpbXBsZW1lbnRlZAotZG5sIF9MVF9UQUdERUNMKFtdLCBbdGhyZWFkX3NhZmVfZmxhZ19zcGVjXSwgWzFdLAotZG5sICAgIFtDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZCBzYWZlIG9iamVjdHNdKQotXSkjIF9MVF9MSU5LRVJfU0hMSUJTCi0KLQotIyBfTFRfTEFOR19DX0NPTkZJRyhbVEFHXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBDIGNvbXBpbGVyIGFyZSBzdWl0YWJseQotIyBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHIHRvIHdyaXRlCi0jIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KLW00X2RlZnVuKFtfTFRfTEFOR19DX0NPTkZJR10sCi1bbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAotbHRfc2F2ZV9DQz0iJENDIgotQUNfTEFOR19QVVNIKEMpCi0KLSMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDIHRlc3Qgc291cmNlcy4KLWFjX2V4dD1jCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDIHRlc3Qgc291cmNlcy4KLW9iamV4dD1vCi1fTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKLWx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwOyIKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKLWx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oKXtyZXR1cm4oMCk7fScKLQotX0xUX1RBR19DT01QSUxFUgotIyBTYXZlIHRoZSBkZWZhdWx0IGNvbXBpbGVyLCBzaW5jZSBpdCBnZXRzIG92ZXJ3cml0dGVuIHdoZW4gdGhlIG90aGVyCi0jIHRhZ3MgYXJlIGJlaW5nIHRlc3RlZCwgYW5kIF9MVF9UQUdWQVIoY29tcGlsZXIsIFtdKSBpcyBhIE5PUC4KLWNvbXBpbGVyX0RFRkFVTFQ9JENDCi0KLSMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi1fTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKLV9MVF9MSU5LRVJfQk9JTEVSUExBVEUKLQotaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgotICBfTFRfQ09NUElMRVJfTk9fUlRUSSgkMSkKLSAgX0xUX0NPTVBJTEVSX1BJQygkMSkKLSAgX0xUX0NPTVBJTEVSX0NfTygkMSkKLSAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCi0gIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQotICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQotICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCi0gIExUX1NZU19ETE9QRU5fU0VMRgotICBfTFRfQ01EX1NUUklQTElCCi0KLSAgIyBSZXBvcnQgd2hpY2ggbGlicmFyeSB0eXBlcyB3aWxsIGFjdHVhbGx5IGJlIGJ1aWx0Ci0gIEFDX01TR19DSEVDS0lORyhbaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKLSAgQUNfTVNHX1JFU1VMVChbJGNhbl9idWlsZF9zaGFyZWRdKQotCi0gIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKLSAgdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCi0KLSAgIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCi0gICMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBhaXgzKikKLSAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCi0gICAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCi0gICAgZmkKLSAgICA7OwotCi0gIGFpeFtbNC05XV0qKQotICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KLSAgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gICAgZmkKLSAgICA7OwotICBlc2FjCi0gIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc2hhcmVkXSkKLQotICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCi0gICMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgotICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKLSAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zdGF0aWNdKQotCi0gIF9MVF9DT05GSUcoJDEpCi1maQotQUNfTEFOR19QT1AKLUNDPSIkbHRfc2F2ZV9DQyIKLV0pIyBfTFRfTEFOR19DX0NPTkZJRwotCi0KLSMgX0xUX0xBTkdfQ1hYX0NPTkZJRyhbVEFHXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEMrKyBjb21waWxlciBhcmUgc3VpdGFibHkKLSMgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRyB0byB3cml0ZQotIyB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCi1tNF9kZWZ1bihbX0xUX0xBTkdfQ1hYX0NPTkZJR10sCi1bbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCi1tNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCi1pZiB0ZXN0IC1uICIkQ1hYIiAmJiAoIHRlc3QgIlgkQ1hYIiAhPSAiWG5vIiAmJgotICAgICggKHRlc3QgIlgkQ1hYIiA9ICJYZysrIiAmJiBgZysrIC12ID4vZGV2L251bGwgMj4mMWAgKSB8fAotICAgICh0ZXN0ICJYJENYWCIgIT0gIlhnKysiKSkpIDsgdGhlbgotICBBQ19QUk9HX0NYWENQUAotZWxzZQotICBfbHRfY2F1Z2h0X0NYWF9lcnJvcj15ZXMKLWZpCi0KLUFDX0xBTkdfUFVTSChDKyspCi1fTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KLV9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KLV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQotX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT1ubwotX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KLV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KLV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQotX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9Ci1fTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KLV9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCi1fTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAotX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubwotX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9bm8KLV9MVF9UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KLV9MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9Ci1fTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCi1fTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcwotX0xUX1RBR1ZBUihyZWxvYWRfZmxhZywgJDEpPSRyZWxvYWRfZmxhZwotX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSRyZWxvYWRfY21kcwotX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPQotX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQotX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KLQotIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMrKyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9Y3BwCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDKysgdGVzdCBzb3VyY2VzLgotb2JqZXh0PW8KLV9MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAotCi0jIE5vIHNlbnNlIGluIHJ1bm5pbmcgYWxsIHRoZXNlIHRlc3RzIGlmIHdlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0Ci0jIHRoZSBDWFggY29tcGlsZXIgaXNuJ3Qgd29ya2luZy4gIFNvbWUgdmFyaWFibGVzIChsaWtlIGVuYWJsZV9zaGFyZWQpCi0jIGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBhcHBseSB0byBhbGwgY29tcGlsZXJzIG9uIHRoaXMgcGxhdGZvcm0sCi0jIGFuZCB3aWxsIGJlIGNvcnJ1cHRlZCBieSBzZXR0aW5nIHRoZW0gYmFzZWQgb24gYSBub24td29ya2luZyBjb21waWxlci4KLWlmIHRlc3QgIiRfbHRfY2F1Z2h0X0NYWF9lcnJvciIgIT0geWVzOyB0aGVuCi0gICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCi0gIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwOyIKLQotICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotICBsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKGludCwgY2hhciAqW1tdXSkgeyByZXR1cm4oMCk7IH0nCi0KLSAgIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgotICBfTFRfVEFHX0NPTVBJTEVSCi0KLSAgIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKLSAgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCi0gIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKLQotICAjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotICBsdF9zYXZlX0NDPSRDQwotICBsdF9zYXZlX0xEPSRMRAotICBsdF9zYXZlX0dDQz0kR0NDCi0gIEdDQz0kR1hYCi0gIGx0X3NhdmVfd2l0aF9nbnVfbGQ9JHdpdGhfZ251X2xkCi0gIGx0X3NhdmVfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRAotICBpZiB0ZXN0IC1uICIke2x0X2N2X3Byb2dfZ251X2xkY3h4K3NldH0iOyB0aGVuCi0gICAgbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkY3h4Ci0gIGVsc2UKLSAgICAkYXNfdW5zZXQgbHRfY3ZfcHJvZ19nbnVfbGQKLSAgZmkKLSAgaWYgdGVzdCAtbiAiJHtsdF9jdl9wYXRoX0xEQ1hYK3NldH0iOyB0aGVuCi0gICAgbHRfY3ZfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRENYWAotICBlbHNlCi0gICAgJGFzX3Vuc2V0IGx0X2N2X3BhdGhfTEQKLSAgZmkKLSAgdGVzdCAteiAiJHtMRENYWCtzZXR9IiB8fCBMRD0kTERDWFgKLSAgQ0M9JHtDWFgtImMrKyJ9Ci0gIGNvbXBpbGVyPSRDQwotICBfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCi0gIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKLQotICBpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCi0gICAgIyBXZSBkb24ndCB3YW50IC1mbm8tZXhjZXB0aW9uIHdoZW4gY29tcGlsaW5nIEMrKyBjb2RlLCBzbyBzZXQgdGhlCi0gICAgIyBub19idWlsdGluX2ZsYWcgc2VwYXJhdGVseQotICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9JyAtZm5vLWJ1aWx0aW4nCi0gICAgZWxzZQotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPQotICAgIGZpCi0KLSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICAgICAgIyBTZXQgdXAgZGVmYXVsdCBHTlUgQysrIGNvbmZpZ3VyYXRpb24KLQotICAgICAgTFRfUEFUSF9MRAotCi0gICAgICAjIENoZWNrIGlmIEdOVSBDKysgdXNlcyBHTlUgbGQgYXMgdGhlIHVuZGVybHlpbmcgbGlua2VyLCBzaW5jZSB0aGUKLSAgICAgICMgYXJjaGl2aW5nIGNvbW1hbmRzIGJlbG93IGFzc3VtZSB0aGF0IEdOVSBsZCBpcyBiZWluZyB1c2VkLgotICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0KLSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotCi0gICAgICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5Ci0gICAgICAgICMgWFhYIEkgdGhpbmsgd2xhcmMgY2FuIGJlIGVsaW1pbmF0ZWQgaW4gbHRjZi1jeHgsIGJ1dCBJIG5lZWQgdG8KLSAgICAgICAgIyAgICAgaW52ZXN0aWdhdGUgaXQgYSBsaXR0bGUgYml0IG1vcmUuIChNTSkKLSAgICAgICAgd2xhcmM9JyR7d2x9JwotCi0gICAgICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KLSAgICAgICAgaWYgZXZhbCAiYCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkYCAtLWhlbHAgMj4mMSIgfAotCSAgJEdSRVAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJwotICAgICAgICBlbHNlCi0gICAgICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQotICAgICAgICBmaQotICAgICAgZWxzZQotICAgICAgICB3aXRoX2dudV9sZD1ubwotICAgICAgICB3bGFyYz0KLQotICAgICAgICAjIEEgZ2VuZXJpYyBhbmQgdmVyeSBzaW1wbGUgZGVmYXVsdCBzaGFyZWQgbGlicmFyeSBjcmVhdGlvbgotICAgICAgICAjIGNvbW1hbmQgZm9yIEdOVSBDKysgZm9yIHRoZSBjYXNlIHdoZXJlIGl0IHVzZXMgdGhlIG5hdGl2ZQotICAgICAgICAjIGxpbmtlciwgaW5zdGVhZCBvZiBHTlUgbGQuICBJZiBwb3NzaWJsZSwgdGhpcyBzZXR0aW5nIHNob3VsZAotICAgICAgICAjIG92ZXJyaWRkZW4gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG5hdGl2ZSBsaW5rZXIgZmVhdHVyZXMgb24KLSAgICAgICAgIyB0aGUgcGxhdGZvcm0gaXQgaXMgYmVpbmcgdXNlZCBvbi4KLSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJwotICAgICAgZmkKLQotICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0gICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLSAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIC12ICJeQ29uZmlndXJlZCB3aXRoOiIgfCAkR1JFUCAiXC1MIicKLQotICAgIGVsc2UKLSAgICAgIEdYWD1ubwotICAgICAgd2l0aF9nbnVfbGQ9bm8KLSAgICAgIHdsYXJjPQotICAgIGZpCi0KLSAgICAjIFBPUlRNRTogZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgQysrIGxpbmsgY2hhcmFjdGVyaXN0aWNzCi0gICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQotICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4MyopCi0gICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICAgIDs7Ci0gICAgICBhaXhbWzQtOV1dKikKLSAgICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAgICAgICAjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0Ci0gICAgICAgICAgIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCi0gICAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotICAgICAgICAgIGV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCi0gICAgICAgICAgbm9fZW50cnlfZmxhZz0iIgotICAgICAgICBlbHNlCi0gICAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotCi0gICAgICAgICAgIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCi0gICAgICAgICAgIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCi0gICAgICAgICAgIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KLSAgICAgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4W1s1LTldXSopCi0JICAgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbwotCSAgICAgIGNhc2UgJGxkX2ZsYWcgaW4KLQkgICAgICAqLWJydGwqKQotCSAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKLQkgICAgICAgIGJyZWFrCi0JICAgICAgICA7OwotCSAgICAgIGVzYWMKLQkgICAgZG9uZQotCSAgICA7OwotICAgICAgICAgIGVzYWMKLQotICAgICAgICAgIGV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCi0gICAgICAgICAgbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JwotICAgICAgICBmaQotCi0gICAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KLSAgICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5Ci0gICAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCi0gICAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90Ci0gICAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgotCi0gICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JycKLSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKLSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCi0gICAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotICAgICAgICBfTFRfVEFHVkFSKGZpbGVfbGlzdF9zcGVjLCAkMSk9JyR7d2x9LWYsJwotCi0gICAgICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0gICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMDEyXV18YWl4NC5bWzAxMl1dLiopCi0gICAgICAgICAgIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCi0gICAgICAgICAgIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCi0JICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCi0JICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJgotCSAgICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCAkR1JFUCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKLQkgIHRoZW4KLQkgICAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgotCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCi0JICAgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKLQkgICAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKLQkgICAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCi0JICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KLQkgIGZpCi0gICAgICAgICAgZXNhYwotICAgICAgICAgIHNoYXJlZF9mbGFnPSctc2hhcmVkJwotCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICAgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJwotCSAgZmkKLSAgICAgICAgZWxzZQotICAgICAgICAgICMgbm90IHVzaW5nIGdjYwotICAgICAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JICAjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQotCSAgIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKLQkgIHNoYXJlZF9mbGFnPSctRycKLSAgICAgICAgICBlbHNlCi0JICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJwotCSAgICBlbHNlCi0JICAgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKLQkgICAgZmkKLSAgICAgICAgICBmaQotICAgICAgICBmaQotCi0gICAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJleHBhbGwnCi0gICAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAotICAgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8KLQkjIGV4cG9ydC4KLSAgICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKLSAgICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0gICAgICAgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCi0gICAgICAgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotICAgICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLWJlcm9rJwotICAgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eQotICAgICAgICAgICMgZXhlY3V0YWJsZS4KLSAgICAgICAgICBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWAotICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotCi0gICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGZ1bmNfZWNob19hbGwgIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCi0JICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iLXogbm9kZWZzIgotCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKLSAgICAgICAgICBlbHNlCi0JICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgotCSAgICAjIGVtcHR5IGV4ZWN1dGFibGUuCi0JICAgIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCi0JICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotCSAgICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAotCSAgICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0JICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm5vdG9rJwotCSAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJvaycKLQkgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotCSAgICAgICMgV2Ugb25seSB1c2UgdGhpcyBjb2RlIGZvciBHTlUgbGRzIHRoYXQgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUuCi0JICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgICAgZWxzZQotCSAgICAgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcwotCSAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJGNvbnZlbmllbmNlJwotCSAgICBmaQotCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCi0JICAgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZAotCSAgICAjIGxpYnJhcmllcy4KLQkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLSAgICAgICAgICBmaQotICAgICAgICBmaQotICAgICAgICA7OwotCi0gICAgICBiZW9zKikKLQlpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKLQkgICMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKLQkgICMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQllbHNlCi0JICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JZmkKLQk7OwotCi0gICAgICBjaG9ydXMqKQotICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgICopCi0JICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQkgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgICAgOzsKLQotICAgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQotICAgICAgICAjIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAotICAgICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotICAgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWFsbC1zeW1ib2xzJwotICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKLSAgICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubwotICAgICAgICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKLQotICAgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotICAgICAgICAgICMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKLSAgICAgICAgICAjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgotICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgotCSAgICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0gICAgICAgICAgZWxzZQotCSAgICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQkgICAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLSAgICAgICAgICBmaX4KLSAgICAgICAgICAkQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0gICAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgICBfTFRfREFSV0lOX0xJTktFUl9GRUFUVVJFUygkMSkKLQk7OwotCi0gICAgICBkZ3V4KikKLSAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgICBlYysrKikKLQkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQkgICAgOzsKLSAgICAgICAgICBnaGN4KikKLQkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKLQkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQkgICAgOzsKLSAgICAgICAgICAqKQotCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCSAgICA7OwotICAgICAgICBlc2FjCi0gICAgICAgIDs7Ci0KLSAgICAgIGZyZWVic2RbWzEyXV0qKQotICAgICAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIHJlcG9ydGVkIHRvIGJlIGZhaXJseSBicm9rZW4gYmVmb3JlCi0JIyBzd2l0Y2ggdG8gRUxGCi0gICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgICAgOzsKLQotICAgICAgZnJlZWJzZC1lbGYqKQotICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLSAgICAgICAgOzsKLQotICAgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQotICAgICAgICAjIEZyZWVCU0QgMyBhbmQgbGF0ZXIgdXNlIEdOVSBDKysgYW5kIEdOVSBsZCB3aXRoIHN0YW5kYXJkIEVMRgotICAgICAgICAjIGNvbnZlbnRpb25zCi0gICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCi0gICAgICAgIDs7Ci0KLSAgICAgIGdudSopCi0gICAgICAgIDs7Ci0KLSAgICAgIGhhaWt1KikKLSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotICAgICAgICA7OwotCi0gICAgICBocHV4OSopCi0gICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotICAgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJwotICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAotCQkJCSAgICAgICAgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdAotCQkJCSAgICAgICAgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgICAgQ0MqKQotICAgICAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICAgICAgICA7OwotICAgICAgICAgIGFDQyopCi0gICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLWIgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgICAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLSAgICAgICAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotICAgICAgICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0gICAgICAgICAgICAjCi0gICAgICAgICAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0gICAgICAgICAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotICAgICAgICAgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQotICAgICAgICAgICAgIyBkZXBlbmRlbmNpZXMuCi0gICAgICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCgkQ0MgLWIgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEpIHwgJEVHUkVQICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGZ1bmNfZWNob19hbGwgIiRsaXN0IicKLSAgICAgICAgICAgIDs7Ci0gICAgICAgICAgKikKLSAgICAgICAgICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0gICAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLSAgICAgICAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgICAgOzsKLQotICAgICAgaHB1eDEwKnxocHV4MTEqKQotICAgICAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCi0JICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0JICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0KLSAgICAgICAgICBjYXNlICRob3N0X2NwdSBpbgotICAgICAgICAgICAgaHBwYSo2NCp8aWE2NCopCi0gICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAqKQotCSAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCi0gICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgZXNhYwotICAgICAgICBmaQotICAgICAgICBjYXNlICRob3N0X2NwdSBpbgotICAgICAgICAgIGhwcGEqNjQqfGlhNjQqKQotICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgICAgICAgIDs7Ci0gICAgICAgICAgKikKLSAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcwotICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkJCQkJICAgICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKLQkJCQkJICAgICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLSAgICAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgIENDKikKLQkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQkgICAgOzsKLSAgICAgICAgICBhQ0MqKQotCSAgICBjYXNlICRob3N0X2NwdSBpbgotCSAgICAgIGhwcGEqNjQqKQotCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgICAgICAgOzsKLQkgICAgICBpYTY0KikKLQkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgICAgICAgIDs7Ci0JICAgICAgKikKLQkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgICAgICAgOzsKLQkgICAgZXNhYwotCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgICAgIwotCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0JICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCi0JICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKLQkgICAgIyBkZXBlbmRlbmNpZXMuCi0JICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCAkR1JFUCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCi0JICAgIDs7Ci0gICAgICAgICAgKikKLQkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLQkgICAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCi0JICAgICAgICBjYXNlICRob3N0X2NwdSBpbgotCSAgICAgICAgICBocHBhKjY0KikKLQkgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgICAgICAgICAgOzsKLQkgICAgICAgICAgaWE2NCopCi0JICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgICAgICAgICAgIDs7Ci0JICAgICAgICAgICopCi0JICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgICAgICAgICAgOzsKLQkgICAgICAgIGVzYWMKLQkgICAgICBmaQotCSAgICBlbHNlCi0JICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCSAgICBmaQotCSAgICA7OwotICAgICAgICBlc2FjCi0gICAgICAgIDs7Ci0KLSAgICAgIGludGVyaXhbWzMtOV1dKikKLQlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCi0JX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLQlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQlfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJwotCSMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KLQkjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5Ci0JIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQotCSMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKLQkjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCi0JIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLQk7OwotICAgICAgaXJpeDUqIHwgaXJpeDYqKQotICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgIENDKikKLQkgICAgIyBTR0kgQysrCi0JICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1hbGwgLW11bHRpZ290ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCi0JICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZwotCSAgICAjICJDQyAtYXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBJUklYIEMrKyBjb21waWxlci4gIFRoaXMgaXMKLQkgICAgIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCi0JICAgICMgaW4gdGhlIGFyY2hpdmUuCi0JICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLWFyIC1XUiwtdSAtbyAkb2xkbGliICRvbGRvYmpzJwotCSAgICA7OwotICAgICAgICAgICopCi0JICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0JICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JICAgICAgZWxzZQotCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAtbyAkbGliJwotCSAgICAgIGZpCi0JICAgIGZpCi0JICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotCSAgICA7OwotICAgICAgICBlc2FjCi0gICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLSAgICAgICAgX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9eWVzCi0gICAgICAgIDs7Ci0KLSAgICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKLSAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgICBLQ0MqKQotCSAgICAjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCi0KLQkgICAgIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQotCSAgICAjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5Ci0JICAgICMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCi0JICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKLQkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzOyBtdiBcJHRlbXBsaWIgJGxpYicKLQkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JICAgICMKLQkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQotCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JICAgICMgZGVwZW5kZW5jaWVzLgotCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxIHwgJEdSRVAgImxkImA7IHJtIC1mIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQ7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCi0KLQkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLQotCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKLQkgICAgIyAiQ0MgLUJzdGF0aWMiLCB3aGVyZSAiQ0MiIGlzIHRoZSBLQUkgQysrIGNvbXBpbGVyLgotCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCi0JICAgIDs7Ci0JICBpY3BjKiB8IGVjcGMqICkKLQkgICAgIyBJbnRlbCBDKysKLQkgICAgd2l0aF9nbnVfbGQ9eWVzCi0JICAgICMgdmVyc2lvbiA4LjAgYW5kIGFib3ZlIG9mIGljcGMgY2hva2Ugb24gbXVsdGlwbHkgZGVmaW5lZCBzeW1ib2xzCi0JICAgICMgaWYgd2UgYWRkICRwcmVkZXBfb2JqZWN0cyBhbmQgJHBvc3RkZXBfb2JqZWN0cywgaG93ZXZlciA3LjEgYW5kCi0JICAgICMgZWFybGllciBkbyBub3QgYWRkIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuCi0JICAgIGNhc2UgYCRDQyAtViAyPiYxYCBpbgotCSAgICAgICoiVmVyc2lvbiA3LiIqKQotCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQkJOzsKLQkgICAgICAqKSAgIyBWZXJzaW9uIDguMCBvciBuZXdlcgotCSAgICAgICAgdG1wX2lkeW49Ci0JICAgICAgICBjYXNlICRob3N0X2NwdSBpbgotCQkgIGlhNjQqKSB0bXBfaWR5bj0nIC1pX2R5bmFtaWMnOzsKLQkJZXNhYwotCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotCQk7OwotCSAgICBlc2FjCi0JICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQkgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCSAgICA7OwotICAgICAgICAgIHBnQ0MqIHwgcGdjcHAqKQotICAgICAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKLQkgICAgY2FzZSBgJENDIC1WYCBpbgotCSAgICAqcGdDQ1wgW1sxLTVdXS4qIHwgKnBnY3BwXCBbWzEtNV1dLiopCi0JICAgICAgX0xUX1RBR1ZBUihwcmVsaW5rX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KLQkJcm0gLXJmICR0cGxkaXJ+Ci0JCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJG9ianMgJGxpYm9ianMgJGNvbXBpbGVfZGVwbGlic34KLQkJY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8IHNvcnQgfCAkTkwyU1BgIicKLQkgICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KLQkJcm0gLXJmICR0cGxkaXJ+Ci0JCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJG9sZG9ianMkb2xkX2RlcGxpYnN+Ci0JCSRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8IHNvcnQgfCAkTkwyU1BgfgotCQkkUkFOTElCICRvbGRsaWInCi0JICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KLQkJcm0gLXJmICR0cGxkaXJ+Ci0JCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRjb252ZW5pZW5jZSAkcG9zdGRlcF9vYmplY3RzfgotCQkkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8IHNvcnQgfCAkTkwyU1BgICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgLW8gJGxpYicKLQkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KLQkJcm0gLXJmICR0cGxkaXJ+Ci0JCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRjb252ZW5pZW5jZSAkcG9zdGRlcF9vYmplY3RzfgotCQkkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8IHNvcnQgfCAkTkwyU1BgICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotCSAgICAgIDs7Ci0JICAgICopICMgVmVyc2lvbiA2IGFuZCBhYm92ZSB1c2Ugd2VhayBzeW1ib2xzCi0JICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIC1vICRsaWInCi0JICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0JICAgICAgOzsKLQkgICAgZXNhYwotCi0JICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJwotCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0JICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0gICAgICAgICAgICA7OwotCSAgY3h4KikKLQkgICAgIyBDb21wYXEgQysrCi0JICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICAtbyAkbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzJwotCi0JICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0JICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKLQkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotCi0JICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSAgICAjCi0JICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KLQkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLQkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQotCSAgICAjIGRlcGVuZGVuY2llcy4KLQkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQICJsZCJgOyB0ZW1wbGlzdD1gZnVuY19lY2hvX2FsbCAiJHRlbXBsaXN0IiB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkIC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiWCRsaXN0IiB8ICRYc2VkJwotCSAgICA7OwotCSAgeGwqIHwgbXBpeGwqIHwgYmd4bCopCi0JICAgICMgSUJNIFhMIDguMCBvbiBQUEMsIHdpdGggR05VIGxkCi0JICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0JICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLQkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1xbWtzaHJvYmogJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JICAgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KLQkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLQkJY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotCQllY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLQkJJENDIC1xbWtzaHJvYmogJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCi0JICAgIGZpCi0JICAgIDs7Ci0JICAqKQotCSAgICBjYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KLQkgICAgKlN1blwgQyopCi0JICAgICAgIyBTdW4gQysrIDUuOQotCSAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16ZGVmcycKLQkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzJwotCSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCi0JICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBuZXdfY29udmVuaWVuY2U9OyBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC16IFwiJGNvbnZcIiB8fCBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCSAgICAgIF9MVF9UQUdWQVIoY29tcGlsZXJfbmVlZHNfb2JqZWN0LCAkMSk9eWVzCi0KLQkgICAgICAjIE5vdCBzdXJlIHdoZXRoZXIgc29tZXRoaW5nIGJhc2VkIG9uCi0JICAgICAgIyAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMQotCSAgICAgICMgd291bGQgYmUgYmV0dGVyLgotCSAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdmdW5jX2VjaG9fYWxsJwotCi0JICAgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCi0JICAgICAgIyAiQ0MgLXhhciIsIHdoZXJlICJDQyIgaXMgdGhlIFN1biBDKysgY29tcGlsZXIuICBUaGlzIGlzCi0JICAgICAgIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCi0JICAgICAgIyBpbiB0aGUgYXJjaGl2ZS4KLQkgICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC14YXIgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0KLSAgICAgIGx5bnhvcyopCi0gICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotCi0gICAgICBtODhrKikKLSAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotCi0gICAgICBtdnMqKQotICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgIGN4eCopCi0JICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JICAgIDs7Ci0JICAqKQotCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCSAgICA7OwotCWVzYWMKLQk7OwotCi0gICAgICBuZXRic2QqKQotICAgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlICAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRsaW5rZXJfZmxhZ3MnCi0JICB3bGFyYz0KLQkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCi0JICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLQlmaQotCSMgV29ya2Fyb3VuZCBzb21lIGJyb2tlbiBwcmUtMS41IHRvb2xjaGFpbnMKLQlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCBjb25mdGVzdC4kb2JqZXh0IHwgJFNFRCAtZSAiczotbGdjYyAtbGMgLWxnY2M6OiInCi0JOzsKLQotICAgICAgKm50byogfCAqcW54KikKLSAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKLQk7OwotCi0gICAgICBvcGVuYnNkMiopCi0gICAgICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGZhaXJseSBicm9rZW4KLQlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JOzsKLQotICAgICAgb3BlbmJzZCopCi0JaWYgdGVzdCAtZiAvdXNyL2xpYmV4ZWMvbGQuc287IHRoZW4KLQkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0JICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKLQkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJwotCSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0JICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0JICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCi0JICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIGZpCi0JICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1mdW5jX2VjaG9fYWxsCi0JZWxzZQotCSAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCWZpCi0JOzsKLQotICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgIEtDQyopCi0JICAgICMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKLQotCSAgICAjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCi0JICAgICMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKLQkgICAgIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KLQkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbW14oKTAtOUEtWmEtent9XV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICIkbGliIiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCi0KLQkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLQotCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKLQkgICAgIyB0aGUgS0FJIEMrKyBjb21waWxlci4KLQkgICAgY2FzZSAkaG9zdCBpbgotCSAgICAgIG9zZjMqKSBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnIDs7Ci0JICAgICAgKikgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbyAkb2xkbGliICRvbGRvYmpzJyA7OwotCSAgICBlc2FjCi0JICAgIDs7Ci0gICAgICAgICAgUkNDKikKLQkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKLQkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQkgICAgOzsKLSAgICAgICAgICBjeHgqKQotCSAgICBjYXNlICRob3N0IGluCi0JICAgICAgb3NmMyopCi0JICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotCQk7OwotCSAgICAgICopCi0JICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0JICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZX4KLQkgICAgICAgICAgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KLQkgICAgICAgICAgJENDIC1zaGFyZWQkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifgotCSAgICAgICAgICAkUk0gJGxpYi5leHAnCi0JICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCi0JCTs7Ci0JICAgIGVzYWMKLQotCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0KLQkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JICAgICMKLQkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQotCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JICAgICMgZGVwZW5kZW5jaWVzLgotCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgImxkIiB8ICRHUkVQIC12ICJsZDoiYDsgdGVtcGxpc3Q9YGZ1bmNfZWNob19hbGwgIiR0ZW1wbGlzdCIgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiJGxpc3QiJwotCSAgICA7OwotCSAgKikKLQkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQkgICAgICBjYXNlICRob3N0IGluCi0JICAgICAgICBvc2YzKikKLQkgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCQkgIDs7Ci0JICAgICAgICAqKQotCSAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQkJICA7OwotCSAgICAgIGVzYWMKLQotCSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0JICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotCi0JICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIC12ICJeQ29uZmlndXJlZCB3aXRoOiIgfCAkR1JFUCAiXC1MIicKLQotCSAgICBlbHNlCi0JICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCSAgICBmaQotCSAgICA7OwotICAgICAgICBlc2FjCi0gICAgICAgIDs7Ci0KLSAgICAgIHBzb3MqKQotICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLSAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgICA7OwotCi0gICAgICBzdW5vczQqKQotICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgIENDKikKLQkgICAgIyBTdW4gQysrIDQueAotCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCSAgICA7OwotICAgICAgICAgIGxjYyopCi0JICAgICMgTHVjaWQKLQkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQkgICAgOzsKLSAgICAgICAgICAqKQotCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCSAgICA7OwotICAgICAgICBlc2FjCi0gICAgICAgIDs7Ci0KLSAgICAgIHNvbGFyaXMqKQotICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgIENDKiB8IHN1bkNDKikKLQkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKwotICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywkMSk9eWVzCi0JICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16ZGVmcycKLQkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gIC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkgICAgICAkQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAke3dsfS1NICR7d2x9JGxpYi5leHAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKLQotCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJwotCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotCSAgICBjYXNlICRob3N0X29zIGluCi0JICAgICAgc29sYXJpczIuW1swLTVdXSB8IHNvbGFyaXMyLltbMC01XV0uKikgOzsKLQkgICAgICAqKQotCQkjIFRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBjb21iaW5lIGFuZCByZW9yZGVyIGxpbmtlciBvcHRpb25zLAotCQkjIGJ1dCB1bmRlcnN0YW5kcyBgLXogbGlua2VyX2ZsYWcnLgotCSAgICAgICAgIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKLQkJX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JwotCSAgICAgICAgOzsKLQkgICAgZXNhYwotCSAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKLQotCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZnVuY19lY2hvX2FsbCcKLQotCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKLQkgICAgIyAiQ0MgLXhhciIsIHdoZXJlICJDQyIgaXMgdGhlIFN1biBDKysgY29tcGlsZXIuICBUaGlzIGlzCi0JICAgICMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAotCSAgICAjIGluIHRoZSBhcmNoaXZlLgotCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC14YXIgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQkgICAgOzsKLSAgICAgICAgICBnY3gqKQotCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCi0KLQkgICAgIyBUaGUgQysrIGNvbXBpbGVyIG11c3QgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGFyY2hpdmUuCi0JICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgJExERkxBR1MgLWFyY2hpdmUgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQkgICAgOzsKLSAgICAgICAgICAqKQotCSAgICAjIEdOVSBDKysgY29tcGlsZXIgd2l0aCBTb2xhcmlzIGxpbmtlcgotCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQkgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS16ICR7d2x9ZGVmcycKLQkgICAgICBpZiAkQ0MgLS12ZXJzaW9uIHwgJEdSRVAgLXYgJ14yXC43JyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKLQkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JCSAgJENDIC1zaGFyZWQgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJwotCi0JICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgLXYgIl5Db25maWd1cmVkIHdpdGg6IiB8ICRHUkVQICJcLUwiJwotCSAgICAgIGVsc2UKLQkgICAgICAgICMgZysrIDIuNyBhcHBlYXJzIHRvIHJlcXVpcmUgYC1HJyBOT1QgYC1zaGFyZWQnIG9uIHRoaXMKLQkgICAgICAgICMgcGxhdGZvcm0uCi0JICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKLQkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JCSAgJENDIC1HIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKLQotCSAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLUcgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCi0JICAgICAgZmkKLQotCSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SICR3bCRsaWJkaXInCi0JICAgICAgY2FzZSAkaG9zdF9vcyBpbgotCQlzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OwotCQkqKQotCQkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3QkY29udmVuaWVuY2UgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JwotCQkgIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgICA7OwotICAgICAgICBlc2FjCi0gICAgICAgIDs7Ci0KLSAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bWzAxXV0uW1sxMF1dKiB8IHVuaXh3YXJlNyogfCBzY28zLjJ2NS4wLltbMDI0XV0qKQotICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCi0gICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCi0KLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgIENDKikKLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JKikKLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKLQkjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAotCSMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KLQkjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKLQkjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0Ci0JIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCi0JIyBhcyAteiBkZWZzLgotCV9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JwotCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teixub2RlZnMnCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi0JX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLQlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiwkbGliZGlyJwotCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JwotCV9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUJleHBvcnQnCi0JcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgICBDQyopCi0JICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1UcHJlbGlua19vYmplY3RzICRvbGRvYmpzfgotCSAgICAgICciJF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpIgotCSAgICBfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JyRDQyAtVHByZWxpbmtfb2JqZWN0cyAkcmVsb2FkX29ianN+Ci0JICAgICAgJyIkX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpIgotCSAgICA7OwotCSAgKikKLQkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgICA7OwotCWVzYWMKLSAgICAgIDs7Ci0KLSAgICAgIHRhbmRlbSopCi0gICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgICAgTkNDKikKLQkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCi0JICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JICAgIDs7Ci0gICAgICAgICAgKikKLQkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQkgICAgOzsKLSAgICAgICAgZXNhYwotICAgICAgICA7OwotCi0gICAgICB2eHdvcmtzKikKLSAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgICAgOzsKLQotICAgICAgKikKLSAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBBQ19NU0dfUkVTVUxUKFskX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKV0pCi0gICAgdGVzdCAiJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSkiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi0gICAgX0xUX1RBR1ZBUihHQ0MsICQxKT0iJEdYWCIKLSAgICBfTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKLQotICAgICMjIENBVkVBVCBFTVBUT1I6Ci0gICAgIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKLSAgICAjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQotICAgICMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgotICAgIF9MVF9TWVNfSElEREVOX0xJQkRFUFMoJDEpCi0gICAgX0xUX0NPTVBJTEVSX1BJQygkMSkKLSAgICBfTFRfQ09NUElMRVJfQ19PKCQxKQotICAgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQotICAgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQotICAgIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCi0gICAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQotCi0gICAgX0xUX0NPTkZJRygkMSkKLSAgZmkgIyB0ZXN0IC1uICIkY29tcGlsZXIiCi0KLSAgQ0M9JGx0X3NhdmVfQ0MKLSAgTERDWFg9JExECi0gIExEPSRsdF9zYXZlX0xECi0gIEdDQz0kbHRfc2F2ZV9HQ0MKLSAgd2l0aF9nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKLSAgbHRfY3ZfcGF0aF9MRENYWD0kbHRfY3ZfcGF0aF9MRAotICBsdF9jdl9wYXRoX0xEPSRsdF9zYXZlX3BhdGhfTEQKLSAgbHRfY3ZfcHJvZ19nbnVfbGRjeHg9JGx0X2N2X3Byb2dfZ251X2xkCi0gIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCi1maSAjIHRlc3QgIiRfbHRfY2F1Z2h0X0NYWF9lcnJvciIgIT0geWVzCi0KLUFDX0xBTkdfUE9QCi1dKSMgX0xUX0xBTkdfQ1hYX0NPTkZJRwotCi0KLSMgX0xUX1NZU19ISURERU5fTElCREVQUyhbVEFHTkFNRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBGaWd1cmUgb3V0ICJoaWRkZW4iIGxpYnJhcnkgZGVwZW5kZW5jaWVzIGZyb20gdmVyYm9zZQotIyBjb21waWxlciBvdXRwdXQgd2hlbiBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0jIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQotIyBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCi1tNF9kZWZ1bihbX0xUX1NZU19ISURERU5fTElCREVQU10sCi1bbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3QgYmVpbmcgbGlua2VkOgotX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPQotX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0KLV9MVF9UQUdWQVIocHJlZGVwcywgJDEpPQotX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpPQotX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0KLQotZG5sIHdlIGNhbid0IHVzZSB0aGUgbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIGhlcmUsCi1kbmwgYmVjYXVzZSBpdCBjb250YWlucyBjb2RlIGludGVuZGVkIGZvciBhbiBleGVjdXRhYmxlLAotZG5sIG5vdCBhIGxpYnJhcnkuICBJdCdzIHBvc3NpYmxlIHdlIHNob3VsZCBsZXQgZWFjaAotZG5sIHRhZyBkZWZpbmUgYSBuZXcgbHRfPz8/P19saW5rX3Rlc3RfY29kZSB2YXJpYWJsZSwKLWRubCBidXQgaXQncyBvbmx5IHVzZWQgaGVyZS4uLgotbTRfaWYoWyQxXSwgW10sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgotaW50IGE7Ci12b2lkIGZvbyAodm9pZCkgeyBhID0gMDsgfQotX0xUX0VPRgotXSwgWyQxXSwgW0NYWF0sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgotY2xhc3MgRm9vCi17Ci1wdWJsaWM6Ci0gIEZvbyAodm9pZCkgeyBhID0gMDsgfQotcHJpdmF0ZToKLSAgaW50IGE7Ci19OwotX0xUX0VPRgotXSwgWyQxXSwgW0Y3N10sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgotICAgICAgc3Vicm91dGluZSBmb28KLSAgICAgIGltcGxpY2l0IG5vbmUKLSAgICAgIGludGVnZXIqNCBhCi0gICAgICBhPTAKLSAgICAgIHJldHVybgotICAgICAgZW5kCi1fTFRfRU9GCi1dLCBbJDFdLCBbRkNdLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKLSAgICAgIHN1YnJvdXRpbmUgZm9vCi0gICAgICBpbXBsaWNpdCBub25lCi0gICAgICBpbnRlZ2VyIGEKLSAgICAgIGE9MAotICAgICAgcmV0dXJuCi0gICAgICBlbmQKLV9MVF9FT0YKLV0sIFskMV0sIFtHQ0pdLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKLXB1YmxpYyBjbGFzcyBmb28gewotICBwcml2YXRlIGludCBhOwotICBwdWJsaWMgdm9pZCBiYXIgKHZvaWQpIHsKLSAgICBhID0gMDsKLSAgfQotfTsKLV9MVF9FT0YKLV0pCi1kbmwgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5Ci1kbmwgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgotaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgIyBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKLSAgIyBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCi0KLSAgIyBTZW50aW5lbCB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBvciBub3Qgd2UgYXJlIGJlZm9yZQotICAjIHRoZSBjb25mdGVzdCBvYmplY3QgZmlsZS4KLSAgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT1ubwotCi0gIGZvciBwIGluIGBldmFsICIkb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQiYDsgZG8KLSAgICBjYXNlICRwIGluCi0KLSAgICAtTCogfCAtUiogfCAtbCopCi0gICAgICAgIyBTb21lIGNvbXBpbGVycyBwbGFjZSBzcGFjZSBiZXR3ZWVuICIte0wsUn0iIGFuZCB0aGUgcGF0aC4KLSAgICAgICAjIFJlbW92ZSB0aGUgc3BhY2UuCi0gICAgICAgaWYgdGVzdCAkcCA9ICItTCIgfHwKLSAgICAgICAgICB0ZXN0ICRwID0gIi1SIjsgdGhlbgotCSBwcmV2PSRwCi0JIGNvbnRpbnVlCi0gICAgICAgZWxzZQotCSBwcmV2PQotICAgICAgIGZpCi0KLSAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgotCSBjYXNlICRwIGluCi0JIC1MKiB8IC1SKikKLQkgICAjIEludGVybmFsIGNvbXBpbGVyIGxpYnJhcnkgcGF0aHMgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhvc2UKLQkgICAjIHByb3ZpZGVkIHRoZSB1c2VyLiAgVGhlIHBvc3RkZXBzIGFscmVhZHkgY29tZSBhZnRlciB0aGUKLQkgICAjIHVzZXIgc3VwcGxpZWQgbGlicyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgdGhlbS4KLQkgICBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKSI7IHRoZW4KLQkgICAgIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9IiR7cHJldn0ke3B9IgotCSAgIGVsc2UKLQkgICAgIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9IiR7X0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKX0gJHtwcmV2fSR7cH0iCi0JICAgZmkKLQkgICA7OwotCSAjIFRoZSAiLWwiIGNhc2Ugd291bGQgbmV2ZXIgY29tZSBiZWZvcmUgdGhlIG9iamVjdCBiZWluZwotCSAjIGxpbmtlZCwgc28gZG9uJ3QgYm90aGVyIGhhbmRsaW5nIHRoaXMgY2FzZS4KLQkgZXNhYwotICAgICAgIGVsc2UKLQkgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIocG9zdGRlcHMsICQxKSI7IHRoZW4KLQkgICBfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSk9IiR7cHJldn0ke3B9IgotCSBlbHNlCi0JICAgX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpPSIke19MVF9UQUdWQVIocG9zdGRlcHMsICQxKX0gJHtwcmV2fSR7cH0iCi0JIGZpCi0gICAgICAgZmkKLSAgICAgICA7OwotCi0gICAgKi4kb2JqZXh0KQotICAgICAgICMgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHRlc3Qgb2JqZWN0IGZpbGUgb25seSBzaG93cyB1cAotICAgICAgICMgb25jZSBpbiB0aGUgY29tcGlsZXIgb3V0cHV0LgotICAgICAgIGlmIHRlc3QgIiRwIiA9ICJjb25mdGVzdC4kb2JqZXh0IjsgdGhlbgotCSBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPXllcwotCSBjb250aW51ZQotICAgICAgIGZpCi0KLSAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgotCSBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpIjsgdGhlbgotCSAgIF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0iJHAiCi0JIGVsc2UKLQkgICBfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9IiRfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkgJHAiCi0JIGZpCi0gICAgICAgZWxzZQotCSBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKSI7IHRoZW4KLQkgICBfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPSIkcCIKLQkgZWxzZQotCSAgIF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9IiRfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpICRwIgotCSBmaQotICAgICAgIGZpCi0gICAgICAgOzsKLQotICAgICopIDs7ICMgSWdub3JlIHRoZSByZXN0LgotCi0gICAgZXNhYwotICBkb25lCi0KLSAgIyBDbGVhbiB1cC4KLSAgcm0gLWYgYS5vdXQgYS5leGUKLWVsc2UKLSAgZWNobyAibGlidG9vbC5tNDogZXJyb3I6IHByb2JsZW0gY29tcGlsaW5nICQxIHRlc3QgcHJvZ3JhbSIKLWZpCi0KLSRSTSAtZiBjb25mZXN0LiRvYmpleHQKLQotIyBQT1JUTUU6IG92ZXJyaWRlIGFib3ZlIHRlc3Qgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBicm9rZW4KLW00X2lmKFskMV0sIFtDWFhdLAotW2Nhc2UgJGhvc3Rfb3MgaW4KLWludGVyaXhbWzMtOV1dKikKLSAgIyBJbnRlcml4IDMuNSBpbnN0YWxscyBjb21wbGV0ZWx5IGhvc2VkIC5sYSBmaWxlcyBmb3IgQysrLCBzbyByYXRoZXIgdGhhbgotICAjIGhhY2sgYWxsIGFyb3VuZCBpdCwgbGV0J3MganVzdCB0cnVzdCAiZysrIiB0byBEVFJULgotICBfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCQxKT0KLSAgX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsJDEpPQotICBfTFRfVEFHVkFSKHBvc3RkZXBzLCQxKT0KLSAgOzsKLQotbGludXgqKQotICBjYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KLSAgKlN1blwgQyopCi0gICAgIyBTdW4gQysrIDUuOQotCi0gICAgIyBUaGUgbW9yZSBzdGFuZGFyZHMtY29uZm9ybWluZyBzdGxwb3J0NCBsaWJyYXJ5IGlzCi0gICAgIyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgQ3N0ZCBsaWJyYXJ5LiBBdm9pZCBzcGVjaWZ5aW5nCi0gICAgIyBpdCBpZiBpdCdzIGluIENYWEZMQUdTLiBJZ25vcmUgbGliQ3J1biBhcwotICAgICMgLWxpYnJhcnk9c3RscG9ydDQgZGVwZW5kcyBvbiBpdC4KLSAgICBjYXNlICIgJENYWCAkQ1hYRkxBR1MgIiBpbgotICAgICoiIC1saWJyYXJ5PXN0bHBvcnQ0ICIqKQotICAgICAgc29sYXJpc191c2Vfc3RscG9ydDQ9eWVzCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgIiRzb2xhcmlzX3VzZV9zdGxwb3J0NCIgIT0geWVzOyB0aGVuCi0gICAgICBfTFRfVEFHVkFSKHBvc3RkZXBzLCQxKT0nLWxpYnJhcnk9Q3N0ZCAtbGlicmFyeT1DcnVuJwotICAgIGZpCi0gICAgOzsKLSAgZXNhYwotICA7OwotCi1zb2xhcmlzKikKLSAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgQ0MqIHwgc3VuQ0MqKQotICAgICMgVGhlIG1vcmUgc3RhbmRhcmRzLWNvbmZvcm1pbmcgc3RscG9ydDQgbGlicmFyeSBpcwotICAgICMgaW5jb21wYXRpYmxlIHdpdGggdGhlIENzdGQgbGlicmFyeS4gQXZvaWQgc3BlY2lmeWluZwotICAgICMgaXQgaWYgaXQncyBpbiBDWFhGTEFHUy4gSWdub3JlIGxpYkNydW4gYXMKLSAgICAjIC1saWJyYXJ5PXN0bHBvcnQ0IGRlcGVuZHMgb24gaXQuCi0gICAgY2FzZSAiICRDWFggJENYWEZMQUdTICIgaW4KLSAgICAqIiAtbGlicmFyeT1zdGxwb3J0NCAiKikKLSAgICAgIHNvbGFyaXNfdXNlX3N0bHBvcnQ0PXllcwotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIEFkZGluZyB0aGlzIHJlcXVpcmVzIGEga25vd24tZ29vZCBzZXR1cCBvZiBzaGFyZWQgbGlicmFyaWVzIGZvcgotICAgICMgU3VuIGNvbXBpbGVyIHZlcnNpb25zIGJlZm9yZSA1LjYsIGVsc2UgUElDIG9iamVjdHMgZnJvbSBhbiBvbGQKLSAgICAjIGFyY2hpdmUgd2lsbCBiZSBsaW5rZWQgaW50byB0aGUgb3V0cHV0LCBsZWFkaW5nIHRvIHN1YnRsZSBidWdzLgotICAgIGlmIHRlc3QgIiRzb2xhcmlzX3VzZV9zdGxwb3J0NCIgIT0geWVzOyB0aGVuCi0gICAgICBfTFRfVEFHVkFSKHBvc3RkZXBzLCQxKT0nLWxpYnJhcnk9Q3N0ZCAtbGlicmFyeT1DcnVuJwotICAgIGZpCi0gICAgOzsKLSAgZXNhYwotICA7OwotZXNhYwotXSkKLQotY2FzZSAiICRfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSkgIiBpbgotKiIgLWxjICIqKSBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8gOzsKLWVzYWMKLSBfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfZGlycywgJDEpPQotaWYgdGVzdCAtbiAiJHtfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpfSI7IHRoZW4KLSBfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfZGlycywgJDEpPWBlY2hvICIgJHtfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpfSIgfCAke1NFRH0gLWUgJ3MhIC1MISAhZycgLWUgJ3MhXiAhISdgCi1maQotX0xUX1RBR0RFQ0woW10sIFtjb21waWxlcl9saWJfc2VhcmNoX2RpcnNdLCBbMV0sCi0gICAgW1RoZSBkaXJlY3RvcmllcyBzZWFyY2hlZCBieSB0aGlzIGNvbXBpbGVyIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeV0pCi1fTFRfVEFHREVDTChbXSwgW3ByZWRlcF9vYmplY3RzXSwgWzFdLAotICAgIFtEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIGFuZCBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8KLSAgICBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeV0pCi1fTFRfVEFHREVDTChbXSwgW3Bvc3RkZXBfb2JqZWN0c10sIFsxXSkKLV9MVF9UQUdERUNMKFtdLCBbcHJlZGVwc10sIFsxXSkKLV9MVF9UQUdERUNMKFtdLCBbcG9zdGRlcHNdLCBbMV0pCi1fTFRfVEFHREVDTChbXSwgW2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF0sIFsxXSwKLSAgICBbVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKLSAgICBhIHNoYXJlZCBsaWJyYXJ5XSkKLV0pIyBfTFRfU1lTX0hJRERFTl9MSUJERVBTCi0KLQotIyBfTFRfTEFOR19GNzdfQ09ORklHKFtUQUddKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIGEgRm9ydHJhbiA3NyBjb21waWxlciBhcmUKLSMgc3VpdGFibHkgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRwotIyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCi1tNF9kZWZ1bihbX0xUX0xBTkdfRjc3X0NPTkZJR10sCi1bQUNfTEFOR19QVVNIKEZvcnRyYW4gNzcpCi1pZiB0ZXN0IC16ICIkRjc3IiB8fCB0ZXN0ICJYJEY3NyIgPSAiWG5vIjsgdGhlbgotICBfbHRfZGlzYWJsZV9GNzc9eWVzCi1maQotCi1fTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KLV9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KLV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQotX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KLV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KLV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQotX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9Ci1fTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KLV9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCi1fTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCi1fTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT1ubwotX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQotX0xUX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KLV9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KLV9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCi1fTFRfVEFHVkFSKHJlbG9hZF9mbGFnLCAkMSk9JHJlbG9hZF9mbGFnCi1fTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JHJlbG9hZF9jbWRzCi1fTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9Ci1fTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Ci1fTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubwotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgZjc3IHRlc3Qgc291cmNlcy4KLWFjX2V4dD1mCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBmNzcgdGVzdCBzb3VyY2VzLgotb2JqZXh0PW8KLV9MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAotCi0jIE5vIHNlbnNlIGluIHJ1bm5pbmcgYWxsIHRoZXNlIHRlc3RzIGlmIHdlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0Ci0jIHRoZSBGNzcgY29tcGlsZXIgaXNuJ3Qgd29ya2luZy4gIFNvbWUgdmFyaWFibGVzIChsaWtlIGVuYWJsZV9zaGFyZWQpCi0jIGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBhcHBseSB0byBhbGwgY29tcGlsZXJzIG9uIHRoaXMgcGxhdGZvcm0sCi0jIGFuZCB3aWxsIGJlIGNvcnJ1cHRlZCBieSBzZXR0aW5nIHRoZW0gYmFzZWQgb24gYSBub24td29ya2luZyBjb21waWxlci4KLWlmIHRlc3QgIiRfbHRfZGlzYWJsZV9GNzciICE9IHllczsgdGhlbgotICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotICBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9IlwKLSAgICAgIHN1YnJvdXRpbmUgdAotICAgICAgcmV0dXJuCi0gICAgICBlbmQKLSIKLQotICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotICBsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IlwKLSAgICAgIHByb2dyYW0gdAotICAgICAgZW5kCi0iCi0KLSAgIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgotICBfTFRfVEFHX0NPTVBJTEVSCi0KLSAgIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKLSAgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCi0gIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKLQotICAjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotICBsdF9zYXZlX0NDPSIkQ0MiCi0gIGx0X3NhdmVfR0NDPSRHQ0MKLSAgQ0M9JHtGNzctImY3NyJ9Ci0gIGNvbXBpbGVyPSRDQwotICBfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCi0gIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKLSAgR0NDPSRHNzcKLSAgaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgotICAgIEFDX01TR19DSEVDS0lORyhbaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKLSAgICBBQ19NU0dfUkVTVUxUKFskY2FuX2J1aWxkX3NoYXJlZF0pCi0KLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCi0gICAgdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCi0KLSAgICAjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKLSAgICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4MyopCi0gICAgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gICAgICAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gICAgICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgotICAgICAgICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKLSAgICAgICAgZmkKLSAgICAgICAgOzsKLSAgICAgIGFpeFtbNC05XV0qKQotCWlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KLQkgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0JZmkKLSAgICAgICAgOzsKLSAgICBlc2FjCi0gICAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zaGFyZWRdKQotCi0gICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQotICAgICMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgotICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcwotICAgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKLQotICAgIF9MVF9UQUdWQVIoR0NDLCAkMSk9IiRHNzciCi0gICAgX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCi0KLSAgICAjIyBDQVZFQVQgRU1QVE9SOgotICAgICMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCi0gICAgIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKLSAgICAjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KLSAgICBfTFRfQ09NUElMRVJfUElDKCQxKQotICAgIF9MVF9DT01QSUxFUl9DX08oJDEpCi0gICAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCi0gICAgX0xUX0xJTktFUl9TSExJQlMoJDEpCi0gICAgX0xUX1NZU19EWU5BTUlDX0xJTktFUigkMSkKLSAgICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCi0KLSAgICBfTFRfQ09ORklHKCQxKQotICBmaSAjIHRlc3QgLW4gIiRjb21waWxlciIKLQotICBHQ0M9JGx0X3NhdmVfR0NDCi0gIENDPSIkbHRfc2F2ZV9DQyIKLWZpICMgdGVzdCAiJF9sdF9kaXNhYmxlX0Y3NyIgIT0geWVzCi0KLUFDX0xBTkdfUE9QCi1dKSMgX0xUX0xBTkdfRjc3X0NPTkZJRwotCi0KLSMgX0xUX0xBTkdfRkNfQ09ORklHKFtUQUddKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBGb3J0cmFuIGNvbXBpbGVyIGFyZQotIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCi0jIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KLW00X2RlZnVuKFtfTFRfTEFOR19GQ19DT05GSUddLAotW0FDX0xBTkdfUFVTSChGb3J0cmFuKQotCi1pZiB0ZXN0IC16ICIkRkMiIHx8IHRlc3QgIlgkRkMiID0gIlhubyI7IHRoZW4KLSAgX2x0X2Rpc2FibGVfRkM9eWVzCi1maQotCi1fTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KLV9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KLV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQotX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KLV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KLV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQotX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9Ci1fTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KLV9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCi1fTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCi1fTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT1ubwotX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQotX0xUX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KLV9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KLV9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCi1fTFRfVEFHVkFSKHJlbG9hZF9mbGFnLCAkMSk9JHJlbG9hZF9mbGFnCi1fTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JHJlbG9hZF9jbWRzCi1fTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9Ci1fTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Ci1fTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubwotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgZmMgdGVzdCBzb3VyY2VzLgotYWNfZXh0PSR7YWNfZmNfc3JjZXh0LWZ9Ci0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBmYyB0ZXN0IHNvdXJjZXMuCi1vYmpleHQ9bwotX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0Ci0KLSMgTm8gc2Vuc2UgaW4gcnVubmluZyBhbGwgdGhlc2UgdGVzdHMgaWYgd2UgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQKLSMgdGhlIEZDIGNvbXBpbGVyIGlzbid0IHdvcmtpbmcuICBTb21lIHZhcmlhYmxlcyAobGlrZSBlbmFibGVfc2hhcmVkKQotIyBhcmUgY3VycmVudGx5IGFzc3VtZWQgdG8gYXBwbHkgdG8gYWxsIGNvbXBpbGVycyBvbiB0aGlzIHBsYXRmb3JtLAotIyBhbmQgd2lsbCBiZSBjb3JydXB0ZWQgYnkgc2V0dGluZyB0aGVtIGJhc2VkIG9uIGEgbm9uLXdvcmtpbmcgY29tcGlsZXIuCi1pZiB0ZXN0ICIkX2x0X2Rpc2FibGVfRkMiICE9IHllczsgdGhlbgotICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotICBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9IlwKLSAgICAgIHN1YnJvdXRpbmUgdAotICAgICAgcmV0dXJuCi0gICAgICBlbmQKLSIKLQotICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotICBsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IlwKLSAgICAgIHByb2dyYW0gdAotICAgICAgZW5kCi0iCi0KLSAgIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgotICBfTFRfVEFHX0NPTVBJTEVSCi0KLSAgIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKLSAgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCi0gIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKLQotICAjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotICBsdF9zYXZlX0NDPSIkQ0MiCi0gIGx0X3NhdmVfR0NDPSRHQ0MKLSAgQ0M9JHtGQy0iZjk1In0KLSAgY29tcGlsZXI9JENDCi0gIEdDQz0kYWNfY3ZfZmNfY29tcGlsZXJfZ251Ci0KLSAgX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQwotICBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCi0KLSAgaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgotICAgIEFDX01TR19DSEVDS0lORyhbaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKLSAgICBBQ19NU0dfUkVTVUxUKFskY2FuX2J1aWxkX3NoYXJlZF0pCi0KLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCi0gICAgdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCi0KLSAgICAjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKLSAgICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4MyopCi0gICAgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gICAgICAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gICAgICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgotICAgICAgICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKLSAgICAgICAgZmkKLSAgICAgICAgOzsKLSAgICAgIGFpeFtbNC05XV0qKQotCWlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KLQkgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0JZmkKLSAgICAgICAgOzsKLSAgICBlc2FjCi0gICAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zaGFyZWRdKQotCi0gICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQotICAgICMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgotICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcwotICAgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKLQotICAgIF9MVF9UQUdWQVIoR0NDLCAkMSk9IiRhY19jdl9mY19jb21waWxlcl9nbnUiCi0gICAgX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCi0KLSAgICAjIyBDQVZFQVQgRU1QVE9SOgotICAgICMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCi0gICAgIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKLSAgICAjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KLSAgICBfTFRfU1lTX0hJRERFTl9MSUJERVBTKCQxKQotICAgIF9MVF9DT01QSUxFUl9QSUMoJDEpCi0gICAgX0xUX0NPTVBJTEVSX0NfTygkMSkKLSAgICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKLSAgICBfTFRfTElOS0VSX1NITElCUygkMSkKLSAgICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQotICAgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKLQotICAgIF9MVF9DT05GSUcoJDEpCi0gIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgotCi0gIEdDQz0kbHRfc2F2ZV9HQ0MKLSAgQ0M9IiRsdF9zYXZlX0NDIgotZmkgIyB0ZXN0ICIkX2x0X2Rpc2FibGVfRkMiICE9IHllcwotCi1BQ19MQU5HX1BPUAotXSkjIF9MVF9MQU5HX0ZDX0NPTkZJRwotCi0KLSMgX0xUX0xBTkdfR0NKX0NPTkZJRyhbVEFHXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciB0aGUgR05VIEphdmEgQ29tcGlsZXIgY29tcGlsZXIKLSMgYXJlIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKLSMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgotbTRfZGVmdW4oW19MVF9MQU5HX0dDSl9DT05GSUddLAotW0FDX1JFUVVJUkUoW0xUX1BST0dfR0NKXSlkbmwKLUFDX0xBTkdfU0FWRQotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgSmF2YSB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9amF2YQotCi0jIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgSmF2YSB0ZXN0IHNvdXJjZXMuCi1vYmpleHQ9bwotX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0Ci0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCi1sdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImNsYXNzIGZvbyB7fSIKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKLWx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0ncHVibGljIGNsYXNzIGNvbmZ0ZXN0IHsgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW1tdXSBhcmd2KSB7fTsgfScKLQotIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgotX0xUX1RBR19DT01QSUxFUgotCi0jIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQotX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCi1fTFRfTElOS0VSX0JPSUxFUlBMQVRFCi0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1sdF9zYXZlX0NDPSIkQ0MiCi1sdF9zYXZlX0dDQz0kR0NDCi1HQ0M9eWVzCi1DQz0ke0dDSi0iZ2NqIn0KLWNvbXBpbGVyPSRDQwotX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQwotX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCi1fTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCi0KLSMgR0NKIGRpZCBub3QgZXhpc3QgYXQgdGhlIHRpbWUgR0NDIGRpZG4ndCBpbXBsaWNpdGx5IGxpbmsgbGliYyBpbi4KLV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotCi1fTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcwotX0xUX1RBR1ZBUihyZWxvYWRfZmxhZywgJDEpPSRyZWxvYWRfZmxhZwotX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSRyZWxvYWRfY21kcwotCi1pZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCi0gIF9MVF9DT01QSUxFUl9OT19SVFRJKCQxKQotICBfTFRfQ09NUElMRVJfUElDKCQxKQotICBfTFRfQ09NUElMRVJfQ19PKCQxKQotICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKLSAgX0xUX0xJTktFUl9TSExJQlMoJDEpCi0gIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKLQotICBfTFRfQ09ORklHKCQxKQotZmkKLQotQUNfTEFOR19SRVNUT1JFCi0KLUdDQz0kbHRfc2F2ZV9HQ0MKLUNDPSIkbHRfc2F2ZV9DQyIKLV0pIyBfTFRfTEFOR19HQ0pfQ09ORklHCi0KLQotIyBfTFRfTEFOR19SQ19DT05GSUcoW1RBR10pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciB0aGUgV2luZG93cyByZXNvdXJjZSBjb21waWxlcgotIyBhcmUgc3VpdGFibHkgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRwotIyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCi1tNF9kZWZ1bihbX0xUX0xBTkdfUkNfQ09ORklHXSwKLVtBQ19SRVFVSVJFKFtMVF9QUk9HX1JDXSlkbmwKLUFDX0xBTkdfU0FWRQotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgUkMgdGVzdCBzb3VyY2VzLgotYWNfZXh0PXJjCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBSQyB0ZXN0IHNvdXJjZXMuCi1vYmpleHQ9bwotX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0Ci0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCi1sdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9J3NhbXBsZSBNRU5VIHsgTUVOVUlURU0gIiZTb3VwIiwgMTAwLCBDSEVDS0VEIH0nCi0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCi1sdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiCi0KLSMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KLV9MVF9UQUdfQ09NUElMRVIKLQotIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKLV9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQotX0xUX0xJTktFUl9CT0lMRVJQTEFURQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotbHRfc2F2ZV9DQz0iJENDIgotbHRfc2F2ZV9HQ0M9JEdDQwotR0NDPQotQ0M9JHtSQy0id2luZHJlcyJ9Ci1jb21waWxlcj0kQ0MKLV9MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKLV9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKLV9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT15ZXMKLQotaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgotICA6Ci0gIF9MVF9DT05GSUcoJDEpCi1maQotCi1HQ0M9JGx0X3NhdmVfR0NDCi1BQ19MQU5HX1JFU1RPUkUKLUNDPSIkbHRfc2F2ZV9DQyIKLV0pIyBfTFRfTEFOR19SQ19DT05GSUcKLQotCi0jIExUX1BST0dfR0NKCi0jIC0tLS0tLS0tLS0tCi1BQ19ERUZVTihbTFRfUFJPR19HQ0pdLAotW200X2lmZGVmKFtBQ19QUk9HX0dDSl0sIFtBQ19QUk9HX0dDSl0sCi0gIFttNF9pZmRlZihbQV1bTV9QUk9HX0dDSl0sIFtBXVtNX1BST0dfR0NKXSwKLSAgICBbQUNfQ0hFQ0tfVE9PTChHQ0osIGdjaiwpCi0gICAgICB0ZXN0ICJ4JHtHQ0pGTEFHUytzZXR9IiA9IHhzZXQgfHwgR0NKRkxBR1M9Ii1nIC1PMiIKLSAgICAgIEFDX1NVQlNUKEdDSkZMQUdTKV0pXSlbXWRubAotXSkKLQotIyBPbGQgbmFtZToKLUFVX0FMSUFTKFtMVF9BQ19QUk9HX0dDSl0sIFtMVF9QUk9HX0dDSl0pCi1kbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6Ci1kbmwgQUNfREVGVU4oW0xUX0FDX1BST0dfR0NKXSwgW10pCi0KLQotIyBMVF9QUk9HX1JDCi0jIC0tLS0tLS0tLS0KLUFDX0RFRlVOKFtMVF9QUk9HX1JDXSwKLVtBQ19DSEVDS19UT09MKFJDLCB3aW5kcmVzLCkKLV0pCi0KLSMgT2xkIG5hbWU6Ci1BVV9BTElBUyhbTFRfQUNfUFJPR19SQ10sIFtMVF9QUk9HX1JDXSkKLWRubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKLWRubCBBQ19ERUZVTihbTFRfQUNfUFJPR19SQ10sIFtdKQotCi0KLSMgX0xUX0RFQ0xfRUdSRVAKLSMgLS0tLS0tLS0tLS0tLS0KLSMgSWYgd2UgZG9uJ3QgaGF2ZSBhIG5ldyBlbm91Z2ggQXV0b2NvbmYgdG8gY2hvb3NlIHRoZSBiZXN0IGdyZXAKLSMgYXZhaWxhYmxlLCBjaG9vc2UgdGhlIG9uZSBmaXJzdCBpbiB0aGUgdXNlcidzIFBBVEguCi1tNF9kZWZ1bihbX0xUX0RFQ0xfRUdSRVBdLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfRUdSRVBdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19GR1JFUF0pZG5sCi10ZXN0IC16ICIkR1JFUCIgJiYgR1JFUD1ncmVwCi1fTFRfREVDTChbXSwgW0dSRVBdLCBbMV0sIFtBIGdyZXAgcHJvZ3JhbSB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lc10pCi1fTFRfREVDTChbXSwgW0VHUkVQXSwgWzFdLCBbQW4gRVJFIG1hdGNoZXJdKQotX0xUX0RFQ0woW10sIFtGR1JFUF0sIFsxXSwgW0EgbGl0ZXJhbCBzdHJpbmcgbWF0Y2hlcl0pCi1kbmwgTm9uLWJsZWVkaW5nLWVkZ2UgYXV0b2NvbmYgZG9lc24ndCBzdWJzdCBHUkVQLCBzbyBkbyBpdCBoZXJlIHRvbwotQUNfU1VCU1QoW0dSRVBdKQotXSkKLQotCi0jIF9MVF9ERUNMX09CSkRVTVAKLSMgLS0tLS0tLS0tLS0tLS0KLSMgSWYgd2UgZG9uJ3QgaGF2ZSBhIG5ldyBlbm91Z2ggQXV0b2NvbmYgdG8gY2hvb3NlIHRoZSBiZXN0IG9iamR1bXAKLSMgYXZhaWxhYmxlLCBjaG9vc2UgdGhlIG9uZSBmaXJzdCBpbiB0aGUgdXNlcidzIFBBVEguCi1tNF9kZWZ1bihbX0xUX0RFQ0xfT0JKRFVNUF0sCi1bQUNfQ0hFQ0tfVE9PTChPQkpEVU1QLCBvYmpkdW1wLCBmYWxzZSkKLXRlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKLV9MVF9ERUNMKFtdLCBbT0JKRFVNUF0sIFsxXSwgW0FuIG9iamVjdCBzeW1ib2wgZHVtcGVyXSkKLUFDX1NVQlNUKFtPQkpEVU1QXSkKLV0pCi0KLQotIyBfTFRfREVDTF9TRUQKLSMgLS0tLS0tLS0tLS0tCi0jIENoZWNrIGZvciBhIGZ1bGx5LWZ1bmN0aW9uYWwgc2VkIHByb2dyYW0sIHRoYXQgdHJ1bmNhdGVzCi0jIGFzIGZldyBjaGFyYWN0ZXJzIGFzIHBvc3NpYmxlLiAgUHJlZmVyIEdOVSBzZWQgaWYgZm91bmQuCi1tNF9kZWZ1bihbX0xUX0RFQ0xfU0VEXSwKLVtBQ19QUk9HX1NFRAotdGVzdCAteiAiJFNFRCIgJiYgU0VEPXNlZAotWHNlZD0iJFNFRCAtZSAxcy9eWC8vIgotX0xUX0RFQ0woW10sIFtTRURdLCBbMV0sIFtBIHNlZCBwcm9ncmFtIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0XSkKLV9MVF9ERUNMKFtdLCBbWHNlZF0sIFsiXCRTRUQgLWUgMXMvXlgvLyJdLAotICAgIFtTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbl0pCi1dKSMgX0xUX0RFQ0xfU0VECi0KLW00X2lmbmRlZihbQUNfUFJPR19TRURdLCBbCi0jIE5PVEU6IFRoaXMgbWFjcm8gaGFzIGJlZW4gc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW50byAgICMKLSMgIEdOVSBBdXRvY29uZiBhcyBBQ19QUk9HX1NFRC4gIFdoZW4gaXQgaXMgYXZhaWxhYmxlIGluICAgIwotIyAgYSByZWxlYXNlZCB2ZXJzaW9uIG9mIEF1dG9jb25mIHdlIHNob3VsZCByZW1vdmUgdGhpcyAgICAjCi0jICBtYWNybyBhbmQgdXNlIGl0IGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLQotbTRfZGVmdW4oW0FDX1BST0dfU0VEXSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dF0pCi1BQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9TRUQsCi1bIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBzZWQgYW5kIGdzZWQuCi0jIFRoZW4gdXNlIHRoYXQgbGlzdCBvZiBzZWQncyBhcyBvbmVzIHRvIHRlc3QgZm9yIHRydW5jYXRpb24uCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBsdF9hY19wcm9nIGluIHNlZCBnc2VkOyBkbwotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICAgICAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KLSAgICAgICAgbHRfYWNfc2VkX2xpc3Q9IiRsdF9hY19zZWRfbGlzdCAkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgICAgZmkKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLWx0X2FjX21heD0wCi1sdF9hY19jb3VudD0wCi0jIEFkZCAvdXNyL3hwZzQvYmluL3NlZCBhcyBpdCBpcyB0eXBpY2FsbHkgZm91bmQgb24gU29sYXJpcwotIyBhbG9uZyB3aXRoIC9iaW4vc2VkIHRoYXQgdHJ1bmNhdGVzIG91dHB1dC4KLWZvciBsdF9hY19zZWQgaW4gJGx0X2FjX3NlZF9saXN0IC91c3IveHBnNC9iaW4vc2VkOyBkbwotICB0ZXN0ICEgLWYgJGx0X2FjX3NlZCAmJiBjb250aW51ZQotICBjYXQgL2Rldi9udWxsID4gY29uZnRlc3QuaW4KLSAgbHRfYWNfY291bnQ9MAotICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+Y29uZnRlc3QuaW4KLSAgIyBDaGVjayBmb3IgR05VIHNlZCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgotICBpZiAiJGx0X2FjX3NlZCIgLS12ZXJzaW9uIDI+JjEgPCAvZGV2L251bGwgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAotICAgIGJyZWFrCi0gIGZpCi0gIHdoaWxlIHRydWU7IGRvCi0gICAgY2F0IGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LmluID5jb25mdGVzdC50bXAKLSAgICBtdiBjb25mdGVzdC50bXAgY29uZnRlc3QuaW4KLSAgICBjcCBjb25mdGVzdC5pbiBjb25mdGVzdC5ubAotICAgIGVjaG8gPj5jb25mdGVzdC5ubAotICAgICRsdF9hY19zZWQgLWUgJ3MvYSQvLycgPCBjb25mdGVzdC5ubCA+Y29uZnRlc3Qub3V0IHx8IGJyZWFrCi0gICAgY21wIC1zIGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5ubCB8fCBicmVhawotICAgICMgMTAwMDAgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAotICAgIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAxMCAmJiBicmVhawotICAgIGx0X2FjX2NvdW50PWBleHByICRsdF9hY19jb3VudCArIDFgCi0gICAgaWYgdGVzdCAkbHRfYWNfY291bnQgLWd0ICRsdF9hY19tYXg7IHRoZW4KLSAgICAgIGx0X2FjX21heD0kbHRfYWNfY291bnQKLSAgICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKLSAgICBmaQotICBkb25lCi1kb25lCi1dKQotU0VEPSRsdF9jdl9wYXRoX1NFRAotQUNfU1VCU1QoW1NFRF0pCi1BQ19NU0dfUkVTVUxUKFskU0VEXSkKLV0pI0FDX1BST0dfU0VECi1dKSNtNF9pZm5kZWYKLQotIyBPbGQgbmFtZToKLUFVX0FMSUFTKFtMVF9BQ19QUk9HX1NFRF0sIFtBQ19QUk9HX1NFRF0pCi1kbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6Ci1kbmwgQUNfREVGVU4oW0xUX0FDX1BST0dfU0VEXSwgW10pCi0KLQotIyBfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEZpbmQgb3V0IHdoZXRoZXIgdGhlIHNoZWxsIGlzIEJvdXJuZSBvciBYU0kgY29tcGF0aWJsZSwKLSMgb3IgaGFzIHNvbWUgb3RoZXIgdXNlZnVsIGZlYXR1cmVzLgotbTRfZGVmdW4oW19MVF9DSEVDS19TSEVMTF9GRUFUVVJFU10sCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBzb21lIFhTSSBjb25zdHJ1Y3RzXSkKLSMgVHJ5IHNvbWUgWFNJIGZlYXR1cmVzCi14c2lfc2hlbGw9bm8KLSggX2x0X2R1bW15PSJhL2IvYyIKLSAgdGVzdCAiJHtfbHRfZHVtbXkjIyovfSwke19sdF9kdW1teSUvKn0sIiR7X2x0X2R1bW15JSIkX2x0X2R1bW15In0sIFwKLSAgICAgID0gYyxhL2IsLCBcCi0gICAgJiYgZXZhbCAndGVzdCAkKCggMSArIDEgKSkgLWVxIDIgXAotICAgICYmIHRlc3QgIiR7I19sdF9kdW1teX0iIC1lcSA1JyApID4vZGV2L251bGwgMj4mMSBcCi0gICYmIHhzaV9zaGVsbD15ZXMKLUFDX01TR19SRVNVTFQoWyR4c2lfc2hlbGxdKQotX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW3hzaV9zaGVsbD0nJHhzaV9zaGVsbCddKQotCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzICIrPSJdKQotbHRfc2hlbGxfYXBwZW5kPW5vCi0oIGZvbz1iYXI7IHNldCBmb28gYmF6OyBldmFsICIkWzFdKz1cJFsyXSIgJiYgdGVzdCAiJGZvbyIgPSBiYXJiYXogKSBcCi0gICAgPi9kZXYvbnVsbCAyPiYxIFwKLSAgJiYgbHRfc2hlbGxfYXBwZW5kPXllcwotQUNfTVNHX1JFU1VMVChbJGx0X3NoZWxsX2FwcGVuZF0pCi1fTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbbHRfc2hlbGxfYXBwZW5kPSckbHRfc2hlbGxfYXBwZW5kJ10pCi0KLWlmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBsdF91bnNldD11bnNldAotZWxzZQotICBsdF91bnNldD1mYWxzZQotZmkKLV9MVF9ERUNMKFtdLCBbbHRfdW5zZXRdLCBbMF0sIFt3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyAidW5zZXQiXSlkbmwKLQotIyB0ZXN0IEVCQ0RJQyBvciBBU0NJSQotY2FzZSBgZWNobyBYfHRyIFggJ1wxMDEnYCBpbgotIEEpICMgQVNDSUkgYmFzZWQgc3lzdGVtCi0gICAgIyBcbiBpcyBub3QgaW50ZXJwcmV0ZWQgY29ycmVjdGx5IGJ5IFNvbGFyaXMgOCAvdXNyL3VjYi90cgotICBsdF9TUDJOTD0ndHIgXDA0MCBcMDEyJwotICBsdF9OTDJTUD0ndHIgXDAxNVwwMTIgXDA0MFwwNDAnCi0gIDs7Ci0gKikgIyBFQkNESUMgYmFzZWQgc3lzdGVtCi0gIGx0X1NQMk5MPSd0ciBcMTAwIFxuJwotICBsdF9OTDJTUD0ndHIgXHJcbiBcMTAwXDEwMCcKLSAgOzsKLWVzYWMKLV9MVF9ERUNMKFtTUDJOTF0sIFtsdF9TUDJOTF0sIFsxXSwgW3R1cm4gc3BhY2VzIGludG8gbmV3bGluZXNdKWRubAotX0xUX0RFQ0woW05MMlNQXSwgW2x0X05MMlNQXSwgWzFdLCBbdHVybiBuZXdsaW5lcyBpbnRvIHNwYWNlc10pZG5sCi1dKSMgX0xUX0NIRUNLX1NIRUxMX0ZFQVRVUkVTCi0KLQotIyBfTFRfUFJPR19YU0lfU0hFTExGTlMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEJvdXJuZSBhbmQgWFNJIGNvbXBhdGlibGUgdmFyaWFudHMgb2Ygc29tZSB1c2VmdWwgc2hlbGwgZnVuY3Rpb25zLgotbTRfZGVmdW4oW19MVF9QUk9HX1hTSV9TSEVMTEZOU10sCi1bY2FzZSAkeHNpX3NoZWxsIGluCi0gIHllcykKLSAgICBjYXQgPDwgXF9MVF9FT0YgPj4gIiRjZmdmaWxlIgotCi0jIGZ1bmNfZGlybmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKLSMgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwKLSMgb3RoZXJ3aXNlIHNldCByZXN1bHQgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgotZnVuY19kaXJuYW1lICgpCi17Ci0gIGNhc2UgJHsxfSBpbgotICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7Ci0gICAgKiAgKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IiA7OwotICBlc2FjCi19Ci0KLSMgZnVuY19iYXNlbmFtZSBmaWxlCi1mdW5jX2Jhc2VuYW1lICgpCi17Ci0gIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PSIkezEjIyovfSIKLX0KLQotIyBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lIGZpbGUgYXBwZW5kIG5vbmRpcl9yZXBsYWNlbWVudAotIyBwZXJmb3JtIGZ1bmNfYmFzZW5hbWUgYW5kIGZ1bmNfZGlybmFtZSBpbiBhIHNpbmdsZSBmdW5jdGlvbgotIyBjYWxsOgotIyAgIGRpcm5hbWU6ICBDb21wdXRlIHRoZSBkaXJuYW1lIG9mIEZJTEUuICBJZiBub25lbXB0eSwKLSMgICAgICAgICAgICAgYWRkIEFQUEVORCB0byB0aGUgcmVzdWx0LCBvdGhlcndpc2Ugc2V0IHJlc3VsdAotIyAgICAgICAgICAgICB0byBOT05ESVJfUkVQTEFDRU1FTlQuCi0jICAgICAgICAgICAgIHZhbHVlIHJldHVybmVkIGluICIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLSMgICBiYXNlbmFtZTogQ29tcHV0ZSBmaWxlbmFtZSBvZiBGSUxFLgotIyAgICAgICAgICAgICB2YWx1ZSByZXR1bmVkIGluICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0jIEltcGxlbWVudGF0aW9uIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCBmdW5jX2Rpcm5hbWUKLSMgYW5kIGZ1bmNfYmFzZW5hbWUuIEZvciBlZmZpY2llbmN5LCB3ZSBkbyBub3QgZGVsZWdhdGUgdG8KLSMgdGhvc2UgZnVuY3Rpb25zIGJ1dCBpbnN0ZWFkIGR1cGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBoZXJlLgotZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAoKQotewotICBjYXNlICR7MX0gaW4KLSAgICAqLyopIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7MSUvKn0kezJ9IiA7OwotICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOzsKLSAgZXNhYwotICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD0iJHsxIyMqL30iCi19Ci0KLSMgZnVuY19zdHJpcG5hbWUgcHJlZml4IHN1ZmZpeCBuYW1lCi0jIHN0cmlwIFBSRUZJWCBhbmQgU1VGRklYIG9mZiBvZiBOQU1FLgotIyBQUkVGSVggYW5kIFNVRkZJWCBtdXN0IG5vdCBjb250YWluIGdsb2JiaW5nIG9yIHJlZ2V4IHNwZWNpYWwKLSMgY2hhcmFjdGVycywgaGFzaGVzLCBwZXJjZW50IHNpZ25zLCBidXQgU1VGRklYIG1heSBjb250YWluIGEgbGVhZGluZwotIyBkb3QgKGluIHdoaWNoIGNhc2UgdGhhdCBtYXRjaGVzIG9ubHkgYSBkb3QpLgotZnVuY19zdHJpcG5hbWUgKCkKLXsKLSAgIyBwZGtzaCA1LjIuMTQgZG9lcyBub3QgZG8gJHtYJSRZfSBjb3JyZWN0bHkgaWYgYm90aCBYIGFuZCBZIGFyZQotICAjIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgc28gYXNzaWduIG9uZSB0byBvcmRpbmFyeSBwYXJhbWV0ZXIgZmlyc3QuCi0gIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0kezN9Ci0gIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCMiJHsxfSJ9Ci0gIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCUiJHsyfSJ9Ci19Ci0KLSMgZnVuY19vcHRfc3BsaXQKLWZ1bmNfb3B0X3NwbGl0ICgpCi17Ci0gIGZ1bmNfb3B0X3NwbGl0X29wdD0kezElJT0qfQotICBmdW5jX29wdF9zcGxpdF9hcmc9JHsxIyo9fQotfQotCi0jIGZ1bmNfbG8ybyBvYmplY3QKLWZ1bmNfbG8ybyAoKQotewotICBjYXNlICR7MX0gaW4KLSAgICAqLmxvKSBmdW5jX2xvMm9fcmVzdWx0PSR7MSUubG99LiR7b2JqZXh0fSA7OwotICAgICopICAgIGZ1bmNfbG8yb19yZXN1bHQ9JHsxfSA7OwotICBlc2FjCi19Ci0KLSMgZnVuY194Zm9ybSBsaWJvYmotb3Itc291cmNlCi1mdW5jX3hmb3JtICgpCi17Ci0gIGZ1bmNfeGZvcm1fcmVzdWx0PSR7MSUuKn0ubG8KLX0KLQotIyBmdW5jX2FyaXRoIGFyaXRobWV0aWMtdGVybS4uLgotZnVuY19hcml0aCAoKQotewotICBmdW5jX2FyaXRoX3Jlc3VsdD0kKCggJFsqXSApKQotfQotCi0jIGZ1bmNfbGVuIHN0cmluZwotIyBTVFJJTkcgbWF5IG5vdCBzdGFydCB3aXRoIGEgaHlwaGVuLgotZnVuY19sZW4gKCkKLXsKLSAgZnVuY19sZW5fcmVzdWx0PSR7IzF9Ci19Ci0KLV9MVF9FT0YKLSAgICA7OwotICAqKSAjIEJvdXJuZSBjb21wYXRpYmxlIGZ1bmN0aW9ucy4KLSAgICBjYXQgPDwgXF9MVF9FT0YgPj4gIiRjZmdmaWxlIgotCi0jIGZ1bmNfZGlybmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKLSMgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwKLSMgb3RoZXJ3aXNlIHNldCByZXN1bHQgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgotZnVuY19kaXJuYW1lICgpCi17Ci0gICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCi0gIGZ1bmNfZGlybmFtZV9yZXN1bHQ9YCRFQ0hPICIkezF9IiB8ICRTRUQgIiRkaXJuYW1lImAKLSAgaWYgdGVzdCAiWCRmdW5jX2Rpcm5hbWVfcmVzdWx0IiA9ICJYJHsxfSI7IHRoZW4KLSAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IgotICBlbHNlCi0gICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJGZ1bmNfZGlybmFtZV9yZXN1bHQkezJ9IgotICBmaQotfQotCi0jIGZ1bmNfYmFzZW5hbWUgZmlsZQotZnVuY19iYXNlbmFtZSAoKQotewotICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAiJGJhc2VuYW1lImAKLX0KLQotZG5sIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUKLWRubCBBIHBvcnRhYmxlIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gZ2VuZXJhbC5tNHNoCi1kbmwgc28gdGhlcmUgaXMgbm8gbmVlZCBmb3IgaXQgaGVyZS4KLQotIyBmdW5jX3N0cmlwbmFtZSBwcmVmaXggc3VmZml4IG5hbWUKLSMgc3RyaXAgUFJFRklYIGFuZCBTVUZGSVggb2ZmIG9mIE5BTUUuCi0jIFBSRUZJWCBhbmQgU1VGRklYIG11c3Qgbm90IGNvbnRhaW4gZ2xvYmJpbmcgb3IgcmVnZXggc3BlY2lhbAotIyBjaGFyYWN0ZXJzLCBoYXNoZXMsIHBlcmNlbnQgc2lnbnMsIGJ1dCBTVUZGSVggbWF5IGNvbnRhaW4gYSBsZWFkaW5nCi0jIGRvdCAoaW4gd2hpY2ggY2FzZSB0aGF0IG1hdGNoZXMgb25seSBhIGRvdCkuCi0jIGZ1bmNfc3RyaXBfc3VmZml4IHByZWZpeCBuYW1lCi1mdW5jX3N0cmlwbmFtZSAoKQotewotICBjYXNlICR7Mn0gaW4KLSAgICAuKikgZnVuY19zdHJpcG5hbWVfcmVzdWx0PWAkRUNITyAiJHszfSIgfCAkU0VEICJzJV4kezF9JSU7IHMlXFxcXCR7Mn1cJCUlImA7OwotICAgICopICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezN9IiB8ICRTRUQgInMlXiR7MX0lJTsgcyUkezJ9XCQlJSJgOzsKLSAgZXNhYwotfQotCi0jIHNlZCBzY3JpcHRzOgotbXlfc2VkX2xvbmdfb3B0PScxcy9eXCgtW1tePV1dKlwpPS4qL1wxLztxJwotbXlfc2VkX2xvbmdfYXJnPScxcy9eLVtbXj1dXSo9Ly8nCi0KLSMgZnVuY19vcHRfc3BsaXQKLWZ1bmNfb3B0X3NwbGl0ICgpCi17Ci0gIGZ1bmNfb3B0X3NwbGl0X29wdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAiJG15X3NlZF9sb25nX29wdCJgCi0gIGZ1bmNfb3B0X3NwbGl0X2FyZz1gJEVDSE8gIiR7MX0iIHwgJFNFRCAiJG15X3NlZF9sb25nX2FyZyJgCi19Ci0KLSMgZnVuY19sbzJvIG9iamVjdAotZnVuY19sbzJvICgpCi17Ci0gIGZ1bmNfbG8yb19yZXN1bHQ9YCRFQ0hPICIkezF9IiB8ICRTRUQgIiRsbzJvImAKLX0KLQotIyBmdW5jX3hmb3JtIGxpYm9iai1vci1zb3VyY2UKLWZ1bmNfeGZvcm0gKCkKLXsKLSAgZnVuY194Zm9ybV9yZXN1bHQ9YCRFQ0hPICIkezF9IiB8ICRTRUQgJ3MvXC5bW14uXV0qJC8ubG8vJ2AKLX0KLQotIyBmdW5jX2FyaXRoIGFyaXRobWV0aWMtdGVybS4uLgotZnVuY19hcml0aCAoKQotewotICBmdW5jX2FyaXRoX3Jlc3VsdD1gZXhwciAiJFtAXSJgCi19Ci0KLSMgZnVuY19sZW4gc3RyaW5nCi0jIFNUUklORyBtYXkgbm90IHN0YXJ0IHdpdGggYSBoeXBoZW4uCi1mdW5jX2xlbiAoKQotewotICBmdW5jX2xlbl9yZXN1bHQ9YGV4cHIgIiRbMV0iIDogIi4qIiAyPi9kZXYvbnVsbCB8fCBlY2hvICRtYXhfY21kX2xlbmAKLX0KLQotX0xUX0VPRgotZXNhYwotCi1jYXNlICRsdF9zaGVsbF9hcHBlbmQgaW4KLSAgeWVzKQotICAgIGNhdCA8PCBcX0xUX0VPRiA+PiAiJGNmZ2ZpbGUiCi0KLSMgZnVuY19hcHBlbmQgdmFyIHZhbHVlCi0jIEFwcGVuZCBWQUxVRSB0byB0aGUgZW5kIG9mIHNoZWxsIHZhcmlhYmxlIFZBUi4KLWZ1bmNfYXBwZW5kICgpCi17Ci0gIGV2YWwgIiRbMV0rPVwkWzJdIgotfQotX0xUX0VPRgotICAgIDs7Ci0gICopCi0gICAgY2F0IDw8IFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKLQotIyBmdW5jX2FwcGVuZCB2YXIgdmFsdWUKLSMgQXBwZW5kIFZBTFVFIHRvIHRoZSBlbmQgb2Ygc2hlbGwgdmFyaWFibGUgVkFSLgotZnVuY19hcHBlbmQgKCkKLXsKLSAgZXZhbCAiJFsxXT1cJCRbMV1cJFsyXSIKLX0KLQotX0xUX0VPRgotICAgIDs7Ci0gIGVzYWMKLV0pCi0KLSMgSGVscGVyIGZ1bmN0aW9ucyBmb3Igb3B0aW9uIGhhbmRsaW5nLiAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotIwotIyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNywgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0jICAgSW5jLgotIyAgIFdyaXR0ZW4gYnkgR2FyeSBWLiBWYXVnaGFuLCAyMDA0Ci0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCi0jIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgNyBsdG9wdGlvbnMubTQKLQotIyBUaGlzIGlzIHRvIGhlbHAgYWNsb2NhbCBmaW5kIHRoZXNlIG1hY3JvcywgYXMgaXQgY2FuJ3Qgc2VlIG00X2RlZmluZS4KLUFDX0RFRlVOKFtMVE9QVElPTlNfVkVSU0lPTl0sIFttNF9pZihbMV0pXSkKLQotCi0jIF9MVF9NQU5HTEVfT1BUSU9OKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZmluZShbX0xUX01BTkdMRV9PUFRJT05dLAotW1tfTFRfT1BUSU9OX11tNF9icGF0c3Vic3QoJDFfXyQyLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQotCi0KLSMgX0xUX1NFVF9PUFRJT04oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTZXQgb3B0aW9uIE9QVElPTi1OQU1FIGZvciBtYWNybyBNQUNSTy1OQU1FLCBhbmQgaWYgdGhlcmUgaXMgYQotIyBtYXRjaGluZyBoYW5kbGVyIGRlZmluZWQsIGRpc3BhdGNoIHRvIGl0LiAgT3RoZXIgT1BUSU9OLU5BTUVzIGFyZQotIyBzYXZlZCBhcyBhIGZsYWcuCi1tNF9kZWZpbmUoW19MVF9TRVRfT1BUSU9OXSwKLVttNF9kZWZpbmUoX0xUX01BTkdMRV9PUFRJT04oWyQxXSwgWyQyXSkpZG5sCi1tNF9pZmRlZihfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLAotICAgICAgICBfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLAotICAgIFttNF93YXJuaW5nKFtVbmtub3duICQxIG9wdGlvbiBgJDInXSldKVtdZG5sCi1dKQotCi0KLSMgX0xUX0lGX09QVElPTihNQUNSTy1OQU1FLCBPUFRJT04tTkFNRSwgSUYtU0VULCBbSUYtTk9ULVNFVF0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KLW00X2RlZmluZShbX0xUX0lGX09QVElPTl0sCi1bbTRfaWZkZWYoX0xUX01BTkdMRV9PUFRJT04oWyQxXSwgWyQyXSksIFskM10sIFskNF0pXSkKLQotCi0jIF9MVF9VTkxFU1NfT1BUSU9OUyhNQUNSTy1OQU1FLCBPUFRJT04tTElTVCwgSUYtTk9ULVNFVCkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFeGVjdXRlIElGLU5PVC1TRVQgdW5sZXNzIGFsbCBvcHRpb25zIGluIE9QVElPTi1MSVNUIGZvciBNQUNSTy1OQU1FCi0jIGFyZSBzZXQuCi1tNF9kZWZpbmUoW19MVF9VTkxFU1NfT1BUSU9OU10sCi1bbTRfZm9yZWFjaChbX0xUX09wdGlvbl0sIG00X3NwbGl0KG00X25vcm1hbGl6ZShbJDJdKSksCi0JICAgIFttNF9pZmRlZihfTFRfTUFOR0xFX09QVElPTihbJDFdLCBfTFRfT3B0aW9uKSwKLQkJICAgICAgW200X2RlZmluZShbJDBfZm91bmRdKV0pXSlbXWRubAotbTRfaWZkZWYoWyQwX2ZvdW5kXSwgW200X3VuZGVmaW5lKFskMF9mb3VuZF0pXSwgWyQzCi1dKVtdZG5sCi1dKQotCi0KLSMgX0xUX1NFVF9PUFRJT05TKE1BQ1JPLU5BTUUsIE9QVElPTi1MSVNUKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE9QVElPTi1MSVNUIGlzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgTGlidG9vbCBvcHRpb25zIGFzc29jaWF0ZWQKLSMgd2l0aCBNQUNSTy1OQU1FLiAgSWYgYW55IE9QVElPTiBoYXMgYSBtYXRjaGluZyBoYW5kbGVyIGRlY2xhcmVkIHdpdGgKLSMgTFRfT1BUSU9OX0RFRklORSwgZGlzcGF0Y2ggdG8gdGhhdCBtYWNybzsgb3RoZXJ3aXNlIGNvbXBsYWluIGFib3V0Ci0jIHRoZSB1bmtub3duIG9wdGlvbiBhbmQgZXhpdC4KLW00X2RlZnVuKFtfTFRfU0VUX09QVElPTlNdLAotWyMgU2V0IG9wdGlvbnMKLW00X2ZvcmVhY2goW19MVF9PcHRpb25dLCBtNF9zcGxpdChtNF9ub3JtYWxpemUoWyQyXSkpLAotICAgIFtfTFRfU0VUX09QVElPTihbJDFdLCBfTFRfT3B0aW9uKV0pCi0KLW00X2lmKFskMV0sW0xUX0lOSVRdLFsKLSAgZG5sCi0gIGRubCBTaW1wbHkgc2V0IHNvbWUgZGVmYXVsdCB2YWx1ZXMgKGkuZSBvZmYpIGlmIGJvb2xlYW4gb3B0aW9ucyB3ZXJlIG5vdAotICBkbmwgc3BlY2lmaWVkOgotICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbZGxvcGVuXSwgW2VuYWJsZV9kbG9wZW49bm8KLSAgXSkKLSAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3dpbjMyLWRsbF0sIFtlbmFibGVfd2luMzJfZGxsPW5vCi0gIF0pCi0gIGRubAotICBkbmwgSWYgbm8gcmVmZXJlbmNlIHdhcyBtYWRlIHRvIHZhcmlvdXMgcGFpcnMgb2Ygb3Bwb3Npbmcgb3B0aW9ucywgdGhlbgotICBkbmwgd2UgcnVuIHRoZSBkZWZhdWx0IG1vZGUgaGFuZGxlciBmb3IgdGhlIHBhaXIuICBGb3IgZXhhbXBsZSwgaWYgbmVpdGhlcgotICBkbmwgYHNoYXJlZCcgbm9yIGBkaXNhYmxlLXNoYXJlZCcgd2FzIHBhc3NlZCwgd2UgZW5hYmxlIGJ1aWxkaW5nIG9mIHNoYXJlZAotICBkbmwgYXJjaGl2ZXMgYnkgZGVmYXVsdDoKLSAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3NoYXJlZCBkaXNhYmxlLXNoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRF0pCi0gIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtzdGF0aWMgZGlzYWJsZS1zdGF0aWNdLCBbX0xUX0VOQUJMRV9TVEFUSUNdKQotICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbcGljLW9ubHkgbm8tcGljXSwgW19MVF9XSVRIX1BJQ10pCi0gIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtmYXN0LWluc3RhbGwgZGlzYWJsZS1mYXN0LWluc3RhbGxdLAotICAJCSAgIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pCi0gIF0pCi1dKSMgX0xUX1NFVF9PUFRJT05TCi0KLQotCi0jIF9MVF9NQU5HTEVfREVGVU4oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1tNF9kZWZpbmUoW19MVF9NQU5HTEVfREVGVU5dLAotW1tfTFRfT1BUSU9OX0RFRlVOX11tNF9icGF0c3Vic3QobTRfdG91cHBlcihbJDFfXyQyXSksIFtbXkEtWjAtOV9dXSwgW19dKV0pCi0KLQotIyBMVF9PUFRJT05fREVGSU5FKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FLCBDT0RFKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmaW5lKFtMVF9PUFRJT05fREVGSU5FXSwKLVttNF9kZWZpbmUoX0xUX01BTkdMRV9ERUZVTihbJDFdLCBbJDJdKSwgWyQzXSlbXWRubAotXSkjIExUX09QVElPTl9ERUZJTkUKLQotCi0jIGRsb3BlbgotIyAtLS0tLS0KLUxUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGxvcGVuXSwgW2VuYWJsZV9kbG9wZW49eWVzCi1dKQotCi1BVV9ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5dLAotW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rsb3Blbl0pCi1BQ19ESUFHTk9TRShbb2Jzb2xldGVdLAotWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQotcHV0IHRoZSBgZGxvcGVuJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCi1dKQotCi1kbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6Ci1kbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOXSwgW10pCi0KLQotIyB3aW4zMi1kbGwKLSMgLS0tLS0tLS0tCi0jIERlY2xhcmUgcGFja2FnZSBzdXBwb3J0IGZvciBidWlsZGluZyB3aW4zMiBkbGwncy4KLUxUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbd2luMzItZGxsXSwKLVtlbmFibGVfd2luMzJfZGxsPXllcwotCi1jYXNlICRob3N0IGluCi0qLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotY2VnY2MqKQotICBBQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCi0gIEFDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCi0gIEFDX0NIRUNLX1RPT0woT0JKRFVNUCwgb2JqZHVtcCwgZmFsc2UpCi0gIDs7Ci1lc2FjCi0KLXRlc3QgLXogIiRBUyIgJiYgQVM9YXMKLV9MVF9ERUNMKFtdLCBbQVNdLCAgICAgIFsxXSwgW0Fzc2VtYmxlciBwcm9ncmFtXSlkbmwKLQotdGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAotX0xUX0RFQ0woW10sIFtETExUT09MXSwgWzFdLCBbRExMIGNyZWF0aW9uIHByb2dyYW1dKWRubAotCi10ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCi1fTFRfREVDTChbXSwgW09CSkRVTVBdLCBbMV0sIFtPYmplY3QgZHVtcGVyIHByb2dyYW1dKWRubAotXSkjIHdpbjMyLWRsbAotCi1BVV9ERUZVTihbQUNfTElCVE9PTF9XSU4zMl9ETExdLAotW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLV9MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW3dpbjMyLWRsbF0pCi1BQ19ESUFHTk9TRShbb2Jzb2xldGVdLAotWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQotcHV0IHRoZSBgd2luMzItZGxsJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCi1dKQotCi1kbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6Ci1kbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwgW10pCi0KLQotIyBfTFRfRU5BQkxFX1NIQVJFRChbREVGQVVMVF0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZywgYW5kIHN1cHBvcnRzIHRoZSBgc2hhcmVkJyBhbmQKLSMgYGRpc2FibGUtc2hhcmVkJyBMVF9JTklUIG9wdGlvbnMuCi0jIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KLW00X2RlZmluZShbX0xUX0VOQUJMRV9TSEFSRURdLAotW200X2RlZmluZShbX0xUX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIFttNF9pZigkMSwgbm8sIG5vLCB5ZXMpXSlkbmwKLUFDX0FSR19FTkFCTEUoW3NoYXJlZF0sCi0gICAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zaGFyZWRAPDpAPVBLR1NAOj5AXSwKLQlbYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBAPDpAZGVmYXVsdD1dX0xUX0VOQUJMRV9TSEFSRURfREVGQVVMVFtAOj5AXSldLAotICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQotICAgIGNhc2UgJGVuYWJsZXZhbCBpbgotICAgIHllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLSAgICBubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotICAgICopCi0gICAgICBlbmFibGVfc2hhcmVkPW5vCi0gICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKLSAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLQlJRlM9IiRsdF9zYXZlX2lmcyIKLQlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotCSAgZW5hYmxlX3NoYXJlZD15ZXMKLQlmaQotICAgICAgZG9uZQotICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgICA7OwotICAgIGVzYWNdLAotICAgIFtlbmFibGVfc2hhcmVkPV1fTFRfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKQotCi0gICAgX0xUX0RFQ0woW2J1aWxkX2xpYnRvb2xfbGlic10sIFtlbmFibGVfc2hhcmVkXSwgWzBdLAotCVtXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKLV0pIyBfTFRfRU5BQkxFX1NIQVJFRAotCi1MVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW3NoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRChbeWVzXSldKQotTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkaXNhYmxlLXNoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRChbbm9dKV0pCi0KLSMgT2xkIG5hbWVzOgotQUNfREVGVU4oW0FDX0VOQUJMRV9TSEFSRURdLAotW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgbTRfaWYoWyQxXSwgW25vXSwgW2Rpc2FibGUtXSlbc2hhcmVkXSkKLV0pCi0KLUFDX0RFRlVOKFtBQ19ESVNBQkxFX1NIQVJFRF0sCi1bX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGlzYWJsZS1zaGFyZWRdKQotXSkKLQotQVVfREVGVU4oW0FNX0VOQUJMRV9TSEFSRURdLCBbQUNfRU5BQkxFX1NIQVJFRCgkQCldKQotQVVfREVGVU4oW0FNX0RJU0FCTEVfU0hBUkVEXSwgW0FDX0RJU0FCTEVfU0hBUkVEKCRAKV0pCi0KLWRubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKLWRubCBBQ19ERUZVTihbQU1fRU5BQkxFX1NIQVJFRF0sIFtdKQotZG5sIEFDX0RFRlVOKFtBTV9ESVNBQkxFX1NIQVJFRF0sIFtdKQotCi0KLQotIyBfTFRfRU5BQkxFX1NUQVRJQyhbREVGQVVMVF0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZywgYW5kIHN1cHBvcnQgdGhlIGBzdGF0aWMnIGFuZAotIyBgZGlzYWJsZS1zdGF0aWMnIExUX0lOSVQgb3B0aW9ucy4KLSMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgotbTRfZGVmaW5lKFtfTFRfRU5BQkxFX1NUQVRJQ10sCi1bbTRfZGVmaW5lKFtfTFRfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgW200X2lmKCQxLCBubywgbm8sIHllcyldKWRubAotQUNfQVJHX0VOQUJMRShbc3RhdGljXSwKLSAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXN0YXRpY0A8OkA9UEtHU0A6PkBdLAotCVtidWlsZCBzdGF0aWMgbGlicmFyaWVzIEA8OkBkZWZhdWx0PV1fTFRfRU5BQkxFX1NUQVRJQ19ERUZBVUxUW0A6PkBdKV0sCi0gICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci0gICAgY2FzZSAkZW5hYmxldmFsIGluCi0gICAgeWVzKSBlbmFibGVfc3RhdGljPXllcyA7OwotICAgIG5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0gICAgKikKLSAgICAgZW5hYmxlX3N0YXRpYz1ubwotICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCi0gICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0JSUZTPSIkbHRfc2F2ZV9pZnMiCi0JaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLQkgIGVuYWJsZV9zdGF0aWM9eWVzCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgICAgOzsKLSAgICBlc2FjXSwKLSAgICBbZW5hYmxlX3N0YXRpYz1dX0xUX0VOQUJMRV9TVEFUSUNfREVGQVVMVCkKLQotICAgIF9MVF9ERUNMKFtidWlsZF9vbGRfbGlic10sIFtlbmFibGVfc3RhdGljXSwgWzBdLAotCVtXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKLV0pIyBfTFRfRU5BQkxFX1NUQVRJQwotCi1MVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW3N0YXRpY10sIFtfTFRfRU5BQkxFX1NUQVRJQyhbeWVzXSldKQotTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkaXNhYmxlLXN0YXRpY10sIFtfTFRfRU5BQkxFX1NUQVRJQyhbbm9dKV0pCi0KLSMgT2xkIG5hbWVzOgotQUNfREVGVU4oW0FDX0VOQUJMRV9TVEFUSUNdLAotW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgbTRfaWYoWyQxXSwgW25vXSwgW2Rpc2FibGUtXSlbc3RhdGljXSkKLV0pCi0KLUFDX0RFRlVOKFtBQ19ESVNBQkxFX1NUQVRJQ10sCi1bX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGlzYWJsZS1zdGF0aWNdKQotXSkKLQotQVVfREVGVU4oW0FNX0VOQUJMRV9TVEFUSUNdLCBbQUNfRU5BQkxFX1NUQVRJQygkQCldKQotQVVfREVGVU4oW0FNX0RJU0FCTEVfU1RBVElDXSwgW0FDX0RJU0FCTEVfU1RBVElDKCRAKV0pCi0KLWRubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKLWRubCBBQ19ERUZVTihbQU1fRU5BQkxFX1NUQVRJQ10sIFtdKQotZG5sIEFDX0RFRlVOKFtBTV9ESVNBQkxFX1NUQVRJQ10sIFtdKQotCi0KLQotIyBfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTChbREVGQVVMVF0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZywgYW5kIHN1cHBvcnQgdGhlIGBmYXN0LWluc3RhbGwnCi0jIGFuZCBgZGlzYWJsZS1mYXN0LWluc3RhbGwnIExUX0lOSVQgb3B0aW9ucy4KLSMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgotbTRfZGVmaW5lKFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF0sCi1bbTRfZGVmaW5lKFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgW200X2lmKCQxLCBubywgbm8sIHllcyldKWRubAotQUNfQVJHX0VOQUJMRShbZmFzdC1pbnN0YWxsXSwKLSAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWZhc3QtaW5zdGFsbEA8OkA9UEtHU0A6PkBdLAotICAgIFtvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gQDw6QGRlZmF1bHQ9XV9MVF9FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRbQDo+QF0pXSwKLSAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLSAgICBjYXNlICRlbmFibGV2YWwgaW4KLSAgICB5ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci0gICAgbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLSAgICAqKQotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCi0gICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0JSUZTPSIkbHRfc2F2ZV9pZnMiCi0JaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLQkgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgICAgOzsKLSAgICBlc2FjXSwKLSAgICBbZW5hYmxlX2Zhc3RfaW5zdGFsbD1dX0xUX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVCkKLQotX0xUX0RFQ0woW2Zhc3RfaW5zdGFsbF0sIFtlbmFibGVfZmFzdF9pbnN0YWxsXSwgWzBdLAotCSBbV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uXSlkbmwKLV0pIyBfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTAotCi1MVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW2Zhc3QtaW5zdGFsbF0sIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTChbeWVzXSldKQotTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkaXNhYmxlLWZhc3QtaW5zdGFsbF0sIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTChbbm9dKV0pCi0KLSMgT2xkIG5hbWVzOgotQVVfREVGVU4oW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdLAotW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgbTRfaWYoWyQxXSwgW25vXSwgW2Rpc2FibGUtXSlbZmFzdC1pbnN0YWxsXSkKLUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCi1bJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91IHB1dAotdGhlIGBmYXN0LWluc3RhbGwnIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKLV0pCi0KLUFVX0RFRlVOKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0sCi1bX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGlzYWJsZS1mYXN0LWluc3RhbGxdKQotQUNfRElBR05PU0UoW29ic29sZXRlXSwKLVskMDogUmVtb3ZlIHRoaXMgd2FybmluZyBhbmQgdGhlIGNhbGwgdG8gX0xUX1NFVF9PUFRJT04gd2hlbiB5b3UgcHV0Ci10aGUgYGRpc2FibGUtZmFzdC1pbnN0YWxsJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCi1dKQotCi1kbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6Ci1kbmwgQUNfREVGVU4oW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdLCBbXSkKLWRubCBBQ19ERUZVTihbQU1fRElTQUJMRV9GQVNUX0lOU1RBTExdLCBbXSkKLQotCi0jIF9MVF9XSVRIX1BJQyhbTU9ERV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGltcGxlbWVudCB0aGUgLS13aXRoLXBpYyBmbGFnLCBhbmQgc3VwcG9ydCB0aGUgYHBpYy1vbmx5JyBhbmQgYG5vLXBpYycKLSMgTFRfSU5JVCBvcHRpb25zLgotIyBNT0RFIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYGJvdGgnLgotbTRfZGVmaW5lKFtfTFRfV0lUSF9QSUNdLAotW0FDX0FSR19XSVRIKFtwaWNdLAotICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXBpY10sCi0JW3RyeSB0byB1c2Ugb25seSBQSUMvbm9uLVBJQyBvYmplY3RzIEA8OkBkZWZhdWx0PXVzZSBib3RoQDo+QF0pXSwKLSAgICBbcGljX21vZGU9IiR3aXRodmFsIl0sCi0gICAgW3BpY19tb2RlPWRlZmF1bHRdKQotCi10ZXN0IC16ICIkcGljX21vZGUiICYmIHBpY19tb2RlPW00X2RlZmF1bHQoWyQxXSwgW2RlZmF1bHRdKQotCi1fTFRfREVDTChbXSwgW3BpY19tb2RlXSwgWzBdLCBbV2hhdCB0eXBlIG9mIG9iamVjdHMgdG8gYnVpbGRdKWRubAotXSkjIF9MVF9XSVRIX1BJQwotCi1MVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW3BpYy1vbmx5XSwgW19MVF9XSVRIX1BJQyhbeWVzXSldKQotTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtuby1waWNdLCBbX0xUX1dJVEhfUElDKFtub10pXSkKLQotIyBPbGQgbmFtZToKLUFVX0RFRlVOKFtBQ19MSUJUT09MX1BJQ01PREVdLAotW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW3BpYy1vbmx5XSkKLUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCi1bJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91Ci1wdXQgdGhlIGBwaWMtb25seScgb3B0aW9uIGludG8gTFRfSU5JVCdzIGZpcnN0IHBhcmFtZXRlci5dKQotXSkKLQotZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgotZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX1BJQ01PREVdLCBbXSkKLQotCi1tNF9kZWZpbmUoW19MVERMX01PREVdLCBbXSkKLUxUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtub25yZWN1cnNpdmVdLAotCQkgW200X2RlZmluZShbX0xURExfTU9ERV0sIFtub25yZWN1cnNpdmVdKV0pCi1MVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbcmVjdXJzaXZlXSwKLQkJIFttNF9kZWZpbmUoW19MVERMX01PREVdLCBbcmVjdXJzaXZlXSldKQotTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW3N1YnByb2plY3RdLAotCQkgW200X2RlZmluZShbX0xURExfTU9ERV0sIFtzdWJwcm9qZWN0XSldKQotCi1tNF9kZWZpbmUoW19MVERMX1RZUEVdLCBbXSkKLUxUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtpbnN0YWxsYWJsZV0sCi0JCSBbbTRfZGVmaW5lKFtfTFRETF9UWVBFXSwgW2luc3RhbGxhYmxlXSldKQotTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW2NvbnZlbmllbmNlXSwKLQkJIFttNF9kZWZpbmUoW19MVERMX1RZUEVdLCBbY29udmVuaWVuY2VdKV0pCi0KLSMgbHRzdWdhci5tNCAtLSBsaWJ0b29sIG00IGJhc2UgbGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgIC0qLUF1dG9jb25mLSotCi0jCi0jIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgV3JpdHRlbiBieSBHYXJ5IFYuIFZhdWdoYW4sIDIwMDQKLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKLSMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA2IGx0c3VnYXIubTQKLQotIyBUaGlzIGlzIHRvIGhlbHAgYWNsb2NhbCBmaW5kIHRoZXNlIG1hY3JvcywgYXMgaXQgY2FuJ3Qgc2VlIG00X2RlZmluZS4KLUFDX0RFRlVOKFtMVFNVR0FSX1ZFUlNJT05dLCBbbTRfaWYoWzAuMV0pXSkKLQotCi0jIGx0X2pvaW4oU0VQLCBBUkcxLCBbQVJHMi4uLl0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFByb2R1Y2UgQVJHMVNFUEFSRzIuLi5TRVBBUkduLCBvbWl0dGluZyBbXSBhcmd1bWVudHMgYW5kIHRoZWlyCi0jIGFzc29jaWF0ZWQgc2VwYXJhdG9yLgotIyBOZWVkZWQgdW50aWwgd2UgY2FuIHJlbHkgb24gbTRfam9pbiBmcm9tIEF1dG9jb25mIDIuNjIsIHNpbmNlIGFsbCBlYXJsaWVyCi0jIHZlcnNpb25zIGluIG00c3VnYXIgaGFkIGJ1Z3MuCi1tNF9kZWZpbmUoW2x0X2pvaW5dLAotW200X2lmKFskI10sIFsxXSwgW10sCi0gICAgICAgWyQjXSwgWzJdLCBbWyQyXV0sCi0gICAgICAgW200X2lmKFskMl0sIFtdLCBbXSwgW1skMl1fXSkkMChbJDFdLCBtNF9zaGlmdChtNF9zaGlmdCgkQCkpKV0pXSkKLW00X2RlZmluZShbX2x0X2pvaW5dLAotW200X2lmKFskIyQyXSwgWzJdLCBbXSwKLSAgICAgICBbbTRfaWYoWyQyXSwgW10sIFtdLCBbWyQxJDJdXSkkMChbJDFdLCBtNF9zaGlmdChtNF9zaGlmdCgkQCkpKV0pXSkKLQotCi0jIGx0X2NhcihMSVNUKQotIyBsdF9jZHIoTElTVCkKLSMgLS0tLS0tLS0tLS0tCi0jIE1hbmlwdWxhdGUgbTQgbGlzdHMuCi0jIFRoZXNlIG1hY3JvcyBhcmUgbmVjZXNzYXJ5IGFzIGxvbmcgYXMgd2lsbCBzdGlsbCBuZWVkIHRvIHN1cHBvcnQKLSMgQXV0b2NvbmYtMi41OSB3aGljaCBxdW90ZXMgZGlmZmVyZW50bHkuCi1tNF9kZWZpbmUoW2x0X2Nhcl0sIFtbJDFdXSkKLW00X2RlZmluZShbbHRfY2RyXSwKLVttNF9pZihbJCNdLCAwLCBbbTRfZmF0YWwoWyQwOiBjYW5ub3QgYmUgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzXSldLAotICAgICAgIFskI10sIDEsIFtdLAotICAgICAgIFttNF9kcXVvdGUobTRfc2hpZnQoJEApKV0pXSkKLW00X2RlZmluZShbbHRfdW5xdW90ZV0sICQxKQotCi0KLSMgbHRfYXBwZW5kKE1BQ1JPLU5BTUUsIFNUUklORywgW1NFUEFSQVRPUl0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBSZWRlZmluZSBNQUNSTy1OQU1FIHRvIGhvbGQgaXRzIGZvcm1lciBjb250ZW50IHBsdXMgYFNFUEFSQVRPUidgU1RSSU5HJy4KLSMgTm90ZSB0aGF0IG5laXRoZXIgU0VQQVJBVE9SIG5vciBTVFJJTkcgYXJlIGV4cGFuZGVkOyB0aGV5IGFyZSBhcHBlbmRlZAotIyB0byBNQUNSTy1OQU1FIGFzIGlzIChsZWF2aW5nIHRoZSBleHBhbnNpb24gZm9yIHdoZW4gTUFDUk8tTkFNRSBpcyBpbnZva2VkKS4KLSMgTm8gU0VQQVJBVE9SIGlzIG91dHB1dCBpZiBNQUNSTy1OQU1FIHdhcyBwcmV2aW91c2x5IHVuZGVmaW5lZCAoZGlmZmVyZW50Ci0jIHRoYW4gZGVmaW5lZCBhbmQgZW1wdHkpLgotIwotIyBUaGlzIG1hY3JvIGlzIG5lZWRlZCB1bnRpbCB3ZSBjYW4gcmVseSBvbiBBdXRvY29uZiAyLjYyLCBzaW5jZSBlYXJsaWVyCi0jIHZlcnNpb25zIG9mIG00c3VnYXIgbWlzdGFrZW5seSBleHBhbmRlZCBTRVBBUkFUT1IgYnV0IG5vdCBTVFJJTkcuCi1tNF9kZWZpbmUoW2x0X2FwcGVuZF0sCi1bbTRfZGVmaW5lKFskMV0sCi0JICAgbTRfaWZkZWYoWyQxXSwgW200X2RlZm4oWyQxXSlbJDNdXSlbJDJdKV0pCi0KLQotCi0jIGx0X2NvbWJpbmUoU0VQLCBQUkVGSVgtTElTVCwgSU5GSVgsIFNVRkZJWDEsIFtTVUZGSVgyLi4uXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQcm9kdWNlIGEgU0VQIGRlbGltaXRlZCBsaXN0IG9mIGFsbCBwYWlyZWQgY29tYmluYXRpb25zIG9mIGVsZW1lbnRzIG9mCi0jIFBSRUZJWC1MSVNUIHdpdGggU1VGRklYMSB0aHJvdWdoIFNVRkZJWG4uICBFYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3QKLSMgaGFzIHRoZSBmb3JtIFBSRUZJWG1JTkZJWFNVRkZJWG4uCi0jIE5lZWRlZCB1bnRpbCB3ZSBjYW4gcmVseSBvbiBtNF9jb21iaW5lIGFkZGVkIGluIEF1dG9jb25mIDIuNjIuCi1tNF9kZWZpbmUoW2x0X2NvbWJpbmVdLAotW200X2lmKG00X2V2YWwoWyQjID4gM10pLCBbMV0sCi0gICAgICAgW200X3B1c2hkZWYoW19MdF9zZXBdLCBbbTRfZGVmaW5lKFtfTHRfc2VwXSwgbTRfZGVmbihbbHRfY2FyXSkpXSldXWRubAotW1ttNF9mb3JlYWNoKFtfTHRfcHJlZml4XSwgWyQyXSwKLQkgICAgIFttNF9mb3JlYWNoKFtfTHRfc3VmZml4XSwKLQkJXW00X2RxdW90ZShtNF9kcXVvdGUobTRfc2hpZnQobTRfc2hpZnQobTRfc2hpZnQoJEApKSkpKVssCi0JW19MdF9zZXAoWyQxXSlbXW00X2RlZm4oW19MdF9wcmVmaXhdKVskM11tNF9kZWZuKFtfTHRfc3VmZml4XSldKV0pXSldKQotCi0KLSMgbHRfaWZfYXBwZW5kX3VuaXEoTUFDUk8tTkFNRSwgVkFSTkFNRSwgW1NFUEFSQVRPUl0sIFtVTklRXSwgW05PVC1VTklRXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgSWZmIE1BQ1JPLU5BTUUgZG9lcyBub3QgeWV0IGNvbnRhaW4gVkFSTkFNRSwgdGhlbiBhcHBlbmQgaXQgKGRlbGltaXRlZAotIyBieSBTRVBBUkFUT1IgaWYgc3VwcGxpZWQpIGFuZCBleHBhbmQgVU5JUSwgZWxzZSBOT1QtVU5JUS4KLW00X2RlZmluZShbbHRfaWZfYXBwZW5kX3VuaXFdLAotW200X2lmZGVmKFskMV0sCi0JICBbbTRfaWYobTRfaW5kZXgoWyQzXW00X2RlZm4oWyQxXSlbJDNdLCBbJDMkMiQzXSksIFstMV0sCi0JCSBbbHRfYXBwZW5kKFskMV0sIFskMl0sIFskM10pJDRdLAotCQkgWyQ1XSldLAotCSAgW2x0X2FwcGVuZChbJDFdLCBbJDJdLCBbJDNdKSQ0XSldKQotCi0KLSMgbHRfZGljdF9hZGQoRElDVCwgS0VZLCBWQUxVRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZmluZShbbHRfZGljdF9hZGRdLAotW200X2RlZmluZShbJDEoJDIpXSwgWyQzXSldKQotCi0KLSMgbHRfZGljdF9hZGRfc3Via2V5KERJQ1QsIEtFWSwgU1VCS0VZLCBWQUxVRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZmluZShbbHRfZGljdF9hZGRfc3Via2V5XSwKLVttNF9kZWZpbmUoWyQxKCQyOiQzKV0sIFskNF0pXSkKLQotCi0jIGx0X2RpY3RfZmV0Y2goRElDVCwgS0VZLCBbU1VCS0VZXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmaW5lKFtsdF9kaWN0X2ZldGNoXSwKLVttNF9pZnZhbChbJDNdLAotCW00X2lmZGVmKFskMSgkMjokMyldLCBbbTRfZGVmbihbJDEoJDI6JDMpXSldKSwKLSAgICBtNF9pZmRlZihbJDEoJDIpXSwgW200X2RlZm4oWyQxKCQyKV0pXSkpXSkKLQotCi0jIGx0X2lmX2RpY3RfZmV0Y2goRElDVCwgS0VZLCBbU1VCS0VZXSwgVkFMVUUsIElGLVRSVUUsIFtJRi1GQUxTRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1tNF9kZWZpbmUoW2x0X2lmX2RpY3RfZmV0Y2hdLAotW200X2lmKGx0X2RpY3RfZmV0Y2goWyQxXSwgWyQyXSwgWyQzXSksIFskNF0sCi0JWyQ1XSwKLSAgICBbJDZdKV0pCi0KLQotIyBsdF9kaWN0X2ZpbHRlcihESUNULCBbU1VCS0VZXSwgVkFMVUUsIFtTRVBBUkFUT1JdLCBLRVksIFsuLi5dKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmaW5lKFtsdF9kaWN0X2ZpbHRlcl0sCi1bbTRfaWYoWyQ1XSwgW10sIFtdLAotICBbbHRfam9pbihtNF9xdW90ZShtNF9kZWZhdWx0KFskNF0sIFtbLCBdXSkpLAotICAgICAgICAgICBsdF91bnF1b3RlKG00X3NwbGl0KG00X25vcm1hbGl6ZShtNF9mb3JlYWNoKF9MdF9rZXksIGx0X2NhcihbbTRfc2hpZnRuKDQsICRAKV0pLAotCQkgICAgICBbbHRfaWZfZGljdF9mZXRjaChbJDFdLCBfTHRfa2V5LCBbJDJdLCBbJDNdLCBbX0x0X2tleSBdKV0pKSkpKV0pW11kbmwKLV0pCi0KLSMgbHR2ZXJzaW9uLm00IC0tIHZlcnNpb24gbnVtYmVycwkJCS0qLSBBdXRvY29uZiAtKi0KLSMKLSMgICBDb3B5cmlnaHQgKEMpIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jICAgV3JpdHRlbiBieSBTY290dCBKYW1lcyBSZW1uYW50LCAyMDA0Ci0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCi0jIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBHZW5lcmF0ZWQgZnJvbSBsdHZlcnNpb24uaW4uCi0KLSMgc2VyaWFsIDMxNzUgbHR2ZXJzaW9uLm00Ci0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sCi0KLW00X2RlZmluZShbTFRfUEFDS0FHRV9WRVJTSU9OXSwgWzIuMi4xMF0pCi1tNF9kZWZpbmUoW0xUX1BBQ0tBR0VfUkVWSVNJT05dLCBbMS4zMTc1XSkKLQotQUNfREVGVU4oW0xUVkVSU0lPTl9WRVJTSU9OXSwKLVttYWNyb192ZXJzaW9uPScyLjIuMTAnCi1tYWNyb19yZXZpc2lvbj0nMS4zMTc1JwotX0xUX0RFQ0woLCBtYWNyb192ZXJzaW9uLCAwLCBbV2hpY2ggcmVsZWFzZSBvZiBsaWJ0b29sLm00IHdhcyB1c2VkP10pCi1fTFRfREVDTCgsIG1hY3JvX3JldmlzaW9uLCAwKQotXSkKLQotIyBsdH5vYnNvbGV0ZS5tNCAtLSBhY2xvY2FsIHNhdGlzZnlpbmcgb2Jzb2xldGUgZGVmaW5pdGlvbnMuICAgIC0qLUF1dG9jb25mLSotCi0jCi0jICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyAgIFdyaXR0ZW4gYnkgU2NvdHQgSmFtZXMgUmVtbmFudCwgMjAwNC4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKLSMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA1IGx0fm9ic29sZXRlLm00Ci0KLSMgVGhlc2UgZXhpc3QgZW50aXJlbHkgdG8gZm9vbCBhY2xvY2FsIHdoZW4gYm9vdHN0cmFwcGluZyBsaWJ0b29sLgotIwotIyBJbiB0aGUgcGFzdCBsaWJ0b29sLm00IGhhcyBwcm92aWRlZCBtYWNyb3MgdmlhIEFDX0RFRlVOIChvciBBVV9ERUZVTikKLSMgd2hpY2ggaGF2ZSBsYXRlciBiZWVuIGNoYW5nZWQgdG8gbTRfZGVmaW5lIGFzIHRoZXkgYXJlbid0IHBhcnQgb2YgdGhlCi0jIGV4cG9ydGVkIEFQSSwgb3IgbW92ZWQgdG8gQXV0b2NvbmYgb3IgQXV0b21ha2Ugd2hlcmUgdGhleSBiZWxvbmcuCi0jCi0jIFRoZSB0cm91YmxlIGlzLCBhY2xvY2FsIGlzIGEgYml0IHRoaWNrLiAgSXQnbGwgc2VlIHRoZSBvbGQgQUNfREVGVU4KLSMgaW4gL3Vzci9zaGFyZS9hY2xvY2FsL2xpYnRvb2wubTQgYW5kIHJlbWVtYmVyIGl0LCB0aGVuIHdoZW4gaXQgc2VlcyB1cwotIyB1c2luZyBhIG1hY3JvIHdpdGggdGhlIHNhbWUgbmFtZSBpbiBvdXIgbG9jYWwgbTQvbGlidG9vbC5tNCBpdCdsbAotIyBwdWxsIHRoZSBvbGQgbGlidG9vbC5tNCBpbiAoaXQgZG9lc24ndCBzZWUgb3VyIHNoaW55IG5ldyBtNF9kZWZpbmUKLSMgYW5kIGRvZXNuJ3Qga25vdyBhYm91dCBBdXRvY29uZiBtYWNyb3MgYXQgYWxsLikKLSMKLSMgU28gd2UgcHJvdmlkZSB0aGlzIGZpbGUsIHdoaWNoIGhhcyBhIHNpbGx5IGZpbGVuYW1lIHNvIGl0J3MgYWx3YXlzCi0jIGluY2x1ZGVkIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZS4gIFRoaXMgcHJvdmlkZXMgYWNsb2NhbCB3aXRoIHRoZQotIyBBQ19ERUZVTnMgaXQgd2FudHMsIGJ1dCB3aGVuIG00IHByb2Nlc3NlcyBpdCwgaXQgZG9lc24ndCBkbyBhbnl0aGluZwotIyBiZWNhdXNlIHRob3NlIG1hY3JvcyBhbHJlYWR5IGV4aXN0LCBvciB3aWxsIGJlIG92ZXJ3cml0dGVuIGxhdGVyLgotIyBXZSB1c2UgQUNfREVGVU4gb3ZlciBBVV9ERUZVTiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGFjbG9jYWwtMS42LiAKLSMKLSMgQW55dGltZSB3ZSB3aXRoZHJhdyBhbiBBQ19ERUZVTiBvciBBVV9ERUZVTiwgcmVtZW1iZXIgdG8gYWRkIGl0IGhlcmUuCi0jIFllcywgdGhhdCBtZWFucyBldmVyeSBuYW1lIG9uY2UgdGFrZW4gd2lsbCBuZWVkIHRvIHJlbWFpbiBoZXJlIHVudGlsCi0jIHdlIGdpdmUgdXAgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIGJlZm9yZSAxLjcsIGF0IHdoaWNoIHBvaW50Ci0jIHdlIG5lZWQgdG8ga2VlcCBvbmx5IHRob3NlIG5hbWVzIHdoaWNoIHdlIHN0aWxsIHJlZmVyIHRvLgotCi0jIFRoaXMgaXMgdG8gaGVscCBhY2xvY2FsIGZpbmQgdGhlc2UgbWFjcm9zLCBhcyBpdCBjYW4ndCBzZWUgbTRfZGVmaW5lLgotQUNfREVGVU4oW0xUT0JTT0xFVEVfVkVSU0lPTl0sIFttNF9pZihbMV0pXSkKLQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0pXSkKLW00X2lmbmRlZihbQUNfUFJPR19FR1JFUF0sCQlbQUNfREVGVU4oW0FDX1BST0dfRUdSRVBdKV0pCi1tNF9pZm5kZWYoW19MVF9BQ19QUk9HX0VDSE9fQkFDS1NMQVNIXSwJW0FDX0RFRlVOKFtfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pXSkKLW00X2lmbmRlZihbX0xUX0FDX1NIRUxMX0lOSVRdLAkJW0FDX0RFRlVOKFtfTFRfQUNfU0hFTExfSU5JVF0pXSkKLW00X2lmbmRlZihbX0xUX0FDX1NZU19MSUJQQVRIX0FJWF0sCVtBQ19ERUZVTihbX0xUX0FDX1NZU19MSUJQQVRIX0FJWF0pXSkKLW00X2lmbmRlZihbX0xUX1BST0dfTFRNQUlOXSwJCVtBQ19ERUZVTihbX0xUX1BST0dfTFRNQUlOXSldKQotbTRfaWZuZGVmKFtfTFRfQUNfVEFHVkFSXSwJCVtBQ19ERUZVTihbX0xUX0FDX1RBR1ZBUl0pXSkKLW00X2lmbmRlZihbQUNfTFRETF9FTkFCTEVfSU5TVEFMTF0sCVtBQ19ERUZVTihbQUNfTFRETF9FTkFCTEVfSU5TVEFMTF0pXSkKLW00X2lmbmRlZihbQUNfTFRETF9QUkVPUEVOXSwJCVtBQ19ERUZVTihbQUNfTFRETF9QUkVPUEVOXSldKQotbTRfaWZuZGVmKFtfTFRfQUNfU1lTX0NPTVBJTEVSXSwJW0FDX0RFRlVOKFtfTFRfQUNfU1lTX0NPTVBJTEVSXSldKQotbTRfaWZuZGVmKFtfTFRfQUNfTE9DS10sCQlbQUNfREVGVU4oW19MVF9BQ19MT0NLXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NZU19PTERfQVJDSElWRV0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfT0xEX0FSQ0hJVkVdKV0pCi1tNF9pZm5kZWYoW19MVF9BQ19UUllfRExPUEVOX1NFTEZdLAlbQUNfREVGVU4oW19MVF9BQ19UUllfRExPUEVOX1NFTEZdKV0pCi1tNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19DQ19DX09dLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DQ19DX09dKV0pCi1tNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLU10sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX09CSkRJUl0sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfT0JKRElSXSldKQotbTRfaWZuZGVmKFtBQ19MVERMX09CSkRJUl0sCQlbQUNfREVGVU4oW0FDX0xURExfT0JKRElSXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSF0sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEhdKV0pCi1tNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUF0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfTElCX1NUUklQXSldKQotbTRfaWZuZGVmKFtBQ19QQVRIX01BR0lDXSwJCVtBQ19ERUZVTihbQUNfUEFUSF9NQUdJQ10pXSkKLW00X2lmbmRlZihbQUNfUFJPR19MRF9HTlVdLAkJW0FDX0RFRlVOKFtBQ19QUk9HX0xEX0dOVV0pXSkKLW00X2lmbmRlZihbQUNfUFJPR19MRF9SRUxPQURfRkxBR10sCVtBQ19ERUZVTihbQUNfUFJPR19MRF9SRUxPQURfRkxBR10pXSkKLW00X2lmbmRlZihbQUNfREVQTElCU19DSEVDS19NRVRIT0RdLAlbQUNfREVGVU4oW0FDX0RFUExJQlNfQ0hFQ0tfTUVUSE9EXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSV0sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEldKV0pCi1tNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRV0sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQXSldKQotbTRfaWZuZGVmKFtMVF9BQ19QUk9HX0VHUkVQXSwJCVtBQ19ERUZVTihbTFRfQUNfUFJPR19FR1JFUF0pXSkKLW00X2lmbmRlZihbTFRfQUNfUFJPR19TRURdLAkJW0FDX0RFRlVOKFtMVF9BQ19QUk9HX1NFRF0pXSkKLW00X2lmbmRlZihbX0xUX0NDX0JBU0VOQU1FXSwJCVtBQ19ERUZVTihbX0xUX0NDX0JBU0VOQU1FXSldKQotbTRfaWZuZGVmKFtfTFRfQ09NUElMRVJfQk9JTEVSUExBVEVdLAlbQUNfREVGVU4oW19MVF9DT01QSUxFUl9CT0lMRVJQTEFURV0pXSkKLW00X2lmbmRlZihbX0xUX0xJTktFUl9CT0lMRVJQTEFURV0sCVtBQ19ERUZVTihbX0xUX0xJTktFUl9CT0lMRVJQTEFURV0pXSkKLW00X2lmbmRlZihbX0FDX1BST0dfTElCVE9PTF0sCQlbQUNfREVGVU4oW19BQ19QUk9HX0xJQlRPT0xdKV0pCi1tNF9pZm5kZWYoW0FDX0xJQlRPT0xfU0VUVVBdLAkJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NFVFVQXSldKQotbTRfaWZuZGVmKFtfTFRfQUNfQ0hFQ0tfRExGQ05dLAkJW0FDX0RFRlVOKFtfTFRfQUNfQ0hFQ0tfRExGQ05dKV0pCi1tNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUl0pXSkKLW00X2lmbmRlZihbX0xUX0FDX1RBR0NPTkZJR10sCQlbQUNfREVGVU4oW19MVF9BQ19UQUdDT05GSUddKV0pCi1tNF9pZm5kZWYoW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSwJW0FDX0RFRlVOKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0pXSkKLW00X2lmbmRlZihbX0xUX0FDX0xBTkdfQ1hYXSwJCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ1hYXSldKQotbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19GNzddLAkJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19GNzddKV0pCi1tNF9pZm5kZWYoW19MVF9BQ19MQU5HX0dDSl0sCQlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0dDSl0pXSkKLW00X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfQ19DT05GSUddKV0pCi1tNF9pZm5kZWYoW19MVF9BQ19MQU5HX0NfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DX0NPTkZJR10pXSkKLW00X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHXSldKQotbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19DWFhfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DWFhfQ09ORklHXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xBTkdfRjc3X0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUddKV0pCi1tNF9pZm5kZWYoW19MVF9BQ19MQU5HX0Y3N19DT05GSUddLAlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0Y3N19DT05GSUddKV0pCi1tNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJR10pXSkKLW00X2lmbmRlZihbX0xUX0FDX0xBTkdfR0NKX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfR0NKX0NPTkZJR10pXSkKLW00X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJR10pXSkKLW00X2lmbmRlZihbX0xUX0FDX0xBTkdfUkNfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19SQ19DT05GSUddKV0pCi1tNF9pZm5kZWYoW0FDX0xJQlRPT0xfQ09ORklHXSwJCVtBQ19ERUZVTihbQUNfTElCVE9PTF9DT05GSUddKV0pCi1tNF9pZm5kZWYoW19MVF9BQ19GSUxFX0xURExMX0NdLAlbQUNfREVGVU4oW19MVF9BQ19GSUxFX0xURExMX0NdKV0pCi1tNF9pZm5kZWYoW19MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTXSwJW0FDX0RFRlVOKFtfTFRfUkVRVUlSRURfREFSV0lOX0NIRUNLU10pXSkKLW00X2lmbmRlZihbX0xUX0FDX1BST0dfQ1hYQ1BQXSwJCVtBQ19ERUZVTihbX0xUX0FDX1BST0dfQ1hYQ1BQXSldKQotbTRfaWZuZGVmKFtfTFRfUFJFUEFSRV9TRURfUVVPVEVfVkFSU10sCVtBQ19ERUZVTihbX0xUX1BSRVBBUkVfU0VEX1FVT1RFX1ZBUlNdKV0pCi1tNF9pZm5kZWYoW19MVF9QUk9HX0VDSE9fQkFDS1NMQVNIXSwJW0FDX0RFRlVOKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pXSkKLW00X2lmbmRlZihbX0xUX1BST0dfRjc3XSwJCVtBQ19ERUZVTihbX0xUX1BST0dfRjc3XSldKQotbTRfaWZuZGVmKFtfTFRfUFJPR19GQ10sCQlbQUNfREVGVU4oW19MVF9QUk9HX0ZDXSldKQotbTRfaWZuZGVmKFtfTFRfUFJPR19DWFhdLAkJW0FDX0RFRlVOKFtfTFRfUFJPR19DWFhdKV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEFNX0FVVE9NQUtFX1ZFUlNJT04oVkVSU0lPTikKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBBdXRvbWFrZSBYLlkgdHJhY2VzIHRoaXMgbWFjcm8gdG8gZW5zdXJlIGFjbG9jYWwubTQgaGFzIGJlZW4KLSMgZ2VuZXJhdGVkIGZyb20gdGhlIG00IGZpbGVzIGFjY29tcGFueWluZyBBdXRvbWFrZSBYLlkuCi0jIChUaGlzIHByaXZhdGUgbWFjcm8gc2hvdWxkIG5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGlzIGZpbGUuKQotQUNfREVGVU4oW0FNX0FVVE9NQUtFX1ZFUlNJT05dLAotW2FtX19hcGlfdmVyc2lvbj0nMS4xMScKLWRubCBTb21lIHVzZXJzIGZpbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgbWlzdGFrZSBpdCBmb3IgYSB3YXkgdG8KLWRubCByZXF1aXJlIHNvbWUgbWluaW11bSB2ZXJzaW9uLiAgUG9pbnQgdGhlbSB0byB0aGUgcmlnaHQgbWFjcm8uCi1tNF9pZihbJDFdLCBbMS4xMS4xXSwgW10sCi0gICAgICBbQUNfRkFUQUwoW0RvIG5vdCBjYWxsICQwLCB1c2UgQU1fSU5JVF9BVVRPTUFLRShbJDFdKS5dKV0pZG5sCi1dKQotCi0jIF9BTV9BVVRPQ09ORl9WRVJTSU9OKFZFUlNJT04pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGFjbG9jYWwgdHJhY2VzIHRoaXMgbWFjcm8gdG8gZmluZCB0aGUgQXV0b2NvbmYgdmVyc2lvbi4KLSMgVGhpcyBpcyBhIHByaXZhdGUgbWFjcm8gdG9vLiAgVXNpbmcgbTRfZGVmaW5lIHNpbXBsaWZpZXMKLSMgdGhlIGxvZ2ljIGluIGFjbG9jYWwsIHdoaWNoIGNhbiBzaW1wbHkgaWdub3JlIHRoaXMgZGVmaW5pdGlvbi4KLW00X2RlZmluZShbX0FNX0FVVE9DT05GX1ZFUlNJT05dLCBbXSkKLQotIyBBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2FsbCBBTV9BVVRPTUFLRV9WRVJTSU9OIGFuZCBBTV9BVVRPTUFLRV9WRVJTSU9OIHNvIHRoZXkgY2FuIGJlIHRyYWNlZC4KLSMgVGhpcyBmdW5jdGlvbiBpcyBBQ19SRVFVSVJFZCBieSBBTV9JTklUX0FVVE9NQUtFLgotQUNfREVGVU4oW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dLAotW0FNX0FVVE9NQUtFX1ZFUlNJT04oWzEuMTEuMV0pZG5sCi1tNF9pZm5kZWYoW0FDX0FVVE9DT05GX1ZFUlNJT05dLAotICBbbTRfY29weShbbTRfUEFDS0FHRV9WRVJTSU9OXSwgW0FDX0FVVE9DT05GX1ZFUlNJT05dKV0pZG5sCi1fQU1fQVVUT0NPTkZfVkVSU0lPTihtNF9kZWZuKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSkpXSkKLQotIyBBTV9BVVhfRElSX0VYUEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBGb3IgcHJvamVjdHMgdXNpbmcgQUNfQ09ORklHX0FVWF9ESVIoW2Zvb10pLCBBdXRvY29uZiBzZXRzCi0jICRhY19hdXhfZGlyIHRvIGAkc3JjZGlyL2ZvbycuICBJbiBvdGhlciBwcm9qZWN0cywgaXQgaXMgc2V0IHRvCi0jIGAkc3JjZGlyJywgYCRzcmNkaXIvLi4nLCBvciBgJHNyY2Rpci8uLi8uLicuCi0jCi0jIE9mIGNvdXJzZSwgQXV0b21ha2UgbXVzdCBob25vciB0aGlzIHZhcmlhYmxlIHdoZW5ldmVyIGl0IGNhbGxzIGEKLSMgdG9vbCBmcm9tIHRoZSBhdXhpbGlhcnkgZGlyZWN0b3J5LiAgVGhlIHByb2JsZW0gaXMgdGhhdCAkc3JjZGlyIChhbmQKLSMgdGhlcmVmb3JlICRhY19hdXhfZGlyIGFzIHdlbGwpIGNhbiBiZSBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUsCi0jIGRlcGVuZGluZyBvbiBob3cgY29uZmlndXJlIGlzIHJ1bi4gIFRoaXMgaXMgcHJldHR5IGFubm95aW5nLCBzaW5jZQotIyBpdCBtYWtlcyAkYWNfYXV4X2RpciBxdWl0ZSB1bnVzYWJsZSBpbiBzdWJkaXJlY3RvcmllczogaW4gdGhlIHRvcAotIyBzb3VyY2UgZGlyZWN0b3J5LCBhbnkgZm9ybSB3aWxsIHdvcmsgZmluZSwgYnV0IGluIHN1YmRpcmVjdG9yaWVzIGEKLSMgcmVsYXRpdmUgcGF0aCBuZWVkcyB0byBiZSBhZGp1c3RlZCBmaXJzdC4KLSMKLSMgJGFjX2F1eF9kaXIvbWlzc2luZwotIyAgICBmYWlscyB3aGVuIGNhbGxlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IGlmICRhY19hdXhfZGlyIGlzIHJlbGF0aXZlCi0jICR0b3Bfc3JjZGlyLyRhY19hdXhfZGlyL21pc3NpbmcKLSMgICAgZmFpbHMgaWYgJGFjX2F1eF9kaXIgaXMgYWJzb2x1dGUsCi0jICAgIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkgaW4gYSBWUEFUSCBidWlsZCB3aXRoCi0jICAgICAgICAgIGEgcmVsYXRpdmUgJGFjX2F1eF9kaXIKLSMKLSMgVGhlIHJlYXNvbiBvZiB0aGUgbGF0dGVyIGZhaWx1cmUgaXMgdGhhdCAkdG9wX3NyY2RpciBhbmQgJGFjX2F1eF9kaXIKLSMgYXJlIGJvdGggcHJlZml4ZWQgYnkgJHNyY2Rpci4gIEluIGFuIGluLXNvdXJjZSBidWlsZCB0aGlzIGlzIHVzdWFsbHkKLSMgaGFybWxlc3MgYmVjYXVzZSAkc3JjZGlyIGlzIGAuJywgYnV0IHRoaW5ncyB3aWxsIGJyb2tlIHdoZW4geW91Ci0jIHN0YXJ0IGEgVlBBVEggYnVpbGQgb3IgdXNlIGFuIGFic29sdXRlICRzcmNkaXIuCi0jCi0jIFNvIHdlIGNvdWxkIHVzZSBzb21ldGhpbmcgc2ltaWxhciB0byAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nLAotIyBpZmYgd2Ugc3RyaXAgdGhlIGxlYWRpbmcgJHNyY2RpciBmcm9tICRhY19hdXhfZGlyLiAgVGhhdCB3b3VsZCBiZToKLSMgICBhbV9hdXhfZGlyPSdcJCh0b3Bfc3JjZGlyKS8nYGV4cHIgIiRhY19hdXhfZGlyIiA6ICIkc3JjZGlyLy8qXCguKlwpImAKLSMgYW5kIHRoZW4gd2Ugd291bGQgZGVmaW5lICRNSVNTSU5HIGFzCi0jICAgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCi0jIFRoaXMgd2lsbCB3b3JrIGFzIGxvbmcgYXMgTUlTU0lORyBpcyBub3QgY2FsbGVkIGZyb20gY29uZmlndXJlLCBiZWNhdXNlCi0jIHVuZm9ydHVuYXRlbHkgJCh0b3Bfc3JjZGlyKSBoYXMgbm8gbWVhbmluZyBpbiBjb25maWd1cmUuCi0jIEhvd2V2ZXIgdGhlcmUgYXJlIG90aGVyIHZhcmlhYmxlcywgbGlrZSBDQywgd2hpY2ggYXJlIG9mdGVuIHVzZWQgaW4KLSMgY29uZmlndXJlLCBhbmQgY291bGQgdGhlcmVmb3JlIG5vdCB1c2UgdGhpcyAiZml4ZWQiICRhY19hdXhfZGlyLgotIwotIyBBbm90aGVyIHNvbHV0aW9uLCB1c2VkIGhlcmUsIGlzIHRvIGFsd2F5cyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4KLSMgYWJzb2x1dGUgUEFUSC4gIFRoZSBkcmF3YmFjayBpcyB0aGF0IHVzaW5nIGFic29sdXRlIHBhdGhzIHByZXZlbnQgYQotIyBjb25maWd1cmVkIHRyZWUgdG8gYmUgbW92ZWQgd2l0aG91dCByZWNvbmZpZ3VyYXRpb24uCi0KLUFDX0RFRlVOKFtBTV9BVVhfRElSX0VYUEFORF0sCi1bZG5sIFJlbHkgb24gYXV0b2NvbmYgdG8gc2V0IHVwIENEUEFUSCBwcm9wZXJseS4KLUFDX1BSRVJFUShbMi41MF0pZG5sCi0jIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbiBhYnNvbHV0ZSBwYXRoCi1hbV9hdXhfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1dKQotCi0jIEFNX0NPTkRJVElPTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA4Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDkKLQotIyBBTV9DT05ESVRJT05BTChOQU1FLCBTSEVMTC1DT05ESVRJT04pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi1BQ19ERUZVTihbQU1fQ09ORElUSU9OQUxdLAotW0FDX1BSRVJFUSgyLjUyKWRubAotIGlmZWxzZShbJDFdLCBbVFJVRV0sICBbQUNfRkFUQUwoWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDFdKV0sCi0JWyQxXSwgW0ZBTFNFXSwgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldKWRubAotQUNfU1VCU1QoWyQxX1RSVUVdKWRubAotQUNfU1VCU1QoWyQxX0ZBTFNFXSlkbmwKLV9BTV9TVUJTVF9OT1RNQUtFKFskMV9UUlVFXSlkbmwKLV9BTV9TVUJTVF9OT1RNQUtFKFskMV9GQUxTRV0pZG5sCi1tNF9kZWZpbmUoW19BTV9DT05EX1ZBTFVFXyQxXSwgWyQyXSlkbmwKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpCi1BQ19DT05GSUdfQ09NTUFORFNfUFJFKAotW2lmIHRlc3QgLXogIiR7JDFfVFJVRX0iICYmIHRlc3QgLXogIiR7JDFfRkFMU0V9IjsgdGhlbgotICBBQ19NU0dfRVJST1IoW1tjb25kaXRpb25hbCAiJDEiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuXV0pCi1maV0pXSkKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDkKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMTAKLQotIyBUaGVyZSBhcmUgYSBmZXcgZGlydHkgaGFja3MgYmVsb3cgdG8gYXZvaWQgbGV0dGluZyBgQUNfUFJPR19DQycgYmUKLSMgd3JpdHRlbiBpbiBjbGVhciwgaW4gd2hpY2ggY2FzZSBhdXRvbWFrZSwgd2hlbiByZWFkaW5nIGFjbG9jYWwubTQsCi0jIHdpbGwgdGhpbmsgaXQgc2VlcyBhICp1c2UqLCBhbmQgdGhlcmVmb3JlIHdpbGwgdHJpZ2dlciBhbGwgaXQncwotIyBDIHN1cHBvcnQgbWFjaGluZXJ5LiAgQWxzbyBub3RlIHRoYXQgaXQgbWVhbnMgdGhhdCBhdXRvc2Nhbiwgc2VlaW5nCi0jIENDIGV0Yy4gaW4gdGhlIE1ha2VmaWxlLCB3aWxsIGFzayBmb3IgYW4gQUNfUFJPR19DQyB1c2UuLi4KLQotCi0jIF9BTV9ERVBFTkRFTkNJRVMoTkFNRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTZWUgaG93IHRoZSBjb21waWxlciBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgY2hlY2tpbmcuCi0jIE5BTUUgaXMgIkNDIiwgIkNYWCIsICJHQ0oiLCBvciAiT0JKQyIuCi0jIFdlIHRyeSBhIGZldyB0ZWNobmlxdWVzIGFuZCB1c2UgdGhhdCB0byBzZXQgYSBzaW5nbGUgY2FjaGUgdmFyaWFibGUuCi0jCi0jIFdlIGRvbid0IEFDX1JFUVVJUkUgdGhlIGNvcnJlc3BvbmRpbmcgQUNfUFJPR19DQyBzaW5jZSB0aGUgbGF0dGVyIHdhcwotIyBtb2RpZmllZCB0byBpbnZva2UgX0FNX0RFUEVOREVOQ0lFUyhDQyk7IHdlIHdvdWxkIGhhdmUgYSBjaXJjdWxhcgotIyBkZXBlbmRlbmN5LCBhbmQgZ2l2ZW4gdGhhdCB0aGUgdXNlciBpcyBub3QgZXhwZWN0ZWQgdG8gcnVuIHRoaXMgbWFjcm8sCi0jIGp1c3QgcmVseSBvbiBBQ19QUk9HX0NDLgotQUNfREVGVU4oW19BTV9ERVBFTkRFTkNJRVNdLAotW0FDX1JFUVVJUkUoW0FNX1NFVF9ERVBESVJdKWRubAotQUNfUkVRVUlSRShbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdKWRubAotQUNfUkVRVUlSRShbQU1fTUFLRV9JTkNMVURFXSlkbmwKLUFDX1JFUVVJUkUoW0FNX0RFUF9UUkFDS10pZG5sCi0KLWlmZWxzZShbJDFdLCBDQywgICBbZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PV0sCi0gICAgICAgWyQxXSwgQ1hYLCAgW2RlcGNjPSIkQ1hYIiAgYW1fY29tcGlsZXJfbGlzdD1dLAotICAgICAgIFskMV0sIE9CSkMsIFtkZXBjYz0iJE9CSkMiIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCi0gICAgICAgWyQxXSwgVVBDLCAgW2RlcGNjPSIkVVBDIiAgYW1fY29tcGlsZXJfbGlzdD1dLAotICAgICAgIFskMV0sIEdDSiwgIFtkZXBjYz0iJEdDSiIgIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCi0gICAgICAgICAgICAgICAgICAgW2RlcGNjPSIkJDEiICAgYW1fY29tcGlsZXJfbGlzdD1dKQotCi1BQ19DQUNIRV9DSEVDSyhbZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2NdLAotICAgICAgICAgICAgICAgW2FtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlXSwKLVtpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCi0gICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKLSAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKLSAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKLSAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAotICAjIGluIEQnLgotICBta2RpciBjb25mdGVzdC5kaXIKLSAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKLSAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KLSAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKLSAgY2QgY29uZnRlc3QuZGlyCi0gICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQotICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQotICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQotICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KLSAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0Ci0gICMgZGlyZWN0b3J5LgotICBta2RpciBzdWIKLQotICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi0gIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCi0gICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiBbJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnXSA8IC4vZGVwY29tcGAKLSAgZmkKLSAgYW1fX3VuaXZlcnNhbD1mYWxzZQotICBtNF9jYXNlKFskMV0sIFtDQ10sCi0gICAgW2Nhc2UgIiAkZGVwY2MgIiBpbiAjKAotICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OwotICAgICBlc2FjXSwKLSAgICBbQ1hYXSwKLSAgICBbY2FzZSAiICRkZXBjYyAiIGluICMoCi0gICAgICpcIC1hcmNoXCAqXCAtYXJjaFwgKikgYW1fX3VuaXZlcnNhbD10cnVlIDs7Ci0gICAgIGVzYWNdKQotCi0gIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbwotICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycwotICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKLSAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCi0gICAgIwotICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5Ci0gICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KLSAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KLSAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKLSAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KLSAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKLSAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCi0gICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgotICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCi0gICAgZG9uZQotICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKLQotICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgotICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5Ci0gICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuICBBbHNvLCBzb21lIEludGVsCi0gICAgIyB2ZXJzaW9ucyBoYWQgdHJvdWJsZSB3aXRoIG91dHB1dCBpbiBzdWJkaXJzCi0gICAgYW1fX29iaj1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30KLSAgICBhbV9fbWludXNfb2JqPSItbyAkYW1fX29iaiIKLSAgICBjYXNlICRkZXBtb2RlIGluCi0gICAgZ2NjKQotICAgICAgIyBUaGlzIGRlcG1vZGUgY2F1c2VzIGEgY29tcGlsZXIgcmFjZSBpbiB1bml2ZXJzYWwgbW9kZS4KLSAgICAgIHRlc3QgIiRhbV9fdW5pdmVyc2FsIiA9IGZhbHNlIHx8IGNvbnRpbnVlCi0gICAgICA7OwotICAgIG5vc2lkZWVmZmVjdCkKLSAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAotICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAotICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCi0JY29udGludWUKLSAgICAgIGVsc2UKLQlicmVhawotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgbXN2aXN1YWxjcHAgfCBtc3ZjbXN5cykKLSAgICAgICMgVGhpcyBjb21waWxlciB3b24ndCBncm9rIGAtYyAtbycsIGJ1dCBhbHNvLCB0aGUgbWludXNvIHRlc3QgaGFzCi0gICAgICAjIG5vdCBydW4geWV0LiAgVGhlc2UgZGVwbW9kZXMgYXJlIGxhdGUgZW5vdWdoIGluIHRoZSBnYW1lLCBhbmQKLSAgICAgICMgc28gd2VhayB0aGF0IHRoZWlyIGZ1bmN0aW9uaW5nIHNob3VsZCBub3QgYmUgaW1wYWN0ZWQuCi0gICAgICBhbV9fb2JqPWNvbmZ0ZXN0LiR7T0JKRVhULW99Ci0gICAgICBhbV9fbWludXNfb2JqPQotICAgICAgOzsKLSAgICBub25lKSBicmVhayA7OwotICAgIGVzYWMKLSAgICBpZiBkZXBtb2RlPSRkZXBtb2RlIFwKLSAgICAgICBzb3VyY2U9c3ViL2NvbmZ0ZXN0LmMgb2JqZWN0PSRhbV9fb2JqIFwKLSAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAotICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jICRhbV9fbWludXNfb2JqIHN1Yi9jb25mdGVzdC5jIFwKLSAgICAgICAgID4vZGV2L251bGwgMj5jb25mdGVzdC5lcnIgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdHN0MS5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDYuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgJGFtX19vYmogc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICAke01BS0UtbWFrZX0gLXMgLWYgY29uZm1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICMgaWNjIGRvZXNuJ3QgY2hva2Ugb24gdW5rbm93biBvcHRpb25zLCBpdCB3aWxsIGp1c3QgaXNzdWUgd2FybmluZ3MKLSAgICAgICMgb3IgcmVtYXJrcyAoZXZlbiB3aXRoIC1XZXJyb3IpLiAgU28gd2UgZ3JlcCBzdGRlcnIgZm9yIGFueSBtZXNzYWdlCi0gICAgICAjIHRoYXQgc2F5cyBhbiBvcHRpb24gd2FzIGlnbm9yZWQgb3Igbm90IHN1cHBvcnRlZC4KLSAgICAgICMgV2hlbiBnaXZlbiAtTVAsIGljYyA3LjAgYW5kIDcuMSBjb21wbGFpbiB0aHVzbHk6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgd2FybmluZzogaWdub3Jpbmcgb3B0aW9uICctTSc7IG5vIGFyZ3VtZW50IHJlcXVpcmVkCi0gICAgICAjIFRoZSBkaWFnbm9zaXMgY2hhbmdlZCBpbiBpY2MgOC4wOgotICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHJlbWFyazogb3B0aW9uICctTVAnIG5vdCBzdXBwb3J0ZWQKLSAgICAgIGlmIChncmVwICdpZ25vcmluZyBvcHRpb24nIGNvbmZ0ZXN0LmVyciB8fAotICAgICAgICAgIGdyZXAgJ25vdCBzdXBwb3J0ZWQnIGNvbmZ0ZXN0LmVycikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKLSAgICAgICAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9JGRlcG1vZGUKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotCi0gIGNkIC4uCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLWVsc2UKLSAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotZmkKLV0pCi1BQ19TVUJTVChbJDFERVBNT0RFXSwgW2RlcG1vZGU9JGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlXSkKLUFNX0NPTkRJVElPTkFMKFthbV9fZmFzdGRlcCQxXSwgWwotICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAotICAmJiB0ZXN0ICIkYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjM10pCi1dKQotCi0KLSMgQU1fU0VUX0RFUERJUgotIyAtLS0tLS0tLS0tLS0tCi0jIENob29zZSBhIGRpcmVjdG9yeSBuYW1lIGZvciBkZXBlbmRlbmN5IGZpbGVzLgotIyBUaGlzIG1hY3JvIGlzIEFDX1JFUVVJUkVkIGluIF9BTV9ERVBFTkRFTkNJRVMKLUFDX0RFRlVOKFtBTV9TRVRfREVQRElSXSwKLVtBQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAotQUNfU1VCU1QoW0RFUERJUl0sIFsiJHthbV9fbGVhZGluZ19kb3R9ZGVwcyJdKWRubAotXSkKLQotCi0jIEFNX0RFUF9UUkFDSwotIyAtLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtBTV9ERVBfVFJBQ0tdLAotW0FDX0FSR19FTkFCTEUoZGVwZW5kZW5jeS10cmFja2luZywKLVsgIC0tZGlzYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICBzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQKLSAgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyAgIGRvIG5vdCByZWplY3Qgc2xvdyBkZXBlbmRlbmN5IGV4dHJhY3RvcnNdKQotaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCi0gIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCi0gIEFNREVQQkFDS1NMQVNIPSdcJwotZmkKLUFNX0NPTkRJVElPTkFMKFtBTURFUF0sIFt0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm9dKQotQUNfU1VCU1QoW0FNREVQQkFDS1NMQVNIXSlkbmwKLV9BTV9TVUJTVF9OT1RNQUtFKFtBTURFUEJBQ0tTTEFTSF0pZG5sCi1dKQotCi0jIEdlbmVyYXRlIGNvZGUgdG8gc2V0IHVwIGRlcGVuZGVuY3kgdHJhY2tpbmcuICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA4Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSNzZXJpYWwgNQotCi0jIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAotW3sKLSAgIyBBdXRvY29uZiAyLjYyIHF1b3RlcyAtLWZpbGUgYXJndW1lbnRzIGZvciBldmFsLCBidXQgbm90IHdoZW4gZmlsZXMKLSAgIyBhcmUgbGlzdGVkIHdpdGhvdXQgLS1maWxlLiAgTGV0J3MgcGxheSBzYWZlIGFuZCBvbmx5IGVuYWJsZSB0aGUgZXZhbAotICAjIGlmIHdlIGRldGVjdCB0aGUgcXVvdGluZy4KLSAgY2FzZSAkQ09ORklHX0ZJTEVTIGluCi0gICpcJyopIGV2YWwgc2V0IHggIiRDT05GSUdfRklMRVMiIDs7Ci0gICopICAgc2V0IHggJENPTkZJR19GSUxFUyA7OwotICBlc2FjCi0gIHNoaWZ0Ci0gIGZvciBtZgotICBkbwotICAgICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0gICAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKLSAgICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgotICAgICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKLSAgICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KLSAgICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcwotICAgICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCi0gICAgIyBHcmVwJ2luZyB0aGUgd2hvbGUgZmlsZSBpcyBub3QgZ29vZCBlaXRoZXI6IEFJWCBncmVwIGhhcyBhIGxpbmUKLSAgICAjIGxpbWl0IG9mIDIwNDgsIGJ1dCBhbGwgc2VkJ3Mgd2Uga25vdyBoYXZlIHVuZGVyc3RhbmQgYXQgbGVhc3QgNDAwMC4KLSAgICBpZiBzZWQgLW4gJ3MsXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZS4qLFgscCcgIiRtZiIgfCBncmVwIFggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICBkaXJwYXJ0PWBBU19ESVJOQU1FKCIkbWYiKWAKLSAgICBlbHNlCi0gICAgICBjb250aW51ZQotICAgIGZpCi0gICAgIyBFeHRyYWN0IHRoZSBkZWZpbml0aW9uIG9mIERFUERJUiwgYW1fX2luY2x1ZGUsIGFuZCBhbV9fcXVvdGUKLSAgICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCi0gICAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKLSAgICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQotICAgIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAotICAgIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQotICAgIGFtX19xdW90ZT1gc2VkIC1uICdzL15hbV9fcXVvdGUgPSAvL3AnIDwgIiRtZiJgCi0gICAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKLSAgICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCi0gICAgIyBGaW5kIGFsbCBkZXBlbmRlbmN5IG91dHB1dCBmaWxlcywgdGhleSBhcmUgaW5jbHVkZWQgZmlsZXMgd2l0aAotICAgICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQotICAgICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCi0gICAgIyBleHBhbnNpb24uCi0gICAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCi0gICAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKLQkgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCi0gICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KLSAgICAgIHRlc3QgLWYgIiRkaXJwYXJ0LyRmaWxlIiAmJiBjb250aW51ZQotICAgICAgZmRpcj1gQVNfRElSTkFNRShbIiRmaWxlIl0pYAotICAgICAgQVNfTUtESVJfUChbJGRpcnBhcnQvJGZkaXJdKQotICAgICAgIyBlY2hvICJjcmVhdGluZyAkZGlycGFydC8kZmlsZSIKLSAgICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgotICAgIGRvbmUKLSAgZG9uZQotfQotXSkjIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUwotCi0KLSMgQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGhpcyBtYWNybyBzaG91bGQgb25seSBiZSBpbnZva2VkIG9uY2UgLS0gdXNlIHZpYSBBQ19SRVFVSVJFLgotIwotIyBUaGlzIGNvZGUgaXMgb25seSByZXF1aXJlZCB3aGVuIGF1dG9tYXRpYyBkZXBlbmRlbmN5IHRyYWNraW5nCi0jIGlzIGVuYWJsZWQuICBGSVhNRS4gIFRoaXMgY3JlYXRlcyBlYWNoIGAuUCcgZmlsZSB0aGF0IHdlIHdpbGwKLSMgbmVlZCBpbiBvcmRlciB0byBib290c3RyYXAgdGhlIGRlcGVuZGVuY3kgaGFuZGxpbmcgY29kZS4KLUFDX0RFRlVOKFtBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCi1bQUNfQ09ORklHX0NPTU1BTkRTKFtkZXBmaWxlc10sCi0gICAgIFt0ZXN0IHgiJEFNREVQX1RSVUUiICE9IHgiIiB8fCBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAotICAgICBbQU1ERVBfVFJVRT0iJEFNREVQX1RSVUUiIGFjX2F1eF9kaXI9IiRhY19hdXhfZGlyIl0pCi1dKQotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMjAwMCwgMjAwMSwgMjAwMywgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA4Ci0KLSMgQU1fQ09ORklHX0hFQURFUiBpcyBvYnNvbGV0ZS4gIEl0IGhhcyBiZWVuIHJlcGxhY2VkIGJ5IEFDX0NPTkZJR19IRUFERVJTLgotQVVfREVGVU4oW0FNX0NPTkZJR19IRUFERVJdLCBbQUNfQ09ORklHX0hFQURFUlMoJEApXSkKLQotIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwKLSMgMjAwNSwgMjAwNiwgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAxNgotCi0jIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaC4gIFNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZgotIyB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4gIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIEFNX0lOSVRfQVVUT01BS0UoUEFDS0FHRSwgVkVSU0lPTiwgW05PLURFRklORV0pCi0jIEFNX0lOSVRfQVVUT01BS0UoW09QVElPTlNdKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUaGUgY2FsbCB3aXRoIFBBQ0tBR0UgYW5kIFZFUlNJT04gYXJndW1lbnRzIGlzIHRoZSBvbGQgc3R5bGUKLSMgY2FsbCAocHJlIGF1dG9jb25mLTIuNTApLCB3aGljaCBpcyBiZWluZyBwaGFzZWQgb3V0LiAgUEFDS0FHRQotIyBhbmQgVkVSU0lPTiBzaG91bGQgbm93IGJlIHBhc3NlZCB0byBBQ19JTklUIGFuZCByZW1vdmVkIGZyb20KLSMgdGhlIGNhbGwgdG8gQU1fSU5JVF9BVVRPTUFLRS4KLSMgV2Ugc3VwcG9ydCBib3RoIGNhbGwgc3R5bGVzIGZvciB0aGUgdHJhbnNpdGlvbi4gIEFmdGVyCi0jIHRoZSBuZXh0IEF1dG9tYWtlIHJlbGVhc2UsIEF1dG9jb25mIGNhbiBtYWtlIHRoZSBBQ19JTklUCi0jIGFyZ3VtZW50cyBtYW5kYXRvcnksIGFuZCB0aGVuIHdlIGNhbiBkZXBlbmQgb24gYSBuZXcgQXV0b2NvbmYKLSMgcmVsZWFzZSBhbmQgZHJvcCB0aGUgb2xkIGNhbGwgc3VwcG9ydC4KLUFDX0RFRlVOKFtBTV9JTklUX0FVVE9NQUtFXSwKLVtBQ19QUkVSRVEoWzIuNjJdKWRubAotZG5sIEF1dG9jb25mIHdhbnRzIHRvIGRpc2FsbG93IEFNXyBuYW1lcy4gIFdlIGV4cGxpY2l0bHkgYWxsb3cKLWRubCB0aGUgb25lcyB3ZSBjYXJlIGFib3V0LgotbTRfcGF0dGVybl9hbGxvdyhbXkFNX1tBLVpdK0ZMQUdTJF0pZG5sCi1BQ19SRVFVSVJFKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pZG5sCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiOyB0aGVuCi0gICMgVXNlIC1JJChzcmNkaXIpIG9ubHkgd2hlbiAkKHNyY2RpcikgIT0gLiwgc28gdGhhdCBtYWtlJ3Mgb3V0cHV0Ci0gICMgaXMgbm90IHBvbGx1dGVkIHdpdGggcmVwZWF0ZWQgIi1JLiIKLSAgQUNfU1VCU1QoW2FtX19pc3JjXSwgWycgLUkkKHNyY2RpciknXSlfQU1fU1VCU1RfTk9UTUFLRShbYW1fX2lzcmNdKWRubAotICAjIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKLSAgaWYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCi0gIGZpCi1maQotCi0jIHRlc3Qgd2hldGhlciB3ZSBoYXZlIGN5Z3BhdGgKLWlmIHRlc3QgLXogIiRDWUdQQVRIX1ciOyB0aGVuCi0gIGlmIChjeWdwYXRoIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIENZR1BBVEhfVz0nY3lncGF0aCAtdycKLSAgZWxzZQotICAgIENZR1BBVEhfVz1lY2hvCi0gIGZpCi1maQotQUNfU1VCU1QoW0NZR1BBVEhfV10pCi0KLSMgRGVmaW5lIHRoZSBpZGVudGl0eSBvZiB0aGUgcGFja2FnZS4KLWRubCBEaXN0aW5ndWlzaCBiZXR3ZWVuIG9sZC1zdHlsZSBhbmQgbmV3LXN0eWxlIGNhbGxzLgotbTRfaWZ2YWwoWyQyXSwKLVttNF9pZnZhbChbJDNdLCBbX0FNX1NFVF9PUFRJT04oW25vLWRlZmluZV0pXSlkbmwKLSBBQ19TVUJTVChbUEFDS0FHRV0sIFskMV0pZG5sCi0gQUNfU1VCU1QoW1ZFUlNJT05dLCBbJDJdKV0sCi1bX0FNX1NFVF9PUFRJT05TKFskMV0pZG5sCi1kbmwgRGlhZ25vc2Ugb2xkLXN0eWxlIEFDX0lOSVQgd2l0aCBuZXctc3R5bGUgQU1fQVVUT01BS0VfSU5JVC4KLW00X2lmKG00X2lmZGVmKFtBQ19QQUNLQUdFX05BTUVdLCAxKW00X2lmZGVmKFtBQ19QQUNLQUdFX1ZFUlNJT05dLCAxKSwgMTEsLAotICBbbTRfZmF0YWwoW0FDX0lOSVQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHBhY2thZ2UgYW5kIHZlcnNpb24gYXJndW1lbnRzXSldKWRubAotIEFDX1NVQlNUKFtQQUNLQUdFXSwgWydBQ19QQUNLQUdFX1RBUk5BTUUnXSlkbmwKLSBBQ19TVUJTVChbVkVSU0lPTl0sIFsnQUNfUEFDS0FHRV9WRVJTSU9OJ10pXSlkbmwKLQotX0FNX0lGX09QVElPTihbbm8tZGVmaW5lXSwsCi1bQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotIEFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pXSlkbmwKLQotIyBTb21lIHRvb2xzIEF1dG9tYWtlIG5lZWRzLgotQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSlkbmwKLUFNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLSR7YW1fX2FwaV92ZXJzaW9ufSkKLUFNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYpCi1BTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSkKLUFNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyKQotQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbykKLUFDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCi1BQ19SRVFVSVJFKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdKWRubAotQUNfUkVRVUlSRShbQU1fUFJPR19NS0RJUl9QXSlkbmwKLSMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCi0jIHNvbWUgcGxhdGZvcm1zLgotQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi1BQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAotX0FNX0lGX09QVElPTihbdGFyLXVzdGFyXSwgW19BTV9QUk9HX1RBUihbdXN0YXJdKV0sCi0JICAgICAgW19BTV9JRl9PUFRJT04oW3Rhci1wYXhdLCBbX0FNX1BST0dfVEFSKFtwYXhdKV0sCi0JCQkgICAgIFtfQU1fUFJPR19UQVIoW3Y3XSldKV0pCi1fQU1fSUZfT1BUSU9OKFtuby1kZXBlbmRlbmNpZXNdLCwKLVtBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DQ10sCi0JCSAgW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSwKLQkJICBbZGVmaW5lKFtBQ19QUk9HX0NDXSwKLQkJCSAgZGVmbihbQUNfUFJPR19DQ10pW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSldKWRubAotQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKLQkJICBbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSwKLQkJICBbZGVmaW5lKFtBQ19QUk9HX0NYWF0sCi0JCQkgIGRlZm4oW0FDX1BST0dfQ1hYXSlbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSldKWRubAotQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfT0JKQ10sCi0JCSAgW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldLAotCQkgIFtkZWZpbmUoW0FDX1BST0dfT0JKQ10sCi0JCQkgIGRlZm4oW0FDX1BST0dfT0JKQ10pW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldKV0pZG5sCi1dKQotX0FNX0lGX09QVElPTihbc2lsZW50LXJ1bGVzXSwgW0FDX1JFUVVJUkUoW0FNX1NJTEVOVF9SVUxFU10pXSlkbmwKLWRubCBUaGUgYHBhcmFsbGVsLXRlc3RzJyBkcml2ZXIgbWF5IG5lZWQgdG8ga25vdyBhYm91dCBFWEVFWFQsIHNvIGFkZCB0aGUKLWRubCBgYW1fX0VYRUVYVCcgY29uZGl0aW9uYWwgaWYgX0FNX0NPTVBJTEVSX0VYRUVYVCB3YXMgc2Vlbi4gIFRoaXMgbWFjcm8KLWRubCBpcyBob29rZWQgb250byBfQUNfQ09NUElMRVJfRVhFRVhUIGVhcmx5LCBzZWUgYmVsb3cuCi1BQ19DT05GSUdfQ09NTUFORFNfUFJFKGRubAotW200X3Byb3ZpZGVfaWYoW19BTV9DT01QSUxFUl9FWEVFWFRdLAotICBbQU1fQ09ORElUSU9OQUwoW2FtX19FWEVFWFRdLCBbdGVzdCAtbiAiJEVYRUVYVCJdKV0pXSlkbmwKLV0pCi0KLWRubCBIb29rIGludG8gYF9BQ19DT01QSUxFUl9FWEVFWFQnIGVhcmx5IHRvIGxlYXJuIGl0cyBleHBhbnNpb24uICBEbyBub3QKLWRubCBhZGQgdGhlIGNvbmRpdGlvbmFsIHJpZ2h0IGhlcmUsIGFzIF9BQ19DT01QSUxFUl9FWEVFWFQgbWF5IGJlIGZ1cnRoZXIKLWRubCBtYW5nbGVkIGJ5IEF1dG9jb25mIGFuZCBydW4gaW4gYSBzaGVsbCBjb25kaXRpb25hbCBzdGF0ZW1lbnQuCi1tNF9kZWZpbmUoW19BQ19DT01QSUxFUl9FWEVFWFRdLAotbTRfZGVmbihbX0FDX0NPTVBJTEVSX0VYRUVYVF0pW200X3Byb3ZpZGUoW19BTV9DT01QSUxFUl9FWEVFWFRdKV0pCi0KLQotIyBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgotIyBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKLSMgdGhhdCBpcyBnZW5lcmF0ZWQuICBUaGUgc3RhbXAgZmlsZXMgYXJlIG51bWJlcmVkIHRvIGhhdmUgZGlmZmVyZW50IG5hbWVzLgotCi0jIEF1dG9jb25mIGNhbGxzIF9BQ19BTV9DT05GSUdfSEVBREVSX0hPT0sgKHdoZW4gZGVmaW5lZCkgaW4gdGhlCi0jIGxvb3Agd2hlcmUgY29uZmlnLnN0YXR1cyBjcmVhdGVzIHRoZSBoZWFkZXJzLCBzbyB3ZSBjYW4gZ2VuZXJhdGUKLSMgb3VyIHN0YW1wIGZpbGVzIHRoZXJlLgotQUNfREVGVU4oW19BQ19BTV9DT05GSUdfSEVBREVSX0hPT0tdLAotWyMgQ29tcHV0ZSAkMSdzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KLV9hbV9hcmc9JDEKLV9hbV9zdGFtcF9jb3VudD0xCi1mb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KLSAgY2FzZSAkX2FtX2hlYWRlciBpbgotICAgICRfYW1fYXJnIHwgJF9hbV9hcmc6KiApCi0gICAgICBicmVhayA7OwotICAgICogKQotICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OwotICBlc2FjCi1kb25lCi1lY2hvICJ0aW1lc3RhbXAgZm9yICRfYW1fYXJnIiA+YEFTX0RJUk5BTUUoWyIkX2FtX2FyZyJdKWAvc3RhbXAtaFtdJF9hbV9zdGFtcF9jb3VudF0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEFNX1BST0dfSU5TVEFMTF9TSAotIyAtLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lICRpbnN0YWxsX3NoLgotQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TSF0sCi1bQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAotaWYgdGVzdCB4IiR7aW5zdGFsbF9zaH0iICE9IHhzZXQ7IHRoZW4KLSAgY2FzZSAkYW1fYXV4X2RpciBpbgotICAqXCAqIHwgKlwJKikKLSAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJyRhbV9hdXhfZGlyL2luc3RhbGwtc2gnIiA7OwotICAqKQotICAgIGluc3RhbGxfc2g9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9pbnN0YWxsLXNoIgotICBlc2FjCi1maQotQUNfU1VCU1QoaW5zdGFsbF9zaCldKQotCi0jIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMgotCi0jIENoZWNrIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgZmlsZS1zeXN0ZW0gc3VwcG9ydHMgZmlsZW5hbWVzCi0jIHdpdGggYSBsZWFkaW5nIGRvdC4gIEZvciBpbnN0YW5jZSBNUy1ET1MgZG9lc24ndC4KLUFDX0RFRlVOKFtBTV9TRVRfTEVBRElOR19ET1RdLAotW3JtIC1yZiAudHN0IDI+L2Rldi9udWxsCi1ta2RpciAudHN0IDI+L2Rldi9udWxsCi1pZiB0ZXN0IC1kIC50c3Q7IHRoZW4KLSAgYW1fX2xlYWRpbmdfZG90PS4KLWVsc2UKLSAgYW1fX2xlYWRpbmdfZG90PV8KLWZpCi1ybWRpciAudHN0IDI+L2Rldi9udWxsCi1BQ19TVUJTVChbYW1fX2xlYWRpbmdfZG90XSldKQotCi0jIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4gICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA4Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDUKLQotIyBBTV9NQUlOVEFJTkVSX01PREUoW0RFRkFVTFQtTU9ERV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29udHJvbCBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcy4KLSMgRGVmYXVsdCBpcyB0byBkaXNhYmxlIHRoZW0sIHVubGVzcyBgZW5hYmxlJyBpcyBwYXNzZWQgbGl0ZXJhbGx5LgotIyBGb3Igc3ltbWV0cnksIGBkaXNhYmxlJyBtYXkgYmUgcGFzc2VkIGFzIHdlbGwuICBBbnl3YXksIHRoZSB1c2VyCi0jIGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCB3aXRoIHRoZSAtLWVuYWJsZS8tLWRpc2FibGUgc3dpdGNoLgotQUNfREVGVU4oW0FNX01BSU5UQUlORVJfTU9ERV0sCi1bbTRfY2FzZShtNF9kZWZhdWx0KFskMV0sIFtkaXNhYmxlXSksCi0gICAgICAgW2VuYWJsZV0sIFttNF9kZWZpbmUoW2FtX21haW50YWluZXJfb3RoZXJdLCBbZGlzYWJsZV0pXSwKLSAgICAgICBbZGlzYWJsZV0sIFttNF9kZWZpbmUoW2FtX21haW50YWluZXJfb3RoZXJdLCBbZW5hYmxlXSldLAotICAgICAgIFttNF9kZWZpbmUoW2FtX21haW50YWluZXJfb3RoZXJdLCBbZW5hYmxlXSkKLSAgICAgICAgbTRfd2Fybihbc3ludGF4XSwgW3VuZXhwZWN0ZWQgYXJndW1lbnQgdG8gQU1AJnRAX01BSU5UQUlORVJfTU9ERTogJDFdKV0pCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYW1fbWFpbnRhaW5lcl9vdGhlciBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCi0gIGRubCBtYWludGFpbmVyLW1vZGUncyBkZWZhdWx0IGlzICdkaXNhYmxlJyB1bmxlc3MgJ2VuYWJsZScgaXMgcGFzc2VkCi0gIEFDX0FSR19FTkFCTEUoW21haW50YWluZXItbW9kZV0sCi1bICAtLV1bYW1fbWFpbnRhaW5lcl9vdGhlcl1bLW1haW50YWluZXItbW9kZSAgYW1fbWFpbnRhaW5lcl9vdGhlciBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotCQkJICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyXSwKLSAgICAgIFtVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWxdLAotICAgICAgW1VTRV9NQUlOVEFJTkVSX01PREU9XW00X2lmKGFtX21haW50YWluZXJfb3RoZXIsIFtlbmFibGVdLCBbbm9dLCBbeWVzXSkpCi0gIEFDX01TR19SRVNVTFQoWyRVU0VfTUFJTlRBSU5FUl9NT0RFXSkKLSAgQU1fQ09ORElUSU9OQUwoW01BSU5UQUlORVJfTU9ERV0sIFt0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzXSkKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIEFDX1NVQlNUKFtNQUlOVF0pZG5sCi1dCi0pCi0KLUFVX0RFRlVOKFtqbV9NQUlOVEFJTkVSX01PREVdLCBbQU1fTUFJTlRBSU5FUl9NT0RFXSkKLQotIyBDaGVjayB0byBzZWUgaG93ICdtYWtlJyB0cmVhdHMgaW5jbHVkZXMuCSAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDQKLQotIyBBTV9NQUtFX0lOQ0xVREUoKQotIyAtLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayB0byBzZWUgaG93IG1ha2UgdHJlYXRzIGluY2x1ZGVzLgotQUNfREVGVU4oW0FNX01BS0VfSU5DTFVERV0sCi1bYW1fbWFrZT0ke01BS0UtbWFrZX0KLWNhdCA+IGNvbmZpbmMgPDwgJ0VORCcKLWFtX19kb2l0OgotCUBlY2hvIHRoaXMgaXMgdGhlIGFtX19kb2l0IHRhcmdldAotLlBIT05ZOiBhbV9fZG9pdAotRU5ECi0jIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2VdKQotYW1fX2luY2x1ZGU9IiMiCi1hbV9fcXVvdGU9Ci1fYW1fcmVzdWx0PW5vbmUKLSMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCi1lY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCi0jIElnbm9yZSBhbGwga2luZHMgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJvbSBgbWFrZScuCi1jYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAotKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCi0gIGFtX19pbmNsdWRlPWluY2x1ZGUKLSAgYW1fX3F1b3RlPQotICBfYW1fcmVzdWx0PUdOVQotICA7OwotZXNhYwotIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCi1pZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCi0gICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCi0gICBjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAotICAgKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCi0gICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCi0gICAgIGFtX19xdW90ZT0iXCIiCi0gICAgIF9hbV9yZXN1bHQ9QlNECi0gICAgIDs7Ci0gICBlc2FjCi1maQotQUNfU1VCU1QoW2FtX19pbmNsdWRlXSkKLUFDX1NVQlNUKFthbV9fcXVvdGVdKQotQUNfTVNHX1JFU1VMVChbJF9hbV9yZXN1bHRdKQotcm0gLWYgY29uZmluYyBjb25mbWYKLV0pCi0KLSMgRmFrZSB0aGUgZXhpc3RlbmNlIG9mIHByb2dyYW1zIHRoYXQgR05VIG1haW50YWluZXJzIHVzZS4gIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDgKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgNgotCi0jIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtBTV9NSVNTSU5HX1BST0ddLAotW0FDX1JFUVVJUkUoW0FNX01JU1NJTkdfSEFTX1JVTl0pCi0kMT0keyQxLSIke2FtX21pc3NpbmdfcnVufSQyIn0KLUFDX1NVQlNUKCQxKV0pCi0KLQotIyBBTV9NSVNTSU5HX0hBU19SVU4KLSMgLS0tLS0tLS0tLS0tLS0tLS0tCi0jIERlZmluZSBNSVNTSU5HIGlmIG5vdCBkZWZpbmVkIHNvIGZhciBhbmQgdGVzdCBpZiBpdCBzdXBwb3J0cyAtLXJ1bi4KLSMgSWYgaXQgZG9lcywgc2V0IGFtX21pc3NpbmdfcnVuIHRvIHVzZSBpdCwgb3RoZXJ3aXNlLCB0byBub3RoaW5nLgotQUNfREVGVU4oW0FNX01JU1NJTkdfSEFTX1JVTl0sCi1bQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAotQUNfUkVRVUlSRV9BVVhfRklMRShbbWlzc2luZ10pZG5sCi1pZiB0ZXN0IHgiJHtNSVNTSU5HK3NldH0iICE9IHhzZXQ7IHRoZW4KLSAgY2FzZSAkYW1fYXV4X2RpciBpbgotICAqXCAqIHwgKlwJKikKLSAgICBNSVNTSU5HPSJcJHtTSEVMTH0gXCIkYW1fYXV4X2Rpci9taXNzaW5nXCIiIDs7Ci0gICopCi0gICAgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciIDs7Ci0gIGVzYWMKLWZpCi0jIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKLWlmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCi0gIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCi1lbHNlCi0gIGFtX21pc3NpbmdfcnVuPQotICBBQ19NU0dfV0FSTihbYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmddKQotZmkKLV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEFNX1BST0dfTUtESVJfUAotIyAtLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgZm9yIGBta2RpciAtcCcuCi1BQ19ERUZVTihbQU1fUFJPR19NS0RJUl9QXSwKLVtBQ19QUkVSRVEoWzIuNjBdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19NS0RJUl9QXSlkbmwKLWRubCBBdXRvbWFrZSAxLjggdG8gMS45LjYgdXNlZCB0byBkZWZpbmUgbWtkaXJfcC4gIFdlIG5vdyB1c2UgTUtESVJfUCwKLWRubCB3aGlsZSBrZWVwaW5nIGEgZGVmaW5pdGlvbiBvZiBta2Rpcl9wIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotZG5sIEBNS0RJUl9QQCBpcyBtYWdpYzogQUNfT1VUUFVUIGFkanVzdHMgaXRzIHZhbHVlIGZvciBlYWNoIE1ha2VmaWxlLgotZG5sIEhvd2V2ZXIgd2UgY2Fubm90IGRlZmluZSBta2Rpcl9wIGFzICQoTUtESVJfUCkgZm9yIHRoZSBzYWtlIG9mCi1kbmwgTWFrZWZpbGUuaW5zIHRoYXQgZG8gbm90IGRlZmluZSBNS0RJUl9QLCBzbyB3ZSBkbyBvdXIgb3duCi1kbmwgYWRqdXN0bWVudCB1c2luZyB0b3BfYnVpbGRkaXIgKHdoaWNoIGlzIGRlZmluZWQgbW9yZSBvZnRlbiB0aGFuCi1kbmwgTUtESVJfUCkuCi1BQ19TVUJTVChbbWtkaXJfcF0sIFsiJE1LRElSX1AiXSlkbmwKLWNhc2UgJG1rZGlyX3AgaW4KLSAgW1tcXC8kXV0qIHwgPzpbW1xcL11dKikgOzsKLSAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OwotZXNhYwotXSkKLQotIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvcHRpb24gaGFuZGxpbmcuICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSwgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgNAotCi0jIF9BTV9NQU5HTEVfT1BUSU9OKE5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0FNX01BTkdMRV9PUFRJT05dLAotW1tfQU1fT1BUSU9OX11tNF9icGF0c3Vic3QoJDEsIFtbXmEtekEtWjAtOV9dXSwgW19dKV0pCi0KLSMgX0FNX1NFVF9PUFRJT04oTkFNRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFNldCBvcHRpb24gTkFNRS4gIFByZXNlbnRseSB0aGF0IG9ubHkgbWVhbnMgZGVmaW5pbmcgYSBmbGFnIGZvciB0aGlzIG9wdGlvbi4KLUFDX0RFRlVOKFtfQU1fU0VUX09QVElPTl0sCi1bbTRfZGVmaW5lKF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCAxKV0pCi0KLSMgX0FNX1NFVF9PUFRJT05TKE9QVElPTlMpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgT1BUSU9OUyBpcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIEF1dG9tYWtlIG9wdGlvbnMuCi1BQ19ERUZVTihbX0FNX1NFVF9PUFRJT05TXSwKLVttNF9mb3JlYWNoX3coW19BTV9PcHRpb25dLCBbJDFdLCBbX0FNX1NFVF9PUFRJT04oX0FNX09wdGlvbildKV0pCi0KLSMgX0FNX0lGX09QVElPTihPUFRJT04sIElGLVNFVCwgW0lGLU5PVC1TRVRdKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEV4ZWN1dGUgSUYtU0VUIGlmIE9QVElPTiBpcyBzZXQsIElGLU5PVC1TRVQgb3RoZXJ3aXNlLgotQUNfREVGVU4oW19BTV9JRl9PUFRJT05dLAotW200X2lmc2V0KF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCBbJDJdLCBbJDNdKV0pCi0KLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDUsIDIwMDgKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgNQotCi0jIEFNX1NBTklUWV9DSEVDSwotIyAtLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtBTV9TQU5JVFlfQ0hFQ0tdLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0LmZpbGUKLSMgUmVqZWN0IHVuc2FmZSBjaGFyYWN0ZXJzIGluICRzcmNkaXIgb3IgdGhlIGFic29sdXRlIHdvcmtpbmcgZGlyZWN0b3J5Ci0jIG5hbWUuICBBY2NlcHQgc3BhY2UgYW5kIHRhYiBvbmx5IGluIHRoZSBsYXR0ZXIuCi1hbV9sZj0nCi0nCi1jYXNlIGBwd2RgIGluCi0gICpbW1xcXCJcI1wkXCZcJ1xgJGFtX2xmXV0qKQotICAgIEFDX01TR19FUlJPUihbdW5zYWZlIGFic29sdXRlIHdvcmtpbmcgZGlyZWN0b3J5IG5hbWVdKTs7Ci1lc2FjCi1jYXNlICRzcmNkaXIgaW4KLSAgKltbXFxcIlwjXCRcJlwnXGAkYW1fbGZcIFwJXV0qKQotICAgIEFDX01TR19FUlJPUihbdW5zYWZlIHNyY2RpciB2YWx1ZTogYCRzcmNkaXInXSk7OwotZXNhYwotCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkWypdIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGVgCi0gICBmaQotICAgcm0gLWYgY29uZnRlc3QuZmlsZQotICAgaWYgdGVzdCAiJFsqXSIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJFsqXSIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKLSAgIGZpCi0KLSAgIHRlc3QgIiRbMl0iID0gY29uZnRlc3QuZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCi1maQotQUNfTVNHX1JFU1VMVCh5ZXMpXSkKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgQU1fUFJPR19JTlNUQUxMX1NUUklQCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBPbmUgaXNzdWUgd2l0aCB2ZW5kb3IgYGluc3RhbGwnIChldmVuIEdOVSkgaXMgdGhhdCB5b3UgY2FuJ3QKLSMgc3BlY2lmeSB0aGUgcHJvZ3JhbSB1c2VkIHRvIHN0cmlwIGJpbmFyaWVzLiAgVGhpcyBpcyBlc3BlY2lhbGx5Ci0jIGFubm95aW5nIGluIGNyb3NzLWNvbXBpbGluZyBlbnZpcm9ubWVudHMsIHdoZXJlIHRoZSBidWlsZCdzIHN0cmlwCi0jIGlzIHVubGlrZWx5IHRvIGhhbmRsZSB0aGUgaG9zdCdzIGJpbmFyaWVzLgotIyBGb3J0dW5hdGVseSBpbnN0YWxsLXNoIHdpbGwgaG9ub3IgYSBTVFJJUFBST0cgdmFyaWFibGUsIHNvIHdlCi0jIGFsd2F5cyB1c2UgaW5zdGFsbC1zaCBpbiBgbWFrZSBpbnN0YWxsLXN0cmlwJywgYW5kIGluaXRpYWxpemUKLSMgU1RSSVBQUk9HIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBTVFJJUCB2YXJpYWJsZSAoc2V0IGJ5IHRoZSB1c2VyKS4KLUFDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdLAotW0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCi0jIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKLSMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKLSMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKLSMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCi1kbmwgRG9uJ3QgdGVzdCBmb3IgJGNyb3NzX2NvbXBpbGluZyA9IHllcywgYmVjYXVzZSBpdCBtaWdodCBiZSBgbWF5YmUnLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KLSAgQUNfQ0hFQ0tfVE9PTChbU1RSSVBdLCBbc3RyaXBdLCA6KQotZmkKLUlOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCQoaW5zdGFsbF9zaCkgLWMgLXMiCi1BQ19TVUJTVChbSU5TVEFMTF9TVFJJUF9QUk9HUkFNXSldKQotCi0jIENvcHlyaWdodCAoQykgMjAwNiwgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMgotCi0jIF9BTV9TVUJTVF9OT1RNQUtFKFZBUklBQkxFKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUHJldmVudCBBdXRvbWFrZSBmcm9tIG91dHB1dHRpbmcgVkFSSUFCTEUgPSBAVkFSSUFCTEVAIGluIE1ha2VmaWxlLmluLgotIyBUaGlzIG1hY3JvIGlzIHRyYWNlZCBieSBBdXRvbWFrZS4KLUFDX0RFRlVOKFtfQU1fU1VCU1RfTk9UTUFLRV0pCi0KLSMgQU1fU1VCU1RfTk9UTUFLRShWQVJJQUJMRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFB1YmxpYyBzaXN0ZXIgb2YgX0FNX1NVQlNUX05PVE1BS0UuCi1BQ19ERUZVTihbQU1fU1VCU1RfTk9UTUFLRV0sIFtfQU1fU1VCU1RfTk9UTUFLRSgkQCldKQotCi0jIENoZWNrIGhvdyB0byBjcmVhdGUgYSB0YXJiYWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAyCi0KLSMgX0FNX1BST0dfVEFSKEZPUk1BVCkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwgaW4gZm9ybWF0IEZPUk1BVC4KLSMgRk9STUFUIHNob3VsZCBiZSBvbmUgb2YgYHY3JywgYHVzdGFyJywgb3IgYHBheCcuCi0jCi0jIFN1YnN0aXR1dGUgYSB2YXJpYWJsZSAkKGFtX190YXIpIHRoYXQgaXMgYSBjb21tYW5kCi0jIHdyaXRpbmcgdG8gc3Rkb3V0IGEgRk9STUFULXRhcmJhbGwgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5Ci0jICR0YXJkaXIuCi0jICAgICB0YXJkaXI9ZGlyZWN0b3J5ICYmICQoYW1fX3RhcikgPiByZXN1bHQudGFyCi0jCi0jIFN1YnN0aXR1dGUgYSB2YXJpYWJsZSAkKGFtX191bnRhcikgdGhhdCBleHRyYWN0IHN1Y2gKLSMgYSB0YXJiYWxsIHJlYWQgZnJvbSBzdGRpbi4KLSMgICAgICQoYW1fX3VudGFyKSA8IHJlc3VsdC50YXIKLUFDX0RFRlVOKFtfQU1fUFJPR19UQVJdLAotWyMgQWx3YXlzIGRlZmluZSBBTVRBUiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLUFNX01JU1NJTkdfUFJPRyhbQU1UQVJdLCBbdGFyXSkKLW00X2lmKFskMV0sIFt2N10sCi0gICAgIFthbV9fdGFyPScke0FNVEFSfSBjaG9mIC0gIiQkdGFyZGlyIic7IGFtX191bnRhcj0nJHtBTVRBUn0geGYgLSddLAotICAgICBbbTRfY2FzZShbJDFdLCBbdXN0YXJdLCwgW3BheF0sLAotICAgICAgICAgICAgICBbbTRfZmF0YWwoW1Vua25vd24gdGFyIGZvcm1hdF0pXSkKLUFDX01TR19DSEVDS0lORyhbaG93IHRvIGNyZWF0ZSBhICQxIHRhciBhcmNoaXZlXSkKLSMgTG9vcCBvdmVyIGFsbCBrbm93biBtZXRob2RzIHRvIGNyZWF0ZSBhIHRhciBhcmNoaXZlIHVudGlsIG9uZSB3b3Jrcy4KLV9hbV90b29scz0nZ251dGFyIG00X2lmKFskMV0sIFt1c3Rhcl0sIFtwbGFpbnRhcl0pIHBheCBjcGlvIG5vbmUnCi1fYW1fdG9vbHM9JHthbV9jdl9wcm9nX3Rhcl8kMS0kX2FtX3Rvb2xzfQotIyBEbyBub3QgZm9sZCB0aGUgYWJvdmUgdHdvIGxpbmUgaW50byBvbmUsIGJlY2F1c2UgVHJ1NjQgc2ggYW5kCi0jIFNvbGFyaXMgc2ggd2lsbCBub3QgZ3JvayBzcGFjZXMgaW4gdGhlIHJocyBvZiBgLScuCi1mb3IgX2FtX3Rvb2wgaW4gJF9hbV90b29scwotZG8KLSAgY2FzZSAkX2FtX3Rvb2wgaW4KLSAgZ251dGFyKQotICAgIGZvciBfYW1fdGFyIGluIHRhciBnbnV0YXIgZ3RhcjsKLSAgICBkbwotICAgICAgQU1fUlVOX0xPRyhbJF9hbV90YXIgLS12ZXJzaW9uXSkgJiYgYnJlYWsKLSAgICBkb25lCi0gICAgYW1fX3Rhcj0iJF9hbV90YXIgLS1mb3JtYXQ9bTRfaWYoWyQxXSwgW3BheF0sIFtwb3NpeF0sIFskMV0pIC1jaGYgLSAiJyIkJHRhcmRpciInCi0gICAgYW1fX3Rhcl89IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJHRhcmRpciInCi0gICAgYW1fX3VudGFyPSIkX2FtX3RhciAteGYgLSIKLSAgICA7OwotICBwbGFpbnRhcikKLSAgICAjIE11c3Qgc2tpcCBHTlUgdGFyOiBpZiBpdCBkb2VzIG5vdCBzdXBwb3J0IC0tZm9ybWF0PSBpdCBkb2Vzbid0IGNyZWF0ZQotICAgICMgdXN0YXIgdGFyYmFsbCBlaXRoZXIuCi0gICAgKHRhciAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMSAmJiBjb250aW51ZQotICAgIGFtX190YXI9J3RhciBjaGYgLSAiJCR0YXJkaXIiJwotICAgIGFtX190YXJfPSd0YXIgY2hmIC0gIiR0YXJkaXIiJwotICAgIGFtX191bnRhcj0ndGFyIHhmIC0nCi0gICAgOzsKLSAgcGF4KQotICAgIGFtX190YXI9J3BheCAtTCAteCAkMSAtdyAiJCR0YXJkaXIiJwotICAgIGFtX190YXJfPSdwYXggLUwgLXggJDEgLXcgIiR0YXJkaXIiJwotICAgIGFtX191bnRhcj0ncGF4IC1yJwotICAgIDs7Ci0gIGNwaW8pCi0gICAgYW1fX3Rhcj0nZmluZCAiJCR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCi0gICAgYW1fX3Rhcl89J2ZpbmQgIiR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCi0gICAgYW1fX3VudGFyPSdjcGlvIC1pIC1IICQxIC1kJwotICAgIDs7Ci0gIG5vbmUpCi0gICAgYW1fX3Rhcj1mYWxzZQotICAgIGFtX190YXJfPWZhbHNlCi0gICAgYW1fX3VudGFyPWZhbHNlCi0gICAgOzsKLSAgZXNhYwotCi0gICMgSWYgdGhlIHZhbHVlIHdhcyBjYWNoZWQsIHN0b3Agbm93LiAgV2UganVzdCB3YW50ZWQgdG8gaGF2ZSBhbV9fdGFyCi0gICMgYW5kIGFtX191bnRhciBzZXQuCi0gIHRlc3QgLW4gIiR7YW1fY3ZfcHJvZ190YXJfJDF9IiAmJiBicmVhawotCi0gICMgdGFyL3VudGFyIGEgZHVtbXkgZGlyZWN0b3J5LCBhbmQgc3RvcCBpZiB0aGUgY29tbWFuZCB3b3JrcwotICBybSAtcmYgY29uZnRlc3QuZGlyCi0gIG1rZGlyIGNvbmZ0ZXN0LmRpcgotICBlY2hvIEdyZXBNZSA+IGNvbmZ0ZXN0LmRpci9maWxlCi0gIEFNX1JVTl9MT0coW3RhcmRpcj1jb25mdGVzdC5kaXIgJiYgZXZhbCAkYW1fX3Rhcl8gPmNvbmZ0ZXN0LnRhcl0pCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLSAgaWYgdGVzdCAtcyBjb25mdGVzdC50YXI7IHRoZW4KLSAgICBBTV9SVU5fTE9HKFskYW1fX3VudGFyIDxjb25mdGVzdC50YXJdKQotICAgIGdyZXAgR3JlcE1lIGNvbmZ0ZXN0LmRpci9maWxlID4vZGV2L251bGwgMj4mMSAmJiBicmVhawotICBmaQotZG9uZQotcm0gLXJmIGNvbmZ0ZXN0LmRpcgotCi1BQ19DQUNIRV9WQUwoW2FtX2N2X3Byb2dfdGFyXyQxXSwgW2FtX2N2X3Byb2dfdGFyXyQxPSRfYW1fdG9vbF0pCi1BQ19NU0dfUkVTVUxUKFskYW1fY3ZfcHJvZ190YXJfJDFdKV0pCi1BQ19TVUJTVChbYW1fX3Rhcl0pCi1BQ19TVUJTVChbYW1fX3VudGFyXSkKLV0pICMgX0FNX1BST0dfVEFSCi0KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvYXV0b2dlbi5zaCBiL3NyYy9saWJwbmcvYXV0b2dlbi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWJlMTA0ZS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2F1dG9nZW4uc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jISAvYmluL3NoCi0jIGEgcXVpY2sgaGFjayBzY3JpcHQgdG8gZ2VuZXJhdGUgbmVjZXNzYXJ5IGZpbGVzIGZyb20gCi0jIGF1dG8qIHRvb2xzLgotIwotIyBXQVJOSU5HOiBpZiB5b3UgcnVuIHRoaXMgeW91IHdpbGwgY2hhbmdlIHRoZSB2ZXJzaW9ucwotIyBvZiB0aGUgdG9vbHMgd2hpY2ggYXJlIHVzZWQgYW5kLCBtYXliZSwgcmVxdWlyZWQhCi0KLSMgWW91IGNhbiBkZWZpbmUgeW91ciBvd24gcmVwbGFjZW1lbnRzIGluIHlvdXIgZW52aXJvbm1lbnQuCi0jICRBVVRPQ09ORiwgICRBVVRPTUFLRSwgJEFVVE9IRUFERVIsICRBVVRPUE9JTlQsICRBQ0xPQ0FMIGFuZCAkTElCVE9PTElaRQotCi10b3VjaCBNYWtlZmlsZS5hbSBjb25maWd1cmUuYWMKLXsKLSAgIExUPSR7TElCVE9PTElaRS1saWJ0b29saXplfQotICAgZWNobyAicnVubmluZyAkTFQiID4mMgotICAgJExUIC0tZm9yY2UgLS1jb3B5IC0tYXV0b21ha2UKLX0gJiYgewotICAgQUw9JHtBQ0xPQ0FMLWFjbG9jYWx9Ci0gICBlY2hvICJydW5uaW5nICRBTCIgPiYyCi0gICAkQUwKLX0gJiYgewotICAgQUg9JHtBVVRPSEVBREVSLWF1dG9oZWFkZXJ9Ci0gICBlY2hvICJydW5uaW5nICRBSCBbaWdub3JlIHRoZSB3YXJuaW5nc10iID4mMgotICAgJEFICi19ICYmIHsKLSAgIEFNPSR7QVVUT01BS0UtYXV0b21ha2V9Ci0gICBlY2hvICJydW5uaW5nICRBTSIgPiYyCi0gICAkQU0gLS1mb3JjZS1taXNzaW5nIC0tZm9yZWlnbiAtYSAtYwotfSAmJiB7Ci0gICBBQz0ke0FVVE9DT05GLWF1dG9jb25mfQotICAgZWNobyAicnVubmluZyAkQUMiID4mMgotICAgJEFDCi19ICYmCi0gICBlY2hvICJhdXRvZ2VuIGNvbXBsZXRlIiA+JjIgfHwKLSAgIGVjaG8gIkVSUk9SOiBhdXRvZ2VuLnNoIGZhaWxlZCwgYXV0b2dlbiBpcyBpbmNvbXBsZXRlIiA+JjIKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29uZmlnLmd1ZXNzIGIvc3JjL2xpYnBuZy9jb25maWcuZ3Vlc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjODRjNjguLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb25maWcuZ3Vlc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAxICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCi0jICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOQotIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi10aW1lc3RhbXA9JzIwMDktMTEtMjAnCi0KLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSMgMDIxMTAtMTMwMSwgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLQotIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIuICBQbGVhc2Ugc2VuZCBwYXRjaGVzIChjb250ZXh0Ci0jIGRpZmYgZm9ybWF0KSB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4gYW5kIGluY2x1ZGUgYSBDaGFuZ2VMb2cKLSMgZW50cnkuCi0jCi0jIFRoaXMgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lIHNpbWlsYXIgdG8KLSMgY29uZmlnLnN1Yi4gIElmIGl0IHN1Y2NlZWRzLCBpdCBwcmludHMgdGhlIHN5c3RlbSBuYW1lIG9uIHN0ZG91dCwgYW5kCi0jIGV4aXRzIHdpdGggMC4gIE90aGVyd2lzZSwgaXQgZXhpdHMgd2l0aCAxLgotIwotIyBZb3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBzY3JpcHQgZnJvbToKLSMgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5ndWVzcztoYj1IRUFECi0KLW1lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAotCi11c2FnZT0iXAotVXNhZ2U6ICQwIFtPUFRJT05dCi0KLU91dHB1dCB0aGUgY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZSBzeXN0ZW0gXGAkbWUnIGlzIHJ1biBvbi4KLQotT3BlcmF0aW9uIG1vZGVzOgotICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKLSAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAotICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAotCi1SZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgotCi12ZXJzaW9uPSJcCi1HTlUgY29uZmlnLmd1ZXNzICgkdGltZXN0YW1wKQotCi1PcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIuCi1Db3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCi0yMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTwotd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgotCi1oZWxwPSIKLVRyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLQotIyBQYXJzZSBjb21tYW5kIGxpbmUKLXdoaWxlIHRlc3QgJCMgLWd0IDAgOyBkbwotICBjYXNlICQxIGluCi0gICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKLSAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKLSAgICAtLXZlcnNpb24gfCAtdiApCi0gICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OwotICAgIC0taGVscCB8IC0taCogfCAtaCApCi0gICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OwotICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZwotICAgICAgIHNoaWZ0OyBicmVhayA7OwotICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KLSAgICAgICBicmVhayA7OwotICAgIC0qICkKLSAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiID4mMgotICAgICAgIGV4aXQgMSA7OwotICAgICogKQotICAgICAgIGJyZWFrIDs7Ci0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAkIyAhPSAwOyB0aGVuCi0gIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgotICBleGl0IDEKLWZpCi0KLXRyYXAgJ2V4aXQgMScgMSAyIDE1Ci0KLSMgQ0NfRk9SX0JVSUxEIC0tIGNvbXBpbGVyIHVzZWQgYnkgdGhpcyBzY3JpcHQuIE5vdGUgdGhhdCB0aGUgdXNlIG9mIGEKLSMgY29tcGlsZXIgdG8gYWlkIGluIHN5c3RlbSBkZXRlY3Rpb24gaXMgZGlzY291cmFnZWQgYXMgaXQgcmVxdWlyZXMKLSMgdGVtcG9yYXJ5IGZpbGVzIHRvIGJlIGNyZWF0ZWQgYW5kLCBhcyB5b3UgY2FuIHNlZSBiZWxvdywgaXQgaXMgYQotIyBoZWFkYWNoZSB0byBkZWFsIHdpdGggaW4gYSBwb3J0YWJsZSBmYXNoaW9uLgotCi0jIEhpc3RvcmljYWxseSwgYENDX0ZPUl9CVUlMRCcgdXNlZCB0byBiZSBuYW1lZCBgSE9TVF9DQycuIFdlIHN0aWxsCi0jIHVzZSBgSE9TVF9DQycgaWYgZGVmaW5lZCwgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuCi0KLSMgUG9ydGFibGUgdG1wIGRpcmVjdG9yeSBjcmVhdGlvbiBpbnNwaXJlZCBieSB0aGUgQXV0b2NvbmYgdGVhbS4KLQotc2V0X2NjX2Zvcl9idWlsZD0nCi10cmFwICJleGl0Y29kZT1cJD87IChybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbCkgJiYgZXhpdCBcJGV4aXRjb2RlIiAwIDsKLXRyYXAgInJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsOyBleGl0IDEiIDEgMiAxMyAxNSA7Ci06ICR7VE1QRElSPS90bXB9IDsKLSB7IHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIiRUTVBESVIvY2dYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIgOyB9IHx8Ci0geyB0ZXN0IC1uICIkUkFORE9NIiAmJiB0bXA9JFRNUERJUi9jZyQkLSRSQU5ET00gJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSA7IH0gfHwKLSB7IHRtcD0kVE1QRElSL2NnLSQkICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgJiYgZWNobyAiV2FybmluZzogY3JlYXRpbmcgaW5zZWN1cmUgdGVtcCBkaXJlY3RvcnkiID4mMiA7IH0gfHwKLSB7IGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gJFRNUERJUiIgPiYyIDsgZXhpdCAxIDsgfSA7Ci1kdW1teT0kdG1wL2R1bW15IDsKLXRtcGZpbGVzPSIkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teSIgOwotY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgotICwsKSAgICBlY2hvICJpbnQgeDsiID4gJGR1bW15LmMgOwotCWZvciBjIGluIGNjIGdjYyBjODkgYzk5IDsgZG8KLQkgIGlmICgkYyAtYyAtbyAkZHVtbXkubyAkZHVtbXkuYykgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKLQkgIGZpIDsKLQlkb25lIDsKLQlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgotCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKLQlmaQotCTs7Ci0gLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKLSAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Ci1lc2FjIDsgc2V0X2NjX2Zvcl9idWlsZD0gOycKLQotIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KLSMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQotaWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKLWZpCi0KLVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgotVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCi1VTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgotVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCi0KLSMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KLQotY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgotICAgICo6TmV0QlNEOio6KikKLQkjIE5ldEJTRCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgotCSMgbW9yZSBvZiB0aGUgdHVwcGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKLQkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQotCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAotCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKLQkjIGNvbXBhdGliaWxpdHkgYW5kIGEgY29uc2lzdGVudCBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyB0aGUKLQkjIG9iamVjdCBmaWxlIGZvcm1hdC4KLQkjCi0JIyBOb3RlOiBOZXRCU0QgZG9lc24ndCBwYXJ0aWN1bGFybHkgY2FyZSBhYm91dCB0aGUgdmVuZG9yCi0JIyBwb3J0aW9uIG9mIHRoZSBuYW1lLiAgV2UgYWx3YXlzIHNldCBpdCB0byAidW5rbm93biIuCi0Jc3lzY3RsPSJzeXNjdGwgLW4gaHcubWFjaGluZV9hcmNoIgotCVVOQU1FX01BQ0hJTkVfQVJDSD1gKC9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgXAotCSAgICAvdXNyL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd24pYAotCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KLQkgICAgYXJtZWIpIG1hY2hpbmU9YXJtZWItdW5rbm93biA7OwotCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7Ci0JICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7Ci0JICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKLQkgICAgc2g1ZWwpIG1hY2hpbmU9c2g1bGUtdW5rbm93biA7OwotCSAgICAqKSBtYWNoaW5lPSR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duIDs7Ci0JZXNhYwotCSMgVGhlIE9wZXJhdGluZyBTeXN0ZW0gaW5jbHVkaW5nIG9iamVjdCBmb3JtYXQsIGlmIGl0IGhhcyBzd2l0Y2hlZAotCSMgdG8gRUxGIHJlY2VudGx5LCBvciB3aWxsIGluIHRoZSBmdXR1cmUuCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgotCSAgICBhcm0qfGkzODZ8bTY4a3xuczMya3xzaDMqfHNwYXJjfHZheCkKLQkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCQlpZiBlY2hvIF9fRUxGX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAotCQkJfCBncmVwIC1xIF9fRUxGX18KLQkJdGhlbgotCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgotCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/Ci0JCSAgICBvcz1uZXRic2QKLQkJZWxzZQotCQkgICAgb3M9bmV0YnNkZWxmCi0JCWZpCi0JCTs7Ci0JICAgICopCi0JICAgICAgICBvcz1uZXRic2QKLQkJOzsKLQllc2FjCi0JIyBUaGUgT1MgcmVsZWFzZQotCSMgRGViaWFuIEdOVS9OZXRCU0QgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCB1c2VybGFuZCwgYW5kCi0JIyB0aHVzLCBuZWVkIGEgZGlzdGluY3QgdHJpcGxldC4gSG93ZXZlciwgdGhleSBkbyBub3QgbmVlZAotCSMga2VybmVsIHZlcnNpb24gaW5mb3JtYXRpb24sIHNvIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEKLQkjIHN1aXRhYmxlIHRhZywgaW4gdGhlIHN0eWxlIG9mIGxpbnV4LWdudS4KLQljYXNlICIke1VOQU1FX1ZFUlNJT059IiBpbgotCSAgICBEZWJpYW4qKQotCQlyZWxlYXNlPSctZ251JwotCQk7OwotCSAgICAqKQotCQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAotCQk7OwotCWVzYWMKLQkjIFNpbmNlIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTToKLQkjIGNvbnRhaW5zIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwgdGhlIHNob3J0ZXIgZm9ybToKLQkjIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNIGlzIHVzZWQuCi0JZWNobyAiJHttYWNoaW5lfS0ke29zfSR7cmVsZWFzZX0iCi0JZXhpdCA7OwotICAgICo6T3BlbkJTRDoqOiopCi0JVU5BTUVfTUFDSElORV9BUkNIPWBhcmNoIHwgc2VkICdzL09wZW5CU0QuLy8nYAotCWVjaG8gJHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpla2tvQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1la2tvYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOlNvbGlkQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zb2xpZGJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgbWFjcHBjOk1pckJTRDoqOiopCi0JZWNobyBwb3dlcnBjLXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOk1pckJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBhbHBoYTpPU0YxOio6KikKLQljYXNlICRVTkFNRV9SRUxFQVNFIGluCi0JKjQuMCkKLQkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKLQkJOzsKLQkqNS4qKQotCSAgICAgICAgVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDR9J2AKLQkJOzsKLQllc2FjCi0JIyBBY2NvcmRpbmcgdG8gQ29tcGFxLCAvdXNyL3NiaW4vcHNyaW5mbyBoYXMgYmVlbiBhdmFpbGFibGUgb24KLQkjIE9TRi8xIGFuZCBUcnU2NCBzeXN0ZW1zIHByb2R1Y2VkIHNpbmNlIDE5OTUuICBJIGhvcGUgdGhhdAotCSMgY292ZXJzIG1vc3Qgc3lzdGVtcyBydW5uaW5nIHRvZGF5LiAgVGhpcyBjb2RlIHBpcGVzIHRoZSBDUFUKLQkjIHR5cGVzIHRocm91Z2ggaGVhZCAtbiAxLCBzbyB3ZSBvbmx5IGRldGVjdCB0aGUgdHlwZSBvZiBDUFUgMC4KLQlBTFBIQV9DUFVfVFlQRT1gL3Vzci9zYmluL3BzcmluZm8gLXYgfCBzZWQgLW4gLWUgJ3MvXiAgVGhlIGFscGhhIFwoLipcKSBwcm9jZXNzb3IuKiQvXDEvcCcgfCBoZWFkIC1uIDFgCi0JY2FzZSAiJEFMUEhBX0NQVV9UWVBFIiBpbgotCSAgICAiRVY0ICgyMTA2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKLQkgICAgIkVWNC41ICgyMTA2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKLQkgICAgIkxDQTQgKDIxMDY2LzIxMDY4KSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OwotCSAgICAiRVY1ICgyMTE2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIgOzsKLQkgICAgIkVWNS42ICgyMTE2NEEpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IiA7OwotCSAgICAiRVY1LjYgKDIxMTY0UEMpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIgOzsKLQkgICAgIkVWNS43ICgyMTE2NFBDKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTciIDs7Ci0JICAgICJFVjYgKDIxMjY0KSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IiA7OwotCSAgICAiRVY2LjcgKDIxMjY0QSkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciIDs7Ci0JICAgICJFVjYuOENCICgyMTI2NEMpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OwotCSAgICAiRVY2LjhBTCAoMjEyNjRCKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKLQkgICAgIkVWNi44Q1ggKDIxMjY0RCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7Ci0JICAgICJFVjYuOUEgKDIxMjY0L0VWNjlBKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OSIgOzsKLQkgICAgIkVWNyAoMjEzNjQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjciIDs7Ci0JICAgICJFVjcuOSAoMjEzNjRBKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3OSIgOzsKLQllc2FjCi0JIyBBIFBuLm4gdmVyc2lvbiBpcyBhIHBhdGNoZWQgdmVyc2lvbi4KLQkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KLQkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgotCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgotCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1BWVFhdLy8nIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAotCWV4aXQgOzsKLSAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQotCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KLQkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKLQkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KLQllY2hvIGFscGhhLXBjLWludGVyaXgKLQlleGl0IDs7Ci0gICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQotCWVjaG8gYWxwaGEtZGVjLXdpbm50My41Ci0JZXhpdCA7OwotICAgIEFtaWdhKjpVTklYX1N5c3RlbV9WOjQuMDoqKQotCWVjaG8gbTY4ay11bmtub3duLXN5c3Y0Ci0JZXhpdCA7OwotICAgICo6W0FhXW1pZ2FbT29dW1NzXToqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYW1pZ2FvcwotCWV4aXQgOzsKLSAgICAqOltNbV1vcnBoW09vXVtTc106KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1vcnBob3MKLQlleGl0IDs7Ci0gICAgKjpPUy8zOTA6KjoqKQotCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KLQlleGl0IDs7Ci0gICAgKjp6L1ZNOio6KikKLQllY2hvIHMzOTAtaWJtLXp2bW9lCi0JZXhpdCA7OwotICAgICo6T1M0MDA6KjoqKQotICAgICAgICBlY2hvIHBvd2VycGMtaWJtLW9zNDAwCi0JZXhpdCA7OwotICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKLQllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIGFybTpyaXNjb3M6KjoqfGFybTpSSVNDT1M6KjoqKQotCWVjaG8gYXJtLXVua25vd24tcmlzY29zCi0JZXhpdCA7OwotICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqIHwgU1I4MDAwOkhJLVVYL01QUDoqOiopCi0JZWNobyBocHBhMS4xLWhpdGFjaGktaGl1eG1wcAotCWV4aXQgOzsKLSAgICBQeXJhbWlkKjpPU3gqOio6KiB8IE1JUyo6T1N4KjoqOiogfCBNSVMqOlNNUF9EQy1PU3gqOio6KikKLQkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgotCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KLQkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKLQllbHNlCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAotCWZpCi0JZXhpdCA7OwotICAgIE5JTEUqOio6KjpkY29zeCkKLQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0Ci0JZXhpdCA7OwotICAgIERSUz82MDAwOnVuaXg6NC4wOjYqKQotCWVjaG8gc3BhcmMtaWNsLW54NgotCWV4aXQgOzsKLSAgICBEUlM/NjAwMDpVTklYX1NWOjQuMio6NyogfCBEUlM/NjAwMDppc2lzOjQuMio6NyopCi0JY2FzZSBgL3Vzci9iaW4vdW5hbWUgLXBgIGluCi0JICAgIHNwYXJjKSBlY2hvIHNwYXJjLWljbC1ueDc7IGV4aXQgOzsKLQllc2FjIDs7Ci0gICAgczM5MHg6U3VuT1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDs7Ci0gICAgc3VuNEg6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1oYWwtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDs7Ci0gICAgc3VuNCo6U3VuT1M6NS4qOiogfCB0YWRwb2xlKjpTdW5PUzo1Lio6KikKLQllY2hvIHNwYXJjLXN1bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgOzsKLSAgICBpODZwYzpBdXJvcmFVWDo1Lio6KiB8IGk4NnhlbjpBdXJvcmFVWDo1Lio6KikKLQllY2hvIGkzODYtcGMtYXVyb3JhdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIGk4NnBjOlN1bk9TOjUuKjoqIHwgaTg2eGVuOlN1bk9TOjUuKjoqKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlTVU5fQVJDSD0iaTM4NiIKLQkjIElmIHRoZXJlIGlzIGEgY29tcGlsZXIsIHNlZSBpZiBpdCBpcyBjb25maWd1cmVkIGZvciA2NC1iaXQgb2JqZWN0cy4KLQkjIE5vdGUgdGhhdCB0aGUgU3VuIGNjIGRvZXMgbm90IHR1cm4gX19MUDY0X18gaW50byAxIGxpa2UgZ2NjIGRvZXMuCi0JIyBUaGlzIHRlc3Qgd29ya3MgZm9yIGJvdGggY29tcGlsZXJzLgotCWlmIFsgIiRDQ19GT1JfQlVJTEQiICE9ICdub19jb21waWxlcl9mb3VuZCcgXTsgdGhlbgotCSAgICBpZiAoZWNobyAnI2lmZGVmIF9fYW1kNjQnOyBlY2hvIElTXzY0QklUX0FSQ0g7IGVjaG8gJyNlbmRpZicpIHwgXAotCQkoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwgXAotCQlncmVwIElTXzY0QklUX0FSQ0ggPi9kZXYvbnVsbAotCSAgICB0aGVuCi0JCVNVTl9BUkNIPSJ4ODZfNjQiCi0JICAgIGZpCi0JZmkKLQllY2hvICR7U1VOX0FSQ0h9LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCA7OwotICAgIHN1bjQqOlN1bk9TOjYqOiopCi0JIyBBY2NvcmRpbmcgdG8gY29uZmlnLnN1YiwgdGhpcyBpcyB0aGUgcHJvcGVyIHdheSB0byBjYW5vbmljYWxpemUKLQkjIFN1bk9TNi4gIEhhcmQgdG8gZ3Vlc3MgZXhhY3RseSB3aGF0IFN1bk9TNiB3aWxsIGJlIGxpa2UsIGJ1dAotCSMgaXQncyBsaWtlbHkgdG8gYmUgbW9yZSBsaWtlIFNvbGFyaXMgdGhhbiBTdW5PUzQuCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczNgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDs7Ci0gICAgc3VuNCo6U3VuT1M6KjoqKQotCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KLQkgICAgU2VyaWVzKnxTNCopCi0JCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAotCQk7OwotCWVzYWMKLQkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCi0JZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKLQlleGl0IDs7Ci0gICAgc3VuMyo6U3VuT1M6KjoqKQotCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIHN1bio6Kjo0LjJCU0Q6KikKLQlVTkFNRV9SRUxFQVNFPWAoc2VkIDFxIC9ldGMvbW90ZCB8IGF3ayAne3ByaW50IHN1YnN0cigkNSwxLDMpfScpIDI+L2Rldi9udWxsYAotCXRlc3QgIngke1VOQU1FX1JFTEVBU0V9IiA9ICJ4IiAmJiBVTkFNRV9SRUxFQVNFPTMKLQljYXNlICJgL2Jpbi9hcmNoYCIgaW4KLQkgICAgc3VuMykKLQkJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQkJOzsKLQkgICAgc3VuNCkKLQkJZWNobyBzcGFyYy1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JZXNhYwotCWV4aXQgOzsKLSAgICBhdXNocDpTdW5PUzoqOiopCi0JZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICMgVGhlIHNpdHVhdGlvbiBmb3IgTWlOVCBpcyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgbWFjaGluZSBuYW1lCi0gICAgIyBjYW4gYmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgKGV2ZXJ5dGhpbmcgd2hpY2ggaXMgbm90Ci0gICAgIyAiYXRhcmlzdCIgb3IgImF0YXJpc3RlIiBhdCBsZWFzdCBzaG91bGQgaGF2ZSBhIHByb2Nlc3NvcgotICAgICMgPiBtNjgwMDApLiAgVGhlIHN5c3RlbSBuYW1lIHJhbmdlcyBmcm9tICJNaU5UIiBvdmVyICJGcmVlTWlOVCIKLSAgICAjIHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiAibWludCIgKG9yICJmcmVlbWludCIpLiAgRmluYWxseQotICAgICMgdGhlIHN5c3RlbSBuYW1lICJUT1MiIGRlbm90ZXMgYSBzeXN0ZW0gd2hpY2ggaXMgYWN0dWFsbHkgbm90Ci0gICAgIyBNaU5ULiAgQnV0IE1pTlQgaXMgZG93bndhcmQgY29tcGF0aWJsZSB0byBUT1MsIHNvIHRoaXMgc2hvdWxkCi0gICAgIyBiZSBubyBwcm9ibGVtLgotICAgIGF0YXJpc3RbZV06Kk1pTlQ6KjoqIHwgYXRhcmlzdFtlXToqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgYXRhcmkqOipNaU5UOio6KiB8IGF0YXJpKjoqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQotCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDs7Ci0gICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBtaWxhbio6Kk1pTlQ6KjoqIHwgbWlsYW4qOiptaW50Oio6KiB8ICptaWxhbio6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1taWxhbi1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDs7Ci0gICAgaGFkZXMqOipNaU5UOio6KiB8IGhhZGVzKjoqbWludDoqOiogfCAqaGFkZXMqOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstaGFkZXMtbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCA7OwotICAgICo6Kk1pTlQ6KjoqIHwgKjoqbWludDoqOiogfCAqOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDs7Ci0gICAgbTY4azptYWNodGVuOio6KikKLQllY2hvIG02OGstYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgcG93ZXJwYzptYWNodGVuOio6KikKLQllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgUklTQyo6TWFjaDoqOiopCi0JZWNobyBtaXBzLWRlYy1tYWNoX2JzZDQuMwotCWV4aXQgOzsKLSAgICBSSVNDKjpVTFRSSVg6KjoqKQotCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBWQVgqOlVMVFJJWCo6KjoqKQotCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIDIwMjA6Q0xJWDoqOiogfCAyNDMwOkNMSVg6KjoqKQotCWVjaG8gY2xpcHBlci1pbnRlcmdyYXBoLWNsaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KLQlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotI2Vsc2UKLQlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgewotI2VuZGlmCi0JI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNlbmRpZgotCSAgZXhpdCAoLTEpOwotCX0KLUVPRgotCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmCi0JICBkdW1teWFyZz1gZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCAmJgotCSAgU1lTVEVNX05BTUU9YCRkdW1teSAkZHVtbXlhcmdgICYmCi0JICAgIHsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQotCWVjaG8gbWlwcy1taXBzLXJpc2NvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQotCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAotCWV4aXQgOzsKLSAgICBNb3Rvcm9sYToqOjQuMzpQTDgtKikKLQllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4Ci0JZXhpdCA7OwotICAgIE5pZ2h0X0hhd2s6KjoqOlBvd2VyTUFYX09TIHwgU3luZXJneTpQb3dlck1BWF9PUzoqOiopCi0JZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAotCWV4aXQgOzsKLSAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4Ci0JZXhpdCA7OwotICAgIG04OGs6Q1gvVVg6Nyo6KikKLQllY2hvIG04OGstaGFycmlzLWN4dXg3Ci0JZXhpdCA7OwotICAgIG04OGs6Kjo0KjpSNCopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0Ci0JZXhpdCA7OwotICAgIG04OGs6KjozKjpSMyopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCA7OwotICAgIEFWaWlPTjpkZ3V4Oio6KikKLSAgICAgICAgIyBERy9VWCByZXR1cm5zIEFWaWlPTiBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKLSAgICAgICAgVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKLQlpZiBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTAwIF0gfHwgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdCi0JdGhlbgotCSAgICBpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBdIHx8IFwKLQkgICAgICAgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0KLQkgICAgdGhlbgotCQllY2hvIG04OGstZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KLQkgICAgZWxzZQotCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KLQkgICAgZmkKLQllbHNlCi0JICAgIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQotCWZpCi0gCWV4aXQgOzsKLSAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQotCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCi0JZXhpdCA7OwotICAgIE04OCo6KjpSMyo6KikKLQkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCA7OwotICAgIFhEODgqOio6KjoqKSAjIFRla3Ryb25peCBYRDg4IHN5c3RlbSBydW5uaW5nIFVUZWtWIChTVlIzKQotCWVjaG8gbTg4ay10ZWt0cm9uaXgtc3lzdjMKLQlleGl0IDs7Ci0gICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKLQllY2hvIG02OGstdGVrdHJvbml4LWJzZAotCWV4aXQgOzsKLSAgICAqOklSSVgqOio6KikKLQllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCi0JZXhpdCA7OwotICAgID8/Pz8/Pz8/OkFJWD86WzEyXS4xOjIpICAgIyBBSVggMi4yLjEgb3IgQUlYIDIuMS4xIGlzIFJUL1BDIEFJWC4KLQllY2hvIHJvbXAtaWJtLWFpeCAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAotCWV4aXQgOzsgICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKLSAgICBpKjg2OkFJWDoqOiopCi0JZWNobyBpMzg2LWlibS1haXgKLQlleGl0IDs7Ci0gICAgaWE2NDpBSVg6KjoqKQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tYWl4JHtJQk1fUkVWfQotCWV4aXQgOzsKLSAgICAqOkFJWDoyOjMpCi0JaWYgZ3JlcCBib3MzMjUgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJc2VkICdzL14JCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JCSNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+Ci0KLQkJbWFpbigpCi0JCQl7Ci0JCQlpZiAoIV9fcG93ZXJfcGMoKSkKLQkJCQlleGl0KDEpOwotCQkJcHV0cygicG93ZXJwYy1pYm0tYWl4My4yLjUiKTsKLQkJCWV4aXQoMCk7Ci0JCQl9Ci1FT0YKLQkJaWYgJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAKLQkJdGhlbgotCQkJZWNobyAiJFNZU1RFTV9OQU1FIgotCQllbHNlCi0JCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKLQkJZmkKLQllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKLQllbHNlCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKLQlmaQotCWV4aXQgOzsKLSAgICAqOkFJWDoqOls0NTZdKQotCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAotCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlJQk1fQVJDSD1yczYwMDAKLQllbHNlCi0JCUlCTV9BUkNIPXBvd2VycGMKLQlmaQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KLQlleGl0IDs7Ci0gICAgKjpBSVg6KjoqKQotCWVjaG8gcnM2MDAwLWlibS1haXgKLQlleGl0IDs7Ci0gICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCi0JZWNobyByb21wLWlibS1ic2Q0LjQKLQlleGl0IDs7Ci0gICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKLQllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCi0JZXhpdCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKLSAgICAqOkJPU1g6KjoqKQotCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAotCWV4aXQgOzsKLSAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQotCWVjaG8gbTY4ay1idWxsLXN5c3YzCi0JZXhpdCA7OwotICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKLQllY2hvIG02OGstaHAtYnNkCi0JZXhpdCA7OwotICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCi0JZWNobyBtNjhrLWhwLWJzZDQuNAotCWV4aXQgOzsKLSAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCi0JSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KLQkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7Ci0JICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKLQkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0pCi0JCWlmIFsgLXggL3Vzci9iaW4vZ2V0Y29uZiBdOyB0aGVuCi0JCSAgICBzY19jcHVfdmVyc2lvbj1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19DUFVfVkVSU0lPTiAyPi9kZXYvbnVsbGAKLSAgICAgICAgICAgICAgICAgICAgc2Nfa2VybmVsX2JpdHM9YC91c3IvYmluL2dldGNvbmYgU0NfS0VSTkVMX0JJVFMgMj4vZGV2L251bGxgCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2NfY3B1X3ZlcnNpb259IiBpbgotICAgICAgICAgICAgICAgICAgICAgIDUyMykgSFBfQVJDSD0iaHBwYTEuMCIgOzsgIyBDUFVfUEFfUklTQzFfMAotICAgICAgICAgICAgICAgICAgICAgIDUyOCkgSFBfQVJDSD0iaHBwYTEuMSIgOzsgIyBDUFVfUEFfUklTQzFfMQotICAgICAgICAgICAgICAgICAgICAgIDUzMikgICAgICAgICAgICAgICAgICAgICAgIyBDUFVfUEFfUklTQzJfMAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19rZXJuZWxfYml0c30iIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDMyKSBIUF9BUkNIPSJocHBhMi4wbiIgOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgNjQpIEhQX0FSQ0g9ImhwcGEyLjB3IiA7OwotCQkJICAnJykgSFBfQVJDSD0iaHBwYTIuMCIgOzsgICAjIEhQLVVYIDEwLjIwCi0gICAgICAgICAgICAgICAgICAgICAgICBlc2FjIDs7Ci0gICAgICAgICAgICAgICAgICAgIGVzYWMKLQkJZmkKLQkJaWYgWyAiJHtIUF9BUkNIfSIgPSAiIiBdOyB0aGVuCi0JCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JCSAgICBzZWQgJ3MvXiAgICAgICAgICAgICAgLy8nIDw8IEVPRiA+JGR1bW15LmMKLQotICAgICAgICAgICAgICAjZGVmaW5lIF9IUFVYX1NPVVJDRQotICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkbGliLmg+Ci0gICAgICAgICAgICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KLQotICAgICAgICAgICAgICBpbnQgbWFpbiAoKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKLSAgICAgICAgICAgICAgICAgIGxvbmcgYml0cyA9IHN5c2NvbmYoX1NDX0tFUk5FTF9CSVRTKTsKLSAgICAgICAgICAgICAgI2VuZGlmCi0gICAgICAgICAgICAgICAgICBsb25nIGNwdSAgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOwotCi0gICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNwdSkKLSAgICAgICAgICAgICAgCXsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMl8wOgotICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCi0gICAgICAgICAgICAgIAkgICAgc3dpdGNoIChiaXRzKQotICAgICAgICAgICAgICAJCXsKLSAgICAgICAgICAgICAgCQljYXNlIDY0OiBwdXRzICgiaHBwYTIuMHciKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJY2FzZSAzMjogcHV0cyAoImhwcGEyLjBuIik7IGJyZWFrOwotICAgICAgICAgICAgICAJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAJCX0gYnJlYWs7Ci0gICAgICAgICAgICAgICNlbHNlICAvKiAhZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpICovCi0gICAgICAgICAgICAgIAkgICAgcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICNlbmRpZgotICAgICAgICAgICAgICAJZGVmYXVsdDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICBleGl0ICgwKTsKLSAgICAgICAgICAgICAgfQotRU9GCi0JCSAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCkgJiYgSFBfQVJDSD1gJGR1bW15YAotCQkgICAgdGVzdCAteiAiJEhQX0FSQ0giICYmIEhQX0FSQ0g9aHBwYQotCQlmaSA7OwotCWVzYWMKLQlpZiBbICR7SFBfQVJDSH0gPSAiaHBwYTIuMHciIF0KLQl0aGVuCi0JICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQotCSAgICAjIGhwcGEyLjB3LWhwLWhwdXgqIGhhcyBhIDY0LWJpdCBrZXJuZWwgYW5kIGEgY29tcGlsZXIgZ2VuZXJhdGluZwotCSAgICAjIDMyLWJpdCBjb2RlLiAgaHBwYTY0LWhwLWhwdXgqIGhhcyB0aGUgc2FtZSBrZXJuZWwgYW5kIGEgY29tcGlsZXIKLQkgICAgIyBnZW5lcmF0aW5nIDY0LWJpdCBjb2RlLiAgR05VIGFuZCBIUCB1c2UgZGlmZmVyZW50IG5vbWVuY2xhdHVyZToKLQkgICAgIwotCSAgICAjICQgQ0NfRk9SX0JVSUxEPWNjIC4vY29uZmlnLmd1ZXNzCi0JICAgICMgPT4gaHBwYTIuMHctaHAtaHB1eDExLjIzCi0JICAgICMgJCBDQ19GT1JfQlVJTEQ9ImNjICtEQTIuMHciIC4vY29uZmlnLmd1ZXNzCi0JICAgICMgPT4gaHBwYTY0LWhwLWhwdXgxMS4yMwotCi0JICAgIGlmIGVjaG8gX19MUDY0X18gfCAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwKLQkJZ3JlcCAtcSBfX0xQNjRfXwotCSAgICB0aGVuCi0JCUhQX0FSQ0g9ImhwcGEyLjB3IgotCSAgICBlbHNlCi0JCUhQX0FSQ0g9ImhwcGE2NCIKLQkgICAgZmkKLQlmaQotCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDs7Ci0gICAgaWE2NDpIUC1VWDoqOiopCi0JSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCi0JZWNobyBpYTY0LWhwLWhwdXgke0hQVVhfUkVWfQotCWV4aXQgOzsKLSAgICAzMDUwKjpISS1VWDoqOiopCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI2luY2x1ZGUgPHVuaXN0ZC5oPgotCWludAotCW1haW4gKCkKLQl7Ci0JICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0JICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucwotCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKLQkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLwotCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChjcHUpCi0JCXsKLQkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQotCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKLQkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7Ci0JICBleGl0ICgwKTsKLQl9Ci1FT0YKLQkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YCAmJgotCQl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KLQllY2hvIHVua25vd24taGl0YWNoaS1oaXV4d2UyCi0JZXhpdCA7OwotICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtYnNkCi0JZXhpdCA7OwotICAgIDkwMDAvOD8/OjQuM2JzZDoqOiopCi0JZWNobyBocHBhMS4wLWhwLWJzZAotCWV4aXQgOzsKLSAgICAqOT8/KjpNUEUvaVg6KjoqIHwgKjMwMDAqOk1QRS9pWDoqOiopCi0JZWNobyBocHBhMS4wLWhwLW1wZWl4Ci0JZXhpdCA7OwotICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1vc2YKLQlleGl0IDs7Ci0gICAgaHA4Pz86T1NGMToqOiopCi0JZWNobyBocHBhMS4wLWhwLW9zZgotCWV4aXQgOzsKLSAgICBpKjg2Ok9TRjE6KjoqKQotCWlmIFsgLXggL3Vzci9zYmluL3N5c3ZlcnNpb24gXSA7IHRoZW4KLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMW1rCi0JZWxzZQotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxCi0JZmkKLQlleGl0IDs7Ci0gICAgcGFyaXNjKjpMaXRlcyo6KjoqKQotCWVjaG8gaHBwYTEuMS1ocC1saXRlcwotCWV4aXQgOzsKLSAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQotCWVjaG8gYzEtY29udmV4LWJzZAotICAgICAgICBleGl0IDs7Ci0gICAgQzIqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMio6KikKLQlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKLQl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKLQllbHNlIGVjaG8gYzItY29udmV4LWJzZAotCWZpCi0gICAgICAgIGV4aXQgOzsKLSAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCi0JZWNobyBjMzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDs7Ci0gICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQotCWVjaG8gYzM4LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCA7OwotICAgIEM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzQqOiopCi0JZWNobyBjNC1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgOzsKLSAgICBDUkFZKlktTVA6KjoqOiopCi0JZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDs7Ci0gICAgQ1JBWSpbQS1aXTkwOio6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gXAotCXwgc2VkIC1lICdzL0NSQVkuKlwoW0EtWl05MFwpL1wxLycgXAotCSAgICAgIC1lIHkvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovIFwKLQkgICAgICAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCA7OwotICAgIENSQVkqVFM6KjoqOiopCi0JZWNobyB0OTAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDs7Ci0gICAgQ1JBWSpUM0U6KjoqOiopCi0JZWNobyBhbHBoYWV2NS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCA7OwotICAgIENSQVkqU1YxOio6KjoqKQotCWVjaG8gc3YxLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCA7OwotICAgICo6VU5JQ09TL21wOio6KikKLQllY2hvIGNyYXludi1jcmF5LXVuaWNvc21wJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCA7OwotICAgIEYzMFswMV06VU5JWF9TeXN0ZW1fVjoqOiogfCBGNzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQotCUZVSklUU1VfUFJPQz1gdW5hbWUgLW0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCi0gICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKLSAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy8gL18vJ2AKLSAgICAgICAgZWNobyAiJHtGVUpJVFNVX1BST0N9LWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKLSAgICAgICAgZXhpdCA7OwotICAgIDUwMDA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKLSAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAotICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzLyAvXy8nYAotICAgICAgICBlY2hvICJzcGFyYy1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCi0JZXhpdCA7OwotICAgIGkqODY6QlNELzM4NjoqOiogfCBpKjg2OkJTRC9PUzoqOiogfCAqOkFzY2VuZFwgRW1iZWRkZWQvT1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBzcGFyYyo6QlNEL09TOio6KikKLQllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpCU0QvT1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6RnJlZUJTRDoqOiopCi0JY2FzZSAke1VOQU1FX01BQ0hJTkV9IGluCi0JICAgIHBjOTgpCi0JCWVjaG8gaTM4Ni11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7Ci0JICAgIGFtZDY0KQotCQllY2hvIHg4Nl82NC11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7Ci0JICAgICopCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7Ci0JZXNhYwotCWV4aXQgOzsKLSAgICBpKjpDWUdXSU4qOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWN5Z3dpbgotCWV4aXQgOzsKLSAgICAqOk1JTkdXKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzMyCi0JZXhpdCA7OwotICAgIGkqOndpbmRvd3MzMio6KikKLSAgICAJIyB1bmFtZSAtbSBpbmNsdWRlcyAiLXBjIiBvbiB0aGlzIHN5c3RlbS4KLSAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LW1pbmd3MzIKLQlleGl0IDs7Ci0gICAgaSo6UFcqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXB3MzIKLQlleGl0IDs7Ci0gICAgKjpJbnRlcml4KjoqKQotICAgIAljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KLQkgICAgeDg2KQotCQllY2hvIGk1ODYtcGMtaW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KLQkJZXhpdCA7OwotCSAgICBhdXRoZW50aWNhbWQgfCBnZW51aW5laW50ZWwgfCBFTTY0VCkKLQkJZWNobyB4ODZfNjQtdW5rbm93bi1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQotCQlleGl0IDs7Ci0JICAgIElBNjQpCi0JCWVjaG8gaWE2NC11bmtub3duLWludGVyaXgke1VOQU1FX1JFTEVBU0V9Ci0JCWV4aXQgOzsKLQllc2FjIDs7Ci0gICAgWzM0NV04NjpXaW5kb3dzXzk1OiogfCBbMzQ1XTg2OldpbmRvd3NfOTg6KiB8IFszNDVdODY6V2luZG93c19OVDoqKQotCWVjaG8gaSR7VU5BTUVfTUFDSElORX0tcGMtbWtzCi0JZXhpdCA7OwotICAgIDg2NjQ6V2luZG93c19OVDoqKQotCWVjaG8geDg2XzY0LXBjLW1rcwotCWV4aXQgOzsKLSAgICBpKjpXaW5kb3dzX05UKjoqIHwgUGVudGl1bSo6V2luZG93c19OVCo6KikKLQkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/Ci0JIyBJdCBhbHNvIGNvbmZsaWN0cyB3aXRoIHByZS0yLjAgdmVyc2lvbnMgb2YgQVQmVCBVV0lOLiBTaG91bGQgd2UKLQkjIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkIG9mIGkzODY/Ci0JZWNobyBpNTg2LXBjLWludGVyaXgKLQlleGl0IDs7Ci0gICAgaSo6VVdJTio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtdXdpbgotCWV4aXQgOzsKLSAgICBhbWQ2NDpDWUdXSU4qOio6KiB8IHg4Nl82NDpDWUdXSU4qOio6KikKLQllY2hvIHg4Nl82NC11bmtub3duLWN5Z3dpbgotCWV4aXQgOzsKLSAgICBwKjpDWUdXSU4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4KLQlleGl0IDs7Ci0gICAgcHJlcCo6U3VuT1M6NS4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgOzsKLSAgICAqOkdOVToqOiopCi0JIyB0aGUgR05VIHN5c3RlbQotCWVjaG8gYGVjaG8gJHtVTkFNRV9NQUNISU5FfXxzZWQgLWUgJ3MsWy0vXS4qJCwsJ2AtdW5rbm93bi1nbnVgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncywvLiokLCwnYAotCWV4aXQgOzsKLSAgICAqOkdOVS8qOio6KikKLQkjIG90aGVyIHN5c3RlbXMgd2l0aCBHTlUgbGliYyBhbmQgdXNlcmxhbmQKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1gZWNobyAke1VOQU1FX1NZU1RFTX0gfCBzZWQgJ3MsXlteL10qLywsJyB8IHRyICdbQS1aXScgJ1thLXpdJ2BgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgLWdudQotCWV4aXQgOzsKLSAgICBpKjg2Ok1pbml4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluaXgKLQlleGl0IDs7Ci0gICAgYWxwaGE6TGludXg6KjoqKQotCWNhc2UgYHNlZCAtbiAnL15jcHUgbW9kZWwvcy9eLio6IFwoLipcKS9cMS9wJyA8IC9wcm9jL2NwdWluZm9gIGluCi0JICBFVjUpICAgVU5BTUVfTUFDSElORT1hbHBoYWV2NSA7OwotCSAgRVY1NikgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjU2IDs7Ci0JICBQQ0E1NikgVU5BTUVfTUFDSElORT1hbHBoYXBjYTU2IDs7Ci0JICBQQ0E1NykgVU5BTUVfTUFDSElORT1hbHBoYXBjYTU2IDs7Ci0JICBFVjYpICAgVU5BTUVfTUFDSElORT1hbHBoYWV2NiA7OwotCSAgRVY2NykgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY3IDs7Ci0JICBFVjY4KikgVU5BTUVfTUFDSElORT1hbHBoYWV2NjggOzsKLSAgICAgICAgZXNhYwotCW9iamR1bXAgLS1wcml2YXRlLWhlYWRlcnMgL2Jpbi9zaCB8IGdyZXAgLXEgbGQuc28uMQotCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImxpYmMxIiA7IGVsc2UgTElCQz0iIiA7IGZpCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251JHtMSUJDfQotCWV4aXQgOzsKLSAgICBhcm0qOkxpbnV4Oio6KikKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JaWYgZWNobyBfX0FSTV9FQUJJX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAotCSAgICB8IGdyZXAgLXEgX19BUk1fRUFCSV9fCi0JdGhlbgotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQllbHNlCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWVhYmkKLQlmaQotCWV4aXQgOzsKLSAgICBhdnIzMio6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBjcmlzOkxpbnV4Oio6KikKLQllY2hvIGNyaXMtYXhpcy1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgY3Jpc3YzMjpMaW51eDoqOiopCi0JZWNobyBjcmlzdjMyLWF4aXMtbGludXgtZ251Ci0JZXhpdCA7OwotICAgIGZydjpMaW51eDoqOiopCi0gICAgCWVjaG8gZnJ2LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIGkqODY6TGludXg6KjoqKQotCUxJQkM9Z251Ci0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI2lmZGVmIF9fZGlldGxpYmNfXwotCUxJQkM9ZGlldGxpYmMKLQkjZW5kaWYKLUVPRgotCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwICdeTElCQydgCi0JZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC0ke0xJQkN9IgotCWV4aXQgOzsKLSAgICBpYTY0OkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgbTMycio6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBtNjgqOkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgbWlwczpMaW51eDoqOiogfCBtaXBzNjQ6TGludXg6KjoqKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotCSN1bmRlZiBDUFUKLQkjdW5kZWYgJHtVTkFNRV9NQUNISU5FfQotCSN1bmRlZiAke1VOQU1FX01BQ0hJTkV9ZWwKLQkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQotCUNQVT0ke1VOQU1FX01BQ0hJTkV9ZWwKLQkjZWxzZQotCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCi0JQ1BVPSR7VU5BTUVfTUFDSElORX0KLQkjZWxzZQotCUNQVT0KLQkjZW5kaWYKLQkjZW5kaWYKLUVPRgotCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwICdeQ1BVJ2AKLQl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIHsgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IjsgZXhpdDsgfQotCTs7Ci0gICAgb3IzMjpMaW51eDoqOiopCi0JZWNobyBvcjMyLXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHBhZHJlOkxpbnV4Oio6KikKLQllY2hvIHNwYXJjLXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHBhcmlzYzY0OkxpbnV4Oio6KiB8IGhwcGE2NDpMaW51eDoqOiopCi0JZWNobyBocHBhNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgcGFyaXNjOkxpbnV4Oio6KiB8IGhwcGE6TGludXg6KjoqKQotCSMgTG9vayBmb3IgQ1BVIGxldmVsCi0JY2FzZSBgZ3JlcCAnXmNwdVteYS16XSo6JyAvcHJvYy9jcHVpbmZvIDI+L2Rldi9udWxsIHwgY3V0IC1kJyAnIC1mMmAgaW4KLQkgIFBBNyopIGVjaG8gaHBwYTEuMS11bmtub3duLWxpbnV4LWdudSA7OwotCSAgUEE4KikgZWNobyBocHBhMi4wLXVua25vd24tbGludXgtZ251IDs7Ci0JICAqKSAgICBlY2hvIGhwcGEtdW5rbm93bi1saW51eC1nbnUgOzsKLQllc2FjCi0JZXhpdCA7OwotICAgIHBwYzY0OkxpbnV4Oio6KikKLQllY2hvIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBwcGM6TGludXg6KjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4Ci0JZXhpdCA7OwotICAgIHNoNjQqOkxpbnV4Oio6KikKLSAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHNoKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICB2YXg6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHg4Nl82NDpMaW51eDoqOiopCi0JZWNobyB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgeHRlbnNhKjpMaW51eDoqOiopCi0gICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBpKjg2OkRZTklYL3B0eDo0KjoqKQotCSMgcHR4IDQuMCBkb2VzIHVuYW1lIC1zIGNvcnJlY3RseSwgd2l0aCBEWU5JWC9wdHggaW4gdGhlcmUuCi0JIyBlYXJsaWVyIHZlcnNpb25zIGFyZSBtZXNzZWQgdXAgYW5kIHB1dCB0aGUgbm9kZW5hbWUgaW4gYm90aAotCSMgc3lzbmFtZSBhbmQgbm9kZW5hbWUuCi0JZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKLQlleGl0IDs7Ci0gICAgaSo4NjpVTklYX1NWOjQuMk1QOjIuKikKLSAgICAgICAgIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgotICAgICAgICAjIG51bWJlciBzZXJpZXMgc3RhcnRpbmcgd2l0aCAyLi4uCi0gICAgICAgICMgSSBhbSBub3QgcG9zaXRpdmUgdGhhdCBvdGhlciBTVlI0IHN5c3RlbXMgd29uJ3QgbWF0Y2ggdGhpcywKLQkjIEkganVzdCBoYXZlIHRvIGhvcGUuICAtLSBybXMuCi0gICAgICAgICMgVXNlIHN5c3Y0LjJ1dy4uLiBzbyB0aGF0IHN5c3Y0KiBtYXRjaGVzIGl0LgotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2NC4ydXcke1VOQU1FX1ZFUlNJT059Ci0JZXhpdCA7OwotICAgIGkqODY6T1MvMjoqOiopCi0JIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKLQkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAotCWV4aXQgOzsKLSAgICBpKjg2OlhUUy0zMDA6KjpTVE9QKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN0b3AKLQlleGl0IDs7Ci0gICAgaSo4NjphdGhlb3M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWF0aGVvcwotCWV4aXQgOzsKLSAgICBpKjg2OnN5bGxhYmxlOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lsbGFibGUKLQlleGl0IDs7Ci0gICAgaSo4NjpMeW54T1M6Mi4qOiogfCBpKjg2Okx5bnhPUzozLlswMV0qOiogfCBpKjg2Okx5bnhPUzo0LlswMl0qOiopCi0JZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBpKjg2OipET1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCi0JZXhpdCA7OwotICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCi0JVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCi0JaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMfQotCWVsc2UKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KLQlmaQotCWV4aXQgOzsKLSAgICBpKjg2Oio6NTpbNjc4XSopCi0gICAgCSMgVW5peFdhcmUgNy54LCBPcGVuVU5JWCBhbmQgT3BlblNlcnZlciA2LgotCWNhc2UgYC9iaW4vdW5hbWUgLVggfCBncmVwICJeTWFjaGluZSJgIGluCi0JICAgICo0ODYqKQkgICAgIFVOQU1FX01BQ0hJTkU9aTQ4NiA7OwotCSAgICAqUGVudGl1bSkJICAgICBVTkFNRV9NQUNISU5FPWk1ODYgOzsKLQkgICAgKlBlbnQqfCpDZWxlcm9uKSBVTkFNRV9NQUNISU5FPWk2ODYgOzsKLQllc2FjCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0ke1VOQU1FX1NZU1RFTX0ke1VOQU1FX1ZFUlNJT059Ci0JZXhpdCA7OwotICAgIGkqODY6KjozLjI6KikKLQlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCi0JCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKLQllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxncmVwIFJlbGVhc2V8c2VkIC1lICdzLy4qPSAvLycpYAotCQkoL2Jpbi91bmFtZSAtWHxncmVwIGk4MDQ4NiA+L2Rldi9udWxsKSAmJiBVTkFNRV9NQUNISU5FPWk0ODYKLQkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgotCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudCAqSUknID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgotCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bSBQcm8nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2NvJFVOQU1FX1JFTAotCWVsc2UKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3YzMgotCWZpCi0JZXhpdCA7OwotICAgIHBjOio6KjoqKQotCSMgTGVmdCBoZXJlIGZvciBjb21wYXRpYmlsaXR5OgotICAgICAgICAjIHVuYW1lIC1tIHByaW50cyBmb3IgREpHUFAgYWx3YXlzICdwYycsIGJ1dCBpdCBwcmludHMgbm90aGluZyBhYm91dAotICAgICAgICAjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpNTg2LgotCSMgTm90ZTogd2hhdGV2ZXIgdGhpcyBpcywgaXQgTVVTVCBiZSB0aGUgc2FtZSBhcyB3aGF0IGNvbmZpZy5zdWIKLQkjIHByaW50cyBmb3IgdGhlICJkamdwcCIgaG9zdCwgb3IgZWxzZSBHREIgY29uZmlndXJ5IHdpbGwgZGVjaWRlIHRoYXQKLQkjIHRoaXMgaXMgYSBjcm9zcy1idWlsZC4KLQllY2hvIGk1ODYtcGMtbXNkb3NkamdwcAotICAgICAgICBleGl0IDs7Ci0gICAgSW50ZWw6TWFjaDozKjoqKQotCWVjaG8gaTM4Ni1wYy1tYWNoMwotCWV4aXQgOzsKLSAgICBwYXJhZ29uOio6KjoqKQotCWVjaG8gaTg2MC1pbnRlbC1vc2YxCi0JZXhpdCA7OwotICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKLQlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAotCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KLQkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0Ci0JZmkKLQlleGl0IDs7Ci0gICAgbWluaSo6Q1RJWDpTWVMqNToqKQotCSMgIm1pbmlmcmFtZSIKLQllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKLQlleGl0IDs7Ci0gICAgbWM2OGs6VU5JWDpTWVNURU01OjMuNTFtKQotCWVjaG8gbTY4ay1jb252ZXJnZW50LXN5c3YKLQlleGl0IDs7Ci0gICAgTTY4MD8wOkQtTklYOjUuMzoqKQotCWVjaG8gbTY4ay1kaWFiLWRuaXgKLQlleGl0IDs7Ci0gICAgTTY4KjoqOlIzVls1Njc4XSo6KikKLQl0ZXN0IC1yIC9zeXNWNjggJiYgeyBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnOyBleGl0OyB9IDs7Ci0gICAgM1szNDVdPz86Kjo0LjA6My4wIHwgM1szNF0/P0E6Kjo0LjA6My4wIHwgM1szNF0/PywqOio6NC4wOjMuMCB8IDNbMzRdPz8vKjoqOjQuMDozLjAgfCA0NDAwOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wIHwgU0tBNDA6Kjo0LjA6My4wIHwgU0RTMjoqOjQuMDozLjAgfCBTSEcyOio6NC4wOjMuMCB8IFM3NTAxKjoqOjQuMDozLjApCi0JT1NfUkVMPScnCi0JdGVzdCAtciAvZXRjLy5yZWxpZCBcCi0JJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLQkgICYmIHsgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9Ci0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCi0JICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OwotICAgIDNbMzRdPz86Kjo0LjA6KiB8IDNbMzRdPz8sKjoqOjQuMDoqKQotICAgICAgICAvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLSAgICAgICAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQ7IGV4aXQ7IH0gOzsKLSAgICBOQ1IqOio6NC4yOiogfCBNUFJBUyo6Kjo0LjI6KikKLQlPU19SRUw9Jy4zJwotCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAotCSAgICAmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotCSAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAotCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgcHRlcm9uID4vZGV2L251bGwgXAotCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OwotICAgIG02OCo6THlueE9TOjIuKjoqIHwgbTY4KjpMeW54T1M6My4wKjoqKQotCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQotCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAotCWV4aXQgOzsKLSAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKLQllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICByczYwMDA6THlueE9TOjIuKjoqKQotCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuWzAyXSo6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCi0JZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCi0JZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgOzsKLSAgICBSTSo6U0lOSVgtKjoqOiopCi0JZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgOzsKLSAgICAqOlNJTklYLSo6KjoqKQotCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCi0JCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKLQllbHNlCi0JCWVjaG8gbnMzMmstc25pLXN5c3YKLQlmaQotCWV4aXQgOzsKLSAgICBQRU5USVVNOio6NC4wKjoqKSAjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAotICAgICAgICAgICAgICAgICAgICAgICMgc2F5cyA8UmljaGFyZC5NLkJhcnRlbEBjY01haWwuQ2Vuc3VzLkdPVj4KLSAgICAgICAgZWNobyBpNTg2LXVuaXN5cy1zeXN2NAotICAgICAgICBleGl0IDs7Ci0gICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCi0JIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgotCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQotCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCA7OwotICAgICo6KjoqOkZUWCopCi0JIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCi0JZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKLQlleGl0IDs7Ci0gICAgaSo4NjpWT1M6KjoqKQotCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zdHJhdHVzLXZvcwotCWV4aXQgOzsKLSAgICAqOlZPUzoqOiopCi0JIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCi0JZWNobyBocHBhMS4xLXN0cmF0dXMtdm9zCi0JZXhpdCA7OwotICAgIG1jNjgqOkEvVVg6KjoqKQotCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIG5ld3MqOk5FV1MtT1M6Nio6KikKLQllY2hvIG1pcHMtc29ueS1uZXdzb3M2Ci0JZXhpdCA7OwotICAgIFJbMzRdMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFIqMDAwOlVOSVhfU1Y6KjoqKQotCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgotCSAgICAgICAgZWNobyBtaXBzLW5lYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWVsc2UKLQkgICAgICAgIGVjaG8gbWlwcy11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLSAgICAgICAgZXhpdCA7OwotICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYmUtYmVvcwotCWV4aXQgOzsKLSAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCi0JZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKLQlleGl0IDs7Ci0gICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KLQllY2hvIGk1ODYtcGMtYmVvcwotCWV4aXQgOzsKLSAgICBCZVBDOkhhaWt1Oio6KikJIyBIYWlrdSBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCi0JZWNobyBpNTg2LXBjLWhhaWt1Ci0JZXhpdCA7OwotICAgIFNYLTQ6U1VQRVItVVg6KjoqKQotCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBTWC01OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgU1gtNjpTVVBFUi1VWDoqOiopCi0JZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFNYLTc6U1VQRVItVVg6KjoqKQotCWVjaG8gc3g3LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBTWC04OlNVUEVSLVVYOio6KikKLQllY2hvIHN4OC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgU1gtOFI6U1VQRVItVVg6KjoqKQotCWVjaG8gc3g4ci1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKLQllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6UmhhcHNvZHk6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpEYXJ3aW46KjoqKQotCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgIHx8IFVOQU1FX1BST0NFU1NPUj11bmtub3duCi0JY2FzZSAkVU5BTUVfUFJPQ0VTU09SIGluCi0JICAgIGkzODYpCi0JCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJaWYgWyAiJENDX0ZPUl9CVUlMRCIgIT0gJ25vX2NvbXBpbGVyX2ZvdW5kJyBdOyB0aGVuCi0JCSAgaWYgKGVjaG8gJyNpZmRlZiBfX0xQNjRfXyc7IGVjaG8gSVNfNjRCSVRfQVJDSDsgZWNobyAnI2VuZGlmJykgfCBcCi0JCSAgICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfCBcCi0JCSAgICAgIGdyZXAgSVNfNjRCSVRfQVJDSCA+L2Rldi9udWxsCi0JCSAgdGhlbgotCQkgICAgICBVTkFNRV9QUk9DRVNTT1I9Ing4Nl82NCIKLQkJICBmaQotCQlmaSA7OwotCSAgICB1bmtub3duKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYyA7OwotCWVzYWMKLQllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6cHJvY250byo6KjoqIHwgKjpRTlg6WzAxMjM0NTY3ODldKjoqKQotCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgCi0JaWYgdGVzdCAiJFVOQU1FX1BST0NFU1NPUiIgPSAieDg2IjsgdGhlbgotCQlVTkFNRV9QUk9DRVNTT1I9aTM4NgotCQlVTkFNRV9NQUNISU5FPXBjCi0JZmkKLQllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS0ke1VOQU1FX01BQ0hJTkV9LW50by1xbngke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6UU5YOio6NCopCi0JZWNobyBpMzg2LXBjLXFueAotCWV4aXQgOzsKLSAgICBOU0UtPzpOT05TVE9QX0tFUk5FTDoqOiopCi0JZWNobyBuc2UtdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgTlNSLT86Tk9OU1RPUF9LRVJORUw6KjoqKQotCWVjaG8gbnNyLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6Tm9uU3RvcC1VWDoqOiopCi0JZWNobyBtaXBzLWNvbXBhcS1ub25zdG9wdXgKLQlleGl0IDs7Ci0gICAgQlMyMDAwOlBPU0lYKjoqOiopCi0JZWNobyBiczIwMDAtc2llbWVucy1zeXN2Ci0JZXhpdCA7OwotICAgIERTLyo6VU5JWF9TeXN0ZW1fVjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VU5BTUVfU1lTVEVNfS0ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6UGxhbjk6KjoqKQotCSMgInVuYW1lIC1tIiBpcyBub3QgY29uc2lzdGVudCwgc28gdXNlICRjcHV0eXBlIGluc3RlYWQuIDM4NgotCSMgaXMgY29udmVydGVkIHRvIGkzODYgZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgeDg2Ci0JIyBvcGVyYXRpbmcgc3lzdGVtcy4KLQlpZiB0ZXN0ICIkY3B1dHlwZSIgPSAiMzg2IjsgdGhlbgotCSAgICBVTkFNRV9NQUNISU5FPWkzODYKLQllbHNlCi0JICAgIFVOQU1FX01BQ0hJTkU9IiRjcHV0eXBlIgotCWZpCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tcGxhbjkKLQlleGl0IDs7Ci0gICAgKjpUT1BTLTEwOio6KikKLQllY2hvIHBkcDEwLXVua25vd24tdG9wczEwCi0JZXhpdCA7OwotICAgICo6VEVORVg6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi10ZW5leAotCWV4aXQgOzsKLSAgICBLUzEwOlRPUFMtMjA6KjoqIHwgS0wxMDpUT1BTLTIwOio6KiB8IFRZUEU0OlRPUFMtMjA6KjoqKQotCWVjaG8gcGRwMTAtZGVjLXRvcHMyMAotCWV4aXQgOzsKLSAgICBYS0wtMTpUT1BTLTIwOio6KiB8IFRZUEU1OlRPUFMtMjA6KjoqKQotCWVjaG8gcGRwMTAteGtsLXRvcHMyMAotCWV4aXQgOzsKLSAgICAqOlRPUFMtMjA6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMjAKLQlleGl0IDs7Ci0gICAgKjpJVFM6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi1pdHMKLQlleGl0IDs7Ci0gICAgU0VJOio6KjpTRUlVWCkKLSAgICAgICAgZWNobyBtaXBzLXNlaS1zZWl1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpEcmFnb25GbHk6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWRyYWdvbmZseWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKLQlleGl0IDs7Ci0gICAgKjoqVk1TOio6KikKLSAgICAJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICBBKikgZWNobyBhbHBoYS1kZWMtdm1zIDsgZXhpdCA7OwotCSAgICBJKikgZWNobyBpYTY0LWRlYy12bXMgOyBleGl0IDs7Ci0JICAgIFYqKSBlY2hvIHZheC1kZWMtdm1zIDsgZXhpdCA7OwotCWVzYWMgOzsKLSAgICAqOlhFTklYOio6U3lzVikKLQllY2hvIGkzODYtcGMteGVuaXgKLQlleGl0IDs7Ci0gICAgaSo4Njpza3lvczoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNreW9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfWAgfCBzZWQgLWUgJ3MvIC4qJC8vJwotCWV4aXQgOzsKLSAgICBpKjg2OnJkb3M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1yZG9zCi0JZXhpdCA7OwotICAgIGkqODY6QVJPUzoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWFyb3MKLQlleGl0IDs7Ci1lc2FjCi0KLSNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgotI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgotCi1ldmFsICRzZXRfY2NfZm9yX2J1aWxkCi1jYXQgPiRkdW1teS5jIDw8RU9GCi0jaWZkZWYgX1NFUVVFTlRfCi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgotI2VuZGlmCi1tYWluICgpCi17Ci0jaWYgZGVmaW5lZCAoc29ueSkKLSNpZiBkZWZpbmVkIChNSVBTRUIpCi0gIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCi0gICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCi0gIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0gIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKLSNpZmRlZiBORVdTT1M0Ci0gICAgICAgICAgIjQiCi0jZWxzZQotCSAgIiIKLSNlbmRpZgotICAgICAgICAgKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKLSAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCi0gIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE5lWFQpCi0jaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCi0jZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCi0jZW5kaWYKLSAgaW50IHZlcnNpb247Ci0gIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKLSAgaWYgKHZlcnNpb24gPCA0KQotICAgIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7Ci0gIGVsc2UKLSAgICBwcmludGYgKCIlcy1uZXh0LW9wZW5zdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOwotICBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKLSNpZiBkZWZpbmVkIChVTUFYVikKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaWYgZGVmaW5lZCAoQ01VKQotICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX18zODZCU0RfXykKLSAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoc2VxdWVudCkKLSNpZiBkZWZpbmVkIChpMzg2KQotICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2lmIGRlZmluZWQgKG5zMzIwMDApCi0gIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCi0gICAgc3RydWN0IHV0c25hbWUgdW47Ci0KLSAgICB1bmFtZSgmdW4pOwotCi0gICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgewotCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7Ci0gICAgfQotICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCi0JcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKLSAgICB9Ci0gICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOwotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHZheCkKLSMgaWYgIWRlZmluZWQgKHVsdHJpeCkKLSMgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgaWYgZGVmaW5lZCAoQlNEKQotIyAgIGlmIEJTRCA9PSA0MwotICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNcbiIpOyBleGl0ICgwKTsKLSMgICBlbHNlCi0jICAgIGlmIEJTRCA9PSAxOTkwMDYKLSAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zcmVub1xuIik7IGV4aXQgKDApOwotIyAgICBlbHNlCi0gICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbHNlCi0gICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKLSMgIGVuZGlmCi0jIGVsc2UKLSAgICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQotICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotICBleGl0ICgxKTsKLX0KLUVPRgotCi0kQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCAmJiBTWVNURU1fTkFNRT1gJGR1bW15YCAmJgotCXsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQotCi0jIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCi0KLXRlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdDsgfQotCi0jIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCi0KLWlmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCi10aGVuCi0gICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KLSAgICBjMSopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0JZXhpdCA7OwotICAgIGMyKikKLQlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKLQl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKLQllbHNlIGVjaG8gYzItY29udmV4LWJzZAotCWZpCi0JZXhpdCA7OwotICAgIGMzNCopCi0JZWNobyBjMzQtY29udmV4LWJzZAotCWV4aXQgOzsKLSAgICBjMzgqKQotCWVjaG8gYzM4LWNvbnZleC1ic2QKLQlleGl0IDs7Ci0gICAgYzQqKQotCWVjaG8gYzQtY29udmV4LWJzZAotCWV4aXQgOzsKLSAgICBlc2FjCi1maQotCi1jYXQgPiYyIDw8RU9GCi0kMDogdW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlCi0KLVRoaXMgc2NyaXB0LCBsYXN0IG1vZGlmaWVkICR0aW1lc3RhbXAsIGhhcyBmYWlsZWQgdG8gcmVjb2duaXplCi10aGUgb3BlcmF0aW5nIHN5c3RlbSB5b3UgYXJlIHVzaW5nLiBJdCBpcyBhZHZpc2VkIHRoYXQgeW91Ci1kb3dubG9hZCB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlIGNvbmZpZyBzY3JpcHRzIGZyb20KLQotICBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLmd1ZXNzO2hiPUhFQUQKLWFuZAotICBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLnN1YjtoYj1IRUFECi0KLUlmIHRoZSB2ZXJzaW9uIHlvdSBydW4gKCQwKSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHBsZWFzZQotc2VuZCB0aGUgZm9sbG93aW5nIGRhdGEgYW5kIGFueSBpbmZvcm1hdGlvbiB5b3UgdGhpbmsgbWlnaHQgYmUKLXBlcnRpbmVudCB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4gaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgbmVlZGVkCi1pbmZvcm1hdGlvbiB0byBoYW5kbGUgeW91ciBzeXN0ZW0uCi0KLWNvbmZpZy5ndWVzcyB0aW1lc3RhbXAgPSAkdGltZXN0YW1wCi0KLXVuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotCi0vdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsYAotL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsYAotCi1ob3N0aW5mbyAgICAgICAgICAgICAgID0gYChob3N0aW5mbykgMj4vZGV2L251bGxgCi0vYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAKLS91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsYAotL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbGAKLS91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsYAotL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGxgCi0KLVVOQU1FX01BQ0hJTkUgPSAke1VOQU1FX01BQ0hJTkV9Ci1VTkFNRV9SRUxFQVNFID0gJHtVTkFNRV9SRUxFQVNFfQotVU5BTUVfU1lTVEVNICA9ICR7VU5BTUVfU1lTVEVNfQotVU5BTUVfVkVSU0lPTiA9ICR7VU5BTUVfVkVSU0lPTn0KLUVPRgotCi1leGl0IDEKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJyIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb25maWcuaC5pbiBiL3NyYy9saWJwbmcvY29uZmlnLmguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMjM0OTUuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb25maWcuaC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsZmNuLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfRExGQ05fSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG0nIGxpYnJhcnkgKC1sbSkuICovCi0jdW5kZWYgSEFWRV9MSUJNCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgeicgbGlicmFyeSAoLWx6KS4gKi8KLSN1bmRlZiBIQVZFX0xJQloKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX01FTU9SWV9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVtc2V0JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX01FTVNFVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBvdycgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9QT1cKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVERJTlRfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfU1RBVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgdG8gdGhlIHN1Yi1kaXJlY3RvcnkgaW4gd2hpY2ggbGlidG9vbCBzdG9yZXMgdW5pbnN0YWxsZWQgbGlicmFyaWVzLgotICAgKi8KLSN1bmRlZiBMVF9PQkpESVIKLQotLyogTmFtZSBvZiBwYWNrYWdlICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KLSN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVAotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9OQU1FCi0KLS8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1NUUklORwotCi0vKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9UQVJOQU1FCi0KLS8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9VUkwKLQotLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1ZFUlNJT04KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdXIgPHN5cy90aW1lLmg+IGRlY2xhcmVzIGBzdHJ1Y3QgdG0nLiAqLwotI3VuZGVmIFRNX0lOX1NZU19USU1FCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiBgY29uc3QnIGRvZXMgbm90IGNvbmZvcm0gdG8gQU5TSSBDLiAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBgdW5zaWduZWQgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KLSN1bmRlZiBzaXplX3QKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29uZmlnLnN1YiBiL3NyYy9saWJwbmcvY29uZmlnLnN1YgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmE1NWE1MC4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbmZpZy5zdWIKKysrIC9kZXYvbnVsbApAQCAtMSwxNzA1ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5Ci0jICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLXRpbWVzdGFtcD0nMjAwOS0xMS0yMCcKLQotIyBUaGlzIGZpbGUgaXMgKGluIHByaW5jaXBsZSkgY29tbW9uIHRvIEFMTCBHTlUgc29mdHdhcmUuCi0jIFRoZSBwcmVzZW5jZSBvZiBhIG1hY2hpbmUgaW4gdGhpcyBmaWxlIHN1Z2dlc3RzIHRoYXQgU09NRSBHTlUgc29mdHdhcmUKLSMgY2FuIGhhbmRsZSB0aGF0IG1hY2hpbmUuICBJdCBkb2VzIG5vdCBpbXBseSBBTEwgR05VIHNvZnR3YXJlIGNhbi4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSMgMDIxMTAtMTMwMSwgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLQotIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKLSMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgR05VIENoYW5nZUxvZyBlbnRyeS4KLSMKLSMgQ29uZmlndXJhdGlvbiBzdWJyb3V0aW5lIHRvIHZhbGlkYXRlIGFuZCBjYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIHR5cGUuCi0jIFN1cHBseSB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gdHlwZSBhcyBhbiBhcmd1bWVudC4KLSMgSWYgaXQgaXMgaW52YWxpZCwgd2UgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBvbiBzdGRlcnIgYW5kIGV4aXQgd2l0aCBjb2RlIDEuCi0jIE90aGVyd2lzZSwgd2UgcHJpbnQgdGhlIGNhbm9uaWNhbCBjb25maWcgdHlwZSBvbiBzdGRvdXQgYW5kIHN1Y2NlZWQuCi0KLSMgWW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgc2NyaXB0IGZyb206Ci0jIGh0dHA6Ly9naXQuc2F2YW5uYWguZ251Lm9yZy9naXR3ZWIvP3A9Y29uZmlnLmdpdDthPWJsb2JfcGxhaW47Zj1jb25maWcuc3ViO2hiPUhFQUQKLQotIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKLSMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCi0jIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCi0jIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCi0jIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAotIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCi0jIGNvbmZpZ3VyYXRpb24uCi0KLSMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCi0jIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06Ci0jCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCi0jIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCi0jIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KLQotbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCi0KLXVzYWdlPSJcCi1Vc2FnZTogJDAgW09QVElPTl0gQ1BVLU1GUi1PUFNZUwotICAgICAgICQwIFtPUFRJT05dIEFMSUFTCi0KLUNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZS4KLQotT3BlcmF0aW9uIG1vZGVzOgotICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKLSAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAotICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAotCi1SZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgotCi12ZXJzaW9uPSJcCi1HTlUgY29uZmlnLnN1YiAoJHRpbWVzdGFtcCkKLQotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAotMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KLXdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKLQotaGVscD0iCi1UcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgUGFyc2UgY29tbWFuZCBsaW5lCi13aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCi0gICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDs7Ci0gICAgLS12ZXJzaW9uIHwgLXYgKQotICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgOzsKLSAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQotICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgOzsKLSAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKLSAgICAgICBzaGlmdDsgYnJlYWsgOzsKLSAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCi0gICAgICAgYnJlYWsgOzsKLSAgICAtKiApCi0gICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIgotICAgICAgIGV4aXQgMSA7OwotCi0gICAgKmxvY2FsKikKLSAgICAgICAjIEZpcnN0IHBhc3MgdGhyb3VnaCBhbnkgbG9jYWwgbWFjaGluZSB0eXBlcy4KLSAgICAgICBlY2hvICQxCi0gICAgICAgZXhpdCA7OwotCi0gICAgKiApCi0gICAgICAgYnJlYWsgOzsKLSAgZXNhYwotZG9uZQotCi1jYXNlICQjIGluCi0gMCkgZWNobyAiJG1lOiBtaXNzaW5nIGFyZ3VtZW50JGhlbHAiID4mMgotICAgIGV4aXQgMTs7Ci0gMSkgOzsKLSAqKSBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKLSAgICBleGl0IDE7OwotZXNhYwotCi0jIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCi0jIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgotbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCi1jYXNlICRtYXliZV9vcyBpbgotICBudG8tcW54KiB8IGxpbnV4LWdudSogfCBsaW51eC1kaWV0bGliYyB8IGxpbnV4LW5ld2xpYiogfCBsaW51eC11Y2xpYmMqIHwgXAotICB1Y2xpbnV4LXVjbGliYyogfCB1Y2xpbnV4LWdudSogfCBrZnJlZWJzZCotZ251KiB8IGtuZXRic2QqLWdudSogfCBuZXRic2QqLWdudSogfCBcCi0gIGtvcGVuc29sYXJpcyotZ251KiB8IFwKLSAgc3Rvcm0tY2hhb3MqIHwgb3MyLWVteCogfCBydG1rLW5vdmEqKQotICAgIG9zPS0kbWF5YmVfb3MKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYAotICAgIDs7Ci0gICopCi0gICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAotICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQotICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKLSAgICBlbHNlIG9zPTsgZmkKLSAgICA7OwotZXNhYwotCi0jIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KLSMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCi0jIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCi0jIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KLWNhc2UgJG9zIGluCi0JLXN1bipvcyopCi0JCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgotCQk7OwotCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCi0JLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCi0JLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKLQktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAotCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCi0JLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCi0JLWFwcGxlIHwgLWF4aXMgfCAta251dGggfCAtY3JheSB8IC1taWNyb2JsYXplKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotICAgICAgICAtYmx1ZWdlbmUqKQotCSAgICAgICAgb3M9LWNuawotCQk7OwotCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zY291dCkKLQkJOzsKLQktd3JzKQotCQlvcz0tdnh3b3JrcwotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLWNob3J1c29zKikKLQkJb3M9LWNob3J1c29zCi0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLSAJLWNob3J1c3JkYikKLSAJCW9zPS1jaG9ydXNyZGIKLQkJYmFzaWNfbWFjaGluZT0kMQotIAkJOzsKLQktaGl1eCopCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JLXNjbzYpCi0JCW9zPS1zY281djYKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY281KQotCQlvcz0tc2NvMy4ydjUKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY280KQotCQlvcz0tc2NvMy4ydjQKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjIuWzQtOV0qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvMy4ydls0LTldKikKLQkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY281djYqKQotCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbyopCi0JCW9zPS1zY28zLjJ2MgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXVkayopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktaXNjKQotCQlvcz0taXNjMi4yCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktY2xpeCopCi0JCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCi0JCTs7Ci0JLWlzYyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktbHlueCopCi0JCW9zPS1seW54b3MKLQkJOzsKLQktcHR4KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1zZXF1ZW50LydgCi0JCTs7Ci0JLXdpbmRvd3NudCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy93aW5kb3dzbnQvd2lubnQvJ2AKLQkJOzsKLQktcHNvcyopCi0JCW9zPS1wc29zCi0JCTs7Ci0JLW1pbnQgfCAtbWludFswLTldKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCi0JCW9zPS1taW50Ci0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIGFsaWFzZXMgZm9yIGNlcnRhaW4gQ1BVLUNPTVBBTlkgY29tYmluYXRpb25zLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUuCi0JIyBTb21lIGFyZSBvbWl0dGVkIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBiZWxvdy4KLQkxNzUwYSB8IDU4MCBcCi0JfCBhMjlrIFwKLQl8IGFscGhhIHwgYWxwaGFldls0LThdIHwgYWxwaGFldjU2IHwgYWxwaGFldjZbNzhdIHwgYWxwaGFwY2E1WzY3XSBcCi0JfCBhbHBoYTY0IHwgYWxwaGE2NGV2WzQtOF0gfCBhbHBoYTY0ZXY1NiB8IGFscGhhNjRldjZbNzhdIHwgYWxwaGE2NHBjYTVbNjddIFwKLQl8IGFtMzNfMi4wIFwKLQl8IGFyYyB8IGFybSB8IGFybVtibF1lIHwgYXJtZVtsYl0gfCBhcm12WzIzNDVdIHwgYXJtdlszNDVdW2xiXSB8IGF2ciB8IGF2cjMyIFwKLQl8IGJmaW4gXAotCXwgYzR4IHwgY2xpcHBlciBcCi0JfCBkMTB2IHwgZDMwdiB8IGRseCB8IGRzcDE2eHggXAotCXwgZmlkbyB8IGZyMzAgfCBmcnYgXAotCXwgaDgzMDAgfCBoODUwMCB8IGhwcGEgfCBocHBhMS5bMDFdIHwgaHBwYTIuMCB8IGhwcGEyLjBbbnddIHwgaHBwYTY0IFwKLQl8IGkzNzAgfCBpODYwIHwgaTk2MCB8IGlhNjQgXAotCXwgaXAyayB8IGlxMjAwMCBcCi0JfCBsbTMyIFwKLQl8IG0zMmMgfCBtMzJyIHwgbTMycmxlIHwgbTY4MDAwIHwgbTY4ayB8IG04OGsgXAotCXwgbWF4cSB8IG1iIHwgbWljcm9ibGF6ZSB8IG1jb3JlIHwgbWVwIHwgbWV0YWcgXAotCXwgbWlwcyB8IG1pcHNiZSB8IG1pcHNlYiB8IG1pcHNlbCB8IG1pcHNsZSBcCi0JfCBtaXBzMTYgXAotCXwgbWlwczY0IHwgbWlwczY0ZWwgXAotCXwgbWlwczY0b2N0ZW9uIHwgbWlwczY0b2N0ZW9uZWwgXAotCXwgbWlwczY0b3Jpb24gfCBtaXBzNjRvcmlvbmVsIFwKLQl8IG1pcHM2NHI1OTAwIHwgbWlwczY0cjU5MDBlbCBcCi0JfCBtaXBzNjR2ciB8IG1pcHM2NHZyZWwgXAotCXwgbWlwczY0dnI0MTAwIHwgbWlwczY0dnI0MTAwZWwgXAotCXwgbWlwczY0dnI0MzAwIHwgbWlwczY0dnI0MzAwZWwgXAotCXwgbWlwczY0dnI1MDAwIHwgbWlwczY0dnI1MDAwZWwgXAotCXwgbWlwczY0dnI1OTAwIHwgbWlwczY0dnI1OTAwZWwgXAotCXwgbWlwc2lzYTMyIHwgbWlwc2lzYTMyZWwgXAotCXwgbWlwc2lzYTMycjIgfCBtaXBzaXNhMzJyMmVsIFwKLQl8IG1pcHNpc2E2NCB8IG1pcHNpc2E2NGVsIFwKLQl8IG1pcHNpc2E2NHIyIHwgbWlwc2lzYTY0cjJlbCBcCi0JfCBtaXBzaXNhNjRzYjEgfCBtaXBzaXNhNjRzYjFlbCBcCi0JfCBtaXBzaXNhNjRzcjcxayB8IG1pcHNpc2E2NHNyNzFrZWwgXAotCXwgbWlwc3R4MzkgfCBtaXBzdHgzOWVsIFwKLQl8IG1uMTAyMDAgfCBtbjEwMzAwIFwKLQl8IG1veGllIFwKLQl8IG10IFwKLQl8IG1zcDQzMCBcCi0JfCBuaW9zIHwgbmlvczIgXAotCXwgbnMxNmsgfCBuczMyayBcCi0JfCBvcjMyIFwKLQl8IHBkcDEwIHwgcGRwMTEgfCBwaiB8IHBqbCBcCi0JfCBwb3dlcnBjIHwgcG93ZXJwYzY0IHwgcG93ZXJwYzY0bGUgfCBwb3dlcnBjbGUgfCBwcGNiZSBcCi0JfCBweXJhbWlkIFwKLQl8IHJ4IFwKLQl8IHNjb3JlIFwKLQl8IHNoIHwgc2hbMTIzNF0gfCBzaFsyNF1hIHwgc2hbMjRdYWViIHwgc2hbMjNdZSB8IHNoWzM0XWViIHwgc2hlYiB8IHNoYmUgfCBzaGxlIHwgc2hbMTIzNF1sZSB8IHNoM2VsZSBcCi0JfCBzaDY0IHwgc2g2NGxlIFwKLQl8IHNwYXJjIHwgc3BhcmM2NCB8IHNwYXJjNjRiIHwgc3BhcmM2NHYgfCBzcGFyYzg2eCB8IHNwYXJjbGV0IHwgc3BhcmNsaXRlIFwKLQl8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIgfCBzcGFyY3Y5diBcCi0JfCBzcHUgfCBzdHJvbmdhcm0gXAotCXwgdGFob2UgfCB0aHVtYiB8IHRpYzR4IHwgdGljODAgfCB0cm9uIFwKLQl8IHViaWNvbTMyIFwKLQl8IHY4NTAgfCB2ODUwZSBcCi0JfCB3ZTMyayBcCi0JfCB4ODYgfCB4YzE2eCB8IHhzY2FsZSB8IHhzY2FsZWVbYmxdIHwgeHN0b3JteTE2IHwgeHRlbnNhIFwKLQl8IHo4ayB8IHo4MCkKLQkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCi0JCTs7Ci0JbTY4MTEgfCBtNjhoYzExIHwgbTY4MTIgfCBtNjhoYzEyIHwgcGljb2NoaXApCi0JCSMgTW90b3JvbGEgNjhIQzExLzEyLgotCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KLQkJb3M9LW5vbmUKLQkJOzsKLQltODgxMTAgfCBtNjgwWzEyMzQ2XTAgfCBtNjgzPzIgfCBtNjgzNjAgfCBtNTIwMCB8IHY3MCB8IHc2NSB8IHo4aykKLQkJOzsKLQltczEpCi0JCWJhc2ljX21hY2hpbmU9bXQtdW5rbm93bgotCQk7OwotCi0JIyBXZSB1c2UgYHBjJyByYXRoZXIgdGhhbiBgdW5rbm93bicKLQkjIGJlY2F1c2UgKDEpIHRoYXQncyB3aGF0IHRoZXkgbm9ybWFsbHkgYXJlLCBhbmQKLQkjICgyKSB0aGUgd29yZCAidW5rbm93biIgdGVuZHMgdG8gY29uZnVzZSBiZWdpbm5pbmcgdXNlcnMuCi0JaSo4NiB8IHg4Nl82NCkKLQkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKLQkgIDs7Ci0JIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KLQkqLSotKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCi0JNTgwLSogXAotCXwgYTI5ay0qIFwKLQl8IGFscGhhLSogfCBhbHBoYWV2WzQtOF0tKiB8IGFscGhhZXY1Ni0qIHwgYWxwaGFldjZbNzhdLSogXAotCXwgYWxwaGE2NC0qIHwgYWxwaGE2NGV2WzQtOF0tKiB8IGFscGhhNjRldjU2LSogfCBhbHBoYTY0ZXY2Wzc4XS0qIFwKLQl8IGFscGhhcGNhNVs2N10tKiB8IGFscGhhNjRwY2E1WzY3XS0qIHwgYXJjLSogXAotCXwgYXJtLSogIHwgYXJtYmUtKiB8IGFybWxlLSogfCBhcm1lYi0qIHwgYXJtdiotKiBcCi0JfCBhdnItKiB8IGF2cjMyLSogXAotCXwgYmZpbi0qIHwgYnMyMDAwLSogXAotCXwgY1sxMjNdKiB8IGMzMC0qIHwgW2NqdF05MC0qIHwgYzR4LSogfCBjNTR4LSogfCBjNTV4LSogfCBjNngtKiBcCi0JfCBjbGlwcGVyLSogfCBjcmF5bnYtKiB8IGN5ZHJhLSogXAotCXwgZDEwdi0qIHwgZDMwdi0qIHwgZGx4LSogXAotCXwgZWx4c2ktKiBcCi0JfCBmMzBbMDFdLSogfCBmNzAwLSogfCBmaWRvLSogfCBmcjMwLSogfCBmcnYtKiB8IGZ4ODAtKiBcCi0JfCBoODMwMC0qIHwgaDg1MDAtKiBcCi0JfCBocHBhLSogfCBocHBhMS5bMDFdLSogfCBocHBhMi4wLSogfCBocHBhMi4wW253XS0qIHwgaHBwYTY0LSogXAotCXwgaSo4Ni0qIHwgaTg2MC0qIHwgaTk2MC0qIHwgaWE2NC0qIFwKLQl8IGlwMmstKiB8IGlxMjAwMC0qIFwKLQl8IGxtMzItKiBcCi0JfCBtMzJjLSogfCBtMzJyLSogfCBtMzJybGUtKiBcCi0JfCBtNjgwMDAtKiB8IG02ODBbMDEyMzQ2XTAtKiB8IG02ODM2MC0qIHwgbTY4Mz8yLSogfCBtNjhrLSogXAotCXwgbTg4MTEwLSogfCBtODhrLSogfCBtYXhxLSogfCBtY29yZS0qIHwgbWV0YWctKiB8IG1pY3JvYmxhemUtKiBcCi0JfCBtaXBzLSogfCBtaXBzYmUtKiB8IG1pcHNlYi0qIHwgbWlwc2VsLSogfCBtaXBzbGUtKiBcCi0JfCBtaXBzMTYtKiBcCi0JfCBtaXBzNjQtKiB8IG1pcHM2NGVsLSogXAotCXwgbWlwczY0b2N0ZW9uLSogfCBtaXBzNjRvY3Rlb25lbC0qIFwKLQl8IG1pcHM2NG9yaW9uLSogfCBtaXBzNjRvcmlvbmVsLSogXAotCXwgbWlwczY0cjU5MDAtKiB8IG1pcHM2NHI1OTAwZWwtKiBcCi0JfCBtaXBzNjR2ci0qIHwgbWlwczY0dnJlbC0qIFwKLQl8IG1pcHM2NHZyNDEwMC0qIHwgbWlwczY0dnI0MTAwZWwtKiBcCi0JfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogXAotCXwgbWlwczY0dnI1MDAwLSogfCBtaXBzNjR2cjUwMDBlbC0qIFwKLQl8IG1pcHM2NHZyNTkwMC0qIHwgbWlwczY0dnI1OTAwZWwtKiBcCi0JfCBtaXBzaXNhMzItKiB8IG1pcHNpc2EzMmVsLSogXAotCXwgbWlwc2lzYTMycjItKiB8IG1pcHNpc2EzMnIyZWwtKiBcCi0JfCBtaXBzaXNhNjQtKiB8IG1pcHNpc2E2NGVsLSogXAotCXwgbWlwc2lzYTY0cjItKiB8IG1pcHNpc2E2NHIyZWwtKiBcCi0JfCBtaXBzaXNhNjRzYjEtKiB8IG1pcHNpc2E2NHNiMWVsLSogXAotCXwgbWlwc2lzYTY0c3I3MWstKiB8IG1pcHNpc2E2NHNyNzFrZWwtKiBcCi0JfCBtaXBzdHgzOS0qIHwgbWlwc3R4MzllbC0qIFwKLQl8IG1taXgtKiBcCi0JfCBtdC0qIFwKLQl8IG1zcDQzMC0qIFwKLQl8IG5pb3MtKiB8IG5pb3MyLSogXAotCXwgbm9uZS0qIHwgbnAxLSogfCBuczE2ay0qIHwgbnMzMmstKiBcCi0JfCBvcmlvbi0qIFwKLQl8IHBkcDEwLSogfCBwZHAxMS0qIHwgcGotKiB8IHBqbC0qIHwgcG4tKiB8IHBvd2VyLSogXAotCXwgcG93ZXJwYy0qIHwgcG93ZXJwYzY0LSogfCBwb3dlcnBjNjRsZS0qIHwgcG93ZXJwY2xlLSogfCBwcGNiZS0qIFwKLQl8IHB5cmFtaWQtKiBcCi0JfCByb21wLSogfCByczYwMDAtKiB8IHJ4LSogXAotCXwgc2gtKiB8IHNoWzEyMzRdLSogfCBzaFsyNF1hLSogfCBzaFsyNF1hZWItKiB8IHNoWzIzXWUtKiB8IHNoWzM0XWViLSogfCBzaGViLSogfCBzaGJlLSogXAotCXwgc2hsZS0qIHwgc2hbMTIzNF1sZS0qIHwgc2gzZWxlLSogfCBzaDY0LSogfCBzaDY0bGUtKiBcCi0JfCBzcGFyYy0qIHwgc3BhcmM2NC0qIHwgc3BhcmM2NGItKiB8IHNwYXJjNjR2LSogfCBzcGFyYzg2eC0qIHwgc3BhcmNsZXQtKiBcCi0JfCBzcGFyY2xpdGUtKiBcCi0JfCBzcGFyY3Y4LSogfCBzcGFyY3Y5LSogfCBzcGFyY3Y5Yi0qIHwgc3BhcmN2OXYtKiB8IHN0cm9uZ2FybS0qIHwgc3YxLSogfCBzeD8tKiBcCi0JfCB0YWhvZS0qIHwgdGh1bWItKiBcCi0JfCB0aWMzMC0qIHwgdGljNHgtKiB8IHRpYzU0eC0qIHwgdGljNTV4LSogfCB0aWM2eC0qIHwgdGljODAtKiB8IHRpbGUtKiBcCi0JfCB0cm9uLSogXAotCXwgdWJpY29tMzItKiBcCi0JfCB2ODUwLSogfCB2ODUwZS0qIHwgdmF4LSogXAotCXwgd2UzMmstKiBcCi0JfCB4ODYtKiB8IHg4Nl82NC0qIHwgeGMxNngtKiB8IHhwczEwMC0qIHwgeHNjYWxlLSogfCB4c2NhbGVlW2JsXS0qIFwKLQl8IHhzdG9ybXkxNi0qIHwgeHRlbnNhKi0qIFwKLQl8IHltcC0qIFwKLQl8IHo4ay0qIHwgejgwLSopCi0JCTs7Ci0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZSwgd2l0aCBnbG9iIG1hdGNoLgotCXh0ZW5zYSopCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQk7OwotCSMgUmVjb2duaXplIHRoZSB2YXJpb3VzIG1hY2hpbmUgbmFtZXMgYW5kIGFsaWFzZXMgd2hpY2ggc3RhbmQKLQkjIGZvciBhIENQVSB0eXBlIGFuZCBhIGNvbXBhbnkgYW5kIHNvbWV0aW1lcyBldmVuIGFuIE9TLgotCTM4NmJzZCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LWJzZAotCQk7OwotCTNiMSB8IDczMDAgfCA3MzAwLWF0dCB8IGF0dC03MzAwIHwgcGM3MzAwIHwgc2FmYXJpIHwgdW5peHBjKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1hdHQKLQkJOzsKLQkzYiopCi0JCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0Ci0JCTs7Ci0JYTI5a2hpZikKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0gICAgCWFiYWN1cykKLQkJYmFzaWNfbWFjaGluZT1hYmFjdXMtdW5rbm93bgotCQk7OwotCWFkb2JlNjhrKQotCQliYXNpY19tYWNoaW5lPW02ODAxMC1hZG9iZQotCQlvcz0tc2NvdXQKLQkJOzsKLQlhbGxpYW50IHwgZng4MCkKLQkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKLQkJOzsKLQlhbHRvcyB8IGFsdG9zMzA2OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCi0JCTs7Ci0JYW0yOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCi0JCW9zPS1ic2QKLQkJOzsKLQlhbWQ2NCkKLQkJYmFzaWNfbWFjaGluZT14ODZfNjQtcGMKLQkJOzsKLQlhbWQ2NC0qKQotCQliYXNpY19tYWNoaW5lPXg4Nl82NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCWFtZGFobCkKLQkJYmFzaWNfbWFjaGluZT01ODAtYW1kYWhsCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JYW1pZ2EgfCBhbWlnYS0qKQotCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgotCQk7OwotCWFtaWdhb3MgfCBhbWlnYWRvcykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJb3M9LWFtaWdhb3MKLQkJOzsKLQlhbWlnYXVuaXggfCBhbWl4KQotCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgotCQlvcz0tc3lzdjQKLQkJOzsKLQlhcG9sbG82OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbwotCQlvcz0tc3lzdgotCQk7OwotCWFwb2xsbzY4YnNkKQotCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCi0JCW9zPS1ic2QKLQkJOzsKLQlhcm9zKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LWFyb3MKLQkJOzsKLQlhdXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQotCQlvcz0tYXV4Ci0JCTs7Ci0JYmFsYW5jZSkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1zZXF1ZW50Ci0JCW9zPS1keW5peAotCQk7OwotCWJsYWNrZmluKQotCQliYXNpY19tYWNoaW5lPWJmaW4tdW5rbm93bgotCQlvcz0tbGludXgKLQkJOzsKLQlibGFja2Zpbi0qKQotCQliYXNpY19tYWNoaW5lPWJmaW4tYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JYmx1ZWdlbmUqKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtaWJtCi0JCW9zPS1jbmsKLQkJOzsKLQljOTApCi0JCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotICAgICAgICBjZWdjYykKLQkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgotCQlvcz0tY2VnY2MKLQkJOzsKLQljb252ZXgtYzEpCi0JCWJhc2ljX21hY2hpbmU9YzEtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzIpCi0JCWJhc2ljX21hY2hpbmU9YzItY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzMyKQotCQliYXNpY19tYWNoaW5lPWMzMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzQpCi0JCWJhc2ljX21hY2hpbmU9YzM0LWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzOCkKLQkJYmFzaWNfbWFjaGluZT1jMzgtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljcmF5IHwgajkwKQotCQliYXNpY19tYWNoaW5lPWo5MC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQljcmF5bnYpCi0JCWJhc2ljX21hY2hpbmU9Y3JheW52LWNyYXkKLQkJb3M9LXVuaWNvc21wCi0JCTs7Ci0JY3IxNikKLQkJYmFzaWNfbWFjaGluZT1jcjE2LXVua25vd24KLQkJb3M9LWVsZgotCQk7OwotCWNyZHMgfCB1bm9zKQotCQliYXNpY19tYWNoaW5lPW02OGstY3JkcwotCQk7OwotCWNyaXN2MzIgfCBjcmlzdjMyLSogfCBldHJheGZzKikKLQkJYmFzaWNfbWFjaGluZT1jcmlzdjMyLWF4aXMKLQkJOzsKLQljcmlzIHwgY3Jpcy0qIHwgZXRyYXgqKQotCQliYXNpY19tYWNoaW5lPWNyaXMtYXhpcwotCQk7OwotCWNyeCkKLQkJYmFzaWNfbWFjaGluZT1jcngtdW5rbm93bgotCQlvcz0tZWxmCi0JCTs7Ci0JZGEzMCB8IGRhMzAtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKLQkJOzsKLQlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKLQkJOzsKLQlkZWNzeXN0ZW0xMCogfCBkZWMxMCopCi0JCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCi0JCW9zPS10b3BzMTAKLQkJOzsKLQlkZWNzeXN0ZW0yMCogfCBkZWMyMCopCi0JCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCi0JCW9zPS10b3BzMjAKLQkJOzsKLQlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAotCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQotCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKLQkJOzsKLQlkZWx0YTg4KQotCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JZGljb3MpCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1wYwotCQlvcz0tZGljb3MKLQkJOzsKLQlkamdwcCkKLQkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCi0JCW9zPS1tc2Rvc2RqZ3BwCi0JCTs7Ci0JZHB4MjAgfCBkcHgyMC0qKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1idWxsCi0JCW9zPS1ib3N4Ci0JCTs7Ci0JZHB4MiogfCBkcHgyKi1idWxsKQotCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAotCQlvcz0tc3lzdjMKLQkJOzsKLQllYm1vbjI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tZWJtb24KLQkJOzsKLQllbHhzaSkKLQkJYmFzaWNfbWFjaGluZT1lbHhzaS1lbHhzaQotCQlvcz0tYnNkCi0JCTs7Ci0JZW5jb3JlIHwgdW1heCB8IG1tYXgpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstZW5jb3JlCi0JCTs7Ci0JZXMxODAwIHwgT1NFNjhrIHwgb3NlNjhrIHwgb3NlIHwgT1NFKQotCQliYXNpY19tYWNoaW5lPW02OGstZXJpY3Nzb24KLQkJb3M9LW9zZQotCQk7OwotCWZ4MjgwMCkKLQkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKLQkJOzsKLQlnZW5peCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1ucwotCQk7OwotCWdtaWNybykKLQkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybwotCQlvcz0tc3lzdgotCQk7OwotCWdvMzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tZ28zMgotCQk7OwotCWgzMDUwciogfCBoaXV4KikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQloODMwMGhtcykKLQkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQloODMwMHhyYXkpCi0JCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQotCQlvcz0teHJheQotCQk7OwotCWg4NTAwaG1zKQotCQliYXNpY19tYWNoaW5lPWg4NTAwLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCWhhcnJpcykKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tc3lzdjMKLQkJOzsKLQlocDMwMC0qKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJOzsKLQlocDMwMGJzZCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCW9zPS1ic2QKLQkJOzsKLQlocDMwMGhwdXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQlvcz0taHB1eAotCQk7OwotCWhwM2s5WzAtOV1bMC05XSB8IGhwOVswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwOWsyWzAtOV1bMC05XSB8IGhwOWszMVswLTldKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1ocAotCQk7OwotCWhwOWszWzItOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCTs7Ci0JaHA5azZbMC05XVswLTldIHwgaHA2WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHA5azdbMC03OV1bMC05XSB8IGhwN1swLTc5XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrNzhbMC05XSB8IGhwNzhbMC05XSkKLQkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbNjddMSB8IGhwOFs2N10xIHwgaHA5azgwWzI0XSB8IGhwODBbMjRdIHwgaHA5azhbNzhdOSB8IGhwOFs3OF05IHwgaHA5azg5MyB8IGhwODkzKQotCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFswLTldWzEzNjc5XSB8IGhwOFswLTldWzEzNjc5XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHBwYS1uZXh0KQotCQlvcz0tbmV4dHN0ZXAzCi0JCTs7Ci0JaHBwYW9zZikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCW9zPS1vc2YKLQkJOzsKLQlocHBybykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQlpMzcwLWlibSogfCBpYm0qKQotCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCi0JCTs7Ci0jIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KLQlpKjg2djMyKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YzMgotCQk7OwotCWkqODZ2NCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjQKLQkJOzsKLQlpKjg2dikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JaSo4NnNvbDIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc29sYXJpczIKLQkJOzsKLQlpMzg2bWFjaCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LW1hY2gKLQkJb3M9LW1hY2gKLQkJOzsKLQlpMzg2LXZzdGEgfCB2c3RhKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tdnN0YQotCQk7OwotCWlyaXMgfCBpcmlzNGQpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zZ2kKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1pcml4KikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LWlyaXg0Ci0JCQk7OwotCQllc2FjCi0JCTs7Ci0JaXNpNjggfCBpc2kpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1pc2kKLQkJb3M9LXN5c3YKLQkJOzsKLQltNjhrbm9tbXUpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCW9zPS1saW51eAotCQk7OwotCW02OGtub21tdS0qKQotCQliYXNpY19tYWNoaW5lPW02OGstYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgotCQk7OwotCW1hZ251bSB8IG0zMjMwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcwotCQlvcz0tc3lzdgotCQk7OwotCW1lcmxpbikKLQkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCi0JCW9zPS1zeXN2Ci0JCTs7Ci0gICAgICAgIG1pY3JvYmxhemUpCi0JCWJhc2ljX21hY2hpbmU9bWljcm9ibGF6ZS14aWxpbngKLQkJOzsKLQltaW5ndzMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LW1pbmd3MzIKLQkJOzsKLQltaW5ndzMyY2UpCi0JCWJhc2ljX21hY2hpbmU9YXJtLXVua25vd24KLQkJb3M9LW1pbmd3MzJjZQotCQk7OwotCW1pbmlmcmFtZSkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtY29udmVyZ2VudAotCQk7OwotCSptaW50IHwgLW1pbnRbMC05XSogfCAqTWlOVCB8ICpNaU5UWzAtOV0qKQotCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKLQkJb3M9LW1pbnQKLQkJOzsKLQltaXBzMyotKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKLQkJOzsKLQltaXBzMyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KLQkJOzsKLQltb25pdG9yKQotCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JbW9ycGhvcykKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KLQkJb3M9LW1vcnBob3MKLQkJOzsKLQltc2RvcykKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1tc2RvcwotCQk7OwotCW1zMS0qKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21zMS0vbXQtLydgCi0JCTs7Ci0JbXZzKQotCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCi0JCW9zPS1tdnMKLQkJOzsKLQluY3IzMDAwKQotCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCi0JCW9zPS1zeXN2NAotCQk7OwotCW5ldGJzZDM4NikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW5ldGJzZAotCQk7OwotCW5ldHdpbmRlcikKLQkJYmFzaWNfbWFjaGluZT1hcm12NGwtcmViZWwKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5ld3MxMDAwKQotCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzLTM2MDAgfCByaXNjLW5ld3MpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZWN2NzApCi0JCWJhc2ljX21hY2hpbmU9djcwLW5lYwotCQlvcz0tc3lzdgotCQk7OwotCW5leHQgfCBtKi1uZXh0ICkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1uZXh0c3RlcCogKQotCQkJOzsKLQkJICAgIC1uczIqKQotCQkgICAgICBvcz0tbmV4dHN0ZXAyCi0JCQk7OwotCQkgICAgKikKLQkJICAgICAgb3M9LW5leHRzdGVwMwotCQkJOzsKLQkJZXNhYwotCQk7OwotCW5oMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5oWzQ1XTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5pbmR5OTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW5pbmR5Ci0JCTs7Ci0JbW9uOTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW1vbjk2MAotCQk7OwotCW5vbnN0b3B1eCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLWNvbXBhcQotCQlvcz0tbm9uc3RvcHV4Ci0JCTs7Ci0JbnAxKQotCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAotCQk7OwotCW5zci10YW5kZW0pCi0JCWJhc2ljX21hY2hpbmU9bnNyLXRhbmRlbQotCQk7OwotCW9wNTBuLSogfCBvcDYwYy0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQlvcGVucmlzYyB8IG9wZW5yaXNjLSopCi0JCWJhc2ljX21hY2hpbmU9b3IzMi11bmtub3duCi0JCTs7Ci0Jb3M0MDApCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KLQkJb3M9LW9zNDAwCi0JCTs7Ci0JT1NFNjgwMDAgfCBvc2U2ODAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtZXJpY3Nzb24KLQkJb3M9LW9zZQotCQk7OwotCW9zNjhrKQotCQliYXNpY19tYWNoaW5lPW02OGstbm9uZQotCQlvcz0tb3M2OGsKLQkJOzsKLQlwYS1oaXRhY2hpKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQotCQlvcz0taGl1eHdlMgotCQk7OwotCXBhcmFnb24pCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAotCQlvcz0tb3NmCi0JCTs7Ci0JcGFyaXNjKQotCQliYXNpY19tYWNoaW5lPWhwcGEtdW5rbm93bgotCQlvcz0tbGludXgKLQkJOzsKLQlwYXJpc2MtKikKLQkJYmFzaWNfbWFjaGluZT1ocHBhLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCW9zPS1saW51eAotCQk7OwotCXBiZCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKLQkJOzsKLQlwYmIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKLQkJOzsKLQlwYzUzMiB8IHBjNTMyLSopCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstcGM1MzIKLQkJOzsKLQlwYzk4KQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJOzsKLQlwYzk4LSopCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBlbnRpdW0gfCBwNSB8IGs1IHwgazYgfCBuZXhnZW4gfCB2aWFjMykKLQkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCi0JCTs7Ci0JcGVudGl1bXBybyB8IHA2IHwgNng4NiB8IGF0aGxvbiB8IGF0aGxvbl8qKQotCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKLQkJOzsKLQlwZW50aXVtaWkgfCBwZW50aXVtMiB8IHBlbnRpdW1paWkgfCBwZW50aXVtMykKLQkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCi0JCTs7Ci0JcGVudGl1bTQpCi0JCWJhc2ljX21hY2hpbmU9aTc4Ni1wYwotCQk7OwotCXBlbnRpdW0tKiB8IHA1LSogfCBrNS0qIHwgazYtKiB8IG5leGdlbi0qIHwgdmlhYzMtKikKLQkJYmFzaWNfbWFjaGluZT1pNTg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bXByby0qIHwgcDYtKiB8IDZ4ODYtKiB8IGF0aGxvbi0qKQotCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtaWktKiB8IHBlbnRpdW0yLSogfCBwZW50aXVtaWlpLSogfCBwZW50aXVtMy0qKQotCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtNC0qKQotCQliYXNpY19tYWNoaW5lPWk3ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwbikKLQkJYmFzaWNfbWFjaGluZT1wbi1nb3VsZAotCQk7OwotCXBvd2VyKQliYXNpY19tYWNoaW5lPXBvd2VyLWlibQotCQk7OwotCXBwYykJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KLQkJOzsKLQlwcGMtKikJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHBjbGUgfCBwb3dlcnBjbGl0dGxlIHwgcHBjLWxlIHwgcG93ZXJwYy1saXR0bGUpCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLXVua25vd24KLQkJOzsKLQlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBwYzY0KQliYXNpY19tYWNoaW5lPXBvd2VycGM2NC11bmtub3duCi0JCTs7Ci0JcHBjNjQtKikgYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGM2NGxlIHwgcG93ZXJwYzY0bGl0dGxlIHwgcHBjNjQtbGUgfCBwb3dlcnBjNjQtbGl0dGxlKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLXVua25vd24KLQkJOzsKLQlwcGM2NGxlLSogfCBwb3dlcnBjNjRsaXR0bGUtKikKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBzMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQotCQk7OwotCXB3MzIpCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni11bmtub3duCi0JCW9zPS1wdzMyCi0JCTs7Ci0JcmRvcykKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1yZG9zCi0JCTs7Ci0Jcm9tNjhrKQotCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCi0JCW9zPS1jb2ZmCi0JCTs7Ci0Jcm1bNDZdMDApCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCi0JCTs7Ci0JcnRwYyB8IHJ0cGMtKikKLQkJYmFzaWNfbWFjaGluZT1yb21wLWlibQotCQk7OwotCXMzOTAgfCBzMzkwLSopCi0JCWJhc2ljX21hY2hpbmU9czM5MC1pYm0KLQkJOzsKLQlzMzkweCB8IHMzOTB4LSopCi0JCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCi0JCTs7Ci0Jc2EyOTIwMCkKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0Jc2IxKQotCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMS11bmtub3duCi0JCTs7Ci0Jc2IxZWwpCi0JCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxZWwtdW5rbm93bgotCQk7OwotCXNkZSkKLQkJYmFzaWNfbWFjaGluZT1taXBzaXNhMzItc2RlCi0JCW9zPS1lbGYKLQkJOzsKLQlzZWkpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zZWkKLQkJb3M9LXNlaXV4Ci0JCTs7Ci0Jc2VxdWVudCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKLQkJOzsKLQlzaCkKLQkJYmFzaWNfbWFjaGluZT1zaC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQlzaDVlbCkKLQkJYmFzaWNfbWFjaGluZT1zaDVsZS11bmtub3duCi0JCTs7Ci0Jc2g2NCkKLQkJYmFzaWNfbWFjaGluZT1zaDY0LXVua25vd24KLQkJOzsKLQlzcGFyY2xpdGUtd3JzIHwgc2ltc28td3JzKQotCQliYXNpY19tYWNoaW5lPXNwYXJjbGl0ZS13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQlzcHM3KQotCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAotCQlvcz0tc3lzdjIKLQkJOzsKLQlzcHVyKQotCQliYXNpY19tYWNoaW5lPXNwdXItdW5rbm93bgotCQk7OwotCXN0MjAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXRhbmRlbQotCQk7OwotCXN0cmF0dXMpCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1zdHJhdHVzCi0JCW9zPS1zeXN2NAotCQk7OwotCXN1bjIpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQk7OwotCXN1bjJvczMpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuMm9zNCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW4zb3MzKQotCQliYXNpY19tYWNoaW5lPW02OGstc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW4zb3M0KQotCQliYXNpY19tYWNoaW5lPW02OGstc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW40b3MzKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuNG9zNCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjRzb2wyKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc29sYXJpczIKLQkJOzsKLQlzdW4zIHwgc3VuMy0qKQotCQliYXNpY19tYWNoaW5lPW02OGstc3VuCi0JCTs7Ci0Jc3VuNCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJOzsKLQlzdW4zODYgfCBzdW4zODZpIHwgcm9hZHJ1bm5lcikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXN1bgotCQk7OwotCXN2MSkKLQkJYmFzaWNfbWFjaGluZT1zdjEtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0Jc3ltbWV0cnkpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCW9zPS1keW5peAotCQk7OwotCXQzZSkKLQkJYmFzaWNfbWFjaGluZT1hbHBoYWV2NS1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl0OTApCi0JCWJhc2ljX21hY2hpbmU9dDkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXRpYzU0eCB8IGM1NHgqKQotCQliYXNpY19tYWNoaW5lPXRpYzU0eC11bmtub3duCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JdGljNTV4IHwgYzU1eCopCi0JCWJhc2ljX21hY2hpbmU9dGljNTV4LXVua25vd24KLQkJb3M9LWNvZmYKLQkJOzsKLQl0aWM2eCB8IGM2eCopCi0JCWJhc2ljX21hY2hpbmU9dGljNngtdW5rbm93bgotCQlvcz0tY29mZgotCQk7OwotCXRpbGUqKQotCQliYXNpY19tYWNoaW5lPXRpbGUtdW5rbm93bgotCQlvcz0tbGludXgtZ251Ci0JCTs7Ci0JdHgzOSkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOS11bmtub3duCi0JCTs7Ci0JdHgzOWVsKQotCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5ZWwtdW5rbm93bgotCQk7OwotCXRvYWQxKQotCQliYXNpY19tYWNoaW5lPXBkcDEwLXhrbAotCQlvcz0tdG9wczIwCi0JCTs7Ci0JdG93ZXIgfCB0b3dlci0zMikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5jcgotCQk7OwotCXRwZikKLQkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KLQkJb3M9LXRwZgotCQk7OwotCXVkaTI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0JdWx0cmEzKQotCQliYXNpY19tYWNoaW5lPWEyOWstbnl1Ci0JCW9zPS1zeW0xCi0JCTs7Ci0JdjgxMCB8IG5lY3Y4MTApCi0JCWJhc2ljX21hY2hpbmU9djgxMC1uZWMKLQkJb3M9LW5vbmUKLQkJOzsKLQl2YXh2KQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJb3M9LXN5c3YKLQkJOzsKLQl2bXMpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQlvcz0tdm1zCi0JCTs7Ci0JdnBwKnx2eHx2eC0qKQotCQliYXNpY19tYWNoaW5lPWYzMDEtZnVqaXRzdQotCQk7OwotCXZ4d29ya3M5NjApCi0JCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0JdzY1KikKLQkJYmFzaWNfbWFjaGluZT13NjUtd2RjCi0JCW9zPS1ub25lCi0JCTs7Ci0Jdzg5ay0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JeGJveCkKLQkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCi0JCW9zPS1taW5ndzMyCi0JCTs7Ci0JeHBzIHwgeHBzMTAwKQotCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKLQkJOzsKLQl5bXApCi0JCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXo4ay0qLWNvZmYpCi0JCWJhc2ljX21hY2hpbmU9ejhrLXVua25vd24KLQkJb3M9LXNpbQotCQk7OwotCXo4MC0qLWNvZmYpCi0JCWJhc2ljX21hY2hpbmU9ejgwLXVua25vd24KLQkJb3M9LXNpbQotCQk7OwotCW5vbmUpCi0JCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCi0JCW9zPS1ub25lCi0JCTs7Ci0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KLSMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KLQl3ODlrKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQk7OwotCW9wNTBuKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCTs7Ci0Jb3A2MGMpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJOzsKLQlyb21wKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0JbW1peCkKLQkJYmFzaWNfbWFjaGluZT1tbWl4LWtudXRoCi0JCTs7Ci0JcnM2MDAwKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KLQkJOzsKLQl2YXgpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQk7OwotCXBkcDEwKQotCQkjIHRoZXJlIGFyZSBtYW55IGNsb25lcywgc28gREVDIGlzIG5vdCBhIHNhZmUgYmV0Ci0JCWJhc2ljX21hY2hpbmU9cGRwMTAtdW5rbm93bgotCQk7OwotCXBkcDExKQotCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYwotCQk7OwotCXdlMzJrKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCXNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzI0XWFlYiB8IHNoWzM0XWViIHwgc2hbMTIzNF1sZSB8IHNoWzIzXWVsZSkKLQkJYmFzaWNfbWFjaGluZT1zaC11bmtub3duCi0JCTs7Ci0Jc3BhcmMgfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0JY3lkcmEpCi0JCWJhc2ljX21hY2hpbmU9Y3lkcmEtY3lkcm9tZQotCQk7OwotCW9yaW9uKQotCQliYXNpY19tYWNoaW5lPW9yaW9uLWhpZ2hsZXZlbAotCQk7OwotCW9yaW9uMTA1KQotCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaGlnaGxldmVsCi0JCTs7Ci0JbWFjIHwgbXB3IHwgbWFjLW1wdykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCi0JCTs7Ci0JcG1hYyB8IHBtYWMtbXB3KQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYXBwbGUKLQkJOzsKLQkqLXVua25vd24pCi0JCSMgTWFrZSBzdXJlIHRvIG1hdGNoIGFuIGFscmVhZHktY2Fub25pY2FsaXplZCBtYWNoaW5lIG5hbWUuCi0JCTs7Ci0JKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotZXNhYwotCi0jIEhlcmUgd2UgY2Fub25pY2FsaXplIGNlcnRhaW4gYWxpYXNlcyBmb3IgbWFudWZhY3R1cmVycy4KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLWRpZ2l0YWwqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2RpZ2l0YWwuKi9kZWMvJ2AKLQkJOzsKLQkqLWNvbW1vZG9yZSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvY29tbW9kb3JlLiovY2JtLydgCi0JCTs7Ci0JKikKLQkJOzsKLWVzYWMKLQotIyBEZWNvZGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIGFsaWFzZXMgZm9yIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCi0KLWlmIFsgeCIkb3MiICE9IHgiIiBdCi10aGVuCi1jYXNlICRvcyBpbgotICAgICAgICAjIEZpcnN0IG1hdGNoIHNvbWUgc3lzdGVtIHR5cGUgYWxpYXNlcwotICAgICAgICAjIHRoYXQgbWlnaHQgZ2V0IGNvbmZ1c2VkIHdpdGggdmFsaWQgc3lzdGVtIHR5cGVzLgotCSMgLXNvbGFyaXMqIGlzIGEgYmFzaWMgc3lzdGVtIHR5cGUsIHdpdGggdGhpcyBvbmUgZXhjZXB0aW9uLgotICAgICAgICAtYXVyb3JhdXgpCi0JICAgICAgICBvcz0tYXVyb3JhdXgKLQkJOzsKLQktc29sYXJpczEgfCAtc29sYXJpczEuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAotCQk7OwotCS1zb2xhcmlzKQotCQlvcz0tc29sYXJpczIKLQkJOzsKLQktc3ZyNCopCi0JCW9zPS1zeXN2NAotCQk7OwotCS11bml4d2FyZSopCi0JCW9zPS1zeXN2NC4ydXcKLQkJOzsKLQktZ251L2xpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKLQkJOzsKLQkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgotCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCi0JIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KLQkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCi0JLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAotCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLWNuayogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKLQkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLWF1cm9yYXV4KiB8IC1zb2xhcmlzKiBcCi0JICAgICAgfCAtc3ltKiB8IC1rb3BlbnNvbGFyaXMqIFwKLQkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKLQkgICAgICB8IC1hb3MqIHwgLWFyb3MqIFwKLQkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAotCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAotCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAta25ldGJzZCogfCAtbWlyYnNkKiB8IC1uZXRic2QqIFwKLQkgICAgICB8IC1vcGVuYnNkKiB8IC1zb2xpZGJzZCogXAotCSAgICAgIHwgLWVra29ic2QqIHwgLWtmcmVlYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIHwgLWx5bnhvcyogXAotCSAgICAgIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKLQkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCi0JICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCi0JICAgICAgfCAtY2hvcnVzb3MqIHwgLWNob3J1c3JkYiogfCAtY2VnY2MqIFwKLQkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCi0JICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC1saW51eC1uZXdsaWIqIHwgLWxpbnV4LXVjbGliYyogXAotCSAgICAgIHwgLXV4cHYqIHwgLWJlb3MqIHwgLW1wZWl4KiB8IC11ZGsqIFwKLQkgICAgICB8IC1pbnRlcml4KiB8IC11d2luKiB8IC1ta3MqIHwgLXJoYXBzb2R5KiB8IC1kYXJ3aW4qIHwgLW9wZW5lZCogXAotCSAgICAgIHwgLW9wZW5zdGVwKiB8IC1vc2tpdCogfCAtY29uaXgqIHwgLXB3MzIqIHwgLW5vbnN0b3B1eCogXAotCSAgICAgIHwgLXN0b3JtLWNoYW9zKiB8IC10b3BzMTAqIHwgLXRlbmV4KiB8IC10b3BzMjAqIHwgLWl0cyogXAotCSAgICAgIHwgLW9zMiogfCAtdm9zKiB8IC1wYWxtb3MqIHwgLXVjbGludXgqIHwgLW51Y2xldXMqIFwKLQkgICAgICB8IC1tb3JwaG9zKiB8IC1zdXBlcnV4KiB8IC1ydG1rKiB8IC1ydG1rLW5vdmEqIHwgLXdpbmRpc3MqIFwKLQkgICAgICB8IC1wb3dlcm1heCogfCAtZG5peCogfCAtbng2IHwgLW54NyB8IC1zZWkqIHwgLWRyYWdvbmZseSogXAotCSAgICAgIHwgLXNreW9zKiB8IC1oYWlrdSogfCAtcmRvcyogfCAtdG9wcGVycyogfCAtZHJvcHMqIHwgLWVzKikKLQkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCi0JCTs7Ci0JLXFueCopCi0JCWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkJICAgIHg4Ni0qIHwgaSo4Ni0qKQotCQkJOzsKLQkJICAgICopCi0JCQlvcz0tbnRvJG9zCi0JCQk7OwotCQllc2FjCi0JCTs7Ci0JLW50by1xbngqKQotCQk7OwotCS1udG8qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bnRvfG50by1xbnh8J2AKLQkJOzsKLQktc2ltIHwgLWVzMTgwMCogfCAtaG1zKiB8IC14cmF5IHwgLW9zNjhrKiB8IC1ub25lKiB8IC12ODhyKiBcCi0JICAgICAgfCAtd2luZG93cyogfCAtb3N4IHwgLWFidWcgfCAtbmV0d2FyZSogfCAtb3M5KiB8IC1iZW9zKiB8IC1oYWlrdSogXAotCSAgICAgIHwgLW1hY29zKiB8IC1tcHcqIHwgLW1hZ2ljKiB8IC1tbWl4d2FyZSogfCAtbW9uOTYwKiB8IC1sbmV3cyopCi0JCTs7Ci0JLW1hYyopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xtYWN8bWFjb3N8J2AKLQkJOzsKLQktbGludXgtZGlldGxpYmMpCi0JCW9zPS1saW51eC1kaWV0bGliYwotCQk7OwotCS1saW51eCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xsaW51eHxsaW51eC1nbnV8J2AKLQkJOzsKLQktc3Vub3M1KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNXxzb2xhcmlzMnwnYAotCQk7OwotCS1zdW5vczYqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M2fHNvbGFyaXMzfCdgCi0JCTs7Ci0JLW9wZW5lZCopCi0JCW9zPS1vcGVuZWRpdGlvbgotCQk7OwotICAgICAgICAtb3M0MDAqKQotCQlvcz0tb3M0MDAKLQkJOzsKLQktd2luY2UqKQotCQlvcz0td2luY2UKLQkJOzsKLQktb3Nmcm9zZSopCi0JCW9zPS1vc2Zyb3NlCi0JCTs7Ci0JLW9zZiopCi0JCW9zPS1vc2YKLQkJOzsKLQktdXRlayopCi0JCW9zPS1ic2QKLQkJOzsKLQktZHluaXgqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWFjaXMqKQotCQlvcz0tYW9zCi0JCTs7Ci0JLWF0aGVvcyopCi0JCW9zPS1hdGhlb3MKLQkJOzsKLQktc3lsbGFibGUqKQotCQlvcz0tc3lsbGFibGUKLQkJOzsKLQktMzg2YnNkKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWN0aXgqIHwgLXV0cyopCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JLW5vdmEqKQotCQlvcz0tcnRtay1ub3ZhCi0JCTs7Ci0JLW5zMiApCi0JCW9zPS1uZXh0c3RlcDIKLQkJOzsKLQktbnNrKikKLQkJb3M9LW5zawotCQk7OwotCSMgUHJlc2VydmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHNpbml4NS4KLQktc2luaXg1LiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzaW5peHxzeXN2fCdgCi0JCTs7Ci0JLXNpbml4KikKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0gICAgICAgIC10cGYqKQotCQlvcz0tdHBmCi0JCTs7Ci0JLXRyaXRvbiopCi0JCW9zPS1zeXN2MwotCQk7OwotCS1vc3MqKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktc3ZyNCkKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JLXN2cjMpCi0JCW9zPS1zeXN2MwotCQk7OwotCS1zeXN2cjQpCi0JCW9zPS1zeXN2NAotCQk7OwotCSMgVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgLXN5c3ZyNC4KLQktc3lzdiopCi0JCTs7Ci0JLW9zZSopCi0JCW9zPS1vc2UKLQkJOzsKLQktZXMxODAwKikKLQkJb3M9LW9zZQotCQk7OwotCS14ZW5peCkKLQkJb3M9LXhlbml4Ci0JCTs7Ci0JLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKLQkJb3M9LW1pbnQKLQkJOzsKLQktYXJvcyopCi0JCW9zPS1hcm9zCi0JCTs7Ci0JLWthb3MqKQotCQlvcz0ta2FvcwotCQk7OwotCS16dm1vZSkKLQkJb3M9LXp2bW9lCi0JCTs7Ci0JLWRpY29zKikKLQkJb3M9LWRpY29zCi0JCTs7Ci0JLW5vbmUpCi0JCTs7Ci0JKikKLQkJIyBHZXQgcmlkIG9mIHRoZSBgLScgYXQgdGhlIGJlZ2lubmluZyBvZiAkb3MuCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAncy9bXi1dKi0vLydgCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogc3lzdGVtIFxgJG9zXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLWVzYWMKLWVsc2UKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIG1hY2hpbmVzLgotIyBUaGUgdmFsdWUgc2hvdWxkIGJlIHdoYXQgdGhlIHZlbmRvciBjdXJyZW50bHkgc2hpcHMgb3V0IHRoZSBkb29yIHdpdGggdGhlaXIKLSMgbWFjaGluZSBvciBwdXQgYW5vdGhlciB3YXksIHRoZSBtb3N0IHBvcHVsYXIgb3MgcHJvdmlkZWQgd2l0aCB0aGUgbWFjaGluZS4KLQotIyBOb3RlIHRoYXQgaWYgeW91J3JlIGdvaW5nIHRvIHRyeSB0byBtYXRjaCAiLU1BTlVGQUNUVVJFUiIgaGVyZSAoc2F5LAotIyAiLXN1biIpLCB0aGVuIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhc2Ugc3RhdGVtZW50IHVwIHRvd2FyZHMgdGhlIHRvcAotIyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgT3RoZXJ3aXNlLCBjb2RlIGFib3ZlCi0jIHdpbGwgc2lnbmFsIGFuIGVycm9yIHNheWluZyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcKLSMgc3lzdGVtLCBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRvIHRoaXMgcG9pbnQuCi0KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLSAgICAgICAgc2NvcmUtKikKLQkJb3M9LWVsZgotCQk7OwotICAgICAgICBzcHUtKikKLQkJb3M9LWVsZgotCQk7OwotCSotYWNvcm4pCi0JCW9zPS1yaXNjaXgxLjIKLQkJOzsKLQlhcm0qLXJlYmVsKQotCQlvcz0tbGludXgKLQkJOzsKLQlhcm0qLXNlbWkpCi0JCW9zPS1hb3V0Ci0JCTs7Ci0gICAgICAgIGM0eC0qIHwgdGljNHgtKikKLSAgICAgICAgCW9zPS1jb2ZmCi0JCTs7Ci0JIyBUaGlzIG11c3QgY29tZSBiZWZvcmUgdGhlICotZGVjIGVudHJ5LgotCXBkcDEwLSopCi0JCW9zPS10b3BzMjAKLQkJOzsKLQlwZHAxMS0qKQotCQlvcz0tbm9uZQotCQk7OwotCSotZGVjIHwgdmF4LSopCi0JCW9zPS11bHRyaXg0LjIKLQkJOzsKLQltNjgqLWFwb2xsbykKLQkJb3M9LWRvbWFpbgotCQk7OwotCWkzODYtc3VuKQotCQlvcz0tc3Vub3M0LjAuMgotCQk7OwotCW02ODAwMC1zdW4pCi0JCW9zPS1zdW5vczMKLQkJIyBUaGlzIGFsc28gZXhpc3RzIGluIHRoZSBjb25maWd1cmUgcHJvZ3JhbSwgYnV0IHdhcyBub3QgdGhlCi0JCSMgZGVmYXVsdC4KLQkJIyBvcz0tc3Vub3M0Ci0JCTs7Ci0JbTY4Ki1jaXNjbykKLQkJb3M9LWFvdXQKLQkJOzsKLSAgICAgICAgbWVwLSopCi0JCW9zPS1lbGYKLQkJOzsKLQltaXBzKi1jaXNjbykKLQkJb3M9LWVsZgotCQk7OwotCW1pcHMqLSopCi0JCW9zPS1lbGYKLQkJOzsKLQlvcjMyLSopCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KLQkJb3M9LXN5c3YzCi0JCTs7Ci0Jc3BhcmMtKiB8ICotc3VuKQotCQlvcz0tc3Vub3M0LjEuMQotCQk7OwotCSotYmUpCi0JCW9zPS1iZW9zCi0JCTs7Ci0JKi1oYWlrdSkKLQkJb3M9LWhhaWt1Ci0JCTs7Ci0JKi1pYm0pCi0JCW9zPS1haXgKLQkJOzsKLSAgICAJKi1rbnV0aCkKLQkJb3M9LW1taXh3YXJlCi0JCTs7Ci0JKi13ZWMpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLXdpbmJvbmQpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLW9raSkKLQkJb3M9LXByb2VsZgotCQk7OwotCSotaHApCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JKi1oaXRhY2hpKQotCQlvcz0taGl1eAotCQk7OwotCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKLQkJb3M9LXN5c3YKLQkJOzsKLQkqLWNibSkKLQkJb3M9LWFtaWdhb3MKLQkJOzsKLQkqLWRnKQotCQlvcz0tZGd1eAotCQk7OwotCSotZG9scGhpbikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JbTY4ay1jY3VyKQotCQlvcz0tcnR1Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCW9zPS1sdW5hCi0JCTs7Ci0JKi1uZXh0ICkKLQkJb3M9LW5leHRzdGVwCi0JCTs7Ci0JKi1zZXF1ZW50KQotCQlvcz0tcHR4Ci0JCTs7Ci0JKi1jcmRzKQotCQlvcz0tdW5vcwotCQk7OwotCSotbnMpCi0JCW9zPS1nZW5peAotCQk7OwotCWkzNzAtKikKLQkJb3M9LW12cwotCQk7OwotCSotbmV4dCkKLQkJb3M9LW5leHRzdGVwMwotCQk7OwotCSotZ291bGQpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JKi1oaWdobGV2ZWwpCi0JCW9zPS1ic2QKLQkJOzsKLQkqLWVuY29yZSkKLQkJb3M9LWJzZAotCQk7OwotCSotc2dpKQotCQlvcz0taXJpeAotCQk7OwotCSotc2llbWVucykKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JKi1tYXNzY29tcCkKLQkJb3M9LXJ0dQotCQk7OwotCWYzMFswMV0tZnVqaXRzdSB8IGY3MDAtZnVqaXRzdSkKLQkJb3M9LXV4cHYKLQkJOzsKLQkqLXJvbTY4aykKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLSpidWcpCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi1hcHBsZSkKLQkJb3M9LW1hY29zCi0JCTs7Ci0JKi1hdGFyaSopCi0JCW9zPS1taW50Ci0JCTs7Ci0JKikKLQkJb3M9LW5vbmUKLQkJOzsKLWVzYWMKLWZpCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCi0jIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgotdmVuZG9yPXVua25vd24KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLXVua25vd24pCi0JCWNhc2UgJG9zIGluCi0JCQktcmlzY2l4KikKLQkJCQl2ZW5kb3I9YWNvcm4KLQkJCQk7OwotCQkJLXN1bm9zKikKLQkJCQl2ZW5kb3I9c3VuCi0JCQkJOzsKLQkJCS1jbmsqfC1haXgqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLWJlb3MqKQotCQkJCXZlbmRvcj1iZQotCQkJCTs7Ci0JCQktaHB1eCopCi0JCQkJdmVuZG9yPWhwCi0JCQkJOzsKLQkJCS1tcGVpeCopCi0JCQkJdmVuZG9yPWhwCi0JCQkJOzsKLQkJCS1oaXV4KikKLQkJCQl2ZW5kb3I9aGl0YWNoaQotCQkJCTs7Ci0JCQktdW5vcyopCi0JCQkJdmVuZG9yPWNyZHMKLQkJCQk7OwotCQkJLWRndXgqKQotCQkJCXZlbmRvcj1kZwotCQkJCTs7Ci0JCQktbHVuYSopCi0JCQkJdmVuZG9yPW9tcm9uCi0JCQkJOzsKLQkJCS1nZW5peCopCi0JCQkJdmVuZG9yPW5zCi0JCQkJOzsKLQkJCS1tdnMqIHwgLW9wZW5lZCopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktb3M0MDAqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLXB0eCopCi0JCQkJdmVuZG9yPXNlcXVlbnQKLQkJCQk7OwotCQkJLXRwZiopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktdnhzaW0qIHwgLXZ4d29ya3MqIHwgLXdpbmRpc3MqKQotCQkJCXZlbmRvcj13cnMKLQkJCQk7OwotCQkJLWF1eCopCi0JCQkJdmVuZG9yPWFwcGxlCi0JCQkJOzsKLQkJCS1obXMqKQotCQkJCXZlbmRvcj1oaXRhY2hpCi0JCQkJOzsKLQkJCS1tcHcqIHwgLW1hY29zKikKLQkJCQl2ZW5kb3I9YXBwbGUKLQkJCQk7OwotCQkJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKLQkJCQl2ZW5kb3I9YXRhcmkKLQkJCQk7OwotCQkJLXZvcyopCi0JCQkJdmVuZG9yPXN0cmF0dXMKLQkJCQk7OwotCQllc2FjCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgInMvdW5rbm93bi8kdmVuZG9yLyJgCi0JCTs7Ci1lc2FjCi0KLWVjaG8gJGJhc2ljX21hY2hpbmUkb3MKLWV4aXQKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJyIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb25maWd1cmUgYi9zcmMvbGlicG5nL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzNkMDE1YS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDE0MDAwICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY1IGZvciBsaWJwbmcgMS40LjEyLgotIwotIyBSZXBvcnQgYnVncyB0byA8cG5nLW1uZy1pbXBsZW1lbnRAbGlzdHMuc291cmNlZm9yZ2UubmV0Pi4KLSMKLSMKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAotIyAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSMgSW5jLgotIwotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0KLSMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQotRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gIygKLSAgKnBvc2l4KikgOgotICAgIHNldCAtbyBwb3NpeCA7OyAjKAotICAqKSA6Ci0gICAgIDs7Ci1lc2FjCi1maQotCi0KLWFzX25sPScKLScKLWV4cG9ydCBhc19ubAotIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KLWFzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCi1hc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KLWFzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCi0jIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKLSMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCi1pZiB0ZXN0IC16ICIkQkFTSF9WRVJTSU9OJFpTSF9WRVJTSU9OIiBcCi0gICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19lY2hvPSdwcmludCAtciAtLScKLSAgYXNfZWNob19uPSdwcmludCAtcm4gLS0nCi1lbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2VjaG89J3ByaW50ZiAlc1xuJwotICBhc19lY2hvX249J3ByaW50ZiAlcycKLWVsc2UKLSAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCi0gICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKLSAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCi0gIGVsc2UKLSAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJwotICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCi0gICAgICBhcmc9JDE7Ci0gICAgICBjYXNlICRhcmcgaW4gIygKLSAgICAgICoiJGFzX25sIiopCi0JZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7Ci0JYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKLSAgICAgIGVzYWM7Ci0gICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCi0gICAgJwotICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQotICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCi0gIGZpCi0gIGV4cG9ydCBhc19lY2hvX2JvZHkKLSAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJwotZmkKLQotIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCi1pZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgotICBQQVRIX1NFUEFSQVRPUj06Ci0gIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKLSAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAotICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCi0gIH0KLWZpCi0KLQotIyBJRlMKLSMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCi0jIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KLSMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAotIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQotSUZTPSIgIiIJJGFzX25sIgotCi0jIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgotY2FzZSAkMCBpbiAjKCgKLSAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gICAgIDs7Ci1lc2FjCi0jIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCi0jIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KLWlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KLSAgYXNfbXlzZWxmPSQwCi1maQotaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgotICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgotICBleGl0IDEKLWZpCi0KLSMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KLSMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKLSMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKLSMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCi1mb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICi1kbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAotICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKLWRvbmUKLVBTMT0nJCAnCi1QUzI9Jz4gJwotUFM0PScrICcKLQotIyBOTFMgbnVpc2FuY2VzLgotTENfQUxMPUMKLWV4cG9ydCBMQ19BTEwKLUxBTkdVQUdFPUMKLWV4cG9ydCBMQU5HVUFHRQotCi0jIENEUEFUSC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotaWYgdGVzdCAieCRDT05GSUdfU0hFTEwiID0geDsgdGhlbgotICBhc19ib3VybmVfY29tcGF0aWJsZT0iaWYgdGVzdCAtbiBcIlwke1pTSF9WRVJTSU9OK3NldH1cIiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiBcJHsxK1wiXCRAXCJ9LCB3aGljaAotICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotICBhbGlhcyAtZyAnXCR7MStcIlwkQFwifSc9J1wiXCRAXCInCi0gIHNldG9wdCBOT19HTE9CX1NVQlNUCi1lbHNlCi0gIGNhc2UgXGAoc2V0IC1vKSAyPi9kZXYvbnVsbFxgIGluICMoCi0gICpwb3NpeCopIDoKLSAgICBzZXQgLW8gcG9zaXggOzsgIygKLSAgKikgOgotICAgICA7OwotZXNhYwotZmkKLSIKLSAgYXNfcmVxdWlyZWQ9ImFzX2ZuX3JldHVybiAoKSB7IChleGl0IFwkMSk7IH0KLWFzX2ZuX3N1Y2Nlc3MgKCkgeyBhc19mbl9yZXR1cm4gMDsgfQotYXNfZm5fZmFpbHVyZSAoKSB7IGFzX2ZuX3JldHVybiAxOyB9Ci1hc19mbl9yZXRfc3VjY2VzcyAoKSB7IHJldHVybiAwOyB9Ci1hc19mbl9yZXRfZmFpbHVyZSAoKSB7IHJldHVybiAxOyB9Ci0KLWV4aXRjb2RlPTAKLWFzX2ZuX3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3N1Y2Nlc3MgZmFpbGVkLjsgfQotYXNfZm5fZmFpbHVyZSAmJiB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fZmFpbHVyZSBzdWNjZWVkZWQuOyB9Ci1hc19mbl9yZXRfc3VjY2VzcyB8fCB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fcmV0X3N1Y2Nlc3MgZmFpbGVkLjsgfQotYXNfZm5fcmV0X2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC47IH0KLWlmICggc2V0IHg7IGFzX2ZuX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gXCJcJDFcIiApOyB0aGVuIDoKLQotZWxzZQotICBleGl0Y29kZT0xOyBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KLWZpCi10ZXN0IHhcJGV4aXRjb2RlID0geDAgfHwgZXhpdCAxIgotICBhc19zdWdnZXN0ZWQ9IiAgYXNfbGluZW5vXzE9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18xYT1cJExJTkVOTwotICBhc19saW5lbm9fMj0iO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkJExJTkVOTzthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCIgYXNfbGluZW5vXzJhPVwkTElORU5PCi0gIGV2YWwgJ3Rlc3QgXCJ4XCRhc19saW5lbm9fMSdcJGFzX3J1bidcIiAhPSBcInhcJGFzX2xpbmVub18yJ1wkYXNfcnVuJ1wiICYmCi0gIHRlc3QgXCJ4XGBleHByIFwkYXNfbGluZW5vXzEnXCRhc19ydW4nICsgMVxgXCIgPSBcInhcJGFzX2xpbmVub18yJ1wkYXNfcnVuJ1wiJyB8fCBleGl0IDEKLXRlc3QgXCQoKCAxICsgMSApKSA9IDIgfHwgZXhpdCAxCi0KLSAgdGVzdCAtbiBcIlwke1pTSF9WRVJTSU9OK3NldH1cJHtCQVNIX1ZFUlNJT04rc2V0fVwiIHx8ICgKLSAgICBFQ0hPPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKLSAgICBFQ0hPPVwkRUNIT1wkRUNIT1wkRUNIT1wkRUNIT1wkRUNITwotICAgIEVDSE89XCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPCi0gICAgUEFUSD0vZW1wdHkgRlBBVEg9L2VtcHR5OyBleHBvcnQgUEFUSCBGUEFUSAotICAgIHRlc3QgXCJYXGBwcmludGYgJXMgXCRFQ0hPXGBcIiA9IFwiWFwkRUNIT1wiIFxcCi0gICAgICB8fCB0ZXN0IFwiWFxgcHJpbnQgLXIgLS0gXCRFQ0hPXGBcIiA9IFwiWFwkRUNIT1wiICkgfHwgZXhpdCAxIgotICBpZiAoZXZhbCAiJGFzX3JlcXVpcmVkIikgMj4vZGV2L251bGw7IHRoZW4gOgotICBhc19oYXZlX3JlcXVpcmVkPXllcwotZWxzZQotICBhc19oYXZlX3JlcXVpcmVkPW5vCi1maQotICBpZiB0ZXN0IHgkYXNfaGF2ZV9yZXF1aXJlZCA9IHh5ZXMgJiYgKGV2YWwgIiRhc19zdWdnZXN0ZWQiKSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0KLWVsc2UKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotYXNfZm91bmQ9ZmFsc2UKLWZvciBhc19kaXIgaW4gL2JpbiRQQVRIX1NFUEFSQVRPUi91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgYXNfZm91bmQ9OgotICBjYXNlICRhc19kaXIgaW4gIygKLQkgLyopCi0JICAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbwotCSAgICAgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgotCSAgICAgYXNfc2hlbGw9JGFzX2Rpci8kYXNfYmFzZQotCSAgICAgaWYgeyB0ZXN0IC1mICIkYXNfc2hlbGwiIHx8IHRlc3QgLWYgIiRhc19zaGVsbC5leGUiOyB9ICYmCi0JCSAgICB7ICRhc19lY2hvICIkYXNfYm91cm5lX2NvbXBhdGlibGUiIiRhc19yZXF1aXJlZCIgfCBhc19ydW49YSAiJGFzX3NoZWxsIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIENPTkZJR19TSEVMTD0kYXNfc2hlbGwgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKLQkJICAgaWYgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfc3VnZ2VzdGVkIiB8IGFzX3J1bj1hICIkYXNfc2hlbGwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKLSAgYnJlYWsgMgotZmkKLWZpCi0JICAgZG9uZTs7Ci0gICAgICAgZXNhYwotICBhc19mb3VuZD1mYWxzZQotZG9uZQotJGFzX2ZvdW5kIHx8IHsgaWYgeyB0ZXN0IC1mICIkU0hFTEwiIHx8IHRlc3QgLWYgIiRTSEVMTC5leGUiOyB9ICYmCi0JICAgICAgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfcmVxdWlyZWQiIHwgYXNfcnVuPWEgIiRTSEVMTCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgotICBDT05GSUdfU0hFTEw9JFNIRUxMIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCi1maTsgfQotSUZTPSRhc19zYXZlX0lGUwotCi0KLSAgICAgIGlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuIDoKLSAgIyBXZSBjYW5ub3QgeWV0IGFzc3VtZSBhIGRlY2VudCBzaGVsbCwgc28gd2UgaGF2ZSB0byBwcm92aWRlIGEKLQkjIG5ldXRyYWxpemF0aW9uIHZhbHVlIGZvciBzaGVsbHMgd2l0aG91dCB1bnNldDsgYW5kIHRoaXMgYWxzbwotCSMgd29ya3MgYXJvdW5kIHNoZWxscyB0aGF0IGNhbm5vdCB1bnNldCBub25leGlzdGVudCB2YXJpYWJsZXMuCi0JQkFTSF9FTlY9L2Rldi9udWxsCi0JRU5WPS9kZXYvbnVsbAotCSh1bnNldCBCQVNIX0VOVikgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IEJBU0hfRU5WIEVOVgotCWV4cG9ydCBDT05GSUdfU0hFTEwKLQlleGVjICIkQ09ORklHX1NIRUxMIiAiJGFzX215c2VsZiIgJHsxKyIkQCJ9Ci1maQotCi0gICAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4bm87IHRoZW4gOgotICAkYXNfZWNobyAiJDA6IFRoaXMgc2NyaXB0IHJlcXVpcmVzIGEgc2hlbGwgbW9yZSBtb2Rlcm4gdGhhbiBhbGwiCi0gICRhc19lY2hvICIkMDogdGhlIHNoZWxscyB0aGF0IEkgZm91bmQgb24geW91ciBzeXN0ZW0uIgotICBpZiB0ZXN0IHgke1pTSF9WRVJTSU9OK3NldH0gPSB4c2V0IDsgdGhlbgotICAgICRhc19lY2hvICIkMDogSW4gcGFydGljdWxhciwgenNoICRaU0hfVkVSU0lPTiBoYXMgYnVncyBhbmQgc2hvdWxkIgotICAgICRhc19lY2hvICIkMDogYmUgdXBncmFkZWQgdG8genNoIDQuMy40IG9yIGxhdGVyLiIKLSAgZWxzZQotICAgICRhc19lY2hvICIkMDogUGxlYXNlIHRlbGwgYnVnLWF1dG9jb25mQGdudS5vcmcgYW5kCi0kMDogcG5nLW1uZy1pbXBsZW1lbnRAbGlzdHMuc291cmNlZm9yZ2UubmV0IGFib3V0IHlvdXIKLSQwOiBzeXN0ZW0sIGluY2x1ZGluZyBhbnkgZXJyb3IgcG9zc2libHkgb3V0cHV0IGJlZm9yZSB0aGlzCi0kMDogbWVzc2FnZS4gVGhlbiBpbnN0YWxsIGEgbW9kZXJuIHNoZWxsLCBvciBtYW51YWxseSBydW4KLSQwOiB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYSBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuIgotICBmaQotICBleGl0IDEKLWZpCi1maQotZmkKLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci1leHBvcnQgU0hFTEwKLSMgVW5zZXQgbW9yZSB2YXJpYWJsZXMga25vd24gdG8gaW50ZXJmZXJlIHdpdGggYmVoYXZpb3Igb2YgY29tbW9uIHRvb2xzLgotQ0xJQ09MT1JfRk9SQ0U9IEdSRVBfT1BUSU9OUz0KLXVuc2V0IENMSUNPTE9SX0ZPUkNFIEdSRVBfT1BUSU9OUwotCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE00c2ggU2hlbGwgRnVuY3Rpb25zLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIGFzX2ZuX3Vuc2V0IFZBUgotIyAtLS0tLS0tLS0tLS0tLS0KLSMgUG9ydGFibHkgdW5zZXQgVkFSLgotYXNfZm5fdW5zZXQgKCkKLXsKLSAgeyBldmFsICQxPTsgdW5zZXQgJDE7fQotfQotYXNfdW5zZXQ9YXNfZm5fdW5zZXQKLQotIyBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTZXQgJD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCi1hc19mbl9zZXRfc3RhdHVzICgpCi17Ci0gIHJldHVybiAkMQotfSAjIGFzX2ZuX3NldF9zdGF0dXMKLQotIyBhc19mbl9leGl0IFNUQVRVUwotIyAtLS0tLS0tLS0tLS0tLS0tLQotIyBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCi1hc19mbl9leGl0ICgpCi17Ci0gIHNldCArZQotICBhc19mbl9zZXRfc3RhdHVzICQxCi0gIGV4aXQgJDEKLX0gIyBhc19mbl9leGl0Ci0KLSMgYXNfZm5fbWtkaXJfcAotIyAtLS0tLS0tLS0tLS0tCi0jIENyZWF0ZSAiJGFzX2RpciIgYXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBwYXJlbnRzIGlmIG5lY2Vzc2FyeS4KLWFzX2ZuX21rZGlyX3AgKCkKLXsKLQotICBjYXNlICRhc19kaXIgaW4gIygKLSAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OwotICBlc2FjCi0gIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgewotICAgIGFzX2RpcnM9Ci0gICAgd2hpbGUgOjsgZG8KLSAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAotICAgICAgKlwnKikgYXNfcWRpcj1gJGFzX2VjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIycoCi0gICAgICAqKSBhc19xZGlyPSRhc19kaXI7OwotICAgICAgZXNhYwotICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKLSAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8Ci0kYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWCIkYXNfZGlyIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCi0gICAgZG9uZQotICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKLSAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCBhc19mbl9lcnJvciAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIKLQotCi19ICMgYXNfZm5fbWtkaXJfcAotIyBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQotIyBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCi0jIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCi0jIGltcGxlbWVudGF0aW9ucy4KLWlmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKLSAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCi0gIHsKLSAgICBldmFsICQxKz1cJDIKLSAgfScKLWVsc2UKLSAgYXNfZm5fYXBwZW5kICgpCi0gIHsKLSAgICBldmFsICQxPVwkJDFcJDIKLSAgfQotZmkgIyBhc19mbl9hcHBlbmQKLQotIyBhc19mbl9hcml0aCBBUkcuLi4KLSMgLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKLSMgZ2xvYmFsICRhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cwotIyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci4KLWlmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgotICBldmFsICdhc19mbl9hcml0aCAoKQotICB7Ci0gICAgYXNfdmFsPSQoKCAkKiApKQotICB9JwotZWxzZQotICBhc19mbl9hcml0aCAoKQotICB7Ci0gICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKLSAgfQotZmkgIyBhc19mbl9hcml0aAotCi0KLSMgYXNfZm5fZXJyb3IgRVJST1IgW0xJTkVOTyBMT0dfRkRdCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBPdXRwdXQgImBiYXNlbmFtZSAkMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKLSMgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQotIyBzY3JpcHQgd2l0aCBzdGF0dXMgJD8sIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KLWFzX2ZuX2Vycm9yICgpCi17Ci0gIGFzX3N0YXR1cz0kPzsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCi0gIGlmIHRlc3QgIiQzIjsgdGhlbgotICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDIifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDEiID4mJDMKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQxIiA+JjIKLSAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCi19ICMgYXNfZm5fZXJyb3IKLQotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi1pZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfZGlybmFtZT1kaXJuYW1lCi1lbHNlCi0gIGFzX2Rpcm5hbWU9ZmFsc2UKLWZpCi0KLWFzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYLyIkMCIgfAotICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLQotIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLWFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0KLQotICBhc19saW5lbm9fMT0kTElORU5PIGFzX2xpbmVub18xYT0kTElORU5PCi0gIGFzX2xpbmVub18yPSRMSU5FTk8gYXNfbGluZW5vXzJhPSRMSU5FTk8KLSAgZXZhbCAndGVzdCAieCRhc19saW5lbm9fMSckYXNfcnVuJyIgIT0gIngkYXNfbGluZW5vXzInJGFzX3J1biciICYmCi0gIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEnJGFzX3J1bicgKyAxYCIgPSAieCRhc19saW5lbm9fMickYXNfcnVuJyInIHx8IHsKLSAgIyBCbGFtZSBMZWUgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCi0gIHNlZCAtbiAnCi0gICAgcAotICAgIC9bJF1MSU5FTk8vPQotICAnIDwkYXNfbXlzZWxmIHwKLSAgICBzZWQgJwotICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KLSAgICAgIHQgbGluZW5vCi0gICAgICBiCi0gICAgICA6bGluZW5vCi0gICAgICBOCi0gICAgICA6bG9vcAotICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCi0gICAgICB0IGxvb3AKLSAgICAgIHMvLVxuLiovLwotICAgICcgPiRhc19tZS5saW5lbm8gJiYKLSAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMjsgYXNfZm5fZXhpdCAxOyB9Ci0KLSAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKLSAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCi0gICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaXRpdmUgdG8gdGhpcykuCi0gIC4gIi4vJGFzX21lLmxpbmVubyIKLSAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCi0gIGV4aXQKLX0KLQotRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KLWNhc2UgYGVjaG8gLW4geGAgaW4gIygoKCgoCi0tbiopCi0gIGNhc2UgYGVjaG8gJ3h5XGMnYCBpbgotICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KLSAgeHkpICBFQ0hPX0M9J1xjJzs7Ci0gICopICAgZWNobyBgZWNobyBrc2g4OCBidWcgb24gQUlYIDYuMWAgPiAvZGV2L251bGwKLSAgICAgICBFQ0hPX1Q9JwknOzsKLSAgZXNhYzs7Ci0qKQotICBFQ0hPX049Jy1uJzs7Ci1lc2FjCi0KLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCi1pZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KLSAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQotZWxzZQotICBybSAtZiBjb25mJCQuZGlyCi0gIG1rZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKLWZpCi1pZiAoZWNobyA+Y29uZiQkLmZpbGUpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFzX2xuX3M9J2xuIC1zJwotICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6Ci0gICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KLSAgICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KLSAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgotICAgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKLSAgICAgIGFzX2xuX3M9J2NwIC1wJwotICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFzX2xuX3M9bG4KLSAgZWxzZQotICAgIGFzX2xuX3M9J2NwIC1wJwotICBmaQotZWxzZQotICBhc19sbl9zPSdjcCAtcCcKLWZpCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCi1ybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi0KLWlmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJwotZWxzZQotICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAotICBhc19ta2Rpcl9wPWZhbHNlCi1maQotCi1pZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Rlc3RfeD0ndGVzdCAteCcKLWVsc2UKLSAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgYXNfbHNfTF9vcHRpb249TAotICBlbHNlCi0gICAgYXNfbHNfTF9vcHRpb249Ci0gIGZpCi0gIGFzX3Rlc3RfeD0nCi0gICAgZXZhbCBzaCAtYyAnXCcnCi0gICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KLQl0ZXN0IC1kICIkMS8uIjsKLSAgICAgIGVsc2UKLQljYXNlICQxIGluICMoCi0JLSopc2V0ICIuLyQxIjs7Ci0JZXNhYzsKLQljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbiAjKCgKLQk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCi0gICAgJ1wnJyBzaAotICAnCi1maQotYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgotYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCi1hc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotCi0KLXRlc3QgLW4gIiRESkRJUiIgfHwgZXhlYyA3PCYwIDwvZGV2L251bGwKLWV4ZWMgNj4mMQotCi0jIE5hbWUgb2YgdGhlIGhvc3QuCi0jIGhvc3RuYW1lIG9uIHNvbWUgc3lzdGVtcyAoU1ZSMy4yLCBMaW51eCkgcmV0dXJucyBhIGJvZ3VzIGV4aXQgc3RhdHVzLAotIyBzbyB1bmFtZSBnZXRzIHJ1biB0b28uCi1hY19ob3N0bmFtZT1gKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLQotIwotIyBJbml0aWFsaXphdGlvbnMuCi0jCi1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi1hY19jbGVhbl9maWxlcz0KLWFjX2NvbmZpZ19saWJvYmpfZGlyPS4KLUxJQk9CSlM9Ci1jcm9zc19jb21waWxpbmc9bm8KLXN1YmRpcnM9Ci1NRkxBR1M9Ci1NQUtFRkxBR1M9Ci0KLSMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgotUEFDS0FHRV9OQU1FPSdsaWJwbmcnCi1QQUNLQUdFX1RBUk5BTUU9J2xpYnBuZycKLVBBQ0tBR0VfVkVSU0lPTj0nMS40LjEyJwotUEFDS0FHRV9TVFJJTkc9J2xpYnBuZyAxLjQuMTInCi1QQUNLQUdFX0JVR1JFUE9SVD0ncG5nLW1uZy1pbXBsZW1lbnRAbGlzdHMuc291cmNlZm9yZ2UubmV0JwotUEFDS0FHRV9VUkw9JycKLQotYWNfdW5pcXVlX2ZpbGU9InBuZ2dldC5jIgotIyBGYWN0b3JpbmcgZGVmYXVsdCBoZWFkZXJzIGZvciBtb3N0IHRlc3RzLgotYWNfaW5jbHVkZXNfZGVmYXVsdD0iXAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAotIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2VuZGlmCi0jaWZkZWYgU1REQ19IRUFERVJTCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyBpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jIGlmZGVmIEhBVkVfU1RETElCX0gKLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyBlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotIyBpZiAhZGVmaW5lZCBTVERDX0hFQURFUlMgJiYgZGVmaW5lZCBIQVZFX01FTU9SWV9ICi0jICBpbmNsdWRlIDxtZW1vcnkuaD4KLSMgZW5kaWYKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKLSMgaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RESU5UX0gKLSMgaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmIgotCi1hY19zdWJzdF92YXJzPSdhbV9fRVhFRVhUX0ZBTFNFCi1hbV9fRVhFRVhUX1RSVUUKLUxUTElCT0JKUwotYmluY29uZmlncwotcGtnY29uZmlnZGlyCi1QTkdMSUJfUkVMRUFTRQotUE5HTElCX01JTk9SCi1QTkdMSUJfTUFKT1IKLVBOR0xJQl9WRVJTSU9OCi1TWU1CT0xfUFJFRklYCi1IQVZFX0xEX1ZFUlNJT05fU0NSSVBUX0ZBTFNFCi1IQVZFX0xEX1ZFUlNJT05fU0NSSVBUX1RSVUUKLUxJQlBOR19ERUZJTkVTCi1MSUJPQkpTCi1QT1dfTElCCi1PVE9PTDY0Ci1PVE9PTAotTElQTwotTk1FRElUCi1EU1lNVVRJTAotUkFOTElCCi1BUgotTk0KLWFjX2N0X0RVTVBCSU4KLURVTVBCSU4KLUxJQlRPT0wKLU9CSkRVTVAKLURMTFRPT0wKLUFTCi1MTl9TCi1DUFAKLUxECi1GR1JFUAotRUdSRVAKLUdSRVAKLVNFRAotaG9zdF9vcwotaG9zdF92ZW5kb3IKLWhvc3RfY3B1Ci1ob3N0Ci1idWlsZF9vcwotYnVpbGRfdmVuZG9yCi1idWlsZF9jcHUKLWJ1aWxkCi1hbV9fZmFzdGRlcENDX0ZBTFNFCi1hbV9fZmFzdGRlcENDX1RSVUUKLUNDREVQTU9ERQotQU1ERVBCQUNLU0xBU0gKLUFNREVQX0ZBTFNFCi1BTURFUF9UUlVFCi1hbV9fcXVvdGUKLWFtX19pbmNsdWRlCi1ERVBESVIKLU9CSkVYVAotRVhFRVhUCi1hY19jdF9DQwotQ1BQRkxBR1MKLUxERkxBR1MKLUNGTEFHUwotQ0MKLU1BSU5UCi1NQUlOVEFJTkVSX01PREVfRkFMU0UKLU1BSU5UQUlORVJfTU9ERV9UUlVFCi1hbV9fdW50YXIKLWFtX190YXIKLUFNVEFSCi1hbV9fbGVhZGluZ19kb3QKLVNFVF9NQUtFCi1BV0sKLW1rZGlyX3AKLU1LRElSX1AKLUlOU1RBTExfU1RSSVBfUFJPR1JBTQotU1RSSVAKLWluc3RhbGxfc2gKLU1BS0VJTkZPCi1BVVRPSEVBREVSCi1BVVRPTUFLRQotQVVUT0NPTkYKLUFDTE9DQUwKLVZFUlNJT04KLVBBQ0tBR0UKLUNZR1BBVEhfVwotYW1fX2lzcmMKLUlOU1RBTExfREFUQQotSU5TVEFMTF9TQ1JJUFQKLUlOU1RBTExfUFJPR1JBTQotdGFyZ2V0X2FsaWFzCi1ob3N0X2FsaWFzCi1idWlsZF9hbGlhcwotTElCUwotRUNIT19UCi1FQ0hPX04KLUVDSE9fQwotREVGUwotbWFuZGlyCi1sb2NhbGVkaXIKLWxpYmRpcgotcHNkaXIKLXBkZmRpcgotZHZpZGlyCi1odG1sZGlyCi1pbmZvZGlyCi1kb2NkaXIKLW9sZGluY2x1ZGVkaXIKLWluY2x1ZGVkaXIKLWxvY2Fsc3RhdGVkaXIKLXNoYXJlZHN0YXRlZGlyCi1zeXNjb25mZGlyCi1kYXRhZGlyCi1kYXRhcm9vdGRpcgotbGliZXhlY2Rpcgotc2JpbmRpcgotYmluZGlyCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi1wcmVmaXgKLWV4ZWNfcHJlZml4Ci1QQUNLQUdFX1VSTAotUEFDS0FHRV9CVUdSRVBPUlQKLVBBQ0tBR0VfU1RSSU5HCi1QQUNLQUdFX1ZFUlNJT04KLVBBQ0tBR0VfVEFSTkFNRQotUEFDS0FHRV9OQU1FCi1QQVRIX1NFUEFSQVRPUgotU0hFTEwnCi1hY19zdWJzdF9maWxlcz0nJwotYWNfdXNlcl9vcHRzPScKLWVuYWJsZV9vcHRpb25fY2hlY2tpbmcKLWVuYWJsZV9tYWludGFpbmVyX21vZGUKLWVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nCi13aXRoX2dudV9sZAotZW5hYmxlX3NoYXJlZAotZW5hYmxlX3N0YXRpYwotd2l0aF9waWMKLWVuYWJsZV9mYXN0X2luc3RhbGwKLWVuYWJsZV9saWJ0b29sX2xvY2sKLXdpdGhfcGtnY29uZmlnZGlyCi13aXRoX2JpbmNvbmZpZ3MKLScKLSAgICAgIGFjX3ByZWNpb3VzX3ZhcnM9J2J1aWxkX2FsaWFzCi1ob3N0X2FsaWFzCi10YXJnZXRfYWxpYXMKLUNDCi1DRkxBR1MKLUxERkxBR1MKLUxJQlMKLUNQUEZMQUdTCi1DUFAnCi0KLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotYWNfaW5pdF9oZWxwPQotYWNfaW5pdF92ZXJzaW9uPWZhbHNlCi1hY191bnJlY29nbml6ZWRfb3B0cz0KLWFjX3VucmVjb2duaXplZF9zZXA9Ci0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotY2FjaGVfZmlsZT0vZGV2L251bGwKLWV4ZWNfcHJlZml4PU5PTkUKLW5vX2NyZWF0ZT0KLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLQotIyBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9wdGlvbnMuCi0jIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKLSMgYW5kIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIGV4ZWNfcHJlZml4Ci0jIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCi0jIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgotIyAoVGhlIGxpc3QgZm9sbG93cyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMuKQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCi1kYXRhZGlyPScke2RhdGFyb290ZGlyfScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWRvY2Rpcj0nJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRV9UQVJOQU1FfScKLWluZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCi1odG1sZGlyPScke2RvY2Rpcn0nCi1kdmlkaXI9JyR7ZG9jZGlyfScKLXBkZmRpcj0nJHtkb2NkaXJ9JwotcHNkaXI9JyR7ZG9jZGlyfScKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCi1tYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKLQotYWNfcHJldj0KLWFjX2Rhc2hkYXNoPQotZm9yIGFjX29wdGlvbgotZG8KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgJGFjX3ByZXY9XCRhY19vcHRpb24KLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICo9KikJYWNfb3B0YXJnPWBleHByICJYJGFjX29wdGlvbiIgOiAnW149XSo9XCguKlwpJ2AgOzsKLSAgKikJYWNfb3B0YXJnPXllcyA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KLSAgLS0pCi0gICAgYWNfZGFzaGRhc2g9eWVzIDs7Ci0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKLQotICAtLWNvbmZpZy1jYWNoZSB8IC1DKQotICAgIGNhY2hlX2ZpbGU9Y29uZmlnLmNhY2hlIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCi0gICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCi0gIHwgLS1kYXRhcm9vIHwgLS1kYXRhcm8gfCAtLWRhdGFyKQotICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKLSAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAotICB8IC0tZGF0YXJvb3Q9KiB8IC0tZGF0YXJvbz0qIHwgLS1kYXRhcm89KiB8IC0tZGF0YXI9KikKLSAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0iZW5hYmxlXyRhY191c2Vyb3B0IgotIiopIDs7Ci0gICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWRpc2FibGUtJGFjX3VzZXJvcHRfb3JpZyIKLQkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKLSAgICBlc2FjCi0gICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9bm8gOzsKLQotICAtZG9jZGlyIHwgLS1kb2NkaXIgfCAtLWRvY2RpIHwgLS1kb2MgfCAtLWRvKQotICAgIGFjX3ByZXY9ZG9jZGlyIDs7Ci0gIC1kb2NkaXI9KiB8IC0tZG9jZGlyPSogfCAtLWRvY2RpPSogfCAtLWRvYz0qIHwgLS1kbz0qKQotICAgIGRvY2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWR2aWRpciB8IC0tZHZpZGlyIHwgLS1kdmlkaSB8IC0tZHZpZCB8IC0tZHZpIHwgLS1kdikKLSAgICBhY19wcmV2PWR2aWRpciA7OwotICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQotICAgIGR2aWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0iZW5hYmxlXyRhY191c2Vyb3B0IgotIiopIDs7Ci0gICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWVuYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgotCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OwotICAgIGVzYWMKLSAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQotICAgIGFjX2luaXRfaGVscD1sb25nIDs7Ci0gIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKLSAgICBhY19pbml0X2hlbHA9cmVjdXJzaXZlIDs7Ci0gIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKLSAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtaHRtbGRpciB8IC0taHRtbGRpciB8IC0taHRtbGRpIHwgLS1odG1sZCB8IC0taHRtbCB8IC0taHRtIHwgLS1odCkKLSAgICBhY19wcmV2PWh0bWxkaXIgOzsKLSAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCi0gIHwgLS1odD0qKQotICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbG9jYWxlZGlyIHwgLS1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpIHwgLS1sb2NhbGVkIHwgLS1sb2NhbGUpCi0gICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKLSAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKLSAgICBsb2NhbGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogfCAtLWxvY2Fscz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSRhY19vcHRhcmcgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OwotCi0gIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCi0gICAgYWNfcHJldj1wZGZkaXIgOzsKLSAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKLSAgICBwZGZkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCi0gICAgYWNfcHJldj1wc2RpciA7OwotICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKLSAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9JGFjX29wdGFyZyA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQotICAgIGFjX2luaXRfdmVyc2lvbj06IDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAiaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0id2l0aF8kYWNfdXNlcm9wdCIKLSIqKSA7OwotICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS13aXRoLSRhY191c2Vyb3B0X29yaWciCi0JIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7Ci0gICAgZXNhYwotICAgIGV2YWwgd2l0aF8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgYXNfZm5fZXJyb3IgImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKLSAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKLSAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCi0gICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCi0gICAgICAqIgotIndpdGhfJGFjX3VzZXJvcHQiCi0iKikgOzsKLSAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aG91dC0kYWNfdXNlcm9wdF9vcmlnIgotCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OwotICAgIGVzYWMKLSAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9bm8gOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OwotCi0gIC0qKSBhc19mbl9lcnJvciAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkYWNfb3B0aW9uJwotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0gICAgOzsKLQotICAqPSopCi0gICAgYWNfZW52dmFyPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFwoW149XSpcKT0nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBjYXNlICRhY19lbnZ2YXIgaW4gIygKLSAgICAgICcnIHwgWzAtOV0qIHwgKlshXyRhc19jcl9hbG51bV0qICkKLSAgICAgIGFzX2ZuX2Vycm9yICJpbnZhbGlkIHZhcmlhYmxlIG5hbWU6IFxgJGFjX2VudnZhciciIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgJGFjX2VudnZhcj1cJGFjX29wdGFyZwotICAgIGV4cG9ydCAkYWNfZW52dmFyIDs7Ci0KLSAgKikKLSAgICAjIEZJWE1FOiBzaG91bGQgYmUgcmVtb3ZlZCBpbiBhdXRvY29uZiAzLjAuCi0gICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogeW91IHNob3VsZCB1c2UgLS1idWlsZCwgLS1ob3N0LCAtLXRhcmdldCIgPiYyCi0gICAgZXhwciAieCRhY19vcHRpb24iIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCi0gICAgOiAke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufQotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgYWNfb3B0aW9uPS0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYAotICBhc19mbl9lcnJvciAibWlzc2luZyBhcmd1bWVudCB0byAkYWNfb3B0aW9uIgotZmkKLQotaWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIjsgdGhlbgotICBjYXNlICRlbmFibGVfb3B0aW9uX2NoZWNraW5nIGluCi0gICAgbm8pIDs7Ci0gICAgZmF0YWwpIGFzX2ZuX2Vycm9yICJ1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA7OwotICAgICopICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjIgOzsKLSAgZXNhYwotZmkKLQotIyBDaGVjayBhbGwgZGlyZWN0b3J5IGFyZ3VtZW50cyBmb3IgY29uc2lzdGVuY3kuCi1mb3IgYWNfdmFyIGluCWV4ZWNfcHJlZml4IHByZWZpeCBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFyb290ZGlyIFwKLQkJZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgaW5jbHVkZWRpciBcCi0JCW9sZGluY2x1ZGVkaXIgZG9jZGlyIGluZm9kaXIgaHRtbGRpciBkdmlkaXIgcGRmZGlyIHBzZGlyIFwKLQkJbGliZGlyIGxvY2FsZWRpciBtYW5kaXIKLWRvCi0gIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotICAjIFJlbW92ZSB0cmFpbGluZyBzbGFzaGVzLgotICBjYXNlICRhY192YWwgaW4KLSAgICAqLyApCi0gICAgICBhY192YWw9YGV4cHIgIlgkYWNfdmFsIiA6ICdYXCguKlteL11cKScgXHwgIlgkYWNfdmFsIiA6ICdYXCguKlwpJ2AKLSAgICAgIGV2YWwgJGFjX3Zhcj1cJGFjX3ZhbDs7Ci0gIGVzYWMKLSAgIyBCZSBzdXJlIHRvIGhhdmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWVzLgotICBjYXNlICRhY192YWwgaW4KLSAgICBbXFwvJF0qIHwgPzpbXFwvXSogKSAgY29udGludWU7OwotICAgIE5PTkUgfCAnJyApIGNhc2UgJGFjX3ZhciBpbiAqcHJlZml4ICkgY29udGludWU7OyBlc2FjOzsKLSAgZXNhYwotICBhc19mbl9lcnJvciAiZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIKLWRvbmUKLQotIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JwotIyB1c2VkIHRvIGhvbGQgdGhlIGFyZ3VtZW50IG9mIC0taG9zdCBldGMuCi0jIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCi1idWlsZD0kYnVpbGRfYWxpYXMKLWhvc3Q9JGhvc3RfYWxpYXMKLXRhcmdldD0kdGFyZ2V0X2FsaWFzCi0KLSMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KLWlmIHRlc3QgIngkaG9zdF9hbGlhcyIgIT0geDsgdGhlbgotICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9bWF5YmUKLSAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJZiB5b3Ugd2FudGVkIHRvIHNldCB0aGUgLS1idWlsZCB0eXBlLCBkb24ndCB1c2UgLS1ob3N0LgotICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkLiIgPiYyCi0gIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9eWVzCi0gIGZpCi1maQotCi1hY190b29sX3ByZWZpeD0KLXRlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KLQotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAotCi0KLWFjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgotYWNfbHNfZGk9YGxzIC1kaSAuYCAmJgotYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8Ci0gIGFzX2ZuX2Vycm9yICJ3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIKLXRlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAotICBhc19mbl9lcnJvciAicHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IgotCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KLSAgYWNfY29uZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19teXNlbGYiIHx8Ci0kYXNfZXhwciBYIiRhc19teXNlbGYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhc19teXNlbGYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWCIkYXNfbXlzZWxmIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgotICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKLSAgYXNfZm5fZXJyb3IgImNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIKLWZpCi1hY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCi1hY19hYnNfY29uZmRpcj1gKAotCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgYXNfZm5fZXJyb3IgIiRhY19tc2ciCi0JcHdkKWAKLSMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCi1pZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCi0gIHNyY2Rpcj0uCi1maQotIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KLSMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbwotIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCi1jYXNlICRzcmNkaXIgaW4KLSovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OwotZXNhYwotZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KLSAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLSAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLWRvbmUKLQotIwotIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgotIwotaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KLSAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgY2F0IDw8X0FDRU9GCi1cYGNvbmZpZ3VyZScgY29uZmlndXJlcyBsaWJwbmcgMS40LjEyIHRvIGFkYXB0IHRvIG1hbnkga2luZHMgb2Ygc3lzdGVtcy4KLQotVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtWQVI9VkFMVUVdLi4uCi0KLVRvIGFzc2lnbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGUuZy4sIENDLCBDRkxBR1MuLi4pLCBzcGVjaWZ5IHRoZW0gYXMKLVZBUj1WQUxVRS4gIFNlZSBiZWxvdyBmb3IgZGVzY3JpcHRpb25zIG9mIHNvbWUgb2YgdGhlIHVzZWZ1bCB2YXJpYWJsZXMuCi0KLURlZmF1bHRzIGZvciB0aGUgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIGluIGJyYWNrZXRzLgotCi1Db25maWd1cmF0aW9uOgotICAtaCwgLS1oZWxwICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAotICAgICAgLS1oZWxwPXNob3J0ICAgICAgICBkaXNwbGF5IG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhpcyBwYWNrYWdlCi0gICAgICAtLWhlbHA9cmVjdXJzaXZlICAgIGRpc3BsYXkgdGhlIHNob3J0IGhlbHAgb2YgYWxsIHRoZSBpbmNsdWRlZCBwYWNrYWdlcwotICAtViwgLS12ZXJzaW9uICAgICAgICAgICBkaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLSAgLXEsIC0tcXVpZXQsIC0tc2lsZW50ICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gICAgICAtLWNhY2hlLWZpbGU9RklMRSAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFIFtkaXNhYmxlZF0KLSAgLUMsIC0tY29uZmlnLWNhY2hlICAgICAgYWxpYXMgZm9yIFxgLS1jYWNoZS1maWxlPWNvbmZpZy5jYWNoZScKLSAgLW4sIC0tbm8tY3JlYXRlICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgICAgIC0tc3JjZGlyPURJUiAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgXGAuLiddCi0KLUluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVhdCi0KLUJ5IGRlZmF1bHQsIFxgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgYWxsIHRoZSBmaWxlcyBpbgotXGAkYWNfZGVmYXVsdF9wcmVmaXgvYmluJywgXGAkYWNfZGVmYXVsdF9wcmVmaXgvbGliJyBldGMuICBZb3UgY2FuIHNwZWNpZnkKLWFuIGluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBcYCRhY19kZWZhdWx0X3ByZWZpeCcgdXNpbmcgXGAtLXByZWZpeCcsCi1mb3IgaW5zdGFuY2UgXGAtLXByZWZpeD1cJEhPTUUnLgotCi1Gb3IgYmV0dGVyIGNvbnRyb2wsIHVzZSB0aGUgb3B0aW9ucyBiZWxvdy4KLQotRmluZSB0dW5pbmcgb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgWy91c3IvaW5jbHVkZV0KLSAgLS1kYXRhcm9vdGRpcj1ESVIgICAgICAgcmVhZC1vbmx5IGFyY2guLWluZGVwZW5kZW50IGRhdGEgcm9vdCBbUFJFRklYL3NoYXJlXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL2luZm9dCi0gIC0tbG9jYWxlZGlyPURJUiAgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvbWFuXQotICAtLWRvY2Rpcj1ESVIgICAgICAgICAgICBkb2N1bWVudGF0aW9uIHJvb3QgW0RBVEFST09URElSL2RvYy9saWJwbmddCi0gIC0taHRtbGRpcj1ESVIgICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLWR2aWRpcj1ESVIgICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLXBkZmRpcj1ESVIgICAgICAgICAgICBwZGYgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLXBzZGlyPURJUiAgICAgICAgICAgICBwcyBkb2N1bWVudGF0aW9uIFtET0NESVJdCi1fQUNFT0YKLQotICBjYXQgPDxcX0FDRU9GCi0KLVByb2dyYW0gbmFtZXM6Ci0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYICAgICAgICAgICAgcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggICAgICAgICAgICBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0KLVN5c3RlbSB0eXBlczoKLSAgLS1idWlsZD1CVUlMRCAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbZ3Vlc3NlZF0KLSAgLS1ob3N0PUhPU1QgICAgICAgY3Jvc3MtY29tcGlsZSB0byBidWlsZCBwcm9ncmFtcyB0byBydW4gb24gSE9TVCBbQlVJTERdCi1fQUNFT0YKLWZpCi0KLWlmIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiOyB0aGVuCi0gIGNhc2UgJGFjX2luaXRfaGVscCBpbgotICAgICBzaG9ydCB8IHJlY3Vyc2l2ZSApIGVjaG8gIkNvbmZpZ3VyYXRpb24gb2YgbGlicG5nIDEuNC4xMjoiOzsKLSAgIGVzYWMKLSAgY2F0IDw8XF9BQ0VPRgotCi1PcHRpb25hbCBGZWF0dXJlczoKLSAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucwotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlICBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLQkJCSAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcgotICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZyAgc3BlZWRzIHVwIG9uZS10aW1lIGJ1aWxkCi0gIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgICBkbyBub3QgcmVqZWN0IHNsb3cgZGVwZW5kZW5jeSBleHRyYWN0b3JzCi0gIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXQotICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10KLSAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXQotICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXQotICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBhdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpCi0KLU9wdGlvbmFsIFBhY2thZ2VzOgotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dCi0gIC0td2l0aC1waWMgICAgICAgICAgICAgIHRyeSB0byB1c2Ugb25seSBQSUMvbm9uLVBJQyBvYmplY3RzIFtkZWZhdWx0PXVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICBib3RoXQotICAtLXdpdGgtcGtnY29uZmlnZGlyICAgICBVc2UgdGhlIHNwZWNpZmllZCBwa2djb25maWcgZGlyIChkZWZhdWx0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxpYmRpci9wa2djb25maWcpCi0gIC0td2l0aC1iaW5jb25maWdzICAgICAgIEdlbmVyYXRlIHNoZWxsIGxpYnBuZy1jb25maWcgc2NyaXB0cyBhcyB3ZWxsIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBrZy1jb25maWcgZGF0YSBbZGVmYXVsdD15ZXNdCi0KLVNvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgotICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKLSAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncwotICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKLSAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgotICBMSUJTICAgICAgICBsaWJyYXJpZXMgdG8gcGFzcyB0byB0aGUgbGlua2VyLCBlLmcuIC1sPGxpYnJhcnk+Ci0gIENQUEZMQUdTICAgIChPYmplY3RpdmUpIEMvQysrIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYKLSAgICAgICAgICAgICAgeW91IGhhdmUgaGVhZGVycyBpbiBhIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8aW5jbHVkZSBkaXI+Ci0gIENQUCAgICAgICAgIEMgcHJlcHJvY2Vzc29yCi0KLVVzZSB0aGVzZSB2YXJpYWJsZXMgdG8gb3ZlcnJpZGUgdGhlIGNob2ljZXMgbWFkZSBieSBgY29uZmlndXJlJyBvciB0byBoZWxwCi1pdCB0byBmaW5kIGxpYnJhcmllcyBhbmQgcHJvZ3JhbXMgd2l0aCBub25zdGFuZGFyZCBuYW1lcy9sb2NhdGlvbnMuCi0KLVJlcG9ydCBidWdzIHRvIDxwbmctbW5nLWltcGxlbWVudEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+LgotX0FDRU9GCi1hY19zdGF0dXM9JD8KLWZpCi0KLWlmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KLSAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KLSAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKLSAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fAotICAgICAgeyBjZCAiJHNyY2RpciIgJiYgYWNfcHdkPWBwd2RgICYmIHNyY2Rpcj0uICYmIHRlc3QgLWQgIiRhY19kaXIiOyB9IHx8Ci0gICAgICBjb250aW51ZQotICAgIGFjX2J1aWxkZGlyPS4KLQotY2FzZSAiJGFjX2RpciIgaW4KLS4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotKikKLSAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKLSAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKLSAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgotICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0gICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwotICBlc2FjIDs7Ci1lc2FjCi1hY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKLWFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKLSMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci1hY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKLQotY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICBhY19zcmNkaXI9LgotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KLSAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Ci1lc2FjCi1hY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Ci0KLSAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9Ci0gICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCi0gICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKLSAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQotICAgIGVsc2UKLSAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCi0gICAgZmkgfHwgYWNfc3RhdHVzPSQ/Ci0gICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQotICBkb25lCi1maQotCi10ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0ICRhY19zdGF0dXMKLWlmICRhY19pbml0X3ZlcnNpb247IHRoZW4KLSAgY2F0IDw8XF9BQ0VPRgotbGlicG5nIGNvbmZpZ3VyZSAxLjQuMTIKLWdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42NQotCi1Db3B5cmlnaHQgKEMpIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1UaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotX0FDRU9GCi0gIGV4aXQKLWZpCi0KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgQXV0b2NvbmYgaW5pdGlhbGl6YXRpb24uICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLQotIyBhY19mbl9jX3RyeV9jb21waWxlIExJTkVOTwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUcnkgdG8gY29tcGlsZSBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCi1hY19mbl9jX3RyeV9jb21waWxlICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotICBpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgotICBhY19yZXR2YWw9MAotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX3JldHZhbD0xCi1maQotICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQotICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKLQotfSAjIGFjX2ZuX2NfdHJ5X2NvbXBpbGUKLQotIyBhY19mbl9jX3RyeV9jcHAgTElORU5PCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVHJ5IHRvIHByZXByb2Nlc3MgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgotYWNfZm5fY190cnlfY3BwICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSA+L2Rldi9udWxsICYmIHsKLQkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4gOgotICBhY19yZXR2YWw9MAotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICAgIGFjX3JldHZhbD0xCi1maQotICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQotICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKLQotfSAjIGFjX2ZuX2NfdHJ5X2NwcAotCi0jIGFjX2ZuX2NfdHJ5X2xpbmsgTElORU5PCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KLWFjX2ZuX2NfdHJ5X2xpbmsgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotICBpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Ci0JIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Ci0JICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0Ci0gICAgICAgfTsgdGhlbiA6Ci0gIGFjX3JldHZhbD0wCi1lbHNlCi0gICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfcmV0dmFsPTEKLWZpCi0gICMgRGVsZXRlIHRoZSBJUEEvSVBPIChJbnRlciBQcm9jZWR1cmFsIEFuYWx5c2lzL09wdGltaXphdGlvbikgaW5mb3JtYXRpb24KLSAgIyBjcmVhdGVkIGJ5IHRoZSBQR0kgY29tcGlsZXIgKGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28pLCBhcyBpdCB3b3VsZAotICAjIGludGVyZmVyZSB3aXRoIHRoZSBuZXh0IGxpbmsgY29tbWFuZDsgYWxzbyBkZWxldGUgYSBkaXJlY3RvcnkgdGhhdCBpcwotICAjIGxlZnQgYmVoaW5kIGJ5IEFwcGxlJ3MgY29tcGlsZXIuICBXZSBkbyB0aGlzIGJlZm9yZSBleGVjdXRpbmcgdGhlIGFjdGlvbnMuCi0gIHJtIC1yZiBjb25mdGVzdC5kU1lNIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28KLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gIyBhY19mbl9jX3RyeV9saW5rCi0KLSMgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSBMSU5FTk8gSEVBREVSIFZBUiBJTkNMVURFUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRlc3RzIHdoZXRoZXIgSEVBREVSIGV4aXN0cyBhbmQgY2FuIGJlIGNvbXBpbGVkIHVzaW5nIHRoZSBpbmNsdWRlIGZpbGVzIGluCi0jIElOQ0xVREVTLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kMzsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSQ0Ci0jaW5jbHVkZSA8JDI+Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgZXZhbCAiJDM9eWVzIgotZWxzZQotICBldmFsICIkMz1ubyIKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1ldmFsIGFjX3Jlcz1cJCQzCi0JICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLSRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KLQotfSAjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUKLQotIyBhY19mbl9jX3RyeV9ydW4gTElORU5PCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVHJ5IHRvIGxpbmsgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLiBBc3N1bWVzCi0jIHRoYXQgZXhlY3V0YWJsZXMgKmNhbiogYmUgcnVuLgotYWNfZm5fY190cnlfcnVuICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JwotICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4gOgotICBhY19yZXR2YWw9MAotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLSAgICAgICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICAgICAgIGFjX3JldHZhbD0kYWNfc3RhdHVzCi1maQotICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9Ci0gIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAotCi19ICMgYWNfZm5fY190cnlfcnVuCi0KLSMgYWNfZm5fY19jaGVja19mdW5jIExJTkVOTyBGVU5DIFZBUgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRlc3RzIHdoZXRoZXIgRlVOQyBleGlzdHMsIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseQotYWNfZm5fY19jaGVja19mdW5jICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kMzsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSAkMiB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICQyLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lICQyIGlubm9jdW91c18kMgotCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkMiAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiAkMgotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyICQyICgpOwotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCBfX3N0dWJfJDIgfHwgZGVmaW5lZCBfX3N0dWJfX18kMgotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAkMiAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBldmFsICIkMz15ZXMiCi1lbHNlCi0gIGV2YWwgIiQzPW5vIgotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9Ci0KLX0gIyBhY19mbl9jX2NoZWNrX2Z1bmMKLQotIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzLCBnaXZpbmcgYSB3YXJuaW5nIGlmIGl0IGNhbm5vdCBiZSBjb21waWxlZCB1c2luZwotIyB0aGUgaW5jbHVkZSBmaWxlcyBpbiBJTkNMVURFUyBhbmQgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSCi0jIGFjY29yZGluZ2x5LgotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIGlmIHsgYXNfdmFyPSQzOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuIDoKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kMzsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci1lbHNlCi0gICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAkMiB1c2FiaWxpdHkiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgJDIgdXNhYmlsaXR5Li4uICIgPiY2OyB9Ci1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNAotI2luY2x1ZGUgPCQyPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKLWVsc2UKLSAgYWNfaGVhZGVyX2NvbXBpbGVyPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci0kYXNfZWNobyAiJGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9Ci0KLSMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAkMiBwcmVzZW5jZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyAkMiBwcmVzZW5jZS4uLiAiID4mNjsgfQotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPCQyPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi1lbHNlCi0gIGFjX2hlYWRlcl9wcmVwcm9jPW5vCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQotJGFzX2VjaG8gIiRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9Ci0KLSMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPwotY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAjKCgKLSAgeWVzOm5vOiApCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQotICAgIDs7Ci0gIG5vOnllczoqICkKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KLSggY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBSZXBvcnQgdGhpcyB0byBwbmctbW5nLWltcGxlbWVudEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgICkgfCBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKLSAgICA7OwotZXNhYwotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSQzOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgZXZhbCAiJDM9XCRhY19oZWFkZXJfY29tcGlsZXIiCi1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci1maQotICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQotCi19ICMgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbAotCi0jIGFjX2ZuX2NfY2hlY2tfdHlwZSBMSU5FTk8gVFlQRSBWQVIgSU5DTFVERVMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUZXN0cyB3aGV0aGVyIFRZUEUgZXhpc3RzIGFmdGVyIGhhdmluZyBpbmNsdWRlZCBJTkNMVURFUywgc2V0dGluZyBjYWNoZQotIyB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuCi1hY19mbl9jX2NoZWNrX3R5cGUgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSQzOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgZXZhbCAiJDM9bm8iCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSQ0Ci1pbnQKLW1haW4gKCkKLXsKLWlmIChzaXplb2YgKCQyKSkKLQkgcmV0dXJuIDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJDQKLWludAotbWFpbiAoKQotewotaWYgKHNpemVvZiAoKCQyKSkpCi0JICAgIHJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0KLWVsc2UKLSAgZXZhbCAiJDM9eWVzIgotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWV2YWwgYWNfcmVzPVwkJDMKLQkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQotJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQotICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQotCi19ICMgYWNfZm5fY19jaGVja190eXBlCi1jYXQgPmNvbmZpZy5sb2cgPDxfQUNFT0YKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotCi1JdCB3YXMgY3JlYXRlZCBieSBsaWJwbmcgJGFzX21lIDEuNC4xMiwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjUuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKLQotICAkICQwICRACi0KLV9BQ0VPRgotZXhlYyA1Pj5jb25maWcubG9nCi17Ci1jYXQgPDxfQVNVTkFNRQotIyMgLS0tLS0tLS0tICMjCi0jIyBQbGF0Zm9ybS4gIyMKLSMjIC0tLS0tLS0tLSAjIwotCi1ob3N0bmFtZSA9IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAotdW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0KLS91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsICAgICB8fCBlY2hvIHVua25vd25gCi0KLS9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGwgICAgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLS91c3IvYmluL2hvc3RpbmZvICAgICAgPSBgKC91c3IvYmluL2hvc3RpbmZvKSAyPi9kZXYvbnVsbCAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS9iaW4vbWFjaGluZSAgICAgICAgICAgPSBgKC9iaW4vbWFjaGluZSkgMj4vZGV2L251bGwgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLQotX0FTVU5BTUUKLQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgICRhc19lY2hvICJQQVRIOiAkYXNfZGlyIgotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLX0gPiY1Ci0KLWNhdCA+JjUgPDxfQUNFT0YKLQotCi0jIyAtLS0tLS0tLS0tLSAjIwotIyMgQ29yZSB0ZXN0cy4gIyMKLSMjIC0tLS0tLS0tLS0tICMjCi0KLV9BQ0VPRgotCi0KLSMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzLgotIyBNYWtlIHR3byBwYXNzZXMgdG8gYWxsb3cgZm9yIHByb3BlciBkdXBsaWNhdGUtYXJndW1lbnQgc3VwcHJlc3Npb24uCi1hY19jb25maWd1cmVfYXJncz0KLWFjX2NvbmZpZ3VyZV9hcmdzMD0KLWFjX2NvbmZpZ3VyZV9hcmdzMT0KLWFjX211c3Rfa2VlcF9uZXh0PWZhbHNlCi1mb3IgYWNfcGFzcyBpbiAxIDIKLWRvCi0gIGZvciBhY19hcmcKLSAgZG8KLSAgICBjYXNlICRhY19hcmcgaW4KLSAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7Ci0gICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICAgIGNvbnRpbnVlIDs7Ci0gICAgKlwnKikKLSAgICAgIGFjX2FyZz1gJGFzX2VjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Ci0gICAgZXNhYwotICAgIGNhc2UgJGFjX3Bhc3MgaW4KLSAgICAxKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MwICIgJyRhY19hcmcnIiA7OwotICAgIDIpCi0gICAgICBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MxICIgJyRhY19hcmcnIgotICAgICAgaWYgdGVzdCAkYWNfbXVzdF9rZWVwX25leHQgPSB0cnVlOyB0aGVuCi0JYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgotICAgICAgZWxzZQotCWNhc2UgJGFjX2FyZyBpbgotCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCi0JICB8IC1lbmFibGUtKiB8IC0tZW5hYmxlLSogfCAtZ2FzIHwgLS1nKiB8IC1uZnAgfCAtLW5mKiBcCi0JICB8IC1xIHwgLXF1aWV0IHwgLS1xKiB8IC1zaWxlbnQgfCAtLXNpbCogfCAtdiB8IC12ZXJiKiBcCi0JICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKLQkgICAgY2FzZSAiJGFjX2NvbmZpZ3VyZV9hcmdzMCAiIGluCi0JICAgICAgIiRhY19jb25maWd1cmVfYXJnczEiKiIgJyRhY19hcmcnICIqICkgY29udGludWUgOzsKLQkgICAgZXNhYwotCSAgICA7OwotCSAgLSogKSBhY19tdXN0X2tlZXBfbmV4dD10cnVlIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJncyAiICckYWNfYXJnJyIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi1kb25lCi17IGFjX2NvbmZpZ3VyZV9hcmdzMD07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMDt9Ci17IGFjX2NvbmZpZ3VyZV9hcmdzMT07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMTt9Ci0KLSMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKLSMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCi0jIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KLSMgV0FSTklORzogVXNlICdcJycgdG8gcmVwcmVzZW50IGFuIGFwb3N0cm9waGUgd2l0aGluIHRoZSB0cmFwLgotIyBXQVJOSU5HOiBEbyBub3Qgc3RhcnQgdGhlIHRyYXAgY29kZSB3aXRoIGEgbmV3bGluZSwgZHVlIHRvIGEgRnJlZUJTRCA0LjAgYnVnLgotdHJhcCAnZXhpdF9zdGF0dXM9JD8KLSAgIyBTYXZlIGludG8gY29uZmlnLmxvZyBzb21lIGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgaGVscCBpbiBkZWJ1Z2dpbmcuCi0gIHsKLSAgICBlY2hvCi0KLSAgICBjYXQgPDxcX0FTQk9YCi0jIyAtLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBDYWNoZSB2YXJpYWJsZXMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tICMjCi1fQVNCT1gKLSAgICBlY2hvCi0gICAgIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSgKLSAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAnXCcncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdcJydgOyBkbwotICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAotICAgICoke2FzX25sfSopCi0gICAgICBjYXNlICRhY192YXIgaW4gIygKLSAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKLSAgICAgIGVzYWMKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAotICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKLSAgICAgICopIHsgZXZhbCAkYWNfdmFyPTsgdW5zZXQgJGFjX3Zhcjt9IDs7Ci0gICAgICBlc2FjIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIChzZXQpIDI+JjEgfAotICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nXCcnICdcJyc7IHNldCkgMj4mMWAgaW4gIygKLSAgICAqJHthc19ubH1hY19zcGFjZT1cICopCi0gICAgICBzZWQgLW4gXAotCSJzLydcJycvJ1wnJ1xcXFwnXCcnJ1wnJy9nOwotCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXCcnXFwyJ1wnJy9wIgotICAgICAgOzsgIygKLSAgICAqKQotICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKLSAgICAgIDs7Ci0gICAgZXNhYyB8Ci0gICAgc29ydAotKQotICAgIGVjaG8KLQotICAgIGNhdCA8PFxfQVNCT1gKLSMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBPdXRwdXQgdmFyaWFibGVzLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKLV9BU0JPWAotICAgIGVjaG8KLSAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF92YXJzCi0gICAgZG8KLSAgICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotICAgICAgY2FzZSAkYWNfdmFsIGluCi0gICAgICAqXCdcJycqKSBhY192YWw9YCRhc19lY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7Ci0gICAgICBlc2FjCi0gICAgICAkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCi0gICAgZG9uZSB8IHNvcnQKLSAgICBlY2hvCi0KLSAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCi0gICAgICBjYXQgPDxcX0FTQk9YCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCi1fQVNCT1gKLSAgICAgIGVjaG8KLSAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCi0gICAgICBkbwotCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotCWNhc2UgJGFjX3ZhbCBpbgotCSpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKLQllc2FjCi0JJGFzX2VjaG8gIiRhY192YXI9J1wnJyRhY192YWwnXCcnIgotICAgICAgZG9uZSB8IHNvcnQKLSAgICAgIGVjaG8KLSAgICBmaQotCi0gICAgaWYgdGVzdCAtcyBjb25mZGVmcy5oOyB0aGVuCi0gICAgICBjYXQgPDxcX0FTQk9YCi0jIyAtLS0tLS0tLS0tLSAjIwotIyMgY29uZmRlZnMuaC4gIyMKLSMjIC0tLS0tLS0tLS0tICMjCi1fQVNCT1gKLSAgICAgIGVjaG8KLSAgICAgIGNhdCBjb25mZGVmcy5oCi0gICAgICBlY2hvCi0gICAgZmkKLSAgICB0ZXN0ICIkYWNfc2lnbmFsIiAhPSAwICYmCi0gICAgICAkYXNfZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCi0gICAgJGFzX2VjaG8gIiRhc19tZTogZXhpdCAkZXhpdF9zdGF0dXMiCi0gIH0gPiY1Ci0gIHJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiAmJgotICAgIHJtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29uZiQkKiAkYWNfY2xlYW5fZmlsZXMgJiYKLSAgICBleGl0ICRleGl0X3N0YXR1cwotJyAwCi1mb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KLSAgdHJhcCAnYWNfc2lnbmFsPSckYWNfc2lnbmFsJzsgYXNfZm5fZXhpdCAxJyAkYWNfc2lnbmFsCi1kb25lCi1hY19zaWduYWw9MAotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzLmgKLQotJGFzX2VjaG8gIi8qIGNvbmZkZWZzLmggKi8iID4gY29uZmRlZnMuaAotCi0jIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCi1fQUNFT0YKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiRQQUNLQUdFX1RBUk5BTUUiCi1fQUNFT0YKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCi1fQUNFT0YKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgotX0FDRU9GCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiRQQUNLQUdFX0JVR1JFUE9SVCIKLV9BQ0VPRgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0VfVVJMICIkUEFDS0FHRV9VUkwiCi1fQUNFT0YKLQotCi0jIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KLSMgUHJlZmVyIGFuIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1hY19zaXRlX2ZpbGUxPU5PTkUKLWFjX3NpdGVfZmlsZTI9Tk9ORQotaWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBhY19zaXRlX2ZpbGUxPSRDT05GSUdfU0lURQotZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgYWNfc2l0ZV9maWxlMT0kcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCi0gIGFjX3NpdGVfZmlsZTI9JHByZWZpeC9ldGMvY29uZmlnLnNpdGUKLWVsc2UKLSAgYWNfc2l0ZV9maWxlMT0kYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKLSAgYWNfc2l0ZV9maWxlMj0kYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAiJGFjX3NpdGVfZmlsZTEiICIkYWNfc2l0ZV9maWxlMiIKLWRvCi0gIHRlc3QgIngkYWNfc2l0ZV9maWxlIiA9IHhOT05FICYmIGNvbnRpbnVlCi0gIGlmIHRlc3QgL2Rldi9udWxsICE9ICIkYWNfc2l0ZV9maWxlIiAmJiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KLSAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwgZmlsZXMKLSAgIyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuICBESkdQUCBlbXVsYXRlcyBpdCBhcyBhIHJlZ3VsYXIgZmlsZS4KLSAgaWYgdGVzdCAvZGV2L251bGwgIT0gIiRjYWNoZV9maWxlIiAmJiB0ZXN0IC1mICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KLSAgICBjYXNlICRjYWNoZV9maWxlIGluCi0gICAgICBbXFwvXSogfCA/OltcXC9dKiApIC4gIiRjYWNoZV9maWxlIjs7Ci0gICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuICIuLyRjYWNoZV9maWxlIjs7Ci0gICAgZXNhYwotICBmaQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICA+JGNhY2hlX2ZpbGUKLWZpCi0KLSMgQ2hlY2sgdGhhdCB0aGUgcHJlY2lvdXMgdmFyaWFibGVzIHNhdmVkIGluIHRoZSBjYWNoZSBoYXZlIGtlcHQgdGhlIHNhbWUKLSMgdmFsdWUuCi1hY19jYWNoZV9jb3JydXB0ZWQ9ZmFsc2UKLWZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCi0gIGV2YWwgYWNfb2xkX3NldD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0Ci0gIGV2YWwgYWNfbmV3X3NldD1cJGFjX2Vudl8ke2FjX3Zhcn1fc2V0Ci0gIGV2YWwgYWNfb2xkX3ZhbD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUKLSAgZXZhbCBhY19uZXdfdmFsPVwkYWNfZW52XyR7YWNfdmFyfV92YWx1ZQotICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCi0gICAgc2V0LCkKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KLSAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7Ci0gICAgLHNldCkKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQotICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKLSAgICAsKTs7Ci0gICAgKikKLSAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KLQkjIGRpZmZlcmVuY2VzIGluIHdoaXRlc3BhY2UgZG8gbm90IGxlYWQgdG8gZmFpbHVyZS4KLQlhY19vbGRfdmFsX3c9YGVjaG8geCAkYWNfb2xkX3ZhbGAKLQlhY19uZXdfdmFsX3c9YGVjaG8geCAkYWNfbmV3X3ZhbGAKLQlpZiB0ZXN0ICIkYWNfb2xkX3ZhbF93IiAhPSAiJGFjX25ld192YWxfdyI7IHRoZW4KLQkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9Ci0JICBhY19jYWNoZV9jb3JydXB0ZWQ9OgotCWVsc2UKLQkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9Ci0JICBldmFsICRhY192YXI9XCRhY19vbGRfdmFsCi0JZmkKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mNQotJGFzX2VjaG8gIiRhc19tZTogICBmb3JtZXIgdmFsdWU6ICBcYCRhY19vbGRfdmFsJyIgPiYyO30KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mNQotJGFzX2VjaG8gIiRhc19tZTogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiYyO30KLSAgICAgIGZpOzsKLSAgZXNhYwotICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCi0gIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgotICAgIGNhc2UgJGFjX25ld192YWwgaW4KLSAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gJGFzX2VjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotICAgICopIGFjX2FyZz0kYWNfdmFyPSRhY19uZXdfdmFsIDs7Ci0gICAgZXNhYwotICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgotICAgICAgKiIgJyRhY19hcmcnICIqKSA7OyAjIEF2b2lkIGR1cHMuICBVc2Ugb2YgcXVvdGVzIGVuc3VyZXMgYWNjdXJhY3kuCi0gICAgICAqKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MgIiAnJGFjX2FyZyciIDs7Ci0gICAgZXNhYwotICBmaQotZG9uZQotaWYgJGFjX2NhY2hlX2NvcnJ1cHRlZDsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjI7fQotICBhc19mbl9lcnJvciAicnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgIiRMSU5FTk8iIDUKLWZpCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTWFpbiBib2R5IG9mIHNjcmlwdC4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotCi1hbV9fYXBpX3ZlcnNpb249JzEuMTEnCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICIkc3JjZGlyIiAiJHNyY2Rpci8uLiIgIiRzcmNkaXIvLi4vLi4iOyBkbwotICBmb3IgYWNfdCBpbiBpbnN0YWxsLXNoIGluc3RhbGwuc2ggc2h0b29sOyBkbwotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3QiOyB0aGVuCi0gICAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyLyRhY190IC1jIgotICAgICAgYnJlYWsgMgotICAgIGZpCi0gIGRvbmUKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICBhc19mbl9lcnJvciAiY2Fubm90IGZpbmQgaW5zdGFsbC1zaCwgaW5zdGFsbC5zaCwgb3Igc2h0b29sIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiAiJExJTkVOTyIgNQotZmkKLQotIyBUaGVzZSB0aHJlZSB2YXJpYWJsZXMgYXJlIHVuZG9jdW1lbnRlZCBhbmQgdW5zdXBwb3J0ZWQsCi0jIGFuZCBhcmUgaW50ZW5kZWQgdG8gYmUgd2l0aGRyYXduIGluIGEgZnV0dXJlIEF1dG9jb25mIHJlbGVhc2UuCi0jIFRoZXkgY2FuIGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMgaWYgYSBidWlsZGVyJ3Mgc291cmNlIHRyZWUgaXMgaW4gYSBkaXJlY3RvcnkKLSMgd2hvc2UgZnVsbCBuYW1lIGNvbnRhaW5zIHVudXN1YWwgY2hhcmFjdGVycy4KLWFjX2NvbmZpZ19ndWVzcz0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KLWFjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgotYWNfY29uZmlndXJlPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlndXJlIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcwotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLSMgUmVqZWN0IGluc3RhbGwgcHJvZ3JhbXMgdGhhdCBjYW5ub3QgaW5zdGFsbCBtdWx0aXBsZSBmaWxlcy4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uICIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotY2FzZSAkYXNfZGlyLyBpbiAjKCgKLSAgLi8gfCAuLy8gfCAvW2NDXS8qIHwgXAotICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKLSAgPzpbXFwvXW9zMltcXC9daW5zdGFsbFtcXC9dKiB8ID86W1xcL11PUzJbXFwvXUlOU1RBTExbXFwvXSogfCBcCi0gIC91c3IvdWNiLyogKSA7OwotICAqKQotICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgIyBieSBkZWZhdWx0LgotICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCi0JICAgIGVjaG8gb25lID4gY29uZnRlc3Qub25lCi0JICAgIGVjaG8gdHdvID4gY29uZnRlc3QudHdvCi0JICAgIG1rZGlyIGNvbmZ0ZXN0LmRpcgotCSAgICBpZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLWMgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byAiYHB3ZGAvY29uZnRlc3QuZGlyIiAmJgotCSAgICAgIHRlc3QgLXMgY29uZnRlc3Qub25lICYmIHRlc3QgLXMgY29uZnRlc3QudHdvICYmCi0JICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3Qub25lICYmCi0JICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3QudHdvCi0JICAgIHRoZW4KLQkgICAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCi0JICAgICAgYnJlYWsgMwotCSAgICBmaQotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgIGRvbmUKLSAgICA7OwotZXNhYwotCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCi0gICAgIyB2YWx1ZSBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgotICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKLSAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJElOU1RBTEwiID4mNQotJGFzX2VjaG8gIiRJTlNUQUxMIiA+JjY7IH0KLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLi4uICIgPiY2OyB9Ci0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCi0jIFJlamVjdCB1bnNhZmUgY2hhcmFjdGVycyBpbiAkc3JjZGlyIG9yIHRoZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeQotIyBuYW1lLiAgQWNjZXB0IHNwYWNlIGFuZCB0YWIgb25seSBpbiB0aGUgbGF0dGVyLgotYW1fbGY9JwotJwotY2FzZSBgcHdkYCBpbgotICAqW1xcXCJcI1wkXCZcJ1xgJGFtX2xmXSopCi0gICAgYXNfZm5fZXJyb3IgInVuc2FmZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeSBuYW1lIiAiJExJTkVOTyIgNTs7Ci1lc2FjCi1jYXNlICRzcmNkaXIgaW4KLSAgKltcXFwiXCNcJFwmXCdcYCRhbV9sZlwgXAldKikKLSAgICBhc19mbl9lcnJvciAidW5zYWZlIHNyY2RpciB2YWx1ZTogXGAkc3JjZGlyJyIgIiRMSU5FTk8iIDU7OwotZXNhYwotCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgIiRzcmNkaXIvY29uZmlndXJlIiBjb25mdGVzdC5maWxlYAotICAgZmkKLSAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKLSAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgYXNfZm5fZXJyb3IgImxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiICIkTElORU5PIiA1Ci0gICBmaQotCi0gICB0ZXN0ICIkMiIgPSBjb25mdGVzdC5maWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgYXNfZm5fZXJyb3IgIm5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siICIkTElORU5PIiA1Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJl4mJHByb2dyYW1fcHJlZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMmXCQmJHByb2dyYW1fc3VmZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgRG91YmxlIGFueSBcIG9yICQuCi0jIEJ5IGRlZmF1bHQgd2FzIGBzLHgseCcsIHJlbW92ZSBpdCBpZiB1c2VsZXNzLgotYWNfc2NyaXB0PSdzL1tcXCRdLyYmL2c7cy87cyx4LHgsJC8vJwotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1gJGFzX2VjaG8gIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiB8IHNlZCAiJGFjX3NjcmlwdCJgCi0KLSMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKLWFtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLQotaWYgdGVzdCB4IiR7TUlTU0lORytzZXR9IiAhPSB4c2V0OyB0aGVuCi0gIGNhc2UgJGFtX2F1eF9kaXIgaW4KLSAgKlwgKiB8ICpcCSopCi0gICAgTUlTU0lORz0iXCR7U0hFTEx9IFwiJGFtX2F1eF9kaXIvbWlzc2luZ1wiIiA7OwotICAqKQotICAgIE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIiA7OwotICBlc2FjCi1maQotIyBVc2UgZXZhbCB0byBleHBhbmQgJFNIRUxMCi1pZiBldmFsICIkTUlTU0lORyAtLXJ1biB0cnVlIjsgdGhlbgotICBhbV9taXNzaW5nX3J1bj0iJE1JU1NJTkcgLS1ydW4gIgotZWxzZQotICBhbV9taXNzaW5nX3J1bj0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogXGBtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nIiA+JjI7fQotZmkKLQotaWYgdGVzdCB4IiR7aW5zdGFsbF9zaH0iICE9IHhzZXQ7IHRoZW4KLSAgY2FzZSAkYW1fYXV4X2RpciBpbgotICAqXCAqIHwgKlwJKikKLSAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJyRhbV9hdXhfZGlyL2luc3RhbGwtc2gnIiA7OwotICAqKQotICAgIGluc3RhbGxfc2g9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9pbnN0YWxsLXNoIgotICBlc2FjCi1maQotCi0jIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKLSMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKLSMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKLSMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1zdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1zdHJpcDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfU1RSSVArc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfU1RSSVA9IiRTVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX1NUUklQPSIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLVNUUklQPSRhY19jdl9wcm9nX1NUUklQCi1pZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU1RSSVAiID4mNQotJGFzX2VjaG8gIiRTVFJJUCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfU1RSSVAiOyB0aGVuCi0gIGFjX2N0X1NUUklQPSRTVFJJUAotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBzdHJpcDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfU1RSSVArc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSJzdHJpcCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9TVFJJUD0kYWNfY3ZfcHJvZ19hY19jdF9TVFJJUAotaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1NUUklQIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfU1RSSVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9TVFJJUCIgPSB4OyB0aGVuCi0gICAgU1RSSVA9IjoiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgU1RSSVA9JGFjX2N0X1NUUklQCi0gIGZpCi1lbHNlCi0gIFNUUklQPSIkYWNfY3ZfcHJvZ19TVFJJUCIKLWZpCi0KLWZpCi1JTlNUQUxMX1NUUklQX1BST0dSQU09IlwkKGluc3RhbGxfc2gpIC1jIC1zIgotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wLi4uICIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkTUtESVJfUCI7IHRoZW4KLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX21rZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi9vcHQvc2Z3L2JpbgotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19wcm9nIGluIG1rZGlyIGdta2RpcjsgZG8KLQkgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0JICAgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfSB8fCBjb250aW51ZQotCSAgIGNhc2UgYCIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAtLXZlcnNpb24gMj4mMWAgaW4gIygKLQkgICAgICdta2RpciAoR05VIGNvcmV1dGlscykgJyogfCBcCi0JICAgICAnbWtkaXIgKGNvcmV1dGlscykgJyogfCBcCi0JICAgICAnbWtkaXIgKGZpbGV1dGlscykgJzQuMSopCi0JICAgICAgIGFjX2N2X3BhdGhfbWtkaXI9JGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dAotCSAgICAgICBicmVhayAzOzsKLQkgICBlc2FjCi0JIGRvbmUKLSAgICAgICBkb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLQotICB0ZXN0IC1kIC4vLS12ZXJzaW9uICYmIHJtZGlyIC4vLS12ZXJzaW9uCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9ta2RpcitzZXR9IiA9IHNldDsgdGhlbgotICAgIE1LRElSX1A9IiRhY19jdl9wYXRoX21rZGlyIC1wIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQotICAgICMgdmFsdWUgZm9yIE1LRElSX1Agd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KLSAgICBNS0RJUl9QPSIkYWNfaW5zdGFsbF9zaCAtZCIKLSAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1LRElSX1AiID4mNQotJGFzX2VjaG8gIiRNS0RJUl9QIiA+JjY7IH0KLQotbWtkaXJfcD0iJE1LRElSX1AiCi1jYXNlICRta2Rpcl9wIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKikgOzsKLSAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OwotZXNhYwotCi1mb3IgYWNfcHJvZyBpbiBnYXdrIG1hd2sgbmF3ayBhd2sKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19BV0src2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgotICBhY19jdl9wcm9nX0FXSz0iJEFXSyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQVdLPSRhY19jdl9wcm9nX0FXSwotaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRBV0siID4mNQotJGFzX2VjaG8gIiRBV0siID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotICB0ZXN0IC1uICIkQVdLIiAmJiBicmVhawotZG9uZQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKS4uLiAiID4mNjsgfQotc2V0IHggJHtNQUtFLW1ha2V9Ci1hY19tYWtlPWAkYXNfZWNobyAiJDIiIHwgc2VkICdzLysvcC9nOyBzL1teYS16QS1aMC05X10vXy9nJ2AKLWlmIHsgYXNfdmFyPWFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldDsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKLVNIRUxMID0gL2Jpbi9zaAotYWxsOgotCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCi1fQUNFT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCi0gICpAQEAlJSU9Pyo9QEBAJSUlKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OwotICAqKQotICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKLWVzYWMKLXJtIC1mIGNvbmZ0ZXN0Lm1ha2UKLWZpCi1pZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLSAgU0VUX01BS0U9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi1ybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAotbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAudHN0OyB0aGVuCi0gIGFtX19sZWFkaW5nX2RvdD0uCi1lbHNlCi0gIGFtX19sZWFkaW5nX2RvdD1fCi1maQotcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiOyB0aGVuCi0gICMgVXNlIC1JJChzcmNkaXIpIG9ubHkgd2hlbiAkKHNyY2RpcikgIT0gLiwgc28gdGhhdCBtYWtlJ3Mgb3V0cHV0Ci0gICMgaXMgbm90IHBvbGx1dGVkIHdpdGggcmVwZWF0ZWQgIi1JLiIKLSAgYW1fX2lzcmM9JyAtSSQoc3JjZGlyKScKLSAgIyB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi0gIGlmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgInNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gXCJtYWtlIGRpc3RjbGVhblwiIHRoZXJlIGZpcnN0IiAiJExJTkVOTyIgNQotICBmaQotZmkKLQotIyB0ZXN0IHdoZXRoZXIgd2UgaGF2ZSBjeWdwYXRoCi1pZiB0ZXN0IC16ICIkQ1lHUEFUSF9XIjsgdGhlbgotICBpZiAoY3lncGF0aCAtLXZlcnNpb24pID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLSAgICBDWUdQQVRIX1c9J2N5Z3BhdGggLXcnCi0gIGVsc2UKLSAgICBDWUdQQVRIX1c9ZWNobwotICBmaQotZmkKLQotCi0jIERlZmluZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhY2thZ2UuCi0gUEFDS0FHRT0nbGlicG5nJwotIFZFUlNJT049JzEuNC4xMicKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLV9BQ0VPRgotCi0jIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCi0KLUFDTE9DQUw9JHtBQ0xPQ0FMLSIke2FtX21pc3NpbmdfcnVufWFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259In0KLQotCi1BVVRPQ09ORj0ke0FVVE9DT05GLSIke2FtX21pc3NpbmdfcnVufWF1dG9jb25mIn0KLQotCi1BVVRPTUFLRT0ke0FVVE9NQUtFLSIke2FtX21pc3NpbmdfcnVufWF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSJ9Ci0KLQotQVVUT0hFQURFUj0ke0FVVE9IRUFERVItIiR7YW1fbWlzc2luZ19ydW59YXV0b2hlYWRlciJ9Ci0KLQotTUFLRUlORk89JHtNQUtFSU5GTy0iJHthbV9taXNzaW5nX3J1bn1tYWtlaW5mbyJ9Ci0KLSMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCi0jIHNvbWUgcGxhdGZvcm1zLgotIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotCi1BTVRBUj0ke0FNVEFSLSIke2FtX21pc3NpbmdfcnVufXRhciJ9Ci0KLWFtX190YXI9JyR7QU1UQVJ9IGNob2YgLSAiJCR0YXJkaXIiJzsgYW1fX3VudGFyPScke0FNVEFSfSB4ZiAtJwotCi0KLQotCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcy4uLiAiID4mNjsgfQotICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfbWFpbnRhaW5lcl9tb2RlOyBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX01BSU5UQUlORVJfTU9ERT1ubwotZmkKLQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFVTRV9NQUlOVEFJTkVSX01PREUiID4mNQotJGFzX2VjaG8gIiRVU0VfTUFJTlRBSU5FUl9NT0RFIiA+JjY7IH0KLSAgIGlmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9Ci0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKLWVsc2UKLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCi0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KLWZpCi0KLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0KLQotCi1QTkdMSUJfVkVSU0lPTj0xLjQuMTIKLVBOR0xJQl9NQUpPUj0xCi1QTkdMSUJfTUlOT1I9NAotUE5HTElCX1JFTEVBU0U9MTIKLQotCi0KLWFjX2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMgY29uZmlnLmgiCi0KLQotIyBDaGVja3MgZm9yIHByb2dyYW1zLgotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKLSRhc19lY2hvICIkQ0MiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0NDIjsgdGhlbgotICBhY19jdF9DQz0kQ0MKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSJnY2MiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKLWlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgotICAgIENDPSIiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgQ0M9JGFjX2N0X0NDCi0gIGZpCi1lbHNlCi0gIENDPSIkYWNfY3ZfcHJvZ19DQyIKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1Ci0kYXNfZWNobyAiJENDIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgZmkKLWZpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLSAgICAgICBjb250aW51ZQotICAgICBmaQotICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgIT0gMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1Ci0kYXNfZWNobyAiJENDIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCi0gIGRvCi0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1Ci0kYXNfZWNobyAiJENDIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCi0gIGRvbmUKLWZpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gIGFjX2N0X0NDPSRDQwotICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCi1pZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRhY19jdF9DQyIgJiYgYnJlYWsKLWRvbmUKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KLSAgICBDQz0iIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIENDPSRhY19jdF9DQwotICBmaQotZmkKLQotZmkKLQotCi10ZXN0IC16ICIkQ0MiICYmIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgIm5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNTsgfQotCi0jIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCi0kYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKLXNldCBYICRhY19jb21waWxlCi1hY19jb21waWxlcj0kMgotZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbwotICB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIpIDI+Y29uZnRlc3QuZXJyCi0gIGFjX3N0YXR1cz0kPwotICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgIHNlZCAnMTBhXAotLi4uIHJlc3Qgb2Ygc3RkZXJyIG91dHB1dCBkZWxldGVkIC4uLgotICAgICAgICAgMTBxJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KLWRvbmUKLQotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1hY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcwotYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGIub3V0IgotIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgotIyBJdCB3aWxsIGhlbHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVpdGlvbgotIyBvZiBleGVleHQuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAiID4mNjsgfQotYWNfbGlua19kZWZhdWx0PWAkYXNfZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKLQotIyBUaGUgcG9zc2libGUgb3V0cHV0IGZpbGVzOgotYWNfZmlsZXM9ImEub3V0IGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBhLmV4ZSBhX291dC5leGUgYi5vdXQgY29uZnRlc3QuKiIKLQotYWNfcm1maWxlcz0KLWZvciBhY19maWxlIGluICRhY19maWxlcwotZG8KLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKLSAgICAqICkgYWNfcm1maWxlcz0iJGFjX3JtZmlsZXMgJGFjX2ZpbGUiOzsKLSAgZXNhYwotZG9uZQotcm0gLWYgJGFjX3JtZmlsZXMKLQotaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmtfZGVmYXVsdCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2xpbmtfZGVmYXVsdCIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKLSAgIyBBdXRvY29uZi0yLjEzIGNvdWxkIHNldCB0aGUgYWNfY3ZfZXhlZXh0IHZhcmlhYmxlIHRvIGBubycuCi0jIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBubycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJwotIyBpbiBhIE1ha2VmaWxlLiAgV2Ugc2hvdWxkIG5vdCBvdmVycmlkZSBhY19jdl9leGVleHQgaWYgaXQgd2FzIGNhY2hlZCwKLSMgc28gdGhhdCB0aGUgdXNlciBjYW4gc2hvcnQtY2lyY3VpdCB0aGlzIHRlc3QgZm9yIGNvbXBpbGVycyB1bmtub3duIHRvCi0jIEF1dG9jb25mLgotZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzICcnCi1kbwotICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkKLQk7OwotICAgIFthYl0ub3V0ICkKLQkjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAotCSMgY2VydGFpbmx5IHJpZ2h0LgotCWJyZWFrOzsKLSAgICAqLiogKQotCWlmIHRlc3QgIiR7YWNfY3ZfZXhlZXh0K3NldH0iID0gc2V0ICYmIHRlc3QgIiRhY19jdl9leGVleHQiICE9IG5vOwotCXRoZW4gOjsgZWxzZQotCSAgIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAotCWZpCi0JIyBXZSBzZXQgYWNfY3ZfZXhlZXh0IGhlcmUgYmVjYXVzZSB0aGUgbGF0ZXIgdGVzdCBmb3IgaXQgaXMgbm90Ci0JIyBzYWZlOiBjcm9zcyBjb21waWxlcnMgbWF5IG5vdCBhZGQgdGhlIHN1ZmZpeCBpZiBnaXZlbiBhbiBgLW8nCi0JIyBhcmd1bWVudCwgc28gd2UgbWF5IG5lZWQgdG8ga25vdyBpdCBhdCB0aGF0IHBvaW50IGFscmVhZHkuCi0JIyBFdmVuIGlmIHRoaXMgc2VjdGlvbiBsb29rcyBjcnVmdHk6IGl0IGhhcyB0aGUgYWR2YW50YWdlIG9mCi0JIyBhY3R1YWxseSB3b3JraW5nLgotCWJyZWFrOzsKLSAgICAqICkKLQlicmVhazs7Ci0gIGVzYWMKLWRvbmUKLXRlc3QgIiRhY19jdl9leGVleHQiID0gbm8gJiYgYWNfY3ZfZXhlZXh0PQotCi1lbHNlCi0gIGFjX2ZpbGU9JycKLWZpCi1pZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLSRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi17IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLXsgYXNfZm5fc2V0X3N0YXR1cyA3NwotYXNfZm5fZXJyb3IgIkMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iICIkTElORU5PIiA1OyB9OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uICIgPiY2OyB9Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2ZpbGUiID4mNQotJGFzX2VjaG8gIiRhY19maWxlIiA+JjY7IH0KLWFjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0Ci0KLXJtIC1mIC1yIGEub3V0IGEub3V0LmRTWU0gYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0Ci1hY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gIiA+JjY7IH0KLWlmIHsgeyBhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKLSAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCi0jIGNhdGNoIGBjb25mdGVzdC5leGUnLiAgRm9yIGluc3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwKLSMgd29yayBwcm9wZXJseSAoaS5lLiwgcmVmZXIgdG8gYGNvbmZ0ZXN0LmV4ZScpLCB3aGlsZSBpdCB3b24ndCB3aXRoCi0jIGBybScuCi1mb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5leGUgY29uZnRlc3QgY29uZnRlc3QuKjsgZG8KLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7Ci0gICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCi0JICBicmVhazs7Ci0gICAgKiApIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotZWxzZQotICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgIiRMSU5FTk8iIDU7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCBjb25mdGVzdCRhY19jdl9leGVleHQKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfZXhlZXh0IiA+JjY7IH0KLQotcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotRVhFRVhUPSRhY19jdl9leGVleHQKLWFjX2V4ZWV4dD0kRVhFRVhUCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLWludAotbWFpbiAoKQotewotRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3Qub3V0IiwgInciKTsKLSByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBjb25mdGVzdC5vdXQiCi0jIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgotIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KLSAgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KLSAgaWYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfY3ZfZXhlZXh0JwotICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9bm8KLSAgZWxzZQotICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KLQljcm9zc19jb21waWxpbmc9eWVzCi0gICAgZWxzZQotCXsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgImNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KLUlmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iICIkTElORU5PIiA1OyB9Ci0gICAgZmkKLSAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGNyb3NzX2NvbXBpbGluZyIgPiY1Ci0kYXNfZWNobyAiJGNyb3NzX2NvbXBpbGluZyIgPiY2OyB9Ci0KLXJtIC1mIGNvbmZ0ZXN0LiRhY19leHQgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGNvbmZ0ZXN0Lm91dAotYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfb2JqZXh0K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iagotaWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgotICBmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iaiBjb25mdGVzdC4qOyBkbwotICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWU7Ci0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gKSA7OwotICAgICopIGFjX2N2X29iamV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJy4qXC5cKC4qXCknYAotICAgICAgIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQoteyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciAiY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90IGNvbXBpbGUKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNTsgfQotZmkKLXJtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfb2JqZXh0IiA+JjY7IH0KLU9CSkVYVD0kYWNfY3Zfb2JqZXh0Ci1hY19vYmpleHQ9JE9CSkVYVAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2NfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLSNpZm5kZWYgX19HTlVDX18KLSAgICAgICBjaG9rZSBtZQotI2VuZGlmCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jb21waWxlcl9nbnU9eWVzCi1lbHNlCi0gIGFjX2NvbXBpbGVyX2dudT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjY7IH0KLWlmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi1hY190ZXN0X0NGTEFHUz0ke0NGTEFHUytzZXR9Ci1hY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2crc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKLSAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCi0gICBhY19jdl9wcm9nX2NjX2c9bm8KLSAgIENGTEFHUz0iLWciCi0gICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBDRkxBR1M9IiIKLSAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotCi1lbHNlCi0gIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwotCSBDRkxBR1M9Ii1nIgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQotJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfYzg5K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19jODk9bm8KLWFjX3NhdmVfQ0M9JENDCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLwotc3RydWN0IGJ1ZiB7IGludCB4OyB9OwotRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKLXN0YXRpYyBjaGFyICplIChwLCBpKQotICAgICBjaGFyICoqcDsKLSAgICAgaW50IGk7Ci17Ci0gIHJldHVybiBwW2ldOwotfQotc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQotewotICBjaGFyICpzOwotICB2YV9saXN0IHY7Ci0gIHZhX3N0YXJ0ICh2LHApOwotICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOwotICB2YV9lbmQgKHYpOwotICByZXR1cm4gczsKLX0KLQotLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKLSAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KLSAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAotICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkIGlzIGFkZGVkIHRvIGdldAotICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgotICAgYXJyYXkgc2l6ZSBhdCBsZWFzdC4gIEl0J3MgbmVjZXNzYXJ5IHRvIHdyaXRlICdceDAwJz09MCB0byBnZXQgc29tZXRoaW5nCi0gICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCi1pbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOwotCi0vKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKLSAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KLSNkZWZpbmUgRk9PKHgpICd4JwotaW50IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07Ci0KLWludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOwotc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307Ci1zdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKLWludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOwotaW50IGFyZ2M7Ci1jaGFyICoqYXJndjsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1mb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCi0JLUFlICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKLWRvCi0gIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgotICBpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19hcmcKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0Ci0gIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCi1kb25lCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci1DQz0kYWNfc2F2ZV9DQwotCi1maQotIyBBQ19DQUNIRV9WQUwKLWNhc2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCi0gIHgpCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKLSRhc19lY2hvICJub25lIG5lZWRlZCIgPiY2OyB9IDs7Ci0gIHhubykKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdW5zdXBwb3J0ZWQiID4mNQotJGFzX2VjaG8gInVuc3VwcG9ydGVkIiA+JjY7IH0gOzsKLSAgKikKLSAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX2M4OSIKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19jODkiID4mNjsgfSA7OwotZXNhYwotaWYgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0geG5vOyB0aGVuIDoKLQotZmkKLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotREVQRElSPSIke2FtX19sZWFkaW5nX2RvdH1kZXBzIgotCi1hY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgZGVwZmlsZXMiCi0KLQotYW1fbWFrZT0ke01BS0UtbWFrZX0KLWNhdCA+IGNvbmZpbmMgPDwgJ0VORCcKLWFtX19kb2l0OgotCUBlY2hvIHRoaXMgaXMgdGhlIGFtX19kb2l0IHRhcmdldAotLlBIT05ZOiBhbV9fZG9pdAotRU5ECi0jIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2UiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZS4uLiAiID4mNjsgfQotYW1fX2luY2x1ZGU9IiMiCi1hbV9fcXVvdGU9Ci1fYW1fcmVzdWx0PW5vbmUKLSMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCi1lY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCi0jIElnbm9yZSBhbGwga2luZHMgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJvbSBgbWFrZScuCi1jYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAotKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCi0gIGFtX19pbmNsdWRlPWluY2x1ZGUKLSAgYW1fX3F1b3RlPQotICBfYW1fcmVzdWx0PUdOVQotICA7OwotZXNhYwotIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCi1pZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCi0gICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCi0gICBjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAotICAgKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCi0gICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCi0gICAgIGFtX19xdW90ZT0iXCIiCi0gICAgIF9hbV9yZXN1bHQ9QlNECi0gICAgIDs7Ci0gICBlc2FjCi1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkX2FtX3Jlc3VsdCIgPiY1Ci0kYXNfZWNobyAiJF9hbV9yZXN1bHQiID4mNjsgfQotcm0gLWYgY29uZmluYyBjb25mbWYKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIGVuYWJsZXZhbD0kZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmc7Ci1maQotCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKLSAgQU1ERVBCQUNLU0xBU0g9J1wnCi1maQotIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgotICBBTURFUF9UUlVFPQotICBBTURFUF9GQUxTRT0nIycKLWVsc2UKLSAgQU1ERVBfVFJVRT0nIycKLSAgQU1ERVBfRkFMU0U9Ci1maQotCi0KLQotZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgotICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCi0gICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCi0gICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCi0gICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKLSAgIyBpbiBEJy4KLSAgbWtkaXIgY29uZnRlc3QuZGlyCi0gICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCi0gICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCi0gIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCi0gIGNkIGNvbmZ0ZXN0LmRpcgotICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKLSAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKLSAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKLSAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCi0gICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAotICAjIGRpcmVjdG9yeS4KLSAgbWtkaXIgc3ViCi0KLSAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgotICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAotICBmaQotICBhbV9fdW5pdmVyc2FsPWZhbHNlCi0gIGNhc2UgIiAkZGVwY2MgIiBpbiAjKAotICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OwotICAgICBlc2FjCi0KLSAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCi0gICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCi0gICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAotICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KLSAgICAjCi0gICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKLSAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgotICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgotICAgIDogPiBzdWIvY29uZnRlc3QuYwotICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbwotICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYwotICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKLSAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCi0gICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKLSAgICBkb25lCi0gICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgotCi0gICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCi0gICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKLSAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4gIEFsc28sIHNvbWUgSW50ZWwKLSAgICAjIHZlcnNpb25zIGhhZCB0cm91YmxlIHdpdGggb3V0cHV0IGluIHN1YmRpcnMKLSAgICBhbV9fb2JqPXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfQotICAgIGFtX19taW51c19vYmo9Ii1vICRhbV9fb2JqIgotICAgIGNhc2UgJGRlcG1vZGUgaW4KLSAgICBnY2MpCi0gICAgICAjIFRoaXMgZGVwbW9kZSBjYXVzZXMgYSBjb21waWxlciByYWNlIGluIHVuaXZlcnNhbCBtb2RlLgotICAgICAgdGVzdCAiJGFtX191bml2ZXJzYWwiID0gZmFsc2UgfHwgY29udGludWUKLSAgICAgIDs7Ci0gICAgbm9zaWRlZWZmZWN0KQotICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCi0gICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KLQljb250aW51ZQotICAgICAgZWxzZQotCWJyZWFrCi0gICAgICBmaQotICAgICAgOzsKLSAgICBtc3Zpc3VhbGNwcCB8IG1zdmNtc3lzKQotICAgICAgIyBUaGlzIGNvbXBpbGVyIHdvbid0IGdyb2sgYC1jIC1vJywgYnV0IGFsc28sIHRoZSBtaW51c28gdGVzdCBoYXMKLSAgICAgICMgbm90IHJ1biB5ZXQuICBUaGVzZSBkZXBtb2RlcyBhcmUgbGF0ZSBlbm91Z2ggaW4gdGhlIGdhbWUsIGFuZAotICAgICAgIyBzbyB3ZWFrIHRoYXQgdGhlaXIgZnVuY3Rpb25pbmcgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KLSAgICAgIGFtX19vYmo9Y29uZnRlc3QuJHtPQkpFWFQtb30KLSAgICAgIGFtX19taW51c19vYmo9Ci0gICAgICA7OwotICAgIG5vbmUpIGJyZWFrIDs7Ci0gICAgZXNhYwotICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAotICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9JGFtX19vYmogXAotICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCi0gICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgJGFtX19taW51c19vYmogc3ViL2NvbmZ0ZXN0LmMgXAotICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgZ3JlcCAkYW1fX29iaiBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncwotICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKLSAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgotICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKLSAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAotICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8Ci0gICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQotICAgICAgICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0KLSAgY2QgLi4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotZWxzZQotICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi1maQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY1Ci0kYXNfZWNobyAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KLUNDREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQotCi0gaWYKLSAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKLSAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KLSAgYW1fX2Zhc3RkZXBDQ19UUlVFPQotICBhbV9fZmFzdGRlcENDX0ZBTFNFPScjJwotZWxzZQotICBhbV9fZmFzdGRlcENDX1RSVUU9JyMnCi0gIGFtX19mYXN0ZGVwQ0NfRkFMU0U9Ci1maQotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLSRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgc3VuNCA+L2Rldi9udWxsIDI+JjEgfHwKLSAgYXNfZm5fZXJyb3IgImNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICIkTElORU5PIiA1Ci0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfYnVpbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKLXRlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgotICBhY19idWlsZF9hbGlhcz1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiYAotdGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCi0gIGFzX2ZuX2Vycm9yICJjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiICIkTElORU5PIiA1Ci1hY19jdl9idWlsZD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkYWNfYnVpbGRfYWxpYXNgIHx8Ci0gIGFzX2ZuX2Vycm9yICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9idWlsZCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2J1aWxkIiA+JjY7IH0KLWNhc2UgJGFjX2N2X2J1aWxkIGluCi0qLSotKikgOzsKLSopIGFzX2ZuX2Vycm9yICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgIiRMSU5FTk8iIDU7OwotZXNhYwotYnVpbGQ9JGFjX2N2X2J1aWxkCi1hY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCi1zZXQgeCAkYWNfY3ZfYnVpbGQKLXNoaWZ0Ci1idWlsZF9jcHU9JDEKLWJ1aWxkX3ZlbmRvcj0kMgotc2hpZnQ7IHNoaWZ0Ci0jIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKLSMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKLWJ1aWxkX29zPSQqCi1JRlM9JGFjX3NhdmVfSUZTCi1jYXNlICRidWlsZF9vcyBpbiAqXCAqKSBidWlsZF9vcz1gZWNobyAiJGJ1aWxkX29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYwotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hvc3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiID0geDsgdGhlbgotICBhY19jdl9ob3N0PSRhY19jdl9idWlsZAotZWxzZQotICBhY19jdl9ob3N0PWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRob3N0X2FsaWFzYCB8fAotICAgIGFzX2ZuX2Vycm9yICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1Ci1maQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfaG9zdCIgPiY2OyB9Ci1jYXNlICRhY19jdl9ob3N0IGluCi0qLSotKikgOzsKLSopIGFzX2ZuX2Vycm9yICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBob3N0IiAiJExJTkVOTyIgNTs7Ci1lc2FjCi1ob3N0PSRhY19jdl9ob3N0Ci1hY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCi1zZXQgeCAkYWNfY3ZfaG9zdAotc2hpZnQKLWhvc3RfY3B1PSQxCi1ob3N0X3ZlbmRvcj0kMgotc2hpZnQ7IHNoaWZ0Ci0jIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKLSMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKLWhvc3Rfb3M9JCoKLUlGUz0kYWNfc2F2ZV9JRlMKLWNhc2UgJGhvc3Rfb3MgaW4gKlwgKikgaG9zdF9vcz1gZWNobyAiJGhvc3Rfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfU0VEK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgICAgICAgICAgIGFjX3NjcmlwdD1zL2FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhL2JiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYi8KLSAgICAgZm9yIGFjX2kgaW4gMSAyIDMgNCA1IDYgNzsgZG8KLSAgICAgICBhY19zY3JpcHQ9IiRhY19zY3JpcHQkYXNfbmwkYWNfc2NyaXB0IgotICAgICBkb25lCi0gICAgIGVjaG8gIiRhY19zY3JpcHQiIDI+L2Rldi9udWxsIHwgc2VkIDk5cSA+Y29uZnRlc3Quc2VkCi0gICAgIHsgYWNfc2NyaXB0PTsgdW5zZXQgYWNfc2NyaXB0O30KLSAgICAgaWYgdGVzdCAteiAiJFNFRCI7IHRoZW4KLSAgYWNfcGF0aF9TRURfZm91bmQ9ZmFsc2UKLSAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19wcm9nIGluIHNlZCBnc2VkOyBkbwotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICAgICAgYWNfcGF0aF9TRUQ9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX1NFRCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfU0VEIjsgfSB8fCBjb250aW51ZQotIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfU0VEIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCi0gICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9TRUQKLWNhc2UgYCIkYWNfcGF0aF9TRUQiIC0tdmVyc2lvbiAyPiYxYCBpbgotKkdOVSopCi0gIGFjX2N2X3BhdGhfU0VEPSIkYWNfcGF0aF9TRUQiIGFjX3BhdGhfU0VEX2ZvdW5kPTo7OwotKikKLSAgYWNfY291bnQ9MAotICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKLSAgd2hpbGUgOgotICBkbwotICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCi0gICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgotICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgotICAgICRhc19lY2hvICcnID4+ICJjb25mdGVzdC5ubCIKLSAgICAiJGFjX3BhdGhfU0VEIiAtZiBjb25mdGVzdC5zZWQgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawotICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKLSAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKLSAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX1NFRF9tYXgtMH07IHRoZW4KLSAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQotICAgICAgYWNfY3ZfcGF0aF9TRUQ9IiRhY19wYXRoX1NFRCIKLSAgICAgIGFjX3BhdGhfU0VEX21heD0kYWNfY291bnQKLSAgICBmaQotICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKLSAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKLSAgZG9uZQotICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKLWVzYWMKLQotICAgICAgJGFjX3BhdGhfU0VEX2ZvdW5kICYmIGJyZWFrIDMKLSAgICBkb25lCi0gIGRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9TRUQiOyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgIm5vIGFjY2VwdGFibGUgc2VkIGNvdWxkIGJlIGZvdW5kIGluIFwkUEFUSCIgIiRMSU5FTk8iIDUKLSAgZmkKLWVsc2UKLSAgYWNfY3ZfcGF0aF9TRUQ9JFNFRAotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9TRUQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9wYXRoX1NFRCIgPiY2OyB9Ci0gU0VEPSIkYWNfY3ZfcGF0aF9TRUQiCi0gIHJtIC1mIGNvbmZ0ZXN0LnNlZAotCi10ZXN0IC16ICIkU0VEIiAmJiBTRUQ9c2VkCi1Yc2VkPSIkU0VEIC1lIDFzL15YLy8iCi0KLQotCi0KLQotCi0KLQotCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfR1JFUCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRHUkVQIjsgdGhlbgotICBhY19wYXRoX0dSRVBfZm91bmQ9ZmFsc2UKLSAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfcHJvZyBpbiBncmVwIGdncmVwOyBkbwotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICAgICAgYWNfcGF0aF9HUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9HUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9HUkVQIjsgfSB8fCBjb250aW51ZQotIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgotICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfR1JFUAotY2FzZSBgIiRhY19wYXRoX0dSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgotKkdOVSopCi0gIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIgYWNfcGF0aF9HUkVQX2ZvdW5kPTo7OwotKikKLSAgYWNfY291bnQ9MAotICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKLSAgd2hpbGUgOgotICBkbwotICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCi0gICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgotICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgotICAgICRhc19lY2hvICdHUkVQJyA+PiAiY29uZnRlc3QubmwiCi0gICAgIiRhY19wYXRoX0dSRVAiIC1lICdHUkVQJCcgLWUgJy0oY2Fubm90IG1hdGNoKS0nIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKLSAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCi0gICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCi0gICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9HUkVQX21heC0wfTsgdGhlbgotICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCi0gICAgICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiCi0gICAgICBhY19wYXRoX0dSRVBfbWF4PSRhY19jb3VudAotICAgIGZpCi0gICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAotICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhawotICBkb25lCi0gIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OwotZXNhYwotCi0gICAgICAkYWNfcGF0aF9HUkVQX2ZvdW5kICYmIGJyZWFrIDMKLSAgICBkb25lCi0gIGRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HUkVQIjsgdGhlbgotICAgIGFzX2ZuX2Vycm9yICJubyBhY2NlcHRhYmxlIGdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQotICBmaQotZWxzZQotICBhY19jdl9wYXRoX0dSRVA9JEdSRVAKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfR1JFUCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3BhdGhfR1JFUCIgPiY2OyB9Ci0gR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBlZ3JlcCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZWdyZXAuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9FR1JFUCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIGVjaG8gYSB8ICRHUkVQIC1FICcoYXxiKScgPi9kZXYvbnVsbCAyPiYxCi0gICB0aGVuIGFjX2N2X3BhdGhfRUdSRVA9IiRHUkVQIC1FIgotICAgZWxzZQotICAgICBpZiB0ZXN0IC16ICIkRUdSRVAiOyB0aGVuCi0gIGFjX3BhdGhfRUdSRVBfZm91bmQ9ZmFsc2UKLSAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfcHJvZyBpbiBlZ3JlcDsgZG8KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgICAgIGFjX3BhdGhfRUdSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0VHUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9FR1JFUCI7IH0gfHwgY29udGludWUKLSMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0VHUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCi0gICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9FR1JFUAotY2FzZSBgIiRhY19wYXRoX0VHUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KLSpHTlUqKQotICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIgYWNfcGF0aF9FR1JFUF9mb3VuZD06OzsKLSopCi0gIGFjX2NvdW50PTAKLSAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCi0gIHdoaWxlIDoKLSAgZG8KLSAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgotICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKLSAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKLSAgICAkYXNfZWNobyAnRUdSRVAnID4+ICJjb25mdGVzdC5ubCIKLSAgICAiJGFjX3BhdGhfRUdSRVAiICdFR1JFUCQnIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKLSAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCi0gICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCi0gICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9FR1JFUF9tYXgtMH07IHRoZW4KLSAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQotICAgICAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiCi0gICAgICBhY19wYXRoX0VHUkVQX21heD0kYWNfY291bnQKLSAgICBmaQotICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKLSAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKLSAgZG9uZQotICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKLWVzYWMKLQotICAgICAgJGFjX3BhdGhfRUdSRVBfZm91bmQgJiYgYnJlYWsgMwotICAgIGRvbmUKLSAgZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0gIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0VHUkVQIjsgdGhlbgotICAgIGFzX2ZuX2Vycm9yICJubyBhY2NlcHRhYmxlIGVncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRMSU5FTk8iIDUKLSAgZmkKLWVsc2UKLSAgYWNfY3ZfcGF0aF9FR1JFUD0kRUdSRVAKLWZpCi0KLSAgIGZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wYXRoX0VHUkVQIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcGF0aF9FR1JFUCIgPiY2OyB9Ci0gRUdSRVA9IiRhY19jdl9wYXRoX0VHUkVQIgotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZncmVwIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBmZ3JlcC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX0ZHUkVQK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgZWNobyAnYWIqYycgfCAkR1JFUCAtRiAnYWIqYycgPi9kZXYvbnVsbCAyPiYxCi0gICB0aGVuIGFjX2N2X3BhdGhfRkdSRVA9IiRHUkVQIC1GIgotICAgZWxzZQotICAgICBpZiB0ZXN0IC16ICIkRkdSRVAiOyB0aGVuCi0gIGFjX3BhdGhfRkdSRVBfZm91bmQ9ZmFsc2UKLSAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfcHJvZyBpbiBmZ3JlcDsgZG8KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgICAgIGFjX3BhdGhfRkdSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0ZHUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9GR1JFUCI7IH0gfHwgY29udGludWUKLSMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0ZHUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCi0gICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9GR1JFUAotY2FzZSBgIiRhY19wYXRoX0ZHUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KLSpHTlUqKQotICBhY19jdl9wYXRoX0ZHUkVQPSIkYWNfcGF0aF9GR1JFUCIgYWNfcGF0aF9GR1JFUF9mb3VuZD06OzsKLSopCi0gIGFjX2NvdW50PTAKLSAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCi0gIHdoaWxlIDoKLSAgZG8KLSAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgotICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKLSAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKLSAgICAkYXNfZWNobyAnRkdSRVAnID4+ICJjb25mdGVzdC5ubCIKLSAgICAiJGFjX3BhdGhfRkdSRVAiIEZHUkVQIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKLSAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCi0gICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCi0gICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9GR1JFUF9tYXgtMH07IHRoZW4KLSAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQotICAgICAgYWNfY3ZfcGF0aF9GR1JFUD0iJGFjX3BhdGhfRkdSRVAiCi0gICAgICBhY19wYXRoX0ZHUkVQX21heD0kYWNfY291bnQKLSAgICBmaQotICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKLSAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKLSAgZG9uZQotICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKLWVzYWMKLQotICAgICAgJGFjX3BhdGhfRkdSRVBfZm91bmQgJiYgYnJlYWsgMwotICAgIGRvbmUKLSAgZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0gIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0ZHUkVQIjsgdGhlbgotICAgIGFzX2ZuX2Vycm9yICJubyBhY2NlcHRhYmxlIGZncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRMSU5FTk8iIDUKLSAgZmkKLWVsc2UKLSAgYWNfY3ZfcGF0aF9GR1JFUD0kRkdSRVAKLWZpCi0KLSAgIGZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wYXRoX0ZHUkVQIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcGF0aF9GR1JFUCIgPiY2OyB9Ci0gRkdSRVA9IiRhY19jdl9wYXRoX0ZHUkVQIgotCi0KLXRlc3QgLXogIiRHUkVQIiAmJiBHUkVQPWdyZXAKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi1FQ0hPPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJwotRUNITz0kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCi1FQ0hPPSRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITwotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBwcmludCBzdHJpbmdzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBwcmludCBzdHJpbmdzLi4uICIgPiY2OyB9Ci0jIFRlc3QgcHJpbnQgZmlyc3QsIGJlY2F1c2UgaXQgd2lsbCBiZSBhIGJ1aWx0aW4gaWYgcHJlc2VudC4KLWlmIHRlc3QgIlhgcHJpbnQgLXIgLS0gLW4gMj4vZGV2L251bGxgIiA9IFgtbiAmJiBcCi0gICB0ZXN0ICJYYHByaW50IC1yIC0tICRFQ0hPIDI+L2Rldi9udWxsYCIgPSAiWCRFQ0hPIjsgdGhlbgotICBFQ0hPPSdwcmludCAtciAtLScKLWVsaWYgdGVzdCAiWGBwcmludGYgJXMgJEVDSE8gMj4vZGV2L251bGxgIiA9ICJYJEVDSE8iOyB0aGVuCi0gIEVDSE89J3ByaW50ZiAlc1xuJwotZWxzZQotICAjIFVzZSB0aGlzIGZ1bmN0aW9uIGFzIGEgZmFsbGJhY2sgdGhhdCBhbHdheXMgd29ya3MuCi0gIGZ1bmNfZmFsbGJhY2tfZWNobyAoKQotICB7Ci0gICAgZXZhbCAnY2F0IDw8X0xURUNIT19FT0YKLSQxCi1fTFRFQ0hPX0VPRicKLSAgfQotICBFQ0hPPSdmdW5jX2ZhbGxiYWNrX2VjaG8nCi1maQotCi0jIGZ1bmNfZWNob19hbGwgYXJnLi4uCi0jIEludm9rZSAkRUNITyB3aXRoIGFsbCBhcmdzLCBzcGFjZS1zZXBhcmF0ZWQuCi1mdW5jX2VjaG9fYWxsICgpCi17Ci0gICAgJEVDSE8gIiIKLX0KLQotY2FzZSAiJEVDSE8iIGluCi0gIHByaW50ZiopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBwcmludGYiID4mNQotJGFzX2VjaG8gInByaW50ZiIgPiY2OyB9IDs7Ci0gIHByaW50KikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHByaW50IC1yIiA+JjUKLSRhc19lY2hvICJwcmludCAtciIgPiY2OyB9IDs7Ci0gICopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBjYXQiID4mNQotJGFzX2VjaG8gImNhdCIgPiY2OyB9IDs7Ci1lc2FjCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2dudV9sZDsgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgJENDLi4uICIgPiY2OyB9Ci0gIGNhc2UgJGhvc3QgaW4KLSAgKi0qLW1pbmd3KikKLSAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3Ci0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OwotICAqKQotICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKLSAgZXNhYwotICBjYXNlICRhY19wcm9nIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgW1xcL10qIHwgPzpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKLSAgICAgIGFjX3Byb2c9YCRFQ0hPICIkYWNfcHJvZyJ8ICRTRUQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgJEVDSE8gIiRhY19wcm9nIiB8ICRHUkVQICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YCRFQ0hPICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBub24tR05VIGxkLi4uICIgPiY2OyB9Ci1maQotaWYgdGVzdCAiJHtsdF9jdl9wYXRoX0xEK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgotICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSB2YXJpYW50cyBvZiBHTlUgbGQgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGNhc2UgYCIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgotICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotCTs7Ci0gICAgICAqKQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0JOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGx0X3NhdmVfaWZzIgotZWxzZQotICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmkKLWZpCi0KLUxEPSIkbHRfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMRCIgPiY1Ci0kYXNfZWNobyAiJExEIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotdGVzdCAteiAiJExEIiAmJiBhc19mbl9lcnJvciAibm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiICIkTElORU5PIiA1Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2x0X2N2X3Byb2dfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgotY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KLSpHTlUqIHwgKid3aXRoIEJGRCcqKQotICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKLSAgOzsKLSopCi0gIGx0X2N2X3Byb2dfZ251X2xkPW5vCi0gIDs7Ci1lc2FjCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2dudV9sZCIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X3Byb2dfZ251X2xkIiA+JjY7IH0KLXdpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAotCi0KLQotCi0KLQotCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotICBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ1BQK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAotICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCi0gICAgZG8KLSAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0KLWVsc2UKLSAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgotY29udGludWUKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotCi0gICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCi0gICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1lbHNlCi0gICMgUGFzc2VzIGJvdGggdGVzdHMuCi1hY19wcmVwcm9jX29rPToKLWJyZWFrCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLQotZG9uZQotIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgotICBicmVhawotZmkKLQotICAgIGRvbmUKLSAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCi0KLWZpCi0gIENQUD0kYWNfY3ZfcHJvZ19DUFAKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9JENQUAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1BQIiA+JjUKLSRhc19lY2hvICIkQ1BQIiA+JjY7IH0KLWFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0KLWVsc2UKLSAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgotY29udGludWUKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotCi0gICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCi0gICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1lbHNlCi0gICMgUGFzc2VzIGJvdGggdGVzdHMuCi1hY19wcmVwcm9jX29rPToKLWJyZWFrCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLQotZG9uZQotIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgotCi1lbHNlCi0gIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgIkMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iICIkTElORU5PIiA1OyB9Ci1maQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXNlZCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1zZWQ7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX1NFRCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRTRUQiOyB0aGVuCi0gIGFjX2N2X3Byb2dfU0VEPSIkU0VEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfU0VEPSIke2FjX3Rvb2xfcHJlZml4fXNlZCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1TRUQ9JGFjX2N2X3Byb2dfU0VECi1pZiB0ZXN0IC1uICIkU0VEIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFNFRCIgPiY1Ci0kYXNfZWNobyAiJFNFRCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfU0VEIjsgdGhlbgotICBhY19jdF9TRUQ9JFNFRAotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInNlZCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgc2VkOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9TRUQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfU0VEIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X1NFRD0iJGFjX2N0X1NFRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X1NFRD0ic2VkIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X1NFRD0kYWNfY3ZfcHJvZ19hY19jdF9TRUQKLWlmIHRlc3QgLW4gIiRhY19jdF9TRUQiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfU0VEIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfU0VEIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfU0VEIiA9IHg7IHRoZW4KLSAgICBTRUQ9IjoiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgU0VEPSRhY19jdF9TRUQKLSAgZmkKLWVsc2UKLSAgU0VEPSIkYWNfY3ZfcHJvZ19TRUQiCi1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzLi4uICIgPiY2OyB9Ci1MTl9TPSRhc19sbl9zCi1pZiB0ZXN0ICIkTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubywgdXNpbmcgJExOX1MiID4mNQotJGFzX2VjaG8gIm5vLCB1c2luZyAkTE5fUyIgPiY2OyB9Ci1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKS4uLiAiID4mNjsgfQotc2V0IHggJHtNQUtFLW1ha2V9Ci1hY19tYWtlPWAkYXNfZWNobyAiJDIiIHwgc2VkICdzLysvcC9nOyBzL1teYS16QS1aMC05X10vXy9nJ2AKLWlmIHsgYXNfdmFyPWFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldDsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKLVNIRUxMID0gL2Jpbi9zaAotYWxsOgotCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCi1fQUNFT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCi0gICpAQEAlJSU9Pyo9QEBAJSUlKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OwotICAqKQotICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKLWVzYWMKLXJtIC1mIGNvbmZ0ZXN0Lm1ha2UKLWZpCi1pZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLSAgU0VUX01BS0U9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi1jYXNlIGBwd2RgIGluCi0gICpcICogfCAqXAkqKQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogTGlidG9vbCBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCB3aGl0ZXNwYWNlIGluIFxgcHdkXGAiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogTGlidG9vbCBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCB3aGl0ZXNwYWNlIGluIFxgcHdkXGAiID4mMjt9IDs7Ci1lc2FjCi0KLQotCi1tYWNyb192ZXJzaW9uPScyLjIuMTAnCi1tYWNyb19yZXZpc2lvbj0nMS4zMTc1JwotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi1sdG1haW49IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBCYWNrc2xhc2hpZnkgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbgotIyBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1zZWRfcXVvdGVfc3Vic3Q9J3MvXChbImAkXFxdXCkvXFxcMS9nJwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KLWRvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFsiYFxcXVwpL1xcXDEvZycKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKLSMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KLWRlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaW5nbGUgcXVvdGUuCi1kZWxheV9zaW5nbGVfcXVvdGVfc3Vic3Q9J3MvJ1wnJy8nXCdcXFxcXFxcJ1wnJy9nJwotCi0jIFNlZCBzdWJzdGl0dXRpb24gdG8gYXZvaWQgYWNjaWRlbnRhbCBnbG9iYmluZyBpbiBldmFsZWQgZXhwcmVzc2lvbnMKLW5vX2dsb2Jfc3Vic3Q9J3MvXCovXFxcKi9nJwotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIgKG5tKSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyIChubSkuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7bHRfY3ZfcGF0aF9OTStzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGx0X2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgbHRfbm1fdG9fY2hlY2s9IiR7YWNfdG9vbF9wcmVmaXh9bm0iCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCIgJiYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KLSAgICBsdF9ubV90b19jaGVjaz0iJGx0X25tX3RvX2NoZWNrIG5tIgotICBmaQotICBmb3IgbHRfdG1wX25tIGluICRsdF9ubV90b19jaGVjazsgZG8KLSAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2Jpbi9lbGYgL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgICB0bXBfbm09IiRhY19kaXIvJGx0X3RtcF9ubSIKLSAgICAgIGlmIHRlc3QgLWYgIiR0bXBfbm0iIHx8IHRlc3QgLWYgIiR0bXBfbm0kYWNfZXhlZXh0IiA7IHRoZW4KLQkjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLQkjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotCSMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLQkjIFRydTY0J3Mgbm0gY29tcGxhaW5zIHRoYXQgL2Rldi9udWxsIGlzIGFuIGludmFsaWQgb2JqZWN0IGZpbGUKLQljYXNlIGAiJHRtcF9ubSIgLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KLQkqL2Rldi9udWxsKiB8IConSW52YWxpZCBmaWxlIG9yIG9iamVjdCB0eXBlJyopCi0JICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1CIgotCSAgYnJlYWsKLQkgIDs7Ci0JKikKLQkgIGNhc2UgYCIkdG1wX25tIiAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgotCSAgKi9kZXYvbnVsbCopCi0JICAgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLXAiCi0JICAgIGJyZWFrCi0JICAgIDs7Ci0JICAqKQotCSAgICBsdF9jdl9wYXRoX05NPSR7bHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCSAgICBjb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgZG9uZQotICA6ICR7bHRfY3ZfcGF0aF9OTT1ub30KLWZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wYXRoX05NIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfcGF0aF9OTSIgPiY2OyB9Ci1pZiB0ZXN0ICIkbHRfY3ZfcGF0aF9OTSIgIT0gIm5vIjsgdGhlbgotICBOTT0iJGx0X2N2X3BhdGhfTk0iCi1lbHNlCi0gICMgRGlkbid0IGZpbmQgYW55IEJTRCBjb21wYXRpYmxlIG5hbWUgbGlzdGVyLCBsb29rIGZvciBkdW1wYmluLgotICBpZiB0ZXN0IC1uICIkRFVNUEJJTiI7IHRoZW4gOgotICAgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBlbHNlCi0gICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICBmb3IgYWNfcHJvZyBpbiBkdW1wYmluICJsaW5rIC1kdW1wIgotICBkbwotICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19EVU1QQklOK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERVTVBCSU4iOyB0aGVuCi0gIGFjX2N2X3Byb2dfRFVNUEJJTj0iJERVTVBCSU4iICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19EVU1QQklOPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1EVU1QQklOPSRhY19jdl9wcm9nX0RVTVBCSU4KLWlmIHRlc3QgLW4gIiREVU1QQklOIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJERVTVBCSU4iID4mNQotJGFzX2VjaG8gIiREVU1QQklOIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgICB0ZXN0IC1uICIkRFVNUEJJTiIgJiYgYnJlYWsKLSAgZG9uZQotZmkKLWlmIHRlc3QgLXogIiREVU1QQklOIjsgdGhlbgotICBhY19jdF9EVU1QQklOPSREVU1QQklOCi0gIGZvciBhY19wcm9nIGluIGR1bXBiaW4gImxpbmsgLWR1bXAiCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfRFVNUEJJTitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9EVU1QQklOIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0RVTVBCSU49IiRhY19jdF9EVU1QQklOIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfRFVNUEJJTj0iJGFjX3Byb2ciCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfRFVNUEJJTj0kYWNfY3ZfcHJvZ19hY19jdF9EVU1QQklOCi1pZiB0ZXN0IC1uICIkYWNfY3RfRFVNUEJJTiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9EVU1QQklOIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfRFVNUEJJTiIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRhY19jdF9EVU1QQklOIiAmJiBicmVhawotZG9uZQotCi0gIGlmIHRlc3QgIngkYWNfY3RfRFVNUEJJTiIgPSB4OyB0aGVuCi0gICAgRFVNUEJJTj0iOiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBEVU1QQklOPSRhY19jdF9EVU1QQklOCi0gIGZpCi1maQotCi0gICAgY2FzZSBgJERVTVBCSU4gLXN5bWJvbHMgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KLSAgICAqQ09GRiopCi0gICAgICBEVU1QQklOPSIkRFVNUEJJTiAtc3ltYm9scyIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIERVTVBCSU49OgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0KLSAgaWYgdGVzdCAiJERVTVBCSU4iICE9ICI6IjsgdGhlbgotICAgIE5NPSIkRFVNUEJJTiIKLSAgZmkKLWZpCi10ZXN0IC16ICIkTk0iICYmIE5NPW5tCi0KLQotCi0KLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHRoZSBuYW1lIGxpc3RlciAoJE5NKSBpbnRlcmZhY2UiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgdGhlIG5hbWUgbGlzdGVyICgkTk0pIGludGVyZmFjZS4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHtsdF9jdl9ubV9pbnRlcmZhY2Urc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9jdl9ubV9pbnRlcmZhY2U9IkJTRCBubSIKLSAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkYWNfY29tcGlsZVwiIiA+JjUpCi0gIChldmFsICIkYWNfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkTk0gXFxcImNvbmZ0ZXN0LiRhY19vYmpleHRcXFwiXCIiID4mNSkKLSAgKGV2YWwgIiROTSBcImNvbmZ0ZXN0LiRhY19vYmpleHRcIiIgMj5jb25mdGVzdC5lcnIgPiBjb25mdGVzdC5vdXQpCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiBvdXRwdXRcIiIgPiY1KQotICBjYXQgY29uZnRlc3Qub3V0ID4mNQotICBpZiAkR1JFUCAnRXh0ZXJuYWwuKnNvbWVfdmFyaWFibGUnIGNvbmZ0ZXN0Lm91dCA+IC9kZXYvbnVsbDsgdGhlbgotICAgIGx0X2N2X25tX2ludGVyZmFjZT0iTVMgZHVtcGJpbiIKLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9ubV9pbnRlcmZhY2UiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9ubV9pbnRlcmZhY2UiID4mNjsgfQotCi0jIGZpbmQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7bHRfY3Zfc3lzX21heF9jbWRfbGVuK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgICBpPTAKLSAgdGVzdHN0cmluZz0iQUJDRCIKLQotICBjYXNlICRidWlsZF9vcyBpbgotICBtc2Rvc2RqZ3BwKikKLSAgICAjIE9uIERKR1BQLCB0aGlzIHRlc3QgY2FuIGJsb3cgdXAgcHJldHR5IGJhZGx5IGR1ZSB0byBwcm9ibGVtcyBpbiBsaWJjCi0gICAgIyAoYW55IHNpbmdsZSBhcmd1bWVudCBleGNlZWRpbmcgMjAwMCBieXRlcyBjYXVzZXMgYSBidWZmZXIgb3ZlcnJ1bgotICAgICMgZHVyaW5nIGdsb2IgZXhwYW5zaW9uKS4gIEV2ZW4gaWYgaXQgd2VyZSBmaXhlZCwgdGhlIHJlc3VsdCBvZiB0aGlzCi0gICAgIyBjaGVjayB3b3VsZCBiZSBsYXJnZXIgdGhhbiBpdCBzaG91bGQgYmUuCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEyMjg4OyAgICAjIDEySyBpcyBhYm91dCByaWdodAotICAgIDs7Ci0KLSAgZ251KikKLSAgICAjIFVuZGVyIEdOVSBIdXJkLCB0aGlzIHRlc3QgaXMgbm90IHJlcXVpcmVkIGJlY2F1c2UgdGhlcmUgaXMKLSAgICAjIG5vIGxpbWl0IHRvIHRoZSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAgICAjIExpYnRvb2wgd2lsbCBpbnRlcnByZXQgLTEgYXMgbm8gbGltaXQgd2hhdHNvZXZlcgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMTsKLSAgICA7OwotCi0gIGN5Z3dpbiogfCBtaW5ndyogfCBjZWdjYyopCi0gICAgIyBPbiBXaW45eC9NRSwgdGhpcyB0ZXN0IGJsb3dzIHVwIC0tIGl0IHN1Y2NlZWRzLCBidXQgdGFrZXMKLSAgICAjIGFib3V0IDUgbWludXRlcyBhcyB0aGUgdGVzdHN0cmluZyBncm93cyBleHBvbmVudGlhbGx5LgotICAgICMgV29yc2UsIHNpbmNlIDl4L01FIGFyZSBub3QgcHJlLWVtcHRpdmVseSBtdWx0aXRhc2tpbmcsCi0gICAgIyB5b3UgZW5kIHVwIHdpdGggYSAiZnJvemVuIiBjb21wdXRlciwgZXZlbiB0aG91Z2ggd2l0aCBwYXRpZW5jZQotICAgICMgdGhlIHRlc3QgZXZlbnR1YWxseSBzdWNjZWVkcyAod2l0aCBhIG1heCBsaW5lIGxlbmd0aCBvZiAyNTZrKS4KLSAgICAjIEluc3RlYWQsIGxldCdzIGp1c3QgcHVudDogdXNlIHRoZSBtaW5pbXVtIGxpbmVsZW5ndGggcmVwb3J0ZWQgYnkKLSAgICAjIGFsbCBvZiB0aGUgc3VwcG9ydGVkIHBsYXRmb3JtczogODE5MiAob24gTlQvMksvWFApLgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOwotICAgIDs7Ci0KLSAgbWludCopCi0gICAgIyBPbiBNaU5UIHRoaXMgY2FuIHRha2UgYSBsb25nIHRpbWUgYW5kIHJ1biBvdXQgb2YgbWVtb3J5LgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOwotICAgIDs7Ci0KLSAgYW1pZ2FvcyopCi0gICAgIyBPbiBBbWlnYU9TIHdpdGggcGRrc2gsIHRoaXMgdGVzdCB0YWtlcyBob3VycywgbGl0ZXJhbGx5LgotICAgICMgU28gd2UganVzdCBwdW50IGFuZCB1c2UgYSBtaW5pbXVtIGxpbmUgbGVuZ3RoIG9mIDgxOTIuCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7Ci0gICAgOzsKLQotICBuZXRic2QqIHwgZnJlZWJzZCogfCBvcGVuYnNkKiB8IGRhcndpbiogfCBkcmFnb25mbHkqKQotICAgICMgVGhpcyBoYXMgYmVlbiBhcm91bmQgc2luY2UgMzg2QlNELCBhdCBsZWFzdC4gIExpa2VseSBmdXJ0aGVyLgotICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY3RsOyB0aGVuCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKLSAgICBlbGlmIHRlc3QgLXggL3Vzci9zYmluL3N5c2N0bDsgdGhlbgotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvdXNyL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAotICAgIGVsc2UKLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj02NTUzNgkjIHVzYWJsZSBkZWZhdWx0IGZvciBhbGwgQlNEcwotICAgIGZpCi0gICAgIyBBbmQgYWRkIGEgc2FmZXR5IHpvbmUKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyA0YAotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCi0gICAgOzsKLQotICBpbnRlcml4KikKLSAgICAjIFdlIGtub3cgdGhlIHZhbHVlIDI2MjE0NCBhbmQgaGFyZGNvZGUgaXQgd2l0aCBhIHNhZmV0eSB6b25lIChsaWtlIEJTRCkKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTk2NjA4Ci0gICAgOzsKLQotICBvc2YqKQotICAgICMgRHIuIEhhbnMgRWtrZWhhcmQgUGxlc3NlciByZXBvcnRzIHNlZWluZyBhIGtlcm5lbCBwYW5pYyBydW5uaW5nIGNvbmZpZ3VyZQotICAgICMgZHVlIHRvIHRoaXMgdGVzdCB3aGVuIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXQgaXMgMSBvbiBUcnU2NC4gSXQgaXMgbm90Ci0gICAgIyBuaWNlIHRvIGNhdXNlIGtlcm5lbCBwYW5pY3Mgc28gbGV0cyBhdm9pZCB0aGUgbG9vcCBiZWxvdy4KLSAgICAjIEZpcnN0IHNldCBhIHJlYXNvbmFibGUgZGVmYXVsdC4KLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTYzODQKLSAgICAjCi0gICAgaWYgdGVzdCAteCAvc2Jpbi9zeXNjb25maWc7IHRoZW4KLSAgICAgIGNhc2UgYC9zYmluL3N5c2NvbmZpZyAtcSBwcm9jIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXRgIGluCi0gICAgICAgICoxKikgbHRfY3Zfc3lzX21heF9jbWRfbGVuPS0xIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICA7OwotICBzY28zLjJ2NSopCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEwMjQwMAotICAgIDs7Ci0gIHN5c3Y1KiB8IHNjbzV2NiogfCBzeXN2NC4ydXcyKikKLSAgICBrYXJnbWF4PWBncmVwIEFSR19NQVggL2V0Yy9jb25mL2NmLmQvc3R1bmUgMj4vZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJGthcmdtYXgiOyB0aGVuCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGVjaG8gJGthcmdtYXggfCBzZWQgJ3MvLipbCSBdLy8nYAotICAgIGVsc2UKLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0zMjc2OAotICAgIGZpCi0gICAgOzsKLSAgKikKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YChnZXRjb25mIEFSR19NQVgpIDI+IC9kZXYvbnVsbGAKLSAgICBpZiB0ZXN0IC1uICIkbHRfY3Zfc3lzX21heF9jbWRfbGVuIjsgdGhlbgotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCi0gICAgZWxzZQotICAgICAgIyBNYWtlIHRlc3RzdHJpbmcgYSBsaXR0bGUgYmlnZ2VyIGJlZm9yZSB3ZSBkbyBhbnl0aGluZyB3aXRoIGl0LgotICAgICAgIyBhIDFLIHN0cmluZyBzaG91bGQgYmUgYSByZWFzb25hYmxlIHN0YXJ0LgotICAgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDYgNyA4IDsgZG8KLSAgICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCi0gICAgICBkb25lCi0gICAgICBTSEVMTD0ke1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fQotICAgICAgIyBJZiB0ZXN0IGlzIG5vdCBhIHNoZWxsIGJ1aWx0LWluLCB3ZSdsbCBwcm9iYWJseSBlbmQgdXAgY29tcHV0aW5nIGEKLSAgICAgICMgbWF4aW11bSBsZW5ndGggdGhhdCBpcyBvbmx5IGhhbGYgb2YgdGhlIGFjdHVhbCBtYXhpbXVtIGxlbmd0aCwgYnV0Ci0gICAgICAjIHdlIGNhbid0IHRlbGwuCi0gICAgICB3aGlsZSB7IHRlc3QgIlgiYGZ1bmNfZmFsbGJhY2tfZWNobyAiJHRlc3RzdHJpbmckdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKLQkgICAgICAgICA9ICJYJHRlc3RzdHJpbmckdGVzdHN0cmluZyI7IH0gPi9kZXYvbnVsbCAyPiYxICYmCi0JICAgICAgdGVzdCAkaSAhPSAxNyAjIDEvMiBNQiBzaG91bGQgYmUgZW5vdWdoCi0gICAgICBkbwotICAgICAgICBpPWBleHByICRpICsgMWAKLSAgICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCi0gICAgICBkb25lCi0gICAgICAjIE9ubHkgY2hlY2sgdGhlIHN0cmluZyBsZW5ndGggb3V0c2lkZSB0aGUgbG9vcC4KLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAiWCR0ZXN0c3RyaW5nIiA6ICIuKiIgMj4mMWAKLSAgICAgIHRlc3RzdHJpbmc9Ci0gICAgICAjIEFkZCBhIHNpZ25pZmljYW50IHNhZmV0eSBmYWN0b3IgYmVjYXVzZSBDKysgY29tcGlsZXJzIGNhbiB0YWNrIG9uCi0gICAgICAjIG1hc3NpdmUgYW1vdW50cyBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZQotICAgICAgIyBsaW5rZXIuICBJdCBhcHBlYXJzIGFzIHRob3VnaCAxLzIgaXMgYSB1c2FibGUgdmFsdWUuCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyAyYAotICAgIGZpCi0gICAgOzsKLSAgZXNhYwotCi1maQotCi1pZiB0ZXN0IC1uICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIiA+JjUKLSRhc19lY2hvICIkbHRfY3Zfc3lzX21heF9jbWRfbGVuIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUiID4mNQotJGFzX2VjaG8gIm5vbmUiID4mNjsgfQotZmkKLW1heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KLQotCi0KLQotCi0KLTogJHtDUD0iY3AgLWYifQotOiAke01WPSJtdiAtZiJ9Ci06ICR7Uk09InJtIC1mIn0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBzb21lIFhTSSBjb25zdHJ1Y3RzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzIHNvbWUgWFNJIGNvbnN0cnVjdHMuLi4gIiA+JjY7IH0KLSMgVHJ5IHNvbWUgWFNJIGZlYXR1cmVzCi14c2lfc2hlbGw9bm8KLSggX2x0X2R1bW15PSJhL2IvYyIKLSAgdGVzdCAiJHtfbHRfZHVtbXkjIyovfSwke19sdF9kdW1teSUvKn0sIiR7X2x0X2R1bW15JSIkX2x0X2R1bW15In0sIFwKLSAgICAgID0gYyxhL2IsLCBcCi0gICAgJiYgZXZhbCAndGVzdCAkKCggMSArIDEgKSkgLWVxIDIgXAotICAgICYmIHRlc3QgIiR7I19sdF9kdW1teX0iIC1lcSA1JyApID4vZGV2L251bGwgMj4mMSBcCi0gICYmIHhzaV9zaGVsbD15ZXMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkeHNpX3NoZWxsIiA+JjUKLSRhc19lY2hvICIkeHNpX3NoZWxsIiA+JjY7IH0KLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzIFwiKz1cIiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBcIis9XCIuLi4gIiA+JjY7IH0KLWx0X3NoZWxsX2FwcGVuZD1ubwotKCBmb289YmFyOyBzZXQgZm9vIGJhejsgZXZhbCAiJDErPVwkMiIgJiYgdGVzdCAiJGZvbyIgPSBiYXJiYXogKSBcCi0gICAgPi9kZXYvbnVsbCAyPiYxIFwKLSAgJiYgbHRfc2hlbGxfYXBwZW5kPXllcwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9zaGVsbF9hcHBlbmQiID4mNQotJGFzX2VjaG8gIiRsdF9zaGVsbF9hcHBlbmQiID4mNjsgfQotCi0KLWlmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBsdF91bnNldD11bnNldAotZWxzZQotICBsdF91bnNldD1mYWxzZQotZmkKLQotCi0KLQotCi0jIHRlc3QgRUJDRElDIG9yIEFTQ0lJCi1jYXNlIGBlY2hvIFh8dHIgWCAnXDEwMSdgIGluCi0gQSkgIyBBU0NJSSBiYXNlZCBzeXN0ZW0KLSAgICAjIFxuIGlzIG5vdCBpbnRlcnByZXRlZCBjb3JyZWN0bHkgYnkgU29sYXJpcyA4IC91c3IvdWNiL3RyCi0gIGx0X1NQMk5MPSd0ciBcMDQwIFwwMTInCi0gIGx0X05MMlNQPSd0ciBcMDE1XDAxMiBcMDQwXDA0MCcKLSAgOzsKLSAqKSAjIEVCQ0RJQyBiYXNlZCBzeXN0ZW0KLSAgbHRfU1AyTkw9J3RyIFwxMDAgXG4nCi0gIGx0X05MMlNQPSd0ciBcclxuIFwxMDBcMTAwJwotICA7OwotZXNhYwotCi0KLQotCi0KLQotCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXMuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7bHRfY3ZfbGRfcmVsb2FkX2ZsYWcrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9jdl9sZF9yZWxvYWRfZmxhZz0nLXInCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9sZF9yZWxvYWRfZmxhZyIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X2xkX3JlbG9hZF9mbGFnIiA+JjY7IH0KLXJlbG9hZF9mbGFnPSRsdF9jdl9sZF9yZWxvYWRfZmxhZwotY2FzZSAkcmVsb2FkX2ZsYWcgaW4KLSIiIHwgIiAiKikgOzsKLSopIHJlbG9hZF9mbGFnPSIgJHJlbG9hZF9mbGFnIiA7OwotZXNhYwotcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotY2FzZSAkaG9zdF9vcyBpbgotICBkYXJ3aW4qKQotICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgICByZWxvYWRfY21kcz0nJExUQ0MgJExUQ0ZMQUdTIC1ub3N0ZGxpYiAke3dsfS1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi0gICAgZWxzZQotICAgICAgcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotICAgIGZpCi0gICAgOzsKLWVzYWMKLQotCi0KLQotCi0KLQotCi0KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9iamR1bXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0JKRFVNUCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRPQkpEVU1QIjsgdGhlbgotICBhY19jdl9wcm9nX09CSkRVTVA9IiRPQkpEVU1QIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfT0JKRFVNUD0iJHthY190b29sX3ByZWZpeH1vYmpkdW1wIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLU9CSkRVTVA9JGFjX2N2X3Byb2dfT0JKRFVNUAotaWYgdGVzdCAtbiAiJE9CSkRVTVAiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0JKRFVNUCIgPiY1Ci0kYXNfZWNobyAiJE9CSkRVTVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX09CSkRVTVAiOyB0aGVuCi0gIGFjX2N0X09CSkRVTVA9JE9CSkRVTVAKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvYmpkdW1wIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBvYmpkdW1wOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X09CSkRVTVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUD0iJGFjX2N0X09CSkRVTVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QPSJvYmpkdW1wIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X09CSkRVTVA9JGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUAotaWYgdGVzdCAtbiAiJGFjX2N0X09CSkRVTVAiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0JKRFVNUCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X09CSkRVTVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9PQkpEVU1QIiA9IHg7IHRoZW4KLSAgICBPQkpEVU1QPSJmYWxzZSIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBPQkpEVU1QPSRhY19jdF9PQkpEVU1QCi0gIGZpCi1lbHNlCi0gIE9CSkRVTVA9IiRhY19jdl9wcm9nX09CSkRVTVAiCi1maQotCi10ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCi0KLQotCi0KLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byByZWNvZ25pemUgZGVwZW5kZW50IGxpYnJhcmllcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcmVjb2duaXplIGRlcGVuZGVudCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7bHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE1BR0lDX0NNRCcKLWx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPQotbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J3Vua25vd24nCi0jIE5lZWQgdG8gc2V0IHRoZSBwcmVjZWRpbmcgdmFyaWFibGUgb24gYWxsIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQKLSMgaW50ZXJsaWJyYXJ5IGRlcGVuZGVuY2llcy4KLSMgJ25vbmUnIC0tIGRlcGVuZGVuY2llcyBub3Qgc3VwcG9ydGVkLgotIyBgdW5rbm93bicgLS0gc2FtZSBhcyBub25lLCBidXQgZG9jdW1lbnRzIHRoYXQgd2UgcmVhbGx5IGRvbid0IGtub3cuCi0jICdwYXNzX2FsbCcgLS0gYWxsIGRlcGVuZGVuY2llcyBwYXNzZWQgd2l0aCBubyBjaGVja3MuCi0jICd0ZXN0X2NvbXBpbGUnIC0tIGNoZWNrIGJ5IG1ha2luZyB0ZXN0IHByb2dyYW0uCi0jICdmaWxlX21hZ2ljIFtbcmVnZXhdXScgLS0gY2hlY2sgYnkgbG9va2luZyBmb3IgZmlsZXMgaW4gbGlicmFyeSBwYXRoCi0jIHdoaWNoIHJlc3BvbmRzIHRvIHRoZSAkZmlsZV9tYWdpY19jbWQgd2l0aCBhIGdpdmVuIGV4dGVuZGVkIHJlZ2V4LgotIyBJZiB5b3UgaGF2ZSBgZmlsZScgb3IgZXF1aXZhbGVudCBvbiB5b3VyIHN5c3RlbSBhbmQgeW91J3JlIG5vdCBzdXJlCi0jIHdoZXRoZXIgYHBhc3NfYWxsJyB3aWxsICphbHdheXMqIHdvcmssIHlvdSBwcm9iYWJseSB3YW50IHRoaXMgb25lLgotCi1jYXNlICRob3N0X29zIGluCi1haXhbNC05XSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWJlb3MqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1ic2RpWzQ1XSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKScKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCi0gIDs7Ci0KLWN5Z3dpbiopCi0gICMgZnVuY193aW4zMl9saWJpZCBpcyBhIHNoZWxsIGZ1bmN0aW9uIGRlZmluZWQgaW4gbHRtYWluLnNoCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJwotICA7OwotCi1taW5ndyogfCBwdzMyKikKLSAgIyBCYXNlIE1TWVMvTWluR1cgZG8gbm90IHByb3ZpZGUgdGhlICdmaWxlJyBjb21tYW5kIG5lZWRlZCBieQotICAjIGZ1bmNfd2luMzJfbGliaWQgc2hlbGwgZnVuY3Rpb24sIHNvIHVzZSBhIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJywKLSAgIyB1bmxlc3Mgd2UgZmluZCAnZmlsZScsIGZvciBleGFtcGxlIGJlY2F1c2Ugd2UgYXJlIGNyb3NzLWNvbXBpbGluZy4KLSAgIyBmdW5jX3dpbjMyX2xpYmlkIGFzc3VtZXMgQlNEIG5tLCBzbyBkaXNhbGxvdyBpdCBpZiB1c2luZyBNUyBkdW1wYmluLgotICBpZiAoIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIkJTRCBubSIgJiYgZmlsZSAvICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKLSAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKLSAgZWxzZQotICAgICMgS2VlcCB0aGlzIHBhdHRlcm4gaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4gZnVuY193aW4zMl9saWJpZC4KLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCAocGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT98cGUtYXJtLXdpbmNlfHBlLXg4Ni02NCknCi0gICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJwotICBmaQotICA7OwotCi1jZWdjYyopCi0gICMgdXNlIHRoZSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcuIFNlZSBtaW5ndyouCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlLWFybS0uKmxpdHRsZSguKmFyY2hpdGVjdHVyZTogYXJtKT8nCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotZnJlZWJzZCogfCBkcmFnb25mbHkqKQotICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KLSAgICBjYXNlICRob3N0X2NwdSBpbgotICAgIGkqODYgKQotICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KLSAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCi0gICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEfERyYWdvbkZseSkvaVszLTldODYgKGNvbXBhY3QgKT9kZW1hbmQgcGFnZWQgc2hhcmVkIGxpYnJhcnknCi0gICAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gICAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvLipgCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIGZpCi0gIDs7Ci0KLWdudSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWhhaWt1KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotaHB1eDEwLjIwKiB8IGhwdXgxMSopCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgaWE2NCopCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGLVswLTldWzAtOV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIElBNjQnCi0gICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvaHB1eDMyL2xpYmMuc28KLSAgICA7OwotICBocHBhKjY0KikKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEZbIC1dWzAtOV1bMC05XSkoLWJpdCk/KCBbTE1dU0IpPyBzaGFyZWQgb2JqZWN0KCBmaWxlKT9bLCAtXSogUEEtUklTQyBbMC05XVwuWzAtOV0nCi0gICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvcGEyMF82NC9saWJjLnNsCi0gICAgOzsKLSAgKikKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxQQS1SSVNDWzAtOV1cLlswLTldKSBzaGFyZWQgbGlicmFyeScKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJjLnNsCi0gICAgOzsKLSAgZXNhYwotICA7OwotCi1pbnRlcml4WzMtOV0qKQotICAjIFBJQyBjb2RlIGlzIGJyb2tlbiBvbiBJbnRlcml4IDMueCwgdGhhdCdzIHdoeSB8XC5hIG5vdCB8X3BpY1wuYSBoZXJlCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvfFwuYSkkJwotICA7OwotCi1pcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICBjYXNlICRMRCBpbgotICAqLTMyfCoiLTMyICIpIGxpYm1hZ2ljPTMyLWJpdDs7Ci0gICotbjMyfCoiLW4zMiAiKSBsaWJtYWdpYz1OMzI7OwotICAqLTY0fCoiLTY0ICIpIGxpYm1hZ2ljPTY0LWJpdDs7Ci0gICopIGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKLSAgZXNhYwotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi0jIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCi1saW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLW5ldGJzZCopCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xfcGljXC5hKSQnCi0gIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb3xfcGljXC5hKSQnCi0gIGZpCi0gIDs7Ci0KLW5ld29zNiopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChleGVjdXRhYmxlfGR5bmFtaWMgbGliKScKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJubHMuc28KLSAgOzsKLQotKm50byogfCAqcW54KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotb3BlbmJzZCopCi0gIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb1wuWzAtOV0rXC5bMC05XSt8XC5zb3xfcGljXC5hKSQnCi0gIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb1wuWzAtOV0rXC5bMC05XSt8X3BpY1wuYSkkJwotICBmaQotICA7OwotCi1vc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLXJkb3MqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1zb2xhcmlzKikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLXN5c3Y0IHwgc3lzdjQuMyopCi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gIG1vdG9yb2xhKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKSBNWzAtOV1bMC05XSogVmVyc2lvbiBbMC05XScKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvKmAKLSAgICA7OwotICBuY3IpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgICA7OwotICBzZXF1ZW50KQotICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIgKScKLSAgICA7OwotICBzbmkpCi0gICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiBkeW5hbWljIGxpYiIKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vbGliL2xpYmMuc28KLSAgICA7OwotICBzaWVtZW5zKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gICAgOzsKLSAgcGMpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXRwZiopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci1lc2FjCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QiID4mNjsgfQotZmlsZV9tYWdpY19jbWQ9JGx0X2N2X2ZpbGVfbWFnaWNfY21kCi1kZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QKLXRlc3QgLXogIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgJiYgZGVwbGlic19jaGVja19tZXRob2Q9dW5rbm93bgotCi0KLQotCi0KLQotCi0KLQotCi0KLQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXI7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0FSK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgotICBhY19jdl9wcm9nX0FSPSIkQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19BUj0iJHthY190b29sX3ByZWZpeH1hciIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1BUj0kYWNfY3ZfcHJvZ19BUgotaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEFSIiA+JjUKLSRhc19lY2hvICIkQVIiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0FSIjsgdGhlbgotICBhY19jdF9BUj0kQVIKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXI7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0FSK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0FSIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0FSPSIkYWNfY3RfQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9BUj0iYXIiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfQVI9JGFjX2N2X3Byb2dfYWNfY3RfQVIKLWlmIHRlc3QgLW4gIiRhY19jdF9BUiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9BUiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X0FSIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfQVIiID0geDsgdGhlbgotICAgIEFSPSJmYWxzZSIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBBUj0kYWNfY3RfQVIKLSAgZmkKLWVsc2UKLSAgQVI9IiRhY19jdl9wcm9nX0FSIgotZmkKLQotdGVzdCAteiAiJEFSIiAmJiBBUj1hcgotdGVzdCAteiAiJEFSX0ZMQUdTIiAmJiBBUl9GTEFHUz1jcnUKLQotCi0KLQotCi0KLQotCi0KLQotCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1zdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1zdHJpcDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfU1RSSVArc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfU1RSSVA9IiRTVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX1NUUklQPSIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLVNUUklQPSRhY19jdl9wcm9nX1NUUklQCi1pZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU1RSSVAiID4mNQotJGFzX2VjaG8gIiRTVFJJUCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfU1RSSVAiOyB0aGVuCi0gIGFjX2N0X1NUUklQPSRTVFJJUAotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBzdHJpcDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfU1RSSVArc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSJzdHJpcCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9TVFJJUD0kYWNfY3ZfcHJvZ19hY19jdF9TVFJJUAotaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1NUUklQIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfU1RSSVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9TVFJJUCIgPSB4OyB0aGVuCi0gICAgU1RSSVA9IjoiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgU1RSSVA9JGFjX2N0X1NUUklQCi0gIGZpCi1lbHNlCi0gIFNUUklQPSIkYWNfY3ZfcHJvZ19TVFJJUCIKLWZpCi0KLXRlc3QgLXogIiRTVFJJUCIgJiYgU1RSSVA9OgotCi0KLQotCi0KLQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLVJBTkxJQj0kYWNfY3ZfcHJvZ19SQU5MSUIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUkFOTElCIiA+JjUKLSRhc19lY2hvICIkUkFOTElCIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCi0gIGFjX2N0X1JBTkxJQj0kUkFOTElCCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSIkYWNfY3RfUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSJyYW5saWIiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfUkFOTElCPSRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQgotaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9SQU5MSUIiID4mNQotJGFzX2VjaG8gIiRhY19jdF9SQU5MSUIiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9SQU5MSUIiID0geDsgdGhlbgotICAgIFJBTkxJQj0iOiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBSQU5MSUI9JGFjX2N0X1JBTkxJQgotICBmaQotZWxzZQotICBSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWZpCi0KLXRlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06Ci0KLQotCi0KLQotCi0jIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KLW9sZF9hcmNoaXZlX2NtZHM9JyRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJwotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KLQotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBvcGVuYnNkKikKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIC10IFwkb2xkbGliIgotICAgIDs7Ci0gICopCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKLSAgICA7OwotICBlc2FjCi0gIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkb2xkbGliIgotZmkKLQotY2FzZSAkaG9zdF9vcyBpbgotICBkYXJ3aW4qKQotICAgIGxvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbj15ZXMgOzsKLSAgKikKLSAgICBsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb249bm8gOzsKLWVzYWMKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLSMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCi1MVENDPSR7TFRDQy0iJENDIn0KLQotIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgotTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9Ci0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1jb21waWxlcj0kQ0MKLQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQgZnJvbSAkY29tcGlsZXIgb2JqZWN0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3QuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7bHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZStzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLSMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyBbVGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KV0KLQotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotc3ltY29kZT0nW0JDREVHUlNUXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAkaG9zdF9vcyBpbgotYWl4KikKLSAgc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQotICBzeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgIHN5bWNvZGU9J1tBQkNERUdSU1RdJwotICBmaQotICA7OwotaXJpeCogfCBub25zdG9wdXgqKQotICBzeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotb3NmKikKLSAgc3ltY29kZT0nW0JDREVHUVJTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgc3ltY29kZT0nW0JEUlRdJwotICA7Owotc2NvMy4ydjUqKQotICBzeW1jb2RlPSdbRFRdJwotICA7Owotc3lzdjQuMnV3MiopCi0gIHN5bWNvZGU9J1tEVF0nCi0gIDs7Ci1zeXN2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQotICBzeW1jb2RlPSdbQUJEVF0nCi0gIDs7Ci1zeXN2NCkKLSAgc3ltY29kZT0nW0RGTlNUVV0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotY2FzZSBgJE5NIC1WIDI+JjFgIGluCi0qR05VKiB8ICond2l0aCBCRkQnKikKLSAgc3ltY29kZT0nW0FCQ0RHSVJTVFddJyA7OwotZXNhYwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uLgotIyBTb21lIHN5c3RlbXMgKGVzcC4gb24gaWE2NCkgbGluayBkYXRhIGFuZCBjb2RlIHN5bWJvbHMgZGlmZmVyZW50bHksCi0jIHNvIHVzZSB0aGlzIGdlbmVyYWwgYXBwcm9hY2guCi1sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBzeW1ib2wgbmFtZSBhbmQgc3ltYm9sIGFkZHJlc3MKLWx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwoW14gXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCciCi1sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4PSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwobGliW14gXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHtcImxpYlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyIKLQotIyBIYW5kbGUgQ1JMRiBpbiBtaW5ndyB0b29sIGNoYWluCi1vcHRfY3I9Ci1jYXNlICRidWlsZF9vcyBpbgotbWluZ3cqKQotICBvcHRfY3I9YCRFQ0hPICd4XHswLDFcfScgfCB0ciB4ICdcMDE1J2AgIyBvcHRpb24gY3IgaW4gcmVnZXhwCi0gIDs7Ci1lc2FjCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJzY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gICMgVHJhbnNmb3JtIHN5bWNvZGUsIHN5bXBhdCwgYW5kIHN5bXByZnggaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi0gIHN5bXhmcm09IlxcMSAkYWNfc3ltcHJmeFxcMiBcXDIiCi0KLSAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgotICBpZiB0ZXN0ICIkbHRfY3Zfbm1faW50ZXJmYWNlIiA9ICJNUyBkdW1wYmluIjsgdGhlbgotICAgICMgRmFrZSBpdCBmb3IgZHVtcGJpbiBhbmQgc2F5IFQgZm9yIGFueSBub24tc3RhdGljIGZ1bmN0aW9uCi0gICAgIyBhbmQgRCBmb3IgYW55IGdsb2JhbCB2YXJpYWJsZS4KLSAgICAjIEFsc28gZmluZCBDKysgYW5kIF9fZmFzdGNhbGwgc3ltYm9scyBmcm9tIE1TVkMrKywKLSAgICAjIHdoaWNoIHN0YXJ0IHdpdGggQCBvciA/LgotICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9IiRBV0sgJyJcCi0iICAgICB7bGFzdF9zZWN0aW9uPXNlY3Rpb247IHNlY3Rpb249XCQgM307IlwKLSIgICAgIC9TZWN0aW9uIGxlbmd0aCAuKiNyZWxvY3MuKihwaWNrIGFueSkve2hpZGVbbGFzdF9zZWN0aW9uXT0xfTsiXAotIiAgICAgXCQgMCF+L0V4dGVybmFsICpcfC97bmV4dH07IlwKLSIgICAgIC8gMCsgVU5ERUYgL3tuZXh0fTsgLyBVTkRFRiBcKFtefF1cKSooKS97bmV4dH07IlwKLSIgICAgIHtpZihoaWRlW3NlY3Rpb25dKSBuZXh0fTsiXAotIiAgICAge2Y9MH07IFwkIDB+L1woXCkuKlx8L3tmPTF9OyB7cHJpbnRmIGYgPyBcIlQgXCIgOiBcIkQgXCJ9OyJcCi0iICAgICB7c3BsaXQoXCQgMCwgYSwgL1x8fFxyLyk7IHNwbGl0KGFbMl0sIHMpfTsiXAotIiAgICAgc1sxXX4vXltAP10ve3ByaW50IHNbMV0sIHNbMV07IG5leHR9OyJcCi0iICAgICBzWzFdfnByZngge3NwbGl0KHNbMV0sdCxcIkBcIik7IHByaW50IHRbMV0sIHN1YnN0cih0WzFdLGxlbmd0aChwcmZ4KSl9IlwKLSIgICAgICcgcHJmeD1eJGFjX3N5bXByZngiCi0gIGVsc2UKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWwkgXVwoJHN5bWNvZGUkc3ltY29kZSpcKVsJIF1bCSBdKiRhY19zeW1wcmZ4JHN5bXBhdCRvcHRfY3IkLyRzeW14ZnJtL3AnIgotICBmaQotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBwaXBlX3dvcmtzPW5vCi0KLSAgcm0gLWYgY29uZnRlc3QqCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmModm9pZCk7Ci12b2lkIG5tX3Rlc3RfZnVuYyh2b2lkKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jKCk7cmV0dXJuKDApO30KLV9MVF9FT0YKLQotICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgbmxpc3Q9Y29uZnRlc3Qubm0KLSAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiIFw+ICRubGlzdFwiIjsgfSA+JjUKLSAgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiBcPiAkbmxpc3QpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgotCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgJEdSRVAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiAkR1JFUCAnIG5tX3Rlc3RfZnVuYyQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PF9MVF9FT0YgPiBjb25mdGVzdC4kYWNfZXh0Ci0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLV9MVF9FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgfCAkR1JFUCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQnCi0KLQkgIGNhdCA8PF9MVF9FT0YgPj4gY29uZnRlc3QuJGFjX2V4dAotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICB2b2lkICAgICAgICphZGRyZXNzOwotfQotbHRfX1BST0dSQU1fX0xUWF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXsKLSAgeyAiQFBST0dSQU1AIiwgKHZvaWQgKikgMCB9LAotX0xUX0VPRgotCSAgJFNFRCAicy9eJHN5bWNvZGUkc3ltY29kZSogXCguKlwpIFwoLipcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvIiA8ICIkbmxpc3QiIHwgJEdSRVAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0Ci0JICBjYXQgPDxcX0xUX0VPRiA+PiBjb25mdGVzdC4kYWNfZXh0Ci0gIHswLCAodm9pZCAqKSAwfQotfTsKLQotLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCi0jaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECi1zdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgewotICByZXR1cm4gbHRfX1BST0dSQU1fX0xUWF9wcmVsb2FkZWRfc3ltYm9sczsKLX0KLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotX0xUX0VPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAotCSAgbHRfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGx0X3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQotICAoZXZhbCAkYWNfbGluaykgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotCSAgICBwaXBlX3dvcmtzPXllcwotCSAgZmkKLQkgIExJQlM9IiRsdF9zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRsdF9zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JjUKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBmaQotICBybSAtcmYgY29uZnRlc3QqIGNvbmZ0c3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBicmVhawotICBlbHNlCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLQotZmkKLQotaWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQotZmkKLWlmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogZmFpbGVkIiA+JjUKLSRhc19lY2hvICJmYWlsZWQiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogb2siID4mNQotJGFzX2VjaG8gIm9rIiA+JjY7IH0KLWZpCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9saWJ0b29sX2xvY2s7Ci1maQotCi10ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcwotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAkaG9zdCBpbgotaWE2NC0qLWhwdXgqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQotICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KLSAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCi0gICAgICAqRUxGLTMyKikKLQlIUFVYX0lBNjRfTU9ERT0iMzIiCi0JOzsKLSAgICAgICpFTEYtNjQqKQotCUhQVVhfSUE2NF9NT0RFPSI2NCIKLQk7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICcjbGluZSAnJExJTkVOTycgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gICAgaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgotICAgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgotCSozMi1iaXQqKQotCSAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJic21pcCIKLQkgIDs7Ci0JKk4zMiopCi0JICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJtaXBuMzIiCi0JICA7OwotCSo2NC1iaXQqKQotCSAgTEQ9IiR7TEQtbGR9IC1tZWxmNjRibWlwIgotCTs7Ci0gICAgICBlc2FjCi0gICAgZWxzZQotICAgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgotCSozMi1iaXQqKQotCSAgTEQ9IiR7TEQtbGR9IC0zMiIKLQkgIDs7Ci0JKk4zMiopCi0JICBMRD0iJHtMRC1sZH0gLW4zMiIKLQkgIDs7Ci0JKjY0LWJpdCopCi0JICBMRD0iJHtMRC1sZH0gLTY0IgotCSAgOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLXg4Nl82NC0qa2ZyZWVic2QqLWdudXx4ODZfNjQtKmxpbnV4KnxwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KnwgXAotczM5MCotKmxpbnV4KnxzMzkwKi0qdHBmKnxzcGFyYyotKmxpbnV4KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgotICAgICAgKjMyLWJpdCopCi0JY2FzZSAkaG9zdCBpbgotCSAgeDg2XzY0LSprZnJlZWJzZCotZ251KQotCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX2kzODZfZmJzZCIKLQkgICAgOzsKLQkgIHg4Nl82NC0qbGludXgqKQotCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX2kzODYiCi0JICAgIDs7Ci0JICBwcGM2NC0qbGludXgqfHBvd2VycGM2NC0qbGludXgqKQotCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJwcGNsaW51eCIKLQkgICAgOzsKLQkgIHMzOTB4LSpsaW51eCopCi0JICAgIExEPSIke0xELWxkfSAtbSBlbGZfczM5MCIKLQkgICAgOzsKLQkgIHNwYXJjNjQtKmxpbnV4KikKLQkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMyX3NwYXJjIgotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgKjY0LWJpdCopCi0JY2FzZSAkaG9zdCBpbgotCSAgeDg2XzY0LSprZnJlZWJzZCotZ251KQotCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3g4Nl82NF9mYnNkIgotCSAgICA7OwotCSAgeDg2XzY0LSpsaW51eCopCi0JICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0IgotCSAgICA7OwotCSAgcHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCopCi0JICAgIExEPSIke0xELWxkfSAtbSBlbGY2NHBwYyIKLQkgICAgOzsKLQkgIHMzOTAqLSpsaW51eCp8czM5MCotKnRwZiopCi0JICAgIExEPSIke0xELWxkfSAtbSBlbGY2NF9zMzkwIgotCSAgICA7OwotCSAgc3BhcmMqLSpsaW51eCopCi0JICAgIExEPSIke0xELWxkfSAtbSBlbGY2NF9zcGFyYyIKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZi4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHtsdF9jdl9jY19uZWVkc19iZWxmK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi0gICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBsdF9jdl9jY19uZWVkc19iZWxmPXllcwotZWxzZQotICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgICAgYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9jY19uZWVkc19iZWxmIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgPiY2OyB9Ci0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci1zcGFyYyotKnNvbGFyaXMqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQotICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KLSAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCi0gICAgKjY0LWJpdCopCi0gICAgICBjYXNlICRsdF9jdl9wcm9nX2dudV9sZCBpbgotICAgICAgeWVzKikgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIiA7OwotICAgICAgKikKLQlpZiAke0xELWxkfSAtNjQgLXIgLW8gY29uZnRlc3QyLm8gY29uZnRlc3QubyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIExEPSIke0xELWxkfSAtNjQiCi0JZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLWVzYWMKLQotbmVlZF9sb2Nrcz0iJGVuYWJsZV9saWJ0b29sX2xvY2siCi0KLQotICBjYXNlICRob3N0X29zIGluCi0gICAgcmhhcHNvZHkqIHwgZGFyd2luKikKLSAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kc3ltdXRpbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kc3ltdXRpbDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfRFNZTVVUSUwrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRFNZTVVUSUwiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRFNZTVVUSUw9IiREU1lNVVRJTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0RTWU1VVElMPSIke2FjX3Rvb2xfcHJlZml4fWRzeW11dGlsIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLURTWU1VVElMPSRhY19jdl9wcm9nX0RTWU1VVElMCi1pZiB0ZXN0IC1uICIkRFNZTVVUSUwiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkRFNZTVVUSUwiID4mNQotJGFzX2VjaG8gIiREU1lNVVRJTCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRFNZTVVUSUwiOyB0aGVuCi0gIGFjX2N0X0RTWU1VVElMPSREU1lNVVRJTAotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRzeW11dGlsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBkc3ltdXRpbDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfRFNZTVVUSUwrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfRFNZTVVUSUwiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfRFNZTVVUSUw9IiRhY19jdF9EU1lNVVRJTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X0RTWU1VVElMPSJkc3ltdXRpbCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9EU1lNVVRJTD0kYWNfY3ZfcHJvZ19hY19jdF9EU1lNVVRJTAotaWYgdGVzdCAtbiAiJGFjX2N0X0RTWU1VVElMIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0RTWU1VVElMIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfRFNZTVVUSUwiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9EU1lNVVRJTCIgPSB4OyB0aGVuCi0gICAgRFNZTVVUSUw9IjoiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgRFNZTVVUSUw9JGFjX2N0X0RTWU1VVElMCi0gIGZpCi1lbHNlCi0gIERTWU1VVElMPSIkYWNfY3ZfcHJvZ19EU1lNVVRJTCIKLWZpCi0KLSAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1ubWVkaXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9bm1lZGl0OyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19OTUVESVQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTk1FRElUIjsgdGhlbgotICBhY19jdl9wcm9nX05NRURJVD0iJE5NRURJVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX05NRURJVD0iJHthY190b29sX3ByZWZpeH1ubWVkaXQiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotTk1FRElUPSRhY19jdl9wcm9nX05NRURJVAotaWYgdGVzdCAtbiAiJE5NRURJVCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICROTUVESVQiID4mNQotJGFzX2VjaG8gIiROTUVESVQiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX05NRURJVCI7IHRoZW4KLSAgYWNfY3RfTk1FRElUPSROTUVESVQKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJubWVkaXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG5tZWRpdDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfTk1FRElUK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X05NRURJVCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9OTUVESVQ9IiRhY19jdF9OTUVESVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9OTUVESVQ9Im5tZWRpdCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9OTUVESVQ9JGFjX2N2X3Byb2dfYWNfY3RfTk1FRElUCi1pZiB0ZXN0IC1uICIkYWNfY3RfTk1FRElUIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X05NRURJVCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X05NRURJVCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X05NRURJVCIgPSB4OyB0aGVuCi0gICAgTk1FRElUPSI6IgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIE5NRURJVD0kYWNfY3RfTk1FRElUCi0gIGZpCi1lbHNlCi0gIE5NRURJVD0iJGFjX2N2X3Byb2dfTk1FRElUIgotZmkKLQotICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWxpcG8iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9bGlwbzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfTElQTytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRMSVBPIjsgdGhlbgotICBhY19jdl9wcm9nX0xJUE89IiRMSVBPIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfTElQTz0iJHthY190b29sX3ByZWZpeH1saXBvIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUxJUE89JGFjX2N2X3Byb2dfTElQTwotaWYgdGVzdCAtbiAiJExJUE8iOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTElQTyIgPiY1Ci0kYXNfZWNobyAiJExJUE8iID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0xJUE8iOyB0aGVuCi0gIGFjX2N0X0xJUE89JExJUE8KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJsaXBvIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBsaXBvOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9MSVBPK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0xJUE8iOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfTElQTz0iJGFjX2N0X0xJUE8iICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9MSVBPPSJsaXBvIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X0xJUE89JGFjX2N2X3Byb2dfYWNfY3RfTElQTwotaWYgdGVzdCAtbiAiJGFjX2N0X0xJUE8iOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfTElQTyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X0xJUE8iID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9MSVBPIiA9IHg7IHRoZW4KLSAgICBMSVBPPSI6IgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIExJUE89JGFjX2N0X0xJUE8KLSAgZmkKLWVsc2UKLSAgTElQTz0iJGFjX2N2X3Byb2dfTElQTyIKLWZpCi0KLSAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vdG9vbDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfT1RPT0wrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkT1RPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfT1RPT0w9IiRPVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX09UT09MPSIke2FjX3Rvb2xfcHJlZml4fW90b29sIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLU9UT09MPSRhY19jdl9wcm9nX09UT09MCi1pZiB0ZXN0IC1uICIkT1RPT0wiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT1RPT0wiID4mNQotJGFzX2VjaG8gIiRPVE9PTCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT1RPT0wiOyB0aGVuCi0gIGFjX2N0X09UT09MPSRPVE9PTAotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm90b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBvdG9vbDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfT1RPT0wrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfT1RPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfT1RPT0w9IiRhY19jdF9PVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X09UT09MPSJvdG9vbCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9PVE9PTD0kYWNfY3ZfcHJvZ19hY19jdF9PVE9PTAotaWYgdGVzdCAtbiAiJGFjX2N0X09UT09MIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09UT09MIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfT1RPT0wiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9PVE9PTCIgPSB4OyB0aGVuCi0gICAgT1RPT0w9IjoiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgT1RPT0w9JGFjX2N0X09UT09MCi0gIGZpCi1lbHNlCi0gIE9UT09MPSIkYWNfY3ZfcHJvZ19PVE9PTCIKLWZpCi0KLSAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vdG9vbDY0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW90b29sNjQ7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX09UT09MNjQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkT1RPT0w2NCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19PVE9PTDY0PSIkT1RPT0w2NCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX09UT09MNjQ9IiR7YWNfdG9vbF9wcmVmaXh9b3Rvb2w2NCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1PVE9PTDY0PSRhY19jdl9wcm9nX09UT09MNjQKLWlmIHRlc3QgLW4gIiRPVE9PTDY0IjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9UT09MNjQiID4mNQotJGFzX2VjaG8gIiRPVE9PTDY0IiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PVE9PTDY0IjsgdGhlbgotICBhY19jdF9PVE9PTDY0PSRPVE9PTDY0Ci0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib3Rvb2w2NCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgb3Rvb2w2NDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfT1RPT0w2NCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9PVE9PTDY0IjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X09UT09MNjQ9IiRhY19jdF9PVE9PTDY0IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfT1RPT0w2ND0ib3Rvb2w2NCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9PVE9PTDY0PSRhY19jdl9wcm9nX2FjX2N0X09UT09MNjQKLWlmIHRlc3QgLW4gIiRhY19jdF9PVE9PTDY0IjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09UT09MNjQiID4mNQotJGFzX2VjaG8gIiRhY19jdF9PVE9PTDY0IiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfT1RPT0w2NCIgPSB4OyB0aGVuCi0gICAgT1RPT0w2ND0iOiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBPVE9PTDY0PSRhY19jdF9PVE9PTDY0Ci0gIGZpCi1lbHNlCi0gIE9UT09MNjQ9IiRhY19jdl9wcm9nX09UT09MNjQiCi1maQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIC1zaW5nbGVfbW9kdWxlIGxpbmtlciBmbGFnIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAtc2luZ2xlX21vZHVsZSBsaW5rZXIgZmxhZy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHtsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD1ubwotICAgICAgaWYgdGVzdCAteiAiJHtMVF9NVUxUSV9NT0RVTEV9IjsgdGhlbgotCSMgQnkgZGVmYXVsdCB3ZSB3aWxsIGFkZCB0aGUgLXNpbmdsZV9tb2R1bGUgZmxhZy4gWW91IGNhbiBvdmVycmlkZQotCSMgYnkgZWl0aGVyIHNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIExUX01VTFRJX01PRFVMRQotCSMgbm9uLWVtcHR5IGF0IGNvbmZpZ3VyZSB0aW1lLCBvciBieSBhZGRpbmcgLW11bHRpX21vZHVsZSB0byB0aGUKLQkjIGxpbmsgZmxhZ3MuCi0Jcm0gLXJmIGxpYmNvbmZ0ZXN0LmR5bGliKgotCWVjaG8gImludCBmb28odm9pZCl7cmV0dXJuIDE7fSIgPiBjb25mdGVzdC5jCi0JZWNobyAiJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGxpYmNvbmZ0ZXN0LmR5bGliIFwKLS1keW5hbWljbGliIC1XbCwtc2luZ2xlX21vZHVsZSBjb25mdGVzdC5jIiA+JjUKLQkkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAotCSAgLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMgMj5jb25mdGVzdC5lcnIKLSAgICAgICAgX2x0X3Jlc3VsdD0kPwotCWlmIHRlc3QgLWYgbGliY29uZnRlc3QuZHlsaWIgJiYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyciAmJiB0ZXN0ICRfbHRfcmVzdWx0ID0gMDsgdGhlbgotCSAgbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKLQllbHNlCi0JICBjYXQgY29uZnRlc3QuZXJyID4mNQotCWZpCi0Jcm0gLXJmIGxpYmNvbmZ0ZXN0LmR5bGliKgotCXJtIC1mIGNvbmZ0ZXN0LioKLSAgICAgIGZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPiY2OyB9Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBsaW5rZXIgZmxhZyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBsaW5rZXIgZmxhZy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9bm8KLSAgICAgIHNhdmVfTERGTEFHUz0kTERGTEFHUwotICAgICAgZWNobyAiX21haW4iID4gY29uZnRlc3Quc3ltCi0gICAgICBMREZMQUdTPSIkTERGTEFHUyAtV2wsLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCxjb25mdGVzdC5zeW0iCi0gICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PXllcwotZWxzZQotICBsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotCUxERkxBR1M9IiRzYXZlX0xERkxBR1MiCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdCIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdCIgPiY2OyB9Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgLWZvcmNlX2xvYWQgbGlua2VyIGZsYWciID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIC1mb3JjZV9sb2FkIGxpbmtlciBmbGFnLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2x0X2N2X2xkX2ZvcmNlX2xvYWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9jdl9sZF9mb3JjZV9sb2FkPW5vCi0gICAgICBjYXQgPiBjb25mdGVzdC5jIDw8IF9MVF9FT0YKLWludCBmb3JjZWRfbG9hZGVkKCkgeyByZXR1cm4gMjt9Ci1fTFRfRU9GCi0gICAgICBlY2hvICIkTFRDQyAkTFRDRkxBR1MgLWMgLW8gY29uZnRlc3QubyBjb25mdGVzdC5jIiA+JjUKLSAgICAgICRMVENDICRMVENGTEFHUyAtYyAtbyBjb25mdGVzdC5vIGNvbmZ0ZXN0LmMgMj4mNQotICAgICAgZWNobyAiJEFSIGNydSBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0Lm8iID4mNQotICAgICAgJEFSIGNydSBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0Lm8gMj4mNQotICAgICAgZWNobyAiJFJBTkxJQiBsaWJjb25mdGVzdC5hIiA+JjUKLSAgICAgICRSQU5MSUIgbGliY29uZnRlc3QuYSAyPiY1Ci0gICAgICBjYXQgPiBjb25mdGVzdC5jIDw8IF9MVF9FT0YKLWludCBtYWluKCkgeyByZXR1cm4gMDt9Ci1fTFRfRU9GCi0gICAgICBlY2hvICIkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAtV2wsLWZvcmNlX2xvYWQsLi9saWJjb25mdGVzdC5hIiA+JjUKLSAgICAgICRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jIC1XbCwtZm9yY2VfbG9hZCwuL2xpYmNvbmZ0ZXN0LmEgMj5jb25mdGVzdC5lcnIKLSAgICAgIF9sdF9yZXN1bHQ9JD8KLSAgICAgIGlmIHRlc3QgLWYgY29uZnRlc3QgJiYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyciAmJiB0ZXN0ICRfbHRfcmVzdWx0ID0gMCAmJiAkR1JFUCBmb3JjZWRfbG9hZCBjb25mdGVzdCAyPiYxID4vZGV2L251bGw7IHRoZW4KLQlsdF9jdl9sZF9mb3JjZV9sb2FkPXllcwotICAgICAgZWxzZQotCWNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gICAgICBmaQotICAgICAgICBybSAtZiBjb25mdGVzdC5lcnIgbGliY29uZnRlc3QuYSBjb25mdGVzdCBjb25mdGVzdC5jCi0gICAgICAgIHJtIC1yZiBjb25mdGVzdC5kU1lNCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9sZF9mb3JjZV9sb2FkIiA+JjY7IH0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bMDEyXSkKLSAgICAgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKLSAgICBkYXJ3aW4xLiopCi0gICAgICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7Ci0gICAgZGFyd2luKikgIyBkYXJ3aW4gNS54IG9uCi0gICAgICAjIGlmIHJ1bm5pbmcgb24gMTAuNSBvciBsYXRlciwgdGhlIGRlcGxveW1lbnQgdGFyZ2V0IGRlZmF1bHRzCi0gICAgICAjIHRvIHRoZSBPUyB2ZXJzaW9uLCBpZiBvbiB4ODYsIGFuZCAxMC40LCB0aGUgZGVwbG95bWVudAotICAgICAgIyB0YXJnZXQgZGVmYXVsdHMgdG8gMTAuNC4gRG9uJ3QgeW91IGxvdmUgaXQ/Ci0gICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULTEwLjB9LCRob3N0IGluCi0JMTAuMCwqODYqLWRhcndpbjgqfDEwLjAsKi1kYXJ3aW5bOTFdKikKLQkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcgOzsKLQkxMC5bMDEyXSopCi0JICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7Ci0JMTAuKikKLQkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcgOzsKLSAgICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0gICAgaWYgdGVzdCAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gInllcyI7IHRoZW4KLSAgICAgIF9sdF9kYXJfc2luZ2xlX21vZD0nJHNpbmdsZV9tb2R1bGUnCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBfbHRfZGFyX2V4cG9ydF9zeW1zPScgJHt3bH0tZXhwb3J0ZWRfc3ltYm9sc19saXN0LCRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0nCi0gICAgZWxzZQotICAgICAgX2x0X2Rhcl9leHBvcnRfc3ltcz0nfiROTUVESVQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkRFNZTVVUSUwiICE9ICI6IiAmJiB0ZXN0ICIkbHRfY3ZfbGRfZm9yY2VfbG9hZCIgPSAibm8iOyB0aGVuCi0gICAgICBfbHRfZHN5bXV0aWw9J34kRFNZTVVUSUwgJGxpYiB8fCA6JwotICAgIGVsc2UKLSAgICAgIF9sdF9kc3ltdXRpbD0KLSAgICBmaQotICAgIDs7Ci0gIGVzYWMKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zdGRjK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0cmluZy5oPgotCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0KLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0KLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIDoKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCi0jIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZWxzZQotIyBkZWZpbmUgSVNMT1dFUihjKSBcCi0JCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCi0JCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAotCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQotIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKLSNlbmRpZgotCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50Ci1tYWluICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQotCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQotICAgICAgcmV0dXJuIDI7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLQotZWxzZQotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLWZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIFNURENfSEVBREVSUyAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KLWZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAotCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKLWRvIDoKLSAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSIKLWV2YWwgYXNfdmFsPVwkJGFzX2FjX0hlYWRlcgotICAgaWYgdGVzdCAieCRhc192YWwiID0geCIieWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLQotZG9uZQotCi0KLWZvciBhY19oZWFkZXIgaW4gZGxmY24uaAotZG8gOgotICBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAiZGxmY24uaCIgImFjX2N2X2hlYWRlcl9kbGZjbl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geCIieWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0RMRkNOX0ggMQotX0FDRU9GCi0KLWZpCi0KLWRvbmUKLQotCi0KLQotCi0jIFNldCBvcHRpb25zCi1lbmFibGVfd2luMzJfZGxsPXllcwotCi1jYXNlICRob3N0IGluCi0qLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotY2VnY2MqKQotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hczsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQVMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0FTPSIke2FjX3Rvb2xfcHJlZml4fWFzIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUFTPSRhY19jdl9wcm9nX0FTCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVMiID4mNQotJGFzX2VjaG8gIiRBUyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiOyB0aGVuCi0gIGFjX2N0X0FTPSRBUwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhczsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQVMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQVM9IiRhY19jdF9BUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X0FTPSJhcyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9BUz0kYWNfY3ZfcHJvZ19hY19jdF9BUwotaWYgdGVzdCAtbiAiJGFjX2N0X0FTIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0FTIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfQVMiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9BUyIgPSB4OyB0aGVuCi0gICAgQVM9ImZhbHNlIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIEFTPSRhY19jdF9BUwotICBmaQotZWxzZQotICBBUz0iJGFjX2N2X3Byb2dfQVMiCi1maQotCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfRExMVE9PTCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iJHthY190b29sX3ByZWZpeH1kbGx0b29sIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLURMTFRPT0w9JGFjX2N2X3Byb2dfRExMVE9PTAotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkRExMVE9PTCIgPiY1Ci0kYXNfZWNobyAiJERMTFRPT0wiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiOyB0aGVuCi0gIGFjX2N0X0RMTFRPT0w9JERMTFRPT0wKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBkbGx0b29sOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9ETExUT09MK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0RMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfRExMVE9PTD0iJGFjX2N0X0RMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MPSJkbGx0b29sIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X0RMTFRPT0w9JGFjX2N2X3Byb2dfYWNfY3RfRExMVE9PTAotaWYgdGVzdCAtbiAiJGFjX2N0X0RMTFRPT0wiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfRExMVE9PTCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X0RMTFRPT0wiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9ETExUT09MIiA9IHg7IHRoZW4KLSAgICBETExUT09MPSJmYWxzZSIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBETExUT09MPSRhY19jdF9ETExUT09MCi0gIGZpCi1lbHNlCi0gIERMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1maQotCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9iamR1bXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0JKRFVNUCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRPQkpEVU1QIjsgdGhlbgotICBhY19jdl9wcm9nX09CSkRVTVA9IiRPQkpEVU1QIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfT0JKRFVNUD0iJHthY190b29sX3ByZWZpeH1vYmpkdW1wIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLU9CSkRVTVA9JGFjX2N2X3Byb2dfT0JKRFVNUAotaWYgdGVzdCAtbiAiJE9CSkRVTVAiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0JKRFVNUCIgPiY1Ci0kYXNfZWNobyAiJE9CSkRVTVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX09CSkRVTVAiOyB0aGVuCi0gIGFjX2N0X09CSkRVTVA9JE9CSkRVTVAKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvYmpkdW1wIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBvYmpkdW1wOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X09CSkRVTVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUD0iJGFjX2N0X09CSkRVTVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QPSJvYmpkdW1wIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X09CSkRVTVA9JGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUAotaWYgdGVzdCAtbiAiJGFjX2N0X09CSkRVTVAiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0JKRFVNUCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X09CSkRVTVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9PQkpEVU1QIiA9IHg7IHRoZW4KLSAgICBPQkpEVU1QPSJmYWxzZSIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBPQkpEVU1QPSRhY19jdF9PQkpEVU1QCi0gIGZpCi1lbHNlCi0gIE9CSkRVTVA9IiRhY19jdl9wcm9nX09CSkRVTVAiCi1maQotCi0gIDs7Ci1lc2FjCi0KLXRlc3QgLXogIiRBUyIgJiYgQVM9YXMKLQotCi0KLQotCi10ZXN0IC16ICIkRExMVE9PTCIgJiYgRExMVE9PTD1kbGx0b29sCi0KLQotCi0KLQotdGVzdCAteiAiJE9CSkRVTVAiICYmIE9CSkRVTVA9b2JqZHVtcAotCi0KLQotCi0KLQotCi0gICAgICAgIGVuYWJsZV9kbG9wZW49bm8KLQotCi0KLSAgICAgICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfc2hhcmVkOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQotICAgIGNhc2UgJGVuYWJsZXZhbCBpbgotICAgIHllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLSAgICBubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotICAgICopCi0gICAgICBlbmFibGVfc2hhcmVkPW5vCi0gICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKLSAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLQlJRlM9IiRsdF9zYXZlX2lmcyIKLQlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotCSAgZW5hYmxlX3NoYXJlZD15ZXMKLQlmaQotICAgICAgZG9uZQotICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgICA7OwotICAgIGVzYWMKLWVsc2UKLSAgZW5hYmxlX3NoYXJlZD15ZXMKLWZpCi0KLQotCi0KLQotCi0KLQotCi0gICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfc3RhdGljOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQotICAgIGNhc2UgJGVuYWJsZXZhbCBpbgotICAgIHllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLSAgICBubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotICAgICopCi0gICAgIGVuYWJsZV9zdGF0aWM9bm8KLSAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgotICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotCUlGUz0iJGx0X3NhdmVfaWZzIgotCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0JICBlbmFibGVfc3RhdGljPXllcwotCWZpCi0gICAgICBkb25lCi0gICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICAgIDs7Ci0gICAgZXNhYwotZWxzZQotICBlbmFibGVfc3RhdGljPXllcwotZmkKLQotCi0KLQotCi0KLQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1waWMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3BpYytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfcGljOyBwaWNfbW9kZT0iJHdpdGh2YWwiCi1lbHNlCi0gIHBpY19tb2RlPWRlZmF1bHQKLWZpCi0KLQotdGVzdCAteiAiJHBpY19tb2RlIiAmJiBwaWNfbW9kZT1kZWZhdWx0Ci0KLQotCi0KLQotCi0KLSAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9mYXN0X2luc3RhbGw7IHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci0gICAgY2FzZSAkZW5hYmxldmFsIGluCi0gICAgeWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7OwotICAgIG5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0gICAgKikKLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLSAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgotICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotCUlGUz0iJGx0X3NhdmVfaWZzIgotCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0JICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotCWZpCi0gICAgICBkb25lCi0gICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICAgIDs7Ci0gICAgZXNhYwotZWxzZQotICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotZmkKLQotCi0KLQotCi0KLQotCi0KLQotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRsdG1haW4iCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi10ZXN0IC16ICIkTE5fUyIgJiYgTE5fUz0ibG4gLXMiCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KLSAgIHNldG9wdCBOT19HTE9CX1NVQlNUCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBvYmpkaXIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG9iamRpci4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHtsdF9jdl9vYmpkaXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBybSAtZiAubGlicyAyPi9kZXYvbnVsbAotbWtkaXIgLmxpYnMgMj4vZGV2L251bGwKLWlmIHRlc3QgLWQgLmxpYnM7IHRoZW4KLSAgbHRfY3Zfb2JqZGlyPS5saWJzCi1lbHNlCi0gICMgTVMtRE9TIGRvZXMgbm90IGFsbG93IGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBkb3QuCi0gIGx0X2N2X29iamRpcj1fbGlicwotZmkKLXJtZGlyIC5saWJzIDI+L2Rldi9udWxsCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9vYmpkaXIiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9vYmpkaXIiID4mNjsgfQotb2JqZGlyPSRsdF9jdl9vYmpkaXIKLQotCi0KLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIExUX09CSkRJUiAiJGx0X2N2X29iamRpci8iCi1fQUNFT0YKLQotCi0KLQotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQotICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotICBpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KLSAgICBDT0xMRUNUX05BTUVTPQotICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLSMgR2xvYmFsIHZhcmlhYmxlczoKLW9maWxlPWxpYnRvb2wKLWNhbl9idWlsZF9zaGFyZWQ9eWVzCi0KLSMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNU1ZDLAotIyB3aGljaCBuZWVkcyAnLmxpYicpLgotbGliZXh0PWEKLQotd2l0aF9nbnVfbGQ9IiRsdF9jdl9wcm9nX2dudV9sZCIKLQotb2xkX0NDPSIkQ0MiCi1vbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgotCi0jIFNldCBzYW5lIGRlZmF1bHRzIGZvciB2YXJpb3VzIHZhcmlhYmxlcwotdGVzdCAteiAiJENDIiAmJiBDQz1jYwotdGVzdCAteiAiJExUQ0MiICYmIExUQ0M9JENDCi10ZXN0IC16ICIkTFRDRkxBR1MiICYmIExUQ0ZMQUdTPSRDRkxBR1MKLXRlc3QgLXogIiRMRCIgJiYgTEQ9bGQKLXRlc3QgLXogIiRhY19vYmpleHQiICYmIGFjX29iamV4dD1vCi0KLWZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbwotICBjYXNlICRjY190ZW1wIGluCi0gICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OwotICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7Ci0gICAgXC0qKSA7OwotICAgICopIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotY2NfYmFzZW5hbWU9YCRFQ0hPICIkY2NfdGVtcCIgfCAkU0VEICJzJS4qLyUlOyBzJV4kaG9zdF9hbGlhcy0lJSJgCi0KLQotIyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGZvciBmaWxlLCBpZiB0aGUgY2hlY2sgbWV0aG9kIHJlcXVpcmVzIGl0Ci10ZXN0IC16ICIkTUFHSUNfQ01EIiAmJiBNQUdJQ19DTUQ9ZmlsZQotY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLWZpbGVfbWFnaWMqKQotICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJHthY190b29sX3ByZWZpeH1maWxlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAke2FjX3Rvb2xfcHJlZml4fWZpbGUuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRNQUdJQ19DTUQgaW4KLVtcXC8qXSB8ICA/OltcXC9dKikKLSAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotKikKLSAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotICBhY19kdW1teT0iL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJHthY190b29sX3ByZWZpeH1maWxlOyB0aGVuCi0gICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci8ke2FjX3Rvb2xfcHJlZml4fWZpbGUiCi0gICAgICBpZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiOyB0aGVuCi0JY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLQkiZmlsZV9tYWdpYyAiKikKLQkgIGZpbGVfbWFnaWNfcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiZmlsZV9tYWdpYyBcKC4qXCkiYAotCSAgTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCi0JICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8Ci0JICAgICRFR1JFUCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgY2F0IDw8X0xUX0VPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiB0aGUgY29tbWFuZCBsaWJ0b29sIHVzZXMgdG8gZGV0ZWN0IHNoYXJlZCBsaWJyYXJpZXMsCi0qKiogJGZpbGVfbWFnaWNfY21kLCBwcm9kdWNlcyBvdXRwdXQgdGhhdCBsaWJ0b29sIGNhbm5vdCByZWNvZ25pemUuCi0qKiogVGhlIHJlc3VsdCBpcyB0aGF0IGxpYnRvb2wgbWF5IGZhaWwgdG8gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJpZXMKLSoqKiBhcyBzdWNoLiAgVGhpcyB3aWxsIGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMgdGhhdAotKioqIGRlcGVuZCBvbiBzaGFyZWQgbGlicmFyaWVzLCBidXQgcHJvZ3JhbXMgbGlua2VkIHdpdGggc3VjaCBsaWJ0b29sCi0qKiogbGlicmFyaWVzIHdpbGwgd29yayByZWdhcmRsZXNzIG9mIHRoaXMgcHJvYmxlbS4gIE5ldmVydGhlbGVzcywgeW91Ci0qKiogbWF5IHdhbnQgdG8gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHlvdXIgc3lzdGVtIG1hbmFnZXIgYW5kL29yIHRvCi0qKiogYnVnLWxpYnRvb2xAZ251Lm9yZwotCi1fTFRfRU9GCi0JICBmaSA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gIE1BR0lDX0NNRD0iJGx0X3NhdmVfTUFHSUNfQ01EIgotICA7OwotZXNhYwotZmkKLQotTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCi1pZiB0ZXN0IC1uICIkTUFHSUNfQ01EIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1BR0lDX0NNRCIgPiY1Ci0kYXNfZWNobyAiJE1BR0lDX0NNRCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0KLQotCi1pZiB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBmaWxlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBmaWxlLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2x0X2N2X3BhdGhfTUFHSUNfQ01EK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2FzZSAkTUFHSUNfQ01EIGluCi1bXFwvKl0gfCAgPzpbXFwvXSopCi0gIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSopCi0gIGx0X3NhdmVfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIgotICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgYWNfZHVtbXk9Ii91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL2ZpbGU7IHRoZW4KLSAgICAgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkYWNfZGlyL2ZpbGUiCi0gICAgICBpZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiOyB0aGVuCi0JY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLQkiZmlsZV9tYWdpYyAiKikKLQkgIGZpbGVfbWFnaWNfcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiZmlsZV9tYWdpYyBcKC4qXCkiYAotCSAgTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCi0JICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8Ci0JICAgICRFR1JFUCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgY2F0IDw8X0xUX0VPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiB0aGUgY29tbWFuZCBsaWJ0b29sIHVzZXMgdG8gZGV0ZWN0IHNoYXJlZCBsaWJyYXJpZXMsCi0qKiogJGZpbGVfbWFnaWNfY21kLCBwcm9kdWNlcyBvdXRwdXQgdGhhdCBsaWJ0b29sIGNhbm5vdCByZWNvZ25pemUuCi0qKiogVGhlIHJlc3VsdCBpcyB0aGF0IGxpYnRvb2wgbWF5IGZhaWwgdG8gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJpZXMKLSoqKiBhcyBzdWNoLiAgVGhpcyB3aWxsIGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMgdGhhdAotKioqIGRlcGVuZCBvbiBzaGFyZWQgbGlicmFyaWVzLCBidXQgcHJvZ3JhbXMgbGlua2VkIHdpdGggc3VjaCBsaWJ0b29sCi0qKiogbGlicmFyaWVzIHdpbGwgd29yayByZWdhcmRsZXNzIG9mIHRoaXMgcHJvYmxlbS4gIE5ldmVydGhlbGVzcywgeW91Ci0qKiogbWF5IHdhbnQgdG8gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHlvdXIgc3lzdGVtIG1hbmFnZXIgYW5kL29yIHRvCi0qKiogYnVnLWxpYnRvb2xAZ251Lm9yZwotCi1fTFRfRU9GCi0JICBmaSA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gIE1BR0lDX0NNRD0iJGx0X3NhdmVfTUFHSUNfQ01EIgotICA7OwotZXNhYwotZmkKLQotTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCi1pZiB0ZXN0IC1uICIkTUFHSUNfQ01EIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1BR0lDX0NNRCIgPiY1Ci0kYXNfZWNobyAiJE1BR0lDX0NNRCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIGVsc2UKLSAgICBNQUdJQ19DTUQ9OgotICBmaQotZmkKLQotICBmaQotICA7OwotZXNhYwotCi0jIFVzZSBDIGZvciB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGluIHRoZSBsaWJ0b29sIHNjcmlwdAotCi1sdF9zYXZlX0NDPSIkQ0MiCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLQotIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMgdGVzdCBzb3VyY2VzLgotYWNfZXh0PWMKLQotIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMgdGVzdCBzb3VyY2VzLgotb2JqZXh0PW8KLW9iamV4dD0kb2JqZXh0Ci0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCi1sdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDsiCi0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCi1sdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKCl7cmV0dXJuKDApO30nCi0KLQotCi0KLQotCi0KLSMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCi1MVENDPSR7TFRDQy0iJENDIn0KLQotIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgotTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9Ci0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1jb21waWxlcj0kQ0MKLQotIyBTYXZlIHRoZSBkZWZhdWx0IGNvbXBpbGVyLCBzaW5jZSBpdCBnZXRzIG92ZXJ3cml0dGVuIHdoZW4gdGhlIG90aGVyCi0jIHRhZ3MgYXJlIGJlaW5nIHRlc3RlZCwgYW5kIF9MVF9UQUdWQVIoY29tcGlsZXIsIFtdKSBpcyBhIE5PUC4KLWNvbXBpbGVyX0RFRkFVTFQ9JENDCi0KLSMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi1hY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLWVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRSTSBjb25mdGVzdCoKLQotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1lY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAotZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCi1fbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAotJFJNIC1yIGNvbmZ0ZXN0KgotCi0KLWlmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KLQotbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9Ci0KLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gIG52Y2MqKQotICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPScgLVhjb21waWxlciAtZm5vLWJ1aWx0aW4nIDs7Ci0gICopCi0gICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9JyAtZm5vLWJ1aWx0aW4nIDs7Ci0gIGVzYWMKLQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2x0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KLSAgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0gICBsdF9jb21waWxlcl9mbGFnPSItZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KLSAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAotICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAotICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAotICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQotICAgYWNfc3RhdHVzPSQ/Ci0gICBjYXQgY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCi0gICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgotICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJFJNIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA+JjY7IH0KLQotaWYgdGVzdCB4IiRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPSB4eWVzOyB0aGVuCi0gICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIgotZWxzZQotICAgIDoKLWZpCi0KLWZpCi0KLQotCi0KLQotCi0gIGx0X3Byb2dfY29tcGlsZXJfd2w9Ci1sdF9wcm9nX2NvbXBpbGVyX3BpYz0KLWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICIgPiY2OyB9Ci0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctc3RhdGljJwotCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4KikKLSAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIHBvd2VycGMpCi0gICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0Ci0gICAgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMnCi0gICAgICAgIDs7Ci0gICAgICBtNjhrKQotICAgICAgICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAotICAgICAgICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCi0gICAgICAgICAgICAjIGxpa2UgYC1tNjgwNDAnLgotICAgICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBiZW9zKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KLSAgICAgIDs7Ci0KLSAgICBtaW5ndyogfCBjeWd3aW4qIHwgcHczMiogfCBvczIqIHwgY2VnY2MqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgICMgQWx0aG91Z2ggdGhlIGN5Z3dpbiBnY2MgaWdub3JlcyAtZlBJQywgc3RpbGwgbmVlZCB0aGlzIGZvciBvbGQtc3R5bGUKLSAgICAgICMgKC0tZGlzYWJsZS1hdXRvLWltcG9ydCkgbGlicmFyaWVzCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLURETExfRVhQT1JUJwotICAgICAgOzsKLQotICAgIGRhcndpbiogfCByaGFwc29keSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCi0gICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZuby1jb21tb24nCi0gICAgICA7OwotCi0gICAgaGFpa3UqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIEhhaWt1LgotICAgICAgIyBUaGUgIi1zdGF0aWMiIGZsYWcgZXhpc3RzLCBidXQgaXMgYnJva2VuLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Ci0gICAgICA7OwotCi0gICAgaHB1eCopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgNjQtYml0IFBBIEhQLVVYLCBidXQgbm90IGZvciAzMi1iaXQKLSAgICAgICMgUEEgSFAtVVguICBPbiBJQTY0IEhQLVVYLCBQSUMgaXMgdGhlIGRlZmF1bHQgYnV0IHRoZSBwaWMgZmxhZwotICAgICAgIyBzZXRzIHRoZSBkZWZhdWx0IFRMUyBtb2RlbCBhbmQgYWZmZWN0cyBpbmxpbmluZy4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KikKLQkjICtaIHRoZSBkZWZhdWx0Ci0JOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJwotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgaW50ZXJpeFszLTldKikKLSAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCi0gICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KLSAgICAgIDs7Ci0KLSAgICBtc2Rvc2RqZ3BwKikKLSAgICAgICMgSnVzdCBiZWNhdXNlIHdlIHVzZSBHQ0MgZG9lc24ndCBtZWFuIHdlIHN1ZGRlbmx5IGdldCBzaGFyZWQgbGlicmFyaWVzCi0gICAgICAjIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KLSAgICAgIDs7Ci0KLSAgICAqbnRvKiB8ICpxbngqKQotICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKLSAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQyAtc2hhcmVkJwotICAgICAgOzsKLQotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLQlsdF9wcm9nX2NvbXBpbGVyX3BpYz0tS2NvbmZvcm1fcGljCi0gICAgICBmaQotICAgICAgOzsKLQotICAgICopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMnCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgbnZjYyopICMgQ3VkYSBDb21waWxlciBEcml2ZXIgMi4yCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctWGxpbmtlciAnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLVhjb21waWxlciAtZlBJQycKLSAgICAgIDs7Ci0gICAgZXNhYwotICBlbHNlCi0gICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICBlbHNlCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgbWluZ3cqIHwgY3lnd2luKiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKLSAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKLSAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLURETExfRVhQT1JUJwotICAgICAgOzsKLQotICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAotICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIGhwcGEqNjQqfGlhNjQqKQotCSMgK1ogdGhlIGRlZmF1bHQKLQk7OwotICAgICAgKikKLQlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nK1onCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgICMgSXMgdGhlcmUgYSBiZXR0ZXIgbHRfcHJvZ19jb21waWxlcl9zdGF0aWMgdGhhdCB3b3JrcyB3aXRoIHRoZSBidW5kbGVkIENDPwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJwotICAgICAgOzsKLQotICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ub25fc2hhcmVkJwotICAgICAgOzsKLQotICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAjIG9sZCBJbnRlbCBmb3IgeDg2XzY0IHdoaWNoIHN0aWxsIHN1cHBvcnRlZCAtS1BJQy4KLSAgICAgIGVjYyopCi0JbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLQlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1zdGF0aWMnCi0gICAgICAgIDs7Ci0gICAgICAjIGljYyB1c2VkIHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIEdDQy4KLSAgICAgICMgSUNDIDEwIGRvZXNuJ3QgYWNjZXB0IC1LUElDIGFueSBtb3JlLgotICAgICAgaWNjKiB8IGlmb3J0KikKLQlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotCWx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQycKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLXN0YXRpYycKLSAgICAgICAgOzsKLSAgICAgICMgTGFoZXkgRm9ydHJhbiA4LjEuCi0gICAgICBsZjk1KikKLQlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotCWx0X3Byb2dfY29tcGlsZXJfcGljPSctLXNoYXJlZCcKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLS1zdGF0aWMnCi0JOzsKLSAgICAgIHBnY2MqIHwgcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqIHwgcGdmb3J0cmFuKikKLSAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBjb21waWxlcnMgKCpub3QqIHRoZSBQZW50aXVtIGdjYyBjb21waWxlciwKLQkjIHdoaWNoIGxvb2tzIHRvIGJlIGEgZGVhZCBwcm9qZWN0KQotCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0JbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mcGljJwotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgICAgOzsKLSAgICAgIGNjYyopCi0gICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgotICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCi0gICAgICAgIDs7Ci0gICAgICB4bCogfCBiZ3hsKiB8IGJnZiogfCBtcGl4bCopCi0JIyBJQk0gWEwgQyA4LjAvRm9ydHJhbiAxMC4xLCAxMS4xIG9uIFBQQyBhbmQgQmx1ZUdlbmUKLQlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotCWx0X3Byb2dfY29tcGlsZXJfcGljPSctcXBpYycKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLXFzdGF0aWNsaW5rJwotCTs7Ci0gICAgICAqKQotCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgotCSpTdW5cIEYqIHwgKlN1bipGb3J0cmFuKikKLQkgICMgU3VuIEZvcnRyYW4gOC4zIHBhc3NlcyBhbGwgdW5yZWNvZ25pemVkIGZsYWdzIHRvIHRoZSBsaW5rZXIKLQkgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKLQkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLQkgIGx0X3Byb2dfY29tcGlsZXJfd2w9JycKLQkgIDs7Ci0JKlN1blwgQyopCi0JICAjIFN1biBDIDUuOQotCSAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJwotCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJwotCSAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLQkgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgbmV3c29zNikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICAqbnRvKiB8ICpxbngqKQotICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKLSAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQyAtc2hhcmVkJwotICAgICAgOzsKLQotICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctbm9uX3NoYXJlZCcKLSAgICAgIDs7Ci0KLSAgICByZG9zKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctbm9uX3NoYXJlZCcKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBmNzcqIHwgZjkwKiB8IGY5NSogfCBzdW5mNzcqIHwgc3VuZjkwKiB8IHN1bmY5NSopCi0JbHRfcHJvZ19jb21waWxlcl93bD0nLVFvcHRpb24gbGQgJzs7Ci0gICAgICAqKQotCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVFvcHRpb24gbGQgJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1QSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCi0JbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LY29uZm9ybV9waWMnCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICB1bmljb3MqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgICAgOzsKLQotICAgIHV0czQqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1waWMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLSAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6Ci0gICpkamdwcCopCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWM9Ci0gICAgOzsKLSAgKikKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0iJGx0X3Byb2dfY29tcGlsZXJfcGljIC1EUElDIgotICAgIDs7Ci1lc2FjCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9waWMiID4mNjsgfQotCi0KLQotCi0KLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgotIwotaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWMgd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpYyB3b3Jrcy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3JrcytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzPW5vCi0gICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgbHRfY29tcGlsZXJfZmxhZz0iJGx0X3Byb2dfY29tcGlsZXJfcGljIC1EUElDIgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KLSAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAotICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAotICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAotICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQotICAgYWNfc3RhdHVzPSQ/Ci0gICBjYXQgY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCi0gICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgotICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3M9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJFJNIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3JrcyIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA+JjY7IH0KLQotaWYgdGVzdCB4IiRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3JrcyIgPSB4eWVzOyB0aGVuCi0gICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWMgaW4KLSAgICAgIiIgfCAiICIqKSA7OwotICAgICAqKSBsdF9wcm9nX2NvbXBpbGVyX3BpYz0iICRsdF9wcm9nX2NvbXBpbGVyX3BpYyIgOzsKLSAgICAgZXNhYwotZWxzZQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPQotICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KLWZpCi0KLWZpCi0KLQotCi0KLQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi13bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2x0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9bm8KLSAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCi0gICBMREZMQUdTPSIkTERGTEFHUyAkbHRfdG1wX3N0YXRpY19mbGFnIgotICAgZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0gICBpZiAoZXZhbCAkYWNfbGluayAyPmNvbmZ0ZXN0LmVycikgJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgICAgIyBUaGUgbGlua2VyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgICAgJEVDSE8gIiRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAotICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgotICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrcz15ZXMKLSAgICAgICBmaQotICAgICBlbHNlCi0gICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJFJNIC1yIGNvbmZ0ZXN0KgotICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcyIgPiY2OyB9Ci0KLWlmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID0geHllczsgdGhlbgotICAgIDoKLWVsc2UKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0KLWZpCi0KLQotCi0KLQotCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX28rc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz1ubwotICAgJFJNIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCi0gICBta2RpciBjb25mdGVzdAotICAgY2QgY29uZnRlc3QKLSAgIG1rZGlyIG91dAotICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKLSAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCi0gICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgotICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucwotICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KLSAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAotICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAotICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAotICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1Ci0gICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAotICAgdGhlbgotICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAotICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgotICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX289eWVzCi0gICAgIGZpCi0gICBmaQotICAgY2htb2QgdSt3IC4gMj4mNQotICAgJFJNIGNvbmZ0ZXN0KgotICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgotICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCi0gICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkUk0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCi0gICAkUk0gb3V0LyogJiYgcm1kaXIgb3V0Ci0gICBjZCAuLgotICAgJFJNIC1yIGNvbmZ0ZXN0Ci0gICAkUk0gY29uZnRlc3QqCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID4mNjsgfQotCi0KLQotCi0KLQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHtsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vPW5vCi0gICAkUk0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKLSAgIG1rZGlyIGNvbmZ0ZXN0Ci0gICBjZCBjb25mdGVzdAotICAgbWtkaXIgb3V0Ci0gICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRsdF9jb21waWxlXCIiID4mNSkKLSAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQotICAgYWNfc3RhdHVzPSQ/Ci0gICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JjUKLSAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0Ci0gICB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICBjaG1vZCB1K3cgLiAyPiY1Ci0gICAkUk0gY29uZnRlc3QqCi0gICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCi0gICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KLSAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRSTSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKLSAgICRSTSBvdXQvKiAmJiBybWRpciBvdXQKLSAgIGNkIC4uCi0gICAkUk0gLXIgY29uZnRlc3QKLSAgICRSTSBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPiY2OyB9Ci0KLQotCi0KLWhhcmRfbGlua3M9Im5vdHRlc3RlZCIKLWlmIHRlc3QgIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KLSAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAiID4mNjsgfQotICBoYXJkX2xpbmtzPXllcwotICAkUk0gY29uZnRlc3QqCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIHRvdWNoIGNvbmZ0ZXN0LmEKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubwotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRfbGlua3MiID4mNQotJGFzX2VjaG8gIiRoYXJkX2xpbmtzIiA+JjY7IH0KLSAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiYyO30KLSAgICBuZWVkX2xvY2tzPXdhcm4KLSAgZmkKLWVsc2UKLSAgbmVlZF9sb2Nrcz1ubwotZmkKLQotCi0KLQotCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci0KLSAgcnVucGF0aF92YXI9Ci0gIGFsbG93X3VuZGVmaW5lZF9mbGFnPQotICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9bm8KLSAgYXJjaGl2ZV9jbWRzPQotICBhcmNoaXZlX2V4cHN5bV9jbWRzPQotICBjb21waWxlcl9uZWVkc19vYmplY3Q9bm8KLSAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz1ubwotICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Ci0gIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgaGFyZGNvZGVfYXV0b21hdGljPW5vCi0gIGhhcmRjb2RlX2RpcmVjdD1ubwotICBoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9bm8KLSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KLSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0KLSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KLSAgaGFyZGNvZGVfbWludXNfTD1ubwotICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCi0gIGluaGVyaXRfcnBhdGg9bm8KLSAgbGlua19hbGxfZGVwbGlicz11bmtub3duCi0gIG1vZHVsZV9jbWRzPQotICBtb2R1bGVfZXhwc3ltX2NtZHM9Ci0gIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9Ci0gIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPQotICB0aHJlYWRfc2FmZV9mbGFnX3NwZWM9Ci0gIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQotICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCi0gICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0Ci0gIGluY2x1ZGVfZXhwc3ltcz0KLSAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKLSAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgotICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCi0gICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgotICBleGNsdWRlX2V4cHN5bXM9J19HTE9CQUxfT0ZGU0VUX1RBQkxFX3xfR0xPQkFMX19GW0lEXV8uKicKLSAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0Ci0gICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgotICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKLSAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCi0gICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCi0gICMgRXhjbHVkZSBzaGFyZWQgbGlicmFyeSBpbml0aWFsaXphdGlvbi9maW5hbGl6YXRpb24gc3ltYm9scy4KLSAgZXh0cmFjdF9leHBzeW1zX2NtZHM9Ci0KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCi0gICAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQotICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KLSAgICAgIHdpdGhfZ251X2xkPW5vCi0gICAgZmkKLSAgICA7OwotICBpbnRlcml4KikKLSAgICAjIHdlIGp1c3QgaG9wZS9hc3N1bWUgdGhpcyBpcyBnY2MgYW5kIG5vdCBjODkgKD0gTVNWQysrKQotICAgIHdpdGhfZ251X2xkPXllcwotICAgIDs7Ci0gIG9wZW5ic2QqKQotICAgIHdpdGhfZ251X2xkPW5vCi0gICAgOzsKLSAgZXNhYwotCi0gIGxkX3NobGlicz15ZXMKLQotICAjIE9uIHNvbWUgdGFyZ2V0cywgR05VIGxkIGlzIGNvbXBhdGlibGUgZW5vdWdoIHdpdGggdGhlIG5hdGl2ZSBsaW5rZXIKLSAgIyB0aGF0IHdlJ3JlIGJldHRlciBvZmYgdXNpbmcgdGhlIG5hdGl2ZSBpbnRlcmZhY2UgZm9yIGJvdGguCi0gIGx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlPW5vCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXgqKQotCSMgVGhlIEFJWCBwb3J0IG9mIEdOVSBsZCBoYXMgYWx3YXlzIGFzcGlyZWQgdG8gY29tcGF0aWJpbGl0eQotCSMgd2l0aCB0aGUgbmF0aXZlIGxpbmtlci4gIEhvd2V2ZXIsIGFzIHRoZSB3YXJuaW5nIGluIHRoZSBHTlUgbGQKLQkjIGJsb2NrIHNheXMsIHZlcnNpb25zIGJlZm9yZSAyLjE5LjUqIGNvdWxkbid0IHJlYWxseSBjcmVhdGUgd29ya2luZwotCSMgc2hhcmVkIGxpYnJhcmllcywgcmVnYXJkbGVzcyBvZiB0aGUgaW50ZXJmYWNlIHVzZWQuCi0JY2FzZSBgJExEIC12IDI+JjFgIGluCi0JICAqXCBcKEdOVVwgQmludXRpbHNcKVwgMi4xOS41KikgOzsKLQkgICpcIFwoR05VXCBCaW51dGlsc1wpXCAyLlsyLTldKikgOzsKLQkgICpcIFwoR05VXCBCaW51dGlsc1wpXCBbMy05XSopIDs7Ci0JICAqKQotCSAgICBsdF91c2VfZ251X2xkX2ludGVyZmFjZT15ZXMKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgICopCi0JbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9eWVzCi0JOzsKLSAgICBlc2FjCi0gIGZpCi0KLSAgaWYgdGVzdCAiJGx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlIiA9IHllczsgdGhlbgotICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5Ci0gICAgd2xhcmM9JyR7d2x9JwotCi0gICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKLSAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KLSAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCi0gICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0gICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCi0gICAgZWxzZQotICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Ci0gICAgZmkKLSAgICBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9bm8KLSAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KLSAgICAgICpHTlVcIGdvbGQqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7Ci0gICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCi0gICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgotICAgICAgKlwgMi4xMS45Mi4wLjEyXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgTWFuZHJha2UgOC4yIC4uLgotICAgICAgKlwgMi4xMS4qKSA7OyAjIG90aGVyIDIuMTEgdmVyc2lvbnMKLSAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKLSAgICBlc2FjCi0KLSAgICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4WzMtOV0qKQotICAgICAgIyBPbiBBSVgvUFBDLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCi0JbGRfc2hsaWJzPW5vCi0JY2F0IDw8X0xUX0VPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjE5LCBpcyByZXBvcnRlZAotKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCi0qKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKLSoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIGluc3RhbGwgYmludXRpbHMKLSoqKiAyLjIwIG9yIGFib3ZlLCBvciBtb2RpZnkgeW91ciBQQVRIIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZC4KLSoqKiBZb3Ugd2lsbCB0aGVuIG5lZWQgdG8gcmVzdGFydCB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzLgotCi1fTFRfRU9GCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIHBvd2VycGMpCi0gICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0Ci0gICAgICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJwotICAgICAgICA7OwotICAgICAgbTY4aykKLSAgICAgICAgICAgIGFyY2hpdmVfY21kcz0nJFJNICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKLSAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICAgICAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgYmVvcyopCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLQkjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCi0JIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQotCWFyY2hpdmVfY21kcz0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgZWxzZQotCWxkX3NobGlicz1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCi0gICAgICAjIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKLSAgICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LS1leHBvcnQtYWxsLXN5bWJvbHMnCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCi0gICAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPXllcwotICAgICAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdWyBdL3MvLipbIF1cKFteIF0qXCkvXDEgREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bQUlUV11bIF0vcy8uKlsgXS8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCi0JIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQotCSMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KLQkgIGNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQllbHNlCi0JICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQkgIGNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JZml+Ci0JJENDIC1zaGFyZWQgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGhhaWt1KikKLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcwotICAgICAgOzsKLQotICAgIGludGVyaXhbMy05XSopCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0gICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCi0gICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5Ci0gICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5Ci0gICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCi0gICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCi0gICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgICA7OwotCi0gICAgZ251KiB8IGxpbnV4KiB8IHRwZiogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCi0gICAgICB0bXBfZGlldD1ubwotICAgICAgaWYgdGVzdCAiJGhvc3Rfb3MiID0gbGludXgtZGlldGxpYmM7IHRoZW4KLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgZGlldFwgKikgdG1wX2RpZXQ9eWVzOzsJIyBsaW51eC1kaWV0bGliYyB3aXRoIHN0YXRpYyBsaW5raW5nICghZGlldC1keW4pCi0JZXNhYwotICAgICAgZmkKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRFR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsIFwKLQkgJiYgdGVzdCAiJHRtcF9kaWV0IiA9IG5vCi0gICAgICB0aGVuCi0JdG1wX2FkZGZsYWc9Ci0JdG1wX3NoYXJlZGZsYWc9Jy1zaGFyZWQnCi0JY2FzZSAkY2NfYmFzZW5hbWUsJGhvc3RfY3B1IGluCi0gICAgICAgIHBnY2MqKQkJCQkjIFBvcnRsYW5kIEdyb3VwIEMgY29tcGlsZXIKLQkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJwotCSAgOzsKLQlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSogfCBwZ2ZvcnRyYW4qKQotCQkJCQkjIFBvcnRsYW5kIEdyb3VwIGY3NyBhbmQgZjkwIGNvbXBpbGVycwotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7Ci0JZWNjKixpYTY0KiB8IGljYyosaWE2NCopCSMgSW50ZWwgQyBjb21waWxlciBvbiBpYTY0Ci0JICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMnIDs7Ci0JZWZjKixpYTY0KiB8IGlmb3J0KixpYTY0KikJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyIG9uIGlhNjQKLQkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYyAtbm9mb3JfbWFpbicgOzsKLQlpZmMqIHwgaWZvcnQqKQkJCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlcgotCSAgdG1wX2FkZGZsYWc9JyAtbm9mb3JfbWFpbicgOzsKLQlsZjk1KikJCQkJIyBMYWhleSBGb3J0cmFuIDguMQotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Ci0JICB0bXBfc2hhcmVkZmxhZz0nLS1zaGFyZWQnIDs7Ci0JeGxbY0NdKiB8IGJneGxbY0NdKiB8IG1waXhsW2NDXSopICMgSUJNIFhMIEMgOC4wIG9uIFBQQyAoZGVhbCB3aXRoIHhsZiBiZWxvdykKLQkgIHRtcF9zaGFyZWRmbGFnPSctcW1rc2hyb2JqJwotCSAgdG1wX2FkZGZsYWc9IDs7Ci0JbnZjYyopCSMgQ3VkYSBDb21waWxlciBEcml2ZXIgMi4yCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0JICBjb21waWxlcl9uZWVkc19vYmplY3Q9eWVzCi0JICA7OwotCWVzYWMKLQljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KLQkqU3VuXCBDKikJCQkjIFN1biBDIDUuOQotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0JICBjb21waWxlcl9uZWVkc19vYmplY3Q9eWVzCi0JICB0bXBfc2hhcmVkZmxhZz0nLUcnIDs7Ci0JKlN1blwgRiopCQkJIyBTdW4gRm9ydHJhbiA4LjMKLQkgIHRtcF9zaGFyZWRmbGFnPSctRycgOzsKLQllc2FjCi0JYXJjaGl2ZV9jbWRzPSckQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCi0gICAgICAgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KLSAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotCSAgICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0JICAgIGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotCSAgICAkQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJwotICAgICAgICBmaQotCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQl4bGYqIHwgYmdmKiB8IGJneGxmKiB8IG1waXhsZiopCi0JICAjIElCTSBYTCBGb3J0cmFuIDEwLjEgb24gUFBDIGNhbm5vdCBjcmVhdGUgc2hhcmVkIGxpYnMgaXRzZWxmCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlIC0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Ci0JICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSctcnBhdGggJGxpYmRpcicKLQkgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgLW8gJGxpYicKLQkgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KLQkgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLQkgICAgICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0JICAgICAgZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0JICAgICAgJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgLXZlcnNpb24tc2NyaXB0ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJwotCSAgZmkKLQkgIDs7Ci0JZXNhYwotICAgICAgZWxzZQotICAgICAgICBsZF9zaGxpYnM9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgbmV0YnNkKikKLSAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJwotCXdsYXJjPQotICAgICAgZWxzZQotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgaWYgJExEIC12IDI+JjEgfCAkR1JFUCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCi0JbGRfc2hsaWJzPW5vCi0JY2F0IDw8X0xUX0VPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5Ci0qKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCi0qKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCi0qKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQotKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKLSoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1fTFRfRU9GCi0gICAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZWxzZQotCWxkX3NobGlicz1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQotICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCi0gICAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMVswLTVdLiopCi0JbGRfc2hsaWJzPW5vCi0JY2F0IDw8X0xUX0VPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBSZWxlYXNlcyBvZiB0aGUgR05VIGxpbmtlciBwcmlvciB0byAyLjE2LjkxLjAuMyBjYW4gbm90Ci0qKiogcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU0NPIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKLSoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKLSoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuMTYuOTEuMC4zIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5Ci0qKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcwotKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLV9MVF9FT0YKLQk7OwotCSopCi0JICAjIEZvciBzZWN1cml0eSByZWFzb25zLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYWx3YXlzCi0JICAjIHVzZSBhYnNvbHV0ZSBwYXRocyBmb3IgbmFtaW5nIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBleGNsdWRlIHRoZQotCSAgIyBEVF9SVU5QQVRIIHRhZyBmcm9tIGV4ZWN1dGFibGVzIGFuZCBsaWJyYXJpZXMuICBCdXQgZG9pbmcgc28KLQkgICMgcmVxdWlyZXMgdGhhdCB5b3UgY29tcGlsZSBldmVyeXRoaW5nIHR3aWNlLCB3aGljaCBpcyBhIHBhaW4uCi0JICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLQkgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQkgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0JICBlbHNlCi0JICAgIGxkX3NobGlicz1ubwotCSAgZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIHN1bm9zNCopCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICB3bGFyYz0KLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzPW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICIkbGRfc2hsaWJzIiA9IG5vOyB0aGVuCi0gICAgICBydW5wYXRoX3Zhcj0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Ci0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Ci0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KLSAgICBmaQotICBlbHNlCi0gICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgzKikKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLSAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCi0gICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCi0gICAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAteiAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIjsgdGhlbgotCSMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQotCSMgYnJva2VuIGNvbGxlY3QyLgotCWhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhaXhbNC05XSopCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKLQkjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KLQlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0JZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKLQlub19lbnRyeV9mbGFnPSIiCi0gICAgICBlbHNlCi0JIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCi0JIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQotCSMgQWxzbywgQUlYIG5tIHRyZWF0cyB3ZWFrIGRlZmluZWQgc3ltYm9scyBsaWtlIG90aGVyIGdsb2JhbAotCSMgZGVmaW5lZCBzeW1ib2xzLCB3aGVyZWFzIEdOVSBubSBtYXJrcyB0aGVtIGFzICJXIi4KLQlpZiAkTk0gLVYgMj4mMSB8ICRHUkVQICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCi0JICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSB8fCAoXCQgMiA9PSAiVyIpKSAmJiAoc3Vic3RyKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCi0JZWxzZQotCSAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCi0JZmkKLQlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0KLQkjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKLQkjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKLQkjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgotCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeFs1LTldKikKLQkgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbwotCSAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KLQkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKLQkgICAgYnJlYWsKLQkgIGZpCi0JICBkb25lCi0JICA7OwotCWVzYWMKLQotCWV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCi0Jbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JwotICAgICAgZmkKLQotICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgotICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5Ci0gICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bwotICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKLSAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgotCi0gICAgICBhcmNoaXZlX2NtZHM9JycKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT15ZXMKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JzonCi0gICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcwotICAgICAgZmlsZV9saXN0X3NwZWM9JyR7d2x9LWYsJwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMDEyXXxhaXg0LlswMTJdLiopCi0JIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCi0JIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCi0JICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCi0JICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJgotCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgJEdSRVAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCi0JICB0aGVuCi0JICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKLQkgIDoKLQkgIGVsc2UKLQkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKLQkgIGhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAotCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAotCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKLQkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZwotCSAgaGFyZGNvZGVfbWludXNfTD15ZXMKLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLQkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9Ci0JICBmaQotCSAgOzsKLQllc2FjCi0Jc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCi0JaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKLQlmaQotICAgICAgZWxzZQotCSMgbm90IHVzaW5nIGdjYwotCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKLQkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgotCSAgc2hhcmVkX2ZsYWc9Jy1HJwotCWVsc2UKLQkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKLQkgIGVsc2UKLQkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKLQkgIGZpCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tYmV4cGFsbCcKLSAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAotICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KLSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKLSAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAotCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQlhbGxvd191bmRlZmluZWRfZmxhZz0nLWJlcm9rJwotICAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4KLSAgICAgICAgIyBlbXB0eSBleGVjdXRhYmxlLgotICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLQotbHRfYWl4X2xpYnBhdGhfc2VkPScKLSAgICAvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7Ci0JL14wLyB7Ci0JICAgIHMvXjAgICpcKC4qXCkkL1wxLwotCSAgICBwCi0JfQotICAgIH0nCi1haXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKLSMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4KLSAgYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCi1maQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKLQotICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBmdW5jX2VjaG9fYWxsICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgotICAgICAgZWxzZQotCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKLQkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIteiBub2RlZnMiCi0JICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgotCWVsc2UKLQkgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuCi0JICMgZW1wdHkgZXhlY3V0YWJsZS4KLQkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0KLWx0X2FpeF9saWJwYXRoX3NlZD0nCi0gICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8gewotCS9eMC8gewotCSAgICBzL14wICAqXCguKlwpJC9cMS8KLQkgICAgcAotCX0KLSAgICB9JwotYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCi0jIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCi1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuCi0gIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAotZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCi0KLQkgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKLQkgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCi0JICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0JICBub191bmRlZmluZWRfZmxhZz0nICR7d2x9LWJlcm5vdG9rJwotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1iZXJvaycKLQkgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLQkgICAgIyBXZSBvbmx5IHVzZSB0aGlzIGNvZGUgZm9yIEdOVSBsZHMgdGhhdCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZS4KLQkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCSAgZWxzZQotCSAgICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKLQkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyRjb252ZW5pZW5jZScKLQkgIGZpCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKLQkgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCi0JICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCi0JZmkKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYW1pZ2FvcyopCi0gICAgICBjYXNlICRob3N0X2NwdSBpbgotICAgICAgcG93ZXJwYykKLSAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKLSAgICAgICAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPScnCi0gICAgICAgIDs7Ci0gICAgICBtNjhrKQotICAgICAgICAgICAgYXJjaGl2ZV9jbWRzPSckUk0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgICAgICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBic2RpWzQ1XSopCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9LXJkeW5hbWljCi0gICAgICA7OwotCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQotICAgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCi0gICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCi0gICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nICcKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgotICAgICAgbGliZXh0PWxpYgotICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCi0gICAgICBzaHJleHRfY21kcz0iLmRsbCIKLSAgICAgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBmdW5jX2VjaG9fYWxsICIkZGVwbGlicyIgfCAkU0VEICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCi0gICAgICAjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgotICAgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0ndHJ1ZScKLSAgICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCi0gICAgICBvbGRfYXJjaGl2ZV9jbWRzPSdsaWIgLU9VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCi0gICAgICBmaXhfc3JjZmlsZV9wYXRoPSdgY3lncGF0aCAtdyAiJHNyY2ZpbGUiYCcKLSAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9eWVzCi0gICAgICA7OwotCi0gICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLQotCi0gIGFyY2hpdmVfY21kc19uZWVkX2xjPW5vCi0gIGhhcmRjb2RlX2RpcmVjdD1ubwotICBoYXJkY29kZV9hdXRvbWF0aWM9eWVzCi0gIGhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKLSAgaWYgdGVzdCAiJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID0gInllcyI7IHRoZW4KLSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlICR7d2x9LWZvcmNlX2xvYWQsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAnCi0gIGVsc2UKLSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJwotICBmaQotICBsaW5rX2FsbF9kZXBsaWJzPXllcwotICBhbGxvd191bmRlZmluZWRfZmxhZz0iJF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkIgotICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICBpZm9ydCopIF9sdF9kYXJfY2FuX3NoYXJlZD15ZXMgOzsKLSAgICAgKikgX2x0X2Rhcl9jYW5fc2hhcmVkPSRHQ0MgOzsKLSAgZXNhYwotICBpZiB0ZXN0ICIkX2x0X2Rhcl9jYW5fc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCi0gICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ZnVuY19lY2hvX2FsbAotICAgIGFyY2hpdmVfY21kcz0iXCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJF9sdF9kYXJfc2luZ2xlX21vZCR7X2x0X2RzeW11dGlsfSIKLSAgICBtb2R1bGVfY21kcz0iXCRDQyBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIC1idW5kbGUgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzJHtfbHRfZHN5bXV0aWx9IgotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJHtfbHRfZGFyX3NpbmdsZV9tb2R9JHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKLSAgICBtb2R1bGVfZXhwc3ltX2NtZHM9InNlZCAtZSAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIC1idW5kbGUgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzJHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKLQotICBlbHNlCi0gIGxkX3NobGlicz1ubwotICBmaQotCi0gICAgICA7OwotCi0gICAgZGd1eCopCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICBmcmVlYnNkMSopCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKLSAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KLSAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKLSAgICAjIGV4dHJhIHNwYWNlKS4KLSAgICBmcmVlYnNkMi4yKikKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAvdXNyL2xpYi9jKytydDAubycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCi0gICAgZnJlZWJzZDIqKQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICBocHV4OSopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kcz0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHM9JyRSTSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0KLSAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0gICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLSAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0gICAgICA7OwotCi0gICAgaHB1eDEwKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHM9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0nK2IgJGxpYmRpcicKLQloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLQloYXJkY29kZV9kaXJlY3Q9eWVzCi0JaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlPXllcwotCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKLQkjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAotCSMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCWhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGhwdXgxMSopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqKQotCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JaWE2NCopCi0JICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQkqKQotCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQllc2FjCi0gICAgICBlbHNlCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQlpYTY0KikKLQkgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQkqKQotCi0JICAjIE9sZGVyIHZlcnNpb25zIG9mIHRoZSAxMS4wMCBjb21waWxlciBkbyBub3QgdW5kZXJzdGFuZCAtYiB5ZXQKLQkgICMgKEhQOTI0NTMtMDEgQS4xMS4wMS4yMCBkb2Vzbid0LCBIUDkyNDUzLTAxIEIuMTEuWC4zNTE3NS0zNTE3Ni5HUCBkb2VzKQotCSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkQ0MgdW5kZXJzdGFuZHMgLWIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJENDIHVuZGVyc3RhbmRzIC1iLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2x0X2N2X3Byb2dfY29tcGlsZXJfX2Irc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9jdl9wcm9nX2NvbXBpbGVyX19iPW5vCi0gICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgotICAgTERGTEFHUz0iJExERkxBR1MgLWIiCi0gICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICAgICAkRUNITyAiJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gY29uZnRlc3QuZXhwCi0gICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfX2I9eWVzCi0gICAgICAgZmkKLSAgICAgZWxzZQotICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfX2I9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJFJNIC1yIGNvbmZ0ZXN0KgotICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9fYiIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfX2IiID4mNjsgfQotCi1pZiB0ZXN0IHgiJGx0X2N2X3Byb2dfY29tcGlsZXJfX2IiID0geHllczsgdGhlbgotICAgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi1lbHNlCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotZmkKLQotCSAgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqfGlhNjQqKQotCSAgaGFyZGNvZGVfZGlyZWN0PW5vCi0JICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0JICA7OwotCSopCi0JICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0JICBoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9eWVzCi0JICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0KLQkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQkgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQkjIFRyeSB0byB1c2UgdGhlIC1leHBvcnRlZF9zeW1ib2wgbGQgb3B0aW9uLCBpZiBpdCBkb2VzIG5vdAotCSMgd29yaywgYXNzdW1lIHRoYXQgLWV4cG9ydHNfZmlsZSBkb2VzIG5vdCB3b3JrIGVpdGhlciBhbmQKLQkjIGltcGxpY2l0bHkgZXhwb3J0IGFsbCBzeW1ib2xzLgotICAgICAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgotICAgICAgICBMREZMQUdTPSIkTERGTEFHUyAtc2hhcmVkICR7d2x9LWV4cG9ydGVkX3N5bWJvbCAke3dsfWZvbyAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0vZGV2L251bGwiCi0gICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLWludCBmb28odm9pZCkge30KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgJHt3bH0tZXhwb3J0c19maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotICAgICAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgotICAgICAgZWxzZQotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1leHBvcnRzX2ZpbGUgJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBmaQotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9J25vJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgICBpbmhlcml0X3JwYXRoPXllcwotICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKLSAgICAgIDs7Ci0KLSAgICBuZXRic2QqKQotICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAjIGEub3V0Ci0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAgICAgIyBFTEYKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICA7OwotCi0gICAgbmV3c29zNikKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICA7OwotCi0gICAgKm50byogfCAqcW54KikKLSAgICAgIDs7Ci0KLSAgICBvcGVuYnNkKikKLSAgICAgIGlmIHRlc3QgLWYgL3Vzci9saWJleGVjL2xkLnNvOyB0aGVuCi0JaGFyZGNvZGVfZGlyZWN0PXllcwotCWhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLQloYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9eWVzCi0JaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMnCi0JICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJwotCSAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJwotCWVsc2UKLQkgIGNhc2UgJGhvc3Rfb3MgaW4KLQkgICBvcGVuYnNkWzAxXS4qIHwgb3BlbmJzZDIuWzAtN10gfCBvcGVuYnNkMi5bMC03XS4qKQotCSAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotCSAgICAgOzsKLQkgICAqKQotCSAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJwotCSAgICAgOzsKLQkgIGVzYWMKLQlmaQotICAgICAgZWxzZQotCWxkX3NobGlicz1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBvczIqKQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgICBhcmNoaXZlX2NtZHM9JyRFQ0hPICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JEVDSE8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J2VteGltcCAtbyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5hICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICAgIDs7Ci0KLSAgICBvc2YzKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBmaQotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9J25vJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgICA7OwotCi0gICAgb3NmNCogfCBvc2Y1KikJIyBhcyBvc2YzKiB3aXRoIHRoZSBhZGRpdGlvbiBvZiAtbXN5bSBmbGFnCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBlbHNlCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZTsgcHJpbnRmICIlc1xcbiIgIi1oaWRkZW4iPj4gJGxpYi5leHB+Ci0JJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICRjb21waWxlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kUk0gJGxpYi5leHAnCi0KLQkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5Ci0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLXJwYXRoICRsaWJkaXInCi0gICAgICBmaQotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9J25vJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBub191bmRlZmluZWRfZmxhZz0nIC16IGRlZnMnCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCXdsYXJjPScke3dsfScKLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LXogJHt3bH10ZXh0ICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkgICRDQyAtc2hhcmVkICR7d2x9LXogJHt3bH10ZXh0ICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCi0gICAgICBlbHNlCi0JY2FzZSBgJENDIC1WIDI+JjFgIGluCi0JKiJDb21waWxlcnMgNS4wIiopCi0JICB3bGFyYz0nJwotCSAgYXJjaGl2ZV9jbWRzPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkgICRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRSTSAkbGliLmV4cCcKLQkgIDs7Ci0JKikKLQkgIHdsYXJjPScke3dsfScKLQkgIGFyY2hpdmVfY21kcz0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkgICRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJwotCSAgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OwotICAgICAgKikKLQkjIFRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBjb21iaW5lIGFuZCByZW9yZGVyIGxpbmtlciBvcHRpb25zLAotCSMgYnV0IHVuZGVyc3RhbmRzIGAteiBsaW5rZXJfZmxhZycuICBHQ0MgZGlzY2FyZHMgaXQgd2l0aG91dCBgJHdsJywKLQkjIGJ1dCBpcyBjYXJlZnVsIGVub3VnaCBub3QgdG8gcmVvcmRlci4KLQkjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQotCWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3QkY29udmVuaWVuY2UgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JwotCWVsc2UKLQkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JwotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KLQkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCi0JIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0KQotICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLQlzbmkpCi0JICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIGhhcmRjb2RlX2RpcmVjdD15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/Ci0JOzsKLQlzaWVtZW5zKQotCSAgIyMgTEQgaXMgbGQgaXQgbWFrZXMgYSBQTEFNTElCCi0JICAjIyBDQyBqdXN0IG1ha2VzIGEgR3Jvc3NNb2R1bGUuCi0JICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICByZWxvYWRfY21kcz0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi0JICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgICAgICAgOzsKLQltb3Rvcm9sYSkKLQkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgaGFyZGNvZGVfZGlyZWN0PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKLQk7OwotICAgICAgZXNhYwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0LjMqKQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Jy1CZXhwb3J0JwotICAgICAgOzsKLQotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQloYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0JcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLQloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKLQlsZF9zaGxpYnM9eWVzCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bMDI0XSopCi0gICAgICBub191bmRlZmluZWRfZmxhZz0nJHt3bH0teix0ZXh0JwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCi0gICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAotICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bwotICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCi0gICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0Ci0gICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKLSAgICAgICMgYXMgLXogZGVmcy4KLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnPScke3dsfS16LHRleHQnCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0teixub2RlZnMnCi0gICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sYz1ubwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tUiwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJleHBvcnQnCi0gICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCi0KLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kcz0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgICopCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCB4JGhvc3RfdmVuZG9yID0geHNuaTsgdGhlbgotICAgICAgY2FzZSAkaG9zdCBpbgotICAgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQotCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJwotCTs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnMiID4mNQotJGFzX2VjaG8gIiRsZF9zaGxpYnMiID4mNjsgfQotdGVzdCAiJGxkX3NobGlicyIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLXdpdGhfZ251X2xkPSR3aXRoX2dudV9sZAotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotIwotIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPwotIwotY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sYyIgaW4KLXh8eHllcykKLSAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAotICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKLQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBjYXNlICRhcmNoaXZlX2NtZHMgaW4KLSAgICAqJ34nKikKLSAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KLSAgICAgIDs7Ci0gICAgJyRDQyAnKikKLSAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKLSAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYwotICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7bHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAkUk0gY29uZnRlc3QqCi0JZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0KLQlpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCi0JICBzb25hbWU9Y29uZnRlc3QKLQkgIGxpYj1jb25mdGVzdAotCSAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0Ci0JICBkZXBsaWJzPQotCSAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wKLQkgIHBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpYwotCSAgY29tcGlsZXJfZmxhZ3M9LXYKLQkgIGxpbmtlcl9mbGFncz0tdgotCSAgdmVyc3RyaW5nPQotCSAgb3V0cHV0X29iamRpcj0uCi0JICBsaWJuYW1lPWNvbmZ0ZXN0Ci0JICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRhbGxvd191bmRlZmluZWRfZmxhZwotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Ci0JICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYXJjaGl2ZV9jbWRzIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIiOyB9ID4mNQotICAoZXZhbCAkYXJjaGl2ZV9jbWRzIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQotCSAgdGhlbgotCSAgICBsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYz1ubwotCSAgZWxzZQotCSAgICBsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKLQkgIGZpCi0JICBhbGxvd191bmRlZmluZWRfZmxhZz0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZwotCWVsc2UKLQkgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotCWZpCi0JJFJNIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYyIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjIiA+JjY7IH0KLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPSRsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYwotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICIgPiY2OyB9Ci0KLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBkYXJ3aW4qKSBsdF9hd2tfYXJnPSIvXmxpYnJhcmllczovLC9MUi8iIDs7Ci0gICAgKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LyIgOzsKLSAgZXNhYwotICBjYXNlICRob3N0X29zIGluCi0gICAgbWluZ3cqIHwgY2VnY2MqKSBsdF9zZWRfc3RyaXBfZXE9InMsPVwoW0EtWmEtel06XCksXDEsZyIgOzsKLSAgICAqKSBsdF9zZWRfc3RyaXBfZXE9InMsPS8sLyxnIiA7OwotICBlc2FjCi0gIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBhd2sgJGx0X2F3a19hcmcgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICRsdF9zZWRfc3RyaXBfZXFgCi0gIGNhc2UgJGx0X3NlYXJjaF9wYXRoX3NwZWMgaW4KLSAgKlw7KikKLSAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCi0gICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCi0gICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCi0gICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCi0gICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgJ3MvOy8gL2cnYAotICAgIDs7Ci0gICopCi0gICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gICAgOzsKLSAgZXNhYwotICAjIE9rLCBub3cgd2UgaGF2ZSB0aGUgcGF0aCwgc2VwYXJhdGVkIGJ5IHNwYWNlcywgd2UgY2FuIHN0ZXAgdGhyb3VnaCBpdAotICAjIGFuZCBhZGQgbXVsdGlsaWIgZGlyIGlmIG5lY2Vzc2FyeS4KLSAgbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9Ci0gIGx0X211bHRpX29zX2Rpcj1gJENDICRDUFBGTEFHUyAkQ0ZMQUdTICRMREZMQUdTIC1wcmludC1tdWx0aS1vcy1kaXJlY3RvcnkgMj4vZGV2L251bGxgCi0gIGZvciBsdF9zeXNfcGF0aCBpbiAkbHRfc2VhcmNoX3BhdGhfc3BlYzsgZG8KLSAgICBpZiB0ZXN0IC1kICIkbHRfc3lzX3BhdGgvJGx0X211bHRpX29zX2RpciI7IHRoZW4KLSAgICAgIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgJGx0X3N5c19wYXRoLyRsdF9tdWx0aV9vc19kaXIiCi0gICAgZWxzZQotICAgICAgdGVzdCAtZCAiJGx0X3N5c19wYXRoIiAmJiBcCi0JbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9IiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyAkbHRfc3lzX3BhdGgiCi0gICAgZmkKLSAgZG9uZQotICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjIiB8IGF3ayAnCi1CRUdJTiB7UlM9IiAiOyBGUz0iL3xcbiI7fSB7Ci0gIGx0X2Zvbz0iIjsKLSAgbHRfY291bnQ9MDsKLSAgZm9yIChsdF9pID0gTkY7IGx0X2kgPiAwOyBsdF9pLS0pIHsKLSAgICBpZiAoJGx0X2kgIT0gIiIgJiYgJGx0X2kgIT0gIi4iKSB7Ci0gICAgICBpZiAoJGx0X2kgPT0gIi4uIikgewotICAgICAgICBsdF9jb3VudCsrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGx0X2NvdW50ID09IDApIHsKLSAgICAgICAgICBsdF9mb289Ii8iICRsdF9pIGx0X2ZvbzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBsdF9jb3VudC0tOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGlmIChsdF9mb28gIT0gIiIpIHsgbHRfZnJlcVtsdF9mb29dKys7IH0KLSAgaWYgKGx0X2ZyZXFbbHRfZm9vXSA9PSAxKSB7IHByaW50IGx0X2ZvbzsgfQotfSdgCi0gICMgQVdLIHByb2dyYW0gYWJvdmUgZXJyb25lb3VzbHkgcHJlcGVuZHMgJy8nIHRvIEM6L2Rvcy9wYXRocwotICAjIGZvciB0aGVzZSBob3N0cy4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG1pbmd3KiB8IGNlZ2NjKikgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8XAotICAgICAgJFNFRCAncywvXChbQS1aYS16XTpcKSxcMSxnJ2AgOzsKLSAgZXNhYwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkbHRfTkwyU1BgCi1lbHNlCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLWZpCi1saWJyYXJ5X25hbWVzX3NwZWM9Ci1saWJuYW1lX3NwZWM9J2xpYiRuYW1lJwotc29uYW1lX3NwZWM9Ci1zaHJleHRfY21kcz0iLnNvIgotcG9zdGluc3RhbGxfY21kcz0KLXBvc3R1bmluc3RhbGxfY21kcz0KLWZpbmlzaF9jbWRzPQotZmluaXNoX2V2YWw9Ci1zaGxpYnBhdGhfdmFyPQotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KLXZlcnNpb25fdHlwZT1ub25lCi1keW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKLW5lZWRfbGliX3ByZWZpeD11bmtub3duCi1oYXJkY29kZV9pbnRvX2xpYnM9bm8KLQotIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCi0jIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKLW5lZWRfdmVyc2lvbj11bmtub3duCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotCi0gICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgOzsKLQotYWl4WzQtOV0qKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0gICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0Ci0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZWxzZQotICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKLSAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCi0gICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bwotICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCi0gICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXg0IHwgYWl4NC5bMDFdIHwgYWl4NC5bMDFdLiopCi0gICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJwotCSAgIGVjaG8gJyB5ZXMgJwotCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgJEdSRVAgeWVzID4gL2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLSAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0Ci0gICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bwotICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCi0gICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0gICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KLSAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90Ci0gICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBlbHNlCi0gICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgotICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKLSAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgZmkKLSAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgZmkKLSAgOzsKLQotYW1pZ2FvcyopCi0gIGNhc2UgJGhvc3RfY3B1IGluCi0gIHBvd2VycGMpCi0gICAgIyBTaW5jZSBKdWx5IDIwMDcgQW1pZ2FPUzQgb2ZmaWNpYWxseSBzdXBwb3J0cyAuc28gbGlicmFyaWVzLgotICAgICMgV2hlbiBjb21waWxpbmcgdGhlIGV4ZWN1dGFibGUsIGFkZCAtdXNlLWR5bmxkIC1Mc29ianM6IHRvIHRoZSBjb21waWxlbGluZS4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICA7OwotICBtNjhrKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCi0gICAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KLSAgICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YGZ1bmNfZWNob19hbGwgIiRsaWIiIHwgJFNFRCAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRSTSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWJlb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi0gIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICi0gIDs7Ci0KLWJzZGlbNDVdKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKLSAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93Ci0gICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcwotICA7OwotCi1jeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCi0gIHZlcnNpb25fdHlwZT13aW5kb3dzCi0gIHNocmV4dF9jbWRzPSIuZGxsIgotICBuZWVkX3ZlcnNpb249bm8KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0KLSAgY2FzZSAkR0NDLCRob3N0X29zIGluCi0gIHllcyxjeWd3aW4qIHwgeWVzLG1pbmd3KiB8IHllcyxwdzMyKiB8IHllcyxjZWdjYyopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKLSAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCi0gICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+Ci0gICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTsgZWNobyBcJGRsbmFtZSdcJydgfgotICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgotICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+Ci0gICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+Ci0gICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lfgotICAgICAgaWYgdGVzdCAtbiAnXCcnJHN0cmlwbWUnXCcnICYmIHRlc3QgLW4gJ1wnJyRzdHJpcGxpYidcJyc7IHRoZW4KLSAgICAgICAgZXZhbCAnXCcnJHN0cmlwbGliIFwkZGxkaXIvJGRsbmFtZSdcJycgfHwgZXhpdCBcJD87Ci0gICAgICBmaScKLSAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgotICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KLSAgICAgICAkUk0gXCRkbHBhdGgnCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGN5Z3dpbiopCi0gICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKLSAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLQotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC91c3IvbGliL3czMmFwaSIKLSAgICAgIDs7Ci0gICAgbWluZ3cqIHwgY2VnY2MqKQotICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKLSAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIDs7Ci0gICAgcHczMiopCi0gICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0KLSAgKikKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKLSAgICA7OwotICBlc2FjCi0gIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCi0gICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgotICBzaGxpYnBhdGhfdmFyPVBBVEgKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCi0gIHZlcnNpb25fdHlwZT1kYXJ3aW4KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAotICBzaHJleHRfY21kcz0nYHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliYCcKLQotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL3Vzci9sb2NhbC9saWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJwotICA7OwotCi1kZ3V4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1mcmVlYnNkMSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLWZyZWVic2QqIHwgZHJhZ29uZmx5KikKLSAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldwotICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KLSAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KLSAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKLSAgZWxzZQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBmcmVlYnNkWzEyM10qKSBvYmpmb3JtYXQ9YW91dCA7OwotICAgICopIG9iamZvcm1hdD1lbGYgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKLSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0gICAgZnJlZWJzZC1lbGYqKQotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBmcmVlYnNkLSopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgICAgIG5lZWRfdmVyc2lvbj15ZXMKLSAgICAgIDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBmcmVlYnNkMiopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBmcmVlYnNkMy5bMi05XSogfCBmcmVlYnNkZWxmMy5bMi05XSogfCBcCi0gIGZyZWVic2Q0LlswLTVdIHwgZnJlZWJzZGVsZjQuWzAtNV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gICopICMgZnJvbSA0LjYgb24sIGFuZCBEcmFnb25GbHkKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotZ251KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWhhaWt1KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIHJ1bnRpbWVfbG9hZGVyIgotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy9ib290L2hvbWUvY29uZmlnL2xpYiAvYm9vdC9jb21tb24vbGliIC9ib290L3N5c3RlbS9saWInCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KLSAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGNhc2UgJGhvc3RfY3B1IGluCi0gIGlhNjQqKQotICAgIHNocmV4dF9jbWRzPScuc28nCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc28iCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICBpZiB0ZXN0ICJYJEhQVVhfSUE2NF9NT0RFIiA9IFgzMjsgdGhlbgotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliIgotICAgIGVsc2UKLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDY0IC91c3IvbG9jYWwvbGliL2hwdXg2NCIKLSAgICBmaQotICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLSAgICA7OwotICBocHBhKjY0KikKLSAgICBzaHJleHRfY21kcz0nLnNsJwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvcGEyMF82NCAvdXNyL2Njcy9saWIvcGEyMF82NCIKLSAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgOzsKLSAgKikKLSAgICBzaHJleHRfY21kcz0nLnNsJwotICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCi0gICAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIDs7Ci0gIGVzYWMKLSAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUsIC4uLgotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKLSAgIyBvciBmYWlscyBvdXRyaWdodCwgc28gb3ZlcnJpZGUgYXRvbWljYWxseToKLSAgaW5zdGFsbF9vdmVycmlkZV9tb2RlPTU1NQotICA7OwotCi1pbnRlcml4WzMtOV0qKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKLSAgICAqKQotCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KLQkJdmVyc2lvbl90eXBlPWxpbnV4Ci0JZWxzZQotCQl2ZXJzaW9uX3R5cGU9aXJpeAotCWZpIDs7Ci0gIGVzYWMKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgaXJpeDUqIHwgbm9uc3RvcHV4KikKLSAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9Ci0gICAgOzsKLSAgKikKLSAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECi0gICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKLSAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKLSAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQotICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7Ci0gICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCi0gICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OwotICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgotbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0KLSAgIyBTb21lIGJpbnV0aWxzIGxkIGFyZSBwYXRjaGVkIHRvIHNldCBEVF9SVU5QQVRICi0gIGlmIHRlc3QgIiR7bHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgc2F2ZV9MREZMQUdTPSRMREZMQUdTCi0gICAgc2F2ZV9saWJkaXI9JGxpYmRpcgotICAgIGV2YWwgImxpYmRpcj0vZm9vOyB3bD1cIiRsdF9wcm9nX2NvbXBpbGVyX3dsXCI7IFwKLQkgTERGTEFHUz1cIlwkTERGTEFHUyAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiIgotICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBpZiAgKCRPQkpEVU1QIC1wIGNvbmZ0ZXN0JGFjX2V4ZWV4dCkgMj4vZGV2L251bGwgfCBncmVwICJSVU5QQVRILiokbGliZGlyIiA+L2Rldi9udWxsOyB0aGVuIDoKLSAgbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotICAgIExERkxBR1M9JHNhdmVfTERGTEFHUwotICAgIGxpYmRpcj0kc2F2ZV9saWJkaXIKLQotZmkKLQotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JGx0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAotCi0gICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgotICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKLSAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotCi0gICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCi0gIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIDI+L2Rldi9udWxsIiwgXCQyKSk7IHNraXAgPSAxOyB9IHsgaWYgKCFza2lwKSBwcmludCBcJDA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87L15bCSBdKmh3Y2FwWwkgXS9kO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nO3MvIi8vZzsvXiQvZCcgfCB0ciAnXG4nICcgJ2AKLSAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAkbHRfbGRfZXh0cmEiCi0gIGZpCi0KLSAgIyBXZSB1c2VkIHRvIHRlc3QgZm9yIC9saWIvbGQuc28uMSBhbmQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIG9uCi0gICMgcG93ZXJwYywgYmVjYXVzZSBNa0xpbnV4IG9ubHkgc3VwcG9ydGVkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUKLSAgIyBHTlUgZHluYW1pYyBsaW5rZXIuICBTaW5jZSB0aGlzIHdhcyBicm9rZW4gd2l0aCBjcm9zcyBjb21waWxlcnMsCi0gICMgbW9zdCBwb3dlcnBjLWxpbnV4IGJveGVzIHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHRoZXNlIGRheXMgYW5kCi0gICMgcGVvcGxlIGNhbiBhbHdheXMgLS1kaXNhYmxlLXNoYXJlZCwgdGhlIHRlc3Qgd2FzIHJlbW92ZWQsIGFuZCB3ZQotICAjIGFzc3VtZSB0aGUgR05VL0xpbnV4IGR5bmFtaWMgbGlua2VyIGlzIGluIHVzZS4KLSAgZHluYW1pY19saW5rZXI9J0dOVS9MaW51eCBsZC5zbycKLSAgOzsKLQotbmV0YnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJwotICBlbHNlCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJwotICBmaQotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotbmV3c29zNikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLSpudG8qIHwgKnFueCopCi0gIHZlcnNpb25fdHlwZT1xbngKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J2xkcW54LnNvJwotICA7OwotCi1vcGVuYnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopCW5lZWRfdmVyc2lvbj15ZXMgOzsKLSAgICAqKQkJCQluZWVkX3ZlcnNpb249bm8gIDs7Ci0gIGVzYWMKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIG9wZW5ic2QyLls4OV0gfCBvcGVuYnNkMi5bODldLiopCi0Jc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0JOzsKLSAgICAgICopCi0Jc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotCTs7Ci0gICAgICBlc2FjCi0gIGVsc2UKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGZpCi0gIDs7Ci0KLW9zMiopCi0gIGxpYm5hbWVfc3BlYz0nJG5hbWUnCi0gIHNocmV4dF9jbWRzPSIuZGxsIgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUuYScKLSAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgOzsKLQotb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICB2ZXJzaW9uX3R5cGU9b3NmCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgotICA7OwotCi1yZG9zKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotc29sYXJpcyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKLSAgOzsKLQotc3Vub3M0KikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICBmaQotICBuZWVkX3ZlcnNpb249eWVzCi0gIDs7Ci0KLXN5c3Y0IHwgc3lzdjQuMyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLSAgICBzbmkpCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICAgIDs7Ci0gICAgc2llbWVucykKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBtb3Rvcm9sYSkKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgbmVlZF92ZXJzaW9uPW5vCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCi0gICAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXN5c3Y0Kk1QKikKLSAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotICAgIHZlcnNpb25fdHlwZT1saW51eAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZmkKLSAgOzsKLQotc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLWVsZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL3Vzci9nbnUvbGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYiAvbGliJwotICBlbHNlCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2Njcy9saWIgL3Vzci9saWInCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgc2NvMy4ydjUqKQotICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL2xpYiIKLQk7OwotICAgIGVzYWMKLSAgZmkKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbGliJwotICA7OwotCi10cGYqKQotICAjIFRQRiBpcyBhIGNyb3NzLXRhcmdldCBvbmx5LiAgUHJlZmVycmVkIGNyb3NzLWhvc3QgPSBHTlUvTGludXguCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi11dHM0KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi0qKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotZXNhYwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRkeW5hbWljX2xpbmtlciIgPiY1Ci0kYXNfZWNobyAiJGR5bmFtaWNfbGlua2VyIiA+JjY7IH0KLXRlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLXZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgotZmkKLQotaWYgdGVzdCAiJHtsdF9jdl9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgotZmkKLWlmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRsdF9jdl9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyIKLWZpCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAiID4mNjsgfQotaGFyZGNvZGVfYWN0aW9uPQotaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHx8Ci0gICB0ZXN0IC1uICIkcnVucGF0aF92YXIiIHx8Ci0gICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSAiWHllcyIgOyB0aGVuCi0KLSAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0ZW50IGRpcmVjdG9yaWVzLgotICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSBubyAmJgotICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCi0gICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKLSAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQotICAgICAjIyB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCApIiAhPSBubyAmJgotICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0gbm87IHRoZW4KLSAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgotICAgIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKLSAgZWxzZQotICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCi0gICAgaGFyZGNvZGVfYWN0aW9uPWltbWVkaWF0ZQotICBmaQotZWxzZQotICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZwotICAjIGRpcmVjdG9yaWVzLgotICBoYXJkY29kZV9hY3Rpb249dW5zdXBwb3J0ZWQKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRjb2RlX2FjdGlvbiIgPiY1Ci0kYXNfZWNobyAiJGhhcmRjb2RlX2FjdGlvbiIgPiY2OyB9Ci0KLWlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rIHx8Ci0gICB0ZXN0ICIkaW5oZXJpdF9ycGF0aCIgPSB5ZXM7IHRoZW4KLSAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLWVsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKLSAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KLSAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5Ci0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKLWZpCi0KLQotCi0KLQotCi0gIGlmIHRlc3QgIngkZW5hYmxlX2Rsb3BlbiIgIT0geHllczsgdGhlbgotICBlbmFibGVfZGxvcGVuPXVua25vd24KLSAgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24KLSAgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duCi1lbHNlCi0gIGx0X2N2X2Rsb3Blbj1ubwotICBsdF9jdl9kbG9wZW5fbGlicz0KLQotICBjYXNlICRob3N0X29zIGluCi0gIGJlb3MqKQotICAgIGx0X2N2X2Rsb3Blbj0ibG9hZF9hZGRfb24iCi0gICAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0gICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCi0gICAgOzsKLQotICBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKLSAgICBsdF9jdl9kbG9wZW49IkxvYWRMaWJyYXJ5IgotICAgIGx0X2N2X2Rsb3Blbl9saWJzPQotICAgIDs7Ci0KLSAgY3lnd2luKikKLSAgICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKLSAgICBsdF9jdl9kbG9wZW5fbGlicz0KLSAgICA7OwotCi0gIGRhcndpbiopCi0gICMgaWYgbGliZGwgaXMgaW5zdGFsbGVkIHdlIG5lZWQgdG8gbGluayBhZ2FpbnN0IGl0Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9kbF9kbG9wZW4rc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGRsICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBkbG9wZW4gKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBkbG9wZW4gKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2RsX2Rsb3Blbj15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2RsX2Rsb3Blbj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbF9kbG9wZW4iID0geCIieWVzOyB0aGVuIDoKLSAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIgotZWxzZQotCi0gICAgbHRfY3ZfZGxvcGVuPSJkeWxkIgotICAgIGx0X2N2X2Rsb3Blbl9saWJzPQotICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcwotCi1maQotCi0gICAgOzsKLQotICAqKQotICAgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInNobF9sb2FkIiAiYWNfY3ZfZnVuY19zaGxfbG9hZCIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19zaGxfbG9hZCIgPSB4IiJ5ZXM7IHRoZW4gOgotICBsdF9jdl9kbG9wZW49InNobF9sb2FkIgotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzaGxfbG9hZCBpbiAtbGRsZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX2RsZF9zaGxfbG9hZCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sZGxkICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzaGxfbG9hZCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIHNobF9sb2FkICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQ9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA9IHgiInllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsZCIKLWVsc2UKLSAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZGxvcGVuIiAiYWNfY3ZfZnVuY19kbG9wZW4iCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZGxvcGVuIiA9IHgiInllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX2RsX2Rsb3BlbitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sZGwgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGRsb3BlbiAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGRsb3BlbiAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfZGxfZGxvcGVuPXllcwotZWxzZQotICBhY19jdl9saWJfZGxfZGxvcGVuPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPSB4IiJ5ZXM7IHRoZW4gOgotICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX3N2bGRfZGxvcGVuK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxzdmxkICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBkbG9wZW4gKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBkbG9wZW4gKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3N2bGRfZGxvcGVuPXllcwotZWxzZQotICBhY19jdl9saWJfc3ZsZF9kbG9wZW49bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA9IHgiInllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIgotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZGxkX2xpbmsgaW4gLWxkbGQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX2RsZF9kbGRfbGluaytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sZGxkICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBkbGRfbGluayAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGRsZF9saW5rICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9kbGRfZGxkX2xpbms9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9kbGRfZGxkX2xpbms9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfZGxkX2RsZF9saW5rIiA9IHgiInllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbj0iZGxkX2xpbmsiIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsZCIKLWZpCi0KLQotZmkKLQotCi1maQotCi0KLWZpCi0KLQotZmkKLQotCi1maQotCi0gICAgOzsKLSAgZXNhYwotCi0gIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuIiAhPSB4bm87IHRoZW4KLSAgICBlbmFibGVfZGxvcGVuPXllcwotICBlbHNlCi0gICAgZW5hYmxlX2Rsb3Blbj1ubwotICBmaQotCi0gIGNhc2UgJGx0X2N2X2Rsb3BlbiBpbgotICBkbG9wZW4pCi0gICAgc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgotICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllcyAmJiBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgotCi0gICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLSAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCi0KLSAgICBzYXZlX0xJQlM9IiRMSUJTIgotICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKLQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7bHRfY3ZfZGxvcGVuX3NlbGYrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAJICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbl9zZWxmPWNyb3NzCi1lbHNlCi0gIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKLSAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKLSNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWYgSEFWRV9ETEZDTl9ICi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIFJUTERfR0xPQkFMCi0jICBkZWZpbmUgTFRfRExHTE9CQUwJCVJUTERfR0xPQkFMCi0jZWxzZQotIyAgaWZkZWYgRExfR0xPQkFMCi0jICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJRExfR0xPQkFMCi0jICBlbHNlCi0jICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJMAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRfRExMQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCi0gICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCi0jaWZuZGVmIExUX0RMTEFaWV9PUl9OT1cKLSMgIGlmZGVmIFJUTERfTEFaWQotIyAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJUlRMRF9MQVpZCi0jICBlbHNlCi0jICAgIGlmZGVmIERMX0xBWlkKLSMgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJRExfTEFaWQotIyAgICBlbHNlCi0jICAgICAgaWZkZWYgUlRMRF9OT1cKLSMgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCVJUTERfTk9XCi0jICAgICAgZWxzZQotIyAgICAgICAgaWZkZWYgRExfTk9XCi0jICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCURMX05PVwotIyAgICAgICAgZWxzZQotIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkwCi0jICAgICAgICBlbmRpZgotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIFdoZW4gLWZ2aXNiaWxpdHk9aGlkZGVuIGlzIHVzZWQsIGFzc3VtZSB0aGUgY29kZSBoYXMgYmVlbiBhbm5vdGF0ZWQKLSAgIGNvcnJlc3BvbmRpbmdseSBmb3IgdGhlIHN5bWJvbHMgbmVlZGVkLiAgKi8KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKChfX0dOVUNfXyA9PSAzKSAmJiAoX19HTlVDX01JTk9SX18gPj0gMykpIHx8IChfX0dOVUNfXyA+IDMpKQotdm9pZCBmbm9yZCAoKSBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKTsKLSNlbmRpZgotCi12b2lkIGZub3JkICgpIHsgaW50IGk9NDI7IH0KLWludCBtYWluICgpCi17Ci0gIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOwotICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKLQotICBpZiAoc2VsZikKLSAgICB7Ci0gICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKLSAgICAgIGVsc2UKLSAgICAgICAgewotCSAgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOwotICAgICAgICAgIGVsc2UgcHV0cyAoZGxlcnJvciAoKSk7Ci0JfQotICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCi0gICAgfQotICBlbHNlCi0gICAgcHV0cyAoZGxlcnJvciAoKSk7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLV9MVF9FT0YKLSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2xpbmtcIiI7IH0gPiY1Ci0gIChldmFsICRhY19saW5rKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCi0gICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgPiY1IDI+L2Rldi9udWxsCi0gICAgbHRfc3RhdHVzPSQ/Ci0gICAgY2FzZSB4JGx0X3N0YXR1cyBpbgotICAgICAgeCRsdF9kbG5vX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzIDs7Ci0gICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmPXllcyA7OwotICAgICAgeCRsdF9kbHVua25vd258eCopIGx0X2N2X2Rsb3Blbl9zZWxmPW5vIDs7Ci0gICAgZXNhYwotICBlbHNlIDoKLSAgICAjIGNvbXBpbGF0aW9uIGZhaWxlZAotICAgIGx0X2N2X2Rsb3Blbl9zZWxmPW5vCi0gIGZpCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2Rsb3Blbl9zZWxmIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfZGxvcGVuX3NlbGYiID4mNjsgfQotCi0gICAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW5fc2VsZiIgPSB4eWVzOyB0aGVuCi0gICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7bHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgCSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9Y3Jvc3MKLWVsc2UKLSAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgotICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgotI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZiBIQVZFX0RMRkNOX0gKLSNpbmNsdWRlIDxkbGZjbi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgUlRMRF9HTE9CQUwKLSMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKLSNlbHNlCi0jICBpZmRlZiBETF9HTE9CQUwKLSMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKLSMgIGVsc2UKLSMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKLSAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KLSNpZm5kZWYgTFRfRExMQVpZX09SX05PVwotIyAgaWZkZWYgUlRMRF9MQVpZCi0jICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKLSMgIGVsc2UKLSMgICAgaWZkZWYgRExfTEFaWQotIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCi0jICAgIGVsc2UKLSMgICAgICBpZmRlZiBSVExEX05PVwotIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKLSMgICAgICBlbHNlCi0jICAgICAgICBpZmRlZiBETF9OT1cKLSMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCi0jICAgICAgICBlbHNlCi0jICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKLSMgICAgICAgIGVuZGlmCi0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogV2hlbiAtZnZpc2JpbGl0eT1oaWRkZW4gaXMgdXNlZCwgYXNzdW1lIHRoZSBjb2RlIGhhcyBiZWVuIGFubm90YXRlZAotICAgY29ycmVzcG9uZGluZ2x5IGZvciB0aGUgc3ltYm9scyBuZWVkZWQuICAqLwotI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSkgfHwgKF9fR05VQ19fID4gMykpCi12b2lkIGZub3JkICgpIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpOwotI2VuZGlmCi0KLXZvaWQgZm5vcmQgKCkgeyBpbnQgaT00MjsgfQotaW50IG1haW4gKCkKLXsKLSAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7Ci0gIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOwotCi0gIGlmIChzZWxmKQotICAgIHsKLSAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOwotICAgICAgZWxzZQotICAgICAgICB7Ci0JICBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSAgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7Ci0gICAgICAgICAgZWxzZSBwdXRzIChkbGVycm9yICgpKTsKLQl9Ci0gICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICBwdXRzIChkbGVycm9yICgpKTsKLQotICByZXR1cm4gc3RhdHVzOwotfQotX0xUX0VPRgotICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfbGlua1wiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KLSAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSA+JjUgMj4vZGV2L251bGwKLSAgICBsdF9zdGF0dXM9JD8KLSAgICBjYXNlIHgkbHRfc3RhdHVzIGluCi0gICAgICB4JGx0X2Rsbm9fdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzIDs7Ci0gICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMgOzsKLSAgICAgIHgkbHRfZGx1bmtub3dufHgqKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8gOzsKLSAgICBlc2FjCi0gIGVsc2UgOgotICAgICMgY29tcGlsYXRpb24gZmFpbGVkCi0gICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vCi0gIGZpCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY2OyB9Ci0gICAgZmkKLQotICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKLSAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgotICAgIExJQlM9IiRzYXZlX0xJQlMiCi0gICAgOzsKLSAgZXNhYwotCi0gIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmIGluCi0gIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OwotICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OwotICBlc2FjCi0KLSAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIGluCi0gIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7Ci0gICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OwotICBlc2FjCi1maQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLXN0cmlwbGliPQotb2xkX3N0cmlwbGliPQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlLi4uICIgPiY2OyB9Ci1pZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgJEdSRVAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgotICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgotICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAotICBjYXNlICRob3N0X29zIGluCi0gIGRhcndpbiopCi0gICAgaWYgdGVzdCAtbiAiJFNUUklQIiA7IHRoZW4KLSAgICAgIHN0cmlwbGliPSIkU1RSSVAgLXgiCi0gICAgICBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtUyIKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0gICAgZWxzZQotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0gICAgZmkKLSAgICA7OwotICAqKQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotICAgIDs7Ci0gIGVzYWMKLWZpCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0gICMgUmVwb3J0IHdoaWNoIGxpYnJhcnkgdHlwZXMgd2lsbCBhY3R1YWxseSBiZSBidWlsdAotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRjYW5fYnVpbGRfc2hhcmVkIiA+JjUKLSRhc19lY2hvICIkY2FuX2J1aWxkX3NoYXJlZCIgPiY2OyB9Ci0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci0gIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubwotCi0gICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAotICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgYWl4MyopCi0gICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgotICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJwotICAgIGZpCi0gICAgOzsKLQotICBhaXhbNC05XSopCi0gICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgotICAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgICBmaQotICAgIDs7Ci0gIGVzYWMKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc2hhcmVkIiA+JjUKLSRhc19lY2hvICIkZW5hYmxlX3NoYXJlZCIgPiY2OyB9Ci0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci0gICMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgotICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc3RhdGljIiA+JjUKLSRhc19lY2hvICIkZW5hYmxlX3N0YXRpYyIgPiY2OyB9Ci0KLQotCi0KLWZpCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLUNDPSIkbHRfc2F2ZV9DQyIKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotICAgICAgICBhY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgbGlidG9vbCIKLQotCi0KLQotIyBPbmx5IGV4cGFuZCBvbmNlOgotCi0KLQotIyBDaGVja3MgZm9yIGhlYWRlciBmaWxlcy4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLQotZWxzZQotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLQotZWxzZQotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgOgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKLSMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNlbHNlCi0jIGRlZmluZSBJU0xPV0VSKGMpIFwKLQkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKLQkJICAgICB8fCAoJ2onIDw9IChjKSAmJiAoYykgPD0gJ3InKSBcCi0JCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCi0jIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQotI2VuZGlmCi0KLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQKLW1haW4gKCkKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCi0JfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCi0gICAgICByZXR1cm4gMjsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotCi1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgU1REQ19IRUFERVJTIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi1mb3IgYWNfaGVhZGVyIGluIG1hbGxvYy5oIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaAotZG8gOgotICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWV2YWwgYXNfdmFsPVwkJGFzX2FjX0hlYWRlcgotICAgaWYgdGVzdCAieCRhc192YWwiID0geCIieWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLQotZG9uZQotCi0KLSMgQ2hlY2tzIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBhbiBBTlNJIEMtY29uZm9ybWluZyBjb25zdC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9jX2NvbnN0K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLS8qIEZJWE1FOiBJbmNsdWRlIHRoZSBjb21tZW50cyBzdWdnZXN0ZWQgYnkgUGF1bC4gKi8KLSNpZm5kZWYgX19jcGx1c3BsdXMKLSAgLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsKLSAgY29uc3QgY2hhcnNldCBjczsKLSAgLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciBjb25zdCAqY29uc3QgKnBjcGNjOwotICBjaGFyICoqcHBjOwotICAvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotICBzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci0gIHN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotICAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluCi0gICAgIGFuIGFybSBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQKLSAgICAgZXhwcmVzc2lvbiAqLwotICBjb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci0gIHBjcGNjID0gJmcgKyAoZyA/IGctZyA6IDApOwotICAvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotICArK3BjcGNjOwotICBwcGMgPSAoY2hhcioqKSBwY3BjYzsKLSAgcGNwY2MgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcHBjOwotICB7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICAgIGNoYXIgKnQ7Ci0gICAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAgICp0KysgPSAwOwotICAgIGlmIChzKSByZXR1cm4gMDsKLSAgfQotICB7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICAgIGludCB4W10gPSB7MjUsIDE3fTsKLSAgICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICAgICsrZm9vOwotICB9Ci0gIHsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICAgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICAgIGlwdHIgcCA9IDA7Ci0gICAgKytwOwotICB9Ci0gIHsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICAgIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLSAgfQotICB7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICAgIGNvbnN0IGludCBmb28gPSAxMDsKLSAgICBpZiAoIWZvbykgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuICFjc1swXSAmJiAhemVyby54OwotI2VuZGlmCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2NvbnN0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfY19jb25zdCIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgY29uc3QgLyoqLyIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLWFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInNpemVfdCIgImFjX2N2X3R5cGVfc2l6ZV90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc2l6ZV90IiA9IHgiInllczsgdGhlbiA6Ci0KLWVsc2UKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgaW50Ci1fQUNFT0YKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHN0cnVjdCB0bSBpcyBpbiBzeXMvdGltZS5oIG9yIHRpbWUuaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHN0cnVjdCB0bSBpcyBpbiBzeXMvdGltZS5oIG9yIHRpbWUuaC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zdHJ1Y3RfdG0rc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi1pbnQKLW1haW4gKCkKLXsKLXN0cnVjdCB0bSB0bTsKLQkJCQkgICAgIGludCAqcCA9ICZ0bS50bV9zZWM7Ci0JCQkJICAgICByZXR1cm4gIXA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3Zfc3RydWN0X3RtPXRpbWUuaAotZWxzZQotICBhY19jdl9zdHJ1Y3RfdG09c3lzL3RpbWUuaAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc3RydWN0X3RtIiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfc3RydWN0X3RtIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X3N0cnVjdF90bSA9IHN5cy90aW1lLmg7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgVE1fSU5fU1lTX1RJTUUgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQotIyBDaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igd29ya2luZyBzdHJ0b2QiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgc3RydG9kLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RydG9kK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICBhY19jdl9mdW5jX3N0cnRvZD1ubwotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0jaWZuZGVmIHN0cnRvZAotZG91YmxlIHN0cnRvZCAoKTsKLSNlbmRpZgotaW50Ci1tYWluKCkKLXsKLSAgewotICAgIC8qIFNvbWUgdmVyc2lvbnMgb2YgTGludXggc3RydG9kIG1pcy1wYXJzZSBzdHJpbmdzIHdpdGggbGVhZGluZyAnKycuICAqLwotICAgIGNoYXIgKnN0cmluZyA9ICIgKzY5IjsKLSAgICBjaGFyICp0ZXJtOwotICAgIGRvdWJsZSB2YWx1ZTsKLSAgICB2YWx1ZSA9IHN0cnRvZCAoc3RyaW5nLCAmdGVybSk7Ci0gICAgaWYgKHZhbHVlICE9IDY5IHx8IHRlcm0gIT0gKHN0cmluZyArIDQpKQotICAgICAgcmV0dXJuIDE7Ci0gIH0KLQotICB7Ci0gICAgLyogVW5kZXIgU29sYXJpcyAyLjQsIHN0cnRvZCByZXR1cm5zIHRoZSB3cm9uZyB2YWx1ZSBmb3IgdGhlCi0gICAgICAgdGVybWluYXRpbmcgY2hhcmFjdGVyIHVuZGVyIHNvbWUgY29uZGl0aW9ucy4gICovCi0gICAgY2hhciAqc3RyaW5nID0gIk5hTiI7Ci0gICAgY2hhciAqdGVybTsKLSAgICBzdHJ0b2QgKHN0cmluZywgJnRlcm0pOwotICAgIGlmICh0ZXJtICE9IHN0cmluZyAmJiAqKHRlcm0gLSAxKSA9PSAwKQotICAgICAgcmV0dXJuIDE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfc3RydG9kPXllcwotZWxzZQotICBhY19jdl9mdW5jX3N0cnRvZD1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfc3RydG9kIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfZnVuY19zdHJ0b2QiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfZnVuY19zdHJ0b2QgPSBubzsgdGhlbgotICBjYXNlICIgJExJQk9CSlMgIiBpbgotICAqIiBzdHJ0b2QuJGFjX29iamV4dCAiKiApIDs7Ci0gICopIExJQk9CSlM9IiRMSUJPQkpTIHN0cnRvZC4kYWNfb2JqZXh0IgotIDs7Ci1lc2FjCi0KLWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInBvdyIgImFjX2N2X2Z1bmNfcG93IgotaWYgdGVzdCAieCRhY19jdl9mdW5jX3BvdyIgPSB4IiJ5ZXM7IHRoZW4gOgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX3BvdyA9IG5vOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHBvdyBpbiAtbG0iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHBvdyBpbiAtbG0uLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX21fcG93K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxtICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBwb3cgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBwb3cgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX21fcG93PXllcwotZWxzZQotICBhY19jdl9saWJfbV9wb3c9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX21fcG93IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX21fcG93IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX21fcG93IiA9IHgiInllczsgdGhlbiA6Ci0gIFBPV19MSUI9LWxtCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY2Fubm90IGZpbmQgbGlicmFyeSBjb250YWluaW5nIGRlZmluaXRpb24gb2YgcG93IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhbm5vdCBmaW5kIGxpYnJhcnkgY29udGFpbmluZyBkZWZpbml0aW9uIG9mIHBvdyIgPiYyO30KLWZpCi0KLWZpCi0KLWZpCi0KLWZvciBhY19mdW5jIGluIG1lbXNldAotZG8gOgotICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJtZW1zZXQiICJhY19jdl9mdW5jX21lbXNldCIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19tZW1zZXQiID0geCIieWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX01FTVNFVCAxCi1fQUNFT0YKLQotZWxzZQotICBhc19mbl9lcnJvciAibWVtc2V0IG5vdCBmb3VuZCBpbiBsaWJjIiAiJExJTkVOTyIgNQotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gcG93Ci1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInBvdyIgImFjX2N2X2Z1bmNfcG93IgotaWYgdGVzdCAieCRhY19jdl9mdW5jX3BvdyIgPSB4IiJ5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfUE9XIDEKLV9BQ0VPRgotCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHBvdyBpbiAtbG0iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHBvdyBpbiAtbG0uLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX21fcG93K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxtICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBwb3cgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBwb3cgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX21fcG93PXllcwotZWxzZQotICBhY19jdl9saWJfbV9wb3c9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX21fcG93IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX21fcG93IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX21fcG93IiA9IHgiInllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJNIDEKLV9BQ0VPRgotCi0gIExJQlM9Ii1sbSAkTElCUyIKLQotZWxzZQotICBhc19mbl9lcnJvciAiY2Fubm90IGZpbmQgcG93IiAiJExJTkVOTyIgNQotZmkKLQotZmkKLWRvbmUKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgemxpYlZlcnNpb24gaW4gLWx6IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciB6bGliVmVyc2lvbiBpbiAtbHouLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX3pfemxpYlZlcnNpb24rc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHogICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHpsaWJWZXJzaW9uICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gemxpYlZlcnNpb24gKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3pfemxpYlZlcnNpb249eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl96X3psaWJWZXJzaW9uPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl96X3psaWJWZXJzaW9uIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3pfemxpYlZlcnNpb24iID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfel96bGliVmVyc2lvbiIgPSB4IiJ5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfTElCWiAxCi1fQUNFT0YKLQotICBMSUJTPSItbHogJExJQlMiCi0KLWVsc2UKLSAgYXNfZm5fZXJyb3IgInpsaWIgbm90IGluc3RhbGxlZCIgIiRMSU5FTk8iIDUKLWZpCi0KLQotY2FzZSAkaG9zdF9vcyBpbgotICBhaXgqKQotICAgTElCUE5HX0RFRklORVM9Ii1EUE5HX0NPTkZJR1VSRV9MSUJQTkcgLURfQUxMX1NPVVJDRSI7OwotICAqKQotICAgTElCUE5HX0RFRklORVM9LURQTkdfQ09ORklHVVJFX0xJQlBORzs7Ci1lc2FjCi1MSUJQTkdfREVGSU5FUz0kTElCUE5HX0RFRklORVMKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGxpYnJhcmllcyBjYW4gYmUgdmVyc2lvbmVkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIGxpYnJhcmllcyBjYW4gYmUgdmVyc2lvbmVkLi4uICIgPiY2OyB9Ci0jIFNwZWNpYWwgY2FzZSBmb3IgUEUvQ09GRiBwbGF0Zm9ybXM6IGxkIHJlcG9ydHMKLSMgc3VwcG9ydCBmb3IgdmVyc2lvbi1zY3JpcHQsIGJ1dCBkb2Vzbid0IGFjdHVhbGx5Ci0jIERPIGFueXRoaW5nIHdpdGggaXQuCi1jYXNlICRob3N0IGluCi0qY3lnd2luKiB8ICptaW5ndzMyKiApCi0gICAgaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdD1ubwotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotOzsKLSogKQotR0xEPWAkTEQgLS1oZWxwIDwgL2Rldi9udWxsIDI+L2Rldi9udWxsIHwgZ3JlcCB2ZXJzaW9uLXNjcmlwdGAKLWlmIHRlc3QgIiRHTEQiOyB0aGVuCi0gICAgaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdD15ZXMKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZWxzZQotICAgIGhhdmVfbGRfdmVyc2lvbl9zY3JpcHQ9bm8KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICoqKiBZb3UgaGF2ZSBub3QgZW5hYmxlZCB2ZXJzaW9uZWQgc3ltYm9scy4iID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogKioqIFlvdSBoYXZlIG5vdCBlbmFibGVkIHZlcnNpb25lZCBzeW1ib2xzLiIgPiYyO30KLWZpCi07OwotZXNhYwotCi0gaWYgdGVzdCAiJGhhdmVfbGRfdmVyc2lvbl9zY3JpcHQiID0gInllcyI7IHRoZW4KLSAgSEFWRV9MRF9WRVJTSU9OX1NDUklQVF9UUlVFPQotICBIQVZFX0xEX1ZFUlNJT05fU0NSSVBUX0ZBTFNFPScjJwotZWxzZQotICBIQVZFX0xEX1ZFUlNJT05fU0NSSVBUX1RSVUU9JyMnCi0gIEhBVkVfTERfVkVSU0lPTl9TQ1JJUFRfRkFMU0U9Ci1maQotCi0KLWlmIHRlc3QgIiRoYXZlX2xkX3ZlcnNpb25fc2NyaXB0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3ltYm9sIHByZWZpeCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3ltYm9sIHByZWZpeC4uLiAiID4mNjsgfQotICAgIFNZTUJPTF9QUkVGSVg9YGVjaG8gIlBSRUZJWD1fX1VTRVJfTEFCRUxfUFJFRklYX18iIFwKLSAgICAgICAgICAgICAgICAgICB8ICR7Q1BQLSR7Q0MtZ2NjfSAtRX0gLSAyPiYxIFwKLSAgICAgICAgICAgICAgICAgICB8ICR7RUdSRVAtZ3JlcH0gIl5QUkVGSVg9IiBcCi0gICAgICAgICAgICAgICAgICAgfCAke1NFRC1zZWR9ICJzOl5QUkVGSVg9OjoiYAotCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRTWU1CT0xfUFJFRklYIiA+JjUKLSRhc19lY2hvICIkU1lNQk9MX1BSRUZJWCIgPiY2OyB9Ci1maQotCi0jIFN1YnN0aXR1dGlvbnMgZm9yIC5pbiBmaWxlcwotCi0KLQotCi0KLSMgQWRkaXRpb25hbCBhcmd1bWVudHMgKGFuZCBzdWJzdGl0dXRpb25zKQotIyBBbGxvdyB0aGUgcGtnLWNvbmZpZyBkaXJlY3RvcnkgdG8gYmUgc2V0Ci0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcGtnY29uZmlnZGlyIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9wa2djb25maWdkaXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3BrZ2NvbmZpZ2RpcjsgcGtnY29uZmlnZGlyPSR7d2l0aHZhbH0KLWVsc2UKLSAgcGtnY29uZmlnZGlyPScke2xpYmRpcn0vcGtnY29uZmlnJwotZmkKLQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcGtnY29uZmlnIGRpcmVjdG9yeSBpcyAke3BrZ2NvbmZpZ2Rpcn0iID4mNQotJGFzX2VjaG8gIiRhc19tZTogcGtnY29uZmlnIGRpcmVjdG9yeSBpcyAke3BrZ2NvbmZpZ2Rpcn0iID4mNjt9Ci0KLSMgTWFrZSB0aGUgKi1jb25maWcgYmluYXJ5IGNvbmZpZyBzY3JpcHRzIG9wdGlvbmFsCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtYmluY29uZmlncyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfYmluY29uZmlncytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfYmluY29uZmlnczsgaWYgdGVzdCAiJHt3aXRodmFsfSIgPSBubzsgdGhlbgotCQliaW5jb25maWdzPQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxpYnBuZy1jb25maWcgc2NyaXB0cyB3aWxsIG5vdCBiZSBidWlsdCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBsaWJwbmctY29uZmlnIHNjcmlwdHMgd2lsbCBub3QgYmUgYnVpbHQiID4mNjt9Ci0JZWxzZQotCQliaW5jb25maWdzPScke2JpbmNvbmZpZ3N9JwotCWZpCi1lbHNlCi0gIGJpbmNvbmZpZ3M9JyR7YmluY29uZmlnc30nCi1maQotCi0KLQotIyBDb25maWcgZmlsZXMsIHN1YnN0aXR1dGluZyBhcyBhYm92ZQotYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIE1ha2VmaWxlIGxpYnBuZy5wYzpsaWJwbmcucGMuaW4iCi0KLWFjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBsaWJwbmctY29uZmlnOmxpYnBuZy1jb25maWcuaW4iCi0KLQotY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KLSMgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLiAgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3QKLSMgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQKLSMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aGVuCi0jIGxvYWRpbmcgdGhpcyBmaWxlLCBvdGhlciAqdW5zZXQqIGBhY19jdl9mb28nIHdpbGwgYmUgYXNzaWduZWQgdGhlCi0jIGZvbGxvd2luZyB2YWx1ZXMuCi0KLV9BQ0VPRgotCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIHdlIGtpbGwgdmFyaWFibGVzIGNvbnRhaW5pbmcgbmV3bGluZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oCi0gIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnYDsgZG8KLSAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgICBjYXNlICRhY192YWwgaW4gIygKLSAgICAqJHthc19ubH0qKQotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICAqX2N2XyopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mMjt9IDs7Ci0gICAgICBlc2FjCi0gICAgICBjYXNlICRhY192YXIgaW4gIygKLSAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKLSAgICAgIEJBU0hfQVJHViB8IEJBU0hfU09VUkNFKSBldmFsICRhY192YXI9IDs7ICMoCi0gICAgICAqKSB7IGV2YWwgJGFjX3Zhcj07IHVuc2V0ICRhY192YXI7fSA7OwotICAgICAgZXNhYyA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIChzZXQpIDI+JjEgfAotICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nICc7IHNldCkgMj4mMWAgaW4gIygKLSAgICAqJHthc19ubH1hY19zcGFjZT1cICopCi0gICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlczogZG91YmxlLXF1b3RlCi0gICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcLgotICAgICAgc2VkIC1uIFwKLQkicy8nLydcXFxcJycvZzsKLQkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKLSAgICAgIDs7ICMoCi0gICAgKikKLSAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pIHwKLSAgc2VkICcKLSAgICAgL15hY19jdl9lbnZfL2IgZW5kCi0gICAgIHQgY2xlYXIKLSAgICAgOmNsZWFyCi0gICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KLSAgICAgdCBlbmQKLSAgICAgcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCi0gICAgIDplbmQnID4+Y29uZmNhY2hlCi1pZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiICYmCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICAgIGNhdCBjb25mY2FjaGUgPiRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotYWNfbGlib2Jqcz0KLWFjX2x0bGlib2Jqcz0KLWZvciBhY19pIGluIDogJExJQk9CSlM7IGRvIHRlc3QgIngkYWNfaSIgPSB4OiAmJiBjb250aW51ZQotICAjIDEuIFJlbW92ZSB0aGUgZXh0ZW5zaW9uLCBhbmQgJFUgaWYgYWxyZWFkeSBpbnN0YWxsZWQuCi0gIGFjX3NjcmlwdD0ncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJwotICBhY19pPWAkYXNfZWNobyAiJGFjX2kiIHwgc2VkICIkYWNfc2NyaXB0ImAKLSAgIyAyLiBQcmVwZW5kIExJQk9CSkRJUi4gIFdoZW4gdXNlZCB3aXRoIGF1dG9tYWtlPj0xLjEwIExJQk9CSkRJUgotICAjICAgIHdpbGwgYmUgc2V0IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgTElCT0JKUyBvYmplY3RzIGFyZSBidWlsdC4KLSAgYXNfZm5fYXBwZW5kIGFjX2xpYm9ianMgIiBcJHtMSUJPQkpESVJ9JGFjX2lcJFUuJGFjX29iamV4dCIKLSAgYXNfZm5fYXBwZW5kIGFjX2x0bGlib2JqcyAiIFwke0xJQk9CSkRJUn0kYWNfaSInJFUubG8nCi1kb25lCi1MSUJPQkpTPSRhY19saWJvYmpzCi0KLUxUTElCT0JKUz0kYWNfbHRsaWJvYmpzCi0KLQotIGlmIHRlc3QgLW4gIiRFWEVFWFQiOyB0aGVuCi0gIGFtX19FWEVFWFRfVFJVRT0KLSAgYW1fX0VYRUVYVF9GQUxTRT0nIycKLWVsc2UKLSAgYW1fX0VYRUVYVF9UUlVFPScjJwotICBhbV9fRVhFRVhUX0ZBTFNFPQotZmkKLQotaWYgdGVzdCAteiAiJHtNQUlOVEFJTkVSX01PREVfVFJVRX0iICYmIHRlc3QgLXogIiR7TUFJTlRBSU5FUl9NT0RFX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiTUFJTlRBSU5FUl9NT0RFXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1Ci1maQotaWYgdGVzdCAteiAiJHtBTURFUF9UUlVFfSIgJiYgdGVzdCAteiAiJHtBTURFUF9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIkFNREVQXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1Ci1maQotaWYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENDX1RSVUV9IiAmJiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJhbV9fZmFzdGRlcENDXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1Ci1maQotaWYgdGVzdCAteiAiJHtIQVZFX0xEX1ZFUlNJT05fU0NSSVBUX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTERfVkVSU0lPTl9TQ1JJUFRfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJIQVZFX0xEX1ZFUlNJT05fU0NSSVBUXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1Ci1maQotCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci1hY193cml0ZV9mYWlsPTAKLWFjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCi1hY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KLWFzX3dyaXRlX2ZhaWw9MAotY2F0ID4kQ09ORklHX1NUQVRVUyA8PF9BU0VPRiB8fCBhc193cml0ZV9mYWlsPTEKLSMhICRTSEVMTAotIyBHZW5lcmF0ZWQgYnkgJGFzX21lLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWRlYnVnPWZhbHNlCi1hY19jc19yZWNoZWNrPWZhbHNlCi1hY19jc19zaWxlbnQ9ZmFsc2UKLQotU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KLWV4cG9ydCBTSEVMTAotX0FTRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0KLSMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQotRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gIygKLSAgKnBvc2l4KikgOgotICAgIHNldCAtbyBwb3NpeCA7OyAjKAotICAqKSA6Ci0gICAgIDs7Ci1lc2FjCi1maQotCi0KLWFzX25sPScKLScKLWV4cG9ydCBhc19ubAotIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KLWFzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCi1hc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KLWFzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCi0jIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKLSMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCi1pZiB0ZXN0IC16ICIkQkFTSF9WRVJTSU9OJFpTSF9WRVJTSU9OIiBcCi0gICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19lY2hvPSdwcmludCAtciAtLScKLSAgYXNfZWNob19uPSdwcmludCAtcm4gLS0nCi1lbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2VjaG89J3ByaW50ZiAlc1xuJwotICBhc19lY2hvX249J3ByaW50ZiAlcycKLWVsc2UKLSAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCi0gICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKLSAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCi0gIGVsc2UKLSAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJwotICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCi0gICAgICBhcmc9JDE7Ci0gICAgICBjYXNlICRhcmcgaW4gIygKLSAgICAgICoiJGFzX25sIiopCi0JZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7Ci0JYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKLSAgICAgIGVzYWM7Ci0gICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCi0gICAgJwotICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQotICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCi0gIGZpCi0gIGV4cG9ydCBhc19lY2hvX2JvZHkKLSAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJwotZmkKLQotIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCi1pZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgotICBQQVRIX1NFUEFSQVRPUj06Ci0gIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKLSAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAotICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCi0gIH0KLWZpCi0KLQotIyBJRlMKLSMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCi0jIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KLSMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAotIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQotSUZTPSIgIiIJJGFzX25sIgotCi0jIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgotY2FzZSAkMCBpbiAjKCgKLSAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gICAgIDs7Ci1lc2FjCi0jIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCi0jIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KLWlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KLSAgYXNfbXlzZWxmPSQwCi1maQotaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgotICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgotICBleGl0IDEKLWZpCi0KLSMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KLSMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKLSMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKLSMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCi1mb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICi1kbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAotICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKLWRvbmUKLVBTMT0nJCAnCi1QUzI9Jz4gJwotUFM0PScrICcKLQotIyBOTFMgbnVpc2FuY2VzLgotTENfQUxMPUMKLWV4cG9ydCBMQ19BTEwKLUxBTkdVQUdFPUMKLWV4cG9ydCBMQU5HVUFHRQotCi0jIENEUEFUSC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotCi0jIGFzX2ZuX2Vycm9yIEVSUk9SIFtMSU5FTk8gTE9HX0ZEXQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgT3V0cHV0ICJgYmFzZW5hbWUgJDBgOiBlcnJvcjogRVJST1IiIHRvIHN0ZGVyci4gSWYgTElORU5PIGFuZCBMT0dfRkQgYXJlCi0jIHByb3ZpZGVkLCBhbHNvIG91dHB1dCB0aGUgZXJyb3IgdG8gTE9HX0ZELCByZWZlcmVuY2luZyBMSU5FTk8uIFRoZW4gZXhpdCB0aGUKLSMgc2NyaXB0IHdpdGggc3RhdHVzICQ/LCB1c2luZyAxIGlmIHRoYXQgd2FzIDAuCi1hc19mbl9lcnJvciAoKQotewotICBhc19zdGF0dXM9JD87IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQotICBpZiB0ZXN0ICIkMyI7IHRoZW4KLSAgICBhc19saW5lbm89JHthc19saW5lbm8tIiQyIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6ICQxIiA+JiQzCi0gIGZpCi0gICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkMSIgPiYyCi0gIGFzX2ZuX2V4aXQgJGFzX3N0YXR1cwotfSAjIGFzX2ZuX2Vycm9yCi0KLQotIyBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTZXQgJD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCi1hc19mbl9zZXRfc3RhdHVzICgpCi17Ci0gIHJldHVybiAkMQotfSAjIGFzX2ZuX3NldF9zdGF0dXMKLQotIyBhc19mbl9leGl0IFNUQVRVUwotIyAtLS0tLS0tLS0tLS0tLS0tLQotIyBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCi1hc19mbl9leGl0ICgpCi17Ci0gIHNldCArZQotICBhc19mbl9zZXRfc3RhdHVzICQxCi0gIGV4aXQgJDEKLX0gIyBhc19mbl9leGl0Ci0KLSMgYXNfZm5fdW5zZXQgVkFSCi0jIC0tLS0tLS0tLS0tLS0tLQotIyBQb3J0YWJseSB1bnNldCBWQVIuCi1hc19mbl91bnNldCAoKQotewotICB7IGV2YWwgJDE9OyB1bnNldCAkMTt9Ci19Ci1hc191bnNldD1hc19mbl91bnNldAotIyBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQotIyBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCi0jIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCi0jIGltcGxlbWVudGF0aW9ucy4KLWlmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKLSAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCi0gIHsKLSAgICBldmFsICQxKz1cJDIKLSAgfScKLWVsc2UKLSAgYXNfZm5fYXBwZW5kICgpCi0gIHsKLSAgICBldmFsICQxPVwkJDFcJDIKLSAgfQotZmkgIyBhc19mbl9hcHBlbmQKLQotIyBhc19mbl9hcml0aCBBUkcuLi4KLSMgLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKLSMgZ2xvYmFsICRhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cwotIyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci4KLWlmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgotICBldmFsICdhc19mbl9hcml0aCAoKQotICB7Ci0gICAgYXNfdmFsPSQoKCAkKiApKQotICB9JwotZWxzZQotICBhc19mbl9hcml0aCAoKQotICB7Ci0gICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKLSAgfQotZmkgIyBhc19mbl9hcml0aAotCi0KLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCi0gICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgotICBhc19leHByPWV4cHIKLWVsc2UKLSAgYXNfZXhwcj1mYWxzZQotZmkKLQotaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgotICBhc19iYXNlbmFtZT1iYXNlbmFtZQotZWxzZQotICBhc19iYXNlbmFtZT1mYWxzZQotZmkKLQotaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX2Rpcm5hbWU9ZGlybmFtZQotZWxzZQotICBhc19kaXJuYW1lPWZhbHNlCi1maQotCi1hc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKLSRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWC8iJDAiIHwKLSAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwvXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwvXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0KLSMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KLWFzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwotYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCi1hc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKLWFzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKLWFzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cwotCi1FQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQotY2FzZSBgZWNobyAtbiB4YCBpbiAjKCgoKCgKLS1uKikKLSAgY2FzZSBgZWNobyAneHlcYydgIGluCi0gICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgotICB4eSkgIEVDSE9fQz0nXGMnOzsKLSAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAotICAgICAgIEVDSE9fVD0nCSc7OwotICBlc2FjOzsKLSopCi0gIEVDSE9fTj0nLW4nOzsKLWVzYWMKLQotcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKLWlmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgotICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCi1lbHNlCi0gIHJtIC1mIGNvbmYkJC5kaXIKLSAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAotZmkKLWlmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KLSAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYXNfbG5fcz0nbG4gLXMnCi0gICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKLSAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgotICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgotICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCi0gICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAotICAgICAgYXNfbG5fcz0nY3AgLXAnCi0gIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYXNfbG5fcz1sbgotICBlbHNlCi0gICAgYXNfbG5fcz0nY3AgLXAnCi0gIGZpCi1lbHNlCi0gIGFzX2xuX3M9J2NwIC1wJwotZmkKLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKLXJtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKLQotCi0jIGFzX2ZuX21rZGlyX3AKLSMgLS0tLS0tLS0tLS0tLQotIyBDcmVhdGUgIiRhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuCi1hc19mbl9ta2Rpcl9wICgpCi17Ci0KLSAgY2FzZSAkYXNfZGlyIGluICMoCi0gIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKLSAgZXNhYwotICB0ZXN0IC1kICIkYXNfZGlyIiB8fCBldmFsICRhc19ta2Rpcl9wIHx8IHsKLSAgICBhc19kaXJzPQotICAgIHdoaWxlIDo7IGRvCi0gICAgICBjYXNlICRhc19kaXIgaW4gIygKLSAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAotICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKLSAgICAgIGVzYWMKLSAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCi0gICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAotJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJGFzX2RpciIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhawotICAgIGRvbmUKLSAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCi0gIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgYXNfZm5fZXJyb3IgImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiCi0KLQotfSAjIGFzX2ZuX21rZGlyX3AKLWlmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJwotZWxzZQotICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAotICBhc19ta2Rpcl9wPWZhbHNlCi1maQotCi1pZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Rlc3RfeD0ndGVzdCAteCcKLWVsc2UKLSAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgYXNfbHNfTF9vcHRpb249TAotICBlbHNlCi0gICAgYXNfbHNfTF9vcHRpb249Ci0gIGZpCi0gIGFzX3Rlc3RfeD0nCi0gICAgZXZhbCBzaCAtYyAnXCcnCi0gICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KLQl0ZXN0IC1kICIkMS8uIjsKLSAgICAgIGVsc2UKLQljYXNlICQxIGluICMoCi0JLSopc2V0ICIuLyQxIjs7Ci0JZXNhYzsKLQljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbiAjKCgKLQk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCi0gICAgJ1wnJyBzaAotICAnCi1maQotYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgotYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCi1hc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0KLWV4ZWMgNj4mMQotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE1haW4gYm9keSBvZiAkQ09ORklHX1NUQVRVUyBzY3JpcHQuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTRU9GCi10ZXN0ICRhc193cml0ZV9mYWlsID0gMCAmJiBjaG1vZCAreCAkQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkMCBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCi0jIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKLSMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCi1hY19sb2c9IgotVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBsaWJwbmcgJGFzX21lIDEuNC4xMiwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjUuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKLQotICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCi0gIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUwotICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCi0gIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKLSAgJCAkMCAkQAotCi1vbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLSIKLQotX0FDRU9GCi0KLWNhc2UgJGFjX2NvbmZpZ19maWxlcyBpbiAqIgotIiopIHNldCB4ICRhY19jb25maWdfZmlsZXM7IHNoaWZ0OyBhY19jb25maWdfZmlsZXM9JCo7OwotZXNhYwotCi1jYXNlICRhY19jb25maWdfaGVhZGVycyBpbiAqIgotIiopIHNldCB4ICRhY19jb25maWdfaGVhZGVyczsgc2hpZnQ7IGFjX2NvbmZpZ19oZWFkZXJzPSQqOzsKLWVzYWMKLQotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLSMgRmlsZXMgdGhhdCBjb25maWcuc3RhdHVzIHdhcyBtYWRlIGZvci4KLWNvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyIKLWNvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMiCi1jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMiCi0KLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1hY19jc191c2FnZT0iXAotXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBhY3Rpb25zCi1mcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gIFVubGVzcyB0aGUgZmlsZXMKLWFuZCBhY3Rpb25zIGFyZSBzcGVjaWZpZWQgYXMgVEFHcywgYWxsIGFyZSBpbnN0YW50aWF0ZWQgYnkgZGVmYXVsdC4KLQotVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtUQUddLi4uCi0KLSAgLWgsIC0taGVscCAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtViwgLS12ZXJzaW9uICAgIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBjb25maWd1cmF0aW9uIHNldHRpbmdzLCB0aGVuIGV4aXQKLSAgICAgIC0tY29uZmlnICAgICBwcmludCBjb25maWd1cmF0aW9uLCB0aGVuIGV4aXQKLSAgLXEsIC0tcXVpZXQsIC0tc2lsZW50Ci0gICAgICAgICAgICAgICAgICAgZG8gbm90IHByaW50IHByb2dyZXNzIG1lc3NhZ2VzCi0gIC1kLCAtLWRlYnVnICAgICAgZG9uJ3QgcmVtb3ZlIHRlbXBvcmFyeSBmaWxlcwotICAgICAgLS1yZWNoZWNrICAgIHVwZGF0ZSAkYXNfbWUgYnkgcmVjb25maWd1cmluZyBpbiB0aGUgc2FtZSBjb25kaXRpb25zCi0gICAgICAtLWZpbGU9RklMRVs6VEVNUExBVEVdCi0gICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBGSUxFCi0gICAgICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0KLSAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBoZWFkZXIgRklMRQotCi1Db25maWd1cmF0aW9uIGZpbGVzOgotJGNvbmZpZ19maWxlcwotCi1Db25maWd1cmF0aW9uIGhlYWRlcnM6Ci0kY29uZmlnX2hlYWRlcnMKLQotQ29uZmlndXJhdGlvbiBjb21tYW5kczoKLSRjb25maWdfY29tbWFuZHMKLQotUmVwb3J0IGJ1Z3MgdG8gPHBuZy1tbmctaW1wbGVtZW50QGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4uIgotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotYWNfY3NfY29uZmlnPSJgJGFzX2VjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvXiAvLzsgcy9bXFwiIlxgXCRdL1xcXFwmL2cnYCIKLWFjX2NzX3ZlcnNpb249IlxcCi1saWJwbmcgY29uZmlnLnN0YXR1cyAxLjQuMTIKLWNvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42NSwKLSAgd2l0aCBvcHRpb25zIFxcIlwkYWNfY3NfY29uZmlnXFwiCi0KLUNvcHlyaWdodCAoQykgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKLQotYWNfcHdkPSckYWNfcHdkJwotc3JjZGlyPSckc3JjZGlyJwotSU5TVEFMTD0nJElOU1RBTEwnCi1NS0RJUl9QPSckTUtESVJfUCcKLUFXSz0nJEFXSycKLXRlc3QgLW4gIlwkQVdLIiB8fCBBV0s9YXdrCi1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotIyBUaGUgZGVmYXVsdCBsaXN0cyBhcHBseSBpZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGFueSBmaWxlLgotYWNfbmVlZF9kZWZhdWx0cz06Ci13aGlsZSB0ZXN0ICQjICE9IDAKLWRvCi0gIGNhc2UgJDEgaW4KLSAgLS0qPSopCi0gICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKLSAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCi0gICAgYWNfc2hpZnQ9OgotICAgIDs7Ci0gICopCi0gICAgYWNfb3B0aW9uPSQxCi0gICAgYWNfb3B0YXJnPSQyCi0gICAgYWNfc2hpZnQ9c2hpZnQKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGFjX2NzX3JlY2hlY2s9OiA7OwotICAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYgfCAtViApCi0gICAgJGFzX2VjaG8gIiRhY19jc192ZXJzaW9uIjsgZXhpdCA7OwotICAtLWNvbmZpZyB8IC0tY29uZmkgfCAtLWNvbmYgfCAtLWNvbiB8IC0tY28gfCAtLWMgKQotICAgICRhc19lY2hvICIkYWNfY3NfY29uZmlnIjsgZXhpdCA7OwotICAtLWRlYnVnIHwgLS1kZWJ1IHwgLS1kZWIgfCAtLWRlIHwgLS1kIHwgLWQgKQotICAgIGRlYnVnPTogOzsKLSAgLS1maWxlIHwgLS1maWwgfCAtLWZpIHwgLS1mICkKLSAgICAkYWNfc2hpZnQKLSAgICBjYXNlICRhY19vcHRhcmcgaW4KLSAgICAqXCcqKSBhY19vcHRhcmc9YCRhc19lY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotICAgIGVzYWMKLSAgICBhc19mbl9hcHBlbmQgQ09ORklHX0ZJTEVTICIgJyRhY19vcHRhcmcnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlYWRlciB8IC0taGVhZGUgfCAtLWhlYWQgfCAtLWhlYSApCi0gICAgJGFjX3NoaWZ0Ci0gICAgY2FzZSAkYWNfb3B0YXJnIGluCi0gICAgKlwnKikgYWNfb3B0YXJnPWAkYXNfZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKLSAgICBlc2FjCi0gICAgYXNfZm5fYXBwZW5kIENPTkZJR19IRUFERVJTICIgJyRhY19vcHRhcmcnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlIHwgLS1oKQotICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCi0gICAgYXNfZm5fZXJyb3IgImFtYmlndW91cyBvcHRpb246IFxgJDEnCi1UcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiI7OwotICAtLWhlbHAgfCAtLWhlbCB8IC1oICkKLSAgICAkYXNfZWNobyAiJGFjX2NzX3VzYWdlIjsgZXhpdCA7OwotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCB8IC0tc2kgfCAtLXMpCi0gICAgYWNfY3Nfc2lsZW50PTogOzsKLQotICAjIFRoaXMgaXMgYW4gZXJyb3IuCi0gIC0qKSBhc19mbl9lcnJvciAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkMScKLVRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA7OwotCi0gICopIGFzX2ZuX2FwcGVuZCBhY19jb25maWdfdGFyZ2V0cyAiICQxIgotICAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlIDs7Ci0KLSAgZXNhYwotICBzaGlmdAotZG9uZQotCi1hY19jb25maWd1cmVfZXh0cmFfYXJncz0KLQotaWYgJGFjX2NzX3NpbGVudDsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi0gIGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPSIkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1zaWxlbnQiCi1maQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotaWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCi0gIHNldCBYICckU0hFTEwnICckMCcgJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KLSAgc2hpZnQKLSAgXCRhc19lY2hvICJydW5uaW5nIENPTkZJR19TSEVMTD0kU0hFTEwgXCQqIiA+JjYKLSAgQ09ORklHX1NIRUxMPSckU0hFTEwnCi0gIGV4cG9ydCBDT05GSUdfU0hFTEwKLSAgZXhlYyAiXCRAIgotZmkKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1leGVjIDU+PmNvbmZpZy5sb2cKLXsKLSAgZWNobwotICBzZWQgJ2g7cy8uLy0vZztzL14uLi4vIyMgLztzLy4uLiQvICMjLztwO3g7cDt4JyA8PF9BU0JPWAotIyMgUnVubmluZyAkYXNfbWUuICMjCi1fQVNCT1gKLSAgJGFzX2VjaG8gIiRhY19sb2ciCi19ID4mNQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotIwotIyBJTklULUNPTU1BTkRTCi0jCi1BTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiCi0KLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JwotZG91YmxlX3F1b3RlX3N1YnN0PSckZG91YmxlX3F1b3RlX3N1YnN0JwotZGVsYXlfdmFyaWFibGVfc3Vic3Q9JyRkZWxheV92YXJpYWJsZV9zdWJzdCcKLVNFRD0nYCRFQ0hPICIkU0VEIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLVhzZWQ9J2AkRUNITyAiJFhzZWQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotR1JFUD0nYCRFQ0hPICIkR1JFUCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1FR1JFUD0nYCRFQ0hPICIkRUdSRVAiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotRkdSRVA9J2AkRUNITyAiJEZHUkVQIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLVNIRUxMPSdgJEVDSE8gIiRTSEVMTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1FQ0hPPSdgJEVDSE8gIiRFQ0hPIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLUxEPSdgJEVDSE8gIiRMRCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1tYWNyb192ZXJzaW9uPSdgJEVDSE8gIiRtYWNyb192ZXJzaW9uIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLW1hY3JvX3JldmlzaW9uPSdgJEVDSE8gIiRtYWNyb19yZXZpc2lvbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1BUz0nYCRFQ0hPICIkQVMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotRExMVE9PTD0nYCRFQ0hPICIkRExMVE9PTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1PQkpEVU1QPSdgJEVDSE8gIiRPQkpEVU1QIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWVuYWJsZV9zaGFyZWQ9J2AkRUNITyAiJGVuYWJsZV9zaGFyZWQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotZW5hYmxlX3N0YXRpYz0nYCRFQ0hPICIkZW5hYmxlX3N0YXRpYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1waWNfbW9kZT0nYCRFQ0hPICIkcGljX21vZGUiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotZW5hYmxlX2Zhc3RfaW5zdGFsbD0nYCRFQ0hPICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1ob3N0X2FsaWFzPSdgJEVDSE8gIiRob3N0X2FsaWFzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWhvc3Q9J2AkRUNITyAiJGhvc3QiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotaG9zdF9vcz0nYCRFQ0hPICIkaG9zdF9vcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1idWlsZF9hbGlhcz0nYCRFQ0hPICIkYnVpbGRfYWxpYXMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotYnVpbGQ9J2AkRUNITyAiJGJ1aWxkIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWJ1aWxkX29zPSdgJEVDSE8gIiRidWlsZF9vcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1OTT0nYCRFQ0hPICIkTk0iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotTE5fUz0nYCRFQ0hPICIkTE5fUyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1tYXhfY21kX2xlbj0nYCRFQ0hPICIkbWF4X2NtZF9sZW4iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotYWNfb2JqZXh0PSdgJEVDSE8gIiRhY19vYmpleHQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotZXhlZXh0PSdgJEVDSE8gIiRleGVleHQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbHRfdW5zZXQ9J2AkRUNITyAiJGx0X3Vuc2V0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWx0X1NQMk5MPSdgJEVDSE8gIiRsdF9TUDJOTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1sdF9OTDJTUD0nYCRFQ0hPICIkbHRfTkwyU1AiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotcmVsb2FkX2ZsYWc9J2AkRUNITyAiJHJlbG9hZF9mbGFnIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLXJlbG9hZF9jbWRzPSdgJEVDSE8gIiRyZWxvYWRfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1kZXBsaWJzX2NoZWNrX21ldGhvZD0nYCRFQ0hPICIkZGVwbGlic19jaGVja19tZXRob2QiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotZmlsZV9tYWdpY19jbWQ9J2AkRUNITyAiJGZpbGVfbWFnaWNfY21kIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLUFSPSdgJEVDSE8gIiRBUiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1BUl9GTEFHUz0nYCRFQ0hPICIkQVJfRkxBR1MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotU1RSSVA9J2AkRUNITyAiJFNUUklQIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLVJBTkxJQj0nYCRFQ0hPICIkUkFOTElCIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLW9sZF9wb3N0aW5zdGFsbF9jbWRzPSdgJEVDSE8gIiRvbGRfcG9zdGluc3RhbGxfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSdgJEVDSE8gIiRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLW9sZF9hcmNoaXZlX2NtZHM9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uPSdgJEVDSE8gIiRsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotQ0M9J2AkRUNITyAiJENDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLUNGTEFHUz0nYCRFQ0hPICIkQ0ZMQUdTIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWNvbXBpbGVyPSdgJEVDSE8gIiRjb21waWxlciIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1HQ0M9J2AkRUNITyAiJEdDQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSdgJEVDSE8gIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSdgJEVDSE8gIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0nYCRFQ0hPICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeD0nYCRFQ0hPICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1vYmpkaXI9J2AkRUNITyAiJG9iamRpciIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1NQUdJQ19DTUQ9J2AkRUNITyAiJE1BR0lDX0NNRCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWciIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbHRfcHJvZ19jb21waWxlcl93bD0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl93bCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1sdF9wcm9nX2NvbXBpbGVyX3BpYz0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl9waWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9J2AkRUNITyAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWx0X2N2X3Byb2dfY29tcGlsZXJfY19vPSdgJEVDSE8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1uZWVkX2xvY2tzPSdgJEVDSE8gIiRuZWVkX2xvY2tzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLURTWU1VVElMPSdgJEVDSE8gIiREU1lNVVRJTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1OTUVESVQ9J2AkRUNITyAiJE5NRURJVCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1MSVBPPSdgJEVDSE8gIiRMSVBPIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLU9UT09MPSdgJEVDSE8gIiRPVE9PTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1PVE9PTDY0PSdgJEVDSE8gIiRPVE9PTDY0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWxpYmV4dD0nYCRFQ0hPICIkbGliZXh0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLXNocmV4dF9jbWRzPSdgJEVDSE8gIiRzaHJleHRfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1leHRyYWN0X2V4cHN5bXNfY21kcz0nYCRFQ0hPICIkZXh0cmFjdF9leHBzeW1zX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotYXJjaGl2ZV9jbWRzX25lZWRfbGM9J2AkRUNITyAiJGFyY2hpdmVfY21kc19uZWVkX2xjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9J2AkRUNITyAiJGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSdgJEVDSE8gIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9J2AkRUNITyAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWNvbXBpbGVyX25lZWRzX29iamVjdD0nYCRFQ0hPICIkY29tcGlsZXJfbmVlZHNfb2JqZWN0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWFyY2hpdmVfY21kcz0nYCRFQ0hPICIkYXJjaGl2ZV9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWFyY2hpdmVfZXhwc3ltX2NtZHM9J2AkRUNITyAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbW9kdWxlX2NtZHM9J2AkRUNITyAiJG1vZHVsZV9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLW1vZHVsZV9leHBzeW1fY21kcz0nYCRFQ0hPICIkbW9kdWxlX2V4cHN5bV9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLXdpdGhfZ251X2xkPSdgJEVDSE8gIiR3aXRoX2dudV9sZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1hbGxvd191bmRlZmluZWRfZmxhZz0nYCRFQ0hPICIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbm9fdW5kZWZpbmVkX2ZsYWc9J2AkRUNITyAiJG5vX3VuZGVmaW5lZF9mbGFnIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9J2AkRUNITyAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0nYCRFQ0hPICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSdgJEVDSE8gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWhhcmRjb2RlX2RpcmVjdD0nYCRFQ0hPICIkaGFyZGNvZGVfZGlyZWN0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT0nYCRFQ0hPICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWhhcmRjb2RlX21pbnVzX0w9J2AkRUNITyAiJGhhcmRjb2RlX21pbnVzX0wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0nYCRFQ0hPICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1oYXJkY29kZV9hdXRvbWF0aWM9J2AkRUNITyAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1pbmhlcml0X3JwYXRoPSdgJEVDSE8gIiRpbmhlcml0X3JwYXRoIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWxpbmtfYWxsX2RlcGxpYnM9J2AkRUNITyAiJGxpbmtfYWxsX2RlcGxpYnMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotZml4X3NyY2ZpbGVfcGF0aD0nYCRFQ0hPICIkZml4X3NyY2ZpbGVfcGF0aCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1hbHdheXNfZXhwb3J0X3N5bWJvbHM9J2AkRUNITyAiJGFsd2F5c19leHBvcnRfc3ltYm9scyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1leHBvcnRfc3ltYm9sc19jbWRzPSdgJEVDSE8gIiRleHBvcnRfc3ltYm9sc19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWV4Y2x1ZGVfZXhwc3ltcz0nYCRFQ0hPICIkZXhjbHVkZV9leHBzeW1zIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWluY2x1ZGVfZXhwc3ltcz0nYCRFQ0hPICIkaW5jbHVkZV9leHBzeW1zIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLXByZWxpbmtfY21kcz0nYCRFQ0hPICIkcHJlbGlua19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWZpbGVfbGlzdF9zcGVjPSdgJEVDSE8gIiRmaWxlX2xpc3Rfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0nYCRFQ0hPICIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbmVlZF9saWJfcHJlZml4PSdgJEVDSE8gIiRuZWVkX2xpYl9wcmVmaXgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbmVlZF92ZXJzaW9uPSdgJEVDSE8gIiRuZWVkX3ZlcnNpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotdmVyc2lvbl90eXBlPSdgJEVDSE8gIiR2ZXJzaW9uX3R5cGUiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotcnVucGF0aF92YXI9J2AkRUNITyAiJHJ1bnBhdGhfdmFyIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLXNobGlicGF0aF92YXI9J2AkRUNITyAiJHNobGlicGF0aF92YXIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSdgJEVDSE8gIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbGlibmFtZV9zcGVjPSdgJEVDSE8gIiRsaWJuYW1lX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbGlicmFyeV9uYW1lc19zcGVjPSdgJEVDSE8gIiRsaWJyYXJ5X25hbWVzX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotc29uYW1lX3NwZWM9J2AkRUNITyAiJHNvbmFtZV9zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWluc3RhbGxfb3ZlcnJpZGVfbW9kZT0nYCRFQ0hPICIkaW5zdGFsbF9vdmVycmlkZV9tb2RlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLXBvc3RpbnN0YWxsX2NtZHM9J2AkRUNITyAiJHBvc3RpbnN0YWxsX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotcG9zdHVuaW5zdGFsbF9jbWRzPSdgJEVDSE8gIiRwb3N0dW5pbnN0YWxsX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotZmluaXNoX2NtZHM9J2AkRUNITyAiJGZpbmlzaF9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWZpbmlzaF9ldmFsPSdgJEVDSE8gIiRmaW5pc2hfZXZhbCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1oYXJkY29kZV9pbnRvX2xpYnM9J2AkRUNITyAiJGhhcmRjb2RlX2ludG9fbGlicyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9J2AkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nYCRFQ0hPICIkc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotaGFyZGNvZGVfYWN0aW9uPSdgJEVDSE8gIiRoYXJkY29kZV9hY3Rpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotZW5hYmxlX2Rsb3Blbj0nYCRFQ0hPICIkZW5hYmxlX2Rsb3BlbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1lbmFibGVfZGxvcGVuX3NlbGY9J2AkRUNITyAiJGVuYWJsZV9kbG9wZW5fc2VsZiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1lbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSdgJEVDSE8gIiRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLW9sZF9zdHJpcGxpYj0nYCRFQ0hPICIkb2xkX3N0cmlwbGliIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLXN0cmlwbGliPSdgJEVDSE8gIiRzdHJpcGxpYiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi0KLUxUQ0M9JyRMVENDJwotTFRDRkxBR1M9JyRMVENGTEFHUycKLWNvbXBpbGVyPSckY29tcGlsZXJfREVGQVVMVCcKLQotIyBBIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIHByaW50IGJ1aWx0aW4gb3IgcHJpbnRmLgotZnVuY19mYWxsYmFja19lY2hvICgpCi17Ci0gIGV2YWwgJ2NhdCA8PF9MVEVDSE9fRU9GCi1cJDEKLV9MVEVDSE9fRU9GJwotfQotCi0jIFF1b3RlIGV2YWxlZCBzdHJpbmdzLgotZm9yIHZhciBpbiBTRUQgXAotR1JFUCBcCi1FR1JFUCBcCi1GR1JFUCBcCi1TSEVMTCBcCi1FQ0hPIFwKLUxEIFwKLUFTIFwKLURMTFRPT0wgXAotT0JKRFVNUCBcCi1OTSBcCi1MTl9TIFwKLWx0X1NQMk5MIFwKLWx0X05MMlNQIFwKLXJlbG9hZF9mbGFnIFwKLWRlcGxpYnNfY2hlY2tfbWV0aG9kIFwKLWZpbGVfbWFnaWNfY21kIFwKLUFSIFwKLUFSX0ZMQUdTIFwKLVNUUklQIFwKLVJBTkxJQiBcCi1DQyBcCi1DRkxBR1MgXAotY29tcGlsZXIgXAotbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcCi1sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCi1sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCi1sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4IFwKLWx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnIFwKLWx0X3Byb2dfY29tcGlsZXJfd2wgXAotbHRfcHJvZ19jb21waWxlcl9waWMgXAotbHRfcHJvZ19jb21waWxlcl9zdGF0aWMgXAotbHRfY3ZfcHJvZ19jb21waWxlcl9jX28gXAotbmVlZF9sb2NrcyBcCi1EU1lNVVRJTCBcCi1OTUVESVQgXAotTElQTyBcCi1PVE9PTCBcCi1PVE9PTDY0IFwKLXNocmV4dF9jbWRzIFwKLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyBcCi13aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyBcCi1jb21waWxlcl9uZWVkc19vYmplY3QgXAotd2l0aF9nbnVfbGQgXAotYWxsb3dfdW5kZWZpbmVkX2ZsYWcgXAotbm9fdW5kZWZpbmVkX2ZsYWcgXAotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBcCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkIFwKLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgXAotZml4X3NyY2ZpbGVfcGF0aCBcCi1leGNsdWRlX2V4cHN5bXMgXAotaW5jbHVkZV9leHBzeW1zIFwKLWZpbGVfbGlzdF9zcGVjIFwKLXZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIFwKLWxpYm5hbWVfc3BlYyBcCi1saWJyYXJ5X25hbWVzX3NwZWMgXAotc29uYW1lX3NwZWMgXAotaW5zdGFsbF9vdmVycmlkZV9tb2RlIFwKLWZpbmlzaF9ldmFsIFwKLW9sZF9zdHJpcGxpYiBcCi1zdHJpcGxpYjsgZG8KLSAgICBjYXNlIFxgZXZhbCBcXFxcXCRFQ0hPIFxcXFwiIlxcXFxcJFwkdmFyIlxcXFwiXGAgaW4KLSAgICAqW1xcXFxcXFxgXFwiXFxcJF0qKQotICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXGBcXFwkRUNITyBcXCJcXFwkXCR2YXJcXCIgfCBcXFwkU0VEIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFwkXCR2YXJcXFxcXFwiIgotICAgICAgOzsKLSAgICBlc2FjCi1kb25lCi0KLSMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KLWZvciB2YXIgaW4gcmVsb2FkX2NtZHMgXAotb2xkX3Bvc3RpbnN0YWxsX2NtZHMgXAotb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCi1vbGRfYXJjaGl2ZV9jbWRzIFwKLWV4dHJhY3RfZXhwc3ltc19jbWRzIFwKLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgXAotb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMgXAotYXJjaGl2ZV9jbWRzIFwKLWFyY2hpdmVfZXhwc3ltX2NtZHMgXAotbW9kdWxlX2NtZHMgXAotbW9kdWxlX2V4cHN5bV9jbWRzIFwKLWV4cG9ydF9zeW1ib2xzX2NtZHMgXAotcHJlbGlua19jbWRzIFwKLXBvc3RpbnN0YWxsX2NtZHMgXAotcG9zdHVuaW5zdGFsbF9jbWRzIFwKLWZpbmlzaF9jbWRzIFwKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBcCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYzsgZG8KLSAgICBjYXNlIFxgZXZhbCBcXFxcXCRFQ0hPIFxcXFwiIlxcXFxcJFwkdmFyIlxcXFwiXGAgaW4KLSAgICAqW1xcXFxcXFxgXFwiXFxcJF0qKQotICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXGBcXFwkRUNITyBcXCJcXFwkXCR2YXJcXCIgfCBcXFwkU0VEIC1lIFxcIlxcXCRkb3VibGVfcXVvdGVfc3Vic3RcXCIgLWUgXFwiXFxcJHNlZF9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkZGVsYXlfdmFyaWFibGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFwkXCR2YXJcXFxcXFwiIgotICAgICAgOzsKLSAgICBlc2FjCi1kb25lCi0KLWFjX2F1eF9kaXI9JyRhY19hdXhfZGlyJwoteHNpX3NoZWxsPSckeHNpX3NoZWxsJwotbHRfc2hlbGxfYXBwZW5kPSckbHRfc2hlbGxfYXBwZW5kJwotCi0jIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyCi0jIGNvbW1hbmRzIHRocm91Z2ggd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcyBJTklULgotaWYgdGVzdCAtbiAiXCR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCi0gICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZmkKLQotCi0gICAgUEFDS0FHRT0nJFBBQ0tBR0UnCi0gICAgVkVSU0lPTj0nJFZFUlNJT04nCi0gICAgVElNRVNUQU1QPSckVElNRVNUQU1QJwotICAgIFJNPSckUk0nCi0gICAgb2ZpbGU9JyRvZmlsZScKLQotCi0KLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLQotIyBIYW5kbGluZyBvZiBhcmd1bWVudHMuCi1mb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKLWRvCi0gIGNhc2UgJGFjX2NvbmZpZ190YXJnZXQgaW4KLSAgICAiY29uZmlnLmgiKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIGNvbmZpZy5oIiA7OwotICAgICJkZXBmaWxlcyIpIENPTkZJR19DT01NQU5EUz0iJENPTkZJR19DT01NQU5EUyBkZXBmaWxlcyIgOzsKLSAgICAibGlidG9vbCIpIENPTkZJR19DT01NQU5EUz0iJENPTkZJR19DT01NQU5EUyBsaWJ0b29sIiA7OwotICAgICJNYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKLSAgICAibGlicG5nLnBjIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYnBuZy5wYzpsaWJwbmcucGMuaW4iIDs7Ci0gICAgImxpYnBuZy1jb25maWciKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGlicG5nLWNvbmZpZzpsaWJwbmctY29uZmlnLmluIiA7OwotCi0gICopIGFzX2ZuX2Vycm9yICJpbnZhbGlkIGFyZ3VtZW50OiBcYCRhY19jb25maWdfdGFyZ2V0JyIgIiRMSU5FTk8iIDU7OwotICBlc2FjCi1kb25lCi0KLQotIyBJZiB0aGUgdXNlciBkaWQgbm90IHVzZSB0aGUgYXJndW1lbnRzIHRvIHNwZWNpZnkgdGhlIGl0ZW1zIHRvIGluc3RhbnRpYXRlLAotIyB0aGVuIHRoZSBlbnZ2YXIgaW50ZXJmYWNlIGlzIHVzZWQuICBTZXQgb25seSB0aG9zZSB0aGF0IGFyZSBub3QuCi0jIFdlIHVzZSB0aGUgbG9uZyBmb3JtIGZvciB0aGUgZGVmYXVsdCBhc3NpZ25tZW50IGJlY2F1c2Ugb2YgYW4gZXh0cmVtZWx5Ci0jIGJpemFycmUgYnVnIG9uIFN1bk9TIDQuMS4zLgotaWYgJGFjX25lZWRfZGVmYXVsdHM7IHRoZW4KLSAgdGVzdCAiJHtDT05GSUdfRklMRVMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0ZJTEVTPSRjb25maWdfZmlsZXMKLSAgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiA9IHNldCB8fCBDT05GSUdfSEVBREVSUz0kY29uZmlnX2hlYWRlcnMKLSAgdGVzdCAiJHtDT05GSUdfQ09NTUFORFMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0NPTU1BTkRTPSRjb25maWdfY29tbWFuZHMKLWZpCi0KLSMgSGF2ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNvbnZlbmllbmNlLiAgTWFrZSBpdCBpbiB0aGUgYnVpbGQgdHJlZQotIyBzaW1wbHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWFzb24gYWdhaW5zdCBoYXZpbmcgaXQgaGVyZSwgYW5kIGluIGFkZGl0aW9uLAotIyBjcmVhdGluZyBhbmQgbW92aW5nIGZpbGVzIGZyb20gL3RtcCBjYW4gc29tZXRpbWVzIGNhdXNlIHByb2JsZW1zLgotIyBIb29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgotIyBOb3RlIHRoYXQgdGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgaW4gd2hpY2ggdGhlIGRpcmVjdG9yeSB3aWxsIG5vdCBiZSBjbGVhbmVkOgotIyBhZnRlciBpdHMgY3JlYXRpb24gYnV0IGJlZm9yZSBpdHMgbmFtZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBgJHRtcCcuCi0kZGVidWcgfHwKLXsKLSAgdG1wPQotICB0cmFwICdleGl0X3N0YXR1cz0kPwotICB7IHRlc3QgLXogIiR0bXAiIHx8IHRlc3QgISAtZCAiJHRtcCIgfHwgcm0gLWZyICIkdG1wIjsgfSAmJiBleGl0ICRleGl0X3N0YXR1cwotJyAwCi0gIHRyYXAgJ2FzX2ZuX2V4aXQgMScgMSAyIDEzIDE1Ci19Ci0jIENyZWF0ZSBhIChzZWN1cmUpIHRtcCBkaXJlY3RvcnkgZm9yIHRtcCBmaWxlcy4KLQotewotICB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kICIuL2NvbmZYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYKLSAgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIKLX0gIHx8Ci17Ci0gIHRtcD0uL2NvbmYkJC0kUkFORE9NCi0gICh1bWFzayAwNzcgJiYgbWtkaXIgIiR0bXAiKQotfSB8fCBhc19mbl9lcnJvciAiY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gLiIgIiRMSU5FTk8iIDUKLQotIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19GSUxFUyBzZWN0aW9uLgotIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KLSMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aXRoIGAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgnLgotaWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KLQotCi1hY19jcj1gZWNobyBYIHwgdHIgWCAnXDAxNSdgCi0jIE9uIGN5Z3dpbiwgYmFzaCBjYW4gZWF0IFxyIGluc2lkZSBgYCBpZiB0aGUgdXNlciByZXF1ZXN0ZWQgaWduY3IuCi0jIEJ1dCB3ZSBrbm93IG9mIG5vIG90aGVyIHNoZWxsIHdoZXJlIGFjX2NyIHdvdWxkIGJlIGVtcHR5IGF0IHRoaXMKLSMgcG9pbnQsIHNvIHdlIGNhbiB1c2UgYSBiYXNoaXNtIGFzIGEgZmFsbGJhY2suCi1pZiB0ZXN0ICJ4JGFjX2NyIiA9IHg7IHRoZW4KLSAgZXZhbCBhY19jcj1cJFwnXFxyXCcKLWZpCi1hY19jc19hd2tfY3I9YCRBV0sgJ0JFR0lOIHsgcHJpbnQgImFccmIiIH0nIDwvZGV2L251bGwgMj4vZGV2L251bGxgCi1pZiB0ZXN0ICIkYWNfY3NfYXdrX2NyIiA9ICJhJHthY19jcn1iIjsgdGhlbgotICBhY19jc19hd2tfY3I9J1xyJwotZWxzZQotICBhY19jc19hd2tfY3I9JGFjX2NyCi1maQotCi1lY2hvICdCRUdJTiB7JyA+IiR0bXAvc3ViczEuYXdrIiAmJgotX0FDRU9GCi0KLQotewotICBlY2hvICJjYXQgPmNvbmYkJHN1YnMuYXdrIDw8X0FDRU9GIiAmJgotICBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBzZWQgJ3MvLiovJiEkJiRhY19kZWxpbS8nICYmCi0gIGVjaG8gIl9BQ0VPRiIKLX0gPmNvbmYkJHN1YnMuc2ggfHwKLSAgYXNfZm5fZXJyb3IgImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQotYWNfZGVsaW1fbnVtPWBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBncmVwIC1jICckJ2AKLWFjX2RlbGltPSclIV8hIyAnCi1mb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgOjsgZG8KLSAgLiAuL2NvbmYkJHN1YnMuc2ggfHwKLSAgICBhc19mbl9lcnJvciAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1Ci0KLSAgYWNfZGVsaW1fbj1gc2VkIC1uICJzLy4qJGFjX2RlbGltXCQvWC9wIiBjb25mJCRzdWJzLmF3ayB8IGdyZXAgLWMgWGAKLSAgaWYgdGVzdCAkYWNfZGVsaW1fbiA9ICRhY19kZWxpbV9udW07IHRoZW4KLSAgICBicmVhawotICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgotICAgIGFzX2ZuX2Vycm9yICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKLSAgZWxzZQotICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCi0gIGZpCi1kb25lCi1ybSAtZiBjb25mJCRzdWJzLnNoCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotY2F0ID4+IlwkdG1wL3N1YnMxLmF3ayIgPDxcXF9BQ0FXSyAmJgotX0FDRU9GCi1zZWQgLW4gJwotaAotcy9eL1NbIi87IHMvIS4qLyJdPS8KLXAKLWcKLXMvXlteIV0qIS8vCi06cmVwbAotdCByZXBsCi1zLyciJGFjX2RlbGltIickLy8KLXQgZGVsaW0KLTpubAotaAotcy9cKC5cezE0OFx9XCkuLiovXDEvCi10IG1vcmUxCi1zL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC9cXG4iXFwvCi1wCi1uCi1iIHJlcGwKLTptb3JlMQotcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLwotcAotZwotcy8uXHsxNDhcfS8vCi10IG5sCi06ZGVsaW0KLWgKLXMvXCguXHsxNDhcfVwpLi4qL1wxLwotdCBtb3JlMgotcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi8KLXAKLWIKLTptb3JlMgotcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLwotcAotZwotcy8uXHsxNDhcfS8vCi10IGRlbGltCi0nIDxjb25mJCRzdWJzLmF3ayB8IHNlZCAnCi0vXlteIiJdL3sKLSAgTgotICBzL1xuLy8KLX0KLScgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKLXJtIC1mIGNvbmYkJHN1YnMuYXdrCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLV9BQ0FXSwotY2F0ID4+IlwkdG1wL3N1YnMxLmF3ayIgPDxfQUNBV0sgJiYKLSAgZm9yIChrZXkgaW4gUykgU19pc19zZXRba2V5XSA9IDEKLSAgRlMgPSAiByIKLQotfQotewotICBsaW5lID0gJCAwCi0gIG5maWVsZHMgPSBzcGxpdChsaW5lLCBmaWVsZCwgIkAiKQotICBzdWJzdGVkID0gMAotICBsZW4gPSBsZW5ndGgoZmllbGRbMV0pCi0gIGZvciAoaSA9IDI7IGkgPCBuZmllbGRzOyBpKyspIHsKLSAgICBrZXkgPSBmaWVsZFtpXQotICAgIGtleWxlbiA9IGxlbmd0aChrZXkpCi0gICAgaWYgKFNfaXNfc2V0W2tleV0pIHsKLSAgICAgIHZhbHVlID0gU1trZXldCi0gICAgICBsaW5lID0gc3Vic3RyKGxpbmUsIDEsIGxlbikgIiIgdmFsdWUgIiIgc3Vic3RyKGxpbmUsIGxlbiArIGtleWxlbiArIDMpCi0gICAgICBsZW4gKz0gbGVuZ3RoKHZhbHVlKSArIGxlbmd0aChmaWVsZFsrK2ldKQotICAgICAgc3Vic3RlZCA9IDEKLSAgICB9IGVsc2UKLSAgICAgIGxlbiArPSAxICsga2V5bGVuCi0gIH0KLQotICBwcmludCBsaW5lCi19Ci0KLV9BQ0FXSwotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1pZiBzZWQgInMvJGFjX2NyLy8iIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgc2VkICJzLyRhY19jclwkLy87IHMvJGFjX2NyLyRhY19jc19hd2tfY3IvZyIKLWVsc2UKLSAgY2F0Ci1maSA8ICIkdG1wL3N1YnMxLmF3ayIgPiAiJHRtcC9zdWJzLmF3ayIgXAotICB8fCBhc19mbl9lcnJvciAiY291bGQgbm90IHNldHVwIGNvbmZpZyBmaWxlcyBtYWNoaW5lcnkiICIkTElORU5PIiA1Ci1fQUNFT0YKLQotIyBWUEFUSCBtYXkgY2F1c2UgdHJvdWJsZSB3aXRoIHNvbWUgbWFrZXMsIHNvIHdlIHJlbW92ZSAkKHNyY2RpciksCi0jICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAotIyB0cmFpbGluZyBjb2xvbnMgYW5kIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBsaW5lIGlmIFZQQVRIIGJlY29tZXMgZW1wdHkKLSMgKGFjdHVhbGx5IHdlIGxlYXZlIGFuIGVtcHR5IGxpbmUgdG8gcHJlc2VydmUgbGluZSBudW1iZXJzKS4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsJIF0qVlBBVEhbCSBdKj0vewotcy86KlwkKHNyY2Rpcik6Ki86Lwotcy86Klwke3NyY2Rpcn06Ki86Lwotcy86KkBzcmNkaXJAOiovOi8KLXMvXlwoW149XSo9WwkgXSpcKToqL1wxLwotcy86KiQvLwotcy9eW149XSo9WwkgXSokLy8KLX0nCi1maQotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1maSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCi0KLSMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfSEVBREVSUyBzZWN0aW9uLgotIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19IRUFERVJTLgotIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBNYWtlZmlsZScuCi1pZiB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiOyB0aGVuCi1jYXQgPiIkdG1wL2RlZmluZXMuYXdrIiA8PFxfQUNBV0sgfHwKLUJFR0lOIHsKLV9BQ0VPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYW4gYXdrIHNjcmlwdCBgZGVmaW5lcy5hd2snLCBlbWJlZGRlZCBhcwotIyBoZXJlLWRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMsIHRoYXQgc3Vic3RpdHV0ZXMgdGhlIHByb3BlciB2YWx1ZXMgaW50bwotIyBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLgotCi0jIENyZWF0ZSBhIGRlbGltaXRlciBzdHJpbmcgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBjb25mZGVmcy5oLCB0byBlYXNlCi0jIGhhbmRsaW5nIG9mIGxvbmcgbGluZXMuCi1hY19kZWxpbT0nJSFfISMgJwotZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIDo7IGRvCi0gIGFjX3Q9YHNlZCAtbiAiLyRhY19kZWxpbS9wIiBjb25mZGVmcy5oYAotICBpZiB0ZXN0IC16ICIkYWNfdCI7IHRoZW4KLSAgICBicmVhawotICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgotICAgIGFzX2ZuX2Vycm9yICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX0hFQURFUlMiICIkTElORU5PIiA1Ci0gIGVsc2UKLSAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgotICBmaQotZG9uZQotCi0jIEZvciB0aGUgYXdrIHNjcmlwdCwgRCBpcyBhbiBhcnJheSBvZiBtYWNybyB2YWx1ZXMga2V5ZWQgYnkgbmFtZSwKLSMgbGlrZXdpc2UgUCBjb250YWlucyBtYWNybyBwYXJhbWV0ZXJzIGlmIGFueS4gIFByZXNlcnZlIGJhY2tzbGFzaAotIyBuZXdsaW5lIHNlcXVlbmNlcy4KLQotYWNfd29yZF9yZT1bXyRhc19jcl9MZXR0ZXJzXVtfJGFzX2NyX2FsbnVtXSoKLXNlZCAtbiAnCi1zLy5cezE0OFx9LyYnIiRhY19kZWxpbSInL2cKLXQgcnNldAotOnJzZXQKLXMvXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qLyAvCi10IGRlZgotZAotOmRlZgotcy9cXCQvLwotdCBic25sCi1zL1siXFxdL1xcJi9nCi1zL14gXCgnIiRhY193b3JkX3JlIidcKVwoKFteKCldKilcKVsJIF0qXCguKlwpL1BbIlwxIl09IlwyIlwKLURbIlwxIl09IiBcMyIvcAotcy9eIFwoJyIkYWNfd29yZF9yZSInXClbCSBdKlwoLipcKS9EWyJcMSJdPSIgXDIiL3AKLWQKLTpic25sCi1zL1siXFxdL1xcJi9nCi1zL14gXCgnIiRhY193b3JkX3JlIidcKVwoKFteKCldKilcKVsJIF0qXCguKlwpL1BbIlwxIl09IlwyIlwKLURbIlwxIl09IiBcM1xcXFxcXG4iXFwvcAotdCBjb250Ci1zL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMlxcXFxcXG4iXFwvcAotdCBjb250Ci1kCi06Y29udAotbgotcy8uXHsxNDhcfS8mJyIkYWNfZGVsaW0iJy9nCi10IGNsZWFyCi06Y2xlYXIKLXMvXFwkLy8KLXQgYnNubGMKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyIvcAotZAotOmJzbmxjCi1zL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC9cXFxcXFxuIlxcL3AKLWIgY29udAotJyA8Y29uZmRlZnMuaCB8IHNlZCAnCi1zLyciJGFjX2RlbGltIicvIlxcXAotIi9nJyA+PiRDT05GSUdfU1RBVFVTIHx8IGFjX3dyaXRlX2ZhaWw9MQotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLSAgZm9yIChrZXkgaW4gRCkgRF9pc19zZXRba2V5XSA9IDEKLSAgRlMgPSAiByIKLX0KLS9eW1x0IF0qI1tcdCBdKihkZWZpbmV8dW5kZWYpW1x0IF0rJGFjX3dvcmRfcmUoW1x0IChdfFwkKS8gewotICBsaW5lID0gXCQgMAotICBzcGxpdChsaW5lLCBhcmcsICIgIikKLSAgaWYgKGFyZ1sxXSA9PSAiIyIpIHsKLSAgICBkZWZ1bmRlZiA9IGFyZ1syXQotICAgIG1hYzEgPSBhcmdbM10KLSAgfSBlbHNlIHsKLSAgICBkZWZ1bmRlZiA9IHN1YnN0cihhcmdbMV0sIDIpCi0gICAgbWFjMSA9IGFyZ1syXQotICB9Ci0gIHNwbGl0KG1hYzEsIG1hYzIsICIoIikgIykKLSAgbWFjcm8gPSBtYWMyWzFdCi0gIHByZWZpeCA9IHN1YnN0cihsaW5lLCAxLCBpbmRleChsaW5lLCBkZWZ1bmRlZikgLSAxKQotICBpZiAoRF9pc19zZXRbbWFjcm9dKSB7Ci0gICAgIyBQcmVzZXJ2ZSB0aGUgd2hpdGUgc3BhY2Ugc3Vycm91bmRpbmcgdGhlICIjIi4KLSAgICBwcmludCBwcmVmaXggImRlZmluZSIsIG1hY3JvIFBbbWFjcm9dIERbbWFjcm9dCi0gICAgbmV4dAotICB9IGVsc2UgewotICAgICMgUmVwbGFjZSAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IgZXhhbXBsZSwKLSAgICAjIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0gICAgIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi0gICAgaWYgKGRlZnVuZGVmID09ICJ1bmRlZiIpIHsKLSAgICAgIHByaW50ICIvKiIsIHByZWZpeCBkZWZ1bmRlZiwgbWFjcm8sICIqLyIKLSAgICAgIG5leHQKLSAgICB9Ci0gIH0KLX0KLXsgcHJpbnQgfQotX0FDQVdLCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLSAgYXNfZm5fZXJyb3IgImNvdWxkIG5vdCBzZXR1cCBjb25maWcgaGVhZGVycyBtYWNoaW5lcnkiICIkTElORU5PIiA1Ci1maSAjIHRlc3QgLW4gIiRDT05GSUdfSEVBREVSUyIKLQotCi1ldmFsIHNldCBYICIgIDpGICRDT05GSUdfRklMRVMgIDpIICRDT05GSUdfSEVBREVSUyAgICA6QyAkQ09ORklHX0NPTU1BTkRTIgotc2hpZnQKLWZvciBhY190YWcKLWRvCi0gIGNhc2UgJGFjX3RhZyBpbgotICA6W0ZITENdKSBhY19tb2RlPSRhY190YWc7IGNvbnRpbnVlOzsKLSAgZXNhYwotICBjYXNlICRhY19tb2RlJGFjX3RhZyBpbgotICA6W0ZITF0qOiopOzsKLSAgOkwqIHwgOkMqOiopIGFzX2ZuX2Vycm9yICJpbnZhbGlkIHRhZyBcYCRhY190YWcnIiAiJExJTkVOTyIgNTs7Ci0gIDpbRkhdLSkgYWNfdGFnPS06LTs7Ci0gIDpbRkhdKikgYWNfdGFnPSRhY190YWc6JGFjX3RhZy5pbjs7Ci0gIGVzYWMKLSAgYWNfc2F2ZV9JRlM9JElGUwotICBJRlM9OgotICBzZXQgeCAkYWNfdGFnCi0gIElGUz0kYWNfc2F2ZV9JRlMKLSAgc2hpZnQKLSAgYWNfZmlsZT0kMQotICBzaGlmdAotCi0gIGNhc2UgJGFjX21vZGUgaW4KLSAgOkwpIGFjX3NvdXJjZT0kMTs7Ci0gIDpbRkhdKQotICAgIGFjX2ZpbGVfaW5wdXRzPQotICAgIGZvciBhY19mCi0gICAgZG8KLSAgICAgIGNhc2UgJGFjX2YgaW4KLSAgICAgIC0pIGFjX2Y9IiR0bXAvc3RkaW4iOzsKLSAgICAgICopICMgTG9vayBmb3IgdGhlIGZpbGUgZmlyc3QgaW4gdGhlIGJ1aWxkIHRyZWUsIHRoZW4gaW4gdGhlIHNvdXJjZSB0cmVlCi0JICMgKGlmIHRoZSBwYXRoIGlzIG5vdCBhYnNvbHV0ZSkuICBUaGUgYWJzb2x1dGUgcGF0aCBjYW5ub3QgYmUgRE9TLXN0eWxlLAotCSAjIGJlY2F1c2UgJGFjX2YgY2Fubm90IGNvbnRhaW4gYDonLgotCSB0ZXN0IC1mICIkYWNfZiIgfHwKLQkgICBjYXNlICRhY19mIGluCi0JICAgW1xcLyRdKikgZmFsc2U7OwotCSAgICopIHRlc3QgLWYgIiRzcmNkaXIvJGFjX2YiICYmIGFjX2Y9IiRzcmNkaXIvJGFjX2YiOzsKLQkgICBlc2FjIHx8Ci0JICAgYXNfZm5fZXJyb3IgImNhbm5vdCBmaW5kIGlucHV0IGZpbGU6IFxgJGFjX2YnIiAiJExJTkVOTyIgNTs7Ci0gICAgICBlc2FjCi0gICAgICBjYXNlICRhY19mIGluICpcJyopIGFjX2Y9YCRhc19lY2hvICIkYWNfZiIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyBlc2FjCi0gICAgICBhc19mbl9hcHBlbmQgYWNfZmlsZV9pbnB1dHMgIiAnJGFjX2YnIgotICAgIGRvbmUKLQotICAgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0Ci0gICAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgotICAgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCi0gICAgY29uZmlndXJlX2lucHV0PSdHZW5lcmF0ZWQgZnJvbSAnYAotCSAgJGFzX2VjaG8gIiQqIiB8IHNlZCAnc3xeW146XSovfHw7c3w6W146XSovfCwgfGcnCi0JYCcgYnkgY29uZmlndXJlLicKLSAgICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCi0gICAgICBjb25maWd1cmVfaW5wdXQ9IiRhY19maWxlLiAgJGNvbmZpZ3VyZV9pbnB1dCIKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9Ci0gICAgZmkKLSAgICAjIE5ldXRyYWxpemUgc3BlY2lhbCBjaGFyYWN0ZXJzIGludGVycHJldGVkIGJ5IHNlZCBpbiByZXBsYWNlbWVudCBzdHJpbmdzLgotICAgIGNhc2UgJGNvbmZpZ3VyZV9pbnB1dCBpbiAjKAotICAgICpcJiogfCAqXHwqIHwgKlxcKiApCi0gICAgICAgYWNfc2VkX2NvbmZfaW5wdXQ9YCRhc19lY2hvICIkY29uZmlndXJlX2lucHV0IiB8Ci0gICAgICAgc2VkICdzL1tcXFxcJnxdL1xcXFwmL2cnYDs7ICMoCi0gICAgKikgYWNfc2VkX2NvbmZfaW5wdXQ9JGNvbmZpZ3VyZV9pbnB1dDs7Ci0gICAgZXNhYwotCi0gICAgY2FzZSAkYWNfdGFnIGluCi0gICAgKjotOiogfCAqOi0pIGNhdCA+IiR0bXAvc3RkaW4iIFwKLSAgICAgIHx8IGFzX2ZuX2Vycm9yICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNSA7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0KLSAgYWNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFjX2ZpbGUiIHx8Ci0kYXNfZXhwciBYIiRhY19maWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhY19maWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJGFjX2ZpbGUiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICBhc19kaXI9IiRhY19kaXIiOyBhc19mbl9ta2Rpcl9wCi0gIGFjX2J1aWxkZGlyPS4KLQotY2FzZSAiJGFjX2RpciIgaW4KLS4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotKikKLSAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKLSAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKLSAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgotICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0gICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwotICBlc2FjIDs7Ci1lc2FjCi1hY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKLWFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKLSMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci1hY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKLQotY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICBhY19zcmNkaXI9LgotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KLSAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Ci1lc2FjCi1hY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Ci0KLQotICBjYXNlICRhY19tb2RlIGluCi0gIDpGKQotICAjCi0gICMgQ09ORklHX0ZJTEUKLSAgIwotCi0gIGNhc2UgJElOU1RBTEwgaW4KLSAgW1xcLyRdKiB8ID86W1xcL10qICkgYWNfSU5TVEFMTD0kSU5TVEFMTCA7OwotICAqKSBhY19JTlNUQUxMPSRhY190b3BfYnVpbGRfcHJlZml4JElOU1RBTEwgOzsKLSAgZXNhYwotICBhY19NS0RJUl9QPSRNS0RJUl9QCi0gIGNhc2UgJE1LRElSX1AgaW4KLSAgW1xcLyRdKiB8ID86W1xcL10qICkgOzsKLSAgKi8qKSBhY19NS0RJUl9QPSRhY190b3BfYnVpbGRfcHJlZml4JE1LRElSX1AgOzsKLSAgZXNhYwotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLSMgSWYgdGhlIHRlbXBsYXRlIGRvZXMgbm90IGtub3cgYWJvdXQgZGF0YXJvb3RkaXIsIGV4cGFuZCBpdC4KLSMgRklYTUU6IFRoaXMgaGFjayBzaG91bGQgYmUgcmVtb3ZlZCBhIGZldyB5ZWFycyBhZnRlciAyLjYwLgotYWNfZGF0YXJvb3RkaXJfaGFjaz07IGFjX2RhdGFyb290ZGlyX3NlZW49Ci1hY19zZWRfZGF0YXJvb3Q9JwotL2RhdGFyb290ZGlyLyB7Ci0gIHAKLSAgcQotfQotL0BkYXRhZGlyQC9wCi0vQGRvY2RpckAvcAotL0BpbmZvZGlyQC9wCi0vQGxvY2FsZWRpckAvcAotL0BtYW5kaXJAL3AnCi1jYXNlIGBldmFsICJzZWQgLW4gXCJcJGFjX3NlZF9kYXRhcm9vdFwiICRhY19maWxlX2lucHV0cyJgIGluCi0qZGF0YXJvb3RkaXIqKSBhY19kYXRhcm9vdGRpcl9zZWVuPXllczs7Ci0qQGRhdGFkaXJAKnwqQGRvY2RpckAqfCpAaW5mb2RpckAqfCpAbG9jYWxlZGlyQCp8KkBtYW5kaXJAKikKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjI7fQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLSAgYWNfZGF0YXJvb3RkaXJfaGFjaz0nCi0gIHMmQGRhdGFkaXJAJiRkYXRhZGlyJmcKLSAgcyZAZG9jZGlyQCYkZG9jZGlyJmcKLSAgcyZAaW5mb2RpckAmJGluZm9kaXImZwotICBzJkBsb2NhbGVkaXJAJiRsb2NhbGVkaXImZwotICBzJkBtYW5kaXJAJiRtYW5kaXImZwotICBzJlxcXCR7ZGF0YXJvb3RkaXJ9JiRkYXRhcm9vdGRpciZnJyA7OwotZXNhYwotX0FDRU9GCi0KLSMgTmV1dHJhbGl6ZSBWUEFUSCB3aGVuIGAkc3JjZGlyJyA9IGAuJy4KLSMgU2hlbGwgY29kZSBpbiBjb25maWd1cmUuYWMgbWlnaHQgc2V0IGV4dHJhc3ViLgotIyBGSVhNRTogZG8gd2UgcmVhbGx5IHdhbnQgdG8gbWFpbnRhaW4gdGhpcyBmZWF0dXJlPwotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1hY19zZWRfZXh0cmE9IiRhY192cHN1YgotJGV4dHJhc3ViCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLTp0Ci0vQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiCi1zfEBjb25maWd1cmVfaW5wdXRAfCRhY19zZWRfY29uZl9pbnB1dHw7dCB0Ci1zJkB0b3BfYnVpbGRkaXJAJiRhY190b3BfYnVpbGRkaXJfc3ViJjt0IHQKLXMmQHRvcF9idWlsZF9wcmVmaXhAJiRhY190b3BfYnVpbGRfcHJlZml4Jjt0IHQKLXMmQHNyY2RpckAmJGFjX3NyY2RpciY7dCB0Ci1zJkBhYnNfc3JjZGlyQCYkYWNfYWJzX3NyY2RpciY7dCB0Ci1zJkB0b3Bfc3JjZGlyQCYkYWNfdG9wX3NyY2RpciY7dCB0Ci1zJkBhYnNfdG9wX3NyY2RpckAmJGFjX2Fic190b3Bfc3JjZGlyJjt0IHQKLXMmQGJ1aWxkZGlyQCYkYWNfYnVpbGRkaXImO3QgdAotcyZAYWJzX2J1aWxkZGlyQCYkYWNfYWJzX2J1aWxkZGlyJjt0IHQKLXMmQGFic190b3BfYnVpbGRkaXJAJiRhY19hYnNfdG9wX2J1aWxkZGlyJjt0IHQKLXMmQElOU1RBTExAJiRhY19JTlNUQUxMJjt0IHQKLXMmQE1LRElSX1BAJiRhY19NS0RJUl9QJjt0IHQKLSRhY19kYXRhcm9vdGRpcl9oYWNrCi0iCi1ldmFsIHNlZCBcIlwkYWNfc2VkX2V4dHJhXCIgIiRhY19maWxlX2lucHV0cyIgfCAkQVdLIC1mICIkdG1wL3N1YnMuYXdrIiA+JHRtcC9vdXQgXAotICB8fCBhc19mbl9lcnJvciAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKLQotdGVzdCAteiAiJGFjX2RhdGFyb290ZGlyX2hhY2skYWNfZGF0YXJvb3RkaXJfc2VlbiIgJiYKLSAgeyBhY19vdXQ9YHNlZCAtbiAnL1wke2RhdGFyb290ZGlyfS9wJyAiJHRtcC9vdXQiYDsgdGVzdCAtbiAiJGFjX291dCI7IH0gJiYKLSAgeyBhY19vdXQ9YHNlZCAtbiAnL15bCSBdKmRhdGFyb290ZGlyWwkgXSo6Kj0vcCcgIiR0bXAvb3V0ImA7IHRlc3QgLXogIiRhY19vdXQiOyB9ICYmCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCi13aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQuIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwotd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiYyO30KLQotICBybSAtZiAiJHRtcC9zdGRpbiIKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAtKSBjYXQgIiR0bXAvb3V0IiAmJiBybSAtZiAiJHRtcC9vdXQiOzsKLSAgKikgcm0gLWYgIiRhY19maWxlIiAmJiBtdiAiJHRtcC9vdXQiICIkYWNfZmlsZSI7OwotICBlc2FjIFwKLSAgfHwgYXNfZm5fZXJyb3IgImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1Ci0gOzsKLSAgOkgpCi0gICMKLSAgIyBDT05GSUdfSEVBREVSCi0gICMKLSAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgotICAgIHsKLSAgICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAotICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJHRtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiCi0gICAgfSA+IiR0bXAvY29uZmlnLmgiIFwKLSAgICAgIHx8IGFzX2ZuX2Vycm9yICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQotICAgIGlmIGRpZmYgIiRhY19maWxlIiAiJHRtcC9jb25maWcuaCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNjt9Ci0gICAgZWxzZQotICAgICAgcm0gLWYgIiRhY19maWxlIgotICAgICAgbXYgIiR0bXAvY29uZmlnLmgiICIkYWNfZmlsZSIgXAotCXx8IGFzX2ZuX2Vycm9yICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQotICAgIGZpCi0gIGVsc2UKLSAgICAkYXNfZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iIFwKLSAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiR0bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIiBcCi0gICAgICB8fCBhc19mbl9lcnJvciAiY291bGQgbm90IGNyZWF0ZSAtIiAiJExJTkVOTyIgNQotICBmaQotIyBDb21wdXRlICIkYWNfZmlsZSIncyBpbmRleCBpbiAkY29uZmlnX2hlYWRlcnMuCi1fYW1fYXJnPSIkYWNfZmlsZSIKLV9hbV9zdGFtcF9jb3VudD0xCi1mb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KLSAgY2FzZSAkX2FtX2hlYWRlciBpbgotICAgICRfYW1fYXJnIHwgJF9hbV9hcmc6KiApCi0gICAgICBicmVhayA7OwotICAgICogKQotICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OwotICBlc2FjCi1kb25lCi1lY2hvICJ0aW1lc3RhbXAgZm9yICRfYW1fYXJnIiA+YCRhc19kaXJuYW1lIC0tICIkX2FtX2FyZyIgfHwKLSRhc19leHByIFgiJF9hbV9hcmciIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJF9hbV9hcmciIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJF9hbV9hcmciIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJF9hbV9hcmciIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWCIkX2FtX2FyZyIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgL3N0YW1wLWgkX2FtX3N0YW1wX2NvdW50Ci0gOzsKLQotICA6QykgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY2O30KLSA7OwotICBlc2FjCi0KLQotICBjYXNlICRhY19maWxlJGFjX21vZGUgaW4KLSAgICAiZGVwZmlsZXMiOkMpIHRlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8IHsKLSAgIyBBdXRvY29uZiAyLjYyIHF1b3RlcyAtLWZpbGUgYXJndW1lbnRzIGZvciBldmFsLCBidXQgbm90IHdoZW4gZmlsZXMKLSAgIyBhcmUgbGlzdGVkIHdpdGhvdXQgLS1maWxlLiAgTGV0J3MgcGxheSBzYWZlIGFuZCBvbmx5IGVuYWJsZSB0aGUgZXZhbAotICAjIGlmIHdlIGRldGVjdCB0aGUgcXVvdGluZy4KLSAgY2FzZSAkQ09ORklHX0ZJTEVTIGluCi0gICpcJyopIGV2YWwgc2V0IHggIiRDT05GSUdfRklMRVMiIDs7Ci0gICopICAgc2V0IHggJENPTkZJR19GSUxFUyA7OwotICBlc2FjCi0gIHNoaWZ0Ci0gIGZvciBtZgotICBkbwotICAgICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0gICAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKLSAgICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgotICAgICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKLSAgICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KLSAgICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcwotICAgICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCi0gICAgIyBHcmVwJ2luZyB0aGUgd2hvbGUgZmlsZSBpcyBub3QgZ29vZCBlaXRoZXI6IEFJWCBncmVwIGhhcyBhIGxpbmUKLSAgICAjIGxpbWl0IG9mIDIwNDgsIGJ1dCBhbGwgc2VkJ3Mgd2Uga25vdyBoYXZlIHVuZGVyc3RhbmQgYXQgbGVhc3QgNDAwMC4KLSAgICBpZiBzZWQgLW4gJ3MsXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZS4qLFgscCcgIiRtZiIgfCBncmVwIFggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICBkaXJwYXJ0PWAkYXNfZGlybmFtZSAtLSAiJG1mIiB8fAotJGFzX2V4cHIgWCIkbWYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJG1mIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRtZiIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkbWYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWCIkbWYiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICAgIGVsc2UKLSAgICAgIGNvbnRpbnVlCi0gICAgZmkKLSAgICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQRElSLCBhbV9faW5jbHVkZSwgYW5kIGFtX19xdW90ZQotICAgICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KLSAgICBERVBESVI9YHNlZCAtbiAncy9eREVQRElSID0gLy9wJyA8ICIkbWYiYAotICAgIHRlc3QgLXogIiRERVBESVIiICYmIGNvbnRpbnVlCi0gICAgYW1fX2luY2x1ZGU9YHNlZCAtbiAncy9eYW1fX2luY2x1ZGUgPSAvL3AnIDwgIiRtZiJgCi0gICAgdGVzdCAteiAiYW1fX2luY2x1ZGUiICYmIGNvbnRpbnVlCi0gICAgYW1fX3F1b3RlPWBzZWQgLW4gJ3MvXmFtX19xdW90ZSA9IC8vcCcgPCAiJG1mImAKLSAgICAjIFdoZW4gdXNpbmcgYW5zaTJrbnIsIFUgbWF5IGJlIGVtcHR5IG9yIGFuIHVuZGVyc2NvcmU7IGV4cGFuZCBpdAotICAgIFU9YHNlZCAtbiAncy9eVSA9IC8vcCcgPCAiJG1mImAKLSAgICAjIEZpbmQgYWxsIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGVzLCB0aGV5IGFyZSBpbmNsdWRlZCBmaWxlcyB3aXRoCi0gICAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCi0gICAgIyBzaW1wbGVzdCBhcHByb2FjaCB0byBjaGFuZ2luZyAkKERFUERJUikgdG8gaXRzIGFjdHVhbCB2YWx1ZSBpbiB0aGUKLSAgICAjIGV4cGFuc2lvbi4KLSAgICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKLSAgICAgIHMvXiRhbV9faW5jbHVkZSAkYW1fX3F1b3RlXCguKihERVBESVIpLipcKSRhbV9fcXVvdGUiJyQvXDEvcCcgPCIkbWYiIHwgXAotCSBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KLSAgICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzLgotICAgICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCi0gICAgICBmZGlyPWAkYXNfZGlybmFtZSAtLSAiJGZpbGUiIHx8Ci0kYXNfZXhwciBYIiRmaWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRmaWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRmaWxlIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRmaWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJGZpbGUiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICAgICAgYXNfZGlyPSRkaXJwYXJ0LyRmZGlyOyBhc19mbl9ta2Rpcl9wCi0gICAgICAjIGVjaG8gImNyZWF0aW5nICRkaXJwYXJ0LyRmaWxlIgotICAgICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCi0gICAgZG9uZQotICBkb25lCi19Ci0gOzsKLSAgICAibGlidG9vbCI6QykKLQotICAgICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKLSAgICAjIGNvbW1hbmRzIHRocm91Z2ggd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KLSAgICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgotICAgICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLSAgICBmaQotCi0gICAgY2ZnZmlsZT0iJHtvZmlsZX1UIgotICAgIHRyYXAgIiRSTSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1Ci0gICAgJFJNICIkY2ZnZmlsZSIKLQotICAgIGNhdCA8PF9MVF9FT0YgPj4gIiRjZmdmaWxlIgotIyEgJFNIRUxMCi0KLSMgYCRFQ0hPICIkb2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRhc19tZSAoJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgotIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCi0jCi0jICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LAotIyAgICAgICAgICAgICAgICAgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0jICAgICAgICAgICAgICAgICBJbmMuCi0jICAgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCwgMTk5NgotIwotIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sLgotIwotIyBHTlUgTGlidG9vbCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotIyBpZiB5b3UgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gb3IgbGlicmFyeSB0aGF0Ci0jIGlzIGJ1aWx0IHVzaW5nIEdOVSBMaWJ0b29sLCB5b3UgbWF5IGluY2x1ZGUgdGhpcyBmaWxlIHVuZGVyIHRoZQotIyBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLSMKLSMgR05VIExpYnRvb2wgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIEdOVSBMaWJ0b29sOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgYSBjb3B5Ci0jIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sLCBvcgotIyBvYnRhaW5lZCBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0jIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotCi0KLSMgVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LgotYXZhaWxhYmxlX3RhZ3M9IiIKLQotIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUcKLQotIyBBIHNlZCBwcm9ncmFtIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0LgotU0VEPSRsdF9TRUQKLQotIyBTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbi4KLVhzZWQ9IlwkU0VEIC1lIDFzL15YLy8iCi0KLSMgQSBncmVwIHByb2dyYW0gdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMuCi1HUkVQPSRsdF9HUkVQCi0KLSMgQW4gRVJFIG1hdGNoZXIuCi1FR1JFUD0kbHRfRUdSRVAKLQotIyBBIGxpdGVyYWwgc3RyaW5nIG1hdGNoZXIuCi1GR1JFUD0kbHRfRkdSRVAKLQotIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgotU0hFTEw9JGx0X1NIRUxMCi0KLSMgQW4gZWNobyBwcm9ncmFtIHRoYXQgcHJvdGVjdHMgYmFja3NsYXNoZXMuCi1FQ0hPPSRsdF9FQ0hPCi0KLSMgV2hpY2ggcmVsZWFzZSBvZiBsaWJ0b29sLm00IHdhcyB1c2VkPwotbWFjcm9fdmVyc2lvbj0kbWFjcm9fdmVyc2lvbgotbWFjcm9fcmV2aXNpb249JG1hY3JvX3JldmlzaW9uCi0KLSMgQXNzZW1ibGVyIHByb2dyYW0uCi1BUz0kbHRfQVMKLQotIyBETEwgY3JlYXRpb24gcHJvZ3JhbS4KLURMTFRPT0w9JGx0X0RMTFRPT0wKLQotIyBPYmplY3QgZHVtcGVyIHByb2dyYW0uCi1PQkpEVU1QPSRsdF9PQkpEVU1QCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCi1idWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYwotCi0jIFdoYXQgdHlwZSBvZiBvYmplY3RzIHRvIGJ1aWxkLgotcGljX21vZGU9JHBpY19tb2RlCi0KLSMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgotZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCi0KLSMgVGhlIGhvc3Qgc3lzdGVtLgotaG9zdF9hbGlhcz0kaG9zdF9hbGlhcwotaG9zdD0kaG9zdAotaG9zdF9vcz0kaG9zdF9vcwotCi0jIFRoZSBidWlsZCBzeXN0ZW0uCi1idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKLWJ1aWxkPSRidWlsZAotYnVpbGRfb3M9JGJ1aWxkX29zCi0KLSMgQSBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIuCi1OTT0kbHRfTk0KLQotIyBXaGV0aGVyIHdlIG5lZWQgc29mdCBvciBoYXJkIGxpbmtzLgotTE5fUz0kbHRfTE5fUwotCi0jIFdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD8KLW1heF9jbWRfbGVuPSRtYXhfY21kX2xlbgotCi0jIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KLW9iamV4dD0kYWNfb2JqZXh0Ci0KLSMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgotZXhlZXh0PSRleGVleHQKLQotIyB3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyAidW5zZXQiLgotbHRfdW5zZXQ9JGx0X3Vuc2V0Ci0KLSMgdHVybiBzcGFjZXMgaW50byBuZXdsaW5lcy4KLVNQMk5MPSRsdF9sdF9TUDJOTAotCi0jIHR1cm4gbmV3bGluZXMgaW50byBzcGFjZXMuCi1OTDJTUD0kbHRfbHRfTkwyU1AKLQotIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAotCi0jIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gImZpbGVfbWFnaWMiLgotZmlsZV9tYWdpY19jbWQ9JGx0X2ZpbGVfbWFnaWNfY21kCi0KLSMgVGhlIGFyY2hpdmVyLgotQVI9JGx0X0FSCi1BUl9GTEFHUz0kbHRfQVJfRkxBR1MKLQotIyBBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbS4KLVNUUklQPSRsdF9TVFJJUAotCi0jIENvbW1hbmRzIHVzZWQgdG8gaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KLVJBTkxJQj0kbHRfUkFOTElCCi1vbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBXaGV0aGVyIHRvIHVzZSBhIGxvY2sgZm9yIG9sZCBhcmNoaXZlIGV4dHJhY3Rpb24uCi1sb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb249JGxvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbgotCi0jIEEgQyBjb21waWxlci4KLUxUQ0M9JGx0X0NDCi0KLSMgTFRDQyBjb21waWxlciBmbGFncy4KLUxUQ0ZMQUdTPSRsdF9DRkxBR1MKLQotIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgotZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbi4KLWdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyLgotZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIgd2hlbiBsaWIgcHJlZml4IGlzIG5lZWRlZC4KLWdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeAotCi0jIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KLW9iamRpcj0kb2JqZGlyCi0KLSMgVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyB3aXRoICJmaWxlIi4KLU1BR0lDX0NNRD0kTUFHSUNfQ01ECi0KLSMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24/Ci1uZWVkX2xvY2tzPSRsdF9uZWVkX2xvY2tzCi0KLSMgVG9vbCB0byBtYW5pcHVsYXRlIGFyY2hpdmVkIERXQVJGIGRlYnVnIHN5bWJvbCBmaWxlcyBvbiBNYWMgT1MgWC4KLURTWU1VVElMPSRsdF9EU1lNVVRJTAotCi0jIFRvb2wgdG8gY2hhbmdlIGdsb2JhbCB0byBsb2NhbCBzeW1ib2xzIG9uIE1hYyBPUyBYLgotTk1FRElUPSRsdF9OTUVESVQKLQotIyBUb29sIHRvIG1hbmlwdWxhdGUgZmF0IG9iamVjdHMgYW5kIGFyY2hpdmVzIG9uIE1hYyBPUyBYLgotTElQTz0kbHRfTElQTwotCi0jIGxkZC9yZWFkZWxmIGxpa2UgdG9vbCBmb3IgTWFjaC1PIGJpbmFyaWVzIG9uIE1hYyBPUyBYLgotT1RPT0w9JGx0X09UT09MCi0KLSMgbGRkL3JlYWRlbGYgbGlrZSB0b29sIGZvciA2NCBiaXQgTWFjaC1PIGJpbmFyaWVzIG9uIE1hYyBPUyBYIDEwLjQuCi1PVE9PTDY0PSRsdF9PVE9PTDY0Ci0KLSMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgotbGliZXh0PSRsaWJleHQKLQotIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KLXNocmV4dF9jbWRzPSRsdF9zaHJleHRfY21kcwotCi0jIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1leHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKLQotIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKLSMgcmVzdG9yZWQgYXQgbGluayB0aW1lLgotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9JGx0X3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rCi0KLSMgRG8gd2UgbmVlZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzPwotbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKLQotIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPwotbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KLQotIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KLXZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCi0KLSMgU2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgotcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCi0KLSMgU2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KLXNobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKLQotIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAotCi0jIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgotbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKLQotIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgotIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FCi1saWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYwotCi0jIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgotc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCi0KLSMgUGVybWlzc2lvbiBtb2RlIG92ZXJyaWRlIGZvciBpbnN0YWxsYXRpb24gb2Ygc2hhcmVkIGxpYnJhcmllcy4KLWluc3RhbGxfb3ZlcnJpZGVfbW9kZT0kbHRfaW5zdGFsbF9vdmVycmlkZV9tb2RlCi0KLSMgQ29tbWFuZCB0byB1c2UgYWZ0ZXIgaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmUuCi1wb3N0aW5zdGFsbF9jbWRzPSRsdF9wb3N0aW5zdGFsbF9jbWRzCi0KLSMgQ29tbWFuZCB0byB1c2UgYWZ0ZXIgdW5pbnN0YWxsYXRpb24gb2YgYSBzaGFyZWQgYXJjaGl2ZS4KLXBvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgotZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCi0KLSMgQXMgImZpbmlzaF9jbWRzIiwgZXhjZXB0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0Ci0jIG5vdCBzaG93bi4KLWZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAotCi0jIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCi1oYXJkY29kZV9pbnRvX2xpYnM9JGhhcmRjb2RlX2ludG9fbGlicwotCi0jIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcy4KLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0KLSMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMuCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKLQotIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKLQotIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCi1vbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgotc3RyaXBsaWI9JGx0X3N0cmlwbGliCi0KLQotIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgotTEQ9JGx0X0xECi0KLSMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KLXJlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZwotcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHMKLQotIyBBIGxhbmd1YWdlIHNwZWNpZmljIGNvbXBpbGVyLgotQ0M9JGx0X2NvbXBpbGVyCi0KLSMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgY29tcGlsZXI/Ci13aXRoX2djYz0kR0NDCi0KLSMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KLW5vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcKLQotIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgotd2w9JGx0X2x0X3Byb2dfY29tcGlsZXJfd2wKLQotIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCi1waWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWMKLQotIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgotbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWMKLQotIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Ci1jb21waWxlcl9jX289JGx0X2x0X2N2X3Byb2dfY29tcGlsZXJfY19vCi0KLSMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbmVlZF9sYz0kYXJjaGl2ZV9jbWRzX25lZWRfbGMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljLgotYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjCi0KLSMgV2hldGhlciB0aGUgY29tcGlsZXIgY29wZXMgd2l0aCBwYXNzaW5nIG5vIG9iamVjdHMgZGlyZWN0bHkuCi1jb21waWxlcl9uZWVkc19vYmplY3Q9JGx0X2NvbXBpbGVyX25lZWRzX29iamVjdAotCi0jIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzCi0KLSMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIHNoYXJlZCBhcmNoaXZlLgotYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHMKLWFyY2hpdmVfZXhwc3ltX2NtZHM9JGx0X2FyY2hpdmVfZXhwc3ltX2NtZHMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIGlmIGRpZmZlcmVudCBmcm9tIGJ1aWxkaW5nCi0jIGEgc2hhcmVkIGFyY2hpdmUuCi1tb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHMKLW1vZHVsZV9leHBzeW1fY21kcz0kbHRfbW9kdWxlX2V4cHN5bV9jbWRzCi0KLSMgV2hldGhlciB3ZSBhcmUgYnVpbGRpbmcgd2l0aCBHTlUgbGQgb3Igbm90Lgotd2l0aF9nbnVfbGQ9JGx0X3dpdGhfZ251X2xkCi0KLSMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCi1hbGxvd191bmRlZmluZWRfZmxhZz0kbHRfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLQotIyBGbGFnIHRoYXQgZW5mb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCi1ub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWcKLQotIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCi0jIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QKLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMKLQotIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5Ci0jIGR1cmluZyBsaW5raW5nLiAgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQKLQotIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgIi1ycGF0aCIgZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcgotCi0jIFNldCB0byAieWVzIiBpZiB1c2luZyBESVIvbGliTkFNRVwke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcwotIyBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0Ci0KLSMgU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIERJUi9saWJOQU1FXCR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzCi0jIERJUiBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5IGFuZCB0aGUgcmVzdWx0aW5nIGxpYnJhcnkgZGVwZW5kZW5jeSBpcwotIyAiYWJzb2x1dGUiLGkuZSBpbXBvc3NpYmxlIHRvIGNoYW5nZSBieSBzZXR0aW5nIFwke3NobGlicGF0aF92YXJ9IGlmIHRoZQotIyBsaWJyYXJ5IGlzIHJlbG9jYXRlZC4KLWhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT0kaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlCi0KLSMgU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKLSMgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0wKLQotIyBTZXQgdG8gInllcyIgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUgotIyBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3ZhcgotCi0jIFNldCB0byAieWVzIiBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUgotIyBpbnRvIHRoZSBsaWJyYXJ5IGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZAotIyBhZ2FpbnN0IGl0LgotaGFyZGNvZGVfYXV0b21hdGljPSRoYXJkY29kZV9hdXRvbWF0aWMKLQotIyBTZXQgdG8geWVzIGlmIGxpbmtlciBhZGRzIHJ1bnRpbWUgcGF0aHMgb2YgZGVwZW5kZW50IGxpYnJhcmllcwotIyB0byBydW50aW1lIHBhdGggbGlzdC4KLWluaGVyaXRfcnBhdGg9JGluaGVyaXRfcnBhdGgKLQotIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCi1saW5rX2FsbF9kZXBsaWJzPSRsaW5rX2FsbF9kZXBsaWJzCi0KLSMgRml4IHRoZSBzaGVsbCB2YXJpYWJsZSBcJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlci4KLWZpeF9zcmNmaWxlX3BhdGg9JGx0X2ZpeF9zcmNmaWxlX3BhdGgKLQotIyBTZXQgdG8gInllcyIgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCi1hbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9scwotCi0jIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCi1leHBvcnRfc3ltYm9sc19jbWRzPSRsdF9leHBvcnRfc3ltYm9sc19jbWRzCi0KLSMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KLWV4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zCi0KLSMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgotaW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXMKLQotIyBDb21tYW5kcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgcHJvZ3JhbXMgKGFnYWluc3QgbGlicmFyaWVzKSB3aXRoIHRlbXBsYXRlcy4KLXByZWxpbmtfY21kcz0kbHRfcHJlbGlua19jbWRzCi0KLSMgU3BlY2lmeSBmaWxlbmFtZSBjb250YWluaW5nIGlucHV0IGZpbGVzLgotZmlsZV9saXN0X3NwZWM9JGx0X2ZpbGVfbGlzdF9zcGVjCi0KLSMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCi1oYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbgotCi0jICMjIyBFTkQgTElCVE9PTCBDT05GSUcKLQotX0xUX0VPRgotCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgYWl4MyopCi0gICAgY2F0IDw8XF9MVF9FT0YgPj4gIiRjZmdmaWxlIgotIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCi0jIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLWlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgotICBDT0xMRUNUX05BTUVTPQotICBleHBvcnQgQ09MTEVDVF9OQU1FUwotZmkKLV9MVF9FT0YKLSAgICA7OwotICBlc2FjCi0KLQotbHRtYWluPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLQotICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKLSAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgotICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQotICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPwotICBzZWQgJy9eIyBHZW5lcmF0ZWQgc2hlbGwgZnVuY3Rpb25zIGluc2VydGVkIGhlcmUvcScgIiRsdG1haW4iID4+ICIkY2ZnZmlsZSIgXAotICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCi0KLSAgY2FzZSAkeHNpX3NoZWxsIGluCi0gIHllcykKLSAgICBjYXQgPDwgXF9MVF9FT0YgPj4gIiRjZmdmaWxlIgotCi0jIGZ1bmNfZGlybmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKLSMgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwKLSMgb3RoZXJ3aXNlIHNldCByZXN1bHQgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgotZnVuY19kaXJuYW1lICgpCi17Ci0gIGNhc2UgJHsxfSBpbgotICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7Ci0gICAgKiAgKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IiA7OwotICBlc2FjCi19Ci0KLSMgZnVuY19iYXNlbmFtZSBmaWxlCi1mdW5jX2Jhc2VuYW1lICgpCi17Ci0gIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PSIkezEjIyovfSIKLX0KLQotIyBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lIGZpbGUgYXBwZW5kIG5vbmRpcl9yZXBsYWNlbWVudAotIyBwZXJmb3JtIGZ1bmNfYmFzZW5hbWUgYW5kIGZ1bmNfZGlybmFtZSBpbiBhIHNpbmdsZSBmdW5jdGlvbgotIyBjYWxsOgotIyAgIGRpcm5hbWU6ICBDb21wdXRlIHRoZSBkaXJuYW1lIG9mIEZJTEUuICBJZiBub25lbXB0eSwKLSMgICAgICAgICAgICAgYWRkIEFQUEVORCB0byB0aGUgcmVzdWx0LCBvdGhlcndpc2Ugc2V0IHJlc3VsdAotIyAgICAgICAgICAgICB0byBOT05ESVJfUkVQTEFDRU1FTlQuCi0jICAgICAgICAgICAgIHZhbHVlIHJldHVybmVkIGluICIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLSMgICBiYXNlbmFtZTogQ29tcHV0ZSBmaWxlbmFtZSBvZiBGSUxFLgotIyAgICAgICAgICAgICB2YWx1ZSByZXR1bmVkIGluICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0jIEltcGxlbWVudGF0aW9uIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCBmdW5jX2Rpcm5hbWUKLSMgYW5kIGZ1bmNfYmFzZW5hbWUuIEZvciBlZmZpY2llbmN5LCB3ZSBkbyBub3QgZGVsZWdhdGUgdG8KLSMgdGhvc2UgZnVuY3Rpb25zIGJ1dCBpbnN0ZWFkIGR1cGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBoZXJlLgotZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAoKQotewotICBjYXNlICR7MX0gaW4KLSAgICAqLyopIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7MSUvKn0kezJ9IiA7OwotICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOzsKLSAgZXNhYwotICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD0iJHsxIyMqL30iCi19Ci0KLSMgZnVuY19zdHJpcG5hbWUgcHJlZml4IHN1ZmZpeCBuYW1lCi0jIHN0cmlwIFBSRUZJWCBhbmQgU1VGRklYIG9mZiBvZiBOQU1FLgotIyBQUkVGSVggYW5kIFNVRkZJWCBtdXN0IG5vdCBjb250YWluIGdsb2JiaW5nIG9yIHJlZ2V4IHNwZWNpYWwKLSMgY2hhcmFjdGVycywgaGFzaGVzLCBwZXJjZW50IHNpZ25zLCBidXQgU1VGRklYIG1heSBjb250YWluIGEgbGVhZGluZwotIyBkb3QgKGluIHdoaWNoIGNhc2UgdGhhdCBtYXRjaGVzIG9ubHkgYSBkb3QpLgotZnVuY19zdHJpcG5hbWUgKCkKLXsKLSAgIyBwZGtzaCA1LjIuMTQgZG9lcyBub3QgZG8gJHtYJSRZfSBjb3JyZWN0bHkgaWYgYm90aCBYIGFuZCBZIGFyZQotICAjIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgc28gYXNzaWduIG9uZSB0byBvcmRpbmFyeSBwYXJhbWV0ZXIgZmlyc3QuCi0gIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0kezN9Ci0gIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCMiJHsxfSJ9Ci0gIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCUiJHsyfSJ9Ci19Ci0KLSMgZnVuY19vcHRfc3BsaXQKLWZ1bmNfb3B0X3NwbGl0ICgpCi17Ci0gIGZ1bmNfb3B0X3NwbGl0X29wdD0kezElJT0qfQotICBmdW5jX29wdF9zcGxpdF9hcmc9JHsxIyo9fQotfQotCi0jIGZ1bmNfbG8ybyBvYmplY3QKLWZ1bmNfbG8ybyAoKQotewotICBjYXNlICR7MX0gaW4KLSAgICAqLmxvKSBmdW5jX2xvMm9fcmVzdWx0PSR7MSUubG99LiR7b2JqZXh0fSA7OwotICAgICopICAgIGZ1bmNfbG8yb19yZXN1bHQ9JHsxfSA7OwotICBlc2FjCi19Ci0KLSMgZnVuY194Zm9ybSBsaWJvYmotb3Itc291cmNlCi1mdW5jX3hmb3JtICgpCi17Ci0gIGZ1bmNfeGZvcm1fcmVzdWx0PSR7MSUuKn0ubG8KLX0KLQotIyBmdW5jX2FyaXRoIGFyaXRobWV0aWMtdGVybS4uLgotZnVuY19hcml0aCAoKQotewotICBmdW5jX2FyaXRoX3Jlc3VsdD0kKCggJCogKSkKLX0KLQotIyBmdW5jX2xlbiBzdHJpbmcKLSMgU1RSSU5HIG1heSBub3Qgc3RhcnQgd2l0aCBhIGh5cGhlbi4KLWZ1bmNfbGVuICgpCi17Ci0gIGZ1bmNfbGVuX3Jlc3VsdD0keyMxfQotfQotCi1fTFRfRU9GCi0gICAgOzsKLSAgKikgIyBCb3VybmUgY29tcGF0aWJsZSBmdW5jdGlvbnMuCi0gICAgY2F0IDw8IFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKLQotIyBmdW5jX2Rpcm5hbWUgZmlsZSBhcHBlbmQgbm9uZGlyX3JlcGxhY2VtZW50Ci0jIENvbXB1dGUgdGhlIGRpcm5hbWUgb2YgRklMRS4gIElmIG5vbmVtcHR5LCBhZGQgQVBQRU5EIHRvIHRoZSByZXN1bHQsCi0jIG90aGVyd2lzZSBzZXQgcmVzdWx0IHRvIE5PTkRJUl9SRVBMQUNFTUVOVC4KLWZ1bmNfZGlybmFtZSAoKQotewotICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgotICBmdW5jX2Rpcm5hbWVfcmVzdWx0PWAkRUNITyAiJHsxfSIgfCAkU0VEICIkZGlybmFtZSJgCi0gIGlmIHRlc3QgIlgkZnVuY19kaXJuYW1lX3Jlc3VsdCIgPSAiWCR7MX0iOyB0aGVuCi0gICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIKLSAgZWxzZQotICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0JHsyfSIKLSAgZmkKLX0KLQotIyBmdW5jX2Jhc2VuYW1lIGZpbGUKLWZ1bmNfYmFzZW5hbWUgKCkKLXsKLSAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezF9IiB8ICRTRUQgIiRiYXNlbmFtZSJgCi19Ci0KLQotIyBmdW5jX3N0cmlwbmFtZSBwcmVmaXggc3VmZml4IG5hbWUKLSMgc3RyaXAgUFJFRklYIGFuZCBTVUZGSVggb2ZmIG9mIE5BTUUuCi0jIFBSRUZJWCBhbmQgU1VGRklYIG11c3Qgbm90IGNvbnRhaW4gZ2xvYmJpbmcgb3IgcmVnZXggc3BlY2lhbAotIyBjaGFyYWN0ZXJzLCBoYXNoZXMsIHBlcmNlbnQgc2lnbnMsIGJ1dCBTVUZGSVggbWF5IGNvbnRhaW4gYSBsZWFkaW5nCi0jIGRvdCAoaW4gd2hpY2ggY2FzZSB0aGF0IG1hdGNoZXMgb25seSBhIGRvdCkuCi0jIGZ1bmNfc3RyaXBfc3VmZml4IHByZWZpeCBuYW1lCi1mdW5jX3N0cmlwbmFtZSAoKQotewotICBjYXNlICR7Mn0gaW4KLSAgICAuKikgZnVuY19zdHJpcG5hbWVfcmVzdWx0PWAkRUNITyAiJHszfSIgfCAkU0VEICJzJV4kezF9JSU7IHMlXFxcXCR7Mn1cJCUlImA7OwotICAgICopICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezN9IiB8ICRTRUQgInMlXiR7MX0lJTsgcyUkezJ9XCQlJSJgOzsKLSAgZXNhYwotfQotCi0jIHNlZCBzY3JpcHRzOgotbXlfc2VkX2xvbmdfb3B0PScxcy9eXCgtW149XSpcKT0uKi9cMS87cScKLW15X3NlZF9sb25nX2FyZz0nMXMvXi1bXj1dKj0vLycKLQotIyBmdW5jX29wdF9zcGxpdAotZnVuY19vcHRfc3BsaXQgKCkKLXsKLSAgZnVuY19vcHRfc3BsaXRfb3B0PWAkRUNITyAiJHsxfSIgfCAkU0VEICIkbXlfc2VkX2xvbmdfb3B0ImAKLSAgZnVuY19vcHRfc3BsaXRfYXJnPWAkRUNITyAiJHsxfSIgfCAkU0VEICIkbXlfc2VkX2xvbmdfYXJnImAKLX0KLQotIyBmdW5jX2xvMm8gb2JqZWN0Ci1mdW5jX2xvMm8gKCkKLXsKLSAgZnVuY19sbzJvX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAiJGxvMm8iYAotfQotCi0jIGZ1bmNfeGZvcm0gbGlib2JqLW9yLXNvdXJjZQotZnVuY194Zm9ybSAoKQotewotICBmdW5jX3hmb3JtX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAncy9cLlteLl0qJC8ubG8vJ2AKLX0KLQotIyBmdW5jX2FyaXRoIGFyaXRobWV0aWMtdGVybS4uLgotZnVuY19hcml0aCAoKQotewotICBmdW5jX2FyaXRoX3Jlc3VsdD1gZXhwciAiJEAiYAotfQotCi0jIGZ1bmNfbGVuIHN0cmluZwotIyBTVFJJTkcgbWF5IG5vdCBzdGFydCB3aXRoIGEgaHlwaGVuLgotZnVuY19sZW4gKCkKLXsKLSAgZnVuY19sZW5fcmVzdWx0PWBleHByICIkMSIgOiAiLioiIDI+L2Rldi9udWxsIHx8IGVjaG8gJG1heF9jbWRfbGVuYAotfQotCi1fTFRfRU9GCi1lc2FjCi0KLWNhc2UgJGx0X3NoZWxsX2FwcGVuZCBpbgotICB5ZXMpCi0gICAgY2F0IDw8IFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKLQotIyBmdW5jX2FwcGVuZCB2YXIgdmFsdWUKLSMgQXBwZW5kIFZBTFVFIHRvIHRoZSBlbmQgb2Ygc2hlbGwgdmFyaWFibGUgVkFSLgotZnVuY19hcHBlbmQgKCkKLXsKLSAgZXZhbCAiJDErPVwkMiIKLX0KLV9MVF9FT0YKLSAgICA7OwotICAqKQotICAgIGNhdCA8PCBcX0xUX0VPRiA+PiAiJGNmZ2ZpbGUiCi0KLSMgZnVuY19hcHBlbmQgdmFyIHZhbHVlCi0jIEFwcGVuZCBWQUxVRSB0byB0aGUgZW5kIG9mIHNoZWxsIHZhcmlhYmxlIFZBUi4KLWZ1bmNfYXBwZW5kICgpCi17Ci0gIGV2YWwgIiQxPVwkJDFcJDIiCi19Ci0KLV9MVF9FT0YKLSAgICA7OwotICBlc2FjCi0KLQotICBzZWQgLW4gJy9eIyBHZW5lcmF0ZWQgc2hlbGwgZnVuY3Rpb25zIGluc2VydGVkIGhlcmUvLCRwJyAiJGx0bWFpbiIgPj4gIiRjZmdmaWxlIiBcCi0gICAgfHwgKHJtIC1mICIkY2ZnZmlsZSI7IGV4aXQgMSkKLQotICBtdiAtZiAiJGNmZ2ZpbGUiICIkb2ZpbGUiIHx8Ci0gICAgKHJtIC1mICIkb2ZpbGUiICYmIGNwICIkY2ZnZmlsZSIgIiRvZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlIikKLSAgY2htb2QgK3ggIiRvZmlsZSIKLQotIDs7Ci0gICAgImxpYnBuZy1jb25maWciOkYpIGNobW9kICt4IGxpYnBuZy1jb25maWcgOzsKLQotICBlc2FjCi1kb25lICMgZm9yIGFjX3RhZwotCi0KLWFzX2ZuX2V4aXQgMAotX0FDRU9GCi1hY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQotCi10ZXN0ICRhY193cml0ZV9mYWlsID0gMCB8fAotICBhc19mbl9lcnJvciAid3JpdGUgZmFpbHVyZSBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKLQotCi0jIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGFuZCB0aGVuIGNhbGxzIGNvbmZpZy5zdGF0dXMuCi0jIGNvbmZpZy5zdGF0dXMgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLCBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZy4KLSMgVW5mb3J0dW5hdGVseSwgb24gRE9TIHRoaXMgZmFpbHMsIGFzIGNvbmZpZy5sb2cgaXMgc3RpbGwga2VwdCBvcGVuCi0jIGJ5IGNvbmZpZ3VyZSwgc28gY29uZmlnLnN0YXR1cyB3b24ndCBiZSBhYmxlIHRvIHdyaXRlIHRvIGl0OyBpdHMKLSMgb3V0cHV0IGlzIHNpbXBseSBkaXNjYXJkZWQuICBTbyB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsCi0jIGVmZmVjdGl2ZWx5IGNsb3NpbmcgY29uZmlnLmxvZywgc28gaXQgY2FuIGJlIHByb3Blcmx5IChyZSlvcGVuZWQgYW5kCi0jIGFwcGVuZGVkIHRvIGJ5IGNvbmZpZy5zdGF0dXMuICBXaGVuIGNvbWluZyBiYWNrIHRvIGNvbmZpZ3VyZSwgd2UKLSMgbmVlZCB0byBtYWtlIHRoZSBGRCBhdmFpbGFibGUgYWdhaW4uCi1pZiB0ZXN0ICIkbm9fY3JlYXRlIiAhPSB5ZXM7IHRoZW4KLSAgYWNfY3Nfc3VjY2Vzcz06Ci0gIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0KLSAgdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYKLSAgICBhY19jb25maWdfc3RhdHVzX2FyZ3M9IiRhY19jb25maWdfc3RhdHVzX2FyZ3MgLS1xdWlldCIKLSAgZXhlYyA1Pi9kZXYvbnVsbAotICAkU0hFTEwgJENPTkZJR19TVEFUVVMgJGFjX2NvbmZpZ19zdGF0dXNfYXJncyB8fCBhY19jc19zdWNjZXNzPWZhbHNlCi0gIGV4ZWMgNT4+Y29uZmlnLmxvZwotICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAotICAjIHdvdWxkIG1ha2UgY29uZmlndXJlIGZhaWwgaWYgdGhpcyBpcyB0aGUgbGFzdCBpbnN0cnVjdGlvbi4KLSAgJGFjX2NzX3N1Y2Nlc3MgfHwgYXNfZm5fZXhpdCAkPwotZmkKLWlmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyIgJiYgdGVzdCAiJGVuYWJsZV9vcHRpb25fY2hlY2tpbmciICE9IG5vOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjI7fQotZmkKLQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb25maWd1cmUuYWMgYi9zcmMvbGlicG5nL2NvbmZpZ3VyZS5hYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdhNDUwZS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbmZpZ3VyZS5hYworKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0jIGNvbmZpZ3VyZS5hYwotCi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLWRubAotZG5sIE1pbm9yIHVwZ3JhZGVzIChjb21wYXRpYmxlIEFCSSk6IGluY3JlbWVudCB0aGUgcGFja2FnZSB2ZXJzaW9uCi1kbmwgKHRoaXJkIGZpZWxkIGluIHR3byBwbGFjZXMgYmVsb3cpIGFuZCBzZXQgdGhlIFBOR0xJQl9SRUxFQVNFCi1kbmwgdmFyaWFibGUuCi1kbmwKLWRubCBNYWpvciB1cGdyYWRlcyAoaW5jb21wYXRpYmxlIEFCSSk6IGluY3JlbWVudCB0aGUgcGFja2FnZSBtYWpvcgotZG5sIHZlcnNpb24gKHNlY29uZCBmaWVsZCwgb3IgZmlyc3QgaWYgZGVzaXJlZCksIHNldCB0aGUgbWlub3IKLWRubCB0byAwLCBzZXQgUE5HTElCX01BSk9SIGJlbG93ICphbmQqIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluCi1kbmwgTWFrZWZpbGUuYW0gdG8gdXBncmFkZSB0aGUgcGFja2FnZSBuYW1lLgotCi1kbmwgVGhpcyBpcyBoZXJlIHRvIHByZXZlbnQgZWFybGllciBhdXRvY29uZiBmcm9tIGJlaW5nIHVzZWQsIGl0Ci1kbmwgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgdG8gcmVnZW5lcmF0ZSBjb25maWd1cmUgaWYgdGhlIHRpbWUKLWRubCBzdGFtcHMgYXJlIGNvcnJlY3QKLUFDX1BSRVJFUSgyLjU5KQotCi1BQ19JTklUKFtsaWJwbmddLCBbMS40LjEyXSwgW3BuZy1tbmctaW1wbGVtZW50QGxpc3RzLnNvdXJjZWZvcmdlLm5ldF0pCi1BTV9JTklUX0FVVE9NQUtFCi1kbmwgc3RvcCBjb25maWd1cmUgZnJvbSBhdXRvbWFnaWNhbGx5IHJ1bm5pbmcgYXV0b21ha2UKLUFNX01BSU5UQUlORVJfTU9ERQotCi1kbmwgVmVyc2lvbiBudW1iZXIgc3R1ZmYgaGVyZToKLQotUE5HTElCX1ZFUlNJT049MS40LjEyCi1QTkdMSUJfTUFKT1I9MQotUE5HTElCX01JTk9SPTQKLVBOR0xJQl9SRUxFQVNFPTEyCi0KLWRubCBFbmQgb2YgdmVyc2lvbiBudW1iZXIgc3R1ZmYKLQotQUNfQ09ORklHX1NSQ0RJUihbcG5nZ2V0LmNdKQotQU1fQ09ORklHX0hFQURFUihjb25maWcuaCkKLQotIyBDaGVja3MgZm9yIHByb2dyYW1zLgotQUNfUFJPR19DQwotQUNfUFJPR19MRAotQUNfUFJPR19DUFAKLUFDX0NIRUNLX1RPT0woU0VELCBzZWQsIDopCi1BQ19QUk9HX0lOU1RBTEwKLUFDX1BST0dfTE5fUwotQUNfUFJPR19NQUtFX1NFVAotTFRfSU5JVChbd2luMzItZGxsXSkKLQotIyBDaGVja3MgZm9yIGhlYWRlciBmaWxlcy4KLUFDX0hFQURFUl9TVERDCi1BQ19DSEVDS19IRUFERVJTKFttYWxsb2MuaCBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmhdKQotCi0jIENoZWNrcyBmb3IgdHlwZWRlZnMsIHN0cnVjdHVyZXMsIGFuZCBjb21waWxlciBjaGFyYWN0ZXJpc3RpY3MuCi1BQ19DX0NPTlNUCi1BQ19UWVBFX1NJWkVfVAotQUNfU1RSVUNUX1RNCi0KLSMgQ2hlY2tzIGZvciBsaWJyYXJ5IGZ1bmN0aW9ucy4KLUFDX0ZVTkNfU1RSVE9ECi1BQ19DSEVDS19GVU5DUyhbbWVtc2V0XSwgLCBBQ19FUlJPUihbbWVtc2V0IG5vdCBmb3VuZCBpbiBsaWJjXSkpCi1BQ19DSEVDS19GVU5DUyhbcG93XSwgLCBBQ19DSEVDS19MSUIobSwgcG93LCAsIEFDX0VSUk9SKFtjYW5ub3QgZmluZCBwb3ddKSkgKQotQUNfQ0hFQ0tfTElCKHosIHpsaWJWZXJzaW9uLCAsIEFDX0VSUk9SKFt6bGliIG5vdCBpbnN0YWxsZWRdKSkKLQotY2FzZSAkaG9zdF9vcyBpbgotICBhaXgqKQotICAgTElCUE5HX0RFRklORVM9Ii1EUE5HX0NPTkZJR1VSRV9MSUJQTkcgLURfQUxMX1NPVVJDRSI7OwotICAqKQotICAgTElCUE5HX0RFRklORVM9LURQTkdfQ09ORklHVVJFX0xJQlBORzs7Ci1lc2FjCi1MSUJQTkdfREVGSU5FUz0kTElCUE5HX0RFRklORVMKLUFDX1NVQlNUKExJQlBOR19ERUZJTkVTKQotCi1BQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnJhcmllcyBjYW4gYmUgdmVyc2lvbmVkXSkKLSMgU3BlY2lhbCBjYXNlIGZvciBQRS9DT0ZGIHBsYXRmb3JtczogbGQgcmVwb3J0cwotIyBzdXBwb3J0IGZvciB2ZXJzaW9uLXNjcmlwdCwgYnV0IGRvZXNuJ3QgYWN0dWFsbHkKLSMgRE8gYW55dGhpbmcgd2l0aCBpdC4KLWNhc2UgJGhvc3QgaW4KLSpjeWd3aW4qIHwgKm1pbmd3MzIqICkKLSAgICBoYXZlX2xkX3ZlcnNpb25fc2NyaXB0PW5vCi0gICAgQUNfTVNHX1JFU1VMVChubykKLTs7Ci0qICkKLQotQUNfTVNHX0NIRUNLSU5HKFtpZiB1c2luZyBTb2xhcmlzIGxpbmtlcl0pCi1TTEQ9YCRMRCAtLXZlcnNpb24gMj4mMSB8IGdyZXAgU29sYXJpc2AKLWlmIHRlc3QgIiRTTEQiOyB0aGVuCi0gICAgaGF2ZV9zb2xhcmlzX2xkPXllcwotICAgIEFDX01TR19SRVNVTFQoeWVzKQotZWxzZQotICAgIGhhdmVfc29sYXJpc19sZD1ubwotICAgIEFDX01TR19SRVNVTFQobm8pCi1maQotQU1fQ09ORElUSU9OQUwoSEFWRV9TT0xBUklTX0xELCB0ZXN0ICIkaGF2ZV9zb2xhcmlzX2xkIiA9ICJ5ZXMiKQotCi1pZiB0ZXN0ICIkaGF2ZV9zb2xhcmlzX2xkIiA9ICJ5ZXMiOyB0aGVuCi0gICAgR0xEPWAkTEQgLS1oZWxwIDwgL2Rldi9udWxsIDI+JjEgfCBncmVwICdNIG1hcGZpbGUnYAotZWxzZQotICAgIEdMRD1gJExEIC0taGVscCA8IC9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8IGdyZXAgdmVyc2lvbi1zY3JpcHRgCi1maQotCi1pZiB0ZXN0ICIkR0xEIjsgdGhlbgotICAgIGhhdmVfbGRfdmVyc2lvbl9zY3JpcHQ9eWVzCi0gICAgQUNfTVNHX1JFU1VMVCh5ZXMpCi1lbHNlCi0gICAgaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdD1ubwotICAgIEFDX01TR19SRVNVTFQobm8pCi0gICAgQUNfTVNHX1dBUk4oKioqIFlvdSBoYXZlIG5vdCBlbmFibGVkIHZlcnNpb25lZCBzeW1ib2xzLikKLWZpCi07OwotZXNhYwotCi1BTV9DT05ESVRJT05BTChIQVZFX0xEX1ZFUlNJT05fU0NSSVBULCB0ZXN0ICIkaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdCIgPSAieWVzIikKLQotaWYgdGVzdCAiJGhhdmVfbGRfdmVyc2lvbl9zY3JpcHQiID0gInllcyI7IHRoZW4KLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzeW1ib2wgcHJlZml4XSkKLSAgICBTWU1CT0xfUFJFRklYPWBlY2hvICJQUkVGSVg9X19VU0VSX0xBQkVMX1BSRUZJWF9fIiBcCi0gICAgICAgICAgICAgICAgICAgfCAke0NQUC0ke0NDLWdjY30gLUV9IC0gMj4mMSBcCi0gICAgICAgICAgICAgICAgICAgfCAke0VHUkVQLWdyZXB9ICJeUFJFRklYPSIgXAotICAgICAgICAgICAgICAgICAgIHwgJHtTRUQtc2VkfSAiczpeUFJFRklYPTo6ImAKLSAgICBBQ19TVUJTVChTWU1CT0xfUFJFRklYKQotICAgIEFDX01TR19SRVNVTFQoJFNZTUJPTF9QUkVGSVgpCi1maQotCi0jIFN1YnN0aXR1dGlvbnMgZm9yIC5pbiBmaWxlcwotQUNfU1VCU1QoUE5HTElCX1ZFUlNJT04pCi1BQ19TVUJTVChQTkdMSUJfTUFKT1IpCi1BQ19TVUJTVChQTkdMSUJfTUlOT1IpCi1BQ19TVUJTVChQTkdMSUJfUkVMRUFTRSkKLQotIyBBZGRpdGlvbmFsIGFyZ3VtZW50cyAoYW5kIHN1YnN0aXR1dGlvbnMpCi0jIEFsbG93IHRoZSBwa2ctY29uZmlnIGRpcmVjdG9yeSB0byBiZSBzZXQKLUFDX0FSR19XSVRIKHBrZ2NvbmZpZ2RpciwKLQlBQ19IRUxQX1NUUklORyhbLS13aXRoLXBrZ2NvbmZpZ2Rpcl0sCi0JW1VzZSB0aGUgc3BlY2lmaWVkIHBrZ2NvbmZpZyBkaXIgKGRlZmF1bHQgaXMgbGliZGlyL3BrZ2NvbmZpZyldKSwKLQlbcGtnY29uZmlnZGlyPSR7d2l0aHZhbH1dLAotCVtwa2djb25maWdkaXI9JyR7bGliZGlyfS9wa2djb25maWcnXSkKLQotQUNfU1VCU1QoW3BrZ2NvbmZpZ2Rpcl0pCi1BQ19NU0dfTk9USUNFKFtwa2djb25maWcgZGlyZWN0b3J5IGlzICR7cGtnY29uZmlnZGlyfV0pCi0KLSMgTWFrZSB0aGUgKi1jb25maWcgYmluYXJ5IGNvbmZpZyBzY3JpcHRzIG9wdGlvbmFsCi1BQ19BUkdfV0lUSChiaW5jb25maWdzLAotCUFDX0hFTFBfU1RSSU5HKFstLXdpdGgtYmluY29uZmlnc10sCi0JCVtHZW5lcmF0ZSBzaGVsbCBsaWJwbmctY29uZmlnIHNjcmlwdHMgYXMgd2VsbCBhcyBwa2ctY29uZmlnIGRhdGFdCi0JCVtAPDpAZGVmYXVsdD15ZXNAOj5AXSksCi0JW2lmIHRlc3QgIiR7d2l0aHZhbH0iID0gbm87IHRoZW4KLQkJYmluY29uZmlncz0KLQkJQUNfTVNHX05PVElDRShbbGlicG5nLWNvbmZpZyBzY3JpcHRzIHdpbGwgbm90IGJlIGJ1aWx0XSkKLQllbHNlCi0JCWJpbmNvbmZpZ3M9JyR7YmluY29uZmlnc30nCi0JZmldLAotCVtiaW5jb25maWdzPScke2JpbmNvbmZpZ3N9J10pCi1BQ19TVUJTVChbYmluY29uZmlnc10pCi0KLSMgQ29uZmlnIGZpbGVzLCBzdWJzdGl0dXRpbmcgYXMgYWJvdmUKLUFDX0NPTkZJR19GSUxFUyhbTWFrZWZpbGUgbGlicG5nLnBjOmxpYnBuZy5wYy5pbl0pCi1BQ19DT05GSUdfRklMRVMoW2xpYnBuZy1jb25maWc6bGlicG5nLWNvbmZpZy5pbl0sCi0JCVtjaG1vZCAreCBsaWJwbmctY29uZmlnXSkKLQotQUNfT1VUUFVUCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svQ09QWUlORyBiL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9DT1BZSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjBjMzFhLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9DT1BZSU5HCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0gQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCi1zb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcwotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KLXVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKLXRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKLWdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKLXNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKLXJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCi0oMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAotZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLXNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCi1hdXRob3JzJyByZXB1dGF0aW9ucy4KLQotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQotcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQotcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55Ci1wYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LgotDAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKLWEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCi11bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCi1yZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKLW1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Ci10aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAotZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKLWxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KLXRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQotaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCi1XaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKLXNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQotY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQotY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQotbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwotYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCi15b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KLSAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKLSAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKLSAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCi0gICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgotICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQotICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQotICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKLSAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcwotICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0Ci0gICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgotICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotDAotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQotd2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKLXVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgotU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQotICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucwotICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgotICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKLSAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KLSAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgotICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCi0gICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKLSAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCi0gICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCi1jb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQotYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCi1jb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCi1zcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKLWFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Ci1mb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKLWl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KLQotSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZwotYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAotYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCi1kaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0MCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0MCi0gIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKLW1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwotdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwotY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCi10aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucwotb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCi1iZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKLXRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uCi0KLSAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKLW1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCi1vZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCi1GT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KLU9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKLVBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECi1PUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwotVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQotUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCi1SRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCi1SRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAotSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCi1PVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECi1UTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKLVlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCi1QUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotDAotCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0Ci1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKLXRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyICBuYW1lIG9mIGF1dGhvcgotICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KLSAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0Ci0gICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKLWJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQotbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQotICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCi1wcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQotY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCi1saWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL0xJQ0VOU0UgYi9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1NjcxNy4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA4IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL01ha2VmaWxlLm1pbmd3MzIgYi9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUubWluZ3czMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwYTU5YS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUubWluZ3czMgorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0jIFNhbXBsZSBtYWtlZmlsZSBmb3IgcnBuZy13aW4gLyBycG5nMi13aW4gLyB3cG5nIHVzaW5nIG1pbmd3MzItZ2NjIGFuZCBtYWtlLgotIyBHcmVnIFJvZWxvZnMKLSMgTGFzdCBtb2RpZmllZDogIDIgSnVuZSAyMDA3Ci0jCi0jCVRoZSBwcm9ncmFtcyBidWlsdCBieSB0aGlzIG1ha2VmaWxlIGFyZSBkZXNjcmliZWQgaW4gdGhlIGJvb2ssCi0jCSJQTkc6ICBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiIGJ5IEdyZWcgUm9lbG9mcyAoTydSZWlsbHkgYW5kCi0jCUFzc29jaWF0ZXMsIDE5OTkpLiAgR28gYnV5IGEgY29weSwgZWg/ICBXZWxsLCBPSywgaXQncyBub3QKLSMJZ2VuZXJhbGx5IGZvciBzYWxlIGFueW1vcmUsIGJ1dCBpdCdzIHRoZSB0aG91Z2h0IHRoYXQgY291bnRzLAotIwlyaWdodD8gIChIaW50OiAgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvYm9vay8gKQotIwotIyBJbnZva2UgdGhpcyBtYWtlZmlsZSBmcm9tIGEgRE9TLXByb21wdCB3aW5kb3cgdmlhOgotIwotIwltYWtlIC1mIE1ha2VmaWxlLm1pbmd3MzIKLSMKLSMgVGhpcyBtYWtlZmlsZSBhc3N1bWVzIGxpYnBuZyBhbmQgemxpYiBoYXZlIGFscmVhZHkgYmVlbiBidWlsdCBvciBkb3dubG9hZGVkCi0jIGFuZCBhcmUgaW4gc3ViZGlyZWN0b3JpZXMgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIGN1cnJlbnQgc3ViZGlyZWN0b3J5Ci0jIChhcyBpbmRpY2F0ZWQgYnkgdGhlIFBOR0RJUiBhbmQgWkRJUiBtYWNyb3MgYmVsb3cpLiAgSXQgbWFrZXMgbm8gYXNzdW1wdGlvbnMKLSMgYXQgYWxsIGFib3V0IHRoZSBtaW5ndzMyIGluc3RhbGxhdGlvbiB0cmVlIChXMzJESVIpLiAgRWRpdCBhcyBhcHByb3ByaWF0ZS4KLSMKLSMgTm90ZSB0aGF0IHRoZSBuYW1lcyBvZiB0aGUgZHluYW1pYyBhbmQgc3RhdGljIGxpYnBuZyBhbmQgemxpYiBsaWJyYXJpZXMKLSMgdXNlZCBiZWxvdyBtYXkgY2hhbmdlIGluIGxhdGVyIHJlbGVhc2VzIG9mIHRoZSBsaWJyYXJpZXMuICBUaGlzIG1ha2VmaWxlCi0jIGJ1aWxkcyBib3RoIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcyBieSBkZWZhdWx0LgotIyAoWW91IG5lZWQgb25seSBvbmUgc2V0LCBidXQgZm9yIHRlc3RpbmcgaXQgY2FuIGJlIGhhbmR5IHRvIGhhdmUgYm90aC4pCi0KLQotIyBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI1BOR0RJUiA9IC4uLy4uIwkJZm9yIGxpYnBuZy14Lnkuei9jb250cmliL2dyZWdib29rIGJ1aWxkcwotUE5HRElSID0gLi4vbGlicG5nLXdpbjMyCi1QTkdJTkMgPSAtSSQoUE5HRElSKQotUE5HTElCZCA9ICQoUE5HRElSKS9saWJwbmcuZGxsLmEJIyBkeW5hbWljYWxseSBsaW5rZWQKLVBOR0xJQnMgPSAkKFBOR0RJUikvbGlicG5nLmEJCSMgc3RhdGljYWxseSBsaW5rZWQsIGxvY2FsIGxpYnBuZwotCi0jWkRJUiA9IC4uLy4uLy4uL3psaWItd2luMzIjCWZvciBsaWJwbmcteC55LnovY29udHJpYi9ncmVnYm9vayBidWlsZHMKLVpESVIgPSAuLi96bGliLXdpbjMyCi1aSU5DID0gLUkkKFpESVIpCi1aTElCZCA9ICQoWkRJUikvbGliemRsbC5hCi1aTElCcyA9ICQoWkRJUikvbGliei5hCi0KLSMgY2hhbmdlIHRoaXMgdG8gYmUgdGhlIHBhdGggd2hlcmUgbWluZ3czMiBpbnN0YWxscyBpdHMgc3R1ZmY6Ci1XMzJESVIgPQotI1czMkRJUiA9IC91c3IvbG9jYWwvY3Jvc3MtdG9vbHMvaTM4Ni1taW5ndzMybXN2YwotVzMySU5DID0gLUkkKFczMkRJUikvaW5jbHVkZQotVzMyTElCID0gJChXMzJESVIpL2xpYi9saWJ1c2VyMzIuYSAkKFczMkRJUikvbGliL2xpYmdkaTMyLmEKLQotQ0MgPSBnY2MKLSNDQyA9IGkzODYtbWluZ3czMm1zdmMtZ2NjICMJZS5nLiwgTGludXggLT4gV2luMzIgY3Jvc3MtY29tcGlsYXRpb24KLUxEID0gJChDQykKLVJNID0gcm0gLWYKLUNGTEFHUyA9IC1PIC1XYWxsICQoSU5DUykgJChNSU5HV19DQ0ZMQUdTKQotIyBbbm90ZSB0aGF0IC1XYWxsIGlzIGEgZ2NjLXNwZWNpZmljIGNvbXBpbGF0aW9uIGZsYWcgKCJtb3N0IHdhcm5pbmdzIG9uIildCi0jIFstYW5zaSwgLXBlZGFudGljIGFuZCAtVyBjYW4gYWxzbyBiZSB1c2VkXQotTERGTEFHUyA9ICQoTUlOR1dfTERGTEFHUykKLU8gPSAubwotRSA9IC5leGUKLQotSU5DUyA9ICQoUE5HSU5DKSAkKFpJTkMpICQoVzMySU5DKQotUkxJQlNkID0gJChQTkdMSUJkKSAkKFpMSUJkKSAkKFczMkxJQikgLWxtCi1STElCU3MgPSAkKFBOR0xJQnMpICQoWkxJQnMpICQoVzMyTElCKSAtbG0KLVdMSUJTZCA9ICQoUE5HTElCZCkgJChaTElCZCkKLVdMSUJTcyA9ICQoUE5HTElCcykgJChaTElCcykKLQotUlBORyAgID0gcnBuZy13aW4KLVJQTkcyICA9IHJwbmcyLXdpbgotV1BORyAgID0gd3BuZwotCi1ST0JKU2QgID0gJChSUE5HKSQoTykgcmVhZHBuZy5waWMkKE8pCi1ST0JKUzJkID0gJChSUE5HMikkKE8pIHJlYWRwbmcyLnBpYyQoTykKLVdPQkpTZCAgPSAkKFdQTkcpJChPKSB3cml0ZXBuZy5waWMkKE8pCi0KLVJQTkdzICA9ICQoUlBORyktc3RhdGljCi1SUE5HMnMgPSAkKFJQTkcyKS1zdGF0aWMKLVdQTkdzICA9ICQoV1BORyktc3RhdGljCi0KLVJPQkpTcyAgPSAkKFJQTkcpJChPKSByZWFkcG5nJChPKQotUk9CSlMycyA9ICQoUlBORzIpJChPKSByZWFkcG5nMiQoTykKLVdPQkpTcyAgPSAkKFdQTkcpJChPKSB3cml0ZXBuZyQoTykKLQotU1RBVElDX0VYRVMgID0gJChSUE5HcykkKEUpICQoUlBORzJzKSQoRSkgJChXUE5HcykkKEUpCi1EWU5BTUlDX0VYRVMgPSAkKFJQTkcpJChFKSAkKFJQTkcyKSQoRSkgJChXUE5HKSQoRSkKLQotRVhFUyA9ICQoU1RBVElDX0VYRVMpICQoRFlOQU1JQ19FWEVTKQotCi0KLSMgaW1wbGljaXQgbWFrZSBydWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS5jJChPKToKLQkkKENDKSAtYyAkKENGTEFHUykgJDwKLQotJS5waWMkKE8pOiAlLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLURQTkdfQlVJTERfRExMIC1vICRAICQ8Ci0KLQotIyBkZXBlbmRlbmNpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYWxsOiAgJChFWEVTKQotCi0kKFJQTkdzKSQoRSk6ICQoUk9CSlNzKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChST0JKU3MpICQoUkxJQlNzKQotCi0kKFJQTkcpJChFKTogJChST0JKU2QpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKFJPQkpTZCkgJChSTElCU2QpCi0KLSQoUlBORzJzKSQoRSk6ICQoUk9CSlMycykKLQkkKExEKSAkKExERkxBR1MpIC1vICRAICQoUk9CSlMycykgJChSTElCU3MpCi0KLSQoUlBORzIpJChFKTogJChST0JKUzJkKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChST0JKUzJkKSAkKFJMSUJTZCkKLQotJChXUE5HcykkKEUpOiAkKFdPQkpTcykKLQkkKExEKSAkKExERkxBR1MpIC1vICRAICQoV09CSlNzKSAkKFdMSUJTcykKLQotJChXUE5HKSQoRSk6ICQoV09CSlNkKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChXT0JKU2QpICQoV0xJQlNkKQotCi0kKFJQTkcpJChPKToJJChSUE5HKS5jIHJlYWRwbmcuaAotJChSUE5HMikkKE8pOgkkKFJQTkcyKS5jIHJlYWRwbmcyLmgKLSQoV1BORykkKE8pOgkkKFdQTkcpLmMgd3JpdGVwbmcuaAotCi1yZWFkcG5nJChPKSByZWFkcG5nLnBpYyQoTyk6CXJlYWRwbmcuYyByZWFkcG5nLmgKLXJlYWRwbmcyJChPKSByZWFkcG5nMi5waWMkKE8pOglyZWFkcG5nMi5jIHJlYWRwbmcyLmgKLXdyaXRlcG5nJChPKSB3cml0ZXBuZy5waWMkKE8pOgl3cml0ZXBuZy5jIHdyaXRlcG5nLmgKLQotCi0jIG1haW50ZW5hbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGVhbjoKLQkkKFJNKSAkKEVYRVMpCi0JJChSTSkgJChST0JKU3MpICQoUk9CSlMycykgJChXT0JKU3MpCi0JJChSTSkgJChST0JKU2QpICQoUk9CSlMyZCkgJChXT0JKU2QpCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUuc2dpIGIvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL01ha2VmaWxlLnNnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTczNjU2Ni4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUuc2dpCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLSMgU2FtcGxlIG1ha2VmaWxlIGZvciBycG5nLXggLyBycG5nMi14IC8gd3BuZyBmb3IgU0dJIHVzaW5nIGNjIGFuZCBtYWtlLgotIyBHcmVnIFJvZWxvZnMKLSMgTGFzdCBtb2RpZmllZDogIDcgTWFyY2ggMjAwMgotIwotIwlUaGUgcHJvZ3JhbXMgYnVpbHQgYnkgdGhpcyBtYWtlZmlsZSBhcmUgZGVzY3JpYmVkIGluIHRoZSBib29rLAotIwkiUE5HOiAgVGhlIERlZmluaXRpdmUgR3VpZGUsIiBieSBHcmVnIFJvZWxvZnMgKE8nUmVpbGx5IGFuZAotIwlBc3NvY2lhdGVzLCAxOTk5KS4gIEdvIGJ1eSBhIGNvcHksIGVoPyAgQnV5IHNvbWUgZm9yIGZyaWVuZHMKLSMJYW5kIGZhbWlseSwgdG9vLiAgKE5vdCB0aGF0IHRoaXMgaXMgYSBibGF0YW50IHBsdWcgb3IgYW55dGhpbmcuKQotIwotIyBJbnZva2UgdGhpcyBtYWtlZmlsZSBmcm9tIGEgc2hlbGwgcHJvbXB0IGluIHRoZSB1c3VhbCB3YXk7IGZvciBleGFtcGxlOgotIwotIwltYWtlIC1mIE1ha2VmaWxlLnNnaQotIwotIyBUaGlzIG1ha2VmaWxlIGFzc3VtZXMgbGlicG5nIGFuZCB6bGliIGhhdmUgYWxyZWFkeSBiZWVuIGJ1aWx0IG9yIGRvd25sb2FkZWQKLSMgYW5kIGFyZSBib3RoIGluc3RhbGxlZCBpbiAvdXNyL2xvY2FsL3tpbmNsdWRlLGxpYn0gKGFzIGluZGljYXRlZCBieSB0aGUKLSMgUE5HKiBhbmQgWiogbWFjcm9zIGJlbG93KS4gIEVkaXQgYXMgYXBwcm9wcmlhdGUtLWNob29zZSBvbmx5IE9ORSBlYWNoIG9mCi0jIHRoZSBQTkdJTkMsIFBOR0xJQiwgWklOQyBhbmQgWkxJQiBsaW5lcy4KLSMKLSMgVGhpcyBtYWtlZmlsZSBidWlsZHMgZHluYW1pY2FsbHkgbGlua2VkIGV4ZWN1dGFibGVzIChhZ2FpbnN0IGxpYnBuZyBhbmQgemxpYiwKLSMgdGhhdCBpcyksIGJ1dCB0aGF0IGNhbiBiZSBjaGFuZ2VkIGJ5IHVuY29tbWVudGluZyB0aGUgYXBwcm9wcmlhdGUgUE5HTElCIGFuZAotIyBaTElCIGxpbmVzLgotCi0KLSMgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVBOR0lOQyA9IC1JL3Vzci9sb2NhbC9pbmNsdWRlL2xpYnBuZzE0Ci1QTkdMSUIgPSAtTC91c3IvbG9jYWwvbGliIC1scG5nMTQJICAjIGR5bmFtaWNhbGx5IGxpbmtlZCBhZ2FpbnN0IGxpYnBuZwotI1BOR0xJQiA9IC91c3IvbG9jYWwvbGliL2xpYnBuZzE0LmEgIyBzdGF0aWNhbGx5IGxpbmtlZCBhZ2FpbnN0IGxpYnBuZwotIyBvcjoKLSNQTkdJTkMgPSAtSS4uLy4uCi0jUE5HTElCID0gLUwuLi8uLiAtbHBuZwotI1BOR0xJQiA9IC4uLy4uL2xpYnBuZy5hCi0KLVpJTkMgPSAtSS91c3IvbG9jYWwvaW5jbHVkZQotWkxJQiA9IC1ML3Vzci9sb2NhbC9saWIgLWx6CQkjIGR5bmFtaWNhbGx5IGxpbmtlZCBhZ2FpbnN0IHpsaWIKLSNaTElCID0gL3Vzci9sb2NhbC9saWIvbGliei5hCQkjIHN0YXRpY2FsbHkgbGlua2VkIGFnYWluc3QgemxpYgotI1pJTkMgPSAtSS4uL3psaWIKLSNaTElCID0gLUwuLi96bGliIC1segotI1pMSUIgPSAuLi8uLi8uLi96bGliL2xpYnouYQotCi1YSU5DID0gLUkvdXNyL2luY2x1ZGUvWDExCQkjIG9sZC1zdHlsZSwgc3RvY2sgWCBkaXN0cmlidXRpb25zCi1YTElCID0gLUwvdXNyL2xpYi9YMTEgLWxYMTEKLSNYSU5DID0gLUkvdXNyL29wZW53aW4vaW5jbHVkZSAgICAJIyBTdW4gd29ya3N0YXRpb25zIChPcGVuV2luZG93cykKLSNYTElCID0gLUwvdXNyL29wZW53aW4vbGliIC1sWDExCi0jWElOQyA9IC1JL3Vzci9YMTFSNi9pbmNsdWRlCQkjIG5ldyBYIGRpc3RyaWJ1dGlvbnMgKFhGcmVlODYsIGV0Yy4pCi0jWExJQiA9IC1ML3Vzci9YMTFSNi9saWIgLWxYMTEKLQotSU5DUyA9ICQoUE5HSU5DKSAkKFpJTkMpICQoWElOQykKLVJMSUJTID0gJChQTkdMSUIpICQoWkxJQikgJChYTElCKSAtbG0KLVdMSUJTID0gJChQTkdMSUIpICQoWkxJQikKLQotQ0MgPSBjYwotTEQgPSBjYwotUk0gPSBybSAtZgotIyBBQkkgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGF0IHVzZWQgdG8gYnVpbGQgbGlicG5nLgotQUJJPQotQ0ZMQUdTID0gJChBQkkpIC1PIC1mdWxsd2FybiAkKElOQ1MpCi1MREZMQUdTID0gJChBQkkpCi1PID0gLm8KLUUgPQotCi1SUE5HICA9IHJwbmcteAotUlBORzIgPSBycG5nMi14Ci1XUE5HICA9IHdwbmcKLQotUk9CSlMgID0gJChSUE5HKSQoTykgcmVhZHBuZyQoTykKLVJPQkpTMiA9ICQoUlBORzIpJChPKSByZWFkcG5nMiQoTykKLVdPQkpTICA9ICQoV1BORykkKE8pIHdyaXRlcG5nJChPKQotCi1FWEVTID0gJChSUE5HKSQoRSkgJChSUE5HMikkKEUpICQoV1BORykkKEUpCi0KLQotIyBpbXBsaWNpdCBtYWtlIHJ1bGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLmMkKE8pOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkPAotCi0KLSMgZGVwZW5kZW5jaWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFsbDogICQoRVhFUykKLQotJChSUE5HKSQoRSk6ICQoUk9CSlMpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKFJPQkpTKSAkKFJMSUJTKQotCi0kKFJQTkcyKSQoRSk6ICQoUk9CSlMyKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChST0JKUzIpICQoUkxJQlMpCi0KLSQoV1BORykkKEUpOiAkKFdPQkpTKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChXT0JKUykgJChXTElCUykKLQotJChSUE5HKSQoTyk6CSQoUlBORykuYyByZWFkcG5nLmgKLSQoUlBORzIpJChPKToJJChSUE5HMikuYyByZWFkcG5nMi5oCi0kKFdQTkcpJChPKToJJChXUE5HKS5jIHdyaXRlcG5nLmgKLQotcmVhZHBuZyQoTyk6CXJlYWRwbmcuYyByZWFkcG5nLmgKLXJlYWRwbmcyJChPKToJcmVhZHBuZzIuYyByZWFkcG5nMi5oCi13cml0ZXBuZyQoTyk6CXdyaXRlcG5nLmMgd3JpdGVwbmcuaAotCi0KLSMgbWFpbnRlbmFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsZWFuOgotCSQoUk0pICQoRVhFUykgJChST0JKUykgJChST0JKUzIpICQoV09CSlMpCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUudW54IGIvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL01ha2VmaWxlLnVueApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E4Njg4NS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUudW54CisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLSMgU2FtcGxlIG1ha2VmaWxlIGZvciBycG5nLXggLyBycG5nMi14IC8gd3BuZyB1c2luZyBnY2MgYW5kIG1ha2UuCi0jIEdyZWcgUm9lbG9mcwotIyBMYXN0IG1vZGlmaWVkOiAgMiBKdW5lIDIwMDcKLSMKLSMJVGhlIHByb2dyYW1zIGJ1aWx0IGJ5IHRoaXMgbWFrZWZpbGUgYXJlIGRlc2NyaWJlZCBpbiB0aGUgYm9vaywKLSMJIlBORzogIFRoZSBEZWZpbml0aXZlIEd1aWRlLCIgYnkgR3JlZyBSb2Vsb2ZzIChPJ1JlaWxseSBhbmQKLSMJQXNzb2NpYXRlcywgMTk5OSkuICBHbyBidXkgYSBjb3B5LCBlaD8gIFdlbGwsIE9LLCBpdCdzIG5vdAotIwlnZW5lcmFsbHkgZm9yIHNhbGUgYW55bW9yZSwgYnV0IGl0J3MgdGhlIHRob3VnaHQgdGhhdCBjb3VudHMsCi0jCXJpZ2h0PyAgKEhpbnQ6ICBodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9ib29rLyApCi0jCi0jIEludm9rZSB0aGlzIG1ha2VmaWxlIGZyb20gYSBzaGVsbCBwcm9tcHQgaW4gdGhlIHVzdWFsIHdheTsgZm9yIGV4YW1wbGU6Ci0jCi0jCW1ha2UgLWYgTWFrZWZpbGUudW54Ci0jCi0jIFRoaXMgbWFrZWZpbGUgYXNzdW1lcyBsaWJwbmcgYW5kIHpsaWIgaGF2ZSBhbHJlYWR5IGJlZW4gYnVpbHQgb3IgZG93bmxvYWRlZAotIyBhbmQgYXJlIGluc3RhbGxlZCBpbiAvdXNyL2xvY2FsL3tpbmNsdWRlLGxpYn0gb3IgYXMgb3RoZXJ3aXNlIGluZGljYXRlZCBieQotIyB0aGUgUE5HKiBhbmQgWiogbWFjcm9zIGJlbG93LiAgRWRpdCBhcyBhcHByb3ByaWF0ZS0tY2hvb3NlIG9ubHkgT05FIGVhY2ggb2YKLSMgdGhlIFBOR0lOQywgUE5HTElCZCwgUE5HTElCcywgWklOQywgWkxJQmQgYW5kIFpMSUJzIGxpbmVzLgotIwotIyBUaGlzIG1ha2VmaWxlIGJ1aWxkcyBib3RoIGR5bmFtaWNhbGx5IGFuZCBzdGF0aWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcwotIyAoYWdhaW5zdCBsaWJwbmcgYW5kIHpsaWIsIHRoYXQgaXMpLCBidXQgdGhhdCBjYW4gYmUgY2hhbmdlZCBieSBtb2RpZnlpbmcKLSMgdGhlICJFWEVTID0iIGxpbmUuICAoWW91IG5lZWQgb25seSBvbmUgc2V0LCBidXQgZm9yIHRlc3RpbmcgaXQgY2FuIGJlIGhhbmR5Ci0jIHRvIGhhdmUgYm90aC4pCi0KLQotIyBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI1BOR0RJUiA9IC91c3IvbG9jYWwvbGliCi0jUE5HSU5DID0gLUkvdXNyL2xvY2FsL2luY2x1ZGUvbGlicG5nMTQKLSNQTkdMSUJkID0gLUwkKFBOR0RJUikgLWxwbmcxNCAjIGR5bmFtaWNhbGx5IGxpbmtlZCwgaW5zdGFsbGVkIGxpYnBuZwotI1BOR0xJQnMgPSAkKFBOR0RJUikvbGlicG5nMTQuYSAjIHN0YXRpY2FsbHkgbGlua2VkLCBpbnN0YWxsZWQgbGlicG5nCi0jIG9yOgotUE5HRElSID0gLi4vLi4jCXRoaXMgb25lIGlzIGZvciBsaWJwbmcteC55LnovY29udHJpYi9ncmVnYm9vayBidWlsZHMKLSNQTkdESVIgPSAuLi9saWJwbmcKLVBOR0lOQyA9IC1JJChQTkdESVIpCi1QTkdMSUJkID0gLVdsLC1ycGF0aCwkKFBOR0RJUikgLUwkKFBOR0RJUikgLWxwbmcxNAkjIGR5bmFtaWNhbGx5IGxpbmtlZAotUE5HTElCcyA9ICQoUE5HRElSKS9saWJwbmcuYQkJIyBzdGF0aWNhbGx5IGxpbmtlZCwgbG9jYWwgbGlicG5nCi0KLVpESVIgPSAvdXNyL2xvY2FsL2xpYgotI1pESVIgPSAvdXNyL2xpYjY0Ci1aSU5DID0gLUkvdXNyL2xvY2FsL2luY2x1ZGUKLVpMSUJkID0gLUwkKFpESVIpIC1segkJCSMgZHluYW1pY2FsbHkgbGlua2VkIGFnYWluc3QgemxpYgotWkxJQnMgPSAkKFpESVIpL2xpYnouYQkJCSMgc3RhdGljYWxseSBsaW5rZWQgYWdhaW5zdCB6bGliCi0jIG9yOgotI1pESVIgPSAuLi96bGliCi0jWklOQyA9IC1JJChaRElSKQotI1pMSUJkID0gLVdsLC1ycGF0aCwkKFpESVIpIC1MJChaRElSKSAtbHogICMgLXJwYXRoIGFsbG93cyBpbi1wbGFjZSB0ZXN0aW5nCi0jWkxJQnMgPSAkKFpESVIpL2xpYnouYQotCi0jWElOQyA9IC1JL3Vzci9pbmNsdWRlCQkJIyBvbGQtc3R5bGUsIHN0b2NrIFggZGlzdHJpYnV0aW9ucwotI1hMSUIgPSAtTC91c3IvbGliL1gxMSAtbFgxMQkJIyAgKGluY2x1ZGluZyBTR0kgSVJJWCkKLSNYSU5DID0gLUkvdXNyL29wZW53aW4vaW5jbHVkZQkJIyBTdW4gd29ya3N0YXRpb25zIChPcGVuV2luZG93cykKLSNYTElCID0gLUwvdXNyL29wZW53aW4vbGliIC1sWDExCi1YSU5DID0gLUkvdXNyL1gxMVI2L2luY2x1ZGUJCSMgbmV3IFggZGlzdHJpYnV0aW9ucyAoWC5vcmcsIGV0Yy4pCi1YTElCID0gLUwvdXNyL1gxMVI2L2xpYiAtbFgxMQotI1hMSUIgPSAtTC91c3IvWDExUjYvbGliNjQgLWxYMTEJIyBlLmcuLCBSZWQgSGF0IG9uIEFNRDY0Ci0KLUlOQ1MgPSAkKFBOR0lOQykgJChaSU5DKSAkKFhJTkMpCi1STElCU2QgPSAkKFBOR0xJQmQpICQoWkxJQmQpICQoWExJQikgLWxtCi1STElCU3MgPSAkKFBOR0xJQnMpICQoWkxJQnMpICQoWExJQikgLWxtCi1XTElCU2QgPSAkKFBOR0xJQmQpICQoWkxJQmQpIC1sbQotV0xJQlNzID0gJChQTkdMSUJzKSAkKFpMSUJzKQotCi1DQyA9IGdjYwotTEQgPSBnY2MKLVJNID0gcm0gLWYKLUNGTEFHUyA9IC1PIC1XYWxsICQoSU5DUykgLURGRUFUVVJFX0xPT1AKLSMgW25vdGUgdGhhdCAtV2FsbCBpcyBhIGdjYy1zcGVjaWZpYyBjb21waWxhdGlvbiBmbGFnICgibW9zdCB3YXJuaW5ncyBvbiIpXQotIyBbLWFuc2ksIC1wZWRhbnRpYyBhbmQgLVcgY2FuIGFsc28gYmUgdXNlZF0KLUxERkxBR1MgPQotTyA9IC5vCi1FID0KLQotUlBORyAgID0gcnBuZy14Ci1SUE5HMiAgPSBycG5nMi14Ci1XUE5HICAgPSB3cG5nCi0KLVJQTkdzICA9ICQoUlBORyktc3RhdGljCi1SUE5HMnMgPSAkKFJQTkcyKS1zdGF0aWMKLVdQTkdzICA9ICQoV1BORyktc3RhdGljCi0KLVJPQkpTICA9ICQoUlBORykkKE8pIHJlYWRwbmckKE8pCi1ST0JKUzIgPSAkKFJQTkcyKSQoTykgcmVhZHBuZzIkKE8pCi1XT0JKUyAgPSAkKFdQTkcpJChPKSB3cml0ZXBuZyQoTykKLQotU1RBVElDX0VYRVMgID0gJChSUE5HcykkKEUpICQoUlBORzJzKSQoRSkgJChXUE5HcykkKEUpCi1EWU5BTUlDX0VYRVMgPSAkKFJQTkcpJChFKSAkKFJQTkcyKSQoRSkgJChXUE5HKSQoRSkKLQotRVhFUyA9ICQoU1RBVElDX0VYRVMpICQoRFlOQU1JQ19FWEVTKQotCi0KLSMgaW1wbGljaXQgbWFrZSBydWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS5jJChPKToKLQkkKENDKSAtYyAkKENGTEFHUykgJDwKLQotCi0jIGRlcGVuZGVuY2llcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1hbGw6ICAkKEVYRVMpCi0KLSQoUlBOR3MpJChFKTogJChST0JKUykKLQkkKExEKSAkKExERkxBR1MpIC1vICRAICQoUk9CSlMpICQoUkxJQlNzKQotCi0kKFJQTkcpJChFKTogJChST0JKUykKLQkkKExEKSAkKExERkxBR1MpIC1vICRAICQoUk9CSlMpICQoUkxJQlNkKQotCi0kKFJQTkcycykkKEUpOiAkKFJPQkpTMikKLQkkKExEKSAkKExERkxBR1MpIC1vICRAICQoUk9CSlMyKSAkKFJMSUJTcykKLQotJChSUE5HMikkKEUpOiAkKFJPQkpTMikKLQkkKExEKSAkKExERkxBR1MpIC1vICRAICQoUk9CSlMyKSAkKFJMSUJTZCkKLQotJChXUE5HcykkKEUpOiAkKFdPQkpTKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChXT0JKUykgJChXTElCU3MpCi0KLSQoV1BORykkKEUpOiAkKFdPQkpTKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChXT0JKUykgJChXTElCU2QpCi0KLSQoUlBORykkKE8pOgkkKFJQTkcpLmMgcmVhZHBuZy5oCi0kKFJQTkcyKSQoTyk6CSQoUlBORzIpLmMgcmVhZHBuZzIuaAotJChXUE5HKSQoTyk6CSQoV1BORykuYyB3cml0ZXBuZy5oCi0KLXJlYWRwbmckKE8pOglyZWFkcG5nLmMgcmVhZHBuZy5oCi1yZWFkcG5nMiQoTyk6CXJlYWRwbmcyLmMgcmVhZHBuZzIuaAotd3JpdGVwbmckKE8pOgl3cml0ZXBuZy5jIHdyaXRlcG5nLmgKLQotCi0jIG1haW50ZW5hbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGVhbjoKLQkkKFJNKSAkKEVYRVMpICQoUk9CSlMpICQoUk9CSlMyKSAkKFdPQkpTKQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL01ha2VmaWxlLnczMiBiL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9NYWtlZmlsZS53MzIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMDgwODUuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL01ha2VmaWxlLnczMgorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0jIFNhbXBsZSBtYWtlZmlsZSBmb3IgcnBuZy13aW4gLyBycG5nMi13aW4gLyB3cG5nIHVzaW5nIE1TVkMgYW5kIE5NQUtFLgotIyBHcmVnIFJvZWxvZnMKLSMgTGFzdCBtb2RpZmllZDogIDIgSnVuZSAyMDA3Ci0jCi0jCVRoZSBwcm9ncmFtcyBidWlsdCBieSB0aGlzIG1ha2VmaWxlIGFyZSBkZXNjcmliZWQgaW4gdGhlIGJvb2ssCi0jCSJQTkc6ICBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiIGJ5IEdyZWcgUm9lbG9mcyAoTydSZWlsbHkgYW5kCi0jCUFzc29jaWF0ZXMsIDE5OTkpLiAgR28gYnV5IGEgY29weSwgZWg/ICBXZWxsLCBPSywgaXQncyBub3QKLSMJZ2VuZXJhbGx5IGZvciBzYWxlIGFueW1vcmUsIGJ1dCBpdCdzIHRoZSB0aG91Z2h0IHRoYXQgY291bnRzLAotIwlyaWdodD8gIChIaW50OiAgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvYm9vay8gKQotIwotIyBJbnZva2UgdGhpcyBtYWtlZmlsZSBmcm9tIGEgRE9TIHByb21wdCB3aW5kb3cgdmlhOgotIwotIwklZGV2c3R1ZGlvJVx2Y1xiaW5cdmN2YXJzMzIuYmF0Ci0jCW5tYWtlIC1ub2xvZ28gLWYgTWFrZWZpbGUudzMyCi0jCi0jIHdoZXJlICVkZXZzdHVkaW8lIGlzIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBNU1ZDIC8gRGV2U3R1ZGlvLiAgSWYKLSMgeW91IGdldCAiZW52aXJvbm1lbnQgb3V0IG9mIHNwYWNlIiBlcnJvcnMsIGNyZWF0ZSBhIGRlc2t0b3Agc2hvcnRjdXQgd2l0aAotIyAiYzpcd2luZG93c1xjb21tYW5kLmNvbSAvZTo0MDk2IiBhcyB0aGUgcHJvZ3JhbSBjb21tYW5kIGxpbmUgYW5kIHNldCB0aGUKLSMgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhpcyBkaXJlY3RvcnkuICBUaGVuIGRvdWJsZS1jbGljayB0byBvcGVuIHRoZSBuZXcKLSMgRE9TLXByb21wdCB3aW5kb3cgd2l0aCBhIGJpZ2dlciBlbnZpcm9ubWVudCBhbmQgcmV0cnkgdGhlIGNvbW1hbmRzIGFib3ZlLgotIyAKLSMgVGhpcyBtYWtlZmlsZSBhc3N1bWVzIGxpYnBuZyBhbmQgemxpYiBoYXZlIGFscmVhZHkgYmVlbiBidWlsdCBvciBkb3dubG9hZGVkCi0jIGFuZCBhcmUgaW4gc3ViZGlyZWN0b3JpZXMgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIGN1cnJlbnQgc3ViZGlyZWN0b3J5Ci0jIChhcyBpbmRpY2F0ZWQgYnkgdGhlIFBOR1BBVEggYW5kIFpQQVRIIG1hY3JvcyBiZWxvdykuICBFZGl0IGFzIGFwcHJvcHJpYXRlLgotIwotIyBOb3RlIHRoYXQgdGhlIG5hbWVzIG9mIHRoZSBkeW5hbWljIGFuZCBzdGF0aWMgbGlicG5nIGFuZCB6bGliIGxpYnJhcmllcwotIyB1c2VkIGJlbG93IG1heSBjaGFuZ2UgaW4gbGF0ZXIgcmVsZWFzZXMgb2YgdGhlIGxpYnJhcmllcy4gIFRoaXMgbWFrZWZpbGUKLSMgYnVpbGRzIHN0YXRpY2FsbHkgbGlua2VkIGV4ZWN1dGFibGVzLCBidXQgdGhhdCBjYW4gYmUgY2hhbmdlZCBieSB1bmNvbS0KLSMgbWVudGluZyB0aGUgYXBwcm9wcmlhdGUgUE5HTElCIGFuZCBaTElCIGxpbmVzLgotCi0haW5jbHVkZSA8bnR3aW4zMi5tYWs+Ci0KLQotIyBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUE5HUEFUSCA9IC4uL2xpYnBuZwotUE5HSU5DID0gLUkkKFBOR1BBVEgpCi0jUE5HTElCID0gJChQTkdQQVRIKS9wbmdkbGwubGliCi1QTkdMSUIgPSAkKFBOR1BBVEgpL2xpYnBuZy5saWIKLQotWlBBVEggPSAuLi96bGliCi1aSU5DID0gLUkkKFpQQVRIKQotI1pMSUIgPSAkKFpQQVRIKS96bGliZGxsLmxpYgotWkxJQiA9ICQoWlBBVEgpL3psaWJzdGF0LmxpYgotCi1XSU5MSUJTID0gLWRlZmF1bHRsaWI6dXNlcjMyLmxpYiBnZGkzMi5saWIKLSMgWyJyZWFsIiBhcHBzIG1heSBhbHNvIG5lZWQgY29tY3RsMzIubGliLCBjb21kbGczMi5saWIsIHdpbm1tLmxpYiwgZXRjLl0KLQotSU5DUyA9ICQoUE5HSU5DKSAkKFpJTkMpCi1STElCUyA9ICQoUE5HTElCKSAkKFpMSUIpICQoV0lOTElCUykKLVdMSUJTID0gJChQTkdMSUIpICQoWkxJQikKLQotQ0MgPSBjbAotTEQgPSBsaW5rCi1STSA9IGRlbAotQ0ZMQUdTID0gLW5vbG9nbyAtTyAtVzMgJChJTkNTKSAkKGN2YXJzKQotIyBbbm90ZSB0aGF0IC1XMyBpcyBhbiBNU1ZDLXNwZWNpZmljIGNvbXBpbGF0aW9uIGZsYWcgKCJhbGwgd2FybmluZ3Mgb24iKV0KLSMgW3NlZSAlZGV2c3R1ZGlvJVx2Y1xpbmNsdWRlXHdpbjMyLm1hayBmb3IgY3ZhcnMgbWFjcm8gZGVmaW5pdGlvbl0KLU8gPSAub2JqCi1FID0gLmV4ZQotCi1STERGTEFHUyA9IC1ub2xvZ28gLXN1YnN5c3RlbTp3aW5kb3dzCi1XTERGTEFHUyA9IC1ub2xvZ28KLQotUlBORyAgPSBycG5nLXdpbgotUlBORzIgPSBycG5nMi13aW4KLVdQTkcgID0gd3BuZwotCi1ST0JKUyAgPSAkKFJQTkcpJChPKSByZWFkcG5nJChPKQotUk9CSlMyID0gJChSUE5HMikkKE8pIHJlYWRwbmcyJChPKQotV09CSlMgID0gJChXUE5HKSQoTykgd3JpdGVwbmckKE8pCi0KLUVYRVMgPSAkKFJQTkcpJChFKSAkKFJQTkcyKSQoRSkgJChXUE5HKSQoRSkKLQotCi0jIGltcGxpY2l0IG1ha2UgcnVsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0uYyQoTyk6Ci0JJChDQykgLWMgJChDRkxBR1MpICQ8Ci0KLQotIyBkZXBlbmRlbmNpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYWxsOiAgJChFWEVTKQotCi0kKFJQTkcpJChFKTogJChST0JKUykKLQkkKExEKSAkKFJMREZMQUdTKSAtb3V0OiRAICQoUk9CSlMpICQoUkxJQlMpCi0KLSQoUlBORzIpJChFKTogJChST0JKUzIpCi0JJChMRCkgJChSTERGTEFHUykgLW91dDokQCAkKFJPQkpTMikgJChSTElCUykKLQotJChXUE5HKSQoRSk6ICQoV09CSlMpCi0JJChMRCkgJChXTERGTEFHUykgLW91dDokQCAkKFdPQkpTKSAkKFdMSUJTKQotCi0kKFJQTkcpJChPKToJJChSUE5HKS5jIHJlYWRwbmcuaAotJChSUE5HMikkKE8pOgkkKFJQTkcyKS5jIHJlYWRwbmcyLmgKLSQoV1BORykkKE8pOgkkKFdQTkcpLmMgd3JpdGVwbmcuaAotCi1yZWFkcG5nJChPKToJcmVhZHBuZy5jIHJlYWRwbmcuaAotcmVhZHBuZzIkKE8pOglyZWFkcG5nMi5jIHJlYWRwbmcyLmgKLXdyaXRlcG5nJChPKToJd3JpdGVwbmcuYyB3cml0ZXBuZy5oCi0KLQotIyBtYWludGVuYW5jZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xlYW46Ci0jCWlkZWFsbHkgd2UgY291bGQganVzdCBkbyB0aGlzOgotIwkkKFJNKSAkKEVYRVMpICQoUk9CSlMpICQoUk9CSlMyKSAkKFdPQkpTKQotIwkuLi5idXQgdGhlIFdpbmRvd3MgIkRFTCIgY29tbWFuZCBpcyBub25lIHRvbyBicmlnaHQsIHNvOgotCSQoUk0pIHIqJChFKQotCSQoUk0pIHcqJChFKQotCSQoUk0pIHIqJChPKQotCSQoUk0pIHcqJChPKQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL1JFQURNRSBiL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YmYwNGYuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICBQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlCi0gICAgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2UgQ29kZQotCi1DaGFwdGVycyAxMywgMTQgYW5kIDE1IG9mICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlIiBkaXNjdXNzIHRocmVlIGZyZWUsCi1jcm9zcy1wbGF0Zm9ybSBkZW1vIHByb2dyYW1zIHRoYXQgc2hvdyBob3cgdG8gdXNlIHRoZSBsaWJwbmcgcmVmZXJlbmNlCi1saWJyYXJ5OiAgcnBuZywgcnBuZzIgYW5kIHdwbmcuICBycG5nIGFuZCBycG5nMiBhcmUgdmlld2VyczsgdGhlIGZpcnN0IGlzCi1hIHZlcnkgc2ltcGxlIGV4YW1wbGUgdGhhdCB0aGF0IHNob3dzIGhvdyBhIHN0YW5kYXJkIGZpbGUtdmlld2VyIG1pZ2h0IHVzZQotbGlicG5nLCB3aGlsZSB0aGUgc2Vjb25kIGlzIGRlc2lnbmVkIHRvIHByb2Nlc3Mgc3RyZWFtaW5nIGRhdGEgYW5kIHNob3dzCi1ob3cgYSB3ZWIgYnJvd3NlciBtaWdodCBiZSB3cml0dGVuLiAgd3BuZyBpcyBhIHNpbXBsZSBjb21tYW5kLWxpbmUgcHJvZ3JhbQotdGhhdCByZWFkcyBiaW5hcnkgUEdNIGFuZCBQUE0gZmlsZXMgKHRoZSBgYHJhdycnIGdyYXlzY2FsZSBhbmQgUkdCIHN1YnNldHMKLW9mIFBCTVBMVVMvTmV0UEJNKSBhbmQgY29udmVydHMgdGhlbSB0byBQTkcuCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIHRocmVlIGRlbW8gcHJvZ3JhbXMgY3VycmVudGx5IGNvbXBpbGVzIHVuZGVyCi1Vbml4LCBPcGVuVk1TLCBhbmQgMzItYml0IFdpbmRvd3MuICAoU3BlY2lhbCB0aGFua3MgdG8gTWFydGluIFppbnNlciwKLXppbnNlckBkZWN1cy5kZSwgZm9yIG1ha2luZyB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMgZm9yIE9wZW5WTVMgYW5kIGZvcgotcHJvdmlkaW5nIGFuIGFwcHJvcHJpYXRlIGJ1aWxkIHNjcmlwdC4pICBCdWlsZCBpbnN0cnVjdGlvbnMgY2FuIGJlIGZvdW5kCi1iZWxvdy4KLQotRmlsZXM6Ci0KLSAgIFJFQURNRSAgICAgICAgICAgICB0aGlzIGZpbGUKLSAgIExJQ0VOU0UgICAgICAgICAgICB0ZXJtcyBvZiBkaXN0cmlidXRpb24gYW5kIHJldXNlIChCU0QtbGlrZSBvciBHTlUgR1BMKQotICAgQ09QWUlORyAgICAgICAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpCi0KLSAgIE1ha2VmaWxlLnVueCAgICAgICBVbml4IG1ha2VmaWxlCi0gICBNYWtlZmlsZS53MzIgICAgICAgV2luZG93cyAoTVNWQykgbWFrZWZpbGUKLSAgIG1ha2V2bXMuY29tICAgICAgICBPcGVuVk1TIGJ1aWxkIHNjcmlwdAotCi0gICBycG5nLXdpbi5jICAgICAgICAgV2luZG93cyBmcm9udCBlbmQgZm9yIHRoZSBiYXNpYyB2aWV3ZXIKLSAgIHJwbmcteC5jICAgICAgICAgICBYIFdpbmRvdyBTeXN0ZW0gKFVuaXgsIE9wZW5WTVMpIGZyb250IGVuZAotICAgcmVhZHBuZy5jICAgICAgICAgIGdlbmVyaWMgYmFjayBlbmQgZm9yIHRoZSBiYXNpYyB2aWV3ZXIKLSAgIHJlYWRwbmcuaCAgICAgICAgICBoZWFkZXIgZmlsZSBmb3IgdGhlIGJhc2ljIHZpZXdlcgotCi0gICBycG5nMi13aW4uYyAgICAgICAgV2luZG93cyBmcm9udCBlbmQgZm9yIHRoZSBwcm9ncmVzc2l2ZSB2aWV3ZXIKLSAgIHJwbmcyLXguYyAgICAgICAgICBYIGZyb250IGVuZCBmb3IgdGhlIHByb2dyZXNzaXZlIHZpZXdlcgotICAgcmVhZHBuZzIuYyAgICAgICAgIGdlbmVyaWMgYmFjayBlbmQgZm9yIHRoZSBwcm9ncmVzc2l2ZSB2aWV3ZXIKLSAgIHJlYWRwbmcyLmggICAgICAgICBoZWFkZXIgZmlsZSBmb3IgdGhlIHByb2dyZXNzaXZlIHZpZXdlcgotCi0gICB3cG5nLmMgICAgICAgICAgICAgZ2VuZXJpYyAodGV4dCkgZnJvbnQgZW5kIGZvciB0aGUgY29udmVydGVyCi0gICB3cml0ZXBuZy5jICAgICAgICAgZ2VuZXJpYyBiYWNrIGVuZCBmb3IgdGhlIGNvbnZlcnRlcgotICAgd3JpdGVwbmcuaCAgICAgICAgIGhlYWRlciBmaWxlIGZvciB0aGUgY29udmVydGVyCi0KLSAgIHRvdWNhbi5wbmcgICAgICAgICB0cmFuc3BhcmVudCBQTkcgZm9yIHRlc3RpbmcgKGJ5IFN0ZWZhbiBTY2huZWlkZXIpCi0KLU5vdGUgdGhhdCwgYWx0aG91Z2ggdGhlIHByb2dyYW1zIGFyZSBkZXNpZ25lZCB0byBiZSBmdW5jdGlvbmFsLCB0aGVpcgotcHJpbWFyeSBwdXJwb3NlIGlzIHRvIGlsbHVzdHJhdGUgaG93IHRvIHVzZSBsaWJwbmcgdG8gYWRkIFBORyBzdXBwb3J0IHRvCi1vdGhlciBwcm9ncmFtcy4gIEFzIHN1Y2gsIHRoZWlyIHVzZXIgaW50ZXJmYWNlcyBhcmUgY3J1ZGUgYW5kIGRlZmluaXRlbHkKLWFyZSBub3QgaW50ZW5kZWQgZm9yIGV2ZXJ5ZGF5IHVzZS4KLQotUGxlYXNlIHNlZSBodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9wbmdib29rLmh0bWwgZm9yIGZ1cnRoZXIgaW5mb3ItCi1tYXRpb24gYW5kIGxpbmtzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgc291cmNlIGNvZGUsIGFuZCBDaGFwdGVycwotMTMtMTUgb2YgdGhlIGJvb2sgZm9yIGRldGFpbGVkIGRpc2N1c3Npb24gb2YgdGhlIHRocmVlIHByb2dyYW1zLgotCi1HcmVnIFJvZWxvZnMKLWh0dHA6Ly9wb2JveC5jb20vfm5ld3QvZ3JlZ19jb250YWN0Lmh0bWwKLTE2IE1hcmNoIDIwMDgKLQotCi1CVUlMRCBJTlNUUlVDVElPTlMKLQotIC0gUHJlcmVxdWlzaXRlcyAoaW4gb3JkZXIgb2YgY29tcGlsYXRpb24pOgotCi0gICAgICAtIHpsaWIJCWh0dHA6Ly96bGliLm5ldC8KLSAgICAgIC0gbGlicG5nCQlodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9saWJwbmcuaHRtbAotICAgICAgLSBwbmdib29rCQlodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9ib29rL3NvdXJjZXMuaHRtbAotCi0gICAgIFRoZSBwbmdib29rIGRlbW8gcHJvZ3JhbXMgYXJlIGV4cGxpY2l0bHkgZGVzaWduZWQgdG8gZGVtb25zdHJhdGUgcHJvcGVyCi0gICAgIGNvZGluZyB0ZWNobmlxdWVzIGZvciB1c2luZyB0aGUgbGlicG5nIHJlZmVyZW5jZSBsaWJyYXJ5LiAgQXMgYSByZXN1bHQsCi0gICAgIHlvdSBuZWVkIHRvIGRvd25sb2FkIGFuZCBidWlsZCBib3RoIHpsaWIgKG9uIHdoaWNoIGxpYnBuZyBkZXBlbmRzKSBhbmQKLSAgICAgbGlicG5nLiAgQSBjb21tb24gYnVpbGQgc2V0dXAgaXMgdG8gcGxhY2UgdGhlIHpsaWIsIGxpYnBuZyBhbmQgcG5nYm9vawotICAgICBzdWJkaXJlY3RvcnkgdHJlZXMgKCJmb2xkZXJzIikgaW4gdGhlIHNhbWUgcGFyZW50IGRpcmVjdG9yeS4gIFRoZW4gdGhlCi0gICAgIGxpYnBuZyBidWlsZCBjYW4gcmVmZXIgdG8gZmlsZXMgaW4gLi4vemxpYiAob3IgLi5cemxpYiBvciBbLS56bGliXSksCi0gICAgIGFuZCBzaW1pbGFybHkgZm9yIHRoZSBwbmdib29rIGJ1aWxkLgotCi0gICAgIE5vdGUgdGhhdCBhbGwgdGhyZWUgcGFja2FnZXMgYXJlIGRlc2lnbmVkIHRvIGJlIGJ1aWx0IGZyb20gYSBjb21tYW5kCi0gICAgIGxpbmUgYnkgZGVmYXVsdDsgdGhvc2Ugd2hvIHdpc2ggdG8gdXNlIGEgZ3JhcGhpY2FsIG9yIG90aGVyIGludGVncmF0ZWQKLSAgICAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIGFyZSBvbiB0aGVpciBvd24uCi0KLQotIC0gVW5peDoKLQotICAgICBVbnBhY2sgdGhlIGxhdGVzdCBwbmdib29rIHNvdXJjZXMgKHdoaWNoIHNob3VsZCBjb3JyZXNwb25kIHRvIHRoaXMKLSAgICAgUkVBRE1FIGZpbGUpIGludG8gYSBkaXJlY3RvcnkgYW5kIGNoYW5nZSBpbnRvIHRoYXQgZGlyZWN0b3J5LgotCi0gICAgIENvcHkgTWFrZWZpbGUudW54IHRvIE1ha2VmaWxlIGFuZCBlZGl0IHRoZSBQTkcqIGFuZCBaKiB2YXJpYWJsZXMKLSAgICAgYXBwcm9wcmlhdGVseSAocG9zc2libHkgYWxzbyB0aGUgWCogdmFyaWFibGVzIGlmIG5lY2Vzc2FyeSkuCi0KLSAgICAgbWFrZQotCi0gICAgIFRoZXJlIGlzIG5vICJpbnN0YWxsIiB0YXJnZXQsIHNvIGNvcHkgdGhlIHRocmVlIGV4ZWN1dGFibGVzIHNvbWV3aGVyZQotICAgICBpbiB5b3VyIHBhdGggb3IgcnVuIHRoZW0gZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBBbGwgdGhyZWUgd2lsbAotICAgICBwcmludCBhIGJhc2ljIHVzYWdlIHNjcmVlbiB3aGVuIHJ1biB3aXRob3V0IGFueSBjb21tYW5kLWxpbmUgYXJndW1lbnRzOwotICAgICBzZWUgdGhlIGJvb2sgZm9yIG1vcmUgZGV0YWlscy4KLQotCi0gLSBXaW5kb3dzOgotCi0gICAgIFVucGFjayB0aGUgbGF0ZXN0IHBuZ2Jvb2sgc291cmNlcyAod2hpY2ggc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGhpcwotICAgICBSRUFETUUgZmlsZSkgaW50byBhIGZvbGRlciwgb3BlbiBhICJET1Mgc2hlbGwiIG9yICJjb21tYW5kIHByb21wdCIKLSAgICAgb3IgZXF1aXZhbGVudCBjb21tYW5kLWxpbmUgd2luZG93LCBhbmQgY2QgaW50byB0aGUgZm9sZGVyIHdoZXJlIHlvdQotICAgICB1bnBhY2tlZCB0aGUgc291cmNlIGNvZGUuCi0KLSAgICAgRm9yIE1TVkMsIHNldCB1cCB0aGUgbmVjZXNzYXJ5IGVudmlyb25tZW50IHZhcmlhYmxlcyBieSBpbnZva2luZwotIAotICAgICAgICAlZGV2c3R1ZGlvJVx2Y1xiaW5cdmN2YXJzMzIuYmF0Ci0KLSAgICAgd2hlcmUgd2hlcmUgJWRldnN0dWRpbyUgaXMgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIE1TVkMgLwotICAgICBEZXZTdHVkaW8uICBJZiB5b3UgZ2V0ICJlbnZpcm9ubWVudCBvdXQgb2Ygc3BhY2UiIGVycm9ycyB1bmRlciA5NS85OCwKLSAgICAgY3JlYXRlIGEgZGVza3RvcCBzaG9ydGN1dCB3aXRoICJjOlx3aW5kb3dzXGNvbW1hbmQuY29tIC9lOjQwOTYiIGFzCi0gICAgIHRoZSBwcm9ncmFtIGNvbW1hbmQgbGluZSBhbmQgc2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgcG5nYm9vawotICAgICBkaXJlY3RvcnkuICBUaGVuIGRvdWJsZS1jbGljayB0byBvcGVuIHRoZSBuZXcgRE9TLXByb21wdCB3aW5kb3cgd2l0aAotICAgICBhIGJpZ2dlciBlbnZpcm9ubWVudCBhbmQgcmV0cnkgdGhlIGNvbW1hbmRzIGFib3ZlLgotCi0gICAgIENvcHkgTWFrZWZpbGUudzMyIHRvIE1ha2VmaWxlIGFuZCBlZGl0IHRoZSBQTkdQQVRIIGFuZCBaUEFUSCB2YXJpYWJsZXMKLSAgICAgYXBwcm9wcmlhdGVseSAocG9zc2libHkgYWxzbyB0aGUgIklOQyIgYW5kICJMSUIiIHZhcmlhYmxlcyBpZiBuZWVkZWQpLgotICAgICBOb3RlIHRoYXQgdGhlIG5hbWVzIG9mIHRoZSBkeW5hbWljIGFuZCBzdGF0aWMgbGlicG5nIGFuZCB6bGliIGxpYnJhcmllcwotICAgICB1c2VkIGluIHRoZSBtYWtlZmlsZSBtYXkgY2hhbmdlIGluIGxhdGVyIHJlbGVhc2VzIG9mIHRoZSBsaWJyYXJpZXMuCi0gICAgIEFsc28gbm90ZSB0aGF0LCBhcyBvZiBsaWJwbmcgdmVyc2lvbiAxLjAuNSwgTVNWQyBETEwgYnVpbGRzIGRvIG5vdCB3b3JrLgotICAgICBUaGlzIG1ha2VmaWxlIHRoZXJlZm9yZSBidWlsZHMgc3RhdGljYWxseSBsaW5rZWQgZXhlY3V0YWJsZXMsIGJ1dCBpZgotICAgICB0aGUgRExMIHByb2JsZW1zIGV2ZXIgZ2V0IGZpeGVkLCB1bmNvbW1lbnRpbmcgdGhlIGFwcHJvcHJpYXRlIFBOR0xJQgotICAgICBhbmQgWkxJQiBsaW5lcyB3aWxsIGJ1aWxkIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcyBpbnN0ZWFkLgotCi0gICAgIERvIHRoZSBidWlsZCBieSB0eXBpbmcKLQotICAgICAgICBubWFrZQotCi0gICAgIFRoZSByZXN1bHQgc2hvdWxkIGJlIHRocmVlIGV4ZWN1dGFibGVzOiAgcnBuZy13aW4uZXhlLCBycG5nMi13aW4uZXhlLAotICAgICBhbmQgd3BuZy5leGUuICBDb3B5IHRoZW0gc29tZXdoZXJlIGluIHlvdXIgUEFUSCBvciBydW4gdGhlbSBmcm9tIHRoZQotICAgICBjdXJyZW50IGZvbGRlci4gIExpa2UgdGhlIFVuaXggdmVyc2lvbnMsIHRoZSB0d28gd2luZG93ZWQgcHJvZ3JhbXMKLSAgICAgKHJwbmcgYW5kIHJwbmcyKSBub3cgZGlzcGxheSBhIHVzYWdlIHNjcmVlbiBpbiBhIGNvbnNvbGUgd2luZG93IHdoZW4KLSAgICAgaW52b2tlZCB3aXRob3V0IGNvbW1hbmQtbGluZSBhcmd1bWVudHM7IHRoaXMgaXMgbmV3IGJlaGF2aW9yIGFzIG9mCi0gICAgIHRoZSBKdW5lIDIwMDEgcmVsZWFzZS4gIE5vdGUgdGhhdCB0aGUgcHJvZ3JhbXMgdXNlIHRoZSBVbml4LXN0eWxlICItIgotICAgICBjaGFyYWN0ZXIgdG8gc3BlY2lmeSBvcHRpb25zLCBpbnN0ZWFkIG9mIHRoZSBtb3JlIGNvbW1vbiBET1MvV2luZG93cwotICAgICAiLyIgY2hhcmFjdGVyLiAgKEZvciBleGFtcGxlOiAgInJwbmcyLXdpbiAtYmdwYXQgNCBmb28ucG5nIiwgbm90Ci0gICAgICJycG5nMi13aW4gL2JncGF0IDQgZm9vLnBuZyIpCi0KLQotIC0gT3BlblZNUzoKLQotICAgICBVbnBhY2sgdGhlIHBuZ2Jvb2sgc291cmNlcyBpbnRvIGEgc3ViZGlyZWN0b3J5IGFuZCBjaGFuZ2UgaW50byB0aGF0Ci0gICAgIHN1YmRpcmVjdG9yeS4KLQotICAgICBFZGl0IG1ha2V2bXMuY29tIGFwcHJvcHJpYXRlbHksIHNwZWNpZmljYWxseSB0aGUgenBhdGggYW5kIHBuZ3BhdGgKLSAgICAgdmFyaWFibGVzLgotCi0gICAgIEBtYWtldm1zCi0KLSAgICAgVG8gcnVuIHRoZSBwcm9ncmFtcywgdGhleSBwcm9iYWJseSBmaXJzdCBuZWVkIHRvIGJlIHNldCB1cCBhcyAiZm9yZWlnbgotICAgICBzeW1ib2xzLCIgd2l0aCAiZGlzayIgYW5kICJkaXIiIHNldCBhcHByb3ByaWF0ZWx5OgotCi0gICAgICQgcnBuZyAgPT0gIiRkaXNrOltkaXJdcnBuZy14LmV4ZSIKLSAgICAgJCBycG5nMiA9PSAiJGRpc2s6W2Rpcl1ycG5nMi14LmV4ZSIKLSAgICAgJCB3cG5nICA9PSAiJGRpc2s6W2Rpcl13cG5nLmV4ZSIKLQotICAgICBBbGwgdGhyZWUgd2lsbCBwcmludCBhIGJhc2ljIHVzYWdlIHNjcmVlbiB3aGVuIHJ1biB3aXRob3V0IGFueSBjb21tYW5kLQotICAgICBsaW5lIGFyZ3VtZW50czsgc2VlIHRoZSBib29rIGZvciBtb3JlIGRldGFpbHMuICBOb3RlIHRoYXQgdGhlIG9wdGlvbnMKLSAgICAgc3R5bGUgaXMgVW5peC1saWtlLCBpLmUuLCBwcmVjZWRlZCBieSAiLSIgcmF0aGVyIHRoYW4gIi8iLgotCi0KLVJVTk5JTkcgVEhFIFBST0dSQU1TOiAgKFZFUlkpIEJSSUVGIElOVFJPCi0KLSAgICAgcnBuZyBpcyBhIHNpbXBsZSBQTkcgdmlld2VyIHRoYXQgY2FuIGRpc3BsYXkgdHJhbnNwYXJlbnQgUE5HcyB3aXRoIGEKLSAgICAgc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3I7IGZvciBleGFtcGxlLAotCi0JcnBuZyAtYmdjb2xvciBcI2ZmMDAwMCB0b3VjYW4ucG5nCi0KLSAgICAgd291bGQgZGlzcGxheSB0aGUgaW1hZ2Ugd2l0aCBhIHJlZCBiYWNrZ3JvdW5kLiAgcnBuZzIgaXMgYSBwcm9ncmVzc2l2ZQotICAgICB2aWV3ZXIgdGhhdCBzaW11bGF0ZXMgYSB3ZWIgYnJvd3NlciBpbiBzb21lIHJlc3BlY3RzOyBpdCBjYW4gZGlzcGxheQotICAgICBpbWFnZXMgYWdhaW5zdCBlaXRoZXIgYSBiYWNrZ3JvdW5kIGNvbG9yIG9yIGEgZHluYW1pY2FsbHkgZ2VuZXJhdGVkCi0gICAgIGJhY2tncm91bmQgaW1hZ2UuICBGb3IgZXhhbXBsZToKLQotCXJwbmcyIC1iZ3BhdCAxNiB0b3VjYW4ucG5nCi0KLSAgICAgd3BuZyBpcyBhIHB1cmVseSBjb21tYW5kLWxpbmUgaW1hZ2UgY29udmVydGVyIGZyb20gYmluYXJ5IFBCTVBMVVMvTmV0UEJNCi0gICAgIGZvcm1hdCAoLnBnbSBvciAucHBtKSB0byBQTkc7IGZvciBleGFtcGxlLAotCi0Jd3BuZyAtdGltZSA8IHRvdWNhbi1ub3RyYW5zLnBwbSA+IHRvdWNhbi1ub3RyYW5zLnBuZwotCi0gICAgIHdvdWxkIGNvbnZlcnQgdGhlIHNwZWNpZmllZCBQUE0gZmlsZSAodXNpbmcgcmVkaXJlY3Rpb24pIHRvIFBORywgYXV0by0KLSAgICAgbWF0aWNhbGx5IHNldHRpbmcgdGhlIFBORyBtb2RpZmljYXRpb24tdGltZSBjaHVuay4KLQotICAgICBBbGwgb3B0aW9ucyBjYW4gYmUgYWJicmV2aWF0ZWQgdG8gdGhlIHNob3J0ZXN0IHVuaXF1ZSB2YWx1ZTsgZm9yIGV4YW1wbGUsCi0gICAgICItYmdjIiBmb3IgLWJnY29sb3IgKHZlcnN1cyAiLWJncCIgZm9yIC1iZ3BhdCksIG9yICItZyIgZm9yIC1nYW1tYS4KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9tYWtldm1zLmNvbSBiL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9tYWtldm1zLmNvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmQzN2RjMC4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svbWFrZXZtcy5jb20KKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSQhIG1ha2UgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUiIGRlbW8gcHJvZ3JhbXMgKGZvciBYKSB1bmRlciBPcGVuVk1TCi0kIQotJCEgU2NyaXB0IGNyZWF0ZWQgYnkgTWFydGluIFppbnNlciBmb3IgbGlicG5nOyBtb2RpZmllZCBieSBHcmVnIFJvZWxvZnMKLSQhIGZvciBzdGFuZGFsb25lIHBuZ2Jvb2sgc291cmNlIGRpc3RyaWJ1dGlvbi4KLSQhCi0kIQotJCEgICAgU2V0IGxvY2F0aW9ucyB3aGVyZSB6bGliIGFuZCBsaWJwbmcgc291cmNlcyBsaXZlLgotJCEKLSQgenBhdGggICA9ICIiCi0kIHBuZ3BhdGggPSAiIgotJCEKLSQgaWYgZiRzZWFyY2goIlstLS0uemxpYl16bGliLmgiKS5uZXMuIiIgdGhlbiB6cGF0aCA9ICJbLS0tLnpsaWJdIgotJCBpZiBmJHNlYXJjaCgiWy0tXXBuZy5oIikubmVzLiIiIHRoZW4gcG5ncGF0aCA9ICJbLS1dIgotJCEKLSQgaWYgZiRzZWFyY2goIlstLnpsaWJdemxpYi5oIikubmVzLiIiIHRoZW4genBhdGggPSAiWy0uemxpYl0iCi0kIGlmIGYkc2VhcmNoKCJbLS5saWJwbmddcG5nLmgiKS5uZXMuIiIgdGhlbiBwbmdwYXRoID0gIlstLmxpYnBuZ10iCi0kIQotJCBpZiB6cGF0aCAuZXFzLiAiIgotJCB0aGVuCi0kICAgd3JpdGUgc3lzJG91dHB1dCAiemxpYiBpbmNsdWRlIG5vdCBmb3VuZC4gRXhpdGluZy4uLiIKLSQgICBleGl0IDIKLSQgZW5kaWYgCi0kIQotJCBpZiBwbmdwYXRoIC5lcXMuICIiCi0kIHRoZW4KLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJsaWJwbmcgaW5jbHVkZSBub3QgZm91bmQuIEV4aXRpbmcuLi4iCi0kICAgZXhpdCAyCi0kIGVuZGlmIAotJCEKLSQhICAgIExvb2sgZm9yIHRoZSBjb21waWxlciB1c2VkLgotJCEKLSQgY2NvcHQ9Ii9pbmNsdWRlPSgnJ3pwYXRoJywnJ3BuZ3BhdGgnKSIKLSQgaWYgZiRnZXRzeWkoIkhXX01PREVMIikuZ2UuMTAyNAotJCB0aGVuCi0kICBjY29wdCA9ICIvcHJlZml4PWFsbCIrY2NvcHQKLSQgIGNvbXAgID0gIl9fZGVjY19fPTEiCi0kICBpZiBmJHRybmxubSgiU1lTIikuZXFzLiIiIHRoZW4gZGVmaW5lIHN5cyBzeXMkbGlicmFyeToKLSQgZWxzZQotJCAgaWYgZiRzZWFyY2goIlNZUyRTWVNURU06REVDQyRDT01QSUxFUi5FWEUiKS5lcXMuIiIKLSQgICB0aGVuCi0kICAgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIHN5cyRsaWJyYXJ5OgotJCAgICBpZiBmJHNlYXJjaCgiU1lTJFNZU1RFTTpWQVhDLkVYRSIpLmVxcy4iIgotJCAgICAgdGhlbgotJCAgICAgIGNvbXAgID0gIl9fZ2NjX189MSIKLSQgICAgICBDQyA6PT0gR0NDCi0kICAgICBlbHNlCi0kICAgICAgY29tcCA9ICJfX3ZheGNfXz0xIgotJCAgICAgZW5kaWYKLSQgICBlbHNlCi0kICAgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIGRlY2MkbGlicmFyeV9pbmNsdWRlOgotJCAgICBjY29wdCA9ICIvZGVjYy9wcmVmaXg9YWxsIitjY29wdAotJCAgICBjb21wICA9ICJfX2RlY2NfXz0xIgotJCAgZW5kaWYKLSQgZW5kaWYKLSQgb3Blbi93cml0ZSBsb3B0IGxpYi5vcHQKLSQgd3JpdGUgbG9wdCAiJydwbmdwYXRoJ2xpYnBuZy5vbGIvbGliIgotJCB3cml0ZSBsb3B0ICInJ3pwYXRoJ2xpYnoub2xiL2xpYiIKLSQgY2xvc2UgbG9wdAotJCBvcGVuL3dyaXRlIHhvcHQgeDExLm9wdAotJCB3cml0ZSB4b3B0ICJzeXMkbGlicmFyeTpkZWN3JHhsaWJzaHIuZXhlL3NoYXJlIgotJCBjbG9zZSB4b3B0Ci0kIQotJCEgICAgQnVpbGQgJ2VtLgotJCEKLSQgd3JpdGUgc3lzJG91dHB1dCAiQ29tcGlsaW5nIFBORyBib29rIHByb2dyYW1zIC4uLiIKLSQgICBDQUxMIE1BS0UgcmVhZHBuZy5PQkogImNjICcnQ0NPUFQnIHJlYWRwbmciIC0KLQlyZWFkcG5nLmMgcmVhZHBuZy5oCi0kICAgQ0FMTCBNQUtFIHJlYWRwbmcyLk9CSiAiY2MgJydDQ09QVCcgcmVhZHBuZzIiIC0KLQlyZWFkcG5nMi5jIHJlYWRwbmcyLmgKLSQgICBDQUxMIE1BS0Ugd3JpdGVwbmcuT0JKICJjYyAnJ0NDT1BUJyB3cml0ZXBuZyIgLQotCXdyaXRlcG5nLmMgd3JpdGVwbmcuaAotJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIHJwbmcteC4uLiIKLSQgICBDQUxMIE1BS0UgcnBuZy14Lk9CSiAiY2MgJydDQ09QVCcgcnBuZy14IiAtCi0JcnBuZy14LmMgcmVhZHBuZy5oCi0kICAgY2FsbCBtYWtlIHJwbmcteC5leGUgLQotCSJMSU5LIHJwbmcteCxyZWFkcG5nLGxpYi5vcHQvb3B0LHgxMS5vcHQvb3B0IiAtCi0JcnBuZy14Lm9iaiByZWFkcG5nLm9iagotJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIHJwbmcyLXguLi4iCi0kICAgQ0FMTCBNQUtFIHJwbmcyLXguT0JKICJjYyAnJ0NDT1BUJyBycG5nMi14IiAtCi0JcnBuZzIteC5jIHJlYWRwbmcyLmgKLSQgICBjYWxsIG1ha2UgcnBuZzIteC5leGUgLQotCSJMSU5LIHJwbmcyLXgscmVhZHBuZzIsbGliLm9wdC9vcHQseDExLm9wdC9vcHQiIC0KLQlycG5nMi14Lm9iaiByZWFkcG5nMi5vYmoKLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJCdWlsZGluZyB3cG5nLi4uIgotJCAgIENBTEwgTUFLRSB3cG5nLk9CSiAiY2MgJydDQ09QVCcgd3BuZyIgLQotCXdwbmcuYyB3cml0ZXBuZy5oCi0kICAgY2FsbCBtYWtlIHdwbmcuZXhlIC0KLQkiTElOSyB3cG5nLHdyaXRlcG5nLGxpYi5vcHQvb3B0IiAtCi0Jd3BuZy5vYmogd3JpdGVwbmcub2JqCi0kIGV4aXQKLSQhCi0kIQotJE1BS0U6IFNVQlJPVVRJTkUgICAhU1VCUk9VVElORSBUTyBDSEVDSyBERVBFTkRFTkNJRVMKLSQgViA9ICdGJFZlcmlmeSgwKQotJCEgUDEgPSBXaGF0IHdlIGFyZSB0cnlpbmcgdG8gbWFrZQotJCEgUDIgPSBDb21tYW5kIHRvIG1ha2UgaXQKLSQhIFAzIC0gUDggIFdoYXQgaXQgZGVwZW5kcyBvbgotJAotJCBJZiBGJFNlYXJjaChQMSkgLkVxcy4gIiIgVGhlbiBHb3RvIE1ha2VpdAotJCBUaW1lID0gRiRDdlRpbWUoRiRGaWxlKFAxLCJSRFQiKSkKLSRhcmc9MwotJExvb3A6Ci0kICAgICAgIEFyZ3VtZW50ID0gUCdhcmcKLSQgICAgICAgSWYgQXJndW1lbnQgLkVxcy4gIiIgVGhlbiBHb3RvIEV4aXQKLSQgICAgICAgRWw9MAotJExvb3AyOgotJCAgICAgICBGaWxlID0gRiRFbGVtZW50KEVsLCIgIixBcmd1bWVudCkKLSQgICAgICAgSWYgRmlsZSAuRXFzLiAiICIgVGhlbiBHb3RvIEVuZGwKLSQgICAgICAgQUZpbGUgPSAiIgotJExvb3AzOgotJCAgICAgICBPRmlsZSA9IEFGaWxlCi0kICAgICAgIEFGaWxlID0gRiRTZWFyY2goRmlsZSkKLSQgICAgICAgSWYgQUZpbGUgLkVxcy4gIiIgLk9yLiBBRmlsZSAuRXFzLiBPRmlsZSBUaGVuIEdvdG8gTmV4dEVsCi0kICAgICAgIElmIEYkQ3ZUaW1lKEYkRmlsZShBRmlsZSwiUkRUIikpIC5HZXMuIFRpbWUgVGhlbiBHb3RvIE1ha2VpdAotJCAgICAgICBHb3RvIExvb3AzCi0kTmV4dEVMOgotJCAgICAgICBFbCA9IEVsICsgMQotJCAgICAgICBHb3RvIExvb3AyCi0kRW5kTDoKLSQgYXJnPWFyZysxCi0kIElmIGFyZyAuTGUuIDggVGhlbiBHb3RvIExvb3AKLSQgR290byBFeGl0Ci0kCi0kTWFrZWl0OgotJCBWVj1GJFZFUklGWSgwKQotJCB3cml0ZSBzeXMkb3V0cHV0IFAyCi0kICdQMgotJCBWVj0nRiRWZXJpZnkoVlYpCi0kRXhpdDoKLSQgSWYgViBUaGVuIFNldCBWZXJpZnkKLSRFTkRTVUJST1VUSU5FCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZy5jIGIvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JlYWRwbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmYzFmYi4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHJwbmcgLSBzaW1wbGUgUE5HIGRpc3BsYXkgcHJvZ3JhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRwbmcuYwotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBHcmVnIFJvZWxvZnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCi0gICAgICBleHByZXNzIG9yIGltcGxpZWQuICBJbiBubyBldmVudCBzaGFsbCB0aGUgYXV0aG9yIG9yIGNvbnRyaWJ1dG9ycwotICAgICAgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgaW4gYW55IHdheSBmcm9tIHRoZSB1c2Ugb2YKLSAgICAgIHRoaXMgc29mdHdhcmUuCi0KLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIERVQUwtTElDRU5TRUQuICBZb3UgbWF5IG1vZGlmeSBhbmQvb3IKLSAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQotICAgICAgZm9sbG93aW5nIHR3byBsaWNlbnNlcyAoYXQgeW91ciBvcHRpb24pOgotCi0KLSAgICAgIExJQ0VOU0UgMSAoIkJTRC1saWtlIHdpdGggYWR2ZXJ0aXNpbmcgY2xhdXNlIik6Ci0KLSAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICAgICAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZQotICAgICAgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMuCi0gICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YS0KLSAgICAgICAgIHRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAgICAgICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotCi0gICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcwotICAgICAgICAgICAgYW5kIGNvbnRyaWJ1dG9ycyBmb3IgdGhlIGJvb2ssICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlLCIKLSAgICAgICAgICAgIHB1Ymxpc2hlZCBieSBPJ1JlaWxseSBhbmQgQXNzb2NpYXRlcy4KLQotCi0gICAgICBMSUNFTlNFIDIgKEdOVSBHUEwgdjIgb3IgbGF0ZXIpOgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgICAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgInBuZy5oIiAgICAgICAgLyogbGlicG5nIGhlYWRlcjsgaW5jbHVkZXMgemxpYi5oICovCi0jaW5jbHVkZSAicmVhZHBuZy5oIiAgICAvKiB0eXBlZGVmcywgY29tbW9uIG1hY3JvcywgcHVibGljIHByb3RvdHlwZXMgKi8KLQotLyogZnV0dXJlIHZlcnNpb25zIG9mIGxpYnBuZyB3aWxsIHByb3ZpZGUgdGhpcyBtYWNybzogKi8KLSNpZm5kZWYgcG5nX2ptcGJ1ZgotIyAgZGVmaW5lIHBuZ19qbXBidWYocG5nX3B0cikgICAoKHBuZ19wdHIpLT5qbXBidWYpCi0jZW5kaWYKLQotCi1zdGF0aWMgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IE5VTEw7Ci1zdGF0aWMgcG5nX2luZm9wIGluZm9fcHRyID0gTlVMTDsKLQotcG5nX3VpbnRfMzIgIHdpZHRoLCBoZWlnaHQ7Ci1pbnQgIGJpdF9kZXB0aCwgY29sb3JfdHlwZTsKLXVjaCAgKmltYWdlX2RhdGEgPSBOVUxMOwotCi0KLXZvaWQgcmVhZHBuZ192ZXJzaW9uX2luZm8odm9pZCkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgIENvbXBpbGVkIHdpdGggbGlicG5nICVzOyB1c2luZyBsaWJwbmcgJXMuXG4iLAotICAgICAgUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBwbmdfbGlicG5nX3Zlcik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICBDb21waWxlZCB3aXRoIHpsaWIgJXM7IHVzaW5nIHpsaWIgJXMuXG4iLAotICAgICAgWkxJQl9WRVJTSU9OLCB6bGliX3ZlcnNpb24pOwotfQotCi0KLS8qIHJldHVybiB2YWx1ZSA9IDAgZm9yIHN1Y2Nlc3MsIDEgZm9yIGJhZCBzaWcsIDIgZm9yIGJhZCBJSERSLCA0IGZvciBubyBtZW0gKi8KLQotaW50IHJlYWRwbmdfaW5pdChGSUxFICppbmZpbGUsIHVsZyAqcFdpZHRoLCB1bGcgKnBIZWlnaHQpCi17Ci0gICAgdWNoIHNpZ1s4XTsKLQotCi0gICAgLyogZmlyc3QgZG8gYSBxdWljayBjaGVjayB0aGF0IHRoZSBmaWxlIHJlYWxseSBpcyBhIFBORyBpbWFnZTsgY291bGQKLSAgICAgKiBoYXZlIHVzZWQgc2xpZ2h0bHkgbW9yZSBnZW5lcmFsIHBuZ19zaWdfY21wKCkgZnVuY3Rpb24gaW5zdGVhZCAqLwotCi0gICAgZnJlYWQoc2lnLCAxLCA4LCBpbmZpbGUpOwotICAgIGlmIChwbmdfc2lnX2NtcChzaWcsIDAsIDgpKQotICAgICAgICByZXR1cm4gMTsgICAvKiBiYWQgc2lnbmF0dXJlICovCi0KLQotICAgIC8qIGNvdWxkIHBhc3MgcG9pbnRlcnMgdG8gdXNlci1kZWZpbmVkIGVycm9yIGhhbmRsZXJzIGluc3RlYWQgb2YgTlVMTHM6ICovCi0KLSAgICBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgIGlmICghcG5nX3B0cikKLSAgICAgICAgcmV0dXJuIDQ7ICAgLyogb3V0IG9mIG1lbW9yeSAqLwotCi0gICAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOwotICAgIGlmICghaW5mb19wdHIpIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsIE5VTEwsIE5VTEwpOwotICAgICAgICByZXR1cm4gNDsgICAvKiBvdXQgb2YgbWVtb3J5ICovCi0gICAgfQotCi0KLSAgICAvKiB3ZSBjb3VsZCBjcmVhdGUgYSBzZWNvbmQgaW5mbyBzdHJ1Y3QgaGVyZSAoZW5kX2luZm8pLCBidXQgaXQncyBvbmx5Ci0gICAgICogdXNlZnVsIGlmIHdlIHdhbnQgdG8ga2VlcCBwcmUtIGFuZCBwb3N0LUlEQVQgY2h1bmsgaW5mbyBzZXBhcmF0ZWQKLSAgICAgKiAobWFpbmx5IGZvciBQTkctYXdhcmUgaW1hZ2UgZWRpdG9ycyBhbmQgY29udmVydGVycykgKi8KLQotCi0gICAgLyogc2V0am1wKCkgbXVzdCBiZSBjYWxsZWQgaW4gZXZlcnkgZnVuY3Rpb24gdGhhdCBjYWxscyBhIFBORy1yZWFkaW5nCi0gICAgICogbGlicG5nIGZ1bmN0aW9uICovCi0KLSAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKSB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOwotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLQotICAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIGluZmlsZSk7Ci0gICAgcG5nX3NldF9zaWdfYnl0ZXMocG5nX3B0ciwgOCk7ICAvKiB3ZSBhbHJlYWR5IHJlYWQgdGhlIDggc2lnbmF0dXJlIGJ5dGVzICovCi0KLSAgICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsgIC8qIHJlYWQgYWxsIFBORyBpbmZvIHVwIHRvIGltYWdlIGRhdGEgKi8KLQotCi0gICAgLyogYWx0ZXJuYXRpdmVseSwgY291bGQgbWFrZSBzZXBhcmF0ZSBjYWxscyB0byBwbmdfZ2V0X2ltYWdlX3dpZHRoKCksCi0gICAgICogZXRjLiwgYnV0IHdhbnQgYml0X2RlcHRoIGFuZCBjb2xvcl90eXBlIGZvciBsYXRlciBbZG9uJ3QgY2FyZSBhYm91dAotICAgICAqIGNvbXByZXNzaW9uX3R5cGUgYW5kIGZpbHRlcl90eXBlID0+IE5VTExzXSAqLwotCi0gICAgcG5nX2dldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCAmd2lkdGgsICZoZWlnaHQsICZiaXRfZGVwdGgsICZjb2xvcl90eXBlLAotICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gICAgKnBXaWR0aCA9IHdpZHRoOwotICAgICpwSGVpZ2h0ID0gaGVpZ2h0OwotCi0KLSAgICAvKiBPSywgdGhhdCdzIGFsbCB3ZSBuZWVkIGZvciBub3c7IHJldHVybiBoYXBweSAqLwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLS8qIHJldHVybnMgMCBpZiBzdWNjZWVkcywgMSBpZiBmYWlscyBkdWUgdG8gbm8gYktHRCBjaHVuaywgMiBpZiBsaWJwbmcgZXJyb3I7Ci0gKiBzY2FsZXMgdmFsdWVzIHRvIDgtYml0IGlmIG5lY2Vzc2FyeSAqLwotCi1pbnQgcmVhZHBuZ19nZXRfYmdjb2xvcih1Y2ggKnJlZCwgdWNoICpncmVlbiwgdWNoICpibHVlKQotewotICAgIHBuZ19jb2xvcl8xNnAgcEJhY2tncm91bmQ7Ci0KLQotICAgIC8qIHNldGptcCgpIG11c3QgYmUgY2FsbGVkIGluIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgY2FsbHMgYSBQTkctcmVhZGluZwotICAgICAqIGxpYnBuZyBmdW5jdGlvbiAqLwotCi0gICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0KLSAgICBpZiAoIXBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX2JLR0QpKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIC8qIGl0IGlzIG5vdCBvYnZpb3VzIGZyb20gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCBidXQgdGhpcyBmdW5jdGlvbgotICAgICAqIHRha2VzIGEgcG9pbnRlciB0byBhIHBvaW50ZXIsIGFuZCBpdCBhbHdheXMgcmV0dXJucyB2YWxpZCByZWQsIGdyZWVuCi0gICAgICogYW5kIGJsdWUgdmFsdWVzLCByZWdhcmRsZXNzIG9mIGNvbG9yX3R5cGU6ICovCi0KLSAgICBwbmdfZ2V0X2JLR0QocG5nX3B0ciwgaW5mb19wdHIsICZwQmFja2dyb3VuZCk7Ci0KLQotICAgIC8qIGhvd2V2ZXIsIGl0IGFsd2F5cyByZXR1cm5zIHRoZSByYXcgYktHRCBkYXRhLCByZWdhcmRsZXNzIG9mIGFueQotICAgICAqIGJpdC1kZXB0aCB0cmFuc2Zvcm1hdGlvbnMsIHNvIGNoZWNrIGRlcHRoIGFuZCBhZGp1c3QgaWYgbmVjZXNzYXJ5ICovCi0KLSAgICBpZiAoYml0X2RlcHRoID09IDE2KSB7Ci0gICAgICAgICpyZWQgICA9IHBCYWNrZ3JvdW5kLT5yZWQgICA+PiA4OwotICAgICAgICAqZ3JlZW4gPSBwQmFja2dyb3VuZC0+Z3JlZW4gPj4gODsKLSAgICAgICAgKmJsdWUgID0gcEJhY2tncm91bmQtPmJsdWUgID4+IDg7Ci0gICAgfSBlbHNlIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgJiYgYml0X2RlcHRoIDwgOCkgewotICAgICAgICBpZiAoYml0X2RlcHRoID09IDEpCi0gICAgICAgICAgICAqcmVkID0gKmdyZWVuID0gKmJsdWUgPSBwQmFja2dyb3VuZC0+Z3JheT8gMjU1IDogMDsKLSAgICAgICAgZWxzZSBpZiAoYml0X2RlcHRoID09IDIpCi0gICAgICAgICAgICAqcmVkID0gKmdyZWVuID0gKmJsdWUgPSAoMjU1LzMpICogcEJhY2tncm91bmQtPmdyYXk7Ci0gICAgICAgIGVsc2UgLyogYml0X2RlcHRoID09IDQgKi8KLSAgICAgICAgICAgICpyZWQgPSAqZ3JlZW4gPSAqYmx1ZSA9ICgyNTUvMTUpICogcEJhY2tncm91bmQtPmdyYXk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKnJlZCAgID0gKHVjaClwQmFja2dyb3VuZC0+cmVkOwotICAgICAgICAqZ3JlZW4gPSAodWNoKXBCYWNrZ3JvdW5kLT5ncmVlbjsKLSAgICAgICAgKmJsdWUgID0gKHVjaClwQmFja2dyb3VuZC0+Ymx1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLQotLyogZGlzcGxheV9leHBvbmVudCA9PSBMVVRfZXhwb25lbnQgKiBDUlRfZXhwb25lbnQgKi8KLQotdWNoICpyZWFkcG5nX2dldF9pbWFnZShkb3VibGUgZGlzcGxheV9leHBvbmVudCwgaW50ICpwQ2hhbm5lbHMsIHVsZyAqcFJvd2J5dGVzKQotewotICAgIGRvdWJsZSAgZ2FtbWE7Ci0gICAgcG5nX3VpbnRfMzIgIGksIHJvd2J5dGVzOwotICAgIHBuZ19ieXRlcHAgIHJvd19wb2ludGVycyA9IE5VTEw7Ci0KLQotICAgIC8qIHNldGptcCgpIG11c3QgYmUgY2FsbGVkIGluIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgY2FsbHMgYSBQTkctcmVhZGluZwotICAgICAqIGxpYnBuZyBmdW5jdGlvbiAqLwotCi0gICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0KLSAgICAvKiBleHBhbmQgcGFsZXR0ZSBpbWFnZXMgdG8gUkdCLCBsb3ctYml0LWRlcHRoIGdyYXlzY2FsZSBpbWFnZXMgdG8gOCBiaXRzLAotICAgICAqIHRyYW5zcGFyZW5jeSBjaHVua3MgdG8gZnVsbCBhbHBoYSBjaGFubmVsOyBzdHJpcCAxNi1iaXQtcGVyLXNhbXBsZQotICAgICAqIGltYWdlcyB0byA4IGJpdHMgcGVyIHNhbXBsZTsgYW5kIGNvbnZlcnQgZ3JheXNjYWxlIHRvIFJHQltBXSAqLwotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgICAgcG5nX3NldF9leHBhbmQocG5nX3B0cik7Ci0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJiBiaXRfZGVwdGggPCA4KQotICAgICAgICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsKLSAgICBpZiAocG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fdFJOUykpCi0gICAgICAgIHBuZ19zZXRfZXhwYW5kKHBuZ19wdHIpOwotICAgIGlmIChiaXRfZGVwdGggPT0gMTYpCi0gICAgICAgIHBuZ19zZXRfc3RyaXBfMTYocG5nX3B0cik7Ci0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSB8fAotICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgICAgIHBuZ19zZXRfZ3JheV90b19yZ2IocG5nX3B0cik7Ci0KLQotICAgIC8qIHVubGlrZSB0aGUgZXhhbXBsZSBpbiB0aGUgbGlicG5nIGRvY3VtZW50YXRpb24sIHdlIGhhdmUgKm5vKiBpZGVhIHdoZXJlCi0gICAgICogdGhpcyBmaWxlIG1heSBoYXZlIGNvbWUgZnJvbS0tc28gaWYgaXQgZG9lc24ndCBoYXZlIGEgZmlsZSBnYW1tYSwgZG9uJ3QKLSAgICAgKiBkbyBhbnkgY29ycmVjdGlvbiAoImRvIG5vIGhhcm0iKSAqLwotCi0gICAgaWYgKHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmdhbW1hKSkKLSAgICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBkaXNwbGF5X2V4cG9uZW50LCBnYW1tYSk7Ci0KLQotICAgIC8qIGFsbCB0cmFuc2Zvcm1hdGlvbnMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQ7IG5vdyB1cGRhdGUgaW5mb19wdHIgZGF0YSwKLSAgICAgKiBnZXQgcm93Ynl0ZXMgYW5kIGNoYW5uZWxzLCBhbmQgYWxsb2NhdGUgaW1hZ2UgbWVtb3J5ICovCi0KLSAgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgICAqcFJvd2J5dGVzID0gcm93Ynl0ZXMgPSBwbmdfZ2V0X3Jvd2J5dGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICAqcENoYW5uZWxzID0gKGludClwbmdfZ2V0X2NoYW5uZWxzKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgIGlmICgoaW1hZ2VfZGF0YSA9ICh1Y2ggKiltYWxsb2Mocm93Ynl0ZXMqaGVpZ2h0KSkgPT0gTlVMTCkgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmICgocm93X3BvaW50ZXJzID0gKHBuZ19ieXRlcHApbWFsbG9jKGhlaWdodCpzaXplb2YocG5nX2J5dGVwKSkpID09IE5VTEwpIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7Ci0gICAgICAgIGZyZWUoaW1hZ2VfZGF0YSk7Ci0gICAgICAgIGltYWdlX2RhdGEgPSBOVUxMOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBUcmFjZSgoc3RkZXJyLCAicmVhZHBuZ19nZXRfaW1hZ2U6ICBjaGFubmVscyA9ICVkLCByb3dieXRlcyA9ICVsZCwgaGVpZ2h0ID0gJWxkXG4iLCAqcENoYW5uZWxzLCByb3dieXRlcywgaGVpZ2h0KSk7Ci0KLQotICAgIC8qIHNldCB0aGUgaW5kaXZpZHVhbCByb3dfcG9pbnRlcnMgdG8gcG9pbnQgYXQgdGhlIGNvcnJlY3Qgb2Zmc2V0cyAqLwotCi0gICAgZm9yIChpID0gMDsgIGkgPCBoZWlnaHQ7ICArK2kpCi0gICAgICAgIHJvd19wb2ludGVyc1tpXSA9IGltYWdlX2RhdGEgKyBpKnJvd2J5dGVzOwotCi0KLSAgICAvKiBub3cgd2UgY2FuIGdvIGFoZWFkIGFuZCBqdXN0IHJlYWQgdGhlIHdob2xlIGltYWdlICovCi0KLSAgICBwbmdfcmVhZF9pbWFnZShwbmdfcHRyLCByb3dfcG9pbnRlcnMpOwotCi0KLSAgICAvKiBhbmQgd2UncmUgZG9uZSEgIChwbmdfcmVhZF9lbmQoKSBjYW4gYmUgb21pdHRlZCBpZiBubyBwcm9jZXNzaW5nIG9mCi0gICAgICogcG9zdC1JREFUIHRleHQvdGltZS9ldGMuIGlzIGRlc2lyZWQpICovCi0KLSAgICBmcmVlKHJvd19wb2ludGVycyk7Ci0gICAgcm93X3BvaW50ZXJzID0gTlVMTDsKLQotICAgIHBuZ19yZWFkX2VuZChwbmdfcHRyLCBOVUxMKTsKLQotICAgIHJldHVybiBpbWFnZV9kYXRhOwotfQotCi0KLXZvaWQgcmVhZHBuZ19jbGVhbnVwKGludCBmcmVlX2ltYWdlX2RhdGEpCi17Ci0gICAgaWYgKGZyZWVfaW1hZ2VfZGF0YSAmJiBpbWFnZV9kYXRhKSB7Ci0gICAgICAgIGZyZWUoaW1hZ2VfZGF0YSk7Ci0gICAgICAgIGltYWdlX2RhdGEgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChwbmdfcHRyICYmIGluZm9fcHRyKSB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOwotICAgICAgICBwbmdfcHRyID0gTlVMTDsKLSAgICAgICAgaW5mb19wdHIgPSBOVUxMOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9yZWFkcG5nLmggYi9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWQ5ZmUzLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9yZWFkcG5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBycG5nIC0gc2ltcGxlIFBORyBkaXNwbGF5IHByb2dyYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkcG5nLmgKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDcgR3JlZyBSb2Vsb2ZzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMsIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLAotICAgICAgZXhwcmVzcyBvciBpbXBsaWVkLiAgSW4gbm8gZXZlbnQgc2hhbGwgdGhlIGF1dGhvciBvciBjb250cmlidXRvcnMKLSAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCi0gICAgICB0aGlzIHNvZnR3YXJlLgotCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCi0gICAgICByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIG9uZSBvZiB0aGUKLSAgICAgIGZvbGxvd2luZyB0d28gbGljZW5zZXMgKGF0IHlvdXIgb3B0aW9uKToKLQotCi0gICAgICBMSUNFTlNFIDEgKCJCU0QtbGlrZSB3aXRoIGFkdmVydGlzaW5nIGNsYXVzZSIpOgotCi0gICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgICAgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUKLSAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgotICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGEtCi0gICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gICAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLQotICAgICAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBHcmVnIFJvZWxvZnMKLSAgICAgICAgICAgIGFuZCBjb250cmlidXRvcnMgZm9yIHRoZSBib29rLCAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiCi0gICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCi0KLQotICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICAgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBUUlVFCi0jICBkZWZpbmUgVFJVRSAxCi0jICBkZWZpbmUgRkFMU0UgMAotI2VuZGlmCi0KLSNpZm5kZWYgTUFYCi0jICBkZWZpbmUgTUFYKGEsYikgICgoYSkgPiAoYik/IChhKSA6IChiKSkKLSMgIGRlZmluZSBNSU4oYSxiKSAgKChhKSA8IChiKT8gKGEpIDogKGIpKQotI2VuZGlmCi0KLSNpZmRlZiBERUJVRwotIyAgZGVmaW5lIFRyYWNlKHgpICB7ZnByaW50ZiB4IDsgZmZsdXNoKHN0ZGVycik7IGZmbHVzaChzdGRvdXQpO30KLSNlbHNlCi0jICBkZWZpbmUgVHJhY2UoeCkgIDsKLSNlbmRpZgotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1Y2g7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1c2g7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICB1bGc7Ci0KLQotLyogcHJvdG90eXBlcyBmb3IgcHVibGljIGZ1bmN0aW9ucyBpbiByZWFkcG5nLmMgKi8KLQotdm9pZCByZWFkcG5nX3ZlcnNpb25faW5mbyh2b2lkKTsKLQotaW50IHJlYWRwbmdfaW5pdChGSUxFICppbmZpbGUsIHVsZyAqcFdpZHRoLCB1bGcgKnBIZWlnaHQpOwotCi1pbnQgcmVhZHBuZ19nZXRfYmdjb2xvcih1Y2ggKmJnX3JlZCwgdWNoICpiZ19ncmVlbiwgdWNoICpiZ19ibHVlKTsKLQotdWNoICpyZWFkcG5nX2dldF9pbWFnZShkb3VibGUgZGlzcGxheV9leHBvbmVudCwgaW50ICpwQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgIHVsZyAqcFJvd2J5dGVzKTsKLQotdm9pZCByZWFkcG5nX2NsZWFudXAoaW50IGZyZWVfaW1hZ2VfZGF0YSk7CmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZzIuYyBiL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9yZWFkcG5nMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTA1NmM3Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9yZWFkcG5nMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDg0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHJwbmcyIC0gcHJvZ3Jlc3NpdmUtbW9kZWwgUE5HIGRpc3BsYXkgcHJvZ3JhbSAgICAgICAgICAgICAgICAgcmVhZHBuZzIuYwotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBHcmVnIFJvZWxvZnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCi0gICAgICBleHByZXNzIG9yIGltcGxpZWQuICBJbiBubyBldmVudCBzaGFsbCB0aGUgYXV0aG9yIG9yIGNvbnRyaWJ1dG9ycwotICAgICAgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgaW4gYW55IHdheSBmcm9tIHRoZSB1c2Ugb2YKLSAgICAgIHRoaXMgc29mdHdhcmUuCi0KLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIERVQUwtTElDRU5TRUQuICBZb3UgbWF5IG1vZGlmeSBhbmQvb3IKLSAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQotICAgICAgZm9sbG93aW5nIHR3byBsaWNlbnNlcyAoYXQgeW91ciBvcHRpb24pOgotCi0KLSAgICAgIExJQ0VOU0UgMSAoIkJTRC1saWtlIHdpdGggYWR2ZXJ0aXNpbmcgY2xhdXNlIik6Ci0KLSAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICAgICAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZQotICAgICAgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMuCi0gICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YS0KLSAgICAgICAgIHRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAgICAgICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotCi0gICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcwotICAgICAgICAgICAgYW5kIGNvbnRyaWJ1dG9ycyBmb3IgdGhlIGJvb2ssICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlLCIKLSAgICAgICAgICAgIHB1Ymxpc2hlZCBieSBPJ1JlaWxseSBhbmQgQXNzb2NpYXRlcy4KLQotCi0gICAgICBMSUNFTlNFIDIgKEdOVSBHUEwgdjIgb3IgbGF0ZXIpOgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgICAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4gICAgIC8qIGZvciBleGl0KCkgcHJvdG90eXBlICovCi0KLSNpbmNsdWRlICJwbmcuaCIgICAgICAgIC8qIGxpYnBuZyBoZWFkZXI7IGluY2x1ZGVzIHpsaWIuaCBhbmQgc2V0am1wLmggKi8KLSNpbmNsdWRlICJyZWFkcG5nMi5oIiAgIC8qIHR5cGVkZWZzLCBjb21tb24gbWFjcm9zLCBwdWJsaWMgcHJvdG90eXBlcyAqLwotCi0KLS8qIGxvY2FsIHByb3RvdHlwZXMgKi8KLQotc3RhdGljIHZvaWQgcmVhZHBuZzJfaW5mb19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpOwotc3RhdGljIHZvaWQgcmVhZHBuZzJfcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBuZXdfcm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X251bSwgaW50IHBhc3MpOwotc3RhdGljIHZvaWQgcmVhZHBuZzJfZW5kX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cik7Ci1zdGF0aWMgdm9pZCByZWFkcG5nMl9lcnJvcl9oYW5kbGVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBtc2cpOwotCi0KLQotCi12b2lkIHJlYWRwbmcyX3ZlcnNpb25faW5mbyh2b2lkKQotewotICAgIGZwcmludGYoc3RkZXJyLCAiICAgQ29tcGlsZWQgd2l0aCBsaWJwbmcgJXM7IHVzaW5nIGxpYnBuZyAlc1xuIiwKLSAgICAgIFBOR19MSUJQTkdfVkVSX1NUUklORywgcG5nX2xpYnBuZ192ZXIpOwotCi0gICAgZnByaW50ZihzdGRlcnIsICIgICBhbmQgd2l0aCB6bGliICVzOyB1c2luZyB6bGliICVzLlxuIiwKLSAgICAgIFpMSUJfVkVSU0lPTiwgemxpYl92ZXJzaW9uKTsKLX0KLQotCi0KLQotaW50IHJlYWRwbmcyX2NoZWNrX3NpZyh1Y2ggKnNpZywgaW50IG51bSkKLXsKLSAgICByZXR1cm4gIXBuZ19zaWdfY21wKHNpZywgMCwgbnVtKTsKLX0KLQotCi0KLQotLyogcmV0dXJucyAwIGZvciBzdWNjZXNzLCAyIGZvciBsaWJwbmcgcHJvYmxlbSwgNCBmb3Igb3V0IG9mIG1lbW9yeSAqLwotCi1pbnQgcmVhZHBuZzJfaW5pdChtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIpCi17Ci0gICAgcG5nX3N0cnVjdHAgIHBuZ19wdHI7ICAgICAgIC8qIG5vdGU6ICB0ZW1wb3JhcnkgdmFyaWFibGVzISAqLwotICAgIHBuZ19pbmZvcCAgaW5mb19wdHI7Ci0KLQotICAgIC8qIGNvdWxkIGFsc28gcmVwbGFjZSBsaWJwbmcgd2FybmluZy1oYW5kbGVyIChmaW5hbCBOVUxMKSwgYnV0IG5vIG5lZWQ6ICovCi0KLSAgICBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIG1haW5wcm9nX3B0ciwKLSAgICAgIHJlYWRwbmcyX2Vycm9yX2hhbmRsZXIsIE5VTEwpOwotICAgIGlmICghcG5nX3B0cikKLSAgICAgICAgcmV0dXJuIDQ7ICAgLyogb3V0IG9mIG1lbW9yeSAqLwotCi0gICAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOwotICAgIGlmICghaW5mb19wdHIpIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsIE5VTEwsIE5VTEwpOwotICAgICAgICByZXR1cm4gNDsgICAvKiBvdXQgb2YgbWVtb3J5ICovCi0gICAgfQotCi0KLSAgICAvKiB3ZSBjb3VsZCBjcmVhdGUgYSBzZWNvbmQgaW5mbyBzdHJ1Y3QgaGVyZSAoZW5kX2luZm8pLCBidXQgaXQncyBvbmx5Ci0gICAgICogdXNlZnVsIGlmIHdlIHdhbnQgdG8ga2VlcCBwcmUtIGFuZCBwb3N0LUlEQVQgY2h1bmsgaW5mbyBzZXBhcmF0ZWQKLSAgICAgKiAobWFpbmx5IGZvciBQTkctYXdhcmUgaW1hZ2UgZWRpdG9ycyBhbmQgY29udmVydGVycykgKi8KLQotCi0gICAgLyogc2V0am1wKCkgbXVzdCBiZSBjYWxsZWQgaW4gZXZlcnkgZnVuY3Rpb24gdGhhdCBjYWxscyBhIFBORy1yZWFkaW5nCi0gICAgICogbGlicG5nIGZ1bmN0aW9uLCB1bmxlc3MgYW4gYWx0ZXJuYXRlIGVycm9yIGhhbmRsZXIgd2FzIGluc3RhbGxlZC0tCi0gICAgICogYnV0IGNvbXBhdGlibGUgZXJyb3IgaGFuZGxlcnMgbXVzdCBlaXRoZXIgdXNlIGxvbmdqbXAoKSB0aGVtc2VsdmVzCi0gICAgICogKGFzIGluIHRoaXMgcHJvZ3JhbSkgb3IgZXhpdCBpbW1lZGlhdGVseSwgc28gaGVyZSB3ZSBhcmU6ICovCi0KLSAgICBpZiAoc2V0am1wKG1haW5wcm9nX3B0ci0+am1wYnVmKSkgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0KLSNpZmRlZiBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVECi0gICAgLyogcHJlcGFyZSB0aGUgcmVhZGVyIHRvIGlnbm9yZSBhbGwgcmVjb2duaXplZCBjaHVua3Mgd2hvc2UgZGF0YSB3b24ndCBiZQotICAgICAqIHVzZWQsIGkuZS4sIGFsbCBjaHVua3MgcmVjb2duaXplZCBieSBsaWJwbmcgZXhjZXB0IGZvciBJSERSLCBQTFRFLCBJREFULAotICAgICAqIElFTkQsIHRSTlMsIGJLR0QsIGdBTUEsIGFuZCBzUkdCIChzbWFsbCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCkgKi8KLSAgICB7Ci0gICAgICAgIC8qIFRoZXNlIGJ5dGUgc3RyaW5ncyB3ZXJlIGNvcGllZCBmcm9tIHBuZy5oLiAgSWYgYSBmdXR1cmUgbGlicG5nCi0gICAgICAgICAqIHZlcnNpb24gcmVjb2duaXplcyBtb3JlIGNodW5rcywgYWRkIHRoZW0gdG8gdGhpcyBsaXN0LiAgSWYgYQotICAgICAgICAgKiBmdXR1cmUgdmVyc2lvbiBvZiByZWFkcG5nMi5jIHJlY29nbml6ZXMgbW9yZSBjaHVua3MsIGRlbGV0ZSB0aGVtCi0gICAgICAgICAqIGZyb20gdGhpcyBsaXN0LiAqLwotICAgICAgICBzdGF0aWMgLyogY29uc3QgKi8gcG5nX2J5dGUgY2h1bmtzX3RvX2lnbm9yZVtdID0gewotICAgICAgICAgICAgIDk5LCAgNzIsICA4MiwgIDc3LCAnXDAnLCAgLyogY0hSTSAqLwotICAgICAgICAgICAgMTA0LCAgNzMsICA4MywgIDg0LCAnXDAnLCAgLyogaElTVCAqLwotICAgICAgICAgICAgMTA1LCAgNjcsICA2NywgIDgwLCAnXDAnLCAgLyogaUNDUCAqLwotICAgICAgICAgICAgMTA1LCAgODQsICA4OCwgMTE2LCAnXDAnLCAgLyogaVRYdCAqLwotICAgICAgICAgICAgMTExLCAgNzAsICA3MCwgMTE1LCAnXDAnLCAgLyogb0ZGcyAqLwotICAgICAgICAgICAgMTEyLCAgNjcsICA2NSwgIDc2LCAnXDAnLCAgLyogcENBTCAqLwotICAgICAgICAgICAgMTEyLCAgNzIsICA4OSwgMTE1LCAnXDAnLCAgLyogcEhZcyAqLwotICAgICAgICAgICAgMTE1LCAgNjYsICA3MywgIDg0LCAnXDAnLCAgLyogc0JJVCAqLwotICAgICAgICAgICAgMTE1LCAgNjcsICA2NSwgIDc2LCAnXDAnLCAgLyogc0NBTCAqLwotICAgICAgICAgICAgMTE1LCAgODAsICA3NiwgIDg0LCAnXDAnLCAgLyogc1BMVCAqLwotICAgICAgICAgICAgMTE1LCAgODQsICA2OSwgIDgyLCAnXDAnLCAgLyogc1RFUiAqLwotICAgICAgICAgICAgMTE2LCAgNjksICA4OCwgMTE2LCAnXDAnLCAgLyogdEVYdCAqLwotICAgICAgICAgICAgMTE2LCAgNzMsICA3NywgIDY5LCAnXDAnLCAgLyogdElNRSAqLwotICAgICAgICAgICAgMTIyLCAgODQsICA4OCwgMTE2LCAnXDAnICAgLyogelRYdCAqLwotICAgICAgICB9OwotCi0gICAgICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhwbmdfcHRyLCAxIC8qIFBOR19IQU5ETEVfQ0hVTktfTkVWRVIgKi8sCi0gICAgICAgICAgY2h1bmtzX3RvX2lnbm9yZSwgc2l6ZW9mKGNodW5rc190b19pZ25vcmUpLzUpOwotICAgIH0KLSNlbmRpZiAvKiBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVEICovCi0KLQotICAgIC8qIGluc3RlYWQgb2YgZG9pbmcgcG5nX2luaXRfaW8oKSBoZXJlLCBub3cgd2Ugc2V0IHVwIG91ciBjYWxsYmFjawotICAgICAqIGZ1bmN0aW9ucyBmb3IgcHJvZ3Jlc3NpdmUgZGVjb2RpbmcgKi8KLQotICAgIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbihwbmdfcHRyLCBtYWlucHJvZ19wdHIsCi0gICAgICByZWFkcG5nMl9pbmZvX2NhbGxiYWNrLCByZWFkcG5nMl9yb3dfY2FsbGJhY2ssIHJlYWRwbmcyX2VuZF9jYWxsYmFjayk7Ci0KLQotICAgIC8qIG1ha2Ugc3VyZSB3ZSBzYXZlIG91ciBwb2ludGVycyBmb3IgdXNlIGluIHJlYWRwbmcyX2RlY29kZV9kYXRhKCkgKi8KLQotICAgIG1haW5wcm9nX3B0ci0+cG5nX3B0ciA9IHBuZ19wdHI7Ci0gICAgbWFpbnByb2dfcHRyLT5pbmZvX3B0ciA9IGluZm9fcHRyOwotCi0KLSAgICAvKiBhbmQgdGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpbml0aWFsaXphdGlvbiAqLwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLS8qIHJldHVybnMgMCBmb3Igc3VjY2VzcywgMiBmb3IgbGlicG5nIChsb25nam1wKSBwcm9ibGVtICovCi0KLWludCByZWFkcG5nMl9kZWNvZGVfZGF0YShtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIsIHVjaCAqcmF3YnVmLCB1bGcgbGVuZ3RoKQotewotICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSAocG5nX3N0cnVjdHApbWFpbnByb2dfcHRyLT5wbmdfcHRyOwotICAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IChwbmdfaW5mb3ApbWFpbnByb2dfcHRyLT5pbmZvX3B0cjsKLQotCi0gICAgLyogc2V0am1wKCkgbXVzdCBiZSBjYWxsZWQgaW4gZXZlcnkgZnVuY3Rpb24gdGhhdCBjYWxscyBhIFBORy1yZWFkaW5nCi0gICAgICogbGlicG5nIGZ1bmN0aW9uICovCi0KLSAgICBpZiAoc2V0am1wKG1haW5wcm9nX3B0ci0+am1wYnVmKSkgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLSAgICAgICAgbWFpbnByb2dfcHRyLT5wbmdfcHRyID0gTlVMTDsKLSAgICAgICAgbWFpbnByb2dfcHRyLT5pbmZvX3B0ciA9IE5VTEw7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotCi0gICAgLyogaGFuZCBvZmYgdGhlIG5leHQgY2h1bmsgb2YgaW5wdXQgZGF0YSB0byBsaWJwbmcgZm9yIGRlY29kaW5nICovCi0KLSAgICBwbmdfcHJvY2Vzc19kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCByYXdidWYsIGxlbmd0aCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLQotc3RhdGljIHZvaWQgcmVhZHBuZzJfaW5mb19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICAgbWFpbnByb2dfaW5mbyAgKm1haW5wcm9nX3B0cjsKLSAgICBpbnQgIGNvbG9yX3R5cGUsIGJpdF9kZXB0aDsKLSAgICBwbmdfdWludF8zMiB3aWR0aCwgaGVpZ2h0OwotICAgIGRvdWJsZSAgZ2FtbWE7Ci0KLQotICAgIC8qIHNldGptcCgpIGRvZXNuJ3QgbWFrZSBzZW5zZSBoZXJlLCBiZWNhdXNlIHdlJ2QgZWl0aGVyIGhhdmUgdG8gZXhpdCgpLAotICAgICAqIGxvbmdqbXAoKSBvdXJzZWx2ZXMsIG9yIHJldHVybiBjb250cm9sIHRvIGxpYnBuZywgd2hpY2ggZG9lc24ndCB3YW50Ci0gICAgICogdG8gc2VlIHVzIGFnYWluLiAgQnkgbm90IGRvaW5nIGFueXRoaW5nIGhlcmUsIGxpYnBuZyB3aWxsIGluc3RlYWQganVtcAotICAgICAqIHRvIHJlYWRwbmcyX2RlY29kZV9kYXRhKCksIHdoaWNoIGNhbiByZXR1cm4gYW4gZXJyb3IgdmFsdWUgdG8gdGhlIG1haW4KLSAgICAgKiBwcm9ncmFtLiAqLwotCi0KLSAgICAvKiByZXRyaWV2ZSB0aGUgcG9pbnRlciB0byBvdXIgc3BlY2lhbC1wdXJwb3NlIHN0cnVjdCwgdXNpbmcgdGhlIHBuZ19wdHIKLSAgICAgKiB0aGF0IGxpYnBuZyBwYXNzZWQgYmFjayB0byB1cyAoaS5lLiwgbm90IGEgZ2xvYmFsIHRoaXMgdGltZS0tdGhlcmUncwotICAgICAqIG5vIHJlYWwgZGlmZmVyZW5jZSBmb3IgYSBzaW5nbGUgaW1hZ2UsIGJ1dCBmb3IgYSBtdWx0aXRocmVhZGVkIGJyb3dzZXIKLSAgICAgKiBkZWNvZGluZyBzZXZlcmFsIFBORyBpbWFnZXMgYXQgdGhlIHNhbWUgdGltZSwgb25lIG5lZWRzIHRvIGF2b2lkIG1peGluZwotICAgICAqIHVwIGRpZmZlcmVudCBpbWFnZXMnIHN0cnVjdHMpICovCi0KLSAgICBtYWlucHJvZ19wdHIgPSBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmdfcHRyKTsKLQotICAgIGlmIChtYWlucHJvZ19wdHIgPT0gTlVMTCkgeyAgICAgICAgIC8qIHdlIGJlIGhvc2VkICovCi0gICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICJyZWFkcG5nMiBlcnJvcjogIG1haW4gc3RydWN0IG5vdCByZWNvdmVyYWJsZSBpbiBpbmZvX2NhbGxiYWNrLlxuIik7Ci0gICAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgICAgICByZXR1cm47Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHdlIGNvdWxkIGNhbGwgb3VyIGVycm9yLWhhbmRsZXIganVzdCBsaWtlIGxpYnBuZwotICAgICAgICAgKiBkb2VzLCB3aGljaCB3b3VsZCBlZmZlY3RpdmVseSB0ZXJtaW5hdGUgdGhlIHByb2dyYW0uICBTaW5jZSB0aGlzCi0gICAgICAgICAqIGNhbiBvbmx5IGhhcHBlbiBpZiBwbmdfcHRyIGdldHMgcmVkaXJlY3RlZCBzb21ld2hlcmUgb2RkIG9yIHRoZQotICAgICAgICAgKiBtYWluIFBORyBzdHJ1Y3QgZ2V0cyB3aXBlZCwgd2UncmUgcHJvYmFibHkgdG9hc3QgYW55d2F5LiAgKElmCi0gICAgICAgICAqIHBuZ19wdHIgaXRzZWxmIGlzIE5VTEwsIHdlIHdvdWxkIG5vdCBoYXZlIGJlZW4gY2FsbGVkLikKLSAgICAgICAgICovCi0gICAgfQotCi0KLSAgICAvKiB0aGlzIGlzIGp1c3QgbGlrZSBpbiB0aGUgbm9uLXByb2dyZXNzaXZlIGNhc2UgKi8KLQotICAgIHBuZ19nZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgJndpZHRoLCAmaGVpZ2h0LCAmYml0X2RlcHRoLCAmY29sb3JfdHlwZSwKLSAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgICBtYWlucHJvZ19wdHItPndpZHRoID0gKHVsZyl3aWR0aDsKLSAgICBtYWlucHJvZ19wdHItPmhlaWdodCA9ICh1bGcpaGVpZ2h0OwotCi0KLSAgICAvKiBzaW5jZSB3ZSBrbm93IHdlJ3ZlIHJlYWQgYWxsIG9mIHRoZSBQTkcgZmlsZSdzICJoZWFkZXIiIChpLmUuLCB1cAotICAgICAqIHRvIElEQVQpLCB3ZSBjYW4gY2hlY2sgZm9yIGEgYmFja2dyb3VuZCBjb2xvciBoZXJlICovCi0KLSAgICBpZiAobWFpbnByb2dfcHRyLT5uZWVkX2JnY29sb3IgJiYKLSAgICAgICAgcG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fYktHRCkpCi0gICAgewotICAgICAgICBwbmdfY29sb3JfMTZwIHBCYWNrZ3JvdW5kOwotCi0gICAgICAgIC8qIGl0IGlzIG5vdCBvYnZpb3VzIGZyb20gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCBidXQgdGhpcyBmdW5jdGlvbgotICAgICAgICAgKiB0YWtlcyBhIHBvaW50ZXIgdG8gYSBwb2ludGVyLCBhbmQgaXQgYWx3YXlzIHJldHVybnMgdmFsaWQgcmVkLAotICAgICAgICAgKiBncmVlbiBhbmQgYmx1ZSB2YWx1ZXMsIHJlZ2FyZGxlc3Mgb2YgY29sb3JfdHlwZTogKi8KLSAgICAgICAgcG5nX2dldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCAmcEJhY2tncm91bmQpOwotCi0gICAgICAgIC8qIGhvd2V2ZXIsIGl0IGFsd2F5cyByZXR1cm5zIHRoZSByYXcgYktHRCBkYXRhLCByZWdhcmRsZXNzIG9mIGFueQotICAgICAgICAgKiBiaXQtZGVwdGggdHJhbnNmb3JtYXRpb25zLCBzbyBjaGVjayBkZXB0aCBhbmQgYWRqdXN0IGlmIG5lY2Vzc2FyeSAqLwotICAgICAgICBpZiAoYml0X2RlcHRoID09IDE2KSB7Ci0gICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX3JlZCAgID0gcEJhY2tncm91bmQtPnJlZCAgID4+IDg7Ci0gICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX2dyZWVuID0gcEJhY2tncm91bmQtPmdyZWVuID4+IDg7Ci0gICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX2JsdWUgID0gcEJhY2tncm91bmQtPmJsdWUgID4+IDg7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmIGJpdF9kZXB0aCA8IDgpIHsKLSAgICAgICAgICAgIGlmIChiaXRfZGVwdGggPT0gMSkKLSAgICAgICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX3JlZCA9IG1haW5wcm9nX3B0ci0+YmdfZ3JlZW4gPQotICAgICAgICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19ibHVlID0gcEJhY2tncm91bmQtPmdyYXk/IDI1NSA6IDA7Ci0gICAgICAgICAgICBlbHNlIGlmIChiaXRfZGVwdGggPT0gMikKLSAgICAgICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX3JlZCA9IG1haW5wcm9nX3B0ci0+YmdfZ3JlZW4gPQotICAgICAgICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19ibHVlID0gKDI1NS8zKSAqIHBCYWNrZ3JvdW5kLT5ncmF5OwotICAgICAgICAgICAgZWxzZSAvKiBiaXRfZGVwdGggPT0gNCAqLwotICAgICAgICAgICAgICAgIG1haW5wcm9nX3B0ci0+YmdfcmVkID0gbWFpbnByb2dfcHRyLT5iZ19ncmVlbiA9Ci0gICAgICAgICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX2JsdWUgPSAoMjU1LzE1KSAqIHBCYWNrZ3JvdW5kLT5ncmF5OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19yZWQgICA9ICh1Y2gpcEJhY2tncm91bmQtPnJlZDsKLSAgICAgICAgICAgIG1haW5wcm9nX3B0ci0+YmdfZ3JlZW4gPSAodWNoKXBCYWNrZ3JvdW5kLT5ncmVlbjsKLSAgICAgICAgICAgIG1haW5wcm9nX3B0ci0+YmdfYmx1ZSAgPSAodWNoKXBCYWNrZ3JvdW5kLT5ibHVlOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKiBhcyBiZWZvcmUsIGxldCBsaWJwbmcgZXhwYW5kIHBhbGV0dGUgaW1hZ2VzIHRvIFJHQiwgbG93LWJpdC1kZXB0aAotICAgICAqIGdyYXlzY2FsZSBpbWFnZXMgdG8gOCBiaXRzLCB0cmFuc3BhcmVuY3kgY2h1bmtzIHRvIGZ1bGwgYWxwaGEgY2hhbm5lbDsKLSAgICAgKiBzdHJpcCAxNi1iaXQtcGVyLXNhbXBsZSBpbWFnZXMgdG8gOCBiaXRzIHBlciBzYW1wbGU7IGFuZCBjb252ZXJ0Ci0gICAgICogZ3JheXNjYWxlIHRvIFJHQltBXSAqLwotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgICAgcG5nX3NldF9leHBhbmQocG5nX3B0cik7Ci0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJiBiaXRfZGVwdGggPCA4KQotICAgICAgICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsKLSAgICBpZiAocG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fdFJOUykpCi0gICAgICAgIHBuZ19zZXRfZXhwYW5kKHBuZ19wdHIpOwotICAgIGlmIChiaXRfZGVwdGggPT0gMTYpCi0gICAgICAgIHBuZ19zZXRfc3RyaXBfMTYocG5nX3B0cik7Ci0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSB8fAotICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgICAgIHBuZ19zZXRfZ3JheV90b19yZ2IocG5nX3B0cik7Ci0KLQotICAgIC8qIFVubGlrZSB0aGUgYmFzaWMgdmlld2VyLCB3aGljaCB3YXMgZGVzaWduZWQgdG8gb3BlcmF0ZSBvbiBsb2NhbCBmaWxlcywKLSAgICAgKiB0aGlzIHByb2dyYW0gaXMgaW50ZW5kZWQgdG8gc2ltdWxhdGUgYSB3ZWIgYnJvd3Nlci0tZXZlbiB0aG91Z2ggd2UKLSAgICAgKiBhY3R1YWxseSByZWFkIGZyb20gYSBsb2NhbCBmaWxlLCB0b28uICBCdXQgYmVjYXVzZSB3ZSBhcmUgcHJldGVuZGluZwotICAgICAqIHRoYXQgbW9zdCBvZiB0aGUgaW1hZ2VzIG9yaWdpbmF0ZSBvbiB0aGUgSW50ZXJuZXQsIHdlIGZvbGxvdyB0aGUgcmVjb20tCi0gICAgICogbWVuZGF0aW9uIG9mIHRoZSBzUkdCIHByb3Bvc2FsIGFuZCB0cmVhdCB1bmxhYmVsbGVkIGltYWdlcyAobm8gZ0FNQQotICAgICAqIGNodW5rKSBhcyBleGlzdGluZyBpbiB0aGUgc1JHQiBjb2xvciBzcGFjZS4gIFRoYXQgaXMsIHdlIGFzc3VtZSB0aGF0Ci0gICAgICogc3VjaCBpbWFnZXMgaGF2ZSBhIGZpbGUgZ2FtbWEgb2YgMC40NTQ1NSwgd2hpY2ggY29ycmVzcG9uZHMgdG8gYSBQQy1saWtlCi0gICAgICogZGlzcGxheSBzeXN0ZW0uICBUaGlzIGNoYW5nZSBpbiBhc3N1bXB0aW9ucyB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uIGEKLSAgICAgKiBQQy1saWtlIHN5c3RlbSwgYnV0IG9uIGEgTWFjLCBTR0ksIE5lWFQgb3Igb3RoZXIgc3lzdGVtIHdpdGggYSBub24tCi0gICAgICogaWRlbnRpdHkgbG9va3VwIHRhYmxlLCBpdCB3aWxsIGRhcmtlbiB1bmxhYmVsbGVkIGltYWdlcywgd2hpY2ggZWZmZWMtCi0gICAgICogdGl2ZWx5IGZhdm9ycyBpbWFnZXMgZnJvbSBQQy1saWtlIHN5c3RlbXMgb3ZlciB0aG9zZSBvcmlnaW5hdGluZyBvbgotICAgICAqIHRoZSBsb2NhbCBwbGF0Zm9ybS4gIE5vdGUgdGhhdCBtYWlucHJvZ19wdHItPmRpc3BsYXlfZXhwb25lbnQgaXMgdGhlCi0gICAgICogImdhbW1hIiB2YWx1ZSBmb3IgdGhlIGVudGlyZSBkaXNwbGF5IHN5c3RlbSwgaS5lLiwgdGhlIHByb2R1Y3Qgb2YKLSAgICAgKiBMVVRfZXhwb25lbnQgYW5kIENSVF9leHBvbmVudC4gKi8KLQotICAgIGlmIChwbmdfZ2V0X2dBTUEocG5nX3B0ciwgaW5mb19wdHIsICZnYW1tYSkpCi0gICAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgbWFpbnByb2dfcHRyLT5kaXNwbGF5X2V4cG9uZW50LCBnYW1tYSk7Ci0gICAgZWxzZQotICAgICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIG1haW5wcm9nX3B0ci0+ZGlzcGxheV9leHBvbmVudCwgMC40NTQ1NSk7Ci0KLQotICAgIC8qIHdlJ2xsIGxldCBsaWJwbmcgZXhwYW5kIGludGVybGFjZWQgaW1hZ2VzLCB0b28gKi8KLQotICAgIG1haW5wcm9nX3B0ci0+cGFzc2VzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7Ci0KLQotICAgIC8qIGFsbCB0cmFuc2Zvcm1hdGlvbnMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQ7IG5vdyB1cGRhdGUgaW5mb19wdHIgZGF0YSBhbmQKLSAgICAgKiB0aGVuIGdldCByb3dieXRlcyBhbmQgY2hhbm5lbHMgKi8KLQotICAgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgIG1haW5wcm9nX3B0ci0+cm93Ynl0ZXMgPSAoaW50KXBuZ19nZXRfcm93Ynl0ZXMocG5nX3B0ciwgaW5mb19wdHIpOwotICAgIG1haW5wcm9nX3B0ci0+Y2hhbm5lbHMgPSBwbmdfZ2V0X2NoYW5uZWxzKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotCi0gICAgLyogQ2FsbCB0aGUgbWFpbiBwcm9ncmFtIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGltYWdlIGJ1ZmZlciBhbmQKLSAgICAgKiBpbml0aWFsaXplIHdpbmRvd3MgYW5kIHdoYXRub3QuICAoVGhlIG9sZC1zdHlsZSBmdW5jdGlvbi1wb2ludGVyCi0gICAgICogaW52b2NhdGlvbiBpcyB1c2VkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggYSBmZXcgc3VwcG9zZWRseSBBTlNJCi0gICAgICogY29tcGlsZXJzIHRoYXQgbmV2ZXJ0aGVsZXNzIGJhcmYgb24gImZuX3B0cigpIi1zdHlsZSBzeW50YXguKSAqLwotCi0gICAgKCptYWlucHJvZ19wdHItPm1haW5wcm9nX2luaXQpKCk7Ci0KLQotICAgIC8qIGFuZCB0aGF0IHRha2VzIGNhcmUgb2YgaW5pdGlhbGl6YXRpb24gKi8KLQotICAgIHJldHVybjsKLX0KLQotCi0KLQotCi1zdGF0aWMgdm9pZCByZWFkcG5nMl9yb3dfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIG5ld19yb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X251bSwgaW50IHBhc3MpCi17Ci0gICAgbWFpbnByb2dfaW5mbyAgKm1haW5wcm9nX3B0cjsKLQotCi0gICAgLyogZmlyc3QgY2hlY2sgd2hldGhlciB0aGUgcm93IGRpZmZlcnMgZnJvbSB0aGUgcHJldmlvdXMgcGFzczsgaWYgbm90LAotICAgICAqIG5vdGhpbmcgdG8gY29tYmluZSBvciBkaXNwbGF5ICovCi0KLSAgICBpZiAoIW5ld19yb3cpCi0gICAgICAgIHJldHVybjsKLQotCi0gICAgLyogcmV0cmlldmUgdGhlIHBvaW50ZXIgdG8gb3VyIHNwZWNpYWwtcHVycG9zZSBzdHJ1Y3Qgc28gd2UgY2FuIGFjY2VzcwotICAgICAqIHRoZSBvbGQgcm93cyBhbmQgaW1hZ2UtZGlzcGxheSBjYWxsYmFjayBmdW5jdGlvbiAqLwotCi0gICAgbWFpbnByb2dfcHRyID0gcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cik7Ci0KLQotICAgIC8qIHNhdmUgdGhlIHBhc3MgbnVtYmVyIGZvciBvcHRpb25hbCB1c2UgYnkgdGhlIGZyb250IGVuZCAqLwotCi0gICAgbWFpbnByb2dfcHRyLT5wYXNzID0gcGFzczsKLQotCi0gICAgLyogaGF2ZSBsaWJwbmcgZWl0aGVyIGNvbWJpbmUgdGhlIG5ldyByb3cgZGF0YSB3aXRoIHRoZSBleGlzdGluZyByb3cgZGF0YQotICAgICAqIGZyb20gcHJldmlvdXMgcGFzc2VzIChpZiBpbnRlcmxhY2VkKSBvciBlbHNlIGp1c3QgY29weSB0aGUgbmV3IHJvdwotICAgICAqIGludG8gdGhlIG1haW4gcHJvZ3JhbSdzIGltYWdlIGJ1ZmZlciAqLwotCi0gICAgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KHBuZ19wdHIsIG1haW5wcm9nX3B0ci0+cm93X3BvaW50ZXJzW3Jvd19udW1dLAotICAgICAgbmV3X3Jvdyk7Ci0KLQotICAgIC8qIGZpbmFsbHksIGNhbGwgdGhlIGRpc3BsYXkgcm91dGluZSBpbiB0aGUgbWFpbiBwcm9ncmFtIHdpdGggdGhlIG51bWJlcgotICAgICAqIG9mIHRoZSByb3cgd2UganVzdCB1cGRhdGVkICovCi0KLSAgICAoKm1haW5wcm9nX3B0ci0+bWFpbnByb2dfZGlzcGxheV9yb3cpKHJvd19udW0pOwotCi0KLSAgICAvKiBhbmQgd2UncmUgcmVhZHkgZm9yIG1vcmUgKi8KLQotICAgIHJldHVybjsKLX0KLQotCi0KLQotCi1zdGF0aWMgdm9pZCByZWFkcG5nMl9lbmRfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotewotICAgIG1haW5wcm9nX2luZm8gICptYWlucHJvZ19wdHI7Ci0KLQotICAgIC8qIHJldHJpZXZlIHRoZSBwb2ludGVyIHRvIG91ciBzcGVjaWFsLXB1cnBvc2Ugc3RydWN0ICovCi0KLSAgICBtYWlucHJvZ19wdHIgPSBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmdfcHRyKTsKLQotCi0gICAgLyogbGV0IHRoZSBtYWluIHByb2dyYW0ga25vdyB0aGF0IGl0IHNob3VsZCBmbHVzaCBhbnkgYnVmZmVyZWQgaW1hZ2UKLSAgICAgKiBkYXRhIHRvIHRoZSBkaXNwbGF5IG5vdyBhbmQgc2V0IGEgImRvbmUiIGZsYWcgb3Igd2hhdGV2ZXIsIGJ1dCBub3RlCi0gICAgICogdGhhdCBpdCBTSE9VTEQgTk9UIERFU1RST1kgVEhFIFBORyBTVFJVQ1RTIFlFVC0taW4gb3RoZXIgd29yZHMsIGRvCi0gICAgICogTk9UIGNhbGwgcmVhZHBuZzJfY2xlYW51cCgpIGVpdGhlciBoZXJlIG9yIGluIHRoZSBmaW5pc2hfZGlzcGxheSgpCi0gICAgICogcm91dGluZTsgd2FpdCB1bnRpbCBjb250cm9sIHJldHVybnMgdG8gdGhlIG1haW4gcHJvZ3JhbSB2aWEKLSAgICAgKiByZWFkcG5nMl9kZWNvZGVfZGF0YSgpICovCi0KLSAgICAoKm1haW5wcm9nX3B0ci0+bWFpbnByb2dfZmluaXNoX2Rpc3BsYXkpKCk7Ci0KLQotICAgIC8qIGFsbCBkb25lICovCi0KLSAgICByZXR1cm47Ci19Ci0KLQotCi0KLQotdm9pZCByZWFkcG5nMl9jbGVhbnVwKG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cikKLXsKLSAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gKHBuZ19zdHJ1Y3RwKW1haW5wcm9nX3B0ci0+cG5nX3B0cjsKLSAgICBwbmdfaW5mb3AgaW5mb19wdHIgPSAocG5nX2luZm9wKW1haW5wcm9nX3B0ci0+aW5mb19wdHI7Ci0KLSAgICBpZiAocG5nX3B0ciAmJiBpbmZvX3B0cikKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7Ci0KLSAgICBtYWlucHJvZ19wdHItPnBuZ19wdHIgPSBOVUxMOwotICAgIG1haW5wcm9nX3B0ci0+aW5mb19wdHIgPSBOVUxMOwotfQotCi0KLQotCi0KLXN0YXRpYyB2b2lkIHJlYWRwbmcyX2Vycm9yX2hhbmRsZXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1zZykKLXsKLSAgICBtYWlucHJvZ19pbmZvICAqbWFpbnByb2dfcHRyOwotCi0gICAgLyogVGhpcyBmdW5jdGlvbiwgYXNpZGUgZnJvbSB0aGUgZXh0cmEgc3RlcCBvZiByZXRyaWV2aW5nIHRoZSAiZXJyb3IKLSAgICAgKiBwb2ludGVyIiAoYmVsb3cpIGFuZCB0aGUgZmFjdCB0aGF0IGl0IGV4aXN0cyB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uCi0gICAgICogcmF0aGVyIHRoYW4gd2l0aGluIGxpYnBuZywgaXMgZXNzZW50aWFsbHkgaWRlbnRpY2FsIHRvIGxpYnBuZydzCi0gICAgICogZGVmYXVsdCBlcnJvciBoYW5kbGVyLiAgVGhlIHNlY29uZCBwb2ludCBpcyBjcml0aWNhbDogIHNpbmNlIGJvdGgKLSAgICAgKiBzZXRqbXAoKSBhbmQgbG9uZ2ptcCgpIGFyZSBjYWxsZWQgZnJvbSB0aGUgc2FtZSBjb2RlLCB0aGV5IGFyZQotICAgICAqIGd1YXJhbnRlZWQgdG8gaGF2ZSBjb21wYXRpYmxlIG5vdGlvbnMgb2YgaG93IGJpZyBhIGptcF9idWYgaXMsCi0gICAgICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIF9CU0RfU09VUkNFIG9yIGFueXRoaW5nIGVsc2UgaGFzIChvciBoYXMgbm90KQotICAgICAqIGJlZW4gZGVmaW5lZC4gKi8KLQotICAgIGZwcmludGYoc3RkZXJyLCAicmVhZHBuZzIgbGlicG5nIGVycm9yOiAlc1xuIiwgbXNnKTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLQotICAgIG1haW5wcm9nX3B0ciA9IHBuZ19nZXRfZXJyb3JfcHRyKHBuZ19wdHIpOwotICAgIGlmIChtYWlucHJvZ19wdHIgPT0gTlVMTCkgeyAgICAgICAgIC8qIHdlIGFyZSBjb21wbGV0ZWx5IGhvc2VkIG5vdyAqLwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAicmVhZHBuZzIgc2V2ZXJlIGVycm9yOiAgam1wYnVmIG5vdCByZWNvdmVyYWJsZTsgdGVybWluYXRpbmcuXG4iKTsKLSAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgICAgIGV4aXQoOTkpOwotICAgIH0KLQotICAgIGxvbmdqbXAobWFpbnByb2dfcHRyLT5qbXBidWYsIDEpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JlYWRwbmcyLmggYi9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIzNjYwZC4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBycG5nMiAtIHByb2dyZXNzaXZlLW1vZGVsIFBORyBkaXNwbGF5IHByb2dyYW0gICAgICAgICAgICAgICAgIHJlYWRwbmcyLmgKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDggR3JlZyBSb2Vsb2ZzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMsIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLAotICAgICAgZXhwcmVzcyBvciBpbXBsaWVkLiAgSW4gbm8gZXZlbnQgc2hhbGwgdGhlIGF1dGhvciBvciBjb250cmlidXRvcnMKLSAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCi0gICAgICB0aGlzIHNvZnR3YXJlLgotCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCi0gICAgICByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIG9uZSBvZiB0aGUKLSAgICAgIGZvbGxvd2luZyB0d28gbGljZW5zZXMgKGF0IHlvdXIgb3B0aW9uKToKLQotCi0gICAgICBMSUNFTlNFIDEgKCJCU0QtbGlrZSB3aXRoIGFkdmVydGlzaW5nIGNsYXVzZSIpOgotCi0gICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgICAgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUKLSAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgotICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGEtCi0gICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gICAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLQotICAgICAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBHcmVnIFJvZWxvZnMKLSAgICAgICAgICAgIGFuZCBjb250cmlidXRvcnMgZm9yIHRoZSBib29rLCAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiCi0gICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCi0KLQotICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICAgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBUUlVFCi0jICBkZWZpbmUgVFJVRSAxCi0jICBkZWZpbmUgRkFMU0UgMAotI2VuZGlmCi0KLSNpZm5kZWYgTUFYCi0jICBkZWZpbmUgTUFYKGEsYikgICgoYSkgPiAoYik/IChhKSA6IChiKSkKLSMgIGRlZmluZSBNSU4oYSxiKSAgKChhKSA8IChiKT8gKGEpIDogKGIpKQotI2VuZGlmCi0KLSNpZmRlZiBERUJVRwotIyAgZGVmaW5lIFRyYWNlKHgpICB7ZnByaW50ZiB4IDsgZmZsdXNoKHN0ZGVycik7IGZmbHVzaChzdGRvdXQpO30KLSNlbHNlCi0jICBkZWZpbmUgVHJhY2UoeCkgIDsKLSNlbmRpZgotCi1lbnVtIHJwbmcyX3N0YXRlcyB7Ci0gICAga1ByZUluaXQgPSAwLAotICAgIGtXaW5kb3dJbml0LAotICAgIGtEb25lCi19OwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1Y2g7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1c2g7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICB1bGc7Ci0KLXR5cGVkZWYgc3RydWN0IF9tYWlucHJvZ19pbmZvIHsKLSAgICBkb3VibGUgZGlzcGxheV9leHBvbmVudDsKLSAgICB1bGcgd2lkdGg7Ci0gICAgdWxnIGhlaWdodDsKLSAgICB2b2lkICpwbmdfcHRyOwotICAgIHZvaWQgKmluZm9fcHRyOwotICAgIHZvaWQgKCptYWlucHJvZ19pbml0KSh2b2lkKTsKLSAgICB2b2lkICgqbWFpbnByb2dfZGlzcGxheV9yb3cpKHVsZyByb3dfbnVtKTsKLSAgICB2b2lkICgqbWFpbnByb2dfZmluaXNoX2Rpc3BsYXkpKHZvaWQpOwotICAgIHVjaCAqaW1hZ2VfZGF0YTsKLSAgICB1Y2ggKipyb3dfcG9pbnRlcnM7Ci0gICAgam1wX2J1ZiBqbXBidWY7Ci0gICAgaW50IHBhc3NlczsgICAgICAgICAgICAgIC8qIG5vdCB1c2VkICovCi0gICAgaW50IHBhc3M7Ci0gICAgaW50IHJvd2J5dGVzOwotICAgIGludCBjaGFubmVsczsKLSAgICBpbnQgbmVlZF9iZ2NvbG9yOwotICAgIGludCBzdGF0ZTsKLSAgICB1Y2ggYmdfcmVkOwotICAgIHVjaCBiZ19ncmVlbjsKLSAgICB1Y2ggYmdfYmx1ZTsKLX0gbWFpbnByb2dfaW5mbzsKLQotCi0vKiBwcm90b3R5cGVzIGZvciBwdWJsaWMgZnVuY3Rpb25zIGluIHJlYWRwbmcyLmMgKi8KLQotdm9pZCByZWFkcG5nMl92ZXJzaW9uX2luZm8odm9pZCk7Ci0KLWludCByZWFkcG5nMl9jaGVja19zaWcodWNoICpzaWcsIGludCBudW0pOwotCi1pbnQgcmVhZHBuZzJfaW5pdChtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIpOwotCi1pbnQgcmVhZHBuZzJfZGVjb2RlX2RhdGEobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyLCB1Y2ggKnJhd2J1ZiwgdWxnIGxlbmd0aCk7Ci0KLXZvaWQgcmVhZHBuZzJfY2xlYW51cChtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIpOwpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JlYWRwcG0uYyBiL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9yZWFkcHBtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOWE1NmQuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JlYWRwcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBycG5nIC0gc2ltcGxlIFBORyBkaXNwbGF5IHByb2dyYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkcHBtLmMKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgVGhpcyBpcyBhIHNwZWNpYWwtcHVycG9zZSByZXBsYWNlbWVudCBmb3IgcmVhZHBuZy5jIHRoYXQgYWxsb3dzIGJpbmFyeQotICAgUFBNIGZpbGVzIHRvIGJlIHVzZWQgaW4gcGxhY2Ugb2YgUE5HIGltYWdlcy4KLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDcgR3JlZyBSb2Vsb2ZzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMsIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLAotICAgICAgZXhwcmVzcyBvciBpbXBsaWVkLiAgSW4gbm8gZXZlbnQgc2hhbGwgdGhlIGF1dGhvciBvciBjb250cmlidXRvcnMKLSAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCi0gICAgICB0aGlzIHNvZnR3YXJlLgotCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCi0gICAgICByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIG9uZSBvZiB0aGUKLSAgICAgIGZvbGxvd2luZyB0d28gbGljZW5zZXMgKGF0IHlvdXIgb3B0aW9uKToKLQotCi0gICAgICBMSUNFTlNFIDEgKCJCU0QtbGlrZSB3aXRoIGFkdmVydGlzaW5nIGNsYXVzZSIpOgotCi0gICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgICAgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUKLSAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgotICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGEtCi0gICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gICAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLQotICAgICAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBHcmVnIFJvZWxvZnMKLSAgICAgICAgICAgIGFuZCBjb250cmlidXRvcnMgZm9yIHRoZSBib29rLCAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiCi0gICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCi0KLQotICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICAgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJyZWFkcG5nLmgiICAgIC8qIHR5cGVkZWZzLCBjb21tb24gbWFjcm9zLCBwdWJsaWMgcHJvdG90eXBlcyAqLwotCi0KLXVsZyAgd2lkdGgsIGhlaWdodDsKLWludCAgYml0X2RlcHRoLCBjb2xvcl90eXBlLCBjaGFubmVsczsKLXVjaCAgKmltYWdlX2RhdGEgPSBOVUxMOwotRklMRSAqc2F2ZWRfaW5maWxlOwotCi0KLXZvaWQgcmVhZHBuZ192ZXJzaW9uX2luZm8oKQotewotICAgIGZwcmludGYoc3RkZXJyLCAiICAgQ29tcGlsZWQgd2l0aG91dCBsaWJwbmcsIHpsaWIgb3IgUEJNUExVUy9OZXRQQk0uXG4iKTsKLX0KLQotCi0vKiByZXR1cm4gdmFsdWUgPSAwIGZvciBzdWNjZXNzLCAxIGZvciBiYWQgc2lnLCAyIGZvciBiYWQgSUhEUiwgNCBmb3Igbm8gbWVtICovCi0KLWludCByZWFkcG5nX2luaXQoRklMRSAqaW5maWxlLCB1bGcgKnBXaWR0aCwgdWxnICpwSGVpZ2h0KQotewotICAgIHN0YXRpYyB1Y2ggcHBtbGluZVsyNTZdOwotICAgIGludCBtYXh2YWw7Ci0KLQotICAgIHNhdmVkX2luZmlsZSA9IGluZmlsZTsKLQotICAgIGZnZXRzKHBwbWxpbmUsIDI1NiwgaW5maWxlKTsKLSAgICBpZiAocHBtbGluZVswXSAhPSAnUCcgfHwgcHBtbGluZVsxXSAhPSAnNicpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogIG5vdCBhIFBQTSBmaWxlXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIC8qIHBvc3NpYmxlIGNvbG9yIHR5cGVzOiAgUDUgPSBncmF5c2NhbGUgKDApLCBQNiA9IFJHQiAoMiksIFA4ID0gUkdCQSAoNikgKi8KLSAgICBpZiAocHBtbGluZVsxXSA9PSAnNicpIHsKLSAgICAgICAgY29sb3JfdHlwZSA9IDI7Ci0gICAgICAgIGNoYW5uZWxzID0gMzsKLSAgICB9IGVsc2UgaWYgKHBwbWxpbmVbMV0gPT0gJzgnKSB7Ci0gICAgICAgIGNvbG9yX3R5cGUgPSA2OwotICAgICAgICBjaGFubmVscyA9IDQ7Ci0gICAgfSBlbHNlIC8qIGlmIChwcG1saW5lWzFdID09ICc1JykgKi8gewotICAgICAgICBjb2xvcl90eXBlID0gMDsKLSAgICAgICAgY2hhbm5lbHMgPSAxOwotICAgIH0KLQotICAgIGRvIHsKLSAgICAgICAgZmdldHMocHBtbGluZSwgMjU2LCBpbmZpbGUpOwotICAgIH0gd2hpbGUgKHBwbWxpbmVbMF0gPT0gJyMnKTsKLSAgICBzc2NhbmYocHBtbGluZSwgIiVsdSAlbHUiLCAmd2lkdGgsICZoZWlnaHQpOwotCi0gICAgZG8gewotICAgICAgICBmZ2V0cyhwcG1saW5lLCAyNTYsIGluZmlsZSk7Ci0gICAgfSB3aGlsZSAocHBtbGluZVswXSA9PSAnIycpOwotICAgIHNzY2FuZihwcG1saW5lLCAiJWQiLCAmbWF4dmFsKTsKLSAgICBpZiAobWF4dmFsICE9IDI1NSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiAgbWF4dmFsID0gJWRcbiIsIG1heHZhbCk7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICBiaXRfZGVwdGggPSA4OwotCi0gICAgKnBXaWR0aCA9IHdpZHRoOwotICAgICpwSGVpZ2h0ID0gaGVpZ2h0OwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLS8qIHJldHVybnMgMCBpZiBzdWNjZWVkcywgMSBpZiBmYWlscyBkdWUgdG8gbm8gYktHRCBjaHVuaywgMiBpZiBsaWJwbmcgZXJyb3I7Ci0gKiBzY2FsZXMgdmFsdWVzIHRvIDgtYml0IGlmIG5lY2Vzc2FyeSAqLwotCi1pbnQgcmVhZHBuZ19nZXRfYmdjb2xvcih1Y2ggKnJlZCwgdWNoICpncmVlbiwgdWNoICpibHVlKQotewotICAgIHJldHVybiAxOwotfQotCi0KLQotCi0vKiBkaXNwbGF5X2V4cG9uZW50ID09IExVVF9leHBvbmVudCAqIENSVF9leHBvbmVudCAqLwotCi11Y2ggKnJlYWRwbmdfZ2V0X2ltYWdlKGRvdWJsZSBkaXNwbGF5X2V4cG9uZW50LCBpbnQgKnBDaGFubmVscywgdWxnICpwUm93Ynl0ZXMpCi17Ci0gICAgdWxnICByb3dieXRlczsKLQotCi0gICAgLyogZXhwYW5kIHBhbGV0dGUgaW1hZ2VzIHRvIFJHQiwgbG93LWJpdC1kZXB0aCBncmF5c2NhbGUgaW1hZ2VzIHRvIDggYml0cywKLSAgICAgKiB0cmFuc3BhcmVuY3kgY2h1bmtzIHRvIGZ1bGwgYWxwaGEgY2hhbm5lbDsgc3RyaXAgMTYtYml0LXBlci1zYW1wbGUKLSAgICAgKiBpbWFnZXMgdG8gOCBiaXRzIHBlciBzYW1wbGU7IGFuZCBjb252ZXJ0IGdyYXlzY2FsZSB0byBSR0JbQV0gKi8KLQotICAgIC8qIEdSUiBXQVJOSU5HOiAgZ3JheXNjYWxlIG5lZWRzIHRvIGJlIGV4cGFuZGVkIGFuZCBjaGFubmVscyByZXNldCEgKi8KLQotICAgICpwUm93Ynl0ZXMgPSByb3dieXRlcyA9IGNoYW5uZWxzKndpZHRoOwotICAgICpwQ2hhbm5lbHMgPSBjaGFubmVsczsKLQotICAgIGlmICgoaW1hZ2VfZGF0YSA9ICh1Y2ggKiltYWxsb2Mocm93Ynl0ZXMqaGVpZ2h0KSkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBUcmFjZSgoc3RkZXJyLCAicmVhZHBuZ19nZXRfaW1hZ2U6ICByb3dieXRlcyA9ICVsZCwgaGVpZ2h0ID0gJWxkXG4iLCByb3dieXRlcywgaGVpZ2h0KSk7Ci0KLQotICAgIC8qIG5vdyB3ZSBjYW4gZ28gYWhlYWQgYW5kIGp1c3QgcmVhZCB0aGUgd2hvbGUgaW1hZ2UgKi8KLQotICAgIGZyZWFkKGltYWdlX2RhdGEsIDFMLCByb3dieXRlcypoZWlnaHQsIHNhdmVkX2luZmlsZSk7Ci0KLQotICAgIHJldHVybiBpbWFnZV9kYXRhOwotfQotCi0KLXZvaWQgcmVhZHBuZ19jbGVhbnVwKGludCBmcmVlX2ltYWdlX2RhdGEpCi17Ci0gICAgaWYgKGZyZWVfaW1hZ2VfZGF0YSAmJiBpbWFnZV9kYXRhKSB7Ci0gICAgICAgIGZyZWUoaW1hZ2VfZGF0YSk7Ci0gICAgICAgIGltYWdlX2RhdGEgPSBOVUxMOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9ycG5nLXdpbi5jIGIvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL3Jwbmctd2luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1M2RkYzguLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL3Jwbmctd2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgcnBuZyAtIHNpbXBsZSBQTkcgZGlzcGxheSBwcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycG5nLXdpbi5jCi0KLSAgIFRoaXMgcHJvZ3JhbSBkZWNvZGVzIGFuZCBkaXNwbGF5cyBQTkcgaW1hZ2VzLCB3aXRoIGdhbW1hIGNvcnJlY3Rpb24gYW5kCi0gICBvcHRpb25hbGx5IHdpdGggYSB1c2VyLXNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yIChpbiBjYXNlIHRoZSBpbWFnZSBoYXMKLSAgIHRyYW5zcGFyZW5jeSkuICBJdCBpcyB2ZXJ5IG5lYXJseSB0aGUgbW9zdCBiYXNpYyBQTkcgdmlld2VyIHBvc3NpYmxlLgotICAgVGhpcyB2ZXJzaW9uIGlzIGZvciAzMi1iaXQgV2luZG93czsgaXQgbWF5IGNvbXBpbGUgdW5kZXIgMTYtYml0IFdpbmRvd3MKLSAgIHdpdGggYSBsaXR0bGUgdHdlYWtpbmcgKG9yIG1heWJlIG5vdCkuCi0KLSAgIHRvIGRvOgotICAgIC0gaGFuZGxlIHF1b3RlZCBjb21tYW5kLWxpbmUgYXJncyAoZXNwZWNpYWxseSBmaWxlbmFtZXMgd2l0aCBzcGFjZXMpCi0gICAgLSBoYXZlIG1pbmltdW0gd2luZG93IHdpZHRoOiAgb2ggd2VsbAotICAgIC0gdXNlICUuMTAyM3MgdG8gc2ltcGxpZnkgdHJ1bmNhdGlvbiBvZiB0aXRsZS1iYXIgc3RyaW5nPwotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBDaGFuZ2Vsb2c6Ci0gICAgLSAxLjAwOiAgaW5pdGlhbCBwdWJsaWMgcmVsZWFzZQotICAgIC0gMS4wMTogIG1vZGlmaWVkIHRvIGFsbG93IGFiYnJldmlhdGVkIG9wdGlvbnM7IGZpeGVkIGxvbmcvdWxvbmcgbWlzLQotICAgICAgICAgICAgICBtYXRjaDsgc3dpdGNoZWQgdG8gcG5nX2ptcGJ1ZigpIG1hY3JvCi0gICAgLSAxLjAyOiAgYWRkZWQgZXh0cmEgc2V0IG9mIHBhcmVudGhlc2VzIHRvIHBuZ19qbXBidWYoKSBtYWNybzsgZml4ZWQKLSAgICAgICAgICAgICAgY29tbWFuZC1saW5lIHBhcnNpbmcgYnVnCi0gICAgLSAxLjEwOiAgZW5hYmxlZCAibWVzc2FnZSB3aW5kb3ciL2NvbnNvbGUgKHRoYW5rcyB0byBEYXZpZCBHZWxkcmVpY2gpCi0gICAgLSAyLjAwOiAgZHVhbC1saWNlbnNlZCAoYWRkZWQgR05VIEdQTCkKLSAgICAtIDIuMDE6ICBmaXhlZCBpbXByb3BlciBkaXNwbGF5IG9mIHVzYWdlIHNjcmVlbiBvbiBQTkcgZXJyb3IocykKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDggR3JlZyBSb2Vsb2ZzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMsIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLAotICAgICAgZXhwcmVzcyBvciBpbXBsaWVkLiAgSW4gbm8gZXZlbnQgc2hhbGwgdGhlIGF1dGhvciBvciBjb250cmlidXRvcnMKLSAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCi0gICAgICB0aGlzIHNvZnR3YXJlLgotCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCi0gICAgICByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIG9uZSBvZiB0aGUKLSAgICAgIGZvbGxvd2luZyB0d28gbGljZW5zZXMgKGF0IHlvdXIgb3B0aW9uKToKLQotCi0gICAgICBMSUNFTlNFIDEgKCJCU0QtbGlrZSB3aXRoIGFkdmVydGlzaW5nIGNsYXVzZSIpOgotCi0gICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgICAgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUKLSAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgotICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGEtCi0gICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gICAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLQotICAgICAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBHcmVnIFJvZWxvZnMKLSAgICAgICAgICAgIGFuZCBjb250cmlidXRvcnMgZm9yIHRoZSBib29rLCAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiCi0gICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCi0KLQotICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICAgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBQUk9HTkFNRSAgInJwbmctd2luIgotI2RlZmluZSBMT05HTkFNRSAgIlNpbXBsZSBQTkcgVmlld2VyIGZvciBXaW5kb3dzIgotI2RlZmluZSBWRVJTSU9OICAgIjIuMDEgb2YgMTYgTWFyY2ggMjAwOCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpZmRlZiBfX0NZR1dJTl9fCi0vKiBnZXRjaCByZXBsYWNlbWVudC4gVHVybnMgb3V0LCB3ZSBkb24ndCByZWFsbHkgbmVlZCB0aGlzLAotICogYnV0IGxlYXZlIGl0IGhlcmUgaWYgd2UgZXZlciBlbmFibGUgYW55IG9mIHRoZSB1c2VzIG9mCi0gKiBfZ2V0Y2ggaW4gdGhlIG1haW4gY29kZQotICovCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8dGVybWlvLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci1pbnQgcmVwbF9nZXRjaCggdm9pZCApCi17Ci0gIGNoYXIgY2g7Ci0gIGludCBmZCA9IGZpbGVubyhzdGRpbik7Ci0gIHN0cnVjdCB0ZXJtaW8gb2xkX3R0eSwgbmV3X3R0eTsKLQotICBpb2N0bChmZCwgVENHRVRBLCAmb2xkX3R0eSk7Ci0gIG5ld190dHkgPSBvbGRfdHR5OwotICBuZXdfdHR5LmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPIHwgSVNJRyk7Ci0gIGlvY3RsKGZkLCBUQ1NFVEEsICZuZXdfdHR5KTsKLSAgZnJlYWQoJmNoLCAxLCBzaXplb2YoY2gpLCBzdGRpbik7Ci0gIGlvY3RsKGZkLCBUQ1NFVEEsICZvbGRfdHR5KTsKLQotICByZXR1cm4gY2g7Ci19Ci0jZGVmaW5lIF9nZXRjaCByZXBsX2dldGNoCi0jZWxzZQotI2luY2x1ZGUgPGNvbmlvLmg+ICAgICAgLyogb25seSBmb3IgX2dldGNoKCkgKi8KLSNlbmRpZgotCi0vKiAjZGVmaW5lIERFQlVHICA6ICB0aGlzIGVuYWJsZXMgdGhlIFRyYWNlKCkgbWFjcm9zICovCi0KLSNpbmNsdWRlICJyZWFkcG5nLmgiICAgIC8qIHR5cGVkZWZzLCBjb21tb24gbWFjcm9zLCByZWFkcG5nIHByb3RvdHlwZXMgKi8KLQotCi0vKiBjb3VsZCBqdXN0IGluY2x1ZGUgcG5nLmgsIGJ1dCB0aGlzIG1hY3JvIGlzIHRoZSBvbmx5IHRoaW5nIHdlIG5lZWQKLSAqIChuYW1lIGFuZCB0eXBlZGVmcyBjaGFuZ2VkIHRvIGxvY2FsIHZlcnNpb25zKTsgbm90ZSB0aGF0IHNpZGUgZWZmZWN0cwotICogb25seSBoYXBwZW4gd2l0aCBhbHBoYSAod2hpY2ggY291bGQgZWFzaWx5IGJlIGF2b2lkZWQgd2l0aAotICogInVzaCBhY29weSA9IChhbHBoYSk7IikgKi8KLQotI2RlZmluZSBhbHBoYV9jb21wb3NpdGUoY29tcG9zaXRlLCBmZywgYWxwaGEsIGJnKSB7ICAgICAgICAgICAgICAgXAotICAgIHVzaCB0ZW1wID0gKCh1c2gpKGZnKSoodXNoKShhbHBoYSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICh1c2gpKGJnKSoodXNoKSgyNTUgLSAodXNoKShhbHBoYSkpICsgKHVzaCkxMjgpOyAgXAotICAgIChjb21wb3NpdGUpID0gKHVjaCkoKHRlbXAgKyAodGVtcCA+PiA4KSkgPj4gOCk7ICAgICAgICAgICAgICAgXAotfQotCi0KLS8qIGxvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyBpbnQgICAgICAgIHJwbmdfd2luX2NyZWF0ZV93aW5kb3coSElOU1RBTkNFIGhJbnN0LCBpbnQgc2hvd21vZGUpOwotc3RhdGljIGludCAgICAgICAgcnBuZ193aW5fZGlzcGxheV9pbWFnZSh2b2lkKTsKLXN0YXRpYyB2b2lkICAgICAgIHJwbmdfd2luX2NsZWFudXAodm9pZCk7Ci1MUkVTVUxUIENBTExCQUNLICBycG5nX3dpbl93bmRwcm9jKEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNKTsKLQotCi1zdGF0aWMgY2hhciB0aXRsZWJhclsxMDI0XTsKLXN0YXRpYyBjaGFyICpwcm9nbmFtZSA9IFBST0dOQU1FOwotc3RhdGljIGNoYXIgKmFwcG5hbWUgPSBMT05HTkFNRTsKLXN0YXRpYyBjaGFyICpmaWxlbmFtZTsKLXN0YXRpYyBGSUxFICppbmZpbGU7Ci0KLXN0YXRpYyBjaGFyICpiZ3N0cjsKLXN0YXRpYyB1Y2ggYmdfcmVkPTAsIGJnX2dyZWVuPTAsIGJnX2JsdWU9MDsKLQotc3RhdGljIGRvdWJsZSBkaXNwbGF5X2V4cG9uZW50OwotCi1zdGF0aWMgdWxnIGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQsIGltYWdlX3Jvd2J5dGVzOwotc3RhdGljIGludCBpbWFnZV9jaGFubmVsczsKLXN0YXRpYyB1Y2ggKmltYWdlX2RhdGE7Ci0KLS8qIFdpbmRvd3Mtc3BlY2lmaWMgdmFyaWFibGVzICovCi1zdGF0aWMgdWxnIHdpbWFnZV9yb3dieXRlczsKLXN0YXRpYyB1Y2ggKmRpYjsKLXN0YXRpYyB1Y2ggKndpbWFnZV9kYXRhOwotc3RhdGljIEJJVE1BUElORk9IRUFERVIgKmJtaWg7Ci0KLXN0YXRpYyBIV05EIGdsb2JhbF9od25kOwotCi0KLQotCi1pbnQgV0lOQVBJIFdpbk1haW4oSElOU1RBTkNFIGhJbnN0LCBISU5TVEFOQ0UgaFByZXZJbnN0LCBQU1RSIGNtZCwgaW50IHNob3dtb2RlKQotewotICAgIGNoYXIgKmFyZ3NbMTAyNF07ICAgICAgICAgICAgICAgICAvKiBhcmJpdHJhcnkgbGltaXQsIGJ1dCBzaG91bGQgc3VmZmljZSAqLwotICAgIGNoYXIgKnAsICpxLCAqKmFyZ3YgPSBhcmdzOwotICAgIGludCBhcmdjID0gMDsKLSAgICBpbnQgcmMsIGFsZW4sIGZsZW47Ci0gICAgaW50IGVycm9yID0gMDsKLSAgICBpbnQgaGF2ZV9iZyA9IEZBTFNFOwotICAgIGRvdWJsZSBMVVRfZXhwb25lbnQ7ICAgICAgICAgICAgICAvKiBqdXN0IHRoZSBsb29rdXAgdGFibGUgKi8KLSAgICBkb3VibGUgQ1JUX2V4cG9uZW50ID0gMi4yOyAgICAgICAgLyoganVzdCB0aGUgbW9uaXRvciAqLwotICAgIGRvdWJsZSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7ICAvKiB3aG9sZSBkaXNwbGF5IHN5c3RlbSAqLwotICAgIE1TRyBtc2c7Ci0KLQotICAgIGZpbGVuYW1lID0gKGNoYXIgKilOVUxMOwotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSAgICAvKiBGaXJzdCByZWVuYWJsZSBjb25zb2xlIG91dHB1dCwgd2hpY2ggbm9ybWFsbHkgZ29lcyB0byB0aGUgYml0IGJ1Y2tldAotICAgICAqIGZvciB3aW5kb3dlZCBhcHBzLiAgQ2xvc2luZyB0aGUgY29uc29sZSB3aW5kb3cgd2lsbCB0ZXJtaW5hdGUgdGhlCi0gICAgICogYXBwLiAgVGhhbmtzIHRvIERhdmlkLkdlbGRyZWljaEByZWFsdml6LmNvbSBmb3Igc3VwcGx5aW5nIHRoZSBtYWdpY2FsCi0gICAgICogaW5jYW50YXRpb24uICovCi0KLSAgICBBbGxvY0NvbnNvbGUoKTsKLSAgICBmcmVvcGVuKCJDT05PVVQkIiwgImEiLCBzdGRlcnIpOwotICAgIGZyZW9wZW4oIkNPTk9VVCQiLCAiYSIsIHN0ZG91dCk7Ci0jZW5kaWYKLQotCi0gICAgLyogTmV4dCBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIG91ciBkaXNwbGF5LXN5c3RlbSBleHBvbmVudCwgaS5lLiwKLSAgICAgKiB0aGUgcHJvZHVjdCBvZiB0aGUgQ1JUIGV4cG9uZW50IGFuZCB0aGUgZXhwb25lbnQgY29ycmVzcG9uZGluZyB0bwotICAgICAqIHRoZSBmcmFtZS1idWZmZXIncyBsb29rdXAgdGFibGUgKExVVCksIGlmIGFueS4gIFRoaXMgaXMgbm90IGFuCi0gICAgICogZXhoYXVzdGl2ZSBsaXN0IG9mIExVVCB2YWx1ZXMgKGUuZy4sIE9wZW5TdGVwIGhhcyBhIGxvdCBvZiB3ZWlyZAotICAgICAqIG9uZXMpLCBidXQgaXQgc2hvdWxkIGNvdmVyIDk5JSBvZiB0aGUgY3VycmVudCBwb3NzaWJpbGl0aWVzLiAgQW5kCi0gICAgICogeWVzLCB0aGVzZSBpZmRlZnMgYXJlIGNvbXBsZXRlbHkgd2FzdGVkIGluIGEgV2luZG93cyBwcm9ncmFtLi4uICovCi0KLSNpZiBkZWZpbmVkKE5lWFQpCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMi4yOwotICAgIC8qCi0gICAgaWYgKHNvbWVfbmV4dF9mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm5leHRfZ2FtbWEpKQotICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBuZXh0X2dhbW1hOwotICAgICAqLwotI2VsaWYgZGVmaW5lZChzZ2kpCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMS43OwotICAgIC8qIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgZG9jdW1lbnRlZCBmdW5jdGlvbiB0byBnZXQgdGhlCi0gICAgICogImdhbW1hIiB2YWx1ZSwgc28gd2UgZG8gaXQgdGhlIGhhcmQgd2F5ICovCi0gICAgaW5maWxlID0gZm9wZW4oIi9ldGMvY29uZmlnL3N5c3RlbS5nbEdhbW1hVmFsIiwgInIiKTsKLSAgICBpZiAoaW5maWxlKSB7Ci0gICAgICAgIGRvdWJsZSBzZ2lfZ2FtbWE7Ci0KLSAgICAgICAgZmdldHModG1wbGluZSwgODAsIGluZmlsZSk7Ci0gICAgICAgIGZjbG9zZShpbmZpbGUpOwotICAgICAgICBzZ2lfZ2FtbWEgPSBhdG9mKHRtcGxpbmUpOwotICAgICAgICBpZiAoc2dpX2dhbW1hID4gMC4wKQotICAgICAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gc2dpX2dhbW1hOwotICAgIH0KLSNlbGlmIGRlZmluZWQoTWFjaW50b3NoKQotICAgIExVVF9leHBvbmVudCA9IDEuOCAvIDIuNjE7Ci0gICAgLyoKLSAgICBpZiAoc29tZV9tYWNfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZtYWNfZ2FtbWEpKQotICAgICAgICBMVVRfZXhwb25lbnQgPSBtYWNfZ2FtbWEgLyAyLjYxOwotICAgICAqLwotI2Vsc2UKLSAgICBMVVRfZXhwb25lbnQgPSAxLjA7ICAgLyogYXNzdW1lIG5vIExVVDogIG1vc3QgUENzICovCi0jZW5kaWYKLQotICAgIC8qIHRoZSBkZWZhdWx0cyBhYm92ZSBnaXZlIDEuMCwgMS4zLCAxLjUgYW5kIDIuMiwgcmVzcGVjdGl2ZWx5OiAqLwotICAgIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCA9IExVVF9leHBvbmVudCAqIENSVF9leHBvbmVudDsKLQotCi0gICAgLyogSWYgdGhlIHVzZXIgaGFzIHNldCB0aGUgU0NSRUVOX0dBTU1BIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIHN1Z2dlc3RlZAotICAgICAqIChzb21ld2hhdCBpbXByZWNpc2VseSkgaW4gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCB1c2UgdGhhdDsgb3RoZXJ3aXNlCi0gICAgICogdXNlIHRoZSBkZWZhdWx0IHZhbHVlIHdlIGp1c3QgY2FsY3VsYXRlZC4gIEVpdGhlciB3YXksIHRoZSB1c2VyIG1heQotICAgICAqIG92ZXJyaWRlIHRoaXMgdmlhIGEgY29tbWFuZC1saW5lIG9wdGlvbi4gKi8KLQotICAgIGlmICgocCA9IGdldGVudigiU0NSRUVOX0dBTU1BIikpICE9IE5VTEwpCi0gICAgICAgIGRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKHApOwotICAgIGVsc2UKLSAgICAgICAgZGlzcGxheV9leHBvbmVudCA9IGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsKLQotCi0gICAgLyogV2luZG93cyByZWFsbHkgaGF0ZXMgY29tbWFuZCBsaW5lcywgc28gd2UgaGF2ZSB0byBzZXQgdXAgb3VyIG93biBhcmd2LgotICAgICAqIE5vdGUgdGhhdCB3ZSBkbyBOT1QgYm90aGVyIHdpdGggcXVvdGVkIGFyZ3VtZW50cyBoZXJlLCBzbyBkb24ndCB1c2UKLSAgICAgKiBmaWxlbmFtZXMgd2l0aCBzcGFjZXMgaW4gJ2VtISAqLwotCi0gICAgYXJndlthcmdjKytdID0gUFJPR05BTUU7Ci0gICAgcCA9IGNtZDsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmICgqcCA9PSAnICcpCi0gICAgICAgICAgICB3aGlsZSAoKisrcCA9PSAnICcpCi0gICAgICAgICAgICAgICAgOwotICAgICAgICAvKiBub3cgcCBwb2ludHMgYXQgdGhlIGZpcnN0IG5vbi1zcGFjZSBhZnRlciBzb21lIHNwYWNlcyAqLwotICAgICAgICBpZiAoKnAgPT0gJ1wwJykKLSAgICAgICAgICAgIGJyZWFrOyAgICAvKiBub3RoaW5nIGFmdGVyIHRoZSBzcGFjZXM6ICBkb25lICovCi0gICAgICAgIGFyZ3ZbYXJnYysrXSA9IHEgPSBwOwotICAgICAgICB3aGlsZSAoKnEgJiYgKnEgIT0gJyAnKQotICAgICAgICAgICAgKytxOwotICAgICAgICAvKiBub3cgcSBwb2ludHMgYXQgYSBzcGFjZSBvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKi8KLSAgICAgICAgaWYgKCpxID09ICdcMCcpCi0gICAgICAgICAgICBicmVhazsgICAgLyogbGFzdCBhcmd2IGFscmVhZHkgdGVybWluYXRlZDsgcXVpdCAqLwotICAgICAgICAqcSA9ICdcMCc7ICAgIC8qIGNoYW5nZSBzcGFjZSB0byB0ZXJtaW5hdG9yICovCi0gICAgICAgIHAgPSBxICsgMTsKLSAgICB9Ci0gICAgYXJndlthcmdjXSA9IE5VTEw7ICAgLyogdGVybWluYXRlIHRoZSBhcmd2IGFycmF5IGl0c2VsZiAqLwotCi0KLSAgICAvKiBOb3cgcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBmb3Igb3B0aW9ucyBhbmQgdGhlIFBORyBmaWxlbmFtZS4gKi8KLQotICAgIHdoaWxlICgqKythcmd2ICYmICFlcnJvcikgewotICAgICAgICBpZiAoIXN0cm5jbXAoKmFyZ3YsICItZ2FtbWEiLCAyKSkgewotICAgICAgICAgICAgaWYgKCEqKythcmd2KQotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBkaXNwbGF5X2V4cG9uZW50ID0gYXRvZigqYXJndik7Ci0gICAgICAgICAgICAgICAgaWYgKGRpc3BsYXlfZXhwb25lbnQgPD0gMC4wKQotICAgICAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWJnY29sb3IiLCAyKSkgewotICAgICAgICAgICAgaWYgKCEqKythcmd2KQotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBiZ3N0ciA9ICphcmd2OwotICAgICAgICAgICAgICAgIGlmIChzdHJsZW4oYmdzdHIpICE9IDcgfHwgYmdzdHJbMF0gIT0gJyMnKQotICAgICAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaGF2ZV9iZyA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKiphcmd2ICE9ICctJykgewotICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gKmFyZ3Y7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZ3ZbMV0pICAgLyogc2hvdWxkbid0IGJlIGFueSBtb3JlIGFyZ3MgYWZ0ZXIgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICsrZXJyb3I7ICAgLyogbm90IGV4cGVjdGluZyBhbnkgb3RoZXIgb3B0aW9ucyAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFmaWxlbmFtZSkKLSAgICAgICAgKytlcnJvcjsKLQotCi0gICAgLyogcHJpbnQgdXNhZ2Ugc2NyZWVuIGlmIGFueSBlcnJvcnMgdXAgdG8gdGhpcyBwb2ludCAqLwotCi0gICAgaWYgKGVycm9yKSB7Ci0jaWZuZGVmIF9fQ1lHV0lOX18KLSAgICAgICAgaW50IGNoOwotI2VuZGlmCi0KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiVzICVzOiAgJXNcblxuIiwgUFJPR05BTUUsIFZFUlNJT04sIGFwcG5hbWUpOwotICAgICAgICByZWFkcG5nX3ZlcnNpb25faW5mbygpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIgotICAgICAgICAgICJVc2FnZTogICVzIFstZ2FtbWEgZXhwXSBbLWJnY29sb3IgYmddIGZpbGUucG5nXG4iCi0gICAgICAgICAgIiAgICBleHAgXHR0cmFuc2Zlci1mdW5jdGlvbiBleHBvbmVudCAoYGBnYW1tYScnKSBvZiB0aGUgZGlzcGxheVxuIgotICAgICAgICAgICJcdFx0ICBzeXN0ZW0gaW4gZmxvYXRpbmctcG9pbnQgZm9ybWF0IChlLmcuLCBgYCUuMWYnJyk7IGVxdWFsXG4iCi0gICAgICAgICAgIlx0XHQgIHRvIHRoZSBwcm9kdWN0IG9mIHRoZSBsb29rdXAtdGFibGUgZXhwb25lbnQgKHZhcmllcylcbiIKLSAgICAgICAgICAiXHRcdCAgYW5kIHRoZSBDUlQgZXhwb25lbnQgKHVzdWFsbHkgMi4yKTsgbXVzdCBiZSBwb3NpdGl2ZVxuIgotICAgICAgICAgICIgICAgYmcgIFx0ZGVzaXJlZCBiYWNrZ3JvdW5kIGNvbG9yIGluIDctY2hhcmFjdGVyIGhleCBSR0IgZm9ybWF0XG4iCi0gICAgICAgICAgIlx0XHQgIChlLmcuLCBgYCNmZjc3MDAnJyBmb3Igb3JhbmdlOiAgc2FtZSBhcyBIVE1MIGNvbG9ycyk7XG4iCi0gICAgICAgICAgIlx0XHQgIHVzZWQgd2l0aCB0cmFuc3BhcmVudCBpbWFnZXNcbiIKLSAgICAgICAgICAiXG5QcmVzcyBRLCBFc2Mgb3IgbW91c2UgYnV0dG9uIDEgYWZ0ZXIgaW1hZ2UgaXMgZGlzcGxheWVkIHRvIHF1aXQuXG4iCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSAgICAgICAgICAiUHJlc3MgUSBvciBFc2MgdG8gcXVpdCB0aGlzIHVzYWdlIHNjcmVlbi5cbiIKLSNlbmRpZgotICAgICAgICAgICJcbiIsIFBST0dOQU1FLCBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQpOwotI2lmbmRlZiBfX0NZR1dJTl9fCi0gICAgICAgIGRvCi0gICAgICAgICAgICBjaCA9IF9nZXRjaCgpOwotICAgICAgICB3aGlsZSAoY2ggIT0gJ3EnICYmIGNoICE9ICdRJyAmJiBjaCAhPSAweDFCKTsKLSNlbmRpZgotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotCi0gICAgaWYgKCEoaW5maWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGNhbid0IG9wZW4gUE5HIGZpbGUgWyVzXVxuIiwgZmlsZW5hbWUpOwotICAgICAgICArK2Vycm9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICgocmMgPSByZWFkcG5nX2luaXQoaW5maWxlLCAmaW1hZ2Vfd2lkdGgsICZpbWFnZV9oZWlnaHQpKSAhPSAwKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHJjKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICAgICAiOiAgWyVzXSBpcyBub3QgYSBQTkcgZmlsZTogaW5jb3JyZWN0IHNpZ25hdHVyZVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAgICAgIjogIFslc10gaGFzIGJhZCBJSERSIChsaWJwbmcgbG9uZ2ptcClcbiIsIGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGluc3VmZmljaWVudCBtZW1vcnlcbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICAgICAiOiAgdW5rbm93biByZWFkcG5nX2luaXQoKSBlcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXJyb3IpCi0gICAgICAgICAgICBmY2xvc2UoaW5maWxlKTsKLSAgICB9Ci0KLQotICAgIGlmIChlcnJvcikgewotI2lmbmRlZiBfX0NZR1dJTl9fCi0gICAgICAgIGludCBjaDsKLSNlbmRpZgotCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgYWJvcnRpbmcuXG4iKTsKLSNpZm5kZWYgX19DWUdXSU5fXwotICAgICAgICBkbwotICAgICAgICAgICAgY2ggPSBfZ2V0Y2goKTsKLSAgICAgICAgd2hpbGUgKGNoICE9ICdxJyAmJiBjaCAhPSAnUScgJiYgY2ggIT0gMHgxQik7Ci0jZW5kaWYKLSAgICAgICAgZXhpdCgyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXMgJXM6ICAlc1xuIiwgUFJPR05BTUUsIFZFUlNJT04sIGFwcG5hbWUpOwotI2lmbmRlZiBfX0NZR1dJTl9fCi0gICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICJcbiAgIFtjb25zb2xlIHdpbmRvdzogIGNsb3NpbmcgdGhpcyB3aW5kb3cgd2lsbCB0ZXJtaW5hdGUgJXNdXG5cbiIsCi0gICAgICAgICAgUFJPR05BTUUpOwotI2VuZGlmCi0gICAgfQotCi0KLSAgICAvKiBzZXQgdGhlIHRpdGxlLWJhciBzdHJpbmcsIGJ1dCBtYWtlIHN1cmUgYnVmZmVyIGRvZXNuJ3Qgb3ZlcmZsb3cgKi8KLQotICAgIGFsZW4gPSBzdHJsZW4oYXBwbmFtZSk7Ci0gICAgZmxlbiA9IHN0cmxlbihmaWxlbmFtZSk7Ci0gICAgaWYgKGFsZW4gKyBmbGVuICsgMyA+IDEwMjMpCi0gICAgICAgIHNwcmludGYodGl0bGViYXIsICIlczogIC4uLiVzIiwgYXBwbmFtZSwgZmlsZW5hbWUrKGFsZW4rZmxlbis2LTEwMjMpKTsKLSAgICBlbHNlCi0gICAgICAgIHNwcmludGYodGl0bGViYXIsICIlczogICVzIiwgYXBwbmFtZSwgZmlsZW5hbWUpOwotCi0KLSAgICAvKiBpZiB0aGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSBhIGJhY2tncm91bmQgY29sb3Igb24gdGhlIGNvbW1hbmQgbGluZSwKLSAgICAgKiBjaGVjayBmb3Igb25lIGluIHRoZSBQTkcgZmlsZS0taWYgbm90LCB0aGUgaW5pdGlhbGl6ZWQgdmFsdWVzIG9mIDAKLSAgICAgKiAoYmxhY2spIHdpbGwgYmUgdXNlZCAqLwotCi0gICAgaWYgKGhhdmVfYmcpIHsKLSAgICAgICAgdW5zaWduZWQgciwgZywgYjsgICAvKiB0aGlzIGFwcHJvYWNoIHF1aWV0cyBjb21waWxlciB3YXJuaW5ncyAqLwotCi0gICAgICAgIHNzY2FuZihiZ3N0cisxLCAiJTJ4JTJ4JTJ4IiwgJnIsICZnLCAmYik7Ci0gICAgICAgIGJnX3JlZCAgID0gKHVjaClyOwotICAgICAgICBiZ19ncmVlbiA9ICh1Y2gpZzsKLSAgICAgICAgYmdfYmx1ZSAgPSAodWNoKWI7Ci0gICAgfSBlbHNlIGlmIChyZWFkcG5nX2dldF9iZ2NvbG9yKCZiZ19yZWQsICZiZ19ncmVlbiwgJmJnX2JsdWUpID4gMSkgewotICAgICAgICByZWFkcG5nX2NsZWFudXAoVFJVRSk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICI6ICBsaWJwbmcgZXJyb3Igd2hpbGUgY2hlY2tpbmcgZm9yIGJhY2tncm91bmQgY29sb3JcbiIpOwotICAgICAgICBleGl0KDIpOwotICAgIH0KLQotCi0gICAgLyogZG8gdGhlIGJhc2ljIFdpbmRvd3MgaW5pdGlhbGl6YXRpb24gc3R1ZmYsIG1ha2UgdGhlIHdpbmRvdyBhbmQgZmlsbCBpdAotICAgICAqIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IgKi8KLQotICAgIGlmIChycG5nX3dpbl9jcmVhdGVfd2luZG93KGhJbnN0LCBzaG93bW9kZSkpCi0gICAgICAgIGV4aXQoMik7Ci0KLQotICAgIC8qIGRlY29kZSB0aGUgaW1hZ2UsIGFsbCBhdCBvbmNlICovCi0KLSAgICBUcmFjZSgoc3RkZXJyLCAiY2FsbGluZyByZWFkcG5nX2dldF9pbWFnZSgpXG4iKSkKLSAgICBpbWFnZV9kYXRhID0gcmVhZHBuZ19nZXRfaW1hZ2UoZGlzcGxheV9leHBvbmVudCwgJmltYWdlX2NoYW5uZWxzLAotICAgICAgJmltYWdlX3Jvd2J5dGVzKTsKLSAgICBUcmFjZSgoc3RkZXJyLCAiZG9uZSB3aXRoIHJlYWRwbmdfZ2V0X2ltYWdlKClcbiIpKQotCi0KLSAgICAvKiBkb25lIHdpdGggUE5HIGZpbGUsIHNvIGNsZWFuIHVwIHRvIG1pbmltaXplIG1lbW9yeSB1c2FnZSAoYnV0IGRvIE5PVAotICAgICAqIG51a2UgaW1hZ2VfZGF0YSEpICovCi0KLSAgICByZWFkcG5nX2NsZWFudXAoRkFMU0UpOwotICAgIGZjbG9zZShpbmZpbGUpOwotCi0gICAgaWYgKCFpbWFnZV9kYXRhKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgdW5hYmxlIHRvIGRlY29kZSBQTkcgaW1hZ2VcbiIpOwotICAgICAgICBleGl0KDMpOwotICAgIH0KLQotCi0gICAgLyogZGlzcGxheSBpbWFnZSAoY29tcG9zaXRlIHdpdGggYmFja2dyb3VuZCBpZiByZXF1ZXN0ZWQpICovCi0KLSAgICBUcmFjZSgoc3RkZXJyLCAiY2FsbGluZyBycG5nX3dpbl9kaXNwbGF5X2ltYWdlKClcbiIpKQotICAgIGlmIChycG5nX3dpbl9kaXNwbGF5X2ltYWdlKCkpIHsKLSAgICAgICAgZnJlZShpbWFnZV9kYXRhKTsKLSAgICAgICAgZXhpdCg0KTsKLSAgICB9Ci0gICAgVHJhY2UoKHN0ZGVyciwgImRvbmUgd2l0aCBycG5nX3dpbl9kaXNwbGF5X2ltYWdlKClcbiIpKQotCi0KLSAgICAvKiB3YWl0IGZvciB0aGUgdXNlciB0byB0ZWxsIHVzIHdoZW4gdG8gcXVpdCAqLwotCi0gICAgcHJpbnRmKAotI2lmbmRlZiBfX0NZR1dJTl9fCi0gICAgICAiRG9uZS4gIFByZXNzIFEsIEVzYyBvciBtb3VzZSBidXR0b24gMSAod2l0aGluIGltYWdlIHdpbmRvdykgdG8gcXVpdC5cbiIKLSNlbHNlCi0gICAgICAiRG9uZS4gIFByZXNzIG1vdXNlIGJ1dHRvbiAxICh3aXRoaW4gaW1hZ2Ugd2luZG93KSB0byBxdWl0LlxuIgotI2VuZGlmCi0gICAgKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLQotICAgIHdoaWxlIChHZXRNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDApKSB7Ci0gICAgICAgIFRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7Ci0gICAgICAgIERpc3BhdGNoTWVzc2FnZSgmbXNnKTsKLSAgICB9Ci0KLQotICAgIC8qIE9LLCB3ZSdyZSBkb25lOiAgY2xlYW4gdXAgYWxsIGltYWdlIGFuZCBXaW5kb3dzIHJlc291cmNlcyBhbmQgZ28gYXdheSAqLwotCi0gICAgcnBuZ193aW5fY2xlYW51cCgpOwotCi0gICAgcmV0dXJuIG1zZy53UGFyYW07Ci19Ci0KLQotCi0KLQotc3RhdGljIGludCBycG5nX3dpbl9jcmVhdGVfd2luZG93KEhJTlNUQU5DRSBoSW5zdCwgaW50IHNob3dtb2RlKQotewotICAgIHVjaCAqZGVzdDsKLSAgICBpbnQgZXh0cmFfd2lkdGgsIGV4dHJhX2hlaWdodDsKLSAgICB1bGcgaSwgajsKLSAgICBXTkRDTEFTU0VYIHduZGNsYXNzOwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZGlzcGxheS1zcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBpbWFnZSAocm91bmQgdXAKLSAgICB0byBtdWx0aXBsZSBvZiA0IGZvciBXaW5kb3dzIERJQikuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICB3aW1hZ2Vfcm93Ynl0ZXMgPSAoKDMqaW1hZ2Vfd2lkdGggKyAzTCkgPj4gMikgPDwgMjsKLQotICAgIGlmICghKGRpYiA9ICh1Y2ggKiltYWxsb2Moc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbWFnZV9yb3dieXRlcyppbWFnZV9oZWlnaHQpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiA0OyAgIC8qIGZhaWwgKi8KLSAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgSW5pdGlhbGl6ZSB0aGUgRElCLiAgTmVnYXRpdmUgaGVpZ2h0IG1lYW5zIHRvIHVzZSB0b3AtZG93biBCTVAgb3JkZXJpbmcKLSAgICAobXVzdCBiZSB1bmNvbXByZXNzZWQsIGJ1dCB0aGF0J3Mgd2hhdCB3ZSB3YW50KS4gIEJpdCBjb3VudCBvZiAxLCA0IG9yIDgKLSAgICBpbXBsaWVzIGEgY29sb3JtYXAgb2YgUkdCWCBxdWFkcywgYnV0IDI0LWJpdCBCTVBzIGp1c3QgdXNlIEIsRyxSIHZhbHVlcwotICAgIGRpcmVjdGx5ID0+IHdpbWFnZV9kYXRhIGJlZ2lucyBpbW1lZGlhdGVseSBhZnRlciBCTVAgaGVhZGVyLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgbWVtc2V0KGRpYiwgMCwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKTsKLSAgICBibWloID0gKEJJVE1BUElORk9IRUFERVIgKilkaWI7Ci0gICAgYm1paC0+YmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotICAgIGJtaWgtPmJpV2lkdGggPSBpbWFnZV93aWR0aDsKLSAgICBibWloLT5iaUhlaWdodCA9IC0oKGxvbmcpaW1hZ2VfaGVpZ2h0KTsKLSAgICBibWloLT5iaVBsYW5lcyA9IDE7Ci0gICAgYm1paC0+YmlCaXRDb3VudCA9IDI0OwotICAgIGJtaWgtPmJpQ29tcHJlc3Npb24gPSAwOwotICAgIHdpbWFnZV9kYXRhID0gZGliICsgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEZpbGwgaW4gYmFja2dyb3VuZCBjb2xvciAoYmxhY2sgYnkgZGVmYXVsdCk7IGRhdGEgYXJlIGluIEJHUiBvcmRlci4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGZvciAoaiA9IDA7ICBqIDwgaW1hZ2VfaGVpZ2h0OyAgKytqKSB7Ci0gICAgICAgIGRlc3QgPSB3aW1hZ2VfZGF0YSArIGoqd2ltYWdlX3Jvd2J5dGVzOwotICAgICAgICBmb3IgKGkgPSBpbWFnZV93aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAqZGVzdCsrID0gYmdfYmx1ZTsKLSAgICAgICAgICAgICpkZXN0KysgPSBiZ19ncmVlbjsKLSAgICAgICAgICAgICpkZXN0KysgPSBiZ19yZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgU2V0IHRoZSB3aW5kb3cgcGFyYW1ldGVycy4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIG1lbXNldCgmd25kY2xhc3MsIDAsIHNpemVvZih3bmRjbGFzcykpOwotCi0gICAgd25kY2xhc3MuY2JTaXplID0gc2l6ZW9mKHduZGNsYXNzKTsKLSAgICB3bmRjbGFzcy5zdHlsZSA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOwotICAgIHduZGNsYXNzLmxwZm5XbmRQcm9jID0gcnBuZ193aW5fd25kcHJvYzsKLSAgICB3bmRjbGFzcy5oSW5zdGFuY2UgPSBoSW5zdDsKLSAgICB3bmRjbGFzcy5oSWNvbiA9IExvYWRJY29uKE5VTEwsIElESV9BUFBMSUNBVElPTik7Ci0gICAgd25kY2xhc3MuaEN1cnNvciA9IExvYWRDdXJzb3IoTlVMTCwgSURDX0FSUk9XKTsKLSAgICB3bmRjbGFzcy5oYnJCYWNrZ3JvdW5kID0gKEhCUlVTSClHZXRTdG9ja09iamVjdChES0dSQVlfQlJVU0gpOwotICAgIHduZGNsYXNzLmxwc3pNZW51TmFtZSA9IE5VTEw7Ci0gICAgd25kY2xhc3MubHBzekNsYXNzTmFtZSA9IHByb2duYW1lOwotICAgIHduZGNsYXNzLmhJY29uU20gPSBMb2FkSWNvbihOVUxMLCBJRElfQVBQTElDQVRJT04pOwotCi0gICAgUmVnaXN0ZXJDbGFzc0V4KCZ3bmRjbGFzcyk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgRmluYWxseSwgY3JlYXRlIHRoZSB3aW5kb3cuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBleHRyYV93aWR0aCAgPSAyKihHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYQk9SREVSKSArCi0gICAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyhTTV9DWERMR0ZSQU1FKSk7Ci0gICAgZXh0cmFfaGVpZ2h0ID0gMiooR2V0U3lzdGVtTWV0cmljcyhTTV9DWUJPUkRFUikgKwotICAgICAgICAgICAgICAgICAgICAgIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lETEdGUkFNRSkpICsKLSAgICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQ0FQVElPTik7Ci0KLSAgICBnbG9iYWxfaHduZCA9IENyZWF0ZVdpbmRvdyhwcm9nbmFtZSwgdGl0bGViYXIsIFdTX09WRVJMQVBQRURXSU5ET1csCi0gICAgICBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULCBpbWFnZV93aWR0aCtleHRyYV93aWR0aCwKLSAgICAgIGltYWdlX2hlaWdodCtleHRyYV9oZWlnaHQsIE5VTEwsIE5VTEwsIGhJbnN0LCBOVUxMKTsKLQotICAgIFNob3dXaW5kb3coZ2xvYmFsX2h3bmQsIHNob3dtb2RlKTsKLSAgICBVcGRhdGVXaW5kb3coZ2xvYmFsX2h3bmQpOwotCi0gICAgcmV0dXJuIDA7Ci0KLX0gLyogZW5kIGZ1bmN0aW9uIHJwbmdfd2luX2NyZWF0ZV93aW5kb3coKSAqLwotCi0KLQotCi0KLXN0YXRpYyBpbnQgcnBuZ193aW5fZGlzcGxheV9pbWFnZSgpCi17Ci0gICAgdWNoICpzcmMsICpkZXN0OwotICAgIHVjaCByLCBnLCBiLCBhOwotICAgIHVsZyBpLCByb3csIGxhc3Ryb3c7Ci0gICAgUkVDVCByZWN0OwotCi0KLSAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIGRpc3BsYXkgbG9vcCAoaW1hZ2VfY2hhbm5lbHMgPT0gJWQpXG4iLAotICAgICAgaW1hZ2VfY2hhbm5lbHMpKQotICAgIFRyYWNlKChzdGRlcnIsICIod2lkdGggPSAlbGQsIHJvd2J5dGVzID0gJWxkLCB3aW1hZ2Vfcm93Ynl0ZXMgPSAlZClcbiIsCi0gICAgICBpbWFnZV93aWR0aCwgaW1hZ2Vfcm93Ynl0ZXMsIHdpbWFnZV9yb3dieXRlcykpCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBCbGFzdCBpbWFnZSBkYXRhIHRvIGJ1ZmZlci4gIFRoaXMgd2hvbGUgcm91dGluZSB0YWtlcyBwbGFjZSBiZWZvcmUgdGhlCi0gICAgbWVzc2FnZSBsb29wIGJlZ2lucywgc28gdGhlcmUncyBubyByZWFsIHBvaW50IGluIGFueSBwc2V1ZG8tcHJvZ3Jlc3NpdmUKLSAgICBkaXNwbGF5Li4uCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBmb3IgKGxhc3Ryb3cgPSByb3cgPSAwOyAgcm93IDwgaW1hZ2VfaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgc3JjID0gaW1hZ2VfZGF0YSArIHJvdyppbWFnZV9yb3dieXRlczsKLSAgICAgICAgZGVzdCA9IHdpbWFnZV9kYXRhICsgcm93KndpbWFnZV9yb3dieXRlczsKLSAgICAgICAgaWYgKGltYWdlX2NoYW5uZWxzID09IDMpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IGltYWdlX3dpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICByID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgYiA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzsgICAvKiBub3RlIHJldmVyc2Ugb3JkZXIgKi8KLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIC8qIGlmIChpbWFnZV9jaGFubmVscyA9PSA0KSAqLyB7Ci0gICAgICAgICAgICBmb3IgKGkgPSBpbWFnZV93aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBnID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGI7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYmdfYmx1ZTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX2dyZWVuOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYmdfcmVkOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGNvcGllZCBmcm9tIHBuZy5oKSBjb21wb3NpdGVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgKiBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICogcmVzdWx0IGludG8gdGhlIGZpcnN0IGFyZ3VtZW50OyB0aGVyZSBhcmUgbm8KLSAgICAgICAgICAgICAgICAgICAgICogc2lkZSBlZmZlY3RzIHdpdGggdGhlIGZpcnN0IGFyZ3VtZW50ICovCi0gICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZSgqZGVzdCsrLCBiLCBhLCBiZ19ibHVlKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKCpkZXN0KyssIGcsIGEsIGJnX2dyZWVuKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKCpkZXN0KyssIHIsIGEsIGJnX3JlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIGRpc3BsYXkgYWZ0ZXIgZXZlcnkgMTYgbGluZXMgKi8KLSAgICAgICAgaWYgKCgocm93KzEpICYgMHhmKSA9PSAwKSB7Ci0gICAgICAgICAgICByZWN0LmxlZnQgPSAwTDsKLSAgICAgICAgICAgIHJlY3QudG9wID0gKExPTkcpbGFzdHJvdzsKLSAgICAgICAgICAgIHJlY3QucmlnaHQgPSAoTE9ORylpbWFnZV93aWR0aDsgICAgICAvKiBwb3NzaWJseSBvZmYgYnkgb25lPyAqLwotICAgICAgICAgICAgcmVjdC5ib3R0b20gPSAoTE9ORylsYXN0cm93ICsgMTZMOyAgIC8qIHBvc3NpYmx5IG9mZiBieSBvbmU/ICovCi0gICAgICAgICAgICBJbnZhbGlkYXRlUmVjdChnbG9iYWxfaHduZCwgJnJlY3QsIEZBTFNFKTsKLSAgICAgICAgICAgIFVwZGF0ZVdpbmRvdyhnbG9iYWxfaHduZCk7ICAgICAvKiBzaW1pbGFyIHRvIFhGbHVzaCgpICovCi0gICAgICAgICAgICBsYXN0cm93ID0gcm93ICsgMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIGZpbmFsIGltYWdlLWZsdXNoIHJvdXRpbmVcbiIpKQotICAgIGlmIChsYXN0cm93IDwgaW1hZ2VfaGVpZ2h0KSB7Ci0gICAgICAgIHJlY3QubGVmdCA9IDBMOwotICAgICAgICByZWN0LnRvcCA9IChMT05HKWxhc3Ryb3c7Ci0gICAgICAgIHJlY3QucmlnaHQgPSAoTE9ORylpbWFnZV93aWR0aDsgICAgICAvKiBwb3NzaWJseSBvZmYgYnkgb25lPyAqLwotICAgICAgICByZWN0LmJvdHRvbSA9IChMT05HKWltYWdlX2hlaWdodDsgICAgLyogcG9zc2libHkgb2ZmIGJ5IG9uZT8gKi8KLSAgICAgICAgSW52YWxpZGF0ZVJlY3QoZ2xvYmFsX2h3bmQsICZyZWN0LCBGQUxTRSk7Ci0gICAgICAgIFVwZGF0ZVdpbmRvdyhnbG9iYWxfaHduZCk7ICAgICAvKiBzaW1pbGFyIHRvIFhGbHVzaCgpICovCi0gICAgfQotCi0vKgotICAgIGxhc3QgcGFyYW0gZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBiYWNrZ3JvdW5kIGlzIHdpcGVkIGJlZm9yZSBwYWludAotICAgIEludmFsaWRhdGVSZWN0KGdsb2JhbF9od25kLCBOVUxMLCBUUlVFKTsKLSAgICBVcGRhdGVXaW5kb3coZ2xvYmFsX2h3bmQpOwotICovCi0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLQotCi1zdGF0aWMgdm9pZCBycG5nX3dpbl9jbGVhbnVwKCkKLXsKLSAgICBpZiAoaW1hZ2VfZGF0YSkgewotICAgICAgICBmcmVlKGltYWdlX2RhdGEpOwotICAgICAgICBpbWFnZV9kYXRhID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoZGliKSB7Ci0gICAgICAgIGZyZWUoZGliKTsKLSAgICAgICAgZGliID0gTlVMTDsKLSAgICB9Ci19Ci0KLQotCi0KLQotTFJFU1VMVCBDQUxMQkFDSyBycG5nX3dpbl93bmRwcm9jKEhXTkQgaHduZCwgVUlOVCBpTXNnLCBXUEFSQU0gd1AsIExQQVJBTSBsUCkKLXsKLSAgICBIREMgICAgICAgICBoZGM7Ci0gICAgUEFJTlRTVFJVQ1QgcHM7Ci0gICAgaW50IHJjOwotCi0gICAgc3dpdGNoIChpTXNnKSB7Ci0gICAgICAgIGNhc2UgV01fQ1JFQVRFOgotICAgICAgICAgICAgLyogb25lLXRpbWUgcHJvY2Vzc2luZyBoZXJlLCBpZiBhbnkgKi8KLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgV01fUEFJTlQ6Ci0gICAgICAgICAgICBoZGMgPSBCZWdpblBhaW50KGh3bmQsICZwcyk7Ci0gICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcmMgPSBTdHJldGNoRElCaXRzKGhkYywgMCwgMCwgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ltYWdlX2RhdGEsIChCSVRNQVBJTkZPICopYm1paCwKLSAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgIGlVc2FnZTogbm8gY2x1ZSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTUkNDT1BZKTsKLSAgICAgICAgICAgIEVuZFBhaW50KGh3bmQsICZwcyk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAvKiB3YWl0IGZvciB0aGUgdXNlciB0byB0ZWxsIHVzIHdoZW4gdG8gcXVpdCAqLwotICAgICAgICBjYXNlIFdNX0NIQVI6Ci0gICAgICAgICAgICBzd2l0Y2ggKHdQKSB7ICAgICAgLyogb25seSBuZWVkIG9uZSwgc28gaWdub3JlIHJlcGVhdCBjb3VudCAqLwotICAgICAgICAgICAgICAgIGNhc2UgJ3EnOgotICAgICAgICAgICAgICAgIGNhc2UgJ1EnOgotICAgICAgICAgICAgICAgIGNhc2UgMHgxQjogICAgIC8qIEVzYyBrZXkgKi8KLSAgICAgICAgICAgICAgICAgICAgUG9zdFF1aXRNZXNzYWdlKDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjogICAvKiBhbm90aGVyIHdheSBvZiBxdWl0dGluZyAqLwotICAgICAgICBjYXNlIFdNX0RFU1RST1k6Ci0gICAgICAgICAgICBQb3N0UXVpdE1lc3NhZ2UoMCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gRGVmV2luZG93UHJvYyhod25kLCBpTXNnLCB3UCwgbFApOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JwbmcteC5jIGIvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JwbmcteC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTk4MTcwLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9ycG5nLXguYworKysgL2Rldi9udWxsCkBAIC0xLDkwNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBycG5nIC0gc2ltcGxlIFBORyBkaXNwbGF5IHByb2dyYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnBuZy14LmMKLQotICAgVGhpcyBwcm9ncmFtIGRlY29kZXMgYW5kIGRpc3BsYXlzIFBORyBpbWFnZXMsIHdpdGggZ2FtbWEgY29ycmVjdGlvbiBhbmQKLSAgIG9wdGlvbmFsbHkgd2l0aCBhIHVzZXItc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3IgKGluIGNhc2UgdGhlIGltYWdlIGhhcwotICAgdHJhbnNwYXJlbmN5KS4gIEl0IGlzIHZlcnkgbmVhcmx5IHRoZSBtb3N0IGJhc2ljIFBORyB2aWV3ZXIgcG9zc2libGUuCi0gICBUaGlzIHZlcnNpb24gaXMgZm9yIHRoZSBYIFdpbmRvdyBTeXN0ZW0gKHRlc3RlZCBieSBhdXRob3IgdW5kZXIgVW5peCBhbmQKLSAgIGJ5IE1hcnRpbiBaaW5zZXIgdW5kZXIgT3BlblZNUzsgbWF5IHdvcmsgdW5kZXIgT1MvMiB3aXRoIHNvbWUgdHdlYWtpbmcpLgotCi0gICB0byBkbzoKLSAgICAtIDgtYml0IChjb2xvcm1hcHBlZCkgWCBzdXBwb3J0Ci0gICAgLSB1c2UgJS4xMDIzcyB0byBzaW1wbGlmeSB0cnVuY2F0aW9uIG9mIHRpdGxlLWJhciBzdHJpbmc/Ci0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIENoYW5nZWxvZzoKLSAgICAtIDEuMDE6ICBpbml0aWFsIHB1YmxpYyByZWxlYXNlCi0gICAgLSAxLjAyOiAgbW9kaWZpZWQgdG8gYWxsb3cgYWJicmV2aWF0ZWQgb3B0aW9uczsgZml4ZWQgbG9uZy91bG9uZyBtaXMtCi0gICAgICAgICAgICAgIG1hdGNoOyBzd2l0Y2hlZCB0byBwbmdfam1wYnVmKCkgbWFjcm8KLSAgICAtIDEuMTA6ICBhZGRlZCBzdXBwb3J0IGZvciBub24tZGVmYXVsdCB2aXN1YWxzOyBmaXhlZCBYIHBpeGVsLWNvbnZlcnNpb24KLSAgICAtIDEuMTE6ICBhZGRlZCBleHRyYSBzZXQgb2YgcGFyZW50aGVzZXMgdG8gcG5nX2ptcGJ1ZigpIG1hY3JvOyBmaXhlZAotICAgICAgICAgICAgICBjb21tYW5kLWxpbmUgcGFyc2luZyBidWcKLSAgICAtIDEuMTI6ICBmaXhlZCBzb21lIHNtYWxsIFggbWVtb3J5IGxlYWtzICh0aGFua3MgdG8gRnJhbudvaXMgUGV0aXRqZWFuKQotICAgIC0gMS4xMzogIGZpeGVkIFhGcmVlR0MoKSBjcmFzaCBidWcgKHRoYW5rcyB0byBQYXRyaWNrIFdlbGNoZSkKLSAgICAtIDEuMTQ6ICBhZGRlZCBzdXBwb3J0IGZvciBYIHJlc291cmNlcyAodGhhbmtzIHRvIEdlcmhhcmQgTmlrbGFzY2gpCi0gICAgLSAyLjAwOiAgZHVhbC1saWNlbnNlZCAoYWRkZWQgR05VIEdQTCkKLSAgICAtIDIuMDE6ICBmaXhlZCBpbXByb3BlciBkaXNwbGF5IG9mIHVzYWdlIHNjcmVlbiBvbiBQTkcgZXJyb3IocykKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDggR3JlZyBSb2Vsb2ZzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMsIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLAotICAgICAgZXhwcmVzcyBvciBpbXBsaWVkLiAgSW4gbm8gZXZlbnQgc2hhbGwgdGhlIGF1dGhvciBvciBjb250cmlidXRvcnMKLSAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCi0gICAgICB0aGlzIHNvZnR3YXJlLgotCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCi0gICAgICByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIG9uZSBvZiB0aGUKLSAgICAgIGZvbGxvd2luZyB0d28gbGljZW5zZXMgKGF0IHlvdXIgb3B0aW9uKToKLQotCi0gICAgICBMSUNFTlNFIDEgKCJCU0QtbGlrZSB3aXRoIGFkdmVydGlzaW5nIGNsYXVzZSIpOgotCi0gICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgICAgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUKLSAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgotICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGEtCi0gICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gICAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLQotICAgICAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBHcmVnIFJvZWxvZnMKLSAgICAgICAgICAgIGFuZCBjb250cmlidXRvcnMgZm9yIHRoZSBib29rLCAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiCi0gICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCi0KLQotICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICAgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBQUk9HTkFNRSAgInJwbmcteCIKLSNkZWZpbmUgTE9OR05BTUUgICJTaW1wbGUgUE5HIFZpZXdlciBmb3IgWCIKLSNkZWZpbmUgVkVSU0lPTiAgICIyLjAxIG9mIDE2IE1hcmNoIDIwMDgiCi0jZGVmaW5lIFJFU05BTUUgICAicnBuZyIJLyogb3VyIFggcmVzb3VyY2UgYXBwbGljYXRpb24gbmFtZSAqLwotI2RlZmluZSBSRVNDTEFTUyAgIlJwbmciCS8qIG91ciBYIHJlc291cmNlIGNsYXNzIG5hbWUgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPFgxMS9YbGliLmg+Ci0jaW5jbHVkZSA8WDExL1h1dGlsLmg+Ci0jaW5jbHVkZSA8WDExL1hvcy5oPgotI2luY2x1ZGUgPFgxMS9rZXlzeW0uaD4KLQotLyogI2RlZmluZSBERUJVRyAgOiAgdGhpcyBlbmFibGVzIHRoZSBUcmFjZSgpIG1hY3JvcyAqLwotCi0jaW5jbHVkZSAicmVhZHBuZy5oIiAgIC8qIHR5cGVkZWZzLCBjb21tb24gbWFjcm9zLCByZWFkcG5nIHByb3RvdHlwZXMgKi8KLQotCi0vKiBjb3VsZCBqdXN0IGluY2x1ZGUgcG5nLmgsIGJ1dCB0aGlzIG1hY3JvIGlzIHRoZSBvbmx5IHRoaW5nIHdlIG5lZWQKLSAqIChuYW1lIGFuZCB0eXBlZGVmcyBjaGFuZ2VkIHRvIGxvY2FsIHZlcnNpb25zKTsgbm90ZSB0aGF0IHNpZGUgZWZmZWN0cwotICogb25seSBoYXBwZW4gd2l0aCBhbHBoYSAod2hpY2ggY291bGQgZWFzaWx5IGJlIGF2b2lkZWQgd2l0aAotICogInVzaCBhY29weSA9IChhbHBoYSk7IikgKi8KLQotI2RlZmluZSBhbHBoYV9jb21wb3NpdGUoY29tcG9zaXRlLCBmZywgYWxwaGEsIGJnKSB7ICAgICAgICAgICAgICAgXAotICAgIHVzaCB0ZW1wID0gKCh1c2gpKGZnKSoodXNoKShhbHBoYSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICh1c2gpKGJnKSoodXNoKSgyNTUgLSAodXNoKShhbHBoYSkpICsgKHVzaCkxMjgpOyAgXAotICAgIChjb21wb3NpdGUpID0gKHVjaCkoKHRlbXAgKyAodGVtcCA+PiA4KSkgPj4gOCk7ICAgICAgICAgICAgICAgXAotfQotCi0KLS8qIGxvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyBpbnQgIHJwbmdfeF9jcmVhdGVfd2luZG93KHZvaWQpOwotc3RhdGljIGludCAgcnBuZ194X2Rpc3BsYXlfaW1hZ2Uodm9pZCk7Ci1zdGF0aWMgdm9pZCBycG5nX3hfY2xlYW51cCh2b2lkKTsKLXN0YXRpYyBpbnQgIHJwbmdfeF9tc2IodWxnIHUzMnZhbCk7Ci0KLQotc3RhdGljIGNoYXIgdGl0bGViYXJbMTAyNF0sICp3aW5kb3dfbmFtZSA9IHRpdGxlYmFyOwotc3RhdGljIGNoYXIgKmFwcG5hbWUgPSBMT05HTkFNRTsKLXN0YXRpYyBjaGFyICppY29uX25hbWUgPSBQUk9HTkFNRTsKLXN0YXRpYyBjaGFyICpyZXNfbmFtZSA9IFJFU05BTUU7Ci1zdGF0aWMgY2hhciAqcmVzX2NsYXNzID0gUkVTQ0xBU1M7Ci1zdGF0aWMgY2hhciAqZmlsZW5hbWU7Ci1zdGF0aWMgRklMRSAqaW5maWxlOwotCi1zdGF0aWMgY2hhciAqYmdzdHI7Ci1zdGF0aWMgdWNoIGJnX3JlZD0wLCBiZ19ncmVlbj0wLCBiZ19ibHVlPTA7Ci0KLXN0YXRpYyBkb3VibGUgZGlzcGxheV9leHBvbmVudDsKLQotc3RhdGljIHVsZyBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0LCBpbWFnZV9yb3dieXRlczsKLXN0YXRpYyBpbnQgaW1hZ2VfY2hhbm5lbHM7Ci1zdGF0aWMgdWNoICppbWFnZV9kYXRhOwotCi0vKiBYLXNwZWNpZmljIHZhcmlhYmxlcyAqLwotc3RhdGljIGNoYXIgKmRpc3BsYXluYW1lOwotc3RhdGljIFhJbWFnZSAqeGltYWdlOwotc3RhdGljIERpc3BsYXkgKmRpc3BsYXk7Ci1zdGF0aWMgaW50IGRlcHRoOwotc3RhdGljIFZpc3VhbCAqdmlzdWFsOwotc3RhdGljIFhWaXN1YWxJbmZvICp2aXN1YWxfbGlzdDsKLXN0YXRpYyBpbnQgUlNoaWZ0LCBHU2hpZnQsIEJTaGlmdDsKLXN0YXRpYyB1bGcgUk1hc2ssIEdNYXNrLCBCTWFzazsKLXN0YXRpYyBXaW5kb3cgd2luZG93Owotc3RhdGljIEdDIGdjOwotc3RhdGljIENvbG9ybWFwIGNvbG9ybWFwOwotCi1zdGF0aWMgaW50IGhhdmVfbm9uZGVmYXVsdF92aXN1YWwgPSBGQUxTRTsKLXN0YXRpYyBpbnQgaGF2ZV9jb2xvcm1hcCA9IEZBTFNFOwotc3RhdGljIGludCBoYXZlX3dpbmRvdyA9IEZBTFNFOwotc3RhdGljIGludCBoYXZlX2djID0gRkFMU0U7Ci0vKgotdWxnIG51bWNvbG9ycz0wLCBwaXhlbHNbMjU2XTsKLXVzaCByZWRzWzI1Nl0sIGdyZWVuc1syNTZdLCBibHVlc1syNTZdOwotICovCi0KLQotCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSNpZmRlZiBzZ2kKLSAgICBjaGFyIHRtcGxpbmVbODBdOwotI2VuZGlmCi0gICAgY2hhciAqcDsKLSAgICBpbnQgcmMsIGFsZW4sIGZsZW47Ci0gICAgaW50IGVycm9yID0gMDsKLSAgICBpbnQgaGF2ZV9iZyA9IEZBTFNFOwotICAgIGRvdWJsZSBMVVRfZXhwb25lbnQ7ICAgICAgICAgICAgICAgLyoganVzdCB0aGUgbG9va3VwIHRhYmxlICovCi0gICAgZG91YmxlIENSVF9leHBvbmVudCA9IDIuMjsgICAgICAgICAvKiBqdXN0IHRoZSBtb25pdG9yICovCi0gICAgZG91YmxlIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsgICAvKiB3aG9sZSBkaXNwbGF5IHN5c3RlbSAqLwotICAgIFhFdmVudCBlOwotICAgIEtleVN5bSBrOwotCi0KLSAgICBkaXNwbGF5bmFtZSA9IChjaGFyICopTlVMTDsKLSAgICBmaWxlbmFtZSA9IChjaGFyICopTlVMTDsKLQotCi0gICAgLyogRmlyc3Qgc2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciBvdXIgZGlzcGxheS1zeXN0ZW0gZXhwb25lbnQsIGkuZS4sCi0gICAgICogdGhlIHByb2R1Y3Qgb2YgdGhlIENSVCBleHBvbmVudCBhbmQgdGhlIGV4cG9uZW50IGNvcnJlc3BvbmRpbmcgdG8KLSAgICAgKiB0aGUgZnJhbWUtYnVmZmVyJ3MgbG9va3VwIHRhYmxlIChMVVQpLCBpZiBhbnkuICBUaGlzIGlzIG5vdCBhbgotICAgICAqIGV4aGF1c3RpdmUgbGlzdCBvZiBMVVQgdmFsdWVzIChlLmcuLCBPcGVuU3RlcCBoYXMgYSBsb3Qgb2Ygd2VpcmQKLSAgICAgKiBvbmVzKSwgYnV0IGl0IHNob3VsZCBjb3ZlciA5OSUgb2YgdGhlIGN1cnJlbnQgcG9zc2liaWxpdGllcy4gKi8KLQotI2lmIGRlZmluZWQoTmVYVCkKLSAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyAyLjI7Ci0gICAgLyoKLSAgICBpZiAoc29tZV9uZXh0X2Z1bmN0aW9uX3RoYXRfcmV0dXJuc19nYW1tYSgmbmV4dF9nYW1tYSkpCi0gICAgICAgIExVVF9leHBvbmVudCA9IDEuMCAvIG5leHRfZ2FtbWE7Ci0gICAgICovCi0jZWxpZiBkZWZpbmVkKHNnaSkKLSAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyAxLjc7Ci0gICAgLyogdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSBkb2N1bWVudGVkIGZ1bmN0aW9uIHRvIGdldCB0aGUKLSAgICAgKiAiZ2FtbWEiIHZhbHVlLCBzbyB3ZSBkbyBpdCB0aGUgaGFyZCB3YXkgKi8KLSAgICBpbmZpbGUgPSBmb3BlbigiL2V0Yy9jb25maWcvc3lzdGVtLmdsR2FtbWFWYWwiLCAiciIpOwotICAgIGlmIChpbmZpbGUpIHsKLSAgICAgICAgZG91YmxlIHNnaV9nYW1tYTsKLQotICAgICAgICBmZ2V0cyh0bXBsaW5lLCA4MCwgaW5maWxlKTsKLSAgICAgICAgZmNsb3NlKGluZmlsZSk7Ci0gICAgICAgIHNnaV9nYW1tYSA9IGF0b2YodG1wbGluZSk7Ci0gICAgICAgIGlmIChzZ2lfZ2FtbWEgPiAwLjApCi0gICAgICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBzZ2lfZ2FtbWE7Ci0gICAgfQotI2VsaWYgZGVmaW5lZChNYWNpbnRvc2gpCi0gICAgTFVUX2V4cG9uZW50ID0gMS44IC8gMi42MTsKLSAgICAvKgotICAgIGlmIChzb21lX21hY19mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm1hY19nYW1tYSkpCi0gICAgICAgIExVVF9leHBvbmVudCA9IG1hY19nYW1tYSAvIDIuNjE7Ci0gICAgICovCi0jZWxzZQotICAgIExVVF9leHBvbmVudCA9IDEuMDsgICAvKiBhc3N1bWUgbm8gTFVUOiAgbW9zdCBQQ3MgKi8KLSNlbmRpZgotCi0gICAgLyogdGhlIGRlZmF1bHRzIGFib3ZlIGdpdmUgMS4wLCAxLjMsIDEuNSBhbmQgMi4yLCByZXNwZWN0aXZlbHk6ICovCi0gICAgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50ID0gTFVUX2V4cG9uZW50ICogQ1JUX2V4cG9uZW50OwotCi0KLSAgICAvKiBJZiB0aGUgdXNlciBoYXMgc2V0IHRoZSBTQ1JFRU5fR0FNTUEgZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgc3VnZ2VzdGVkCi0gICAgICogKHNvbWV3aGF0IGltcHJlY2lzZWx5KSBpbiB0aGUgbGlicG5nIGRvY3VtZW50YXRpb24sIHVzZSB0aGF0OyBvdGhlcndpc2UKLSAgICAgKiB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgd2UganVzdCBjYWxjdWxhdGVkLiAgRWl0aGVyIHdheSwgdGhlIHVzZXIgbWF5Ci0gICAgICogb3ZlcnJpZGUgdGhpcyB2aWEgYSBjb21tYW5kLWxpbmUgb3B0aW9uLiAqLwotCi0gICAgaWYgKChwID0gZ2V0ZW52KCJTQ1JFRU5fR0FNTUEiKSkgIT0gTlVMTCkKLSAgICAgICAgZGlzcGxheV9leHBvbmVudCA9IGF0b2YocCk7Ci0gICAgZWxzZQotICAgICAgICBkaXNwbGF5X2V4cG9uZW50ID0gZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50OwotCi0KLSAgICAvKiBOb3cgcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBmb3Igb3B0aW9ucyBhbmQgdGhlIFBORyBmaWxlbmFtZS4gKi8KLQotICAgIHdoaWxlICgqKythcmd2ICYmICFlcnJvcikgewotICAgICAgICBpZiAoIXN0cm5jbXAoKmFyZ3YsICItZGlzcGxheSIsIDIpKSB7Ci0gICAgICAgICAgICBpZiAoISorK2FyZ3YpCi0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkaXNwbGF5bmFtZSA9ICphcmd2OwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWdhbW1hIiwgMikpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGlzcGxheV9leHBvbmVudCA9IGF0b2YoKmFyZ3YpOwotICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5X2V4cG9uZW50IDw9IDAuMCkKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1iZ2NvbG9yIiwgMikpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmdzdHIgPSAqYXJndjsKLSAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGJnc3RyKSAhPSA3IHx8IGJnc3RyWzBdICE9ICcjJykKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsgCi0gICAgICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICAgICAgaGF2ZV9iZyA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKiphcmd2ICE9ICctJykgewotICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gKmFyZ3Y7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZ3ZbMV0pICAgLyogc2hvdWxkbid0IGJlIGFueSBtb3JlIGFyZ3MgYWZ0ZXIgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICsrZXJyb3I7ICAgLyogbm90IGV4cGVjdGluZyBhbnkgb3RoZXIgb3B0aW9ucyAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFmaWxlbmFtZSkKLSAgICAgICAgKytlcnJvcjsKLQotCi0gICAgLyogcHJpbnQgdXNhZ2Ugc2NyZWVuIGlmIGFueSBlcnJvcnMgdXAgdG8gdGhpcyBwb2ludCAqLwotCi0gICAgaWYgKGVycm9yKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4lcyAlczogICVzXG4iLCBQUk9HTkFNRSwgVkVSU0lPTiwgYXBwbmFtZSk7Ci0gICAgICAgIHJlYWRwbmdfdmVyc2lvbl9pbmZvKCk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iCi0gICAgICAgICAgIlVzYWdlOiAgJXMgWy1kaXNwbGF5IHhkcHldIFstZ2FtbWEgZXhwXSBbLWJnY29sb3IgYmddIGZpbGUucG5nXG4iCi0gICAgICAgICAgIiAgICB4ZHB5XHRuYW1lIG9mIHRoZSB0YXJnZXQgWCBkaXNwbGF5IChlLmcuLCBgYGhvc3RuYW1lOjAnJylcbiIKLSAgICAgICAgICAiICAgIGV4cCBcdHRyYW5zZmVyLWZ1bmN0aW9uIGV4cG9uZW50IChgYGdhbW1hJycpIG9mIHRoZSBkaXNwbGF5XG4iCi0gICAgICAgICAgIlx0XHQgIHN5c3RlbSBpbiBmbG9hdGluZy1wb2ludCBmb3JtYXQgKGUuZy4sIGBgJS4xZicnKTsgZXF1YWxcbiIKLSAgICAgICAgICAiXHRcdCAgdG8gdGhlIHByb2R1Y3Qgb2YgdGhlIGxvb2t1cC10YWJsZSBleHBvbmVudCAodmFyaWVzKVxuIgotICAgICAgICAgICJcdFx0ICBhbmQgdGhlIENSVCBleHBvbmVudCAodXN1YWxseSAyLjIpOyBtdXN0IGJlIHBvc2l0aXZlXG4iCi0gICAgICAgICAgIiAgICBiZyAgXHRkZXNpcmVkIGJhY2tncm91bmQgY29sb3IgaW4gNy1jaGFyYWN0ZXIgaGV4IFJHQiBmb3JtYXRcbiIKLSAgICAgICAgICAiXHRcdCAgKGUuZy4sIGBgI2ZmNzcwMCcnIGZvciBvcmFuZ2U6ICBzYW1lIGFzIEhUTUwgY29sb3JzKTtcbiIKLSAgICAgICAgICAiXHRcdCAgdXNlZCB3aXRoIHRyYW5zcGFyZW50IGltYWdlc1xuIgotICAgICAgICAgICJcblByZXNzIFEsIEVzYyBvciBtb3VzZSBidXR0b24gMSAod2l0aGluIGltYWdlIHdpbmRvdywgYWZ0ZXIgaW1hZ2VcbiIKLSAgICAgICAgICAiaXMgZGlzcGxheWVkKSB0byBxdWl0LlxuIgotICAgICAgICAgICJcbiIsIFBST0dOQU1FLCBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotCi0gICAgaWYgKCEoaW5maWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGNhbid0IG9wZW4gUE5HIGZpbGUgWyVzXVxuIiwgZmlsZW5hbWUpOwotICAgICAgICArK2Vycm9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICgocmMgPSByZWFkcG5nX2luaXQoaW5maWxlLCAmaW1hZ2Vfd2lkdGgsICZpbWFnZV9oZWlnaHQpKSAhPSAwKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHJjKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICAgICAiOiAgWyVzXSBpcyBub3QgYSBQTkcgZmlsZTogaW5jb3JyZWN0IHNpZ25hdHVyZVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAgICAgIjogIFslc10gaGFzIGJhZCBJSERSIChsaWJwbmcgbG9uZ2ptcClcbiIsIGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGluc3VmZmljaWVudCBtZW1vcnlcbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICAgICAiOiAgdW5rbm93biByZWFkcG5nX2luaXQoKSBlcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRpc3BsYXkgPSBYT3BlbkRpc3BsYXkoZGlzcGxheW5hbWUpOwotICAgICAgICAgICAgaWYgKCFkaXNwbGF5KSB7Ci0gICAgICAgICAgICAgICAgcmVhZHBuZ19jbGVhbnVwKFRSVUUpOwotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgY2FuJ3Qgb3BlbiBYIGRpc3BsYXkgWyVzXVxuIiwKLSAgICAgICAgICAgICAgICAgIGRpc3BsYXluYW1lPyBkaXNwbGF5bmFtZSA6ICJkZWZhdWx0Iik7Ci0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZXJyb3IpCi0gICAgICAgICAgICBmY2xvc2UoaW5maWxlKTsKLSAgICB9Ci0KLQotICAgIGlmIChlcnJvcikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGFib3J0aW5nLlxuIik7Ci0gICAgICAgIGV4aXQoMik7Ci0gICAgfQotCi0KLSAgICAvKiBzZXQgdGhlIHRpdGxlLWJhciBzdHJpbmcsIGJ1dCBtYWtlIHN1cmUgYnVmZmVyIGRvZXNuJ3Qgb3ZlcmZsb3cgKi8KLQotICAgIGFsZW4gPSBzdHJsZW4oYXBwbmFtZSk7Ci0gICAgZmxlbiA9IHN0cmxlbihmaWxlbmFtZSk7Ci0gICAgaWYgKGFsZW4gKyBmbGVuICsgMyA+IDEwMjMpCi0gICAgICAgIHNwcmludGYodGl0bGViYXIsICIlczogIC4uLiVzIiwgYXBwbmFtZSwgZmlsZW5hbWUrKGFsZW4rZmxlbis2LTEwMjMpKTsKLSAgICBlbHNlCi0gICAgICAgIHNwcmludGYodGl0bGViYXIsICIlczogICVzIiwgYXBwbmFtZSwgZmlsZW5hbWUpOwotCi0KLSAgICAvKiBpZiB0aGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSBhIGJhY2tncm91bmQgY29sb3Igb24gdGhlIGNvbW1hbmQgbGluZSwKLSAgICAgKiBjaGVjayBmb3Igb25lIGluIHRoZSBQTkcgZmlsZS0taWYgbm90LCB0aGUgaW5pdGlhbGl6ZWQgdmFsdWVzIG9mIDAKLSAgICAgKiAoYmxhY2spIHdpbGwgYmUgdXNlZCAqLwotCi0gICAgaWYgKGhhdmVfYmcpIHsKLSAgICAgICAgdW5zaWduZWQgciwgZywgYjsgICAvKiB0aGlzIGFwcHJvYWNoIHF1aWV0cyBjb21waWxlciB3YXJuaW5ncyAqLwotCi0gICAgICAgIHNzY2FuZihiZ3N0cisxLCAiJTJ4JTJ4JTJ4IiwgJnIsICZnLCAmYik7Ci0gICAgICAgIGJnX3JlZCAgID0gKHVjaClyOwotICAgICAgICBiZ19ncmVlbiA9ICh1Y2gpZzsKLSAgICAgICAgYmdfYmx1ZSAgPSAodWNoKWI7Ci0gICAgfSBlbHNlIGlmIChyZWFkcG5nX2dldF9iZ2NvbG9yKCZiZ19yZWQsICZiZ19ncmVlbiwgJmJnX2JsdWUpID4gMSkgewotICAgICAgICByZWFkcG5nX2NsZWFudXAoVFJVRSk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICI6ICBsaWJwbmcgZXJyb3Igd2hpbGUgY2hlY2tpbmcgZm9yIGJhY2tncm91bmQgY29sb3JcbiIpOwotICAgICAgICBleGl0KDIpOwotICAgIH0KLQotCi0gICAgLyogZG8gdGhlIGJhc2ljIFggaW5pdGlhbGl6YXRpb24gc3R1ZmYsIG1ha2UgdGhlIHdpbmRvdyBhbmQgZmlsbCBpdAotICAgICAqIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IgKi8KLQotICAgIGlmIChycG5nX3hfY3JlYXRlX3dpbmRvdygpKQotICAgICAgICBleGl0KDIpOwotCi0KLSAgICAvKiBkZWNvZGUgdGhlIGltYWdlLCBhbGwgYXQgb25jZSAqLwotCi0gICAgVHJhY2UoKHN0ZGVyciwgImNhbGxpbmcgcmVhZHBuZ19nZXRfaW1hZ2UoKVxuIikpCi0gICAgaW1hZ2VfZGF0YSA9IHJlYWRwbmdfZ2V0X2ltYWdlKGRpc3BsYXlfZXhwb25lbnQsICZpbWFnZV9jaGFubmVscywKLSAgICAgICZpbWFnZV9yb3dieXRlcyk7Ci0gICAgVHJhY2UoKHN0ZGVyciwgImRvbmUgd2l0aCByZWFkcG5nX2dldF9pbWFnZSgpXG4iKSkKLQotCi0gICAgLyogZG9uZSB3aXRoIFBORyBmaWxlLCBzbyBjbGVhbiB1cCB0byBtaW5pbWl6ZSBtZW1vcnkgdXNhZ2UgKGJ1dCBkbyBOT1QKLSAgICAgKiBudWtlIGltYWdlX2RhdGEhKSAqLwotCi0gICAgcmVhZHBuZ19jbGVhbnVwKEZBTFNFKTsKLSAgICBmY2xvc2UoaW5maWxlKTsKLQotICAgIGlmICghaW1hZ2VfZGF0YSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIHVuYWJsZSB0byBkZWNvZGUgUE5HIGltYWdlXG4iKTsKLSAgICAgICAgZXhpdCgzKTsKLSAgICB9Ci0KLQotICAgIC8qIGRpc3BsYXkgaW1hZ2UgKGNvbXBvc2l0ZSB3aXRoIGJhY2tncm91bmQgaWYgcmVxdWVzdGVkKSAqLwotCi0gICAgVHJhY2UoKHN0ZGVyciwgImNhbGxpbmcgcnBuZ194X2Rpc3BsYXlfaW1hZ2UoKVxuIikpCi0gICAgaWYgKHJwbmdfeF9kaXNwbGF5X2ltYWdlKCkpIHsKLSAgICAgICAgZnJlZShpbWFnZV9kYXRhKTsKLSAgICAgICAgZXhpdCg0KTsKLSAgICB9Ci0gICAgVHJhY2UoKHN0ZGVyciwgImRvbmUgd2l0aCBycG5nX3hfZGlzcGxheV9pbWFnZSgpXG4iKSkKLQotCi0gICAgLyogd2FpdCBmb3IgdGhlIHVzZXIgdG8gdGVsbCB1cyB3aGVuIHRvIHF1aXQgKi8KLQotICAgIHByaW50ZigKLSAgICAgICJEb25lLiAgUHJlc3MgUSwgRXNjIG9yIG1vdXNlIGJ1dHRvbiAxICh3aXRoaW4gaW1hZ2Ugd2luZG93KSB0byBxdWl0LlxuIik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0KLSAgICBkbwotICAgICAgICBYTmV4dEV2ZW50KGRpc3BsYXksICZlKTsKLSAgICB3aGlsZSAoIShlLnR5cGUgPT0gQnV0dG9uUHJlc3MgJiYgZS54YnV0dG9uLmJ1dHRvbiA9PSBCdXR0b24xKSAmJgotICAgICAgICAgICAhKGUudHlwZSA9PSBLZXlQcmVzcyAmJiAgICAvKiAgdi0tLSBvciAxIGZvciBzaGlmdGVkIGtleXMgKi8KLSAgICAgICAgICAgICAoKGsgPSBYTG9va3VwS2V5c3ltKCZlLnhrZXksIDApKSA9PSBYS19xIHx8IGsgPT0gWEtfRXNjYXBlKSApKTsKLQotCi0gICAgLyogT0ssIHdlJ3JlIGRvbmU6ICBjbGVhbiB1cCBhbGwgaW1hZ2UgYW5kIFggcmVzb3VyY2VzIGFuZCBnbyBhd2F5ICovCi0KLSAgICBycG5nX3hfY2xlYW51cCgpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLQotc3RhdGljIGludCBycG5nX3hfY3JlYXRlX3dpbmRvdyh2b2lkKQotewotICAgIHVjaCAqeGRhdGE7Ci0gICAgaW50IG5lZWRfY29sb3JtYXAgPSBGQUxTRTsKLSAgICBpbnQgc2NyZWVuLCBwYWQ7Ci0gICAgdWxnIGJnX3BpeGVsID0gMEw7Ci0gICAgdWxnIGF0dHJtYXNrOwotICAgIFdpbmRvdyByb290OwotICAgIFhFdmVudCBlOwotICAgIFhHQ1ZhbHVlcyBnY3ZhbHVlczsKLSAgICBYU2V0V2luZG93QXR0cmlidXRlcyBhdHRyOwotICAgIFhUZXh0UHJvcGVydHkgd2luZG93TmFtZSwgKnBXaW5kb3dOYW1lID0gJndpbmRvd05hbWU7Ci0gICAgWFRleHRQcm9wZXJ0eSBpY29uTmFtZSwgKnBJY29uTmFtZSA9ICZpY29uTmFtZTsKLSAgICBYVmlzdWFsSW5mbyB2aXN1YWxfaW5mbzsKLSAgICBYU2l6ZUhpbnRzICpzaXplX2hpbnRzOwotICAgIFhXTUhpbnRzICp3bV9oaW50czsKLSAgICBYQ2xhc3NIaW50ICpjbGFzc19oaW50czsKLQotCi0gICAgc2NyZWVuID0gRGVmYXVsdFNjcmVlbihkaXNwbGF5KTsKLSAgICBkZXB0aCA9IERpc3BsYXlQbGFuZXMoZGlzcGxheSwgc2NyZWVuKTsKLSAgICByb290ID0gUm9vdFdpbmRvdyhkaXNwbGF5LCBzY3JlZW4pOwotCi0jaWZkZWYgREVCVUcKLSAgICBYU3luY2hyb25pemUoZGlzcGxheSwgVHJ1ZSk7Ci0jZW5kaWYKLQotI2lmIDAKLS8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCi0gICAgaWYgKC8qIGRlcHRoICE9IDggJiYgKi8gZGVwdGggIT0gMTYgJiYgZGVwdGggIT0gMjQgJiYgZGVwdGggIT0gMzIpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgInNjcmVlbiBkZXB0aCAlZCBub3Qgc3VwcG9ydGVkIChvbmx5IDE2LSwgMjQtIG9yIDMyLWJpdCBUcnVlQ29sb3IpXG4iLAotICAgICAgICAgIGRlcHRoKTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gICAgWE1hdGNoVmlzdWFsSW5mbyhkaXNwbGF5LCBzY3JlZW4sIGRlcHRoLAotICAgICAgKGRlcHRoID09IDgpPyBQc2V1ZG9Db2xvciA6IFRydWVDb2xvciwgJnZpc3VhbF9pbmZvKTsKLSAgICB2aXN1YWwgPSB2aXN1YWxfaW5mby52aXN1YWw7Ci0jZWxzZQotICAgIGlmIChkZXB0aCAhPSAxNiAmJiBkZXB0aCAhPSAyNCAmJiBkZXB0aCAhPSAzMikgewotICAgICAgICBpbnQgdmlzdWFsc19tYXRjaGVkID0gMDsKLQotICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZGVmYXVsdCBkZXB0aCBpcyAlZDogIGNoZWNraW5nIG90aGVyIHZpc3VhbHNcbiIsCi0gICAgICAgICAgZGVwdGgpKQotCi0gICAgICAgIC8qIDI0LWJpdCBmaXJzdCAqLwotICAgICAgICB2aXN1YWxfaW5mby5zY3JlZW4gPSBzY3JlZW47Ci0gICAgICAgIHZpc3VhbF9pbmZvLmRlcHRoID0gMjQ7Ci0gICAgICAgIHZpc3VhbF9saXN0ID0gWEdldFZpc3VhbEluZm8oZGlzcGxheSwKLSAgICAgICAgICBWaXN1YWxTY3JlZW5NYXNrIHwgVmlzdWFsRGVwdGhNYXNrLCAmdmlzdWFsX2luZm8sICZ2aXN1YWxzX21hdGNoZWQpOwotICAgICAgICBpZiAodmlzdWFsc19tYXRjaGVkID09IDApIHsKLS8qIEdSUjogIGFkZCAxNS0sIDE2LSBhbmQgMzItYml0IFRydWVDb2xvciB2aXN1YWxzIChhbHNvIERpcmVjdENvbG9yPykgKi8KLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmYXVsdCBzY3JlZW4gZGVwdGggJWQgbm90IHN1cHBvcnRlZCwgYW5kIG5vIgotICAgICAgICAgICAgICAiIDI0LWJpdCB2aXN1YWxzIGZvdW5kXG4iLCBkZXB0aCk7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICBUcmFjZSgoc3RkZXJyLCAiWEdldFZpc3VhbEluZm8oKSByZXR1cm5lZCAlZCAyNC1iaXQgdmlzdWFsc1xuIiwKLSAgICAgICAgICB2aXN1YWxzX21hdGNoZWQpKQotICAgICAgICB2aXN1YWwgPSB2aXN1YWxfbGlzdFswXS52aXN1YWw7Ci0gICAgICAgIGRlcHRoID0gdmlzdWFsX2xpc3RbMF0uZGVwdGg7Ci0vKgotICAgICAgICBjb2xvcm1hcF9zaXplID0gdmlzdWFsX2xpc3RbMF0uY29sb3JtYXBfc2l6ZTsKLSAgICAgICAgdmlzdWFsX2NsYXNzID0gdmlzdWFsLT5jbGFzczsKLSAgICAgICAgdmlzdWFsSUQgPSBYVmlzdWFsSURGcm9tVmlzdWFsKHZpc3VhbCk7Ci0gKi8KLSAgICAgICAgaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCA9IFRSVUU7Ci0gICAgICAgIG5lZWRfY29sb3JtYXAgPSBUUlVFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFhNYXRjaFZpc3VhbEluZm8oZGlzcGxheSwgc2NyZWVuLCBkZXB0aCwgVHJ1ZUNvbG9yLCAmdmlzdWFsX2luZm8pOwotICAgICAgICB2aXN1YWwgPSB2aXN1YWxfaW5mby52aXN1YWw7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBSTWFzayA9IHZpc3VhbC0+cmVkX21hc2s7Ci0gICAgR01hc2sgPSB2aXN1YWwtPmdyZWVuX21hc2s7Ci0gICAgQk1hc2sgPSB2aXN1YWwtPmJsdWVfbWFzazsKLQotLyogR1JSOiAgYWRkL2NoZWNrIDgtYml0IHN1cHBvcnQgKi8KLSAgICBpZiAoZGVwdGggPT0gOCB8fCBuZWVkX2NvbG9ybWFwKSB7Ci0gICAgICAgIGNvbG9ybWFwID0gWENyZWF0ZUNvbG9ybWFwKGRpc3BsYXksIHJvb3QsIHZpc3VhbCwgQWxsb2NOb25lKTsKLSAgICAgICAgaWYgKCFjb2xvcm1hcCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJYQ3JlYXRlQ29sb3JtYXAoKSBmYWlsZWRcbiIpOwotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0KLSAgICAgICAgaGF2ZV9jb2xvcm1hcCA9IFRSVUU7Ci0gICAgfQotICAgIGlmIChkZXB0aCA9PSAxNSB8fCBkZXB0aCA9PSAxNikgewotICAgICAgICBSU2hpZnQgPSAxNSAtIHJwbmdfeF9tc2IoUk1hc2spOyAgICAvKiB0aGVzZSBhcmUgcmlnaHQtc2hpZnRzICovCi0gICAgICAgIEdTaGlmdCA9IDE1IC0gcnBuZ194X21zYihHTWFzayk7Ci0gICAgICAgIEJTaGlmdCA9IDE1IC0gcnBuZ194X21zYihCTWFzayk7Ci0gICAgfSBlbHNlIGlmIChkZXB0aCA+IDE2KSB7Ci0jZGVmaW5lIE5PXzI0QklUX01BU0tTCi0jaWZkZWYgTk9fMjRCSVRfTUFTS1MKLSAgICAgICAgUlNoaWZ0ID0gcnBuZ194X21zYihSTWFzaykgLSA3OyAgICAgLyogdGhlc2UgYXJlIGxlZnQtc2hpZnRzICovCi0gICAgICAgIEdTaGlmdCA9IHJwbmdfeF9tc2IoR01hc2spIC0gNzsKLSAgICAgICAgQlNoaWZ0ID0gcnBuZ194X21zYihCTWFzaykgLSA3OwotI2Vsc2UKLSAgICAgICAgUlNoaWZ0ID0gNyAtIHJwbmdfeF9tc2IoUk1hc2spOyAgICAgLyogdGhlc2UgYXJlIHJpZ2h0LXNoaWZ0cywgdG9vICovCi0gICAgICAgIEdTaGlmdCA9IDcgLSBycG5nX3hfbXNiKEdNYXNrKTsKLSAgICAgICAgQlNoaWZ0ID0gNyAtIHJwbmdfeF9tc2IoQk1hc2spOwotI2VuZGlmCi0gICAgfQotICAgIGlmIChkZXB0aCA+PSAxNSAmJiAoUlNoaWZ0IDwgMCB8fCBHU2hpZnQgPCAwIHx8IEJTaGlmdCA8IDApKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAicnBuZyBpbnRlcm5hbCBsb2dpYyBlcnJvcjogIG5lZ2F0aXZlIFggc2hpZnQocykhXG4iKTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEZpbmFsbHksIGNyZWF0ZSB0aGUgd2luZG93LgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgYXR0ci5iYWNraW5nX3N0b3JlID0gQWx3YXlzOwotICAgIGF0dHIuZXZlbnRfbWFzayA9IEV4cG9zdXJlTWFzayB8IEtleVByZXNzTWFzayB8IEJ1dHRvblByZXNzTWFzazsKLSAgICBhdHRybWFzayA9IENXQmFja2luZ1N0b3JlIHwgQ1dFdmVudE1hc2s7Ci0gICAgaWYgKGhhdmVfbm9uZGVmYXVsdF92aXN1YWwpIHsKLSAgICAgICAgYXR0ci5jb2xvcm1hcCA9IGNvbG9ybWFwOwotICAgICAgICBhdHRyLmJhY2tncm91bmRfcGl4ZWwgPSAwOwotICAgICAgICBhdHRyLmJvcmRlcl9waXhlbCA9IDE7Ci0gICAgICAgIGF0dHJtYXNrIHw9IENXQ29sb3JtYXAgfCBDV0JhY2tQaXhlbCB8IENXQm9yZGVyUGl4ZWw7Ci0gICAgfQotCi0gICAgd2luZG93ID0gWENyZWF0ZVdpbmRvdyhkaXNwbGF5LCByb290LCAwLCAwLCBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0LCAwLAotICAgICAgZGVwdGgsIElucHV0T3V0cHV0LCB2aXN1YWwsIGF0dHJtYXNrLCAmYXR0cik7Ci0KLSAgICBpZiAod2luZG93ID09IE5vbmUpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJYQ3JlYXRlV2luZG93KCkgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfSBlbHNlCi0gICAgICAgIGhhdmVfd2luZG93ID0gVFJVRTsKLQotICAgIGlmIChkZXB0aCA9PSA4KQotICAgICAgICBYU2V0V2luZG93Q29sb3JtYXAoZGlzcGxheSwgd2luZG93LCBjb2xvcm1hcCk7Ci0KLSAgICBpZiAoIVhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHkoJndpbmRvd19uYW1lLCAxLCBwV2luZG93TmFtZSkpCi0gICAgICAgIHBXaW5kb3dOYW1lID0gTlVMTDsKLSAgICBpZiAoIVhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHkoJmljb25fbmFtZSwgMSwgcEljb25OYW1lKSkKLSAgICAgICAgcEljb25OYW1lID0gTlVMTDsKLQotICAgIC8qIE9LIGlmIGFueSBoaW50cyBhbGxvY2F0aW9uIGZhaWxzOyBYU2V0V01Qcm9wZXJ0aWVzKCkgYWxsb3dzIE5VTExzICovCi0KLSAgICBpZiAoKHNpemVfaGludHMgPSBYQWxsb2NTaXplSGludHMoKSkgIT0gTlVMTCkgewotICAgICAgICAvKiB3aW5kb3cgd2lsbCBub3QgYmUgcmVzaXphYmxlICovCi0gICAgICAgIHNpemVfaGludHMtPmZsYWdzID0gUE1pblNpemUgfCBQTWF4U2l6ZTsKLSAgICAgICAgc2l6ZV9oaW50cy0+bWluX3dpZHRoID0gc2l6ZV9oaW50cy0+bWF4X3dpZHRoID0gKGludClpbWFnZV93aWR0aDsKLSAgICAgICAgc2l6ZV9oaW50cy0+bWluX2hlaWdodCA9IHNpemVfaGludHMtPm1heF9oZWlnaHQgPSAoaW50KWltYWdlX2hlaWdodDsKLSAgICB9Ci0KLSAgICBpZiAoKHdtX2hpbnRzID0gWEFsbG9jV01IaW50cygpKSAhPSBOVUxMKSB7Ci0gICAgICAgIHdtX2hpbnRzLT5pbml0aWFsX3N0YXRlID0gTm9ybWFsU3RhdGU7Ci0gICAgICAgIHdtX2hpbnRzLT5pbnB1dCA9IFRydWU7Ci0gICAgIC8qIHdtX2hpbnRzLT5pY29uX3BpeG1hcCA9IGljb25fcGl4bWFwOyAqLwotICAgICAgICB3bV9oaW50cy0+ZmxhZ3MgPSBTdGF0ZUhpbnQgfCBJbnB1dEhpbnQgIC8qIHwgSWNvblBpeG1hcEhpbnQgKi8gOwotICAgIH0KLQotICAgIGlmICgoY2xhc3NfaGludHMgPSBYQWxsb2NDbGFzc0hpbnQoKSkgIT0gTlVMTCkgewotICAgICAgICBjbGFzc19oaW50cy0+cmVzX25hbWUgPSByZXNfbmFtZTsKLSAgICAgICAgY2xhc3NfaGludHMtPnJlc19jbGFzcyA9IHJlc19jbGFzczsKLSAgICB9Ci0KLSAgICBYU2V0V01Qcm9wZXJ0aWVzKGRpc3BsYXksIHdpbmRvdywgcFdpbmRvd05hbWUsIHBJY29uTmFtZSwgTlVMTCwgMCwKLSAgICAgIHNpemVfaGludHMsIHdtX2hpbnRzLCBjbGFzc19oaW50cyk7Ci0KLSAgICAvKiB2YXJpb3VzIHByb3BlcnRpZXMgYW5kIGhpbnRzIG5vIGxvbmdlciBuZWVkZWQ7IGZyZWUgbWVtb3J5ICovCi0gICAgaWYgKHBXaW5kb3dOYW1lKQotICAgICAgIFhGcmVlKHBXaW5kb3dOYW1lLT52YWx1ZSk7Ci0gICAgaWYgKHBJY29uTmFtZSkKLSAgICAgICBYRnJlZShwSWNvbk5hbWUtPnZhbHVlKTsKLSAgICBpZiAoc2l6ZV9oaW50cykKLSAgICAgICAgWEZyZWUoc2l6ZV9oaW50cyk7Ci0gICAgaWYgKHdtX2hpbnRzKQotICAgICAgIFhGcmVlKHdtX2hpbnRzKTsKLSAgICBpZiAoY2xhc3NfaGludHMpCi0gICAgICAgWEZyZWUoY2xhc3NfaGludHMpOwotCi0gICAgWE1hcFdpbmRvdyhkaXNwbGF5LCB3aW5kb3cpOwotCi0gICAgZ2MgPSBYQ3JlYXRlR0MoZGlzcGxheSwgd2luZG93LCAwLCAmZ2N2YWx1ZXMpOwotICAgIGhhdmVfZ2MgPSBUUlVFOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEZpbGwgd2luZG93IHdpdGggdGhlIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7Ci0gICAgICAgIGJnX3BpeGVsID0gKCh1bGcpYmdfcmVkICAgPDwgUlNoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgKCh1bGcpYmdfZ3JlZW4gPDwgR1NoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgKCh1bGcpYmdfYmx1ZSAgPDwgQlNoaWZ0KTsKLSAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7Ci0gICAgICAgIGJnX3BpeGVsID0gKCgoKHVsZyliZ19yZWQgICA8PCA4KSA+PiBSU2hpZnQpICYgUk1hc2spIHwKLSAgICAgICAgICAgICAgICAgICAoKCgodWxnKWJnX2dyZWVuIDw8IDgpID4+IEdTaGlmdCkgJiBHTWFzaykgfAotICAgICAgICAgICAgICAgICAgICgoKCh1bGcpYmdfYmx1ZSAgPDwgOCkgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKLSAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7Ci0KLSAgICAgICAgLyogR1JSOiAgYWRkIDgtYml0IHN1cHBvcnQgKi8KLQotICAgIH0KLQotICAgIFhTZXRGb3JlZ3JvdW5kKGRpc3BsYXksIGdjLCBiZ19waXhlbCk7Ci0gICAgWEZpbGxSZWN0YW5nbGUoZGlzcGxheSwgd2luZG93LCBnYywgMCwgMCwgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgV2FpdCBmb3IgZmlyc3QgRXhwb3NlIGV2ZW50IHRvIGRvIGFueSBkcmF3aW5nLCB0aGVuIGZsdXNoLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgZG8KLSAgICAgICAgWE5leHRFdmVudChkaXNwbGF5LCAmZSk7Ci0gICAgd2hpbGUgKGUudHlwZSAhPSBFeHBvc2UgfHwgZS54ZXhwb3NlLmNvdW50KTsKLQotICAgIFhGbHVzaChkaXNwbGF5KTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBYLSBhbmQgZGlzcGxheS1zcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBpbWFnZS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewotICAgICAgICB4ZGF0YSA9ICh1Y2ggKiltYWxsb2MoNCppbWFnZV93aWR0aCppbWFnZV9oZWlnaHQpOwotICAgICAgICBwYWQgPSAzMjsKLSAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7Ci0gICAgICAgIHhkYXRhID0gKHVjaCAqKW1hbGxvYygyKmltYWdlX3dpZHRoKmltYWdlX2hlaWdodCk7Ci0gICAgICAgIHBhZCA9IDE2OwotICAgIH0gZWxzZSAvKiBkZXB0aCA9PSA4ICovIHsKLSAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKGltYWdlX3dpZHRoKmltYWdlX2hlaWdodCk7Ci0gICAgICAgIHBhZCA9IDg7Ci0gICAgfQotCi0gICAgaWYgKCF4ZGF0YSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIHVuYWJsZSB0byBhbGxvY2F0ZSBpbWFnZSBtZW1vcnlcbiIpOwotICAgICAgICByZXR1cm4gNDsKLSAgICB9Ci0KLSAgICB4aW1hZ2UgPSBYQ3JlYXRlSW1hZ2UoZGlzcGxheSwgdmlzdWFsLCBkZXB0aCwgWlBpeG1hcCwgMCwKLSAgICAgIChjaGFyICopeGRhdGEsIGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQsIHBhZCwgMCk7Ci0KLSAgICBpZiAoIXhpbWFnZSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIFhDcmVhdGVJbWFnZSgpIGZhaWxlZFxuIik7Ci0gICAgICAgIGZyZWUoeGRhdGEpOwotICAgICAgICByZXR1cm4gMzsKLSAgICB9Ci0KLSAgICAvKiB0byBhdm9pZCB0ZXN0aW5nIHRoZSBieXRlIG9yZGVyIGV2ZXJ5IHBpeGVsIChvciBkb3VibGluZyB0aGUgc2l6ZSBvZgotICAgICAqIHRoZSBkcmF3aW5nIHJvdXRpbmUgd2l0aCBhIGdpYW50IGlmLXRlc3QpLCB3ZSBhcmJpdHJhcmlseSBzZXQgdGhlIGJ5dGUKLSAgICAgKiBvcmRlciB0byBNU0JGaXJzdCBhbmQgbGV0IFhsaWIgd29ycnkgYWJvdXQgaW52ZXJ0aW5nIHRoaW5ncyBvbiBsaXR0bGUtCi0gICAgICogZW5kaWFuIG1hY2hpbmVzIChsaWtlIExpbnV4L3g4Niwgb2xkIFZBWGVuLCBldGMuKS0tdGhpcyBpcyBub3QgdGhlIG1vc3QKLSAgICAgKiBlZmZpY2llbnQgYXBwcm9hY2ggKHRoZSBnaWFudCBpZi10ZXN0IHdvdWxkIGJlIGJldHRlciksIGJ1dCBpbiB0aGUKLSAgICAgKiBpbnRlcmVzdCBvZiBjbGFyaXR5LCB3ZSB0YWtlIHRoZSBlYXN5IHdheSBvdXQuLi4gKi8KLQotICAgIHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0OwotCi0gICAgcmV0dXJuIDA7Ci0KLX0gLyogZW5kIGZ1bmN0aW9uIHJwbmdfeF9jcmVhdGVfd2luZG93KCkgKi8KLQotCi0KLQotCi1zdGF0aWMgaW50IHJwbmdfeF9kaXNwbGF5X2ltYWdlKHZvaWQpCi17Ci0gICAgdWNoICpzcmM7Ci0gICAgY2hhciAqZGVzdDsKLSAgICB1Y2ggciwgZywgYiwgYTsKLSAgICB1bGcgaSwgcm93LCBsYXN0cm93ID0gMDsKLSAgICB1bGcgcGl4ZWw7Ci0gICAgaW50IHhpbWFnZV9yb3dieXRlcyA9IHhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmU7Ci0vKiAgaW50IGJwcCA9IHhpbWFnZS0+Yml0c19wZXJfcGl4ZWw7ICAqLwotCi0KLSAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIGRpc3BsYXkgbG9vcCAoaW1hZ2VfY2hhbm5lbHMgPT0gJWQpXG4iLAotICAgICAgaW1hZ2VfY2hhbm5lbHMpKQotICAgIFRyYWNlKChzdGRlcnIsICIgICAod2lkdGggPSAlbGQsIHJvd2J5dGVzID0gJWxkLCB4aW1hZ2Vfcm93Ynl0ZXMgPSAlZClcbiIsCi0gICAgICBpbWFnZV93aWR0aCwgaW1hZ2Vfcm93Ynl0ZXMsIHhpbWFnZV9yb3dieXRlcykpCi0gICAgVHJhY2UoKHN0ZGVyciwgIiAgIChicHAgPSAlZClcbiIsIHhpbWFnZS0+Yml0c19wZXJfcGl4ZWwpKQotICAgIFRyYWNlKChzdGRlcnIsICIgICAoYnl0ZV9vcmRlciA9ICVzKVxuIiwgeGltYWdlLT5ieXRlX29yZGVyID09IE1TQkZpcnN0PwotICAgICAgIk1TQkZpcnN0IiA6ICh4aW1hZ2UtPmJ5dGVfb3JkZXIgPT0gTFNCRmlyc3Q/ICJMU0JGaXJzdCIgOiAidW5rbm93biIpKSkKLQotICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewotICAgICAgICB1bGcgcmVkLCBncmVlbiwgYmx1ZTsKLQotICAgICAgICBmb3IgKGxhc3Ryb3cgPSByb3cgPSAwOyAgcm93IDwgaW1hZ2VfaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHNyYyA9IGltYWdlX2RhdGEgKyByb3cqaW1hZ2Vfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKLSAgICAgICAgICAgIGlmIChpbWFnZV9jaGFubmVscyA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgICAgICByZWQgICA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKnNyYysrOwotI2lmZGVmIE5PXzI0QklUX01BU0tTCi0gICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc6ICB0aGlzIGFzc3VtZXMgYnBwID09IDMyLCBidXQgbWF5IGJlIDI0OiAqLwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKFJTaGlmdCA8IDApPyByZWQgICA8PCAoLVJTaGlmdCkgOiByZWQgICA+PiBSU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKEdTaGlmdCA8IDApPyBncmVlbiA8PCAoLUdTaGlmdCkgOiBncmVlbiA+PiBHU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKEJTaGlmdCA8IDApPyBibHVlICA8PCAoLUJTaGlmdCkgOiBibHVlICA+PiBCU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAmIFJNYXNrKSB8IChncmVlbiAmIEdNYXNrKSB8IChibHVlICYgQk1hc2spOwotICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgLyogaWYgKGltYWdlX2NoYW5uZWxzID09IDQpICovIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBpbWFnZV93aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSByOwotICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBnOwotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSBiOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSBiZ19yZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9IGJnX2dyZWVuOwotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSBiZ19ibHVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBtYWNybyAoZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUgZm9yZWdyb3VuZAotICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGJhY2tncm91bmQgdmFsdWVzIGFuZCBwdXRzIHRoZSByZXN1bHQgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpcnN0IGFyZ3VtZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUocmVkLCAgIHIsIGEsIGJnX3JlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoZ3JlZW4sIGcsIGEsIGJnX2dyZWVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShibHVlLCAgYiwgYSwgYmdfYmx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOwotICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogZGlzcGxheSBhZnRlciBldmVyeSAxNiBsaW5lcyAqLwotICAgICAgICAgICAgaWYgKCgocm93KzEpICYgMHhmKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClsYXN0cm93LCAwLAotICAgICAgICAgICAgICAgICAgKGludClsYXN0cm93LCBpbWFnZV93aWR0aCwgMTYpOwotICAgICAgICAgICAgICAgIFhGbHVzaChkaXNwbGF5KTsKLSAgICAgICAgICAgICAgICBsYXN0cm93ID0gcm93ICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewotICAgICAgICB1c2ggcmVkLCBncmVlbiwgYmx1ZTsKLQotICAgICAgICBmb3IgKGxhc3Ryb3cgPSByb3cgPSAwOyAgcm93IDwgaW1hZ2VfaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHNyYyA9IGltYWdlX2RhdGEgKyByb3cqaW1hZ2Vfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKLSAgICAgICAgICAgIGlmIChpbWFnZV9jaGFubmVscyA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKSgqc3JjKSA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgKytzcmM7Ci0gICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpKCpzcmMpIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICArK3NyYzsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCkoKnNyYykgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICsrc3JjOwotICAgICAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChpbWFnZV9jaGFubmVscyA9PSA0KSAqLyB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgICAgICByID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBnID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBiID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBhID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpciA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpZyA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpYmdfcmVkICAgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWJnX2dyZWVuIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliZ19ibHVlICA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGZyb20gcG5nLmgpIGNvbXBvc2l0ZXMgdGhlIGZvcmVncm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUgcmVzdWx0IGJhY2sgaW50bwotICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IGFyZ3VtZW50ICg9PSBmZyBieXRlIGhlcmU6ICBzYWZlKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKHIsIHIsIGEsIGJnX3JlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoZywgZywgYSwgYmdfZ3JlZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGIsIGIsIGEsIGJnX2JsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaClyIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaClnIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdyZWVuID4+IEdTaGlmdCkgJiBHTWFzaykgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmx1ZSAgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBkaXNwbGF5IGFmdGVyIGV2ZXJ5IDE2IGxpbmVzICovCi0gICAgICAgICAgICBpZiAoKChyb3crMSkgJiAweGYpID09IDApIHsKLSAgICAgICAgICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWxhc3Ryb3csIDAsCi0gICAgICAgICAgICAgICAgICAoaW50KWxhc3Ryb3csIGltYWdlX3dpZHRoLCAxNik7Ci0gICAgICAgICAgICAgICAgWEZsdXNoKGRpc3BsYXkpOwotICAgICAgICAgICAgICAgIGxhc3Ryb3cgPSByb3cgKyAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7Ci0KLSAgICAgICAgLyogR1JSOiAgYWRkIDgtYml0IHN1cHBvcnQgKi8KLQotICAgIH0KLQotICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIGZpbmFsIFhQdXRJbWFnZSgpXG4iKSkKLSAgICBpZiAobGFzdHJvdyA8IGltYWdlX2hlaWdodCkgewotICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWxhc3Ryb3csIDAsCi0gICAgICAgICAgKGludClsYXN0cm93LCBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0LWxhc3Ryb3cpOwotICAgICAgICBYRmx1c2goZGlzcGxheSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLXN0YXRpYyB2b2lkIHJwbmdfeF9jbGVhbnVwKHZvaWQpCi17Ci0gICAgaWYgKGltYWdlX2RhdGEpIHsKLSAgICAgICAgZnJlZShpbWFnZV9kYXRhKTsKLSAgICAgICAgaW1hZ2VfZGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHhpbWFnZSkgewotICAgICAgICBpZiAoeGltYWdlLT5kYXRhKSB7Ci0gICAgICAgICAgICBmcmVlKHhpbWFnZS0+ZGF0YSk7ICAgICAgICAgICAvKiB3ZSBhbGxvY2F0ZWQgaXQsIHNvIHdlIGZyZWUgaXQgKi8KLSAgICAgICAgICAgIHhpbWFnZS0+ZGF0YSA9IChjaGFyICopTlVMTDsgIC8qICBpbnN0ZWFkIG9mIFhEZXN0cm95SW1hZ2UoKSAqLwotICAgICAgICB9Ci0gICAgICAgIFhEZXN0cm95SW1hZ2UoeGltYWdlKTsKLSAgICAgICAgeGltYWdlID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoaGF2ZV9nYykKLSAgICAgICAgWEZyZWVHQyhkaXNwbGF5LCBnYyk7Ci0KLSAgICBpZiAoaGF2ZV93aW5kb3cpCi0gICAgICAgIFhEZXN0cm95V2luZG93KGRpc3BsYXksIHdpbmRvdyk7Ci0KLSAgICBpZiAoaGF2ZV9jb2xvcm1hcCkKLSAgICAgICAgWEZyZWVDb2xvcm1hcChkaXNwbGF5LCBjb2xvcm1hcCk7Ci0KLSAgICBpZiAoaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCkKLSAgICAgICAgWEZyZWUodmlzdWFsX2xpc3QpOwotfQotCi0KLQotCi0KLXN0YXRpYyBpbnQgcnBuZ194X21zYih1bGcgdTMydmFsKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMzE7ICBpID49IDA7ICAtLWkpIHsKLSAgICAgICAgaWYgKHUzMnZhbCAmIDB4ODAwMDAwMDBMKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHUzMnZhbCA8PD0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIGk7Ci19CmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcnBuZzItd2luLmMgYi9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcnBuZzItd2luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZGFjYjUuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JwbmcyLXdpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI1MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBycG5nMiAtIHByb2dyZXNzaXZlLW1vZGVsIFBORyBkaXNwbGF5IHByb2dyYW0gICAgICAgICAgICAgICAgcnBuZzItd2luLmMKLQotICAgVGhpcyBwcm9ncmFtIGRlY29kZXMgYW5kIGRpc3BsYXlzIFBORyBmaWxlcyBwcm9ncmVzc2l2ZWx5LCBhcyBpZiBpdCB3ZXJlCi0gICBhIHdlYiBicm93c2VyICh0aG91Z2ggdGhlIGZyb250IGVuZCBpcyBvbmx5IHNldCB1cCB0byByZWFkIGZyb20gZmlsZXMpLgotICAgSXQgc3VwcG9ydHMgZ2FtbWEgY29ycmVjdGlvbiwgdXNlci1zcGVjaWZpZWQgYmFja2dyb3VuZCBjb2xvcnMsIGFuZCB1c2VyLQotICAgc3BlY2lmaWVkIGJhY2tncm91bmQgcGF0dGVybnMgKGZvciB0cmFuc3BhcmVudCBpbWFnZXMpLiAgVGhpcyB2ZXJzaW9uIGlzCi0gICBmb3IgMzItYml0IFdpbmRvd3M7IGl0IG1heSBjb21waWxlIHVuZGVyIDE2LWJpdCBXaW5kb3dzIHdpdGggYSBsaXR0bGUKLSAgIHR3ZWFraW5nIChvciBtYXliZSBub3QpLiAgVGhhbmtzIHRvIEFkYW0gQ29zdGVsbG8gYW5kIFBpZXRlciBTLiB2YW4gZGVyCi0gICBNZXVsZW4gZm9yIHRoZSAiZGlhbW9uZCIgYW5kICJyYWRpYWwgd2F2ZXMiIHBhdHRlcm5zLCByZXNwZWN0aXZlbHkuCi0KLSAgIHRvIGRvIChzb21lZGF5LCBtYXliZSk6Ci0gICAgLSBoYW5kbGUgcXVvdGVkIGNvbW1hbmQtbGluZSBhcmdzIChlc3BlY2lhbGx5IGZpbGVuYW1lcyB3aXRoIHNwYWNlcykKLSAgICAtIGZpbmlzaCByZXNpemFibGUgY2hlY2tlcmJvYXJkLWdyYWRpZW50IChzaXplcyA0LTEyOD8pCi0gICAgLSB1c2UgJS4xMDIzcyB0byBzaW1wbGlmeSB0cnVuY2F0aW9uIG9mIHRpdGxlLWJhciBzdHJpbmc/Ci0gICAgLSBoYXZlIG1pbmltdW0gd2luZG93IHdpZHRoOiAgb2ggd2VsbAotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBDaGFuZ2Vsb2c6Ci0gICAgLSAxLjAxOiAgaW5pdGlhbCBwdWJsaWMgcmVsZWFzZQotICAgIC0gMS4wMjogIGZpeGVkIGN1dC1hbmQtcGFzdGUgZXJyb3IgaW4gdXNhZ2Ugc2NyZWVuIChvb3BzLi4uKQotICAgIC0gMS4wMzogIG1vZGlmaWVkIHRvIGFsbG93IGFiYnJldmlhdGVkIG9wdGlvbnMKLSAgICAtIDEuMDQ6ICByZW1vdmVkIGJvZ3VzIGV4dHJhIGFyZ3VtZW50IGZyb20gdXNhZ2UgZnByaW50ZigpIFtHbGVubiBSLVA/XTsKLSAgICAgICAgICAgICAgZml4ZWQgY29tbWFuZC1saW5lIHBhcnNpbmcgYnVnCi0gICAgLSAxLjEwOiAgZW5hYmxlZCAibWVzc2FnZSB3aW5kb3ciL2NvbnNvbGUgKHRoYW5rcyB0byBEYXZpZCBHZWxkcmVpY2gpCi0gICAgLSAxLjIwOiAgYWRkZWQgcnVudGltZSBNTVgtZW5hYmxpbmcvZGlzYWJsaW5nIGFuZCBuZXcgLW1teCogb3B0aW9ucwotICAgIC0gMS4yMTogIG1hZGUgbWlub3IgdHdlYWsgdG8gdXNhZ2Ugc2NyZWVuIHRvIGZpdCB3aXRoaW4gMjUtbGluZSBjb25zb2xlCi0gICAgLSAxLjIyOiAgYWRkZWQgQU1ENjQvRU02NFQgc3VwcG9ydCAoX194ODZfNjRfXykKLSAgICAtIDIuMDA6ICBkdWFsLWxpY2Vuc2VkIChhZGRlZCBHTlUgR1BMKQotICAgIC0gMi4wMTogIGZpeGVkIDY0LWJpdCB0eXBvIGluIHJlYWRwbmcyLmMKLSAgICAtIDIuMDI6ICBmaXhlZCBpbXByb3BlciBkaXNwbGF5IG9mIHVzYWdlIHNjcmVlbiBvbiBQTkcgZXJyb3Iocyk7IGZpeGVkCi0gICAgICAgICAgICAgIHVuZXhwZWN0ZWQtRU9GIGFuZCBmaWxlLXJlYWQtZXJyb3IgY2FzZXMKLSAgICAtIDIuMDM6ICByZW1vdmVkIHJ1bnRpbWUgTU1YLWVuYWJsaW5nL2Rpc2FibGluZyBhbmQgb2Jzb2xldGUgLW1teCogb3B0aW9ucwotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOCBHcmVnIFJvZWxvZnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCi0gICAgICBleHByZXNzIG9yIGltcGxpZWQuICBJbiBubyBldmVudCBzaGFsbCB0aGUgYXV0aG9yIG9yIGNvbnRyaWJ1dG9ycwotICAgICAgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgaW4gYW55IHdheSBmcm9tIHRoZSB1c2Ugb2YKLSAgICAgIHRoaXMgc29mdHdhcmUuCi0KLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIERVQUwtTElDRU5TRUQuICBZb3UgbWF5IG1vZGlmeSBhbmQvb3IKLSAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQotICAgICAgZm9sbG93aW5nIHR3byBsaWNlbnNlcyAoYXQgeW91ciBvcHRpb24pOgotCi0KLSAgICAgIExJQ0VOU0UgMSAoIkJTRC1saWtlIHdpdGggYWR2ZXJ0aXNpbmcgY2xhdXNlIik6Ci0KLSAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICAgICAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZQotICAgICAgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMuCi0gICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YS0KLSAgICAgICAgIHRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAgICAgICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotCi0gICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcwotICAgICAgICAgICAgYW5kIGNvbnRyaWJ1dG9ycyBmb3IgdGhlIGJvb2ssICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlLCIKLSAgICAgICAgICAgIHB1Ymxpc2hlZCBieSBPJ1JlaWxseSBhbmQgQXNzb2NpYXRlcy4KLQotCi0gICAgICBMSUNFTlNFIDIgKEdOVSBHUEwgdjIgb3IgbGF0ZXIpOgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgICAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIFBST0dOQU1FICAicnBuZzItd2luIgotI2RlZmluZSBMT05HTkFNRSAgIlByb2dyZXNzaXZlIFBORyBWaWV3ZXIgZm9yIFdpbmRvd3MiCi0jZGVmaW5lIFZFUlNJT04gICAiMi4wMiBvZiAxNiBNYXJjaCAyMDA4IgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4gICAgLyogZm9yIGptcGJ1ZiBkZWNsYXJhdGlvbiBpbiByZWFkcG5nMi5oICovCi0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPG1hdGguaD4gICAgICAvKiBvbmx5IGZvciBQdmRNIGJhY2tncm91bmQgY29kZSAqLwotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpZmRlZiBfX0NZR1dJTl9fCi0vKiBnZXRjaCByZXBsYWNlbWVudC4gVHVybnMgb3V0LCB3ZSBkb24ndCByZWFsbHkgbmVlZCB0aGlzLAotICogYnV0IGxlYXZlIGl0IGhlcmUgaWYgd2UgZXZlciBlbmFibGUgYW55IG9mIHRoZSB1c2VzIG9mCi0gKiBfZ2V0Y2ggaW4gdGhlIG1haW4gY29kZQotICovCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8dGVybWlvLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci1pbnQgcmVwbF9nZXRjaCggdm9pZCApCi17Ci0gIGNoYXIgY2g7Ci0gIGludCBmZCA9IGZpbGVubyhzdGRpbik7Ci0gIHN0cnVjdCB0ZXJtaW8gb2xkX3R0eSwgbmV3X3R0eTsKLQotICBpb2N0bChmZCwgVENHRVRBLCAmb2xkX3R0eSk7Ci0gIG5ld190dHkgPSBvbGRfdHR5OwotICBuZXdfdHR5LmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPIHwgSVNJRyk7Ci0gIGlvY3RsKGZkLCBUQ1NFVEEsICZuZXdfdHR5KTsKLSAgZnJlYWQoJmNoLCAxLCBzaXplb2YoY2gpLCBzdGRpbik7Ci0gIGlvY3RsKGZkLCBUQ1NFVEEsICZvbGRfdHR5KTsKLQotICByZXR1cm4gY2g7Ci19Ci0jZGVmaW5lIF9nZXRjaCByZXBsX2dldGNoCi0jZWxzZQotI2luY2x1ZGUgPGNvbmlvLmg+ICAgICAvKiBvbmx5IGZvciBfZ2V0Y2goKSAqLwotI2VuZGlmCi0KLS8qIGFsbCBmb3IgUHZkTSBiYWNrZ3JvdW5kIGNvZGU6ICovCi0jaWZuZGVmIFBJCi0jICBkZWZpbmUgUEkgICAgICAgICAgICAgMy4xNDE1OTI2NTM1ODk3OTMyMzgKLSNlbmRpZgotI2RlZmluZSBQSV8yICAgICAgICAgICAgIChQSSowLjUpCi0jZGVmaW5lIElOVl9QSV8zNjAgICAgICAgKDM2MC4wIC8gUEkpCi0jZGVmaW5lIE1BWChhLGIpICAgICAgICAgKGE+Yj9hOmIpCi0jZGVmaW5lIE1JTihhLGIpICAgICAgICAgKGE8Yj9hOmIpCi0jZGVmaW5lIENMSVAoYSxtaW4sbWF4KSAgTUFYKG1pbixNSU4oKGEpLG1heCkpCi0jZGVmaW5lIEFCUyhhKSAgICAgICAgICAgKChhKTwwPy0oYSk6KGEpKQotI2RlZmluZSBDTElQOFAoYykgICAgICAgIE1BWCgwLChNSU4oKGMpLDI1NSkpKSAgIC8qIDgtYml0IHBvcy4gaW50ZWdlciAodWNoKSAqLwotI2RlZmluZSBST1VOREYoZikgICAgICAgICgoaW50KShmICsgMC41KSkKLQotI2RlZmluZSByZ2IxX21heCAgIGJnX2ZyZXEKLSNkZWZpbmUgcmdiMV9taW4gICBiZ19ncmF5Ci0jZGVmaW5lIHJnYjJfbWF4ICAgYmdfYnNhdAotI2RlZmluZSByZ2IyX21pbiAgIGJnX2Jyb3QKLQotLyogI2RlZmluZSBERUJVRyAqLyAgICAgLyogdGhpcyBlbmFibGVzIHRoZSBUcmFjZSgpIG1hY3JvcyAqLwotCi0jaW5jbHVkZSAicmVhZHBuZzIuaCIgICAvKiB0eXBlZGVmcywgY29tbW9uIG1hY3JvcywgcmVhZHBuZzIgcHJvdG90eXBlcyAqLwotCi0KLS8qIGNvdWxkIGp1c3QgaW5jbHVkZSBwbmcuaCwgYnV0IHRoaXMgbWFjcm8gaXMgdGhlIG9ubHkgdGhpbmcgd2UgbmVlZAotICogKG5hbWUgYW5kIHR5cGVkZWZzIGNoYW5nZWQgdG8gbG9jYWwgdmVyc2lvbnMpOyBub3RlIHRoYXQgc2lkZSBlZmZlY3RzCi0gKiBvbmx5IGhhcHBlbiB3aXRoIGFscGhhICh3aGljaCBjb3VsZCBlYXNpbHkgYmUgYXZvaWRlZCB3aXRoCi0gKiAidXNoIGFjb3B5ID0gKGFscGhhKTsiKSAqLwotCi0jZGVmaW5lIGFscGhhX2NvbXBvc2l0ZShjb21wb3NpdGUsIGZnLCBhbHBoYSwgYmcpIHsgICAgICAgICAgICAgICBcCi0gICAgdXNoIHRlbXAgPSAoKHVzaCkoZmcpKih1c2gpKGFscGhhKSArICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKHVzaCkoYmcpKih1c2gpKDI1NSAtICh1c2gpKGFscGhhKSkgKyAodXNoKTEyOCk7ICBcCi0gICAgKGNvbXBvc2l0ZSkgPSAodWNoKSgodGVtcCArICh0ZW1wID4+IDgpKSA+PiA4KTsgICAgICAgICAgICAgICBcCi19Ci0KLQotI2RlZmluZSBJTkJVRlNJWkUgNDA5NiAgIC8qIHdpdGggcHNldWRvLXRpbWluZyBvbiAoMSBzZWMgZGVsYXkvYmxvY2spLCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogIGJsb2NrIHNpemUgY29ycmVzcG9uZHMgcm91Z2hseSB0byBhIGRvd25sb2FkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogIHNwZWVkIDEwJSBmYXN0ZXIgdGhhbiB0aGVvcmV0aWNhbCAzMy42SyBtYXhpbXVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogIChhc3N1bWluZyA4IGRhdGEgYml0cywgMSBzdG9wIGJpdCBhbmQgbm8gb3RoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgb3ZlcmhlYWQpICovCi0KLS8qIGxvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB2b2lkICAgICAgIHJwbmcyX3dpbl9pbml0KHZvaWQpOwotc3RhdGljIGludCAgICAgICAgcnBuZzJfd2luX2NyZWF0ZV93aW5kb3codm9pZCk7Ci1zdGF0aWMgaW50ICAgICAgICBycG5nMl93aW5fbG9hZF9iZ19pbWFnZSh2b2lkKTsKLXN0YXRpYyB2b2lkICAgICAgIHJwbmcyX3dpbl9kaXNwbGF5X3Jvdyh1bGcgcm93KTsKLXN0YXRpYyB2b2lkICAgICAgIHJwbmcyX3dpbl9maW5pc2hfZGlzcGxheSh2b2lkKTsKLXN0YXRpYyB2b2lkICAgICAgIHJwbmcyX3dpbl9jbGVhbnVwKHZvaWQpOwotTFJFU1VMVCBDQUxMQkFDSyAgcnBuZzJfd2luX3duZHByb2MoSFdORCwgVUlOVCwgV1BBUkFNLCBMUEFSQU0pOwotCi0KLXN0YXRpYyBjaGFyIHRpdGxlYmFyWzEwMjRdOwotc3RhdGljIGNoYXIgKnByb2duYW1lID0gUFJPR05BTUU7Ci1zdGF0aWMgY2hhciAqYXBwbmFtZSA9IExPTkdOQU1FOwotc3RhdGljIGNoYXIgKmZpbGVuYW1lOwotc3RhdGljIEZJTEUgKmluZmlsZTsKLQotc3RhdGljIG1haW5wcm9nX2luZm8gcnBuZzJfaW5mbzsKLQotc3RhdGljIHVjaCBpbmJ1ZltJTkJVRlNJWkVdOwotc3RhdGljIGludCBpbmNvdW50OwotCi1zdGF0aWMgaW50IHBhdCA9IDY7ICAgICAgICAgLyogbXVzdCBiZSBsZXNzIHRoYW4gbnVtX2JncGF0ICovCi1zdGF0aWMgaW50IGJnX2ltYWdlID0gMDsKLXN0YXRpYyBpbnQgYmdzY2FsZSA9IDE2Owotc3RhdGljIHVsZyBiZ19yb3dieXRlczsKLXN0YXRpYyB1Y2ggKmJnX2RhdGE7Ci0KLXN0YXRpYyBzdHJ1Y3QgcmdiX2NvbG9yIHsKLSAgICB1Y2ggciwgZywgYjsKLX0gcmdiW10gPSB7Ci0gICAgeyAgMCwgICAwLCAgIDB9LCAgICAvKiAgMDogIGJsYWNrICovCi0gICAgezI1NSwgMjU1LCAyNTV9LCAgICAvKiAgMTogIHdoaXRlICovCi0gICAgezE3MywgMTMyLCAgNTd9LCAgICAvKiAgMjogIHRhbiAqLwotICAgIHsgNjQsIDEzMiwgICAwfSwgICAgLyogIDM6ICBtZWRpdW0gZ3JlZW4gKi8KLSAgICB7MTg5LCAxMTcsICAgMX0sICAgIC8qICA0OiAgZ29sZCAqLwotICAgIHsyNTMsIDI0OSwgICAxfSwgICAgLyogIDU6ICB5ZWxsb3cgKi8KLSAgICB7ICAwLCAgIDAsIDI1NX0sICAgIC8qICA2OiAgYmx1ZSAqLwotICAgIHsgIDAsICAgMCwgMTIwfSwgICAgLyogIDc6ICBtZWRpdW0gYmx1ZSAqLwotICAgIHsyNTUsICAgMCwgMjU1fSwgICAgLyogIDg6ICBtYWdlbnRhICovCi0gICAgeyA2NCwgICAwLCAgNjR9LCAgICAvKiAgOTogIGRhcmsgbWFnZW50YSAqLwotICAgIHsyNTUsICAgMCwgICAwfSwgICAgLyogMTA6ICByZWQgKi8KLSAgICB7IDY0LCAgIDAsICAgMH0sICAgIC8qIDExOiAgZGFyayByZWQgKi8KLSAgICB7MjU1LCAxMjcsICAgMH0sICAgIC8qIDEyOiAgb3JhbmdlICovCi0gICAgezE5MiwgIDk2LCAgIDB9LCAgICAvKiAxMzogIGRhcmtlciBvcmFuZ2UgKi8KLSAgICB7IDI0LCAgNjAsICAgMH0sICAgIC8qIDE0OiAgZGFyayBncmVlbi15ZWxsb3cgKi8KLSAgICB7IDg1LCAxMjUsIDIwMH0gICAgIC8qIDE1OiAgaWNlIGJsdWUgKi8KLX07Ci0vKiBub3QgdXNlZCBmb3Igbm93LCBidXQgc2hvdWxkIGJlIGZvciBlcnJvci1jaGVja2luZzoKLXN0YXRpYyBpbnQgbnVtX3JnYiA9IHNpemVvZihyZ2IpIC8gc2l6ZW9mKHN0cnVjdCByZ2JfY29sb3IpOwotICovCi0KLS8qCi0gICAgVGhpcyB3aG9sZSBzdHJ1Y3QgaXMgYSBmYWlybHkgY2hlZXN5IHdheSB0byBrZWVwIHRoZSBudW1iZXIgb2YKLSAgICBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBhIG1pbmltdW0uICBUaGUgcmFkaWFsLXdhdmVzIGJhY2tncm91bmQKLSAgICB0eXBlIGlzIGEgcGFydGljdWxhcmx5IHBvb3IgZml0IHRvIHRoZSBpbnRlZ2VyIGVsZW1lbnRzIG9mIHRoZQotICAgIHN0cnVjdC4uLmJ1dCBhIGZldyBtYWNyb3MgYW5kIGEgbGl0dGxlIGZpeGVkLXBvaW50IG1hdGggd2lsbCBkbwotICAgIHdvbmRlcnMgZm9yIHlhLgotCi0gICAgdHlwZSBiaXRzOgotICAgICAgIEYgRSBEIEMgQiBBIDkgOCA3IDYgNSA0IDMgMiAxIDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwgfCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCArLSstKy0tIDAgPSBzaGFycC1lZGdlZCBjaGVja2VyYm9hcmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICAgICAgICAgMSA9IHNvZnQgZGlhbW9uZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICAgICAgICAgMiA9IHJhZGlhbCB3YXZlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgICAgICAgMy03ID0gdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKy0tIGdyYWRpZW50ICMyIGludmVydGVkPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0gYWx0ZXJuYXRpbmcgY29sdW1ucyBpbnZlcnRlZD8KLSAqLwotc3RhdGljIHN0cnVjdCBiYWNrZ3JvdW5kX3BhdHRlcm4gewotICAgIHVzaCB0eXBlOwotICAgIGludCByZ2IxX21heCwgcmdiMV9taW47ICAgICAvKiBvciBiZ19mcmVxLCBiZ19ncmF5ICovCi0gICAgaW50IHJnYjJfbWF4LCByZ2IyX21pbjsgICAgIC8qIG9yIGJnX2JzYXQsIGJnX2Jyb3QgKGJvdGggc2NhbGVkIGJ5IDEwKSovCi19IGJnW10gPSB7Ci0gICAgezArOCwgICAyLDAsICAxLDE1fSwgICAgICAgIC8qIGNoZWNrZXJlZDogIHRhbi9ibGFjayB2cy4gd2hpdGUvaWNlIGJsdWUgKi8KLSAgICB7MCsyNCwgIDIsMCwgIDEsMH0sICAgICAgICAgLyogY2hlY2tlcmVkOiAgdGFuL2JsYWNrIHZzLiB3aGl0ZS9ibGFjayAqLwotICAgIHswKzgsICAgNCw1LCAgMCwyfSwgICAgICAgICAvKiBjaGVja2VyZWQ6ICBnb2xkL3llbGxvdyB2cy4gYmxhY2svdGFuICovCi0gICAgezArOCwgICA0LDUsICAwLDZ9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIGdvbGQveWVsbG93IHZzLiBibGFjay9ibHVlICovCi0gICAgezAsICAgICA3LDAsICA4LDl9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIGRlZXAgYmx1ZS9ibGFjayB2cy4gbWFnZW50YSAqLwotICAgIHswKzgsICAxMywwLCAgNSwxNH0sICAgICAgICAvKiBjaGVja2VyZWQ6ICBvcmFuZ2UvYmxhY2sgdnMuIHllbGxvdyAqLwotICAgIHswKzgsICAxMiwwLCAxMCwxMX0sICAgICAgICAvKiBjaGVja2VyZWQ6ICBvcmFuZ2UvYmxhY2sgdnMuIHJlZCAqLwotICAgIHsxLCAgICAgNywwLCAgOCwwfSwgICAgICAgICAvKiBkaWFtb25kczogIGRlZXAgYmx1ZS9ibGFjayB2cy4gbWFnZW50YSAqLwotICAgIHsxLCAgICAxMiwwLCAxMSwwfSwgICAgICAgICAvKiBkaWFtb25kczogIG9yYW5nZSB2cy4gZGFyayByZWQgKi8KLSAgICB7MSwgICAgMTAsMCwgIDcsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICByZWQgdnMuIG1lZGl1bSBibHVlICovCi0gICAgezEsICAgICA0LDAsICA1LDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgZ29sZCB2cy4geWVsbG93ICovCi0gICAgezEsICAgICAzLDAsICAwLDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgbWVkaXVtIGdyZWVuIHZzLiBibGFjayAqLwotICAgIHsyLCAgICAxNiwgMTAwLCAgMjAsICAgMH0sICAvKiByYWRpYWw6ICB+aGFyZCByYWRpYWwgY29sb3ItYmVhbXMgKi8KLSAgICB7MiwgICAgMTgsIDEwMCwgIDEwLCAgIDJ9LCAgLyogcmFkaWFsOiAgc29mdCwgY3VydmVkIHJhZGlhbCBjb2xvci1iZWFtcyAqLwotICAgIHsyLCAgICAxNiwgMjU2LCAxMDAsIDI1MH0sICAvKiByYWRpYWw6ICB2ZXJ5IHRpZ2h0IHNwaXJhbCAqLwotICAgIHsyLCAxMDAwMCwgMjU2LCAgMTEsICAgMH0gICAvKiByYWRpYWw6ICBkaXBvbGUtbW9pcmUnIChhbG1vc3QgZnJhY3RhbCkgKi8KLX07Ci1zdGF0aWMgaW50IG51bV9iZ3BhdCA9IHNpemVvZihiZykgLyBzaXplb2Yoc3RydWN0IGJhY2tncm91bmRfcGF0dGVybik7Ci0KLQotLyogV2luZG93cy1zcGVjaWZpYyBnbG9iYWwgdmFyaWFibGVzIChjb3VsZCBnbyBpbiBzdHJ1Y3QsIGJ1dCBtZXNzeS4uLikgKi8KLXN0YXRpYyB1bGcgd2ltYWdlX3Jvd2J5dGVzOwotc3RhdGljIHVjaCAqZGliOwotc3RhdGljIHVjaCAqd2ltYWdlX2RhdGE7Ci1zdGF0aWMgQklUTUFQSU5GT0hFQURFUiAqYm1paDsKLQotc3RhdGljIEhXTkQgZ2xvYmFsX2h3bmQ7Ci1zdGF0aWMgSElOU1RBTkNFIGdsb2JhbF9oSW5zdDsKLXN0YXRpYyBpbnQgZ2xvYmFsX3Nob3dtb2RlOwotCi0KLQotCi1pbnQgV0lOQVBJIFdpbk1haW4oSElOU1RBTkNFIGhJbnN0LCBISU5TVEFOQ0UgaFByZXZJbnN0LCBQU1RSIGNtZCwgaW50IHNob3dtb2RlKQotewotICAgIGNoYXIgKmFyZ3NbMTAyNF07ICAgICAgICAgICAgICAgICAvKiBhcmJpdHJhcnkgbGltaXQsIGJ1dCBzaG91bGQgc3VmZmljZSAqLwotICAgIGNoYXIgKiphcmd2ID0gYXJnczsKLSAgICBjaGFyICpwLCAqcSwgKmJnc3RyID0gTlVMTDsKLSAgICBpbnQgYXJnYyA9IDA7Ci0gICAgaW50IHJjLCBhbGVuLCBmbGVuOwotICAgIGludCBlcnJvciA9IDA7Ci0gICAgaW50IHRpbWluZyA9IEZBTFNFOwotICAgIGludCBoYXZlX2JnID0gRkFMU0U7Ci0gICAgZG91YmxlIExVVF9leHBvbmVudDsgICAgICAgICAgICAgIC8qIGp1c3QgdGhlIGxvb2t1cCB0YWJsZSAqLwotICAgIGRvdWJsZSBDUlRfZXhwb25lbnQgPSAyLjI7ICAgICAgICAvKiBqdXN0IHRoZSBtb25pdG9yICovCi0gICAgZG91YmxlIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsgIC8qIHdob2xlIGRpc3BsYXkgc3lzdGVtICovCi0gICAgTVNHIG1zZzsKLQotCi0gICAgLyogRmlyc3QgaW5pdGlhbGl6ZSBhIGZldyB0aGluZ3MsIGp1c3QgdG8gYmUgc3VyZS0tbWVtc2V0IHRha2VzIGNhcmUgb2YKLSAgICAgKiBkZWZhdWx0IGJhY2tncm91bmQgY29sb3IgKGJsYWNrKSwgYm9vbGVhbnMgKEZBTFNFKSwgcG9pbnRlcnMgKE5VTEwpLAotICAgICAqIGV0Yy4gKi8KLQotICAgIGdsb2JhbF9oSW5zdCA9IGhJbnN0OwotICAgIGdsb2JhbF9zaG93bW9kZSA9IHNob3dtb2RlOwotICAgIGZpbGVuYW1lID0gKGNoYXIgKilOVUxMOwotICAgIG1lbXNldCgmcnBuZzJfaW5mbywgMCwgc2l6ZW9mKG1haW5wcm9nX2luZm8pKTsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0gICAgLyogTmV4dCByZWVuYWJsZSBjb25zb2xlIG91dHB1dCwgd2hpY2ggbm9ybWFsbHkgZ29lcyB0byB0aGUgYml0IGJ1Y2tldAotICAgICAqIGZvciB3aW5kb3dlZCBhcHBzLiAgQ2xvc2luZyB0aGUgY29uc29sZSB3aW5kb3cgd2lsbCB0ZXJtaW5hdGUgdGhlCi0gICAgICogYXBwLiAgVGhhbmtzIHRvIERhdmlkLkdlbGRyZWljaEByZWFsdml6LmNvbSBmb3Igc3VwcGx5aW5nIHRoZSBtYWdpY2FsCi0gICAgICogaW5jYW50YXRpb24uICovCi0KLSAgICBBbGxvY0NvbnNvbGUoKTsKLSAgICBmcmVvcGVuKCJDT05PVVQkIiwgImEiLCBzdGRlcnIpOwotICAgIGZyZW9wZW4oIkNPTk9VVCQiLCAiYSIsIHN0ZG91dCk7Ci0jZW5kaWYKLQotICAgIC8qIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igb3VyIGRpc3BsYXktc3lzdGVtIGV4cG9uZW50LCBpLmUuLCB0aGUKLSAgICAgKiBwcm9kdWN0IG9mIHRoZSBDUlQgZXhwb25lbnQgYW5kIHRoZSBleHBvbmVudCBjb3JyZXNwb25kaW5nIHRvCi0gICAgICogdGhlIGZyYW1lLWJ1ZmZlcidzIGxvb2t1cCB0YWJsZSAoTFVUKSwgaWYgYW55LiAgVGhpcyBpcyBub3QgYW4KLSAgICAgKiBleGhhdXN0aXZlIGxpc3Qgb2YgTFVUIHZhbHVlcyAoZS5nLiwgT3BlblN0ZXAgaGFzIGEgbG90IG9mIHdlaXJkCi0gICAgICogb25lcyksIGJ1dCBpdCBzaG91bGQgY292ZXIgOTklIG9mIHRoZSBjdXJyZW50IHBvc3NpYmlsaXRpZXMuICBBbmQKLSAgICAgKiB5ZXMsIHRoZXNlIGlmZGVmcyBhcmUgY29tcGxldGVseSB3YXN0ZWQgaW4gYSBXaW5kb3dzIHByb2dyYW0uLi4gKi8KLQotI2lmIGRlZmluZWQoTmVYVCkKLSAgICAvKiB0aGlyZC1wYXJ0eSB1dGlsaXRpZXMgY2FuIG1vZGlmeSB0aGUgZGVmYXVsdCBMVVQgZXhwb25lbnQgKi8KLSAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyAyLjI7Ci0gICAgLyoKLSAgICBpZiAoc29tZV9uZXh0X2Z1bmN0aW9uX3RoYXRfcmV0dXJuc19nYW1tYSgmbmV4dF9nYW1tYSkpCi0gICAgICAgIExVVF9leHBvbmVudCA9IDEuMCAvIG5leHRfZ2FtbWE7Ci0gICAgICovCi0jZWxpZiBkZWZpbmVkKHNnaSkKLSAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyAxLjc7Ci0gICAgLyogdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSBkb2N1bWVudGVkIGZ1bmN0aW9uIHRvCi0gICAgICogZ2V0IHRoZSAiZ2FtbWEiIHZhbHVlLCBzbyB3ZSBkbyBpdCB0aGUgaGFyZCB3YXkgKi8KLSAgICBpbmZpbGUgPSBmb3BlbigiL2V0Yy9jb25maWcvc3lzdGVtLmdsR2FtbWFWYWwiLCAiciIpOwotICAgIGlmIChpbmZpbGUpIHsKLSAgICAgICAgZG91YmxlIHNnaV9nYW1tYTsKLQotICAgICAgICBmZ2V0cyh0bXBsaW5lLCA4MCwgaW5maWxlKTsKLSAgICAgICAgZmNsb3NlKGluZmlsZSk7Ci0gICAgICAgIHNnaV9nYW1tYSA9IGF0b2YodG1wbGluZSk7Ci0gICAgICAgIGlmIChzZ2lfZ2FtbWEgPiAwLjApCi0gICAgICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBzZ2lfZ2FtbWE7Ci0gICAgfQotI2VsaWYgZGVmaW5lZChNYWNpbnRvc2gpCi0gICAgTFVUX2V4cG9uZW50ID0gMS44IC8gMi42MTsKLSAgICAvKgotICAgIGlmIChzb21lX21hY19mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm1hY19nYW1tYSkpCi0gICAgICAgIExVVF9leHBvbmVudCA9IG1hY19nYW1tYSAvIDIuNjE7Ci0gICAgICovCi0jZWxzZQotICAgIExVVF9leHBvbmVudCA9IDEuMDsgICAvKiBhc3N1bWUgbm8gTFVUOiAgbW9zdCBQQ3MgKi8KLSNlbmRpZgotCi0gICAgLyogdGhlIGRlZmF1bHRzIGFib3ZlIGdpdmUgMS4wLCAxLjMsIDEuNSBhbmQgMi4yLCByZXNwZWN0aXZlbHk6ICovCi0gICAgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50ID0gTFVUX2V4cG9uZW50ICogQ1JUX2V4cG9uZW50OwotCi0KLSAgICAvKiBJZiB0aGUgdXNlciBoYXMgc2V0IHRoZSBTQ1JFRU5fR0FNTUEgZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgc3VnZ2VzdGVkCi0gICAgICogKHNvbWV3aGF0IGltcHJlY2lzZWx5KSBpbiB0aGUgbGlicG5nIGRvY3VtZW50YXRpb24sIHVzZSB0aGF0OyBvdGhlcndpc2UKLSAgICAgKiB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgd2UganVzdCBjYWxjdWxhdGVkLiAgRWl0aGVyIHdheSwgdGhlIHVzZXIgbWF5Ci0gICAgICogb3ZlcnJpZGUgdGhpcyB2aWEgYSBjb21tYW5kLWxpbmUgb3B0aW9uLiAqLwotCi0gICAgaWYgKChwID0gZ2V0ZW52KCJTQ1JFRU5fR0FNTUEiKSkgIT0gTlVMTCkKLSAgICAgICAgcnBuZzJfaW5mby5kaXNwbGF5X2V4cG9uZW50ID0gYXRvZihwKTsKLSAgICBlbHNlCi0gICAgICAgIHJwbmcyX2luZm8uZGlzcGxheV9leHBvbmVudCA9IGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsKLQotCi0gICAgLyogV2luZG93cyByZWFsbHkgaGF0ZXMgY29tbWFuZCBsaW5lcywgc28gd2UgaGF2ZSB0byBzZXQgdXAgb3VyIG93biBhcmd2LgotICAgICAqIE5vdGUgdGhhdCB3ZSBkbyBOT1QgYm90aGVyIHdpdGggcXVvdGVkIGFyZ3VtZW50cyBoZXJlLCBzbyBkb24ndCB1c2UKLSAgICAgKiBmaWxlbmFtZXMgd2l0aCBzcGFjZXMgaW4gJ2VtISAqLwotCi0gICAgYXJndlthcmdjKytdID0gUFJPR05BTUU7Ci0gICAgcCA9IGNtZDsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmICgqcCA9PSAnICcpCi0gICAgICAgICAgICB3aGlsZSAoKisrcCA9PSAnICcpCi0gICAgICAgICAgICAgICAgOwotICAgICAgICAvKiBub3cgcCBwb2ludHMgYXQgdGhlIGZpcnN0IG5vbi1zcGFjZSBhZnRlciBzb21lIHNwYWNlcyAqLwotICAgICAgICBpZiAoKnAgPT0gJ1wwJykKLSAgICAgICAgICAgIGJyZWFrOyAgICAvKiBub3RoaW5nIGFmdGVyIHRoZSBzcGFjZXM6ICBkb25lICovCi0gICAgICAgIGFyZ3ZbYXJnYysrXSA9IHEgPSBwOwotICAgICAgICB3aGlsZSAoKnEgJiYgKnEgIT0gJyAnKQotICAgICAgICAgICAgKytxOwotICAgICAgICAvKiBub3cgcSBwb2ludHMgYXQgYSBzcGFjZSBvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKi8KLSAgICAgICAgaWYgKCpxID09ICdcMCcpCi0gICAgICAgICAgICBicmVhazsgICAgLyogbGFzdCBhcmd2IGFscmVhZHkgdGVybWluYXRlZDsgcXVpdCAqLwotICAgICAgICAqcSA9ICdcMCc7ICAgIC8qIGNoYW5nZSBzcGFjZSB0byB0ZXJtaW5hdG9yICovCi0gICAgICAgIHAgPSBxICsgMTsKLSAgICB9Ci0gICAgYXJndlthcmdjXSA9IE5VTEw7ICAgLyogdGVybWluYXRlIHRoZSBhcmd2IGFycmF5IGl0c2VsZiAqLwotCi0KLSAgICAvKiBOb3cgcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBmb3Igb3B0aW9ucyBhbmQgdGhlIFBORyBmaWxlbmFtZS4gKi8KLQotICAgIHdoaWxlICgqKythcmd2ICYmICFlcnJvcikgewotICAgICAgICBpZiAoIXN0cm5jbXAoKmFyZ3YsICItZ2FtbWEiLCAyKSkgewotICAgICAgICAgICAgaWYgKCEqKythcmd2KQotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBycG5nMl9pbmZvLmRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKCphcmd2KTsKLSAgICAgICAgICAgICAgICBpZiAocnBuZzJfaW5mby5kaXNwbGF5X2V4cG9uZW50IDw9IDAuMCkKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1iZ2NvbG9yIiwgNCkpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmdzdHIgPSAqYXJndjsKLSAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGJnc3RyKSAhPSA3IHx8IGJnc3RyWzBdICE9ICcjJykKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGF2ZV9iZyA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJnX2ltYWdlID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWJncGF0IiwgNCkpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGF0ID0gYXRvaSgqYXJndikgLSAxOwotICAgICAgICAgICAgICAgIGlmIChwYXQgPCAwIHx8IHBhdCA+PSBudW1fYmdwYXQpCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJnX2ltYWdlID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgaGF2ZV9iZyA9IEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi10aW1pbmciLCAyKSkgewotICAgICAgICAgICAgdGltaW5nID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgqKmFyZ3YgIT0gJy0nKSB7Ci0gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAqYXJndjsKLSAgICAgICAgICAgICAgICBpZiAoYXJndlsxXSkgICAvKiBzaG91bGRuJ3QgYmUgYW55IG1vcmUgYXJncyBhZnRlciBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgKytlcnJvcjsgICAvKiBub3QgZXhwZWN0aW5nIGFueSBvdGhlciBvcHRpb25zICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWZpbGVuYW1lKQotICAgICAgICArK2Vycm9yOwotCi0KLSAgICAvKiBwcmludCB1c2FnZSBzY3JlZW4gaWYgYW55IGVycm9ycyB1cCB0byB0aGlzIHBvaW50ICovCi0KLSAgICBpZiAoZXJyb3IpIHsKLSNpZm5kZWYgX19DWUdXSU5fXwotICAgICAgICBpbnQgY2g7Ci0jZW5kaWYKLQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXMgJXM6ICAlc1xuXG4iLCBQUk9HTkFNRSwgVkVSU0lPTiwgYXBwbmFtZSk7Ci0gICAgICAgIHJlYWRwbmcyX3ZlcnNpb25faW5mbygpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIgotICAgICAgICAgICJVc2FnZTogICVzIFstZ2FtbWEgZXhwXSBbLWJnY29sb3IgYmcgfCAtYmdwYXQgcGF0XSBbLXRpbWluZ11cbiIKLSAgICAgICAgICAiICAgICAgICAlKnMgZmlsZS5wbmdcblxuIgotICAgICAgICAgICIgICAgZXhwIFx0dHJhbnNmZXItZnVuY3Rpb24gZXhwb25lbnQgKGBgZ2FtbWEnJykgb2YgdGhlIGRpc3BsYXlcbiIKLSAgICAgICAgICAiXHRcdCAgc3lzdGVtIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCAoZS5nLiwgYGAlLjFmJycpOyBlcXVhbFxuIgotICAgICAgICAgICJcdFx0ICB0byB0aGUgcHJvZHVjdCBvZiB0aGUgbG9va3VwLXRhYmxlIGV4cG9uZW50ICh2YXJpZXMpXG4iCi0gICAgICAgICAgIlx0XHQgIGFuZCB0aGUgQ1JUIGV4cG9uZW50ICh1c3VhbGx5IDIuMik7IG11c3QgYmUgcG9zaXRpdmVcbiIKLSAgICAgICAgICAiICAgIGJnICBcdGRlc2lyZWQgYmFja2dyb3VuZCBjb2xvciBpbiA3LWNoYXJhY3RlciBoZXggUkdCIGZvcm1hdFxuIgotICAgICAgICAgICJcdFx0ICAoZS5nLiwgYGAjZmY3NzAwJycgZm9yIG9yYW5nZTogIHNhbWUgYXMgSFRNTCBjb2xvcnMpO1xuIgotICAgICAgICAgICJcdFx0ICB1c2VkIHdpdGggdHJhbnNwYXJlbnQgaW1hZ2VzOyBvdmVycmlkZXMgLWJncGF0IG9wdGlvblxuIgotICAgICAgICAgICIgICAgcGF0IFx0ZGVzaXJlZCBiYWNrZ3JvdW5kIHBhdHRlcm4gbnVtYmVyICgxLSVkKTsgdXNlZCB3aXRoXG4iCi0gICAgICAgICAgIlx0XHQgIHRyYW5zcGFyZW50IGltYWdlczsgb3ZlcnJpZGVzIC1iZ2NvbG9yIG9wdGlvblxuIgotICAgICAgICAgICIgICAgLXRpbWluZ1x0ZW5hYmxlcyBkZWxheSBmb3IgZXZlcnkgYmxvY2sgcmVhZCwgdG8gc2ltdWxhdGUgbW9kZW1cbiIKLSAgICAgICAgICAiXHRcdCAgZG93bmxvYWQgb2YgaW1hZ2UgKH4zNiBLYnBzKVxuIgotICAgICAgICAgICJcblByZXNzIFEsIEVzYyBvciBtb3VzZSBidXR0b24gMSBhZnRlciBpbWFnZSBpcyBkaXNwbGF5ZWQgdG8gcXVpdC5cbiIKLSNpZm5kZWYgX19DWUdXSU5fXwotICAgICAgICAgICJQcmVzcyBRIG9yIEVzYyB0byBxdWl0IHRoaXMgdXNhZ2Ugc2NyZWVuLiAiLAotI2Vsc2UKLSAgICAgICAgICAsCi0jZW5kaWYKLSAgICAgICAgICBQUk9HTkFNRSwKLSNpZiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKSAmJiBcCi0gICAgIShkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQotICAgICAgICAgIChpbnQpc3RybGVuKFBST0dOQU1FKSwgIiAiLAotI2VuZGlmCi0gICAgICAgICAgKGludClzdHJsZW4oUFJPR05BTUUpLCAiICIsIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCwgbnVtX2JncGF0KTsKLSAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0jaWZuZGVmIF9fQ1lHV0lOX18KLSAgICAgICAgZG8KLSAgICAgICAgICAgIGNoID0gX2dldGNoKCk7Ci0gICAgICAgIHdoaWxlIChjaCAhPSAncScgJiYgY2ggIT0gJ1EnICYmIGNoICE9IDB4MUIpOwotI2VuZGlmCi0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0KLSAgICBpZiAoIShpbmZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInJiIikpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgY2FuJ3Qgb3BlbiBQTkcgZmlsZSBbJXNdXG4iLCBmaWxlbmFtZSk7Ci0gICAgICAgICsrZXJyb3I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5jb3VudCA9IGZyZWFkKGluYnVmLCAxLCBJTkJVRlNJWkUsIGluZmlsZSk7Ci0gICAgICAgIGlmIChpbmNvdW50IDwgOCB8fCAhcmVhZHBuZzJfY2hlY2tfc2lnKGluYnVmLCA4KSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICI6ICBbJXNdIGlzIG5vdCBhIFBORyBmaWxlOiBpbmNvcnJlY3Qgc2lnbmF0dXJlXG4iLAotICAgICAgICAgICAgICBmaWxlbmFtZSk7Ci0gICAgICAgICAgICArK2Vycm9yOwotICAgICAgICB9IGVsc2UgaWYgKChyYyA9IHJlYWRwbmcyX2luaXQoJnJwbmcyX2luZm8pKSAhPSAwKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHJjKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICAgICAiOiAgWyVzXSBoYXMgYmFkIElIRFIgKGxpYnBuZyBsb25nam1wKVxuIiwgZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgaW5zdWZmaWNpZW50IG1lbW9yeVxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAgICAgICAgICI6ICB1bmtub3duIHJlYWRwbmcyX2luaXQoKSBlcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXJyb3IpCi0gICAgICAgICAgICBmY2xvc2UoaW5maWxlKTsKLSAgICB9Ci0KLQotICAgIGlmIChlcnJvcikgewotI2lmbmRlZiBfX0NZR1dJTl9fCi0gICAgICAgIGludCBjaDsKLSNlbmRpZgotCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgYWJvcnRpbmcuXG4iKTsKLSNpZm5kZWYgX19DWUdXSU5fXwotICAgICAgICBkbwotICAgICAgICAgICAgY2ggPSBfZ2V0Y2goKTsKLSAgICAgICAgd2hpbGUgKGNoICE9ICdxJyAmJiBjaCAhPSAnUScgJiYgY2ggIT0gMHgxQik7Ci0jZW5kaWYKLSAgICAgICAgZXhpdCgyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXMgJXM6ICAlc1xuIiwgUFJPR05BTUUsIFZFUlNJT04sIGFwcG5hbWUpOwotI2lmbmRlZiBfX0NZR1dJTl9fCi0gICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICJcbiAgIFtjb25zb2xlIHdpbmRvdzogIGNsb3NpbmcgdGhpcyB3aW5kb3cgd2lsbCB0ZXJtaW5hdGUgJXNdXG5cbiIsCi0gICAgICAgICAgUFJPR05BTUUpOwotI2VuZGlmCi0gICAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgIH0KLQotCi0gICAgLyogc2V0IHRoZSB0aXRsZS1iYXIgc3RyaW5nLCBidXQgbWFrZSBzdXJlIGJ1ZmZlciBkb2Vzbid0IG92ZXJmbG93ICovCi0KLSAgICBhbGVuID0gc3RybGVuKGFwcG5hbWUpOwotICAgIGZsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOwotICAgIGlmIChhbGVuICsgZmxlbiArIDMgPiAxMDIzKQotICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAuLi4lcyIsIGFwcG5hbWUsIGZpbGVuYW1lKyhhbGVuK2ZsZW4rNi0xMDIzKSk7Ci0gICAgZWxzZQotICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAlcyIsIGFwcG5hbWUsIGZpbGVuYW1lKTsKLQotCi0gICAgLyogc2V0IHNvbWUgZmluYWwgcnBuZzJfaW5mbyB2YXJpYWJsZXMgYmVmb3JlIGVudGVyaW5nIG1haW4gZGF0YSBsb29wICovCi0KLSAgICBpZiAoaGF2ZV9iZykgewotICAgICAgICB1bnNpZ25lZCByLCBnLCBiOyAgIC8qIHRoaXMgYXBwcm9hY2ggcXVpZXRzIGNvbXBpbGVyIHdhcm5pbmdzICovCi0KLSAgICAgICAgc3NjYW5mKGJnc3RyKzEsICIlMnglMnglMngiLCAmciwgJmcsICZiKTsKLSAgICAgICAgcnBuZzJfaW5mby5iZ19yZWQgICA9ICh1Y2gpcjsKLSAgICAgICAgcnBuZzJfaW5mby5iZ19ncmVlbiA9ICh1Y2gpZzsKLSAgICAgICAgcnBuZzJfaW5mby5iZ19ibHVlICA9ICh1Y2gpYjsKLSAgICB9IGVsc2UKLSAgICAgICAgcnBuZzJfaW5mby5uZWVkX2JnY29sb3IgPSBUUlVFOwotCi0gICAgcnBuZzJfaW5mby5zdGF0ZSA9IGtQcmVJbml0OwotICAgIHJwbmcyX2luZm8ubWFpbnByb2dfaW5pdCA9IHJwbmcyX3dpbl9pbml0OwotICAgIHJwbmcyX2luZm8ubWFpbnByb2dfZGlzcGxheV9yb3cgPSBycG5nMl93aW5fZGlzcGxheV9yb3c7Ci0gICAgcnBuZzJfaW5mby5tYWlucHJvZ19maW5pc2hfZGlzcGxheSA9IHJwbmcyX3dpbl9maW5pc2hfZGlzcGxheTsKLQotCi0gICAgLyogT0ssIHRoaXMgaXMgdGhlIGZ1biBwYXJ0OiAgY2FsbCByZWFkcG5nMl9kZWNvZGVfZGF0YSgpIGF0IHRoZSBzdGFydCBvZgotICAgICAqIHRoZSBsb29wIHRvIGRlYWwgd2l0aCBvdXIgZmlyc3QgYnVmZmVyIG9mIGRhdGEgKHJlYWQgaW4gYWJvdmUgdG8gdmVyaWZ5Ci0gICAgICogdGhhdCB0aGUgZmlsZSBpcyBhIFBORyBpbWFnZSksIHRoZW4gbG9vcCB0aHJvdWdoIHRoZSBmaWxlIGFuZCBjb250aW51ZQotICAgICAqIGNhbGxpbmcgdGhlIHNhbWUgcm91dGluZSB0byBoYW5kbGUgZWFjaCBjaHVuayBvZiBkYXRhLiAgSXQgaW4gdHVybgotICAgICAqIHBhc3NlcyB0aGUgZGF0YSB0byBsaWJwbmcsIHdoaWNoIHdpbGwgaW52b2tlIG9uZSBvciBtb3JlIG9mIG91ciBjYWxsLQotICAgICAqIGJhY2tzIGFzIGRlY29kZWQgZGF0YSBiZWNvbWUgYXZhaWxhYmxlLiAgV2Ugb3B0aW9uYWxseSBjYWxsIFNsZWVwKCkgZm9yCi0gICAgICogb25lIHNlY29uZCBwZXIgaXRlcmF0aW9uIHRvIHNpbXVsYXRlIGRvd25sb2FkaW5nIHRoZSBpbWFnZSB2aWEgYW4gYW5hbG9nCi0gICAgICogbW9kZW0uICovCi0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIFRyYWNlKChzdGRlcnIsICJhYm91dCB0byBjYWxsIHJlYWRwbmcyX2RlY29kZV9kYXRhKClcbiIpKQotICAgICAgICBpZiAocmVhZHBuZzJfZGVjb2RlX2RhdGEoJnJwbmcyX2luZm8sIGluYnVmLCBpbmNvdW50KSkKLSAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgIFRyYWNlKChzdGRlcnIsICJkb25lIHdpdGggcmVhZHBuZzJfZGVjb2RlX2RhdGEoKVxuIikpCi0KLSAgICAgICAgaWYgKGVycm9yIHx8IGluY291bnQgIT0gSU5CVUZTSVpFIHx8IHJwbmcyX2luZm8uc3RhdGUgPT0ga0RvbmUpIHsKLSAgICAgICAgICAgIGlmIChycG5nMl9pbmZvLnN0YXRlID09IGtEb25lKSB7Ci0gICAgICAgICAgICAgICAgVHJhY2UoKHN0ZGVyciwgImRvbmUgZGVjb2RpbmcgUE5HIGltYWdlXG4iKSkKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZmVycm9yKGluZmlsZSkpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICI6ICBlcnJvciB3aGlsZSByZWFkaW5nIFBORyBpbWFnZSBmaWxlXG4iKTsKLSAgICAgICAgICAgICAgICBleGl0KDMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmZW9mKGluZmlsZSkpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGVuZCBvZiBmaWxlIHJlYWNoZWQgIgotICAgICAgICAgICAgICAgICAgIih1bmV4cGVjdGVkbHkpIHdoaWxlIHJlYWRpbmcgUE5HIGltYWdlIGZpbGVcbiIpOwotICAgICAgICAgICAgICAgIGV4aXQoMyk7Ci0gICAgICAgICAgICB9IGVsc2UgLyogaWYgKGVycm9yKSAqLyB7Ci0gICAgICAgICAgICAgICAgLy8gd2lsbCBwcmludCBlcnJvciBtZXNzYWdlIGJlbG93Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aW1pbmcpCi0gICAgICAgICAgICBTbGVlcCgxMDAwTCk7Ci0KLSAgICAgICAgaW5jb3VudCA9IGZyZWFkKGluYnVmLCAxLCBJTkJVRlNJWkUsIGluZmlsZSk7Ci0gICAgfQotCi0KLSAgICAvKiBjbGVhbiB1cCBQTkcgc3R1ZmYgYW5kIHJlcG9ydCBhbnkgZGVjb2RpbmcgZXJyb3JzICovCi0KLSAgICBmY2xvc2UoaW5maWxlKTsKLSAgICBUcmFjZSgoc3RkZXJyLCAiYWJvdXQgdG8gY2FsbCByZWFkcG5nMl9jbGVhbnVwKClcbiIpKQotICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOwotCi0gICAgaWYgKGVycm9yKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgbGlicG5nIGVycm9yIHdoaWxlIGRlY29kaW5nIFBORyBpbWFnZVxuIik7Ci0gICAgICAgIGV4aXQoMyk7Ci0gICAgfQotCi0KLSAgICAvKiB3YWl0IGZvciB0aGUgdXNlciB0byB0ZWxsIHVzIHdoZW4gdG8gcXVpdCAqLwotCi0gICAgd2hpbGUgKEdldE1lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCkpIHsKLSAgICAgICAgVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKLSAgICAgICAgRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOwotICAgIH0KLQotCi0gICAgLyogd2UncmUgZG9uZTogIGNsZWFuIHVwIGFsbCBpbWFnZSBhbmQgV2luZG93cyByZXNvdXJjZXMgYW5kIGdvIGF3YXkgKi8KLQotICAgIFRyYWNlKChzdGRlcnIsICJhYm91dCB0byBjYWxsIHJwbmcyX3dpbl9jbGVhbnVwKClcbiIpKQotICAgIHJwbmcyX3dpbl9jbGVhbnVwKCk7Ci0KLSAgICByZXR1cm4gbXNnLndQYXJhbTsKLX0KLQotCi0KLQotCi0vKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSByZWFkcG5nMl9pbmZvX2NhbGxiYWNrKCkgaW4gcmVhZHBuZzIuYywgd2hpY2gKLSAqIGluIHR1cm4gaXMgY2FsbGVkIGJ5IGxpYnBuZyBhZnRlciBhbGwgb2YgdGhlIHByZS1JREFUIGNodW5rcyBoYXZlIGJlZW4KLSAqIHJlYWQgYW5kIHByb2Nlc3NlZC0taS5lLiwgd2Ugbm93IGhhdmUgZW5vdWdoIGluZm8gdG8gZmluaXNoIGluaXRpYWxpemluZyAqLwotCi1zdGF0aWMgdm9pZCBycG5nMl93aW5faW5pdCgpCi17Ci0gICAgdWxnIGk7Ci0gICAgdWxnIHJvd2J5dGVzID0gcnBuZzJfaW5mby5yb3dieXRlczsKLQotICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgcnBuZzJfd2luX2luaXQoKVxuIikpCi0gICAgVHJhY2UoKHN0ZGVyciwgIiAgcm93Ynl0ZXMgPSAlZFxuIiwgcnBuZzJfaW5mby5yb3dieXRlcykpCi0gICAgVHJhY2UoKHN0ZGVyciwgIiAgd2lkdGggID0gJWxkXG4iLCBycG5nMl9pbmZvLndpZHRoKSkKLSAgICBUcmFjZSgoc3RkZXJyLCAiICBoZWlnaHQgPSAlbGRcbiIsIHJwbmcyX2luZm8uaGVpZ2h0KSkKLQotICAgIHJwbmcyX2luZm8uaW1hZ2VfZGF0YSA9ICh1Y2ggKiltYWxsb2Mocm93Ynl0ZXMgKiBycG5nMl9pbmZvLmhlaWdodCk7Ci0gICAgaWYgKCFycG5nMl9pbmZvLmltYWdlX2RhdGEpIHsKLSAgICAgICAgcmVhZHBuZzJfY2xlYW51cCgmcnBuZzJfaW5mbyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBycG5nMl9pbmZvLnJvd19wb2ludGVycyA9ICh1Y2ggKiopbWFsbG9jKHJwbmcyX2luZm8uaGVpZ2h0ICogc2l6ZW9mKHVjaCAqKSk7Ci0gICAgaWYgKCFycG5nMl9pbmZvLnJvd19wb2ludGVycykgewotICAgICAgICBmcmVlKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSk7Ci0gICAgICAgIHJwbmcyX2luZm8uaW1hZ2VfZGF0YSA9IE5VTEw7Ci0gICAgICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLmhlaWdodDsgICsraSkKLSAgICAgICAgcnBuZzJfaW5mby5yb3dfcG9pbnRlcnNbaV0gPSBycG5nMl9pbmZvLmltYWdlX2RhdGEgKyBpKnJvd2J5dGVzOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIERvIHRoZSBiYXNpYyBXaW5kb3dzIGluaXRpYWxpemF0aW9uIHN0dWZmLCBtYWtlIHRoZSB3aW5kb3csIGFuZCBmaWxsIGl0Ci0gICAgd2l0aCB0aGUgdXNlci1zcGVjaWZpZWQsIGZpbGUtc3BlY2lmaWVkIG9yIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvci4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGlmIChycG5nMl93aW5fY3JlYXRlX3dpbmRvdygpKSB7Ci0gICAgICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcnBuZzJfaW5mby5zdGF0ZSA9IGtXaW5kb3dJbml0OwotfQotCi0KLQotCi0KLXN0YXRpYyBpbnQgcnBuZzJfd2luX2NyZWF0ZV93aW5kb3coKQotewotICAgIHVjaCBiZ19yZWQgICA9IHJwbmcyX2luZm8uYmdfcmVkOwotICAgIHVjaCBiZ19ncmVlbiA9IHJwbmcyX2luZm8uYmdfZ3JlZW47Ci0gICAgdWNoIGJnX2JsdWUgID0gcnBuZzJfaW5mby5iZ19ibHVlOwotICAgIHVjaCAqZGVzdDsKLSAgICBpbnQgZXh0cmFfd2lkdGgsIGV4dHJhX2hlaWdodDsKLSAgICB1bGcgaSwgajsKLSAgICBXTkRDTEFTU0VYIHduZGNsYXNzOwotICAgIFJFQ1QgcmVjdDsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGRpc3BsYXktc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgaW1hZ2UgKHJvdW5kIHVwCi0gICAgdG8gbXVsdGlwbGUgb2YgNCBmb3IgV2luZG93cyBESUIpLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgd2ltYWdlX3Jvd2J5dGVzID0gKCgzKnJwbmcyX2luZm8ud2lkdGggKyAzTCkgPj4gMikgPDwgMjsKLQotICAgIGlmICghKGRpYiA9ICh1Y2ggKiltYWxsb2Moc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbWFnZV9yb3dieXRlcypycG5nMl9pbmZvLmhlaWdodCkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDQ7ICAgLyogZmFpbCAqLwotICAgIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBJbml0aWFsaXplIHRoZSBESUIuICBOZWdhdGl2ZSBoZWlnaHQgbWVhbnMgdG8gdXNlIHRvcC1kb3duIEJNUCBvcmRlcmluZwotICAgIChtdXN0IGJlIHVuY29tcHJlc3NlZCwgYnV0IHRoYXQncyB3aGF0IHdlIHdhbnQpLiAgQml0IGNvdW50IG9mIDEsIDQgb3IgOAotICAgIGltcGxpZXMgYSBjb2xvcm1hcCBvZiBSR0JYIHF1YWRzLCBidXQgMjQtYml0IEJNUHMganVzdCB1c2UgQixHLFIgdmFsdWVzCi0gICAgZGlyZWN0bHkgPT4gd2ltYWdlX2RhdGEgYmVnaW5zIGltbWVkaWF0ZWx5IGFmdGVyIEJNUCBoZWFkZXIuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBtZW1zZXQoZGliLCAwLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOwotICAgIGJtaWggPSAoQklUTUFQSU5GT0hFQURFUiAqKWRpYjsKLSAgICBibWloLT5iaVNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7Ci0gICAgYm1paC0+YmlXaWR0aCA9IHJwbmcyX2luZm8ud2lkdGg7Ci0gICAgYm1paC0+YmlIZWlnaHQgPSAtKChsb25nKXJwbmcyX2luZm8uaGVpZ2h0KTsKLSAgICBibWloLT5iaVBsYW5lcyA9IDE7Ci0gICAgYm1paC0+YmlCaXRDb3VudCA9IDI0OwotICAgIGJtaWgtPmJpQ29tcHJlc3Npb24gPSAwOwotICAgIHdpbWFnZV9kYXRhID0gZGliICsgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEZpbGwgd2luZG93IHdpdGggdGhlIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yIChkZWZhdWx0IGlzIGJsYWNrKSwgYnV0Ci0gICAgZGVmZXIgbG9hZGluZyBmYWtlZCAiYmFja2dyb3VuZCBpbWFnZSIgdW50aWwgd2luZG93IGlzIGRpc3BsYXllZCAobWF5IGJlCi0gICAgc2xvdyB0byBjb21wdXRlKS4gIERhdGEgYXJlIGluIEJHUiBvcmRlci4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGlmIChiZ19pbWFnZSkgeyAgIC8qIGp1c3QgZmlsbCB3aXRoIGJsYWNrIGZvciBub3cgKi8KLSAgICAgICAgbWVtc2V0KHdpbWFnZV9kYXRhLCAwLCB3aW1hZ2Vfcm93Ynl0ZXMqcnBuZzJfaW5mby5oZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaiA9IDA7ICBqIDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK2opIHsKLSAgICAgICAgICAgIGRlc3QgPSB3aW1hZ2VfZGF0YSArIGoqd2ltYWdlX3Jvd2J5dGVzOwotICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX2JsdWU7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX2dyZWVuOwotICAgICAgICAgICAgICAgICpkZXN0KysgPSBiZ19yZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgU2V0IHRoZSB3aW5kb3cgcGFyYW1ldGVycy4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIG1lbXNldCgmd25kY2xhc3MsIDAsIHNpemVvZih3bmRjbGFzcykpOwotCi0gICAgd25kY2xhc3MuY2JTaXplID0gc2l6ZW9mKHduZGNsYXNzKTsKLSAgICB3bmRjbGFzcy5zdHlsZSA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOwotICAgIHduZGNsYXNzLmxwZm5XbmRQcm9jID0gcnBuZzJfd2luX3duZHByb2M7Ci0gICAgd25kY2xhc3MuaEluc3RhbmNlID0gZ2xvYmFsX2hJbnN0OwotICAgIHduZGNsYXNzLmhJY29uID0gTG9hZEljb24oTlVMTCwgSURJX0FQUExJQ0FUSU9OKTsKLSAgICB3bmRjbGFzcy5oQ3Vyc29yID0gTG9hZEN1cnNvcihOVUxMLCBJRENfQVJST1cpOwotICAgIHduZGNsYXNzLmhickJhY2tncm91bmQgPSAoSEJSVVNIKUdldFN0b2NrT2JqZWN0KERLR1JBWV9CUlVTSCk7Ci0gICAgd25kY2xhc3MubHBzek1lbnVOYW1lID0gTlVMTDsKLSAgICB3bmRjbGFzcy5scHN6Q2xhc3NOYW1lID0gcHJvZ25hbWU7Ci0gICAgd25kY2xhc3MuaEljb25TbSA9IExvYWRJY29uKE5VTEwsIElESV9BUFBMSUNBVElPTik7Ci0KLSAgICBSZWdpc3RlckNsYXNzRXgoJnduZGNsYXNzKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBGaW5hbGx5LCBjcmVhdGUgdGhlIHdpbmRvdy4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGV4dHJhX3dpZHRoICA9IDIqKEdldFN5c3RlbU1ldHJpY3MoU01fQ1hCT1JERVIpICsKLSAgICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYRExHRlJBTUUpKTsKLSAgICBleHRyYV9oZWlnaHQgPSAyKihHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQk9SREVSKSArCi0gICAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyhTTV9DWURMR0ZSQU1FKSkgKwotICAgICAgICAgICAgICAgICAgICAgIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lDQVBUSU9OKTsKLQotICAgIGdsb2JhbF9od25kID0gQ3JlYXRlV2luZG93KHByb2duYW1lLCB0aXRsZWJhciwgV1NfT1ZFUkxBUFBFRFdJTkRPVywKLSAgICAgIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsIHJwbmcyX2luZm8ud2lkdGgrZXh0cmFfd2lkdGgsCi0gICAgICBycG5nMl9pbmZvLmhlaWdodCtleHRyYV9oZWlnaHQsIE5VTEwsIE5VTEwsIGdsb2JhbF9oSW5zdCwgTlVMTCk7Ci0KLSAgICBTaG93V2luZG93KGdsb2JhbF9od25kLCBnbG9iYWxfc2hvd21vZGUpOwotICAgIFVwZGF0ZVdpbmRvdyhnbG9iYWxfaHduZCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgTm93IGNvbXB1dGUgdGhlIGJhY2tncm91bmQgaW1hZ2UgYW5kIGRpc3BsYXkgaXQuICBJZiBpdCBmYWlscyAobWVtb3J5Ci0gICAgYWxsb2NhdGlvbiksIHJldmVydCB0byBhIHBsYWluIGJhY2tncm91bmQgY29sb3IuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBpZiAoYmdfaW1hZ2UpIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKm1zZyA9ICJDb21wdXRpbmcgYmFja2dyb3VuZCBpbWFnZS4uLiI7Ci0gICAgICAgIGludCB4LCB5LCBsZW4gPSBzdHJsZW4obXNnKTsKLSAgICAgICAgSERDIGhkYyA9IEdldERDKGdsb2JhbF9od25kKTsKLSAgICAgICAgVEVYVE1FVFJJQyB0bTsKLQotICAgICAgICBHZXRUZXh0TWV0cmljcyhoZGMsICZ0bSk7Ci0gICAgICAgIHggPSAocnBuZzJfaW5mby53aWR0aCAtIGxlbip0bS50bUF2ZUNoYXJXaWR0aCkvMjsKLSAgICAgICAgeSA9IChycG5nMl9pbmZvLmhlaWdodCAtIHRtLnRtSGVpZ2h0KS8yOwotICAgICAgICBTZXRCa01vZGUoaGRjLCBUUkFOU1BBUkVOVCk7Ci0gICAgICAgIFNldFRleHRDb2xvcihoZGMsIEdldFN5c0NvbG9yKENPTE9SX0hJR0hMSUdIVFRFWFQpKTsKLSAgICAgICAgLyogdGhpcyBjYW4gc3RpbGwgYmVnaW4gb3V0IG9mIGJvdW5kcyBldmVuIGlmIHggaXMgcG9zaXRpdmUgKD8/Pyk6ICovCi0gICAgICAgIFRleHRPdXQoaGRjLCAoKHggPCAwKT8gMCA6IHgpLCAoKHkgPCAwKT8gMCA6IHkpLCBtc2csIGxlbik7Ci0gICAgICAgIFJlbGVhc2VEQyhnbG9iYWxfaHduZCwgaGRjKTsKLQotICAgICAgICBycG5nMl93aW5fbG9hZF9iZ19pbWFnZSgpOyAgIC8qIHJlc2V0cyBiZ19pbWFnZSBpZiBmYWlscyAqLwotICAgIH0KLQotICAgIGlmICghYmdfaW1hZ2UpIHsKLSAgICAgICAgZm9yIChqID0gMDsgIGogPCBycG5nMl9pbmZvLmhlaWdodDsgICsraikgewotICAgICAgICAgICAgZGVzdCA9IHdpbWFnZV9kYXRhICsgaip3aW1hZ2Vfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gYmdfYmx1ZTsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gYmdfZ3JlZW47Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX3JlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJlY3QubGVmdCA9IDBMOwotICAgIHJlY3QudG9wID0gMEw7Ci0gICAgcmVjdC5yaWdodCA9IChMT05HKXJwbmcyX2luZm8ud2lkdGg7ICAgICAgIC8qIHBvc3NpYmx5IG9mZiBieSBvbmU/ICovCi0gICAgcmVjdC5ib3R0b20gPSAoTE9ORylycG5nMl9pbmZvLmhlaWdodDsgICAgIC8qIHBvc3NpYmx5IG9mZiBieSBvbmU/ICovCi0gICAgSW52YWxpZGF0ZVJlY3QoZ2xvYmFsX2h3bmQsICZyZWN0LCBGQUxTRSk7Ci0gICAgVXBkYXRlV2luZG93KGdsb2JhbF9od25kKTsgICAgICAgICAgICAgICAgIC8qIHNpbWlsYXIgdG8gWEZsdXNoKCkgKi8KLQotICAgIHJldHVybiAwOwotCi19IC8qIGVuZCBmdW5jdGlvbiBycG5nMl93aW5fY3JlYXRlX3dpbmRvdygpICovCi0KLQotCi0KLQotc3RhdGljIGludCBycG5nMl93aW5fbG9hZF9iZ19pbWFnZSgpCi17Ci0gICAgdWNoICpzcmMsICpkZXN0OwotICAgIHVjaCByMSwgcjIsIGcxLCBnMiwgYjEsIGIyOwotICAgIHVjaCByMV9pbnYsIHIyX2ludiwgZzFfaW52LCBnMl9pbnYsIGIxX2ludiwgYjJfaW52OwotICAgIGludCBrLCBobWF4LCBtYXg7Ci0gICAgaW50IHhpZHgsIHlpZHgsIHlpZHhfbWF4ID0gKGJnc2NhbGUtMSk7Ci0gICAgaW50IGV2ZW5fb2RkX3ZlcnQsIGV2ZW5fb2RkX2hvcml6LCBldmVuX29kZDsKLSAgICBpbnQgaW52ZXJ0X2dyYWRpZW50MiA9IChiZ1twYXRdLnR5cGUgJiAweDA4KTsKLSAgICBpbnQgaW52ZXJ0X2NvbHVtbjsKLSAgICB1bGcgaSwgcm93OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEFsbG9jYXRlIGJ1ZmZlciBmb3IgZmFrZSBiYWNrZ3JvdW5kIGltYWdlIHRvIGJlIHVzZWQgd2l0aCB0cmFuc3BhcmVudAotICAgIGltYWdlczsgaWYgdGhpcyBmYWlscywgcmV2ZXJ0IHRvIHBsYWluIGJhY2tncm91bmQgY29sb3IuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBiZ19yb3dieXRlcyA9IDMgKiBycG5nMl9pbmZvLndpZHRoOwotICAgIGJnX2RhdGEgPSAodWNoICopbWFsbG9jKGJnX3Jvd2J5dGVzICogcnBuZzJfaW5mby5oZWlnaHQpOwotICAgIGlmICghYmdfZGF0YSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAiOiAgdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYmFja2dyb3VuZCBpbWFnZVxuIik7Ci0gICAgICAgIGJnX2ltYWdlID0gMDsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFZlcnRpY2FsIGdyYWRpZW50cyAocmFtcHMpIGluIE54TiBzcXVhcmVzLCBhbHRlcm5hdGluZyBkaXJlY3Rpb24gYW5kCi0gICAgY29sb3JzIChOID09IGJnc2NhbGUpLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAwKSB7Ci0gICAgICAgIHVjaCByMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLnI7Ci0gICAgICAgIHVjaCBnMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmc7Ci0gICAgICAgIHVjaCBiMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmI7Ci0gICAgICAgIHVjaCByMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLnI7Ci0gICAgICAgIHVjaCBnMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmc7Ci0gICAgICAgIHVjaCBiMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmI7Ci0gICAgICAgIGludCByMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLnIgLSByMV9taW47Ci0gICAgICAgIGludCBnMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmcgLSBnMV9taW47Ci0gICAgICAgIGludCBiMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmIgLSBiMV9taW47Ci0gICAgICAgIGludCByMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLnIgLSByMl9taW47Ci0gICAgICAgIGludCBnMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmcgLSBnMl9taW47Ci0gICAgICAgIGludCBiMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmIgLSBiMl9taW47Ci0KLSAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewotICAgICAgICAgICAgeWlkeCA9IHJvdyAlIGJnc2NhbGU7Ci0gICAgICAgICAgICBldmVuX29kZF92ZXJ0ID0gKHJvdyAvIGJnc2NhbGUpICYgMTsKLQotICAgICAgICAgICAgcjEgPSByMV9taW4gKyAocjFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBnMSA9IGcxX21pbiArIChnMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGIxID0gYjFfbWluICsgKGIxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgcjFfaW52ID0gcjFfbWluICsgKHIxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBnMV9pbnYgPSBnMV9taW4gKyAoZzFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGIxX2ludiA9IGIxX21pbiArIChiMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotCi0gICAgICAgICAgICByMiA9IHIyX21pbiArIChyMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGcyID0gZzJfbWluICsgKGcyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgYjIgPSBiMl9taW4gKyAoYjJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICByMl9pbnYgPSByMl9taW4gKyAocjJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGcyX2ludiA9IGcyX21pbiArIChnMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgYjJfaW52ID0gYjJfbWluICsgKGIyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0KLSAgICAgICAgICAgIGRlc3QgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwotICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7Ci0gICAgICAgICAgICAgICAgZXZlbl9vZGRfaG9yaXogPSAoaSAvIGJnc2NhbGUpICYgMTsKLSAgICAgICAgICAgICAgICBldmVuX29kZCA9IGV2ZW5fb2RkX3ZlcnQgXiBldmVuX29kZF9ob3JpejsKLSAgICAgICAgICAgICAgICBpbnZlcnRfY29sdW1uID0KLSAgICAgICAgICAgICAgICAgIChldmVuX29kZF9ob3JpeiAmJiAoYmdbcGF0XS50eXBlICYgMHgxMCkpOwotICAgICAgICAgICAgICAgIGlmIChldmVuX29kZCA9PSAwKSB7ICAgICAgICAgLyogZ3JhZGllbnQgIzEgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGludmVydF9jb2x1bW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMV9pbnY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzFfaW52OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIxX2ludjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgLyogZ3JhZGllbnQgIzIgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChpbnZlcnRfY29sdW1uICYmIGludmVydF9ncmFkaWVudDIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoIWludmVydF9jb2x1bW4gJiYgIWludmVydF9ncmFkaWVudDIpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjI7ICAgICAgICAvKiBub3QgaW52ZXJ0ZWQgb3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMjsgICAgICAgIC8qICBkb3VibHkgaW52ZXJ0ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMl9pbnY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzJfaW52OyAgICAvKiBzaW5nbHkgaW52ZXJ0ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMl9pbnY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBTb2Z0IGdyYWRpZW50LWRpYW1vbmRzIHdpdGggc2NhbGUgPSBiZ3NjYWxlLiAgQ29kZSBjb250cmlidXRlZCBieSBBZGFtCi0gICAgTS4gQ29zdGVsbG8uCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICB9IGVsc2UgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAxKSB7Ci0KLSAgICAgICAgaG1heCA9IChiZ3NjYWxlLTEpLzI7ICAgLyogaGFsZiB0aGUgbWF4IHdlaWdodCBvZiBhIGNvbG9yICovCi0gICAgICAgIG1heCA9IDIqaG1heDsgICAgICAgICAgIC8qIHRoZSBtYXggd2VpZ2h0IG9mIGEgY29sb3IgKi8KLQotICAgICAgICByMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5yOwotICAgICAgICBnMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5nOwotICAgICAgICBiMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iOwotICAgICAgICByMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5yOwotICAgICAgICBnMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5nOwotICAgICAgICBiMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iOwotCi0gICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHlpZHggPSByb3cgJSBiZ3NjYWxlOwotICAgICAgICAgICAgaWYgKHlpZHggPiBobWF4KQotICAgICAgICAgICAgICAgIHlpZHggPSBiZ3NjYWxlLTEgLSB5aWR4OwotICAgICAgICAgICAgZGVzdCA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKLSAgICAgICAgICAgICAgICB4aWR4ID0gaSAlIGJnc2NhbGU7Ci0gICAgICAgICAgICAgICAgaWYgKHhpZHggPiBobWF4KQotICAgICAgICAgICAgICAgICAgICB4aWR4ID0gYmdzY2FsZS0xIC0geGlkeDsKLSAgICAgICAgICAgICAgICBrID0geGlkeCArIHlpZHg7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKnIxICsgKG1heC1rKSpyMikgLyBtYXg7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKmcxICsgKG1heC1rKSpnMikgLyBtYXg7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKmIxICsgKG1heC1rKSpiMikgLyBtYXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBSYWRpYWwgInN0YXJidXJzdCIgd2l0aCBhemltdXRoYWwgc2ludXNvaWRzOyBbZXZlbnR1YWxseSBudW1iZXIgb2Ygc2ludS0KLSAgICBzb2lkcyB3aWxsIGVxdWFsIGJnc2NhbGU/XS4gIFRoaXMgb25lIGlzIHNsb3cgYnV0IHZlcnkgY29vbC4gIENvZGUgY29uLQotICAgIHRyaWJ1dGVkIGJ5IFBpZXRlciBTLiB2YW4gZGVyIE1ldWxlbiAob3JpZ2luYWxseSBpbiBTbWFsbHRhbGspLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgfSBlbHNlIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMikgewotICAgICAgICB1Y2ggY2g7Ci0gICAgICAgIGludCBpaSwgeCwgeSwgaHcsIGhoLCBncmF5c3BvdDsKLSAgICAgICAgZG91YmxlIGZyZXEsIHJvdGF0ZSwgc2F0dXJhdGUsIGdyYXksIGludGVuc2l0eTsKLSAgICAgICAgZG91YmxlIGFuZ2xlPTAuMCwgYW9mZnNldD0wLjAsIG1heERpc3QsIGRpc3Q7Ci0gICAgICAgIGRvdWJsZSByZWQ9MC4wLCBncmVlbj0wLjAsIGJsdWU9MC4wLCBodWUsIHMsIHYsIGYsIHAsIHEsIHQ7Ci0KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogIGNvbXB1dGluZyByYWRpYWwgYmFja2dyb3VuZC4uLiIsCi0gICAgICAgICAgUFJPR05BTUUpOwotICAgICAgICBmZmx1c2goc3RkZXJyKTsKLQotICAgICAgICBoaCA9IHJwbmcyX2luZm8uaGVpZ2h0IC8gMjsKLSAgICAgICAgaHcgPSBycG5nMl9pbmZvLndpZHRoIC8gMjsKLQotICAgICAgICAvKiB2YXJpYWJsZXMgZm9yIHJhZGlhbCB3YXZlczoKLSAgICAgICAgICogICBhb2Zmc2V0OiAgbnVtYmVyIG9mIGRlZ3JlZXMgdG8gcm90YXRlIGh1ZSBbQ1VSUkVOVExZIE5PVCBVU0VEXQotICAgICAgICAgKiAgIGZyZXE6ICBudW1iZXIgb2YgY29sb3IgYmVhbXMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgY2VudGVyCi0gICAgICAgICAqICAgZ3JheXNwb3Q6ICBzaXplIG9mIHRoZSBncmF5aW5nIGNlbnRlciBhcmVhIChhbnRpLWFsaWFzKQotICAgICAgICAgKiAgIHJvdGF0ZTogIHJvdGF0aW9uIG9mIHRoZSBiZWFtcyBhcyBhIGZ1bmN0aW9uIG9mIHJhZGl1cwotICAgICAgICAgKiAgIHNhdHVyYXRlOiAgc2F0dXJhdGlvbiBvZiBiZWFtcycgc2hhcGUgYXppbXV0aGFsbHkKLSAgICAgICAgICovCi0gICAgICAgIGFuZ2xlID0gQ0xJUChhbmdsZSwgMC4wLCAzNjAuMCk7Ci0gICAgICAgIGdyYXlzcG90ID0gQ0xJUChiZ1twYXRdLmJnX2dyYXksIDEsIChoaCArIGh3KSk7Ci0gICAgICAgIGZyZXEgPSBNQVgoKGRvdWJsZSliZ1twYXRdLmJnX2ZyZXEsIDAuMCk7Ci0gICAgICAgIHNhdHVyYXRlID0gKGRvdWJsZSliZ1twYXRdLmJnX2JzYXQgKiAwLjE7Ci0gICAgICAgIHJvdGF0ZSA9IChkb3VibGUpYmdbcGF0XS5iZ19icm90ICogMC4xOwotICAgICAgICBncmF5ID0gMC4wOwotICAgICAgICBpbnRlbnNpdHkgPSAwLjA7Ci0gICAgICAgIG1heERpc3QgPSAoZG91YmxlKSgoaHcqaHcpICsgKGhoKmhoKSk7Ci0KLSAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewotICAgICAgICAgICAgeSA9IHJvdyAtIGhoOwotICAgICAgICAgICAgZGVzdCA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKLSAgICAgICAgICAgICAgICB4ID0gaSAtIGh3OwotICAgICAgICAgICAgICAgIGFuZ2xlID0gKHggPT0gMCk/IFBJXzIgOiBhdGFuKChkb3VibGUpeSAvIChkb3VibGUpeCk7Ci0gICAgICAgICAgICAgICAgZ3JheSA9IChkb3VibGUpTUFYKEFCUyh5KSwgQUJTKHgpKSAvIGdyYXlzcG90OwotICAgICAgICAgICAgICAgIGdyYXkgPSBNSU4oMS4wLCBncmF5KTsKLSAgICAgICAgICAgICAgICBkaXN0ID0gKGRvdWJsZSkoKHgqeCkgKyAoeSp5KSkgLyBtYXhEaXN0OwotICAgICAgICAgICAgICAgIGludGVuc2l0eSA9IGNvcygoYW5nbGUrKHJvdGF0ZSpkaXN0KlBJKSkgKiBmcmVxKSAqCi0gICAgICAgICAgICAgICAgICBncmF5ICogc2F0dXJhdGU7Ci0gICAgICAgICAgICAgICAgaW50ZW5zaXR5ID0gKE1BWChNSU4oaW50ZW5zaXR5LDEuMCksLTEuMCkgKyAxLjApICogMC41OwotICAgICAgICAgICAgICAgIGh1ZSA9IChhbmdsZSArIFBJKSAqIElOVl9QSV8zNjAgKyBhb2Zmc2V0OwotICAgICAgICAgICAgICAgIHMgPSBncmF5ICogKChkb3VibGUpKEFCUyh4KStBQlMoeSkpIC8gKGRvdWJsZSkoaHcgKyBoaCkpOwotICAgICAgICAgICAgICAgIHMgPSBNSU4oTUFYKHMsMC4wKSwgMS4wKTsKLSAgICAgICAgICAgICAgICB2ID0gTUlOKE1BWChpbnRlbnNpdHksMC4wKSwgMS4wKTsKLQotICAgICAgICAgICAgICAgIGlmIChzID09IDAuMCkgewotICAgICAgICAgICAgICAgICAgICBjaCA9ICh1Y2gpKHYgKiAyNTUuMCk7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChodWUgPCAwLjApIHx8IChodWUgPj0gMzYwLjApKQotICAgICAgICAgICAgICAgICAgICAgICAgaHVlIC09ICgoKGludCkoaHVlIC8gMzYwLjApKSAqIDM2MC4wKTsKLSAgICAgICAgICAgICAgICAgICAgaHVlIC89IDYwLjA7Ci0gICAgICAgICAgICAgICAgICAgIGlpID0gKGludClodWU7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSBodWUgLSAoZG91YmxlKWlpOwotICAgICAgICAgICAgICAgICAgICBwID0gKDEuMCAtIHMpICogdjsKLSAgICAgICAgICAgICAgICAgICAgcSA9ICgxLjAgLSAocyAqIGYpKSAqIHY7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSAoMS4wIC0gKHMgKiAoMS4wIC0gZikpKSAqIHY7Ci0gICAgICAgICAgICAgICAgICAgIGlmICAgICAgKGlpID09IDApIHsgcmVkID0gdjsgZ3JlZW4gPSB0OyBibHVlID0gcDsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAxKSB7IHJlZCA9IHE7IGdyZWVuID0gdjsgYmx1ZSA9IHA7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMikgeyByZWQgPSBwOyBncmVlbiA9IHY7IGJsdWUgPSB0OyB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDMpIHsgcmVkID0gcDsgZ3JlZW4gPSBxOyBibHVlID0gdjsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSA0KSB7IHJlZCA9IHQ7IGdyZWVuID0gcDsgYmx1ZSA9IHY7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gNSkgeyByZWQgPSB2OyBncmVlbiA9IHA7IGJsdWUgPSBxOyB9Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShyZWQgKiAyNTUuMCk7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShncmVlbiAqIDI1NS4wKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKGJsdWUgKiAyNTUuMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZG9uZS5cbiIpOwotICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgQmxhc3QgYmFja2dyb3VuZCBpbWFnZSB0byBkaXNwbGF5IGJ1ZmZlciBiZWZvcmUgYmVnaW5uaW5nIFBORyBkZWNvZGU7Ci0gICAgY2FsbGluZyBmdW5jdGlvbiB3aWxsIGhhbmRsZSBpbnZhbGlkYXRpb24gYW5kIFVwZGF0ZVdpbmRvdygpIGNhbGwuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7Ci0gICAgICAgIHNyYyA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgIGRlc3QgPSB3aW1hZ2VfZGF0YSArIHJvdyp3aW1hZ2Vfcm93Ynl0ZXM7Ci0gICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgcjEgPSAqc3JjKys7Ci0gICAgICAgICAgICBnMSA9ICpzcmMrKzsKLSAgICAgICAgICAgIGIxID0gKnNyYysrOwotICAgICAgICAgICAgKmRlc3QrKyA9IGIxOwotICAgICAgICAgICAgKmRlc3QrKyA9IGcxOyAgIC8qIG5vdGUgcmV2ZXJzZSBvcmRlciAqLwotICAgICAgICAgICAgKmRlc3QrKyA9IHIxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci0KLX0gLyogZW5kIGZ1bmN0aW9uIHJwbmcyX3dpbl9sb2FkX2JnX2ltYWdlKCkgKi8KLQotCi0KLQotCi1zdGF0aWMgdm9pZCBycG5nMl93aW5fZGlzcGxheV9yb3codWxnIHJvdykKLXsKLSAgICB1Y2ggYmdfcmVkICAgPSBycG5nMl9pbmZvLmJnX3JlZDsKLSAgICB1Y2ggYmdfZ3JlZW4gPSBycG5nMl9pbmZvLmJnX2dyZWVuOwotICAgIHVjaCBiZ19ibHVlICA9IHJwbmcyX2luZm8uYmdfYmx1ZTsKLSAgICB1Y2ggKnNyYywgKnNyYzI9TlVMTCwgKmRlc3Q7Ci0gICAgdWNoIHIsIGcsIGIsIGE7Ci0gICAgdWxnIGk7Ci0gICAgc3RhdGljIGludCByb3dzPTA7Ci0gICAgc3RhdGljIHVsZyBmaXJzdHJvdzsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICByb3dzIGFuZCBmaXJzdHJvdyBzaW1wbHkgdHJhY2sgaG93IG1hbnkgcm93cyAoYW5kIHdoaWNoIG9uZXMpIGhhdmUgbm90Ci0gICAgeWV0IGJlZW4gZGlzcGxheWVkOyBhbHRlcm5hdGl2ZWx5LCB3ZSBjb3VsZCBjYWxsIEludmFsaWRhdGVSZWN0KCkgZm9yCi0gICAgZXZlcnkgcm93IGFuZCBub3QgYm90aGVyIHdpdGggdGhlIHJlY29yZHMta2VlcGluZy4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgcnBuZzJfd2luX2Rpc3BsYXlfcm93KClcbiIpKQotCi0gICAgaWYgKHJvd3MgPT0gMCkKLSAgICAgICAgZmlyc3Ryb3cgPSByb3c7ICAgLyogZmlyc3Qgcm93IG5vdCB5ZXQgZGlzcGxheWVkICovCi0KLSAgICArK3Jvd3M7ICAgLyogY291bnQgb2Ygcm93cyByZWNlaXZlZCBidXQgbm90IHlldCBkaXNwbGF5ZWQgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBBc2lkZSBmcm9tIHRoZSB1c2Ugb2YgdGhlIHJwbmcyX2luZm8gc3RydWN0IGFuZCB0aGUgbGFjayBvZiBhbiBvdXRlcgotICAgIGxvb3AgKG92ZXIgcm93cyksIHRoaXMgcm91dGluZSBpcyBpZGVudGljYWwgdG8gcnBuZ193aW5fZGlzcGxheV9pbWFnZSgpCi0gICAgaW4gdGhlIG5vbi1wcm9ncmVzc2l2ZSB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgc3JjID0gcnBuZzJfaW5mby5pbWFnZV9kYXRhICsgcm93KnJwbmcyX2luZm8ucm93Ynl0ZXM7Ci0gICAgaWYgKGJnX2ltYWdlKQotICAgICAgICBzcmMyID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKLSAgICBkZXN0ID0gd2ltYWdlX2RhdGEgKyByb3cqd2ltYWdlX3Jvd2J5dGVzOwotCi0gICAgaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gMykgewotICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgIHIgPSAqc3JjKys7Ci0gICAgICAgICAgICBnID0gKnNyYysrOwotICAgICAgICAgICAgYiA9ICpzcmMrKzsKLSAgICAgICAgICAgICpkZXN0KysgPSBiOwotICAgICAgICAgICAgKmRlc3QrKyA9IGc7ICAgLyogbm90ZSByZXZlcnNlIG9yZGVyICovCi0gICAgICAgICAgICAqZGVzdCsrID0gcjsKLSAgICAgICAgfQotICAgIH0gZWxzZSAvKiBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSA0KSAqLyB7Ci0gICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgciA9ICpzcmMrKzsKLSAgICAgICAgICAgIGcgPSAqc3JjKys7Ci0gICAgICAgICAgICBiID0gKnNyYysrOwotICAgICAgICAgICAgYSA9ICpzcmMrKzsKLSAgICAgICAgICAgIGlmIChiZ19pbWFnZSkgewotICAgICAgICAgICAgICAgIGJnX3JlZCAgID0gKnNyYzIrKzsKLSAgICAgICAgICAgICAgICBiZ19ncmVlbiA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgYmdfYmx1ZSAgPSAqc3JjMisrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IGI7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IGc7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IHI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgewotICAgICAgICAgICAgICAgICpkZXN0KysgPSBiZ19ibHVlOwotICAgICAgICAgICAgICAgICpkZXN0KysgPSBiZ19ncmVlbjsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gYmdfcmVkOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChjb3BpZWQgZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUKLSAgICAgICAgICAgICAgICAgKiBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUKLSAgICAgICAgICAgICAgICAgKiByZXN1bHQgaW50byB0aGUgZmlyc3QgYXJndW1lbnQ7IHRoZXJlIGFyZSBubwotICAgICAgICAgICAgICAgICAqIHNpZGUgZWZmZWN0cyB3aXRoIHRoZSBmaXJzdCBhcmd1bWVudCAqLwotICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZSgqZGVzdCsrLCBiLCBhLCBiZ19ibHVlKTsKLSAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoKmRlc3QrKywgZywgYSwgYmdfZ3JlZW4pOwotICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZSgqZGVzdCsrLCByLCBhLCBiZ19yZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIERpc3BsYXkgYWZ0ZXIgZXZlcnkgMTYgcm93cyBvciB3aGVuIG9uIGxhc3Qgcm93LiAgKFJlZ2lvbiBtYXkgaW5jbHVkZQotICAgIHByZXZpb3VzbHkgZGlzcGxheWVkIGxpbmVzIGR1ZSB0byBpbnRlcmxhY2luZy0taS5lLiwgbm90IGNvbnRpZ3VvdXMuKQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKChyb3dzICYgMHhmKSA9PSAwIHx8IHJvdyA9PSBycG5nMl9pbmZvLmhlaWdodC0xKSB7Ci0gICAgICAgIFJFQ1QgcmVjdDsKLQotICAgICAgICByZWN0LmxlZnQgPSAwTDsKLSAgICAgICAgcmVjdC50b3AgPSAoTE9ORylmaXJzdHJvdzsKLSAgICAgICAgcmVjdC5yaWdodCA9IChMT05HKXJwbmcyX2luZm8ud2lkdGg7ICAgICAgIC8qIHBvc3NpYmx5IG9mZiBieSBvbmU/ICovCi0gICAgICAgIHJlY3QuYm90dG9tID0gKExPTkcpcm93ICsgMUw7ICAgICAgICAgICAgICAvKiBwb3NzaWJseSBvZmYgYnkgb25lPyAqLwotICAgICAgICBJbnZhbGlkYXRlUmVjdChnbG9iYWxfaHduZCwgJnJlY3QsIEZBTFNFKTsKLSAgICAgICAgVXBkYXRlV2luZG93KGdsb2JhbF9od25kKTsgICAgICAgICAgICAgICAgIC8qIHNpbWlsYXIgdG8gWEZsdXNoKCkgKi8KLSAgICAgICAgcm93cyA9IDA7Ci0gICAgfQotCi19IC8qIGVuZCBmdW5jdGlvbiBycG5nMl93aW5fZGlzcGxheV9yb3coKSAqLwotCi0KLQotCi0KLXN0YXRpYyB2b2lkIHJwbmcyX3dpbl9maW5pc2hfZGlzcGxheSgpCi17Ci0gICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBycG5nMl93aW5fZmluaXNoX2Rpc3BsYXkoKVxuIikpCi0KLSAgICAvKiBsYXN0IHJvdyBoYXMgYWxyZWFkeSBiZWVuIGRpc3BsYXllZCBieSBycG5nMl93aW5fZGlzcGxheV9yb3coKSwgc28KLSAgICAgKiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8gaGVyZSBleGNlcHQgc2V0IGEgZmxhZyBhbmQgbGV0IHRoZSB1c2VyIGtub3cKLSAgICAgKiB0aGF0IHRoZSBpbWFnZSBpcyBkb25lICovCi0KLSAgICBycG5nMl9pbmZvLnN0YXRlID0ga0RvbmU7Ci0gICAgcHJpbnRmKAotI2lmbmRlZiBfX0NZR1dJTl9fCi0gICAgICAiRG9uZS4gIFByZXNzIFEsIEVzYyBvciBtb3VzZSBidXR0b24gMSAod2l0aGluIGltYWdlIHdpbmRvdykgdG8gcXVpdC5cbiIKLSNlbHNlCi0gICAgICAiRG9uZS4gIFByZXNzIG1vdXNlIGJ1dHRvbiAxICh3aXRoaW4gaW1hZ2Ugd2luZG93KSB0byBxdWl0LlxuIgotI2VuZGlmCi0gICAgKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLX0KLQotCi0KLQotCi1zdGF0aWMgdm9pZCBycG5nMl93aW5fY2xlYW51cCgpCi17Ci0gICAgaWYgKGJnX2ltYWdlICYmIGJnX2RhdGEpIHsKLSAgICAgICAgZnJlZShiZ19kYXRhKTsKLSAgICAgICAgYmdfZGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSkgewotICAgICAgICBmcmVlKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSk7Ci0gICAgICAgIHJwbmcyX2luZm8uaW1hZ2VfZGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHJwbmcyX2luZm8ucm93X3BvaW50ZXJzKSB7Ci0gICAgICAgIGZyZWUocnBuZzJfaW5mby5yb3dfcG9pbnRlcnMpOwotICAgICAgICBycG5nMl9pbmZvLnJvd19wb2ludGVycyA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGRpYikgewotICAgICAgICBmcmVlKGRpYik7Ci0gICAgICAgIGRpYiA9IE5VTEw7Ci0gICAgfQotfQotCi0KLQotCi0KLUxSRVNVTFQgQ0FMTEJBQ0sgcnBuZzJfd2luX3duZHByb2MoSFdORCBod25kLCBVSU5UIGlNc2csIFdQQVJBTSB3UCwgTFBBUkFNIGxQKQotewotICAgIEhEQyAgICAgICAgIGhkYzsKLSAgICBQQUlOVFNUUlVDVCBwczsKLSAgICBpbnQgcmM7Ci0KLSAgICBzd2l0Y2ggKGlNc2cpIHsKLSAgICAgICAgY2FzZSBXTV9DUkVBVEU6Ci0gICAgICAgICAgICAvKiBvbmUtdGltZSBwcm9jZXNzaW5nIGhlcmUsIGlmIGFueSAqLwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgY2FzZSBXTV9QQUlOVDoKLSAgICAgICAgICAgIGhkYyA9IEJlZ2luUGFpbnQoaHduZCwgJnBzKTsKLSAgICAgICAgICAgIHJjID0gU3RyZXRjaERJQml0cyhoZGMsIDAsIDAsIHJwbmcyX2luZm8ud2lkdGgsIHJwbmcyX2luZm8uaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgcnBuZzJfaW5mby53aWR0aCwgcnBuZzJfaW5mby5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW1hZ2VfZGF0YSwgKEJJVE1BUElORk8gKilibWloLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU1JDQ09QWSk7Ci0gICAgICAgICAgICBFbmRQYWludChod25kLCAmcHMpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgLyogd2FpdCBmb3IgdGhlIHVzZXIgdG8gdGVsbCB1cyB3aGVuIHRvIHF1aXQgKi8KLSAgICAgICAgY2FzZSBXTV9DSEFSOgotICAgICAgICAgICAgc3dpdGNoICh3UCkgeyAgICAgICAvKiBvbmx5IG5lZWQgb25lLCBzbyBpZ25vcmUgcmVwZWF0IGNvdW50ICovCi0gICAgICAgICAgICAgICAgY2FzZSAncSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnUSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAweDFCOiAgICAgIC8qIEVzYyBrZXkgKi8KLSAgICAgICAgICAgICAgICAgICAgUG9zdFF1aXRNZXNzYWdlKDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjogICAgLyogYW5vdGhlciB3YXkgb2YgcXVpdHRpbmcgKi8KLSAgICAgICAgY2FzZSBXTV9ERVNUUk9ZOgotICAgICAgICAgICAgUG9zdFF1aXRNZXNzYWdlKDApOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIERlZldpbmRvd1Byb2MoaHduZCwgaU1zZywgd1AsIGxQKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9ycG5nMi14LmMgYi9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcnBuZzIteC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzhlYzBiLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9ycG5nMi14LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTA5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHJwbmcyIC0gcHJvZ3Jlc3NpdmUtbW9kZWwgUE5HIGRpc3BsYXkgcHJvZ3JhbSAgICAgICAgICAgICAgICAgIHJwbmcyLXguYwotCi0gICBUaGlzIHByb2dyYW0gZGVjb2RlcyBhbmQgZGlzcGxheXMgUE5HIGZpbGVzIHByb2dyZXNzaXZlbHksIGFzIGlmIGl0IHdlcmUKLSAgIGEgd2ViIGJyb3dzZXIgKHRob3VnaCB0aGUgZnJvbnQgZW5kIGlzIG9ubHkgc2V0IHVwIHRvIHJlYWQgZnJvbSBmaWxlcykuCi0gICBJdCBzdXBwb3J0cyBnYW1tYSBjb3JyZWN0aW9uLCB1c2VyLXNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9ycywgYW5kIHVzZXItCi0gICBzcGVjaWZpZWQgYmFja2dyb3VuZCBwYXR0ZXJucyAoZm9yIHRyYW5zcGFyZW50IGltYWdlcykuICBUaGlzIHZlcnNpb24gaXMKLSAgIGZvciB0aGUgWCBXaW5kb3cgU3lzdGVtICh0ZXN0ZWQgYnkgdGhlIGF1dGhvciB1bmRlciBVbml4IGFuZCBieSBNYXJ0aW4KLSAgIFppbnNlciB1bmRlciBPcGVuVk1TOyBtYXkgd29yayB1bmRlciBPUy8yIHdpdGggYSBsaXR0bGUgdHdlYWtpbmcpLgotCi0gICBUaGFua3MgdG8gQWRhbSBDb3N0ZWxsbyBhbmQgUGlldGVyIFMuIHZhbiBkZXIgTWV1bGVuIGZvciB0aGUgImRpYW1vbmQiCi0gICBhbmQgInJhZGlhbCB3YXZlcyIgcGF0dGVybnMsIHJlc3BlY3RpdmVseS4KLQotICAgdG8gZG8gKHNvbWVkYXksIG1heWJlKToKLSAgICAtIGZpeCBleHBvc2UvcmVkcmF3IGNvZGU6ICBkb24ndCBkcmF3IGVudGlyZSByb3cgaWYgb25seSBwYXJ0IGV4cG9zZWQKLSAgICAtIDgtYml0IChjb2xvcm1hcHBlZCkgWCBzdXBwb3J0Ci0gICAgLSBmaW5pc2ggcmVzaXphYmxlIGNoZWNrZXJib2FyZC1ncmFkaWVudCAoc2l6ZXMgNC0xMjg/KQotICAgIC0gdXNlICUuMTAyM3MgdG8gc2ltcGxpZnkgdHJ1bmNhdGlvbiBvZiB0aXRsZS1iYXIgc3RyaW5nPwotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBDaGFuZ2Vsb2c6Ci0gICAgLSAxLjAxOiAgaW5pdGlhbCBwdWJsaWMgcmVsZWFzZQotICAgIC0gMS4wMjogIG1vZGlmaWVkIHRvIGFsbG93IGFiYnJldmlhdGVkIG9wdGlvbnM7IGZpeGVkIGNoYXIvdWNoYXIgbWlzbWF0Y2gKLSAgICAtIDEuMTA6ICBhZGRlZCBzdXBwb3J0IGZvciBub24tZGVmYXVsdCB2aXN1YWxzOyBmaXhlZCBYIHBpeGVsLWNvbnZlcnNpb24KLSAgICAtIDEuMTE6ICBhZGRlZCAtdXNsZWVwIG9wdGlvbiBmb3IgZGVtb3M7IGZpeGVkIGNvbW1hbmQtbGluZSBwYXJzaW5nIGJ1ZwotICAgIC0gMS4xMjogIGFkZGVkIC1wYXVzZSBvcHRpb24gZm9yIGRlbW9zIGFuZCB0ZXN0aW5nCi0gICAgLSAxLjIwOiAgYWRkZWQgcnVudGltZSBNTVgtZW5hYmxpbmcvZGlzYWJsaW5nIGFuZCBuZXcgLW1teCogb3B0aW9ucwotICAgIC0gMS4yMTogIGZpeGVkIHNvbWUgc21hbGwgWCBtZW1vcnkgbGVha3MgKHRoYW5rcyB0byBGcmFu529pcyBQZXRpdGplYW4pCi0gICAgLSAxLjIyOiAgZml4ZWQgWEZyZWVHQygpIGNyYXNoIGJ1ZyAodGhhbmtzIHRvIFBhdHJpY2sgV2VsY2hlKQotICAgIC0gMS4yMzogIGFkZGVkIC1iZ3BhdCAwIG1vZGUgKHN0ZCB3aGl0ZS9ncmF5IGNoZWNrZXJib2FyZCwgOHg4IHNxdWFyZXMpCi0gICAgLSAxLjMwOiAgYWRkZWQgLWxvb3Agb3B0aW9uIGZvciAtYmdwYXQgKGlmZGVmIEZFQVRVUkVfTE9PUCk7IGZpeGVkIGJwcCA9Ci0gICAgICAgICAgICAgIDI0OyBhZGRlZCBzdXBwb3J0IGZvciBYIHJlc291cmNlcyAodGhhbmtzIHRvIEdlcmhhcmQgTmlrbGFzY2gpCi0gICAgLSAxLjMxOiAgYWRkZWQgY29kZSB0byBza2lwIHVudXNlZCBjaHVua3MgKHRoYW5rcyB0byBHbGVubiBSYW5kZXJzLVBlaHJzb24pCi0gICAgLSAxLjMyOiAgYWRkZWQgQU1ENjQvRU02NFQgc3VwcG9ydCAoX194ODZfNjRfXyk7IGFkZGVkIGJhc2ljIGV4cG9zZS9yZWRyYXcKLSAgICAgICAgICAgICAgaGFuZGxpbmcKLSAgICAtIDIuMDA6ICBkdWFsLWxpY2Vuc2VkIChhZGRlZCBHTlUgR1BMKQotICAgIC0gMi4wMTogIGZpeGVkIDY0LWJpdCB0eXBvIGluIHJlYWRwbmcyLmM7IGZpeGVkIC1wYXVzZSB1c2FnZSBkZXNjcmlwdGlvbgotICAgIC0gMi4wMjogIGZpeGVkIGltcHJvcGVyIGRpc3BsYXkgb2YgdXNhZ2Ugc2NyZWVuIG9uIFBORyBlcnJvcihzKTsgZml4ZWQKLSAgICAgICAgICAgICAgdW5leHBlY3RlZC1FT0YgYW5kIGZpbGUtcmVhZC1lcnJvciBjYXNlczsgZml4ZWQgVHJhY2UoKSBjdXQtYW5kLQotICAgICAgICAgICAgICBwYXN0ZSBidWdzCi0gICAgLSAyLjAzOiAgZGVsZXRlZCBydW50aW1lIE1NWC1lbmFibGluZy9kaXNhYmxpbmcgYW5kIG9ic29sZXRlIC1tbXgqIG9wdGlvbnMKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDggR3JlZyBSb2Vsb2ZzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMsIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLAotICAgICAgZXhwcmVzcyBvciBpbXBsaWVkLiAgSW4gbm8gZXZlbnQgc2hhbGwgdGhlIGF1dGhvciBvciBjb250cmlidXRvcnMKLSAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCi0gICAgICB0aGlzIHNvZnR3YXJlLgotCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCi0gICAgICByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIG9uZSBvZiB0aGUKLSAgICAgIGZvbGxvd2luZyB0d28gbGljZW5zZXMgKGF0IHlvdXIgb3B0aW9uKToKLQotCi0gICAgICBMSUNFTlNFIDEgKCJCU0QtbGlrZSB3aXRoIGFkdmVydGlzaW5nIGNsYXVzZSIpOgotCi0gICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgICAgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUKLSAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgotICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGEtCi0gICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gICAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLQotICAgICAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBHcmVnIFJvZWxvZnMKLSAgICAgICAgICAgIGFuZCBjb250cmlidXRvcnMgZm9yIHRoZSBib29rLCAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiCi0gICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCi0KLQotICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICAgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBQUk9HTkFNRSAgInJwbmcyLXgiCi0jZGVmaW5lIExPTkdOQU1FICAiUHJvZ3Jlc3NpdmUgUE5HIFZpZXdlciBmb3IgWCIKLSNkZWZpbmUgVkVSU0lPTiAgICIyLjAzIG9mIDI1IEZlYnJ1YXJ5IDIwMTAiCi0jZGVmaW5lIFJFU05BTUUgICAicnBuZzIiCS8qIG91ciBYIHJlc291cmNlIGFwcGxpY2F0aW9uIG5hbWUgKi8KLSNkZWZpbmUgUkVTQ0xBU1MgICJScG5nIgkvKiBvdXIgWCByZXNvdXJjZSBjbGFzcyBuYW1lICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c2V0am1wLmg+ICAgICAgIC8qIGZvciBqbXBidWYgZGVjbGFyYXRpb24gaW4gcmVhZHBuZzIuaCAqLwotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxtYXRoLmg+ICAgICAgICAgLyogb25seSBmb3IgUHZkTSBiYWNrZ3JvdW5kIGNvZGUgKi8KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgotI2luY2x1ZGUgPFgxMS9Yb3MuaD4KLSNpbmNsdWRlIDxYMTEva2V5c3ltLmg+ICAgLyogZGVmaW5lcyBYS18qIG1hY3JvcyAqLwotCi0jaWZkZWYgVk1TCi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0vKiBhbGwgZm9yIFB2ZE0gYmFja2dyb3VuZCBjb2RlOiAqLwotI2lmbmRlZiBQSQotIyAgZGVmaW5lIFBJICAgICAgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4Ci0jZW5kaWYKLSNkZWZpbmUgUElfMiAgICAgICAgICAgICAoUEkqMC41KQotI2RlZmluZSBJTlZfUElfMzYwICAgICAgICgzNjAuMCAvIFBJKQotI2RlZmluZSBNQVgoYSxiKSAgICAgICAgIChhPmI/YTpiKQotI2RlZmluZSBNSU4oYSxiKSAgICAgICAgIChhPGI/YTpiKQotI2RlZmluZSBDTElQKGEsbWluLG1heCkgIE1BWChtaW4sTUlOKChhKSxtYXgpKQotI2RlZmluZSBBQlMoYSkgICAgICAgICAgICgoYSk8MD8tKGEpOihhKSkKLSNkZWZpbmUgQ0xJUDhQKGMpICAgICAgICBNQVgoMCwoTUlOKChjKSwyNTUpKSkgICAvKiA4LWJpdCBwb3MuIGludGVnZXIgKHVjaCkgKi8KLSNkZWZpbmUgUk9VTkRGKGYpICAgICAgICAoKGludCkoZiArIDAuNSkpCi0KLSNkZWZpbmUgUVVJVChlLGspICgoZS50eXBlID09IEJ1dHRvblByZXNzICYmIGUueGJ1dHRvbi5idXR0b24gPT0gQnV0dG9uMSkgfHwgIFwKLSAgICAgICAgICAgICAgICAgIChlLnR5cGUgPT0gS2V5UHJlc3MgJiYgICAvKiAgdi0tLSBvciAxIGZvciBzaGlmdGVkIGtleXMgKi8gIFwKLSAgICAgICAgICAgICAgICAgICgoayA9IFhMb29rdXBLZXlzeW0oJmUueGtleSwgMCkpID09IFhLX3EgfHwgayA9PSBYS19Fc2NhcGUpKSkKLQotI2RlZmluZSBOT18yNEJJVF9NQVNLUwkvKiB1bmRlZiBjYXNlIG5vdCBmdWxseSB3cml0dGVuLS1vbmx5IGZvciByZWRpc3BsYXkoKSAqLwotCi0jZGVmaW5lIHJnYjFfbWF4ICAgYmdfZnJlcQotI2RlZmluZSByZ2IxX21pbiAgIGJnX2dyYXkKLSNkZWZpbmUgcmdiMl9tYXggICBiZ19ic2F0Ci0jZGVmaW5lIHJnYjJfbWluICAgYmdfYnJvdAotCi0vKiAjZGVmaW5lIERFQlVHICovICAgICAvKiB0aGlzIGVuYWJsZXMgdGhlIFRyYWNlKCkgbWFjcm9zICovCi0KLSNpbmNsdWRlICJyZWFkcG5nMi5oIiAgIC8qIHR5cGVkZWZzLCBjb21tb24gbWFjcm9zLCByZWFkcG5nMiBwcm90b3R5cGVzICovCi0KLQotLyogY291bGQganVzdCBpbmNsdWRlIHBuZy5oLCBidXQgdGhpcyBtYWNybyBpcyB0aGUgb25seSB0aGluZyB3ZSBuZWVkCi0gKiAobmFtZSBhbmQgdHlwZWRlZnMgY2hhbmdlZCB0byBsb2NhbCB2ZXJzaW9ucyk7IG5vdGUgdGhhdCBzaWRlIGVmZmVjdHMKLSAqIG9ubHkgaGFwcGVuIHdpdGggYWxwaGEgKHdoaWNoIGNvdWxkIGVhc2lseSBiZSBhdm9pZGVkIHdpdGgKLSAqICJ1c2ggYWNvcHkgPSAoYWxwaGEpOyIpICovCi0KLSNkZWZpbmUgYWxwaGFfY29tcG9zaXRlKGNvbXBvc2l0ZSwgZmcsIGFscGhhLCBiZykgeyAgICAgICAgICAgICAgIFwKLSAgICB1c2ggdGVtcCA9ICgodXNoKShmZykqKHVzaCkoYWxwaGEpICsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAodXNoKShiZykqKHVzaCkoMjU1IC0gKHVzaCkoYWxwaGEpKSArICh1c2gpMTI4KTsgIFwKLSAgICAoY29tcG9zaXRlKSA9ICh1Y2gpKCh0ZW1wICsgKHRlbXAgPj4gOCkpID4+IDgpOyAgICAgICAgICAgICAgIFwKLX0KLQotCi0jZGVmaW5lIElOQlVGU0laRSA0MDk2ICAgLyogd2l0aCBwc2V1ZG8tdGltaW5nIG9uICgxIHNlYyBkZWxheS9ibG9jayksIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgYmxvY2sgc2l6ZSBjb3JyZXNwb25kcyByb3VnaGx5IHRvIGEgZG93bmxvYWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgc3BlZWQgMTAlIGZhc3RlciB0aGFuIHRoZW9yZXRpY2FsIDMzLjZLIG1heGltdW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgKGFzc3VtaW5nIDggZGF0YSBiaXRzLCAxIHN0b3AgYml0IGFuZCBubyBvdGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAqICBvdmVyaGVhZCkgKi8KLQotLyogbG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHZvaWQgcnBuZzJfeF9pbml0ICh2b2lkKTsKLXN0YXRpYyBpbnQgIHJwbmcyX3hfY3JlYXRlX3dpbmRvdyAodm9pZCk7Ci1zdGF0aWMgaW50ICBycG5nMl94X2xvYWRfYmdfaW1hZ2UgKHZvaWQpOwotc3RhdGljIHZvaWQgcnBuZzJfeF9kaXNwbGF5X3JvdyAodWxnIHJvdyk7Ci1zdGF0aWMgdm9pZCBycG5nMl94X2ZpbmlzaF9kaXNwbGF5ICh2b2lkKTsKLXN0YXRpYyB2b2lkIHJwbmcyX3hfcmVkaXNwbGF5X2ltYWdlICh1bGcgc3RhcnRjb2wsIHVsZyBzdGFydHJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bGcgd2lkdGgsIHVsZyBoZWlnaHQpOwotI2lmZGVmIEZFQVRVUkVfTE9PUAotc3RhdGljIHZvaWQgcnBuZzJfeF9yZWxvYWRfYmdfaW1hZ2UgKHZvaWQpOwotc3RhdGljIGludCAgaXNfbnVtYmVyIChjaGFyICpwKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgcnBuZzJfeF9jbGVhbnVwICh2b2lkKTsKLXN0YXRpYyBpbnQgIHJwbmcyX3hfbXNiICh1bGcgdTMydmFsKTsKLQotCi1zdGF0aWMgY2hhciB0aXRsZWJhclsxMDI0XSwgKndpbmRvd19uYW1lID0gdGl0bGViYXI7Ci1zdGF0aWMgY2hhciAqYXBwbmFtZSA9IExPTkdOQU1FOwotc3RhdGljIGNoYXIgKmljb25fbmFtZSA9IFBST0dOQU1FOwotc3RhdGljIGNoYXIgKnJlc19uYW1lID0gUkVTTkFNRTsKLXN0YXRpYyBjaGFyICpyZXNfY2xhc3MgPSBSRVNDTEFTUzsKLXN0YXRpYyBjaGFyICpmaWxlbmFtZTsKLXN0YXRpYyBGSUxFICppbmZpbGU7Ci0KLXN0YXRpYyBtYWlucHJvZ19pbmZvIHJwbmcyX2luZm87Ci0KLXN0YXRpYyB1Y2ggaW5idWZbSU5CVUZTSVpFXTsKLXN0YXRpYyBpbnQgaW5jb3VudDsKLQotc3RhdGljIGludCBwYXQgPSA2OyAgICAgICAgLyogbXVzdCBiZSBsZXNzIHRoYW4gbnVtX2JncGF0ICovCi1zdGF0aWMgaW50IGJnX2ltYWdlID0gMDsKLXN0YXRpYyBpbnQgYmdzY2FsZSwgYmdzY2FsZV9kZWZhdWx0ID0gMTY7Ci1zdGF0aWMgdWxnIGJnX3Jvd2J5dGVzOwotc3RhdGljIHVjaCAqYmdfZGF0YTsKLQotaW50IHBhdXNlX2FmdGVyX3Bhc3MgPSBGQUxTRTsKLWludCBkZW1vX3RpbWluZyA9IEZBTFNFOwotdWxnIHVzbGVlcF9kdXJhdGlvbiA9IDBMOwotCi1zdGF0aWMgc3RydWN0IHJnYl9jb2xvciB7Ci0gICAgdWNoIHIsIGcsIGI7Ci19IHJnYltdID0gewotICAgIHsgIDAsICAgMCwgICAwfSwgICAgLyogIDA6ICBibGFjayAqLwotICAgIHsyNTUsIDI1NSwgMjU1fSwgICAgLyogIDE6ICB3aGl0ZSAqLwotICAgIHsxNzMsIDEzMiwgIDU3fSwgICAgLyogIDI6ICB0YW4gKi8KLSAgICB7IDY0LCAxMzIsICAgMH0sICAgIC8qICAzOiAgbWVkaXVtIGdyZWVuICovCi0gICAgezE4OSwgMTE3LCAgIDF9LCAgICAvKiAgNDogIGdvbGQgKi8KLSAgICB7MjUzLCAyNDksICAgMX0sICAgIC8qICA1OiAgeWVsbG93ICovCi0gICAgeyAgMCwgICAwLCAyNTV9LCAgICAvKiAgNjogIGJsdWUgKi8KLSAgICB7ICAwLCAgIDAsIDEyMH0sICAgIC8qICA3OiAgbWVkaXVtIGJsdWUgKi8KLSAgICB7MjU1LCAgIDAsIDI1NX0sICAgIC8qICA4OiAgbWFnZW50YSAqLwotICAgIHsgNjQsICAgMCwgIDY0fSwgICAgLyogIDk6ICBkYXJrIG1hZ2VudGEgKi8KLSAgICB7MjU1LCAgIDAsICAgMH0sICAgIC8qIDEwOiAgcmVkICovCi0gICAgeyA2NCwgICAwLCAgIDB9LCAgICAvKiAxMTogIGRhcmsgcmVkICovCi0gICAgezI1NSwgMTI3LCAgIDB9LCAgICAvKiAxMjogIG9yYW5nZSAqLwotICAgIHsxOTIsICA5NiwgICAwfSwgICAgLyogMTM6ICBkYXJrZXIgb3JhbmdlICovCi0gICAgeyAyNCwgIDYwLCAgIDB9LCAgICAvKiAxNDogIGRhcmsgZ3JlZW4teWVsbG93ICovCi0gICAgeyA4NSwgMTI1LCAyMDB9LCAgICAvKiAxNTogIGljZSBibHVlICovCi0gICAgezE5MiwgMTkyLCAxOTJ9ICAgICAvKiAxNjogIE5ldHNjYXBlL01vc2FpYyBncmF5ICovCi19OwotLyogbm90IHVzZWQgZm9yIG5vdywgYnV0IHNob3VsZCBiZSBmb3IgZXJyb3ItY2hlY2tpbmc6Ci1zdGF0aWMgaW50IG51bV9yZ2IgPSBzaXplb2YocmdiKSAvIHNpemVvZihzdHJ1Y3QgcmdiX2NvbG9yKTsKLSAqLwotCi0vKgotICAgIFRoaXMgd2hvbGUgc3RydWN0IGlzIGEgZmFpcmx5IGNoZWVzeSB3YXkgdG8ga2VlcCB0aGUgbnVtYmVyIG9mCi0gICAgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gYSBtaW5pbXVtLiAgVGhlIHJhZGlhbC13YXZlcyBiYWNrZ3JvdW5kCi0gICAgdHlwZSBpcyBhIHBhcnRpY3VsYXJseSBwb29yIGZpdCB0byB0aGUgaW50ZWdlciBlbGVtZW50cyBvZiB0aGUKLSAgICBzdHJ1Y3QuLi5idXQgYSBmZXcgbWFjcm9zIGFuZCBhIGxpdHRsZSBmaXhlZC1wb2ludCBtYXRoIHdpbGwgZG8KLSAgICB3b25kZXJzIGZvciB5YS4KLQotICAgIHR5cGUgYml0czoKLSAgICAgICBGIEUgRCBDIEIgQSA5IDggNyA2IDUgNCAzIDIgMSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8IHwgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgKy0rLSstLSAwID0gc2hhcnAtZWRnZWQgY2hlY2tlcmJvYXJkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAgICAgICAgIDEgPSBzb2Z0IGRpYW1vbmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAgICAgICAgIDIgPSByYWRpYWwgd2F2ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICAgICAgIDMtNyA9IHVuZGVmaW5lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICstLSBncmFkaWVudCAjMiBpbnZlcnRlZD8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tIGFsdGVybmF0aW5nIGNvbHVtbnMgaW52ZXJ0ZWQ/Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgYmFja2dyb3VuZF9wYXR0ZXJuIHsKLSAgICB1c2ggdHlwZTsKLSAgICBpbnQgcmdiMV9tYXgsIHJnYjFfbWluOyAgICAgLyogb3IgYmdfZnJlcSwgYmdfZ3JheSAqLwotICAgIGludCByZ2IyX21heCwgcmdiMl9taW47ICAgICAvKiBvciBiZ19ic2F0LCBiZ19icm90IChib3RoIHNjYWxlZCBieSAxMCkqLwotfSBiZ1tdID0gewotICAgIHswLCAgICAgMSwxLCAxNiwxNn0sICAgICAgICAvKiBjaGVja2VyZWQ6ICB3aGl0ZSB2cy4gbGlnaHQgZ3JheSAoYmFzaWMpICovCi0gICAgezArOCwgICAyLDAsICAxLDE1fSwgICAgICAgIC8qIGNoZWNrZXJlZDogIHRhbi9ibGFjayB2cy4gd2hpdGUvaWNlIGJsdWUgKi8KLSAgICB7MCsyNCwgIDIsMCwgIDEsMH0sICAgICAgICAgLyogY2hlY2tlcmVkOiAgdGFuL2JsYWNrIHZzLiB3aGl0ZS9ibGFjayAqLwotICAgIHswKzgsICAgNCw1LCAgMCwyfSwgICAgICAgICAvKiBjaGVja2VyZWQ6ICBnb2xkL3llbGxvdyB2cy4gYmxhY2svdGFuICovCi0gICAgezArOCwgICA0LDUsICAwLDZ9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIGdvbGQveWVsbG93IHZzLiBibGFjay9ibHVlICovCi0gICAgezAsICAgICA3LDAsICA4LDl9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIGRlZXAgYmx1ZS9ibGFjayB2cy4gbWFnZW50YSAqLwotICAgIHswKzgsICAxMywwLCAgNSwxNH0sICAgICAgICAvKiBjaGVja2VyZWQ6ICBvcmFuZ2UvYmxhY2sgdnMuIHllbGxvdyAqLwotICAgIHswKzgsICAxMiwwLCAxMCwxMX0sICAgICAgICAvKiBjaGVja2VyZWQ6ICBvcmFuZ2UvYmxhY2sgdnMuIHJlZCAqLwotICAgIHsxLCAgICAgNywwLCAgOCwwfSwgICAgICAgICAvKiBkaWFtb25kczogIGRlZXAgYmx1ZS9ibGFjayB2cy4gbWFnZW50YSAqLwotICAgIHsxLCAgICAxMiwwLCAxMSwwfSwgICAgICAgICAvKiBkaWFtb25kczogIG9yYW5nZSB2cy4gZGFyayByZWQgKi8KLSAgICB7MSwgICAgMTAsMCwgIDcsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICByZWQgdnMuIG1lZGl1bSBibHVlICovCi0gICAgezEsICAgICA0LDAsICA1LDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgZ29sZCB2cy4geWVsbG93ICovCi0gICAgezEsICAgICAzLDAsICAwLDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgbWVkaXVtIGdyZWVuIHZzLiBibGFjayAqLwotICAgIHsyLCAgICAxNiwgMTAwLCAgMjAsICAgMH0sICAvKiByYWRpYWw6ICB+aGFyZCByYWRpYWwgY29sb3ItYmVhbXMgKi8KLSAgICB7MiwgICAgMTgsIDEwMCwgIDEwLCAgIDJ9LCAgLyogcmFkaWFsOiAgc29mdCwgY3VydmVkIHJhZGlhbCBjb2xvci1iZWFtcyAqLwotICAgIHsyLCAgICAxNiwgMjU2LCAxMDAsIDI1MH0sICAvKiByYWRpYWw6ICB2ZXJ5IHRpZ2h0IHNwaXJhbCAqLwotICAgIHsyLCAxMDAwMCwgMjU2LCAgMTEsICAgMH0gICAvKiByYWRpYWw6ICBkaXBvbGUtbW9pcmUnIChhbG1vc3QgZnJhY3RhbCkgKi8KLX07Ci1zdGF0aWMgaW50IG51bV9iZ3BhdCA9IHNpemVvZihiZykgLyBzaXplb2Yoc3RydWN0IGJhY2tncm91bmRfcGF0dGVybik7Ci0KLQotLyogWC1zcGVjaWZpYyB2YXJpYWJsZXMgKi8KLXN0YXRpYyBjaGFyICpkaXNwbGF5bmFtZTsKLXN0YXRpYyBYSW1hZ2UgKnhpbWFnZTsKLXN0YXRpYyBEaXNwbGF5ICpkaXNwbGF5Owotc3RhdGljIGludCBkZXB0aDsKLXN0YXRpYyBWaXN1YWwgKnZpc3VhbDsKLXN0YXRpYyBYVmlzdWFsSW5mbyAqdmlzdWFsX2xpc3Q7Ci1zdGF0aWMgaW50IFJTaGlmdCwgR1NoaWZ0LCBCU2hpZnQ7Ci1zdGF0aWMgdWxnIFJNYXNrLCBHTWFzaywgQk1hc2s7Ci1zdGF0aWMgV2luZG93IHdpbmRvdzsKLXN0YXRpYyBHQyBnYzsKLXN0YXRpYyBDb2xvcm1hcCBjb2xvcm1hcDsKLQotc3RhdGljIGludCBoYXZlX25vbmRlZmF1bHRfdmlzdWFsID0gRkFMU0U7Ci1zdGF0aWMgaW50IGhhdmVfY29sb3JtYXAgPSBGQUxTRTsKLXN0YXRpYyBpbnQgaGF2ZV93aW5kb3cgPSBGQUxTRTsKLXN0YXRpYyBpbnQgaGF2ZV9nYyA9IEZBTFNFOwotCi0KLQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0jaWZkZWYgc2dpCi0gICAgY2hhciB0bXBsaW5lWzgwXTsKLSNlbmRpZgotICAgIGNoYXIgKnAsICpiZ3N0ciA9IE5VTEw7Ci0gICAgaW50IHJjLCBhbGVuLCBmbGVuOwotICAgIGludCBlcnJvciA9IDA7Ci0gICAgaW50IHRpbWluZyA9IEZBTFNFOwotICAgIGludCBoYXZlX2JnID0gRkFMU0U7Ci0jaWZkZWYgRkVBVFVSRV9MT09QCi0gICAgaW50IGxvb3AgPSBGQUxTRTsKLSAgICBsb25nIGxvb3BfaW50ZXJ2YWwgPSAtMTsJCS8qIHNlY29uZHMgKDEwMCwwMDAgbWF4KSAqLwotI2VuZGlmCi0gICAgZG91YmxlIExVVF9leHBvbmVudDsgICAgICAgICAgICAgICAgLyoganVzdCB0aGUgbG9va3VwIHRhYmxlICovCi0gICAgZG91YmxlIENSVF9leHBvbmVudCA9IDIuMjsgICAgICAgICAgLyoganVzdCB0aGUgbW9uaXRvciAqLwotICAgIGRvdWJsZSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7ICAgIC8qIHdob2xlIGRpc3BsYXkgc3lzdGVtICovCi0gICAgWEV2ZW50IGU7Ci0gICAgS2V5U3ltIGs7Ci0KLQotICAgIC8qIEZpcnN0IGluaXRpYWxpemUgYSBmZXcgdGhpbmdzLCBqdXN0IHRvIGJlIHN1cmUtLW1lbXNldCB0YWtlcyBjYXJlIG9mCi0gICAgICogZGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIChibGFjayksIGJvb2xlYW5zIChGQUxTRSksIHBvaW50ZXJzIChOVUxMKSwKLSAgICAgKiBldGMuICovCi0KLSAgICBkaXNwbGF5bmFtZSA9IChjaGFyICopTlVMTDsKLSAgICBmaWxlbmFtZSA9IChjaGFyICopTlVMTDsKLSAgICBtZW1zZXQoJnJwbmcyX2luZm8sIDAsIHNpemVvZihtYWlucHJvZ19pbmZvKSk7Ci0KLQotICAgIC8qIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igb3VyIGRpc3BsYXktc3lzdGVtIGV4cG9uZW50LCBpLmUuLCB0aGUKLSAgICAgKiBwcm9kdWN0IG9mIHRoZSBDUlQgZXhwb25lbnQgYW5kIHRoZSBleHBvbmVudCBjb3JyZXNwb25kaW5nIHRvCi0gICAgICogdGhlIGZyYW1lLWJ1ZmZlcidzIGxvb2t1cCB0YWJsZSAoTFVUKSwgaWYgYW55LiAgVGhpcyBpcyBub3QgYW4KLSAgICAgKiBleGhhdXN0aXZlIGxpc3Qgb2YgTFVUIHZhbHVlcyAoZS5nLiwgT3BlblN0ZXAgaGFzIGEgbG90IG9mIHdlaXJkCi0gICAgICogb25lcyksIGJ1dCBpdCBzaG91bGQgY292ZXIgOTklIG9mIHRoZSBjdXJyZW50IHBvc3NpYmlsaXRpZXMuICovCi0KLSNpZiBkZWZpbmVkKE5lWFQpCi0gICAgLyogdGhpcmQtcGFydHkgdXRpbGl0aWVzIGNhbiBtb2RpZnkgdGhlIGRlZmF1bHQgTFVUIGV4cG9uZW50ICovCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMi4yOwotICAgIC8qCi0gICAgaWYgKHNvbWVfbmV4dF9mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm5leHRfZ2FtbWEpKQotICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBuZXh0X2dhbW1hOwotICAgICAqLwotI2VsaWYgZGVmaW5lZChzZ2kpCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMS43OwotICAgIC8qIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgZG9jdW1lbnRlZCBmdW5jdGlvbiB0bwotICAgICAqIGdldCB0aGUgImdhbW1hIiB2YWx1ZSwgc28gd2UgZG8gaXQgdGhlIGhhcmQgd2F5ICovCi0gICAgaW5maWxlID0gZm9wZW4oIi9ldGMvY29uZmlnL3N5c3RlbS5nbEdhbW1hVmFsIiwgInIiKTsKLSAgICBpZiAoaW5maWxlKSB7Ci0gICAgICAgIGRvdWJsZSBzZ2lfZ2FtbWE7Ci0KLSAgICAgICAgZmdldHModG1wbGluZSwgODAsIGluZmlsZSk7Ci0gICAgICAgIGZjbG9zZShpbmZpbGUpOwotICAgICAgICBzZ2lfZ2FtbWEgPSBhdG9mKHRtcGxpbmUpOwotICAgICAgICBpZiAoc2dpX2dhbW1hID4gMC4wKQotICAgICAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gc2dpX2dhbW1hOwotICAgIH0KLSNlbGlmIGRlZmluZWQoTWFjaW50b3NoKQotICAgIExVVF9leHBvbmVudCA9IDEuOCAvIDIuNjE7Ci0gICAgLyoKLSAgICBpZiAoc29tZV9tYWNfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZtYWNfZ2FtbWEpKQotICAgICAgICBMVVRfZXhwb25lbnQgPSBtYWNfZ2FtbWEgLyAyLjYxOwotICAgICAqLwotI2Vsc2UKLSAgICBMVVRfZXhwb25lbnQgPSAxLjA7ICAgLyogYXNzdW1lIG5vIExVVDogIG1vc3QgUENzICovCi0jZW5kaWYKLQotICAgIC8qIHRoZSBkZWZhdWx0cyBhYm92ZSBnaXZlIDEuMCwgMS4zLCAxLjUgYW5kIDIuMiwgcmVzcGVjdGl2ZWx5OiAqLwotICAgIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCA9IExVVF9leHBvbmVudCAqIENSVF9leHBvbmVudDsKLQotCi0gICAgLyogSWYgdGhlIHVzZXIgaGFzIHNldCB0aGUgU0NSRUVOX0dBTU1BIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIHN1Z2dlc3RlZAotICAgICAqIChzb21ld2hhdCBpbXByZWNpc2VseSkgaW4gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCB1c2UgdGhhdDsgb3RoZXJ3aXNlCi0gICAgICogdXNlIHRoZSBkZWZhdWx0IHZhbHVlIHdlIGp1c3QgY2FsY3VsYXRlZC4gIEVpdGhlciB3YXksIHRoZSB1c2VyIG1heQotICAgICAqIG92ZXJyaWRlIHRoaXMgdmlhIGEgY29tbWFuZC1saW5lIG9wdGlvbi4gKi8KLQotICAgIGlmICgocCA9IGdldGVudigiU0NSRUVOX0dBTU1BIikpICE9IE5VTEwpCi0gICAgICAgIHJwbmcyX2luZm8uZGlzcGxheV9leHBvbmVudCA9IGF0b2YocCk7Ci0gICAgZWxzZQotICAgICAgICBycG5nMl9pbmZvLmRpc3BsYXlfZXhwb25lbnQgPSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7Ci0KLQotICAgIC8qIE5vdyBwYXJzZSB0aGUgY29tbWFuZCBsaW5lIGZvciBvcHRpb25zIGFuZCB0aGUgUE5HIGZpbGVuYW1lLiAqLwotCi0gICAgd2hpbGUgKCorK2FyZ3YgJiYgIWVycm9yKSB7Ci0gICAgICAgIGlmICghc3RybmNtcCgqYXJndiwgIi1kaXNwbGF5IiwgMikpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGRpc3BsYXluYW1lID0gKmFyZ3Y7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItZ2FtbWEiLCAyKSkgewotICAgICAgICAgICAgaWYgKCEqKythcmd2KQotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBycG5nMl9pbmZvLmRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKCphcmd2KTsKLSAgICAgICAgICAgICAgICBpZiAocnBuZzJfaW5mby5kaXNwbGF5X2V4cG9uZW50IDw9IDAuMCkKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1iZ2NvbG9yIiwgNCkpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmdzdHIgPSAqYXJndjsKLSAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGJnc3RyKSAhPSA3IHx8IGJnc3RyWzBdICE9ICcjJykKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGF2ZV9iZyA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJnX2ltYWdlID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWJncGF0IiwgNCkpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGF0ID0gYXRvaSgqYXJndik7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdCA+PSAwICYmIHBhdCA8IG51bV9iZ3BhdCkgewotICAgICAgICAgICAgICAgICAgICBiZ19pbWFnZSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGhhdmVfYmcgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi11c2xlZXAiLCAyKSkgewotICAgICAgICAgICAgaWYgKCEqKythcmd2KQotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB1c2xlZXBfZHVyYXRpb24gPSAodWxnKWF0b2woKmFyZ3YpOwotICAgICAgICAgICAgICAgIGRlbW9fdGltaW5nID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1wYXVzZSIsIDIpKSB7Ci0gICAgICAgICAgICBwYXVzZV9hZnRlcl9wYXNzID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi10aW1pbmciLCAyKSkgewotICAgICAgICAgICAgdGltaW5nID0gVFJVRTsKLSNpZmRlZiBGRUFUVVJFX0xPT1AKLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1sb29wIiwgMikpIHsKLSAgICAgICAgICAgIGxvb3AgPSBUUlVFOwotICAgICAgICAgICAgaWYgKCFhcmd2WzFdIHx8ICFpc19udW1iZXIoYXJndlsxXSkpCi0gICAgICAgICAgICAgICAgbG9vcF9pbnRlcnZhbCA9IDI7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICArK2FyZ3Y7Ci0gICAgICAgICAgICAgICAgbG9vcF9pbnRlcnZhbCA9IGF0b2woKmFyZ3YpOwotICAgICAgICAgICAgICAgIGlmIChsb29wX2ludGVydmFsIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgbG9vcF9pbnRlcnZhbCA9IDI7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobG9vcF9pbnRlcnZhbCA+IDEwMDAwMCkgICAvKiBiaXQgbW9yZSB0aGFuIG9uZSBkYXkgKi8KLSAgICAgICAgICAgICAgICAgICAgbG9vcF9pbnRlcnZhbCA9IDEwMDAwMDsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCoqYXJndiAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICBmaWxlbmFtZSA9ICphcmd2OwotICAgICAgICAgICAgICAgIGlmIChhcmd2WzFdKSAgIC8qIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBhcmdzIGFmdGVyIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICArK2Vycm9yOyAgIC8qIG5vdCBleHBlY3RpbmcgYW55IG90aGVyIG9wdGlvbnMgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghZmlsZW5hbWUpCi0gICAgICAgICsrZXJyb3I7Ci0KLQotICAgIC8qIHByaW50IHVzYWdlIHNjcmVlbiBpZiBhbnkgZXJyb3JzIHVwIHRvIHRoaXMgcG9pbnQgKi8KLQotICAgIGlmIChlcnJvcikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXMgJXM6ICAlc1xuXG4iLCBQUk9HTkFNRSwgVkVSU0lPTiwgYXBwbmFtZSk7Ci0gICAgICAgIHJlYWRwbmcyX3ZlcnNpb25faW5mbygpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIgotICAgICAgICAgICJVc2FnZTogICVzIFstZGlzcGxheSB4ZHB5XSBbLWdhbW1hIGV4cF0gWy1iZ2NvbG9yIGJnIHwgLWJncGF0IHBhdF1cbiIKLSNpZmRlZiBGRUFUVVJFX0xPT1AKLSAgICAgICAgICAiICAgICAgICAlKnMgWy11c2xlZXAgZHVyIHwgLXRpbWluZ10gWy1wYXVzZV0gWy1sb29wIFtzZWNdXSBmaWxlLnBuZ1xuXG4iCi0jZWxzZQotICAgICAgICAgICIgICAgICAgICUqcyBbLXVzbGVlcCBkdXIgfCAtdGltaW5nXSBbLXBhdXNlXSBmaWxlLnBuZ1xuXG4iCi0jZW5kaWYKLSAgICAgICAgICAiICAgIHhkcHlcdG5hbWUgb2YgdGhlIHRhcmdldCBYIGRpc3BsYXkgKGUuZy4sIGBgaG9zdG5hbWU6MCcnKVxuIgotICAgICAgICAgICIgICAgZXhwIFx0dHJhbnNmZXItZnVuY3Rpb24gZXhwb25lbnQgKGBgZ2FtbWEnJykgb2YgdGhlIGRpc3BsYXlcbiIKLSAgICAgICAgICAiXHRcdCAgc3lzdGVtIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCAoZS5nLiwgYGAlLjFmJycpOyBlcXVhbFxuIgotICAgICAgICAgICJcdFx0ICB0byB0aGUgcHJvZHVjdCBvZiB0aGUgbG9va3VwLXRhYmxlIGV4cG9uZW50ICh2YXJpZXMpXG4iCi0gICAgICAgICAgIlx0XHQgIGFuZCB0aGUgQ1JUIGV4cG9uZW50ICh1c3VhbGx5IDIuMik7IG11c3QgYmUgcG9zaXRpdmVcbiIKLSAgICAgICAgICAiICAgIGJnICBcdGRlc2lyZWQgYmFja2dyb3VuZCBjb2xvciBpbiA3LWNoYXJhY3RlciBoZXggUkdCIGZvcm1hdFxuIgotICAgICAgICAgICJcdFx0ICAoZS5nLiwgYGAjZmY3NzAwJycgZm9yIG9yYW5nZTogIHNhbWUgYXMgSFRNTCBjb2xvcnMpO1xuIgotICAgICAgICAgICJcdFx0ICB1c2VkIHdpdGggdHJhbnNwYXJlbnQgaW1hZ2VzOyBvdmVycmlkZXMgLWJncGF0XG4iCi0gICAgICAgICAgIiAgICBwYXQgXHRkZXNpcmVkIGJhY2tncm91bmQgcGF0dGVybiBudW1iZXIgKDAtJWQpOyB1c2VkIHdpdGhcbiIKLSAgICAgICAgICAiXHRcdCAgdHJhbnNwYXJlbnQgaW1hZ2VzOyBvdmVycmlkZXMgLWJnY29sb3JcbiIKLSNpZmRlZiBGRUFUVVJFX0xPT1AKLSAgICAgICAgICAiICAgIC1sb29wXHRsb29wcyB0aHJvdWdoIGJhY2tncm91bmQgaW1hZ2VzIGFmdGVyIGluaXRpYWwgZGlzcGxheVxuIgotICAgICAgICAgICJcdFx0ICBpcyBjb21wbGV0ZSAoZGVwZW5kcyBvbiAtYmdwYXQpXG4iCi0gICAgICAgICAgIiAgICBzZWMgXHRzZWNvbmRzIHRvIGRpc3BsYXkgZWFjaCBiYWNrZ3JvdW5kIGltYWdlIChkZWZhdWx0ID0gMilcbiIKLSNlbmRpZgotICAgICAgICAgICIgICAgZHVyIFx0ZHVyYXRpb24gaW4gbWljcm9zZWNvbmRzIHRvIHdhaXQgYWZ0ZXIgZGlzcGxheWluZyBlYWNoXG4iCi0gICAgICAgICAgIlx0XHQgIHJvdyAoZm9yIGRlbW8gcHVycG9zZXMpXG4iCi0gICAgICAgICAgIiAgICAtdGltaW5nXHRlbmFibGVzIGRlbGF5IGZvciBldmVyeSBibG9jayByZWFkLCB0byBzaW11bGF0ZSBtb2RlbVxuIgotICAgICAgICAgICJcdFx0ICBkb3dubG9hZCBvZiBpbWFnZSAofjM2IEticHMpXG4iCi0gICAgICAgICAgIiAgICAtcGF1c2VcdHBhdXNlcyBhZnRlciBkaXNwbGF5aW5nIGVhY2ggcGFzcyB1bnRpbCBtb3VzZSBjbGlja2VkXG4iCi0gICAgICAgICAgIlxuUHJlc3MgUSwgRXNjIG9yIG1vdXNlIGJ1dHRvbiAxICh3aXRoaW4gaW1hZ2Ugd2luZG93LCBhZnRlciBpbWFnZVxuIgotICAgICAgICAgICJpcyBkaXNwbGF5ZWQpIHRvIHF1aXQuXG4iCi0gICAgICAgICAgIlxuIiwgUFJPR05BTUUsCi0jaWYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX01fSVg4NikgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkKLSAgICAgICAgICAoaW50KXN0cmxlbihQUk9HTkFNRSksICIgIiwKLSNlbmRpZgotICAgICAgICAgIChpbnQpc3RybGVuKFBST0dOQU1FKSwgIiAiLCBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQsIG51bV9iZ3BhdC0xKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLQotICAgIGlmICghKGluZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKSkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBjYW4ndCBvcGVuIFBORyBmaWxlIFslc11cbiIsIGZpbGVuYW1lKTsKLSAgICAgICAgKytlcnJvcjsKLSAgICB9IGVsc2UgewotICAgICAgICBpbmNvdW50ID0gZnJlYWQoaW5idWYsIDEsIElOQlVGU0laRSwgaW5maWxlKTsKLSAgICAgICAgaWYgKGluY291bnQgPCA4IHx8ICFyZWFkcG5nMl9jaGVja19zaWcoaW5idWYsIDgpKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgIjogIFslc10gaXMgbm90IGEgUE5HIGZpbGU6IGluY29ycmVjdCBzaWduYXR1cmVcbiIsCi0gICAgICAgICAgICAgIGZpbGVuYW1lKTsKLSAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgIH0gZWxzZSBpZiAoKHJjID0gcmVhZHBuZzJfaW5pdCgmcnBuZzJfaW5mbykpICE9IDApIHsKLSAgICAgICAgICAgIHN3aXRjaCAocmMpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAgICAgICAgICI6ICBbJXNdIGhhcyBiYWQgSUhEUiAobGlicG5nIGxvbmdqbXApXG4iLCBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAgICAgIjogIHVua25vd24gcmVhZHBuZzJfaW5pdCgpIGVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICArK2Vycm9yOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVHJhY2UoKHN0ZGVyciwgImFib3V0IHRvIGNhbGwgWE9wZW5EaXNwbGF5KClcbiIpKQotICAgICAgICAgICAgZGlzcGxheSA9IFhPcGVuRGlzcGxheShkaXNwbGF5bmFtZSk7Ci0gICAgICAgICAgICBpZiAoIWRpc3BsYXkpIHsKLSAgICAgICAgICAgICAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGNhbid0IG9wZW4gWCBkaXNwbGF5IFslc11cbiIsCi0gICAgICAgICAgICAgICAgICBkaXNwbGF5bmFtZT8gZGlzcGxheW5hbWUgOiAiZGVmYXVsdCIpOwotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVycm9yKQotICAgICAgICAgICAgZmNsb3NlKGluZmlsZSk7Ci0gICAgfQotCi0KLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBhYm9ydGluZy5cbiIpOwotICAgICAgICBleGl0KDIpOwotICAgIH0KLQotCi0gICAgLyogc2V0IHRoZSB0aXRsZS1iYXIgc3RyaW5nLCBidXQgbWFrZSBzdXJlIGJ1ZmZlciBkb2Vzbid0IG92ZXJmbG93ICovCi0KLSAgICBhbGVuID0gc3RybGVuKGFwcG5hbWUpOwotICAgIGZsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOwotICAgIGlmIChhbGVuICsgZmxlbiArIDMgPiAxMDIzKQotICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAuLi4lcyIsIGFwcG5hbWUsIGZpbGVuYW1lKyhhbGVuK2ZsZW4rNi0xMDIzKSk7Ci0gICAgZWxzZQotICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAlcyIsIGFwcG5hbWUsIGZpbGVuYW1lKTsKLQotCi0gICAgLyogc2V0IHNvbWUgZmluYWwgcnBuZzJfaW5mbyB2YXJpYWJsZXMgYmVmb3JlIGVudGVyaW5nIG1haW4gZGF0YSBsb29wICovCi0KLSAgICBpZiAoaGF2ZV9iZykgewotICAgICAgICB1bnNpZ25lZCByLCBnLCBiOyAgIC8qIHRoaXMgYXBwcm9hY2ggcXVpZXRzIGNvbXBpbGVyIHdhcm5pbmdzICovCi0KLSAgICAgICAgc3NjYW5mKGJnc3RyKzEsICIlMnglMnglMngiLCAmciwgJmcsICZiKTsKLSAgICAgICAgcnBuZzJfaW5mby5iZ19yZWQgICA9ICh1Y2gpcjsKLSAgICAgICAgcnBuZzJfaW5mby5iZ19ncmVlbiA9ICh1Y2gpZzsKLSAgICAgICAgcnBuZzJfaW5mby5iZ19ibHVlICA9ICh1Y2gpYjsKLSAgICB9IGVsc2UKLSAgICAgICAgcnBuZzJfaW5mby5uZWVkX2JnY29sb3IgPSBUUlVFOwotCi0gICAgcnBuZzJfaW5mby5zdGF0ZSA9IGtQcmVJbml0OwotICAgIHJwbmcyX2luZm8ubWFpbnByb2dfaW5pdCA9IHJwbmcyX3hfaW5pdDsKLSAgICBycG5nMl9pbmZvLm1haW5wcm9nX2Rpc3BsYXlfcm93ID0gcnBuZzJfeF9kaXNwbGF5X3JvdzsKLSAgICBycG5nMl9pbmZvLm1haW5wcm9nX2ZpbmlzaF9kaXNwbGF5ID0gcnBuZzJfeF9maW5pc2hfZGlzcGxheTsKLQotCi0gICAgLyogT0ssIHRoaXMgaXMgdGhlIGZ1biBwYXJ0OiAgY2FsbCByZWFkcG5nMl9kZWNvZGVfZGF0YSgpIGF0IHRoZSBzdGFydCBvZgotICAgICAqIHRoZSBsb29wIHRvIGRlYWwgd2l0aCBvdXIgZmlyc3QgYnVmZmVyIG9mIGRhdGEgKHJlYWQgaW4gYWJvdmUgdG8gdmVyaWZ5Ci0gICAgICogdGhhdCB0aGUgZmlsZSBpcyBhIFBORyBpbWFnZSksIHRoZW4gbG9vcCB0aHJvdWdoIHRoZSBmaWxlIGFuZCBjb250aW51ZQotICAgICAqIGNhbGxpbmcgdGhlIHNhbWUgcm91dGluZSB0byBoYW5kbGUgZWFjaCBjaHVuayBvZiBkYXRhLiAgSXQgaW4gdHVybgotICAgICAqIHBhc3NlcyB0aGUgZGF0YSB0byBsaWJwbmcsIHdoaWNoIHdpbGwgaW52b2tlIG9uZSBvciBtb3JlIG9mIG91ciBjYWxsLQotICAgICAqIGJhY2tzIGFzIGRlY29kZWQgZGF0YSBiZWNvbWUgYXZhaWxhYmxlLiAgV2Ugb3B0aW9uYWxseSBjYWxsIHNsZWVwKCkgZm9yCi0gICAgICogb25lIHNlY29uZCBwZXIgaXRlcmF0aW9uIHRvIHNpbXVsYXRlIGRvd25sb2FkaW5nIHRoZSBpbWFnZSB2aWEgYW4gYW5hbG9nCi0gICAgICogbW9kZW0uICovCi0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIFRyYWNlKChzdGRlcnIsICJhYm91dCB0byBjYWxsIHJlYWRwbmcyX2RlY29kZV9kYXRhKClcbiIpKQotICAgICAgICBpZiAocmVhZHBuZzJfZGVjb2RlX2RhdGEoJnJwbmcyX2luZm8sIGluYnVmLCBpbmNvdW50KSkKLSAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgIFRyYWNlKChzdGRlcnIsICJkb25lIHdpdGggcmVhZHBuZzJfZGVjb2RlX2RhdGEoKVxuIikpCi0KLSAgICAgICAgaWYgKGVycm9yIHx8IGluY291bnQgIT0gSU5CVUZTSVpFIHx8IHJwbmcyX2luZm8uc3RhdGUgPT0ga0RvbmUpIHsKLSAgICAgICAgICAgIGlmIChycG5nMl9pbmZvLnN0YXRlID09IGtEb25lKSB7Ci0gICAgICAgICAgICAgICAgVHJhY2UoKHN0ZGVyciwgImRvbmUgZGVjb2RpbmcgUE5HIGltYWdlXG4iKSkKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZmVycm9yKGluZmlsZSkpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICI6ICBlcnJvciB3aGlsZSByZWFkaW5nIFBORyBpbWFnZSBmaWxlXG4iKTsKLSAgICAgICAgICAgICAgICBleGl0KDMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmZW9mKGluZmlsZSkpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGVuZCBvZiBmaWxlIHJlYWNoZWQgIgotICAgICAgICAgICAgICAgICAgIih1bmV4cGVjdGVkbHkpIHdoaWxlIHJlYWRpbmcgUE5HIGltYWdlIGZpbGVcbiIpOwotICAgICAgICAgICAgICAgIGV4aXQoMyk7Ci0gICAgICAgICAgICB9IGVsc2UgLyogaWYgKGVycm9yKSAqLyB7Ci0gICAgICAgICAgICAgICAgLy8gd2lsbCBwcmludCBlcnJvciBtZXNzYWdlIGJlbG93Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aW1pbmcpCi0gICAgICAgICAgICBzbGVlcCgxKTsKLQotICAgICAgICBpbmNvdW50ID0gZnJlYWQoaW5idWYsIDEsIElOQlVGU0laRSwgaW5maWxlKTsKLSAgICB9Ci0KLQotICAgIC8qIGNsZWFuIHVwIFBORyBzdHVmZiBhbmQgcmVwb3J0IGFueSBkZWNvZGluZyBlcnJvcnMgKi8KLQotICAgIGZjbG9zZShpbmZpbGUpOwotICAgIFRyYWNlKChzdGRlcnIsICJhYm91dCB0byBjYWxsIHJlYWRwbmcyX2NsZWFudXAoKVxuIikpCi0gICAgcmVhZHBuZzJfY2xlYW51cCgmcnBuZzJfaW5mbyk7Ci0KLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBsaWJwbmcgZXJyb3Igd2hpbGUgZGVjb2RpbmcgUE5HIGltYWdlXG4iKTsKLSAgICAgICAgZXhpdCgzKTsKLSAgICB9Ci0KLQotI2lmZGVmIEZFQVRVUkVfTE9PUAotCi0gICAgaWYgKGxvb3AgJiYgYmdfaW1hZ2UpIHsKLSAgICAgICAgVHJhY2UoKHN0ZGVyciwgImVudGVyaW5nIC1sb29wIGxvb3AgKEZFQVRVUkVfTE9PUClcbiIpKQotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICBpbnQgaSwgdXNlX3NsZWVwOwotICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgbm93LCB0aGVuOwotCi0gICAgICAgICAgICAvKiBnZXQgY3VycmVudCB0aW1lIGFuZCBhZGQgbG9vcF9pbnRlcnZhbCB0byBnZXQgdGFyZ2V0IHRpbWUgKi8KLSAgICAgICAgICAgIGlmIChnZXR0aW1lb2ZkYXkoJnRoZW4sIE5VTEwpID09IDApIHsKLSAgICAgICAgICAgICAgICB0aGVuLnR2X3NlYyArPSBsb29wX2ludGVydmFsOwotICAgICAgICAgICAgICAgIHVzZV9zbGVlcCA9IEZBTFNFOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgdXNlX3NsZWVwID0gVFJVRTsKLQotICAgICAgICAgICAgLyogZG8gcXVpY2sgY2hlY2sgZm9yIGEgcXVpdCBldmVudCBidXQgZG9uJ3Qgd2FpdCBmb3IgaXQgKi8KLSAgICAgICAgICAgIC8qIEdSUiBCVUc6ICBzaG91bGQgYWxzbyBjaGVjayBmb3IgRXhwb3NlIGV2ZW50cyBhbmQgcmVkcmF3Li4uICovCi0gICAgICAgICAgICBpZiAoWENoZWNrTWFza0V2ZW50KGRpc3BsYXksIEtleVByZXNzTWFzayB8IEJ1dHRvblByZXNzTWFzaywgJmUpKQotICAgICAgICAgICAgICAgIGlmIChRVUlUKGUsaykpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBnZW5lcmF0ZSBuZXh0IGJhY2tncm91bmQgaW1hZ2UgKi8KLSAgICAgICAgICAgIGlmICgrK3BhdCA+PSBudW1fYmdwYXQpCi0gICAgICAgICAgICAgICAgcGF0ID0gMDsKLSAgICAgICAgICAgIHJwbmcyX3hfcmVsb2FkX2JnX2ltYWdlKCk7Ci0KLSAgICAgICAgICAgIC8qIHdhaXQgZm9yIHRpbWVvdXQsIHVzaW5nIHdoYXRldmVyIG1lYW5zIGFyZSBhdmFpbGFibGUgKi8KLSAgICAgICAgICAgIGlmICh1c2Vfc2xlZXAgfHwgZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpICE9IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBsb29wX2ludGVydmFsOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2xlZXAoMSk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc6ICBhbHNvIG5lZWQgdG8gY2hlY2sgZm9yIEV4cG9zZSAoYW5kIHJlZHJhdyEpICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChYQ2hlY2tNYXNrRXZlbnQoZGlzcGxheSwgS2V5UHJlc3NNYXNrIHwgQnV0dG9uUHJlc3NNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgJmUpICYmIFFVSVQoZSxrKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogWTIwMzggQlVHISAqLwotICAgICAgICAgICAgICAgIGlmIChub3cudHZfc2VjIDwgdGhlbi50dl9zZWMgfHwKLSAgICAgICAgICAgICAgICAgICAgKG5vdy50dl9zZWMgPT0gdGhlbi50dl9zZWMgJiYgbm93LnR2X3VzZWMgPCB0aGVuLnR2X3VzZWMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHF1aXQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBzZWNvbmRzX3RvX2dvID0gdGhlbi50dl9zZWMgLSBub3cudHZfc2VjOwotICAgICAgICAgICAgICAgICAgICBsb25nIHVzbGVlcF91c2VjOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIGJhc2ljYWxseSBjaGV3IHVwIG1vc3Qgb2YgcmVtYWluaW5nIGxvb3AtaW50ZXJ2YWwgd2l0aAotICAgICAgICAgICAgICAgICAgICAgKiAgY2FsbHMgdG8gc2xlZXAoMSkgaW50ZXJsZWF2ZWQgd2l0aCBjaGVja3MgZm9yIHF1aXQKLSAgICAgICAgICAgICAgICAgICAgICogIGV2ZW50cywgYnV0IGFsc28gcmVjYWxjIHRpbWUtdG8tZ28gcGVyaW9kaWNhbGx5OyB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAqICBkb25lLCBjbGVhbiB1cCBhbnkgcmVtYWluaW5nIHRpbWUgd2l0aCB1c2xlZXAoKSBjYWxsCi0gICAgICAgICAgICAgICAgICAgICAqICAoY291bGQgYWxzbyB1c2UgU0lHQUxSTSwgYnV0IHNpZ25hbHMgYXJlIGEgcGFpbi4uLikgKi8KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNlY29uZHNfdG9fZ28tLSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWNvbmRzX2RvbmUgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBzZWNvbmRzX3RvX2dvOyAgaSA+IDAgJiYgIXF1aXQ7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcCgxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHOiAgbmVlZCB0byBjaGVjayBmb3IgRXhwb3NlIGFuZCByZWRyYXcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWENoZWNrTWFza0V2ZW50KGRpc3BsYXksIEtleVByZXNzTWFzayB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1dHRvblByZXNzTWFzaywgJmUpICYmIFFVSVQoZSxrKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrc2Vjb25kc19kb25lID4gMTAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgLyogdGltZSB0byByZWRvIHNlY29uZHNfdG9fZ28gbWVhcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBPSywgbW9yZSB0aGFuIDEwMDAgc2Vjb25kcyBzaW5jZSBsYXN0IGNoZWNrOgotICAgICAgICAgICAgICAgICAgICAgICAgICogIGNvcnJlY3QgdGhlIHRpbWUtdG8tZ28gbWVhc3VyZW1lbnQgZm9yIGRyaWZ0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm93LnR2X3NlYyA+PSB0aGVuLnR2X3NlYykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kc190b19nbyA9IHRoZW4udHZfc2VjIC0gbm93LnR2X3NlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrc2Vjb25kc190b19nbzsgIC8qIHJlc3RvcmUgd2hhdCB3ZSBzdWJ0cmFjdGVkICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHF1aXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAvKiBicmVha3Mgb3V0ZXIgZG8tbG9vcCwgc2tpcHMgcmVkaXNwbGF5ICovCi0KLSAgICAgICAgICAgICAgICAgICAgLyogc2luY2UgZGlmZmVyZW5jZSBiZXR3ZWVuICJub3ciIGFuZCAidGhlbiIgaXMgYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAgKiAgZWF0ZW4gdXAgdG8gd2l0aGluIGEgY291cGxlIG9mIHNlY29uZHMsIGRvbid0IG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICogIHdvcnJ5IGFib3V0IG92ZXJmbG93LS1idXQgbWlnaHQgaGF2ZSBvdmVyc2hvdCAobmVnLikgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldHRpbWVvZmRheSgmbm93LCBOVUxMKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2xlZXBfdXNlYyA9IDEwMDAwMDBMKih0aGVuLnR2X3NlYyAtIG5vdy50dl9zZWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbi50dl91c2VjIC0gbm93LnR2X3VzZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNsZWVwX3VzZWMgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzbGVlcCgodWxnKXVzbGVlcF91c2VjKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogY29tcG9zaXRlIGltYWdlIGFnYWluc3QgbmV3IGJhY2tncm91bmQgYW5kIGRpc3BsYXkgKG5vdGUgdGhhdAotICAgICAgICAgICAgICogIHdlIGRvIG5vdCB0YWtlIGludG8gYWNjb3VudCB0aGUgdGltZSBzcGVudCBkb2luZyB0aGlzLi4uKSAqLwotICAgICAgICAgICAgcnBuZzJfeF9yZWRpc3BsYXlfaW1hZ2UgKDAsIDAsIHJwbmcyX2luZm8ud2lkdGgsIHJwbmcyX2luZm8uaGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgfSBlbHNlIC8qIEZBTEwgVEhST1VHSCBhbmQgZG8gdGhlIG5vcm1hbCB0aGluZyAqLwotCi0jZW5kaWYgLyogRkVBVFVSRV9MT09QICovCi0KLSAgICAvKiB3YWl0IGZvciB0aGUgdXNlciB0byB0ZWxsIHVzIHdoZW4gdG8gcXVpdCAqLwotCi0gICAgaWYgKHJwbmcyX2luZm8uc3RhdGUgPj0ga1dpbmRvd0luaXQpIHsKLSAgICAgICAgVHJhY2UoKHN0ZGVyciwgImVudGVyaW5nIGZpbmFsIHdhaXQtZm9yLXF1aXQtZXZlbnQgbG9vcFxuIikpCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIFhOZXh0RXZlbnQoZGlzcGxheSwgJmUpOwotICAgICAgICAgICAgaWYgKGUudHlwZSA9PSBFeHBvc2UpIHsKLSAgICAgICAgICAgICAgICBYRXhwb3NlRXZlbnQgKmV4ID0gKFhFeHBvc2VFdmVudCAqKSZlOwotICAgICAgICAgICAgICAgIHJwbmcyX3hfcmVkaXNwbGF5X2ltYWdlIChleC0+eCwgZXgtPnksIGV4LT53aWR0aCwgZXgtPmhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKCFRVUlUKGUsaykpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgaW5pdCBjYWxsYmFjayBuZXZlciBjYWxsZWQ6ICBwcm9iYWJsZSAiCi0gICAgICAgICAgImxpYnBuZyBlcnJvciB3aGlsZSBkZWNvZGluZyBQTkcgbWV0YWRhdGFcbiIpOwotICAgICAgICBleGl0KDQpOwotICAgIH0KLQotCi0gICAgLyogd2UncmUgZG9uZTogIGNsZWFuIHVwIGFsbCBpbWFnZSBhbmQgWCByZXNvdXJjZXMgYW5kIGdvIGF3YXkgKi8KLQotICAgIFRyYWNlKChzdGRlcnIsICJhYm91dCB0byBjYWxsIHJwbmcyX3hfY2xlYW51cCgpXG4iKSkKLSAgICBycG5nMl94X2NsZWFudXAoKTsKLQotICAgIHJldHVybiAwOwotfQotCi0KLQotCi0KLS8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHJlYWRwbmcyX2luZm9fY2FsbGJhY2soKSBpbiByZWFkcG5nMi5jLCB3aGljaAotICogaW4gdHVybiBpcyBjYWxsZWQgYnkgbGlicG5nIGFmdGVyIGFsbCBvZiB0aGUgcHJlLUlEQVQgY2h1bmtzIGhhdmUgYmVlbgotICogcmVhZCBhbmQgcHJvY2Vzc2VkLS1pLmUuLCB3ZSBub3cgaGF2ZSBlbm91Z2ggaW5mbyB0byBmaW5pc2ggaW5pdGlhbGl6aW5nICovCi0KLXN0YXRpYyB2b2lkIHJwbmcyX3hfaW5pdCh2b2lkKQotewotICAgIHVsZyBpOwotICAgIHVsZyByb3dieXRlcyA9IHJwbmcyX2luZm8ucm93Ynl0ZXM7Ci0KLSAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIHJwbmcyX3hfaW5pdCgpXG4iKSkKLSAgICBUcmFjZSgoc3RkZXJyLCAiICByb3dieXRlcyA9ICVkXG4iLCBycG5nMl9pbmZvLnJvd2J5dGVzKSkKLSAgICBUcmFjZSgoc3RkZXJyLCAiICB3aWR0aCAgPSAlbGRcbiIsIHJwbmcyX2luZm8ud2lkdGgpKQotICAgIFRyYWNlKChzdGRlcnIsICIgIGhlaWdodCA9ICVsZFxuIiwgcnBuZzJfaW5mby5oZWlnaHQpKQotCi0gICAgcnBuZzJfaW5mby5pbWFnZV9kYXRhID0gKHVjaCAqKW1hbGxvYyhyb3dieXRlcyAqIHJwbmcyX2luZm8uaGVpZ2h0KTsKLSAgICBpZiAoIXJwbmcyX2luZm8uaW1hZ2VfZGF0YSkgewotICAgICAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJwbmcyX2luZm8ucm93X3BvaW50ZXJzID0gKHVjaCAqKiltYWxsb2MocnBuZzJfaW5mby5oZWlnaHQgKiBzaXplb2YodWNoICopKTsKLSAgICBpZiAoIXJwbmcyX2luZm8ucm93X3BvaW50ZXJzKSB7Ci0gICAgICAgIGZyZWUocnBuZzJfaW5mby5pbWFnZV9kYXRhKTsKLSAgICAgICAgcnBuZzJfaW5mby5pbWFnZV9kYXRhID0gTlVMTDsKLSAgICAgICAgcmVhZHBuZzJfY2xlYW51cCgmcnBuZzJfaW5mbyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytpKQotICAgICAgICBycG5nMl9pbmZvLnJvd19wb2ludGVyc1tpXSA9IHJwbmcyX2luZm8uaW1hZ2VfZGF0YSArIGkqcm93Ynl0ZXM7Ci0KLQotICAgIC8qIGRvIHRoZSBiYXNpYyBYIGluaXRpYWxpemF0aW9uIHN0dWZmLCBtYWtlIHRoZSB3aW5kb3csIGFuZCBmaWxsIGl0IHdpdGgKLSAgICAgKiB0aGUgdXNlci1zcGVjaWZpZWQsIGZpbGUtc3BlY2lmaWVkIG9yIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvciBvcgotICAgICAqIHBhdHRlcm4gKi8KLQotICAgIGlmIChycG5nMl94X2NyZWF0ZV93aW5kb3coKSkgewotCi0gICAgICAgIC8qIEdSUiBURU1QT1JBUlkgSEFDSzogIHRoaXMgaXMgZnVuZGFtZW50YWxseSBubyBkaWZmZXJlbnQgZnJvbSBjYXNlcwotICAgICAgICAgKiBhYm92ZTsgbGlicG5nIHNob3VsZCBsb25nam1wKCkgYmFjayB0byB1cyB3aGVuIHBuZ19wdHIgZ29lcyBhd2F5LgotICAgICAgICAgKiBJZiB3ZS9pdCBzZWdmYXVsdCBpbnN0ZWFkLCBzZWVtcyBsaWtlIGEgbGlicG5nIGJ1Zy4uLiAqLwotCi0gICAgICAgIC8qIHdlJ3JlIGhlcmUgdmlhIGxpYnBuZyBjYWxsYmFjaywgc28gaWYgd2luZG93IGZhaWxzLCBjbGVhbiBhbmQgYmFpbCAqLwotICAgICAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKLSAgICAgICAgcnBuZzJfeF9jbGVhbnVwKCk7Ci0gICAgICAgIGV4aXQoMik7Ci0gICAgfQotCi0gICAgcnBuZzJfaW5mby5zdGF0ZSA9IGtXaW5kb3dJbml0OwotfQotCi0KLQotCi0KLXN0YXRpYyBpbnQgcnBuZzJfeF9jcmVhdGVfd2luZG93KHZvaWQpCi17Ci0gICAgdWxnIGJnX3JlZCAgID0gcnBuZzJfaW5mby5iZ19yZWQ7Ci0gICAgdWxnIGJnX2dyZWVuID0gcnBuZzJfaW5mby5iZ19ncmVlbjsKLSAgICB1bGcgYmdfYmx1ZSAgPSBycG5nMl9pbmZvLmJnX2JsdWU7Ci0gICAgdWxnIGJnX3BpeGVsID0gMEw7Ci0gICAgdWxnIGF0dHJtYXNrOwotICAgIGludCBuZWVkX2NvbG9ybWFwID0gRkFMU0U7Ci0gICAgaW50IHNjcmVlbiwgcGFkOwotICAgIHVjaCAqeGRhdGE7Ci0gICAgV2luZG93IHJvb3Q7Ci0gICAgWEV2ZW50IGU7Ci0gICAgWEdDVmFsdWVzIGdjdmFsdWVzOwotICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci0gICAgWFRleHRQcm9wZXJ0eSB3aW5kb3dOYW1lLCAqcFdpbmRvd05hbWUgPSAmd2luZG93TmFtZTsKLSAgICBYVGV4dFByb3BlcnR5IGljb25OYW1lLCAqcEljb25OYW1lID0gJmljb25OYW1lOwotICAgIFhWaXN1YWxJbmZvIHZpc3VhbF9pbmZvOwotICAgIFhTaXplSGludHMgKnNpemVfaGludHM7Ci0gICAgWFdNSGludHMgKndtX2hpbnRzOwotICAgIFhDbGFzc0hpbnQgKmNsYXNzX2hpbnRzOwotCi0KLSAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIHJwbmcyX3hfY3JlYXRlX3dpbmRvdygpXG4iKSkKLQotICAgIHNjcmVlbiA9IERlZmF1bHRTY3JlZW4oZGlzcGxheSk7Ci0gICAgZGVwdGggPSBEaXNwbGF5UGxhbmVzKGRpc3BsYXksIHNjcmVlbik7Ci0gICAgcm9vdCA9IFJvb3RXaW5kb3coZGlzcGxheSwgc2NyZWVuKTsKLQotI2lmZGVmIERFQlVHCi0gICAgWFN5bmNocm9uaXplKGRpc3BsYXksIFRydWUpOwotI2VuZGlmCi0KLSAgICBpZiAoZGVwdGggIT0gMTYgJiYgZGVwdGggIT0gMjQgJiYgZGVwdGggIT0gMzIpIHsKLSAgICAgICAgaW50IHZpc3VhbHNfbWF0Y2hlZCA9IDA7Ci0KLSAgICAgICAgVHJhY2UoKHN0ZGVyciwgImRlZmF1bHQgZGVwdGggaXMgJWQ6ICBjaGVja2luZyBvdGhlciB2aXN1YWxzXG4iLAotICAgICAgICAgIGRlcHRoKSkKLQotICAgICAgICAvKiAyNC1iaXQgZmlyc3QgKi8KLSAgICAgICAgdmlzdWFsX2luZm8uc2NyZWVuID0gc2NyZWVuOwotICAgICAgICB2aXN1YWxfaW5mby5kZXB0aCA9IDI0OwotICAgICAgICB2aXN1YWxfbGlzdCA9IFhHZXRWaXN1YWxJbmZvKGRpc3BsYXksCi0gICAgICAgICAgVmlzdWFsU2NyZWVuTWFzayB8IFZpc3VhbERlcHRoTWFzaywgJnZpc3VhbF9pbmZvLCAmdmlzdWFsc19tYXRjaGVkKTsKLSAgICAgICAgaWYgKHZpc3VhbHNfbWF0Y2hlZCA9PSAwKSB7Ci0vKiBHUlI6ICBhZGQgMTUtLCAxNi0gYW5kIDMyLWJpdCBUcnVlQ29sb3IgdmlzdWFscyAoYWxzbyBEaXJlY3RDb2xvcj8pICovCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRlZmF1bHQgc2NyZWVuIGRlcHRoICVkIG5vdCBzdXBwb3J0ZWQsIGFuZCBubyIKLSAgICAgICAgICAgICAgIiAyNC1iaXQgdmlzdWFscyBmb3VuZFxuIiwgZGVwdGgpOwotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0KLSAgICAgICAgVHJhY2UoKHN0ZGVyciwgIlhHZXRWaXN1YWxJbmZvKCkgcmV0dXJuZWQgJWQgMjQtYml0IHZpc3VhbHNcbiIsCi0gICAgICAgICAgdmlzdWFsc19tYXRjaGVkKSkKLSAgICAgICAgdmlzdWFsID0gdmlzdWFsX2xpc3RbMF0udmlzdWFsOwotICAgICAgICBkZXB0aCA9IHZpc3VhbF9saXN0WzBdLmRlcHRoOwotLyoKLSAgICAgICAgY29sb3JtYXBfc2l6ZSA9IHZpc3VhbF9saXN0WzBdLmNvbG9ybWFwX3NpemU7Ci0gICAgICAgIHZpc3VhbF9jbGFzcyA9IHZpc3VhbC0+Y2xhc3M7Ci0gICAgICAgIHZpc3VhbElEID0gWFZpc3VhbElERnJvbVZpc3VhbCh2aXN1YWwpOwotICovCi0gICAgICAgIGhhdmVfbm9uZGVmYXVsdF92aXN1YWwgPSBUUlVFOwotICAgICAgICBuZWVkX2NvbG9ybWFwID0gVFJVRTsKLSAgICB9IGVsc2UgewotICAgICAgICBYTWF0Y2hWaXN1YWxJbmZvKGRpc3BsYXksIHNjcmVlbiwgZGVwdGgsIFRydWVDb2xvciwgJnZpc3VhbF9pbmZvKTsKLSAgICAgICAgdmlzdWFsID0gdmlzdWFsX2luZm8udmlzdWFsOwotICAgIH0KLQotICAgIFJNYXNrID0gdmlzdWFsLT5yZWRfbWFzazsKLSAgICBHTWFzayA9IHZpc3VhbC0+Z3JlZW5fbWFzazsKLSAgICBCTWFzayA9IHZpc3VhbC0+Ymx1ZV9tYXNrOwotCi0vKiBHUlI6ICBhZGQvY2hlY2sgOC1iaXQgc3VwcG9ydCAqLwotICAgIGlmIChkZXB0aCA9PSA4IHx8IG5lZWRfY29sb3JtYXApIHsKLSAgICAgICAgY29sb3JtYXAgPSBYQ3JlYXRlQ29sb3JtYXAoZGlzcGxheSwgcm9vdCwgdmlzdWFsLCBBbGxvY05vbmUpOwotICAgICAgICBpZiAoIWNvbG9ybWFwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlhDcmVhdGVDb2xvcm1hcCgpIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICBoYXZlX2NvbG9ybWFwID0gVFJVRTsKLSAgICAgICAgaWYgKGRlcHRoID09IDgpCi0gICAgICAgICAgICBiZ19pbWFnZSA9IEZBTFNFOyAgIC8qIGdyYWRpZW50IGp1c3Qgd2FzdGVzIHBhbGV0dGUgZW50cmllcyAqLwotICAgIH0KLSAgICBpZiAoZGVwdGggPT0gMTUgfHwgZGVwdGggPT0gMTYpIHsKLSAgICAgICAgUlNoaWZ0ID0gMTUgLSBycG5nMl94X21zYihSTWFzayk7ICAgIC8qIHRoZXNlIGFyZSByaWdodC1zaGlmdHMgKi8KLSAgICAgICAgR1NoaWZ0ID0gMTUgLSBycG5nMl94X21zYihHTWFzayk7Ci0gICAgICAgIEJTaGlmdCA9IDE1IC0gcnBuZzJfeF9tc2IoQk1hc2spOwotICAgIH0gZWxzZSBpZiAoZGVwdGggPiAxNikgewotICAgICAgICBSU2hpZnQgPSBycG5nMl94X21zYihSTWFzaykgLSA3OyAgICAgLyogdGhlc2UgYXJlIGxlZnQtc2hpZnRzICovCi0gICAgICAgIEdTaGlmdCA9IHJwbmcyX3hfbXNiKEdNYXNrKSAtIDc7Ci0gICAgICAgIEJTaGlmdCA9IHJwbmcyX3hfbXNiKEJNYXNrKSAtIDc7Ci0gICAgfQotICAgIGlmIChkZXB0aCA+PSAxNSAmJiAoUlNoaWZ0IDwgMCB8fCBHU2hpZnQgPCAwIHx8IEJTaGlmdCA8IDApKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAicnBuZzIgaW50ZXJuYWwgbG9naWMgZXJyb3I6ICBuZWdhdGl2ZSBYIHNoaWZ0KHMpIVxuIik7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBGaW5hbGx5LCBjcmVhdGUgdGhlIHdpbmRvdy4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGF0dHIuYmFja2luZ19zdG9yZSA9IEFsd2F5czsKLSAgICBhdHRyLmV2ZW50X21hc2sgPSBFeHBvc3VyZU1hc2sgfCBLZXlQcmVzc01hc2sgfCBCdXR0b25QcmVzc01hc2s7Ci0gICAgYXR0cm1hc2sgPSBDV0JhY2tpbmdTdG9yZSB8IENXRXZlbnRNYXNrOwotICAgIGlmIChoYXZlX25vbmRlZmF1bHRfdmlzdWFsKSB7Ci0gICAgICAgIGF0dHIuY29sb3JtYXAgPSBjb2xvcm1hcDsKLSAgICAgICAgYXR0ci5iYWNrZ3JvdW5kX3BpeGVsID0gMDsKLSAgICAgICAgYXR0ci5ib3JkZXJfcGl4ZWwgPSAxOwotICAgICAgICBhdHRybWFzayB8PSBDV0NvbG9ybWFwIHwgQ1dCYWNrUGl4ZWwgfCBDV0JvcmRlclBpeGVsOwotICAgIH0KLQotICAgIHdpbmRvdyA9IFhDcmVhdGVXaW5kb3coZGlzcGxheSwgcm9vdCwgMCwgMCwgcnBuZzJfaW5mby53aWR0aCwKLSAgICAgIHJwbmcyX2luZm8uaGVpZ2h0LCAwLCBkZXB0aCwgSW5wdXRPdXRwdXQsIHZpc3VhbCwgYXR0cm1hc2ssICZhdHRyKTsKLQotICAgIGlmICh3aW5kb3cgPT0gTm9uZSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlhDcmVhdGVXaW5kb3coKSBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gMjsKLSAgICB9IGVsc2UKLSAgICAgICAgaGF2ZV93aW5kb3cgPSBUUlVFOwotCi0gICAgaWYgKGRlcHRoID09IDgpCi0gICAgICAgIFhTZXRXaW5kb3dDb2xvcm1hcChkaXNwbGF5LCB3aW5kb3csIGNvbG9ybWFwKTsKLQotICAgIGlmICghWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eSgmd2luZG93X25hbWUsIDEsIHBXaW5kb3dOYW1lKSkKLSAgICAgICAgcFdpbmRvd05hbWUgPSBOVUxMOwotICAgIGlmICghWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eSgmaWNvbl9uYW1lLCAxLCBwSWNvbk5hbWUpKQotICAgICAgICBwSWNvbk5hbWUgPSBOVUxMOwotCi0gICAgLyogT0sgaWYgZWl0aGVyIGhpbnRzIGFsbG9jYXRpb24gZmFpbHM7IFhTZXRXTVByb3BlcnRpZXMoKSBhbGxvd3MgTlVMTHMgKi8KLQotICAgIGlmICgoc2l6ZV9oaW50cyA9IFhBbGxvY1NpemVIaW50cygpKSAhPSBOVUxMKSB7Ci0gICAgICAgIC8qIHdpbmRvdyB3aWxsIG5vdCBiZSByZXNpemFibGUgKi8KLSAgICAgICAgc2l6ZV9oaW50cy0+ZmxhZ3MgPSBQTWluU2l6ZSB8IFBNYXhTaXplOwotICAgICAgICBzaXplX2hpbnRzLT5taW5fd2lkdGggPSBzaXplX2hpbnRzLT5tYXhfd2lkdGggPSAoaW50KXJwbmcyX2luZm8ud2lkdGg7Ci0gICAgICAgIHNpemVfaGludHMtPm1pbl9oZWlnaHQgPSBzaXplX2hpbnRzLT5tYXhfaGVpZ2h0ID0KLSAgICAgICAgICAoaW50KXJwbmcyX2luZm8uaGVpZ2h0OwotICAgIH0KLQotICAgIGlmICgod21faGludHMgPSBYQWxsb2NXTUhpbnRzKCkpICE9IE5VTEwpIHsKLSAgICAgICAgd21faGludHMtPmluaXRpYWxfc3RhdGUgPSBOb3JtYWxTdGF0ZTsKLSAgICAgICAgd21faGludHMtPmlucHV0ID0gVHJ1ZTsKLSAgICAgLyogd21faGludHMtPmljb25fcGl4bWFwID0gaWNvbl9waXhtYXA7ICovCi0gICAgICAgIHdtX2hpbnRzLT5mbGFncyA9IFN0YXRlSGludCB8IElucHV0SGludCAgLyogfCBJY29uUGl4bWFwSGludCAqLyA7Ci0gICAgfQotCi0gICAgaWYgKChjbGFzc19oaW50cyA9IFhBbGxvY0NsYXNzSGludCgpKSAhPSBOVUxMKSB7Ci0gICAgICAgIGNsYXNzX2hpbnRzLT5yZXNfbmFtZSA9IHJlc19uYW1lOwotICAgICAgICBjbGFzc19oaW50cy0+cmVzX2NsYXNzID0gcmVzX2NsYXNzOwotICAgIH0KLQotICAgIFhTZXRXTVByb3BlcnRpZXMoZGlzcGxheSwgd2luZG93LCBwV2luZG93TmFtZSwgcEljb25OYW1lLCBOVUxMLCAwLAotICAgICAgc2l6ZV9oaW50cywgd21faGludHMsIGNsYXNzX2hpbnRzKTsKLQotICAgIC8qIHZhcmlvdXMgcHJvcGVydGllcyBhbmQgaGludHMgbm8gbG9uZ2VyIG5lZWRlZDsgZnJlZSBtZW1vcnkgKi8KLSAgICBpZiAocFdpbmRvd05hbWUpCi0gICAgICAgWEZyZWUocFdpbmRvd05hbWUtPnZhbHVlKTsKLSAgICBpZiAocEljb25OYW1lKQotICAgICAgIFhGcmVlKHBJY29uTmFtZS0+dmFsdWUpOwotICAgIGlmIChzaXplX2hpbnRzKQotICAgICAgICBYRnJlZShzaXplX2hpbnRzKTsKLSAgICBpZiAod21faGludHMpCi0gICAgICAgWEZyZWUod21faGludHMpOwotICAgIGlmIChjbGFzc19oaW50cykKLSAgICAgICBYRnJlZShjbGFzc19oaW50cyk7Ci0KLSAgICBYTWFwV2luZG93KGRpc3BsYXksIHdpbmRvdyk7Ci0KLSAgICBnYyA9IFhDcmVhdGVHQyhkaXNwbGF5LCB3aW5kb3csIDAsICZnY3ZhbHVlcyk7Ci0gICAgaGF2ZV9nYyA9IFRSVUU7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgWC0gYW5kIGRpc3BsYXktc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgaW1hZ2UuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBpZiAoZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpIHsKLSAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKDQqcnBuZzJfaW5mby53aWR0aCpycG5nMl9pbmZvLmhlaWdodCk7Ci0gICAgICAgIHBhZCA9IDMyOwotICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMTYpIHsKLSAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKDIqcnBuZzJfaW5mby53aWR0aCpycG5nMl9pbmZvLmhlaWdodCk7Ci0gICAgICAgIHBhZCA9IDE2OwotICAgIH0gZWxzZSAvKiBkZXB0aCA9PSA4ICovIHsKLSAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKHJwbmcyX2luZm8ud2lkdGgqcnBuZzJfaW5mby5oZWlnaHQpOwotICAgICAgICBwYWQgPSA4OwotICAgIH0KLQotICAgIGlmICgheGRhdGEpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICB1bmFibGUgdG8gYWxsb2NhdGUgaW1hZ2UgbWVtb3J5XG4iKTsKLSAgICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotCi0gICAgeGltYWdlID0gWENyZWF0ZUltYWdlKGRpc3BsYXksIHZpc3VhbCwgZGVwdGgsIFpQaXhtYXAsIDAsCi0gICAgICAoY2hhciAqKXhkYXRhLCBycG5nMl9pbmZvLndpZHRoLCBycG5nMl9pbmZvLmhlaWdodCwgcGFkLCAwKTsKLQotICAgIGlmICgheGltYWdlKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgWENyZWF0ZUltYWdlKCkgZmFpbGVkXG4iKTsKLSAgICAgICAgZnJlZSh4ZGF0YSk7Ci0gICAgICAgIHJldHVybiAzOwotICAgIH0KLQotICAgIC8qIHRvIGF2b2lkIHRlc3RpbmcgdGhlIGJ5dGUgb3JkZXIgZXZlcnkgcGl4ZWwgKG9yIGRvdWJsaW5nIHRoZSBzaXplIG9mCi0gICAgICogdGhlIGRyYXdpbmcgcm91dGluZSB3aXRoIGEgZ2lhbnQgaWYtdGVzdCksIHdlIGFyYml0cmFyaWx5IHNldCB0aGUgYnl0ZQotICAgICAqIG9yZGVyIHRvIE1TQkZpcnN0IGFuZCBsZXQgWGxpYiB3b3JyeSBhYm91dCBpbnZlcnRpbmcgdGhpbmdzIG9uIGxpdHRsZS0KLSAgICAgKiBlbmRpYW4gbWFjaGluZXMgKGUuZy4sIExpbnV4L3g4Niwgb2xkIFZBWGVuLCBldGMuKS0tdGhpcyBpcyBub3QgdGhlCi0gICAgICogbW9zdCBlZmZpY2llbnQgYXBwcm9hY2ggKHRoZSBnaWFudCBpZi10ZXN0IHdvdWxkIGJlIGJldHRlciksIGJ1dCBpbgotICAgICAqIHRoZSBpbnRlcmVzdCBvZiBjbGFyaXR5LCB3ZSdsbCB0YWtlIHRoZSBlYXN5IHdheSBvdXQuLi4gKi8KLQotICAgIHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEZpbGwgd2luZG93IHdpdGggdGhlIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yIChkZWZhdWx0IGlzIGJsYWNrKSBvcgotICAgIGZha2VkICJiYWNrZ3JvdW5kIGltYWdlIiAoYnV0IGxhdHRlciBpcyBkaXNhYmxlZCBpZiA4LWJpdDsgZ3JhZGllbnRzCi0gICAganVzdCB3YXN0ZSBwYWxldHRlIGVudHJpZXMpLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKGJnX2ltYWdlKQotICAgICAgICBycG5nMl94X2xvYWRfYmdfaW1hZ2UoKTsgICAgLyogcmVzZXRzIGJnX2ltYWdlIGlmIGZhaWxzICovCi0KLSAgICBpZiAoIWJnX2ltYWdlKSB7Ci0gICAgICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewotICAgICAgICAgICAgYmdfcGl4ZWwgPSAoYmdfcmVkICAgPDwgUlNoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgIChiZ19ncmVlbiA8PCBHU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgKGJnX2JsdWUgIDw8IEJTaGlmdCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMTYpIHsKLSAgICAgICAgICAgIGJnX3BpeGVsID0gKCgoYmdfcmVkICAgPDwgOCkgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICgoKGJnX2dyZWVuIDw8IDgpID4+IEdTaGlmdCkgJiBHTWFzaykgfAotICAgICAgICAgICAgICAgICAgICAgICAoKChiZ19ibHVlICA8PCA4KSA+PiBCU2hpZnQpICYgQk1hc2spOwotICAgICAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7Ci0KLSAgICAgICAgICAgIC8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCi0KLSAgICAgICAgfQotICAgICAgICBYU2V0Rm9yZWdyb3VuZChkaXNwbGF5LCBnYywgYmdfcGl4ZWwpOwotICAgICAgICBYRmlsbFJlY3RhbmdsZShkaXNwbGF5LCB3aW5kb3csIGdjLCAwLCAwLCBycG5nMl9pbmZvLndpZHRoLAotICAgICAgICAgIHJwbmcyX2luZm8uaGVpZ2h0KTsKLSAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgV2FpdCBmb3IgZmlyc3QgRXhwb3NlIGV2ZW50IHRvIGRvIGFueSBkcmF3aW5nLCB0aGVuIGZsdXNoIGFuZCByZXR1cm4uCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBkbwotICAgICAgICBYTmV4dEV2ZW50KGRpc3BsYXksICZlKTsKLSAgICB3aGlsZSAoZS50eXBlICE9IEV4cG9zZSB8fCBlLnhleHBvc2UuY291bnQpOwotCi0gICAgWEZsdXNoKGRpc3BsYXkpOwotCi0gICAgcmV0dXJuIDA7Ci0KLX0gLyogZW5kIGZ1bmN0aW9uIHJwbmcyX3hfY3JlYXRlX3dpbmRvdygpICovCi0KLQotCi0KLQotc3RhdGljIGludCBycG5nMl94X2xvYWRfYmdfaW1hZ2Uodm9pZCkKLXsKLSAgICB1Y2ggKnNyYzsKLSAgICBjaGFyICpkZXN0OwotICAgIHVjaCByMSwgcjIsIGcxLCBnMiwgYjEsIGIyOwotICAgIHVjaCByMV9pbnYsIHIyX2ludiwgZzFfaW52LCBnMl9pbnYsIGIxX2ludiwgYjJfaW52OwotICAgIGludCBrLCBobWF4LCBtYXg7Ci0gICAgaW50IHhpZHgsIHlpZHgsIHlpZHhfbWF4OwotICAgIGludCBldmVuX29kZF92ZXJ0LCBldmVuX29kZF9ob3JpeiwgZXZlbl9vZGQ7Ci0gICAgaW50IGludmVydF9ncmFkaWVudDIgPSAoYmdbcGF0XS50eXBlICYgMHgwOCk7Ci0gICAgaW50IGludmVydF9jb2x1bW47Ci0gICAgaW50IHhpbWFnZV9yb3dieXRlcyA9IHhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmU7Ci0gICAgdWxnIGksIHJvdzsKLSAgICB1bGcgcGl4ZWw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgQWxsb2NhdGUgYnVmZmVyIGZvciBmYWtlIGJhY2tncm91bmQgaW1hZ2UgdG8gYmUgdXNlZCB3aXRoIHRyYW5zcGFyZW50Ci0gICAgaW1hZ2VzOyBpZiB0aGlzIGZhaWxzLCByZXZlcnQgdG8gcGxhaW4gYmFja2dyb3VuZCBjb2xvci4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGJnX3Jvd2J5dGVzID0gMyAqIHJwbmcyX2luZm8ud2lkdGg7Ci0gICAgYmdfZGF0YSA9ICh1Y2ggKiltYWxsb2MoYmdfcm93Ynl0ZXMgKiBycG5nMl9pbmZvLmhlaWdodCk7Ci0gICAgaWYgKCFiZ19kYXRhKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICI6ICB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBiYWNrZ3JvdW5kIGltYWdlXG4iKTsKLSAgICAgICAgYmdfaW1hZ2UgPSAwOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBiZ3NjYWxlID0gKHBhdCA9PSAwKT8gOCA6IGJnc2NhbGVfZGVmYXVsdDsKLSAgICB5aWR4X21heCA9IGJnc2NhbGUgLSAxOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFZlcnRpY2FsIGdyYWRpZW50cyAocmFtcHMpIGluIE54TiBzcXVhcmVzLCBhbHRlcm5hdGluZyBkaXJlY3Rpb24gYW5kCi0gICAgY29sb3JzIChOID09IGJnc2NhbGUpLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAwKSB7Ci0gICAgICAgIHVjaCByMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLnI7Ci0gICAgICAgIHVjaCBnMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmc7Ci0gICAgICAgIHVjaCBiMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmI7Ci0gICAgICAgIHVjaCByMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLnI7Ci0gICAgICAgIHVjaCBnMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmc7Ci0gICAgICAgIHVjaCBiMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmI7Ci0gICAgICAgIGludCByMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLnIgLSByMV9taW47Ci0gICAgICAgIGludCBnMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmcgLSBnMV9taW47Ci0gICAgICAgIGludCBiMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmIgLSBiMV9taW47Ci0gICAgICAgIGludCByMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLnIgLSByMl9taW47Ci0gICAgICAgIGludCBnMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmcgLSBnMl9taW47Ci0gICAgICAgIGludCBiMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmIgLSBiMl9taW47Ci0KLSAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewotICAgICAgICAgICAgeWlkeCA9IChpbnQpKHJvdyAlIGJnc2NhbGUpOwotICAgICAgICAgICAgZXZlbl9vZGRfdmVydCA9IChpbnQpKChyb3cgLyBiZ3NjYWxlKSAmIDEpOwotCi0gICAgICAgICAgICByMSA9IHIxX21pbiArIChyMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGcxID0gZzFfbWluICsgKGcxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgYjEgPSBiMV9taW4gKyAoYjFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICByMV9pbnYgPSByMV9taW4gKyAocjFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGcxX2ludiA9IGcxX21pbiArIChnMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgYjFfaW52ID0gYjFfbWluICsgKGIxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0KLSAgICAgICAgICAgIHIyID0gcjJfbWluICsgKHIyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgZzIgPSBnMl9taW4gKyAoZzJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBiMiA9IGIyX21pbiArIChiMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIHIyX2ludiA9IHIyX21pbiArIChyMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgZzJfaW52ID0gZzJfbWluICsgKGcyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBiMl9pbnYgPSBiMl9taW4gKyAoYjJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLQotICAgICAgICAgICAgZGVzdCA9IChjaGFyICopYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewotICAgICAgICAgICAgICAgIGV2ZW5fb2RkX2hvcml6ID0gKGludCkoKGkgLyBiZ3NjYWxlKSAmIDEpOwotICAgICAgICAgICAgICAgIGV2ZW5fb2RkID0gZXZlbl9vZGRfdmVydCBeIGV2ZW5fb2RkX2hvcml6OwotICAgICAgICAgICAgICAgIGludmVydF9jb2x1bW4gPQotICAgICAgICAgICAgICAgICAgKGV2ZW5fb2RkX2hvcml6ICYmIChiZ1twYXRdLnR5cGUgJiAweDEwKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW5fb2RkID09IDApIHsgICAgICAgIC8qIGdyYWRpZW50ICMxICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbnZlcnRfY29sdW1uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjFfaW52OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcxX2ludjsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMV9pbnY7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogZ3JhZGllbnQgIzIgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChpbnZlcnRfY29sdW1uICYmIGludmVydF9ncmFkaWVudDIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoIWludmVydF9jb2x1bW4gJiYgIWludmVydF9ncmFkaWVudDIpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjI7ICAgICAgIC8qIG5vdCBpbnZlcnRlZCBvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcyOyAgICAgICAvKiAgZG91Ymx5IGludmVydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjJfaW52OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcyX2ludjsgICAvKiBzaW5nbHkgaW52ZXJ0ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMl9pbnY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBTb2Z0IGdyYWRpZW50LWRpYW1vbmRzIHdpdGggc2NhbGUgPSBiZ3NjYWxlLiAgQ29kZSBjb250cmlidXRlZCBieSBBZGFtCi0gICAgTS4gQ29zdGVsbG8uCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICB9IGVsc2UgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAxKSB7Ci0KLSAgICAgICAgaG1heCA9IChiZ3NjYWxlLTEpLzI7ICAgLyogaGFsZiB0aGUgbWF4IHdlaWdodCBvZiBhIGNvbG9yICovCi0gICAgICAgIG1heCA9IDIqaG1heDsgICAgICAgICAgIC8qIHRoZSBtYXggd2VpZ2h0IG9mIGEgY29sb3IgKi8KLQotICAgICAgICByMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5yOwotICAgICAgICBnMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5nOwotICAgICAgICBiMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iOwotICAgICAgICByMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5yOwotICAgICAgICBnMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5nOwotICAgICAgICBiMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iOwotCi0gICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHlpZHggPSAoaW50KShyb3cgJSBiZ3NjYWxlKTsKLSAgICAgICAgICAgIGlmICh5aWR4ID4gaG1heCkKLSAgICAgICAgICAgICAgICB5aWR4ID0gYmdzY2FsZS0xIC0geWlkeDsKLSAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKLSAgICAgICAgICAgICAgICB4aWR4ID0gKGludCkoaSAlIGJnc2NhbGUpOwotICAgICAgICAgICAgICAgIGlmICh4aWR4ID4gaG1heCkKLSAgICAgICAgICAgICAgICAgICAgeGlkeCA9IGJnc2NhbGUtMSAtIHhpZHg7Ci0gICAgICAgICAgICAgICAgayA9IHhpZHggKyB5aWR4OwotICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypyMSArIChtYXgtaykqcjIpIC8gbWF4OwotICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypnMSArIChtYXgtaykqZzIpIC8gbWF4OwotICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypiMSArIChtYXgtaykqYjIpIC8gbWF4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUmFkaWFsICJzdGFyYnVyc3QiIHdpdGggYXppbXV0aGFsIHNpbnVzb2lkczsgW2V2ZW50dWFsbHkgbnVtYmVyIG9mIHNpbnUtCi0gICAgc29pZHMgd2lsbCBlcXVhbCBiZ3NjYWxlP10uICBUaGlzIG9uZSBpcyBzbG93IGJ1dCB2ZXJ5IGNvb2wuICBDb2RlIGNvbi0KLSAgICB0cmlidXRlZCBieSBQaWV0ZXIgUy4gdmFuIGRlciBNZXVsZW4gKG9yaWdpbmFsbHkgaW4gU21hbGx0YWxrKS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIH0gZWxzZSBpZiAoKGJnW3BhdF0udHlwZSAmIDB4MDcpID09IDIpIHsKLSAgICAgICAgdWNoIGNoOwotICAgICAgICBpbnQgaWksIHgsIHksIGh3LCBoaCwgZ3JheXNwb3Q7Ci0gICAgICAgIGRvdWJsZSBmcmVxLCByb3RhdGUsIHNhdHVyYXRlLCBncmF5LCBpbnRlbnNpdHk7Ci0gICAgICAgIGRvdWJsZSBhbmdsZT0wLjAsIGFvZmZzZXQ9MC4wLCBtYXhEaXN0LCBkaXN0OwotICAgICAgICBkb3VibGUgcmVkPTAuMCwgZ3JlZW49MC4wLCBibHVlPTAuMCwgaHVlLCBzLCB2LCBmLCBwLCBxLCB0OwotCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICBjb21wdXRpbmcgcmFkaWFsIGJhY2tncm91bmQuLi4iLAotICAgICAgICAgIFBST0dOQU1FKTsKLSAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0KLSAgICAgICAgaGggPSAoaW50KShycG5nMl9pbmZvLmhlaWdodCAvIDIpOwotICAgICAgICBodyA9IChpbnQpKHJwbmcyX2luZm8ud2lkdGggLyAyKTsKLQotICAgICAgICAvKiB2YXJpYWJsZXMgZm9yIHJhZGlhbCB3YXZlczoKLSAgICAgICAgICogICBhb2Zmc2V0OiAgbnVtYmVyIG9mIGRlZ3JlZXMgdG8gcm90YXRlIGh1ZSBbQ1VSUkVOVExZIE5PVCBVU0VEXQotICAgICAgICAgKiAgIGZyZXE6ICBudW1iZXIgb2YgY29sb3IgYmVhbXMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgY2VudGVyCi0gICAgICAgICAqICAgZ3JheXNwb3Q6ICBzaXplIG9mIHRoZSBncmF5aW5nIGNlbnRlciBhcmVhIChhbnRpLWFsaWFzKQotICAgICAgICAgKiAgIHJvdGF0ZTogIHJvdGF0aW9uIG9mIHRoZSBiZWFtcyBhcyBhIGZ1bmN0aW9uIG9mIHJhZGl1cwotICAgICAgICAgKiAgIHNhdHVyYXRlOiAgc2F0dXJhdGlvbiBvZiBiZWFtcycgc2hhcGUgYXppbXV0aGFsbHkKLSAgICAgICAgICovCi0gICAgICAgIGFuZ2xlID0gQ0xJUChhbmdsZSwgMC4wLCAzNjAuMCk7Ci0gICAgICAgIGdyYXlzcG90ID0gQ0xJUChiZ1twYXRdLmJnX2dyYXksIDEsIChoaCArIGh3KSk7Ci0gICAgICAgIGZyZXEgPSBNQVgoKGRvdWJsZSliZ1twYXRdLmJnX2ZyZXEsIDAuMCk7Ci0gICAgICAgIHNhdHVyYXRlID0gKGRvdWJsZSliZ1twYXRdLmJnX2JzYXQgKiAwLjE7Ci0gICAgICAgIHJvdGF0ZSA9IChkb3VibGUpYmdbcGF0XS5iZ19icm90ICogMC4xOwotICAgICAgICBncmF5ID0gMC4wOwotICAgICAgICBpbnRlbnNpdHkgPSAwLjA7Ci0gICAgICAgIG1heERpc3QgPSAoZG91YmxlKSgoaHcqaHcpICsgKGhoKmhoKSk7Ci0KLSAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewotICAgICAgICAgICAgeSA9IChpbnQpKHJvdyAtIGhoKTsKLSAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKLSAgICAgICAgICAgICAgICB4ID0gKGludCkoaSAtIGh3KTsKLSAgICAgICAgICAgICAgICBhbmdsZSA9ICh4ID09IDApPyBQSV8yIDogYXRhbigoZG91YmxlKXkgLyAoZG91YmxlKXgpOwotICAgICAgICAgICAgICAgIGdyYXkgPSAoZG91YmxlKU1BWChBQlMoeSksIEFCUyh4KSkgLyBncmF5c3BvdDsKLSAgICAgICAgICAgICAgICBncmF5ID0gTUlOKDEuMCwgZ3JheSk7Ci0gICAgICAgICAgICAgICAgZGlzdCA9IChkb3VibGUpKCh4KngpICsgKHkqeSkpIC8gbWF4RGlzdDsKLSAgICAgICAgICAgICAgICBpbnRlbnNpdHkgPSBjb3MoKGFuZ2xlKyhyb3RhdGUqZGlzdCpQSSkpICogZnJlcSkgKgotICAgICAgICAgICAgICAgICAgZ3JheSAqIHNhdHVyYXRlOwotICAgICAgICAgICAgICAgIGludGVuc2l0eSA9IChNQVgoTUlOKGludGVuc2l0eSwxLjApLC0xLjApICsgMS4wKSAqIDAuNTsKLSAgICAgICAgICAgICAgICBodWUgPSAoYW5nbGUgKyBQSSkgKiBJTlZfUElfMzYwICsgYW9mZnNldDsKLSAgICAgICAgICAgICAgICBzID0gZ3JheSAqICgoZG91YmxlKShBQlMoeCkrQUJTKHkpKSAvIChkb3VibGUpKGh3ICsgaGgpKTsKLSAgICAgICAgICAgICAgICBzID0gTUlOKE1BWChzLDAuMCksIDEuMCk7Ci0gICAgICAgICAgICAgICAgdiA9IE1JTihNQVgoaW50ZW5zaXR5LDAuMCksIDEuMCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocyA9PSAwLjApIHsKLSAgICAgICAgICAgICAgICAgICAgY2ggPSAodWNoKSh2ICogMjU1LjApOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoaHVlIDwgMC4wKSB8fCAoaHVlID49IDM2MC4wKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGh1ZSAtPSAoKChpbnQpKGh1ZSAvIDM2MC4wKSkgKiAzNjAuMCk7Ci0gICAgICAgICAgICAgICAgICAgIGh1ZSAvPSA2MC4wOwotICAgICAgICAgICAgICAgICAgICBpaSA9IChpbnQpaHVlOwotICAgICAgICAgICAgICAgICAgICBmID0gaHVlIC0gKGRvdWJsZSlpaTsKLSAgICAgICAgICAgICAgICAgICAgcCA9ICgxLjAgLSBzKSAqIHY7Ci0gICAgICAgICAgICAgICAgICAgIHEgPSAoMS4wIC0gKHMgKiBmKSkgKiB2OwotICAgICAgICAgICAgICAgICAgICB0ID0gKDEuMCAtIChzICogKDEuMCAtIGYpKSkgKiB2OwotICAgICAgICAgICAgICAgICAgICBpZiAgICAgIChpaSA9PSAwKSB7IHJlZCA9IHY7IGdyZWVuID0gdDsgYmx1ZSA9IHA7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMSkgeyByZWQgPSBxOyBncmVlbiA9IHY7IGJsdWUgPSBwOyB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDIpIHsgcmVkID0gcDsgZ3JlZW4gPSB2OyBibHVlID0gdDsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAzKSB7IHJlZCA9IHA7IGdyZWVuID0gcTsgYmx1ZSA9IHY7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gNCkgeyByZWQgPSB0OyBncmVlbiA9IHA7IGJsdWUgPSB2OyB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDUpIHsgcmVkID0gdjsgZ3JlZW4gPSBwOyBibHVlID0gcTsgfQotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkocmVkICogMjU1LjApOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkoZ3JlZW4gKiAyNTUuMCk7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShibHVlICogMjU1LjApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRvbmUuXG4iKTsKLSAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEJsYXN0IGJhY2tncm91bmQgaW1hZ2UgdG8gZGlzcGxheSBidWZmZXIgYmVmb3JlIGJlZ2lubmluZyBQTkcgZGVjb2RlLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7Ci0gICAgICAgIHVsZyByZWQsIGdyZWVuLCBibHVlOwotICAgICAgICBpbnQgYnBwID0geGltYWdlLT5iaXRzX3Blcl9waXhlbDsKLQotICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7Ci0gICAgICAgICAgICBzcmMgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwotICAgICAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7CS8qIHNsaWdodGx5IG9wdGltaXplZCB2ZXJzaW9uICovCi0gICAgICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc/ICB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLwotICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdCwgUk1hc2ssIGV0Yy4pICovCi0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7Ci0gICAgICAgIHVzaCByZWQsIGdyZWVuLCBibHVlOwotCi0gICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHNyYyA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKLSAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpKCpzcmMpIDw8IDgpOyAgKytzcmM7Ci0gICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaCkoKnNyYykgPDwgOCk7ICArK3NyYzsKLSAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKSgqc3JjKSA8PCA4KTsgICsrc3JjOwotICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlZW4gPj4gR1NoaWZ0KSAmIEdNYXNrKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7Ci0gICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSAvKiBkZXB0aCA9PSA4ICovIHsKLQotICAgICAgICAvKiBHUlI6ICBhZGQgOC1iaXQgc3VwcG9ydCAqLwotCi0gICAgfQotCi0gICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgMCwgMCwgMCwgcnBuZzJfaW5mby53aWR0aCwKLSAgICAgIHJwbmcyX2luZm8uaGVpZ2h0KTsKLQotICAgIHJldHVybiAwOwotCi19IC8qIGVuZCBmdW5jdGlvbiBycG5nMl94X2xvYWRfYmdfaW1hZ2UoKSAqLwotCi0KLQotCi0KLXN0YXRpYyB2b2lkIHJwbmcyX3hfZGlzcGxheV9yb3codWxnIHJvdykKLXsKLSAgICB1Y2ggYmdfcmVkICAgPSBycG5nMl9pbmZvLmJnX3JlZDsKLSAgICB1Y2ggYmdfZ3JlZW4gPSBycG5nMl9pbmZvLmJnX2dyZWVuOwotICAgIHVjaCBiZ19ibHVlICA9IHJwbmcyX2luZm8uYmdfYmx1ZTsKLSAgICB1Y2ggKnNyYywgKnNyYzI9TlVMTDsKLSAgICBjaGFyICpkZXN0OwotICAgIHVjaCByLCBnLCBiLCBhOwotICAgIGludCB4aW1hZ2Vfcm93Ynl0ZXMgPSB4aW1hZ2UtPmJ5dGVzX3Blcl9saW5lOwotICAgIHVsZyBpLCBwaXhlbDsKLSAgICBzdGF0aWMgaW50IHJvd3M9MCwgcHJldnBhc3M9KC0xKTsKLSAgICBzdGF0aWMgdWxnIGZpcnN0cm93OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHJvd3MgYW5kIGZpcnN0cm93IHNpbXBseSB0cmFjayBob3cgbWFueSByb3dzIChhbmQgd2hpY2ggb25lcykgaGF2ZSBub3QKLSAgICB5ZXQgYmVlbiBkaXNwbGF5ZWQ7IGFsdGVybmF0aXZlbHksIHdlIGNvdWxkIGNhbGwgWFB1dEltYWdlKCkgZm9yIGV2ZXJ5Ci0gICAgcm93IGFuZCBub3QgYm90aGVyIHdpdGggdGhlIHJlY29yZHMta2VlcGluZy4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgcnBuZzJfeF9kaXNwbGF5X3JvdygpXG4iKSkKLQotICAgIGlmIChycG5nMl9pbmZvLnBhc3MgIT0gcHJldnBhc3MpIHsKLSAgICAgICAgaWYgKHBhdXNlX2FmdGVyX3Bhc3MgJiYgcnBuZzJfaW5mby5wYXNzID4gMCkgewotICAgICAgICAgICAgWEV2ZW50IGU7Ci0gICAgICAgICAgICBLZXlTeW0gazsKLQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICIlczogIGVuZCBvZiBwYXNzICVkIG9mIDc7IGNsaWNrIGluIGltYWdlIHdpbmRvdyB0byBjb250aW51ZVxuIiwKLSAgICAgICAgICAgICAgUFJPR05BTUUsIHByZXZwYXNzICsgMSk7Ci0gICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgIFhOZXh0RXZlbnQoZGlzcGxheSwgJmUpOwotICAgICAgICAgICAgd2hpbGUgKCFRVUlUKGUsaykpOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICBwYXNzICVkIG9mIDdcciIsIFBST0dOQU1FLCBycG5nMl9pbmZvLnBhc3MgKyAxKTsKLSAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgICAgIHByZXZwYXNzID0gcnBuZzJfaW5mby5wYXNzOwotICAgIH0KLQotICAgIGlmIChyb3dzID09IDApCi0gICAgICAgIGZpcnN0cm93ID0gcm93OyAgIC8qIGZpcnN0IHJvdyB0aGF0IGlzIG5vdCB5ZXQgZGlzcGxheWVkICovCi0KLSAgICArK3Jvd3M7ICAgLyogY291bnQgb2Ygcm93cyByZWNlaXZlZCBidXQgbm90IHlldCBkaXNwbGF5ZWQgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBBc2lkZSBmcm9tIHRoZSB1c2Ugb2YgdGhlIHJwbmcyX2luZm8gc3RydWN0LCB0aGUgbGFjayBvZiBhbiBvdXRlciBsb29wCi0gICAgKG92ZXIgcm93cykgYW5kIG1vdmluZyB0aGUgWFB1dEltYWdlKCkgY2FsbCBvdXRzaWRlIHRoZSAiaWYgKGRlcHRoKSIKLSAgICB0ZXN0cywgdGhpcyByb3V0aW5lIGlzIGlkZW50aWNhbCB0byBycG5nX3hfZGlzcGxheV9pbWFnZSgpIGluIHRoZSBub24tCi0gICAgcHJvZ3Jlc3NpdmUgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewotICAgICAgICB1bGcgcmVkLCBncmVlbiwgYmx1ZTsKLSAgICAgICAgaW50IGJwcCA9IHhpbWFnZS0+Yml0c19wZXJfcGl4ZWw7Ci0KLSAgICAgICAgc3JjID0gcnBuZzJfaW5mby5pbWFnZV9kYXRhICsgcm93KnJwbmcyX2luZm8ucm93Ynl0ZXM7Ci0gICAgICAgIGlmIChiZ19pbWFnZSkKLSAgICAgICAgICAgIHNyYzIgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwotICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKLSAgICAgICAgaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gMykgewotICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgcmVkICAgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgZ3JlZW4gPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgYmx1ZSAgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgR1NoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKLSAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc/ICB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLwotICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdCwgUk1hc2ssIGV0Yy4pICovCi0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgLyogaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gNCkgKi8gewotICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBnID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBpZiAoYmdfaW1hZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgYmdfcmVkICAgPSAqc3JjMisrOwotICAgICAgICAgICAgICAgICAgICBiZ19ncmVlbiA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgICAgIGJnX2JsdWUgID0gKnNyYzIrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZCAgID0gcjsKLSAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBnOwotICAgICAgICAgICAgICAgICAgICBibHVlICA9IGI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVkICAgPSBiZ19yZWQ7Ci0gICAgICAgICAgICAgICAgICAgIGdyZWVuID0gYmdfZ3JlZW47Ci0gICAgICAgICAgICAgICAgICAgIGJsdWUgID0gYmdfYmx1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChmcm9tIHBuZy5oKSBjb21wb3NpdGVzIHRoZSBmb3JlZ3JvdW5kCi0gICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUgcmVzdWx0IGludG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAqIGZpcnN0IGFyZ3VtZW50ICovCi0gICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShyZWQsICAgciwgYSwgYmdfcmVkKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGdyZWVuLCBnLCBhLCBiZ19ncmVlbik7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShibHVlLCAgYiwgYSwgYmdfYmx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7Ci0gICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgaWYgKGJwcCA9PSAzMikgewotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHPyAgdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgIChwcm9iYWJseSBuZWVkIHRvIHVzZSBSU2hpZnQsIFJNYXNrLCBldGMuKSAqLwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewotICAgICAgICB1c2ggcmVkLCBncmVlbiwgYmx1ZTsKLQotICAgICAgICBzcmMgPSBycG5nMl9pbmZvLnJvd19wb2ludGVyc1tyb3ddOwotICAgICAgICBpZiAoYmdfaW1hZ2UpCi0gICAgICAgICAgICBzcmMyID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKLSAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7Ci0gICAgICAgIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDMpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpKCpzcmMpIDw8IDgpOwotICAgICAgICAgICAgICAgICsrc3JjOwotICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpKCpzcmMpIDw8IDgpOwotICAgICAgICAgICAgICAgICsrc3JjOwotICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpKCpzcmMpIDw8IDgpOwotICAgICAgICAgICAgICAgICsrc3JjOwotICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlZW4gPj4gR1NoaWZ0KSAmIEdNYXNrKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7Ci0gICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSAvKiBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSA0KSAqLyB7Ci0gICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICByID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgYiA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBhID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGlmIChiZ19pbWFnZSkgewotICAgICAgICAgICAgICAgICAgICBiZ19yZWQgICA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgICAgIGJnX2dyZWVuID0gKnNyYzIrKzsKLSAgICAgICAgICAgICAgICAgICAgYmdfYmx1ZSAgPSAqc3JjMisrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaClyIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWcgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKWJnX3JlZCAgIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWJnX2dyZWVuIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWJnX2JsdWUgIDw8IDgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGZyb20gcG5nLmgpIGNvbXBvc2l0ZXMgdGhlIGZvcmVncm91bmQKLSAgICAgICAgICAgICAgICAgICAgICogYW5kIGJhY2tncm91bmQgdmFsdWVzIGFuZCBwdXRzIHRoZSByZXN1bHQgYmFjayBpbnRvCi0gICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCBhcmd1bWVudCAoPT0gZmcgYnl0ZSBoZXJlOiAgc2FmZSkgKi8KLSAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKHIsIHIsIGEsIGJnX3JlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShnLCBnLCBhLCBiZ19ncmVlbik7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShiLCBiLCBhLCBiZ19ibHVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaClyIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWcgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGl4ZWwgPSAoKHJlZCAgID4+IFJTaGlmdCkgJiBSTWFzaykgfAotICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoYmx1ZSAgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKLSAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfSBlbHNlIC8qIGRlcHRoID09IDggKi8gewotCi0gICAgICAgIC8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCi0KLSAgICB9Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBEaXNwbGF5IGFmdGVyIGV2ZXJ5IDE2IHJvd3Mgb3Igd2hlbiBvbiBvbmUgb2YgbGFzdCB0d28gcm93cy4gIChSZWdpb24KLSAgICBtYXkgaW5jbHVkZSBwcmV2aW91c2x5IGRpc3BsYXllZCBsaW5lcyBkdWUgdG8gaW50ZXJsYWNpbmctLWkuZS4sIG5vdAotICAgIGNvbnRpZ3VvdXMuICBBbHNvLCBzZWNvbmQtdG8tbGFzdCByb3cgaXMgZmluYWwgb25lIGluIGludGVybGFjZWQgaW1hZ2VzCi0gICAgd2l0aCBvZGQgbnVtYmVyIG9mIHJvd3MuKSAgRm9yIGRlbW9zLCBmbHVzaCAoYW5kIGRlbGF5KSBhZnRlciBldmVyeSAxNnRoCi0gICAgcm93IHNvICJzcGFyc2UiIHBhc3NlcyBkb24ndCBnbyB0d2ljZSBhcyBmYXN0LgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKGRlbW9fdGltaW5nICYmIChyb3cgLSBmaXJzdHJvdyA+PSAxNiB8fCByb3cgPj0gcnBuZzJfaW5mby5oZWlnaHQtMikpIHsKLSAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClmaXJzdHJvdywgMCwKLSAgICAgICAgICAoaW50KWZpcnN0cm93LCBycG5nMl9pbmZvLndpZHRoLCByb3cgLSBmaXJzdHJvdyArIDEpOwotICAgICAgICBYRmx1c2goZGlzcGxheSk7Ci0gICAgICAgIHJvd3MgPSAwOwotICAgICAgICB1c2xlZXAodXNsZWVwX2R1cmF0aW9uKTsKLSAgICB9IGVsc2UKLSAgICBpZiAoIWRlbW9fdGltaW5nICYmICgocm93cyAmIDB4ZikgPT0gMCB8fCByb3cgPj0gcnBuZzJfaW5mby5oZWlnaHQtMikpIHsKLSAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClmaXJzdHJvdywgMCwKLSAgICAgICAgICAoaW50KWZpcnN0cm93LCBycG5nMl9pbmZvLndpZHRoLCByb3cgLSBmaXJzdHJvdyArIDEpOwotICAgICAgICBYRmx1c2goZGlzcGxheSk7Ci0gICAgICAgIHJvd3MgPSAwOwotICAgIH0KLQotfQotCi0KLQotCi0KLXN0YXRpYyB2b2lkIHJwbmcyX3hfZmluaXNoX2Rpc3BsYXkodm9pZCkKLXsKLSAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIHJwbmcyX3hfZmluaXNoX2Rpc3BsYXkoKVxuIikpCi0KLSAgICAvKiBsYXN0IHJvdyBoYXMgYWxyZWFkeSBiZWVuIGRpc3BsYXllZCBieSBycG5nMl94X2Rpc3BsYXlfcm93KCksIHNvIHdlCi0gICAgICogaGF2ZSBub3RoaW5nIHRvIGRvIGhlcmUgZXhjZXB0IHNldCBhIGZsYWcgYW5kIGxldCB0aGUgdXNlciBrbm93IHRoYXQKLSAgICAgKiB0aGUgaW1hZ2UgaXMgZG9uZSAqLwotCi0gICAgcnBuZzJfaW5mby5zdGF0ZSA9IGtEb25lOwotICAgIHByaW50ZigKLSAgICAgICJEb25lLiAgUHJlc3MgUSwgRXNjIG9yIG1vdXNlIGJ1dHRvbiAxICh3aXRoaW4gaW1hZ2Ugd2luZG93KSB0byBxdWl0LlxuIik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci19Ci0KLQotCi0KLQotc3RhdGljIHZvaWQgcnBuZzJfeF9yZWRpc3BsYXlfaW1hZ2UodWxnIHN0YXJ0Y29sLCB1bGcgc3RhcnRyb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bGcgd2lkdGgsIHVsZyBoZWlnaHQpCi17Ci0gICAgdWNoIGJnX3JlZCAgID0gcnBuZzJfaW5mby5iZ19yZWQ7Ci0gICAgdWNoIGJnX2dyZWVuID0gcnBuZzJfaW5mby5iZ19ncmVlbjsKLSAgICB1Y2ggYmdfYmx1ZSAgPSBycG5nMl9pbmZvLmJnX2JsdWU7Ci0gICAgdWNoICpzcmMsICpzcmMyPU5VTEw7Ci0gICAgY2hhciAqZGVzdDsKLSAgICB1Y2ggciwgZywgYiwgYTsKLSAgICB1bGcgaSwgcm93LCBsYXN0cm93ID0gMDsKLSAgICB1bGcgcGl4ZWw7Ci0gICAgaW50IHhpbWFnZV9yb3dieXRlcyA9IHhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmU7Ci0KLQotICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgZGlzcGxheSBsb29wIChpbWFnZV9jaGFubmVscyA9PSAlZClcbiIsCi0gICAgICBycG5nMl9pbmZvLmNoYW5uZWxzKSkKLSAgICBUcmFjZSgoc3RkZXJyLCAiICAgKHdpZHRoID0gJWxkLCByb3dieXRlcyA9ICVkLCB4aW1hZ2Vfcm93Ynl0ZXMgPSAlZClcbiIsCi0gICAgICBycG5nMl9pbmZvLndpZHRoLCBycG5nMl9pbmZvLnJvd2J5dGVzLCB4aW1hZ2Vfcm93Ynl0ZXMpKQotICAgIFRyYWNlKChzdGRlcnIsICIgICAoYnBwID0gJWQpXG4iLCB4aW1hZ2UtPmJpdHNfcGVyX3BpeGVsKSkKLSAgICBUcmFjZSgoc3RkZXJyLCAiICAgKGJ5dGVfb3JkZXIgPSAlcylcbiIsIHhpbWFnZS0+Ynl0ZV9vcmRlciA9PSBNU0JGaXJzdD8KLSAgICAgICJNU0JGaXJzdCIgOiAoeGltYWdlLT5ieXRlX29yZGVyID09IExTQkZpcnN0PyAiTFNCRmlyc3QiIDogInVua25vd24iKSkpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgQXNpZGUgZnJvbSB0aGUgdXNlIG9mIHRoZSBycG5nMl9pbmZvIHN0cnVjdCBhbmQgb2Ygc3JjMiAoZm9yIGJhY2tncm91bmQKLSAgICBpbWFnZSksIHRoaXMgcm91dGluZSBpcyBpZGVudGljYWwgdG8gcnBuZ194X2Rpc3BsYXlfaW1hZ2UoKSBpbiB0aGUgbm9uLQotICAgIHByb2dyZXNzaXZlIHZlcnNpb24gb2YgdGhlIHByb2dyYW0tLWZvciB0aGUgc2ltcGxlIHJlYXNvbiB0aGF0IHJlZGlzcGxheQotICAgIG9mIHRoZSBpbWFnZSBhZ2FpbnN0IGEgbmV3IGJhY2tncm91bmQgaGFwcGVucyBhZnRlciB0aGUgaW1hZ2UgaXMgZnVsbHkKLSAgICBkZWNvZGVkIGFuZCB0aGVyZWZvcmUgaXMsIGJ5IGRlZmluaXRpb24sIG5vbi1wcm9ncmVzc2l2ZS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewotICAgICAgICB1bGcgcmVkLCBncmVlbiwgYmx1ZTsKLSAgICAgICAgaW50IGJwcCA9IHhpbWFnZS0+Yml0c19wZXJfcGl4ZWw7Ci0KLSAgICAgICAgZm9yIChsYXN0cm93ID0gcm93ID0gc3RhcnRyb3c7ICByb3cgPCBzdGFydHJvdytoZWlnaHQ7ICArK3JvdykgewotICAgICAgICAgICAgc3JjID0gcnBuZzJfaW5mby5pbWFnZV9kYXRhICsgcm93KnJwbmcyX2luZm8ucm93Ynl0ZXM7Ci0gICAgICAgICAgICBpZiAoYmdfaW1hZ2UpCi0gICAgICAgICAgICAgICAgc3JjMiA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKLSAgICAgICAgICAgIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBibHVlICA9ICpzcmMrKzsKLSNpZmRlZiBOT18yNEJJVF9NQVNLUwotICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgR1NoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0LCBSTWFzaywgZXRjLikgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoUlNoaWZ0IDwgMCk/IHJlZCAgIDw8ICgtUlNoaWZ0KSA6IHJlZCAgID4+IFJTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoR1NoaWZ0IDwgMCk/IGdyZWVuIDw8ICgtR1NoaWZ0KSA6IGdyZWVuID4+IEdTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoQlNoaWZ0IDwgMCk/IGJsdWUgIDw8ICgtQlNoaWZ0KSA6IGJsdWUgID4+IEJTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICYgUk1hc2spIHwgKGdyZWVuICYgR01hc2spIHwgKGJsdWUgJiBCTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0L1JNYXNrL2V0Yy4gaGVyZSwgdG9vKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSA0KSAqLyB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiZ19pbWFnZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYmdfcmVkICAgPSAqc3JjMisrOwotICAgICAgICAgICAgICAgICAgICAgICAgYmdfZ3JlZW4gPSAqc3JjMisrOwotICAgICAgICAgICAgICAgICAgICAgICAgYmdfYmx1ZSAgPSAqc3JjMisrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSByOwotICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBnOwotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSBiOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSBiZ19yZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9IGJnX2dyZWVuOwotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSBiZ19ibHVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBtYWNybyAoZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUgZm9yZWdyb3VuZAotICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGJhY2tncm91bmQgdmFsdWVzIGFuZCBwdXRzIHRoZSByZXN1bHQgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpcnN0IGFyZ3VtZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUocmVkLCAgIHIsIGEsIGJnX3JlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoZ3JlZW4sIGcsIGEsIGJnX2dyZWVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShibHVlLCAgYiwgYSwgYmdfYmx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBOT18yNEJJVF9NQVNLUwotICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgR1NoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0LCBSTWFzaywgZXRjLikgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoUlNoaWZ0IDwgMCk/IHJlZCAgIDw8ICgtUlNoaWZ0KSA6IHJlZCAgID4+IFJTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoR1NoaWZ0IDwgMCk/IGdyZWVuIDw8ICgtR1NoaWZ0KSA6IGdyZWVuID4+IEdTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoQlNoaWZ0IDwgMCk/IGJsdWUgIDw8ICgtQlNoaWZ0KSA6IGJsdWUgID4+IEJTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICYgUk1hc2spIHwgKGdyZWVuICYgR01hc2spIHwgKGJsdWUgJiBCTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0L1JNYXNrL2V0Yy4gaGVyZSwgdG9vKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBkaXNwbGF5IGFmdGVyIGV2ZXJ5IDE2IGxpbmVzICovCi0gICAgICAgICAgICBpZiAoKChyb3crMSkgJiAweGYpID09IDApIHsKLSAgICAgICAgICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWxhc3Ryb3csIDAsCi0gICAgICAgICAgICAgICAgICAoaW50KWxhc3Ryb3csIHJwbmcyX2luZm8ud2lkdGgsIDE2KTsKLSAgICAgICAgICAgICAgICBYRmx1c2goZGlzcGxheSk7Ci0gICAgICAgICAgICAgICAgbGFzdHJvdyA9IHJvdyArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMTYpIHsKLSAgICAgICAgdXNoIHJlZCwgZ3JlZW4sIGJsdWU7Ci0KLSAgICAgICAgZm9yIChsYXN0cm93ID0gcm93ID0gc3RhcnRyb3c7ICByb3cgPCBzdGFydHJvdytoZWlnaHQ7ICArK3JvdykgewotICAgICAgICAgICAgc3JjID0gcnBuZzJfaW5mby5yb3dfcG9pbnRlcnNbcm93XTsKLSAgICAgICAgICAgIGlmIChiZ19pbWFnZSkKLSAgICAgICAgICAgICAgICBzcmMyID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKLSAgICAgICAgICAgIGRlc3QgPSB4aW1hZ2UtPmRhdGEgKyByb3cqeGltYWdlX3Jvd2J5dGVzOwotICAgICAgICAgICAgaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gMykgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKSgqc3JjKSA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgKytzcmM7Ci0gICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpKCpzcmMpIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICArK3NyYzsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCkoKnNyYykgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICsrc3JjOwotICAgICAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDQpICovIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgZyA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgYiA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJnX2ltYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZ19yZWQgICA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZ19ncmVlbiA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZ19ibHVlICA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKXIgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWcgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWIgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKWJnX3JlZCAgIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaCliZ19ncmVlbiA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYmdfYmx1ZSAgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChmcm9tIHBuZy5oKSBjb21wb3NpdGVzIHRoZSBmb3JlZ3JvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgYmFja2dyb3VuZCB2YWx1ZXMgYW5kIHB1dHMgdGhlIHJlc3VsdCBiYWNrIGludG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCBhcmd1bWVudCAoPT0gZmcgYnl0ZSBoZXJlOiAgc2FmZSkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShyLCByLCBhLCBiZ19yZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGcsIGcsIGEsIGJnX2dyZWVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShiLCBiLCBhLCBiZ19ibHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpciA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpZyA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogZGlzcGxheSBhZnRlciBldmVyeSAxNiBsaW5lcyAqLwotICAgICAgICAgICAgaWYgKCgocm93KzEpICYgMHhmKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClsYXN0cm93LCAwLAotICAgICAgICAgICAgICAgICAgKGludClsYXN0cm93LCBycG5nMl9pbmZvLndpZHRoLCAxNik7Ci0gICAgICAgICAgICAgICAgWEZsdXNoKGRpc3BsYXkpOwotICAgICAgICAgICAgICAgIGxhc3Ryb3cgPSByb3cgKyAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7Ci0KLSAgICAgICAgLyogR1JSOiAgYWRkIDgtYml0IHN1cHBvcnQgKi8KLQotICAgIH0KLQotICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIGZpbmFsIFhQdXRJbWFnZSgpXG4iKSkKLSAgICBpZiAobGFzdHJvdyA8IHN0YXJ0cm93K2hlaWdodCkgewotICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWxhc3Ryb3csIDAsCi0gICAgICAgICAgKGludClsYXN0cm93LCBycG5nMl9pbmZvLndpZHRoLCBycG5nMl9pbmZvLmhlaWdodC1sYXN0cm93KTsKLSAgICAgICAgWEZsdXNoKGRpc3BsYXkpOwotICAgIH0KLQotfSAvKiBlbmQgZnVuY3Rpb24gcnBuZzJfeF9yZWRpc3BsYXlfaW1hZ2UoKSAqLwotCi0KLQotCi0KLSNpZmRlZiBGRUFUVVJFX0xPT1AKLQotc3RhdGljIHZvaWQgcnBuZzJfeF9yZWxvYWRfYmdfaW1hZ2Uodm9pZCkKLXsKLSAgICBjaGFyICpkZXN0OwotICAgIHVjaCByMSwgcjIsIGcxLCBnMiwgYjEsIGIyOwotICAgIHVjaCByMV9pbnYsIHIyX2ludiwgZzFfaW52LCBnMl9pbnYsIGIxX2ludiwgYjJfaW52OwotICAgIGludCBrLCBobWF4LCBtYXg7Ci0gICAgaW50IHhpZHgsIHlpZHgsIHlpZHhfbWF4OwotICAgIGludCBldmVuX29kZF92ZXJ0LCBldmVuX29kZF9ob3JpeiwgZXZlbl9vZGQ7Ci0gICAgaW50IGludmVydF9ncmFkaWVudDIgPSAoYmdbcGF0XS50eXBlICYgMHgwOCk7Ci0gICAgaW50IGludmVydF9jb2x1bW47Ci0gICAgdWxnIGksIHJvdzsKLQotCi0gICAgYmdzY2FsZSA9IChwYXQgPT0gMCk/IDggOiBiZ3NjYWxlX2RlZmF1bHQ7Ci0gICAgeWlkeF9tYXggPSBiZ3NjYWxlIC0gMTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBWZXJ0aWNhbCBncmFkaWVudHMgKHJhbXBzKSBpbiBOeE4gc3F1YXJlcywgYWx0ZXJuYXRpbmcgZGlyZWN0aW9uIGFuZAotICAgIGNvbG9ycyAoTiA9PSBiZ3NjYWxlKS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMCkgewotICAgICAgICB1Y2ggcjFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5yOwotICAgICAgICB1Y2ggZzFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5nOwotICAgICAgICB1Y2ggYjFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5iOwotICAgICAgICB1Y2ggcjJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5yOwotICAgICAgICB1Y2ggZzJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5nOwotICAgICAgICB1Y2ggYjJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5iOwotICAgICAgICBpbnQgcjFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5yIC0gcjFfbWluOwotICAgICAgICBpbnQgZzFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5nIC0gZzFfbWluOwotICAgICAgICBpbnQgYjFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iIC0gYjFfbWluOwotICAgICAgICBpbnQgcjJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5yIC0gcjJfbWluOwotICAgICAgICBpbnQgZzJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5nIC0gZzJfbWluOwotICAgICAgICBpbnQgYjJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iIC0gYjJfbWluOwotCi0gICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHlpZHggPSAoaW50KShyb3cgJSBiZ3NjYWxlKTsKLSAgICAgICAgICAgIGV2ZW5fb2RkX3ZlcnQgPSAoaW50KSgocm93IC8gYmdzY2FsZSkgJiAxKTsKLQotICAgICAgICAgICAgcjEgPSByMV9taW4gKyAocjFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBnMSA9IGcxX21pbiArIChnMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGIxID0gYjFfbWluICsgKGIxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgcjFfaW52ID0gcjFfbWluICsgKHIxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBnMV9pbnYgPSBnMV9taW4gKyAoZzFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGIxX2ludiA9IGIxX21pbiArIChiMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotCi0gICAgICAgICAgICByMiA9IHIyX21pbiArIChyMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGcyID0gZzJfbWluICsgKGcyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgYjIgPSBiMl9taW4gKyAoYjJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICByMl9pbnYgPSByMl9taW4gKyAocjJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGcyX2ludiA9IGcyX21pbiArIChnMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgYjJfaW52ID0gYjJfbWluICsgKGIyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0KLSAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKLSAgICAgICAgICAgICAgICBldmVuX29kZF9ob3JpeiA9IChpbnQpKChpIC8gYmdzY2FsZSkgJiAxKTsKLSAgICAgICAgICAgICAgICBldmVuX29kZCA9IGV2ZW5fb2RkX3ZlcnQgXiBldmVuX29kZF9ob3JpejsKLSAgICAgICAgICAgICAgICBpbnZlcnRfY29sdW1uID0KLSAgICAgICAgICAgICAgICAgIChldmVuX29kZF9ob3JpeiAmJiAoYmdbcGF0XS50eXBlICYgMHgxMCkpOwotICAgICAgICAgICAgICAgIGlmIChldmVuX29kZCA9PSAwKSB7ICAgICAgICAvKiBncmFkaWVudCAjMSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoaW52ZXJ0X2NvbHVtbikgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIxX2ludjsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMV9pbnY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjFfaW52OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIxOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcxOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIGdyYWRpZW50ICMyICovCi0gICAgICAgICAgICAgICAgICAgIGlmICgoaW52ZXJ0X2NvbHVtbiAmJiBpbnZlcnRfZ3JhZGllbnQyKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKCFpbnZlcnRfY29sdW1uICYmICFpbnZlcnRfZ3JhZGllbnQyKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIyOyAgICAgICAvKiBub3QgaW52ZXJ0ZWQgb3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMjsgICAgICAgLyogIGRvdWJseSBpbnZlcnRlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIyOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIyX2ludjsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMl9pbnY7ICAgLyogc2luZ2x5IGludmVydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjJfaW52OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgU29mdCBncmFkaWVudC1kaWFtb25kcyB3aXRoIHNjYWxlID0gYmdzY2FsZS4gIENvZGUgY29udHJpYnV0ZWQgYnkgQWRhbQotICAgIE0uIENvc3RlbGxvLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgfSBlbHNlIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMSkgewotCi0gICAgICAgIGhtYXggPSAoYmdzY2FsZS0xKS8yOyAgIC8qIGhhbGYgdGhlIG1heCB3ZWlnaHQgb2YgYSBjb2xvciAqLwotICAgICAgICBtYXggPSAyKmhtYXg7ICAgICAgICAgICAvKiB0aGUgbWF4IHdlaWdodCBvZiBhIGNvbG9yICovCi0KLSAgICAgICAgcjEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0ucjsKLSAgICAgICAgZzEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uZzsKLSAgICAgICAgYjEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uYjsKLSAgICAgICAgcjIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0ucjsKLSAgICAgICAgZzIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uZzsKLSAgICAgICAgYjIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uYjsKLQotICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7Ci0gICAgICAgICAgICB5aWR4ID0gKGludCkocm93ICUgYmdzY2FsZSk7Ci0gICAgICAgICAgICBpZiAoeWlkeCA+IGhtYXgpCi0gICAgICAgICAgICAgICAgeWlkeCA9IGJnc2NhbGUtMSAtIHlpZHg7Ci0gICAgICAgICAgICBkZXN0ID0gKGNoYXIgKiliZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwotICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7Ci0gICAgICAgICAgICAgICAgeGlkeCA9IChpbnQpKGkgJSBiZ3NjYWxlKTsKLSAgICAgICAgICAgICAgICBpZiAoeGlkeCA+IGhtYXgpCi0gICAgICAgICAgICAgICAgICAgIHhpZHggPSBiZ3NjYWxlLTEgLSB4aWR4OwotICAgICAgICAgICAgICAgIGsgPSB4aWR4ICsgeWlkeDsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGsqcjEgKyAobWF4LWspKnIyKSAvIG1heDsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGsqZzEgKyAobWF4LWspKmcyKSAvIG1heDsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGsqYjEgKyAobWF4LWspKmIyKSAvIG1heDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFJhZGlhbCAic3RhcmJ1cnN0IiB3aXRoIGF6aW11dGhhbCBzaW51c29pZHM7IFtldmVudHVhbGx5IG51bWJlciBvZiBzaW51LQotICAgIHNvaWRzIHdpbGwgZXF1YWwgYmdzY2FsZT9dLiAgVGhpcyBvbmUgaXMgc2xvdyBidXQgdmVyeSBjb29sLiAgQ29kZSBjb24tCi0gICAgdHJpYnV0ZWQgYnkgUGlldGVyIFMuIHZhbiBkZXIgTWV1bGVuIChvcmlnaW5hbGx5IGluIFNtYWxsdGFsaykuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICB9IGVsc2UgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAyKSB7Ci0gICAgICAgIHVjaCBjaDsKLSAgICAgICAgaW50IGlpLCB4LCB5LCBodywgaGgsIGdyYXlzcG90OwotICAgICAgICBkb3VibGUgZnJlcSwgcm90YXRlLCBzYXR1cmF0ZSwgZ3JheSwgaW50ZW5zaXR5OwotICAgICAgICBkb3VibGUgYW5nbGU9MC4wLCBhb2Zmc2V0PTAuMCwgbWF4RGlzdCwgZGlzdDsKLSAgICAgICAgZG91YmxlIHJlZD0wLjAsIGdyZWVuPTAuMCwgYmx1ZT0wLjAsIGh1ZSwgcywgdiwgZiwgcCwgcSwgdDsKLQotICAgICAgICBoaCA9IChpbnQpKHJwbmcyX2luZm8uaGVpZ2h0IC8gMik7Ci0gICAgICAgIGh3ID0gKGludCkocnBuZzJfaW5mby53aWR0aCAvIDIpOwotCi0gICAgICAgIC8qIHZhcmlhYmxlcyBmb3IgcmFkaWFsIHdhdmVzOgotICAgICAgICAgKiAgIGFvZmZzZXQ6ICBudW1iZXIgb2YgZGVncmVlcyB0byByb3RhdGUgaHVlIFtDVVJSRU5UTFkgTk9UIFVTRURdCi0gICAgICAgICAqICAgZnJlcTogIG51bWJlciBvZiBjb2xvciBiZWFtcyBvcmlnaW5hdGluZyBmcm9tIHRoZSBjZW50ZXIKLSAgICAgICAgICogICBncmF5c3BvdDogIHNpemUgb2YgdGhlIGdyYXlpbmcgY2VudGVyIGFyZWEgKGFudGktYWxpYXMpCi0gICAgICAgICAqICAgcm90YXRlOiAgcm90YXRpb24gb2YgdGhlIGJlYW1zIGFzIGEgZnVuY3Rpb24gb2YgcmFkaXVzCi0gICAgICAgICAqICAgc2F0dXJhdGU6ICBzYXR1cmF0aW9uIG9mIGJlYW1zJyBzaGFwZSBhemltdXRoYWxseQotICAgICAgICAgKi8KLSAgICAgICAgYW5nbGUgPSBDTElQKGFuZ2xlLCAwLjAsIDM2MC4wKTsKLSAgICAgICAgZ3JheXNwb3QgPSBDTElQKGJnW3BhdF0uYmdfZ3JheSwgMSwgKGhoICsgaHcpKTsKLSAgICAgICAgZnJlcSA9IE1BWCgoZG91YmxlKWJnW3BhdF0uYmdfZnJlcSwgMC4wKTsKLSAgICAgICAgc2F0dXJhdGUgPSAoZG91YmxlKWJnW3BhdF0uYmdfYnNhdCAqIDAuMTsKLSAgICAgICAgcm90YXRlID0gKGRvdWJsZSliZ1twYXRdLmJnX2Jyb3QgKiAwLjE7Ci0gICAgICAgIGdyYXkgPSAwLjA7Ci0gICAgICAgIGludGVuc2l0eSA9IDAuMDsKLSAgICAgICAgbWF4RGlzdCA9IChkb3VibGUpKChodypodykgKyAoaGgqaGgpKTsKLQotICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7Ci0gICAgICAgICAgICB5ID0gKGludCkocm93IC0gaGgpOwotICAgICAgICAgICAgZGVzdCA9IChjaGFyICopYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewotICAgICAgICAgICAgICAgIHggPSAoaW50KShpIC0gaHcpOwotICAgICAgICAgICAgICAgIGFuZ2xlID0gKHggPT0gMCk/IFBJXzIgOiBhdGFuKChkb3VibGUpeSAvIChkb3VibGUpeCk7Ci0gICAgICAgICAgICAgICAgZ3JheSA9IChkb3VibGUpTUFYKEFCUyh5KSwgQUJTKHgpKSAvIGdyYXlzcG90OwotICAgICAgICAgICAgICAgIGdyYXkgPSBNSU4oMS4wLCBncmF5KTsKLSAgICAgICAgICAgICAgICBkaXN0ID0gKGRvdWJsZSkoKHgqeCkgKyAoeSp5KSkgLyBtYXhEaXN0OwotICAgICAgICAgICAgICAgIGludGVuc2l0eSA9IGNvcygoYW5nbGUrKHJvdGF0ZSpkaXN0KlBJKSkgKiBmcmVxKSAqCi0gICAgICAgICAgICAgICAgICBncmF5ICogc2F0dXJhdGU7Ci0gICAgICAgICAgICAgICAgaW50ZW5zaXR5ID0gKE1BWChNSU4oaW50ZW5zaXR5LDEuMCksLTEuMCkgKyAxLjApICogMC41OwotICAgICAgICAgICAgICAgIGh1ZSA9IChhbmdsZSArIFBJKSAqIElOVl9QSV8zNjAgKyBhb2Zmc2V0OwotICAgICAgICAgICAgICAgIHMgPSBncmF5ICogKChkb3VibGUpKEFCUyh4KStBQlMoeSkpIC8gKGRvdWJsZSkoaHcgKyBoaCkpOwotICAgICAgICAgICAgICAgIHMgPSBNSU4oTUFYKHMsMC4wKSwgMS4wKTsKLSAgICAgICAgICAgICAgICB2ID0gTUlOKE1BWChpbnRlbnNpdHksMC4wKSwgMS4wKTsKLQotICAgICAgICAgICAgICAgIGlmIChzID09IDAuMCkgewotICAgICAgICAgICAgICAgICAgICBjaCA9ICh1Y2gpKHYgKiAyNTUuMCk7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChodWUgPCAwLjApIHx8IChodWUgPj0gMzYwLjApKQotICAgICAgICAgICAgICAgICAgICAgICAgaHVlIC09ICgoKGludCkoaHVlIC8gMzYwLjApKSAqIDM2MC4wKTsKLSAgICAgICAgICAgICAgICAgICAgaHVlIC89IDYwLjA7Ci0gICAgICAgICAgICAgICAgICAgIGlpID0gKGludClodWU7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSBodWUgLSAoZG91YmxlKWlpOwotICAgICAgICAgICAgICAgICAgICBwID0gKDEuMCAtIHMpICogdjsKLSAgICAgICAgICAgICAgICAgICAgcSA9ICgxLjAgLSAocyAqIGYpKSAqIHY7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSAoMS4wIC0gKHMgKiAoMS4wIC0gZikpKSAqIHY7Ci0gICAgICAgICAgICAgICAgICAgIGlmICAgICAgKGlpID09IDApIHsgcmVkID0gdjsgZ3JlZW4gPSB0OyBibHVlID0gcDsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAxKSB7IHJlZCA9IHE7IGdyZWVuID0gdjsgYmx1ZSA9IHA7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMikgeyByZWQgPSBwOyBncmVlbiA9IHY7IGJsdWUgPSB0OyB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDMpIHsgcmVkID0gcDsgZ3JlZW4gPSBxOyBibHVlID0gdjsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSA0KSB7IHJlZCA9IHQ7IGdyZWVuID0gcDsgYmx1ZSA9IHY7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gNSkgeyByZWQgPSB2OyBncmVlbiA9IHA7IGJsdWUgPSBxOyB9Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShyZWQgKiAyNTUuMCk7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShncmVlbiAqIDI1NS4wKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKGJsdWUgKiAyNTUuMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19IC8qIGVuZCBmdW5jdGlvbiBycG5nMl94X3JlbG9hZF9iZ19pbWFnZSgpICovCi0KLQotCi0KLQotc3RhdGljIGludCBpc19udW1iZXIoY2hhciAqcCkKLXsKLSAgICB3aGlsZSAoKnApIHsKLSAgICAgICAgaWYgKCFpc2RpZ2l0KCpwKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgKytwOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotI2VuZGlmIC8qIEZFQVRVUkVfTE9PUCAqLwotCi0KLQotCi0KLXN0YXRpYyB2b2lkIHJwbmcyX3hfY2xlYW51cCh2b2lkKQotewotICAgIGlmIChiZ19pbWFnZSAmJiBiZ19kYXRhKSB7Ci0gICAgICAgIGZyZWUoYmdfZGF0YSk7Ci0gICAgICAgIGJnX2RhdGEgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChycG5nMl9pbmZvLmltYWdlX2RhdGEpIHsKLSAgICAgICAgZnJlZShycG5nMl9pbmZvLmltYWdlX2RhdGEpOwotICAgICAgICBycG5nMl9pbmZvLmltYWdlX2RhdGEgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChycG5nMl9pbmZvLnJvd19wb2ludGVycykgewotICAgICAgICBmcmVlKHJwbmcyX2luZm8ucm93X3BvaW50ZXJzKTsKLSAgICAgICAgcnBuZzJfaW5mby5yb3dfcG9pbnRlcnMgPSBOVUxMOwotICAgIH0KLQotICAgIGlmICh4aW1hZ2UpIHsKLSAgICAgICAgaWYgKHhpbWFnZS0+ZGF0YSkgewotICAgICAgICAgICAgZnJlZSh4aW1hZ2UtPmRhdGEpOyAgICAgICAgICAgLyogd2UgYWxsb2NhdGVkIGl0LCBzbyB3ZSBmcmVlIGl0ICovCi0gICAgICAgICAgICB4aW1hZ2UtPmRhdGEgPSAoY2hhciAqKU5VTEw7ICAvKiAgaW5zdGVhZCBvZiBYRGVzdHJveUltYWdlKCkgKi8KLSAgICAgICAgfQotICAgICAgICBYRGVzdHJveUltYWdlKHhpbWFnZSk7Ci0gICAgICAgIHhpbWFnZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGhhdmVfZ2MpCi0gICAgICAgIFhGcmVlR0MoZGlzcGxheSwgZ2MpOwotCi0gICAgaWYgKGhhdmVfd2luZG93KQotICAgICAgICBYRGVzdHJveVdpbmRvdyhkaXNwbGF5LCB3aW5kb3cpOwotCi0gICAgaWYgKGhhdmVfY29sb3JtYXApCi0gICAgICAgIFhGcmVlQ29sb3JtYXAoZGlzcGxheSwgY29sb3JtYXApOwotCi0gICAgaWYgKGhhdmVfbm9uZGVmYXVsdF92aXN1YWwpCi0gICAgICAgIFhGcmVlKHZpc3VhbF9saXN0KTsKLX0KLQotCi0KLQotCi1zdGF0aWMgaW50IHJwbmcyX3hfbXNiKHVsZyB1MzJ2YWwpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAzMTsgIGkgPj0gMDsgIC0taSkgewotICAgICAgICBpZiAodTMydmFsICYgMHg4MDAwMDAwMEwpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgdTMydmFsIDw8PSAxOwotICAgIH0KLSAgICByZXR1cm4gaTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay90b3VjYW4ucG5nIGIvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL3RvdWNhbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOTYwZDQuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL3RvdWNhbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svd3BuZy5jIGIvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL3dwbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA2ZTM1Mi4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svd3BuZy5jCisrKyAvZGV2L251bGwKQEAgLTEsODUzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHdwbmcgLSBzaW1wbGUgUE5HLXdyaXRpbmcgcHJvZ3JhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwbmcuYwotCi0gICBUaGlzIHByb2dyYW0gY29udmVydHMgY2VydGFpbiBOZXRQQk0gYmluYXJ5IGZpbGVzIChncmF5c2NhbGUgYW5kIFJHQiwKLSAgIG1heHZhbCA9IDI1NSkgdG8gUE5HLiAgTm9uLWludGVybGFjZWQgUE5HcyBhcmUgd3JpdHRlbiBwcm9ncmVzc2l2ZWx5OwotICAgaW50ZXJsYWNlZCBQTkdzIGFyZSByZWFkIGFuZCB3cml0dGVuIGluIG9uZSBtZW1vcnktaW50ZW5zaXZlIGJsYXN0LgotCi0gICBUaGFua3MgdG8gSmVhbi1sb3VwIEdhaWxseSBmb3IgcHJvdmlkaW5nIHRoZSBuZWNlc3NhcnkgdHJpY2sgdG8gcmVhZAotICAgaW50ZXJhY3RpdmUgdGV4dCBmcm9tIHRoZSBrZXlib2FyZCB3aGlsZSBzdGRpbiBpcyByZWRpcmVjdGVkLiAgVGhhbmtzCi0gICB0byBDb3NtaW4gVHJ1dGEgZm9yIEN5Z3dpbiBmaXhlcy4KLQotICAgTk9URTogIGluY2x1ZGVzIHByb3Zpc2lvbmFsIHN1cHBvcnQgZm9yIFBOTSB0eXBlICI4IiAocG9ydGFibGUgYWxwaGFtYXApCi0gICAgICAgICAgaW1hZ2VzLCBwcmVzdW1lZCB0byBiZSBhIDMyLWJpdCBpbnRlcmxlYXZlZCBSR0JBIGZvcm1hdDsgbm8gcHJvLQotICAgICAgICAgIHZpc2lvbiBmb3IgcG9zc2libGUgaW50ZXJsZWF2ZWQgZ3JheXNjYWxlK2FscGhhICgxNi1iaXQpIGZvcm1hdC4KLSAgICAgICAgICBUSElTIElTIFVOTElLRUxZIFRPIEJFQ09NRSBBTiBPRkZJQ0lBTCBORVRQQk0gQUxQSEEgRk9STUFUIQotCi0gICB0byBkbzoKLSAgICAtIGRlbGV0ZSBvdXRwdXQgZmlsZSBpZiBxdWl0IGJlZm9yZSBjYWxsaW5nIGFueSB3cml0ZXBuZyByb3V0aW5lcwotICAgIC0gcHJvY2VzcyBiYWNrc3BhY2Ugd2l0aCAtdGV4dCBvcHRpb24gdW5kZXIgRE9TL1dpbj8gKGN1cnJlbnRseSBnZXQgXkgpCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIENoYW5nZWxvZzoKLSAgICAtIDEuMDE6ICBpbml0aWFsIHB1YmxpYyByZWxlYXNlCi0gICAgLSAxLjAyOiAgbW9kaWZpZWQgdG8gYWxsb3cgYWJicmV2aWF0ZWQgb3B0aW9ucwotICAgIC0gMS4wMzogIHJlbW92ZWQgZXh0cmFuZW91cyBjaGFyYWN0ZXIgZnJvbSB1c2FnZSBzY3JlZW47IGZpeGVkIGJ1ZyBpbgotICAgICAgICAgICAgICBjb21tYW5kLWxpbmUgcGFyc2luZwotICAgIC0gMS4wNDogIGZpeGVkIERPUy9PUzIvV2luMzIgZGV0ZWN0aW9uLCBpbmNsdWRpbmcgcGFydGlhbCBDeWd3aW4gZml4Ci0gICAgICAgICAgICAgIChzZWUgaHR0cDovL2hvbWUuYXR0Lm5ldC9+cGVybHNwaW5yL2RpZmZzL0dyZWdCb29rX2N5Z3dpbi5kaWZmKQotICAgIC0gMi4wMDogIGR1YWwtbGljZW5zZWQgKGFkZGVkIEdOVSBHUEwpCi0KLSAgICAgICAgW1JFUE9SVEVEIEJVRyAod2luMzIgb25seSk6ICAiY29udHJpYi9ncmVnYm9vay93cG5nLmMgLSBjbWQgbGluZQotICAgICAgICAgZG9zZSBub3Qgd29yayEgIEluIG9yZGVyIHRvIGRvIHNvbWV0aGluZyB1c2VmdWwgSSBuZWVkZWQgdG8gcmVkaXJlY3QKLSAgICAgICAgIGJvdGggaW5wdXQgYW5kIG91dHB1dCwgd2l0aCBjeWd3aW4gYW5kIHdpdGggYmNjMzIgYXMgd2VsbC4gIFVuZGVyCi0gICAgICAgICBMaW51eCwgdGhlIHNhbWUgd3BuZyBhcHBlYXJzIHRvIHdvcmsgZmluZS4gIEkgZG9uJ3Qga25vdyB3aGF0IGlzCi0gICAgICAgICB0aGUgcHJvYmxlbS4iXQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBHcmVnIFJvZWxvZnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCi0gICAgICBleHByZXNzIG9yIGltcGxpZWQuICBJbiBubyBldmVudCBzaGFsbCB0aGUgYXV0aG9yIG9yIGNvbnRyaWJ1dG9ycwotICAgICAgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgaW4gYW55IHdheSBmcm9tIHRoZSB1c2Ugb2YKLSAgICAgIHRoaXMgc29mdHdhcmUuCi0KLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIERVQUwtTElDRU5TRUQuICBZb3UgbWF5IG1vZGlmeSBhbmQvb3IKLSAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQotICAgICAgZm9sbG93aW5nIHR3byBsaWNlbnNlcyAoYXQgeW91ciBvcHRpb24pOgotCi0KLSAgICAgIExJQ0VOU0UgMSAoIkJTRC1saWtlIHdpdGggYWR2ZXJ0aXNpbmcgY2xhdXNlIik6Ci0KLSAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICAgICAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZQotICAgICAgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMuCi0gICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YS0KLSAgICAgICAgIHRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAgICAgICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotCi0gICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcwotICAgICAgICAgICAgYW5kIGNvbnRyaWJ1dG9ycyBmb3IgdGhlIGJvb2ssICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlLCIKLSAgICAgICAgICAgIHB1Ymxpc2hlZCBieSBPJ1JlaWxseSBhbmQgQXNzb2NpYXRlcy4KLQotCi0gICAgICBMSUNFTlNFIDIgKEdOVSBHUEwgdjIgb3IgbGF0ZXIpOgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgICAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIFBST0dOQU1FICAid3BuZyIKLSNkZWZpbmUgVkVSU0lPTiAgICIyLjAwIG9mIDIgSnVuZSAyMDA3IgotI2RlZmluZSBBUFBOQU1FICAgIlNpbXBsZSBQR00vUFBNL1BBTSB0byBQTkcgQ29udmVydGVyIgotCi0jaWYgZGVmaW5lZChfX01TRE9TX18pIHx8IGRlZmluZWQoX19PUzJfXykKLSMgIGRlZmluZSBET1NfT1MyX1czMgotI2VsaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKQotIyAgaWZuZGVmIF9fR05VQ19fICAgLyogdHJlYXQgV2luMzIgbmF0aXZlIHBvcnRzIG9mIGdjYyBhcyBVbml4IGVudmlyb25tZW50cyAqLwotIyAgICBkZWZpbmUgRE9TX09TMl9XMzIKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c2V0am1wLmg+ICAgICAvKiBmb3Igam1wYnVmIGRlY2xhcmF0aW9uIGluIHdyaXRlcG5nLmggKi8KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpZmRlZiBET1NfT1MyX1czMgotIyAgaW5jbHVkZSA8aW8uaD4gICAgICAgLyogZm9yIGlzYXR0eSgpLCBzZXRtb2RlKCkgcHJvdG90eXBlcyAqLwotIyAgaW5jbHVkZSA8ZmNudGwuaD4gICAgLyogT19CSU5BUlkgZm9yIGZkb3BlbigpIHdpdGhvdXQgdGV4dCB0cmFuc2xhdGlvbiAqLwotIyAgaWZkZWYgX19FTVhfXwotIyAgICBpZm5kZWYgZ2V0Y2gKLSMgICAgICBkZWZpbmUgZ2V0Y2goKSBfcmVhZF9rYmQoMCwgMSwgMCkgICAgLyogbmVlZCBnZXRjaGUoKSAqLwotIyAgICBlbmRpZgotIyAgZWxzZSAvKiAhX19FTVhfXyAqLwotIyAgICBpZmRlZiBfX0dPMzJfXwotIyAgICAgIGluY2x1ZGUgPHBjLmg+Ci0jICAgICAgZGVmaW5lIGdldGNoKCkgZ2V0a2V5KCkgIC8qIEdSUjogIG5lZWQgZ2V0Y2hlKCkgKi8KLSMgICAgZWxzZQotIyAgICAgIGluY2x1ZGUgPGNvbmlvLmg+ICAgICAgICAvKiBmb3IgZ2V0Y2hlKCkgY29uc29sZSBpbnB1dCAqLwotIyAgICBlbmRpZgotIyAgZW5kaWYgLyogP19fRU1YX18gKi8KLSMgIGRlZmluZSBGR0VUUyhidWYsbGVuLHN0cmVhbSkgIGRvc19rYmRfZ2V0cyhidWYsbGVuKQotI2Vsc2UKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPiAgICAgICAgICAgLyogZm9yIGlzYXR0eSgpIHByb3RvdHlwZSAqLwotIyAgZGVmaW5lIEZHRVRTIGZnZXRzCi0jZW5kaWYKLQotLyogI2RlZmluZSBERUJVRyAgOiAgdGhpcyBlbmFibGVzIHRoZSBUcmFjZSgpIG1hY3JvcyAqLwotCi0vKiAjZGVmaW5lIEZPUkJJRF9MQVRJTjFfQ1RSTCAgOiAgdGhpcyByZXF1aXJlcyB0aGUgdXNlciB0byByZS1lbnRlciBhbnkKLSAgIHRleHQgdGhhdCBpbmNsdWRlcyBjb250cm9sIGNoYXJhY3RlcnMgZGlzY291cmFnZWQgYnkgdGhlIFBORyBzcGVjOyB0ZXh0Ci0gICB0aGF0IGluY2x1ZGVzIGFuIGVzY2FwZSBjaGFyYWN0ZXIgKDI3KSBtdXN0IGJlIHJlLWVudGVyZWQgcmVnYXJkbGVzcyAqLwotCi0jaW5jbHVkZSAid3JpdGVwbmcuaCIgICAvKiB0eXBlZGVmcywgY29tbW9uIG1hY3Jvcywgd3JpdGVwbmcgcHJvdG90eXBlcyAqLwotCi0KLQotLyogbG9jYWwgcHJvdG90eXBlcyAqLwotCi1zdGF0aWMgaW50ICB3cG5nX2lzdmFsaWRfbGF0aW4xKHVjaCAqcCwgaW50IGxlbik7Ci1zdGF0aWMgdm9pZCB3cG5nX2NsZWFudXAodm9pZCk7Ci0KLSNpZmRlZiBET1NfT1MyX1czMgotICAgc3RhdGljIGNoYXIgKmRvc19rYmRfZ2V0cyhjaGFyICpidWYsIGludCBsZW4pOwotI2VuZGlmCi0KLQotCi1zdGF0aWMgbWFpbnByb2dfaW5mbyB3cG5nX2luZm87ICAgLyogbG9uZSBnbG9iYWwgKi8KLQotCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSNpZm5kZWYgRE9TX09TMl9XMzIKLSAgICBGSUxFICprZXliZDsKLSNlbmRpZgotI2lmZGVmIHNnaQotICAgIEZJTEUgKnRtcGZpbGU7ICAgICAgLyogb3Igd2UgY291bGQganVzdCB1c2Uga2V5YmQsIHNpbmNlIG5vIG92ZXJsYXAgKi8KLSAgICBjaGFyIHRtcGxpbmVbODBdOwotI2VuZGlmCi0gICAgY2hhciAqaW5uYW1lID0gTlVMTCwgb3V0bmFtZVsyNTZdOwotICAgIGNoYXIgKnAsIHBubWNoYXIsIHBubWxpbmVbMjU2XTsKLSAgICBjaGFyICpiZ3N0ciwgKnRleHRidWYgPSBOVUxMOwotICAgIHVsZyByb3dieXRlczsKLSAgICBpbnQgcmMsIGxlbiA9IDA7Ci0gICAgaW50IGVycm9yID0gMDsKLSAgICBpbnQgdGV4dCA9IEZBTFNFOwotICAgIGludCBtYXh2YWw7Ci0gICAgZG91YmxlIExVVF9leHBvbmVudDsgICAgICAgICAgICAgICAgLyoganVzdCB0aGUgbG9va3VwIHRhYmxlICovCi0gICAgZG91YmxlIENSVF9leHBvbmVudCA9IDIuMjsgICAgICAgICAgLyoganVzdCB0aGUgbW9uaXRvciAqLwotICAgIGRvdWJsZSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7ICAgIC8qIHdob2xlIGRpc3BsYXkgc3lzdGVtICovCi0gICAgZG91YmxlIGRlZmF1bHRfZ2FtbWEgPSAwLjA7Ci0KLQotICAgIHdwbmdfaW5mby5pbmZpbGUgPSBOVUxMOwotICAgIHdwbmdfaW5mby5vdXRmaWxlID0gTlVMTDsKLSAgICB3cG5nX2luZm8uaW1hZ2VfZGF0YSA9IE5VTEw7Ci0gICAgd3BuZ19pbmZvLnJvd19wb2ludGVycyA9IE5VTEw7Ci0gICAgd3BuZ19pbmZvLmZpbHRlciA9IEZBTFNFOwotICAgIHdwbmdfaW5mby5pbnRlcmxhY2VkID0gRkFMU0U7Ci0gICAgd3BuZ19pbmZvLmhhdmVfYmcgPSBGQUxTRTsKLSAgICB3cG5nX2luZm8uaGF2ZV90aW1lID0gRkFMU0U7Ci0gICAgd3BuZ19pbmZvLmhhdmVfdGV4dCA9IDA7Ci0gICAgd3BuZ19pbmZvLmdhbW1hID0gMC4wOwotCi0KLSAgICAvKiBGaXJzdCBnZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIG91ciBkaXNwbGF5LXN5c3RlbSBleHBvbmVudCwgaS5lLiwKLSAgICAgKiB0aGUgcHJvZHVjdCBvZiB0aGUgQ1JUIGV4cG9uZW50IGFuZCB0aGUgZXhwb25lbnQgY29ycmVzcG9uZGluZyB0bwotICAgICAqIHRoZSBmcmFtZS1idWZmZXIncyBsb29rdXAgdGFibGUgKExVVCksIGlmIGFueS4gIElmIHRoZSBQTk0gaW1hZ2UKLSAgICAgKiBsb29rcyBjb3JyZWN0IG9uIHRoZSB1c2VyJ3MgZGlzcGxheSBzeXN0ZW0sIGl0cyBmaWxlIGdhbW1hIGlzIHRoZQotICAgICAqIGludmVyc2Ugb2YgdGhpcyB2YWx1ZS4gIChOb3RlIHRoYXQgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0Ci0gICAgICogb2YgTFVUIHZhbHVlcy0tZS5nLiwgT3BlblN0ZXAgaGFzIGEgbG90IG9mIHdlaXJkIG9uZXMtLWJ1dCBpdCBzaG91bGQKLSAgICAgKiBjb3ZlciA5OSUgb2YgdGhlIGN1cnJlbnQgcG9zc2liaWxpdGllcy4gIFRoaXMgc2VjdGlvbiBtdXN0IGVuc3VyZQotICAgICAqIHRoYXQgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50IGlzIHBvc2l0aXZlLikgKi8KLQotI2lmIGRlZmluZWQoTmVYVCkKLSAgICAvKiB0aGlyZC1wYXJ0eSB1dGlsaXRpZXMgY2FuIG1vZGlmeSB0aGUgZGVmYXVsdCBMVVQgZXhwb25lbnQgKi8KLSAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyAyLjI7Ci0gICAgLyoKLSAgICBpZiAoc29tZV9uZXh0X2Z1bmN0aW9uX3RoYXRfcmV0dXJuc19nYW1tYSgmbmV4dF9nYW1tYSkpCi0gICAgICAgIExVVF9leHBvbmVudCA9IDEuMCAvIG5leHRfZ2FtbWE7Ci0gICAgICovCi0jZWxpZiBkZWZpbmVkKHNnaSkKLSAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyAxLjc7Ci0gICAgLyogdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSBkb2N1bWVudGVkIGZ1bmN0aW9uIHRvCi0gICAgICogZ2V0IHRoZSAiZ2FtbWEiIHZhbHVlLCBzbyB3ZSBkbyBpdCB0aGUgaGFyZCB3YXkgKi8KLSAgICB0bXBmaWxlID0gZm9wZW4oIi9ldGMvY29uZmlnL3N5c3RlbS5nbEdhbW1hVmFsIiwgInIiKTsKLSAgICBpZiAodG1wZmlsZSkgewotICAgICAgICBkb3VibGUgc2dpX2dhbW1hOwotCi0gICAgICAgIGZnZXRzKHRtcGxpbmUsIDgwLCB0bXBmaWxlKTsKLSAgICAgICAgZmNsb3NlKHRtcGZpbGUpOwotICAgICAgICBzZ2lfZ2FtbWEgPSBhdG9mKHRtcGxpbmUpOwotICAgICAgICBpZiAoc2dpX2dhbW1hID4gMC4wKQotICAgICAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gc2dpX2dhbW1hOwotICAgIH0KLSNlbGlmIGRlZmluZWQoTWFjaW50b3NoKQotICAgIExVVF9leHBvbmVudCA9IDEuOCAvIDIuNjE7Ci0gICAgLyoKLSAgICBpZiAoc29tZV9tYWNfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZtYWNfZ2FtbWEpKQotICAgICAgICBMVVRfZXhwb25lbnQgPSBtYWNfZ2FtbWEgLyAyLjYxOwotICAgICAqLwotI2Vsc2UKLSAgICBMVVRfZXhwb25lbnQgPSAxLjA7ICAgLyogYXNzdW1lIG5vIExVVDogIG1vc3QgUENzICovCi0jZW5kaWYKLQotICAgIC8qIHRoZSBkZWZhdWx0cyBhYm92ZSBnaXZlIDEuMCwgMS4zLCAxLjUgYW5kIDIuMiwgcmVzcGVjdGl2ZWx5OiAqLwotICAgIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCA9IExVVF9leHBvbmVudCAqIENSVF9leHBvbmVudDsKLQotCi0gICAgLyogSWYgdGhlIHVzZXIgaGFzIHNldCB0aGUgU0NSRUVOX0dBTU1BIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIHN1Z2dlc3RlZAotICAgICAqIChzb21ld2hhdCBpbXByZWNpc2VseSkgaW4gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCB1c2UgdGhhdDsgb3RoZXJ3aXNlCi0gICAgICogdXNlIHRoZSBkZWZhdWx0IHZhbHVlIHdlIGp1c3QgY2FsY3VsYXRlZC4gIEVpdGhlciB3YXksIHRoZSB1c2VyIG1heQotICAgICAqIG92ZXJyaWRlIHRoaXMgdmlhIGEgY29tbWFuZC1saW5lIG9wdGlvbi4gKi8KLQotICAgIGlmICgocCA9IGdldGVudigiU0NSRUVOX0dBTU1BIikpICE9IE5VTEwpIHsKLSAgICAgICAgZG91YmxlIGV4cG9uZW50ID0gYXRvZihwKTsKLQotICAgICAgICBpZiAoZXhwb25lbnQgPiAwLjApCi0gICAgICAgICAgICBkZWZhdWx0X2dhbW1hID0gMS4wIC8gZXhwb25lbnQ7Ci0gICAgfQotCi0gICAgaWYgKGRlZmF1bHRfZ2FtbWEgPT0gMC4wKQotICAgICAgICBkZWZhdWx0X2dhbW1hID0gMS4wIC8gZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50OwotCi0KLSAgICAvKiBOb3cgcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBmb3Igb3B0aW9ucyBhbmQgdGhlIFBOTSBmaWxlbmFtZS4gKi8KLQotICAgIHdoaWxlICgqKythcmd2ICYmICFlcnJvcikgewotICAgICAgICBpZiAoIXN0cm5jbXAoKmFyZ3YsICItaSIsIDIpKSB7Ci0gICAgICAgICAgICB3cG5nX2luZm8uaW50ZXJsYWNlZCA9IFRSVUU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItdGltZSIsIDMpKSB7Ci0gICAgICAgICAgICB3cG5nX2luZm8ubW9kdGltZSA9IHRpbWUoTlVMTCk7Ci0gICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90aW1lID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi10ZXh0IiwgMykpIHsKLSAgICAgICAgICAgIHRleHQgPSBUUlVFOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWdhbW1hIiwgMikpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLmdhbW1hID0gYXRvZigqYXJndik7Ci0gICAgICAgICAgICAgICAgaWYgKHdwbmdfaW5mby5nYW1tYSA8PSAwLjApCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAod3BuZ19pbmZvLmdhbW1hID4gMS4wMSkKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAgICAgIiB3YXJuaW5nOiAgZmlsZSBnYW1tYXMgYXJlIHVzdWFsbHkgbGVzcyB0aGFuIDEuMFxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItYmdjb2xvciIsIDQpKSB7Ci0gICAgICAgICAgICBpZiAoISorK2FyZ3YpCi0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGJnc3RyID0gKmFyZ3Y7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmxlbihiZ3N0cikgIT0gNyB8fCBiZ3N0clswXSAhPSAnIycpCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHIsIGcsIGI7ICAvKiB0aGlzIHdheSBxdWlldHMgY29tcGlsZXIgd2FybmluZ3MgKi8KLQotICAgICAgICAgICAgICAgICAgICBzc2NhbmYoYmdzdHIrMSwgIiUyeCUyeCUyeCIsICZyLCAmZywgJmIpOwotICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uYmdfcmVkICAgPSAodWNoKXI7Ci0gICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5iZ19ncmVlbiA9ICh1Y2gpZzsKLSAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmJnX2JsdWUgID0gKHVjaCliOwotICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV9iZyA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCoqYXJndiAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICBpbm5hbWUgPSAqYXJndjsKLSAgICAgICAgICAgICAgICBpZiAoYXJndlsxXSkgICAvKiBzaG91bGRuJ3QgYmUgYW55IG1vcmUgYXJncyBhZnRlciBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgKytlcnJvcjsgICAvKiBub3QgZXhwZWN0aW5nIGFueSBvdGhlciBvcHRpb25zICovCi0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qIG9wZW4gdGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMsIG9yIHJlZ2lzdGVyIGFuIGVycm9yIGFuZCBhYm9ydCAqLwotCi0gICAgaWYgKCFpbm5hbWUpIHsKLSAgICAgICAgaWYgKGlzYXR0eSgwKSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICI6ICBtdXN0IGdpdmUgaW5wdXQgZmlsZW5hbWUgb3IgcHJvdmlkZSBpbWFnZSBkYXRhIHZpYSBzdGRpblxuIik7Ci0gICAgICAgICAgICArK2Vycm9yOwotICAgICAgICB9IGVsc2UgewotI2lmZGVmIERPU19PUzJfVzMyCi0gICAgICAgICAgICAvKiBzb21lIGJ1Z2d5IEMgbGlicmFyaWVzIHJlcXVpcmUgQk9USCBzZXRtb2RlKCkgYW5kIGZkb3BlbihiaW4pICovCi0gICAgICAgICAgICBzZXRtb2RlKGZpbGVubyhzdGRpbiksIE9fQklOQVJZKTsKLSAgICAgICAgICAgIHNldG1vZGUoZmlsZW5vKHN0ZG91dCksIE9fQklOQVJZKTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKCh3cG5nX2luZm8uaW5maWxlID0gZmRvcGVuKGZpbGVubyhzdGRpbiksICJyYiIpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAiOiAgdW5hYmxlIHRvIHJlb3BlbiBzdGRpbiBpbiBiaW5hcnkgbW9kZVxuIik7Ci0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgaWYgKCh3cG5nX2luZm8ub3V0ZmlsZSA9IGZkb3BlbihmaWxlbm8oc3Rkb3V0KSwgIndiIikpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICI6ICB1bmFibGUgdG8gcmVvcGVuIHN0ZG91dCBpbiBiaW5hcnkgbW9kZVxuIik7Ci0gICAgICAgICAgICAgICAgZmNsb3NlKHdwbmdfaW5mby5pbmZpbGUpOwotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICB3cG5nX2luZm8uZmlsdGVyID0gVFJVRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoKGxlbiA9IHN0cmxlbihpbm5hbWUpKSA+IDI1MCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGlucHV0IGZpbGVuYW1lIGlzIHRvbyBsb25nIFslZCBjaGFyc11cbiIsCi0gICAgICAgICAgbGVuKTsKLSAgICAgICAgKytlcnJvcjsKLSAgICB9IGVsc2UgaWYgKCEod3BuZ19pbmZvLmluZmlsZSA9IGZvcGVuKGlubmFtZSwgInJiIikpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgY2FuJ3Qgb3BlbiBpbnB1dCBmaWxlIFslc11cbiIsIGlubmFtZSk7Ci0gICAgICAgICsrZXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKCFlcnJvcikgewotICAgICAgICBmZ2V0cyhwbm1saW5lLCAyNTYsIHdwbmdfaW5mby5pbmZpbGUpOwotICAgICAgICBpZiAocG5tbGluZVswXSAhPSAnUCcgfHwgKChwbm1jaGFyID0gcG5tbGluZVsxXSkgIT0gJzUnICYmCi0gICAgICAgICAgICBwbm1jaGFyICE9ICc2JyAmJiBwbm1jaGFyICE9ICc4JykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAiOiAgaW5wdXQgZmlsZSBbJXNdIGlzIG5vdCBhIGJpbmFyeSBQR00sIFBQTSBvciBQQU0gZmlsZVxuIiwKLSAgICAgICAgICAgICAgaW5uYW1lKTsKLSAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cG5nX2luZm8ucG5tdHlwZSA9IChpbnQpKHBubWNoYXIgLSAnMCcpOwotICAgICAgICAgICAgaWYgKHdwbmdfaW5mby5wbm10eXBlICE9IDgpCi0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfYmcgPSBGQUxTRTsgIC8qIG5vIG5lZWQgZm9yIGJnIGlmIG9wYXF1ZSAqLwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGZnZXRzKHBubWxpbmUsIDI1Niwgd3BuZ19pbmZvLmluZmlsZSk7ICAvKiBsb3NlIGFueSBjb21tZW50cyAqLwotICAgICAgICAgICAgfSB3aGlsZSAocG5tbGluZVswXSA9PSAnIycpOwotICAgICAgICAgICAgc3NjYW5mKHBubWxpbmUsICIlbGQgJWxkIiwgJndwbmdfaW5mby53aWR0aCwgJndwbmdfaW5mby5oZWlnaHQpOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGZnZXRzKHBubWxpbmUsIDI1Niwgd3BuZ19pbmZvLmluZmlsZSk7ICAvKiBtb3JlIGNvbW1lbnQgbGluZXMgKi8KLSAgICAgICAgICAgIH0gd2hpbGUgKHBubWxpbmVbMF0gPT0gJyMnKTsKLSAgICAgICAgICAgIHNzY2FuZihwbm1saW5lLCAiJWQiLCAmbWF4dmFsKTsKLSAgICAgICAgICAgIGlmICh3cG5nX2luZm8ud2lkdGggPD0gMEwgfHwgd3BuZ19pbmZvLmhlaWdodCA8PSAwTCB8fAotICAgICAgICAgICAgICAgIG1heHZhbCAhPSAyNTUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAiOiAgb25seSBwb3NpdGl2ZSB3aWR0aC9oZWlnaHQsIG1heHZhbCA9PSAyNTUgYWxsb3dlZCBcbiIpOwotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cG5nX2luZm8uc2FtcGxlX2RlcHRoID0gODsgIC8qIDw9PT4gbWF4dmFsIDI1NSAqLwotCi0gICAgICAgICAgICBpZiAoIXdwbmdfaW5mby5maWx0ZXIpIHsKLSAgICAgICAgICAgICAgICAvKiBtYWtlIG91dG5hbWUgZnJvbSBpbm5hbWUgKi8KLSAgICAgICAgICAgICAgICBpZiAoKHAgPSBzdHJyY2hyKGlubmFtZSwgJy4nKSkgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICAocCAtIGlubmFtZSkgIT0gKGxlbiAtIDQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyY3B5KG91dG5hbWUsIGlubmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmNweShvdXRuYW1lK2xlbiwgIi5wbmciKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsZW4gLT0gNDsKLSAgICAgICAgICAgICAgICAgICAgc3RybmNweShvdXRuYW1lLCBpbm5hbWUsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmNweShvdXRuYW1lK2xlbiwgIi5wbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgb3V0bmFtZSBhbHJlYWR5IGV4aXN0czsgaWYgbm90LCBvcGVuICovCi0gICAgICAgICAgICAgICAgaWYgKCh3cG5nX2luZm8ub3V0ZmlsZSA9IGZvcGVuKG91dG5hbWUsICJyYiIpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgb3V0cHV0IGZpbGUgZXhpc3RzIFslc11cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgb3V0bmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZjbG9zZSh3cG5nX2luZm8ub3V0ZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKHdwbmdfaW5mby5vdXRmaWxlID0gZm9wZW4ob3V0bmFtZSwgIndiIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgY2FuJ3Qgb3BlbiBvdXRwdXQgZmlsZSBbJXNdXG4iLAotICAgICAgICAgICAgICAgICAgICAgIG91dG5hbWUpOwotICAgICAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgICAgIGZjbG9zZSh3cG5nX2luZm8uaW5maWxlKTsKLSAgICAgICAgICAgIHdwbmdfaW5mby5pbmZpbGUgPSBOVUxMOwotICAgICAgICAgICAgaWYgKHdwbmdfaW5mby5maWx0ZXIpIHsKLSAgICAgICAgICAgICAgICBmY2xvc2Uod3BuZ19pbmZvLm91dGZpbGUpOwotICAgICAgICAgICAgICAgIHdwbmdfaW5mby5vdXRmaWxlID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyogaWYgd2UgaGFkIGFueSBlcnJvcnMsIHByaW50IHVzYWdlIGFuZCBkaWUgaG9ycmlibGUgZGVhdGguLi5hcnJyISAqLwotCi0gICAgaWYgKGVycm9yKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4lcyAlczogICVzXG4iLCBQUk9HTkFNRSwgVkVSU0lPTiwgQVBQTkFNRSk7Ci0gICAgICAgIHdyaXRlcG5nX3ZlcnNpb25faW5mbygpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIgotIlVzYWdlOiAgJXMgWy1nYW1tYSBleHBdIFstYmdjb2xvciBiZ10gWy10ZXh0XSBbLXRpbWVdIFstaW50ZXJsYWNlXSBwbm1maWxlXG4iCi0ib3I6IC4uLiB8ICVzIFstZ2FtbWEgZXhwXSBbLWJnY29sb3IgYmddIFstdGV4dF0gWy10aW1lXSBbLWludGVybGFjZV0gfCAuLi5cbiIKLSAgICAgICAgICIgICAgZXhwIFx0dHJhbnNmZXItZnVuY3Rpb24gZXhwb25lbnQgKGBgZ2FtbWEnJykgb2YgdGhlIGltYWdlIGluXG4iCi0gICAgICAgICAiXHRcdCAgZmxvYXRpbmctcG9pbnQgZm9ybWF0IChlLmcuLCBgYCUuNWYnJyk7IGlmIGltYWdlIGxvb2tzXG4iCi0gICAgICAgICAiXHRcdCAgY29ycmVjdCBvbiBnaXZlbiBkaXNwbGF5IHN5c3RlbSwgaW1hZ2UgZ2FtbWEgaXMgZXF1YWwgdG9cbiIKLSAgICAgICAgICJcdFx0ICBpbnZlcnNlIG9mIGRpc3BsYXktc3lzdGVtIGV4cG9uZW50LCBpLmUuLCAxIC8gKExVVCAqIENSVClcbiIKLSAgICAgICAgICJcdFx0ICAod2hlcmUgTFVUID0gbG9va3VwLXRhYmxlIGV4cG9uZW50IGFuZCBDUlQgPSBDUlQgZXhwb25lbnQ7XG4iCi0gICAgICAgICAiXHRcdCAgZmlyc3QgdmFyaWVzLCBzZWNvbmQgaXMgdXN1YWxseSAyLjIsIGFsbCBhcmUgcG9zaXRpdmUpXG4iCi0gICAgICAgICAiICAgIGJnICBcdGRlc2lyZWQgYmFja2dyb3VuZCBjb2xvciBmb3IgYWxwaGEtY2hhbm5lbCBpbWFnZXMsIGluXG4iCi0gICAgICAgICAiXHRcdCAgNy1jaGFyYWN0ZXIgaGV4IFJHQiBmb3JtYXQgKGUuZy4sIGBgI2ZmNzcwMCcnIGZvciBvcmFuZ2U6XG4iCi0gICAgICAgICAiXHRcdCAgc2FtZSBhcyBIVE1MIGNvbG9ycylcbiIKLSAgICAgICAgICIgICAgLXRleHRcdHByb21wdCBpbnRlcmFjdGl2ZWx5IGZvciB0ZXh0IGluZm8gKHRFWHQgY2h1bmtzKVxuIgotICAgICAgICAgIiAgICAtdGltZVx0aW5jbHVkZSBhIHRJTUUgY2h1bmsgKGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUpXG4iCi0gICAgICAgICAiICAgIC1pbnRlcmxhY2VcdHdyaXRlIGludGVybGFjZWQgUE5HIGltYWdlXG4iCi0gICAgICAgICAiXG4iCi0icG5tZmlsZSBvciBzdGRpbiBtdXN0IGJlIGEgYmluYXJ5IFBHTSAoYFA1JyksIFBQTSAoYFA2Jykgb3IgKGV4dHJlbWVseVxuIgotInVub2ZmaWNpYWwgYW5kIHVuc3VwcG9ydGVkISkgUEFNIChgUDgnKSBmaWxlLiAgQ3VycmVudGx5IGl0IGlzIHJlcXVpcmVkXG4iCi0idG8gaGF2ZSBtYXh2YWwgPT0gMjU1IChpLmUuLCBubyBzY2FsaW5nKS4gIElmIHBubWZpbGUgaXMgc3BlY2lmaWVkLCBpdFxuIgotImlzIGNvbnZlcnRlZCB0byB0aGUgY29ycmVzcG9uZGluZyBQTkcgZmlsZSB3aXRoIHRoZSBzYW1lIGJhc2UgbmFtZSBidXQgYVxuIgotImBgLnBuZycnIGV4dGVuc2lvbjsgZmlsZXMgcmVhZCBmcm9tIHN0ZGluIGFyZSBjb252ZXJ0ZWQgYW5kIHNlbnQgdG8gc3Rkb3V0LlxuIgotIlRoZSBjb252ZXJzaW9uIGlzIHByb2dyZXNzaXZlIChsb3cgbWVtb3J5IHVzYWdlKSB1bmxlc3MgaW50ZXJsYWNpbmcgaXNcbiIKLSJyZXF1ZXN0ZWQ7IGluIHRoYXQgY2FzZSB0aGUgd2hvbGUgaW1hZ2Ugd2lsbCBiZSBidWZmZXJlZCBpbiBtZW1vcnkgYW5kXG4iCi0id3JpdHRlbiBpbiBvbmUgY2FsbC5cbiIKLSAgICAgICAgICJcbiIsIFBST0dOQU1FLCBQUk9HTkFNRSwgZGVmYXVsdF9nYW1tYSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0KLSAgICAvKiBwcmVwYXJlIHRoZSB0ZXh0IGJ1ZmZlcnMgZm9yIGxpYnBuZydzIHVzZTsgbm90ZSB0aGF0IGV2ZW4gdGhvdWdoCi0gICAgICogUE5HJ3MgcG5nX3RleHQgc3RydWN0IGluY2x1ZGVzIGEgbGVuZ3RoIGZpZWxkLCB3ZSBkb24ndCBoYXZlIHRvIGZpbGwKLSAgICAgKiBpdCBvdXQgKi8KLQotICAgIGlmICh0ZXh0ICYmCi0jaWZuZGVmIERPU19PUzJfVzMyCi0gICAgICAgIChrZXliZCA9IGZkb3BlbihmaWxlbm8oc3RkZXJyKSwgInIiKSkgIT0gTlVMTCAmJgotI2VuZGlmCi0gICAgICAgICh0ZXh0YnVmID0gKGNoYXIgKiltYWxsb2MoKDUgKyA5KSo3NSkpICE9IE5VTEwpCi0gICAgewotICAgICAgICBpbnQgaSwgdmFsaWQsIHJlc3VsdDsKLQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAiRW50ZXIgdGV4dCBpbmZvIChubyBtb3JlIHRoYW4gNzIgY2hhcmFjdGVycyBwZXIgbGluZSk7XG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0byBza2lwIGEgZmllbGQsIGhpdCB0aGUgPEVudGVyPiBrZXkuXG4iKTsKLSAgICAgICAgLyogbm90ZTogIGp1c3QgPEVudGVyPiBsZWF2ZXMgbGVuID09IDEgKi8KLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB2YWxpZCA9IFRSVUU7Ci0gICAgICAgICAgICBwID0gdGV4dGJ1ZiArIFRFWFRfVElUTEVfT0ZGU0VUOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIFRpdGxlOiAiKTsKLSAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgICAgICAgICAgaWYgKEZHRVRTKHAsIDc0LCBrZXliZCkgJiYgKGxlbiA9IHN0cmxlbihwKSkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBbbGVuLTFdID09ICdcbicpCi0gICAgICAgICAgICAgICAgICAgIHBbLS1sZW5dID0gJ1wwJzsKLSAgICAgICAgICAgICAgICB3cG5nX2luZm8udGl0bGUgPSBwOwotICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgfD0gVEVYVF9USVRMRTsKLSAgICAgICAgICAgICAgICBpZiAoKHJlc3VsdCA9IHdwbmdfaXN2YWxpZF9sYXRpbjEoKHVjaCAqKXAsIGxlbikpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgIiBQUk9HTkFNRSAiIHdhcm5pbmc6ICBjaGFyYWN0ZXIgY29kZSIKLSAgICAgICAgICAgICAgICAgICAgICAiICV1IGlzICVzZGlzY291cmFnZWQgYnkgdGhlIFBOR1xuICAgIHNwZWNpZmljYXRpb24gIgotICAgICAgICAgICAgICAgICAgICAgICJbZmlyc3Qgb2NjdXJyZW5jZSB3YXMgYXQgY2hhcmFjdGVyIHBvc2l0aW9uICMlZF1cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXBbcmVzdWx0XSwgKHBbcmVzdWx0XSA9PSAyNyk/ICJzdHJvbmdseSAiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KzEpOwotICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSNpZmRlZiBGT1JCSURfTEFUSU4xX0NUUkwKLSAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCAmPSB+VEVYVF9USVRMRTsKLSAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBGQUxTRTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChwW3Jlc3VsdF0gPT0gMjcpIHsgICAgLyogZXNjYXBlIGNoYXJhY3RlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCAmPSB+VEVYVF9USVRMRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoIXZhbGlkKTsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB2YWxpZCA9IFRSVUU7Ci0gICAgICAgICAgICBwID0gdGV4dGJ1ZiArIFRFWFRfQVVUSE9SX09GRlNFVDsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBBdXRob3I6ICIpOwotICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgICAgICAgICBpZiAoRkdFVFMocCwgNzQsIGtleWJkKSAmJiAobGVuID0gc3RybGVuKHApKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAocFtsZW4tMV0gPT0gJ1xuJykKLSAgICAgICAgICAgICAgICAgICAgcFstLWxlbl0gPSAnXDAnOwotICAgICAgICAgICAgICAgIHdwbmdfaW5mby5hdXRob3IgPSBwOwotICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgfD0gVEVYVF9BVVRIT1I7Ci0gICAgICAgICAgICAgICAgaWYgKChyZXN1bHQgPSB3cG5nX2lzdmFsaWRfbGF0aW4xKCh1Y2ggKilwLCBsZW4pKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgICIgUFJPR05BTUUgIiB3YXJuaW5nOiAgY2hhcmFjdGVyIGNvZGUiCi0gICAgICAgICAgICAgICAgICAgICAgIiAldSBpcyAlc2Rpc2NvdXJhZ2VkIGJ5IHRoZSBQTkdcbiAgICBzcGVjaWZpY2F0aW9uICIKLSAgICAgICAgICAgICAgICAgICAgICAiW2ZpcnN0IG9jY3VycmVuY2Ugd2FzIGF0IGNoYXJhY3RlciBwb3NpdGlvbiAjJWRdXG4iLAotICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwW3Jlc3VsdF0sIChwW3Jlc3VsdF0gPT0gMjcpPyAic3Ryb25nbHkgIiA6ICIiLAotICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCsxKTsKLSAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0jaWZkZWYgRk9SQklEX0xBVElOMV9DVFJMCi0gICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgJj0gflRFWFRfQVVUSE9SOwotICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IEZBTFNFOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBbcmVzdWx0XSA9PSAyNykgeyAgICAvKiBlc2NhcGUgY2hhcmFjdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX0FVVEhPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoIXZhbGlkKTsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB2YWxpZCA9IFRSVUU7Ci0gICAgICAgICAgICBwID0gdGV4dGJ1ZiArIFRFWFRfREVTQ19PRkZTRVQ7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgRGVzY3JpcHRpb24gKHVwIHRvIDkgbGluZXMpOlxuIik7Ci0gICAgICAgICAgICBmb3IgKGkgPSAxOyAgaSA8IDEwOyAgKytpKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgWyVkXSAiLCBpKTsKLSAgICAgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSAgICAgICAgICAgICAgICBpZiAoRkdFVFMocCwgNzQsIGtleWJkKSAmJiAobGVuID0gc3RybGVuKHApKSA+IDEpCi0gICAgICAgICAgICAgICAgICAgIHAgKz0gbGVuOyAgIC8qIG5vdyBwb2ludHMgYXQgTlVMTDsgY2hhciBiZWZvcmUgaXMgbmV3bGluZSAqLwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGxlbiA9IHAgLSAodGV4dGJ1ZiArIFRFWFRfREVTQ19PRkZTRVQpKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAocFstMV0gPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICBwWy0xXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgICAgIC0tbGVuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3cG5nX2luZm8uZGVzYyA9IHRleHRidWYgKyBURVhUX0RFU0NfT0ZGU0VUOwotICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgfD0gVEVYVF9ERVNDOwotICAgICAgICAgICAgICAgIHAgPSB0ZXh0YnVmICsgVEVYVF9ERVNDX09GRlNFVDsKLSAgICAgICAgICAgICAgICBpZiAoKHJlc3VsdCA9IHdwbmdfaXN2YWxpZF9sYXRpbjEoKHVjaCAqKXAsIGxlbikpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgIiBQUk9HTkFNRSAiIHdhcm5pbmc6ICBjaGFyYWN0ZXIgY29kZSIKLSAgICAgICAgICAgICAgICAgICAgICAiICV1IGlzICVzZGlzY291cmFnZWQgYnkgdGhlIFBOR1xuICAgIHNwZWNpZmljYXRpb24gIgotICAgICAgICAgICAgICAgICAgICAgICJbZmlyc3Qgb2NjdXJyZW5jZSB3YXMgYXQgY2hhcmFjdGVyIHBvc2l0aW9uICMlZF1cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXBbcmVzdWx0XSwgKHBbcmVzdWx0XSA9PSAyNyk/ICJzdHJvbmdseSAiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KzEpOwotICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSNpZmRlZiBGT1JCSURfTEFUSU4xX0NUUkwKLSAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCAmPSB+VEVYVF9ERVNDOwotICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IEZBTFNFOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBbcmVzdWx0XSA9PSAyNykgeyAgICAvKiBlc2NhcGUgY2hhcmFjdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX0RFU0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKCF2YWxpZCk7Ci0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgdmFsaWQgPSBUUlVFOwotICAgICAgICAgICAgcCA9IHRleHRidWYgKyBURVhUX0NPUFlfT0ZGU0VUOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIENvcHlyaWdodDogIik7Ci0gICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSAgICAgICAgICAgIGlmIChGR0VUUyhwLCA3NCwga2V5YmQpICYmIChsZW4gPSBzdHJsZW4ocCkpID4gMSkgewotICAgICAgICAgICAgICAgIGlmIChwW2xlbi0xXSA9PSAnXG4nKQotICAgICAgICAgICAgICAgICAgICBwWy0tbGVuXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLmNvcHlyaWdodCA9IHA7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCB8PSBURVhUX0NPUFk7Ci0gICAgICAgICAgICAgICAgaWYgKChyZXN1bHQgPSB3cG5nX2lzdmFsaWRfbGF0aW4xKCh1Y2ggKilwLCBsZW4pKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgICIgUFJPR05BTUUgIiB3YXJuaW5nOiAgY2hhcmFjdGVyIGNvZGUiCi0gICAgICAgICAgICAgICAgICAgICAgIiAldSBpcyAlc2Rpc2NvdXJhZ2VkIGJ5IHRoZSBQTkdcbiAgICBzcGVjaWZpY2F0aW9uICIKLSAgICAgICAgICAgICAgICAgICAgICAiW2ZpcnN0IG9jY3VycmVuY2Ugd2FzIGF0IGNoYXJhY3RlciBwb3NpdGlvbiAjJWRdXG4iLAotICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwW3Jlc3VsdF0sIChwW3Jlc3VsdF0gPT0gMjcpPyAic3Ryb25nbHkgIiA6ICIiLAotICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCsxKTsKLSAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0jaWZkZWYgRk9SQklEX0xBVElOMV9DVFJMCi0gICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgJj0gflRFWFRfQ09QWTsKLSAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBGQUxTRTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChwW3Jlc3VsdF0gPT0gMjcpIHsgICAgLyogZXNjYXBlIGNoYXJhY3RlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCAmPSB+VEVYVF9DT1BZOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICghdmFsaWQpOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHZhbGlkID0gVFJVRTsKLSAgICAgICAgICAgIHAgPSB0ZXh0YnVmICsgVEVYVF9FTUFJTF9PRkZTRVQ7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgRS1tYWlsOiAiKTsKLSAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgICAgICAgICAgaWYgKEZHRVRTKHAsIDc0LCBrZXliZCkgJiYgKGxlbiA9IHN0cmxlbihwKSkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBbbGVuLTFdID09ICdcbicpCi0gICAgICAgICAgICAgICAgICAgIHBbLS1sZW5dID0gJ1wwJzsKLSAgICAgICAgICAgICAgICB3cG5nX2luZm8uZW1haWwgPSBwOwotICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgfD0gVEVYVF9FTUFJTDsKLSAgICAgICAgICAgICAgICBpZiAoKHJlc3VsdCA9IHdwbmdfaXN2YWxpZF9sYXRpbjEoKHVjaCAqKXAsIGxlbikpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgIiBQUk9HTkFNRSAiIHdhcm5pbmc6ICBjaGFyYWN0ZXIgY29kZSIKLSAgICAgICAgICAgICAgICAgICAgICAiICV1IGlzICVzZGlzY291cmFnZWQgYnkgdGhlIFBOR1xuICAgIHNwZWNpZmljYXRpb24gIgotICAgICAgICAgICAgICAgICAgICAgICJbZmlyc3Qgb2NjdXJyZW5jZSB3YXMgYXQgY2hhcmFjdGVyIHBvc2l0aW9uICMlZF1cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXBbcmVzdWx0XSwgKHBbcmVzdWx0XSA9PSAyNyk/ICJzdHJvbmdseSAiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KzEpOwotICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSNpZmRlZiBGT1JCSURfTEFUSU4xX0NUUkwKLSAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCAmPSB+VEVYVF9FTUFJTDsKLSAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBGQUxTRTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChwW3Jlc3VsdF0gPT0gMjcpIHsgICAgLyogZXNjYXBlIGNoYXJhY3RlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCAmPSB+VEVYVF9FTUFJTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoIXZhbGlkKTsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB2YWxpZCA9IFRSVUU7Ci0gICAgICAgICAgICBwID0gdGV4dGJ1ZiArIFRFWFRfVVJMX09GRlNFVDsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBVUkw6ICIpOwotICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgICAgICAgICBpZiAoRkdFVFMocCwgNzQsIGtleWJkKSAmJiAobGVuID0gc3RybGVuKHApKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAocFtsZW4tMV0gPT0gJ1xuJykKLSAgICAgICAgICAgICAgICAgICAgcFstLWxlbl0gPSAnXDAnOwotICAgICAgICAgICAgICAgIHdwbmdfaW5mby51cmwgPSBwOwotICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgfD0gVEVYVF9VUkw7Ci0gICAgICAgICAgICAgICAgaWYgKChyZXN1bHQgPSB3cG5nX2lzdmFsaWRfbGF0aW4xKCh1Y2ggKilwLCBsZW4pKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgICIgUFJPR05BTUUgIiB3YXJuaW5nOiAgY2hhcmFjdGVyIGNvZGUiCi0gICAgICAgICAgICAgICAgICAgICAgIiAldSBpcyAlc2Rpc2NvdXJhZ2VkIGJ5IHRoZSBQTkdcbiAgICBzcGVjaWZpY2F0aW9uICIKLSAgICAgICAgICAgICAgICAgICAgICAiW2ZpcnN0IG9jY3VycmVuY2Ugd2FzIGF0IGNoYXJhY3RlciBwb3NpdGlvbiAjJWRdXG4iLAotICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwW3Jlc3VsdF0sIChwW3Jlc3VsdF0gPT0gMjcpPyAic3Ryb25nbHkgIiA6ICIiLAotICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCsxKTsKLSAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0jaWZkZWYgRk9SQklEX0xBVElOMV9DVFJMCi0gICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgJj0gflRFWFRfVVJMOwotICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IEZBTFNFOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBbcmVzdWx0XSA9PSAyNykgeyAgICAvKiBlc2NhcGUgY2hhcmFjdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX1VSTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoIXZhbGlkKTsKLQotI2lmbmRlZiBET1NfT1MyX1czMgotICAgICAgICBmY2xvc2Uoa2V5YmQpOwotI2VuZGlmCi0KLSAgICB9IGVsc2UgaWYgKHRleHQpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0ZXh0XG4iKTsKLSAgICAgICAgdGV4dCA9IEZBTFNFOwotICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ID0gMDsKLSAgICB9Ci0KLQotICAgIC8qIGFsbG9jYXRlIGxpYnBuZyBzdHVmZiwgaW5pdGlhbGl6ZSB0cmFuc2Zvcm1hdGlvbnMsIHdyaXRlIHByZS1JREFUIGRhdGEgKi8KLQotICAgIGlmICgocmMgPSB3cml0ZXBuZ19pbml0KCZ3cG5nX2luZm8pKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCAocmMpIHsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICI6ICBsaWJwbmcgaW5pdGlhbGl6YXRpb24gcHJvYmxlbSAobG9uZ2ptcClcbiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgaW5zdWZmaWNpZW50IG1lbW9yeVxuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAgICAgIjogIGludGVybmFsIGxvZ2ljIGVycm9yICh1bmV4cGVjdGVkIFBOTSB0eXBlKVxuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAgICAgIjogIHVua25vd24gd3JpdGVwbmdfaW5pdCgpIGVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBleGl0KHJjKTsKLSAgICB9Ci0KLQotICAgIC8qIGZyZWUgdGV4dGJ1Ziwgc2luY2UgaXQncyBhIGNvbXBsZXRlbHkgbG9jYWwgdmFyaWFibGUgYW5kIGFsbCB0ZXh0IGluZm8KLSAgICAgKiBoYXMganVzdCBiZWVuIHdyaXR0ZW4gdG8gdGhlIFBORyBmaWxlICovCi0KLSAgICBpZiAodGV4dCAmJiB0ZXh0YnVmKSB7Ci0gICAgICAgIGZyZWUodGV4dGJ1Zik7Ci0gICAgICAgIHRleHRidWYgPSBOVUxMOwotICAgIH0KLQotCi0gICAgLyogY2FsY3VsYXRlIHJvd2J5dGVzIG9uIGJhc2lzIG9mIGltYWdlIHR5cGU7IG5vdGUgdGhhdCB0aGlzIGJlY29tZXMgbXVjaAotICAgICAqIG1vcmUgY29tcGxpY2F0ZWQgaWYgd2UgY2hvb3NlIHRvIHN1cHBvcnQgUEJNIHR5cGUsIEFTQ0lJIFBOTSB0eXBlcywgb3IKLSAgICAgKiAxNi1iaXQtcGVyLXNhbXBsZSBiaW5hcnkgZGF0YSBbY3VycmVudGx5IG5vdCBhbiBvZmZpY2lhbCBOZXRQQk0gdHlwZV0gKi8KLQotICAgIGlmICh3cG5nX2luZm8ucG5tdHlwZSA9PSA1KQotICAgICAgICByb3dieXRlcyA9IHdwbmdfaW5mby53aWR0aDsKLSAgICBlbHNlIGlmICh3cG5nX2luZm8ucG5tdHlwZSA9PSA2KQotICAgICAgICByb3dieXRlcyA9IHdwbmdfaW5mby53aWR0aCAqIDM7Ci0gICAgZWxzZSAvKiBpZiAod3BuZ19pbmZvLnBubXR5cGUgPT0gOCkgKi8KLSAgICAgICAgcm93Ynl0ZXMgPSB3cG5nX2luZm8ud2lkdGggKiA0OwotCi0KLSAgICAvKiByZWFkIGFuZCB3cml0ZSB0aGUgaW1hZ2UsIGVpdGhlciBpbiBpdHMgZW50aXJldHkgKGlmIHdyaXRpbmcgaW50ZXJsYWNlZAotICAgICAqIFBORykgb3Igcm93IGJ5IHJvdyAoaWYgbm9uLWludGVybGFjZWQpICovCi0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIkVuY29kaW5nIGltYWdlIGRhdGEuLi5cbiIpOwotICAgIGZmbHVzaChzdGRlcnIpOwotCi0gICAgaWYgKHdwbmdfaW5mby5pbnRlcmxhY2VkKSB7Ci0gICAgICAgIGxvbmcgaTsKLSAgICAgICAgdWxnIGJ5dGVzOwotICAgICAgICB1bGcgaW1hZ2VfYnl0ZXMgPSByb3dieXRlcyAqIHdwbmdfaW5mby5oZWlnaHQ7ICAgLyogb3ZlcmZsb3c/ICovCi0KLSAgICAgICAgd3BuZ19pbmZvLmltYWdlX2RhdGEgPSAodWNoICopbWFsbG9jKGltYWdlX2J5dGVzKTsKLSAgICAgICAgd3BuZ19pbmZvLnJvd19wb2ludGVycyA9ICh1Y2ggKiopbWFsbG9jKHdwbmdfaW5mby5oZWlnaHQqc2l6ZW9mKHVjaCAqKSk7Ci0gICAgICAgIGlmICh3cG5nX2luZm8uaW1hZ2VfZGF0YSA9PSBOVUxMIHx8IHdwbmdfaW5mby5yb3dfcG9pbnRlcnMgPT0gTlVMTCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbnN1ZmZpY2llbnQgbWVtb3J5IGZvciBpbWFnZSBkYXRhXG4iKTsKLSAgICAgICAgICAgIHdyaXRlcG5nX2NsZWFudXAoJndwbmdfaW5mbyk7Ci0gICAgICAgICAgICB3cG5nX2NsZWFudXAoKTsKLSAgICAgICAgICAgIGV4aXQoNSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgIGkgPCB3cG5nX2luZm8uaGVpZ2h0OyAgKytpKQotICAgICAgICAgICAgd3BuZ19pbmZvLnJvd19wb2ludGVyc1tpXSA9IHdwbmdfaW5mby5pbWFnZV9kYXRhICsgaSpyb3dieXRlczsKLSAgICAgICAgYnl0ZXMgPSBmcmVhZCh3cG5nX2luZm8uaW1hZ2VfZGF0YSwgMSwgaW1hZ2VfYnl0ZXMsIHdwbmdfaW5mby5pbmZpbGUpOwotICAgICAgICBpZiAoYnl0ZXMgIT0gaW1hZ2VfYnl0ZXMpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgZXhwZWN0ZWQgJWx1IGJ5dGVzLCBnb3QgJWx1IGJ5dGVzXG4iLAotICAgICAgICAgICAgICBpbWFnZV9ieXRlcywgYnl0ZXMpOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIChjb250aW51aW5nIGFueXdheSlcbiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3cml0ZXBuZ19lbmNvZGVfaW1hZ2UoJndwbmdfaW5mbykgIT0gMCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICI6ICBsaWJwbmcgcHJvYmxlbSAobG9uZ2ptcCkgd2hpbGUgd3JpdGluZyBpbWFnZSBkYXRhXG4iKTsKLSAgICAgICAgICAgIHdyaXRlcG5nX2NsZWFudXAoJndwbmdfaW5mbyk7Ci0gICAgICAgICAgICB3cG5nX2NsZWFudXAoKTsKLSAgICAgICAgICAgIGV4aXQoMik7Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSAvKiBub3QgaW50ZXJsYWNlZDogIHdyaXRlIHByb2dyZXNzaXZlbHkgKHJvdyBieSByb3cpICovIHsKLSAgICAgICAgbG9uZyBqOwotICAgICAgICB1bGcgYnl0ZXM7Ci0KLSAgICAgICAgd3BuZ19pbmZvLmltYWdlX2RhdGEgPSAodWNoICopbWFsbG9jKHJvd2J5dGVzKTsKLSAgICAgICAgaWYgKHdwbmdfaW5mby5pbWFnZV9kYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgaW5zdWZmaWNpZW50IG1lbW9yeSBmb3Igcm93IGRhdGFcbiIpOwotICAgICAgICAgICAgd3JpdGVwbmdfY2xlYW51cCgmd3BuZ19pbmZvKTsKLSAgICAgICAgICAgIHdwbmdfY2xlYW51cCgpOwotICAgICAgICAgICAgZXhpdCg1KTsKLSAgICAgICAgfQotICAgICAgICBlcnJvciA9IDA7Ci0gICAgICAgIGZvciAoaiA9IHdwbmdfaW5mby5oZWlnaHQ7ICBqID4gMEw7ICAtLWopIHsKLSAgICAgICAgICAgIGJ5dGVzID0gZnJlYWQod3BuZ19pbmZvLmltYWdlX2RhdGEsIDEsIHJvd2J5dGVzLCB3cG5nX2luZm8uaW5maWxlKTsKLSAgICAgICAgICAgIGlmIChieXRlcyAhPSByb3dieXRlcykgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAgICAgIjogIGV4cGVjdGVkICVsdSBieXRlcywgZ290ICVsdSBieXRlcyAocm93ICVsZClcbiIsIHJvd2J5dGVzLAotICAgICAgICAgICAgICAgICAgYnl0ZXMsIHdwbmdfaW5mby5oZWlnaHQtaik7Ci0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3cml0ZXBuZ19lbmNvZGVfcm93KCZ3cG5nX2luZm8pICE9IDApIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICI6ICBsaWJwbmcgcHJvYmxlbSAobG9uZ2ptcCkgd2hpbGUgd3JpdGluZyByb3cgJWxkXG4iLAotICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhlaWdodC1qKTsKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChlcnJvcikgewotICAgICAgICAgICAgd3JpdGVwbmdfY2xlYW51cCgmd3BuZ19pbmZvKTsKLSAgICAgICAgICAgIHdwbmdfY2xlYW51cCgpOwotICAgICAgICAgICAgZXhpdCgyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAod3JpdGVwbmdfZW5jb2RlX2ZpbmlzaCgmd3BuZ19pbmZvKSAhPSAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGVycm9yIG9uIGZpbmFsIGxpYnBuZyBjYWxsXG4iKTsKLSAgICAgICAgICAgIHdyaXRlcG5nX2NsZWFudXAoJndwbmdfaW5mbyk7Ci0gICAgICAgICAgICB3cG5nX2NsZWFudXAoKTsKLSAgICAgICAgICAgIGV4aXQoMik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qIE9LLCB3ZSdyZSBkb25lIChzdWNjZXNzZnVsbHkpOiAgY2xlYW4gdXAgYWxsIHJlc291cmNlcyBhbmQgcXVpdCAqLwotCi0gICAgZnByaW50ZihzdGRlcnIsICJEb25lLlxuIik7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0KLSAgICB3cml0ZXBuZ19jbGVhbnVwKCZ3cG5nX2luZm8pOwotICAgIHdwbmdfY2xlYW51cCgpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLQotc3RhdGljIGludCB3cG5nX2lzdmFsaWRfbGF0aW4xKHVjaCAqcCwgaW50IGxlbikKLXsKLSAgICBpbnQgaSwgcmVzdWx0ID0gLTE7Ci0KLSAgICBmb3IgKGkgPSAwOyAgaSA8IGxlbjsgICsraSkgewotICAgICAgICBpZiAocFtpXSA9PSAxMCB8fCAocFtpXSA+IDMxICYmIHBbaV0gPCAxMjcpIHx8IHBbaV0gPiAxNjApCi0gICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgIC8qIGNoYXJhY3RlciBpcyBjb21wbGV0ZWx5IE9LICovCi0gICAgICAgIGlmIChyZXN1bHQgPCAwIHx8IChwW3Jlc3VsdF0gIT0gMjcgJiYgcFtpXSA9PSAyNykpCi0gICAgICAgICAgICByZXN1bHQgPSBpOyAgICAgICAgIC8qIG1hcmsgbG9jYXRpb24gb2YgZmlyc3QgcXVlc3Rpb25hYmxlIG9uZSAqLwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgb3Igb2YgZmlyc3QgZXNjYXBlIGNoYXJhY3RlciAoYmFkKSAqLwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0KLQotCi1zdGF0aWMgdm9pZCB3cG5nX2NsZWFudXAodm9pZCkKLXsKLSAgICBpZiAod3BuZ19pbmZvLm91dGZpbGUpIHsKLSAgICAgICAgZmNsb3NlKHdwbmdfaW5mby5vdXRmaWxlKTsKLSAgICAgICAgd3BuZ19pbmZvLm91dGZpbGUgPSBOVUxMOwotICAgIH0KLQotICAgIGlmICh3cG5nX2luZm8uaW5maWxlKSB7Ci0gICAgICAgIGZjbG9zZSh3cG5nX2luZm8uaW5maWxlKTsKLSAgICAgICAgd3BuZ19pbmZvLmluZmlsZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHdwbmdfaW5mby5pbWFnZV9kYXRhKSB7Ci0gICAgICAgIGZyZWUod3BuZ19pbmZvLmltYWdlX2RhdGEpOwotICAgICAgICB3cG5nX2luZm8uaW1hZ2VfZGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHdwbmdfaW5mby5yb3dfcG9pbnRlcnMpIHsKLSAgICAgICAgZnJlZSh3cG5nX2luZm8ucm93X3BvaW50ZXJzKTsKLSAgICAgICAgd3BuZ19pbmZvLnJvd19wb2ludGVycyA9IE5VTEw7Ci0gICAgfQotfQotCi0KLQotCi0jaWZkZWYgRE9TX09TMl9XMzIKLQotc3RhdGljIGNoYXIgKmRvc19rYmRfZ2V0cyhjaGFyICpidWYsIGludCBsZW4pCi17Ci0gICAgaW50IGNoLCBjb3VudD0wOwotCi0gICAgZG8gewotICAgICAgICBidWZbY291bnQrK10gPSBjaCA9IGdldGNoZSgpOwotICAgIH0gd2hpbGUgKGNoICE9ICdccicgJiYgY291bnQgPCBsZW4tMSk7Ci0KLSAgICBidWZbY291bnQtLV0gPSAnXDAnOyAgICAgICAgLyogdGVybWluYXRlIHN0cmluZyAqLwotICAgIGlmIChidWZbY291bnRdID09ICdccicpICAgICAvKiBFbnRlciBrZXkgbWFrZXMgQ1IsIHNvIGNoYW5nZSB0byBuZXdsaW5lICovCi0gICAgICAgIGJ1Zltjb3VudF0gPSAnXG4nOwotCi0gICAgZnByaW50ZihzdGRlcnIsICJcbiIpOyAgICAgIC8qIEVudGVyIGtleSBkb2VzICpub3QqIGNhdXNlIGEgbmV3bGluZSAqLwotICAgIGZmbHVzaChzdGRlcnIpOwotCi0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotI2VuZGlmIC8qIERPU19PUzJfVzMyICovCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svd3JpdGVwbmcuYyBiL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay93cml0ZXBuZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmQ4MWVhLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9ncmVnYm9vay93cml0ZXBuZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHdwbmcgLSBzaW1wbGUgUE5HLXdyaXRpbmcgcHJvZ3JhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVwbmcuYwotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBHcmVnIFJvZWxvZnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCi0gICAgICBleHByZXNzIG9yIGltcGxpZWQuICBJbiBubyBldmVudCBzaGFsbCB0aGUgYXV0aG9yIG9yIGNvbnRyaWJ1dG9ycwotICAgICAgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgaW4gYW55IHdheSBmcm9tIHRoZSB1c2Ugb2YKLSAgICAgIHRoaXMgc29mdHdhcmUuCi0KLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIERVQUwtTElDRU5TRUQuICBZb3UgbWF5IG1vZGlmeSBhbmQvb3IKLSAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQotICAgICAgZm9sbG93aW5nIHR3byBsaWNlbnNlcyAoYXQgeW91ciBvcHRpb24pOgotCi0KLSAgICAgIExJQ0VOU0UgMSAoIkJTRC1saWtlIHdpdGggYWR2ZXJ0aXNpbmcgY2xhdXNlIik6Ci0KLSAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICAgICAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZQotICAgICAgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMuCi0gICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YS0KLSAgICAgICAgIHRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAgICAgICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotCi0gICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcwotICAgICAgICAgICAgYW5kIGNvbnRyaWJ1dG9ycyBmb3IgdGhlIGJvb2ssICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlLCIKLSAgICAgICAgICAgIHB1Ymxpc2hlZCBieSBPJ1JlaWxseSBhbmQgQXNzb2NpYXRlcy4KLQotCi0gICAgICBMSUNFTlNFIDIgKEdOVSBHUEwgdjIgb3IgbGF0ZXIpOgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgICAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4gICAgIC8qIGZvciBleGl0KCkgcHJvdG90eXBlICovCi0KLSNpbmNsdWRlICJwbmcuaCIgICAgICAgIC8qIGxpYnBuZyBoZWFkZXI7IGluY2x1ZGVzIHpsaWIuaCBhbmQgc2V0am1wLmggKi8KLSNpbmNsdWRlICJ3cml0ZXBuZy5oIiAgIC8qIHR5cGVkZWZzLCBjb21tb24gbWFjcm9zLCBwdWJsaWMgcHJvdG90eXBlcyAqLwotCi0KLS8qIGxvY2FsIHByb3RvdHlwZSAqLwotCi1zdGF0aWMgdm9pZCB3cml0ZXBuZ19lcnJvcl9oYW5kbGVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBtc2cpOwotCi0KLQotdm9pZCB3cml0ZXBuZ192ZXJzaW9uX2luZm8odm9pZCkKLXsKLSAgZnByaW50ZihzdGRlcnIsICIgICBDb21waWxlZCB3aXRoIGxpYnBuZyAlczsgdXNpbmcgbGlicG5nICVzLlxuIiwKLSAgICBQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIHBuZ19saWJwbmdfdmVyKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICBDb21waWxlZCB3aXRoIHpsaWIgJXM7IHVzaW5nIHpsaWIgJXMuXG4iLAotICAgIFpMSUJfVkVSU0lPTiwgemxpYl92ZXJzaW9uKTsKLX0KLQotCi0KLQotLyogcmV0dXJucyAwIGZvciBzdWNjZXNzLCAyIGZvciBsaWJwbmcgcHJvYmxlbSwgNCBmb3Igb3V0IG9mIG1lbW9yeSwgMTEgZm9yCi0gKiAgdW5leHBlY3RlZCBwbm10eXBlOyBub3RlIHRoYXQgb3V0ZmlsZSBtaWdodCBiZSBzdGRvdXQgKi8KLQotaW50IHdyaXRlcG5nX2luaXQobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKQotewotICAgIHBuZ19zdHJ1Y3RwICBwbmdfcHRyOyAgICAgICAvKiBub3RlOiAgdGVtcG9yYXJ5IHZhcmlhYmxlcyEgKi8KLSAgICBwbmdfaW5mb3AgIGluZm9fcHRyOwotICAgIGludCBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZTsKLQotCi0gICAgLyogY291bGQgYWxzbyByZXBsYWNlIGxpYnBuZyB3YXJuaW5nLWhhbmRsZXIgKGZpbmFsIE5VTEwpLCBidXQgbm8gbmVlZDogKi8KLQotICAgIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIG1haW5wcm9nX3B0ciwKLSAgICAgIHdyaXRlcG5nX2Vycm9yX2hhbmRsZXIsIE5VTEwpOwotICAgIGlmICghcG5nX3B0cikKLSAgICAgICAgcmV0dXJuIDQ7ICAgLyogb3V0IG9mIG1lbW9yeSAqLwotCi0gICAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOwotICAgIGlmICghaW5mb19wdHIpIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuIDQ7ICAgLyogb3V0IG9mIG1lbW9yeSAqLwotICAgIH0KLQotCi0gICAgLyogc2V0am1wKCkgbXVzdCBiZSBjYWxsZWQgaW4gZXZlcnkgZnVuY3Rpb24gdGhhdCBjYWxscyBhIFBORy13cml0aW5nCi0gICAgICogbGlicG5nIGZ1bmN0aW9uLCB1bmxlc3MgYW4gYWx0ZXJuYXRlIGVycm9yIGhhbmRsZXIgd2FzIGluc3RhbGxlZC0tCi0gICAgICogYnV0IGNvbXBhdGlibGUgZXJyb3IgaGFuZGxlcnMgbXVzdCBlaXRoZXIgdXNlIGxvbmdqbXAoKSB0aGVtc2VsdmVzCi0gICAgICogKGFzIGluIHRoaXMgcHJvZ3JhbSkgb3IgZXhpdCBpbW1lZGlhdGVseSwgc28gaGVyZSB3ZSBnbzogKi8KLQotICAgIGlmIChzZXRqbXAobWFpbnByb2dfcHRyLT5qbXBidWYpKSB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0KLSAgICAvKiBtYWtlIHN1cmUgb3V0ZmlsZSBpcyAocmUpb3BlbmVkIGluIEJJTkFSWSBtb2RlICovCi0KLSAgICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBtYWlucHJvZ19wdHItPm91dGZpbGUpOwotCi0KLSAgICAvKiBzZXQgdGhlIGNvbXByZXNzaW9uIGxldmVscy0taW4gZ2VuZXJhbCwgYWx3YXlzIHdhbnQgdG8gbGVhdmUgZmlsdGVyaW5nCi0gICAgICogdHVybmVkIG9uIChleGNlcHQgZm9yIHBhbGV0dGUgaW1hZ2VzKSBhbmQgYWxsb3cgYWxsIG9mIHRoZSBmaWx0ZXJzLAotICAgICAqIHdoaWNoIGlzIHRoZSBkZWZhdWx0OyB3YW50IDMySyB6bGliIHdpbmRvdywgdW5sZXNzIGVudGlyZSBpbWFnZSBidWZmZXIKLSAgICAgKiBpcyAxNksgb3Igc21hbGxlciAodW5rbm93biBoZXJlKS0tYWxzbyB0aGUgZGVmYXVsdDsgdXN1YWxseSB3YW50IG1heAotICAgICAqIGNvbXByZXNzaW9uIChOT1QgdGhlIGRlZmF1bHQpOyBhbmQgcmVtYWluaW5nIGNvbXByZXNzaW9uIGZsYWdzIHNob3VsZAotICAgICAqIGJlIGxlZnQgYWxvbmUgKi8KLQotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwocG5nX3B0ciwgWl9CRVNUX0NPTVBSRVNTSU9OKTsKLS8qCi0gICAgPj4gdGhpcyBpcyBkZWZhdWx0IGZvciBubyBmaWx0ZXJpbmc7IFpfRklMVEVSRUQgaXMgZGVmYXVsdCBvdGhlcndpc2U6Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneShwbmdfcHRyLCBaX0RFRkFVTFRfU1RSQVRFR1kpOwotICAgID4+IHRoZXNlIGFyZSBhbGwgZGVmYXVsdHM6Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwocG5nX3B0ciwgOCk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyhwbmdfcHRyLCAxNSk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QocG5nX3B0ciwgOCk7Ci0gKi8KLQotCi0gICAgLyogc2V0IHRoZSBpbWFnZSBwYXJhbWV0ZXJzIGFwcHJvcHJpYXRlbHkgKi8KLQotICAgIGlmIChtYWlucHJvZ19wdHItPnBubXR5cGUgPT0gNSkKLSAgICAgICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX0dSQVk7Ci0gICAgZWxzZSBpZiAobWFpbnByb2dfcHRyLT5wbm10eXBlID09IDYpCi0gICAgICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0I7Ci0gICAgZWxzZSBpZiAobWFpbnByb2dfcHRyLT5wbm10eXBlID09IDgpCi0gICAgICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE7Ci0gICAgZWxzZSB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKLSAgICAgICAgcmV0dXJuIDExOwotICAgIH0KLQotICAgIGludGVybGFjZV90eXBlID0gbWFpbnByb2dfcHRyLT5pbnRlcmxhY2VkPyBQTkdfSU5URVJMQUNFX0FEQU03IDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9OT05FOwotCi0gICAgcG5nX3NldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCBtYWlucHJvZ19wdHItPndpZHRoLCBtYWlucHJvZ19wdHItPmhlaWdodCwKLSAgICAgIG1haW5wcm9nX3B0ci0+c2FtcGxlX2RlcHRoLCBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZSwKLSAgICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0RFRkFVTFQsIFBOR19GSUxURVJfVFlQRV9ERUZBVUxUKTsKLQotICAgIGlmIChtYWlucHJvZ19wdHItPmdhbW1hID4gMC4wKQotICAgICAgICBwbmdfc2V0X2dBTUEocG5nX3B0ciwgaW5mb19wdHIsIG1haW5wcm9nX3B0ci0+Z2FtbWEpOwotCi0gICAgaWYgKG1haW5wcm9nX3B0ci0+aGF2ZV9iZykgeyAgIC8qIHdlIGtub3cgaXQncyBSR0JBLCBub3QgZ3JheSthbHBoYSAqLwotICAgICAgICBwbmdfY29sb3JfMTYgIGJhY2tncm91bmQ7Ci0KLSAgICAgICAgYmFja2dyb3VuZC5yZWQgPSBtYWlucHJvZ19wdHItPmJnX3JlZDsKLSAgICAgICAgYmFja2dyb3VuZC5ncmVlbiA9IG1haW5wcm9nX3B0ci0+YmdfZ3JlZW47Ci0gICAgICAgIGJhY2tncm91bmQuYmx1ZSA9IG1haW5wcm9nX3B0ci0+YmdfYmx1ZTsKLSAgICAgICAgcG5nX3NldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCAmYmFja2dyb3VuZCk7Ci0gICAgfQotCi0gICAgaWYgKG1haW5wcm9nX3B0ci0+aGF2ZV90aW1lKSB7Ci0gICAgICAgIHBuZ190aW1lICBtb2R0aW1lOwotCi0gICAgICAgIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90KCZtb2R0aW1lLCBtYWlucHJvZ19wdHItPm1vZHRpbWUpOwotICAgICAgICBwbmdfc2V0X3RJTUUocG5nX3B0ciwgaW5mb19wdHIsICZtb2R0aW1lKTsKLSAgICB9Ci0KLSAgICBpZiAobWFpbnByb2dfcHRyLT5oYXZlX3RleHQpIHsKLSAgICAgICAgcG5nX3RleHQgIHRleHRbNl07Ci0gICAgICAgIGludCAgbnVtX3RleHQgPSAwOwotCi0gICAgICAgIGlmIChtYWlucHJvZ19wdHItPmhhdmVfdGV4dCAmIFRFWFRfVElUTEUpIHsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORTsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmtleSA9ICJUaXRsZSI7Ci0gICAgICAgICAgICB0ZXh0W251bV90ZXh0XS50ZXh0ID0gbWFpbnByb2dfcHRyLT50aXRsZTsKLSAgICAgICAgICAgICsrbnVtX3RleHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1haW5wcm9nX3B0ci0+aGF2ZV90ZXh0ICYgVEVYVF9BVVRIT1IpIHsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORTsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmtleSA9ICJBdXRob3IiOwotICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0udGV4dCA9IG1haW5wcm9nX3B0ci0+YXV0aG9yOwotICAgICAgICAgICAgKytudW1fdGV4dDsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFpbnByb2dfcHRyLT5oYXZlX3RleHQgJiBURVhUX0RFU0MpIHsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORTsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmtleSA9ICJEZXNjcmlwdGlvbiI7Ci0gICAgICAgICAgICB0ZXh0W251bV90ZXh0XS50ZXh0ID0gbWFpbnByb2dfcHRyLT5kZXNjOwotICAgICAgICAgICAgKytudW1fdGV4dDsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFpbnByb2dfcHRyLT5oYXZlX3RleHQgJiBURVhUX0NPUFkpIHsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORTsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmtleSA9ICJDb3B5cmlnaHQiOwotICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0udGV4dCA9IG1haW5wcm9nX3B0ci0+Y29weXJpZ2h0OwotICAgICAgICAgICAgKytudW1fdGV4dDsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFpbnByb2dfcHRyLT5oYXZlX3RleHQgJiBURVhUX0VNQUlMKSB7Ci0gICAgICAgICAgICB0ZXh0W251bV90ZXh0XS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7Ci0gICAgICAgICAgICB0ZXh0W251bV90ZXh0XS5rZXkgPSAiRS1tYWlsIjsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLnRleHQgPSBtYWlucHJvZ19wdHItPmVtYWlsOwotICAgICAgICAgICAgKytudW1fdGV4dDsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFpbnByb2dfcHRyLT5oYXZlX3RleHQgJiBURVhUX1VSTCkgewotICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FOwotICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0ua2V5ID0gIlVSTCI7Ci0gICAgICAgICAgICB0ZXh0W251bV90ZXh0XS50ZXh0ID0gbWFpbnByb2dfcHRyLT51cmw7Ci0gICAgICAgICAgICArK251bV90ZXh0OwotICAgICAgICB9Ci0gICAgICAgIHBuZ19zZXRfdGV4dChwbmdfcHRyLCBpbmZvX3B0ciwgdGV4dCwgbnVtX3RleHQpOwotICAgIH0KLQotCi0gICAgLyogd3JpdGUgYWxsIGNodW5rcyB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIGZpcnN0IElEQVQgKi8KLQotICAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotCi0gICAgLyogaWYgd2Ugd2FudGVkIHRvIHdyaXRlIGFueSBtb3JlIHRleHQgaW5mbyAqYWZ0ZXIqIHRoZSBpbWFnZSBkYXRhLCB3ZQotICAgICAqIHdvdWxkIHNldCB1cCB0ZXh0IHN0cnVjdChzKSBoZXJlIGFuZCBjYWxsIHBuZ19zZXRfdGV4dCgpIGFnYWluLCB3aXRoCi0gICAgICoganVzdCB0aGUgbmV3IGRhdGE7IHBuZ19zZXRfdElNRSgpIGNvdWxkIGFsc28gZ28gaGVyZSwgYnV0IGl0IHdvdWxkCi0gICAgICogaGF2ZSBubyBlZmZlY3Qgc2luY2Ugd2UgYWxyZWFkeSBjYWxsZWQgaXQgYWJvdmUgKG9ubHkgb25lIHRJTUUgY2h1bmsKLSAgICAgKiBhbGxvd2VkKSAqLwotCi0KLSAgICAvKiBzZXQgdXAgdGhlIHRyYW5zZm9ybWF0aW9uczogIGZvciBub3csIGp1c3QgcGFjayBsb3ctYml0LWRlcHRoIHBpeGVscwotICAgICAqIGludG8gYnl0ZXMgKG9uZSwgdHdvIG9yIGZvdXIgcGl4ZWxzIHBlciBieXRlKSAqLwotCi0gICAgcG5nX3NldF9wYWNraW5nKHBuZ19wdHIpOwotLyogIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgJnNpZ19iaXQpOyAgdG8gc2NhbGUgbG93LWJpdC1kZXB0aCB2YWx1ZXMgKi8KLQotCi0gICAgLyogbWFrZSBzdXJlIHdlIHNhdmUgb3VyIHBvaW50ZXJzIGZvciB1c2UgaW4gd3JpdGVwbmdfZW5jb2RlX2ltYWdlKCkgKi8KLQotICAgIG1haW5wcm9nX3B0ci0+cG5nX3B0ciA9IHBuZ19wdHI7Ci0gICAgbWFpbnByb2dfcHRyLT5pbmZvX3B0ciA9IGluZm9fcHRyOwotCi0KLSAgICAvKiBPSywgdGhhdCdzIGFsbCB3ZSBuZWVkIHRvIGRvIGZvciBub3c7IHJldHVybiBoYXBweSAqLwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLQotLyogcmV0dXJucyAwIGZvciBzdWNjZXNzLCAyIGZvciBsaWJwbmcgKGxvbmdqbXApIHByb2JsZW0gKi8KLQotaW50IHdyaXRlcG5nX2VuY29kZV9pbWFnZShtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIpCi17Ci0gICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IChwbmdfc3RydWN0cCltYWlucHJvZ19wdHItPnBuZ19wdHI7Ci0gICAgcG5nX2luZm9wIGluZm9fcHRyID0gKHBuZ19pbmZvcCltYWlucHJvZ19wdHItPmluZm9fcHRyOwotCi0KLSAgICAvKiBhcyBhbHdheXMsIHNldGptcCgpIG11c3QgYmUgY2FsbGVkIGluIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgY2FsbHMgYQotICAgICAqIFBORy13cml0aW5nIGxpYnBuZyBmdW5jdGlvbiAqLwotCi0gICAgaWYgKHNldGptcChtYWlucHJvZ19wdHItPmptcGJ1ZikpIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIpOwotICAgICAgICBtYWlucHJvZ19wdHItPnBuZ19wdHIgPSBOVUxMOwotICAgICAgICBtYWlucHJvZ19wdHItPmluZm9fcHRyID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0KLSAgICAvKiBhbmQgbm93IHdlIGp1c3Qgd3JpdGUgdGhlIHdob2xlIGltYWdlOyBsaWJwbmcgdGFrZXMgY2FyZSBvZiBpbnRlcmxhY2luZwotICAgICAqIGZvciB1cyAqLwotCi0gICAgcG5nX3dyaXRlX2ltYWdlKHBuZ19wdHIsIG1haW5wcm9nX3B0ci0+cm93X3BvaW50ZXJzKTsKLQotCi0gICAgLyogc2luY2UgdGhhdCdzIGl0LCB3ZSBhbHNvIGNsb3NlIG91dCB0aGUgZW5kIG9mIHRoZSBQTkcgZmlsZSBub3ctLWlmIHdlCi0gICAgICogaGFkIGFueSB0ZXh0IG9yIHRpbWUgaW5mbyB0byB3cml0ZSBhZnRlciB0aGUgSURBVHMsIHNlY29uZCBhcmd1bWVudAotICAgICAqIHdvdWxkIGJlIGluZm9fcHRyLCBidXQgd2Ugb3B0aW1pemUgc2xpZ2h0bHkgYnkgc2VuZGluZyBOVUxMIHBvaW50ZXI6ICovCi0KLSAgICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIE5VTEwpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLQotLyogcmV0dXJucyAwIGlmIHN1Y2NlZWRzLCAyIGlmIGxpYnBuZyBwcm9ibGVtICovCi0KLWludCB3cml0ZXBuZ19lbmNvZGVfcm93KG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cikgIC8qIE5PTi1pbnRlcmxhY2VkIG9ubHkhICovCi17Ci0gICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IChwbmdfc3RydWN0cCltYWlucHJvZ19wdHItPnBuZ19wdHI7Ci0gICAgcG5nX2luZm9wIGluZm9fcHRyID0gKHBuZ19pbmZvcCltYWlucHJvZ19wdHItPmluZm9fcHRyOwotCi0KLSAgICAvKiBhcyBhbHdheXMsIHNldGptcCgpIG11c3QgYmUgY2FsbGVkIGluIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgY2FsbHMgYQotICAgICAqIFBORy13cml0aW5nIGxpYnBuZyBmdW5jdGlvbiAqLwotCi0gICAgaWYgKHNldGptcChtYWlucHJvZ19wdHItPmptcGJ1ZikpIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIpOwotICAgICAgICBtYWlucHJvZ19wdHItPnBuZ19wdHIgPSBOVUxMOwotICAgICAgICBtYWlucHJvZ19wdHItPmluZm9fcHRyID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0KLSAgICAvKiBpbWFnZV9kYXRhIHBvaW50cyBhdCBvdXIgb25lIHJvdyBvZiBpbWFnZSBkYXRhICovCi0KLSAgICBwbmdfd3JpdGVfcm93KHBuZ19wdHIsIG1haW5wcm9nX3B0ci0+aW1hZ2VfZGF0YSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLQotCi0vKiByZXR1cm5zIDAgaWYgc3VjY2VlZHMsIDIgaWYgbGlicG5nIHByb2JsZW0gKi8KLQotaW50IHdyaXRlcG5nX2VuY29kZV9maW5pc2gobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKSAgIC8qIE5PTi1pbnRlcmxhY2VkISAqLwotewotICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSAocG5nX3N0cnVjdHApbWFpbnByb2dfcHRyLT5wbmdfcHRyOwotICAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IChwbmdfaW5mb3ApbWFpbnByb2dfcHRyLT5pbmZvX3B0cjsKLQotCi0gICAgLyogYXMgYWx3YXlzLCBzZXRqbXAoKSBtdXN0IGJlIGNhbGxlZCBpbiBldmVyeSBmdW5jdGlvbiB0aGF0IGNhbGxzIGEKLSAgICAgKiBQTkctd3JpdGluZyBsaWJwbmcgZnVuY3Rpb24gKi8KLQotICAgIGlmIChzZXRqbXAobWFpbnByb2dfcHRyLT5qbXBidWYpKSB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKLSAgICAgICAgbWFpbnByb2dfcHRyLT5wbmdfcHRyID0gTlVMTDsKLSAgICAgICAgbWFpbnByb2dfcHRyLT5pbmZvX3B0ciA9IE5VTEw7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotCi0gICAgLyogY2xvc2Ugb3V0IFBORyBmaWxlOyBpZiB3ZSBoYWQgYW55IHRleHQgb3IgdGltZSBpbmZvIHRvIHdyaXRlIGFmdGVyCi0gICAgICogdGhlIElEQVRzLCBzZWNvbmQgYXJndW1lbnQgd291bGQgYmUgaW5mb19wdHI6ICovCi0KLSAgICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIE5VTEwpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLQotdm9pZCB3cml0ZXBuZ19jbGVhbnVwKG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cikKLXsKLSAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gKHBuZ19zdHJ1Y3RwKW1haW5wcm9nX3B0ci0+cG5nX3B0cjsKLSAgICBwbmdfaW5mb3AgaW5mb19wdHIgPSAocG5nX2luZm9wKW1haW5wcm9nX3B0ci0+aW5mb19wdHI7Ci0KLSAgICBpZiAocG5nX3B0ciAmJiBpbmZvX3B0cikKLSAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIpOwotfQotCi0KLQotCi0KLXN0YXRpYyB2b2lkIHdyaXRlcG5nX2Vycm9yX2hhbmRsZXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1zZykKLXsKLSAgICBtYWlucHJvZ19pbmZvICAqbWFpbnByb2dfcHRyOwotCi0gICAgLyogVGhpcyBmdW5jdGlvbiwgYXNpZGUgZnJvbSB0aGUgZXh0cmEgc3RlcCBvZiByZXRyaWV2aW5nIHRoZSAiZXJyb3IKLSAgICAgKiBwb2ludGVyIiAoYmVsb3cpIGFuZCB0aGUgZmFjdCB0aGF0IGl0IGV4aXN0cyB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uCi0gICAgICogcmF0aGVyIHRoYW4gd2l0aGluIGxpYnBuZywgaXMgZXNzZW50aWFsbHkgaWRlbnRpY2FsIHRvIGxpYnBuZydzCi0gICAgICogZGVmYXVsdCBlcnJvciBoYW5kbGVyLiAgVGhlIHNlY29uZCBwb2ludCBpcyBjcml0aWNhbDogIHNpbmNlIGJvdGgKLSAgICAgKiBzZXRqbXAoKSBhbmQgbG9uZ2ptcCgpIGFyZSBjYWxsZWQgZnJvbSB0aGUgc2FtZSBjb2RlLCB0aGV5IGFyZQotICAgICAqIGd1YXJhbnRlZWQgdG8gaGF2ZSBjb21wYXRpYmxlIG5vdGlvbnMgb2YgaG93IGJpZyBhIGptcF9idWYgaXMsCi0gICAgICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIF9CU0RfU09VUkNFIG9yIGFueXRoaW5nIGVsc2UgaGFzIChvciBoYXMgbm90KQotICAgICAqIGJlZW4gZGVmaW5lZC4gKi8KLQotICAgIGZwcmludGYoc3RkZXJyLCAid3JpdGVwbmcgbGlicG5nIGVycm9yOiAlc1xuIiwgbXNnKTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLQotICAgIG1haW5wcm9nX3B0ciA9IHBuZ19nZXRfZXJyb3JfcHRyKHBuZ19wdHIpOwotICAgIGlmIChtYWlucHJvZ19wdHIgPT0gTlVMTCkgeyAgICAgICAgIC8qIHdlIGFyZSBjb21wbGV0ZWx5IGhvc2VkIG5vdyAqLwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAid3JpdGVwbmcgc2V2ZXJlIGVycm9yOiAgam1wYnVmIG5vdCByZWNvdmVyYWJsZTsgdGVybWluYXRpbmcuXG4iKTsKLSAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgICAgIGV4aXQoOTkpOwotICAgIH0KLQotICAgIGxvbmdqbXAobWFpbnByb2dfcHRyLT5qbXBidWYsIDEpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL2dyZWdib29rL3dyaXRlcG5nLmggYi9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svd3JpdGVwbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiOTY2Yi4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svd3JpdGVwbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICB3cG5nIC0gc2ltcGxlIFBORy13cml0aW5nIHByb2dyYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlcG5nLmgKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDcgR3JlZyBSb2Vsb2ZzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMsIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLAotICAgICAgZXhwcmVzcyBvciBpbXBsaWVkLiAgSW4gbm8gZXZlbnQgc2hhbGwgdGhlIGF1dGhvciBvciBjb250cmlidXRvcnMKLSAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCi0gICAgICB0aGlzIHNvZnR3YXJlLgotCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCi0gICAgICByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIG9uZSBvZiB0aGUKLSAgICAgIGZvbGxvd2luZyB0d28gbGljZW5zZXMgKGF0IHlvdXIgb3B0aW9uKToKLQotCi0gICAgICBMSUNFTlNFIDEgKCJCU0QtbGlrZSB3aXRoIGFkdmVydGlzaW5nIGNsYXVzZSIpOgotCi0gICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgICAgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUKLSAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgotICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGEtCi0gICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gICAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLQotICAgICAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBHcmVnIFJvZWxvZnMKLSAgICAgICAgICAgIGFuZCBjb250cmlidXRvcnMgZm9yIHRoZSBib29rLCAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiCi0gICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCi0KLQotICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICAgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBUUlVFCi0jICBkZWZpbmUgVFJVRSAxCi0jICBkZWZpbmUgRkFMU0UgMAotI2VuZGlmCi0KLSNpZm5kZWYgTUFYCi0jICBkZWZpbmUgTUFYKGEsYikgICgoYSkgPiAoYik/IChhKSA6IChiKSkKLSMgIGRlZmluZSBNSU4oYSxiKSAgKChhKSA8IChiKT8gKGEpIDogKGIpKQotI2VuZGlmCi0KLSNpZmRlZiBERUJVRwotIyAgZGVmaW5lIFRyYWNlKHgpICB7ZnByaW50ZiB4IDsgZmZsdXNoKHN0ZGVycik7IGZmbHVzaChzdGRvdXQpO30KLSNlbHNlCi0jICBkZWZpbmUgVHJhY2UoeCkgIDsKLSNlbmRpZgotCi0jZGVmaW5lIFRFWFRfVElUTEUgICAgMHgwMQotI2RlZmluZSBURVhUX0FVVEhPUiAgIDB4MDIKLSNkZWZpbmUgVEVYVF9ERVNDICAgICAweDA0Ci0jZGVmaW5lIFRFWFRfQ09QWSAgICAgMHgwOAotI2RlZmluZSBURVhUX0VNQUlMICAgIDB4MTAKLSNkZWZpbmUgVEVYVF9VUkwgICAgICAweDIwCi0KLSNkZWZpbmUgVEVYVF9USVRMRV9PRkZTRVQgICAgICAgIDAKLSNkZWZpbmUgVEVYVF9BVVRIT1JfT0ZGU0VUICAgICAgNzIKLSNkZWZpbmUgVEVYVF9DT1BZX09GRlNFVCAgICAgKDIqNzIpCi0jZGVmaW5lIFRFWFRfRU1BSUxfT0ZGU0VUICAgICgzKjcyKQotI2RlZmluZSBURVhUX1VSTF9PRkZTRVQgICAgICAoNCo3MikKLSNkZWZpbmUgVEVYVF9ERVNDX09GRlNFVCAgICAgKDUqNzIpCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVjaDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVzaDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIHVsZzsKLQotdHlwZWRlZiBzdHJ1Y3QgX21haW5wcm9nX2luZm8gewotICAgIGRvdWJsZSBnYW1tYTsKLSAgICBsb25nIHdpZHRoOwotICAgIGxvbmcgaGVpZ2h0OwotICAgIHRpbWVfdCBtb2R0aW1lOwotICAgIEZJTEUgKmluZmlsZTsKLSAgICBGSUxFICpvdXRmaWxlOwotICAgIHZvaWQgKnBuZ19wdHI7Ci0gICAgdm9pZCAqaW5mb19wdHI7Ci0gICAgdWNoICppbWFnZV9kYXRhOwotICAgIHVjaCAqKnJvd19wb2ludGVyczsKLSAgICBjaGFyICp0aXRsZTsKLSAgICBjaGFyICphdXRob3I7Ci0gICAgY2hhciAqZGVzYzsKLSAgICBjaGFyICpjb3B5cmlnaHQ7Ci0gICAgY2hhciAqZW1haWw7Ci0gICAgY2hhciAqdXJsOwotICAgIGludCBmaWx0ZXI7ICAgIC8qIGNvbW1hbmQtbGluZS1maWx0ZXIgZmxhZywgbm90IFBORyByb3cgZmlsdGVyISAqLwotICAgIGludCBwbm10eXBlOwotICAgIGludCBzYW1wbGVfZGVwdGg7Ci0gICAgaW50IGludGVybGFjZWQ7Ci0gICAgaW50IGhhdmVfYmc7Ci0gICAgaW50IGhhdmVfdGltZTsKLSAgICBpbnQgaGF2ZV90ZXh0OwotICAgIGptcF9idWYgam1wYnVmOwotICAgIHVjaCBiZ19yZWQ7Ci0gICAgdWNoIGJnX2dyZWVuOwotICAgIHVjaCBiZ19ibHVlOwotfSBtYWlucHJvZ19pbmZvOwotCi0KLS8qIHByb3RvdHlwZXMgZm9yIHB1YmxpYyBmdW5jdGlvbnMgaW4gd3JpdGVwbmcuYyAqLwotCi12b2lkIHdyaXRlcG5nX3ZlcnNpb25faW5mbyh2b2lkKTsKLQotaW50IHdyaXRlcG5nX2luaXQobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKTsKLQotaW50IHdyaXRlcG5nX2VuY29kZV9pbWFnZShtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIpOwotCi1pbnQgd3JpdGVwbmdfZW5jb2RlX3JvdyhtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIpOwotCi1pbnQgd3JpdGVwbmdfZW5jb2RlX2ZpbmlzaChtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIpOwotCi12b2lkIHdyaXRlcG5nX2NsZWFudXAobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKTsKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9kZWNvZGVyL1JFQURNRSBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9kZWNvZGVyL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY1NmUwYi4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZGVjb2Rlci9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVRoaXMgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgUE5HX1VTRVJfQ09ORklHIGFuZCBwbmd1c3IuaAotCi1UbyBidWlsZCBhIG1pbmltYWwgcmVhZC1vbmx5IGRlY29kZXIgd2l0aCBlbWJlZGRlZCBsaWJwbmcgYW5kIHpsaWIsIHJ1bgotCi0gICAgZ2F0aGVyLnNoICAjIHRvIGNvbGxlY3QgbmVlZGVkIGZpbGVzIGZyb20gcG5nbWludXMsIGxpYnBuZywgYW5kIHpsaWIKLSAgICBtYWtlCi0KLUlmIHlvdSBwcmVmZXIgdG8gdXNlIHRoZSBzaGFyZWQgbGlicmFyaWVzLCBnbyB0byBjb250cmliL3BuZ21pbnVzCi1hbmQgYnVpbGQgdGhlIHBuZzJwbm0gYXBwbGljYXRpb24gdGhlcmUuIApkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbmltL2RlY29kZXIvZ2F0aGVyLnNoIGIvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbmltL2RlY29kZXIvZ2F0aGVyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZWIxZDY3Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9kZWNvZGVyL2dhdGhlci5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMhL2Jpbi9zaAotCi1jcCAuLi8uLi9wbmdtaW51cy9wbmcycG5tLmMgcG5nbTJwbm0uYwotY3AgLi4vLi4vLi4vKi5oIC4KLWNwIC4uLy4uLy4uLyouYyAuCi1ybSBleGFtcGxlLmMgcG5ndGVzdC5jIHBuZ3ByZWFkLmMgcG5ndyouYwotIyBjaGFuZ2UgdGhlIGZvbGxvd2luZyAyIGxpbmVzIGlmIHpsaWIgaXMgc29tZXdoZXJlIGVsc2UKLWNwIC4uLy4uLy4uLy4uL3psaWIvKi5oIC4KLWNwIC4uLy4uLy4uLy4uL3psaWIvKi5jIC4KLXJtIG1pbmlnemlwLmMgZXhhbXBsZS5jIGNvbXByZXNzLmMgZGVmbGF0ZS5jIGd6KgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbmltL2RlY29kZXIvbWFrZWZpbGUgYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZGVjb2Rlci9tYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTllOTY0Ni4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZGVjb2Rlci9tYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIFBuZ01pbnVzIChwbmdtMnBubSkKLSMgTGludXggLyBVbml4Ci0KLSNDQz1jYwotQ0M9Z2NjCi1MRD0kKENDKQotCi1STT1ybSAtZgotCi1DRkxBR1M9LURQTkdfVVNFUl9DT05GSUcgLUROT19HWkNPTVBSRVNTIC1ETk9fR1pJUCBcCi0gICAgICAgLURkZWZsYXRlUGFyYW1zXChhLGIsY1wpPVpfT0sgLUkuIC1PMQotCi1DPS5jCi1PPS5vCi1MPS5hCi1FPQotCi1aT0JKUyAgPSBhZGxlcjMyJChPKSBjcmMzMiQoTykgXAotCSBpbmZiYWNrJChPKSBpbmZmYXN0JChPKSBpbmZsYXRlJChPKSBpbmZ0cmVlcyQoTykgXAotCSB0cmVlcyQoTykgdW5jb21wciQoTykgenV0aWwkKE8pCi0KLU9CSlMgID0gcG5nbTJwbm0kKE8pIHBuZyQoTykgcG5nZXJyb3IkKE8pIHBuZ2dldCQoTykgcG5nbWVtJChPKSBcCi0JcG5ncmVhZCQoTykgcG5ncmlvJChPKSBwbmdydHJhbiQoTykgcG5ncnV0aWwkKE8pIFwKLQlwbmdzZXQkKE8pIHBuZ3RyYW5zJChPKSAgJChaT0JKUykKLQotIyBpbXBsaWNpdCBtYWtlIHJ1bGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLmMkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oIHBuZ3Vzci5oIHpsaWIuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkPAotCi0jIGRlcGVuZGVuY2llcwotCi1hbGw6IHBuZ20ycG5tJChFKQotCi1wbmdtMnBubSQoRSk6ICQoT0JKUykKLQkkKExEKSAtbyBwbmdtMnBubSQoRSkgJChPQkpTKQotCi1jbGVhbjoKLQkkKFJNKSBwbmdtMnBubSQoTykKLQkkKFJNKSBwbmdtMnBubSQoRSkKLQkkKFJNKSAkKE9CSlMpCi0KLSMgRW5kIG9mIG1ha2VmaWxlIGZvciBwbmdtMnBubQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbmltL2RlY29kZXIvcG5ndXNyLmggYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZGVjb2Rlci9wbmd1c3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IyYzBjNS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZGVjb2Rlci9wbmd1c3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qIG1pbnJkcG5nY29uZi5oOiBoZWFkZXJzIHRvIG1ha2UgYSBtaW5pbWFsIHBuZy1yZWFkLW9ubHkgbGlicmFyeQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSAqCi0gKiBEZXJpdmVkIGZyb20gcG5nY3J1c2guaCwgQ29weXJpZ2h0IDE5OTgtMjAwNywgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKi8KLQotI2lmbmRlZiBNSU5SRFBOR0NPTkZfSAotI2RlZmluZSBNSU5SRFBOR0NPTkZfSAotCi0jZGVmaW5lIFBOR19OT19XQVJOSU5HUwotI2RlZmluZSBwbmdfd2FybmluZyhzMSxzMikgIiIKLSNkZWZpbmUgcG5nX2NodW5rX3dhcm5pbmcoczEsczIpICIiCi0jZGVmaW5lIFBOR19OT19FUlJPUl9URVhUCi0jZGVmaW5lIHBuZ19lcnJvcihzMSxzMikgcG5nX2VycihzMSkKLSNkZWZpbmUgcG5nX2NodW5rX2Vycm9yKHMxLHMyKSBwbmdfZXJyKHMxKQotCi0jZGVmaW5lIFBOR19OT19SRUFEX0JHUgotI2RlZmluZSBQTkdfTk9fUkVBRF9HQU1NQQotI2RlZmluZSBQTkdfTk9fUkVBRF9CQUNLR1JPVU5ECi0jZGVmaW5lIFBOR19OT19SRUFEX1FVQU5USVpFCi0jZGVmaW5lIFBOR19OT19SRUFEX0lOVkVSVAotI2RlZmluZSBQTkdfTk9fUkVBRF9TSElGVAotI2RlZmluZSBQTkdfTk9fUkVBRF9QQUNLCi0jZGVmaW5lIFBOR19OT19SRUFEX1BBQ0tTV0FQCi0jZGVmaW5lIFBOR19OT19SRUFEX0ZJTExFUgotI2RlZmluZSBQTkdfTk9fUkVBRF9TV0FQCi0jZGVmaW5lIFBOR19OT19SRUFEX1NXQVBfQUxQSEEKLSNkZWZpbmUgUE5HX05PX1JFQURfSU5WRVJUX0FMUEhBCi0jZGVmaW5lIFBOR19OT19SRUFEX1JHQl9UT19HUkFZCi0jZGVmaW5lIFBOR19OT19SRUFEX1VTRVJfVFJBTlNGT1JNCi0jZGVmaW5lIFBOR19OT19SRUFEX2JLR0QKLSNkZWZpbmUgUE5HX05PX1JFQURfY0hSTQotI2RlZmluZSBQTkdfTk9fUkVBRF9nQU1BCi0jZGVmaW5lIFBOR19OT19SRUFEX2hJU1QKLSNkZWZpbmUgUE5HX05PX1JFQURfaUNDUAotI2RlZmluZSBQTkdfTk9fUkVBRF9vRkZzCi0jZGVmaW5lIFBOR19OT19SRUFEX3BDQUwKLSNkZWZpbmUgUE5HX05PX1JFQURfcEhZcwotI2RlZmluZSBQTkdfTk9fUkVBRF9zQklUCi0jZGVmaW5lIFBOR19OT19SRUFEX3NDQUwKLSNkZWZpbmUgUE5HX05PX1JFQURfc1BMVAotI2RlZmluZSBQTkdfTk9fUkVBRF9zUkdCCi0jZGVmaW5lIFBOR19OT19SRUFEX1RFWFQKLSNkZWZpbmUgUE5HX05PX1JFQURfdElNRQotI2RlZmluZSBQTkdfTk9fUkVBRF9VTktOT1dOX0NIVU5LUwotI2RlZmluZSBQTkdfTk9fUkVBRF9VU0VSX0NIVU5LUwotI2RlZmluZSBQTkdfTk9fUkVBRF9FTVBUWV9QTFRFCi0jZGVmaW5lIFBOR19OT19SRUFEX09QVF9QTFRFCi0jZGVmaW5lIFBOR19OT19SRUFEX1NUUklQX0FMUEhBCi0KLSNkZWZpbmUgUE5HX05PX1dSSVRFX1NVUFBPUlRFRAotCi0jZGVmaW5lIFBOR19OT19JTkZPX0lNQUdFCi0jZGVmaW5lIFBOR19OT19JT19TVEFURQotI2RlZmluZSBQTkdfTk9fVVNFUl9NRU0KLSNkZWZpbmUgUE5HX05PX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfTk9fTU5HX0ZFQVRVUkVTCi0jZGVmaW5lIFBOR19OT19VU0VSX1RSQU5TRk9STV9QVFIKLSNkZWZpbmUgUE5HX05PX0hBTkRMRV9BU19VTktOT1dOCi0jZGVmaW5lIFBOR19OT19DT05TT0xFX0lPCi0jZGVmaW5lIFBOR19OT19aQUxMT0NfWkVSTwotI2RlZmluZSBQTkdfTk9fRVJST1JfTlVNQkVSUwotI2RlZmluZSBQTkdfTk9fRUFTWV9BQ0NFU1MKLSNkZWZpbmUgUE5HX05PX1BST0dSRVNTSVZFX1JFQUQKLSNkZWZpbmUgUE5HX05PX1VTRVJfTElNSVRTCi0jZGVmaW5lIFBOR19OT19TRVRfVVNFUl9MSU1JVFMKLSNkZWZpbmUgUE5HX05PX1RJTUVfUkZDMTEyMwotCi0jZW5kaWYgLyogTUlOUkRQTkdDT05GX0ggKi8KLQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbmltL2VuY29kZXIvUkVBRE1FIGIvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbmltL2VuY29kZXIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjg1NTQ0Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotVGhpcyBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBQTkdfVVNFUl9DT05GSUcgYW5kIHBuZ3Vzci5oCi0KLVRvIGJ1aWxkIGEgbWluaW1hbCB3cml0ZS1vbmx5IGRlY29kZXIgd2l0aCBlbWJlZGRlZCBsaWJwbmcgYW5kIHpsaWIsIHJ1bgotCi0gICAgZ2F0aGVyLnNoICAjIHRvIGNvbGxlY3QgbmVlZGVkIGZpbGVzIGZyb20gcG5nbWludXMsIGxpYnBuZywgYW5kIHpsaWIKLSAgICBtYWtlCi0gCi1JZiB5b3UgcHJlZmVyIHRvIHVzZSB0aGUgc2hhcmVkIGxpYnJhcmllcywgZ28gdG8gY29udHJpYi9wbmdtaW51cwotYW5kIGJ1aWxkIHRoZSBwbm0ycG5nIGFwcGxpY2F0aW9uIHRoZXJlLiAKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL2dhdGhlci5zaCBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL2dhdGhlci5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTljY2ZmYy4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9nYXRoZXIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIS9iaW4vc2gKLQotY3AgLi4vLi4vcG5nbWludXMvcG5tMnBuZy5jIHBubTJwbmdtLmMKLWNwIC4uLy4uLy4uLyouaCAuCi1jcCAuLi8uLi8uLi8qLmMgLgotcm0gZXhhbXBsZS5jIHBuZ3Rlc3QuYyBwbmdyKi5jIHBuZ3ByZWFkLmMKLSMgQ2hhbmdlIHRoZSBuZXh0IDIgbGluZXMgaWYgemxpYiBpcyBzb21ld2hlcmUgZWxzZS4KLWNwIC4uLy4uLy4uLy4uL3psaWIvKi5oIC4KLWNwIC4uLy4uLy4uLy4uL3psaWIvKi5jIC4KLXJtIGluZiouW2NoXQotcm0gdW5jb21wci5jIG1pbmlnemlwLmMgZXhhbXBsZS5jIGd6KgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbmltL2VuY29kZXIvbWFrZWZpbGUgYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9tYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhNzY0Mi4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9tYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIFBuZ01pbnVzIChwbm0ycG5nbSkKLSMgTGludXggLyBVbml4Ci0KLSNDQz1jYwotQ0M9Z2NjCi1MRD0kKENDKQotCi1STT1ybSAtZgotCi1DRkxBR1M9LURQTkdfVVNFUl9DT05GSUcgLUROT19HWklQIC1JLiAtTzEKLQotQz0uYwotTz0ubwotTD0uYQotRT0KLQotWk9CSlMgID0gYWRsZXIzMiQoTykgY29tcHJlc3MkKE8pIGNyYzMyJChPKSBkZWZsYXRlJChPKSBcCi0JIHRyZWVzJChPKSB6dXRpbCQoTykKLQotT0JKUyAgPSBwbm0ycG5nbSQoTykgcG5nJChPKSBwbmdlcnJvciQoTykgcG5nZ2V0JChPKSBwbmdtZW0kKE8pIFwKLQlwbmdzZXQkKE8pIHBuZ3RyYW5zJChPKSBwbmd3aW8kKE8pIHBuZ3dyaXRlJChPKSBcCi0JcG5nd3RyYW4kKE8pIHBuZ3d1dGlsJChPKSAkKFpPQkpTKQotCi0jIGltcGxpY2l0IG1ha2UgcnVsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0uYyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmggcG5ndXNyLmggemxpYi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQ8Ci0KLSMgZGVwZW5kZW5jaWVzCi0KLWFsbDogcG5tMnBuZ20kKEUpCi0KLXBubTJwbmdtJChFKTogJChPQkpTKQotCSQoTEQpIC1vIHBubTJwbmdtJChFKSAkKE9CSlMpCi0KLWNsZWFuOgotCSQoUk0pIHBubTJwbmdtJChPKQotCSQoUk0pIHBubTJwbmdtJChFKQotCSQoUk0pICQoT0JKUykKLQotIyBFbmQgb2YgbWFrZWZpbGUgZm9yIHBubTJwbmdtCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9wbmd1c3IuaCBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL3BuZ3Vzci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NThkZWI0Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL3BuZ3Vzci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyogbWlud3Jwbmdjb25mLmg6IGhlYWRlcnMgdG8gbWFrZSBhIG1pbmltYWwgcG5nLXdyaXRlLW9ubHkgbGlicmFyeQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSAqCi0gKiBEZXJpdmVkIGZyb20gcG5nY3J1c2guaCwgQ29weXJpZ2h0IDE5OTgtMjAwNywgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKi8KLQotI2lmbmRlZiBNSU5XUlBOR0NPTkZfSAotI2RlZmluZSBNSU5XUlBOR0NPTkZfSAotCi0jZGVmaW5lIFBOR19OT19SRUFEX1NVUFBPUlRFRAotCi0jZGVmaW5lIFBOR19OT19XQVJOSU5HUwotI2RlZmluZSBwbmdfd2FybmluZyhzMSxzMikgIiIKLSNkZWZpbmUgcG5nX2NodW5rX3dhcm5pbmcoczEsczIpICIiCi0jZGVmaW5lIFBOR19OT19FUlJPUl9URVhUCi0jZGVmaW5lIHBuZ19lcnJvcihzMSxzMikgcG5nX2VycihzMSkKLSNkZWZpbmUgcG5nX2NodW5rX2Vycm9yKHMxLHMyKSBwbmdfZXJyKHMxKQotCi0jZGVmaW5lIFBOR19OT19XUklURV9CQUNLR1JPVU5ECi0jZGVmaW5lIFBOR19OT19XUklURV9CR1IKLSNkZWZpbmUgUE5HX05PX1dSSVRFX1FVQU5USVpFCi0jZGVmaW5lIFBOR19OT19XUklURV9JTlZFUlQKLSNkZWZpbmUgUE5HX05PX1dSSVRFX1NISUZUCi0jZGVmaW5lIFBOR19OT19XUklURV9QQUNLCi0jZGVmaW5lIFBOR19OT19XUklURV9QQUNLU1dBUAotI2RlZmluZSBQTkdfTk9fV1JJVEVfRklMTEVSCi0jZGVmaW5lIFBOR19OT19XUklURV9TV0FQCi0jZGVmaW5lIFBOR19OT19XUklURV9TV0FQX0FMUEhBCi0jZGVmaW5lIFBOR19OT19XUklURV9JTlZFUlRfQUxQSEEKLSNkZWZpbmUgUE5HX05PX1dSSVRFX1JHQl9UT19HUkFZCi0jZGVmaW5lIFBOR19OT19XUklURV9VU0VSX1RSQU5TRk9STQotI2RlZmluZSBQTkdfTk9fV1JJVEVfYktHRAotI2RlZmluZSBQTkdfTk9fV1JJVEVfY0hSTQotI2RlZmluZSBQTkdfTk9fV1JJVEVfZ0FNQQotI2RlZmluZSBQTkdfTk9fV1JJVEVfaElTVAotI2RlZmluZSBQTkdfTk9fV1JJVEVfaUNDUAotI2RlZmluZSBQTkdfTk9fV1JJVEVfb0ZGcwotI2RlZmluZSBQTkdfTk9fV1JJVEVfcENBTAotI2RlZmluZSBQTkdfTk9fV1JJVEVfcEhZcwotI2RlZmluZSBQTkdfTk9fV1JJVEVfc0JJVAotI2RlZmluZSBQTkdfTk9fV1JJVEVfc0NBTAotI2RlZmluZSBQTkdfTk9fV1JJVEVfc1BMVAotI2RlZmluZSBQTkdfTk9fV1JJVEVfc1JHQgotI2RlZmluZSBQTkdfTk9fV1JJVEVfVEVYVAotI2RlZmluZSBQTkdfTk9fV1JJVEVfdElNRQotI2RlZmluZSBQTkdfTk9fV1JJVEVfVU5LTk9XTl9DSFVOS1MKLSNkZWZpbmUgUE5HX05PX1dSSVRFX1VTRVJfQ0hVTktTCi0jZGVmaW5lIFBOR19OT19XUklURV9FTVBUWV9QTFRFCi0jZGVmaW5lIFBOR19OT19XUklURV9PUFRfUExURQotI2RlZmluZSBQTkdfTk9fV1JJVEVfRklMVEVSCi0jZGVmaW5lIFBOR19OT19XUklURV9XRUlHSFRFRF9GSUxURVIKLSNkZWZpbmUgUE5HX05PX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfTk9fV1JJVEVfRkxVU0gKLQotI2RlZmluZSBQTkdfTk9fSU5GT19JTUFHRQotI2RlZmluZSBQTkdfTk9fSU9fU1RBVEUKLSNkZWZpbmUgUE5HX05PX1VTRVJfTUVNCi0jZGVmaW5lIFBOR19OT19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLSNkZWZpbmUgUE5HX05PX01OR19GRUFUVVJFUwotI2RlZmluZSBQTkdfTk9fVVNFUl9UUkFOU0ZPUk1fUFRSCi0jZGVmaW5lIFBOR19OT19IQU5ETEVfQVNfVU5LTk9XTgotI2RlZmluZSBQTkdfTk9fQ09OU09MRV9JTwotI2RlZmluZSBQTkdfTk9fWkFMTE9DX1pFUk8KLSNkZWZpbmUgUE5HX05PX0VSUk9SX05VTUJFUlMKLSNkZWZpbmUgUE5HX05PX0VBU1lfQUNDRVNTCi0jZGVmaW5lIFBOR19OT19VU0VSX0xJTUlUUwotI2RlZmluZSBQTkdfTk9fU0VUX1VTRVJfTElNSVRTCi0jZGVmaW5lIFBOR19OT19USU1FX1JGQzExMjMKLQotI2VuZGlmIC8qIE1JTldSUE5HQ09ORl9IICovCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9SRUFETUUgYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3N2Q2NDEuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbmltL3ByZWFkZXIvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotVGhpcyBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBQTkdfVVNFUl9DT05GSUcgYW5kIHBuZ3Vzci5oCi0KLVRvIGJ1aWxkIGEgbWluaW1hbCByZWFkLW9ubHkgcHJvZ3Jlc3NpdmUgZGVjb2RlciBlbWJlZGRlZCBsaWJwbmcgYW5kCi16bGliIGFuZCB3aXRoIHlvdXIgc3lzdGVtJ3MgWCBsaWJyYXJ5LCBydW4KLQotICAgIGdhdGhlci5zaCAjIHRvIGNvbGxlY3QgbmVlZGVkIGZpbGVzIGZyb20gZ3JlZ2Jvb2ssIGxpYnBuZywgYW5kIHpsaWIKLQotRWRpdCBtYWtlZmlsZSBpZiByZXF1aXJlZCwgdG8gZmluZCB5b3VyIFggbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcywKLXRoZW4KLSAgICAKLSAgICBtYWtlCi0gCi1JZiB5b3UgcHJlZmVyIHRvIHVzZSB0aGUgc2hhcmVkIGxpYnJhcmllcywgZ28gdG8gY29udHJpYi9ncmVnYm9vawotYW5kIGJ1aWxkIHRoZSBycG5nMi14IGFwcGxpY2F0aW9uIHRoZXJlLiAKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyL2dhdGhlci5zaCBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyL2dhdGhlci5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDIwN2FmNy4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9nYXRoZXIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIS9iaW4vc2gKLQotY3AgLi4vLi4vZ3JlZ2Jvb2svcnBuZzIteC5jIC4uLy4uL2dyZWdib29rL3JlYWRwbmcyLltjaF0gLgotY3AgLi4vLi4vZ3JlZ2Jvb2svQ09QWUlORyAuLi8uLi9ncmVnYm9vay9MSUNFTlNFIC4KLWNwIC4uLy4uLy4uLyouaCAuCi1jcCAuLi8uLi8uLi8qLmMgLgotcm0gZXhhbXBsZS5jIHBuZ3Rlc3QuYyBwbmd3Ki5jCi0jIGNoYW5nZSB0aGUgZm9sbG93aW5nIDIgbGluZXMgaWYgemxpYiBpcyBzb21ld2hlcmUgZWxzZQotY3AgLi4vLi4vLi4vLi4vemxpYi8qLmggLgotY3AgLi4vLi4vLi4vLi4vemxpYi8qLmMgLgotcm0gbWluaWd6aXAuYyBleGFtcGxlLmMgY29tcHJlc3MuYyBkZWZsYXRlLmMgZ3oqCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9tYWtlZmlsZSBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyL21ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWI2ZWJmLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyL21ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgUG5nTWludXMgKHJwbmcyKQotIyBMaW51eCAvIFVuaXgKLQotI0NDPWNjCi1DQz1nY2MKLUxEPSQoQ0MpCi0KLVJNPXJtIC1mCi0KLSNYSU5DID0gLUkvdXNyL2luY2x1ZGUJCQkjIG9sZC1zdHlsZSwgc3RvY2sgWCBkaXN0cmlidXRpb25zCi0jWExJQiA9IC1ML3Vzci9saWIvWDExIC1sWDExCQkjICAoaW5jbHVkaW5nIFNHSSBJUklYKQotCi0jWElOQyA9IC1JL3Vzci9vcGVud2luL2luY2x1ZGUJCSMgU3VuIHdvcmtzdGF0aW9ucyAoT3BlbldpbmRvd3MpCi0jWExJQiA9IC1ML3Vzci9vcGVud2luL2xpYiAtbFgxMQotCi1YSU5DID0gLUkvdXNyL1gxMVI2L2luY2x1ZGUJCSMgbmV3IFggZGlzdHJpYnV0aW9ucyAoWC5vcmcsIGV0Yy4pCi1YTElCID0gLUwvdXNyL1gxMVI2L2xpYiAtbFgxMQotI1hMSUIgPSAtTC91c3IvWDExUjYvbGliNjQgLWxYMTEJIyBlLmcuLCBSZWQgSGF0IG9uIEFNRDY0Ci0KLSNYSU5DID0gLUkvdXNyL2xvY2FsL2luY2x1ZGUgICAJCSMgRnJlZUJTRAotI1hMSUIgPSAtTC91c3IvbG9jYWwvbGliIC1sWDExCi0KLSNMSUJTID0gJChYTElCKQotTElCUyA9ICQoWExJQikgLWxtICAgICAgICAgICAgICAgICAgICAgICNwbGF0Zm9ybXMgdGhhdCBuZWVkIGxpYm0KLQotQ0ZMQUdTPS1EUE5HX1VTRVJfQ09ORklHIC1ETk9fR1pDT01QUkVTUyAtRE5PX0daSVAgXAotICAgICAgIC1EZGVmbGF0ZVBhcmFtc1woYSxiLGNcKT1aX09LIC1JLiAkKFhJTkMpIC1PMQotCi1DPS5jCi1PPS5vCi1MPS5hCi1FPQotCi1aT0JKUyAgPSBhZGxlcjMyJChPKSBjcmMzMiQoTykgXAotCSBpbmZiYWNrJChPKSBpbmZmYXN0JChPKSBpbmZsYXRlJChPKSBpbmZ0cmVlcyQoTykgXAotCSB0cmVlcyQoTykgdW5jb21wciQoTykgenV0aWwkKE8pCi0KLU9CSlMgID0gcnBuZzIteCQoTykgcmVhZHBuZzIkKE8pIHBuZyQoTykgcG5nZXJyb3IkKE8pIHBuZ2dldCQoTykgcG5nbWVtJChPKSBcCi0JcG5ncHJlYWQkKE8pIHBuZ3JlYWQkKE8pIHBuZ3JpbyQoTykgcG5ncnRyYW4kKE8pIHBuZ3J1dGlsJChPKSBcCi0JcG5nc2V0JChPKSBwbmd0cmFucyQoTykgICQoWk9CSlMpCi0KLSMgaW1wbGljaXQgbWFrZSBydWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS5jJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaCByZWFkcG5nMi5oIHBuZ3Vzci5oIHpsaWIuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkPAotCi0jIGRlcGVuZGVuY2llcwotCi1hbGw6IHJwbmcyLXgkKEUpCi0KLXJwbmcyLXgkKEUpOiAkKE9CSlMpCi0JJChMRCkgLW8gcnBuZzIteCQoRSkgJChPQkpTKSAkKExJQlMpCi0KLWNsZWFuOgotCSQoUk0pIHJwbmcyLXgkKE8pCi0JJChSTSkgcnBuZzIteCQoRSkKLQkkKFJNKSAkKE9CSlMpCi0KLSMgRW5kIG9mIG1ha2VmaWxlIGZvciBycG5nMi14CmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9wbmd1c3IuaCBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyL3BuZ3Vzci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmM1ZTQ4Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyL3BuZ3Vzci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyogbWlucmRwbmdjb25mLmg6IGhlYWRlcnMgdG8gbWFrZSBhIG1pbmltYWwgcG5nLXJlYWQtb25seSBsaWJyYXJ5Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA5IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICoKLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0gKiBhbmQgbGljZW5zZSBpbiBwbmcuaAotICoKLSAqIERlcml2ZWQgZnJvbSBwbmdjcnVzaC5oLCBDb3B5cmlnaHQgMTk5OC0yMDA3LCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqLwotCi0jaWZuZGVmIE1JTlBSRFBOR0NPTkZfSAotI2RlZmluZSBNSU5QUkRQTkdDT05GX0gKLQotI2RlZmluZSBQTkdfTk9fV0FSTklOR1MKLSNkZWZpbmUgcG5nX3dhcm5pbmcoczEsczIpICIiCi0jZGVmaW5lIHBuZ19jaHVua193YXJuaW5nKHMxLHMyKSAiIgotI2RlZmluZSBQTkdfTk9fRVJST1JfVEVYVAotI2RlZmluZSBwbmdfZXJyb3IoczEsczIpIHBuZ19lcnIoczEpCi0jZGVmaW5lIHBuZ19jaHVua19lcnJvcihzMSxzMikgcG5nX2VycihzMSkKLQotI2RlZmluZSBQTkdfTk9fUkVBRF9CR1IKLSNkZWZpbmUgUE5HX05PX1JFQURfRElUSEVSCi0jZGVmaW5lIFBOR19OT19SRUFEX0lOVkVSVAotI2RlZmluZSBQTkdfTk9fUkVBRF9TSElGVAotI2RlZmluZSBQTkdfTk9fUkVBRF9QQUNLCi0jZGVmaW5lIFBOR19OT19SRUFEX1BBQ0tTV0FQCi0jZGVmaW5lIFBOR19OT19SRUFEX0ZJTExFUgotI2RlZmluZSBQTkdfTk9fUkVBRF9TV0FQCi0jZGVmaW5lIFBOR19OT19SRUFEX1NXQVBfQUxQSEEKLSNkZWZpbmUgUE5HX05PX1JFQURfSU5WRVJUX0FMUEhBCi0jZGVmaW5lIFBOR19OT19SRUFEX1JHQl9UT19HUkFZCi0jZGVmaW5lIFBOR19OT19SRUFEX1VTRVJfVFJBTlNGT1JNCi0jZGVmaW5lIFBOR19OT19SRUFEX2NIUk0KLSNkZWZpbmUgUE5HX05PX1JFQURfaElTVAotI2RlZmluZSBQTkdfTk9fUkVBRF9pQ0NQCi0jZGVmaW5lIFBOR19OT19SRUFEX29GRnMKLSNkZWZpbmUgUE5HX05PX1JFQURfcENBTAotI2RlZmluZSBQTkdfTk9fUkVBRF9wSFlzCi0jZGVmaW5lIFBOR19OT19SRUFEX3NCSVQKLSNkZWZpbmUgUE5HX05PX1JFQURfc0NBTAotI2RlZmluZSBQTkdfTk9fUkVBRF9zUExUCi0jZGVmaW5lIFBOR19OT19SRUFEX1RFWFQKLSNkZWZpbmUgUE5HX05PX1JFQURfdElNRQotI2RlZmluZSBQTkdfTk9fUkVBRF9VTktOT1dOX0NIVU5LUwotI2RlZmluZSBQTkdfTk9fUkVBRF9VU0VSX0NIVU5LUwotI2RlZmluZSBQTkdfTk9fUkVBRF9FTVBUWV9QTFRFCi0jZGVmaW5lIFBOR19OT19SRUFEX09QVF9QTFRFCi0jZGVmaW5lIFBOR19OT19SRUFEX1NUUklQX0FMUEhBCi0KLSNkZWZpbmUgUE5HX05PX1dSSVRFX1NVUFBPUlRFRAotCi0jZGVmaW5lIFBOR19OT19JTkZPX0lNQUdFCi0jZGVmaW5lIFBOR19OT19JT19TVEFURQotI2RlZmluZSBQTkdfTk9fVVNFUl9NRU0KLSNkZWZpbmUgUE5HX05PX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfTk9fTU5HX0ZFQVRVUkVTCi0jZGVmaW5lIFBOR19OT19VU0VSX1RSQU5TRk9STV9QVFIKLSNkZWZpbmUgUE5HX05PX0hBTkRMRV9BU19VTktOT1dOCi0jZGVmaW5lIFBOR19OT19DT05TT0xFX0lPCi0jZGVmaW5lIFBOR19OT19aQUxMT0NfWkVSTwotI2RlZmluZSBQTkdfTk9fRVJST1JfTlVNQkVSUwotI2RlZmluZSBQTkdfTk9fRUFTWV9BQ0NFU1MKLSNkZWZpbmUgUE5HX05PX1VTRVJfTElNSVRTCi0jZGVmaW5lIFBOR19OT19TRVRfVVNFUl9MSU1JVFMKLSNkZWZpbmUgUE5HX05PX1RJTUVfUkZDMTEyMwotCi0jZW5kaWYgLyogTUlOUFJEUE5HQ09ORl9IICovCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvUkVBRE1FIGIvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlNzQwNy4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLVBuZ01pbnVzCi0tLS0tLS0tLQotKGNvcHlyaWdodCBXaWxsZW0gdmFuIFNjaGFpaywgMTk5OSkKLQotCi1MaWNlbnNlCi0tLS0tLS0tCi0KLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCi1pdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAotcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKLXRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi1zdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0Ci1leHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0KLQotU29tZSBoaXN0b3J5Ci0tLS0tLS0tLS0tLS0KLVNvb24gYWZ0ZXIgdGhlIGNyZWF0aW9uIG9mIFBORyBpbiAxOTk1LCB0aGUgbmVlZCB3YXMgZmVsdCBmb3IgYSBzZXQgb2YKLXBubXRvcG5nIC8gcG5ndG9wbm0gdXRpbGl0aWVzLiBJbmRlcGVuZGFudGx5IEFsZXhhbmRlciBMZWhtYW5uIGFuZCBJCi0oV2lsbGVtIHZhbiBTY2hhaWspIHN0YXJ0ZWQgc3VjaCBhIHByb2plY3QuIEx1Y2tpbHkgd2UgZGlzY292ZXJlZCB0aGlzCi1hbmQgbWVyZ2VkIHRoZSB0d28gdG9nZXRoZXIgaW50byBwbm10b3BuZy50YXIuZ3osIHdoaWNoIGlzIGF2YWlsYWJsZQotZnJvbSBhL28gZnRwOi8vZnRwLnNpbXBsZXN5c3RlbXMub3JnL3B1Yi9saWJwbmcvcG5nLy4KLQotVGhlc2UgdHdvIHV0aWxpdGllcyBoYXZlIG1hbnksIG1hbnkgb3B0aW9ucyBhbmQgbWFrZSB1c2Ugb2YgbW9zdCBvZiB0aGUKLWZlYXR1cmVzIG9mIFBORywgbGlrZSBnYW1tYSwgYWxwaGEsIHNiaXQsIHRleHQtY2h1bmtzLCBldGMuIFRoaXMgbWFrZXMKLXRoZSB1dGlsaXRpZXMgcXVpdGUgY29tcGxleCBhbmQgYnkgbm93IG5vdCBhbnltb3JlIHZlcnkgbWFpbnRhaW5hYmxlLgotV2hlbiB3ZSB3cm90ZSB0aGVzZSBwcm9ncmFtcywgbGlicG5nIHdhcyBzdGlsbCBpbiBhbiBlYXJseSBzdGFnZS4KLVRoZXJlZm9yZSwgbG90cyBvZiB0aGUgZnVuY3Rpb25hbGl0eSB0aGF0IHdlIHB1dCBpbiBvdXIgc29mdHdhcmUgY2FuIG5vdwotYmUgZG9uZSB1c2luZyB0cmFuc2Zvcm0tZnVuY3Rpb25zIGluIGxpYnBuZy4KLQotRmluYWxseSwgdG8gY29tcGlsZSB0aGVzZSBwcm9ncmFtcywgeW91IG5lZWQgdG8gaGF2ZSBpbnN0YWxsZWQgYW5kCi1jb21waWxlZCB0aHJlZSBsaWJyYXJpZXM6IGxpYnBuZywgemxpYiBhbmQgbmV0cGJtLiBFc3BlY2lhbGx5IHRoZSBsYXR0ZXIKLW1ha2VzIHRoZSB3aG9sZSBzZXR1cCBhIGJpdCBidWxreS4gQnV0IHRoYXQncyB1bmF2b2lkYWJsZSBnaXZlbiB0aGUgbWFueQotZmVhdHVyZXMgb2YgcG5tdG9wbmcuCi0KLQotV2hhdCBub3cKLS0tLS0tLS0tCi1BdCB0aGlzIG1vbWVudCBsaWJwbmcgaXMgaW4gYSB2ZXJ5IHN0YWJsZSBzdGF0ZSBhbmQgY2FuIGRvIG11Y2ggb2YgdGhlCi13b3JrIGRvbmUgaW4gcG5tdG9wbmcuIEFsc28sIHBubXRvcG5nIG5lZWRzIHRvIGJlIHVwZ3JhZGVkIHRvIHRoZSBuZXcKLWludGVyZmFjZSBvZiBsaWJwbmcuIEhlbmNlLCBpdCBpcyB0aW1lIGZvciBhIHJld3JpdGUgZnJvbSB0aGUgZ3JvdW5kIHVwCi1vZiBwbm10b3BuZyBhbmQgcG5ndG9wbm0uIFRoaXMgd2lsbCBoYXBwZW4gaW4gdGhlIG5lYXIgZnV0dXJlIChzdGF5Ci10dW5lZCkuIFRoZSBuZXcgcGFja2FnZSB3aWxsIGdldCBhIGRpZmZlcmVudCBuYW1lIHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20KLXRoZSBvbGQgb25lOiBQbmdQbHVzLgotCi1UbyBleHBlcmltZW50IGEgYml0IHdpdGggdGhlIG5ldyBpbnRlcmZhY2Ugb2YgbGlicG5nLCBJIHN0YXJ0ZWQgb2ZmIHdpdGgKLWEgc21hbGwgcHJvdG90eXBlIHRoYXQgY29udGFpbnMgb25seSB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eS4gSXQgZG9lc24ndAotaGF2ZSBhbnkgb2YgdGhlIG9wdGlvbnMgdG8gcmVhZCBvciB3cml0ZSBzcGVjaWFsIGNodW5rcyBhbmQgaXQgd2lsbCBkbwotbm8gZ2FtbWEgY29ycmVjdGlvbi4gQnV0IHRoaXMgbWFrZXMgaXQgYWxzbyBhIHNpbXBsZSBwcm9ncmFtIHRoYXQgaXMKLXF1aXRlIGVhc3kgdG8gdW5kZXJzdGFuZCBhbmQgY2FuIHNlcnZlIHdlbGwgYXMgYSB0ZW1wbGF0ZSBmb3Igb3RoZXIKLXNvZnR3YXJlIGRldmVsb3BtZW50cy4gKEJ5IG5vdyB0aGVyZSBhcmUgb2YgY291cnNlIGEgY291cGxlIG9mIHByb2dyYW1zLAotbGlrZSBHcmVnIFJvZWxvZnMnIHJwbmcvd3BuZywgdGhhdCBjYW4gYmUgdXNlZCBqdXN0IGFzIGdvb2QuKQotCi0KLUNhbiBhbmQgY2FuIG5vdAotLS0tLS0tLS0tLS0tLS0tCi1BcyB0aGlzIGlzIHRoZSBzbWFsbCBicm90aGVyIG9mIHRoZSBmdXR1cmUgUG5nUGx1cywgSSBjYWxsZWQgdGhpcyBmZWxsb3cKLVBuZ01pbnVzLiBCZWNhdXNlIEkgc3RhcnRlZCB0aGlzIGRldmVsb3BtZW50IGluIGdvb2Qtb2xkIFR1cmJvLUMsIEkKLWF2b2lkZWQgdGhlIHVzZSB0aGUgbmV0cGJtIGxpYnJhcnksIHdoaWNoIHJlcXVpcmVzIERPUyBleHRlbmRlcnMuIEFnYWluLAotYW5vdGhlciByZWFzb24gdG8gY2FsbCBpdCBQbmdNaW51cyAobWludXMgbmV0cGJtIDotKS4gU28sIHBhcnQgb2YgdGhlCi1wcm9ncmFtIGFyZSBzb21lIGVsZW1lbnRhcnkgcm91dGluZXMgdG8gcmVhZCAvIHdyaXRlIHBnbS0gYW5kIHBwbS1maWxlcy4KLUl0IGRvZXMgbm90IHJlYWQgYiZ3IHBibS1maWxlcy4KLQotVGhlIGRvd25zaWRlIG9mIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCB5b3UgY2FuIG5vdCB1c2UgdGhlbSBvbiBpbWFnZXMKLXRoYXQgcmVxdWlyZSBibG9ja3Mgb2YgbWVtb3J5IGJpZ2dlciB0aGFuIDY0ayAodGhlIERPUyB2ZXJzaW9uKS4gRm9yCi1sYXJnZXIgaW1hZ2VzIHlvdSB3aWxsIGdldCBhbiBvdXQtb2YtbWVtb3J5IGVycm9yLgotCi1BcyBzYWlkIGJlZm9yZSwgUG5nTWludXMgZG9lc24ndCBjb3JyZWN0IGZvciBnYW1tYS4gV2hlbiByZWFkaW5nCi1wbmctZmlsZXMgeW91IGNhbiBkbyB0aGlzIGp1c3QgYXMgd2VsbCBieSBwaXBpbmcgdGhlIG91dHB1dCBvZiBwbmcycG5tCi10byBwbm1nYW1tYSwgb25lIG9mIHRoZSBzdGFuZGFyZCBQYm1QbHVzIHRvb2xzLiBUaGlzIHNhbWUgc2NlbmFyaW8gd2lsbAotbW9zdCBwcm9iYWJseSBhbHNvIGJlIGZvbGxvd2VkIGluIHRoZSBmdWxsLWJsb3duIGZ1dHVyZSBQbmdQbHVzLCB3aXRoCi10aGUgYWRkaXRpb24gb2YgY291cnNlIG9mIHRoZSBwb3NzaWJpbGl0eSB0byBjcmVhdGUgZ2FtbWEtY2h1bmtzIHdoZW4KLXdyaXRpbmcgcG5nLWZpbGVzLgotCi1PbiB0aGUgb3RoZXIgaGFuZCBpdCBzdXBwb3J0cyBhbHBoYS1jaGFubmVscy4gV2hlbiByZWFkaW5nIGEgcG5nLWltYWdlCi15b3UgY2FuIHdyaXRlIHRoZSBhbHBoYS1jaGFubmVsIGludG8gYSBwZ20tZmlsZS4gQW5kIHdoZW4gY3JlYXRpbmcgYW4KLVJHQitBIHBuZy1pbWFnZSwgeW91IGp1c3QgY29tYmluZSBhIHBwbS1maWxlIHdpdGggYSBjb3JyZXNwb25kaW5nCi1wZ20tZmlsZSBjb250YWluaW5nIHRoZSBhbHBoYS1jaGFubmVsLiBXaGVuIHJlYWRpbmcsIHRyYW5zcGFyZW5jeSBjaHVua3MKLWFyZSBjb252ZXJ0ZWQgaW50byBhbiBhbHBoYS1jaGFubmVsIGFuZCBmcm9tIHRoZXJlIG9uIHRyZWF0ZWQgdGhlIHNhbWUKLXdheS4KLQotRmluYWxseSB5b3UgY2FuIG9wdCBmb3Igd3JpdGluZyBhc2NpaSBvciBiaW5hcnkgcGdtLSBhbmQgcHBtLWZpbGVzLiBXaGVuCi10aGUgYml0LWRlcHRoIGlzIDE2LCB0aGUgZm9ybWF0IHdpbGwgYWx3YXlzIGJlIGFzY2lpLgotCi0KLVVzaW5nIGl0Ci0tLS0tLS0tLQotVG8gZGlzdGluZ3Vpc2ggdGhlbSBmcm9tIHBubXRvcG5nIGFuZCBQbmdQbHVzLCB0aGUgdXRpbGl0aWVzIGFyZSBuYW1lZAotcG5nMnBubSBhbmQgcG5tMnBuZyAoMiBpbnN0ZWFkIG9mIHRvKS4gVGhlIGlucHV0LSBhbmQgb3V0cHV0LWZpbGVzIGNhbgotYmUgZ2l2ZW4gYXMgcGFyYW1ldGVycyBvciB0aHJvdWdoIHJlZGlyZWN0aW9uLiBUaGVyZWZvcmUgdGhlIHByb2dyYW1zCi1jYW4gYmUgcGFydCBvZiBhIHBpcGUuCi0KLVRvIGxpc3QgdGhlIG9wdGlvbnMgdHlwZSAicG5nMnBubSAtaCIgb3IgInBubTJwbmcgLWgiLgotCi0KLUp1c3QgbGlrZSBTY2FuZGluYXZpYW4gZnVybml0dXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWW91IGhhdmUgdG8gcHV0IGl0IHRvZ2V0aGVyIHlvdXJzZWxmLiBJIGRpZCB0ZXN0IHRoZSBzb2Z0d2FyZSB1bmRlcgotTVMtRE9TIHdpdGggVHVyYm8tQyAzLjAgYW5kIHVuZGVyIFJlZEhhdCBMaW51eCA0LjIgd2l0aCBnY2MuIEluIGJvdGgKLWNhc2VzIEkgdXNlZCBsaWJwbmctMS4wLjQgYW5kIHpsaWItMS4xLjMuIExhdGVyIHZlcnNpb25zIHNob3VsZCBiZSBPSywKLWhvd2V2ZXIgc29tZSBvbGRlciBsaWJwbmcgdmVyc2lvbnMgaGF2ZSBhIGJ1ZyBpbiBwbmdtZW0uYyB3aGVuIHVzaW5nCi1UdXJiby1DIDMuMCAoc2VlIGJlbG93KS4KLQotWW91IGNhbiBidWlsZCBpdCB1c2luZyBvbmUgb2YgdGhlIHR3byBtYWtlZmlsZXMgKG1ha2UgLWYgbWFrZWZpbGUuIyMjKQotb3IgdXNlIHRoZSBiYXRjaC9zY3JpcHQgZmlsZXMgcG5nbWludXMuYmF0IC8gcG5nbWludXMuc2guIFRoaXMgYXNzdW1lcwotdGhhdCB5b3UgaGF2ZSBidWlsdCB0aGUgbGlicmFyaWVzIGluIC4uL2xpYnBuZyBhbmQgLi4vemxpYi4gVXNpbmcgTGludXgsCi1tYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBidWlsdCBsaWJwbmcgd2l0aCBtYWtlZmlsZS5zdGQgYW5kIG5vdAotbWFrZWZpbGUubGludXggKGFsc28gY2FsbGVkIC5sbnggaW4gZWFybGllciB2ZXJzaW9ucyBvZiBsaWJwbmcpLiBUaGUKLWxhdHRlciBjcmVhdGVzIGEgLnNvIHNoYXJlZC1saWJyYXJ5LCB3aGlsZSB0aGUgUG5nTWludXMgbWFrZWZpbGUgYXNzdW1lcwotYSBub3JtYWwgLmEgc3RhdGljIGxpYnJhcnkuCi0KLUlmIHlvdSBjcmVhdGUgYSAuLi9wbmdzdWl0ZSBkaXJlY3RvcnkgYW5kIHRoZW4gc3RvcmUgdGhlIGJhc24jIyMjLnBuZwotZmlsZXMgZnJvbSBQbmdTdWl0ZSAoaHR0cDovL3d3dy5zY2hhaWsuY29tL3BuZ3N1aXRlLykgaW4gdGhlcmUsIHlvdSBjYW4KLXRlc3QgaW4gb25lIGdvIHRoZSBwcm9wZXIgZnVuY3Rpb25pbmcgb2YgUG5nTWludXMsIHNlZSBwbmcycG5tLmJhdCBhbmQKLXBubTJwbmcuYmF0IChvciB0aGUgLnNoIHZlcnNpb25zKS4KLQotCi1XYXJyYW50eQotLS0tLS0tLQotUGxlYXNlLCByZW1lbWJlciB0aGF0IHRoaXMgd2FzIGp1c3QgYSBzbWFsbCBleHBlcmltZW50IHRvIGxlYXJuIGEgZmV3Ci10aGluZ3MuIEl0IHdpbGwgaGF2ZSBtYW55IHVuZm9yZXNlZW4gZmVhdHVyZXMgPHZiZz4uIFdobyBzYWlkIGJ1Z3M/IFVzZQotaXQgd2hlbiB5b3UgYXJlIGluIG5lZWQgZm9yIHNvbWV0aGluZyBzaW1wbGUgb3Igd2hlbiB5b3Ugd2FudCB0byBzdGFydAotZGV2ZWxvcGluZyB5b3VyIG93biBzdHVmZi4KLQotCi1UaGUgVHVyYm8gYnVnCi0tLS0tLS0tLS0tLS0tCi0qKiBwbmdtZW0ub2xkCi0gICAgICAgICAgaHB0ciA9IChwbmdfYnl0ZSBodWdlICopKChsb25nKShocHRyKSAmIDB4ZmZmZmZmZjBMKTsKLSAgICAgICAgICBocHRyICs9IDE2TDsKLSoqIHBuZ21lbS5jCi0gICAgICAgICAgaHB0ciA9IChwbmdfYnl0ZSBodWdlICopKChsb25nKShocHRyKSAmIDB4ZmZmZmZmZjBMKTsKLSAgICAgICAgICBocHRyID0gaHB0ciArIDE2TDsKLSoqCi0KLSoqIHBuZ21lbS5vbGQKLSAgICAgICAgICBwbmdfcHRyLT5vZmZzZXRfdGFibGVfcHRyW2ldID0gKHBuZ19ieXRlcClocHRyOwotICAgICAgICAgIGhwdHIgKz0gKHBuZ191aW50XzMyKTY1NTM2TDsKLSoqIHBuZ21lbS5jCi0gICAgICAgICAgcG5nX3B0ci0+b2Zmc2V0X3RhYmxlX3B0cltpXSA9IChwbmdfYnl0ZXApaHB0cjsKLSAgICAgICAgICBocHRyID0gaHB0ciArIDY1NTM2TDsKLSoqCi0KLQotVGhlIGVuZAotLS0tLS0tLQotV2lsbGVtIHZhbiBTY2hhaWsKLW1haWx0bzp3aWxsZW1Ac2NoYWlrLmNvbQotaHR0cDovL3d3dy5zY2hhaWsuY29tL3BuZy8KLS0tLS0tLS0KLU9jdCAxOTk5Ci0KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9tYWtlZmlsZS5zdGQgYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvbWFrZWZpbGUuc3RkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODBhNDRjLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9tYWtlZmlsZS5zdGQKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBQbmdNaW51cyAocG5nMnBubSBhbmQgcG5tMnBuZykKLSMgTGludXggLyBVbml4Ci0KLSNDQz1jYwotQ0M9Z2NjCi1MRD0kKENDKQotCi1STT1ybSAtZgotCi0jUE5HUEFUSCA9IC91c3IvbG9jYWwKLSNQTkdJTkMgPSAtSSQoUE5HUEFUSCkvaW5jbHVkZS9saWJwbmcxNAotI1BOR0xJQiA9IC1MJChQTkdQQVRIKS9saWIgLWxwbmcxNAotI1BOR0xJQlMgPSAkKFBOR1BBVEgpL2xpYi9saWJwbmcxNC5hCi1QTkdJTkMgPSAtSS4uLy4uCi1QTkdMSUIgPSAtTC4uLy4uIC1scG5nCi1QTkdMSUJTID0gLi4vLi4vbGlicG5nLmEKLQotI1pQQVRIID0gL3Vzci9sb2NhbAotI1pJTkMgPSAtSSQoWlBBVEgpL2luY2x1ZGUKLSNaTElCID0gLUwkKFpQQVRIKS9saWIgLWx6Ci0jWkxJQlMgPSAkKFpQQVRIKS9saWIvbGliei5hCi1aSU5DID0gLUkuLi8uLi8uLi96bGliCi1aTElCID0gLUwuLi8uLi8uLi96bGliIC1segotWkxJQlMgPSAuLi8uLi8uLi96bGliL2xpYnouYQotCi1DRkxBR1M9JChQTkdJTkMpICQoWklOQykKLUxETElCUz0kKFBOR0xJQikgJChaTElCKQotTERMSUJTUz0kKFBOR0xJQlMpICQoWkxJQlMpCi1DPS5jCi1PPS5vCi1MPS5hCi1FPQotCi0jIGRlcGVuZGVuY2llcwotCi0jYWxsOiBwbmcycG5tJChFKSBwbm0ycG5nJChFKQotYWxsOiBwbmcycG5tJChFKSBwbm0ycG5nJChFKSBwbmcycG5tLXN0YXRpYyQoRSkgcG5tMnBuZy1zdGF0aWMkKEUpCi0KLXBuZzJwbm0kKE8pOiBwbmcycG5tJChDKQotCSQoQ0MpIC1jICQoQ0ZMQUdTKSBwbmcycG5tJChDKQotCi1wbmcycG5tJChFKTogcG5nMnBubSQoTykKLQkkKExEKSAkKExERkxBR1MpIC1vIHBuZzJwbm0kKEUpIHBuZzJwbm0kKE8pICQoTERMSUJTKSAtbG0KLQotcG5nMnBubS1zdGF0aWMkKEUpOiBwbmcycG5tJChPKQotCSQoTEQpICQoTERGTEFHUykgLW8gcG5nMnBubS1zdGF0aWMkKEUpIHBuZzJwbm0kKE8pICQoTERMSUJTUykgLWxtCi0KLXBubTJwbmckKE8pOiBwbm0ycG5nJChDKQotCSQoQ0MpIC1jICQoQ0ZMQUdTKSBwbm0ycG5nJChDKQotCi1wbm0ycG5nJChFKTogcG5tMnBuZyQoTykKLQkkKExEKSAkKExERkxBR1MpIC1vIHBubTJwbmckKEUpIHBubTJwbmckKE8pICQoTERMSUJTKSAtbG0KLQotcG5tMnBuZy1zdGF0aWMkKEUpOiBwbm0ycG5nJChPKQotCSQoTEQpICQoTERGTEFHUykgLW8gcG5tMnBuZy1zdGF0aWMkKEUpIHBubTJwbmckKE8pICQoTERMSUJTUykgLWxtCi0KLWNsZWFuOgotCSQoUk0pIHBuZzJwbm0kKE8pCi0JJChSTSkgcG5tMnBuZyQoTykKLQkkKFJNKSBwbmcycG5tJChFKQotCSQoUk0pIHBubTJwbmckKEUpCi0JJChSTSkgcG5nMnBubS1zdGF0aWMkKEUpCi0JJChSTSkgcG5tMnBuZy1zdGF0aWMkKEUpCi0KLSMgRW5kIG9mIG1ha2VmaWxlIGZvciBwbmcycG5tIC8gcG5tMnBuZwpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL21ha2VmaWxlLnRjMyBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9tYWtlZmlsZS50YzMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNGYxOGQuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL21ha2VmaWxlLnRjMworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIFBuZ01pbnVzIChwbmcycG5tIGFuZCBwbm0ycG5nKQotIyBUdXJib0MrKyAzLjAKLQotQ0M9dGNjIC1JYzpcdGMzXGluYwotTEQ9dGNjIC1MYzpcdGMzXGxpYgotTEI9dGxpYgotUk09ZGVsCi1DUD1jb3B5Ci1NT0RFTD1sCi1DQ0ZMQUdTPS1PIC1tJChNT0RFTCkgLUkuLlxsaWJwbmcgLUkuLlx6bGliCi1MREZMQUdTPS1tJChNT0RFTCkgLUwuLlxsaWJwbmcgLUwuLlx6bGliCi1DPS5jCi1PPS5vYmoKLUw9LmxpYgotRT0uZXhlCi0KLSMgZGVwZW5kZW5jaWVzCi0KLWFsbDogcG5nMnBubSQoRSkgcG5tMnBuZyQoRSkKLQotcG5nMnBubSQoTyk6IHBuZzJwbm0kKEMpCi0gICAgICAgICQoQ0MpIC1jICQoQ0NGTEFHUykgcG5nMnBubSQoQykKLQotcG5nMnBubSQoRSk6IHBuZzJwbm0kKE8pCi0gICAgICAgICQoTEQpICQoTERGTEFHUykgcG5nMnBubSQoTykgbGlicG5nJChMKSB6bGliJChMKQotCi1wbm0ycG5nJChPKTogcG5tMnBuZyQoQykKLSAgICAgICAgJChDQykgLWMgJChDQ0ZMQUdTKSBwbm0ycG5nJChDKQotCi1wbm0ycG5nJChFKTogcG5tMnBuZyQoTykKLSAgICAgICAgJChMRCkgJChMREZMQUdTKSBwbm0ycG5nJChPKSBsaWJwbmckKEwpIHpsaWIkKEwpCi0KLWNsZWFuOgotICAgICAgICAkKFJNKSAqJChPKQotICAgICAgICAkKFJNKSAqJChFKQotCi0jIEVuZCBvZiBtYWtlZmlsZSBmb3IgcG5nMnBubSAvIHBubTJwbmcKLQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL21ha2V2bXMuY29tIGIvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL21ha2V2bXMuY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDU2MWJjLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9tYWtldm1zLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLSQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0kISBtYWtlIENvbnRyaWIgcHJvZ3JhbXMgb2YgbGlicG5nIHVuZGVyIE9wZW5WTVMKLSQhCi0kIQotJCEgTG9vayBmb3IgdGhlIGNvbXBpbGVyIHVzZWQKLSQhCi0kIHpsaWJzcmMgPSAiWy0tLS56bGliXSIKLSQgY2NvcHQ9Ii9pbmNsdWRlPSgnJ3psaWJzcmMnLFstLV0pIgotJCBpZiBmJGdldHN5aSgiSFdfTU9ERUwiKS5nZS4xMDI0Ci0kIHRoZW4KLSQgIGNjb3B0ID0gIi9wcmVmaXg9YWxsIitjY29wdAotJCAgY29tcCAgPSAiX19kZWNjX189MSIKLSQgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIHN5cyRsaWJyYXJ5OgotJCBlbHNlCi0kICBpZiBmJHNlYXJjaCgiU1lTJFNZU1RFTTpERUNDJENPTVBJTEVSLkVYRSIpLmVxcy4iIgotJCAgIHRoZW4KLSQgICAgaWYgZiR0cm5sbm0oIlNZUyIpLmVxcy4iIiB0aGVuIGRlZmluZSBzeXMgc3lzJGxpYnJhcnk6Ci0kICAgIGlmIGYkc2VhcmNoKCJTWVMkU1lTVEVNOlZBWEMuRVhFIikuZXFzLiIiCi0kICAgICB0aGVuCi0kICAgICAgY29tcCAgPSAiX19nY2NfXz0xIgotJCAgICAgIENDIDo9PSBHQ0MKLSQgICAgIGVsc2UKLSQgICAgICBjb21wID0gIl9fdmF4Y19fPTEiCi0kICAgICBlbmRpZgotJCAgIGVsc2UKLSQgICAgaWYgZiR0cm5sbm0oIlNZUyIpLmVxcy4iIiB0aGVuIGRlZmluZSBzeXMgZGVjYyRsaWJyYXJ5X2luY2x1ZGU6Ci0kICAgIGNjb3B0ID0gIi9kZWNjL3ByZWZpeD1hbGwiK2Njb3B0Ci0kICAgIGNvbXAgID0gIl9fZGVjY19fPTEiCi0kICBlbmRpZgotJCBlbmRpZgotJCBvcGVuL3dyaXRlIGxvcHQgbGliLm9wdAotJCB3cml0ZSBsb3B0ICJbLS1dbGlicG5nLm9sYi9saWIiCi0kIHdyaXRlIGxvcHQgIicnemxpYnNyYydsaWJ6Lm9sYi9saWIiCi0kIGNsb3NlIGxvcHQKLSQgb3Blbi93cml0ZSB4b3B0IHgxMS5vcHQKLSQgd3JpdGUgeG9wdCAic3lzJGxpYnJhcnk6ZGVjdyR4bGlic2hyLmV4ZS9zaGFyZSIKLSQgY2xvc2UgeG9wdAotJCB3cml0ZSBzeXMkb3V0cHV0ICJDb21waWxpbmcgUE5HIGNvbnRyaWIgcHJvZ3JhbXMgLi4uIgotJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIHBubTJwbmcuLi4iCi0kICAgQ0FMTCBNQUtFIHBubTJwbmcuT0JKICJjYyAnJ0NDT1BUJyBwbm0ycG5nIiAtCi0JcG5tMnBuZy5jCi0kICAgY2FsbCBtYWtlIHBubTJwbmcuZXhlIC0KLQkiTElOSyBwbm0ycG5nLGxpYi5vcHQvb3B0IiAtCi0JcG5tMnBuZy5vYmoKLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJCdWlsZGluZyBwbmcycG5tLi4uIgotJCAgIENBTEwgTUFLRSBwbmcycG5tLk9CSiAiY2MgJydDQ09QVCcgcG5nMnBubSIgLQotCXBuZzJwbm0uYwotJCAgIGNhbGwgbWFrZSBwbmcycG5tLmV4ZSAtCi0JIkxJTksgcG5nMnBubSxsaWIub3B0L29wdCIgLQotCXBuZzJwbm0ub2JqCi0kIGV4aXQKLSQhCi0kIQotJE1BS0U6IFNVQlJPVVRJTkUgICAhU1VCUk9VVElORSBUTyBDSEVDSyBERVBFTkRFTkNJRVMKLSQgViA9ICdGJFZlcmlmeSgwKQotJCEgUDEgPSBXaGF0IHdlIGFyZSB0cnlpbmcgdG8gbWFrZQotJCEgUDIgPSBDb21tYW5kIHRvIG1ha2UgaXQKLSQhIFAzIC0gUDggIFdoYXQgaXQgZGVwZW5kcyBvbgotJAotJCBJZiBGJFNlYXJjaChQMSkgLkVxcy4gIiIgVGhlbiBHb3RvIE1ha2VpdAotJCBUaW1lID0gRiRDdlRpbWUoRiRGaWxlKFAxLCJSRFQiKSkKLSRhcmc9MwotJExvb3A6Ci0kICAgICAgIEFyZ3VtZW50ID0gUCdhcmcKLSQgICAgICAgSWYgQXJndW1lbnQgLkVxcy4gIiIgVGhlbiBHb3RvIEV4aXQKLSQgICAgICAgRWw9MAotJExvb3AyOgotJCAgICAgICBGaWxlID0gRiRFbGVtZW50KEVsLCIgIixBcmd1bWVudCkKLSQgICAgICAgSWYgRmlsZSAuRXFzLiAiICIgVGhlbiBHb3RvIEVuZGwKLSQgICAgICAgQUZpbGUgPSAiIgotJExvb3AzOgotJCAgICAgICBPRmlsZSA9IEFGaWxlCi0kICAgICAgIEFGaWxlID0gRiRTZWFyY2goRmlsZSkKLSQgICAgICAgSWYgQUZpbGUgLkVxcy4gIiIgLk9yLiBBRmlsZSAuRXFzLiBPRmlsZSBUaGVuIEdvdG8gTmV4dEVsCi0kICAgICAgIElmIEYkQ3ZUaW1lKEYkRmlsZShBRmlsZSwiUkRUIikpIC5HZXMuIFRpbWUgVGhlbiBHb3RvIE1ha2VpdAotJCAgICAgICBHb3RvIExvb3AzCi0kTmV4dEVMOgotJCAgICAgICBFbCA9IEVsICsgMQotJCAgICAgICBHb3RvIExvb3AyCi0kRW5kTDoKLSQgYXJnPWFyZysxCi0kIElmIGFyZyAuTGUuIDggVGhlbiBHb3RvIExvb3AKLSQgR290byBFeGl0Ci0kCi0kTWFrZWl0OgotJCBWVj1GJFZFUklGWSgwKQotJCB3cml0ZSBzeXMkb3V0cHV0IFAyCi0kICdQMgotJCBWVj0nRiRWZXJpZnkoVlYpCi0kRXhpdDoKLSQgSWYgViBUaGVuIFNldCBWZXJpZnkKLSRFTkRTVUJST1VUSU5FCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nMnBubS5iYXQgYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nMnBubS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1YWJlM2MuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BuZzJwbm0uYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotUkVNIC0tIGdyYXlzY2FsZQ0KLXBuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuMGcwMS5wbmcgYmFzbjBnMDEucGdtDQotcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc24wZzAyLnBuZyBiYXNuMGcwMi5wZ20NCi1wbmcycG5tLmV4ZSAtbm9yYXcgLi5ccG5nc3VpdGVcYmFzbjBnMDQucG5nIGJhc24wZzA0LnBnbQ0KLXBuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuMGcwOC5wbmcgYmFzbjBnMDgucGdtDQotcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc24wZzE2LnBuZyBiYXNuMGcxNi5wZ20NCi1SRU0gLS0gZnVsbC1jb2xvcg0KLXBuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuMmMwOC5wbmcgYmFzbjJjMDgucHBtDQotcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc24yYzE2LnBuZyBiYXNuMmMxNi5wcG0NCi1SRU0gLS0gcGFsbGV0dGVkDQotcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc24zcDAxLnBuZyBiYXNuM3AwMS5wcG0NCi1wbmcycG5tLmV4ZSAtbm9yYXcgLi5ccG5nc3VpdGVcYmFzbjNwMDIucG5nIGJhc24zcDAyLnBwbQ0KLXBuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuM3AwNC5wbmcgYmFzbjNwMDQucHBtDQotcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc24zcDA4LnBuZyBiYXNuM3AwOC5wcG0NCi1SRU0gLS0gZ3JheSB3aXRoIGFscGhhLWNoYW5uZWwNCi1wbmcycG5tLmV4ZSAtbm9yYXcgLi5ccG5nc3VpdGVcYmFzbjRhMDgucG5nIGJhc240YTA4LnBnbQ0KLXBuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuNGExNi5wbmcgYmFzbjRhMTYucGdtDQotUkVNIC0tIGNvbG9yIHdpdGggYWxwaGEtY2hhbm5lbA0KLXBuZzJwbm0uZXhlIC1ub3JhdyAtYWxwaGEgYmFzbjZhMDgucGdtIC4uXHBuZ3N1aXRlXGJhc242YTA4LnBuZyBiYXNuNmEwOC5wcG0NCi1wbmcycG5tLmV4ZSAtbm9yYXcgLWFscGhhIGJhc242YTE2LnBnbSAuLlxwbmdzdWl0ZVxiYXNuNmExNi5wbmcgYmFzbjZhMTYucHBtDQotUkVNIC0tIGdyYXlzY2FsZQ0KLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjBnMDEucG5nIHJhd24wZzAxLnBnbQ0KLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjBnMDIucG5nIHJhd24wZzAyLnBnbQ0KLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjBnMDQucG5nIHJhd24wZzA0LnBnbQ0KLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjBnMDgucG5nIHJhd24wZzA4LnBnbQ0KLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjBnMTYucG5nIHJhd24wZzE2LnBnbQ0KLVJFTSAtLSBmdWxsLWNvbG9yDQotcG5nMnBubS5leGUgLXJhdyAuLlxwbmdzdWl0ZVxiYXNuMmMwOC5wbmcgcmF3bjJjMDgucHBtDQotcG5nMnBubS5leGUgLXJhdyAuLlxwbmdzdWl0ZVxiYXNuMmMxNi5wbmcgcmF3bjJjMTYucHBtDQotUkVNIC0tIHBhbGxldHRlZA0KLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjNwMDEucG5nIHJhd24zcDAxLnBwbQ0KLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjNwMDIucG5nIHJhd24zcDAyLnBwbQ0KLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjNwMDQucG5nIHJhd24zcDA0LnBwbQ0KLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjNwMDgucG5nIHJhd24zcDA4LnBwbQ0KLVJFTSAtLSBncmF5IHdpdGggYWxwaGEtY2hhbm5lbA0KLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjRhMDgucG5nIHJhd240YTA4LnBnbQ0KLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjRhMTYucG5nIHJhd240YTE2LnBnbQ0KLVJFTSAtLSBjb2xvciB3aXRoIGFscGhhLWNoYW5uZWwNCi1wbmcycG5tLmV4ZSAtbm9yYXcgLWFscGhhIHJhd242YTA4LnBnbSAuLlxwbmdzdWl0ZVxiYXNuNmEwOC5wbmcgcmF3bjZhMDgucHBtDQotcG5nMnBubS5leGUgLW5vcmF3IC1hbHBoYSByYXduNmExNi5wZ20gLi5ccG5nc3VpdGVcYmFzbjZhMTYucG5nIHJhd242YTE2LnBwbQ0KLQ0KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbmcycG5tLmMgYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nMnBubS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjZmMTQ0Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbmcycG5tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLyoKLSAqICBwbmcycG5tLmMgLS0tIGNvbnZlcnNpb24gZnJvbSBQTkctZmlsZSB0byBQR00vUFBNLWZpbGUKLSAqICBjb3B5cmlnaHQgKEMpIDE5OTkgYnkgV2lsbGVtIHZhbiBTY2hhaWsgPHdpbGxlbUBzY2hhaWsuY29tPgotICoKLSAqICB2ZXJzaW9uIDEuMCAtIDE5OTkuMTAuMTUgLSBGaXJzdCB2ZXJzaW9uLgotICoKLSAqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAotICogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCi0gKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKLSAqICB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotICogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKLSAqICBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWZkZWYgX19UVVJCT0NfXwotI2luY2x1ZGUgPG1lbS5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBCT09MCi0jZGVmaW5lIEJPT0wgdW5zaWduZWQgY2hhcgotI2VuZGlmCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRSAoQk9PTCkgMQotI2VuZGlmCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFIChCT09MKSAwCi0jZW5kaWYKLQotI2lmZGVmIF9fVFVSQk9DX18KLSNkZWZpbmUgU1RESU4gIDAKLSNkZWZpbmUgU1RET1VUIDEKLSNkZWZpbmUgU1RERVJSIDIKLSNlbmRpZgotCi0vKiB0byBtYWtlIHBuZzJwbm0gdmVyYm9zZSBzbyB3ZSBjYW4gZmluZCBwcm9ibGVtcyAobmVlZHMgdG8gYmUgYmVmb3JlIHBuZy5oKSAqLwotI2lmbmRlZiBQTkdfREVCVUcKLSNkZWZpbmUgUE5HX0RFQlVHIDAKLSNlbmRpZgotCi0jaW5jbHVkZSAicG5nLmgiCi0KLS8qIERlZmluZSBwbmdfam1wYnVmKCkgaW4gY2FzZSB3ZSBhcmUgdXNpbmcgYSBwcmUtMS4wLjYgdmVyc2lvbiBvZiBsaWJwbmcgKi8KLSNpZm5kZWYgcG5nX2ptcGJ1ZgotIyAgZGVmaW5lIHBuZ19qbXBidWYocG5nX3B0cikgKChwbmdfcHRyKS0+am1wYnVmKQotI2VuZGlmCi0KLS8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLQotaW50ICBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKTsKLXZvaWQgdXNhZ2UgKCk7Ci1CT09MIHBuZzJwbm0gKEZJTEUgKnBuZ19maWxlLCBGSUxFICpwbm1fZmlsZSwgRklMRSAqYWxwaGFfZmlsZSwgQk9PTCByYXcsIEJPT0wgYWxwaGEpOwotCi0vKgotICogIG1haW4KLSAqLwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBGSUxFICpmcF9yZCA9IHN0ZGluOwotICBGSUxFICpmcF93ciA9IHN0ZG91dDsKLSAgRklMRSAqZnBfYWwgPSBOVUxMOwotICBCT09MIHJhdyA9IFRSVUU7Ci0gIEJPT0wgYWxwaGEgPSBGQUxTRTsKLSAgaW50IGFyZ2k7Ci0KLSAgZm9yIChhcmdpID0gMTsgYXJnaSA8IGFyZ2M7IGFyZ2krKykKLSAgewotICAgIGlmIChhcmd2W2FyZ2ldWzBdID09ICctJykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGFyZ3ZbYXJnaV1bMV0pCi0gICAgICB7Ci0gICAgICAgIGNhc2UgJ24nOgotICAgICAgICAgIHJhdyA9IEZBTFNFOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICByYXcgPSBUUlVFOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdhJzoKLSAgICAgICAgICBhbHBoYSA9IFRSVUU7Ci0gICAgICAgICAgYXJnaSsrOwotICAgICAgICAgIGlmICgoZnBfYWwgPSBmb3BlbiAoYXJndlthcmdpXSwgIndiIikpID09IE5VTEwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUE5NMlBOR1xuIik7Ci0gICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogIGNhbiBub3QgY3JlYXRlIGFscGhhLWNoYW5uZWwgZmlsZSAlc1xuIiwgYXJndlthcmdpXSk7Ci0gICAgICAgICAgICBleGl0ICgxKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2gnOgotICAgICAgICBjYXNlICc/JzoKLSAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgIGV4aXQoMCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUE5HMlBOTVxuIik7Ci0gICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICB1bmtub3duIG9wdGlvbiAlc1xuIiwgYXJndlthcmdpXSk7Ci0gICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfSAvKiBlbmQgc3dpdGNoICovCi0gICAgfQotICAgIGVsc2UgaWYgKGZwX3JkID09IHN0ZGluKQotICAgIHsKLSAgICAgIGlmICgoZnBfcmQgPSBmb3BlbiAoYXJndlthcmdpXSwgInJiIikpID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUE5HMlBOTVxuIik7Ci0gICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogIGZpbGUgJXMgZG9lcyBub3QgZXhpc3RcbiIsIGFyZ3ZbYXJnaV0pOwotICAgICAgICAgICAgZXhpdCAoMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGZwX3dyID09IHN0ZG91dCkKLSAgICB7Ci0gICAgICBpZiAoKGZwX3dyID0gZm9wZW4gKGFyZ3ZbYXJnaV0sICJ3YiIpKSA9PSBOVUxMKQotICAgICAgewotICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJQTkcyUE5NXG4iKTsKLSAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICBjYW4gbm90IGNyZWF0ZSBmaWxlICVzXG4iLCBhcmd2W2FyZ2ldKTsKLSAgICAgICAgZXhpdCAoMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJQTkcyUE5NXG4iKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAgdG9vIG1hbnkgcGFyYW1ldGVyc1xuIik7Ci0gICAgICB1c2FnZSgpOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIH0gLyogZW5kIGZvciAqLwotCi0jaWZkZWYgX19UVVJCT0NfXwotICAvKiBzZXQgc3RkaW4vc3Rkb3V0IGlmIHJlcXVpcmVkIHRvIGJpbmFyeSAqLwotICBpZiAoZnBfcmQgPT0gc3RkaW4pCi0gIHsKLSAgICBzZXRtb2RlIChTVERJTiwgT19CSU5BUlkpOwotICB9Ci0gIGlmICgocmF3KSAmJiAoZnBfd3IgPT0gc3Rkb3V0KSkKLSAgewotICAgIHNldG1vZGUgKFNURE9VVCwgT19CSU5BUlkpOwotICB9Ci0jZW5kaWYKLQotICAvKiBjYWxsIHRoZSBjb252ZXJzaW9uIHByb2dyYW0gaXRzZWxmICovCi0gIGlmIChwbmcycG5tIChmcF9yZCwgZnBfd3IsIGZwX2FsLCByYXcsIGFscGhhKSA9PSBGQUxTRSkKLSAgewotICAgIGZwcmludGYgKHN0ZGVyciwgIlBORzJQTk1cbiIpOwotICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAgdW5zdWNjZXNzZnVsIGNvbnZlcnRpb24gb2YgUE5HLWltYWdlXG4iKTsKLSAgICBleGl0KDEpOwotICB9Ci0KLSAgLyogY2xvc2UgaW5wdXQgZmlsZSAqLwotICBmY2xvc2UgKGZwX3JkKTsKLSAgLyogY2xvc2Ugb3V0cHV0IGZpbGUgKi8KLSAgZmNsb3NlIChmcF93cik7Ci0gIC8qIGNsb3NlIGFscGhhIGZpbGUgKi8KLSAgaWYgKGFscGhhKQotICAgIGZjbG9zZSAoZnBfYWwpOwotCi0gIHJldHVybiAwOwotfQotCi0vKgotICogIHVzYWdlCi0gKi8KLQotdm9pZCB1c2FnZSgpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgIlBORzJQTk1cbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgICBieSBXaWxsZW0gdmFuIFNjaGFpaywgMTk5OVxuIik7Ci0jaWZkZWYgX19UVVJCT0NfXwotICBmcHJpbnRmIChzdGRlcnIsICIgICBmb3IgVHVyYm8tQyBhbmQgQm9ybGFuZC1DIGNvbXBpbGVyc1xuIik7Ci0jZWxzZQotICBmcHJpbnRmIChzdGRlcnIsICIgICBmb3IgTGludXggKGFuZCBVbml4KSBjb21waWxlcnNcbiIpOwotI2VuZGlmCi0gIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOiAgcG5nMnBubSBbb3B0aW9uc10gPGZpbGU+LnBuZyBbPGZpbGU+LnBubV1cbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgICBvcjogIC4uLiB8IHBuZzJwbm0gW29wdGlvbnNdXG4iKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiT3B0aW9uczpcbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgICAtclthd10gICB3cml0ZSBwbm0tZmlsZSBpbiBiaW5hcnkgZm9ybWF0IChQNC9QNS9QNikgKGRlZmF1bHQpXG4iKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiICAgLW5bb3Jhd10gd3JpdGUgcG5tLWZpbGUgaW4gYXNjaWkgZm9ybWF0IChQMS9QMi9QMylcbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgICAtYVtscGhhXSA8ZmlsZT4ucGdtIHdyaXRlIFBORyBhbHBoYSBjaGFubmVsIGFzIHBnbS1maWxlXG4iKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiICAgLWggfCAtPyAgcHJpbnQgdGhpcyBoZWxwLWluZm9ybWF0aW9uXG4iKTsKLX0KLQotLyoKLSAqICBwbmcycG5tCi0gKi8KLQotQk9PTCBwbmcycG5tIChGSUxFICpwbmdfZmlsZSwgRklMRSAqcG5tX2ZpbGUsIEZJTEUgKmFscGhhX2ZpbGUsIEJPT0wgcmF3LCBCT09MIGFscGhhKQotewotICBwbmdfc3RydWN0ICAgICpwbmdfcHRyID0gTlVMTDsKLSAgcG5nX2luZm8JKmluZm9fcHRyID0gTlVMTDsKLSAgcG5nX2J5dGUgICAgICBidWZbOF07Ci0gIHBuZ19ieXRlICAgICAgKnBuZ19waXhlbHMgPSBOVUxMOwotICBwbmdfYnl0ZSAgICAgICoqcm93X3BvaW50ZXJzID0gTlVMTDsKLSAgcG5nX2J5dGUgICAgICAqcGl4X3B0ciA9IE5VTEw7Ci0gIHBuZ191aW50XzMyICAgcm93X2J5dGVzOwotCi0gIHBuZ191aW50XzMyICAgd2lkdGg7Ci0gIHBuZ191aW50XzMyICAgaGVpZ2h0OwotICBpbnQgICAgICAgICAgIGJpdF9kZXB0aDsKLSAgaW50ICAgICAgICAgICBjaGFubmVsczsKLSAgaW50ICAgICAgICAgICBjb2xvcl90eXBlOwotICBpbnQgICAgICAgICAgIGFscGhhX3ByZXNlbnQ7Ci0gIGludCAgICAgICAgICAgcm93LCBjb2w7Ci0gIGludCAgICAgICAgICAgcmV0OwotICBpbnQgICAgICAgICAgIGk7Ci0gIGxvbmcgICAgICAgICAgZGVwXzE2OwotCi0gIC8qIHJlYWQgYW5kIGNoZWNrIHNpZ25hdHVyZSBpbiBQTkcgZmlsZSAqLwotICByZXQgPSBmcmVhZCAoYnVmLCAxLCA4LCBwbmdfZmlsZSk7Ci0gIGlmIChyZXQgIT0gOCkKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgcmV0ID0gcG5nX3NpZ19jbXAgKGJ1ZiwgMCwgOCk7Ci0gIGlmIChyZXQpCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIGNyZWF0ZSBwbmcgYW5kIGluZm8gc3RydWN0dXJlcyAqLwotCi0gIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0IChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gIGlmICghcG5nX3B0cikKLSAgICByZXR1cm4gRkFMU0U7ICAgLyogb3V0IG9mIG1lbW9yeSAqLwotCi0gIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCAocG5nX3B0cik7Ci0gIGlmICghaW5mb19wdHIpCi0gIHsKLSAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCAoJnBuZ19wdHIsIE5VTEwsIE5VTEwpOwotICAgIHJldHVybiBGQUxTRTsgICAvKiBvdXQgb2YgbWVtb3J5ICovCi0gIH0KLQotICBpZiAoc2V0am1wIChwbmdfam1wYnVmKHBuZ19wdHIpKSkKLSAgewotICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0ICgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBzZXQgdXAgdGhlIGlucHV0IGNvbnRyb2wgZm9yIEMgc3RyZWFtcyAqLwotICBwbmdfaW5pdF9pbyAocG5nX3B0ciwgcG5nX2ZpbGUpOwotICBwbmdfc2V0X3NpZ19ieXRlcyAocG5nX3B0ciwgOCk7ICAvKiB3ZSBhbHJlYWR5IHJlYWQgdGhlIDggc2lnbmF0dXJlIGJ5dGVzICovCi0KLSAgLyogcmVhZCB0aGUgZmlsZSBpbmZvcm1hdGlvbiAqLwotICBwbmdfcmVhZF9pbmZvIChwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgLyogZ2V0IHNpemUgYW5kIGJpdC1kZXB0aCBvZiB0aGUgUE5HLWltYWdlICovCi0gIHBuZ19nZXRfSUhEUiAocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgJndpZHRoLCAmaGVpZ2h0LCAmYml0X2RlcHRoLCAmY29sb3JfdHlwZSwKLSAgICBOVUxMLCBOVUxMLCBOVUxMKTsKLQotICAvKiBzZXQtdXAgdGhlIHRyYW5zZm9ybWF0aW9ucyAqLwotCi0gIC8qIHRyYW5zZm9ybSBwYWxldHRlZCBpbWFnZXMgaW50byBmdWxsLWNvbG9yIHJnYiAqLwotICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgIHBuZ19zZXRfZXhwYW5kIChwbmdfcHRyKTsKLSAgLyogZXhwYW5kIGltYWdlcyB0byBiaXQtZGVwdGggOCAob25seSBhcHBsaWNhYmxlIGZvciBncmF5c2NhbGUgaW1hZ2VzKSAqLwotICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmIGJpdF9kZXB0aCA8IDgpCi0gICAgcG5nX3NldF9leHBhbmQgKHBuZ19wdHIpOwotICAvKiB0cmFuc2Zvcm0gdHJhbnNwYXJlbmN5IG1hcHMgaW50byBmdWxsIGFscGhhLWNoYW5uZWwgKi8KLSAgaWYgKHBuZ19nZXRfdmFsaWQgKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT190Uk5TKSkKLSAgICBwbmdfc2V0X2V4cGFuZCAocG5nX3B0cik7Ci0KLSNpZmRlZiBOSkVUCi0gIC8qIGRvd25ncmFkZSAxNi1iaXQgaW1hZ2VzIHRvIDggYml0ICovCi0gIGlmIChiaXRfZGVwdGggPT0gMTYpCi0gICAgcG5nX3NldF9zdHJpcF8xNiAocG5nX3B0cik7Ci0gIC8qIHRyYW5zZm9ybSBncmF5c2NhbGUgaW1hZ2VzIGludG8gZnVsbC1jb2xvciAqLwotICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8Ci0gICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgIHBuZ19zZXRfZ3JheV90b19yZ2IgKHBuZ19wdHIpOwotICAvKiBvbmx5IGlmIGZpbGUgaGFzIGEgZmlsZSBnYW1tYSwgd2UgZG8gYSBjb3JyZWN0aW9uICovCi0gIGlmIChwbmdfZ2V0X2dBTUEgKHBuZ19wdHIsIGluZm9fcHRyLCAmZmlsZV9nYW1tYSkpCi0gICAgcG5nX3NldF9nYW1tYSAocG5nX3B0ciwgKGRvdWJsZSkgMi4yLCBmaWxlX2dhbW1hKTsKLSNlbmRpZgotCi0gIC8qIGFsbCB0cmFuc2Zvcm1hdGlvbnMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQ7IG5vdyB1cGRhdGUgaW5mb19wdHIgZGF0YSwKLSAgICogZ2V0IHJvd2J5dGVzIGFuZCBjaGFubmVscywgYW5kIGFsbG9jYXRlIGltYWdlIG1lbW9yeSAqLwotCi0gIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIChwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgLyogZ2V0IHRoZSBuZXcgY29sb3ItdHlwZSBhbmQgYml0LWRlcHRoIChhZnRlciBleHBhbnNpb24vc3RyaXBwaW5nKSAqLwotICBwbmdfZ2V0X0lIRFIgKHBuZ19wdHIsIGluZm9fcHRyLCAmd2lkdGgsICZoZWlnaHQsICZiaXRfZGVwdGgsICZjb2xvcl90eXBlLAotICAgIE5VTEwsIE5VTEwsIE5VTEwpOwotCi0gIC8qIGNoZWNrIGZvciAxNi1iaXQgZmlsZXMgKi8KLSAgaWYgKGJpdF9kZXB0aCA9PSAxNikKLSAgewotICAgIHJhdyA9IEZBTFNFOwotI2lmZGVmIF9fVFVSQk9DX18KLSAgICBwbm1fZmlsZS0+ZmxhZ3MgJj0gfigodW5zaWduZWQpIF9GX0JJTik7Ci0jZW5kaWYKLSAgfQotCi0gIC8qIGNhbGN1bGF0ZSBuZXcgbnVtYmVyIG9mIGNoYW5uZWxzIGFuZCBzdG9yZSBhbHBoYS1wcmVzZW5jZSAqLwotICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQotICAgIGNoYW5uZWxzID0gMTsKLSAgZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgIGNoYW5uZWxzID0gMjsKLSAgZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCi0gICAgY2hhbm5lbHMgPSAzOwotICBlbHNlIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKLSAgICBjaGFubmVscyA9IDQ7Ci0gIGVsc2UKLSAgICBjaGFubmVscyA9IDA7IC8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KLSAgYWxwaGFfcHJlc2VudCA9IChjaGFubmVscyAtIDEpICUgMjsKLQotICAvKiBjaGVjayBpZiBhbHBoYSBpcyBleHBlY3RlZCB0byBiZSBwcmVzZW50IGluIGZpbGUgKi8KLSAgaWYgKGFscGhhICYmICFhbHBoYV9wcmVzZW50KQotICB7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiUE5HMlBOTVxuIik7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICBQTkctZmlsZSBkb2Vzbid0IGNvbnRhaW4gYWxwaGEgY2hhbm5lbFxuIik7Ci0gICAgZXhpdCAoMSk7Ci0gIH0KLQotICAvKiByb3dfYnl0ZXMgaXMgdGhlIHdpZHRoIHggbnVtYmVyIG9mIGNoYW5uZWxzIHggKGJpdC1kZXB0aCAvIDgpICovCi0gIHJvd19ieXRlcyA9IHBuZ19nZXRfcm93Ynl0ZXMgKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICBpZiAoKHBuZ19waXhlbHMgPSAocG5nX2J5dGUgKikgbWFsbG9jIChyb3dfYnl0ZXMgKiBoZWlnaHQgKiBzaXplb2YgKHBuZ19ieXRlKSkpID09IE5VTEwpIHsKLSAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCAoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgaWYgKChyb3dfcG9pbnRlcnMgPSAocG5nX2J5dGUgKiopIG1hbGxvYyAoaGVpZ2h0ICogc2l6ZW9mIChwbmdfYnl0ZXApKSkgPT0gTlVMTCkKLSAgewotICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0ICgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLSAgICBmcmVlIChwbmdfcGl4ZWxzKTsKLSAgICBwbmdfcGl4ZWxzID0gTlVMTDsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBzZXQgdGhlIGluZGl2aWR1YWwgcm93X3BvaW50ZXJzIHRvIHBvaW50IGF0IHRoZSBjb3JyZWN0IG9mZnNldHMgKi8KLSAgZm9yIChpID0gMDsgaSA8IChoZWlnaHQpOyBpKyspCi0gICAgcm93X3BvaW50ZXJzW2ldID0gcG5nX3BpeGVscyArIGkgKiByb3dfYnl0ZXM7Ci0KLSAgLyogbm93IHdlIGNhbiBnbyBhaGVhZCBhbmQganVzdCByZWFkIHRoZSB3aG9sZSBpbWFnZSAqLwotICBwbmdfcmVhZF9pbWFnZSAocG5nX3B0ciwgcm93X3BvaW50ZXJzKTsKLQotICAvKiByZWFkIHJlc3Qgb2YgZmlsZSwgYW5kIGdldCBhZGRpdGlvbmFsIGNodW5rcyBpbiBpbmZvX3B0ciAtIFJFUVVJUkVEICovCi0gIHBuZ19yZWFkX2VuZCAocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gIC8qIGNsZWFuIHVwIGFmdGVyIHRoZSByZWFkLCBhbmQgZnJlZSBhbnkgbWVtb3J5IGFsbG9jYXRlZCAtIFJFUVVJUkVEICovCi0gIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0ICgmcG5nX3B0ciwgJmluZm9fcHRyLCAocG5nX2luZm9wcCkgTlVMTCk7Ci0KLSAgLyogd3JpdGUgaGVhZGVyIG9mIFBOTSBmaWxlICovCi0KLSAgaWYgKChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpIHx8Ci0gICAgICAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKSkKLSAgewotICAgIGZwcmludGYgKHBubV9maWxlLCAiJXNcbiIsIChyYXcpID8gIlA1IiA6ICJQMiIpOwotICAgIGZwcmludGYgKHBubV9maWxlLCAiJWQgJWRcbiIsIChpbnQpIHdpZHRoLCAoaW50KSBoZWlnaHQpOwotICAgIGZwcmludGYgKHBubV9maWxlLCAiJWxkXG4iLCAoKDFMIDw8IChpbnQpIGJpdF9kZXB0aCkgLSAxTCkpOwotICB9Ci0gIGVsc2UgaWYgKChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikgfHwKLSAgICAgICAgICAgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKSkKLSAgewotICAgIGZwcmludGYgKHBubV9maWxlLCAiJXNcbiIsIChyYXcpID8gIlA2IiA6ICJQMyIpOwotICAgIGZwcmludGYgKHBubV9maWxlLCAiJWQgJWRcbiIsIChpbnQpIHdpZHRoLCAoaW50KSBoZWlnaHQpOwotICAgIGZwcmludGYgKHBubV9maWxlLCAiJWxkXG4iLCAoKDFMIDw8IChpbnQpIGJpdF9kZXB0aCkgLSAxTCkpOwotICB9Ci0KLSAgLyogd3JpdGUgaGVhZGVyIG9mIFBHTSBmaWxlIHdpdGggYWxwaGEgY2hhbm5lbCAqLwotCi0gIGlmICgoYWxwaGEpICYmCi0gICAgICAoKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkgfHwKLSAgICAgICAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpKSkKLSAgewotICAgIGZwcmludGYgKGFscGhhX2ZpbGUsICIlc1xuIiwgKHJhdykgPyAiUDUiIDogIlAyIik7Ci0gICAgZnByaW50ZiAoYWxwaGFfZmlsZSwgIiVkICVkXG4iLCAoaW50KSB3aWR0aCwgKGludCkgaGVpZ2h0KTsKLSAgICBmcHJpbnRmIChhbHBoYV9maWxlLCAiJWxkXG4iLCAoKDFMIDw8IChpbnQpIGJpdF9kZXB0aCkgLSAxTCkpOwotICB9Ci0KLSAgLyogd3JpdGUgZGF0YSB0byBQTk0gZmlsZSAqLwotICBwaXhfcHRyID0gcG5nX3BpeGVsczsKLQotICBmb3IgKHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspCi0gIHsKLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgKGNoYW5uZWxzIC0gYWxwaGFfcHJlc2VudCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKHJhdykKLSAgICAgICAgICBmcHV0YyAoKGludCkgKnBpeF9wdHIrKyAsIHBubV9maWxlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGlmIChiaXRfZGVwdGggPT0gMTYpewotCSAgICBkZXBfMTYgPSAobG9uZykgKnBpeF9wdHIrKzsKLSAgICAgICAgICAgIGZwcmludGYgKHBubV9maWxlLCAiJWxkICIsIChkZXBfMTYgPDwgOCkgKyAoKGxvbmcpICpwaXhfcHRyKyspKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZiAocG5tX2ZpbGUsICIlbGQgIiwgKGxvbmcpICpwaXhfcHRyKyspOwotICAgICAgfQotICAgICAgaWYgKGFscGhhX3ByZXNlbnQpCi0gICAgICB7Ci0gICAgICAgIGlmICghYWxwaGEpCi0gICAgICAgIHsKLSAgICAgICAgICBwaXhfcHRyKys7IC8qIGFscGhhICovCi0gICAgICAgICAgaWYgKGJpdF9kZXB0aCA9PSAxNikKLSAgICAgICAgICAgIHBpeF9wdHIrKzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIG91dHB1dCBhbHBoYS1jaGFubmVsIGFzIHBnbSBmaWxlICovCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocmF3KQotICAgICAgICAgICAgZnB1dGMgKChpbnQpICpwaXhfcHRyKysgLCBhbHBoYV9maWxlKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZiAoYml0X2RlcHRoID09IDE2KXsKLQkgICAgICBkZXBfMTYgPSAobG9uZykgKnBpeF9wdHIrKzsKLSAgICAgICAgICAgICAgZnByaW50ZiAoYWxwaGFfZmlsZSwgIiVsZCAiLCAoZGVwXzE2IDw8IDgpICsgKGxvbmcpICpwaXhfcHRyKyspOwotCSAgICB9ICAKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZnByaW50ZiAoYWxwaGFfZmlsZSwgIiVsZCAiLCAobG9uZykgKnBpeF9wdHIrKyk7Ci0gICAgICAgIH0KLSAgICAgIH0gLyogaWYgYWxwaGFfcHJlc2VudCAqLwotCi0gICAgICBpZiAoIXJhdykKLSAgICAgICAgaWYgKGNvbCAlIDQgPT0gMykKLSAgICAgICAgICBmcHJpbnRmIChwbm1fZmlsZSwgIlxuIik7Ci0gICAgfSAvKiBlbmQgZm9yIGNvbCAqLwotCi0gICAgaWYgKCFyYXcpCi0gICAgICBpZiAoY29sICUgNCAhPSAwKQotICAgICAgICBmcHJpbnRmIChwbm1fZmlsZSwgIlxuIik7Ci0gIH0gLyogZW5kIGZvciByb3cgKi8KLQotICBpZiAocm93X3BvaW50ZXJzICE9ICh1bnNpZ25lZCBjaGFyKiopIE5VTEwpCi0gICAgZnJlZSAocm93X3BvaW50ZXJzKTsKLSAgaWYgKHBuZ19waXhlbHMgIT0gKHVuc2lnbmVkIGNoYXIqKSBOVUxMKQotICAgIGZyZWUgKHBuZ19waXhlbHMpOwotCi0gIHJldHVybiBUUlVFOwotCi19IC8qIGVuZCBvZiBzb3VyY2UgKi8KLQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BuZzJwbm0uc2ggYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nMnBubS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjFjMDUzNy4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nMnBubS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMhL2Jpbi9zaAotIyAtLSBncmF5c2NhbGUKLS4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjBnMDEucG5nIGJhc24wZzAxLnBnbQotLi9wbmcycG5tIC1ub3JhdyAuLi9wbmdzdWl0ZS9iYXNuMGcwMi5wbmcgYmFzbjBnMDIucGdtCi0uL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc24wZzA0LnBuZyBiYXNuMGcwNC5wZ20KLS4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjBnMDgucG5nIGJhc24wZzA4LnBnbQotLi9wbmcycG5tIC1ub3JhdyAuLi9wbmdzdWl0ZS9iYXNuMGcxNi5wbmcgYmFzbjBnMTYucGdtCi0jIC0tIGZ1bGwtY29sb3IKLS4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjJjMDgucG5nIGJhc24yYzA4LnBwbQotLi9wbmcycG5tIC1ub3JhdyAuLi9wbmdzdWl0ZS9iYXNuMmMxNi5wbmcgYmFzbjJjMTYucHBtCi0jIC0tIHBhbGxldHRlZAotLi9wbmcycG5tIC1ub3JhdyAuLi9wbmdzdWl0ZS9iYXNuM3AwMS5wbmcgYmFzbjNwMDEucHBtCi0uL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc24zcDAyLnBuZyBiYXNuM3AwMi5wcG0KLS4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjNwMDQucG5nIGJhc24zcDA0LnBwbQotLi9wbmcycG5tIC1ub3JhdyAuLi9wbmdzdWl0ZS9iYXNuM3AwOC5wbmcgYmFzbjNwMDgucHBtCi0jIC0tIGdyYXkgd2l0aCBhbHBoYS1jaGFubmVsCi0uL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc240YTA4LnBuZyBiYXNuNGEwOC5wZ20KLS4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjRhMTYucG5nIGJhc240YTE2LnBnbQotIyAtLSBjb2xvciB3aXRoIGFscGhhLWNoYW5uZWwKLS4vcG5nMnBubSAtbm9yYXcgLWFscGhhIGJhc242YTA4LnBnbSAuLi9wbmdzdWl0ZS9iYXNuNmEwOC5wbmcgYmFzbjZhMDgucHBtCi0uL3BuZzJwbm0gLW5vcmF3IC1hbHBoYSBiYXNuNmExNi5wZ20gLi4vcG5nc3VpdGUvYmFzbjZhMTYucG5nIGJhc242YTE2LnBwbQotIyAtLSBncmF5c2NhbGUKLS4vcG5nMnBubSAtcmF3IC4uL3BuZ3N1aXRlL2Jhc24wZzAxLnBuZyByYXduMGcwMS5wZ20KLS4vcG5nMnBubSAtcmF3IC4uL3BuZ3N1aXRlL2Jhc24wZzAyLnBuZyByYXduMGcwMi5wZ20KLS4vcG5nMnBubSAtcmF3IC4uL3BuZ3N1aXRlL2Jhc24wZzA0LnBuZyByYXduMGcwNC5wZ20KLS4vcG5nMnBubSAtcmF3IC4uL3BuZ3N1aXRlL2Jhc24wZzA4LnBuZyByYXduMGcwOC5wZ20KLS4vcG5nMnBubSAtcmF3IC4uL3BuZ3N1aXRlL2Jhc24wZzE2LnBuZyByYXduMGcxNi5wZ20KLSMgLS0gZnVsbC1jb2xvcgotLi9wbmcycG5tIC1yYXcgLi4vcG5nc3VpdGUvYmFzbjJjMDgucG5nIHJhd24yYzA4LnBwbQotLi9wbmcycG5tIC1yYXcgLi4vcG5nc3VpdGUvYmFzbjJjMTYucG5nIHJhd24yYzE2LnBwbQotIyAtLSBwYWxsZXR0ZWQKLS4vcG5nMnBubSAtcmF3IC4uL3BuZ3N1aXRlL2Jhc24zcDAxLnBuZyByYXduM3AwMS5wcG0KLS4vcG5nMnBubSAtcmF3IC4uL3BuZ3N1aXRlL2Jhc24zcDAyLnBuZyByYXduM3AwMi5wcG0KLS4vcG5nMnBubSAtcmF3IC4uL3BuZ3N1aXRlL2Jhc24zcDA0LnBuZyByYXduM3AwNC5wcG0KLS4vcG5nMnBubSAtcmF3IC4uL3BuZ3N1aXRlL2Jhc24zcDA4LnBuZyByYXduM3AwOC5wcG0KLSMgLS0gZ3JheSB3aXRoIGFscGhhLWNoYW5uZWwKLS4vcG5nMnBubSAtcmF3IC4uL3BuZ3N1aXRlL2Jhc240YTA4LnBuZyByYXduNGEwOC5wZ20KLS4vcG5nMnBubSAtcmF3IC4uL3BuZ3N1aXRlL2Jhc240YTE2LnBuZyByYXduNGExNi5wZ20KLSMgLS0gY29sb3Igd2l0aCBhbHBoYS1jaGFubmVsCi0uL3BuZzJwbm0gLW5vcmF3IC1hbHBoYSByYXduNmEwOC5wZ20gLi4vcG5nc3VpdGUvYmFzbjZhMDgucG5nIHJhd242YTA4LnBwbQotLi9wbmcycG5tIC1ub3JhdyAtYWxwaGEgcmF3bjZhMTYucGdtIC4uL3BuZ3N1aXRlL2Jhc242YTE2LnBuZyByYXduNmExNi5wcG0KLQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BuZ21pbnVzLmJhdCBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbmdtaW51cy5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmOGQyZDQuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BuZ21pbnVzLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotbWFrZSAtZiBtYWtlZmlsZS50YzMNCi1jYWxsIHBuZzJwbm0uYmF0DQotY2FsbCBwbm0ycG5nLmJhdA0KLQ0KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbmdtaW51cy5zaCBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbmdtaW51cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmEwYTlkOC4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nbWludXMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMhL2Jpbi9zaAotbWFrZSAtZiBtYWtlZmlsZS5zdGQKLXNoIHBuZzJwbm0uc2gKLXNoIHBubTJwbmcuc2gKLQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BubTJwbmcuYmF0IGIvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BubTJwbmcuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1Yjk5NzdhLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbm0ycG5nLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLVJFTSAtLSBncmF5c2NhbGUNCi1wbm0ycG5nLmV4ZSBiYXNuMGcwMS5wZ20gYmFzbjBnMDEucG5nDQotcG5tMnBuZy5leGUgYmFzbjBnMDIucGdtIGJhc24wZzAyLnBuZw0KLXBubTJwbmcuZXhlIGJhc24wZzA0LnBnbSBiYXNuMGcwNC5wbmcNCi1wbm0ycG5nLmV4ZSBiYXNuMGcwOC5wZ20gYmFzbjBnMDgucG5nDQotcG5tMnBuZy5leGUgYmFzbjBnMTYucGdtIGJhc24wZzE2LnBuZw0KLVJFTSAtLSBmdWxsLWNvbG9yDQotcG5tMnBuZy5leGUgYmFzbjJjMDgucHBtIGJhc24yYzA4LnBuZw0KLXBubTJwbmcuZXhlIGJhc24yYzE2LnBwbSBiYXNuMmMxNi5wbmcNCi1SRU0gLS0gcGFsbGV0dGVkDQotcG5tMnBuZy5leGUgYmFzbjNwMDEucHBtIGJhc24zcDAxLnBuZw0KLXBubTJwbmcuZXhlIGJhc24zcDAyLnBwbSBiYXNuM3AwMi5wbmcNCi1wbm0ycG5nLmV4ZSBiYXNuM3AwNC5wcG0gYmFzbjNwMDQucG5nDQotcG5tMnBuZy5leGUgYmFzbjNwMDgucHBtIGJhc24zcDA4LnBuZw0KLVJFTSAtLSBncmF5IHdpdGggYWxwaGEtY2hhbm5lbA0KLXBubTJwbmcuZXhlIC1hbHBoYSBiYXNuNmEwOC5wZ20gYmFzbjRhMDgucGdtIGJhc240YTA4LnBuZw0KLXBubTJwbmcuZXhlIC1hbHBoYSBiYXNuNmExNi5wZ20gYmFzbjRhMTYucGdtIGJhc240YTE2LnBuZw0KLVJFTSAtLSBjb2xvciB3aXRoIGFscGhhLWNoYW5uZWwNCi1wbm0ycG5nLmV4ZSAtYWxwaGEgYmFzbjZhMDgucGdtIGJhc242YTA4LnBwbSBiYXNuNmEwOC5wbmcNCi1wbm0ycG5nLmV4ZSAtYWxwaGEgYmFzbjZhMTYucGdtIGJhc242YTE2LnBwbSBiYXNuNmExNi5wbmcNCi1SRU0gLS0gZ3JheXNjYWxlDQotcG5tMnBuZy5leGUgcmF3bjBnMDEucGdtIHJhd24wZzAxLnBuZw0KLXBubTJwbmcuZXhlIHJhd24wZzAyLnBnbSByYXduMGcwMi5wbmcNCi1wbm0ycG5nLmV4ZSByYXduMGcwNC5wZ20gcmF3bjBnMDQucG5nDQotcG5tMnBuZy5leGUgcmF3bjBnMDgucGdtIHJhd24wZzA4LnBuZw0KLXBubTJwbmcuZXhlIHJhd24wZzE2LnBnbSByYXduMGcxNi5wbmcNCi1SRU0gLS0gZnVsbC1jb2xvcg0KLXBubTJwbmcuZXhlIHJhd24yYzA4LnBwbSByYXduMmMwOC5wbmcNCi1wbm0ycG5nLmV4ZSByYXduMmMxNi5wcG0gcmF3bjJjMTYucG5nDQotUkVNIC0tIHBhbGxldHRlZA0KLXBubTJwbmcuZXhlIHJhd24zcDAxLnBwbSByYXduM3AwMS5wbmcNCi1wbm0ycG5nLmV4ZSByYXduM3AwMi5wcG0gcmF3bjNwMDIucG5nDQotcG5tMnBuZy5leGUgcmF3bjNwMDQucHBtIHJhd24zcDA0LnBuZw0KLXBubTJwbmcuZXhlIHJhd24zcDA4LnBwbSByYXduM3AwOC5wbmcNCi1SRU0gLS0gZ3JheSB3aXRoIGFscGhhLWNoYW5uZWwNCi1wbm0ycG5nLmV4ZSAtYWxwaGEgcmF3bjZhMDgucGdtIHJhd240YTA4LnBnbSByYXduNGEwOC5wbmcNCi1wbm0ycG5nLmV4ZSAtYWxwaGEgcmF3bjZhMTYucGdtIHJhd240YTE2LnBnbSByYXduNGExNi5wbmcNCi1SRU0gLS0gY29sb3Igd2l0aCBhbHBoYS1jaGFubmVsDQotcG5tMnBuZy5leGUgLWFscGhhIHJhd242YTA4LnBnbSByYXduNmEwOC5wcG0gcmF3bjZhMDgucG5nDQotcG5tMnBuZy5leGUgLWFscGhhIHJhd242YTE2LnBnbSByYXduNmExNi5wcG0gcmF3bjZhMTYucG5nDQotDQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BubTJwbmcuYyBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbm0ycG5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZGZhZDguLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BubTJwbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDUzMyArMCwwIEBACi0vKgotICogIHBubTJwbmcuYyAtLS0gY29udmVyc2lvbiBmcm9tIFBCTS9QR00vUFBNLWZpbGUgdG8gUE5HLWZpbGUKLSAqICBjb3B5cmlnaHQgKEMpIDE5OTkgYnkgV2lsbGVtIHZhbiBTY2hhaWsgPHdpbGxlbUBzY2hhaWsuY29tPgotICoKLSAqICB2ZXJzaW9uIDEuMCAtIDE5OTkuMTAuMTUgLSBGaXJzdCB2ZXJzaW9uLgotICoKLSAqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAotICogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCi0gKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKLSAqICB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotICogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKLSAqICBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWZkZWYgX19UVVJCT0NfXwotI2luY2x1ZGUgPG1lbS5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBCT09MCi0jZGVmaW5lIEJPT0wgdW5zaWduZWQgY2hhcgotI2VuZGlmCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRSAoQk9PTCkgMQotI2VuZGlmCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFIChCT09MKSAwCi0jZW5kaWYKLQotI2RlZmluZSBTVERJTiAgMAotI2RlZmluZSBTVERPVVQgMQotI2RlZmluZSBTVERFUlIgMgotCi0vKiB0byBtYWtlIHBubTJwbmcgdmVyYm9zZSBzbyB3ZSBjYW4gZmluZCBwcm9ibGVtcyAobmVlZHMgdG8gYmUgYmVmb3JlIHBuZy5oKSAqLwotI2lmbmRlZiBQTkdfREVCVUcKLSNkZWZpbmUgUE5HX0RFQlVHIDAKLSNlbmRpZgotCi0jaW5jbHVkZSAicG5nLmgiCi0KLS8qIERlZmluZSBwbmdfam1wYnVmKCkgaW4gY2FzZSB3ZSBhcmUgdXNpbmcgYSBwcmUtMS4wLjYgdmVyc2lvbiBvZiBsaWJwbmcgKi8KLSNpZm5kZWYgcG5nX2ptcGJ1ZgotIyAgZGVmaW5lIHBuZ19qbXBidWYocG5nX3B0cikgKChwbmdfcHRyKS0+am1wYnVmKQotI2VuZGlmCi0KLS8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLQotaW50ICBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKTsKLXZvaWQgdXNhZ2UgKCk7Ci1CT09MIHBubTJwbmcgKEZJTEUgKnBubV9maWxlLCBGSUxFICpwbmdfZmlsZSwgRklMRSAqYWxwaGFfZmlsZSwgQk9PTCBpbnRlcmxhY2UsIEJPT0wgYWxwaGEpOwotdm9pZCBnZXRfdG9rZW4oRklMRSAqcG5tX2ZpbGUsIGNoYXIgKnRva2VuKTsKLXBuZ191aW50XzMyIGdldF9kYXRhIChGSUxFICpwbm1fZmlsZSwgaW50IGRlcHRoKTsKLXBuZ191aW50XzMyIGdldF92YWx1ZSAoRklMRSAqcG5tX2ZpbGUsIGludCBkZXB0aCk7Ci0KLS8qCi0gKiAgbWFpbgotICovCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIEZJTEUgKmZwX3JkID0gc3RkaW47Ci0gIEZJTEUgKmZwX2FsID0gTlVMTDsKLSAgRklMRSAqZnBfd3IgPSBzdGRvdXQ7Ci0gIEJPT0wgaW50ZXJsYWNlID0gRkFMU0U7Ci0gIEJPT0wgYWxwaGEgPSBGQUxTRTsKLSAgaW50IGFyZ2k7Ci0KLSAgZm9yIChhcmdpID0gMTsgYXJnaSA8IGFyZ2M7IGFyZ2krKykKLSAgewotICAgIGlmIChhcmd2W2FyZ2ldWzBdID09ICctJykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGFyZ3ZbYXJnaV1bMV0pCi0gICAgICB7Ci0gICAgICAgIGNhc2UgJ2knOgotICAgICAgICAgIGludGVybGFjZSA9IFRSVUU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2EnOgotICAgICAgICAgIGFscGhhID0gVFJVRTsKLSAgICAgICAgICBhcmdpKys7Ci0gICAgICAgICAgaWYgKChmcF9hbCA9IGZvcGVuIChhcmd2W2FyZ2ldLCAicmIiKSkgPT0gTlVMTCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJQTk0yUE5HXG4iKTsKLSAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAgYWxwaGEtY2hhbm5lbCBmaWxlICVzIGRvZXMgbm90IGV4aXN0XG4iLAotICAgICAgICAgICAgICAgYXJndlthcmdpXSk7Ci0gICAgICAgICAgICBleGl0ICgxKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2gnOgotICAgICAgICBjYXNlICc/JzoKLSAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgIGV4aXQoMCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUE5NMlBOR1xuIik7Ci0gICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICB1bmtub3duIG9wdGlvbiAlc1xuIiwgYXJndlthcmdpXSk7Ci0gICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfSAvKiBlbmQgc3dpdGNoICovCi0gICAgfQotICAgIGVsc2UgaWYgKGZwX3JkID09IHN0ZGluKQotICAgIHsKLSAgICAgIGlmICgoZnBfcmQgPSBmb3BlbiAoYXJndlthcmdpXSwgInJiIikpID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlBOTTJQTkdcbiIpOwotICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogIGZpbGUgJXMgZG9lcyBub3QgZXhpc3RcbiIsIGFyZ3ZbYXJnaV0pOwotICAgICAgICBleGl0ICgxKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZnBfd3IgPT0gc3Rkb3V0KQotICAgIHsKLSAgICAgIGlmICgoZnBfd3IgPSBmb3BlbiAoYXJndlthcmdpXSwgIndiIikpID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlBOTTJQTkdcbiIpOwotICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogIGNhbiBub3QgY3JlYXRlIFBORy1maWxlICVzXG4iLCBhcmd2W2FyZ2ldKTsKLSAgICAgICAgZXhpdCAoMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJQTk0yUE5HXG4iKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAgdG9vIG1hbnkgcGFyYW1ldGVyc1xuIik7Ci0gICAgICB1c2FnZSgpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICB9IC8qIGVuZCBmb3IgKi8KLQotI2lmZGVmIF9fVFVSQk9DX18KLSAgLyogc2V0IHN0ZGluL3N0ZG91dCB0byBiaW5hcnksIHdlJ3JlIHJlYWRpbmcgdGhlIFBOTSBhbHdheXMhIGluIGJpbmFyeSBmb3JtYXQgKi8KLSAgaWYgKGZwX3JkID09IHN0ZGluKQotICB7Ci0gICAgc2V0bW9kZSAoU1RESU4sIE9fQklOQVJZKTsKLSAgfQotICBpZiAoZnBfd3IgPT0gc3Rkb3V0KQotICB7Ci0gICAgc2V0bW9kZSAoU1RET1VULCBPX0JJTkFSWSk7Ci0gIH0KLSNlbmRpZgotCi0gIC8qIGNhbGwgdGhlIGNvbnZlcnNpb24gcHJvZ3JhbSBpdHNlbGYgKi8KLSAgaWYgKHBubTJwbmcgKGZwX3JkLCBmcF93ciwgZnBfYWwsIGludGVybGFjZSwgYWxwaGEpID09IEZBTFNFKQotICB7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiUE5NMlBOR1xuIik7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICB1bnN1Y2Nlc3NmdWwgY29udmVydGluZyB0byBQTkctaW1hZ2VcbiIpOwotICAgIGV4aXQgKDEpOwotICB9Ci0KLSAgLyogY2xvc2UgaW5wdXQgZmlsZSAqLwotICBmY2xvc2UgKGZwX3JkKTsKLSAgLyogY2xvc2Ugb3V0cHV0IGZpbGUgKi8KLSAgZmNsb3NlIChmcF93cik7Ci0gIC8qIGNsb3NlIGFscGhhIGZpbGUgKi8KLSAgaWYgKGFscGhhKQotICAgIGZjbG9zZSAoZnBfYWwpOwotCi0gIHJldHVybiAwOwotfQotCi0vKgotICogIHVzYWdlCi0gKi8KLQotdm9pZCB1c2FnZSgpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgIlBOTTJQTkdcbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgICBieSBXaWxsZW0gdmFuIFNjaGFpaywgMTk5OVxuIik7Ci0jaWZkZWYgX19UVVJCT0NfXwotICBmcHJpbnRmIChzdGRlcnIsICIgICBmb3IgVHVyYm8tQyBhbmQgQm9ybGFuZC1DIGNvbXBpbGVyc1xuIik7Ci0jZWxzZQotICBmcHJpbnRmIChzdGRlcnIsICIgICBmb3IgTGludXggKGFuZCBVbml4KSBjb21waWxlcnNcbiIpOwotI2VuZGlmCi0gIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOiAgcG5tMnBuZyBbb3B0aW9uc10gPGZpbGU+Ljxwbm0+IFs8ZmlsZT4ucG5nXVxuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiAgIG9yOiAgLi4uIHwgcG5tMnBuZyBbb3B0aW9uc11cbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICJPcHRpb25zOlxuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiAgIC1pW250ZXJsYWNlXSAgIHdyaXRlIHBuZy1maWxlIHdpdGggaW50ZXJsYWNpbmcgb25cbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgICAtYVtscGhhXSA8ZmlsZT4ucGdtIHJlYWQgUE5HIGFscGhhIGNoYW5uZWwgYXMgcGdtLWZpbGVcbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgICAtaCB8IC0/ICBwcmludCB0aGlzIGhlbHAtaW5mb3JtYXRpb25cbiIpOwotfQotCi0vKgotICogIHBubTJwbmcKLSAqLwotCi1CT09MIHBubTJwbmcgKEZJTEUgKnBubV9maWxlLCBGSUxFICpwbmdfZmlsZSwgRklMRSAqYWxwaGFfZmlsZSwgQk9PTCBpbnRlcmxhY2UsIEJPT0wgYWxwaGEpCi17Ci0gIHBuZ19zdHJ1Y3QgICAgKnBuZ19wdHIgPSBOVUxMOwotICBwbmdfaW5mbyAgICAgICppbmZvX3B0ciA9IE5VTEw7Ci0gIHBuZ19ieXRlICAgICAgKnBuZ19waXhlbHMgPSBOVUxMOwotICBwbmdfYnl0ZSAgICAgICoqcm93X3BvaW50ZXJzID0gTlVMTDsKLSAgcG5nX2J5dGUgICAgICAqcGl4X3B0ciA9IE5VTEw7Ci0gIHBuZ191aW50XzMyICAgcm93X2J5dGVzOwotCi0gIGNoYXIgICAgICAgICAgdHlwZV90b2tlblsxNl07Ci0gIGNoYXIgICAgICAgICAgd2lkdGhfdG9rZW5bMTZdOwotICBjaGFyICAgICAgICAgIGhlaWdodF90b2tlblsxNl07Ci0gIGNoYXIgICAgICAgICAgbWF4dmFsX3Rva2VuWzE2XTsKLSAgaW50ICAgICAgICAgICBjb2xvcl90eXBlOwotICBwbmdfdWludF8zMiAgIHdpZHRoLCBhbHBoYV93aWR0aDsKLSAgcG5nX3VpbnRfMzIgICBoZWlnaHQsIGFscGhhX2hlaWdodDsKLSAgcG5nX3VpbnRfMzIgICBtYXh2YWw7Ci0gIGludCAgICAgICAgICAgYml0X2RlcHRoID0gMDsKLSAgaW50ICAgICAgICAgICBjaGFubmVsczsKLSAgaW50ICAgICAgICAgICBhbHBoYV9kZXB0aCA9IDA7Ci0gIGludCAgICAgICAgICAgYWxwaGFfcHJlc2VudDsKLSAgaW50ICAgICAgICAgICByb3csIGNvbDsKLSAgQk9PTCAgICAgICAgICByYXcsIGFscGhhX3JhdyA9IEZBTFNFOwotICBwbmdfdWludF8zMiAgIHRtcDE2OwotICBpbnQgICAgICAgICAgIGk7Ci0KLSAgLyogcmVhZCBoZWFkZXIgb2YgUE5NIGZpbGUgKi8KLQotICBnZXRfdG9rZW4ocG5tX2ZpbGUsIHR5cGVfdG9rZW4pOwotICBpZiAodHlwZV90b2tlblswXSAhPSAnUCcpCi0gIHsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLSAgZWxzZSBpZiAoKHR5cGVfdG9rZW5bMV0gPT0gJzEnKSB8fCAodHlwZV90b2tlblsxXSA9PSAnNCcpKQotICB7Ci0gICAgcmF3ID0gKHR5cGVfdG9rZW5bMV0gPT0gJzQnKTsKLSAgICBjb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfR1JBWTsKLSAgICBiaXRfZGVwdGggPSAxOwotICB9Ci0gIGVsc2UgaWYgKCh0eXBlX3Rva2VuWzFdID09ICcyJykgfHwgKHR5cGVfdG9rZW5bMV0gPT0gJzUnKSkKLSAgewotICAgIHJhdyA9ICh0eXBlX3Rva2VuWzFdID09ICc1Jyk7Ci0gICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX0dSQVk7Ci0gICAgZ2V0X3Rva2VuKHBubV9maWxlLCB3aWR0aF90b2tlbik7Ci0gICAgc3NjYW5mICh3aWR0aF90b2tlbiwgIiVsdSIsICZ3aWR0aCk7Ci0gICAgZ2V0X3Rva2VuKHBubV9maWxlLCBoZWlnaHRfdG9rZW4pOwotICAgIHNzY2FuZiAoaGVpZ2h0X3Rva2VuLCAiJWx1IiwgJmhlaWdodCk7Ci0gICAgZ2V0X3Rva2VuKHBubV9maWxlLCBtYXh2YWxfdG9rZW4pOwotICAgIHNzY2FuZiAobWF4dmFsX3Rva2VuLCAiJWx1IiwgJm1heHZhbCk7Ci0gICAgaWYgKG1heHZhbCA8PSAxKQotICAgICAgYml0X2RlcHRoID0gMTsKLSAgICBlbHNlIGlmIChtYXh2YWwgPD0gMykKLSAgICAgIGJpdF9kZXB0aCA9IDI7Ci0gICAgZWxzZSBpZiAobWF4dmFsIDw9IDE1KQotICAgICAgYml0X2RlcHRoID0gNDsKLSAgICBlbHNlIGlmIChtYXh2YWwgPD0gMjU1KQotICAgICAgYml0X2RlcHRoID0gODsKLSAgICBlbHNlIC8qIGlmIChtYXh2YWwgPD0gNjU1MzUpICovCi0gICAgICBiaXRfZGVwdGggPSAxNjsKLSAgfQotICBlbHNlIGlmICgodHlwZV90b2tlblsxXSA9PSAnMycpIHx8ICh0eXBlX3Rva2VuWzFdID09ICc2JykpCi0gIHsKLSAgICByYXcgPSAodHlwZV90b2tlblsxXSA9PSAnNicpOwotICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0I7Ci0gICAgZ2V0X3Rva2VuKHBubV9maWxlLCB3aWR0aF90b2tlbik7Ci0gICAgc3NjYW5mICh3aWR0aF90b2tlbiwgIiVsdSIsICZ3aWR0aCk7Ci0gICAgZ2V0X3Rva2VuKHBubV9maWxlLCBoZWlnaHRfdG9rZW4pOwotICAgIHNzY2FuZiAoaGVpZ2h0X3Rva2VuLCAiJWx1IiwgJmhlaWdodCk7Ci0gICAgZ2V0X3Rva2VuKHBubV9maWxlLCBtYXh2YWxfdG9rZW4pOwotICAgIHNzY2FuZiAobWF4dmFsX3Rva2VuLCAiJWx1IiwgJm1heHZhbCk7Ci0gICAgaWYgKG1heHZhbCA8PSAxKQotICAgICAgYml0X2RlcHRoID0gMTsKLSAgICBlbHNlIGlmIChtYXh2YWwgPD0gMykKLSAgICAgIGJpdF9kZXB0aCA9IDI7Ci0gICAgZWxzZSBpZiAobWF4dmFsIDw9IDE1KQotICAgICAgYml0X2RlcHRoID0gNDsKLSAgICBlbHNlIGlmIChtYXh2YWwgPD0gMjU1KQotICAgICAgYml0X2RlcHRoID0gODsKLSAgICBlbHNlIC8qIGlmIChtYXh2YWwgPD0gNjU1MzUpICovCi0gICAgICBiaXRfZGVwdGggPSAxNjsKLSAgfQotICBlbHNlCi0gIHsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiByZWFkIGhlYWRlciBvZiBQR00gZmlsZSB3aXRoIGFscGhhIGNoYW5uZWwgKi8KLQotICBpZiAoYWxwaGEpCi0gIHsKLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQotICAgICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE7Ci0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQTsKLQotICAgIGdldF90b2tlbihhbHBoYV9maWxlLCB0eXBlX3Rva2VuKTsKLSAgICBpZiAodHlwZV90b2tlblswXSAhPSAnUCcpCi0gICAgewotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBlbHNlIGlmICgodHlwZV90b2tlblsxXSA9PSAnMicpIHx8ICh0eXBlX3Rva2VuWzFdID09ICc1JykpCi0gICAgewotICAgICAgYWxwaGFfcmF3ID0gKHR5cGVfdG9rZW5bMV0gPT0gJzUnKTsKLSAgICAgIGdldF90b2tlbihhbHBoYV9maWxlLCB3aWR0aF90b2tlbik7Ci0gICAgICBzc2NhbmYgKHdpZHRoX3Rva2VuLCAiJWx1IiwgJmFscGhhX3dpZHRoKTsKLSAgICAgIGlmIChhbHBoYV93aWR0aCAhPSB3aWR0aCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgZ2V0X3Rva2VuKGFscGhhX2ZpbGUsIGhlaWdodF90b2tlbik7Ci0gICAgICBzc2NhbmYgKGhlaWdodF90b2tlbiwgIiVsdSIsICZhbHBoYV9oZWlnaHQpOwotICAgICAgaWYgKGFscGhhX2hlaWdodCAhPSBoZWlnaHQpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgIGdldF90b2tlbihhbHBoYV9maWxlLCBtYXh2YWxfdG9rZW4pOwotICAgICAgc3NjYW5mIChtYXh2YWxfdG9rZW4sICIlbHUiLCAmbWF4dmFsKTsKLSAgICAgIGlmIChtYXh2YWwgPD0gMSkKLSAgICAgICAgYWxwaGFfZGVwdGggPSAxOwotICAgICAgZWxzZSBpZiAobWF4dmFsIDw9IDMpCi0gICAgICAgIGFscGhhX2RlcHRoID0gMjsKLSAgICAgIGVsc2UgaWYgKG1heHZhbCA8PSAxNSkKLSAgICAgICAgYWxwaGFfZGVwdGggPSA0OwotICAgICAgZWxzZSBpZiAobWF4dmFsIDw9IDI1NSkKLSAgICAgICAgYWxwaGFfZGVwdGggPSA4OwotICAgICAgZWxzZSAvKiBpZiAobWF4dmFsIDw9IDY1NTM1KSAqLwotICAgICAgICBhbHBoYV9kZXB0aCA9IDE2OwotICAgICAgaWYgKGFscGhhX2RlcHRoICE9IGJpdF9kZXB0aCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgfSAvKiBlbmQgaWYgYWxwaGEgKi8KLQotICAvKiBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjaGFubmVscyBhbmQgc3RvcmUgYWxwaGEtcHJlc2VuY2UgKi8KLSAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKLSAgICBjaGFubmVscyA9IDE7Ci0gIGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKLSAgICBjaGFubmVscyA9IDI7Ci0gIGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgIGNoYW5uZWxzID0gMzsKLSAgZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCi0gICAgY2hhbm5lbHMgPSA0OwotICBlbHNlCi0gICAgY2hhbm5lbHMgPSAwOyAvKiBzaG91bGQgbm90IGhhcHBlbiAqLwotCi0gIGFscGhhX3ByZXNlbnQgPSAoY2hhbm5lbHMgLSAxKSAlIDI7Ci0KLSAgLyogcm93X2J5dGVzIGlzIHRoZSB3aWR0aCB4IG51bWJlciBvZiBjaGFubmVscyB4IChiaXQtZGVwdGggLyA4KSAqLwotICByb3dfYnl0ZXMgPSB3aWR0aCAqIGNoYW5uZWxzICogKChiaXRfZGVwdGggPD0gOCkgPyAxIDogMik7Ci0KLSAgaWYgKChwbmdfcGl4ZWxzID0gKHBuZ19ieXRlICopIG1hbGxvYyAocm93X2J5dGVzICogaGVpZ2h0ICogc2l6ZW9mIChwbmdfYnl0ZSkpKSA9PSBOVUxMKQotICAgIHJldHVybiBGQUxTRTsKLQotICAvKiByZWFkIGRhdGEgZnJvbSBQTk0gZmlsZSAqLwotICBwaXhfcHRyID0gcG5nX3BpeGVsczsKLQotICBmb3IgKHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspCi0gIHsKLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgKGNoYW5uZWxzIC0gYWxwaGFfcHJlc2VudCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKHJhdykKLSAgICAgICAgICAqcGl4X3B0cisrID0gZ2V0X2RhdGEgKHBubV9maWxlLCBiaXRfZGVwdGgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgaWYgKGJpdF9kZXB0aCA8PSA4KQotICAgICAgICAgICAgKnBpeF9wdHIrKyA9IGdldF92YWx1ZSAocG5tX2ZpbGUsIGJpdF9kZXB0aCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRtcDE2ID0gZ2V0X3ZhbHVlIChwbm1fZmlsZSwgYml0X2RlcHRoKTsKLSAgICAgICAgICAgICpwaXhfcHRyID0gKHBuZ19ieXRlKSAoKHRtcDE2ID4+IDgpICYgMHhGRik7Ci0gICAgICAgICAgICBwaXhfcHRyKys7Ci0gICAgICAgICAgICAqcGl4X3B0ciA9IChwbmdfYnl0ZSkgKHRtcDE2ICYgMHhGRik7Ci0gICAgICAgICAgICBwaXhfcHRyKys7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoYWxwaGEpIC8qIHJlYWQgYWxwaGEtY2hhbm5lbCBmcm9tIHBnbSBmaWxlICovCi0gICAgICB7Ci0gICAgICAgIGlmIChhbHBoYV9yYXcpCi0gICAgICAgICAgKnBpeF9wdHIrKyA9IGdldF9kYXRhIChhbHBoYV9maWxlLCBhbHBoYV9kZXB0aCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBpZiAoYWxwaGFfZGVwdGggPD0gOCkKLSAgICAgICAgICAgICpwaXhfcHRyKysgPSBnZXRfdmFsdWUgKGFscGhhX2ZpbGUsIGJpdF9kZXB0aCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRtcDE2ID0gZ2V0X3ZhbHVlIChhbHBoYV9maWxlLCBiaXRfZGVwdGgpOwotICAgICAgICAgICAgKnBpeF9wdHIrKyA9IChwbmdfYnl0ZSkgKCh0bXAxNiA+PiA4KSAmIDB4RkYpOwotICAgICAgICAgICAgKnBpeF9wdHIrKyA9IChwbmdfYnl0ZSkgKHRtcDE2ICYgMHhGRik7Ci0gICAgICAgICAgfQotICAgICAgfSAvKiBpZiBhbHBoYSAqLwotCi0gICAgfSAvKiBlbmQgZm9yIGNvbCAqLwotICB9IC8qIGVuZCBmb3Igcm93ICovCi0KLSAgLyogcHJlcGFyZSB0aGUgc3RhbmRhcmQgUE5HIHN0cnVjdHVyZXMgKi8KLSAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0IChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIE5VTEwsIE5VTEwsIE5VTEwpOwotICBpZiAoIXBuZ19wdHIpCi0gIHsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLSAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0IChwbmdfcHRyKTsKLSAgaWYgKCFpbmZvX3B0cikKLSAgewotICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCAoJnBuZ19wdHIsIChwbmdfaW5mb3BwKSBOVUxMKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBzZXRqbXAoKSBtdXN0IGJlIGNhbGxlZCBpbiBldmVyeSBmdW5jdGlvbiB0aGF0IGNhbGxzIGEgUE5HLXJlYWRpbmcgbGlicG5nIGZ1bmN0aW9uICovCi0gIGlmIChzZXRqbXAgKHBuZ19qbXBidWYocG5nX3B0cikpKQotICB7Ci0gICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0ICgmcG5nX3B0ciwgKHBuZ19pbmZvcHApIE5VTEwpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIGluaXRpYWxpemUgdGhlIHBuZyBzdHJ1Y3R1cmUgKi8KLSAgcG5nX2luaXRfaW8gKHBuZ19wdHIsIHBuZ19maWxlKTsKLQotICAvKiB3ZSdyZSBnb2luZyB0byB3cml0ZSBtb3JlIG9yIGxlc3MgdGhlIHNhbWUgUE5HIGFzIHRoZSBpbnB1dCBmaWxlICovCi0gIHBuZ19zZXRfSUhEUiAocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwgY29sb3JfdHlwZSwKLSAgICAoIWludGVybGFjZSkgPyBQTkdfSU5URVJMQUNFX05PTkUgOiBQTkdfSU5URVJMQUNFX0FEQU03LAotICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UsIFBOR19GSUxURVJfVFlQRV9CQVNFKTsKLQotICAvKiB3cml0ZSB0aGUgZmlsZSBoZWFkZXIgaW5mb3JtYXRpb24gKi8KLSAgcG5nX3dyaXRlX2luZm8gKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAvKiBpZiBuZWVkZWQgd2Ugd2lsbCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIG5ldyBhcnJheSBvZiByb3ctcG9pbnRlcnMgKi8KLSAgaWYgKHJvd19wb2ludGVycyA9PSAodW5zaWduZWQgY2hhcioqKSBOVUxMKQotICB7Ci0gICAgaWYgKChyb3dfcG9pbnRlcnMgPSAocG5nX2J5dGUgKiopIG1hbGxvYyAoaGVpZ2h0ICogc2l6ZW9mIChwbmdfYnl0ZXApKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QgKCZwbmdfcHRyLCAocG5nX2luZm9wcCkgTlVMTCk7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICB9Ci0KLSAgLyogc2V0IHRoZSBpbmRpdmlkdWFsIHJvd19wb2ludGVycyB0byBwb2ludCBhdCB0aGUgY29ycmVjdCBvZmZzZXRzICovCi0gIGZvciAoaSA9IDA7IGkgPCAoaGVpZ2h0KTsgaSsrKQotICAgIHJvd19wb2ludGVyc1tpXSA9IHBuZ19waXhlbHMgKyBpICogcm93X2J5dGVzOwotCi0gIC8qIHdyaXRlIG91dCB0aGUgZW50aXJlIGltYWdlIGRhdGEgaW4gb25lIGNhbGwgKi8KLSAgcG5nX3dyaXRlX2ltYWdlIChwbmdfcHRyLCByb3dfcG9pbnRlcnMpOwotCi0gIC8qIHdyaXRlIHRoZSBhZGRpdGlvbmFsIGNodW5ja3MgdG8gdGhlIFBORyBmaWxlIChub3QgcmVhbGx5IG5lZWRlZCkgKi8KLSAgcG5nX3dyaXRlX2VuZCAocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gIC8qIGNsZWFuIHVwIGFmdGVyIHRoZSB3cml0ZSwgYW5kIGZyZWUgYW55IG1lbW9yeSBhbGxvY2F0ZWQgKi8KLSAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0ICgmcG5nX3B0ciwgKHBuZ19pbmZvcHApIE5VTEwpOwotCi0gIGlmIChyb3dfcG9pbnRlcnMgIT0gKHVuc2lnbmVkIGNoYXIqKikgTlVMTCkKLSAgICBmcmVlIChyb3dfcG9pbnRlcnMpOwotICBpZiAocG5nX3BpeGVscyAhPSAodW5zaWduZWQgY2hhciopIE5VTEwpCi0gICAgZnJlZSAocG5nX3BpeGVscyk7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19IC8qIGVuZCBvZiBwbm0ycG5nICovCi0KLS8qCi0gKiBnZXRfdG9rZW4oKSAtIGdldHMgdGhlIGZpcnN0IHN0cmluZyBhZnRlciB3aGl0ZXNwYWNlCi0gKi8KLQotdm9pZCBnZXRfdG9rZW4oRklMRSAqcG5tX2ZpbGUsIGNoYXIgKnRva2VuKQotewotICBpbnQgaSA9IDA7Ci0KLSAgLyogcmVtb3ZlIHdoaXRlLXNwYWNlICovCi0gIGRvCi0gIHsKLSAgICB0b2tlbltpXSA9ICh1bnNpZ25lZCBjaGFyKSBmZ2V0YyAocG5tX2ZpbGUpOwotICB9Ci0gIHdoaWxlICgodG9rZW5baV0gPT0gJ1xuJykgfHwgKHRva2VuW2ldID09ICdccicpIHx8ICh0b2tlbltpXSA9PSAnICcpKTsKLQotICAvKiByZWFkIHN0cmluZyAqLwotICBkbwotICB7Ci0gICAgaSsrOwotICAgIHRva2VuW2ldID0gKHVuc2lnbmVkIGNoYXIpIGZnZXRjIChwbm1fZmlsZSk7Ci0gIH0KLSAgd2hpbGUgKCh0b2tlbltpXSAhPSAnXG4nKSAmJiAodG9rZW5baV0gIT0gJ1xyJykgJiYgKHRva2VuW2ldICE9ICcgJykpOwotCi0gIHRva2VuW2ldID0gJ1wwJzsKLQotICByZXR1cm47Ci19Ci0KLS8qCi0gKiBnZXRfZGF0YSgpIC0gdGFrZXMgZmlyc3QgYnl0ZSBhbmQgY29udmVydHMgaW50byBuZXh0IHBpeGVsIHZhbHVlLAotICogICAgICAgIHRha2luZyBhcyBtdWNoIGJpdHMgYXMgZGVmaW5lZCBieSBiaXQtZGVwdGggYW5kCi0gKiAgICAgICAgdXNpbmcgdGhlIGJpdC1kZXB0aCB0byBmaWxsIHVwIGEgYnl0ZSAoMEFoIC0+IEFBaCkKLSAqLwotCi1wbmdfdWludF8zMiBnZXRfZGF0YSAoRklMRSAqcG5tX2ZpbGUsIGludCBkZXB0aCkKLXsKLSAgc3RhdGljIGludCBiaXRzX2xlZnQgPSAwOwotICBzdGF0aWMgaW50IG9sZF92YWx1ZSA9IDA7Ci0gIHN0YXRpYyBpbnQgbWFzayA9IDA7Ci0gIGludCBpOwotICBwbmdfdWludF8zMiByZXRfdmFsdWU7Ci0KLSAgaWYgKG1hc2sgPT0gMCkKLSAgICBmb3IgKGkgPSAwOyBpIDwgZGVwdGg7IGkrKykKLSAgICAgIG1hc2sgPSAobWFzayA+PiAxKSB8IDB4ODA7Ci0KLSAgaWYgKGJpdHNfbGVmdCA8PSAwKQotICB7Ci0gICAgb2xkX3ZhbHVlID0gZmdldGMgKHBubV9maWxlKTsKLSAgICBiaXRzX2xlZnQgPSA4OwotICB9Ci0KLSAgcmV0X3ZhbHVlID0gb2xkX3ZhbHVlICYgbWFzazsKLSAgZm9yIChpID0gMTsgaSA8ICg4IC8gZGVwdGgpOyBpKyspCi0gICAgcmV0X3ZhbHVlID0gcmV0X3ZhbHVlIHx8IChyZXRfdmFsdWUgPj4gZGVwdGgpOwotCi0gIG9sZF92YWx1ZSA9IChvbGRfdmFsdWUgPDwgZGVwdGgpICYgMHhGRjsKLSAgYml0c19sZWZ0IC09IGRlcHRoOwotCi0gIHJldHVybiByZXRfdmFsdWU7Ci19Ci0KLS8qCi0gKiBnZXRfdmFsdWUoKSAtIHRha2VzIGZpcnN0IChudW1lcmljKSBzdHJpbmcgYW5kIGNvbnZlcnRzIGludG8gbnVtYmVyLAotICogICAgICAgICB1c2luZyB0aGUgYml0LWRlcHRoIHRvIGZpbGwgdXAgYSBieXRlICgwQWggLT4gQUFoKQotICovCi0KLXBuZ191aW50XzMyIGdldF92YWx1ZSAoRklMRSAqcG5tX2ZpbGUsIGludCBkZXB0aCkKLXsKLSAgc3RhdGljIHBuZ191aW50XzMyIG1hc2sgPSAwOwotICBwbmdfYnl0ZSB0b2tlblsxNl07Ci0gIHBuZ191aW50XzMyIHJldF92YWx1ZTsKLSAgaW50IGkgPSAwOwotCi0gIGlmIChtYXNrID09IDApCi0gICAgZm9yIChpID0gMDsgaSA8IGRlcHRoOyBpKyspCi0gICAgICBtYXNrID0gKG1hc2sgPDwgMSkgfCAweDAxOwotCi0gIGdldF90b2tlbiAocG5tX2ZpbGUsIChjaGFyICopIHRva2VuKTsKLSAgc3NjYW5mICgoY29uc3QgY2hhciAqKSB0b2tlbiwgIiVsdSIsICZyZXRfdmFsdWUpOwotCi0gIHJldF92YWx1ZSAmPSBtYXNrOwotCi0gIGlmIChkZXB0aCA8IDgpCi0gICAgZm9yIChpID0gMDsgaSA8ICg4IC8gZGVwdGgpOyBpKyspCi0gICAgICByZXRfdmFsdWUgPSAocmV0X3ZhbHVlIDw8IGRlcHRoKSB8fCByZXRfdmFsdWU7Ci0KLSAgcmV0dXJuIHJldF92YWx1ZTsKLX0KLQotLyogZW5kIG9mIHNvdXJjZSAqLwotCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5tMnBuZy5zaCBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbm0ycG5nLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNzlkZjJmLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbm0ycG5nLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIyEvYmluL3NoCi0jIC0tIGdyYXlzY2FsZQotLi9wbm0ycG5nIGJhc24wZzAxLnBnbSBiYXNuMGcwMS5wbmcKLS4vcG5tMnBuZyBiYXNuMGcwMi5wZ20gYmFzbjBnMDIucG5nCi0uL3BubTJwbmcgYmFzbjBnMDQucGdtIGJhc24wZzA0LnBuZwotLi9wbm0ycG5nIGJhc24wZzA4LnBnbSBiYXNuMGcwOC5wbmcKLS4vcG5tMnBuZyBiYXNuMGcxNi5wZ20gYmFzbjBnMTYucG5nCi0jIC0tIGZ1bGwtY29sb3IKLS4vcG5tMnBuZyBiYXNuMmMwOC5wcG0gYmFzbjJjMDgucG5nCi0uL3BubTJwbmcgYmFzbjJjMTYucHBtIGJhc24yYzE2LnBuZwotIyAtLSBwYWxsZXR0ZWQKLS4vcG5tMnBuZyBiYXNuM3AwMS5wcG0gYmFzbjNwMDEucG5nCi0uL3BubTJwbmcgYmFzbjNwMDIucHBtIGJhc24zcDAyLnBuZwotLi9wbm0ycG5nIGJhc24zcDA0LnBwbSBiYXNuM3AwNC5wbmcKLS4vcG5tMnBuZyBiYXNuM3AwOC5wcG0gYmFzbjNwMDgucG5nCi0jIC0tIGdyYXkgd2l0aCBhbHBoYS1jaGFubmVsCi0uL3BubTJwbmcgLWFscGhhIGJhc242YTA4LnBnbSBiYXNuNGEwOC5wZ20gYmFzbjRhMDgucG5nCi0uL3BubTJwbmcgLWFscGhhIGJhc242YTE2LnBnbSBiYXNuNGExNi5wZ20gYmFzbjRhMTYucG5nCi0jIC0tIGNvbG9yIHdpdGggYWxwaGEtY2hhbm5lbAotLi9wbm0ycG5nIC1hbHBoYSBiYXNuNmEwOC5wZ20gYmFzbjZhMDgucHBtIGJhc242YTA4LnBuZwotLi9wbm0ycG5nIC1hbHBoYSBiYXNuNmExNi5wZ20gYmFzbjZhMTYucHBtIGJhc242YTE2LnBuZwotIyAtLSBncmF5c2NhbGUKLS4vcG5tMnBuZyByYXduMGcwMS5wZ20gcmF3bjBnMDEucG5nCi0uL3BubTJwbmcgcmF3bjBnMDIucGdtIHJhd24wZzAyLnBuZwotLi9wbm0ycG5nIHJhd24wZzA0LnBnbSByYXduMGcwNC5wbmcKLS4vcG5tMnBuZyByYXduMGcwOC5wZ20gcmF3bjBnMDgucG5nCi0uL3BubTJwbmcgcmF3bjBnMTYucGdtIHJhd24wZzE2LnBuZwotIyAtLSBmdWxsLWNvbG9yCi0uL3BubTJwbmcgcmF3bjJjMDgucHBtIHJhd24yYzA4LnBuZwotLi9wbm0ycG5nIHJhd24yYzE2LnBwbSByYXduMmMxNi5wbmcKLSMgLS0gcGFsbGV0dGVkCi0uL3BubTJwbmcgcmF3bjNwMDEucHBtIHJhd24zcDAxLnBuZwotLi9wbm0ycG5nIHJhd24zcDAyLnBwbSByYXduM3AwMi5wbmcKLS4vcG5tMnBuZyByYXduM3AwNC5wcG0gcmF3bjNwMDQucG5nCi0uL3BubTJwbmcgcmF3bjNwMDgucHBtIHJhd24zcDA4LnBuZwotIyAtLSBncmF5IHdpdGggYWxwaGEtY2hhbm5lbAotLi9wbm0ycG5nIC1hbHBoYSByYXduNmEwOC5wZ20gcmF3bjRhMDgucGdtIHJhd240YTA4LnBuZwotLi9wbm0ycG5nIC1hbHBoYSByYXduNmExNi5wZ20gcmF3bjRhMTYucGdtIHJhd240YTE2LnBuZwotIyAtLSBjb2xvciB3aXRoIGFscGhhLWNoYW5uZWwKLS4vcG5tMnBuZyAtYWxwaGEgcmF3bjZhMDgucGdtIHJhd242YTA4LnBwbSByYXduNmEwOC5wbmcKLS4vcG5tMnBuZyAtYWxwaGEgcmF3bjZhMTYucGdtIHJhd242YTE2LnBwbSByYXduNmExNi5wbmcKLQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL1JFQURNRSBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNGFmOTQuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0KLXBuZ3N1aXRlCi0tLS0tLS0tLQotKGMpIFdpbGxlbSB2YW4gU2NoYWlrLCAxOTk5LCAyMDExLCAyMDEyCi1Ud28gaW1hZ2VzIGFyZSBieSBHbGVubiBSYW5kZXJzLVBlaHJzb24sIDIwMTIKLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhlc2UgaW1hZ2VzIGZvciBhbnkKLXB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLgotCi1UaGUgMTUgImJhcyoucG5nIiBpbWFnZXMgYXJlIHBhcnQgb2YgdGhlIG11Y2ggbGFyZ2VyIFBuZ1N1aXRlIHRlc3Qtc2V0IG9mCi1pbWFnZXMsIGF2YWlsYWJsZSBmb3IgZGV2ZWxvcGVycyBvZiBQTkcgc3VwcG9ydGluZyBzb2Z0d2FyZS4gVGhlCi1jb21wbGV0ZSBzZXQsIGF2YWlsYWJsZSBhdCBodHRwOi93d3cuc2NoYWlrLmNvbS9wbmdzdWl0ZS8sIGNvbnRhaW5zCi1hIHZhcmlldHkgb2YgaW1hZ2VzIHRvIHRlc3QgaW50ZXJsYWNpbmcsIGdhbW1hIHNldHRpbmdzLCBhbmNpbGxhcnkKLWNodW5rcywgZXRjLgotCi1UaGUgImZ0Ki5wbmciIGltYWdlcyBhcmUgImZyZWUvbGlicmUiIHJlcGxhY2VtZW50cyBmb3IgdGhlIHRyYW5zcGFyZW50Ci1jb3JyZXNwb25kaW5nIHQqLnBuZyBpbWFnZXMgaW4gdGhlIFBuZ1N1aXRlLgotCi1UaGUgaW1hZ2VzIGluIHRoaXMgZGlyZWN0b3J5IHJlcHJlc2VudCB0aGUgYmFzaWMgUE5HIGNvbG9yLXR5cGVzOgotZ3JheXNjYWxlICgxLTE2IGJpdCBkZWVwKSwgZnVsbCBjb2xvciAoOCBvciAxNiBiaXQpLCBwYWxldHRlZAotKDEtOCBiaXQpIGFuZCBncmF5c2NhbGUgb3IgY29sb3IgaW1hZ2VzIHdpdGggYWxwaGEgY2hhbm5lbC4gWW91Ci1jYW4gdXNlIHRoZW0gdG8gdGVzdCB0aGUgcHJvcGVyIGZ1bmN0aW9uaW5nIG9mIFBORyBzb2Z0d2FyZS4KLQotICAgIGZpbGVuYW1lICAgICAgIGRlcHRoIHR5cGUKLSAgICAtLS0tLS0tLS0tLS0gLS0tLS0tIC0tLS0tLS0tLS0tLS0tCi0gICAgYmFzbjBnMDEucG5nICAgMS1iaXQgZ3JheXNjYWxlCi0gICAgYmFzbjBnMDIucG5nICAgMi1iaXQgZ3JheXNjYWxlCi0gICAgYmFzbjBnMDQucG5nICAgNC1iaXQgZ3JheXNjYWxlCi0gICAgYmFzbjBnMDgucG5nICAgOC1iaXQgZ3JheXNjYWxlCi0gICAgYmFzbjBnMTYucG5nICAxNi1iaXQgZ3JheXNjYWxlCi0gICAgYmFzbjJjMDgucG5nICAgOC1iaXQgdHJ1ZWNvbG9yCi0gICAgYmFzbjJjMTYucG5nICAxNi1iaXQgdHJ1ZWNvbG9yCi0gICAgYmFzbjNwMDEucG5nICAgMS1iaXQgcGFsZXR0ZWQKLSAgICBiYXNuM3AwMi5wbmcgICAyLWJpdCBwYWxldHRlZAotICAgIGJhc24zcDA0LnBuZyAgIDQtYml0IHBhbGV0dGVkCi0gICAgYmFzbjNwMDgucG5nICAgOC1iaXQgcGFsZXR0ZWQKLSAgICBiYXNuNGEwOC5wbmcgICA4LWJpdCBncmF5IHdpdGggYWxwaGEKLSAgICBiYXNuNGExNi5wbmcgIDE2LWJpdCBncmF5IHdpdGggYWxwaGEKLSAgICBiYXNuNmEwOC5wbmcgICA4LWJpdCBSR0JBCi0gICAgYmFzbjZhMTYucG5nICAxNi1iaXQgUkdCQQotCi0gICAgZnRiYm4wZzAxLnBuZyAgMS1iaXQgZ3JheXNjYWxlLCBibGFjayBiS0dECi0gICAgZnRiYm4wZzAyLnBuZyAgMi1iaXQgZ3JheXNjYWxlLCBibGFjayBiS0dECi0gICAgZnRiYm4wZzA0LnBuZyAgNC1iaXQgZ3JheXNjYWxlLCBibGFjayBiS0dECi0gICAgZnRiYm4yYzE2LnBuZyAxNi1iaXQgdHJ1ZWNvbG9yLCBibGFjayBiS0dECi0gICAgZnRiYm4zcDA4LnBuZyAgOC1iaXQgcGFsZXR0ZWQsIGJsYWNrIGJLR0QKLSAgICBmdGJnbjJjMTYucG5nIDE2LWJpdCB0cnVlY29sb3IsIGdyYXkgYktHRAotICAgIGZ0YmduM3AwOC5wbmcgIDgtYml0IHBhbGV0dGVkLCBncmF5IGJLR0QKLSAgICBmdGJybjJjMDgucG5nICA4LWJpdCB0cnVlY29sb3IsIHJlZCBiS0dECi0gICAgZnRid24wZzE2LnBuZyAxNi1iaXQgZ3JheSwgd2hpdGUgYktHRAotICAgIGZ0YnduM3AwOC5wbmcgIDgtYml0IHBhbGV0dGVkLCB3aGl0ZSBiS0dECi0gICAgZnRieW4zcDA4LnBuZyAgOC1iaXQgcGFsZXR0ZWQsIHllbGxvdyBiS0dECi0gICAgZnRwMG4wZzA4LnBuZyAgOC1iaXQgZ3JheXNjYWxlLCBvcGFxdWUKLSAgICBmdHAwbjJjMDgucG5nICA4LWJpdCB0cnVlY29sb3IsIG9wYXF1ZQotICAgIGZ0cDBuM3AwOC5wbmcgIDgtYml0IHBhbGV0dGVkLCBvcGFxdWUKLSAgICBmdHAxbjNwMDgucG5nICA4LWJpdCBwYWxldHRlZCwgbm8gYktHRAotCi1IZXJlIGlzIHRoZSBjb3JyZWN0IHJlc3VsdCBvZiB0eXBpbmcgInBuZ3Rlc3QgLW0gYmFzKi5wbmciIGluCi10aGlzIGRpcmVjdG9yeToKLQotVGVzdGluZyBiYXNuMGcwMS5wbmc6IFBBU1MgKDUyNCB6ZXJvIHNhbXBsZXMpCi0gRmlsdGVyIDAgd2FzIHVzZWQgMzIgdGltZXMKLVRlc3RpbmcgYmFzbjBnMDIucG5nOiBQQVNTICg0NDggemVybyBzYW1wbGVzKQotIEZpbHRlciAwIHdhcyB1c2VkIDMyIHRpbWVzCi1UZXN0aW5nIGJhc24wZzA0LnBuZzogUEFTUyAoNTIwIHplcm8gc2FtcGxlcykKLSBGaWx0ZXIgMCB3YXMgdXNlZCAzMiB0aW1lcwotVGVzdGluZyBiYXNuMGcwOC5wbmc6IFBBU1MgKDMgemVybyBzYW1wbGVzKQotIEZpbHRlciAxIHdhcyB1c2VkIDkgdGltZXMKLSBGaWx0ZXIgNCB3YXMgdXNlZCAyMyB0aW1lcwotVGVzdGluZyBiYXNuMGcxNi5wbmc6IFBBU1MgKDEgemVybyBzYW1wbGVzKQotIEZpbHRlciAxIHdhcyB1c2VkIDEgdGltZXMKLSBGaWx0ZXIgMiB3YXMgdXNlZCAzMSB0aW1lcwotVGVzdGluZyBiYXNuMmMwOC5wbmc6IFBBU1MgKDYgemVybyBzYW1wbGVzKQotIEZpbHRlciAxIHdhcyB1c2VkIDUgdGltZXMKLSBGaWx0ZXIgNCB3YXMgdXNlZCAyNyB0aW1lcwotVGVzdGluZyBiYXNuMmMxNi5wbmc6IFBBU1MgKDU5MiB6ZXJvIHNhbXBsZXMpCi0gRmlsdGVyIDEgd2FzIHVzZWQgMSB0aW1lcwotIEZpbHRlciA0IHdhcyB1c2VkIDMxIHRpbWVzCi1UZXN0aW5nIGJhc24zcDAxLnBuZzogUEFTUyAoNTEyIHplcm8gc2FtcGxlcykKLSBGaWx0ZXIgMCB3YXMgdXNlZCAzMiB0aW1lcwotVGVzdGluZyBiYXNuM3AwMi5wbmc6IFBBU1MgKDQ0OCB6ZXJvIHNhbXBsZXMpCi0gRmlsdGVyIDAgd2FzIHVzZWQgMzIgdGltZXMKLVRlc3RpbmcgYmFzbjNwMDQucG5nOiBQQVNTICg1NDQgemVybyBzYW1wbGVzKQotIEZpbHRlciAwIHdhcyB1c2VkIDMyIHRpbWVzCi1UZXN0aW5nIGJhc24zcDA4LnBuZzogUEFTUyAoNCB6ZXJvIHNhbXBsZXMpCi0gRmlsdGVyIDAgd2FzIHVzZWQgMzIgdGltZXMKLVRlc3RpbmcgYmFzbjRhMDgucG5nOiBQQVNTICgzMiB6ZXJvIHNhbXBsZXMpCi0gRmlsdGVyIDEgd2FzIHVzZWQgMSB0aW1lcwotIEZpbHRlciA0IHdhcyB1c2VkIDMxIHRpbWVzCi1UZXN0aW5nIGJhc240YTE2LnBuZzogUEFTUyAoNjQgemVybyBzYW1wbGVzKQotIEZpbHRlciAwIHdhcyB1c2VkIDEgdGltZXMKLSBGaWx0ZXIgMSB3YXMgdXNlZCAyIHRpbWVzCi0gRmlsdGVyIDIgd2FzIHVzZWQgMSB0aW1lcwotIEZpbHRlciA0IHdhcyB1c2VkIDI4IHRpbWVzCi1UZXN0aW5nIGJhc242YTA4LnBuZzogUEFTUyAoMTYwIHplcm8gc2FtcGxlcykKLSBGaWx0ZXIgMSB3YXMgdXNlZCAxIHRpbWVzCi0gRmlsdGVyIDQgd2FzIHVzZWQgMzEgdGltZXMKLVRlc3RpbmcgYmFzbjZhMTYucG5nOiBQQVNTICgxMDcyIHplcm8gc2FtcGxlcykKLSBGaWx0ZXIgMSB3YXMgdXNlZCA0IHRpbWVzCi0gRmlsdGVyIDQgd2FzIHVzZWQgMjggdGltZXMKLWxpYnBuZyBwYXNzZXMgdGVzdAotCi1XaWxsZW0gdmFuIFNjaGFpawotPHdpbGxlbUBzY2hhaWsuY29tPgotT2N0b2JlciAxOTk5CmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDEucG5nIGIvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMxZTFjNy4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAyLnBuZyBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ODA5ZGQuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwNC5wbmcgYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmEwODljLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDgucG5nIGIvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1MjJlZS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzE2LnBuZyBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcxNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOGViY2EuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzE2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMwOC5wbmcgYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjJjMDgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWQyZjkxLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMwOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjJjMTYucG5nIGIvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24yYzE2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJkNGE0ZC4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjJjMTYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAxLnBuZyBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMWRiNTkuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMi5wbmcgYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDBhYjYxLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDQucG5nIGIvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjNmVhYy4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA4LnBuZyBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMDdmNDguLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuNGEwOC5wbmcgYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjRhMDgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmIwZGQwLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuNGEwOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjRhMTYucG5nIGIvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc240YTE2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZWU5Zi4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjRhMTYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc242YTA4LnBuZyBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuNmEwOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMDYyMzAuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc242YTA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuNmExNi5wbmcgYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjZhMTYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWJmM2NiLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuNmExNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4wZzAxLnBuZyBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTc0NmZmLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwMi5wbmcgYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4wZzAyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4M2JkNi4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4wZzAyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDQucG5nIGIvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTcwNTAuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4yYzE2LnBuZyBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJibjJjMTYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDMxNjhlLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJibjJjMTYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YmJuM3AwOC5wbmcgYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4zcDA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVkZTM1Ny4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4zcDA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJnbjJjMTYucG5nIGIvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YmduMmMxNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1Y2VjMzkuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YmduMmMxNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvZnRiZ24zcDA4LnBuZyBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJnbjNwMDgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2YyZTZmLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJnbjNwMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YnJuMmMwOC5wbmcgYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvZnRicm4yYzA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjYTBkNi4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvZnRicm4yYzA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJ3bjBnMTYucG5nIGIvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YnduMGcxNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YmRlZWQuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YnduMGcxNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvZnRid24zcDA4LnBuZyBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJ3bjNwMDgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWNhYjdhLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJ3bjNwMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YnluM3AwOC5wbmcgYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvZnRieW4zcDA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU2ZGIwOS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvZnRieW4zcDA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdHAwbjBnMDgucG5nIGIvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0cDBuMGcwOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMzQ2NWYuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0cDBuMGcwOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvZnRwMG4yYzA4LnBuZyBiL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdHAwbjJjMDgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzZlNDJjLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdHAwbjJjMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0cDBuM3AwOC5wbmcgYi9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvZnRwMG4zcDA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlhNjllNS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvZnRwMG4zcDA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdHAxbjNwMDgucG5nIGIvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0cDFuM3AwOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YzlmMzUuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0cDFuM3AwOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9QbmdGaWxlLmMgYi9zcmMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9QbmdGaWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMDIxOWUuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvUG5nRmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIFBOR0ZJTEUuQyAtLSBJbWFnZSBGaWxlIEZ1bmN0aW9ucwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIENvcHlyaWdodCAyMDAwLCBXaWxsZW0gdmFuIFNjaGFpay4KLS8vCi0vLyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotLy8gRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotLy8gYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxjb21tZGxnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgInBuZy5oIgotI2luY2x1ZGUgInBuZ2ZpbGUuaCIKLSNpbmNsdWRlICJjZXhjZXB0LmgiCi0KLWRlZmluZV9leGNlcHRpb25fdHlwZShjb25zdCBjaGFyICopOwotZXh0ZXJuIHN0cnVjdCBleGNlcHRpb25fY29udGV4dCB0aGVfZXhjZXB0aW9uX2NvbnRleHRbMV07Ci1zdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgdGhlX2V4Y2VwdGlvbl9jb250ZXh0WzFdOwotcG5nX2NvbnN0X2NoYXJwIG1zZzsKLQotc3RhdGljIE9QRU5GSUxFTkFNRSBvZm47Ci0KLXN0YXRpYyBwbmdfc3RydWN0cCBwbmdfcHRyID0gTlVMTDsKLXN0YXRpYyBwbmdfaW5mb3AgaW5mb19wdHIgPSBOVUxMOwotCi0KLS8vIGNleGNlcHQgaW50ZXJmYWNlCi0KLXN0YXRpYyB2b2lkCi1wbmdfY2V4Y2VwdF9lcnJvcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbXNnKQotewotICAgaWYocG5nX3B0cikKLSAgICAgOwotI2lmZGVmIFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRAotICAgZnByaW50ZihzdGRlcnIsICJsaWJwbmcgZXJyb3I6ICVzXG4iLCBtc2cpOwotI2VuZGlmCi0gICB7Ci0gICAgICBUaHJvdyBtc2c7Ci0gICB9Ci19Ci0KLS8vIFdpbmRvd3Mgb3Blbi1maWxlIGZ1bmN0aW9ucwotCi12b2lkIFBuZ0ZpbGVJbml0aWFsaXplIChIV05EIGh3bmQpCi17Ci0gICAgc3RhdGljIFRDSEFSIHN6RmlsdGVyW10gPSBURVhUICgiUE5HIEZpbGVzICgqLlBORylcMCoucG5nXDAiKQotICAgICAgICBURVhUICgiQWxsIEZpbGVzICgqLiopXDAqLipcMFwwIik7Ci0KLSAgICBvZm4ubFN0cnVjdFNpemUgICAgICAgPSBzaXplb2YgKE9QRU5GSUxFTkFNRSk7Ci0gICAgb2ZuLmh3bmRPd25lciAgICAgICAgID0gaHduZDsKLSAgICBvZm4uaEluc3RhbmNlICAgICAgICAgPSBOVUxMOwotICAgIG9mbi5scHN0ckZpbHRlciAgICAgICA9IHN6RmlsdGVyOwotICAgIG9mbi5scHN0ckN1c3RvbUZpbHRlciA9IE5VTEw7Ci0gICAgb2ZuLm5NYXhDdXN0RmlsdGVyICAgID0gMDsKLSAgICBvZm4ubkZpbHRlckluZGV4ICAgICAgPSAwOwotICAgIG9mbi5scHN0ckZpbGUgICAgICAgICA9IE5VTEw7ICAgICAgICAgIC8vIFNldCBpbiBPcGVuIGFuZCBDbG9zZSBmdW5jdGlvbnMKLSAgICBvZm4ubk1heEZpbGUgICAgICAgICAgPSBNQVhfUEFUSDsKLSAgICBvZm4ubHBzdHJGaWxlVGl0bGUgICAgPSBOVUxMOyAgICAgICAgICAvLyBTZXQgaW4gT3BlbiBhbmQgQ2xvc2UgZnVuY3Rpb25zCi0gICAgb2ZuLm5NYXhGaWxlVGl0bGUgICAgID0gTUFYX1BBVEg7Ci0gICAgb2ZuLmxwc3RySW5pdGlhbERpciAgID0gTlVMTDsKLSAgICBvZm4ubHBzdHJUaXRsZSAgICAgICAgPSBOVUxMOwotICAgIG9mbi5GbGFncyAgICAgICAgICAgICA9IDA7ICAgICAgICAgICAgIC8vIFNldCBpbiBPcGVuIGFuZCBDbG9zZSBmdW5jdGlvbnMKLSAgICBvZm4ubkZpbGVPZmZzZXQgICAgICAgPSAwOwotICAgIG9mbi5uRmlsZUV4dGVuc2lvbiAgICA9IDA7Ci0gICAgb2ZuLmxwc3RyRGVmRXh0ICAgICAgID0gVEVYVCAoInBuZyIpOwotICAgIG9mbi5sQ3VzdERhdGEgICAgICAgICA9IDA7Ci0gICAgb2ZuLmxwZm5Ib29rICAgICAgICAgID0gTlVMTDsKLSAgICBvZm4ubHBUZW1wbGF0ZU5hbWUgICAgPSBOVUxMOwotfQotCi1CT09MIFBuZ0ZpbGVPcGVuRGxnIChIV05EIGh3bmQsIFBUU1RSIHBzdHJGaWxlTmFtZSwgUFRTVFIgcHN0clRpdGxlTmFtZSkKLXsKLSAgICBvZm4uaHduZE93bmVyICAgICAgICAgPSBod25kOwotICAgIG9mbi5scHN0ckZpbGUgICAgICAgICA9IHBzdHJGaWxlTmFtZTsKLSAgICBvZm4ubHBzdHJGaWxlVGl0bGUgICAgPSBwc3RyVGl0bGVOYW1lOwotICAgIG9mbi5GbGFncyAgICAgICAgICAgICA9IE9GTl9ISURFUkVBRE9OTFk7Ci0KLSAgICByZXR1cm4gR2V0T3BlbkZpbGVOYW1lICgmb2ZuKTsKLX0KLQotQk9PTCBQbmdGaWxlU2F2ZURsZyAoSFdORCBod25kLCBQVFNUUiBwc3RyRmlsZU5hbWUsIFBUU1RSIHBzdHJUaXRsZU5hbWUpCi17Ci0gICAgb2ZuLmh3bmRPd25lciAgICAgICAgID0gaHduZDsKLSAgICBvZm4ubHBzdHJGaWxlICAgICAgICAgPSBwc3RyRmlsZU5hbWU7Ci0gICAgb2ZuLmxwc3RyRmlsZVRpdGxlICAgID0gcHN0clRpdGxlTmFtZTsKLSAgICBvZm4uRmxhZ3MgICAgICAgICAgICAgPSBPRk5fSElERVJFQURPTkxZIHwgT0ZOX09WRVJXUklURVBST01QVDsKLQotICAgIHJldHVybiBHZXRTYXZlRmlsZU5hbWUgKCZvZm4pOwotfQotCi0vLyBQTkcgaW1hZ2UgaGFuZGxlciBmdW5jdGlvbnMKLQotQk9PTCBQbmdMb2FkSW1hZ2UgKFBUU1RSIHBzdHJGaWxlTmFtZSwgcG5nX2J5dGUgKipwcGJJbWFnZURhdGEsCi0gICAgICAgICAgICAgICAgICAgaW50ICpwaVdpZHRoLCBpbnQgKnBpSGVpZ2h0LCBpbnQgKnBpQ2hhbm5lbHMsIHBuZ19jb2xvciAqcEJrZ0NvbG9yKQotewotICAgIHN0YXRpYyBGSUxFICAgICAgICAqcGZGaWxlOwotICAgIHBuZ19ieXRlICAgICAgICAgICAgcGJTaWdbOF07Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpQml0RGVwdGg7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpQ29sb3JUeXBlOwotICAgIGRvdWJsZSAgICAgICAgICAgICAgZEdhbW1hOwotICAgIHBuZ19jb2xvcl8xNiAgICAgICAqcEJhY2tncm91bmQ7Ci0gICAgcG5nX3VpbnRfMzIgICAgICAgICB1bENoYW5uZWxzOwotICAgIHBuZ191aW50XzMyICAgICAgICAgdWxSb3dCeXRlczsKLSAgICBwbmdfYnl0ZSAgICAgICAgICAgKnBiSW1hZ2VEYXRhID0gKnBwYkltYWdlRGF0YTsKLSAgICBzdGF0aWMgcG5nX2J5dGUgICAqKnBwYlJvd1BvaW50ZXJzID0gTlVMTDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0KLSAgICAvLyBvcGVuIHRoZSBQTkcgaW5wdXQgZmlsZQotCi0gICAgaWYgKCFwc3RyRmlsZU5hbWUpCi0gICAgewotICAgICAgICAqcHBiSW1hZ2VEYXRhID0gcGJJbWFnZURhdGEgPSBOVUxMOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKCEocGZGaWxlID0gZm9wZW4ocHN0ckZpbGVOYW1lLCAicmIiKSkpCi0gICAgewotICAgICAgICAqcHBiSW1hZ2VEYXRhID0gcGJJbWFnZURhdGEgPSBOVUxMOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgLy8gZmlyc3QgY2hlY2sgdGhlIGVpZ2h0IGJ5dGUgUE5HIHNpZ25hdHVyZQotCi0gICAgZnJlYWQocGJTaWcsIDEsIDgsIHBmRmlsZSk7Ci0gICAgaWYgKHBuZ19zaWdfY21wKHBiU2lnLCAwLCA4KSkKLSAgICB7Ci0gICAgICAgICpwcGJJbWFnZURhdGEgPSBwYkltYWdlRGF0YSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAvLyBjcmVhdGUgdGhlIHR3byBwbmcoLWluZm8pIHN0cnVjdHVyZXMKLQotICAgIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgTlVMTCwKLSAgICAgIChwbmdfZXJyb3JfcHRyKXBuZ19jZXhjZXB0X2Vycm9yLCAocG5nX2Vycm9yX3B0cilOVUxMKTsKLSAgICBpZiAoIXBuZ19wdHIpCi0gICAgewotICAgICAgICAqcHBiSW1hZ2VEYXRhID0gcGJJbWFnZURhdGEgPSBOVUxMOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOwotICAgIGlmICghaW5mb19wdHIpCi0gICAgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgTlVMTCwgTlVMTCk7Ci0gICAgICAgICpwcGJJbWFnZURhdGEgPSBwYkltYWdlRGF0YSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBUcnkKLSAgICB7Ci0gICAgICAgIAotICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBwbmcgc3RydWN0dXJlCi0gICAgICAgIAotI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQKLSAgICAgICAgcG5nX2luaXRfaW8ocG5nX3B0ciwgcGZGaWxlKTsKLSNlbHNlCi0gICAgICAgIHBuZ19zZXRfcmVhZF9mbihwbmdfcHRyLCAocG5nX3ZvaWRwKXBmRmlsZSwgcG5nX3JlYWRfZGF0YSk7Ci0jZW5kaWYKLSAgICAgICAgCi0gICAgICAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIDgpOwotICAgICAgICAKLSAgICAgICAgLy8gcmVhZCBhbGwgUE5HIGluZm8gdXAgdG8gaW1hZ2UgZGF0YQotICAgICAgICAKLSAgICAgICAgcG5nX3JlYWRfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICAgICAgIAotICAgICAgICAvLyBnZXQgd2lkdGgsIGhlaWdodCwgYml0LWRlcHRoIGFuZCBjb2xvci10eXBlCi0gICAgICAgIAotICAgICAgICBwbmdfZ2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHBpV2lkdGgsIHBpSGVpZ2h0LCAmaUJpdERlcHRoLAotICAgICAgICAgICAgJmlDb2xvclR5cGUsIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgICAgICAKLSAgICAgICAgLy8gZXhwYW5kIGltYWdlcyBvZiBhbGwgY29sb3ItdHlwZSBhbmQgYml0LWRlcHRoIHRvIDN4OCBiaXQgUkdCIGltYWdlcwotICAgICAgICAvLyBsZXQgdGhlIGxpYnJhcnkgcHJvY2VzcyB0aGluZ3MgbGlrZSBhbHBoYSwgdHJhbnNwYXJlbmN5LCBiYWNrZ3JvdW5kCi0gICAgICAgIAotICAgICAgICBpZiAoaUJpdERlcHRoID09IDE2KQotICAgICAgICAgICAgcG5nX3NldF9zdHJpcF8xNihwbmdfcHRyKTsKLSAgICAgICAgaWYgKGlDb2xvclR5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgICAgICAgIHBuZ19zZXRfZXhwYW5kKHBuZ19wdHIpOwotICAgICAgICBpZiAoaUJpdERlcHRoIDwgOCkKLSAgICAgICAgICAgIHBuZ19zZXRfZXhwYW5kKHBuZ19wdHIpOwotICAgICAgICBpZiAocG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fdFJOUykpCi0gICAgICAgICAgICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsKLSAgICAgICAgaWYgKGlDb2xvclR5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSB8fAotICAgICAgICAgICAgaUNvbG9yVHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgICAgICAgICAgcG5nX3NldF9ncmF5X3RvX3JnYihwbmdfcHRyKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHNldCB0aGUgYmFja2dyb3VuZCBjb2xvciB0byBkcmF3IHRyYW5zcGFyZW50IGFuZCBhbHBoYSBpbWFnZXMgb3Zlci4KLSAgICAgICAgaWYgKHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJnBCYWNrZ3JvdW5kKSkKLSAgICAgICAgewotICAgICAgICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19wdHIsIHBCYWNrZ3JvdW5kLCBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFLCAxLCAxLjApOwotICAgICAgICAgICAgcEJrZ0NvbG9yLT5yZWQgICA9IChieXRlKSBwQmFja2dyb3VuZC0+cmVkOwotICAgICAgICAgICAgcEJrZ0NvbG9yLT5ncmVlbiA9IChieXRlKSBwQmFja2dyb3VuZC0+Z3JlZW47Ci0gICAgICAgICAgICBwQmtnQ29sb3ItPmJsdWUgID0gKGJ5dGUpIHBCYWNrZ3JvdW5kLT5ibHVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEJrZ0NvbG9yID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gaWYgcmVxdWlyZWQgc2V0IGdhbW1hIGNvbnZlcnNpb24KLSAgICAgICAgaWYgKHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmRHYW1tYSkpCi0gICAgICAgICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIChkb3VibGUpIDIuMiwgZEdhbW1hKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGFmdGVyIHRoZSB0cmFuc2Zvcm1hdGlvbnMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgdXBkYXRlIGluZm9fcHRyIGRhdGEKLSAgICAgICAgCi0gICAgICAgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGdldCBhZ2FpbiB3aWR0aCwgaGVpZ2h0IGFuZCB0aGUgbmV3IGJpdC1kZXB0aCBhbmQgY29sb3ItdHlwZQotICAgICAgICAKLSAgICAgICAgcG5nX2dldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCBwaVdpZHRoLCBwaUhlaWdodCwgJmlCaXREZXB0aCwKLSAgICAgICAgICAgICZpQ29sb3JUeXBlLCBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyByb3dfYnl0ZXMgaXMgdGhlIHdpZHRoIHggbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgIAotICAgICAgICB1bFJvd0J5dGVzID0gcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICAgICAgIHVsQ2hhbm5lbHMgPSBwbmdfZ2V0X2NoYW5uZWxzKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICAgICAgCi0gICAgICAgICpwaUNoYW5uZWxzID0gdWxDaGFubmVsczsKLSAgICAgICAgCi0gICAgICAgIC8vIG5vdyB3ZSBjYW4gYWxsb2NhdGUgbWVtb3J5IHRvIHN0b3JlIHRoZSBpbWFnZQotICAgICAgICAKLSAgICAgICAgaWYgKHBiSW1hZ2VEYXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlIChwYkltYWdlRGF0YSk7Ci0gICAgICAgICAgICBwYkltYWdlRGF0YSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChwYkltYWdlRGF0YSA9IChwbmdfYnl0ZSAqKSBtYWxsb2ModWxSb3dCeXRlcyAqICgqcGlIZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YocG5nX2J5dGUpKSkgPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJWaXN1YWwgUE5HOiBvdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgKnBwYkltYWdlRGF0YSA9IHBiSW1hZ2VEYXRhOwotICAgICAgICAKLSAgICAgICAgLy8gYW5kIGFsbG9jYXRlIG1lbW9yeSBmb3IgYW4gYXJyYXkgb2Ygcm93LXBvaW50ZXJzCi0gICAgICAgIAotICAgICAgICBpZiAoKHBwYlJvd1BvaW50ZXJzID0gKHBuZ19ieXRlcHApIG1hbGxvYygoKnBpSGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKHBuZ19ieXRlcCkpKSA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlZpc3VhbCBQTkc6IG91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gc2V0IHRoZSBpbmRpdmlkdWFsIHJvdy1wb2ludGVycyB0byBwb2ludCBhdCB0aGUgY29ycmVjdCBvZmZzZXRzCi0gICAgICAgIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKCpwaUhlaWdodCk7IGkrKykKLSAgICAgICAgICAgIHBwYlJvd1BvaW50ZXJzW2ldID0gcGJJbWFnZURhdGEgKyBpICogdWxSb3dCeXRlczsKLSAgICAgICAgCi0gICAgICAgIC8vIG5vdyB3ZSBjYW4gZ28gYWhlYWQgYW5kIGp1c3QgcmVhZCB0aGUgd2hvbGUgaW1hZ2UKLSAgICAgICAgCi0gICAgICAgIHBuZ19yZWFkX2ltYWdlKHBuZ19wdHIsIHBwYlJvd1BvaW50ZXJzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHJlYWQgdGhlIGFkZGl0aW9uYWwgY2h1bmtzIGluIHRoZSBQTkcgZmlsZSAobm90IHJlYWxseSBuZWVkZWQpCi0gICAgICAgIAotICAgICAgICBwbmdfcmVhZF9lbmQocG5nX3B0ciwgTlVMTCk7Ci0gICAgICAgIAotICAgICAgICAvLyBhbmQgd2UncmUgZG9uZQotICAgICAgICAKLSAgICAgICAgZnJlZSAocHBiUm93UG9pbnRlcnMpOwotICAgICAgICBwcGJSb3dQb2ludGVycyA9IE5VTEw7Ci0gICAgICAgIAotICAgICAgICAvLyB5ZXBwLCBkb25lCi0gICAgfQotCi0gICAgQ2F0Y2ggKG1zZykKLSAgICB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOwotCi0gICAgICAgICpwcGJJbWFnZURhdGEgPSBwYkltYWdlRGF0YSA9IE5VTEw7Ci0gICAgICAgIAotICAgICAgICBpZihwcGJSb3dQb2ludGVycykKLSAgICAgICAgICAgIGZyZWUgKHBwYlJvd1BvaW50ZXJzKTsKLQotICAgICAgICBmY2xvc2UocGZGaWxlKTsKLQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgZmNsb3NlIChwZkZpbGUpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotQk9PTCBQbmdTYXZlSW1hZ2UgKFBUU1RSIHBzdHJGaWxlTmFtZSwgcG5nX2J5dGUgKnBEaURhdGEsCi0gICAgICAgICAgICAgICAgICAgaW50IGlXaWR0aCwgaW50IGlIZWlnaHQsIHBuZ19jb2xvciBia2dDb2xvcikKLXsKLSAgICBjb25zdCBpbnQgICAgICAgICAgIGNpQml0RGVwdGggPSA4OwotICAgIGNvbnN0IGludCAgICAgICAgICAgY2lDaGFubmVscyA9IDM7Ci0KLSAgICBzdGF0aWMgRklMRSAgICAgICAgKnBmRmlsZTsKLSAgICBwbmdfdWludF8zMiAgICAgICAgIHVsUm93Qnl0ZXM7Ci0gICAgc3RhdGljIHBuZ19ieXRlICAgKipwcGJSb3dQb2ludGVycyA9IE5VTEw7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpOwotCi0gICAgLy8gb3BlbiB0aGUgUE5HIG91dHB1dCBmaWxlCi0KLSAgICBpZiAoIXBzdHJGaWxlTmFtZSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKCEocGZGaWxlID0gZm9wZW4ocHN0ckZpbGVOYW1lLCAid2IiKSkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIC8vIHByZXBhcmUgdGhlIHN0YW5kYXJkIFBORyBzdHJ1Y3R1cmVzCi0KLSAgICBwbmdfcHRyID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBOVUxMLAotICAgICAgKHBuZ19lcnJvcl9wdHIpcG5nX2NleGNlcHRfZXJyb3IsIChwbmdfZXJyb3JfcHRyKU5VTEwpOwotICAgIGlmICghcG5nX3B0cikKLSAgICB7Ci0gICAgICAgIGZjbG9zZShwZkZpbGUpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOwotICAgIGlmICghaW5mb19wdHIpIHsKLSAgICAgICAgZmNsb3NlKHBmRmlsZSk7Ci0gICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgKHBuZ19pbmZvcHApIE5VTEwpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgVHJ5Ci0gICAgewotICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBwbmcgc3RydWN0dXJlCi0gICAgICAgIAotI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQKLSAgICAgICAgcG5nX2luaXRfaW8ocG5nX3B0ciwgcGZGaWxlKTsKLSNlbHNlCi0gICAgICAgIHBuZ19zZXRfd3JpdGVfZm4ocG5nX3B0ciwgKHBuZ192b2lkcClwZkZpbGUsIHBuZ193cml0ZV9kYXRhLCBwbmdfZmx1c2gpOwotI2VuZGlmCi0gICAgICAgIAotICAgICAgICAvLyB3ZSdyZSBnb2luZyB0byB3cml0ZSBhIHZlcnkgc2ltcGxlIDN4OCBiaXQgUkdCIGltYWdlCi0gICAgICAgIAotICAgICAgICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIGlXaWR0aCwgaUhlaWdodCwgY2lCaXREZXB0aCwKLSAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQiwgUE5HX0lOVEVSTEFDRV9OT05FLCBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFLAotICAgICAgICAgICAgUE5HX0ZJTFRFUl9UWVBFX0JBU0UpOwotICAgICAgICAKLSAgICAgICAgLy8gd3JpdGUgdGhlIGZpbGUgaGVhZGVyIGluZm9ybWF0aW9uCi0gICAgICAgIAotICAgICAgICBwbmdfd3JpdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICAgICAgIAotICAgICAgICAvLyBzd2FwIHRoZSBCR1IgcGl4ZWxzIGluIHRoZSBEaURhdGEgc3RydWN0dXJlIHRvIFJHQgotICAgICAgICAKLSAgICAgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7Ci0gICAgICAgIAotICAgICAgICAvLyByb3dfYnl0ZXMgaXMgdGhlIHdpZHRoIHggbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgIAotICAgICAgICB1bFJvd0J5dGVzID0gaVdpZHRoICogY2lDaGFubmVsczsKLSAgICAgICAgCi0gICAgICAgIC8vIHdlIGNhbiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIGFycmF5IG9mIHJvdy1wb2ludGVycwotICAgICAgICAKLSAgICAgICAgaWYgKChwcGJSb3dQb2ludGVycyA9IChwbmdfYnl0ZXBwKSBtYWxsb2MoaUhlaWdodCAqIHNpemVvZihwbmdfYnl0ZXApKSkgPT0gTlVMTCkKLSAgICAgICAgICAgIFRocm93ICJWaXN1YWxwbmc6IE91dCBvZiBtZW1vcnkiOwotICAgICAgICAKLSAgICAgICAgLy8gc2V0IHRoZSBpbmRpdmlkdWFsIHJvdy1wb2ludGVycyB0byBwb2ludCBhdCB0aGUgY29ycmVjdCBvZmZzZXRzCi0gICAgICAgIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUhlaWdodDsgaSsrKQotICAgICAgICAgICAgcHBiUm93UG9pbnRlcnNbaV0gPSBwRGlEYXRhICsgaSAqICgoKHVsUm93Qnl0ZXMgKyAzKSA+PiAyKSA8PCAyKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHdyaXRlIG91dCB0aGUgZW50aXJlIGltYWdlIGRhdGEgaW4gb25lIGNhbGwKLSAgICAgICAgCi0gICAgICAgIHBuZ193cml0ZV9pbWFnZSAocG5nX3B0ciwgcHBiUm93UG9pbnRlcnMpOwotICAgICAgICAKLSAgICAgICAgLy8gd3JpdGUgdGhlIGFkZGl0aW9uYWwgY2h1bmtzIHRvIHRoZSBQTkcgZmlsZSAobm90IHJlYWxseSBuZWVkZWQpCi0gICAgICAgIAotICAgICAgICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGFuZCB3ZSdyZSBkb25lCi0gICAgICAgIAotICAgICAgICBmcmVlIChwcGJSb3dQb2ludGVycyk7Ci0gICAgICAgIHBwYlJvd1BvaW50ZXJzID0gTlVMTDsKLSAgICAgICAgCi0gICAgICAgIC8vIGNsZWFuIHVwIGFmdGVyIHRoZSB3cml0ZSwgYW5kIGZyZWUgYW55IG1lbW9yeSBhbGxvY2F0ZWQKLSAgICAgICAgCi0gICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgKHBuZ19pbmZvcHApIE5VTEwpOwotICAgICAgICAKLSAgICAgICAgLy8geWVwcCwgZG9uZQotICAgIH0KLQotICAgIENhdGNoIChtc2cpCi0gICAgewotICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsIChwbmdfaW5mb3BwKSBOVUxMKTsKLQotICAgICAgICBpZihwcGJSb3dQb2ludGVycykKLSAgICAgICAgICAgIGZyZWUgKHBwYlJvd1BvaW50ZXJzKTsKLQotICAgICAgICBmY2xvc2UocGZGaWxlKTsKLQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIAotICAgIGZjbG9zZSAocGZGaWxlKTsKLSAgICAKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotI2lmbmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECi0KLXN0YXRpYyB2b2lkCi1wbmdfcmVhZF9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIHBuZ19zaXplX3QgY2hlY2s7Ci0KLSAgIC8qIGZyZWFkKCkgcmV0dXJucyAwIG9uIGVycm9yLCBzbyBpdCBpcyBPSyB0byBzdG9yZSB0aGlzIGluIGEgcG5nX3NpemVfdAotICAgICogaW5zdGVhZCBvZiBhbiBpbnQsIHdoaWNoIGlzIHdoYXQgZnJlYWQoKSBhY3R1YWxseSByZXR1cm5zLgotICAgICovCi0gICBjaGVjayA9IChwbmdfc2l6ZV90KWZyZWFkKGRhdGEsIChwbmdfc2l6ZV90KTEsIGxlbmd0aCwKLSAgICAgIChGSUxFICopcG5nX3B0ci0+aW9fcHRyKTsKLQotICAgaWYgKGNoZWNrICE9IGxlbmd0aCkKLSAgIHsKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiUmVhZCBFcnJvciIpOwotICAgfQotfQotCi1zdGF0aWMgdm9pZAotcG5nX3dyaXRlX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQotewotICAgcG5nX3VpbnRfMzIgY2hlY2s7Ci0KLSAgIGNoZWNrID0gZndyaXRlKGRhdGEsIDEsIGxlbmd0aCwgKEZJTEUgKikocG5nX3B0ci0+aW9fcHRyKSk7Ci0gICBpZiAoY2hlY2sgIT0gbGVuZ3RoKQotICAgewotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJXcml0ZSBFcnJvciIpOwotICAgfQotfQotCi1zdGF0aWMgdm9pZAotcG5nX2ZsdXNoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBGSUxFICppb19wdHI7Ci0gICBpb19wdHIgPSAoRklMRSAqKUNWVF9QVFIoKHBuZ19wdHItPmlvX3B0cikpOwotICAgaWYgKGlvX3B0ciAhPSBOVUxMKQotICAgICAgZmZsdXNoKGlvX3B0cik7Ci19Ci0KLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgZW5kIG9mIHNvdXJjZQotLy8tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvUG5nRmlsZS5oIGIvc3JjL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvUG5nRmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzZiYmI0Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi92aXN1cG5nL1BuZ0ZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgUE5HRklMRS5IIC0tIEhlYWRlciBGaWxlIGZvciBwbmdmaWxlLmMKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIENvcHlyaWdodCAyMDAwLCBXaWxsZW0gdmFuIFNjaGFpay4KLQotLy8gVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLS8vIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLS8vIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotdm9pZCBQbmdGaWxlSW5pdGlhbGl6ZSAoSFdORCBod25kKSA7Ci1CT09MIFBuZ0ZpbGVPcGVuRGxnIChIV05EIGh3bmQsIFBUU1RSIHBzdHJGaWxlTmFtZSwgUFRTVFIgcHN0clRpdGxlTmFtZSkgOwotQk9PTCBQbmdGaWxlU2F2ZURsZyAoSFdORCBod25kLCBQVFNUUiBwc3RyRmlsZU5hbWUsIFBUU1RSIHBzdHJUaXRsZU5hbWUpIDsKLQotQk9PTCBQbmdMb2FkSW1hZ2UgKFBUU1RSIHBzdHJGaWxlTmFtZSwgcG5nX2J5dGUgKipwcGJJbWFnZURhdGEsIAotICAgICAgICAgICAgICAgICAgIGludCAqcGlXaWR0aCwgaW50ICpwaUhlaWdodCwgaW50ICpwaUNoYW5uZWxzLCBwbmdfY29sb3IgKnBCa2dDb2xvcik7Ci1CT09MIFBuZ1NhdmVJbWFnZSAoUFRTVFIgcHN0ckZpbGVOYW1lLCBwbmdfYnl0ZSAqcERpRGF0YSwKLSAgICAgICAgICAgICAgICAgICBpbnQgaVdpZHRoLCBpbnQgaUhlaWdodCwgcG5nX2NvbG9yIEJrZ0NvbG9yKTsKLQotI2lmbmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECi1zdGF0aWMgdm9pZCBwbmdfcmVhZF9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCk7Ci1zdGF0aWMgdm9pZCBwbmdfd3JpdGVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpOwotc3RhdGljIHZvaWQgcG5nX2ZsdXNoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpOwotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi92aXN1cG5nL1JFQURNRS50eHQgYi9zcmMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQ3MTE5Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi92aXN1cG5nL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1NaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwIGZvciBWaXN1YWxQbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3B5cmlnaHQgMjAwMCwgV2lsbGVtIHZhbiBTY2hhaWsuCi0KLVRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi1Gb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi1hbmQgbGljZW5zZSBpbiBwbmcuaAotCi1BcyBhIFBORyAuZGxsIGRlbW8gVmlzdWFsUG5nIGlzIGZpbmlzaGVkLiBNb3JlIGZlYXR1cmVzIHdvdWxkIG9ubHkgaGluZGVyCi10aGUgcHJvZ3JhbSdzIG9iamVjdGl2ZS4gSG93ZXZlciwgZnVydGhlciBleHRlbnNpb25zIChsaWtlIHN1cHBvcnQgZm9yIG90aGVyIAotZ3JhcGhpY3MgZm9ybWF0cykgYXJlIGluIGRldmVsb3BtZW50LiBUbyBnZXQgdGhlc2UsIG9yIGZvciBwcmUtY29tcGlsZWQgCi1iaW5hcmllcywgZ28gdG8gImh0dHA6Ly93d3cuc2NoYWlrLmNvbS9wbmcvdmlzdWFscG5nLmh0bWwiLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQXNzdW1lcyB0aGF0Ci0KLSAgIGxpYnBuZyBETExzIGFuZCBMSUJzIGFyZSBpbiAuLlwuLlxwcm9qZWN0c1xtc3ZjXHdpbjMyXGxpYnBuZwotICAgemxpYiBETExzIGFuZCBMSUJzIGFyZSBpbiAgIC4uXC4uXHByb2plY3RzXG1zdmNcd2luMzJcemxpYgotICAgbGlicG5nIGhlYWRlciBmaWxlcyBhcmUgaW4gIC4uXC4uXC4uXGxpYnBuZwotICAgemxpYiBoZWFkZXIgZmlsZXMgYXJlIGluICAgIC4uXC4uXC4uXHpsaWIKLSAgIHRoZSBwbmdzdWl0ZSBpbWFnZXMgYXJlIGluICAuLlxwbmdzdWl0ZQotCi1UbyBidWlsZDoKLQotMSkgT24gdGhlIG1haW4gbWVudSBTZWxlY3QgIkJ1aWxkfFNldCBBY3RpdmUgY29uZmlndXJhdGlvbiIuCi0gICBDaG9vc2UgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbGlicmFyeSB5b3Ugd2FudCB0byB0ZXN0LgotICAgVGhpcyBsaWJyYXJ5IG11c3QgaGF2ZSBiZWVuIGJ1aWx0IHVzaW5nIHRoZSBsaWJwbmcgTVMgcHJvamVjdCBsb2NhdGVkIGluCi0gICB0aGUgIi4uXC4uXG1zY3YiIHN1YmRpcmVjdG9yeS4KLQotMikgU2VsZWN0ICJCdWlsZHxDbGVhbiIKLQotMykgU2VsZWN0ICJCdWlsZHxSZWJ1aWxkIEFsbCIKLQotNCkgQWZ0ZXIgY29tcGlsaW5nIGFuZCBsaW5raW5nIFZpc3VhbFBuZyB3aWxsIGJlIHN0YXJ0ZWQgdG8gdmlldyBhbiBpbWFnZQotICAgZnJvbSB0aGUgUG5nU3VpdGUgZGlyZWN0b3J5LiAgUHJlc3MgQ3RybC1OIChhbmQgQ3RybC1WKSBmb3Igb3RoZXIgaW1hZ2VzLgotCi0KLVRvIGluc3RhbGw6Ci0KLVdoZW4gZGlzdHJpYnV0aW5nIFZpc3VhbFBuZyAob3IgYSBmdXJ0aGVyIGRldmVsb3BtZW50KSB0aGUgZm9sbG93aW5nIG9wdGlvbnMKLWFyZSBhdmFpbGFibGU6Ci0KLTEpIEJ1aWxkIHRoZSBwcm9ncmFtIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gIldpbjMyIExJQiIgYW5kIHlvdSBvbmx5IG5lZWQgdG8KLSAgIGluY2x1ZGUgdGhlIGV4ZWN1dGFibGUgZnJvbSB0aGUgLi9saWIgZGlyZWN0b3J5IGluIHlvdXIgZGlzdHJpYnV0aW9uLgotCi0yKSBCdWlsZCB0aGUgcHJvZ3JhbSB3aXRoIHRoZSBjb25maWd1cmF0aW9uICJXaW4zMiBETEwiIGFuZCB5b3UgbmVlZCB0byBwdXQKLSAgIGluIHlvdXIgZGlzdHJpYnV0aW9uIHRoZSBleGVjdXRhYmxlIGZyb20gdGhlIC4vZGxsIGRpcmVjdG9yeSBhbmQgdGhlIGRsbCdzCi0gICBsaWJwbmcxLmRsbCwgemxpYi5kbGwgYW5kIG1zdmNydC5kbGwuICBUaGVzZSBuZWVkIHRvIGJlIGluIHRoZSB1c2VyJ3MgUEFUSC4KLQotCi1XaWxsZW0gdmFuIFNjaGFpawotQ2FsZ2FyeSwgSnVuZSA2dGggMjAwMAotCi1QLlMuIFZpc3VhbFBuZyB3YXMgd3JpdHRlbiBiYXNlZCBvbiBwcmVsaW1pbmFyeSB3b3JrIG9mOgotCi0gICAgLSBTaW1vbi1QaWVycmUgQ2FkaWV1eAotICAgIC0gR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gICAgLSBHcmVnIFJvZWxvZnMKLQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmMgYi9zcmMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxODk5OS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDk2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIFZpc3VhbFBuZy5DIC0tIFNob3dzIGEgUE5HIGltYWdlCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBDb3B5cmlnaHQgMjAwMCwgV2lsbGVtIHZhbiBTY2hhaWsuCi0KLS8vIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0vLyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0vLyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0vLyBzd2l0Y2hlcwotCi0vLyBkZWZpbmVzCi0KLSNkZWZpbmUgUFJPR05BTUUgICJWaXN1YWxQbmciCi0jZGVmaW5lIExPTkdOQU1FICAiV2luMzIgVmlld2VyIGZvciBQTkctZmlsZXMiCi0jZGVmaW5lIFZFUlNJT04gICAiMS4wIG9mIDIwMDAgSnVuZSAwNyIKLQotLy8gY29uc3RhbnRzCi0KLSNkZWZpbmUgTUFSR0lOIDgKLQotLy8gc3RhbmRhcmQgaW5jbHVkZXMKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0vLyBhcHBsaWNhdGlvbiBpbmNsdWRlcwotCi0jaW5jbHVkZSAicG5nLmgiCi0jaW5jbHVkZSAicG5nZmlsZS5oIgotI2luY2x1ZGUgInJlc291cmNlLmgiCi0KLS8vIG1hY3JvcwotCi0vLyBmdW5jdGlvbiBwcm90b3R5cGVzCi0KLUxSRVNVTFQgQ0FMTEJBQ0sgV25kUHJvYyAoSFdORCwgVUlOVCwgV1BBUkFNLCBMUEFSQU0pOwotQk9PTCAgICBDQUxMQkFDSyBBYm91dERsZ1Byb2MgKEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNKSA7Ci0KLUJPT0wgQ2VudGVyQWJvdXQgKEhXTkQgaHduZENoaWxkLCBIV05EIGh3bmRQYXJlbnQpOwotCi1CT09MIEJ1aWxkUG5nTGlzdCAoUFRTVFIgcHN0clBhdGhOYW1lLCBUQ0hBUiAqKnBwRmlsZUxpc3QsIGludCAqcEZpbGVDb3VudCwKLSAgICAgICAgaW50ICpwRmlsZUluZGV4KTsKLQotQk9PTCBTZWFyY2hQbmdMaXN0IChUQ0hBUiAqcEZpbGVMaXN0LCBpbnQgRmlsZUNvdW50LCBpbnQgKnBGaWxlSW5kZXgsCi0gICAgICAgIFBUU1RSIHBzdHJQcmV2TmFtZSwgUFRTVFIgcHN0ck5leHROYW1lKTsKLQotQk9PTCBMb2FkSW1hZ2VGaWxlKEhXTkQgaHduZCwgUFRTVFIgcHN0clBhdGhOYW1lLAotICAgICAgICBwbmdfYnl0ZSAqKnBwYkltYWdlLCBpbnQgKnB4SW1nU2l6ZSwgaW50ICpweUltZ1NpemUsIGludCAqcGlDaGFubmVscywKLSAgICAgICAgcG5nX2NvbG9yICpwQmtnQ29sb3IpOwotCi1CT09MIERpc3BsYXlJbWFnZSAoSFdORCBod25kLCBCWVRFICoqcHBEaWIsCi0gICAgICAgIEJZVEUgKipwcERpRGF0YSwgaW50IGN4V2luU2l6ZSwgaW50IGN5V2luU2l6ZSwKLSAgICAgICAgQllURSAqcGJJbWFnZSwgaW50IGN4SW1nU2l6ZSwgaW50IGN5SW1nU2l6ZSwgaW50IGNJbWdDaGFubmVscywKLSAgICAgICAgQk9PTCBiU3RyZXRjaGVkKTsKLQotQk9PTCBJbml0Qml0bWFwICgKLSAgICAgICAgQllURSAqcERpRGF0YSwgaW50IGN4V2luU2l6ZSwgaW50IGN5V2luU2l6ZSk7Ci0KLUJPT0wgRmlsbEJpdG1hcCAoCi0gICAgICAgIEJZVEUgKnBEaURhdGEsIGludCBjeFdpblNpemUsIGludCBjeVdpblNpemUsCi0gICAgICAgIEJZVEUgKnBiSW1hZ2UsIGludCBjeEltZ1NpemUsIGludCBjeUltZ1NpemUsIGludCBjSW1nQ2hhbm5lbHMsCi0gICAgICAgIEJPT0wgYlN0cmV0Y2hlZCk7Ci0KLS8vIGEgZmV3IGdsb2JhbCB2YXJpYWJsZXMKLQotc3RhdGljIGNoYXIgKnN6UHJvZ05hbWUgPSBQUk9HTkFNRTsKLXN0YXRpYyBjaGFyICpzekFwcE5hbWUgPSBMT05HTkFNRTsKLXN0YXRpYyBjaGFyICpzekljb25OYW1lID0gUFJPR05BTUU7Ci1zdGF0aWMgY2hhciBzekNtZEZpbGVOYW1lIFtNQVhfUEFUSF07Ci0KLS8vIE1BSU4gcm91dGluZQotCi1pbnQgV0lOQVBJIFdpbk1haW4gKEhJTlNUQU5DRSBoSW5zdGFuY2UsIEhJTlNUQU5DRSBoUHJldkluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICBQU1RSIHN6Q21kTGluZSwgaW50IGlDbWRTaG93KQotewotICAgIEhBQ0NFTCAgIGhBY2NlbDsKLSAgICBIV05EICAgICBod25kOwotICAgIE1TRyAgICAgIG1zZzsKLSAgICBXTkRDTEFTUyB3bmRjbGFzczsKLSAgICBpbnQgaXhCb3JkZXJzLCBpeUJvcmRlcnM7Ci0KLSAgICB3bmRjbGFzcy5zdHlsZSAgICAgICAgID0gQ1NfSFJFRFJBVyB8IENTX1ZSRURSQVc7Ci0gICAgd25kY2xhc3MubHBmblduZFByb2MgICA9IFduZFByb2M7Ci0gICAgd25kY2xhc3MuY2JDbHNFeHRyYSAgICA9IDA7Ci0gICAgd25kY2xhc3MuY2JXbmRFeHRyYSAgICA9IDA7Ci0gICAgd25kY2xhc3MuaEluc3RhbmNlICAgICA9IGhJbnN0YW5jZTsKLSAgICB3bmRjbGFzcy5oSWNvbiAgICAgICAgID0gTG9hZEljb24gKGhJbnN0YW5jZSwgc3pJY29uTmFtZSkgOwotICAgIHduZGNsYXNzLmhDdXJzb3IgICAgICAgPSBMb2FkQ3Vyc29yIChOVUxMLCBJRENfQVJST1cpOwotICAgIHduZGNsYXNzLmhickJhY2tncm91bmQgPSBOVUxMOyAvLyAoSEJSVVNIKSBHZXRTdG9ja09iamVjdCAoR1JBWV9CUlVTSCk7Ci0gICAgd25kY2xhc3MubHBzek1lbnVOYW1lICA9IHN6UHJvZ05hbWU7Ci0gICAgd25kY2xhc3MubHBzekNsYXNzTmFtZSA9IHN6UHJvZ05hbWU7Ci0KLSAgICBpZiAoIVJlZ2lzdGVyQ2xhc3MgKCZ3bmRjbGFzcykpCi0gICAgewotICAgICAgICBNZXNzYWdlQm94IChOVUxMLCBURVhUICgiRXJyb3I6IHRoaXMgcHJvZ3JhbSByZXF1aXJlcyBXaW5kb3dzIE5UISIpLAotICAgICAgICAgICAgc3pQcm9nTmFtZSwgTUJfSUNPTkVSUk9SKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gaWYgZmlsZW5hbWUgZ2l2ZW4gb24gY29tbWFuZGxpbmUsIHN0b3JlIGl0Ci0gICAgaWYgKChzekNtZExpbmUgIT0gTlVMTCkgJiYgKCpzekNtZExpbmUgIT0gJ1wwJykpCi0gICAgICAgIGlmIChzekNtZExpbmVbMF0gPT0gJyInKQotICAgICAgICAgICAgc3RybmNweSAoc3pDbWRGaWxlTmFtZSwgc3pDbWRMaW5lICsgMSwgc3RybGVuKHN6Q21kTGluZSkgLSAyKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RyY3B5IChzekNtZEZpbGVOYW1lLCBzekNtZExpbmUpOwotICAgIGVsc2UKLSAgICAgICAgc3RyY3B5IChzekNtZEZpbGVOYW1lLCAiIik7Ci0KLSAgICAvLyBjYWxjdWxhdGUgc2l6ZSBvZiB3aW5kb3ctYm9yZGVycwotICAgIGl4Qm9yZGVycyA9IDIgKiAoR2V0U3lzdGVtTWV0cmljcyAoU01fQ1hCT1JERVIpICsKLSAgICAgICAgICAgICAgICAgICAgIEdldFN5c3RlbU1ldHJpY3MgKFNNX0NYRExHRlJBTUUpKTsKLSAgICBpeUJvcmRlcnMgPSAyICogKEdldFN5c3RlbU1ldHJpY3MgKFNNX0NZQk9SREVSKSArCi0gICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzIChTTV9DWURMR0ZSQU1FKSkgKwotICAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyAoU01fQ1lDQVBUSU9OKSArCi0gICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzIChTTV9DWU1FTlVTSVpFKSArCi0gICAgICAgICAgICAgICAgICAgICAxOyAvKiBXdlM6IGRvbid0IGFzayBtZSB3aHk/ICovCi0KLSAgICBod25kID0gQ3JlYXRlV2luZG93IChzelByb2dOYW1lLCBzekFwcE5hbWUsCi0gICAgICAgIFdTX09WRVJMQVBQRURXSU5ET1csCi0gICAgICAgIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsCi0gICAgICAgIDUxMiArIDIgKiBNQVJHSU4gKyBpeEJvcmRlcnMsIDM4NCArIDIgKiBNQVJHSU4gKyBpeUJvcmRlcnMsCi0vLyAgICAgIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsCi0gICAgICAgIE5VTEwsIE5VTEwsIGhJbnN0YW5jZSwgTlVMTCk7Ci0KLSAgICBTaG93V2luZG93IChod25kLCBpQ21kU2hvdyk7Ci0gICAgVXBkYXRlV2luZG93IChod25kKTsKLQotICAgIGhBY2NlbCA9IExvYWRBY2NlbGVyYXRvcnMgKGhJbnN0YW5jZSwgc3pQcm9nTmFtZSk7Ci0KLSAgICB3aGlsZSAoR2V0TWVzc2FnZSAoJm1zZywgTlVMTCwgMCwgMCkpCi0gICAgewotICAgICAgICBpZiAoIVRyYW5zbGF0ZUFjY2VsZXJhdG9yIChod25kLCBoQWNjZWwsICZtc2cpKQotICAgICAgICB7Ci0gICAgICAgICAgICBUcmFuc2xhdGVNZXNzYWdlICgmbXNnKTsKLSAgICAgICAgICAgIERpc3BhdGNoTWVzc2FnZSAoJm1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1zZy53UGFyYW07Ci19Ci0KLUxSRVNVTFQgQ0FMTEJBQ0sgV25kUHJvYyAoSFdORCBod25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sCi0gICAgICAgIExQQVJBTSBsUGFyYW0pCi17Ci0gICAgc3RhdGljIEhJTlNUQU5DRSAgICAgICAgICBoSW5zdGFuY2UgOwotICAgIHN0YXRpYyBIREMgICAgICAgICAgICAgICAgaGRjOwotICAgIHN0YXRpYyBQQUlOVFNUUlVDVCAgICAgICAgcHM7Ci0gICAgc3RhdGljIEhNRU5VICAgICAgICAgICAgICBoTWVudTsKLQotICAgIHN0YXRpYyBCSVRNQVBGSUxFSEVBREVSICAqcGJtZmg7Ci0gICAgc3RhdGljIEJJVE1BUElORk9IRUFERVIgICpwYm1paDsKLSAgICBzdGF0aWMgQllURSAgICAgICAgICAgICAgKnBiSW1hZ2U7Ci0gICAgc3RhdGljIGludCAgICAgICAgICAgICAgICBjeFdpblNpemUsIGN5V2luU2l6ZTsKLSAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICAgIGN4SW1nU2l6ZSwgY3lJbWdTaXplOwotICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgICAgY0ltZ0NoYW5uZWxzOwotICAgIHN0YXRpYyBwbmdfY29sb3IgICAgICAgICAgYmtnQ29sb3IgPSB7MTI3LCAxMjcsIDEyN307Ci0KLSAgICBzdGF0aWMgQk9PTCAgICAgICAgICAgICAgIGJTdHJldGNoZWQgPSBUUlVFOwotCi0gICAgc3RhdGljIEJZVEUgICAgICAgICAgICAgICpwRGliID0gTlVMTDsKLSAgICBzdGF0aWMgQllURSAgICAgICAgICAgICAgKnBEaURhdGEgPSBOVUxMOwotCi0gICAgc3RhdGljIFRDSEFSICAgICAgICAgICAgICBzekltZ1BhdGhOYW1lIFtNQVhfUEFUSF07Ci0gICAgc3RhdGljIFRDSEFSICAgICAgICAgICAgICBzelRpdGxlTmFtZSBbTUFYX1BBVEhdOwotCi0gICAgc3RhdGljIFRDSEFSICAgICAgICAgICAgICpwUG5nRmlsZUxpc3QgPSBOVUxMOwotICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgICAgaVBuZ0ZpbGVDb3VudDsKLSAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICAgIGlQbmdGaWxlSW5kZXg7Ci0KLSAgICBCT09MICAgICAgICAgICAgICAgICAgICAgIGJPazsKLQotICAgIHN3aXRjaCAobWVzc2FnZSkKLSAgICB7Ci0gICAgY2FzZSBXTV9DUkVBVEU6Ci0gICAgICAgIGhJbnN0YW5jZSA9ICgoTFBDUkVBVEVTVFJVQ1QpIGxQYXJhbSktPmhJbnN0YW5jZSA7Ci0gICAgICAgIFBuZ0ZpbGVJbml0aWFsaXplIChod25kKTsKLQotICAgICAgICBzdHJjcHkgKHN6SW1nUGF0aE5hbWUsICIiKTsKLQotICAgICAgICAvLyBpbiBjYXNlIHdlIHByb2Nlc3MgZmlsZSBnaXZlbiBvbiBjb21tYW5kLWxpbmUKLQotICAgICAgICBpZiAoc3pDbWRGaWxlTmFtZVswXSAhPSAnXDAnKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJjcHkgKHN6SW1nUGF0aE5hbWUsIHN6Q21kRmlsZU5hbWUpOwotCi0gICAgICAgICAgICAvLyByZWFkIHRoZSBvdGhlciBwbmctZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSBmb3IgbGF0ZXIKLSAgICAgICAgICAgIC8vIG5leHQvcHJldmlvdXMgY29tbWFuZHMKLQotICAgICAgICAgICAgQnVpbGRQbmdMaXN0IChzekltZ1BhdGhOYW1lLCAmcFBuZ0ZpbGVMaXN0LCAmaVBuZ0ZpbGVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmlQbmdGaWxlSW5kZXgpOwotCi0gICAgICAgICAgICAvLyBsb2FkIHRoZSBpbWFnZSBmcm9tIGZpbGUKLQotICAgICAgICAgICAgaWYgKCFMb2FkSW1hZ2VGaWxlIChod25kLCBzekltZ1BhdGhOYW1lLAotICAgICAgICAgICAgICAgICZwYkltYWdlLCAmY3hJbWdTaXplLCAmY3lJbWdTaXplLCAmY0ltZ0NoYW5uZWxzLCAmYmtnQ29sb3IpKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgICAvLyBpbnZhbGlkYXRlIHRoZSBjbGllbnQgYXJlYSBmb3IgbGF0ZXIgdXBkYXRlCi0KLSAgICAgICAgICAgIEludmFsaWRhdGVSZWN0IChod25kLCBOVUxMLCBUUlVFKTsKLQotICAgICAgICAgICAgLy8gZGlzcGxheSB0aGUgUE5HIGludG8gdGhlIERJQml0bWFwCi0KLSAgICAgICAgICAgIERpc3BsYXlJbWFnZSAoaHduZCwgJnBEaWIsICZwRGlEYXRhLCBjeFdpblNpemUsIGN5V2luU2l6ZSwKLSAgICAgICAgICAgICAgICBwYkltYWdlLCBjeEltZ1NpemUsIGN5SW1nU2l6ZSwgY0ltZ0NoYW5uZWxzLCBiU3RyZXRjaGVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBXTV9TSVpFOgotICAgICAgICBjeFdpblNpemUgPSBMT1dPUkQgKGxQYXJhbSk7Ci0gICAgICAgIGN5V2luU2l6ZSA9IEhJV09SRCAobFBhcmFtKTsKLQotICAgICAgICAvLyBpbnZhbGlkYXRlIHRoZSBjbGllbnQgYXJlYSBmb3IgbGF0ZXIgdXBkYXRlCi0KLSAgICAgICAgSW52YWxpZGF0ZVJlY3QgKGh3bmQsIE5VTEwsIFRSVUUpOwotCi0gICAgICAgIC8vIGRpc3BsYXkgdGhlIFBORyBpbnRvIHRoZSBESUJpdG1hcAotCi0gICAgICAgIERpc3BsYXlJbWFnZSAoaHduZCwgJnBEaWIsICZwRGlEYXRhLCBjeFdpblNpemUsIGN5V2luU2l6ZSwKLSAgICAgICAgICAgIHBiSW1hZ2UsIGN4SW1nU2l6ZSwgY3lJbWdTaXplLCBjSW1nQ2hhbm5lbHMsIGJTdHJldGNoZWQpOwotCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBXTV9JTklUTUVOVVBPUFVQOgotICAgICAgICBoTWVudSA9IEdldE1lbnUgKGh3bmQpOwotCi0gICAgICAgIGlmIChwYkltYWdlKQotICAgICAgICAgICAgRW5hYmxlTWVudUl0ZW0gKGhNZW51LCBJRE1fRklMRV9TQVZFLCBNRl9FTkFCTEVEKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgRW5hYmxlTWVudUl0ZW0gKGhNZW51LCBJRE1fRklMRV9TQVZFLCBNRl9HUkFZRUQpOwotCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBXTV9DT01NQU5EOgotICAgICAgICBoTWVudSA9IEdldE1lbnUgKGh3bmQpOwotCi0gICAgICAgIHN3aXRjaCAoTE9XT1JEICh3UGFyYW0pKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgSURNX0ZJTEVfT1BFTjoKLQotICAgICAgICAgICAgLy8gc2hvdyB0aGUgRmlsZSBPcGVuIGRpYWxvZyBib3gKLQotICAgICAgICAgICAgaWYgKCFQbmdGaWxlT3BlbkRsZyAoaHduZCwgc3pJbWdQYXRoTmFtZSwgc3pUaXRsZU5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgICAvLyByZWFkIHRoZSBvdGhlciBwbmctZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSBmb3IgbGF0ZXIKLSAgICAgICAgICAgIC8vIG5leHQvcHJldmlvdXMgY29tbWFuZHMKLQotICAgICAgICAgICAgQnVpbGRQbmdMaXN0IChzekltZ1BhdGhOYW1lLCAmcFBuZ0ZpbGVMaXN0LCAmaVBuZ0ZpbGVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmlQbmdGaWxlSW5kZXgpOwotCi0gICAgICAgICAgICAvLyBsb2FkIHRoZSBpbWFnZSBmcm9tIGZpbGUKLQotICAgICAgICAgICAgaWYgKCFMb2FkSW1hZ2VGaWxlIChod25kLCBzekltZ1BhdGhOYW1lLAotICAgICAgICAgICAgICAgICZwYkltYWdlLCAmY3hJbWdTaXplLCAmY3lJbWdTaXplLCAmY0ltZ0NoYW5uZWxzLCAmYmtnQ29sb3IpKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgICAvLyBpbnZhbGlkYXRlIHRoZSBjbGllbnQgYXJlYSBmb3IgbGF0ZXIgdXBkYXRlCi0KLSAgICAgICAgICAgIEludmFsaWRhdGVSZWN0IChod25kLCBOVUxMLCBUUlVFKTsKLQotICAgICAgICAgICAgLy8gZGlzcGxheSB0aGUgUE5HIGludG8gdGhlIERJQml0bWFwCi0KLSAgICAgICAgICAgIERpc3BsYXlJbWFnZSAoaHduZCwgJnBEaWIsICZwRGlEYXRhLCBjeFdpblNpemUsIGN5V2luU2l6ZSwKLSAgICAgICAgICAgICAgICBwYkltYWdlLCBjeEltZ1NpemUsIGN5SW1nU2l6ZSwgY0ltZ0NoYW5uZWxzLCBiU3RyZXRjaGVkKTsKLQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgY2FzZSBJRE1fRklMRV9TQVZFOgotCi0gICAgICAgICAgICAvLyBzaG93IHRoZSBGaWxlIFNhdmUgZGlhbG9nIGJveAotCi0gICAgICAgICAgICBpZiAoIVBuZ0ZpbGVTYXZlRGxnIChod25kLCBzekltZ1BhdGhOYW1lLCBzelRpdGxlTmFtZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgIC8vIHNhdmUgdGhlIFBORyB0byBhIGRpc2sgZmlsZQotCi0gICAgICAgICAgICBTZXRDdXJzb3IgKExvYWRDdXJzb3IgKE5VTEwsIElEQ19XQUlUKSk7Ci0gICAgICAgICAgICBTaG93Q3Vyc29yIChUUlVFKTsKLQotICAgICAgICAgICAgYk9rID0gUG5nU2F2ZUltYWdlIChzekltZ1BhdGhOYW1lLCBwRGlEYXRhLCBjeFdpblNpemUsIGN5V2luU2l6ZSwKLSAgICAgICAgICAgICAgICAgIGJrZ0NvbG9yKTsKLQotICAgICAgICAgICAgU2hvd0N1cnNvciAoRkFMU0UpOwotICAgICAgICAgICAgU2V0Q3Vyc29yIChMb2FkQ3Vyc29yIChOVUxMLCBJRENfQVJST1cpKTsKLQotICAgICAgICAgICAgaWYgKCFiT2spCi0gICAgICAgICAgICAgICAgTWVzc2FnZUJveCAoaHduZCwgVEVYVCAoIkVycm9yIGluIHNhdmluZyB0aGUgUE5HIGltYWdlIiksCi0gICAgICAgICAgICAgICAgc3pQcm9nTmFtZSwgTUJfSUNPTkVYQ0xBTUFUSU9OIHwgTUJfT0spOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgY2FzZSBJRE1fRklMRV9ORVhUOgotCi0gICAgICAgICAgICAvLyByZWFkIG5leHQgZW50cnkgaW4gdGhlIGRpcmVjdG9yeQotCi0gICAgICAgICAgICBpZiAoU2VhcmNoUG5nTGlzdCAocFBuZ0ZpbGVMaXN0LCBpUG5nRmlsZUNvdW50LCAmaVBuZ0ZpbGVJbmRleCwKLSAgICAgICAgICAgICAgICBOVUxMLCBzekltZ1BhdGhOYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wIChzekltZ1BhdGhOYW1lLCAiIikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgaW1hZ2UgZnJvbSBmaWxlCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCFMb2FkSW1hZ2VGaWxlIChod25kLCBzekltZ1BhdGhOYW1lLCAmcGJJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZjeEltZ1NpemUsICZjeUltZ1NpemUsICZjSW1nQ2hhbm5lbHMsICZia2dDb2xvcikpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGludmFsaWRhdGUgdGhlIGNsaWVudCBhcmVhIGZvciBsYXRlciB1cGRhdGUKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdCAoaHduZCwgTlVMTCwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gZGlzcGxheSB0aGUgUE5HIGludG8gdGhlIERJQml0bWFwCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgRGlzcGxheUltYWdlIChod25kLCAmcERpYiwgJnBEaURhdGEsIGN4V2luU2l6ZSwgY3lXaW5TaXplLAotICAgICAgICAgICAgICAgICAgICBwYkltYWdlLCBjeEltZ1NpemUsIGN5SW1nU2l6ZSwgY0ltZ0NoYW5uZWxzLCBiU3RyZXRjaGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgY2FzZSBJRE1fRklMRV9QUkVWSU9VUzoKLQotICAgICAgICAgICAgLy8gcmVhZCBwcmV2aW91cyBlbnRyeSBpbiB0aGUgZGlyZWN0b3J5Ci0KLSAgICAgICAgICAgIGlmIChTZWFyY2hQbmdMaXN0IChwUG5nRmlsZUxpc3QsIGlQbmdGaWxlQ291bnQsICZpUG5nRmlsZUluZGV4LAotICAgICAgICAgICAgICAgIHN6SW1nUGF0aE5hbWUsIE5VTEwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChzdHJjbXAgKHN6SW1nUGF0aE5hbWUsICIiKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSBpbWFnZSBmcm9tIGZpbGUKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoIUxvYWRJbWFnZUZpbGUgKGh3bmQsIHN6SW1nUGF0aE5hbWUsICZwYkltYWdlLCAmY3hJbWdTaXplLAotICAgICAgICAgICAgICAgICAgICAmY3lJbWdTaXplLCAmY0ltZ0NoYW5uZWxzLCAmYmtnQ29sb3IpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBpbnZhbGlkYXRlIHRoZSBjbGllbnQgYXJlYSBmb3IgbGF0ZXIgdXBkYXRlCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QgKGh3bmQsIE5VTEwsIFRSVUUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgdGhlIFBORyBpbnRvIHRoZSBESUJpdG1hcAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIERpc3BsYXlJbWFnZSAoaHduZCwgJnBEaWIsICZwRGlEYXRhLCBjeFdpblNpemUsIGN5V2luU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgcGJJbWFnZSwgY3hJbWdTaXplLCBjeUltZ1NpemUsIGNJbWdDaGFubmVscywgYlN0cmV0Y2hlZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgSURNX0ZJTEVfRVhJVDoKLQotICAgICAgICAgICAgLy8gbW9yZSBjbGVhbnVwIG5lZWRlZC4uLgotCi0gICAgICAgICAgICAvLyBmcmVlIGltYWdlIGJ1ZmZlcgotCi0gICAgICAgICAgICBpZiAocERpYiAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUgKHBEaWIpOwotICAgICAgICAgICAgICAgIHBEaWIgPSBOVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmcmVlIGZpbGUtbGlzdAotCi0gICAgICAgICAgICBpZiAocFBuZ0ZpbGVMaXN0ICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSAocFBuZ0ZpbGVMaXN0KTsKLSAgICAgICAgICAgICAgICBwUG5nRmlsZUxpc3QgPSBOVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBsZXQncyBnbyAuLi4KLQotICAgICAgICAgICAgZXhpdCAoMCk7Ci0KLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgSURNX09QVElPTlNfU1RSRVRDSDoKLSAgICAgICAgICAgIGJTdHJldGNoZWQgPSAhYlN0cmV0Y2hlZDsKLSAgICAgICAgICAgIGlmIChiU3RyZXRjaGVkKQotICAgICAgICAgICAgICAgIENoZWNrTWVudUl0ZW0gKGhNZW51LCBJRE1fT1BUSU9OU19TVFJFVENILCBNRl9DSEVDS0VEKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBDaGVja01lbnVJdGVtIChoTWVudSwgSURNX09QVElPTlNfU1RSRVRDSCwgTUZfVU5DSEVDS0VEKTsKLQotICAgICAgICAgICAgLy8gaW52YWxpZGF0ZSB0aGUgY2xpZW50IGFyZWEgZm9yIGxhdGVyIHVwZGF0ZQotCi0gICAgICAgICAgICBJbnZhbGlkYXRlUmVjdCAoaHduZCwgTlVMTCwgVFJVRSk7Ci0KLSAgICAgICAgICAgIC8vIGRpc3BsYXkgdGhlIFBORyBpbnRvIHRoZSBESUJpdG1hcAotCi0gICAgICAgICAgICBEaXNwbGF5SW1hZ2UgKGh3bmQsICZwRGliLCAmcERpRGF0YSwgY3hXaW5TaXplLCBjeVdpblNpemUsCi0gICAgICAgICAgICAgICAgcGJJbWFnZSwgY3hJbWdTaXplLCBjeUltZ1NpemUsIGNJbWdDaGFubmVscywgYlN0cmV0Y2hlZCk7Ci0KLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgSURNX0hFTFBfQUJPVVQ6Ci0gICAgICAgICAgICBEaWFsb2dCb3ggKGhJbnN0YW5jZSwgVEVYVCAoIkFib3V0Qm94IiksIGh3bmQsIEFib3V0RGxnUHJvYykgOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgfSAvLyBlbmQgc3dpdGNoCi0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFdNX1BBSU5UOgotICAgICAgICBoZGMgPSBCZWdpblBhaW50IChod25kLCAmcHMpOwotCi0gICAgICAgIGlmIChwRGliKQotICAgICAgICAgICAgU2V0RElCaXRzVG9EZXZpY2UgKGhkYywgMCwgMCwgY3hXaW5TaXplLCBjeVdpblNpemUsIDAsIDAsCi0gICAgICAgICAgICAgICAgMCwgY3lXaW5TaXplLCBwRGlEYXRhLCAoQklUTUFQSU5GTyAqKSBwRGliLCBESUJfUkdCX0NPTE9SUyk7Ci0KLSAgICAgICAgRW5kUGFpbnQgKGh3bmQsICZwcyk7Ci0gICAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBXTV9ERVNUUk9ZOgotICAgICAgICBpZiAocGJtZmgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUgKHBibWZoKTsKLSAgICAgICAgICAgIHBibWZoID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIFBvc3RRdWl0TWVzc2FnZSAoMCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBEZWZXaW5kb3dQcm9jIChod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7Ci19Ci0KLUJPT0wgQ0FMTEJBQ0sgQWJvdXREbGdQcm9jIChIV05EIGhEbGcsIFVJTlQgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICAgICBzd2l0Y2ggKG1lc3NhZ2UpCi0gICAgIHsKLSAgICAgY2FzZSBXTV9JTklURElBTE9HIDoKLSAgICAgICAgICBTaG93V2luZG93IChoRGxnLCBTV19ISURFKTsKLSAgICAgICAgICBDZW50ZXJBYm91dCAoaERsZywgR2V0V2luZG93IChoRGxnLCBHV19PV05FUikpOwotICAgICAgICAgIFNob3dXaW5kb3cgKGhEbGcsIFNXX1NIT1cpOwotICAgICAgICAgIHJldHVybiBUUlVFIDsKLQotICAgICBjYXNlIFdNX0NPTU1BTkQgOgotICAgICAgICAgIHN3aXRjaCAoTE9XT1JEICh3UGFyYW0pKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIElET0sgOgotICAgICAgICAgIGNhc2UgSURDQU5DRUwgOgotICAgICAgICAgICAgICAgRW5kRGlhbG9nIChoRGxnLCAwKSA7Ci0gICAgICAgICAgICAgICByZXR1cm4gVFJVRSA7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrIDsKLSAgICAgfQotICAgICByZXR1cm4gRkFMU0UgOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLQotLy8gIENlbnRlckFib3V0Ci0vLy0tLS0tLS0tLS0tLS0tLQotCi1CT09MIENlbnRlckFib3V0IChIV05EIGh3bmRDaGlsZCwgSFdORCBod25kUGFyZW50KQotewotICAgUkVDVCAgICByQ2hpbGQsIHJQYXJlbnQsIHJXb3JrQXJlYTsKLSAgIGludCAgICAgd0NoaWxkLCBoQ2hpbGQsIHdQYXJlbnQsIGhQYXJlbnQ7Ci0gICBpbnQgICAgIHhOZXcsIHlOZXc7Ci0gICBCT09MICBiUmVzdWx0OwotCi0gICAvLyBHZXQgdGhlIEhlaWdodCBhbmQgV2lkdGggb2YgdGhlIGNoaWxkIHdpbmRvdwotICAgR2V0V2luZG93UmVjdCAoaHduZENoaWxkLCAmckNoaWxkKTsKLSAgIHdDaGlsZCA9IHJDaGlsZC5yaWdodCAtIHJDaGlsZC5sZWZ0OwotICAgaENoaWxkID0gckNoaWxkLmJvdHRvbSAtIHJDaGlsZC50b3A7Ci0KLSAgIC8vIEdldCB0aGUgSGVpZ2h0IGFuZCBXaWR0aCBvZiB0aGUgcGFyZW50IHdpbmRvdwotICAgR2V0V2luZG93UmVjdCAoaHduZFBhcmVudCwgJnJQYXJlbnQpOwotICAgd1BhcmVudCA9IHJQYXJlbnQucmlnaHQgLSByUGFyZW50LmxlZnQ7Ci0gICBoUGFyZW50ID0gclBhcmVudC5ib3R0b20gLSByUGFyZW50LnRvcDsKLQotICAgLy8gR2V0IHRoZSBsaW1pdHMgb2YgdGhlICd3b3JrYXJlYScKLSAgIGJSZXN1bHQgPSBTeXN0ZW1QYXJhbWV0ZXJzSW5mbygKLSAgICAgIFNQSV9HRVRXT1JLQVJFQSwgIC8vIHN5c3RlbSBwYXJhbWV0ZXIgdG8gcXVlcnkgb3Igc2V0Ci0gICAgICBzaXplb2YoUkVDVCksCi0gICAgICAmcldvcmtBcmVhLAotICAgICAgMCk7Ci0gICBpZiAoIWJSZXN1bHQpIHsKLSAgICAgIHJXb3JrQXJlYS5sZWZ0ID0gcldvcmtBcmVhLnRvcCA9IDA7Ci0gICAgICByV29ya0FyZWEucmlnaHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKTsKLSAgICAgIHJXb3JrQXJlYS5ib3R0b20gPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKTsKLSAgIH0KLQotICAgLy8gQ2FsY3VsYXRlIG5ldyBYIHBvc2l0aW9uLCB0aGVuIGFkanVzdCBmb3Igd29ya2FyZWEKLSAgIHhOZXcgPSByUGFyZW50LmxlZnQgKyAoKHdQYXJlbnQgLSB3Q2hpbGQpIC8yKTsKLSAgIGlmICh4TmV3IDwgcldvcmtBcmVhLmxlZnQpIHsKLSAgICAgIHhOZXcgPSByV29ya0FyZWEubGVmdDsKLSAgIH0gZWxzZSBpZiAoKHhOZXcrd0NoaWxkKSA+IHJXb3JrQXJlYS5yaWdodCkgewotICAgICAgeE5ldyA9IHJXb3JrQXJlYS5yaWdodCAtIHdDaGlsZDsKLSAgIH0KLQotICAgLy8gQ2FsY3VsYXRlIG5ldyBZIHBvc2l0aW9uLCB0aGVuIGFkanVzdCBmb3Igd29ya2FyZWEKLSAgIHlOZXcgPSByUGFyZW50LnRvcCAgKyAoKGhQYXJlbnQgLSBoQ2hpbGQpIC8yKTsKLSAgIGlmICh5TmV3IDwgcldvcmtBcmVhLnRvcCkgewotICAgICAgeU5ldyA9IHJXb3JrQXJlYS50b3A7Ci0gICB9IGVsc2UgaWYgKCh5TmV3K2hDaGlsZCkgPiByV29ya0FyZWEuYm90dG9tKSB7Ci0gICAgICB5TmV3ID0gcldvcmtBcmVhLmJvdHRvbSAtIGhDaGlsZDsKLSAgIH0KLQotICAgLy8gU2V0IGl0LCBhbmQgcmV0dXJuCi0gICByZXR1cm4gU2V0V2luZG93UG9zIChod25kQ2hpbGQsIE5VTEwsIHhOZXcsIHlOZXcsIDAsIDAsIFNXUF9OT1NJWkUgfAotICAgICAgICAgIFNXUF9OT1pPUkRFUik7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLQotLy8gIEJ1aWxkUG5nTGlzdAotLy8tLS0tLS0tLS0tLS0tLS0tCi0KLUJPT0wgQnVpbGRQbmdMaXN0IChQVFNUUiBwc3RyUGF0aE5hbWUsIFRDSEFSICoqcHBGaWxlTGlzdCwgaW50ICpwRmlsZUNvdW50LAotICAgICBpbnQgKnBGaWxlSW5kZXgpCi17Ci0gICAgc3RhdGljIFRDSEFSICAgICAgICAgICAgICBzekltZ1BhdGhOYW1lIFtNQVhfUEFUSF07Ci0gICAgc3RhdGljIFRDSEFSICAgICAgICAgICAgICBzekltZ0ZpbGVOYW1lIFtNQVhfUEFUSF07Ci0gICAgc3RhdGljIFRDSEFSICAgICAgICAgICAgICBzekltZ0ZpbmROYW1lIFtNQVhfUEFUSF07Ci0KLSAgICBXSU4zMl9GSU5EX0RBVEEgICAgICAgICAgIGZpbmRkYXRhOwotICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgICAgaEZpbmQ7Ci0KLSAgICBzdGF0aWMgVENIQVIgICAgICAgICAgICAgIHN6VG1wIFtNQVhfUEFUSF07Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICBiT2s7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBpLCBpaTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGosIGpqOwotCi0gICAgLy8gZnJlZSBwcmV2aW91cyBmaWxlLWxpc3QKLQotICAgIGlmICgqcHBGaWxlTGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSAoKnBwRmlsZUxpc3QpOwotICAgICAgICAqcHBGaWxlTGlzdCA9IE5VTEw7Ci0gICAgfQotCi0gICAgLy8gZXh0cmFjdCBmb2xkZXJuYW1lLCBmaWxlbmFtZSBhbmQgc2VhcmNoLW5hbWUKLQotICAgIHN0cmNweSAoc3pJbWdQYXRoTmFtZSwgcHN0clBhdGhOYW1lKTsKLSAgICBzdHJjcHkgKHN6SW1nRmlsZU5hbWUsIHN0cnJjaHIgKHBzdHJQYXRoTmFtZSwgJ1xcJykgKyAxKTsKLQotICAgIHN0cmNweSAoc3pJbWdGaW5kTmFtZSwgc3pJbWdQYXRoTmFtZSk7Ci0gICAgKihzdHJyY2hyIChzekltZ0ZpbmROYW1lLCAnXFwnKSArIDEpID0gJ1wwJzsKLSAgICBzdHJjYXQgKHN6SW1nRmluZE5hbWUsICIqLnBuZyIpOwotCi0gICAgLy8gZmlyc3QgY3ljbGU6IGNvdW50IG51bWJlciBvZiBmaWxlcyBpbiBkaXJlY3RvcnkgZm9yIG1lbW9yeSBhbGxvY2F0aW9uCi0KLSAgICAqcEZpbGVDb3VudCA9IDA7Ci0KLSAgICBoRmluZCA9IEZpbmRGaXJzdEZpbGUoc3pJbWdGaW5kTmFtZSwgJmZpbmRkYXRhKTsKLSAgICBiT2sgPSAoaEZpbmQgIT0gKEhBTkRMRSkgLTEpOwotCi0gICAgd2hpbGUgKGJPaykKLSAgICB7Ci0gICAgICAgICpwRmlsZUNvdW50ICs9IDE7Ci0gICAgICAgIGJPayA9IEZpbmROZXh0RmlsZShoRmluZCwgJmZpbmRkYXRhKTsKLSAgICB9Ci0gICAgRmluZENsb3NlKGhGaW5kKTsKLQotICAgIC8vIGFsbG9jYXRpb24gbWVtb3J5IGZvciBmaWxlLWxpc3QKLQotICAgICpwcEZpbGVMaXN0ID0gKFRDSEFSICopIG1hbGxvYyAoKnBGaWxlQ291bnQgKiBNQVhfUEFUSCk7Ci0KLSAgICAvLyBzZWNvbmQgY3ljbGU6IHJlYWQgZGlyZWN0b3J5IGFuZCBzdG9yZSBmaWxlbmFtZXMgaW4gZmlsZS1saXN0Ci0KLSAgICBoRmluZCA9IEZpbmRGaXJzdEZpbGUoc3pJbWdGaW5kTmFtZSwgJmZpbmRkYXRhKTsKLSAgICBiT2sgPSAoaEZpbmQgIT0gKEhBTkRMRSkgLTEpOwotCi0gICAgaSA9IDA7Ci0gICAgaWkgPSAwOwotICAgIHdoaWxlIChiT2spCi0gICAgewotICAgICAgICBzdHJjcHkgKCpwcEZpbGVMaXN0ICsgaWksIHN6SW1nUGF0aE5hbWUpOwotICAgICAgICBzdHJjcHkgKHN0cnJjaHIoKnBwRmlsZUxpc3QgKyBpaSwgJ1xcJykgKyAxLCBmaW5kZGF0YS5jRmlsZU5hbWUpOwotCi0gICAgICAgIGlmIChzdHJjbXAocHN0clBhdGhOYW1lLCAqcHBGaWxlTGlzdCArIGlpKSA9PSAwKQotICAgICAgICAgICAgKnBGaWxlSW5kZXggPSBpOwotCi0gICAgICAgIGlpICs9IE1BWF9QQVRIOwotICAgICAgICBpKys7Ci0KLSAgICAgICAgYk9rID0gRmluZE5leHRGaWxlKGhGaW5kLCAmZmluZGRhdGEpOwotICAgIH0KLSAgICBGaW5kQ2xvc2UoaEZpbmQpOwotCi0gICAgLy8gZmluYWxseSB3ZSBtdXN0IHNvcnQgdGhlIGZpbGUtbGlzdAotCi0gICAgZm9yIChpID0gMDsgaSA8ICpwRmlsZUNvdW50IC0gMTsgaSsrKQotICAgIHsKLSAgICAgICAgaWkgPSBpICogTUFYX1BBVEg7Ci0gICAgICAgIGZvciAoaiA9IGkrMTsgaiA8ICpwRmlsZUNvdW50OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGpqID0gaiAqIE1BWF9QQVRIOwotICAgICAgICAgICAgaWYgKHN0cmNtcCAoKnBwRmlsZUxpc3QgKyBpaSwgKnBwRmlsZUxpc3QgKyBqaikgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmNweSAoc3pUbXAsICpwcEZpbGVMaXN0ICsgamopOwotICAgICAgICAgICAgICAgIHN0cmNweSAoKnBwRmlsZUxpc3QgKyBqaiwgKnBwRmlsZUxpc3QgKyBpaSk7Ci0gICAgICAgICAgICAgICAgc3RyY3B5ICgqcHBGaWxlTGlzdCArIGlpLCBzelRtcCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGlzIHdhcyB0aGUgY3VycmVudCBpbWFnZSB0aGF0IHdlIG1vdmVkCi0KLSAgICAgICAgICAgICAgICBpZiAoKnBGaWxlSW5kZXggPT0gaSkKLSAgICAgICAgICAgICAgICAgICAgKnBGaWxlSW5kZXggPSBqOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKCpwRmlsZUluZGV4ID09IGopCi0gICAgICAgICAgICAgICAgICAgICAgICAqcEZpbGVJbmRleCA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tCi0vLyAgU2VhcmNoUG5nTGlzdAotLy8tLS0tLS0tLS0tLS0tLS0tCi0KLUJPT0wgU2VhcmNoUG5nTGlzdCAoCi0gICAgICAgIFRDSEFSICpwRmlsZUxpc3QsIGludCBGaWxlQ291bnQsIGludCAqcEZpbGVJbmRleCwKLSAgICAgICAgUFRTVFIgcHN0clByZXZOYW1lLCBQVFNUUiBwc3RyTmV4dE5hbWUpCi17Ci0gICAgaWYgKEZpbGVDb3VudCA+IDApCi0gICAgewotICAgICAgICAvLyBnZXQgcHJldmlvdXMgZW50cnkKLSAgICAgICAgCi0gICAgICAgIGlmIChwc3RyUHJldk5hbWUgIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCpwRmlsZUluZGV4ID4gMCkKLSAgICAgICAgICAgICAgICAqcEZpbGVJbmRleCAtPSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICpwRmlsZUluZGV4ID0gRmlsZUNvdW50IC0gMTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3RyY3B5IChwc3RyUHJldk5hbWUsIHBGaWxlTGlzdCArICgqcEZpbGVJbmRleCAqIE1BWF9QQVRIKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGdldCBuZXh0IGVudHJ5Ci0gICAgICAgIAotICAgICAgICBpZiAocHN0ck5leHROYW1lICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgqcEZpbGVJbmRleCA8IEZpbGVDb3VudCAtIDEpCi0gICAgICAgICAgICAgICAgKnBGaWxlSW5kZXggKz0gMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqcEZpbGVJbmRleCA9IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN0cmNweSAocHN0ck5leHROYW1lLCBwRmlsZUxpc3QgKyAoKnBGaWxlSW5kZXggKiBNQVhfUEFUSCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLQotLy8gIExvYWRJbWFnZUZpbGUKLS8vLS0tLS0tLS0tLS0tLS0tLS0KLQotQk9PTCBMb2FkSW1hZ2VGaWxlIChIV05EIGh3bmQsIFBUU1RSIHBzdHJQYXRoTmFtZSwKLSAgICAgICAgICAgICAgICBwbmdfYnl0ZSAqKnBwYkltYWdlLCBpbnQgKnB4SW1nU2l6ZSwgaW50ICpweUltZ1NpemUsCi0gICAgICAgICAgICAgICAgaW50ICpwaUNoYW5uZWxzLCBwbmdfY29sb3IgKnBCa2dDb2xvcikKLXsKLSAgICBzdGF0aWMgVENIQVIgc3pUbXAgW01BWF9QQVRIXTsKLQotICAgIC8vIGlmIHRoZXJlJ3MgYW4gZXhpc3RpbmcgUE5HLCBmcmVlIHRoZSBtZW1vcnkKLQotICAgIGlmICgqcHBiSW1hZ2UpCi0gICAgewotICAgICAgICBmcmVlICgqcHBiSW1hZ2UpOwotICAgICAgICAqcHBiSW1hZ2UgPSBOVUxMOwotICAgIH0KLQotICAgIC8vIExvYWQgdGhlIGVudGlyZSBQTkcgaW50byBtZW1vcnkKLQotICAgIFNldEN1cnNvciAoTG9hZEN1cnNvciAoTlVMTCwgSURDX1dBSVQpKTsKLSAgICBTaG93Q3Vyc29yIChUUlVFKTsKLQotICAgIFBuZ0xvYWRJbWFnZSAocHN0clBhdGhOYW1lLCBwcGJJbWFnZSwgcHhJbWdTaXplLCBweUltZ1NpemUsIHBpQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICBwQmtnQ29sb3IpOwotCi0gICAgU2hvd0N1cnNvciAoRkFMU0UpOwotICAgIFNldEN1cnNvciAoTG9hZEN1cnNvciAoTlVMTCwgSURDX0FSUk9XKSk7Ci0KLSAgICBpZiAoKnBwYkltYWdlICE9IE5VTEwpCi0gICAgewotICAgICAgICBzcHJpbnRmIChzelRtcCwgIlZpc3VhbFBuZyAtICVzIiwgc3RycmNocihwc3RyUGF0aE5hbWUsICdcXCcpICsgMSk7Ci0gICAgICAgIFNldFdpbmRvd1RleHQgKGh3bmQsIHN6VG1wKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTWVzc2FnZUJveCAoaHduZCwgVEVYVCAoIkVycm9yIGluIGxvYWRpbmcgdGhlIFBORyBpbWFnZSIpLAotICAgICAgICAgICAgc3pQcm9nTmFtZSwgTUJfSUNPTkVYQ0xBTUFUSU9OIHwgTUJfT0spOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLQotLy8gIERpc3BsYXlJbWFnZQotLy8tLS0tLS0tLS0tLS0tLS0tCi0KLUJPT0wgRGlzcGxheUltYWdlIChIV05EIGh3bmQsIEJZVEUgKipwcERpYiwKLSAgICAgICAgQllURSAqKnBwRGlEYXRhLCBpbnQgY3hXaW5TaXplLCBpbnQgY3lXaW5TaXplLAotICAgICAgICBCWVRFICpwYkltYWdlLCBpbnQgY3hJbWdTaXplLCBpbnQgY3lJbWdTaXplLCBpbnQgY0ltZ0NoYW5uZWxzLAotICAgICAgICBCT09MIGJTdHJldGNoZWQpCi17Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgKnBEaWIgPSAqcHBEaWI7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgKnBEaURhdGEgPSAqcHBEaURhdGE7Ci0gICAgLy8gQklUTUFQRklMRUhFQURFUiAgICAgICAgKnBibWZoOwotICAgIEJJVE1BUElORk9IRUFERVIgICAgICAgICAgICpwYm1paDsKLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgd0RJUm93Qnl0ZXM7Ci0gICAgcG5nX2NvbG9yICAgICAgICAgICAgICAgICAgIGJrZ0JsYWNrID0gezAsIDAsIDB9OwotICAgIHBuZ19jb2xvciAgICAgICAgICAgICAgICAgICBia2dHcmF5ICA9IHsxMjcsIDEyNywgMTI3fTsKLSAgICBwbmdfY29sb3IgICAgICAgICAgICAgICAgICAgYmtnV2hpdGUgPSB7MjU1LCAyNTUsIDI1NX07Ci0KLSAgICAvLyBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBEZXZpY2UgSW5kZXBlbmRhbnQgYml0bWFwCi0KLSAgICB3RElSb3dCeXRlcyA9IChXT1JEKSAoKDMgKiBjeFdpblNpemUgKyAzTCkgPj4gMikgPDwgMjsKLQotICAgIGlmIChwRGliKQotICAgIHsKLSAgICAgICAgZnJlZSAocERpYik7Ci0gICAgICAgIHBEaWIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmICghKHBEaWIgPSAoQllURSAqKSBtYWxsb2MgKHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSArCi0gICAgICAgIHdESVJvd0J5dGVzICogY3lXaW5TaXplKSkpCi0gICAgewotICAgICAgICBNZXNzYWdlQm94IChod25kLCBURVhUICgiRXJyb3IgaW4gZGlzcGxheWluZyB0aGUgUE5HIGltYWdlIiksCi0gICAgICAgICAgICBzelByb2dOYW1lLCBNQl9JQ09ORVhDTEFNQVRJT04gfCBNQl9PSyk7Ci0gICAgICAgICpwcERpYiA9IHBEaWIgPSBOVUxMOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgICpwcERpYiA9IHBEaWI7Ci0gICAgbWVtc2V0IChwRGliLCAwLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOwotCi0gICAgLy8gaW5pdGlhbGl6ZSB0aGUgZGliLXN0cnVjdHVyZQotCi0gICAgcGJtaWggPSAoQklUTUFQSU5GT0hFQURFUiAqKSBwRGliOwotICAgIHBibWloLT5iaVNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7Ci0gICAgcGJtaWgtPmJpV2lkdGggPSBjeFdpblNpemU7Ci0gICAgcGJtaWgtPmJpSGVpZ2h0ID0gLSgobG9uZykgY3lXaW5TaXplKTsKLSAgICBwYm1paC0+YmlQbGFuZXMgPSAxOwotICAgIHBibWloLT5iaUJpdENvdW50ID0gMjQ7Ci0gICAgcGJtaWgtPmJpQ29tcHJlc3Npb24gPSAwOwotICAgIHBEaURhdGEgPSBwRGliICsgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotICAgICpwcERpRGF0YSA9IHBEaURhdGE7Ci0KLSAgICAvLyBmaXJzdCBmaWxsIGJpdG1hcCB3aXRoIGdyYXkgYW5kIGltYWdlIGJvcmRlcgotCi0gICAgSW5pdEJpdG1hcCAocERpRGF0YSwgY3hXaW5TaXplLCBjeVdpblNpemUpOwotCi0gICAgLy8gdGhlbiBmaWxsIGJpdG1hcCB3aXRoIGltYWdlCi0KLSAgICBpZiAocGJJbWFnZSkKLSAgICB7Ci0gICAgICAgIEZpbGxCaXRtYXAgKAotICAgICAgICAgICAgcERpRGF0YSwgY3hXaW5TaXplLCBjeVdpblNpemUsCi0gICAgICAgICAgICBwYkltYWdlLCBjeEltZ1NpemUsIGN5SW1nU2l6ZSwgY0ltZ0NoYW5uZWxzLAotICAgICAgICAgICAgYlN0cmV0Y2hlZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0KLS8vICBJbml0Qml0bWFwCi0vLy0tLS0tLS0tLS0tLS0tCi0KLUJPT0wgSW5pdEJpdG1hcCAoQllURSAqcERpRGF0YSwgaW50IGN4V2luU2l6ZSwgaW50IGN5V2luU2l6ZSkKLXsKLSAgICBCWVRFICpkc3Q7Ci0gICAgaW50IHgsIHksIGNvbDsKLQotICAgIC8vIGluaXRpYWxpemUgdGhlIGJhY2tncm91bmQgd2l0aCBncmF5Ci0KLSAgICBkc3QgPSBwRGlEYXRhOwotICAgIGZvciAoeSA9IDA7IHkgPCBjeVdpblNpemU7IHkrKykKLSAgICB7Ci0gICAgICAgIGNvbCA9IDA7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCBjeFdpblNpemU7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZmlsbCB3aXRoIEdSQVkKLSAgICAgICAgICAgICpkc3QrKyA9IDEyNzsKLSAgICAgICAgICAgICpkc3QrKyA9IDEyNzsKLSAgICAgICAgICAgICpkc3QrKyA9IDEyNzsKLSAgICAgICAgICAgIGNvbCArPSAzOwotICAgICAgICB9Ci0gICAgICAgIC8vIHJvd3Mgc3RhcnQgb24gNCBieXRlIGJvdW5kYXJpZXMKLSAgICAgICAgd2hpbGUgKChjb2wgJSA0KSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBkc3QrKzsKLSAgICAgICAgICAgIGNvbCsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0KLS8vICBGaWxsQml0bWFwCi0vLy0tLS0tLS0tLS0tLS0tCi0KLUJPT0wgRmlsbEJpdG1hcCAoCi0gICAgICAgIEJZVEUgKnBEaURhdGEsIGludCBjeFdpblNpemUsIGludCBjeVdpblNpemUsCi0gICAgICAgIEJZVEUgKnBiSW1hZ2UsIGludCBjeEltZ1NpemUsIGludCBjeUltZ1NpemUsIGludCBjSW1nQ2hhbm5lbHMsCi0gICAgICAgIEJPT0wgYlN0cmV0Y2hlZCkKLXsKLSAgICBCWVRFICpwU3RyZXRjaGVkSW1hZ2U7Ci0gICAgQllURSAqcEltZzsKLSAgICBCWVRFICpzcmMsICpkc3Q7Ci0gICAgQllURSByLCBnLCBiLCBhOwotICAgIGNvbnN0IGludCBjRElDaGFubmVscyA9IDM7Ci0gICAgV09SRCB3SW1nUm93Qnl0ZXM7Ci0gICAgV09SRCB3RElSb3dCeXRlczsKLSAgICBpbnQgY3hOZXdTaXplLCBjeU5ld1NpemU7Ci0gICAgaW50IGN4SW1nUG9zLCBjeUltZ1BvczsKLSAgICBpbnQgeEltZywgeUltZzsKLSAgICBpbnQgeFdpbiwgeVdpbjsKLSAgICBpbnQgeE9sZCwgeU9sZDsKLSAgICBpbnQgeE5ldywgeU5ldzsKLQotICAgIGlmIChiU3RyZXRjaGVkKQotICAgIHsKLSAgICAgICAgY3hOZXdTaXplID0gY3hXaW5TaXplIC0gMiAqIE1BUkdJTjsKLSAgICAgICAgY3lOZXdTaXplID0gY3lXaW5TaXplIC0gMiAqIE1BUkdJTjsKLQotICAgICAgICAvLyBzdHJldGNoIHRoZSBpbWFnZSB0byBpdCdzIHdpbmRvdyBkZXRlcm1pbmVkIHNpemUKLQotICAgICAgICAvLyB0aGUgZm9sbG93aW5nIHR3byBhcmUgdGhlIHNhbWUsIGJ1dCB0aGUgZmlyc3QgaGFzIHNpZGUtZWZmZWN0cwotICAgICAgICAvLyBiZWNhdXNlIG9mIHJvdW5kaW5nCi0vLyAgICAgIGlmICgoY3lOZXdTaXplIC8gY3hOZXdTaXplKSA+IChjeUltZ1NpemUgLyBjeEltZ1NpemUpKQotICAgICAgICBpZiAoKGN5TmV3U2l6ZSAqIGN4SW1nU2l6ZSkgPiAoY3lJbWdTaXplICogY3hOZXdTaXplKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3lOZXdTaXplID0gY3hOZXdTaXplICogY3lJbWdTaXplIC8gY3hJbWdTaXplOwotICAgICAgICAgICAgY3hJbWdQb3MgPSBNQVJHSU47Ci0gICAgICAgICAgICBjeUltZ1BvcyA9IChjeVdpblNpemUgLSBjeU5ld1NpemUpIC8gMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN4TmV3U2l6ZSA9IGN5TmV3U2l6ZSAqIGN4SW1nU2l6ZSAvIGN5SW1nU2l6ZTsKLSAgICAgICAgICAgIGN5SW1nUG9zID0gTUFSR0lOOwotICAgICAgICAgICAgY3hJbWdQb3MgPSAoY3hXaW5TaXplIC0gY3hOZXdTaXplKSAvIDI7Ci0gICAgICAgIH0KLQotICAgICAgICBwU3RyZXRjaGVkSW1hZ2UgPSBtYWxsb2MgKGNJbWdDaGFubmVscyAqIGN4TmV3U2l6ZSAqIGN5TmV3U2l6ZSk7Ci0gICAgICAgIHBJbWcgPSBwU3RyZXRjaGVkSW1hZ2U7Ci0KLSAgICAgICAgZm9yICh5TmV3ID0gMDsgeU5ldyA8IGN5TmV3U2l6ZTsgeU5ldysrKQotICAgICAgICB7Ci0gICAgICAgICAgICB5T2xkID0geU5ldyAqIGN5SW1nU2l6ZSAvIGN5TmV3U2l6ZTsKLSAgICAgICAgICAgIGZvciAoeE5ldyA9IDA7IHhOZXcgPCBjeE5ld1NpemU7IHhOZXcrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4T2xkID0geE5ldyAqIGN4SW1nU2l6ZSAvIGN4TmV3U2l6ZTsKLQotICAgICAgICAgICAgICAgIHIgPSAqKHBiSW1hZ2UgKyBjSW1nQ2hhbm5lbHMgKiAoKHlPbGQgKiBjeEltZ1NpemUpICsgeE9sZCkgKyAwKTsKLSAgICAgICAgICAgICAgICBnID0gKihwYkltYWdlICsgY0ltZ0NoYW5uZWxzICogKCh5T2xkICogY3hJbWdTaXplKSArIHhPbGQpICsgMSk7Ci0gICAgICAgICAgICAgICAgYiA9ICoocGJJbWFnZSArIGNJbWdDaGFubmVscyAqICgoeU9sZCAqIGN4SW1nU2l6ZSkgKyB4T2xkKSArIDIpOwotICAgICAgICAgICAgICAgICpwSW1nKysgPSByOwotICAgICAgICAgICAgICAgICpwSW1nKysgPSBnOwotICAgICAgICAgICAgICAgICpwSW1nKysgPSBiOwotICAgICAgICAgICAgICAgIGlmIChjSW1nQ2hhbm5lbHMgPT0gNCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGEgPSAqKHBiSW1hZ2UgKyBjSW1nQ2hhbm5lbHMgKiAoKHlPbGQgKiBjeEltZ1NpemUpICsgeE9sZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgMyk7Ci0gICAgICAgICAgICAgICAgICAgICpwSW1nKysgPSBhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNhbGN1bGF0ZSByb3ctYnl0ZXMKLQotICAgICAgICB3SW1nUm93Qnl0ZXMgPSBjSW1nQ2hhbm5lbHMgKiBjeE5ld1NpemU7Ci0gICAgICAgIHdESVJvd0J5dGVzID0gKFdPUkQpICgoY0RJQ2hhbm5lbHMgKiBjeFdpblNpemUgKyAzTCkgPj4gMikgPDwgMjsKLQotICAgICAgICAvLyBjb3B5IGltYWdlIHRvIHNjcmVlbgotCi0gICAgICAgIGZvciAoeUltZyA9IDAsIHlXaW4gPSBjeUltZ1BvczsgeUltZyA8IGN5TmV3U2l6ZTsgeUltZysrLCB5V2luKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh5V2luID49IGN5V2luU2l6ZSAtIGN5SW1nUG9zKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgc3JjID0gcFN0cmV0Y2hlZEltYWdlICsgeUltZyAqIHdJbWdSb3dCeXRlczsKLSAgICAgICAgICAgIGRzdCA9IHBEaURhdGEgKyB5V2luICogd0RJUm93Qnl0ZXMgKyBjeEltZ1BvcyAqIGNESUNoYW5uZWxzOwotCi0gICAgICAgICAgICBmb3IgKHhJbWcgPSAwLCB4V2luID0gY3hJbWdQb3M7IHhJbWcgPCBjeE5ld1NpemU7IHhJbWcrKywgeFdpbisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh4V2luID49IGN4V2luU2l6ZSAtIGN4SW1nUG9zKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICByID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgYiA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAqZHN0KysgPSBiOyAvKiBub3RlIHRoZSByZXZlcnNlIG9yZGVyICovCi0gICAgICAgICAgICAgICAgKmRzdCsrID0gZzsKLSAgICAgICAgICAgICAgICAqZHN0KysgPSByOwotICAgICAgICAgICAgICAgIGlmIChjSW1nQ2hhbm5lbHMgPT0gNCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZnJlZSBtZW1vcnkKLQotICAgICAgICBpZiAocFN0cmV0Y2hlZEltYWdlICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUgKHBTdHJldGNoZWRJbWFnZSk7Ci0gICAgICAgICAgICBwU3RyZXRjaGVkSW1hZ2UgPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvLyBwcm9jZXNzIHRoZSBpbWFnZSBub3Qtc3RyZXRjaGVkCi0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGNlbnRyYWwgcG9zaXRpb24KLQotICAgICAgICBjeEltZ1BvcyA9IChjeFdpblNpemUgLSBjeEltZ1NpemUpIC8gMjsKLSAgICAgICAgY3lJbWdQb3MgPSAoY3lXaW5TaXplIC0gY3lJbWdTaXplKSAvIDI7Ci0KLSAgICAgICAgLy8gY2hlY2sgZm9yIGltYWdlIGxhcmdlciB0aGFuIHdpbmRvdwotCi0gICAgICAgIGlmIChjeEltZ1BvcyA8IE1BUkdJTikKLSAgICAgICAgICAgIGN4SW1nUG9zID0gTUFSR0lOOwotICAgICAgICBpZiAoY3lJbWdQb3MgPCBNQVJHSU4pCi0gICAgICAgICAgICBjeUltZ1BvcyA9IE1BUkdJTjsKLQotICAgICAgICAvLyBjYWxjdWxhdGUgYm90aCByb3ctYnl0ZXMKLQotICAgICAgICB3SW1nUm93Qnl0ZXMgPSBjSW1nQ2hhbm5lbHMgKiBjeEltZ1NpemU7Ci0gICAgICAgIHdESVJvd0J5dGVzID0gKFdPUkQpICgoY0RJQ2hhbm5lbHMgKiBjeFdpblNpemUgKyAzTCkgPj4gMikgPDwgMjsKLQotICAgICAgICAvLyBjb3B5IGltYWdlIHRvIHNjcmVlbgotCi0gICAgICAgIGZvciAoeUltZyA9IDAsIHlXaW4gPSBjeUltZ1BvczsgeUltZyA8IGN5SW1nU2l6ZTsgeUltZysrLCB5V2luKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh5V2luID49IGN5V2luU2l6ZSAtIE1BUkdJTikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHNyYyA9IHBiSW1hZ2UgKyB5SW1nICogd0ltZ1Jvd0J5dGVzOwotICAgICAgICAgICAgZHN0ID0gcERpRGF0YSArIHlXaW4gKiB3RElSb3dCeXRlcyArIGN4SW1nUG9zICogY0RJQ2hhbm5lbHM7Ci0KLSAgICAgICAgICAgIGZvciAoeEltZyA9IDAsIHhXaW4gPSBjeEltZ1BvczsgeEltZyA8IGN4SW1nU2l6ZTsgeEltZysrLCB4V2luKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHhXaW4gPj0gY3hXaW5TaXplIC0gTUFSR0lOKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICByID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgYiA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAqZHN0KysgPSBiOyAvKiBub3RlIHRoZSByZXZlcnNlIG9yZGVyICovCi0gICAgICAgICAgICAgICAgKmRzdCsrID0gZzsKLSAgICAgICAgICAgICAgICAqZHN0KysgPSByOwotICAgICAgICAgICAgICAgIGlmIChjSW1nQ2hhbm5lbHMgPT0gNCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0KLS8vICBlbmQgb2Ygc291cmNlCi0vLy0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcuZHNwIGIvc3JjL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxZWY2Yy4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iVmlzdWFsUG5nIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KLSMgKiogRE8gTk9UIEVESVQgKioNCi0NCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIgMHgwMTAxDQotDQotQ0ZHPVZpc3VhbFBuZyAtIFdpbjMyIERlYnVnDQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KLSFNRVNTQUdFIA0KLSFNRVNTQUdFIE5NQUtFIC9mICJWaXN1YWxQbmcubWFrIi4NCi0hTUVTU0FHRSANCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQotIU1FU1NBR0UgDQotIU1FU1NBR0UgTk1BS0UgL2YgIlZpc3VhbFBuZy5tYWsiIENGRz0iVmlzdWFsUG5nIC0gV2luMzIgRGVidWciDQotIU1FU1NBR0UgDQotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQotIU1FU1NBR0UgDQotIU1FU1NBR0UgIlZpc3VhbFBuZyAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iKQ0KLSFNRVNTQUdFICJWaXN1YWxQbmcgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIpDQotIU1FU1NBR0UgDQotDQotIyBCZWdpbiBQcm9qZWN0DQotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCi0jIFBST1AgU2NjX1Byb2pOYW1lICIiDQotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCi1DUFA9Y2wuZXhlDQotTVRMPW1pZGwuZXhlDQotUlNDPXJjLmV4ZQ0KLQ0KLSFJRiAgIiQoQ0ZHKSIgPT0gIlZpc3VhbFBuZyAtIFdpbjMyIFJlbGVhc2UiDQotDQotIyBQUk9QIEJBU0UgVXNlX01GQyAwDQotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSINCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIg0KLSMgUFJPUCBCQVNFIElnbm9yZV9FeHBvcnRfTGliIDANCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQotIyBQUk9QIFVzZV9NRkMgMA0KLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCi0jIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSINCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KLSMgUFJPUCBUYXJnZXRfRGlyICIiDQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL08yIC9JICIuLlwuLiIgL0kgIi4uXC4uXC4uXHpsaWIiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIlBOR19OT19TVERJTyIgL0ZEIC9jDQotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVgNCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvSSAiLi5cLi4iIC9JICIuLlwuLlwuLlx6bGliIiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJQTkdfTk9fU1RESU8iIC9GRCAvYw0KLSMgU1VCVFJBQ1QgQ1BQIC9ZWA0KLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KLUJTQzMyPWJzY21ha2UuZXhlDQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQotIyBBREQgQlNDMzIgL25vbG9nbw0KLUxJTkszMj1saW5rLmV4ZQ0KLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9tYWNoaW5lOkkzODYNCi0jIEFERCBMSU5LMzIgLi5cLi5ccHJvamVjdHNcdmlzdWFsYzZcV2luMzJfTElCX1JlbGVhc2VcbGlicG5nLmxpYiAuLlwuLlwuLlx6bGliXHByb2plY3RzXHZpc3VhbGM2XFdpbjMyX0xJQl9SZWxlYXNlXHpsaWIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9tYWNoaW5lOkkzODYNCi0jIEJlZ2luIFNwZWNpYWwgQnVpbGQgVG9vbA0KLU91dERpcj0uXFJlbGVhc2UNCi1TT1VSQ0U9IiQoSW5wdXRQYXRoKSINCi1Qb3N0QnVpbGRfQ21kcz0kKG91dGRpcilcVmlzdWFsUG5nLmV4ZSAuLlwuLlxjb250cmliXHBuZ3N1aXRlXGJhc242YTE2LnBuZw0KLSMgRW5kIFNwZWNpYWwgQnVpbGQgVG9vbA0KLQ0KLSFFTFNFSUYgICIkKENGRykiID09ICJWaXN1YWxQbmcgLSBXaW4zMiBEZWJ1ZyINCi0NCi0jIFBST1AgQkFTRSBVc2VfTUZDIDANCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyINCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCi0jIFBST1AgQkFTRSBJZ25vcmVfRXhwb3J0X0xpYiAwDQotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KLSMgUFJPUCBVc2VfTUZDIDANCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQotIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIg0KLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KLSMgUFJPUCBUYXJnZXRfRGlyICIiDQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9aSSAvT2QgL0kgIi4uXC4uIiAvSSAiLi5cLi5cLi5cemxpYiIgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiUE5HX05PX1NURElPIiAvRkQgL0daIC9jDQotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVgNCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL1pJIC9PZCAvSSAiLi5cLi4iIC9JICIuLlwuLlwuLlx6bGliIiAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJQTkdfTk9fU1RESU8iIC9GRCAvR1ogL2MNCi0jIFNVQlRSQUNUIENQUCAvWVgNCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyINCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyINCi1CU0MzMj1ic2NtYWtlLmV4ZQ0KLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KLSMgQUREIEJTQzMyIC9ub2xvZ28NCi1MSU5LMzI9bGluay5leGUNCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQotIyBBREQgTElOSzMyIC4uXC4uXHByb2plY3RzXHZpc3VhbGM2XFdpbjMyX0xJQl9SZWxlYXNlXGxpYnBuZy5saWIgLi5cLi5cLi5cemxpYlxwcm9qZWN0c1x2aXN1YWxjNlxXaW4zMl9MSUJfUmVsZWFzZVx6bGliLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGVidWcgL21hY2hpbmU6STM4NiAvbm9kZWZhdWx0bGliOiJtc3ZjcnQubGliIiAvcGRidHlwZTpzZXB0DQotIyBCZWdpbiBTcGVjaWFsIEJ1aWxkIFRvb2wNCi1PdXREaXI9LlxEZWJ1Zw0KLVNPVVJDRT0iJChJbnB1dFBhdGgpIg0KLVBvc3RCdWlsZF9DbWRzPSQob3V0ZGlyKVxWaXN1YWxQbmcuZXhlIC4uXC4uXGNvbnRyaWJccG5nc3VpdGVcYmFzbjZhMTYucG5nDQotIyBFbmQgU3BlY2lhbCBCdWlsZCBUb29sDQotDQotIUVORElGIA0KLQ0KLSMgQmVnaW4gVGFyZ2V0DQotDQotIyBOYW1lICJWaXN1YWxQbmcgLSBXaW4zMiBSZWxlYXNlIg0KLSMgTmFtZSAiVmlzdWFsUG5nIC0gV2luMzIgRGVidWciDQotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIg0KLQ0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS5cUG5nRmlsZS5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS5cVmlzdWFsUG5nLmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgRW5kIEdyb3VwDQotIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIg0KLQ0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCINCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS5cY2V4Y2VwdC5oDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS5cUG5nRmlsZS5oDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS5ccmVzb3VyY2UuaA0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBFbmQgR3JvdXANCi0jIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyINCi0NCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS5cVmlzdWFsUG5nLmljbw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uXFZpc3VhbFBuZy5yYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBFbmQgR3JvdXANCi0jIEVuZCBUYXJnZXQNCi0jIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzdyBiL3NyYy9saWJwbmcvY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5kc3cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMGUxY2MuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzdworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLU1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFdvcmtzcGFjZSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQotIyBXQVJOSU5HOiBETyBOT1QgRURJVCBPUiBERUxFVEUgVEhJUyBXT1JLU1BBQ0UgRklMRSENCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotUHJvamVjdDogIlZpc3VhbFBuZyI9LlxWaXN1YWxQbmcuZHNwIC0gUGFja2FnZSBPd25lcj08ND4NCi0NCi1QYWNrYWdlPTw1Pg0KLXt7ew0KLX19fQ0KLQ0KLVBhY2thZ2U9PDQ+DQote3t7DQotfX19DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUdsb2JhbDoNCi0NCi1QYWNrYWdlPTw1Pg0KLXt7ew0KLX19fQ0KLQ0KLVBhY2thZ2U9PDM+DQote3t7DQotfX19DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5pY28gYi9zcmMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGFhMzcxLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5pY28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcucG5nIGIvc3JjL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhYTgwYS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLnJjIGIvc3JjL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTA2MjNhLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5yYworKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vL01pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIGdlbmVyYXRlZCByZXNvdXJjZSBzY3JpcHQuDQotLy8NCi0jaW5jbHVkZSAicmVzb3VyY2UuaCINCi0NCi0jZGVmaW5lIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vDQotLy8gR2VuZXJhdGVkIGZyb20gdGhlIFRFWFRJTkNMVURFIDIgcmVzb3VyY2UuDQotLy8NCi0jaW5jbHVkZSAiYWZ4cmVzLmgiDQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0jdW5kZWYgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUw0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gRW5nbGlzaCAoVS5TLikgcmVzb3VyY2VzDQotDQotI2lmICFkZWZpbmVkKEFGWF9SRVNPVVJDRV9ETEwpIHx8IGRlZmluZWQoQUZYX1RBUkdfRU5VKQ0KLSNpZmRlZiBfV0lOMzINCi1MQU5HVUFHRSBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUw0KLSNwcmFnbWEgY29kZV9wYWdlKDEyNTIpDQotI2VuZGlmIC8vX1dJTjMyDQotDQotI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vDQotLy8gVEVYVElOQ0xVREUNCi0vLw0KLQ0KLTEgVEVYVElOQ0xVREUgRElTQ0FSREFCTEUgDQotQkVHSU4NCi0gICAgInJlc291cmNlLmhcMCINCi1FTkQNCi0NCi0yIFRFWFRJTkNMVURFIERJU0NBUkRBQkxFIA0KLUJFR0lODQotICAgICIjaW5jbHVkZSAiImFmeHJlcy5oIiJcclxuIg0KLSAgICAiXDAiDQotRU5EDQotDQotMyBURVhUSU5DTFVERSBESVNDQVJEQUJMRSANCi1CRUdJTg0KLSAgICAiXHJcbiINCi0gICAgIlwwIg0KLUVORA0KLQ0KLSNlbmRpZiAgICAvLyBBUFNUVURJT19JTlZPS0VEDQotDQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLw0KLS8vIE1lbnUNCi0vLw0KLQ0KLVZJU1VBTFBORyBNRU5VIERJU0NBUkRBQkxFIA0KLUJFR0lODQotICAgIFBPUFVQICImRmlsZSINCi0gICAgQkVHSU4NCi0gICAgICAgIE1FTlVJVEVNICImT3BlbiBJbWFnZS4uLlx0Q3RybCtPIiwgICAgICBJRE1fRklMRV9PUEVODQotICAgICAgICBNRU5VSVRFTSAiU2F2ZSAmQXMuLi4iLCAgICAgICAgICAgICAgICAgSURNX0ZJTEVfU0FWRQ0KLSAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SDQotICAgICAgICBNRU5VSVRFTSAiJk5leHQgSW1hZ2VcdEN0cmwrTiIsICAgICAgICAgSURNX0ZJTEVfTkVYVA0KLSAgICAgICAgTUVOVUlURU0gIlByZSZ2aW91cyBJbWFnZVx0Q3RybCtWIiwgICAgIElETV9GSUxFX1BSRVZJT1VTDQotICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1INCi0gICAgICAgIE1FTlVJVEVNICJFJnhpdFx0QWx0K1giLCAgICAgICAgICAgICAgICBJRE1fRklMRV9FWElUDQotICAgIEVORA0KLSAgICBQT1BVUCAiJk9wdGlvbnMiDQotICAgIEJFR0lODQotICAgICAgICBNRU5VSVRFTSAiJlN0cmV0Y2giLCAgICAgICAgICAgICAgICAgICAgSURNX09QVElPTlNfU1RSRVRDSCwgQ0hFQ0tFRA0KLSAgICBFTkQNCi0gICAgUE9QVVAgIiZIZWxwIg0KLSAgICBCRUdJTg0KLSAgICAgICAgTUVOVUlURU0gIiZBYm91dCIsICAgICAgICAgICAgICAgICAgICAgIElETV9IRUxQX0FCT1VUDQotICAgIEVORA0KLUVORA0KLQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8NCi0vLyBBY2NlbGVyYXRvcg0KLS8vDQotDQotVklTVUFMUE5HIEFDQ0VMRVJBVE9SUyBESVNDQVJEQUJMRSANCi1CRUdJTg0KLSAgICAiTiIsICAgICAgICAgICAgSURNX0ZJTEVfTkVYVCwgICAgICAgICAgVklSVEtFWSwgQ09OVFJPTCwgTk9JTlZFUlQNCi0gICAgIk8iLCAgICAgICAgICAgIElETV9GSUxFX09QRU4sICAgICAgICAgIFZJUlRLRVksIENPTlRST0wsIE5PSU5WRVJUDQotICAgICJQIiwgICAgICAgICAgICBJRE1fRklMRV9QUkVWSU9VUywgICAgICBWSVJUS0VZLCBDT05UUk9MLCBOT0lOVkVSVA0KLSAgICAiViIsICAgICAgICAgICAgSURNX0ZJTEVfUFJFVklPVVMsICAgICAgVklSVEtFWSwgQ09OVFJPTCwgTk9JTlZFUlQNCi0gICAgIlgiLCAgICAgICAgICAgIElETV9GSUxFX0VYSVQsICAgICAgICAgIFZJUlRLRVksIEFMVCwgTk9JTlZFUlQNCi1FTkQNCi0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vDQotLy8gSWNvbg0KLS8vDQotDQotLy8gSWNvbiB3aXRoIGxvd2VzdCBJRCB2YWx1ZSBwbGFjZWQgZmlyc3QgdG8gZW5zdXJlIGFwcGxpY2F0aW9uIGljb24NCi0vLyByZW1haW5zIGNvbnNpc3RlbnQgb24gYWxsIHN5c3RlbXMuDQotVklTVUFMUE5HICAgICAgICAgICAgICAgSUNPTiAgICBESVNDQVJEQUJMRSAgICAgIlZpc3VhbFBuZy5pY28iDQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLw0KLS8vIERpYWxvZw0KLS8vDQotDQotQUJPVVRCT1ggRElBTE9HIERJU0NBUkRBQkxFICAwLCAwLCAxODYsIDk0DQotU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQDQotRk9OVCA4LCAiTVMgU2FucyBTZXJpZiINCi1CRUdJTg0KLSAgICBERUZQVVNIQlVUVE9OICAgIk9LIixJRE9LLDY4LDY3LDUwLDE0DQotICAgIENURVhUICAgICAgICAgICAiVmlzdWFsUG5nIDEuMCAgLSAgSnVuZSAyMDAwIixJRENfU1RBVElDLDQ5LDE0LDg4LDgNCi0gICAgTFRFWFQgICAgICAgICAgICJhIFBORyBpbWFnZSB2aWV3ZXIiLElEQ19TVEFUSUMsNjAsMzAsNjYsOA0KLSAgICBMVEVYVCAgICAgICAgICAgIihjKSBXaWxsZW0gdmFuIFNjaGFpaywgMjAwMCIsSURDX1NUQVRJQyw0OCw1Miw5MCw4DQotICAgIExURVhUICAgICAgICAgICAidG8gZGVtb25zdHJhdGUgdGhlIHVzZSBvZiBsaWJwbmcgaW4gVmlzdWFsIEMiLA0KLSAgICAgICAgICAgICAgICAgICAgSURDX1NUQVRJQywyNSwzOCwxMzYsOA0KLUVORA0KLQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8NCi0vLyBERVNJR05JTkZPDQotLy8NCi0NCi0jaWZkZWYgQVBTVFVESU9fSU5WT0tFRA0KLUdVSURFTElORVMgREVTSUdOSU5GTyBESVNDQVJEQUJMRSANCi1CRUdJTg0KLSAgICAiQUJPVVRCT1giLCBESUFMT0cNCi0gICAgQkVHSU4NCi0gICAgICAgIExFRlRNQVJHSU4sIDcNCi0gICAgICAgIFJJR0hUTUFSR0lOLCAxNzkNCi0gICAgICAgIFRPUE1BUkdJTiwgNw0KLSAgICAgICAgQk9UVE9NTUFSR0lOLCA4Nw0KLSAgICBFTkQNCi1FTkQNCi0jZW5kaWYgICAgLy8gQVBTVFVESU9fSU5WT0tFRA0KLQ0KLSNlbmRpZiAgICAvLyBFbmdsaXNoIChVLlMuKSByZXNvdXJjZXMNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLQ0KLQ0KLQ0KLSNpZm5kZWYgQVBTVFVESU9fSU5WT0tFRA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8NCi0vLyBHZW5lcmF0ZWQgZnJvbSB0aGUgVEVYVElOQ0xVREUgMyByZXNvdXJjZS4NCi0vLw0KLQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotI2VuZGlmICAgIC8vIG5vdCBBUFNUVURJT19JTlZPS0VEDQotDQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvY2V4Y2VwdC5oIGIvc3JjL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvY2V4Y2VwdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjQ1ZDc2Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvY29udHJpYi92aXN1cG5nL2NleGNlcHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKj09PQotY2V4Y2VwdC5oIDIuMC4xICgyMDA4LUp1bC0xOS1TYXQpCi1odHRwOi8vd3d3Lm5pY2VtaWNlLm5ldC9jZXhjZXB0LwotQWRhbSBNLiBDb3N0ZWxsbwotaHR0cDovL3d3dy5uaWNlbWljZS5uZXQvYW1jLwotCi1BbiBpbnRlcmZhY2UgZm9yIGV4Y2VwdGlvbi1oYW5kbGluZyBpbiBBTlNJIEMgKEM4OSBhbmQgc3Vic2VxdWVudCBJU08KLXN0YW5kYXJkcyksIGRldmVsb3BlZCBqb2ludGx5IHdpdGggQ29zbWluIFRydXRhLgotCi0gICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDggQWRhbSBNLiBDb3N0ZWxsbyBhbmQgQ29zbWluIFRydXRhLgotICAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIG1vZGlmaWVkIG9ubHkgaWYgaXRzIGF1dGhvciBhbmQgdmVyc2lvbgotICAgIGluZm9ybWF0aW9uIGlzIHVwZGF0ZWQgYWNjdXJhdGVseSwgYW5kIG1heSBiZSByZWRpc3RyaWJ1dGVkCi0gICAgb25seSBpZiBhY2NvbXBhbmllZCBieSB0aGlzIHVuYWx0ZXJlZCBub3RpY2UuICBTdWJqZWN0IHRvIHRob3NlCi0gICAgcmVzdHJpY3Rpb25zLCBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIGRvIGFueXRoaW5nCi0gICAgd2l0aCB0aGlzIHNvZnR3YXJlLiAgVGhlIGNvcHlyaWdodCBob2xkZXJzIG1ha2Ugbm8gZ3VhcmFudGVlcwotICAgIHJlZ2FyZGluZyB0aGlzIHNvZnR3YXJlLCBhbmQgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgYW55IGRhbWFnZQotICAgIHJlc3VsdGluZyBmcm9tIGl0cyB1c2UuCi0KLVRoZSBjZXhjZXB0IGludGVyZmFjZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGFuZCBjYW5ub3QgaW50ZXJhY3QKLXdpdGggc3lzdGVtIGV4Y2VwdGlvbnMgKGxpa2UgZGl2aXNpb24gYnkgemVybyBvciBtZW1vcnkgc2VnbWVudGF0aW9uCi12aW9sYXRpb24pLCBjb21waWxlci1nZW5lcmF0ZWQgZXhjZXB0aW9ucyAobGlrZSBDKysgZXhjZXB0aW9ucyksIG9yCi1vdGhlciBleGNlcHRpb24taGFuZGxpbmcgaW50ZXJmYWNlcy4KLQotV2hlbiB1c2luZyB0aGlzIGludGVyZmFjZSBhY3Jvc3MgbXVsdGlwbGUgLmMgZmlsZXMsIGRvIG5vdCBpbmNsdWRlCi10aGlzIGhlYWRlciBmaWxlIGRpcmVjdGx5LiAgSW5zdGVhZCwgY3JlYXRlIGEgd3JhcHBlciBoZWFkZXIgZmlsZSB0aGF0Ci1pbmNsdWRlcyB0aGlzIGhlYWRlciBmaWxlIGFuZCB0aGVuIGludm9rZXMgdGhlIGRlZmluZV9leGNlcHRpb25fdHlwZQotbWFjcm8gKHNlZSBiZWxvdykuICBUaGUgLmMgZmlsZXMgc2hvdWxkIHRoZW4gaW5jbHVkZSB0aGF0IGhlYWRlciBmaWxlLgotCi1UaGUgaW50ZXJmYWNlIGNvbnNpc3RzIG9mIG9uZSB0eXBlLCBvbmUgd2VsbC1rbm93biBuYW1lLCBhbmQgc2l4IG1hY3Jvcy4KLQotCi1kZWZpbmVfZXhjZXB0aW9uX3R5cGUodHlwZV9uYW1lKTsKLQotICAgIFRoaXMgbWFjcm8gaXMgdXNlZCBsaWtlIGFuIGV4dGVybmFsIGRlY2xhcmF0aW9uLiAgSXQgc3BlY2lmaWVzCi0gICAgdGhlIHR5cGUgb2Ygb2JqZWN0IHRoYXQgZ2V0cyBjb3BpZWQgZnJvbSB0aGUgZXhjZXB0aW9uIHRocm93ZXIgdG8KLSAgICB0aGUgZXhjZXB0aW9uIGNhdGNoZXIuICBUaGUgdHlwZV9uYW1lIGNhbiBiZSBhbnkgdHlwZSB0aGF0IGNhbiBiZQotICAgIGFzc2lnbmVkIHRvLCB0aGF0IGlzLCBhIG5vbi1jb25zdGFudCBhcml0aG1ldGljIHR5cGUsIHN0cnVjdCwgdW5pb24sCi0gICAgb3IgcG9pbnRlci4gIEV4YW1wbGVzOgotCi0gICAgICAgIGRlZmluZV9leGNlcHRpb25fdHlwZShpbnQpOwotCi0gICAgICAgIGVudW0gZXhjZXB0aW9uIHsgb3V0X29mX21lbW9yeSwgYmFkX2FyZ3VtZW50cywgZGlza19mdWxsIH07Ci0gICAgICAgIGRlZmluZV9leGNlcHRpb25fdHlwZShlbnVtIGV4Y2VwdGlvbik7Ci0KLSAgICAgICAgc3RydWN0IGV4Y2VwdGlvbiB7IGludCBjb2RlOyBjb25zdCBjaGFyICptc2c7IH07Ci0gICAgICAgIGRlZmluZV9leGNlcHRpb25fdHlwZShzdHJ1Y3QgZXhjZXB0aW9uKTsKLQotICAgIEJlY2F1c2UgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGNhdXNlcyB0aGUgb2JqZWN0IHRvIGJlIGNvcGllZCAobm90Ci0gICAganVzdCBvbmNlLCBidXQgdHdpY2UpLCBwcm9ncmFtbWVycyBtYXkgd2lzaCB0byBjb25zaWRlciBzaXplIHdoZW4KLSAgICBjaG9vc2luZyB0aGUgZXhjZXB0aW9uIHR5cGUuCi0KLQotc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0OwotCi0gICAgVGhpcyB0eXBlIG1heSBiZSB1c2VkIGFmdGVyIHRoZSBkZWZpbmVfZXhjZXB0aW9uX3R5cGUoKSBtYWNybyBoYXMKLSAgICBiZWVuIGludm9rZWQuICBBIHN0cnVjdCBleGNlcHRpb25fY29udGV4dCBtdXN0IGJlIGtub3duIHRvIGJvdGgKLSAgICB0aGUgdGhyb3dlciBhbmQgdGhlIGNhdGNoZXIuICBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZXJlIGJlIG9uZQotICAgIGNvbnRleHQgZm9yIGVhY2ggdGhyZWFkIHRoYXQgdXNlcyBleGNlcHRpb25zLiAgSXQgd291bGQgY2VydGFpbmx5Ci0gICAgYmUgZGFuZ2Vyb3VzIGZvciBtdWx0aXBsZSB0aHJlYWRzIHRvIGFjY2VzcyB0aGUgc2FtZSBjb250ZXh0LgotICAgIE9uZSB0aHJlYWQgY2FuIHVzZSBtdWx0aXBsZSBjb250ZXh0cywgYnV0IHRoYXQgaXMgbGlrZWx5IHRvIGJlCi0gICAgY29uZnVzaW5nIGFuZCBub3QgdHlwaWNhbGx5IHVzZWZ1bC4gIFRoZSBhcHBsaWNhdGlvbiBjYW4gYWxsb2NhdGUKLSAgICB0aGlzIHN0cnVjdHVyZSBpbiBhbnkgd2F5IGl0IHBsZWFzZXMtLWF1dG9tYXRpYywgc3RhdGljLCBvciBkeW5hbWljLgotICAgIFRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWVyIHNob3VsZCBwcmV0ZW5kIG5vdCB0byBrbm93IHRoZSBzdHJ1Y3R1cmUKLSAgICBtZW1iZXJzLCB3aGljaCBhcmUgc3ViamVjdCB0byBjaGFuZ2UuCi0KLQotc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0ICp0aGVfZXhjZXB0aW9uX2NvbnRleHQ7Ci0KLSAgICBUaGUgVHJ5L0NhdGNoIGFuZCBUaHJvdyBzdGF0ZW1lbnRzIChkZXNjcmliZWQgYmVsb3cpIGltcGxpY2l0bHkKLSAgICByZWZlciB0byBhIGNvbnRleHQsIHVzaW5nIHRoZSBuYW1lIHRoZV9leGNlcHRpb25fY29udGV4dC4gIEl0IGlzCi0gICAgdGhlIGFwcGxpY2F0aW9uJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoYXQgdGhpcyBuYW1lIHlpZWxkcwotICAgIHRoZSBhZGRyZXNzIG9mIGEgbXV0YWJsZSAobm9uLWNvbnN0YW50KSBzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQKLSAgICB3aGVyZXZlciB0aG9zZSBzdGF0ZW1lbnRzIGFyZSB1c2VkLiAgU3ViamVjdCB0byB0aGF0IGNvbnN0cmFpbnQsIHRoZQotICAgIGFwcGxpY2F0aW9uIG1heSBkZWNsYXJlIGEgdmFyaWFibGUgb2YgdGhpcyBuYW1lIGFueXdoZXJlIGl0IGxpa2VzCi0gICAgKGluc2lkZSBhIGZ1bmN0aW9uLCBpbiBhIHBhcmFtZXRlciBsaXN0LCBvciBleHRlcm5hbGx5KSwgYW5kIG1heQotICAgIHVzZSB3aGF0ZXZlciBzdG9yYWdlIGNsYXNzIHNwZWNpZmllcnMgKHN0YXRpYywgZXh0ZXJuLCBldGMpIG9yIHR5cGUKLSAgICBxdWFsaWZpZXJzIChjb25zdCwgdm9sYXRpbGUsIGV0YykgaXQgbGlrZXMuICBFeGFtcGxlczoKLQotICAgICAgICBzdGF0aWMgc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0Ci0gICAgICAgICAgKiBjb25zdCB0aGVfZXhjZXB0aW9uX2NvbnRleHQgPSAmZm9vOwotCi0gICAgICAgIHsgc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0ICp0aGVfZXhjZXB0aW9uX2NvbnRleHQgPSBiYXI7IC4uLiB9Ci0KLSAgICAgICAgaW50IGJsYWgoc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0ICp0aGVfZXhjZXB0aW9uX2NvbnRleHQsIC4uLik7Ci0KLSAgICAgICAgZXh0ZXJuIHN0cnVjdCBleGNlcHRpb25fY29udGV4dCB0aGVfZXhjZXB0aW9uX2NvbnRleHRbMV07Ci0KLSAgICBUaGUgbGFzdCBleGFtcGxlIGlsbHVzdHJhdGVzIGEgdHJpY2sgdGhhdCBhdm9pZHMgY3JlYXRpbmcgYSBwb2ludGVyCi0gICAgb2JqZWN0IHNlcGFyYXRlIGZyb20gdGhlIHN0cnVjdHVyZSBvYmplY3QuCi0KLSAgICBUaGUgbmFtZSBjb3VsZCBldmVuIGJlIGEgbWFjcm8sIGZvciBleGFtcGxlOgotCi0gICAgICAgIHN0cnVjdCBleGNlcHRpb25fY29udGV4dCBlY19hcnJheVtudW10aHJlYWRzXTsKLSAgICAgICAgI2RlZmluZSB0aGVfZXhjZXB0aW9uX2NvbnRleHQgKGVjX2FycmF5ICsgdGhyZWFkX2lkKQotCi0gICAgQmUgYXdhcmUgdGhhdCB0aGVfZXhjZXB0aW9uX2NvbnRleHQgaXMgdXNlZCBzZXZlcmFsIHRpbWVzIGJ5IHRoZQotICAgIFRyeS9DYXRjaC9UaHJvdyBtYWNyb3MsIHNvIGl0IHNob3VsZG4ndCBiZSBleHBlbnNpdmUgb3IgaGF2ZSBzaWRlCi0gICAgZWZmZWN0cy4gIFRoZSBleHBhbnNpb24gbXVzdCBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIGFuCi0gICAgaWRlbnRpZmllciwgc28gaXQncyBzYWZlc3QgdG8gcHV0IHBhcmVudGhlc2VzIGFyb3VuZCBpdC4KLQotCi12b2lkIGluaXRfZXhjZXB0aW9uX2NvbnRleHQoc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0ICplYyk7Ci0KLSAgICBGb3IgY29udGV4dCBzdHJ1Y3R1cmVzIGFsbG9jYXRlZCBzdGF0aWNhbGx5IChieSBhbiBleHRlcm5hbAotICAgIGRlZmluaXRpb24gb3IgdXNpbmcgdGhlICJzdGF0aWMiIGtleXdvcmQpLCB0aGUgaW1wbGljaXQKLSAgICBpbml0aWFsaXphdGlvbiB0byBhbGwgemVyb3MgaXMgc3VmZmljaWVudCwgYnV0IGNvbnRleHRzIGFsbG9jYXRlZAotICAgIGJ5IG90aGVyIG1lYW5zIG11c3QgYmUgaW5pdGlhbGl6ZWQgdXNpbmcgdGhpcyBtYWNybyBiZWZvcmUgdGhleQotICAgIGFyZSB1c2VkIGJ5IGEgVHJ5L0NhdGNoIHN0YXRlbWVudC4gIEl0IGRvZXMgbm8gaGFybSB0byBpbml0aWFsaXplCi0gICAgYSBjb250ZXh0IG1vcmUgdGhhbiBvbmNlIChieSB1c2luZyB0aGlzIG1hY3JvIG9uIGEgc3RhdGljYWxseQotICAgIGFsbG9jYXRlZCBjb250ZXh0LCBvciB1c2luZyB0aGlzIG1hY3JvIHR3aWNlIG9uIHRoZSBzYW1lIGNvbnRleHQpLAotICAgIGJ1dCBhIGNvbnRleHQgbXVzdCBub3QgYmUgcmUtaW5pdGlhbGl6ZWQgYWZ0ZXIgaXQgaGFzIGJlZW4gdXNlZCBieSBhCi0gICAgVHJ5L0NhdGNoIHN0YXRlbWVudC4KLQotCi1Ucnkgc3RhdGVtZW50Ci1DYXRjaCAoZXhwcmVzc2lvbikgc3RhdGVtZW50Ci0KLSAgICBUaGUgVHJ5L0NhdGNoL1Rocm93IG1hY3JvcyBhcmUgY2FwaXRhbGl6ZWQgaW4gb3JkZXIgdG8gYXZvaWQKLSAgICBjb25mdXNpb24gd2l0aCB0aGUgQysrIGtleXdvcmRzLCB3aGljaCBoYXZlIHN1YnRseSBkaWZmZXJlbnQKLSAgICBzZW1hbnRpY3MuCi0KLSAgICBBIFRyeS9DYXRjaCBzdGF0ZW1lbnQgaGFzIGEgc3ludGF4IHNpbWlsYXIgdG8gYW4gaWYvZWxzZSBzdGF0ZW1lbnQsCi0gICAgZXhjZXB0IHRoYXQgdGhlIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiBnb2VzIGFmdGVyIHRoZSBzZWNvbmQKLSAgICBrZXl3b3JkIHJhdGhlciB0aGFuIHRoZSBmaXJzdC4gIEFzIHdpdGggaWYvZWxzZSwgdGhlcmUgYXJlIHR3bwotICAgIGNsYXVzZXMsIGVhY2ggb2Ygd2hpY2ggbWF5IGJlIGEgc2ltcGxlIHN0YXRlbWVudCBlbmRpbmcgd2l0aCBhCi0gICAgc2VtaWNvbG9uIG9yIGEgYnJhY2UtZW5jbG9zZWQgY29tcG91bmQgc3RhdGVtZW50LiAgQnV0IHdoZXJlYXMKLSAgICB0aGUgZWxzZSBjbGF1c2UgaXMgb3B0aW9uYWwsIHRoZSBDYXRjaCBjbGF1c2UgaXMgcmVxdWlyZWQuICBUaGUKLSAgICBleHByZXNzaW9uIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZSAoc29tZXRoaW5nIGNhcGFibGUgb2YgYmVpbmcKLSAgICBhc3NpZ25lZCB0bykgb2YgdGhlIHNhbWUgdHlwZSAoZGlzcmVnYXJkaW5nIHR5cGUgcXVhbGlmaWVycykgdGhhdAotICAgIHdhcyBwYXNzZWQgdG8gZGVmaW5lX2V4Y2VwdGlvbl90eXBlKCkuCi0KLSAgICBJZiBhIFRocm93IHRoYXQgdXNlcyB0aGUgc2FtZSBleGNlcHRpb24gY29udGV4dCBhcyB0aGUgVHJ5L0NhdGNoIGlzCi0gICAgZXhlY3V0ZWQgd2l0aGluIHRoZSBUcnkgY2xhdXNlICh0eXBpY2FsbHkgd2l0aGluIGEgZnVuY3Rpb24gY2FsbGVkCi0gICAgYnkgdGhlIFRyeSBjbGF1c2UpLCBhbmQgdGhlIGV4Y2VwdGlvbiBpcyBub3QgY2F1Z2h0IGJ5IGEgbmVzdGVkCi0gICAgVHJ5L0NhdGNoIHN0YXRlbWVudCwgdGhlbiBhIGNvcHkgb2YgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIGFzc2lnbmVkCi0gICAgdG8gdGhlIGV4cHJlc3Npb24sIGFuZCBjb250cm9sIHdpbGwganVtcCB0byB0aGUgQ2F0Y2ggY2xhdXNlLiAgSWYgbm8KLSAgICBzdWNoIFRocm93IGlzIGV4ZWN1dGVkLCB0aGVuIHRoZSBhc3NpZ25tZW50IGlzIG5vdCBwZXJmb3JtZWQsIGFuZAotICAgIHRoZSBDYXRjaCBjbGF1c2UgaXMgbm90IGV4ZWN1dGVkLgotCi0gICAgVGhlIGV4cHJlc3Npb24gaXMgbm90IGV2YWx1YXRlZCB1bmxlc3MgYW5kIHVudGlsIHRoZSBleGNlcHRpb24gaXMKLSAgICBjYXVnaHQsIHdoaWNoIGlzIHNpZ25pZmljYW50IGlmIGl0IGhhcyBzaWRlIGVmZmVjdHMsIGZvciBleGFtcGxlOgotCi0gICAgICAgIFRyeSBmb28oKTsKLSAgICAgICAgQ2F0Y2ggKHBbKytpXS5lKSB7IC4uLiB9Ci0KLSAgICBJTVBPUlRBTlQ6IEp1bXBpbmcgaW50byBvciBvdXQgb2YgYSBUcnkgY2xhdXNlIChmb3IgZXhhbXBsZSB2aWEKLSAgICByZXR1cm4sIGJyZWFrLCBjb250aW51ZSwgZ290bywgbG9uZ2ptcCkgaXMgZm9yYmlkZGVuLS10aGUgY29tcGlsZXIKLSAgICB3aWxsIG5vdCBjb21wbGFpbiwgYnV0IGJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4gYXQgcnVuLXRpbWUuICBKdW1waW5nCi0gICAgaW50byBvciBvdXQgb2YgYSBDYXRjaCBjbGF1c2UgaXMgb2theSwgYW5kIHNvIGlzIGp1bXBpbmcgYXJvdW5kCi0gICAgaW5zaWRlIGEgVHJ5IGNsYXVzZS4gIEluIG1hbnkgY2FzZXMgd2hlcmUgb25lIGlzIHRlbXB0ZWQgdG8gcmV0dXJuCi0gICAgZnJvbSBhIFRyeSBjbGF1c2UsIGl0IHdpbGwgc3VmZmljZSB0byB1c2UgVGhyb3csIGFuZCB0aGVuIHJldHVybgotICAgIGZyb20gdGhlIENhdGNoIGNsYXVzZS4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIHNldCBhIGZsYWcgdmFyaWFibGUgYW5kCi0gICAgdXNlIGdvdG8gdG8ganVtcCB0byB0aGUgZW5kIG9mIHRoZSBUcnkgY2xhdXNlLCB0aGVuIGNoZWNrIHRoZSBmbGFnCi0gICAgYWZ0ZXIgdGhlIFRyeS9DYXRjaCBzdGF0ZW1lbnQuCi0KLSAgICBJTVBPUlRBTlQ6IFRoZSB2YWx1ZXMgb2YgYW55IG5vbi12b2xhdGlsZSBhdXRvbWF0aWMgdmFyaWFibGVzCi0gICAgY2hhbmdlZCB3aXRoaW4gdGhlIFRyeSBjbGF1c2UgYXJlIHVuZGVmaW5lZCBhZnRlciBhbiBleGNlcHRpb24gaXMKLSAgICBjYXVnaHQuICBUaGVyZWZvcmUsIHZhcmlhYmxlcyBtb2RpZmllZCBpbnNpZGUgdGhlIFRyeSBibG9jayB3aG9zZQotICAgIHZhbHVlcyBhcmUgbmVlZGVkIGxhdGVyIG91dHNpZGUgdGhlIFRyeSBibG9jayBtdXN0IGVpdGhlciB1c2Ugc3RhdGljCi0gICAgc3RvcmFnZSBvciBiZSBkZWNsYXJlZCB3aXRoIHRoZSAidm9sYXRpbGUiIHR5cGUgcXVhbGlmaWVyLgotCi0KLVRocm93IGV4cHJlc3Npb247Ci0KLSAgICBBIFRocm93IHN0YXRlbWVudCBpcyB2ZXJ5IG11Y2ggbGlrZSBhIHJldHVybiBzdGF0ZW1lbnQsIGV4Y2VwdCB0aGF0Ci0gICAgdGhlIGV4cHJlc3Npb24gaXMgcmVxdWlyZWQuICBXaGVyZWFzIHJldHVybiBqdW1wcyBiYWNrIHRvIHRoZSBwbGFjZQotICAgIHdoZXJlIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHdhcyBjYWxsZWQsIFRocm93IGp1bXBzIGJhY2sgdG8gdGhlIENhdGNoCi0gICAgY2xhdXNlIG9mIHRoZSBpbm5lcm1vc3QgZW5jbG9zaW5nIFRyeSBjbGF1c2UuICBUaGUgZXhwcmVzc2lvbiBtdXN0Ci0gICAgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIHBhc3NlZCB0byBkZWZpbmVfZXhjZXB0aW9uX3R5cGUoKS4gIFRoZQotICAgIGV4Y2VwdGlvbiBtdXN0IGJlIGNhdWdodCwgb3RoZXJ3aXNlIHRoZSBwcm9ncmFtIG1heSBjcmFzaC4KLQotICAgIFNsaWdodCBsaW1pdGF0aW9uOiAgSWYgdGhlIGV4cHJlc3Npb24gaXMgYSBjb21tYS1leHByZXNzaW9uLCBpdCBtdXN0Ci0gICAgYmUgZW5jbG9zZWQgaW4gcGFyZW50aGVzZXMuCi0KLQotVHJ5IHN0YXRlbWVudAotQ2F0Y2hfYW5vbnltb3VzIHN0YXRlbWVudAotCi0gICAgV2hlbiB0aGUgdmFsdWUgb2YgdGhlIGV4Y2VwdGlvbiBpcyBub3QgbmVlZGVkLCBhIFRyeS9DYXRjaCBzdGF0ZW1lbnQKLSAgICBjYW4gdXNlIENhdGNoX2Fub255bW91cyBpbnN0ZWFkIG9mIENhdGNoIChleHByZXNzaW9uKS4KLQotCi1FdmVyeXRoaW5nIGJlbG93IHRoaXMgcG9pbnQgaXMgZm9yIHRoZSBiZW5lZml0IG9mIHRoZSBjb21waWxlci4gIFRoZQotYXBwbGljYXRpb24gcHJvZ3JhbW1lciBzaG91bGQgcHJldGVuZCBub3QgdG8ga25vdyBhbnkgb2YgaXQsIGJlY2F1c2UgaXQKLWlzIHN1YmplY3QgdG8gY2hhbmdlLgotCi09PT0qLwotCi0KLSNpZm5kZWYgQ0VYQ0VQVF9ICi0jZGVmaW5lIENFWENFUFRfSAotCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotI2RlZmluZSBkZWZpbmVfZXhjZXB0aW9uX3R5cGUoZXR5cGUpIFwKLXN0cnVjdCBleGNlcHRpb25fY29udGV4dCB7IFwKLSAgam1wX2J1ZiAqcGVudjsgXAotICBpbnQgY2F1Z2h0OyBcCi0gIHZvbGF0aWxlIHN0cnVjdCB7IGV0eXBlIGV0bXA7IH0gdjsgXAotfQotCi0vKiBldG1wIG11c3QgYmUgdm9sYXRpbGUgYmVjYXVzZSB0aGUgYXBwbGljYXRpb24gbWlnaHQgdXNlIGF1dG9tYXRpYyAqLwotLyogc3RvcmFnZSBmb3IgdGhlX2V4Y2VwdGlvbl9jb250ZXh0LCBhbmQgZXRtcCBpcyBtb2RpZmllZCBiZXR3ZWVuICAgKi8KLS8qIHRoZSBjYWxscyB0byBzZXRqbXAoKSBhbmQgbG9uZ2ptcCgpLiAgQSB3cmFwcGVyIHN0cnVjdCBpcyB1c2VkIHRvICovCi0vKiBhdm9pZCB3YXJuaW5ncyBhYm91dCBhIGR1cGxpY2F0ZSB2b2xhdGlsZSBxdWFsaWZpZXIgaW4gY2FzZSBldHlwZSAqLwotLyogYWxyZWFkeSBpbmNsdWRlcyBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBpbml0X2V4Y2VwdGlvbl9jb250ZXh0KGVjKSAoKHZvaWQpKChlYyktPnBlbnYgPSAwKSkKLQotI2RlZmluZSBUcnkgXAotICB7IFwKLSAgICBqbXBfYnVmICpleGNlcHRpb25fX3ByZXYsIGV4Y2VwdGlvbl9fZW52OyBcCi0gICAgZXhjZXB0aW9uX19wcmV2ID0gdGhlX2V4Y2VwdGlvbl9jb250ZXh0LT5wZW52OyBcCi0gICAgdGhlX2V4Y2VwdGlvbl9jb250ZXh0LT5wZW52ID0gJmV4Y2VwdGlvbl9fZW52OyBcCi0gICAgaWYgKHNldGptcChleGNlcHRpb25fX2VudikgPT0gMCkgeyBcCi0gICAgICBkbwotCi0jZGVmaW5lIGV4Y2VwdGlvbl9fY2F0Y2goYWN0aW9uKSBcCi0gICAgICB3aGlsZSAodGhlX2V4Y2VwdGlvbl9jb250ZXh0LT5jYXVnaHQgPSAwLCBcCi0gICAgICAgICAgICAgdGhlX2V4Y2VwdGlvbl9jb250ZXh0LT5jYXVnaHQpOyBcCi0gICAgfSBcCi0gICAgZWxzZSB7IFwKLSAgICAgIHRoZV9leGNlcHRpb25fY29udGV4dC0+Y2F1Z2h0ID0gMTsgXAotICAgIH0gXAotICAgIHRoZV9leGNlcHRpb25fY29udGV4dC0+cGVudiA9IGV4Y2VwdGlvbl9fcHJldjsgXAotICB9IFwKLSAgaWYgKCF0aGVfZXhjZXB0aW9uX2NvbnRleHQtPmNhdWdodCB8fCBhY3Rpb24pIHsgfSBcCi0gIGVsc2UKLQotI2RlZmluZSBDYXRjaChlKSBleGNlcHRpb25fX2NhdGNoKCgoZSkgPSB0aGVfZXhjZXB0aW9uX2NvbnRleHQtPnYuZXRtcCwgMCkpCi0jZGVmaW5lIENhdGNoX2Fub255bW91cyBleGNlcHRpb25fX2NhdGNoKDApCi0KLS8qIFRyeSBlbmRzIHdpdGggZG8sIGFuZCBDYXRjaCBiZWdpbnMgd2l0aCB3aGlsZSgwKSBhbmQgZW5kcyB3aXRoICAgICAqLwotLyogZWxzZSwgdG8gZW5zdXJlIHRoYXQgVHJ5L0NhdGNoIHN5bnRheCBpcyBzaW1pbGFyIHRvIGlmL2Vsc2UgICAgICAgICovCi0vKiBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIDAgaW4gd2hpbGUoMCkgaXMgZXhwcmVzc2VkIGFzIHg9MCx4IGluIG9yZGVyIHRvIGFwcGVhc2UgICAgICAgICovCi0vKiBjb21waWxlcnMgdGhhdCB3YXJuIGFib3V0IGNvbnN0YW50IGV4cHJlc3Npb25zIGluc2lkZSB3aGlsZSgpLiAgICAgKi8KLS8qIE1vc3QgY29tcGlsZXJzIHNob3VsZCBzdGlsbCByZWNvZ25pemUgdGhhdCB0aGUgY29uZGl0aW9uIGlzIGFsd2F5cyAqLwotLyogZmFsc2UgYW5kIGF2b2lkIGdlbmVyYXRpbmcgY29kZSBmb3IgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgVGhyb3cgXAotICBmb3IgKDs7IGxvbmdqbXAoKnRoZV9leGNlcHRpb25fY29udGV4dC0+cGVudiwgMSkpIFwKLSAgICB0aGVfZXhjZXB0aW9uX2NvbnRleHQtPnYuZXRtcCA9Ci0KLQotI2VuZGlmIC8qIENFWENFUFRfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvcmVzb3VyY2UuaCBiL3NyYy9saWJwbmcvY29udHJpYi92aXN1cG5nL3Jlc291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMWRkMDMuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvcmVzb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8ve3tOT19ERVBFTkRFTkNJRVN9fQotLy8gTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gZ2VuZXJhdGVkIGluY2x1ZGUgZmlsZS4KLS8vIFVzZWQgYnkgVmlzdWFsUG5nLnJjCi0vLwotI2RlZmluZSBJRE1fRklMRV9PUEVOICAgICAgICAgICAgICAgICAgIDQwMDAxCi0jZGVmaW5lIElETV9GSUxFX1NBVkUgICAgICAgICAgICAgICAgICAgNDAwMDIKLSNkZWZpbmUgSURNX0ZJTEVfTkVYVCAgICAgICAgICAgICAgICAgICA0MDAwMwotI2RlZmluZSBJRE1fRklMRV9QUkVWSU9VUyAgICAgICAgICAgICAgIDQwMDA0Ci0jZGVmaW5lIElETV9GSUxFX0VYSVQgICAgICAgICAgICAgICAgICAgNDAwMDUKLSNkZWZpbmUgSURNX09QVElPTlNfQkFDS0dST1VORCAgICAgICAgICA0MDAwNgotI2RlZmluZSBJRE1fT1BUSU9OU19TVFJFVENIICAgICAgICAgICAgIDQwMDA3Ci0jZGVmaW5lIElETV9IRUxQX0FCT1VUICAgICAgICAgICAgICAgICAgNDAwMDgKLQotLy8gTmV4dCBkZWZhdWx0IHZhbHVlcyBmb3IgbmV3IG9iamVjdHMKLS8vIAotI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQKLSNpZm5kZWYgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUwotI2RlZmluZSBfQVBTX05FWFRfUkVTT1VSQ0VfVkFMVUUgICAgICAgIDExMwotI2RlZmluZSBfQVBTX05FWFRfQ09NTUFORF9WQUxVRSAgICAgICAgIDQwMDA5Ci0jZGVmaW5lIF9BUFNfTkVYVF9DT05UUk9MX1ZBTFVFICAgICAgICAgMTAwMQotI2RlZmluZSBfQVBTX05FWFRfU1lNRURfVkFMVUUgICAgICAgICAgIDEwMQotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvZGVwY29tcCBiL3NyYy9saWJwbmcvZGVwY29tcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGY4ZWVhNy4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2RlcGNvbXAKKysrIC9kZXYvbnVsbApAQCAtMSw2MzAgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBkZXBjb21wIC0gY29tcGlsZSBhIHByb2dyYW0gZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMgYXMgc2lkZS1lZmZlY3RzCi0KLXNjcmlwdHZlcnNpb249MjAwOS0wNC0yOC4yMTsgIyBVVEMKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDkgRnJlZQotIyBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4uCi0KLWNhc2UgJDEgaW4KLSAgJycpCi0gICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLSAgICAgZXhpdCAxOwotICAgICA7OwotICAtaCB8IC0taCopCi0gICAgY2F0IDw8XEVPRgotVXNhZ2U6IGRlcGNvbXAgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KLQotUnVuIFBST0dSQU1TIEFSR1MgdG8gY29tcGlsZSBhIGZpbGUsIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzCi1hcyBzaWRlLWVmZmVjdHMuCi0KLUVudmlyb25tZW50IHZhcmlhYmxlczoKLSAgZGVwbW9kZSAgICAgRGVwZW5kZW5jeSB0cmFja2luZyBtb2RlLgotICBzb3VyY2UgICAgICBTb3VyY2UgZmlsZSByZWFkIGJ5IGBQUk9HUkFNUyBBUkdTJy4KLSAgb2JqZWN0ICAgICAgT2JqZWN0IGZpbGUgb3V0cHV0IGJ5IGBQUk9HUkFNUyBBUkdTJy4KLSAgREVQRElSICAgICAgZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGRlcGVuZGVuY2llcy4KLSAgZGVwZmlsZSAgICAgRGVwZW5kZW5jeSBmaWxlIHRvIG91dHB1dC4KLSAgdG1wZGVwZmlsZSAgVGVtcG9yYXJ5IGZpbGUgdG8gdXNlIHdoZW4gb3V0cHV0aW5nIGRlcGVuZGVuY2llcy4KLSAgbGlidG9vbCAgICAgV2hldGhlciBsaWJ0b29sIGlzIHVzZWQgKHllcy9ubykuCi0KLVJlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCi1FT0YKLSAgICBleGl0ICQ/Ci0gICAgOzsKLSAgLXYgfCAtLXYqKQotICAgIGVjaG8gImRlcGNvbXAgJHNjcmlwdHZlcnNpb24iCi0gICAgZXhpdCAkPwotICAgIDs7Ci1lc2FjCi0KLWlmIHRlc3QgLXogIiRkZXBtb2RlIiB8fCB0ZXN0IC16ICIkc291cmNlIiB8fCB0ZXN0IC16ICIkb2JqZWN0IjsgdGhlbgotICBlY2hvICJkZXBjb21wOiBWYXJpYWJsZXMgc291cmNlLCBvYmplY3QgYW5kIGRlcG1vZGUgbXVzdCBiZSBzZXQiIDE+JjIKLSAgZXhpdCAxCi1maQotCi0jIERlcGVuZGVuY2llcyBmb3Igc3ViL2Jhci5vIG9yIHN1Yi9iYXIub2JqIGdvIGludG8gc3ViLy5kZXBzL2Jhci5Qby4KLWRlcGZpbGU9JHtkZXBmaWxlLWBlY2hvICIkb2JqZWN0IiB8Ci0gIHNlZCAnc3xbXlxcL10qJHwnJHtERVBESVItLmRlcHN9Jy8mfDtzfFwuXChbXi5dKlwpJHwuUFwxfDtzfFBvYmokfFBvfCdgfQotdG1wZGVwZmlsZT0ke3RtcGRlcGZpbGUtYGVjaG8gIiRkZXBmaWxlIiB8IHNlZCAncy9cLlwoW14uXSpcKSQvLlRcMS8nYH0KLQotcm0gLWYgIiR0bXBkZXBmaWxlIgotCi0jIFNvbWUgbW9kZXMgd29yayBqdXN0IGxpa2Ugb3RoZXIgbW9kZXMsIGJ1dCB1c2UgZGlmZmVyZW50IGZsYWdzLiAgV2UKLSMgcGFyYW1ldGVyaXplIGhlcmUsIGJ1dCBzdGlsbCBsaXN0IHRoZSBtb2RlcyBpbiB0aGUgYmlnIGNhc2UgYmVsb3csCi0jIHRvIG1ha2UgZGVwZW5kLm00IGVhc2llciB0byB3cml0ZS4gIE5vdGUgdGhhdCB3ZSAqY2Fubm90KiB1c2UgYSBjYXNlCi0jIGhlcmUsIGJlY2F1c2UgdGhpcyBmaWxlIGNhbiBvbmx5IGNvbnRhaW4gb25lIGNhc2Ugc3RhdGVtZW50LgotaWYgdGVzdCAiJGRlcG1vZGUiID0gaHA7IHRoZW4KLSAgIyBIUCBjb21waWxlciB1c2VzIC1NIGFuZCBubyBleHRyYSBhcmcuCi0gIGdjY2ZsYWc9LU0KLSAgZGVwbW9kZT1nY2MKLWZpCi0KLWlmIHRlc3QgIiRkZXBtb2RlIiA9IGRhc2hYbXN0ZG91dDsgdGhlbgotICAgIyBUaGlzIGlzIGp1c3QgbGlrZSBkYXNobXN0ZG91dCB3aXRoIGEgZGlmZmVyZW50IGFyZ3VtZW50LgotICAgZGFzaG1mbGFnPS14TQotICAgZGVwbW9kZT1kYXNobXN0ZG91dAotZmkKLQotY3lncGF0aF91PSJjeWdwYXRoIC11IC1mIC0iCi1pZiB0ZXN0ICIkZGVwbW9kZSIgPSBtc3ZjbXN5czsgdGhlbgotICAgIyBUaGlzIGlzIGp1c3QgbGlrZSBtc3Zpc3VhbGNwcCBidXQgdy9vIGN5Z3BhdGggdHJhbnNsYXRpb24uCi0gICAjIEp1c3QgY29udmVydCB0aGUgYmFja3NsYXNoLWVzY2FwZWQgYmFja3NsYXNoZXMgdG8gc2luZ2xlIGZvcndhcmQKLSAgICMgc2xhc2hlcyB0byBzYXRpc2Z5IGRlcGVuZC5tNAotICAgY3lncGF0aF91PSJzZWQgcyxcXFxcXFxcXCwvLGciCi0gICBkZXBtb2RlPW1zdmlzdWFsY3BwCi1maQotCi1jYXNlICIkZGVwbW9kZSIgaW4KLWdjYzMpCi0jIyBnY2MgMyBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgdHJhY2tpbmcgdGhhdCBkb2VzIGV4YWN0bHkgd2hhdAotIyMgd2Ugd2FudC4gIFlheSEgIE5vdGU6IGZvciBzb21lIHJlYXNvbiBsaWJ0b29sIDEuNCBkb2Vzbid0IGxpa2UKLSMjIGl0IGlmIC1NRCAtTVAgY29tZXMgYWZ0ZXIgdGhlIC1NRiBzdHVmZi4gIEhtbS4KLSMjIFVuZm9ydHVuYXRlbHksIEZyZWVCU0QgYzg5IGFjY2VwdGFuY2Ugb2YgZmxhZ3MgZGVwZW5kcyB1cG9uCi0jIyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IG9yZGVyOyBzbyBhZGQgdGhlIGZsYWdzIHdoZXJlIHRoZXkKLSMjIGFwcGVhciBpbiBkZXBlbmQyLmFtLiAgTm90ZSB0aGF0IHRoZSBzbG93ZG93biBpbmN1cnJlZCBoZXJlCi0jIyBhZmZlY3RzIG9ubHkgY29uZmlndXJlOiBpbiBtYWtlZmlsZXMsICVGQVNUREVQJSBzaG9ydGN1dHMgdGhpcy4KLSAgZm9yIGFyZwotICBkbwotICAgIGNhc2UgJGFyZyBpbgotICAgIC1jKSBzZXQgZm5vcmQgIiRAIiAtTVQgIiRvYmplY3QiIC1NRCAtTVAgLU1GICIkdG1wZGVwZmlsZSIgIiRhcmciIDs7Ci0gICAgKikgIHNldCBmbm9yZCAiJEAiICIkYXJnIiA7OwotICAgIGVzYWMKLSAgICBzaGlmdCAjIGZub3JkCi0gICAgc2hpZnQgIyAkYXJnCi0gIGRvbmUKLSAgIiRAIgotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgbXYgIiR0bXBkZXBmaWxlIiAiJGRlcGZpbGUiCi0gIDs7Ci0KLWdjYykKLSMjIFRoZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gZ2V0IGRlcGVuZGVuY3kgb3V0cHV0IGZyb20gZ2NjLiAgSGVyZSdzCi0jIyB3aHkgd2UgcGljayB0aGlzIHJhdGhlciBvYnNjdXJlIG1ldGhvZDoKLSMjIC0gRG9uJ3Qgd2FudCB0byB1c2UgLU1EIGJlY2F1c2Ugd2UnZCBsaWtlIHRoZSBkZXBlbmRlbmNpZXMgdG8gZW5kCi0jIyAgIHVwIGluIGEgc3ViZGlyLiAgSGF2aW5nIHRvIHJlbmFtZSBieSBoYW5kIGlzIHVnbHkuCi0jIyAgIChXZSBtaWdodCBlbmQgdXAgZG9pbmcgdGhpcyBhbnl3YXkgdG8gc3VwcG9ydCBvdGhlciBjb21waWxlcnMuKQotIyMgLSBUaGUgREVQRU5ERU5DSUVTX09VVFBVVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYWtlcyBnY2MgYWN0IGxpa2UKLSMjICAgLU1NLCBub3QgLU0gKGRlc3BpdGUgd2hhdCB0aGUgZG9jcyBzYXkpLgotIyMgLSBVc2luZyAtTSBkaXJlY3RseSBtZWFucyBydW5uaW5nIHRoZSBjb21waWxlciB0d2ljZSAoZXZlbiB3b3JzZQotIyMgICB0aGFuIHJlbmFtaW5nKS4KLSAgaWYgdGVzdCAteiAiJGdjY2ZsYWciOyB0aGVuCi0gICAgZ2NjZmxhZz0tTUQsCi0gIGZpCi0gICIkQCIgLVdwLCIkZ2NjZmxhZyR0bXBkZXBmaWxlIgotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgcm0gLWYgIiRkZXBmaWxlIgotICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgotICBhbHBoYT1BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ci0jIyBUaGUgc2Vjb25kIC1lIGV4cHJlc3Npb24gaGFuZGxlcyBET1Mtc3R5bGUgZmlsZSBuYW1lcyB3aXRoIGRyaXZlIGxldHRlcnMuCi0gIHNlZCAtZSAncy9eW146XSo6IC8gLycgXAotICAgICAgLWUgJ3MvXlsnJGFscGhhJ106XC9bXjpdKjogLyAvJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgotIyMgVGhpcyBuZXh0IHBpZWNlIG9mIG1hZ2ljIGF2b2lkcyB0aGUgYGRlbGV0ZWQgaGVhZGVyIGZpbGUnIHByb2JsZW0uCi0jIyBUaGUgcHJvYmxlbSBpcyB0aGF0IHdoZW4gYSBoZWFkZXIgZmlsZSB3aGljaCBhcHBlYXJzIGluIGEgLlAgZmlsZQotIyMgaXMgZGVsZXRlZCwgdGhlIGRlcGVuZGVuY3kgY2F1c2VzIG1ha2UgdG8gZGllIChiZWNhdXNlIHRoZXJlIGlzCi0jIyB0eXBpY2FsbHkgbm8gd2F5IHRvIHJlYnVpbGQgdGhlIGhlYWRlcikuICBXZSBhdm9pZCB0aGlzIGJ5IGFkZGluZwotIyMgZHVtbXkgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGhlYWRlciBmaWxlLiAgVG9vIGJhZCBnY2MgZG9lc24ndCBkbwotIyMgdGhpcyBmb3IgdXMgZGlyZWN0bHkuCi0gIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiB8Ci0jIyBTb21lIHZlcnNpb25zIG9mIGdjYyBwdXQgYSBzcGFjZSBiZWZvcmUgdGhlIGA6Jy4gIE9uIHRoZSB0aGVvcnkKLSMjIHRoYXQgdGhlIHNwYWNlIG1lYW5zIHNvbWV0aGluZywgd2UgYWRkIGEgc3BhY2UgdG8gdGhlIG91dHB1dCBhcwotIyMgd2VsbC4KLSMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0jIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgotICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWhwKQotICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKLSAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAotICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgotICBleGl0IDEKLSAgOzsKLQotc2dpKQotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICAiJEAiICItV3AsLU1EdXBkYXRlLCR0bXBkZXBmaWxlIgotICBlbHNlCi0gICAgIiRAIiAtTUR1cGRhdGUgIiR0bXBkZXBmaWxlIgotICBmaQotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgcm0gLWYgIiRkZXBmaWxlIgotCi0gIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbiAgIyB5ZXMsIHRoZSBzb3VyY2VmaWxlIGRlcGVuZCBvbiBvdGhlciBmaWxlcwotICAgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCi0KLSAgICAjIENsaXAgb2ZmIHRoZSBpbml0aWFsIGVsZW1lbnQgKHRoZSBkZXBlbmRlbnQpLiAgRG9uJ3QgdHJ5IHRvIGJlCi0gICAgIyBjbGV2ZXIgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIHNlZCBjb2RlLCBhcyBJUklYIHNlZCB3b24ndCBoYW5kbGUKLSAgICAjIGxpbmVzIHdpdGggbW9yZSB0aGFuIGEgZml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKDQwOTYgaW4KLSAgICAjIElSSVggNi4yIHNlZCwgODE5MiBpbiBJUklYIDYuNSkuICBXZSBhbHNvIHJlbW92ZSBjb21tZW50IGxpbmVzOwotICAgICMgdGhlIElSSVggY2MgYWRkcyBjb21tZW50cyBsaWtlIGAjOmZlYycgdG8gdGhlIGVuZCBvZiB0aGUKLSAgICAjIGRlcGVuZGVuY3kgbGluZS4KLSAgICB0ciAnICcgJwotJyA8ICIkdG1wZGVwZmlsZSIgXAotICAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyB8IFwKLSAgICB0ciAnCi0nICcgJyA+PiAiJGRlcGZpbGUiCi0gICAgZWNobyA+PiAiJGRlcGZpbGUiCi0KLSAgICAjIFRoZSBzZWNvbmQgcGFzcyBnZW5lcmF0ZXMgYSBkdW1teSBlbnRyeSBmb3IgZWFjaCBoZWFkZXIgZmlsZS4KLSAgICB0ciAnICcgJwotJyA8ICIkdG1wZGVwZmlsZSIgXAotICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIC1lICdzLyQvOi8nIFwKLSAgID4+ICIkZGVwZmlsZSIKLSAgZWxzZQotICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0Ci0gICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCi0gICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KLSAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICBmaQotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWFpeCkKLSAgIyBUaGUgQyBmb3IgQUlYIENvbXBpbGVyIHVzZXMgLU0gYW5kIG91dHB1dHMgdGhlIGRlcGVuZGVuY2llcwotICAjIGluIGEgLnUgZmlsZS4gIEluIG9sZGVyIHZlcnNpb25zLCB0aGlzIGZpbGUgYWx3YXlzIGxpdmVzIGluIHRoZQotICAjIGN1cnJlbnQgZGlyZWN0b3J5LiAgQWxzbywgdGhlIEFJWCBjb21waWxlciBwdXRzIGAkb2JqZWN0OicgYXQgdGhlCi0gICMgc3RhcnQgb2YgZWFjaCBsaW5lOyAkb2JqZWN0IGRvZXNuJ3QgaGF2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCi0gICMgVmVyc2lvbiA2IHVzZXMgdGhlIGRpcmVjdG9yeSBpbiBib3RoIGNhc2VzLgotICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAotICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KLSAgYmFzZT1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8Xi4qL3x8JyAtZSAncy9cLm8kLy8nIC1lICdzL1wubG8kLy8nYAotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UudQotICAgIHRtcGRlcGZpbGUyPSRiYXNlLnUKLSAgICB0bXBkZXBmaWxlMz0kZGlyLmxpYnMvJGJhc2UudQotICAgICIkQCIgLVdjLC1NCi0gIGVsc2UKLSAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UudQotICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS51Ci0gICAgdG1wZGVwZmlsZTM9JGRpciRiYXNlLnUKLSAgICAiJEAiIC1NCi0gIGZpCi0gIHN0YXQ9JD8KLQotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiCi0gICAgZXhpdCAkc3RhdAotICBmaQotCi0gIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiCi0gIGRvCi0gICAgdGVzdCAtZiAiJHRtcGRlcGZpbGUiICYmIGJyZWFrCi0gIGRvbmUKLSAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCi0gICAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcuCi0gICAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KLSAgICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCi0gICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKLSAgICAjIFRoYXQncyBhIHRhYiBhbmQgYSBzcGFjZSBpbiB0aGUgW10uCi0gICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gIGVsc2UKLSAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAotICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQotICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCi0gICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKLSAgZmkKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICA7OwotCi1pY2MpCi0gICMgSW50ZWwncyBDIGNvbXBpbGVyIHVuZGVyc3RhbmRzIGAtTUQgLU1GIGZpbGUnLiAgSG93ZXZlciBvbgotICAjICAgIGljYyAtTUQgLU1GIGZvby5kIC1jIC1vIHN1Yi9mb28ubyBzdWIvZm9vLmMKLSAgIyBJQ0MgNy4wIHdpbGwgZmlsbCBmb28uZCB3aXRoIHNvbWV0aGluZyBsaWtlCi0gICMgICAgZm9vLm86IHN1Yi9mb28uYwotICAjICAgIGZvby5vOiBzdWIvZm9vLmgKLSAgIyB3aGljaCBpcyB3cm9uZy4gIFdlIHdhbnQ6Ci0gICMgICAgc3ViL2Zvby5vOiBzdWIvZm9vLmMKLSAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uaAotICAjICAgIHN1Yi9mb28uYzoKLSAgIyAgICBzdWIvZm9vLmg6Ci0gICMgSUNDIDcuMSB3aWxsIG91dHB1dAotICAjICAgIGZvby5vOiBzdWIvZm9vLmMgc3ViL2Zvby5oCi0gICMgYW5kIHdpbGwgd3JhcCBsb25nIGxpbmVzIHVzaW5nIFwgOgotICAjICAgIGZvby5vOiBzdWIvZm9vLmMgLi4uIFwKLSAgIyAgICAgc3ViL2Zvby5oIC4uLiBcCi0gICMgICAgIC4uLgotCi0gICIkQCIgLU1EIC1NRiAiJHRtcGRlcGZpbGUiCi0gIHN0YXQ9JD8KLSAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gIGVsc2UKLSAgICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gICAgZXhpdCAkc3RhdAotICBmaQotICBybSAtZiAiJGRlcGZpbGUiCi0gICMgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtIGBmb28ubzogZGVwZW5kZW50LmgnLAotICAjIG9yIGBmb28ubzogZGVwMS5oIGRlcDIuaCBcJywgb3IgYCBkZXAzLmggZGVwNC5oIFwnLgotICAjIERvIHR3byBwYXNzZXMsIG9uZSB0byBqdXN0IGNoYW5nZSB0aGVzZSB0bwotICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCi0gIHNlZCAicyxeW146XSo6LCRvYmplY3QgOiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKLSAgIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgotICAjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCi0gIHNlZCAncyxeW146XSo6IFwoLipcKSQsXDEsO3MvXlxcJC8vOy9eJC9kOy86JC9kJyA8ICIkdG1wZGVwZmlsZSIgfAotICAgIHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWhwMikKLSAgIyBUaGUgImhwIiBzdGFuemEgYWJvdmUgZG9lcyBub3Qgd29yayB3aXRoIGFDQyAoQysrKSBhbmQgSFAncyBpYTY0Ci0gICMgY29tcGlsZXJzLCB3aGljaCBoYXZlIGludGVncmF0ZWQgcHJlcHJvY2Vzc29ycy4gIFRoZSBjb3JyZWN0IG9wdGlvbgotICAjIHRvIHVzZSB3aXRoIHRoZXNlIGlzICtNYWtlZDsgaXQgd3JpdGVzIGRlcGVuZGVuY2llcyB0byBhIGZpbGUgbmFtZWQKLSAgIyAnZm9vLmQnLCB3aGljaCBsYW5kcyBuZXh0IHRvIHRoZSBvYmplY3QgZmlsZSwgd2hlcmV2ZXIgdGhhdAotICAjIGhhcHBlbnMgdG8gYmUuCi0gICMgTXVjaCBvZiB0aGlzIGlzIHNpbWlsYXIgdG8gdGhlIHRydTY0IGNhc2U7IHNlZSBjb21tZW50cyB0aGVyZS4KLSAgZGlyPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3wvW14vXSokfC98J2AKLSAgdGVzdCAieCRkaXIiID0gIngkb2JqZWN0IiAmJiBkaXI9Ci0gIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKLSAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLmQKLSAgICB0bXBkZXBmaWxlMj0kZGlyLmxpYnMvJGJhc2UuZAotICAgICIkQCIgLVdjLCtNYWtlZAotICBlbHNlCi0gICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLmQKLSAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2UuZAotICAgICIkQCIgK01ha2VkCi0gIGZpCi0gIHN0YXQ9JD8KLSAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gIGVsc2UKLSAgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIKLSAgICAgZXhpdCAkc3RhdAotICBmaQotCi0gIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiCi0gIGRvCi0gICAgdGVzdCAtZiAiJHRtcGRlcGZpbGUiICYmIGJyZWFrCi0gIGRvbmUKLSAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCi0gICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gICAgIyBBZGQgYGRlcGVuZGVudC5oOicgbGluZXMuCi0gICAgc2VkIC1uZSAnMiwkewotCSAgICAgICBzL14gKi8vCi0JICAgICAgIHMvIFxcKiQvLwotCSAgICAgICBzLyQvOi8KLQkgICAgICAgcAotCSAgICAgfScgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gIGVsc2UKLSAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICBmaQotICBybSAtZiAiJHRtcGRlcGZpbGUiICIkdG1wZGVwZmlsZTIiCi0gIDs7Ci0KLXRydTY0KQotICAgIyBUaGUgVHJ1NjQgY29tcGlsZXIgdXNlcyAtTUQgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jaWVzIGFzIGEgc2lkZQotICAgIyBlZmZlY3QuICBgY2MgLU1EIC1vIGZvby5vIC4uLicgcHV0cyB0aGUgZGVwZW5kZW5jaWVzIGludG8gYGZvby5vLmQnLgotICAgIyBBdCBsZWFzdCBvbiBBbHBoYS9SZWRoYXQgNi4xLCBDb21wYXEgQ0NDIFY2LjItNTA0IHNlZW1zIHRvIHB1dAotICAgIyBkZXBlbmRlbmNpZXMgaW4gYGZvby5kJyBpbnN0ZWFkLCBzbyB3ZSBjaGVjayBmb3IgdGhhdCB0b28uCi0gICAjIFN1YmRpcmVjdG9yaWVzIGFyZSByZXNwZWN0ZWQuCi0gICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAotICAgdGVzdCAieCRkaXIiID0gIngkb2JqZWN0IiAmJiBkaXI9Ci0gICBiYXNlPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wubyQvLycgLWUgJ3MvXC5sbyQvLydgCi0KLSAgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgICAgIyBXaXRoIFRydTY0IGNjLCBzaGFyZWQgb2JqZWN0cyBjYW4gYWxzbyBiZSB1c2VkIHRvIG1ha2UgYQotICAgICAgIyBzdGF0aWMgbGlicmFyeS4gIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgaW4gbGlidG9vbCAxLjQgc2VyaWVzIHRvCi0gICAgICAjIGhhbmRsZSBib3RoIHNoYXJlZCBhbmQgc3RhdGljIGxpYnJhcmllcyBpbiBhIHNpbmdsZSBjb21waWxhdGlvbi4KLSAgICAgICMgV2l0aCBsaWJ0b29sIDEuNCwgZGVwZW5kZW5jaWVzIHdlcmUgb3V0cHV0IGluICRkaXIubGlicy8kYmFzZS5sby5kLgotICAgICAgIwotICAgICAgIyBXaXRoIGxpYnRvb2wgMS41IHRoaXMgZXhjZXB0aW9uIHdhcyByZW1vdmVkLCBhbmQgbGlidG9vbCBub3cKLSAgICAgICMgZ2VuZXJhdGVzIDIgc2VwYXJhdGUgb2JqZWN0cyBmb3IgdGhlIDIgbGlicmFyaWVzLiAgVGhlc2UgdHdvCi0gICAgICAjIGNvbXBpbGF0aW9ucyBvdXRwdXQgZGVwZW5kZW5jaWVzIGluICRkaXIubGlicy8kYmFzZS5vLmQgYW5kCi0gICAgICAjIGluICRkaXIkYmFzZS5vLmQuICBXZSBoYXZlIHRvIGNoZWNrIGZvciBib3RoIGZpbGVzLCBiZWNhdXNlCi0gICAgICAjIG9uZSBvZiB0aGUgdHdvIGNvbXBpbGF0aW9ucyBjYW4gYmUgZGlzYWJsZWQuICBXZSBzaG91bGQgcHJlZmVyCi0gICAgICAjICRkaXIkYmFzZS5vLmQgb3ZlciAkZGlyLmxpYnMvJGJhc2Uuby5kIGJlY2F1c2UgdGhlIGxhdHRlciBpcwotICAgICAgIyBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgd2hlbiAubGlicy8gaXMgZGVsZXRlZCwgd2hpbGUgaWdub3JpbmcKLSAgICAgICMgdGhlIGZvcm1lciB3b3VsZCBjYXVzZSBhIGRpc3RjbGVhbmNoZWNrIHBhbmljLgotICAgICAgdG1wZGVwZmlsZTE9JGRpci5saWJzLyRiYXNlLmxvLmQgICAjIGxpYnRvb2wgMS40Ci0gICAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2Uuby5kICAgICAgICAgICMgbGlidG9vbCAxLjUKLSAgICAgIHRtcGRlcGZpbGUzPSRkaXIubGlicy8kYmFzZS5vLmQgICAgIyBsaWJ0b29sIDEuNQotICAgICAgdG1wZGVwZmlsZTQ9JGRpci5saWJzLyRiYXNlLmQgICAgICAjIENvbXBhcSBDQ0MgVjYuMi01MDQKLSAgICAgICIkQCIgLVdjLC1NRAotICAgZWxzZQotICAgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLm8uZAotICAgICAgdG1wZGVwZmlsZTI9JGRpciRiYXNlLmQKLSAgICAgIHRtcGRlcGZpbGUzPSRkaXIkYmFzZS5kCi0gICAgICB0bXBkZXBmaWxlND0kZGlyJGJhc2UuZAotICAgICAgIiRAIiAtTUQKLSAgIGZpCi0KLSAgIHN0YXQ9JD8KLSAgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICAgZWxzZQotICAgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIgIiR0bXBkZXBmaWxlNCIKLSAgICAgIGV4aXQgJHN0YXQKLSAgIGZpCi0KLSAgIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiICIkdG1wZGVwZmlsZTQiCi0gICBkbwotICAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKLSAgIGRvbmUKLSAgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgotICAgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKLSAgICAgICMgVGhhdCdzIGEgdGFiIGFuZCBhIHNwYWNlIGluIHRoZSBbXS4KLSAgICAgIHNlZCAtZSAncyxeLipcLlthLXpdKjpbCSBdKiwsJyAtZSAncywkLDosJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgotICAgZWxzZQotICAgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKLSAgIGZpCi0gICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gICA7OwotCi0jbm9zaWRlZWZmZWN0KQotICAjIFRoaXMgY29tbWVudCBhYm92ZSBpcyB1c2VkIGJ5IGF1dG9tYWtlIHRvIHRlbGwgc2lkZS1lZmZlY3QKLSAgIyBkZXBlbmRlbmN5IHRyYWNraW5nIG1lY2hhbmlzbXMgZnJvbSBzbG93ZXIgb25lcy4KLQotZGFzaG1zdGRvdXQpCi0gICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgotICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLgotICAiJEAiIHx8IGV4aXQgJD8KLQotICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICB3aGlsZSB0ZXN0ICJYJDEiICE9ICdYLS1tb2RlPWNvbXBpbGUnOyBkbwotICAgICAgc2hpZnQKLSAgICBkb25lCi0gICAgc2hpZnQKLSAgZmkKLQotICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCi0gIElGUz0iICIKLSAgZm9yIGFyZwotICBkbwotICAgIGNhc2UgJGFyZyBpbgotICAgIC1vKQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgJG9iamVjdCkKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICopCi0gICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKLSAgICAgIHNoaWZ0ICMgZm5vcmQKLSAgICAgIHNoaWZ0ICMgJGFyZwotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICB0ZXN0IC16ICIkZGFzaG1mbGFnIiAmJiBkYXNobWZsYWc9LU0KLSAgIyBSZXF1aXJlIGF0IGxlYXN0IHR3byBjaGFyYWN0ZXJzIGJlZm9yZSBzZWFyY2hpbmcgZm9yIGA6JwotICAjIGluIHRoZSB0YXJnZXQgbmFtZS4gIFRoaXMgaXMgdG8gY29wZSB3aXRoIERPUy1zdHlsZSBmaWxlbmFtZXM6Ci0gICMgYSBkZXBlbmRlbmN5IHN1Y2ggYXMgYGM6L2Zvby9iYXInIGNvdWxkIGJlIHNlZW4gYXMgdGFyZ2V0IGBjJyBvdGhlcndpc2UuCi0gICIkQCIgJGRhc2htZmxhZyB8Ci0gICAgc2VkICdzOl5bICBdKlteOiBdW146XVteOl0qXDpbICAgIF0qOiciJG9iamVjdCInXDogOicgPiAiJHRtcGRlcGZpbGUiCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKLSAgdHIgJyAnICcKLScgPCAiJHRtcGRlcGZpbGUiIHwgXAotIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KLSMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCi0gICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotZGFzaFhtc3Rkb3V0KQotICAjIFRoaXMgY2FzZSBvbmx5IGV4aXN0cyB0byBzYXRpc2Z5IGRlcGVuZC5tNC4gIEl0IGlzIG5ldmVyIGFjdHVhbGx5Ci0gICMgcnVuLCBhcyB0aGlzIG1vZGUgaXMgc3BlY2lhbGx5IHJlY29nbml6ZWQgaW4gdGhlIHByZWFtYmxlLgotICBleGl0IDEKLSAgOzsKLQotbWFrZWRlcGVuZCkKLSAgIiRAIiB8fCBleGl0ICQ/Ci0gICMgUmVtb3ZlIGFueSBMaWJ0b29sIGNhbGwKLSAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0gICMgWCBtYWtlZGVwZW5kCi0gIHNoaWZ0Ci0gIGNsZWFyZWQ9bm8gZWF0PW5vCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICRjbGVhcmVkIGluCi0gICAgbm8pCi0gICAgICBzZXQgIiI7IHNoaWZ0Ci0gICAgICBjbGVhcmVkPXllcyA7OwotICAgIGVzYWMKLSAgICBpZiB0ZXN0ICRlYXQgPSB5ZXM7IHRoZW4KLSAgICAgIGVhdD1ubwotICAgICAgY29udGludWUKLSAgICBmaQotICAgIGNhc2UgIiRhcmciIGluCi0gICAgLUQqfC1JKikKLSAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKLSAgICAjIFN0cmlwIGFueSBvcHRpb24gdGhhdCBtYWtlZGVwZW5kIG1heSBub3QgdW5kZXJzdGFuZC4gIFJlbW92ZQotICAgICMgdGhlIG9iamVjdCB0b28sIG90aGVyd2lzZSBtYWtlZGVwZW5kIHdpbGwgcGFyc2UgaXQgYXMgYSBzb3VyY2UgZmlsZS4KLSAgICAtYXJjaCkKLSAgICAgIGVhdD15ZXMgOzsKLSAgICAtKnwkb2JqZWN0KQotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OwotICAgIGVzYWMKLSAgZG9uZQotICBvYmpfc3VmZml4PWBlY2hvICIkb2JqZWN0IiB8IHNlZCAncy9eLipcLi8uLydgCi0gIHRvdWNoICIkdG1wZGVwZmlsZSIKLSAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHNlZCAnMSwyZCcgIiR0bXBkZXBmaWxlIiB8IHRyICcgJyAnCi0nIHwgXAotIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KLSMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCi0gICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlIi5iYWsKLSAgOzsKLQotY3BwKQotICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKLSAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KLSAgIiRAIiB8fCBleGl0ICQ/Ci0KLSAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KLSAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0KLSAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICRhcmcgaW4KLSAgICAtbykKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICRvYmplY3QpCi0gICAgICBzaGlmdAotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCi0gICAgICBzaGlmdCAjIGZub3JkCi0gICAgICBzaGlmdCAjICRhcmcKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgIiRAIiAtRSB8Ci0gICAgc2VkIC1uIC1lICcvXiMgWzAtOV1bMC05XSogIlwoW14iXSpcKSIuKi8gczo6IFwxIFxcOnAnIFwKLSAgICAgICAtZSAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgfAotICAgIHNlZCAnJCBzOiBcXCQ6OicgPiAiJHRtcGRlcGZpbGUiCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKLSAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gIHNlZCA8ICIkdG1wZGVwZmlsZSIgJy9eJC9kO3MvXiAvLztzLyBcXCQvLztzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotbXN2aXN1YWxjcHApCi0gICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgotICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LgotICAiJEAiIHx8IGV4aXQgJD8KLQotICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICB3aGlsZSB0ZXN0ICJYJDEiICE9ICdYLS1tb2RlPWNvbXBpbGUnOyBkbwotICAgICAgc2hpZnQKLSAgICBkb25lCi0gICAgc2hpZnQKLSAgZmkKLQotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICIkYXJnIiBpbgotICAgIC1vKQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgJG9iamVjdCkKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICItR20ifCIvR20ifCItR2kifCIvR2kifCItWkkifCIvWkkiKQotCXNldCBmbm9yZCAiJEAiCi0Jc2hpZnQKLQlzaGlmdAotCTs7Ci0gICAgKikKLQlzZXQgZm5vcmQgIiRAIiAiJGFyZyIKLQlzaGlmdAotCXNoaWZ0Ci0JOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgIiRAIiAtRSAyPi9kZXYvbnVsbCB8Ci0gIHNlZCAtbiAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi8gczo6XDE6cCcgfCAkY3lncGF0aF91IHwgc29ydCAtdSA+ICIkdG1wZGVwZmlsZSIKLSAgcm0gLWYgIiRkZXBmaWxlIgotICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgotICBzZWQgPCAiJHRtcGRlcGZpbGUiIC1uIC1lICdzJSAlXFwgJWcnIC1lICcvXlwoLipcKSQvIHM6OglcMSBcXDpwJyA+PiAiJGRlcGZpbGUiCi0gIGVjaG8gIgkiID4+ICIkZGVwZmlsZSIKLSAgc2VkIDwgIiR0bXBkZXBmaWxlIiAtbiAtZSAncyUgJVxcICVnJyAtZSAnL15cKC4qXCkkLyBzOjpcMVw6OnAnID4+ICIkZGVwZmlsZSIKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICA7OwotCi1tc3ZjbXN5cykKLSAgIyBUaGlzIGNhc2UgZXhpc3RzIG9ubHkgdG8gbGV0IGRlcGVuZC5tNCBkbyBpdHMgd29yay4gIEl0IHdvcmtzIGJ5Ci0gICMgbG9va2luZyBhdCB0aGUgdGV4dCBvZiB0aGlzIHNjcmlwdC4gIFRoaXMgY2FzZSB3aWxsIG5ldmVyIGJlIHJ1biwKLSAgIyBzaW5jZSBpdCBpcyBjaGVja2VkIGZvciBhYm92ZS4KLSAgZXhpdCAxCi0gIDs7Ci0KLW5vbmUpCi0gIGV4ZWMgIiRAIgotICA7OwotCi0qKQotICBlY2hvICJVbmtub3duIGRlcG1vZGUgJGRlcG1vZGUiIDE+JjIKLSAgZXhpdCAxCi0gIDs7Ci1lc2FjCi0KLWV4aXQgMAotCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgbW9kZTogc2hlbGwtc2NyaXB0Ci0jIHNoLWluZGVudGF0aW9uOiAyCi0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKLSMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCi0jIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9leGFtcGxlLmMgYi9zcmMvbGlicG5nL2V4YW1wbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczOTE3My4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2V4YW1wbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDgzOCArMCwwIEBACi0KLSNpZiAwIC8qIGluIGNhc2Ugc29tZW9uZSBhY3R1YWxseSB0cmllcyB0byBjb21waWxlIHRoaXMgKi8KLQotLyogZXhhbXBsZS5jIC0gYW4gZXhhbXBsZSBvZiB1c2luZyBsaWJwbmcKLSAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS40LjIgW01heSA2LCAyMDEwXQotICogVGhpcyBmaWxlIGhhcyBiZWVuIHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbiBieSB0aGUgYXV0aG9ycy4KLSAqIE1haW50YWluZWQgMTk5OC0yMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICogTWFpbnRhaW5lZCAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQotICogV3JpdHRlbiAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqLwotCi0vKiBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBsaWJwbmcgdG8gcmVhZCBhbmQgd3JpdGUgUE5HIGZpbGVzLgotICogVGhlIGZpbGUgbGlicG5nLnR4dCBpcyBtdWNoIG1vcmUgdmVyYm9zZSB0aGVuIHRoaXMuICBJZiB5b3UgaGF2ZSBub3QKLSAqIHJlYWQgaXQsIGRvIHNvIGZpcnN0LiAgVGhpcyB3YXMgZGVzaWduZWQgdG8gYmUgYSBzdGFydGluZyBwb2ludCBvZiBhbgotICogaW1wbGVtZW50YXRpb24uICBUaGlzIGlzIG5vdCBvZmZpY2lhbGx5IHBhcnQgb2YgbGlicG5nLCBpcyBoZXJlYnkgcGxhY2VkCi0gKiBpbiB0aGUgcHVibGljIGRvbWFpbiwgYW5kIHRoZXJlZm9yZSBkb2VzIG5vdCByZXF1aXJlIGEgY29weXJpZ2h0IG5vdGljZS4KLSAqCi0gKiBUaGlzIGZpbGUgZG9lcyBub3QgY3VycmVudGx5IGNvbXBpbGUsIGJlY2F1c2UgaXQgaXMgbWlzc2luZyBjZXJ0YWluCi0gKiBwYXJ0cywgbGlrZSBhbGxvY2F0aW5nIG1lbW9yeSB0byBob2xkIGFuIGltYWdlLiAgWW91IHdpbGwgaGF2ZSB0bwotICogc3VwcGx5IHRoZXNlIHBhcnRzIHRvIGdldCBpdCB0byBjb21waWxlLiAgRm9yIGFuIGV4YW1wbGUgb2YgYSBtaW5pbWFsCi0gKiB3b3JraW5nIFBORyByZWFkZXIvd3JpdGVyLCBzZWUgcG5ndGVzdC5jLCBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbjsKLSAqIHNlZSBhbHNvIHRoZSBwcm9ncmFtcyBpbiB0aGUgY29udHJpYiBkaXJlY3RvcnkuCi0gKi8KLQotI2luY2x1ZGUgInBuZy5oIgotCi0gLyogVGhlIHBuZ19qbXBidWYoKSBtYWNybywgdXNlZCBpbiBlcnJvciBoYW5kbGluZywgYmVjYW1lIGF2YWlsYWJsZSBpbgotICAqIGxpYnBuZyB2ZXJzaW9uIDEuMC42LiAgSWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBydW4geW91ciBjb2RlIHdpdGggb2xkZXIKLSAgKiB2ZXJzaW9ucyBvZiBsaWJwbmcsIHlvdSBtdXN0IGRlZmluZSB0aGUgbWFjcm8geW91cnNlbGYgKGJ1dCBvbmx5IGlmIGl0Ci0gICogaXMgbm90IGFscmVhZHkgZGVmaW5lZCBieSBsaWJwbmchKS4KLSAgKi8KLQotI2lmbmRlZiBwbmdfam1wYnVmCi0jICBkZWZpbmUgcG5nX2ptcGJ1ZihwbmdfcHRyKSAoKHBuZ19wdHIpLT5qbXBidWYpCi0jZW5kaWYKLQotLyogQ2hlY2sgdG8gc2VlIGlmIGEgZmlsZSBpcyBhIFBORyBmaWxlIHVzaW5nIHBuZ19zaWdfY21wKCkuICBwbmdfc2lnX2NtcCgpCi0gKiByZXR1cm5zIHplcm8gaWYgdGhlIGltYWdlIGlzIGEgUE5HIGFuZCBub256ZXJvIGlmIGl0IGlzbid0IGEgUE5HLgotICoKLSAqIFRoZSBmdW5jdGlvbiBjaGVja19pZl9wbmcoKSBzaG93biBoZXJlLCBidXQgbm90IHVzZWQsIHJldHVybnMgbm9uemVybyAodHJ1ZSkKLSAqIGlmIHRoZSBmaWxlIGNhbiBiZSBvcGVuZWQgYW5kIGlzIGEgUE5HLCAwIChmYWxzZSkgb3RoZXJ3aXNlLgotICoKLSAqIElmIHRoaXMgY2FsbCBpcyBzdWNjZXNzZnVsLCBhbmQgeW91IGFyZSBnb2luZyB0byBrZWVwIHRoZSBmaWxlIG9wZW4sCi0gKiB5b3Ugc2hvdWxkIGNhbGwgcG5nX3NldF9zaWdfYnl0ZXMocG5nX3B0ciwgUE5HX0JZVEVTX1RPX0NIRUNLKTsgb25jZQotICogeW91IGhhdmUgY3JlYXRlZCB0aGUgcG5nX3B0ciwgc28gdGhhdCBsaWJwbmcga25vd3MgeW91ciBhcHBsaWNhdGlvbgotICogaGFzIHJlYWQgdGhhdCBtYW55IGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAgTWFrZSBzdXJlIHlvdQotICogZG9uJ3QgY2FsbCBwbmdfc2V0X3NpZ19ieXRlcygpIHdpdGggbW9yZSB0aGFuIDggYnl0ZXMgcmVhZCBvciBnaXZlIGl0Ci0gKiBhbiBpbmNvcnJlY3QgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIHlvdSB3aWxsIGVpdGhlciBoYXZlIHJlYWQgdG9vCi0gKiBtYW55IGJ5dGVzICh5b3VyIGZhdWx0KSwgb3IgeW91IGFyZSB0ZWxsaW5nIGxpYnBuZyB0byByZWFkIHRoZSB3cm9uZwotICogbnVtYmVyIG9mIG1hZ2ljIGJ5dGVzIChhbHNvIHlvdXIgZmF1bHQpLgotICoKLSAqIE1hbnkgYXBwbGljYXRpb25zIGFscmVhZHkgcmVhZCB0aGUgZmlyc3QgMiBvciA0IGJ5dGVzIGZyb20gdGhlIHN0YXJ0Ci0gKiBvZiB0aGUgaW1hZ2UgdG8gZGV0ZXJtaW5lIHRoZSBmaWxlIHR5cGUsIHNvIGl0IHdvdWxkIGJlIGVhc2llc3QganVzdAotICogdG8gcGFzcyB0aGUgYnl0ZXMgdG8gcG5nX3NpZ19jbXAoKSBvciBldmVuIHNraXAgdGhhdCBpZiB5b3Uga25vdwotICogeW91IGhhdmUgYSBQTkcgZmlsZSwgYW5kIGNhbGwgcG5nX3NldF9zaWdfYnl0ZXMoKS4KLSAqLwotI2RlZmluZSBQTkdfQllURVNfVE9fQ0hFQ0sgNAotaW50IGNoZWNrX2lmX3BuZyhjaGFyICpmaWxlX25hbWUsIEZJTEUgKipmcCkKLXsKLSAgIGNoYXIgYnVmW1BOR19CWVRFU19UT19DSEVDS107Ci0KLSAgIC8qIE9wZW4gdGhlIHByb3NwZWN0aXZlIFBORyBmaWxlLiAqLwotICAgaWYgKCgqZnAgPSBmb3BlbihmaWxlX25hbWUsICJyYiIpKSA9PSBOVUxMKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgIC8qIFJlYWQgaW4gc29tZSBvZiB0aGUgc2lnbmF0dXJlIGJ5dGVzICovCi0gICBpZiAoZnJlYWQoYnVmLCAxLCBQTkdfQllURVNfVE9fQ0hFQ0ssICpmcCkgIT0gUE5HX0JZVEVTX1RPX0NIRUNLKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgIC8qIENvbXBhcmUgdGhlIGZpcnN0IFBOR19CWVRFU19UT19DSEVDSyBieXRlcyBvZiB0aGUgc2lnbmF0dXJlLgotICAgICAgUmV0dXJuIG5vbnplcm8gKHRydWUpIGlmIHRoZXkgbWF0Y2ggKi8KLQotICAgcmV0dXJuKCFwbmdfc2lnX2NtcChidWYsIChwbmdfc2l6ZV90KTAsIFBOR19CWVRFU19UT19DSEVDSykpOwotfQotCi0vKiBSZWFkIGEgUE5HIGZpbGUuICBZb3UgbWF5IHdhbnQgdG8gcmV0dXJuIGFuIGVycm9yIGNvZGUgaWYgdGhlIHJlYWQKLSAqIGZhaWxzIChkZXBlbmRpbmcgdXBvbiB0aGUgZmFpbHVyZSkuICBUaGVyZSBhcmUgdHdvICJwcm90b3R5cGVzIiBnaXZlbgotICogaGVyZSAtIG9uZSB3aGVyZSB3ZSBhcmUgZ2l2ZW4gdGhlIGZpbGVuYW1lLCBhbmQgd2UgbmVlZCB0byBvcGVuIHRoZQotICogZmlsZSwgYW5kIHRoZSBvdGhlciB3aGVyZSB3ZSBhcmUgZ2l2ZW4gYW4gb3BlbiBmaWxlIChwb3NzaWJseSB3aXRoCi0gKiBzb21lIG9yIGFsbCBvZiB0aGUgbWFnaWMgYnl0ZXMgcmVhZCAtIHNlZSBjb21tZW50cyBhYm92ZSkuCi0gKi8KLSNpZmRlZiBvcGVuX2ZpbGUgLyogcHJvdG90eXBlIDEgKi8KLXZvaWQgcmVhZF9wbmcoY2hhciAqZmlsZV9uYW1lKSAgLyogV2UgbmVlZCB0byBvcGVuIHRoZSBmaWxlICovCi17Ci0gICBwbmdfc3RydWN0cCBwbmdfcHRyOwotICAgcG5nX2luZm9wIGluZm9fcHRyOwotICAgdW5zaWduZWQgaW50IHNpZ19yZWFkID0gMDsKLSAgIHBuZ191aW50XzMyIHdpZHRoLCBoZWlnaHQ7Ci0gICBpbnQgYml0X2RlcHRoLCBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZTsKLSAgIEZJTEUgKmZwOwotCi0gICBpZiAoKGZwID0gZm9wZW4oZmlsZV9uYW1lLCAicmIiKSkgPT0gTlVMTCkKLSAgICAgIHJldHVybiAoRVJST1IpOwotCi0jZWxzZSBub19vcGVuX2ZpbGUgLyogcHJvdG90eXBlIDIgKi8KLXZvaWQgcmVhZF9wbmcoRklMRSAqZnAsIHVuc2lnbmVkIGludCBzaWdfcmVhZCkgIC8qIEZpbGUgaXMgYWxyZWFkeSBvcGVuICovCi17Ci0gICBwbmdfc3RydWN0cCBwbmdfcHRyOwotICAgcG5nX2luZm9wIGluZm9fcHRyOwotICAgcG5nX3VpbnRfMzIgd2lkdGgsIGhlaWdodDsKLSAgIGludCBiaXRfZGVwdGgsIGNvbG9yX3R5cGUsIGludGVybGFjZV90eXBlOwotI2VuZGlmIG5vX29wZW5fZmlsZSAvKiBPbmx5IHVzZSBvbmUgcHJvdG90eXBlISAqLwotCi0gICAvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIHBuZ19zdHJ1Y3Qgd2l0aCB0aGUgZGVzaXJlZCBlcnJvciBoYW5kbGVyCi0gICAgKiBmdW5jdGlvbnMuICBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIGRlZmF1bHQgc3RkZXJyIGFuZCBsb25nanVtcCBtZXRob2QsCi0gICAgKiB5b3UgY2FuIHN1cHBseSBOVUxMIGZvciB0aGUgbGFzdCB0aHJlZSBwYXJhbWV0ZXJzLiAgV2UgYWxzbyBzdXBwbHkgdGhlCi0gICAgKiB0aGUgY29tcGlsZXIgaGVhZGVyIGZpbGUgdmVyc2lvbiwgc28gdGhhdCB3ZSBrbm93IGlmIHRoZSBhcHBsaWNhdGlvbgotICAgICogd2FzIGNvbXBpbGVkIHdpdGggYSBjb21wYXRpYmxlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuICBSRVFVSVJFRAotICAgICovCi0gICBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsCi0gICAgICBwbmdfdm9pZHAgdXNlcl9lcnJvcl9wdHIsIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICB7Ci0gICAgICBmY2xvc2UoZnApOwotICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICB9Ci0KLSAgIC8qIEFsbG9jYXRlL2luaXRpYWxpemUgdGhlIG1lbW9yeSBmb3IgaW1hZ2UgaW5mb3JtYXRpb24uICBSRVFVSVJFRC4gKi8KLSAgIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLSAgIGlmIChpbmZvX3B0ciA9PSBOVUxMKQotICAgewotICAgICAgZmNsb3NlKGZwKTsKLSAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCBOVUxMLCBOVUxMKTsKLSAgICAgIHJldHVybiAoRVJST1IpOwotICAgfQotCi0gICAvKiBTZXQgZXJyb3IgaGFuZGxpbmcgaWYgeW91IGFyZSB1c2luZyB0aGUgc2V0am1wL2xvbmdqbXAgbWV0aG9kICh0aGlzIGlzCi0gICAgKiB0aGUgbm9ybWFsIG1ldGhvZCBvZiBkb2luZyB0aGluZ3Mgd2l0aCBsaWJwbmcpLiAgUkVRVUlSRUQgdW5sZXNzIHlvdQotICAgICogc2V0IHVwIHlvdXIgb3duIGVycm9yIGhhbmRsZXJzIGluIHRoZSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCkgZWFybGllci4KLSAgICAqLwotCi0gICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKQotICAgewotICAgICAgLyogRnJlZSBhbGwgb2YgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHBuZ19wdHIgYW5kIGluZm9fcHRyICovCi0gICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLSAgICAgIGZjbG9zZShmcCk7Ci0gICAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgaGFkIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBmaWxlICovCi0gICAgICByZXR1cm4gKEVSUk9SKTsKLSAgIH0KLQotICAgLyogT25lIG9mIHRoZSBmb2xsb3dpbmcgSS9PIGluaXRpYWxpemF0aW9uIG1ldGhvZHMgaXMgUkVRVUlSRUQgKi8KLSNpZmRlZiBzdHJlYW1zIC8qIFBORyBmaWxlIEkvTyBtZXRob2QgMSAqLwotICAgLyogU2V0IHVwIHRoZSBpbnB1dCBjb250cm9sIGlmIHlvdSBhcmUgdXNpbmcgc3RhbmRhcmQgQyBzdHJlYW1zICovCi0gICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBmcCk7Ci0KLSNlbHNlIG5vX3N0cmVhbXMgLyogUE5HIGZpbGUgSS9PIG1ldGhvZCAyICovCi0gICAvKiBJZiB5b3UgYXJlIHVzaW5nIHJlcGxhY2VtZW50IHJlYWQgZnVuY3Rpb25zLCBpbnN0ZWFkIG9mIGNhbGxpbmcKLSAgICAqIHBuZ19pbml0X2lvKCkgaGVyZSB5b3Ugd291bGQgY2FsbDoKLSAgICAqLwotICAgcG5nX3NldF9yZWFkX2ZuKHBuZ19wdHIsICh2b2lkICopdXNlcl9pb19wdHIsIHVzZXJfcmVhZF9mbik7Ci0gICAvKiB3aGVyZSB1c2VyX2lvX3B0ciBpcyBhIHN0cnVjdHVyZSB5b3Ugd2FudCBhdmFpbGFibGUgdG8gdGhlIGNhbGxiYWNrcyAqLwotI2VuZGlmIG5vX3N0cmVhbXMgLyogVXNlIG9ubHkgb25lIEkvTyBtZXRob2QhICovCi0KLSAgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSByZWFkIHNvbWUgb2YgdGhlIHNpZ25hdHVyZSAqLwotICAgcG5nX3NldF9zaWdfYnl0ZXMocG5nX3B0ciwgc2lnX3JlYWQpOwotCi0jaWZkZWYgaGlsZXZlbAotICAgLyoKLSAgICAqIElmIHlvdSBoYXZlIGVub3VnaCBtZW1vcnkgdG8gcmVhZCBpbiB0aGUgZW50aXJlIGltYWdlIGF0IG9uY2UsCi0gICAgKiBhbmQgeW91IG5lZWQgdG8gc3BlY2lmeSBvbmx5IHRyYW5zZm9ybXMgdGhhdCBjYW4gYmUgY29udHJvbGxlZAotICAgICogd2l0aCBvbmUgb2YgdGhlIFBOR19UUkFOU0ZPUk1fKiBiaXRzICh0aGlzIHByZXNlbnRseSBleGNsdWRlcwotICAgICogcXVhbnRpemluZywgZmlsbGluZywgc2V0dGluZyBiYWNrZ3JvdW5kLCBhbmQgZG9pbmcgZ2FtbWEKLSAgICAqIGFkanVzdG1lbnQpLCB0aGVuIHlvdSBjYW4gcmVhZCB0aGUgZW50aXJlIGltYWdlIChpbmNsdWRpbmcKLSAgICAqIHBpeGVscykgaW50byB0aGUgaW5mbyBzdHJ1Y3R1cmUgd2l0aCB0aGlzIGNhbGw6Ci0gICAgKi8KLSAgIHBuZ19yZWFkX3BuZyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3RyYW5zZm9ybXMsIE5VTEwpOwotCi0jZWxzZQotICAgLyogT0ssIHlvdSdyZSBkb2luZyBpdCB0aGUgaGFyZCB3YXksIHdpdGggdGhlIGxvd2VyLWxldmVsIGZ1bmN0aW9ucyAqLwotCi0gICAvKiBUaGUgY2FsbCB0byBwbmdfcmVhZF9pbmZvKCkgZ2l2ZXMgdXMgYWxsIG9mIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZQotICAgICogUE5HIGZpbGUgYmVmb3JlIHRoZSBmaXJzdCBJREFUIChpbWFnZSBkYXRhIGNodW5rKS4gIFJFUVVJUkVECi0gICAgKi8KLSAgIHBuZ19yZWFkX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICBwbmdfZ2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsICZ3aWR0aCwgJmhlaWdodCwgJmJpdF9kZXB0aCwgJmNvbG9yX3R5cGUsCi0gICAgICAgJmludGVybGFjZV90eXBlLCBOVUxMLCBOVUxMKTsKLQotICAgLyogU2V0IHVwIHRoZSBkYXRhIHRyYW5zZm9ybWF0aW9ucyB5b3Ugd2FudC4gIE5vdGUgdGhhdCB0aGVzZSBhcmUgYWxsCi0gICAgKiBvcHRpb25hbC4gIE9ubHkgY2FsbCB0aGVtIGlmIHlvdSB3YW50L25lZWQgdGhlbS4gIE1hbnkgb2YgdGhlCi0gICAgKiB0cmFuc2Zvcm1hdGlvbnMgb25seSB3b3JrIG9uIHNwZWNpZmljIHR5cGVzIG9mIGltYWdlcywgYW5kIG1hbnkKLSAgICAqIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCi0gICAgKi8KLQotICAgLyogVGVsbCBsaWJwbmcgdG8gc3RyaXAgMTYgYml0L2NvbG9yIGZpbGVzIGRvd24gdG8gOCBiaXRzL2NvbG9yICovCi0gICBwbmdfc2V0X3N0cmlwXzE2KHBuZ19wdHIpOwotCi0gICAvKiBTdHJpcCBhbHBoYSBieXRlcyBmcm9tIHRoZSBpbnB1dCBkYXRhIHdpdGhvdXQgY29tYmluaW5nIHdpdGggdGhlCi0gICAgKiBiYWNrZ3JvdW5kIChub3QgcmVjb21tZW5kZWQpLgotICAgICovCi0gICBwbmdfc2V0X3N0cmlwX2FscGhhKHBuZ19wdHIpOwotCi0gICAvKiBFeHRyYWN0IG11bHRpcGxlIHBpeGVscyB3aXRoIGJpdCBkZXB0aHMgb2YgMSwgMiwgYW5kIDQgZnJvbSBhIHNpbmdsZQotICAgICogYnl0ZSBpbnRvIHNlcGFyYXRlIGJ5dGVzICh1c2VmdWwgZm9yIHBhbGV0dGVkIGFuZCBncmF5c2NhbGUgaW1hZ2VzKS4KLSAgICAqLwotICAgcG5nX3NldF9wYWNraW5nKHBuZ19wdHIpOwotCi0gICAvKiBDaGFuZ2UgdGhlIG9yZGVyIG9mIHBhY2tlZCBwaXhlbHMgdG8gbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGZpcnN0Ci0gICAgKiAobm90IHVzZWZ1bCBpZiB5b3UgYXJlIHVzaW5nIHBuZ19zZXRfcGFja2luZykuICovCi0gICBwbmdfc2V0X3BhY2tzd2FwKHBuZ19wdHIpOwotCi0gICAvKiBFeHBhbmQgcGFsZXR0ZWQgY29sb3JzIGludG8gdHJ1ZSBSR0IgdHJpcGxldHMgKi8KLSAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiKHBuZ19wdHIpOwotCi0gICAvKiBFeHBhbmQgZ3JheXNjYWxlIGltYWdlcyB0byB0aGUgZnVsbCA4IGJpdHMgZnJvbSAxLCAyLCBvciA0IGJpdHMvcGl4ZWwgKi8KLSAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgJiYgYml0X2RlcHRoIDwgOCkKLSAgICAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOChwbmdfcHRyKTsKLQotICAgLyogRXhwYW5kIHBhbGV0dGVkIG9yIFJHQiBpbWFnZXMgd2l0aCB0cmFuc3BhcmVuY3kgdG8gZnVsbCBhbHBoYSBjaGFubmVscwotICAgICogc28gdGhlIGRhdGEgd2lsbCBiZSBhdmFpbGFibGUgYXMgUkdCQSBxdWFydGV0cy4KLSAgICAqLwotICAgaWYgKHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX3RSTlMpKQotICAgICAgcG5nX3NldF90Uk5TX3RvX2FscGhhKHBuZ19wdHIpOwotCi0gICAvKiBTZXQgdGhlIGJhY2tncm91bmQgY29sb3IgdG8gZHJhdyB0cmFuc3BhcmVudCBhbmQgYWxwaGEgaW1hZ2VzIG92ZXIuCi0gICAgKiBJdCBpcyBwb3NzaWJsZSB0byBzZXQgdGhlIHJlZCwgZ3JlZW4sIGFuZCBibHVlIGNvbXBvbmVudHMgZGlyZWN0bHkKLSAgICAqIGZvciBwYWxldHRlZCBpbWFnZXMgaW5zdGVhZCBvZiBzdXBwbHlpbmcgYSBwYWxldHRlIGluZGV4LiAgTm90ZSB0aGF0Ci0gICAgKiBldmVuIGlmIHRoZSBQTkcgZmlsZSBzdXBwbGllcyBhIGJhY2tncm91bmQsIHlvdSBhcmUgbm90IHJlcXVpcmVkIHRvCi0gICAgKiB1c2UgaXQgLSB5b3Ugc2hvdWxkIHVzZSB0aGUgKHNvbGlkKSBhcHBsaWNhdGlvbiBiYWNrZ3JvdW5kIGlmIGl0IGhhcyBvbmUuCi0gICAgKi8KLQotICAgcG5nX2NvbG9yXzE2IG15X2JhY2tncm91bmQsICppbWFnZV9iYWNrZ3JvdW5kOwotCi0gICBpZiAocG5nX2dldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCAmaW1hZ2VfYmFja2dyb3VuZCkpCi0gICAgICBwbmdfc2V0X2JhY2tncm91bmQocG5nX3B0ciwgaW1hZ2VfYmFja2dyb3VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFLCAxLCAxLjApOwotICAgZWxzZQotICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19wdHIsICZteV9iYWNrZ3JvdW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTiwgMCwgMS4wKTsKLQotICAgLyogU29tZSBzdWdnZXN0aW9ucyBhcyB0byBob3cgdG8gZ2V0IGEgc2NyZWVuIGdhbW1hIHZhbHVlCi0gICAgKgotICAgICogTm90ZSB0aGF0IHNjcmVlbiBnYW1tYSBpcyB0aGUgZGlzcGxheV9leHBvbmVudCwgd2hpY2ggaW5jbHVkZXMKLSAgICAqIHRoZSBDUlRfZXhwb25lbnQgYW5kIGFueSBjb3JyZWN0aW9uIGZvciB2aWV3aW5nIGNvbmRpdGlvbnMKLSAgICAqLwotICAgaWYgKC8qIFdlIGhhdmUgYSB1c2VyLWRlZmluZWQgc2NyZWVuIGdhbW1hIHZhbHVlICovKQotICAgewotICAgICAgc2NyZWVuX2dhbW1hID0gdXNlci1kZWZpbmVkIHNjcmVlbl9nYW1tYTsKLSAgIH0KLSAgIC8qIFRoaXMgaXMgb25lIHdheSB0aGF0IGFwcGxpY2F0aW9ucyBzaGFyZSB0aGUgc2FtZSBzY3JlZW4gZ2FtbWEgdmFsdWUgKi8KLSAgIGVsc2UgaWYgKChnYW1tYV9zdHIgPSBnZXRlbnYoIlNDUkVFTl9HQU1NQSIpKSAhPSBOVUxMKQotICAgewotICAgICAgc2NyZWVuX2dhbW1hID0gYXRvZihnYW1tYV9zdHIpOwotICAgfQotICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhbm90aGVyIHZhbHVlICovCi0gICBlbHNlCi0gICB7Ci0gICAgICBzY3JlZW5fZ2FtbWEgPSAyLjI7ICAvKiBBIGdvb2QgZ3Vlc3MgZm9yIGEgUEMgbW9uaXRvciBpbiBhIGRpbWx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXQgcm9vbSAqLwotICAgICAgc2NyZWVuX2dhbW1hID0gMS43IG9yIDEuMDsgIC8qIEEgZ29vZCBndWVzcyBmb3IgTWFjIHN5c3RlbXMgKi8KLSAgIH0KLQotICAgLyogVGVsbCBsaWJwbmcgdG8gaGFuZGxlIHRoZSBnYW1tYSBjb252ZXJzaW9uIGZvciB5b3UuICBUaGUgZmluYWwgY2FsbAotICAgICogaXMgYSBnb29kIGd1ZXNzIGZvciBQQyBnZW5lcmF0ZWQgaW1hZ2VzLCBidXQgaXQgc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZQotICAgICogYnkgdGhlIHVzZXIgYXQgcnVuIHRpbWUgYnkgdGhlIHVzZXIuICBJdCBpcyBzdHJvbmdseSBzdWdnZXN0ZWQgdGhhdAotICAgICogeW91ciBhcHBsaWNhdGlvbiBzdXBwb3J0IGdhbW1hIGNvcnJlY3Rpb24uCi0gICAgKi8KLQotICAgaW50IGludGVudDsKLQotICAgaWYgKHBuZ19nZXRfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgJmludGVudCkpCi0gICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIHNjcmVlbl9nYW1tYSwgMC40NTQ1NSk7Ci0gICBlbHNlCi0gICB7Ci0gICAgICBkb3VibGUgaW1hZ2VfZ2FtbWE7Ci0gICAgICBpZiAocG5nX2dldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCAmaW1hZ2VfZ2FtbWEpKQotICAgICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBzY3JlZW5fZ2FtbWEsIGltYWdlX2dhbW1hKTsKLSAgICAgIGVsc2UKLSAgICAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgc2NyZWVuX2dhbW1hLCAwLjQ1NDU1KTsKLSAgIH0KLQotI2lmZGVmIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRAotICAgLyogUXVhbnRpemUgUkdCIGZpbGVzIGRvd24gdG8gOCBiaXQgcGFsZXR0ZSBvciByZWR1Y2UgcGFsZXR0ZXMKLSAgICAqIHRvIHRoZSBudW1iZXIgb2YgY29sb3JzIGF2YWlsYWJsZSBvbiB5b3VyIHNjcmVlbi4KLSAgICAqLwotICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKLSAgIHsKLSAgICAgIGludCBudW1fcGFsZXR0ZTsKLSAgICAgIHBuZ19jb2xvcnAgcGFsZXR0ZTsKLQotICAgICAgLyogVGhpcyByZWR1Y2VzIHRoZSBpbWFnZSB0byB0aGUgYXBwbGljYXRpb24gc3VwcGxpZWQgcGFsZXR0ZSAqLwotICAgICAgaWYgKC8qIFdlIGhhdmUgb3VyIG93biBwYWxldHRlICovKQotICAgICAgewotICAgICAgICAgLyogQW4gYXJyYXkgb2YgY29sb3JzIHRvIHdoaWNoIHRoZSBpbWFnZSBzaG91bGQgYmUgcXVhbnRpemVkICovCi0gICAgICAgICBwbmdfY29sb3Igc3RkX2NvbG9yX2N1YmVbTUFYX1NDUkVFTl9DT0xPUlNdOwotCi0gICAgICAgICAvKiBQcmlvciB0byBsaWJwbmctMS40LjIsIHRoaXMgd2FzIHBuZ19zZXRfZGl0aGVyKCkuICovCi0gICAgICAgICBwbmdfc2V0X3F1YW50aXplKHBuZ19wdHIsIHN0ZF9jb2xvcl9jdWJlLCBNQVhfU0NSRUVOX0NPTE9SUywKLSAgICAgICAgICAgIE1BWF9TQ1JFRU5fQ09MT1JTLCBOVUxMLCAwKTsKLSAgICAgIH0KLSAgICAgIC8qIFRoaXMgcmVkdWNlcyB0aGUgaW1hZ2UgdG8gdGhlIHBhbGV0dGUgc3VwcGxpZWQgaW4gdGhlIGZpbGUgKi8KLSAgICAgIGVsc2UgaWYgKHBuZ19nZXRfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgJnBhbGV0dGUsICZudW1fcGFsZXR0ZSkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfdWludF8xNnAgaGlzdG9ncmFtID0gTlVMTDsKLQotICAgICAgICAgcG5nX2dldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCAmaGlzdG9ncmFtKTsKLQotICAgICAgICAgcG5nX3NldF9xdWFudGl6ZShwbmdfcHRyLCBwYWxldHRlLCBudW1fcGFsZXR0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heF9zY3JlZW5fY29sb3JzLCBoaXN0b2dyYW0sIDApOwotICAgICAgfQotICAgfQotI2VuZGlmIC8qIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRCAqLwotCi0gICAvKiBJbnZlcnQgbW9ub2Nocm9tZSBmaWxlcyB0byBoYXZlIDAgYXMgd2hpdGUgYW5kIDEgYXMgYmxhY2sgKi8KLSAgIHBuZ19zZXRfaW52ZXJ0X21vbm8ocG5nX3B0cik7Ci0KLSAgIC8qIElmIHlvdSB3YW50IHRvIHNoaWZ0IHRoZSBwaXhlbCB2YWx1ZXMgZnJvbSB0aGUgcmFuZ2UgWzAsMjU1XSBvcgotICAgICogWzAsNjU1MzVdIHRvIHRoZSBvcmlnaW5hbCBbMCw3XSBvciBbMCwzMV0sIG9yIHdoYXRldmVyIHJhbmdlIHRoZQotICAgICogY29sb3JzIHdlcmUgb3JpZ2luYWxseSBpbjoKLSAgICAqLwotICAgaWYgKHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX3NCSVQpKQotICAgewotICAgICAgcG5nX2NvbG9yXzhwIHNpZ19iaXRfcDsKLQotICAgICAgcG5nX2dldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmc2lnX2JpdF9wKTsKLSAgICAgIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgc2lnX2JpdF9wKTsKLSAgIH0KLQotICAgLyogRmxpcCB0aGUgUkdCIHBpeGVscyB0byBCR1IgKG9yIFJHQkEgdG8gQkdSQSkgKi8KLSAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCi0gICAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsKLQotICAgLyogU3dhcCB0aGUgUkdCQSBvciBHQSBkYXRhIHRvIEFSR0Igb3IgQUcgKG9yIEJHUkEgdG8gQUJHUikgKi8KLSAgIHBuZ19zZXRfc3dhcF9hbHBoYShwbmdfcHRyKTsKLQotICAgLyogU3dhcCBieXRlcyBvZiAxNiBiaXQgZmlsZXMgdG8gbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAqLwotICAgcG5nX3NldF9zd2FwKHBuZ19wdHIpOwotCi0gICAvKiBBZGQgZmlsbGVyIChvciBhbHBoYSkgYnl0ZSAoYmVmb3JlL2FmdGVyIGVhY2ggUkdCIHRyaXBsZXQpICovCi0gICBwbmdfc2V0X2ZpbGxlcihwbmdfcHRyLCAweGZmLCBQTkdfRklMTEVSX0FGVEVSKTsKLQotICAgLyogVHVybiBvbiBpbnRlcmxhY2UgaGFuZGxpbmcuICBSRVFVSVJFRCBpZiB5b3UgYXJlIG5vdCB1c2luZwotICAgICogcG5nX3JlYWRfaW1hZ2UoKS4gIFRvIHNlZSBob3cgdG8gaGFuZGxlIGludGVybGFjaW5nIHBhc3NlcywKLSAgICAqIHNlZSB0aGUgcG5nX3JlYWRfcm93KCkgbWV0aG9kIGJlbG93OgotICAgICovCi0gICBudW1iZXJfcGFzc2VzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7Ci0KLSAgIC8qIE9wdGlvbmFsIGNhbGwgdG8gZ2FtbWEgY29ycmVjdCBhbmQgYWRkIHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSBwYWxldHRlCi0gICAgKiBhbmQgdXBkYXRlIGluZm8gc3RydWN0dXJlLiAgUkVRVUlSRUQgaWYgeW91IGFyZSBleHBlY3RpbmcgbGlicG5nIHRvCi0gICAgKiB1cGRhdGUgdGhlIHBhbGV0dGUgZm9yIHlvdSAoaWUgeW91IHNlbGVjdGVkIHN1Y2ggYSB0cmFuc2Zvcm0gYWJvdmUpLgotICAgICovCi0gICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgIC8qIEFsbG9jYXRlIHRoZSBtZW1vcnkgdG8gaG9sZCB0aGUgaW1hZ2UgdXNpbmcgdGhlIGZpZWxkcyBvZiBpbmZvX3B0ci4gKi8KLQotICAgLyogVGhlIGVhc2llc3Qgd2F5IHRvIHJlYWQgdGhlIGltYWdlOiAqLwotICAgcG5nX2J5dGVwIHJvd19wb2ludGVyc1toZWlnaHRdOwotCi0gICAvKiBDbGVhciB0aGUgcG9pbnRlciBhcnJheSAqLwotICAgZm9yIChyb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKQotICAgICAgcm93X3BvaW50ZXJzW3Jvd10gPSBOVUxMOwotCi0gICBmb3IgKHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspCi0gICAgICByb3dfcG9pbnRlcnNbcm93XSA9IHBuZ19tYWxsb2MocG5nX3B0ciwgcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLAotICAgICAgICAgaW5mb19wdHIpKTsKLQotICAgLyogTm93IGl0J3MgdGltZSB0byByZWFkIHRoZSBpbWFnZS4gIE9uZSBvZiB0aGVzZSBtZXRob2RzIGlzIFJFUVVJUkVEICovCi0jaWZkZWYgZW50aXJlIC8qIFJlYWQgdGhlIGVudGlyZSBpbWFnZSBpbiBvbmUgZ28gKi8KLSAgIHBuZ19yZWFkX2ltYWdlKHBuZ19wdHIsIHJvd19wb2ludGVycyk7Ci0KLSNlbHNlIG5vX2VudGlyZSAvKiBSZWFkIHRoZSBpbWFnZSBvbmUgb3IgbW9yZSBzY2FubGluZXMgYXQgYSB0aW1lICovCi0gICAvKiBUaGUgb3RoZXIgd2F5IHRvIHJlYWQgaW1hZ2VzIC0gZGVhbCB3aXRoIGludGVybGFjaW5nOiAqLwotCi0gICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgbnVtYmVyX3Bhc3NlczsgcGFzcysrKQotICAgewotI2lmZGVmIHNpbmdsZSAvKiBSZWFkIHRoZSBpbWFnZSBhIHNpbmdsZSByb3cgYXQgYSB0aW1lICovCi0gICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCi0gICAgICB7Ci0gICAgICAgICBwbmdfcmVhZF9yb3dzKHBuZ19wdHIsICZyb3dfcG9pbnRlcnNbeV0sIE5VTEwsIDEpOwotICAgICAgfQotCi0jZWxzZSBub19zaW5nbGUgLyogUmVhZCB0aGUgaW1hZ2Ugc2V2ZXJhbCByb3dzIGF0IGEgdGltZSAqLwotICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSArPSBudW1iZXJfb2Zfcm93cykKLSAgICAgIHsKLSNpZmRlZiBzcGFya2xlIC8qIFJlYWQgdGhlIGltYWdlIHVzaW5nIHRoZSAic3BhcmtsZSIgZWZmZWN0LiAqLwotICAgICAgICAgcG5nX3JlYWRfcm93cyhwbmdfcHRyLCAmcm93X3BvaW50ZXJzW3ldLCBOVUxMLAotICAgICAgICAgICAgbnVtYmVyX29mX3Jvd3MpOwotI2Vsc2Ugbm9fc3BhcmtsZSAvKiBSZWFkIHRoZSBpbWFnZSB1c2luZyB0aGUgInJlY3RhbmdsZSIgZWZmZWN0ICovCi0gICAgICAgICBwbmdfcmVhZF9yb3dzKHBuZ19wdHIsIE5VTEwsICZyb3dfcG9pbnRlcnNbeV0sCi0gICAgICAgICAgICBudW1iZXJfb2Zfcm93cyk7Ci0jZW5kaWYgbm9fc3BhcmtsZSAvKiBVc2Ugb25seSBvbmUgb2YgdGhlc2UgdHdvIG1ldGhvZHMgKi8KLSAgICAgIH0KLQotICAgICAgLyogSWYgeW91IHdhbnQgdG8gZGlzcGxheSB0aGUgaW1hZ2UgYWZ0ZXIgZXZlcnkgcGFzcywgZG8gc28gaGVyZSAqLwotI2VuZGlmIG5vX3NpbmdsZSAvKiBVc2Ugb25seSBvbmUgb2YgdGhlc2UgdHdvIG1ldGhvZHMgKi8KLSAgIH0KLSNlbmRpZiBub19lbnRpcmUgLyogVXNlIG9ubHkgb25lIG9mIHRoZXNlIHR3byBtZXRob2RzICovCi0KLSAgIC8qIFJlYWQgcmVzdCBvZiBmaWxlLCBhbmQgZ2V0IGFkZGl0aW9uYWwgY2h1bmtzIGluIGluZm9fcHRyIC0gUkVRVUlSRUQgKi8KLSAgIHBuZ19yZWFkX2VuZChwbmdfcHRyLCBpbmZvX3B0cik7Ci0jZW5kaWYgaGlsZXZlbAotCi0gICAvKiBBdCB0aGlzIHBvaW50IHlvdSBoYXZlIHJlYWQgdGhlIGVudGlyZSBpbWFnZSAqLwotCi0gICAvKiBDbGVhbiB1cCBhZnRlciB0aGUgcmVhZCwgYW5kIGZyZWUgYW55IG1lbW9yeSBhbGxvY2F0ZWQgLSBSRVFVSVJFRCAqLwotICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7Ci0KLSAgIC8qIENsb3NlIHRoZSBmaWxlICovCi0gICBmY2xvc2UoZnApOwotCi0gICAvKiBUaGF0J3MgaXQgKi8KLSAgIHJldHVybiAoT0spOwotfQotCi0vKiBQcm9ncmVzc2l2ZWx5IHJlYWQgYSBmaWxlICovCi0KLWludAotaW5pdGlhbGl6ZV9wbmdfcmVhZGVyKHBuZ19zdHJ1Y3RwICpwbmdfcHRyLCBwbmdfaW5mb3AgKmluZm9fcHRyKQotewotICAgLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBwbmdfc3RydWN0IHdpdGggdGhlIGRlc2lyZWQgZXJyb3IgaGFuZGxlcgotICAgICogZnVuY3Rpb25zLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBkZWZhdWx0IHN0ZGVyciBhbmQgbG9uZ2p1bXAgbWV0aG9kLAotICAgICogeW91IGNhbiBzdXBwbHkgTlVMTCBmb3IgdGhlIGxhc3QgdGhyZWUgcGFyYW1ldGVycy4gIFdlIGFsc28gY2hlY2sgdGhhdAotICAgICogdGhlIGxpYnJhcnkgdmVyc2lvbiBpcyBjb21wYXRpYmxlIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGR5bmFtaWNhbGx5Ci0gICAgKiBsaW5rZWQgbGlicmFyaWVzLgotICAgICovCi0gICAqcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAotICAgICAgIHBuZ192b2lkcCB1c2VyX2Vycm9yX3B0ciwgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKLQotICAgaWYgKCpwbmdfcHRyID09IE5VTEwpCi0gICB7Ci0gICAgICAqaW5mb19wdHIgPSBOVUxMOwotICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICB9Ci0KLSAgICppbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0KLSAgIGlmICgqaW5mb19wdHIgPT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KHBuZ19wdHIsIGluZm9fcHRyLCBOVUxMKTsKLSAgICAgIHJldHVybiAoRVJST1IpOwotICAgfQotCi0gICBpZiAoc2V0am1wKHBuZ19qbXBidWYoKCpwbmdfcHRyKSkpKQotICAgewotICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QocG5nX3B0ciwgaW5mb19wdHIsIE5VTEwpOwotICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICB9Ci0KLSAgIC8qIFRoaXMgb25lJ3MgbmV3LiAgWW91IHdpbGwgbmVlZCB0byBwcm92aWRlIGFsbCB0aHJlZQotICAgICogZnVuY3Rpb24gY2FsbGJhY2tzLCBldmVuIGlmIHlvdSBhcmVuJ3QgdXNpbmcgdGhlbSBhbGwuCi0gICAgKiBJZiB5b3UgYXJlbid0IHVzaW5nIGFsbCBmdW5jdGlvbnMsIHlvdSBjYW4gc3BlY2lmeSBOVUxMCi0gICAgKiBwYXJhbWV0ZXJzLiAgRXZlbiB3aGVuIGFsbCB0aHJlZSBmdW5jdGlvbnMgYXJlIE5VTEwsCi0gICAgKiB5b3UgbmVlZCB0byBjYWxsIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbigpLgotICAgICogVGhlc2UgZnVuY3Rpb25zIHNob3VsZG4ndCBiZSBkZXBlbmRlbnQgb24gZ2xvYmFsIG9yCi0gICAgKiBzdGF0aWMgdmFyaWFibGVzIGlmIHlvdSBhcmUgZGVjb2Rpbmcgc2V2ZXJhbCBpbWFnZXMKLSAgICAqIHNpbXVsdGFuZW91c2x5LiAgWW91IHNob3VsZCBzdG9yZSBzdHJlYW0gc3BlY2lmaWMgZGF0YQotICAgICogaW4gYSBzZXBhcmF0ZSBzdHJ1Y3QsIGdpdmVuIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLAotICAgICogYW5kIHJldHJpZXZlIHRoZSBwb2ludGVyIGZyb20gaW5zaWRlIHRoZSBjYWxsYmFja3MgdXNpbmcKLSAgICAqIHRoZSBmdW5jdGlvbiBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmdfcHRyKS4KLSAgICAqLwotICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKCpwbmdfcHRyLCAodm9pZCAqKXN0cmVhbV9kYXRhLAotICAgICAgaW5mb19jYWxsYmFjaywgcm93X2NhbGxiYWNrLCBlbmRfY2FsbGJhY2spOwotCi0gICByZXR1cm4gKE9LKTsKLX0KLQotaW50Ci1wcm9jZXNzX2RhdGEocG5nX3N0cnVjdHAgKnBuZ19wdHIsIHBuZ19pbmZvcCAqaW5mb19wdHIsCi0gICBwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfdWludF8zMiBsZW5ndGgpCi17Ci0gICBpZiAoc2V0am1wKHBuZ19qbXBidWYoKCpwbmdfcHRyKSkpKQotICAgewotICAgICAgLyogRnJlZSB0aGUgcG5nX3B0ciBhbmQgaW5mb19wdHIgbWVtb3J5IG9uIGVycm9yICovCi0gICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdChwbmdfcHRyLCBpbmZvX3B0ciwgTlVMTCk7Ci0gICAgICByZXR1cm4gKEVSUk9SKTsKLSAgIH0KLQotICAgLyogVGhpcyBvbmUncyBuZXcgYWxzby4gIFNpbXBseSBnaXZlIGl0IGNodW5rcyBvZiBkYXRhIGFzCi0gICAgKiB0aGV5IGFycml2ZSBmcm9tIHRoZSBkYXRhIHN0cmVhbSAoaW4gb3JkZXIsIG9mIGNvdXJzZSkuCi0gICAgKiBPbiBzZWdtZW50ZWQgbWFjaGluZXMsIGRvbid0IGdpdmUgaXQgYW55IG1vcmUgdGhhbiA2NEsuCi0gICAgKiBUaGUgbGlicmFyeSBzZWVtcyB0byBydW4gZmluZSB3aXRoIHNpemVzIG9mIDRLLCBhbHRob3VnaAotICAgICogeW91IGNhbiBnaXZlIGl0IG11Y2ggbGVzcyBpZiBuZWNlc3NhcnkgKEkgYXNzdW1lIHlvdSBjYW4KLSAgICAqIGdpdmUgaXQgY2h1bmtzIG9mIDEgYnl0ZSwgYnV0IEkgaGF2ZW4ndCB0cmllZCB3aXRoIGxlc3MKLSAgICAqIHRoYW4gMjU2IGJ5dGVzIHlldCkuICBXaGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgeW91IG1heQotICAgICogd2FudCB0byBkaXNwbGF5IGFueSByb3dzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgaW4gdGhlIHJvdwotICAgICogY2FsbGJhY2ssIGlmIHlvdSBhcmVuJ3QgYWxyZWFkeSBkaXNwbGF5aW5nIHRoZW0gdGhlcmUuCi0gICAgKi8KLSAgIHBuZ19wcm9jZXNzX2RhdGEoKnBuZ19wdHIsICppbmZvX3B0ciwgYnVmZmVyLCBsZW5ndGgpOwotICAgcmV0dXJuIChPSyk7Ci19Ci0KLWluZm9fY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm8pCi17Ci0gICAvKiBEbyBhbnkgc2V0dXAgaGVyZSwgaW5jbHVkaW5nIHNldHRpbmcgYW55IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbnMKLSAgICAqIG1lbnRpb25lZCBpbiB0aGUgUmVhZGluZyBQTkcgZmlsZXMgc2VjdGlvbi4gIEZvciBub3csIHlvdSBfbXVzdF8KLSAgICAqIGNhbGwgZWl0aGVyIHBuZ19zdGFydF9yZWFkX2ltYWdlKCkgb3IgcG5nX3JlYWRfdXBkYXRlX2luZm8oKQotICAgICogYWZ0ZXIgYWxsIHRoZSB0cmFuc2Zvcm1hdGlvbnMgYXJlIHNldCAoZXZlbiBpZiB5b3UgZG9uJ3Qgc2V0Ci0gICAgKiBhbnkpLiAgWW91IG1heSBzdGFydCBnZXR0aW5nIHJvd3MgYmVmb3JlIHBuZ19wcm9jZXNzX2RhdGEoKQotICAgICogcmV0dXJucywgc28gdGhpcyBpcyB5b3VyIGxhc3QgY2hhbmNlIHRvIHByZXBhcmUgZm9yIHRoYXQuCi0gICAgKi8KLX0KLQotcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBuZXdfcm93LAotICAgcG5nX3VpbnRfMzIgcm93X251bSwgaW50IHBhc3MpCi17Ci0gICAvKgotICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGV2ZXJ5IHJvdyBpbiB0aGUgaW1hZ2UuICBJZiB0aGUKLSAgICAqIGltYWdlIGlzIGludGVybGFjZWQsIGFuZCB5b3UgdHVybmVkIG9uIHRoZSBpbnRlcmxhY2UgaGFuZGxlciwKLSAgICAqIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IHJvdyBpbiBldmVyeSBwYXNzLgotICAgICoKLSAgICAqIEluIHRoaXMgZnVuY3Rpb24geW91IHdpbGwgcmVjZWl2ZSBhIHBvaW50ZXIgdG8gbmV3IHJvdyBkYXRhIGZyb20KLSAgICAqIGxpYnBuZyBjYWxsZWQgbmV3X3JvdyB0aGF0IGlzIHRvIHJlcGxhY2UgYSBjb3JyZXNwb25kaW5nIHJvdyAob2YKLSAgICAqIHRoZSBzYW1lIGRhdGEgZm9ybWF0KSBpbiBhIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgeW91ciBhcHBsaWNhdGlvbi4KLSAgICAqCi0gICAgKiBUaGUgbmV3IHJvdyBkYXRhIHBvaW50ZXIgIm5ld19yb3ciIG1heSBiZSBOVUxMLCBpbmRpY2F0aW5nIHRoZXJlIGlzCi0gICAgKiBubyBuZXcgZGF0YSB0byBiZSByZXBsYWNlZCAoaW4gY2FzZXMgb2YgaW50ZXJsYWNlIGxvYWRpbmcpLgotICAgICoKLSAgICAqIElmIG5ld19yb3cgaXMgbm90IE5VTEwgdGhlbiB5b3UgbmVlZCB0byBjYWxsCi0gICAgKiBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3coKSB0byByZXBsYWNlIHRoZSBjb3JyZXNwb25kaW5nIHJvdyBhcwotICAgICogc2hvd24gYmVsb3c6Ci0gICAgKi8KLQotICAgLyogR2V0IHBvaW50ZXIgdG8gY29ycmVzcG9uZGluZyByb3cgaW4gb3VyCi0gICAgKiBQTkcgcmVhZCBidWZmZXIuCi0gICAgKi8KLSAgIHBuZ19ieXRlcCBvbGRfcm93ID0gKChwbmdfYnl0ZXAgKilvdXJfZGF0YSlbcm93X251bV07Ci0KLSAgIC8qIElmIGJvdGggcm93cyBhcmUgYWxsb2NhdGVkIHRoZW4gY29weSB0aGUgbmV3IHJvdwotICAgICogZGF0YSB0byB0aGUgY29ycmVzcG9uZGluZyByb3cgZGF0YS4KLSAgICAqLwotICAgaWYgKChvbGRfcm93ICE9IE5VTEwpICYmIChuZXdfcm93ICE9IE5VTEwpKQotICAgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KHBuZ19wdHIsIG9sZF9yb3csIG5ld19yb3cpOwotCi0gICAvKgotICAgICogVGhlIHJvd3MgYW5kIHBhc3NlcyBhcmUgY2FsbGVkIGluIG9yZGVyLCBzbyB5b3UgZG9uJ3QgcmVhbGx5Ci0gICAgKiBuZWVkIHRoZSByb3dfbnVtIGFuZCBwYXNzLCBidXQgSSdtIHN1cHBseWluZyB0aGVtIGJlY2F1c2UgaXQKLSAgICAqIG1heSBtYWtlIHlvdXIgbGlmZSBlYXNpZXIuCi0gICAgKgotICAgICogRm9yIHRoZSBub24tTlVMTCByb3dzIG9mIGludGVybGFjZWQgaW1hZ2VzLCB5b3UgbXVzdCBjYWxsCi0gICAgKiBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3coKSBwYXNzaW5nIGluIHRoZSBuZXcgcm93IGFuZCB0aGUKLSAgICAqIG9sZCByb3csIGFzIGRlbW9uc3RyYXRlZCBhYm92ZS4gIFlvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGZvcgotICAgICogTlVMTCByb3dzIChpdCB3aWxsIGp1c3QgcmV0dXJuKSBhbmQgZm9yIG5vbi1pbnRlcmxhY2VkIGltYWdlcwotICAgICogKGl0IGp1c3QgZG9lcyB0aGUgcG5nX21lbWNweSBmb3IgeW91KSBpZiBpdCB3aWxsIG1ha2UgdGhlIGNvZGUKLSAgICAqIGVhc2llci4gIFRodXMsIHlvdSBjYW4ganVzdCBkbyB0aGlzIGZvciBhbGwgY2FzZXM6Ci0gICAgKi8KLQotICAgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KHBuZ19wdHIsIG9sZF9yb3csIG5ld19yb3cpOwotCi0gICAvKiB3aGVyZSBvbGRfcm93IGlzIHdoYXQgd2FzIGRpc3BsYXllZCBmb3IgcHJldmlvdXMgcm93cy4gIE5vdGUKLSAgICAqIHRoYXQgdGhlIGZpcnN0IHBhc3MgKHBhc3MgPT0gMCByZWFsbHkpIHdpbGwgY29tcGxldGVseSBjb3ZlcgotICAgICogdGhlIG9sZCByb3csIHNvIHRoZSByb3dzIGRvIG5vdCBoYXZlIHRvIGJlIGluaXRpYWxpemVkLiAgQWZ0ZXIKLSAgICAqIHRoZSBmaXJzdCBwYXNzIChhbmQgb25seSBmb3IgaW50ZXJsYWNlZCBpbWFnZXMpLCB5b3Ugd2lsbCBoYXZlCi0gICAgKiB0byBwYXNzIHRoZSBjdXJyZW50IHJvdyBhcyBuZXdfcm93LCBhbmQgdGhlIGZ1bmN0aW9uIHdpbGwgY29tYmluZQotICAgICogdGhlIG9sZCByb3cgYW5kIHRoZSBuZXcgcm93LgotICAgICovCi19Ci0KLWVuZF9jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mbykKLXsKLSAgIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHdob2xlIGltYWdlIGhhcyBiZWVuIHJlYWQsCi0gICAgKiBpbmNsdWRpbmcgYW55IGNodW5rcyBhZnRlciB0aGUgaW1hZ2UgKHVwIHRvIGFuZCBpbmNsdWRpbmcKLSAgICAqIHRoZSBJRU5EKS4gIFlvdSB3aWxsIHVzdWFsbHkgaGF2ZSB0aGUgc2FtZSBpbmZvIGNodW5rIGFzIHlvdQotICAgICogaGFkIGluIHRoZSBoZWFkZXIsIGFsdGhvdWdoIHNvbWUgZGF0YSBtYXkgaGF2ZSBiZWVuIGFkZGVkCi0gICAgKiB0byB0aGUgY29tbWVudHMgYW5kIHRpbWUgZmllbGRzLgotICAgICoKLSAgICAqIE1vc3QgcGVvcGxlIHdvbid0IGRvIG11Y2ggaGVyZSwgcGVyaGFwcyBzZXR0aW5nIGEgZmxhZyB0aGF0Ci0gICAgKiBtYXJrcyB0aGUgaW1hZ2UgYXMgZmluaXNoZWQuCi0gICAgKi8KLX0KLQotLyogV3JpdGUgYSBwbmcgZmlsZSAqLwotdm9pZCB3cml0ZV9wbmcoY2hhciAqZmlsZV9uYW1lIC8qICwgLi4uIG90aGVyIGltYWdlIGluZm9ybWF0aW9uIC4uLiAqLykKLXsKLSAgIEZJTEUgKmZwOwotICAgcG5nX3N0cnVjdHAgcG5nX3B0cjsKLSAgIHBuZ19pbmZvcCBpbmZvX3B0cjsKLSAgIHBuZ19jb2xvcnAgcGFsZXR0ZTsKLQotICAgLyogT3BlbiB0aGUgZmlsZSAqLwotICAgZnAgPSBmb3BlbihmaWxlX25hbWUsICJ3YiIpOwotICAgaWYgKGZwID09IE5VTEwpCi0gICAgICByZXR1cm4gKEVSUk9SKTsKLQotICAgLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBwbmdfc3RydWN0IHdpdGggdGhlIGRlc2lyZWQgZXJyb3IgaGFuZGxlcgotICAgICogZnVuY3Rpb25zLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBkZWZhdWx0IHN0ZGVyciBhbmQgbG9uZ2p1bXAgbWV0aG9kLAotICAgICogeW91IGNhbiBzdXBwbHkgTlVMTCBmb3IgdGhlIGxhc3QgdGhyZWUgcGFyYW1ldGVycy4gIFdlIGFsc28gY2hlY2sgdGhhdAotICAgICogdGhlIGxpYnJhcnkgdmVyc2lvbiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9uZSB1c2VkIGF0IGNvbXBpbGUgdGltZSwKLSAgICAqIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGR5bmFtaWNhbGx5IGxpbmtlZCBsaWJyYXJpZXMuICBSRVFVSVJFRC4KLSAgICAqLwotICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywKLSAgICAgIHBuZ192b2lkcCB1c2VyX2Vycm9yX3B0ciwgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgIHsKLSAgICAgIGZjbG9zZShmcCk7Ci0gICAgICByZXR1cm4gKEVSUk9SKTsKLSAgIH0KLQotICAgLyogQWxsb2NhdGUvaW5pdGlhbGl6ZSB0aGUgaW1hZ2UgaW5mb3JtYXRpb24gZGF0YS4gIFJFUVVJUkVEICovCi0gICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0gICBpZiAoaW5mb19wdHIgPT0gTlVMTCkKLSAgIHsKLSAgICAgIGZjbG9zZShmcCk7Ci0gICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICBOVUxMKTsKLSAgICAgIHJldHVybiAoRVJST1IpOwotICAgfQotCi0gICAvKiBTZXQgZXJyb3IgaGFuZGxpbmcuICBSRVFVSVJFRCBpZiB5b3UgYXJlbid0IHN1cHBseWluZyB5b3VyIG93bgotICAgICogZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb25zIGluIHRoZSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCgpIGNhbGwuCi0gICAgKi8KLSAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCi0gICB7Ci0gICAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgaGFkIGEgcHJvYmxlbSB3cml0aW5nIHRoZSBmaWxlICovCi0gICAgICBmY2xvc2UoZnApOwotICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIpOwotICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICB9Ci0KLSAgIC8qIE9uZSBvZiB0aGUgZm9sbG93aW5nIEkvTyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgaXMgUkVRVUlSRUQgKi8KLQotI2lmZGVmIHN0cmVhbXMgLyogSS9PIGluaXRpYWxpemF0aW9uIG1ldGhvZCAxICovCi0gICAvKiBTZXQgdXAgdGhlIG91dHB1dCBjb250cm9sIGlmIHlvdSBhcmUgdXNpbmcgc3RhbmRhcmQgQyBzdHJlYW1zICovCi0gICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBmcCk7Ci0KLSNlbHNlIG5vX3N0cmVhbXMgLyogSS9PIGluaXRpYWxpemF0aW9uIG1ldGhvZCAyICovCi0gICAvKiBJZiB5b3UgYXJlIHVzaW5nIHJlcGxhY2VtZW50IHdyaXRlIGZ1bmN0aW9ucywgaW5zdGVhZCBvZiBjYWxsaW5nCi0gICAgKiBwbmdfaW5pdF9pbygpIGhlcmUgeW91IHdvdWxkIGNhbGwKLSAgICAqLwotICAgcG5nX3NldF93cml0ZV9mbihwbmdfcHRyLCAodm9pZCAqKXVzZXJfaW9fcHRyLCB1c2VyX3dyaXRlX2ZuLAotICAgICAgdXNlcl9JT19mbHVzaF9mdW5jdGlvbik7Ci0gICAvKiB3aGVyZSB1c2VyX2lvX3B0ciBpcyBhIHN0cnVjdHVyZSB5b3Ugd2FudCBhdmFpbGFibGUgdG8gdGhlIGNhbGxiYWNrcyAqLwotI2VuZGlmIG5vX3N0cmVhbXMgLyogT25seSB1c2Ugb25lIGluaXRpYWxpemF0aW9uIG1ldGhvZCAqLwotCi0jaWZkZWYgaGlsZXZlbAotICAgLyogVGhpcyBpcyB0aGUgZWFzeSB3YXkuICBVc2UgaXQgaWYgeW91IGFscmVhZHkgaGF2ZSBhbGwgdGhlCi0gICAgKiBpbWFnZSBpbmZvIGxpdmluZyBpbiB0aGUgc3RydWN0dXJlLiAgWW91IGNvdWxkICJ8IiBtYW55Ci0gICAgKiBQTkdfVFJBTlNGT1JNIGZsYWdzIGludG8gdGhlIHBuZ190cmFuc2Zvcm1zIGludGVnZXIgaGVyZS4KLSAgICAqLwotICAgcG5nX3dyaXRlX3BuZyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3RyYW5zZm9ybXMsIE5VTEwpOwotCi0jZWxzZQotICAgLyogVGhpcyBpcyB0aGUgaGFyZCB3YXkgKi8KLQotICAgLyogU2V0IHRoZSBpbWFnZSBpbmZvcm1hdGlvbiBoZXJlLiAgV2lkdGggYW5kIGhlaWdodCBhcmUgdXAgdG8gMl4zMSwKLSAgICAqIGJpdF9kZXB0aCBpcyBvbmUgb2YgMSwgMiwgNCwgOCwgb3IgMTYsIGJ1dCB2YWxpZCB2YWx1ZXMgYWxzbyBkZXBlbmQgb24KLSAgICAqIHRoZSBjb2xvcl90eXBlIHNlbGVjdGVkLiBjb2xvcl90eXBlIGlzIG9uZSBvZiBQTkdfQ09MT1JfVFlQRV9HUkFZLAotICAgICogUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSwgUE5HX0NPTE9SX1RZUEVfUEFMRVRURSwgUE5HX0NPTE9SX1RZUEVfUkdCLAotICAgICogb3IgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBLiAgaW50ZXJsYWNlIGlzIGVpdGhlciBQTkdfSU5URVJMQUNFX05PTkUgb3IKLSAgICAqIFBOR19JTlRFUkxBQ0VfQURBTTcsIGFuZCB0aGUgY29tcHJlc3Npb25fdHlwZSBhbmQgZmlsdGVyX3R5cGUgTVVTVAotICAgICogY3VycmVudGx5IGJlIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UgYW5kIFBOR19GSUxURVJfVFlQRV9CQVNFLiBSRVFVSVJFRAotICAgICovCi0gICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwgUE5HX0NPTE9SX1RZUEVfPz8/LAotICAgICAgUE5HX0lOVEVSTEFDRV8/Pz8/LCBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFLCBQTkdfRklMVEVSX1RZUEVfQkFTRSk7Ci0KLSAgIC8qIFNldCB0aGUgcGFsZXR0ZSBpZiB0aGVyZSBpcyBvbmUuICBSRVFVSVJFRCBmb3IgaW5kZXhlZC1jb2xvciBpbWFnZXMgKi8KLSAgIHBhbGV0dGUgPSAocG5nX2NvbG9ycClwbmdfbWFsbG9jKHBuZ19wdHIsIFBOR19NQVhfUEFMRVRURV9MRU5HVEgKLSAgICAgICAgICAgICAqIHBuZ19zaXplb2YocG5nX2NvbG9yKSk7Ci0gICAvKiAuLi4gU2V0IHBhbGV0dGUgY29sb3JzIC4uLiAqLwotICAgcG5nX3NldF9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLCBwYWxldHRlLCBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIKTsKLSAgIC8qIFlvdSBtdXN0IG5vdCBmcmVlIHBhbGV0dGUgaGVyZSwgYmVjYXVzZSBwbmdfc2V0X1BMVEUgb25seSBtYWtlcyBhIGxpbmsgdG8KLSAgICAqIHRoZSBwYWxldHRlIHRoYXQgeW91IG1hbGxvY2VkLiAgV2FpdCB1bnRpbCB5b3UgYXJlIGFib3V0IHRvIGRlc3Ryb3kKLSAgICAqIHRoZSBwbmcgc3RydWN0dXJlLgotICAgICovCi0KLSAgIC8qIE9wdGlvbmFsIHNpZ25pZmljYW50IGJpdCAoc0JJVCkgY2h1bmsgKi8KLSAgIHBuZ19jb2xvcl84IHNpZ19iaXQ7Ci0gICAvKiBJZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgZ3JheXNjYWxlIGltYWdlIHRoZW4gKi8KLSAgIHNpZ19iaXQuZ3JheSA9IHRydWVfYml0X2RlcHRoOwotICAgLyogT3RoZXJ3aXNlLCBpZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgY29sb3IgaW1hZ2UgdGhlbiAqLwotICAgc2lnX2JpdC5yZWQgPSB0cnVlX3JlZF9iaXRfZGVwdGg7Ci0gICBzaWdfYml0LmdyZWVuID0gdHJ1ZV9ncmVlbl9iaXRfZGVwdGg7Ci0gICBzaWdfYml0LmJsdWUgPSB0cnVlX2JsdWVfYml0X2RlcHRoOwotICAgLyogSWYgdGhlIGltYWdlIGhhcyBhbiBhbHBoYSBjaGFubmVsIHRoZW4gKi8KLSAgIHNpZ19iaXQuYWxwaGEgPSB0cnVlX2FscGhhX2JpdF9kZXB0aDsKLSAgIHBuZ19zZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpOwotCi0KLSAgIC8qIE9wdGlvbmFsIGdhbW1hIGNodW5rIGlzIHN0cm9uZ2x5IHN1Z2dlc3RlZCBpZiB5b3UgaGF2ZSBhbnkgZ3Vlc3MKLSAgICAqIGFzIHRvIHRoZSBjb3JyZWN0IGdhbW1hIG9mIHRoZSBpbWFnZS4KLSAgICAqLwotICAgcG5nX3NldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCBnYW1tYSk7Ci0KLSAgIC8qIE9wdGlvbmFsbHkgd3JpdGUgY29tbWVudHMgaW50byB0aGUgaW1hZ2UgKi8KLSAgIHRleHRfcHRyWzBdLmtleSA9ICJUaXRsZSI7Ci0gICB0ZXh0X3B0clswXS50ZXh0ID0gIk1vbmEgTGlzYSI7Ci0gICB0ZXh0X3B0clswXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7Ci0gICB0ZXh0X3B0clsxXS5rZXkgPSAiQXV0aG9yIjsKLSAgIHRleHRfcHRyWzFdLnRleHQgPSAiTGVvbmFyZG8gRGFWaW5jaSI7Ci0gICB0ZXh0X3B0clsxXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7Ci0gICB0ZXh0X3B0clsyXS5rZXkgPSAiRGVzY3JpcHRpb24iOwotICAgdGV4dF9wdHJbMl0udGV4dCA9ICI8bG9uZyB0ZXh0PiI7Ci0gICB0ZXh0X3B0clsyXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQ7Ci0jaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECi0gICB0ZXh0X3B0clswXS5sYW5nID0gTlVMTDsKLSAgIHRleHRfcHRyWzBdLmxhbmdfa2V5ID0gTlVMTDsKLSAgIHRleHRfcHRyWzFdLmxhbmcgPSBOVUxMOwotICAgdGV4dF9wdHJbMV0ubGFuZ19rZXkgPSBOVUxMOwotICAgdGV4dF9wdHJbMl0ubGFuZyA9IE5VTEw7Ci0gICB0ZXh0X3B0clsyXS5sYW5nX2tleSA9IE5VTEw7Ci0jZW5kaWYKLSAgIHBuZ19zZXRfdGV4dChwbmdfcHRyLCBpbmZvX3B0ciwgdGV4dF9wdHIsIDMpOwotCi0gICAvKiBPdGhlciBvcHRpb25hbCBjaHVua3MgbGlrZSBjSFJNLCBiS0dELCB0Uk5TLCB0SU1FLCBvRkZzLCBwSFlzICovCi0KLSAgIC8qIE5vdGUgdGhhdCBpZiBzUkdCIGlzIHByZXNlbnQgdGhlIGdBTUEgYW5kIGNIUk0gY2h1bmtzIG11c3QgYmUgaWdub3JlZAotICAgICogb24gcmVhZCBhbmQsIGlmIHlvdXIgYXBwbGljYXRpb24gY2hvb3NlcyB0byB3cml0ZSB0aGVtLCB0aGV5IG11c3QKLSAgICAqIGJlIHdyaXR0ZW4gaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBzUkdCIHByb2ZpbGUKLSAgICAqLwotCi0gICAvKiBXcml0ZSB0aGUgZmlsZSBoZWFkZXIgaW5mb3JtYXRpb24uICBSRVFVSVJFRCAqLwotICAgcG5nX3dyaXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICAvKiBJZiB5b3Ugd2FudCwgeW91IGNhbiB3cml0ZSB0aGUgaW5mbyBpbiB0d28gc3RlcHMsIGluIGNhc2UgeW91IG5lZWQgdG8KLSAgICAqIHdyaXRlIHlvdXIgcHJpdmF0ZSBjaHVuayBhaGVhZCBvZiBQTFRFOgotICAgICoKLSAgICAqICAgcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0cik7Ci0gICAgKiAgIHdyaXRlX215X2NodW5rKCk7Ci0gICAgKiAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICAqCi0gICAgKiBIb3dldmVyLCBnaXZlbiB0aGUgbGV2ZWwgb2Yga25vd24tIGFuZCB1bmtub3duLWNodW5rIHN1cHBvcnQgaW4gMS4yLjAKLSAgICAqIGFuZCB1cCwgdGhpcyBzaG91bGQgbm8gbG9uZ2VyIGJlIG5lY2Vzc2FyeS4KLSAgICAqLwotCi0gICAvKiBPbmNlIHdlIHdyaXRlIG91dCB0aGUgaGVhZGVyLCB0aGUgY29tcHJlc3Npb24gdHlwZSBvbiB0aGUgdGV4dAotICAgICogY2h1bmtzIGdldHMgY2hhbmdlZCB0byBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FX1dSIG9yCi0gICAgKiBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0X1dSLCBzbyBpdCBkb2Vzbid0IGdldCB3cml0dGVuIG91dCBhZ2FpbgotICAgICogYXQgdGhlIGVuZC4KLSAgICAqLwotCi0gICAvKiBTZXQgdXAgdGhlIHRyYW5zZm9ybWF0aW9ucyB5b3Ugd2FudC4gIE5vdGUgdGhhdCB0aGVzZSBhcmUKLSAgICAqIGFsbCBvcHRpb25hbC4gIE9ubHkgY2FsbCB0aGVtIGlmIHlvdSB3YW50IHRoZW0uCi0gICAgKi8KLQotICAgLyogSW52ZXJ0IG1vbm9jaHJvbWUgcGl4ZWxzICovCi0gICBwbmdfc2V0X2ludmVydF9tb25vKHBuZ19wdHIpOwotCi0gICAvKiBTaGlmdCB0aGUgcGl4ZWxzIHVwIHRvIGEgbGVnYWwgYml0IGRlcHRoIGFuZCBmaWxsIGluCi0gICAgKiBhcyBhcHByb3ByaWF0ZSB0byBjb3JyZWN0bHkgc2NhbGUgdGhlIGltYWdlLgotICAgICovCi0gICBwbmdfc2V0X3NoaWZ0KHBuZ19wdHIsICZzaWdfYml0KTsKLQotICAgLyogUGFjayBwaXhlbHMgaW50byBieXRlcyAqLwotICAgcG5nX3NldF9wYWNraW5nKHBuZ19wdHIpOwotCi0gICAvKiBTd2FwIGxvY2F0aW9uIG9mIGFscGhhIGJ5dGVzIGZyb20gQVJHQiB0byBSR0JBICovCi0gICBwbmdfc2V0X3N3YXBfYWxwaGEocG5nX3B0cik7Ci0KLSAgIC8qIEdldCByaWQgb2YgZmlsbGVyIChPUiBBTFBIQSkgYnl0ZXMsIHBhY2sgWFJHQi9SR0JYL0FSR0IvUkdCQSBpbnRvCi0gICAgKiBSR0IgKDQgY2hhbm5lbHMgLT4gMyBjaGFubmVscykuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIG5vdCB1c2VkLgotICAgICovCi0gICBwbmdfc2V0X2ZpbGxlcihwbmdfcHRyLCAwLCBQTkdfRklMTEVSX0JFRk9SRSk7Ci0KLSAgIC8qIEZsaXAgQkdSIHBpeGVscyB0byBSR0IgKi8KLSAgIHBuZ19zZXRfYmdyKHBuZ19wdHIpOwotCi0gICAvKiBTd2FwIGJ5dGVzIG9mIDE2LWJpdCBmaWxlcyB0byBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKi8KLSAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKLQotICAgLyogU3dhcCBiaXRzIG9mIDEsIDIsIDQgYml0IHBhY2tlZCBwaXhlbCBmb3JtYXRzICovCi0gICBwbmdfc2V0X3BhY2tzd2FwKHBuZ19wdHIpOwotCi0gICAvKiBUdXJuIG9uIGludGVybGFjZSBoYW5kbGluZyBpZiB5b3UgYXJlIG5vdCB1c2luZyBwbmdfd3JpdGVfaW1hZ2UoKSAqLwotICAgaWYgKGludGVybGFjaW5nKQotICAgICAgbnVtYmVyX3Bhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOwotICAgZWxzZQotICAgICAgbnVtYmVyX3Bhc3NlcyA9IDE7Ci0KLSAgIC8qIFRoZSBlYXNpZXN0IHdheSB0byB3cml0ZSB0aGUgaW1hZ2UgKHlvdSBtYXkgaGF2ZSBhIGRpZmZlcmVudCBtZW1vcnkKLSAgICAqIGxheW91dCwgaG93ZXZlciwgc28gY2hvb3NlIHdoYXQgZml0cyB5b3VyIG5lZWRzIGJlc3QpLiAgWW91IG5lZWQgdG8KLSAgICAqIHVzZSB0aGUgZmlyc3QgbWV0aG9kIGlmIHlvdSBhcmVuJ3QgaGFuZGxpbmcgaW50ZXJsYWNpbmcgeW91cnNlbGYuCi0gICAgKi8KLSAgIHBuZ191aW50XzMyIGssIGhlaWdodCwgd2lkdGg7Ci0gICBwbmdfYnl0ZSBpbWFnZVtoZWlnaHRdW3dpZHRoKmJ5dGVzX3Blcl9waXhlbF07Ci0gICBwbmdfYnl0ZXAgcm93X3BvaW50ZXJzW2hlaWdodF07Ci0KLSAgIGlmIChoZWlnaHQgPiBQTkdfVUlOVF8zMl9NQVgvcG5nX3NpemVvZihwbmdfYnl0ZXApKQotICAgICBwbmdfZXJyb3IgKHBuZ19wdHIsICJJbWFnZSBpcyB0b28gdGFsbCB0byBwcm9jZXNzIGluIG1lbW9yeSIpOwotCi0gICBmb3IgKGsgPSAwOyBrIDwgaGVpZ2h0OyBrKyspCi0gICAgIHJvd19wb2ludGVyc1trXSA9IGltYWdlICsgayp3aWR0aCpieXRlc19wZXJfcGl4ZWw7Ci0KLSAgIC8qIE9uZSBvZiB0aGUgZm9sbG93aW5nIG91dHB1dCBtZXRob2RzIGlzIFJFUVVJUkVEICovCi0KLSNpZmRlZiBlbnRpcmUgLyogV3JpdGUgb3V0IHRoZSBlbnRpcmUgaW1hZ2UgZGF0YSBpbiBvbmUgY2FsbCAqLwotICAgcG5nX3dyaXRlX2ltYWdlKHBuZ19wdHIsIHJvd19wb2ludGVycyk7Ci0KLSAgIC8qIFRoZSBvdGhlciB3YXkgdG8gd3JpdGUgdGhlIGltYWdlIC0gZGVhbCB3aXRoIGludGVybGFjaW5nICovCi0KLSNlbHNlIG5vX2VudGlyZSAvKiBXcml0ZSBvdXQgdGhlIGltYWdlIGRhdGEgYnkgb25lIG9yIG1vcmUgc2NhbmxpbmVzICovCi0KLSAgIC8qIFRoZSBudW1iZXIgb2YgcGFzc2VzIGlzIGVpdGhlciAxIGZvciBub24taW50ZXJsYWNlZCBpbWFnZXMsCi0gICAgKiBvciA3IGZvciBpbnRlcmxhY2VkIGltYWdlcy4KLSAgICAqLwotICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IG51bWJlcl9wYXNzZXM7IHBhc3MrKykKLSAgIHsKLSAgICAgIC8qIFdyaXRlIGEgZmV3IHJvd3MgYXQgYSB0aW1lLiAqLwotICAgICAgcG5nX3dyaXRlX3Jvd3MocG5nX3B0ciwgJnJvd19wb2ludGVyc1tmaXJzdF9yb3ddLCBudW1iZXJfb2Zfcm93cyk7Ci0KLSAgICAgIC8qIElmIHlvdSBhcmUgb25seSB3cml0aW5nIG9uZSByb3cgYXQgYSB0aW1lLCB0aGlzIHdvcmtzICovCi0gICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCi0gICAgICAgICBwbmdfd3JpdGVfcm93cyhwbmdfcHRyLCAmcm93X3BvaW50ZXJzW3ldLCAxKTsKLSAgIH0KLSNlbmRpZiBub19lbnRpcmUgLyogVXNlIG9ubHkgb25lIG91dHB1dCBtZXRob2QgKi8KLQotICAgLyogWW91IGNhbiB3cml0ZSBvcHRpb25hbCBjaHVua3MgbGlrZSB0RVh0LCB6VFh0LCBhbmQgdElNRSBhdCB0aGUgZW5kCi0gICAgKiBhcyB3ZWxsLiAgU2hvdWxkbid0IGJlIG5lY2Vzc2FyeSBpbiAxLjIuMCBhbmQgdXAgYXMgYWxsIHRoZSBwdWJsaWMKLSAgICAqIGNodW5rcyBhcmUgc3VwcG9ydGVkIGFuZCB5b3UgY2FuIHVzZSBwbmdfc2V0X3Vua25vd25fY2h1bmtzKCkgdG8KLSAgICAqIHJlZ2lzdGVyIHVua25vd24gY2h1bmtzIGludG8gdGhlIGluZm8gc3RydWN0dXJlIHRvIGJlIHdyaXR0ZW4gb3V0LgotICAgICovCi0KLSAgIC8qIEl0IGlzIFJFUVVJUkVEIHRvIGNhbGwgdGhpcyB0byBmaW5pc2ggd3JpdGluZyB0aGUgcmVzdCBvZiB0aGUgZmlsZSAqLwotICAgcG5nX3dyaXRlX2VuZChwbmdfcHRyLCBpbmZvX3B0cik7Ci0jZW5kaWYgaGlsZXZlbAotCi0gICAvKiBJZiB5b3UgcG5nX21hbGxvY2VkIGEgcGFsZXR0ZSwgZnJlZSBpdCBoZXJlIChkb24ndCBmcmVlIGluZm9fcHRyLT5wYWxldHRlLAotICAgICogYXMgcmVjb21tZW5kZWQgaW4gdmVyc2lvbnMgMS4wLjVtIGFuZCBlYXJsaWVyIG9mIHRoaXMgZXhhbXBsZTsgaWYKLSAgICAqIGxpYnBuZyBtYWxsb2NzIGluZm9fcHRyLT5wYWxldHRlLCBsaWJwbmcgd2lsbCBmcmVlIGl0KS4gIElmIHlvdQotICAgICogYWxsb2NhdGVkIGl0IHdpdGggbWFsbG9jKCkgaW5zdGVhZCBvZiBwbmdfbWFsbG9jKCksIHVzZSBmcmVlKCkgaW5zdGVhZAotICAgICogb2YgcG5nX2ZyZWUoKS4KLSAgICAqLwotICAgcG5nX2ZyZWUocG5nX3B0ciwgcGFsZXR0ZSk7Ci0gICBwYWxldHRlID0gTlVMTDsKLQotICAgLyogU2ltaWxhcmx5LCBpZiB5b3UgcG5nX21hbGxvY2VkIGFueSBkYXRhIHRoYXQgeW91IHBhc3NlZCBpbiB3aXRoCi0gICAgKiBwbmdfc2V0X3NvbWV0aGluZygpLCBzdWNoIGFzIGEgaGlzdCBvciB0cmFucyBhcnJheSwgZnJlZSBpdCBoZXJlLAotICAgICogd2hlbiB5b3UgY2FuIGJlIHN1cmUgdGhhdCBsaWJwbmcgaXMgdGhyb3VnaCB3aXRoIGl0LgotICAgICovCi0gICBwbmdfZnJlZShwbmdfcHRyLCB0cmFucyk7Ci0gICB0cmFucyA9IE5VTEw7Ci0gICAvKiBXaGVuZXZlciB5b3UgdXNlIHBuZ19mcmVlKCkgaXQgaXMgYSBnb29kIGlkZWEgdG8gc2V0IHRoZSBwb2ludGVyIHRvCi0gICAgKiBOVUxMIGluIGNhc2UgeW91ciBhcHBsaWNhdGlvbiBpbmFkdmVydGVudGx5IHRyaWVzIHRvIHBuZ19mcmVlKCkgaXQKLSAgICAqIGFnYWluLiAgV2hlbiBwbmdfZnJlZSgpIHNlZXMgYSBOVUxMIGl0IHJldHVybnMgd2l0aG91dCBhY3Rpb24sIHRodXMKLSAgICAqIGF2b2lkaW5nIHRoZSBkb3VibGUtZnJlZSBzZWN1cml0eSBwcm9ibGVtLgotICAgICovCi0KLSAgIC8qIENsZWFuIHVwIGFmdGVyIHRoZSB3cml0ZSwgYW5kIGZyZWUgYW55IG1lbW9yeSBhbGxvY2F0ZWQgKi8KLSAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKLQotICAgLyogQ2xvc2UgdGhlIGZpbGUgKi8KLSAgIGZjbG9zZShmcCk7Ci0KLSAgIC8qIFRoYXQncyBpdCAqLwotICAgcmV0dXJuIChPSyk7Ci19Ci0KLSNlbmRpZiAvKiBpZiAwICovCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2luc3RhbGwtc2ggYi9zcmMvbGlicG5nL2luc3RhbGwtc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3ODFiOTguLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9pbnN0YWxsLXNoCisrKyAvZGV2L251bGwKQEAgLTEsNTIwICswLDAgQEAKLSMhL2Jpbi9zaAotIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKLQotc2NyaXB0dmVyc2lvbj0yMDA5LTA0LTI4LjIxOyAjIFVUQwotCi0jIFRoaXMgb3JpZ2luYXRlcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLCB3aGljaCB3YXMKLSMgbGF0ZXIgcmVsZWFzZWQgaW4gWDExUjYgKHhjL2NvbmZpZy91dGlsL2luc3RhbGwuc2gpIHdpdGggdGhlCi0jIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UuCi0jCi0jIENvcHlyaWdodCAoQykgMTk5NCBYIENvbnNvcnRpdW0KLSMKLSMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQotIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KLSMgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKLSMgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCi0jIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi0jIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0jCi0jIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0jIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotIwotIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQotIyBYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCi0jIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQy0KLSMgVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSMKLSMgRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCBub3QKLSMgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWwtCi0jIGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYIENvbnNvci0KLSMgdGl1bS4KLSMKLSMKLSMgRlNGIGNoYW5nZXMgdG8gdGhpcyBmaWxlIGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4KLSMKLSMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKLSMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKLSMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KLSMKLSMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgotIyBmcm9tIHNjcmF0Y2guCi0KLW5sPScKLScKLUlGUz0iICIiCSRubCIKLQotIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0Ci0KLSMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KLWRvaXQ9JHtET0lUUFJPRy19Ci1pZiB0ZXN0IC16ICIkZG9pdCI7IHRoZW4KLSAgZG9pdF9leGVjPWV4ZWMKLWVsc2UKLSAgZG9pdF9leGVjPSRkb2l0Ci1maQotCi0jIFB1dCBpbiBhYnNvbHV0ZSBmaWxlIG5hbWVzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOwotIyBvciB1c2UgZW52aXJvbm1lbnQgdmFycy4KLQotY2hncnBwcm9nPSR7Q0hHUlBQUk9HLWNoZ3JwfQotY2htb2Rwcm9nPSR7Q0hNT0RQUk9HLWNobW9kfQotY2hvd25wcm9nPSR7Q0hPV05QUk9HLWNob3dufQotY21wcHJvZz0ke0NNUFBST0ctY21wfQotY3Bwcm9nPSR7Q1BQUk9HLWNwfQotbWtkaXJwcm9nPSR7TUtESVJQUk9HLW1rZGlyfQotbXZwcm9nPSR7TVZQUk9HLW12fQotcm1wcm9nPSR7Uk1QUk9HLXJtfQotc3RyaXBwcm9nPSR7U1RSSVBQUk9HLXN0cmlwfQotCi1wb3NpeF9nbG9iPSc/JwotaW5pdGlhbGl6ZV9wb3NpeF9nbG9iPScKLSAgdGVzdCAiJHBvc2l4X2dsb2IiICE9ICI/IiB8fCB7Ci0gICAgaWYgKHNldCAtZikgMj4vZGV2L251bGw7IHRoZW4KLSAgICAgIHBvc2l4X2dsb2I9Ci0gICAgZWxzZQotICAgICAgcG9zaXhfZ2xvYj06Ci0gICAgZmkKLSAgfQotJwotCi1wb3NpeF9ta2Rpcj0KLQotIyBEZXNpcmVkIG1vZGUgb2YgaW5zdGFsbGVkIGZpbGUuCi1tb2RlPTA3NTUKLQotY2hncnBjbWQ9Ci1jaG1vZGNtZD0kY2htb2Rwcm9nCi1jaG93bmNtZD0KLW12Y21kPSRtdnByb2cKLXJtY21kPSIkcm1wcm9nIC1mIgotc3RyaXBjbWQ9Ci0KLXNyYz0KLWRzdD0KLWRpcl9hcmc9Ci1kc3RfYXJnPQotCi1jb3B5X29uX2NoYW5nZT1mYWxzZQotbm9fdGFyZ2V0X2RpcmVjdG9yeT0KLQotdXNhZ2U9IlwKLVVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbLVRdIFNSQ0ZJTEUgRFNURklMRQotICAgb3I6ICQwIFtPUFRJT05dLi4uIFNSQ0ZJTEVTLi4uIERJUkVDVE9SWQotICAgb3I6ICQwIFtPUFRJT05dLi4uIC10IERJUkVDVE9SWSBTUkNGSUxFUy4uLgotICAgb3I6ICQwIFtPUFRJT05dLi4uIC1kIERJUkVDVE9SSUVTLi4uCi0KLUluIHRoZSAxc3QgZm9ybSwgY29weSBTUkNGSUxFIHRvIERTVEZJTEUuCi1JbiB0aGUgMm5kIGFuZCAzcmQsIGNvcHkgYWxsIFNSQ0ZJTEVTIHRvIERJUkVDVE9SWS4KLUluIHRoZSA0dGgsIGNyZWF0ZSBESVJFQ1RPUklFUy4KLQotT3B0aW9uczoKLSAgICAgLS1oZWxwICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdC4KLSAgICAgLS12ZXJzaW9uICBkaXNwbGF5IHZlcnNpb24gaW5mbyBhbmQgZXhpdC4KLQotICAtYyAgICAgICAgICAgIChpZ25vcmVkKQotICAtQyAgICAgICAgICAgIGluc3RhbGwgb25seSBpZiBkaWZmZXJlbnQgKHByZXNlcnZlIHRoZSBsYXN0IGRhdGEgbW9kaWZpY2F0aW9uIHRpbWUpCi0gIC1kICAgICAgICAgICAgY3JlYXRlIGRpcmVjdG9yaWVzIGluc3RlYWQgb2YgaW5zdGFsbGluZyBmaWxlcy4KLSAgLWcgR1JPVVAgICAgICAkY2hncnBwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBHUk9VUC4KLSAgLW0gTU9ERSAgICAgICAkY2htb2Rwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBNT0RFLgotICAtbyBVU0VSICAgICAgICRjaG93bnByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIFVTRVIuCi0gIC1zICAgICAgICAgICAgJHN0cmlwcHJvZyBpbnN0YWxsZWQgZmlsZXMuCi0gIC10IERJUkVDVE9SWSAgaW5zdGFsbCBpbnRvIERJUkVDVE9SWS4KLSAgLVQgICAgICAgICAgICByZXBvcnQgYW4gZXJyb3IgaWYgRFNURklMRSBpcyBhIGRpcmVjdG9yeS4KLQotRW52aXJvbm1lbnQgdmFyaWFibGVzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbW1hbmRzOgotICBDSEdSUFBST0cgQ0hNT0RQUk9HIENIT1dOUFJPRyBDTVBQUk9HIENQUFJPRyBNS0RJUlBST0cgTVZQUk9HCi0gIFJNUFJPRyBTVFJJUFBST0cKLSIKLQotd2hpbGUgdGVzdCAkIyAtbmUgMDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC1jKSA7OwotCi0gICAgLUMpIGNvcHlfb25fY2hhbmdlPXRydWU7OwotCi0gICAgLWQpIGRpcl9hcmc9dHJ1ZTs7Ci0KLSAgICAtZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCi0Jc2hpZnQ7OwotCi0gICAgLS1oZWxwKSBlY2hvICIkdXNhZ2UiOyBleGl0ICQ/OzsKLQotICAgIC1tKSBtb2RlPSQyCi0JY2FzZSAkbW9kZSBpbgotCSAgKicgJyogfCAqJwknKiB8IConCi0nKgkgIHwgKicqJyogfCAqJz8nKiB8IConWycqKQotCSAgICBlY2hvICIkMDogaW52YWxpZCBtb2RlOiAkbW9kZSIgPiYyCi0JICAgIGV4aXQgMTs7Ci0JZXNhYwotCXNoaWZ0OzsKLQotICAgIC1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKLQlzaGlmdDs7Ci0KLSAgICAtcykgc3RyaXBjbWQ9JHN0cmlwcHJvZzs7Ci0KLSAgICAtdCkgZHN0X2FyZz0kMgotCXNoaWZ0OzsKLQotICAgIC1UKSBub190YXJnZXRfZGlyZWN0b3J5PXRydWU7OwotCi0gICAgLS12ZXJzaW9uKSBlY2hvICIkMCAkc2NyaXB0dmVyc2lvbiI7IGV4aXQgJD87OwotCi0gICAgLS0pCXNoaWZ0Ci0JYnJlYWs7OwotCi0gICAgLSopCWVjaG8gIiQwOiBpbnZhbGlkIG9wdGlvbjogJDEiID4mMgotCWV4aXQgMTs7Ci0KLSAgICAqKSAgYnJlYWs7OwotICBlc2FjCi0gIHNoaWZ0Ci1kb25lCi0KLWlmIHRlc3QgJCMgLW5lIDAgJiYgdGVzdCAteiAiJGRpcl9hcmckZHN0X2FyZyI7IHRoZW4KLSAgIyBXaGVuIC1kIGlzIHVzZWQsIGFsbCByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBkaXJlY3RvcmllcyB0byBjcmVhdGUuCi0gICMgV2hlbiAtdCBpcyB1c2VkLCB0aGUgZGVzdGluYXRpb24gaXMgYWxyZWFkeSBzcGVjaWZpZWQuCi0gICMgT3RoZXJ3aXNlLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgZGVzdGluYXRpb24uICBSZW1vdmUgaXQgZnJvbSAkQC4KLSAgZm9yIGFyZwotICBkbwotICAgIGlmIHRlc3QgLW4gIiRkc3RfYXJnIjsgdGhlbgotICAgICAgIyAkQCBpcyBub3QgZW1wdHk6IGl0IGNvbnRhaW5zIGF0IGxlYXN0ICRhcmcuCi0gICAgICBzZXQgZm5vcmQgIiRAIiAiJGRzdF9hcmciCi0gICAgICBzaGlmdCAjIGZub3JkCi0gICAgZmkKLSAgICBzaGlmdCAjIGFyZwotICAgIGRzdF9hcmc9JGFyZwotICBkb25lCi1maQotCi1pZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRkaXJfYXJnIjsgdGhlbgotICAgIGVjaG8gIiQwOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZC4iID4mMgotICAgIGV4aXQgMQotICBmaQotICAjIEl0J3MgT0sgdG8gY2FsbCBgaW5zdGFsbC1zaCAtZCcgd2l0aG91dCBhcmd1bWVudC4KLSAgIyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBjcmVhdGluZyBjb25kaXRpb25hbCBkaXJlY3Rvcmllcy4KLSAgZXhpdCAwCi1maQotCi1pZiB0ZXN0IC16ICIkZGlyX2FyZyI7IHRoZW4KLSAgdHJhcCAnKGV4aXQgJD8pOyBleGl0JyAxIDIgMTMgMTUKLQotICAjIFNldCB1bWFzayBzbyBhcyBub3QgdG8gY3JlYXRlIHRlbXBzIHdpdGggdG9vLWdlbmVyb3VzIG1vZGVzLgotICAjIEhvd2V2ZXIsICdzdHJpcCcgcmVxdWlyZXMgYm90aCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gdGVtcHMuCi0gIGNhc2UgJG1vZGUgaW4KLSAgICAjIE9wdGltaXplIGNvbW1vbiBjYXNlcy4KLSAgICAqNjQ0KSBjcF91bWFzaz0xMzM7OwotICAgICo3NTUpIGNwX3VtYXNrPTIyOzsKLQotICAgICpbMC03XSkKLSAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KLQl1X3BsdXNfcnc9Ci0gICAgICBlbHNlCi0JdV9wbHVzX3J3PSclIDIwMCcKLSAgICAgIGZpCi0gICAgICBjcF91bWFzaz1gZXhwciAnKCcgNzc3IC0gJG1vZGUgJSAxMDAwICcpJyAkdV9wbHVzX3J3YDs7Ci0gICAgKikKLSAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KLQl1X3BsdXNfcnc9Ci0gICAgICBlbHNlCi0JdV9wbHVzX3J3PSx1K3J3Ci0gICAgICBmaQotICAgICAgY3BfdW1hc2s9JG1vZGUkdV9wbHVzX3J3OzsKLSAgZXNhYwotZmkKLQotZm9yIHNyYwotZG8KLSAgIyBQcm90ZWN0IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nLgotICBjYXNlICRzcmMgaW4KLSAgICAtKikgc3JjPS4vJHNyYzs7Ci0gIGVzYWMKLQotICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KLSAgICBkc3Q9JHNyYwotICAgIGRzdGRpcj0kZHN0Ci0gICAgdGVzdCAtZCAiJGRzdGRpciIKLSAgICBkc3RkaXJfc3RhdHVzPSQ/Ci0gIGVsc2UKLQotICAgICMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kCi0gICAgIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZAotICAgICMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgotICAgIGlmIHRlc3QgISAtZiAiJHNyYyIgJiYgdGVzdCAhIC1kICIkc3JjIjsgdGhlbgotICAgICAgZWNobyAiJDA6ICRzcmMgZG9lcyBub3QgZXhpc3QuIiA+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC16ICIkZHN0X2FyZyI7IHRoZW4KLSAgICAgIGVjaG8gIiQwOiBubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQuIiA+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBkc3Q9JGRzdF9hcmcKLSAgICAjIFByb3RlY3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBgLScuCi0gICAgY2FzZSAkZHN0IGluCi0gICAgICAtKikgZHN0PS4vJGRzdDs7Ci0gICAgZXNhYwotCi0gICAgIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgd29uJ3Qgd29yawotICAgICMgaWYgZG91YmxlIHNsYXNoZXMgYXJlbid0IGlnbm9yZWQuCi0gICAgaWYgdGVzdCAtZCAiJGRzdCI7IHRoZW4KLSAgICAgIGlmIHRlc3QgLW4gIiRub190YXJnZXRfZGlyZWN0b3J5IjsgdGhlbgotCWVjaG8gIiQwOiAkZHN0X2FyZzogSXMgYSBkaXJlY3RvcnkiID4mMgotCWV4aXQgMQotICAgICAgZmkKLSAgICAgIGRzdGRpcj0kZHN0Ci0gICAgICBkc3Q9JGRzdGRpci9gYmFzZW5hbWUgIiRzcmMiYAotICAgICAgZHN0ZGlyX3N0YXR1cz0wCi0gICAgZWxzZQotICAgICAgIyBQcmVmZXIgZGlybmFtZSwgYnV0IGZhbGwgYmFjayBvbiBhIHN1YnN0aXR1dGUgaWYgZGlybmFtZSBmYWlscy4KLSAgICAgIGRzdGRpcj1gCi0JKGRpcm5hbWUgIiRkc3QiKSAyPi9kZXYvbnVsbCB8fAotCWV4cHIgWCIkZHN0IiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSAgICAgWCIkZHN0IiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSAgICAgWCIkZHN0IiA6ICdYXCgvL1wpJCcgXHwgXAotCSAgICAgWCIkZHN0IiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLQllY2hvIFgiJGRzdCIgfAotCSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCQkgICBzLy9cMS8KLQkJICAgcQotCQkgfQotCQkgL15YXChcL1wvXClbXi9dLiovewotCQkgICBzLy9cMS8KLQkJICAgcQotCQkgfQotCQkgL15YXChcL1wvXCkkL3sKLQkJICAgcy8vXDEvCi0JCSAgIHEKLQkJIH0KLQkJIC9eWFwoXC9cKS4qL3sKLQkJICAgcy8vXDEvCi0JCSAgIHEKLQkJIH0KLQkJIHMvLiovLi87IHEnCi0gICAgICBgCi0KLSAgICAgIHRlc3QgLWQgIiRkc3RkaXIiCi0gICAgICBkc3RkaXJfc3RhdHVzPSQ/Ci0gICAgZmkKLSAgZmkKLQotICBvYnNvbGV0ZV9ta2Rpcl91c2VkPWZhbHNlCi0KLSAgaWYgdGVzdCAkZHN0ZGlyX3N0YXR1cyAhPSAwOyB0aGVuCi0gICAgY2FzZSAkcG9zaXhfbWtkaXIgaW4KLSAgICAgICcnKQotCSMgQ3JlYXRlIGludGVybWVkaWF0ZSBkaXJzIHVzaW5nIG1vZGUgNzU1IGFzIG1vZGlmaWVkIGJ5IHRoZSB1bWFzay4KLQkjIFRoaXMgaXMgbGlrZSBGcmVlQlNEICdpbnN0YWxsJyBhcyBvZiAxOTk3LTEwLTI4LgotCXVtYXNrPWB1bWFza2AKLQljYXNlICRzdHJpcGNtZC4kdW1hc2sgaW4KLQkgICMgT3B0aW1pemUgY29tbW9uIGNhc2VzLgotCSAgKlsyMzY3XVsyMzY3XSkgbWtkaXJfdW1hc2s9JHVtYXNrOzsKLQkgIC4qMFswMl1bMDJdIHwgLlswMl1bMDJdIHwgLlswMl0pIG1rZGlyX3VtYXNrPTIyOzsKLQotCSAgKlswLTddKQotCSAgICBta2Rpcl91bWFzaz1gZXhwciAkdW1hc2sgKyAyMiBcCi0JICAgICAgLSAkdW1hc2sgJSAxMDAgJSA0MCArICR1bWFzayAlIDIwIFwKLQkgICAgICAtICR1bWFzayAlIDEwICUgNCArICR1bWFzayAlIDIKLQkgICAgYDs7Ci0JICAqKSBta2Rpcl91bWFzaz0kdW1hc2ssZ28tdzs7Ci0JZXNhYwotCi0JIyBXaXRoIC1kLCBjcmVhdGUgdGhlIG5ldyBkaXJlY3Rvcnkgd2l0aCB0aGUgdXNlci1zcGVjaWZpZWQgbW9kZS4KLQkjIE90aGVyd2lzZSwgcmVseSBvbiAkbWtkaXJfdW1hc2suCi0JaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCi0JICBta2Rpcl9tb2RlPS1tJG1vZGUKLQllbHNlCi0JICBta2Rpcl9tb2RlPQotCWZpCi0KLQlwb3NpeF9ta2Rpcj1mYWxzZQotCWNhc2UgJHVtYXNrIGluCi0JICAqWzEyMzU2N11bMC03XVswLTddKQotCSAgICAjIFBPU0lYIG1rZGlyIC1wIHNldHMgdSt3eCBiaXRzIHJlZ2FyZGxlc3Mgb2YgdW1hc2ssIHdoaWNoCi0JICAgICMgaXMgaW5jb21wYXRpYmxlIHdpdGggRnJlZUJTRCAnaW5zdGFsbCcgd2hlbiAodW1hc2sgJiAzMDApICE9IDAuCi0JICAgIDs7Ci0JICAqKQotCSAgICB0bXBkaXI9JHtUTVBESVItL3RtcH0vaW5zJFJBTkRPTS0kJAotCSAgICB0cmFwICdyZXQ9JD87IHJtZGlyICIkdG1wZGlyL2QiICIkdG1wZGlyIiAyPi9kZXYvbnVsbDsgZXhpdCAkcmV0JyAwCi0KLQkgICAgaWYgKHVtYXNrICRta2Rpcl91bWFzayAmJgotCQlleGVjICRta2RpcnByb2cgJG1rZGlyX21vZGUgLXAgLS0gIiR0bXBkaXIvZCIpID4vZGV2L251bGwgMj4mMQotCSAgICB0aGVuCi0JICAgICAgaWYgdGVzdCAteiAiJGRpcl9hcmciIHx8IHsKLQkJICAgIyBDaGVjayBmb3IgUE9TSVggaW5jb21wYXRpYmlsaXRpZXMgd2l0aCAtbS4KLQkJICAgIyBIUC1VWCAxMS4yMyBhbmQgSVJJWCA2LjUgbWtkaXIgLW0gLXAgc2V0cyBncm91cC0gb3IKLQkJICAgIyBvdGhlci13cml0ZWFibGUgYml0IG9mIHBhcmVudCBkaXJlY3Rvcnkgd2hlbiBpdCBzaG91bGRuJ3QuCi0JCSAgICMgRnJlZUJTRCA2LjEgbWtkaXIgLW0gLXAgc2V0cyBtb2RlIG9mIGV4aXN0aW5nIGRpcmVjdG9yeS4KLQkJICAgbHNfbGRfdG1wZGlyPWBscyAtbGQgIiR0bXBkaXIiYAotCQkgICBjYXNlICRsc19sZF90bXBkaXIgaW4KLQkJICAgICBkPz8/Py0/ci0qKSBkaWZmZXJlbnRfbW9kZT03MDA7OwotCQkgICAgIGQ/Pz8/LT8tLSopIGRpZmZlcmVudF9tb2RlPTc1NTs7Ci0JCSAgICAgKikgZmFsc2U7OwotCQkgICBlc2FjICYmCi0JCSAgICRta2RpcnByb2cgLW0kZGlmZmVyZW50X21vZGUgLXAgLS0gIiR0bXBkaXIiICYmIHsKLQkJICAgICBsc19sZF90bXBkaXJfMT1gbHMgLWxkICIkdG1wZGlyImAKLQkJICAgICB0ZXN0ICIkbHNfbGRfdG1wZGlyIiA9ICIkbHNfbGRfdG1wZGlyXzEiCi0JCSAgIH0KLQkJIH0KLQkgICAgICB0aGVuIHBvc2l4X21rZGlyPToKLQkgICAgICBmaQotCSAgICAgIHJtZGlyICIkdG1wZGlyL2QiICIkdG1wZGlyIgotCSAgICBlbHNlCi0JICAgICAgIyBSZW1vdmUgYW55IGRpcnMgbGVmdCBiZWhpbmQgYnkgYW5jaWVudCBta2RpciBpbXBsZW1lbnRhdGlvbnMuCi0JICAgICAgcm1kaXIgLi8kbWtkaXJfbW9kZSAuLy1wIC4vLS0gMj4vZGV2L251bGwKLQkgICAgZmkKLQkgICAgdHJhcCAnJyAwOzsKLQllc2FjOzsKLSAgICBlc2FjCi0KLSAgICBpZgotICAgICAgJHBvc2l4X21rZGlyICYmICgKLQl1bWFzayAkbWtkaXJfdW1hc2sgJiYKLQkkZG9pdF9leGVjICRta2RpcnByb2cgJG1rZGlyX21vZGUgLXAgLS0gIiRkc3RkaXIiCi0gICAgICApCi0gICAgdGhlbiA6Ci0gICAgZWxzZQotCi0gICAgICAjIFRoZSB1bWFzayBpcyByaWRpY3Vsb3VzLCBvciBta2RpciBkb2VzIG5vdCBjb25mb3JtIHRvIFBPU0lYLAotICAgICAgIyBvciBpdCBmYWlsZWQgcG9zc2libHkgZHVlIHRvIGEgcmFjZSBjb25kaXRpb24uICBDcmVhdGUgdGhlCi0gICAgICAjIGRpcmVjdG9yeSB0aGUgc2xvdyB3YXksIHN0ZXAgYnkgc3RlcCwgY2hlY2tpbmcgZm9yIHJhY2VzIGFzIHdlIGdvLgotCi0gICAgICBjYXNlICRkc3RkaXIgaW4KLQkvKikgcHJlZml4PScvJzs7Ci0JLSopIHByZWZpeD0nLi8nOzsKLQkqKSAgcHJlZml4PScnOzsKLSAgICAgIGVzYWMKLQotICAgICAgZXZhbCAiJGluaXRpYWxpemVfcG9zaXhfZ2xvYiIKLQotICAgICAgb0lGUz0kSUZTCi0gICAgICBJRlM9LwotICAgICAgJHBvc2l4X2dsb2Igc2V0IC1mCi0gICAgICBzZXQgZm5vcmQgJGRzdGRpcgotICAgICAgc2hpZnQKLSAgICAgICRwb3NpeF9nbG9iIHNldCArZgotICAgICAgSUZTPSRvSUZTCi0KLSAgICAgIHByZWZpeGVzPQotCi0gICAgICBmb3IgZAotICAgICAgZG8KLQl0ZXN0IC16ICIkZCIgJiYgY29udGludWUKLQotCXByZWZpeD0kcHJlZml4JGQKLQlpZiB0ZXN0IC1kICIkcHJlZml4IjsgdGhlbgotCSAgcHJlZml4ZXM9Ci0JZWxzZQotCSAgaWYgJHBvc2l4X21rZGlyOyB0aGVuCi0JICAgICh1bWFzaz0kbWtkaXJfdW1hc2sgJiYKLQkgICAgICRkb2l0X2V4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJGRzdGRpciIpICYmIGJyZWFrCi0JICAgICMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KLQkgICAgdGVzdCAtZCAiJHByZWZpeCIgfHwgZXhpdCAxCi0JICBlbHNlCi0JICAgIGNhc2UgJHByZWZpeCBpbgotCSAgICAgICpcJyopIHFwcmVmaXg9YGVjaG8gIiRwcmVmaXgiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsKLQkgICAgICAqKSBxcHJlZml4PSRwcmVmaXg7OwotCSAgICBlc2FjCi0JICAgIHByZWZpeGVzPSIkcHJlZml4ZXMgJyRxcHJlZml4JyIKLQkgIGZpCi0JZmkKLQlwcmVmaXg9JHByZWZpeC8KLSAgICAgIGRvbmUKLQotICAgICAgaWYgdGVzdCAtbiAiJHByZWZpeGVzIjsgdGhlbgotCSMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KLQkodW1hc2sgJG1rZGlyX3VtYXNrICYmCi0JIGV2YWwgIlwkZG9pdF9leGVjIFwkbWtkaXJwcm9nICRwcmVmaXhlcyIpIHx8Ci0JICB0ZXN0IC1kICIkZHN0ZGlyIiB8fCBleGl0IDEKLQlvYnNvbGV0ZV9ta2Rpcl91c2VkPXRydWUKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLQotICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KLSAgICB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0IjsgfSAmJgotICAgIHsgdGVzdCAteiAiJGNoZ3JwY21kIiB8fCAkZG9pdCAkY2hncnBjbWQgIiRkc3QiOyB9ICYmCi0gICAgeyB0ZXN0ICIkb2Jzb2xldGVfbWtkaXJfdXNlZCRjaG93bmNtZCRjaGdycGNtZCIgPSBmYWxzZSB8fAotICAgICAgdGVzdCAteiAiJGNobW9kY21kIiB8fCAkZG9pdCAkY2htb2RjbWQgJG1vZGUgIiRkc3QiOyB9IHx8IGV4aXQgMQotICBlbHNlCi0KLSAgICAjIE1ha2UgYSBjb3VwbGUgb2YgdGVtcCBmaWxlIG5hbWVzIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgotICAgIGRzdHRtcD0kZHN0ZGlyL19pbnN0LiQkXwotICAgIHJtdG1wPSRkc3RkaXIvX3JtLiQkXwotCi0gICAgIyBUcmFwIHRvIGNsZWFuIHVwIHRob3NlIHRlbXAgZmlsZXMgYXQgZXhpdC4KLSAgICB0cmFwICdyZXQ9JD87IHJtIC1mICIkZHN0dG1wIiAiJHJtdG1wIiAmJiBleGl0ICRyZXQnIDAKLQotICAgICMgQ29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUuCi0gICAgKHVtYXNrICRjcF91bWFzayAmJiAkZG9pdF9leGVjICRjcHByb2cgIiRzcmMiICIkZHN0dG1wIikgJiYKLQotICAgICMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cy4KLSAgICAjCi0gICAgIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bwotICAgICMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQotICAgICMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KLSAgICAjCi0gICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdHRtcCI7IH0gJiYKLSAgICB7IHRlc3QgLXogIiRjaGdycGNtZCIgfHwgJGRvaXQgJGNoZ3JwY21kICIkZHN0dG1wIjsgfSAmJgotICAgIHsgdGVzdCAteiAiJHN0cmlwY21kIiB8fCAkZG9pdCAkc3RyaXBjbWQgIiRkc3R0bXAiOyB9ICYmCi0gICAgeyB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAkbW9kZSAiJGRzdHRtcCI7IH0gJiYKLQotICAgICMgSWYgLUMsIGRvbid0IGJvdGhlciB0byBjb3B5IGlmIGl0IHdvdWxkbid0IGNoYW5nZSB0aGUgZmlsZS4KLSAgICBpZiAkY29weV9vbl9jaGFuZ2UgJiYKLSAgICAgICBvbGQ9YExDX0FMTD1DIGxzIC1kbEwgIiRkc3QiCTI+L2Rldi9udWxsYCAmJgotICAgICAgIG5ldz1gTENfQUxMPUMgbHMgLWRsTCAiJGRzdHRtcCIJMj4vZGV2L251bGxgICYmCi0KLSAgICAgICBldmFsICIkaW5pdGlhbGl6ZV9wb3NpeF9nbG9iIiAmJgotICAgICAgICRwb3NpeF9nbG9iIHNldCAtZiAmJgotICAgICAgIHNldCBYICRvbGQgJiYgb2xkPTokMjokNDokNTokNiAmJgotICAgICAgIHNldCBYICRuZXcgJiYgbmV3PTokMjokNDokNTokNiAmJgotICAgICAgICRwb3NpeF9nbG9iIHNldCArZiAmJgotCi0gICAgICAgdGVzdCAiJG9sZCIgPSAiJG5ldyIgJiYKLSAgICAgICAkY21wcHJvZyAiJGRzdCIgIiRkc3R0bXAiID4vZGV2L251bGwgMj4mMQotICAgIHRoZW4KLSAgICAgIHJtIC1mICIkZHN0dG1wIgotICAgIGVsc2UKLSAgICAgICMgUmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgotICAgICAgJGRvaXQgJG12Y21kIC1mICIkZHN0dG1wIiAiJGRzdCIgMj4vZGV2L251bGwgfHwKLQotICAgICAgIyBUaGUgcmVuYW1lIGZhaWxlZCwgcGVyaGFwcyBiZWNhdXNlIG12IGNhbid0IHJlbmFtZSBzb21ldGhpbmcgZWxzZQotICAgICAgIyB0byBpdHNlbGYsIG9yIHBlcmhhcHMgYmVjYXVzZSBtdiBpcyBzbyBhbmNpZW50IHRoYXQgaXQgZG9lcyBub3QKLSAgICAgICMgc3VwcG9ydCAtZi4KLSAgICAgIHsKLQkjIE5vdyByZW1vdmUgb3IgbW92ZSBhc2lkZSBhbnkgb2xkIGZpbGUgYXQgZGVzdGluYXRpb24gbG9jYXRpb24uCi0JIyBXZSB0cnkgdGhpcyB0d28gd2F5cyBzaW5jZSBybSBjYW4ndCB1bmxpbmsgaXRzZWxmIG9uIHNvbWUKLQkjIHN5c3RlbXMgYW5kIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG1pZ2h0IGJlIGJ1c3kgZm9yIG90aGVyCi0JIyByZWFzb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmluYWwgY2xlYW51cCBtaWdodCBmYWlsIGJ1dCB0aGUgbmV3Ci0JIyBmaWxlIHNob3VsZCBzdGlsbCBpbnN0YWxsIHN1Y2Nlc3NmdWxseS4KLQl7Ci0JICB0ZXN0ICEgLWYgIiRkc3QiIHx8Ci0JICAkZG9pdCAkcm1jbWQgLWYgIiRkc3QiIDI+L2Rldi9udWxsIHx8Ci0JICB7ICRkb2l0ICRtdmNtZCAtZiAiJGRzdCIgIiRybXRtcCIgMj4vZGV2L251bGwgJiYKLQkgICAgeyAkZG9pdCAkcm1jbWQgLWYgIiRybXRtcCIgMj4vZGV2L251bGw7IDo7IH0KLQkgIH0gfHwKLQkgIHsgZWNobyAiJDA6IGNhbm5vdCB1bmxpbmsgb3IgcmVuYW1lICRkc3QiID4mMgotCSAgICAoZXhpdCAxKTsgZXhpdCAxCi0JICB9Ci0JfSAmJgotCi0JIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgotCSRkb2l0ICRtdmNtZCAiJGRzdHRtcCIgIiRkc3QiCi0gICAgICB9Ci0gICAgZmkgfHwgZXhpdCAxCi0KLSAgICB0cmFwICcnIDAKLSAgZmkKLWRvbmUKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKLSMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCi0jIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9saWJwbmctMS40LjEyLnR4dCBiL3NyYy9saWJwbmcvbGlicG5nLTEuNC4xMi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4M2VlOGEuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9saWJwbmctMS40LjEyLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDMzNjcgKzAsMCBAQAotbGlicG5nLnR4dCAtIEEgZGVzY3JpcHRpb24gb24gaG93IHRvIHVzZSBhbmQgbW9kaWZ5IGxpYnBuZwotCi0gbGlicG5nIHZlcnNpb24gMS40LjEyIC0gSnVseSAxMCwgMjAxMgotIFVwZGF0ZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIDxnbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLSBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLQotIFRoaXMgZG9jdW1lbnQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0gQmFzZWQgb246Ci0KLSBsaWJwbmcgdmVyc2lvbnMgMC45NywgSmFudWFyeSAxOTk4LCB0aHJvdWdoIDEuNC4xMiAtIEp1bHkgMTAsIDIwMTIKLSBVcGRhdGVkIGFuZCBkaXN0cmlidXRlZCBieSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLQotIGxpYnBuZyAxLjAgYmV0YSA2ICB2ZXJzaW9uIDAuOTYgTWF5IDI4LCAxOTk3Ci0gVXBkYXRlZCBhbmQgZGlzdHJpYnV0ZWQgYnkgQW5kcmVhcyBEaWxnZXIKLSBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLQotIGxpYnBuZyAxLjAgYmV0YSAyIC0gdmVyc2lvbiAwLjg4ICBKYW51YXJ5IDI2LCAxOTk2Ci0gRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQKLSBub3RpY2UgaW4gcG5nLmguIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYwotIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotCi0gVXBkYXRlZC9yZXdyaXR0ZW4gcGVyIHJlcXVlc3QgaW4gdGhlIGxpYnBuZyBGQVEKLSBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgRnJhbmsgSi4gVC4gV29qY2lrCi0gRGVjZW1iZXIgMTgsIDE5OTUgJiBKYW51YXJ5IDIwLCAxOTk2Ci0KLUkuIEludHJvZHVjdGlvbgotCi1UaGlzIGZpbGUgZGVzY3JpYmVzIGhvdyB0byB1c2UgYW5kIG1vZGlmeSB0aGUgUE5HIHJlZmVyZW5jZSBsaWJyYXJ5Ci0oa25vd24gYXMgbGlicG5nKSBmb3IgeW91ciBvd24gdXNlLiAgVGhlcmUgYXJlIGZpdmUgc2VjdGlvbnMgdG8gdGhpcwotZmlsZTogaW50cm9kdWN0aW9uLCBzdHJ1Y3R1cmVzLCByZWFkaW5nLCB3cml0aW5nLCBhbmQgbW9kaWZpY2F0aW9uIGFuZAotY29uZmlndXJhdGlvbiBub3RlcyBmb3IgdmFyaW91cyBzcGVjaWFsIHBsYXRmb3Jtcy4gIEluIGFkZGl0aW9uIHRvIHRoaXMKLWZpbGUsIGV4YW1wbGUuYyBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIHVzaW5nIHRoZSBsaWJyYXJ5LCBhcwotaXQgaXMgaGVhdmlseSBjb21tZW50ZWQgYW5kIHNob3VsZCBpbmNsdWRlIGV2ZXJ5dGhpbmcgbW9zdCBwZW9wbGUKLXdpbGwgbmVlZC4gIFdlIGFzc3VtZSB0aGF0IGxpYnBuZyBpcyBhbHJlYWR5IGluc3RhbGxlZDsgc2VlIHRoZQotSU5TVEFMTCBmaWxlIGZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGluc3RhbGwgbGlicG5nLgotCi1Gb3IgZXhhbXBsZXMgb2YgbGlicG5nIHVzYWdlLCBzZWUgdGhlIGZpbGVzICJleGFtcGxlLmMiLCAicG5ndGVzdC5jIiwKLWFuZCB0aGUgZmlsZXMgaW4gdGhlICJjb250cmliIiBkaXJlY3RvcnksIGFsbCBvZiB3aGljaCBhcmUgaW5jbHVkZWQgaW4KLXRoZSBsaWJwbmcgZGlzdHJpYnV0aW9uLgotCi1MaWJwbmcgd2FzIHdyaXR0ZW4gYXMgYSBjb21wYW5pb24gdG8gdGhlIFBORyBzcGVjaWZpY2F0aW9uLCBhcyBhIHdheQotb2YgcmVkdWNpbmcgdGhlIGFtb3VudCBvZiB0aW1lIGFuZCBlZmZvcnQgaXQgdGFrZXMgdG8gc3VwcG9ydCB0aGUgUE5HCi1maWxlIGZvcm1hdCBpbiBhcHBsaWNhdGlvbiBwcm9ncmFtcy4KLQotVGhlIFBORyBzcGVjaWZpY2F0aW9uIChzZWNvbmQgZWRpdGlvbiksIE5vdmVtYmVyIDIwMDMsIGlzIGF2YWlsYWJsZSBhcwotYSBXM0MgUmVjb21tZW5kYXRpb24gYW5kIGFzIGFuIElTTyBTdGFuZGFyZCAoSVNPL0lFQyAxNTk0ODoyMDAzIChFKSkgYXQKLTxodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1JFQy1QTkctMjAwMzExMTAvCi1UaGUgVzNDIGFuZCBJU08gZG9jdW1lbnRzIGhhdmUgaWRlbnRpY2FsIHRlY2huaWNhbCBjb250ZW50LgotCi1UaGUgUE5HLTEuMiBzcGVjaWZpY2F0aW9uIGlzIGF2YWlsYWJsZSBhdAotPGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nL2RvY3VtZW50cy8+LiAgSXQgaXMgdGVjaG5pY2FsbHkgZXF1aXZhbGVudAotdG8gdGhlIFBORyBzcGVjaWZpY2F0aW9uIChzZWNvbmQgZWRpdGlvbikgYnV0IGhhcyBzb21lIGFkZGl0aW9uYWwgbWF0ZXJpYWwuCi0KLVRoZSBQTkctMS4wIHNwZWNpZmljYXRpb24gaXMgYXZhaWxhYmxlCi1hcyBSRkMgMjA4MyA8aHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvZG9jdW1lbnRzLz4gYW5kIGFzIGEKLVczQyBSZWNvbW1lbmRhdGlvbiA8aHR0cDovL3d3dy53My5vcmcvVFIvUkVDLnBuZy5odG1sPi4KLQotU29tZSBhZGRpdGlvbmFsIGNodW5rcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBzcGVjaWFsLXB1cnBvc2UgcHVibGljIGNodW5rcwotZG9jdW1lbnRzIGF0IDxodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9kb2N1bWVudHMvPi4KLQotT3RoZXIgaW5mb3JtYXRpb24KLWFib3V0IFBORywgYW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBsaWJwbmcsIGNhbiBiZSBmb3VuZCBhdCB0aGUgUE5HIGhvbWUKLXBhZ2UsIDxodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy8+LgotCi1Nb3N0IHVzZXJzIHdpbGwgbm90IGhhdmUgdG8gbW9kaWZ5IHRoZSBsaWJyYXJ5IHNpZ25pZmljYW50bHk7IGFkdmFuY2VkCi11c2VycyBtYXkgd2FudCB0byBtb2RpZnkgaXQgbW9yZS4gIEFsbCBhdHRlbXB0cyB3ZXJlIG1hZGUgdG8gbWFrZSBpdCBhcwotY29tcGxldGUgYXMgcG9zc2libGUsIHdoaWxlIGtlZXBpbmcgdGhlIGNvZGUgZWFzeSB0byB1bmRlcnN0YW5kLgotQ3VycmVudGx5LCB0aGlzIGxpYnJhcnkgb25seSBzdXBwb3J0cyBDLiAgU3VwcG9ydCBmb3Igb3RoZXIgbGFuZ3VhZ2VzCi1pcyBiZWluZyBjb25zaWRlcmVkLgotCi1MaWJwbmcgaGFzIGJlZW4gZGVzaWduZWQgdG8gaGFuZGxlIG11bHRpcGxlIHNlc3Npb25zIGF0IG9uZSB0aW1lLAotdG8gYmUgZWFzaWx5IG1vZGlmaWFibGUsIHRvIGJlIHBvcnRhYmxlIHRvIHRoZSB2YXN0IG1ham9yaXR5IG9mCi1tYWNoaW5lcyAoQU5TSSwgSyZSLCAxNi0sIDMyLSwgYW5kIDY0LWJpdCkgYXZhaWxhYmxlLCBhbmQgdG8gYmUgZWFzeQotdG8gdXNlLiAgVGhlIHVsdGltYXRlIGdvYWwgb2YgbGlicG5nIGlzIHRvIHByb21vdGUgdGhlIGFjY2VwdGFuY2Ugb2YKLXRoZSBQTkcgZmlsZSBmb3JtYXQgaW4gd2hhdGV2ZXIgd2F5IHBvc3NpYmxlLiAgV2hpbGUgdGhlcmUgaXMgc3RpbGwKLXdvcmsgdG8gYmUgZG9uZSAoc2VlIHRoZSBUT0RPIGZpbGUpLCBsaWJwbmcgc2hvdWxkIGNvdmVyIHRoZQotbWFqb3JpdHkgb2YgdGhlIG5lZWRzIG9mIGl0cyB1c2Vycy4KLQotTGlicG5nIHVzZXMgemxpYiBmb3IgaXRzIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG9mIFBORyBmaWxlcy4KLUZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgemxpYiwgYW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB6bGliLCBjYW4KLWJlIGZvdW5kIGF0IHRoZSB6bGliIGhvbWUgcGFnZSwgPGh0dHA6Ly93d3cuaW5mby16aXAub3JnL3B1Yi9pbmZvemlwL3psaWIvPi4KLVRoZSB6bGliIGNvbXByZXNzaW9uIHV0aWxpdHkgaXMgYSBnZW5lcmFsIHB1cnBvc2UgdXRpbGl0eSB0aGF0IGlzCi11c2VmdWwgZm9yIG1vcmUgdGhhbiBQTkcgZmlsZXMsIGFuZCBjYW4gYmUgdXNlZCB3aXRob3V0IGxpYnBuZy4KLVNlZSB0aGUgZG9jdW1lbnRhdGlvbiBkZWxpdmVyZWQgd2l0aCB6bGliIGZvciBtb3JlIGRldGFpbHMuCi1Zb3UgY2FuIHVzdWFsbHkgZmluZCB0aGUgc291cmNlIGZpbGVzIGZvciB0aGUgemxpYiB1dGlsaXR5IHdoZXJldmVyIHlvdQotZmluZCB0aGUgbGlicG5nIHNvdXJjZSBmaWxlcy4KLQotTGlicG5nIGlzIHRocmVhZCBzYWZlLCBwcm92aWRlZCB0aGUgdGhyZWFkcyBhcmUgdXNpbmcgZGlmZmVyZW50Ci1pbnN0YW5jZXMgb2YgdGhlIHN0cnVjdHVyZXMuICBFYWNoIHRocmVhZCBzaG91bGQgaGF2ZSBpdHMgb3duCi1wbmdfc3RydWN0IGFuZCBwbmdfaW5mbyBpbnN0YW5jZXMsIGFuZCB0aHVzIGl0cyBvd24gaW1hZ2UuCi1MaWJwbmcgZG9lcyBub3QgcHJvdGVjdCBpdHNlbGYgYWdhaW5zdCB0d28gdGhyZWFkcyB1c2luZyB0aGUKLXNhbWUgaW5zdGFuY2Ugb2YgYSBzdHJ1Y3R1cmUuCi0KLUlJLiBTdHJ1Y3R1cmVzCi0KLVRoZXJlIGFyZSB0d28gbWFpbiBzdHJ1Y3R1cmVzIHRoYXQgYXJlIGltcG9ydGFudCB0byBsaWJwbmcsIHBuZ19zdHJ1Y3QKLWFuZCBwbmdfaW5mby4gIFRoZSBmaXJzdCwgcG5nX3N0cnVjdCwgaXMgYW4gaW50ZXJuYWwgc3RydWN0dXJlIHRoYXQKLXdpbGwgbm90LCBmb3IgdGhlIG1vc3QgcGFydCwgYmUgdXNlZCBieSBhIHVzZXIgZXhjZXB0IGFzIHRoZSBmaXJzdAotdmFyaWFibGUgcGFzc2VkIHRvIGV2ZXJ5IGxpYnBuZyBmdW5jdGlvbiBjYWxsLgotCi1UaGUgcG5nX2luZm8gc3RydWN0dXJlIGlzIGRlc2lnbmVkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi1QTkcgZmlsZS4gIEF0IG9uZSB0aW1lLCB0aGUgZmllbGRzIG9mIHBuZ19pbmZvIHdlcmUgaW50ZW5kZWQgdG8gYmUKLWRpcmVjdGx5IGFjY2Vzc2libGUgdG8gdGhlIHVzZXIuICBIb3dldmVyLCB0aGlzIHRlbmRlZCB0byBjYXVzZSBwcm9ibGVtcwotd2l0aCBhcHBsaWNhdGlvbnMgdXNpbmcgZHluYW1pY2FsbHkgbG9hZGVkIGxpYnJhcmllcywgYW5kIGFzIGEgcmVzdWx0Ci1hIHNldCBvZiBpbnRlcmZhY2UgZnVuY3Rpb25zIGZvciBwbmdfaW5mbyAodGhlIHBuZ19nZXRfKigpIGFuZCBwbmdfc2V0XyooKQotZnVuY3Rpb25zKSB3YXMgZGV2ZWxvcGVkLiAgVGhlIGZpZWxkcyBvZiBwbmdfaW5mbyBhcmUgc3RpbGwgYXZhaWxhYmxlIGZvcgotb2xkZXIgYXBwbGljYXRpb25zLCBidXQgaXQgaXMgc3VnZ2VzdGVkIHRoYXQgYXBwbGljYXRpb25zIHVzZSB0aGUgbmV3Ci1pbnRlcmZhY2VzIGlmIGF0IGFsbCBwb3NzaWJsZS4KLQotQXBwbGljYXRpb25zIHRoYXQgZG8gbWFrZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSBtZW1iZXJzIG9mIHBuZ19zdHJ1Y3QgKGV4Y2VwdAotZm9yIHBuZ19wdHItPmptcGJ1ZikgbXVzdCBiZSByZWNvbXBpbGVkIHdoZW5ldmVyIHRoZSBsaWJyYXJ5IGlzIHVwZGF0ZWQsCi1hbmQgYXBwbGljYXRpb25zIHRoYXQgbWFrZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSBtZW1iZXJzIG9mIHBuZ19pbmZvIG11c3QKLWJlIHJlY29tcGlsZWQgaWYgdGhleSB3ZXJlIGNvbXBpbGVkIG9yIGxvYWRlZCB3aXRoIGxpYnBuZyB2ZXJzaW9uIDEuMC42LAotaW4gd2hpY2ggdGhlIG1lbWJlcnMgd2VyZSBpbiBhIGRpZmZlcmVudCBvcmRlci4gIEluIHZlcnNpb24gMS4wLjcsIHRoZQotbWVtYmVycyBvZiB0aGUgcG5nX2luZm8gc3RydWN0dXJlIHJldmVydGVkIHRvIHRoZSBvbGQgb3JkZXIsIGFzIHRoZXkgd2VyZQotaW4gdmVyc2lvbnMgMC45N2MgdGhyb3VnaCAxLjAuNS4gIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiAyLjAuMCwgYm90aAotc3RydWN0dXJlcyBhcmUgZ29pbmcgdG8gYmUgaGlkZGVuLCBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJ1Y3R1cmVzIHdpbGwKLW9ubHkgYmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBwbmdfZ2V0L3BuZ19zZXQgZnVuY3Rpb25zLgotCi1UaGUgcG5nLmggaGVhZGVyIGZpbGUgaXMgYW4gaW52YWx1YWJsZSByZWZlcmVuY2UgZm9yIHByb2dyYW1taW5nIHdpdGggbGlicG5nLgotQW5kIHdoaWxlIEknbSBvbiB0aGUgdG9waWMsIG1ha2Ugc3VyZSB5b3UgaW5jbHVkZSB0aGUgbGlicG5nIGhlYWRlciBmaWxlOgotCi0jaW5jbHVkZSA8cG5nLmg+Ci0KLUlJSS4gUmVhZGluZwotCi1XZSdsbCBub3cgd2FsayB5b3UgdGhyb3VnaCB0aGUgcG9zc2libGUgZnVuY3Rpb25zIHRvIGNhbGwgd2hlbiByZWFkaW5nCi1pbiBhIFBORyBmaWxlIHNlcXVlbnRpYWxseSwgYnJpZWZseSBleHBsYWluaW5nIHRoZSBzeW50YXggYW5kIHB1cnBvc2UKLW9mIGVhY2ggb25lLiAgU2VlIGV4YW1wbGUuYyBhbmQgcG5nLmggZm9yIG1vcmUgZGV0YWlsLiAgV2hpbGUKLXByb2dyZXNzaXZlIHJlYWRpbmcgaXMgY292ZXJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLCB5b3Ugd2lsbCBzdGlsbAotbmVlZCBzb21lIG9mIHRoZSBmdW5jdGlvbnMgZGlzY3Vzc2VkIGluIHRoaXMgc2VjdGlvbiB0byByZWFkIGEgUE5HCi1maWxlLgotCi1TZXR1cAotCi1Zb3Ugd2lsbCB3YW50IHRvIGRvIHRoZSBJL08gaW5pdGlhbGl6YXRpb24oKikgYmVmb3JlIHlvdSBnZXQgaW50byBsaWJwbmcsCi1zbyBpZiBpdCBkb2Vzbid0IHdvcmssIHlvdSBkb24ndCBoYXZlIG11Y2ggdG8gdW5kby4gIE9mIGNvdXJzZSwgeW91Ci13aWxsIGFsc28gd2FudCB0byBpbnN1cmUgdGhhdCB5b3UgYXJlLCBpbiBmYWN0LCBkZWFsaW5nIHdpdGggYSBQTkcKLWZpbGUuICBMaWJwbmcgcHJvdmlkZXMgYSBzaW1wbGUgY2hlY2sgdG8gc2VlIGlmIGEgZmlsZSBpcyBhIFBORyBmaWxlLgotVG8gdXNlIGl0LCBwYXNzIGluIHRoZSBmaXJzdCAxIHRvIDggYnl0ZXMgb2YgdGhlIGZpbGUgdG8gdGhlIGZ1bmN0aW9uCi1wbmdfc2lnX2NtcCgpLCBhbmQgaXQgd2lsbCByZXR1cm4gMCAoZmFsc2UpIGlmIHRoZSBieXRlcyBtYXRjaCB0aGUKLWNvcnJlc3BvbmRpbmcgYnl0ZXMgb2YgdGhlIFBORyBzaWduYXR1cmUsIG9yIG5vbnplcm8gKHRydWUpIG90aGVyd2lzZS4KLU9mIGNvdXJzZSwgdGhlIG1vcmUgYnl0ZXMgeW91IHBhc3MgaW4sIHRoZSBncmVhdGVyIHRoZSBhY2N1cmFjeSBvZiB0aGUKLXByZWRpY3Rpb24uCi0KLUlmIHlvdSBhcmUgaW50ZW5kaW5nIHRvIGtlZXAgdGhlIGZpbGUgcG9pbnRlciBvcGVuIGZvciB1c2UgaW4gbGlicG5nLAoteW91IG11c3QgZW5zdXJlIHlvdSBkb24ndCByZWFkIG1vcmUgdGhhbiA4IGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZwotb2YgdGhlIGZpbGUsIGFuZCB5b3UgYWxzbyBoYXZlIHRvIG1ha2UgYSBjYWxsIHRvIHBuZ19zZXRfc2lnX2J5dGVzX3JlYWQoKQotd2l0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHlvdSByZWFkIGZyb20gdGhlIGJlZ2lubmluZy4gIExpYnBuZyB3aWxsCi10aGVuIG9ubHkgY2hlY2sgdGhlIGJ5dGVzIChpZiBhbnkpIHRoYXQgeW91ciBwcm9ncmFtIGRpZG4ndCByZWFkLgotCi0oKik6IElmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBzdGFuZGFyZCBJL08gZnVuY3Rpb25zLCB5b3Ugd2lsbCBuZWVkCi10byByZXBsYWNlIHRoZW0gd2l0aCBjdXN0b20gZnVuY3Rpb25zLiAgU2VlIHRoZSBkaXNjdXNzaW9uIHVuZGVyCi1DdXN0b21pemluZyBsaWJwbmcuCi0KLQotICAgIEZJTEUgKmZwID0gZm9wZW4oZmlsZV9uYW1lLCAicmIiKTsKLSAgICBpZiAoIWZwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICAgfQotICAgIGZyZWFkKGhlYWRlciwgMSwgbnVtYmVyLCBmcCk7Ci0gICAgaXNfcG5nID0gIXBuZ19zaWdfY21wKGhlYWRlciwgMCwgbnVtYmVyKTsKLSAgICBpZiAoIWlzX3BuZykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTk9UX1BORyk7Ci0gICAgfQotCi0KLU5leHQsIHBuZ19zdHJ1Y3QgYW5kIHBuZ19pbmZvIG5lZWQgdG8gYmUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZC4gIEluCi1vcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgc2l6ZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzIGNvcnJlY3QgZXZlbiB3aXRoIGEKLWR5bmFtaWNhbGx5IGxpbmtlZCBsaWJwbmcsIHRoZXJlIGFyZSBmdW5jdGlvbnMgdG8gaW5pdGlhbGl6ZSBhbmQKLWFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmVzLiAgV2UgYWxzbyBwYXNzIHRoZSBsaWJyYXJ5IHZlcnNpb24sIG9wdGlvbmFsCi1wb2ludGVycyB0byBlcnJvciBoYW5kbGluZyBmdW5jdGlvbnMsIGFuZCBhIHBvaW50ZXIgdG8gYSBkYXRhIHN0cnVjdCBmb3IKLXVzZSBieSB0aGUgZXJyb3IgZnVuY3Rpb25zLCBpZiBuZWNlc3NhcnkgKHRoZSBwb2ludGVyIGFuZCBmdW5jdGlvbnMgY2FuCi1iZSBOVUxMIGlmIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXJzIGFyZSB0byBiZSB1c2VkKS4gIFNlZSB0aGUgc2VjdGlvbgotb24gQ2hhbmdlcyB0byBMaWJwbmcgYmVsb3cgcmVnYXJkaW5nIHRoZSBvbGQgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLgotVGhlIHN0cnVjdHVyZSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBxdWlldGx5IHJldHVybiBOVUxMIGlmIHRoZXkgZmFpbCB0bwotY3JlYXRlIHRoZSBzdHJ1Y3R1cmUsIHNvIHlvdXIgYXBwbGljYXRpb24gc2hvdWxkIGNoZWNrIGZvciB0aGF0LgotCi0gICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QKLSAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAotICAgICAgICB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4pOwotICAgIGlmICghcG5nX3B0cikKLSAgICAgICAgcmV0dXJuIChFUlJPUik7Ci0KLSAgICBwbmdfaW5mb3AgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOwotICAgIGlmICghaW5mb19wdHIpCi0gICAgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwKLSAgICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCwgKHBuZ19pbmZvcHApTlVMTCk7Ci0gICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLQotICAgIHBuZ19pbmZvcCBlbmRfaW5mbyA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0gICAgaWYgKCFlbmRfaW5mbykKLSAgICB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsCi0gICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCk7Ci0gICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLQotSWYgeW91IHdhbnQgdG8gdXNlIHlvdXIgb3duIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLAotZGVmaW5lIFBOR19VU0VSX01FTV9TVVBQT1JURUQgYW5kIHVzZQotcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCkgaW5zdGVhZCBvZiBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCk6Ci0KLSAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yCi0gICAgICAgKFBOR19MSUJQTkdfVkVSX1NUUklORywgKHBuZ192b2lkcCl1c2VyX2Vycm9yX3B0ciwKLSAgICAgICAgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuLCAocG5nX3ZvaWRwKQotICAgICAgICB1c2VyX21lbV9wdHIsIHVzZXJfbWFsbG9jX2ZuLCB1c2VyX2ZyZWVfZm4pOwotCi1UaGUgZXJyb3IgaGFuZGxpbmcgcm91dGluZXMgcGFzc2VkIHRvIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoKQotYW5kIHRoZSBtZW1vcnkgYWxsb2MvZnJlZSByb3V0aW5lcyBwYXNzZWQgdG8gcG5nX2NyZWF0ZV9zdHJ1Y3RfMigpCi1hcmUgb25seSBuZWNlc3NhcnkgaWYgeW91IGFyZSBub3QgdXNpbmcgdGhlIGxpYnBuZyBzdXBwbGllZCBlcnJvcgotaGFuZGxpbmcgYW5kIG1lbW9yeSBhbGxvYy9mcmVlIGZ1bmN0aW9ucy4KLQotV2hlbiBsaWJwbmcgZW5jb3VudGVycyBhbiBlcnJvciwgaXQgZXhwZWN0cyB0byBsb25nam1wIGJhY2sKLXRvIHlvdXIgcm91dGluZS4gIFRoZXJlZm9yZSwgeW91IHdpbGwgbmVlZCB0byBjYWxsIHNldGptcCBhbmQgcGFzcwoteW91ciBwbmdfam1wYnVmKHBuZ19wdHIpLiAgSWYgeW91IHJlYWQgdGhlIGZpbGUgZnJvbSBkaWZmZXJlbnQKLXJvdXRpbmVzLCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgam1wYnVmIGZpZWxkIGV2ZXJ5IHRpbWUgeW91IGVudGVyCi1hIG5ldyByb3V0aW5lIHRoYXQgd2lsbCBjYWxsIGEgcG5nXyooKSBmdW5jdGlvbi4KLQotU2VlIHlvdXIgZG9jdW1lbnRhdGlvbiBvZiBzZXRqbXAvbG9uZ2ptcCBmb3IgeW91ciBjb21waWxlciBmb3IgbW9yZQotaW5mb3JtYXRpb24gb24gc2V0am1wL2xvbmdqbXAuICBTZWUgdGhlIGRpc2N1c3Npb24gb24gbGlicG5nIGVycm9yCi1oYW5kbGluZyBpbiB0aGUgQ3VzdG9taXppbmcgTGlicG5nIHNlY3Rpb24gYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24KLW9uIHRoZSBsaWJwbmcgZXJyb3IgaGFuZGxpbmcuICBJZiBhbiBlcnJvciBvY2N1cnMsIGFuZCBsaWJwbmcgbG9uZ2ptcCdzCi1iYWNrIHRvIHlvdXIgc2V0am1wLCB5b3Ugd2lsbCB3YW50IHRvIGNhbGwgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoKSB0bwotZnJlZSBhbnkgbWVtb3J5LgotCi0gICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKLSAgICB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsCi0gICAgICAgICAgICZlbmRfaW5mbyk7Ci0gICAgICAgIGZjbG9zZShmcCk7Ci0gICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLQotSWYgeW91IHdvdWxkIHJhdGhlciBhdm9pZCB0aGUgY29tcGxleGl0eSBvZiBzZXRqbXAvbG9uZ2ptcCBpc3N1ZXMsCi15b3UgY2FuIGNvbXBpbGUgbGlicG5nIHdpdGggUE5HX05PX1NFVEpNUCwgaW4gd2hpY2ggY2FzZQotZXJyb3JzIHdpbGwgcmVzdWx0IGluIGEgY2FsbCB0byBQTkdfQUJPUlQoKSB3aGljaCBkZWZhdWx0cyB0byBhYm9ydCgpLgotCi1Zb3UgY2FuICNkZWZpbmUgUE5HX0FCT1JUKCkgdG8gYSBmdW5jdGlvbiB0aGF0IGRvZXMgc29tZXRoaW5nCi1tb3JlIHVzZWZ1bCB0aGFuIGFib3J0KCksIGFzIGxvbmcgYXMgeW91ciBmdW5jdGlvbiBkb2VzIG5vdAotcmV0dXJuLgotCi1Ob3cgeW91IG5lZWQgdG8gc2V0IHVwIHRoZSBpbnB1dCBjb2RlLiAgVGhlIGRlZmF1bHQgZm9yIGxpYnBuZyBpcyB0bwotdXNlIHRoZSBDIGZ1bmN0aW9uIGZyZWFkKCkuICBJZiB5b3UgdXNlIHRoaXMsIHlvdSB3aWxsIG5lZWQgdG8gcGFzcyBhCi12YWxpZCBGSUxFICogaW4gdGhlIGZ1bmN0aW9uIHBuZ19pbml0X2lvKCkuICBCZSBzdXJlIHRoYXQgdGhlIGZpbGUgaXMKLW9wZW5lZCBpbiBiaW5hcnkgbW9kZS4gIElmIHlvdSB3aXNoIHRvIGhhbmRsZSByZWFkaW5nIGRhdGEgaW4gYW5vdGhlcgotd2F5LCB5b3UgbmVlZCBub3QgY2FsbCB0aGUgcG5nX2luaXRfaW8oKSBmdW5jdGlvbiwgYnV0IHlvdSBtdXN0IHRoZW4KLWltcGxlbWVudCB0aGUgbGlicG5nIEkvTyBtZXRob2RzIGRpc2N1c3NlZCBpbiB0aGUgQ3VzdG9taXppbmcgTGlicG5nCi1zZWN0aW9uIGJlbG93LgotCi0gICAgcG5nX2luaXRfaW8ocG5nX3B0ciwgZnApOwotCi1JZiB5b3UgaGFkIHByZXZpb3VzbHkgb3BlbmVkIHRoZSBmaWxlIGFuZCByZWFkIGFueSBvZiB0aGUgc2lnbmF0dXJlIGZyb20KLXRoZSBiZWdpbm5pbmcgaW4gb3JkZXIgdG8gc2VlIGlmIHRoaXMgd2FzIGEgUE5HIGZpbGUsIHlvdSBuZWVkIHRvIGxldAotbGlicG5nIGtub3cgdGhhdCB0aGVyZSBhcmUgc29tZSBieXRlcyBtaXNzaW5nIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotCi0gICAgcG5nX3NldF9zaWdfYnl0ZXMocG5nX3B0ciwgbnVtYmVyKTsKLQotWW91IGNhbiBjaGFuZ2UgdGhlIHpsaWIgY29tcHJlc3Npb24gYnVmZmVyIHNpemUgdG8gYmUgdXNlZCB3aGlsZQotcmVhZGluZyBjb21wcmVzc2VkIGRhdGEgd2l0aAotCi0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZShwbmdfcHRyLCBidWZmZXJfc2l6ZSk7Ci0KLXdoZXJlIHRoZSBkZWZhdWx0IHNpemUgaXMgODE5MiBieXRlcy4gIE5vdGUgdGhhdCB0aGUgYnVmZmVyIHNpemUKLWlzIGNoYW5nZWQgaW1tZWRpYXRlbHkgYW5kIHRoZSBidWZmZXIgaXMgcmVhbGxvY2F0ZWQgaW1tZWRpYXRlbHksCi1pbnN0ZWFkIG9mIHNldHRpbmcgYSBmbGFnIHRvIGJlIGFjdGVkIHVwb24gbGF0ZXIuCi0KLVNldHRpbmcgdXAgY2FsbGJhY2sgY29kZQotCi1Zb3UgY2FuIHNldCB1cCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBhbnkgdW5rbm93biBjaHVua3MgaW4gdGhlCi1pbnB1dCBzdHJlYW0uIFlvdSBtdXN0IHN1cHBseSB0aGUgZnVuY3Rpb24KLQotICAgIHJlYWRfY2h1bmtfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICAgIHBuZ191bmtub3duX2NodW5rcCBjaHVuayk7Ci0gICAgewotICAgICAgIC8qIFRoZSB1bmtub3duIGNodW5rIHN0cnVjdHVyZSBjb250YWlucyB5b3VyCi0gICAgICAgICAgY2h1bmsgZGF0YSwgYWxvbmcgd2l0aCBzaW1pbGFyIGRhdGEgZm9yIGFueSBvdGhlcgotICAgICAgICAgIHVua25vd24gY2h1bmtzOiAqLwotCi0gICAgICAgICAgIHBuZ19ieXRlIG5hbWVbNV07Ci0gICAgICAgICAgIHBuZ19ieXRlICpkYXRhOwotICAgICAgICAgICBwbmdfc2l6ZV90IHNpemU7Ci0KLSAgICAgICAvKiBOb3RlIHRoYXQgbGlicG5nIGhhcyBhbHJlYWR5IHRha2VuIGNhcmUgb2YKLSAgICAgICAgICB0aGUgQ1JDIGhhbmRsaW5nICovCi0KLSAgICAgICAvKiBwdXQgeW91ciBjb2RlIGhlcmUuICBTZWFyY2ggZm9yIHlvdXIgY2h1bmsgaW4gdGhlCi0gICAgICAgICAgdW5rbm93biBjaHVuayBzdHJ1Y3R1cmUsIHByb2Nlc3MgaXQsIGFuZCByZXR1cm4gb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZzogKi8KLQotICAgICAgIHJldHVybiAoLW4pOyAvKiBjaHVuayBoYWQgYW4gZXJyb3IgKi8KLSAgICAgICByZXR1cm4gKDApOyAvKiBkaWQgbm90IHJlY29nbml6ZSAqLwotICAgICAgIHJldHVybiAobik7IC8qIHN1Y2Nlc3MgKi8KLSAgICB9Ci0KLShZb3UgY2FuIGdpdmUgeW91ciBmdW5jdGlvbiBhbm90aGVyIG5hbWUgdGhhdCB5b3UgbGlrZSBpbnN0ZWFkIG9mCi0icmVhZF9jaHVua19jYWxsYmFjayIpCi0KLVRvIGluZm9ybSBsaWJwbmcgYWJvdXQgeW91ciBmdW5jdGlvbiwgdXNlCi0KLSAgICBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbihwbmdfcHRyLCB1c2VyX2NodW5rX3B0ciwKLSAgICAgICAgcmVhZF9jaHVua19jYWxsYmFjayk7Ci0KLVRoaXMgbmFtZXMgbm90IG9ubHkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLCBidXQgYWxzbyBhIHVzZXIgcG9pbnRlciB0aGF0Ci15b3UgY2FuIHJldHJpZXZlIHdpdGgKLQotICAgIHBuZ19nZXRfdXNlcl9jaHVua19wdHIocG5nX3B0cik7Ci0KLUlmIHlvdSBjYWxsIHRoZSBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbigpIGZ1bmN0aW9uLCB0aGVuIGFsbCB1bmtub3duCi1jaHVua3Mgd2lsbCBiZSBzYXZlZCB3aGVuIHJlYWQsIGluIGNhc2UgeW91ciBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIG5lZWQKLW9uZSBvciBtb3JlIG9mIHRoZW0uICBUaGlzIGJlaGF2aW9yIGNhbiBiZSBjaGFuZ2VkIHdpdGggdGhlCi1wbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSBmdW5jdGlvbiwgZGVzY3JpYmVkIGJlbG93LgotCi1BdCB0aGlzIHBvaW50LCB5b3UgY2FuIHNldCB1cCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZQotY2FsbGVkIGFmdGVyIGVhY2ggcm93IGhhcyBiZWVuIHJlYWQsIHdoaWNoIHlvdSBjYW4gdXNlIHRvIGNvbnRyb2wKLWEgcHJvZ3Jlc3MgbWV0ZXIgb3IgdGhlIGxpa2UuICBJdCdzIGRlbW9uc3RyYXRlZCBpbiBwbmd0ZXN0LmMuCi1Zb3UgbXVzdCBzdXBwbHkgYSBmdW5jdGlvbgotCi0gICAgdm9pZCByZWFkX3Jvd19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgIHBuZ191aW50XzMyIHJvdywgaW50IHBhc3MpOwotICAgIHsKLSAgICAgIC8qIHB1dCB5b3VyIGNvZGUgaGVyZSAqLwotICAgIH0KLQotKFlvdSBjYW4gZ2l2ZSBpdCBhbm90aGVyIG5hbWUgdGhhdCB5b3UgbGlrZSBpbnN0ZWFkIG9mICJyZWFkX3Jvd19jYWxsYmFjayIpCi0KLVRvIGluZm9ybSBsaWJwbmcgYWJvdXQgeW91ciBmdW5jdGlvbiwgdXNlCi0KLSAgICBwbmdfc2V0X3JlYWRfc3RhdHVzX2ZuKHBuZ19wdHIsIHJlYWRfcm93X2NhbGxiYWNrKTsKLQotVW5rbm93bi1jaHVuayBoYW5kbGluZwotCi1Ob3cgeW91IGdldCB0byBzZXQgdGhlIHdheSB0aGUgbGlicmFyeSBwcm9jZXNzZXMgdW5rbm93biBjaHVua3MgaW4gdGhlCi1pbnB1dCBQTkcgc3RyZWFtLiBCb3RoIGtub3duIGFuZCB1bmtub3duIGNodW5rcyB3aWxsIGJlIHJlYWQuICBOb3JtYWwKLWJlaGF2aW9yIGlzIHRoYXQga25vd24gY2h1bmtzIHdpbGwgYmUgcGFyc2VkIGludG8gaW5mb3JtYXRpb24gaW4KLXZhcmlvdXMgaW5mb19wdHIgbWVtYmVycyB3aGlsZSB1bmtub3duIGNodW5rcyB3aWxsIGJlIGRpc2NhcmRlZC4gVGhpcwotYmVoYXZpb3IgY2FuIGJlIHdhc3RlZnVsIGlmIHlvdXIgYXBwbGljYXRpb24gd2lsbCBuZXZlciB1c2Ugc29tZSBrbm93bgotY2h1bmsgdHlwZXMuIFRvIGNoYW5nZSB0aGlzLCB5b3UgY2FuIGNhbGw6Ci0KLSAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocG5nX3B0ciwga2VlcCwKLSAgICAgICAgY2h1bmtfbGlzdCwgbnVtX2NodW5rcyk7Ci0gICAga2VlcCAgICAgICAtIDA6IGRlZmF1bHQgdW5rbm93biBjaHVuayBoYW5kbGluZwotICAgICAgICAgICAgICAgICAxOiBpZ25vcmU7IGRvIG5vdCBrZWVwCi0gICAgICAgICAgICAgICAgIDI6IGtlZXAgb25seSBpZiBzYWZlLXRvLWNvcHkKLSAgICAgICAgICAgICAgICAgMzoga2VlcCBldmVuIGlmIHVuc2FmZS10by1jb3B5Ci0gICAgICAgICAgICAgICBZb3UgY2FuIHVzZSB0aGVzZSBkZWZpbml0aW9uczoKLSAgICAgICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUICAgMAotICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX05FVkVSICAgICAgICAxCi0gICAgICAgICAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRSAgICAgIDIKLSAgICAgICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMgICAgICAgMwotICAgIGNodW5rX2xpc3QgLSBsaXN0IG9mIGNodW5rcyBhZmZlY3RlZCAoYSBieXRlIHN0cmluZywKLSAgICAgICAgICAgICAgICAgZml2ZSBieXRlcyBwZXIgY2h1bmssIE5VTEwgb3IgJ1wwJyBpZgotICAgICAgICAgICAgICAgICBudW1fY2h1bmtzIGlzIDApCi0gICAgbnVtX2NodW5rcyAtIG51bWJlciBvZiBjaHVua3MgYWZmZWN0ZWQ7IGlmIDAsIGFsbAotICAgICAgICAgICAgICAgICB1bmtub3duIGNodW5rcyBhcmUgYWZmZWN0ZWQuICBJZiBub256ZXJvLAotICAgICAgICAgICAgICAgICBvbmx5IHRoZSBjaHVua3MgaW4gdGhlIGxpc3QgYXJlIGFmZmVjdGVkCi0KLVVua25vd24gY2h1bmtzIGRlY2xhcmVkIGluIHRoaXMgd2F5IHdpbGwgYmUgc2F2ZWQgYXMgcmF3IGRhdGEgb250byBhCi1saXN0IG9mIHBuZ191bmtub3duX2NodW5rIHN0cnVjdHVyZXMuICBJZiBhIGNodW5rIHRoYXQgaXMgbm9ybWFsbHkKLWtub3duIHRvIGxpYnBuZyBpcyBuYW1lZCBpbiB0aGUgbGlzdCwgaXQgd2lsbCBiZSBoYW5kbGVkIGFzIHVua25vd24sCi1hY2NvcmRpbmcgdG8gdGhlICJrZWVwIiBkaXJlY3RpdmUuICBJZiBhIGNodW5rIGlzIG5hbWVkIGluIHN1Y2Nlc3NpdmUKLWluc3RhbmNlcyBvZiBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSwgdGhlIGZpbmFsIGluc3RhbmNlIHdpbGwKLXRha2UgcHJlY2VkZW5jZS4gIFRoZSBJSERSIGFuZCBJRU5EIGNodW5rcyBzaG91bGQgbm90IGJlIG5hbWVkIGluCi1jaHVua19saXN0OyBpZiB0aGV5IGFyZSwgbGlicG5nIHdpbGwgcHJvY2VzcyB0aGVtIG5vcm1hbGx5IGFueXdheS4KLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIHRoZSB1c2FnZSBvZiBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSwKLXdoZXJlIHRoZSBwcml2YXRlICJ2cEFnIiBjaHVuayB3aWxsIGxhdGVyIGJlIHByb2Nlc3NlZCBieSBhIHVzZXIgY2h1bmsKLWNhbGxiYWNrIGZ1bmN0aW9uOgotCi0gICAgcG5nX2J5dGUgdnBBZ1s1XT17MTE4LCAxMTIsICA2NSwgMTAzLCAocG5nX2J5dGUpICdcMCd9OwotCi0gICAgI2lmIGRlZmluZWQoUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKLSAgICAgIHBuZ19ieXRlIHVudXNlZF9jaHVua3NbXT0KLSAgICAgIHsKLSAgICAgICAgMTA0LCAgNzMsICA4MywgIDg0LCAocG5nX2J5dGUpICdcMCcsICAgLyogaElTVCAqLwotICAgICAgICAxMDUsICA4NCwgIDg4LCAxMTYsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBpVFh0ICovCi0gICAgICAgIDExMiwgIDY3LCAgNjUsICA3NiwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIHBDQUwgKi8KLSAgICAgICAgMTE1LCAgNjcsICA2NSwgIDc2LCAocG5nX2J5dGUpICdcMCcsICAgLyogc0NBTCAqLwotICAgICAgICAxMTUsICA4MCwgIDc2LCAgODQsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBzUExUICovCi0gICAgICAgIDExNiwgIDczLCAgNzcsICA2OSwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIHRJTUUgKi8KLSAgICAgIH07Ci0gICAgI2VuZGlmCi0KLSAgICAuLi4KLQotICAgICNpZiBkZWZpbmVkKFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCi0gICAgICAvKiBpZ25vcmUgYWxsIHVua25vd24gY2h1bmtzOiAqLwotICAgICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHJlYWRfcHRyLCAxLCBOVUxMLCAwKTsKLSAgICAgIC8qIGV4Y2VwdCBmb3IgdnBBZzogKi8KLSAgICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhyZWFkX3B0ciwgMiwgdnBBZywgMSk7Ci0gICAgICAvKiBhbHNvIGlnbm9yZSB1bnVzZWQga25vd24gY2h1bmtzOiAqLwotICAgICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHJlYWRfcHRyLCAxLCB1bnVzZWRfY2h1bmtzLAotICAgICAgICAgKGludClzaXplb2YodW51c2VkX2NodW5rcykvNSk7Ci0gICAgI2VuZGlmCi0KLVVzZXIgbGltaXRzCi0KLVRoZSBQTkcgc3BlY2lmaWNhdGlvbiBhbGxvd3MgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgYW4gaW1hZ2UgdG8gYmUgYXMKLWxhcmdlIGFzIDJeMzEtMSAoMHg3ZmZmZmZmZiksIG9yIGFib3V0IDIuMTQ3IGJpbGxpb24gcm93cyBhbmQgY29sdW1ucy4KLVNpbmNlIHZlcnkgZmV3IGFwcGxpY2F0aW9ucyByZWFsbHkgbmVlZCB0byBwcm9jZXNzIHN1Y2ggbGFyZ2UgaW1hZ2VzLAotd2UgaGF2ZSBpbXBvc2VkIGFuIGFyYml0cmFyeSAxLW1pbGxpb24gbGltaXQgb24gcm93cyBhbmQgY29sdW1ucy4KLUxhcmdlciBpbWFnZXMgd2lsbCBiZSByZWplY3RlZCBpbW1lZGlhdGVseSB3aXRoIGEgcG5nX2Vycm9yKCkgY2FsbC4gSWYKLXlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgbGltaXQsIHlvdSBjYW4gdXNlCi0KLSAgIHBuZ19zZXRfdXNlcl9saW1pdHMocG5nX3B0ciwgd2lkdGhfbWF4LCBoZWlnaHRfbWF4KTsKLQotdG8gc2V0IHlvdXIgb3duIGxpbWl0cywgb3IgdXNlIHdpZHRoX21heCA9IGhlaWdodF9tYXggPSAweDdmZmZmZmZmTAotdG8gYWxsb3cgYWxsIHZhbGlkIGRpbWVuc2lvbnMgKGxpYnBuZyBtYXkgcmVqZWN0IHNvbWUgdmVyeSBsYXJnZSBpbWFnZXMKLWFueXdheSBiZWNhdXNlIG9mIHBvdGVudGlhbCBidWZmZXIgb3ZlcmZsb3cgY29uZGl0aW9ucykuCi0KLVlvdSBzaG91bGQgcHV0IHRoaXMgc3RhdGVtZW50IGFmdGVyIHlvdSBjcmVhdGUgdGhlIFBORyBzdHJ1Y3R1cmUgYW5kCi1iZWZvcmUgY2FsbGluZyBwbmdfcmVhZF9pbmZvKCksIHBuZ19yZWFkX3BuZygpLCBvciBwbmdfcHJvY2Vzc19kYXRhKCkuCi1JZiB5b3UgbmVlZCB0byByZXRyaWV2ZSB0aGUgbGltaXRzIHRoYXQgYXJlIGJlaW5nIGFwcGxpZWQsIHVzZQotCi0gICB3aWR0aF9tYXggPSBwbmdfZ2V0X3VzZXJfd2lkdGhfbWF4KHBuZ19wdHIpOwotICAgaGVpZ2h0X21heCA9IHBuZ19nZXRfdXNlcl9oZWlnaHRfbWF4KHBuZ19wdHIpOwotCi1UaGUgUE5HIHNwZWNpZmljYXRpb24gc2V0cyBubyBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGFuY2lsbGFyeSBjaHVua3MKLWFsbG93ZWQgaW4gYSBQTkcgZGF0YXN0cmVhbS4gIFlvdSBjYW4gaW1wb3NlIGEgbGltaXQgb24gdGhlIHRvdGFsIG51bWJlcgotb2Ygc1BMVCwgdEVYdCwgaVRYdCwgelRYdCwgYW5kIHVua25vd24gY2h1bmtzIHRoYXQgd2lsbCBiZSBzdG9yZWQsIHdpdGgKLQotICAgcG5nX3NldF9jaHVua19jYWNoZV9tYXgocG5nX3B0ciwgdXNlcl9jaHVua19jYWNoZV9tYXgpOwotCi13aGVyZSAweDdmZmZmZmZmTCBtZWFucyB1bmxpbWl0ZWQuICBZb3UgY2FuIHJldHJpZXZlIHRoaXMgbGltaXQgd2l0aAotCi0gICBjaHVua19jYWNoZV9tYXggPSBwbmdfZ2V0X2NodW5rX2NhY2hlX21heChwbmdfcHRyKTsKLQotVGhpcyBsaW1pdCBhbHNvIGFwcGxpZXMgdG8gdGhlIG51bWJlciBvZiBidWZmZXJzIHRoYXQgY2FuIGJlIGFsbG9jYXRlZAotYnkgcG5nX2RlY29tcHJlc3NfY2h1bmsoKSB3aGlsZSBkZWNvbXByZXNzaW5nIGlUWHQsIHpUWHQsIGFuZCBpQ0NQIGNodW5rcy4KLQotWW91IGNhbiBhbHNvIHNldCBhIGxpbWl0IG9uIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRoYXQgYSBjb21wcmVzc2VkIGNodW5rCi1vdGhlciB0aGFuIElEQVQgY2FuIG9jY3VweSwgd2l0aAotCi0gICBwbmdfc2V0X2NodW5rX21hbGxvY19tYXgocG5nX3B0ciwgdXNlcl9jaHVua19tYWxsb2NfbWF4KTsKLQotYW5kIHlvdSBjYW4gcmV0cmlldmUgdGhlIGxpbWl0IHdpdGgKLQotICAgY2h1bmtfbWFsbG9jX21heCA9IHBuZ19nZXRfY2h1bmtfbWFsbG9jX21heChwbmdfcHRyKTsKLQotQW55IGNodW5rcyB0aGF0IHdvdWxkIGNhdXNlIGVpdGhlciBvZiB0aGVzZSBsaW1pdHMgdG8gYmUgZXhjZWVkZWQgd2lsbAotYmUgaWdub3JlZC4KLQotVGhlIGhpZ2gtbGV2ZWwgcmVhZCBpbnRlcmZhY2UKLQotQXQgdGhpcyBwb2ludCB0aGVyZSBhcmUgdHdvIHdheXMgdG8gcHJvY2VlZDsgdGhyb3VnaCB0aGUgaGlnaC1sZXZlbAotcmVhZCBpbnRlcmZhY2UsIG9yIHRocm91Z2ggYSBzZXF1ZW5jZSBvZiBsb3ctbGV2ZWwgcmVhZCBvcGVyYXRpb25zLgotWW91IGNhbiB1c2UgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGlmIChhKSB5b3UgYXJlIHdpbGxpbmcgdG8gcmVhZAotdGhlIGVudGlyZSBpbWFnZSBpbnRvIG1lbW9yeSwgYW5kIChiKSB0aGUgaW5wdXQgdHJhbnNmb3JtYXRpb25zCi15b3Ugd2FudCB0byBkbyBhcmUgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIHNldDoKLQotICAgIFBOR19UUkFOU0ZPUk1fSURFTlRJVFkgICAgICBObyB0cmFuc2Zvcm1hdGlvbgotICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfMTYgICAgICBTdHJpcCAxNi1iaXQgc2FtcGxlcyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IGJpdHMKLSAgICBQTkdfVFJBTlNGT1JNX1NUUklQX0FMUEhBICAgRGlzY2FyZCB0aGUgYWxwaGEgY2hhbm5lbAotICAgIFBOR19UUkFOU0ZPUk1fUEFDS0lORyAgICAgICBFeHBhbmQgMSwgMiBhbmQgNC1iaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyB0byBieXRlcwotICAgIFBOR19UUkFOU0ZPUk1fUEFDS1NXQVAgICAgICBDaGFuZ2Ugb3JkZXIgb2YgcGFja2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVscyB0byBMU0IgZmlyc3QKLSAgICBQTkdfVFJBTlNGT1JNX0VYUEFORCAgICAgICAgUGVyZm9ybSBzZXRfZXhwYW5kKCkKLSAgICBQTkdfVFJBTlNGT1JNX0lOVkVSVF9NT05PICAgSW52ZXJ0IG1vbm9jaHJvbWUgaW1hZ2VzCi0gICAgUE5HX1RSQU5TRk9STV9TSElGVCAgICAgICAgIE5vcm1hbGl6ZSBwaXhlbHMgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNCSVQgZGVwdGgKLSAgICBQTkdfVFJBTlNGT1JNX0JHUiAgICAgICAgICAgRmxpcCBSR0IgdG8gQkdSLCBSR0JBCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIEJHUkEKLSAgICBQTkdfVFJBTlNGT1JNX1NXQVBfQUxQSEEgICAgRmxpcCBSR0JBIHRvIEFSR0Igb3IgR0EKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQUcKLSAgICBQTkdfVFJBTlNGT1JNX0lOVkVSVF9BTFBIQSAgQ2hhbmdlIGFscGhhIGZyb20gb3BhY2l0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0cmFuc3BhcmVuY3kKLSAgICBQTkdfVFJBTlNGT1JNX1NXQVBfRU5ESUFOICAgQnl0ZS1zd2FwIDE2LWJpdCBzYW1wbGVzCi0gICAgUE5HX1RSQU5TRk9STV9HUkFZX1RPX1JHQiAgIEV4cGFuZCBncmF5c2NhbGUgc2FtcGxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBSR0IgKG9yIEdBIHRvIFJHQkEpCi0KLShUaGlzIGV4Y2x1ZGVzIHNldHRpbmcgYSBiYWNrZ3JvdW5kIGNvbG9yLCBkb2luZyBnYW1tYSB0cmFuc2Zvcm1hdGlvbiwKLXF1YW50aXppbmcsIGFuZCBzZXR0aW5nIGZpbGxlci4pICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBzaW1wbHkgZG8gdGhpczoKLQotICAgIHBuZ19yZWFkX3BuZyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3RyYW5zZm9ybXMsIE5VTEwpCi0KLXdoZXJlIHBuZ190cmFuc2Zvcm1zIGlzIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiBzb21lCi1zZXQgb2YgdHJhbnNmb3JtYXRpb24gZmxhZ3MuICBUaGlzIGNhbGwgaXMgZXF1aXZhbGVudCB0byBwbmdfcmVhZF9pbmZvKCksCi1mb2xsb3dlZCB0aGUgc2V0IG9mIHRyYW5zZm9ybWF0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIHRyYW5zZm9ybSBtYXNrLAotdGhlbiBwbmdfcmVhZF9pbWFnZSgpLCBhbmQgZmluYWxseSBwbmdfcmVhZF9lbmQoKS4KLQotKFRoZSBmaW5hbCBwYXJhbWV0ZXIgb2YgdGhpcyBjYWxsIGlzIG5vdCB5ZXQgdXNlZC4gIFNvbWVkYXkgaXQgbWlnaHQgcG9pbnQKLXRvIHRyYW5zZm9ybWF0aW9uIHBhcmFtZXRlcnMgcmVxdWlyZWQgYnkgc29tZSBmdXR1cmUgaW5wdXQgdHJhbnNmb3JtLikKLQotWW91IG11c3QgdXNlIHBuZ190cmFuc2Zvcm1zIGFuZCBub3QgY2FsbCBhbnkgcG5nX3NldF90cmFuc2Zvcm0oKSBmdW5jdGlvbnMKLXdoZW4geW91IHVzZSBwbmdfcmVhZF9wbmcoKS4KLQotQWZ0ZXIgeW91IGhhdmUgY2FsbGVkIHBuZ19yZWFkX3BuZygpLCB5b3UgY2FuIHJldHJpZXZlIHRoZSBpbWFnZSBkYXRhCi13aXRoCi0KLSAgIHJvd19wb2ludGVycyA9IHBuZ19nZXRfcm93cyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLXdoZXJlIHJvd19wb2ludGVycyBpcyBhbiBhcnJheSBvZiBwb2ludGVycyB0byB0aGUgcGl4ZWwgZGF0YSBmb3IgZWFjaCByb3c6Ci0KLSAgIHBuZ19ieXRlcCByb3dfcG9pbnRlcnNbaGVpZ2h0XTsKLQotSWYgeW91IGtub3cgeW91ciBpbWFnZSBzaXplIGFuZCBwaXhlbCBzaXplIGFoZWFkIG9mIHRpbWUsIHlvdSBjYW4gYWxsb2NhdGUKLXJvd19wb2ludGVycyBwcmlvciB0byBjYWxsaW5nIHBuZ19yZWFkX3BuZygpIHdpdGgKLQotICAgaWYgKGhlaWdodCA+IFBOR19VSU5UXzMyX01BWC9wbmdfc2l6ZW9mKHBuZ19ieXRlKSkKLSAgICAgIHBuZ19lcnJvciAocG5nX3B0ciwKLSAgICAgICAgICJJbWFnZSBpcyB0b28gdGFsbCB0byBwcm9jZXNzIGluIG1lbW9yeSIpOwotICAgaWYgKHdpZHRoID4gUE5HX1VJTlRfMzJfTUFYL3BpeGVsX3NpemUpCi0gICAgICBwbmdfZXJyb3IgKHBuZ19wdHIsCi0gICAgICAgICAiSW1hZ2UgaXMgdG9vIHdpZGUgdG8gcHJvY2VzcyBpbiBtZW1vcnkiKTsKLSAgIHJvd19wb2ludGVycyA9IHBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgIGhlaWdodCpwbmdfc2l6ZW9mKHBuZ19ieXRlcCkpOwotICAgZm9yIChpbnQgaT0wOyBpPGhlaWdodCwgaSsrKQotICAgICAgcm93X3BvaW50ZXJzW2ldPU5VTEw7ICAvKiBzZWN1cml0eSBwcmVjYXV0aW9uICovCi0gICBmb3IgKGludCBpPTA7IGk8aGVpZ2h0LCBpKyspCi0gICAgICByb3dfcG9pbnRlcnNbaV09cG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgd2lkdGgqcGl4ZWxfc2l6ZSk7Ci0gICBwbmdfc2V0X3Jvd3MocG5nX3B0ciwgaW5mb19wdHIsICZyb3dfcG9pbnRlcnMpOwotCi1BbHRlcm5hdGl2ZWx5IHlvdSBjb3VsZCBhbGxvY2F0ZSB5b3VyIGltYWdlIGluIG9uZSBiaWcgYmxvY2sgYW5kIGRlZmluZQotcm93X3BvaW50ZXJzW2ldIHRvIHBvaW50IGludG8gdGhlIHByb3BlciBwbGFjZXMgaW4geW91ciBibG9jay4KLQotSWYgeW91IHVzZSBwbmdfc2V0X3Jvd3MoKSwgdGhlIGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nCi1yb3dfcG9pbnRlcnMgKGFuZCByb3dfcG9pbnRlcnNbaV0sIGlmIHRoZXkgd2VyZSBzZXBhcmF0ZWx5IGFsbG9jYXRlZCkuCi0KLUlmIHlvdSBkb24ndCBhbGxvY2F0ZSByb3dfcG9pbnRlcnMgYWhlYWQgb2YgdGltZSwgcG5nX3JlYWRfcG5nKCkgd2lsbAotZG8gaXQsIGFuZCBpdCdsbCBiZSBmcmVlJ2VkIHdoZW4geW91IGNhbGwgcG5nX2Rlc3Ryb3lfKigpLgotCi1UaGUgbG93LWxldmVsIHJlYWQgaW50ZXJmYWNlCi0KLUlmIHlvdSBhcmUgZ29pbmcgdGhlIGxvdy1sZXZlbCByb3V0ZSwgeW91IGFyZSBub3cgcmVhZHkgdG8gcmVhZCBhbGwKLXRoZSBmaWxlIGluZm9ybWF0aW9uIHVwIHRvIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YS4gIFlvdSBkbyB0aGlzIHdpdGggYQotY2FsbCB0byBwbmdfcmVhZF9pbmZvKCkuCi0KLSAgICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotVGhpcyB3aWxsIHByb2Nlc3MgYWxsIGNodW5rcyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgaW1hZ2UgZGF0YS4KLQotUXVlcnlpbmcgdGhlIGluZm8gc3RydWN0dXJlCi0KLUZ1bmN0aW9ucyBhcmUgdXNlZCB0byBnZXQgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGluZm9fcHRyIG9uY2UgaXQKLWhhcyBiZWVuIHJlYWQuICBOb3RlIHRoYXQgdGhlc2UgZmllbGRzIG1heSBub3QgYmUgY29tcGxldGVseSBmaWxsZWQKLWluIHVudGlsIHBuZ19yZWFkX2VuZCgpIGhhcyByZWFkIHRoZSBjaHVuayBkYXRhIGZvbGxvd2luZyB0aGUgaW1hZ2UuCi0KLSAgICBwbmdfZ2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsICZ3aWR0aCwgJmhlaWdodCwKLSAgICAgICAmYml0X2RlcHRoLCAmY29sb3JfdHlwZSwgJmludGVybGFjZV90eXBlLAotICAgICAgICZjb21wcmVzc2lvbl90eXBlLCAmZmlsdGVyX21ldGhvZCk7Ci0KLSAgICB3aWR0aCAgICAgICAgICAtIGhvbGRzIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgIGluIHBpeGVscyAodXAgdG8gMl4zMSkuCi0gICAgaGVpZ2h0ICAgICAgICAgLSBob2xkcyB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZQotICAgICAgICAgICAgICAgICAgICAgaW4gcGl4ZWxzICh1cCB0byAyXjMxKS4KLSAgICBiaXRfZGVwdGggICAgICAtIGhvbGRzIHRoZSBiaXQgZGVwdGggb2Ygb25lIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgY2hhbm5lbHMuICAodmFsaWQgdmFsdWVzIGFyZQotICAgICAgICAgICAgICAgICAgICAgMSwgMiwgNCwgOCwgMTYgYW5kIGRlcGVuZCBhbHNvIG9uCi0gICAgICAgICAgICAgICAgICAgICB0aGUgY29sb3JfdHlwZS4gIFNlZSBhbHNvCi0gICAgICAgICAgICAgICAgICAgICBzaWduaWZpY2FudCBiaXRzIChzQklUKSBiZWxvdykuCi0gICAgY29sb3JfdHlwZSAgICAgLSBkZXNjcmliZXMgd2hpY2ggY29sb3IvYWxwaGEgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgcHJlc2VudC4KLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX0dSQVkKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDEsIDIsIDQsIDgsIDE2KQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQQotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgOCwgMTYpCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFCi0gICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyAxLCAyLCA0LCA4KQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUkdCCi0gICAgICAgICAgICAgICAgICAgICAgICAoYml0X2RlcHRocyA4LCAxNikKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQQotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF9kZXB0aHMgOCwgMTYpCi0KLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9NQVNLX1BBTEVUVEUKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9NQVNLX0NPTE9SCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19BTFBIQQotCi0gICAgaW50ZXJsYWNlX3R5cGUgLSAoUE5HX0lOVEVSTEFDRV9OT05FIG9yCi0gICAgICAgICAgICAgICAgICAgICBQTkdfSU5URVJMQUNFX0FEQU03KQotCi0gICAgY29tcHJlc3Npb25fdHlwZSAtIChtdXN0IGJlIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UKLSAgICAgICAgICAgICAgICAgICAgIGZvciBQTkcgMS4wKQotCi0gICAgZmlsdGVyX21ldGhvZCAgLSAobXVzdCBiZSBQTkdfRklMVEVSX1RZUEVfQkFTRQotICAgICAgICAgICAgICAgICAgICAgZm9yIFBORyAxLjAsIGFuZCBjYW4gYWxzbyBiZQotICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HIGlmCi0gICAgICAgICAgICAgICAgICAgICB0aGUgUE5HIGRhdGFzdHJlYW0gaXMgZW1iZWRkZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgIGEgTU5HLTEuMCBkYXRhc3RyZWFtKQotCi0gICAgQW55IG9yIGFsbCBvZiBpbnRlcmxhY2VfdHlwZSwgY29tcHJlc3Npb25fdHlwZSwgb3IKLSAgICBmaWx0ZXJfbWV0aG9kIGNhbiBiZSBOVUxMIGlmIHlvdSBhcmUKLSAgICBub3QgaW50ZXJlc3RlZCBpbiB0aGVpciB2YWx1ZXMuCi0KLSAgICBOb3RlIHRoYXQgcG5nX2dldF9JSERSKCkgcmV0dXJucyAzMi1iaXQgZGF0YSBpbnRvCi0gICAgdGhlIGFwcGxpY2F0aW9uJ3Mgd2lkdGggYW5kIGhlaWdodCB2YXJpYWJsZXMuCi0gICAgVGhpcyBpcyBhbiB1bnNhZmUgc2l0dWF0aW9uIGlmIHRoZXNlIGFyZSAxNi1iaXQKLSAgICB2YXJpYWJsZXMuICBJbiBzdWNoIHNpdHVhdGlvbnMsIHRoZQotICAgIHBuZ19nZXRfaW1hZ2Vfd2lkdGgoKSBhbmQgcG5nX2dldF9pbWFnZV9oZWlnaHQoKQotICAgIGZ1bmN0aW9ucyBkZXNjcmliZWQgYmVsb3cgYXJlIHNhZmVyLgotCi0gICAgd2lkdGggICAgICAgICAgICA9IHBuZ19nZXRfaW1hZ2Vfd2lkdGgocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7Ci0gICAgaGVpZ2h0ICAgICAgICAgICA9IHBuZ19nZXRfaW1hZ2VfaGVpZ2h0KHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOwotICAgIGJpdF9kZXB0aCAgICAgICAgPSBwbmdfZ2V0X2JpdF9kZXB0aChwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyKTsKLSAgICBjb2xvcl90eXBlICAgICAgID0gcG5nX2dldF9jb2xvcl90eXBlKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOwotICAgIGludGVybGFjZV90eXBlICAgPSBwbmdfZ2V0X2ludGVybGFjZV90eXBlKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOwotICAgIGNvbXByZXNzaW9uX3R5cGUgPSBwbmdfZ2V0X2NvbXByZXNzaW9uX3R5cGUocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7Ci0gICAgZmlsdGVyX21ldGhvZCAgICA9IHBuZ19nZXRfZmlsdGVyX3R5cGUocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7Ci0KLSAgICBjaGFubmVscyA9IHBuZ19nZXRfY2hhbm5lbHMocG5nX3B0ciwgaW5mb19wdHIpOwotICAgIGNoYW5uZWxzICAgICAgIC0gbnVtYmVyIG9mIGNoYW5uZWxzIG9mIGluZm8gZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgY29sb3IgdHlwZSAodmFsaWQgdmFsdWVzIGFyZSAxIChHUkFZLAotICAgICAgICAgICAgICAgICAgICAgUEFMRVRURSksIDIgKEdSQVlfQUxQSEEpLCAzIChSR0IpLAotICAgICAgICAgICAgICAgICAgICAgNCAoUkdCX0FMUEhBIG9yIFJHQiArIGZpbGxlciBieXRlKSkKLSAgICByb3dieXRlcyA9IHBuZ19nZXRfcm93Ynl0ZXMocG5nX3B0ciwgaW5mb19wdHIpOwotICAgIHJvd2J5dGVzICAgICAgIC0gbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBob2xkIGEgcm93Ci0KLSAgICBzaWduYXR1cmUgPSBwbmdfZ2V0X3NpZ25hdHVyZShwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICAgc2lnbmF0dXJlICAgICAgLSBob2xkcyB0aGUgc2lnbmF0dXJlIHJlYWQgZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGZpbGUgKGlmIGFueSkuICBUaGUgZGF0YSBpcyBrZXB0IGluCi0gICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBvZmZzZXQgaXQgd291bGQgYmUgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICB3aG9sZSBzaWduYXR1cmUgd2VyZSByZWFkIChpLmUuIGlmIGFuCi0gICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBoYWQgYWxyZWFkeSByZWFkIGluIDQKLSAgICAgICAgICAgICAgICAgICAgIGJ5dGVzIG9mIHNpZ25hdHVyZSBiZWZvcmUgc3RhcnRpbmcKLSAgICAgICAgICAgICAgICAgICAgIGxpYnBuZywgdGhlIHJlbWFpbmluZyA0IGJ5dGVzIHdvdWxkCi0gICAgICAgICAgICAgICAgICAgICBiZSBpbiBzaWduYXR1cmVbNF0gdGhyb3VnaCBzaWduYXR1cmVbN10KLSAgICAgICAgICAgICAgICAgICAgIChzZWUgcG5nX3NldF9zaWdfYnl0ZXMoKSkpLgotCi1UaGVzZSBhcmUgYWxzbyBpbXBvcnRhbnQsIGJ1dCB0aGVpciB2YWxpZGl0eSBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIGNodW5rCi1oYXMgYmVlbiByZWFkLiAgVGhlIHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPXzxjaHVuaz4pIGFuZAotcG5nX2dldF88Y2h1bms+KHBuZ19wdHIsIGluZm9fcHRyLCAuLi4pIGZ1bmN0aW9ucyByZXR1cm4gbm9uLXplcm8gaWYgdGhlCi1kYXRhIGhhcyBiZWVuIHJlYWQsIG9yIHplcm8gaWYgaXQgaXMgbWlzc2luZy4gIFRoZSBwYXJhbWV0ZXJzIHRvIHRoZQotcG5nX2dldF88Y2h1bms+IGFyZSBzZXQgZGlyZWN0bHkgaWYgdGhleSBhcmUgc2ltcGxlIGRhdGEgdHlwZXMsIG9yIGEKLXBvaW50ZXIgaW50byB0aGUgaW5mb19wdHIgaXMgcmV0dXJuZWQgZm9yIGFueSBjb21wbGV4IHR5cGVzLgotCi0gICAgcG5nX2dldF9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLCAmcGFsZXR0ZSwKLSAgICAgICAgICAgICAgICAgICAgICZudW1fcGFsZXR0ZSk7Ci0gICAgcGFsZXR0ZSAgICAgICAgLSB0aGUgcGFsZXR0ZSBmb3IgdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgIChhcnJheSBvZiBwbmdfY29sb3IpCi0gICAgbnVtX3BhbGV0dGUgICAgLSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcGFsZXR0ZQotCi0gICAgcG5nX2dldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCAmZ2FtbWEpOwotICAgIGdhbW1hICAgICAgICAgIC0gdGhlIGdhbW1hIHRoZSBmaWxlIGlzIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgIGF0IChQTkdfSU5GT19nQU1BKQotCi0gICAgcG5nX2dldF9zUkdCKHBuZ19wdHIsIGluZm9fcHRyLCAmc3JnYl9pbnRlbnQpOwotICAgIHNyZ2JfaW50ZW50ICAgIC0gdGhlIHJlbmRlcmluZyBpbnRlbnQgKFBOR19JTkZPX3NSR0IpCi0gICAgICAgICAgICAgICAgICAgICBUaGUgcHJlc2VuY2Ugb2YgdGhlIHNSR0IgY2h1bmsKLSAgICAgICAgICAgICAgICAgICAgIG1lYW5zIHRoYXQgdGhlIHBpeGVsIGRhdGEgaXMgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICBzUkdCIGNvbG9yIHNwYWNlLiAgVGhpcyBjaHVuayBhbHNvCi0gICAgICAgICAgICAgICAgICAgICBpbXBsaWVzIHNwZWNpZmljIHZhbHVlcyBvZiBnQU1BIGFuZAotICAgICAgICAgICAgICAgICAgICAgY0hSTS4KLQotICAgIHBuZ19nZXRfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgJm5hbWUsCi0gICAgICAgJmNvbXByZXNzaW9uX3R5cGUsICZwcm9maWxlLCAmcHJvZmxlbik7Ci0gICAgbmFtZSAgICAgICAgICAgICAtIFRoZSBwcm9maWxlIG5hbWUuCi0gICAgY29tcHJlc3Npb25fdHlwZSAtIFRoZSBjb21wcmVzc2lvbiB0eXBlOyBhbHdheXMKLSAgICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSBmb3IgUE5HIDEuMC4KLSAgICAgICAgICAgICAgICAgICAgICAgWW91IG1heSBnaXZlIE5VTEwgdG8gdGhpcyBhcmd1bWVudCB0bwotICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUgaXQuCi0gICAgcHJvZmlsZSAgICAgICAgICAtIEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bSBjb2xvcgotICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlIGRhdGEuIE1heSBjb250YWluIE5VTHMuCi0gICAgcHJvZmxlbiAgICAgICAgICAtIGxlbmd0aCBvZiBwcm9maWxlIGRhdGEgaW4gYnl0ZXMuCi0KLSAgICBwbmdfZ2V0X3NCSVQocG5nX3B0ciwgaW5mb19wdHIsICZzaWdfYml0KTsKLSAgICBzaWdfYml0ICAgICAgICAtIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYml0cyBmb3IKLSAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19zQklUKSBlYWNoIG9mIHRoZSBncmF5LAotICAgICAgICAgICAgICAgICAgICAgcmVkLCBncmVlbiwgYW5kIGJsdWUgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICB3aGljaGV2ZXIgYXJlIGFwcHJvcHJpYXRlIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGdpdmVuIGNvbG9yIHR5cGUgKHBuZ19jb2xvcl8xNikKLQotICAgIHBuZ19nZXRfdFJOUyhwbmdfcHRyLCBpbmZvX3B0ciwgJnRyYW5zX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgJm51bV90cmFucywgJnRyYW5zX2NvbG9yKTsKLSAgICB0cmFuc19hbHBoYSAgICAtIGFycmF5IG9mIGFscGhhICh0cmFuc3BhcmVuY3kpCi0gICAgICAgICAgICAgICAgICAgICBlbnRyaWVzIGZvciBwYWxldHRlIChQTkdfSU5GT190Uk5TKQotICAgIG51bV90cmFucyAgICAgIC0gbnVtYmVyIG9mIHRyYW5zcGFyZW50IGVudHJpZXMKLSAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT190Uk5TKQotICAgIHRyYW5zX2NvbG9yICAgIC0gZ3JheWxldmVsIG9yIGNvbG9yIHNhbXBsZSB2YWx1ZXMgb2YKLSAgICAgICAgICAgICAgICAgICAgIHRoZSBzaW5nbGUgdHJhbnNwYXJlbnQgY29sb3IgZm9yCi0gICAgICAgICAgICAgICAgICAgICBub24tcGFsZXR0ZWQgaW1hZ2VzIChQTkdfSU5GT190Uk5TKQotCi0gICAgcG5nX2dldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCAmaGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9faElTVCkKLSAgICBoaXN0ICAgICAgICAgICAtIGhpc3RvZ3JhbSBvZiBwYWxldHRlIChhcnJheSBvZgotICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYpCi0KLSAgICBwbmdfZ2V0X3RJTUUocG5nX3B0ciwgaW5mb19wdHIsICZtb2RfdGltZSk7Ci0gICAgbW9kX3RpbWUgICAgICAgLSB0aW1lIGltYWdlIHdhcyBsYXN0IG1vZGlmaWVkCi0gICAgICAgICAgICAgICAgICAgIChQTkdfVkFMSURfdElNRSkKLQotICAgIHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmJhY2tncm91bmQpOwotICAgIGJhY2tncm91bmQgICAgIC0gYmFja2dyb3VuZCBjb2xvciAob2YgdHlwZQotICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbG9yXzE2cCkgKFBOR19WQUxJRF9iS0dEKQotICAgICAgICAgICAgICAgICAgICAgdmFsaWQgMTYtYml0IHJlZCwgZ3JlZW4gYW5kIGJsdWUKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgcmVnYXJkbGVzcyBvZiBjb2xvcl90eXBlCi0KLSAgICBudW1fY29tbWVudHMgICA9IHBuZ19nZXRfdGV4dChwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICZ0ZXh0X3B0ciwgJm51bV90ZXh0KTsKLSAgICBudW1fY29tbWVudHMgICAtIG51bWJlciBvZiBjb21tZW50cwotICAgIHRleHRfcHRyICAgICAgIC0gYXJyYXkgb2YgcG5nX3RleHQgaG9sZGluZyBpbWFnZQotICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMKLSAgICB0ZXh0X3B0cltpXS5jb21wcmVzc2lvbiAtIHR5cGUgb2YgY29tcHJlc3Npb24gdXNlZAotICAgICAgICAgICAgICAgICBvbiAidGV4dCIgUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0lUWFRfQ09NUFJFU1NJT05felRYdAotICAgIHRleHRfcHRyW2ldLmtleSAgIC0ga2V5d29yZCBmb3IgY29tbWVudC4gIE11c3QgY29udGFpbgotICAgICAgICAgICAgICAgICAgICAgICAgIDEtNzkgY2hhcmFjdGVycy4KLSAgICB0ZXh0X3B0cltpXS50ZXh0ICAtIHRleHQgY29tbWVudHMgZm9yIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkLiAgQ2FuIGJlIGVtcHR5LgotICAgIHRleHRfcHRyW2ldLnRleHRfbGVuZ3RoIC0gbGVuZ3RoIG9mIHRleHQgc3RyaW5nLAotICAgICAgICAgICAgICAgICBhZnRlciBkZWNvbXByZXNzaW9uLCAwIGZvciBpVFh0Ci0gICAgdGV4dF9wdHJbaV0uaXR4dF9sZW5ndGggLSBsZW5ndGggb2YgaXR4dCBzdHJpbmcsCi0gICAgICAgICAgICAgICAgIGFmdGVyIGRlY29tcHJlc3Npb24sIDAgZm9yIHRFWHQvelRYdAotICAgIHRleHRfcHRyW2ldLmxhbmcgIC0gbGFuZ3VhZ2Ugb2YgY29tbWVudCAoZW1wdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZm9yIHVua25vd24pLgotICAgIHRleHRfcHRyW2ldLmxhbmdfa2V5ICAtIGtleXdvcmQgaW4gVVRGLTgKLSAgICAgICAgICAgICAgICAgICAgICAgICAoZW1wdHkgc3RyaW5nIGZvciB1bmtub3duKS4KLSAgICBOb3RlIHRoYXQgdGhlIGl0eHRfbGVuZ3RoLCBsYW5nLCBhbmQgbGFuZ19rZXkKLSAgICBtZW1iZXJzIG9mIHRoZSB0ZXh0X3B0ciBzdHJ1Y3R1cmUgb25seSBleGlzdAotICAgIHdoZW4gdGhlIGxpYnJhcnkgaXMgYnVpbHQgd2l0aCBpVFh0IGNodW5rIHN1cHBvcnQuCi0KLSAgICBudW1fdGV4dCAgICAgICAtIG51bWJlciBvZiBjb21tZW50cyAoc2FtZSBhcwotICAgICAgICAgICAgICAgICAgICAgbnVtX2NvbW1lbnRzOyB5b3UgY2FuIHB1dCBOVUxMIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSBkdXBsaWNhdGlvbikKLSAgICBOb3RlIHdoaWxlIHBuZ19zZXRfdGV4dCgpIHdpbGwgYWNjZXB0IHRleHQsIGxhbmd1YWdlLAotICAgIGFuZCB0cmFuc2xhdGVkIGtleXdvcmRzIHRoYXQgY2FuIGJlIE5VTEwgcG9pbnRlcnMsIHRoZQotICAgIHN0cnVjdHVyZSByZXR1cm5lZCBieSBwbmdfZ2V0X3RleHQgd2lsbCBhbHdheXMgY29udGFpbgotICAgIHJlZ3VsYXIgemVyby10ZXJtaW5hdGVkIEMgc3RyaW5ncy4gIFRoZXkgbWlnaHQgYmUKLSAgICBlbXB0eSBzdHJpbmdzIGJ1dCB0aGV5IHdpbGwgbmV2ZXIgYmUgTlVMTCBwb2ludGVycy4KLQotICAgIG51bV9zcGFsZXR0ZXMgPSBwbmdfZ2V0X3NQTFQocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgJnBhbGV0dGVfcHRyKTsKLSAgICBwYWxldHRlX3B0ciAgICAtIGFycmF5IG9mIHBhbGV0dGUgc3RydWN0dXJlcyBob2xkaW5nCi0gICAgICAgICAgICAgICAgICAgICBjb250ZW50cyBvZiBvbmUgb3IgbW9yZSBzUExUIGNodW5rcwotICAgICAgICAgICAgICAgICAgICAgcmVhZC4KLSAgICBudW1fc3BhbGV0dGVzICAtIG51bWJlciBvZiBzUExUIGNodW5rcyByZWFkLgotCi0gICAgcG5nX2dldF9vRkZzKHBuZ19wdHIsIGluZm9fcHRyLCAmb2Zmc2V0X3gsICZvZmZzZXRfeSwKLSAgICAgICAmdW5pdF90eXBlKTsKLSAgICBvZmZzZXRfeCAgICAgICAtIHBvc2l0aXZlIG9mZnNldCBmcm9tIHRoZSBsZWZ0IGVkZ2UKLSAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzY3JlZW4KLSAgICBvZmZzZXRfeSAgICAgICAtIHBvc2l0aXZlIG9mZnNldCBmcm9tIHRoZSB0b3AgZWRnZQotICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHNjcmVlbgotICAgIHVuaXRfdHlwZSAgICAgIC0gUE5HX09GRlNFVF9QSVhFTCwgUE5HX09GRlNFVF9NSUNST01FVEVSCi0KLSAgICBwbmdfZ2V0X3BIWXMocG5nX3B0ciwgaW5mb19wdHIsICZyZXNfeCwgJnJlc195LAotICAgICAgICZ1bml0X3R5cGUpOwotICAgIHJlc194ICAgICAgICAgIC0gcGl4ZWxzL3VuaXQgcGh5c2ljYWwgcmVzb2x1dGlvbiBpbgotICAgICAgICAgICAgICAgICAgICAgeCBkaXJlY3Rpb24KLSAgICByZXNfeSAgICAgICAgICAtIHBpeGVscy91bml0IHBoeXNpY2FsIHJlc29sdXRpb24gaW4KLSAgICAgICAgICAgICAgICAgICAgIHggZGlyZWN0aW9uCi0gICAgdW5pdF90eXBlICAgICAgLSBQTkdfUkVTT0xVVElPTl9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgUE5HX1JFU09MVVRJT05fTUVURVIKLQotICAgIHBuZ19nZXRfc0NBTChwbmdfcHRyLCBpbmZvX3B0ciwgJnVuaXQsICZ3aWR0aCwKLSAgICAgICAmaGVpZ2h0KQotICAgIHVuaXQgICAgICAgIC0gcGh5c2ljYWwgc2NhbGUgdW5pdHMgKGFuIGludGVnZXIpCi0gICAgd2lkdGggICAgICAgLSB3aWR0aCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCi0gICAgaGVpZ2h0ICAgICAgLSBoZWlnaHQgb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cwotICAgICAgICAgICAgICAgICAod2lkdGggYW5kIGhlaWdodCBhcmUgZG91YmxlcykKLQotICAgIHBuZ19nZXRfc0NBTF9zKHBuZ19wdHIsIGluZm9fcHRyLCAmdW5pdCwgJndpZHRoLAotICAgICAgICZoZWlnaHQpCi0gICAgdW5pdCAgICAgICAgLSBwaHlzaWNhbCBzY2FsZSB1bml0cyAoYW4gaW50ZWdlcikKLSAgICB3aWR0aCAgICAgICAtIHdpZHRoIG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLSAgICBoZWlnaHQgICAgICAtIGhlaWdodCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCi0gICAgICAgICAgICAgICAgICh3aWR0aCBhbmQgaGVpZ2h0IGFyZSBzdHJpbmdzIGxpa2UgIjIuNTQiKQotCi0gICAgbnVtX3Vua25vd25fY2h1bmtzID0gcG5nX2dldF91bmtub3duX2NodW5rcyhwbmdfcHRyLAotICAgICAgIGluZm9fcHRyLCAmdW5rbm93bnMpCi0gICAgdW5rbm93bnMgICAgICAgICAgLSBhcnJheSBvZiBwbmdfdW5rbm93bl9jaHVuawotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlcyBob2xkaW5nIHVua25vd24gY2h1bmtzCi0gICAgdW5rbm93bnNbaV0ubmFtZSAgLSBuYW1lIG9mIHVua25vd24gY2h1bmsKLSAgICB1bmtub3duc1tpXS5kYXRhICAtIGRhdGEgb2YgdW5rbm93biBjaHVuawotICAgIHVua25vd25zW2ldLnNpemUgIC0gc2l6ZSBvZiB1bmtub3duIGNodW5rJ3MgZGF0YQotICAgIHVua25vd25zW2ldLmxvY2F0aW9uIC0gcG9zaXRpb24gb2YgY2h1bmsgaW4gZmlsZQotCi0gICAgVGhlIHZhbHVlIG9mICJpIiBjb3JyZXNwb25kcyB0byB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlCi0gICAgY2h1bmtzIHdlcmUgcmVhZCBmcm9tIHRoZSBQTkcgZmlsZSBvciBpbnNlcnRlZCB3aXRoIHRoZQotICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3MoKSBmdW5jdGlvbi4KLQotVGhlIGRhdGEgZnJvbSB0aGUgcEhZcyBjaHVuayBjYW4gYmUgcmV0cmlldmVkIGluIHNldmVyYWwgY29udmVuaWVudAotZm9ybXM6Ci0KLSAgICByZXNfeCA9IHBuZ19nZXRfeF9waXhlbHNfcGVyX21ldGVyKHBuZ19wdHIsCi0gICAgICAgaW5mb19wdHIpCi0gICAgcmVzX3kgPSBwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLAotICAgICAgIGluZm9fcHRyKQotICAgIHJlc194X2FuZF95ID0gcG5nX2dldF9waXhlbHNfcGVyX21ldGVyKHBuZ19wdHIsCi0gICAgICAgaW5mb19wdHIpCi0gICAgcmVzX3ggPSBwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9pbmNoKHBuZ19wdHIsCi0gICAgICAgaW5mb19wdHIpCi0gICAgcmVzX3kgPSBwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9pbmNoKHBuZ19wdHIsCi0gICAgICAgaW5mb19wdHIpCi0gICAgcmVzX3hfYW5kX3kgPSBwbmdfZ2V0X3BpeGVsc19wZXJfaW5jaChwbmdfcHRyLAotICAgICAgIGluZm9fcHRyKQotICAgIGFzcGVjdF9yYXRpbyA9IHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvKHBuZ19wdHIsCi0gICAgICAgaW5mb19wdHIpCi0KLSAgIChFYWNoIG9mIHRoZXNlIHJldHVybnMgMCBbc2lnbmlmeWluZyAidW5rbm93biJdIGlmCi0gICAgICAgdGhlIGRhdGEgaXMgbm90IHByZXNlbnQgb3IgaWYgcmVzX3ggaXMgMDsKLSAgICAgICByZXNfeF9hbmRfeSBpcyAwIGlmIHJlc194ICE9IHJlc195KQotCi1UaGUgZGF0YSBmcm9tIHRoZSBvRkZzIGNodW5rIGNhbiBiZSByZXRyaWV2ZWQgaW4gc2V2ZXJhbCBjb252ZW5pZW50Ci1mb3JtczoKLQotICAgIHhfb2Zmc2V0ID0gcG5nX2dldF94X29mZnNldF9taWNyb25zKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICB5X29mZnNldCA9IHBuZ19nZXRfeV9vZmZzZXRfbWljcm9ucyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICAgeF9vZmZzZXQgPSBwbmdfZ2V0X3hfb2Zmc2V0X2luY2hlcyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICAgeV9vZmZzZXQgPSBwbmdfZ2V0X3lfb2Zmc2V0X2luY2hlcyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgIChFYWNoIG9mIHRoZXNlIHJldHVybnMgMCBbc2lnbmlmeWluZyAidW5rbm93biIgaWYgYm90aAotICAgICAgIHggYW5kIHkgYXJlIDBdIGlmIHRoZSBkYXRhIGlzIG5vdCBwcmVzZW50IG9yIGlmIHRoZQotICAgICAgIGNodW5rIGlzIHByZXNlbnQgYnV0IHRoZSB1bml0IGlzIHRoZSBwaXhlbCkKLQotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgcG5nX2luZm8gZGVmaW5pdGlvbiBpbiBwbmcuaCBhbmQgdGhlCi1QTkcgc3BlY2lmaWNhdGlvbiBmb3IgY2h1bmsgY29udGVudHMuICBCZSBjYXJlZnVsIHdpdGggdHJ1c3RpbmcKLXJvd2J5dGVzLCBhcyBzb21lIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbnMgY291bGQgaW5jcmVhc2UgdGhlIHNwYWNlCi1uZWVkZWQgdG8gaG9sZCBhIHJvdyAoZXhwYW5kLCBmaWxsZXIsIGdyYXlfdG9fcmdiLCBldGMuKS4KLVNlZSBwbmdfcmVhZF91cGRhdGVfaW5mbygpLCBiZWxvdy4KLQotQSBxdWljayB3b3JkIGFib3V0IHRleHRfcHRyIGFuZCBudW1fdGV4dC4gIFBORyBzdG9yZXMgY29tbWVudHMgaW4KLWtleXdvcmQvdGV4dCBwYWlycywgb25lIHBhaXIgcGVyIGNodW5rLCB3aXRoIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIKLW9mIHRleHQgY2h1bmtzLCBhbmQgYSAyXjMxIGJ5dGUgbGltaXQgb24gdGhlaXIgc2l6ZS4gIFdoaWxlIHRoZXJlIGFyZQotc3VnZ2VzdGVkIGtleXdvcmRzLCB0aGVyZSBpcyBubyByZXF1aXJlbWVudCB0byByZXN0cmljdCB0aGUgdXNlIHRvIHRoZXNlCi1zdHJpbmdzLiAgSXQgaXMgc3Ryb25nbHkgc3VnZ2VzdGVkIHRoYXQga2V5d29yZHMgYW5kIHRleHQgYmUgc2Vuc2libGUKLXRvIGh1bWFucyAodGhhdCdzIHRoZSBwb2ludCksIHNvIGRvbid0IHVzZSBhYmJyZXZpYXRpb25zLiAgTm9uLXByaW50aW5nCi1zeW1ib2xzIGFyZSBub3QgYWxsb3dlZC4gIFNlZSB0aGUgUE5HIHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4KLVRoZXJlIGlzIGFsc28gbm8gcmVxdWlyZW1lbnQgdG8gaGF2ZSB0ZXh0IGFmdGVyIHRoZSBrZXl3b3JkLgotCi1LZXl3b3JkcyBzaG91bGQgYmUgbGltaXRlZCB0byA3OSBMYXRpbi0xIGNoYXJhY3RlcnMgd2l0aG91dCBsZWFkaW5nIG9yCi10cmFpbGluZyBzcGFjZXMsIGJ1dCBub24tY29uc2VjdXRpdmUgc3BhY2VzIGFyZSBhbGxvd2VkIHdpdGhpbiB0aGUKLWtleXdvcmQuICBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIHRoZSBzYW1lIGtleXdvcmQgYW55IG51bWJlciBvZiB0aW1lcy4KLVRoZSB0ZXh0X3B0ciBpcyBhbiBhcnJheSBvZiBwbmdfdGV4dCBzdHJ1Y3R1cmVzLCBlYWNoIGhvbGRpbmcgYQotcG9pbnRlciB0byBhIGxhbmd1YWdlIHN0cmluZywgYSBwb2ludGVyIHRvIGEga2V5d29yZCBhbmQgYSBwb2ludGVyIHRvCi1hIHRleHQgc3RyaW5nLiAgVGhlIHRleHQgc3RyaW5nLCBsYW5ndWFnZSBjb2RlLCBhbmQgdHJhbnNsYXRlZAota2V5d29yZCBtYXkgYmUgZW1wdHkgb3IgTlVMTCBwb2ludGVycy4gIFRoZSBrZXl3b3JkL3RleHQKLXBhaXJzIGFyZSBwdXQgaW50byB0aGUgYXJyYXkgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSBhcmUgcmVjZWl2ZWQuCi1Ib3dldmVyLCBzb21lIG9yIGFsbCBvZiB0aGUgdGV4dCBjaHVua3MgbWF5IGJlIGFmdGVyIHRoZSBpbWFnZSwgc28sIHRvCi1tYWtlIHN1cmUgeW91IGhhdmUgcmVhZCBhbGwgdGhlIHRleHQgY2h1bmtzLCBkb24ndCBtZXNzIHdpdGggdGhlc2UKLXVudGlsIGFmdGVyIHlvdSByZWFkIHRoZSBzdHVmZiBhZnRlciB0aGUgaW1hZ2UuICBUaGlzIHdpbGwgYmUKLW1lbnRpb25lZCBhZ2FpbiBiZWxvdyBpbiB0aGUgZGlzY3Vzc2lvbiB0aGF0IGdvZXMgd2l0aCBwbmdfcmVhZF9lbmQoKS4KLQotSW5wdXQgdHJhbnNmb3JtYXRpb25zCi0KLUFmdGVyIHlvdSd2ZSByZWFkIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24sIHlvdSBjYW4gc2V0IHVwIHRoZSBsaWJyYXJ5Ci10byBoYW5kbGUgYW55IHNwZWNpYWwgdHJhbnNmb3JtYXRpb25zIG9mIHRoZSBpbWFnZSBkYXRhLiAgVGhlIHZhcmlvdXMKLXdheXMgdG8gdHJhbnNmb3JtIHRoZSBkYXRhIHdpbGwgYmUgZGVzY3JpYmVkIGluIHRoZSBvcmRlciB0aGF0IHRoZXkKLXNob3VsZCBvY2N1ci4gIFRoaXMgaXMgaW1wb3J0YW50LCBhcyBzb21lIG9mIHRoZXNlIGNoYW5nZSB0aGUgY29sb3IKLXR5cGUgYW5kL29yIGJpdCBkZXB0aCBvZiB0aGUgZGF0YSwgYW5kIHNvbWUgb3RoZXJzIG9ubHkgd29yayBvbgotY2VydGFpbiBjb2xvciB0eXBlcyBhbmQgYml0IGRlcHRocy4gIEV2ZW4gdGhvdWdoIGVhY2ggdHJhbnNmb3JtYXRpb24KLWNoZWNrcyB0byBzZWUgaWYgaXQgaGFzIGRhdGEgdGhhdCBpdCBjYW4gZG8gc29tZXRoaW5nIHdpdGgsIHlvdSBzaG91bGQKLW1ha2Ugc3VyZSB0byBvbmx5IGVuYWJsZSBhIHRyYW5zZm9ybWF0aW9uIGlmIGl0IHdpbGwgYmUgdmFsaWQgZm9yIHRoZQotZGF0YS4gIEZvciBleGFtcGxlLCBkb24ndCBzd2FwIHJlZCBhbmQgYmx1ZSBvbiBncmF5c2NhbGUgZGF0YS4KLQotVGhlIGNvbG9ycyB1c2VkIGZvciB0aGUgYmFja2dyb3VuZCBhbmQgdHJhbnNwYXJlbmN5IHZhbHVlcyBzaG91bGQgYmUKLXN1cHBsaWVkIGluIHRoZSBzYW1lIGZvcm1hdC9kZXB0aCBhcyB0aGUgY3VycmVudCBpbWFnZSBkYXRhLiAgVGhleQotYXJlIHN0b3JlZCBpbiB0aGUgc2FtZSBmb3JtYXQvZGVwdGggYXMgdGhlIGltYWdlIGRhdGEgaW4gYSBiS0dEIG9yIHRSTlMKLWNodW5rLCBzbyB0aGlzIGlzIHdoYXQgbGlicG5nIGV4cGVjdHMgZm9yIHRoaXMgZGF0YS4gIFRoZSBjb2xvcnMgYXJlCi10cmFuc2Zvcm1lZCB0byBrZWVwIGluIHN5bmMgd2l0aCB0aGUgaW1hZ2UgZGF0YSB3aGVuIGFuIGFwcGxpY2F0aW9uCi1jYWxscyB0aGUgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSByb3V0aW5lIChzZWUgYmVsb3cpLgotCi1EYXRhIHdpbGwgYmUgZGVjb2RlZCBpbnRvIHRoZSBzdXBwbGllZCByb3cgYnVmZmVycyBwYWNrZWQgaW50byBieXRlcwotdW5sZXNzIHRoZSBsaWJyYXJ5IGhhcyBiZWVuIHRvbGQgdG8gdHJhbnNmb3JtIGl0IGludG8gYW5vdGhlciBmb3JtYXQuCi1Gb3IgZXhhbXBsZSwgNCBiaXQvcGl4ZWwgcGFsZXR0ZWQgb3IgZ3JheXNjYWxlIGRhdGEgd2lsbCBiZSByZXR1cm5lZAotMiBwaXhlbHMvYnl0ZSB3aXRoIHRoZSBsZWZ0bW9zdCBwaXhlbCBpbiB0aGUgaGlnaC1vcmRlciBiaXRzIG9mIHRoZQotYnl0ZSwgdW5sZXNzIHBuZ19zZXRfcGFja2luZygpIGlzIGNhbGxlZC4gIDgtYml0IFJHQiBkYXRhIHdpbGwgYmUgc3RvcmVkCi1pbiBSR0IgUkdCIFJHQiBmb3JtYXQgdW5sZXNzIHBuZ19zZXRfZmlsbGVyKCkgb3IgcG5nX3NldF9hZGRfYWxwaGEoKQotaXMgY2FsbGVkIHRvIGluc2VydCBmaWxsZXIgYnl0ZXMsIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgZWFjaCBSR0IgdHJpcGxldC4KLTE2LWJpdCBSR0IgZGF0YSB3aWxsIGJlIHJldHVybmVkIFJSR0dCQiBSUkdHQkIsIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQKLWJ5dGUgb2YgdGhlIGNvbG9yIHZhbHVlIGZpcnN0LCB1bmxlc3MgcG5nX3NldF9zdHJpcF8xNigpIGlzIGNhbGxlZCB0bwotdHJhbnNmb3JtIGl0IHRvIHJlZ3VsYXIgUkdCIFJHQiB0cmlwbGV0cywgb3IgcG5nX3NldF9maWxsZXIoKSBvcgotcG5nX3NldF9hZGQgYWxwaGEoKSBpcyBjYWxsZWQgdG8gaW5zZXJ0IGZpbGxlciBieXRlcywgZWl0aGVyIGJlZm9yZSBvcgotYWZ0ZXIgZWFjaCBSUkdHQkIgdHJpcGxldC4gIFNpbWlsYXJseSwgOC1iaXQgb3IgMTYtYml0IGdyYXlzY2FsZSBkYXRhIGNhbgotYmUgbW9kaWZpZWQgd2l0aAotcG5nX3NldF9maWxsZXIoKSwgcG5nX3NldF9hZGRfYWxwaGEoKSwgb3IgcG5nX3NldF9zdHJpcF8xNigpLgotCi1UaGUgZm9sbG93aW5nIGNvZGUgdHJhbnNmb3JtcyBncmF5c2NhbGUgaW1hZ2VzIG9mIGxlc3MgdGhhbiA4IHRvIDggYml0cywKLWNoYW5nZXMgcGFsZXR0ZWQgaW1hZ2VzIHRvIFJHQiwgYW5kIGFkZHMgYSBmdWxsIGFscGhhIGNoYW5uZWwgaWYgdGhlcmUgaXMKLXRyYW5zcGFyZW5jeSBpbmZvcm1hdGlvbiBpbiBhIHRSTlMgY2h1bmsuICBUaGlzIGlzIG1vc3QgdXNlZnVsIG9uCi1ncmF5c2NhbGUgaW1hZ2VzIHdpdGggYml0IGRlcHRocyBvZiAyIG9yIDQgb3IgaWYgdGhlcmUgaXMgYSBtdWx0aXBsZS1pbWFnZQotdmlld2luZyBhcHBsaWNhdGlvbiB0aGF0IHdpc2hlcyB0byB0cmVhdCBhbGwgaW1hZ2VzIGluIHRoZSBzYW1lIHdheS4KLQotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICAgIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IocG5nX3B0cik7Ci0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmCi0gICAgICAgIGJpdF9kZXB0aCA8IDgpIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOChwbmdfcHRyKTsKLQotICAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgICBQTkdfSU5GT190Uk5TKSkgcG5nX3NldF90Uk5TX3RvX2FscGhhKHBuZ19wdHIpOwotCi1UaGVzZSB0aHJlZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IGFsaWFzZXMgZm9yIHBuZ19zZXRfZXhwYW5kKCksIGFkZGVkCi1pbiBsaWJwbmcgdmVyc2lvbiAxLjAuNCwgd2l0aCB0aGUgZnVuY3Rpb24gbmFtZXMgZXhwYW5kZWQgdG8gaW1wcm92ZSBjb2RlCi1yZWFkYWJpbGl0eS4gIEluIHNvbWUgZnV0dXJlIHZlcnNpb24gdGhleSBtYXkgYWN0dWFsbHkgZG8gZGlmZmVyZW50Ci10aGluZ3MuCi0KLUFzIG9mIGxpYnBuZyB2ZXJzaW9uIDEuMi45LCBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKSB3YXMKLWFkZGVkLiAgSXQgZXhwYW5kcyB0aGUgc2FtcGxlIGRlcHRoIHdpdGhvdXQgY2hhbmdpbmcgdFJOUyB0byBhbHBoYS4KLQotQXMgb2YgbGlicG5nIHZlcnNpb24gMS40LjEyLCBub3QgYWxsIHBvc3NpYmxlIGV4cGFuc2lvbnMgYXJlIHN1cHBvcnRlZC4KLQotSW4gdGhlIGZvbGxvd2luZyB0YWJsZSwgdGhlIDAxIG1lYW5zIGdyYXlzY2FsZSB3aXRoIGRlcHRoPDgsIDMxIG1lYW5zCi1pbmRleGVkIHdpdGggZGVwdGg8OCwgb3RoZXIgbnVtZXJhbHMgcmVwcmVzZW50IHRoZSBjb2xvciB0eXBlLCAiVCIgbWVhbnMKLXRoZSB0Uk5TIGNodW5rIGlzIHByZXNlbnQsIEEgbWVhbnMgYW4gYWxwaGEgY2hhbm5lbCBpcyBwcmVzZW50LCBhbmQgTwotbWVhbnMgdFJOUyBvciBhbHBoYSBpcyBwcmVzZW50IGJ1dCBhbGwgcGl4ZWxzIGluIHRoZSBpbWFnZSBhcmUgb3BhcXVlLgotCi0gIEZST00gIDAxICAzMSAgIDAgIDBUICAwTyAgIDIgIDJUICAyTyAgIDMgIDNUICAzTyAgNEEgIDRPICA2QSAgNk8gCi0gICBUTwotICAgMDEgICAgLSAgICAgICAgICAgICAgICAgICAKLSAgIDMxICAgICAgICAtCi0gICAgMCAgICAxICAgICAgIC0gICAgICAgICAgIAotICAgMFQgICAgICAgICAgICAgICAgLQotICAgME8gICAgICAgICAgICAgICAgICAgIC0KLSAgICAyICAgICAgICAgICBHWCAgICAgICAgICAgLQotICAgMlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQotICAgMk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KLSAgICAzICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgLQotICAgM1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQotICAgM08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KLSAgIDRBICAgICAgICAgICAgICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQotICAgNE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQotICAgNkEgICAgICAgICAgICAgICBHWCAgICAgICAgIFRYICAgICAgICAgICBUWCAgICAgICAgICAgICAgIC0KLSAgIDZPICAgICAgICAgICAgICAgICAgIEdYICAgICAgICAgICAgICAgICAgICAgIFRYICAgICAgICAgICAgICAgLQotCi1XaXRoaW4gdGhlIG1hdHJpeCwKLSAgICAgIi0iIG1lYW5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAiWCIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5IHBuZ19zZXRfZXhwYW5kKCkuCi0gICAgICIxIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkKLSAgICAgICAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOAotICAgICAiRyIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5Ci0gICAgICAgICBwbmdfc2V0X2dyYXlfdG9fcmdiKCkuCi0gICAgICJQIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkKLSAgICAgICAgIHBuZ19zZXRfZXhwYW5kX3BhbGV0dGVfdG9fcmdiKCkuCi0gICAgICJUIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkKLSAgICAgICAgIHBuZ19zZXRfdFJOU190b19hbHBoYSgpLgotCi1QTkcgY2FuIGhhdmUgZmlsZXMgd2l0aCAxNiBiaXRzIHBlciBjaGFubmVsLiAgSWYgeW91IG9ubHkgY2FuIGhhbmRsZQotOCBiaXRzIHBlciBjaGFubmVsLCB0aGlzIHdpbGwgc3RyaXAgdGhlIHBpeGVscyBkb3duIHRvIDggYml0LgotCi0gICAgaWYgKGJpdF9kZXB0aCA9PSAxNikKLSAgICAgICAgcG5nX3NldF9zdHJpcF8xNihwbmdfcHRyKTsKLQotSWYsIGZvciBzb21lIHJlYXNvbiwgeW91IGRvbid0IG5lZWQgdGhlIGFscGhhIGNoYW5uZWwgb24gYW4gaW1hZ2UsCi1hbmQgeW91IHdhbnQgdG8gcmVtb3ZlIGl0IHJhdGhlciB0aGFuIGNvbWJpbmluZyBpdCB3aXRoIHRoZSBiYWNrZ3JvdW5kCi0oYnV0IHRoZSBpbWFnZSBhdXRob3IgY2VydGFpbmx5IGhhZCBpbiBtaW5kIHRoYXQgeW91ICp3b3VsZCogY29tYmluZQotaXQgd2l0aCB0aGUgYmFja2dyb3VuZCwgc28gdGhhdCdzIHdoYXQgeW91IHNob3VsZCBwcm9iYWJseSBkbyk6Ci0KLSAgICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQotICAgICAgICBwbmdfc2V0X3N0cmlwX2FscGhhKHBuZ19wdHIpOwotCi1JbiBQTkcgZmlsZXMsIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlCi1pcyB0aGUgbGV2ZWwgb2Ygb3BhY2l0eS4gIElmIHlvdSBuZWVkIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlIHRvCi1iZSB0aGUgbGV2ZWwgb2YgdHJhbnNwYXJlbmN5IGluc3RlYWQgb2Ygb3BhY2l0eSwgeW91IGNhbiBpbnZlcnQgdGhlCi1hbHBoYSBjaGFubmVsIChvciB0aGUgdFJOUyBjaHVuayBkYXRhKSBhZnRlciBpdCdzIHJlYWQsIHNvIHRoYXQgMCBpcwotZnVsbHkgb3BhcXVlIGFuZCAyNTUgKGluIDgtYml0IG9yIHBhbGV0dGVkIGltYWdlcykgb3IgNjU1MzUgKGluIDE2LWJpdAotaW1hZ2VzKSBpcyBmdWxseSB0cmFuc3BhcmVudCwgd2l0aAotCi0gICAgcG5nX3NldF9pbnZlcnRfYWxwaGEocG5nX3B0cik7Ci0KLVBORyBmaWxlcyBwYWNrIHBpeGVscyBvZiBiaXQgZGVwdGhzIDEsIDIsIGFuZCA0IGludG8gYnl0ZXMgYXMgc21hbGwgYXMKLXRoZXkgY2FuLCByZXN1bHRpbmcgaW4sIGZvciBleGFtcGxlLCA4IHBpeGVscyBwZXIgYnl0ZSBmb3IgMSBiaXQKLWZpbGVzLiAgVGhpcyBjb2RlIGV4cGFuZHMgdG8gMSBwaXhlbCBwZXIgYnl0ZSB3aXRob3V0IGNoYW5naW5nIHRoZQotdmFsdWVzIG9mIHRoZSBwaXhlbHM6Ci0KLSAgICBpZiAoYml0X2RlcHRoIDwgOCkKLSAgICAgICAgcG5nX3NldF9wYWNraW5nKHBuZ19wdHIpOwotCi1QTkcgZmlsZXMgaGF2ZSBwb3NzaWJsZSBiaXQgZGVwdGhzIG9mIDEsIDIsIDQsIDgsIGFuZCAxNi4gIEFsbCBwaXhlbHMKLXN0b3JlZCBpbiBhIFBORyBpbWFnZSBoYXZlIGJlZW4gInNjYWxlZCIgb3IgInNoaWZ0ZWQiIHVwIHRvIHRoZSBuZXh0Ci1oaWdoZXIgcG9zc2libGUgYml0IGRlcHRoIChlLmcuIGZyb20gNSBiaXRzL3NhbXBsZSBpbiB0aGUgcmFuZ2UgWzAsMzFdCi10byA4IGJpdHMvc2FtcGxlIGluIHRoZSByYW5nZSBbMCwgMjU1XSkuICBIb3dldmVyLCBpdCBpcyBhbHNvIHBvc3NpYmxlCi10byBjb252ZXJ0IHRoZSBQTkcgcGl4ZWwgZGF0YSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBiaXQgZGVwdGggb2YgdGhlCi1pbWFnZS4gIFRoaXMgY2FsbCByZWR1Y2VzIHRoZSBwaXhlbHMgYmFjayBkb3duIHRvIHRoZSBvcmlnaW5hbCBiaXQgZGVwdGg6Ci0KLSAgICBwbmdfY29sb3JfOHAgc2lnX2JpdDsKLQotICAgIGlmIChwbmdfZ2V0X3NCSVQocG5nX3B0ciwgaW5mb19wdHIsICZzaWdfYml0KSkKLSAgICAgICAgcG5nX3NldF9zaGlmdChwbmdfcHRyLCBzaWdfYml0KTsKLQotUE5HIGZpbGVzIHN0b3JlIDMtY29sb3IgcGl4ZWxzIGluIHJlZCwgZ3JlZW4sIGJsdWUgb3JkZXIuICBUaGlzIGNvZGUKLWNoYW5nZXMgdGhlIHN0b3JhZ2Ugb2YgdGhlIHBpeGVscyB0byBibHVlLCBncmVlbiwgcmVkOgotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8Ci0gICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsKLQotUE5HIGZpbGVzIHN0b3JlIFJHQiBwaXhlbHMgcGFja2VkIGludG8gMyBvciA2IGJ5dGVzLiBUaGlzIGNvZGUgZXhwYW5kcyB0aGVtCi1pbnRvIDQgb3IgOCBieXRlcyBmb3Igd2luZG93aW5nIHN5c3RlbXMgdGhhdCBuZWVkIHRoZW0gaW4gdGhpcyBmb3JtYXQ6Ci0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCi0gICAgICAgIHBuZ19zZXRfZmlsbGVyKHBuZ19wdHIsIGZpbGxlciwgUE5HX0ZJTExFUl9CRUZPUkUpOwotCi13aGVyZSAiZmlsbGVyIiBpcyB0aGUgOCBvciAxNi1iaXQgbnVtYmVyIHRvIGZpbGwgd2l0aCwgYW5kIHRoZSBsb2NhdGlvbiBpcwotZWl0aGVyIFBOR19GSUxMRVJfQkVGT1JFIG9yIFBOR19GSUxMRVJfQUZURVIsIGRlcGVuZGluZyB1cG9uIHdoZXRoZXIKLXlvdSB3YW50IHRoZSBmaWxsZXIgYmVmb3JlIHRoZSBSR0Igb3IgYWZ0ZXIuICBUaGlzIHRyYW5zZm9ybWF0aW9uCi1kb2VzIG5vdCBhZmZlY3QgaW1hZ2VzIHRoYXQgYWxyZWFkeSBoYXZlIGZ1bGwgYWxwaGEgY2hhbm5lbHMuICBUbyBhZGQgYW4KLW9wYXF1ZSBhbHBoYSBjaGFubmVsLCB1c2UgZmlsbGVyPTB4ZmYgb3IgMHhmZmZmIGFuZCBQTkdfRklMTEVSX0FGVEVSIHdoaWNoCi13aWxsIGdlbmVyYXRlIFJHQkEgcGl4ZWxzLgotCi1Ob3RlIHRoYXQgcG5nX3NldF9maWxsZXIoKSBkb2VzIG5vdCBjaGFuZ2UgdGhlIGNvbG9yIHR5cGUuICBJZiB5b3Ugd2FudAotdG8gZG8gdGhhdCwgeW91IGNhbiBhZGQgYSB0cnVlIGFscGhhIGNoYW5uZWwgd2l0aAotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8Ci0gICAgICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKLSAgICBwbmdfc2V0X2FkZF9hbHBoYShwbmdfcHRyLCBmaWxsZXIsIFBOR19GSUxMRVJfQUZURVIpOwotCi13aGVyZSAiZmlsbGVyIiBjb250YWlucyB0aGUgYWxwaGEgdmFsdWUgdG8gYXNzaWduIHRvIGVhY2ggcGl4ZWwuCi1UaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCBpbiBsaWJwbmctMS4yLjcuCi0KLUlmIHlvdSBhcmUgcmVhZGluZyBhbiBpbWFnZSB3aXRoIGFuIGFscGhhIGNoYW5uZWwsIGFuZCB5b3UgbmVlZCB0aGUKLWRhdGEgYXMgQVJHQiBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgUE5HIGZvcm1hdCBSR0JBOgotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgICBwbmdfc2V0X3N3YXBfYWxwaGEocG5nX3B0cik7Ci0KLUZvciBzb21lIHVzZXMsIHlvdSBtYXkgd2FudCBhIGdyYXlzY2FsZSBpbWFnZSB0byBiZSByZXByZXNlbnRlZCBhcwotUkdCLiAgVGhpcyBjb2RlIHdpbGwgZG8gdGhhdCBjb252ZXJzaW9uOgotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSB8fAotICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgICAgICAgcG5nX3NldF9ncmF5X3RvX3JnYihwbmdfcHRyKTsKLQotQ29udmVyc2VseSwgeW91IGNhbiBjb252ZXJ0IGFuIFJHQiBvciBSR0JBIGltYWdlIHRvIGdyYXlzY2FsZSBvciBncmF5c2NhbGUKLXdpdGggYWxwaGEuCi0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKLSAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCi0gICAgICAgICAgcG5nX3NldF9yZ2JfdG9fZ3JheV9maXhlZChwbmdfcHRyLCBlcnJvcl9hY3Rpb24sCi0gICAgICAgICAgICAgaW50IHJlZF93ZWlnaHQsIGludCBncmVlbl93ZWlnaHQpOwotCi0gICAgZXJyb3JfYWN0aW9uID0gMTogc2lsZW50bHkgZG8gdGhlIGNvbnZlcnNpb24KLSAgICBlcnJvcl9hY3Rpb24gPSAyOiBpc3N1ZSBhIHdhcm5pbmcgaWYgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGFzIGFueSBwaXhlbCB3aGVyZQotICAgICAgICAgICAgICAgICAgICAgIHJlZCAhPSBncmVlbiBvciByZWQgIT0gYmx1ZQotICAgIGVycm9yX2FjdGlvbiA9IDM6IGlzc3VlIGFuIGVycm9yIGFuZCBhYm9ydCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uIGlmIHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGhhcyBhbnkgcGl4ZWwgd2hlcmUKLSAgICAgICAgICAgICAgICAgICAgICByZWQgIT0gZ3JlZW4gb3IgcmVkICE9IGJsdWUKLQotICAgIHJlZF93ZWlnaHQ6ICAgICAgIHdlaWdodCBvZiByZWQgY29tcG9uZW50IHRpbWVzIDEwMDAwMAotICAgIGdyZWVuX3dlaWdodDogICAgIHdlaWdodCBvZiBncmVlbiBjb21wb25lbnQgdGltZXMgMTAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgSWYgZWl0aGVyIHdlaWdodCBpcyBuZWdhdGl2ZSwgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHMgKDIxMjY4LCA3MTUxNCkgYXJlIHVzZWQuCi0KLUlmIHlvdSBoYXZlIHNldCBlcnJvcl9hY3Rpb24gPSAxIG9yIDIsIHlvdSBjYW4KLWxhdGVyIGNoZWNrIHdoZXRoZXIgdGhlIGltYWdlIHJlYWxseSB3YXMgZ3JheSwgYWZ0ZXIgcHJvY2Vzc2luZwotdGhlIGltYWdlIHJvd3MsIHdpdGggdGhlIHBuZ19nZXRfcmdiX3RvX2dyYXlfc3RhdHVzKHBuZ19wdHIpIGZ1bmN0aW9uLgotSXQgd2lsbCByZXR1cm4gYSBwbmdfYnl0ZSB0aGF0IGlzIHplcm8gaWYgdGhlIGltYWdlIHdhcyBncmF5IG9yCi0xIGlmIHRoZXJlIHdlcmUgYW55IG5vbi1ncmF5IHBpeGVscy4gIGJLR0QgYW5kIHNCSVQgZGF0YQotd2lsbCBiZSBzaWxlbnRseSBjb252ZXJ0ZWQgdG8gZ3JheXNjYWxlLCB1c2luZyB0aGUgZ3JlZW4gY2hhbm5lbAotZGF0YSwgcmVnYXJkbGVzcyBvZiB0aGUgZXJyb3JfYWN0aW9uIHNldHRpbmcuCi0KLVdpdGggcmVkX3dlaWdodCtncmVlbl93ZWlnaHQ8PTEwMDAwMCwKLXRoZSBub3JtYWxpemVkIGdyYXlsZXZlbCBpcyBjb21wdXRlZDoKLQotICAgIGludCBydyA9IHJlZF93ZWlnaHQgKiA2NTUzNjsKLSAgICBpbnQgZ3cgPSBncmVlbl93ZWlnaHQgKiA2NTUzNjsKLSAgICBpbnQgYncgPSA2NTUzNiAtIChydyArIGd3KTsKLSAgICBncmF5ID0gKHJ3KnJlZCArIGd3KmdyZWVuICsgYncqYmx1ZSkvNjU1MzY7Ci0KLVRoZSBkZWZhdWx0IHZhbHVlcyBhcHByb3hpbWF0ZSB0aG9zZSByZWNvbW1lbmRlZCBpbiB0aGUgQ2hhcmxlcwotUG95bnRvbidzIENvbG9yIEZBUSwgPGh0dHA6Ly93d3cuaW5mb3JhbXAubmV0L35wb3ludG9uLz4KLUNvcHlyaWdodCAoYykgMTk5OC0wMS0wNCBDaGFybGVzIFBveW50b24gPHBveW50b24gYXQgaW5mb3JhbXAubmV0PgotCi0gICAgWSA9IDAuMjEyNjcxICogUiArIDAuNzE1MTYwICogRyArIDAuMDcyMTY5ICogQgotCi1MaWJwbmcgYXBwcm94aW1hdGVzIHRoaXMgd2l0aAotCi0gICAgWSA9IDAuMjEyNjggKiBSICAgICsgMC43MTUxICogRyAgICArIDAuMDcyMTcgKiBCCi0KLXdoaWNoIGNhbiBiZSBleHByZXNzZWQgd2l0aCBpbnRlZ2VycyBhcwotCi0gICAgWSA9ICg2OTY5ICogUiArIDIzNDM0ICogRyArIDIzNjUgKiBCKS8zMjc2OAotCi1UaGUgY2FsY3VsYXRpb24gaXMgZG9uZSBpbiBhIGxpbmVhciBjb2xvcnNwYWNlLCBpZiB0aGUgaW1hZ2UgZ2FtbWEKLWlzIGtub3duLgotCi1JZiB5b3UgaGF2ZSBhIGdyYXlzY2FsZSBhbmQgeW91IGFyZSB1c2luZyBwbmdfc2V0X2V4cGFuZF9kZXB0aCgpLAotcG5nX3NldF9leHBhbmQoKSwgb3IgcG5nX3NldF9ncmF5X3RvX3JnYiB0byBjaGFuZ2UgdG8gdHJ1ZWNvbG9yIG9yIHRvCi1hIGhpZ2hlciBiaXQtZGVwdGgsIHlvdSBtdXN0IGVpdGhlciBzdXBwbHkgdGhlIGJhY2tncm91bmQgY29sb3IgYXMgYSBncmF5Ci12YWx1ZSBhdCB0aGUgb3JpZ2luYWwgZmlsZSBiaXQtZGVwdGggKG5lZWRfZXhwYW5kID0gMSkgb3IgZWxzZSBzdXBwbHkgdGhlCi1iYWNrZ3JvdW5kIGNvbG9yIGFzIGFuIFJHQiB0cmlwbGV0IGF0IHRoZSBmaW5hbCwgZXhwYW5kZWQgYml0IGRlcHRoCi0obmVlZF9leHBhbmQgPSAwKS4gIFNpbWlsYXJseSwgaWYgeW91IGFyZSByZWFkaW5nIGEgcGFsZXR0ZWQgaW1hZ2UsIHlvdQotbXVzdCBlaXRoZXIgc3VwcGx5IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFzIGEgcGFsZXR0ZSBpbmRleCAobmVlZF9leHBhbmQgPSAxKQotb3IgYXMgYW4gUkdCIHRyaXBsZXQgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSBpbiB0aGUgcGFsZXR0ZSAobmVlZF9leHBhbmQgPSAwKS4KLQotICAgIHBuZ19jb2xvcl8xNiBteV9iYWNrZ3JvdW5kOwotICAgIHBuZ19jb2xvcl8xNnAgaW1hZ2VfYmFja2dyb3VuZDsKLQotICAgIGlmIChwbmdfZ2V0X2JLR0QocG5nX3B0ciwgaW5mb19wdHIsICZpbWFnZV9iYWNrZ3JvdW5kKSkKLSAgICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19wdHIsIGltYWdlX2JhY2tncm91bmQsCi0gICAgICAgICAgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfRklMRSwgMSwgMS4wKTsKLSAgICBlbHNlCi0gICAgICAgIHBuZ19zZXRfYmFja2dyb3VuZChwbmdfcHRyLCAmbXlfYmFja2dyb3VuZCwKLSAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4sIDAsIDEuMCk7Ci0KLVRoZSBwbmdfc2V0X2JhY2tncm91bmQoKSBmdW5jdGlvbiB0ZWxscyBsaWJwbmcgdG8gY29tcG9zaXRlIGltYWdlcwotd2l0aCBhbHBoYSBvciBzaW1wbGUgdHJhbnNwYXJlbmN5IGFnYWluc3QgdGhlIHN1cHBsaWVkIGJhY2tncm91bmQKLWNvbG9yLiAgSWYgdGhlIFBORyBmaWxlIGNvbnRhaW5zIGEgYktHRCBjaHVuayAoUE5HX0lORk9fYktHRCB2YWxpZCksCi15b3UgbWF5IHVzZSB0aGlzIGNvbG9yLCBvciBzdXBwbHkgYW5vdGhlciBjb2xvciBtb3JlIHN1aXRhYmxlIGZvcgotdGhlIGN1cnJlbnQgZGlzcGxheSAoZS5nLiwgdGhlIGJhY2tncm91bmQgY29sb3IgZnJvbSBhIHdlYiBwYWdlKS4gIFlvdQotbmVlZCB0byB0ZWxsIGxpYnBuZyB3aGV0aGVyIHRoZSBjb2xvciBpcyBpbiB0aGUgZ2FtbWEgc3BhY2Ugb2YgdGhlCi1kaXNwbGF5IChQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4gZm9yIGNvbG9ycyB5b3Ugc3VwcGx5KSwgdGhlIGZpbGUKLShQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFIGZvciBjb2xvcnMgZnJvbSB0aGUgYktHRCBjaHVuayksIG9yIG9uZQotdGhhdCBpcyBuZWl0aGVyIG9mIHRoZXNlIGdhbW1hcyAoUE5HX0JBQ0tHUk9VTkRfR0FNTUFfVU5JUVVFIC0gSSBkb24ndAota25vdyB3aHkgYW55b25lIHdvdWxkIHVzZSB0aGlzLCBidXQgaXQncyBoZXJlKS4KLQotVG8gcHJvcGVybHkgZGlzcGxheSBQTkcgaW1hZ2VzIG9uIGFueSBraW5kIG9mIHN5c3RlbSwgdGhlIGFwcGxpY2F0aW9uIG5lZWRzCi10byBrbm93IHdoYXQgdGhlIGRpc3BsYXkgZ2FtbWEgaXMuICBJZGVhbGx5LCB0aGUgdXNlciB3aWxsIGtub3cgdGhpcywgYW5kCi10aGUgYXBwbGljYXRpb24gd2lsbCBhbGxvdyB0aGVtIHRvIHNldCBpdC4gIE9uZSBtZXRob2Qgb2YgYWxsb3dpbmcgdGhlIHVzZXIKLXRvIHNldCB0aGUgZGlzcGxheSBnYW1tYSBzZXBhcmF0ZWx5IGZvciBlYWNoIHN5c3RlbSBpcyB0byBjaGVjayBmb3IgYQotU0NSRUVOX0dBTU1BIG9yIERJU1BMQVlfR0FNTUEgZW52aXJvbm1lbnQgdmFyaWFibGUsIHdoaWNoIHdpbGwgaG9wZWZ1bGx5IGJlCi1jb3JyZWN0bHkgc2V0LgotCi1Ob3RlIHRoYXQgZGlzcGxheV9nYW1tYSBpcyB0aGUgb3ZlcmFsbCBnYW1tYSBjb3JyZWN0aW9uIHJlcXVpcmVkIHRvIHByb2R1Y2UKLXBsZWFzaW5nIHJlc3VsdHMsIHdoaWNoIGRlcGVuZHMgb24gdGhlIGxpZ2h0aW5nIGNvbmRpdGlvbnMgaW4gdGhlIHN1cnJvdW5kaW5nCi1lbnZpcm9ubWVudC4gIEluIGEgZGltIG9yIGJyaWdodGx5IGxpdCByb29tLCBubyBjb21wZW5zYXRpb24gb3RoZXIgdGhhbgotdGhlIHBoeXNpY2FsIGdhbW1hIGV4cG9uZW50IG9mIHRoZSBtb25pdG9yIGlzIG5lZWRlZCwgd2hpbGUgaW4gYSBkYXJrIHJvb20KLWEgc2xpZ2h0bHkgc21hbGxlciBleHBvbmVudCBpcyBiZXR0ZXIuCi0KLSAgIGRvdWJsZSBnYW1tYSwgc2NyZWVuX2dhbW1hOwotCi0gICBpZiAoLyogV2UgaGF2ZSBhIHVzZXItZGVmaW5lZCBzY3JlZW4KLSAgICAgICBnYW1tYSB2YWx1ZSAqLykKLSAgIHsKLSAgICAgIHNjcmVlbl9nYW1tYSA9IHVzZXJfZGVmaW5lZF9zY3JlZW5fZ2FtbWE7Ci0gICB9Ci0gICAvKiBPbmUgd2F5IHRoYXQgYXBwbGljYXRpb25zIGNhbiBzaGFyZSB0aGUgc2FtZQotICAgICAgc2NyZWVuIGdhbW1hIHZhbHVlICovCi0gICBlbHNlIGlmICgoZ2FtbWFfc3RyID0gZ2V0ZW52KCJTQ1JFRU5fR0FNTUEiKSkKLSAgICAgICE9IE5VTEwpCi0gICB7Ci0gICAgICBzY3JlZW5fZ2FtbWEgPSAoZG91YmxlKWF0b2YoZ2FtbWFfc3RyKTsKLSAgIH0KLSAgIC8qIElmIHdlIGRvbid0IGhhdmUgYW5vdGhlciB2YWx1ZSAqLwotICAgZWxzZQotICAgewotICAgICAgc2NyZWVuX2dhbW1hID0gMi4yOyAvKiBBIGdvb2QgZ3Vlc3MgZm9yIGEKLSAgICAgICAgICAgUEMgbW9uaXRvciBpbiBhIGJyaWdodCBvZmZpY2Ugb3IgYSBkaW0gcm9vbSAqLwotICAgICAgc2NyZWVuX2dhbW1hID0gMi4wOyAvKiBBIGdvb2QgZ3Vlc3MgZm9yIGEKLSAgICAgICAgICAgUEMgbW9uaXRvciBpbiBhIGRhcmsgcm9vbSAqLwotICAgICAgc2NyZWVuX2dhbW1hID0gMS43IG9yIDEuMDsgIC8qIEEgZ29vZAotICAgICAgICAgICBndWVzcyBmb3IgTWFjIHN5c3RlbXMgKi8KLSAgIH0KLQotVGhlIHBuZ19zZXRfZ2FtbWEoKSBmdW5jdGlvbiBoYW5kbGVzIGdhbW1hIHRyYW5zZm9ybWF0aW9ucyBvZiB0aGUgZGF0YS4KLVBhc3MgYm90aCB0aGUgZmlsZSBnYW1tYSBhbmQgdGhlIGN1cnJlbnQgc2NyZWVuX2dhbW1hLiAgSWYgdGhlIGZpbGUgZG9lcwotbm90IGhhdmUgYSBnYW1tYSB2YWx1ZSwgeW91IGNhbiBwYXNzIG9uZSBhbnl3YXkgaWYgeW91IGhhdmUgYW4gaWRlYSB3aGF0Ci1pdCBpcyAodXN1YWxseSAwLjQ1NDU1IGlzIGEgZ29vZCBndWVzcyBmb3IgR0lGIGltYWdlcyBvbiBQQ3MpLiAgTm90ZQotdGhhdCBmaWxlIGdhbW1hcyBhcmUgaW52ZXJ0ZWQgZnJvbSBzY3JlZW4gZ2FtbWFzLiAgU2VlIHRoZSBkaXNjdXNzaW9ucwotb24gZ2FtbWEgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uIGZvciBhbiBleGNlbGxlbnQgZGVzY3JpcHRpb24gb2Ygd2hhdAotZ2FtbWEgaXMsIGFuZCB3aHkgYWxsIGFwcGxpY2F0aW9ucyBzaG91bGQgc3VwcG9ydCBpdC4gIEl0IGlzIHN0cm9uZ2x5Ci1yZWNvbW1lbmRlZCB0aGF0IFBORyB2aWV3ZXJzIHN1cHBvcnQgZ2FtbWEgY29ycmVjdGlvbi4KLQotICAgaWYgKHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmdhbW1hKSkKLSAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgc2NyZWVuX2dhbW1hLCBnYW1tYSk7Ci0gICBlbHNlCi0gICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIHNjcmVlbl9nYW1tYSwgMC40NTQ1NSk7Ci0KLUlmIHlvdSBuZWVkIHRvIHJlZHVjZSBhbiBSR0IgZmlsZSB0byBhIHBhbGV0dGVkIGZpbGUsIG9yIGlmIGEgcGFsZXR0ZWQKLWZpbGUgaGFzIG1vcmUgZW50cmllcyB0aGVuIHdpbGwgZml0IG9uIHlvdXIgc2NyZWVuLCBwbmdfc2V0X3F1YW50aXplKCkKLXdpbGwgZG8gdGhhdC4gIE5vdGUgdGhhdCB0aGlzIGlzIGEgc2ltcGxlIG1hdGNoIGRpdGhlciB0aGF0IG1lcmVseQotZmluZHMgdGhlIGNsb3Nlc3QgY29sb3IgYXZhaWxhYmxlLiAgVGhpcyBzaG91bGQgd29yayBmYWlybHkgd2VsbCB3aXRoCi1vcHRpbWl6ZWQgcGFsZXR0ZXMsIGFuZCBmYWlybHkgYmFkbHkgd2l0aCBsaW5lYXIgY29sb3IgY3ViZXMuICBJZiB5b3UKLXBhc3MgYSBwYWxldHRlIHRoYXQgaXMgbGFyZ2VyIHRoZW4gbWF4aW11bV9jb2xvcnMsIHRoZSBmaWxlIHdpbGwKLXJlZHVjZSB0aGUgbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUgcGFsZXR0ZSBzbyBpdCB3aWxsIGZpdCBpbnRvCi1tYXhpbXVtX2NvbG9ycy4gIElmIHRoZXJlIGlzIGEgaGlzdG9ncmFtLCBpdCB3aWxsIHVzZSBpdCB0byBtYWtlCi1tb3JlIGludGVsbGlnZW50IGNob2ljZXMgd2hlbiByZWR1Y2luZyB0aGUgcGFsZXR0ZS4gIElmIHRoZXJlIGlzIG5vCi1oaXN0b2dyYW0sIGl0IG1heSBub3QgZG8gYXMgZ29vZCBhIGpvYi4KLQotICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKLSAgIHsKLSAgICAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgICAgUE5HX0lORk9fUExURSkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfdWludF8xNnAgaGlzdG9ncmFtID0gTlVMTDsKLSAgICAgICAgIHBuZ19nZXRfaElTVChwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAgICAgICAgICZoaXN0b2dyYW0pOwotICAgICAgICAgcG5nX3NldF9xdWFudGl6ZShwbmdfcHRyLCBwYWxldHRlLCBudW1fcGFsZXR0ZSwKLSAgICAgICAgICAgIG1heF9zY3JlZW5fY29sb3JzLCBoaXN0b2dyYW0sIDEpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgcG5nX2NvbG9yIHN0ZF9jb2xvcl9jdWJlW01BWF9TQ1JFRU5fQ09MT1JTXSA9Ci0gICAgICAgICAgICB7IC4uLiBjb2xvcnMgLi4uIH07Ci0KLSAgICAgICAgIHBuZ19zZXRfcXVhbnRpemUocG5nX3B0ciwgc3RkX2NvbG9yX2N1YmUsCi0gICAgICAgICAgICBNQVhfU0NSRUVOX0NPTE9SUywgTUFYX1NDUkVFTl9DT0xPUlMsCi0gICAgICAgICAgICBOVUxMLDApOwotICAgICAgfQotICAgfQotCi1QTkcgZmlsZXMgZGVzY3JpYmUgbW9ub2Nocm9tZSBhcyBibGFjayBiZWluZyB6ZXJvIGFuZCB3aGl0ZSBiZWluZyBvbmUuCi1UaGUgZm9sbG93aW5nIGNvZGUgd2lsbCByZXZlcnNlIHRoaXMgKG1ha2UgYmxhY2sgYmUgb25lIGFuZCB3aGl0ZSBiZQotemVybyk6Ci0KLSAgIGlmIChiaXRfZGVwdGggPT0gMSAmJiBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpCi0gICAgICBwbmdfc2V0X2ludmVydF9tb25vKHBuZ19wdHIpOwotCi1UaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIGJlIHVzZWQgdG8gaW52ZXJ0IGdyYXlzY2FsZSBhbmQgZ3JheS1hbHBoYSBpbWFnZXM6Ci0KLSAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgfHwKLSAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKLQotUE5HIGZpbGVzIHN0b3JlIDE2IGJpdCBwaXhlbHMgaW4gbmV0d29yayBieXRlIG9yZGVyIChiaWctZW5kaWFuLAotaWUuIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBmaXJzdCkuICBUaGlzIGNvZGUgY2hhbmdlcyB0aGUgc3RvcmFnZSB0byB0aGUKLW90aGVyIHdheSAobGl0dGxlLWVuZGlhbiwgaS5lLiBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGZpcnN0LCB0aGUKLXdheSBQQ3Mgc3RvcmUgdGhlbSk6Ci0KLSAgICBpZiAoYml0X2RlcHRoID09IDE2KQotICAgICAgICBwbmdfc2V0X3N3YXAocG5nX3B0cik7Ci0KLUlmIHlvdSBhcmUgdXNpbmcgcGFja2VkLXBpeGVsIGltYWdlcyAoMSwgMiwgb3IgNCBiaXRzL3BpeGVsKSwgYW5kIHlvdQotbmVlZCB0byBjaGFuZ2UgdGhlIG9yZGVyIHRoZSBwaXhlbHMgYXJlIHBhY2tlZCBpbnRvIGJ5dGVzLCB5b3UgY2FuIHVzZToKLQotICAgIGlmIChiaXRfZGVwdGggPCA4KQotICAgICAgIHBuZ19zZXRfcGFja3N3YXAocG5nX3B0cik7Ci0KLUZpbmFsbHksIHlvdSBjYW4gd3JpdGUgeW91ciBvd24gdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gaWYgbm9uZSBvZgotdGhlIGV4aXN0aW5nIG9uZXMgbWVldHMgeW91ciBuZWVkcy4gIFRoaXMgaXMgZG9uZSBieSBzZXR0aW5nIGEgY2FsbGJhY2sKLXdpdGgKLQotICAgIHBuZ19zZXRfcmVhZF91c2VyX3RyYW5zZm9ybV9mbihwbmdfcHRyLAotICAgICAgIHJlYWRfdHJhbnNmb3JtX2ZuKTsKLQotWW91IG11c3Qgc3VwcGx5IHRoZSBmdW5jdGlvbgotCi0gICAgdm9pZCByZWFkX3RyYW5zZm9ybV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wCi0gICAgICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgZGF0YSkKLQotU2VlIHBuZ3Rlc3QuYyBmb3IgYSB3b3JraW5nIGV4YW1wbGUuICBZb3VyIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCi1hZnRlciBhbGwgb2YgdGhlIG90aGVyIHRyYW5zZm9ybWF0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgotCi1Zb3UgY2FuIGFsc28gc2V0IHVwIGEgcG9pbnRlciB0byBhIHVzZXIgc3RydWN0dXJlIGZvciB1c2UgYnkgeW91cgotY2FsbGJhY2sgZnVuY3Rpb24sIGFuZCB5b3UgY2FuIGluZm9ybSBsaWJwbmcgdGhhdCB5b3VyIHRyYW5zZm9ybQotZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIG51bWJlciBvZiBjaGFubmVscyBvciBiaXQgZGVwdGggd2l0aCB0aGUKLWZ1bmN0aW9uCi0KLSAgICBwbmdfc2V0X3VzZXJfdHJhbnNmb3JtX2luZm8ocG5nX3B0ciwgdXNlcl9wdHIsCi0gICAgICAgdXNlcl9kZXB0aCwgdXNlcl9jaGFubmVscyk7Ci0KLVRoZSB1c2VyJ3MgYXBwbGljYXRpb24sIG5vdCBsaWJwbmcsIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIGFuZAotZnJlZWluZyBhbnkgbWVtb3J5IHJlcXVpcmVkIGZvciB0aGUgdXNlciBzdHJ1Y3R1cmUuCi0KLVlvdSBjYW4gcmV0cmlldmUgdGhlIHBvaW50ZXIgdmlhIHRoZSBmdW5jdGlvbgotcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIoKS4gIEZvciBleGFtcGxlOgotCi0gICAgdm9pZHAgcmVhZF91c2VyX3RyYW5zZm9ybV9wdHIgPQotICAgICAgIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKHBuZ19wdHIpOwotCi1UaGUgbGFzdCB0aGluZyB0byBoYW5kbGUgaXMgaW50ZXJsYWNpbmc7IHRoaXMgaXMgY292ZXJlZCBpbiBkZXRhaWwgYmVsb3csCi1idXQgeW91IG11c3QgY2FsbCB0aGUgZnVuY3Rpb24gaGVyZSBpZiB5b3Ugd2FudCBsaWJwbmcgdG8gaGFuZGxlIGV4cGFuc2lvbgotb2YgdGhlIGludGVybGFjZWQgaW1hZ2UuCi0KLSAgICBudW1iZXJfb2ZfcGFzc2VzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7Ci0KLUFmdGVyIHNldHRpbmcgdGhlIHRyYW5zZm9ybWF0aW9ucywgbGlicG5nIGNhbiB1cGRhdGUgeW91ciBwbmdfaW5mbwotc3RydWN0dXJlIHRvIHJlZmxlY3QgYW55IHRyYW5zZm9ybWF0aW9ucyB5b3UndmUgcmVxdWVzdGVkIHdpdGggdGhpcwotY2FsbC4gIFRoaXMgaXMgbW9zdCB1c2VmdWwgdG8gdXBkYXRlIHRoZSBpbmZvIHN0cnVjdHVyZSdzIHJvd2J5dGVzCi1maWVsZCBzbyB5b3UgY2FuIHVzZSBpdCB0byBhbGxvY2F0ZSB5b3VyIGltYWdlIG1lbW9yeS4gIFRoaXMgZnVuY3Rpb24KLXdpbGwgYWxzbyB1cGRhdGUgeW91ciBwYWxldHRlIHdpdGggdGhlIGNvcnJlY3Qgc2NyZWVuX2dhbW1hIGFuZAotYmFja2dyb3VuZCBpZiB0aGVzZSBoYXZlIGJlZW4gZ2l2ZW4gd2l0aCB0aGUgY2FsbHMgYWJvdmUuCi0KLSAgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLUFmdGVyIHlvdSBjYWxsIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCksIHlvdSBjYW4gYWxsb2NhdGUgYW55Ci1tZW1vcnkgeW91IG5lZWQgdG8gaG9sZCB0aGUgaW1hZ2UuICBUaGUgcm93IGRhdGEgaXMgc2ltcGx5Ci1yYXcgYnl0ZSBkYXRhIGZvciBhbGwgZm9ybXMgb2YgaW1hZ2VzLiAgQXMgdGhlIGFjdHVhbCBhbGxvY2F0aW9uCi12YXJpZXMgYW1vbmcgYXBwbGljYXRpb25zLCBubyBleGFtcGxlIHdpbGwgYmUgZ2l2ZW4uICBJZiB5b3UKLWFyZSBhbGxvY2F0aW5nIG9uZSBsYXJnZSBjaHVuaywgeW91IHdpbGwgbmVlZCB0byBidWlsZCBhbgotYXJyYXkgb2YgcG9pbnRlcnMgdG8gZWFjaCByb3csIGFzIGl0IHdpbGwgYmUgbmVlZGVkIGZvciBzb21lCi1vZiB0aGUgZnVuY3Rpb25zIGJlbG93LgotCi1SZWFkaW5nIGltYWdlIGRhdGEKLQotQWZ0ZXIgeW91J3ZlIGFsbG9jYXRlZCBtZW1vcnksIHlvdSBjYW4gcmVhZCB0aGUgaW1hZ2UgZGF0YS4KLVRoZSBzaW1wbGVzdCB3YXkgdG8gZG8gdGhpcyBpcyBpbiBvbmUgZnVuY3Rpb24gY2FsbC4gIElmIHlvdSBhcmUKLWFsbG9jYXRpbmcgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSB3aG9sZSBpbWFnZSwgeW91IGNhbiBqdXN0Ci1jYWxsIHBuZ19yZWFkX2ltYWdlKCkgYW5kIGxpYnBuZyB3aWxsIHJlYWQgaW4gYWxsIHRoZSBpbWFnZSBkYXRhCi1hbmQgcHV0IGl0IGluIHRoZSBtZW1vcnkgYXJlYSBzdXBwbGllZC4gIFlvdSB3aWxsIG5lZWQgdG8gcGFzcyBpbgotYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gZWFjaCByb3cuCi0KLVRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBoYW5kbGVzIGludGVybGFjaW5nLCBzbyB5b3UgZG9uJ3QgbmVlZAotdG8gY2FsbCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIG9yIGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZQotdGltZXMsIG9yIGFueSBvZiB0aGF0IG90aGVyIHN0dWZmIG5lY2Vzc2FyeSB3aXRoIHBuZ19yZWFkX3Jvd3MoKS4KLQotICAgcG5nX3JlYWRfaW1hZ2UocG5nX3B0ciwgcm93X3BvaW50ZXJzKTsKLQotd2hlcmUgcm93X3BvaW50ZXJzIGlzOgotCi0gICBwbmdfYnl0ZXAgcm93X3BvaW50ZXJzW2hlaWdodF07Ci0KLVlvdSBjYW4gcG9pbnQgdG8gdm9pZCBvciBjaGFyIG9yIHdoYXRldmVyIHlvdSB1c2UgZm9yIHBpeGVscy4KLQotSWYgeW91IGRvbid0IHdhbnQgdG8gcmVhZCBpbiB0aGUgd2hvbGUgaW1hZ2UgYXQgb25jZSwgeW91IGNhbgotdXNlIHBuZ19yZWFkX3Jvd3MoKSBpbnN0ZWFkLiAgSWYgdGhlcmUgaXMgbm8gaW50ZXJsYWNpbmcgKGNoZWNrCi1pbnRlcmxhY2VfdHlwZSA9PSBQTkdfSU5URVJMQUNFX05PTkUpLCB0aGlzIGlzIHNpbXBsZToKLQotICAgIHBuZ19yZWFkX3Jvd3MocG5nX3B0ciwgcm93X3BvaW50ZXJzLCBOVUxMLAotICAgICAgIG51bWJlcl9vZl9yb3dzKTsKLQotd2hlcmUgcm93X3BvaW50ZXJzIGlzIHRoZSBzYW1lIGFzIGluIHRoZSBwbmdfcmVhZF9pbWFnZSgpIGNhbGwuCi0KLUlmIHlvdSBhcmUgZG9pbmcgdGhpcyBqdXN0IG9uZSByb3cgYXQgYSB0aW1lLCB5b3UgY2FuIGRvIHRoaXMgd2l0aAotYSBzaW5nbGUgcm93X3BvaW50ZXIgaW5zdGVhZCBvZiBhbiBhcnJheSBvZiByb3dfcG9pbnRlcnM6Ci0KLSAgICBwbmdfYnl0ZXAgcm93X3BvaW50ZXIgPSByb3c7Ci0gICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIHJvd19wb2ludGVyLCBOVUxMKTsKLQotSWYgdGhlIGZpbGUgaXMgaW50ZXJsYWNlZCAoaW50ZXJsYWNlX3R5cGUgIT0gMCBpbiB0aGUgSUhEUiBjaHVuayksIHRoaW5ncwotZ2V0IHNvbWV3aGF0IGhhcmRlci4gIFRoZSBvbmx5IGN1cnJlbnQgKFBORyBTcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4yKQotaW50ZXJsYWNpbmcgdHlwZSBmb3IgUE5HIGlzIChpbnRlcmxhY2VfdHlwZSA9PSBQTkdfSU5URVJMQUNFX0FEQU03KQotaXMgYSBzb21ld2hhdCBjb21wbGljYXRlZCAyRCBpbnRlcmxhY2Ugc2NoZW1lLCBrbm93biBhcyBBZGFtNywgdGhhdAotYnJlYWtzIGRvd24gYW4gaW1hZ2UgaW50byBzZXZlbiBzbWFsbGVyIGltYWdlcyBvZiB2YXJ5aW5nIHNpemUsIGJhc2VkCi1vbiBhbiA4eDggZ3JpZC4KLQotbGlicG5nIGNhbiBmaWxsIG91dCB0aG9zZSBpbWFnZXMgb3IgaXQgY2FuIGdpdmUgdGhlbSB0byB5b3UgImFzIGlzIi4KLUlmIHlvdSB3YW50IHRoZW0gZmlsbGVkIG91dCwgdGhlcmUgYXJlIHR3byB3YXlzIHRvIGRvIHRoYXQuICBUaGUgb25lCi1tZW50aW9uZWQgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uIGlzIHRvIGV4cGFuZCBlYWNoIHBpeGVsIHRvIGNvdmVyCi10aG9zZSBwaXhlbHMgdGhhdCBoYXZlIG5vdCBiZWVuIHJlYWQgeWV0ICh0aGUgInJlY3RhbmdsZSIgbWV0aG9kKS4KLVRoaXMgcmVzdWx0cyBpbiBhIGJsb2NreSBpbWFnZSBmb3IgdGhlIGZpcnN0IHBhc3MsIHdoaWNoIGdyYWR1YWxseQotc21vb3RocyBvdXQgYXMgbW9yZSBwaXhlbHMgYXJlIHJlYWQuICBUaGUgb3RoZXIgbWV0aG9kIGlzIHRoZSAic3BhcmtsZSIKLW1ldGhvZCwgd2hlcmUgcGl4ZWxzIGFyZSBkcmF3biBvbmx5IGluIHRoZWlyIGZpbmFsIGxvY2F0aW9ucywgd2l0aCB0aGUKLXJlc3Qgb2YgdGhlIGltYWdlIHJlbWFpbmluZyB3aGF0ZXZlciBjb2xvcnMgdGhleSB3ZXJlIGluaXRpYWxpemVkIHRvCi1iZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSByZWFkLiAgVGhlIGZpcnN0IG1ldGhvZCB1c3VhbGx5IGxvb2tzIGJldHRlciwKLWJ1dCB0ZW5kcyB0byBiZSBzbG93ZXIsIGFzIHRoZXJlIGFyZSBtb3JlIHBpeGVscyB0byBwdXQgaW4gdGhlIHJvd3MuCi0KLUlmIHlvdSBkb24ndCB3YW50IGxpYnBuZyB0byBoYW5kbGUgdGhlIGludGVybGFjaW5nIGRldGFpbHMsIGp1c3QgY2FsbAotcG5nX3JlYWRfcm93cygpIHNldmVuIHRpbWVzIHRvIHJlYWQgaW4gYWxsIHNldmVuIGltYWdlcy4gIEVhY2ggb2YgdGhlCi1pbWFnZXMgaXMgYSB2YWxpZCBpbWFnZSBieSBpdHNlbGYsIG9yIHRoZXkgY2FuIGFsbCBiZSBjb21iaW5lZCBvbiBhbgotOHg4IGdyaWQgdG8gZm9ybSBhIHNpbmdsZSBpbWFnZSAoYWx0aG91Z2ggaWYgeW91IGludGVuZCB0byBjb21iaW5lIHRoZW0KLXlvdSB3b3VsZCBiZSBmYXIgYmV0dGVyIG9mZiB1c2luZyB0aGUgbGlicG5nIGludGVybGFjZSBoYW5kbGluZykuCi0KLVRoZSBmaXJzdCBwYXNzIHdpbGwgcmV0dXJuIGFuIGltYWdlIDEvOCBhcyB3aWRlIGFzIHRoZSBlbnRpcmUgaW1hZ2UKLShldmVyeSA4dGggY29sdW1uIHN0YXJ0aW5nIGluIGNvbHVtbiAwKSBhbmQgMS84IGFzIGhpZ2ggYXMgdGhlIG9yaWdpbmFsCi0oZXZlcnkgOHRoIHJvdyBzdGFydGluZyBpbiByb3cgMCksIHRoZSBzZWNvbmQgd2lsbCBiZSAxLzggYXMgd2lkZQotKHN0YXJ0aW5nIGluIGNvbHVtbiA0KSBhbmQgMS84IGFzIGhpZ2ggKGFsc28gc3RhcnRpbmcgaW4gcm93IDApLiAgVGhlCi10aGlyZCBwYXNzIHdpbGwgYmUgMS80IGFzIHdpZGUgKGV2ZXJ5IDR0aCBwaXhlbCBzdGFydGluZyBpbiBjb2x1bW4gMCkgYW5kCi0xLzggYXMgaGlnaCAoZXZlcnkgOHRoIHJvdyBzdGFydGluZyBpbiByb3cgNCksIGFuZCB0aGUgZm91cnRoIHBhc3Mgd2lsbAotYmUgMS80IGFzIHdpZGUgYW5kIDEvNCBhcyBoaWdoIChldmVyeSA0dGggY29sdW1uIHN0YXJ0aW5nIGluIGNvbHVtbiAyLAotYW5kIGV2ZXJ5IDR0aCByb3cgc3RhcnRpbmcgaW4gcm93IDApLiAgVGhlIGZpZnRoIHBhc3Mgd2lsbCByZXR1cm4gYW4KLWltYWdlIDEvMiBhcyB3aWRlLCBhbmQgMS80IGFzIGhpZ2ggKHN0YXJ0aW5nIGF0IGNvbHVtbiAwIGFuZCByb3cgMiksCi13aGlsZSB0aGUgc2l4dGggcGFzcyB3aWxsIGJlIDEvMiBhcyB3aWRlIGFuZCAxLzIgYXMgaGlnaCBhcyB0aGUgb3JpZ2luYWwKLShzdGFydGluZyBpbiBjb2x1bW4gMSBhbmQgcm93IDApLiAgVGhlIHNldmVudGggYW5kIGZpbmFsIHBhc3Mgd2lsbCBiZSBhcwotd2lkZSBhcyB0aGUgb3JpZ2luYWwsIGFuZCAxLzIgYXMgaGlnaCwgY29udGFpbmluZyBhbGwgb2YgdGhlIG9kZAotbnVtYmVyZWQgc2NhbmxpbmVzLiAgUGhldyEKLQotSWYgeW91IHdhbnQgbGlicG5nIHRvIGV4cGFuZCB0aGUgaW1hZ2VzLCBjYWxsIHRoaXMgYmVmb3JlIGNhbGxpbmcKLXBuZ19zdGFydF9yZWFkX2ltYWdlKCkgb3IgcG5nX3JlYWRfdXBkYXRlX2luZm8oKToKLQotICAgIGlmIChpbnRlcmxhY2VfdHlwZSA9PSBQTkdfSU5URVJMQUNFX0FEQU03KQotICAgICAgICBudW1iZXJfb2ZfcGFzc2VzCi0gICAgICAgICAgID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7Ci0KLVRoaXMgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBwYXNzZXMgbmVlZGVkLiAgQ3VycmVudGx5LCB0aGlzCi1pcyBzZXZlbiwgYnV0IG1heSBjaGFuZ2UgaWYgYW5vdGhlciBpbnRlcmxhY2UgdHlwZSBpcyBhZGRlZC4KLVRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBldmVuIGlmIHRoZSBmaWxlIGlzIG5vdCBpbnRlcmxhY2VkLAotd2hlcmUgaXQgd2lsbCByZXR1cm4gb25lIHBhc3MuCi0KLUlmIHlvdSBhcmUgbm90IGdvaW5nIHRvIGRpc3BsYXkgdGhlIGltYWdlIGFmdGVyIGVhY2ggcGFzcywgYnV0IGFyZQotZ29pbmcgdG8gd2FpdCB1bnRpbCB0aGUgZW50aXJlIGltYWdlIGlzIHJlYWQgaW4sIHVzZSB0aGUgc3BhcmtsZQotZWZmZWN0LiAgVGhpcyBlZmZlY3QgaXMgZmFzdGVyIGFuZCB0aGUgZW5kIHJlc3VsdCBvZiBlaXRoZXIgbWV0aG9kCi1pcyBleGFjdGx5IHRoZSBzYW1lLiAgSWYgeW91IGFyZSBwbGFubmluZyBvbiBkaXNwbGF5aW5nIHRoZSBpbWFnZQotYWZ0ZXIgZWFjaCBwYXNzLCB0aGUgInJlY3RhbmdsZSIgZWZmZWN0IGlzIGdlbmVyYWxseSBjb25zaWRlcmVkIHRoZQotYmV0dGVyIGxvb2tpbmcgb25lLgotCi1JZiB5b3Ugb25seSB3YW50IHRoZSAic3BhcmtsZSIgZWZmZWN0LCBqdXN0IGNhbGwgcG5nX3JlYWRfcm93cygpIGFzCi1ub3JtYWwsIHdpdGggdGhlIHRoaXJkIHBhcmFtZXRlciBOVUxMLiAgTWFrZSBzdXJlIHlvdSBtYWtlIHBhc3Mgb3ZlcgotdGhlIGltYWdlIG51bWJlcl9vZl9wYXNzZXMgdGltZXMsIGFuZCB5b3UgZG9uJ3QgY2hhbmdlIHRoZSBkYXRhIGluIHRoZQotcm93cyBiZXR3ZWVuIGNhbGxzLiAgWW91IGNhbiBjaGFuZ2UgdGhlIGxvY2F0aW9ucyBvZiB0aGUgZGF0YSwganVzdAotbm90IHRoZSBkYXRhLiAgRWFjaCBwYXNzIG9ubHkgd3JpdGVzIHRoZSBwaXhlbHMgYXBwcm9wcmlhdGUgZm9yIHRoYXQKLXBhc3MsIGFuZCBhc3N1bWVzIHRoZSBkYXRhIGZyb20gcHJldmlvdXMgcGFzc2VzIGlzIHN0aWxsIHZhbGlkLgotCi0gICAgcG5nX3JlYWRfcm93cyhwbmdfcHRyLCByb3dfcG9pbnRlcnMsIE5VTEwsCi0gICAgICAgbnVtYmVyX29mX3Jvd3MpOwotCi1JZiB5b3Ugb25seSB3YW50IHRoZSBmaXJzdCBlZmZlY3QgKHRoZSByZWN0YW5nbGVzKSwgZG8gdGhlIHNhbWUgYXMKLWJlZm9yZSBleGNlcHQgcGFzcyB0aGUgcm93IGJ1ZmZlciBpbiB0aGUgdGhpcmQgcGFyYW1ldGVyLCBhbmQgbGVhdmUKLXRoZSBzZWNvbmQgcGFyYW1ldGVyIE5VTEwuCi0KLSAgICBwbmdfcmVhZF9yb3dzKHBuZ19wdHIsIE5VTEwsIHJvd19wb2ludGVycywKLSAgICAgICBudW1iZXJfb2Zfcm93cyk7Ci0KLUZpbmlzaGluZyBhIHNlcXVlbnRpYWwgcmVhZAotCi1BZnRlciB5b3UgYXJlIGZpbmlzaGVkIHJlYWRpbmcgdGhlIGltYWdlIHRocm91Z2ggdGhlCi1sb3ctbGV2ZWwgaW50ZXJmYWNlLCB5b3UgY2FuIGZpbmlzaCByZWFkaW5nIHRoZSBmaWxlLiAgSWYgeW91IGFyZQotaW50ZXJlc3RlZCBpbiBjb21tZW50cyBvciB0aW1lLCB3aGljaCBtYXkgYmUgc3RvcmVkIGVpdGhlciBiZWZvcmUgb3IKLWFmdGVyIHRoZSBpbWFnZSBkYXRhLCB5b3Ugc2hvdWxkIHBhc3MgdGhlIHNlcGFyYXRlIHBuZ19pbmZvIHN0cnVjdCBpZgoteW91IHdhbnQgdG8ga2VlcCB0aGUgY29tbWVudHMgZnJvbSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBpbWFnZQotc2VwYXJhdGUuICBJZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkLCB5b3UgY2FuIHBhc3MgTlVMTC4KLQotICAgcG5nX3JlYWRfZW5kKHBuZ19wdHIsIGVuZF9pbmZvKTsKLQotV2hlbiB5b3UgYXJlIGRvbmUsIHlvdSBjYW4gZnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBieSBsaWJwbmcgbGlrZSB0aGlzOgotCi0gICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAotICAgICAgICZlbmRfaW5mbyk7Ci0KLUl0IGlzIGFsc28gcG9zc2libGUgdG8gaW5kaXZpZHVhbGx5IGZyZWUgdGhlIGluZm9fcHRyIG1lbWJlcnMgdGhhdAotcG9pbnQgdG8gbGlicG5nLWFsbG9jYXRlZCBzdG9yYWdlIHdpdGggdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKLQotICAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIG1hc2ssIHNlcSkKLSAgICBtYXNrIC0gaWRlbnRpZmllcyBkYXRhIHRvIGJlIGZyZWVkLCBhIG1hc2sKLSAgICAgICAgICAgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiBvbmUgb3IKLSAgICAgICAgICAgbW9yZSBvZgotICAgICAgICAgICAgIFBOR19GUkVFX1BMVEUsIFBOR19GUkVFX1RSTlMsCi0gICAgICAgICAgICAgUE5HX0ZSRUVfSElTVCwgUE5HX0ZSRUVfSUNDUCwKLSAgICAgICAgICAgICBQTkdfRlJFRV9QQ0FMLCBQTkdfRlJFRV9ST1dTLAotICAgICAgICAgICAgIFBOR19GUkVFX1NDQUwsIFBOR19GUkVFX1NQTFQsCi0gICAgICAgICAgICAgUE5HX0ZSRUVfVEVYVCwgUE5HX0ZSRUVfVU5LTiwKLSAgICAgICAgICAgb3Igc2ltcGx5IFBOR19GUkVFX0FMTAotICAgIHNlcSAgLSBzZXF1ZW5jZSBudW1iZXIgb2YgaXRlbSB0byBiZSBmcmVlZAotICAgICAgICAgICAoLTEgZm9yIGFsbCBpdGVtcykKLQotVGhpcyBmdW5jdGlvbiBtYXkgYmUgc2FmZWx5IGNhbGxlZCB3aGVuIHRoZSByZWxldmFudCBzdG9yYWdlIGhhcwotYWxyZWFkeSBiZWVuIGZyZWVkLCBvciBoYXMgbm90IHlldCBiZWVuIGFsbG9jYXRlZCwgb3Igd2FzIGFsbG9jYXRlZAotYnkgdGhlIHVzZXIgYW5kIG5vdCBieSBsaWJwbmcsICBhbmQgd2lsbCBpbiB0aG9zZSBjYXNlcyBkbyBub3RoaW5nLgotVGhlICJzZXEiIHBhcmFtZXRlciBpcyBpZ25vcmVkIGlmIG9ubHkgb25lIGl0ZW0gb2YgdGhlIHNlbGVjdGVkIGRhdGEKLXR5cGUsIHN1Y2ggYXMgUExURSwgaXMgYWxsb3dlZC4gIElmICJzZXEiIGlzIG5vdCAtMSwgYW5kIG11bHRpcGxlIGl0ZW1zCi1hcmUgYWxsb3dlZCBmb3IgdGhlIGRhdGEgdHlwZSBpZGVudGlmaWVkIGluIHRoZSBtYXNrLCBzdWNoIGFzIHRleHQgb3IKLXNQTFQsIG9ubHkgdGhlIG4ndGggaXRlbSBpbiB0aGUgc3RydWN0dXJlIGlzIGZyZWVkLCB3aGVyZSBuIGlzICJzZXEiLgotCi1UaGUgZGVmYXVsdCBiZWhhdmlvciBpcyBvbmx5IHRvIGZyZWUgZGF0YSB0aGF0IHdhcyBhbGxvY2F0ZWQgaW50ZXJuYWxseQotYnkgbGlicG5nLiAgVGhpcyBjYW4gYmUgY2hhbmdlZCwgc28gdGhhdCBsaWJwbmcgd2lsbCBub3QgZnJlZSB0aGUgZGF0YSwKLW9yIHNvIHRoYXQgaXQgd2lsbCBmcmVlIGRhdGEgdGhhdCB3YXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyIHdpdGggcG5nX21hbGxvYygpCi1vciBwbmdfemFsbG9jKCkgYW5kIHBhc3NlZCBpbiB2aWEgYSBwbmdfc2V0XyooKSBmdW5jdGlvbiwgd2l0aAotCi0gICAgcG5nX2RhdGFfZnJlZXIocG5nX3B0ciwgaW5mb19wdHIsIGZyZWVyLCBtYXNrKQotICAgIG1hc2sgICAtIHdoaWNoIGRhdGEgZWxlbWVudHMgYXJlIGFmZmVjdGVkCi0gICAgICAgICAgICAgc2FtZSBjaG9pY2VzIGFzIGluIHBuZ19mcmVlX2RhdGEoKQotICAgIGZyZWVyICAtIG9uZSBvZgotICAgICAgICAgICAgICAgUE5HX0RFU1RST1lfV0lMTF9GUkVFX0RBVEEKLSAgICAgICAgICAgICAgIFBOR19TRVRfV0lMTF9GUkVFX0RBVEEKLSAgICAgICAgICAgICAgIFBOR19VU0VSX1dJTExfRlJFRV9EQVRBCi0KLVRoaXMgZnVuY3Rpb24gb25seSBhZmZlY3RzIGRhdGEgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZC4KLVlvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIHJlYWRpbmcgdGhlIFBORyBkYXRhIGJ1dCBiZWZvcmUgY2FsbGluZwotYW55IHBuZ19zZXRfKigpIGZ1bmN0aW9ucywgdG8gY29udHJvbCB3aGV0aGVyIHRoZSB1c2VyIG9yIHRoZSBwbmdfc2V0XyooKQotZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgYW55IGV4aXN0aW5nIGRhdGEgdGhhdCBtaWdodCBiZSBwcmVzZW50LAotYW5kIGFnYWluIGFmdGVyIHRoZSBwbmdfc2V0XyooKSBmdW5jdGlvbnMgdG8gY29udHJvbCB3aGV0aGVyIHRoZSB1c2VyCi1vciBwbmdfZGVzdHJveV8qKCkgaXMgc3VwcG9zZWQgdG8gZnJlZSB0aGUgZGF0YS4gIFdoZW4gdGhlIHVzZXIgYXNzdW1lcwotcmVzcG9uc2liaWxpdHkgZm9yIGxpYnBuZy1hbGxvY2F0ZWQgZGF0YSwgdGhlIGFwcGxpY2F0aW9uIG11c3QgdXNlCi1wbmdfZnJlZSgpIHRvIGZyZWUgaXQsIGFuZCB3aGVuIHRoZSB1c2VyIHRyYW5zZmVycyByZXNwb25zaWJpbGl0eSB0byBsaWJwbmcKLWZvciBkYXRhIHRoYXQgdGhlIHVzZXIgaGFzIGFsbG9jYXRlZCwgdGhlIHVzZXIgbXVzdCBoYXZlIHVzZWQgcG5nX21hbGxvYygpCi1vciBwbmdfemFsbG9jKCkgdG8gYWxsb2NhdGUgaXQuCi0KLUlmIHlvdSBhbGxvY2F0ZWQgeW91ciByb3dfcG9pbnRlcnMgaW4gYSBzaW5nbGUgYmxvY2ssIGFzIHN1Z2dlc3RlZCBhYm92ZSBpbgotdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBoaWdoIGxldmVsIHJlYWQgaW50ZXJmYWNlLCB5b3UgbXVzdCBub3QgdHJhbnNmZXIKLXJlc3BvbnNpYmlsaXR5IGZvciBmcmVlaW5nIGl0IHRvIHRoZSBwbmdfc2V0X3Jvd3Mgb3IgcG5nX3JlYWRfZGVzdHJveSBmdW5jdGlvbiwKLWJlY2F1c2UgdGhleSB3b3VsZCBhbHNvIHRyeSB0byBmcmVlIHRoZSBpbmRpdmlkdWFsIHJvd19wb2ludGVyc1tpXS4KLQotSWYgeW91IGFsbG9jYXRlZCB0ZXh0X3B0ci50ZXh0LCB0ZXh0X3B0ci5sYW5nLCBhbmQgdGV4dF9wdHIudHJhbnNsYXRlZF9rZXl3b3JkCi1zZXBhcmF0ZWx5LCBkbyBub3QgdHJhbnNmZXIgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgdGV4dF9wdHIgdG8gbGlicG5nLAotYmVjYXVzZSB3aGVuIGxpYnBuZyBmaWxscyBhIHBuZ190ZXh0IHN0cnVjdHVyZSBpdCBjb21iaW5lcyB0aGVzZSBtZW1iZXJzIHdpdGgKLXRoZSBrZXkgbWVtYmVyLCBhbmQgcG5nX2ZyZWVfZGF0YSgpIHdpbGwgZnJlZSBvbmx5IHRleHRfcHRyLmtleS4gIFNpbWlsYXJseSwKLWlmIHlvdSB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3IgZnJlZSdpbmcgdGV4dF9wdHIgZnJvbSBsaWJwbmcgdG8geW91cgotYXBwbGljYXRpb24sIHlvdXIgYXBwbGljYXRpb24gbXVzdCBub3Qgc2VwYXJhdGVseSBmcmVlIHRob3NlIG1lbWJlcnMuCi0KLVRoZSBwbmdfZnJlZV9kYXRhKCkgZnVuY3Rpb24gd2lsbCB0dXJuIG9mZiB0aGUgInZhbGlkIiBmbGFnIGZvciBhbnl0aGluZwotaXQgZnJlZXMuICBJZiB5b3UgbmVlZCB0byB0dXJuIHRoZSBmbGFnIG9mZiBmb3IgYSBjaHVuayB0aGF0IHdhcyBmcmVlZCBieQoteW91ciBhcHBsaWNhdGlvbiBpbnN0ZWFkIG9mIGJ5IGxpYnBuZywgeW91IGNhbiB1c2UKLQotICAgIHBuZ19zZXRfaW52YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgbWFzayk7Ci0gICAgbWFzayAtIGlkZW50aWZpZXMgdGhlIGNodW5rcyB0byBiZSBtYWRlIGludmFsaWQsCi0gICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgT1Igb2Ygb25lIG9yCi0gICAgICAgICAgIG1vcmUgb2YKLSAgICAgICAgICAgICBQTkdfSU5GT19nQU1BLCBQTkdfSU5GT19zQklULAotICAgICAgICAgICAgIFBOR19JTkZPX2NIUk0sIFBOR19JTkZPX1BMVEUsCi0gICAgICAgICAgICAgUE5HX0lORk9fdFJOUywgUE5HX0lORk9fYktHRCwKLSAgICAgICAgICAgICBQTkdfSU5GT19oSVNULCBQTkdfSU5GT19wSFlzLAotICAgICAgICAgICAgIFBOR19JTkZPX29GRnMsIFBOR19JTkZPX3RJTUUsCi0gICAgICAgICAgICAgUE5HX0lORk9fcENBTCwgUE5HX0lORk9fc1JHQiwKLSAgICAgICAgICAgICBQTkdfSU5GT19pQ0NQLCBQTkdfSU5GT19zUExULAotICAgICAgICAgICAgIFBOR19JTkZPX3NDQUwsIFBOR19JTkZPX0lEQVQKLQotRm9yIGEgbW9yZSBjb21wYWN0IGV4YW1wbGUgb2YgcmVhZGluZyBhIFBORyBpbWFnZSwgc2VlIHRoZSBmaWxlIGV4YW1wbGUuYy4KLQotUmVhZGluZyBQTkcgZmlsZXMgcHJvZ3Jlc3NpdmVseQotCi1UaGUgcHJvZ3Jlc3NpdmUgcmVhZGVyIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0aGVuIHRoZSBub24tcHJvZ3Jlc3NpdmUKLXJlYWRlci4gIEluc3RlYWQgb2YgY2FsbGluZyBwbmdfcmVhZF9pbmZvKCksIHBuZ19yZWFkX3Jvd3MoKSwgYW5kCi1wbmdfcmVhZF9lbmQoKSwgeW91IG1ha2Ugb25lIGNhbGwgdG8gcG5nX3Byb2Nlc3NfZGF0YSgpLCB3aGljaCBjYWxscwotY2FsbGJhY2tzIHdoZW4gaXQgaGFzIHRoZSBpbmZvLCBhIHJvdywgb3IgdGhlIGVuZCBvZiB0aGUgaW1hZ2UuICBZb3UKLXNldCB1cCB0aGVzZSBjYWxsYmFja3Mgd2l0aCBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4oKS4gIFlvdSBkb24ndAotaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgaW5wdXQvb3V0cHV0IGZ1bmN0aW9ucyBvZiBsaWJwbmcsIGFzIHlvdSBhcmUKLWdpdmluZyB0aGUgbGlicmFyeSB0aGUgZGF0YSBkaXJlY3RseSBpbiBwbmdfcHJvY2Vzc19kYXRhKCkuICBJIHdpbGwKLWFzc3VtZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIHNlY3Rpb24gb24gcmVhZGluZyBQTkcgZmlsZXMgYWJvdmUsCi1zbyBJIHdpbGwgb25seSBoaWdobGlnaHQgdGhlIGRpZmZlcmVuY2VzIChhbHRob3VnaCBJIHdpbGwgc2hvdwotYWxsIG9mIHRoZSBjb2RlKS4KLQotcG5nX3N0cnVjdHAgcG5nX3B0cjsKLXBuZ19pbmZvcCBpbmZvX3B0cjsKLQotIC8qICBBbiBleGFtcGxlIGNvZGUgZnJhZ21lbnQgb2YgaG93IHlvdSB3b3VsZAotICAgICBpbml0aWFsaXplIHRoZSBwcm9ncmVzc2l2ZSByZWFkZXIgaW4geW91cgotICAgICBhcHBsaWNhdGlvbi4gKi8KLSBpbnQKLSBpbml0aWFsaXplX3BuZ19yZWFkZXIoKQotIHsKLSAgICBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdAotICAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAotICAgICAgICAgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKLSAgICBpZiAoIXBuZ19wdHIpCi0gICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLSAgICBpZiAoIWluZm9fcHRyKQotICAgIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsIChwbmdfaW5mb3BwKU5VTEwsCi0gICAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwpOwotICAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLSAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKQotICAgIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKLSAgICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCk7Ci0gICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLQotICAgIC8qIFRoaXMgb25lJ3MgbmV3LiAgWW91IGNhbiBwcm92aWRlIGZ1bmN0aW9ucwotICAgICAgIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBoZWFkZXIgaW5mbyBpcyB2YWxpZCwKLSAgICAgICB3aGVuIGVhY2ggcm93IGlzIGNvbXBsZXRlZCwgYW5kIHdoZW4gdGhlIGltYWdlCi0gICAgICAgaXMgZmluaXNoZWQuICBJZiB5b3UgYXJlbid0IHVzaW5nIGFsbCBmdW5jdGlvbnMsCi0gICAgICAgeW91IGNhbiBzcGVjaWZ5IE5VTEwgcGFyYW1ldGVycy4gIEV2ZW4gd2hlbiBhbGwKLSAgICAgICB0aHJlZSBmdW5jdGlvbnMgYXJlIE5VTEwsIHlvdSBuZWVkIHRvIGNhbGwKLSAgICAgICBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4oKS4gIFlvdSBjYW4gdXNlCi0gICAgICAgYW55IHN0cnVjdCBhcyB0aGUgdXNlcl9wdHIgKGNhc3QgdG8gYSB2b2lkIHBvaW50ZXIKLSAgICAgICBmb3IgdGhlIGZ1bmN0aW9uIGNhbGwpLCBhbmQgcmV0cmlldmUgdGhlIHBvaW50ZXIKLSAgICAgICBmcm9tIGluc2lkZSB0aGUgY2FsbGJhY2tzIHVzaW5nIHRoZSBmdW5jdGlvbgotCi0gICAgICAgICAgcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cik7Ci0KLSAgICAgICB3aGljaCB3aWxsIHJldHVybiBhIHZvaWQgcG9pbnRlciwgd2hpY2ggeW91IGhhdmUKLSAgICAgICB0byBjYXN0IGFwcHJvcHJpYXRlbHkuCi0gICAgICovCi0gICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKHBuZ19wdHIsICh2b2lkICopdXNlcl9wdHIsCi0gICAgICAgIGluZm9fY2FsbGJhY2ssIHJvd19jYWxsYmFjaywgZW5kX2NhbGxiYWNrKTsKLQotICAgIHJldHVybiAwOwotIH0KLQotIC8qIEEgY29kZSBmcmFnbWVudCB0aGF0IHlvdSBjYWxsIGFzIHlvdSByZWNlaXZlIGJsb2NrcwotICAgb2YgZGF0YSAqLwotIGludAotIHByb2Nlc3NfZGF0YShwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfdWludF8zMiBsZW5ndGgpCi0gewotICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCi0gICAgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAotICAgICAgICAgICAocG5nX2luZm9wcClOVUxMKTsKLSAgICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICAgfQotCi0gICAgLyogVGhpcyBvbmUncyBuZXcgYWxzby4gIFNpbXBseSBnaXZlIGl0IGEgY2h1bmsKLSAgICAgICBvZiBkYXRhIGZyb20gdGhlIGZpbGUgc3RyZWFtIChpbiBvcmRlciwgb2YKLSAgICAgICBjb3Vyc2UpLiAgT24gbWFjaGluZXMgd2l0aCBzZWdtZW50ZWQgbWVtb3J5Ci0gICAgICAgbW9kZWxzIG1hY2hpbmVzLCBkb24ndCBnaXZlIGl0IGFueSBtb3JlIHRoYW4KLSAgICAgICA2NEsuICBUaGUgbGlicmFyeSBzZWVtcyB0byBydW4gZmluZSB3aXRoIHNpemVzCi0gICAgICAgb2YgNEsuIEFsdGhvdWdoIHlvdSBjYW4gZ2l2ZSBpdCBtdWNoIGxlc3MgaWYKLSAgICAgICBuZWNlc3NhcnkgKEkgYXNzdW1lIHlvdSBjYW4gZ2l2ZSBpdCBjaHVua3Mgb2YKLSAgICAgICAxIGJ5dGUsIEkgaGF2ZW4ndCB0cmllZCBsZXNzIHRoZW4gMjU2IGJ5dGVzCi0gICAgICAgeWV0KS4gIFdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zLCB5b3UgbWF5Ci0gICAgICAgd2FudCB0byBkaXNwbGF5IGFueSByb3dzIHRoYXQgd2VyZSBnZW5lcmF0ZWQKLSAgICAgICBpbiB0aGUgcm93IGNhbGxiYWNrIGlmIHlvdSBkb24ndCBhbHJlYWR5IGRvCi0gICAgICAgc28gdGhlcmUuCi0gICAgICovCi0gICAgcG5nX3Byb2Nlc3NfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgYnVmZmVyLCBsZW5ndGgpOwotICAgIHJldHVybiAwOwotIH0KLQotIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIChhcyBzZXQgYnkKLSAgICBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4oKSBhYm92ZSkgd2hlbiBlbm91Z2ggZGF0YQotICAgIGhhcyBiZWVuIHN1cHBsaWVkIHNvIGFsbCBvZiB0aGUgaGVhZGVyIGhhcyBiZWVuCi0gICAgcmVhZC4KLSAqLwotIHZvaWQKLSBpbmZvX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvKQotIHsKLSAgICAvKiBEbyBhbnkgc2V0dXAgaGVyZSwgaW5jbHVkaW5nIHNldHRpbmcgYW55IG9mCi0gICAgICAgdGhlIHRyYW5zZm9ybWF0aW9ucyBtZW50aW9uZWQgaW4gdGhlIFJlYWRpbmcKLSAgICAgICBQTkcgZmlsZXMgc2VjdGlvbi4gIEZvciBub3csIHlvdSBfbXVzdF8gY2FsbAotICAgICAgIGVpdGhlciBwbmdfc3RhcnRfcmVhZF9pbWFnZSgpIG9yCi0gICAgICAgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBhZnRlciBhbGwgdGhlCi0gICAgICAgdHJhbnNmb3JtYXRpb25zIGFyZSBzZXQgKGV2ZW4gaWYgeW91IGRvbid0IHNldAotICAgICAgIGFueSkuICBZb3UgbWF5IHN0YXJ0IGdldHRpbmcgcm93cyBiZWZvcmUKLSAgICAgICBwbmdfcHJvY2Vzc19kYXRhKCkgcmV0dXJucywgc28gdGhpcyBpcyB5b3VyCi0gICAgICAgbGFzdCBjaGFuY2UgdG8gcHJlcGFyZSBmb3IgdGhhdC4KLSAgICAgKi8KLSB9Ci0KLSAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGVhY2ggcm93IG9mIGltYWdlCi0gICAgZGF0YSBpcyBjb21wbGV0ZSAqLwotIHZvaWQKLSByb3dfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIG5ld19yb3csCi0gICAgcG5nX3VpbnRfMzIgcm93X251bSwgaW50IHBhc3MpCi0gewotICAgIC8qIElmIHRoZSBpbWFnZSBpcyBpbnRlcmxhY2VkLCBhbmQgeW91IHR1cm5lZAotICAgICAgIG9uIHRoZSBpbnRlcmxhY2UgaGFuZGxlciwgdGhpcyBmdW5jdGlvbiB3aWxsCi0gICAgICAgYmUgY2FsbGVkIGZvciBldmVyeSByb3cgaW4gZXZlcnkgcGFzcy4gIFNvbWUKLSAgICAgICBvZiB0aGVzZSByb3dzIHdpbGwgbm90IGJlIGNoYW5nZWQgZnJvbSB0aGUKLSAgICAgICBwcmV2aW91cyBwYXNzLiAgV2hlbiB0aGUgcm93IGlzIG5vdCBjaGFuZ2VkLAotICAgICAgIHRoZSBuZXdfcm93IHZhcmlhYmxlIHdpbGwgYmUgTlVMTC4gIFRoZSByb3dzCi0gICAgICAgYW5kIHBhc3NlcyBhcmUgY2FsbGVkIGluIG9yZGVyLCBzbyB5b3UgZG9uJ3QKLSAgICAgICByZWFsbHkgbmVlZCB0aGUgcm93X251bSBhbmQgcGFzcywgYnV0IEknbQotICAgICAgIHN1cHBseWluZyB0aGVtIGJlY2F1c2UgaXQgbWF5IG1ha2UgeW91ciBsaWZlCi0gICAgICAgZWFzaWVyLgotCi0gICAgICAgRm9yIHRoZSBub24tTlVMTCByb3dzIG9mIGludGVybGFjZWQgaW1hZ2VzLAotICAgICAgIHlvdSBtdXN0IGNhbGwgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KCkKLSAgICAgICBwYXNzaW5nIGluIHRoZSByb3cgYW5kIHRoZSBvbGQgcm93LiAgWW91IGNhbgotICAgICAgIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgTlVMTCByb3dzIChpdCB3aWxsIGp1c3QKLSAgICAgICByZXR1cm4pIGFuZCBmb3Igbm9uLWludGVybGFjZWQgaW1hZ2VzIChpdCBqdXN0Ci0gICAgICAgZG9lcyB0aGUgbWVtY3B5IGZvciB5b3UpIGlmIGl0IHdpbGwgbWFrZSB0aGUKLSAgICAgICBjb2RlIGVhc2llci4gIFRodXMsIHlvdSBjYW4ganVzdCBkbyB0aGlzIGZvcgotICAgICAgIGFsbCBjYXNlczoKLSAgICAgKi8KLQotICAgICAgICBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cocG5nX3B0ciwgb2xkX3JvdywKLSAgICAgICAgICBuZXdfcm93KTsKLQotICAgIC8qIHdoZXJlIG9sZF9yb3cgaXMgd2hhdCB3YXMgZGlzcGxheWVkIGZvcgotICAgICAgIHByZXZpb3VzbHkgZm9yIHRoZSByb3cuICBOb3RlIHRoYXQgdGhlIGZpcnN0Ci0gICAgICAgcGFzcyAocGFzcyA9PSAwLCByZWFsbHkpIHdpbGwgY29tcGxldGVseSBjb3ZlcgotICAgICAgIHRoZSBvbGQgcm93LCBzbyB0aGUgcm93cyBkbyBub3QgaGF2ZSB0byBiZQotICAgICAgIGluaXRpYWxpemVkLiAgQWZ0ZXIgdGhlIGZpcnN0IHBhc3MgKGFuZCBvbmx5Ci0gICAgICAgZm9yIGludGVybGFjZWQgaW1hZ2VzKSwgeW91IHdpbGwgaGF2ZSB0byBwYXNzCi0gICAgICAgdGhlIGN1cnJlbnQgcm93LCBhbmQgdGhlIGZ1bmN0aW9uIHdpbGwgY29tYmluZQotICAgICAgIHRoZSBvbGQgcm93IGFuZCB0aGUgbmV3IHJvdy4KLSAgICAqLwotIH0KLQotIHZvaWQKLSBlbmRfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm8pCi0gewotICAgIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSB3aG9sZSBpbWFnZQotICAgICAgIGhhcyBiZWVuIHJlYWQsIGluY2x1ZGluZyBhbnkgY2h1bmtzIGFmdGVyIHRoZQotICAgICAgIGltYWdlICh1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBJRU5EKS4gIFlvdQotICAgICAgIHdpbGwgdXN1YWxseSBoYXZlIHRoZSBzYW1lIGluZm8gY2h1bmsgYXMgeW91Ci0gICAgICAgaGFkIGluIHRoZSBoZWFkZXIsIGFsdGhvdWdoIHNvbWUgZGF0YSBtYXkgaGF2ZQotICAgICAgIGJlZW4gYWRkZWQgdG8gdGhlIGNvbW1lbnRzIGFuZCB0aW1lIGZpZWxkcy4KLQotICAgICAgIE1vc3QgcGVvcGxlIHdvbid0IGRvIG11Y2ggaGVyZSwgcGVyaGFwcyBzZXR0aW5nCi0gICAgICAgYSBmbGFnIHRoYXQgbWFya3MgdGhlIGltYWdlIGFzIGZpbmlzaGVkLgotICAgICAqLwotIH0KLQotCi0KLUlWLiBXcml0aW5nCi0KLU11Y2ggb2YgdGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gcmVhZGluZy4gIEhvd2V2ZXIsIGV2ZXJ5dGhpbmcgb2YKLWltcG9ydGFuY2UgaXMgcmVwZWF0ZWQgaGVyZSwgc28geW91IHdvbid0IGhhdmUgdG8gY29uc3RhbnRseSBsb29rCi1iYWNrIHVwIGluIHRoZSByZWFkaW5nIHNlY3Rpb24gdG8gdW5kZXJzdGFuZCB3cml0aW5nLgotCi1TZXR1cAotCi1Zb3Ugd2lsbCB3YW50IHRvIGRvIHRoZSBJL08gaW5pdGlhbGl6YXRpb24gYmVmb3JlIHlvdSBnZXQgaW50byBsaWJwbmcsCi1zbyBpZiBpdCBkb2Vzbid0IHdvcmssIHlvdSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIHVuZG8uIElmIHlvdSBhcmUgbm90Ci11c2luZyB0aGUgc3RhbmRhcmQgSS9PIGZ1bmN0aW9ucywgeW91IHdpbGwgbmVlZCB0byByZXBsYWNlIHRoZW0gd2l0aAotY3VzdG9tIHdyaXRpbmcgZnVuY3Rpb25zLiAgU2VlIHRoZSBkaXNjdXNzaW9uIHVuZGVyIEN1c3RvbWl6aW5nIGxpYnBuZy4KLQotICAgIEZJTEUgKmZwID0gZm9wZW4oZmlsZV9uYW1lLCAid2IiKTsKLSAgICBpZiAoIWZwKQotICAgIHsKLSAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLU5leHQsIHBuZ19zdHJ1Y3QgYW5kIHBuZ19pbmZvIG5lZWQgdG8gYmUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZC4KLUFzIHRoZXNlIGNhbiBiZSBib3RoIHJlbGF0aXZlbHkgbGFyZ2UsIHlvdSBtYXkgbm90IHdhbnQgdG8gc3RvcmUgdGhlc2UKLW9uIHRoZSBzdGFjaywgdW5sZXNzIHlvdSBoYXZlIHN0YWNrIHNwYWNlIHRvIHNwYXJlLiAgT2YgY291cnNlLCB5b3UKLXdpbGwgd2FudCB0byBjaGVjayBpZiB0aGV5IHJldHVybiBOVUxMLiAgSWYgeW91IGFyZSBhbHNvIHJlYWRpbmcsCi15b3Ugd29uJ3Qgd2FudCB0byBuYW1lIHlvdXIgcmVhZCBzdHJ1Y3R1cmUgYW5kIHlvdXIgd3JpdGUgc3RydWN0dXJlCi1ib3RoICJwbmdfcHRyIjsgeW91IGNhbiBjYWxsIHRoZW0gYW55dGhpbmcgeW91IGxpa2UsIHN1Y2ggYXMKLSJyZWFkX3B0ciIgYW5kICJ3cml0ZV9wdHIiLiAgTG9vayBhdCBwbmd0ZXN0LmMsIGZvciBleGFtcGxlLgotCi0gICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0Ci0gICAgICAgKFBOR19MSUJQTkdfVkVSX1NUUklORywgKHBuZ192b2lkcCl1c2VyX2Vycm9yX3B0ciwKLSAgICAgICAgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKLSAgICBpZiAoIXBuZ19wdHIpCi0gICAgICAgcmV0dXJuIChFUlJPUik7Ci0KLSAgICBwbmdfaW5mb3AgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOwotICAgIGlmICghaW5mb19wdHIpCi0gICAgewotICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwKLSAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwpOwotICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLQotSWYgeW91IHdhbnQgdG8gdXNlIHlvdXIgb3duIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLAotZGVmaW5lIFBOR19VU0VSX01FTV9TVVBQT1JURUQgYW5kIHVzZQotcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMigpIGluc3RlYWQgb2YgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoKToKLQotICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yCi0gICAgICAgKFBOR19MSUJQTkdfVkVSX1NUUklORywgKHBuZ192b2lkcCl1c2VyX2Vycm9yX3B0ciwKLSAgICAgICAgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuLCAocG5nX3ZvaWRwKQotICAgICAgICB1c2VyX21lbV9wdHIsIHVzZXJfbWFsbG9jX2ZuLCB1c2VyX2ZyZWVfZm4pOwotCi1BZnRlciB5b3UgaGF2ZSB0aGVzZSBzdHJ1Y3R1cmVzLCB5b3Ugd2lsbCBuZWVkIHRvIHNldCB1cCB0aGUKLWVycm9yIGhhbmRsaW5nLiAgV2hlbiBsaWJwbmcgZW5jb3VudGVycyBhbiBlcnJvciwgaXQgZXhwZWN0cyB0bwotbG9uZ2ptcCgpIGJhY2sgdG8geW91ciByb3V0aW5lLiAgVGhlcmVmb3JlLCB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwKLXNldGptcCgpIGFuZCBwYXNzIHRoZSBwbmdfam1wYnVmKHBuZ19wdHIpLiAgSWYgeW91Ci13cml0ZSB0aGUgZmlsZSBmcm9tIGRpZmZlcmVudCByb3V0aW5lcywgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUKLXRoZSBwbmdfam1wYnVmKHBuZ19wdHIpIGV2ZXJ5IHRpbWUgeW91IGVudGVyIGEgbmV3IHJvdXRpbmUgdGhhdCB3aWxsCi1jYWxsIGEgcG5nXyooKSBmdW5jdGlvbi4gIFNlZSB5b3VyIGRvY3VtZW50YXRpb24gb2Ygc2V0am1wL2xvbmdqbXAKLWZvciB5b3VyIGNvbXBpbGVyIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHNldGptcC9sb25nam1wLiAgU2VlCi10aGUgZGlzY3Vzc2lvbiBvbiBsaWJwbmcgZXJyb3IgaGFuZGxpbmcgaW4gdGhlIEN1c3RvbWl6aW5nIExpYnBuZwotc2VjdGlvbiBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgbGlicG5nIGVycm9yIGhhbmRsaW5nLgotCi0gICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKLSAgICB7Ci0gICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIpOwotICAgICAgIGZjbG9zZShmcCk7Ci0gICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICAgfQotICAgIC4uLgotICAgIHJldHVybjsKLQotSWYgeW91IHdvdWxkIHJhdGhlciBhdm9pZCB0aGUgY29tcGxleGl0eSBvZiBzZXRqbXAvbG9uZ2ptcCBpc3N1ZXMsCi15b3UgY2FuIGNvbXBpbGUgbGlicG5nIHdpdGggUE5HX05PX1NFVEpNUCwgaW4gd2hpY2ggY2FzZQotZXJyb3JzIHdpbGwgcmVzdWx0IGluIGEgY2FsbCB0byBQTkdfQUJPUlQoKSB3aGljaCBkZWZhdWx0cyB0byBhYm9ydCgpLgotCi1Zb3UgY2FuICNkZWZpbmUgUE5HX0FCT1JUKCkgdG8gYSBmdW5jdGlvbiB0aGF0IGRvZXMgc29tZXRoaW5nCi1tb3JlIHVzZWZ1bCB0aGFuIGFib3J0KCksIGFzIGxvbmcgYXMgeW91ciBmdW5jdGlvbiBkb2VzIG5vdAotcmV0dXJuLgotCi1Ob3cgeW91IG5lZWQgdG8gc2V0IHVwIHRoZSBvdXRwdXQgY29kZS4gIFRoZSBkZWZhdWx0IGZvciBsaWJwbmcgaXMgdG8KLXVzZSB0aGUgQyBmdW5jdGlvbiBmd3JpdGUoKS4gIElmIHlvdSB1c2UgdGhpcywgeW91IHdpbGwgbmVlZCB0byBwYXNzIGEKLXZhbGlkIEZJTEUgKiBpbiB0aGUgZnVuY3Rpb24gcG5nX2luaXRfaW8oKS4gIEJlIHN1cmUgdGhhdCB0aGUgZmlsZSBpcwotb3BlbmVkIGluIGJpbmFyeSBtb2RlLiAgQWdhaW4sIGlmIHlvdSB3aXNoIHRvIGhhbmRsZSB3cml0aW5nIGRhdGEgaW4KLWFub3RoZXIgd2F5LCBzZWUgdGhlIGRpc2N1c3Npb24gb24gbGlicG5nIEkvTyBoYW5kbGluZyBpbiB0aGUgQ3VzdG9taXppbmcKLUxpYnBuZyBzZWN0aW9uIGJlbG93LgotCi0gICAgcG5nX2luaXRfaW8ocG5nX3B0ciwgZnApOwotCi1JZiB5b3UgYXJlIGVtYmVkZGluZyB5b3VyIFBORyBpbnRvIGEgZGF0YXN0cmVhbSBzdWNoIGFzIE1ORywgYW5kIGRvbid0Ci13YW50IGxpYnBuZyB0byB3cml0ZSB0aGUgOC1ieXRlIHNpZ25hdHVyZSwgb3IgaWYgeW91IGhhdmUgYWxyZWFkeQotd3JpdHRlbiB0aGUgc2lnbmF0dXJlIGluIHlvdXIgYXBwbGljYXRpb24sIHVzZQotCi0gICAgcG5nX3NldF9zaWdfYnl0ZXMocG5nX3B0ciwgOCk7Ci0KLXRvIGluZm9ybSBsaWJwbmcgdGhhdCBpdCBzaG91bGQgbm90IHdyaXRlIGEgc2lnbmF0dXJlLgotCi1Xcml0ZSBjYWxsYmFja3MKLQotQXQgdGhpcyBwb2ludCwgeW91IGNhbiBzZXQgdXAgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUKLWNhbGxlZCBhZnRlciBlYWNoIHJvdyBoYXMgYmVlbiB3cml0dGVuLCB3aGljaCB5b3UgY2FuIHVzZSB0byBjb250cm9sCi1hIHByb2dyZXNzIG1ldGVyIG9yIHRoZSBsaWtlLiAgSXQncyBkZW1vbnN0cmF0ZWQgaW4gcG5ndGVzdC5jLgotWW91IG11c3Qgc3VwcGx5IGEgZnVuY3Rpb24KLQotICAgIHZvaWQgd3JpdGVfcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHJvdywKLSAgICAgICBpbnQgcGFzcyk7Ci0gICAgewotICAgICAgLyogcHV0IHlvdXIgY29kZSBoZXJlICovCi0gICAgfQotCi0oWW91IGNhbiBnaXZlIGl0IGFub3RoZXIgbmFtZSB0aGF0IHlvdSBsaWtlIGluc3RlYWQgb2YgIndyaXRlX3Jvd19jYWxsYmFjayIpCi0KLVRvIGluZm9ybSBsaWJwbmcgYWJvdXQgeW91ciBmdW5jdGlvbiwgdXNlCi0KLSAgICBwbmdfc2V0X3dyaXRlX3N0YXR1c19mbihwbmdfcHRyLCB3cml0ZV9yb3dfY2FsbGJhY2spOwotCi1Zb3Ugbm93IGhhdmUgdGhlIG9wdGlvbiBvZiBtb2RpZnlpbmcgaG93IHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IHdpbGwKLXJ1bi4gIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBtYWlubHkgZm9yIHRlc3RpbmcsIGJ1dCBtYXkgYmUgdXNlZnVsCi1pbiBzb21lIGNhc2VzLCBsaWtlIGlmIHlvdSBuZWVkIHRvIHdyaXRlIFBORyBmaWxlcyBleHRyZW1lbHkgZmFzdCBhbmQKLWFyZSB3aWxsaW5nIHRvIGdpdmUgdXAgc29tZSBjb21wcmVzc2lvbiwgb3IgaWYgeW91IHdhbnQgdG8gZ2V0IHRoZQotbWF4aW11bSBwb3NzaWJsZSBjb21wcmVzc2lvbiBhdCB0aGUgZXhwZW5zZSBvZiBzbG93ZXIgd3JpdGluZy4gIElmIHlvdQotaGF2ZSBubyBzcGVjaWFsIG5lZWRzIGluIHRoaXMgYXJlYSwgbGV0IHRoZSBsaWJyYXJ5IGRvIHdoYXQgaXQgd2FudHMgYnkKLW5vdCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYXQgYWxsLCBhcyBpdCBoYXMgYmVlbiB0dW5lZCB0byBkZWxpdmVyIGEgZ29vZAotc3BlZWQvY29tcHJlc3Npb24gcmF0aW8uIFRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIHBuZ19zZXRfZmlsdGVyKCkgaXMKLXRoZSBmaWx0ZXIgbWV0aG9kLCBmb3Igd2hpY2ggdGhlIG9ubHkgdmFsaWQgdmFsdWVzIGFyZSAwIChhcyBvZiB0aGUKLUp1bHkgMTk5OSBQTkcgc3BlY2lmaWNhdGlvbiwgdmVyc2lvbiAxLjIpIG9yIDY0IChpZiB5b3UgYXJlIHdyaXRpbmcKLWEgUE5HIGRhdGFzdHJlYW0gdGhhdCBpcyB0byBiZSBlbWJlZGRlZCBpbiBhIE1ORyBkYXRhc3RyZWFtKS4gIFRoZSB0aGlyZAotcGFyYW1ldGVyIGlzIGEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGljaCBmaWx0ZXIgdHlwZShzKSBhcmUgdG8gYmUgdGVzdGVkCi1mb3IgZWFjaCBzY2FubGluZS4gIFNlZSB0aGUgUE5HIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIHNwZWNpZmljCi1maWx0ZXIgdHlwZXMuCi0KLQotICAgIC8qIHR1cm4gb24gb3Igb2ZmIGZpbHRlcmluZywgYW5kL29yIGNob29zZQotICAgICAgIHNwZWNpZmljIGZpbHRlcnMuICBZb3UgY2FuIHVzZSBlaXRoZXIgYSBzaW5nbGUKLSAgICAgICBQTkdfRklMVEVSX1ZBTFVFX05BTUUgb3IgdGhlIGJpdHdpc2UgT1Igb2Ygb25lCi0gICAgICAgb3IgbW9yZSBQTkdfRklMVEVSX05BTUUgbWFza3MuICovCi0gICAgcG5nX3NldF9maWx0ZXIocG5nX3B0ciwgMCwKLSAgICAgICBQTkdfRklMVEVSX05PTkUgIHwgUE5HX0ZJTFRFUl9WQUxVRV9OT05FIHwKLSAgICAgICBQTkdfRklMVEVSX1NVQiAgIHwgUE5HX0ZJTFRFUl9WQUxVRV9TVUIgIHwKLSAgICAgICBQTkdfRklMVEVSX1VQICAgIHwgUE5HX0ZJTFRFUl9WQUxVRV9VUCAgIHwKLSAgICAgICBQTkdfRklMVEVSX0FWRyAgIHwgUE5HX0ZJTFRFUl9WQUxVRV9BVkcgIHwKLSAgICAgICBQTkdfRklMVEVSX1BBRVRIIHwgUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSHwKLSAgICAgICBQTkdfQUxMX0ZJTFRFUlMpOwotCi1JZiBhbiBhcHBsaWNhdGlvbgotd2FudHMgdG8gc3RhcnQgYW5kIHN0b3AgdXNpbmcgcGFydGljdWxhciBmaWx0ZXJzIGR1cmluZyBjb21wcmVzc2lvbiwKLWl0IHNob3VsZCBzdGFydCBvdXQgd2l0aCBhbGwgb2YgdGhlIGZpbHRlcnMgKHRvIGVuc3VyZSB0aGF0IHRoZSBwcmV2aW91cwotcm93IG9mIHBpeGVscyB3aWxsIGJlIHN0b3JlZCBpbiBjYXNlIGl0J3MgbmVlZGVkIGxhdGVyKSwgYW5kIHRoZW4gYWRkCi1hbmQgcmVtb3ZlIHRoZW0gYWZ0ZXIgdGhlIHN0YXJ0IG9mIGNvbXByZXNzaW9uLgotCi1JZiB5b3UgYXJlIHdyaXRpbmcgYSBQTkcgZGF0YXN0cmVhbSB0aGF0IGlzIHRvIGJlIGVtYmVkZGVkIGluIGEgTU5HCi1kYXRhc3RyZWFtLCB0aGUgc2Vjb25kIHBhcmFtZXRlciBjYW4gYmUgZWl0aGVyIDAgb3IgNjQuCi0KLVRoZSBwbmdfc2V0X2NvbXByZXNzaW9uXyooKSBmdW5jdGlvbnMgaW50ZXJmYWNlIHRvIHRoZSB6bGliIGNvbXByZXNzaW9uCi1saWJyYXJ5LCBhbmQgc2hvdWxkIG1vc3RseSBiZSBpZ25vcmVkIHVubGVzcyB5b3UgcmVhbGx5IGtub3cgd2hhdCB5b3UgYXJlCi1kb2luZy4gIFRoZSBvbmx5IGdlbmVyYWxseSB1c2VmdWwgY2FsbCBpcyBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKCkKLXdoaWNoIGNoYW5nZXMgaG93IG11Y2ggdGltZSB6bGliIHNwZW5kcyBvbiB0cnlpbmcgdG8gY29tcHJlc3MgdGhlIGltYWdlCi1kYXRhLiAgU2VlIHRoZSBDb21wcmVzc2lvbiBMaWJyYXJ5ICh6bGliLmggYW5kIGFsZ29yaXRobS50eHQsIGRpc3RyaWJ1dGVkCi13aXRoIHpsaWIpIGZvciBkZXRhaWxzIG9uIHRoZSBjb21wcmVzc2lvbiBsZXZlbHMuCi0KLSAgICAvKiBzZXQgdGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwgKi8KLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19wdHIsCi0gICAgICAgIFpfQkVTVF9DT01QUkVTU0lPTik7Ci0KLSAgICAvKiBzZXQgb3RoZXIgemxpYiBwYXJhbWV0ZXJzICovCi0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwocG5nX3B0ciwgOCk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneShwbmdfcHRyLAotICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1kpOwotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMocG5nX3B0ciwgMTUpOwotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kKHBuZ19wdHIsIDgpOwotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3B0ciwgODE5MikKLQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3pidWZfc2l6ZSkKLQotU2V0dGluZyB0aGUgY29udGVudHMgb2YgaW5mbyBmb3Igb3V0cHV0Ci0KLVlvdSBub3cgbmVlZCB0byBmaWxsIGluIHRoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgd2l0aCBhbGwgdGhlIGRhdGEgeW91Ci13aXNoIHRvIHdyaXRlIGJlZm9yZSB0aGUgYWN0dWFsIGltYWdlLiAgTm90ZSB0aGF0IHRoZSBvbmx5IHRoaW5nIHlvdQotYXJlIGFsbG93ZWQgdG8gd3JpdGUgYWZ0ZXIgdGhlIGltYWdlIGlzIHRoZSB0ZXh0IGNodW5rcyBhbmQgdGhlIHRpbWUKLWNodW5rIChhcyBvZiBQTkcgU3BlY2lmaWNhdGlvbiAxLjIsIGFueXdheSkuICBTZWUgcG5nX3dyaXRlX2VuZCgpIGFuZAotdGhlIGxhdGVzdCBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGF0LiAgSWYgeW91Ci13aXNoIHRvIHdyaXRlIHRoZW0gYmVmb3JlIHRoZSBpbWFnZSwgZmlsbCB0aGVtIGluIG5vdywgYW5kIGZsYWcgdGhhdAotZGF0YSBhcyBiZWluZyB2YWxpZC4gIElmIHlvdSB3YW50IHRvIHdhaXQgdW50aWwgYWZ0ZXIgdGhlIGRhdGEsIGRvbid0Ci1maWxsIHRoZW0gdW50aWwgcG5nX3dyaXRlX2VuZCgpLiAgRm9yIGFsbCB0aGUgZmllbGRzIGluIHBuZ19pbmZvIGFuZAotdGhlaXIgZGF0YSB0eXBlcywgc2VlIHBuZy5oLiAgRm9yIGV4cGxhbmF0aW9ucyBvZiB3aGF0IHRoZSBmaWVsZHMKLWNvbnRhaW4sIHNlZSB0aGUgUE5HIHNwZWNpZmljYXRpb24uCi0KLVNvbWUgb2YgdGhlIG1vcmUgaW1wb3J0YW50IHBhcnRzIG9mIHRoZSBwbmdfaW5mbyBhcmU6Ci0KLSAgICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgYml0X2RlcHRoLCBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZSwKLSAgICAgICBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfbWV0aG9kKQotICAgIHdpZHRoICAgICAgICAgIC0gaG9sZHMgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZQotICAgICAgICAgICAgICAgICAgICAgaW4gcGl4ZWxzICh1cCB0byAyXjMxKS4KLSAgICBoZWlnaHQgICAgICAgICAtIGhvbGRzIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlCi0gICAgICAgICAgICAgICAgICAgICBpbiBwaXhlbHMgKHVwIHRvIDJeMzEpLgotICAgIGJpdF9kZXB0aCAgICAgIC0gaG9sZHMgdGhlIGJpdCBkZXB0aCBvZiBvbmUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICBpbWFnZSBjaGFubmVscy4KLSAgICAgICAgICAgICAgICAgICAgICh2YWxpZCB2YWx1ZXMgYXJlIDEsIDIsIDQsIDgsIDE2Ci0gICAgICAgICAgICAgICAgICAgICBhbmQgZGVwZW5kIGFsc28gb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICBjb2xvcl90eXBlLiAgU2VlIGFsc28gc2lnbmlmaWNhbnQKLSAgICAgICAgICAgICAgICAgICAgIGJpdHMgKHNCSVQpIGJlbG93KS4KLSAgICBjb2xvcl90eXBlICAgICAtIGRlc2NyaWJlcyB3aGljaCBjb2xvci9hbHBoYQotICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgYXJlIHByZXNlbnQuCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9HUkFZCi0gICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyAxLCAyLCA0LCA4LCAxNikKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDgsIDE2KQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUEFMRVRURQotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgMSwgMiwgNCwgOCkKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQgotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF9kZXB0aHMgOCwgMTYpCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfZGVwdGhzIDgsIDE2KQotCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19QQUxFVFRFCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19DT0xPUgotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfQUxQSEEKLQotICAgIGludGVybGFjZV90eXBlIC0gUE5HX0lOVEVSTEFDRV9OT05FIG9yCi0gICAgICAgICAgICAgICAgICAgICBQTkdfSU5URVJMQUNFX0FEQU03Ci0gICAgY29tcHJlc3Npb25fdHlwZSAtIChtdXN0IGJlCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9ERUZBVUxUKQotICAgIGZpbHRlcl9tZXRob2QgIC0gKG11c3QgYmUgUE5HX0ZJTFRFUl9UWVBFX0RFRkFVTFQKLSAgICAgICAgICAgICAgICAgICAgIG9yLCBpZiB5b3UgYXJlIHdyaXRpbmcgYSBQTkcgdG8KLSAgICAgICAgICAgICAgICAgICAgIGJlIGVtYmVkZGVkIGluIGEgTU5HIGRhdGFzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBjYW4gYWxzbyBiZQotICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HKQotCi1JZiB5b3UgY2FsbCBwbmdfc2V0X0lIRFIoKSwgdGhlIGNhbGwgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSBvZiB0aGUKLW90aGVyIHBuZ19zZXRfKigpIGZ1bmN0aW9ucywgYmVjYXVzZSB0aGV5IG1pZ2h0IHJlcXVpcmUgYWNjZXNzIHRvIHNvbWUgb2YKLXRoZSBJSERSIHNldHRpbmdzLiAgVGhlIHJlbWFpbmluZyBwbmdfc2V0XyooKSBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZAotaW4gYW55IG9yZGVyLgotCi1JZiB5b3Ugd2lzaCwgeW91IGNhbiByZXNldCB0aGUgY29tcHJlc3Npb25fdHlwZSwgaW50ZXJsYWNlX3R5cGUsIG9yCi1maWx0ZXJfbWV0aG9kIGxhdGVyIGJ5IGNhbGxpbmcgcG5nX3NldF9JSERSKCkgYWdhaW47IGlmIHlvdSBkbyB0aGlzLCB0aGUKLXdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwgYW5kIGNvbG9yX3R5cGUgbXVzdCBiZSB0aGUgc2FtZSBpbiBlYWNoIGNhbGwuCi0KLSAgICBwbmdfc2V0X1BMVEUocG5nX3B0ciwgaW5mb19wdHIsIHBhbGV0dGUsCi0gICAgICAgbnVtX3BhbGV0dGUpOwotICAgIHBhbGV0dGUgICAgICAgIC0gdGhlIHBhbGV0dGUgZm9yIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAoYXJyYXkgb2YgcG5nX2NvbG9yKQotICAgIG51bV9wYWxldHRlICAgIC0gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHBhbGV0dGUKLQotICAgIHBuZ19zZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgZ2FtbWEpOwotICAgIGdhbW1hICAgICAgICAgIC0gdGhlIGdhbW1hIHRoZSBpbWFnZSB3YXMgY3JlYXRlZAotICAgICAgICAgICAgICAgICAgICAgYXQgKFBOR19JTkZPX2dBTUEpCi0KLSAgICBwbmdfc2V0X3NSR0IocG5nX3B0ciwgaW5mb19wdHIsIHNyZ2JfaW50ZW50KTsKLSAgICBzcmdiX2ludGVudCAgICAtIHRoZSByZW5kZXJpbmcgaW50ZW50Ci0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fc1JHQikgVGhlIHByZXNlbmNlIG9mCi0gICAgICAgICAgICAgICAgICAgICB0aGUgc1JHQiBjaHVuayBtZWFucyB0aGF0IHRoZSBwaXhlbAotICAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyBpbiB0aGUgc1JHQiBjb2xvciBzcGFjZS4KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2h1bmsgYWxzbyBpbXBsaWVzIHNwZWNpZmljCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgb2YgZ0FNQSBhbmQgY0hSTS4gIFJlbmRlcmluZwotICAgICAgICAgICAgICAgICAgICAgaW50ZW50IGlzIHRoZSBDU1MtMSBwcm9wZXJ0eSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBkZWZpbmVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICBDb2xvciBDb25zb3J0aXVtCi0gICAgICAgICAgICAgICAgICAgICAoaHR0cDovL3d3dy5jb2xvci5vcmcpLgotICAgICAgICAgICAgICAgICAgICAgSXQgY2FuIGJlIG9uZSBvZgotICAgICAgICAgICAgICAgICAgICAgUE5HX3NSR0JfSU5URU5UX1NBVFVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICBQTkdfc1JHQl9JTlRFTlRfUEVSQ0VQVFVBTCwKLSAgICAgICAgICAgICAgICAgICAgIFBOR19zUkdCX0lOVEVOVF9BQlNPTFVURSwgb3IKLSAgICAgICAgICAgICAgICAgICAgIFBOR19zUkdCX0lOVEVOVF9SRUxBVElWRS4KLQotCi0gICAgcG5nX3NldF9zUkdCX2dBTUFfYW5kX2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgc3JnYl9pbnRlbnQpOwotICAgIHNyZ2JfaW50ZW50ICAgIC0gdGhlIHJlbmRlcmluZyBpbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19zUkdCKSBUaGUgcHJlc2VuY2Ugb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICBzUkdCIGNodW5rIG1lYW5zIHRoYXQgdGhlIHBpeGVsCi0gICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIGluIHRoZSBzUkdCIGNvbG9yIHNwYWNlLgotICAgICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbHNvIGNhdXNlcyBnQU1BIGFuZAotICAgICAgICAgICAgICAgICAgICAgY0hSTSBjaHVua3Mgd2l0aCB0aGUgc3BlY2lmaWMgdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICB0aGF0IGFyZSBjb25zaXN0ZW50IHdpdGggc1JHQiB0byBiZQotICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbi4KLQotICAgIHBuZ19zZXRfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgbmFtZSwgY29tcHJlc3Npb25fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLCBwcm9mbGVuKTsKLSAgICBuYW1lICAgICAgICAgICAgIC0gVGhlIHByb2ZpbGUgbmFtZS4KLSAgICBjb21wcmVzc2lvbl90eXBlIC0gVGhlIGNvbXByZXNzaW9uIHR5cGU7IGFsd2F5cwotICAgICAgICAgICAgICAgICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFIGZvciBQTkcgMS4wLgotICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IGdpdmUgTlVMTCB0byB0aGlzIGFyZ3VtZW50IHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZSBpdC4KLSAgICBwcm9maWxlICAgICAgICAgIC0gSW50ZXJuYXRpb25hbCBDb2xvciBDb25zb3J0aXVtIGNvbG9yCi0gICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgZGF0YS4gTWF5IGNvbnRhaW4gTlVMcy4KLSAgICBwcm9mbGVuICAgICAgICAgIC0gbGVuZ3RoIG9mIHByb2ZpbGUgZGF0YSBpbiBieXRlcy4KLQotICAgIHBuZ19zZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgc2lnX2JpdCk7Ci0gICAgc2lnX2JpdCAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMgZm9yCi0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fc0JJVCkgZWFjaCBvZiB0aGUgZ3JheSwgcmVkLAotICAgICAgICAgICAgICAgICAgICAgZ3JlZW4sIGFuZCBibHVlIGNoYW5uZWxzLCB3aGljaGV2ZXIgYXJlCi0gICAgICAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBmb3IgdGhlIGdpdmVuIGNvbG9yIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgIChwbmdfY29sb3JfMTYpCi0KLSAgICBwbmdfc2V0X3RSTlMocG5nX3B0ciwgaW5mb19wdHIsIHRyYW5zX2FscGhhLAotICAgICAgIG51bV90cmFucywgdHJhbnNfY29sb3IpOwotICAgIHRyYW5zX2FscGhhICAgIC0gYXJyYXkgb2YgYWxwaGEgKHRyYW5zcGFyZW5jeSkKLSAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMgZm9yIHBhbGV0dGUgKFBOR19JTkZPX3RSTlMpCi0gICAgdHJhbnNfY29sb3IgICAgLSBncmF5bGV2ZWwgb3IgY29sb3Igc2FtcGxlIHZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgKGluIG9yZGVyIHJlZCwgZ3JlZW4sIGJsdWUpIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgc2luZ2xlIHRyYW5zcGFyZW50IGNvbG9yIGZvcgotICAgICAgICAgICAgICAgICAgICAgbm9uLXBhbGV0dGVkIGltYWdlcyAoUE5HX0lORk9fdFJOUykKLSAgICBudW1fdHJhbnMgICAgICAtIG51bWJlciBvZiB0cmFuc3BhcmVudCBlbnRyaWVzCi0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fdFJOUykKLQotICAgIHBuZ19zZXRfaElTVChwbmdfcHRyLCBpbmZvX3B0ciwgaGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19oSVNUKQotICAgIGhpc3QgICAgICAgICAgIC0gaGlzdG9ncmFtIG9mIHBhbGV0dGUgKGFycmF5IG9mCi0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNikKLQotICAgIHBuZ19zZXRfdElNRShwbmdfcHRyLCBpbmZvX3B0ciwgbW9kX3RpbWUpOwotICAgIG1vZF90aW1lICAgICAgIC0gdGltZSBpbWFnZSB3YXMgbGFzdCBtb2RpZmllZAotICAgICAgICAgICAgICAgICAgICAgKFBOR19WQUxJRF90SU1FKQotCi0gICAgcG5nX3NldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCBiYWNrZ3JvdW5kKTsKLSAgICBiYWNrZ3JvdW5kICAgICAtIGJhY2tncm91bmQgY29sb3IgKG9mIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19jb2xvcl8xNnApIChQTkdfVkFMSURfYktHRCkKLQotICAgIHBuZ19zZXRfdGV4dChwbmdfcHRyLCBpbmZvX3B0ciwgdGV4dF9wdHIsIG51bV90ZXh0KTsKLSAgICB0ZXh0X3B0ciAgICAgICAtIGFycmF5IG9mIHBuZ190ZXh0IGhvbGRpbmcgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzCi0gICAgdGV4dF9wdHJbaV0uY29tcHJlc3Npb24gLSB0eXBlIG9mIGNvbXByZXNzaW9uIHVzZWQKLSAgICAgICAgICAgICAgICAgb24gInRleHQiIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX05PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX3pUWHQKLSAgICB0ZXh0X3B0cltpXS5rZXkgICAtIGtleXdvcmQgZm9yIGNvbW1lbnQuICBNdXN0IGNvbnRhaW4KLSAgICAgICAgICAgICAgICAgMS03OSBjaGFyYWN0ZXJzLgotICAgIHRleHRfcHRyW2ldLnRleHQgIC0gdGV4dCBjb21tZW50cyBmb3IgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQuICBDYW4gYmUgTlVMTCBvciBlbXB0eS4KLSAgICB0ZXh0X3B0cltpXS50ZXh0X2xlbmd0aCAtIGxlbmd0aCBvZiB0ZXh0IHN0cmluZywKLSAgICAgICAgICAgICAgICAgYWZ0ZXIgZGVjb21wcmVzc2lvbiwgMCBmb3IgaVRYdAotICAgIHRleHRfcHRyW2ldLml0eHRfbGVuZ3RoIC0gbGVuZ3RoIG9mIGl0eHQgc3RyaW5nLAotICAgICAgICAgICAgICAgICBhZnRlciBkZWNvbXByZXNzaW9uLCAwIGZvciB0RVh0L3pUWHQKLSAgICB0ZXh0X3B0cltpXS5sYW5nICAtIGxhbmd1YWdlIG9mIGNvbW1lbnQgKE5VTEwgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSBmb3IgdW5rbm93bikuCi0gICAgdGV4dF9wdHJbaV0udHJhbnNsYXRlZF9rZXl3b3JkICAtIGtleXdvcmQgaW4gVVRGLTggKE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICBvciBlbXB0eSBmb3IgdW5rbm93bikuCi0gICAgTm90ZSB0aGF0IHRoZSBpdHh0X2xlbmd0aCwgbGFuZywgYW5kIGxhbmdfa2V5Ci0gICAgbWVtYmVycyBvZiB0aGUgdGV4dF9wdHIgc3RydWN0dXJlIG9ubHkgZXhpc3QKLSAgICB3aGVuIHRoZSBsaWJyYXJ5IGlzIGJ1aWx0IHdpdGggaVRYdCBjaHVuayBzdXBwb3J0LgotCi0gICAgbnVtX3RleHQgICAgICAgLSBudW1iZXIgb2YgY29tbWVudHMKLQotICAgIHBuZ19zZXRfc1BMVChwbmdfcHRyLCBpbmZvX3B0ciwgJnBhbGV0dGVfcHRyLAotICAgICAgIG51bV9zcGFsZXR0ZXMpOwotICAgIHBhbGV0dGVfcHRyICAgIC0gYXJyYXkgb2YgcG5nX3NQTFRfc3RydWN0IHN0cnVjdHVyZXMKLSAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHBhbGV0dGVzCi0gICAgICAgICAgICAgICAgICAgICBpbiB0aGUgaW5mbyBzdHJ1Y3R1cmUuCi0gICAgbnVtX3NwYWxldHRlcyAgLSBudW1iZXIgb2YgcGFsZXR0ZSBzdHJ1Y3R1cmVzIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICBhZGRlZC4KLQotICAgIHBuZ19zZXRfb0ZGcyhwbmdfcHRyLCBpbmZvX3B0ciwgb2Zmc2V0X3gsIG9mZnNldF95LAotICAgICAgICB1bml0X3R5cGUpOwotICAgIG9mZnNldF94ICAtIHBvc2l0aXZlIG9mZnNldCBmcm9tIHRoZSBsZWZ0Ci0gICAgICAgICAgICAgICAgICAgICBlZGdlIG9mIHRoZSBzY3JlZW4KLSAgICBvZmZzZXRfeSAgLSBwb3NpdGl2ZSBvZmZzZXQgZnJvbSB0aGUgdG9wCi0gICAgICAgICAgICAgICAgICAgICBlZGdlIG9mIHRoZSBzY3JlZW4KLSAgICB1bml0X3R5cGUgLSBQTkdfT0ZGU0VUX1BJWEVMLCBQTkdfT0ZGU0VUX01JQ1JPTUVURVIKLQotICAgIHBuZ19zZXRfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgcmVzX3gsIHJlc195LAotICAgICAgICB1bml0X3R5cGUpOwotICAgIHJlc194ICAgICAgIC0gcGl4ZWxzL3VuaXQgcGh5c2ljYWwgcmVzb2x1dGlvbgotICAgICAgICAgICAgICAgICAgaW4geCBkaXJlY3Rpb24KLSAgICByZXNfeSAgICAgICAtIHBpeGVscy91bml0IHBoeXNpY2FsIHJlc29sdXRpb24KLSAgICAgICAgICAgICAgICAgIGluIHkgZGlyZWN0aW9uCi0gICAgdW5pdF90eXBlICAgLSBQTkdfUkVTT0xVVElPTl9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgUE5HX1JFU09MVVRJT05fTUVURVIKLQotICAgIHBuZ19zZXRfc0NBTChwbmdfcHRyLCBpbmZvX3B0ciwgdW5pdCwgd2lkdGgsIGhlaWdodCkKLSAgICB1bml0ICAgICAgICAtIHBoeXNpY2FsIHNjYWxlIHVuaXRzIChhbiBpbnRlZ2VyKQotICAgIHdpZHRoICAgICAgIC0gd2lkdGggb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cwotICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLSAgICAgICAgICAgICAgICAgICh3aWR0aCBhbmQgaGVpZ2h0IGFyZSBkb3VibGVzKQotCi0gICAgcG5nX3NldF9zQ0FMX3MocG5nX3B0ciwgaW5mb19wdHIsIHVuaXQsIHdpZHRoLCBoZWlnaHQpCi0gICAgdW5pdCAgICAgICAgLSBwaHlzaWNhbCBzY2FsZSB1bml0cyAoYW4gaW50ZWdlcikKLSAgICB3aWR0aCAgICAgICAtIHdpZHRoIG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLSAgICBoZWlnaHQgICAgICAtIGhlaWdodCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCi0gICAgICAgICAgICAgICAgICh3aWR0aCBhbmQgaGVpZ2h0IGFyZSBzdHJpbmdzIGxpa2UgIjIuNTQiKQotCi0gICAgcG5nX3NldF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBpbmZvX3B0ciwgJnVua25vd25zLAotICAgICAgIG51bV91bmtub3ducykKLSAgICB1bmtub3ducyAgICAgICAgICAtIGFycmF5IG9mIHBuZ191bmtub3duX2NodW5rCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGhvbGRpbmcgdW5rbm93biBjaHVua3MKLSAgICB1bmtub3duc1tpXS5uYW1lICAtIG5hbWUgb2YgdW5rbm93biBjaHVuawotICAgIHVua25vd25zW2ldLmRhdGEgIC0gZGF0YSBvZiB1bmtub3duIGNodW5rCi0gICAgdW5rbm93bnNbaV0uc2l6ZSAgLSBzaXplIG9mIHVua25vd24gY2h1bmsncyBkYXRhCi0gICAgdW5rbm93bnNbaV0ubG9jYXRpb24gLSBwb3NpdGlvbiB0byB3cml0ZSBjaHVuayBpbiBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBkbyBub3Qgd3JpdGUgY2h1bmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19IQVZFX0lIRFI6IGJlZm9yZSBQTFRFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSEFWRV9QTFRFOiBiZWZvcmUgSURBVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0FGVEVSX0lEQVQ6IGFmdGVyIElEQVQKLQotVGhlICJsb2NhdGlvbiIgbWVtYmVyIGlzIHNldCBhdXRvbWF0aWNhbGx5IGFjY29yZGluZyB0bwotd2hhdCBwYXJ0IG9mIHRoZSBvdXRwdXQgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uCi1Zb3UgY2FuIGNoYW5nZSBpdHMgdmFsdWUgYWZ0ZXIgY2FsbGluZyBwbmdfc2V0X3Vua25vd25fY2h1bmtzKCkKLWFzIGRlbW9uc3RyYXRlZCBpbiBwbmd0ZXN0LmMuICBXaXRoaW4gZWFjaCBvZiB0aGUgImxvY2F0aW9ucyIsCi10aGUgY2h1bmtzIGFyZSBzZXF1ZW5jZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHBvc2l0aW9uIGluIHRoZQotc3RydWN0dXJlICh0aGF0IGlzLCB0aGUgdmFsdWUgb2YgImkiLCB3aGljaCBpcyB0aGUgb3JkZXIgaW4gd2hpY2gKLXRoZSBjaHVuayB3YXMgZWl0aGVyIHJlYWQgZnJvbSB0aGUgaW5wdXQgZmlsZSBvciBkZWZpbmVkIHdpdGgKLXBuZ19zZXRfdW5rbm93bl9jaHVua3MpLgotCi1BIHF1aWNrIHdvcmQgYWJvdXQgdGV4dCBhbmQgbnVtX3RleHQuICB0ZXh0IGlzIGFuIGFycmF5IG9mIHBuZ190ZXh0Ci1zdHJ1Y3R1cmVzLiAgbnVtX3RleHQgaXMgdGhlIG51bWJlciBvZiB2YWxpZCBzdHJ1Y3R1cmVzIGluIHRoZSBhcnJheS4KLUVhY2ggcG5nX3RleHQgc3RydWN0dXJlIGhvbGRzIGEgbGFuZ3VhZ2UgY29kZSwgYSBrZXl3b3JkLCBhIHRleHQgdmFsdWUsCi1hbmQgYSBjb21wcmVzc2lvbiB0eXBlLgotCi1UaGUgY29tcHJlc3Npb24gdHlwZXMgaGF2ZSB0aGUgc2FtZSB2YWxpZCBudW1iZXJzIGFzIHRoZSBjb21wcmVzc2lvbgotdHlwZXMgb2YgdGhlIGltYWdlIGRhdGEuICBDdXJyZW50bHksIHRoZSBvbmx5IHZhbGlkIG51bWJlciBpcyB6ZXJvLgotSG93ZXZlciwgeW91IGNhbiBzdG9yZSB0ZXh0IGVpdGhlciBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZCwgdW5saWtlCi1pbWFnZXMsIHdoaWNoIGFsd2F5cyBoYXZlIHRvIGJlIGNvbXByZXNzZWQuICBTbyBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUKLXRleHQgY29tcHJlc3NlZCwgc2V0IHRoZSBjb21wcmVzc2lvbiB0eXBlIHRvIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUuCi1CZWNhdXNlIHRFWHQgYW5kIHpUWHQgY2h1bmtzIGRvbid0IGhhdmUgYSBsYW5ndWFnZSBmaWVsZCwgaWYgeW91Ci1zcGVjaWZ5IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUgb3IgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdAotYW55IGxhbmd1YWdlIGNvZGUgb3IgdHJhbnNsYXRlZCBrZXl3b3JkIHdpbGwgbm90IGJlIHdyaXR0ZW4gb3V0LgotCi1VbnRpbCB0ZXh0IGdldHMgYXJvdW5kIDEwMDAgYnl0ZXMsIGl0IGlzIG5vdCB3b3J0aCBjb21wcmVzc2luZyBpdC4KLUFmdGVyIHRoZSB0ZXh0IGhhcyBiZWVuIHdyaXR0ZW4gb3V0IHRvIHRoZSBmaWxlLCB0aGUgY29tcHJlc3Npb24gdHlwZQotaXMgc2V0IHRvIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1Igb3IgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdF9XUiwKLXNvIHRoYXQgaXQgaXNuJ3Qgd3JpdHRlbiBvdXQgYWdhaW4gYXQgdGhlIGVuZCAoaW4gY2FzZSB5b3UgYXJlIGNhbGxpbmcKLXBuZ193cml0ZV9lbmQoKSB3aXRoIHRoZSBzYW1lIHN0cnVjdC4KLQotVGhlIGtleXdvcmRzIHRoYXQgYXJlIGdpdmVuIGluIHRoZSBQTkcgU3BlY2lmaWNhdGlvbiBhcmU6Ci0KLSAgICBUaXRsZSAgICAgICAgICAgIFNob3J0IChvbmUgbGluZSkgdGl0bGUgb3IKLSAgICAgICAgICAgICAgICAgICAgIGNhcHRpb24gZm9yIGltYWdlCi0gICAgQXV0aG9yICAgICAgICAgICBOYW1lIG9mIGltYWdlJ3MgY3JlYXRvcgotICAgIERlc2NyaXB0aW9uICAgICAgRGVzY3JpcHRpb24gb2YgaW1hZ2UgKHBvc3NpYmx5IGxvbmcpCi0gICAgQ29weXJpZ2h0ICAgICAgICBDb3B5cmlnaHQgbm90aWNlCi0gICAgQ3JlYXRpb24gVGltZSAgICBUaW1lIG9mIG9yaWdpbmFsIGltYWdlIGNyZWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAodXN1YWxseSBSRkMgMTEyMyBmb3JtYXQsIHNlZSBiZWxvdykKLSAgICBTb2Z0d2FyZSAgICAgICAgIFNvZnR3YXJlIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZQotICAgIERpc2NsYWltZXIgICAgICAgTGVnYWwgZGlzY2xhaW1lcgotICAgIFdhcm5pbmcgICAgICAgICAgV2FybmluZyBvZiBuYXR1cmUgb2YgY29udGVudAotICAgIFNvdXJjZSAgICAgICAgICAgRGV2aWNlIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZQotICAgIENvbW1lbnQgICAgICAgICAgTWlzY2VsbGFuZW91cyBjb21tZW50OyBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICBmcm9tIG90aGVyIGltYWdlIGZvcm1hdAotCi1UaGUga2V5d29yZC10ZXh0IHBhaXJzIHdvcmsgbGlrZSB0aGlzLiAgS2V5d29yZHMgc2hvdWxkIGJlIHNob3J0Ci1zaW1wbGUgZGVzY3JpcHRpb25zIG9mIHdoYXQgdGhlIGNvbW1lbnQgaXMgYWJvdXQuICBTb21lIHR5cGljYWwKLWtleXdvcmRzIGFyZSBmb3VuZCBpbiB0aGUgUE5HIHNwZWNpZmljYXRpb24sIGFzIGlzIHNvbWUgcmVjb21tZW5kYXRpb25zCi1vbiBrZXl3b3Jkcy4gIFlvdSBjYW4gcmVwZWF0IGtleXdvcmRzIGluIGEgZmlsZS4gIFlvdSBjYW4gZXZlbiB3cml0ZQotc29tZSB0ZXh0IGJlZm9yZSB0aGUgaW1hZ2UgYW5kIHNvbWUgYWZ0ZXIuICBGb3IgZXhhbXBsZSwgeW91IG1heSB3YW50Ci10byBwdXQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgaW1hZ2UgYmVmb3JlIHRoZSBpbWFnZSwgYnV0IGxlYXZlIHRoZQotZGlzY2xhaW1lciB1bnRpbCBhZnRlciwgc28gdmlld2VycyB3b3JraW5nIG92ZXIgbW9kZW0gY29ubmVjdGlvbnMKLWRvbid0IGhhdmUgdG8gd2FpdCBmb3IgdGhlIGRpc2NsYWltZXIgdG8gZ28gb3ZlciB0aGUgbW9kZW0gYmVmb3JlCi10aGV5IHN0YXJ0IHNlZWluZyB0aGUgaW1hZ2UuICBGaW5hbGx5LCBrZXl3b3JkcyBzaG91bGQgYmUgZnVsbAotd29yZHMsIG5vdCBhYmJyZXZpYXRpb25zLiAgS2V5d29yZHMgYW5kIHRleHQgYXJlIGluIHRoZSBJU08gODg1OS0xCi0oTGF0aW4tMSkgY2hhcmFjdGVyIHNldCAoYSBzdXBlcnNldCBvZiByZWd1bGFyIEFTQ0lJKSBhbmQgY2FuIG5vdAotY29udGFpbiBOVUwgY2hhcmFjdGVycywgYW5kIHNob3VsZCBub3QgY29udGFpbiBjb250cm9sIG9yIG90aGVyCi11bnByaW50YWJsZSBjaGFyYWN0ZXJzLiAgVG8gbWFrZSB0aGUgY29tbWVudHMgd2lkZWx5IHJlYWRhYmxlLCBzdGljawotd2l0aCBiYXNpYyBBU0NJSSwgYW5kIGF2b2lkIG1hY2hpbmUgc3BlY2lmaWMgY2hhcmFjdGVyIHNldCBleHRlbnNpb25zCi1saWtlIHRoZSBJQk0tUEMgY2hhcmFjdGVyIHNldC4gIFRoZSBrZXl3b3JkIG11c3QgYmUgcHJlc2VudCwgYnV0Ci15b3UgY2FuIGxlYXZlIG9mZiB0aGUgdGV4dCBzdHJpbmcgb24gbm9uLWNvbXByZXNzZWQgcGFpcnMuCi1Db21wcmVzc2VkIHBhaXJzIG11c3QgaGF2ZSBhIHRleHQgc3RyaW5nLCBhcyBvbmx5IHRoZSB0ZXh0IHN0cmluZwotaXMgY29tcHJlc3NlZCBhbnl3YXksIHNvIHRoZSBjb21wcmVzc2lvbiB3b3VsZCBiZSBtZWFuaW5nbGVzcy4KLQotUE5HIHN1cHBvcnRzIG1vZGlmaWNhdGlvbiB0aW1lIHZpYSB0aGUgcG5nX3RpbWUgc3RydWN0dXJlLiAgVHdvCi1jb252ZXJzaW9uIHJvdXRpbmVzIGFyZSBwcm92aWRlZCwgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBmb3IKLXRpbWVfdCBhbmQgcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0oKSBmb3Igc3RydWN0IHRtLiAgVGhlCi10aW1lX3Qgcm91dGluZSB1c2VzIGdtdGltZSgpLiAgWW91IGRvbid0IGhhdmUgdG8gdXNlIGVpdGhlciBvZgotdGhlc2UsIGJ1dCBpZiB5b3Ugd2lzaCB0byBmaWxsIGluIHRoZSBwbmdfdGltZSBzdHJ1Y3R1cmUgZGlyZWN0bHksCi15b3Ugc2hvdWxkIHByb3ZpZGUgdGhlIHRpbWUgaW4gdW5pdmVyc2FsIHRpbWUgKEdNVCkgaWYgcG9zc2libGUKLWluc3RlYWQgb2YgeW91ciBsb2NhbCB0aW1lLiAgTm90ZSB0aGF0IHRoZSB5ZWFyIG51bWJlciBpcyB0aGUgZnVsbAoteWVhciAoZS5nLiAxOTk4LCByYXRoZXIgdGhhbiA5OCAtIFBORyBpcyB5ZWFyIDIwMDAgY29tcGxpYW50ISksIGFuZAotdGhhdCBtb250aHMgc3RhcnQgd2l0aCAxLgotCi1JZiB5b3Ugd2FudCB0byBzdG9yZSB0aGUgdGltZSBvZiB0aGUgb3JpZ2luYWwgaW1hZ2UgY3JlYXRpb24sIHlvdSBzaG91bGQKLXVzZSBhIHBsYWluIHRFWHQgY2h1bmsgd2l0aCB0aGUgIkNyZWF0aW9uIFRpbWUiIGtleXdvcmQuICBUaGlzIGlzCi1uZWNlc3NhcnkgYmVjYXVzZSB0aGUgImNyZWF0aW9uIHRpbWUiIG9mIGEgUE5HIGltYWdlIGlzIHNvbWV3aGF0IHZhZ3VlLAotZGVwZW5kaW5nIG9uIHdoZXRoZXIgeW91IG1lYW4gdGhlIFBORyBmaWxlLCB0aGUgdGltZSB0aGUgaW1hZ2Ugd2FzCi1jcmVhdGVkIGluIGEgbm9uLVBORyBmb3JtYXQsIGEgc3RpbGwgcGhvdG8gZnJvbSB3aGljaCB0aGUgaW1hZ2Ugd2FzCi1zY2FubmVkLCBvciBwb3NzaWJseSB0aGUgc3ViamVjdCBtYXR0ZXIgaXRzZWxmLiAgSW4gb3JkZXIgdG8gZmFjaWxpdGF0ZQotbWFjaGluZS1yZWFkYWJsZSBkYXRlcywgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgIkNyZWF0aW9uIFRpbWUiCi10RVh0IGNodW5rIHVzZSBSRkMgMTEyMyBmb3JtYXQgZGF0ZXMgKGUuZy4gIjIyIE1heSAxOTk3IDE4OjA3OjEwIEdNVCIpLAotYWx0aG91Z2ggdGhpcyBpc24ndCBhIHJlcXVpcmVtZW50LiAgVW5saWtlIHRoZSB0SU1FIGNodW5rLCB0aGUKLSJDcmVhdGlvbiBUaW1lIiB0RVh0IGNodW5rIGlzIG5vdCBleHBlY3RlZCB0byBiZSBhdXRvbWF0aWNhbGx5IGNoYW5nZWQKLWJ5IHRoZSBzb2Z0d2FyZS4gIFRvIGZhY2lsaXRhdGUgdGhlIHVzZSBvZiBSRkMgMTEyMyBkYXRlcywgYSBmdW5jdGlvbgotcG5nX2NvbnZlcnRfdG9fcmZjMTEyMyhwbmdfdGltZXApIGlzIHByb3ZpZGVkIHRvIGNvbnZlcnQgZnJvbSBQTkcKLXRpbWUgdG8gYW4gUkZDIDExMjMgZm9ybWF0IHN0cmluZy4KLQotV3JpdGluZyB1bmtub3duIGNodW5rcwotCi1Zb3UgY2FuIHVzZSB0aGUgcG5nX3NldF91bmtub3duX2NodW5rcyBmdW5jdGlvbiB0byBxdWV1ZSB1cCBjaHVua3MKLWZvciB3cml0aW5nLiAgWW91IGdpdmUgaXQgYSBjaHVuayBuYW1lLCByYXcgZGF0YSwgYW5kIGEgc2l6ZTsgdGhhdCdzCi1hbGwgdGhlcmUgaXMgdG8gaXQuICBUaGUgY2h1bmtzIHdpbGwgYmUgd3JpdHRlbiBieSB0aGUgbmV4dCBmb2xsb3dpbmcKLXBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFLCBwbmdfd3JpdGVfaW5mbywgb3IgcG5nX3dyaXRlX2VuZCBmdW5jdGlvbi4KLUFueSBjaHVua3MgcHJldmlvdXNseSByZWFkIGludG8gdGhlIGluZm8gc3RydWN0dXJlJ3MgdW5rbm93bi1jaHVuawotbGlzdCB3aWxsIGFsc28gYmUgd3JpdHRlbiBvdXQgaW4gYSBzZXF1ZW5jZSB0aGF0IHNhdGlzZmllcyB0aGUgUE5HCi1zcGVjaWZpY2F0aW9uJ3Mgb3JkZXJpbmcgcnVsZXMuCi0KLVRoZSBoaWdoLWxldmVsIHdyaXRlIGludGVyZmFjZQotCi1BdCB0aGlzIHBvaW50IHRoZXJlIGFyZSB0d28gd2F5cyB0byBwcm9jZWVkOyB0aHJvdWdoIHRoZSBoaWdoLWxldmVsCi13cml0ZSBpbnRlcmZhY2UsIG9yIHRocm91Z2ggYSBzZXF1ZW5jZSBvZiBsb3ctbGV2ZWwgd3JpdGUgb3BlcmF0aW9ucy4KLVlvdSBjYW4gdXNlIHRoZSBoaWdoLWxldmVsIGludGVyZmFjZSBpZiB5b3VyIGltYWdlIGRhdGEgaXMgcHJlc2VudAotaW4gdGhlIGluZm8gc3RydWN0dXJlLiAgQWxsIGRlZmluZWQgb3V0cHV0Ci10cmFuc2Zvcm1hdGlvbnMgYXJlIHBlcm1pdHRlZCwgZW5hYmxlZCBieSB0aGUgZm9sbG93aW5nIG1hc2tzLgotCi0gICAgUE5HX1RSQU5TRk9STV9JREVOVElUWSAgICAgIE5vIHRyYW5zZm9ybWF0aW9uCi0gICAgUE5HX1RSQU5TRk9STV9QQUNLSU5HICAgICAgIFBhY2sgMSwgMiBhbmQgNC1iaXQgc2FtcGxlcwotICAgIFBOR19UUkFOU0ZPUk1fUEFDS1NXQVAgICAgICBDaGFuZ2Ugb3JkZXIgb2YgcGFja2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVscyB0byBMU0IgZmlyc3QKLSAgICBQTkdfVFJBTlNGT1JNX0lOVkVSVF9NT05PICAgSW52ZXJ0IG1vbm9jaHJvbWUgaW1hZ2VzCi0gICAgUE5HX1RSQU5TRk9STV9TSElGVCAgICAgICAgIE5vcm1hbGl6ZSBwaXhlbHMgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNCSVQgZGVwdGgKLSAgICBQTkdfVFJBTlNGT1JNX0JHUiAgICAgICAgICAgRmxpcCBSR0IgdG8gQkdSLCBSR0JBCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIEJHUkEKLSAgICBQTkdfVFJBTlNGT1JNX1NXQVBfQUxQSEEgICAgRmxpcCBSR0JBIHRvIEFSR0Igb3IgR0EKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQUcKLSAgICBQTkdfVFJBTlNGT1JNX0lOVkVSVF9BTFBIQSAgQ2hhbmdlIGFscGhhIGZyb20gb3BhY2l0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0cmFuc3BhcmVuY3kKLSAgICBQTkdfVFJBTlNGT1JNX1NXQVBfRU5ESUFOICAgQnl0ZS1zd2FwIDE2LWJpdCBzYW1wbGVzCi0gICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVIgICAgICAgIFN0cmlwIG91dCBmaWxsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgKGRlcHJlY2F0ZWQpLgotICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0JFRk9SRSBTdHJpcCBvdXQgbGVhZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZXIgYnl0ZXMKLSAgICBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUl9BRlRFUiAgU3RyaXAgb3V0IHRyYWlsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlciBieXRlcwotCi1JZiB5b3UgaGF2ZSB2YWxpZCBpbWFnZSBkYXRhIGluIHRoZSBpbmZvIHN0cnVjdHVyZSAoeW91IGNhbiB1c2UKLXBuZ19zZXRfcm93cygpIHRvIHB1dCBpbWFnZSBkYXRhIGluIHRoZSBpbmZvIHN0cnVjdHVyZSksIHNpbXBseSBkbyB0aGlzOgotCi0gICAgcG5nX3dyaXRlX3BuZyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3RyYW5zZm9ybXMsIE5VTEwpCi0KLXdoZXJlIHBuZ190cmFuc2Zvcm1zIGlzIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiBzb21lIHNldCBvZgotdHJhbnNmb3JtYXRpb24gZmxhZ3MuICBUaGlzIGNhbGwgaXMgZXF1aXZhbGVudCB0byBwbmdfd3JpdGVfaW5mbygpLAotZm9sbG93ZWQgdGhlIHNldCBvZiB0cmFuc2Zvcm1hdGlvbnMgaW5kaWNhdGVkIGJ5IHRoZSB0cmFuc2Zvcm0gbWFzaywKLXRoZW4gcG5nX3dyaXRlX2ltYWdlKCksIGFuZCBmaW5hbGx5IHBuZ193cml0ZV9lbmQoKS4KLQotKFRoZSBmaW5hbCBwYXJhbWV0ZXIgb2YgdGhpcyBjYWxsIGlzIG5vdCB5ZXQgdXNlZC4gIFNvbWVkYXkgaXQgbWlnaHQgcG9pbnQKLXRvIHRyYW5zZm9ybWF0aW9uIHBhcmFtZXRlcnMgcmVxdWlyZWQgYnkgc29tZSBmdXR1cmUgb3V0cHV0IHRyYW5zZm9ybS4pCi0KLVlvdSBtdXN0IHVzZSBwbmdfdHJhbnNmb3JtcyBhbmQgbm90IGNhbGwgYW55IHBuZ19zZXRfdHJhbnNmb3JtKCkgZnVuY3Rpb25zCi13aGVuIHlvdSB1c2UgcG5nX3dyaXRlX3BuZygpLgotCi1UaGUgbG93LWxldmVsIHdyaXRlIGludGVyZmFjZQotCi1JZiB5b3UgYXJlIGdvaW5nIHRoZSBsb3ctbGV2ZWwgcm91dGUgaW5zdGVhZCwgeW91IGFyZSBub3cgcmVhZHkgdG8KLXdyaXRlIGFsbCB0aGUgZmlsZSBpbmZvcm1hdGlvbiB1cCB0byB0aGUgYWN0dWFsIGltYWdlIGRhdGEuICBZb3UgZG8KLXRoaXMgd2l0aCBhIGNhbGwgdG8gcG5nX3dyaXRlX2luZm8oKS4KLQotICAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotTm90ZSB0aGF0IHRoZXJlIGlzIG9uZSB0cmFuc2Zvcm1hdGlvbiB5b3UgbWF5IG5lZWQgdG8gZG8gYmVmb3JlCi1wbmdfd3JpdGVfaW5mbygpLiAgSW4gUE5HIGZpbGVzLCB0aGUgYWxwaGEgY2hhbm5lbCBpbiBhbiBpbWFnZSBpcyB0aGUKLWxldmVsIG9mIG9wYWNpdHkuICBJZiB5b3VyIGRhdGEgaXMgc3VwcGxpZWQgYXMgYSBsZXZlbCBvZiB0cmFuc3BhcmVuY3ksCi15b3UgY2FuIGludmVydCB0aGUgYWxwaGEgY2hhbm5lbCBiZWZvcmUgeW91IHdyaXRlIGl0LCBzbyB0aGF0IDAgaXMKLWZ1bGx5IHRyYW5zcGFyZW50IGFuZCAyNTUgKGluIDgtYml0IG9yIHBhbGV0dGVkIGltYWdlcykgb3IgNjU1MzUKLShpbiAxNi1iaXQgaW1hZ2VzKSBpcyBmdWxseSBvcGFxdWUsIHdpdGgKLQotICAgIHBuZ19zZXRfaW52ZXJ0X2FscGhhKHBuZ19wdHIpOwotCi1UaGlzIG11c3QgYXBwZWFyIGJlZm9yZSBwbmdfd3JpdGVfaW5mbygpIGluc3RlYWQgb2YgbGF0ZXIgd2l0aCB0aGUKLW90aGVyIHRyYW5zZm9ybWF0aW9ucyBiZWNhdXNlIGluIHRoZSBjYXNlIG9mIHBhbGV0dGVkIGltYWdlcyB0aGUgdFJOUwotY2h1bmsgZGF0YSBoYXMgdG8gYmUgaW52ZXJ0ZWQgYmVmb3JlIHRoZSB0Uk5TIGNodW5rIGlzIHdyaXR0ZW4uICBJZgoteW91ciBpbWFnZSBpcyBub3QgYSBwYWxldHRlZCBpbWFnZSwgdGhlIHRSTlMgZGF0YSAod2hpY2ggaW4gc3VjaCBjYXNlcwotcmVwcmVzZW50cyBhIHNpbmdsZSBjb2xvciB0byBiZSByZW5kZXJlZCBhcyB0cmFuc3BhcmVudCkgd29uJ3QgbmVlZCB0bwotYmUgY2hhbmdlZCwgYW5kIHlvdSBjYW4gc2FmZWx5IGRvIHRoaXMgdHJhbnNmb3JtYXRpb24gYWZ0ZXIgeW91cgotcG5nX3dyaXRlX2luZm8oKSBjYWxsLgotCi1JZiB5b3UgbmVlZCB0byB3cml0ZSBhIHByaXZhdGUgY2h1bmsgdGhhdCB5b3Ugd2FudCB0byBhcHBlYXIgYmVmb3JlCi10aGUgUExURSBjaHVuayB3aGVuIFBMVEUgaXMgcHJlc2VudCwgeW91IGNhbiB3cml0ZSB0aGUgUE5HIGluZm8gaW4KLXR3byBzdGVwcywgYW5kIGluc2VydCBjb2RlIHRvIHdyaXRlIHlvdXIgb3duIGNodW5rIGJldHdlZW4gdGhlbToKLQotICAgIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIGluZm9fcHRyLCAuLi4pOwotICAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotQWZ0ZXIgeW91J3ZlIHdyaXR0ZW4gdGhlIGZpbGUgaW5mb3JtYXRpb24sIHlvdSBjYW4gc2V0IHVwIHRoZSBsaWJyYXJ5Ci10byBoYW5kbGUgYW55IHNwZWNpYWwgdHJhbnNmb3JtYXRpb25zIG9mIHRoZSBpbWFnZSBkYXRhLiAgVGhlIHZhcmlvdXMKLXdheXMgdG8gdHJhbnNmb3JtIHRoZSBkYXRhIHdpbGwgYmUgZGVzY3JpYmVkIGluIHRoZSBvcmRlciB0aGF0IHRoZXkKLXNob3VsZCBvY2N1ci4gIFRoaXMgaXMgaW1wb3J0YW50LCBhcyBzb21lIG9mIHRoZXNlIGNoYW5nZSB0aGUgY29sb3IKLXR5cGUgYW5kL29yIGJpdCBkZXB0aCBvZiB0aGUgZGF0YSwgYW5kIHNvbWUgb3RoZXJzIG9ubHkgd29yayBvbgotY2VydGFpbiBjb2xvciB0eXBlcyBhbmQgYml0IGRlcHRocy4gIEV2ZW4gdGhvdWdoIGVhY2ggdHJhbnNmb3JtYXRpb24KLWNoZWNrcyB0byBzZWUgaWYgaXQgaGFzIGRhdGEgdGhhdCBpdCBjYW4gZG8gc29tZXRoaW5nIHdpdGgsIHlvdSBzaG91bGQKLW1ha2Ugc3VyZSB0byBvbmx5IGVuYWJsZSBhIHRyYW5zZm9ybWF0aW9uIGlmIGl0IHdpbGwgYmUgdmFsaWQgZm9yIHRoZQotZGF0YS4gIEZvciBleGFtcGxlLCBkb24ndCBzd2FwIHJlZCBhbmQgYmx1ZSBvbiBncmF5c2NhbGUgZGF0YS4KLQotUE5HIGZpbGVzIHN0b3JlIFJHQiBwaXhlbHMgcGFja2VkIGludG8gMyBvciA2IGJ5dGVzLiAgVGhpcyBjb2RlIHRlbGxzCi10aGUgbGlicmFyeSB0byBzdHJpcCBpbnB1dCBkYXRhIHRoYXQgaGFzIDQgb3IgOCBieXRlcyBwZXIgcGl4ZWwgZG93bgotdG8gMyBvciA2IGJ5dGVzIChvciBzdHJpcCAyIG9yIDQtYnl0ZSBncmF5c2NhbGUrZmlsbGVyIGRhdGEgdG8gMSBvciAyCi1ieXRlcyBwZXIgcGl4ZWwpLgotCi0gICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgMCwgUE5HX0ZJTExFUl9CRUZPUkUpOwotCi13aGVyZSB0aGUgMCBpcyB1bnVzZWQsIGFuZCB0aGUgbG9jYXRpb24gaXMgZWl0aGVyIFBOR19GSUxMRVJfQkVGT1JFIG9yCi1QTkdfRklMTEVSX0FGVEVSLCBkZXBlbmRpbmcgdXBvbiB3aGV0aGVyIHRoZSBmaWxsZXIgYnl0ZSBpbiB0aGUgcGl4ZWwKLWlzIHN0b3JlZCBYUkdCIG9yIFJHQlguCi0KLVBORyBmaWxlcyBwYWNrIHBpeGVscyBvZiBiaXQgZGVwdGhzIDEsIDIsIGFuZCA0IGludG8gYnl0ZXMgYXMgc21hbGwgYXMKLXRoZXkgY2FuLCByZXN1bHRpbmcgaW4sIGZvciBleGFtcGxlLCA4IHBpeGVscyBwZXIgYnl0ZSBmb3IgMSBiaXQgZmlsZXMuCi1JZiB0aGUgZGF0YSBpcyBzdXBwbGllZCBhdCAxIHBpeGVsIHBlciBieXRlLCB1c2UgdGhpcyBjb2RlLCB3aGljaCB3aWxsCi1jb3JyZWN0bHkgcGFjayB0aGUgcGl4ZWxzIGludG8gYSBzaW5nbGUgYnl0ZToKLQotICAgIHBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsKLQotUE5HIGZpbGVzIHJlZHVjZSBwb3NzaWJsZSBiaXQgZGVwdGhzIHRvIDEsIDIsIDQsIDgsIGFuZCAxNi4gIElmIHlvdXIKLWRhdGEgaXMgb2YgYW5vdGhlciBiaXQgZGVwdGgsIHlvdSBjYW4gd3JpdGUgYW4gc0JJVCBjaHVuayBpbnRvIHRoZQotZmlsZSBzbyB0aGF0IGRlY29kZXJzIGNhbiByZWNvdmVyIHRoZSBvcmlnaW5hbCBkYXRhIGlmIGRlc2lyZWQuCi0KLSAgICAvKiBTZXQgdGhlIHRydWUgYml0IGRlcHRoIG9mIHRoZSBpbWFnZSBkYXRhICovCi0gICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKLSAgICB7Ci0gICAgICAgIHNpZ19iaXQucmVkID0gdHJ1ZV9iaXRfZGVwdGg7Ci0gICAgICAgIHNpZ19iaXQuZ3JlZW4gPSB0cnVlX2JpdF9kZXB0aDsKLSAgICAgICAgc2lnX2JpdC5ibHVlID0gdHJ1ZV9iaXRfZGVwdGg7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNpZ19iaXQuZ3JheSA9IHRydWVfYml0X2RlcHRoOwotICAgIH0KLSAgICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQotICAgIHsKLSAgICAgICAgc2lnX2JpdC5hbHBoYSA9IHRydWVfYml0X2RlcHRoOwotICAgIH0KLQotICAgIHBuZ19zZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpOwotCi1JZiB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIHJvdyBidWZmZXIgaW4gYSBiaXQgZGVwdGggb3RoZXIgdGhhbgotb25lIHN1cHBvcnRlZCBieSBQTkcgKGUuZy4gMyBiaXQgZGF0YSBpbiB0aGUgcmFuZ2UgMC03IGZvciBhIDQtYml0IFBORyksCi10aGlzIHdpbGwgc2NhbGUgdGhlIHZhbHVlcyB0byBhcHBlYXIgdG8gYmUgdGhlIGNvcnJlY3QgYml0IGRlcHRoIGFzCi1pcyByZXF1aXJlZCBieSBQTkcuCi0KLSAgICBwbmdfc2V0X3NoaWZ0KHBuZ19wdHIsICZzaWdfYml0KTsKLQotUE5HIGZpbGVzIHN0b3JlIDE2IGJpdCBwaXhlbHMgaW4gbmV0d29yayBieXRlIG9yZGVyIChiaWctZW5kaWFuLAotaWUuIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBmaXJzdCkuICBUaGlzIGNvZGUgd291bGQgYmUgdXNlZCBpZiB0aGV5IGFyZQotc3VwcGxpZWQgdGhlIG90aGVyIHdheSAobGl0dGxlLWVuZGlhbiwgaS5lLiBsZWFzdCBzaWduaWZpY2FudCBiaXRzCi1maXJzdCwgdGhlIHdheSBQQ3Mgc3RvcmUgdGhlbSk6Ci0KLSAgICBpZiAoYml0X2RlcHRoID4gOCkKLSAgICAgICBwbmdfc2V0X3N3YXAocG5nX3B0cik7Ci0KLUlmIHlvdSBhcmUgdXNpbmcgcGFja2VkLXBpeGVsIGltYWdlcyAoMSwgMiwgb3IgNCBiaXRzL3BpeGVsKSwgYW5kIHlvdQotbmVlZCB0byBjaGFuZ2UgdGhlIG9yZGVyIHRoZSBwaXhlbHMgYXJlIHBhY2tlZCBpbnRvIGJ5dGVzLCB5b3UgY2FuIHVzZToKLQotICAgIGlmIChiaXRfZGVwdGggPCA4KQotICAgICAgIHBuZ19zZXRfcGFja3N3YXAocG5nX3B0cik7Ci0KLVBORyBmaWxlcyBzdG9yZSAzIGNvbG9yIHBpeGVscyBpbiByZWQsIGdyZWVuLCBibHVlIG9yZGVyLiAgVGhpcyBjb2RlCi13b3VsZCBiZSB1c2VkIGlmIHRoZXkgYXJlIHN1cHBsaWVkIGFzIGJsdWUsIGdyZWVuLCByZWQ6Ci0KLSAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsKLQotUE5HIGZpbGVzIGRlc2NyaWJlIG1vbm9jaHJvbWUgYXMgYmxhY2sgYmVpbmcgemVybyBhbmQgd2hpdGUgYmVpbmcKLW9uZS4gVGhpcyBjb2RlIHdvdWxkIGJlIHVzZWQgaWYgdGhlIHBpeGVscyBhcmUgc3VwcGxpZWQgd2l0aCB0aGlzIHJldmVyc2VkCi0oYmxhY2sgYmVpbmcgb25lIGFuZCB3aGl0ZSBiZWluZyB6ZXJvKToKLQotICAgIHBuZ19zZXRfaW52ZXJ0X21vbm8ocG5nX3B0cik7Ci0KLUZpbmFsbHksIHlvdSBjYW4gd3JpdGUgeW91ciBvd24gdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gaWYgbm9uZSBvZgotdGhlIGV4aXN0aW5nIG9uZXMgbWVldHMgeW91ciBuZWVkcy4gIFRoaXMgaXMgZG9uZSBieSBzZXR0aW5nIGEgY2FsbGJhY2sKLXdpdGgKLQotICAgIHBuZ19zZXRfd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4ocG5nX3B0ciwKLSAgICAgICB3cml0ZV90cmFuc2Zvcm1fZm4pOwotCi1Zb3UgbXVzdCBzdXBwbHkgdGhlIGZ1bmN0aW9uCi0KLSAgICB2b2lkIHdyaXRlX3RyYW5zZm9ybV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wCi0gICAgICAgcm93X2luZm8sIHBuZ19ieXRlcCBkYXRhKQotCi1TZWUgcG5ndGVzdC5jIGZvciBhIHdvcmtpbmcgZXhhbXBsZS4gIFlvdXIgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKLWJlZm9yZSBhbnkgb2YgdGhlIG90aGVyIHRyYW5zZm9ybWF0aW9ucyBhcmUgcHJvY2Vzc2VkLgotCi1Zb3UgY2FuIGFsc28gc2V0IHVwIGEgcG9pbnRlciB0byBhIHVzZXIgc3RydWN0dXJlIGZvciB1c2UgYnkgeW91cgotY2FsbGJhY2sgZnVuY3Rpb24uCi0KLSAgICBwbmdfc2V0X3VzZXJfdHJhbnNmb3JtX2luZm8ocG5nX3B0ciwgdXNlcl9wdHIsIDAsIDApOwotCi1UaGUgdXNlcl9jaGFubmVscyBhbmQgdXNlcl9kZXB0aCBwYXJhbWV0ZXJzIG9mIHRoaXMgZnVuY3Rpb24gYXJlIGlnbm9yZWQKLXdoZW4gd3JpdGluZzsgeW91IGNhbiBzZXQgdGhlbSB0byB6ZXJvIGFzIHNob3duLgotCi1Zb3UgY2FuIHJldHJpZXZlIHRoZSBwb2ludGVyIHZpYSB0aGUgZnVuY3Rpb24gcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIoKS4KLUZvciBleGFtcGxlOgotCi0gICAgdm9pZHAgd3JpdGVfdXNlcl90cmFuc2Zvcm1fcHRyID0KLSAgICAgICBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0cihwbmdfcHRyKTsKLQotSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBsaWJwbmcgZmx1c2ggYW55IHBlbmRpbmcgb3V0cHV0LCBlaXRoZXIgbWFudWFsbHksCi1vciBhdXRvbWF0aWNhbGx5IGFmdGVyIGEgY2VydGFpbiBudW1iZXIgb2YgbGluZXMgaGF2ZSBiZWVuIHdyaXR0ZW4uICBUbwotZmx1c2ggdGhlIG91dHB1dCBzdHJlYW0gYSBzaW5nbGUgdGltZSBjYWxsOgotCi0gICAgcG5nX3dyaXRlX2ZsdXNoKHBuZ19wdHIpOwotCi1hbmQgdG8gaGF2ZSBsaWJwbmcgZmx1c2ggdGhlIG91dHB1dCBzdHJlYW0gcGVyaW9kaWNhbGx5IGFmdGVyIGEgY2VydGFpbgotbnVtYmVyIG9mIHNjYW5saW5lcyBoYXZlIGJlZW4gd3JpdHRlbiwgY2FsbDoKLQotICAgIHBuZ19zZXRfZmx1c2gocG5nX3B0ciwgbnJvd3MpOwotCi1Ob3RlIHRoYXQgdGhlIGRpc3RhbmNlIGJldHdlZW4gcm93cyBpcyBmcm9tIHRoZSBsYXN0IHRpbWUgcG5nX3dyaXRlX2ZsdXNoKCkKLXdhcyBjYWxsZWQsIG9yIHRoZSBmaXJzdCByb3cgb2YgdGhlIGltYWdlIGlmIGl0IGhhcyBuZXZlciBiZWVuIGNhbGxlZC4KLVNvIGlmIHlvdSB3cml0ZSA1MCBsaW5lcywgYW5kIHRoZW4gcG5nX3NldF9mbHVzaCAyNSwgaXQgd2lsbCBmbHVzaCB0aGUKLW91dHB1dCBvbiB0aGUgbmV4dCBzY2FubGluZSwgYW5kIGV2ZXJ5IDI1IGxpbmVzIHRoZXJlYWZ0ZXIsIHVubGVzcwotcG5nX3dyaXRlX2ZsdXNoKCkgaXMgY2FsbGVkIGJlZm9yZSAyNSBtb3JlIGxpbmVzIGhhdmUgYmVlbiB3cml0dGVuLgotSWYgbnJvd3MgaXMgdG9vIHNtYWxsIChsZXNzIHRoYW4gYWJvdXQgMTAgbGluZXMgZm9yIGEgNjQwIHBpeGVsIHdpZGUKLVJHQiBpbWFnZSkgdGhlIGltYWdlIGNvbXByZXNzaW9uIG1heSBkZWNyZWFzZSBub3RpY2VhYmx5IChhbHRob3VnaCB0aGlzCi1tYXkgYmUgYWNjZXB0YWJsZSBmb3IgcmVhbC10aW1lIGFwcGxpY2F0aW9ucykuICBJbmZyZXF1ZW50IGZsdXNoaW5nIHdpbGwKLW9ubHkgZGVncmFkZSB0aGUgY29tcHJlc3Npb24gcGVyZm9ybWFuY2UgYnkgYSBmZXcgcGVyY2VudCBvdmVyIGltYWdlcwotdGhhdCBkbyBub3QgdXNlIGZsdXNoaW5nLgotCi1Xcml0aW5nIHRoZSBpbWFnZSBkYXRhCi0KLVRoYXQncyBpdCBmb3IgdGhlIHRyYW5zZm9ybWF0aW9ucy4gIE5vdyB5b3UgY2FuIHdyaXRlIHRoZSBpbWFnZSBkYXRhLgotVGhlIHNpbXBsZXN0IHdheSB0byBkbyB0aGlzIGlzIGluIG9uZSBmdW5jdGlvbiBjYWxsLiAgSWYgeW91IGhhdmUgdGhlCi13aG9sZSBpbWFnZSBpbiBtZW1vcnksIHlvdSBjYW4ganVzdCBjYWxsIHBuZ193cml0ZV9pbWFnZSgpIGFuZCBsaWJwbmcKLXdpbGwgd3JpdGUgdGhlIGltYWdlLiAgWW91IHdpbGwgbmVlZCB0byBwYXNzIGluIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvCi1lYWNoIHJvdy4gIFRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBoYW5kbGVzIGludGVybGFjaW5nLCBzbyB5b3UgZG9uJ3QKLW5lZWQgdG8gY2FsbCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIG9yIGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZQotdGltZXMsIG9yIGFueSBvZiB0aGF0IG90aGVyIHN0dWZmIG5lY2Vzc2FyeSB3aXRoIHBuZ193cml0ZV9yb3dzKCkuCi0KLSAgICBwbmdfd3JpdGVfaW1hZ2UocG5nX3B0ciwgcm93X3BvaW50ZXJzKTsKLQotd2hlcmUgcm93X3BvaW50ZXJzIGlzOgotCi0gICAgcG5nX2J5dGUgKnJvd19wb2ludGVyc1toZWlnaHRdOwotCi1Zb3UgY2FuIHBvaW50IHRvIHZvaWQgb3IgY2hhciBvciB3aGF0ZXZlciB5b3UgdXNlIGZvciBwaXhlbHMuCi0KLUlmIHlvdSBkb24ndCB3YW50IHRvIHdyaXRlIHRoZSB3aG9sZSBpbWFnZSBhdCBvbmNlLCB5b3UgY2FuCi11c2UgcG5nX3dyaXRlX3Jvd3MoKSBpbnN0ZWFkLiAgSWYgdGhlIGZpbGUgaXMgbm90IGludGVybGFjZWQsCi10aGlzIGlzIHNpbXBsZToKLQotICAgIHBuZ193cml0ZV9yb3dzKHBuZ19wdHIsIHJvd19wb2ludGVycywKLSAgICAgICBudW1iZXJfb2Zfcm93cyk7Ci0KLXJvd19wb2ludGVycyBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgcG5nX3dyaXRlX2ltYWdlKCkgY2FsbC4KLQotSWYgeW91IGFyZSBqdXN0IHdyaXRpbmcgb25lIHJvdyBhdCBhIHRpbWUsIHlvdSBjYW4gZG8gdGhpcyB3aXRoCi1hIHNpbmdsZSByb3dfcG9pbnRlciBpbnN0ZWFkIG9mIGFuIGFycmF5IG9mIHJvd19wb2ludGVyczoKLQotICAgIHBuZ19ieXRlcCByb3dfcG9pbnRlciA9IHJvdzsKLQotICAgIHBuZ193cml0ZV9yb3cocG5nX3B0ciwgcm93X3BvaW50ZXIpOwotCi1XaGVuIHRoZSBmaWxlIGlzIGludGVybGFjZWQsIHRoaW5ncyBjYW4gZ2V0IGEgZ29vZCBkZWFsIG1vcmUgY29tcGxpY2F0ZWQuCi1UaGUgb25seSBjdXJyZW50bHkgKGFzIG9mIHRoZSBQTkcgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMiwgZGF0ZWQgSnVseQotMTk5OSkgZGVmaW5lZCBpbnRlcmxhY2luZyBzY2hlbWUgZm9yIFBORyBmaWxlcyBpcyB0aGUgIkFkYW03IiBpbnRlcmxhY2UKLXNjaGVtZSwgdGhhdCBicmVha3MgZG93biBhbiBpbWFnZSBpbnRvIHNldmVuIHNtYWxsZXIgaW1hZ2VzIG9mIHZhcnlpbmcKLXNpemUuICBsaWJwbmcgd2lsbCBidWlsZCB0aGVzZSBpbWFnZXMgZm9yIHlvdSwgb3IgeW91IGNhbiBkbyB0aGVtCi15b3Vyc2VsZi4gIElmIHlvdSB3YW50IHRvIGJ1aWxkIHRoZW0geW91cnNlbGYsIHNlZSB0aGUgUE5HIHNwZWNpZmljYXRpb24KLWZvciBkZXRhaWxzIG9mIHdoaWNoIHBpeGVscyB0byB3cml0ZSB3aGVuLgotCi1JZiB5b3UgZG9uJ3Qgd2FudCBsaWJwbmcgdG8gaGFuZGxlIHRoZSBpbnRlcmxhY2luZyBkZXRhaWxzLCBqdXN0Ci11c2UgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSBhbmQgY2FsbCBwbmdfd3JpdGVfcm93cygpIHRoZQotY29ycmVjdCBudW1iZXIgb2YgdGltZXMgdG8gd3JpdGUgYWxsIHNldmVuIHN1Yi1pbWFnZXMuCi0KLUlmIHlvdSB3YW50IGxpYnBuZyB0byBidWlsZCB0aGUgc3ViLWltYWdlcywgY2FsbCB0aGlzIGJlZm9yZSB5b3Ugc3RhcnQKLXdyaXRpbmcgYW55IHJvd3M6Ci0KLSAgICBudW1iZXJfb2ZfcGFzc2VzID0KLSAgICAgICBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKLQotVGhpcyB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIHBhc3NlcyBuZWVkZWQuICBDdXJyZW50bHksIHRoaXMgaXMgc2V2ZW4sCi1idXQgbWF5IGNoYW5nZSBpZiBhbm90aGVyIGludGVybGFjZSB0eXBlIGlzIGFkZGVkLgotCi1UaGVuIHdyaXRlIHRoZSBjb21wbGV0ZSBpbWFnZSBudW1iZXJfb2ZfcGFzc2VzIHRpbWVzLgotCi0gICAgcG5nX3dyaXRlX3Jvd3MocG5nX3B0ciwgcm93X3BvaW50ZXJzLAotICAgICAgIG51bWJlcl9vZl9yb3dzKTsKLQotQXMgc29tZSBvZiB0aGVzZSByb3dzIGFyZSBub3QgdXNlZCwgYW5kIHRodXMgcmV0dXJuIGltbWVkaWF0ZWx5LCB5b3UgbWF5Ci13YW50IHRvIHJlYWQgYWJvdXQgaW50ZXJsYWNpbmcgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uLCBhbmQgb25seSB1cGRhdGUKLXRoZSByb3dzIHRoYXQgYXJlIGFjdHVhbGx5IHVzZWQuCi0KLUZpbmlzaGluZyBhIHNlcXVlbnRpYWwgd3JpdGUKLQotQWZ0ZXIgeW91IGFyZSBmaW5pc2hlZCB3cml0aW5nIHRoZSBpbWFnZSwgeW91IHNob3VsZCBmaW5pc2ggd3JpdGluZwotdGhlIGZpbGUuICBJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gd3JpdGluZyBjb21tZW50cyBvciB0aW1lLCB5b3Ugc2hvdWxkCi1wYXNzIGFuIGFwcHJvcHJpYXRlbHkgZmlsbGVkIHBuZ19pbmZvIHBvaW50ZXIuICBJZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkLAoteW91IGNhbiBwYXNzIE5VTEwuCi0KLSAgICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotV2hlbiB5b3UgYXJlIGRvbmUsIHlvdSBjYW4gZnJlZSBhbGwgbWVtb3J5IHVzZWQgYnkgbGlicG5nIGxpa2UgdGhpczoKLQotICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKLQotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBpbmRpdmlkdWFsbHkgZnJlZSB0aGUgaW5mb19wdHIgbWVtYmVycyB0aGF0Ci1wb2ludCB0byBsaWJwbmctYWxsb2NhdGVkIHN0b3JhZ2Ugd2l0aCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgotCi0gICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgbWFzaywgc2VxKQotICAgIG1hc2sgIC0gaWRlbnRpZmllcyBkYXRhIHRvIGJlIGZyZWVkLCBhIG1hc2sKLSAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgT1Igb2Ygb25lIG9yCi0gICAgICAgICAgICBtb3JlIG9mCi0gICAgICAgICAgICAgIFBOR19GUkVFX1BMVEUsIFBOR19GUkVFX1RSTlMsCi0gICAgICAgICAgICAgIFBOR19GUkVFX0hJU1QsIFBOR19GUkVFX0lDQ1AsCi0gICAgICAgICAgICAgIFBOR19GUkVFX1BDQUwsIFBOR19GUkVFX1JPV1MsCi0gICAgICAgICAgICAgIFBOR19GUkVFX1NDQUwsIFBOR19GUkVFX1NQTFQsCi0gICAgICAgICAgICAgIFBOR19GUkVFX1RFWFQsIFBOR19GUkVFX1VOS04sCi0gICAgICAgICAgICBvciBzaW1wbHkgUE5HX0ZSRUVfQUxMCi0gICAgc2VxICAgLSBzZXF1ZW5jZSBudW1iZXIgb2YgaXRlbSB0byBiZSBmcmVlZAotICAgICAgICAgICAgKC0xIGZvciBhbGwgaXRlbXMpCi0KLVRoaXMgZnVuY3Rpb24gbWF5IGJlIHNhZmVseSBjYWxsZWQgd2hlbiB0aGUgcmVsZXZhbnQgc3RvcmFnZSBoYXMKLWFscmVhZHkgYmVlbiBmcmVlZCwgb3IgaGFzIG5vdCB5ZXQgYmVlbiBhbGxvY2F0ZWQsIG9yIHdhcyBhbGxvY2F0ZWQKLWJ5IHRoZSB1c2VyICBhbmQgbm90IGJ5IGxpYnBuZywgIGFuZCB3aWxsIGluIHRob3NlIGNhc2VzIGRvIG5vdGhpbmcuCi1UaGUgInNlcSIgcGFyYW1ldGVyIGlzIGlnbm9yZWQgaWYgb25seSBvbmUgaXRlbSBvZiB0aGUgc2VsZWN0ZWQgZGF0YQotdHlwZSwgc3VjaCBhcyBQTFRFLCBpcyBhbGxvd2VkLiAgSWYgInNlcSIgaXMgbm90IC0xLCBhbmQgbXVsdGlwbGUgaXRlbXMKLWFyZSBhbGxvd2VkIGZvciB0aGUgZGF0YSB0eXBlIGlkZW50aWZpZWQgaW4gdGhlIG1hc2ssIHN1Y2ggYXMgdGV4dCBvcgotc1BMVCwgb25seSB0aGUgbid0aCBpdGVtIGluIHRoZSBzdHJ1Y3R1cmUgaXMgZnJlZWQsIHdoZXJlIG4gaXMgInNlcSIuCi0KLUlmIHlvdSBhbGxvY2F0ZWQgZGF0YSBzdWNoIGFzIGEgcGFsZXR0ZSB0aGF0IHlvdSBwYXNzZWQgaW4gdG8gbGlicG5nCi13aXRoIHBuZ19zZXRfKiwgeW91IG11c3Qgbm90IGZyZWUgaXQgdW50aWwganVzdCBiZWZvcmUgdGhlIGNhbGwgdG8KLXBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgpLgotCi1UaGUgZGVmYXVsdCBiZWhhdmlvciBpcyBvbmx5IHRvIGZyZWUgZGF0YSB0aGF0IHdhcyBhbGxvY2F0ZWQgaW50ZXJuYWxseQotYnkgbGlicG5nLiAgVGhpcyBjYW4gYmUgY2hhbmdlZCwgc28gdGhhdCBsaWJwbmcgd2lsbCBub3QgZnJlZSB0aGUgZGF0YSwKLW9yIHNvIHRoYXQgaXQgd2lsbCBmcmVlIGRhdGEgdGhhdCB3YXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyIHdpdGggcG5nX21hbGxvYygpCi1vciBwbmdfemFsbG9jKCkgYW5kIHBhc3NlZCBpbiB2aWEgYSBwbmdfc2V0XyooKSBmdW5jdGlvbiwgd2l0aAotCi0gICAgcG5nX2RhdGFfZnJlZXIocG5nX3B0ciwgaW5mb19wdHIsIGZyZWVyLCBtYXNrKQotICAgIG1hc2sgICAtIHdoaWNoIGRhdGEgZWxlbWVudHMgYXJlIGFmZmVjdGVkCi0gICAgICAgICAgICAgc2FtZSBjaG9pY2VzIGFzIGluIHBuZ19mcmVlX2RhdGEoKQotICAgIGZyZWVyICAtIG9uZSBvZgotICAgICAgICAgICAgICAgUE5HX0RFU1RST1lfV0lMTF9GUkVFX0RBVEEKLSAgICAgICAgICAgICAgIFBOR19TRVRfV0lMTF9GUkVFX0RBVEEKLSAgICAgICAgICAgICAgIFBOR19VU0VSX1dJTExfRlJFRV9EQVRBCi0KLUZvciBleGFtcGxlLCB0byB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3Igc29tZSBkYXRhIGZyb20gYSByZWFkIHN0cnVjdHVyZQotdG8gYSB3cml0ZSBzdHJ1Y3R1cmUsIHlvdSBjb3VsZCB1c2UKLQotICAgIHBuZ19kYXRhX2ZyZWVyKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLAotICAgICAgIFBOR19VU0VSX1dJTExfRlJFRV9EQVRBLAotICAgICAgIFBOR19GUkVFX1BMVEV8UE5HX0ZSRUVfdFJOU3xQTkdfRlJFRV9oSVNUKQotICAgIHBuZ19kYXRhX2ZyZWVyKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsCi0gICAgICAgUE5HX0RFU1RST1lfV0lMTF9GUkVFX0RBVEEsCi0gICAgICAgUE5HX0ZSRUVfUExURXxQTkdfRlJFRV90Uk5TfFBOR19GUkVFX2hJU1QpCi0KLXRoZXJlYnkgYnJpZWZseSByZWFzc2lnbmluZyByZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyB0byB0aGUgdXNlciBidXQKLWltbWVkaWF0ZWx5IGFmdGVyd2FyZHMgcmVhc3NpZ25pbmcgaXQgb25jZSBtb3JlIHRvIHRoZSB3cml0ZV9kZXN0cm95Ci1mdW5jdGlvbi4gIEhhdmluZyBkb25lIHRoaXMsIGl0IHdvdWxkIHRoZW4gYmUgc2FmZSB0byBkZXN0cm95IHRoZSByZWFkCi1zdHJ1Y3R1cmUgYW5kIGNvbnRpbnVlIHRvIHVzZSB0aGUgUExURSwgdFJOUywgYW5kIGhJU1QgZGF0YSBpbiB0aGUgd3JpdGUKLXN0cnVjdHVyZS4KLQotVGhpcyBmdW5jdGlvbiBvbmx5IGFmZmVjdHMgZGF0YSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLgotWW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGNhbGxpbmcgYWZ0ZXIgdGhlIHBuZ19zZXRfKigpIGZ1bmN0aW9ucwotdG8gY29udHJvbCB3aGV0aGVyIHRoZSB1c2VyIG9yIHBuZ19kZXN0cm95XyooKSBpcyBzdXBwb3NlZCB0byBmcmVlIHRoZSBkYXRhLgotV2hlbiB0aGUgdXNlciBhc3N1bWVzIHJlc3BvbnNpYmlsaXR5IGZvciBsaWJwbmctYWxsb2NhdGVkIGRhdGEsIHRoZQotYXBwbGljYXRpb24gbXVzdCB1c2UKLXBuZ19mcmVlKCkgdG8gZnJlZSBpdCwgYW5kIHdoZW4gdGhlIHVzZXIgdHJhbnNmZXJzIHJlc3BvbnNpYmlsaXR5IHRvIGxpYnBuZwotZm9yIGRhdGEgdGhhdCB0aGUgdXNlciBoYXMgYWxsb2NhdGVkLCB0aGUgdXNlciBtdXN0IGhhdmUgdXNlZCBwbmdfbWFsbG9jKCkKLW9yIHBuZ196YWxsb2MoKSB0byBhbGxvY2F0ZSBpdC4KLQotSWYgeW91IGFsbG9jYXRlZCB0ZXh0X3B0ci50ZXh0LCB0ZXh0X3B0ci5sYW5nLCBhbmQgdGV4dF9wdHIudHJhbnNsYXRlZF9rZXl3b3JkCi1zZXBhcmF0ZWx5LCBkbyBub3QgdHJhbnNmZXIgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgdGV4dF9wdHIgdG8gbGlicG5nLAotYmVjYXVzZSB3aGVuIGxpYnBuZyBmaWxscyBhIHBuZ190ZXh0IHN0cnVjdHVyZSBpdCBjb21iaW5lcyB0aGVzZSBtZW1iZXJzIHdpdGgKLXRoZSBrZXkgbWVtYmVyLCBhbmQgcG5nX2ZyZWVfZGF0YSgpIHdpbGwgZnJlZSBvbmx5IHRleHRfcHRyLmtleS4gIFNpbWlsYXJseSwKLWlmIHlvdSB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3IgZnJlZSdpbmcgdGV4dF9wdHIgZnJvbSBsaWJwbmcgdG8geW91cgotYXBwbGljYXRpb24sIHlvdXIgYXBwbGljYXRpb24gbXVzdCBub3Qgc2VwYXJhdGVseSBmcmVlIHRob3NlIG1lbWJlcnMuCi1Gb3IgYSBtb3JlIGNvbXBhY3QgZXhhbXBsZSBvZiB3cml0aW5nIGEgUE5HIGltYWdlLCBzZWUgdGhlIGZpbGUgZXhhbXBsZS5jLgotCi1WLiBNb2RpZnlpbmcvQ3VzdG9taXppbmcgbGlicG5nOgotCi1UaGVyZSBhcmUgdHdvIGlzc3VlcyBoZXJlLiAgVGhlIGZpcnN0IGlzIGNoYW5naW5nIGhvdyBsaWJwbmcgZG9lcwotc3RhbmRhcmQgdGhpbmdzIGxpa2UgbWVtb3J5IGFsbG9jYXRpb24sIGlucHV0L291dHB1dCwgYW5kIGVycm9yIGhhbmRsaW5nLgotVGhlIHNlY29uZCBkZWFscyB3aXRoIG1vcmUgY29tcGxpY2F0ZWQgdGhpbmdzIGxpa2UgYWRkaW5nIG5ldyBjaHVua3MsCi1hZGRpbmcgbmV3IHRyYW5zZm9ybWF0aW9ucywgYW5kIGdlbmVyYWxseSBjaGFuZ2luZyBob3cgbGlicG5nIHdvcmtzLgotQm90aCBvZiB0aG9zZSBhcmUgY29tcGlsZS10aW1lIGlzc3VlczsgdGhhdCBpcywgdGhleSBhcmUgZ2VuZXJhbGx5Ci1kZXRlcm1pbmVkIGF0IHRoZSB0aW1lIHRoZSBjb2RlIGlzIHdyaXR0ZW4sIGFuZCB0aGVyZSBpcyByYXJlbHkgYSBuZWVkCi10byBwcm92aWRlIHRoZSB1c2VyIHdpdGggYSBtZWFucyBvZiBjaGFuZ2luZyB0aGVtLgotCi1NZW1vcnkgYWxsb2NhdGlvbiwgaW5wdXQvb3V0cHV0LCBhbmQgZXJyb3IgaGFuZGxpbmcKLQotQWxsIG9mIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiwgaW5wdXQvb3V0cHV0LCBhbmQgZXJyb3IgaGFuZGxpbmcgaW4gbGlicG5nCi1nb2VzIHRocm91Z2ggY2FsbGJhY2tzIHRoYXQgYXJlIHVzZXItc2V0dGFibGUuICBUaGUgZGVmYXVsdCByb3V0aW5lcyBhcmUKLWluIHBuZ21lbS5jLCBwbmdyaW8uYywgcG5nd2lvLmMsIGFuZCBwbmdlcnJvci5jLCByZXNwZWN0aXZlbHkuICBUbyBjaGFuZ2UKLXRoZXNlIGZ1bmN0aW9ucywgY2FsbCB0aGUgYXBwcm9wcmlhdGUgcG5nX3NldF8qX2ZuKCkgZnVuY3Rpb24uCi0KLU1lbW9yeSBhbGxvY2F0aW9uIGlzIGRvbmUgdGhyb3VnaCB0aGUgZnVuY3Rpb25zIHBuZ19tYWxsb2MoKSwgcG5nX2NhbGxvYygpLAotYW5kIHBuZ19mcmVlKCkuICBUaGVzZSBjdXJyZW50bHkganVzdCBjYWxsIHRoZSBzdGFuZGFyZCBDIGZ1bmN0aW9ucy4KLXBuZ19jYWxsb2MoKSBjYWxscyBwbmdfbWFsbG9jKCkgYW5kIHRoZW4gcG5nX21lbXNldCgpIHRvIGNsZWFyIHRoZSBuZXdseQotYWxsb2NhdGVkIG1lbW9yeSB0byB6ZXJvLiAgSWYgeW91ciBwb2ludGVycyBjYW4ndCBhY2Nlc3MgbW9yZSB0aGVuIDY0SwotYXQgYSB0aW1lLCB5b3Ugd2lsbCB3YW50IHRvIHNldCBNQVhTRUdfNjRLIGluIHpsaWIuaC4gIFNpbmNlIGl0IGlzCi11bmxpa2VseSB0aGF0IHRoZSBtZXRob2Qgb2YgaGFuZGxpbmcgbWVtb3J5IGFsbG9jYXRpb24gb24gYSBwbGF0Zm9ybQotd2lsbCBjaGFuZ2UgYmV0d2VlbiBhcHBsaWNhdGlvbnMsIHRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIG1vZGlmaWVkIGluCi10aGUgbGlicmFyeSBhdCBjb21waWxlIHRpbWUuICBJZiB5b3UgcHJlZmVyIHRvIHVzZSBhIGRpZmZlcmVudCBtZXRob2QKLW9mIGFsbG9jYXRpbmcgYW5kIGZyZWVpbmcgZGF0YSwgeW91IGNhbiB1c2UgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCkgb3IKLXBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIoKSB0byByZWdpc3RlciB5b3VyIG93biBmdW5jdGlvbnMgYXMgZGVzY3JpYmVkCi1hYm92ZS4gIFRoZXNlIGZ1bmN0aW9ucyBhbHNvIHByb3ZpZGUgYSB2b2lkIHBvaW50ZXIgdGhhdCBjYW4gYmUgcmV0cmlldmVkCi12aWEKLQotICAgIG1lbV9wdHI9cG5nX2dldF9tZW1fcHRyKHBuZ19wdHIpOwotCi1Zb3VyIHJlcGxhY2VtZW50IG1lbW9yeSBmdW5jdGlvbnMgbXVzdCBoYXZlIHByb3RvdHlwZXMgYXMgZm9sbG93czoKLQotICAgIHBuZ192b2lkcCBtYWxsb2NfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpOwotICAgIHZvaWQgZnJlZV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgcHRyKTsKLQotWW91ciBtYWxsb2NfZm4oKSBtdXN0IHJldHVybiBOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZS4gIFRoZSBwbmdfbWFsbG9jKCkKLWZ1bmN0aW9uIHdpbGwgbm9ybWFsbHkgY2FsbCBwbmdfZXJyb3IoKSBpZiBpdCByZWNlaXZlcyBhIE5VTEwgZnJvbSB0aGUKLXN5c3RlbSBtZW1vcnkgYWxsb2NhdG9yIG9yIGZyb20geW91ciByZXBsYWNlbWVudCBtYWxsb2NfZm4oKS4KLQotWW91ciBmcmVlX2ZuKCkgd2lsbCBuZXZlciBiZSBjYWxsZWQgd2l0aCBhIE5VTEwgcHRyLCBzaW5jZSBsaWJwbmcncwotcG5nX2ZyZWUoKSBjaGVja3MgZm9yIE5VTEwgYmVmb3JlIGNhbGxpbmcgZnJlZV9mbigpLgotCi1JbnB1dC9PdXRwdXQgaW4gbGlicG5nIGlzIGRvbmUgdGhyb3VnaCBwbmdfcmVhZCgpIGFuZCBwbmdfd3JpdGUoKSwKLXdoaWNoIGN1cnJlbnRseSBqdXN0IGNhbGwgZnJlYWQoKSBhbmQgZndyaXRlKCkuICBUaGUgRklMRSAqIGlzIHN0b3JlZCBpbgotcG5nX3N0cnVjdCBhbmQgaXMgaW5pdGlhbGl6ZWQgdmlhIHBuZ19pbml0X2lvKCkuICBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UKLXRoZSBtZXRob2Qgb2YgSS9PLCB0aGUgbGlicmFyeSBzdXBwbGllcyBjYWxsYmFja3MgdGhhdCB5b3UgY2FuIHNldAotdGhyb3VnaCB0aGUgZnVuY3Rpb24gcG5nX3NldF9yZWFkX2ZuKCkgYW5kIHBuZ19zZXRfd3JpdGVfZm4oKSBhdCBydW4KLXRpbWUsIGluc3RlYWQgb2YgY2FsbGluZyB0aGUgcG5nX2luaXRfaW8oKSBmdW5jdGlvbi4gIFRoZXNlIGZ1bmN0aW9ucwotYWxzbyBwcm92aWRlIGEgdm9pZCBwb2ludGVyIHRoYXQgY2FuIGJlIHJldHJpZXZlZCB2aWEgdGhlIGZ1bmN0aW9uCi1wbmdfZ2V0X2lvX3B0cigpLiAgRm9yIGV4YW1wbGU6Ci0KLSAgICBwbmdfc2V0X3JlYWRfZm4ocG5nX3N0cnVjdHAgcmVhZF9wdHIsCi0gICAgICAgIHZvaWRwIHJlYWRfaW9fcHRyLCBwbmdfcndfcHRyIHJlYWRfZGF0YV9mbikKLQotICAgIHBuZ19zZXRfd3JpdGVfZm4ocG5nX3N0cnVjdHAgd3JpdGVfcHRyLAotICAgICAgICB2b2lkcCB3cml0ZV9pb19wdHIsIHBuZ19yd19wdHIgd3JpdGVfZGF0YV9mbiwKLSAgICAgICAgcG5nX2ZsdXNoX3B0ciBvdXRwdXRfZmx1c2hfZm4pOwotCi0gICAgdm9pZHAgcmVhZF9pb19wdHIgPSBwbmdfZ2V0X2lvX3B0cihyZWFkX3B0cik7Ci0gICAgdm9pZHAgd3JpdGVfaW9fcHRyID0gcG5nX2dldF9pb19wdHIod3JpdGVfcHRyKTsKLQotVGhlIHJlcGxhY2VtZW50IEkvTyBmdW5jdGlvbnMgbXVzdCBoYXZlIHByb3RvdHlwZXMgYXMgZm9sbG93czoKLQotICAgIHZvaWQgdXNlcl9yZWFkX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICAgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKTsKLSAgICB2b2lkIHVzZXJfd3JpdGVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpOwotICAgIHZvaWQgdXNlcl9mbHVzaF9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpOwotCi1UaGUgdXNlcl9yZWFkX2RhdGEoKSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZWN0aW5nIGFuZAotaGFuZGxpbmcgZW5kLW9mLWRhdGEgZXJyb3JzLgotCi1TdXBwbHlpbmcgTlVMTCBmb3IgdGhlIHJlYWQsIHdyaXRlLCBvciBmbHVzaCBmdW5jdGlvbnMgc2V0cyB0aGVtIGJhY2sKLXRvIHVzaW5nIHRoZSBkZWZhdWx0IEMgc3RyZWFtIGZ1bmN0aW9ucywgd2hpY2ggZXhwZWN0IHRoZSBpb19wdHIgdG8KLXBvaW50IHRvIGEgc3RhbmRhcmQgKkZJTEUgc3RydWN0dXJlLiAgSXQgaXMgcHJvYmFibHkgYSBtaXN0YWtlCi10byB1c2UgTlVMTCBmb3Igb25lIG9mIHdyaXRlX2RhdGFfZm4gYW5kIG91dHB1dF9mbHVzaF9mbiBidXQgbm90IGJvdGgKLW9mIHRoZW0sIHVubGVzcyB5b3UgaGF2ZSBidWlsdCBsaWJwbmcgd2l0aCBQTkdfTk9fV1JJVEVfRkxVU0ggZGVmaW5lZC4KLUl0IGlzIGFuIGVycm9yIHRvIHJlYWQgZnJvbSBhIHdyaXRlIHN0cmVhbSwgYW5kIHZpY2UgdmVyc2EuCi0KLUVycm9yIGhhbmRsaW5nIGluIGxpYnBuZyBpcyBkb25lIHRocm91Z2ggcG5nX2Vycm9yKCkgYW5kIHBuZ193YXJuaW5nKCkuCi1FcnJvcnMgaGFuZGxlZCB0aHJvdWdoIHBuZ19lcnJvcigpIGFyZSBmYXRhbCwgbWVhbmluZyB0aGF0IHBuZ19lcnJvcigpCi1zaG91bGQgbmV2ZXIgcmV0dXJuIHRvIGl0cyBjYWxsZXIuICBDdXJyZW50bHksIHRoaXMgaXMgaGFuZGxlZCB2aWEKLXNldGptcCgpIGFuZCBsb25nam1wKCkgKHVubGVzcyB5b3UgaGF2ZSBjb21waWxlZCBsaWJwbmcgd2l0aAotUE5HX05PX1NFVEpNUCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBoYW5kbGVkIHZpYSBQTkdfQUJPUlQoKSksCi1idXQgeW91IGNvdWxkIGNoYW5nZSB0aGlzIHRvIGRvIHRoaW5ncyBsaWtlIGV4aXQoKSBpZiB5b3Ugc2hvdWxkIHdpc2gsCi1hcyBsb25nIGFzIHlvdXIgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuLgotCi1PbiBub24tZmF0YWwgZXJyb3JzLCBwbmdfd2FybmluZygpIGlzIGNhbGxlZAotdG8gcHJpbnQgYSB3YXJuaW5nIG1lc3NhZ2UsIGFuZCB0aGVuIGNvbnRyb2wgcmV0dXJucyB0byB0aGUgY2FsbGluZyBjb2RlLgotQnkgZGVmYXVsdCBwbmdfZXJyb3IoKSBhbmQgcG5nX3dhcm5pbmcoKSBwcmludCBhIG1lc3NhZ2Ugb24gc3RkZXJyIHZpYQotZnByaW50ZigpIHVubGVzcyB0aGUgbGlicmFyeSBpcyBjb21waWxlZCB3aXRoIFBOR19OT19DT05TT0xFX0lPIGRlZmluZWQKLShiZWNhdXNlIHlvdSBkb24ndCB3YW50IHRoZSBtZXNzYWdlcykgb3IgUE5HX05PX1NURElPIGRlZmluZWQgKGJlY2F1c2UKLWZwcmludGYoKSBpc24ndCBhdmFpbGFibGUpLiAgSWYgeW91IHdpc2ggdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZiB0aGUgZXJyb3IKLWZ1bmN0aW9ucywgeW91IHdpbGwgbmVlZCB0byBzZXQgdXAgeW91ciBvd24gbWVzc2FnZSBjYWxsYmFja3MuICBUaGVzZQotZnVuY3Rpb25zIGFyZSBub3JtYWxseSBzdXBwbGllZCBhdCB0aGUgdGltZSB0aGF0IHRoZSBwbmdfc3RydWN0IGlzIGNyZWF0ZWQuCi1JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJlZGlyZWN0IGVycm9ycyBhbmQgd2FybmluZ3MgdG8geW91ciBvd24gcmVwbGFjZW1lbnQKLWZ1bmN0aW9ucyBhZnRlciBwbmdfY3JlYXRlXypfc3RydWN0KCkgaGFzIGJlZW4gY2FsbGVkIGJ5IGNhbGxpbmc6Ci0KLSAgICBwbmdfc2V0X2Vycm9yX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgICAgIHBuZ192b2lkcCBlcnJvcl9wdHIsIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sCi0gICAgICAgIHBuZ19lcnJvcl9wdHIgd2FybmluZ19mbik7Ci0KLSAgICBwbmdfdm9pZHAgZXJyb3JfcHRyID0gcG5nX2dldF9lcnJvcl9wdHIocG5nX3B0cik7Ci0KLUlmIE5VTEwgaXMgc3VwcGxpZWQgZm9yIGVpdGhlciBlcnJvcl9mbiBvciB3YXJuaW5nX2ZuLCB0aGVuIHRoZSBsaWJwbmcKLWRlZmF1bHQgZnVuY3Rpb24gd2lsbCBiZSB1c2VkLCBjYWxsaW5nIGZwcmludGYoKSBhbmQvb3IgbG9uZ2ptcCgpIGlmIGEKLXByb2JsZW0gaXMgZW5jb3VudGVyZWQuICBUaGUgcmVwbGFjZW1lbnQgZXJyb3IgZnVuY3Rpb25zIHNob3VsZCBoYXZlCi1wYXJhbWV0ZXJzIGFzIGZvbGxvd3M6Ci0KLSAgICB2b2lkIHVzZXJfZXJyb3JfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICAgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21zZyk7Ci0gICAgdm9pZCB1c2VyX3dhcm5pbmdfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICAgcG5nX2NvbnN0X2NoYXJwIHdhcm5pbmdfbXNnKTsKLQotVGhlIG1vdGl2YXRpb24gYmVoaW5kIHVzaW5nIHNldGptcCgpIGFuZCBsb25nam1wKCkgaXMgdGhlIEMrKyB0aHJvdyBhbmQKLWNhdGNoIGV4Y2VwdGlvbiBoYW5kbGluZyBtZXRob2RzLiAgVGhpcyBtYWtlcyB0aGUgY29kZSBtdWNoIGVhc2llciB0byB3cml0ZSwKLWFzIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgZXZlcnkgcmV0dXJuIGNvZGUgb2YgZXZlcnkgZnVuY3Rpb24gY2FsbC4KLUhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lIHVuY2VydGFpbnRpZXMgYWJvdXQgdGhlIHN0YXR1cyBvZiBsb2NhbCB2YXJpYWJsZXMKLWFmdGVyIGEgbG9uZ2ptcCwgc28gdGhlIHVzZXIgbWF5IHdhbnQgdG8gYmUgY2FyZWZ1bCBhYm91dCBkb2luZyBhbnl0aGluZwotYWZ0ZXIgc2V0am1wIHJldHVybnMgbm9uLXplcm8gYmVzaWRlcyByZXR1cm5pbmcgaXRzZWxmLiAgQ29uc3VsdCB5b3VyCi1jb21waWxlciBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuICBGb3IgYW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2gsIHlvdQotbWF5IHdpc2ggdG8gdXNlIHRoZSAiY2V4Y2VwdCIgZmFjaWxpdHkgKHNlZSBodHRwOi8vY2V4Y2VwdC5zb3VyY2Vmb3JnZS5uZXQpLAotd2hpY2ggaXMgaWxsdXN0cmF0ZWQgaW4gcG5ndmFsaWQuYyBhbmQgaW4gY29udHJpYi92aXN1cG5nLgotCi1DdXN0b20gY2h1bmtzCi0KLUlmIHlvdSBuZWVkIHRvIHJlYWQgb3Igd3JpdGUgY3VzdG9tIGNodW5rcywgeW91IG1heSBuZWVkIHRvIGdldCBkZWVwZXIKLWludG8gdGhlIGxpYnBuZyBjb2RlLiAgVGhlIGxpYnJhcnkgbm93IGhhcyBtZWNoYW5pc21zIGZvciBzdG9yaW5nCi1hbmQgd3JpdGluZyBjaHVua3Mgb2YgdW5rbm93biB0eXBlOyB5b3UgY2FuIGV2ZW4gZGVjbGFyZSBjYWxsYmFja3MKLWZvciBjdXN0b20gY2h1bmtzLiAgSG93ZXZlciwgdGhpcyBtYXkgbm90IGJlIGdvb2QgZW5vdWdoIGlmIHRoZQotbGlicmFyeSBjb2RlIGl0c2VsZiBuZWVkcyB0byBrbm93IGFib3V0IGludGVyYWN0aW9ucyBiZXR3ZWVuIHlvdXIKLWNodW5rIGFuZCBleGlzdGluZyBgaW50cmluc2ljJyBjaHVua3MuCi0KLUlmIHlvdSBuZWVkIHRvIHdyaXRlIGEgbmV3IGludHJpbnNpYyBjaHVuaywgZmlyc3QgcmVhZCB0aGUgUE5HCi1zcGVjaWZpY2F0aW9uLiBBY3F1aXJlIGEgZmlyc3QgbGV2ZWwgb2YgdW5kZXJzdGFuZGluZyBvZiBob3cgaXQgd29ya3MuCi1QYXkgcGFydGljdWxhciBhdHRlbnRpb24gdG8gdGhlIHNlY3Rpb25zIHRoYXQgZGVzY3JpYmUgY2h1bmsgbmFtZXMsCi1hbmQgbG9vayBhdCBob3cgb3RoZXIgY2h1bmtzIHdlcmUgZGVzaWduZWQsIHNvIHlvdSBjYW4gZG8gdGhpbmdzCi1zaW1pbGFybHkuICBTZWNvbmQsIGNoZWNrIG91dCB0aGUgc2VjdGlvbnMgb2YgbGlicG5nIHRoYXQgcmVhZCBhbmQKLXdyaXRlIGNodW5rcy4gIFRyeSB0byBmaW5kIGEgY2h1bmsgdGhhdCBpcyBzaW1pbGFyIHRvIHlvdXJzIGFuZCB1c2UKLWl0IGFzIGEgdGVtcGxhdGUuICBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluIHRoZSBjb21tZW50cyBpbnNpZGUKLXRoZSBjb2RlLiAgSXQgaXMgYmVzdCB0byBoYW5kbGUgcHJpdmF0ZSBvciB1bmtub3duIGNodW5rcyBpbiBhIGdlbmVyaWMgbWV0aG9kLAotdmlhIGNhbGxiYWNrIGZ1bmN0aW9ucywgaW5zdGVhZCBvZiBieSBtb2RpZnlpbmcgbGlicG5nIGZ1bmN0aW9ucy4gVGhpcwotaXMgaWxsdXN0cmF0ZWQgaW4gcG5ndGVzdC5jLCB3aGljaCB1c2VzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIGEKLXByaXZhdGUgInZwQWciIGNodW5rIGFuZCB0aGUgbmV3ICJzVEVSIiBjaHVuaywgd2hpY2ggYXJlIGJvdGggdW5rbm93biB0bwotbGlicG5nLgotCi1JZiB5b3Ugd2lzaCB0byB3cml0ZSB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbiBmb3IgdGhlIGRhdGEsIGxvb2sgdGhyb3VnaAotdGhlIHBhcnQgb2YgdGhlIGNvZGUgdGhhdCBkb2VzIHRoZSB0cmFuc2Zvcm1hdGlvbnMsIGFuZCBjaGVjayBvdXQgc29tZSBvZgotdGhlIHNpbXBsZXIgb25lcyB0byBnZXQgYW4gaWRlYSBvZiBob3cgdGhleSB3b3JrLiAgVHJ5IHRvIGZpbmQgYSBzaW1pbGFyCi10cmFuc2Zvcm1hdGlvbiB0byB0aGUgb25lIHlvdSB3YW50IHRvIGFkZCBhbmQgY29weSBvZmYgb2YgaXQuICBNb3JlIGRldGFpbHMKLWNhbiBiZSBmb3VuZCBpbiB0aGUgY29tbWVudHMgaW5zaWRlIHRoZSBjb2RlIGl0c2VsZi4KLQotQ29uZmlndXJpbmcgZm9yIDE2IGJpdCBwbGF0Zm9ybXMKLQotWW91IHdpbGwgd2FudCB0byBsb29rIGludG8gemNvbmYuaCB0byB0ZWxsIHpsaWIgKGFuZCB0aHVzIGxpYnBuZykgdGhhdAotaXQgY2Fubm90IGFsbG9jYXRlIG1vcmUgdGhlbiA2NEsgYXQgYSB0aW1lLiAgRXZlbiBpZiB5b3UgY2FuLCB0aGUgbWVtb3J5Ci13b24ndCBiZSBhY2Nlc3NpYmxlLiAgU28gbGltaXQgemxpYiBhbmQgbGlicG5nIHRvIDY0SyBieSBkZWZpbmluZyBNQVhTRUdfNjRLLgotCi1Db25maWd1cmluZyBmb3IgRE9TCi0KLUZvciBET1MgdXNlcnMgd2hvIG9ubHkgaGF2ZSBhY2Nlc3MgdG8gdGhlIGxvd2VyIDY0MEssIHlvdSB3aWxsCi1oYXZlIHRvIGxpbWl0IHpsaWIncyBtZW1vcnkgdXNhZ2UgdmlhIGEgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwoKQotY2FsbC4gIFNlZSB6bGliLmggb3IgemNvbmYuaCBpbiB0aGUgemxpYiBsaWJyYXJ5IGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1Db25maWd1cmluZyBmb3IgTWVkaXVtIE1vZGVsCi0KLUxpYnBuZydzIHN1cHBvcnQgZm9yIG1lZGl1bSBtb2RlbCBoYXMgYmVlbiB0ZXN0ZWQgb24gbW9zdCBvZiB0aGUgcG9wdWxhcgotY29tcGlsZXJzLiAgTWFrZSBzdXJlIE1BWFNFR182NEsgZ2V0cyBkZWZpbmVkLCBVU0VfRkFSX0tFWVdPUkQgZ2V0cwotZGVmaW5lZCwgYW5kIEZBUiBnZXRzIGRlZmluZWQgdG8gZmFyIGluIHBuZ2NvbmYuaCwgYW5kIHlvdSBzaG91bGQgYmUKLWFsbCBzZXQuICBFdmVyeXRoaW5nIGluIHRoZSBsaWJyYXJ5IChleGNlcHQgZm9yIHpsaWIncyBzdHJ1Y3R1cmUpIGlzCi1leHBlY3RpbmcgZmFyIGRhdGEuICBZb3UgbXVzdCB1c2UgdGhlIHR5cGVkZWZzIHdpdGggdGhlIHAgb3IgcHAgb24KLXRoZSBlbmQgZm9yIHBvaW50ZXJzIChvciBhdCBsZWFzdCBsb29rIGF0IHRoZW0gYW5kIGJlIGNhcmVmdWwpLiAgTWFrZQotbm90ZSB0aGF0IHRoZSByb3dzIG9mIGRhdGEgYXJlIGRlZmluZWQgYXMgcG5nX2J5dGVwcCwgd2hpY2ggaXMgYW4KLXVuc2lnbmVkIGNoYXIgZmFyICogZmFyICouCi0KLUNvbmZpZ3VyaW5nIGZvciBndWkvd2luZG93aW5nIHBsYXRmb3JtczoKLQotWW91IHdpbGwgbmVlZCB0byB3cml0ZSBuZXcgZXJyb3IgYW5kIHdhcm5pbmcgZnVuY3Rpb25zIHRoYXQgdXNlIHRoZSBHVUkKLWludGVyZmFjZSwgYXMgZGVzY3JpYmVkIHByZXZpb3VzbHksIGFuZCBzZXQgdGhlbSB0byBiZSB0aGUgZXJyb3IgYW5kCi13YXJuaW5nIGZ1bmN0aW9ucyBhdCB0aGUgdGltZSB0aGF0IHBuZ19jcmVhdGVfKl9zdHJ1Y3QoKSBpcyBjYWxsZWQsCi1pbiBvcmRlciB0byBoYXZlIHRoZW0gYXZhaWxhYmxlIGR1cmluZyB0aGUgc3RydWN0dXJlIGluaXRpYWxpemF0aW9uLgotVGhleSBjYW4gYmUgY2hhbmdlZCBsYXRlciB2aWEgcG5nX3NldF9lcnJvcl9mbigpLiAgT24gc29tZSBjb21waWxlcnMsCi15b3UgbWF5IGFsc28gaGF2ZSB0byBjaGFuZ2UgdGhlIG1lbW9yeSBhbGxvY2F0b3JzIChwbmdfbWFsbG9jLCBldGMuKS4KLQotQ29uZmlndXJpbmcgZm9yIGNvbXBpbGVyIHh4eDoKLQotQWxsIGluY2x1ZGVzIGZvciBsaWJwbmcgYXJlIGluIHBuZ2NvbmYuaC4gIElmIHlvdSBuZWVkIHRvIGFkZCwgY2hhbmdlCi1vciBkZWxldGUgYW4gaW5jbHVkZSwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuCi1UaGUgaW5jbHVkZXMgdGhhdCBhcmUgbm90IG5lZWRlZCBvdXRzaWRlIGxpYnBuZyBhcmUgcGxhY2VkIGluIHBuZ3ByaXYuaCwKLXdoaWNoIGlzIG9ubHkgdXNlZCBieSB0aGUgcm91dGluZXMgaW5zaWRlIGxpYnBuZyBpdHNlbGYuCi1UaGUgZmlsZXMgaW4gbGlicG5nIHByb3BlciBvbmx5IGluY2x1ZGUgcG5ncHJpdi5oIGFuZCBwbmcuaCwgd2hpY2gKLWluIHR1cm4gaW5jbHVkZXMgcG5nY29uZi5oLgotCi1Db25maWd1cmluZyB6bGliOgotCi1UaGVyZSBhcmUgc3BlY2lhbCBmdW5jdGlvbnMgdG8gY29uZmlndXJlIHRoZSBjb21wcmVzc2lvbi4gIFBlcmhhcHMgdGhlCi1tb3N0IHVzZWZ1bCBvbmUgY2hhbmdlcyB0aGUgY29tcHJlc3Npb24gbGV2ZWwsIHdoaWNoIGN1cnJlbnRseSB1c2VzCi1pbnB1dCBjb21wcmVzc2lvbiB2YWx1ZXMgaW4gdGhlIHJhbmdlIDAgLSA5LiAgVGhlIGxpYnJhcnkgbm9ybWFsbHkKLXVzZXMgdGhlIGRlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwgKFpfREVGQVVMVF9DT01QUkVTU0lPTiA9IDYpLiAgVGVzdHMKLWhhdmUgc2hvd24gdGhhdCBmb3IgYSBsYXJnZSBtYWpvcml0eSBvZiBpbWFnZXMsIGNvbXByZXNzaW9uIHZhbHVlcyBpbgotdGhlIHJhbmdlIDMtNiBjb21wcmVzcyBuZWFybHkgYXMgd2VsbCBhcyBoaWdoZXIgbGV2ZWxzLCBhbmQgZG8gc28gbXVjaAotZmFzdGVyLiAgRm9yIG9ubGluZSBhcHBsaWNhdGlvbnMgaXQgbWF5IGJlIGRlc2lyYWJsZSB0byBoYXZlIG1heGltdW0gc3BlZWQKLShaX0JFU1RfU1BFRUQgPSAxKS4gIFdpdGggdmVyc2lvbnMgb2YgemxpYiBhZnRlciB2MC45OSwgeW91IGNhbiBhbHNvCi1zcGVjaWZ5IG5vIGNvbXByZXNzaW9uIChaX05PX0NPTVBSRVNTSU9OID0gMCksIGJ1dCB0aGlzIHdvdWxkIGNyZWF0ZQotZmlsZXMgbGFyZ2VyIHRoYW4ganVzdCBzdG9yaW5nIHRoZSByYXcgYml0bWFwLiAgWW91IGNhbiBzcGVjaWZ5IHRoZQotY29tcHJlc3Npb24gbGV2ZWwgYnkgY2FsbGluZzoKLQotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwocG5nX3B0ciwgbGV2ZWwpOwotCi1Bbm90aGVyIHVzZWZ1bCBvbmUgaXMgdG8gcmVkdWNlIHRoZSBtZW1vcnkgbGV2ZWwgdXNlZCBieSB0aGUgbGlicmFyeS4KLVRoZSBtZW1vcnkgbGV2ZWwgZGVmYXVsdHMgdG8gOCwgYnV0IGl0IGNhbiBiZSBsb3dlcmVkIGlmIHlvdSBhcmUKLXNob3J0IG9uIG1lbW9yeSAocnVubmluZyBET1MsIGZvciBleGFtcGxlLCB3aGVyZSB5b3Ugb25seSBoYXZlIDY0MEspLgotTm90ZSB0aGF0IHRoZSBtZW1vcnkgbGV2ZWwgZG9lcyBoYXZlIGFuIGVmZmVjdCBvbiBjb21wcmVzc2lvbjsgYW1vbmcKLW90aGVyIHRoaW5ncywgbG93ZXIgbGV2ZWxzIHdpbGwgcmVzdWx0IGluIHNlY3Rpb25zIG9mIGluY29tcHJlc3NpYmxlCi1kYXRhIGJlaW5nIGVtaXR0ZWQgaW4gc21hbGxlciBzdG9yZWQgYmxvY2tzLCB3aXRoIGEgY29ycmVzcG9uZGluZ2x5Ci1sYXJnZXIgcmVsYXRpdmUgb3ZlcmhlYWQgb2YgdXAgdG8gMTUlIGluIHRoZSB3b3JzdCBjYXNlLgotCi0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwocG5nX3B0ciwgbGV2ZWwpOwotCi1UaGUgb3RoZXIgZnVuY3Rpb25zIGFyZSBmb3IgY29uZmlndXJpbmcgemxpYi4gIFRoZXkgYXJlIG5vdCByZWNvbW1lbmRlZAotZm9yIG5vcm1hbCB1c2UgYW5kIG1heSByZXN1bHQgaW4gd3JpdGluZyBhbiBpbnZhbGlkIFBORyBmaWxlLiAgU2VlCi16bGliLmggZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gd2hhdCB0aGVzZSBtZWFuLgotCi0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneShwbmdfcHRyLAotICAgICAgICBzdHJhdGVneSk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyhwbmdfcHRyLAotICAgICAgICB3aW5kb3dfYml0cyk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QocG5nX3B0ciwgbWV0aG9kKTsKLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplKHBuZ19wdHIsIHNpemUpOwotCi1Db250cm9sbGluZyByb3cgZmlsdGVyaW5nCi0KLUlmIHlvdSB3YW50IHRvIGNvbnRyb2wgd2hldGhlciBsaWJwbmcgdXNlcyBmaWx0ZXJpbmcgb3Igbm90LCB3aGljaAotZmlsdGVycyBhcmUgdXNlZCwgYW5kIGhvdyBpdCBnb2VzIGFib3V0IHBpY2tpbmcgcm93IGZpbHRlcnMsIHlvdQotY2FuIGNhbGwgb25lIG9mIHRoZXNlIGZ1bmN0aW9ucy4gIFRoZSBzZWxlY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24KLW9mIHJvdyBmaWx0ZXJzIGNhbiBoYXZlIGEgc2lnbmlmaWNhbnQgaW1wYWN0IG9uIHRoZSBzaXplIGFuZAotZW5jb2Rpbmcgc3BlZWQgYW5kIGEgc29tZXdoYXQgbGVzc2VyIGltcGFjdCBvbiB0aGUgZGVjb2Rpbmcgc3BlZWQKLW9mIGFuIGltYWdlLiAgRmlsdGVyaW5nIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBmb3IgUkdCIGFuZCBncmF5c2NhbGUKLWltYWdlcyAod2l0aCBhbmQgd2l0aG91dCBhbHBoYSksIGJ1dCBub3QgZm9yIHBhbGV0dGVkIGltYWdlcyBub3IKLWZvciBhbnkgaW1hZ2VzIHdpdGggYml0IGRlcHRocyBsZXNzIHRoYW4gOCBiaXRzL3BpeGVsLgotCi1UaGUgJ21ldGhvZCcgcGFyYW1ldGVyIHNldHMgdGhlIG1haW4gZmlsdGVyaW5nIG1ldGhvZCwgd2hpY2ggaXMKLWN1cnJlbnRseSBvbmx5ICcwJyBpbiB0aGUgUE5HIDEuMiBzcGVjaWZpY2F0aW9uLiAgVGhlICdmaWx0ZXJzJwotcGFyYW1ldGVyIHNldHMgd2hpY2ggZmlsdGVyKHMpLCBpZiBhbnksIHNob3VsZCBiZSB1c2VkIGZvciBlYWNoCi1zY2FubGluZS4gIFBvc3NpYmxlIHZhbHVlcyBhcmUgUE5HX0FMTF9GSUxURVJTIGFuZCBQTkdfTk9fRklMVEVSUwotdG8gdHVybiBmaWx0ZXJpbmcgb24gYW5kIG9mZiwgcmVzcGVjdGl2ZWx5LgotCi1JbmRpdmlkdWFsIGZpbHRlciB0eXBlcyBhcmUgUE5HX0ZJTFRFUl9OT05FLCBQTkdfRklMVEVSX1NVQiwKLVBOR19GSUxURVJfVVAsIFBOR19GSUxURVJfQVZHLCBQTkdfRklMVEVSX1BBRVRILCB3aGljaCBjYW4gYmUgYml0d2lzZQotT1JlZCB0b2dldGhlciB3aXRoICd8JyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbHRlcnMgdG8gdXNlLgotVGhlc2UgZmlsdGVycyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbi4KLUlmIHlvdSBpbnRlbmQgdG8gY2hhbmdlIHRoZSBmaWx0ZXIgdHlwZSBkdXJpbmcgdGhlIGNvdXJzZSBvZiB3cml0aW5nCi10aGUgaW1hZ2UsIHlvdSBzaG91bGQgc3RhcnQgd2l0aCBmbGFncyBzZXQgZm9yIGFsbCBvZiB0aGUgZmlsdGVycwoteW91IGludGVuZCB0byB1c2Ugc28gdGhhdCBsaWJwbmcgY2FuIGluaXRpYWxpemUgaXRzIGludGVybmFsCi1zdHJ1Y3R1cmVzIGFwcHJvcHJpYXRlbHkgZm9yIGFsbCBvZiB0aGUgZmlsdGVyIHR5cGVzLiAgKE5vdGUgdGhhdCB0aGlzCi1tZWFucyB0aGUgZmlyc3Qgcm93IG11c3QgYWx3YXlzIGJlIGFkYXB0aXZlbHkgZmlsdGVyZWQsIGJlY2F1c2UgbGlicG5nCi1jdXJyZW50bHkgZG9lcyBub3QgYWxsb2NhdGUgdGhlIGZpbHRlciBidWZmZXJzIHVudGlsIHBuZ193cml0ZV9yb3coKQotaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZS4pCi0KLSAgICBmaWx0ZXJzID0gUE5HX0ZJTFRFUl9OT05FIHwgUE5HX0ZJTFRFUl9TVUIKLSAgICAgICAgICAgICAgUE5HX0ZJTFRFUl9VUCB8IFBOR19GSUxURVJfQVZHIHwKLSAgICAgICAgICAgICAgUE5HX0ZJTFRFUl9QQUVUSCB8IFBOR19BTExfRklMVEVSUzsKLQotICAgIHBuZ19zZXRfZmlsdGVyKHBuZ19wdHIsIFBOR19GSUxURVJfVFlQRV9CQVNFLAotICAgICAgIGZpbHRlcnMpOwotICAgICAgICAgICAgICBUaGUgc2Vjb25kIHBhcmFtZXRlciBjYW4gYWxzbyBiZQotICAgICAgICAgICAgICBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcgaWYgeW91IGFyZQotICAgICAgICAgICAgICB3cml0aW5nIGEgUE5HIHRvIGJlIGVtYmVkZGVkIGluIGEgTU5HCi0gICAgICAgICAgICAgIGRhdGFzdHJlYW0uICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIHRoZQotICAgICAgICAgICAgICBzYW1lIGFzIHRoZSB2YWx1ZSBvZiBmaWx0ZXJfbWV0aG9kIHVzZWQKLSAgICAgICAgICAgICAgaW4gcG5nX3NldF9JSERSKCkuCi0KLUl0IGlzIGFsc28gcG9zc2libGUgdG8gaW5mbHVlbmNlIGhvdyBsaWJwbmcgY2hvb3NlcyBmcm9tIGFtb25nIHRoZQotYXZhaWxhYmxlIGZpbHRlcnMuICBUaGlzIGlzIGRvbmUgaW4gb25lIG9yIGJvdGggb2YgdHdvIHdheXMgLSBieQotdGVsbGluZyBpdCBob3cgaW1wb3J0YW50IGl0IGlzIHRvIGtlZXAgdGhlIHNhbWUgZmlsdGVyIGZvciBzdWNjZXNzaXZlCi1yb3dzLCBhbmQgYnkgdGVsbGluZyBpdCB0aGUgcmVsYXRpdmUgY29tcHV0YXRpb25hbCBjb3N0cyBvZiB0aGUgZmlsdGVycy4KLQotICAgIGRvdWJsZSB3ZWlnaHRzWzNdID0gezEuNSwgMS4zLCAxLjF9LAotICAgICAgIGNvc3RzW1BOR19GSUxURVJfVkFMVUVfTEFTVF0gPQotICAgICAgIHsxLjAsIDEuMywgMS4zLCAxLjUsIDEuN307Ci0KLSAgICBwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzKHBuZ19wdHIsCi0gICAgICAgUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQsIDMsCi0gICAgICAgd2VpZ2h0cywgY29zdHMpOwotCi1UaGUgd2VpZ2h0cyBhcmUgbXVsdGlwbHlpbmcgZmFjdG9ycyB0aGF0IGluZGljYXRlIHRvIGxpYnBuZyB0aGF0IHRoZQotcm93IGZpbHRlciBzaG91bGQgYmUgdGhlIHNhbWUgZm9yIHN1Y2Nlc3NpdmUgcm93cyB1bmxlc3MgYW5vdGhlciByb3cgZmlsdGVyCi1pcyB0aGF0IG1hbnkgdGltZXMgYmV0dGVyIHRoYW4gdGhlIHByZXZpb3VzIGZpbHRlci4gIEluIHRoZSBhYm92ZSBleGFtcGxlLAotaWYgdGhlIHByZXZpb3VzIDMgZmlsdGVycyB3ZXJlIFNVQiwgU1VCLCBOT05FLCB0aGUgU1VCIGZpbHRlciBjb3VsZCBoYXZlIGEKLSJzdW0gb2YgYWJzb2x1dGUgZGlmZmVyZW5jZXMiIDEuNSB4IDEuMyB0aW1lcyBoaWdoZXIgdGhhbiBvdGhlciBmaWx0ZXJzCi1hbmQgc3RpbGwgYmUgY2hvc2VuLCB3aGlsZSB0aGUgTk9ORSBmaWx0ZXIgY291bGQgaGF2ZSBhIHN1bSAxLjEgdGltZXMKLWhpZ2hlciB0aGFuIG90aGVyIGZpbHRlcnMgYW5kIHN0aWxsIGJlIGNob3Nlbi4gIFVuc3BlY2lmaWVkIHdlaWdodHMgYXJlCi10YWtlbiB0byBiZSAxLjAsIGFuZCB0aGUgc3BlY2lmaWVkIHdlaWdodHMgc2hvdWxkIHByb2JhYmx5IGJlIGRlY2xpbmluZwotbGlrZSB0aG9zZSBhYm92ZSBpbiBvcmRlciB0byBlbXBoYXNpemUgcmVjZW50IGZpbHRlcnMgb3ZlciBvbGRlciBmaWx0ZXJzLgotCi1UaGUgZmlsdGVyIGNvc3RzIHNwZWNpZnkgZm9yIGVhY2ggZmlsdGVyIHR5cGUgYSByZWxhdGl2ZSBkZWNvZGluZyBjb3N0Ci10byBiZSBjb25zaWRlcmVkIHdoZW4gc2VsZWN0aW5nIHJvdyBmaWx0ZXJzLiAgVGhpcyBtZWFucyB0aGF0IGZpbHRlcnMKLXdpdGggaGlnaGVyIGNvc3RzIGFyZSBsZXNzIGxpa2VseSB0byBiZSBjaG9zZW4gb3ZlciBmaWx0ZXJzIHdpdGggbG93ZXIKLWNvc3RzLCB1bmxlc3MgdGhlaXIgInN1bSBvZiBhYnNvbHV0ZSBkaWZmZXJlbmNlcyIgaXMgdGhhdCBtdWNoIHNtYWxsZXIuCi1UaGUgY29zdHMgZG8gbm90IG5lY2Vzc2FyaWx5IHJlZmxlY3QgdGhlIGV4YWN0IGNvbXB1dGF0aW9uYWwgc3BlZWRzIG9mCi10aGUgdmFyaW91cyBmaWx0ZXJzLCBzaW5jZSB0aGlzIHdvdWxkIHVuZHVseSBpbmZsdWVuY2UgdGhlIGZpbmFsIGltYWdlCi1zaXplLgotCi1Ob3RlIHRoYXQgdGhlIG51bWJlcnMgYWJvdmUgd2VyZSBpbnZlbnRlZCBwdXJlbHkgZm9yIHRoaXMgZXhhbXBsZSBhbmQKLWFyZSBnaXZlbiBvbmx5IHRvIGhlbHAgZXhwbGFpbiB0aGUgZnVuY3Rpb24gdXNhZ2UuICBMaXR0bGUgdGVzdGluZyBoYXMKLWJlZW4gZG9uZSB0byBmaW5kIG9wdGltdW0gdmFsdWVzIGZvciBlaXRoZXIgdGhlIGNvc3RzIG9yIHRoZSB3ZWlnaHRzLgotCi1SZW1vdmluZyB1bndhbnRlZCBvYmplY3QgY29kZQotCi1UaGVyZSBhcmUgYSBidW5jaCBvZiAjZGVmaW5lJ3MgaW4gcG5nY29uZi5oIHRoYXQgY29udHJvbCB3aGF0IHBhcnRzIG9mCi1saWJwbmcgYXJlIGNvbXBpbGVkLiAgQWxsIHRoZSBkZWZpbmVzIGVuZCBpbiBfU1VQUE9SVEVELiAgSWYgeW91IGFyZQotbmV2ZXIgZ29pbmcgdG8gdXNlIGEgY2FwYWJpbGl0eSwgeW91IGNhbiBjaGFuZ2UgdGhlICNkZWZpbmUgdG8gI3VuZGVmCi1iZWZvcmUgcmVjb21waWxpbmcgbGlicG5nIGFuZCBzYXZlIHlvdXJzZWxmIGNvZGUgYW5kIGRhdGEgc3BhY2UsIG9yCi15b3UgY2FuIHR1cm4gb2ZmIGluZGl2aWR1YWwgY2FwYWJpbGl0aWVzIHdpdGggZGVmaW5lcyB0aGF0IGJlZ2luIHdpdGgKLVBOR19OT18uCi0KLVlvdSBjYW4gYWxzbyB0dXJuIGFsbCBvZiB0aGUgdHJhbnNmb3JtcyBhbmQgYW5jaWxsYXJ5IGNodW5rIGNhcGFiaWxpdGllcwotb2ZmIGVuIG1hc3NlIHdpdGggY29tcGlsZXIgZGlyZWN0aXZlcyB0aGF0IGRlZmluZQotUE5HX05PX1JFQURbb3IgV1JJVEVdX1RSQU5TRk9STVMsIG9yIFBOR19OT19SRUFEW29yIFdSSVRFXV9BTkNJTExBUllfQ0hVTktTLAotb3IgYWxsIGZvdXIsCi1hbG9uZyB3aXRoIGRpcmVjdGl2ZXMgdG8gdHVybiBvbiBhbnkgb2YgdGhlIGNhcGFiaWxpdGllcyB0aGF0IHlvdSBkbwotd2FudC4gIFRoZSBQTkdfTk9fUkVBRFtvciBXUklURV1fVFJBTlNGT1JNUyBkaXJlY3RpdmVzIGRpc2FibGUgdGhlIGV4dHJhCi10cmFuc2Zvcm1hdGlvbnMgYnV0IHN0aWxsIGxlYXZlIHRoZSBsaWJyYXJ5IGZ1bGx5IGNhcGFibGUgb2YgcmVhZGluZwotYW5kIHdyaXRpbmcgUE5HIGZpbGVzIHdpdGggYWxsIGtub3duIHB1YmxpYyBjaHVua3MuIFVzZSBvZiB0aGUKLVBOR19OT19SRUFEW29yIFdSSVRFXV9BTkNJTExBUllfQ0hVTktTIGRpcmVjdGl2ZSBwcm9kdWNlcyBhIGxpYnJhcnkKLXRoYXQgaXMgaW5jYXBhYmxlIG9mIHJlYWRpbmcgb3Igd3JpdGluZyBhbmNpbGxhcnkgY2h1bmtzLiAgSWYgeW91IGFyZQotbm90IHVzaW5nIHRoZSBwcm9ncmVzc2l2ZSByZWFkaW5nIGNhcGFiaWxpdHksIHlvdSBjYW4gdHVybiB0aGF0IG9mZgotd2l0aCBQTkdfTk9fUFJPR1JFU1NJVkVfUkVBRCAoZG9uJ3QgY29uZnVzZSB0aGlzIHdpdGggdGhlIElOVEVSTEFDSU5HCi1jYXBhYmlsaXR5LCB3aGljaCB5b3UnbGwgc3RpbGwgaGF2ZSkuCi0KLUFsbCB0aGUgcmVhZGluZyBhbmQgd3JpdGluZyBzcGVjaWZpYyBjb2RlIGFyZSBpbiBzZXBhcmF0ZSBmaWxlcywgc28gdGhlCi1saW5rZXIgc2hvdWxkIG9ubHkgZ3JhYiB0aGUgZmlsZXMgaXQgbmVlZHMuICBIb3dldmVyLCBpZiB5b3Ugd2FudCB0bwotbWFrZSBzdXJlLCBvciBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEgc3RhbmQgYWxvbmUgbGlicmFyeSwgYWxsIHRoZQotcmVhZGluZyBmaWxlcyBzdGFydCB3aXRoICJwbmdyIiBhbmQgYWxsIHRoZSB3cml0aW5nIGZpbGVzIHN0YXJ0IHdpdGggInBuZ3ciLgotVGhlIGZpbGVzIHRoYXQgZG9uJ3QgbWF0Y2ggZWl0aGVyIChsaWtlIHBuZy5jLCBwbmd0cmFucy5jLCBldGMuKQotYXJlIHVzZWQgZm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZywgYW5kIGFsd2F5cyBuZWVkIHRvIGJlIGluY2x1ZGVkLgotVGhlIHByb2dyZXNzaXZlIHJlYWRlciBpcyBpbiBwbmdwcmVhZC5jCi0KLUlmIHlvdSBhcmUgY3JlYXRpbmcgb3IgZGlzdHJpYnV0aW5nIGEgZHluYW1pY2FsbHkgbGlua2VkIGxpYnJhcnkgKGEgLnNvCi1vciBETEwgZmlsZSksIHlvdSBzaG91bGQgbm90IHJlbW92ZSBvciBkaXNhYmxlIGFueSBwYXJ0cyBvZiB0aGUgbGlicmFyeSwKLWFzIHRoaXMgd2lsbCBjYXVzZSBhcHBsaWNhdGlvbnMgbGlua2VkIHdpdGggZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZQotbGlicmFyeSB0byBmYWlsIGlmIHRoZXkgY2FsbCBmdW5jdGlvbnMgbm90IGF2YWlsYWJsZSBpbiB5b3VyIGxpYnJhcnkuCi1UaGUgc2l6ZSBvZiB0aGUgbGlicmFyeSBpdHNlbGYgc2hvdWxkIG5vdCBiZSBhbiBpc3N1ZSwgYmVjYXVzZSBvbmx5Ci10aG9zZSBzZWN0aW9ucyB0aGF0IGFyZSBhY3R1YWxseSB1c2VkIHdpbGwgYmUgbG9hZGVkIGludG8gbWVtb3J5LgotCi1SZXF1ZXN0aW5nIGRlYnVnIHByaW50b3V0Ci0KLVRoZSBtYWNybyBkZWZpbml0aW9uIFBOR19ERUJVRyBjYW4gYmUgdXNlZCB0byByZXF1ZXN0IGRlYnVnZ2luZwotcHJpbnRvdXQuICBTZXQgaXQgdG8gYW4gaW50ZWdlciB2YWx1ZSBpbiB0aGUgcmFuZ2UgMCB0byAzLiAgSGlnaGVyCi1udW1iZXJzIHJlc3VsdCBpbiBpbmNyZWFzaW5nIGFtb3VudHMgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhlCi1pbmZvcm1hdGlvbiBpcyBwcmludGVkIHRvIHRoZSAic3RkZXJyIiBmaWxlLCB1bmxlc3MgYW5vdGhlciBmaWxlCi1uYW1lIGlzIHNwZWNpZmllZCBpbiB0aGUgUE5HX0RFQlVHX0ZJTEUgbWFjcm8gZGVmaW5pdGlvbi4KLQotV2hlbiBQTkdfREVCVUcgPiAwLCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyAobWFjcm9zKSBiZWNvbWUgYXZhaWxhYmxlOgotCi0gICBwbmdfZGVidWcobGV2ZWwsIG1lc3NhZ2UpCi0gICBwbmdfZGVidWcxKGxldmVsLCBtZXNzYWdlLCBwMSkKLSAgIHBuZ19kZWJ1ZzIobGV2ZWwsIG1lc3NhZ2UsIHAxLCBwMikKLQotaW4gd2hpY2ggImxldmVsIiBpcyBjb21wYXJlZCB0byBQTkdfREVCVUcgdG8gZGVjaWRlIHdoZXRoZXIgdG8gcHJpbnQKLXRoZSBtZXNzYWdlLCAibWVzc2FnZSIgaXMgdGhlIGZvcm1hdHRlZCBzdHJpbmcgdG8gYmUgcHJpbnRlZCwKLWFuZCBwMSBhbmQgcDIgYXJlIHBhcmFtZXRlcnMgdGhhdCBhcmUgdG8gYmUgZW1iZWRkZWQgaW4gdGhlIHN0cmluZwotYWNjb3JkaW5nIHRvIHByaW50Zi1zdHlsZSBmb3JtYXR0aW5nIGRpcmVjdGl2ZXMuICBGb3IgZXhhbXBsZSwKLQotICAgcG5nX2RlYnVnMSgyLCAiZm9vPSVkXG4iLCBmb28pOwotCi1pcyBleHBhbmRlZCB0bwotCi0gICBpZihQTkdfREVCVUcgPiAyKQotICAgICBmcHJpbnRmKFBOR19ERUJVR19GSUxFLCAiZm9vPSVkXG4iLCBmb28pOwotCi1XaGVuIFBOR19ERUJVRyBpcyBkZWZpbmVkIGJ1dCBpcyB6ZXJvLCB0aGUgbWFjcm9zIGFyZW4ndCBkZWZpbmVkLCBidXQgeW91Ci1jYW4gc3RpbGwgdXNlIFBOR19ERUJVRyB0byBjb250cm9sIHlvdXIgb3duIGRlYnVnZ2luZzoKLQotICAgI2lmZGVmIFBOR19ERUJVRwotICAgICAgIGZwcmludGYoc3RkZXJyLCAuLi4KLSAgICNlbmRpZgotCi1XaGVuIFBOR19ERUJVRyA9IDEsIHRoZSBtYWNyb3MgYXJlIGRlZmluZWQsIGJ1dCBvbmx5IHBuZ19kZWJ1ZyBzdGF0ZW1lbnRzCi1oYXZpbmcgbGV2ZWwgPSAwIHdpbGwgYmUgcHJpbnRlZC4gIFRoZXJlIGFyZW4ndCBhbnkgc3VjaCBzdGF0ZW1lbnRzIGluCi10aGlzIHZlcnNpb24gb2YgbGlicG5nLCBidXQgaWYgeW91IGluc2VydCBzb21lIHRoZXkgd2lsbCBiZSBwcmludGVkLgotCi1WSS4gIE1ORyBzdXBwb3J0Ci0KLVRoZSBNTkcgc3BlY2lmaWNhdGlvbiAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvbW5nKSBhbGxvd3MKLWNlcnRhaW4gZXh0ZW5zaW9ucyB0byBQTkcgZm9yIFBORyBpbWFnZXMgdGhhdCBhcmUgZW1iZWRkZWQgaW4gTU5HIGRhdGFzdHJlYW1zLgotTGlicG5nIGNhbiBzdXBwb3J0IHNvbWUgb2YgdGhlc2UgZXh0ZW5zaW9ucy4gIFRvIGVuYWJsZSB0aGVtLCB1c2UgdGhlCi1wbmdfcGVybWl0X21uZ19mZWF0dXJlcygpIGZ1bmN0aW9uOgotCi0gICBmZWF0dXJlX3NldCA9IHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKHBuZ19wdHIsIG1hc2spCi0gICBtYXNrIGlzIGEgcG5nX3VpbnRfMzIgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiB0aGUKLSAgICAgICAgZmVhdHVyZXMgeW91IHdhbnQgdG8gZW5hYmxlLiAgVGhlc2UgaW5jbHVkZQotICAgICAgICBQTkdfRkxBR19NTkdfRU1QVFlfUExURQotICAgICAgICBQTkdfRkxBR19NTkdfRklMVEVSXzY0Ci0gICAgICAgIFBOR19BTExfTU5HX0ZFQVRVUkVTCi0gICBmZWF0dXJlX3NldCBpcyBhIHBuZ191aW50XzMyIHRoYXQgaXMgdGhlIGJpdHdpc2UgQU5EIG9mCi0gICAgICB5b3VyIG1hc2sgd2l0aCB0aGUgc2V0IG9mIE1ORyBmZWF0dXJlcyB0aGF0IGlzCi0gICAgICBzdXBwb3J0ZWQgYnkgdGhlIHZlcnNpb24gb2YgbGlicG5nIHRoYXQgeW91IGFyZSB1c2luZy4KLQotSXQgaXMgYW4gZXJyb3IgdG8gdXNlIHRoaXMgZnVuY3Rpb24gd2hlbiByZWFkaW5nIG9yIHdyaXRpbmcgYSBzdGFuZGFsb25lCi1QTkcgZmlsZSB3aXRoIHRoZSBQTkcgOC1ieXRlIHNpZ25hdHVyZS4gIFRoZSBQTkcgZGF0YXN0cmVhbSBtdXN0IGJlIHdyYXBwZWQKLWluIGEgTU5HIGRhdGFzdHJlYW0uICBBcyBhIG1pbmltdW0sIGl0IG11c3QgaGF2ZSB0aGUgTU5HIDgtYnl0ZSBzaWduYXR1cmUKLWFuZCB0aGUgTUhEUiBhbmQgTUVORCBjaHVua3MuICBMaWJwbmcgZG9lcyBub3QgcHJvdmlkZSBzdXBwb3J0IGZvciB0aGVzZQotb3IgYW55IG90aGVyIE1ORyBjaHVua3M7IHlvdXIgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIGl0cyBvd24gc3VwcG9ydCBmb3IKLXRoZW0uICBZb3UgbWF5IHdpc2ggdG8gY29uc2lkZXIgdXNpbmcgbGlibW5nIChhdmFpbGFibGUgYXQKLWh0dHA6Ly93d3cubGlibW5nLmNvbSkgaW5zdGVhZC4KLQotVklJLiAgQ2hhbmdlcyB0byBMaWJwbmcgZnJvbSB2ZXJzaW9uIDAuODgKLQotSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdmVyc2lvbnMgb2YgbGlicG5nIGxhdGVyIHRoYW4gMC45NiBhcmUgbm90Ci1kaXN0cmlidXRlZCBieSB0aGUgb3JpZ2luYWwgbGlicG5nIGF1dGhvciwgR3V5IFNjaGFsbmF0LCBub3IgYnkKLUFuZHJlYXMgRGlsZ2VyLCB3aG8gaGFkIHRha2VuIG92ZXIgZnJvbSBHdXkgZHVyaW5nIDE5OTYgYW5kIDE5OTcsIGFuZAotZGlzdHJpYnV0ZWQgdmVyc2lvbnMgMC44OSB0aHJvdWdoIDAuOTYsIGJ1dCByYXRoZXIgYnkgYW5vdGhlciBtZW1iZXIKLW9mIHRoZSBvcmlnaW5hbCBQTkcgR3JvdXAsIEdsZW5uIFJhbmRlcnMtUGVocnNvbi4gIEd1eSBhbmQgQW5kcmVhcyBhcmUKLXN0aWxsIGFsaXZlIGFuZCB3ZWxsLCBidXQgdGhleSBoYXZlIG1vdmVkIG9uIHRvIG90aGVyIHRoaW5ncy4KLQotVGhlIG9sZCBsaWJwbmcgZnVuY3Rpb25zIHBuZ19yZWFkX2luaXQoKSwgcG5nX3dyaXRlX2luaXQoKSwKLXBuZ19pbmZvX2luaXQoKSwgcG5nX3JlYWRfZGVzdHJveSgpLCBhbmQgcG5nX3dyaXRlX2Rlc3Ryb3koKSBoYXZlIGJlZW4KLW1vdmVkIHRvIFBOR19JTlRFUk5BTCBpbiB2ZXJzaW9uIDAuOTUgdG8gZGlzY291cmFnZSB0aGVpciB1c2UuICBUaGVzZQotZnVuY3Rpb25zIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGxpYnBuZyB2ZXJzaW9uIDIuMC4wLgotCi1UaGUgcHJlZmVycmVkIG1ldGhvZCBvZiBjcmVhdGluZyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBsaWJwbmcgc3RydWN0dXJlcyBpcwotdmlhIHRoZSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCksIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KCksIGFuZAotcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCgpIGJlY2F1c2UgdGhleSBpc29sYXRlIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmVzCi1mcm9tIHRoZSBhcHBsaWNhdGlvbiwgYWxsb3cgdmVyc2lvbiBlcnJvciBjaGVja2luZywgYW5kIGFsc28gYWxsb3cgdGhlCi11c2Ugb2YgY3VzdG9tIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24sIHdoaWNoCi10aGUgb2xkIGZ1bmN0aW9ucyBkbyBub3QuICBUaGUgZnVuY3Rpb25zIHBuZ19yZWFkX2Rlc3Ryb3koKSBhbmQKLXBuZ193cml0ZV9kZXN0cm95KCkgZG8gbm90IGFjdHVhbGx5IGZyZWUgdGhlIG1lbW9yeSB0aGF0IGxpYnBuZwotYWxsb2NhdGVkIGZvciB0aGVzZSBzdHJ1Y3RzLCBidXQganVzdCByZXNldCB0aGUgZGF0YSBzdHJ1Y3R1cmVzLCBzbyB0aGV5Ci1jYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCkgYW5kCi1wbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKSBpZiB5b3UgZmVlbCB0aGVyZSBpcyB0b28gbXVjaCBzeXN0ZW0gb3ZlcmhlYWQKLWFsbG9jYXRpbmcgYW5kIGZyZWVpbmcgdGhlIHBuZ19zdHJ1Y3QgZm9yIGVhY2ggaW1hZ2UgcmVhZC4KLQotU2V0dGluZyB0aGUgZXJyb3IgY2FsbGJhY2tzIHZpYSBwbmdfc2V0X21lc3NhZ2VfZm4oKSBiZWZvcmUKLXBuZ19yZWFkX2luaXQoKSBhcyB3YXMgc3VnZ2VzdGVkIGluIGxpYnBuZy0wLjg4IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQKLWJlY2F1c2UgdGhpcyBjYXVzZWQgYXBwbGljYXRpb25zIHRoYXQgZG8gbm90IHVzZSBjdXN0b20gZXJyb3IgZnVuY3Rpb25zCi10byBmYWlsIGlmIHRoZSBwbmdfcHRyIHdhcyBub3QgaW5pdGlhbGl6ZWQgdG8gemVyby4gIEl0IGlzIHN0aWxsIHBvc3NpYmxlCi10byBzZXQgdGhlIGVycm9yIGNhbGxiYWNrcyBBRlRFUiBwbmdfcmVhZF9pbml0KCksIG9yIHRvIGNoYW5nZSB0aGVtIHdpdGgKLXBuZ19zZXRfZXJyb3JfZm4oKSwgd2hpY2ggaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgZnVuY3Rpb24sIGJ1dCB3aXRoIGEgbmV3Ci1uYW1lIHRvIGZvcmNlIGNvbXBpbGF0aW9uIGVycm9ycyB3aXRoIGFwcGxpY2F0aW9ucyB0aGF0IHRyeSB0byB1c2UgdGhlIG9sZAotbWV0aG9kLgotCi1TdGFydGluZyB3aXRoIHZlcnNpb24gMS4wLjcsIHlvdSBjYW4gZmluZCBvdXQgd2hpY2ggdmVyc2lvbiBvZiB0aGUgbGlicmFyeQoteW91IGFyZSB1c2luZyBhdCBydW4tdGltZToKLQotICAgcG5nX3VpbnRfMzIgbGlicG5nX3ZuID0gcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlcigpOwotCi1UaGUgbnVtYmVyIGxpYnBuZ192biBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBtYWpvciB2ZXJzaW9uLCBtaW5vcgotdmVyc2lvbiB3aXRoIGxlYWRpbmcgemVybywgYW5kIHJlbGVhc2UgbnVtYmVyIHdpdGggbGVhZGluZyB6ZXJvLAotKGUuZy4sIGxpYnBuZ192biBmb3IgdmVyc2lvbiAxLjAuNyBpcyAxMDAwNykuCi0KLVlvdSBjYW4gYWxzbyBjaGVjayB3aGljaCB2ZXJzaW9uIG9mIHBuZy5oIHlvdSB1c2VkIHdoZW4gY29tcGlsaW5nIHlvdXIKLWFwcGxpY2F0aW9uOgotCi0gICBwbmdfdWludF8zMiBhcHBsaWNhdGlvbl92biA9IFBOR19MSUJQTkdfVkVSOwotCi1WSUlJLiAgQ2hhbmdlcyB0byBMaWJwbmcgZnJvbSB2ZXJzaW9uIDEuMC54IHRvIDEuMi54Ci0KLVN1cHBvcnQgZm9yIHVzZXIgbWVtb3J5IG1hbmFnZW1lbnQgd2FzIGVuYWJsZWQgYnkgZGVmYXVsdC4gIFRvCi1hY2NvbXBsaXNoIHRoaXMsIHRoZSBmdW5jdGlvbnMgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCksCi1wbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yKCksIHBuZ19zZXRfbWVtX2ZuKCksIHBuZ19nZXRfbWVtX3B0cigpLAotcG5nX21hbGxvY19kZWZhdWx0KCksIGFuZCBwbmdfZnJlZV9kZWZhdWx0KCkgd2VyZSBhZGRlZC4KLQotU3VwcG9ydCBmb3IgdGhlIGlUWHQgY2h1bmsgaGFzIGJlZW4gZW5hYmxlZCBieSBkZWZhdWx0IGFzIG9mCi12ZXJzaW9uIDEuMi40MS4KLQotU3VwcG9ydCBmb3IgY2VydGFpbiBNTkcgZmVhdHVyZXMgd2FzIGVuYWJsZWQuCi0KLVN1cHBvcnQgZm9yIG51bWJlcmVkIGVycm9yIG1lc3NhZ2VzIHdhcyBhZGRlZC4gIEhvd2V2ZXIsIHdlIG5ldmVyIGdvdAotYXJvdW5kIHRvIGFjdHVhbGx5IG51bWJlcmluZyB0aGUgZXJyb3IgbWVzc2FnZXMuICBUaGUgZnVuY3Rpb24KLXBuZ19zZXRfc3RyaXBfZXJyb3JfbnVtYmVycygpIHdhcyBhZGRlZCAoTm90ZTogdGhlIHByb3RvdHlwZSBmb3IgdGhpcwotZnVuY3Rpb24gd2FzIGluYWR2ZXJ0ZW50bHkgcmVtb3ZlZCBmcm9tIHBuZy5oIGluIFBOR19OT19BU1NFTUJMRVJfQ09ERQotYnVpbGRzIG9mIGxpYnBuZy0xLjIuMTUuICBJdCB3YXMgcmVzdG9yZWQgaW4gbGlicG5nLTEuMi4zNikuCi0KLVRoZSBwbmdfbWFsbG9jX3dhcm4oKSBmdW5jdGlvbiB3YXMgYWRkZWQgYXQgbGlicG5nLTEuMi4zLiAgVGhpcyBpc3N1ZXMKLWEgcG5nX3dhcm5pbmcgYW5kIHJldHVybnMgTlVMTCBpbnN0ZWFkIG9mIGFib3J0aW5nIHdoZW4gaXQgZmFpbHMgdG8KLWFjcXVpcmUgdGhlIHJlcXVlc3RlZCBtZW1vcnkgYWxsb2NhdGlvbi4KLQotU3VwcG9ydCBmb3Igc2V0dGluZyB1c2VyIGxpbWl0cyBvbiBpbWFnZSB3aWR0aCBhbmQgaGVpZ2h0IHdhcyBlbmFibGVkCi1ieSBkZWZhdWx0LiAgVGhlIGZ1bmN0aW9ucyBwbmdfc2V0X3VzZXJfbGltaXRzKCksIHBuZ19nZXRfdXNlcl93aWR0aF9tYXgoKSwKLWFuZCBwbmdfZ2V0X3VzZXJfaGVpZ2h0X21heCgpIHdlcmUgYWRkZWQgYXQgbGlicG5nLTEuMi42LgotCi1UaGUgcG5nX3NldF9hZGRfYWxwaGEoKSBmdW5jdGlvbiB3YXMgYWRkZWQgYXQgbGlicG5nLTEuMi43LgotCi1UaGUgZnVuY3Rpb24gcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkgd2FzIGFkZGVkIGF0IGxpYnBuZy0xLjIuOS4KLVVubGlrZSBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpLCB0aGUgbmV3IGZ1bmN0aW9uIGRvZXMgbm90IGV4cGFuZCB0aGUKLXRSTlMgY2h1bmsgdG8gYWxwaGEuIFRoZSBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpIGZ1bmN0aW9uIGlzCi1kZXByZWNhdGVkLgotCi1BIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucyBpbiBzdXBwb3J0IG9mIHJ1bnRpbWUgc2VsZWN0aW9uIG9mCi1hc3NlbWJsZXIgY29kZSBmZWF0dXJlcyAoZXNwZWNpYWxseSBJbnRlbCBNTVggY29kZSBzdXBwb3J0KSB3ZXJlCi1hZGRlZCBhdCBsaWJwbmctMS4yLjA6Ci0KLSAgICBQTkdfQVNNX0ZMQUdfTU1YX1NVUFBPUlRfQ09NUElMRUQKLSAgICBQTkdfQVNNX0ZMQUdfTU1YX1NVUFBPUlRfSU5fQ1BVCi0gICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0NPTUJJTkVfUk9XCi0gICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0lOVEVSTEFDRQotICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfU1VCCi0gICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9VUAotICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfQVZHCi0gICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9QQUVUSAotICAgIFBOR19BU01fRkxBR1NfSU5JVElBTElaRUQKLSAgICBQTkdfTU1YX1JFQURfRkxBR1MKLSAgICBQTkdfTU1YX0ZMQUdTCi0gICAgUE5HX01NWF9XUklURV9GTEFHUwotICAgIFBOR19NTVhfRkxBR1MKLQotV2UgYWRkZWQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaW4gc3VwcG9ydCBvZiBydW50aW1lCi1zZWxlY3Rpb24gb2YgYXNzZW1ibGVyIGNvZGUgZmVhdHVyZXM6Ci0KLSAgICBwbmdfZ2V0X21teF9mbGFnbWFzaygpCi0gICAgcG5nX3NldF9tbXhfdGhyZXNob2xkcygpCi0gICAgcG5nX2dldF9hc21fZmxhZ3MoKQotICAgIHBuZ19nZXRfbW14X2JpdGRlcHRoX3RocmVzaG9sZCgpCi0gICAgcG5nX2dldF9tbXhfcm93Ynl0ZXNfdGhyZXNob2xkKCkKLSAgICBwbmdfc2V0X2FzbV9mbGFncygpCi0KLVdlIHJlcGxhY2VkIGFsbCBvZiB0aGVzZSBmdW5jdGlvbnMgd2l0aCBzaW1wbGUgc3R1YnMgaW4gbGlicG5nLTEuMi4yMCwKLXdoZW4gdGhlIEludGVsIGFzc2VtYmxlciBjb2RlIHdhcyByZW1vdmVkIGR1ZSB0byBhIGxpY2Vuc2luZyBpc3N1ZS4KLQotVGhlc2UgbWFjcm9zIGFyZSBkZXByZWNhdGVkOgotCi0gICAgUE5HX1JFQURfVFJBTlNGT1JNU19OT1RfU1VQUE9SVEVECi0gICAgUE5HX1BST0dSRVNTSVZFX1JFQURfTk9UX1NVUFBPUlRFRAotICAgIFBOR19OT19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECi0gICAgUE5HX1dSSVRFX1RSQU5TRk9STVNfTk9UX1NVUFBPUlRFRAotICAgIFBOR19SRUFEX0FOQ0lMTEFSWV9DSFVOS1NfTk9UX1NVUFBPUlRFRAotICAgIFBOR19XUklURV9BTkNJTExBUllfQ0hVTktTX05PVF9TVVBQT1JURUQKLQotVGhleSBoYXZlIGJlZW4gcmVwbGFjZWQsIHJlc3BlY3RpdmVseSwgYnk6Ci0KLSAgICBQTkdfTk9fUkVBRF9UUkFOU0ZPUk1TCi0gICAgUE5HX05PX1BST0dSRVNTSVZFX1JFQUQKLSAgICBQTkdfTk9fU0VRVUVOVElBTF9SRUFECi0gICAgUE5HX05PX1dSSVRFX1RSQU5TRk9STVMKLSAgICBQTkdfTk9fUkVBRF9BTkNJTExBUllfQ0hVTktTCi0gICAgUE5HX05PX1dSSVRFX0FOQ0lMTEFSWV9DSFVOS1MKLQotUE5HX01BWF9VSU5UIHdhcyByZXBsYWNlZCB3aXRoIFBOR19VSU5UXzMxX01BWC4gIEl0IGhhcyBiZWVuCi1kZXByZWNhdGVkIHNpbmNlIGxpYnBuZy0xLjAuMTYgYW5kIGxpYnBuZy0xLjIuNi4KLQotVGhlIGZ1bmN0aW9uCi0gICAgcG5nX2NoZWNrX3NpZyhzaWcsIG51bSkKLXdhcyByZXBsYWNlZCB3aXRoCi0gICAgIXBuZ19zaWdfY21wKHNpZywgMCwgbnVtKQotSXQgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSBsaWJwbmctMC45MC4KLQotVGhlIGZ1bmN0aW9uCi0gICAgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgoKQotd2hpY2ggYWxzbyBleHBhbmRzIHRSTlMgdG8gYWxwaGEgd2FzIHJlcGxhY2VkIHdpdGgKLSAgICBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKQotd2hpY2ggZG9lcyBub3QuIEl0IGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgbGlicG5nLTEuMC4xOCBhbmQgMS4yLjkuCi0KLUlYLiAgQ2hhbmdlcyB0byBMaWJwbmcgZnJvbSB2ZXJzaW9uIDEuMC54LzEuMi54IHRvIDEuNC54Ci0KLVByaXZhdGUgbGlicG5nIHByb3RvdHlwZXMgYW5kIG1hY3JvIGRlZmluaXRpb25zIHdlcmUgbW92ZWQgZnJvbQotcG5nLmggYW5kIHBuZ2NvbmYuaCBpbnRvIGEgbmV3IHBuZ3ByaXYuaCBoZWFkZXIgZmlsZS4KLQotRnVuY3Rpb25zIHBuZ19zZXRfYmVuaWduX2Vycm9ycygpLCBwbmdfYmVuaWduX2Vycm9yKCksIGFuZAotcG5nX2NodW5rX2Jlbmlnbl9lcnJvcigpIHdlcmUgYWRkZWQuCi0KLVN1cHBvcnQgZm9yIHNldHRpbmcgdGhlIG1heGltdW0gYW1vdW50IG9mIG1lbW9yeSB0aGF0IHRoZSBhcHBsaWNhdGlvbgotd2lsbCBhbGxvY2F0ZSBmb3IgcmVhZGluZyBjaHVua3Mgd2FzIGFkZGVkLCBhcyBhIHNlY3VyaXR5IG1lYXN1cmUuCi1UaGUgZnVuY3Rpb25zIHBuZ19zZXRfY2h1bmtfY2FjaGVfbWF4KCkgYW5kIHBuZ19nZXRfY2h1bmtfY2FjaGVfbWF4KCkKLXdlcmUgYWRkZWQgdG8gdGhlIGxpYnJhcnkuCi0KLVdlIGltcGxlbWVudGVkIHN1cHBvcnQgZm9yIEkvTyBzdGF0ZXMgYnkgYWRkaW5nIHBuZ19wdHIgbWVtYmVyIGlvX3N0YXRlCi1hbmQgZnVuY3Rpb25zIHBuZ19nZXRfaW9fY2h1bmtfbmFtZSgpIGFuZCBwbmdfZ2V0X2lvX3N0YXRlKCkgaW4gcG5nZ2V0LmMKLQotV2UgYWRkZWQgUE5HX1RSQU5TRk9STV9HUkFZX1RPX1JHQiB0byB0aGUgYXZhaWxhYmxlIGhpZ2gtbGV2ZWwKLWlucHV0IHRyYW5zZm9ybXMuCi0KLUNoZWNraW5nIGZvciBhbmQgcmVwb3J0aW5nIG9mIGVycm9ycyBpbiB0aGUgSUhEUiBjaHVuayBpcyBtb3JlIHRob3JvdWdoLgotCi1TdXBwb3J0IGZvciBnbG9iYWwgYXJyYXlzIHdhcyByZW1vdmVkLCB0byBpbXByb3ZlIHRocmVhZCBzYWZldHkuCi0KLVNvbWUgb2Jzb2xldGUvZGVwcmVjYXRlZCBtYWNyb3MgYW5kIGZ1bmN0aW9ucyBoYXZlIGJlZW4gcmVtb3ZlZC4KLQotVHlwZWNhc3RlZCBOVUxMIGRlZmluaXRpb25zIHN1Y2ggYXMKLSAgICNkZWZpbmUgcG5nX3ZvaWRwX05VTEwgICAgICAgICAgICAocG5nX3ZvaWRwKU5VTEwKLXdlcmUgZWxpbWluYXRlZC4gIElmIHlvdSB1c2VkIHRoZXNlIGluIHlvdXIgYXBwbGljYXRpb24sIGp1c3QgdXNlCi1OVUxMIGluc3RlYWQuCi0KLVRoZSBwbmdfc3RydWN0IGFuZCBpbmZvX3N0cnVjdCBtZW1iZXJzICJ0cmFucyIgYW5kICJ0cmFuc192YWx1ZXMiIHdlcmUKLWNoYW5nZWQgdG8gInRyYW5zX2FscGhhIiBhbmQgInRyYW5zX2NvbG9yIiwgcmVzcGVjdGl2ZWx5LgotCi1UaGUgb2Jzb2xldGUsIHVudXNlZCBwbmdnY2NyZC5jIGFuZCBwbmd2Y3JkLmMgZmlsZXMgYW5kIHJlbGF0ZWQgbWFrZWZpbGVzCi13ZXJlIHJlbW92ZWQuCi0KLVRoZSBQTkdfMV8wX1ggYW5kIFBOR18xXzJfWCBtYWNyb3Mgd2VyZSBlbGltaW5hdGVkLgotCi1UaGUgUE5HX0xFR0FDWV9TVVBQT1JURUQgbWFjcm8gd2FzIGVsaW1pbmF0ZWQuCi0KLU1hbnkgV0lOMzJfV0NFICNpZmRlZnMgd2VyZSByZW1vdmVkLgotCi1UaGUgZnVuY3Rpb25zIHBuZ19yZWFkX2luaXQoaW5mb19wdHIpLCBwbmdfd3JpdGVfaW5pdChpbmZvX3B0ciksCi1wbmdfaW5mb19pbml0KGluZm9fcHRyKSwgcG5nX3JlYWRfZGVzdHJveSgpLCBhbmQgcG5nX3dyaXRlX2Rlc3Ryb3koKQotaGF2ZSBiZWVuIHJlbW92ZWQuICBUaGV5IGhhdmUgYmVlbiBkZXByZWNhdGVkIHNpbmNlIGxpYnBuZy0wLjk1LgotCi1UaGUgcG5nX3Blcm1pdF9lbXB0eV9wbHRlKCkgd2FzIHJlbW92ZWQuIEl0IGhhcyBiZWVuIGRlcHJlY2F0ZWQKLXNpbmNlIGxpYnBuZy0xLjAuOS4gIFVzZSBwbmdfcGVybWl0X21uZ19mZWF0dXJlcygpIGluc3RlYWQuCi0KLVdlIHJlbW92ZWQgdGhlIG9ic29sZXRlIHN0dWIgZnVuY3Rpb25zIHBuZ19nZXRfbW14X2ZsYWdtYXNrKCksCi1wbmdfc2V0X21teF90aHJlc2hvbGRzKCksIHBuZ19nZXRfYXNtX2ZsYWdzKCksCi1wbmdfZ2V0X21teF9iaXRkZXB0aF90aHJlc2hvbGQoKSwgcG5nX2dldF9tbXhfcm93Ynl0ZXNfdGhyZXNob2xkKCksCi1wbmdfc2V0X2FzbV9mbGFncygpLCBhbmQgcG5nX21teF9zdXBwb3J0ZWQoKQotCi1XZSByZW1vdmVkIHRoZSBvYnNvbGV0ZSBwbmdfY2hlY2tfc2lnKCksIHBuZ19tZW1jcHlfY2hlY2soKSwgYW5kCi1wbmdfbWVtc2V0X2NoZWNrKCkgZnVuY3Rpb25zLiAgSW5zdGVhZCB1c2UgIXBuZ19zaWdfY21wKCksIHBuZ19tZW1jcHkoKSwKLWFuZCBwbmdfbWVtc2V0KCksIHJlc3BlY3RpdmVseS4KLQotVGhlIGZ1bmN0aW9uIHBuZ19zZXRfZ3JheV8xXzJfNF90b184KCkgd2FzIHJlbW92ZWQuIEl0IGhhcyBiZWVuCi1kZXByZWNhdGVkIHNpbmNlIGxpYnBuZy0xLjAuMTggYW5kIDEuMi45LCB3aGVuIGl0IHdhcyByZXBsYWNlZCB3aXRoCi1wbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKSBiZWNhdXNlIHRoZSBmb3JtZXIgZnVuY3Rpb24gYWxzbwotZXhwYW5kZWQgcGFsZXR0ZSBpbWFnZXMuCi0KLU1hY3JvcyBmb3IgcG5nX2dldF91aW50XzE2LCBwbmdfZ2V0X3VpbnRfMzIsIGFuZCBwbmdfZ2V0X2ludF8zMgotd2VyZSBhZGRlZCBhbmQgYXJlIHVzZWQgYnkgZGVmYXVsdCBpbnN0ZWFkIG9mIHRoZSBjb3JyZXNwb25kaW5nCi1mdW5jdGlvbnMuIFVuZm9ydHVuYXRlbHksCi1mcm9tIGxpYnBuZy0xLjQuMCB1bnRpbCAxLjQuNCwgdGhlIHBuZ19nZXRfdWludF8xNiBtYWNybyAoYnV0IG5vdCB0aGUgIAotZnVuY3Rpb24pIGluY29ycmVjdGx5IHJldHVybmVkIGEgdmFsdWUgb2YgdHlwZSBwbmdfdWludF8zMi4KLQotV2UgY2hhbmdlZCB0aGUgcHJvdG90eXBlIGZvciBwbmdfbWFsbG9jKCkgZnJvbQotICAgIHBuZ19tYWxsb2MocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgc2l6ZSkKLXRvCi0gICAgcG5nX21hbGxvYyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpCi0KLVRoaXMgYWxzbyBhcHBsaWVzIHRvIHRoZSBwcm90b3R5cGUgZm9yIHRoZSB1c2VyIHJlcGxhY2VtZW50IG1hbGxvY19mbigpLgotCi1UaGUgcG5nX2NhbGxvYygpIGZ1bmN0aW9uIHdhcyBhZGRlZCBhbmQgaXMgdXNlZCBpbiBwbGFjZSBvZgotb2YgInBuZ19tYWxsb2MoKTsgcG5nX21lbXNldCgpOyIgZXhjZXB0IGluIHRoZSBjYXNlIGluIHBuZ19yZWFkX3BuZygpCi13aGVyZSB0aGUgYXJyYXkgY29uc2lzdHMgb2YgcG9pbnRlcnM7IGluIHRoaXMgY2FzZSBhICJmb3IiIGxvb3AgaXMgdXNlZAotYWZ0ZXIgdGhlIHBuZ19tYWxsb2MoKSB0byBzZXQgdGhlIHBvaW50ZXJzIHRvIE5VTEwsIHRvIGdpdmUgcm9idXN0LgotYmVoYXZpb3IgaW4gY2FzZSB0aGUgYXBwbGljYXRpb24gcnVucyBvdXQgb2YgbWVtb3J5IHBhcnQtd2F5IHRocm91Z2gKLXRoZSBwcm9jZXNzLgotCi1XZSBjaGFuZ2VkIHRoZSBwcm90b3R5cGVzIG9mIHBuZ19nZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUoKSBhbmQKLXBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUoKSB0byB3b3JrIHdpdGggcG5nX3NpemVfdCBpbnN0ZWFkIG9mCi1wbmdfdWludF8zMi4KLQotU3VwcG9ydCBmb3IgbnVtYmVyZWQgZXJyb3IgbWVzc2FnZXMgd2FzIHJlbW92ZWQgYnkgZGVmYXVsdCwgc2luY2Ugd2UKLW5ldmVyIGdvdCBhcm91bmQgdG8gYWN0dWFsbHkgbnVtYmVyaW5nIHRoZSBlcnJvciBtZXNzYWdlcy4gVGhlIGZ1bmN0aW9uCi1wbmdfc2V0X3N0cmlwX2Vycm9yX251bWJlcnMoKSB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBsaWJyYXJ5IGJ5IGRlZmF1bHQuCi0KLVRoZSBwbmdfemFsbG9jKCkgYW5kIHBuZ196ZnJlZSgpIGZ1bmN0aW9ucyBhcmUgbm8gbG9uZ2VyIGV4cG9ydGVkLgotVGhlIHBuZ196YWxsb2MoKSBmdW5jdGlvbiBubyBsb25nZXIgemVyb2VzIG91dCB0aGUgbWVtb3J5IHRoYXQgaXQKLWFsbG9jYXRlcy4KLQotU3VwcG9ydCBmb3IgZGl0aGVyaW5nIHdhcyBkaXNhYmxlZCBieSBkZWZhdWx0IGluIGxpYnBuZy0xLjQuMCwgYmVjYXVzZQotaXQgaGFzIG5vdCBiZWVuIHdlbGwgdGVzdGVkIGFuZCBkb2Vzbid0IGFjdHVhbGx5ICJkaXRoZXIiLgotVGhlIGNvZGUgd2FzIG5vdAotcmVtb3ZlZCwgaG93ZXZlciwgYW5kIGNvdWxkIGJlIGVuYWJsZWQgYnkgYnVpbGRpbmcgbGlicG5nIHdpdGgKLVBOR19SRUFEX0RJVEhFUl9TVVBQT1JURUQgZGVmaW5lZC4gIEluIGxpYnBuZy0xLjQuMiwgdGhpcyBzdXBwb3J0Ci13YXMgcmVlbmFibGVkLCBidXQgdGhlIGZ1bmN0aW9uIHdhcyByZW5hbWVkIHBuZ19zZXRfcXVhbnRpemUoKSB0bwotcmVmbGVjdCBtb3JlIGFjY3VyYXRlbHkgd2hhdCBpdCBhY3R1YWxseSBkb2VzLiAgQXQgdGhlIHNhbWUgdGltZSwKLXRoZSBQTkdfRElUSEVSX1tSRUQsR1JFRU5fQkxVRV1fQklUUyBtYWNyb3Mgd2VyZSBhbHNvIHJlbmFtZWQgdG8KLVBOR19RVUFOVElaRV9bUkVELEdSRUVOLEJMVUVdX0JJVFMuCi0KLVdlIHJlbW92ZWQgdGhlIHRyYWlsaW5nICcuJyBmcm9tIHRoZSB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcy4KLQotWC4gRGV0ZWN0aW5nIGxpYnBuZwotCi1UaGUgcG5nX2dldF9pb19wdHIoKSBmdW5jdGlvbiBoYXMgYmVlbiBwcmVzZW50IHNpbmNlIGxpYnBuZy0wLjg4LCBoYXMgbmV2ZXIKLWNoYW5nZWQsIGFuZCBpcyB1bmFmZmVjdGVkIGJ5IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIG1hY3Jvcy4gIEl0IGlzIHRoZQotYmVzdCBjaG9pY2UgZm9yIHVzZSBpbiBjb25maWd1cmUgc2NyaXB0cyBmb3IgZGV0ZWN0aW5nIHRoZSBwcmVzZW5jZSBvZiBhbnkKLWxpYnBuZyB2ZXJzaW9uIHNpbmNlIDAuODguICBJbiBhbiBhdXRvY29uZiAiY29uZmlndXJlLmluIiB5b3UgY291bGQgdXNlCi0KLSAgICBBQ19DSEVDS19MSUIocG5nLCBwbmdfZ2V0X2lvX3B0ciwgLi4uCi0KLVhJLiBTb3VyY2UgY29kZSByZXBvc2l0b3J5Ci0KLVNpbmNlIGFib3V0IEZlYnJ1YXJ5IDIwMDksIHZlcnNpb24gMS4yLjM0LCBsaWJwbmcgaGFzIGJlZW4gdW5kZXIgImdpdCIgc291cmNlCi1jb250cm9sLiAgVGhlIGdpdCByZXBvc2l0b3J5IHdhcyBidWlsdCBmcm9tIG9sZCBsaWJwbmcteC55LnoudGFyLmd6IGZpbGVzCi1nb2luZyBiYWNrIHRvIHZlcnNpb24gMC43MC4gIFlvdSBjYW4gYWNjZXNzIHRoZSBnaXQgcmVwb3NpdG9yeSAocmVhZCBvbmx5KQotYXQKLQotICAgIGdpdDovL2xpYnBuZy5naXQuc291cmNlZm9yZ2UubmV0L2dpdHJvb3QvbGlicG5nCi0KLW9yIHlvdSBjYW4gYnJvd3NlIGl0IHZpYSAiZ2l0d2ViIiBhdAotCi0gICAgaHR0cDovL2xpYnBuZy5naXQuc291cmNlZm9yZ2UubmV0L2dpdC9naXR3ZWIuY2dpP3A9bGlicG5nCi0KLVBhdGNoZXMgY2FuIGJlIHNlbnQgdG8gZ2xlbm5ycCBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQgb3IgdG8KLXBuZy1tbmctaW1wbGVtZW50IGF0IGxpc3RzLnNvdXJjZWZvcmdlLm5ldCBvciB5b3UgY2FuIHVwbG9hZCB0aGVtIHRvCi10aGUgbGlicG5nIGJ1ZyB0cmFja2VyIGF0Ci0KLSAgICBodHRwOi8vbGlicG5nLnNvdXJjZWZvcmdlLm5ldAotCi1YSUkuIENvZGluZyBzdHlsZQotCi1PdXIgY29kaW5nIHN0eWxlIGlzIHNpbWlsYXIgdG8gdGhlICJBbGxtYW4iIHN0eWxlLCB3aXRoIGN1cmx5Ci1icmFjZXMgb24gc2VwYXJhdGUgbGluZXM6Ci0KLSAgICBpZiAoY29uZGl0aW9uKQotICAgIHsKLSAgICAgICBhY3Rpb247Ci0gICAgfQotCi0gICAgZWxzZSBpZiAoYW5vdGhlciBjb25kaXRpb24pCi0gICAgewotICAgICAgIGFub3RoZXIgYWN0aW9uOwotICAgIH0KLQotVGhlIGJyYWNlcyBjYW4gYmUgb21pdHRlZCBmcm9tIHNpbXBsZSBvbmUtbGluZSBhY3Rpb25zOgotCi0gICAgaWYgKGNvbmRpdGlvbikKLSAgICAgICByZXR1cm4gKDApOwotCi1XZSB1c2UgMy1zcGFjZSBpbmRlbnRhdGlvbiwgZXhjZXB0IGZvciBjb250aW51ZWQgc3RhdGVtZW50cyB3aGljaAotYXJlIHVzdWFsbHkgaW5kZW50ZWQgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHN0YXRlbWVudAotcGx1cyBmb3VyIG1vcmUgc3BhY2VzLgotCi1Gb3IgbWFjcm8gZGVmaW5pdGlvbnMgd2UgdXNlIDItc3BhY2UgaW5kZW50YXRpb24sIGFsd2F5cyBsZWF2aW5nIHRoZSAiIyIKLWluIHRoZSBmaXJzdCBjb2x1bW4uCi0KLSAgICAjaWZuZGVmIFBOR19OT19GRUFUVVJFCi0gICAgIyAgaWZuZGVmIFBOR19GRUFUVVJFX1NVUFBPUlRFRAotICAgICMgICAgZGVmaW5lIFBOR19GRUFUVVJFX1NVUFBPUlRFRAotICAgICMgIGVuZGlmCi0gICAgI2VuZGlmCi0KLUNvbW1lbnRzIGFwcGVhciB3aXRoIHRoZSBsZWFkaW5nICIvKiIgYXQgdGhlIHNhbWUgaW5kZW50YXRpb24gYXMKLXRoZSBzdGF0ZW1lbnQgdGhhdCBmb2xsb3dzIHRoZSBjb21tZW50OgotCi0gICAgLyogU2luZ2xlLWxpbmUgY29tbWVudCAqLwotICAgIHN0YXRlbWVudDsKLQotICAgIC8qIFRoaXMgaXMgYSBtdWx0aXBsZS1saW5lCi0gICAgICogY29tbWVudC4KLSAgICAgKi8KLSAgICBzdGF0ZW1lbnQ7Ci0KLVZlcnkgc2hvcnQgY29tbWVudHMgY2FuIGJlIHBsYWNlZCBhZnRlciB0aGUgZW5kIG9mIHRoZSBzdGF0ZW1lbnQKLXRvIHdoaWNoIHRoZXkgcGVydGFpbjoKLQotICAgIHN0YXRlbWVudDsgICAgLyogY29tbWVudCAqLwotCi1XZSBkb24ndCB1c2UgQysrIHN0eWxlICgiLy8iKSBjb21tZW50cy4gV2UgaGF2ZSwgaG93ZXZlciwKLXVzZWQgdGhlbSBpbiB0aGUgcGFzdCBpbiBzb21lIG5vdy1hYmFuZG9uZWQgTU1YIGFzc2VtYmxlcgotY29kZS4KLQotRnVuY3Rpb25zIGFuZCB0aGVpciBjdXJseSBicmFjZXMgYXJlIG5vdCBpbmRlbnRlZCwgYW5kCi1leHBvcnRlZCBmdW5jdGlvbnMgYXJlIG1hcmtlZCB3aXRoIFBOR0FQSToKLQotIC8qIFRoaXMgaXMgYSBwdWJsaWMgZnVuY3Rpb24gdGhhdCBpcyB2aXNpYmxlIHRvCi0gICogYXBwbGljYXRpb24gcHJvZ3JhbWVycy4gSXQgZG9lcyB0aHVzLWFuZC1zby4KLSAgKi8KLSB2b2lkIFBOR0FQSQotIHBuZ19leHBvcnRlZF9mdW5jdGlvbihwbmdfcHRyLCBwbmdfaW5mbywgZm9vKQotIHsKLSAgICBib2R5OwotIH0KLQotVGhlIHByb3RvdHlwZXMgZm9yIGFsbCBleHBvcnRlZCBmdW5jdGlvbnMgYXBwZWFyIGluIHBuZy5oLAotYWJvdmUgdGhlIGNvbW1lbnQgdGhhdCBzYXlzCi0KLSAgICAvKiBNYWludGFpbmVyOiBQdXQgbmV3IHB1YmxpYyBwcm90b3R5cGVzIGhlcmUgLi4uICovCi0KLVdlIG1hcmsgYWxsIG5vbi1leHBvcnRlZCBmdW5jdGlvbnMgd2l0aCAiLyogUFJJVkFURSAqLyIiOgotCi0gdm9pZCAvKiBQUklWQVRFICovCi0gcG5nX25vbl9leHBvcnRlZF9mdW5jdGlvbihwbmdfcHRyLCBwbmdfaW5mbywgZm9vKQotIHsKLSAgICBib2R5OwotIH0KLQotVGhlIHByb3RvdHlwZXMgZm9yIG5vbi1leHBvcnRlZCBmdW5jdGlvbnMgKGV4Y2VwdCBmb3IgdGhvc2UgaW4KLXBuZ3Rlc3QpIGFwcGVhciBpbgotcG5ncHJpdi5oCi1hYm92ZSB0aGUgY29tbWVudCB0aGF0IHNheXMKLQotICAvKiBNYWludGFpbmVyOiBQdXQgbmV3IHByaXZhdGUgcHJvdG90eXBlcyBoZXJlIF4gYW5kIGluIGxpYnBuZ3BmLjMgKi8KLQotVG8gYXZvaWQgcG9sbHV0aW5nIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCB0aGUgbmFtZXMgb2YgYWxsIGV4cG9ydGVkCi1mdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBiZWdpbiB3aXRoICJwbmdfIiwgYW5kIGFsbCBwdWJsaWNseSB2aXNpYmxlIEMKLXByZXByb2Nlc3NvciBtYWNyb3MgYmVnaW4gd2l0aCAiUE5HIi4gIFdlIHJlcXVlc3QgdGhhdCBhcHBsaWNhdGlvbnMgdGhhdAotdXNlIGxpYnBuZyAqbm90KiBiZWdpbiBhbnkgb2YgdGhlaXIgb3duIHN5bWJvbHMgd2l0aCBlaXRoZXIgb2YgdGhlc2Ugc3RyaW5ncy4KLQotV2UgcHV0IGEgc3BhY2UgYWZ0ZXIgZWFjaCBjb21tYSBhbmQgYWZ0ZXIgZWFjaCBzZW1pY29sb24KLWluICJmb3IiIHN0YXRtZW50cywgYW5kIHdlIHB1dCBzcGFjZXMgYmVmb3JlIGFuZCBhZnRlciBlYWNoCi1DIGJpbmFyeSBvcGVyYXRvciBhbmQgYWZ0ZXIgImZvciIgb3IgIndoaWxlIiwgYW5kIGJlZm9yZQotIj8iLiAgV2UgZG9uJ3QgcHV0IGEgc3BhY2UgYmV0d2VlbiBhIHR5cGVjYXN0IGFuZCB0aGUgZXhwcmVzc2lvbgotYmVpbmcgY2FzdCwgbm9yIGRvIHdlIHB1dCBvbmUgYmV0d2VlbiBhIGZ1bmN0aW9uIG5hbWUgYW5kIHRoZQotbGVmdCBwYXJlbnRoZXNpcyB0aGF0IGZvbGxvd3MgaXQ6Ci0KLSAgICBmb3IgKGkgPSAyOyBpID4gMDsgLS1pKQotICAgICAgIHlbaV0gPSBhKHgpICsgKGludCliOwotCi1XZSBwcmVmZXIgI2lmZGVmIGFuZCAjaWZuZGVmIHRvICNpZiBkZWZpbmVkKCkgYW5kIGlmICFkZWZpbmVkKCkKLXdoZW4gdGhlcmUgaXMgb25seSBvbmUgbWFjcm8gYmVpbmcgdGVzdGVkLgotCi1XZSBkbyBub3QgdXNlIHRoZSBUQUIgY2hhcmFjdGVyIGZvciBpbmRlbnRhdGlvbiBpbiB0aGUgQyBzb3VyY2VzLgotCi1MaW5lcyBkbyBub3QgZXhjZWVkIDgwIGNoYXJhY3RlcnMuCi0KLU90aGVyIHJ1bGVzIGNhbiBiZSBpbmZlcnJlZCBieSBpbnNwZWN0aW5nIHRoZSBsaWJwbmcgc291cmNlLgotCi1YSUlJLiBZMksgQ29tcGxpYW5jZSBpbiBsaWJwbmcKLQotSnVseSAxMCwgMjAxMgotCi1TaW5jZSB0aGUgUE5HIERldmVsb3BtZW50IGdyb3VwIGlzIGFuIGFkLWhvYyBib2R5LCB3ZSBjYW4ndCBtYWtlCi1hbiBvZmZpY2lhbCBkZWNsYXJhdGlvbi4KLQotVGhpcyBpcyB5b3VyIHVub2ZmaWNpYWwgYXNzdXJhbmNlIHRoYXQgbGlicG5nIGZyb20gdmVyc2lvbiAwLjcxIGFuZAotdXB3YXJkIHRocm91Z2ggMS40LjEyIGFyZSBZMksgY29tcGxpYW50LiAgSXQgaXMgbXkgYmVsaWVmIHRoYXQgZWFybGllcgotdmVyc2lvbnMgd2VyZSBhbHNvIFkySyBjb21wbGlhbnQuCi0KLUxpYnBuZyBvbmx5IGhhcyB0aHJlZSB5ZWFyIGZpZWxkcy4gIE9uZSBpcyBhIDItYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIHRoYXQKLXdpbGwgaG9sZCB5ZWFycyB1cCB0byA2NTUzNS4gIFRoZSBvdGhlciB0d28gaG9sZCB0aGUgZGF0ZSBpbiB0ZXh0Ci1mb3JtYXQsIGFuZCB3aWxsIGhvbGQgeWVhcnMgdXAgdG8gOTk5OS4KLQotVGhlIGludGVnZXIgaXMKLSAgICAicG5nX3VpbnRfMTYgeWVhciIgaW4gcG5nX3RpbWVfc3RydWN0LgotCi1UaGUgc3RyaW5ncyBhcmUKLSAgICAicG5nX2NoYXJwIHRpbWVfYnVmZmVyIiBpbiBwbmdfc3RydWN0IGFuZAotICAgICJuZWFyX3RpbWVfYnVmZmVyIiwgd2hpY2ggaXMgYSBsb2NhbCBjaGFyYWN0ZXIgc3RyaW5nIGluIHBuZy5jLgotCi1UaGVyZSBhcmUgc2V2ZW4gdGltZS1yZWxhdGVkIGZ1bmN0aW9uczoKLQotICAgIHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzKCkgaW4gcG5nLmMKLSAgICAgIChmb3JtZXJseSBwbmdfY29udmVydF90b19yZmNfMTE1MigpIGluIGVycm9yKQotICAgIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKCkgaW4gcG5nd3JpdGUuYywgY2FsbGVkCi0gICAgICBpbiBwbmd3cml0ZS5jCi0gICAgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBpbiBwbmd3cml0ZS5jCi0gICAgcG5nX2dldF90SU1FKCkgaW4gcG5nZ2V0LmMKLSAgICBwbmdfaGFuZGxlX3RJTUUoKSBpbiBwbmdydXRpbC5jLCBjYWxsZWQgaW4gcG5ncmVhZC5jCi0gICAgcG5nX3NldF90SU1FKCkgaW4gcG5nc2V0LmMKLSAgICBwbmdfd3JpdGVfdElNRSgpIGluIHBuZ3d1dGlsLmMsIGNhbGxlZCBpbiBwbmd3cml0ZS5jCi0KLUFsbCBhcHBlYXIgdG8gaGFuZGxlIGRhdGVzIHByb3Blcmx5IGluIGEgWTJLIGVudmlyb25tZW50LiAgVGhlCi1wbmdfY29udmVydF9mcm9tX3RpbWVfdCgpIGZ1bmN0aW9uIGNhbGxzIGdtdGltZSgpIHRvIGNvbnZlcnQgZnJvbSBzeXN0ZW0KLWNsb2NrIHRpbWUsIHdoaWNoIHJldHVybnMgKHllYXIgLSAxOTAwKSwgd2hpY2ggd2UgcHJvcGVybHkgY29udmVydCB0bwotdGhlIGZ1bGwgNC1kaWdpdCB5ZWFyLiAgVGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IGFwcGxpY2F0aW9ucyB1c2luZwotbGlicG5nIGFyZSBub3QgcGFzc2luZyA0LWRpZ2l0IHllYXJzIGludG8gdGhlIHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzKCkKLWZ1bmN0aW9uLCBvciB0aGF0IHRoZXkgYXJlIGluY29ycmVjdGx5IHBhc3Npbmcgb25seSBhIDItZGlnaXQgeWVhcgotaW5zdGVhZCBvZiAieWVhciAtIDE5MDAiIGludG8gdGhlIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKCkgZnVuY3Rpb24sCi1idXQgdGhpcyBpcyBub3QgdW5kZXIgb3VyIGNvbnRyb2wuICBUaGUgbGlicG5nIGRvY3VtZW50YXRpb24gaGFzIGFsd2F5cwotc3RhdGVkIHRoYXQgaXQgd29ya3Mgd2l0aCA0LWRpZ2l0IHllYXJzLCBhbmQgdGhlIEFQSXMgaGF2ZSBiZWVuCi1kb2N1bWVudGVkIGFzIHN1Y2guCi0KLVRoZSB0SU1FIGNodW5rIGl0c2VsZiBpcyBhbHNvIFkySyBjb21wbGlhbnQuICBJdCB1c2VzIGEgMi1ieXRlIHVuc2lnbmVkCi1pbnRlZ2VyIHRvIGhvbGQgdGhlIHllYXIsIGFuZCBjYW4gaG9sZCB5ZWFycyBhcyBsYXJnZSBhcyA2NTUzNS4KLQotemxpYiwgdXBvbiB3aGljaCBsaWJwbmcgZGVwZW5kcywgaXMgYWxzbyBZMksgY29tcGxpYW50LiAgSXQgY29udGFpbnMKLW5vIGRhdGUtcmVsYXRlZCBjb2RlLgotCi0KLSAgIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICAgbGlicG5nIG1haW50YWluZXIKLSAgIFBORyBEZXZlbG9wbWVudCBHcm91cApkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9saWJwbmctY29uZmlnLmluIGIvc3JjL2xpYnBuZy9saWJwbmctY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOTg3Y2VmLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvbGlicG5nLWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgbGlicG5nLWNvbmZpZwotIyBwcm92aWRlcyBjb25maWd1cmF0aW9uIGluZm8gZm9yIGxpYnBuZy4KLQotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQsIDIwMDYsIDIwMDcgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0KLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIE1vZGVsZWQgYWZ0ZXIgbGlieG1sLWNvbmZpZy4KLQotdmVyc2lvbj0iQFBOR0xJQl9WRVJTSU9OQCIKLXByZWZpeD0iQHByZWZpeEAiCi1leGVjX3ByZWZpeD0iQGV4ZWNfcHJlZml4QCIKLWxpYmRpcj0iQGxpYmRpckAiCi1pbmNsdWRlZGlyPSJAaW5jbHVkZWRpckAvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQCIKLWxpYnM9Ii1scG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQCIKLWFsbF9saWJzPSItbHBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAgQExJQlNAIgotSV9vcHRzPSItSSR7aW5jbHVkZWRpcn0iCi1MX29wdHM9Ii1MJHtsaWJkaXJ9IgotUl9vcHRzPSIiCi1jcHBmbGFncz0iIgotY2NvcHRzPSIiCi1sZG9wdHM9IiIKLQotdXNhZ2UoKQotewotICAgIGNhdCA8PEVPRgotVXNhZ2U6ICQwIFtPUFRJT05dIC4uLgotCi1Lbm93biB2YWx1ZXMgZm9yIE9QVElPTiBhcmU6Ci0KLSAgLS1wcmVmaXggICAgICAgIHByaW50IGxpYnBuZyBwcmVmaXgKLSAgLS1saWJkaXIgICAgICAgIHByaW50IHBhdGggdG8gZGlyZWN0b3J5IGNvbnRhaW5pbmcgbGlicmFyeQotICAtLWxpYnMgICAgICAgICAgcHJpbnQgbGlicmFyeSBsaW5raW5nIGluZm9ybWF0aW9uCi0gIC0tY2NvcHRzICAgICAgICBwcmludCBjb21waWxlciBvcHRpb25zCi0gIC0tY3BwZmxhZ3MgICAgICBwcmludCBwcmUtcHJvY2Vzc29yIGZsYWdzCi0gIC0tY2ZsYWdzICAgICAgICBwcmludCBwcmVwcm9jZXNzb3IgZmxhZ3MsIElfb3B0cywgYW5kIGNvbXBpbGVyIG9wdGlvbnMKLSAgLS1JX29wdHMgICAgICAgIHByaW50ICItSSIgaW5jbHVkZSBvcHRpb25zCi0gIC0tTF9vcHRzICAgICAgICBwcmludCBsaW5rZXIgIi1MIiBmbGFncyBmb3IgZHluYW1pYyBsaW5raW5nCi0gIC0tUl9vcHRzICAgICAgICBwcmludCBkeW5hbWljIGxpbmtlciAiLVIiIG9yICItcnBhdGgiIGZsYWdzCi0gIC0tbGRvcHRzICAgICAgICBwcmludCBsaW5rZXIgb3B0aW9ucwotICAtLWxkZmxhZ3MgICAgICAgcHJpbnQgbGlua2VyIGZsYWdzIChsZG9wdHMsIExfb3B0cywgUl9vcHRzLCBhbmQgbGlicykKLSAgLS1zdGF0aWMgICAgICAgIHJldmlzZSBzdWJzZXF1ZW50IG91dHB1dHMgZm9yIHN0YXRpYyBsaW5raW5nCi0gIC0taGVscCAgICAgICAgICBwcmludCB0aGlzIGhlbHAgYW5kIGV4aXQKLSAgLS12ZXJzaW9uICAgICAgIHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24KLUVPRgotCi0gICAgZXhpdCAkMQotfQotCi1pZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCi0gICAgdXNhZ2UgMQotZmkKLQotd2hpbGUgdGVzdCAkIyAtZ3QgMDsgZG8KLSAgICBjYXNlICIkMSIgaW4KLQotICAgIC0tcHJlZml4KQotICAgICAgICBlY2hvICR7cHJlZml4fQotICAgICAgICA7OwotCi0gICAgLS12ZXJzaW9uKQotICAgICAgICBlY2hvICR7dmVyc2lvbn0KLSAgICAgICAgZXhpdCAwCi0gICAgICAgIDs7Ci0KLSAgICAtLWhlbHApCi0gICAgICAgIHVzYWdlIDAKLSAgICAgICAgOzsKLQotICAgIC0tY2NvcHRzKQotICAgICAgICBlY2hvICR7Y2NvcHRzfQotICAgICAgICA7OwotCi0gICAgLS1jcHBmbGFncykKLSAgICAgICAgZWNobyAke2NwcGZsYWdzfQotICAgICAgICA7OwotCi0gICAgLS1jZmxhZ3MpCi0gICAgICAgIGVjaG8gJHtJX29wdHN9ICR7Y3BwZmxhZ3N9ICR7Y2NvcHRzfQotICAgICAgICA7OwotCi0gICAgLS1saWJkaXIpCi0gICAgICAgIGVjaG8gJHtsaWJkaXJ9Ci0gICAgICAgIDs7Ci0KLSAgICAtLWxpYnMpCi0gICAgICAgIGVjaG8gJHtsaWJzfQotICAgICAgICA7OwotCi0gICAgLS1JX29wdHMpCi0gICAgICAgIGVjaG8gJHtJX29wdHN9Ci0gICAgICAgIDs7Ci0KLSAgICAtLUxfb3B0cykKLSAgICAgICAgZWNobyAke0xfb3B0c30KLSAgICAgICAgOzsKLQotICAgIC0tUl9vcHRzKQotICAgICAgICBlY2hvICR7Ul9vcHRzfQotICAgICAgICA7OwotCi0gICAgLS1sZG9wdHMpCi0gICAgCWVjaG8gJHtsZG9wdHN9Ci0JOzsKLQotICAgIC0tbGRmbGFncykKLSAgICAgICAgZWNobyAke2xkb3B0c30gJHtMX29wdHN9ICR7Ul9vcHRzfSAke2xpYnN9Ci0gICAgICAgIDs7Ci0KLSAgICAtLXN0YXRpYykKLSAgICAgICAgUl9vcHRzPSIiCi0JbGlicz0ke2FsbF9saWJzfQotICAgICAgICA7OwotCi0gICAgKikKLSAgICAgICAgdXNhZ2UKLSAgICAgICAgZXhpdCAxCi0gICAgICAgIDs7Ci0gICAgZXNhYwotICAgIHNoaWZ0Ci1kb25lCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9saWJwbmcuMyBiL3NyYy9saWJwbmcvbGlicG5nLjMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OTlhZGMuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9saWJwbmcuMworKysgL2Rldi9udWxsCkBAIC0xLDQ2MDUgKzAsMCBAQAotLlRIIExJQlBORyAzICJKdWx5IDEwLCAyMDEyIgotLlNIIE5BTUUKLWxpYnBuZyBcLSBQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIFJlZmVyZW5jZSBMaWJyYXJ5IDEuNC4xMgotLlNIIFNZTk9QU0lTCi1cZklcZkIKLQotXGZCI2luY2x1ZGUgPHBuZy5oPlxmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlciBcZkkodm9pZFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19iZW5pZ25fZXJyb3JzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfY2hhcnAgXGZJZXJyb3JcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfYnVpbGRfZ3JheXNjYWxlX3BhbGV0dGUgKGludCBcZlBcZkliaXRfZGVwdGhcZlBcZkIsIHBuZ19jb2xvcnAgXGZJcGFsZXR0ZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdm9pZHAgcG5nX2NhbGxvYyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2FsbG9jX3NpemVfdCBcZklzaXplXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2NodW5rX2Jlbmlnbl9lcnJvciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2NoYXJwIFxmSWVycm9yXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2NodW5rX2Vycm9yIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfY2hhcnAgXGZJZXJyb3JcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfY2h1bmtfd2FybmluZyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2NoYXJwIFxmSW1lc3NhZ2VcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSAocG5nX3RpbWVwIFxmUFxmSXB0aW1lXGZQXGZCLCBzdHJ1Y3QgdG0gRkFSICogXGZJdHRpbWVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfY29udmVydF9mcm9tX3RpbWVfdCAocG5nX3RpbWVwIFxmUFxmSXB0aW1lXGZQXGZCLCB0aW1lX3QgXGZJdHRpbWVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2NoYXJwIHBuZ19jb252ZXJ0X3RvX3JmYzExMjMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ190aW1lcCBcZklwdGltZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfaW5mb3AgcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfc3RydWN0cCBwbmdfY3JlYXRlX3JlYWRfc3RydWN0IChwbmdfY29uc3RfY2hhcnAgXGZQXGZJdXNlcl9wbmdfdmVyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJZXJyb3JfcHRyXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmUFxmSWVycm9yX2ZuXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmSXdhcm5fZm5cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3N0cnVjdHAgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yIChwbmdfY29uc3RfY2hhcnAgXGZQXGZJdXNlcl9wbmdfdmVyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJZXJyb3JfcHRyXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmUFxmSWVycm9yX2ZuXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmUFxmSXdhcm5fZm5cZlBcZkIsIHBuZ192b2lkcCBcZlBcZkltZW1fcHRyXGZQXGZCLCBwbmdfbWFsbG9jX3B0ciBcZlBcZkltYWxsb2NfZm5cZlBcZkIsIHBuZ19mcmVlX3B0ciBcZklmcmVlX2ZuXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ19zdHJ1Y3RwIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0IChwbmdfY29uc3RfY2hhcnAgXGZQXGZJdXNlcl9wbmdfdmVyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJZXJyb3JfcHRyXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmUFxmSWVycm9yX2ZuXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmSXdhcm5fZm5cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3N0cnVjdHAgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMiAocG5nX2NvbnN0X2NoYXJwIFxmUFxmSXVzZXJfcG5nX3ZlclxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSWVycm9yX3B0clxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZlBcZkllcnJvcl9mblxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZlBcZkl3YXJuX2ZuXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJbWVtX3B0clxmUFxmQiwgcG5nX21hbGxvY19wdHIgXGZQXGZJbWFsbG9jX2ZuXGZQXGZCLCBwbmdfZnJlZV9wdHIgXGZJZnJlZV9mblxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kYXRhX2ZyZWVyIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCBcZlBcZklmcmVlclxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbWFzaylcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZGVzdHJveV9pbmZvX3N0cnVjdCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wcCBcZklpbmZvX3B0cl9wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCAocG5nX3N0cnVjdHBwIFxmUFxmSXBuZ19wdHJfcHRyXGZQXGZCLCBwbmdfaW5mb3BwIFxmUFxmSWluZm9fcHRyX3B0clxmUFxmQiwgcG5nX2luZm9wcCBcZkllbmRfaW5mb19wdHJfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0IChwbmdfc3RydWN0cHAgXGZQXGZJcG5nX3B0cl9wdHJcZlBcZkIsIHBuZ19pbmZvcHAgXGZJaW5mb19wdHJfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2VyciAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19lcnJvciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2NoYXJwIFxmSWVycm9yXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2ZyZWUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZklwdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZnJlZV9jaHVua19saXN0IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2ZyZWVfZGVmYXVsdCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3ZvaWRwIFxmSXB0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19mcmVlX2RhdGEgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50IFxmSW51bVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfYnl0ZSBwbmdfZ2V0X2JpdF9kZXB0aCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfYktHRCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfY29sb3JfMTZwIFxmSSpiYWNrZ3JvdW5kXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ19ieXRlIHBuZ19nZXRfY2hhbm5lbHMgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X2NIUk0gKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgZG91YmxlIFxmUFxmSSp3aGl0ZV94XGZQXGZCLCBkb3VibGUgXGZQXGZJKndoaXRlX3lcZlBcZkIsIGRvdWJsZSBcZlBcZkkqcmVkX3hcZlBcZkIsIGRvdWJsZSBcZlBcZkkqcmVkX3lcZlBcZkIsIGRvdWJsZSBcZlBcZkkqZ3JlZW5feFxmUFxmQiwgZG91YmxlIFxmUFxmSSpncmVlbl95XGZQXGZCLCBkb3VibGUgXGZQXGZJKmJsdWVfeFxmUFxmQiwgZG91YmxlIFxmSSpibHVlX3lcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9jSFJNX2ZpeGVkIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSp3aGl0ZV94XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqd2hpdGVfeVxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKnJlZF94XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqcmVkX3lcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSpncmVlbl94XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqZ3JlZW5feVxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKmJsdWVfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJKmJsdWVfeVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X2NodW5rX2NhY2hlX21heCAocG5nX2NvbnN0X3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCcG5nX2FsbG9jX3NpemVfdCBwbmdfZ2V0X2NodW5rX21hbGxvY19tYXggKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2J5dGUgcG5nX2dldF9jb2xvcl90eXBlIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSAocG5nX2NvbnN0X3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfYnl0ZSBwbmdfZ2V0X2NvbXByZXNzaW9uX3R5cGUgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfYnl0ZSBwbmdfZ2V0X2NvcHlyaWdodCAocG5nX2NvbnN0X3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdm9pZHAgcG5nX2dldF9lcnJvcl9wdHIgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2J5dGUgcG5nX2dldF9maWx0ZXJfdHlwZSAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfZ0FNQSAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBkb3VibGUgXGZJKmZpbGVfZ2FtbWFcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9nQU1BX2ZpeGVkIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSSppbnRfZmlsZV9nYW1tYVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfYnl0ZSBwbmdfZ2V0X2hlYWRlcl92ZXIgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2J5dGUgcG5nX2dldF9oZWFkZXJfdmVyc2lvbiAocG5nX2NvbnN0X3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X2hJU1QgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMTZwIFxmSSpoaXN0XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfaUNDUCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfY2hhcnBwIFxmUFxmSW5hbWVcZlBcZkIsIGludCBcZlBcZkkqY29tcHJlc3Npb25fdHlwZVxmUFxmQiwgcG5nX2J5dGVwcCBcZlBcZklwcm9maWxlXGZQXGZCLCBwbmdfdWludF8zMiBcZkkqcHJvZmxlblxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X0lIRFIgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKndpZHRoXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqaGVpZ2h0XGZQXGZCLCBpbnQgXGZQXGZJKmJpdF9kZXB0aFxmUFxmQiwgaW50IFxmUFxmSSpjb2xvcl90eXBlXGZQXGZCLCBpbnQgXGZQXGZJKmludGVybGFjZV90eXBlXGZQXGZCLCBpbnQgXGZQXGZJKmNvbXByZXNzaW9uX3R5cGVcZlBcZkIsIGludCBcZkkqZmlsdGVyX3R5cGVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9pbWFnZV9oZWlnaHQgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X2ltYWdlX3dpZHRoIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2ludF8zMiBwbmdfZ2V0X2ludF8zMiAocG5nX2J5dGVwIFxmSWJ1ZlxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfYnl0ZSBwbmdfZ2V0X2ludGVybGFjZV90eXBlIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2NvbnN0X2J5dGVwIHBuZ19nZXRfaW9fY2h1bmtfbmFtZSAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdm9pZHAgcG5nX2dldF9pb19wdHIgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9pb19zdGF0ZSAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfYnl0ZSBwbmdfZ2V0X2xpYnBuZ192ZXIgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3ZvaWRwIHBuZ19nZXRfbWVtX3B0ciAocG5nX2NvbnN0X3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X29GRnMgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKm9mZnNldF94XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqb2Zmc2V0X3lcZlBcZkIsIGludCBcZkkqdW5pdF90eXBlXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfcENBTCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJKnB1cnBvc2VcZlBcZkIsIHBuZ19pbnRfMzIgXGZQXGZJKlgwXGZQXGZCLCBwbmdfaW50XzMyIFxmUFxmSSpYMVxmUFxmQiwgaW50IFxmUFxmSSp0eXBlXGZQXGZCLCBpbnQgXGZQXGZJKm5wYXJhbXNcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkkqdW5pdHNcZlBcZkIsIHBuZ19jaGFycHAgXGZJKnBhcmFtc1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3BIWXMgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKnJlc194XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqcmVzX3lcZlBcZkIsIGludCBcZkkqdW5pdF90eXBlXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQmZsb2F0IHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9wSFlzX2RwaSAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqcmVzX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSpyZXNfeVxmUFxmQiwgaW50IFxmSSp1bml0X3R5cGVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2ZpeGVkX3BvaW50IHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvX2ZpeGVkIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9waXhlbHNfcGVyX2luY2ggKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3BpeGVsc19wZXJfbWV0ZXIgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdm9pZHAgcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9QTFRFIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jb2xvcnAgXGZQXGZJKnBhbGV0dGVcZlBcZkIsIGludCBcZkkqbnVtX3BhbGV0dGVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2J5dGUgcG5nX2dldF9yZ2JfdG9fZ3JheV9zdGF0dXMgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHIpCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfcm93Ynl0ZXMgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfYnl0ZXBwIHBuZ19nZXRfcm93cyAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfc0JJVCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfY29sb3JfOHAgXGZJKnNpZ19iaXRcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZ2V0X3NDQUwgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50KiBcZlBcZkl1bml0XGZQXGZCLCBkb3VibGUqIFxmUFxmSXdpZHRoXGZQXGZCLCBkb3VibGUqIFxmSWhlaWdodFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19nZXRfc0NBTF9maXhlZCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQqIFxmUFxmSXVuaXRcZlBcZkIsIHBuZ19maXhlZF9wb2ludHAgXGZQXGZJd2lkdGhcZlBcZkIsIHBuZ19maXhlZF9wb2ludHAgXGZJaGVpZ2h0XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2dldF9zQ0FMX3MgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50KiBcZlBcZkl1bml0XGZQXGZCLCBwbmdfY2hhcnBwIFxmUFxmSXdpZHRoXGZQXGZCLCBwbmdfY2hhcnBwIFxmSWhlaWdodFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfYnl0ZXAgcG5nX2dldF9zaWduYXR1cmUgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3NQTFQgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3NwYWxldHRlX3AgXGZJKnNwbHRfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfc1JHQiAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZJKmludGVudFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3RleHQgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3RleHRwIFxmUFxmSSp0ZXh0X3B0clxmUFxmQiwgaW50IFxmSSpudW1fdGV4dFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3RJTUUgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3RpbWVwIFxmSSptb2RfdGltZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3RSTlMgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSSp0cmFuc19hbHBoYVxmUFxmQiwgaW50IFxmUFxmSSpudW1fdHJhbnNcZlBcZkIsIHBuZ19jb2xvcl8xNnAgXGZJKnRyYW5zX2NvbG9yXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQi8qIFRoaXMgZnVuY3Rpb24gaXMgcmVhbGx5IGFuIGlubGluZSBtYWNyby4gXGZJKi8KLQotXGZCcG5nX3VpbnRfMTYgcG5nX2dldF91aW50XzE2IChwbmdfYnl0ZXAgXGZJYnVmXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfdWludF8zMSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmSWJ1ZlxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkIvKiBUaGlzIGZ1bmN0aW9uIGlzIHJlYWxseSBhbiBpbmxpbmUgbWFjcm8uIFxmSSovCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfdWludF8zMiAocG5nX2J5dGVwIFxmSWJ1ZlxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3Vua25vd25fY2h1bmtzIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191bmtub3duX2NodW5rcHAgXGZJdW5rbm93bnNcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3ZvaWRwIHBuZ19nZXRfdXNlcl9jaHVua19wdHIgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF91c2VyX2hlaWdodF9tYXggKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3ZvaWRwIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyIChwbmdfY29uc3Rfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfdXNlcl93aWR0aF9tYXggKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF92YWxpZCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklmbGFnXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQmZsb2F0IHBuZ19nZXRfeF9vZmZzZXRfaW5jaGVzIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2ZpeGVkX3BvaW50IHBuZ19nZXRfeF9vZmZzZXRfaW5jaGVzX2ZpeGVkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2ludF8zMiBwbmdfZ2V0X3hfb2Zmc2V0X21pY3JvbnMgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfaW50XzMyIHBuZ19nZXRfeF9vZmZzZXRfcGl4ZWxzIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF94X3BpeGVsc19wZXJfaW5jaCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfeF9waXhlbHNfcGVyX21ldGVyIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCZmxvYXQgcG5nX2dldF95X29mZnNldF9pbmNoZXMgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfZml4ZWRfcG9pbnQgcG5nX2dldF95X29mZnNldF9pbmNoZXNfZml4ZWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfaW50XzMyIHBuZ19nZXRfeV9vZmZzZXRfbWljcm9ucyAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ19pbnRfMzIgcG5nX2dldF95X29mZnNldF9waXhlbHMgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9pbmNoIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJpbnQgcG5nX2hhbmRsZV9hc191bmtub3duIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZJY2h1bmtfbmFtZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19pbmZvX2luaXRfMyAocG5nX2luZm9wcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3NpemVfdCBcZklwbmdfaW5mb19zdHJ1Y3Rfc2l6ZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19pbml0X2lvIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBGSUxFIFxmSSpmcFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdm9pZHAgcG5nX21hbGxvYyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2FsbG9jX3NpemVfdCBcZklzaXplXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ192b2lkcCBwbmdfbWFsbG9jX2RlZmF1bHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19hbGxvY19zaXplX3QgXGZJc2l6ZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdm9pZHAgcG5nX21hbGxvY193YXJuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYWxsb2Nfc2l6ZV90IFxmSXNpemVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSW1uZ19mZWF0dXJlc19wZXJtaXR0ZWRcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcHJvY2Vzc19kYXRhIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklidWZmZXJcZlBcZkIsIHBuZ19zaXplX3QgXGZJYnVmZmVyX3NpemVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklvbGRfcm93XGZQXGZCLCBwbmdfYnl0ZXAgXGZJbmV3X3Jvd1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19yZWFkX2VuZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3JlYWRfaW1hZ2UgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcHAgXGZJaW1hZ2VcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcmVhZF9pbmZvIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcmVhZF9wbmcgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50IFxmUFxmSXRyYW5zZm9ybXNcZlBcZkIsIHBuZ192b2lkcCBcZklwYXJhbXNcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcmVhZF9yb3cgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIHBuZ19ieXRlcCBcZklkaXNwbGF5X3Jvd1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19yZWFkX3Jvd3MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcHAgXGZQXGZJcm93XGZQXGZCLCBwbmdfYnl0ZXBwIFxmUFxmSWRpc3BsYXlfcm93XGZQXGZCLCBwbmdfdWludF8zMiBcZkludW1fcm93c1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCaW50IHBuZ19yZXNldF96c3RyZWFtIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NhdmVfaW50XzMyIChwbmdfYnl0ZXAgXGZQXGZJYnVmXGZQXGZCLCBwbmdfaW50XzMyIFxmSWlcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2F2ZV91aW50XzE2IChwbmdfYnl0ZXAgXGZQXGZJYnVmXGZQXGZCLCB1bnNpZ25lZCBpbnQgXGZJaVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zYXZlX3VpbnRfMzIgKHBuZ19ieXRlcCBcZlBcZklidWZcZlBcZkIsIHBuZ191aW50XzMyIFxmSWlcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2FkZF9hbHBoYSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJZmlsbGVyXGZQXGZCLCBpbnQgXGZJZmxhZ3NcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2JhY2tncm91bmQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb2xvcl8xNnAgXGZQXGZJYmFja2dyb3VuZF9jb2xvclxmUFxmQiwgaW50IFxmUFxmSWJhY2tncm91bmRfZ2FtbWFfY29kZVxmUFxmQiwgaW50IFxmUFxmSW5lZWRfZXhwYW5kXGZQXGZCLCBkb3VibGUgXGZJYmFja2dyb3VuZF9nYW1tYVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfYmFja2dyb3VuZF9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbG9yXzE2cCBcZlBcZkliYWNrZ3JvdW5kX2NvbG9yXGZQXGZCLCBpbnQgXGZQXGZJYmFja2dyb3VuZF9nYW1tYV9jb2RlXGZQXGZCLCBpbnQgXGZQXGZJbmVlZF9leHBhbmRcZlBcZkIsIHBuZ191aW50XzMyIFxmSWJhY2tncm91bmRfZ2FtbWFcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZklhbGxvd2VkXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9iZ3IgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2JLR0QgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NvbG9yXzE2cCBcZkliYWNrZ3JvdW5kXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9jSFJNIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGRvdWJsZSBcZlBcZkl3aGl0ZV94XGZQXGZCLCBkb3VibGUgXGZQXGZJd2hpdGVfeVxmUFxmQiwgZG91YmxlIFxmUFxmSXJlZF94XGZQXGZCLCBkb3VibGUgXGZQXGZJcmVkX3lcZlBcZkIsIGRvdWJsZSBcZlBcZklncmVlbl94XGZQXGZCLCBkb3VibGUgXGZQXGZJZ3JlZW5feVxmUFxmQiwgZG91YmxlIFxmUFxmSWJsdWVfeFxmUFxmQiwgZG91YmxlIFxmSWJsdWVfeVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfY0hSTV9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkl3aGl0ZV94XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkl3aGl0ZV95XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklyZWRfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJcmVkX3lcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSWdyZWVuX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSWdyZWVuX3lcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSWJsdWVfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJYmx1ZV95XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9jaHVua19jYWNoZV9tYXggKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSXVzZXJfY2h1bmtfY2FjaGVfbWF4XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9jb21wcmVzc2lvbl9sZXZlbCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSWxldmVsXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZkltZW1fbGV2ZWxcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2NvbXByZXNzaW9uX21ldGhvZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSW1ldGhvZFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfY29tcHJlc3Npb25fc3RyYXRlZ3kgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZklzdHJhdGVneVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZkl3aW5kb3dfYml0c1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfY3JjX2FjdGlvbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmUFxmSWNyaXRfYWN0aW9uXGZQXGZCLCBpbnQgXGZJYW5jaWxfYWN0aW9uXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9lcnJvcl9mbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSWVycm9yX3B0clxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZlBcZkllcnJvcl9mblxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZkl3YXJuaW5nX2ZuXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9leHBhbmQgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzggKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2ZpbGxlciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJZmlsbGVyXGZQXGZCLCBpbnQgXGZJZmxhZ3NcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2ZpbHRlciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmUFxmSW1ldGhvZFxmUFxmQiwgaW50IFxmSWZpbHRlcnNcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZQXGZJaGV1cmlzdGljX21ldGhvZFxmUFxmQiwgaW50IFxmUFxmSW51bV93ZWlnaHRzXGZQXGZCLCBwbmdfZG91YmxlcCBcZlBcZklmaWx0ZXJfd2VpZ2h0c1xmUFxmQiwgcG5nX2RvdWJsZXAgXGZJZmlsdGVyX2Nvc3RzXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9maWx0ZXJfaGV1cmlzdGljc19maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmUFxmSWhldXJpc3RpY19tZXRob2RcZlBcZkIsIGludCBcZlBcZkludW1fd2VpZ2h0c1xmUFxmQiwgcG5nX2ZpeGVkX3BvaW50X3AgXGZQXGZJZmlsdGVyX3dlaWdodHNcZlBcZkIsIHBuZ19maXhlZF9wb2ludF9wIFxmSWZpbHRlcl9jb3N0c1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfZmx1c2ggKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZklucm93c1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfZ2FtbWEgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGRvdWJsZSBcZlBcZklzY3JlZW5fZ2FtbWFcZlBcZkIsIGRvdWJsZSBcZklkZWZhdWx0X2ZpbGVfZ2FtbWFcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2dhbW1hX2ZpeGVkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklzY3JlZW5fZ2FtbWFcZlBcZkIsIHBuZ191aW50XzMyIFxmSWRlZmF1bHRfZmlsZV9nYW1tYVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfZ0FNQSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBkb3VibGUgXGZJZmlsZV9nYW1tYVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfZ0FNQV9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklmaWxlX2dhbW1hXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9ncmF5XzFfMl80X3RvXzggKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2dyYXlfdG9fcmdiIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9oSVNUIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzE2cCBcZkloaXN0XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9pQ0NQIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jb25zdF9jaGFycCBcZlBcZkluYW1lXGZQXGZCLCBpbnQgXGZQXGZJY29tcHJlc3Npb25fdHlwZVxmUFxmQiwgcG5nX2NvbnN0X2J5dGVwIFxmUFxmSXByb2ZpbGVcZlBcZkIsIHBuZ191aW50XzMyIFxmSXByb2ZsZW5cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCaW50IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9pbnZhbGlkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCBcZkltYXNrXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9pbnZlcnRfYWxwaGEgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2ludmVydF9tb25vIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9JSERSIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXdpZHRoXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkloZWlnaHRcZlBcZkIsIGludCBcZlBcZkliaXRfZGVwdGhcZlBcZkIsIGludCBcZlBcZkljb2xvcl90eXBlXGZQXGZCLCBpbnQgXGZQXGZJaW50ZXJsYWNlX3R5cGVcZlBcZkIsIGludCBcZlBcZkljb21wcmVzc2lvbl90eXBlXGZQXGZCLCBpbnQgXGZJZmlsdGVyX3R5cGVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZlBcZklrZWVwXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJY2h1bmtfbGlzdFxmUFxmQiwgaW50IFxmSW51bV9jaHVua3NcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCam1wX2J1ZiogcG5nX3NldF9sb25nam1wX2ZuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfbG9uZ2ptcF9wdHIgXGZQXGZJbG9uZ2ptcF9mblxmUFxmQiwgc2l6ZV90IFxmSWptcF9idWZfc2l6ZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfY2h1bmtfbWFsbG9jX21heCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2FsbG9jX3NpemVfdCBcZkl1c2VyX2NodW5rX2NhY2hlX21heFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSXNpemVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X21lbV9mbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSW1lbV9wdHJcZlBcZkIsIHBuZ19tYWxsb2NfcHRyIFxmUFxmSW1hbGxvY19mblxmUFxmQiwgcG5nX2ZyZWVfcHRyIFxmSWZyZWVfZm5cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X29GRnMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJb2Zmc2V0X3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSW9mZnNldF95XGZQXGZCLCBpbnQgXGZJdW5pdF90eXBlXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9wYWNraW5nIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9wYWNrc3dhcCAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3BDQUwgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSXB1cnBvc2VcZlBcZkIsIHBuZ19pbnRfMzIgXGZQXGZJWDBcZlBcZkIsIHBuZ19pbnRfMzIgXGZQXGZJWDFcZlBcZkIsIGludCBcZlBcZkl0eXBlXGZQXGZCLCBpbnQgXGZQXGZJbnBhcmFtc1xmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSXVuaXRzXGZQXGZCLCBwbmdfY2hhcnBwIFxmSXBhcmFtc1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfcEhZcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklyZXNfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJcmVzX3lcZlBcZkIsIGludCBcZkl1bml0X3R5cGVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZlBcZklwcm9ncmVzc2l2ZV9wdHJcZlBcZkIsIHBuZ19wcm9ncmVzc2l2ZV9pbmZvX3B0ciBcZlBcZklpbmZvX2ZuXGZQXGZCLCBwbmdfcHJvZ3Jlc3NpdmVfcm93X3B0ciBcZlBcZklyb3dfZm5cZlBcZkIsIHBuZ19wcm9ncmVzc2l2ZV9lbmRfcHRyIFxmSWVuZF9mblxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfUExURSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfY29sb3JwIFxmUFxmSXBhbGV0dGVcZlBcZkIsIGludCBcZkludW1fcGFsZXR0ZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfcXVhbnRpemUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb2xvcnAgXGZQXGZJcGFsZXR0ZVxmUFxmQiwgaW50IFxmUFxmSW51bV9wYWxldHRlXGZQXGZCLCBpbnQgXGZQXGZJbWF4aW11bV9jb2xvcnNcZlBcZkIsIHBuZ191aW50XzE2cCBcZlBcZkloaXN0b2dyYW1cZlBcZkIsIGludCBcZklmdWxsX3F1YW50aXplXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9yZWFkX2ZuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJaW9fcHRyXGZQXGZCLCBwbmdfcndfcHRyIFxmSXJlYWRfZGF0YV9mblxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfcmVhZF9zdGF0dXNfZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19yZWFkX3N0YXR1c19wdHIgXGZJcmVhZF9yb3dfZm5cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSXVzZXJfY2h1bmtfcHRyXGZQXGZCLCBwbmdfdXNlcl9jaHVua19wdHIgXGZJcmVhZF91c2VyX2NodW5rX2ZuXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdXNlcl90cmFuc2Zvcm1fcHRyIFxmSXJlYWRfdXNlcl90cmFuc2Zvcm1fZm5cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3JnYl90b19ncmF5IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZQXGZJZXJyb3JfYWN0aW9uXGZQXGZCLCBkb3VibGUgXGZQXGZJcmVkXGZQXGZCLCBkb3VibGUgXGZJZ3JlZW5cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgZXJyb3JfYWN0aW9uIHBuZ191aW50XzMyIFxmUFxmSXJlZFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJZ3JlZW5cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3Jvd3MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2J5dGVwcCBcZklyb3dfcG9pbnRlcnNcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3NCSVQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NvbG9yXzhwIFxmSXNpZ19iaXRcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3NDQUwgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50IFxmUFxmSXVuaXRcZlBcZkIsIGRvdWJsZSBcZlBcZkl3aWR0aFxmUFxmQiwgZG91YmxlIFxmSWhlaWdodFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfc0NBTF9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZQXGZJdW5pdFxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmUFxmSXdpZHRoXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZJaGVpZ2h0XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9zQ0FMX3MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50IFxmUFxmSXVuaXRcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkl3aWR0aFxmUFxmQiwgcG5nX2NoYXJwIFxmSWhlaWdodFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfc2hpZnQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb2xvcl84cCBcZkl0cnVlX2JpdHNcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3NpZ19ieXRlcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSW51bV9ieXRlc1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfc1BMVCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfc3BhbGV0dGVfcCBcZlBcZklzcGx0X3B0clxmUFxmQiwgaW50IFxmSW51bV9zcGFsZXR0ZXNcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3NSR0IgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50IFxmSWludGVudFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfc1JHQl9nQU1BX2FuZF9jSFJNIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCBcZklpbnRlbnRcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3N0cmlwXzE2IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9zdHJpcF9hbHBoYSAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfc3RyaXBfZXJyb3JfbnVtYmVycyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJc3RyaXBfbW9kZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfc3dhcCAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfc3dhcF9hbHBoYSAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfdGV4dCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdGV4dHAgXGZQXGZJdGV4dF9wdHJcZlBcZkIsIGludCBcZkludW1fdGV4dFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfdElNRSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdGltZXAgXGZJbW9kX3RpbWVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3RSTlMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXRyYW5zX2FscGhhXGZQXGZCLCBpbnQgXGZQXGZJbnVtX3RyYW5zXGZQXGZCLCBwbmdfY29sb3JfMTZwIFxmSXRyYW5zX2NvbG9yXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF90Uk5TX3RvX2FscGhhIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19zZXRfdW5rbm93bl9jaHVua3MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3Vua25vd25fY2h1bmtwIFxmUFxmSXVua25vd25zXGZQXGZCLCBpbnQgXGZQXGZJbnVtXGZQXGZCLCBpbnQgXGZJbG9jYXRpb25cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50IFxmUFxmSWNodW5rXGZQXGZCLCBpbnQgXGZJbG9jYXRpb25cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3VzZXJfbGltaXRzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkl1c2VyX3dpZHRoX21heFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJdXNlcl9oZWlnaHRfbWF4XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF91c2VyX3RyYW5zZm9ybV9pbmZvIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJdXNlcl90cmFuc2Zvcm1fcHRyXGZQXGZCLCBpbnQgXGZQXGZJdXNlcl90cmFuc2Zvcm1fZGVwdGhcZlBcZkIsIGludCBcZkl1c2VyX3RyYW5zZm9ybV9jaGFubmVsc1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfd3JpdGVfZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZlBcZklpb19wdHJcZlBcZkIsIHBuZ19yd19wdHIgXGZQXGZJd3JpdGVfZGF0YV9mblxmUFxmQiwgcG5nX2ZsdXNoX3B0ciBcZklvdXRwdXRfZmx1c2hfZm5cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3dyaXRlX3N0YXR1c19mbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3dyaXRlX3N0YXR1c19wdHIgXGZJd3JpdGVfcm93X2ZuXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF93cml0ZV91c2VyX3RyYW5zZm9ybV9mbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VzZXJfdHJhbnNmb3JtX3B0ciBcZkl3cml0ZV91c2VyX3RyYW5zZm9ybV9mblxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJpbnQgcG5nX3NpZ19jbXAgKHBuZ19ieXRlcCBcZlBcZklzaWdcZlBcZkIsIHBuZ19zaXplX3QgXGZQXGZJc3RhcnRcZlBcZkIsIHBuZ19zaXplX3QgXGZJbnVtX3RvX2NoZWNrXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3N0YXJ0X3JlYWRfaW1hZ2UgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd2FybmluZyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2NoYXJwIFxmSW1lc3NhZ2VcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfY2h1bmsgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZkljaHVua19uYW1lXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJZGF0YVxmUFxmQiwgcG5nX3NpemVfdCBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfY2h1bmtfZGF0YSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWRhdGFcZlBcZkIsIHBuZ19zaXplX3QgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX2NodW5rX2VuZCAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9jaHVua19zdGFydCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWNodW5rX25hbWVcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9lbmQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9mbHVzaCAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9pbWFnZSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwcCBcZklpbWFnZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9pbmZvIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX3BuZyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZQXGZJdHJhbnNmb3Jtc1xmUFxmQiwgcG5nX3ZvaWRwIFxmSXBhcmFtc1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9yb3cgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZklyb3dcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfcm93cyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwcCBcZlBcZklyb3dcZlBcZkIsIHBuZ191aW50XzMyIFxmSW51bV9yb3dzXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX3NpZyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkcGYgcG5nX3phbGxvYyAodm9pZHBmIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHVJbnQgXGZQXGZJaXRlbXNcZlBcZkIsIHVJbnQgXGZJc2l6ZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ196ZnJlZSAodm9pZHBmIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHZvaWRwZiBcZklwdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotLlNIIERFU0NSSVBUSU9OCi1UaGUKLS5JIGxpYnBuZwotbGlicmFyeSBzdXBwb3J0cyBlbmNvZGluZywgZGVjb2RpbmcsIGFuZCB2YXJpb3VzIG1hbmlwdWxhdGlvbnMgb2YKLXRoZSBQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIGZvcm1hdCBpbWFnZSBmaWxlcy4gIEl0IHVzZXMgdGhlCi0uSVIgemxpYigzKQotY29tcHJlc3Npb24gbGlicmFyeS4KLUZvbGxvd2luZyBpcyBhIGNvcHkgb2YgdGhlIGxpYnBuZy1tYW51YWwudHh0IGZpbGUgdGhhdCBhY2NvbXBhbmllcyBsaWJwbmcuCi0uU0ggTElCUE5HLlRYVAotbGlicG5nLnR4dCAtIEEgZGVzY3JpcHRpb24gb24gaG93IHRvIHVzZSBhbmQgbW9kaWZ5IGxpYnBuZwotCi0gbGlicG5nIHZlcnNpb24gMS40LjEyIC0gSnVseSAxMCwgMjAxMgotIFVwZGF0ZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIDxnbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLSBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLQotIFRoaXMgZG9jdW1lbnQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0gQmFzZWQgb246Ci0KLSBsaWJwbmcgdmVyc2lvbnMgMC45NywgSmFudWFyeSAxOTk4LCB0aHJvdWdoIDEuNC4xMiAtIEp1bHkgMTAsIDIwMTIKLSBVcGRhdGVkIGFuZCBkaXN0cmlidXRlZCBieSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLQotIGxpYnBuZyAxLjAgYmV0YSA2ICB2ZXJzaW9uIDAuOTYgTWF5IDI4LCAxOTk3Ci0gVXBkYXRlZCBhbmQgZGlzdHJpYnV0ZWQgYnkgQW5kcmVhcyBEaWxnZXIKLSBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLQotIGxpYnBuZyAxLjAgYmV0YSAyIC0gdmVyc2lvbiAwLjg4ICBKYW51YXJ5IDI2LCAxOTk2Ci0gRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQKLSBub3RpY2UgaW4gcG5nLmguIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYwotIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotCi0gVXBkYXRlZC9yZXdyaXR0ZW4gcGVyIHJlcXVlc3QgaW4gdGhlIGxpYnBuZyBGQVEKLSBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgRnJhbmsgSi4gVC4gV29qY2lrCi0gRGVjZW1iZXIgMTgsIDE5OTUgJiBKYW51YXJ5IDIwLCAxOTk2Ci0KLS5TSCBJLiBJbnRyb2R1Y3Rpb24KLQotVGhpcyBmaWxlIGRlc2NyaWJlcyBob3cgdG8gdXNlIGFuZCBtb2RpZnkgdGhlIFBORyByZWZlcmVuY2UgbGlicmFyeQotKGtub3duIGFzIGxpYnBuZykgZm9yIHlvdXIgb3duIHVzZS4gIFRoZXJlIGFyZSBmaXZlIHNlY3Rpb25zIHRvIHRoaXMKLWZpbGU6IGludHJvZHVjdGlvbiwgc3RydWN0dXJlcywgcmVhZGluZywgd3JpdGluZywgYW5kIG1vZGlmaWNhdGlvbiBhbmQKLWNvbmZpZ3VyYXRpb24gbm90ZXMgZm9yIHZhcmlvdXMgc3BlY2lhbCBwbGF0Zm9ybXMuICBJbiBhZGRpdGlvbiB0byB0aGlzCi1maWxlLCBleGFtcGxlLmMgaXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciB1c2luZyB0aGUgbGlicmFyeSwgYXMKLWl0IGlzIGhlYXZpbHkgY29tbWVudGVkIGFuZCBzaG91bGQgaW5jbHVkZSBldmVyeXRoaW5nIG1vc3QgcGVvcGxlCi13aWxsIG5lZWQuICBXZSBhc3N1bWUgdGhhdCBsaWJwbmcgaXMgYWxyZWFkeSBpbnN0YWxsZWQ7IHNlZSB0aGUKLUlOU1RBTEwgZmlsZSBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBpbnN0YWxsIGxpYnBuZy4KLQotRm9yIGV4YW1wbGVzIG9mIGxpYnBuZyB1c2FnZSwgc2VlIHRoZSBmaWxlcyAiZXhhbXBsZS5jIiwgInBuZ3Rlc3QuYyIsCi1hbmQgdGhlIGZpbGVzIGluIHRoZSAiY29udHJpYiIgZGlyZWN0b3J5LCBhbGwgb2Ygd2hpY2ggYXJlIGluY2x1ZGVkIGluCi10aGUgbGlicG5nIGRpc3RyaWJ1dGlvbi4KLQotTGlicG5nIHdhcyB3cml0dGVuIGFzIGEgY29tcGFuaW9uIHRvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgYXMgYSB3YXkKLW9mIHJlZHVjaW5nIHRoZSBhbW91bnQgb2YgdGltZSBhbmQgZWZmb3J0IGl0IHRha2VzIHRvIHN1cHBvcnQgdGhlIFBORwotZmlsZSBmb3JtYXQgaW4gYXBwbGljYXRpb24gcHJvZ3JhbXMuCi0KLVRoZSBQTkcgc3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pLCBOb3ZlbWJlciAyMDAzLCBpcyBhdmFpbGFibGUgYXMKLWEgVzNDIFJlY29tbWVuZGF0aW9uIGFuZCBhcyBhbiBJU08gU3RhbmRhcmQgKElTTy9JRUMgMTU5NDg6MjAwMyAoRSkpIGF0Ci08aHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9SRUMtUE5HLTIwMDMxMTEwLwotVGhlIFczQyBhbmQgSVNPIGRvY3VtZW50cyBoYXZlIGlkZW50aWNhbCB0ZWNobmljYWwgY29udGVudC4KLQotVGhlIFBORy0xLjIgc3BlY2lmaWNhdGlvbiBpcyBhdmFpbGFibGUgYXQKLTxodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9kb2N1bWVudHMvPi4gIEl0IGlzIHRlY2huaWNhbGx5IGVxdWl2YWxlbnQKLXRvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pIGJ1dCBoYXMgc29tZSBhZGRpdGlvbmFsIG1hdGVyaWFsLgotCi1UaGUgUE5HLTEuMCBzcGVjaWZpY2F0aW9uIGlzIGF2YWlsYWJsZQotYXMgUkZDIDIwODMgPGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nL2RvY3VtZW50cy8+IGFuZCBhcyBhCi1XM0MgUmVjb21tZW5kYXRpb24gPGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy5wbmcuaHRtbD4uCi0KLVNvbWUgYWRkaXRpb25hbCBjaHVua3MgYXJlIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lhbC1wdXJwb3NlIHB1YmxpYyBjaHVua3MKLWRvY3VtZW50cyBhdCA8aHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvZG9jdW1lbnRzLz4uCi0KLU90aGVyIGluZm9ybWF0aW9uCi1hYm91dCBQTkcsIGFuZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgbGlicG5nLCBjYW4gYmUgZm91bmQgYXQgdGhlIFBORyBob21lCi1wYWdlLCA8aHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvPi4KLQotTW9zdCB1c2VycyB3aWxsIG5vdCBoYXZlIHRvIG1vZGlmeSB0aGUgbGlicmFyeSBzaWduaWZpY2FudGx5OyBhZHZhbmNlZAotdXNlcnMgbWF5IHdhbnQgdG8gbW9kaWZ5IGl0IG1vcmUuICBBbGwgYXR0ZW1wdHMgd2VyZSBtYWRlIHRvIG1ha2UgaXQgYXMKLWNvbXBsZXRlIGFzIHBvc3NpYmxlLCB3aGlsZSBrZWVwaW5nIHRoZSBjb2RlIGVhc3kgdG8gdW5kZXJzdGFuZC4KLUN1cnJlbnRseSwgdGhpcyBsaWJyYXJ5IG9ubHkgc3VwcG9ydHMgQy4gIFN1cHBvcnQgZm9yIG90aGVyIGxhbmd1YWdlcwotaXMgYmVpbmcgY29uc2lkZXJlZC4KLQotTGlicG5nIGhhcyBiZWVuIGRlc2lnbmVkIHRvIGhhbmRsZSBtdWx0aXBsZSBzZXNzaW9ucyBhdCBvbmUgdGltZSwKLXRvIGJlIGVhc2lseSBtb2RpZmlhYmxlLCB0byBiZSBwb3J0YWJsZSB0byB0aGUgdmFzdCBtYWpvcml0eSBvZgotbWFjaGluZXMgKEFOU0ksIEsmUiwgMTYtLCAzMi0sIGFuZCA2NC1iaXQpIGF2YWlsYWJsZSwgYW5kIHRvIGJlIGVhc3kKLXRvIHVzZS4gIFRoZSB1bHRpbWF0ZSBnb2FsIG9mIGxpYnBuZyBpcyB0byBwcm9tb3RlIHRoZSBhY2NlcHRhbmNlIG9mCi10aGUgUE5HIGZpbGUgZm9ybWF0IGluIHdoYXRldmVyIHdheSBwb3NzaWJsZS4gIFdoaWxlIHRoZXJlIGlzIHN0aWxsCi13b3JrIHRvIGJlIGRvbmUgKHNlZSB0aGUgVE9ETyBmaWxlKSwgbGlicG5nIHNob3VsZCBjb3ZlciB0aGUKLW1ham9yaXR5IG9mIHRoZSBuZWVkcyBvZiBpdHMgdXNlcnMuCi0KLUxpYnBuZyB1c2VzIHpsaWIgZm9yIGl0cyBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBvZiBQTkcgZmlsZXMuCi1GdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHpsaWIsIGFuZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgemxpYiwgY2FuCi1iZSBmb3VuZCBhdCB0aGUgemxpYiBob21lIHBhZ2UsIDxodHRwOi8vd3d3LmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC96bGliLz4uCi1UaGUgemxpYiBjb21wcmVzc2lvbiB1dGlsaXR5IGlzIGEgZ2VuZXJhbCBwdXJwb3NlIHV0aWxpdHkgdGhhdCBpcwotdXNlZnVsIGZvciBtb3JlIHRoYW4gUE5HIGZpbGVzLCBhbmQgY2FuIGJlIHVzZWQgd2l0aG91dCBsaWJwbmcuCi1TZWUgdGhlIGRvY3VtZW50YXRpb24gZGVsaXZlcmVkIHdpdGggemxpYiBmb3IgbW9yZSBkZXRhaWxzLgotWW91IGNhbiB1c3VhbGx5IGZpbmQgdGhlIHNvdXJjZSBmaWxlcyBmb3IgdGhlIHpsaWIgdXRpbGl0eSB3aGVyZXZlciB5b3UKLWZpbmQgdGhlIGxpYnBuZyBzb3VyY2UgZmlsZXMuCi0KLUxpYnBuZyBpcyB0aHJlYWQgc2FmZSwgcHJvdmlkZWQgdGhlIHRocmVhZHMgYXJlIHVzaW5nIGRpZmZlcmVudAotaW5zdGFuY2VzIG9mIHRoZSBzdHJ1Y3R1cmVzLiAgRWFjaCB0aHJlYWQgc2hvdWxkIGhhdmUgaXRzIG93bgotcG5nX3N0cnVjdCBhbmQgcG5nX2luZm8gaW5zdGFuY2VzLCBhbmQgdGh1cyBpdHMgb3duIGltYWdlLgotTGlicG5nIGRvZXMgbm90IHByb3RlY3QgaXRzZWxmIGFnYWluc3QgdHdvIHRocmVhZHMgdXNpbmcgdGhlCi1zYW1lIGluc3RhbmNlIG9mIGEgc3RydWN0dXJlLgotCi0uU0ggSUkuIFN0cnVjdHVyZXMKLQotVGhlcmUgYXJlIHR3byBtYWluIHN0cnVjdHVyZXMgdGhhdCBhcmUgaW1wb3J0YW50IHRvIGxpYnBuZywgcG5nX3N0cnVjdAotYW5kIHBuZ19pbmZvLiAgVGhlIGZpcnN0LCBwbmdfc3RydWN0LCBpcyBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgdGhhdAotd2lsbCBub3QsIGZvciB0aGUgbW9zdCBwYXJ0LCBiZSB1c2VkIGJ5IGEgdXNlciBleGNlcHQgYXMgdGhlIGZpcnN0Ci12YXJpYWJsZSBwYXNzZWQgdG8gZXZlcnkgbGlicG5nIGZ1bmN0aW9uIGNhbGwuCi0KLVRoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLVBORyBmaWxlLiAgQXQgb25lIHRpbWUsIHRoZSBmaWVsZHMgb2YgcG5nX2luZm8gd2VyZSBpbnRlbmRlZCB0byBiZQotZGlyZWN0bHkgYWNjZXNzaWJsZSB0byB0aGUgdXNlci4gIEhvd2V2ZXIsIHRoaXMgdGVuZGVkIHRvIGNhdXNlIHByb2JsZW1zCi13aXRoIGFwcGxpY2F0aW9ucyB1c2luZyBkeW5hbWljYWxseSBsb2FkZWQgbGlicmFyaWVzLCBhbmQgYXMgYSByZXN1bHQKLWEgc2V0IG9mIGludGVyZmFjZSBmdW5jdGlvbnMgZm9yIHBuZ19pbmZvICh0aGUgcG5nX2dldF8qKCkgYW5kIHBuZ19zZXRfKigpCi1mdW5jdGlvbnMpIHdhcyBkZXZlbG9wZWQuICBUaGUgZmllbGRzIG9mIHBuZ19pbmZvIGFyZSBzdGlsbCBhdmFpbGFibGUgZm9yCi1vbGRlciBhcHBsaWNhdGlvbnMsIGJ1dCBpdCBpcyBzdWdnZXN0ZWQgdGhhdCBhcHBsaWNhdGlvbnMgdXNlIHRoZSBuZXcKLWludGVyZmFjZXMgaWYgYXQgYWxsIHBvc3NpYmxlLgotCi1BcHBsaWNhdGlvbnMgdGhhdCBkbyBtYWtlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG1lbWJlcnMgb2YgcG5nX3N0cnVjdCAoZXhjZXB0Ci1mb3IgcG5nX3B0ci0+am1wYnVmKSBtdXN0IGJlIHJlY29tcGlsZWQgd2hlbmV2ZXIgdGhlIGxpYnJhcnkgaXMgdXBkYXRlZCwKLWFuZCBhcHBsaWNhdGlvbnMgdGhhdCBtYWtlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG1lbWJlcnMgb2YgcG5nX2luZm8gbXVzdAotYmUgcmVjb21waWxlZCBpZiB0aGV5IHdlcmUgY29tcGlsZWQgb3IgbG9hZGVkIHdpdGggbGlicG5nIHZlcnNpb24gMS4wLjYsCi1pbiB3aGljaCB0aGUgbWVtYmVycyB3ZXJlIGluIGEgZGlmZmVyZW50IG9yZGVyLiAgSW4gdmVyc2lvbiAxLjAuNywgdGhlCi1tZW1iZXJzIG9mIHRoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgcmV2ZXJ0ZWQgdG8gdGhlIG9sZCBvcmRlciwgYXMgdGhleSB3ZXJlCi1pbiB2ZXJzaW9ucyAwLjk3YyB0aHJvdWdoIDEuMC41LiAgU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDIuMC4wLCBib3RoCi1zdHJ1Y3R1cmVzIGFyZSBnb2luZyB0byBiZSBoaWRkZW4sIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIHN0cnVjdHVyZXMgd2lsbAotb25seSBiZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIHBuZ19nZXQvcG5nX3NldCBmdW5jdGlvbnMuCi0KLVRoZSBwbmcuaCBoZWFkZXIgZmlsZSBpcyBhbiBpbnZhbHVhYmxlIHJlZmVyZW5jZSBmb3IgcHJvZ3JhbW1pbmcgd2l0aCBsaWJwbmcuCi1BbmQgd2hpbGUgSSdtIG9uIHRoZSB0b3BpYywgbWFrZSBzdXJlIHlvdSBpbmNsdWRlIHRoZSBsaWJwbmcgaGVhZGVyIGZpbGU6Ci0KLSNpbmNsdWRlIDxwbmcuaD4KLQotLlNIIElJSS4gUmVhZGluZwotCi1XZSdsbCBub3cgd2FsayB5b3UgdGhyb3VnaCB0aGUgcG9zc2libGUgZnVuY3Rpb25zIHRvIGNhbGwgd2hlbiByZWFkaW5nCi1pbiBhIFBORyBmaWxlIHNlcXVlbnRpYWxseSwgYnJpZWZseSBleHBsYWluaW5nIHRoZSBzeW50YXggYW5kIHB1cnBvc2UKLW9mIGVhY2ggb25lLiAgU2VlIGV4YW1wbGUuYyBhbmQgcG5nLmggZm9yIG1vcmUgZGV0YWlsLiAgV2hpbGUKLXByb2dyZXNzaXZlIHJlYWRpbmcgaXMgY292ZXJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLCB5b3Ugd2lsbCBzdGlsbAotbmVlZCBzb21lIG9mIHRoZSBmdW5jdGlvbnMgZGlzY3Vzc2VkIGluIHRoaXMgc2VjdGlvbiB0byByZWFkIGEgUE5HCi1maWxlLgotCi0uU1MgU2V0dXAKLQotWW91IHdpbGwgd2FudCB0byBkbyB0aGUgSS9PIGluaXRpYWxpemF0aW9uKCopIGJlZm9yZSB5b3UgZ2V0IGludG8gbGlicG5nLAotc28gaWYgaXQgZG9lc24ndCB3b3JrLCB5b3UgZG9uJ3QgaGF2ZSBtdWNoIHRvIHVuZG8uICBPZiBjb3Vyc2UsIHlvdQotd2lsbCBhbHNvIHdhbnQgdG8gaW5zdXJlIHRoYXQgeW91IGFyZSwgaW4gZmFjdCwgZGVhbGluZyB3aXRoIGEgUE5HCi1maWxlLiAgTGlicG5nIHByb3ZpZGVzIGEgc2ltcGxlIGNoZWNrIHRvIHNlZSBpZiBhIGZpbGUgaXMgYSBQTkcgZmlsZS4KLVRvIHVzZSBpdCwgcGFzcyBpbiB0aGUgZmlyc3QgMSB0byA4IGJ5dGVzIG9mIHRoZSBmaWxlIHRvIHRoZSBmdW5jdGlvbgotcG5nX3NpZ19jbXAoKSwgYW5kIGl0IHdpbGwgcmV0dXJuIDAgKGZhbHNlKSBpZiB0aGUgYnl0ZXMgbWF0Y2ggdGhlCi1jb3JyZXNwb25kaW5nIGJ5dGVzIG9mIHRoZSBQTkcgc2lnbmF0dXJlLCBvciBub256ZXJvICh0cnVlKSBvdGhlcndpc2UuCi1PZiBjb3Vyc2UsIHRoZSBtb3JlIGJ5dGVzIHlvdSBwYXNzIGluLCB0aGUgZ3JlYXRlciB0aGUgYWNjdXJhY3kgb2YgdGhlCi1wcmVkaWN0aW9uLgotCi1JZiB5b3UgYXJlIGludGVuZGluZyB0byBrZWVwIHRoZSBmaWxlIHBvaW50ZXIgb3BlbiBmb3IgdXNlIGluIGxpYnBuZywKLXlvdSBtdXN0IGVuc3VyZSB5b3UgZG9uJ3QgcmVhZCBtb3JlIHRoYW4gOCBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcKLW9mIHRoZSBmaWxlLCBhbmQgeW91IGFsc28gaGF2ZSB0byBtYWtlIGEgY2FsbCB0byBwbmdfc2V0X3NpZ19ieXRlc19yZWFkKCkKLXdpdGggdGhlIG51bWJlciBvZiBieXRlcyB5b3UgcmVhZCBmcm9tIHRoZSBiZWdpbm5pbmcuICBMaWJwbmcgd2lsbAotdGhlbiBvbmx5IGNoZWNrIHRoZSBieXRlcyAoaWYgYW55KSB0aGF0IHlvdXIgcHJvZ3JhbSBkaWRuJ3QgcmVhZC4KLQotKCopOiBJZiB5b3UgYXJlIG5vdCB1c2luZyB0aGUgc3RhbmRhcmQgSS9PIGZ1bmN0aW9ucywgeW91IHdpbGwgbmVlZAotdG8gcmVwbGFjZSB0aGVtIHdpdGggY3VzdG9tIGZ1bmN0aW9ucy4gIFNlZSB0aGUgZGlzY3Vzc2lvbiB1bmRlcgotQ3VzdG9taXppbmcgbGlicG5nLgotCi0KLSAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVfbmFtZSwgInJiIik7Ci0gICAgaWYgKCFmcCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLSAgICBmcmVhZChoZWFkZXIsIDEsIG51bWJlciwgZnApOwotICAgIGlzX3BuZyA9ICFwbmdfc2lnX2NtcChoZWFkZXIsIDAsIG51bWJlcik7Ci0gICAgaWYgKCFpc19wbmcpCi0gICAgewotICAgICAgICByZXR1cm4gKE5PVF9QTkcpOwotICAgIH0KLQotCi1OZXh0LCBwbmdfc3RydWN0IGFuZCBwbmdfaW5mbyBuZWVkIHRvIGJlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQuICBJbgotb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHNpemUgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyBjb3JyZWN0IGV2ZW4gd2l0aCBhCi1keW5hbWljYWxseSBsaW5rZWQgbGlicG5nLCB0aGVyZSBhcmUgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgYW5kCi1hbGxvY2F0ZSB0aGUgc3RydWN0dXJlcy4gIFdlIGFsc28gcGFzcyB0aGUgbGlicmFyeSB2ZXJzaW9uLCBvcHRpb25hbAotcG9pbnRlcnMgdG8gZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb25zLCBhbmQgYSBwb2ludGVyIHRvIGEgZGF0YSBzdHJ1Y3QgZm9yCi11c2UgYnkgdGhlIGVycm9yIGZ1bmN0aW9ucywgaWYgbmVjZXNzYXJ5ICh0aGUgcG9pbnRlciBhbmQgZnVuY3Rpb25zIGNhbgotYmUgTlVMTCBpZiB0aGUgZGVmYXVsdCBlcnJvciBoYW5kbGVycyBhcmUgdG8gYmUgdXNlZCkuICBTZWUgdGhlIHNlY3Rpb24KLW9uIENoYW5nZXMgdG8gTGlicG5nIGJlbG93IHJlZ2FyZGluZyB0aGUgb2xkIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucy4KLVRoZSBzdHJ1Y3R1cmUgYWxsb2NhdGlvbiBmdW5jdGlvbnMgcXVpZXRseSByZXR1cm4gTlVMTCBpZiB0aGV5IGZhaWwgdG8KLWNyZWF0ZSB0aGUgc3RydWN0dXJlLCBzbyB5b3VyIGFwcGxpY2F0aW9uIHNob3VsZCBjaGVjayBmb3IgdGhhdC4KLQotICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0Ci0gICAgICAgKFBOR19MSUJQTkdfVkVSX1NUUklORywgKHBuZ192b2lkcCl1c2VyX2Vycm9yX3B0ciwKLSAgICAgICAgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKLSAgICBpZiAoIXBuZ19wdHIpCi0gICAgICAgIHJldHVybiAoRVJST1IpOwotCi0gICAgcG5nX2luZm9wIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLSAgICBpZiAoIWluZm9fcHRyKQotICAgIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsCi0gICAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwsIChwbmdfaW5mb3BwKU5VTEwpOwotICAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLSAgICBwbmdfaW5mb3AgZW5kX2luZm8gPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOwotICAgIGlmICghZW5kX2luZm8pCi0gICAgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAotICAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwpOwotICAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLUlmIHlvdSB3YW50IHRvIHVzZSB5b3VyIG93biBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcywKLWRlZmluZSBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEIGFuZCB1c2UKLXBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMigpIGluc3RlYWQgb2YgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCgpOgotCi0gICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMgotICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCi0gICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbiwgKHBuZ192b2lkcCkKLSAgICAgICAgdXNlcl9tZW1fcHRyLCB1c2VyX21hbGxvY19mbiwgdXNlcl9mcmVlX2ZuKTsKLQotVGhlIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIHBhc3NlZCB0byBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCkKLWFuZCB0aGUgbWVtb3J5IGFsbG9jL2ZyZWUgcm91dGluZXMgcGFzc2VkIHRvIHBuZ19jcmVhdGVfc3RydWN0XzIoKQotYXJlIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBsaWJwbmcgc3VwcGxpZWQgZXJyb3IKLWhhbmRsaW5nIGFuZCBtZW1vcnkgYWxsb2MvZnJlZSBmdW5jdGlvbnMuCi0KLVdoZW4gbGlicG5nIGVuY291bnRlcnMgYW4gZXJyb3IsIGl0IGV4cGVjdHMgdG8gbG9uZ2ptcCBiYWNrCi10byB5b3VyIHJvdXRpbmUuICBUaGVyZWZvcmUsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBzZXRqbXAgYW5kIHBhc3MKLXlvdXIgcG5nX2ptcGJ1ZihwbmdfcHRyKS4gIElmIHlvdSByZWFkIHRoZSBmaWxlIGZyb20gZGlmZmVyZW50Ci1yb3V0aW5lcywgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlIGptcGJ1ZiBmaWVsZCBldmVyeSB0aW1lIHlvdSBlbnRlcgotYSBuZXcgcm91dGluZSB0aGF0IHdpbGwgY2FsbCBhIHBuZ18qKCkgZnVuY3Rpb24uCi0KLVNlZSB5b3VyIGRvY3VtZW50YXRpb24gb2Ygc2V0am1wL2xvbmdqbXAgZm9yIHlvdXIgY29tcGlsZXIgZm9yIG1vcmUKLWluZm9ybWF0aW9uIG9uIHNldGptcC9sb25nam1wLiAgU2VlIHRoZSBkaXNjdXNzaW9uIG9uIGxpYnBuZyBlcnJvcgotaGFuZGxpbmcgaW4gdGhlIEN1c3RvbWl6aW5nIExpYnBuZyBzZWN0aW9uIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uCi1vbiB0aGUgbGlicG5nIGVycm9yIGhhbmRsaW5nLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCBhbmQgbGlicG5nIGxvbmdqbXAncwotYmFjayB0byB5b3VyIHNldGptcCwgeW91IHdpbGwgd2FudCB0byBjYWxsIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCkgdG8KLWZyZWUgYW55IG1lbW9yeS4KLQotICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCi0gICAgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAotICAgICAgICAgICAmZW5kX2luZm8pOwotICAgICAgICBmY2xvc2UoZnApOwotICAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLUlmIHlvdSB3b3VsZCByYXRoZXIgYXZvaWQgdGhlIGNvbXBsZXhpdHkgb2Ygc2V0am1wL2xvbmdqbXAgaXNzdWVzLAoteW91IGNhbiBjb21waWxlIGxpYnBuZyB3aXRoIFBOR19OT19TRVRKTVAsIGluIHdoaWNoIGNhc2UKLWVycm9ycyB3aWxsIHJlc3VsdCBpbiBhIGNhbGwgdG8gUE5HX0FCT1JUKCkgd2hpY2ggZGVmYXVsdHMgdG8gYWJvcnQoKS4KLQotWW91IGNhbiAjZGVmaW5lIFBOR19BQk9SVCgpIHRvIGEgZnVuY3Rpb24gdGhhdCBkb2VzIHNvbWV0aGluZwotbW9yZSB1c2VmdWwgdGhhbiBhYm9ydCgpLCBhcyBsb25nIGFzIHlvdXIgZnVuY3Rpb24gZG9lcyBub3QKLXJldHVybi4KLQotTm93IHlvdSBuZWVkIHRvIHNldCB1cCB0aGUgaW5wdXQgY29kZS4gIFRoZSBkZWZhdWx0IGZvciBsaWJwbmcgaXMgdG8KLXVzZSB0aGUgQyBmdW5jdGlvbiBmcmVhZCgpLiAgSWYgeW91IHVzZSB0aGlzLCB5b3Ugd2lsbCBuZWVkIHRvIHBhc3MgYQotdmFsaWQgRklMRSAqIGluIHRoZSBmdW5jdGlvbiBwbmdfaW5pdF9pbygpLiAgQmUgc3VyZSB0aGF0IHRoZSBmaWxlIGlzCi1vcGVuZWQgaW4gYmluYXJ5IG1vZGUuICBJZiB5b3Ugd2lzaCB0byBoYW5kbGUgcmVhZGluZyBkYXRhIGluIGFub3RoZXIKLXdheSwgeW91IG5lZWQgbm90IGNhbGwgdGhlIHBuZ19pbml0X2lvKCkgZnVuY3Rpb24sIGJ1dCB5b3UgbXVzdCB0aGVuCi1pbXBsZW1lbnQgdGhlIGxpYnBuZyBJL08gbWV0aG9kcyBkaXNjdXNzZWQgaW4gdGhlIEN1c3RvbWl6aW5nIExpYnBuZwotc2VjdGlvbiBiZWxvdy4KLQotICAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIGZwKTsKLQotSWYgeW91IGhhZCBwcmV2aW91c2x5IG9wZW5lZCB0aGUgZmlsZSBhbmQgcmVhZCBhbnkgb2YgdGhlIHNpZ25hdHVyZSBmcm9tCi10aGUgYmVnaW5uaW5nIGluIG9yZGVyIHRvIHNlZSBpZiB0aGlzIHdhcyBhIFBORyBmaWxlLCB5b3UgbmVlZCB0byBsZXQKLWxpYnBuZyBrbm93IHRoYXQgdGhlcmUgYXJlIHNvbWUgYnl0ZXMgbWlzc2luZyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KLQotICAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIG51bWJlcik7Ci0KLVlvdSBjYW4gY2hhbmdlIHRoZSB6bGliIGNvbXByZXNzaW9uIGJ1ZmZlciBzaXplIHRvIGJlIHVzZWQgd2hpbGUKLXJlYWRpbmcgY29tcHJlc3NlZCBkYXRhIHdpdGgKLQotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3B0ciwgYnVmZmVyX3NpemUpOwotCi13aGVyZSB0aGUgZGVmYXVsdCBzaXplIGlzIDgxOTIgYnl0ZXMuICBOb3RlIHRoYXQgdGhlIGJ1ZmZlciBzaXplCi1pcyBjaGFuZ2VkIGltbWVkaWF0ZWx5IGFuZCB0aGUgYnVmZmVyIGlzIHJlYWxsb2NhdGVkIGltbWVkaWF0ZWx5LAotaW5zdGVhZCBvZiBzZXR0aW5nIGEgZmxhZyB0byBiZSBhY3RlZCB1cG9uIGxhdGVyLgotCi0uU1MgU2V0dGluZyB1cCBjYWxsYmFjayBjb2RlCi0KLVlvdSBjYW4gc2V0IHVwIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIGFueSB1bmtub3duIGNodW5rcyBpbiB0aGUKLWlucHV0IHN0cmVhbS4gWW91IG11c3Qgc3VwcGx5IHRoZSBmdW5jdGlvbgotCi0gICAgcmVhZF9jaHVua19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICAgcG5nX3Vua25vd25fY2h1bmtwIGNodW5rKTsKLSAgICB7Ci0gICAgICAgLyogVGhlIHVua25vd24gY2h1bmsgc3RydWN0dXJlIGNvbnRhaW5zIHlvdXIKLSAgICAgICAgICBjaHVuayBkYXRhLCBhbG9uZyB3aXRoIHNpbWlsYXIgZGF0YSBmb3IgYW55IG90aGVyCi0gICAgICAgICAgdW5rbm93biBjaHVua3M6ICovCi0KLSAgICAgICAgICAgcG5nX2J5dGUgbmFtZVs1XTsKLSAgICAgICAgICAgcG5nX2J5dGUgKmRhdGE7Ci0gICAgICAgICAgIHBuZ19zaXplX3Qgc2l6ZTsKLQotICAgICAgIC8qIE5vdGUgdGhhdCBsaWJwbmcgaGFzIGFscmVhZHkgdGFrZW4gY2FyZSBvZgotICAgICAgICAgIHRoZSBDUkMgaGFuZGxpbmcgKi8KLQotICAgICAgIC8qIHB1dCB5b3VyIGNvZGUgaGVyZS4gIFNlYXJjaCBmb3IgeW91ciBjaHVuayBpbiB0aGUKLSAgICAgICAgICB1bmtub3duIGNodW5rIHN0cnVjdHVyZSwgcHJvY2VzcyBpdCwgYW5kIHJldHVybiBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nOiAqLwotCi0gICAgICAgcmV0dXJuICgtbik7IC8qIGNodW5rIGhhZCBhbiBlcnJvciAqLwotICAgICAgIHJldHVybiAoMCk7IC8qIGRpZCBub3QgcmVjb2duaXplICovCi0gICAgICAgcmV0dXJuIChuKTsgLyogc3VjY2VzcyAqLwotICAgIH0KLQotKFlvdSBjYW4gZ2l2ZSB5b3VyIGZ1bmN0aW9uIGFub3RoZXIgbmFtZSB0aGF0IHlvdSBsaWtlIGluc3RlYWQgb2YKLSJyZWFkX2NodW5rX2NhbGxiYWNrIikKLQotVG8gaW5mb3JtIGxpYnBuZyBhYm91dCB5b3VyIGZ1bmN0aW9uLCB1c2UKLQotICAgIHBuZ19zZXRfcmVhZF91c2VyX2NodW5rX2ZuKHBuZ19wdHIsIHVzZXJfY2h1bmtfcHRyLAotICAgICAgICByZWFkX2NodW5rX2NhbGxiYWNrKTsKLQotVGhpcyBuYW1lcyBub3Qgb25seSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24sIGJ1dCBhbHNvIGEgdXNlciBwb2ludGVyIHRoYXQKLXlvdSBjYW4gcmV0cmlldmUgd2l0aAotCi0gICAgcG5nX2dldF91c2VyX2NodW5rX3B0cihwbmdfcHRyKTsKLQotSWYgeW91IGNhbGwgdGhlIHBuZ19zZXRfcmVhZF91c2VyX2NodW5rX2ZuKCkgZnVuY3Rpb24sIHRoZW4gYWxsIHVua25vd24KLWNodW5rcyB3aWxsIGJlIHNhdmVkIHdoZW4gcmVhZCwgaW4gY2FzZSB5b3VyIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgbmVlZAotb25lIG9yIG1vcmUgb2YgdGhlbS4gIFRoaXMgYmVoYXZpb3IgY2FuIGJlIGNoYW5nZWQgd2l0aCB0aGUKLXBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcygpIGZ1bmN0aW9uLCBkZXNjcmliZWQgYmVsb3cuCi0KLUF0IHRoaXMgcG9pbnQsIHlvdSBjYW4gc2V0IHVwIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlCi1jYWxsZWQgYWZ0ZXIgZWFjaCByb3cgaGFzIGJlZW4gcmVhZCwgd2hpY2ggeW91IGNhbiB1c2UgdG8gY29udHJvbAotYSBwcm9ncmVzcyBtZXRlciBvciB0aGUgbGlrZS4gIEl0J3MgZGVtb25zdHJhdGVkIGluIHBuZ3Rlc3QuYy4KLVlvdSBtdXN0IHN1cHBseSBhIGZ1bmN0aW9uCi0KLSAgICB2b2lkIHJlYWRfcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgICAgcG5nX3VpbnRfMzIgcm93LCBpbnQgcGFzcyk7Ci0gICAgewotICAgICAgLyogcHV0IHlvdXIgY29kZSBoZXJlICovCi0gICAgfQotCi0oWW91IGNhbiBnaXZlIGl0IGFub3RoZXIgbmFtZSB0aGF0IHlvdSBsaWtlIGluc3RlYWQgb2YgInJlYWRfcm93X2NhbGxiYWNrIikKLQotVG8gaW5mb3JtIGxpYnBuZyBhYm91dCB5b3VyIGZ1bmN0aW9uLCB1c2UKLQotICAgIHBuZ19zZXRfcmVhZF9zdGF0dXNfZm4ocG5nX3B0ciwgcmVhZF9yb3dfY2FsbGJhY2spOwotCi0uU1MgVW5rbm93bi1jaHVuayBoYW5kbGluZwotCi1Ob3cgeW91IGdldCB0byBzZXQgdGhlIHdheSB0aGUgbGlicmFyeSBwcm9jZXNzZXMgdW5rbm93biBjaHVua3MgaW4gdGhlCi1pbnB1dCBQTkcgc3RyZWFtLiBCb3RoIGtub3duIGFuZCB1bmtub3duIGNodW5rcyB3aWxsIGJlIHJlYWQuICBOb3JtYWwKLWJlaGF2aW9yIGlzIHRoYXQga25vd24gY2h1bmtzIHdpbGwgYmUgcGFyc2VkIGludG8gaW5mb3JtYXRpb24gaW4KLXZhcmlvdXMgaW5mb19wdHIgbWVtYmVycyB3aGlsZSB1bmtub3duIGNodW5rcyB3aWxsIGJlIGRpc2NhcmRlZC4gVGhpcwotYmVoYXZpb3IgY2FuIGJlIHdhc3RlZnVsIGlmIHlvdXIgYXBwbGljYXRpb24gd2lsbCBuZXZlciB1c2Ugc29tZSBrbm93bgotY2h1bmsgdHlwZXMuIFRvIGNoYW5nZSB0aGlzLCB5b3UgY2FuIGNhbGw6Ci0KLSAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocG5nX3B0ciwga2VlcCwKLSAgICAgICAgY2h1bmtfbGlzdCwgbnVtX2NodW5rcyk7Ci0gICAga2VlcCAgICAgICAtIDA6IGRlZmF1bHQgdW5rbm93biBjaHVuayBoYW5kbGluZwotICAgICAgICAgICAgICAgICAxOiBpZ25vcmU7IGRvIG5vdCBrZWVwCi0gICAgICAgICAgICAgICAgIDI6IGtlZXAgb25seSBpZiBzYWZlLXRvLWNvcHkKLSAgICAgICAgICAgICAgICAgMzoga2VlcCBldmVuIGlmIHVuc2FmZS10by1jb3B5Ci0gICAgICAgICAgICAgICBZb3UgY2FuIHVzZSB0aGVzZSBkZWZpbml0aW9uczoKLSAgICAgICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUICAgMAotICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX05FVkVSICAgICAgICAxCi0gICAgICAgICAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRSAgICAgIDIKLSAgICAgICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMgICAgICAgMwotICAgIGNodW5rX2xpc3QgLSBsaXN0IG9mIGNodW5rcyBhZmZlY3RlZCAoYSBieXRlIHN0cmluZywKLSAgICAgICAgICAgICAgICAgZml2ZSBieXRlcyBwZXIgY2h1bmssIE5VTEwgb3IgJ1wwJyBpZgotICAgICAgICAgICAgICAgICBudW1fY2h1bmtzIGlzIDApCi0gICAgbnVtX2NodW5rcyAtIG51bWJlciBvZiBjaHVua3MgYWZmZWN0ZWQ7IGlmIDAsIGFsbAotICAgICAgICAgICAgICAgICB1bmtub3duIGNodW5rcyBhcmUgYWZmZWN0ZWQuICBJZiBub256ZXJvLAotICAgICAgICAgICAgICAgICBvbmx5IHRoZSBjaHVua3MgaW4gdGhlIGxpc3QgYXJlIGFmZmVjdGVkCi0KLVVua25vd24gY2h1bmtzIGRlY2xhcmVkIGluIHRoaXMgd2F5IHdpbGwgYmUgc2F2ZWQgYXMgcmF3IGRhdGEgb250byBhCi1saXN0IG9mIHBuZ191bmtub3duX2NodW5rIHN0cnVjdHVyZXMuICBJZiBhIGNodW5rIHRoYXQgaXMgbm9ybWFsbHkKLWtub3duIHRvIGxpYnBuZyBpcyBuYW1lZCBpbiB0aGUgbGlzdCwgaXQgd2lsbCBiZSBoYW5kbGVkIGFzIHVua25vd24sCi1hY2NvcmRpbmcgdG8gdGhlICJrZWVwIiBkaXJlY3RpdmUuICBJZiBhIGNodW5rIGlzIG5hbWVkIGluIHN1Y2Nlc3NpdmUKLWluc3RhbmNlcyBvZiBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSwgdGhlIGZpbmFsIGluc3RhbmNlIHdpbGwKLXRha2UgcHJlY2VkZW5jZS4gIFRoZSBJSERSIGFuZCBJRU5EIGNodW5rcyBzaG91bGQgbm90IGJlIG5hbWVkIGluCi1jaHVua19saXN0OyBpZiB0aGV5IGFyZSwgbGlicG5nIHdpbGwgcHJvY2VzcyB0aGVtIG5vcm1hbGx5IGFueXdheS4KLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIHRoZSB1c2FnZSBvZiBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSwKLXdoZXJlIHRoZSBwcml2YXRlICJ2cEFnIiBjaHVuayB3aWxsIGxhdGVyIGJlIHByb2Nlc3NlZCBieSBhIHVzZXIgY2h1bmsKLWNhbGxiYWNrIGZ1bmN0aW9uOgotCi0gICAgcG5nX2J5dGUgdnBBZ1s1XT17MTE4LCAxMTIsICA2NSwgMTAzLCAocG5nX2J5dGUpICdcMCd9OwotCi0gICAgI2lmIGRlZmluZWQoUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKLSAgICAgIHBuZ19ieXRlIHVudXNlZF9jaHVua3NbXT0KLSAgICAgIHsKLSAgICAgICAgMTA0LCAgNzMsICA4MywgIDg0LCAocG5nX2J5dGUpICdcMCcsICAgLyogaElTVCAqLwotICAgICAgICAxMDUsICA4NCwgIDg4LCAxMTYsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBpVFh0ICovCi0gICAgICAgIDExMiwgIDY3LCAgNjUsICA3NiwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIHBDQUwgKi8KLSAgICAgICAgMTE1LCAgNjcsICA2NSwgIDc2LCAocG5nX2J5dGUpICdcMCcsICAgLyogc0NBTCAqLwotICAgICAgICAxMTUsICA4MCwgIDc2LCAgODQsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBzUExUICovCi0gICAgICAgIDExNiwgIDczLCAgNzcsICA2OSwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIHRJTUUgKi8KLSAgICAgIH07Ci0gICAgI2VuZGlmCi0KLSAgICAuLi4KLQotICAgICNpZiBkZWZpbmVkKFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCi0gICAgICAvKiBpZ25vcmUgYWxsIHVua25vd24gY2h1bmtzOiAqLwotICAgICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHJlYWRfcHRyLCAxLCBOVUxMLCAwKTsKLSAgICAgIC8qIGV4Y2VwdCBmb3IgdnBBZzogKi8KLSAgICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhyZWFkX3B0ciwgMiwgdnBBZywgMSk7Ci0gICAgICAvKiBhbHNvIGlnbm9yZSB1bnVzZWQga25vd24gY2h1bmtzOiAqLwotICAgICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHJlYWRfcHRyLCAxLCB1bnVzZWRfY2h1bmtzLAotICAgICAgICAgKGludClzaXplb2YodW51c2VkX2NodW5rcykvNSk7Ci0gICAgI2VuZGlmCi0KLS5TUyBVc2VyIGxpbWl0cwotCi1UaGUgUE5HIHNwZWNpZmljYXRpb24gYWxsb3dzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIGFuIGltYWdlIHRvIGJlIGFzCi1sYXJnZSBhcyAyXjMxLTEgKDB4N2ZmZmZmZmYpLCBvciBhYm91dCAyLjE0NyBiaWxsaW9uIHJvd3MgYW5kIGNvbHVtbnMuCi1TaW5jZSB2ZXJ5IGZldyBhcHBsaWNhdGlvbnMgcmVhbGx5IG5lZWQgdG8gcHJvY2VzcyBzdWNoIGxhcmdlIGltYWdlcywKLXdlIGhhdmUgaW1wb3NlZCBhbiBhcmJpdHJhcnkgMS1taWxsaW9uIGxpbWl0IG9uIHJvd3MgYW5kIGNvbHVtbnMuCi1MYXJnZXIgaW1hZ2VzIHdpbGwgYmUgcmVqZWN0ZWQgaW1tZWRpYXRlbHkgd2l0aCBhIHBuZ19lcnJvcigpIGNhbGwuIElmCi15b3Ugd2lzaCB0byBvdmVycmlkZSB0aGlzIGxpbWl0LCB5b3UgY2FuIHVzZQotCi0gICBwbmdfc2V0X3VzZXJfbGltaXRzKHBuZ19wdHIsIHdpZHRoX21heCwgaGVpZ2h0X21heCk7Ci0KLXRvIHNldCB5b3VyIG93biBsaW1pdHMsIG9yIHVzZSB3aWR0aF9tYXggPSBoZWlnaHRfbWF4ID0gMHg3ZmZmZmZmZkwKLXRvIGFsbG93IGFsbCB2YWxpZCBkaW1lbnNpb25zIChsaWJwbmcgbWF5IHJlamVjdCBzb21lIHZlcnkgbGFyZ2UgaW1hZ2VzCi1hbnl3YXkgYmVjYXVzZSBvZiBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93IGNvbmRpdGlvbnMpLgotCi1Zb3Ugc2hvdWxkIHB1dCB0aGlzIHN0YXRlbWVudCBhZnRlciB5b3UgY3JlYXRlIHRoZSBQTkcgc3RydWN0dXJlIGFuZAotYmVmb3JlIGNhbGxpbmcgcG5nX3JlYWRfaW5mbygpLCBwbmdfcmVhZF9wbmcoKSwgb3IgcG5nX3Byb2Nlc3NfZGF0YSgpLgotSWYgeW91IG5lZWQgdG8gcmV0cmlldmUgdGhlIGxpbWl0cyB0aGF0IGFyZSBiZWluZyBhcHBsaWVkLCB1c2UKLQotICAgd2lkdGhfbWF4ID0gcG5nX2dldF91c2VyX3dpZHRoX21heChwbmdfcHRyKTsKLSAgIGhlaWdodF9tYXggPSBwbmdfZ2V0X3VzZXJfaGVpZ2h0X21heChwbmdfcHRyKTsKLQotVGhlIFBORyBzcGVjaWZpY2F0aW9uIHNldHMgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBhbmNpbGxhcnkgY2h1bmtzCi1hbGxvd2VkIGluIGEgUE5HIGRhdGFzdHJlYW0uICBZb3UgY2FuIGltcG9zZSBhIGxpbWl0IG9uIHRoZSB0b3RhbCBudW1iZXIKLW9mIHNQTFQsIHRFWHQsIGlUWHQsIHpUWHQsIGFuZCB1bmtub3duIGNodW5rcyB0aGF0IHdpbGwgYmUgc3RvcmVkLCB3aXRoCi0KLSAgIHBuZ19zZXRfY2h1bmtfY2FjaGVfbWF4KHBuZ19wdHIsIHVzZXJfY2h1bmtfY2FjaGVfbWF4KTsKLQotd2hlcmUgMHg3ZmZmZmZmZkwgbWVhbnMgdW5saW1pdGVkLiAgWW91IGNhbiByZXRyaWV2ZSB0aGlzIGxpbWl0IHdpdGgKLQotICAgY2h1bmtfY2FjaGVfbWF4ID0gcG5nX2dldF9jaHVua19jYWNoZV9tYXgocG5nX3B0cik7Ci0KLVRoaXMgbGltaXQgYWxzbyBhcHBsaWVzIHRvIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQKLWJ5IHBuZ19kZWNvbXByZXNzX2NodW5rKCkgd2hpbGUgZGVjb21wcmVzc2luZyBpVFh0LCB6VFh0LCBhbmQgaUNDUCBjaHVua3MuCi0KLVlvdSBjYW4gYWxzbyBzZXQgYSBsaW1pdCBvbiB0aGUgYW1vdW50IG9mIG1lbW9yeSB0aGF0IGEgY29tcHJlc3NlZCBjaHVuawotb3RoZXIgdGhhbiBJREFUIGNhbiBvY2N1cHksIHdpdGgKLQotICAgcG5nX3NldF9jaHVua19tYWxsb2NfbWF4KHBuZ19wdHIsIHVzZXJfY2h1bmtfbWFsbG9jX21heCk7Ci0KLWFuZCB5b3UgY2FuIHJldHJpZXZlIHRoZSBsaW1pdCB3aXRoCi0KLSAgIGNodW5rX21hbGxvY19tYXggPSBwbmdfZ2V0X2NodW5rX21hbGxvY19tYXgocG5nX3B0cik7Ci0KLUFueSBjaHVua3MgdGhhdCB3b3VsZCBjYXVzZSBlaXRoZXIgb2YgdGhlc2UgbGltaXRzIHRvIGJlIGV4Y2VlZGVkIHdpbGwKLWJlIGlnbm9yZWQuCi0KLS5TUyBUaGUgaGlnaC1sZXZlbCByZWFkIGludGVyZmFjZQotCi1BdCB0aGlzIHBvaW50IHRoZXJlIGFyZSB0d28gd2F5cyB0byBwcm9jZWVkOyB0aHJvdWdoIHRoZSBoaWdoLWxldmVsCi1yZWFkIGludGVyZmFjZSwgb3IgdGhyb3VnaCBhIHNlcXVlbmNlIG9mIGxvdy1sZXZlbCByZWFkIG9wZXJhdGlvbnMuCi1Zb3UgY2FuIHVzZSB0aGUgaGlnaC1sZXZlbCBpbnRlcmZhY2UgaWYgKGEpIHlvdSBhcmUgd2lsbGluZyB0byByZWFkCi10aGUgZW50aXJlIGltYWdlIGludG8gbWVtb3J5LCBhbmQgKGIpIHRoZSBpbnB1dCB0cmFuc2Zvcm1hdGlvbnMKLXlvdSB3YW50IHRvIGRvIGFyZSBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgc2V0OgotCi0gICAgUE5HX1RSQU5TRk9STV9JREVOVElUWSAgICAgIE5vIHRyYW5zZm9ybWF0aW9uCi0gICAgUE5HX1RSQU5TRk9STV9TVFJJUF8xNiAgICAgIFN0cmlwIDE2LWJpdCBzYW1wbGVzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggYml0cwotICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfQUxQSEEgICBEaXNjYXJkIHRoZSBhbHBoYSBjaGFubmVsCi0gICAgUE5HX1RSQU5TRk9STV9QQUNLSU5HICAgICAgIEV4cGFuZCAxLCAyIGFuZCA0LWJpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzIHRvIGJ5dGVzCi0gICAgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCAgICAgIENoYW5nZSBvcmRlciBvZiBwYWNrZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzIHRvIExTQiBmaXJzdAotICAgIFBOR19UUkFOU0ZPUk1fRVhQQU5EICAgICAgICBQZXJmb3JtIHNldF9leHBhbmQoKQotICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX01PTk8gICBJbnZlcnQgbW9ub2Nocm9tZSBpbWFnZXMKLSAgICBQTkdfVFJBTlNGT1JNX1NISUZUICAgICAgICAgTm9ybWFsaXplIHBpeGVscyB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JJVCBkZXB0aAotICAgIFBOR19UUkFOU0ZPUk1fQkdSICAgICAgICAgICBGbGlwIFJHQiB0byBCR1IsIFJHQkEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQkdSQQotICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSAgICBGbGlwIFJHQkEgdG8gQVJHQiBvciBHQQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBBRwotICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBICBDaGFuZ2UgYWxwaGEgZnJvbSBvcGFjaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRyYW5zcGFyZW5jeQotICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4gICBCeXRlLXN3YXAgMTYtYml0IHNhbXBsZXMKLSAgICBQTkdfVFJBTlNGT1JNX0dSQVlfVE9fUkdCICAgRXhwYW5kIGdyYXlzY2FsZSBzYW1wbGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFJHQiAob3IgR0EgdG8gUkdCQSkKLQotKFRoaXMgZXhjbHVkZXMgc2V0dGluZyBhIGJhY2tncm91bmQgY29sb3IsIGRvaW5nIGdhbW1hIHRyYW5zZm9ybWF0aW9uLAotcXVhbnRpemluZywgYW5kIHNldHRpbmcgZmlsbGVyLikgIElmIHRoaXMgaXMgdGhlIGNhc2UsIHNpbXBseSBkbyB0aGlzOgotCi0gICAgcG5nX3JlYWRfcG5nKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfdHJhbnNmb3JtcywgTlVMTCkKLQotd2hlcmUgcG5nX3RyYW5zZm9ybXMgaXMgYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIHNvbWUKLXNldCBvZiB0cmFuc2Zvcm1hdGlvbiBmbGFncy4gIFRoaXMgY2FsbCBpcyBlcXVpdmFsZW50IHRvIHBuZ19yZWFkX2luZm8oKSwKLWZvbGxvd2VkIHRoZSBzZXQgb2YgdHJhbnNmb3JtYXRpb25zIGluZGljYXRlZCBieSB0aGUgdHJhbnNmb3JtIG1hc2ssCi10aGVuIHBuZ19yZWFkX2ltYWdlKCksIGFuZCBmaW5hbGx5IHBuZ19yZWFkX2VuZCgpLgotCi0oVGhlIGZpbmFsIHBhcmFtZXRlciBvZiB0aGlzIGNhbGwgaXMgbm90IHlldCB1c2VkLiAgU29tZWRheSBpdCBtaWdodCBwb2ludAotdG8gdHJhbnNmb3JtYXRpb24gcGFyYW1ldGVycyByZXF1aXJlZCBieSBzb21lIGZ1dHVyZSBpbnB1dCB0cmFuc2Zvcm0uKQotCi1Zb3UgbXVzdCB1c2UgcG5nX3RyYW5zZm9ybXMgYW5kIG5vdCBjYWxsIGFueSBwbmdfc2V0X3RyYW5zZm9ybSgpIGZ1bmN0aW9ucwotd2hlbiB5b3UgdXNlIHBuZ19yZWFkX3BuZygpLgotCi1BZnRlciB5b3UgaGF2ZSBjYWxsZWQgcG5nX3JlYWRfcG5nKCksIHlvdSBjYW4gcmV0cmlldmUgdGhlIGltYWdlIGRhdGEKLXdpdGgKLQotICAgcm93X3BvaW50ZXJzID0gcG5nX2dldF9yb3dzKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotd2hlcmUgcm93X3BvaW50ZXJzIGlzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHRoZSBwaXhlbCBkYXRhIGZvciBlYWNoIHJvdzoKLQotICAgcG5nX2J5dGVwIHJvd19wb2ludGVyc1toZWlnaHRdOwotCi1JZiB5b3Uga25vdyB5b3VyIGltYWdlIHNpemUgYW5kIHBpeGVsIHNpemUgYWhlYWQgb2YgdGltZSwgeW91IGNhbiBhbGxvY2F0ZQotcm93X3BvaW50ZXJzIHByaW9yIHRvIGNhbGxpbmcgcG5nX3JlYWRfcG5nKCkgd2l0aAotCi0gICBpZiAoaGVpZ2h0ID4gUE5HX1VJTlRfMzJfTUFYL3BuZ19zaXplb2YocG5nX2J5dGUpKQotICAgICAgcG5nX2Vycm9yIChwbmdfcHRyLAotICAgICAgICAgIkltYWdlIGlzIHRvbyB0YWxsIHRvIHByb2Nlc3MgaW4gbWVtb3J5Iik7Ci0gICBpZiAod2lkdGggPiBQTkdfVUlOVF8zMl9NQVgvcGl4ZWxfc2l6ZSkKLSAgICAgIHBuZ19lcnJvciAocG5nX3B0ciwKLSAgICAgICAgICJJbWFnZSBpcyB0b28gd2lkZSB0byBwcm9jZXNzIGluIG1lbW9yeSIpOwotICAgcm93X3BvaW50ZXJzID0gcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgaGVpZ2h0KnBuZ19zaXplb2YocG5nX2J5dGVwKSk7Ci0gICBmb3IgKGludCBpPTA7IGk8aGVpZ2h0LCBpKyspCi0gICAgICByb3dfcG9pbnRlcnNbaV09TlVMTDsgIC8qIHNlY3VyaXR5IHByZWNhdXRpb24gKi8KLSAgIGZvciAoaW50IGk9MDsgaTxoZWlnaHQsIGkrKykKLSAgICAgIHJvd19wb2ludGVyc1tpXT1wbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICB3aWR0aCpwaXhlbF9zaXplKTsKLSAgIHBuZ19zZXRfcm93cyhwbmdfcHRyLCBpbmZvX3B0ciwgJnJvd19wb2ludGVycyk7Ci0KLUFsdGVybmF0aXZlbHkgeW91IGNvdWxkIGFsbG9jYXRlIHlvdXIgaW1hZ2UgaW4gb25lIGJpZyBibG9jayBhbmQgZGVmaW5lCi1yb3dfcG9pbnRlcnNbaV0gdG8gcG9pbnQgaW50byB0aGUgcHJvcGVyIHBsYWNlcyBpbiB5b3VyIGJsb2NrLgotCi1JZiB5b3UgdXNlIHBuZ19zZXRfcm93cygpLCB0aGUgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcKLXJvd19wb2ludGVycyAoYW5kIHJvd19wb2ludGVyc1tpXSwgaWYgdGhleSB3ZXJlIHNlcGFyYXRlbHkgYWxsb2NhdGVkKS4KLQotSWYgeW91IGRvbid0IGFsbG9jYXRlIHJvd19wb2ludGVycyBhaGVhZCBvZiB0aW1lLCBwbmdfcmVhZF9wbmcoKSB3aWxsCi1kbyBpdCwgYW5kIGl0J2xsIGJlIGZyZWUnZWQgd2hlbiB5b3UgY2FsbCBwbmdfZGVzdHJveV8qKCkuCi0KLS5TUyBUaGUgbG93LWxldmVsIHJlYWQgaW50ZXJmYWNlCi0KLUlmIHlvdSBhcmUgZ29pbmcgdGhlIGxvdy1sZXZlbCByb3V0ZSwgeW91IGFyZSBub3cgcmVhZHkgdG8gcmVhZCBhbGwKLXRoZSBmaWxlIGluZm9ybWF0aW9uIHVwIHRvIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YS4gIFlvdSBkbyB0aGlzIHdpdGggYQotY2FsbCB0byBwbmdfcmVhZF9pbmZvKCkuCi0KLSAgICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotVGhpcyB3aWxsIHByb2Nlc3MgYWxsIGNodW5rcyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgaW1hZ2UgZGF0YS4KLQotLlNTIFF1ZXJ5aW5nIHRoZSBpbmZvIHN0cnVjdHVyZQotCi1GdW5jdGlvbnMgYXJlIHVzZWQgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbmZvX3B0ciBvbmNlIGl0Ci1oYXMgYmVlbiByZWFkLiAgTm90ZSB0aGF0IHRoZXNlIGZpZWxkcyBtYXkgbm90IGJlIGNvbXBsZXRlbHkgZmlsbGVkCi1pbiB1bnRpbCBwbmdfcmVhZF9lbmQoKSBoYXMgcmVhZCB0aGUgY2h1bmsgZGF0YSBmb2xsb3dpbmcgdGhlIGltYWdlLgotCi0gICAgcG5nX2dldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCAmd2lkdGgsICZoZWlnaHQsCi0gICAgICAgJmJpdF9kZXB0aCwgJmNvbG9yX3R5cGUsICZpbnRlcmxhY2VfdHlwZSwKLSAgICAgICAmY29tcHJlc3Npb25fdHlwZSwgJmZpbHRlcl9tZXRob2QpOwotCi0gICAgd2lkdGggICAgICAgICAgLSBob2xkcyB0aGUgd2lkdGggb2YgdGhlIGltYWdlCi0gICAgICAgICAgICAgICAgICAgICBpbiBwaXhlbHMgKHVwIHRvIDJeMzEpLgotICAgIGhlaWdodCAgICAgICAgIC0gaG9sZHMgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgIGluIHBpeGVscyAodXAgdG8gMl4zMSkuCi0gICAgYml0X2RlcHRoICAgICAgLSBob2xkcyB0aGUgYml0IGRlcHRoIG9mIG9uZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGltYWdlIGNoYW5uZWxzLiAgKHZhbGlkIHZhbHVlcyBhcmUKLSAgICAgICAgICAgICAgICAgICAgIDEsIDIsIDQsIDgsIDE2IGFuZCBkZXBlbmQgYWxzbyBvbgotICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbG9yX3R5cGUuICBTZWUgYWxzbwotICAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnQgYml0cyAoc0JJVCkgYmVsb3cpLgotICAgIGNvbG9yX3R5cGUgICAgIC0gZGVzY3JpYmVzIHdoaWNoIGNvbG9yL2FscGhhIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHByZXNlbnQuCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9HUkFZCi0gICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyAxLCAyLCA0LCA4LCAxNikKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDgsIDE2KQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUEFMRVRURQotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgMSwgMiwgNCwgOCkKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQgotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF9kZXB0aHMgOCwgMTYpCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfZGVwdGhzIDgsIDE2KQotCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19QQUxFVFRFCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19DT0xPUgotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfQUxQSEEKLQotICAgIGludGVybGFjZV90eXBlIC0gKFBOR19JTlRFUkxBQ0VfTk9ORSBvcgotICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9BREFNNykKLQotICAgIGNvbXByZXNzaW9uX3R5cGUgLSAobXVzdCBiZSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFCi0gICAgICAgICAgICAgICAgICAgICBmb3IgUE5HIDEuMCkKLQotICAgIGZpbHRlcl9tZXRob2QgIC0gKG11c3QgYmUgUE5HX0ZJTFRFUl9UWVBFX0JBU0UKLSAgICAgICAgICAgICAgICAgICAgIGZvciBQTkcgMS4wLCBhbmQgY2FuIGFsc28gYmUKLSAgICAgICAgICAgICAgICAgICAgIFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORyBpZgotICAgICAgICAgICAgICAgICAgICAgdGhlIFBORyBkYXRhc3RyZWFtIGlzIGVtYmVkZGVkIGluCi0gICAgICAgICAgICAgICAgICAgICBhIE1ORy0xLjAgZGF0YXN0cmVhbSkKLQotICAgIEFueSBvciBhbGwgb2YgaW50ZXJsYWNlX3R5cGUsIGNvbXByZXNzaW9uX3R5cGUsIG9yCi0gICAgZmlsdGVyX21ldGhvZCBjYW4gYmUgTlVMTCBpZiB5b3UgYXJlCi0gICAgbm90IGludGVyZXN0ZWQgaW4gdGhlaXIgdmFsdWVzLgotCi0gICAgTm90ZSB0aGF0IHBuZ19nZXRfSUhEUigpIHJldHVybnMgMzItYml0IGRhdGEgaW50bwotICAgIHRoZSBhcHBsaWNhdGlvbidzIHdpZHRoIGFuZCBoZWlnaHQgdmFyaWFibGVzLgotICAgIFRoaXMgaXMgYW4gdW5zYWZlIHNpdHVhdGlvbiBpZiB0aGVzZSBhcmUgMTYtYml0Ci0gICAgdmFyaWFibGVzLiAgSW4gc3VjaCBzaXR1YXRpb25zLCB0aGUKLSAgICBwbmdfZ2V0X2ltYWdlX3dpZHRoKCkgYW5kIHBuZ19nZXRfaW1hZ2VfaGVpZ2h0KCkKLSAgICBmdW5jdGlvbnMgZGVzY3JpYmVkIGJlbG93IGFyZSBzYWZlci4KLQotICAgIHdpZHRoICAgICAgICAgICAgPSBwbmdfZ2V0X2ltYWdlX3dpZHRoKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOwotICAgIGhlaWdodCAgICAgICAgICAgPSBwbmdfZ2V0X2ltYWdlX2hlaWdodChwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyKTsKLSAgICBiaXRfZGVwdGggICAgICAgID0gcG5nX2dldF9iaXRfZGVwdGgocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7Ci0gICAgY29sb3JfdHlwZSAgICAgICA9IHBuZ19nZXRfY29sb3JfdHlwZShwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyKTsKLSAgICBpbnRlcmxhY2VfdHlwZSAgID0gcG5nX2dldF9pbnRlcmxhY2VfdHlwZShwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyKTsKLSAgICBjb21wcmVzc2lvbl90eXBlID0gcG5nX2dldF9jb21wcmVzc2lvbl90eXBlKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOwotICAgIGZpbHRlcl9tZXRob2QgICAgPSBwbmdfZ2V0X2ZpbHRlcl90eXBlKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOwotCi0gICAgY2hhbm5lbHMgPSBwbmdfZ2V0X2NoYW5uZWxzKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICBjaGFubmVscyAgICAgICAtIG51bWJlciBvZiBjaGFubmVscyBvZiBpbmZvIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGNvbG9yIHR5cGUgKHZhbGlkIHZhbHVlcyBhcmUgMSAoR1JBWSwKLSAgICAgICAgICAgICAgICAgICAgIFBBTEVUVEUpLCAyIChHUkFZX0FMUEhBKSwgMyAoUkdCKSwKLSAgICAgICAgICAgICAgICAgICAgIDQgKFJHQl9BTFBIQSBvciBSR0IgKyBmaWxsZXIgYnl0ZSkpCi0gICAgcm93Ynl0ZXMgPSBwbmdfZ2V0X3Jvd2J5dGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICByb3dieXRlcyAgICAgICAtIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gaG9sZCBhIHJvdwotCi0gICAgc2lnbmF0dXJlID0gcG5nX2dldF9zaWduYXR1cmUocG5nX3B0ciwgaW5mb19wdHIpOwotICAgIHNpZ25hdHVyZSAgICAgIC0gaG9sZHMgdGhlIHNpZ25hdHVyZSByZWFkIGZyb20gdGhlCi0gICAgICAgICAgICAgICAgICAgICBmaWxlIChpZiBhbnkpLiAgVGhlIGRhdGEgaXMga2VwdCBpbgotICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgb2Zmc2V0IGl0IHdvdWxkIGJlIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgd2hvbGUgc2lnbmF0dXJlIHdlcmUgcmVhZCAoaS5lLiBpZiBhbgotICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gaGFkIGFscmVhZHkgcmVhZCBpbiA0Ci0gICAgICAgICAgICAgICAgICAgICBieXRlcyBvZiBzaWduYXR1cmUgYmVmb3JlIHN0YXJ0aW5nCi0gICAgICAgICAgICAgICAgICAgICBsaWJwbmcsIHRoZSByZW1haW5pbmcgNCBieXRlcyB3b3VsZAotICAgICAgICAgICAgICAgICAgICAgYmUgaW4gc2lnbmF0dXJlWzRdIHRocm91Z2ggc2lnbmF0dXJlWzddCi0gICAgICAgICAgICAgICAgICAgICAoc2VlIHBuZ19zZXRfc2lnX2J5dGVzKCkpKS4KLQotVGhlc2UgYXJlIGFsc28gaW1wb3J0YW50LCBidXQgdGhlaXIgdmFsaWRpdHkgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBjaHVuawotaGFzIGJlZW4gcmVhZC4gIFRoZSBwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT188Y2h1bms+KSBhbmQKLXBuZ19nZXRfPGNodW5rPihwbmdfcHRyLCBpbmZvX3B0ciwgLi4uKSBmdW5jdGlvbnMgcmV0dXJuIG5vbi16ZXJvIGlmIHRoZQotZGF0YSBoYXMgYmVlbiByZWFkLCBvciB6ZXJvIGlmIGl0IGlzIG1pc3NpbmcuICBUaGUgcGFyYW1ldGVycyB0byB0aGUKLXBuZ19nZXRfPGNodW5rPiBhcmUgc2V0IGRpcmVjdGx5IGlmIHRoZXkgYXJlIHNpbXBsZSBkYXRhIHR5cGVzLCBvciBhCi1wb2ludGVyIGludG8gdGhlIGluZm9fcHRyIGlzIHJldHVybmVkIGZvciBhbnkgY29tcGxleCB0eXBlcy4KLQotICAgIHBuZ19nZXRfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgJnBhbGV0dGUsCi0gICAgICAgICAgICAgICAgICAgICAmbnVtX3BhbGV0dGUpOwotICAgIHBhbGV0dGUgICAgICAgIC0gdGhlIHBhbGV0dGUgZm9yIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAoYXJyYXkgb2YgcG5nX2NvbG9yKQotICAgIG51bV9wYWxldHRlICAgIC0gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHBhbGV0dGUKLQotICAgIHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmdhbW1hKTsKLSAgICBnYW1tYSAgICAgICAgICAtIHRoZSBnYW1tYSB0aGUgZmlsZSBpcyB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICBhdCAoUE5HX0lORk9fZ0FNQSkKLQotICAgIHBuZ19nZXRfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgJnNyZ2JfaW50ZW50KTsKLSAgICBzcmdiX2ludGVudCAgICAtIHRoZSByZW5kZXJpbmcgaW50ZW50IChQTkdfSU5GT19zUkdCKQotICAgICAgICAgICAgICAgICAgICAgVGhlIHByZXNlbmNlIG9mIHRoZSBzUkdCIGNodW5rCi0gICAgICAgICAgICAgICAgICAgICBtZWFucyB0aGF0IHRoZSBwaXhlbCBkYXRhIGlzIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgc1JHQiBjb2xvciBzcGFjZS4gIFRoaXMgY2h1bmsgYWxzbwotICAgICAgICAgICAgICAgICAgICAgaW1wbGllcyBzcGVjaWZpYyB2YWx1ZXMgb2YgZ0FNQSBhbmQKLSAgICAgICAgICAgICAgICAgICAgIGNIUk0uCi0KLSAgICBwbmdfZ2V0X2lDQ1AocG5nX3B0ciwgaW5mb19wdHIsICZuYW1lLAotICAgICAgICZjb21wcmVzc2lvbl90eXBlLCAmcHJvZmlsZSwgJnByb2ZsZW4pOwotICAgIG5hbWUgICAgICAgICAgICAgLSBUaGUgcHJvZmlsZSBuYW1lLgotICAgIGNvbXByZXNzaW9uX3R5cGUgLSBUaGUgY29tcHJlc3Npb24gdHlwZTsgYWx3YXlzCi0gICAgICAgICAgICAgICAgICAgICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UgZm9yIFBORyAxLjAuCi0gICAgICAgICAgICAgICAgICAgICAgIFlvdSBtYXkgZ2l2ZSBOVUxMIHRvIHRoaXMgYXJndW1lbnQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlIGl0LgotICAgIHByb2ZpbGUgICAgICAgICAgLSBJbnRlcm5hdGlvbmFsIENvbG9yIENvbnNvcnRpdW0gY29sb3IKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSBkYXRhLiBNYXkgY29udGFpbiBOVUxzLgotICAgIHByb2ZsZW4gICAgICAgICAgLSBsZW5ndGggb2YgcHJvZmlsZSBkYXRhIGluIGJ5dGVzLgotCi0gICAgcG5nX2dldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmc2lnX2JpdCk7Ci0gICAgc2lnX2JpdCAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMgZm9yCi0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fc0JJVCkgZWFjaCBvZiB0aGUgZ3JheSwKLSAgICAgICAgICAgICAgICAgICAgIHJlZCwgZ3JlZW4sIGFuZCBibHVlIGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgd2hpY2hldmVyIGFyZSBhcHByb3ByaWF0ZSBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICBnaXZlbiBjb2xvciB0eXBlIChwbmdfY29sb3JfMTYpCi0KLSAgICBwbmdfZ2V0X3RSTlMocG5nX3B0ciwgaW5mb19wdHIsICZ0cmFuc19hbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICZudW1fdHJhbnMsICZ0cmFuc19jb2xvcik7Ci0gICAgdHJhbnNfYWxwaGEgICAgLSBhcnJheSBvZiBhbHBoYSAodHJhbnNwYXJlbmN5KQotICAgICAgICAgICAgICAgICAgICAgZW50cmllcyBmb3IgcGFsZXR0ZSAoUE5HX0lORk9fdFJOUykKLSAgICBudW1fdHJhbnMgICAgICAtIG51bWJlciBvZiB0cmFuc3BhcmVudCBlbnRyaWVzCi0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fdFJOUykKLSAgICB0cmFuc19jb2xvciAgICAtIGdyYXlsZXZlbCBvciBjb2xvciBzYW1wbGUgdmFsdWVzIG9mCi0gICAgICAgICAgICAgICAgICAgICB0aGUgc2luZ2xlIHRyYW5zcGFyZW50IGNvbG9yIGZvcgotICAgICAgICAgICAgICAgICAgICAgbm9uLXBhbGV0dGVkIGltYWdlcyAoUE5HX0lORk9fdFJOUykKLQotICAgIHBuZ19nZXRfaElTVChwbmdfcHRyLCBpbmZvX3B0ciwgJmhpc3QpOwotICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX2hJU1QpCi0gICAgaGlzdCAgICAgICAgICAgLSBoaXN0b2dyYW0gb2YgcGFsZXR0ZSAoYXJyYXkgb2YKLSAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2KQotCi0gICAgcG5nX2dldF90SU1FKHBuZ19wdHIsIGluZm9fcHRyLCAmbW9kX3RpbWUpOwotICAgIG1vZF90aW1lICAgICAgIC0gdGltZSBpbWFnZSB3YXMgbGFzdCBtb2RpZmllZAotICAgICAgICAgICAgICAgICAgICAoUE5HX1ZBTElEX3RJTUUpCi0KLSAgICBwbmdfZ2V0X2JLR0QocG5nX3B0ciwgaW5mb19wdHIsICZiYWNrZ3JvdW5kKTsKLSAgICBiYWNrZ3JvdW5kICAgICAtIGJhY2tncm91bmQgY29sb3IgKG9mIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19jb2xvcl8xNnApIChQTkdfVkFMSURfYktHRCkKLSAgICAgICAgICAgICAgICAgICAgIHZhbGlkIDE2LWJpdCByZWQsIGdyZWVuIGFuZCBibHVlCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIHJlZ2FyZGxlc3Mgb2YgY29sb3JfdHlwZQotCi0gICAgbnVtX2NvbW1lbnRzICAgPSBwbmdfZ2V0X3RleHQocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAmdGV4dF9wdHIsICZudW1fdGV4dCk7Ci0gICAgbnVtX2NvbW1lbnRzICAgLSBudW1iZXIgb2YgY29tbWVudHMKLSAgICB0ZXh0X3B0ciAgICAgICAtIGFycmF5IG9mIHBuZ190ZXh0IGhvbGRpbmcgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzCi0gICAgdGV4dF9wdHJbaV0uY29tcHJlc3Npb24gLSB0eXBlIG9mIGNvbXByZXNzaW9uIHVzZWQKLSAgICAgICAgICAgICAgICAgb24gInRleHQiIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX05PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX3pUWHQKLSAgICB0ZXh0X3B0cltpXS5rZXkgICAtIGtleXdvcmQgZm9yIGNvbW1lbnQuICBNdXN0IGNvbnRhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAxLTc5IGNoYXJhY3RlcnMuCi0gICAgdGV4dF9wdHJbaV0udGV4dCAgLSB0ZXh0IGNvbW1lbnRzIGZvciBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZC4gIENhbiBiZSBlbXB0eS4KLSAgICB0ZXh0X3B0cltpXS50ZXh0X2xlbmd0aCAtIGxlbmd0aCBvZiB0ZXh0IHN0cmluZywKLSAgICAgICAgICAgICAgICAgYWZ0ZXIgZGVjb21wcmVzc2lvbiwgMCBmb3IgaVRYdAotICAgIHRleHRfcHRyW2ldLml0eHRfbGVuZ3RoIC0gbGVuZ3RoIG9mIGl0eHQgc3RyaW5nLAotICAgICAgICAgICAgICAgICBhZnRlciBkZWNvbXByZXNzaW9uLCAwIGZvciB0RVh0L3pUWHQKLSAgICB0ZXh0X3B0cltpXS5sYW5nICAtIGxhbmd1YWdlIG9mIGNvbW1lbnQgKGVtcHR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZvciB1bmtub3duKS4KLSAgICB0ZXh0X3B0cltpXS5sYW5nX2tleSAgLSBrZXl3b3JkIGluIFVURi04Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKGVtcHR5IHN0cmluZyBmb3IgdW5rbm93bikuCi0gICAgTm90ZSB0aGF0IHRoZSBpdHh0X2xlbmd0aCwgbGFuZywgYW5kIGxhbmdfa2V5Ci0gICAgbWVtYmVycyBvZiB0aGUgdGV4dF9wdHIgc3RydWN0dXJlIG9ubHkgZXhpc3QKLSAgICB3aGVuIHRoZSBsaWJyYXJ5IGlzIGJ1aWx0IHdpdGggaVRYdCBjaHVuayBzdXBwb3J0LgotCi0gICAgbnVtX3RleHQgICAgICAgLSBudW1iZXIgb2YgY29tbWVudHMgKHNhbWUgYXMKLSAgICAgICAgICAgICAgICAgICAgIG51bV9jb21tZW50czsgeW91IGNhbiBwdXQgTlVMTCBoZXJlCi0gICAgICAgICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgZHVwbGljYXRpb24pCi0gICAgTm90ZSB3aGlsZSBwbmdfc2V0X3RleHQoKSB3aWxsIGFjY2VwdCB0ZXh0LCBsYW5ndWFnZSwKLSAgICBhbmQgdHJhbnNsYXRlZCBrZXl3b3JkcyB0aGF0IGNhbiBiZSBOVUxMIHBvaW50ZXJzLCB0aGUKLSAgICBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgcG5nX2dldF90ZXh0IHdpbGwgYWx3YXlzIGNvbnRhaW4KLSAgICByZWd1bGFyIHplcm8tdGVybWluYXRlZCBDIHN0cmluZ3MuICBUaGV5IG1pZ2h0IGJlCi0gICAgZW1wdHkgc3RyaW5ncyBidXQgdGhleSB3aWxsIG5ldmVyIGJlIE5VTEwgcG9pbnRlcnMuCi0KLSAgICBudW1fc3BhbGV0dGVzID0gcG5nX2dldF9zUExUKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgICZwYWxldHRlX3B0cik7Ci0gICAgcGFsZXR0ZV9wdHIgICAgLSBhcnJheSBvZiBwYWxldHRlIHN0cnVjdHVyZXMgaG9sZGluZwotICAgICAgICAgICAgICAgICAgICAgY29udGVudHMgb2Ygb25lIG9yIG1vcmUgc1BMVCBjaHVua3MKLSAgICAgICAgICAgICAgICAgICAgIHJlYWQuCi0gICAgbnVtX3NwYWxldHRlcyAgLSBudW1iZXIgb2Ygc1BMVCBjaHVua3MgcmVhZC4KLQotICAgIHBuZ19nZXRfb0ZGcyhwbmdfcHRyLCBpbmZvX3B0ciwgJm9mZnNldF94LCAmb2Zmc2V0X3ksCi0gICAgICAgJnVuaXRfdHlwZSk7Ci0gICAgb2Zmc2V0X3ggICAgICAgLSBwb3NpdGl2ZSBvZmZzZXQgZnJvbSB0aGUgbGVmdCBlZGdlCi0gICAgICAgICAgICAgICAgICAgICBvZiB0aGUgc2NyZWVuCi0gICAgb2Zmc2V0X3kgICAgICAgLSBwb3NpdGl2ZSBvZmZzZXQgZnJvbSB0aGUgdG9wIGVkZ2UKLSAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzY3JlZW4KLSAgICB1bml0X3R5cGUgICAgICAtIFBOR19PRkZTRVRfUElYRUwsIFBOR19PRkZTRVRfTUlDUk9NRVRFUgotCi0gICAgcG5nX2dldF9wSFlzKHBuZ19wdHIsIGluZm9fcHRyLCAmcmVzX3gsICZyZXNfeSwKLSAgICAgICAmdW5pdF90eXBlKTsKLSAgICByZXNfeCAgICAgICAgICAtIHBpeGVscy91bml0IHBoeXNpY2FsIHJlc29sdXRpb24gaW4KLSAgICAgICAgICAgICAgICAgICAgIHggZGlyZWN0aW9uCi0gICAgcmVzX3kgICAgICAgICAgLSBwaXhlbHMvdW5pdCBwaHlzaWNhbCByZXNvbHV0aW9uIGluCi0gICAgICAgICAgICAgICAgICAgICB4IGRpcmVjdGlvbgotICAgIHVuaXRfdHlwZSAgICAgIC0gUE5HX1JFU09MVVRJT05fVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgIFBOR19SRVNPTFVUSU9OX01FVEVSCi0KLSAgICBwbmdfZ2V0X3NDQUwocG5nX3B0ciwgaW5mb19wdHIsICZ1bml0LCAmd2lkdGgsCi0gICAgICAgJmhlaWdodCkKLSAgICB1bml0ICAgICAgICAtIHBoeXNpY2FsIHNjYWxlIHVuaXRzIChhbiBpbnRlZ2VyKQotICAgIHdpZHRoICAgICAgIC0gd2lkdGggb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cwotICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLSAgICAgICAgICAgICAgICAgKHdpZHRoIGFuZCBoZWlnaHQgYXJlIGRvdWJsZXMpCi0KLSAgICBwbmdfZ2V0X3NDQUxfcyhwbmdfcHRyLCBpbmZvX3B0ciwgJnVuaXQsICZ3aWR0aCwKLSAgICAgICAmaGVpZ2h0KQotICAgIHVuaXQgICAgICAgIC0gcGh5c2ljYWwgc2NhbGUgdW5pdHMgKGFuIGludGVnZXIpCi0gICAgd2lkdGggICAgICAgLSB3aWR0aCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCi0gICAgaGVpZ2h0ICAgICAgLSBoZWlnaHQgb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cwotICAgICAgICAgICAgICAgICAod2lkdGggYW5kIGhlaWdodCBhcmUgc3RyaW5ncyBsaWtlICIyLjU0IikKLQotICAgIG51bV91bmtub3duX2NodW5rcyA9IHBuZ19nZXRfdW5rbm93bl9jaHVua3MocG5nX3B0ciwKLSAgICAgICBpbmZvX3B0ciwgJnVua25vd25zKQotICAgIHVua25vd25zICAgICAgICAgIC0gYXJyYXkgb2YgcG5nX3Vua25vd25fY2h1bmsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZXMgaG9sZGluZyB1bmtub3duIGNodW5rcwotICAgIHVua25vd25zW2ldLm5hbWUgIC0gbmFtZSBvZiB1bmtub3duIGNodW5rCi0gICAgdW5rbm93bnNbaV0uZGF0YSAgLSBkYXRhIG9mIHVua25vd24gY2h1bmsKLSAgICB1bmtub3duc1tpXS5zaXplICAtIHNpemUgb2YgdW5rbm93biBjaHVuaydzIGRhdGEKLSAgICB1bmtub3duc1tpXS5sb2NhdGlvbiAtIHBvc2l0aW9uIG9mIGNodW5rIGluIGZpbGUKLQotICAgIFRoZSB2YWx1ZSBvZiAiaSIgY29ycmVzcG9uZHMgdG8gdGhlIG9yZGVyIGluIHdoaWNoIHRoZQotICAgIGNodW5rcyB3ZXJlIHJlYWQgZnJvbSB0aGUgUE5HIGZpbGUgb3IgaW5zZXJ0ZWQgd2l0aCB0aGUKLSAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKCkgZnVuY3Rpb24uCi0KLVRoZSBkYXRhIGZyb20gdGhlIHBIWXMgY2h1bmsgY2FuIGJlIHJldHJpZXZlZCBpbiBzZXZlcmFsIGNvbnZlbmllbnQKLWZvcm1zOgotCi0gICAgcmVzX3ggPSBwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLAotICAgICAgIGluZm9fcHRyKQotICAgIHJlc195ID0gcG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwKLSAgICAgICBpbmZvX3B0cikKLSAgICByZXNfeF9hbmRfeSA9IHBuZ19nZXRfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLAotICAgICAgIGluZm9fcHRyKQotICAgIHJlc194ID0gcG5nX2dldF94X3BpeGVsc19wZXJfaW5jaChwbmdfcHRyLAotICAgICAgIGluZm9fcHRyKQotICAgIHJlc195ID0gcG5nX2dldF95X3BpeGVsc19wZXJfaW5jaChwbmdfcHRyLAotICAgICAgIGluZm9fcHRyKQotICAgIHJlc194X2FuZF95ID0gcG5nX2dldF9waXhlbHNfcGVyX2luY2gocG5nX3B0ciwKLSAgICAgICBpbmZvX3B0cikKLSAgICBhc3BlY3RfcmF0aW8gPSBwbmdfZ2V0X3BpeGVsX2FzcGVjdF9yYXRpbyhwbmdfcHRyLAotICAgICAgIGluZm9fcHRyKQotCi0gICAoRWFjaCBvZiB0aGVzZSByZXR1cm5zIDAgW3NpZ25pZnlpbmcgInVua25vd24iXSBpZgotICAgICAgIHRoZSBkYXRhIGlzIG5vdCBwcmVzZW50IG9yIGlmIHJlc194IGlzIDA7Ci0gICAgICAgcmVzX3hfYW5kX3kgaXMgMCBpZiByZXNfeCAhPSByZXNfeSkKLQotVGhlIGRhdGEgZnJvbSB0aGUgb0ZGcyBjaHVuayBjYW4gYmUgcmV0cmlldmVkIGluIHNldmVyYWwgY29udmVuaWVudAotZm9ybXM6Ci0KLSAgICB4X29mZnNldCA9IHBuZ19nZXRfeF9vZmZzZXRfbWljcm9ucyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICAgeV9vZmZzZXQgPSBwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMocG5nX3B0ciwgaW5mb19wdHIpOwotICAgIHhfb2Zmc2V0ID0gcG5nX2dldF94X29mZnNldF9pbmNoZXMocG5nX3B0ciwgaW5mb19wdHIpOwotICAgIHlfb2Zmc2V0ID0gcG5nX2dldF95X29mZnNldF9pbmNoZXMocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICAoRWFjaCBvZiB0aGVzZSByZXR1cm5zIDAgW3NpZ25pZnlpbmcgInVua25vd24iIGlmIGJvdGgKLSAgICAgICB4IGFuZCB5IGFyZSAwXSBpZiB0aGUgZGF0YSBpcyBub3QgcHJlc2VudCBvciBpZiB0aGUKLSAgICAgICBjaHVuayBpcyBwcmVzZW50IGJ1dCB0aGUgdW5pdCBpcyB0aGUgcGl4ZWwpCi0KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIHBuZ19pbmZvIGRlZmluaXRpb24gaW4gcG5nLmggYW5kIHRoZQotUE5HIHNwZWNpZmljYXRpb24gZm9yIGNodW5rIGNvbnRlbnRzLiAgQmUgY2FyZWZ1bCB3aXRoIHRydXN0aW5nCi1yb3dieXRlcywgYXMgc29tZSBvZiB0aGUgdHJhbnNmb3JtYXRpb25zIGNvdWxkIGluY3JlYXNlIHRoZSBzcGFjZQotbmVlZGVkIHRvIGhvbGQgYSByb3cgKGV4cGFuZCwgZmlsbGVyLCBncmF5X3RvX3JnYiwgZXRjLikuCi1TZWUgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSwgYmVsb3cuCi0KLUEgcXVpY2sgd29yZCBhYm91dCB0ZXh0X3B0ciBhbmQgbnVtX3RleHQuICBQTkcgc3RvcmVzIGNvbW1lbnRzIGluCi1rZXl3b3JkL3RleHQgcGFpcnMsIG9uZSBwYWlyIHBlciBjaHVuaywgd2l0aCBubyBsaW1pdCBvbiB0aGUgbnVtYmVyCi1vZiB0ZXh0IGNodW5rcywgYW5kIGEgMl4zMSBieXRlIGxpbWl0IG9uIHRoZWlyIHNpemUuICBXaGlsZSB0aGVyZSBhcmUKLXN1Z2dlc3RlZCBrZXl3b3JkcywgdGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgdG8gcmVzdHJpY3QgdGhlIHVzZSB0byB0aGVzZQotc3RyaW5ncy4gIEl0IGlzIHN0cm9uZ2x5IHN1Z2dlc3RlZCB0aGF0IGtleXdvcmRzIGFuZCB0ZXh0IGJlIHNlbnNpYmxlCi10byBodW1hbnMgKHRoYXQncyB0aGUgcG9pbnQpLCBzbyBkb24ndCB1c2UgYWJicmV2aWF0aW9ucy4gIE5vbi1wcmludGluZwotc3ltYm9scyBhcmUgbm90IGFsbG93ZWQuICBTZWUgdGhlIFBORyBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCi1UaGVyZSBpcyBhbHNvIG5vIHJlcXVpcmVtZW50IHRvIGhhdmUgdGV4dCBhZnRlciB0aGUga2V5d29yZC4KLQotS2V5d29yZHMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gNzkgTGF0aW4tMSBjaGFyYWN0ZXJzIHdpdGhvdXQgbGVhZGluZyBvcgotdHJhaWxpbmcgc3BhY2VzLCBidXQgbm9uLWNvbnNlY3V0aXZlIHNwYWNlcyBhcmUgYWxsb3dlZCB3aXRoaW4gdGhlCi1rZXl3b3JkLiAgSXQgaXMgcG9zc2libGUgdG8gaGF2ZSB0aGUgc2FtZSBrZXl3b3JkIGFueSBudW1iZXIgb2YgdGltZXMuCi1UaGUgdGV4dF9wdHIgaXMgYW4gYXJyYXkgb2YgcG5nX3RleHQgc3RydWN0dXJlcywgZWFjaCBob2xkaW5nIGEKLXBvaW50ZXIgdG8gYSBsYW5ndWFnZSBzdHJpbmcsIGEgcG9pbnRlciB0byBhIGtleXdvcmQgYW5kIGEgcG9pbnRlciB0bwotYSB0ZXh0IHN0cmluZy4gIFRoZSB0ZXh0IHN0cmluZywgbGFuZ3VhZ2UgY29kZSwgYW5kIHRyYW5zbGF0ZWQKLWtleXdvcmQgbWF5IGJlIGVtcHR5IG9yIE5VTEwgcG9pbnRlcnMuICBUaGUga2V5d29yZC90ZXh0Ci1wYWlycyBhcmUgcHV0IGludG8gdGhlIGFycmF5IGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlIHJlY2VpdmVkLgotSG93ZXZlciwgc29tZSBvciBhbGwgb2YgdGhlIHRleHQgY2h1bmtzIG1heSBiZSBhZnRlciB0aGUgaW1hZ2UsIHNvLCB0bwotbWFrZSBzdXJlIHlvdSBoYXZlIHJlYWQgYWxsIHRoZSB0ZXh0IGNodW5rcywgZG9uJ3QgbWVzcyB3aXRoIHRoZXNlCi11bnRpbCBhZnRlciB5b3UgcmVhZCB0aGUgc3R1ZmYgYWZ0ZXIgdGhlIGltYWdlLiAgVGhpcyB3aWxsIGJlCi1tZW50aW9uZWQgYWdhaW4gYmVsb3cgaW4gdGhlIGRpc2N1c3Npb24gdGhhdCBnb2VzIHdpdGggcG5nX3JlYWRfZW5kKCkuCi0KLS5TUyBJbnB1dCB0cmFuc2Zvcm1hdGlvbnMKLQotQWZ0ZXIgeW91J3ZlIHJlYWQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiwgeW91IGNhbiBzZXQgdXAgdGhlIGxpYnJhcnkKLXRvIGhhbmRsZSBhbnkgc3BlY2lhbCB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlIGltYWdlIGRhdGEuICBUaGUgdmFyaW91cwotd2F5cyB0byB0cmFuc2Zvcm0gdGhlIGRhdGEgd2lsbCBiZSBkZXNjcmliZWQgaW4gdGhlIG9yZGVyIHRoYXQgdGhleQotc2hvdWxkIG9jY3VyLiAgVGhpcyBpcyBpbXBvcnRhbnQsIGFzIHNvbWUgb2YgdGhlc2UgY2hhbmdlIHRoZSBjb2xvcgotdHlwZSBhbmQvb3IgYml0IGRlcHRoIG9mIHRoZSBkYXRhLCBhbmQgc29tZSBvdGhlcnMgb25seSB3b3JrIG9uCi1jZXJ0YWluIGNvbG9yIHR5cGVzIGFuZCBiaXQgZGVwdGhzLiAgRXZlbiB0aG91Z2ggZWFjaCB0cmFuc2Zvcm1hdGlvbgotY2hlY2tzIHRvIHNlZSBpZiBpdCBoYXMgZGF0YSB0aGF0IGl0IGNhbiBkbyBzb21ldGhpbmcgd2l0aCwgeW91IHNob3VsZAotbWFrZSBzdXJlIHRvIG9ubHkgZW5hYmxlIGEgdHJhbnNmb3JtYXRpb24gaWYgaXQgd2lsbCBiZSB2YWxpZCBmb3IgdGhlCi1kYXRhLiAgRm9yIGV4YW1wbGUsIGRvbid0IHN3YXAgcmVkIGFuZCBibHVlIG9uIGdyYXlzY2FsZSBkYXRhLgotCi1UaGUgY29sb3JzIHVzZWQgZm9yIHRoZSBiYWNrZ3JvdW5kIGFuZCB0cmFuc3BhcmVuY3kgdmFsdWVzIHNob3VsZCBiZQotc3VwcGxpZWQgaW4gdGhlIHNhbWUgZm9ybWF0L2RlcHRoIGFzIHRoZSBjdXJyZW50IGltYWdlIGRhdGEuICBUaGV5Ci1hcmUgc3RvcmVkIGluIHRoZSBzYW1lIGZvcm1hdC9kZXB0aCBhcyB0aGUgaW1hZ2UgZGF0YSBpbiBhIGJLR0Qgb3IgdFJOUwotY2h1bmssIHNvIHRoaXMgaXMgd2hhdCBsaWJwbmcgZXhwZWN0cyBmb3IgdGhpcyBkYXRhLiAgVGhlIGNvbG9ycyBhcmUKLXRyYW5zZm9ybWVkIHRvIGtlZXAgaW4gc3luYyB3aXRoIHRoZSBpbWFnZSBkYXRhIHdoZW4gYW4gYXBwbGljYXRpb24KLWNhbGxzIHRoZSBwbmdfcmVhZF91cGRhdGVfaW5mbygpIHJvdXRpbmUgKHNlZSBiZWxvdykuCi0KLURhdGEgd2lsbCBiZSBkZWNvZGVkIGludG8gdGhlIHN1cHBsaWVkIHJvdyBidWZmZXJzIHBhY2tlZCBpbnRvIGJ5dGVzCi11bmxlc3MgdGhlIGxpYnJhcnkgaGFzIGJlZW4gdG9sZCB0byB0cmFuc2Zvcm0gaXQgaW50byBhbm90aGVyIGZvcm1hdC4KLUZvciBleGFtcGxlLCA0IGJpdC9waXhlbCBwYWxldHRlZCBvciBncmF5c2NhbGUgZGF0YSB3aWxsIGJlIHJldHVybmVkCi0yIHBpeGVscy9ieXRlIHdpdGggdGhlIGxlZnRtb3N0IHBpeGVsIGluIHRoZSBoaWdoLW9yZGVyIGJpdHMgb2YgdGhlCi1ieXRlLCB1bmxlc3MgcG5nX3NldF9wYWNraW5nKCkgaXMgY2FsbGVkLiAgOC1iaXQgUkdCIGRhdGEgd2lsbCBiZSBzdG9yZWQKLWluIFJHQiBSR0IgUkdCIGZvcm1hdCB1bmxlc3MgcG5nX3NldF9maWxsZXIoKSBvciBwbmdfc2V0X2FkZF9hbHBoYSgpCi1pcyBjYWxsZWQgdG8gaW5zZXJ0IGZpbGxlciBieXRlcywgZWl0aGVyIGJlZm9yZSBvciBhZnRlciBlYWNoIFJHQiB0cmlwbGV0LgotMTYtYml0IFJHQiBkYXRhIHdpbGwgYmUgcmV0dXJuZWQgUlJHR0JCIFJSR0dCQiwgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAotYnl0ZSBvZiB0aGUgY29sb3IgdmFsdWUgZmlyc3QsIHVubGVzcyBwbmdfc2V0X3N0cmlwXzE2KCkgaXMgY2FsbGVkIHRvCi10cmFuc2Zvcm0gaXQgdG8gcmVndWxhciBSR0IgUkdCIHRyaXBsZXRzLCBvciBwbmdfc2V0X2ZpbGxlcigpIG9yCi1wbmdfc2V0X2FkZCBhbHBoYSgpIGlzIGNhbGxlZCB0byBpbnNlcnQgZmlsbGVyIGJ5dGVzLCBlaXRoZXIgYmVmb3JlIG9yCi1hZnRlciBlYWNoIFJSR0dCQiB0cmlwbGV0LiAgU2ltaWxhcmx5LCA4LWJpdCBvciAxNi1iaXQgZ3JheXNjYWxlIGRhdGEgY2FuCi1iZSBtb2RpZmllZCB3aXRoCi1wbmdfc2V0X2ZpbGxlcigpLCBwbmdfc2V0X2FkZF9hbHBoYSgpLCBvciBwbmdfc2V0X3N0cmlwXzE2KCkuCi0KLVRoZSBmb2xsb3dpbmcgY29kZSB0cmFuc2Zvcm1zIGdyYXlzY2FsZSBpbWFnZXMgb2YgbGVzcyB0aGFuIDggdG8gOCBiaXRzLAotY2hhbmdlcyBwYWxldHRlZCBpbWFnZXMgdG8gUkdCLCBhbmQgYWRkcyBhIGZ1bGwgYWxwaGEgY2hhbm5lbCBpZiB0aGVyZSBpcwotdHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uIGluIGEgdFJOUyBjaHVuay4gIFRoaXMgaXMgbW9zdCB1c2VmdWwgb24KLWdyYXlzY2FsZSBpbWFnZXMgd2l0aCBiaXQgZGVwdGhzIG9mIDIgb3IgNCBvciBpZiB0aGVyZSBpcyBhIG11bHRpcGxlLWltYWdlCi12aWV3aW5nIGFwcGxpY2F0aW9uIHRoYXQgd2lzaGVzIHRvIHRyZWF0IGFsbCBpbWFnZXMgaW4gdGhlIHNhbWUgd2F5LgotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgICAgcG5nX3NldF9wYWxldHRlX3RvX3JnYihwbmdfcHRyKTsKLQotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgJiYKLSAgICAgICAgYml0X2RlcHRoIDwgOCkgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KHBuZ19wdHIpOwotCi0gICAgaWYgKHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgIFBOR19JTkZPX3RSTlMpKSBwbmdfc2V0X3RSTlNfdG9fYWxwaGEocG5nX3B0cik7Ci0KLVRoZXNlIHRocmVlIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgYWxpYXNlcyBmb3IgcG5nX3NldF9leHBhbmQoKSwgYWRkZWQKLWluIGxpYnBuZyB2ZXJzaW9uIDEuMC40LCB3aXRoIHRoZSBmdW5jdGlvbiBuYW1lcyBleHBhbmRlZCB0byBpbXByb3ZlIGNvZGUKLXJlYWRhYmlsaXR5LiAgSW4gc29tZSBmdXR1cmUgdmVyc2lvbiB0aGV5IG1heSBhY3R1YWxseSBkbyBkaWZmZXJlbnQKLXRoaW5ncy4KLQotQXMgb2YgbGlicG5nIHZlcnNpb24gMS4yLjksIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpIHdhcwotYWRkZWQuICBJdCBleHBhbmRzIHRoZSBzYW1wbGUgZGVwdGggd2l0aG91dCBjaGFuZ2luZyB0Uk5TIHRvIGFscGhhLgotCi1BcyBvZiBsaWJwbmcgdmVyc2lvbiAxLjQuMTIsIG5vdCBhbGwgcG9zc2libGUgZXhwYW5zaW9ucyBhcmUgc3VwcG9ydGVkLgotCi1JbiB0aGUgZm9sbG93aW5nIHRhYmxlLCB0aGUgMDEgbWVhbnMgZ3JheXNjYWxlIHdpdGggZGVwdGg8OCwgMzEgbWVhbnMKLWluZGV4ZWQgd2l0aCBkZXB0aDw4LCBvdGhlciBudW1lcmFscyByZXByZXNlbnQgdGhlIGNvbG9yIHR5cGUsICJUIiBtZWFucwotdGhlIHRSTlMgY2h1bmsgaXMgcHJlc2VudCwgQSBtZWFucyBhbiBhbHBoYSBjaGFubmVsIGlzIHByZXNlbnQsIGFuZCBPCi1tZWFucyB0Uk5TIG9yIGFscGhhIGlzIHByZXNlbnQgYnV0IGFsbCBwaXhlbHMgaW4gdGhlIGltYWdlIGFyZSBvcGFxdWUuCi0KLSAgRlJPTSAgMDEgIDMxICAgMCAgMFQgIDBPICAgMiAgMlQgIDJPICAgMyAgM1QgIDNPICA0QSAgNE8gIDZBICA2TyAKLSAgIFRPCi0gICAwMSAgICAtICAgICAgICAgICAgICAgICAgIAotICAgMzEgICAgICAgIC0KLSAgICAwICAgIDEgICAgICAgLSAgICAgICAgICAgCi0gICAwVCAgICAgICAgICAgICAgICAtCi0gICAwTyAgICAgICAgICAgICAgICAgICAgLQotICAgIDIgICAgICAgICAgIEdYICAgICAgICAgICAtCi0gICAyVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCi0gICAyTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQotICAgIDMgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAtCi0gICAzVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCi0gICAzTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQotICAgNEEgICAgICAgICAgICAgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCi0gICA0TyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCi0gICA2QSAgICAgICAgICAgICAgIEdYICAgICAgICAgVFggICAgICAgICAgIFRYICAgICAgICAgICAgICAgLQotICAgNk8gICAgICAgICAgICAgICAgICAgR1ggICAgICAgICAgICAgICAgICAgICAgVFggICAgICAgICAgICAgICAtCi0KLVdpdGhpbiB0aGUgbWF0cml4LAotICAgICAiLSIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICJYIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkgcG5nX3NldF9leHBhbmQoKS4KLSAgICAgIjEiIG1lYW5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvYnRhaW5lZCBieQotICAgICAgICAgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184Ci0gICAgICJHIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkKLSAgICAgICAgIHBuZ19zZXRfZ3JheV90b19yZ2IoKS4KLSAgICAgIlAiIG1lYW5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvYnRhaW5lZCBieQotICAgICAgICAgcG5nX3NldF9leHBhbmRfcGFsZXR0ZV90b19yZ2IoKS4KLSAgICAgIlQiIG1lYW5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvYnRhaW5lZCBieQotICAgICAgICAgcG5nX3NldF90Uk5TX3RvX2FscGhhKCkuCi0KLVBORyBjYW4gaGF2ZSBmaWxlcyB3aXRoIDE2IGJpdHMgcGVyIGNoYW5uZWwuICBJZiB5b3Ugb25seSBjYW4gaGFuZGxlCi04IGJpdHMgcGVyIGNoYW5uZWwsIHRoaXMgd2lsbCBzdHJpcCB0aGUgcGl4ZWxzIGRvd24gdG8gOCBiaXQuCi0KLSAgICBpZiAoYml0X2RlcHRoID09IDE2KQotICAgICAgICBwbmdfc2V0X3N0cmlwXzE2KHBuZ19wdHIpOwotCi1JZiwgZm9yIHNvbWUgcmVhc29uLCB5b3UgZG9uJ3QgbmVlZCB0aGUgYWxwaGEgY2hhbm5lbCBvbiBhbiBpbWFnZSwKLWFuZCB5b3Ugd2FudCB0byByZW1vdmUgaXQgcmF0aGVyIHRoYW4gY29tYmluaW5nIGl0IHdpdGggdGhlIGJhY2tncm91bmQKLShidXQgdGhlIGltYWdlIGF1dGhvciBjZXJ0YWlubHkgaGFkIGluIG1pbmQgdGhhdCB5b3UgKndvdWxkKiBjb21iaW5lCi1pdCB3aXRoIHRoZSBiYWNrZ3JvdW5kLCBzbyB0aGF0J3Mgd2hhdCB5b3Ugc2hvdWxkIHByb2JhYmx5IGRvKToKLQotICAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpCi0gICAgICAgIHBuZ19zZXRfc3RyaXBfYWxwaGEocG5nX3B0cik7Ci0KLUluIFBORyBmaWxlcywgdGhlIGFscGhhIGNoYW5uZWwgaW4gYW4gaW1hZ2UKLWlzIHRoZSBsZXZlbCBvZiBvcGFjaXR5LiAgSWYgeW91IG5lZWQgdGhlIGFscGhhIGNoYW5uZWwgaW4gYW4gaW1hZ2UgdG8KLWJlIHRoZSBsZXZlbCBvZiB0cmFuc3BhcmVuY3kgaW5zdGVhZCBvZiBvcGFjaXR5LCB5b3UgY2FuIGludmVydCB0aGUKLWFscGhhIGNoYW5uZWwgKG9yIHRoZSB0Uk5TIGNodW5rIGRhdGEpIGFmdGVyIGl0J3MgcmVhZCwgc28gdGhhdCAwIGlzCi1mdWxseSBvcGFxdWUgYW5kIDI1NSAoaW4gOC1iaXQgb3IgcGFsZXR0ZWQgaW1hZ2VzKSBvciA2NTUzNSAoaW4gMTYtYml0Ci1pbWFnZXMpIGlzIGZ1bGx5IHRyYW5zcGFyZW50LCB3aXRoCi0KLSAgICBwbmdfc2V0X2ludmVydF9hbHBoYShwbmdfcHRyKTsKLQotUE5HIGZpbGVzIHBhY2sgcGl4ZWxzIG9mIGJpdCBkZXB0aHMgMSwgMiwgYW5kIDQgaW50byBieXRlcyBhcyBzbWFsbCBhcwotdGhleSBjYW4sIHJlc3VsdGluZyBpbiwgZm9yIGV4YW1wbGUsIDggcGl4ZWxzIHBlciBieXRlIGZvciAxIGJpdAotZmlsZXMuICBUaGlzIGNvZGUgZXhwYW5kcyB0byAxIHBpeGVsIHBlciBieXRlIHdpdGhvdXQgY2hhbmdpbmcgdGhlCi12YWx1ZXMgb2YgdGhlIHBpeGVsczoKLQotICAgIGlmIChiaXRfZGVwdGggPCA4KQotICAgICAgICBwbmdfc2V0X3BhY2tpbmcocG5nX3B0cik7Ci0KLVBORyBmaWxlcyBoYXZlIHBvc3NpYmxlIGJpdCBkZXB0aHMgb2YgMSwgMiwgNCwgOCwgYW5kIDE2LiAgQWxsIHBpeGVscwotc3RvcmVkIGluIGEgUE5HIGltYWdlIGhhdmUgYmVlbiAic2NhbGVkIiBvciAic2hpZnRlZCIgdXAgdG8gdGhlIG5leHQKLWhpZ2hlciBwb3NzaWJsZSBiaXQgZGVwdGggKGUuZy4gZnJvbSA1IGJpdHMvc2FtcGxlIGluIHRoZSByYW5nZSBbMCwzMV0KLXRvIDggYml0cy9zYW1wbGUgaW4gdGhlIHJhbmdlIFswLCAyNTVdKS4gIEhvd2V2ZXIsIGl0IGlzIGFsc28gcG9zc2libGUKLXRvIGNvbnZlcnQgdGhlIFBORyBwaXhlbCBkYXRhIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGJpdCBkZXB0aCBvZiB0aGUKLWltYWdlLiAgVGhpcyBjYWxsIHJlZHVjZXMgdGhlIHBpeGVscyBiYWNrIGRvd24gdG8gdGhlIG9yaWdpbmFsIGJpdCBkZXB0aDoKLQotICAgIHBuZ19jb2xvcl84cCBzaWdfYml0OwotCi0gICAgaWYgKHBuZ19nZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpKQotICAgICAgICBwbmdfc2V0X3NoaWZ0KHBuZ19wdHIsIHNpZ19iaXQpOwotCi1QTkcgZmlsZXMgc3RvcmUgMy1jb2xvciBwaXhlbHMgaW4gcmVkLCBncmVlbiwgYmx1ZSBvcmRlci4gIFRoaXMgY29kZQotY2hhbmdlcyB0aGUgc3RvcmFnZSBvZiB0aGUgcGl4ZWxzIHRvIGJsdWUsIGdyZWVuLCByZWQ6Ci0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKLSAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCi0gICAgICAgIHBuZ19zZXRfYmdyKHBuZ19wdHIpOwotCi1QTkcgZmlsZXMgc3RvcmUgUkdCIHBpeGVscyBwYWNrZWQgaW50byAzIG9yIDYgYnl0ZXMuIFRoaXMgY29kZSBleHBhbmRzIHRoZW0KLWludG8gNCBvciA4IGJ5dGVzIGZvciB3aW5kb3dpbmcgc3lzdGVtcyB0aGF0IG5lZWQgdGhlbSBpbiB0aGlzIGZvcm1hdDoKLQotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKLSAgICAgICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgZmlsbGVyLCBQTkdfRklMTEVSX0JFRk9SRSk7Ci0KLXdoZXJlICJmaWxsZXIiIGlzIHRoZSA4IG9yIDE2LWJpdCBudW1iZXIgdG8gZmlsbCB3aXRoLCBhbmQgdGhlIGxvY2F0aW9uIGlzCi1laXRoZXIgUE5HX0ZJTExFUl9CRUZPUkUgb3IgUE5HX0ZJTExFUl9BRlRFUiwgZGVwZW5kaW5nIHVwb24gd2hldGhlcgoteW91IHdhbnQgdGhlIGZpbGxlciBiZWZvcmUgdGhlIFJHQiBvciBhZnRlci4gIFRoaXMgdHJhbnNmb3JtYXRpb24KLWRvZXMgbm90IGFmZmVjdCBpbWFnZXMgdGhhdCBhbHJlYWR5IGhhdmUgZnVsbCBhbHBoYSBjaGFubmVscy4gIFRvIGFkZCBhbgotb3BhcXVlIGFscGhhIGNoYW5uZWwsIHVzZSBmaWxsZXI9MHhmZiBvciAweGZmZmYgYW5kIFBOR19GSUxMRVJfQUZURVIgd2hpY2gKLXdpbGwgZ2VuZXJhdGUgUkdCQSBwaXhlbHMuCi0KLU5vdGUgdGhhdCBwbmdfc2V0X2ZpbGxlcigpIGRvZXMgbm90IGNoYW5nZSB0aGUgY29sb3IgdHlwZS4gIElmIHlvdSB3YW50Ci10byBkbyB0aGF0LCB5b3UgY2FuIGFkZCBhIHRydWUgYWxwaGEgY2hhbm5lbCB3aXRoCi0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKLSAgICAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQotICAgIHBuZ19zZXRfYWRkX2FscGhhKHBuZ19wdHIsIGZpbGxlciwgUE5HX0ZJTExFUl9BRlRFUik7Ci0KLXdoZXJlICJmaWxsZXIiIGNvbnRhaW5zIHRoZSBhbHBoYSB2YWx1ZSB0byBhc3NpZ24gdG8gZWFjaCBwaXhlbC4KLVRoaXMgZnVuY3Rpb24gd2FzIGFkZGVkIGluIGxpYnBuZy0xLjIuNy4KLQotSWYgeW91IGFyZSByZWFkaW5nIGFuIGltYWdlIHdpdGggYW4gYWxwaGEgY2hhbm5lbCwgYW5kIHlvdSBuZWVkIHRoZQotZGF0YSBhcyBBUkdCIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBQTkcgZm9ybWF0IFJHQkE6Ci0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCi0gICAgICAgIHBuZ19zZXRfc3dhcF9hbHBoYShwbmdfcHRyKTsKLQotRm9yIHNvbWUgdXNlcywgeW91IG1heSB3YW50IGEgZ3JheXNjYWxlIGltYWdlIHRvIGJlIHJlcHJlc2VudGVkIGFzCi1SR0IuICBUaGlzIGNvZGUgd2lsbCBkbyB0aGF0IGNvbnZlcnNpb246Ci0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8Ci0gICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKLSAgICAgICAgICBwbmdfc2V0X2dyYXlfdG9fcmdiKHBuZ19wdHIpOwotCi1Db252ZXJzZWx5LCB5b3UgY2FuIGNvbnZlcnQgYW4gUkdCIG9yIFJHQkEgaW1hZ2UgdG8gZ3JheXNjYWxlIG9yIGdyYXlzY2FsZQotd2l0aCBhbHBoYS4KLQotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAotICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKLSAgICAgICAgICBwbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkKHBuZ19wdHIsIGVycm9yX2FjdGlvbiwKLSAgICAgICAgICAgICBpbnQgcmVkX3dlaWdodCwgaW50IGdyZWVuX3dlaWdodCk7Ci0KLSAgICBlcnJvcl9hY3Rpb24gPSAxOiBzaWxlbnRseSBkbyB0aGUgY29udmVyc2lvbgotICAgIGVycm9yX2FjdGlvbiA9IDI6IGlzc3VlIGEgd2FybmluZyBpZiB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoYXMgYW55IHBpeGVsIHdoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgcmVkICE9IGdyZWVuIG9yIHJlZCAhPSBibHVlCi0gICAgZXJyb3JfYWN0aW9uID0gMzogaXNzdWUgYW4gZXJyb3IgYW5kIGFib3J0IHRoZQotICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gaWYgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGFzIGFueSBwaXhlbCB3aGVyZQotICAgICAgICAgICAgICAgICAgICAgIHJlZCAhPSBncmVlbiBvciByZWQgIT0gYmx1ZQotCi0gICAgcmVkX3dlaWdodDogICAgICAgd2VpZ2h0IG9mIHJlZCBjb21wb25lbnQgdGltZXMgMTAwMDAwCi0gICAgZ3JlZW5fd2VpZ2h0OiAgICAgd2VpZ2h0IG9mIGdyZWVuIGNvbXBvbmVudCB0aW1lcyAxMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICBJZiBlaXRoZXIgd2VpZ2h0IGlzIG5lZ2F0aXZlLCBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyAoMjEyNjgsIDcxNTE0KSBhcmUgdXNlZC4KLQotSWYgeW91IGhhdmUgc2V0IGVycm9yX2FjdGlvbiA9IDEgb3IgMiwgeW91IGNhbgotbGF0ZXIgY2hlY2sgd2hldGhlciB0aGUgaW1hZ2UgcmVhbGx5IHdhcyBncmF5LCBhZnRlciBwcm9jZXNzaW5nCi10aGUgaW1hZ2Ugcm93cywgd2l0aCB0aGUgcG5nX2dldF9yZ2JfdG9fZ3JheV9zdGF0dXMocG5nX3B0cikgZnVuY3Rpb24uCi1JdCB3aWxsIHJldHVybiBhIHBuZ19ieXRlIHRoYXQgaXMgemVybyBpZiB0aGUgaW1hZ2Ugd2FzIGdyYXkgb3IKLTEgaWYgdGhlcmUgd2VyZSBhbnkgbm9uLWdyYXkgcGl4ZWxzLiAgYktHRCBhbmQgc0JJVCBkYXRhCi13aWxsIGJlIHNpbGVudGx5IGNvbnZlcnRlZCB0byBncmF5c2NhbGUsIHVzaW5nIHRoZSBncmVlbiBjaGFubmVsCi1kYXRhLCByZWdhcmRsZXNzIG9mIHRoZSBlcnJvcl9hY3Rpb24gc2V0dGluZy4KLQotV2l0aCByZWRfd2VpZ2h0K2dyZWVuX3dlaWdodDw9MTAwMDAwLAotdGhlIG5vcm1hbGl6ZWQgZ3JheWxldmVsIGlzIGNvbXB1dGVkOgotCi0gICAgaW50IHJ3ID0gcmVkX3dlaWdodCAqIDY1NTM2OwotICAgIGludCBndyA9IGdyZWVuX3dlaWdodCAqIDY1NTM2OwotICAgIGludCBidyA9IDY1NTM2IC0gKHJ3ICsgZ3cpOwotICAgIGdyYXkgPSAocncqcmVkICsgZ3cqZ3JlZW4gKyBidypibHVlKS82NTUzNjsKLQotVGhlIGRlZmF1bHQgdmFsdWVzIGFwcHJveGltYXRlIHRob3NlIHJlY29tbWVuZGVkIGluIHRoZSBDaGFybGVzCi1Qb3ludG9uJ3MgQ29sb3IgRkFRLCA8aHR0cDovL3d3dy5pbmZvcmFtcC5uZXQvfnBveW50b24vPgotQ29weXJpZ2h0IChjKSAxOTk4LTAxLTA0IENoYXJsZXMgUG95bnRvbiA8cG95bnRvbiBhdCBpbmZvcmFtcC5uZXQ+Ci0KLSAgICBZID0gMC4yMTI2NzEgKiBSICsgMC43MTUxNjAgKiBHICsgMC4wNzIxNjkgKiBCCi0KLUxpYnBuZyBhcHByb3hpbWF0ZXMgdGhpcyB3aXRoCi0KLSAgICBZID0gMC4yMTI2OCAqIFIgICAgKyAwLjcxNTEgKiBHICAgICsgMC4wNzIxNyAqIEIKLQotd2hpY2ggY2FuIGJlIGV4cHJlc3NlZCB3aXRoIGludGVnZXJzIGFzCi0KLSAgICBZID0gKDY5NjkgKiBSICsgMjM0MzQgKiBHICsgMjM2NSAqIEIpLzMyNzY4Ci0KLVRoZSBjYWxjdWxhdGlvbiBpcyBkb25lIGluIGEgbGluZWFyIGNvbG9yc3BhY2UsIGlmIHRoZSBpbWFnZSBnYW1tYQotaXMga25vd24uCi0KLUlmIHlvdSBoYXZlIGEgZ3JheXNjYWxlIGFuZCB5b3UgYXJlIHVzaW5nIHBuZ19zZXRfZXhwYW5kX2RlcHRoKCksCi1wbmdfc2V0X2V4cGFuZCgpLCBvciBwbmdfc2V0X2dyYXlfdG9fcmdiIHRvIGNoYW5nZSB0byB0cnVlY29sb3Igb3IgdG8KLWEgaGlnaGVyIGJpdC1kZXB0aCwgeW91IG11c3QgZWl0aGVyIHN1cHBseSB0aGUgYmFja2dyb3VuZCBjb2xvciBhcyBhIGdyYXkKLXZhbHVlIGF0IHRoZSBvcmlnaW5hbCBmaWxlIGJpdC1kZXB0aCAobmVlZF9leHBhbmQgPSAxKSBvciBlbHNlIHN1cHBseSB0aGUKLWJhY2tncm91bmQgY29sb3IgYXMgYW4gUkdCIHRyaXBsZXQgYXQgdGhlIGZpbmFsLCBleHBhbmRlZCBiaXQgZGVwdGgKLShuZWVkX2V4cGFuZCA9IDApLiAgU2ltaWxhcmx5LCBpZiB5b3UgYXJlIHJlYWRpbmcgYSBwYWxldHRlZCBpbWFnZSwgeW91Ci1tdXN0IGVpdGhlciBzdXBwbHkgdGhlIGJhY2tncm91bmQgY29sb3IgYXMgYSBwYWxldHRlIGluZGV4IChuZWVkX2V4cGFuZCA9IDEpCi1vciBhcyBhbiBSR0IgdHJpcGxldCB0aGF0IG1heSBvciBtYXkgbm90IGJlIGluIHRoZSBwYWxldHRlIChuZWVkX2V4cGFuZCA9IDApLgotCi0gICAgcG5nX2NvbG9yXzE2IG15X2JhY2tncm91bmQ7Ci0gICAgcG5nX2NvbG9yXzE2cCBpbWFnZV9iYWNrZ3JvdW5kOwotCi0gICAgaWYgKHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlX2JhY2tncm91bmQpKQotICAgICAgICBwbmdfc2V0X2JhY2tncm91bmQocG5nX3B0ciwgaW1hZ2VfYmFja2dyb3VuZCwKLSAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFLCAxLCAxLjApOwotICAgIGVsc2UKLSAgICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19wdHIsICZteV9iYWNrZ3JvdW5kLAotICAgICAgICAgIFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTiwgMCwgMS4wKTsKLQotVGhlIHBuZ19zZXRfYmFja2dyb3VuZCgpIGZ1bmN0aW9uIHRlbGxzIGxpYnBuZyB0byBjb21wb3NpdGUgaW1hZ2VzCi13aXRoIGFscGhhIG9yIHNpbXBsZSB0cmFuc3BhcmVuY3kgYWdhaW5zdCB0aGUgc3VwcGxpZWQgYmFja2dyb3VuZAotY29sb3IuICBJZiB0aGUgUE5HIGZpbGUgY29udGFpbnMgYSBiS0dEIGNodW5rIChQTkdfSU5GT19iS0dEIHZhbGlkKSwKLXlvdSBtYXkgdXNlIHRoaXMgY29sb3IsIG9yIHN1cHBseSBhbm90aGVyIGNvbG9yIG1vcmUgc3VpdGFibGUgZm9yCi10aGUgY3VycmVudCBkaXNwbGF5IChlLmcuLCB0aGUgYmFja2dyb3VuZCBjb2xvciBmcm9tIGEgd2ViIHBhZ2UpLiAgWW91Ci1uZWVkIHRvIHRlbGwgbGlicG5nIHdoZXRoZXIgdGhlIGNvbG9yIGlzIGluIHRoZSBnYW1tYSBzcGFjZSBvZiB0aGUKLWRpc3BsYXkgKFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTiBmb3IgY29sb3JzIHlvdSBzdXBwbHkpLCB0aGUgZmlsZQotKFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEUgZm9yIGNvbG9ycyBmcm9tIHRoZSBiS0dEIGNodW5rKSwgb3Igb25lCi10aGF0IGlzIG5laXRoZXIgb2YgdGhlc2UgZ2FtbWFzIChQTkdfQkFDS0dST1VORF9HQU1NQV9VTklRVUUgLSBJIGRvbid0Ci1rbm93IHdoeSBhbnlvbmUgd291bGQgdXNlIHRoaXMsIGJ1dCBpdCdzIGhlcmUpLgotCi1UbyBwcm9wZXJseSBkaXNwbGF5IFBORyBpbWFnZXMgb24gYW55IGtpbmQgb2Ygc3lzdGVtLCB0aGUgYXBwbGljYXRpb24gbmVlZHMKLXRvIGtub3cgd2hhdCB0aGUgZGlzcGxheSBnYW1tYSBpcy4gIElkZWFsbHksIHRoZSB1c2VyIHdpbGwga25vdyB0aGlzLCBhbmQKLXRoZSBhcHBsaWNhdGlvbiB3aWxsIGFsbG93IHRoZW0gdG8gc2V0IGl0LiAgT25lIG1ldGhvZCBvZiBhbGxvd2luZyB0aGUgdXNlcgotdG8gc2V0IHRoZSBkaXNwbGF5IGdhbW1hIHNlcGFyYXRlbHkgZm9yIGVhY2ggc3lzdGVtIGlzIHRvIGNoZWNrIGZvciBhCi1TQ1JFRU5fR0FNTUEgb3IgRElTUExBWV9HQU1NQSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgd2hpY2ggd2lsbCBob3BlZnVsbHkgYmUKLWNvcnJlY3RseSBzZXQuCi0KLU5vdGUgdGhhdCBkaXNwbGF5X2dhbW1hIGlzIHRoZSBvdmVyYWxsIGdhbW1hIGNvcnJlY3Rpb24gcmVxdWlyZWQgdG8gcHJvZHVjZQotcGxlYXNpbmcgcmVzdWx0cywgd2hpY2ggZGVwZW5kcyBvbiB0aGUgbGlnaHRpbmcgY29uZGl0aW9ucyBpbiB0aGUgc3Vycm91bmRpbmcKLWVudmlyb25tZW50LiAgSW4gYSBkaW0gb3IgYnJpZ2h0bHkgbGl0IHJvb20sIG5vIGNvbXBlbnNhdGlvbiBvdGhlciB0aGFuCi10aGUgcGh5c2ljYWwgZ2FtbWEgZXhwb25lbnQgb2YgdGhlIG1vbml0b3IgaXMgbmVlZGVkLCB3aGlsZSBpbiBhIGRhcmsgcm9vbQotYSBzbGlnaHRseSBzbWFsbGVyIGV4cG9uZW50IGlzIGJldHRlci4KLQotICAgZG91YmxlIGdhbW1hLCBzY3JlZW5fZ2FtbWE7Ci0KLSAgIGlmICgvKiBXZSBoYXZlIGEgdXNlci1kZWZpbmVkIHNjcmVlbgotICAgICAgIGdhbW1hIHZhbHVlICovKQotICAgewotICAgICAgc2NyZWVuX2dhbW1hID0gdXNlcl9kZWZpbmVkX3NjcmVlbl9nYW1tYTsKLSAgIH0KLSAgIC8qIE9uZSB3YXkgdGhhdCBhcHBsaWNhdGlvbnMgY2FuIHNoYXJlIHRoZSBzYW1lCi0gICAgICBzY3JlZW4gZ2FtbWEgdmFsdWUgKi8KLSAgIGVsc2UgaWYgKChnYW1tYV9zdHIgPSBnZXRlbnYoIlNDUkVFTl9HQU1NQSIpKQotICAgICAgIT0gTlVMTCkKLSAgIHsKLSAgICAgIHNjcmVlbl9nYW1tYSA9IChkb3VibGUpYXRvZihnYW1tYV9zdHIpOwotICAgfQotICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhbm90aGVyIHZhbHVlICovCi0gICBlbHNlCi0gICB7Ci0gICAgICBzY3JlZW5fZ2FtbWEgPSAyLjI7IC8qIEEgZ29vZCBndWVzcyBmb3IgYQotICAgICAgICAgICBQQyBtb25pdG9yIGluIGEgYnJpZ2h0IG9mZmljZSBvciBhIGRpbSByb29tICovCi0gICAgICBzY3JlZW5fZ2FtbWEgPSAyLjA7IC8qIEEgZ29vZCBndWVzcyBmb3IgYQotICAgICAgICAgICBQQyBtb25pdG9yIGluIGEgZGFyayByb29tICovCi0gICAgICBzY3JlZW5fZ2FtbWEgPSAxLjcgb3IgMS4wOyAgLyogQSBnb29kCi0gICAgICAgICAgIGd1ZXNzIGZvciBNYWMgc3lzdGVtcyAqLwotICAgfQotCi1UaGUgcG5nX3NldF9nYW1tYSgpIGZ1bmN0aW9uIGhhbmRsZXMgZ2FtbWEgdHJhbnNmb3JtYXRpb25zIG9mIHRoZSBkYXRhLgotUGFzcyBib3RoIHRoZSBmaWxlIGdhbW1hIGFuZCB0aGUgY3VycmVudCBzY3JlZW5fZ2FtbWEuICBJZiB0aGUgZmlsZSBkb2VzCi1ub3QgaGF2ZSBhIGdhbW1hIHZhbHVlLCB5b3UgY2FuIHBhc3Mgb25lIGFueXdheSBpZiB5b3UgaGF2ZSBhbiBpZGVhIHdoYXQKLWl0IGlzICh1c3VhbGx5IDAuNDU0NTUgaXMgYSBnb29kIGd1ZXNzIGZvciBHSUYgaW1hZ2VzIG9uIFBDcykuICBOb3RlCi10aGF0IGZpbGUgZ2FtbWFzIGFyZSBpbnZlcnRlZCBmcm9tIHNjcmVlbiBnYW1tYXMuICBTZWUgdGhlIGRpc2N1c3Npb25zCi1vbiBnYW1tYSBpbiB0aGUgUE5HIHNwZWNpZmljYXRpb24gZm9yIGFuIGV4Y2VsbGVudCBkZXNjcmlwdGlvbiBvZiB3aGF0Ci1nYW1tYSBpcywgYW5kIHdoeSBhbGwgYXBwbGljYXRpb25zIHNob3VsZCBzdXBwb3J0IGl0LiAgSXQgaXMgc3Ryb25nbHkKLXJlY29tbWVuZGVkIHRoYXQgUE5HIHZpZXdlcnMgc3VwcG9ydCBnYW1tYSBjb3JyZWN0aW9uLgotCi0gICBpZiAocG5nX2dldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCAmZ2FtbWEpKQotICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBzY3JlZW5fZ2FtbWEsIGdhbW1hKTsKLSAgIGVsc2UKLSAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgc2NyZWVuX2dhbW1hLCAwLjQ1NDU1KTsKLQotSWYgeW91IG5lZWQgdG8gcmVkdWNlIGFuIFJHQiBmaWxlIHRvIGEgcGFsZXR0ZWQgZmlsZSwgb3IgaWYgYSBwYWxldHRlZAotZmlsZSBoYXMgbW9yZSBlbnRyaWVzIHRoZW4gd2lsbCBmaXQgb24geW91ciBzY3JlZW4sIHBuZ19zZXRfcXVhbnRpemUoKQotd2lsbCBkbyB0aGF0LiAgTm90ZSB0aGF0IHRoaXMgaXMgYSBzaW1wbGUgbWF0Y2ggZGl0aGVyIHRoYXQgbWVyZWx5Ci1maW5kcyB0aGUgY2xvc2VzdCBjb2xvciBhdmFpbGFibGUuICBUaGlzIHNob3VsZCB3b3JrIGZhaXJseSB3ZWxsIHdpdGgKLW9wdGltaXplZCBwYWxldHRlcywgYW5kIGZhaXJseSBiYWRseSB3aXRoIGxpbmVhciBjb2xvciBjdWJlcy4gIElmIHlvdQotcGFzcyBhIHBhbGV0dGUgdGhhdCBpcyBsYXJnZXIgdGhlbiBtYXhpbXVtX2NvbG9ycywgdGhlIGZpbGUgd2lsbAotcmVkdWNlIHRoZSBudW1iZXIgb2YgY29sb3JzIGluIHRoZSBwYWxldHRlIHNvIGl0IHdpbGwgZml0IGludG8KLW1heGltdW1fY29sb3JzLiAgSWYgdGhlcmUgaXMgYSBoaXN0b2dyYW0sIGl0IHdpbGwgdXNlIGl0IHRvIG1ha2UKLW1vcmUgaW50ZWxsaWdlbnQgY2hvaWNlcyB3aGVuIHJlZHVjaW5nIHRoZSBwYWxldHRlLiAgSWYgdGhlcmUgaXMgbm8KLWhpc3RvZ3JhbSwgaXQgbWF5IG5vdCBkbyBhcyBnb29kIGEgam9iLgotCi0gICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQotICAgewotICAgICAgaWYgKHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgICBQTkdfSU5GT19QTFRFKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ191aW50XzE2cCBoaXN0b2dyYW0gPSBOVUxMOwotICAgICAgICAgcG5nX2dldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgICAgICAgJmhpc3RvZ3JhbSk7Ci0gICAgICAgICBwbmdfc2V0X3F1YW50aXplKHBuZ19wdHIsIHBhbGV0dGUsIG51bV9wYWxldHRlLAotICAgICAgICAgICAgbWF4X3NjcmVlbl9jb2xvcnMsIGhpc3RvZ3JhbSwgMSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBwbmdfY29sb3Igc3RkX2NvbG9yX2N1YmVbTUFYX1NDUkVFTl9DT0xPUlNdID0KLSAgICAgICAgICAgIHsgLi4uIGNvbG9ycyAuLi4gfTsKLQotICAgICAgICAgcG5nX3NldF9xdWFudGl6ZShwbmdfcHRyLCBzdGRfY29sb3JfY3ViZSwKLSAgICAgICAgICAgIE1BWF9TQ1JFRU5fQ09MT1JTLCBNQVhfU0NSRUVOX0NPTE9SUywKLSAgICAgICAgICAgIE5VTEwsMCk7Ci0gICAgICB9Ci0gICB9Ci0KLVBORyBmaWxlcyBkZXNjcmliZSBtb25vY2hyb21lIGFzIGJsYWNrIGJlaW5nIHplcm8gYW5kIHdoaXRlIGJlaW5nIG9uZS4KLVRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHJldmVyc2UgdGhpcyAobWFrZSBibGFjayBiZSBvbmUgYW5kIHdoaXRlIGJlCi16ZXJvKToKLQotICAgaWYgKGJpdF9kZXB0aCA9PSAxICYmIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKLSAgICAgIHBuZ19zZXRfaW52ZXJ0X21vbm8ocG5nX3B0cik7Ci0KLVRoaXMgZnVuY3Rpb24gY2FuIGFsc28gYmUgdXNlZCB0byBpbnZlcnQgZ3JheXNjYWxlIGFuZCBncmF5LWFscGhhIGltYWdlczoKLQotICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSB8fAotICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgICBwbmdfc2V0X2ludmVydF9tb25vKHBuZ19wdHIpOwotCi1QTkcgZmlsZXMgc3RvcmUgMTYgYml0IHBpeGVscyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKGJpZy1lbmRpYW4sCi1pZS4gbW9zdCBzaWduaWZpY2FudCBiaXRzIGZpcnN0KS4gIFRoaXMgY29kZSBjaGFuZ2VzIHRoZSBzdG9yYWdlIHRvIHRoZQotb3RoZXIgd2F5IChsaXR0bGUtZW5kaWFuLCBpLmUuIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgZmlyc3QsIHRoZQotd2F5IFBDcyBzdG9yZSB0aGVtKToKLQotICAgIGlmIChiaXRfZGVwdGggPT0gMTYpCi0gICAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKLQotSWYgeW91IGFyZSB1c2luZyBwYWNrZWQtcGl4ZWwgaW1hZ2VzICgxLCAyLCBvciA0IGJpdHMvcGl4ZWwpLCBhbmQgeW91Ci1uZWVkIHRvIGNoYW5nZSB0aGUgb3JkZXIgdGhlIHBpeGVscyBhcmUgcGFja2VkIGludG8gYnl0ZXMsIHlvdSBjYW4gdXNlOgotCi0gICAgaWYgKGJpdF9kZXB0aCA8IDgpCi0gICAgICAgcG5nX3NldF9wYWNrc3dhcChwbmdfcHRyKTsKLQotRmluYWxseSwgeW91IGNhbiB3cml0ZSB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiBpZiBub25lIG9mCi10aGUgZXhpc3Rpbmcgb25lcyBtZWV0cyB5b3VyIG5lZWRzLiAgVGhpcyBpcyBkb25lIGJ5IHNldHRpbmcgYSBjYWxsYmFjawotd2l0aAotCi0gICAgcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKHBuZ19wdHIsCi0gICAgICAgcmVhZF90cmFuc2Zvcm1fZm4pOwotCi1Zb3UgbXVzdCBzdXBwbHkgdGhlIGZ1bmN0aW9uCi0KLSAgICB2b2lkIHJlYWRfdHJhbnNmb3JtX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19yb3dfaW5mb3AKLSAgICAgICAgcm93X2luZm8sIHBuZ19ieXRlcCBkYXRhKQotCi1TZWUgcG5ndGVzdC5jIGZvciBhIHdvcmtpbmcgZXhhbXBsZS4gIFlvdXIgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKLWFmdGVyIGFsbCBvZiB0aGUgb3RoZXIgdHJhbnNmb3JtYXRpb25zIGhhdmUgYmVlbiBwcm9jZXNzZWQuCi0KLVlvdSBjYW4gYWxzbyBzZXQgdXAgYSBwb2ludGVyIHRvIGEgdXNlciBzdHJ1Y3R1cmUgZm9yIHVzZSBieSB5b3VyCi1jYWxsYmFjayBmdW5jdGlvbiwgYW5kIHlvdSBjYW4gaW5mb3JtIGxpYnBuZyB0aGF0IHlvdXIgdHJhbnNmb3JtCi1mdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIGJpdCBkZXB0aCB3aXRoIHRoZQotZnVuY3Rpb24KLQotICAgIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyhwbmdfcHRyLCB1c2VyX3B0ciwKLSAgICAgICB1c2VyX2RlcHRoLCB1c2VyX2NoYW5uZWxzKTsKLQotVGhlIHVzZXIncyBhcHBsaWNhdGlvbiwgbm90IGxpYnBuZywgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcgYW5kCi1mcmVlaW5nIGFueSBtZW1vcnkgcmVxdWlyZWQgZm9yIHRoZSB1c2VyIHN0cnVjdHVyZS4KLQotWW91IGNhbiByZXRyaWV2ZSB0aGUgcG9pbnRlciB2aWEgdGhlIGZ1bmN0aW9uCi1wbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0cigpLiAgRm9yIGV4YW1wbGU6Ci0KLSAgICB2b2lkcCByZWFkX3VzZXJfdHJhbnNmb3JtX3B0ciA9Ci0gICAgICAgcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIocG5nX3B0cik7Ci0KLVRoZSBsYXN0IHRoaW5nIHRvIGhhbmRsZSBpcyBpbnRlcmxhY2luZzsgdGhpcyBpcyBjb3ZlcmVkIGluIGRldGFpbCBiZWxvdywKLWJ1dCB5b3UgbXVzdCBjYWxsIHRoZSBmdW5jdGlvbiBoZXJlIGlmIHlvdSB3YW50IGxpYnBuZyB0byBoYW5kbGUgZXhwYW5zaW9uCi1vZiB0aGUgaW50ZXJsYWNlZCBpbWFnZS4KLQotICAgIG51bWJlcl9vZl9wYXNzZXMgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKLQotQWZ0ZXIgc2V0dGluZyB0aGUgdHJhbnNmb3JtYXRpb25zLCBsaWJwbmcgY2FuIHVwZGF0ZSB5b3VyIHBuZ19pbmZvCi1zdHJ1Y3R1cmUgdG8gcmVmbGVjdCBhbnkgdHJhbnNmb3JtYXRpb25zIHlvdSd2ZSByZXF1ZXN0ZWQgd2l0aCB0aGlzCi1jYWxsLiAgVGhpcyBpcyBtb3N0IHVzZWZ1bCB0byB1cGRhdGUgdGhlIGluZm8gc3RydWN0dXJlJ3Mgcm93Ynl0ZXMKLWZpZWxkIHNvIHlvdSBjYW4gdXNlIGl0IHRvIGFsbG9jYXRlIHlvdXIgaW1hZ2UgbWVtb3J5LiAgVGhpcyBmdW5jdGlvbgotd2lsbCBhbHNvIHVwZGF0ZSB5b3VyIHBhbGV0dGUgd2l0aCB0aGUgY29ycmVjdCBzY3JlZW5fZ2FtbWEgYW5kCi1iYWNrZ3JvdW5kIGlmIHRoZXNlIGhhdmUgYmVlbiBnaXZlbiB3aXRoIHRoZSBjYWxscyBhYm92ZS4KLQotICAgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotQWZ0ZXIgeW91IGNhbGwgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSwgeW91IGNhbiBhbGxvY2F0ZSBhbnkKLW1lbW9yeSB5b3UgbmVlZCB0byBob2xkIHRoZSBpbWFnZS4gIFRoZSByb3cgZGF0YSBpcyBzaW1wbHkKLXJhdyBieXRlIGRhdGEgZm9yIGFsbCBmb3JtcyBvZiBpbWFnZXMuICBBcyB0aGUgYWN0dWFsIGFsbG9jYXRpb24KLXZhcmllcyBhbW9uZyBhcHBsaWNhdGlvbnMsIG5vIGV4YW1wbGUgd2lsbCBiZSBnaXZlbi4gIElmIHlvdQotYXJlIGFsbG9jYXRpbmcgb25lIGxhcmdlIGNodW5rLCB5b3Ugd2lsbCBuZWVkIHRvIGJ1aWxkIGFuCi1hcnJheSBvZiBwb2ludGVycyB0byBlYWNoIHJvdywgYXMgaXQgd2lsbCBiZSBuZWVkZWQgZm9yIHNvbWUKLW9mIHRoZSBmdW5jdGlvbnMgYmVsb3cuCi0KLS5TUyBSZWFkaW5nIGltYWdlIGRhdGEKLQotQWZ0ZXIgeW91J3ZlIGFsbG9jYXRlZCBtZW1vcnksIHlvdSBjYW4gcmVhZCB0aGUgaW1hZ2UgZGF0YS4KLVRoZSBzaW1wbGVzdCB3YXkgdG8gZG8gdGhpcyBpcyBpbiBvbmUgZnVuY3Rpb24gY2FsbC4gIElmIHlvdSBhcmUKLWFsbG9jYXRpbmcgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSB3aG9sZSBpbWFnZSwgeW91IGNhbiBqdXN0Ci1jYWxsIHBuZ19yZWFkX2ltYWdlKCkgYW5kIGxpYnBuZyB3aWxsIHJlYWQgaW4gYWxsIHRoZSBpbWFnZSBkYXRhCi1hbmQgcHV0IGl0IGluIHRoZSBtZW1vcnkgYXJlYSBzdXBwbGllZC4gIFlvdSB3aWxsIG5lZWQgdG8gcGFzcyBpbgotYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gZWFjaCByb3cuCi0KLVRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBoYW5kbGVzIGludGVybGFjaW5nLCBzbyB5b3UgZG9uJ3QgbmVlZAotdG8gY2FsbCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIG9yIGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZQotdGltZXMsIG9yIGFueSBvZiB0aGF0IG90aGVyIHN0dWZmIG5lY2Vzc2FyeSB3aXRoIHBuZ19yZWFkX3Jvd3MoKS4KLQotICAgcG5nX3JlYWRfaW1hZ2UocG5nX3B0ciwgcm93X3BvaW50ZXJzKTsKLQotd2hlcmUgcm93X3BvaW50ZXJzIGlzOgotCi0gICBwbmdfYnl0ZXAgcm93X3BvaW50ZXJzW2hlaWdodF07Ci0KLVlvdSBjYW4gcG9pbnQgdG8gdm9pZCBvciBjaGFyIG9yIHdoYXRldmVyIHlvdSB1c2UgZm9yIHBpeGVscy4KLQotSWYgeW91IGRvbid0IHdhbnQgdG8gcmVhZCBpbiB0aGUgd2hvbGUgaW1hZ2UgYXQgb25jZSwgeW91IGNhbgotdXNlIHBuZ19yZWFkX3Jvd3MoKSBpbnN0ZWFkLiAgSWYgdGhlcmUgaXMgbm8gaW50ZXJsYWNpbmcgKGNoZWNrCi1pbnRlcmxhY2VfdHlwZSA9PSBQTkdfSU5URVJMQUNFX05PTkUpLCB0aGlzIGlzIHNpbXBsZToKLQotICAgIHBuZ19yZWFkX3Jvd3MocG5nX3B0ciwgcm93X3BvaW50ZXJzLCBOVUxMLAotICAgICAgIG51bWJlcl9vZl9yb3dzKTsKLQotd2hlcmUgcm93X3BvaW50ZXJzIGlzIHRoZSBzYW1lIGFzIGluIHRoZSBwbmdfcmVhZF9pbWFnZSgpIGNhbGwuCi0KLUlmIHlvdSBhcmUgZG9pbmcgdGhpcyBqdXN0IG9uZSByb3cgYXQgYSB0aW1lLCB5b3UgY2FuIGRvIHRoaXMgd2l0aAotYSBzaW5nbGUgcm93X3BvaW50ZXIgaW5zdGVhZCBvZiBhbiBhcnJheSBvZiByb3dfcG9pbnRlcnM6Ci0KLSAgICBwbmdfYnl0ZXAgcm93X3BvaW50ZXIgPSByb3c7Ci0gICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIHJvd19wb2ludGVyLCBOVUxMKTsKLQotSWYgdGhlIGZpbGUgaXMgaW50ZXJsYWNlZCAoaW50ZXJsYWNlX3R5cGUgIT0gMCBpbiB0aGUgSUhEUiBjaHVuayksIHRoaW5ncwotZ2V0IHNvbWV3aGF0IGhhcmRlci4gIFRoZSBvbmx5IGN1cnJlbnQgKFBORyBTcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4yKQotaW50ZXJsYWNpbmcgdHlwZSBmb3IgUE5HIGlzIChpbnRlcmxhY2VfdHlwZSA9PSBQTkdfSU5URVJMQUNFX0FEQU03KQotaXMgYSBzb21ld2hhdCBjb21wbGljYXRlZCAyRCBpbnRlcmxhY2Ugc2NoZW1lLCBrbm93biBhcyBBZGFtNywgdGhhdAotYnJlYWtzIGRvd24gYW4gaW1hZ2UgaW50byBzZXZlbiBzbWFsbGVyIGltYWdlcyBvZiB2YXJ5aW5nIHNpemUsIGJhc2VkCi1vbiBhbiA4eDggZ3JpZC4KLQotbGlicG5nIGNhbiBmaWxsIG91dCB0aG9zZSBpbWFnZXMgb3IgaXQgY2FuIGdpdmUgdGhlbSB0byB5b3UgImFzIGlzIi4KLUlmIHlvdSB3YW50IHRoZW0gZmlsbGVkIG91dCwgdGhlcmUgYXJlIHR3byB3YXlzIHRvIGRvIHRoYXQuICBUaGUgb25lCi1tZW50aW9uZWQgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uIGlzIHRvIGV4cGFuZCBlYWNoIHBpeGVsIHRvIGNvdmVyCi10aG9zZSBwaXhlbHMgdGhhdCBoYXZlIG5vdCBiZWVuIHJlYWQgeWV0ICh0aGUgInJlY3RhbmdsZSIgbWV0aG9kKS4KLVRoaXMgcmVzdWx0cyBpbiBhIGJsb2NreSBpbWFnZSBmb3IgdGhlIGZpcnN0IHBhc3MsIHdoaWNoIGdyYWR1YWxseQotc21vb3RocyBvdXQgYXMgbW9yZSBwaXhlbHMgYXJlIHJlYWQuICBUaGUgb3RoZXIgbWV0aG9kIGlzIHRoZSAic3BhcmtsZSIKLW1ldGhvZCwgd2hlcmUgcGl4ZWxzIGFyZSBkcmF3biBvbmx5IGluIHRoZWlyIGZpbmFsIGxvY2F0aW9ucywgd2l0aCB0aGUKLXJlc3Qgb2YgdGhlIGltYWdlIHJlbWFpbmluZyB3aGF0ZXZlciBjb2xvcnMgdGhleSB3ZXJlIGluaXRpYWxpemVkIHRvCi1iZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSByZWFkLiAgVGhlIGZpcnN0IG1ldGhvZCB1c3VhbGx5IGxvb2tzIGJldHRlciwKLWJ1dCB0ZW5kcyB0byBiZSBzbG93ZXIsIGFzIHRoZXJlIGFyZSBtb3JlIHBpeGVscyB0byBwdXQgaW4gdGhlIHJvd3MuCi0KLUlmIHlvdSBkb24ndCB3YW50IGxpYnBuZyB0byBoYW5kbGUgdGhlIGludGVybGFjaW5nIGRldGFpbHMsIGp1c3QgY2FsbAotcG5nX3JlYWRfcm93cygpIHNldmVuIHRpbWVzIHRvIHJlYWQgaW4gYWxsIHNldmVuIGltYWdlcy4gIEVhY2ggb2YgdGhlCi1pbWFnZXMgaXMgYSB2YWxpZCBpbWFnZSBieSBpdHNlbGYsIG9yIHRoZXkgY2FuIGFsbCBiZSBjb21iaW5lZCBvbiBhbgotOHg4IGdyaWQgdG8gZm9ybSBhIHNpbmdsZSBpbWFnZSAoYWx0aG91Z2ggaWYgeW91IGludGVuZCB0byBjb21iaW5lIHRoZW0KLXlvdSB3b3VsZCBiZSBmYXIgYmV0dGVyIG9mZiB1c2luZyB0aGUgbGlicG5nIGludGVybGFjZSBoYW5kbGluZykuCi0KLVRoZSBmaXJzdCBwYXNzIHdpbGwgcmV0dXJuIGFuIGltYWdlIDEvOCBhcyB3aWRlIGFzIHRoZSBlbnRpcmUgaW1hZ2UKLShldmVyeSA4dGggY29sdW1uIHN0YXJ0aW5nIGluIGNvbHVtbiAwKSBhbmQgMS84IGFzIGhpZ2ggYXMgdGhlIG9yaWdpbmFsCi0oZXZlcnkgOHRoIHJvdyBzdGFydGluZyBpbiByb3cgMCksIHRoZSBzZWNvbmQgd2lsbCBiZSAxLzggYXMgd2lkZQotKHN0YXJ0aW5nIGluIGNvbHVtbiA0KSBhbmQgMS84IGFzIGhpZ2ggKGFsc28gc3RhcnRpbmcgaW4gcm93IDApLiAgVGhlCi10aGlyZCBwYXNzIHdpbGwgYmUgMS80IGFzIHdpZGUgKGV2ZXJ5IDR0aCBwaXhlbCBzdGFydGluZyBpbiBjb2x1bW4gMCkgYW5kCi0xLzggYXMgaGlnaCAoZXZlcnkgOHRoIHJvdyBzdGFydGluZyBpbiByb3cgNCksIGFuZCB0aGUgZm91cnRoIHBhc3Mgd2lsbAotYmUgMS80IGFzIHdpZGUgYW5kIDEvNCBhcyBoaWdoIChldmVyeSA0dGggY29sdW1uIHN0YXJ0aW5nIGluIGNvbHVtbiAyLAotYW5kIGV2ZXJ5IDR0aCByb3cgc3RhcnRpbmcgaW4gcm93IDApLiAgVGhlIGZpZnRoIHBhc3Mgd2lsbCByZXR1cm4gYW4KLWltYWdlIDEvMiBhcyB3aWRlLCBhbmQgMS80IGFzIGhpZ2ggKHN0YXJ0aW5nIGF0IGNvbHVtbiAwIGFuZCByb3cgMiksCi13aGlsZSB0aGUgc2l4dGggcGFzcyB3aWxsIGJlIDEvMiBhcyB3aWRlIGFuZCAxLzIgYXMgaGlnaCBhcyB0aGUgb3JpZ2luYWwKLShzdGFydGluZyBpbiBjb2x1bW4gMSBhbmQgcm93IDApLiAgVGhlIHNldmVudGggYW5kIGZpbmFsIHBhc3Mgd2lsbCBiZSBhcwotd2lkZSBhcyB0aGUgb3JpZ2luYWwsIGFuZCAxLzIgYXMgaGlnaCwgY29udGFpbmluZyBhbGwgb2YgdGhlIG9kZAotbnVtYmVyZWQgc2NhbmxpbmVzLiAgUGhldyEKLQotSWYgeW91IHdhbnQgbGlicG5nIHRvIGV4cGFuZCB0aGUgaW1hZ2VzLCBjYWxsIHRoaXMgYmVmb3JlIGNhbGxpbmcKLXBuZ19zdGFydF9yZWFkX2ltYWdlKCkgb3IgcG5nX3JlYWRfdXBkYXRlX2luZm8oKToKLQotICAgIGlmIChpbnRlcmxhY2VfdHlwZSA9PSBQTkdfSU5URVJMQUNFX0FEQU03KQotICAgICAgICBudW1iZXJfb2ZfcGFzc2VzCi0gICAgICAgICAgID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7Ci0KLVRoaXMgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBwYXNzZXMgbmVlZGVkLiAgQ3VycmVudGx5LCB0aGlzCi1pcyBzZXZlbiwgYnV0IG1heSBjaGFuZ2UgaWYgYW5vdGhlciBpbnRlcmxhY2UgdHlwZSBpcyBhZGRlZC4KLVRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBldmVuIGlmIHRoZSBmaWxlIGlzIG5vdCBpbnRlcmxhY2VkLAotd2hlcmUgaXQgd2lsbCByZXR1cm4gb25lIHBhc3MuCi0KLUlmIHlvdSBhcmUgbm90IGdvaW5nIHRvIGRpc3BsYXkgdGhlIGltYWdlIGFmdGVyIGVhY2ggcGFzcywgYnV0IGFyZQotZ29pbmcgdG8gd2FpdCB1bnRpbCB0aGUgZW50aXJlIGltYWdlIGlzIHJlYWQgaW4sIHVzZSB0aGUgc3BhcmtsZQotZWZmZWN0LiAgVGhpcyBlZmZlY3QgaXMgZmFzdGVyIGFuZCB0aGUgZW5kIHJlc3VsdCBvZiBlaXRoZXIgbWV0aG9kCi1pcyBleGFjdGx5IHRoZSBzYW1lLiAgSWYgeW91IGFyZSBwbGFubmluZyBvbiBkaXNwbGF5aW5nIHRoZSBpbWFnZQotYWZ0ZXIgZWFjaCBwYXNzLCB0aGUgInJlY3RhbmdsZSIgZWZmZWN0IGlzIGdlbmVyYWxseSBjb25zaWRlcmVkIHRoZQotYmV0dGVyIGxvb2tpbmcgb25lLgotCi1JZiB5b3Ugb25seSB3YW50IHRoZSAic3BhcmtsZSIgZWZmZWN0LCBqdXN0IGNhbGwgcG5nX3JlYWRfcm93cygpIGFzCi1ub3JtYWwsIHdpdGggdGhlIHRoaXJkIHBhcmFtZXRlciBOVUxMLiAgTWFrZSBzdXJlIHlvdSBtYWtlIHBhc3Mgb3ZlcgotdGhlIGltYWdlIG51bWJlcl9vZl9wYXNzZXMgdGltZXMsIGFuZCB5b3UgZG9uJ3QgY2hhbmdlIHRoZSBkYXRhIGluIHRoZQotcm93cyBiZXR3ZWVuIGNhbGxzLiAgWW91IGNhbiBjaGFuZ2UgdGhlIGxvY2F0aW9ucyBvZiB0aGUgZGF0YSwganVzdAotbm90IHRoZSBkYXRhLiAgRWFjaCBwYXNzIG9ubHkgd3JpdGVzIHRoZSBwaXhlbHMgYXBwcm9wcmlhdGUgZm9yIHRoYXQKLXBhc3MsIGFuZCBhc3N1bWVzIHRoZSBkYXRhIGZyb20gcHJldmlvdXMgcGFzc2VzIGlzIHN0aWxsIHZhbGlkLgotCi0gICAgcG5nX3JlYWRfcm93cyhwbmdfcHRyLCByb3dfcG9pbnRlcnMsIE5VTEwsCi0gICAgICAgbnVtYmVyX29mX3Jvd3MpOwotCi1JZiB5b3Ugb25seSB3YW50IHRoZSBmaXJzdCBlZmZlY3QgKHRoZSByZWN0YW5nbGVzKSwgZG8gdGhlIHNhbWUgYXMKLWJlZm9yZSBleGNlcHQgcGFzcyB0aGUgcm93IGJ1ZmZlciBpbiB0aGUgdGhpcmQgcGFyYW1ldGVyLCBhbmQgbGVhdmUKLXRoZSBzZWNvbmQgcGFyYW1ldGVyIE5VTEwuCi0KLSAgICBwbmdfcmVhZF9yb3dzKHBuZ19wdHIsIE5VTEwsIHJvd19wb2ludGVycywKLSAgICAgICBudW1iZXJfb2Zfcm93cyk7Ci0KLS5TUyBGaW5pc2hpbmcgYSBzZXF1ZW50aWFsIHJlYWQKLQotQWZ0ZXIgeW91IGFyZSBmaW5pc2hlZCByZWFkaW5nIHRoZSBpbWFnZSB0aHJvdWdoIHRoZQotbG93LWxldmVsIGludGVyZmFjZSwgeW91IGNhbiBmaW5pc2ggcmVhZGluZyB0aGUgZmlsZS4gIElmIHlvdSBhcmUKLWludGVyZXN0ZWQgaW4gY29tbWVudHMgb3IgdGltZSwgd2hpY2ggbWF5IGJlIHN0b3JlZCBlaXRoZXIgYmVmb3JlIG9yCi1hZnRlciB0aGUgaW1hZ2UgZGF0YSwgeW91IHNob3VsZCBwYXNzIHRoZSBzZXBhcmF0ZSBwbmdfaW5mbyBzdHJ1Y3QgaWYKLXlvdSB3YW50IHRvIGtlZXAgdGhlIGNvbW1lbnRzIGZyb20gYmVmb3JlIGFuZCBhZnRlciB0aGUgaW1hZ2UKLXNlcGFyYXRlLiAgSWYgeW91IGFyZSBub3QgaW50ZXJlc3RlZCwgeW91IGNhbiBwYXNzIE5VTEwuCi0KLSAgIHBuZ19yZWFkX2VuZChwbmdfcHRyLCBlbmRfaW5mbyk7Ci0KLVdoZW4geW91IGFyZSBkb25lLCB5b3UgY2FuIGZyZWUgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgYnkgbGlicG5nIGxpa2UgdGhpczoKLQotICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKLSAgICAgICAmZW5kX2luZm8pOwotCi1JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGluZGl2aWR1YWxseSBmcmVlIHRoZSBpbmZvX3B0ciBtZW1iZXJzIHRoYXQKLXBvaW50IHRvIGxpYnBuZy1hbGxvY2F0ZWQgc3RvcmFnZSB3aXRoIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246Ci0KLSAgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBtYXNrLCBzZXEpCi0gICAgbWFzayAtIGlkZW50aWZpZXMgZGF0YSB0byBiZSBmcmVlZCwgYSBtYXNrCi0gICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgT1Igb2Ygb25lIG9yCi0gICAgICAgICAgIG1vcmUgb2YKLSAgICAgICAgICAgICBQTkdfRlJFRV9QTFRFLCBQTkdfRlJFRV9UUk5TLAotICAgICAgICAgICAgIFBOR19GUkVFX0hJU1QsIFBOR19GUkVFX0lDQ1AsCi0gICAgICAgICAgICAgUE5HX0ZSRUVfUENBTCwgUE5HX0ZSRUVfUk9XUywKLSAgICAgICAgICAgICBQTkdfRlJFRV9TQ0FMLCBQTkdfRlJFRV9TUExULAotICAgICAgICAgICAgIFBOR19GUkVFX1RFWFQsIFBOR19GUkVFX1VOS04sCi0gICAgICAgICAgIG9yIHNpbXBseSBQTkdfRlJFRV9BTEwKLSAgICBzZXEgIC0gc2VxdWVuY2UgbnVtYmVyIG9mIGl0ZW0gdG8gYmUgZnJlZWQKLSAgICAgICAgICAgKC0xIGZvciBhbGwgaXRlbXMpCi0KLVRoaXMgZnVuY3Rpb24gbWF5IGJlIHNhZmVseSBjYWxsZWQgd2hlbiB0aGUgcmVsZXZhbnQgc3RvcmFnZSBoYXMKLWFscmVhZHkgYmVlbiBmcmVlZCwgb3IgaGFzIG5vdCB5ZXQgYmVlbiBhbGxvY2F0ZWQsIG9yIHdhcyBhbGxvY2F0ZWQKLWJ5IHRoZSB1c2VyIGFuZCBub3QgYnkgbGlicG5nLCAgYW5kIHdpbGwgaW4gdGhvc2UgY2FzZXMgZG8gbm90aGluZy4KLVRoZSAic2VxIiBwYXJhbWV0ZXIgaXMgaWdub3JlZCBpZiBvbmx5IG9uZSBpdGVtIG9mIHRoZSBzZWxlY3RlZCBkYXRhCi10eXBlLCBzdWNoIGFzIFBMVEUsIGlzIGFsbG93ZWQuICBJZiAic2VxIiBpcyBub3QgLTEsIGFuZCBtdWx0aXBsZSBpdGVtcwotYXJlIGFsbG93ZWQgZm9yIHRoZSBkYXRhIHR5cGUgaWRlbnRpZmllZCBpbiB0aGUgbWFzaywgc3VjaCBhcyB0ZXh0IG9yCi1zUExULCBvbmx5IHRoZSBuJ3RoIGl0ZW0gaW4gdGhlIHN0cnVjdHVyZSBpcyBmcmVlZCwgd2hlcmUgbiBpcyAic2VxIi4KLQotVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgb25seSB0byBmcmVlIGRhdGEgdGhhdCB3YXMgYWxsb2NhdGVkIGludGVybmFsbHkKLWJ5IGxpYnBuZy4gIFRoaXMgY2FuIGJlIGNoYW5nZWQsIHNvIHRoYXQgbGlicG5nIHdpbGwgbm90IGZyZWUgdGhlIGRhdGEsCi1vciBzbyB0aGF0IGl0IHdpbGwgZnJlZSBkYXRhIHRoYXQgd2FzIGFsbG9jYXRlZCBieSB0aGUgdXNlciB3aXRoIHBuZ19tYWxsb2MoKQotb3IgcG5nX3phbGxvYygpIGFuZCBwYXNzZWQgaW4gdmlhIGEgcG5nX3NldF8qKCkgZnVuY3Rpb24sIHdpdGgKLQotICAgIHBuZ19kYXRhX2ZyZWVyKHBuZ19wdHIsIGluZm9fcHRyLCBmcmVlciwgbWFzaykKLSAgICBtYXNrICAgLSB3aGljaCBkYXRhIGVsZW1lbnRzIGFyZSBhZmZlY3RlZAotICAgICAgICAgICAgIHNhbWUgY2hvaWNlcyBhcyBpbiBwbmdfZnJlZV9kYXRhKCkKLSAgICBmcmVlciAgLSBvbmUgb2YKLSAgICAgICAgICAgICAgIFBOR19ERVNUUk9ZX1dJTExfRlJFRV9EQVRBCi0gICAgICAgICAgICAgICBQTkdfU0VUX1dJTExfRlJFRV9EQVRBCi0gICAgICAgICAgICAgICBQTkdfVVNFUl9XSUxMX0ZSRUVfREFUQQotCi1UaGlzIGZ1bmN0aW9uIG9ubHkgYWZmZWN0cyBkYXRhIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQuCi1Zb3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciByZWFkaW5nIHRoZSBQTkcgZGF0YSBidXQgYmVmb3JlIGNhbGxpbmcKLWFueSBwbmdfc2V0XyooKSBmdW5jdGlvbnMsIHRvIGNvbnRyb2wgd2hldGhlciB0aGUgdXNlciBvciB0aGUgcG5nX3NldF8qKCkKLWZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGFueSBleGlzdGluZyBkYXRhIHRoYXQgbWlnaHQgYmUgcHJlc2VudCwKLWFuZCBhZ2FpbiBhZnRlciB0aGUgcG5nX3NldF8qKCkgZnVuY3Rpb25zIHRvIGNvbnRyb2wgd2hldGhlciB0aGUgdXNlcgotb3IgcG5nX2Rlc3Ryb3lfKigpIGlzIHN1cHBvc2VkIHRvIGZyZWUgdGhlIGRhdGEuICBXaGVuIHRoZSB1c2VyIGFzc3VtZXMKLXJlc3BvbnNpYmlsaXR5IGZvciBsaWJwbmctYWxsb2NhdGVkIGRhdGEsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHVzZQotcG5nX2ZyZWUoKSB0byBmcmVlIGl0LCBhbmQgd2hlbiB0aGUgdXNlciB0cmFuc2ZlcnMgcmVzcG9uc2liaWxpdHkgdG8gbGlicG5nCi1mb3IgZGF0YSB0aGF0IHRoZSB1c2VyIGhhcyBhbGxvY2F0ZWQsIHRoZSB1c2VyIG11c3QgaGF2ZSB1c2VkIHBuZ19tYWxsb2MoKQotb3IgcG5nX3phbGxvYygpIHRvIGFsbG9jYXRlIGl0LgotCi1JZiB5b3UgYWxsb2NhdGVkIHlvdXIgcm93X3BvaW50ZXJzIGluIGEgc2luZ2xlIGJsb2NrLCBhcyBzdWdnZXN0ZWQgYWJvdmUgaW4KLXRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgaGlnaCBsZXZlbCByZWFkIGludGVyZmFjZSwgeW91IG11c3Qgbm90IHRyYW5zZmVyCi1yZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyBpdCB0byB0aGUgcG5nX3NldF9yb3dzIG9yIHBuZ19yZWFkX2Rlc3Ryb3kgZnVuY3Rpb24sCi1iZWNhdXNlIHRoZXkgd291bGQgYWxzbyB0cnkgdG8gZnJlZSB0aGUgaW5kaXZpZHVhbCByb3dfcG9pbnRlcnNbaV0uCi0KLUlmIHlvdSBhbGxvY2F0ZWQgdGV4dF9wdHIudGV4dCwgdGV4dF9wdHIubGFuZywgYW5kIHRleHRfcHRyLnRyYW5zbGF0ZWRfa2V5d29yZAotc2VwYXJhdGVseSwgZG8gbm90IHRyYW5zZmVyIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlaW5nIHRleHRfcHRyIHRvIGxpYnBuZywKLWJlY2F1c2Ugd2hlbiBsaWJwbmcgZmlsbHMgYSBwbmdfdGV4dCBzdHJ1Y3R1cmUgaXQgY29tYmluZXMgdGhlc2UgbWVtYmVycyB3aXRoCi10aGUga2V5IG1lbWJlciwgYW5kIHBuZ19mcmVlX2RhdGEoKSB3aWxsIGZyZWUgb25seSB0ZXh0X3B0ci5rZXkuICBTaW1pbGFybHksCi1pZiB5b3UgdHJhbnNmZXIgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWUnaW5nIHRleHRfcHRyIGZyb20gbGlicG5nIHRvIHlvdXIKLWFwcGxpY2F0aW9uLCB5b3VyIGFwcGxpY2F0aW9uIG11c3Qgbm90IHNlcGFyYXRlbHkgZnJlZSB0aG9zZSBtZW1iZXJzLgotCi1UaGUgcG5nX2ZyZWVfZGF0YSgpIGZ1bmN0aW9uIHdpbGwgdHVybiBvZmYgdGhlICJ2YWxpZCIgZmxhZyBmb3IgYW55dGhpbmcKLWl0IGZyZWVzLiAgSWYgeW91IG5lZWQgdG8gdHVybiB0aGUgZmxhZyBvZmYgZm9yIGEgY2h1bmsgdGhhdCB3YXMgZnJlZWQgYnkKLXlvdXIgYXBwbGljYXRpb24gaW5zdGVhZCBvZiBieSBsaWJwbmcsIHlvdSBjYW4gdXNlCi0KLSAgICBwbmdfc2V0X2ludmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIG1hc2spOwotICAgIG1hc2sgLSBpZGVudGlmaWVzIHRoZSBjaHVua3MgdG8gYmUgbWFkZSBpbnZhbGlkLAotICAgICAgICAgICBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIG9uZSBvcgotICAgICAgICAgICBtb3JlIG9mCi0gICAgICAgICAgICAgUE5HX0lORk9fZ0FNQSwgUE5HX0lORk9fc0JJVCwKLSAgICAgICAgICAgICBQTkdfSU5GT19jSFJNLCBQTkdfSU5GT19QTFRFLAotICAgICAgICAgICAgIFBOR19JTkZPX3RSTlMsIFBOR19JTkZPX2JLR0QsCi0gICAgICAgICAgICAgUE5HX0lORk9faElTVCwgUE5HX0lORk9fcEhZcywKLSAgICAgICAgICAgICBQTkdfSU5GT19vRkZzLCBQTkdfSU5GT190SU1FLAotICAgICAgICAgICAgIFBOR19JTkZPX3BDQUwsIFBOR19JTkZPX3NSR0IsCi0gICAgICAgICAgICAgUE5HX0lORk9faUNDUCwgUE5HX0lORk9fc1BMVCwKLSAgICAgICAgICAgICBQTkdfSU5GT19zQ0FMLCBQTkdfSU5GT19JREFUCi0KLUZvciBhIG1vcmUgY29tcGFjdCBleGFtcGxlIG9mIHJlYWRpbmcgYSBQTkcgaW1hZ2UsIHNlZSB0aGUgZmlsZSBleGFtcGxlLmMuCi0KLS5TUyBSZWFkaW5nIFBORyBmaWxlcyBwcm9ncmVzc2l2ZWx5Ci0KLVRoZSBwcm9ncmVzc2l2ZSByZWFkZXIgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRoZW4gdGhlIG5vbi1wcm9ncmVzc2l2ZQotcmVhZGVyLiAgSW5zdGVhZCBvZiBjYWxsaW5nIHBuZ19yZWFkX2luZm8oKSwgcG5nX3JlYWRfcm93cygpLCBhbmQKLXBuZ19yZWFkX2VuZCgpLCB5b3UgbWFrZSBvbmUgY2FsbCB0byBwbmdfcHJvY2Vzc19kYXRhKCksIHdoaWNoIGNhbGxzCi1jYWxsYmFja3Mgd2hlbiBpdCBoYXMgdGhlIGluZm8sIGEgcm93LCBvciB0aGUgZW5kIG9mIHRoZSBpbWFnZS4gIFlvdQotc2V0IHVwIHRoZXNlIGNhbGxiYWNrcyB3aXRoIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbigpLiAgWW91IGRvbid0Ci1oYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBpbnB1dC9vdXRwdXQgZnVuY3Rpb25zIG9mIGxpYnBuZywgYXMgeW91IGFyZQotZ2l2aW5nIHRoZSBsaWJyYXJ5IHRoZSBkYXRhIGRpcmVjdGx5IGluIHBuZ19wcm9jZXNzX2RhdGEoKS4gIEkgd2lsbAotYXNzdW1lIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgc2VjdGlvbiBvbiByZWFkaW5nIFBORyBmaWxlcyBhYm92ZSwKLXNvIEkgd2lsbCBvbmx5IGhpZ2hsaWdodCB0aGUgZGlmZmVyZW5jZXMgKGFsdGhvdWdoIEkgd2lsbCBzaG93Ci1hbGwgb2YgdGhlIGNvZGUpLgotCi1wbmdfc3RydWN0cCBwbmdfcHRyOwotcG5nX2luZm9wIGluZm9fcHRyOwotCi0gLyogIEFuIGV4YW1wbGUgY29kZSBmcmFnbWVudCBvZiBob3cgeW91IHdvdWxkCi0gICAgIGluaXRpYWxpemUgdGhlIHByb2dyZXNzaXZlIHJlYWRlciBpbiB5b3VyCi0gICAgIGFwcGxpY2F0aW9uLiAqLwotIGludAotIGluaXRpYWxpemVfcG5nX3JlYWRlcigpCi0gewotICAgIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0Ci0gICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCi0gICAgICAgICB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4pOwotICAgIGlmICghcG5nX3B0cikKLSAgICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOwotICAgIGlmICghaW5mb19wdHIpCi0gICAgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgKHBuZ19pbmZvcHApTlVMTCwKLSAgICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCk7Ci0gICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLQotICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCi0gICAgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAotICAgICAgICAgICAocG5nX2luZm9wcClOVUxMKTsKLSAgICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICAgfQotCi0gICAgLyogVGhpcyBvbmUncyBuZXcuICBZb3UgY2FuIHByb3ZpZGUgZnVuY3Rpb25zCi0gICAgICAgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGhlYWRlciBpbmZvIGlzIHZhbGlkLAotICAgICAgIHdoZW4gZWFjaCByb3cgaXMgY29tcGxldGVkLCBhbmQgd2hlbiB0aGUgaW1hZ2UKLSAgICAgICBpcyBmaW5pc2hlZC4gIElmIHlvdSBhcmVuJ3QgdXNpbmcgYWxsIGZ1bmN0aW9ucywKLSAgICAgICB5b3UgY2FuIHNwZWNpZnkgTlVMTCBwYXJhbWV0ZXJzLiAgRXZlbiB3aGVuIGFsbAotICAgICAgIHRocmVlIGZ1bmN0aW9ucyBhcmUgTlVMTCwgeW91IG5lZWQgdG8gY2FsbAotICAgICAgIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbigpLiAgWW91IGNhbiB1c2UKLSAgICAgICBhbnkgc3RydWN0IGFzIHRoZSB1c2VyX3B0ciAoY2FzdCB0byBhIHZvaWQgcG9pbnRlcgotICAgICAgIGZvciB0aGUgZnVuY3Rpb24gY2FsbCksIGFuZCByZXRyaWV2ZSB0aGUgcG9pbnRlcgotICAgICAgIGZyb20gaW5zaWRlIHRoZSBjYWxsYmFja3MgdXNpbmcgdGhlIGZ1bmN0aW9uCi0KLSAgICAgICAgICBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmdfcHRyKTsKLQotICAgICAgIHdoaWNoIHdpbGwgcmV0dXJuIGEgdm9pZCBwb2ludGVyLCB3aGljaCB5b3UgaGF2ZQotICAgICAgIHRvIGNhc3QgYXBwcm9wcmlhdGVseS4KLSAgICAgKi8KLSAgICBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4ocG5nX3B0ciwgKHZvaWQgKil1c2VyX3B0ciwKLSAgICAgICAgaW5mb19jYWxsYmFjaywgcm93X2NhbGxiYWNrLCBlbmRfY2FsbGJhY2spOwotCi0gICAgcmV0dXJuIDA7Ci0gfQotCi0gLyogQSBjb2RlIGZyYWdtZW50IHRoYXQgeW91IGNhbGwgYXMgeW91IHJlY2VpdmUgYmxvY2tzCi0gICBvZiBkYXRhICovCi0gaW50Ci0gcHJvY2Vzc19kYXRhKHBuZ19ieXRlcCBidWZmZXIsIHBuZ191aW50XzMyIGxlbmd0aCkKLSB7Ci0gICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKLSAgICB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsCi0gICAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwpOwotICAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLSAgICAvKiBUaGlzIG9uZSdzIG5ldyBhbHNvLiAgU2ltcGx5IGdpdmUgaXQgYSBjaHVuawotICAgICAgIG9mIGRhdGEgZnJvbSB0aGUgZmlsZSBzdHJlYW0gKGluIG9yZGVyLCBvZgotICAgICAgIGNvdXJzZSkuICBPbiBtYWNoaW5lcyB3aXRoIHNlZ21lbnRlZCBtZW1vcnkKLSAgICAgICBtb2RlbHMgbWFjaGluZXMsIGRvbid0IGdpdmUgaXQgYW55IG1vcmUgdGhhbgotICAgICAgIDY0Sy4gIFRoZSBsaWJyYXJ5IHNlZW1zIHRvIHJ1biBmaW5lIHdpdGggc2l6ZXMKLSAgICAgICBvZiA0Sy4gQWx0aG91Z2ggeW91IGNhbiBnaXZlIGl0IG11Y2ggbGVzcyBpZgotICAgICAgIG5lY2Vzc2FyeSAoSSBhc3N1bWUgeW91IGNhbiBnaXZlIGl0IGNodW5rcyBvZgotICAgICAgIDEgYnl0ZSwgSSBoYXZlbid0IHRyaWVkIGxlc3MgdGhlbiAyNTYgYnl0ZXMKLSAgICAgICB5ZXQpLiAgV2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMsIHlvdSBtYXkKLSAgICAgICB3YW50IHRvIGRpc3BsYXkgYW55IHJvd3MgdGhhdCB3ZXJlIGdlbmVyYXRlZAotICAgICAgIGluIHRoZSByb3cgY2FsbGJhY2sgaWYgeW91IGRvbid0IGFscmVhZHkgZG8KLSAgICAgICBzbyB0aGVyZS4KLSAgICAgKi8KLSAgICBwbmdfcHJvY2Vzc19kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgcmV0dXJuIDA7Ci0gfQotCi0gLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgKGFzIHNldCBieQotICAgIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbigpIGFib3ZlKSB3aGVuIGVub3VnaCBkYXRhCi0gICAgaGFzIGJlZW4gc3VwcGxpZWQgc28gYWxsIG9mIHRoZSBoZWFkZXIgaGFzIGJlZW4KLSAgICByZWFkLgotICovCi0gdm9pZAotIGluZm9fY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm8pCi0gewotICAgIC8qIERvIGFueSBzZXR1cCBoZXJlLCBpbmNsdWRpbmcgc2V0dGluZyBhbnkgb2YKLSAgICAgICB0aGUgdHJhbnNmb3JtYXRpb25zIG1lbnRpb25lZCBpbiB0aGUgUmVhZGluZwotICAgICAgIFBORyBmaWxlcyBzZWN0aW9uLiAgRm9yIG5vdywgeW91IF9tdXN0XyBjYWxsCi0gICAgICAgZWl0aGVyIHBuZ19zdGFydF9yZWFkX2ltYWdlKCkgb3IKLSAgICAgICBwbmdfcmVhZF91cGRhdGVfaW5mbygpIGFmdGVyIGFsbCB0aGUKLSAgICAgICB0cmFuc2Zvcm1hdGlvbnMgYXJlIHNldCAoZXZlbiBpZiB5b3UgZG9uJ3Qgc2V0Ci0gICAgICAgYW55KS4gIFlvdSBtYXkgc3RhcnQgZ2V0dGluZyByb3dzIGJlZm9yZQotICAgICAgIHBuZ19wcm9jZXNzX2RhdGEoKSByZXR1cm5zLCBzbyB0aGlzIGlzIHlvdXIKLSAgICAgICBsYXN0IGNoYW5jZSB0byBwcmVwYXJlIGZvciB0aGF0LgotICAgICAqLwotIH0KLQotIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gZWFjaCByb3cgb2YgaW1hZ2UKLSAgICBkYXRhIGlzIGNvbXBsZXRlICovCi0gdm9pZAotIHJvd19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgbmV3X3JvdywKLSAgICBwbmdfdWludF8zMiByb3dfbnVtLCBpbnQgcGFzcykKLSB7Ci0gICAgLyogSWYgdGhlIGltYWdlIGlzIGludGVybGFjZWQsIGFuZCB5b3UgdHVybmVkCi0gICAgICAgb24gdGhlIGludGVybGFjZSBoYW5kbGVyLCB0aGlzIGZ1bmN0aW9uIHdpbGwKLSAgICAgICBiZSBjYWxsZWQgZm9yIGV2ZXJ5IHJvdyBpbiBldmVyeSBwYXNzLiAgU29tZQotICAgICAgIG9mIHRoZXNlIHJvd3Mgd2lsbCBub3QgYmUgY2hhbmdlZCBmcm9tIHRoZQotICAgICAgIHByZXZpb3VzIHBhc3MuICBXaGVuIHRoZSByb3cgaXMgbm90IGNoYW5nZWQsCi0gICAgICAgdGhlIG5ld19yb3cgdmFyaWFibGUgd2lsbCBiZSBOVUxMLiAgVGhlIHJvd3MKLSAgICAgICBhbmQgcGFzc2VzIGFyZSBjYWxsZWQgaW4gb3JkZXIsIHNvIHlvdSBkb24ndAotICAgICAgIHJlYWxseSBuZWVkIHRoZSByb3dfbnVtIGFuZCBwYXNzLCBidXQgSSdtCi0gICAgICAgc3VwcGx5aW5nIHRoZW0gYmVjYXVzZSBpdCBtYXkgbWFrZSB5b3VyIGxpZmUKLSAgICAgICBlYXNpZXIuCi0KLSAgICAgICBGb3IgdGhlIG5vbi1OVUxMIHJvd3Mgb2YgaW50ZXJsYWNlZCBpbWFnZXMsCi0gICAgICAgeW91IG11c3QgY2FsbCBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3coKQotICAgICAgIHBhc3NpbmcgaW4gdGhlIHJvdyBhbmQgdGhlIG9sZCByb3cuICBZb3UgY2FuCi0gICAgICAgY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBOVUxMIHJvd3MgKGl0IHdpbGwganVzdAotICAgICAgIHJldHVybikgYW5kIGZvciBub24taW50ZXJsYWNlZCBpbWFnZXMgKGl0IGp1c3QKLSAgICAgICBkb2VzIHRoZSBtZW1jcHkgZm9yIHlvdSkgaWYgaXQgd2lsbCBtYWtlIHRoZQotICAgICAgIGNvZGUgZWFzaWVyLiAgVGh1cywgeW91IGNhbiBqdXN0IGRvIHRoaXMgZm9yCi0gICAgICAgYWxsIGNhc2VzOgotICAgICAqLwotCi0gICAgICAgIHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdyhwbmdfcHRyLCBvbGRfcm93LAotICAgICAgICAgIG5ld19yb3cpOwotCi0gICAgLyogd2hlcmUgb2xkX3JvdyBpcyB3aGF0IHdhcyBkaXNwbGF5ZWQgZm9yCi0gICAgICAgcHJldmlvdXNseSBmb3IgdGhlIHJvdy4gIE5vdGUgdGhhdCB0aGUgZmlyc3QKLSAgICAgICBwYXNzIChwYXNzID09IDAsIHJlYWxseSkgd2lsbCBjb21wbGV0ZWx5IGNvdmVyCi0gICAgICAgdGhlIG9sZCByb3csIHNvIHRoZSByb3dzIGRvIG5vdCBoYXZlIHRvIGJlCi0gICAgICAgaW5pdGlhbGl6ZWQuICBBZnRlciB0aGUgZmlyc3QgcGFzcyAoYW5kIG9ubHkKLSAgICAgICBmb3IgaW50ZXJsYWNlZCBpbWFnZXMpLCB5b3Ugd2lsbCBoYXZlIHRvIHBhc3MKLSAgICAgICB0aGUgY3VycmVudCByb3csIGFuZCB0aGUgZnVuY3Rpb24gd2lsbCBjb21iaW5lCi0gICAgICAgdGhlIG9sZCByb3cgYW5kIHRoZSBuZXcgcm93LgotICAgICovCi0gfQotCi0gdm9pZAotIGVuZF9jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mbykKLSB7Ci0gICAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHdob2xlIGltYWdlCi0gICAgICAgaGFzIGJlZW4gcmVhZCwgaW5jbHVkaW5nIGFueSBjaHVua3MgYWZ0ZXIgdGhlCi0gICAgICAgaW1hZ2UgKHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIElFTkQpLiAgWW91Ci0gICAgICAgd2lsbCB1c3VhbGx5IGhhdmUgdGhlIHNhbWUgaW5mbyBjaHVuayBhcyB5b3UKLSAgICAgICBoYWQgaW4gdGhlIGhlYWRlciwgYWx0aG91Z2ggc29tZSBkYXRhIG1heSBoYXZlCi0gICAgICAgYmVlbiBhZGRlZCB0byB0aGUgY29tbWVudHMgYW5kIHRpbWUgZmllbGRzLgotCi0gICAgICAgTW9zdCBwZW9wbGUgd29uJ3QgZG8gbXVjaCBoZXJlLCBwZXJoYXBzIHNldHRpbmcKLSAgICAgICBhIGZsYWcgdGhhdCBtYXJrcyB0aGUgaW1hZ2UgYXMgZmluaXNoZWQuCi0gICAgICovCi0gfQotCi0KLQotLlNIIElWLiBXcml0aW5nCi0KLU11Y2ggb2YgdGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gcmVhZGluZy4gIEhvd2V2ZXIsIGV2ZXJ5dGhpbmcgb2YKLWltcG9ydGFuY2UgaXMgcmVwZWF0ZWQgaGVyZSwgc28geW91IHdvbid0IGhhdmUgdG8gY29uc3RhbnRseSBsb29rCi1iYWNrIHVwIGluIHRoZSByZWFkaW5nIHNlY3Rpb24gdG8gdW5kZXJzdGFuZCB3cml0aW5nLgotCi0uU1MgU2V0dXAKLQotWW91IHdpbGwgd2FudCB0byBkbyB0aGUgSS9PIGluaXRpYWxpemF0aW9uIGJlZm9yZSB5b3UgZ2V0IGludG8gbGlicG5nLAotc28gaWYgaXQgZG9lc24ndCB3b3JrLCB5b3UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byB1bmRvLiBJZiB5b3UgYXJlIG5vdAotdXNpbmcgdGhlIHN0YW5kYXJkIEkvTyBmdW5jdGlvbnMsIHlvdSB3aWxsIG5lZWQgdG8gcmVwbGFjZSB0aGVtIHdpdGgKLWN1c3RvbSB3cml0aW5nIGZ1bmN0aW9ucy4gIFNlZSB0aGUgZGlzY3Vzc2lvbiB1bmRlciBDdXN0b21pemluZyBsaWJwbmcuCi0KLSAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVfbmFtZSwgIndiIik7Ci0gICAgaWYgKCFmcCkKLSAgICB7Ci0gICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICAgfQotCi1OZXh0LCBwbmdfc3RydWN0IGFuZCBwbmdfaW5mbyBuZWVkIHRvIGJlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQuCi1BcyB0aGVzZSBjYW4gYmUgYm90aCByZWxhdGl2ZWx5IGxhcmdlLCB5b3UgbWF5IG5vdCB3YW50IHRvIHN0b3JlIHRoZXNlCi1vbiB0aGUgc3RhY2ssIHVubGVzcyB5b3UgaGF2ZSBzdGFjayBzcGFjZSB0byBzcGFyZS4gIE9mIGNvdXJzZSwgeW91Ci13aWxsIHdhbnQgdG8gY2hlY2sgaWYgdGhleSByZXR1cm4gTlVMTC4gIElmIHlvdSBhcmUgYWxzbyByZWFkaW5nLAoteW91IHdvbid0IHdhbnQgdG8gbmFtZSB5b3VyIHJlYWQgc3RydWN0dXJlIGFuZCB5b3VyIHdyaXRlIHN0cnVjdHVyZQotYm90aCAicG5nX3B0ciI7IHlvdSBjYW4gY2FsbCB0aGVtIGFueXRoaW5nIHlvdSBsaWtlLCBzdWNoIGFzCi0icmVhZF9wdHIiIGFuZCAid3JpdGVfcHRyIi4gIExvb2sgYXQgcG5ndGVzdC5jLCBmb3IgZXhhbXBsZS4KLQotICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdAotICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCi0gICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbik7Ci0gICAgaWYgKCFwbmdfcHRyKQotICAgICAgIHJldHVybiAoRVJST1IpOwotCi0gICAgcG5nX2luZm9wIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLSAgICBpZiAoIWluZm9fcHRyKQotICAgIHsKLSAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsCi0gICAgICAgICAocG5nX2luZm9wcClOVUxMKTsKLSAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLUlmIHlvdSB3YW50IHRvIHVzZSB5b3VyIG93biBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcywKLWRlZmluZSBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEIGFuZCB1c2UKLXBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIoKSBpbnN0ZWFkIG9mIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KCk6Ci0KLSAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMgotICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCi0gICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbiwgKHBuZ192b2lkcCkKLSAgICAgICAgdXNlcl9tZW1fcHRyLCB1c2VyX21hbGxvY19mbiwgdXNlcl9mcmVlX2ZuKTsKLQotQWZ0ZXIgeW91IGhhdmUgdGhlc2Ugc3RydWN0dXJlcywgeW91IHdpbGwgbmVlZCB0byBzZXQgdXAgdGhlCi1lcnJvciBoYW5kbGluZy4gIFdoZW4gbGlicG5nIGVuY291bnRlcnMgYW4gZXJyb3IsIGl0IGV4cGVjdHMgdG8KLWxvbmdqbXAoKSBiYWNrIHRvIHlvdXIgcm91dGluZS4gIFRoZXJlZm9yZSwgeW91IHdpbGwgbmVlZCB0byBjYWxsCi1zZXRqbXAoKSBhbmQgcGFzcyB0aGUgcG5nX2ptcGJ1ZihwbmdfcHRyKS4gIElmIHlvdQotd3JpdGUgdGhlIGZpbGUgZnJvbSBkaWZmZXJlbnQgcm91dGluZXMsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlCi10aGUgcG5nX2ptcGJ1ZihwbmdfcHRyKSBldmVyeSB0aW1lIHlvdSBlbnRlciBhIG5ldyByb3V0aW5lIHRoYXQgd2lsbAotY2FsbCBhIHBuZ18qKCkgZnVuY3Rpb24uICBTZWUgeW91ciBkb2N1bWVudGF0aW9uIG9mIHNldGptcC9sb25nam1wCi1mb3IgeW91ciBjb21waWxlciBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzZXRqbXAvbG9uZ2ptcC4gIFNlZQotdGhlIGRpc2N1c3Npb24gb24gbGlicG5nIGVycm9yIGhhbmRsaW5nIGluIHRoZSBDdXN0b21pemluZyBMaWJwbmcKLXNlY3Rpb24gYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGxpYnBuZyBlcnJvciBoYW5kbGluZy4KLQotICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCi0gICAgewotICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKLSAgICAgICBmY2xvc2UoZnApOwotICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLSAgICAuLi4KLSAgICByZXR1cm47Ci0KLUlmIHlvdSB3b3VsZCByYXRoZXIgYXZvaWQgdGhlIGNvbXBsZXhpdHkgb2Ygc2V0am1wL2xvbmdqbXAgaXNzdWVzLAoteW91IGNhbiBjb21waWxlIGxpYnBuZyB3aXRoIFBOR19OT19TRVRKTVAsIGluIHdoaWNoIGNhc2UKLWVycm9ycyB3aWxsIHJlc3VsdCBpbiBhIGNhbGwgdG8gUE5HX0FCT1JUKCkgd2hpY2ggZGVmYXVsdHMgdG8gYWJvcnQoKS4KLQotWW91IGNhbiAjZGVmaW5lIFBOR19BQk9SVCgpIHRvIGEgZnVuY3Rpb24gdGhhdCBkb2VzIHNvbWV0aGluZwotbW9yZSB1c2VmdWwgdGhhbiBhYm9ydCgpLCBhcyBsb25nIGFzIHlvdXIgZnVuY3Rpb24gZG9lcyBub3QKLXJldHVybi4KLQotTm93IHlvdSBuZWVkIHRvIHNldCB1cCB0aGUgb3V0cHV0IGNvZGUuICBUaGUgZGVmYXVsdCBmb3IgbGlicG5nIGlzIHRvCi11c2UgdGhlIEMgZnVuY3Rpb24gZndyaXRlKCkuICBJZiB5b3UgdXNlIHRoaXMsIHlvdSB3aWxsIG5lZWQgdG8gcGFzcyBhCi12YWxpZCBGSUxFICogaW4gdGhlIGZ1bmN0aW9uIHBuZ19pbml0X2lvKCkuICBCZSBzdXJlIHRoYXQgdGhlIGZpbGUgaXMKLW9wZW5lZCBpbiBiaW5hcnkgbW9kZS4gIEFnYWluLCBpZiB5b3Ugd2lzaCB0byBoYW5kbGUgd3JpdGluZyBkYXRhIGluCi1hbm90aGVyIHdheSwgc2VlIHRoZSBkaXNjdXNzaW9uIG9uIGxpYnBuZyBJL08gaGFuZGxpbmcgaW4gdGhlIEN1c3RvbWl6aW5nCi1MaWJwbmcgc2VjdGlvbiBiZWxvdy4KLQotICAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIGZwKTsKLQotSWYgeW91IGFyZSBlbWJlZGRpbmcgeW91ciBQTkcgaW50byBhIGRhdGFzdHJlYW0gc3VjaCBhcyBNTkcsIGFuZCBkb24ndAotd2FudCBsaWJwbmcgdG8gd3JpdGUgdGhlIDgtYnl0ZSBzaWduYXR1cmUsIG9yIGlmIHlvdSBoYXZlIGFscmVhZHkKLXdyaXR0ZW4gdGhlIHNpZ25hdHVyZSBpbiB5b3VyIGFwcGxpY2F0aW9uLCB1c2UKLQotICAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIDgpOwotCi10byBpbmZvcm0gbGlicG5nIHRoYXQgaXQgc2hvdWxkIG5vdCB3cml0ZSBhIHNpZ25hdHVyZS4KLQotLlNTIFdyaXRlIGNhbGxiYWNrcwotCi1BdCB0aGlzIHBvaW50LCB5b3UgY2FuIHNldCB1cCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZQotY2FsbGVkIGFmdGVyIGVhY2ggcm93IGhhcyBiZWVuIHdyaXR0ZW4sIHdoaWNoIHlvdSBjYW4gdXNlIHRvIGNvbnRyb2wKLWEgcHJvZ3Jlc3MgbWV0ZXIgb3IgdGhlIGxpa2UuICBJdCdzIGRlbW9uc3RyYXRlZCBpbiBwbmd0ZXN0LmMuCi1Zb3UgbXVzdCBzdXBwbHkgYSBmdW5jdGlvbgotCi0gICAgdm9pZCB3cml0ZV9yb3dfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgcm93LAotICAgICAgIGludCBwYXNzKTsKLSAgICB7Ci0gICAgICAvKiBwdXQgeW91ciBjb2RlIGhlcmUgKi8KLSAgICB9Ci0KLShZb3UgY2FuIGdpdmUgaXQgYW5vdGhlciBuYW1lIHRoYXQgeW91IGxpa2UgaW5zdGVhZCBvZiAid3JpdGVfcm93X2NhbGxiYWNrIikKLQotVG8gaW5mb3JtIGxpYnBuZyBhYm91dCB5b3VyIGZ1bmN0aW9uLCB1c2UKLQotICAgIHBuZ19zZXRfd3JpdGVfc3RhdHVzX2ZuKHBuZ19wdHIsIHdyaXRlX3Jvd19jYWxsYmFjayk7Ci0KLVlvdSBub3cgaGF2ZSB0aGUgb3B0aW9uIG9mIG1vZGlmeWluZyBob3cgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgd2lsbAotcnVuLiAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG1haW5seSBmb3IgdGVzdGluZywgYnV0IG1heSBiZSB1c2VmdWwKLWluIHNvbWUgY2FzZXMsIGxpa2UgaWYgeW91IG5lZWQgdG8gd3JpdGUgUE5HIGZpbGVzIGV4dHJlbWVseSBmYXN0IGFuZAotYXJlIHdpbGxpbmcgdG8gZ2l2ZSB1cCBzb21lIGNvbXByZXNzaW9uLCBvciBpZiB5b3Ugd2FudCB0byBnZXQgdGhlCi1tYXhpbXVtIHBvc3NpYmxlIGNvbXByZXNzaW9uIGF0IHRoZSBleHBlbnNlIG9mIHNsb3dlciB3cml0aW5nLiAgSWYgeW91Ci1oYXZlIG5vIHNwZWNpYWwgbmVlZHMgaW4gdGhpcyBhcmVhLCBsZXQgdGhlIGxpYnJhcnkgZG8gd2hhdCBpdCB3YW50cyBieQotbm90IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhdCBhbGwsIGFzIGl0IGhhcyBiZWVuIHR1bmVkIHRvIGRlbGl2ZXIgYSBnb29kCi1zcGVlZC9jb21wcmVzc2lvbiByYXRpby4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gcG5nX3NldF9maWx0ZXIoKSBpcwotdGhlIGZpbHRlciBtZXRob2QsIGZvciB3aGljaCB0aGUgb25seSB2YWxpZCB2YWx1ZXMgYXJlIDAgKGFzIG9mIHRoZQotSnVseSAxOTk5IFBORyBzcGVjaWZpY2F0aW9uLCB2ZXJzaW9uIDEuMikgb3IgNjQgKGlmIHlvdSBhcmUgd3JpdGluZwotYSBQTkcgZGF0YXN0cmVhbSB0aGF0IGlzIHRvIGJlIGVtYmVkZGVkIGluIGEgTU5HIGRhdGFzdHJlYW0pLiAgVGhlIHRoaXJkCi1wYXJhbWV0ZXIgaXMgYSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGZpbHRlciB0eXBlKHMpIGFyZSB0byBiZSB0ZXN0ZWQKLWZvciBlYWNoIHNjYW5saW5lLiAgU2VlIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgc3BlY2lmaWMKLWZpbHRlciB0eXBlcy4KLQotCi0gICAgLyogdHVybiBvbiBvciBvZmYgZmlsdGVyaW5nLCBhbmQvb3IgY2hvb3NlCi0gICAgICAgc3BlY2lmaWMgZmlsdGVycy4gIFlvdSBjYW4gdXNlIGVpdGhlciBhIHNpbmdsZQotICAgICAgIFBOR19GSUxURVJfVkFMVUVfTkFNRSBvciB0aGUgYml0d2lzZSBPUiBvZiBvbmUKLSAgICAgICBvciBtb3JlIFBOR19GSUxURVJfTkFNRSBtYXNrcy4gKi8KLSAgICBwbmdfc2V0X2ZpbHRlcihwbmdfcHRyLCAwLAotICAgICAgIFBOR19GSUxURVJfTk9ORSAgfCBQTkdfRklMVEVSX1ZBTFVFX05PTkUgfAotICAgICAgIFBOR19GSUxURVJfU1VCICAgfCBQTkdfRklMVEVSX1ZBTFVFX1NVQiAgfAotICAgICAgIFBOR19GSUxURVJfVVAgICAgfCBQTkdfRklMVEVSX1ZBTFVFX1VQICAgfAotICAgICAgIFBOR19GSUxURVJfQVZHICAgfCBQTkdfRklMVEVSX1ZBTFVFX0FWRyAgfAotICAgICAgIFBOR19GSUxURVJfUEFFVEggfCBQTkdfRklMVEVSX1ZBTFVFX1BBRVRIfAotICAgICAgIFBOR19BTExfRklMVEVSUyk7Ci0KLUlmIGFuIGFwcGxpY2F0aW9uCi13YW50cyB0byBzdGFydCBhbmQgc3RvcCB1c2luZyBwYXJ0aWN1bGFyIGZpbHRlcnMgZHVyaW5nIGNvbXByZXNzaW9uLAotaXQgc2hvdWxkIHN0YXJ0IG91dCB3aXRoIGFsbCBvZiB0aGUgZmlsdGVycyAodG8gZW5zdXJlIHRoYXQgdGhlIHByZXZpb3VzCi1yb3cgb2YgcGl4ZWxzIHdpbGwgYmUgc3RvcmVkIGluIGNhc2UgaXQncyBuZWVkZWQgbGF0ZXIpLCBhbmQgdGhlbiBhZGQKLWFuZCByZW1vdmUgdGhlbSBhZnRlciB0aGUgc3RhcnQgb2YgY29tcHJlc3Npb24uCi0KLUlmIHlvdSBhcmUgd3JpdGluZyBhIFBORyBkYXRhc3RyZWFtIHRoYXQgaXMgdG8gYmUgZW1iZWRkZWQgaW4gYSBNTkcKLWRhdGFzdHJlYW0sIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGNhbiBiZSBlaXRoZXIgMCBvciA2NC4KLQotVGhlIHBuZ19zZXRfY29tcHJlc3Npb25fKigpIGZ1bmN0aW9ucyBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgY29tcHJlc3Npb24KLWxpYnJhcnksIGFuZCBzaG91bGQgbW9zdGx5IGJlIGlnbm9yZWQgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBhcmUKLWRvaW5nLiAgVGhlIG9ubHkgZ2VuZXJhbGx5IHVzZWZ1bCBjYWxsIGlzIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwoKQotd2hpY2ggY2hhbmdlcyBob3cgbXVjaCB0aW1lIHpsaWIgc3BlbmRzIG9uIHRyeWluZyB0byBjb21wcmVzcyB0aGUgaW1hZ2UKLWRhdGEuICBTZWUgdGhlIENvbXByZXNzaW9uIExpYnJhcnkgKHpsaWIuaCBhbmQgYWxnb3JpdGhtLnR4dCwgZGlzdHJpYnV0ZWQKLXdpdGggemxpYikgZm9yIGRldGFpbHMgb24gdGhlIGNvbXByZXNzaW9uIGxldmVscy4KLQotICAgIC8qIHNldCB0aGUgemxpYiBjb21wcmVzc2lvbiBsZXZlbCAqLwotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwocG5nX3B0ciwKLSAgICAgICAgWl9CRVNUX0NPTVBSRVNTSU9OKTsKLQotICAgIC8qIHNldCBvdGhlciB6bGliIHBhcmFtZXRlcnMgKi8KLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX21lbV9sZXZlbChwbmdfcHRyLCA4KTsKLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHBuZ19wdHIsCi0gICAgICAgIFpfREVGQVVMVF9TVFJBVEVHWSk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyhwbmdfcHRyLCAxNSk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QocG5nX3B0ciwgOCk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZShwbmdfcHRyLCA4MTkyKQotCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfemJ1Zl9zaXplKQotCi0uU1MgU2V0dGluZyB0aGUgY29udGVudHMgb2YgaW5mbyBmb3Igb3V0cHV0Ci0KLVlvdSBub3cgbmVlZCB0byBmaWxsIGluIHRoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgd2l0aCBhbGwgdGhlIGRhdGEgeW91Ci13aXNoIHRvIHdyaXRlIGJlZm9yZSB0aGUgYWN0dWFsIGltYWdlLiAgTm90ZSB0aGF0IHRoZSBvbmx5IHRoaW5nIHlvdQotYXJlIGFsbG93ZWQgdG8gd3JpdGUgYWZ0ZXIgdGhlIGltYWdlIGlzIHRoZSB0ZXh0IGNodW5rcyBhbmQgdGhlIHRpbWUKLWNodW5rIChhcyBvZiBQTkcgU3BlY2lmaWNhdGlvbiAxLjIsIGFueXdheSkuICBTZWUgcG5nX3dyaXRlX2VuZCgpIGFuZAotdGhlIGxhdGVzdCBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGF0LiAgSWYgeW91Ci13aXNoIHRvIHdyaXRlIHRoZW0gYmVmb3JlIHRoZSBpbWFnZSwgZmlsbCB0aGVtIGluIG5vdywgYW5kIGZsYWcgdGhhdAotZGF0YSBhcyBiZWluZyB2YWxpZC4gIElmIHlvdSB3YW50IHRvIHdhaXQgdW50aWwgYWZ0ZXIgdGhlIGRhdGEsIGRvbid0Ci1maWxsIHRoZW0gdW50aWwgcG5nX3dyaXRlX2VuZCgpLiAgRm9yIGFsbCB0aGUgZmllbGRzIGluIHBuZ19pbmZvIGFuZAotdGhlaXIgZGF0YSB0eXBlcywgc2VlIHBuZy5oLiAgRm9yIGV4cGxhbmF0aW9ucyBvZiB3aGF0IHRoZSBmaWVsZHMKLWNvbnRhaW4sIHNlZSB0aGUgUE5HIHNwZWNpZmljYXRpb24uCi0KLVNvbWUgb2YgdGhlIG1vcmUgaW1wb3J0YW50IHBhcnRzIG9mIHRoZSBwbmdfaW5mbyBhcmU6Ci0KLSAgICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgYml0X2RlcHRoLCBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZSwKLSAgICAgICBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfbWV0aG9kKQotICAgIHdpZHRoICAgICAgICAgIC0gaG9sZHMgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZQotICAgICAgICAgICAgICAgICAgICAgaW4gcGl4ZWxzICh1cCB0byAyXjMxKS4KLSAgICBoZWlnaHQgICAgICAgICAtIGhvbGRzIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlCi0gICAgICAgICAgICAgICAgICAgICBpbiBwaXhlbHMgKHVwIHRvIDJeMzEpLgotICAgIGJpdF9kZXB0aCAgICAgIC0gaG9sZHMgdGhlIGJpdCBkZXB0aCBvZiBvbmUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICBpbWFnZSBjaGFubmVscy4KLSAgICAgICAgICAgICAgICAgICAgICh2YWxpZCB2YWx1ZXMgYXJlIDEsIDIsIDQsIDgsIDE2Ci0gICAgICAgICAgICAgICAgICAgICBhbmQgZGVwZW5kIGFsc28gb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICBjb2xvcl90eXBlLiAgU2VlIGFsc28gc2lnbmlmaWNhbnQKLSAgICAgICAgICAgICAgICAgICAgIGJpdHMgKHNCSVQpIGJlbG93KS4KLSAgICBjb2xvcl90eXBlICAgICAtIGRlc2NyaWJlcyB3aGljaCBjb2xvci9hbHBoYQotICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgYXJlIHByZXNlbnQuCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9HUkFZCi0gICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyAxLCAyLCA0LCA4LCAxNikKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDgsIDE2KQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUEFMRVRURQotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgMSwgMiwgNCwgOCkKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQgotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF9kZXB0aHMgOCwgMTYpCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfZGVwdGhzIDgsIDE2KQotCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19QQUxFVFRFCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19DT0xPUgotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfQUxQSEEKLQotICAgIGludGVybGFjZV90eXBlIC0gUE5HX0lOVEVSTEFDRV9OT05FIG9yCi0gICAgICAgICAgICAgICAgICAgICBQTkdfSU5URVJMQUNFX0FEQU03Ci0gICAgY29tcHJlc3Npb25fdHlwZSAtIChtdXN0IGJlCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9ERUZBVUxUKQotICAgIGZpbHRlcl9tZXRob2QgIC0gKG11c3QgYmUgUE5HX0ZJTFRFUl9UWVBFX0RFRkFVTFQKLSAgICAgICAgICAgICAgICAgICAgIG9yLCBpZiB5b3UgYXJlIHdyaXRpbmcgYSBQTkcgdG8KLSAgICAgICAgICAgICAgICAgICAgIGJlIGVtYmVkZGVkIGluIGEgTU5HIGRhdGFzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBjYW4gYWxzbyBiZQotICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HKQotCi1JZiB5b3UgY2FsbCBwbmdfc2V0X0lIRFIoKSwgdGhlIGNhbGwgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSBvZiB0aGUKLW90aGVyIHBuZ19zZXRfKigpIGZ1bmN0aW9ucywgYmVjYXVzZSB0aGV5IG1pZ2h0IHJlcXVpcmUgYWNjZXNzIHRvIHNvbWUgb2YKLXRoZSBJSERSIHNldHRpbmdzLiAgVGhlIHJlbWFpbmluZyBwbmdfc2V0XyooKSBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZAotaW4gYW55IG9yZGVyLgotCi1JZiB5b3Ugd2lzaCwgeW91IGNhbiByZXNldCB0aGUgY29tcHJlc3Npb25fdHlwZSwgaW50ZXJsYWNlX3R5cGUsIG9yCi1maWx0ZXJfbWV0aG9kIGxhdGVyIGJ5IGNhbGxpbmcgcG5nX3NldF9JSERSKCkgYWdhaW47IGlmIHlvdSBkbyB0aGlzLCB0aGUKLXdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwgYW5kIGNvbG9yX3R5cGUgbXVzdCBiZSB0aGUgc2FtZSBpbiBlYWNoIGNhbGwuCi0KLSAgICBwbmdfc2V0X1BMVEUocG5nX3B0ciwgaW5mb19wdHIsIHBhbGV0dGUsCi0gICAgICAgbnVtX3BhbGV0dGUpOwotICAgIHBhbGV0dGUgICAgICAgIC0gdGhlIHBhbGV0dGUgZm9yIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAoYXJyYXkgb2YgcG5nX2NvbG9yKQotICAgIG51bV9wYWxldHRlICAgIC0gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHBhbGV0dGUKLQotICAgIHBuZ19zZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgZ2FtbWEpOwotICAgIGdhbW1hICAgICAgICAgIC0gdGhlIGdhbW1hIHRoZSBpbWFnZSB3YXMgY3JlYXRlZAotICAgICAgICAgICAgICAgICAgICAgYXQgKFBOR19JTkZPX2dBTUEpCi0KLSAgICBwbmdfc2V0X3NSR0IocG5nX3B0ciwgaW5mb19wdHIsIHNyZ2JfaW50ZW50KTsKLSAgICBzcmdiX2ludGVudCAgICAtIHRoZSByZW5kZXJpbmcgaW50ZW50Ci0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fc1JHQikgVGhlIHByZXNlbmNlIG9mCi0gICAgICAgICAgICAgICAgICAgICB0aGUgc1JHQiBjaHVuayBtZWFucyB0aGF0IHRoZSBwaXhlbAotICAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyBpbiB0aGUgc1JHQiBjb2xvciBzcGFjZS4KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2h1bmsgYWxzbyBpbXBsaWVzIHNwZWNpZmljCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgb2YgZ0FNQSBhbmQgY0hSTS4gIFJlbmRlcmluZwotICAgICAgICAgICAgICAgICAgICAgaW50ZW50IGlzIHRoZSBDU1MtMSBwcm9wZXJ0eSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBkZWZpbmVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICBDb2xvciBDb25zb3J0aXVtCi0gICAgICAgICAgICAgICAgICAgICAoaHR0cDovL3d3dy5jb2xvci5vcmcpLgotICAgICAgICAgICAgICAgICAgICAgSXQgY2FuIGJlIG9uZSBvZgotICAgICAgICAgICAgICAgICAgICAgUE5HX3NSR0JfSU5URU5UX1NBVFVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICBQTkdfc1JHQl9JTlRFTlRfUEVSQ0VQVFVBTCwKLSAgICAgICAgICAgICAgICAgICAgIFBOR19zUkdCX0lOVEVOVF9BQlNPTFVURSwgb3IKLSAgICAgICAgICAgICAgICAgICAgIFBOR19zUkdCX0lOVEVOVF9SRUxBVElWRS4KLQotCi0gICAgcG5nX3NldF9zUkdCX2dBTUFfYW5kX2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgc3JnYl9pbnRlbnQpOwotICAgIHNyZ2JfaW50ZW50ICAgIC0gdGhlIHJlbmRlcmluZyBpbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19zUkdCKSBUaGUgcHJlc2VuY2Ugb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICBzUkdCIGNodW5rIG1lYW5zIHRoYXQgdGhlIHBpeGVsCi0gICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIGluIHRoZSBzUkdCIGNvbG9yIHNwYWNlLgotICAgICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbHNvIGNhdXNlcyBnQU1BIGFuZAotICAgICAgICAgICAgICAgICAgICAgY0hSTSBjaHVua3Mgd2l0aCB0aGUgc3BlY2lmaWMgdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICB0aGF0IGFyZSBjb25zaXN0ZW50IHdpdGggc1JHQiB0byBiZQotICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbi4KLQotICAgIHBuZ19zZXRfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgbmFtZSwgY29tcHJlc3Npb25fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLCBwcm9mbGVuKTsKLSAgICBuYW1lICAgICAgICAgICAgIC0gVGhlIHByb2ZpbGUgbmFtZS4KLSAgICBjb21wcmVzc2lvbl90eXBlIC0gVGhlIGNvbXByZXNzaW9uIHR5cGU7IGFsd2F5cwotICAgICAgICAgICAgICAgICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFIGZvciBQTkcgMS4wLgotICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IGdpdmUgTlVMTCB0byB0aGlzIGFyZ3VtZW50IHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZSBpdC4KLSAgICBwcm9maWxlICAgICAgICAgIC0gSW50ZXJuYXRpb25hbCBDb2xvciBDb25zb3J0aXVtIGNvbG9yCi0gICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgZGF0YS4gTWF5IGNvbnRhaW4gTlVMcy4KLSAgICBwcm9mbGVuICAgICAgICAgIC0gbGVuZ3RoIG9mIHByb2ZpbGUgZGF0YSBpbiBieXRlcy4KLQotICAgIHBuZ19zZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgc2lnX2JpdCk7Ci0gICAgc2lnX2JpdCAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMgZm9yCi0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fc0JJVCkgZWFjaCBvZiB0aGUgZ3JheSwgcmVkLAotICAgICAgICAgICAgICAgICAgICAgZ3JlZW4sIGFuZCBibHVlIGNoYW5uZWxzLCB3aGljaGV2ZXIgYXJlCi0gICAgICAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBmb3IgdGhlIGdpdmVuIGNvbG9yIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgIChwbmdfY29sb3JfMTYpCi0KLSAgICBwbmdfc2V0X3RSTlMocG5nX3B0ciwgaW5mb19wdHIsIHRyYW5zX2FscGhhLAotICAgICAgIG51bV90cmFucywgdHJhbnNfY29sb3IpOwotICAgIHRyYW5zX2FscGhhICAgIC0gYXJyYXkgb2YgYWxwaGEgKHRyYW5zcGFyZW5jeSkKLSAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMgZm9yIHBhbGV0dGUgKFBOR19JTkZPX3RSTlMpCi0gICAgdHJhbnNfY29sb3IgICAgLSBncmF5bGV2ZWwgb3IgY29sb3Igc2FtcGxlIHZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgKGluIG9yZGVyIHJlZCwgZ3JlZW4sIGJsdWUpIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgc2luZ2xlIHRyYW5zcGFyZW50IGNvbG9yIGZvcgotICAgICAgICAgICAgICAgICAgICAgbm9uLXBhbGV0dGVkIGltYWdlcyAoUE5HX0lORk9fdFJOUykKLSAgICBudW1fdHJhbnMgICAgICAtIG51bWJlciBvZiB0cmFuc3BhcmVudCBlbnRyaWVzCi0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fdFJOUykKLQotICAgIHBuZ19zZXRfaElTVChwbmdfcHRyLCBpbmZvX3B0ciwgaGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19oSVNUKQotICAgIGhpc3QgICAgICAgICAgIC0gaGlzdG9ncmFtIG9mIHBhbGV0dGUgKGFycmF5IG9mCi0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNikKLQotICAgIHBuZ19zZXRfdElNRShwbmdfcHRyLCBpbmZvX3B0ciwgbW9kX3RpbWUpOwotICAgIG1vZF90aW1lICAgICAgIC0gdGltZSBpbWFnZSB3YXMgbGFzdCBtb2RpZmllZAotICAgICAgICAgICAgICAgICAgICAgKFBOR19WQUxJRF90SU1FKQotCi0gICAgcG5nX3NldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCBiYWNrZ3JvdW5kKTsKLSAgICBiYWNrZ3JvdW5kICAgICAtIGJhY2tncm91bmQgY29sb3IgKG9mIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19jb2xvcl8xNnApIChQTkdfVkFMSURfYktHRCkKLQotICAgIHBuZ19zZXRfdGV4dChwbmdfcHRyLCBpbmZvX3B0ciwgdGV4dF9wdHIsIG51bV90ZXh0KTsKLSAgICB0ZXh0X3B0ciAgICAgICAtIGFycmF5IG9mIHBuZ190ZXh0IGhvbGRpbmcgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzCi0gICAgdGV4dF9wdHJbaV0uY29tcHJlc3Npb24gLSB0eXBlIG9mIGNvbXByZXNzaW9uIHVzZWQKLSAgICAgICAgICAgICAgICAgb24gInRleHQiIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX05PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX3pUWHQKLSAgICB0ZXh0X3B0cltpXS5rZXkgICAtIGtleXdvcmQgZm9yIGNvbW1lbnQuICBNdXN0IGNvbnRhaW4KLSAgICAgICAgICAgICAgICAgMS03OSBjaGFyYWN0ZXJzLgotICAgIHRleHRfcHRyW2ldLnRleHQgIC0gdGV4dCBjb21tZW50cyBmb3IgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQuICBDYW4gYmUgTlVMTCBvciBlbXB0eS4KLSAgICB0ZXh0X3B0cltpXS50ZXh0X2xlbmd0aCAtIGxlbmd0aCBvZiB0ZXh0IHN0cmluZywKLSAgICAgICAgICAgICAgICAgYWZ0ZXIgZGVjb21wcmVzc2lvbiwgMCBmb3IgaVRYdAotICAgIHRleHRfcHRyW2ldLml0eHRfbGVuZ3RoIC0gbGVuZ3RoIG9mIGl0eHQgc3RyaW5nLAotICAgICAgICAgICAgICAgICBhZnRlciBkZWNvbXByZXNzaW9uLCAwIGZvciB0RVh0L3pUWHQKLSAgICB0ZXh0X3B0cltpXS5sYW5nICAtIGxhbmd1YWdlIG9mIGNvbW1lbnQgKE5VTEwgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSBmb3IgdW5rbm93bikuCi0gICAgdGV4dF9wdHJbaV0udHJhbnNsYXRlZF9rZXl3b3JkICAtIGtleXdvcmQgaW4gVVRGLTggKE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICBvciBlbXB0eSBmb3IgdW5rbm93bikuCi0gICAgTm90ZSB0aGF0IHRoZSBpdHh0X2xlbmd0aCwgbGFuZywgYW5kIGxhbmdfa2V5Ci0gICAgbWVtYmVycyBvZiB0aGUgdGV4dF9wdHIgc3RydWN0dXJlIG9ubHkgZXhpc3QKLSAgICB3aGVuIHRoZSBsaWJyYXJ5IGlzIGJ1aWx0IHdpdGggaVRYdCBjaHVuayBzdXBwb3J0LgotCi0gICAgbnVtX3RleHQgICAgICAgLSBudW1iZXIgb2YgY29tbWVudHMKLQotICAgIHBuZ19zZXRfc1BMVChwbmdfcHRyLCBpbmZvX3B0ciwgJnBhbGV0dGVfcHRyLAotICAgICAgIG51bV9zcGFsZXR0ZXMpOwotICAgIHBhbGV0dGVfcHRyICAgIC0gYXJyYXkgb2YgcG5nX3NQTFRfc3RydWN0IHN0cnVjdHVyZXMKLSAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHBhbGV0dGVzCi0gICAgICAgICAgICAgICAgICAgICBpbiB0aGUgaW5mbyBzdHJ1Y3R1cmUuCi0gICAgbnVtX3NwYWxldHRlcyAgLSBudW1iZXIgb2YgcGFsZXR0ZSBzdHJ1Y3R1cmVzIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICBhZGRlZC4KLQotICAgIHBuZ19zZXRfb0ZGcyhwbmdfcHRyLCBpbmZvX3B0ciwgb2Zmc2V0X3gsIG9mZnNldF95LAotICAgICAgICB1bml0X3R5cGUpOwotICAgIG9mZnNldF94ICAtIHBvc2l0aXZlIG9mZnNldCBmcm9tIHRoZSBsZWZ0Ci0gICAgICAgICAgICAgICAgICAgICBlZGdlIG9mIHRoZSBzY3JlZW4KLSAgICBvZmZzZXRfeSAgLSBwb3NpdGl2ZSBvZmZzZXQgZnJvbSB0aGUgdG9wCi0gICAgICAgICAgICAgICAgICAgICBlZGdlIG9mIHRoZSBzY3JlZW4KLSAgICB1bml0X3R5cGUgLSBQTkdfT0ZGU0VUX1BJWEVMLCBQTkdfT0ZGU0VUX01JQ1JPTUVURVIKLQotICAgIHBuZ19zZXRfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgcmVzX3gsIHJlc195LAotICAgICAgICB1bml0X3R5cGUpOwotICAgIHJlc194ICAgICAgIC0gcGl4ZWxzL3VuaXQgcGh5c2ljYWwgcmVzb2x1dGlvbgotICAgICAgICAgICAgICAgICAgaW4geCBkaXJlY3Rpb24KLSAgICByZXNfeSAgICAgICAtIHBpeGVscy91bml0IHBoeXNpY2FsIHJlc29sdXRpb24KLSAgICAgICAgICAgICAgICAgIGluIHkgZGlyZWN0aW9uCi0gICAgdW5pdF90eXBlICAgLSBQTkdfUkVTT0xVVElPTl9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgUE5HX1JFU09MVVRJT05fTUVURVIKLQotICAgIHBuZ19zZXRfc0NBTChwbmdfcHRyLCBpbmZvX3B0ciwgdW5pdCwgd2lkdGgsIGhlaWdodCkKLSAgICB1bml0ICAgICAgICAtIHBoeXNpY2FsIHNjYWxlIHVuaXRzIChhbiBpbnRlZ2VyKQotICAgIHdpZHRoICAgICAgIC0gd2lkdGggb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cwotICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLSAgICAgICAgICAgICAgICAgICh3aWR0aCBhbmQgaGVpZ2h0IGFyZSBkb3VibGVzKQotCi0gICAgcG5nX3NldF9zQ0FMX3MocG5nX3B0ciwgaW5mb19wdHIsIHVuaXQsIHdpZHRoLCBoZWlnaHQpCi0gICAgdW5pdCAgICAgICAgLSBwaHlzaWNhbCBzY2FsZSB1bml0cyAoYW4gaW50ZWdlcikKLSAgICB3aWR0aCAgICAgICAtIHdpZHRoIG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLSAgICBoZWlnaHQgICAgICAtIGhlaWdodCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCi0gICAgICAgICAgICAgICAgICh3aWR0aCBhbmQgaGVpZ2h0IGFyZSBzdHJpbmdzIGxpa2UgIjIuNTQiKQotCi0gICAgcG5nX3NldF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBpbmZvX3B0ciwgJnVua25vd25zLAotICAgICAgIG51bV91bmtub3ducykKLSAgICB1bmtub3ducyAgICAgICAgICAtIGFycmF5IG9mIHBuZ191bmtub3duX2NodW5rCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGhvbGRpbmcgdW5rbm93biBjaHVua3MKLSAgICB1bmtub3duc1tpXS5uYW1lICAtIG5hbWUgb2YgdW5rbm93biBjaHVuawotICAgIHVua25vd25zW2ldLmRhdGEgIC0gZGF0YSBvZiB1bmtub3duIGNodW5rCi0gICAgdW5rbm93bnNbaV0uc2l6ZSAgLSBzaXplIG9mIHVua25vd24gY2h1bmsncyBkYXRhCi0gICAgdW5rbm93bnNbaV0ubG9jYXRpb24gLSBwb3NpdGlvbiB0byB3cml0ZSBjaHVuayBpbiBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBkbyBub3Qgd3JpdGUgY2h1bmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19IQVZFX0lIRFI6IGJlZm9yZSBQTFRFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSEFWRV9QTFRFOiBiZWZvcmUgSURBVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0FGVEVSX0lEQVQ6IGFmdGVyIElEQVQKLQotVGhlICJsb2NhdGlvbiIgbWVtYmVyIGlzIHNldCBhdXRvbWF0aWNhbGx5IGFjY29yZGluZyB0bwotd2hhdCBwYXJ0IG9mIHRoZSBvdXRwdXQgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uCi1Zb3UgY2FuIGNoYW5nZSBpdHMgdmFsdWUgYWZ0ZXIgY2FsbGluZyBwbmdfc2V0X3Vua25vd25fY2h1bmtzKCkKLWFzIGRlbW9uc3RyYXRlZCBpbiBwbmd0ZXN0LmMuICBXaXRoaW4gZWFjaCBvZiB0aGUgImxvY2F0aW9ucyIsCi10aGUgY2h1bmtzIGFyZSBzZXF1ZW5jZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHBvc2l0aW9uIGluIHRoZQotc3RydWN0dXJlICh0aGF0IGlzLCB0aGUgdmFsdWUgb2YgImkiLCB3aGljaCBpcyB0aGUgb3JkZXIgaW4gd2hpY2gKLXRoZSBjaHVuayB3YXMgZWl0aGVyIHJlYWQgZnJvbSB0aGUgaW5wdXQgZmlsZSBvciBkZWZpbmVkIHdpdGgKLXBuZ19zZXRfdW5rbm93bl9jaHVua3MpLgotCi1BIHF1aWNrIHdvcmQgYWJvdXQgdGV4dCBhbmQgbnVtX3RleHQuICB0ZXh0IGlzIGFuIGFycmF5IG9mIHBuZ190ZXh0Ci1zdHJ1Y3R1cmVzLiAgbnVtX3RleHQgaXMgdGhlIG51bWJlciBvZiB2YWxpZCBzdHJ1Y3R1cmVzIGluIHRoZSBhcnJheS4KLUVhY2ggcG5nX3RleHQgc3RydWN0dXJlIGhvbGRzIGEgbGFuZ3VhZ2UgY29kZSwgYSBrZXl3b3JkLCBhIHRleHQgdmFsdWUsCi1hbmQgYSBjb21wcmVzc2lvbiB0eXBlLgotCi1UaGUgY29tcHJlc3Npb24gdHlwZXMgaGF2ZSB0aGUgc2FtZSB2YWxpZCBudW1iZXJzIGFzIHRoZSBjb21wcmVzc2lvbgotdHlwZXMgb2YgdGhlIGltYWdlIGRhdGEuICBDdXJyZW50bHksIHRoZSBvbmx5IHZhbGlkIG51bWJlciBpcyB6ZXJvLgotSG93ZXZlciwgeW91IGNhbiBzdG9yZSB0ZXh0IGVpdGhlciBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZCwgdW5saWtlCi1pbWFnZXMsIHdoaWNoIGFsd2F5cyBoYXZlIHRvIGJlIGNvbXByZXNzZWQuICBTbyBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUKLXRleHQgY29tcHJlc3NlZCwgc2V0IHRoZSBjb21wcmVzc2lvbiB0eXBlIHRvIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUuCi1CZWNhdXNlIHRFWHQgYW5kIHpUWHQgY2h1bmtzIGRvbid0IGhhdmUgYSBsYW5ndWFnZSBmaWVsZCwgaWYgeW91Ci1zcGVjaWZ5IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUgb3IgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdAotYW55IGxhbmd1YWdlIGNvZGUgb3IgdHJhbnNsYXRlZCBrZXl3b3JkIHdpbGwgbm90IGJlIHdyaXR0ZW4gb3V0LgotCi1VbnRpbCB0ZXh0IGdldHMgYXJvdW5kIDEwMDAgYnl0ZXMsIGl0IGlzIG5vdCB3b3J0aCBjb21wcmVzc2luZyBpdC4KLUFmdGVyIHRoZSB0ZXh0IGhhcyBiZWVuIHdyaXR0ZW4gb3V0IHRvIHRoZSBmaWxlLCB0aGUgY29tcHJlc3Npb24gdHlwZQotaXMgc2V0IHRvIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1Igb3IgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdF9XUiwKLXNvIHRoYXQgaXQgaXNuJ3Qgd3JpdHRlbiBvdXQgYWdhaW4gYXQgdGhlIGVuZCAoaW4gY2FzZSB5b3UgYXJlIGNhbGxpbmcKLXBuZ193cml0ZV9lbmQoKSB3aXRoIHRoZSBzYW1lIHN0cnVjdC4KLQotVGhlIGtleXdvcmRzIHRoYXQgYXJlIGdpdmVuIGluIHRoZSBQTkcgU3BlY2lmaWNhdGlvbiBhcmU6Ci0KLSAgICBUaXRsZSAgICAgICAgICAgIFNob3J0IChvbmUgbGluZSkgdGl0bGUgb3IKLSAgICAgICAgICAgICAgICAgICAgIGNhcHRpb24gZm9yIGltYWdlCi0gICAgQXV0aG9yICAgICAgICAgICBOYW1lIG9mIGltYWdlJ3MgY3JlYXRvcgotICAgIERlc2NyaXB0aW9uICAgICAgRGVzY3JpcHRpb24gb2YgaW1hZ2UgKHBvc3NpYmx5IGxvbmcpCi0gICAgQ29weXJpZ2h0ICAgICAgICBDb3B5cmlnaHQgbm90aWNlCi0gICAgQ3JlYXRpb24gVGltZSAgICBUaW1lIG9mIG9yaWdpbmFsIGltYWdlIGNyZWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAodXN1YWxseSBSRkMgMTEyMyBmb3JtYXQsIHNlZSBiZWxvdykKLSAgICBTb2Z0d2FyZSAgICAgICAgIFNvZnR3YXJlIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZQotICAgIERpc2NsYWltZXIgICAgICAgTGVnYWwgZGlzY2xhaW1lcgotICAgIFdhcm5pbmcgICAgICAgICAgV2FybmluZyBvZiBuYXR1cmUgb2YgY29udGVudAotICAgIFNvdXJjZSAgICAgICAgICAgRGV2aWNlIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZQotICAgIENvbW1lbnQgICAgICAgICAgTWlzY2VsbGFuZW91cyBjb21tZW50OyBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICBmcm9tIG90aGVyIGltYWdlIGZvcm1hdAotCi1UaGUga2V5d29yZC10ZXh0IHBhaXJzIHdvcmsgbGlrZSB0aGlzLiAgS2V5d29yZHMgc2hvdWxkIGJlIHNob3J0Ci1zaW1wbGUgZGVzY3JpcHRpb25zIG9mIHdoYXQgdGhlIGNvbW1lbnQgaXMgYWJvdXQuICBTb21lIHR5cGljYWwKLWtleXdvcmRzIGFyZSBmb3VuZCBpbiB0aGUgUE5HIHNwZWNpZmljYXRpb24sIGFzIGlzIHNvbWUgcmVjb21tZW5kYXRpb25zCi1vbiBrZXl3b3Jkcy4gIFlvdSBjYW4gcmVwZWF0IGtleXdvcmRzIGluIGEgZmlsZS4gIFlvdSBjYW4gZXZlbiB3cml0ZQotc29tZSB0ZXh0IGJlZm9yZSB0aGUgaW1hZ2UgYW5kIHNvbWUgYWZ0ZXIuICBGb3IgZXhhbXBsZSwgeW91IG1heSB3YW50Ci10byBwdXQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgaW1hZ2UgYmVmb3JlIHRoZSBpbWFnZSwgYnV0IGxlYXZlIHRoZQotZGlzY2xhaW1lciB1bnRpbCBhZnRlciwgc28gdmlld2VycyB3b3JraW5nIG92ZXIgbW9kZW0gY29ubmVjdGlvbnMKLWRvbid0IGhhdmUgdG8gd2FpdCBmb3IgdGhlIGRpc2NsYWltZXIgdG8gZ28gb3ZlciB0aGUgbW9kZW0gYmVmb3JlCi10aGV5IHN0YXJ0IHNlZWluZyB0aGUgaW1hZ2UuICBGaW5hbGx5LCBrZXl3b3JkcyBzaG91bGQgYmUgZnVsbAotd29yZHMsIG5vdCBhYmJyZXZpYXRpb25zLiAgS2V5d29yZHMgYW5kIHRleHQgYXJlIGluIHRoZSBJU08gODg1OS0xCi0oTGF0aW4tMSkgY2hhcmFjdGVyIHNldCAoYSBzdXBlcnNldCBvZiByZWd1bGFyIEFTQ0lJKSBhbmQgY2FuIG5vdAotY29udGFpbiBOVUwgY2hhcmFjdGVycywgYW5kIHNob3VsZCBub3QgY29udGFpbiBjb250cm9sIG9yIG90aGVyCi11bnByaW50YWJsZSBjaGFyYWN0ZXJzLiAgVG8gbWFrZSB0aGUgY29tbWVudHMgd2lkZWx5IHJlYWRhYmxlLCBzdGljawotd2l0aCBiYXNpYyBBU0NJSSwgYW5kIGF2b2lkIG1hY2hpbmUgc3BlY2lmaWMgY2hhcmFjdGVyIHNldCBleHRlbnNpb25zCi1saWtlIHRoZSBJQk0tUEMgY2hhcmFjdGVyIHNldC4gIFRoZSBrZXl3b3JkIG11c3QgYmUgcHJlc2VudCwgYnV0Ci15b3UgY2FuIGxlYXZlIG9mZiB0aGUgdGV4dCBzdHJpbmcgb24gbm9uLWNvbXByZXNzZWQgcGFpcnMuCi1Db21wcmVzc2VkIHBhaXJzIG11c3QgaGF2ZSBhIHRleHQgc3RyaW5nLCBhcyBvbmx5IHRoZSB0ZXh0IHN0cmluZwotaXMgY29tcHJlc3NlZCBhbnl3YXksIHNvIHRoZSBjb21wcmVzc2lvbiB3b3VsZCBiZSBtZWFuaW5nbGVzcy4KLQotUE5HIHN1cHBvcnRzIG1vZGlmaWNhdGlvbiB0aW1lIHZpYSB0aGUgcG5nX3RpbWUgc3RydWN0dXJlLiAgVHdvCi1jb252ZXJzaW9uIHJvdXRpbmVzIGFyZSBwcm92aWRlZCwgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBmb3IKLXRpbWVfdCBhbmQgcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0oKSBmb3Igc3RydWN0IHRtLiAgVGhlCi10aW1lX3Qgcm91dGluZSB1c2VzIGdtdGltZSgpLiAgWW91IGRvbid0IGhhdmUgdG8gdXNlIGVpdGhlciBvZgotdGhlc2UsIGJ1dCBpZiB5b3Ugd2lzaCB0byBmaWxsIGluIHRoZSBwbmdfdGltZSBzdHJ1Y3R1cmUgZGlyZWN0bHksCi15b3Ugc2hvdWxkIHByb3ZpZGUgdGhlIHRpbWUgaW4gdW5pdmVyc2FsIHRpbWUgKEdNVCkgaWYgcG9zc2libGUKLWluc3RlYWQgb2YgeW91ciBsb2NhbCB0aW1lLiAgTm90ZSB0aGF0IHRoZSB5ZWFyIG51bWJlciBpcyB0aGUgZnVsbAoteWVhciAoZS5nLiAxOTk4LCByYXRoZXIgdGhhbiA5OCAtIFBORyBpcyB5ZWFyIDIwMDAgY29tcGxpYW50ISksIGFuZAotdGhhdCBtb250aHMgc3RhcnQgd2l0aCAxLgotCi1JZiB5b3Ugd2FudCB0byBzdG9yZSB0aGUgdGltZSBvZiB0aGUgb3JpZ2luYWwgaW1hZ2UgY3JlYXRpb24sIHlvdSBzaG91bGQKLXVzZSBhIHBsYWluIHRFWHQgY2h1bmsgd2l0aCB0aGUgIkNyZWF0aW9uIFRpbWUiIGtleXdvcmQuICBUaGlzIGlzCi1uZWNlc3NhcnkgYmVjYXVzZSB0aGUgImNyZWF0aW9uIHRpbWUiIG9mIGEgUE5HIGltYWdlIGlzIHNvbWV3aGF0IHZhZ3VlLAotZGVwZW5kaW5nIG9uIHdoZXRoZXIgeW91IG1lYW4gdGhlIFBORyBmaWxlLCB0aGUgdGltZSB0aGUgaW1hZ2Ugd2FzCi1jcmVhdGVkIGluIGEgbm9uLVBORyBmb3JtYXQsIGEgc3RpbGwgcGhvdG8gZnJvbSB3aGljaCB0aGUgaW1hZ2Ugd2FzCi1zY2FubmVkLCBvciBwb3NzaWJseSB0aGUgc3ViamVjdCBtYXR0ZXIgaXRzZWxmLiAgSW4gb3JkZXIgdG8gZmFjaWxpdGF0ZQotbWFjaGluZS1yZWFkYWJsZSBkYXRlcywgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgIkNyZWF0aW9uIFRpbWUiCi10RVh0IGNodW5rIHVzZSBSRkMgMTEyMyBmb3JtYXQgZGF0ZXMgKGUuZy4gIjIyIE1heSAxOTk3IDE4OjA3OjEwIEdNVCIpLAotYWx0aG91Z2ggdGhpcyBpc24ndCBhIHJlcXVpcmVtZW50LiAgVW5saWtlIHRoZSB0SU1FIGNodW5rLCB0aGUKLSJDcmVhdGlvbiBUaW1lIiB0RVh0IGNodW5rIGlzIG5vdCBleHBlY3RlZCB0byBiZSBhdXRvbWF0aWNhbGx5IGNoYW5nZWQKLWJ5IHRoZSBzb2Z0d2FyZS4gIFRvIGZhY2lsaXRhdGUgdGhlIHVzZSBvZiBSRkMgMTEyMyBkYXRlcywgYSBmdW5jdGlvbgotcG5nX2NvbnZlcnRfdG9fcmZjMTEyMyhwbmdfdGltZXApIGlzIHByb3ZpZGVkIHRvIGNvbnZlcnQgZnJvbSBQTkcKLXRpbWUgdG8gYW4gUkZDIDExMjMgZm9ybWF0IHN0cmluZy4KLQotLlNTIFdyaXRpbmcgdW5rbm93biBjaHVua3MKLQotWW91IGNhbiB1c2UgdGhlIHBuZ19zZXRfdW5rbm93bl9jaHVua3MgZnVuY3Rpb24gdG8gcXVldWUgdXAgY2h1bmtzCi1mb3Igd3JpdGluZy4gIFlvdSBnaXZlIGl0IGEgY2h1bmsgbmFtZSwgcmF3IGRhdGEsIGFuZCBhIHNpemU7IHRoYXQncwotYWxsIHRoZXJlIGlzIHRvIGl0LiAgVGhlIGNodW5rcyB3aWxsIGJlIHdyaXR0ZW4gYnkgdGhlIG5leHQgZm9sbG93aW5nCi1wbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURSwgcG5nX3dyaXRlX2luZm8sIG9yIHBuZ193cml0ZV9lbmQgZnVuY3Rpb24uCi1BbnkgY2h1bmtzIHByZXZpb3VzbHkgcmVhZCBpbnRvIHRoZSBpbmZvIHN0cnVjdHVyZSdzIHVua25vd24tY2h1bmsKLWxpc3Qgd2lsbCBhbHNvIGJlIHdyaXR0ZW4gb3V0IGluIGEgc2VxdWVuY2UgdGhhdCBzYXRpc2ZpZXMgdGhlIFBORwotc3BlY2lmaWNhdGlvbidzIG9yZGVyaW5nIHJ1bGVzLgotCi0uU1MgVGhlIGhpZ2gtbGV2ZWwgd3JpdGUgaW50ZXJmYWNlCi0KLUF0IHRoaXMgcG9pbnQgdGhlcmUgYXJlIHR3byB3YXlzIHRvIHByb2NlZWQ7IHRocm91Z2ggdGhlIGhpZ2gtbGV2ZWwKLXdyaXRlIGludGVyZmFjZSwgb3IgdGhyb3VnaCBhIHNlcXVlbmNlIG9mIGxvdy1sZXZlbCB3cml0ZSBvcGVyYXRpb25zLgotWW91IGNhbiB1c2UgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGlmIHlvdXIgaW1hZ2UgZGF0YSBpcyBwcmVzZW50Ci1pbiB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBBbGwgZGVmaW5lZCBvdXRwdXQKLXRyYW5zZm9ybWF0aW9ucyBhcmUgcGVybWl0dGVkLCBlbmFibGVkIGJ5IHRoZSBmb2xsb3dpbmcgbWFza3MuCi0KLSAgICBQTkdfVFJBTlNGT1JNX0lERU5USVRZICAgICAgTm8gdHJhbnNmb3JtYXRpb24KLSAgICBQTkdfVFJBTlNGT1JNX1BBQ0tJTkcgICAgICAgUGFjayAxLCAyIGFuZCA0LWJpdCBzYW1wbGVzCi0gICAgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCAgICAgIENoYW5nZSBvcmRlciBvZiBwYWNrZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzIHRvIExTQiBmaXJzdAotICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX01PTk8gICBJbnZlcnQgbW9ub2Nocm9tZSBpbWFnZXMKLSAgICBQTkdfVFJBTlNGT1JNX1NISUZUICAgICAgICAgTm9ybWFsaXplIHBpeGVscyB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JJVCBkZXB0aAotICAgIFBOR19UUkFOU0ZPUk1fQkdSICAgICAgICAgICBGbGlwIFJHQiB0byBCR1IsIFJHQkEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQkdSQQotICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSAgICBGbGlwIFJHQkEgdG8gQVJHQiBvciBHQQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBBRwotICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBICBDaGFuZ2UgYWxwaGEgZnJvbSBvcGFjaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRyYW5zcGFyZW5jeQotICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4gICBCeXRlLXN3YXAgMTYtYml0IHNhbXBsZXMKLSAgICBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUiAgICAgICAgU3RyaXAgb3V0IGZpbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyAoZGVwcmVjYXRlZCkuCi0gICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQkVGT1JFIFN0cmlwIG91dCBsZWFkaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlciBieXRlcwotICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0FGVEVSICBTdHJpcCBvdXQgdHJhaWxpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbGVyIGJ5dGVzCi0KLUlmIHlvdSBoYXZlIHZhbGlkIGltYWdlIGRhdGEgaW4gdGhlIGluZm8gc3RydWN0dXJlICh5b3UgY2FuIHVzZQotcG5nX3NldF9yb3dzKCkgdG8gcHV0IGltYWdlIGRhdGEgaW4gdGhlIGluZm8gc3RydWN0dXJlKSwgc2ltcGx5IGRvIHRoaXM6Ci0KLSAgICBwbmdfd3JpdGVfcG5nKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfdHJhbnNmb3JtcywgTlVMTCkKLQotd2hlcmUgcG5nX3RyYW5zZm9ybXMgaXMgYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIHNvbWUgc2V0IG9mCi10cmFuc2Zvcm1hdGlvbiBmbGFncy4gIFRoaXMgY2FsbCBpcyBlcXVpdmFsZW50IHRvIHBuZ193cml0ZV9pbmZvKCksCi1mb2xsb3dlZCB0aGUgc2V0IG9mIHRyYW5zZm9ybWF0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIHRyYW5zZm9ybSBtYXNrLAotdGhlbiBwbmdfd3JpdGVfaW1hZ2UoKSwgYW5kIGZpbmFsbHkgcG5nX3dyaXRlX2VuZCgpLgotCi0oVGhlIGZpbmFsIHBhcmFtZXRlciBvZiB0aGlzIGNhbGwgaXMgbm90IHlldCB1c2VkLiAgU29tZWRheSBpdCBtaWdodCBwb2ludAotdG8gdHJhbnNmb3JtYXRpb24gcGFyYW1ldGVycyByZXF1aXJlZCBieSBzb21lIGZ1dHVyZSBvdXRwdXQgdHJhbnNmb3JtLikKLQotWW91IG11c3QgdXNlIHBuZ190cmFuc2Zvcm1zIGFuZCBub3QgY2FsbCBhbnkgcG5nX3NldF90cmFuc2Zvcm0oKSBmdW5jdGlvbnMKLXdoZW4geW91IHVzZSBwbmdfd3JpdGVfcG5nKCkuCi0KLS5TUyBUaGUgbG93LWxldmVsIHdyaXRlIGludGVyZmFjZQotCi1JZiB5b3UgYXJlIGdvaW5nIHRoZSBsb3ctbGV2ZWwgcm91dGUgaW5zdGVhZCwgeW91IGFyZSBub3cgcmVhZHkgdG8KLXdyaXRlIGFsbCB0aGUgZmlsZSBpbmZvcm1hdGlvbiB1cCB0byB0aGUgYWN0dWFsIGltYWdlIGRhdGEuICBZb3UgZG8KLXRoaXMgd2l0aCBhIGNhbGwgdG8gcG5nX3dyaXRlX2luZm8oKS4KLQotICAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotTm90ZSB0aGF0IHRoZXJlIGlzIG9uZSB0cmFuc2Zvcm1hdGlvbiB5b3UgbWF5IG5lZWQgdG8gZG8gYmVmb3JlCi1wbmdfd3JpdGVfaW5mbygpLiAgSW4gUE5HIGZpbGVzLCB0aGUgYWxwaGEgY2hhbm5lbCBpbiBhbiBpbWFnZSBpcyB0aGUKLWxldmVsIG9mIG9wYWNpdHkuICBJZiB5b3VyIGRhdGEgaXMgc3VwcGxpZWQgYXMgYSBsZXZlbCBvZiB0cmFuc3BhcmVuY3ksCi15b3UgY2FuIGludmVydCB0aGUgYWxwaGEgY2hhbm5lbCBiZWZvcmUgeW91IHdyaXRlIGl0LCBzbyB0aGF0IDAgaXMKLWZ1bGx5IHRyYW5zcGFyZW50IGFuZCAyNTUgKGluIDgtYml0IG9yIHBhbGV0dGVkIGltYWdlcykgb3IgNjU1MzUKLShpbiAxNi1iaXQgaW1hZ2VzKSBpcyBmdWxseSBvcGFxdWUsIHdpdGgKLQotICAgIHBuZ19zZXRfaW52ZXJ0X2FscGhhKHBuZ19wdHIpOwotCi1UaGlzIG11c3QgYXBwZWFyIGJlZm9yZSBwbmdfd3JpdGVfaW5mbygpIGluc3RlYWQgb2YgbGF0ZXIgd2l0aCB0aGUKLW90aGVyIHRyYW5zZm9ybWF0aW9ucyBiZWNhdXNlIGluIHRoZSBjYXNlIG9mIHBhbGV0dGVkIGltYWdlcyB0aGUgdFJOUwotY2h1bmsgZGF0YSBoYXMgdG8gYmUgaW52ZXJ0ZWQgYmVmb3JlIHRoZSB0Uk5TIGNodW5rIGlzIHdyaXR0ZW4uICBJZgoteW91ciBpbWFnZSBpcyBub3QgYSBwYWxldHRlZCBpbWFnZSwgdGhlIHRSTlMgZGF0YSAod2hpY2ggaW4gc3VjaCBjYXNlcwotcmVwcmVzZW50cyBhIHNpbmdsZSBjb2xvciB0byBiZSByZW5kZXJlZCBhcyB0cmFuc3BhcmVudCkgd29uJ3QgbmVlZCB0bwotYmUgY2hhbmdlZCwgYW5kIHlvdSBjYW4gc2FmZWx5IGRvIHRoaXMgdHJhbnNmb3JtYXRpb24gYWZ0ZXIgeW91cgotcG5nX3dyaXRlX2luZm8oKSBjYWxsLgotCi1JZiB5b3UgbmVlZCB0byB3cml0ZSBhIHByaXZhdGUgY2h1bmsgdGhhdCB5b3Ugd2FudCB0byBhcHBlYXIgYmVmb3JlCi10aGUgUExURSBjaHVuayB3aGVuIFBMVEUgaXMgcHJlc2VudCwgeW91IGNhbiB3cml0ZSB0aGUgUE5HIGluZm8gaW4KLXR3byBzdGVwcywgYW5kIGluc2VydCBjb2RlIHRvIHdyaXRlIHlvdXIgb3duIGNodW5rIGJldHdlZW4gdGhlbToKLQotICAgIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIGluZm9fcHRyLCAuLi4pOwotICAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotQWZ0ZXIgeW91J3ZlIHdyaXR0ZW4gdGhlIGZpbGUgaW5mb3JtYXRpb24sIHlvdSBjYW4gc2V0IHVwIHRoZSBsaWJyYXJ5Ci10byBoYW5kbGUgYW55IHNwZWNpYWwgdHJhbnNmb3JtYXRpb25zIG9mIHRoZSBpbWFnZSBkYXRhLiAgVGhlIHZhcmlvdXMKLXdheXMgdG8gdHJhbnNmb3JtIHRoZSBkYXRhIHdpbGwgYmUgZGVzY3JpYmVkIGluIHRoZSBvcmRlciB0aGF0IHRoZXkKLXNob3VsZCBvY2N1ci4gIFRoaXMgaXMgaW1wb3J0YW50LCBhcyBzb21lIG9mIHRoZXNlIGNoYW5nZSB0aGUgY29sb3IKLXR5cGUgYW5kL29yIGJpdCBkZXB0aCBvZiB0aGUgZGF0YSwgYW5kIHNvbWUgb3RoZXJzIG9ubHkgd29yayBvbgotY2VydGFpbiBjb2xvciB0eXBlcyBhbmQgYml0IGRlcHRocy4gIEV2ZW4gdGhvdWdoIGVhY2ggdHJhbnNmb3JtYXRpb24KLWNoZWNrcyB0byBzZWUgaWYgaXQgaGFzIGRhdGEgdGhhdCBpdCBjYW4gZG8gc29tZXRoaW5nIHdpdGgsIHlvdSBzaG91bGQKLW1ha2Ugc3VyZSB0byBvbmx5IGVuYWJsZSBhIHRyYW5zZm9ybWF0aW9uIGlmIGl0IHdpbGwgYmUgdmFsaWQgZm9yIHRoZQotZGF0YS4gIEZvciBleGFtcGxlLCBkb24ndCBzd2FwIHJlZCBhbmQgYmx1ZSBvbiBncmF5c2NhbGUgZGF0YS4KLQotUE5HIGZpbGVzIHN0b3JlIFJHQiBwaXhlbHMgcGFja2VkIGludG8gMyBvciA2IGJ5dGVzLiAgVGhpcyBjb2RlIHRlbGxzCi10aGUgbGlicmFyeSB0byBzdHJpcCBpbnB1dCBkYXRhIHRoYXQgaGFzIDQgb3IgOCBieXRlcyBwZXIgcGl4ZWwgZG93bgotdG8gMyBvciA2IGJ5dGVzIChvciBzdHJpcCAyIG9yIDQtYnl0ZSBncmF5c2NhbGUrZmlsbGVyIGRhdGEgdG8gMSBvciAyCi1ieXRlcyBwZXIgcGl4ZWwpLgotCi0gICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgMCwgUE5HX0ZJTExFUl9CRUZPUkUpOwotCi13aGVyZSB0aGUgMCBpcyB1bnVzZWQsIGFuZCB0aGUgbG9jYXRpb24gaXMgZWl0aGVyIFBOR19GSUxMRVJfQkVGT1JFIG9yCi1QTkdfRklMTEVSX0FGVEVSLCBkZXBlbmRpbmcgdXBvbiB3aGV0aGVyIHRoZSBmaWxsZXIgYnl0ZSBpbiB0aGUgcGl4ZWwKLWlzIHN0b3JlZCBYUkdCIG9yIFJHQlguCi0KLVBORyBmaWxlcyBwYWNrIHBpeGVscyBvZiBiaXQgZGVwdGhzIDEsIDIsIGFuZCA0IGludG8gYnl0ZXMgYXMgc21hbGwgYXMKLXRoZXkgY2FuLCByZXN1bHRpbmcgaW4sIGZvciBleGFtcGxlLCA4IHBpeGVscyBwZXIgYnl0ZSBmb3IgMSBiaXQgZmlsZXMuCi1JZiB0aGUgZGF0YSBpcyBzdXBwbGllZCBhdCAxIHBpeGVsIHBlciBieXRlLCB1c2UgdGhpcyBjb2RlLCB3aGljaCB3aWxsCi1jb3JyZWN0bHkgcGFjayB0aGUgcGl4ZWxzIGludG8gYSBzaW5nbGUgYnl0ZToKLQotICAgIHBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsKLQotUE5HIGZpbGVzIHJlZHVjZSBwb3NzaWJsZSBiaXQgZGVwdGhzIHRvIDEsIDIsIDQsIDgsIGFuZCAxNi4gIElmIHlvdXIKLWRhdGEgaXMgb2YgYW5vdGhlciBiaXQgZGVwdGgsIHlvdSBjYW4gd3JpdGUgYW4gc0JJVCBjaHVuayBpbnRvIHRoZQotZmlsZSBzbyB0aGF0IGRlY29kZXJzIGNhbiByZWNvdmVyIHRoZSBvcmlnaW5hbCBkYXRhIGlmIGRlc2lyZWQuCi0KLSAgICAvKiBTZXQgdGhlIHRydWUgYml0IGRlcHRoIG9mIHRoZSBpbWFnZSBkYXRhICovCi0gICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKLSAgICB7Ci0gICAgICAgIHNpZ19iaXQucmVkID0gdHJ1ZV9iaXRfZGVwdGg7Ci0gICAgICAgIHNpZ19iaXQuZ3JlZW4gPSB0cnVlX2JpdF9kZXB0aDsKLSAgICAgICAgc2lnX2JpdC5ibHVlID0gdHJ1ZV9iaXRfZGVwdGg7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNpZ19iaXQuZ3JheSA9IHRydWVfYml0X2RlcHRoOwotICAgIH0KLSAgICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQotICAgIHsKLSAgICAgICAgc2lnX2JpdC5hbHBoYSA9IHRydWVfYml0X2RlcHRoOwotICAgIH0KLQotICAgIHBuZ19zZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpOwotCi1JZiB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIHJvdyBidWZmZXIgaW4gYSBiaXQgZGVwdGggb3RoZXIgdGhhbgotb25lIHN1cHBvcnRlZCBieSBQTkcgKGUuZy4gMyBiaXQgZGF0YSBpbiB0aGUgcmFuZ2UgMC03IGZvciBhIDQtYml0IFBORyksCi10aGlzIHdpbGwgc2NhbGUgdGhlIHZhbHVlcyB0byBhcHBlYXIgdG8gYmUgdGhlIGNvcnJlY3QgYml0IGRlcHRoIGFzCi1pcyByZXF1aXJlZCBieSBQTkcuCi0KLSAgICBwbmdfc2V0X3NoaWZ0KHBuZ19wdHIsICZzaWdfYml0KTsKLQotUE5HIGZpbGVzIHN0b3JlIDE2IGJpdCBwaXhlbHMgaW4gbmV0d29yayBieXRlIG9yZGVyIChiaWctZW5kaWFuLAotaWUuIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBmaXJzdCkuICBUaGlzIGNvZGUgd291bGQgYmUgdXNlZCBpZiB0aGV5IGFyZQotc3VwcGxpZWQgdGhlIG90aGVyIHdheSAobGl0dGxlLWVuZGlhbiwgaS5lLiBsZWFzdCBzaWduaWZpY2FudCBiaXRzCi1maXJzdCwgdGhlIHdheSBQQ3Mgc3RvcmUgdGhlbSk6Ci0KLSAgICBpZiAoYml0X2RlcHRoID4gOCkKLSAgICAgICBwbmdfc2V0X3N3YXAocG5nX3B0cik7Ci0KLUlmIHlvdSBhcmUgdXNpbmcgcGFja2VkLXBpeGVsIGltYWdlcyAoMSwgMiwgb3IgNCBiaXRzL3BpeGVsKSwgYW5kIHlvdQotbmVlZCB0byBjaGFuZ2UgdGhlIG9yZGVyIHRoZSBwaXhlbHMgYXJlIHBhY2tlZCBpbnRvIGJ5dGVzLCB5b3UgY2FuIHVzZToKLQotICAgIGlmIChiaXRfZGVwdGggPCA4KQotICAgICAgIHBuZ19zZXRfcGFja3N3YXAocG5nX3B0cik7Ci0KLVBORyBmaWxlcyBzdG9yZSAzIGNvbG9yIHBpeGVscyBpbiByZWQsIGdyZWVuLCBibHVlIG9yZGVyLiAgVGhpcyBjb2RlCi13b3VsZCBiZSB1c2VkIGlmIHRoZXkgYXJlIHN1cHBsaWVkIGFzIGJsdWUsIGdyZWVuLCByZWQ6Ci0KLSAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsKLQotUE5HIGZpbGVzIGRlc2NyaWJlIG1vbm9jaHJvbWUgYXMgYmxhY2sgYmVpbmcgemVybyBhbmQgd2hpdGUgYmVpbmcKLW9uZS4gVGhpcyBjb2RlIHdvdWxkIGJlIHVzZWQgaWYgdGhlIHBpeGVscyBhcmUgc3VwcGxpZWQgd2l0aCB0aGlzIHJldmVyc2VkCi0oYmxhY2sgYmVpbmcgb25lIGFuZCB3aGl0ZSBiZWluZyB6ZXJvKToKLQotICAgIHBuZ19zZXRfaW52ZXJ0X21vbm8ocG5nX3B0cik7Ci0KLUZpbmFsbHksIHlvdSBjYW4gd3JpdGUgeW91ciBvd24gdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gaWYgbm9uZSBvZgotdGhlIGV4aXN0aW5nIG9uZXMgbWVldHMgeW91ciBuZWVkcy4gIFRoaXMgaXMgZG9uZSBieSBzZXR0aW5nIGEgY2FsbGJhY2sKLXdpdGgKLQotICAgIHBuZ19zZXRfd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4ocG5nX3B0ciwKLSAgICAgICB3cml0ZV90cmFuc2Zvcm1fZm4pOwotCi1Zb3UgbXVzdCBzdXBwbHkgdGhlIGZ1bmN0aW9uCi0KLSAgICB2b2lkIHdyaXRlX3RyYW5zZm9ybV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wCi0gICAgICAgcm93X2luZm8sIHBuZ19ieXRlcCBkYXRhKQotCi1TZWUgcG5ndGVzdC5jIGZvciBhIHdvcmtpbmcgZXhhbXBsZS4gIFlvdXIgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKLWJlZm9yZSBhbnkgb2YgdGhlIG90aGVyIHRyYW5zZm9ybWF0aW9ucyBhcmUgcHJvY2Vzc2VkLgotCi1Zb3UgY2FuIGFsc28gc2V0IHVwIGEgcG9pbnRlciB0byBhIHVzZXIgc3RydWN0dXJlIGZvciB1c2UgYnkgeW91cgotY2FsbGJhY2sgZnVuY3Rpb24uCi0KLSAgICBwbmdfc2V0X3VzZXJfdHJhbnNmb3JtX2luZm8ocG5nX3B0ciwgdXNlcl9wdHIsIDAsIDApOwotCi1UaGUgdXNlcl9jaGFubmVscyBhbmQgdXNlcl9kZXB0aCBwYXJhbWV0ZXJzIG9mIHRoaXMgZnVuY3Rpb24gYXJlIGlnbm9yZWQKLXdoZW4gd3JpdGluZzsgeW91IGNhbiBzZXQgdGhlbSB0byB6ZXJvIGFzIHNob3duLgotCi1Zb3UgY2FuIHJldHJpZXZlIHRoZSBwb2ludGVyIHZpYSB0aGUgZnVuY3Rpb24gcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIoKS4KLUZvciBleGFtcGxlOgotCi0gICAgdm9pZHAgd3JpdGVfdXNlcl90cmFuc2Zvcm1fcHRyID0KLSAgICAgICBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0cihwbmdfcHRyKTsKLQotSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBsaWJwbmcgZmx1c2ggYW55IHBlbmRpbmcgb3V0cHV0LCBlaXRoZXIgbWFudWFsbHksCi1vciBhdXRvbWF0aWNhbGx5IGFmdGVyIGEgY2VydGFpbiBudW1iZXIgb2YgbGluZXMgaGF2ZSBiZWVuIHdyaXR0ZW4uICBUbwotZmx1c2ggdGhlIG91dHB1dCBzdHJlYW0gYSBzaW5nbGUgdGltZSBjYWxsOgotCi0gICAgcG5nX3dyaXRlX2ZsdXNoKHBuZ19wdHIpOwotCi1hbmQgdG8gaGF2ZSBsaWJwbmcgZmx1c2ggdGhlIG91dHB1dCBzdHJlYW0gcGVyaW9kaWNhbGx5IGFmdGVyIGEgY2VydGFpbgotbnVtYmVyIG9mIHNjYW5saW5lcyBoYXZlIGJlZW4gd3JpdHRlbiwgY2FsbDoKLQotICAgIHBuZ19zZXRfZmx1c2gocG5nX3B0ciwgbnJvd3MpOwotCi1Ob3RlIHRoYXQgdGhlIGRpc3RhbmNlIGJldHdlZW4gcm93cyBpcyBmcm9tIHRoZSBsYXN0IHRpbWUgcG5nX3dyaXRlX2ZsdXNoKCkKLXdhcyBjYWxsZWQsIG9yIHRoZSBmaXJzdCByb3cgb2YgdGhlIGltYWdlIGlmIGl0IGhhcyBuZXZlciBiZWVuIGNhbGxlZC4KLVNvIGlmIHlvdSB3cml0ZSA1MCBsaW5lcywgYW5kIHRoZW4gcG5nX3NldF9mbHVzaCAyNSwgaXQgd2lsbCBmbHVzaCB0aGUKLW91dHB1dCBvbiB0aGUgbmV4dCBzY2FubGluZSwgYW5kIGV2ZXJ5IDI1IGxpbmVzIHRoZXJlYWZ0ZXIsIHVubGVzcwotcG5nX3dyaXRlX2ZsdXNoKCkgaXMgY2FsbGVkIGJlZm9yZSAyNSBtb3JlIGxpbmVzIGhhdmUgYmVlbiB3cml0dGVuLgotSWYgbnJvd3MgaXMgdG9vIHNtYWxsIChsZXNzIHRoYW4gYWJvdXQgMTAgbGluZXMgZm9yIGEgNjQwIHBpeGVsIHdpZGUKLVJHQiBpbWFnZSkgdGhlIGltYWdlIGNvbXByZXNzaW9uIG1heSBkZWNyZWFzZSBub3RpY2VhYmx5IChhbHRob3VnaCB0aGlzCi1tYXkgYmUgYWNjZXB0YWJsZSBmb3IgcmVhbC10aW1lIGFwcGxpY2F0aW9ucykuICBJbmZyZXF1ZW50IGZsdXNoaW5nIHdpbGwKLW9ubHkgZGVncmFkZSB0aGUgY29tcHJlc3Npb24gcGVyZm9ybWFuY2UgYnkgYSBmZXcgcGVyY2VudCBvdmVyIGltYWdlcwotdGhhdCBkbyBub3QgdXNlIGZsdXNoaW5nLgotCi0uU1MgV3JpdGluZyB0aGUgaW1hZ2UgZGF0YQotCi1UaGF0J3MgaXQgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbnMuICBOb3cgeW91IGNhbiB3cml0ZSB0aGUgaW1hZ2UgZGF0YS4KLVRoZSBzaW1wbGVzdCB3YXkgdG8gZG8gdGhpcyBpcyBpbiBvbmUgZnVuY3Rpb24gY2FsbC4gIElmIHlvdSBoYXZlIHRoZQotd2hvbGUgaW1hZ2UgaW4gbWVtb3J5LCB5b3UgY2FuIGp1c3QgY2FsbCBwbmdfd3JpdGVfaW1hZ2UoKSBhbmQgbGlicG5nCi13aWxsIHdyaXRlIHRoZSBpbWFnZS4gIFlvdSB3aWxsIG5lZWQgdG8gcGFzcyBpbiBhbiBhcnJheSBvZiBwb2ludGVycyB0bwotZWFjaCByb3cuICBUaGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgaGFuZGxlcyBpbnRlcmxhY2luZywgc28geW91IGRvbid0Ci1uZWVkIHRvIGNhbGwgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSBvciBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUKLXRpbWVzLCBvciBhbnkgb2YgdGhhdCBvdGhlciBzdHVmZiBuZWNlc3Nhcnkgd2l0aCBwbmdfd3JpdGVfcm93cygpLgotCi0gICAgcG5nX3dyaXRlX2ltYWdlKHBuZ19wdHIsIHJvd19wb2ludGVycyk7Ci0KLXdoZXJlIHJvd19wb2ludGVycyBpczoKLQotICAgIHBuZ19ieXRlICpyb3dfcG9pbnRlcnNbaGVpZ2h0XTsKLQotWW91IGNhbiBwb2ludCB0byB2b2lkIG9yIGNoYXIgb3Igd2hhdGV2ZXIgeW91IHVzZSBmb3IgcGl4ZWxzLgotCi1JZiB5b3UgZG9uJ3Qgd2FudCB0byB3cml0ZSB0aGUgd2hvbGUgaW1hZ2UgYXQgb25jZSwgeW91IGNhbgotdXNlIHBuZ193cml0ZV9yb3dzKCkgaW5zdGVhZC4gIElmIHRoZSBmaWxlIGlzIG5vdCBpbnRlcmxhY2VkLAotdGhpcyBpcyBzaW1wbGU6Ci0KLSAgICBwbmdfd3JpdGVfcm93cyhwbmdfcHRyLCByb3dfcG9pbnRlcnMsCi0gICAgICAgbnVtYmVyX29mX3Jvd3MpOwotCi1yb3dfcG9pbnRlcnMgaXMgdGhlIHNhbWUgYXMgaW4gdGhlIHBuZ193cml0ZV9pbWFnZSgpIGNhbGwuCi0KLUlmIHlvdSBhcmUganVzdCB3cml0aW5nIG9uZSByb3cgYXQgYSB0aW1lLCB5b3UgY2FuIGRvIHRoaXMgd2l0aAotYSBzaW5nbGUgcm93X3BvaW50ZXIgaW5zdGVhZCBvZiBhbiBhcnJheSBvZiByb3dfcG9pbnRlcnM6Ci0KLSAgICBwbmdfYnl0ZXAgcm93X3BvaW50ZXIgPSByb3c7Ci0KLSAgICBwbmdfd3JpdGVfcm93KHBuZ19wdHIsIHJvd19wb2ludGVyKTsKLQotV2hlbiB0aGUgZmlsZSBpcyBpbnRlcmxhY2VkLCB0aGluZ3MgY2FuIGdldCBhIGdvb2QgZGVhbCBtb3JlIGNvbXBsaWNhdGVkLgotVGhlIG9ubHkgY3VycmVudGx5IChhcyBvZiB0aGUgUE5HIFNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjIsIGRhdGVkIEp1bHkKLTE5OTkpIGRlZmluZWQgaW50ZXJsYWNpbmcgc2NoZW1lIGZvciBQTkcgZmlsZXMgaXMgdGhlICJBZGFtNyIgaW50ZXJsYWNlCi1zY2hlbWUsIHRoYXQgYnJlYWtzIGRvd24gYW4gaW1hZ2UgaW50byBzZXZlbiBzbWFsbGVyIGltYWdlcyBvZiB2YXJ5aW5nCi1zaXplLiAgbGlicG5nIHdpbGwgYnVpbGQgdGhlc2UgaW1hZ2VzIGZvciB5b3UsIG9yIHlvdSBjYW4gZG8gdGhlbQoteW91cnNlbGYuICBJZiB5b3Ugd2FudCB0byBidWlsZCB0aGVtIHlvdXJzZWxmLCBzZWUgdGhlIFBORyBzcGVjaWZpY2F0aW9uCi1mb3IgZGV0YWlscyBvZiB3aGljaCBwaXhlbHMgdG8gd3JpdGUgd2hlbi4KLQotSWYgeW91IGRvbid0IHdhbnQgbGlicG5nIHRvIGhhbmRsZSB0aGUgaW50ZXJsYWNpbmcgZGV0YWlscywganVzdAotdXNlIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCkgYW5kIGNhbGwgcG5nX3dyaXRlX3Jvd3MoKSB0aGUKLWNvcnJlY3QgbnVtYmVyIG9mIHRpbWVzIHRvIHdyaXRlIGFsbCBzZXZlbiBzdWItaW1hZ2VzLgotCi1JZiB5b3Ugd2FudCBsaWJwbmcgdG8gYnVpbGQgdGhlIHN1Yi1pbWFnZXMsIGNhbGwgdGhpcyBiZWZvcmUgeW91IHN0YXJ0Ci13cml0aW5nIGFueSByb3dzOgotCi0gICAgbnVtYmVyX29mX3Bhc3NlcyA9Ci0gICAgICAgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7Ci0KLVRoaXMgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBwYXNzZXMgbmVlZGVkLiAgQ3VycmVudGx5LCB0aGlzIGlzIHNldmVuLAotYnV0IG1heSBjaGFuZ2UgaWYgYW5vdGhlciBpbnRlcmxhY2UgdHlwZSBpcyBhZGRlZC4KLQotVGhlbiB3cml0ZSB0aGUgY29tcGxldGUgaW1hZ2UgbnVtYmVyX29mX3Bhc3NlcyB0aW1lcy4KLQotICAgIHBuZ193cml0ZV9yb3dzKHBuZ19wdHIsIHJvd19wb2ludGVycywKLSAgICAgICBudW1iZXJfb2Zfcm93cyk7Ci0KLUFzIHNvbWUgb2YgdGhlc2Ugcm93cyBhcmUgbm90IHVzZWQsIGFuZCB0aHVzIHJldHVybiBpbW1lZGlhdGVseSwgeW91IG1heQotd2FudCB0byByZWFkIGFib3V0IGludGVybGFjaW5nIGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgYW5kIG9ubHkgdXBkYXRlCi10aGUgcm93cyB0aGF0IGFyZSBhY3R1YWxseSB1c2VkLgotCi0uU1MgRmluaXNoaW5nIGEgc2VxdWVudGlhbCB3cml0ZQotCi1BZnRlciB5b3UgYXJlIGZpbmlzaGVkIHdyaXRpbmcgdGhlIGltYWdlLCB5b3Ugc2hvdWxkIGZpbmlzaCB3cml0aW5nCi10aGUgZmlsZS4gIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB3cml0aW5nIGNvbW1lbnRzIG9yIHRpbWUsIHlvdSBzaG91bGQKLXBhc3MgYW4gYXBwcm9wcmlhdGVseSBmaWxsZWQgcG5nX2luZm8gcG9pbnRlci4gIElmIHlvdSBhcmUgbm90IGludGVyZXN0ZWQsCi15b3UgY2FuIHBhc3MgTlVMTC4KLQotICAgIHBuZ193cml0ZV9lbmQocG5nX3B0ciwgaW5mb19wdHIpOwotCi1XaGVuIHlvdSBhcmUgZG9uZSwgeW91IGNhbiBmcmVlIGFsbCBtZW1vcnkgdXNlZCBieSBsaWJwbmcgbGlrZSB0aGlzOgotCi0gICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIpOwotCi1JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGluZGl2aWR1YWxseSBmcmVlIHRoZSBpbmZvX3B0ciBtZW1iZXJzIHRoYXQKLXBvaW50IHRvIGxpYnBuZy1hbGxvY2F0ZWQgc3RvcmFnZSB3aXRoIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246Ci0KLSAgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBtYXNrLCBzZXEpCi0gICAgbWFzayAgLSBpZGVudGlmaWVzIGRhdGEgdG8gYmUgZnJlZWQsIGEgbWFzawotICAgICAgICAgICAgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiBvbmUgb3IKLSAgICAgICAgICAgIG1vcmUgb2YKLSAgICAgICAgICAgICAgUE5HX0ZSRUVfUExURSwgUE5HX0ZSRUVfVFJOUywKLSAgICAgICAgICAgICAgUE5HX0ZSRUVfSElTVCwgUE5HX0ZSRUVfSUNDUCwKLSAgICAgICAgICAgICAgUE5HX0ZSRUVfUENBTCwgUE5HX0ZSRUVfUk9XUywKLSAgICAgICAgICAgICAgUE5HX0ZSRUVfU0NBTCwgUE5HX0ZSRUVfU1BMVCwKLSAgICAgICAgICAgICAgUE5HX0ZSRUVfVEVYVCwgUE5HX0ZSRUVfVU5LTiwKLSAgICAgICAgICAgIG9yIHNpbXBseSBQTkdfRlJFRV9BTEwKLSAgICBzZXEgICAtIHNlcXVlbmNlIG51bWJlciBvZiBpdGVtIHRvIGJlIGZyZWVkCi0gICAgICAgICAgICAoLTEgZm9yIGFsbCBpdGVtcykKLQotVGhpcyBmdW5jdGlvbiBtYXkgYmUgc2FmZWx5IGNhbGxlZCB3aGVuIHRoZSByZWxldmFudCBzdG9yYWdlIGhhcwotYWxyZWFkeSBiZWVuIGZyZWVkLCBvciBoYXMgbm90IHlldCBiZWVuIGFsbG9jYXRlZCwgb3Igd2FzIGFsbG9jYXRlZAotYnkgdGhlIHVzZXIgIGFuZCBub3QgYnkgbGlicG5nLCAgYW5kIHdpbGwgaW4gdGhvc2UgY2FzZXMgZG8gbm90aGluZy4KLVRoZSAic2VxIiBwYXJhbWV0ZXIgaXMgaWdub3JlZCBpZiBvbmx5IG9uZSBpdGVtIG9mIHRoZSBzZWxlY3RlZCBkYXRhCi10eXBlLCBzdWNoIGFzIFBMVEUsIGlzIGFsbG93ZWQuICBJZiAic2VxIiBpcyBub3QgLTEsIGFuZCBtdWx0aXBsZSBpdGVtcwotYXJlIGFsbG93ZWQgZm9yIHRoZSBkYXRhIHR5cGUgaWRlbnRpZmllZCBpbiB0aGUgbWFzaywgc3VjaCBhcyB0ZXh0IG9yCi1zUExULCBvbmx5IHRoZSBuJ3RoIGl0ZW0gaW4gdGhlIHN0cnVjdHVyZSBpcyBmcmVlZCwgd2hlcmUgbiBpcyAic2VxIi4KLQotSWYgeW91IGFsbG9jYXRlZCBkYXRhIHN1Y2ggYXMgYSBwYWxldHRlIHRoYXQgeW91IHBhc3NlZCBpbiB0byBsaWJwbmcKLXdpdGggcG5nX3NldF8qLCB5b3UgbXVzdCBub3QgZnJlZSBpdCB1bnRpbCBqdXN0IGJlZm9yZSB0aGUgY2FsbCB0bwotcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCkuCi0KLVRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIG9ubHkgdG8gZnJlZSBkYXRhIHRoYXQgd2FzIGFsbG9jYXRlZCBpbnRlcm5hbGx5Ci1ieSBsaWJwbmcuICBUaGlzIGNhbiBiZSBjaGFuZ2VkLCBzbyB0aGF0IGxpYnBuZyB3aWxsIG5vdCBmcmVlIHRoZSBkYXRhLAotb3Igc28gdGhhdCBpdCB3aWxsIGZyZWUgZGF0YSB0aGF0IHdhcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIgd2l0aCBwbmdfbWFsbG9jKCkKLW9yIHBuZ196YWxsb2MoKSBhbmQgcGFzc2VkIGluIHZpYSBhIHBuZ19zZXRfKigpIGZ1bmN0aW9uLCB3aXRoCi0KLSAgICBwbmdfZGF0YV9mcmVlcihwbmdfcHRyLCBpbmZvX3B0ciwgZnJlZXIsIG1hc2spCi0gICAgbWFzayAgIC0gd2hpY2ggZGF0YSBlbGVtZW50cyBhcmUgYWZmZWN0ZWQKLSAgICAgICAgICAgICBzYW1lIGNob2ljZXMgYXMgaW4gcG5nX2ZyZWVfZGF0YSgpCi0gICAgZnJlZXIgIC0gb25lIG9mCi0gICAgICAgICAgICAgICBQTkdfREVTVFJPWV9XSUxMX0ZSRUVfREFUQQotICAgICAgICAgICAgICAgUE5HX1NFVF9XSUxMX0ZSRUVfREFUQQotICAgICAgICAgICAgICAgUE5HX1VTRVJfV0lMTF9GUkVFX0RBVEEKLQotRm9yIGV4YW1wbGUsIHRvIHRyYW5zZmVyIHJlc3BvbnNpYmlsaXR5IGZvciBzb21lIGRhdGEgZnJvbSBhIHJlYWQgc3RydWN0dXJlCi10byBhIHdyaXRlIHN0cnVjdHVyZSwgeW91IGNvdWxkIHVzZQotCi0gICAgcG5nX2RhdGFfZnJlZXIocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsCi0gICAgICAgUE5HX1VTRVJfV0lMTF9GUkVFX0RBVEEsCi0gICAgICAgUE5HX0ZSRUVfUExURXxQTkdfRlJFRV90Uk5TfFBOR19GUkVFX2hJU1QpCi0gICAgcG5nX2RhdGFfZnJlZXIod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwKLSAgICAgICBQTkdfREVTVFJPWV9XSUxMX0ZSRUVfREFUQSwKLSAgICAgICBQTkdfRlJFRV9QTFRFfFBOR19GUkVFX3RSTlN8UE5HX0ZSRUVfaElTVCkKLQotdGhlcmVieSBicmllZmx5IHJlYXNzaWduaW5nIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlaW5nIHRvIHRoZSB1c2VyIGJ1dAotaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkcyByZWFzc2lnbmluZyBpdCBvbmNlIG1vcmUgdG8gdGhlIHdyaXRlX2Rlc3Ryb3kKLWZ1bmN0aW9uLiAgSGF2aW5nIGRvbmUgdGhpcywgaXQgd291bGQgdGhlbiBiZSBzYWZlIHRvIGRlc3Ryb3kgdGhlIHJlYWQKLXN0cnVjdHVyZSBhbmQgY29udGludWUgdG8gdXNlIHRoZSBQTFRFLCB0Uk5TLCBhbmQgaElTVCBkYXRhIGluIHRoZSB3cml0ZQotc3RydWN0dXJlLgotCi1UaGlzIGZ1bmN0aW9uIG9ubHkgYWZmZWN0cyBkYXRhIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQuCi1Zb3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgY2FsbGluZyBhZnRlciB0aGUgcG5nX3NldF8qKCkgZnVuY3Rpb25zCi10byBjb250cm9sIHdoZXRoZXIgdGhlIHVzZXIgb3IgcG5nX2Rlc3Ryb3lfKigpIGlzIHN1cHBvc2VkIHRvIGZyZWUgdGhlIGRhdGEuCi1XaGVuIHRoZSB1c2VyIGFzc3VtZXMgcmVzcG9uc2liaWxpdHkgZm9yIGxpYnBuZy1hbGxvY2F0ZWQgZGF0YSwgdGhlCi1hcHBsaWNhdGlvbiBtdXN0IHVzZQotcG5nX2ZyZWUoKSB0byBmcmVlIGl0LCBhbmQgd2hlbiB0aGUgdXNlciB0cmFuc2ZlcnMgcmVzcG9uc2liaWxpdHkgdG8gbGlicG5nCi1mb3IgZGF0YSB0aGF0IHRoZSB1c2VyIGhhcyBhbGxvY2F0ZWQsIHRoZSB1c2VyIG11c3QgaGF2ZSB1c2VkIHBuZ19tYWxsb2MoKQotb3IgcG5nX3phbGxvYygpIHRvIGFsbG9jYXRlIGl0LgotCi1JZiB5b3UgYWxsb2NhdGVkIHRleHRfcHRyLnRleHQsIHRleHRfcHRyLmxhbmcsIGFuZCB0ZXh0X3B0ci50cmFuc2xhdGVkX2tleXdvcmQKLXNlcGFyYXRlbHksIGRvIG5vdCB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyB0ZXh0X3B0ciB0byBsaWJwbmcsCi1iZWNhdXNlIHdoZW4gbGlicG5nIGZpbGxzIGEgcG5nX3RleHQgc3RydWN0dXJlIGl0IGNvbWJpbmVzIHRoZXNlIG1lbWJlcnMgd2l0aAotdGhlIGtleSBtZW1iZXIsIGFuZCBwbmdfZnJlZV9kYXRhKCkgd2lsbCBmcmVlIG9ubHkgdGV4dF9wdHIua2V5LiAgU2ltaWxhcmx5LAotaWYgeW91IHRyYW5zZmVyIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlJ2luZyB0ZXh0X3B0ciBmcm9tIGxpYnBuZyB0byB5b3VyCi1hcHBsaWNhdGlvbiwgeW91ciBhcHBsaWNhdGlvbiBtdXN0IG5vdCBzZXBhcmF0ZWx5IGZyZWUgdGhvc2UgbWVtYmVycy4KLUZvciBhIG1vcmUgY29tcGFjdCBleGFtcGxlIG9mIHdyaXRpbmcgYSBQTkcgaW1hZ2UsIHNlZSB0aGUgZmlsZSBleGFtcGxlLmMuCi0KLS5TSCBWLiBNb2RpZnlpbmcvQ3VzdG9taXppbmcgbGlicG5nOgotCi1UaGVyZSBhcmUgdHdvIGlzc3VlcyBoZXJlLiAgVGhlIGZpcnN0IGlzIGNoYW5naW5nIGhvdyBsaWJwbmcgZG9lcwotc3RhbmRhcmQgdGhpbmdzIGxpa2UgbWVtb3J5IGFsbG9jYXRpb24sIGlucHV0L291dHB1dCwgYW5kIGVycm9yIGhhbmRsaW5nLgotVGhlIHNlY29uZCBkZWFscyB3aXRoIG1vcmUgY29tcGxpY2F0ZWQgdGhpbmdzIGxpa2UgYWRkaW5nIG5ldyBjaHVua3MsCi1hZGRpbmcgbmV3IHRyYW5zZm9ybWF0aW9ucywgYW5kIGdlbmVyYWxseSBjaGFuZ2luZyBob3cgbGlicG5nIHdvcmtzLgotQm90aCBvZiB0aG9zZSBhcmUgY29tcGlsZS10aW1lIGlzc3VlczsgdGhhdCBpcywgdGhleSBhcmUgZ2VuZXJhbGx5Ci1kZXRlcm1pbmVkIGF0IHRoZSB0aW1lIHRoZSBjb2RlIGlzIHdyaXR0ZW4sIGFuZCB0aGVyZSBpcyByYXJlbHkgYSBuZWVkCi10byBwcm92aWRlIHRoZSB1c2VyIHdpdGggYSBtZWFucyBvZiBjaGFuZ2luZyB0aGVtLgotCi1NZW1vcnkgYWxsb2NhdGlvbiwgaW5wdXQvb3V0cHV0LCBhbmQgZXJyb3IgaGFuZGxpbmcKLQotQWxsIG9mIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiwgaW5wdXQvb3V0cHV0LCBhbmQgZXJyb3IgaGFuZGxpbmcgaW4gbGlicG5nCi1nb2VzIHRocm91Z2ggY2FsbGJhY2tzIHRoYXQgYXJlIHVzZXItc2V0dGFibGUuICBUaGUgZGVmYXVsdCByb3V0aW5lcyBhcmUKLWluIHBuZ21lbS5jLCBwbmdyaW8uYywgcG5nd2lvLmMsIGFuZCBwbmdlcnJvci5jLCByZXNwZWN0aXZlbHkuICBUbyBjaGFuZ2UKLXRoZXNlIGZ1bmN0aW9ucywgY2FsbCB0aGUgYXBwcm9wcmlhdGUgcG5nX3NldF8qX2ZuKCkgZnVuY3Rpb24uCi0KLU1lbW9yeSBhbGxvY2F0aW9uIGlzIGRvbmUgdGhyb3VnaCB0aGUgZnVuY3Rpb25zIHBuZ19tYWxsb2MoKSwgcG5nX2NhbGxvYygpLAotYW5kIHBuZ19mcmVlKCkuICBUaGVzZSBjdXJyZW50bHkganVzdCBjYWxsIHRoZSBzdGFuZGFyZCBDIGZ1bmN0aW9ucy4KLXBuZ19jYWxsb2MoKSBjYWxscyBwbmdfbWFsbG9jKCkgYW5kIHRoZW4gcG5nX21lbXNldCgpIHRvIGNsZWFyIHRoZSBuZXdseQotYWxsb2NhdGVkIG1lbW9yeSB0byB6ZXJvLiAgSWYgeW91ciBwb2ludGVycyBjYW4ndCBhY2Nlc3MgbW9yZSB0aGVuIDY0SwotYXQgYSB0aW1lLCB5b3Ugd2lsbCB3YW50IHRvIHNldCBNQVhTRUdfNjRLIGluIHpsaWIuaC4gIFNpbmNlIGl0IGlzCi11bmxpa2VseSB0aGF0IHRoZSBtZXRob2Qgb2YgaGFuZGxpbmcgbWVtb3J5IGFsbG9jYXRpb24gb24gYSBwbGF0Zm9ybQotd2lsbCBjaGFuZ2UgYmV0d2VlbiBhcHBsaWNhdGlvbnMsIHRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIG1vZGlmaWVkIGluCi10aGUgbGlicmFyeSBhdCBjb21waWxlIHRpbWUuICBJZiB5b3UgcHJlZmVyIHRvIHVzZSBhIGRpZmZlcmVudCBtZXRob2QKLW9mIGFsbG9jYXRpbmcgYW5kIGZyZWVpbmcgZGF0YSwgeW91IGNhbiB1c2UgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCkgb3IKLXBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIoKSB0byByZWdpc3RlciB5b3VyIG93biBmdW5jdGlvbnMgYXMgZGVzY3JpYmVkCi1hYm92ZS4gIFRoZXNlIGZ1bmN0aW9ucyBhbHNvIHByb3ZpZGUgYSB2b2lkIHBvaW50ZXIgdGhhdCBjYW4gYmUgcmV0cmlldmVkCi12aWEKLQotICAgIG1lbV9wdHI9cG5nX2dldF9tZW1fcHRyKHBuZ19wdHIpOwotCi1Zb3VyIHJlcGxhY2VtZW50IG1lbW9yeSBmdW5jdGlvbnMgbXVzdCBoYXZlIHByb3RvdHlwZXMgYXMgZm9sbG93czoKLQotICAgIHBuZ192b2lkcCBtYWxsb2NfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpOwotICAgIHZvaWQgZnJlZV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgcHRyKTsKLQotWW91ciBtYWxsb2NfZm4oKSBtdXN0IHJldHVybiBOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZS4gIFRoZSBwbmdfbWFsbG9jKCkKLWZ1bmN0aW9uIHdpbGwgbm9ybWFsbHkgY2FsbCBwbmdfZXJyb3IoKSBpZiBpdCByZWNlaXZlcyBhIE5VTEwgZnJvbSB0aGUKLXN5c3RlbSBtZW1vcnkgYWxsb2NhdG9yIG9yIGZyb20geW91ciByZXBsYWNlbWVudCBtYWxsb2NfZm4oKS4KLQotWW91ciBmcmVlX2ZuKCkgd2lsbCBuZXZlciBiZSBjYWxsZWQgd2l0aCBhIE5VTEwgcHRyLCBzaW5jZSBsaWJwbmcncwotcG5nX2ZyZWUoKSBjaGVja3MgZm9yIE5VTEwgYmVmb3JlIGNhbGxpbmcgZnJlZV9mbigpLgotCi1JbnB1dC9PdXRwdXQgaW4gbGlicG5nIGlzIGRvbmUgdGhyb3VnaCBwbmdfcmVhZCgpIGFuZCBwbmdfd3JpdGUoKSwKLXdoaWNoIGN1cnJlbnRseSBqdXN0IGNhbGwgZnJlYWQoKSBhbmQgZndyaXRlKCkuICBUaGUgRklMRSAqIGlzIHN0b3JlZCBpbgotcG5nX3N0cnVjdCBhbmQgaXMgaW5pdGlhbGl6ZWQgdmlhIHBuZ19pbml0X2lvKCkuICBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UKLXRoZSBtZXRob2Qgb2YgSS9PLCB0aGUgbGlicmFyeSBzdXBwbGllcyBjYWxsYmFja3MgdGhhdCB5b3UgY2FuIHNldAotdGhyb3VnaCB0aGUgZnVuY3Rpb24gcG5nX3NldF9yZWFkX2ZuKCkgYW5kIHBuZ19zZXRfd3JpdGVfZm4oKSBhdCBydW4KLXRpbWUsIGluc3RlYWQgb2YgY2FsbGluZyB0aGUgcG5nX2luaXRfaW8oKSBmdW5jdGlvbi4gIFRoZXNlIGZ1bmN0aW9ucwotYWxzbyBwcm92aWRlIGEgdm9pZCBwb2ludGVyIHRoYXQgY2FuIGJlIHJldHJpZXZlZCB2aWEgdGhlIGZ1bmN0aW9uCi1wbmdfZ2V0X2lvX3B0cigpLiAgRm9yIGV4YW1wbGU6Ci0KLSAgICBwbmdfc2V0X3JlYWRfZm4ocG5nX3N0cnVjdHAgcmVhZF9wdHIsCi0gICAgICAgIHZvaWRwIHJlYWRfaW9fcHRyLCBwbmdfcndfcHRyIHJlYWRfZGF0YV9mbikKLQotICAgIHBuZ19zZXRfd3JpdGVfZm4ocG5nX3N0cnVjdHAgd3JpdGVfcHRyLAotICAgICAgICB2b2lkcCB3cml0ZV9pb19wdHIsIHBuZ19yd19wdHIgd3JpdGVfZGF0YV9mbiwKLSAgICAgICAgcG5nX2ZsdXNoX3B0ciBvdXRwdXRfZmx1c2hfZm4pOwotCi0gICAgdm9pZHAgcmVhZF9pb19wdHIgPSBwbmdfZ2V0X2lvX3B0cihyZWFkX3B0cik7Ci0gICAgdm9pZHAgd3JpdGVfaW9fcHRyID0gcG5nX2dldF9pb19wdHIod3JpdGVfcHRyKTsKLQotVGhlIHJlcGxhY2VtZW50IEkvTyBmdW5jdGlvbnMgbXVzdCBoYXZlIHByb3RvdHlwZXMgYXMgZm9sbG93czoKLQotICAgIHZvaWQgdXNlcl9yZWFkX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICAgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKTsKLSAgICB2b2lkIHVzZXJfd3JpdGVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpOwotICAgIHZvaWQgdXNlcl9mbHVzaF9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpOwotCi1UaGUgdXNlcl9yZWFkX2RhdGEoKSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZWN0aW5nIGFuZAotaGFuZGxpbmcgZW5kLW9mLWRhdGEgZXJyb3JzLgotCi1TdXBwbHlpbmcgTlVMTCBmb3IgdGhlIHJlYWQsIHdyaXRlLCBvciBmbHVzaCBmdW5jdGlvbnMgc2V0cyB0aGVtIGJhY2sKLXRvIHVzaW5nIHRoZSBkZWZhdWx0IEMgc3RyZWFtIGZ1bmN0aW9ucywgd2hpY2ggZXhwZWN0IHRoZSBpb19wdHIgdG8KLXBvaW50IHRvIGEgc3RhbmRhcmQgKkZJTEUgc3RydWN0dXJlLiAgSXQgaXMgcHJvYmFibHkgYSBtaXN0YWtlCi10byB1c2UgTlVMTCBmb3Igb25lIG9mIHdyaXRlX2RhdGFfZm4gYW5kIG91dHB1dF9mbHVzaF9mbiBidXQgbm90IGJvdGgKLW9mIHRoZW0sIHVubGVzcyB5b3UgaGF2ZSBidWlsdCBsaWJwbmcgd2l0aCBQTkdfTk9fV1JJVEVfRkxVU0ggZGVmaW5lZC4KLUl0IGlzIGFuIGVycm9yIHRvIHJlYWQgZnJvbSBhIHdyaXRlIHN0cmVhbSwgYW5kIHZpY2UgdmVyc2EuCi0KLUVycm9yIGhhbmRsaW5nIGluIGxpYnBuZyBpcyBkb25lIHRocm91Z2ggcG5nX2Vycm9yKCkgYW5kIHBuZ193YXJuaW5nKCkuCi1FcnJvcnMgaGFuZGxlZCB0aHJvdWdoIHBuZ19lcnJvcigpIGFyZSBmYXRhbCwgbWVhbmluZyB0aGF0IHBuZ19lcnJvcigpCi1zaG91bGQgbmV2ZXIgcmV0dXJuIHRvIGl0cyBjYWxsZXIuICBDdXJyZW50bHksIHRoaXMgaXMgaGFuZGxlZCB2aWEKLXNldGptcCgpIGFuZCBsb25nam1wKCkgKHVubGVzcyB5b3UgaGF2ZSBjb21waWxlZCBsaWJwbmcgd2l0aAotUE5HX05PX1NFVEpNUCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBoYW5kbGVkIHZpYSBQTkdfQUJPUlQoKSksCi1idXQgeW91IGNvdWxkIGNoYW5nZSB0aGlzIHRvIGRvIHRoaW5ncyBsaWtlIGV4aXQoKSBpZiB5b3Ugc2hvdWxkIHdpc2gsCi1hcyBsb25nIGFzIHlvdXIgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuLgotCi1PbiBub24tZmF0YWwgZXJyb3JzLCBwbmdfd2FybmluZygpIGlzIGNhbGxlZAotdG8gcHJpbnQgYSB3YXJuaW5nIG1lc3NhZ2UsIGFuZCB0aGVuIGNvbnRyb2wgcmV0dXJucyB0byB0aGUgY2FsbGluZyBjb2RlLgotQnkgZGVmYXVsdCBwbmdfZXJyb3IoKSBhbmQgcG5nX3dhcm5pbmcoKSBwcmludCBhIG1lc3NhZ2Ugb24gc3RkZXJyIHZpYQotZnByaW50ZigpIHVubGVzcyB0aGUgbGlicmFyeSBpcyBjb21waWxlZCB3aXRoIFBOR19OT19DT05TT0xFX0lPIGRlZmluZWQKLShiZWNhdXNlIHlvdSBkb24ndCB3YW50IHRoZSBtZXNzYWdlcykgb3IgUE5HX05PX1NURElPIGRlZmluZWQgKGJlY2F1c2UKLWZwcmludGYoKSBpc24ndCBhdmFpbGFibGUpLiAgSWYgeW91IHdpc2ggdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZiB0aGUgZXJyb3IKLWZ1bmN0aW9ucywgeW91IHdpbGwgbmVlZCB0byBzZXQgdXAgeW91ciBvd24gbWVzc2FnZSBjYWxsYmFja3MuICBUaGVzZQotZnVuY3Rpb25zIGFyZSBub3JtYWxseSBzdXBwbGllZCBhdCB0aGUgdGltZSB0aGF0IHRoZSBwbmdfc3RydWN0IGlzIGNyZWF0ZWQuCi1JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJlZGlyZWN0IGVycm9ycyBhbmQgd2FybmluZ3MgdG8geW91ciBvd24gcmVwbGFjZW1lbnQKLWZ1bmN0aW9ucyBhZnRlciBwbmdfY3JlYXRlXypfc3RydWN0KCkgaGFzIGJlZW4gY2FsbGVkIGJ5IGNhbGxpbmc6Ci0KLSAgICBwbmdfc2V0X2Vycm9yX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgICAgIHBuZ192b2lkcCBlcnJvcl9wdHIsIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sCi0gICAgICAgIHBuZ19lcnJvcl9wdHIgd2FybmluZ19mbik7Ci0KLSAgICBwbmdfdm9pZHAgZXJyb3JfcHRyID0gcG5nX2dldF9lcnJvcl9wdHIocG5nX3B0cik7Ci0KLUlmIE5VTEwgaXMgc3VwcGxpZWQgZm9yIGVpdGhlciBlcnJvcl9mbiBvciB3YXJuaW5nX2ZuLCB0aGVuIHRoZSBsaWJwbmcKLWRlZmF1bHQgZnVuY3Rpb24gd2lsbCBiZSB1c2VkLCBjYWxsaW5nIGZwcmludGYoKSBhbmQvb3IgbG9uZ2ptcCgpIGlmIGEKLXByb2JsZW0gaXMgZW5jb3VudGVyZWQuICBUaGUgcmVwbGFjZW1lbnQgZXJyb3IgZnVuY3Rpb25zIHNob3VsZCBoYXZlCi1wYXJhbWV0ZXJzIGFzIGZvbGxvd3M6Ci0KLSAgICB2b2lkIHVzZXJfZXJyb3JfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICAgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21zZyk7Ci0gICAgdm9pZCB1c2VyX3dhcm5pbmdfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICAgcG5nX2NvbnN0X2NoYXJwIHdhcm5pbmdfbXNnKTsKLQotVGhlIG1vdGl2YXRpb24gYmVoaW5kIHVzaW5nIHNldGptcCgpIGFuZCBsb25nam1wKCkgaXMgdGhlIEMrKyB0aHJvdyBhbmQKLWNhdGNoIGV4Y2VwdGlvbiBoYW5kbGluZyBtZXRob2RzLiAgVGhpcyBtYWtlcyB0aGUgY29kZSBtdWNoIGVhc2llciB0byB3cml0ZSwKLWFzIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgZXZlcnkgcmV0dXJuIGNvZGUgb2YgZXZlcnkgZnVuY3Rpb24gY2FsbC4KLUhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lIHVuY2VydGFpbnRpZXMgYWJvdXQgdGhlIHN0YXR1cyBvZiBsb2NhbCB2YXJpYWJsZXMKLWFmdGVyIGEgbG9uZ2ptcCwgc28gdGhlIHVzZXIgbWF5IHdhbnQgdG8gYmUgY2FyZWZ1bCBhYm91dCBkb2luZyBhbnl0aGluZwotYWZ0ZXIgc2V0am1wIHJldHVybnMgbm9uLXplcm8gYmVzaWRlcyByZXR1cm5pbmcgaXRzZWxmLiAgQ29uc3VsdCB5b3VyCi1jb21waWxlciBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuICBGb3IgYW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2gsIHlvdQotbWF5IHdpc2ggdG8gdXNlIHRoZSAiY2V4Y2VwdCIgZmFjaWxpdHkgKHNlZSBodHRwOi8vY2V4Y2VwdC5zb3VyY2Vmb3JnZS5uZXQpLAotd2hpY2ggaXMgaWxsdXN0cmF0ZWQgaW4gcG5ndmFsaWQuYyBhbmQgaW4gY29udHJpYi92aXN1cG5nLgotCi0uU1MgQ3VzdG9tIGNodW5rcwotCi1JZiB5b3UgbmVlZCB0byByZWFkIG9yIHdyaXRlIGN1c3RvbSBjaHVua3MsIHlvdSBtYXkgbmVlZCB0byBnZXQgZGVlcGVyCi1pbnRvIHRoZSBsaWJwbmcgY29kZS4gIFRoZSBsaWJyYXJ5IG5vdyBoYXMgbWVjaGFuaXNtcyBmb3Igc3RvcmluZwotYW5kIHdyaXRpbmcgY2h1bmtzIG9mIHVua25vd24gdHlwZTsgeW91IGNhbiBldmVuIGRlY2xhcmUgY2FsbGJhY2tzCi1mb3IgY3VzdG9tIGNodW5rcy4gIEhvd2V2ZXIsIHRoaXMgbWF5IG5vdCBiZSBnb29kIGVub3VnaCBpZiB0aGUKLWxpYnJhcnkgY29kZSBpdHNlbGYgbmVlZHMgdG8ga25vdyBhYm91dCBpbnRlcmFjdGlvbnMgYmV0d2VlbiB5b3VyCi1jaHVuayBhbmQgZXhpc3RpbmcgYGludHJpbnNpYycgY2h1bmtzLgotCi1JZiB5b3UgbmVlZCB0byB3cml0ZSBhIG5ldyBpbnRyaW5zaWMgY2h1bmssIGZpcnN0IHJlYWQgdGhlIFBORwotc3BlY2lmaWNhdGlvbi4gQWNxdWlyZSBhIGZpcnN0IGxldmVsIG9mIHVuZGVyc3RhbmRpbmcgb2YgaG93IGl0IHdvcmtzLgotUGF5IHBhcnRpY3VsYXIgYXR0ZW50aW9uIHRvIHRoZSBzZWN0aW9ucyB0aGF0IGRlc2NyaWJlIGNodW5rIG5hbWVzLAotYW5kIGxvb2sgYXQgaG93IG90aGVyIGNodW5rcyB3ZXJlIGRlc2lnbmVkLCBzbyB5b3UgY2FuIGRvIHRoaW5ncwotc2ltaWxhcmx5LiAgU2Vjb25kLCBjaGVjayBvdXQgdGhlIHNlY3Rpb25zIG9mIGxpYnBuZyB0aGF0IHJlYWQgYW5kCi13cml0ZSBjaHVua3MuICBUcnkgdG8gZmluZCBhIGNodW5rIHRoYXQgaXMgc2ltaWxhciB0byB5b3VycyBhbmQgdXNlCi1pdCBhcyBhIHRlbXBsYXRlLiAgTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgY29tbWVudHMgaW5zaWRlCi10aGUgY29kZS4gIEl0IGlzIGJlc3QgdG8gaGFuZGxlIHByaXZhdGUgb3IgdW5rbm93biBjaHVua3MgaW4gYSBnZW5lcmljIG1ldGhvZCwKLXZpYSBjYWxsYmFjayBmdW5jdGlvbnMsIGluc3RlYWQgb2YgYnkgbW9kaWZ5aW5nIGxpYnBuZyBmdW5jdGlvbnMuIFRoaXMKLWlzIGlsbHVzdHJhdGVkIGluIHBuZ3Rlc3QuYywgd2hpY2ggdXNlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBhCi1wcml2YXRlICJ2cEFnIiBjaHVuayBhbmQgdGhlIG5ldyAic1RFUiIgY2h1bmssIHdoaWNoIGFyZSBib3RoIHVua25vd24gdG8KLWxpYnBuZy4KLQotSWYgeW91IHdpc2ggdG8gd3JpdGUgeW91ciBvd24gdHJhbnNmb3JtYXRpb24gZm9yIHRoZSBkYXRhLCBsb29rIHRocm91Z2gKLXRoZSBwYXJ0IG9mIHRoZSBjb2RlIHRoYXQgZG9lcyB0aGUgdHJhbnNmb3JtYXRpb25zLCBhbmQgY2hlY2sgb3V0IHNvbWUgb2YKLXRoZSBzaW1wbGVyIG9uZXMgdG8gZ2V0IGFuIGlkZWEgb2YgaG93IHRoZXkgd29yay4gIFRyeSB0byBmaW5kIGEgc2ltaWxhcgotdHJhbnNmb3JtYXRpb24gdG8gdGhlIG9uZSB5b3Ugd2FudCB0byBhZGQgYW5kIGNvcHkgb2ZmIG9mIGl0LiAgTW9yZSBkZXRhaWxzCi1jYW4gYmUgZm91bmQgaW4gdGhlIGNvbW1lbnRzIGluc2lkZSB0aGUgY29kZSBpdHNlbGYuCi0KLS5TUyBDb25maWd1cmluZyBmb3IgMTYgYml0IHBsYXRmb3JtcwotCi1Zb3Ugd2lsbCB3YW50IHRvIGxvb2sgaW50byB6Y29uZi5oIHRvIHRlbGwgemxpYiAoYW5kIHRodXMgbGlicG5nKSB0aGF0Ci1pdCBjYW5ub3QgYWxsb2NhdGUgbW9yZSB0aGVuIDY0SyBhdCBhIHRpbWUuICBFdmVuIGlmIHlvdSBjYW4sIHRoZSBtZW1vcnkKLXdvbid0IGJlIGFjY2Vzc2libGUuICBTbyBsaW1pdCB6bGliIGFuZCBsaWJwbmcgdG8gNjRLIGJ5IGRlZmluaW5nIE1BWFNFR182NEsuCi0KLS5TUyBDb25maWd1cmluZyBmb3IgRE9TCi0KLUZvciBET1MgdXNlcnMgd2hvIG9ubHkgaGF2ZSBhY2Nlc3MgdG8gdGhlIGxvd2VyIDY0MEssIHlvdSB3aWxsCi1oYXZlIHRvIGxpbWl0IHpsaWIncyBtZW1vcnkgdXNhZ2UgdmlhIGEgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwoKQotY2FsbC4gIFNlZSB6bGliLmggb3IgemNvbmYuaCBpbiB0aGUgemxpYiBsaWJyYXJ5IGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0uU1MgQ29uZmlndXJpbmcgZm9yIE1lZGl1bSBNb2RlbAotCi1MaWJwbmcncyBzdXBwb3J0IGZvciBtZWRpdW0gbW9kZWwgaGFzIGJlZW4gdGVzdGVkIG9uIG1vc3Qgb2YgdGhlIHBvcHVsYXIKLWNvbXBpbGVycy4gIE1ha2Ugc3VyZSBNQVhTRUdfNjRLIGdldHMgZGVmaW5lZCwgVVNFX0ZBUl9LRVlXT1JEIGdldHMKLWRlZmluZWQsIGFuZCBGQVIgZ2V0cyBkZWZpbmVkIHRvIGZhciBpbiBwbmdjb25mLmgsIGFuZCB5b3Ugc2hvdWxkIGJlCi1hbGwgc2V0LiAgRXZlcnl0aGluZyBpbiB0aGUgbGlicmFyeSAoZXhjZXB0IGZvciB6bGliJ3Mgc3RydWN0dXJlKSBpcwotZXhwZWN0aW5nIGZhciBkYXRhLiAgWW91IG11c3QgdXNlIHRoZSB0eXBlZGVmcyB3aXRoIHRoZSBwIG9yIHBwIG9uCi10aGUgZW5kIGZvciBwb2ludGVycyAob3IgYXQgbGVhc3QgbG9vayBhdCB0aGVtIGFuZCBiZSBjYXJlZnVsKS4gIE1ha2UKLW5vdGUgdGhhdCB0aGUgcm93cyBvZiBkYXRhIGFyZSBkZWZpbmVkIGFzIHBuZ19ieXRlcHAsIHdoaWNoIGlzIGFuCi11bnNpZ25lZCBjaGFyIGZhciAqIGZhciAqLgotCi0uU1MgQ29uZmlndXJpbmcgZm9yIGd1aS93aW5kb3dpbmcgcGxhdGZvcm1zOgotCi1Zb3Ugd2lsbCBuZWVkIHRvIHdyaXRlIG5ldyBlcnJvciBhbmQgd2FybmluZyBmdW5jdGlvbnMgdGhhdCB1c2UgdGhlIEdVSQotaW50ZXJmYWNlLCBhcyBkZXNjcmliZWQgcHJldmlvdXNseSwgYW5kIHNldCB0aGVtIHRvIGJlIHRoZSBlcnJvciBhbmQKLXdhcm5pbmcgZnVuY3Rpb25zIGF0IHRoZSB0aW1lIHRoYXQgcG5nX2NyZWF0ZV8qX3N0cnVjdCgpIGlzIGNhbGxlZCwKLWluIG9yZGVyIHRvIGhhdmUgdGhlbSBhdmFpbGFibGUgZHVyaW5nIHRoZSBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24uCi1UaGV5IGNhbiBiZSBjaGFuZ2VkIGxhdGVyIHZpYSBwbmdfc2V0X2Vycm9yX2ZuKCkuICBPbiBzb21lIGNvbXBpbGVycywKLXlvdSBtYXkgYWxzbyBoYXZlIHRvIGNoYW5nZSB0aGUgbWVtb3J5IGFsbG9jYXRvcnMgKHBuZ19tYWxsb2MsIGV0Yy4pLgotCi0uU1MgQ29uZmlndXJpbmcgZm9yIGNvbXBpbGVyIHh4eDoKLQotQWxsIGluY2x1ZGVzIGZvciBsaWJwbmcgYXJlIGluIHBuZ2NvbmYuaC4gIElmIHlvdSBuZWVkIHRvIGFkZCwgY2hhbmdlCi1vciBkZWxldGUgYW4gaW5jbHVkZSwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuCi1UaGUgaW5jbHVkZXMgdGhhdCBhcmUgbm90IG5lZWRlZCBvdXRzaWRlIGxpYnBuZyBhcmUgcGxhY2VkIGluIHBuZ3ByaXYuaCwKLXdoaWNoIGlzIG9ubHkgdXNlZCBieSB0aGUgcm91dGluZXMgaW5zaWRlIGxpYnBuZyBpdHNlbGYuCi1UaGUgZmlsZXMgaW4gbGlicG5nIHByb3BlciBvbmx5IGluY2x1ZGUgcG5ncHJpdi5oIGFuZCBwbmcuaCwgd2hpY2gKLWluIHR1cm4gaW5jbHVkZXMgcG5nY29uZi5oLgotCi0uU1MgQ29uZmlndXJpbmcgemxpYjoKLQotVGhlcmUgYXJlIHNwZWNpYWwgZnVuY3Rpb25zIHRvIGNvbmZpZ3VyZSB0aGUgY29tcHJlc3Npb24uICBQZXJoYXBzIHRoZQotbW9zdCB1c2VmdWwgb25lIGNoYW5nZXMgdGhlIGNvbXByZXNzaW9uIGxldmVsLCB3aGljaCBjdXJyZW50bHkgdXNlcwotaW5wdXQgY29tcHJlc3Npb24gdmFsdWVzIGluIHRoZSByYW5nZSAwIC0gOS4gIFRoZSBsaWJyYXJ5IG5vcm1hbGx5Ci11c2VzIHRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIGxldmVsIChaX0RFRkFVTFRfQ09NUFJFU1NJT04gPSA2KS4gIFRlc3RzCi1oYXZlIHNob3duIHRoYXQgZm9yIGEgbGFyZ2UgbWFqb3JpdHkgb2YgaW1hZ2VzLCBjb21wcmVzc2lvbiB2YWx1ZXMgaW4KLXRoZSByYW5nZSAzLTYgY29tcHJlc3MgbmVhcmx5IGFzIHdlbGwgYXMgaGlnaGVyIGxldmVscywgYW5kIGRvIHNvIG11Y2gKLWZhc3Rlci4gIEZvciBvbmxpbmUgYXBwbGljYXRpb25zIGl0IG1heSBiZSBkZXNpcmFibGUgdG8gaGF2ZSBtYXhpbXVtIHNwZWVkCi0oWl9CRVNUX1NQRUVEID0gMSkuICBXaXRoIHZlcnNpb25zIG9mIHpsaWIgYWZ0ZXIgdjAuOTksIHlvdSBjYW4gYWxzbwotc3BlY2lmeSBubyBjb21wcmVzc2lvbiAoWl9OT19DT01QUkVTU0lPTiA9IDApLCBidXQgdGhpcyB3b3VsZCBjcmVhdGUKLWZpbGVzIGxhcmdlciB0aGFuIGp1c3Qgc3RvcmluZyB0aGUgcmF3IGJpdG1hcC4gIFlvdSBjYW4gc3BlY2lmeSB0aGUKLWNvbXByZXNzaW9uIGxldmVsIGJ5IGNhbGxpbmc6Ci0KLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19wdHIsIGxldmVsKTsKLQotQW5vdGhlciB1c2VmdWwgb25lIGlzIHRvIHJlZHVjZSB0aGUgbWVtb3J5IGxldmVsIHVzZWQgYnkgdGhlIGxpYnJhcnkuCi1UaGUgbWVtb3J5IGxldmVsIGRlZmF1bHRzIHRvIDgsIGJ1dCBpdCBjYW4gYmUgbG93ZXJlZCBpZiB5b3UgYXJlCi1zaG9ydCBvbiBtZW1vcnkgKHJ1bm5pbmcgRE9TLCBmb3IgZXhhbXBsZSwgd2hlcmUgeW91IG9ubHkgaGF2ZSA2NDBLKS4KLU5vdGUgdGhhdCB0aGUgbWVtb3J5IGxldmVsIGRvZXMgaGF2ZSBhbiBlZmZlY3Qgb24gY29tcHJlc3Npb247IGFtb25nCi1vdGhlciB0aGluZ3MsIGxvd2VyIGxldmVscyB3aWxsIHJlc3VsdCBpbiBzZWN0aW9ucyBvZiBpbmNvbXByZXNzaWJsZQotZGF0YSBiZWluZyBlbWl0dGVkIGluIHNtYWxsZXIgc3RvcmVkIGJsb2Nrcywgd2l0aCBhIGNvcnJlc3BvbmRpbmdseQotbGFyZ2VyIHJlbGF0aXZlIG92ZXJoZWFkIG9mIHVwIHRvIDE1JSBpbiB0aGUgd29yc3QgY2FzZS4KLQotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsKHBuZ19wdHIsIGxldmVsKTsKLQotVGhlIG90aGVyIGZ1bmN0aW9ucyBhcmUgZm9yIGNvbmZpZ3VyaW5nIHpsaWIuICBUaGV5IGFyZSBub3QgcmVjb21tZW5kZWQKLWZvciBub3JtYWwgdXNlIGFuZCBtYXkgcmVzdWx0IGluIHdyaXRpbmcgYW4gaW52YWxpZCBQTkcgZmlsZS4gIFNlZQotemxpYi5oIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHdoYXQgdGhlc2UgbWVhbi4KLQotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fc3RyYXRlZ3kocG5nX3B0ciwKLSAgICAgICAgc3RyYXRlZ3kpOwotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMocG5nX3B0ciwKLSAgICAgICAgd2luZG93X2JpdHMpOwotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kKHBuZ19wdHIsIG1ldGhvZCk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZShwbmdfcHRyLCBzaXplKTsKLQotLlNTIENvbnRyb2xsaW5nIHJvdyBmaWx0ZXJpbmcKLQotSWYgeW91IHdhbnQgdG8gY29udHJvbCB3aGV0aGVyIGxpYnBuZyB1c2VzIGZpbHRlcmluZyBvciBub3QsIHdoaWNoCi1maWx0ZXJzIGFyZSB1c2VkLCBhbmQgaG93IGl0IGdvZXMgYWJvdXQgcGlja2luZyByb3cgZmlsdGVycywgeW91Ci1jYW4gY2FsbCBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zLiAgVGhlIHNlbGVjdGlvbiBhbmQgY29uZmlndXJhdGlvbgotb2Ygcm93IGZpbHRlcnMgY2FuIGhhdmUgYSBzaWduaWZpY2FudCBpbXBhY3Qgb24gdGhlIHNpemUgYW5kCi1lbmNvZGluZyBzcGVlZCBhbmQgYSBzb21ld2hhdCBsZXNzZXIgaW1wYWN0IG9uIHRoZSBkZWNvZGluZyBzcGVlZAotb2YgYW4gaW1hZ2UuICBGaWx0ZXJpbmcgaXMgZW5hYmxlZCBieSBkZWZhdWx0IGZvciBSR0IgYW5kIGdyYXlzY2FsZQotaW1hZ2VzICh3aXRoIGFuZCB3aXRob3V0IGFscGhhKSwgYnV0IG5vdCBmb3IgcGFsZXR0ZWQgaW1hZ2VzIG5vcgotZm9yIGFueSBpbWFnZXMgd2l0aCBiaXQgZGVwdGhzIGxlc3MgdGhhbiA4IGJpdHMvcGl4ZWwuCi0KLVRoZSAnbWV0aG9kJyBwYXJhbWV0ZXIgc2V0cyB0aGUgbWFpbiBmaWx0ZXJpbmcgbWV0aG9kLCB3aGljaCBpcwotY3VycmVudGx5IG9ubHkgJzAnIGluIHRoZSBQTkcgMS4yIHNwZWNpZmljYXRpb24uICBUaGUgJ2ZpbHRlcnMnCi1wYXJhbWV0ZXIgc2V0cyB3aGljaCBmaWx0ZXIocyksIGlmIGFueSwgc2hvdWxkIGJlIHVzZWQgZm9yIGVhY2gKLXNjYW5saW5lLiAgUG9zc2libGUgdmFsdWVzIGFyZSBQTkdfQUxMX0ZJTFRFUlMgYW5kIFBOR19OT19GSUxURVJTCi10byB0dXJuIGZpbHRlcmluZyBvbiBhbmQgb2ZmLCByZXNwZWN0aXZlbHkuCi0KLUluZGl2aWR1YWwgZmlsdGVyIHR5cGVzIGFyZSBQTkdfRklMVEVSX05PTkUsIFBOR19GSUxURVJfU1VCLAotUE5HX0ZJTFRFUl9VUCwgUE5HX0ZJTFRFUl9BVkcsIFBOR19GSUxURVJfUEFFVEgsIHdoaWNoIGNhbiBiZSBiaXR3aXNlCi1PUmVkIHRvZ2V0aGVyIHdpdGggJ3wnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsdGVycyB0byB1c2UuCi1UaGVzZSBmaWx0ZXJzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uLgotSWYgeW91IGludGVuZCB0byBjaGFuZ2UgdGhlIGZpbHRlciB0eXBlIGR1cmluZyB0aGUgY291cnNlIG9mIHdyaXRpbmcKLXRoZSBpbWFnZSwgeW91IHNob3VsZCBzdGFydCB3aXRoIGZsYWdzIHNldCBmb3IgYWxsIG9mIHRoZSBmaWx0ZXJzCi15b3UgaW50ZW5kIHRvIHVzZSBzbyB0aGF0IGxpYnBuZyBjYW4gaW5pdGlhbGl6ZSBpdHMgaW50ZXJuYWwKLXN0cnVjdHVyZXMgYXBwcm9wcmlhdGVseSBmb3IgYWxsIG9mIHRoZSBmaWx0ZXIgdHlwZXMuICAoTm90ZSB0aGF0IHRoaXMKLW1lYW5zIHRoZSBmaXJzdCByb3cgbXVzdCBhbHdheXMgYmUgYWRhcHRpdmVseSBmaWx0ZXJlZCwgYmVjYXVzZSBsaWJwbmcKLWN1cnJlbnRseSBkb2VzIG5vdCBhbGxvY2F0ZSB0aGUgZmlsdGVyIGJ1ZmZlcnMgdW50aWwgcG5nX3dyaXRlX3JvdygpCi1pcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLikKLQotICAgIGZpbHRlcnMgPSBQTkdfRklMVEVSX05PTkUgfCBQTkdfRklMVEVSX1NVQgotICAgICAgICAgICAgICBQTkdfRklMVEVSX1VQIHwgUE5HX0ZJTFRFUl9BVkcgfAotICAgICAgICAgICAgICBQTkdfRklMVEVSX1BBRVRIIHwgUE5HX0FMTF9GSUxURVJTOwotCi0gICAgcG5nX3NldF9maWx0ZXIocG5nX3B0ciwgUE5HX0ZJTFRFUl9UWVBFX0JBU0UsCi0gICAgICAgZmlsdGVycyk7Ci0gICAgICAgICAgICAgIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGNhbiBhbHNvIGJlCi0gICAgICAgICAgICAgIFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORyBpZiB5b3UgYXJlCi0gICAgICAgICAgICAgIHdyaXRpbmcgYSBQTkcgdG8gYmUgZW1iZWRkZWQgaW4gYSBNTkcKLSAgICAgICAgICAgICAgZGF0YXN0cmVhbS4gIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgdGhlCi0gICAgICAgICAgICAgIHNhbWUgYXMgdGhlIHZhbHVlIG9mIGZpbHRlcl9tZXRob2QgdXNlZAotICAgICAgICAgICAgICBpbiBwbmdfc2V0X0lIRFIoKS4KLQotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBpbmZsdWVuY2UgaG93IGxpYnBuZyBjaG9vc2VzIGZyb20gYW1vbmcgdGhlCi1hdmFpbGFibGUgZmlsdGVycy4gIFRoaXMgaXMgZG9uZSBpbiBvbmUgb3IgYm90aCBvZiB0d28gd2F5cyAtIGJ5Ci10ZWxsaW5nIGl0IGhvdyBpbXBvcnRhbnQgaXQgaXMgdG8ga2VlcCB0aGUgc2FtZSBmaWx0ZXIgZm9yIHN1Y2Nlc3NpdmUKLXJvd3MsIGFuZCBieSB0ZWxsaW5nIGl0IHRoZSByZWxhdGl2ZSBjb21wdXRhdGlvbmFsIGNvc3RzIG9mIHRoZSBmaWx0ZXJzLgotCi0gICAgZG91YmxlIHdlaWdodHNbM10gPSB7MS41LCAxLjMsIDEuMX0sCi0gICAgICAgY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9MQVNUXSA9Ci0gICAgICAgezEuMCwgMS4zLCAxLjMsIDEuNSwgMS43fTsKLQotICAgIHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3MocG5nX3B0ciwKLSAgICAgICBQTkdfRklMVEVSX0hFVVJJU1RJQ19XRUlHSFRFRCwgMywKLSAgICAgICB3ZWlnaHRzLCBjb3N0cyk7Ci0KLVRoZSB3ZWlnaHRzIGFyZSBtdWx0aXBseWluZyBmYWN0b3JzIHRoYXQgaW5kaWNhdGUgdG8gbGlicG5nIHRoYXQgdGhlCi1yb3cgZmlsdGVyIHNob3VsZCBiZSB0aGUgc2FtZSBmb3Igc3VjY2Vzc2l2ZSByb3dzIHVubGVzcyBhbm90aGVyIHJvdyBmaWx0ZXIKLWlzIHRoYXQgbWFueSB0aW1lcyBiZXR0ZXIgdGhhbiB0aGUgcHJldmlvdXMgZmlsdGVyLiAgSW4gdGhlIGFib3ZlIGV4YW1wbGUsCi1pZiB0aGUgcHJldmlvdXMgMyBmaWx0ZXJzIHdlcmUgU1VCLCBTVUIsIE5PTkUsIHRoZSBTVUIgZmlsdGVyIGNvdWxkIGhhdmUgYQotInN1bSBvZiBhYnNvbHV0ZSBkaWZmZXJlbmNlcyIgMS41IHggMS4zIHRpbWVzIGhpZ2hlciB0aGFuIG90aGVyIGZpbHRlcnMKLWFuZCBzdGlsbCBiZSBjaG9zZW4sIHdoaWxlIHRoZSBOT05FIGZpbHRlciBjb3VsZCBoYXZlIGEgc3VtIDEuMSB0aW1lcwotaGlnaGVyIHRoYW4gb3RoZXIgZmlsdGVycyBhbmQgc3RpbGwgYmUgY2hvc2VuLiAgVW5zcGVjaWZpZWQgd2VpZ2h0cyBhcmUKLXRha2VuIHRvIGJlIDEuMCwgYW5kIHRoZSBzcGVjaWZpZWQgd2VpZ2h0cyBzaG91bGQgcHJvYmFibHkgYmUgZGVjbGluaW5nCi1saWtlIHRob3NlIGFib3ZlIGluIG9yZGVyIHRvIGVtcGhhc2l6ZSByZWNlbnQgZmlsdGVycyBvdmVyIG9sZGVyIGZpbHRlcnMuCi0KLVRoZSBmaWx0ZXIgY29zdHMgc3BlY2lmeSBmb3IgZWFjaCBmaWx0ZXIgdHlwZSBhIHJlbGF0aXZlIGRlY29kaW5nIGNvc3QKLXRvIGJlIGNvbnNpZGVyZWQgd2hlbiBzZWxlY3Rpbmcgcm93IGZpbHRlcnMuICBUaGlzIG1lYW5zIHRoYXQgZmlsdGVycwotd2l0aCBoaWdoZXIgY29zdHMgYXJlIGxlc3MgbGlrZWx5IHRvIGJlIGNob3NlbiBvdmVyIGZpbHRlcnMgd2l0aCBsb3dlcgotY29zdHMsIHVubGVzcyB0aGVpciAic3VtIG9mIGFic29sdXRlIGRpZmZlcmVuY2VzIiBpcyB0aGF0IG11Y2ggc21hbGxlci4KLVRoZSBjb3N0cyBkbyBub3QgbmVjZXNzYXJpbHkgcmVmbGVjdCB0aGUgZXhhY3QgY29tcHV0YXRpb25hbCBzcGVlZHMgb2YKLXRoZSB2YXJpb3VzIGZpbHRlcnMsIHNpbmNlIHRoaXMgd291bGQgdW5kdWx5IGluZmx1ZW5jZSB0aGUgZmluYWwgaW1hZ2UKLXNpemUuCi0KLU5vdGUgdGhhdCB0aGUgbnVtYmVycyBhYm92ZSB3ZXJlIGludmVudGVkIHB1cmVseSBmb3IgdGhpcyBleGFtcGxlIGFuZAotYXJlIGdpdmVuIG9ubHkgdG8gaGVscCBleHBsYWluIHRoZSBmdW5jdGlvbiB1c2FnZS4gIExpdHRsZSB0ZXN0aW5nIGhhcwotYmVlbiBkb25lIHRvIGZpbmQgb3B0aW11bSB2YWx1ZXMgZm9yIGVpdGhlciB0aGUgY29zdHMgb3IgdGhlIHdlaWdodHMuCi0KLS5TUyBSZW1vdmluZyB1bndhbnRlZCBvYmplY3QgY29kZQotCi1UaGVyZSBhcmUgYSBidW5jaCBvZiAjZGVmaW5lJ3MgaW4gcG5nY29uZi5oIHRoYXQgY29udHJvbCB3aGF0IHBhcnRzIG9mCi1saWJwbmcgYXJlIGNvbXBpbGVkLiAgQWxsIHRoZSBkZWZpbmVzIGVuZCBpbiBfU1VQUE9SVEVELiAgSWYgeW91IGFyZQotbmV2ZXIgZ29pbmcgdG8gdXNlIGEgY2FwYWJpbGl0eSwgeW91IGNhbiBjaGFuZ2UgdGhlICNkZWZpbmUgdG8gI3VuZGVmCi1iZWZvcmUgcmVjb21waWxpbmcgbGlicG5nIGFuZCBzYXZlIHlvdXJzZWxmIGNvZGUgYW5kIGRhdGEgc3BhY2UsIG9yCi15b3UgY2FuIHR1cm4gb2ZmIGluZGl2aWR1YWwgY2FwYWJpbGl0aWVzIHdpdGggZGVmaW5lcyB0aGF0IGJlZ2luIHdpdGgKLVBOR19OT18uCi0KLVlvdSBjYW4gYWxzbyB0dXJuIGFsbCBvZiB0aGUgdHJhbnNmb3JtcyBhbmQgYW5jaWxsYXJ5IGNodW5rIGNhcGFiaWxpdGllcwotb2ZmIGVuIG1hc3NlIHdpdGggY29tcGlsZXIgZGlyZWN0aXZlcyB0aGF0IGRlZmluZQotUE5HX05PX1JFQURbb3IgV1JJVEVdX1RSQU5TRk9STVMsIG9yIFBOR19OT19SRUFEW29yIFdSSVRFXV9BTkNJTExBUllfQ0hVTktTLAotb3IgYWxsIGZvdXIsCi1hbG9uZyB3aXRoIGRpcmVjdGl2ZXMgdG8gdHVybiBvbiBhbnkgb2YgdGhlIGNhcGFiaWxpdGllcyB0aGF0IHlvdSBkbwotd2FudC4gIFRoZSBQTkdfTk9fUkVBRFtvciBXUklURV1fVFJBTlNGT1JNUyBkaXJlY3RpdmVzIGRpc2FibGUgdGhlIGV4dHJhCi10cmFuc2Zvcm1hdGlvbnMgYnV0IHN0aWxsIGxlYXZlIHRoZSBsaWJyYXJ5IGZ1bGx5IGNhcGFibGUgb2YgcmVhZGluZwotYW5kIHdyaXRpbmcgUE5HIGZpbGVzIHdpdGggYWxsIGtub3duIHB1YmxpYyBjaHVua3MuIFVzZSBvZiB0aGUKLVBOR19OT19SRUFEW29yIFdSSVRFXV9BTkNJTExBUllfQ0hVTktTIGRpcmVjdGl2ZSBwcm9kdWNlcyBhIGxpYnJhcnkKLXRoYXQgaXMgaW5jYXBhYmxlIG9mIHJlYWRpbmcgb3Igd3JpdGluZyBhbmNpbGxhcnkgY2h1bmtzLiAgSWYgeW91IGFyZQotbm90IHVzaW5nIHRoZSBwcm9ncmVzc2l2ZSByZWFkaW5nIGNhcGFiaWxpdHksIHlvdSBjYW4gdHVybiB0aGF0IG9mZgotd2l0aCBQTkdfTk9fUFJPR1JFU1NJVkVfUkVBRCAoZG9uJ3QgY29uZnVzZSB0aGlzIHdpdGggdGhlIElOVEVSTEFDSU5HCi1jYXBhYmlsaXR5LCB3aGljaCB5b3UnbGwgc3RpbGwgaGF2ZSkuCi0KLUFsbCB0aGUgcmVhZGluZyBhbmQgd3JpdGluZyBzcGVjaWZpYyBjb2RlIGFyZSBpbiBzZXBhcmF0ZSBmaWxlcywgc28gdGhlCi1saW5rZXIgc2hvdWxkIG9ubHkgZ3JhYiB0aGUgZmlsZXMgaXQgbmVlZHMuICBIb3dldmVyLCBpZiB5b3Ugd2FudCB0bwotbWFrZSBzdXJlLCBvciBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEgc3RhbmQgYWxvbmUgbGlicmFyeSwgYWxsIHRoZQotcmVhZGluZyBmaWxlcyBzdGFydCB3aXRoICJwbmdyIiBhbmQgYWxsIHRoZSB3cml0aW5nIGZpbGVzIHN0YXJ0IHdpdGggInBuZ3ciLgotVGhlIGZpbGVzIHRoYXQgZG9uJ3QgbWF0Y2ggZWl0aGVyIChsaWtlIHBuZy5jLCBwbmd0cmFucy5jLCBldGMuKQotYXJlIHVzZWQgZm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZywgYW5kIGFsd2F5cyBuZWVkIHRvIGJlIGluY2x1ZGVkLgotVGhlIHByb2dyZXNzaXZlIHJlYWRlciBpcyBpbiBwbmdwcmVhZC5jCi0KLUlmIHlvdSBhcmUgY3JlYXRpbmcgb3IgZGlzdHJpYnV0aW5nIGEgZHluYW1pY2FsbHkgbGlua2VkIGxpYnJhcnkgKGEgLnNvCi1vciBETEwgZmlsZSksIHlvdSBzaG91bGQgbm90IHJlbW92ZSBvciBkaXNhYmxlIGFueSBwYXJ0cyBvZiB0aGUgbGlicmFyeSwKLWFzIHRoaXMgd2lsbCBjYXVzZSBhcHBsaWNhdGlvbnMgbGlua2VkIHdpdGggZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZQotbGlicmFyeSB0byBmYWlsIGlmIHRoZXkgY2FsbCBmdW5jdGlvbnMgbm90IGF2YWlsYWJsZSBpbiB5b3VyIGxpYnJhcnkuCi1UaGUgc2l6ZSBvZiB0aGUgbGlicmFyeSBpdHNlbGYgc2hvdWxkIG5vdCBiZSBhbiBpc3N1ZSwgYmVjYXVzZSBvbmx5Ci10aG9zZSBzZWN0aW9ucyB0aGF0IGFyZSBhY3R1YWxseSB1c2VkIHdpbGwgYmUgbG9hZGVkIGludG8gbWVtb3J5LgotCi0uU1MgUmVxdWVzdGluZyBkZWJ1ZyBwcmludG91dAotCi1UaGUgbWFjcm8gZGVmaW5pdGlvbiBQTkdfREVCVUcgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBkZWJ1Z2dpbmcKLXByaW50b3V0LiAgU2V0IGl0IHRvIGFuIGludGVnZXIgdmFsdWUgaW4gdGhlIHJhbmdlIDAgdG8gMy4gIEhpZ2hlcgotbnVtYmVycyByZXN1bHQgaW4gaW5jcmVhc2luZyBhbW91bnRzIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoZQotaW5mb3JtYXRpb24gaXMgcHJpbnRlZCB0byB0aGUgInN0ZGVyciIgZmlsZSwgdW5sZXNzIGFub3RoZXIgZmlsZQotbmFtZSBpcyBzcGVjaWZpZWQgaW4gdGhlIFBOR19ERUJVR19GSUxFIG1hY3JvIGRlZmluaXRpb24uCi0KLVdoZW4gUE5HX0RFQlVHID4gMCwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgKG1hY3JvcykgYmVjb21lIGF2YWlsYWJsZToKLQotICAgcG5nX2RlYnVnKGxldmVsLCBtZXNzYWdlKQotICAgcG5nX2RlYnVnMShsZXZlbCwgbWVzc2FnZSwgcDEpCi0gICBwbmdfZGVidWcyKGxldmVsLCBtZXNzYWdlLCBwMSwgcDIpCi0KLWluIHdoaWNoICJsZXZlbCIgaXMgY29tcGFyZWQgdG8gUE5HX0RFQlVHIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHByaW50Ci10aGUgbWVzc2FnZSwgIm1lc3NhZ2UiIGlzIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIHRvIGJlIHByaW50ZWQsCi1hbmQgcDEgYW5kIHAyIGFyZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHRvIGJlIGVtYmVkZGVkIGluIHRoZSBzdHJpbmcKLWFjY29yZGluZyB0byBwcmludGYtc3R5bGUgZm9ybWF0dGluZyBkaXJlY3RpdmVzLiAgRm9yIGV4YW1wbGUsCi0KLSAgIHBuZ19kZWJ1ZzEoMiwgImZvbz0lZFxuIiwgZm9vKTsKLQotaXMgZXhwYW5kZWQgdG8KLQotICAgaWYoUE5HX0RFQlVHID4gMikKLSAgICAgZnByaW50ZihQTkdfREVCVUdfRklMRSwgImZvbz0lZFxuIiwgZm9vKTsKLQotV2hlbiBQTkdfREVCVUcgaXMgZGVmaW5lZCBidXQgaXMgemVybywgdGhlIG1hY3JvcyBhcmVuJ3QgZGVmaW5lZCwgYnV0IHlvdQotY2FuIHN0aWxsIHVzZSBQTkdfREVCVUcgdG8gY29udHJvbCB5b3VyIG93biBkZWJ1Z2dpbmc6Ci0KLSAgICNpZmRlZiBQTkdfREVCVUcKLSAgICAgICBmcHJpbnRmKHN0ZGVyciwgLi4uCi0gICAjZW5kaWYKLQotV2hlbiBQTkdfREVCVUcgPSAxLCB0aGUgbWFjcm9zIGFyZSBkZWZpbmVkLCBidXQgb25seSBwbmdfZGVidWcgc3RhdGVtZW50cwotaGF2aW5nIGxldmVsID0gMCB3aWxsIGJlIHByaW50ZWQuICBUaGVyZSBhcmVuJ3QgYW55IHN1Y2ggc3RhdGVtZW50cyBpbgotdGhpcyB2ZXJzaW9uIG9mIGxpYnBuZywgYnV0IGlmIHlvdSBpbnNlcnQgc29tZSB0aGV5IHdpbGwgYmUgcHJpbnRlZC4KLQotLlNIIFZJLiAgTU5HIHN1cHBvcnQKLQotVGhlIE1ORyBzcGVjaWZpY2F0aW9uIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9tbmcpIGFsbG93cwotY2VydGFpbiBleHRlbnNpb25zIHRvIFBORyBmb3IgUE5HIGltYWdlcyB0aGF0IGFyZSBlbWJlZGRlZCBpbiBNTkcgZGF0YXN0cmVhbXMuCi1MaWJwbmcgY2FuIHN1cHBvcnQgc29tZSBvZiB0aGVzZSBleHRlbnNpb25zLiAgVG8gZW5hYmxlIHRoZW0sIHVzZSB0aGUKLXBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKCkgZnVuY3Rpb246Ci0KLSAgIGZlYXR1cmVfc2V0ID0gcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMocG5nX3B0ciwgbWFzaykKLSAgIG1hc2sgaXMgYSBwbmdfdWludF8zMiBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIHRoZQotICAgICAgICBmZWF0dXJlcyB5b3Ugd2FudCB0byBlbmFibGUuICBUaGVzZSBpbmNsdWRlCi0gICAgICAgIFBOR19GTEFHX01OR19FTVBUWV9QTFRFCi0gICAgICAgIFBOR19GTEFHX01OR19GSUxURVJfNjQKLSAgICAgICAgUE5HX0FMTF9NTkdfRkVBVFVSRVMKLSAgIGZlYXR1cmVfc2V0IGlzIGEgcG5nX3VpbnRfMzIgdGhhdCBpcyB0aGUgYml0d2lzZSBBTkQgb2YKLSAgICAgIHlvdXIgbWFzayB3aXRoIHRoZSBzZXQgb2YgTU5HIGZlYXR1cmVzIHRoYXQgaXMKLSAgICAgIHN1cHBvcnRlZCBieSB0aGUgdmVyc2lvbiBvZiBsaWJwbmcgdGhhdCB5b3UgYXJlIHVzaW5nLgotCi1JdCBpcyBhbiBlcnJvciB0byB1c2UgdGhpcyBmdW5jdGlvbiB3aGVuIHJlYWRpbmcgb3Igd3JpdGluZyBhIHN0YW5kYWxvbmUKLVBORyBmaWxlIHdpdGggdGhlIFBORyA4LWJ5dGUgc2lnbmF0dXJlLiAgVGhlIFBORyBkYXRhc3RyZWFtIG11c3QgYmUgd3JhcHBlZAotaW4gYSBNTkcgZGF0YXN0cmVhbS4gIEFzIGEgbWluaW11bSwgaXQgbXVzdCBoYXZlIHRoZSBNTkcgOC1ieXRlIHNpZ25hdHVyZQotYW5kIHRoZSBNSERSIGFuZCBNRU5EIGNodW5rcy4gIExpYnBuZyBkb2VzIG5vdCBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZXNlCi1vciBhbnkgb3RoZXIgTU5HIGNodW5rczsgeW91ciBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgaXRzIG93biBzdXBwb3J0IGZvcgotdGhlbS4gIFlvdSBtYXkgd2lzaCB0byBjb25zaWRlciB1c2luZyBsaWJtbmcgKGF2YWlsYWJsZSBhdAotaHR0cDovL3d3dy5saWJtbmcuY29tKSBpbnN0ZWFkLgotCi0uU0ggVklJLiAgQ2hhbmdlcyB0byBMaWJwbmcgZnJvbSB2ZXJzaW9uIDAuODgKLQotSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdmVyc2lvbnMgb2YgbGlicG5nIGxhdGVyIHRoYW4gMC45NiBhcmUgbm90Ci1kaXN0cmlidXRlZCBieSB0aGUgb3JpZ2luYWwgbGlicG5nIGF1dGhvciwgR3V5IFNjaGFsbmF0LCBub3IgYnkKLUFuZHJlYXMgRGlsZ2VyLCB3aG8gaGFkIHRha2VuIG92ZXIgZnJvbSBHdXkgZHVyaW5nIDE5OTYgYW5kIDE5OTcsIGFuZAotZGlzdHJpYnV0ZWQgdmVyc2lvbnMgMC44OSB0aHJvdWdoIDAuOTYsIGJ1dCByYXRoZXIgYnkgYW5vdGhlciBtZW1iZXIKLW9mIHRoZSBvcmlnaW5hbCBQTkcgR3JvdXAsIEdsZW5uIFJhbmRlcnMtUGVocnNvbi4gIEd1eSBhbmQgQW5kcmVhcyBhcmUKLXN0aWxsIGFsaXZlIGFuZCB3ZWxsLCBidXQgdGhleSBoYXZlIG1vdmVkIG9uIHRvIG90aGVyIHRoaW5ncy4KLQotVGhlIG9sZCBsaWJwbmcgZnVuY3Rpb25zIHBuZ19yZWFkX2luaXQoKSwgcG5nX3dyaXRlX2luaXQoKSwKLXBuZ19pbmZvX2luaXQoKSwgcG5nX3JlYWRfZGVzdHJveSgpLCBhbmQgcG5nX3dyaXRlX2Rlc3Ryb3koKSBoYXZlIGJlZW4KLW1vdmVkIHRvIFBOR19JTlRFUk5BTCBpbiB2ZXJzaW9uIDAuOTUgdG8gZGlzY291cmFnZSB0aGVpciB1c2UuICBUaGVzZQotZnVuY3Rpb25zIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGxpYnBuZyB2ZXJzaW9uIDIuMC4wLgotCi1UaGUgcHJlZmVycmVkIG1ldGhvZCBvZiBjcmVhdGluZyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBsaWJwbmcgc3RydWN0dXJlcyBpcwotdmlhIHRoZSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCksIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KCksIGFuZAotcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCgpIGJlY2F1c2UgdGhleSBpc29sYXRlIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmVzCi1mcm9tIHRoZSBhcHBsaWNhdGlvbiwgYWxsb3cgdmVyc2lvbiBlcnJvciBjaGVja2luZywgYW5kIGFsc28gYWxsb3cgdGhlCi11c2Ugb2YgY3VzdG9tIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24sIHdoaWNoCi10aGUgb2xkIGZ1bmN0aW9ucyBkbyBub3QuICBUaGUgZnVuY3Rpb25zIHBuZ19yZWFkX2Rlc3Ryb3koKSBhbmQKLXBuZ193cml0ZV9kZXN0cm95KCkgZG8gbm90IGFjdHVhbGx5IGZyZWUgdGhlIG1lbW9yeSB0aGF0IGxpYnBuZwotYWxsb2NhdGVkIGZvciB0aGVzZSBzdHJ1Y3RzLCBidXQganVzdCByZXNldCB0aGUgZGF0YSBzdHJ1Y3R1cmVzLCBzbyB0aGV5Ci1jYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCkgYW5kCi1wbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKSBpZiB5b3UgZmVlbCB0aGVyZSBpcyB0b28gbXVjaCBzeXN0ZW0gb3ZlcmhlYWQKLWFsbG9jYXRpbmcgYW5kIGZyZWVpbmcgdGhlIHBuZ19zdHJ1Y3QgZm9yIGVhY2ggaW1hZ2UgcmVhZC4KLQotU2V0dGluZyB0aGUgZXJyb3IgY2FsbGJhY2tzIHZpYSBwbmdfc2V0X21lc3NhZ2VfZm4oKSBiZWZvcmUKLXBuZ19yZWFkX2luaXQoKSBhcyB3YXMgc3VnZ2VzdGVkIGluIGxpYnBuZy0wLjg4IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQKLWJlY2F1c2UgdGhpcyBjYXVzZWQgYXBwbGljYXRpb25zIHRoYXQgZG8gbm90IHVzZSBjdXN0b20gZXJyb3IgZnVuY3Rpb25zCi10byBmYWlsIGlmIHRoZSBwbmdfcHRyIHdhcyBub3QgaW5pdGlhbGl6ZWQgdG8gemVyby4gIEl0IGlzIHN0aWxsIHBvc3NpYmxlCi10byBzZXQgdGhlIGVycm9yIGNhbGxiYWNrcyBBRlRFUiBwbmdfcmVhZF9pbml0KCksIG9yIHRvIGNoYW5nZSB0aGVtIHdpdGgKLXBuZ19zZXRfZXJyb3JfZm4oKSwgd2hpY2ggaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgZnVuY3Rpb24sIGJ1dCB3aXRoIGEgbmV3Ci1uYW1lIHRvIGZvcmNlIGNvbXBpbGF0aW9uIGVycm9ycyB3aXRoIGFwcGxpY2F0aW9ucyB0aGF0IHRyeSB0byB1c2UgdGhlIG9sZAotbWV0aG9kLgotCi1TdGFydGluZyB3aXRoIHZlcnNpb24gMS4wLjcsIHlvdSBjYW4gZmluZCBvdXQgd2hpY2ggdmVyc2lvbiBvZiB0aGUgbGlicmFyeQoteW91IGFyZSB1c2luZyBhdCBydW4tdGltZToKLQotICAgcG5nX3VpbnRfMzIgbGlicG5nX3ZuID0gcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlcigpOwotCi1UaGUgbnVtYmVyIGxpYnBuZ192biBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBtYWpvciB2ZXJzaW9uLCBtaW5vcgotdmVyc2lvbiB3aXRoIGxlYWRpbmcgemVybywgYW5kIHJlbGVhc2UgbnVtYmVyIHdpdGggbGVhZGluZyB6ZXJvLAotKGUuZy4sIGxpYnBuZ192biBmb3IgdmVyc2lvbiAxLjAuNyBpcyAxMDAwNykuCi0KLVlvdSBjYW4gYWxzbyBjaGVjayB3aGljaCB2ZXJzaW9uIG9mIHBuZy5oIHlvdSB1c2VkIHdoZW4gY29tcGlsaW5nIHlvdXIKLWFwcGxpY2F0aW9uOgotCi0gICBwbmdfdWludF8zMiBhcHBsaWNhdGlvbl92biA9IFBOR19MSUJQTkdfVkVSOwotCi0uU0ggVklJSS4gIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAxLjAueCB0byAxLjIueAotCi1TdXBwb3J0IGZvciB1c2VyIG1lbW9yeSBtYW5hZ2VtZW50IHdhcyBlbmFibGVkIGJ5IGRlZmF1bHQuICBUbwotYWNjb21wbGlzaCB0aGlzLCB0aGUgZnVuY3Rpb25zIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMigpLAotcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMigpLCBwbmdfc2V0X21lbV9mbigpLCBwbmdfZ2V0X21lbV9wdHIoKSwKLXBuZ19tYWxsb2NfZGVmYXVsdCgpLCBhbmQgcG5nX2ZyZWVfZGVmYXVsdCgpIHdlcmUgYWRkZWQuCi0KLVN1cHBvcnQgZm9yIHRoZSBpVFh0IGNodW5rIGhhcyBiZWVuIGVuYWJsZWQgYnkgZGVmYXVsdCBhcyBvZgotdmVyc2lvbiAxLjIuNDEuCi0KLVN1cHBvcnQgZm9yIGNlcnRhaW4gTU5HIGZlYXR1cmVzIHdhcyBlbmFibGVkLgotCi1TdXBwb3J0IGZvciBudW1iZXJlZCBlcnJvciBtZXNzYWdlcyB3YXMgYWRkZWQuICBIb3dldmVyLCB3ZSBuZXZlciBnb3QKLWFyb3VuZCB0byBhY3R1YWxseSBudW1iZXJpbmcgdGhlIGVycm9yIG1lc3NhZ2VzLiAgVGhlIGZ1bmN0aW9uCi1wbmdfc2V0X3N0cmlwX2Vycm9yX251bWJlcnMoKSB3YXMgYWRkZWQgKE5vdGU6IHRoZSBwcm90b3R5cGUgZm9yIHRoaXMKLWZ1bmN0aW9uIHdhcyBpbmFkdmVydGVudGx5IHJlbW92ZWQgZnJvbSBwbmcuaCBpbiBQTkdfTk9fQVNTRU1CTEVSX0NPREUKLWJ1aWxkcyBvZiBsaWJwbmctMS4yLjE1LiAgSXQgd2FzIHJlc3RvcmVkIGluIGxpYnBuZy0xLjIuMzYpLgotCi1UaGUgcG5nX21hbGxvY193YXJuKCkgZnVuY3Rpb24gd2FzIGFkZGVkIGF0IGxpYnBuZy0xLjIuMy4gIFRoaXMgaXNzdWVzCi1hIHBuZ193YXJuaW5nIGFuZCByZXR1cm5zIE5VTEwgaW5zdGVhZCBvZiBhYm9ydGluZyB3aGVuIGl0IGZhaWxzIHRvCi1hY3F1aXJlIHRoZSByZXF1ZXN0ZWQgbWVtb3J5IGFsbG9jYXRpb24uCi0KLVN1cHBvcnQgZm9yIHNldHRpbmcgdXNlciBsaW1pdHMgb24gaW1hZ2Ugd2lkdGggYW5kIGhlaWdodCB3YXMgZW5hYmxlZAotYnkgZGVmYXVsdC4gIFRoZSBmdW5jdGlvbnMgcG5nX3NldF91c2VyX2xpbWl0cygpLCBwbmdfZ2V0X3VzZXJfd2lkdGhfbWF4KCksCi1hbmQgcG5nX2dldF91c2VyX2hlaWdodF9tYXgoKSB3ZXJlIGFkZGVkIGF0IGxpYnBuZy0xLjIuNi4KLQotVGhlIHBuZ19zZXRfYWRkX2FscGhhKCkgZnVuY3Rpb24gd2FzIGFkZGVkIGF0IGxpYnBuZy0xLjIuNy4KLQotVGhlIGZ1bmN0aW9uIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpIHdhcyBhZGRlZCBhdCBsaWJwbmctMS4yLjkuCi1Vbmxpa2UgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgoKSwgdGhlIG5ldyBmdW5jdGlvbiBkb2VzIG5vdCBleHBhbmQgdGhlCi10Uk5TIGNodW5rIHRvIGFscGhhLiBUaGUgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgoKSBmdW5jdGlvbiBpcwotZGVwcmVjYXRlZC4KLQotQSBudW1iZXIgb2YgbWFjcm8gZGVmaW5pdGlvbnMgaW4gc3VwcG9ydCBvZiBydW50aW1lIHNlbGVjdGlvbiBvZgotYXNzZW1ibGVyIGNvZGUgZmVhdHVyZXMgKGVzcGVjaWFsbHkgSW50ZWwgTU1YIGNvZGUgc3VwcG9ydCkgd2VyZQotYWRkZWQgYXQgbGlicG5nLTEuMi4wOgotCi0gICAgUE5HX0FTTV9GTEFHX01NWF9TVVBQT1JUX0NPTVBJTEVECi0gICAgUE5HX0FTTV9GTEFHX01NWF9TVVBQT1JUX0lOX0NQVQotICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9DT01CSU5FX1JPVwotICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9JTlRFUkxBQ0UKLSAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1NVQgotICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfVVAKLSAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX0FWRwotICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfUEFFVEgKLSAgICBQTkdfQVNNX0ZMQUdTX0lOSVRJQUxJWkVECi0gICAgUE5HX01NWF9SRUFEX0ZMQUdTCi0gICAgUE5HX01NWF9GTEFHUwotICAgIFBOR19NTVhfV1JJVEVfRkxBR1MKLSAgICBQTkdfTU1YX0ZMQUdTCi0KLVdlIGFkZGVkIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGluIHN1cHBvcnQgb2YgcnVudGltZQotc2VsZWN0aW9uIG9mIGFzc2VtYmxlciBjb2RlIGZlYXR1cmVzOgotCi0gICAgcG5nX2dldF9tbXhfZmxhZ21hc2soKQotICAgIHBuZ19zZXRfbW14X3RocmVzaG9sZHMoKQotICAgIHBuZ19nZXRfYXNtX2ZsYWdzKCkKLSAgICBwbmdfZ2V0X21teF9iaXRkZXB0aF90aHJlc2hvbGQoKQotICAgIHBuZ19nZXRfbW14X3Jvd2J5dGVzX3RocmVzaG9sZCgpCi0gICAgcG5nX3NldF9hc21fZmxhZ3MoKQotCi1XZSByZXBsYWNlZCBhbGwgb2YgdGhlc2UgZnVuY3Rpb25zIHdpdGggc2ltcGxlIHN0dWJzIGluIGxpYnBuZy0xLjIuMjAsCi13aGVuIHRoZSBJbnRlbCBhc3NlbWJsZXIgY29kZSB3YXMgcmVtb3ZlZCBkdWUgdG8gYSBsaWNlbnNpbmcgaXNzdWUuCi0KLVRoZXNlIG1hY3JvcyBhcmUgZGVwcmVjYXRlZDoKLQotICAgIFBOR19SRUFEX1RSQU5TRk9STVNfTk9UX1NVUFBPUlRFRAotICAgIFBOR19QUk9HUkVTU0lWRV9SRUFEX05PVF9TVVBQT1JURUQKLSAgICBQTkdfTk9fU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAotICAgIFBOR19XUklURV9UUkFOU0ZPUk1TX05PVF9TVVBQT1JURUQKLSAgICBQTkdfUkVBRF9BTkNJTExBUllfQ0hVTktTX05PVF9TVVBQT1JURUQKLSAgICBQTkdfV1JJVEVfQU5DSUxMQVJZX0NIVU5LU19OT1RfU1VQUE9SVEVECi0KLVRoZXkgaGF2ZSBiZWVuIHJlcGxhY2VkLCByZXNwZWN0aXZlbHksIGJ5OgotCi0gICAgUE5HX05PX1JFQURfVFJBTlNGT1JNUwotICAgIFBOR19OT19QUk9HUkVTU0lWRV9SRUFECi0gICAgUE5HX05PX1NFUVVFTlRJQUxfUkVBRAotICAgIFBOR19OT19XUklURV9UUkFOU0ZPUk1TCi0gICAgUE5HX05PX1JFQURfQU5DSUxMQVJZX0NIVU5LUwotICAgIFBOR19OT19XUklURV9BTkNJTExBUllfQ0hVTktTCi0KLVBOR19NQVhfVUlOVCB3YXMgcmVwbGFjZWQgd2l0aCBQTkdfVUlOVF8zMV9NQVguICBJdCBoYXMgYmVlbgotZGVwcmVjYXRlZCBzaW5jZSBsaWJwbmctMS4wLjE2IGFuZCBsaWJwbmctMS4yLjYuCi0KLVRoZSBmdW5jdGlvbgotICAgIHBuZ19jaGVja19zaWcoc2lnLCBudW0pCi13YXMgcmVwbGFjZWQgd2l0aAotICAgICFwbmdfc2lnX2NtcChzaWcsIDAsIG51bSkKLUl0IGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgbGlicG5nLTAuOTAuCi0KLVRoZSBmdW5jdGlvbgotICAgIHBuZ19zZXRfZ3JheV8xXzJfNF90b184KCkKLXdoaWNoIGFsc28gZXhwYW5kcyB0Uk5TIHRvIGFscGhhIHdhcyByZXBsYWNlZCB3aXRoCi0gICAgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkKLXdoaWNoIGRvZXMgbm90LiBJdCBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIGxpYnBuZy0xLjAuMTggYW5kIDEuMi45LgotCi0uU0ggSVguICBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMS4wLngvMS4yLnggdG8gMS40LngKLQotUHJpdmF0ZSBsaWJwbmcgcHJvdG90eXBlcyBhbmQgbWFjcm8gZGVmaW5pdGlvbnMgd2VyZSBtb3ZlZCBmcm9tCi1wbmcuaCBhbmQgcG5nY29uZi5oIGludG8gYSBuZXcgcG5ncHJpdi5oIGhlYWRlciBmaWxlLgotCi1GdW5jdGlvbnMgcG5nX3NldF9iZW5pZ25fZXJyb3JzKCksIHBuZ19iZW5pZ25fZXJyb3IoKSwgYW5kCi1wbmdfY2h1bmtfYmVuaWduX2Vycm9yKCkgd2VyZSBhZGRlZC4KLQotU3VwcG9ydCBmb3Igc2V0dGluZyB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHRoYXQgdGhlIGFwcGxpY2F0aW9uCi13aWxsIGFsbG9jYXRlIGZvciByZWFkaW5nIGNodW5rcyB3YXMgYWRkZWQsIGFzIGEgc2VjdXJpdHkgbWVhc3VyZS4KLVRoZSBmdW5jdGlvbnMgcG5nX3NldF9jaHVua19jYWNoZV9tYXgoKSBhbmQgcG5nX2dldF9jaHVua19jYWNoZV9tYXgoKQotd2VyZSBhZGRlZCB0byB0aGUgbGlicmFyeS4KLQotV2UgaW1wbGVtZW50ZWQgc3VwcG9ydCBmb3IgSS9PIHN0YXRlcyBieSBhZGRpbmcgcG5nX3B0ciBtZW1iZXIgaW9fc3RhdGUKLWFuZCBmdW5jdGlvbnMgcG5nX2dldF9pb19jaHVua19uYW1lKCkgYW5kIHBuZ19nZXRfaW9fc3RhdGUoKSBpbiBwbmdnZXQuYwotCi1XZSBhZGRlZCBQTkdfVFJBTlNGT1JNX0dSQVlfVE9fUkdCIHRvIHRoZSBhdmFpbGFibGUgaGlnaC1sZXZlbAotaW5wdXQgdHJhbnNmb3Jtcy4KLQotQ2hlY2tpbmcgZm9yIGFuZCByZXBvcnRpbmcgb2YgZXJyb3JzIGluIHRoZSBJSERSIGNodW5rIGlzIG1vcmUgdGhvcm91Z2guCi0KLVN1cHBvcnQgZm9yIGdsb2JhbCBhcnJheXMgd2FzIHJlbW92ZWQsIHRvIGltcHJvdmUgdGhyZWFkIHNhZmV0eS4KLQotU29tZSBvYnNvbGV0ZS9kZXByZWNhdGVkIG1hY3JvcyBhbmQgZnVuY3Rpb25zIGhhdmUgYmVlbiByZW1vdmVkLgotCi1UeXBlY2FzdGVkIE5VTEwgZGVmaW5pdGlvbnMgc3VjaCBhcwotICAgI2RlZmluZSBwbmdfdm9pZHBfTlVMTCAgICAgICAgICAgIChwbmdfdm9pZHApTlVMTAotd2VyZSBlbGltaW5hdGVkLiAgSWYgeW91IHVzZWQgdGhlc2UgaW4geW91ciBhcHBsaWNhdGlvbiwganVzdCB1c2UKLU5VTEwgaW5zdGVhZC4KLQotVGhlIHBuZ19zdHJ1Y3QgYW5kIGluZm9fc3RydWN0IG1lbWJlcnMgInRyYW5zIiBhbmQgInRyYW5zX3ZhbHVlcyIgd2VyZQotY2hhbmdlZCB0byAidHJhbnNfYWxwaGEiIGFuZCAidHJhbnNfY29sb3IiLCByZXNwZWN0aXZlbHkuCi0KLVRoZSBvYnNvbGV0ZSwgdW51c2VkIHBuZ2djY3JkLmMgYW5kIHBuZ3ZjcmQuYyBmaWxlcyBhbmQgcmVsYXRlZCBtYWtlZmlsZXMKLXdlcmUgcmVtb3ZlZC4KLQotVGhlIFBOR18xXzBfWCBhbmQgUE5HXzFfMl9YIG1hY3JvcyB3ZXJlIGVsaW1pbmF0ZWQuCi0KLVRoZSBQTkdfTEVHQUNZX1NVUFBPUlRFRCBtYWNybyB3YXMgZWxpbWluYXRlZC4KLQotTWFueSBXSU4zMl9XQ0UgI2lmZGVmcyB3ZXJlIHJlbW92ZWQuCi0KLVRoZSBmdW5jdGlvbnMgcG5nX3JlYWRfaW5pdChpbmZvX3B0ciksIHBuZ193cml0ZV9pbml0KGluZm9fcHRyKSwKLXBuZ19pbmZvX2luaXQoaW5mb19wdHIpLCBwbmdfcmVhZF9kZXN0cm95KCksIGFuZCBwbmdfd3JpdGVfZGVzdHJveSgpCi1oYXZlIGJlZW4gcmVtb3ZlZC4gIFRoZXkgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgbGlicG5nLTAuOTUuCi0KLVRoZSBwbmdfcGVybWl0X2VtcHR5X3BsdGUoKSB3YXMgcmVtb3ZlZC4gSXQgaGFzIGJlZW4gZGVwcmVjYXRlZAotc2luY2UgbGlicG5nLTEuMC45LiAgVXNlIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKCkgaW5zdGVhZC4KLQotV2UgcmVtb3ZlZCB0aGUgb2Jzb2xldGUgc3R1YiBmdW5jdGlvbnMgcG5nX2dldF9tbXhfZmxhZ21hc2soKSwKLXBuZ19zZXRfbW14X3RocmVzaG9sZHMoKSwgcG5nX2dldF9hc21fZmxhZ3MoKSwKLXBuZ19nZXRfbW14X2JpdGRlcHRoX3RocmVzaG9sZCgpLCBwbmdfZ2V0X21teF9yb3dieXRlc190aHJlc2hvbGQoKSwKLXBuZ19zZXRfYXNtX2ZsYWdzKCksIGFuZCBwbmdfbW14X3N1cHBvcnRlZCgpCi0KLVdlIHJlbW92ZWQgdGhlIG9ic29sZXRlIHBuZ19jaGVja19zaWcoKSwgcG5nX21lbWNweV9jaGVjaygpLCBhbmQKLXBuZ19tZW1zZXRfY2hlY2soKSBmdW5jdGlvbnMuICBJbnN0ZWFkIHVzZSAhcG5nX3NpZ19jbXAoKSwgcG5nX21lbWNweSgpLAotYW5kIHBuZ19tZW1zZXQoKSwgcmVzcGVjdGl2ZWx5LgotCi1UaGUgZnVuY3Rpb24gcG5nX3NldF9ncmF5XzFfMl80X3RvXzgoKSB3YXMgcmVtb3ZlZC4gSXQgaGFzIGJlZW4KLWRlcHJlY2F0ZWQgc2luY2UgbGlicG5nLTEuMC4xOCBhbmQgMS4yLjksIHdoZW4gaXQgd2FzIHJlcGxhY2VkIHdpdGgKLXBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpIGJlY2F1c2UgdGhlIGZvcm1lciBmdW5jdGlvbiBhbHNvCi1leHBhbmRlZCBwYWxldHRlIGltYWdlcy4KLQotTWFjcm9zIGZvciBwbmdfZ2V0X3VpbnRfMTYsIHBuZ19nZXRfdWludF8zMiwgYW5kIHBuZ19nZXRfaW50XzMyCi13ZXJlIGFkZGVkIGFuZCBhcmUgdXNlZCBieSBkZWZhdWx0IGluc3RlYWQgb2YgdGhlIGNvcnJlc3BvbmRpbmcKLWZ1bmN0aW9ucy4gVW5mb3J0dW5hdGVseSwKLWZyb20gbGlicG5nLTEuNC4wIHVudGlsIDEuNC40LCB0aGUgcG5nX2dldF91aW50XzE2IG1hY3JvIChidXQgbm90IHRoZSAgCi1mdW5jdGlvbikgaW5jb3JyZWN0bHkgcmV0dXJuZWQgYSB2YWx1ZSBvZiB0eXBlIHBuZ191aW50XzMyLgotCi1XZSBjaGFuZ2VkIHRoZSBwcm90b3R5cGUgZm9yIHBuZ19tYWxsb2MoKSBmcm9tCi0gICAgcG5nX21hbGxvYyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiBzaXplKQotdG8KLSAgICBwbmdfbWFsbG9jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19hbGxvY19zaXplX3Qgc2l6ZSkKLQotVGhpcyBhbHNvIGFwcGxpZXMgdG8gdGhlIHByb3RvdHlwZSBmb3IgdGhlIHVzZXIgcmVwbGFjZW1lbnQgbWFsbG9jX2ZuKCkuCi0KLVRoZSBwbmdfY2FsbG9jKCkgZnVuY3Rpb24gd2FzIGFkZGVkIGFuZCBpcyB1c2VkIGluIHBsYWNlIG9mCi1vZiAicG5nX21hbGxvYygpOyBwbmdfbWVtc2V0KCk7IiBleGNlcHQgaW4gdGhlIGNhc2UgaW4gcG5nX3JlYWRfcG5nKCkKLXdoZXJlIHRoZSBhcnJheSBjb25zaXN0cyBvZiBwb2ludGVyczsgaW4gdGhpcyBjYXNlIGEgImZvciIgbG9vcCBpcyB1c2VkCi1hZnRlciB0aGUgcG5nX21hbGxvYygpIHRvIHNldCB0aGUgcG9pbnRlcnMgdG8gTlVMTCwgdG8gZ2l2ZSByb2J1c3QuCi1iZWhhdmlvciBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiBydW5zIG91dCBvZiBtZW1vcnkgcGFydC13YXkgdGhyb3VnaAotdGhlIHByb2Nlc3MuCi0KLVdlIGNoYW5nZWQgdGhlIHByb3RvdHlwZXMgb2YgcG5nX2dldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSgpIGFuZAotcG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSgpIHRvIHdvcmsgd2l0aCBwbmdfc2l6ZV90IGluc3RlYWQgb2YKLXBuZ191aW50XzMyLgotCi1TdXBwb3J0IGZvciBudW1iZXJlZCBlcnJvciBtZXNzYWdlcyB3YXMgcmVtb3ZlZCBieSBkZWZhdWx0LCBzaW5jZSB3ZQotbmV2ZXIgZ290IGFyb3VuZCB0byBhY3R1YWxseSBudW1iZXJpbmcgdGhlIGVycm9yIG1lc3NhZ2VzLiBUaGUgZnVuY3Rpb24KLXBuZ19zZXRfc3RyaXBfZXJyb3JfbnVtYmVycygpIHdhcyByZW1vdmVkIGZyb20gdGhlIGxpYnJhcnkgYnkgZGVmYXVsdC4KLQotVGhlIHBuZ196YWxsb2MoKSBhbmQgcG5nX3pmcmVlKCkgZnVuY3Rpb25zIGFyZSBubyBsb25nZXIgZXhwb3J0ZWQuCi1UaGUgcG5nX3phbGxvYygpIGZ1bmN0aW9uIG5vIGxvbmdlciB6ZXJvZXMgb3V0IHRoZSBtZW1vcnkgdGhhdCBpdAotYWxsb2NhdGVzLgotCi1TdXBwb3J0IGZvciBkaXRoZXJpbmcgd2FzIGRpc2FibGVkIGJ5IGRlZmF1bHQgaW4gbGlicG5nLTEuNC4wLCBiZWNhdXNlCi1pdCBoYXMgbm90IGJlZW4gd2VsbCB0ZXN0ZWQgYW5kIGRvZXNuJ3QgYWN0dWFsbHkgImRpdGhlciIuCi1UaGUgY29kZSB3YXMgbm90Ci1yZW1vdmVkLCBob3dldmVyLCBhbmQgY291bGQgYmUgZW5hYmxlZCBieSBidWlsZGluZyBsaWJwbmcgd2l0aAotUE5HX1JFQURfRElUSEVSX1NVUFBPUlRFRCBkZWZpbmVkLiAgSW4gbGlicG5nLTEuNC4yLCB0aGlzIHN1cHBvcnQKLXdhcyByZWVuYWJsZWQsIGJ1dCB0aGUgZnVuY3Rpb24gd2FzIHJlbmFtZWQgcG5nX3NldF9xdWFudGl6ZSgpIHRvCi1yZWZsZWN0IG1vcmUgYWNjdXJhdGVseSB3aGF0IGl0IGFjdHVhbGx5IGRvZXMuICBBdCB0aGUgc2FtZSB0aW1lLAotdGhlIFBOR19ESVRIRVJfW1JFRCxHUkVFTl9CTFVFXV9CSVRTIG1hY3JvcyB3ZXJlIGFsc28gcmVuYW1lZCB0bwotUE5HX1FVQU5USVpFX1tSRUQsR1JFRU4sQkxVRV1fQklUUy4KLQotV2UgcmVtb3ZlZCB0aGUgdHJhaWxpbmcgJy4nIGZyb20gdGhlIHdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzLgotCi0uU0ggWC4gRGV0ZWN0aW5nIGxpYnBuZwotCi1UaGUgcG5nX2dldF9pb19wdHIoKSBmdW5jdGlvbiBoYXMgYmVlbiBwcmVzZW50IHNpbmNlIGxpYnBuZy0wLjg4LCBoYXMgbmV2ZXIKLWNoYW5nZWQsIGFuZCBpcyB1bmFmZmVjdGVkIGJ5IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIG1hY3Jvcy4gIEl0IGlzIHRoZQotYmVzdCBjaG9pY2UgZm9yIHVzZSBpbiBjb25maWd1cmUgc2NyaXB0cyBmb3IgZGV0ZWN0aW5nIHRoZSBwcmVzZW5jZSBvZiBhbnkKLWxpYnBuZyB2ZXJzaW9uIHNpbmNlIDAuODguICBJbiBhbiBhdXRvY29uZiAiY29uZmlndXJlLmluIiB5b3UgY291bGQgdXNlCi0KLSAgICBBQ19DSEVDS19MSUIocG5nLCBwbmdfZ2V0X2lvX3B0ciwgLi4uCi0KLS5TSCBYSS4gU291cmNlIGNvZGUgcmVwb3NpdG9yeQotCi1TaW5jZSBhYm91dCBGZWJydWFyeSAyMDA5LCB2ZXJzaW9uIDEuMi4zNCwgbGlicG5nIGhhcyBiZWVuIHVuZGVyICJnaXQiIHNvdXJjZQotY29udHJvbC4gIFRoZSBnaXQgcmVwb3NpdG9yeSB3YXMgYnVpbHQgZnJvbSBvbGQgbGlicG5nLXgueS56LnRhci5neiBmaWxlcwotZ29pbmcgYmFjayB0byB2ZXJzaW9uIDAuNzAuICBZb3UgY2FuIGFjY2VzcyB0aGUgZ2l0IHJlcG9zaXRvcnkgKHJlYWQgb25seSkKLWF0Ci0KLSAgICBnaXQ6Ly9saWJwbmcuZ2l0LnNvdXJjZWZvcmdlLm5ldC9naXRyb290L2xpYnBuZwotCi1vciB5b3UgY2FuIGJyb3dzZSBpdCB2aWEgImdpdHdlYiIgYXQKLQotICAgIGh0dHA6Ly9saWJwbmcuZ2l0LnNvdXJjZWZvcmdlLm5ldC9naXQvZ2l0d2ViLmNnaT9wPWxpYnBuZwotCi1QYXRjaGVzIGNhbiBiZSBzZW50IHRvIGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0IG9yIHRvCi1wbmctbW5nLWltcGxlbWVudCBhdCBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgb3IgeW91IGNhbiB1cGxvYWQgdGhlbSB0bwotdGhlIGxpYnBuZyBidWcgdHJhY2tlciBhdAotCi0gICAgaHR0cDovL2xpYnBuZy5zb3VyY2Vmb3JnZS5uZXQKLQotLlNIIFhJSS4gQ29kaW5nIHN0eWxlCi0KLU91ciBjb2Rpbmcgc3R5bGUgaXMgc2ltaWxhciB0byB0aGUgIkFsbG1hbiIgc3R5bGUsIHdpdGggY3VybHkKLWJyYWNlcyBvbiBzZXBhcmF0ZSBsaW5lczoKLQotICAgIGlmIChjb25kaXRpb24pCi0gICAgewotICAgICAgIGFjdGlvbjsKLSAgICB9Ci0KLSAgICBlbHNlIGlmIChhbm90aGVyIGNvbmRpdGlvbikKLSAgICB7Ci0gICAgICAgYW5vdGhlciBhY3Rpb247Ci0gICAgfQotCi1UaGUgYnJhY2VzIGNhbiBiZSBvbWl0dGVkIGZyb20gc2ltcGxlIG9uZS1saW5lIGFjdGlvbnM6Ci0KLSAgICBpZiAoY29uZGl0aW9uKQotICAgICAgIHJldHVybiAoMCk7Ci0KLVdlIHVzZSAzLXNwYWNlIGluZGVudGF0aW9uLCBleGNlcHQgZm9yIGNvbnRpbnVlZCBzdGF0ZW1lbnRzIHdoaWNoCi1hcmUgdXN1YWxseSBpbmRlbnRlZCB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgc3RhdGVtZW50Ci1wbHVzIGZvdXIgbW9yZSBzcGFjZXMuCi0KLUZvciBtYWNybyBkZWZpbml0aW9ucyB3ZSB1c2UgMi1zcGFjZSBpbmRlbnRhdGlvbiwgYWx3YXlzIGxlYXZpbmcgdGhlICIjIgotaW4gdGhlIGZpcnN0IGNvbHVtbi4KLQotICAgICNpZm5kZWYgUE5HX05PX0ZFQVRVUkUKLSAgICAjICBpZm5kZWYgUE5HX0ZFQVRVUkVfU1VQUE9SVEVECi0gICAgIyAgICBkZWZpbmUgUE5HX0ZFQVRVUkVfU1VQUE9SVEVECi0gICAgIyAgZW5kaWYKLSAgICAjZW5kaWYKLQotQ29tbWVudHMgYXBwZWFyIHdpdGggdGhlIGxlYWRpbmcgIi8qIiBhdCB0aGUgc2FtZSBpbmRlbnRhdGlvbiBhcwotdGhlIHN0YXRlbWVudCB0aGF0IGZvbGxvd3MgdGhlIGNvbW1lbnQ6Ci0KLSAgICAvKiBTaW5nbGUtbGluZSBjb21tZW50ICovCi0gICAgc3RhdGVtZW50OwotCi0gICAgLyogVGhpcyBpcyBhIG11bHRpcGxlLWxpbmUKLSAgICAgKiBjb21tZW50LgotICAgICAqLwotICAgIHN0YXRlbWVudDsKLQotVmVyeSBzaG9ydCBjb21tZW50cyBjYW4gYmUgcGxhY2VkIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHN0YXRlbWVudAotdG8gd2hpY2ggdGhleSBwZXJ0YWluOgotCi0gICAgc3RhdGVtZW50OyAgICAvKiBjb21tZW50ICovCi0KLVdlIGRvbid0IHVzZSBDKysgc3R5bGUgKCIvLyIpIGNvbW1lbnRzLiBXZSBoYXZlLCBob3dldmVyLAotdXNlZCB0aGVtIGluIHRoZSBwYXN0IGluIHNvbWUgbm93LWFiYW5kb25lZCBNTVggYXNzZW1ibGVyCi1jb2RlLgotCi1GdW5jdGlvbnMgYW5kIHRoZWlyIGN1cmx5IGJyYWNlcyBhcmUgbm90IGluZGVudGVkLCBhbmQKLWV4cG9ydGVkIGZ1bmN0aW9ucyBhcmUgbWFya2VkIHdpdGggUE5HQVBJOgotCi0gLyogVGhpcyBpcyBhIHB1YmxpYyBmdW5jdGlvbiB0aGF0IGlzIHZpc2libGUgdG8KLSAgKiBhcHBsaWNhdGlvbiBwcm9ncmFtZXJzLiBJdCBkb2VzIHRodXMtYW5kLXNvLgotICAqLwotIHZvaWQgUE5HQVBJCi0gcG5nX2V4cG9ydGVkX2Z1bmN0aW9uKHBuZ19wdHIsIHBuZ19pbmZvLCBmb28pCi0gewotICAgIGJvZHk7Ci0gfQotCi1UaGUgcHJvdG90eXBlcyBmb3IgYWxsIGV4cG9ydGVkIGZ1bmN0aW9ucyBhcHBlYXIgaW4gcG5nLmgsCi1hYm92ZSB0aGUgY29tbWVudCB0aGF0IHNheXMKLQotICAgIC8qIE1haW50YWluZXI6IFB1dCBuZXcgcHVibGljIHByb3RvdHlwZXMgaGVyZSAuLi4gKi8KLQotV2UgbWFyayBhbGwgbm9uLWV4cG9ydGVkIGZ1bmN0aW9ucyB3aXRoICIvKiBQUklWQVRFICovIiI6Ci0KLSB2b2lkIC8qIFBSSVZBVEUgKi8KLSBwbmdfbm9uX2V4cG9ydGVkX2Z1bmN0aW9uKHBuZ19wdHIsIHBuZ19pbmZvLCBmb28pCi0gewotICAgIGJvZHk7Ci0gfQotCi1UaGUgcHJvdG90eXBlcyBmb3Igbm9uLWV4cG9ydGVkIGZ1bmN0aW9ucyAoZXhjZXB0IGZvciB0aG9zZSBpbgotcG5ndGVzdCkgYXBwZWFyIGluCi1wbmdwcml2LmgKLWFib3ZlIHRoZSBjb21tZW50IHRoYXQgc2F5cwotCi0gIC8qIE1haW50YWluZXI6IFB1dCBuZXcgcHJpdmF0ZSBwcm90b3R5cGVzIGhlcmUgXiBhbmQgaW4gbGlicG5ncGYuMyAqLwotCi1UbyBhdm9pZCBwb2xsdXRpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIHRoZSBuYW1lcyBvZiBhbGwgZXhwb3J0ZWQKLWZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGJlZ2luIHdpdGggInBuZ18iLCBhbmQgYWxsIHB1YmxpY2x5IHZpc2libGUgQwotcHJlcHJvY2Vzc29yIG1hY3JvcyBiZWdpbiB3aXRoICJQTkciLiAgV2UgcmVxdWVzdCB0aGF0IGFwcGxpY2F0aW9ucyB0aGF0Ci11c2UgbGlicG5nICpub3QqIGJlZ2luIGFueSBvZiB0aGVpciBvd24gc3ltYm9scyB3aXRoIGVpdGhlciBvZiB0aGVzZSBzdHJpbmdzLgotCi1XZSBwdXQgYSBzcGFjZSBhZnRlciBlYWNoIGNvbW1hIGFuZCBhZnRlciBlYWNoIHNlbWljb2xvbgotaW4gImZvciIgc3RhdG1lbnRzLCBhbmQgd2UgcHV0IHNwYWNlcyBiZWZvcmUgYW5kIGFmdGVyIGVhY2gKLUMgYmluYXJ5IG9wZXJhdG9yIGFuZCBhZnRlciAiZm9yIiBvciAid2hpbGUiLCBhbmQgYmVmb3JlCi0iPyIuICBXZSBkb24ndCBwdXQgYSBzcGFjZSBiZXR3ZWVuIGEgdHlwZWNhc3QgYW5kIHRoZSBleHByZXNzaW9uCi1iZWluZyBjYXN0LCBub3IgZG8gd2UgcHV0IG9uZSBiZXR3ZWVuIGEgZnVuY3Rpb24gbmFtZSBhbmQgdGhlCi1sZWZ0IHBhcmVudGhlc2lzIHRoYXQgZm9sbG93cyBpdDoKLQotICAgIGZvciAoaSA9IDI7IGkgPiAwOyAtLWkpCi0gICAgICAgeVtpXSA9IGEoeCkgKyAoaW50KWI7Ci0KLVdlIHByZWZlciAjaWZkZWYgYW5kICNpZm5kZWYgdG8gI2lmIGRlZmluZWQoKSBhbmQgaWYgIWRlZmluZWQoKQotd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBtYWNybyBiZWluZyB0ZXN0ZWQuCi0KLVdlIGRvIG5vdCB1c2UgdGhlIFRBQiBjaGFyYWN0ZXIgZm9yIGluZGVudGF0aW9uIGluIHRoZSBDIHNvdXJjZXMuCi0KLUxpbmVzIGRvIG5vdCBleGNlZWQgODAgY2hhcmFjdGVycy4KLQotT3RoZXIgcnVsZXMgY2FuIGJlIGluZmVycmVkIGJ5IGluc3BlY3RpbmcgdGhlIGxpYnBuZyBzb3VyY2UuCi0KLS5TSCBYSUlJLiBZMksgQ29tcGxpYW5jZSBpbiBsaWJwbmcKLQotSnVseSAxMCwgMjAxMgotCi1TaW5jZSB0aGUgUE5HIERldmVsb3BtZW50IGdyb3VwIGlzIGFuIGFkLWhvYyBib2R5LCB3ZSBjYW4ndCBtYWtlCi1hbiBvZmZpY2lhbCBkZWNsYXJhdGlvbi4KLQotVGhpcyBpcyB5b3VyIHVub2ZmaWNpYWwgYXNzdXJhbmNlIHRoYXQgbGlicG5nIGZyb20gdmVyc2lvbiAwLjcxIGFuZAotdXB3YXJkIHRocm91Z2ggMS40LjEyIGFyZSBZMksgY29tcGxpYW50LiAgSXQgaXMgbXkgYmVsaWVmIHRoYXQgZWFybGllcgotdmVyc2lvbnMgd2VyZSBhbHNvIFkySyBjb21wbGlhbnQuCi0KLUxpYnBuZyBvbmx5IGhhcyB0aHJlZSB5ZWFyIGZpZWxkcy4gIE9uZSBpcyBhIDItYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIHRoYXQKLXdpbGwgaG9sZCB5ZWFycyB1cCB0byA2NTUzNS4gIFRoZSBvdGhlciB0d28gaG9sZCB0aGUgZGF0ZSBpbiB0ZXh0Ci1mb3JtYXQsIGFuZCB3aWxsIGhvbGQgeWVhcnMgdXAgdG8gOTk5OS4KLQotVGhlIGludGVnZXIgaXMKLSAgICAicG5nX3VpbnRfMTYgeWVhciIgaW4gcG5nX3RpbWVfc3RydWN0LgotCi1UaGUgc3RyaW5ncyBhcmUKLSAgICAicG5nX2NoYXJwIHRpbWVfYnVmZmVyIiBpbiBwbmdfc3RydWN0IGFuZAotICAgICJuZWFyX3RpbWVfYnVmZmVyIiwgd2hpY2ggaXMgYSBsb2NhbCBjaGFyYWN0ZXIgc3RyaW5nIGluIHBuZy5jLgotCi1UaGVyZSBhcmUgc2V2ZW4gdGltZS1yZWxhdGVkIGZ1bmN0aW9uczoKLQotICAgIHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzKCkgaW4gcG5nLmMKLSAgICAgIChmb3JtZXJseSBwbmdfY29udmVydF90b19yZmNfMTE1MigpIGluIGVycm9yKQotICAgIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKCkgaW4gcG5nd3JpdGUuYywgY2FsbGVkCi0gICAgICBpbiBwbmd3cml0ZS5jCi0gICAgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBpbiBwbmd3cml0ZS5jCi0gICAgcG5nX2dldF90SU1FKCkgaW4gcG5nZ2V0LmMKLSAgICBwbmdfaGFuZGxlX3RJTUUoKSBpbiBwbmdydXRpbC5jLCBjYWxsZWQgaW4gcG5ncmVhZC5jCi0gICAgcG5nX3NldF90SU1FKCkgaW4gcG5nc2V0LmMKLSAgICBwbmdfd3JpdGVfdElNRSgpIGluIHBuZ3d1dGlsLmMsIGNhbGxlZCBpbiBwbmd3cml0ZS5jCi0KLUFsbCBhcHBlYXIgdG8gaGFuZGxlIGRhdGVzIHByb3Blcmx5IGluIGEgWTJLIGVudmlyb25tZW50LiAgVGhlCi1wbmdfY29udmVydF9mcm9tX3RpbWVfdCgpIGZ1bmN0aW9uIGNhbGxzIGdtdGltZSgpIHRvIGNvbnZlcnQgZnJvbSBzeXN0ZW0KLWNsb2NrIHRpbWUsIHdoaWNoIHJldHVybnMgKHllYXIgLSAxOTAwKSwgd2hpY2ggd2UgcHJvcGVybHkgY29udmVydCB0bwotdGhlIGZ1bGwgNC1kaWdpdCB5ZWFyLiAgVGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IGFwcGxpY2F0aW9ucyB1c2luZwotbGlicG5nIGFyZSBub3QgcGFzc2luZyA0LWRpZ2l0IHllYXJzIGludG8gdGhlIHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzKCkKLWZ1bmN0aW9uLCBvciB0aGF0IHRoZXkgYXJlIGluY29ycmVjdGx5IHBhc3Npbmcgb25seSBhIDItZGlnaXQgeWVhcgotaW5zdGVhZCBvZiAieWVhciAtIDE5MDAiIGludG8gdGhlIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKCkgZnVuY3Rpb24sCi1idXQgdGhpcyBpcyBub3QgdW5kZXIgb3VyIGNvbnRyb2wuICBUaGUgbGlicG5nIGRvY3VtZW50YXRpb24gaGFzIGFsd2F5cwotc3RhdGVkIHRoYXQgaXQgd29ya3Mgd2l0aCA0LWRpZ2l0IHllYXJzLCBhbmQgdGhlIEFQSXMgaGF2ZSBiZWVuCi1kb2N1bWVudGVkIGFzIHN1Y2guCi0KLVRoZSB0SU1FIGNodW5rIGl0c2VsZiBpcyBhbHNvIFkySyBjb21wbGlhbnQuICBJdCB1c2VzIGEgMi1ieXRlIHVuc2lnbmVkCi1pbnRlZ2VyIHRvIGhvbGQgdGhlIHllYXIsIGFuZCBjYW4gaG9sZCB5ZWFycyBhcyBsYXJnZSBhcyA2NTUzNS4KLQotemxpYiwgdXBvbiB3aGljaCBsaWJwbmcgZGVwZW5kcywgaXMgYWxzbyBZMksgY29tcGxpYW50LiAgSXQgY29udGFpbnMKLW5vIGRhdGUtcmVsYXRlZCBjb2RlLgotCi0KLSAgIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICAgbGlicG5nIG1haW50YWluZXIKLSAgIFBORyBEZXZlbG9wbWVudCBHcm91cAotCi0uU0ggTk9URQotCi1Ob3RlIGFib3V0IGxpYnBuZyB2ZXJzaW9uIG51bWJlcnM6Ci0KLUR1ZSB0byB2YXJpb3VzIG1pc2NvbW11bmljYXRpb25zLCB1bmZvcmVzZWVuIGNvZGUgaW5jb21wYXRpYmlsaXRpZXMKLWFuZCBvY2Nhc2lvbmFsIGZhY3RvcnMgb3V0c2lkZSB0aGUgYXV0aG9ycycgY29udHJvbCwgdmVyc2lvbiBudW1iZXJpbmcKLW9uIHRoZSBsaWJyYXJ5IGhhcyBub3QgYWx3YXlzIGJlZW4gY29uc2lzdGVudCBhbmQgc3RyYWlnaHRmb3J3YXJkLgotVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIG1hdHRlcnMgc2luY2UgdmVyc2lvbiAwLjg5Yywgd2hpY2ggd2FzCi10aGUgZmlyc3Qgd2lkZWx5IHVzZWQgcmVsZWFzZToKLQotIHNvdXJjZSAgICAgICAgICAgICBwbmcuaCAgcG5nLmggIHNoYXJlZC1saWIKLSB2ZXJzaW9uICAgICAgICAgICAgc3RyaW5nICAgaW50ICB2ZXJzaW9uCi0gLS0tLS0tLSAgICAgICAgICAgIC0tLS0tLSAgLS0tLS0gLS0tLS0tLS0tLQotIDAuODljICgiYmV0YSAzIikgIDAuODkgICAgICAgODkgIDEuMC44OQotIDAuOTAgICgiYmV0YSA0IikgIDAuOTAgICAgICAgOTAgIDAuOTAKLSAwLjk1ICAoImJldGEgNSIpICAwLjk1ICAgICAgIDk1ICAwLjk1Ci0gMC45NiAgKCJiZXRhIDYiKSAgMC45NiAgICAgICA5NiAgMC45NgotIDAuOTdiICgiYmV0YSA3IikgIDEuMDAuOTcgICAgOTcgIDEuMC4xCi0gMC45N2MgICAgICAgICAgICAgMC45NyAgICAgICA5NyAgMi4wLjk3Ci0gMC45OCAgICAgICAgICAgICAgMC45OCAgICAgICA5OCAgMi4wLjk4Ci0gMC45OSAgICAgICAgICAgICAgMC45OSAgICAgICA5OCAgMi4wLjk5Ci0gMC45OWEtbSAgICAgICAgICAgMC45OSAgICAgICA5OSAgMi4wLjk5Ci0gMS4wMCAgICAgICAgICAgICAgMS4wMCAgICAgIDEwMCAgMi4xLjAKLSAxLjAuMCAgICAgICAgICAgICAxLjAuMCAgICAgMTAwICAyLjEuMAotIDEuMC4wICAgKGZyb20gaGVyZSBvbiwgdGhlICAxMDAgIDIuMS4wCi0gMS4wLjEgICAgcG5nLmggc3RyaW5nIGlzICAxMDAwMSAgMi4xLjAKLSAxLjAuMWEtZSBpZGVudGljYWwgdG8gdGhlIDEwMDAyICBmcm9tIGhlcmUgb24sIHRoZQotIDEuMC4yICAgIHNvdXJjZSB2ZXJzaW9uKSAgMTAwMDIgIHNoYXJlZCBsaWJyYXJ5IGlzIDIuVgotIDEuMC4yYS1iICAgICAgICAgICAgICAgICAgMTAwMDMgIHdoZXJlIFYgaXMgdGhlIHNvdXJjZQotIDEuMC4xICAgICAgICAgICAgICAgICAgICAgMTAwMDEgIGNvZGUgdmVyc2lvbiBleGNlcHQgYXMKLSAxLjAuMWEtZSAgICAgICAgICAgICAgICAgIDEwMDAyICAyLjEuMC4xYS1lICAgbm90ZWQuCi0gMS4wLjIgICAgICAgICAgICAgICAgICAgICAxMDAwMiAgMi4xLjAuMgotIDEuMC4yYS1iICAgICAgICAgICAgICAgICAgMTAwMDMgIDIuMS4wLjJhLWIKLSAxLjAuMyAgICAgICAgICAgICAgICAgICAgIDEwMDAzICAyLjEuMC4zCi0gMS4wLjNhLWQgICAgICAgICAgICAgICAgICAxMDAwNCAgMi4xLjAuM2EtZAotIDEuMC40ICAgICAgICAgICAgICAgICAgICAgMTAwMDQgIDIuMS4wLjQKLSAxLjAuNGEtZiAgICAgICAgICAgICAgICAgIDEwMDA1ICAyLjEuMC40YS1mCi0gMS4wLjUgKCsgMiBwYXRjaGVzKSAgICAgICAxMDAwNSAgMi4xLjAuNQotIDEuMC41YS1kICAgICAgICAgICAgICAgICAgMTAwMDYgIDIuMS4wLjVhLWQKLSAxLjAuNWUtciAgICAgICAgICAgICAgICAgIDEwMTAwICAyLjEuMC41ZS1yCi0gMS4wLjVzLXYgICAgICAgICAgICAgICAgICAxMDAwNiAgMi4xLjAuNXMtdgotIDEuMC42ICgrIDMgcGF0Y2hlcykgICAgICAgMTAwMDYgIDIuMS4wLjYKLSAxLjAuNmQtZyAgICAgICAgICAgICAgICAgIDEwMDA3ICAyLjEuMC42ZC1nCi0gMS4wLjZoICAgICAgICAgICAgICAgICAgICAxMDAwNyAgMTAuNmgKLSAxLjAuNmkgICAgICAgICAgICAgICAgICAgIDEwMDA3ICAxMC42aQotIDEuMC42aiAgICAgICAgICAgICAgICAgICAgMTAwMDcgIDIuMS4wLjZqCi0gMS4wLjdiZXRhMTEtMTQgICAgRExMTlVNICAxMDAwNyAgMi4xLjAuN2JldGExMS0xNAotIDEuMC43YmV0YTE1LTE4ICAgICAgIDEgICAgMTAwMDcgIDIuMS4wLjdiZXRhMTUtMTgKLSAxLjAuN3JjMS0yICAgICAgICAgICAxICAgIDEwMDA3ICAyLjEuMC43cmMxLTIKLSAxLjAuNyAgICAgICAgICAgICAgICAxICAgIDEwMDA3ICAyLjEuMC43Ci0gMS4wLjhiZXRhMS00ICAgICAgICAgMSAgICAxMDAwOCAgMi4xLjAuOGJldGExLTQKLSAxLjAuOHJjMSAgICAgICAgICAgICAxICAgIDEwMDA4ICAyLjEuMC44cmMxCi0gMS4wLjggICAgICAgICAgICAgICAgMSAgICAxMDAwOCAgMi4xLjAuOAotIDEuMC45YmV0YTEtNiAgICAgICAgIDEgICAgMTAwMDkgIDIuMS4wLjliZXRhMS02Ci0gMS4wLjlyYzEgICAgICAgICAgICAgMSAgICAxMDAwOSAgMi4xLjAuOXJjMQotIDEuMC45YmV0YTctMTAgICAgICAgIDEgICAgMTAwMDkgIDIuMS4wLjliZXRhNy0xMAotIDEuMC45cmMyICAgICAgICAgICAgIDEgICAgMTAwMDkgIDIuMS4wLjlyYzIKLSAxLjAuOSAgICAgICAgICAgICAgICAxICAgIDEwMDA5ICAyLjEuMC45Ci0gMS4wLjEwYmV0YTEgICAgICAgICAgMSAgICAxMDAxMCAgMi4xLjAuMTBiZXRhMQotIDEuMC4xMHJjMSAgICAgICAgICAgIDEgICAgMTAwMTAgIDIuMS4wLjEwcmMxCi0gMS4wLjEwICAgICAgICAgICAgICAgMSAgICAxMDAxMCAgMi4xLjAuMTAKLSAxLjAuMTFiZXRhMS0zICAgICAgICAxICAgIDEwMDExICAyLjEuMC4xMWJldGExLTMKLSAxLjAuMTFyYzEgICAgICAgICAgICAxICAgIDEwMDExICAyLjEuMC4xMXJjMQotIDEuMC4xMSAgICAgICAgICAgICAgIDEgICAgMTAwMTEgIDIuMS4wLjExCi0gMS4wLjEyYmV0YTEtMiAgICAgICAgMiAgICAxMDAxMiAgMi4xLjAuMTJiZXRhMS0yCi0gMS4wLjEycmMxICAgICAgICAgICAgMiAgICAxMDAxMiAgMi4xLjAuMTJyYzEKLSAxLjAuMTIgICAgICAgICAgICAgICAyICAgIDEwMDEyICAyLjEuMC4xMgotIDEuMS4wYS1mICAgICAgICAgICAgIC0gICAgMTAxMDAgIDIuMS4xLjBhLWYgYWJhbmRvbmVkCi0gMS4yLjBiZXRhMS0yICAgICAgICAgMiAgICAxMDIwMCAgMi4xLjIuMGJldGExLTIKLSAxLjIuMGJldGEzLTUgICAgICAgICAzICAgIDEwMjAwICAzLjEuMi4wYmV0YTMtNQotIDEuMi4wcmMxICAgICAgICAgICAgIDMgICAgMTAyMDAgIDMuMS4yLjByYzEKLSAxLjIuMCAgICAgICAgICAgICAgICAzICAgIDEwMjAwICAzLjEuMi4wCi0gMS4yLjFiZXRhLTQgICAgICAgICAgMyAgICAxMDIwMSAgMy4xLjIuMWJldGExLTQKLSAxLjIuMXJjMS0yICAgICAgICAgICAzICAgIDEwMjAxICAzLjEuMi4xcmMxLTIKLSAxLjIuMSAgICAgICAgICAgICAgICAzICAgIDEwMjAxICAzLjEuMi4xCi0gMS4yLjJiZXRhMS02ICAgICAgICAxMiAgICAxMDIwMiAgMTIuc28uMC4xLjIuMmJldGExLTYKLSAxLjAuMTNiZXRhMSAgICAgICAgIDEwICAgIDEwMDEzICAxMC5zby4wLjEuMC4xM2JldGExCi0gMS4wLjEzcmMxICAgICAgICAgICAxMCAgICAxMDAxMyAgMTAuc28uMC4xLjAuMTNyYzEKLSAxLjIuMnJjMSAgICAgICAgICAgIDEyICAgIDEwMjAyICAxMi5zby4wLjEuMi4ycmMxCi0gMS4wLjEzICAgICAgICAgICAgICAxMCAgICAxMDAxMyAgMTAuc28uMC4xLjAuMTMKLSAxLjIuMiAgICAgICAgICAgICAgIDEyICAgIDEwMjAyICAxMi5zby4wLjEuMi4yCi0gMS4yLjNyYzEtNiAgICAgICAgICAxMiAgICAxMDIwMyAgMTIuc28uMC4xLjIuM3JjMS02Ci0gMS4yLjMgICAgICAgICAgICAgICAxMiAgICAxMDIwMyAgMTIuc28uMC4xLjIuMwotIDEuMi40YmV0YTEtMyAgICAgICAgMTMgICAgMTAyMDQgIDEyLnNvLjAuMS4yLjRiZXRhMS0zCi0gMS4yLjRyYzEgICAgICAgICAgICAxMyAgICAxMDIwNCAgMTIuc28uMC4xLjIuNHJjMQotIDEuMC4xNCAgICAgICAgICAgICAgMTAgICAgMTAwMTQgIDEwLnNvLjAuMS4wLjE0Ci0gMS4yLjQgICAgICAgICAgICAgICAxMyAgICAxMDIwNCAgMTIuc28uMC4xLjIuNAotIDEuMi41YmV0YTEtMiAgICAgICAgMTMgICAgMTAyMDUgIDEyLnNvLjAuMS4yLjViZXRhMS0yCi0gMS4wLjE1cmMxICAgICAgICAgICAxMCAgICAxMDAxNSAgMTAuc28uMC4xLjAuMTVyYzEKLSAxLjAuMTUgICAgICAgICAgICAgIDEwICAgIDEwMDE1ICAxMC5zby4wLjEuMC4xNQotIDEuMi41ICAgICAgICAgICAgICAgMTMgICAgMTAyMDUgIDEyLnNvLjAuMS4yLjUKLSAxLjIuNmJldGExLTQgICAgICAgIDEzICAgIDEwMjA2ICAxMi5zby4wLjEuMi42YmV0YTEtNAotIDEuMi42cmMxLTUgICAgICAgICAgMTMgICAgMTAyMDYgIDEyLnNvLjAuMS4yLjZyYzEtNQotIDEuMC4xNiAgICAgICAgICAgICAgMTAgICAgMTAwMTYgIDEwLnNvLjAuMS4wLjE2Ci0gMS4yLjYgICAgICAgICAgICAgICAxMyAgICAxMDIwNiAgMTIuc28uMC4xLjIuNgotIDEuMi43YmV0YTEtMiAgICAgICAgMTMgICAgMTAyMDcgIDEyLnNvLjAuMS4yLjdiZXRhMS0yCi0gMS4wLjE3cmMxICAgICAgICAgICAxMCAgICAxMDAxNyAgMTIuc28uMC4xLjAuMTdyYzEKLSAxLjIuN3JjMSAgICAgICAgICAgIDEzICAgIDEwMjA3ICAxMi5zby4wLjEuMi43cmMxCi0gMS4wLjE3ICAgICAgICAgICAgICAxMCAgICAxMDAxNyAgMTIuc28uMC4xLjAuMTcKLSAxLjIuNyAgICAgICAgICAgICAgIDEzICAgIDEwMjA3ICAxMi5zby4wLjEuMi43Ci0gMS4yLjhiZXRhMS01ICAgICAgICAxMyAgICAxMDIwOCAgMTIuc28uMC4xLjIuOGJldGExLTUKLSAxLjAuMThyYzEtNSAgICAgICAgIDEwICAgIDEwMDE4ICAxMi5zby4wLjEuMC4xOHJjMS01Ci0gMS4yLjhyYzEtNSAgICAgICAgICAxMyAgICAxMDIwOCAgMTIuc28uMC4xLjIuOHJjMS01Ci0gMS4wLjE4ICAgICAgICAgICAgICAxMCAgICAxMDAxOCAgMTIuc28uMC4xLjAuMTgKLSAxLjIuOCAgICAgICAgICAgICAgIDEzICAgIDEwMjA4ICAxMi5zby4wLjEuMi44Ci0gMS4yLjliZXRhMS0zICAgICAgICAxMyAgICAxMDIwOSAgMTIuc28uMC4xLjIuOWJldGExLTMKLSAxLjIuOWJldGE0LTExICAgICAgIDEzICAgIDEwMjA5ICAxMi5zby4wLjlbLjBdCi0gMS4yLjlyYzEgICAgICAgICAgICAxMyAgICAxMDIwOSAgMTIuc28uMC45Wy4wXQotIDEuMi45ICAgICAgICAgICAgICAgMTMgICAgMTAyMDkgIDEyLnNvLjAuOVsuMF0KLSAxLjIuMTBiZXRhMS03ICAgICAgIDEzICAgIDEwMjEwICAxMi5zby4wLjEwWy4wXQotIDEuMi4xMHJjMS0yICAgICAgICAgMTMgICAgMTAyMTAgIDEyLnNvLjAuMTBbLjBdCi0gMS4yLjEwICAgICAgICAgICAgICAxMyAgICAxMDIxMCAgMTIuc28uMC4xMFsuMF0KLSAxLjQuMGJldGExLTYgICAgICAgIDE0ICAgIDEwNDAwICAxNC5zby4wLjBbLjBdCi0gMS4yLjExYmV0YTEtNCAgICAgICAxMyAgICAxMDIxMCAgMTIuc28uMC4xMVsuMF0KLSAxLjQuMGJldGE3LTggICAgICAgIDE0ICAgIDEwNDAwICAxNC5zby4wLjBbLjBdCi0gMS4yLjExICAgICAgICAgICAgICAxMyAgICAxMDIxMSAgMTIuc28uMC4xMVsuMF0KLSAxLjIuMTIgICAgICAgICAgICAgIDEzICAgIDEwMjEyICAxMi5zby4wLjEyWy4wXQotIDEuNC4wYmV0YTktMTQgICAgICAgMTQgICAgMTA0MDAgIDE0LnNvLjAuMFsuMF0KLSAxLjIuMTMgICAgICAgICAgICAgIDEzICAgIDEwMjEzICAxMi5zby4wLjEzWy4wXQotIDEuNC4wYmV0YTE1LTM2ICAgICAgMTQgICAgMTA0MDAgIDE0LnNvLjAuMFsuMF0KLSAxLjQuMGJldGEzNy04NyAgICAgIDE0ICAgIDEwNDAwICAxNC5zby4xNC4wWy4wXQotIDEuNC4wcmMwMSAgICAgICAgICAgMTQgICAgMTA0MDAgIDE0LnNvLjE0LjBbLjBdCi0gMS40LjBiZXRhODgtMTA5ICAgICAxNCAgICAxMDQwMCAgMTQuc28uMTQuMFsuMF0KLSAxLjQuMHJjMDItMDggICAgICAgIDE0ICAgIDEwNDAwICAxNC5zby4xNC4wWy4wXQotIDEuNC4wICAgICAgICAgICAgICAgMTQgICAgMTA0MDAgIDE0LnNvLjE0LjBbLjBdCi0gMS40LjFiZXRhMDEtMDMgICAgICAxNCAgICAxMDQwMSAgMTQuc28uMTQuMVsuMF0KLSAxLjQuMXJjMDEgICAgICAgICAgIDE0ICAgIDEwNDAxICAxNC5zby4xNC4xWy4wXQotIDEuNC4xYmV0YTA0LTEyICAgICAgMTQgICAgMTA0MDEgIDE0LnNvLjE0LjFbLjBdCi0gMS40LjFyYzAyLTA0ICAgICAgICAxNCAgICAxMDQwMSAgMTQuc28uMTQuMVsuMF0KLSAxLjQuMSAgICAgICAgICAgICAgIDE0ICAgIDEwNDAxICAxNC5zby4xNC4xWy4wXQotIDEuNC4yYmV0YTAxICAgICAgICAgMTQgICAgMTA0MDIgIDE0LnNvLjE0LjJbLjBdCi0gMS40LjJyYzAyLTA2ICAgICAgICAxNCAgICAxMDQwMiAgMTQuc28uMTQuMlsuMF0KLSAxLjQuMiAgICAgICAgICAgICAgIDE0ICAgIDEwNDAyICAxNC5zby4xNC4yWy4wXQotIDEuNC4zYmV0YTAxLTA1ICAgICAgMTQgICAgMTA0MDMgIDE0LnNvLjE0LjNbLjBdCi0gMS40LjNyYzAxLTAzICAgICAgICAxNCAgICAxMDQwMyAgMTQuc28uMTQuM1suMF0KLSAxLjQuMyAgICAgICAgICAgICAgIDE0ICAgIDEwNDAzICAxNC5zby4xNC4zWy4wXQotIDEuNC40YmV0YTAxLTA4ICAgICAgMTQgICAgMTA0MDQgIDE0LnNvLjE0LjRbLjBdCi0gMS40LjRyYzAxLTA1ICAgICAgICAxNCAgICAxMDQwNCAgMTQuc28uMTQuNFsuMF0KLSAxLjQuNCAgICAgICAgICAgICAgIDE0ICAgIDEwNDA0ICAxNC5zby4xNC40Wy4wXQotIDEuNC41YmV0YTAxLTA0ICAgICAgMTQgICAgMTA0MDUgIDE0LnNvLjE0LjVbLjBdCi0gMS40LjVyYzAxICAgICAgICAgICAxNCAgICAxMDQwNSAgMTQuc28uMTQuNVsuMF0KLSAxLjQuNWJldGEwNS0wNyAgICAgIDE0ICAgIDEwNDA1ICAxNC5zby4xNC41Wy4wXQotIDEuNC41cmMwMi0wMyAgICAgICAgMTQgICAgMTA0MDUgIDE0LnNvLjE0LjVbLjBdCi0gMS40LjUgICAgICAgICAgICAgICAxNCAgICAxMDQwNSAgMTQuc28uMTQuNVsuMF0KLSAxLjQuNmJldGEwMS0wNyAgICAgIDE0ICAgIDEwNDA2ICAxNC5zby4xNC42Wy4wXQotIDEuNC42cmMwMSAgICAgICAgICAgMTQgICAgMTA0MDYgIDE0LnNvLjE0LjZbLjBdCi0gMS40LjYgICAgICAgICAgICAgICAxNCAgICAxMDQwNiAgMTQuc28uMTQuNlsuMF0KLSAxLjQuN3JjMDEgICAgICAgICAgIDE0ICAgIDEwNDA3ICAxNC5zby4xNC43Wy4wXQotIDEuNC43ICAgICAgICAgICAgICAgMTQgICAgMTA0MDcgIDE0LnNvLjE0LjdbLjBdCi0gMS40LjhiZXRhMDEtMDUgICAgICAxNCAgICAxMDQwOCAgMTQuc28uMTQuOFsuMF0KLSAxLjQuOHJjMDEgICAgICAgICAgIDE0ICAgIDEwNDA4ICAxNC5zby4xNC44Wy4wXQotIDEuNC44ICAgICAgICAgICAgICAgMTQgICAgMTA0MDggIDE0LnNvLjE0LjhbLjBdCi0gMS40LjliZXRhMDEgICAgICAgICAxNCAgICAxMDQwOSAgMTQuc28uMTQuOVsuMF0KLSAxLjQuOXJjMDEgICAgICAgICAgIDE0ICAgIDEwNDA5ICAxNC5zby4xNC45Wy4wXQotIDEuNC45ICAgICAgICAgICAgICAgMTQgICAgMTA0MDkgIDE0LnNvLjE0LjlbLjBdCi0gMS40LjEwYmV0YTAxICAgICAgICAxNCAgICAxMDQxMCAgMTQuc28uMTQuMTBbLjBdCi0gMS40LjEwcmMwMS0wMiAgICAgICAxNCAgICAxMDQxMCAgMTQuc28uMTQuMTBbLjBdCi0gMS40LjEwICAgICAgICAgICAgICAxNCAgICAxMDQxMCAgMTQuc28uMTQuMTBbLjBdCi0gMS40LjExcmMwMSAgICAgICAgICAxNCAgICAxMDQxMSAgMTQuc28uMTQuMTFbLjBdCi0gMS40LjExICAgICAgICAgICAgICAxNCAgICAxMDQxMSAgMTQuc28uMTQuMTFbLjBdCi0gMS40LjEyICAgICAgICAgICAgICAxNCAgICAxMDQxMiAgMTQuc28uMTQuMTJbLjBdCi0KLUhlbmNlZm9ydGggdGhlIHNvdXJjZSB2ZXJzaW9uIHdpbGwgbWF0Y2ggdGhlIHNoYXJlZC1saWJyYXJ5IG1pbm9yCi1hbmQgcGF0Y2ggbnVtYmVyczsgdGhlIHNoYXJlZC1saWJyYXJ5IG1ham9yIHZlcnNpb24gbnVtYmVyIHdpbGwgYmUKLXVzZWQgZm9yIGNoYW5nZXMgaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgYXMgaXQgaXMgaW50ZW5kZWQuICBUaGUKLVBOR19QTkdMSUJfVkVSIG1hY3JvLCB3aGljaCBpcyBub3QgdXNlZCB3aXRoaW4gbGlicG5nIGJ1dCBpcyBhdmFpbGFibGUKLWZvciBhcHBsaWNhdGlvbnMsIGlzIGFuIHVuc2lnbmVkIGludGVnZXIgb2YgdGhlIGZvcm0geHl5enogY29ycmVzcG9uZGluZwotdG8gdGhlIHNvdXJjZSB2ZXJzaW9uIHgueS56IChsZWFkaW5nIHplcm9zIGluIHkgYW5kIHopLiAgQmV0YSB2ZXJzaW9ucwotd2VyZSBnaXZlbiB0aGUgcHJldmlvdXMgcHVibGljIHJlbGVhc2UgbnVtYmVyIHBsdXMgYSBsZXR0ZXIsIHVudGlsCi12ZXJzaW9uIDEuMC42ajsgZnJvbSB0aGVuIG9uIHRoZXkgd2VyZSBnaXZlbiB0aGUgdXBjb21pbmcgcHVibGljCi1yZWxlYXNlIG51bWJlciBwbHVzICJiZXRhTk4iIG9yICJyY05OIi4KLQotLlNIICJTRUUgQUxTTyIKLS5CUiAicG5nIig1KSwgIiBsaWJwbmdwZiIoMyksICIgemxpYiIoMyksICIgZGVmbGF0ZSIoNSksICIgIiBhbmQgIiB6bGliIig1KQotLkxQCi0uSVIgbGlicG5nIDoKLS5JUAotaHR0cDovL2xpYnBuZy5zb3VyY2Vmb3JnZS5uZXQgKGZvbGxvdyB0aGUgW0RPV05MT0FEXSBsaW5rKQotaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcKLQotLkxQCi0uSVIgemxpYiA6Ci0uSVAKLShnZW5lcmFsbHkpIGF0IHRoZSBzYW1lIGxvY2F0aW9uIGFzCi0uSSBsaWJwbmcKLW9yIGF0Ci0uYnIKLWZ0cDovL2Z0cC5pbmZvLXppcC5vcmcvcHViL2luZm96aXAvemxpYgotCi0uTFAKLS5JUiBQTkcgc3BlY2lmaWNhdGlvbjogUkZDIDIwODMKLS5JUAotKGdlbmVyYWxseSkgYXQgdGhlIHNhbWUgbG9jYXRpb24gYXMKLS5JIGxpYnBuZwotb3IgYXQKLS5icgotZnRwOi8vZHMuaW50ZXJuaWMubmV0L3JmYy9yZmMyMDgzLnR4dAotLmJyCi1vciAoYXMgYSBXM0MgUmVjb21tZW5kYXRpb24pIGF0Ci0uYnIKLWh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1wbmcuaHRtbAotCi0uTFAKLUluIHRoZSBjYXNlIG9mIGFueSBpbmNvbnNpc3RlbmN5IGJldHdlZW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uCi1hbmQgdGhpcyBsaWJyYXJ5LCB0aGUgc3BlY2lmaWNhdGlvbiB0YWtlcyBwcmVjZWRlbmNlLgotCi0uU0ggQVVUSE9SUwotVGhpcyBtYW4gcGFnZTogR2xlbm4gUmFuZGVycy1QZWhyc29uCi08Z2xlbm5ycCBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0KLVRoZSBjb250cmlidXRpbmcgYXV0aG9ycyB3b3VsZCBsaWtlIHRvIHRoYW5rIGFsbCB0aG9zZSB3aG8gaGVscGVkCi13aXRoIHRlc3RpbmcsIGJ1ZyBmaXhlcywgYW5kIHBhdGllbmNlLiAgVGhpcyB3b3VsZG4ndCBoYXZlIGJlZW4KLXBvc3NpYmxlIHdpdGhvdXQgYWxsIG9mIHlvdS4KLQotVGhhbmtzIHRvIEZyYW5rIEouIFQuIFdvamNpayBmb3IgaGVscGluZyB3aXRoIHRoZSBkb2N1bWVudGF0aW9uLgotCi1MaWJwbmcgdmVyc2lvbiAxLjQuMTIgLSBKdWx5IDEwLCAyMDEyOgotSW5pdGlhbGx5IGNyZWF0ZWQgaW4gMTk5NSBieSBHdXkgRXJpYyBTY2hhbG5hdCwgdGhlbiBvZiBHcm91cCA0MiwgSW5jLgotQ3VycmVudGx5IG1haW50YWluZWQgYnkgR2xlbm4gUmFuZGVycy1QZWhyc29uIChnbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkuCi0KLVN1cHBvcnRlZCBieSB0aGUgUE5HIGRldmVsb3BtZW50IGdyb3VwCi0uYnIKLXBuZy1tbmctaW1wbGVtZW50IGF0IGxpc3RzLnNmLm5ldAotKHN1YnNjcmlwdGlvbiByZXF1aXJlZDsgdmlzaXQKLXBuZy1tbmctaW1wbGVtZW50IGF0IGxpc3RzLnNvdXJjZWZvcmdlLm5ldCAoc3Vic2NyaXB0aW9uIHJlcXVpcmVkOyB2aXNpdAotaHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vcG5nLW1uZy1pbXBsZW1lbnQKLXRvIHN1YnNjcmliZSkuCi0KLS5TSCBDT1BZUklHSFQgTk9USUNFLCBESVNDTEFJTUVSLCBhbmQgTElDRU5TRToKLQotKFRoaXMgY29weSBvZiB0aGUgbGlicG5nIG5vdGljZXMgaXMgcHJvdmlkZWQgZm9yIHlvdXIgY29udmVuaWVuY2UuICBJbiBjYXNlIG9mCi1hbnkgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGlzIGNvcHkgYW5kIHRoZSBub3RpY2VzIGluIHRoZSBmaWxlIHBuZy5oIHRoYXQgaXMKLWluY2x1ZGVkIGluIHRoZSBsaWJwbmcgZGlzdHJpYnV0aW9uLCB0aGUgbGF0dGVyIHNoYWxsIHByZXZhaWwuKQotCi1JZiB5b3UgbW9kaWZ5IGxpYnBuZyB5b3UgbWF5IGluc2VydCBhZGRpdGlvbmFsIG5vdGljZXMgaW1tZWRpYXRlbHkgZm9sbG93aW5nCi10aGlzIHNlbnRlbmNlLgotCi1UaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotCi1saWJwbmcgdmVyc2lvbnMgMS4yLjYsIEF1Z3VzdCAxNSwgMjAwNCwgdGhyb3VnaCAxLjQuMTIsIEp1bHkgMTAsIDIwMTIsIGFyZQotQ29weXJpZ2h0IChjKSAyMDA0LDIwMDYtMjAwNyBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFuZCBhcmUKLWRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0xLjIuNQotd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWwgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnMKLQotICAgQ29zbWluIFRydXRhCi0KLWxpYnBuZyB2ZXJzaW9ucyAxLjAuNywgSnVseSAxLCAyMDAwLCB0aHJvdWdoIDEuMi41IC0gT2N0b2JlciAzLCAyMDAyLCBhcmUKLUNvcHlyaWdodCAoYykgMjAwMC0yMDAyIEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYW5kIGFyZQotZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTEuMC42Ci13aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnMKLQotICAgU2ltb24tUGllcnJlIENhZGlldXgKLSAgIEVyaWMgUy4gUmF5bW9uZAotICAgR2lsbGVzIFZvbGxhbnQKLQotYW5kIHdpdGggdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgdG8gdGhlIGRpc2NsYWltZXI6Ci0KLSAgIFRoZXJlIGlzIG5vIHdhcnJhbnR5IGFnYWluc3QgaW50ZXJmZXJlbmNlIHdpdGggeW91cgotICAgZW5qb3ltZW50IG9mIHRoZSBsaWJyYXJ5IG9yIGFnYWluc3QgaW5mcmluZ2VtZW50LgotICAgVGhlcmUgaXMgbm8gd2FycmFudHkgdGhhdCBvdXIgZWZmb3J0cyBvciB0aGUgbGlicmFyeQotICAgd2lsbCBmdWxmaWxsIGFueSBvZiB5b3VyIHBhcnRpY3VsYXIgcHVycG9zZXMgb3IgbmVlZHMuCi0gICBUaGlzIGxpYnJhcnkgaXMgcHJvdmlkZWQgd2l0aCBhbGwgZmF1bHRzLCBhbmQgdGhlIGVudGlyZQotICAgcmlzayBvZiBzYXRpc2ZhY3RvcnkgcXVhbGl0eSwgcGVyZm9ybWFuY2UsIGFjY3VyYWN5LCBhbmQKLSAgIGVmZm9ydCBpcyB3aXRoIHRoZSB1c2VyLgotCi1saWJwbmcgdmVyc2lvbnMgMC45NywgSmFudWFyeSAxOTk4LCB0aHJvdWdoIDEuMC42LCBNYXJjaCAyMCwgMjAwMCwgYXJlCi1Db3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi1EaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgZGlzY2xhaW1lciBhbmQgbGljZW5zZSBhcyBsaWJwbmctMC45NiwKLXdpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyBhZGRlZCB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcgQXV0aG9yczoKLQotICAgVG9tIExhbmUKLSAgIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICAgV2lsbGVtIHZhbiBTY2hhaWsKLQotbGlicG5nIHZlcnNpb25zIDAuODksIEp1bmUgMTk5NiwgdGhyb3VnaCAwLjk2LCBNYXkgMTk5NywgYXJlCi1Db3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLURpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0wLjg4LAotd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgotCi0gICBKb2huIEJvd2xlcgotICAgS2V2aW4gQnJhY2V5Ci0gICBTYW0gQnVzaGVsbAotICAgTWFnbnVzIEhvbG1ncmVuCi0gICBHcmVnIFJvZWxvZnMKLSAgIFRvbSBUYW5uZXIKLQotbGlicG5nIHZlcnNpb25zIDAuNSwgTWF5IDE5OTUsIHRocm91Z2ggMC44OCwgSmFudWFyeSAxOTk2LCBhcmUKLUNvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLQotRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGNvcHlyaWdodCBhbmQgbGljZW5zZSwgIkNvbnRyaWJ1dGluZyBBdXRob3JzIgotaXMgZGVmaW5lZCBhcyB0aGUgZm9sbG93aW5nIHNldCBvZiBpbmRpdmlkdWFsczoKLQotICAgQW5kcmVhcyBEaWxnZXIKLSAgIERhdmUgTWFydGluZGFsZQotICAgR3V5IEVyaWMgU2NoYWxuYXQKLSAgIFBhdWwgU2NobWlkdAotICAgVGltIFdlZ25lcgotCi1UaGUgUE5HIFJlZmVyZW5jZSBMaWJyYXJ5IGlzIHN1cHBsaWVkICJBUyBJUyIuICBUaGUgQ29udHJpYnV0aW5nIEF1dGhvcnMKLWFuZCBHcm91cCA0MiwgSW5jLiBkaXNjbGFpbSBhbGwgd2FycmFudGllcywgZXhwcmVzc2VkIG9yIGltcGxpZWQsCi1pbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBvZgotZml0bmVzcyBmb3IgYW55IHB1cnBvc2UuICBUaGUgQ29udHJpYnV0aW5nIEF1dGhvcnMgYW5kIEdyb3VwIDQyLCBJbmMuCi1hc3N1bWUgbm8gbGlhYmlsaXR5IGZvciBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCi1vciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHdoaWNoIG1heSByZXN1bHQgZnJvbSB0aGUgdXNlIG9mIHRoZSBQTkcKLVJlZmVyZW5jZSBMaWJyYXJ5LCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCi1zb3VyY2UgY29kZSwgb3IgcG9ydGlvbnMgaGVyZW9mLCBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBzdWJqZWN0Ci10byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvdXJjZSBjb2RlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkLgotCi0yLiBBbHRlcmVkIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCBhbmQKLSAgIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb3VyY2UuCi0KLTMuIFRoaXMgQ29weXJpZ2h0IG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tCi0gICBhbnkgc291cmNlIG9yIGFsdGVyZWQgc291cmNlIGRpc3RyaWJ1dGlvbi4KLQotVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzIGFuZCBHcm91cCA0MiwgSW5jLiBzcGVjaWZpY2FsbHkgcGVybWl0LCB3aXRob3V0Ci1mZWUsIGFuZCBlbmNvdXJhZ2UgdGhlIHVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGFzIGEgY29tcG9uZW50IHRvCi1zdXBwb3J0aW5nIHRoZSBQTkcgZmlsZSBmb3JtYXQgaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4gIElmIHlvdSB1c2UgdGhpcwotc291cmNlIGNvZGUgaW4gYSBwcm9kdWN0LCBhY2tub3dsZWRnbWVudCBpcyBub3QgcmVxdWlyZWQgYnV0IHdvdWxkIGJlCi1hcHByZWNpYXRlZC4KLQotCi1BICJwbmdfZ2V0X2NvcHlyaWdodCIgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCBmb3IgY29udmVuaWVudCB1c2UgaW4gImFib3V0IgotYm94ZXMgYW5kIHRoZSBsaWtlOgotCi0gICBwcmludGYoIiVzIixwbmdfZ2V0X2NvcHlyaWdodChOVUxMKSk7Ci0KLUFsc28sIHRoZSBQTkcgbG9nbyAoaW4gUE5HIGZvcm1hdCwgb2YgY291cnNlKSBpcyBzdXBwbGllZCBpbiB0aGUKLWZpbGVzICJwbmdiYXIucG5nIiBhbmQgInBuZ2Jhci5qcGcgKDg4eDMxKSBhbmQgInBuZ25vdy5wbmciICg5OHgzMSkuCi0KLUxpYnBuZyBpcyBPU0kgQ2VydGlmaWVkIE9wZW4gU291cmNlIFNvZnR3YXJlLiAgT1NJIENlcnRpZmllZCBPcGVuIFNvdXJjZSBpcyBhCi1jZXJ0aWZpY2F0aW9uIG1hcmsgb2YgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCi0KLUdsZW5uIFJhbmRlcnMtUGVocnNvbgotZ2xlbm5ycCBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKLUp1bHkgMTAsIDIwMTIKLQotLlwiIGVuZCBvZiBtYW4gcGFnZQotCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL2xpYnBuZy5wYy5pbiBiL3NyYy9saWJwbmcvbGlicG5nLnBjLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTdlMmM1Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvbGlicG5nLnBjLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcHJlZml4PUBwcmVmaXhACi1leGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACi1saWJkaXI9QGxpYmRpckAKLWluY2x1ZGVkaXI9QGluY2x1ZGVkaXJAL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAKLQotTmFtZTogbGlicG5nCi1EZXNjcmlwdGlvbjogTG9hZHMgYW5kIHNhdmVzIFBORyBmaWxlcwotVmVyc2lvbjogQFBOR0xJQl9WRVJTSU9OQAotTGliczogLUwke2xpYmRpcn0gLWxwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JACi1MaWJzLnByaXZhdGU6IEBMSUJTQAotQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvbGlicG5ncGYuMyBiL3NyYy9saWJwbmcvbGlicG5ncGYuMwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjZDI5NC4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL2xpYnBuZ3BmLjMKKysrIC9kZXYvbnVsbApAQCAtMSw4MDIgKzAsMCBAQAotLlRIIExJQlBOR1BGIDMgIkp1bHkgMTAsIDIwMTIiCi0uU0ggTkFNRQotbGlicG5nIFwtIFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MgKFBORykgUmVmZXJlbmNlIExpYnJhcnkgMS40LjEyCi0ocHJpdmF0ZSBmdW5jdGlvbnMpCi0uU0ggU1lOT1BTSVMKLVxmQiNpbmNsdWRlIDxwbmcuaD5cZlAKLQotXGZCI2luY2x1ZGUgXGZJInBuZ3ByaXYuaCIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nXzY0Yml0X3Byb2R1Y3QgKGxvbmcgXGZQXGZJdjFcZlBcZkIsIGxvbmcgXGZQXGZJdjJcZlBcZkIsIHVuc2lnbmVkIGxvbmcgXGZJKmhpX3Byb2R1Y3QsCi0KLVxmQnVuc2lnbmVkIGxvbmcgXGZJKmxvX3Byb2R1Y3RcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfYnVpbGRfZ2FtbWFfdGFibGUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlIFxmSWJpdF9kZXB0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfYnVpbGRfZ3JheXNjYWxlX3BhbGV0dGUgKGludCBcZlBcZkliaXRfZGVwdGhcZlBcZkIsIHBuZ19jb2xvcnAgXGZJcGFsZXR0ZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfY2FsY3VsYXRlX2NyYyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXB0clxmUFxmQiwgcG5nX3NpemVfdCBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQmludCBwbmdfY2hlY2tfY0hSTV9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmUFxmSWludF93aGl0ZV94XGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJaW50X3doaXRlX3lcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZlBcZklpbnRfcmVkX3hcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZlBcZklpbnRfcmVkX3lcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZlBcZklpbnRfZ3JlZW5feFxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmUFxmSWludF9ncmVlbl95XGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJaW50X2JsdWVfeFxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmSWludF9ibHVlX3lcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2NoZWNrX2NodW5rX25hbWUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZkljaHVua19uYW1lXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJwbmdfc2l6ZV90IHBuZ19jaGVja19rZXl3b3JkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJa2V5XGZQXGZCLCBwbmdfY2hhcnBwIFxmSW5ld19rZXlcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2NoZWNrX0lIRFIgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXdpZHRoXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkloZWlnaHRcZlBcZkIsIGludCBcZlBcZkliaXRfZGVwdGhcZlBcZkIsIGludCBcZlBcZkljb2xvcl90eXBlXGZQXGZCLCBpbnQgXGZQXGZJaW50ZXJsYWNlX3R5cGVcZlBcZkIsIGludCBcZlBcZkljb21wcmVzc2lvbl90eXBlXGZQXGZCLCBpbnQgXGZJZmlsdGVyX3R5cGVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2NvbWJpbmVfcm93IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcm93XGZQXGZCLCBpbnQgXGZJbWFza1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfY29ycmVjdF9wYWxldHRlIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29sb3JwIFxmUFxmSXBhbGV0dGVcZlBcZkIsIGludCBcZkludW1fcGFsZXR0ZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCaW50IHBuZ19jcmNfZXJyb3IgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQmludCBwbmdfY3JjX2ZpbmlzaCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJc2tpcFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfY3JjX3JlYWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklidWZcZlBcZkIsIHBuZ19zaXplX3QgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJwbmdfdm9pZHAgcG5nX2NyZWF0ZV9zdHJ1Y3QgKGludCBcZkl0eXBlXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJwbmdfdm9pZHAgcG5nX2NyZWF0ZV9zdHJ1Y3RfMiAoaW50IFxmUFxmSXR5cGVcZlBcZkIsIHBuZ19tYWxsb2NfcHRyIFxmUFxmSW1hbGxvY19mblxmUFxmQiwgcG5nX3ZvaWRwIFxmSW1lbV9wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQmludCBwbmdfZGVidWcoaW50IFxmUFxmSWxldmVsXGZQXGZCLCBwbmdfY29uc3RfY2hhcnAgXGZJbWVzc2FnZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJpbnQgcG5nX2RlYnVnMShpbnQgXGZQXGZJbGV2ZWxcZlBcZkIsIHBuZ19jb25zdF9jaGFycCBcZlBcZkltZXNzYWdlXGZQXGZCLCBcZklwMVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJpbnQgcG5nX2RlYnVnMihpbnQgXGZQXGZJbGV2ZWxcZlBcZkIsIHBuZ19jb25zdF9jaGFycCBcZlBcZkltZXNzYWdlXGZQXGZCLCBcZlBcZklwMVxmUFxmQiwgXGZJcDJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZGVjb21wcmVzc19jaHVuayAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmUFxmSWNvbXBfdHlwZVxmUFxmQiwgcG5nX3NpemVfdCBcZlBcZkljaHVua2xlbmd0aFxmUFxmQiwgcG5nX3NpemVfdCBcZlBcZklwcmVmaXhfbGVuZ3RoXGZQXGZCLCBwbmdfc2l6ZV90IFxmSSpkYXRhX2xlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZGVzdHJveV9zdHJ1Y3QgKHBuZ192b2lkcCBcZklzdHJ1Y3RfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kZXN0cm95X3N0cnVjdF8yIChwbmdfdm9pZHAgXGZQXGZJc3RydWN0X3B0clxmUFxmQiwgcG5nX2ZyZWVfcHRyIFxmUFxmSWZyZWVfZm5cZlBcZkIsIHBuZ192b2lkcCBcZkltZW1fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb19iYWNrZ3JvdW5kIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcm93XGZQXGZCLCBwbmdfY29sb3JfMTZwIFxmUFxmSXRyYW5zX2NvbG9yXGZQXGZCLCBwbmdfY29sb3JfMTZwIFxmUFxmSWJhY2tncm91bmRcZlBcZkIsIHBuZ19jb2xvcl8xNnAgXGZQXGZJYmFja2dyb3VuZF8xXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJZ2FtbWFfdGFibGVcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklnYW1tYV9mcm9tXzFcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklnYW1tYV90b18xXGZQXGZCLCBwbmdfdWludF8xNnBwIFxmUFxmSWdhbW1hXzE2XGZQXGZCLCBwbmdfdWludF8xNnBwIFxmUFxmSWdhbW1hXzE2X2Zyb21fMVxmUFxmQiwgcG5nX3VpbnRfMTZwcCBcZlBcZklnYW1tYV8xNl90b18xXGZQXGZCLCBpbnQgXGZJZ2FtbWFfc2hpZnRcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2RvX2JnciAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmSXJvd1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZG9fY2hvcCAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmSXJvd1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb19leHBhbmQgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIHBuZ19jb2xvcl8xNnAgXGZJdHJhbnNfdmFsdWVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2RvX2V4cGFuZF9wYWxldHRlIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcm93XGZQXGZCLCBwbmdfY29sb3JwIFxmUFxmSXBhbGV0dGVcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZkl0cmFuc1xmUFxmQiwgaW50IFxmSW51bV90cmFuc1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZG9fZ2FtbWEgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklnYW1tYV90YWJsZVxmUFxmQiwgcG5nX3VpbnRfMTZwcCBcZlBcZklnYW1tYV8xNl90YWJsZVxmUFxmQiwgaW50IFxmSWdhbW1hX3NoaWZ0XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb19ncmF5X3RvX3JnYiAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmSXJvd1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZG9faW52ZXJ0IChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb19wYWNrIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcm93XGZQXGZCLCBwbmdfdWludF8zMiBcZkliaXRfZGVwdGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2RvX3BhY2tzd2FwIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb19xdWFudGl6ZSAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXJvd1xmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXBhbGV0dGVfbG9va3VwXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcXVhbnRpemVfbG9va3VwXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb19yZWFkX2ZpbGxlciAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXJvd1xmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJZmlsbGVyXGZQXGZCLCBwbmdfdWludF8zMiBcZklmbGFnc1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZG9fcmVhZF9pbnRlcmxhY2UgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIGludCBcZlBcZklwYXNzXGZQXGZCLCBwbmdfdWludF8zMiBcZkl0cmFuc2Zvcm1hdGlvbnNcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2RvX3JlYWRfaW52ZXJ0X2FscGhhIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2RvX3JlYWRfc3dhcF9hbHBoYSAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmSXJvd1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZG9fcmVhZF90cmFuc2Zvcm1hdGlvbnMgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQmludCBwbmdfZG9fcmdiX3RvX2dyYXkgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZklyb3dcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2RvX3NoaWZ0IChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcm93XGZQXGZCLCBwbmdfY29sb3JfOHAgXGZJYml0X2RlcHRoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb19zdHJpcF9maWxsZXIgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIHBuZ191aW50XzMyIFxmSWZsYWdzXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb19zd2FwIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb191bnBhY2sgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZklyb3dcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2RvX3Vuc2hpZnQgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIHBuZ19jb2xvcl84cCBcZklzaWdfYml0c1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZG9fd3JpdGVfaW50ZXJsYWNlIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcm93XGZQXGZCLCBpbnQgXGZJcGFzc1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZG9fd3JpdGVfaW52ZXJ0X2FscGhhIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb193cml0ZV9zd2FwX2FscGhhIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb193cml0ZV90cmFuc2Zvcm1hdGlvbnMgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgKnBuZ19mYXJfdG9fbmVhciAocG5nX3N0cnVjdHAgcG5nX3B0cixwbmdfdm9pZHAgXGZQXGZJcHRyXGZQXGZCLCBpbnQgXGZJY2hlY2tcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2ZsdXNoIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19oYW5kbGVfYktHRCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2hhbmRsZV9jSFJNIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfaGFuZGxlX2dBTUEgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19oYW5kbGVfaElTVCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2hhbmRsZV9JRU5EIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfaGFuZGxlX0lIRFIgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19oYW5kbGVfaUNDUCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2hhbmRsZV9pVFh0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfaGFuZGxlX29GRnMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19oYW5kbGVfcENBTCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2hhbmRsZV9wSFlzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfaGFuZGxlX1BMVEUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19oYW5kbGVfc0JJVCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2hhbmRsZV9zQ0FMIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfaGFuZGxlX3NQTFQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19oYW5kbGVfc1JHQiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2hhbmRsZV90RVh0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfaGFuZGxlX3RJTUUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19oYW5kbGVfdFJOUyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2hhbmRsZV91bmtub3duIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfaGFuZGxlX3pUWHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19pbmZvX2Rlc3Ryb3kgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfaW5pdF9tbXhfZmxhZ3MgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2luaXRfcmVhZF90cmFuc2Zvcm1hdGlvbnMgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3Byb2Nlc3NfSURBVF9kYXRhIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJYnVmZmVyXGZQXGZCLCBwbmdfc2l6ZV90IFxmSWJ1ZmZlcl9sZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3Byb2Nlc3Nfc29tZV9kYXRhIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3B1c2hfY2hlY2tfY3JjIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19wdXNoX2NyY19maW5pc2ggKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3B1c2hfY3JjX3NraXAgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcHVzaF9maWxsX2J1ZmZlciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWJ1ZmZlclxmUFxmQiwgcG5nX3NpemVfdCBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3B1c2hfaGFuZGxlX3RFWHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19wdXNoX2hhbmRsZV91bmtub3duIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcHVzaF9oYW5kbGVfelRYdCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3B1c2hfaGF2ZV9lbmQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcHVzaF9oYXZlX2luZm8gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcHVzaF9oYXZlX3JvdyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmSXJvd1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcHVzaF9wcm9jZXNzX3JvdyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcHVzaF9yZWFkX2NodW5rIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3B1c2hfcmVhZF9lbmQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcHVzaF9yZWFkX0lEQVQgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3B1c2hfcmVhZF9zaWcgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcHVzaF9yZWFkX3RFWHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcHVzaF9yZWFkX3pUWHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcHVzaF9yZXN0b3JlX2J1ZmZlciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWJ1ZmZlclxmUFxmQiwgcG5nX3NpemVfdCBcZklidWZmZXJfbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19wdXNoX3NhdmVfYnVmZmVyIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19yZWFkX2RhdGEgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklkYXRhXGZQXGZCLCBwbmdfc2l6ZV90IFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19yZWFkX2Rlc3Ryb3kgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWVuZF9pbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19yZWFkX2ZpbHRlcl9yb3cgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklwcmV2X3Jvd1xmUFxmQiwgaW50IFxmSWZpbHRlclxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcmVhZF9maW5pc2hfcm93IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3JlYWRfc2lnIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcmVhZF9zdGFydF9yb3cgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcmVhZF90cmFuc2Zvcm1faW5mbyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3Jlc2V0X2NyYyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJpbnQgcG5nX3NldF90ZXh0XzIgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3RleHRwIFxmUFxmSXRleHRfcHRyXGZQXGZCLCBpbnQgXGZJbnVtX3RleHRcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX2NIUk0gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGRvdWJsZSBcZlBcZkl3aGl0ZV94XGZQXGZCLCBkb3VibGUgXGZQXGZJd2hpdGVfeVxmUFxmQiwgZG91YmxlIFxmUFxmSXJlZF94XGZQXGZCLCBkb3VibGUgXGZQXGZJcmVkX3lcZlBcZkIsIGRvdWJsZSBcZlBcZklncmVlbl94XGZQXGZCLCBkb3VibGUgXGZQXGZJZ3JlZW5feVxmUFxmQiwgZG91YmxlIFxmUFxmSWJsdWVfeFxmUFxmQiwgZG91YmxlIFxmSWJsdWVfeVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfY0hSTV9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJd2hpdGVfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJd2hpdGVfeVxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJcmVkX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXJlZF95XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklncmVlbl94XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklncmVlbl95XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklibHVlX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmSWJsdWVfeVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfZGF0YSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWRhdGFcZlBcZkIsIHBuZ19zaXplX3QgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX2Rlc3Ryb3kgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfZmlsdGVyZWRfcm93IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZJZmlsdGVyZWRfcm93XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9maW5kX2ZpbHRlciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3Jvd19pbmZvcCBcZklyb3dfaW5mb1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfZmluaXNoX3JvdyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfZ0FNQSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgZG91YmxlIFxmSWZpbGVfZ2FtbWFcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX2dBTUFfZml4ZWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWludF9maWxlX2dhbW1hXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9oSVNUIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8xNnAgXGZQXGZJaGlzdFxmUFxmQiwgaW50IFxmSW51bV9oaXN0XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9pQ0NQIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJbmFtZVxmUFxmQiwgaW50IFxmUFxmSWNvbXByZXNzaW9uX3R5cGVcZlBcZkIsIHBuZ19jaGFycCBcZlBcZklwcm9maWxlXGZQXGZCLCBpbnQgXGZJcHJvZmxlblxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfSURBVCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWRhdGFcZlBcZkIsIHBuZ19zaXplX3QgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9JRU5EIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9JSERSIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkl3aWR0aFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJaGVpZ2h0XGZQXGZCLCBpbnQgXGZQXGZJYml0X2RlcHRoXGZQXGZCLCBpbnQgXGZQXGZJY29sb3JfdHlwZVxmUFxmQiwgaW50IFxmUFxmSWNvbXByZXNzaW9uX3R5cGVcZlBcZkIsIGludCBcZlBcZklmaWx0ZXJfdHlwZVxmUFxmQiwgaW50IFxmSWludGVybGFjZV90eXBlXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9pVFh0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZQXGZJY29tcHJlc3Npb25cZlBcZkIsIHBuZ19jaGFycCBcZlBcZklrZXlcZlBcZkIsIHBuZ19jaGFycCBcZlBcZklsYW5nXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJdHJhbnNsYXRlZF9rZXlcZlBcZkIsIHBuZ19jaGFycCBcZkl0ZXh0XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9vRkZzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkl4X29mZnNldFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJeV9vZmZzZXRcZlBcZkIsIGludCBcZkl1bml0X3R5cGVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX3BDQUwgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jaGFycCBcZlBcZklwdXJwb3NlXGZQXGZCLCBwbmdfaW50XzMyIFxmUFxmSVgwXGZQXGZCLCBwbmdfaW50XzMyIFxmUFxmSVgxXGZQXGZCLCBpbnQgXGZQXGZJdHlwZVxmUFxmQiwgaW50IFxmUFxmSW5wYXJhbXNcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkl1bml0c1xmUFxmQiwgcG5nX2NoYXJwcCBcZklwYXJhbXNcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX3BIWXMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXhfcGl4ZWxzX3Blcl91bml0XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkl5X3BpeGVsc19wZXJfdW5pdFxmUFxmQiwgaW50IFxmSXVuaXRfdHlwZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfUExURSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbG9ycCBcZlBcZklwYWxldHRlXGZQXGZCLCBwbmdfdWludF8zMiBcZkludW1fcGFsXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9zQklUIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29sb3JfOHAgXGZQXGZJc2JpdFxmUFxmQiwgaW50IFxmSWNvbG9yX3R5cGVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX3NDQUwgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkl1bml0XGZQXGZCLCBkb3VibGUgXGZQXGZJd2lkdGhcZlBcZkIsIGRvdWJsZSBcZkloZWlnaHRcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX3NDQUxfcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSXVuaXRcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkl3aWR0aFxmUFxmQiwgcG5nX2NoYXJwIFxmSWhlaWdodFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfc1JHQiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSWludGVudFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfc1BMVCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3NwYWxldHRlX3AgXGZJcGFsZXR0ZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfc3RhcnRfcm93IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV90RVh0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJa2V5XGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJdGV4dFxmUFxmQiwgcG5nX3NpemVfdCBcZkl0ZXh0X2xlblxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfdElNRSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3RpbWVwIFxmSW1vZF90aW1lXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV90Uk5TIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJdHJhbnNcZlBcZkIsIHBuZ19jb2xvcl8xNnAgXGZQXGZJdmFsdWVzXGZQXGZCLCBpbnQgXGZQXGZJbnVtYmVyXGZQXGZCLCBpbnQgXGZJY29sb3JfdHlwZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfelRYdCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSWtleVxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSXRleHRcZlBcZkIsIHBuZ19zaXplX3QgXGZQXGZJdGV4dF9sZW5cZlBcZkIsIGludCBcZkljb21wcmVzc2lvblxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZHBmIHBuZ196YWxsb2MgKHZvaWRwZiBcZlBcZklwbmdfcHRyXGZQXGZCLCB1SW50IFxmUFxmSWl0ZW1zXGZQXGZCLCB1SW50IFxmSXNpemVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3pmcmVlICh2b2lkcGYgXGZQXGZJcG5nX3B0clxmUFxmQiwgdm9pZHBmIFxmSXB0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotLlNIIERFU0NSSVBUSU9OCi1UaGUgZnVuY3Rpb25zIGxpc3RlZCBhYm92ZSBhcmUgdXNlZCBwcml2YXRlbHkgYnkgbGlicG5nCi1hbmQgYXJlIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlIGJ5IGFwcGxpY2F0aW9ucy4gIFRoZXkgYXJlCi1ub3QgImV4cG9ydGVkIiB0byBhcHBsaWNhdGlvbnMgdXNpbmcgc2hhcmVkIGxpYnJhcmllcy4gIFRoZXkKLWFyZSBsaXN0ZWQgYWxwaGFiZXRpY2FsbHkgaGVyZSBhcyBhbiBhaWQgdG8gbGlicG5nIG1haW50YWluZXJzLgotU2VlIHBuZy5oIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlIGZ1bmN0aW9ucy4KLQotLlNIIFNFRSBBTFNPCi0uQlIgInBuZyIoNSksICIgbGlicG5nIigzKSwgIiB6bGliIigzKSwgIiBkZWZsYXRlIig1KSwgIiAiIGFuZCAiIHpsaWIiKDUpCi0uU0ggQVVUSE9SCi1HbGVubiBSYW5kZXJzLVBlaHJzb24KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvbHRtYWluLnNoIGIvc3JjL2xpYnBuZy9sdG1haW4uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0ZWFlYTQuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9sdG1haW4uc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4NzQ1ICswLDAgQEAKLSMgR2VuZXJhdGVkIGZyb20gbHRtYWluLm00c2guCi0KLSMgbGlidG9vbCAoR05VIGxpYnRvb2wpIDIuMi4xMAotIyBXcml0dGVuIGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwKLSMgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KLSMgd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLSMgR05VIExpYnRvb2wgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSMgaWYgeW91IGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIG9yIGxpYnJhcnkgdGhhdAotIyBpcyBidWlsdCB1c2luZyBHTlUgTGlidG9vbCwgeW91IG1heSBpbmNsdWRlIHRoaXMgZmlsZSB1bmRlciB0aGUKLSMgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0jCi0jIEdOVSBMaWJ0b29sIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCBHTlUgTGlidG9vbDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIGEgY29weQotIyBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbCwKLSMgb3Igb2J0YWluZWQgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLQotIyBVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KLSMKLSMgUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jCi0jICAgICAgIC0tY29uZmlnICAgICAgICAgICAgIHNob3cgYWxsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCi0jICAgICAgIC0tZGVidWcgICAgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIHNoZWxsIHRyYWNpbmcKLSMgICAtbiwgLS1kcnktcnVuICAgICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKLSMgICAgICAgLS1mZWF0dXJlcyAgICAgICAgICAgZGlzcGxheSBiYXNpYyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0jICAgICAgIC0tbW9kZT1NT0RFICAgICAgICAgIHVzZSBvcGVyYXRpb24gbW9kZSBNT0RFCi0jICAgICAgIC0tcHJlc2VydmUtZHVwLWRlcHMgIGRvbid0IHJlbW92ZSBkdXBsaWNhdGUgZGVwZW5kZW5jeSBsaWJyYXJpZXMKLSMgICAgICAgLS1xdWlldCwgLS1zaWxlbnQgICAgZG9uJ3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcwotIyAgICAgICAtLW5vLXF1aWV0LCAtLW5vLXNpbGVudAotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIChkZWZhdWx0KQotIyAgICAgICAtLXRhZz1UQUcgICAgICAgICAgICB1c2UgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZnJvbSB0YWcgVEFHCi0jICAgLXYsIC0tdmVyYm9zZSAgICAgICAgICAgIHByaW50IG1vcmUgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyB0aGFuIGRlZmF1bHQKLSMgICAgICAgLS1uby12ZXJib3NlICAgICAgICAgZG9uJ3QgcHJpbnQgdGhlIGV4dHJhIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKLSMgICAgICAgLS12ZXJzaW9uICAgICAgICAgICAgcHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbgotIyAgIC1oLCAtLWhlbHAsIC0taGVscC1hbGwgICBwcmludCBzaG9ydCwgbG9uZywgb3IgZGV0YWlsZWQgaGVscCBtZXNzYWdlCi0jCi0jIE1PREUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSMKLSMgICAgICAgICBjbGVhbiAgICAgICAgICAgICAgcmVtb3ZlIGZpbGVzIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeQotIyAgICAgICAgIGNvbXBpbGUgICAgICAgICAgICBjb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgb2JqZWN0Ci0jICAgICAgICAgZXhlY3V0ZSAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtCi0jICAgICAgICAgZmluaXNoICAgICAgICAgICAgIGNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMKLSMgICAgICAgICBpbnN0YWxsICAgICAgICAgICAgaW5zdGFsbCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMKLSMgICAgICAgICBsaW5rICAgICAgICAgICAgICAgY3JlYXRlIGEgbGlicmFyeSBvciBhbiBleGVjdXRhYmxlCi0jICAgICAgICAgdW5pbnN0YWxsICAgICAgICAgIHJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsZWQgZGlyZWN0b3J5Ci0jCi0jIE1PREUtQVJHUyB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgTU9ERS4gIFdoZW4gcGFzc2VkIGFzIGZpcnN0IG9wdGlvbiwKLSMgYC0tbW9kZT1NT0RFJyBtYXkgYmUgYWJicmV2aWF0ZWQgYXMgYE1PREUnIG9yIGEgdW5pcXVlIGFiYnJldmlhdGlvbiBvZiB0aGF0LgotIyBUcnkgYCRwcm9nbmFtZSAtLWhlbHAgLS1tb2RlPU1PREUnIGZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgTU9ERS4KLSMKLSMgV2hlbiByZXBvcnRpbmcgYSBidWcsIHBsZWFzZSBkZXNjcmliZSBhIHRlc3QgY2FzZSB0byByZXByb2R1Y2UgaXQgYW5kCi0jIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKLSMKLSMgICAgICAgICBob3N0LXRyaXBsZXQ6CSRob3N0Ci0jICAgICAgICAgc2hlbGw6CQkkU0hFTEwKLSMgICAgICAgICBjb21waWxlcjoJCSRMVENDCi0jICAgICAgICAgY29tcGlsZXIgZmxhZ3M6CQkkTFRDRkxBR1MKLSMgICAgICAgICBsaW5rZXI6CQkkTEQgKGdudT8gJHdpdGhfZ251X2xkKQotIyAgICAgICAgICRwcm9nbmFtZToJKEdOVSBsaWJ0b29sKSAyLjIuMTAKLSMgICAgICAgICBhdXRvbWFrZToJJGF1dG9tYWtlX3ZlcnNpb24KLSMgICAgICAgICBhdXRvY29uZjoJJGF1dG9jb25mX3ZlcnNpb24KLSMKLSMgUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1saWJ0b29sQGdudS5vcmc+LgotCi1QUk9HUkFNPWxpYnRvb2wKLVBBQ0tBR0U9bGlidG9vbAotVkVSU0lPTj0yLjIuMTAKLVRJTUVTVEFNUD0iIgotcGFja2FnZV9yZXZpc2lvbj0xLjMxNzUKLQotIyBCZSBCb3VybmUgY29tcGF0aWJsZQotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGVtdWxhdGUgc2gKLSAgTlVMTENNRD06Ci0gICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCi0gIHNldG9wdCBOT19HTE9CX1NVQlNUCi1lbHNlCi0gIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiAqcG9zaXgqKSBzZXQgLW8gcG9zaXg7OyBlc2FjCi1maQotQklOX1NIPXhwZzQ7IGV4cG9ydCBCSU5fU0ggIyBmb3IgVHJ1NjQKLURVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKLQotIyBBIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIHByaW50IGJ1aWx0aW4gb3IgcHJpbnRmLgotZnVuY19mYWxsYmFja19lY2hvICgpCi17Ci0gIGV2YWwgJ2NhdCA8PF9MVEVDSE9fRU9GCi0kMQotX0xURUNIT19FT0YnCi19Ci0KLSMgTkxTIG51aXNhbmNlczogV2Ugc2F2ZSB0aGUgb2xkIHZhbHVlcyB0byByZXN0b3JlIGR1cmluZyBleGVjdXRlIG1vZGUuCi1sdF91c2VyX2xvY2FsZT0KLWx0X3NhZmVfbG9jYWxlPQotZm9yIGx0X3ZhciBpbiBMQU5HIExBTkdVQUdFIExDX0FMTCBMQ19DVFlQRSBMQ19DT0xMQVRFIExDX01FU1NBR0VTCi1kbwotICBldmFsICJpZiB0ZXN0IFwiXCR7JGx0X3ZhcitzZXR9XCIgPSBzZXQ7IHRoZW4KLSAgICAgICAgICBzYXZlXyRsdF92YXI9XCQkbHRfdmFyCi0gICAgICAgICAgJGx0X3Zhcj1DCi0JICBleHBvcnQgJGx0X3ZhcgotCSAgbHRfdXNlcl9sb2NhbGU9XCIkbHRfdmFyPVxcXCRzYXZlX1wkbHRfdmFyOyBcJGx0X3VzZXJfbG9jYWxlXCIKLQkgIGx0X3NhZmVfbG9jYWxlPVwiJGx0X3Zhcj1DOyBcJGx0X3NhZmVfbG9jYWxlXCIKLQlmaSIKLWRvbmUKLUxDX0FMTD1DCi1MQU5HVUFHRT1DCi1leHBvcnQgTEFOR1VBR0UgTENfQUxMCi0KLSRsdF91bnNldCBDRFBBVEgKLQotCi0jIFdvcmsgYXJvdW5kIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXNzdWUgb24gSVJJWCA2LjUuIE9uIElSSVggNi40Kywgc2gKLSMgaXMga3NoIGJ1dCB3aGVuIHRoZSBzaGVsbCBpcyBpbnZva2VkIGFzICJzaCIgYW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mCi0jIHRoZSBfWFBHIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBlcXVhbCB0byAxIChvbmUpLCB0aGUgc3BlY2lhbAotIyBwb3NpdGlvbmFsIHBhcmFtZXRlciAkMCwgd2l0aGluIGEgZnVuY3Rpb24gY2FsbCwgaXMgdGhlIG5hbWUgb2YgdGhlCi0jIGZ1bmN0aW9uLgotcHJvZ3BhdGg9IiQwIgotCi0KLQotOiAke0NQPSJjcCAtZiJ9Ci10ZXN0ICIke0VDSE8rc2V0fSIgPSBzZXQgfHwgRUNITz0ke2FzX2VjaG8tJ3ByaW50ZiAlc1xuJ30KLTogJHtFR1JFUD0iZ3JlcCAtRSJ9Ci06ICR7RkdSRVA9ImdyZXAgLUYifQotOiAke0dSRVA9ImdyZXAifQotOiAke0xOX1M9ImxuIC1zIn0KLTogJHtNQUtFPSJtYWtlIn0KLTogJHtNS0RJUj0ibWtkaXIifQotOiAke01WPSJtdiAtZiJ9Ci06ICR7Uk09InJtIC1mIn0KLTogJHtTRUQ9InNlZCJ9Ci06ICR7U0hFTEw9IiR7Q09ORklHX1NIRUxMLS9iaW4vc2h9In0KLTogJHtYc2VkPSIkU0VEIC1lIDFzL15YLy8ifQotCi0jIEdsb2JhbCB2YXJpYWJsZXM6Ci1FWElUX1NVQ0NFU1M9MAotRVhJVF9GQUlMVVJFPTEKLUVYSVRfTUlTTUFUQ0g9NjMgICMgJD8gPSA2MyBpcyB1c2VkIHRvIGluZGljYXRlIHZlcnNpb24gbWlzbWF0Y2ggdG8gbWlzc2luZy4KLUVYSVRfU0tJUD03NwkgICMgJD8gPSA3NyBpcyB1c2VkIHRvIGluZGljYXRlIGEgc2tpcHBlZCB0ZXN0IHRvIGF1dG9tYWtlLgotCi1leGl0X3N0YXR1cz0kRVhJVF9TVUNDRVNTCi0KLSMgTWFrZSBzdXJlIElGUyBoYXMgYSBzZW5zaWJsZSBkZWZhdWx0Ci1sdF9ubD0nCi0nCi1JRlM9IiAJJGx0X25sIgotCi1kaXJuYW1lPSJzLC9bXi9dKiQsLCIKLWJhc2VuYW1lPSJzLF4uKi8sLCIKLQotIyBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lIGZpbGUgYXBwZW5kIG5vbmRpcl9yZXBsYWNlbWVudAotIyBwZXJmb3JtIGZ1bmNfYmFzZW5hbWUgYW5kIGZ1bmNfZGlybmFtZSBpbiBhIHNpbmdsZSBmdW5jdGlvbgotIyBjYWxsOgotIyAgIGRpcm5hbWU6ICBDb21wdXRlIHRoZSBkaXJuYW1lIG9mIEZJTEUuICBJZiBub25lbXB0eSwKLSMgICAgICAgICAgICAgYWRkIEFQUEVORCB0byB0aGUgcmVzdWx0LCBvdGhlcndpc2Ugc2V0IHJlc3VsdAotIyAgICAgICAgICAgICB0byBOT05ESVJfUkVQTEFDRU1FTlQuCi0jICAgICAgICAgICAgIHZhbHVlIHJldHVybmVkIGluICIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLSMgICBiYXNlbmFtZTogQ29tcHV0ZSBmaWxlbmFtZSBvZiBGSUxFLgotIyAgICAgICAgICAgICB2YWx1ZSByZXR1bmVkIGluICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0jIEltcGxlbWVudGF0aW9uIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCBmdW5jX2Rpcm5hbWUKLSMgYW5kIGZ1bmNfYmFzZW5hbWUuIEZvciBlZmZpY2llbmN5LCB3ZSBkbyBub3QgZGVsZWdhdGUgdG8KLSMgdGhvc2UgZnVuY3Rpb25zIGJ1dCBpbnN0ZWFkIGR1cGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBoZXJlLgotZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAoKQotewotICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgotICBmdW5jX2Rpcm5hbWVfcmVzdWx0PWAkRUNITyAiJHsxfSIgfCAkU0VEIC1lICIkZGlybmFtZSJgCi0gIGlmIHRlc3QgIlgkZnVuY19kaXJuYW1lX3Jlc3VsdCIgPSAiWCR7MX0iOyB0aGVuCi0gICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIKLSAgZWxzZQotICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0JHsyfSIKLSAgZmkKLSAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezF9IiB8ICRTRUQgLWUgIiRiYXNlbmFtZSJgCi19Ci0KLSMgR2VuZXJhdGVkIHNoZWxsIGZ1bmN0aW9ucyBpbnNlcnRlZCBoZXJlLgotCi0jIFRoZXNlIFNFRCBzY3JpcHRzIHByZXN1cHBvc2UgYW4gYWJzb2x1dGUgcGF0aCB3aXRoIGEgdHJhaWxpbmcgc2xhc2guCi1wYXRoY2FyPSdzLF4vXChbXi9dKlwpLiokLFwxLCcKLXBhdGhjZHI9J3MsXi9bXi9dKiwsJwotcmVtb3ZlZG90cGFydHM9Jzpkb3RzbAotCQlzQC9cLi9AL0BnCi0JCXQgZG90c2wKLQkJcywvXC4kLC8sJwotY29sbGFwc2VzbGFzaGVzPSdzQC9cezEsXH1AL0BnJwotZmluYWxzbGFzaD0ncywvKiQsLywnCi0KLSMgZnVuY19ub3JtYWxfYWJzcGF0aCBQQVRICi0jIFJlbW92ZSBkb3VibGVkLXVwIGFuZCB0cmFpbGluZyBzbGFzaGVzLCAiLiIgcGF0aCBjb21wb25lbnRzLAotIyBhbmQgY2FuY2VsIG91dCBhbnkgIi4uIiBwYXRoIGNvbXBvbmVudHMgaW4gUEFUSCBhZnRlciBtYWtpbmcKLSMgaXQgYW4gYWJzb2x1dGUgcGF0aC4KLSMgICAgICAgICAgICAgdmFsdWUgcmV0dXJuZWQgaW4gIiRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdCIKLWZ1bmNfbm9ybWFsX2Fic3BhdGggKCkKLXsKLSAgIyBTdGFydCBmcm9tIHJvb3QgZGlyIGFuZCByZWFzc2VtYmxlIHRoZSBwYXRoLgotICBmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdD0KLSAgZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aD0kMQotICBmdW5jX25vcm1hbF9hYnNwYXRoX2FsdG5hbWVzcGFjZT0KLSAgY2FzZSAkZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aCBpbgotICAgICIiKQotICAgICAgIyBFbXB0eSBwYXRoLCB0aGF0IGp1c3QgbWVhbnMgJGN3ZC4KLSAgICAgIGZ1bmNfc3RyaXBuYW1lICcnICcvJyAiYHB3ZGAiCi0gICAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0gICAgICByZXR1cm4KLSAgICA7OwotICAgICMgVGhlIG5leHQgdGhyZWUgZW50cmllcyBhcmUgdXNlZCB0byBzcG90IGEgcnVuIG9mIHByZWNpc2VseQotICAgICMgdHdvIGxlYWRpbmcgc2xhc2hlcyB3aXRob3V0IHVzaW5nIG5lZ2F0ZWQgY2hhcmFjdGVyIGNsYXNzZXM7Ci0gICAgIyB3ZSB0YWtlIGFkdmFudGFnZSBvZiBjYXNlJ3MgZmlyc3QtbWF0Y2ggYmVoYXZpb3VyLgotICAgIC8vLyopCi0gICAgICAjIFVudXN1YWwgZm9ybSBvZiBhYnNvbHV0ZSBwYXRoLCBkbyBub3RoaW5nLgotICAgIDs7Ci0gICAgLy8qKQotICAgICAgIyBOb3QgbmVjZXNzYXJpbHkgYW4gb3JkaW5hcnkgcGF0aDsgUE9TSVggcmVzZXJ2ZXMgbGVhZGluZyAnLy8nCi0gICAgICAjIGFuZCBmb3IgZXhhbXBsZSBDeWd3aW4gdXNlcyBpdCB0byBhY2Nlc3MgcmVtb3RlIGZpbGUgc2hhcmVzCi0gICAgICAjIG92ZXIgQ0lGUy9TTUIsIHNvIHdlIGNvbnNlcnZlIGEgbGVhZGluZyBkb3VibGUgc2xhc2ggaWYgZm91bmQuCi0gICAgICBmdW5jX25vcm1hbF9hYnNwYXRoX2FsdG5hbWVzcGFjZT0vCi0gICAgOzsKLSAgICAvKikKLSAgICAgICMgQWJzb2x1dGUgcGF0aCwgZG8gbm90aGluZy4KLSAgICA7OwotICAgICopCi0gICAgICAjIFJlbGF0aXZlIHBhdGgsIHByZXBlbmQgJGN3ZC4KLSAgICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGg9YHB3ZGAvJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGgKLSAgICA7OwotICBlc2FjCi0gICMgQ2FuY2VsIG91dCBhbGwgdGhlIHNpbXBsZSBzdHVmZiB0byBzYXZlIGl0ZXJhdGlvbnMuICBXZSBhbHNvIHdhbnQKLSAgIyB0aGUgcGF0aCB0byBlbmQgd2l0aCBhIHNsYXNoIGZvciBlYXNlIG9mIHBhcnNpbmcsIHNvIG1ha2Ugc3VyZQotICAjIHRoZXJlIGlzIG9uZSAoYW5kIG9ubHkgb25lKSBoZXJlLgotICBmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoPWAkRUNITyAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGgiIHwgJFNFRCBcCi0gICAgICAgIC1lICIkcmVtb3ZlZG90cGFydHMiIC1lICIkY29sbGFwc2VzbGFzaGVzIiAtZSAiJGZpbmFsc2xhc2giYAotICB3aGlsZSA6OyBkbwotICAgICMgUHJvY2Vzc2VkIGl0IGFsbCB5ZXQ/Ci0gICAgaWYgdGVzdCAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGgiID0gLyA7IHRoZW4KLSAgICAgICMgSWYgd2UgYXNjZW5kZWQgdG8gdGhlIHJvb3QgdXNpbmcgIi4uIiB0aGUgcmVzdWx0IG1heSBiZSBlbXB0eSBub3cuCi0gICAgICBpZiB0ZXN0IC16ICIkZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQiIDsgdGhlbgotICAgICAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdD0vCi0gICAgICBmaQotICAgICAgYnJlYWsKLSAgICBmaQotICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfdGNvbXBvbmVudD1gJEVDSE8gIiRmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoIiB8ICRTRUQgXAotICAgICAgICAtZSAiJHBhdGhjYXIiYAotICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGg9YCRFQ0hPICIkZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aCIgfCAkU0VEIFwKLSAgICAgICAgLWUgIiRwYXRoY2RyImAKLSAgICAjIEZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIGl0Ci0gICAgY2FzZSAkZnVuY19ub3JtYWxfYWJzcGF0aF90Y29tcG9uZW50IGluCi0gICAgICAiIikKLSAgICAgICAgIyBUcmFpbGluZyBlbXB0eSBwYXRoIGNvbXBvbmVudCwgaWdub3JlIGl0LgotICAgICAgOzsKLSAgICAgIC4uKQotICAgICAgICAjIFBhcmVudCBkaXI7IHN0cmlwIGxhc3QgYXNzZW1ibGVkIGNvbXBvbmVudCBmcm9tIHJlc3VsdC4KLSAgICAgICAgZnVuY19kaXJuYW1lICIkZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQiCi0gICAgICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0PSRmdW5jX2Rpcm5hbWVfcmVzdWx0Ci0gICAgICA7OwotICAgICAgKikKLSAgICAgICAgIyBBY3R1YWwgcGF0aCBjb21wb25lbnQsIGFwcGVuZCBpdC4KLSAgICAgICAgZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQ9JGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0LyRmdW5jX25vcm1hbF9hYnNwYXRoX3Rjb21wb25lbnQKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gICMgUmVzdG9yZSBsZWFkaW5nIGRvdWJsZS1zbGFzaCBpZiBvbmUgd2FzIGZvdW5kIG9uIGVudHJ5LgotICBmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdD0kZnVuY19ub3JtYWxfYWJzcGF0aF9hbHRuYW1lc3BhY2UkZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQKLX0KLQotIyBmdW5jX3JlbGF0aXZlX3BhdGggU1JDRElSIERTVERJUgotIyBnZW5lcmF0ZXMgYSByZWxhdGl2ZSBwYXRoIGZyb20gU1JDRElSIHRvIERTVERJUiwgd2l0aCBhIHRyYWlsaW5nCi0jIHNsYXNoIGlmIG5vbi1lbXB0eSwgc3VpdGFibGUgZm9yIGltbWVkaWF0ZWx5IGFwcGVuZGluZyBhIGZpbGVuYW1lCi0jIHdpdGhvdXQgbmVlZGluZyB0byBhcHBlbmQgYSBzZXBhcmF0b3IuCi0jICAgICAgICAgICAgIHZhbHVlIHJldHVybmVkIGluICIkZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdCIKLWZ1bmNfcmVsYXRpdmVfcGF0aCAoKQotewotICBmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0PQotICBmdW5jX25vcm1hbF9hYnNwYXRoICIkMSIKLSAgZnVuY19yZWxhdGl2ZV9wYXRoX3RsaWJkaXI9JGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0Ci0gIGZ1bmNfbm9ybWFsX2Fic3BhdGggIiQyIgotICBmdW5jX3JlbGF0aXZlX3BhdGhfdGJpbmRpcj0kZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQKLQotICAjIEFzY2VuZCB0aGUgdHJlZSBzdGFydGluZyBmcm9tIGxpYmRpcgotICB3aGlsZSA6OyBkbwotICAgICMgY2hlY2sgaWYgd2UgaGF2ZSBmb3VuZCBhIHByZWZpeCBvZiBiaW5kaXIKLSAgICBjYXNlICRmdW5jX3JlbGF0aXZlX3BhdGhfdGJpbmRpciBpbgotICAgICAgJGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyKQotICAgICAgICAjIGZvdW5kIGFuIGV4YWN0IG1hdGNoCi0gICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF90Y2FuY2VsbGVkPQotICAgICAgICBicmVhawotICAgICAgICA7OwotICAgICAgJGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyKikKLSAgICAgICAgIyBmb3VuZCBhIG1hdGNoaW5nIHByZWZpeAotICAgICAgICBmdW5jX3N0cmlwbmFtZSAiJGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyIiAnJyAiJGZ1bmNfcmVsYXRpdmVfcGF0aF90YmluZGlyIgotICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfdGNhbmNlbGxlZD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0gICAgICAgIGlmIHRlc3QgLXogIiRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0IjsgdGhlbgotICAgICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9LgotICAgICAgICBmaQotICAgICAgICBicmVhawotICAgICAgICA7OwotICAgICAgKikKLSAgICAgICAgZnVuY19kaXJuYW1lICRmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpcgotICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpcj0ke2Z1bmNfZGlybmFtZV9yZXN1bHR9Ci0gICAgICAgIGlmIHRlc3QgIngkZnVuY19yZWxhdGl2ZV9wYXRoX3RsaWJkaXIiID0geCA7IHRoZW4KLSAgICAgICAgICAjIEhhdmUgdG8gZGVzY2VuZCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdCEKLSAgICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0PS4uLyRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0Ci0gICAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3RjYW5jZWxsZWQ9JGZ1bmNfcmVsYXRpdmVfcGF0aF90YmluZGlyCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0uLi8kZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdAotICAgICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gICMgTm93IGNhbGN1bGF0ZSBwYXRoOyB0YWtlIGNhcmUgdG8gYXZvaWQgZG91YmxpbmctdXAgc2xhc2hlcy4KLSAgZnVuY19zdHJpcG5hbWUgJycgJy8nICIkZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdCIKLSAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0gIGZ1bmNfc3RyaXBuYW1lICcvJyAnLycgIiRmdW5jX3JlbGF0aXZlX3BhdGhfdGNhbmNlbGxlZCIKLSAgaWYgdGVzdCAieCRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiICE9IHggOyB0aGVuCi0gICAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0ke2Z1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHR9LyR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0fQotICBmaQotCi0gICMgTm9ybWFsaXNhdGlvbi4gSWYgYmluZGlyIGlzIGxpYmRpciwgcmV0dXJuIGVtcHR5IHN0cmluZywKLSAgIyBlbHNlIHJlbGF0aXZlIHBhdGggZW5kaW5nIHdpdGggYSBzbGFzaDsgZWl0aGVyIHdheSwgdGFyZ2V0Ci0gICMgZmlsZSBuYW1lIGNhbiBiZSBkaXJlY3RseSBhcHBlbmRlZC4KLSAgaWYgdGVzdCAhIC16ICIkZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdCI7IHRoZW4KLSAgICBmdW5jX3N0cmlwbmFtZSAnLi8nICcnICIkZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdC8iCi0gICAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0gIGZpCi19Ci0KLSMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtOgotZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJHByb2dwYXRoIgotcHJvZ25hbWU9JGZ1bmNfYmFzZW5hbWVfcmVzdWx0Ci0KLSMgTWFrZSBzdXJlIHdlIGhhdmUgYW4gYWJzb2x1dGUgcGF0aCBmb3IgcmVleGVjdXRpb246Ci1jYXNlICRwcm9ncGF0aCBpbgotICBbXFwvXSp8W0EtWmEtel06XFwqKSA7OwotICAqW1xcL10qKQotICAgICBwcm9nZGlyPSRmdW5jX2Rpcm5hbWVfcmVzdWx0Ci0gICAgIHByb2dkaXI9YGNkICIkcHJvZ2RpciIgJiYgcHdkYAotICAgICBwcm9ncGF0aD0iJHByb2dkaXIvJHByb2duYW1lIgotICAgICA7OwotICAqKQotICAgICBzYXZlX0lGUz0iJElGUyIKLSAgICAgSUZTPToKLSAgICAgZm9yIHByb2dkaXIgaW4gJFBBVEg7IGRvCi0gICAgICAgSUZTPSIkc2F2ZV9JRlMiCi0gICAgICAgdGVzdCAteCAiJHByb2dkaXIvJHByb2duYW1lIiAmJiBicmVhawotICAgICBkb25lCi0gICAgIElGUz0iJHNhdmVfSUZTIgotICAgICB0ZXN0IC1uICIkcHJvZ2RpciIgfHwgcHJvZ2Rpcj1gcHdkYAotICAgICBwcm9ncGF0aD0iJHByb2dkaXIvJHByb2duYW1lIgotICAgICA7OwotZXNhYwotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0iJHtTRUR9IicgLWUgMXMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0ncy9cKFtgIiRcXF1cKS9cXFwxL2cnCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgotZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woWyJgXFxdXCkvXFxcMS9nJwotCi0jIFJlLWBcJyBwYXJhbWV0ZXIgZXhwYW5zaW9ucyBpbiBvdXRwdXQgb2YgZG91YmxlX3F1b3RlX3N1YnN0IHRoYXQgd2VyZQotIyBgXCctZWQgaW4gaW5wdXQgdG8gdGhlIHNhbWUuICBJZiBhbiBvZGQgbnVtYmVyIG9mIGBcJyBwcmVjZWRlZCBhICckJwotIyBpbiBpbnB1dCB0byBkb3VibGVfcXVvdGVfc3Vic3QsIHRoYXQgJyQnIHdhcyBwcm90ZWN0ZWQgZnJvbSBleHBhbnNpb24uCi0jIFNpbmNlIGVhY2ggaW5wdXQgYFwnIGlzIG5vdyB0d28gYFwncywgbG9vayBmb3IgYW55IG51bWJlciBvZiBydW5zIG9mCi0jIGZvdXIgYFwncyBmb2xsb3dlZCBieSB0d28gYFwncyBhbmQgdGhlbiBhICckJy4gIGBcJyB0aGF0ICckJy4KLWJzPSdcXCcKLWJzMj0nXFxcXCcKLWJzND0nXFxcXFxcXFwnCi1kb2xsYXI9J1wkJwotc2VkX2RvdWJsZV9iYWNrc2xhc2g9IlwKLSAgcy8kYnM0LyZcXAotL2cKLSAgcy9eJGJzMiRkb2xsYXIvJGJzJi8KLSAgcy9cXChbXiRic11cXCkkYnMyJGRvbGxhci9cXDEkYnMyJGJzJGRvbGxhci9nCi0gIHMvXG4vL2ciCi0KLSMgU3RhbmRhcmQgb3B0aW9uczoKLW9wdF9kcnlfcnVuPWZhbHNlCi1vcHRfaGVscD1mYWxzZQotb3B0X3F1aWV0PWZhbHNlCi1vcHRfdmVyYm9zZT1mYWxzZQotb3B0X3dhcm5pbmc9OgotCi0jIGZ1bmNfZWNobyBhcmcuLi4KLSMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSwgYWxvbmcgd2l0aCB0aGUgY3VycmVudCBtb2RlCi0jIG5hbWUgaWYgaXQgaGFzIGJlZW4gc2V0IHlldC4KLWZ1bmNfZWNobyAoKQotewotICAgICRFQ0hPICIkcHJvZ25hbWUke21vZGUrOiB9JG1vZGU6ICQqIgotfQotCi0jIGZ1bmNfdmVyYm9zZSBhcmcuLi4KLSMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSBpbiB2ZXJib3NlIG1vZGUgb25seS4KLWZ1bmNfdmVyYm9zZSAoKQotewotICAgICRvcHRfdmVyYm9zZSAmJiBmdW5jX2VjaG8gJHsxKyIkQCJ9Ci0KLSAgICAjIEEgYnVnIGluIGJhc2ggaGFsdHMgdGhlIHNjcmlwdCBpZiB0aGUgbGFzdCBsaW5lIG9mIGEgZnVuY3Rpb24KLSAgICAjIGZhaWxzIHdoZW4gc2V0IC1lIGlzIGluIGZvcmNlLCBzbyB3ZSBuZWVkIGFub3RoZXIgY29tbWFuZCB0bwotICAgICMgd29yayBhcm91bmQgdGhhdDoKLSAgICA6Ci19Ci0KLSMgZnVuY19lY2hvX2FsbCBhcmcuLi4KLSMgSW52b2tlICRFQ0hPIHdpdGggYWxsIGFyZ3MsIHNwYWNlLXNlcGFyYXRlZC4KLWZ1bmNfZWNob19hbGwgKCkKLXsKLSAgICAkRUNITyAiJCoiCi19Ci0KLSMgZnVuY19lcnJvciBhcmcuLi4KLSMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvci4KLWZ1bmNfZXJyb3IgKCkKLXsKLSAgICAkRUNITyAiJHByb2duYW1lJHttb2RlKzogfSRtb2RlOiAiJHsxKyIkQCJ9IDE+JjIKLX0KLQotIyBmdW5jX3dhcm5pbmcgYXJnLi4uCi0jIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIHdhcm5pbmcgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvci4KLWZ1bmNfd2FybmluZyAoKQotewotICAgICRvcHRfd2FybmluZyAmJiAkRUNITyAiJHByb2duYW1lJHttb2RlKzogfSRtb2RlOiB3YXJuaW5nOiAiJHsxKyIkQCJ9IDE+JjIKLQotICAgICMgYmFzaCBidWcgYWdhaW46Ci0gICAgOgotfQotCi0jIGZ1bmNfZmF0YWxfZXJyb3IgYXJnLi4uCi0jIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IsIGFuZCBleGl0LgotZnVuY19mYXRhbF9lcnJvciAoKQotewotICAgIGZ1bmNfZXJyb3IgJHsxKyIkQCJ9Ci0gICAgZXhpdCAkRVhJVF9GQUlMVVJFCi19Ci0KLSMgZnVuY19mYXRhbF9oZWxwIGFyZy4uLgotIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLCBmb2xsb3dlZCBieQotIyBhIGhlbHAgaGludCwgYW5kIGV4aXQuCi1mdW5jX2ZhdGFsX2hlbHAgKCkKLXsKLSAgICBmdW5jX2Vycm9yICR7MSsiJEAifQotICAgIGZ1bmNfZmF0YWxfZXJyb3IgIiRoZWxwIgotfQotaGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAgIyMgZGVmYXVsdAotCi0KLSMgZnVuY19ncmVwIGV4cHJlc3Npb24gZmlsZW5hbWUKLSMgQ2hlY2sgd2hldGhlciBFWFBSRVNTSU9OIG1hdGNoZXMgYW55IGxpbmUgb2YgRklMRU5BTUUsIHdpdGhvdXQgb3V0cHV0LgotZnVuY19ncmVwICgpCi17Ci0gICAgJEdSRVAgIiQxIiAiJDIiID4vZGV2L251bGwgMj4mMQotfQotCi0KLSMgZnVuY19ta2Rpcl9wIGRpcmVjdG9yeS1wYXRoCi0jIE1ha2Ugc3VyZSB0aGUgZW50aXJlIHBhdGggdG8gRElSRUNUT1JZLVBBVEggaXMgYXZhaWxhYmxlLgotZnVuY19ta2Rpcl9wICgpCi17Ci0gICAgbXlfZGlyZWN0b3J5X3BhdGg9IiQxIgotICAgIG15X2Rpcl9saXN0PQotCi0gICAgaWYgdGVzdCAtbiAiJG15X2RpcmVjdG9yeV9wYXRoIiAmJiB0ZXN0ICIkb3B0X2RyeV9ydW4iICE9ICI6IjsgdGhlbgotCi0gICAgICAjIFByb3RlY3QgZGlyZWN0b3J5IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nCi0gICAgICBjYXNlICRteV9kaXJlY3RvcnlfcGF0aCBpbgotICAgICAgICAtKikgbXlfZGlyZWN0b3J5X3BhdGg9Ii4vJG15X2RpcmVjdG9yeV9wYXRoIiA7OwotICAgICAgZXNhYwotCi0gICAgICAjIFdoaWxlIHNvbWUgcG9ydGlvbiBvZiBESVIgZG9lcyBub3QgeWV0IGV4aXN0Li4uCi0gICAgICB3aGlsZSB0ZXN0ICEgLWQgIiRteV9kaXJlY3RvcnlfcGF0aCI7IGRvCi0gICAgICAgICMgLi4ubWFrZSBhIGxpc3QgaW4gdG9wbW9zdCBmaXJzdCBvcmRlci4gIFVzZSBhIGNvbG9uIGRlbGltaXRlZAotCSMgbGlzdCBpbmNhc2Ugc29tZSBwb3J0aW9uIG9mIHBhdGggY29udGFpbnMgd2hpdGVzcGFjZS4KLSAgICAgICAgbXlfZGlyX2xpc3Q9IiRteV9kaXJlY3RvcnlfcGF0aDokbXlfZGlyX2xpc3QiCi0KLSAgICAgICAgIyBJZiB0aGUgbGFzdCBwb3J0aW9uIGFkZGVkIGhhcyBubyBzbGFzaCBpbiBpdCwgdGhlIGxpc3QgaXMgZG9uZQotICAgICAgICBjYXNlICRteV9kaXJlY3RvcnlfcGF0aCBpbiAqLyopIDs7ICopIGJyZWFrIDs7IGVzYWMKLQotICAgICAgICAjIC4uLm90aGVyd2lzZSB0aHJvdyBhd2F5IHRoZSBjaGlsZCBkaXJlY3RvcnkgYW5kIGxvb3AKLSAgICAgICAgbXlfZGlyZWN0b3J5X3BhdGg9YCRFQ0hPICIkbXlfZGlyZWN0b3J5X3BhdGgiIHwgJFNFRCAtZSAiJGRpcm5hbWUiYAotICAgICAgZG9uZQotICAgICAgbXlfZGlyX2xpc3Q9YCRFQ0hPICIkbXlfZGlyX2xpc3QiIHwgJFNFRCAncyw6KiQsLCdgCi0KLSAgICAgIHNhdmVfbWtkaXJfcF9JRlM9IiRJRlMiOyBJRlM9JzonCi0gICAgICBmb3IgbXlfZGlyIGluICRteV9kaXJfbGlzdDsgZG8KLQlJRlM9IiRzYXZlX21rZGlyX3BfSUZTIgotICAgICAgICAjIG1rZGlyIGNhbiBmYWlsIHdpdGggYSBgRmlsZSBleGlzdCcgZXJyb3IgaWYgdHdvIHByb2Nlc3NlcwotICAgICAgICAjIHRyeSB0byBjcmVhdGUgb25lIG9mIHRoZSBkaXJlY3RvcmllcyBjb25jdXJyZW50bHkuICBEb24ndAotICAgICAgICAjIHN0b3AgaW4gdGhhdCBjYXNlIQotICAgICAgICAkTUtESVIgIiRteV9kaXIiIDI+L2Rldi9udWxsIHx8IDoKLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJHNhdmVfbWtkaXJfcF9JRlMiCi0KLSAgICAgICMgQmFpbCBvdXQgaWYgd2UgKG9yIHNvbWUgb3RoZXIgcHJvY2VzcykgZmFpbGVkIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KLSAgICAgIHRlc3QgLWQgIiRteV9kaXJlY3RvcnlfcGF0aCIgfHwgXAotICAgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJGYWlsZWQgdG8gY3JlYXRlIFxgJDEnIgotICAgIGZpCi19Ci0KLQotIyBmdW5jX21rdGVtcGRpciBbc3RyaW5nXQotIyBNYWtlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHdvbid0IGNsYXNoIHdpdGggb3RoZXIgcnVubmluZwotIyBsaWJ0b29sIHByb2Nlc3NlcywgYW5kIGF2b2lkcyByYWNlIGNvbmRpdGlvbnMgaWYgcG9zc2libGUuICBJZgotIyBnaXZlbiwgU1RSSU5HIGlzIHRoZSBiYXNlbmFtZSBmb3IgdGhhdCBkaXJlY3RvcnkuCi1mdW5jX21rdGVtcGRpciAoKQotewotICAgIG15X3RlbXBsYXRlPSIke1RNUERJUi0vdG1wfS8kezEtJHByb2duYW1lfSIKLQotICAgIGlmIHRlc3QgIiRvcHRfZHJ5X3J1biIgPSAiOiI7IHRoZW4KLSAgICAgICMgUmV0dXJuIGEgZGlyZWN0b3J5IG5hbWUsIGJ1dCBkb24ndCBjcmVhdGUgaXQgaW4gZHJ5LXJ1biBtb2RlCi0gICAgICBteV90bXBkaXI9IiR7bXlfdGVtcGxhdGV9LSQkIgotICAgIGVsc2UKLQotICAgICAgIyBJZiBta3RlbXAgd29ya3MsIHVzZSB0aGF0IGZpcnN0IGFuZCBmb3JlbW9zdAotICAgICAgbXlfdG1wZGlyPWBta3RlbXAgLWQgIiR7bXlfdGVtcGxhdGV9LVhYWFhYWFhYIiAyPi9kZXYvbnVsbGAKLQotICAgICAgaWYgdGVzdCAhIC1kICIkbXlfdG1wZGlyIjsgdGhlbgotICAgICAgICAjIEZhaWxpbmcgdGhhdCwgYXQgbGVhc3QgdHJ5IGFuZCB1c2UgJFJBTkRPTSB0byBhdm9pZCBhIHJhY2UKLSAgICAgICAgbXlfdG1wZGlyPSIke215X3RlbXBsYXRlfS0ke1JBTkRPTS0wfSQkIgotCi0gICAgICAgIHNhdmVfbWt0ZW1wZGlyX3VtYXNrPWB1bWFza2AKLSAgICAgICAgdW1hc2sgMDA3NwotICAgICAgICAkTUtESVIgIiRteV90bXBkaXIiCi0gICAgICAgIHVtYXNrICRzYXZlX21rdGVtcGRpcl91bWFzawotICAgICAgZmkKLQotICAgICAgIyBJZiB3ZSdyZSBub3QgaW4gZHJ5LXJ1biBtb2RlLCBib21iIG91dCBvbiBmYWlsdXJlCi0gICAgICB0ZXN0IC1kICIkbXlfdG1wZGlyIiB8fCBcCi0gICAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBcYCRteV90bXBkaXInIgotICAgIGZpCi0KLSAgICAkRUNITyAiJG15X3RtcGRpciIKLX0KLQotCi0jIGZ1bmNfcXVvdGVfZm9yX2V2YWwgYXJnCi0jIEFlc3RoZXRpY2FsbHkgcXVvdGUgQVJHIHRvIGJlIGV2YWxlZCBsYXRlci4KLSMgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHR3byB2YWx1ZXM6IEZVTkNfUVVPVEVfRk9SX0VWQUxfUkVTVUxUCi0jIGlzIGRvdWJsZS1xdW90ZWQsIHN1aXRhYmxlIGZvciBhIHN1YnNlcXVlbnQgZXZhbCwgd2hlcmVhcwotIyBGVU5DX1FVT1RFX0ZPUl9FVkFMX1VOUVVPVEVEX1JFU1VMVCBoYXMgbWVyZWx5IGFsbCBjaGFyYWN0ZXJzCi0jIHdoaWNoIGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZSBxdW90ZXMgYmFja3NsYXNoaWZpZWQuCi1mdW5jX3F1b3RlX2Zvcl9ldmFsICgpCi17Ci0gICAgY2FzZSAkMSBpbgotICAgICAgKltcXFxgXCJcJF0qKQotCWZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0PWAkRUNITyAiJDEiIHwgJFNFRCAiJHNlZF9xdW90ZV9zdWJzdCJgIDs7Ci0gICAgICAqKQotICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdD0iJDEiIDs7Ci0gICAgZXNhYwotCi0gICAgY2FzZSAkZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQgaW4KLSAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycyB0byBkZWxheQotICAgICAgIyB3b3JkIHNwbGl0dGluZywgY29tbWFuZCBzdWJzdGl0dXRpb24gYW5kIGFuZCB2YXJpYWJsZQotICAgICAgIyBleHBhbnNpb24gZm9yIGEgc3Vic2VxdWVudCBldmFsLgotICAgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkKLSAgICAgICMgaW4gc2NhbiBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLSAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ9IlwiJGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0XCIiCi0gICAgICAgIDs7Ci0gICAgICAqKQotICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdD0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0IgotICAgIGVzYWMKLX0KLQotCi0jIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCBhcmcKLSMgQWVzdGhldGljYWxseSBxdW90ZSBBUkcgdG8gYmUgZXZhbGVkIGxhdGVyOyBzYW1lIGFzIGFib3ZlLAotIyBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCi1mdW5jX3F1b3RlX2Zvcl9leHBhbmQgKCkKLXsKLSAgICBjYXNlICQxIGluCi0gICAgICAqW1xcXGBcIl0qKQotCW15X2FyZz1gJEVDSE8gIiQxIiB8ICRTRUQgXAotCSAgICAtZSAiJGRvdWJsZV9xdW90ZV9zdWJzdCIgLWUgIiRzZWRfZG91YmxlX2JhY2tzbGFzaCJgIDs7Ci0gICAgICAqKQotICAgICAgICBteV9hcmc9IiQxIiA7OwotICAgIGVzYWMKLQotICAgIGNhc2UgJG15X2FyZyBpbgotICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIHRvIGRlbGF5Ci0gICAgICAjIHdvcmQgc3BsaXR0aW5nIGFuZCBjb21tYW5kIHN1YnN0aXR1dGlvbiBmb3IgYSBzdWJzZXF1ZW50IGV2YWwuCi0gICAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQotICAgICAgIyBpbiBzY2FuIHNldHMsIHNvIHdlIHNwZWNpZnkgaXQgc2VwYXJhdGVseS4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotICAgICAgICBteV9hcmc9IlwiJG15X2FyZ1wiIgotICAgICAgICA7OwotICAgIGVzYWMKLQotICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQ9IiRteV9hcmciCi19Ci0KLQotIyBmdW5jX3Nob3dfZXZhbCBjbWQgW2ZhaWxfZXhwXQotIyBVbmxlc3Mgb3B0X3NpbGVudCBpcyB0cnVlLCB0aGVuIG91dHB1dCBDTUQuICBUaGVuLCBpZiBvcHRfZHJ5cnVuIGlzCi0jIG5vdCB0cnVlLCBldmFsdWF0ZSBDTUQuICBJZiB0aGUgZXZhbHVhdGlvbiBvZiBDTUQgZmFpbHMsIGFuZCBGQUlMX0VYUAotIyBpcyBnaXZlbiwgdGhlbiBldmFsdWF0ZSBpdC4KLWZ1bmNfc2hvd19ldmFsICgpCi17Ci0gICAgbXlfY21kPSIkMSIKLSAgICBteV9mYWlsX2V4cD0iJHsyLTp9IgotCi0gICAgJHtvcHRfc2lsZW50LWZhbHNlfSB8fCB7Ci0gICAgICBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgIiRteV9jbWQiCi0gICAgICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCi0gICAgfQotCi0gICAgaWYgJHtvcHRfZHJ5X3J1bi1mYWxzZX07IHRoZW4gOjsgZWxzZQotICAgICAgZXZhbCAiJG15X2NtZCIKLSAgICAgIG15X3N0YXR1cz0kPwotICAgICAgaWYgdGVzdCAiJG15X3N0YXR1cyIgLWVxIDA7IHRoZW4gOjsgZWxzZQotCWV2YWwgIihleGl0ICRteV9zdGF0dXMpOyAkbXlfZmFpbF9leHAiCi0gICAgICBmaQotICAgIGZpCi19Ci0KLQotIyBmdW5jX3Nob3dfZXZhbF9sb2NhbGUgY21kIFtmYWlsX2V4cF0KLSMgVW5sZXNzIG9wdF9zaWxlbnQgaXMgdHJ1ZSwgdGhlbiBvdXRwdXQgQ01ELiAgVGhlbiwgaWYgb3B0X2RyeXJ1biBpcwotIyBub3QgdHJ1ZSwgZXZhbHVhdGUgQ01ELiAgSWYgdGhlIGV2YWx1YXRpb24gb2YgQ01EIGZhaWxzLCBhbmQgRkFJTF9FWFAKLSMgaXMgZ2l2ZW4sIHRoZW4gZXZhbHVhdGUgaXQuICBVc2UgdGhlIHNhdmVkIGxvY2FsZSBmb3IgZXZhbHVhdGlvbi4KLWZ1bmNfc2hvd19ldmFsX2xvY2FsZSAoKQotewotICAgIG15X2NtZD0iJDEiCi0gICAgbXlfZmFpbF9leHA9IiR7Mi06fSIKLQotICAgICR7b3B0X3NpbGVudC1mYWxzZX0gfHwgewotICAgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkbXlfY21kIgotICAgICAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgotICAgIH0KLQotICAgIGlmICR7b3B0X2RyeV9ydW4tZmFsc2V9OyB0aGVuIDo7IGVsc2UKLSAgICAgIGV2YWwgIiRsdF91c2VyX2xvY2FsZQotCSAgICAkbXlfY21kIgotICAgICAgbXlfc3RhdHVzPSQ/Ci0gICAgICBldmFsICIkbHRfc2FmZV9sb2NhbGUiCi0gICAgICBpZiB0ZXN0ICIkbXlfc3RhdHVzIiAtZXEgMDsgdGhlbiA6OyBlbHNlCi0JZXZhbCAiKGV4aXQgJG15X3N0YXR1cyk7ICRteV9mYWlsX2V4cCIKLSAgICAgIGZpCi0gICAgZmkKLX0KLQotCi0jIGZ1bmNfdmVyc2lvbgotIyBFY2hvIHZlcnNpb24gbWVzc2FnZSB0byBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCi1mdW5jX3ZlcnNpb24gKCkKLXsKLSAgICAkU0VEIC1uICcvKEMpLyFiIGdvCi0JOm1vcmUKLQkvXC4vIXsKLQkgIE4KLQkgIHMvXG4jIC8gLwotCSAgYiBtb3JlCi0JfQotCTpnbwotCS9eIyAnJFBST0dSQU0nIChHTlUgLywvIyB3YXJyYW50eTsgLyB7Ci0gICAgICAgIHMvXiMgLy8KLQlzL14jICokLy8KLSAgICAgICAgcy9cKChDKVwpWyAwLTksLV0qXCggWzEtOV1bMC05XSpcKS9cMVwyLwotICAgICAgICBwCi0gICAgIH0nIDwgIiRwcm9ncGF0aCIKLSAgICAgZXhpdCAkPwotfQotCi0jIGZ1bmNfdXNhZ2UKLSMgRWNobyBzaG9ydCBoZWxwIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgotZnVuY191c2FnZSAoKQotewotICAgICRTRUQgLW4gJy9eIyBVc2FnZTovLC9eIyAgKi4qLS1oZWxwLyB7Ci0gICAgICAgIHMvXiMgLy8KLQlzL14jICokLy8KLQlzL1wkcHJvZ25hbWUvJyRwcm9nbmFtZScvCi0JcAotICAgIH0nIDwgIiRwcm9ncGF0aCIKLSAgICBlY2hvCi0gICAgJEVDSE8gInJ1biBcYCRwcm9nbmFtZSAtLWhlbHAgfCBtb3JlJyBmb3IgZnVsbCB1c2FnZSIKLSAgICBleGl0ICQ/Ci19Ci0KLSMgZnVuY19oZWxwIFtOT0VYSVRdCi0jIEVjaG8gbG9uZyBoZWxwIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LAotIyB1bmxlc3MgJ25vZXhpdCcgaXMgcGFzc2VkIGFzIGFyZ3VtZW50LgotZnVuY19oZWxwICgpCi17Ci0gICAgJFNFRCAtbiAnL14jIFVzYWdlOi8sLyMgUmVwb3J0IGJ1Z3MgdG8vIHsKLSAgICAgICAgcy9eIyAvLwotCXMvXiMgKiQvLwotCXMqXCRwcm9nbmFtZSonJHByb2duYW1lJyoKLQlzKlwkaG9zdConIiRob3N0IicqCi0JcypcJFNIRUxMKiciJFNIRUxMIicqCi0JcypcJExUQ0MqJyIkTFRDQyInKgotCXMqXCRMVENGTEFHUyonIiRMVENGTEFHUyInKgotCXMqXCRMRConIiRMRCInKgotCXMvXCR3aXRoX2dudV9sZC8nIiR3aXRoX2dudV9sZCInLwotCXMvXCRhdXRvbWFrZV92ZXJzaW9uLyciYChhdXRvbWFrZSAtLXZlcnNpb24pIDI+L2Rldi9udWxsIHwkU0VEIDFxYCInLwotCXMvXCRhdXRvY29uZl92ZXJzaW9uLyciYChhdXRvY29uZiAtLXZlcnNpb24pIDI+L2Rldi9udWxsIHwkU0VEIDFxYCInLwotCXAKLSAgICAgfScgPCAiJHByb2dwYXRoIgotICAgIHJldD0kPwotICAgIGlmIHRlc3QgLXogIiQxIjsgdGhlbgotICAgICAgZXhpdCAkcmV0Ci0gICAgZmkKLX0KLQotIyBmdW5jX21pc3NpbmdfYXJnIGFyZ25hbWUKLSMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciBhbmQgc2V0IGdsb2JhbAotIyBleGl0X2NtZC4KLWZ1bmNfbWlzc2luZ19hcmcgKCkKLXsKLSAgICBmdW5jX2Vycm9yICJtaXNzaW5nIGFyZ3VtZW50IGZvciAkMS4iCi0gICAgZXhpdF9jbWQ9ZXhpdAotfQotCi1leGl0X2NtZD06Ci0KLQotCi0KLQotCi1tYWdpYz0iJSUlTUFHSUMgdmFyaWFibGUlJSUiCi1tYWdpY19leGU9IiUlJU1BR0lDIEVYRSB2YXJpYWJsZSUlJSIKLQotIyBHbG9iYWwgdmFyaWFibGVzLgotIyAkbW9kZSBpcyB1bnNldAotbm9ub3B0PQotZXhlY3V0ZV9kbGZpbGVzPQotcHJlc2VydmVfYXJncz0KLWxvMm89InMvXFwubG9cJC8uJHtvYmpleHR9LyIKLW8ybG89InMvXFwuJHtvYmpleHR9XCQvLmxvLyIKLWV4dHJhY3RlZF9hcmNoaXZlcz0KLWV4dHJhY3RlZF9zZXJpYWw9MAotCi1vcHRfZHJ5X3J1bj1mYWxzZQotb3B0X2R1cGxpY2F0ZV9kZXBzPWZhbHNlCi1vcHRfc2lsZW50PWZhbHNlCi1vcHRfZGVidWc9OgotCi0jIElmIHRoaXMgdmFyaWFibGUgaXMgc2V0IGluIGFueSBvZiB0aGUgYWN0aW9ucywgdGhlIGNvbW1hbmQgaW4gaXQKLSMgd2lsbCBiZSBleGVjZWQgYXQgdGhlIGVuZC4gIFRoaXMgcHJldmVudHMgaGVyZS1kb2N1bWVudHMgZnJvbSBiZWluZwotIyBsZWZ0IG92ZXIgYnkgc2hlbGxzLgotZXhlY19jbWQ9Ci0KLSMgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uIGFyZy4uLgotIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLCBmb2xsb3dlZCBieQotIyBhIGNvbmZpZ3VyYXRpb24gZmFpbHVyZSBoaW50LCBhbmQgZXhpdC4KLWZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAoKQotewotICAgIGZ1bmNfZXJyb3IgJHsxKyIkQCJ9Ci0gICAgZnVuY19lcnJvciAiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLSAgICBmdW5jX2ZhdGFsX2Vycm9yICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiIKLX0KLQotCi0jIGZ1bmNfY29uZmlnCi0jIERpc3BsYXkgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGFsbCB0aGUgdGFncyBpbiB0aGlzIHNjcmlwdC4KLWZ1bmNfY29uZmlnICgpCi17Ci0gICAgcmVfYmVnaW5jZj0nXiMgIyMjIEJFR0lOIExJQlRPT0wnCi0gICAgcmVfZW5kY2Y9J14jICMjIyBFTkQgTElCVE9PTCcKLQotICAgICMgRGVmYXVsdCBjb25maWd1cmF0aW9uLgotICAgICRTRUQgIjEsLyRyZV9iZWdpbmNmIENPTkZJRy9kOy8kcmVfZW5kY2YgQ09ORklHLyxcJGQiIDwgIiRwcm9ncGF0aCIKLQotICAgICMgTm93IHByaW50IHRoZSBjb25maWd1cmF0aW9ucyBmb3IgdGhlIHRhZ3MuCi0gICAgZm9yIHRhZ25hbWUgaW4gJHRhZ2xpc3Q7IGRvCi0gICAgICAkU0VEIC1uICIvJHJlX2JlZ2luY2YgVEFHIENPTkZJRzogJHRhZ25hbWVcJC8sLyRyZV9lbmRjZiBUQUcgQ09ORklHOiAkdGFnbmFtZVwkL3AiIDwgIiRwcm9ncGF0aCIKLSAgICBkb25lCi0KLSAgICBleGl0ICQ/Ci19Ci0KLSMgZnVuY19mZWF0dXJlcwotIyBEaXNwbGF5IHRoZSBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgdGhpcyBzY3JpcHQuCi1mdW5jX2ZlYXR1cmVzICgpCi17Ci0gICAgZWNobyAiaG9zdDogJGhvc3QiCi0gICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIGVjaG8gImVuYWJsZSBzaGFyZWQgbGlicmFyaWVzIgotICAgIGVsc2UKLSAgICAgIGVjaG8gImRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyIKLSAgICBmaQotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIGVjaG8gImVuYWJsZSBzdGF0aWMgbGlicmFyaWVzIgotICAgIGVsc2UKLSAgICAgIGVjaG8gImRpc2FibGUgc3RhdGljIGxpYnJhcmllcyIKLSAgICBmaQotCi0gICAgZXhpdCAkPwotfQotCi0jIGZ1bmNfZW5hYmxlX3RhZyB0YWduYW1lCi0jIFZlcmlmeSB0aGF0IFRBR05BTUUgaXMgdmFsaWQsIGFuZCBlaXRoZXIgZmxhZyBhbiBlcnJvciBhbmQgZXhpdCwgb3IKLSMgZW5hYmxlIHRoZSBUQUdOQU1FIHRhZy4gIFdlIGFsc28gYWRkIFRBR05BTUUgdG8gdGhlIGdsb2JhbCAkdGFnbGlzdAotIyB2YXJpYWJsZSBoZXJlLgotZnVuY19lbmFibGVfdGFnICgpCi17Ci0gICMgR2xvYmFsIHZhcmlhYmxlOgotICB0YWduYW1lPSIkMSIKLQotICByZV9iZWdpbmNmPSJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZVwkIgotICByZV9lbmRjZj0iXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lXCQiCi0gIHNlZF9leHRyYWN0Y2Y9Ii8kcmVfYmVnaW5jZi8sLyRyZV9lbmRjZi9wIgotCi0gICMgVmFsaWRhdGUgdGFnbmFtZS4KLSAgY2FzZSAkdGFnbmFtZSBpbgotICAgICpbIS1fQS1aYS16MC05LC9dKikKLSAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImludmFsaWQgdGFnIG5hbWU6ICR0YWduYW1lIgotICAgICAgOzsKLSAgZXNhYwotCi0gICMgRG9uJ3QgdGVzdCBmb3IgdGhlICJkZWZhdWx0IiBDIHRhZywgYXMgd2Uga25vdyBpdCdzCi0gICMgdGhlcmUgYnV0IG5vdCBzcGVjaWFsbHkgbWFya2VkLgotICBjYXNlICR0YWduYW1lIGluCi0gICAgQ0MpIDs7Ci0gICAgKikKLSAgICAgIGlmICRHUkVQICIkcmVfYmVnaW5jZiIgIiRwcm9ncGF0aCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JdGFnbGlzdD0iJHRhZ2xpc3QgJHRhZ25hbWUiCi0KLQkjIEV2YWx1YXRlIHRoZSBjb25maWd1cmF0aW9uLiAgQmUgY2FyZWZ1bCB0byBxdW90ZSB0aGUgcGF0aAotCSMgYW5kIHRoZSBzZWQgc2NyaXB0LCB0byBhdm9pZCBzcGxpdHRpbmcgb24gd2hpdGVzcGFjZSwgYnV0Ci0JIyBhbHNvIGRvbid0IHVzZSBub24tcG9ydGFibGUgcXVvdGVzIHdpdGhpbiBiYWNrcXVvdGVzIHdpdGhpbgotCSMgcXVvdGVzIHdlIGhhdmUgdG8gZG8gaXQgaW4gMiBzdGVwczoKLQlleHRyYWN0ZWRjZj1gJFNFRCAtbiAtZSAiJHNlZF9leHRyYWN0Y2YiIDwgIiRwcm9ncGF0aCJgCi0JZXZhbCAiJGV4dHJhY3RlZGNmIgotICAgICAgZWxzZQotCWZ1bmNfZXJyb3IgImlnbm9yaW5nIHVua25vd24gdGFnICR0YWduYW1lIgotICAgICAgZmkKLSAgICAgIDs7Ci0gIGVzYWMKLX0KLQotIyBQYXJzZSBvcHRpb25zIG9uY2UsIHRob3JvdWdobHkuICBUaGlzIGNvbWVzIGFzIHNvb24gYXMgcG9zc2libGUgaW4KLSMgdGhlIHNjcmlwdCB0byBtYWtlIHRoaW5ncyBsaWtlIGBsaWJ0b29sIC0tdmVyc2lvbicgaGFwcGVuIHF1aWNrbHkuCi17Ci0KLSAgIyBTaG9ydGhhbmQgZm9yIC0tbW9kZT1mb28sIG9ubHkgdmFsaWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50Ci0gIGNhc2UgJDEgaW4KLSAgY2xlYW58Y2xlYXxjbGV8Y2wpCi0gICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgY2xlYW4gJHsxKyIkQCJ9OyBzaGlmdAotICAgIDs7Ci0gIGNvbXBpbGV8Y29tcGlsfGNvbXBpfGNvbXB8Y29tfGNvfGMpCi0gICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgY29tcGlsZSAkezErIiRAIn07IHNoaWZ0Ci0gICAgOzsKLSAgZXhlY3V0ZXxleGVjdXR8ZXhlY3V8ZXhlY3xleGV8ZXh8ZSkKLSAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBleGVjdXRlICR7MSsiJEAifTsgc2hpZnQKLSAgICA7OwotICBmaW5pc2h8ZmluaXN8ZmluaXxmaW58Zml8ZikKLSAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBmaW5pc2ggJHsxKyIkQCJ9OyBzaGlmdAotICAgIDs7Ci0gIGluc3RhbGx8aW5zdGFsfGluc3RhfGluc3R8aW5zfGlufGkpCi0gICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgaW5zdGFsbCAkezErIiRAIn07IHNoaWZ0Ci0gICAgOzsKLSAgbGlua3xsaW58bGl8bCkKLSAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBsaW5rICR7MSsiJEAifTsgc2hpZnQKLSAgICA7OwotICB1bmluc3RhbGx8dW5pbnN0YWx8dW5pbnN0YXx1bmluc3R8dW5pbnN8dW5pbnx1bml8dW58dSkKLSAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSB1bmluc3RhbGwgJHsxKyIkQCJ9OyBzaGlmdAotICAgIDs7Ci0gIGVzYWMKLQotICAjIFBhcnNlIG5vbi1tb2RlIHNwZWNpZmljIGFyZ3VtZW50czoKLSAgd2hpbGUgdGVzdCAiJCMiIC1ndCAwOyBkbwotICAgIG9wdD0iJDEiCi0gICAgc2hpZnQKLQotICAgIGNhc2UgJG9wdCBpbgotICAgICAgLS1jb25maWcpCQlmdW5jX2NvbmZpZwkJCQkJOzsKLQotICAgICAgLS1kZWJ1ZykJCXByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzICRvcHQiCi0JCQlmdW5jX2VjaG8gImVuYWJsaW5nIHNoZWxsIHRyYWNlIG1vZGUiCi0JCQlvcHRfZGVidWc9J3NldCAteCcKLQkJCSRvcHRfZGVidWcKLQkJCTs7Ci0KLSAgICAgIC1kbG9wZW4pCQl0ZXN0ICIkIyIgLWVxIDAgJiYgZnVuY19taXNzaW5nX2FyZyAiJG9wdCIgJiYgYnJlYWsKLQkJCWV4ZWN1dGVfZGxmaWxlcz0iJGV4ZWN1dGVfZGxmaWxlcyAkMSIKLQkJCXNoaWZ0Ci0JCQk7OwotCi0gICAgICAtLWRyeS1ydW4gfCAtbikJb3B0X2RyeV9ydW49OgkJCQkJOzsKLSAgICAgIC0tZmVhdHVyZXMpICAgICAgIGZ1bmNfZmVhdHVyZXMJCQkJCTs7Ci0gICAgICAtLWZpbmlzaCkJCW1vZGU9ImZpbmlzaCIJCQkJCTs7Ci0KLSAgICAgIC0tbW9kZSkJCXRlc3QgIiQjIiAtZXEgMCAmJiBmdW5jX21pc3NpbmdfYXJnICIkb3B0IiAmJiBicmVhawotCQkJY2FzZSAkMSBpbgotCQkJICAjIFZhbGlkIG1vZGUgYXJndW1lbnRzOgotCQkJICBjbGVhbikJOzsKLQkJCSAgY29tcGlsZSkJOzsKLQkJCSAgZXhlY3V0ZSkJOzsKLQkJCSAgZmluaXNoKQk7OwotCQkJICBpbnN0YWxsKQk7OwotCQkJICBsaW5rKQkJOzsKLQkJCSAgcmVsaW5rKQk7OwotCQkJICB1bmluc3RhbGwpCTs7Ci0KLQkJCSAgIyBDYXRjaCBhbnl0aGluZyBlbHNlIGFzIGFuIGVycm9yCi0JCQkgICopIGZ1bmNfZXJyb3IgImludmFsaWQgYXJndW1lbnQgZm9yICRvcHQiCi0JCQkgICAgIGV4aXRfY21kPWV4aXQKLQkJCSAgICAgYnJlYWsKLQkJCSAgICAgOzsKLQkJICAgICAgICBlc2FjCi0KLQkJCW1vZGU9IiQxIgotCQkJc2hpZnQKLQkJCTs7Ci0KLSAgICAgIC0tcHJlc2VydmUtZHVwLWRlcHMpCi0JCQlvcHRfZHVwbGljYXRlX2RlcHM9OgkJCQk7OwotCi0gICAgICAtLXF1aWV0fC0tc2lsZW50KQlwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkb3B0IgotCQkJb3B0X3NpbGVudD06Ci0JCQlvcHRfdmVyYm9zZT1mYWxzZQotCQkJOzsKLQotICAgICAgLS1uby1xdWlldHwtLW5vLXNpbGVudCkKLQkJCXByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzICRvcHQiCi0JCQlvcHRfc2lsZW50PWZhbHNlCi0JCQk7OwotCi0gICAgICAtLXZlcmJvc2V8IC12KQlwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkb3B0IgotCQkJb3B0X3NpbGVudD1mYWxzZQotCQkJb3B0X3ZlcmJvc2U9OgotCQkJOzsKLQotICAgICAgLS1uby12ZXJib3NlKQlwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkb3B0IgotCQkJb3B0X3ZlcmJvc2U9ZmFsc2UKLQkJCTs7Ci0KLSAgICAgIC0tdGFnKQkJdGVzdCAiJCMiIC1lcSAwICYmIGZ1bmNfbWlzc2luZ19hcmcgIiRvcHQiICYmIGJyZWFrCi0JCQlwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkb3B0ICQxIgotCQkJZnVuY19lbmFibGVfdGFnICIkMSIJIyB0YWduYW1lIGlzIHNldCBoZXJlCi0JCQlzaGlmdAotCQkJOzsKLQotICAgICAgIyBTZXBhcmF0ZSBvcHRhcmdzIHRvIGxvbmcgb3B0aW9uczoKLSAgICAgIC1kbG9wZW49KnwtLW1vZGU9KnwtLXRhZz0qKQotCQkJZnVuY19vcHRfc3BsaXQgIiRvcHQiCi0JCQlzZXQgZHVtbXkgIiRmdW5jX29wdF9zcGxpdF9vcHQiICIkZnVuY19vcHRfc3BsaXRfYXJnIiAkezErIiRAIn0KLQkJCXNoaWZ0Ci0JCQk7OwotCi0gICAgICAtXD98LWgpCQlmdW5jX3VzYWdlCQkJCQk7OwotICAgICAgLS1oZWxwKQkJb3B0X2hlbHA9OgkJCQkJOzsKLSAgICAgIC0taGVscC1hbGwpCW9wdF9oZWxwPSc6IGhlbHAtYWxsJwkJCQk7OwotICAgICAgLS12ZXJzaW9uKQlmdW5jX3ZlcnNpb24JCQkJCTs7Ci0KLSAgICAgIC0qKQkJZnVuY19mYXRhbF9oZWxwICJ1bnJlY29nbml6ZWQgb3B0aW9uIFxgJG9wdCciCTs7Ci0KLSAgICAgICopCQlub25vcHQ9IiRvcHQiCi0JCQlicmVhawotCQkJOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotCi0gIGNhc2UgJGhvc3QgaW4KLSAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqcHczMiogfCAqY2VnY2MqKQotICAgICAgIyBkb24ndCBlbGltaW5hdGUgZHVwbGljYXRpb25zIGluICRwb3N0ZGVwcyBhbmQgJHByZWRlcHMKLSAgICAgIG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9OgotICAgICAgOzsKLSAgICAqKQotICAgICAgb3B0X2R1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwcz0kb3B0X2R1cGxpY2F0ZV9kZXBzCi0gICAgICA7OwotICBlc2FjCi0KLSAgIyBIYXZpbmcgd2FybmVkIGFib3V0IGFsbCBtaXMtc3BlY2lmaWVkIG9wdGlvbnMsIGJhaWwgb3V0IGlmCi0gICMgYW55dGhpbmcgd2FzIHdyb25nLgotICAkZXhpdF9jbWQgJEVYSVRfRkFJTFVSRQotfQotCi0jIGZ1bmNfY2hlY2tfdmVyc2lvbl9tYXRjaAotIyBFbnN1cmUgdGhhdCB3ZSBhcmUgdXNpbmcgbTQgbWFjcm9zLCBhbmQgbGlidG9vbCBzY3JpcHQgZnJvbSB0aGUgc2FtZQotIyByZWxlYXNlIG9mIGxpYnRvb2wuCi1mdW5jX2NoZWNrX3ZlcnNpb25fbWF0Y2ggKCkKLXsKLSAgaWYgdGVzdCAiJHBhY2thZ2VfcmV2aXNpb24iICE9ICIkbWFjcm9fcmV2aXNpb24iOyB0aGVuCi0gICAgaWYgdGVzdCAiJFZFUlNJT04iICE9ICIkbWFjcm9fdmVyc2lvbiI7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogIiRtYWNyb192ZXJzaW9uIjsgdGhlbgotICAgICAgICBjYXQgPiYyIDw8X0xUX0VPRgotJHByb2duYW1lOiBWZXJzaW9uIG1pc21hdGNoIGVycm9yLiAgVGhpcyBpcyAkUEFDS0FHRSAkVkVSU0lPTiwgYnV0IHRoZQotJHByb2duYW1lOiBkZWZpbml0aW9uIG9mIHRoaXMgTFRfSU5JVCBjb21lcyBmcm9tIGFuIG9sZGVyIHJlbGVhc2UuCi0kcHJvZ25hbWU6IFlvdSBzaG91bGQgcmVjcmVhdGUgYWNsb2NhbC5tNCB3aXRoIG1hY3JvcyBmcm9tICRQQUNLQUdFICRWRVJTSU9OCi0kcHJvZ25hbWU6IGFuZCBydW4gYXV0b2NvbmYgYWdhaW4uCi1fTFRfRU9GCi0gICAgICBlbHNlCi0gICAgICAgIGNhdCA+JjIgPDxfTFRfRU9GCi0kcHJvZ25hbWU6IFZlcnNpb24gbWlzbWF0Y2ggZXJyb3IuICBUaGlzIGlzICRQQUNLQUdFICRWRVJTSU9OLCBidXQgdGhlCi0kcHJvZ25hbWU6IGRlZmluaXRpb24gb2YgdGhpcyBMVF9JTklUIGNvbWVzIGZyb20gJFBBQ0tBR0UgJG1hY3JvX3ZlcnNpb24uCi0kcHJvZ25hbWU6IFlvdSBzaG91bGQgcmVjcmVhdGUgYWNsb2NhbC5tNCB3aXRoIG1hY3JvcyBmcm9tICRQQUNLQUdFICRWRVJTSU9OCi0kcHJvZ25hbWU6IGFuZCBydW4gYXV0b2NvbmYgYWdhaW4uCi1fTFRfRU9GCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGNhdCA+JjIgPDxfTFRfRU9GCi0kcHJvZ25hbWU6IFZlcnNpb24gbWlzbWF0Y2ggZXJyb3IuICBUaGlzIGlzICRQQUNLQUdFICRWRVJTSU9OLCByZXZpc2lvbiAkcGFja2FnZV9yZXZpc2lvbiwKLSRwcm9nbmFtZTogYnV0IHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgTFRfSU5JVCBjb21lcyBmcm9tIHJldmlzaW9uICRtYWNyb19yZXZpc2lvbi4KLSRwcm9nbmFtZTogWW91IHNob3VsZCByZWNyZWF0ZSBhY2xvY2FsLm00IHdpdGggbWFjcm9zIGZyb20gcmV2aXNpb24gJHBhY2thZ2VfcmV2aXNpb24KLSRwcm9nbmFtZTogb2YgJFBBQ0tBR0UgJFZFUlNJT04gYW5kIHJ1biBhdXRvY29uZiBhZ2Fpbi4KLV9MVF9FT0YKLSAgICBmaQotCi0gICAgZXhpdCAkRVhJVF9NSVNNQVRDSAotICBmaQotfQotCi0KLSMjIC0tLS0tLS0tLS0tICMjCi0jIyAgICBNYWluLiAgICAjIwotIyMgLS0tLS0tLS0tLS0gIyMKLQotJG9wdF9oZWxwIHx8IHsKLSAgIyBTYW5pdHkgY2hlY2tzIGZpcnN0OgotICBmdW5jX2NoZWNrX3ZlcnNpb25fbWF0Y2gKLQotICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiAhPSB5ZXM7IHRoZW4KLSAgICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gIm5vdCBjb25maWd1cmVkIHRvIGJ1aWxkIGFueSBraW5kIG9mIGxpYnJhcnkiCi0gIGZpCi0KLSAgdGVzdCAteiAiJG1vZGUiICYmIGZ1bmNfZmF0YWxfZXJyb3IgImVycm9yOiB5b3UgbXVzdCBzcGVjaWZ5IGEgTU9ERS4iCi0KLQotICAjIERhcndpbiBzdWNrcwotICBldmFsIHN0ZF9zaHJleHQ9XCIkc2hyZXh0X2NtZHNcIgotCi0KLSAgIyBPbmx5IGV4ZWN1dGUgbW9kZSBpcyBhbGxvd2VkIHRvIGhhdmUgLWRsb3BlbiBmbGFncy4KLSAgaWYgdGVzdCAtbiAiJGV4ZWN1dGVfZGxmaWxlcyIgJiYgdGVzdCAiJG1vZGUiICE9IGV4ZWN1dGU7IHRoZW4KLSAgICBmdW5jX2Vycm9yICJ1bnJlY29nbml6ZWQgb3B0aW9uIFxgLWRsb3BlbiciCi0gICAgJEVDSE8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gIGZpCi0KLSAgIyBDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSB0byBhIG1vZGUtc3BlY2lmaWMgb25lLgotICBnZW5lcmljX2hlbHA9IiRoZWxwIgotICBoZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwIC0tbW9kZT0kbW9kZScgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotfQotCi0KLSMgZnVuY19sYWxpYl9wIGZpbGUKLSMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgYC5sYScgbGlicmFyeSBvciBgLmxvJyBvYmplY3QgZmlsZS4KLSMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKLSMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCi1mdW5jX2xhbGliX3AgKCkKLXsKLSAgICB0ZXN0IC1mICIkMSIgJiYKLSAgICAgICRTRUQgLWUgNHEgIiQxIiAyPi9kZXYvbnVsbCBcCi0gICAgICAgIHwgJEdSRVAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIiA+IC9kZXYvbnVsbCAyPiYxCi19Ci0KLSMgZnVuY19sYWxpYl91bnNhZmVfcCBmaWxlCi0jIFRydWUgaWZmIEZJTEUgaXMgYSBsaWJ0b29sIGAubGEnIGxpYnJhcnkgb3IgYC5sbycgb2JqZWN0IGZpbGUuCi0jIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgc2FtZSBjaGVjayBhcyBmdW5jX2xhbGliX3Agd2l0aG91dAotIyByZXNvcnRpbmcgdG8gZXh0ZXJuYWwgcHJvZ3JhbXMuICBUbyB0aGlzIGVuZCwgaXQgcmVkaXJlY3RzIHN0ZGluIGFuZAotIyBjbG9zZXMgaXQgYWZ0ZXJ3YXJkcywgd2l0aG91dCBzYXZpbmcgdGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvci4KLSMgQXMgYSBzYWZldHkgbWVhc3VyZSwgdXNlIGl0IG9ubHkgd2hlcmUgYSBuZWdhdGl2ZSByZXN1bHQgd291bGQgYmUKLSMgZmF0YWwgYW55d2F5LiAgV29ya3MgaWYgYGZpbGUnIGRvZXMgbm90IGV4aXN0LgotZnVuY19sYWxpYl91bnNhZmVfcCAoKQotewotICAgIGxhbGliX3A9bm8KLSAgICBpZiB0ZXN0IC1mICIkMSIgJiYgdGVzdCAtciAiJDEiICYmIGV4ZWMgNTwmMCA8IiQxIjsgdGhlbgotCWZvciBsYWxpYl9wX2wgaW4gMSAyIDMgNAotCWRvCi0JICAgIHJlYWQgbGFsaWJfcF9saW5lCi0JICAgIGNhc2UgIiRsYWxpYl9wX2xpbmUiIGluCi0JCVwjXCBHZW5lcmF0ZWRcIGJ5XCAqJFBBQ0tBR0UqICkgbGFsaWJfcD15ZXM7IGJyZWFrOzsKLQkgICAgZXNhYwotCWRvbmUKLQlleGVjIDA8JjUgNTwmLQotICAgIGZpCi0gICAgdGVzdCAiJGxhbGliX3AiID0geWVzCi19Ci0KLSMgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgZmlsZQotIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdAotIyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYSBiYXNpYyBzYW5pdHkgY2hlY2s7IGl0IHdpbGwgaGFyZGx5IGZsdXNoIG91dAotIyBkZXRlcm1pbmVkIGltcG9zdGVycy4KLWZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICgpCi17Ci0gICAgZnVuY19sYWxpYl9wICIkMSIKLX0KLQotIyBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgZmlsZQotIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIGV4ZWN1dGFibGUKLSMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKLSMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCi1mdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgKCkKLXsKLSAgICBmdW5jX2x0d3JhcHBlcl9leGVjX3N1ZmZpeD0KLSAgICBjYXNlICQxIGluCi0gICAgKi5leGUpIDs7Ci0gICAgKikgZnVuY19sdHdyYXBwZXJfZXhlY19zdWZmaXg9LmV4ZSA7OwotICAgIGVzYWMKLSAgICAkR1JFUCAiJG1hZ2ljX2V4ZSIgIiQxJGZ1bmNfbHR3cmFwcGVyX2V4ZWNfc3VmZml4IiA+L2Rldi9udWxsIDI+JjEKLX0KLQotIyBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lIGZpbGUKLSMgQXNzdW1lcyBmaWxlIGlzIGFuIGx0d3JhcHBlcl9leGVjdXRhYmxlCi0jIHVzZXMgJGZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBmaWxlbmFtZSBmb3IgYQotIyB0ZW1wb3JhcnkgbHR3cmFwcGVyX3NjcmlwdC4KLWZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgKCkKLXsKLSAgICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdD0iIgotICAgIGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJDEiOyB0aGVuCi0JZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJDEiICIiICIuIgotCWZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotCWZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdC8kb2JqZGlyLyR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0fV9sdHNod3JhcHBlciIKLSAgICBmaQotfQotCi0jIGZ1bmNfbHR3cmFwcGVyX3AgZmlsZQotIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBvciB3cmFwcGVyIGV4ZWN1dGFibGUKLSMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKLSMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCi1mdW5jX2x0d3JhcHBlcl9wICgpCi17Ci0gICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgIiQxIiB8fCBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiQxIgotfQotCi0KLSMgZnVuY19leGVjdXRlX2NtZHMgY29tbWFuZHMgZmFpbF9jbWQKLSMgRXhlY3V0ZSB0aWxkZS1kZWxpbWl0ZWQgQ09NTUFORFMuCi0jIElmIEZBSUxfQ01EIGlzIGdpdmVuLCBldmFsIHRoYXQgdXBvbiBmYWlsdXJlLgotIyBGQUlMX0NNRCBtYXkgcmVhZC1hY2Nlc3MgdGhlIGN1cnJlbnQgY29tbWFuZCBpbiB2YXJpYWJsZSBDTUQhCi1mdW5jX2V4ZWN1dGVfY21kcyAoKQotewotICAgICRvcHRfZGVidWcKLSAgICBzYXZlX2lmcz0kSUZTOyBJRlM9J34nCi0gICAgZm9yIGNtZCBpbiAkMTsgZG8KLSAgICAgIElGUz0kc2F2ZV9pZnMKLSAgICAgIGV2YWwgY21kPVwiJGNtZFwiCi0gICAgICBmdW5jX3Nob3dfZXZhbCAiJGNtZCIgIiR7Mi06fSIKLSAgICBkb25lCi0gICAgSUZTPSRzYXZlX2lmcwotfQotCi0KLSMgZnVuY19zb3VyY2UgZmlsZQotIyBTb3VyY2UgRklMRSwgYWRkaW5nIGRpcmVjdG9yeSBjb21wb25lbnQgaWYgbmVjZXNzYXJ5LgotIyBOb3RlIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyeSBvbiBjeWd3aW4vbWluZ3cgdG8gYXBwZW5kIGEgZG90IHRvCi0jIEZJTEUgZXZlbiBpZiBib3RoIEZJTEUgYW5kIEZJTEUuZXhlIGV4aXN0OiBhdXRvbWF0aWMtYXBwZW5kLS5leGUKLSMgYmVoYXZpb3IgaGFwcGVucyBvbmx5IGZvciBleGVjKDMpLCBub3QgZm9yIG9wZW4oMikhICBBbHNvLCBzb3VyY2luZwotIyBgRklMRS4nIGRvZXMgbm90IHdvcmsgb24gY3lnd2luIG1hbmFnZWQgbW91bnRzLgotZnVuY19zb3VyY2UgKCkKLXsKLSAgICAkb3B0X2RlYnVnCi0gICAgY2FzZSAkMSBpbgotICAgICovKiB8ICpcXCopCS4gIiQxIiA7OwotICAgICopCQkuICIuLyQxIiA7OwotICAgIGVzYWMKLX0KLQotCi0jIGZ1bmNfaW5mZXJfdGFnIGFyZwotIyBJbmZlciB0YWdnZWQgY29uZmlndXJhdGlvbiB0byB1c2UgaWYgYW55IGFyZSBhdmFpbGFibGUgYW5kCi0jIGlmIG9uZSB3YXNuJ3QgY2hvc2VuIHZpYSB0aGUgIi0tdGFnIiBjb21tYW5kIGxpbmUgb3B0aW9uLgotIyBPbmx5IGF0dGVtcHQgdGhpcyBpZiB0aGUgY29tcGlsZXIgaW4gdGhlIGJhc2UgY29tcGlsZQotIyBjb21tYW5kIGRvZXNuJ3QgbWF0Y2ggdGhlIGRlZmF1bHQgY29tcGlsZXIuCi0jIGFyZyBpcyB1c3VhbGx5IG9mIHRoZSBmb3JtICdnY2MgLi4uJwotZnVuY19pbmZlcl90YWcgKCkKLXsKLSAgICAkb3B0X2RlYnVnCi0gICAgaWYgdGVzdCAtbiAiJGF2YWlsYWJsZV90YWdzIiAmJiB0ZXN0IC16ICIkdGFnbmFtZSI7IHRoZW4KLSAgICAgIENDX3F1b3RlZD0KLSAgICAgIGZvciBhcmcgaW4gJENDOyBkbwotICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgotCUNDX3F1b3RlZD0iJENDX3F1b3RlZCAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCi0gICAgICBkb25lCi0gICAgICBDQ19leHBhbmRlZD1gZnVuY19lY2hvX2FsbCAkQ0NgCi0gICAgICBDQ19xdW90ZWRfZXhwYW5kZWQ9YGZ1bmNfZWNob19hbGwgJENDX3F1b3RlZGAKLSAgICAgIGNhc2UgJEAgaW4KLSAgICAgICMgQmxhbmtzIGluIHRoZSBjb21tYW5kIG1heSBoYXZlIGJlZW4gc3RyaXBwZWQgYnkgdGhlIGNhbGxpbmcgc2hlbGwsCi0gICAgICAjIGJ1dCBub3QgZnJvbSB0aGUgQ0MgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBjb25maWd1cmUgd2FzIHJ1bi4KLSAgICAgICIgJENDICIqIHwgIiRDQyAiKiB8ICIgJENDX2V4cGFuZGVkICIqIHwgIiRDQ19leHBhbmRlZCAiKiB8IFwKLSAgICAgICIgJENDX3F1b3RlZCIqIHwgIiRDQ19xdW90ZWQgIiogfCAiICRDQ19xdW90ZWRfZXhwYW5kZWQgIiogfCAiJENDX3F1b3RlZF9leHBhbmRlZCAiKikgOzsKLSAgICAgICMgQmxhbmtzIGF0IHRoZSBzdGFydCBvZiAkYmFzZV9jb21waWxlIHdpbGwgY2F1c2UgdGhpcyB0byBmYWlsCi0gICAgICAjIGlmIHdlIGRvbid0IGNoZWNrIGZvciB0aGVtIGFzIHdlbGwuCi0gICAgICAqKQotCWZvciB6IGluICRhdmFpbGFibGVfdGFnczsgZG8KLQkgIGlmICRHUkVQICJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkeiQiIDwgIiRwcm9ncGF0aCIgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgIyBFdmFsdWF0ZSB0aGUgY29uZmlndXJhdGlvbi4KLQkgICAgZXZhbCAiYCR7U0VEfSAtbiAtZSAnL14jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICckeickLywvXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICckeickL3AnIDwgJHByb2dwYXRoYCIKLQkgICAgQ0NfcXVvdGVkPQotCSAgICBmb3IgYXJnIGluICRDQzsgZG8KLQkgICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi0JICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKLQkgICAgICBDQ19xdW90ZWQ9IiRDQ19xdW90ZWQgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgotCSAgICBkb25lCi0JICAgIENDX2V4cGFuZGVkPWBmdW5jX2VjaG9fYWxsICRDQ2AKLQkgICAgQ0NfcXVvdGVkX2V4cGFuZGVkPWBmdW5jX2VjaG9fYWxsICRDQ19xdW90ZWRgCi0JICAgIGNhc2UgIiRAICIgaW4KLQkgICAgIiAkQ0MgIiogfCAiJENDICIqIHwgIiAkQ0NfZXhwYW5kZWQgIiogfCAiJENDX2V4cGFuZGVkICIqIHwgXAotCSAgICAiICRDQ19xdW90ZWQiKiB8ICIkQ0NfcXVvdGVkICIqIHwgIiAkQ0NfcXVvdGVkX2V4cGFuZGVkICIqIHwgIiRDQ19xdW90ZWRfZXhwYW5kZWQgIiopCi0JICAgICAgIyBUaGUgY29tcGlsZXIgaW4gdGhlIGJhc2UgY29tcGlsZSBjb21tYW5kIG1hdGNoZXMKLQkgICAgICAjIHRoZSBvbmUgaW4gdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9uLgotCSAgICAgICMgQXNzdW1lIHRoaXMgaXMgdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9uIHdlIHdhbnQuCi0JICAgICAgdGFnbmFtZT0kegotCSAgICAgIGJyZWFrCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZmkKLQlkb25lCi0JIyBJZiAkdGFnbmFtZSBzdGlsbCBpc24ndCBzZXQsIHRoZW4gbm8gdGFnZ2VkIGNvbmZpZ3VyYXRpb24KLQkjIHdhcyBmb3VuZCBhbmQgbGV0IHRoZSB1c2VyIGtub3cgdGhhdCB0aGUgIi0tdGFnIiBjb21tYW5kCi0JIyBsaW5lIG9wdGlvbiBtdXN0IGJlIHVzZWQuCi0JaWYgdGVzdCAteiAiJHRhZ25hbWUiOyB0aGVuCi0JICBmdW5jX2VjaG8gInVuYWJsZSB0byBpbmZlciB0YWdnZWQgY29uZmlndXJhdGlvbiIKLQkgIGZ1bmNfZmF0YWxfZXJyb3IgInNwZWNpZnkgYSB0YWcgd2l0aCBcYC0tdGFnJyIKLSMJZWxzZQotIwkgIGZ1bmNfdmVyYm9zZSAidXNpbmcgJHRhZ25hbWUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24iCi0JZmkKLQk7OwotICAgICAgZXNhYwotICAgIGZpCi19Ci0KLQotCi0jIGZ1bmNfd3JpdGVfbGlidG9vbF9vYmplY3Qgb3V0cHV0X25hbWUgcGljX25hbWUgbm9ucGljX25hbWUKLSMgQ3JlYXRlIGEgbGlidG9vbCBvYmplY3QgZmlsZSAoYW5hbG9nb3VzIHRvIGEgIi5sYSIgZmlsZSksCi0jIGJ1dCBkb24ndCBjcmVhdGUgaXQgaWYgd2UncmUgZG9pbmcgYSBkcnkgcnVuLgotZnVuY193cml0ZV9saWJ0b29sX29iamVjdCAoKQotewotICAgIHdyaXRlX2xpYm9iaj0kezF9Ci0gICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIHdyaXRlX2xvYmo9XCckezJ9XCcKLSAgICBlbHNlCi0gICAgICB3cml0ZV9sb2JqPW5vbmUKLSAgICBmaQotCi0gICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgd3JpdGVfb2xkb2JqPVwnJHszfVwnCi0gICAgZWxzZQotICAgICAgd3JpdGVfb2xkb2JqPW5vbmUKLSAgICBmaQotCi0gICAgJG9wdF9kcnlfcnVuIHx8IHsKLSAgICAgIGNhdCA+JHt3cml0ZV9saWJvYmp9VCA8PEVPRgotIyAkd3JpdGVfbGlib2JqIC0gYSBsaWJ0b29sIG9iamVjdCBmaWxlCi0jIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KLSMKLSMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQotIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCi0KLSMgTmFtZSBvZiB0aGUgUElDIG9iamVjdC4KLXBpY19vYmplY3Q9JHdyaXRlX2xvYmoKLQotIyBOYW1lIG9mIHRoZSBub24tUElDIG9iamVjdAotbm9uX3BpY19vYmplY3Q9JHdyaXRlX29sZG9iagotCi1FT0YKLSAgICAgICRNViAiJHt3cml0ZV9saWJvYmp9VCIgIiR7d3JpdGVfbGlib2JqfSIKLSAgICB9Ci19Ci0KLSMgZnVuY19tb2RlX2NvbXBpbGUgYXJnLi4uCi1mdW5jX21vZGVfY29tcGlsZSAoKQotewotICAgICRvcHRfZGVidWcKLSAgICAjIEdldCB0aGUgY29tcGlsYXRpb24gY29tbWFuZCBhbmQgdGhlIHNvdXJjZSBmaWxlLgotICAgIGJhc2VfY29tcGlsZT0KLSAgICBzcmNmaWxlPSIkbm9ub3B0IiAgIyAgYWx3YXlzIGtlZXAgYSBub24tZW1wdHkgdmFsdWUgaW4gInNyY2ZpbGUiCi0gICAgc3VwcHJlc3Nfb3B0PXllcwotICAgIHN1cHByZXNzX291dHB1dD0KLSAgICBhcmdfbW9kZT1ub3JtYWwKLSAgICBsaWJvYmo9Ci0gICAgbGF0ZXI9Ci0gICAgcGllX2ZsYWc9Ci0KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGNhc2UgJGFyZ19tb2RlIGluCi0gICAgICBhcmcgICkKLQkjIGRvIG5vdCAiY29udGludWUiLiAgSW5zdGVhZCwgYWRkIHRoaXMgdG8gYmFzZV9jb21waWxlCi0JbGFzdGFyZz0iJGFyZyIKLQlhcmdfbW9kZT1ub3JtYWwKLQk7OwotCi0gICAgICB0YXJnZXQgKQotCWxpYm9iaj0iJGFyZyIKLQlhcmdfbW9kZT1ub3JtYWwKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIG5vcm1hbCApCi0JIyBBY2NlcHQgYW55IGNvbW1hbmQtbGluZSBvcHRpb25zLgotCWNhc2UgJGFyZyBpbgotCS1vKQotCSAgdGVzdCAtbiAiJGxpYm9iaiIgJiYgXAotCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJ5b3UgY2Fubm90IHNwZWNpZnkgXGAtbycgbW9yZSB0aGFuIG9uY2UiCi0JICBhcmdfbW9kZT10YXJnZXQKLQkgIGNvbnRpbnVlCi0JICA7OwotCi0JLXBpZSB8IC1mcGllIHwgLWZQSUUpCi0gICAgICAgICAgcGllX2ZsYWc9IiRwaWVfZmxhZyAkYXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0KLQktc2hhcmVkIHwgLXN0YXRpYyB8IC1wcmVmZXItcGljIHwgLXByZWZlci1ub24tcGljKQotCSAgbGF0ZXI9IiRsYXRlciAkYXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0KLQktbm8tc3VwcHJlc3MpCi0JICBzdXBwcmVzc19vcHQ9bm8KLQkgIGNvbnRpbnVlCi0JICA7OwotCi0JLVhjb21waWxlcikKLQkgIGFyZ19tb2RlPWFyZyAgIyAgdGhlIG5leHQgb25lIGdvZXMgaW50byB0aGUgImJhc2VfY29tcGlsZSIgYXJnIGxpc3QKLQkgIGNvbnRpbnVlICAgICAgIyAgVGhlIGN1cnJlbnQgInNyY2ZpbGUiIHdpbGwgZWl0aGVyIGJlIHJldGFpbmVkIG9yCi0JICA7OyAgICAgICAgICAgICMgIHJlcGxhY2VkIGxhdGVyLiAgSSB3b3VsZCBndWVzcyB0aGF0IHdvdWxkIGJlIGEgYnVnLgotCi0JLVdjLCopCi0JICBmdW5jX3N0cmlwbmFtZSAnLVdjLCcgJycgIiRhcmciCi0JICBhcmdzPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQkgIGxhc3Rhcmc9Ci0JICBzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKLQkgIGZvciBhcmcgaW4gJGFyZ3M7IGRvCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgotCSAgICBsYXN0YXJnPSIkbGFzdGFyZyAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCi0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgIGZ1bmNfc3RyaXBuYW1lICcgJyAnJyAiJGxhc3RhcmciCi0JICBsYXN0YXJnPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQotCSAgIyBBZGQgdGhlIGFyZ3VtZW50cyB0byBiYXNlX2NvbXBpbGUuCi0JICBiYXNlX2NvbXBpbGU9IiRiYXNlX2NvbXBpbGUgJGxhc3RhcmciCi0JICBjb250aW51ZQotCSAgOzsKLQotCSopCi0JICAjIEFjY2VwdCB0aGUgY3VycmVudCBhcmd1bWVudCBhcyB0aGUgc291cmNlIGZpbGUuCi0JICAjIFRoZSBwcmV2aW91cyAic3JjZmlsZSIgYmVjb21lcyB0aGUgY3VycmVudCBhcmd1bWVudC4KLQkgICMKLQkgIGxhc3Rhcmc9IiRzcmNmaWxlIgotCSAgc3JjZmlsZT0iJGFyZyIKLQkgIDs7Ci0JZXNhYyAgIyAgY2FzZSAkYXJnCi0JOzsKLSAgICAgIGVzYWMgICAgIyAgY2FzZSAkYXJnX21vZGUKLQotICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBwcmV2aW91cyBhcmd1bWVudC4KLSAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRsYXN0YXJnIgotICAgICAgYmFzZV9jb21waWxlPSIkYmFzZV9jb21waWxlICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLSAgICBkb25lICMgZm9yIGFyZwotCi0gICAgY2FzZSAkYXJnX21vZGUgaW4KLSAgICBhcmcpCi0gICAgICBmdW5jX2ZhdGFsX2Vycm9yICJ5b3UgbXVzdCBzcGVjaWZ5IGFuIGFyZ3VtZW50IGZvciAtWGNvbXBpbGUiCi0gICAgICA7OwotICAgIHRhcmdldCkKLSAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgInlvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2l0aCBcYC1vJyIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgICMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IG9iamVjdC4KLSAgICAgIHRlc3QgLXogIiRsaWJvYmoiICYmIHsKLQlmdW5jX2Jhc2VuYW1lICIkc3JjZmlsZSIKLQlsaWJvYmo9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLSAgICAgIH0KLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBSZWNvZ25pemUgc2V2ZXJhbCBkaWZmZXJlbnQgZmlsZSBzdWZmaXhlcy4KLSAgICAjIElmIHRoZSB1c2VyIHNwZWNpZmllcyAtbyBmaWxlLm8sIGl0IGlzIHJlcGxhY2VkIHdpdGggZmlsZS5sbwotICAgIGNhc2UgJGxpYm9iaiBpbgotICAgICouW2NDRlNpZm1zb10gfCBcCi0gICAgKi5hZGEgfCAqLmFkYiB8ICouYWRzIHwgKi5hc20gfCBcCi0gICAgKi5jKysgfCAqLmNjIHwgKi5paSB8ICouY2xhc3MgfCAqLmNwcCB8ICouY3h4IHwgXAotICAgICouW2ZGXVswOV0/IHwgKi5mb3IgfCAqLmphdmEgfCAqLm9iaiB8ICouc3ggfCAqLmN1IHwgKi5jdXApCi0gICAgICBmdW5jX3hmb3JtICIkbGlib2JqIgotICAgICAgbGlib2JqPSRmdW5jX3hmb3JtX3Jlc3VsdAotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBjYXNlICRsaWJvYmogaW4KLSAgICAqLmxvKSBmdW5jX2xvMm8gIiRsaWJvYmoiOyBvYmo9JGZ1bmNfbG8yb19yZXN1bHQgOzsKLSAgICAqKQotICAgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGRldGVybWluZSBuYW1lIG9mIGxpYnJhcnkgb2JqZWN0IGZyb20gXGAkbGlib2JqJyIKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgZnVuY19pbmZlcl90YWcgJGJhc2VfY29tcGlsZQotCi0gICAgZm9yIGFyZyBpbiAkbGF0ZXI7IGRvCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1zaGFyZWQpCi0JdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIFwKLQkgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAiY2FuIG5vdCBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5IgotCWJ1aWxkX29sZF9saWJzPW5vCi0JY29udGludWUKLQk7OwotCi0gICAgICAtc3RhdGljKQotCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCWJ1aWxkX29sZF9saWJzPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXByZWZlci1waWMpCi0JcGljX21vZGU9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtcHJlZmVyLW5vbi1waWMpCi0JcGljX21vZGU9bm8KLQljb250aW51ZQotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGxpYm9iaiIKLSAgICB0ZXN0ICJYJGxpYm9iaiIgIT0gIlgkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiIFwKLSAgICAgICYmICRFQ0hPICJYJGxpYm9iaiIgfCAkR1JFUCAnW11+I14qe307PD4/IiciJyInCSAmKCl8YCRbXScgXAotICAgICAgJiYgZnVuY193YXJuaW5nICJsaWJvYmogbmFtZSBcYCRsaWJvYmonIG1heSBub3QgY29udGFpbiBzaGVsbCBzcGVjaWFsIGNoYXJhY3RlcnMuIgotICAgIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRvYmoiICIvIiAiIgotICAgIG9iam5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLSAgICB4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLSAgICBsb2JqPSR7eGRpcn0kb2JqZGlyLyRvYmpuYW1lCi0KLSAgICB0ZXN0IC16ICIkYmFzZV9jb21waWxlIiAmJiBcCi0gICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBjb21waWxhdGlvbiBjb21tYW5kIgotCi0gICAgIyBEZWxldGUgYW55IGxlZnRvdmVyIGxpYnJhcnkgb2JqZWN0cy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICByZW1vdmVsaXN0PSIkb2JqICRsb2JqICRsaWJvYmogJHtsaWJvYmp9VCIKLSAgICBlbHNlCi0gICAgICByZW1vdmVsaXN0PSIkbG9iaiAkbGlib2JqICR7bGlib2JqfVQiCi0gICAgZmkKLQotICAgICMgT24gQ3lnd2luIHRoZXJlJ3Mgbm8gInJlYWwiIFBJQyBmbGFnIHNvIHdlIG11c3QgYnVpbGQgYm90aCBvYmplY3QgdHlwZXMKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKLSAgICAgIHBpY19tb2RlPWRlZmF1bHQKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgPSBubyAmJiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCi0gICAgICAjIG5vbi1QSUMgY29kZSBpbiBzaGFyZWQgbGlicmFyaWVzIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgIHBpY19tb2RlPWRlZmF1bHQKLSAgICBmaQotCi0gICAgIyBDYWxjdWxhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgb2JqZWN0IGlmIGNvbXBpbGVyIGRvZXMKLSAgICAjIG5vdCBzdXBwb3J0IC1vIHdpdGggLWMKLSAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vOyB0aGVuCi0gICAgICBvdXRwdXRfb2JqPWAkRUNITyAiJHNyY2ZpbGUiIHwgJFNFRCAncyVeLiovJSU7IHMlXC5bXi5dKiQlJSdgLiR7b2JqZXh0fQotICAgICAgbG9ja2ZpbGU9IiRvdXRwdXRfb2JqLmxvY2siCi0gICAgZWxzZQotICAgICAgb3V0cHV0X29iaj0KLSAgICAgIG5lZWRfbG9ja3M9bm8KLSAgICAgIGxvY2tmaWxlPQotICAgIGZpCi0KLSAgICAjIExvY2sgdGhpcyBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IGlzIG5lZWRlZAotICAgICMgV2UgdXNlIHRoaXMgc2NyaXB0IGZpbGUgdG8gbWFrZSB0aGUgbGluaywgaXQgYXZvaWRzIGNyZWF0aW5nIGEgbmV3IGZpbGUKLSAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB5ZXM7IHRoZW4KLSAgICAgIHVudGlsICRvcHRfZHJ5X3J1biB8fCBsbiAiJHByb2dwYXRoIiAiJGxvY2tmaWxlIiAyPi9kZXYvbnVsbDsgZG8KLQlmdW5jX2VjaG8gIldhaXRpbmcgZm9yICRsb2NrZmlsZSB0byBiZSByZW1vdmVkIgotCXNsZWVwIDIKLSAgICAgIGRvbmUKLSAgICBlbGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm47IHRoZW4KLSAgICAgIGlmIHRlc3QgLWYgIiRsb2NrZmlsZSI7IHRoZW4KLQkkRUNITyAiXAotKioqIEVSUk9SLCAkbG9ja2ZpbGUgZXhpc3RzIGFuZCBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLSAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRvdXRwdXRfb2JqIgotICAgICAgJEVDSE8gIiRzcmNmaWxlIiA+ICIkbG9ja2ZpbGUiCi0gICAgZmkKLQotICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3QKLSAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkbG9ja2ZpbGUiCi0gICAgdHJhcCAnJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkRVhJVF9GQUlMVVJFJyAxIDIgMTUKLQotICAgIGlmIHRlc3QgLW4gIiRmaXhfc3JjZmlsZV9wYXRoIjsgdGhlbgotICAgICAgZXZhbCBzcmNmaWxlPVwiJGZpeF9zcmNmaWxlX3BhdGhcIgotICAgIGZpCi0gICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHNyY2ZpbGUiCi0gICAgcXNyY2ZpbGU9JGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0Ci0KLSAgICAjIE9ubHkgYnVpbGQgYSBQSUMgb2JqZWN0IGlmIHdlIGFyZSBidWlsZGluZyBsaWJ0b29sIGxpYnJhcmllcy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgIyBXaXRob3V0IHRoaXMgYXNzaWdubWVudCwgYmFzZV9jb21waWxlIGdldHMgZW1wdGllZC4KLSAgICAgIGZic2RfaGlkZW91c19zaF9idWc9JGJhc2VfY29tcGlsZQotCi0gICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IG5vOyB0aGVuCi0JY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUgJHBpY19mbGFnIgotICAgICAgZWxzZQotCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKLQljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSIKLSAgICAgIGZpCi0KLSAgICAgIGZ1bmNfbWtkaXJfcCAiJHhkaXIkb2JqZGlyIgotCi0gICAgICBpZiB0ZXN0IC16ICIkb3V0cHV0X29iaiI7IHRoZW4KLQkjIFBsYWNlIFBJQyBvYmplY3RzIGluICRvYmpkaXIKLQljb21tYW5kPSIkY29tbWFuZCAtbyAkbG9iaiIKLSAgICAgIGZpCi0KLSAgICAgIGZ1bmNfc2hvd19ldmFsX2xvY2FsZSAiJGNvbW1hbmQiCVwKLSAgICAgICAgICAndGVzdCAtbiAiJG91dHB1dF9vYmoiICYmICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkRVhJVF9GQUlMVVJFJwotCi0gICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuICYmCi0JIHRlc3QgIlhgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAiICE9ICJYJHNyY2ZpbGUiOyB0aGVuCi0JJEVDSE8gIlwKLSoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgotYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCi0KLWJ1dCBpdCBzaG91bGQgY29udGFpbjoKLSRzcmNmaWxlCi0KLVRoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKLXlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKLXJlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKLWF2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCi1jb21waWxlci4iCi0KLQkkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0Ci0JZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICBmaQotCi0gICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0IGlmIG5lZWRlZCwgdGhlbiBnbyBvbiB0byBjb21waWxlIHRoZSBuZXh0IG9uZQotICAgICAgaWYgdGVzdCAtbiAiJG91dHB1dF9vYmoiICYmIHRlc3QgIlgkb3V0cHV0X29iaiIgIT0gIlgkbG9iaiI7IHRoZW4KLQlmdW5jX3Nob3dfZXZhbCAnJE1WICIkb3V0cHV0X29iaiIgIiRsb2JqIicgXAotCSAgJ2Vycm9yPSQ/OyAkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRlcnJvcicKLSAgICAgIGZpCi0KLSAgICAgICMgQWxsb3cgZXJyb3IgbWVzc2FnZXMgb25seSBmcm9tIHRoZSBmaXJzdCBjb21waWxhdGlvbi4KLSAgICAgIGlmIHRlc3QgIiRzdXBwcmVzc19vcHQiID0geWVzOyB0aGVuCi0Jc3VwcHJlc3Nfb3V0cHV0PScgPi9kZXYvbnVsbCAyPiYxJwotICAgICAgZmkKLSAgICBmaQotCi0gICAgIyBPbmx5IGJ1aWxkIGEgcG9zaXRpb24tZGVwZW5kZW50IG9iamVjdCBpZiB3ZSBidWlsZCBvbGQgbGlicmFyaWVzLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgIT0geWVzOyB0aGVuCi0JIyBEb24ndCBidWlsZCBQSUMgY29kZQotCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlJHBpZV9mbGFnIgotICAgICAgZWxzZQotCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlICRwaWNfZmxhZyIKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IHllczsgdGhlbgotCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRvYmoiCi0gICAgICBmaQotCi0gICAgICAjIFN1cHByZXNzIGNvbXBpbGVyIG91dHB1dCBpZiB3ZSBhbHJlYWR5IGRpZCBhIFBJQyBjb21waWxhdGlvbi4KLSAgICAgIGNvbW1hbmQ9IiRjb21tYW5kJHN1cHByZXNzX291dHB1dCIKLSAgICAgIGZ1bmNfc2hvd19ldmFsX2xvY2FsZSAiJGNvbW1hbmQiIFwKLSAgICAgICAgJyRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRScKLQotICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgotCSB0ZXN0ICJYYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSAiWCRzcmNmaWxlIjsgdGhlbgotCSRFQ0hPICJcCi0qKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1idXQgaXQgc2hvdWxkIGNvbnRhaW46Ci0kc3JjZmlsZQotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLQotICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQKLSAgICAgIGlmIHRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiB0ZXN0ICJYJG91dHB1dF9vYmoiICE9ICJYJG9iaiI7IHRoZW4KLQlmdW5jX3Nob3dfZXZhbCAnJE1WICIkb3V0cHV0X29iaiIgIiRvYmoiJyBcCi0JICAnZXJyb3I9JD87ICRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJGVycm9yJwotICAgICAgZmkKLSAgICBmaQotCi0gICAgJG9wdF9kcnlfcnVuIHx8IHsKLSAgICAgIGZ1bmNfd3JpdGVfbGlidG9vbF9vYmplY3QgIiRsaWJvYmoiICIkb2JqZGlyLyRvYmpuYW1lIiAiJG9iam5hbWUiCi0KLSAgICAgICMgVW5sb2NrIHRoZSBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IHdhcyBsb2NrZWQKLSAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotCXJlbW92ZWxpc3Q9JGxvY2tmaWxlCi0gICAgICAgICRSTSAiJGxvY2tmaWxlIgotICAgICAgZmkKLSAgICB9Ci0KLSAgICBleGl0ICRFWElUX1NVQ0NFU1MKLX0KLQotJG9wdF9oZWxwIHx8IHsKLSAgdGVzdCAiJG1vZGUiID0gY29tcGlsZSAmJiBmdW5jX21vZGVfY29tcGlsZSAkezErIiRAIn0KLX0KLQotZnVuY19tb2RlX2hlbHAgKCkKLXsKLSAgICAjIFdlIG5lZWQgdG8gZGlzcGxheSBoZWxwIGZvciBlYWNoIG9mIHRoZSBtb2Rlcy4KLSAgICBjYXNlICRtb2RlIGluCi0gICAgICAiIikKLSAgICAgICAgIyBHZW5lcmljIGhlbHAgaXMgZXh0cmFjdGVkIGZyb20gdGhlIHVzYWdlIGNvbW1lbnRzCi0gICAgICAgICMgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZmlsZS4KLSAgICAgICAgZnVuY19oZWxwCi0gICAgICAgIDs7Ci0KLSAgICAgIGNsZWFuKQotICAgICAgICAkRUNITyBcCi0iVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y2xlYW4gUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgotCi1SZW1vdmUgZmlsZXMgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5LgotCi1STSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKLSh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKLXRvIFJNLgotCi1JZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBvYmplY3Qgb3IgcHJvZ3JhbSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkCi13aXRoIGl0IGFyZSBkZWxldGVkLiBPdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCi0gICAgICAgIDs7Ci0KLSAgICAgIGNvbXBpbGUpCi0gICAgICAkRUNITyBcCi0iVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y29tcGlsZSBDT01QSUxFLUNPTU1BTkQuLi4gU09VUkNFRklMRQotCi1Db21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgbGlicmFyeSBvYmplY3QuCi0KLVRoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgotCi0gIC1vIE9VVFBVVC1GSUxFICAgIHNldCB0aGUgb3V0cHV0IGZpbGUgbmFtZSB0byBPVVRQVVQtRklMRQotICAtbm8tc3VwcHJlc3MgICAgICBkbyBub3Qgc3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGZvciBtdWx0aXBsZSBwYXNzZXMKLSAgLXByZWZlci1waWMgICAgICAgdHJ5IHRvIGJ1aWxkIFBJQyBvYmplY3RzIG9ubHkKLSAgLXByZWZlci1ub24tcGljICAgdHJ5IHRvIGJ1aWxkIG5vbi1QSUMgb2JqZWN0cyBvbmx5Ci0gIC1zaGFyZWQgICAgICAgICAgIGRvIG5vdCBidWlsZCBhIFxgLm8nIGZpbGUgc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nCi0gIC1zdGF0aWMgICAgICAgICAgIG9ubHkgYnVpbGQgYSBcYC5vJyBmaWxlIHN1aXRhYmxlIGZvciBzdGF0aWMgbGlua2luZwotICAtV2MsRkxBRyAgICAgICAgICBwYXNzIEZMQUcgZGlyZWN0bHkgdG8gdGhlIGNvbXBpbGVyCi0KLUNPTVBJTEUtQ09NTUFORCBpcyBhIGNvbW1hbmQgdG8gYmUgdXNlZCBpbiBjcmVhdGluZyBhIFxgc3RhbmRhcmQnIG9iamVjdCBmaWxlCi1mcm9tIHRoZSBnaXZlbiBTT1VSQ0VGSUxFLgotCi1UaGUgb3V0cHV0IGZpbGUgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHJlbW92aW5nIHRoZSBkaXJlY3RvcnkgY29tcG9uZW50IGZyb20KLVNPVVJDRUZJTEUsIHRoZW4gc3Vic3RpdHV0aW5nIHRoZSBDIHNvdXJjZSBjb2RlIHN1ZmZpeCBcYC5jJyB3aXRoIHRoZQotbGlicmFyeSBvYmplY3Qgc3VmZml4LCBcYC5sbycuIgotICAgICAgICA7OwotCi0gICAgICBleGVjdXRlKQotICAgICAgICAkRUNITyBcCi0iVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZXhlY3V0ZSBDT01NQU5EIFtBUkdTXS4uLgotCi1BdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbS4KLQotVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6Ci0KLSAgLWRsb3BlbiBGSUxFICAgICAgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBGSUxFIHRvIHRoZSBsaWJyYXJ5IHBhdGgKLQotVGhpcyBtb2RlIHNldHMgdGhlIGxpYnJhcnkgcGF0aCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhY2NvcmRpbmcgdG8gXGAtZGxvcGVuJwotZmxhZ3MuCi0KLUlmIGFueSBvZiB0aGUgQVJHUyBhcmUgbGlidG9vbCBleGVjdXRhYmxlIHdyYXBwZXJzLCB0aGVuIHRoZXkgYXJlIHRyYW5zbGF0ZWQKLWludG8gdGhlaXIgY29ycmVzcG9uZGluZyB1bmluc3RhbGxlZCBiaW5hcnksIGFuZCBhbnkgb2YgdGhlaXIgcmVxdWlyZWQgbGlicmFyeQotZGlyZWN0b3JpZXMgYXJlIGFkZGVkIHRvIHRoZSBsaWJyYXJ5IHBhdGguCi0KLVRoZW4sIENPTU1BTkQgaXMgZXhlY3V0ZWQsIHdpdGggQVJHUyBhcyBhcmd1bWVudHMuIgotICAgICAgICA7OwotCi0gICAgICBmaW5pc2gpCi0gICAgICAgICRFQ0hPIFwKLSJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1maW5pc2ggW0xJQkRJUl0uLi4KLQotQ29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcy4KLQotRWFjaCBMSUJESVIgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBsaWJ0b29sIGxpYnJhcmllcy4KLQotVGhlIGNvbW1hbmRzIHRoYXQgdGhpcyBtb2RlIGV4ZWN1dGVzIG1heSByZXF1aXJlIHN1cGVydXNlciBwcml2aWxlZ2VzLiAgVXNlCi10aGUgXGAtLWRyeS1ydW4nIG9wdGlvbiBpZiB5b3UganVzdCB3YW50IHRvIHNlZSB3aGF0IHdvdWxkIGJlIGV4ZWN1dGVkLiIKLSAgICAgICAgOzsKLQotICAgICAgaW5zdGFsbCkKLSAgICAgICAgJEVDSE8gXAotIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWluc3RhbGwgSU5TVEFMTC1DT01NQU5ELi4uCi0KLUluc3RhbGwgZXhlY3V0YWJsZXMgb3IgbGlicmFyaWVzLgotCi1JTlNUQUxMLUNPTU1BTkQgaXMgdGhlIGluc3RhbGxhdGlvbiBjb21tYW5kLiAgVGhlIGZpcnN0IGNvbXBvbmVudCBzaG91bGQgYmUKLWVpdGhlciB0aGUgXGBpbnN0YWxsJyBvciBcYGNwJyBwcm9ncmFtLgotCi1UaGUgZm9sbG93aW5nIGNvbXBvbmVudHMgb2YgSU5TVEFMTC1DT01NQU5EIGFyZSB0cmVhdGVkIHNwZWNpYWxseToKLQotICAtaW5zdC1wcmVmaXgtZGlyIFBSRUZJWC1ESVIgIFVzZSBQUkVGSVgtRElSIGFzIGEgc3RhZ2luZyBhcmVhIGZvciBpbnN0YWxsYXRpb24KLQotVGhlIHJlc3Qgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGludGVycHJldGVkIGFzIGFyZ3VtZW50cyB0byB0aGF0IGNvbW1hbmQgKG9ubHkKLUJTRC1jb21wYXRpYmxlIGluc3RhbGwgb3B0aW9ucyBhcmUgcmVjb2duaXplZCkuIgotICAgICAgICA7OwotCi0gICAgICBsaW5rKQotICAgICAgICAkRUNITyBcCi0iVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9bGluayBMSU5LLUNPTU1BTkQuLi4KLQotTGluayBvYmplY3QgZmlsZXMgb3IgbGlicmFyaWVzIHRvZ2V0aGVyIHRvIGZvcm0gYW5vdGhlciBsaWJyYXJ5LCBvciB0bwotY3JlYXRlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4KLQotTElOSy1DT01NQU5EIGlzIGEgY29tbWFuZCB1c2luZyB0aGUgQyBjb21waWxlciB0aGF0IHlvdSB3b3VsZCB1c2UgdG8gY3JlYXRlCi1hIHByb2dyYW0gZnJvbSBzZXZlcmFsIG9iamVjdCBmaWxlcy4KLQotVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIG9mIExJTkstQ09NTUFORCBhcmUgdHJlYXRlZCBzcGVjaWFsbHk6Ci0KLSAgLWFsbC1zdGF0aWMgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgYXQgYWxsCi0gIC1hdm9pZC12ZXJzaW9uICAgIGRvIG5vdCBhZGQgYSB2ZXJzaW9uIHN1ZmZpeCBpZiBwb3NzaWJsZQotICAtYmluZGlyIEJJTkRJUiAgICBzcGVjaWZ5IHBhdGggdG8gYmluYXJpZXMgZGlyZWN0b3J5IChmb3Igc3lzdGVtcyB3aGVyZQotICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMgbXVzdCBiZSBmb3VuZCBpbiB0aGUgUEFUSCBzZXR0aW5nIGF0IHJ1bnRpbWUpCi0gIC1kbG9wZW4gRklMRSAgICAgIFxgLWRscHJlb3BlbicgRklMRSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQgYXQgcnVudGltZQotICAtZGxwcmVvcGVuIEZJTEUgICBsaW5rIGluIEZJTEUgYW5kIGFkZCBpdHMgc3ltYm9scyB0byBsdF9wcmVsb2FkZWRfc3ltYm9scwotICAtZXhwb3J0LWR5bmFtaWMgICBhbGxvdyBzeW1ib2xzIGZyb20gT1VUUFVULUZJTEUgdG8gYmUgcmVzb2x2ZWQgd2l0aCBkbHN5bSgzKQotICAtZXhwb3J0LXN5bWJvbHMgU1lNRklMRQotICAgICAgICAgICAgICAgICAgICB0cnkgdG8gZXhwb3J0IG9ubHkgdGhlIHN5bWJvbHMgbGlzdGVkIGluIFNZTUZJTEUKLSAgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4IFJFR0VYCi0gICAgICAgICAgICAgICAgICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBtYXRjaGluZyBSRUdFWAotICAtTExJQkRJUiAgICAgICAgICBzZWFyY2ggTElCRElSIGZvciByZXF1aXJlZCBpbnN0YWxsZWQgbGlicmFyaWVzCi0gIC1sTkFNRSAgICAgICAgICAgIE9VVFBVVC1GSUxFIHJlcXVpcmVzIHRoZSBpbnN0YWxsZWQgbGlicmFyeSBsaWJOQU1FCi0gIC1tb2R1bGUgICAgICAgICAgIGJ1aWxkIGEgbGlicmFyeSB0aGF0IGNhbiBkbG9wZW5lZAotICAtbm8tZmFzdC1pbnN0YWxsICBkaXNhYmxlIHRoZSBmYXN0LWluc3RhbGwgbW9kZQotICAtbm8taW5zdGFsbCAgICAgICBsaW5rIGEgbm90LWluc3RhbGxhYmxlIGV4ZWN1dGFibGUKLSAgLW5vLXVuZGVmaW5lZCAgICAgZGVjbGFyZSB0aGF0IGEgbGlicmFyeSBkb2VzIG5vdCByZWZlciB0byBleHRlcm5hbCBzeW1ib2xzCi0gIC1vIE9VVFBVVC1GSUxFICAgIGNyZWF0ZSBPVVRQVVQtRklMRSBmcm9tIHRoZSBzcGVjaWZpZWQgb2JqZWN0cwotICAtb2JqZWN0bGlzdCBGSUxFICBVc2UgYSBsaXN0IG9mIG9iamVjdCBmaWxlcyBmb3VuZCBpbiBGSUxFIHRvIHNwZWNpZnkgb2JqZWN0cwotICAtcHJlY2lvdXMtZmlsZXMtcmVnZXggUkVHRVgKLSAgICAgICAgICAgICAgICAgICAgZG9uJ3QgcmVtb3ZlIG91dHB1dCBmaWxlcyBtYXRjaGluZyBSRUdFWAotICAtcmVsZWFzZSBSRUxFQVNFICBzcGVjaWZ5IHBhY2thZ2UgcmVsZWFzZSBpbmZvcm1hdGlvbgotICAtcnBhdGggTElCRElSICAgICB0aGUgY3JlYXRlZCBsaWJyYXJ5IHdpbGwgZXZlbnR1YWxseSBiZSBpbnN0YWxsZWQgaW4gTElCRElSCi0gIC1SWyBdTElCRElSICAgICAgIGFkZCBMSUJESVIgdG8gdGhlIHJ1bnRpbWUgcGF0aCBvZiBwcm9ncmFtcyBhbmQgbGlicmFyaWVzCi0gIC1zaGFyZWQgICAgICAgICAgIG9ubHkgZG8gZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCi0gIC1zaHJleHQgU1VGRklYICAgIG92ZXJyaWRlIHRoZSBzdGFuZGFyZCBzaGFyZWQgbGlicmFyeSBmaWxlIGV4dGVuc2lvbgotICAtc3RhdGljICAgICAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBvZiB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcwotICAtc3RhdGljLWxpYnRvb2wtbGlicwotICAgICAgICAgICAgICAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBvZiBsaWJ0b29sIGxpYnJhcmllcwotICAtdmVyc2lvbi1pbmZvIENVUlJFTlRbOlJFVklTSU9OWzpBR0VdXQotICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IGxpYnJhcnkgdmVyc2lvbiBpbmZvIFtlYWNoIHZhcmlhYmxlIGRlZmF1bHRzIHRvIDBdCi0gIC13ZWFrIExJQk5BTUUgICAgIGRlY2xhcmUgdGhhdCB0aGUgdGFyZ2V0IHByb3ZpZGVzIHRoZSBMSUJOQU1FIGludGVyZmFjZQotICAtV2MsRkxBRwotICAtWGNvbXBpbGVyIEZMQUcgICBwYXNzIGxpbmtlci1zcGVjaWZpYyBGTEFHIGRpcmVjdGx5IHRvIHRoZSBjb21waWxlcgotICAtV2wsRkxBRwotICAtWGxpbmtlciBGTEFHICAgICBwYXNzIGxpbmtlci1zcGVjaWZpYyBGTEFHIGRpcmVjdGx5IHRvIHRoZSBsaW5rZXIKLSAgLVhDQ2xpbmtlciBGTEFHICAgcGFzcyBsaW5rLXNwZWNpZmljIEZMQUcgdG8gdGhlIGNvbXBpbGVyIGRyaXZlciAoQ0MpCi0KLUFsbCBvdGhlciBvcHRpb25zIChhcmd1bWVudHMgYmVnaW5uaW5nIHdpdGggXGAtJykgYXJlIGlnbm9yZWQuCi0KLUV2ZXJ5IG90aGVyIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBmaWxlbmFtZS4gIEZpbGVzIGVuZGluZyBpbiBcYC5sYScgYXJlCi10cmVhdGVkIGFzIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzLCBvdGhlciBmaWxlcyBhcmUgc3RhbmRhcmQgb3IgbGlicmFyeQotb2JqZWN0IGZpbGVzLgotCi1JZiB0aGUgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sYScsIHRoZW4gYSBsaWJ0b29sIGxpYnJhcnkgaXMgY3JlYXRlZCwKLW9ubHkgbGlicmFyeSBvYmplY3RzIChcYC5sbycgZmlsZXMpIG1heSBiZSBzcGVjaWZpZWQsIGFuZCBcYC1ycGF0aCcgaXMKLXJlcXVpcmVkLCBleGNlcHQgd2hlbiBjcmVhdGluZyBhIGNvbnZlbmllbmNlIGxpYnJhcnkuCi0KLUlmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAuYScgb3IgXGAubGliJywgdGhlbiBhIHN0YW5kYXJkIGxpYnJhcnkgaXMgY3JlYXRlZAotdXNpbmcgXGBhcicgYW5kIFxgcmFubGliJywgb3Igb24gV2luZG93cyB1c2luZyBcYGxpYicuCi0KLUlmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubG8nIG9yIFxgLiR7b2JqZXh0fScsIHRoZW4gYSByZWxvYWRhYmxlIG9iamVjdCBmaWxlCi1pcyBjcmVhdGVkLCBvdGhlcndpc2UgYW4gZXhlY3V0YWJsZSBwcm9ncmFtIGlzIGNyZWF0ZWQuIgotICAgICAgICA7OwotCi0gICAgICB1bmluc3RhbGwpCi0gICAgICAgICRFQ0hPIFwKLSJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT11bmluc3RhbGwgUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgotCi1SZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQotUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCi0odHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCi10byBSTS4KLQotSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggaXQgYXJlIGRlbGV0ZWQuCi1PdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCi0gICAgICAgIDs7Ci0KLSAgICAgICopCi0gICAgICAgIGZ1bmNfZmF0YWxfaGVscCAiaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIKLSAgICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBlY2hvCi0gICAgJEVDSE8gIlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzLiIKLX0KLQotIyBOb3cgdGhhdCB3ZSd2ZSBjb2xsZWN0ZWQgYSBwb3NzaWJsZSAtLW1vZGUgYXJnLCBzaG93IGhlbHAgaWYgbmVjZXNzYXJ5Ci1pZiAkb3B0X2hlbHA7IHRoZW4KLSAgaWYgdGVzdCAiJG9wdF9oZWxwIiA9IDo7IHRoZW4KLSAgICBmdW5jX21vZGVfaGVscAotICBlbHNlCi0gICAgewotICAgICAgZnVuY19oZWxwIG5vZXhpdAotICAgICAgZm9yIG1vZGUgaW4gY29tcGlsZSBsaW5rIGV4ZWN1dGUgaW5zdGFsbCBmaW5pc2ggdW5pbnN0YWxsIGNsZWFuOyBkbwotCWZ1bmNfbW9kZV9oZWxwCi0gICAgICBkb25lCi0gICAgfSB8IHNlZCAtbiAnMXA7IDIsJHMvXlVzYWdlOi8gIG9yOiAvcCcKLSAgICB7Ci0gICAgICBmdW5jX2hlbHAgbm9leGl0Ci0gICAgICBmb3IgbW9kZSBpbiBjb21waWxlIGxpbmsgZXhlY3V0ZSBpbnN0YWxsIGZpbmlzaCB1bmluc3RhbGwgY2xlYW47IGRvCi0JZWNobwotCWZ1bmNfbW9kZV9oZWxwCi0gICAgICBkb25lCi0gICAgfSB8Ci0gICAgc2VkICcxZAotICAgICAgL15XaGVuIHJlcG9ydGluZy8sL15SZXBvcnQvewotCUgKLQlkCi0gICAgICB9Ci0gICAgICAkeAotICAgICAgL2luZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzL2QKLSAgICAgIC9tb3JlIGRldGFpbGVkIC4qTU9ERS9kCi0gICAgICBzL15Vc2FnZTouKi0tbW9kZT1cKFteIF0qXCkgLiovRGVzY3JpcHRpb24gb2YgXDEgbW9kZTovJwotICBmaQotICBleGl0ICQ/Ci1maQotCi0KLSMgZnVuY19tb2RlX2V4ZWN1dGUgYXJnLi4uCi1mdW5jX21vZGVfZXhlY3V0ZSAoKQotewotICAgICRvcHRfZGVidWcKLSAgICAjIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgY29tbWFuZCBuYW1lLgotICAgIGNtZD0iJG5vbm9wdCIKLSAgICB0ZXN0IC16ICIkY21kIiAmJiBcCi0gICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBDT01NQU5EIgotCi0gICAgIyBIYW5kbGUgLWRsb3BlbiBmbGFncyBpbW1lZGlhdGVseS4KLSAgICBmb3IgZmlsZSBpbiAkZXhlY3V0ZV9kbGZpbGVzOyBkbwotICAgICAgdGVzdCAtZiAiJGZpbGUiIFwKLQl8fCBmdW5jX2ZhdGFsX2hlbHAgIlxgJGZpbGUnIGlzIG5vdCBhIGZpbGUiCi0KLSAgICAgIGRpcj0KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICoubGEpCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlmdW5jX2xhbGliX3Vuc2FmZV9wICIkZmlsZSIgXAotCSAgfHwgZnVuY19mYXRhbF9oZWxwICJcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKLQotCSMgUmVhZCB0aGUgbGlidG9vbCBsaWJyYXJ5LgotCWRsbmFtZT0KLQlsaWJyYXJ5X25hbWVzPQotCWZ1bmNfc291cmNlICIkZmlsZSIKLQotCSMgU2tpcCB0aGlzIGxpYnJhcnkgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkLgotCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCi0JICAjIFdhcm4gaWYgaXQgd2FzIGEgc2hhcmVkIGxpYnJhcnkuCi0JICB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYgXAotCSAgICBmdW5jX3dhcm5pbmcgIlxgJGZpbGUnIHdhcyBub3QgbGlua2VkIHdpdGggXGAtZXhwb3J0LWR5bmFtaWMnIgotCSAgY29udGludWUKLQlmaQotCi0JZnVuY19kaXJuYW1lICIkZmlsZSIgIiIgIi4iCi0JZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLQotCWlmIHRlc3QgLWYgIiRkaXIvJG9iamRpci8kZGxuYW1lIjsgdGhlbgotCSAgZGlyPSIkZGlyLyRvYmpkaXIiCi0JZWxzZQotCSAgaWYgdGVzdCAhIC1mICIkZGlyLyRkbG5hbWUiOyB0aGVuCi0JICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIFxgJGRsbmFtZScgaW4gXGAkZGlyJyBvciBcYCRkaXIvJG9iamRpciciCi0JICBmaQotCWZpCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEp1c3QgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgLmxvIGZpbGUuCi0JZnVuY19kaXJuYW1lICIkZmlsZSIgIiIgIi4iCi0JZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLQk7OwotCi0gICAgICAqKQotCWZ1bmNfd2FybmluZyAiXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBub24tbGlidG9vbCBsaWJyYXJpZXMgYW5kIG9iamVjdHMiCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEdldCB0aGUgYWJzb2x1dGUgcGF0aG5hbWUuCi0gICAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0gICAgICB0ZXN0IC1uICIkYWJzZGlyIiAmJiBkaXI9IiRhYnNkaXIiCi0KLSAgICAgICMgTm93IGFkZCB0aGUgZGlyZWN0b3J5IHRvIHNobGlicGF0aF92YXIuCi0gICAgICBpZiBldmFsICJ0ZXN0IC16IFwiXCQkc2hsaWJwYXRoX3ZhclwiIjsgdGhlbgotCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXJcIiIKLSAgICAgIGVsc2UKLQlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyOlwkJHNobGlicGF0aF92YXJcIiIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCBzaGxpYnBhdGhfdmFyCi0gICAgIyByYXRoZXIgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfZXhlY3V0ZV9tYWdpYz0iJG1hZ2ljIgotCi0gICAgIyBDaGVjayBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBhIHdyYXBwZXIgc2NyaXB0LgotICAgIGFyZ3M9Ci0gICAgZm9yIGZpbGUKLSAgICBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgLSogfCAqLmxhIHwgKi5sbyApIDs7Ci0gICAgICAqKQotCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KLQlpZiBmdW5jX2x0d3JhcHBlcl9zY3JpcHRfcCAiJGZpbGUiOyB0aGVuCi0JICBmdW5jX3NvdXJjZSAiJGZpbGUiCi0JICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgotCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCi0JZWxpZiBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiRmaWxlIjsgdGhlbgotCSAgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZSAiJGZpbGUiCi0JICBmdW5jX3NvdXJjZSAiJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0IgotCSAgIyBUcmFuc2Zvcm0gYXJnIHRvIHdyYXBwZWQgbmFtZS4KLQkgIGZpbGU9IiRwcm9nZGlyLyRwcm9ncmFtIgotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgICMgUXVvdGUgYXJndW1lbnRzICh0byBwcmVzZXJ2ZSBzaGVsbCBtZXRhY2hhcmFjdGVycykuCi0gICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkZmlsZSIKLSAgICAgIGFyZ3M9IiRhcmdzICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0ICJYJG9wdF9kcnlfcnVuIiA9IFhmYWxzZTsgdGhlbgotICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0JIyBFeHBvcnQgdGhlIHNobGlicGF0aF92YXIuCi0JZXZhbCAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgotICAgICAgZmkKLQotICAgICAgIyBSZXN0b3JlIHNhdmVkIGVudmlyb25tZW50IHZhcmlhYmxlcwotICAgICAgZm9yIGx0X3ZhciBpbiBMQU5HIExBTkdVQUdFIExDX0FMTCBMQ19DVFlQRSBMQ19DT0xMQVRFIExDX01FU1NBR0VTCi0gICAgICBkbwotCWV2YWwgImlmIHRlc3QgXCJcJHtzYXZlXyRsdF92YXIrc2V0fVwiID0gc2V0OyB0aGVuCi0gICAgICAgICAgICAgICAgJGx0X3Zhcj1cJHNhdmVfJGx0X3ZhcjsgZXhwb3J0ICRsdF92YXIKLQkgICAgICBlbHNlCi0JCSRsdF91bnNldCAkbHRfdmFyCi0JICAgICAgZmkiCi0gICAgICBkb25lCi0KLSAgICAgICMgTm93IHByZXBhcmUgdG8gYWN0dWFsbHkgZXhlYyB0aGUgY29tbWFuZC4KLSAgICAgIGV4ZWNfY21kPSJcJGNtZCRhcmdzIgotICAgIGVsc2UKLSAgICAgICMgRGlzcGxheSB3aGF0IHdvdWxkIGJlIGRvbmUuCi0gICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLQlldmFsICJcJEVDSE8gXCJcJHNobGlicGF0aF92YXI9XCQkc2hsaWJwYXRoX3ZhclwiIgotCWVjaG8gImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKLSAgICAgIGZpCi0gICAgICAkRUNITyAiJGNtZCRhcmdzIgotICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgZmkKLX0KLQotdGVzdCAiJG1vZGUiID0gZXhlY3V0ZSAmJiBmdW5jX21vZGVfZXhlY3V0ZSAkezErIiRAIn0KLQotCi0jIGZ1bmNfbW9kZV9maW5pc2ggYXJnLi4uCi1mdW5jX21vZGVfZmluaXNoICgpCi17Ci0gICAgJG9wdF9kZWJ1ZwotICAgIGxpYmRpcnM9IiRub25vcHQiCi0gICAgYWRtaW5jbWRzPQotCi0gICAgaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzJGZpbmlzaF9ldmFsIiAmJiB0ZXN0IC1uICIkbGliZGlycyI7IHRoZW4KLSAgICAgIGZvciBkaXIKLSAgICAgIGRvCi0JbGliZGlycz0iJGxpYmRpcnMgJGRpciIKLSAgICAgIGRvbmUKLQotICAgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KLQlpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMiOyB0aGVuCi0JICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgZmluaXNoIGNvbW1hbmRzLgotCSAgZnVuY19leGVjdXRlX2NtZHMgIiRmaW5pc2hfY21kcyIgJ2FkbWluY21kcz0iJGFkbWluY21kcwotJyIkY21kIiciJwotCWZpCi0JaWYgdGVzdCAtbiAiJGZpbmlzaF9ldmFsIjsgdGhlbgotCSAgIyBEbyB0aGUgc2luZ2xlIGZpbmlzaF9ldmFsLgotCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9ldmFsXCIKLQkgICRvcHRfZHJ5X3J1biB8fCBldmFsICIkY21kcyIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCi0gICAgICAgJGNtZHMiCi0JZmkKLSAgICAgIGRvbmUKLSAgICBmaQotCi0gICAgIyBFeGl0IGhlcmUgaWYgdGhleSB3YW50ZWQgc2lsZW50IG1vZGUuCi0gICAgJG9wdF9zaWxlbnQgJiYgZXhpdCAkRVhJVF9TVUNDRVNTCi0KLSAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotICAgIGVjaG8gIkxpYnJhcmllcyBoYXZlIGJlZW4gaW5zdGFsbGVkIGluOiIKLSAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbwotICAgICAgJEVDSE8gIiAgICRsaWJkaXIiCi0gICAgZG9uZQotICAgIGVjaG8KLSAgICBlY2hvICJJZiB5b3UgZXZlciBoYXBwZW4gdG8gd2FudCB0byBsaW5rIGFnYWluc3QgaW5zdGFsbGVkIGxpYnJhcmllcyIKLSAgICBlY2hvICJpbiBhIGdpdmVuIGRpcmVjdG9yeSwgTElCRElSLCB5b3UgbXVzdCBlaXRoZXIgdXNlIGxpYnRvb2wsIGFuZCIKLSAgICBlY2hvICJzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBsaWJyYXJ5LCBvciB1c2UgdGhlIFxgLUxMSUJESVInIgotICAgIGVjaG8gImZsYWcgZHVyaW5nIGxpbmtpbmcgYW5kIGRvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOiIKLSAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLSAgICAgIGVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkc2hsaWJwYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCi0gICAgICBlY2hvICIgICAgIGR1cmluZyBleGVjdXRpb24iCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0gICAgICBlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHJ1bnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKLSAgICAgIGVjaG8gIiAgICAgZHVyaW5nIGxpbmtpbmciCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLSAgICAgIGxpYmRpcj1MSUJESVIKLSAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQotICAgICAgJEVDSE8gIiAgIC0gdXNlIHRoZSBcYCRmbGFnJyBsaW5rZXIgZmxhZyIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRhZG1pbmNtZHMiOyB0aGVuCi0gICAgICAkRUNITyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgcnVuIHRoZXNlIGNvbW1hbmRzOiRhZG1pbmNtZHMiCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgotICAgICAgZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgYWRkIExJQkRJUiB0byBcYC9ldGMvbGQuc28uY29uZiciCi0gICAgZmkKLSAgICBlY2hvCi0KLSAgICBlY2hvICJTZWUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBhYm91dCBzaGFyZWQgbGlicmFyaWVzIGZvciIKLSAgICBjYXNlICRob3N0IGluCi0gICAgICBzb2xhcmlzMi5bNjc4OV18c29sYXJpczIuMVswLTldKQotICAgICAgICBlY2hvICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSwgY3JsZSgxKSBhbmQgbGQuc28oOCkgbWFudWFsIgotCWVjaG8gInBhZ2VzLiIKLQk7OwotICAgICAgKikKLSAgICAgICAgZWNobyAibW9yZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgbGQoMSkgYW5kIGxkLnNvKDgpIG1hbnVhbCBwYWdlcy4iCi0gICAgICAgIDs7Ci0gICAgZXNhYwotICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0gICAgZXhpdCAkRVhJVF9TVUNDRVNTCi19Ci0KLXRlc3QgIiRtb2RlIiA9IGZpbmlzaCAmJiBmdW5jX21vZGVfZmluaXNoICR7MSsiJEAifQotCi0KLSMgZnVuY19tb2RlX2luc3RhbGwgYXJnLi4uCi1mdW5jX21vZGVfaW5zdGFsbCAoKQotewotICAgICRvcHRfZGVidWcKLSAgICAjIFRoZXJlIG1heSBiZSBhbiBvcHRpb25hbCBzaCgxKSBhcmd1bWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICAgIyBpbnN0YWxsX3Byb2cgKGVzcGVjaWFsbHkgb24gV2luZG93cyBOVCkuCi0gICAgaWYgdGVzdCAiJG5vbm9wdCIgPSAiJFNIRUxMIiB8fCB0ZXN0ICIkbm9ub3B0IiA9IC9iaW4vc2ggfHwKLSAgICAgICAjIEFsbG93IHRoZSB1c2Ugb2YgR05VIHNodG9vbCdzIGluc3RhbGwgY29tbWFuZC4KLSAgICAgICBjYXNlICRub25vcHQgaW4gKnNodG9vbCopIDo7OyAqKSBmYWxzZTs7IGVzYWM7IHRoZW4KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KLSAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRub25vcHQiCi0gICAgICBpbnN0YWxsX3Byb2c9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCAiCi0gICAgICBhcmc9JDEKLSAgICAgIHNoaWZ0Ci0gICAgZWxzZQotICAgICAgaW5zdGFsbF9wcm9nPQotICAgICAgYXJnPSRub25vcHQKLSAgICBmaQotCi0gICAgIyBUaGUgcmVhbCBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9ncmFtLgotICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KLSAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgotICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLSAgICBpbnN0YWxsX3NoYXJlZF9wcm9nPSRpbnN0YWxsX3Byb2cKLSAgICBjYXNlICIgJGluc3RhbGxfcHJvZyAiIGluCi0gICAgICAqW1xcXCAvXWNwXCAqKSBpbnN0YWxsX2NwPTogOzsKLSAgICAgICopIGluc3RhbGxfY3A9ZmFsc2UgOzsKLSAgICBlc2FjCi0KLSAgICAjIFdlIG5lZWQgdG8gYWNjZXB0IGF0IGxlYXN0IGFsbCB0aGUgQlNEIGluc3RhbGwgZmxhZ3MuCi0gICAgZGVzdD0KLSAgICBmaWxlcz0KLSAgICBvcHRzPQotICAgIHByZXY9Ci0gICAgaW5zdGFsbF90eXBlPQotICAgIGlzZGlyPW5vCi0gICAgc3RyaXBtZT0KLSAgICBub19tb2RlPToKLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGFyZzI9Ci0gICAgICBpZiB0ZXN0IC1uICIkZGVzdCI7IHRoZW4KLQlmaWxlcz0iJGZpbGVzICRkZXN0IgotCWRlc3Q9JGFyZwotCWNvbnRpbnVlCi0gICAgICBmaQotCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1kKSBpc2Rpcj15ZXMgOzsKLSAgICAgIC1mKQotCWlmICRpbnN0YWxsX2NwOyB0aGVuIDo7IGVsc2UKLQkgIHByZXY9JGFyZwotCWZpCi0JOzsKLSAgICAgIC1nIHwgLW0gfCAtbykKLQlwcmV2PSRhcmcKLQk7OwotICAgICAgLXMpCi0Jc3RyaXBtZT0iIC1zIgotCWNvbnRpbnVlCi0JOzsKLSAgICAgIC0qKQotCTs7Ci0gICAgICAqKQotCSMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkZWQgYW4gYXJndW1lbnQsIHRoZW4gc2tpcCBpdC4KLQlpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLQkgIGlmIHRlc3QgIngkcHJldiIgPSB4LW0gJiYgdGVzdCAtbiAiJGluc3RhbGxfb3ZlcnJpZGVfbW9kZSI7IHRoZW4KLQkgICAgYXJnMj0kaW5zdGFsbF9vdmVycmlkZV9tb2RlCi0JICAgIG5vX21vZGU9ZmFsc2UKLQkgIGZpCi0JICBwcmV2PQotCWVsc2UKLQkgIGRlc3Q9JGFyZwotCSAgY29udGludWUKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgYXJndW1lbnQuCi0gICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgotICAgICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLSAgICAgIGlmIHRlc3QgLW4gIiRhcmcyIjsgdGhlbgotCWZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmcyIgotICAgICAgZmkKLSAgICAgIGluc3RhbGxfc2hhcmVkX3Byb2c9IiRpbnN0YWxsX3NoYXJlZF9wcm9nICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLSAgICBkb25lCi0KLSAgICB0ZXN0IC16ICIkaW5zdGFsbF9wcm9nIiAmJiBcCi0gICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYW4gaW5zdGFsbCBwcm9ncmFtIgotCi0gICAgdGVzdCAtbiAiJHByZXYiICYmIFwKLSAgICAgIGZ1bmNfZmF0YWxfaGVscCAidGhlIFxgJHByZXYnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIKLQotICAgIGlmIHRlc3QgLW4gIiRpbnN0YWxsX292ZXJyaWRlX21vZGUiICYmICRub19tb2RlOyB0aGVuCi0gICAgICBpZiAkaW5zdGFsbF9jcDsgdGhlbiA6OyBlbHNlCi0JZnVuY19xdW90ZV9mb3JfZXZhbCAiJGluc3RhbGxfb3ZlcnJpZGVfbW9kZSIKLQlpbnN0YWxsX3NoYXJlZF9wcm9nPSIkaW5zdGFsbF9zaGFyZWRfcHJvZyAtbSAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCi0gICAgICBmaQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KLQlmdW5jX2ZhdGFsX2hlbHAgIm5vIGZpbGUgb3IgZGVzdGluYXRpb24gc3BlY2lmaWVkIgotICAgICAgZWxzZQotCWZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIGRlc3RpbmF0aW9uIgotICAgICAgZmkKLSAgICBmaQotCi0gICAgIyBTdHJpcCBhbnkgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZGVzdGluYXRpb24uCi0gICAgZnVuY19zdHJpcG5hbWUgJycgJy8nICIkZGVzdCIKLSAgICBkZXN0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQotICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LgotICAgIHRlc3QgLWQgIiRkZXN0IiAmJiBpc2Rpcj15ZXMKLSAgICBpZiB0ZXN0ICIkaXNkaXIiID0geWVzOyB0aGVuCi0gICAgICBkZXN0ZGlyPSIkZGVzdCIKLSAgICAgIGRlc3RuYW1lPQotICAgIGVsc2UKLSAgICAgIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRkZXN0IiAiIiAiLiIKLSAgICAgIGRlc3RkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgotICAgICAgZGVzdG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQotICAgICAgIyBOb3QgYSBkaXJlY3RvcnksIHNvIGNoZWNrIHRvIHNlZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIGZpbGUgc3BlY2lmaWVkLgotICAgICAgc2V0IGR1bW15ICRmaWxlczsgc2hpZnQKLSAgICAgIHRlc3QgIiQjIiAtZ3QgMSAmJiBcCi0JZnVuY19mYXRhbF9oZWxwICJcYCRkZXN0JyBpcyBub3QgYSBkaXJlY3RvcnkiCi0gICAgZmkKLSAgICBjYXNlICRkZXN0ZGlyIGluCi0gICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotICAgICopCi0gICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0JY2FzZSAkZmlsZSBpbgotCSoubG8pIDs7Ci0JKikKLQkgIGZ1bmNfZmF0YWxfaGVscCAiXGAkZGVzdGRpcicgbXVzdCBiZSBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSIKLQkgIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKLSAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KLSAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKLQotICAgIHN0YXRpY2xpYnM9Ci0gICAgZnV0dXJlX2xpYmRpcnM9Ci0gICAgY3VycmVudF9saWJkaXJzPQotICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLQotICAgICAgIyBEbyBlYWNoIGluc3RhbGxhdGlvbi4KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouJGxpYmV4dCkKLQkjIERvIHRoZSBzdGF0aWMgbGlicmFyaWVzIGxhdGVyLgotCXN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRmaWxlIgotCTs7Ci0KLSAgICAgICoubGEpCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlmdW5jX2xhbGliX3Vuc2FmZV9wICIkZmlsZSIgXAotCSAgfHwgZnVuY19mYXRhbF9oZWxwICJcYCRmaWxlJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCi0KLQlsaWJyYXJ5X25hbWVzPQotCW9sZF9saWJyYXJ5PQotCXJlbGlua19jb21tYW5kPQotCWZ1bmNfc291cmNlICIkZmlsZSIKLQotCSMgQWRkIHRoZSBsaWJkaXIgdG8gY3VycmVudF9saWJkaXJzIGlmIGl0IGlzIHRoZSBkZXN0aW5hdGlvbi4KLQlpZiB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkbGliZGlyIjsgdGhlbgotCSAgY2FzZSAiJGN1cnJlbnRfbGliZGlycyAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgY3VycmVudF9saWJkaXJzPSIkY3VycmVudF9saWJkaXJzICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZWxzZQotCSAgIyBOb3RlIHRoZSBsaWJkaXIgYXMgYSBmdXR1cmUgbGliZGlyLgotCSAgY2FzZSAiJGZ1dHVyZV9saWJkaXJzICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmdXR1cmVfbGliZGlycz0iJGZ1dHVyZV9saWJkaXJzICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZmkKLQotCWZ1bmNfZGlybmFtZSAiJGZpbGUiICIvIiAiIgotCWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCi0JZGlyPSIkZGlyJG9iamRpciIKLQotCWlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQkgICMgRGV0ZXJtaW5lIHRoZSBwcmVmaXggdGhlIHVzZXIgaGFzIGFwcGxpZWQgdG8gb3VyIGZ1dHVyZSBkaXIuCi0JICBpbnN0X3ByZWZpeF9kaXI9YCRFQ0hPICIkZGVzdGRpciIgfCAkU0VEIC1lICJzJSRsaWJkaXJcJCUlImAKLQotCSAgIyBEb24ndCBhbGxvdyB0aGUgdXNlciB0byBwbGFjZSB1cyBvdXRzaWRlIG9mIG91ciBleHBlY3RlZAotCSAgIyBsb2NhdGlvbiBiL2MgdGhpcyBwcmV2ZW50cyBmaW5kaW5nIGRlcGVuZGVudCBsaWJyYXJpZXMgdGhhdAotCSAgIyBhcmUgaW5zdGFsbGVkIHRvIHRoZSBzYW1lIHByZWZpeC4KLQkgICMgQXQgcHJlc2VudCwgdGhpcyBjaGVjayBkb2Vzbid0IGFmZmVjdCB3aW5kb3dzIC5kbGwncyB0aGF0Ci0JICAjIGFyZSBpbnN0YWxsZWQgaW50byAkbGliZGlyLy4uL2JpbiAoY3VycmVudGx5LCB0aGF0IHdvcmtzIGZpbmUpCi0JICAjIGJ1dCBpdCdzIHNvbWV0aGluZyB0byBrZWVwIGFuIGV5ZSBvbi4KLQkgIHRlc3QgIiRpbnN0X3ByZWZpeF9kaXIiID0gIiRkZXN0ZGlyIiAmJiBcCi0JICAgIGZ1bmNfZmF0YWxfZXJyb3IgImVycm9yOiBjYW5ub3QgaW5zdGFsbCBcYCRmaWxlJyB0byBhIGRpcmVjdG9yeSBub3QgZW5kaW5nIGluICRsaWJkaXIiCi0KLQkgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCi0JICAgICMgU3RpY2sgdGhlIGluc3RfcHJlZml4X2RpciBkYXRhIGludG8gdGhlIGxpbmsgY29tbWFuZC4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAicyVAaW5zdF9wcmVmaXhfZGlyQCUtaW5zdC1wcmVmaXgtZGlyICRpbnN0X3ByZWZpeF9kaXIlImAKLQkgIGVsc2UKLQkgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAicyVAaW5zdF9wcmVmaXhfZGlyQCUlImAKLQkgIGZpCi0KLQkgIGZ1bmNfd2FybmluZyAicmVsaW5raW5nIFxgJGZpbGUnIgotCSAgZnVuY19zaG93X2V2YWwgIiRyZWxpbmtfY29tbWFuZCIgXAotCSAgICAnZnVuY19mYXRhbF9lcnJvciAiZXJyb3I6IHJlbGluayBcYCRmaWxlJ1wnJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IicKLQlmaQotCi0JIyBTZWUgdGhlIG5hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4KLQlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXM7IHNoaWZ0Ci0JaWYgdGVzdCAtbiAiJDEiOyB0aGVuCi0JICByZWFsbmFtZT0iJDEiCi0JICBzaGlmdAotCi0JICBzcmNuYW1lPSIkcmVhbG5hbWUiCi0JICB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiICYmIHNyY25hbWU9IiRyZWFsbmFtZSJUCi0KLQkgICMgSW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcnkgYW5kIGJ1aWxkIHRoZSBzeW1saW5rcy4KLQkgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9zaGFyZWRfcHJvZyAkZGlyLyRzcmNuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIgXAotCSAgICAgICdleGl0ICQ/JwotCSAgdHN0cmlwbWU9IiRzdHJpcG1lIgotCSAgY2FzZSAkaG9zdF9vcyBpbgotCSAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQotCSAgICBjYXNlICRyZWFsbmFtZSBpbgotCSAgICAqLmRsbC5hKQotCSAgICAgIHRzdHJpcG1lPSIiCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICA7OwotCSAgZXNhYwotCSAgaWYgdGVzdCAtbiAiJHRzdHJpcG1lIiAmJiB0ZXN0IC1uICIkc3RyaXBsaWIiOyB0aGVuCi0JICAgIGZ1bmNfc2hvd19ldmFsICIkc3RyaXBsaWIgJGRlc3RkaXIvJHJlYWxuYW1lIiAnZXhpdCAkPycKLQkgIGZpCi0KLQkgIGlmIHRlc3QgIiQjIiAtZ3QgMDsgdGhlbgotCSAgICAjIERlbGV0ZSB0aGUgb2xkIHN5bWxpbmtzLCBhbmQgY3JlYXRlIG5ldyBvbmVzLgotCSAgICAjIFRyeSBgbG4gLXNmJyBmaXJzdCwgYmVjYXVzZSB0aGUgYGxuJyBiaW5hcnkgbWlnaHQgZGVwZW5kIG9uCi0JICAgICMgdGhlIHN5bWxpbmsgd2UgcmVwbGFjZSEgIFNvbGFyaXMgL2Jpbi9sbiBkb2VzIG5vdCB1bmRlcnN0YW5kIC1mLAotCSAgICAjIHNvIHdlIGFsc28gbmVlZCB0byB0cnkgcm0gJiYgbG4gLXMuCi0JICAgIGZvciBsaW5rbmFtZQotCSAgICBkbwotCSAgICAgIHRlc3QgIiRsaW5rbmFtZSIgIT0gIiRyZWFsbmFtZSIgXAotCQkmJiBmdW5jX3Nob3dfZXZhbCAiKGNkICRkZXN0ZGlyICYmIHsgJExOX1MgLWYgJHJlYWxuYW1lICRsaW5rbmFtZSB8fCB7ICRSTSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZTsgfTsgfSkiCi0JICAgIGRvbmUKLQkgIGZpCi0KLQkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KLQkgIGxpYj0iJGRlc3RkaXIvJHJlYWxuYW1lIgotCSAgZnVuY19leGVjdXRlX2NtZHMgIiRwb3N0aW5zdGFsbF9jbWRzIiAnZXhpdCAkPycKLQlmaQotCi0JIyBJbnN0YWxsIHRoZSBwc2V1ZG8tbGlicmFyeSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMuCi0JZnVuY19iYXNlbmFtZSAiJGZpbGUiCi0JbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotCWluc3RuYW1lPSIkZGlyLyRuYW1lImkKLQlmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiICdleGl0ICQ/JwotCi0JIyBNYXliZSBpbnN0YWxsIHRoZSBzdGF0aWMgbGlicmFyeSwgdG9vLgotCXRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGRpci8kb2xkX2xpYnJhcnkiCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEluc3RhbGwgKGkuZS4gY29weSkgYSBsaWJ0b29sIG9iamVjdC4KLQotCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KLQlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgotCWVsc2UKLQkgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgotCSAgZGVzdGZpbGU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCi0JZmkKLQotCSMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCi0JY2FzZSAkZGVzdGZpbGUgaW4KLQkqLmxvKQotCSAgZnVuY19sbzJvICIkZGVzdGZpbGUiCi0JICBzdGF0aWNkZXN0PSRmdW5jX2xvMm9fcmVzdWx0Ci0JICA7OwotCSouJG9iamV4dCkKLQkgIHN0YXRpY2Rlc3Q9IiRkZXN0ZmlsZSIKLQkgIGRlc3RmaWxlPQotCSAgOzsKLQkqKQotCSAgZnVuY19mYXRhbF9oZWxwICJjYW5ub3QgY29weSBhIGxpYnRvb2wgb2JqZWN0IHRvIFxgJGRlc3RmaWxlJyIKLQkgIDs7Ci0JZXNhYwotCi0JIyBJbnN0YWxsIHRoZSBsaWJ0b29sIG9iamVjdCBpZiByZXF1ZXN0ZWQuCi0JdGVzdCAtbiAiJGRlc3RmaWxlIiAmJiBcCi0JICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiICdleGl0ICQ/JwotCi0JIyBJbnN0YWxsIHRoZSBvbGQgb2JqZWN0IGlmIGVuYWJsZWQuCi0JaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KLQkgIGZ1bmNfbG8ybyAiJGZpbGUiCi0JICBzdGF0aWNvYmo9JGZ1bmNfbG8yb19yZXN1bHQKLQkgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nIFwkc3RhdGljb2JqIFwkc3RhdGljZGVzdCIgJ2V4aXQgJD8nCi0JZmkKLQlleGl0ICRFWElUX1NVQ0NFU1MKLQk7OwotCi0gICAgICAqKQotCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KLQlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgotCWVsc2UKLQkgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgotCSAgZGVzdGZpbGU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCi0JZmkKLQotCSMgSWYgdGhlIGZpbGUgaXMgbWlzc2luZywgYW5kIHRoZXJlIGlzIGEgLmV4ZSBvbiB0aGUgZW5kLCBzdHJpcCBpdAotCSMgYmVjYXVzZSBpdCBpcyBtb3N0IGxpa2VseSBhIGxpYnRvb2wgc2NyaXB0IHdlIGFjdHVhbGx5IHdhbnQgdG8KLQkjIGluc3RhbGwKLQlzdHJpcHBlZF9leHQ9IiIKLQljYXNlICRmaWxlIGluCi0JICAqLmV4ZSkKLQkgICAgaWYgdGVzdCAhIC1mICIkZmlsZSI7IHRoZW4KLQkgICAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRmaWxlIgotCSAgICAgIGZpbGU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCSAgICAgIHN0cmlwcGVkX2V4dD0iLmV4ZSIKLQkgICAgZmkKLQkgICAgOzsKLQllc2FjCi0KLQkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCi0JY2FzZSAkaG9zdCBpbgotCSpjeWd3aW4qIHwgKm1pbmd3KikKLQkgICAgaWYgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICIkZmlsZSI7IHRoZW4KLQkgICAgICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICIkZmlsZSIKLQkgICAgICB3cmFwcGVyPSRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdAotCSAgICBlbHNlCi0JICAgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZmlsZSIKLQkgICAgICB3cmFwcGVyPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQkgICAgZmkKLQkgICAgOzsKLQkqKQotCSAgICB3cmFwcGVyPSRmaWxlCi0JICAgIDs7Ci0JZXNhYwotCWlmIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICIkd3JhcHBlciI7IHRoZW4KLQkgIG5vdGluc3RfZGVwbGlicz0KLQkgIHJlbGlua19jb21tYW5kPQotCi0JICBmdW5jX3NvdXJjZSAiJHdyYXBwZXIiCi0KLQkgICMgQ2hlY2sgdGhlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2V0LgotCSAgdGVzdCAteiAiJGdlbmVyYXRlZF9ieV9saWJ0b29sX3ZlcnNpb24iICYmIFwKLQkgICAgZnVuY19mYXRhbF9lcnJvciAiaW52YWxpZCBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IFxgJHdyYXBwZXInIgotCi0JICBmaW5hbGl6ZT15ZXMKLQkgIGZvciBsaWIgaW4gJG5vdGluc3RfZGVwbGliczsgZG8KLQkgICAgIyBDaGVjayB0byBzZWUgdGhhdCBlYWNoIGxpYnJhcnkgaXMgaW5zdGFsbGVkLgotCSAgICBsaWJkaXI9Ci0JICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCi0JICAgICAgZnVuY19zb3VyY2UgIiRsaWIiCi0JICAgIGZpCi0JICAgIGxpYmZpbGU9IiRsaWJkaXIvImAkRUNITyAiJGxpYiIgfCAkU0VEICdzJV4uKi8lJWcnYCAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKLQkgICAgaWYgdGVzdCAtbiAiJGxpYmRpciIgJiYgdGVzdCAhIC1mICIkbGliZmlsZSI7IHRoZW4KLQkgICAgICBmdW5jX3dhcm5pbmcgIlxgJGxpYicgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCBpbiBcYCRsaWJkaXInIgotCSAgICAgIGZpbmFsaXplPW5vCi0JICAgIGZpCi0JICBkb25lCi0KLQkgIHJlbGlua19jb21tYW5kPQotCSAgZnVuY19zb3VyY2UgIiR3cmFwcGVyIgotCi0JICBvdXRwdXRuYW1lPQotCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSBubyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JICAgICRvcHRfZHJ5X3J1biB8fCB7Ci0JICAgICAgaWYgdGVzdCAiJGZpbmFsaXplIiA9IHllczsgdGhlbgotCSAgICAgICAgdG1wZGlyPWBmdW5jX21rdGVtcGRpcmAKLQkJZnVuY19iYXNlbmFtZSAiJGZpbGUkc3RyaXBwZWRfZXh0IgotCQlmaWxlPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0JICAgICAgICBvdXRwdXRuYW1lPSIkdG1wZGlyLyRmaWxlIgotCSAgICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotCSAgICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAncyVAT1VUUFVUQCUnIiRvdXRwdXRuYW1lIiclZydgCi0KLQkgICAgICAgICRvcHRfc2lsZW50IHx8IHsKLQkgICAgICAgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkcmVsaW5rX2NvbW1hbmQiCi0JCSAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgotCSAgICAgICAgfQotCSAgICAgICAgaWYgZXZhbCAiJHJlbGlua19jb21tYW5kIjsgdGhlbiA6Ci0JICAgICAgICAgIGVsc2UKLQkJICBmdW5jX2Vycm9yICJlcnJvcjogcmVsaW5rIFxgJGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiCi0JCSAgJG9wdF9kcnlfcnVuIHx8ICR7Uk19ciAiJHRtcGRpciIKLQkJICBjb250aW51ZQotCSAgICAgICAgZmkKLQkgICAgICAgIGZpbGU9IiRvdXRwdXRuYW1lIgotCSAgICAgIGVsc2UKLQkgICAgICAgIGZ1bmNfd2FybmluZyAiY2Fubm90IHJlbGluayBcYCRmaWxlJyIKLQkgICAgICBmaQotCSAgICB9Ci0JICBlbHNlCi0JICAgICMgSW5zdGFsbCB0aGUgYmluYXJ5IHRoYXQgd2UgY29tcGlsZWQgZWFybGllci4KLQkgICAgZmlsZT1gJEVDSE8gIiRmaWxlJHN0cmlwcGVkX2V4dCIgfCAkU0VEICJzJVwoW14vXSpcKSQlJG9iamRpci9cMSUiYAotCSAgZmkKLQlmaQotCi0JIyByZW1vdmUgLmV4ZSBzaW5jZSBjeWd3aW4gL3Vzci9iaW4vaW5zdGFsbCB3aWxsIGFwcGVuZCBhbm90aGVyCi0JIyBvbmUgYW55d2F5Ci0JY2FzZSAkaW5zdGFsbF9wcm9nLCRob3N0IGluCi0JKi91c3IvYmluL2luc3RhbGwqLCpjeWd3aW4qKQotCSAgY2FzZSAkZmlsZTokZGVzdGZpbGUgaW4KLQkgICouZXhlOiouZXhlKQotCSAgICAjIHRoaXMgaXMgb2sKLQkgICAgOzsKLQkgICouZXhlOiopCi0JICAgIGRlc3RmaWxlPSRkZXN0ZmlsZS5leGUKLQkgICAgOzsKLQkgICo6Ki5leGUpCi0JICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGRlc3RmaWxlIgotCSAgICBkZXN0ZmlsZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JICAgIDs7Ci0JICBlc2FjCi0JICA7OwotCWVzYWMKLQlmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZ1wkc3RyaXBtZSBcJGZpbGUgXCRkZXN0ZmlsZSIgJ2V4aXQgJD8nCi0JJG9wdF9kcnlfcnVuIHx8IGlmIHRlc3QgLW4gIiRvdXRwdXRuYW1lIjsgdGhlbgotCSAgJHtSTX1yICIkdG1wZGlyIgotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICBmb3IgZmlsZSBpbiAkc3RhdGljbGliczsgZG8KLSAgICAgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgotICAgICAgbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotCi0gICAgICAjIFNldCB1cCB0aGUgcmFubGliIHBhcmFtZXRlcnMuCi0gICAgICBvbGRsaWI9IiRkZXN0ZGlyLyRuYW1lIgotCi0gICAgICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyBcJGZpbGUgXCRvbGRsaWIiICdleGl0ICQ/JwotCi0gICAgICBpZiB0ZXN0IC1uICIkc3RyaXBtZSIgJiYgdGVzdCAtbiAiJG9sZF9zdHJpcGxpYiI7IHRoZW4KLQlmdW5jX3Nob3dfZXZhbCAiJG9sZF9zdHJpcGxpYiAkb2xkbGliIiAnZXhpdCAkPycKLSAgICAgIGZpCi0KLSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KLSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkb2xkX3Bvc3RpbnN0YWxsX2NtZHMiICdleGl0ICQ/JwotICAgIGRvbmUKLQotICAgIHRlc3QgLW4gIiRmdXR1cmVfbGliZGlycyIgJiYgXAotICAgICAgZnVuY193YXJuaW5nICJyZW1lbWJlciB0byBydW4gXGAkcHJvZ25hbWUgLS1maW5pc2gkZnV0dXJlX2xpYmRpcnMnIgotCi0gICAgaWYgdGVzdCAtbiAiJGN1cnJlbnRfbGliZGlycyI7IHRoZW4KLSAgICAgICMgTWF5YmUganVzdCBkbyBhIGRyeSBydW4uCi0gICAgICAkb3B0X2RyeV9ydW4gJiYgY3VycmVudF9saWJkaXJzPSIgLW4kY3VycmVudF9saWJkaXJzIgotICAgICAgZXhlY19jbWQ9JyRTSEVMTCAkcHJvZ3BhdGggJHByZXNlcnZlX2FyZ3MgLS1maW5pc2gkY3VycmVudF9saWJkaXJzJwotICAgIGVsc2UKLSAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotICAgIGZpCi19Ci0KLXRlc3QgIiRtb2RlIiA9IGluc3RhbGwgJiYgZnVuY19tb2RlX2luc3RhbGwgJHsxKyIkQCJ9Ci0KLQotIyBmdW5jX2dlbmVyYXRlX2Rsc3ltcyBvdXRwdXRuYW1lIG9yaWdpbmF0b3IgcGljX3AKLSMgRXh0cmFjdCBzeW1ib2xzIGZyb20gZGxwcmVmaWxlcyBhbmQgY3JlYXRlICR7b3V0cHV0bmFtZX1TLm8gd2l0aAotIyBhIGRscHJlb3BlbiBzeW1ib2wgdGFibGUuCi1mdW5jX2dlbmVyYXRlX2Rsc3ltcyAoKQotewotICAgICRvcHRfZGVidWcKLSAgICBteV9vdXRwdXRuYW1lPSIkMSIKLSAgICBteV9vcmlnaW5hdG9yPSIkMiIKLSAgICBteV9waWNfcD0iJHszLW5vfSIKLSAgICBteV9wcmVmaXg9YCRFQ0hPICIkbXlfb3JpZ2luYXRvciIgfCBzZWQgJ3MlW15hLXpBLVowLTldJV8lZydgCi0gICAgbXlfZGxzeW1zPQotCi0gICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KLSAgICAgIGlmIHRlc3QgLW4gIiROTSIgJiYgdGVzdCAtbiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQlteV9kbHN5bXM9IiR7bXlfb3V0cHV0bmFtZX1TLmMiCi0gICAgICBlbHNlCi0JZnVuY19lcnJvciAibm90IGNvbmZpZ3VyZWQgdG8gZXh0cmFjdCBnbG9iYWwgc3ltYm9scyBmcm9tIGRscHJlb3BlbmVkIGZpbGVzIgotICAgICAgZmkKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJG15X2Rsc3ltcyI7IHRoZW4KLSAgICAgIGNhc2UgJG15X2Rsc3ltcyBpbgotICAgICAgIiIpIDs7Ci0gICAgICAqLmMpCi0JIyBEaXNjb3ZlciB0aGUgbmxpc3Qgb2YgZWFjaCBvZiB0aGUgZGxmaWxlcy4KLQlubGlzdD0iJG91dHB1dF9vYmpkaXIvJHtteV9vdXRwdXRuYW1lfS5ubSIKLQotCWZ1bmNfc2hvd19ldmFsICIkUk0gJG5saXN0ICR7bmxpc3R9UyAke25saXN0fVQiCi0KLQkjIFBhcnNlIHRoZSBuYW1lIGxpc3QgaW50byBhIHNvdXJjZSBmaWxlLgotCWZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKLQotCSRvcHRfZHJ5X3J1biB8fCAkRUNITyA+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAotLyogJG15X2Rsc3ltcyAtIHN5bWJvbCByZXNvbHV0aW9uIHRhYmxlIGZvciBcYCRteV9vdXRwdXRuYW1lJyBkbHN5bSBlbXVsYXRpb24uICovCi0vKiBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuIFwiQ1wiIHsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKCgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDQpKSB8fCAoX19HTlVDX18gPiA0KSkKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCBcIi1Xc3RyaWN0LXByb3RvdHlwZXNcIgotI2VuZGlmCi0KLS8qIEV4dGVybmFsIHN5bWJvbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjb21waWxlci4gKi9cCi0iCi0KLQlpZiB0ZXN0ICIkZGxzZWxmIiA9IHllczsgdGhlbgotCSAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRvdXRwdXQnIgotCi0JICAkb3B0X2RyeV9ydW4gfHwgZWNobyAnOiBAUFJPR1JBTUAgJyA+ICIkbmxpc3QiCi0KLQkgICMgQWRkIG91ciBvd24gcHJvZ3JhbSBvYmplY3RzIHRvIHRoZSBzeW1ib2wgbGlzdC4KLQkgIHByb2dmaWxlcz1gJEVDSE8gIiRvYmpzJG9sZF9kZXBsaWJzIiB8ICRTUDJOTCB8ICRTRUQgIiRsbzJvIiB8ICROTDJTUGAKLQkgIGZvciBwcm9nZmlsZSBpbiAkcHJvZ2ZpbGVzOyBkbwotCSAgICBmdW5jX3ZlcmJvc2UgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJHByb2dmaWxlJyIKLQkgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiROTSAkcHJvZ2ZpbGUgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgotCSAgZG9uZQotCi0JICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgICAkb3B0X2RyeV9ydW4gfHwgewotCSAgICAgIGV2YWwgJyRFR1JFUCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgIGV2YWwgJyRNViAiJG5saXN0IlQgIiRubGlzdCInCi0JICAgIH0KLQkgIGZpCi0KLQkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgJG9wdF9kcnlfcnVuIHx8IHsKLQkgICAgICBldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCi0JICAgICAgZXZhbCAnJE1WICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgfQotCSAgZmkKLQotCSAgIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKLQkgIGlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KLQkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmV4cCIKLQkgICAgJG9wdF9kcnlfcnVuIHx8IHsKLQkgICAgICAkUk0gJGV4cG9ydF9zeW1ib2xzCi0JICAgICAgZXZhbCAiJHtTRUR9IC1uIC1lICcvXjogQFBST0dSQU1AICQvZCcgLWUgJ3MvXi4qIFwoLipcKSQvXDEvcCcgIic8ICIkbmxpc3QiID4gIiRleHBvcnRfc3ltYm9scyInCi0JICAgICAgY2FzZSAkaG9zdCBpbgotCSAgICAgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyogKQotICAgICAgICAgICAgICAgIGV2YWwgImVjaG8gRVhQT1JUUyAiJz4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCi0gICAgICAgICAgICAgICAgZXZhbCAnY2F0ICIkZXhwb3J0X3N5bWJvbHMiID4+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJwotCSAgICAgICAgOzsKLQkgICAgICBlc2FjCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgJG9wdF9kcnlfcnVuIHx8IHsKLQkgICAgICBldmFsICIke1NFRH0gLWUgJ3MvXChbXS5bKl4kXVwpL1xcXFxcMS9nJyAtZSAncy9eLyAvJyAtZSAncy8kLyQvJyInIDwgIiRleHBvcnRfc3ltYm9scyIgPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIicKLQkgICAgICBldmFsICckR1JFUCAtZiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIiA8ICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgIGV2YWwgJyRNViAiJG5saXN0IlQgIiRubGlzdCInCi0JICAgICAgY2FzZSAkaG9zdCBpbgotCSAgICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCi0JICAgICAgICAgIGV2YWwgImVjaG8gRVhQT1JUUyAiJz4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCi0JICAgICAgICAgIGV2YWwgJ2NhdCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKLQkgICAgICAgICAgOzsKLQkgICAgICBlc2FjCi0JICAgIH0KLQkgIGZpCi0JZmkKLQotCWZvciBkbHByZWZpbGUgaW4gJGRscHJlZmlsZXM7IGRvCi0JICBmdW5jX3ZlcmJvc2UgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGRscHJlZmlsZSciCi0JICBmdW5jX2Jhc2VuYW1lICIkZGxwcmVmaWxlIgotCSAgbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotCSAgJG9wdF9kcnlfcnVuIHx8IHsKLQkgICAgZXZhbCAnJEVDSE8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKLQkgICAgZXZhbCAiJE5NICRkbHByZWZpbGUgMj4vZGV2L251bGwgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgotCSAgfQotCWRvbmUKLQotCSRvcHRfZHJ5X3J1biB8fCB7Ci0JICAjIE1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IGFuIGVtcHR5IGZpbGUuCi0JICB0ZXN0IC1mICIkbmxpc3QiIHx8IDogPiAiJG5saXN0IgotCi0JICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgICAkRUdSRVAgLXYgIiAoJGV4Y2x1ZGVfZXhwc3ltcykkIiAiJG5saXN0IiA+ICIkbmxpc3QiVAotCSAgICAkTVYgIiRubGlzdCJUICIkbmxpc3QiCi0JICBmaQotCi0JICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotCSAgaWYgJEdSRVAgLXYgIl46ICIgPCAiJG5saXN0IiB8Ci0JICAgICAgaWYgc29ydCAtayAzIDwvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCXNvcnQgLWsgMwotCSAgICAgIGVsc2UKLQkJc29ydCArMgotCSAgICAgIGZpIHwKLQkgICAgICB1bmlxID4gIiRubGlzdCJTOyB0aGVuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgJEdSRVAgLXYgIl46ICIgPCAiJG5saXN0IiA+ICIkbmxpc3QiUwotCSAgZmkKLQotCSAgaWYgdGVzdCAtZiAiJG5saXN0IlM7IHRoZW4KLQkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiUyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyInCi0JICBlbHNlCi0JICAgIGVjaG8gJy8qIE5PTkUgKi8nID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIgotCSAgZmkKLQotCSAgZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICB2b2lkICphZGRyZXNzOwotfSBsdF9kbHN5bWxpc3Q7Ci0iCi0JICBjYXNlICRob3N0IGluCi0JICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqICkKLQkgICAgZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKLS8qIERBVEEgaW1wb3J0cyBmcm9tIERMTHMgb24gV0lOMzIgY29uJ3QgYmUgY29uc3QsIGJlY2F1c2UKLSAgIHJ1bnRpbWUgcmVsb2NhdGlvbnMgYXJlIHBlcmZvcm1lZCAtLSBzZWUgbGQncyBkb2N1bWVudGF0aW9uCi0gICBvbiBwc2V1ZG8tcmVsb2NzLiAgKi8iCi0JICAgIGx0X2Rsc3ltX2NvbnN0PSA7OwotCSAgKm9zZjUqKQotCSAgICBlY2hvID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAotLyogVGhpcyBzeXN0ZW0gZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggcmVsb2NhdGlvbnMgaW4gY29uc3QgZGF0YSAqLyIKLQkgICAgbHRfZGxzeW1fY29uc3Q9IDs7Ci0JICAqKQotCSAgICBsdF9kbHN5bV9jb25zdD1jb25zdCA7OwotCSAgZXNhYwotCi0JICBlY2hvID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAotZXh0ZXJuICRsdF9kbHN5bV9jb25zdCBsdF9kbHN5bWxpc3QKLWx0XyR7bXlfcHJlZml4fV9MVFhfcHJlbG9hZGVkX3N5bWJvbHNbXTsKLSRsdF9kbHN5bV9jb25zdCBsdF9kbHN5bWxpc3QKLWx0XyR7bXlfcHJlZml4fV9MVFhfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17XAotICB7IFwiJG15X29yaWdpbmF0b3JcIiwgKHZvaWQgKikgMCB9LCIKLQotCSAgY2FzZSAkbmVlZF9saWJfcHJlZml4IGluCi0JICBubykKLQkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MiIDwgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiCi0JICAgIDs7Ci0JICAqKQotCSAgICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4IiA8ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIgotCSAgICA7OwotCSAgZXNhYwotCSAgZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKLSAgezAsICh2b2lkICopIDB9Ci19OwotCi0vKiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gaW4gRnJlZUJTRCBsaW5rZXIgKi8KLSNpZmRlZiBGUkVFQlNEX1dPUktBUk9VTkQKLXN0YXRpYyBjb25zdCB2b2lkICpsdF9wcmVsb2FkZWRfc2V0dXAoKSB7Ci0gIHJldHVybiBsdF8ke215X3ByZWZpeH1fTFRYX3ByZWxvYWRlZF9zeW1ib2xzOwotfQotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmXAotIgotCX0gIyAhJG9wdF9kcnlfcnVuCi0KLQlwaWNfZmxhZ19mb3Jfc3ltdGFibGU9Ci0JY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCi0JKiIgLXN0YXRpYyAiKikgOzsKLQkqKQotCSAgY2FzZSAkaG9zdCBpbgotCSAgIyBjb21waWxpbmcgdGhlIHN5bWJvbCB0YWJsZSBmaWxlIHdpdGggcGljX2ZsYWcgd29ya3MgYXJvdW5kCi0JICAjIGEgRnJlZUJTRCBidWcgdGhhdCBjYXVzZXMgcHJvZ3JhbXMgdG8gY3Jhc2ggd2hlbiAtbG0gaXMKLQkgICMgbGlua2VkIGJlZm9yZSBhbnkgb3RoZXIgUElDIG9iamVjdC4gIEJ1dCB3ZSBtdXN0IG5vdCB1c2UKLQkgICMgcGljX2ZsYWcgd2hlbiBsaW5raW5nIHdpdGggLXN0YXRpYy4gIFRoZSBwcm9ibGVtIGV4aXN0cyBpbgotCSAgIyBGcmVlQlNEIDIuMi42IGFuZCBpcyBmaXhlZCBpbiBGcmVlQlNEIDMuMS4KLQkgICotKi1mcmVlYnNkMip8Ki0qLWZyZWVic2QzLjAqfCotKi1mcmVlYnNkZWxmMy4wKikKLQkgICAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIC1ERlJFRUJTRF9XT1JLQVJPVU5EIiA7OwotCSAgKi0qLWhwdXgqKQotCSAgICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWciICA7OwotCSAgKikKLQkgICAgaWYgdGVzdCAiWCRteV9waWNfcCIgIT0gWG5vOyB0aGVuCi0JICAgICAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIgotCSAgICBmaQotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0Jc3ltdGFiX2NmbGFncz0KLQlmb3IgYXJnIGluICRMVENGTEFHUzsgZG8KLQkgIGNhc2UgJGFyZyBpbgotCSAgLXBpZSB8IC1mcGllIHwgLWZQSUUpIDs7Ci0JICAqKSBzeW10YWJfY2ZsYWdzPSIkc3ltdGFiX2NmbGFncyAkYXJnIiA7OwotCSAgZXNhYwotCWRvbmUKLQotCSMgTm93IGNvbXBpbGUgdGhlIGR5bmFtaWMgc3ltYm9sIGZpbGUuCi0JZnVuY19zaG93X2V2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkTFRDQyRzeW10YWJfY2ZsYWdzIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgIiRteV9kbHN5bXMiKScgJ2V4aXQgJD8nCi0KLQkjIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCi0JZnVuY19zaG93X2V2YWwgJyRSTSAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCInCi0KLQkjIFRyYW5zZm9ybSB0aGUgc3ltYm9sIGZpbGUgaW50byB0aGUgY29ycmVjdCBuYW1lLgotCXN5bWZpbGVvYmo9IiRvdXRwdXRfb2JqZGlyLyR7bXlfb3V0cHV0bmFtZX1TLiRvYmpleHQiCi0JY2FzZSAkaG9zdCBpbgotCSpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyogKQotCSAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmIjsgdGhlbgotCSAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTRUQgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyRteV9vdXRwdXRuYW1lLmRlZiAkc3ltZmlsZW9iaiUiYAotCSAgICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmICRzeW1maWxlb2JqJSJgCi0JICBlbHNlCi0JICAgIGNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKLQkgICAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIiRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTRUQgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCi0JICBmaQotCSAgOzsKLQkqKQotCSAgY29tcGlsZV9jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfY29tbWFuZCIgfCAkU0VEICJzJUBTWU1GSUxFQCUkc3ltZmlsZW9iaiUiYAotCSAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIiRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTRUQgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCi0JICA7OwotCWVzYWMKLQk7OwotICAgICAgKikKLQlmdW5jX2ZhdGFsX2Vycm9yICJ1bmtub3duIHN1ZmZpeCBmb3IgXGAkbXlfZGxzeW1zJyIKLQk7OwotICAgICAgZXNhYwotICAgIGVsc2UKLSAgICAgICMgV2Uga2VlcCBnb2luZyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgZGlkbid0IHJlZmVyIHRvCi0gICAgICAjIGx0X3ByZWxvYWRlZF9zeW1ib2xzLiAgVGhlIGxpbmtlciB3aWxsIGZhaWwgaWYgZ2xvYmFsX3N5bWJvbF9waXBlCi0gICAgICAjIHJlYWxseSB3YXMgcmVxdWlyZWQuCi0KLSAgICAgICMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCi0gICAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTRUQgInMlIEBTWU1GSUxFQCUlImAKLSAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICIkZmluYWxpemVfY29tbWFuZCIgfCAkU0VEICJzJSBAU1lNRklMRUAlJSJgCi0gICAgZmkKLX0KLQotIyBmdW5jX3dpbjMyX2xpYmlkIGFyZwotIyByZXR1cm4gdGhlIGxpYnJhcnkgdHlwZSBvZiBmaWxlICdhcmcnCi0jCi0jIE5lZWQgYSBsb3Qgb2YgZ29vIHRvIGhhbmRsZSAqYm90aCogRExMcyBhbmQgaW1wb3J0IGxpYnMKLSMgSGFzIHRvIGJlIGEgc2hlbGwgZnVuY3Rpb24gaW4gb3JkZXIgdG8gJ2VhdCcgdGhlIGFyZ3VtZW50Ci0jIHRoYXQgaXMgc3VwcGxpZWQgd2hlbiAkZmlsZV9tYWdpY19jb21tYW5kIGlzIGNhbGxlZC4KLSMgRGVzcGl0ZSB0aGUgbmFtZSwgYWxzbyBkZWFsIHdpdGggNjQgYml0IGJpbmFyaWVzLgotZnVuY193aW4zMl9saWJpZCAoKQotewotICAkb3B0X2RlYnVnCi0gIHdpbjMyX2xpYmlkX3R5cGU9InVua25vd24iCi0gIHdpbjMyX2ZpbGVyZXM9YGZpbGUgLUwgJDEgMj4vZGV2L251bGxgCi0gIGNhc2UgJHdpbjMyX2ZpbGVyZXMgaW4KLSAgKmFyXCBhcmNoaXZlXCBpbXBvcnRcIGxpYnJhcnkqKSAjIGRlZmluaXRlbHkgaW1wb3J0Ci0gICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgaW1wb3J0IgotICAgIDs7Ci0gICphclwgYXJjaGl2ZSopICMgY291bGQgYmUgYW4gaW1wb3J0LCBvciBzdGF0aWMKLSAgICAjIEtlZXAgdGhlIGVncmVwIHBhdHRlcm4gaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4gX0xUX0NIRUNLX01BR0lDX01FVEhPRC4KLSAgICBpZiBldmFsICRPQkpEVU1QIC1mICQxIHwgJFNFRCAtZSAnMTBxJyAyPi9kZXYvbnVsbCB8Ci0gICAgICAgJEVHUkVQICdmaWxlIGZvcm1hdCAocGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT98cGUtYXJtLXdpbmNlfHBlLXg4Ni02NCknID4vZGV2L251bGw7IHRoZW4KLSAgICAgIHdpbjMyX25tcmVzPWBldmFsICROTSAtZiBwb3NpeCAtQSAkMSB8Ci0JJFNFRCAtbiAtZSAnCi0JICAgIDEsMTAwewotCQkvIEkgL3sKLQkJICAgIHMsLiosaW1wb3J0LAotCQkgICAgcAotCQkgICAgcQotCQl9Ci0JICAgIH0nYAotICAgICAgY2FzZSAkd2luMzJfbm1yZXMgaW4KLSAgICAgIGltcG9ydCopICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiOzsKLSAgICAgICopICAgICAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBzdGF0aWMiOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICAgIDs7Ci0gICpETEwqKQotICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCi0gICAgOzsKLSAgKmV4ZWN1dGFibGUqKSAjIGJ1dCBzaGVsbCBzY3JpcHRzIGFyZSAiZXhlY3V0YWJsZSIgdG9vLi4uCi0gICAgY2FzZSAkd2luMzJfZmlsZXJlcyBpbgotICAgICpNU1wgV2luZG93c1wgUEVcIEludGVsKikKLSAgICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCi0gICAgICA7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0gICRFQ0hPICIkd2luMzJfbGliaWRfdHlwZSIKLX0KLQotCi0KLSMgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgZGlyIG9sZGxpYgotZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgKCkKLXsKLSAgICAkb3B0X2RlYnVnCi0gICAgZl9leF9hbl9hcl9kaXI9IiQxIjsgc2hpZnQKLSAgICBmX2V4X2FuX2FyX29sZGxpYj0iJDEiCi0gICAgaWYgdGVzdCAiJGxvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbiIgPSB5ZXM7IHRoZW4KLSAgICAgIGxvY2tmaWxlPSRmX2V4X2FuX2FyX29sZGxpYi5sb2NrCi0gICAgICB1bnRpbCAkb3B0X2RyeV9ydW4gfHwgbG4gIiRwcm9ncGF0aCIgIiRsb2NrZmlsZSIgMj4vZGV2L251bGw7IGRvCi0JZnVuY19lY2hvICJXYWl0aW5nIGZvciAkbG9ja2ZpbGUgdG8gYmUgcmVtb3ZlZCIKLQlzbGVlcCAyCi0gICAgICBkb25lCi0gICAgZmkKLSAgICBmdW5jX3Nob3dfZXZhbCAiKGNkIFwkZl9leF9hbl9hcl9kaXIgJiYgJEFSIHggXCJcJGZfZXhfYW5fYXJfb2xkbGliXCIpIiBcCi0JCSAgICdzdGF0PSQ/OyBybSAtZiAiJGxvY2tmaWxlIjsgZXhpdCAkc3RhdCcKLSAgICBpZiB0ZXN0ICIkbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uIiA9IHllczsgdGhlbgotICAgICAgJG9wdF9kcnlfcnVuIHx8IHJtIC1mICIkbG9ja2ZpbGUiCi0gICAgZmkKLSAgICBpZiAoJEFSIHQgIiRmX2V4X2FuX2FyX29sZGxpYiIgfCBzb3J0IHwgc29ydCAtdWMgPi9kZXYvbnVsbCAyPiYxKTsgdGhlbgotICAgICA6Ci0gICAgZWxzZQotICAgICAgZnVuY19mYXRhbF9lcnJvciAib2JqZWN0IG5hbWUgY29uZmxpY3RzIGluIGFyY2hpdmU6ICRmX2V4X2FuX2FyX2Rpci8kZl9leF9hbl9hcl9vbGRsaWIiCi0gICAgZmkKLX0KLQotCi0jIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyBnZW50b3Agb2xkbGliIC4uLgotZnVuY19leHRyYWN0X2FyY2hpdmVzICgpCi17Ci0gICAgJG9wdF9kZWJ1ZwotICAgIG15X2dlbnRvcD0iJDEiOyBzaGlmdAotICAgIG15X29sZGxpYnM9JHsxKyIkQCJ9Ci0gICAgbXlfb2xkb2Jqcz0iIgotICAgIG15X3hsaWI9IiIKLSAgICBteV94YWJzPSIiCi0gICAgbXlfeGRpcj0iIgotCi0gICAgZm9yIG15X3hsaWIgaW4gJG15X29sZGxpYnM7IGRvCi0gICAgICAjIEV4dHJhY3QgdGhlIG9iamVjdHMuCi0gICAgICBjYXNlICRteV94bGliIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBteV94YWJzPSIkbXlfeGxpYiIgOzsKLQkqKSBteV94YWJzPWBwd2RgIi8kbXlfeGxpYiIgOzsKLSAgICAgIGVzYWMKLSAgICAgIGZ1bmNfYmFzZW5hbWUgIiRteV94bGliIgotICAgICAgbXlfeGxpYj0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotICAgICAgbXlfeGxpYl91PSRteV94bGliCi0gICAgICB3aGlsZSA6OyBkbwotICAgICAgICBjYXNlICIgJGV4dHJhY3RlZF9hcmNoaXZlcyAiIGluCi0JKiIgJG15X3hsaWJfdSAiKikKLQkgIGZ1bmNfYXJpdGggJGV4dHJhY3RlZF9zZXJpYWwgKyAxCi0JICBleHRyYWN0ZWRfc2VyaWFsPSRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgbXlfeGxpYl91PWx0JGV4dHJhY3RlZF9zZXJpYWwtJG15X3hsaWIgOzsKLQkqKSBicmVhayA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgIGV4dHJhY3RlZF9hcmNoaXZlcz0iJGV4dHJhY3RlZF9hcmNoaXZlcyAkbXlfeGxpYl91IgotICAgICAgbXlfeGRpcj0iJG15X2dlbnRvcC8kbXlfeGxpYl91IgotCi0gICAgICBmdW5jX21rZGlyX3AgIiRteV94ZGlyIgotCi0gICAgICBjYXNlICRob3N0IGluCi0gICAgICAqLWRhcndpbiopCi0JZnVuY192ZXJib3NlICJFeHRyYWN0aW5nICRteV94YWJzIgotCSMgRG8gbm90IGJvdGhlciBkb2luZyBhbnl0aGluZyBpZiBqdXN0IGEgZHJ5IHJ1bgotCSRvcHRfZHJ5X3J1biB8fCB7Ci0JICBkYXJ3aW5fb3JpZ19kaXI9YHB3ZGAKLQkgIGNkICRteV94ZGlyIHx8IGV4aXQgJD8KLQkgIGRhcndpbl9hcmNoaXZlPSRteV94YWJzCi0JICBkYXJ3aW5fY3VyZGlyPWBwd2RgCi0JICBkYXJ3aW5fYmFzZV9hcmNoaXZlPWBiYXNlbmFtZSAiJGRhcndpbl9hcmNoaXZlImAKLQkgIGRhcndpbl9hcmNoZXM9YCRMSVBPIC1pbmZvICIkZGFyd2luX2FyY2hpdmUiIDI+L2Rldi9udWxsIHwgJEdSRVAgQXJjaGl0ZWN0dXJlcyAyPi9kZXYvbnVsbCB8fCB0cnVlYAotCSAgaWYgdGVzdCAtbiAiJGRhcndpbl9hcmNoZXMiOyB0aGVuCi0JICAgIGRhcndpbl9hcmNoZXM9YCRFQ0hPICIkZGFyd2luX2FyY2hlcyIgfCAkU0VEIC1lICdzLy4qYXJlOi8vJ2AKLQkgICAgZGFyd2luX2FyY2g9Ci0JICAgIGZ1bmNfdmVyYm9zZSAiJGRhcndpbl9iYXNlX2FyY2hpdmUgaGFzIG11bHRpcGxlIGFyY2hpdGVjdHVyZXMgJGRhcndpbl9hcmNoZXMiCi0JICAgIGZvciBkYXJ3aW5fYXJjaCBpbiAgJGRhcndpbl9hcmNoZXMgOyBkbwotCSAgICAgIGZ1bmNfbWtkaXJfcCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofSIKLQkgICAgICAkTElQTyAtdGhpbiAkZGFyd2luX2FyY2ggLW91dHB1dCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofS8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9IiAiJHtkYXJ3aW5fYXJjaGl2ZX0iCi0JICAgICAgY2QgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0iCi0JICAgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgImBwd2RgIiAiJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIKLQkgICAgICBjZCAiJGRhcndpbl9jdXJkaXIiCi0JICAgICAgJFJNICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9LyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iCi0JICAgIGRvbmUgIyAkZGFyd2luX2FyY2hlcwotICAgICAgICAgICAgIyMgT2theSBub3cgd2UndmUgYSBidW5jaCBvZiB0aGluIG9iamVjdHMsIGdvdHRhIGZhdHRlbiB0aGVtIHVwIDopCi0JICAgIGRhcndpbl9maWxlbGlzdD1gZmluZCB1bmZhdC0kJCAtdHlwZSBmIC1uYW1lIFwqLm8gLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludCB8ICRTRUQgLWUgIiRiYXNlbmFtZSIgfCBzb3J0IC11YAotCSAgICBkYXJ3aW5fZmlsZT0KLQkgICAgZGFyd2luX2ZpbGVzPQotCSAgICBmb3IgZGFyd2luX2ZpbGUgaW4gJGRhcndpbl9maWxlbGlzdDsgZG8KLQkgICAgICBkYXJ3aW5fZmlsZXM9YGZpbmQgdW5mYXQtJCQgLW5hbWUgJGRhcndpbl9maWxlIC1wcmludCB8IHNvcnQgfCAkTkwyU1BgCi0JICAgICAgJExJUE8gLWNyZWF0ZSAtb3V0cHV0ICIkZGFyd2luX2ZpbGUiICRkYXJ3aW5fZmlsZXMKLQkgICAgZG9uZSAjICRkYXJ3aW5fZmlsZWxpc3QKLQkgICAgJFJNIC1yZiB1bmZhdC0kJAotCSAgICBjZCAiJGRhcndpbl9vcmlnX2RpciIKLQkgIGVsc2UKLQkgICAgY2QgJGRhcndpbl9vcmlnX2RpcgotCSAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiJG15X3hkaXIiICIkbXlfeGFicyIKLQkgIGZpICMgJGRhcndpbl9hcmNoZXMKLQl9ICMgISRvcHRfZHJ5X3J1bgotCTs7Ci0gICAgICAqKQotICAgICAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiJG15X3hkaXIiICIkbXlfeGFicyIKLQk7OwotICAgICAgZXNhYwotICAgICAgbXlfb2xkb2Jqcz0iJG15X29sZG9ianMgImBmaW5kICRteV94ZGlyIC1uYW1lIFwqLiRvYmpleHQgLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludCB8IHNvcnQgfCAkTkwyU1BgCi0gICAgZG9uZQotCi0gICAgZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdD0iJG15X29sZG9ianMiCi19Ci0KLQotIyBmdW5jX2VtaXRfd3JhcHBlciBbYXJnPW5vXQotIwotIyBFbWl0IGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBvbiBzdGRvdXQuCi0jIERvbid0IGRpcmVjdGx5IG9wZW4gYSBmaWxlIGJlY2F1c2Ugd2UgbWF5IHdhbnQgdG8KLSMgaW5jb3Jwb3JhdGUgdGhlIHNjcmlwdCBjb250ZW50cyB3aXRoaW4gYSBjeWd3aW4vbWluZ3cKLSMgd3JhcHBlciBleGVjdXRhYmxlLiAgTXVzdCBPTkxZIGJlIGNhbGxlZCBmcm9tIHdpdGhpbgotIyBmdW5jX21vZGVfbGluayBiZWNhdXNlIGl0IGRlcGVuZHMgb24gYSBudW1iZXIgb2YgdmFyaWFibGVzCi0jIHNldCB0aGVyZWluLgotIwotIyBBUkcgaXMgdGhlIHZhbHVlIHRoYXQgdGhlIFdSQVBQRVJfU0NSSVBUX0JFTE9OR1NfSU5fT0JKRElSCi0jIHZhcmlhYmxlIHdpbGwgdGFrZS4gIElmICd5ZXMnLCB0aGVuIHRoZSBlbWl0dGVkIHNjcmlwdAotIyB3aWxsIGFzc3VtZSB0aGF0IHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggaXQgaXMgc3RvcmVkIGlzCi0jIHRoZSAkb2JqZGlyIGRpcmVjdG9yeS4gIFRoaXMgaXMgYSBjeWd3aW4vbWluZ3ctc3BlY2lmaWMKLSMgYmVoYXZpb3IuCi1mdW5jX2VtaXRfd3JhcHBlciAoKQotewotCWZ1bmNfZW1pdF93cmFwcGVyX2FyZzE9JHsxLW5vfQotCi0JJEVDSE8gIlwKLSMhICRTSEVMTAotCi0jICRvdXRwdXQgLSB0ZW1wb3Jhcnkgd3JhcHBlciBzY3JpcHQgZm9yICRvYmpkaXIvJG91dHB1dG5hbWUKLSMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgotIwotIyBUaGUgJG91dHB1dCBwcm9ncmFtIGNhbm5vdCBiZSBkaXJlY3RseSBleGVjdXRlZCB1bnRpbCBhbGwgdGhlIGxpYnRvb2wKLSMgbGlicmFyaWVzIHRoYXQgaXQgZGVwZW5kcyBvbiBhcmUgaW5zdGFsbGVkLgotIwotIyBUaGlzIHdyYXBwZXIgc2NyaXB0IHNob3VsZCBuZXZlciBiZSBtb3ZlZCBvdXQgb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KLSMgSWYgaXQgaXMsIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5LgotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JwotCi0jIEJlIEJvdXJuZSBjb21wYXRpYmxlCi1pZiB0ZXN0IC1uIFwiXCR7WlNIX1ZFUlNJT04rc2V0fVwiICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gXCR7MStcIlwkQFwifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJ1wkezErXCJcJEBcIn0nPSdcIlwkQFwiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIFxgKHNldCAtbykgMj4vZGV2L251bGxcYCBpbiAqcG9zaXgqKSBzZXQgLW8gcG9zaXg7OyBlc2FjCi1maQotQklOX1NIPXhwZzQ7IGV4cG9ydCBCSU5fU0ggIyBmb3IgVHJ1NjQKLURVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIgotCi0jIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgZGV0ZXJtaW5lcyBvdXIgb3BlcmF0aW9uIG1vZGUuCi1pZiB0ZXN0IFwiXCRsaWJ0b29sX2luc3RhbGxfbWFnaWNcIiA9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgIyBpbnN0YWxsIG1vZGUgbmVlZHMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6Ci0gIGdlbmVyYXRlZF9ieV9saWJ0b29sX3ZlcnNpb249JyRtYWNyb192ZXJzaW9uJwotICBub3RpbnN0X2RlcGxpYnM9JyRub3RpbnN0X2RlcGxpYnMnCi1lbHNlCi0gICMgV2hlbiB3ZSBhcmUgc291cmNlZCBpbiBleGVjdXRlIG1vZGUsIFwkZmlsZSBhbmQgXCRFQ0hPIGFyZSBhbHJlYWR5IHNldC4KLSAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgotICAgIGZpbGU9XCJcJDBcIiIKLQotICAgIHFFQ0hPPWAkRUNITyAiJEVDSE8iIHwgJFNFRCAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgJEVDSE8gIlwKLQotIyBBIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIHByaW50IGJ1aWx0aW4gb3IgcHJpbnRmLgotZnVuY19mYWxsYmFja19lY2hvICgpCi17Ci0gIGV2YWwgJ2NhdCA8PF9MVEVDSE9fRU9GCi1cJDEKLV9MVEVDSE9fRU9GJwotfQotICAgIEVDSE89XCIkcUVDSE9cIgotICBmaQotCi0jIFZlcnkgYmFzaWMgb3B0aW9uIHBhcnNpbmcuIFRoZXNlIG9wdGlvbnMgYXJlIChhKSBzcGVjaWZpYyB0bwotIyB0aGUgbGlidG9vbCB3cmFwcGVyLCAoYikgYXJlIGlkZW50aWNhbCBiZXR3ZWVuIHRoZSB3cmFwcGVyCi0jIC9zY3JpcHQvIGFuZCB0aGUgd3JhcHBlciAvZXhlY3V0YWJsZS8gd2hpY2ggaXMgdXNlZCBvbmx5IG9uCi0jIHdpbmRvd3MgcGxhdGZvcm1zLCBhbmQgKGMpIGFsbCBiZWdpbiB3aXRoIHRoZSBzdHJpbmcgIi0tbHQtIgotIyAoYXBwbGljYXRpb24gcHJvZ3JhbXMgYXJlIHVubGlrZWx5IHRvIGhhdmUgb3B0aW9ucyB3aGljaCBtYXRjaAotIyB0aGlzIHBhdHRlcm4pLgotIwotIyBUaGVyZSBhcmUgb25seSB0d28gc3VwcG9ydGVkIG9wdGlvbnM6IC0tbHQtZGVidWcgYW5kCi0jIC0tbHQtZHVtcC1zY3JpcHQuIFRoZXJlIGlzLCBkZWxpYmVyYXRlbHksIG5vIC0tbHQtaGVscC4KLSMKLSMgVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoaXMgcGFyc2luZyBmdW5jdGlvbiBzaG91bGQgYmUgdGhlCi0jIHNjcmlwdCdzICQwIHZhbHVlLCBmb2xsb3dlZCBieSAiJEAiLgotbHRfb3B0aW9uX2RlYnVnPQotZnVuY19wYXJzZV9sdF9vcHRpb25zICgpCi17Ci0gIGx0X3NjcmlwdF9hcmcwPVwkMAotICBzaGlmdAotICBmb3IgbHRfb3B0Ci0gIGRvCi0gICAgY2FzZSBcIlwkbHRfb3B0XCIgaW4KLSAgICAtLWx0LWRlYnVnKSBsdF9vcHRpb25fZGVidWc9MSA7OwotICAgIC0tbHQtZHVtcC1zY3JpcHQpCi0gICAgICAgIGx0X2R1bXBfRD1cYFwkRUNITyBcIlhcJGx0X3NjcmlwdF9hcmcwXCIgfCAkU0VEIC1lICdzL15YLy8nIC1lICdzJS9bXi9dKiQlJSdcYAotICAgICAgICB0ZXN0IFwiWFwkbHRfZHVtcF9EXCIgPSBcIlhcJGx0X3NjcmlwdF9hcmcwXCIgJiYgbHRfZHVtcF9EPS4KLSAgICAgICAgbHRfZHVtcF9GPVxgXCRFQ0hPIFwiWFwkbHRfc2NyaXB0X2FyZzBcIiB8ICRTRUQgLWUgJ3MvXlgvLycgLWUgJ3MlXi4qLyUlJ1xgCi0gICAgICAgIGNhdCBcIlwkbHRfZHVtcF9EL1wkbHRfZHVtcF9GXCIKLSAgICAgICAgZXhpdCAwCi0gICAgICA7OwotICAgIC0tbHQtKikKLSAgICAgICAgXCRFQ0hPIFwiVW5yZWNvZ25pemVkIC0tbHQtIG9wdGlvbjogJ1wkbHRfb3B0J1wiIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gICMgUHJpbnQgdGhlIGRlYnVnIGJhbm5lciBpbW1lZGlhdGVseToKLSAgaWYgdGVzdCAtbiBcIlwkbHRfb3B0aW9uX2RlYnVnXCI7IHRoZW4KLSAgICBlY2hvIFwiJHtvdXRwdXRuYW1lfToke291dHB1dH06XCR7TElORU5PfTogbGlidG9vbCB3cmFwcGVyIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTlwiIDE+JjIKLSAgZmkKLX0KLQotIyBVc2VkIHdoZW4gLS1sdC1kZWJ1Zy4gUHJpbnRzIGl0cyBhcmd1bWVudHMgdG8gc3Rkb3V0Ci0jIChyZWRpcmVjdGlvbiBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlcikKLWZ1bmNfbHRfZHVtcF9hcmdzICgpCi17Ci0gIGx0X2R1bXBfYXJnc19OPTE7Ci0gIGZvciBsdF9hcmcKLSAgZG8KLSAgICBcJEVDSE8gXCIke291dHB1dG5hbWV9OiR7b3V0cHV0fTpcJHtMSU5FTk99OiBuZXdhcmd2W1wkbHRfZHVtcF9hcmdzX05dOiBcJGx0X2FyZ1wiCi0gICAgbHRfZHVtcF9hcmdzX049XGBleHByIFwkbHRfZHVtcF9hcmdzX04gKyAxXGAKLSAgZG9uZQotfQotCi0jIENvcmUgZnVuY3Rpb24gZm9yIGxhdW5jaGluZyB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uCi1mdW5jX2V4ZWNfcHJvZ3JhbV9jb3JlICgpCi17Ci0iCi0gIGNhc2UgJGhvc3QgaW4KLSAgIyBCYWNrc2xhc2hlcyBzZXBhcmF0ZSBkaXJlY3RvcmllcyBvbiBwbGFpbiB3aW5kb3dzCi0gICotKi1taW5ndyB8ICotKi1vczIqIHwgKi1jZWdjYyopCi0gICAgJEVDSE8gIlwKLSAgICAgIGlmIHRlc3QgLW4gXCJcJGx0X29wdGlvbl9kZWJ1Z1wiOyB0aGVuCi0gICAgICAgIFwkRUNITyBcIiR7b3V0cHV0bmFtZX06JHtvdXRwdXR9Olwke0xJTkVOT306IG5ld2FyZ3ZbMF06IFwkcHJvZ2RpclxcXFxcJHByb2dyYW1cIiAxPiYyCi0gICAgICAgIGZ1bmNfbHRfZHVtcF9hcmdzIFwkezErXCJcJEBcIn0gMT4mMgotICAgICAgZmkKLSAgICAgIGV4ZWMgXCJcJHByb2dkaXJcXFxcXCRwcm9ncmFtXCIgXCR7MStcIlwkQFwifQotIgotICAgIDs7Ci0KLSAgKikKLSAgICAkRUNITyAiXAotICAgICAgaWYgdGVzdCAtbiBcIlwkbHRfb3B0aW9uX2RlYnVnXCI7IHRoZW4KLSAgICAgICAgXCRFQ0hPIFwiJHtvdXRwdXRuYW1lfToke291dHB1dH06XCR7TElORU5PfTogbmV3YXJndlswXTogXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIDE+JjIKLSAgICAgICAgZnVuY19sdF9kdW1wX2FyZ3MgXCR7MStcIlwkQFwifSAxPiYyCi0gICAgICBmaQotICAgICAgZXhlYyBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcJHsxK1wiXCRAXCJ9Ci0iCi0gICAgOzsKLSAgZXNhYwotICAkRUNITyAiXAotICAgICAgXCRFQ0hPIFwiXCQwOiBjYW5ub3QgZXhlYyBcJHByb2dyYW0gXCQqXCIgMT4mMgotICAgICAgZXhpdCAxCi19Ci0KLSMgQSBmdW5jdGlvbiB0byBlbmNhcHN1bGF0ZSBsYXVuY2hpbmcgdGhlIHRhcmdldCBhcHBsaWNhdGlvbgotIyBTdHJpcHMgb3B0aW9ucyBpbiB0aGUgLS1sdC0qIG5hbWVzcGFjZSBmcm9tIFwkQCBhbmQKLSMgbGF1bmNoZXMgdGFyZ2V0IGFwcGxpY2F0aW9uIHdpdGggdGhlIHJlbWFpbmluZyBhcmd1bWVudHMuCi1mdW5jX2V4ZWNfcHJvZ3JhbSAoKQotewotICBmb3IgbHRfd3JfYXJnCi0gIGRvCi0gICAgY2FzZSBcJGx0X3dyX2FyZyBpbgotICAgIC0tbHQtKikgOzsKLSAgICAqKSBzZXQgeCBcIlwkQFwiIFwiXCRsdF93cl9hcmdcIjsgc2hpZnQ7OwotICAgIGVzYWMKLSAgICBzaGlmdAotICBkb25lCi0gIGZ1bmNfZXhlY19wcm9ncmFtX2NvcmUgXCR7MStcIlwkQFwifQotfQotCi0gICMgUGFyc2Ugb3B0aW9ucwotICBmdW5jX3BhcnNlX2x0X29wdGlvbnMgXCJcJDBcIiBcJHsxK1wiXCRAXCJ9Ci0KLSAgIyBGaW5kIHRoZSBkaXJlY3RvcnkgdGhhdCB0aGlzIHNjcmlwdCBsaXZlcyBpbi4KLSAgdGhpc2Rpcj1cYFwkRUNITyBcIlwkZmlsZVwiIHwgJFNFRCAncyUvW14vXSokJSUnXGAKLSAgdGVzdCBcInhcJHRoaXNkaXJcIiA9IFwieFwkZmlsZVwiICYmIHRoaXNkaXI9LgotCi0gICMgRm9sbG93IHN5bWJvbGljIGxpbmtzIHVudGlsIHdlIGdldCB0byB0aGUgcmVhbCB0aGlzZGlyLgotICBmaWxlPVxgbHMgLWxkIFwiXCRmaWxlXCIgfCAkU0VEIC1uICdzLy4qLT4gLy9wJ1xgCi0gIHdoaWxlIHRlc3QgLW4gXCJcJGZpbGVcIjsgZG8KLSAgICBkZXN0ZGlyPVxgXCRFQ0hPIFwiXCRmaWxlXCIgfCAkU0VEICdzJS9bXi9dKlwkJSUnXGAKLQotICAgICMgSWYgdGhlcmUgd2FzIGEgZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBjaGFuZ2UgdGhpc2Rpci4KLSAgICBpZiB0ZXN0IFwieFwkZGVzdGRpclwiICE9IFwieFwkZmlsZVwiOyB0aGVuCi0gICAgICBjYXNlIFwiXCRkZXN0ZGlyXCIgaW4KLSAgICAgIFtcXFxcL10qIHwgW0EtWmEtel06W1xcXFwvXSopIHRoaXNkaXI9XCJcJGRlc3RkaXJcIiA7OwotICAgICAgKikgdGhpc2Rpcj1cIlwkdGhpc2Rpci9cJGRlc3RkaXJcIiA7OwotICAgICAgZXNhYwotICAgIGZpCi0KLSAgICBmaWxlPVxgXCRFQ0hPIFwiXCRmaWxlXCIgfCAkU0VEICdzJV4uKi8lJSdcYAotICAgIGZpbGU9XGBscyAtbGQgXCJcJHRoaXNkaXIvXCRmaWxlXCIgfCAkU0VEIC1uICdzLy4qLT4gLy9wJ1xgCi0gIGRvbmUKLQotICAjIFVzdWFsbHkgJ25vJywgZXhjZXB0IG9uIGN5Z3dpbi9taW5ndyB3aGVuIGVtYmVkZGVkIGludG8KLSAgIyB0aGUgY3dyYXBwZXIuCi0gIFdSQVBQRVJfU0NSSVBUX0JFTE9OR1NfSU5fT0JKRElSPSRmdW5jX2VtaXRfd3JhcHBlcl9hcmcxCi0gIGlmIHRlc3QgXCJcJFdSQVBQRVJfU0NSSVBUX0JFTE9OR1NfSU5fT0JKRElSXCIgPSBcInllc1wiOyB0aGVuCi0gICAgIyBzcGVjaWFsIGNhc2UgZm9yICcuJwotICAgIGlmIHRlc3QgXCJcJHRoaXNkaXJcIiA9IFwiLlwiOyB0aGVuCi0gICAgICB0aGlzZGlyPVxgcHdkXGAKLSAgICBmaQotICAgICMgcmVtb3ZlIC5saWJzIGZyb20gdGhpc2RpcgotICAgIGNhc2UgXCJcJHRoaXNkaXJcIiBpbgotICAgICpbXFxcXC9dJG9iamRpciApIHRoaXNkaXI9XGBcJEVDSE8gXCJcJHRoaXNkaXJcIiB8ICRTRUQgJ3MlW1xcXFwvXVteXFxcXC9dKiQlJSdcYCA7OwotICAgICRvYmpkaXIgKSAgIHRoaXNkaXI9LiA7OwotICAgIGVzYWMKLSAgZmkKLQotICAjIFRyeSB0byBnZXQgdGhlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lLgotICBhYnNkaXI9XGBjZCBcIlwkdGhpc2RpclwiICYmIHB3ZFxgCi0gIHRlc3QgLW4gXCJcJGFic2RpclwiICYmIHRoaXNkaXI9XCJcJGFic2RpclwiCi0iCi0KLQlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgotCSAgJEVDSE8gIlwKLSAgcHJvZ3JhbT1sdC0nJG91dHB1dG5hbWUnJGV4ZWV4dAotICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgotCi0gIGlmIHRlc3QgISAtZiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiB8fAotICAgICB7IGZpbGU9XGBscyAtMWR0IFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwiXCRwcm9nZGlyLy4uL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHwgJHtTRUR9IDFxXGA7IFxcCi0gICAgICAgdGVzdCBcIlhcJGZpbGVcIiAhPSBcIlhcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH07IHRoZW4KLQotICAgIGZpbGU9XCJcJFwkLVwkcHJvZ3JhbVwiCi0KLSAgICBpZiB0ZXN0ICEgLWQgXCJcJHByb2dkaXJcIjsgdGhlbgotICAgICAgJE1LRElSIFwiXCRwcm9nZGlyXCIKLSAgICBlbHNlCi0gICAgICAkUk0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLSAgICBmaSIKLQotCSAgJEVDSE8gIlwKLQotICAgICMgcmVsaW5rIGV4ZWN1dGFibGUgaWYgbmVjZXNzYXJ5Ci0gICAgaWYgdGVzdCAtbiBcIlwkcmVsaW5rX2NvbW1hbmRcIjsgdGhlbgotICAgICAgaWYgcmVsaW5rX2NvbW1hbmRfb3V0cHV0PVxgZXZhbCBcJHJlbGlua19jb21tYW5kIDI+JjFcYDsgdGhlbiA6Ci0gICAgICBlbHNlCi0JJEVDSE8gXCJcJHJlbGlua19jb21tYW5kX291dHB1dFwiID4mMgotCSRSTSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotCWV4aXQgMQotICAgICAgZmkKLSAgICBmaQotCi0gICAgJE1WIFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHx8Ci0gICAgeyAkUk0gXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7Ci0gICAgICAkTVYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH0KLSAgICAkUk0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLSAgZmkiCi0JZWxzZQotCSAgJEVDSE8gIlwKLSAgcHJvZ3JhbT0nJG91dHB1dG5hbWUnCi0gIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCi0iCi0JZmkKLQotCSRFQ0hPICJcCi0KLSAgaWYgdGVzdCAtZiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgdGhlbiIKLQotCSMgRXhwb3J0IG91ciBzaGxpYnBhdGhfdmFyIGlmIHdlIGhhdmUgb25lLgotCWlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzICYmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkdGVtcF9ycGF0aCI7IHRoZW4KLQkgICRFQ0hPICJcCi0gICAgIyBBZGQgb3VyIG93biBsaWJyYXJ5IHBhdGggdG8gJHNobGlicGF0aF92YXIKLSAgICAkc2hsaWJwYXRoX3Zhcj1cIiR0ZW1wX3JwYXRoXCQkc2hsaWJwYXRoX3ZhclwiCi0KLSAgICAjIFNvbWUgc3lzdGVtcyBjYW5ub3QgY29wZSB3aXRoIGNvbG9uLXRlcm1pbmF0ZWQgJHNobGlicGF0aF92YXIKLSAgICAjIFRoZSBzZWNvbmQgY29sb24gaXMgYSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiBCZU9TIFI0IHNlZAotICAgICRzaGxpYnBhdGhfdmFyPVxgXCRFQ0hPIFwiXCQkc2hsaWJwYXRoX3ZhclwiIHwgJFNFRCAncy86OipcJC8vJ1xgCi0KLSAgICBleHBvcnQgJHNobGlicGF0aF92YXIKLSIKLQlmaQotCi0JIyBmaXh1cCB0aGUgZGxsIHNlYXJjaHBhdGggaWYgd2UgbmVlZCB0by4KLQlpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KLQkgICRFQ0hPICJcCi0gICAgIyBBZGQgdGhlIGRsbCBzZWFyY2ggcGF0aCBjb21wb25lbnRzIHRvIHRoZSBleGVjdXRhYmxlIFBBVEgKLSAgICBQQVRIPSRkbGxzZWFyY2hwYXRoOlwkUEFUSAotIgotCWZpCi0KLQkkRUNITyAiXAotICAgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgICAgICMgUnVuIHRoZSBhY3R1YWwgcHJvZ3JhbSB3aXRoIG91ciBhcmd1bWVudHMuCi0gICAgICBmdW5jX2V4ZWNfcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9Ci0gICAgZmkKLSAgZWxzZQotICAgICMgVGhlIHByb2dyYW0gZG9lc24ndCBleGlzdC4KLSAgICBcJEVDSE8gXCJcJDA6IGVycm9yOiBcXFxgXCRwcm9nZGlyL1wkcHJvZ3JhbScgZG9lcyBub3QgZXhpc3RcIiAxPiYyCi0gICAgXCRFQ0hPIFwiVGhpcyBzY3JpcHQgaXMganVzdCBhIHdyYXBwZXIgZm9yIFwkcHJvZ3JhbS5cIiAxPiYyCi0gICAgXCRFQ0hPIFwiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLWZpXAotIgotfQotCi0KLSMgZnVuY190b19ob3N0X3BhdGggYXJnCi0jCi0jIENvbnZlcnQgcGF0aHMgdG8gaG9zdCBmb3JtYXQgd2hlbiB1c2VkIHdpdGggYnVpbGQgdG9vbHMuCi0jIEludGVuZGVkIGZvciB1c2Ugd2l0aCAibmF0aXZlIiBtaW5ndyAod2hlcmUgbGlidG9vbCBpdHNlbGYKLSMgaXMgcnVubmluZyB1bmRlciB0aGUgbXN5cyBzaGVsbCksIG9yIGluIHRoZSBmb2xsb3dpbmcgY3Jvc3MtCi0jIGJ1aWxkIGVudmlyb25tZW50czoKLSMgICAgJGJ1aWxkICAgICAgICAgICRob3N0Ci0jICAgIG1pbmd3IChtc3lzKSAgICBtaW5ndyAgW2UuZy4gbmF0aXZlXQotIyAgICBjeWd3aW4gICAgICAgICAgbWluZ3cKLSMgICAgKm5peCArIHdpbmUgICAgIG1pbmd3Ci0jIHdoZXJlIHdpbmUgaXMgZXF1aXBwZWQgd2l0aCB0aGUgYHdpbmVwYXRoJyBleGVjdXRhYmxlLgotIyBJbiB0aGUgbmF0aXZlIG1pbmd3IGNhc2UsIHRoZSAobXN5cykgc2hlbGwgYXV0b21hdGljYWxseQotIyBjb252ZXJ0cyBwYXRocyBmb3IgYW55IG5vbi1tc3lzIGFwcGxpY2F0aW9ucyBpdCBsYXVuY2hlcywKLSMgYnV0IHRoYXQgZmFjaWxpdHkgaXNuJ3QgYXZhaWxhYmxlIGZyb20gaW5zaWRlIHRoZSBjd3JhcHBlci4KLSMgU2ltaWxhciBhY2NvbW1vZGF0aW9ucyBhcmUgbmVjZXNzYXJ5IGZvciAkaG9zdCBtaW5ndyBhbmQKLSMgJGJ1aWxkIGN5Z3dpbi4gIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBkb2VzIG5vIGhhcm0gZm9yIG90aGVyCi0jICRob3N0LyRidWlsZCBjb21iaW5hdGlvbnMgbm90IGxpc3RlZCBhYm92ZS4KLSMKLSMgQVJHIGlzIHRoZSBwYXRoIChvbiAkYnVpbGQpIHRoYXQgc2hvdWxkIGJlIGNvbnZlcnRlZCB0bwotIyB0aGUgcHJvcGVyIHJlcHJlc2VudGF0aW9uIGZvciAkaG9zdC4gVGhlIHJlc3VsdCBpcyBzdG9yZWQKLSMgaW4gJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdC4KLWZ1bmNfdG9faG9zdF9wYXRoICgpCi17Ci0gIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDEiCi0gIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgotICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICptaW5ndyogKQotICAgICAgICBsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5PSdzfFxcXFwqfFxcfGc7c3wvfFxcfGc7c3xcXHxcXFxcfGcnCi0gICAgICAgIGNhc2UgJGJ1aWxkIGluCi0gICAgICAgICAgKm1pbmd3KiApICMgYWN0dWFsbHksIG1zeXMKLSAgICAgICAgICAgICMgYXdrd2FyZDogY21kIGFwcGVuZHMgc3BhY2VzIHRvIHJlc3VsdAotICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PWAoIGNtZCAvL2MgZWNobyAiJDEiICkgMj4vZGV2L251bGwgfAotICAgICAgICAgICAgICAkU0VEIC1lICdzL1sgXSokLy8nIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCi0gICAgICAgICAgICA7OwotICAgICAgICAgICpjeWd3aW4qICkKLSAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD1gY3lncGF0aCAtdyAiJDEiIHwKLQkgICAgICAkU0VEIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCi0gICAgICAgICAgICA7OwotICAgICAgICAgICogKQotICAgICAgICAgICAgIyBVbmZvcnR1bmF0ZWx5LCB3aW5lcGF0aCBkb2VzIG5vdCBleGl0IHdpdGggYSBub24temVybwotICAgICAgICAgICAgIyBlcnJvciBjb2RlLCBzbyB3ZSBhcmUgZm9yY2VkIHRvIGNoZWNrIHRoZSBjb250ZW50cyBvZgotICAgICAgICAgICAgIyBzdGRvdXQuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgY29tbWFuZCBpcyBub3QKLSAgICAgICAgICAgICMgZm91bmQsIHRoZSBzaGVsbCB3aWxsIHNldCBhbiBleGl0IGNvZGUgb2YgMTI3IGFuZCBwcmludAotICAgICAgICAgICAgIyAqYW4gZXJyb3IgbWVzc2FnZSogdG8gc3Rkb3V0LiBTbyB3ZSBtdXN0IGNoZWNrIGZvciBib3RoCi0gICAgICAgICAgICAjIGVycm9yIGNvZGUgb2YgemVybyBBTkQgbm9uLWVtcHR5IHN0ZG91dCwgd2hpY2ggZXhwbGFpbnMKLSAgICAgICAgICAgICMgdGhlIG9kZCBjb25zdHJ1Y3Rpb246Ci0gICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aF90bXAxPWB3aW5lcGF0aCAtdyAiJDEiIDI+L2Rldi9udWxsYAotICAgICAgICAgICAgaWYgdGVzdCAiJD8iIC1lcSAwICYmIHRlc3QgLW4gIiR7ZnVuY190b19ob3N0X3BhdGhfdG1wMX0iOyB0aGVuCi0gICAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD1gJEVDSE8gIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIiB8Ci0gICAgICAgICAgICAgICAgJFNFRCAtZSAiJGx0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnkiYAotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAjIEFsbG93IHdhcm5pbmcgYmVsb3cuCi0gICAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0KLSAgICAgICAgICAgIGZpCi0gICAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgICAgIGlmIHRlc3QgLXogIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiIDsgdGhlbgotICAgICAgICAgIGZ1bmNfZXJyb3IgIkNvdWxkIG5vdCBkZXRlcm1pbmUgaG9zdCBwYXRoIGNvcnJlc3BvbmRpbmcgdG8iCi0gICAgICAgICAgZnVuY19lcnJvciAiICBcYCQxJyIKLSAgICAgICAgICBmdW5jX2Vycm9yICJDb250aW51aW5nLCBidXQgdW5pbnN0YWxsZWQgZXhlY3V0YWJsZXMgbWF5IG5vdCB3b3JrLiIKLSAgICAgICAgICAjIEZhbGxiYWNrOgotICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDEiCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotfQotIyBlbmQ6IGZ1bmNfdG9faG9zdF9wYXRoCi0KLSMgZnVuY190b19ob3N0X3BhdGhsaXN0IGFyZwotIwotIyBDb252ZXJ0IHBhdGhsaXN0cyB0byBob3N0IGZvcm1hdCB3aGVuIHVzZWQgd2l0aCBidWlsZCB0b29scy4KLSMgU2VlIGZ1bmNfdG9faG9zdF9wYXRoKCksIGFib3ZlLiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIHRoZQotIyBmb2xsb3dpbmcgJGJ1aWxkLyRob3N0IGNvbWJpbmF0aW9ucyAoYnV0IGRvZXMgbm8gaGFybSBmb3IKLSMgY29tYmluYXRpb25zIG5vdCBsaXN0ZWQgaGVyZSk6Ci0jICAgICRidWlsZCAgICAgICAgICAkaG9zdAotIyAgICBtaW5ndyAobXN5cykgICAgbWluZ3cgIFtlLmcuIG5hdGl2ZV0KLSMgICAgY3lnd2luICAgICAgICAgIG1pbmd3Ci0jICAgICpuaXggKyB3aW5lICAgICBtaW5ndwotIwotIyBQYXRoIHNlcGFyYXRvcnMgYXJlIGFsc28gY29udmVydGVkIGZyb20gJGJ1aWxkIGZvcm1hdCB0bwotIyAkaG9zdCBmb3JtYXQuIElmIEFSRyBiZWdpbnMgb3IgZW5kcyB3aXRoIGEgcGF0aCBzZXBhcmF0b3IKLSMgY2hhcmFjdGVyLCBpdCBpcyBwcmVzZXJ2ZWQgKGJ1dCBjb252ZXJ0ZWQgdG8gJGhvc3QgZm9ybWF0KQotIyBvbiBvdXRwdXQuCi0jCi0jIEFSRyBpcyBhIHBhdGhsaXN0IChvbiAkYnVpbGQpIHRoYXQgc2hvdWxkIGJlIGNvbnZlcnRlZCB0bwotIyB0aGUgcHJvcGVyIHJlcHJlc2VudGF0aW9uIG9uICRob3N0LiBUaGUgcmVzdWx0IGlzIHN0b3JlZAotIyBpbiAkZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdC4KLWZ1bmNfdG9faG9zdF9wYXRobGlzdCAoKQotewotICBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0PSIkMSIKLSAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCi0gICAgY2FzZSAkaG9zdCBpbgotICAgICAgKm1pbmd3KiApCi0gICAgICAgIGx0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnk9J3N8XFxcXCp8XFx8ZztzfC98XFx8ZztzfFxcfFxcXFx8ZycKLSAgICAgICAgIyBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IgY2hhcmFjdGVycyBmcm9tCi0gICAgICAgICMgQVJHLiBtc3lzIGJlaGF2aW9yIGlzIGluY29uc2lzdGVudCBoZXJlLCBjeWdwYXRoIHR1cm5zIHRoZW0KLSAgICAgICAgIyBpbnRvICcuOycgYW5kICc7LicsIGFuZCB3aW5lcGF0aCBpZ25vcmVzIHRoZW0gY29tcGxldGVseS4KLQlmdW5jX3N0cmlwbmFtZSA6IDogIiQxIgotICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfdG1wMT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0gICAgICAgIGNhc2UgJGJ1aWxkIGluCi0gICAgICAgICAgKm1pbmd3KiApICMgQWN0dWFsbHksIG1zeXMuCi0gICAgICAgICAgICAjIEF3a3dhcmQ6IGNtZCBhcHBlbmRzIHNwYWNlcyB0byByZXN1bHQuCi0gICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0PWAKLQkgICAgICAoIGNtZCAvL2MgZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAxIiApIDI+L2Rldi9udWxsIHwKLQkgICAgICAkU0VEIC1lICdzL1sgXSokLy8nIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCi0gICAgICAgICAgICA7OwotICAgICAgICAgICpjeWd3aW4qICkKLSAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ9YGN5Z3BhdGggLXcgLXAgIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfdG1wMSIgfAotICAgICAgICAgICAgICAkU0VEIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCi0gICAgICAgICAgICA7OwotICAgICAgICAgICogKQotICAgICAgICAgICAgIyB1bmZvcnR1bmF0ZWx5LCB3aW5lcGF0aCBkb2Vzbid0IGNvbnZlcnQgcGF0aGxpc3RzCi0gICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0PSIiCi0gICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3Rfb2xkSUZTPSRJRlMKLSAgICAgICAgICAgIElGUz06Ci0gICAgICAgICAgICBmb3IgZnVuY190b19ob3N0X3BhdGhsaXN0X2YgaW4gJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAxIDsgZG8KLSAgICAgICAgICAgICAgSUZTPSRmdW5jX3RvX2hvc3RfcGF0aGxpc3Rfb2xkSUZTCi0gICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfZiIgOyB0aGVuCi0gICAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGggIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfZiIKLSAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IiA7IHRoZW4KLSAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0IiA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD0iJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCIKLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZnVuY19hcHBlbmQgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdCAiOyRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCi0gICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICBkb25lCi0gICAgICAgICAgICBJRlM9JGZ1bmNfdG9faG9zdF9wYXRobGlzdF9vbGRJRlMKLSAgICAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgICAgaWYgdGVzdCAteiAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQiOyB0aGVuCi0gICAgICAgICAgZnVuY19lcnJvciAiQ291bGQgbm90IGRldGVybWluZSB0aGUgaG9zdCBwYXRoKHMpIGNvcnJlc3BvbmRpbmcgdG8iCi0gICAgICAgICAgZnVuY19lcnJvciAiICBcYCQxJyIKLSAgICAgICAgICBmdW5jX2Vycm9yICJDb250aW51aW5nLCBidXQgdW5pbnN0YWxsZWQgZXhlY3V0YWJsZXMgbWF5IG5vdCB3b3JrLiIKLSAgICAgICAgICAjIEZhbGxiYWNrLiBUaGlzIG1heSBicmVhayBpZiAkMSBjb250YWlucyBET1Mtc3R5bGUgZHJpdmUKLSAgICAgICAgICAjIHNwZWNpZmljYXRpb25zLiBUaGUgZml4IGlzIG5vdCB0byBjb21wbGljYXRlIHRoZSBleHByZXNzaW9uCi0gICAgICAgICAgIyBiZWxvdywgYnV0IGZvciB0aGUgdXNlciB0byBwcm92aWRlIGEgd29ya2luZyB3aW5lIGluc3RhbGxhdGlvbgotICAgICAgICAgICMgd2l0aCB3aW5lcGF0aCBzbyB0aGF0IHBhdGggdHJhbnNsYXRpb24gaW4gdGhlIGNyb3NzLXRvLW1pbmd3Ci0gICAgICAgICAgIyBjYXNlIHdvcmtzIHByb3Blcmx5LgotICAgICAgICAgIGx0X3JlcGxhY2VfcGF0aHNlcF9uaXhfdG9fZG9zPSJzfDp8O3xnIgotICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ9YGVjaG8gIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfdG1wMSIgfFwKLSAgICAgICAgICAgICRTRUQgLWUgIiRsdF9yZXBsYWNlX3BhdGhzZXBfbml4X3RvX2RvcyJgCi0gICAgICAgIGZpCi0gICAgICAgICMgTm93LCBhZGQgdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHBhdGggc2VwYXJhdG9ycyBiYWNrCi0gICAgICAgIGNhc2UgIiQxIiBpbgotICAgICAgICAgIDoqICkgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD0iOyRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0IgotICAgICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotICAgICAgICBjYXNlICIkMSIgaW4KLSAgICAgICAgICAqOiApIGZ1bmNfYXBwZW5kIGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQgIjsiCi0gICAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotfQotIyBlbmQ6IGZ1bmNfdG9faG9zdF9wYXRobGlzdAotCi0jIGZ1bmNfZW1pdF9jd3JhcHBlcmV4ZV9zcmMKLSMgZW1pdCB0aGUgc291cmNlIGNvZGUgZm9yIGEgd3JhcHBlciBleGVjdXRhYmxlIG9uIHN0ZG91dAotIyBNdXN0IE9OTFkgYmUgY2FsbGVkIGZyb20gd2l0aGluIGZ1bmNfbW9kZV9saW5rIGJlY2F1c2UKLSMgaXQgZGVwZW5kcyBvbiBhIG51bWJlciBvZiB2YXJpYWJsZSBzZXQgdGhlcmVpbi4KLWZ1bmNfZW1pdF9jd3JhcHBlcmV4ZV9zcmMgKCkKLXsKLQljYXQgPDxFT0YKLQotLyogJGN3cmFwcGVyc291cmNlIC0gdGVtcG9yYXJ5IHdyYXBwZXIgZXhlY3V0YWJsZSBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQotICAgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgotCi0gICBUaGUgJG91dHB1dCBwcm9ncmFtIGNhbm5vdCBiZSBkaXJlY3RseSBleGVjdXRlZCB1bnRpbCBhbGwgdGhlIGxpYnRvb2wKLSAgIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KLQotICAgVGhpcyB3cmFwcGVyIGV4ZWN1dGFibGUgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgotICAgSWYgaXQgaXMsIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5LgotKi8KLUVPRgotCSAgICBjYXQgPDwiRU9GIgotI2lmZGVmIF9NU0NfVkVSCi0jIGRlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgMQotI2VuZGlmCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpZmRlZiBfTVNDX1ZFUgotIyBpbmNsdWRlIDxkaXJlY3QuaD4KLSMgaW5jbHVkZSA8cHJvY2Vzcy5oPgotIyBpbmNsdWRlIDxpby5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGluY2x1ZGUgPHN0ZGludC5oPgotIyBpZmRlZiBfX0NZR1dJTl9fCi0jICBpbmNsdWRlIDxpby5oPgotIyBlbmRpZgotI2VuZGlmCi0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotLyogZGVjbGFyYXRpb25zIG9mIG5vbi1BTlNJIGZ1bmN0aW9ucyAqLwotI2lmIGRlZmluZWQoX19NSU5HVzMyX18pCi0jIGlmZGVmIF9fU1RSSUNUX0FOU0lfXwotaW50IF9wdXRlbnYgKGNvbnN0IGNoYXIgKik7Ci0jIGVuZGlmCi0jZWxpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jIGlmZGVmIF9fU1RSSUNUX0FOU0lfXwotY2hhciAqcmVhbHBhdGggKGNvbnN0IGNoYXIgKiwgY2hhciAqKTsKLWludCBwdXRlbnYgKGNoYXIgKik7Ci1pbnQgc2V0ZW52IChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKLSMgZW5kaWYKLS8qICNlbGlmIGRlZmluZWQgKG90aGVyIHBsYXRmb3JtcykgLi4uICovCi0jZW5kaWYKLQotLyogcG9ydGFiaWxpdHkgZGVmaW5lcywgZXhjbHVkaW5nIHBhdGggaGFuZGxpbmcgbWFjcm9zICovCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikKLSMgZGVmaW5lIHNldG1vZGUgX3NldG1vZGUKLSMgZGVmaW5lIHN0YXQgICAgX3N0YXQKLSMgZGVmaW5lIGNobW9kICAgX2NobW9kCi0jIGRlZmluZSBnZXRjd2QgIF9nZXRjd2QKLSMgZGVmaW5lIHB1dGVudiAgX3B1dGVudgotIyBkZWZpbmUgU19JWFVTUiBfU19JRVhFQwotIyBpZm5kZWYgX0lOVFBUUl9UX0RFRklORUQKLSMgIGRlZmluZSBfSU5UUFRSX1RfREVGSU5FRAotIyAgZGVmaW5lIGludHB0cl90IGludAotIyBlbmRpZgotI2VsaWYgZGVmaW5lZChfX01JTkdXMzJfXykKLSMgZGVmaW5lIHNldG1vZGUgX3NldG1vZGUKLSMgZGVmaW5lIHN0YXQgICAgX3N0YXQKLSMgZGVmaW5lIGNobW9kICAgX2NobW9kCi0jIGRlZmluZSBnZXRjd2QgIF9nZXRjd2QKLSMgZGVmaW5lIHB1dGVudiAgX3B1dGVudgotI2VsaWYgZGVmaW5lZChfX0NZR1dJTl9fKQotIyBkZWZpbmUgSEFWRV9TRVRFTlYKLSMgZGVmaW5lIEZPUEVOX1dCICJ3YiIKLS8qICNlbGlmIGRlZmluZWQgKG90aGVyIHBsYXRmb3JtcykgLi4uICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUEFUSF9NQVgpCi0jIGRlZmluZSBMVF9QQVRITUFYIFBBVEhfTUFYCi0jZWxpZiBkZWZpbmVkKE1BWFBBVEhMRU4pCi0jIGRlZmluZSBMVF9QQVRITUFYIE1BWFBBVEhMRU4KLSNlbHNlCi0jIGRlZmluZSBMVF9QQVRITUFYIDEwMjQKLSNlbmRpZgotCi0jaWZuZGVmIFNfSVhPVEgKLSMgZGVmaW5lIFNfSVhPVEggMAotI2VuZGlmCi0jaWZuZGVmIFNfSVhHUlAKLSMgZGVmaW5lIFNfSVhHUlAgMAotI2VuZGlmCi0KLS8qIHBhdGggaGFuZGxpbmcgcG9ydGFiaWxpdHkgbWFjcm9zICovCi0jaWZuZGVmIERJUl9TRVBBUkFUT1IKLSMgZGVmaW5lIERJUl9TRVBBUkFUT1IgJy8nCi0jIGRlZmluZSBQQVRIX1NFUEFSQVRPUiAnOicKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX01TRE9TX18pIHx8IGRlZmluZWQgKF9fREpHUFBfXykgfHwgXAotICBkZWZpbmVkIChfX09TMl9fKQotIyBkZWZpbmUgSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0KLSMgZGVmaW5lIEZPUEVOX1dCICJ3YiIKLSMgaWZuZGVmIERJUl9TRVBBUkFUT1JfMgotIyAgZGVmaW5lIERJUl9TRVBBUkFUT1JfMiAnXFwnCi0jIGVuZGlmCi0jIGlmbmRlZiBQQVRIX1NFUEFSQVRPUl8yCi0jICBkZWZpbmUgUEFUSF9TRVBBUkFUT1JfMiAnOycKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIERJUl9TRVBBUkFUT1JfMgotIyBkZWZpbmUgSVNfRElSX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gRElSX1NFUEFSQVRPUikKLSNlbHNlIC8qIERJUl9TRVBBUkFUT1JfMiAqLwotIyBkZWZpbmUgSVNfRElSX1NFUEFSQVRPUihjaCkgXAotCSgoKGNoKSA9PSBESVJfU0VQQVJBVE9SKSB8fCAoKGNoKSA9PSBESVJfU0VQQVJBVE9SXzIpKQotI2VuZGlmIC8qIERJUl9TRVBBUkFUT1JfMiAqLwotCi0jaWZuZGVmIFBBVEhfU0VQQVJBVE9SXzIKLSMgZGVmaW5lIElTX1BBVEhfU0VQQVJBVE9SKGNoKSAoKGNoKSA9PSBQQVRIX1NFUEFSQVRPUikKLSNlbHNlIC8qIFBBVEhfU0VQQVJBVE9SXzIgKi8KLSMgZGVmaW5lIElTX1BBVEhfU0VQQVJBVE9SKGNoKSAoKGNoKSA9PSBQQVRIX1NFUEFSQVRPUl8yKQotI2VuZGlmIC8qIFBBVEhfU0VQQVJBVE9SXzIgKi8KLQotI2lmbmRlZiBGT1BFTl9XQgotIyBkZWZpbmUgRk9QRU5fV0IgInciCi0jZW5kaWYKLSNpZm5kZWYgX09fQklOQVJZCi0jIGRlZmluZSBfT19CSU5BUlkgMAotI2VuZGlmCi0KLSNkZWZpbmUgWE1BTExPQyh0eXBlLCBudW0pICAgICAgKCh0eXBlICopIHhtYWxsb2MgKChudW0pICogc2l6ZW9mKHR5cGUpKSkKLSNkZWZpbmUgWEZSRUUoc3RhbGUpIGRvIHsgXAotICBpZiAoc3RhbGUpIHsgZnJlZSAoKHZvaWQgKikgc3RhbGUpOyBzdGFsZSA9IDA7IH0gXAotfSB3aGlsZSAoMCkKLQotI2lmIGRlZmluZWQoTFRfREVCVUdXUkFQUEVSKQotc3RhdGljIGludCBsdF9kZWJ1ZyA9IDE7Ci0jZWxzZQotc3RhdGljIGludCBsdF9kZWJ1ZyA9IDA7Ci0jZW5kaWYKLQotY29uc3QgY2hhciAqcHJvZ3JhbV9uYW1lID0gImxpYnRvb2wtd3JhcHBlciI7IC8qIGluIGNhc2UgeHN0cmR1cCBmYWlscyAqLwotCi12b2lkICp4bWFsbG9jIChzaXplX3QgbnVtKTsKLWNoYXIgKnhzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cmluZyk7Ci1jb25zdCBjaGFyICpiYXNlX25hbWUgKGNvbnN0IGNoYXIgKm5hbWUpOwotY2hhciAqZmluZF9leGVjdXRhYmxlIChjb25zdCBjaGFyICp3cmFwcGVyKTsKLWNoYXIgKmNoYXNlX3N5bWxpbmtzIChjb25zdCBjaGFyICpwYXRoc3BlYyk7Ci1pbnQgbWFrZV9leGVjdXRhYmxlIChjb25zdCBjaGFyICpwYXRoKTsKLWludCBjaGVja19leGVjdXRhYmxlIChjb25zdCBjaGFyICpwYXRoKTsKLWNoYXIgKnN0cmVuZHphcCAoY2hhciAqc3RyLCBjb25zdCBjaGFyICpwYXQpOwotdm9pZCBsdF9kZWJ1Z3ByaW50ZiAoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKLXZvaWQgbHRfZmF0YWwgKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pOwotc3RhdGljIGNvbnN0IGNoYXIgKm5vbm51bGwgKGNvbnN0IGNoYXIgKnMpOwotc3RhdGljIGNvbnN0IGNoYXIgKm5vbmVtcHR5IChjb25zdCBjaGFyICpzKTsKLXZvaWQgbHRfc2V0ZW52IChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7Ci1jaGFyICpsdF9leHRlbmRfc3RyIChjb25zdCBjaGFyICpvcmlnX3ZhbHVlLCBjb25zdCBjaGFyICphZGQsIGludCB0b19lbmQpOwotdm9pZCBsdF91cGRhdGVfZXhlX3BhdGggKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKLXZvaWQgbHRfdXBkYXRlX2xpYl9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7Ci1jaGFyICoqcHJlcGFyZV9zcGF3biAoY2hhciAqKmFyZ3YpOwotdm9pZCBsdF9kdW1wX3NjcmlwdCAoRklMRSAqZik7Ci1FT0YKLQotCSAgICBjYXQgPDxFT0YKLWNvbnN0IGNoYXIgKiBNQUdJQ19FWEUgPSAiJG1hZ2ljX2V4ZSI7Ci1jb25zdCBjaGFyICogTElCX1BBVEhfVkFSTkFNRSA9ICIkc2hsaWJwYXRoX3ZhciI7Ci1FT0YKLQotCSAgICBpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyAmJiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHRlbXBfcnBhdGgiOyB0aGVuCi0gICAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdCAiJHRlbXBfcnBhdGgiCi0JICAgICAgY2F0IDw8RU9GCi1jb25zdCBjaGFyICogTElCX1BBVEhfVkFMVUUgICA9ICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdCI7Ci1FT0YKLQkgICAgZWxzZQotCSAgICAgIGNhdCA8PCJFT0YiCi1jb25zdCBjaGFyICogTElCX1BBVEhfVkFMVUUgICA9ICIiOwotRU9GCi0JICAgIGZpCi0KLQkgICAgaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCi0gICAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdCAiJGRsbHNlYXJjaHBhdGg6IgotCSAgICAgIGNhdCA8PEVPRgotY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBUk5BTUUgPSAiUEFUSCI7Ci1jb25zdCBjaGFyICogRVhFX1BBVEhfVkFMVUUgICA9ICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdCI7Ci1FT0YKLQkgICAgZWxzZQotCSAgICAgIGNhdCA8PCJFT0YiCi1jb25zdCBjaGFyICogRVhFX1BBVEhfVkFSTkFNRSA9ICIiOwotY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBTFVFICAgPSAiIjsKLUVPRgotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCi0JICAgICAgY2F0IDw8RU9GCi1jb25zdCBjaGFyICogVEFSR0VUX1BST0dSQU1fTkFNRSA9ICJsdC0kb3V0cHV0bmFtZSI7IC8qIGhvcGVmdWxseSwgbm8gLmV4ZSAqLwotRU9GCi0JICAgIGVsc2UKLQkgICAgICBjYXQgPDxFT0YKLWNvbnN0IGNoYXIgKiBUQVJHRVRfUFJPR1JBTV9OQU1FID0gIiRvdXRwdXRuYW1lIjsgLyogaG9wZWZ1bGx5LCBubyAuZXhlICovCi1FT0YKLQkgICAgZmkKLQotCi0JICAgIGNhdCA8PCJFT0YiCi0KLSNkZWZpbmUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVggICAgICAgICAiLS1sdC0iCi0KLXN0YXRpYyBjb25zdCBjaGFyICpsdHdyYXBwZXJfb3B0aW9uX3ByZWZpeCA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYOwotc3RhdGljIGNvbnN0IGNoYXIgKmR1bXBzY3JpcHRfb3B0ICAgICAgID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVggImR1bXAtc2NyaXB0IjsKLXN0YXRpYyBjb25zdCBjaGFyICpkZWJ1Z19vcHQgICAgICAgICAgICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYICJkZWJ1ZyI7Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgY2hhciAqKm5ld2FyZ3o7Ci0gIGludCAgbmV3YXJnYzsKLSAgY2hhciAqdG1wX3BhdGhzcGVjOwotICBjaGFyICphY3R1YWxfY3dyYXBwZXJfcGF0aDsKLSAgY2hhciAqYWN0dWFsX2N3cmFwcGVyX25hbWU7Ci0gIGNoYXIgKnRhcmdldF9uYW1lOwotICBjaGFyICpsdF9hcmd2X3plcm87Ci0gIGludHB0cl90IHJ2YWwgPSAxMjc7Ci0KLSAgaW50IGk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gKGNoYXIgKikgeHN0cmR1cCAoYmFzZV9uYW1lIChhcmd2WzBdKSk7Ci0gIG5ld2FyZ3ogPSBYTUFMTE9DIChjaGFyICosIGFyZ2MgKyAxKTsKLQotICAvKiB2ZXJ5IHNpbXBsZSBhcmcgcGFyc2luZzsgZG9uJ3Qgd2FudCB0byByZWx5IG9uIGdldG9wdAotICAgKiBhbHNvLCBjb3B5IGFsbCBub24gY3dyYXBwZXIgb3B0aW9ucyB0byBuZXdhcmd6LCBleGNlcHQKLSAgICogYXJnelswXSwgd2hpY2ggaXMgaGFuZGxlZCBkaWZmZXJlbnRseQotICAgKi8KLSAgbmV3YXJnYz0wOwotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sIGR1bXBzY3JpcHRfb3B0KSA9PSAwKQotCXsKLUVPRgotCSAgICBjYXNlICIkaG9zdCIgaW4KLQkgICAgICAqbWluZ3cqIHwgKmN5Z3dpbiogKQotCQkjIG1ha2Ugc3Rkb3V0IHVzZSAidW5peCIgbGluZSBlbmRpbmdzCi0JCWVjaG8gIiAgICAgICAgICBzZXRtb2RlKDEsX09fQklOQVJZKTsiCi0JCTs7Ci0JICAgICAgZXNhYwotCi0JICAgIGNhdCA8PCJFT0YiCi0JICBsdF9kdW1wX3NjcmlwdCAoc3Rkb3V0KTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sIGRlYnVnX29wdCkgPT0gMCkKLQl7Ci0gICAgICAgICAgbHRfZGVidWcgPSAxOwotICAgICAgICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sIGx0d3JhcHBlcl9vcHRpb25fcHJlZml4KSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgLyogaG93ZXZlciwgaWYgdGhlcmUgaXMgYW4gb3B0aW9uIGluIHRoZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWAotICAgICAgICAgICAgIG5hbWVzcGFjZSwgYnV0IGl0IGlzIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2Uga25vdyBhYm91dCBhbmQKLSAgICAgICAgICAgICBoYXZlIGFscmVhZHkgZGVhbHQgd2l0aCwgYWJvdmUgKGlubHVkaW5nIGR1bXAtc2NyaXB0KSwgdGhlbgotICAgICAgICAgICAgIHJlcG9ydCBhbiBlcnJvci4gT3RoZXJ3aXNlLCB0YXJnZXRzIG1pZ2h0IGJlZ2luIHRvIGJlbGlldmUKLSAgICAgICAgICAgICB0aGV5IGFyZSBhbGxvd2VkIHRvIHVzZSBvcHRpb25zIGluIHRoZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWAotICAgICAgICAgICAgIG5hbWVzcGFjZS4gVGhlIGZpcnN0IHRpbWUgYW55IHVzZXIgY29tcGxhaW5zIGFib3V0IHRoaXMsIHdlJ2xsCi0gICAgICAgICAgICAgbmVlZCB0byBtYWtlIExUV1JBUFBFUl9PUFRJT05fUFJFRklYIGEgY29uZmlndXJlLXRpbWUgb3B0aW9uCi0gICAgICAgICAgICAgb3IgYSBjb25maWd1cmUuYWMtc2V0dGFibGUgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywKLQkJICAgICJ1bnJlY29nbml6ZWQgJXMgb3B0aW9uOiAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgbHR3cmFwcGVyX29wdGlvbl9wcmVmaXgsIGFyZ3ZbaV0pOwotICAgICAgICB9Ci0gICAgICAvKiBvdGhlcndpc2UgLi4uICovCi0gICAgICBuZXdhcmd6WysrbmV3YXJnY10gPSB4c3RyZHVwIChhcmd2W2ldKTsKLSAgICB9Ci0gIG5ld2FyZ3pbKytuZXdhcmdjXSA9IE5VTEw7Ci0KLUVPRgotCSAgICBjYXQgPDxFT0YKLSAgLyogVGhlIEdOVSBiYW5uZXIgbXVzdCBiZSB0aGUgZmlyc3Qgbm9uLWVycm9yIGRlYnVnIG1lc3NhZ2UgKi8KLSAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgImxpYnRvb2wgd3JhcHBlciAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT05cbiIpOwotRU9GCi0JICAgIGNhdCA8PCJFT0YiCi0gIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICIobWFpbikgYXJndlswXTogJXNcbiIsIGFyZ3ZbMF0pOwotICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKG1haW4pIHByb2dyYW1fbmFtZTogJXNcbiIsIHByb2dyYW1fbmFtZSk7Ci0KLSAgdG1wX3BhdGhzcGVjID0gZmluZF9leGVjdXRhYmxlIChhcmd2WzBdKTsKLSAgaWYgKHRtcF9wYXRoc3BlYyA9PSBOVUxMKQotICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sICJjb3VsZG4ndCBmaW5kICVzIiwgYXJndlswXSk7Ci0gIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCi0gICAgICAgICAgICAgICAgICAiKG1haW4pIGZvdW5kIGV4ZSAoYmVmb3JlIHN5bWxpbmsgY2hhc2UpIGF0OiAlc1xuIiwKLQkJICB0bXBfcGF0aHNwZWMpOwotCi0gIGFjdHVhbF9jd3JhcHBlcl9wYXRoID0gY2hhc2Vfc3ltbGlua3MgKHRtcF9wYXRoc3BlYyk7Ci0gIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCi0gICAgICAgICAgICAgICAgICAiKG1haW4pIGZvdW5kIGV4ZSAoYWZ0ZXIgc3ltbGluayBjaGFzZSkgYXQ6ICVzXG4iLAotCQkgIGFjdHVhbF9jd3JhcHBlcl9wYXRoKTsKLSAgWEZSRUUgKHRtcF9wYXRoc3BlYyk7Ci0KLSAgYWN0dWFsX2N3cmFwcGVyX25hbWUgPSB4c3RyZHVwIChiYXNlX25hbWUgKGFjdHVhbF9jd3JhcHBlcl9wYXRoKSk7Ci0gIHN0cmVuZHphcCAoYWN0dWFsX2N3cmFwcGVyX3BhdGgsIGFjdHVhbF9jd3JhcHBlcl9uYW1lKTsKLQotICAvKiB3cmFwcGVyIG5hbWUgdHJhbnNmb3JtcyAqLwotICBzdHJlbmR6YXAgKGFjdHVhbF9jd3JhcHBlcl9uYW1lLCAiLmV4ZSIpOwotICB0bXBfcGF0aHNwZWMgPSBsdF9leHRlbmRfc3RyIChhY3R1YWxfY3dyYXBwZXJfbmFtZSwgIi5leGUiLCAxKTsKLSAgWEZSRUUgKGFjdHVhbF9jd3JhcHBlcl9uYW1lKTsKLSAgYWN0dWFsX2N3cmFwcGVyX25hbWUgPSB0bXBfcGF0aHNwZWM7Ci0gIHRtcF9wYXRoc3BlYyA9IDA7Ci0KLSAgLyogdGFyZ2V0X25hbWUgdHJhbnNmb3JtcyAtLSB1c2UgYWN0dWFsIHRhcmdldCBwcm9ncmFtIG5hbWU7IG1pZ2h0IGhhdmUgbHQtIHByZWZpeCAqLwotICB0YXJnZXRfbmFtZSA9IHhzdHJkdXAgKGJhc2VfbmFtZSAoVEFSR0VUX1BST0dSQU1fTkFNRSkpOwotICBzdHJlbmR6YXAgKHRhcmdldF9uYW1lLCAiLmV4ZSIpOwotICB0bXBfcGF0aHNwZWMgPSBsdF9leHRlbmRfc3RyICh0YXJnZXRfbmFtZSwgIi5leGUiLCAxKTsKLSAgWEZSRUUgKHRhcmdldF9uYW1lKTsKLSAgdGFyZ2V0X25hbWUgPSB0bXBfcGF0aHNwZWM7Ci0gIHRtcF9wYXRoc3BlYyA9IDA7Ci0KLSAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKLQkJICAiKG1haW4pIGxpYnRvb2wgdGFyZ2V0IG5hbWU6ICVzXG4iLAotCQkgIHRhcmdldF9uYW1lKTsKLUVPRgotCi0JICAgIGNhdCA8PEVPRgotICBuZXdhcmd6WzBdID0KLSAgICBYTUFMTE9DIChjaGFyLCAoc3RybGVuIChhY3R1YWxfY3dyYXBwZXJfcGF0aCkgKwotCQkgICAgc3RybGVuICgiJG9iamRpciIpICsgMSArIHN0cmxlbiAoYWN0dWFsX2N3cmFwcGVyX25hbWUpICsgMSkpOwotICBzdHJjcHkgKG5ld2FyZ3pbMF0sIGFjdHVhbF9jd3JhcHBlcl9wYXRoKTsKLSAgc3RyY2F0IChuZXdhcmd6WzBdLCAiJG9iamRpciIpOwotICBzdHJjYXQgKG5ld2FyZ3pbMF0sICIvIik7Ci1FT0YKLQotCSAgICBjYXQgPDwiRU9GIgotICAvKiBzdG9wIGhlcmUsIGFuZCBjb3B5IHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gdGhpcyB0d2ljZSAqLwotICB0bXBfcGF0aHNwZWMgPSB4c3RyZHVwIChuZXdhcmd6WzBdKTsKLQotICAvKiBkbyBOT1Qgd2FudCB0aGUgbHQtIHByZWZpeCBoZXJlLCBzbyB1c2UgYWN0dWFsX2N3cmFwcGVyX25hbWUgKi8KLSAgc3RyY2F0IChuZXdhcmd6WzBdLCBhY3R1YWxfY3dyYXBwZXJfbmFtZSk7Ci0KLSAgLyogRE8gd2FudCB0aGUgbHQtIHByZWZpeCBoZXJlIGlmIGl0IGV4aXN0cywgc28gdXNlIHRhcmdldF9uYW1lICovCi0gIGx0X2FyZ3ZfemVybyA9IGx0X2V4dGVuZF9zdHIgKHRtcF9wYXRoc3BlYywgdGFyZ2V0X25hbWUsIDEpOwotICBYRlJFRSAodG1wX3BhdGhzcGVjKTsKLSAgdG1wX3BhdGhzcGVjID0gTlVMTDsKLUVPRgotCi0JICAgIGNhc2UgJGhvc3Rfb3MgaW4KLQkgICAgICBtaW5ndyopCi0JICAgIGNhdCA8PCJFT0YiCi0gIHsKLSAgICBjaGFyKiBwOwotICAgIHdoaWxlICgocCA9IHN0cmNociAobmV3YXJnelswXSwgJ1xcJykpICE9IE5VTEwpCi0gICAgICB7Ci0JKnAgPSAnLyc7Ci0gICAgICB9Ci0gICAgd2hpbGUgKChwID0gc3RyY2hyIChsdF9hcmd2X3plcm8sICdcXCcpKSAhPSBOVUxMKQotICAgICAgewotCSpwID0gJy8nOwotICAgICAgfQotICB9Ci1FT0YKLQkgICAgOzsKLQkgICAgZXNhYwotCi0JICAgIGNhdCA8PCJFT0YiCi0gIFhGUkVFICh0YXJnZXRfbmFtZSk7Ci0gIFhGUkVFIChhY3R1YWxfY3dyYXBwZXJfcGF0aCk7Ci0gIFhGUkVFIChhY3R1YWxfY3dyYXBwZXJfbmFtZSk7Ci0KLSAgbHRfc2V0ZW52ICgiQklOX1NIIiwgInhwZzQiKTsgLyogZm9yIFRydTY0ICovCi0gIGx0X3NldGVudiAoIkRVQUxDQVNFIiwgIjEiKTsgIC8qIGZvciBNU0sgc2ggKi8KLSAgbHRfdXBkYXRlX2xpYl9wYXRoIChMSUJfUEFUSF9WQVJOQU1FLCBMSUJfUEFUSF9WQUxVRSk7Ci0gIGx0X3VwZGF0ZV9leGVfcGF0aCAoRVhFX1BBVEhfVkFSTkFNRSwgRVhFX1BBVEhfVkFMVUUpOwotCi0gIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICIobWFpbikgbHRfYXJndl96ZXJvOiAlc1xuIiwKLQkJICBub25udWxsIChsdF9hcmd2X3plcm8pKTsKLSAgZm9yIChpID0gMDsgaSA8IG5ld2FyZ2M7IGkrKykKLSAgICB7Ci0gICAgICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKG1haW4pIG5ld2FyZ3pbJWRdOiAlc1xuIiwKLQkJICAgICAgaSwgbm9ubnVsbCAobmV3YXJneltpXSkpOwotICAgIH0KLQotRU9GCi0KLQkgICAgY2FzZSAkaG9zdF9vcyBpbgotCSAgICAgIG1pbmd3KikKLQkJY2F0IDw8IkVPRiIKLSAgLyogZXhlY3YgZG9lc24ndCBhY3R1YWxseSB3b3JrIG9uIG1pbmd3IGFzIGV4cGVjdGVkIG9uIHVuaXggKi8KLSAgbmV3YXJneiA9IHByZXBhcmVfc3Bhd24gKG5ld2FyZ3opOwotICBydmFsID0gX3NwYXdudiAoX1BfV0FJVCwgbHRfYXJndl96ZXJvLCAoY29uc3QgY2hhciAqIGNvbnN0ICopIG5ld2FyZ3opOwotICBpZiAocnZhbCA9PSAtMSkKLSAgICB7Ci0gICAgICAvKiBmYWlsZWQgdG8gc3RhcnQgcHJvY2VzcyAqLwotICAgICAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKLQkJICAgICAgIihtYWluKSBmYWlsZWQgdG8gbGF1bmNoIHRhcmdldCBcIiVzXCI6ICVzXG4iLAotCQkgICAgICBsdF9hcmd2X3plcm8sIG5vbm51bGwgKHN0cmVycm9yIChlcnJubykpKTsKLSAgICAgIHJldHVybiAxMjc7Ci0gICAgfQotICByZXR1cm4gcnZhbDsKLUVPRgotCQk7OwotCSAgICAgICopCi0JCWNhdCA8PCJFT0YiCi0gIGV4ZWN2IChsdF9hcmd2X3plcm8sIG5ld2FyZ3opOwotICByZXR1cm4gcnZhbDsgLyogPTEyNywgYnV0IGF2b2lkcyB1bnVzZWQgdmFyaWFibGUgd2FybmluZyAqLwotRU9GCi0JCTs7Ci0JICAgIGVzYWMKLQotCSAgICBjYXQgPDwiRU9GIgotfQotCi12b2lkICoKLXhtYWxsb2MgKHNpemVfdCBudW0pCi17Ci0gIHZvaWQgKnAgPSAodm9pZCAqKSBtYWxsb2MgKG51bSk7Ci0gIGlmICghcCkKLSAgICBsdF9mYXRhbCAoX19GSUxFX18sIF9fTElORV9fLCAibWVtb3J5IGV4aGF1c3RlZCIpOwotCi0gIHJldHVybiBwOwotfQotCi1jaGFyICoKLXhzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgcmV0dXJuIHN0cmluZyA/IHN0cmNweSAoKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzdHJpbmcpICsgMSksCi0JCQkgIHN0cmluZykgOiBOVUxMOwotfQotCi1jb25zdCBjaGFyICoKLWJhc2VfbmFtZSAoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgY29uc3QgY2hhciAqYmFzZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQotICAvKiBTa2lwIG92ZXIgdGhlIGRpc2sgbmFtZSBpbiBNU0RPUyBwYXRobmFtZXMuICovCi0gIGlmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgbmFtZVswXSkgJiYgbmFtZVsxXSA9PSAnOicpCi0gICAgbmFtZSArPSAyOwotI2VuZGlmCi0KLSAgZm9yIChiYXNlID0gbmFtZTsgKm5hbWU7IG5hbWUrKykKLSAgICBpZiAoSVNfRElSX1NFUEFSQVRPUiAoKm5hbWUpKQotICAgICAgYmFzZSA9IG5hbWUgKyAxOwotICByZXR1cm4gYmFzZTsKLX0KLQotaW50Ci1jaGVja19leGVjdXRhYmxlIChjb25zdCBjaGFyICpwYXRoKQotewotICBzdHJ1Y3Qgc3RhdCBzdDsKLQotICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKGNoZWNrX2V4ZWN1dGFibGUpOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgIG5vbmVtcHR5IChwYXRoKSk7Ci0gIGlmICgoIXBhdGgpIHx8ICghKnBhdGgpKQotICAgIHJldHVybiAwOwotCi0gIGlmICgoc3RhdCAocGF0aCwgJnN0KSA+PSAwKQotICAgICAgJiYgKHN0LnN0X21vZGUgJiAoU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RIKSkpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotaW50Ci1tYWtlX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gIGludCBydmFsID0gMDsKLSAgc3RydWN0IHN0YXQgc3Q7Ci0KLSAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihtYWtlX2V4ZWN1dGFibGUpOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgIG5vbmVtcHR5IChwYXRoKSk7Ci0gIGlmICgoIXBhdGgpIHx8ICghKnBhdGgpKQotICAgIHJldHVybiAwOwotCi0gIGlmIChzdGF0IChwYXRoLCAmc3QpID49IDApCi0gICAgewotICAgICAgcnZhbCA9IGNobW9kIChwYXRoLCBzdC5zdF9tb2RlIHwgU19JWE9USCB8IFNfSVhHUlAgfCBTX0lYVVNSKTsKLSAgICB9Ci0gIHJldHVybiBydmFsOwotfQotCi0vKiBTZWFyY2hlcyBmb3IgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgd3JhcHBlci4gIFJldHVybnMKLSAgIG5ld2x5IGFsbG9jYXRlZCBmdWxsIHBhdGggbmFtZSBpZiBmb3VuZCwgTlVMTCBvdGhlcndpc2UKLSAgIERvZXMgbm90IGNoYXNlIHN5bWxpbmtzLCBldmVuIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgdGhlbS4KLSovCi1jaGFyICoKLWZpbmRfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqd3JhcHBlcikKLXsKLSAgaW50IGhhc19zbGFzaCA9IDA7Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGNvbnN0IGNoYXIgKnBfbmV4dDsKLSAgLyogc3RhdGljIGJ1ZmZlciBmb3IgZ2V0Y3dkICovCi0gIGNoYXIgdG1wW0xUX1BBVEhNQVggKyAxXTsKLSAgaW50IHRtcF9sZW47Ci0gIGNoYXIgKmNvbmNhdF9uYW1lOwotCi0gIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICIoZmluZF9leGVjdXRhYmxlKTogJXNcbiIsCi0gICAgICAgICAgICAgICAgICBub25lbXB0eSAod3JhcHBlcikpOwotCi0gIGlmICgod3JhcHBlciA9PSBOVUxMKSB8fCAoKndyYXBwZXIgPT0gJ1wwJykpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQWJzb2x1dGUgcGF0aD8gKi8KLSNpZiBkZWZpbmVkIChIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTSkKLSAgaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSB3cmFwcGVyWzBdKSAmJiB3cmFwcGVyWzFdID09ICc6JykKLSAgICB7Ci0gICAgICBjb25jYXRfbmFtZSA9IHhzdHJkdXAgKHdyYXBwZXIpOwotICAgICAgaWYgKGNoZWNrX2V4ZWN1dGFibGUgKGNvbmNhdF9uYW1lKSkKLQlyZXR1cm4gY29uY2F0X25hbWU7Ci0gICAgICBYRlJFRSAoY29uY2F0X25hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSNlbmRpZgotICAgICAgaWYgKElTX0RJUl9TRVBBUkFUT1IgKHdyYXBwZXJbMF0pKQotCXsKLQkgIGNvbmNhdF9uYW1lID0geHN0cmR1cCAod3JhcHBlcik7Ci0JICBpZiAoY2hlY2tfZXhlY3V0YWJsZSAoY29uY2F0X25hbWUpKQotCSAgICByZXR1cm4gY29uY2F0X25hbWU7Ci0JICBYRlJFRSAoY29uY2F0X25hbWUpOwotCX0KLSNpZiBkZWZpbmVkIChIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTSkKLSAgICB9Ci0jZW5kaWYKLQotICBmb3IgKHAgPSB3cmFwcGVyOyAqcDsgcCsrKQotICAgIGlmICgqcCA9PSAnLycpCi0gICAgICB7Ci0JaGFzX3NsYXNoID0gMTsKLQlicmVhazsKLSAgICAgIH0KLSAgaWYgKCFoYXNfc2xhc2gpCi0gICAgewotICAgICAgLyogbm8gc2xhc2hlczsgc2VhcmNoIFBBVEggKi8KLSAgICAgIGNvbnN0IGNoYXIgKnBhdGggPSBnZXRlbnYgKCJQQVRIIik7Ci0gICAgICBpZiAocGF0aCAhPSBOVUxMKQotCXsKLQkgIGZvciAocCA9IHBhdGg7ICpwOyBwID0gcF9uZXh0KQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqcTsKLQkgICAgICBzaXplX3QgcF9sZW47Ci0JICAgICAgZm9yIChxID0gcDsgKnE7IHErKykKLQkJaWYgKElTX1BBVEhfU0VQQVJBVE9SICgqcSkpCi0JCSAgYnJlYWs7Ci0JICAgICAgcF9sZW4gPSBxIC0gcDsKLQkgICAgICBwX25leHQgPSAoKnEgPT0gJ1wwJyA/IHEgOiBxICsgMSk7Ci0JICAgICAgaWYgKHBfbGVuID09IDApCi0JCXsKLQkJICAvKiBlbXB0eSBwYXRoOiBjdXJyZW50IGRpcmVjdG9yeSAqLwotCQkgIGlmIChnZXRjd2QgKHRtcCwgTFRfUEFUSE1BWCkgPT0gTlVMTCkKLQkJICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sICJnZXRjd2QgZmFpbGVkOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25udWxsIChzdHJlcnJvciAoZXJybm8pKSk7Ci0JCSAgdG1wX2xlbiA9IHN0cmxlbiAodG1wKTsKLQkJICBjb25jYXRfbmFtZSA9Ci0JCSAgICBYTUFMTE9DIChjaGFyLCB0bXBfbGVuICsgMSArIHN0cmxlbiAod3JhcHBlcikgKyAxKTsKLQkJICBtZW1jcHkgKGNvbmNhdF9uYW1lLCB0bXAsIHRtcF9sZW4pOwotCQkgIGNvbmNhdF9uYW1lW3RtcF9sZW5dID0gJy8nOwotCQkgIHN0cmNweSAoY29uY2F0X25hbWUgKyB0bXBfbGVuICsgMSwgd3JhcHBlcik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjb25jYXRfbmFtZSA9Ci0JCSAgICBYTUFMTE9DIChjaGFyLCBwX2xlbiArIDEgKyBzdHJsZW4gKHdyYXBwZXIpICsgMSk7Ci0JCSAgbWVtY3B5IChjb25jYXRfbmFtZSwgcCwgcF9sZW4pOwotCQkgIGNvbmNhdF9uYW1lW3BfbGVuXSA9ICcvJzsKLQkJICBzdHJjcHkgKGNvbmNhdF9uYW1lICsgcF9sZW4gKyAxLCB3cmFwcGVyKTsKLQkJfQotCSAgICAgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCi0JCXJldHVybiBjb25jYXRfbmFtZTsKLQkgICAgICBYRlJFRSAoY29uY2F0X25hbWUpOwotCSAgICB9Ci0JfQotICAgICAgLyogbm90IGZvdW5kIGluIFBBVEg7IGFzc3VtZSBjdXJkaXIgKi8KLSAgICB9Ci0gIC8qIFJlbGF0aXZlIHBhdGggfCBub3QgZm91bmQgaW4gcGF0aDogcHJlcGVuZCBjd2QgKi8KLSAgaWYgKGdldGN3ZCAodG1wLCBMVF9QQVRITUFYKSA9PSBOVUxMKQotICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sICJnZXRjd2QgZmFpbGVkOiAlcyIsCi0gICAgICAgICAgICAgIG5vbm51bGwgKHN0cmVycm9yIChlcnJubykpKTsKLSAgdG1wX2xlbiA9IHN0cmxlbiAodG1wKTsKLSAgY29uY2F0X25hbWUgPSBYTUFMTE9DIChjaGFyLCB0bXBfbGVuICsgMSArIHN0cmxlbiAod3JhcHBlcikgKyAxKTsKLSAgbWVtY3B5IChjb25jYXRfbmFtZSwgdG1wLCB0bXBfbGVuKTsKLSAgY29uY2F0X25hbWVbdG1wX2xlbl0gPSAnLyc7Ci0gIHN0cmNweSAoY29uY2F0X25hbWUgKyB0bXBfbGVuICsgMSwgd3JhcHBlcik7Ci0KLSAgaWYgKGNoZWNrX2V4ZWN1dGFibGUgKGNvbmNhdF9uYW1lKSkKLSAgICByZXR1cm4gY29uY2F0X25hbWU7Ci0gIFhGUkVFIChjb25jYXRfbmFtZSk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1jaGFyICoKLWNoYXNlX3N5bWxpbmtzIChjb25zdCBjaGFyICpwYXRoc3BlYykKLXsKLSNpZm5kZWYgU19JU0xOSwotICByZXR1cm4geHN0cmR1cCAocGF0aHNwZWMpOwotI2Vsc2UKLSAgY2hhciBidWZbTFRfUEFUSE1BWF07Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIGNoYXIgKnRtcF9wYXRoc3BlYyA9IHhzdHJkdXAgKHBhdGhzcGVjKTsKLSAgY2hhciAqcDsKLSAgaW50IGhhc19zeW1saW5rcyA9IDA7Ci0gIHdoaWxlIChzdHJsZW4gKHRtcF9wYXRoc3BlYykgJiYgIWhhc19zeW1saW5rcykKLSAgICB7Ci0gICAgICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAotCQkgICAgICAiY2hlY2tpbmcgcGF0aCBjb21wb25lbnQgZm9yIHN5bWxpbmtzOiAlc1xuIiwKLQkJICAgICAgdG1wX3BhdGhzcGVjKTsKLSAgICAgIGlmIChsc3RhdCAodG1wX3BhdGhzcGVjLCAmcykgPT0gMCkKLQl7Ci0JICBpZiAoU19JU0xOSyAocy5zdF9tb2RlKSAhPSAwKQotCSAgICB7Ci0JICAgICAgaGFzX3N5bWxpbmtzID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBzZWFyY2ggYmFja3dhcmRzIGZvciBsYXN0IERJUl9TRVBBUkFUT1IgKi8KLQkgIHAgPSB0bXBfcGF0aHNwZWMgKyBzdHJsZW4gKHRtcF9wYXRoc3BlYykgLSAxOwotCSAgd2hpbGUgKChwID4gdG1wX3BhdGhzcGVjKSAmJiAoIUlTX0RJUl9TRVBBUkFUT1IgKCpwKSkpCi0JICAgIHAtLTsKLQkgIGlmICgocCA9PSB0bXBfcGF0aHNwZWMpICYmICghSVNfRElSX1NFUEFSQVRPUiAoKnApKSkKLQkgICAgewotCSAgICAgIC8qIG5vIG1vcmUgRElSX1NFUEFSQVRPUlMgbGVmdCAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAqcCA9ICdcMCc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sCi0JCSAgICAiZXJyb3IgYWNjZXNzaW5nIGZpbGUgXCIlc1wiOiAlcyIsCi0JCSAgICB0bXBfcGF0aHNwZWMsIG5vbm51bGwgKHN0cmVycm9yIChlcnJubykpKTsKLQl9Ci0gICAgfQotICBYRlJFRSAodG1wX3BhdGhzcGVjKTsKLQotICBpZiAoIWhhc19zeW1saW5rcykKLSAgICB7Ci0gICAgICByZXR1cm4geHN0cmR1cCAocGF0aHNwZWMpOwotICAgIH0KLQotICB0bXBfcGF0aHNwZWMgPSByZWFscGF0aCAocGF0aHNwZWMsIGJ1Zik7Ci0gIGlmICh0bXBfcGF0aHNwZWMgPT0gMCkKLSAgICB7Ci0gICAgICBsdF9mYXRhbCAoX19GSUxFX18sIF9fTElORV9fLAotCQkiY291bGQgbm90IGZvbGxvdyBzeW1saW5rcyBmb3IgJXMiLCBwYXRoc3BlYyk7Ci0gICAgfQotICByZXR1cm4geHN0cmR1cCAodG1wX3BhdGhzcGVjKTsKLSNlbmRpZgotfQotCi1jaGFyICoKLXN0cmVuZHphcCAoY2hhciAqc3RyLCBjb25zdCBjaGFyICpwYXQpCi17Ci0gIHNpemVfdCBsZW4sIHBhdGxlbjsKLQotICBhc3NlcnQgKHN0ciAhPSBOVUxMKTsKLSAgYXNzZXJ0IChwYXQgIT0gTlVMTCk7Ci0KLSAgbGVuID0gc3RybGVuIChzdHIpOwotICBwYXRsZW4gPSBzdHJsZW4gKHBhdCk7Ci0KLSAgaWYgKHBhdGxlbiA8PSBsZW4pCi0gICAgewotICAgICAgc3RyICs9IGxlbiAtIHBhdGxlbjsKLSAgICAgIGlmIChzdHJjbXAgKHN0ciwgcGF0KSA9PSAwKQotCSpzdHIgPSAnXDAnOwotICAgIH0KLSAgcmV0dXJuIHN0cjsKLX0KLQotdm9pZAotbHRfZGVidWdwcmludGYgKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBpZiAobHRfZGVidWcpCi0gICAgewotICAgICAgKHZvaWQpIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiVkOiAiLCBwcm9ncmFtX25hbWUsIGZpbGUsIGxpbmUpOwotICAgICAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7Ci0gICAgICAodm9pZCkgdmZwcmludGYgKHN0ZGVyciwgZm10LCBhcmdzKTsKLSAgICAgIHZhX2VuZCAoYXJncyk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotbHRfZXJyb3JfY29yZSAoaW50IGV4aXRfc3RhdHVzLCBjb25zdCBjaGFyICpmaWxlLAotCSAgICAgICBpbnQgbGluZSwgY29uc3QgY2hhciAqbW9kZSwKLQkgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSwgdmFfbGlzdCBhcCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6JWQ6ICVzOiAiLCBwcm9ncmFtX25hbWUsIGZpbGUsIGxpbmUsIG1vZGUpOwotICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgIi5cbiIpOwotCi0gIGlmIChleGl0X3N0YXR1cyA+PSAwKQotICAgIGV4aXQgKGV4aXRfc3RhdHVzKTsKLX0KLQotdm9pZAotbHRfZmF0YWwgKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pCi17Ci0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0IChhcCwgbWVzc2FnZSk7Ci0gIGx0X2Vycm9yX2NvcmUgKEVYSVRfRkFJTFVSRSwgZmlsZSwgbGluZSwgIkZBVEFMIiwgbWVzc2FnZSwgYXApOwotICB2YV9lbmQgKGFwKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotbm9ubnVsbCAoY29uc3QgY2hhciAqcykKLXsKLSAgcmV0dXJuIHMgPyBzIDogIihudWxsKSI7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW5vbmVtcHR5IChjb25zdCBjaGFyICpzKQotewotICByZXR1cm4gKHMgJiYgISpzKSA/ICIoZW1wdHkpIiA6IG5vbm51bGwgKHMpOwotfQotCi12b2lkCi1sdF9zZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQotewotICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAotCQkgICIobHRfc2V0ZW52KSBzZXR0aW5nICclcycgdG8gJyVzJ1xuIiwKLSAgICAgICAgICAgICAgICAgIG5vbm51bGwgKG5hbWUpLCBub25udWxsICh2YWx1ZSkpOwotICB7Ci0jaWZkZWYgSEFWRV9TRVRFTlYKLSAgICAvKiBhbHdheXMgbWFrZSBhIGNvcHksIGZvciBjb25zaXN0ZW5jeSB3aXRoICFIQVZFX1NFVEVOViAqLwotICAgIGNoYXIgKnN0ciA9IHhzdHJkdXAgKHZhbHVlKTsKLSAgICBzZXRlbnYgKG5hbWUsIHN0ciwgMSk7Ci0jZWxzZQotICAgIGludCBsZW4gPSBzdHJsZW4gKG5hbWUpICsgMSArIHN0cmxlbiAodmFsdWUpICsgMTsKLSAgICBjaGFyICpzdHIgPSBYTUFMTE9DIChjaGFyLCBsZW4pOwotICAgIHNwcmludGYgKHN0ciwgIiVzPSVzIiwgbmFtZSwgdmFsdWUpOwotICAgIGlmIChwdXRlbnYgKHN0cikgIT0gRVhJVF9TVUNDRVNTKQotICAgICAgewotICAgICAgICBYRlJFRSAoc3RyKTsKLSAgICAgIH0KLSNlbmRpZgotICB9Ci19Ci0KLWNoYXIgKgotbHRfZXh0ZW5kX3N0ciAoY29uc3QgY2hhciAqb3JpZ192YWx1ZSwgY29uc3QgY2hhciAqYWRkLCBpbnQgdG9fZW5kKQotewotICBjaGFyICpuZXdfdmFsdWU7Ci0gIGlmIChvcmlnX3ZhbHVlICYmICpvcmlnX3ZhbHVlKQotICAgIHsKLSAgICAgIGludCBvcmlnX3ZhbHVlX2xlbiA9IHN0cmxlbiAob3JpZ192YWx1ZSk7Ci0gICAgICBpbnQgYWRkX2xlbiA9IHN0cmxlbiAoYWRkKTsKLSAgICAgIG5ld192YWx1ZSA9IFhNQUxMT0MgKGNoYXIsIGFkZF9sZW4gKyBvcmlnX3ZhbHVlX2xlbiArIDEpOwotICAgICAgaWYgKHRvX2VuZCkKLSAgICAgICAgewotICAgICAgICAgIHN0cmNweSAobmV3X3ZhbHVlLCBvcmlnX3ZhbHVlKTsKLSAgICAgICAgICBzdHJjcHkgKG5ld192YWx1ZSArIG9yaWdfdmFsdWVfbGVuLCBhZGQpOwotICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJjcHkgKG5ld192YWx1ZSwgYWRkKTsKLSAgICAgICAgICBzdHJjcHkgKG5ld192YWx1ZSArIGFkZF9sZW4sIG9yaWdfdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmV3X3ZhbHVlID0geHN0cmR1cCAoYWRkKTsKLSAgICB9Ci0gIHJldHVybiBuZXdfdmFsdWU7Ci19Ci0KLXZvaWQKLWx0X3VwZGF0ZV9leGVfcGF0aCAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCi17Ci0gIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCi0JCSAgIihsdF91cGRhdGVfZXhlX3BhdGgpIG1vZGlmeWluZyAnJXMnIGJ5IHByZXBlbmRpbmcgJyVzJ1xuIiwKLSAgICAgICAgICAgICAgICAgIG5vbm51bGwgKG5hbWUpLCBub25udWxsICh2YWx1ZSkpOwotCi0gIGlmIChuYW1lICYmICpuYW1lICYmIHZhbHVlICYmICp2YWx1ZSkKLSAgICB7Ci0gICAgICBjaGFyICpuZXdfdmFsdWUgPSBsdF9leHRlbmRfc3RyIChnZXRlbnYgKG5hbWUpLCB2YWx1ZSwgMCk7Ci0gICAgICAvKiBzb21lIHN5c3RlbXMgY2FuJ3QgY29wZSB3aXRoIGEgJzonLXRlcm1pbmF0ZWQgcGF0aCAjJyAqLwotICAgICAgaW50IGxlbiA9IHN0cmxlbiAobmV3X3ZhbHVlKTsKLSAgICAgIHdoaWxlICgoKGxlbiA9IHN0cmxlbiAobmV3X3ZhbHVlKSkgPiAwKSAmJiBJU19QQVRIX1NFUEFSQVRPUiAobmV3X3ZhbHVlW2xlbi0xXSkpCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdfdmFsdWVbbGVuLTFdID0gJ1wwJzsKLSAgICAgICAgfQotICAgICAgbHRfc2V0ZW52IChuYW1lLCBuZXdfdmFsdWUpOwotICAgICAgWEZSRUUgKG5ld192YWx1ZSk7Ci0gICAgfQotfQotCi12b2lkCi1sdF91cGRhdGVfbGliX3BhdGggKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQotewotICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAotCQkgICIobHRfdXBkYXRlX2xpYl9wYXRoKSBtb2RpZnlpbmcgJyVzJyBieSBwcmVwZW5kaW5nICclcydcbiIsCi0gICAgICAgICAgICAgICAgICBub25udWxsIChuYW1lKSwgbm9ubnVsbCAodmFsdWUpKTsKLQotICBpZiAobmFtZSAmJiAqbmFtZSAmJiB2YWx1ZSAmJiAqdmFsdWUpCi0gICAgewotICAgICAgY2hhciAqbmV3X3ZhbHVlID0gbHRfZXh0ZW5kX3N0ciAoZ2V0ZW52IChuYW1lKSwgdmFsdWUsIDApOwotICAgICAgbHRfc2V0ZW52IChuYW1lLCBuZXdfdmFsdWUpOwotICAgICAgWEZSRUUgKG5ld192YWx1ZSk7Ci0gICAgfQotfQotCi1FT0YKLQkgICAgY2FzZSAkaG9zdF9vcyBpbgotCSAgICAgIG1pbmd3KikKLQkJY2F0IDw8IkVPRiIKLQotLyogUHJlcGFyZXMgYW4gYXJndW1lbnQgdmVjdG9yIGJlZm9yZSBjYWxsaW5nIHNwYXduKCkuCi0gICBOb3RlIHRoYXQgc3Bhd24oKSBkb2VzIG5vdCBieSBpdHNlbGYgY2FsbCB0aGUgY29tbWFuZCBpbnRlcnByZXRlcgotICAgICAoZ2V0ZW52ICgiQ09NU1BFQyIpICE9IE5VTEwgPyBnZXRlbnYgKCJDT01TUEVDIikgOgotICAgICAgKHsgT1NWRVJTSU9OSU5GTyB2OyB2LmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2YoT1NWRVJTSU9OSU5GTyk7Ci0gICAgICAgICBHZXRWZXJzaW9uRXgoJnYpOwotICAgICAgICAgdi5kd1BsYXRmb3JtSWQgPT0gVkVSX1BMQVRGT1JNX1dJTjMyX05UOwotICAgICAgfSkgPyAiY21kLmV4ZSIgOiAiY29tbWFuZC5jb20iKS4KLSAgIEluc3RlYWQgaXQgc2ltcGx5IGNvbmNhdGVuYXRlcyB0aGUgYXJndW1lbnRzLCBzZXBhcmF0ZWQgYnkgJyAnLCBhbmQgY2FsbHMKLSAgIENyZWF0ZVByb2Nlc3MoKS4gIFdlIG11c3QgcXVvdGUgdGhlIGFyZ3VtZW50cyBzaW5jZSBXaW4zMiBDcmVhdGVQcm9jZXNzKCkKLSAgIGludGVycHJldHMgY2hhcmFjdGVycyBsaWtlICcgJywgJ1x0JywgJ1xcJywgJyInIChidXQgbm90ICc8JyBhbmQgJz4nKSBpbiBhCi0gICBzcGVjaWFsIHdheToKLSAgIC0gU3BhY2UgYW5kIHRhYiBhcmUgaW50ZXJwcmV0ZWQgYXMgZGVsaW1pdGVycy4gVGhleSBhcmUgbm90IHRyZWF0ZWQgYXMKLSAgICAgZGVsaW1pdGVycyBpZiB0aGV5IGFyZSBzdXJyb3VuZGVkIGJ5IGRvdWJsZSBxdW90ZXM6ICIuLi4iLgotICAgLSBVbmVzY2FwZWQgZG91YmxlIHF1b3RlcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBpbnB1dC4gVGhlaXIgb25seSBlZmZlY3QgaXMKLSAgICAgdGhhdCB3aXRoaW4gZG91YmxlIHF1b3Rlcywgc3BhY2UgYW5kIHRhYiBhcmUgdHJlYXRlZCBsaWtlIG5vcm1hbAotICAgICBjaGFyYWN0ZXJzLgotICAgLSBCYWNrc2xhc2hlcyBub3QgZm9sbG93ZWQgYnkgZG91YmxlIHF1b3RlcyBhcmUgbm90IHNwZWNpYWwuCi0gICAtIEJ1dCAyKm4rMSBiYWNrc2xhc2hlcyBmb2xsb3dlZCBieSBhIGRvdWJsZSBxdW90ZSBiZWNvbWUKLSAgICAgbiBiYWNrc2xhc2hlcyBmb2xsb3dlZCBieSBhIGRvdWJsZSBxdW90ZSAobiA+PSAwKToKLSAgICAgICBcIiAtPiAiCi0gICAgICAgXFxcIiAtPiBcIgotICAgICAgIFxcXFxcIiAtPiBcXCIKLSAqLwotI2RlZmluZSBTSEVMTF9TUEVDSUFMX0NIQVJTICJcIlxcIFwwMDFcMDAyXDAwM1wwMDRcMDA1XDAwNlwwMDdcMDEwXDAxMVwwMTJcMDEzXDAxNFwwMTVcMDE2XDAxN1wwMjBcMDIxXDAyMlwwMjNcMDI0XDAyNVwwMjZcMDI3XDAzMFwwMzFcMDMyXDAzM1wwMzRcMDM1XDAzNlwwMzciCi0jZGVmaW5lIFNIRUxMX1NQQUNFX0NIQVJTICIgXDAwMVwwMDJcMDAzXDAwNFwwMDVcMDA2XDAwN1wwMTBcMDExXDAxMlwwMTNcMDE0XDAxNVwwMTZcMDE3XDAyMFwwMjFcMDIyXDAyM1wwMjRcMDI1XDAyNlwwMjdcMDMwXDAzMVwwMzJcMDMzXDAzNFwwMzVcMDM2XDAzNyIKLWNoYXIgKioKLXByZXBhcmVfc3Bhd24gKGNoYXIgKiphcmd2KQotewotICBzaXplX3QgYXJnYzsKLSAgY2hhciAqKm5ld19hcmd2OwotICBzaXplX3QgaTsKLQotICAvKiBDb3VudCBudW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KLSAgZm9yIChhcmdjID0gMDsgYXJndlthcmdjXSAhPSBOVUxMOyBhcmdjKyspCi0gICAgOwotCi0gIC8qIEFsbG9jYXRlIG5ldyBhcmd1bWVudCB2ZWN0b3IuICAqLwotICBuZXdfYXJndiA9IFhNQUxMT0MgKGNoYXIgKiwgYXJnYyArIDEpOwotCi0gIC8qIFB1dCBxdW90ZWQgYXJndW1lbnRzIGludG8gdGhlIG5ldyBhcmd1bWVudCB2ZWN0b3IuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cmluZyA9IGFyZ3ZbaV07Ci0KLSAgICAgIGlmIChzdHJpbmdbMF0gPT0gJ1wwJykKLQluZXdfYXJndltpXSA9IHhzdHJkdXAgKCJcIlwiIik7Ci0gICAgICBlbHNlIGlmIChzdHJwYnJrIChzdHJpbmcsIFNIRUxMX1NQRUNJQUxfQ0hBUlMpICE9IE5VTEwpCi0JewotCSAgaW50IHF1b3RlX2Fyb3VuZCA9IChzdHJwYnJrIChzdHJpbmcsIFNIRUxMX1NQQUNFX0NIQVJTKSAhPSBOVUxMKTsKLQkgIHNpemVfdCBsZW5ndGg7Ci0JICB1bnNpZ25lZCBpbnQgYmFja3NsYXNoZXM7Ci0JICBjb25zdCBjaGFyICpzOwotCSAgY2hhciAqcXVvdGVkX3N0cmluZzsKLQkgIGNoYXIgKnA7Ci0KLQkgIGxlbmd0aCA9IDA7Ci0JICBiYWNrc2xhc2hlcyA9IDA7Ci0JICBpZiAocXVvdGVfYXJvdW5kKQotCSAgICBsZW5ndGgrKzsKLQkgIGZvciAocyA9IHN0cmluZzsgKnMgIT0gJ1wwJzsgcysrKQotCSAgICB7Ci0JICAgICAgY2hhciBjID0gKnM7Ci0JICAgICAgaWYgKGMgPT0gJyInKQotCQlsZW5ndGggKz0gYmFja3NsYXNoZXMgKyAxOwotCSAgICAgIGxlbmd0aCsrOwotCSAgICAgIGlmIChjID09ICdcXCcpCi0JCWJhY2tzbGFzaGVzKys7Ci0JICAgICAgZWxzZQotCQliYWNrc2xhc2hlcyA9IDA7Ci0JICAgIH0KLQkgIGlmIChxdW90ZV9hcm91bmQpCi0JICAgIGxlbmd0aCArPSBiYWNrc2xhc2hlcyArIDE7Ci0KLQkgIHF1b3RlZF9zdHJpbmcgPSBYTUFMTE9DIChjaGFyLCBsZW5ndGggKyAxKTsKLQotCSAgcCA9IHF1b3RlZF9zdHJpbmc7Ci0JICBiYWNrc2xhc2hlcyA9IDA7Ci0JICBpZiAocXVvdGVfYXJvdW5kKQotCSAgICAqcCsrID0gJyInOwotCSAgZm9yIChzID0gc3RyaW5nOyAqcyAhPSAnXDAnOyBzKyspCi0JICAgIHsKLQkgICAgICBjaGFyIGMgPSAqczsKLQkgICAgICBpZiAoYyA9PSAnIicpCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgajsKLQkJICBmb3IgKGogPSBiYWNrc2xhc2hlcyArIDE7IGogPiAwOyBqLS0pCi0JCSAgICAqcCsrID0gJ1xcJzsKLQkJfQotCSAgICAgICpwKysgPSBjOwotCSAgICAgIGlmIChjID09ICdcXCcpCi0JCWJhY2tzbGFzaGVzKys7Ci0JICAgICAgZWxzZQotCQliYWNrc2xhc2hlcyA9IDA7Ci0JICAgIH0KLQkgIGlmIChxdW90ZV9hcm91bmQpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgajsKLQkgICAgICBmb3IgKGogPSBiYWNrc2xhc2hlczsgaiA+IDA7IGotLSkKLQkJKnArKyA9ICdcXCc7Ci0JICAgICAgKnArKyA9ICciJzsKLQkgICAgfQotCSAgKnAgPSAnXDAnOwotCi0JICBuZXdfYXJndltpXSA9IHF1b3RlZF9zdHJpbmc7Ci0JfQotICAgICAgZWxzZQotCW5ld19hcmd2W2ldID0gKGNoYXIgKikgc3RyaW5nOwotICAgIH0KLSAgbmV3X2FyZ3ZbYXJnY10gPSBOVUxMOwotCi0gIHJldHVybiBuZXdfYXJndjsKLX0KLUVPRgotCQk7OwotCSAgICBlc2FjCi0KLSAgICAgICAgICAgIGNhdCA8PCJFT0YiCi12b2lkIGx0X2R1bXBfc2NyaXB0IChGSUxFKiBmKQotewotRU9GCi0JICAgIGZ1bmNfZW1pdF93cmFwcGVyIHllcyB8Ci0gICAgICAgICAgICAgICRTRUQgLWUgJ3MvXChbXFwiXVwpL1xcXDEvZycgXAotCSAgICAgICAgICAgLWUgJ3MvXi8gIGZwdXRzICgiLycgLWUgJ3MvJC9cXG4iLCBmKTsvJwotCi0gICAgICAgICAgICBjYXQgPDwiRU9GIgotfQotRU9GCi19Ci0jIGVuZDogZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYwotCi0jIGZ1bmNfd2luMzJfaW1wb3J0X2xpYl9wIEFSRwotIyBUcnVlIGlmIEFSRyBpcyBhbiBpbXBvcnQgbGliLCBhcyBpbmRpY2F0ZWQgYnkgJGZpbGVfbWFnaWNfY21kCi1mdW5jX3dpbjMyX2ltcG9ydF9saWJfcCAoKQotewotICAgICRvcHRfZGVidWcKLSAgICBjYXNlIGBldmFsICRmaWxlX21hZ2ljX2NtZCBcIlwkMVwiIDI+L2Rldi9udWxsIHwgJFNFRCAtZSAxMHFgIGluCi0gICAgKmltcG9ydCopIDogOzsKLSAgICAqKSBmYWxzZSA7OwotICAgIGVzYWMKLX0KLQotIyBmdW5jX21vZGVfbGluayBhcmcuLi4KLWZ1bmNfbW9kZV9saW5rICgpCi17Ci0gICAgJG9wdF9kZWJ1ZwotICAgIGNhc2UgJGhvc3QgaW4KLSAgICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQotICAgICAgIyBJdCBpcyBpbXBvc3NpYmxlIHRvIGxpbmsgYSBkbGwgd2l0aG91dCB0aGlzIHNldHRpbmcsIGFuZAotICAgICAgIyB3ZSBzaG91bGRuJ3QgZm9yY2UgdGhlIG1ha2VmaWxlIG1haW50YWluZXIgdG8gZmlndXJlIG91dAotICAgICAgIyB3aGljaCBzeXN0ZW0gd2UgYXJlIGNvbXBpbGluZyBmb3IgaW4gb3JkZXIgdG8gcGFzcyBhbiBleHRyYQotICAgICAgIyBmbGFnIGZvciBldmVyeSBsaWJ0b29sIGludm9jYXRpb24uCi0gICAgICAjIGFsbG93X3VuZGVmaW5lZD1ubwotCi0gICAgICAjIEZJWE1FOiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgYWJvdmUgd2hlbiB0cnlpbmcKLSAgICAgICMgdG8gbWFrZSBhIGRsbCB3aGljaCBoYXMgdW5kZWZpbmVkIHN5bWJvbHMsIGluIHdoaWNoIGNhc2Ugbm90Ci0gICAgICAjIGV2ZW4gYSBzdGF0aWMgbGlicmFyeSBpcyBidWlsdC4gIEZvciBub3csIHdlIG5lZWQgdG8gc3BlY2lmeQotICAgICAgIyAtbm8tdW5kZWZpbmVkIG9uIHRoZSBsaWJ0b29sIGxpbmsgbGluZSB3aGVuIHdlIGNhbiBiZSBjZXJ0YWluCi0gICAgICAjIHRoYXQgYWxsIHN5bWJvbHMgYXJlIHNhdGlzZmllZCwgb3RoZXJ3aXNlIHdlIGdldCBhIHN0YXRpYyBsaWJyYXJ5LgotICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcwotICAgICAgOzsKLSAgICAqKQotICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgbGlidG9vbF9hcmdzPSRub25vcHQKLSAgICBiYXNlX2NvbXBpbGU9IiRub25vcHQgJEAiCi0gICAgY29tcGlsZV9jb21tYW5kPSRub25vcHQKLSAgICBmaW5hbGl6ZV9jb21tYW5kPSRub25vcHQKLQotICAgIGNvbXBpbGVfcnBhdGg9Ci0gICAgZmluYWxpemVfcnBhdGg9Ci0gICAgY29tcGlsZV9zaGxpYnBhdGg9Ci0gICAgZmluYWxpemVfc2hsaWJwYXRoPQotICAgIGNvbnZlbmllbmNlPQotICAgIG9sZF9jb252ZW5pZW5jZT0KLSAgICBkZXBsaWJzPQotICAgIG9sZF9kZXBsaWJzPQotICAgIGNvbXBpbGVyX2ZsYWdzPQotICAgIGxpbmtlcl9mbGFncz0KLSAgICBkbGxzZWFyY2hwYXRoPQotICAgIGxpYl9zZWFyY2hfcGF0aD1gcHdkYAotICAgIGluc3RfcHJlZml4X2Rpcj0KLSAgICBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0KLQotICAgIGF2b2lkX3ZlcnNpb249bm8KLSAgICBiaW5kaXI9Ci0gICAgZGxmaWxlcz0KLSAgICBkbHByZWZpbGVzPQotICAgIGRsc2VsZj1ubwotICAgIGV4cG9ydF9keW5hbWljPW5vCi0gICAgZXhwb3J0X3N5bWJvbHM9Ci0gICAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9Ci0gICAgZ2VuZXJhdGVkPQotICAgIGxpYm9ianM9Ci0gICAgbHRsaWJzPQotICAgIG1vZHVsZT1ubwotICAgIG5vX2luc3RhbGw9bm8KLSAgICBvYmpzPQotICAgIG5vbl9waWNfb2JqZWN0cz0KLSAgICBwcmVjaW91c19maWxlc19yZWdleD0KLSAgICBwcmVmZXJfc3RhdGljX2xpYnM9bm8KLSAgICBwcmVsb2FkPW5vCi0gICAgcHJldj0KLSAgICBwcmV2YXJnPQotICAgIHJlbGVhc2U9Ci0gICAgcnBhdGg9Ci0gICAgeHJwYXRoPQotICAgIHBlcm1fcnBhdGg9Ci0gICAgdGVtcF9ycGF0aD0KLSAgICB0aHJlYWRfc2FmZT1ubwotICAgIHZpbmZvPQotICAgIHZpbmZvX251bWJlcj1ubwotICAgIHdlYWtfbGlicz0KLSAgICBzaW5nbGVfbW9kdWxlPSIke3dsfS1zaW5nbGVfbW9kdWxlIgotICAgIGZ1bmNfaW5mZXJfdGFnICRiYXNlX2NvbXBpbGUKLQotICAgICMgV2UgbmVlZCB0byBrbm93IC1zdGF0aWMsIHRvIGdldCB0aGUgcmlnaHQgb3V0cHV0IGZpbGVuYW1lcy4KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgLXNoYXJlZCkKLQl0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgXAotCSAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICJjYW4gbm90IGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkiCi0JYnVpbGRfb2xkX2xpYnM9bm8KLQlicmVhawotCTs7Ci0gICAgICAtYWxsLXN0YXRpYyB8IC1zdGF0aWMgfCAtc3RhdGljLWxpYnRvb2wtbGlicykKLQljYXNlICRhcmcgaW4KLQktYWxsLXN0YXRpYykKLQkgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgLXogIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgICBmdW5jX3dhcm5pbmcgImNvbXBsZXRlIHN0YXRpYyBsaW5raW5nIGlzIGltcG9zc2libGUgaW4gdGhpcyBjb25maWd1cmF0aW9uIgotCSAgZmkKLQkgIGlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCi0JICBmaQotCSAgcHJlZmVyX3N0YXRpY19saWJzPXllcwotCSAgOzsKLQktc3RhdGljKQotCSAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLQkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYwotCSAgZmkKLQkgIHByZWZlcl9zdGF0aWNfbGlicz1idWlsdAotCSAgOzsKLQktc3RhdGljLWxpYnRvb2wtbGlicykKLQkgIGlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKLQkgIGZpCi0JICBwcmVmZXJfc3RhdGljX2xpYnM9eWVzCi0JICA7OwotCWVzYWMKLQlidWlsZF9saWJ0b29sX2xpYnM9bm8KLQlidWlsZF9vbGRfbGlicz15ZXMKLQlicmVhawotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBTZWUgaWYgb3VyIHNoYXJlZCBhcmNoaXZlcyBkZXBlbmQgb24gc3RhdGljIGFyY2hpdmVzLgotICAgIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiBidWlsZF9vbGRfbGlicz15ZXMKLQotICAgICMgR28gdGhyb3VnaCB0aGUgYXJndW1lbnRzLCB0cmFuc2Zvcm1pbmcgdGhlbSBvbiB0aGUgd2F5LgotICAgIHdoaWxlIHRlc3QgIiQjIiAtZ3QgMDsgZG8KLSAgICAgIGFyZz0iJDEiCi0gICAgICBzaGlmdAotICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKLSAgICAgIHFhcmc9JGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0Ci0gICAgICBmdW5jX2FwcGVuZCBsaWJ0b29sX2FyZ3MgIiAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCi0KLSAgICAgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICAgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0JY2FzZSAkcHJldiBpbgotCW91dHB1dCkKLQkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiIEBPVVRQVVRAIgotCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiIEBPVVRQVVRAIgotCSAgOzsKLQllc2FjCi0KLQljYXNlICRwcmV2IGluCi0JYmluZGlyKQotCSAgYmluZGlyPSIkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCWRsZmlsZXN8ZGxwcmVmaWxlcykKLQkgIGlmIHRlc3QgIiRwcmVsb2FkIiA9IG5vOyB0aGVuCi0JICAgICMgQWRkIHRoZSBzeW1ib2wgb2JqZWN0IGludG8gdGhlIGxpbmtpbmcgY29tbWFuZHMuCi0JICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiIEBTWU1GSUxFQCIKLQkgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiIEBTWU1GSUxFQCIKLQkgICAgcHJlbG9hZD15ZXMKLQkgIGZpCi0JICBjYXNlICRhcmcgaW4KLQkgICoubGEgfCAqLmxvKSA7OyAgIyBXZSBoYW5kbGUgdGhlc2UgY2FzZXMgYmVsb3cuCi0JICBmb3JjZSkKLQkgICAgaWYgdGVzdCAiJGRsc2VsZiIgPSBubzsgdGhlbgotCSAgICAgIGRsc2VsZj1uZWVkbGVzcwotCSAgICAgIGV4cG9ydF9keW5hbWljPXllcwotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgc2VsZikKLQkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgICAgIGRsc2VsZj15ZXMKLQkgICAgZWxpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgIT0geWVzOyB0aGVuCi0JICAgICAgZGxzZWxmPXllcwotCSAgICBlbHNlCi0JICAgICAgZGxzZWxmPW5lZWRsZXNzCi0JICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCi0JICAgIGZpCi0JICAgIHByZXY9Ci0JICAgIGNvbnRpbnVlCi0JICAgIDs7Ci0JICAqKQotCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JICAgICAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKLQkgICAgZWxzZQotCSAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCi0JICAgIGZpCi0JICAgIHByZXY9Ci0JICAgIGNvbnRpbnVlCi0JICAgIDs7Ci0JICBlc2FjCi0JICA7OwotCWV4cHN5bXMpCi0JICBleHBvcnRfc3ltYm9scz0iJGFyZyIKLQkgIHRlc3QgLWYgIiRhcmciIFwKLQkgICAgfHwgZnVuY19mYXRhbF9lcnJvciAic3ltYm9sIGZpbGUgXGAkYXJnJyBkb2VzIG5vdCBleGlzdCIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlleHBzeW1zX3JlZ2V4KQotCSAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9IiRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JZnJhbWV3b3JrKQotCSAgY2FzZSAkaG9zdCBpbgotCSAgICAqLSotZGFyd2luKikKLQkgICAgICBjYXNlICIkZGVwbGlicyAiIGluCi0JCSoiICRxYXJnLmx0ZnJhbWV3b3JrICIqKSA7OwotCQkqKSBkZXBsaWJzPSIkZGVwbGlicyAkcWFyZy5sdGZyYW1ld29yayIgIyB0aGlzIGlzIGZpeGVkIGxhdGVyCi0JCSAgIDs7Ci0JICAgICAgZXNhYwotCSAgICAgIDs7Ci0JICBlc2FjCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JaW5zdF9wcmVmaXgpCi0JICBpbnN0X3ByZWZpeF9kaXI9IiRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0Jb2JqZWN0bGlzdCkKLQkgIGlmIHRlc3QgLWYgIiRhcmciOyB0aGVuCi0JICAgIHNhdmVfYXJnPSRhcmcKLQkgICAgbW9yZWFyZ3M9Ci0JICAgIGZvciBmaWwgaW4gYGNhdCAiJHNhdmVfYXJnImAKLQkgICAgZG8KLSMJICAgICAgbW9yZWFyZ3M9IiRtb3JlYXJncyAkZmlsIgotCSAgICAgIGFyZz0kZmlsCi0JICAgICAgIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCi0KLQkgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCi0JICAgICAgaWYgZnVuY19sYWxpYl91bnNhZmVfcCAiJGFyZyI7IHRoZW4KLQkJcGljX29iamVjdD0KLQkJbm9uX3BpY19vYmplY3Q9Ci0KLQkJIyBSZWFkIHRoZSAubG8gZmlsZQotCQlmdW5jX3NvdXJjZSAiJGFyZyIKLQotCQlpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwKLQkJICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAotCQkgICB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lICYmCi0JCSAgIHRlc3QgIiRub25fcGljX29iamVjdCIgPSBub25lOyB0aGVuCi0JCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciCi0JCWZpCi0KLQkJIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KLQkJZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKLQkJeGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCi0KLQkJaWYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkJICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgotCQkgIHBpY19vYmplY3Q9IiR4ZGlyJHBpY19vYmplY3QiCi0KLQkJICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCi0JCSAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRwaWNfb2JqZWN0IgotCQkgICAgICBwcmV2PQotCQkgICAgICBjb250aW51ZQotCQkgICAgZWxzZQotCQkgICAgICAjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgotCQkgICAgICBwcmV2PWRscHJlZmlsZXMKLQkJICAgIGZpCi0JCSAgZmkKLQotCQkgICMgQ0hFQ0sgTUU6ICBJIHRoaW5rIEkgYnVzdGVkIHRoaXMuICAtT3NzYW1hCi0JCSAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCQkgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotCQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJHBpY19vYmplY3QiCi0JCSAgICBwcmV2PQotCQkgIGZpCi0KLQkJICAjIEEgUElDIG9iamVjdC4KLQkJICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCi0JCSAgYXJnPSIkcGljX29iamVjdCIKLQkJZmkKLQotCQkjIE5vbi1QSUMgb2JqZWN0LgotCQlpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkJICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgotCQkgIG5vbl9waWNfb2JqZWN0PSIkeGRpciRub25fcGljX29iamVjdCIKLQotCQkgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAotCQkgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKLQkJICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSA7IHRoZW4KLQkJICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgotCQkgIGZpCi0JCWVsc2UKLQkJICAjIElmIHRoZSBQSUMgb2JqZWN0IGV4aXN0cywgdXNlIGl0IGluc3RlYWQuCi0JCSAgIyAkeGRpciB3YXMgcHJlcGVuZGVkIHRvICRwaWNfb2JqZWN0IGFib3ZlLgotCQkgIG5vbl9waWNfb2JqZWN0PSIkcGljX29iamVjdCIKLQkJICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCi0JCWZpCi0JICAgICAgZWxzZQotCQkjIE9ubHkgYW4gZXJyb3IgaWYgbm90IGRvaW5nIGEgZHJ5LXJ1bi4KLQkJaWYgJG9wdF9kcnlfcnVuOyB0aGVuCi0JCSAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KLQkJICBmdW5jX2Rpcm5hbWUgIiRhcmciICIvIiAiIgotCQkgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgotCi0JCSAgZnVuY19sbzJvICIkYXJnIgotCQkgIHBpY19vYmplY3Q9JHhkaXIkb2JqZGlyLyRmdW5jX2xvMm9fcmVzdWx0Ci0JCSAgbm9uX3BpY19vYmplY3Q9JHhkaXIkZnVuY19sbzJvX3Jlc3VsdAotCQkgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKLQkJICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCi0JICAgICAgICBlbHNlCi0JCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIKLQkJZmkKLQkgICAgICBmaQotCSAgICBkb25lCi0JICBlbHNlCi0JICAgIGZ1bmNfZmF0YWxfZXJyb3IgImxpbmsgaW5wdXQgZmlsZSBcYCRhcmcnIGRvZXMgbm90IGV4aXN0IgotCSAgZmkKLQkgIGFyZz0kc2F2ZV9hcmcKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlwcmVjaW91c19yZWdleCkKLQkgIHByZWNpb3VzX2ZpbGVzX3JlZ2V4PSIkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXJlbGVhc2UpCi0JICByZWxlYXNlPSItJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlycGF0aCB8IHhycGF0aCkKLQkgICMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgotCSAgY2FzZSAkYXJnIGluCi0JICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7Ci0JICAqKQotCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIKLQkgICAgOzsKLQkgIGVzYWMKLQkgIGlmIHRlc3QgIiRwcmV2IiA9IHJwYXRoOyB0aGVuCi0JICAgIGNhc2UgIiRycGF0aCAiIGluCi0JICAgICoiICRhcmcgIiopIDs7Ci0JICAgICopIHJwYXRoPSIkcnBhdGggJGFyZyIgOzsKLQkgICAgZXNhYwotCSAgZWxzZQotCSAgICBjYXNlICIkeHJwYXRoICIgaW4KLQkgICAgKiIgJGFyZyAiKikgOzsKLQkgICAgKikgeHJwYXRoPSIkeHJwYXRoICRhcmciIDs7Ci0JICAgIGVzYWMKLQkgIGZpCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0Jc2hyZXh0KQotCSAgc2hyZXh0X2NtZHM9IiRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0Jd2VhaykKLQkgIHdlYWtfbGlicz0iJHdlYWtfbGlicyAkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXhjY2xpbmtlcikKLQkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHFhcmciCi0JICBwcmV2PQotCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHFhcmciCi0JICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJHFhcmciCi0JICBjb250aW51ZQotCSAgOzsKLQl4Y29tcGlsZXIpCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRxYXJnIgotCSAgcHJldj0KLQkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRxYXJnIgotCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRxYXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0JeGxpbmtlcikKLQkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHdsJHFhcmciCi0JICBwcmV2PQotCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHdsJHFhcmciCi0JICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJHdsJHFhcmciCi0JICBjb250aW51ZQotCSAgOzsKLQkqKQotCSAgZXZhbCAiJHByZXY9XCJcJGFyZ1wiIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCWVzYWMKLSAgICAgIGZpICMgdGVzdCAtbiAiJHByZXYiCi0KLSAgICAgIHByZXZhcmc9IiRhcmciCi0KLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgLWFsbC1zdGF0aWMpCi0JaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAjIFNlZSBjb21tZW50IGZvciAtc3RhdGljIGZsYWcgYmVsb3csIGZvciBtb3JlIGRldGFpbHMuCi0JICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkbGlua19zdGF0aWNfZmxhZyIKLQkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkbGlua19zdGF0aWNfZmxhZyIKLQlmaQotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWFsbG93LXVuZGVmaW5lZCkKLQkjIEZJWE1FOiByZW1vdmUgdGhpcyBmbGFnIHNvbWV0aW1lIGluIHRoZSBmdXR1cmUuCi0JZnVuY19mYXRhbF9lcnJvciAiXGAtYWxsb3ctdW5kZWZpbmVkJyBtdXN0IG5vdCBiZSB1c2VkIGJlY2F1c2UgaXQgaXMgdGhlIGRlZmF1bHQiCi0JOzsKLQotICAgICAgLWF2b2lkLXZlcnNpb24pCi0JYXZvaWRfdmVyc2lvbj15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1iaW5kaXIpCi0JcHJldj1iaW5kaXIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1kbG9wZW4pCi0JcHJldj1kbGZpbGVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZGxwcmVvcGVuKQotCXByZXY9ZGxwcmVmaWxlcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWV4cG9ydC1keW5hbWljKQotCWV4cG9ydF9keW5hbWljPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWV4cG9ydC1zeW1ib2xzIHwgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4KQotCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgZnVuY19mYXRhbF9lcnJvciAibW9yZSB0aGFuIG9uZSAtZXhwb3J0ZWQtc3ltYm9scyBhcmd1bWVudCBpcyBub3QgYWxsb3dlZCIKLQlmaQotCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWV4cG9ydC1zeW1ib2xzIjsgdGhlbgotCSAgcHJldj1leHBzeW1zCi0JZWxzZQotCSAgcHJldj1leHBzeW1zX3JlZ2V4Ci0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1mcmFtZXdvcmspCi0JcHJldj1mcmFtZXdvcmsKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1pbnN0LXByZWZpeC1kaXIpCi0JcHJldj1pbnN0X3ByZWZpeAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgIyBUaGUgbmF0aXZlIElSSVggbGlua2VyIHVuZGVyc3RhbmRzIC1MQU5HOiosIC1MSVNUOiogYW5kIC1MTk86KgotICAgICAgIyBzbywgaWYgd2Ugc2VlIHRoZXNlIGZsYWdzIGJlIGNhcmVmdWwgbm90IHRvIHRyZWF0IHRoZW0gbGlrZSAtTAotICAgICAgLUxbQS1aXVtBLVpdKjoqKQotCWNhc2UgJHdpdGhfZ2NjLyRob3N0IGluCi0Jbm8vKi0qLWlyaXgqIHwgLyotKi1pcml4KikKLQkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCi0JICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKLQkgIDs7Ci0JZXNhYwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLUwqKQotCWZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRhcmciCi0JZGlyPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQlpZiB0ZXN0IC16ICIkZGlyIjsgdGhlbgotCSAgaWYgdGVzdCAiJCMiIC1ndCAwOyB0aGVuCi0JICAgIGZ1bmNfZmF0YWxfZXJyb3IgInJlcXVpcmUgbm8gc3BhY2UgYmV0d2VlbiBcYC1MJyBhbmQgXGAkMSciCi0JICBlbHNlCi0JICAgIGZ1bmNfZmF0YWxfZXJyb3IgIm5lZWQgcGF0aCBmb3IgXGAtTCcgb3B0aW9uIgotCSAgZmkKLQlmaQotCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgotCWNhc2UgJGRpciBpbgotCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKLQkqKQotCSAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAotCSAgdGVzdCAteiAiJGFic2RpciIgJiYgXAotCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciCi0JICBkaXI9IiRhYnNkaXIiCi0JICA7OwotCWVzYWMKLQljYXNlICIkZGVwbGlicyAiIGluCi0JKiIgLUwkZGlyICIqKSA7OwotCSopCi0JICBkZXBsaWJzPSIkZGVwbGlicyAtTCRkaXIiCi0JICBsaWJfc2VhcmNoX3BhdGg9IiRsaWJfc2VhcmNoX3BhdGggJGRpciIKLQkgIDs7Ci0JZXNhYwotCWNhc2UgJGhvc3QgaW4KLQkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQotCSAgdGVzdGJpbmRpcj1gJEVDSE8gIiRkaXIiIHwgJFNFRCAncyovbGliJCovYmluKidgCi0JICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KLQkgICoiOiRkaXI6IiopIDs7Ci0JICA6OikgZGxsc2VhcmNocGF0aD0kZGlyOzsKLQkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRkaXIiOzsKLQkgIGVzYWMKLQkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgotCSAgKiI6JHRlc3RiaW5kaXI6IiopIDs7Ci0JICA6OikgZGxsc2VhcmNocGF0aD0kdGVzdGJpbmRpcjs7Ci0JICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokdGVzdGJpbmRpciI7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbCopCi0JaWYgdGVzdCAiWCRhcmciID0gIlgtbGMiIHx8IHRlc3QgIlgkYXJnIiA9ICJYLWxtIjsgdGhlbgotCSAgY2FzZSAkaG9zdCBpbgotCSAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLWJlb3MqIHwgKi1jZWdjYyogfCAqLSotaGFpa3UqKQotCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgb3IgbWF0aCBsaWJyYXJ5IChhcyBzdWNoKQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgKi0qLW9zMiopCi0JICAgICMgVGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgQyBsaWJyYXJ5IChhcyBzdWNoKQotCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKLQkgICAgOzsKLQkgICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQotCSAgICAjIERvIG5vdCBpbmNsdWRlIGxpYmMgZHVlIHRvIHVzIGhhdmluZyBsaWJjL2xpYmNfci4KLQkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCi0JICAgIDs7Ci0JICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCi0JICAgICMgUmhhcHNvZHkgQyBhbmQgbWF0aCBsaWJyYXJpZXMgYXJlIGluIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCi0JICAgIGRlcGxpYnM9IiRkZXBsaWJzIFN5c3RlbS5sdGZyYW1ld29yayIKLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgICotKi1zY28zLjJ2NSogfCAqLSotc2NvNXY2KikKLQkgICAgIyBDYXVzZXMgcHJvYmxlbXMgd2l0aCBfX2N0eXBlCi0JICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQotCSAgICA7OwotCSAgKi0qLXN5c3Y0LjJ1dzIqIHwgKi0qLXN5c3Y1KiB8ICotKi11bml4d2FyZSogfCAqLSotT3BlblVOSVgqKQotCSAgICAjIENvbXBpbGVyIGluc2VydHMgbGliYyBpbiB0aGUgY29ycmVjdCBwbGFjZSBmb3IgdGhyZWFkcyB0byB3b3JrCi0JICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQotCSAgICA7OwotCSAgZXNhYwotCWVsaWYgdGVzdCAiWCRhcmciID0gIlgtbGNfciI7IHRoZW4KLQkgY2FzZSAkaG9zdCBpbgotCSAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKLQkgICAjIERvIG5vdCBpbmNsdWRlIGxpYmNfciBkaXJlY3RseSwgdXNlIC1wdGhyZWFkIGZsYWcuCi0JICAgY29udGludWUKLQkgICA7OwotCSBlc2FjCi0JZmkKLQlkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW1vZHVsZSkKLQltb2R1bGU9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAjIFRydTY0IFVOSVggdXNlcyAtbW9kZWwgW2FyZ10gdG8gZGV0ZXJtaW5lIHRoZSBsYXlvdXQgb2YgQysrCi0gICAgICAjIGNsYXNzZXMsIG5hbWUgbWFuZ2xpbmcsIGFuZCBleGNlcHRpb24gaGFuZGxpbmcuCi0gICAgICAjIERhcndpbiB1c2VzIHRoZSAtYXJjaCBmbGFnIHRvIGRldGVybWluZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLgotICAgICAgLW1vZGVsfC1hcmNofC1pc3lzcm9vdCkKLQljb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCi0JZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGFyZyIKLQlmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKLQlwcmV2PXhjb21waWxlcgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZXwtdGhyZWFkcykKLQljb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCi0JZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGFyZyIKLQlmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKLQljYXNlICIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiBpbgotCSAgICAqIiAkYXJnICIqKSA7OwotCSAgICAqICkgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9IiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAkYXJnIiA7OwotCWVzYWMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1tdWx0aV9tb2R1bGUpCi0Jc2luZ2xlX21vZHVsZT0iJHt3bH0tbXVsdGlfbW9kdWxlIgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW5vLWZhc3QtaW5zdGFsbCkKLQlmYXN0X2luc3RhbGw9bm8KLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1uby1pbnN0YWxsKQotCWNhc2UgJGhvc3QgaW4KLQkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotKi1kYXJ3aW4qIHwgKi1jZWdjYyopCi0JICAjIFRoZSBQQVRIIGhhY2tlcnkgaW4gd3JhcHBlciBzY3JpcHRzIGlzIHJlcXVpcmVkIG9uIFdpbmRvd3MKLQkgICMgYW5kIERhcndpbiBpbiBvcmRlciBmb3IgdGhlIGxvYWRlciB0byBmaW5kIGFueSBkbGxzIGl0IG5lZWRzLgotCSAgZnVuY193YXJuaW5nICJcYC1uby1pbnN0YWxsJyBpcyBpZ25vcmVkIGZvciAkaG9zdCIKLQkgIGZ1bmNfd2FybmluZyAiYXNzdW1pbmcgXGAtbm8tZmFzdC1pbnN0YWxsJyBpbnN0ZWFkIgotCSAgZmFzdF9pbnN0YWxsPW5vCi0JICA7OwotCSopIG5vX2luc3RhbGw9eWVzIDs7Ci0JZXNhYwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW5vLXVuZGVmaW5lZCkKLQlhbGxvd191bmRlZmluZWQ9bm8KLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1vYmplY3RsaXN0KQotCXByZXY9b2JqZWN0bGlzdAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW8pIHByZXY9b3V0cHV0IDs7Ci0KLSAgICAgIC1wcmVjaW91cy1maWxlcy1yZWdleCkKLQlwcmV2PXByZWNpb3VzX3JlZ2V4Ci0JY29udGludWUKLQk7OwotCi0gICAgICAtcmVsZWFzZSkKLQlwcmV2PXJlbGVhc2UKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1ycGF0aCkKLQlwcmV2PXJwYXRoCi0JY29udGludWUKLQk7OwotCi0gICAgICAtUikKLQlwcmV2PXhycGF0aAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVIqKQotCWZ1bmNfc3RyaXBuYW1lICctUicgJycgIiRhcmciCi0JZGlyPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQljYXNlICRkaXIgaW4KLQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7Ci0JKikKLQkgIGZ1bmNfZmF0YWxfZXJyb3IgIm9ubHkgYWJzb2x1dGUgcnVuLXBhdGhzIGFyZSBhbGxvd2VkIgotCSAgOzsKLQllc2FjCi0JY2FzZSAiJHhycGF0aCAiIGluCi0JKiIgJGRpciAiKikgOzsKLQkqKSB4cnBhdGg9IiR4cnBhdGggJGRpciIgOzsKLQllc2FjCi0JY29udGludWUKLQk7OwotCi0gICAgICAtc2hhcmVkKQotCSMgVGhlIGVmZmVjdHMgb2YgLXNoYXJlZCBhcmUgZGVmaW5lZCBpbiBhIHByZXZpb3VzIGxvb3AuCi0JY29udGludWUKLQk7OwotCi0gICAgICAtc2hyZXh0KQotCXByZXY9c2hyZXh0Ci0JY29udGludWUKLQk7OwotCi0gICAgICAtc3RhdGljIHwgLXN0YXRpYy1saWJ0b29sLWxpYnMpCi0JIyBUaGUgZWZmZWN0cyBvZiAtc3RhdGljIGFyZSBkZWZpbmVkIGluIGEgcHJldmlvdXMgbG9vcC4KLQkjIFdlIHVzZWQgdG8gZG8gdGhlIHNhbWUgYXMgLWFsbC1zdGF0aWMgb24gcGxhdGZvcm1zIHRoYXQKLQkjIGRpZG4ndCBoYXZlIGEgUElDIGZsYWcsIGJ1dCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBlZmZlY3RzCi0JIyB3b3VsZCBiZSBlcXVpdmFsZW50IHdhcyB3cm9uZy4gIEl0IHdvdWxkIGJyZWFrIG9uIGF0IGxlYXN0Ci0JIyBEaWdpdGFsIFVuaXggYW5kIEFJWC4KLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC10aHJlYWQtc2FmZSkKLQl0aHJlYWRfc2FmZT15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC12ZXJzaW9uLWluZm8pCi0JcHJldj12aW5mbwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXZlcnNpb24tbnVtYmVyKQotCXByZXY9dmluZm8KLQl2aW5mb19udW1iZXI9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtd2VhaykKLSAgICAgICAgcHJldj13ZWFrCi0JY29udGludWUKLQk7OwotCi0gICAgICAtV2MsKikKLQlmdW5jX3N0cmlwbmFtZSAnLVdjLCcgJycgIiRhcmciCi0JYXJncz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JYXJnPQotCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJwotCWZvciBmbGFnIGluICRhcmdzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGZsYWciCi0JICBhcmc9IiRhcmcgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgotCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCi0JZG9uZQotCUlGUz0iJHNhdmVfaWZzIgotCWZ1bmNfc3RyaXBuYW1lICcgJyAnJyAiJGFyZyIKLQlhcmc9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCTs7Ci0KLSAgICAgIC1XbCwqKQotCWZ1bmNfc3RyaXBuYW1lICctV2wsJyAnJyAiJGFyZyIKLQlhcmdzPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQlhcmc9Ci0Jc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCi0JZm9yIGZsYWcgaW4gJGFyZ3M7IGRvCi0JICBJRlM9IiRzYXZlX2lmcyIKLSAgICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkZmxhZyIKLQkgIGFyZz0iJGFyZyAkd2wkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICR3bCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLQkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCi0JZG9uZQotCUlGUz0iJHNhdmVfaWZzIgotCWZ1bmNfc3RyaXBuYW1lICcgJyAnJyAiJGFyZyIKLQlhcmc9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCTs7Ci0KLSAgICAgIC1YY29tcGlsZXIpCi0JcHJldj14Y29tcGlsZXIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1YbGlua2VyKQotCXByZXY9eGxpbmtlcgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVhDQ2xpbmtlcikKLQlwcmV2PXhjY2xpbmtlcgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgIyAtbXNnXyogZm9yIG9zZiBjYwotICAgICAgLW1zZ18qKQotCWZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCi0JYXJnPSIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCi0JOzsKLQotICAgICAgIyBGbGFncyB0byBiZSBwYXNzZWQgdGhyb3VnaCB1bmNoYW5nZWQsIHdpdGggcmF0aW9uYWxlOgotICAgICAgIyAtNjQsIC1taXBzWzAtOV0gICAgICBlbmFibGUgNjQtYml0IG1vZGUgZm9yIHRoZSBTR0kgY29tcGlsZXIKLSAgICAgICMgLXJbMC05XVswLTldKiAgICAgICAgc3BlY2lmeSBwcm9jZXNzb3IgZm9yIHRoZSBTR0kgY29tcGlsZXIKLSAgICAgICMgLXhhcmNoPSosIC14dGFyZ2V0PSogZW5hYmxlIDY0LWJpdCBtb2RlIGZvciB0aGUgU3VuIGNvbXBpbGVyCi0gICAgICAjICtEQSosICtERCogICAgICAgICAgIGVuYWJsZSA2NC1iaXQgbW9kZSBmb3IgdGhlIEhQIGNvbXBpbGVyCi0gICAgICAjIC1xKiAgICAgICAgICAgICAgICAgIGNvbXBpbGVyIGFyZ3MgZm9yIHRoZSBJQk0gY29tcGlsZXIKLSAgICAgICMgLW0qLCAtdFs0NV0qLCAtdHhzY2FsZSogYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGZsYWdzIGZvciBHQ0MKLSAgICAgICMgLUYvcGF0aCAgICAgICAgICAgICAgcGF0aCB0byB1bmluc3RhbGxlZCBmcmFtZXdvcmtzLCBnY2Mgb24gZGFyd2luCi0gICAgICAjIC1wLCAtcGcsIC0tY292ZXJhZ2UsIC1mcHJvZmlsZS0qICBwcm9maWxpbmcgZmxhZ3MgZm9yIEdDQwotICAgICAgIyBAZmlsZSAgICAgICAgICAgICAgICBHQ0MgcmVzcG9uc2UgZmlsZXMKLSAgICAgICMgLXRwPSogICAgICAgICAgICAgICAgUG9ydGxhbmQgcGdjYyB0YXJnZXQgcHJvY2Vzc29yIHNlbGVjdGlvbgotICAgICAgLTY0fC1taXBzWzAtOV18LXJbMC05XVswLTldKnwteGFyY2g9KnwteHRhcmdldD0qfCtEQSp8K0REKnwtcSp8LW0qfCBcCi0gICAgICAtdFs0NV0qfC10eHNjYWxlKnwtcHwtcGd8LS1jb3ZlcmFnZXwtZnByb2ZpbGUtKnwtRip8QCp8LXRwPSopCi0gICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCi0JYXJnPSIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCi0gICAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCi0gICAgICAgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgotICAgICAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCi0gICAgICAgIGNvbnRpbnVlCi0gICAgICAgIDs7Ci0KLSAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBmbGFnLgotICAgICAgLSogfCArKikKLSAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKLQlhcmc9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLQk7OwotCi0gICAgICAqLiRvYmpleHQpCi0JIyBBIHN0YW5kYXJkIG9iamVjdC4KLQlvYmpzPSIkb2JqcyAkYXJnIgotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCi0KLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCi0JaWYgZnVuY19sYWxpYl91bnNhZmVfcCAiJGFyZyI7IHRoZW4KLQkgIHBpY19vYmplY3Q9Ci0JICBub25fcGljX29iamVjdD0KLQotCSAgIyBSZWFkIHRoZSAubG8gZmlsZQotCSAgZnVuY19zb3VyY2UgIiRhcmciCi0KLQkgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fAotCSAgICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAotCSAgICAgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSAmJgotCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KLQkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciCi0JICBmaQotCi0JICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgotCSAgZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKLQkgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgotCi0JICBpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgotCSAgICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgotCSAgICBwaWNfb2JqZWN0PSIkeGRpciRwaWNfb2JqZWN0IgotCi0JICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KLQkgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCi0JCWRsZmlsZXM9IiRkbGZpbGVzICRwaWNfb2JqZWN0IgotCQlwcmV2PQotCQljb250aW51ZQotCSAgICAgIGVsc2UKLQkJIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KLQkJcHJldj1kbHByZWZpbGVzCi0JICAgICAgZmkKLQkgICAgZmkKLQotCSAgICAjIENIRUNLIE1FOiAgSSB0aGluayBJIGJ1c3RlZCB0aGlzLiAgLU9zc2FtYQotCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JICAgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotCSAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRwaWNfb2JqZWN0IgotCSAgICAgIHByZXY9Ci0JICAgIGZpCi0KLQkgICAgIyBBIFBJQyBvYmplY3QuCi0JICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKLQkgICAgYXJnPSIkcGljX29iamVjdCIKLQkgIGZpCi0KLQkgICMgTm9uLVBJQyBvYmplY3QuCi0JICBpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KLQkgICAgbm9uX3BpY19vYmplY3Q9IiR4ZGlyJG5vbl9waWNfb2JqZWN0IgotCi0JICAgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAotCSAgICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCi0JICAgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lIDsgdGhlbgotCSAgICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgotCSAgICBmaQotCSAgZWxzZQotCSAgICAjIElmIHRoZSBQSUMgb2JqZWN0IGV4aXN0cywgdXNlIGl0IGluc3RlYWQuCi0JICAgICMgJHhkaXIgd2FzIHByZXBlbmRlZCB0byAkcGljX29iamVjdCBhYm92ZS4KLQkgICAgbm9uX3BpY19vYmplY3Q9IiRwaWNfb2JqZWN0IgotCSAgICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCi0JICBmaQotCWVsc2UKLQkgICMgT25seSBhbiBlcnJvciBpZiBub3QgZG9pbmcgYSBkcnktcnVuLgotCSAgaWYgJG9wdF9kcnlfcnVuOyB0aGVuCi0JICAgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCi0JICAgIGZ1bmNfZGlybmFtZSAiJGFyZyIgIi8iICIiCi0JICAgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgotCi0JICAgIGZ1bmNfbG8ybyAiJGFyZyIKLQkgICAgcGljX29iamVjdD0keGRpciRvYmpkaXIvJGZ1bmNfbG8yb19yZXN1bHQKLQkgICAgbm9uX3BpY19vYmplY3Q9JHhkaXIkZnVuY19sbzJvX3Jlc3VsdAotCSAgICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCi0JICAgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKLQkgIGVsc2UKLQkgICAgZnVuY19mYXRhbF9lcnJvciAiXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIKLQkgIGZpCi0JZmkKLQk7OwotCi0gICAgICAqLiRsaWJleHQpCi0JIyBBbiBhcmNoaXZlLgotCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCi0Jb2xkX2RlcGxpYnM9IiRvbGRfZGVwbGlicyAkYXJnIgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgKi5sYSkKLQkjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCi0KLQlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JICAjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KLQkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICBwcmV2PQotCWVsaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgIyBUaGUgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KLQkgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCi0JICBwcmV2PQotCWVsc2UKLQkgIGRlcGxpYnM9IiRkZXBsaWJzICRhcmciCi0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KLSAgICAgICopCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgotCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgotCTs7Ci0gICAgICBlc2FjICMgYXJnCi0KLSAgICAgICMgTm93IGFjdHVhbGx5IHN1YnN0aXR1dGUgdGhlIGFyZ3VtZW50IGludG8gdGhlIGNvbW1hbmRzLgotICAgICAgaWYgdGVzdCAtbiAiJGFyZyI7IHRoZW4KLQlmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgotCWZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgotICAgICAgZmkKLSAgICBkb25lICMgYXJndW1lbnQgcGFyc2luZyBsb29wCi0KLSAgICB0ZXN0IC1uICIkcHJldiIgJiYgXAotICAgICAgZnVuY19mYXRhbF9oZWxwICJ0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IgotCi0gICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllcyAmJiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgotICAgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKLSAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCi0gICAgICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKLSAgICBmaQotCi0gICAgb2xkbGlicz0KLSAgICAjIGNhbGN1bGF0ZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgd2l0aG91dCBpdHMgZGlyZWN0b3J5Ci0gICAgZnVuY19iYXNlbmFtZSAiJG91dHB1dCIKLSAgICBvdXRwdXRuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0gICAgbGlib2Jqc19zYXZlPSIkbGlib2JqcyIKLQotICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotICAgICAgIyBnZXQgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiAkc2hsaWJwYXRoX3ZhcgotICAgICAgZXZhbCBzaGxpYl9zZWFyY2hfcGF0aD1cYFwkRUNITyBcIlwkeyRzaGxpYnBhdGhfdmFyfVwiIFx8IFwkU0VEIFwncy86LyAvZ1wnXGAKLSAgICBlbHNlCi0gICAgICBzaGxpYl9zZWFyY2hfcGF0aD0KLSAgICBmaQotICAgIGV2YWwgc3lzX2xpYl9zZWFyY2hfcGF0aD1cIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWNcIgotICAgIGV2YWwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoPVwiJHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjXCIKLQotICAgIGZ1bmNfZGlybmFtZSAiJG91dHB1dCIgIi8iICIiCi0gICAgb3V0cHV0X29iamRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQkb2JqZGlyIgotICAgICMgQ3JlYXRlIHRoZSBvYmplY3QgZGlyZWN0b3J5LgotICAgIGZ1bmNfbWtkaXJfcCAiJG91dHB1dF9vYmpkaXIiCi0KLSAgICAjIERldGVybWluZSB0aGUgdHlwZSBvZiBvdXRwdXQKLSAgICBjYXNlICRvdXRwdXQgaW4KLSAgICAiIikKLSAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQgZmlsZSIKLSAgICAgIDs7Ci0gICAgKi4kbGliZXh0KSBsaW5rbW9kZT1vbGRsaWIgOzsKLSAgICAqLmxvIHwgKi4kb2JqZXh0KSBsaW5rbW9kZT1vYmogOzsKLSAgICAqLmxhKSBsaW5rbW9kZT1saWIgOzsKLSAgICAqKSBsaW5rbW9kZT1wcm9nIDs7ICMgQW55dGhpbmcgZWxzZSBzaG91bGQgYmUgYSBwcm9ncmFtLgotICAgIGVzYWMKLQotICAgIHNwZWNpYWxkZXBsaWJzPQotCi0gICAgbGlicz0KLSAgICAjIEZpbmQgYWxsIGludGVyZGVwZW5kZW50IGRlcGxpYnMgYnkgc2VhcmNoaW5nIGZvciBsaWJyYXJpZXMKLSAgICAjIHRoYXQgYXJlIGxpbmtlZCBtb3JlIHRoYW4gb25jZSAoZS5nLiAtbGEgLWxiIC1sYSkKLSAgICBmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbwotICAgICAgaWYgJG9wdF9kdXBsaWNhdGVfZGVwcyA7IHRoZW4KLQljYXNlICIkbGlicyAiIGluCi0JKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBsaWJzPSIkbGlicyAkZGVwbGliIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KLSAgICAgIGxpYnM9IiRwcmVkZXBzICRsaWJzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggJHBvc3RkZXBzIgotCi0gICAgICAjIENvbXB1dGUgbGlicmFyaWVzIHRoYXQgYXJlIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiAkcHJlZGVwcwotICAgICAgIyAkcG9zdGRlcHMgYW5kIG1hcmsgdGhlbSBhcyBzcGVjaWFsIChpLmUuLCB3aG9zZSBkdXBsaWNhdGVzIGFyZQotICAgICAgIyBub3QgdG8gYmUgZWxpbWluYXRlZCkuCi0gICAgICBwcmVfcG9zdF9kZXBzPQotICAgICAgaWYgJG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM7IHRoZW4KLQlmb3IgcHJlX3Bvc3RfZGVwIGluICRwcmVkZXBzICRwb3N0ZGVwczsgZG8KLQkgIGNhc2UgIiRwcmVfcG9zdF9kZXBzICIgaW4KLQkgICoiICRwcmVfcG9zdF9kZXAgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJHByZV9wb3N0X2RlcHMiIDs7Ci0JICBlc2FjCi0JICBwcmVfcG9zdF9kZXBzPSIkcHJlX3Bvc3RfZGVwcyAkcHJlX3Bvc3RfZGVwIgotCWRvbmUKLSAgICAgIGZpCi0gICAgICBwcmVfcG9zdF9kZXBzPQotICAgIGZpCi0KLSAgICBkZXBsaWJzPQotICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KLSAgICBuZXdsaWJfc2VhcmNoX3BhdGg9Ci0gICAgbmVlZF9yZWxpbms9bm8gIyB3aGV0aGVyIHdlJ3JlIGxpbmtpbmcgYW55IHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCi0gICAgbm90aW5zdF9kZXBsaWJzPSAjIG5vdC1pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKLSAgICBub3RpbnN0X3BhdGg9ICMgcGF0aHMgdGhhdCBjb250YWluIG5vdC1pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKLQotICAgIGNhc2UgJGxpbmttb2RlIGluCi0gICAgbGliKQotCXBhc3Nlcz0iY29udiBkbHByZW9wZW4gbGluayIKLQlmb3IgZmlsZSBpbiAkZGxmaWxlcyAkZGxwcmVmaWxlczsgZG8KLQkgIGNhc2UgJGZpbGUgaW4KLQkgICoubGEpIDs7Ci0JICAqKQotCSAgICBmdW5jX2ZhdGFsX2hlbHAgImxpYnJhcmllcyBjYW4gXGAtZGxvcGVuJyBvbmx5IGxpYnRvb2wgbGlicmFyaWVzOiAkZmlsZSIKLQkgICAgOzsKLQkgIGVzYWMKLQlkb25lCi0JOzsKLSAgICBwcm9nKQotCWNvbXBpbGVfZGVwbGlicz0KLQlmaW5hbGl6ZV9kZXBsaWJzPQotCWFsbGRlcGxpYnM9bm8KLQluZXdkbGZpbGVzPQotCW5ld2RscHJlZmlsZXM9Ci0JcGFzc2VzPSJjb252IHNjYW4gZGxvcGVuIGRscHJlb3BlbiBsaW5rIgotCTs7Ci0gICAgKikgIHBhc3Nlcz0iY29udiIKLQk7OwotICAgIGVzYWMKLQotICAgIGZvciBwYXNzIGluICRwYXNzZXM7IGRvCi0gICAgICAjIFRoZSBwcmVvcGVuIHBhc3MgaW4gbGliIG1vZGUgcmV2ZXJzZXMgJGRlcGxpYnM7IHB1dCBpdCBiYWNrIGhlcmUKLSAgICAgICMgc28gdGhhdCAtTCBjb21lcyBiZWZvcmUgbGlicyB0aGF0IG5lZWQgaXQgZm9yIGluc3RhbmNlLi4uCi0gICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIjsgdGhlbgotCSMjIEZJWE1FOiBGaW5kIHRoZSBwbGFjZSB3aGVyZSB0aGUgbGlzdCBpcyByZWJ1aWx0IGluIHRoZSB3cm9uZwotCSMjICAgICAgICBvcmRlciwgYW5kIGZpeCBpdCB0aGVyZSBwcm9wZXJseQotICAgICAgICB0bXBfZGVwbGlicz0KLQlmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbwotCSAgdG1wX2RlcGxpYnM9IiRkZXBsaWIgJHRtcF9kZXBsaWJzIgotCWRvbmUKLQlkZXBsaWJzPSIkdG1wX2RlcGxpYnMiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIiB8fAotCSB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csc2NhbiI7IHRoZW4KLQlsaWJzPSIkZGVwbGlicyIKLQlkZXBsaWJzPQotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JY2FzZSAkcGFzcyBpbgotCWRsb3BlbikgbGlicz0iJGRsZmlsZXMiIDs7Ci0JZGxwcmVvcGVuKSBsaWJzPSIkZGxwcmVmaWxlcyIgOzsKLQlsaW5rKSBsaWJzPSIkZGVwbGlicyAlREVQTElCUyUgJGRlcGVuZGVuY3lfbGlicyIgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsZGxwcmVvcGVuIjsgdGhlbgotCSMgQ29sbGVjdCBhbmQgZm9yd2FyZCBkZXBsaWJzIG9mIHByZW9wZW5lZCBsaWJ0b29sIGxpYnMKLQlmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbwotCSAgIyBJZ25vcmUgbm9uLWxpYnRvb2wtbGlicwotCSAgZGVwZW5kZW5jeV9saWJzPQotCSAgY2FzZSAkbGliIGluCi0JICAqLmxhKQlmdW5jX3NvdXJjZSAiJGxpYiIgOzsKLQkgIGVzYWMKLQotCSAgIyBDb2xsZWN0IHByZW9wZW5lZCBsaWJ0b29sIGRlcGxpYnMsIGV4Y2VwdCBhbnkgdGhpcyBsaWJyYXJ5Ci0JICAjIGhhcyBkZWNsYXJlZCBhcyB3ZWFrIGxpYnMKLQkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgZnVuY19iYXNlbmFtZSAiJGRlcGxpYiIKLSAgICAgICAgICAgIGRlcGxpYl9iYXNlPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAotCSAgICBjYXNlICIgJHdlYWtfbGlicyAiIGluCi0JICAgICoiICRkZXBsaWJfYmFzZSAiKikgOzsKLQkgICAgKikgZGVwbGlicz0iJGRlcGxpYnMgJGRlcGxpYiIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWRvbmUKLQlsaWJzPSIkZGxwcmVmaWxlcyIKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkcGFzcyIgPSBkbG9wZW47IHRoZW4KLQkjIENvbGxlY3QgZGxwcmVvcGVuZWQgbGlicmFyaWVzCi0Jc2F2ZV9kZXBsaWJzPSIkZGVwbGlicyIKLQlkZXBsaWJzPQotICAgICAgZmkKLQotICAgICAgZm9yIGRlcGxpYiBpbiAkbGliczsgZG8KLQlsaWI9Ci0JZm91bmQ9bm8KLQljYXNlICRkZXBsaWIgaW4KLQktbXR8LW10aHJlYWRzfC1rdGhyZWFkfC1LdGhyZWFkfC1wdGhyZWFkfC1wdGhyZWFkc3wtLXRocmVhZC1zYWZlfC10aHJlYWRzKQotCSAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCi0JICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgZWxzZQotCSAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWIiCi0JICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgOyB0aGVuCi0JCWNhc2UgIiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiIGluCi0JCSAgICAqIiAkZGVwbGliICIqKSA7OwotCQkgICAgKiApIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGRlcGxpYiIgOzsKLQkJZXNhYwotCSAgICBmaQotCSAgZmkKLQkgIGNvbnRpbnVlCi0JICA7OwotCS1sKikKLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgIT0gbGliICYmIHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZzsgdGhlbgotCSAgICBmdW5jX3dhcm5pbmcgIlxgLWwnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzL29iamVjdHMiCi0JICAgIGNvbnRpbnVlCi0JICBmaQotCSAgZnVuY19zdHJpcG5hbWUgJy1sJyAnJyAiJGRlcGxpYiIKLQkgIG5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgotCSAgICBzZWFyY2hkaXJzPSIkbmV3bGliX3NlYXJjaF9wYXRoICRsaWJfc2VhcmNoX3BhdGggJGNvbXBpbGVyX2xpYl9zZWFyY2hfZGlycyAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGgiCi0JICBlbHNlCi0JICAgIHNlYXJjaGRpcnM9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGgiCi0JICBmaQotCSAgZm9yIHNlYXJjaGRpciBpbiAkc2VhcmNoZGlyczsgZG8KLQkgICAgZm9yIHNlYXJjaF9leHQgaW4gLmxhICRzdGRfc2hyZXh0IC5zbyAuYTsgZG8KLQkgICAgICAjIFNlYXJjaCB0aGUgbGlidG9vbCBsaWJyYXJ5Ci0JICAgICAgbGliPSIkc2VhcmNoZGlyL2xpYiR7bmFtZX0ke3NlYXJjaF9leHR9IgotCSAgICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCi0JCWlmIHRlc3QgIiRzZWFyY2hfZXh0IiA9ICIubGEiOyB0aGVuCi0JCSAgZm91bmQ9eWVzCi0JCWVsc2UKLQkJICBmb3VuZD1ubwotCQlmaQotCQlicmVhayAyCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZG9uZQotCSAgaWYgdGVzdCAiJGZvdW5kIiAhPSB5ZXM7IHRoZW4KLQkgICAgIyBkZXBsaWIgZG9lc24ndCBzZWVtIHRvIGJlIGEgbGlidG9vbCBsaWJyYXJ5Ci0JICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgotCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgotCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICAgIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAgIGZpCi0JICAgIGNvbnRpbnVlCi0JICBlbHNlICMgZGVwbGliIGlzIGEgbGlidG9vbCBsaWJyYXJ5Ci0JICAgICMgSWYgJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyAmJiAkZGVwbGliIGlzIGEgc3RkbGliLAotCSAgICAjIFdlIG5lZWQgdG8gZG8gc29tZSBzcGVjaWFsIHRoaW5ncyBoZXJlLCBhbmQgbm90IGxhdGVyLgotCSAgICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCi0JICAgICAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCi0JICAgICAgKiIgJGRlcGxpYiAiKikKLQkJaWYgZnVuY19sYWxpYl9wICIkbGliIjsgdGhlbgotCQkgIGxpYnJhcnlfbmFtZXM9Ci0JCSAgb2xkX2xpYnJhcnk9Ci0JCSAgZnVuY19zb3VyY2UgIiRsaWIiCi0JCSAgZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbwotCQkgICAgbGw9IiRsIgotCQkgIGRvbmUKLQkJICBpZiB0ZXN0ICJYJGxsIiA9ICJYJG9sZF9saWJyYXJ5IiA7IHRoZW4gIyBvbmx5IHN0YXRpYyB2ZXJzaW9uIGF2YWlsYWJsZQotCQkgICAgZm91bmQ9bm8KLQkJICAgIGZ1bmNfZGlybmFtZSAiJGxpYiIgIiIgIi4iCi0JCSAgICBsYWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCi0JCSAgICBsaWI9JGxhZGlyLyRvbGRfbGlicmFyeQotCQkgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCi0JCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgotCQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCQkgICAgZWxzZQotCQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCQkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCQkgICAgZmkKLQkJICAgIGNvbnRpbnVlCi0JCSAgZmkKLQkJZmkKLQkJOzsKLQkgICAgICAqKSA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGZpCi0JICA7OyAjIC1sCi0JKi5sdGZyYW1ld29yaykKLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgotCSAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgIGVsc2UKLQkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiA7IHRoZW4KLQkJY2FzZSAiJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KLQkJICAgICoiICRkZXBsaWIgIiopIDs7Ci0JCSAgICAqICkgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9IiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAkZGVwbGliIiA7OwotCQllc2FjCi0JICAgIGZpCi0JICBmaQotCSAgY29udGludWUKLQkgIDs7Ci0JLUwqKQotCSAgY2FzZSAkbGlua21vZGUgaW4KLQkgIGxpYikKLQkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgdGVzdCAiJHBhc3MiID0gY29udiAmJiBjb250aW51ZQotCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICAgZnVuY19zdHJpcG5hbWUgJy1MJyAnJyAiJGRlcGxpYiIKLQkgICAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCi0JICAgIDs7Ci0JICBwcm9nKQotCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgICBjb250aW51ZQotCSAgICBmaQotCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBzY2FuOyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgotCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICAgIGZpCi0JICAgIGZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRkZXBsaWIiCi0JICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgotCSAgICA7OwotCSAgKikKLQkgICAgZnVuY193YXJuaW5nICJcYC1MJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzIgotCSAgICA7OwotCSAgZXNhYyAjIGxpbmttb2RlCi0JICBjb250aW51ZQotCSAgOzsgIyAtTAotCS1SKikKLQkgIGlmIHRlc3QgIiRwYXNzIiA9IGxpbms7IHRoZW4KLQkgICAgZnVuY19zdHJpcG5hbWUgJy1SJyAnJyAiJGRlcGxpYiIKLQkgICAgZGlyPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQkgICAgIyBNYWtlIHN1cmUgdGhlIHhycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KLQkgICAgY2FzZSAiJHhycGF0aCAiIGluCi0JICAgICoiICRkaXIgIiopIDs7Ci0JICAgICopIHhycGF0aD0iJHhycGF0aCAkZGlyIiA7OwotCSAgICBlc2FjCi0JICBmaQotCSAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgIGNvbnRpbnVlCi0JICA7OwotCSoubGEpIGxpYj0iJGRlcGxpYiIgOzsKLQkqLiRsaWJleHQpCi0JICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCi0JICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGNvbnRpbnVlCi0JICBmaQotCSAgY2FzZSAkbGlua21vZGUgaW4KLQkgIGxpYikKLQkgICAgIyBMaW5raW5nIGNvbnZlbmllbmNlIG1vZHVsZXMgaW50byBzaGFyZWQgbGlicmFyaWVzIGlzIGFsbG93ZWQsCi0JICAgICMgYnV0IGxpbmtpbmcgb3RoZXIgc3RhdGljIGxpYnJhcmllcyBpcyBub24tcG9ydGFibGUuCi0JICAgIGNhc2UgIiAkZGxwcmVjb252ZW5pZW5jZWxpYnMgIiBpbgotCSAgICAqIiAkZGVwbGliICIqKSA7OwotCSAgICAqKQotCSAgICAgIHZhbGlkX2FfbGliPW5vCi0JICAgICAgY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLQkJbWF0Y2hfcGF0dGVybiopCi0JCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZDsgc2hpZnQKLQkJICBtYXRjaF9wYXR0ZXJuX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQxIFwoLipcKSJgCi0JCSAgaWYgZXZhbCAiXCRFQ0hPIFwiJGRlcGxpYlwiIiAyPi9kZXYvbnVsbCB8ICRTRUQgMTBxIFwKLQkJICAgIHwgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkJICAgIHZhbGlkX2FfbGliPXllcwotCQkgIGZpCi0JCTs7Ci0JCXBhc3NfYWxsKQotCQkgIHZhbGlkX2FfbGliPXllcwotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgICBpZiB0ZXN0ICIkdmFsaWRfYV9saWIiICE9IHllczsgdGhlbgotCQllY2hvCi0JCSRFQ0hPICIqKiogV2FybmluZzogVHJ5aW5nIHRvIGxpbmsgd2l0aCBzdGF0aWMgbGliIGFyY2hpdmUgJGRlcGxpYi4iCi0JCWVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCWVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCWVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKLQkJZWNobyAiKioqIGJlY2F1c2UgdGhlIGZpbGUgZXh0ZW5zaW9ucyAuJGxpYmV4dCBvZiB0aGlzIGFyZ3VtZW50IG1ha2VzIG1lIGJlbGlldmUiCi0JCWVjaG8gIioqKiB0aGF0IGl0IGlzIGp1c3QgYSBzdGF0aWMgYXJjaGl2ZSB0aGF0IEkgc2hvdWxkIG5vdCB1c2UgaGVyZS4iCi0JICAgICAgZWxzZQotCQllY2hvCi0JCSRFQ0hPICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSIKLQkJJEVDSE8gIioqKiBzdGF0aWMgbGlicmFyeSAkZGVwbGliIGlzIG5vdCBwb3J0YWJsZSEiCi0JCWRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgICAgZmkKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICAgIGNvbnRpbnVlCi0JICAgIDs7Ci0JICBwcm9nKQotCSAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gbGluazsgdGhlbgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBmaQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgZXNhYyAjIGxpbmttb2RlCi0JICA7OyAjICouJGxpYmV4dAotCSoubG8gfCAqLiRvYmpleHQpCi0JICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCi0JICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbiB8fCB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCi0JICAgICAgIyBJZiB0aGVyZSBpcyBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nIHN0YXRpY2FsbHksCi0JICAgICAgIyB3ZSBuZWVkIHRvIHByZWxvYWQuCi0JICAgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRlcGxpYiIKLQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGRlcGxpYiIKLQkgICAgZmkKLQkgIGZpCi0JICBjb250aW51ZQotCSAgOzsKLQklREVQTElCUyUpCi0JICBhbGxkZXBsaWJzPXllcwotCSAgY29udGludWUKLQkgIDs7Ci0JZXNhYyAjIGNhc2UgJGRlcGxpYgotCi0JaWYgdGVzdCAiJGZvdW5kIiA9IHllcyB8fCB0ZXN0IC1mICIkbGliIjsgdGhlbiA6Ci0JZWxzZQotCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgdGhlIGxpYnJhcnkgXGAkbGliJyBvciB1bmhhbmRsZWQgYXJndW1lbnQgXGAkZGVwbGliJyIKLQlmaQotCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlmdW5jX2xhbGliX3Vuc2FmZV9wICIkbGliIiBcCi0JICB8fCBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKLQotCWZ1bmNfZGlybmFtZSAiJGxpYiIgIiIgIi4iCi0JbGFkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgotCi0JZGxuYW1lPQotCWRsb3Blbj0KLQlkbHByZW9wZW49Ci0JbGliZGlyPQotCWxpYnJhcnlfbmFtZXM9Ci0Jb2xkX2xpYnJhcnk9Ci0JaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0KLQkjIElmIHRoZSBsaWJyYXJ5IHdhcyBpbnN0YWxsZWQgd2l0aCBhbiBvbGQgcmVsZWFzZSBvZiBsaWJ0b29sLAotCSMgaXQgd2lsbCBub3QgcmVkZWZpbmUgdmFyaWFibGVzIGluc3RhbGxlZCwgb3Igc2hvdWxkbm90bGluawotCWluc3RhbGxlZD15ZXMKLQlzaG91bGRub3RsaW5rPW5vCi0JYXZvaWR0ZW1wcnBhdGg9Ci0KLQotCSMgUmVhZCB0aGUgLmxhIGZpbGUKLQlmdW5jX3NvdXJjZSAiJGxpYiIKLQotCSMgQ29udmVydCAiLWZyYW1ld29yayBmb28iIHRvICJmb28ubHRmcmFtZXdvcmsiCi0JaWYgdGVzdCAtbiAiJGluaGVyaXRlZF9saW5rZXJfZmxhZ3MiOyB0aGVuCi0JICB0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz1gJEVDSE8gIiRpbmhlcml0ZWRfbGlua2VyX2ZsYWdzIiB8ICRTRUQgJ3MvLWZyYW1ld29yayBcKFteICRdKlwpL1wxLmx0ZnJhbWV3b3JrL2cnYAotCSAgZm9yIHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWcgaW4gJHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWdzOyBkbwotCSAgICBjYXNlICIgJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KLQkgICAgICAqIiAkdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZyAiKikgOzsKLQkgICAgICAqKSBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICR0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFnIjs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWRlcGVuZGVuY3lfbGlicz1gJEVDSE8gIiAkZGVwZW5kZW5jeV9saWJzIiB8ICRTRUQgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCi0JaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayIgfHwKLQkgICB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csc2NhbiIgfHwKLQkgICB7IHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgfTsgdGhlbgotCSAgdGVzdCAtbiAiJGRsb3BlbiIgJiYgZGxmaWxlcz0iJGRsZmlsZXMgJGRsb3BlbiIKLQkgIHRlc3QgLW4gIiRkbHByZW9wZW4iICYmIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRkbHByZW9wZW4iCi0JZmkKLQotCWlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KLQkgICMgT25seSBjaGVjayBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzCi0JICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgotCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIgotCSAgICBmaQotCSAgICAjIEl0IGlzIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBzbyBhZGQgaW4gaXRzIG9iamVjdHMuCi0JICAgIGNvbnZlbmllbmNlPSIkY29udmVuaWVuY2UgJGxhZGlyLyRvYmpkaXIvJG9sZF9saWJyYXJ5IgotCSAgICBvbGRfY29udmVuaWVuY2U9IiRvbGRfY29udmVuaWVuY2UgJGxhZGlyLyRvYmpkaXIvJG9sZF9saWJyYXJ5IgotCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2cgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWI7IHRoZW4KLQkgICAgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSBjb252ZW5pZW5jZSBsaWJyYXJ5IgotCSAgZmkKLQkgIHRtcF9saWJzPQotCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICBpZiAkb3B0X2R1cGxpY2F0ZV9kZXBzIDsgdGhlbgotCSAgICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCi0JICAgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgICAgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIgotCSAgZG9uZQotCSAgY29udGludWUKLQlmaSAjICRwYXNzID0gY29udgotCi0KLQkjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB3ZSBsaW5rIGFnYWluc3QuCi0JbGlua2xpYj0KLQlmb3IgbCBpbiAkb2xkX2xpYnJhcnkgJGxpYnJhcnlfbmFtZXM7IGRvCi0JICBsaW5rbGliPSIkbCIKLQlkb25lCi0JaWYgdGVzdCAteiAiJGxpbmtsaWIiOyB0aGVuCi0JICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkbGliJyIKLQlmaQotCi0JIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCi0JaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCi0JICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgLWRsb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciCi0JICBmaQotCSAgaWYgdGVzdCAteiAiJGRsbmFtZSIgfHwKLQkgICAgIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgIT0geWVzIHx8Ci0JICAgICB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCi0JICAgICMgSWYgdGhlcmUgaXMgbm8gZGxuYW1lLCBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nCi0JICAgICMgc3RhdGljYWxseSwgd2UgbmVlZCB0byBwcmVsb2FkLiAgV2UgYWxzbyBuZWVkIHRvIHByZWxvYWQgYW55Ci0JICAgICMgZGVwZW5kZW50IGxpYnJhcmllcyBzbyBsaWJsdGRsJ3MgZGVwbGliIHByZWxvYWRlciBkb2Vzbid0Ci0JICAgICMgYm9tYiBvdXQgaW4gdGhlIGxvYWQgZGVwbGlicyBwaGFzZS4KLQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGxpYiAkZGVwZW5kZW5jeV9saWJzIgotCSAgZWxzZQotCSAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliIgotCSAgZmkKLQkgIGNvbnRpbnVlCi0JZmkgIyAkcGFzcyA9IGRsb3BlbgotCi0JIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JY2FzZSAkbGFkaXIgaW4KLQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic19sYWRpcj0iJGxhZGlyIiA7OwotCSopCi0JICBhYnNfbGFkaXI9YGNkICIkbGFkaXIiICYmIHB3ZGAKLQkgIGlmIHRlc3QgLXogIiRhYnNfbGFkaXIiOyB0aGVuCi0JICAgIGZ1bmNfd2FybmluZyAiY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRsYWRpciciCi0JICAgIGZ1bmNfd2FybmluZyAicGFzc2luZyBpdCBsaXRlcmFsbHkgdG8gdGhlIGxpbmtlciwgYWx0aG91Z2ggaXQgbWlnaHQgZmFpbCIKLQkgICAgYWJzX2xhZGlyPSIkbGFkaXIiCi0JICBmaQotCSAgOzsKLQllc2FjCi0JZnVuY19iYXNlbmFtZSAiJGxpYiIKLQlsYW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQotCSMgRmluZCB0aGUgcmVsZXZhbnQgb2JqZWN0IGRpcmVjdG9yeSBhbmQgbGlicmFyeSBuYW1lLgotCWlmIHRlc3QgIlgkaW5zdGFsbGVkIiA9IFh5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgISAtZiAiJGxpYmRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KLQkgICAgZnVuY193YXJuaW5nICJsaWJyYXJ5IFxgJGxpYicgd2FzIG1vdmVkLiIKLQkgICAgZGlyPSIkbGFkaXIiCi0JICAgIGFic2Rpcj0iJGFic19sYWRpciIKLQkgICAgbGliZGlyPSIkYWJzX2xhZGlyIgotCSAgZWxzZQotCSAgICBkaXI9IiRsaWJkaXIiCi0JICAgIGFic2Rpcj0iJGxpYmRpciIKLQkgIGZpCi0JICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSBYeWVzICYmIGF2b2lkdGVtcHJwYXRoPXllcwotCWVsc2UKLQkgIGlmIHRlc3QgISAtZiAiJGxhZGlyLyRvYmpkaXIvJGxpbmtsaWIiICYmIHRlc3QgLWYgIiRhYnNfbGFkaXIvJGxpbmtsaWIiOyB0aGVuCi0JICAgIGRpcj0iJGxhZGlyIgotCSAgICBhYnNkaXI9IiRhYnNfbGFkaXIiCi0JICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKLQkgICAgbm90aW5zdF9wYXRoPSIkbm90aW5zdF9wYXRoICRhYnNfbGFkaXIiCi0JICBlbHNlCi0JICAgIGRpcj0iJGxhZGlyLyRvYmpkaXIiCi0JICAgIGFic2Rpcj0iJGFic19sYWRpci8kb2JqZGlyIgotCSAgICAjIFJlbW92ZSB0aGlzIHNlYXJjaCBwYXRoIGxhdGVyCi0JICAgIG5vdGluc3RfcGF0aD0iJG5vdGluc3RfcGF0aCAkYWJzX2xhZGlyIgotCSAgZmkKLQlmaSAjICRpbnN0YWxsZWQgPSB5ZXMKLQlmdW5jX3N0cmlwbmFtZSAnbGliJyAnLmxhJyAiJGxhbmFtZSIKLQluYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQotCSMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgotCWlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbjsgdGhlbgotCSAgaWYgdGVzdCAteiAiJGxpYmRpciIgJiYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQkgICAgZnVuY19mYXRhbF9lcnJvciAib25seSBsaWJyYXJpZXMgbWF5IC1kbHByZW9wZW4gYSBjb252ZW5pZW5jZSBsaWJyYXJ5OiBcYCRsaWInIgotCSAgZmkKLQkgICMgUHJlZmVyIHVzaW5nIGEgc3RhdGljIGxpYnJhcnkgKHNvIHRoYXQgbm8gc2lsbHkgX0RZTkFNSUMgc3ltYm9scwotCSAgIyBhcmUgcmVxdWlyZWQgdG8gbGluaykuCi0JICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCi0JICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkaXIvJG9sZF9saWJyYXJ5IgotCSAgICAjIEtlZXAgYSBsaXN0IG9mIHByZW9wZW5lZCBjb252ZW5pZW5jZSBsaWJyYXJpZXMgdG8gY2hlY2sKLQkgICAgIyB0aGF0IHRoZXkgYXJlIGJlaW5nIHVzZWQgY29ycmVjdGx5IGluIHRoZSBsaW5rIHBhc3MuCi0JICAgIHRlc3QgLXogIiRsaWJkaXIiICYmIFwKLQkJZGxwcmVjb252ZW5pZW5jZWxpYnM9IiRkbHByZWNvbnZlbmllbmNlbGlicyAkZGlyLyRvbGRfbGlicmFyeSIKLQkgICMgT3RoZXJ3aXNlLCB1c2UgdGhlIGRsbmFtZSwgc28gdGhhdCBsdF9kbG9wZW4gZmluZHMgaXQuCi0JICBlbGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCi0JICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkaXIvJGRsbmFtZSIKLQkgIGVsc2UKLQkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kbGlua2xpYiIKLQkgIGZpCi0JZmkgIyAkcGFzcyA9IGRscHJlb3BlbgotCi0JaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkgICMgTGluayB0aGUgY29udmVuaWVuY2UgbGlicmFyeQotCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgotCSAgICBkZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZGVwbGlicyIKLQkgIGVsaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCi0JICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgZmluYWxpemVfZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGZpbmFsaXplX2RlcGxpYnMiCi0JICBlbHNlCi0JICAgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiICMgdXNlZCBmb3IgcHJvZyxzY2FuIHBhc3MKLQkgIGZpCi0JICBjb250aW51ZQotCWZpCi0KLQotCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nICYmIHRlc3QgIiRwYXNzIiAhPSBsaW5rOyB0aGVuCi0JICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGxhZGlyIgotCSAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIKLQotCSAgbGlua2FsbGRlcGxpYnM9bm8KLQkgIGlmIHRlc3QgIiRsaW5rX2FsbF9kZXBsaWJzIiAhPSBubyB8fCB0ZXN0IC16ICIkbGlicmFyeV9uYW1lcyIgfHwKLQkgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KLQkgICAgbGlua2FsbGRlcGxpYnM9eWVzCi0JICBmaQotCi0JICB0bXBfbGlicz0KLQkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgY2FzZSAkZGVwbGliIGluCi0JICAgIC1MKikgZnVuY19zdHJpcG5hbWUgJy1MJyAnJyAiJGRlcGxpYiIKLQkgICAgICAgICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKLQkJIDs7Ci0JICAgIGVzYWMKLQkgICAgIyBOZWVkIHRvIGxpbmsgYWdhaW5zdCBhbGwgZGVwZW5kZW5jeV9saWJzPwotCSAgICBpZiB0ZXN0ICIkbGlua2FsbGRlcGxpYnMiID0geWVzOyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgICMgTmVlZCB0byBoYXJkY29kZSBzaGFyZWQgbGlicmFyeSBwYXRocwotCSAgICAgICMgb3IvYW5kIGxpbmsgYWdhaW5zdCBzdGF0aWMgbGlicmFyaWVzCi0JICAgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAgIGZpCi0JICAgIGlmICRvcHRfZHVwbGljYXRlX2RlcHMgOyB0aGVuCi0JICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCi0JICBkb25lICMgZm9yIGRlcGxpYgotCSAgY29udGludWUKLQlmaSAjICRsaW5rbW9kZSA9IHByb2cuLi4KLQotCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmCi0JICAgICB7IHsgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicyIgPSBubyB8fAotCSAgICAgICAgIHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMsJGluc3RhbGxlZCIgPSAiYnVpbHQseWVzIjsgfSB8fAotCSAgICAgICB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB9OyB0aGVuCi0JICAgICMgV2UgbmVlZCB0byBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoCi0JICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC16ICIkYXZvaWR0ZW1wcnBhdGgiIDsgdGhlbgotCSAgICAgICMgTWFrZSBzdXJlIHRoZSBycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KLQkgICAgICBjYXNlICIkdGVtcF9ycGF0aDoiIGluCi0JICAgICAgKiIkYWJzZGlyOiIqKSA7OwotCSAgICAgICopIHRlbXBfcnBhdGg9IiR0ZW1wX3JwYXRoJGFic2RpcjoiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCi0JICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KLQkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQotCSAgICAjIHNlYXJjaCBwYXRoLgotCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICopCi0JICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgotCSAgICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGFic2RpciIKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICopCi0JICAgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICAgICAqIiAkbGliZGlyICIqKSA7OwotCSAgICAgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZmkgIyAkbGlua21vZGUsJHBhc3MgPSBwcm9nLGxpbmsuLi4KLQotCSAgaWYgdGVzdCAiJGFsbGRlcGxpYnMiID0geWVzICYmCi0JICAgICB7IHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSBwYXNzX2FsbCB8fAotCSAgICAgICB7IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmCi0JCSB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IH07IH07IHRoZW4KLQkgICAgIyBXZSBvbmx5IG5lZWQgdG8gc2VhcmNoIGZvciBzdGF0aWMgbGlicmFyaWVzCi0JICAgIGNvbnRpbnVlCi0JICBmaQotCWZpCi0KLQlsaW5rX3N0YXRpYz1ubyAjIFdoZXRoZXIgdGhlIGRlcGxpYiB3aWxsIGJlIGxpbmtlZCBzdGF0aWNhbGx5Ci0JdXNlX3N0YXRpY19saWJzPSRwcmVmZXJfc3RhdGljX2xpYnMKLQlpZiB0ZXN0ICIkdXNlX3N0YXRpY19saWJzIiA9IGJ1aWx0ICYmIHRlc3QgIiRpbnN0YWxsZWQiID0geWVzOyB0aGVuCi0JICB1c2Vfc3RhdGljX2xpYnM9bm8KLQlmaQotCWlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJgotCSAgIHsgdGVzdCAiJHVzZV9zdGF0aWNfbGlicyIgPSBubyB8fCB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB9OyB0aGVuCi0JICBjYXNlICRob3N0IGluCi0JICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqKQotCSAgICAgICMgTm8gcG9pbnQgaW4gcmVsaW5raW5nIERMTHMgYmVjYXVzZSBwYXRocyBhcmUgbm90IGVuY29kZWQKLQkgICAgICBub3RpbnN0X2RlcGxpYnM9IiRub3RpbnN0X2RlcGxpYnMgJGxpYiIKLQkgICAgICBuZWVkX3JlbGluaz1ubwotCSAgICA7OwotCSAgKikKLQkgICAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubzsgdGhlbgotCSAgICAgIG5vdGluc3RfZGVwbGlicz0iJG5vdGluc3RfZGVwbGlicyAkbGliIgotCSAgICAgIG5lZWRfcmVsaW5rPXllcwotCSAgICBmaQotCSAgICA7OwotCSAgZXNhYwotCSAgIyBUaGlzIGlzIGEgc2hhcmVkIGxpYnJhcnkKLQotCSAgIyBXYXJuIGFib3V0IHBvcnRhYmlsaXR5LCBjYW4ndCBsaW5rIGFnYWluc3QgLW1vZHVsZSdzIG9uIHNvbWUKLQkgICMgc3lzdGVtcyAoZGFyd2luKS4gIERvbid0IGJsZWF0IGFib3V0IGRsb3BlbmVkIG1vZHVsZXMgdGhvdWdoIQotCSAgZGxvcGVubW9kdWxlPSIiCi0JICBmb3IgZGxwcmVtb2R1bGV0ZXN0IGluICRkbHByZWZpbGVzOyBkbwotCSAgICBpZiB0ZXN0ICJYJGRscHJlbW9kdWxldGVzdCIgPSAiWCRsaWIiOyB0aGVuCi0JICAgICAgZGxvcGVubW9kdWxlPSIkZGxwcmVtb2R1bGV0ZXN0IgotCSAgICAgIGJyZWFrCi0JICAgIGZpCi0JICBkb25lCi0JICBpZiB0ZXN0IC16ICIkZGxvcGVubW9kdWxlIiAmJiB0ZXN0ICIkc2hvdWxkbm90bGluayIgPSB5ZXMgJiYgdGVzdCAiJHBhc3MiID0gbGluazsgdGhlbgotCSAgICBlY2hvCi0JICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBleGVjdXRhYmxlICRvdXRwdXQgYWdhaW5zdCB0aGUgbG9hZGFibGUgbW9kdWxlIgotCSAgICBlbHNlCi0JICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIGxvYWRhYmxlIG1vZHVsZSIKLQkgICAgZmkKLQkgICAgJEVDSE8gIioqKiAkbGlua2xpYiBpcyBub3QgcG9ydGFibGUhIgotCSAgZmkKLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYKLQkgICAgIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCi0JICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KLQkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQotCSAgICAjIHNlYXJjaCBwYXRoLgotCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICopCi0JICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgotCSAgICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGFic2RpciIKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICopCi0JICAgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICAgICAqIiAkbGliZGlyICIqKSA7OwotCSAgICAgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZmkKLQotCSAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIjsgdGhlbgotCSAgICAjIGZpZ3VyZSBvdXQgdGhlIHNvbmFtZQotCSAgICBzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKLQkgICAgc2hpZnQKLQkgICAgcmVhbG5hbWU9IiQxIgotCSAgICBzaGlmdAotCSAgICBsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKLQkgICAgIyB1c2UgZGxuYW1lIGlmIHdlIGdvdCBpdC4gaXQncyBwZXJmZWN0bHkgZ29vZCwgbm8/Ci0JICAgIGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCi0JICAgICAgc29uYW1lPSIkZGxuYW1lIgotCSAgICBlbGlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KLQkgICAgICAjIGJsZWggd2luZG93cwotCSAgICAgIGNhc2UgJGhvc3QgaW4KLQkgICAgICAqY3lnd2luKiB8IG1pbmd3KiB8ICpjZWdjYyopCi0JICAgICAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQotCQltYWpvcj0kZnVuY19hcml0aF9yZXN1bHQKLQkJdmVyc3VmZml4PSItJG1ham9yIgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCi0JICAgIGVsc2UKLQkgICAgICBzb25hbWU9IiRyZWFsbmFtZSIKLQkgICAgZmkKLQotCSAgICAjIE1ha2UgYSBuZXcgbmFtZSBmb3IgdGhlIGV4dHJhY3RfZXhwc3ltc19jbWRzIHRvIHVzZQotCSAgICBzb3Jvb3Q9IiRzb25hbWUiCi0JICAgIGZ1bmNfYmFzZW5hbWUgIiRzb3Jvb3QiCi0JICAgIHNvbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotCSAgICBmdW5jX3N0cmlwbmFtZSAnbGliJyAnLmRsbCcgIiRzb25hbWUiCi0JICAgIG5ld2xpYj1saWJpbXAtJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdC5hCi0KLQkgICAgIyBJZiB0aGUgbGlicmFyeSBoYXMgbm8gZXhwb3J0IGxpc3QsIHRoZW4gY3JlYXRlIG9uZSBub3cKLQkgICAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYiOyB0aGVuIDoKLQkgICAgZWxzZQotCSAgICAgIGZ1bmNfdmVyYm9zZSAiZXh0cmFjdGluZyBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIFxgJHNvbmFtZSciCi0JICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRleHRyYWN0X2V4cHN5bXNfY21kcyIgJ2V4aXQgJD8nCi0JICAgIGZpCi0KLQkgICAgIyBDcmVhdGUgJG5ld2xpYgotCSAgICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kbmV3bGliIjsgdGhlbiA6OyBlbHNlCi0JICAgICAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIGltcG9ydCBsaWJyYXJ5IGZvciBcYCRzb25hbWUnIgotCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiICdleGl0ICQ/JwotCSAgICBmaQotCSAgICAjIG1ha2Ugc3VyZSB0aGUgbGlicmFyeSB2YXJpYWJsZXMgYXJlIHBvaW50aW5nIHRvIHRoZSBuZXcgbGlicmFyeQotCSAgICBkaXI9JG91dHB1dF9vYmpkaXIKLQkgICAgbGlua2xpYj0kbmV3bGliCi0JICBmaSAjIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyIKLQotCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgfHwgdGVzdCAiJG1vZGUiICE9IHJlbGluazsgdGhlbgotCSAgICBhZGRfc2hsaWJwYXRoPQotCSAgICBhZGRfZGlyPQotCSAgICBhZGQ9Ci0JICAgIGxpYl9saW5rZWQ9eWVzCi0JICAgIGNhc2UgJGhhcmRjb2RlX2FjdGlvbiBpbgotCSAgICBpbW1lZGlhdGUgfCB1bnN1cHBvcnRlZCkKLQkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IG5vOyB0aGVuCi0JCWFkZD0iJGRpci8kbGlua2xpYiIKLQkJY2FzZSAkaG9zdCBpbgotCQkgICotKi1zY28zLjJ2NS4wLlswMjRdKikgYWRkX2Rpcj0iLUwkZGlyIiA7OwotCQkgICotKi1zeXN2NCp1dzIqKSBhZGRfZGlyPSItTCRkaXIiIDs7Ci0JCSAgKi0qLXN5c3Y1T3BlblVOSVgqIHwgKi0qLXN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCBcCi0JCSAgICAqLSotdW5peHdhcmU3KikgYWRkX2Rpcj0iLUwkZGlyIiA7OwotCQkgICotKi1kYXJ3aW4qICkKLQkJICAgICMgaWYgdGhlIGxpYiBpcyBhIChub24tZGxvcGVuZWQpIG1vZHVsZSB0aGVuIHdlIGNhbiBub3QKLQkJICAgICMgbGluayBhZ2FpbnN0IGl0LCBzb21lb25lIGlzIGlnbm9yaW5nIHRoZSBlYXJsaWVyIHdhcm5pbmdzCi0JCSAgICBpZiAvdXNyL2Jpbi9maWxlIC1MICRhZGQgMj4gL2Rldi9udWxsIHwKLQkJCSAkR1JFUCAiOiBbXjpdKiBidW5kbGUiID4vZGV2L251bGwgOyB0aGVuCi0JCSAgICAgIGlmIHRlc3QgIlgkZGxvcGVubW9kdWxlIiAhPSAiWCRsaWIiOyB0aGVuCi0JCQkkRUNITyAiKioqIFdhcm5pbmc6IGxpYiAkbGlua2xpYiBpcyBhIG1vZHVsZSwgbm90IGEgc2hhcmVkIGxpYnJhcnkiCi0JCQlpZiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiIDsgdGhlbgotCQkJICBlY2hvCi0JCQkgIGVjaG8gIioqKiBBbmQgdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgc3RhdGljIGFyY2hpdmUgYXZhaWxhYmxlIgotCQkJICBlY2hvICIqKiogVGhlIGxpbmsgd2lsbCBwcm9iYWJseSBmYWlsLCBzb3JyeSIKLQkJCWVsc2UKLQkJCSAgYWRkPSIkZGlyLyRvbGRfbGlicmFyeSIKLQkJCWZpCi0JCSAgICAgIGVsaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCQkJYWRkPSIkZGlyLyRvbGRfbGlicmFyeSIKLQkJICAgICAgZmkKLQkJICAgIGZpCi0JCWVzYWMKLQkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IG5vOyB0aGVuCi0JCWNhc2UgJGhvc3QgaW4KLQkJKi0qLXN1bm9zKikgYWRkX3NobGlicGF0aD0iJGRpciIgOzsKLQkJZXNhYwotCQlhZGRfZGlyPSItTCRkaXIiCi0JCWFkZD0iLWwkbmFtZSIKLQkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IG5vOyB0aGVuCi0JCWFkZF9zaGxpYnBhdGg9IiRkaXIiCi0JCWFkZD0iLWwkbmFtZSIKLQkgICAgICBlbHNlCi0JCWxpYl9saW5rZWQ9bm8KLQkgICAgICBmaQotCSAgICAgIDs7Ci0JICAgIHJlbGluaykKLQkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllcyAmJgotCSAgICAgICAgIHRlc3QgIiRoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUiID0gbm87IHRoZW4KLQkJYWRkPSIkZGlyLyRsaW5rbGliIgotCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCi0JCWFkZF9kaXI9Ii1MJGRpciIKLQkJIyBUcnkgbG9va2luZyBmaXJzdCBpbiB0aGUgbG9jYXRpb24gd2UncmUgYmVpbmcgaW5zdGFsbGVkIHRvLgotCQlpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgotCQkgIGNhc2UgJGxpYmRpciBpbgotCQkgICAgW1xcL10qKQotCQkgICAgICBhZGRfZGlyPSIkYWRkX2RpciAtTCRpbnN0X3ByZWZpeF9kaXIkbGliZGlyIgotCQkgICAgICA7OwotCQkgIGVzYWMKLQkJZmkKLQkJYWRkPSItbCRuYW1lIgotCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCi0JCWFkZF9zaGxpYnBhdGg9IiRkaXIiCi0JCWFkZD0iLWwkbmFtZSIKLQkgICAgICBlbHNlCi0JCWxpYl9saW5rZWQ9bm8KLQkgICAgICBmaQotCSAgICAgIDs7Ci0JICAgICopIGxpYl9saW5rZWQ9bm8gOzsKLQkgICAgZXNhYwotCi0JICAgIGlmIHRlc3QgIiRsaWJfbGlua2VkIiAhPSB5ZXM7IHRoZW4KLQkgICAgICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gInVuc3VwcG9ydGVkIGhhcmRjb2RlIHByb3BlcnRpZXMiCi0JICAgIGZpCi0KLQkgICAgaWYgdGVzdCAtbiAiJGFkZF9zaGxpYnBhdGgiOyB0aGVuCi0JICAgICAgY2FzZSA6JGNvbXBpbGVfc2hsaWJwYXRoOiBpbgotCSAgICAgICoiOiRhZGRfc2hsaWJwYXRoOiIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkYWRkX3NobGlicGF0aDoiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgotCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBjb21waWxlX2RlcGxpYnM9IiRhZGRfZGlyICRjb21waWxlX2RlcGxpYnMiCi0JICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkICRjb21waWxlX2RlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZGVwbGlicz0iJGFkZF9kaXIgJGRlcGxpYnMiCi0JICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZGVwbGlicz0iJGFkZCAkZGVwbGlicyIKLQkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB5ZXMgJiYKLQkJIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSB5ZXMgJiYKLQkJIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotCQljYXNlIDokZmluYWxpemVfc2hsaWJwYXRoOiBpbgotCQkqIjokbGliZGlyOiIqKSA7OwotCQkqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIgOzsKLQkJZXNhYwotCSAgICAgIGZpCi0JICAgIGZpCi0JICBmaQotCi0JICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KLQkgICAgYWRkX3NobGlicGF0aD0KLQkgICAgYWRkX2Rpcj0KLQkgICAgYWRkPQotCSAgICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgotCSAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllcyAmJgotCSAgICAgICB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiA9IG5vOyB0aGVuCi0JICAgICAgYWRkPSIkbGliZGlyLyRsaW5rbGliIgotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgotCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKLQkgICAgICBhZGQ9Ii1sJG5hbWUiCi0JICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCi0JICAgICAgY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KLQkgICAgICAqIjokbGliZGlyOiIqKSA7OwotCSAgICAgICopIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6IiA7OwotCSAgICAgIGVzYWMKLQkgICAgICBhZGQ9Ii1sJG5hbWUiCi0JICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSB5ZXM7IHRoZW4KLQkgICAgICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIiAmJgotCQkgdGVzdCAtZiAiJGluc3RfcHJlZml4X2RpciRsaWJkaXIvJGxpbmtsaWIiIDsgdGhlbgotCQlhZGQ9IiRpbnN0X3ByZWZpeF9kaXIkbGliZGlyLyRsaW5rbGliIgotCSAgICAgIGVsc2UKLQkJYWRkPSIkbGliZGlyLyRsaW5rbGliIgotCSAgICAgIGZpCi0JICAgIGVsc2UKLQkgICAgICAjIFdlIGNhbm5vdCBzZWVtIHRvIGhhcmRjb2RlIGl0LCBndWVzcyB3ZSdsbCBmYWtlIGl0LgotCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKLQkgICAgICAjIFRyeSBsb29raW5nIGZpcnN0IGluIHRoZSBsb2NhdGlvbiB3ZSdyZSBiZWluZyBpbnN0YWxsZWQgdG8uCi0JICAgICAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KLQkJY2FzZSAkbGliZGlyIGluCi0JCSAgW1xcL10qKQotCQkgICAgYWRkX2Rpcj0iJGFkZF9kaXIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKLQkJICAgIDs7Ci0JCWVzYWMKLQkgICAgICBmaQotCSAgICAgIGFkZD0iLWwkbmFtZSIKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgotCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkX2RpciAkZmluYWxpemVfZGVwbGlicyIKLQkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgotCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCi0JICAgIGZpCi0JICBmaQotCWVsaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKLQkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAotCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgotCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KLQkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCi0JICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgZWxzZQotCSAgICBjb21waWxlX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRjb21waWxlX2RlcGxpYnMiCi0JICAgIGZpbmFsaXplX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgZmkKLQllbGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JICAjIE5vdCBhIHNoYXJlZCBsaWJyYXJ5Ci0JICBpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCi0JICAgICMgV2UncmUgdHJ5aW5nIGxpbmsgYSBzaGFyZWQgbGlicmFyeSBhZ2FpbnN0IGEgc3RhdGljIG9uZQotCSAgICAjIGJ1dCB0aGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KLQotCSAgICAjIEp1c3QgcHJpbnQgYSB3YXJuaW5nIGFuZCBhZGQgdGhlIGxpYnJhcnkgdG8gZGVwZW5kZW5jeV9saWJzIHNvCi0JICAgICMgdGhhdCB0aGUgcHJvZ3JhbSBjYW4gYmUgbGlua2VkIGFnYWluc3QgdGhlIHN0YXRpYyBsaWJyYXJ5LgotCSAgICBlY2hvCi0JICAgICRFQ0hPICIqKiogV2FybmluZzogVGhpcyBzeXN0ZW0gY2FuIG5vdCBsaW5rIHRvIHN0YXRpYyBsaWIgYXJjaGl2ZSAkbGliLiIKLQkgICAgZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkgICAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkgICAgZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKLQkgICAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KLQkgICAgICBlY2hvICIqKiogQnV0IGFzIHlvdSB0cnkgdG8gYnVpbGQgYSBtb2R1bGUgbGlicmFyeSwgbGlidG9vbCB3aWxsIHN0aWxsIGNyZWF0ZSAiCi0JICAgICAgZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmcgYXBwbGljYXRpb24iCi0JICAgICAgZWNobyAiKioqIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcgdG8gcmVzb2x2ZSBzeW1ib2xzIGF0IHJ1bnRpbWUuIgotCSAgICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0JCWVjaG8KLQkJZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCi0JCWVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCi0JCWVjaG8gIioqKiBub3QgZmluZCBzdWNoIGEgcHJvZ3JhbS4gIFNvLCB0aGlzIG1vZHVsZSBpcyBwcm9iYWJseSB1c2VsZXNzLiIKLQkJZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCi0JICAgICAgZmkKLQkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KLQkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQotCQlidWlsZF9vbGRfbGlicz15ZXMKLQkgICAgICBlbHNlCi0JCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgICAgIGZpCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgotCSAgICBsaW5rX3N0YXRpYz15ZXMKLQkgIGZpCi0JZmkgIyBsaW5rIHNoYXJlZC9zdGF0aWMgbGlicmFyeT8KLQotCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRkZXBlbmRlbmN5X2xpYnMiICYmCi0JICAgICB7IHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fAotCSAgICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzIHx8Ci0JICAgICAgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSB5ZXM7IH07IHRoZW4KLQkgICAgIyBFeHRyYWN0IC1SIGZyb20gZGVwZW5kZW5jeV9saWJzCi0JICAgIHRlbXBfZGVwbGlicz0KLQkgICAgZm9yIGxpYmRpciBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICAgIGNhc2UgJGxpYmRpciBpbgotCSAgICAgIC1SKikgZnVuY19zdHJpcG5hbWUgJy1SJyAnJyAiJGxpYmRpciIKLQkgICAgICAgICAgIHRlbXBfeHJwYXRoPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQkJICAgY2FzZSAiICR4cnBhdGggIiBpbgotCQkgICAqIiAkdGVtcF94cnBhdGggIiopIDs7Ci0JCSAgICopIHhycGF0aD0iJHhycGF0aCAkdGVtcF94cnBhdGgiOzsKLQkJICAgZXNhYzs7Ci0JICAgICAgKikgdGVtcF9kZXBsaWJzPSIkdGVtcF9kZXBsaWJzICRsaWJkaXIiOzsKLQkgICAgICBlc2FjCi0JICAgIGRvbmUKLQkgICAgZGVwZW5kZW5jeV9saWJzPSIkdGVtcF9kZXBsaWJzIgotCSAgZmkKLQotCSAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRhYnNkaXIiCi0JICAjIExpbmsgYWdhaW5zdCB0aGlzIGxpYnJhcnkKLQkgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSBubyAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRhYnNfbGFkaXIvJGxhbmFtZSAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgIyAuLi4gYW5kIGl0cyBkZXBlbmRlbmN5X2xpYnMKLQkgIHRtcF9saWJzPQotCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICAgaWYgJG9wdF9kdXBsaWNhdGVfZGVwcyA7IHRoZW4KLQkgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgotCSAgICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKLQkgIGRvbmUKLQotCSAgaWYgdGVzdCAiJGxpbmtfYWxsX2RlcGxpYnMiICE9IG5vOyB0aGVuCi0JICAgICMgQWRkIHRoZSBzZWFyY2ggcGF0aHMgb2YgYWxsIGRlcGVuZGVuY3kgbGlicmFyaWVzCi0JICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgICBwYXRoPQotCSAgICAgIGNhc2UgJGRlcGxpYiBpbgotCSAgICAgIC1MKikgcGF0aD0iJGRlcGxpYiIgOzsKLQkgICAgICAqLmxhKQotCSAgICAgICAgZnVuY19kaXJuYW1lICIkZGVwbGliIiAiIiAiLiIKLQkJZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLQkJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JCWNhc2UgJGRpciBpbgotCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic2Rpcj0iJGRpciIgOzsKLQkJKikKLQkJICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0JCSAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KLQkJICAgIGZ1bmNfd2FybmluZyAiY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRkaXInIgotCQkgICAgYWJzZGlyPSIkZGlyIgotCQkgIGZpCi0JCSAgOzsKLQkJZXNhYwotCQlpZiAkR1JFUCAiXmluc3RhbGxlZD1ubyIgJGRlcGxpYiA+IC9kZXYvbnVsbDsgdGhlbgotCQljYXNlICRob3N0IGluCi0JCSotKi1kYXJ3aW4qKQotCQkgIGRlcGRlcGw9Ci0JCSAgZXZhbCBkZXBsaWJyYXJ5X25hbWVzPWAke1NFRH0gLW4gLWUgJ3MvXmxpYnJhcnlfbmFtZXM9XCguKlwpJC9cMS9wJyAkZGVwbGliYAotCQkgIGlmIHRlc3QgLW4gIiRkZXBsaWJyYXJ5X25hbWVzIiA7IHRoZW4KLQkJICAgIGZvciB0bXAgaW4gJGRlcGxpYnJhcnlfbmFtZXMgOyBkbwotCQkgICAgICBkZXBkZXBsPSR0bXAKLQkJICAgIGRvbmUKLQkJICAgIGlmIHRlc3QgLWYgIiRhYnNkaXIvJG9iamRpci8kZGVwZGVwbCIgOyB0aGVuCi0JCSAgICAgIGRlcGRlcGw9IiRhYnNkaXIvJG9iamRpci8kZGVwZGVwbCIKLQkJICAgICAgZGFyd2luX2luc3RhbGxfbmFtZT1gJHtPVE9PTH0gLUwgJGRlcGRlcGwgfCBhd2sgJ3tpZiAoTlIgPT0gMikge3ByaW50ICQxO2V4aXR9fSdgCi0gICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGRhcndpbl9pbnN0YWxsX25hbWUiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRhcndpbl9pbnN0YWxsX25hbWU9YCR7T1RPT0w2NH0gLUwgJGRlcGRlcGwgIHwgYXdrICd7aWYgKE5SID09IDIpIHtwcmludCAkMTtleGl0fX0nYAotICAgICAgICAgICAgICAgICAgICAgIGZpCi0JCSAgICAgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHt3bH0tZHlsaWJfZmlsZSAke3dsfSR7ZGFyd2luX2luc3RhbGxfbmFtZX06JHtkZXBkZXBsfSIKLQkJICAgICAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzIC1keWxpYl9maWxlICR7ZGFyd2luX2luc3RhbGxfbmFtZX06JHtkZXBkZXBsfSIKLQkJICAgICAgcGF0aD0KLQkJICAgIGZpCi0JCSAgZmkKLQkJICA7OwotCQkqKQotCQkgIHBhdGg9Ii1MJGFic2Rpci8kb2JqZGlyIgotCQkgIDs7Ci0JCWVzYWMKLQkJZWxzZQotCQkgIGV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRkZXBsaWJgCi0JCSAgdGVzdCAteiAiJGxpYmRpciIgJiYgXAotCQkgICAgZnVuY19mYXRhbF9lcnJvciAiXGAkZGVwbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCi0JCSAgdGVzdCAiJGFic2RpciIgIT0gIiRsaWJkaXIiICYmIFwKLQkJICAgIGZ1bmNfd2FybmluZyAiXGAkZGVwbGliJyBzZWVtcyB0byBiZSBtb3ZlZCIKLQotCQkgIHBhdGg9Ii1MJGFic2RpciIKLQkJZmkKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgICAgY2FzZSAiICRkZXBsaWJzICIgaW4KLQkgICAgICAqIiAkcGF0aCAiKikgOzsKLQkgICAgICAqKSBkZXBsaWJzPSIkcGF0aCAkZGVwbGlicyIgOzsKLQkgICAgICBlc2FjCi0JICAgIGRvbmUKLQkgIGZpICMgbGlua19hbGxfZGVwbGlicyAhPSBubwotCWZpICMgbGlua21vZGUgPSBsaWIKLSAgICAgIGRvbmUgIyBmb3IgZGVwbGliIGluICRsaWJzCi0gICAgICBpZiB0ZXN0ICIkcGFzcyIgPSBsaW5rOyB0aGVuCi0JaWYgdGVzdCAiJGxpbmttb2RlIiA9ICJwcm9nIjsgdGhlbgotCSAgY29tcGlsZV9kZXBsaWJzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGNvbXBpbGVfZGVwbGlicyIKLQkgIGZpbmFsaXplX2RlcGxpYnM9IiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAkZmluYWxpemVfZGVwbGlicyIKLQllbHNlCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICJgJEVDSE8gIiAkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKLQlmaQotICAgICAgZmkKLSAgICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKLSAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbjsgdGhlbgotCSMgTGluayB0aGUgZGxwcmVvcGVuZWQgbGlicmFyaWVzIGJlZm9yZSBvdGhlciBsaWJyYXJpZXMKLQlmb3IgZGVwbGliIGluICRzYXZlX2RlcGxpYnM7IGRvCi0JICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCWRvbmUKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gZGxvcGVuOyB0aGVuCi0JaWYgdGVzdCAiJHBhc3MiICE9IGNvbnY7IHRoZW4KLQkgICMgTWFrZSBzdXJlIGxpYl9zZWFyY2hfcGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KLQkgIGxpYl9zZWFyY2hfcGF0aD0KLQkgIGZvciBkaXIgaW4gJG5ld2xpYl9zZWFyY2hfcGF0aDsgZG8KLQkgICAgY2FzZSAiJGxpYl9zZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRkaXIgIiopIDs7Ci0JICAgICopIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JICBuZXdsaWJfc2VhcmNoX3BhdGg9Ci0JZmkKLQotCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgIT0gInByb2csbGluayI7IHRoZW4KLQkgIHZhcnM9ImRlcGxpYnMiCi0JZWxzZQotCSAgdmFycz0iY29tcGlsZV9kZXBsaWJzIGZpbmFsaXplX2RlcGxpYnMiCi0JZmkKLQlmb3IgdmFyIGluICR2YXJzIGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICMgQWRkIGxpYnJhcmllcyB0byAkdmFyIGluIHJldmVyc2Ugb3JkZXIKLQkgIGV2YWwgdG1wX2xpYnM9XCJcJCR2YXJcIgotCSAgbmV3X2xpYnM9Ci0JICBmb3IgZGVwbGliIGluICR0bXBfbGliczsgZG8KLQkgICAgIyBGSVhNRTogUGVkYW50aWNhbGx5LCB0aGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkbywgc28KLQkgICAgIyAgICAgICAgdGhhdCBzb21lIG5hc3R5IGRlcGVuZGVuY3kgbG9vcCBpc24ndCBhY2NpZGVudGFsbHkKLQkgICAgIyAgICAgICAgYnJva2VuOgotCSAgICAjbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIgotCSAgICAjIFByYWdtYXRpY2FsbHksIHRoaXMgc2VlbXMgdG8gY2F1c2UgdmVyeSBmZXcgcHJvYmxlbXMgaW4KLQkgICAgIyBwcmFjdGljZToKLQkgICAgY2FzZSAkZGVwbGliIGluCi0JICAgIC1MKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OwotCSAgICAtUiopIDs7Ci0JICAgICopCi0JICAgICAgIyBBbmQgaGVyZSBpcyB0aGUgcmVhc29uOiB3aGVuIGEgbGlicmFyeSBhcHBlYXJzIG1vcmUKLQkgICAgICAjIHRoYW4gb25jZSBhcyBhbiBleHBsaWNpdCBkZXBlbmRlbmNlIG9mIGEgbGlicmFyeSwgb3IKLQkgICAgICAjIGlzIGltcGxpY2l0bHkgbGlua2VkIGluIG1vcmUgdGhhbiBvbmNlIGJ5IHRoZQotCSAgICAgICMgY29tcGlsZXIsIGl0IGlzIGNvbnNpZGVyZWQgc3BlY2lhbCwgYW5kIG11bHRpcGxlCi0JICAgICAgIyBvY2N1cnJlbmNlcyB0aGVyZW9mIGFyZSBub3QgcmVtb3ZlZC4gIENvbXBhcmUgdGhpcwotCSAgICAgICMgd2l0aCBoYXZpbmcgdGhlIHNhbWUgbGlicmFyeSBiZWluZyBsaXN0ZWQgYXMgYQotCSAgICAgICMgZGVwZW5kZW5jeSBvZiBtdWx0aXBsZSBvdGhlciBsaWJyYXJpZXM6IGluIHRoaXMgY2FzZSwKLQkgICAgICAjIHdlIGtub3cgKHBlZGFudGljYWxseSwgd2UgYXNzdW1lKSB0aGUgbGlicmFyeSBkb2VzIG5vdAotCSAgICAgICMgbmVlZCB0byBiZSBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UsIHNvIHdlIGtlZXAgb25seSB0aGUKLQkgICAgICAjIGxhc3QgY29weS4gIFRoaXMgaXMgbm90IGFsd2F5cyByaWdodCwgYnV0IGl0IGlzIHJhcmUKLQkgICAgICAjIGVub3VnaCB0aGF0IHdlIHJlcXVpcmUgdXNlcnMgdGhhdCByZWFsbHkgbWVhbiB0byBwbGF5Ci0JICAgICAgIyBzdWNoIHVucG9ydGFibGUgbGlua2luZyB0cmlja3MgdG8gbGluayB0aGUgbGlicmFyeQotCSAgICAgICMgdXNpbmcgLVdsLC1sbmFtZSwgc28gdGhhdCBsaWJ0b29sIGRvZXMgbm90IGNvbnNpZGVyIGl0Ci0JICAgICAgIyBmb3IgZHVwbGljYXRlIHJlbW92YWwuCi0JICAgICAgY2FzZSAiICRzcGVjaWFsZGVwbGlicyAiIGluCi0JICAgICAgKiIgJGRlcGxpYiAiKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OwotCSAgICAgICopCi0JCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgotCQkqIiAkZGVwbGliICIqKSA7OwotCQkqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7Ci0JCWVzYWMKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCSAgdG1wX2xpYnM9Ci0JICBmb3IgZGVwbGliIGluICRuZXdfbGliczsgZG8KLQkgICAgY2FzZSAkZGVwbGliIGluCi0JICAgIC1MKikKLQkgICAgICBjYXNlICIgJHRtcF9saWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSA7OwotCSAgICAgICopIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgKikgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JICBldmFsICR2YXI9XCIkdG1wX2xpYnNcIgotCWRvbmUgIyBmb3IgdmFyCi0gICAgICBmaQotICAgICAgIyBMYXN0IHN0ZXA6IHJlbW92ZSBydW50aW1lIGxpYnMgZnJvbSBkZXBlbmRlbmN5X2xpYnMKLSAgICAgICMgKHRoZXkgc3RheSBpbiBkZXBsaWJzKQotICAgICAgdG1wX2xpYnM9Ci0gICAgICBmb3IgaSBpbiAkZGVwZW5kZW5jeV9saWJzIDsgZG8KLQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggIiBpbgotCSoiICRpICIqKQotCSAgaT0iIgotCSAgOzsKLQllc2FjCi0JaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgotCSAgdG1wX2xpYnM9IiR0bXBfbGlicyAkaSIKLQlmaQotICAgICAgZG9uZQotICAgICAgZGVwZW5kZW5jeV9saWJzPSR0bXBfbGlicwotICAgIGRvbmUgIyBmb3IgcGFzcwotICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0gICAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKLSAgICBmaQotICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KLSAgICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgotICAgIGZpCi0KLSAgICBjYXNlICRsaW5rbW9kZSBpbgotICAgIG9sZGxpYikKLSAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCi0JZnVuY193YXJuaW5nICJcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgotICAgICAgZmkKLQotICAgICAgY2FzZSAiICRkZXBsaWJzIiBpbgotICAgICAgKlwgLWwqIHwgKlwgLUwqKQotCWZ1bmNfd2FybmluZyAiXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBhcmNoaXZlcyIgOzsKLSAgICAgIGVzYWMKLQotICAgICAgdGVzdCAtbiAiJHJwYXRoIiAmJiBcCi0JZnVuY193YXJuaW5nICJcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCi0KLSAgICAgIHRlc3QgLW4gIiR4cnBhdGgiICYmIFwKLQlmdW5jX3dhcm5pbmcgIlxgLVInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgotCi0gICAgICB0ZXN0IC1uICIkdmluZm8iICYmIFwKLQlmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgotCi0gICAgICB0ZXN0IC1uICIkcmVsZWFzZSIgJiYgXAotCWZ1bmNfd2FybmluZyAiXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCi0KLSAgICAgIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyRleHBvcnRfc3ltYm9sc19yZWdleCIgJiYgXAotCWZ1bmNfd2FybmluZyAiXGAtZXhwb3J0LXN5bWJvbHMnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgotCi0gICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KLSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotICAgICAgb2xkbGlicz0iJG91dHB1dCIKLSAgICAgIG9ianM9IiRvYmpzJG9sZF9kZXBsaWJzIgotICAgICAgOzsKLQotICAgIGxpYikKLSAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KLSAgICAgIGNhc2UgJG91dHB1dG5hbWUgaW4KLSAgICAgIGxpYiopCi0JZnVuY19zdHJpcG5hbWUgJ2xpYicgJy5sYScgIiRvdXRwdXRuYW1lIgotCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCWV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCi0JZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCi0JOzsKLSAgICAgICopCi0JdGVzdCAiJG1vZHVsZSIgPSBubyAmJiBcCi0JICBmdW5jX2ZhdGFsX2hlbHAgImxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIG11c3QgYmVnaW4gd2l0aCBcYGxpYiciCi0KLQlpZiB0ZXN0ICIkbmVlZF9saWJfcHJlZml4IiAhPSBubzsgdGhlbgotCSAgIyBBZGQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcyBpZiByZXF1aXJlZAotCSAgZnVuY19zdHJpcG5hbWUgJycgJy5sYScgIiRvdXRwdXRuYW1lIgotCSAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JICBldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgotCSAgZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCi0JZWxzZQotCSAgZnVuY19zdHJpcG5hbWUgJycgJy5sYScgIiRvdXRwdXRuYW1lIgotCSAgbGlibmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JZmkKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KLQlpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCi0JICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIG9uIHRoaXMgaG9zdDokb2JqcyIKLQllbHNlCi0JICBlY2hvCi0JICAkRUNITyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUgbm9uLWxpYnRvb2wiCi0JICAkRUNITyAiKioqIG9iamVjdHMgJG9ianMgaXMgbm90IHBvcnRhYmxlISIKLQkgIGxpYm9ianM9IiRsaWJvYmpzICRvYmpzIgotCWZpCi0gICAgICBmaQotCi0gICAgICB0ZXN0ICIkZGxzZWxmIiAhPSBubyAmJiBcCi0JZnVuY193YXJuaW5nICJcYC1kbG9wZW4gc2VsZicgaXMgaWdub3JlZCBmb3IgbGlidG9vbCBsaWJyYXJpZXMiCi0KLSAgICAgIHNldCBkdW1teSAkcnBhdGgKLSAgICAgIHNoaWZ0Ci0gICAgICB0ZXN0ICIkIyIgLWd0IDEgJiYgXAotCWZ1bmNfd2FybmluZyAiaWdub3JpbmcgbXVsdGlwbGUgXGAtcnBhdGgncyBmb3IgYSBsaWJ0b29sIGxpYnJhcnkiCi0KLSAgICAgIGluc3RhbGxfbGliZGlyPSIkMSIKLQotICAgICAgb2xkbGlicz0KLSAgICAgIGlmIHRlc3QgLXogIiRycGF0aCI7IHRoZW4KLQlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCSAgIyBCdWlsZGluZyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeS4KLQkgICMgU29tZSBjb21waWxlcnMgaGF2ZSBwcm9ibGVtcyB3aXRoIGEgYC5hbCcgZXh0ZW5zaW9uIHNvCi0JICAjIGNvbnZlbmllbmNlIGxpYnJhcmllcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBleHRlbnNpb24gYW4KLQkgICMgYXJjaGl2ZSBub3JtYWxseSB3b3VsZC4KLQkgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQgJG9sZGxpYnMiCi0JICBidWlsZF9saWJ0b29sX2xpYnM9Y29udmVuaWVuY2UKLQkgIGJ1aWxkX29sZF9saWJzPXllcwotCWZpCi0KLQl0ZXN0IC1uICIkdmluZm8iICYmIFwKLQkgIGZ1bmNfd2FybmluZyAiXGAtdmVyc2lvbi1pbmZvLy12ZXJzaW9uLW51bWJlcicgaXMgaWdub3JlZCBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzIgotCi0JdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKLQkgIGZ1bmNfd2FybmluZyAiXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzIgotICAgICAgZWxzZQotCi0JIyBQYXJzZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcmd1bWVudC4KLQlzYXZlX2lmcz0iJElGUyI7IElGUz0nOicKLQlzZXQgZHVtbXkgJHZpbmZvIDAgMCAwCi0Jc2hpZnQKLQlJRlM9IiRzYXZlX2lmcyIKLQotCXRlc3QgLW4gIiQ3IiAmJiBcCi0JICBmdW5jX2ZhdGFsX2hlbHAgInRvbyBtYW55IHBhcmFtZXRlcnMgdG8gXGAtdmVyc2lvbi1pbmZvJyIKLQotCSMgY29udmVydCBhYnNvbHV0ZSB2ZXJzaW9uIG51bWJlcnMgdG8gbGlidG9vbCBhZ2VzCi0JIyB0aGlzIHJldGFpbnMgY29tcGF0aWJpbGl0eSB3aXRoIC5sYSBmaWxlcyBhbmQgYXR0ZW1wdHMKLQkjIHRvIG1ha2UgdGhlIGNvZGUgYmVsb3cgYSBiaXQgbW9yZSBjb21wcmVoZW5zaWJsZQotCi0JY2FzZSAkdmluZm9fbnVtYmVyIGluCi0JeWVzKQotCSAgbnVtYmVyX21ham9yPSIkMSIKLQkgIG51bWJlcl9taW5vcj0iJDIiCi0JICBudW1iZXJfcmV2aXNpb249IiQzIgotCSAgIwotCSAgIyBUaGVyZSBhcmUgcmVhbGx5IG9ubHkgdHdvIGtpbmRzIC0tIHRob3NlIHRoYXQKLQkgICMgdXNlIHRoZSBjdXJyZW50IHJldmlzaW9uIGFzIHRoZSBtYWpvciB2ZXJzaW9uCi0JICAjIGFuZCB0aG9zZSB0aGF0IHN1YnRyYWN0IGFnZSBhbmQgdXNlIGFnZSBhcwotCSAgIyBhIG1pbm9yIHZlcnNpb24uICBCdXQsIHRoZW4gdGhlcmUgaXMgaXJpeAotCSAgIyB3aGljaCBoYXMgYW4gZXh0cmEgMSBhZGRlZCBqdXN0IGZvciBmdW4KLQkgICMKLQkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgotCSAgZGFyd2lufGxpbnV4fG9zZnx3aW5kb3dzfG5vbmUpCi0JICAgIGZ1bmNfYXJpdGggJG51bWJlcl9tYWpvciArICRudW1iZXJfbWlub3IKLQkgICAgY3VycmVudD0kZnVuY19hcml0aF9yZXN1bHQKLQkgICAgYWdlPSIkbnVtYmVyX21pbm9yIgotCSAgICByZXZpc2lvbj0iJG51bWJlcl9yZXZpc2lvbiIKLQkgICAgOzsKLQkgIGZyZWVic2QtYW91dHxmcmVlYnNkLWVsZnxxbnh8c3Vub3MpCi0JICAgIGN1cnJlbnQ9IiRudW1iZXJfbWFqb3IiCi0JICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgotCSAgICBhZ2U9IjAiCi0JICAgIDs7Ci0JICBpcml4fG5vbnN0b3B1eCkKLQkgICAgZnVuY19hcml0aCAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vcgotCSAgICBjdXJyZW50PSRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgICBhZ2U9IiRudW1iZXJfbWlub3IiCi0JICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgotCSAgICBsdF9pcml4X2luY3JlbWVudD1ubwotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQlubykKLQkgIGN1cnJlbnQ9IiQxIgotCSAgcmV2aXNpb249IiQyIgotCSAgYWdlPSIkMyIKLQkgIDs7Ci0JZXNhYwotCi0JIyBDaGVjayB0aGF0IGVhY2ggb2YgdGhlIHRoaW5ncyBhcmUgdmFsaWQgbnVtYmVycy4KLQljYXNlICRjdXJyZW50IGluCi0JMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OwotCSopCi0JICBmdW5jX2Vycm9yICJDVVJSRU5UIFxgJGN1cnJlbnQnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgotCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgotCSAgOzsKLQllc2FjCi0KLQljYXNlICRyZXZpc2lvbiBpbgotCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKLQkqKQotCSAgZnVuY19lcnJvciAiUkVWSVNJT04gXGAkcmV2aXNpb24nIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgotCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgotCSAgOzsKLQllc2FjCi0KLQljYXNlICRhZ2UgaW4KLQkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7Ci0JKikKLQkgIGZ1bmNfZXJyb3IgIkFHRSBcYCRhZ2UnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgotCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgotCSAgOzsKLQllc2FjCi0KLQlpZiB0ZXN0ICIkYWdlIiAtZ3QgIiRjdXJyZW50IjsgdGhlbgotCSAgZnVuY19lcnJvciAiQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciCi0JICBmdW5jX2ZhdGFsX2Vycm9yICJcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iCi0JZmkKLQotCSMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KLQltYWpvcj0KLQl2ZXJzdWZmaXg9Ci0JdmVyc3RyaW5nPQotCWNhc2UgJHZlcnNpb25fdHlwZSBpbgotCW5vbmUpIDs7Ci0KLQlkYXJ3aW4pCi0JICAjIExpa2UgTGludXgsIGJ1dCB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gYXZhaWxhYmxlIGluCi0JICAjIHZlcnN0cmluZyBmb3IgY29kaW5nIGl0IGludG8gdGhlIGxpYnJhcnkgaGVhZGVyCi0JICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQotCSAgbWFqb3I9LiRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCi0JICAjIERhcndpbiBsZCBkb2Vzbid0IGxpa2UgMCBmb3IgdGhlc2Ugb3B0aW9ucy4uLgotCSAgZnVuY19hcml0aCAkY3VycmVudCArIDEKLQkgIG1pbm9yX2N1cnJlbnQ9JGZ1bmNfYXJpdGhfcmVzdWx0Ci0JICB4bGN2ZXJzdHJpbmc9IiR7d2x9LWNvbXBhdGliaWxpdHlfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50ICR7d2x9LWN1cnJlbnRfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKLQkgIHZlcnN0cmluZz0iLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAkbWlub3JfY3VycmVudCAtY3VycmVudF92ZXJzaW9uICRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQlmcmVlYnNkLWFvdXQpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIjsKLQkgIDs7Ci0KLQlmcmVlYnNkLWVsZikKLQkgIG1ham9yPSIuJGN1cnJlbnQiCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudCIKLQkgIDs7Ci0KLQlpcml4IHwgbm9uc3RvcHV4KQotCSAgaWYgdGVzdCAiWCRsdF9pcml4X2luY3JlbWVudCIgPSAiWG5vIjsgdGhlbgotCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQotCSAgZWxzZQotCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZSArIDEKLQkgIGZpCi0JICBtYWpvcj0kZnVuY19hcml0aF9yZXN1bHQKLQotCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0JICAgIG5vbnN0b3B1eCkgdmVyc3RyaW5nX3ByZWZpeD1ub25zdG9wdXggOzsKLQkgICAgKikgICAgICAgICB2ZXJzdHJpbmdfcHJlZml4PXNnaSA7OwotCSAgZXNhYwotCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kcmV2aXNpb24iCi0KLQkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCi0JICBsb29wPSRyZXZpc2lvbgotCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbwotCSAgICBmdW5jX2FyaXRoICRyZXZpc2lvbiAtICRsb29wCi0JICAgIGlmYWNlPSRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgICBmdW5jX2FyaXRoICRsb29wIC0gMQotCSAgICBsb29wPSRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmdfcHJlZml4JG1ham9yLiRpZmFjZTokdmVyc3RyaW5nIgotCSAgZG9uZQotCi0JICAjIEJlZm9yZSB0aGlzIHBvaW50LCAkbWFqb3IgbXVzdCBub3QgY29udGFpbiBgLicuCi0JICBtYWpvcj0uJG1ham9yCi0JICB2ZXJzdWZmaXg9IiRtYWpvci4kcmV2aXNpb24iCi0JICA7OwotCi0JbGludXgpCi0JICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQotCSAgbWFqb3I9LiRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCi0JICA7OwotCi0Jb3NmKQotCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKLQkgIG1ham9yPS4kZnVuY19hcml0aF9yZXN1bHQKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgotCSAgdmVyc3RyaW5nPSIkY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKLQotCSAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KLQkgIGxvb3A9JGFnZQotCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbwotCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGxvb3AKLQkgICAgaWZhY2U9JGZ1bmNfYXJpdGhfcmVzdWx0Ci0JICAgIGZ1bmNfYXJpdGggJGxvb3AgLSAxCi0JICAgIGxvb3A9JGZ1bmNfYXJpdGhfcmVzdWx0Ci0JICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2lmYWNlfS4wIgotCSAgZG9uZQotCi0JICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCi0JICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtjdXJyZW50fS4wIgotCSAgOzsKLQotCXFueCkKLQkgIG1ham9yPSIuJGN1cnJlbnQiCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudCIKLQkgIDs7Ci0KLQlzdW5vcykKLQkgIG1ham9yPSIuJGN1cnJlbnQiCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iCi0JICA7OwotCi0Jd2luZG93cykKLQkgICMgVXNlICctJyByYXRoZXIgdGhhbiAnLicsIHNpbmNlIHdlIG9ubHkgd2FudCBvbmUKLQkgICMgZXh0ZW5zaW9uIG9uIERPUyA4LjMgZmlsZXN5c3RlbXMuCi0JICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQotCSAgbWFqb3I9JGZ1bmNfYXJpdGhfcmVzdWx0Ci0JICB2ZXJzdWZmaXg9Ii0kbWFqb3IiCi0JICA7OwotCi0JKikKLQkgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAidW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIgotCSAgOzsKLQllc2FjCi0KLQkjIENsZWFyIHRoZSB2ZXJzaW9uIGluZm8gaWYgd2UgZGVmYXVsdGVkLCBhbmQgdGhleSBzcGVjaWZpZWQgYSByZWxlYXNlLgotCWlmIHRlc3QgLXogIiR2aW5mbyIgJiYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JICBtYWpvcj0KLQkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgotCSAgZGFyd2luKQotCSAgICAjIHdlIGNhbid0IGNoZWNrIGZvciAiMC4wIiBpbiBhcmNoaXZlX2NtZHMgZHVlIHRvIHF1b3RpbmcKLQkgICAgIyBwcm9ibGVtcywgc28gd2UgcmVzZXQgaXQgY29tcGxldGVseQotCSAgICB2ZXJzdHJpbmc9Ci0JICAgIDs7Ci0JICAqKQotCSAgICB2ZXJzdHJpbmc9IjAuMCIKLQkgICAgOzsKLQkgIGVzYWMKLQkgIGlmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KLQkgICAgdmVyc3VmZml4PQotCSAgZWxzZQotCSAgICB2ZXJzdWZmaXg9Ii4wLjAiCi0JICBmaQotCWZpCi0KLQkjIFJlbW92ZSB2ZXJzaW9uIGluZm8gZnJvbSBuYW1lIGlmIHZlcnNpb25pbmcgc2hvdWxkIGJlIGF2b2lkZWQKLQlpZiB0ZXN0ICIkYXZvaWRfdmVyc2lvbiIgPSB5ZXMgJiYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgotCSAgbWFqb3I9Ci0JICB2ZXJzdWZmaXg9Ci0JICB2ZXJzdHJpbmc9IiIKLQlmaQotCi0JIyBDaGVjayB0byBzZWUgaWYgdGhlIGFyY2hpdmUgd2lsbCBoYXZlIHVuZGVmaW5lZCBzeW1ib2xzLgotCWlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0geWVzOyB0aGVuCi0JICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciID0gdW5zdXBwb3J0ZWQ7IHRoZW4KLQkgICAgZnVuY193YXJuaW5nICJ1bmRlZmluZWQgc3ltYm9scyBub3QgYWxsb3dlZCBpbiAkaG9zdCBzaGFyZWQgbGlicmFyaWVzIgotCSAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLQkgICAgYnVpbGRfb2xkX2xpYnM9eWVzCi0JICBmaQotCWVsc2UKLQkgICMgRG9uJ3QgYWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMuCi0JICBhbGxvd191bmRlZmluZWRfZmxhZz0iJG5vX3VuZGVmaW5lZF9mbGFnIgotCWZpCi0KLSAgICAgIGZpCi0KLSAgICAgIGZ1bmNfZ2VuZXJhdGVfZGxzeW1zICIkbGlibmFtZSIgIiRsaWJuYW1lIiAieWVzIgotICAgICAgbGlib2Jqcz0iJGxpYm9ianMgJHN5bWZpbGVvYmoiCi0gICAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQotCi0gICAgICBpZiB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rOyB0aGVuCi0JIyBSZW1vdmUgb3VyIG91dHB1dHMsIGJ1dCBkb24ndCByZW1vdmUgb2JqZWN0IGZpbGVzIHNpbmNlIHRoZXkKLQkjIG1heSBoYXZlIGJlZW4gY3JlYXRlZCB3aGVuIGNvbXBpbGluZyBQSUMgb2JqZWN0cy4KLQlyZW1vdmVsaXN0PQotCXRlbXByZW1vdmVsaXN0PWAkRUNITyAiJG91dHB1dF9vYmpkaXIvKiJgCi0JZm9yIHAgaW4gJHRlbXByZW1vdmVsaXN0OyBkbwotCSAgY2FzZSAkcCBpbgotCSAgICAqLiRvYmpleHQgfCAqLmdjbm8pCi0JICAgICAgIDs7Ci0JICAgICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIHwgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuKiB8ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LiopCi0JICAgICAgIGlmIHRlc3QgIlgkcHJlY2lvdXNfZmlsZXNfcmVnZXgiICE9ICJYIjsgdGhlbgotCQkgaWYgJEVDSE8gIiRwIiB8ICRFR1JFUCAtZSAiJHByZWNpb3VzX2ZpbGVzX3JlZ2V4IiA+L2Rldi9udWxsIDI+JjEKLQkJIHRoZW4KLQkJICAgY29udGludWUKLQkJIGZpCi0JICAgICAgIGZpCi0JICAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRwIgotCSAgICAgICA7OwotCSAgICAqKSA7OwotCSAgZXNhYwotCWRvbmUKLQl0ZXN0IC1uICIkcmVtb3ZlbGlzdCIgJiYgXAotCSAgZnVuY19zaG93X2V2YWwgIiR7Uk19ciBcJHJlbW92ZWxpc3QiCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0gY29udmVuaWVuY2UgOyB0aGVuCi0Jb2xkbGlicz0iJG9sZGxpYnMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKLQotCSMgVHJhbnNmb3JtIC5sbyBmaWxlcyB0byAubyBmaWxlcy4KLQlvbGRvYmpzPSIkb2JqcyAiYCRFQ0hPICIkbGlib2JqcyIgfCAkU1AyTkwgfCAkU0VEICIvXC4ke2xpYmV4dH0kL2Q7ICRsbzJvIiB8ICROTDJTUGAKLSAgICAgIGZpCi0KLSAgICAgICMgRWxpbWluYXRlIGFsbCB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMuCi0gICAgICAjZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KLSAgICAgICMJbGliX3NlYXJjaF9wYXRoPWAkRUNITyAiJGxpYl9zZWFyY2hfcGF0aCAiIHwgJFNFRCAicyUgJHBhdGggJSAlZyJgCi0gICAgICAjCWRlcGxpYnM9YCRFQ0hPICIkZGVwbGlicyAiIHwgJFNFRCAicyUgLUwkcGF0aCAlICVnImAKLSAgICAgICMJZGVwZW5kZW5jeV9saWJzPWAkRUNITyAiJGRlcGVuZGVuY3lfbGlicyAiIHwgJFNFRCAicyUgLUwkcGF0aCAlICVnImAKLSAgICAgICNkb25lCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCi0JIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgotCXRlbXBfeHJwYXRoPQotCWZvciBsaWJkaXIgaW4gJHhycGF0aDsgZG8KLQkgIHRlbXBfeHJwYXRoPSIkdGVtcF94cnBhdGggLVIkbGliZGlyIgotCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZG9uZQotCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX3hycGF0aCAkZGVwZW5kZW5jeV9saWJzIgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSBkbGZpbGVzIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGZpbGVzIHRoYXQgd29uJ3QgYmUgZGxwcmVvcGVuZWQKLSAgICAgIG9sZF9kbGZpbGVzPSIkZGxmaWxlcyIKLSAgICAgIGRsZmlsZXM9Ci0gICAgICBmb3IgbGliIGluICRvbGRfZGxmaWxlczsgZG8KLQljYXNlICIgJGRscHJlZmlsZXMgJGRsZmlsZXMgIiBpbgotCSoiICRsaWIgIiopIDs7Ci0JKikgZGxmaWxlcz0iJGRsZmlsZXMgJGxpYiIgOzsKLQllc2FjCi0gICAgICBkb25lCi0KLSAgICAgICMgTWFrZSBzdXJlIGRscHJlZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMKLSAgICAgIG9sZF9kbHByZWZpbGVzPSIkZGxwcmVmaWxlcyIKLSAgICAgIGRscHJlZmlsZXM9Ci0gICAgICBmb3IgbGliIGluICRvbGRfZGxwcmVmaWxlczsgZG8KLQljYXNlICIkZGxwcmVmaWxlcyAiIGluCi0JKiIgJGxpYiAiKikgOzsKLQkqKSBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliIiA7OwotCWVzYWMKLSAgICAgIGRvbmUKLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCi0JICBjYXNlICRob3N0IGluCi0JICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotKi1iZW9zKiB8ICotY2VnY2MqIHwgKi0qLWhhaWt1KikKLQkgICAgIyB0aGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBjIGxpYnJhcnkgKGFzIHN1Y2gpIQotCSAgICA7OwotCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQotCSAgICAjIFJoYXBzb2R5IEMgbGlicmFyeSBpcyBpbiB0aGUgU3lzdGVtIGZyYW1ld29yawotCSAgICBkZXBsaWJzPSIkZGVwbGlicyBTeXN0ZW0ubHRmcmFtZXdvcmsiCi0JICAgIDs7Ci0JICAqLSotbmV0YnNkKikKLQkgICAgIyBEb24ndCBsaW5rIHdpdGggbGliYyB1bnRpbCB0aGUgYS5vdXQgbGQuc28gaXMgZml4ZWQuCi0JICAgIDs7Ci0JICAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKLQkgICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjIGR1ZSB0byB1cyBoYXZpbmcgbGliYy9saWJjX3IuCi0JICAgIDs7Ci0JICAqLSotc2NvMy4ydjUqIHwgKi0qLXNjbzV2NiopCi0JICAgICMgQ2F1c2VzIHByb2JsZW1zIHdpdGggX19jdHlwZQotCSAgICA7OwotCSAgKi0qLXN5c3Y0LjJ1dzIqIHwgKi0qLXN5c3Y1KiB8ICotKi11bml4d2FyZSogfCAqLSotT3BlblVOSVgqKQotCSAgICAjIENvbXBpbGVyIGluc2VydHMgbGliYyBpbiB0aGUgY29ycmVjdCBwbGFjZSBmb3IgdGhyZWFkcyB0byB3b3JrCi0JICAgIDs7Ci0JICAqKQotCSAgICAjIEFkZCBsaWJjIHRvIGRlcGxpYnMgb24gYWxsIG90aGVyIHN5c3RlbXMgaWYgbmVjZXNzYXJ5LgotCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9uZWVkX2xjIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLWxjIgotCSAgICBmaQotCSAgICA7OwotCSAgZXNhYwotCWZpCi0KLQkjIFRyYW5zZm9ybSBkZXBsaWJzIGludG8gb25seSBkZXBsaWJzIHRoYXQgY2FuIGJlIGxpbmtlZCBpbiBzaGFyZWQuCi0JbmFtZV9zYXZlPSRuYW1lCi0JbGlibmFtZV9zYXZlPSRsaWJuYW1lCi0JcmVsZWFzZV9zYXZlPSRyZWxlYXNlCi0JdmVyc3VmZml4X3NhdmU9JHZlcnN1ZmZpeAotCW1ham9yX3NhdmU9JG1ham9yCi0JIyBJJ20gbm90IHN1cmUgaWYgSSdtIHRyZWF0aW5nIHRoZSByZWxlYXNlIGNvcnJlY3RseS4gIEkgdGhpbmsKLQkjIHJlbGVhc2Ugc2hvdWxkIHNob3cgdXAgaW4gdGhlIC1sIChpZSAtbGdtcDUpIHNvIHdlIGRvbid0IHdhbnQgdG8KLQkjIGFkZCBpdCBpbiB0d2ljZS4gIElzIHRoYXQgY29ycmVjdD8KLQlyZWxlYXNlPSIiCi0JdmVyc3VmZml4PSIiCi0JbWFqb3I9IiIKLQluZXdkZXBsaWJzPQotCWRyb3BwZWRkZXBzPW5vCi0JY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLQlwYXNzX2FsbCkKLQkgICMgRG9uJ3QgY2hlY2sgZm9yIHNoYXJlZC9zdGF0aWMuICBFdmVyeXRoaW5nIHdvcmtzLgotCSAgIyBUaGlzIG1pZ2h0IGJlIGEgbGl0dGxlIG5haXZlLiAgV2UgbWlnaHQgd2FudCB0byBjaGVjawotCSAgIyB3aGV0aGVyIHRoZSBsaWJyYXJ5IGV4aXN0cyBvciBub3QuICBCdXQgdGhpcyBpcyBvbgotCSAgIyBvc2YzICYgb3NmNCBhbmQgSSdtIG5vdCByZWFsbHkgc3VyZS4uLiBKdXN0Ci0JICAjIGltcGxlbWVudGluZyB3aGF0IHdhcyBhbHJlYWR5IHRoZSBiZWhhdmlvci4KLQkgIG5ld2RlcGxpYnM9JGRlcGxpYnMKLQkgIDs7Ci0JdGVzdF9jb21waWxlKQotCSAgIyBUaGlzIGNvZGUgc3RyZXNzZXMgdGhlICJsaWJyYXJpZXMgYXJlIHByb2dyYW1zIiBwYXJhZGlnbSB0byBpdHMKLQkgICMgbGltaXRzLiBNYXliZSBldmVuIGJyZWFrcyBpdC4gIFdlIGNvbXBpbGUgYSBwcm9ncmFtLCBsaW5raW5nIGl0Ci0JICAjIGFnYWluc3QgdGhlIGRlcGxpYnMgYXMgYSBwcm94eSBmb3IgdGhlIGxpYnJhcnkuICBUaGVuIHdlIGNhbiBjaGVjawotCSAgIyB3aGV0aGVyIHRoZXkgbGlua2VkIGluIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBsZGQuCi0JICAkb3B0X2RyeV9ydW4gfHwgJFJNIGNvbmZ0ZXN0LmMKLQkgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLQkgIGludCBtYWluKCkgeyByZXR1cm4gMDsgfQotRU9GCi0JICAkb3B0X2RyeV9ydW4gfHwgJFJNIGNvbmZ0ZXN0Ci0JICBpZiAkTFRDQyAkTFRDRkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkZGVwbGliczsgdGhlbgotCSAgICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCi0JICAgIGZvciBpIGluICRkZXBsaWJzOyBkbwotCSAgICAgIGNhc2UgJGkgaW4KLQkgICAgICAtbCopCi0JCWZ1bmNfc3RyaXBuYW1lIC1sICcnICIkaSIKLQkJbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JCWlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KLQkJICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KLQkJICAqIiAkaSAiKikKLQkJICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQkgICAgaT0iIgotCQkgICAgOzsKLQkJICBlc2FjCi0JCWZpCi0JCWlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KLQkJICBsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKLQkJICBkZXBsaWJfbWF0Y2hlcz1gZXZhbCAiXFwkRUNITyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcIiJgCi0JCSAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlczsgc2hpZnQKLQkJICBkZXBsaWJfbWF0Y2g9JDEKLQkJICBpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCi0JCSAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkJICBlbHNlCi0JCSAgICBkcm9wcGVkZGVwcz15ZXMKLQkJICAgIGVjaG8KLQkJICAgICRFQ0hPICIqKiogV2FybmluZzogZHluYW1pYyBsaW5rZXIgZG9lcyBub3QgYWNjZXB0IG5lZWRlZCBsaWJyYXJ5ICRpLiIKLQkJICAgIGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCSAgICBlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQkgICAgZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCBJIGJlbGlldmUgeW91IGRvIG5vdCBoYXZlIgotCQkgICAgZWNobyAiKioqIGJlY2F1c2UgYSB0ZXN0X2NvbXBpbGUgZGlkIHJldmVhbCB0aGF0IHRoZSBsaW5rZXIgZGlkIG5vdCB1c2UgaXQgZm9yIgotCQkgICAgZWNobyAiKioqIGl0cyBkeW5hbWljIGRlcGVuZGVuY3kgbGlzdCB0aGF0IHByb2dyYW1zIGdldCByZXNvbHZlZCB3aXRoIGF0IHJ1bnRpbWUuIgotCQkgIGZpCi0JCWZpCi0JCTs7Ci0JICAgICAgKikKLQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICBkb25lCi0JICBlbHNlCi0JICAgICMgRXJyb3Igb2NjdXJyZWQgaW4gdGhlIGZpcnN0IGNvbXBpbGUuICBMZXQncyB0cnkgdG8gc2FsdmFnZQotCSAgICAjIHRoZSBzaXR1YXRpb246IENvbXBpbGUgYSBzZXBhcmF0ZSBwcm9ncmFtIGZvciBlYWNoIGxpYnJhcnkuCi0JICAgIGZvciBpIGluICRkZXBsaWJzOyBkbwotCSAgICAgIGNhc2UgJGkgaW4KLQkgICAgICAtbCopCi0JCWZ1bmNfc3RyaXBuYW1lIC1sICcnICIkaSIKLQkJbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JCSRvcHRfZHJ5X3J1biB8fCAkUk0gY29uZnRlc3QKLQkJaWYgJExUQ0MgJExUQ0ZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGk7IHRoZW4KLQkJICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCi0JCSAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCQkgICAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCi0JCSAgICAqIiAkaSAiKikKLQkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCSAgICAgIGk9IiIKLQkJICAgICAgOzsKLQkJICAgIGVzYWMKLQkJICBmaQotCQkgIGlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KLQkJICAgIGxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAotCQkgICAgZGVwbGliX21hdGNoZXM9YGV2YWwgIlxcJEVDSE8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCIiYAotCQkgICAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlczsgc2hpZnQKLQkJICAgIGRlcGxpYl9tYXRjaD0kMQotCQkgICAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgotCQkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkJICAgIGVsc2UKLQkJICAgICAgZHJvcHBlZGRlcHM9eWVzCi0JCSAgICAgIGVjaG8KLQkJICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgotCQkgICAgICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkgICAgICBlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQkgICAgICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCi0JCSAgICAgIGVjaG8gIioqKiBiZWNhdXNlIGEgdGVzdF9jb21waWxlIGRpZCByZXZlYWwgdGhhdCB0aGUgbGlua2VyIGRpZCBub3QgdXNlIHRoaXMgb25lIgotCQkgICAgICBlY2hvICIqKiogYXMgYSBkeW5hbWljIGRlcGVuZGVuY3kgdGhhdCBwcm9ncmFtcyBjYW4gZ2V0IHJlc29sdmVkIHdpdGggYXQgcnVudGltZS4iCi0JCSAgICBmaQotCQkgIGZpCi0JCWVsc2UKLQkJICBkcm9wcGVkZGVwcz15ZXMKLQkJICBlY2hvCi0JCSAgJEVDSE8gIioqKiBXYXJuaW5nISAgTGlicmFyeSAkaSBpcyBuZWVkZWQgYnkgdGhpcyBsaWJyYXJ5IGJ1dCBJIHdhcyBub3QgYWJsZSB0byIKLQkJICBlY2hvICIqKiogbWFrZSBpdCBsaW5rIGluISAgWW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBpbnN0YWxsIGl0IG9yIHNvbWUiCi0JCSAgZWNobyAiKioqIGxpYnJhcnkgdGhhdCBpdCBkZXBlbmRzIG9uIGJlZm9yZSB0aGlzIGxpYnJhcnkgd2lsbCBiZSBmdWxseSIKLQkJICBlY2hvICIqKiogZnVuY3Rpb25hbC4gIEluc3RhbGxpbmcgaXQgYmVmb3JlIGNvbnRpbnVpbmcgd291bGQgYmUgZXZlbiBiZXR0ZXIuIgotCQlmaQotCQk7OwotCSAgICAgICopCi0JCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZG9uZQotCSAgZmkKLQkgIDs7Ci0JZmlsZV9tYWdpYyopCi0JICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kOyBzaGlmdAotCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMSBcKC4qXCkiYAotCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbwotCSAgICBjYXNlICRhX2RlcGxpYiBpbgotCSAgICAtbCopCi0JICAgICAgZnVuY19zdHJpcG5hbWUgLWwgJycgIiRhX2RlcGxpYiIKLQkgICAgICBuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQkgICAgICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCi0JCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgotCQkqIiAkYV9kZXBsaWIgIiopCi0JCSAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCQkgIGFfZGVwbGliPSIiCi0JCSAgOzsKLQkJZXNhYwotCSAgICAgIGZpCi0JICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KLQkJbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCi0JCWZvciBpIGluICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbwotCQkgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZVsuLV0qIDI+L2Rldi9udWxsYAotCQkgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KLQkJICAgICAgIyBGb2xsb3cgc29mdCBsaW5rcy4KLQkJICAgICAgaWYgbHMgLWxMZCAiJHBvdGVudF9saWIiIDI+L2Rldi9udWxsIHwKLQkJCSAkR1JFUCAiIC0+ICIgPi9kZXYvbnVsbDsgdGhlbgotCQkJY29udGludWUKLQkJICAgICAgZmkKLQkJICAgICAgIyBUaGUgc3RhdGVtZW50IGFib3ZlIHRyaWVzIHRvIGF2b2lkIGVudGVyaW5nIGFuCi0JCSAgICAgICMgZW5kbGVzcyBsb29wIGJlbG93LCBpbiBjYXNlIG9mIGN5Y2xpYyBsaW5rcy4KLQkJICAgICAgIyBXZSBtaWdodCBzdGlsbCBlbnRlciBhbiBlbmRsZXNzIGxvb3AsIHNpbmNlIGEgbGluawotCQkgICAgICAjIGxvb3AgY2FuIGJlIGNsb3NlZCB3aGlsZSB3ZSBmb2xsb3cgbGlua3MsCi0JCSAgICAgICMgYnV0IHNvIHdoYXQ/Ci0JCSAgICAgIHBvdGxpYj0iJHBvdGVudF9saWIiCi0JCSAgICAgIHdoaWxlIHRlc3QgLWggIiRwb3RsaWIiIDI+L2Rldi9udWxsOyBkbwotCQkJcG90bGlibGluaz1gbHMgLWxkICRwb3RsaWIgfCAke1NFRH0gJ3MvLiogLT4gLy8nYAotCQkJY2FzZSAkcG90bGlibGluayBpbgotCQkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBwb3RsaWI9IiRwb3RsaWJsaW5rIjs7Ci0JCQkqKSBwb3RsaWI9YCRFQ0hPICIkcG90bGliIiB8ICRTRUQgJ3MsW14vXSokLCwnYCIkcG90bGlibGluayI7OwotCQkJZXNhYwotCQkgICAgICBkb25lCi0JCSAgICAgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwiXCRwb3RsaWJcIiAyPi9kZXYvbnVsbCB8Ci0JCQkgJFNFRCAtZSAxMHEgfAotCQkJICRFR1JFUCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JCQlhX2RlcGxpYj0iIgotCQkJYnJlYWsgMgotCQkgICAgICBmaQotCQkgIGRvbmUKLQkJZG9uZQotCSAgICAgIGZpCi0JICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KLQkJZHJvcHBlZGRlcHM9eWVzCi0JCWVjaG8KLQkJJEVDSE8gIioqKiBXYXJuaW5nOiBsaW5rZXIgcGF0aCBkb2VzIG5vdCBoYXZlIHJlYWwgZmlsZSBmb3IgbGlicmFyeSAkYV9kZXBsaWIuIgotCQllY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQllY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQllY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCi0JCWVjaG8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCi0JCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgotCQkgICRFQ0hPICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIGZpbGUgbWFnaWMgdGVzdCkiCi0JCWVsc2UKLQkJICAkRUNITyAiKioqIHdpdGggJGxpYm5hbWUgYW5kIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgcGFzc2VkIGEgZmlsZSBmb3JtYXQgdGVzdCIKLQkJICAkRUNITyAiKioqIHVzaW5nIGEgZmlsZSBtYWdpYy4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCi0JCWZpCi0JICAgICAgZmkKLQkgICAgICA7OwotCSAgICAqKQotCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCi0JICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCi0JICA7OwotCW1hdGNoX3BhdHRlcm4qKQotCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZDsgc2hpZnQKLQkgIG1hdGNoX3BhdHRlcm5fcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDEgXCguKlwpImAKLQkgIGZvciBhX2RlcGxpYiBpbiAkZGVwbGliczsgZG8KLQkgICAgY2FzZSAkYV9kZXBsaWIgaW4KLQkgICAgLWwqKQotCSAgICAgIGZ1bmNfc3RyaXBuYW1lIC1sICcnICIkYV9kZXBsaWIiCi0JICAgICAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KLQkJKiIgJGFfZGVwbGliICIqKQotCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkJICBhX2RlcGxpYj0iIgotCQkgIDs7Ci0JCWVzYWMKLQkgICAgICBmaQotCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCi0JCWxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAotCQlmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aDsgZG8KLQkJICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKLQkJICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCi0JCSAgICBwb3RsaWI9IiRwb3RlbnRfbGliIiAjIHNlZSBzeW1saW5rLWNoZWNrIGFib3ZlIGluIGZpbGVfbWFnaWMgdGVzdAotCQkgICAgaWYgZXZhbCAiXCRFQ0hPIFwiJHBvdGVudF9saWJcIiIgMj4vZGV2L251bGwgfCAkU0VEIDEwcSB8IFwKLQkJICAgICAgICRFR1JFUCAiJG1hdGNoX3BhdHRlcm5fcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkJICAgICAgYV9kZXBsaWI9IiIKLQkJICAgICAgYnJlYWsgMgotCQkgICAgZmkKLQkJICBkb25lCi0JCWRvbmUKLQkgICAgICBmaQotCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCi0JCWRyb3BwZWRkZXBzPXllcwotCQllY2hvCi0JCSRFQ0hPICIqKiogV2FybmluZzogbGlua2VyIHBhdGggZG9lcyBub3QgaGF2ZSByZWFsIGZpbGUgZm9yIGxpYnJhcnkgJGFfZGVwbGliLiIKLQkJZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgotCQllY2hvICIqKiogYmVjYXVzZSBJIGRpZCBjaGVjayB0aGUgbGlua2VyIHBhdGggbG9va2luZyBmb3IgYSBmaWxlIHN0YXJ0aW5nIgotCQlpZiB0ZXN0IC16ICIkcG90bGliIiA7IHRoZW4KLQkJICAkRUNITyAiKioqIHdpdGggJGxpYm5hbWUgYnV0IG5vIGNhbmRpZGF0ZXMgd2VyZSBmb3VuZC4gKC4uLmZvciByZWdleCBwYXR0ZXJuIHRlc3QpIgotCQllbHNlCi0JCSAgJEVDSE8gIioqKiB3aXRoICRsaWJuYW1lIGFuZCBub25lIG9mIHRoZSBjYW5kaWRhdGVzIHBhc3NlZCBhIGZpbGUgZm9ybWF0IHRlc3QiCi0JCSAgJEVDSE8gIioqKiB1c2luZyBhIHJlZ2V4IHBhdHRlcm4uIExhc3QgZmlsZSBjaGVja2VkOiAkcG90bGliIgotCQlmaQotCSAgICAgIGZpCi0JICAgICAgOzsKLQkgICAgKikKLQkgICAgICAjIEFkZCBhIC1MIGFyZ3VtZW50LgotCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICBkb25lICMgR29uZSB0aHJvdWdoIGFsbCBkZXBsaWJzLgotCSAgOzsKLQlub25lIHwgdW5rbm93biB8ICopCi0JICBuZXdkZXBsaWJzPSIiCi0JICB0bXBfZGVwbGlicz1gJEVDSE8gIiAkZGVwbGlicyIgfCAkU0VEICdzLyAtbGMkLy87IHMvIC1bTFJdW14gXSovL2cnYAotCSAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCSAgICBmb3IgaSBpbiAkcHJlZGVwcyAkcG9zdGRlcHMgOyBkbwotCSAgICAgICMgY2FuJ3QgdXNlIFhzZWQgYmVsb3csIGJlY2F1c2UgJGkgbWlnaHQgY29udGFpbiAnLycKLQkgICAgICB0bXBfZGVwbGlicz1gJEVDSE8gIiAkdG1wX2RlcGxpYnMiIHwgJFNFRCAicywkaSwsImAKLQkgICAgZG9uZQotCSAgZmkKLQkgIGNhc2UgJHRtcF9kZXBsaWJzIGluCi0JICAqWyFcCVwgXSopCi0JICAgIGVjaG8KLQkgICAgaWYgdGVzdCAiWCRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSAiWG5vbmUiOyB0aGVuCi0JICAgICAgZWNobyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgcGxhdGZvcm0uIgotCSAgICBlbHNlCi0JICAgICAgZWNobyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qga25vd24gdG8gYmUgc3VwcG9ydGVkLiIKLQkgICAgZmkKLQkgICAgZWNobyAiKioqIEFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZHJvcHBlZC4iCi0JICAgIGRyb3BwZWRkZXBzPXllcwotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0JdmVyc3VmZml4PSR2ZXJzdWZmaXhfc2F2ZQotCW1ham9yPSRtYWpvcl9zYXZlCi0JcmVsZWFzZT0kcmVsZWFzZV9zYXZlCi0JbGlibmFtZT0kbGlibmFtZV9zYXZlCi0JbmFtZT0kbmFtZV9zYXZlCi0KLQljYXNlICRob3N0IGluCi0JKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQotCSAgIyBPbiBSaGFwc29keSByZXBsYWNlIHRoZSBDIGxpYnJhcnkgd2l0aCB0aGUgU3lzdGVtIGZyYW1ld29yawotCSAgbmV3ZGVwbGlicz1gJEVDSE8gIiAkbmV3ZGVwbGlicyIgfCAkU0VEICdzLyAtbGMgLyBTeXN0ZW0ubHRmcmFtZXdvcmsgLydgCi0JICA7OwotCWVzYWMKLQotCWlmIHRlc3QgIiRkcm9wcGVkZGVwcyIgPSB5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCi0JICAgIGVjaG8KLQkgICAgZWNobyAiKioqIFdhcm5pbmc6IGxpYnRvb2wgY291bGQgbm90IHNhdGlzZnkgYWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkiCi0JICAgICRFQ0hPICIqKiogZGVwZW5kZW5jaWVzIG9mIG1vZHVsZSAkbGlibmFtZS4gIFRoZXJlZm9yZSwgbGlidG9vbCB3aWxsIGNyZWF0ZSIKLQkgICAgZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmciCi0JICAgIGVjaG8gIioqKiBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnLiIKLQkgICAgaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkgICAgICBlY2hvCi0JICAgICAgZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCi0JICAgICAgZWNobyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKLQkgICAgICBlY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCi0JICAgICAgZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgotCSAgICAgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCi0JICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQotCSAgICAgIGJ1aWxkX29sZF9saWJzPXllcwotCSAgICBlbHNlCi0JICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGVjaG8gIioqKiBUaGUgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgdGhhdCBoYXZlIGJlZW4gZHJvcHBlZCBoZXJlIHdpbGwgYmUiCi0JICAgIGVjaG8gIioqKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHdoZW5ldmVyIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0aGlzIGxpYnJhcnkiCi0JICAgIGVjaG8gIioqKiBvciBpcyBkZWNsYXJlZCB0byAtZGxvcGVuIGl0LiIKLQotCSAgICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IG5vOyB0aGVuCi0JICAgICAgZWNobwotCSAgICAgIGVjaG8gIioqKiBTaW5jZSB0aGlzIGxpYnJhcnkgbXVzdCBub3QgY29udGFpbiB1bmRlZmluZWQgc3ltYm9scywiCi0JICAgICAgZWNobyAiKioqIGJlY2F1c2UgZWl0aGVyIHRoZSBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IHRoZW0gb3IiCi0JICAgICAgZWNobyAiKioqIGl0IHdhcyBleHBsaWNpdGx5IHJlcXVlc3RlZCB3aXRoIC1uby11bmRlZmluZWQsIgotCSAgICAgIGVjaG8gIioqKiBsaWJ0b29sIHdpbGwgb25seSBjcmVhdGUgYSBzdGF0aWMgdmVyc2lvbiBvZiBpdC4iCi0JICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCi0JCW9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCi0JCWJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKLQkJYnVpbGRfb2xkX2xpYnM9eWVzCi0JICAgICAgZWxzZQotCQlidWlsZF9saWJ0b29sX2xpYnM9bm8KLQkgICAgICBmaQotCSAgICBmaQotCSAgZmkKLQlmaQotCSMgRG9uZSBjaGVja2luZyBkZXBsaWJzIQotCWRlcGxpYnM9JG5ld2RlcGxpYnMKLSAgICAgIGZpCi0gICAgICAjIFRpbWUgdG8gY2hhbmdlIGFsbCBvdXIgImZvby5sdGZyYW1ld29yayIgc3R1ZmYgYmFjayB0byAiLWZyYW1ld29yayBmb28iCi0gICAgICBjYXNlICRob3N0IGluCi0JKi0qLWRhcndpbiopCi0JICBuZXdkZXBsaWJzPWAkRUNITyAiICRuZXdkZXBsaWJzIiB8ICRTRUQgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCi0JICBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz1gJEVDSE8gIiAkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKLQkgIGRlcGxpYnM9YCRFQ0hPICIgJGRlcGxpYnMiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKLQkgIDs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgbW92ZSBsaWJyYXJ5IHNlYXJjaCBwYXRocyB0aGF0IGNvaW5jaWRlIHdpdGggcGF0aHMgdG8gbm90IHlldAotICAgICAgIyBpbnN0YWxsZWQgbGlicmFyaWVzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpYnJhcnkgc2VhcmNoIGxpc3QKLSAgICAgIG5ld19saWJzPQotICAgICAgZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KLQljYXNlICIgJG5ld19saWJzICIgaW4KLQkqIiAtTCRwYXRoLyRvYmpkaXIgIiopIDs7Ci0JKikKLQkgIGNhc2UgIiAkZGVwbGlicyAiIGluCi0JICAqIiAtTCRwYXRoLyRvYmpkaXIgIiopCi0JICAgIG5ld19saWJzPSIkbmV3X2xpYnMgLUwkcGF0aC8kb2JqZGlyIiA7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICBmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbwotCWNhc2UgJGRlcGxpYiBpbgotCS1MKikKLQkgIGNhc2UgIiAkbmV3X2xpYnMgIiBpbgotCSAgKiIgJGRlcGxpYiAiKikgOzsKLQkgICopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKLQkgIGVzYWMKLQkgIDs7Ci0JKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgIGRlcGxpYnM9IiRuZXdfbGlicyIKLQotICAgICAgIyBBbGwgdGhlIGxpYnJhcnktc3BlY2lmaWMgdmFyaWFibGVzIChpbnN0YWxsX2xpYmRpciBpcyBzZXQgYWJvdmUpLgotICAgICAgbGlicmFyeV9uYW1lcz0KLSAgICAgIG9sZF9saWJyYXJ5PQotICAgICAgZGxuYW1lPQotCi0gICAgICAjIFRlc3QgYWdhaW4sIHdlIG1heSBoYXZlIGRlY2lkZWQgbm90IHRvIGJ1aWxkIGl0IGFueSBtb3JlCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCi0JICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCi0JICBoYXJkY29kZV9saWJkaXJzPQotCSAgZGVwX3JwYXRoPQotCSAgcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCIKLQkgIHRlc3QgIiRtb2RlIiAhPSByZWxpbmsgJiYgcnBhdGg9IiRjb21waWxlX3JwYXRoJHJwYXRoIgotCSAgZm9yIGxpYmRpciBpbiAkcnBhdGg7IGRvCi0JICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotCSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgotCQlpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQkJICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgotCQllbHNlCi0JCSAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgotCQkgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCi0JCSAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQkgICAgOzsKLQkJICAqKQotCQkgICAgaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCi0JCSAgICA7OwotCQkgIGVzYWMKLQkJZmkKLQkgICAgICBlbHNlCi0JCWV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQkJZGVwX3JwYXRoPSIkZGVwX3JwYXRoICRmbGFnIgotCSAgICAgIGZpCi0JICAgIGVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCSAgICAgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KLQkgICAgICAqIiAkbGliZGlyICIqKSA7OwotCSAgICAgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgZG9uZQotCSAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KLQkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgotCSAgICAgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JICAgIGxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCi0JICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkIjsgdGhlbgotCSAgICAgIGV2YWwgZGVwX3JwYXRoPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRcIgotCSAgICBlbHNlCi0JICAgICAgZXZhbCBkZXBfcnBhdGg9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0JICAgIGZpCi0JICBmaQotCSAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KLQkgICAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KLQkgICAgcnBhdGg9Ci0JICAgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCi0JICAgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgICBkb25lCi0JICAgIGV2YWwgIiRydW5wYXRoX3Zhcj0nJHJwYXRoXCQkcnVucGF0aF92YXInOyBleHBvcnQgJHJ1bnBhdGhfdmFyIgotCSAgZmkKLQkgIHRlc3QgLW4gIiRkZXBfcnBhdGgiICYmIGRlcGxpYnM9IiRkZXBfcnBhdGggJGRlcGxpYnMiCi0JZmkKLQotCXNobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCIKLQl0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rICYmIHNobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJHNobGlicGF0aCIKLQlpZiB0ZXN0IC1uICIkc2hsaWJwYXRoIjsgdGhlbgotCSAgZXZhbCAiJHNobGlicGF0aF92YXI9JyRzaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyJzsgZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgotCWZpCi0KLQkjIEdldCB0aGUgcmVhbCBhbmQgbGluayBuYW1lcyBvZiB0aGUgbGlicmFyeS4KLQlldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgotCWV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgotCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcwotCXNoaWZ0Ci0JcmVhbG5hbWU9IiQxIgotCXNoaWZ0Ci0KLQlpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCi0JICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCi0JZWxzZQotCSAgc29uYW1lPSIkcmVhbG5hbWUiCi0JZmkKLQlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgotCSAgZGxuYW1lPSRzb25hbWUKLQlmaQotCi0JbGliPSIkb3V0cHV0X29iamRpci8kcmVhbG5hbWUiCi0JbGlua25hbWVzPQotCWZvciBsaW5rCi0JZG8KLQkgIGxpbmtuYW1lcz0iJGxpbmtuYW1lcyAkbGluayIKLQlkb25lCi0KLQkjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIHBpYwotCXRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJEVDSE8gIiRsaWJvYmpzIiB8ICRTUDJOTCB8ICRTRUQgIiRsbzJvIiB8ICROTDJTUGAKLQl0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQotCi0JZGVsZmlsZXM9Ci0JaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkaW5jbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgJG9wdF9kcnlfcnVuIHx8IGNwICIkZXhwb3J0X3N5bWJvbHMiICIkb3V0cHV0X29iamRpci8kbGlibmFtZS51ZXhwIgotCSAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnVleHAiCi0JICBkZWxmaWxlcz0iJGRlbGZpbGVzICRleHBvcnRfc3ltYm9scyIKLQlmaQotCi0Jb3JpZ19leHBvcnRfc3ltYm9scz0KLQljYXNlICRob3N0X29zIGluCi0JY3lnd2luKiB8IG1pbmd3KiB8IGNlZ2NjKikKLQkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgICAjIGV4cG9ydGluZyB1c2luZyB1c2VyIHN1cHBsaWVkIHN5bWZpbGUKLQkgICAgaWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiICE9IHhFWFBPUlRTOyB0aGVuCi0JICAgICAgIyBhbmQgaXQncyBOT1QgYWxyZWFkeSBhIC5kZWYgZmlsZS4gTXVzdCBmaWd1cmUgb3V0Ci0JICAgICAgIyB3aGljaCBvZiB0aGUgZ2l2ZW4gc3ltYm9scyBhcmUgZGF0YSBzeW1ib2xzIGFuZCB0YWcKLQkgICAgICAjIHRoZW0gYXMgc3VjaC4gU28sIHRyaWdnZXIgdXNlIG9mIGV4cG9ydF9zeW1ib2xzX2NtZHMuCi0JICAgICAgIyBleHBvcnRfc3ltYm9scyBnZXRzIHJlYXNzaWduZWQgaW5zaWRlIHRoZSAicHJlcGFyZQotCSAgICAgICMgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scyIgaWYgc3RhdGVtZW50LCBzbyB0aGUKLQkgICAgICAjIGluY2x1ZGVfZXhwc3ltcyBsb2dpYyBzdGlsbCB3b3Jrcy4KLQkgICAgICBvcmlnX2V4cG9ydF9zeW1ib2xzPSIkZXhwb3J0X3N5bWJvbHMiCi0JICAgICAgZXhwb3J0X3N5bWJvbHM9Ci0JICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcwotCSAgICBmaQotCSAgZmkKLQkgIDs7Ci0JZXNhYwotCi0JIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKLQlpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICBpZiB0ZXN0ICIkYWx3YXlzX2V4cG9ydF9zeW1ib2xzIiA9IHllcyB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAgIGZ1bmNfdmVyYm9zZSAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYSciCi0JICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS5leHAiCi0JICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJGV4cG9ydF9zeW1ib2xzCi0JICAgIGNtZHM9JGV4cG9ydF9zeW1ib2xzX2NtZHMKLQkgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICAgZXZhbCBjbWQ9XCIkY21kXCIKLQkgICAgICBmdW5jX2xlbiAiICRjbWQiCi0JICAgICAgbGVuPSRmdW5jX2xlbl9yZXN1bHQKLQkgICAgICBpZiB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KLQkJZnVuY19zaG93X2V2YWwgIiRjbWQiICdleGl0ICQ/JwotCQlza2lwcGVkX2V4cG9ydD1mYWxzZQotCSAgICAgIGVsc2UKLQkJIyBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nIHRvIGV4ZWN1dGUgaW4gb25lIHN0ZXAuCi0JCWZ1bmNfdmVyYm9zZSAidXNpbmcgcmVsb2FkYWJsZSBvYmplY3QgZmlsZSBmb3IgZXhwb3J0IGxpc3QuLi4iCi0JCXNraXBwZWRfZXhwb3J0PToKLQkJIyBCcmVhayBvdXQgZWFybHksIG90aGVyd2lzZSBza2lwcGVkX2V4cG9ydCBtYXkgYmUKLQkJIyBzZXQgdG8gZmFsc2UgYnkgYSBsYXRlciBidXQgc2hvcnRlciBjbWQuCi0JCWJyZWFrCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAmJiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiOyB0aGVuCi0JICAgICAgZnVuY19zaG93X2V2YWwgJyRFR1JFUCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJGV4cG9ydF9zeW1ib2xzIiA+ICIke2V4cG9ydF9zeW1ib2xzfVQiJwotCSAgICAgIGZ1bmNfc2hvd19ldmFsICckTVYgIiR7ZXhwb3J0X3N5bWJvbHN9VCIgIiRleHBvcnRfc3ltYm9scyInCi0JICAgIGZpCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCi0JICB0bXBfZXhwb3J0X3N5bWJvbHM9IiRleHBvcnRfc3ltYm9scyIKLQkgIHRlc3QgLW4gIiRvcmlnX2V4cG9ydF9zeW1ib2xzIiAmJiB0bXBfZXhwb3J0X3N5bWJvbHM9IiRvcmlnX2V4cG9ydF9zeW1ib2xzIgotCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyRFQ0hPICIkaW5jbHVkZV9leHBzeW1zIiB8ICRTUDJOTCA+PiAiJHRtcF9leHBvcnRfc3ltYm9scyInCi0JZmkKLQotCWlmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICAjIFRoZSBnaXZlbiBleHBvcnRzX3N5bWJvbHMgZmlsZSBoYXMgdG8gYmUgZmlsdGVyZWQsIHNvIGZpbHRlciBpdC4KLQkgIGZ1bmNfdmVyYm9zZSAiZmlsdGVyIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyB0byB0YWcgREFUQSBleHBvcnRzIgotCSAgIyBGSVhNRTogJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIHBvdGVudGlhbGx5IGNvbnRhaW5zIGxvdHMgb2YKLQkgICMgJ3MnIGNvbW1hbmRzIHdoaWNoIG5vdCBhbGwgc2VkcyBjYW4gaGFuZGxlLiBHTlUgc2VkIHNob3VsZCBiZSBmaW5lCi0JICAjIHRob3VnaC4gQWxzbywgdGhlIGZpbHRlciBzY2FsZXMgc3VwZXJsaW5lYXJseSB3aXRoIHRoZSBudW1iZXIgb2YKLQkgICMgZ2xvYmFsIHZhcmlhYmxlcy4gam9pbigxKSB3b3VsZCBiZSBuaWNlIGhlcmUsIGJ1dCB1bmZvcnR1bmF0ZWx5Ci0JICAjIGlzbid0IGEgYmxlc3NlZCB0b29sLgotCSAgJG9wdF9kcnlfcnVuIHx8ICRTRUQgLWUgJy9bICxdREFUQS8hZDtzLFwoLipcKVwoWyBcLF0uKlwpLHN8XlwxJHxcMVwyfCwnIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyCi0JICBkZWxmaWxlcz0iJGRlbGZpbGVzICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIiCi0JICBleHBvcnRfc3ltYm9scz0kb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYKLQkgICRvcHRfZHJ5X3J1biB8fCAkU0VEIC1mICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciA8ICRvcmlnX2V4cG9ydF9zeW1ib2xzID4gJGV4cG9ydF9zeW1ib2xzCi0JZmkKLQotCXRtcF9kZXBsaWJzPQotCWZvciB0ZXN0X2RlcGxpYiBpbiAkZGVwbGliczsgZG8KLQkgIGNhc2UgIiAkY29udmVuaWVuY2UgIiBpbgotCSAgKiIgJHRlc3RfZGVwbGliICIqKSA7OwotCSAgKikKLQkgICAgdG1wX2RlcGxpYnM9IiR0bXBfZGVwbGlicyAkdGVzdF9kZXBsaWIiCi0JICAgIDs7Ci0JICBlc2FjCi0JZG9uZQotCWRlcGxpYnM9IiR0bXBfZGVwbGlicyIKLQotCWlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyIgJiYKLQkgICAgdGVzdCAiJGNvbXBpbGVyX25lZWRzX29iamVjdCIgPSB5ZXMgJiYKLQkgICAgdGVzdCAteiAiJGxpYm9ianMiOyB0aGVuCi0JICAgICMgZXh0cmFjdCB0aGUgYXJjaGl2ZXMsIHNvIHdlIGhhdmUgb2JqZWN0cyB0byBsaXN0LgotCSAgICAjIFRPRE86IGNvdWxkIG9wdGltaXplIHRoaXMgdG8ganVzdCBleHRyYWN0IG9uZSBhcmNoaXZlLgotCSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KLQkgIGZpCi0JICBpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCi0JICAgIHNhdmVfbGlib2Jqcz0kbGlib2JqcwotCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKLQkgICAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KLQkgIGVsc2UKLQkgICAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKLQkgICAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCi0KLQkgICAgZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGNvbnZlbmllbmNlCi0JICAgIGxpYm9ianM9IiRsaWJvYmpzICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgotCSAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAiJHRocmVhZF9zYWZlIiA9IHllcyAmJiB0ZXN0IC1uICIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgZXZhbCBmbGFnPVwiJHRocmVhZF9zYWZlX2ZsYWdfc3BlY1wiCi0JICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJGZsYWciCi0JZmkKLQotCSMgTWFrZSBhIGJhY2t1cCBvZiB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSB3aGVuIHJlbGlua2luZwotCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgotCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkUk0gJHtyZWFsbmFtZX1VICYmICRNViAkcmVhbG5hbWUgJHtyZWFsbmFtZX1VKScgfHwgZXhpdCAkPwotCWZpCi0KLQkjIERvIGVhY2ggb2YgdGhlIGFyY2hpdmUgY29tbWFuZHMuCi0JaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJG1vZHVsZV9jbWRzIiA7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJG1vZHVsZV9leHBzeW1fY21kcyI7IHRoZW4KLQkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkbW9kdWxlX2V4cHN5bV9jbWRzXCIKLQkgICAgY21kcz0kbW9kdWxlX2V4cHN5bV9jbWRzCi0JICBlbHNlCi0JICAgIGV2YWwgdGVzdF9jbWRzPVwiJG1vZHVsZV9jbWRzXCIKLQkgICAgY21kcz0kbW9kdWxlX2NtZHMKLQkgIGZpCi0JZWxzZQotCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkYXJjaGl2ZV9leHBzeW1fY21kcyI7IHRoZW4KLQkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkYXJjaGl2ZV9leHBzeW1fY21kc1wiCi0JICAgIGNtZHM9JGFyY2hpdmVfZXhwc3ltX2NtZHMKLQkgIGVsc2UKLQkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkYXJjaGl2ZV9jbWRzXCIKLQkgICAgY21kcz0kYXJjaGl2ZV9jbWRzCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmCi0JICAgZnVuY19sZW4gIiAkdGVzdF9jbWRzIiAmJgotCSAgIGxlbj0kZnVuY19sZW5fcmVzdWx0ICYmCi0JICAgdGVzdCAiJGxlbiIgLWx0ICIkbWF4X2NtZF9sZW4iIHx8IHRlc3QgIiRtYXhfY21kX2xlbiIgLWxlIC0xOyB0aGVuCi0JICA6Ci0JZWxzZQotCSAgIyBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nIHRvIGxpbmsgaW4gb25lIHN0ZXAsIGxpbmsgcGllY2V3aXNlCi0JICAjIG9yLCBpZiB1c2luZyBHTlUgbGQgYW5kIHNraXBwZWRfZXhwb3J0IGlzIG5vdCA6LCB1c2UgYSBsaW5rZXIKLQkgICMgc2NyaXB0LgotCi0JICAjIFNhdmUgdGhlIHZhbHVlIG9mICRvdXRwdXQgYW5kICRsaWJvYmpzIGJlY2F1c2Ugd2Ugd2FudCB0bwotCSAgIyB1c2UgdGhlbSBsYXRlci4gIElmIHdlIGhhdmUgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsIHdlCi0JICAjIHdhbnQgdG8gdXNlIHNhdmVfbGlib2JqcyBhcyBpdCB3YXMgYmVmb3JlCi0JICAjIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIHdhcyBleHBhbmRlZCwgYmVjYXVzZSB3ZSBjYW4ndAotCSAgIyBhc3N1bWUgdGhlIGxpbmtlciB1bmRlcnN0YW5kcyB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYy4KLQkgICMgVGhpcyBtYXkgaGF2ZSB0byBiZSByZXZpc2l0ZWQsIGluIGNhc2UgdG9vIG1hbnkKLQkgICMgY29udmVuaWVuY2UgbGlicmFyaWVzIGdldCBsaW5rZWQgaW4gYW5kIGVuZCB1cCBleGNlZWRpbmcKLQkgICMgdGhlIHNwZWMuCi0JICBpZiB0ZXN0IC16ICIkY29udmVuaWVuY2UiIHx8IHRlc3QgLXogIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgc2F2ZV9saWJvYmpzPSRsaWJvYmpzCi0JICBmaQotCSAgc2F2ZV9vdXRwdXQ9JG91dHB1dAotCSAgZnVuY19iYXNlbmFtZSAiJG91dHB1dCIKLQkgIG91dHB1dF9sYT0kZnVuY19iYXNlbmFtZV9yZXN1bHQKLQotCSAgIyBDbGVhciB0aGUgcmVsb2FkYWJsZSBvYmplY3QgY3JlYXRpb24gY29tbWFuZCBxdWV1ZSBhbmQKLQkgICMgaW5pdGlhbGl6ZSBrIHRvIG9uZS4KLQkgIHRlc3RfY21kcz0KLQkgIGNvbmNhdF9jbWRzPQotCSAgb2JqbGlzdD0KLQkgIGxhc3Rfcm9iaj0KLQkgIGs9MQotCi0JICBpZiB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIiAmJiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLQkgICAgb3V0cHV0PSR7b3V0cHV0X29iamRpcn0vJHtvdXRwdXRfbGF9Lmxua3NjcmlwdAotCSAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nIEdOVSBsZCBzY3JpcHQ6ICRvdXRwdXQiCi0JICAgIGVjaG8gJ0lOUFVUICgnID4gJG91dHB1dAotCSAgICBmb3Igb2JqIGluICRzYXZlX2xpYm9ianMKLQkgICAgZG8KLQkgICAgICAkRUNITyAiJG9iaiIgPj4gJG91dHB1dAotCSAgICBkb25lCi0JICAgIGVjaG8gJyknID4+ICRvdXRwdXQKLQkgICAgZGVsZmlsZXM9IiRkZWxmaWxlcyAkb3V0cHV0IgotCSAgZWxpZiB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIiAmJiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmIHRlc3QgIlgkZmlsZV9saXN0X3NwZWMiICE9IFg7IHRoZW4KLQkgICAgb3V0cHV0PSR7b3V0cHV0X29iamRpcn0vJHtvdXRwdXRfbGF9LmxuawotCSAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nIGxpbmtlciBpbnB1dCBmaWxlIGxpc3Q6ICRvdXRwdXQiCi0JICAgIDogPiAkb3V0cHV0Ci0JICAgIHNldCB4ICRzYXZlX2xpYm9ianMKLQkgICAgc2hpZnQKLQkgICAgZmlyc3RvYmo9Ci0JICAgIGlmIHRlc3QgIiRjb21waWxlcl9uZWVkc19vYmplY3QiID0geWVzOyB0aGVuCi0JICAgICAgZmlyc3RvYmo9IiQxICIKLQkgICAgICBzaGlmdAotCSAgICBmaQotCSAgICBmb3Igb2JqCi0JICAgIGRvCi0JICAgICAgJEVDSE8gIiRvYmoiID4+ICRvdXRwdXQKLQkgICAgZG9uZQotCSAgICBkZWxmaWxlcz0iJGRlbGZpbGVzICRvdXRwdXQiCi0JICAgIG91dHB1dD0kZmlyc3RvYmpcIiRmaWxlX2xpc3Rfc3BlYyRvdXRwdXRcIgotCSAgZWxzZQotCSAgICBpZiB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIjsgdGhlbgotCSAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuLi4iCi0JICAgICAgb3V0cHV0PSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0Ci0JICAgICAgZXZhbCB0ZXN0X2NtZHM9XCIkcmVsb2FkX2NtZHNcIgotCSAgICAgIGZ1bmNfbGVuICIgJHRlc3RfY21kcyIKLQkgICAgICBsZW4wPSRmdW5jX2xlbl9yZXN1bHQKLQkgICAgICBsZW49JGxlbjAKLQotCSAgICAgICMgTG9vcCBvdmVyIHRoZSBsaXN0IG9mIG9iamVjdHMgdG8gYmUgbGlua2VkLgotCSAgICAgIGZvciBvYmogaW4gJHNhdmVfbGlib2JqcwotCSAgICAgIGRvCi0JCWZ1bmNfbGVuICIgJG9iaiIKLQkJZnVuY19hcml0aCAkbGVuICsgJGZ1bmNfbGVuX3Jlc3VsdAotCQlsZW49JGZ1bmNfYXJpdGhfcmVzdWx0Ci0JCWlmIHRlc3QgIlgkb2JqbGlzdCIgPSBYIHx8Ci0JCSAgIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIjsgdGhlbgotCQkgIGZ1bmNfYXBwZW5kIG9iamxpc3QgIiAkb2JqIgotCQllbHNlCi0JCSAgIyBUaGUgY29tbWFuZCAkdGVzdF9jbWRzIGlzIGFsbW9zdCB0b28gbG9uZywgYWRkIGEKLQkJICAjIGNvbW1hbmQgdG8gdGhlIHF1ZXVlLgotCQkgIGlmIHRlc3QgIiRrIiAtZXEgMSA7IHRoZW4KLQkJICAgICMgVGhlIGZpcnN0IGZpbGUgZG9lc24ndCBoYXZlIGEgcHJldmlvdXMgY29tbWFuZCB0byBhZGQuCi0JCSAgICByZWxvYWRfb2Jqcz0kb2JqbGlzdAotCQkgICAgZXZhbCBjb25jYXRfY21kcz1cIiRyZWxvYWRfY21kc1wiCi0JCSAgZWxzZQotCQkgICAgIyBBbGwgc3Vic2VxdWVudCByZWxvYWRhYmxlIG9iamVjdCBmaWxlcyB3aWxsIGxpbmsgaW4KLQkJICAgICMgdGhlIGxhc3Qgb25lIGNyZWF0ZWQuCi0JCSAgICByZWxvYWRfb2Jqcz0iJG9iamxpc3QgJGxhc3Rfcm9iaiIKLQkJICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzfiRyZWxvYWRfY21kc35cJFJNICRsYXN0X3JvYmpcIgotCQkgIGZpCi0JCSAgbGFzdF9yb2JqPSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0Ci0JCSAgZnVuY19hcml0aCAkayArIDEKLQkJICBrPSRmdW5jX2FyaXRoX3Jlc3VsdAotCQkgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAotCQkgIG9iamxpc3Q9IiAkb2JqIgotCQkgIGZ1bmNfbGVuICIgJGxhc3Rfcm9iaiIKLQkJICBmdW5jX2FyaXRoICRsZW4wICsgJGZ1bmNfbGVuX3Jlc3VsdAotCQkgIGxlbj0kZnVuY19hcml0aF9yZXN1bHQKLQkJZmkKLQkgICAgICBkb25lCi0JICAgICAgIyBIYW5kbGUgdGhlIHJlbWFpbmluZyBvYmplY3RzIGJ5IGNyZWF0aW5nIG9uZSBsYXN0Ci0JICAgICAgIyByZWxvYWRhYmxlIG9iamVjdCBmaWxlLiAgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QKLQkgICAgICAjIGZpbGVzIHdpbGwgbGluayBpbiB0aGUgbGFzdCBvbmUgY3JlYXRlZC4KLQkgICAgICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KLQkgICAgICByZWxvYWRfb2Jqcz0iJG9iamxpc3QgJGxhc3Rfcm9iaiIKLQkgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9JHJlbG9hZF9jbWRzXCIKLQkgICAgICBpZiB0ZXN0IC1uICIkbGFzdF9yb2JqIjsgdGhlbgotCSAgICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfX5cJFJNICRsYXN0X3JvYmpcIgotCSAgICAgIGZpCi0JICAgICAgZGVsZmlsZXM9IiRkZWxmaWxlcyAkb3V0cHV0IgotCi0JICAgIGVsc2UKLQkgICAgICBvdXRwdXQ9Ci0JICAgIGZpCi0KLQkgICAgaWYgJHtza2lwcGVkX2V4cG9ydC1mYWxzZX07IHRoZW4KLQkgICAgICBmdW5jX3ZlcmJvc2UgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgotCSAgICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS5leHAiCi0JICAgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkZXhwb3J0X3N5bWJvbHMKLQkgICAgICBsaWJvYmpzPSRvdXRwdXQKLQkgICAgICAjIEFwcGVuZCB0aGUgY29tbWFuZCB0byBjcmVhdGUgdGhlIGV4cG9ydCBmaWxlLgotCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgotCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzJGV4cG9ydF9zeW1ib2xzX2NtZHNcIgotCSAgICAgIGlmIHRlc3QgLW4gIiRsYXN0X3JvYmoiOyB0aGVuCi0JCWV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzflwkUk0gJGxhc3Rfcm9ialwiCi0JICAgICAgZmkKLQkgICAgZmkKLQotCSAgICB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIiAmJgotCSAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgYSB0ZW1wb3JhcnkgcmVsb2FkYWJsZSBvYmplY3QgZmlsZTogJG91dHB1dCIKLQotCSAgICAjIExvb3AgdGhyb3VnaCB0aGUgY29tbWFuZHMgZ2VuZXJhdGVkIGFib3ZlIGFuZCBleGVjdXRlIHRoZW0uCi0JICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgICBmb3IgY21kIGluICRjb25jYXRfY21kczsgZG8KLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgICAkb3B0X3NpbGVudCB8fCB7Ci0JCSAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkY21kIgotCQkgIGV2YWwgImZ1bmNfZWNobyAkZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdCIKLQkgICAgICB9Ci0JICAgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiRjbWQiIHx8IHsKLQkJbHRfZXhpdD0kPwotCi0JCSMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAotCQlpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KLQkJICAoIGNkICIkb3V0cHV0X29iamRpciIgJiYgXAotCQkgICAgJFJNICIke3JlYWxuYW1lfVQiICYmIFwKLQkJICAgICRNViAiJHtyZWFsbmFtZX1VIiAiJHJlYWxuYW1lIiApCi0JCWZpCi0KLQkJZXhpdCAkbHRfZXhpdAotCSAgICAgIH0KLQkgICAgZG9uZQotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQotCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICYmICR7c2tpcHBlZF9leHBvcnQtZmFsc2V9OyB0aGVuCi0JICAgICAgZnVuY19zaG93X2V2YWwgJyRFR1JFUCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJGV4cG9ydF9zeW1ib2xzIiA+ICIke2V4cG9ydF9zeW1ib2xzfVQiJwotCSAgICAgIGZ1bmNfc2hvd19ldmFsICckTVYgIiR7ZXhwb3J0X3N5bWJvbHN9VCIgIiRleHBvcnRfc3ltYm9scyInCi0JICAgIGZpCi0JICBmaQotCi0gICAgICAgICAgaWYgJHtza2lwcGVkX2V4cG9ydC1mYWxzZX07IHRoZW4KLQkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkaW5jbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgICAgIHRtcF9leHBvcnRfc3ltYm9scz0iJGV4cG9ydF9zeW1ib2xzIgotCSAgICAgIHRlc3QgLW4gIiRvcmlnX2V4cG9ydF9zeW1ib2xzIiAmJiB0bXBfZXhwb3J0X3N5bWJvbHM9IiRvcmlnX2V4cG9ydF9zeW1ib2xzIgotCSAgICAgICRvcHRfZHJ5X3J1biB8fCBldmFsICckRUNITyAiJGluY2x1ZGVfZXhwc3ltcyIgfCAkU1AyTkwgPj4gIiR0bXBfZXhwb3J0X3N5bWJvbHMiJwotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgLW4gIiRvcmlnX2V4cG9ydF9zeW1ib2xzIjsgdGhlbgotCSAgICAgICMgVGhlIGdpdmVuIGV4cG9ydHNfc3ltYm9scyBmaWxlIGhhcyB0byBiZSBmaWx0ZXJlZCwgc28gZmlsdGVyIGl0LgotCSAgICAgIGZ1bmNfdmVyYm9zZSAiZmlsdGVyIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyB0byB0YWcgREFUQSBleHBvcnRzIgotCSAgICAgICMgRklYTUU6ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciBwb3RlbnRpYWxseSBjb250YWlucyBsb3RzIG9mCi0JICAgICAgIyAncycgY29tbWFuZHMgd2hpY2ggbm90IGFsbCBzZWRzIGNhbiBoYW5kbGUuIEdOVSBzZWQgc2hvdWxkIGJlIGZpbmUKLQkgICAgICAjIHRob3VnaC4gQWxzbywgdGhlIGZpbHRlciBzY2FsZXMgc3VwZXJsaW5lYXJseSB3aXRoIHRoZSBudW1iZXIgb2YKLQkgICAgICAjIGdsb2JhbCB2YXJpYWJsZXMuIGpvaW4oMSkgd291bGQgYmUgbmljZSBoZXJlLCBidXQgdW5mb3J0dW5hdGVseQotCSAgICAgICMgaXNuJ3QgYSBibGVzc2VkIHRvb2wuCi0JICAgICAgJG9wdF9kcnlfcnVuIHx8ICRTRUQgLWUgJy9bICxdREFUQS8hZDtzLFwoLipcKVwoWyBcLF0uKlwpLHN8XlwxJHxcMVwyfCwnIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyCi0JICAgICAgZGVsZmlsZXM9IiRkZWxmaWxlcyAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIgotCSAgICAgIGV4cG9ydF9zeW1ib2xzPSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZgotCSAgICAgICRvcHRfZHJ5X3J1biB8fCAkU0VEIC1mICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciA8ICRvcmlnX2V4cG9ydF9zeW1ib2xzID4gJGV4cG9ydF9zeW1ib2xzCi0JICAgIGZpCi0JICBmaQotCi0JICBsaWJvYmpzPSRvdXRwdXQKLQkgICMgUmVzdG9yZSB0aGUgdmFsdWUgb2Ygb3V0cHV0LgotCSAgb3V0cHV0PSRzYXZlX291dHB1dAotCi0JICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiICYmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgZXZhbCBsaWJvYmpzPVwiXCRsaWJvYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCi0JICAgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9Ci0JICBmaQotCSAgIyBFeHBhbmQgdGhlIGxpYnJhcnkgbGlua2luZyBjb21tYW5kcyBhZ2FpbiB0byByZXNldCB0aGUKLQkgICMgdmFsdWUgb2YgJGxpYm9ianMgZm9yIHBpZWNld2lzZSBsaW5raW5nLgotCi0JICAjIERvIGVhY2ggb2YgdGhlIGFyY2hpdmUgY29tbWFuZHMuCi0JICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyAmJiB0ZXN0IC1uICIkbW9kdWxlX2NtZHMiIDsgdGhlbgotCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRtb2R1bGVfZXhwc3ltX2NtZHMiOyB0aGVuCi0JICAgICAgY21kcz0kbW9kdWxlX2V4cHN5bV9jbWRzCi0JICAgIGVsc2UKLQkgICAgICBjbWRzPSRtb2R1bGVfY21kcwotCSAgICBmaQotCSAgZWxzZQotCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgotCSAgICAgIGNtZHM9JGFyY2hpdmVfZXhwc3ltX2NtZHMKLQkgICAgZWxzZQotCSAgICAgIGNtZHM9JGFyY2hpdmVfY21kcwotCSAgICBmaQotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAtbiAiJGRlbGZpbGVzIjsgdGhlbgotCSAgIyBBcHBlbmQgdGhlIGNvbW1hbmQgdG8gcmVtb3ZlIHRlbXBvcmFyeSBmaWxlcyB0byAkY21kcy4KLQkgIGV2YWwgY21kcz1cIlwkY21kc35cJFJNICRkZWxmaWxlc1wiCi0JZmkKLQotCSMgQWRkIGFueSBvYmplY3RzIGZyb20gcHJlbG9hZGVkIGNvbnZlbmllbmNlIGxpYnJhcmllcwotCWlmIHRlc3QgLW4gIiRkbHByZWZpbGVzIjsgdGhlbgotCSAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKLQkgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCi0JICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkZGxwcmVmaWxlcwotCSAgbGlib2Jqcz0iJGxpYm9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCi0JICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQotCWZpCi0KLQlzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQlmb3IgY21kIGluICRjbWRzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICBldmFsIGNtZD1cIiRjbWRcIgotCSAgJG9wdF9zaWxlbnQgfHwgewotCSAgICBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgIiRjbWQiCi0JICAgIGV2YWwgImZ1bmNfZWNobyAkZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdCIKLQkgIH0KLQkgICRvcHRfZHJ5X3J1biB8fCBldmFsICIkY21kIiB8fCB7Ci0JICAgIGx0X2V4aXQ9JD8KLQotCSAgICAjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKLQkgICAgaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCi0JICAgICAgKCBjZCAiJG91dHB1dF9vYmpkaXIiICYmIFwKLQkgICAgICAgICRSTSAiJHtyZWFsbmFtZX1UIiAmJiBcCi0JCSRNViAiJHtyZWFsbmFtZX1VIiAiJHJlYWxuYW1lIiApCi0JICAgIGZpCi0KLQkgICAgZXhpdCAkbHRfZXhpdAotCSAgfQotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLQotCSMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAotCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgotCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkUk0gJHtyZWFsbmFtZX1UICYmICRNViAkcmVhbG5hbWUgJHtyZWFsbmFtZX1UICYmICRNViAke3JlYWxuYW1lfVUgJHJlYWxuYW1lKScgfHwgZXhpdCAkPwotCi0JICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgICBmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKLQkgICAgZmkKLQkgIGZpCi0KLQkgIGV4aXQgJEVYSVRfU1VDQ0VTUwotCWZpCi0KLQkjIENyZWF0ZSBsaW5rcyB0byB0aGUgcmVhbCBsaWJyYXJ5LgotCWZvciBsaW5rbmFtZSBpbiAkbGlua25hbWVzOyBkbwotCSAgaWYgdGVzdCAiJHJlYWxuYW1lIiAhPSAiJGxpbmtuYW1lIjsgdGhlbgotCSAgICBmdW5jX3Nob3dfZXZhbCAnKGNkICIkb3V0cHV0X29iamRpciIgJiYgJFJNICIkbGlua25hbWUiICYmICRMTl9TICIkcmVhbG5hbWUiICIkbGlua25hbWUiKScgJ2V4aXQgJD8nCi0JICBmaQotCWRvbmUKLQotCSMgSWYgLW1vZHVsZSBvciAtZXhwb3J0LWR5bmFtaWMgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBkbG5hbWUuCi0JaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgfHwgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllczsgdGhlbgotCSAgIyBPbiBhbGwga25vd24gb3BlcmF0aW5nIHN5c3RlbXMsIHRoZXNlIGFyZSBpZGVudGljYWwuCi0JICBkbG5hbWU9IiRzb25hbWUiCi0JZmkKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgb2JqKQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KLQlmdW5jX3dhcm5pbmcgIlxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgIiAkZGVwbGlicyIgaW4KLSAgICAgICpcIC1sKiB8ICpcIC1MKikKLQlmdW5jX3dhcm5pbmcgIlxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3Igb2JqZWN0cyIgOzsKLSAgICAgIGVzYWMKLQotICAgICAgdGVzdCAtbiAiJHJwYXRoIiAmJiBcCi0JZnVuY193YXJuaW5nICJcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKLQotICAgICAgdGVzdCAtbiAiJHhycGF0aCIgJiYgXAotCWZ1bmNfd2FybmluZyAiXGAtUicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKLQotICAgICAgdGVzdCAtbiAiJHZpbmZvIiAmJiBcCi0JZnVuY193YXJuaW5nICJcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCi0KLSAgICAgIHRlc3QgLW4gIiRyZWxlYXNlIiAmJiBcCi0JZnVuY193YXJuaW5nICJcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgotCi0gICAgICBjYXNlICRvdXRwdXQgaW4KLSAgICAgICoubG8pCi0JdGVzdCAtbiAiJG9ianMkb2xkX2RlcGxpYnMiICYmIFwKLQkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIKLQotCWxpYm9iaj0kb3V0cHV0Ci0JZnVuY19sbzJvICIkbGlib2JqIgotCW9iaj0kZnVuY19sbzJvX3Jlc3VsdAotCTs7Ci0gICAgICAqKQotCWxpYm9iaj0KLQlvYmo9IiRvdXRwdXQiCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBEZWxldGUgdGhlIG9sZCBvYmplY3RzLgotICAgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkb2JqICRsaWJvYmoKLQotICAgICAgIyBPYmplY3RzIGZyb20gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgVGhpcyBhc3N1bWVzCi0gICAgICAjIHNpbmdsZS12ZXJzaW9uIGNvbnZlbmllbmNlIGxpYnJhcmllcy4gIFdoZW5ldmVyIHdlIGNyZWF0ZQotICAgICAgIyBkaWZmZXJlbnQgb25lcyBmb3IgUElDL25vbi1QSUMsIHRoaXMgd2UnbGwgaGF2ZSB0byBkdXBsaWNhdGUKLSAgICAgICMgdGhlIGV4dHJhY3Rpb24uCi0gICAgICByZWxvYWRfY29udl9vYmpzPQotICAgICAgZ2VudG9wPQotICAgICAgIyByZWxvYWRfY21kcyBydW5zICRMRCBkaXJlY3RseSwgc28gbGV0IHVzIGdldCByaWQgb2YKLSAgICAgICMgLVdsIGZyb20gd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgYW5kIGhvcGUgd2UgY2FuIGdldCBieSB3aXRoCi0gICAgICAjIHR1cm5pbmcgY29tbWEgaW50byBzcGFjZS4uCi0gICAgICB3bD0KLQotICAgICAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgotCWlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgIGV2YWwgdG1wX3dob2xlX2FyY2hpdmVfZmxhZ3M9XCIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgotCSAgcmVsb2FkX2NvbnZfb2Jqcz0kcmVsb2FkX29ianNcIGAkRUNITyAiJHRtcF93aG9sZV9hcmNoaXZlX2ZsYWdzIiB8ICRTRUQgJ3N8LHwgfGcnYAotCWVsc2UKLQkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvYmp9eCIKLQkgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCi0JICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkY29udmVuaWVuY2UKLQkgIHJlbG9hZF9jb252X29ianM9IiRyZWxvYWRfb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBDcmVhdGUgdGhlIG9sZC1zdHlsZSBvYmplY3QuCi0gICAgICByZWxvYWRfb2Jqcz0iJG9ianMkb2xkX2RlcGxpYnMgImAkRUNITyAiJGxpYm9ianMiIHwgJFNQMk5MIHwgJFNFRCAiL1wuJHtsaWJleHR9JC9kOyAvXC5saWIkL2Q7ICRsbzJvIiB8ICROTDJTUGAiICRyZWxvYWRfY29udl9vYmpzIiAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKLQotICAgICAgb3V0cHV0PSIkb2JqIgotICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRyZWxvYWRfY21kcyIgJ2V4aXQgJD8nCi0KLSAgICAgICMgRXhpdCBpZiB3ZSBhcmVuJ3QgZG9pbmcgYSBsaWJyYXJ5IG9iamVjdCBmaWxlLgotICAgICAgaWYgdGVzdCAteiAiJGxpYm9iaiI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgotCSAgZnVuY19zaG93X2V2YWwgJyR7Uk19ciAiJGdlbnRvcCInCi0JZmkKLQotCWV4aXQgJEVYSVRfU1VDQ0VTUwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0JaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KLQkgIGZ1bmNfc2hvd19ldmFsICcke1JNfXIgIiRnZW50b3AiJwotCWZpCi0KLQkjIENyZWF0ZSBhbiBpbnZhbGlkIGxpYnRvb2wgb2JqZWN0IGlmIG5vIFBJQywgc28gdGhhdCB3ZSBkb24ndAotCSMgYWNjaWRlbnRhbGx5IGxpbmsgaXQgaW50byBhIHByb2dyYW0uCi0JIyAkc2hvdyAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIgotCSMgJG9wdF9kcnlfcnVuIHx8IGV2YWwgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIgfHwgZXhpdCAkPwotCWV4aXQgJEVYSVRfU1VDQ0VTUwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHBpY19mbGFnIiB8fCB0ZXN0ICIkcGljX21vZGUiICE9IGRlZmF1bHQ7IHRoZW4KLQkjIE9ubHkgZG8gY29tbWFuZHMgaWYgd2UgcmVhbGx5IGhhdmUgZGlmZmVyZW50IFBJQyBvYmplY3RzLgotCXJlbG9hZF9vYmpzPSIkbGlib2JqcyAkcmVsb2FkX2NvbnZfb2JqcyIKLQlvdXRwdXQ9IiRsaWJvYmoiCi0JZnVuY19leGVjdXRlX2NtZHMgIiRyZWxvYWRfY21kcyIgJ2V4aXQgJD8nCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgotCWZ1bmNfc2hvd19ldmFsICcke1JNfXIgIiRnZW50b3AiJwotICAgICAgZmkKLQotICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgICA7OwotCi0gICAgcHJvZykKLSAgICAgIGNhc2UgJGhvc3QgaW4KLQkqY3lnd2luKikgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkb3V0cHV0IgotCSAgICAgICAgICBvdXRwdXQ9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdC5leGU7OwotICAgICAgZXNhYwotICAgICAgdGVzdCAtbiAiJHZpbmZvIiAmJiBcCi0JZnVuY193YXJuaW5nICJcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIgotCi0gICAgICB0ZXN0IC1uICIkcmVsZWFzZSIgJiYgXAotCWZ1bmNfd2FybmluZyAiXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiCi0KLSAgICAgIHRlc3QgIiRwcmVsb2FkIiA9IHllcyBcCi0gICAgICAgICYmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB1bmtub3duIFwKLQkmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiID0gdW5rbm93biBcCi0JJiYgdGVzdCAiJGRsb3Blbl9zZWxmX3N0YXRpYyIgPSB1bmtub3duICYmIFwKLQkgIGZ1bmNfd2FybmluZyAiXGBMVF9JTklUKFtkbG9wZW5dKScgbm90IHVzZWQuIEFzc3VtaW5nIG5vIGRsb3BlbiBzdXBwb3J0LiIKLQotICAgICAgY2FzZSAkaG9zdCBpbgotICAgICAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQotCSMgT24gUmhhcHNvZHkgcmVwbGFjZSB0aGUgQyBsaWJyYXJ5IGlzIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCi0JY29tcGlsZV9kZXBsaWJzPWAkRUNITyAiICRjb21waWxlX2RlcGxpYnMiIHwgJFNFRCAncy8gLWxjIC8gU3lzdGVtLmx0ZnJhbWV3b3JrIC8nYAotCWZpbmFsaXplX2RlcGxpYnM9YCRFQ0hPICIgJGZpbmFsaXplX2RlcGxpYnMiIHwgJFNFRCAncy8gLWxjIC8gU3lzdGVtLmx0ZnJhbWV3b3JrIC8nYAotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICotKi1kYXJ3aW4qKQotCSMgRG9uJ3QgYWxsb3cgbGF6eSBsaW5raW5nLCBpdCBicmVha3MgQysrIGdsb2JhbCBjb25zdHJ1Y3RvcnMKLQkjIEJ1dCBpcyBzdXBwb3NlZGx5IGZpeGVkIG9uIDEwLjQgb3IgbGF0ZXIgKHlheSEpLgotCWlmIHRlc3QgIiR0YWduYW1lIiA9IENYWCA7IHRoZW4KLQkgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQtMTAuMH0gaW4KLQkgICAgMTAuWzAxMjNdKQotCSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAke3dsfS1iaW5kX2F0X2xvYWQiCi0JICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJHt3bH0tYmluZF9hdF9sb2FkIgotCSAgICA7OwotCSAgZXNhYwotCWZpCi0JIyBUaW1lIHRvIGNoYW5nZSBhbGwgb3VyICJmb28ubHRmcmFtZXdvcmsiIHN0dWZmIGJhY2sgdG8gIi1mcmFtZXdvcmsgZm9vIgotCWNvbXBpbGVfZGVwbGlicz1gJEVDSE8gIiAkY29tcGlsZV9kZXBsaWJzIiB8ICRTRUQgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCi0JZmluYWxpemVfZGVwbGlicz1gJEVDSE8gIiAkZmluYWxpemVfZGVwbGlicyIgfCAkU0VEICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAotCTs7Ci0gICAgICBlc2FjCi0KLQotICAgICAgIyBtb3ZlIGxpYnJhcnkgc2VhcmNoIHBhdGhzIHRoYXQgY29pbmNpZGUgd2l0aCBwYXRocyB0byBub3QgeWV0Ci0gICAgICAjIGluc3RhbGxlZCBsaWJyYXJpZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlicmFyeSBzZWFyY2ggbGlzdAotICAgICAgbmV3X2xpYnM9Ci0gICAgICBmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbwotCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgotCSoiIC1MJHBhdGgvJG9iamRpciAiKikgOzsKLQkqKQotCSAgY2FzZSAiICRjb21waWxlX2RlcGxpYnMgIiBpbgotCSAgKiIgLUwkcGF0aC8kb2JqZGlyICIqKQotCSAgICBuZXdfbGlicz0iJG5ld19saWJzIC1MJHBhdGgvJG9iamRpciIgOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgZm9yIGRlcGxpYiBpbiAkY29tcGlsZV9kZXBsaWJzOyBkbwotCWNhc2UgJGRlcGxpYiBpbgotCS1MKikKLQkgIGNhc2UgIiAkbmV3X2xpYnMgIiBpbgotCSAgKiIgJGRlcGxpYiAiKikgOzsKLQkgICopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKLQkgIGVzYWMKLQkgIDs7Ci0JKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJG5ld19saWJzIgotCi0KLSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkY29tcGlsZV9kZXBsaWJzIgotICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGZpbmFsaXplX2RlcGxpYnMiCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCR4cnBhdGgiOyB0aGVuCi0JIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgotCWZvciBsaWJkaXIgaW4gJHJwYXRoICR4cnBhdGg7IGRvCi0JICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCi0JICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlkb25lCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocwotICAgICAgcnBhdGg9Ci0gICAgICBoYXJkY29kZV9saWJkaXJzPQotICAgICAgZm9yIGxpYmRpciBpbiAkY29tcGlsZV9ycGF0aCAkZmluYWxpemVfcnBhdGg7IGRvCi0JaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkgICAgZWxzZQotCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgotCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKLQkJOzsKLQkgICAgICAqKQotCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKLQkgIGZpCi0JZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JICBjYXNlICIkcGVybV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotCWNhc2UgJGhvc3QgaW4KLQkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQotCSAgdGVzdGJpbmRpcj1gJHtFQ0hPfSAiJGxpYmRpciIgfCAke1NFRH0gLWUgJ3MqL2xpYiQqL2JpbionYAotCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCi0JICAqIjokbGliZGlyOiIqKSA7OwotCSAgOjopIGRsbHNlYXJjaHBhdGg9JGxpYmRpcjs7Ci0JICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokbGliZGlyIjs7Ci0JICBlc2FjCi0JICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KLQkgICoiOiR0ZXN0YmluZGlyOiIqKSA7OwotCSAgOjopIGRsbHNlYXJjaHBhdGg9JHRlc3RiaW5kaXI7OwotCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JHRlc3RiaW5kaXIiOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KLSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgotCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotICAgICAgZmkKLSAgICAgIGNvbXBpbGVfcnBhdGg9IiRycGF0aCIKLQotICAgICAgcnBhdGg9Ci0gICAgICBoYXJkY29kZV9saWJkaXJzPQotICAgICAgZm9yIGxpYmRpciBpbiAkZmluYWxpemVfcnBhdGg7IGRvCi0JaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkgICAgZWxzZQotCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgotCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKLQkJOzsKLQkgICAgICAqKQotCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKLQkgIGZpCi0JZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JICBjYXNlICIkZmluYWxpemVfcGVybV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgZmluYWxpemVfcGVybV9ycGF0aD0iJGZpbmFsaXplX3Blcm1fcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotICAgICAgZG9uZQotICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KLSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgotCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotICAgICAgZmkKLSAgICAgIGZpbmFsaXplX3JwYXRoPSIkcnBhdGgiCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRsaWJvYmpzIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JIyBUcmFuc2Zvcm0gYWxsIHRoZSBsaWJyYXJ5IG9iamVjdHMgaW50byBzdGFuZGFyZCBvYmplY3RzLgotCWNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFNFRCAiJGxvMm8iIHwgJE5MMlNQYAotCWZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICIkZmluYWxpemVfY29tbWFuZCIgfCAkU1AyTkwgfCAkU0VEICIkbG8ybyIgfCAkTkwyU1BgCi0gICAgICBmaQotCi0gICAgICBmdW5jX2dlbmVyYXRlX2Rsc3ltcyAiJG91dHB1dG5hbWUiICJAUFJPR1JBTUAiICJubyIKLQotICAgICAgIyB0ZW1wbGF0ZSBwcmVsaW5raW5nIHN0ZXAKLSAgICAgIGlmIHRlc3QgLW4gIiRwcmVsaW5rX2NtZHMiOyB0aGVuCi0JZnVuY19leGVjdXRlX2NtZHMgIiRwcmVsaW5rX2NtZHMiICdleGl0ICQ/JwotICAgICAgZmkKLQotICAgICAgd3JhcHBlcnNfcmVxdWlyZWQ9eWVzCi0gICAgICBjYXNlICRob3N0IGluCi0gICAgICAqY2VnY2MqIHwgKm1pbmd3MzJjZSopCi0gICAgICAgICMgRGlzYWJsZSB3cmFwcGVycyBmb3IgY2VnY2MgYW5kIG1pbmd3MzJjZSBob3N0cywgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyBhbnl3YXkuCi0gICAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPW5vCi0gICAgICAgIDs7Ci0gICAgICAqY3lnd2luKiB8ICptaW5ndyogKQotICAgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KLSAgICAgICAgICB3cmFwcGVyc19yZXF1aXJlZD1ubwotICAgICAgICBmaQotICAgICAgICA7OwotICAgICAgKikKLSAgICAgICAgaWYgdGVzdCAiJG5lZWRfcmVsaW5rIiA9IG5vIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotICAgICAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPW5vCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICBpZiB0ZXN0ICIkd3JhcHBlcnNfcmVxdWlyZWQiID0gbm87IHRoZW4KLQkjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0JY29tcGlsZV9jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfY29tbWFuZCIgfCAkU0VEICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAotCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCi0JIyBXZSBoYXZlIG5vIHVuaW5zdGFsbGVkIGxpYnJhcnkgZGVwZW5kZW5jaWVzLCBzbyBmaW5hbGl6ZSByaWdodCBub3cuCi0JZXhpdF9zdGF0dXM9MAotCWZ1bmNfc2hvd19ldmFsICIkbGlua19jb21tYW5kIiAnZXhpdF9zdGF0dXM9JD8nCi0KLQkjIERlbGV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzLgotCWlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSI7IHRoZW4KLQkgIGZ1bmNfc2hvd19ldmFsICckUk0gIiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSInCi0JZmkKLQotCWV4aXQgJGV4aXRfc3RhdHVzCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgotCWNvbXBpbGVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRjb21waWxlX2NvbW1hbmQiCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAtbiAiJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KLQlmaW5hbGl6ZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGZpbmFsaXplX2NvbW1hbmQiCi0gICAgICBmaQotCi0gICAgICBjb21waWxlX3Zhcj0KLSAgICAgIGZpbmFsaXplX3Zhcj0KLSAgICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KLQkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCi0JICBycGF0aD0KLQkgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCi0JICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLQkgIGRvbmUKLQkgIGNvbXBpbGVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKLQlmaQotCWlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9wZXJtX3JwYXRoIjsgdGhlbgotCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KLQkgIHJwYXRoPQotCSAgZm9yIGRpciBpbiAkZmluYWxpemVfcGVybV9ycGF0aDsgZG8KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgZG9uZQotCSAgZmluYWxpemVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5vX2luc3RhbGwiID0geWVzOyB0aGVuCi0JIyBXZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhIHdyYXBwZXIgc2NyaXB0LgotCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLQlsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkbGlua19jb21tYW5kIiB8ICRTRUQgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCi0JIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KLQkkb3B0X2RyeV9ydW4gfHwgJFJNICRvdXRwdXQKLQkjIExpbmsgdGhlIGV4ZWN1dGFibGUgYW5kIGV4aXQKLQlmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXQgJD8nCi0JZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgotCSMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAotCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCXJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCi0KLQlmdW5jX3dhcm5pbmcgInRoaXMgcGxhdGZvcm0gZG9lcyBub3QgbGlrZSB1bmluc3RhbGxlZCBzaGFyZWQgbGlicmFyaWVzIgotCWZ1bmNfd2FybmluZyAiXGAkb3V0cHV0JyB3aWxsIGJlIHJlbGlua2VkIGR1cmluZyBpbnN0YWxsYXRpb24iCi0gICAgICBlbHNlCi0JaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgIT0gbm87IHRoZW4KLQkgIGxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRjb21waWxlX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCi0JICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgotCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIgfCAkU0VEICdzJUBPVVRQVVRAJVwkcHJvZ2Rpci9cJGZpbGUlZydgCi0JICBlbHNlCi0JICAgICMgZmFzdF9pbnN0YWxsIGlzIHNldCB0byBuZWVkbGVzcwotCSAgICByZWxpbmtfY29tbWFuZD0KLQkgIGZpCi0JZWxzZQotCSAgbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCi0JICByZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0gICAgICBsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkbGlua19jb21tYW5kIiB8ICRTRUQgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSInJWcnYAotCi0gICAgICAjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlcy4KLSAgICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJG91dHB1dCAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSAkb3V0cHV0X29iamRpci9sdC0kb3V0cHV0bmFtZQotCi0gICAgICBmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXQgJD8nCi0KLSAgICAgICMgTm93IGNyZWF0ZSB0aGUgd3JhcHBlciBzY3JpcHQuCi0gICAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nICRvdXRwdXQiCi0KLSAgICAgICMgUXVvdGUgdGhlIHJlbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQkjIFByZXNlcnZlIGFueSB2YXJpYWJsZXMgdGhhdCBtYXkgYWZmZWN0IGNvbXBpbGVyIGJlaGF2aW9yCi0JZm9yIHZhciBpbiAkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms7IGRvCi0JICBpZiBldmFsIHRlc3QgLXogXCJcJHskdmFyK3NldH1cIjsgdGhlbgotCSAgICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgJGx0X3Vuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKLQkgIGVsaWYgZXZhbCB2YXJfdmFsdWU9XCQkdmFyOyB0ZXN0IC16ICIkdmFyX3ZhbHVlIjsgdGhlbgotCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj07IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCi0JICBlbHNlCi0JICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiR2YXJfdmFsdWUiCi0JICAgIHJlbGlua19jb21tYW5kPSIkdmFyPSRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdDsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKLQkgIGZpCi0JZG9uZQotCXJlbGlua19jb21tYW5kPSIoY2QgYHB3ZGA7ICRyZWxpbmtfY29tbWFuZCkiCi0JcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBmaQotCi0gICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG5vdCBpbiBkcnkgcnVuIG1vZGUuCi0gICAgICAkb3B0X2RyeV9ydW4gfHwgewotCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcwotCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCi0JY2FzZSAkb3V0cHV0IGluCi0JICAqLmV4ZSkgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkb3V0cHV0IgotCSAgICAgICAgIG91dHB1dD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7Ci0JZXNhYwotCSMgdGVzdCBmb3IgY3lnd2luIGJlY2F1c2UgbXYgZmFpbHMgdy9vIC5leGUgZXh0ZW5zaW9ucwotCWNhc2UgJGhvc3QgaW4KLQkgICpjeWd3aW4qKQotCSAgICBleGVleHQ9LmV4ZQotCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRvdXRwdXRuYW1lIgotCSAgICBvdXRwdXRuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKLQkgICopIGV4ZWV4dD0gOzsKLQllc2FjCi0JY2FzZSAkaG9zdCBpbgotCSAgKmN5Z3dpbiogfCAqbWluZ3cqICkKLQkgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJG91dHB1dCIgIiIgIi4iCi0JICAgIG91dHB1dF9uYW1lPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAotCSAgICBvdXRwdXRfcGF0aD0kZnVuY19kaXJuYW1lX3Jlc3VsdAotCSAgICBjd3JhcHBlcnNvdXJjZT0iJG91dHB1dF9wYXRoLyRvYmpkaXIvbHQtJG91dHB1dF9uYW1lLmMiCi0JICAgIGN3cmFwcGVyPSIkb3V0cHV0X3BhdGgvJG91dHB1dF9uYW1lLmV4ZSIKLQkgICAgJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXIKLQkgICAgdHJhcCAiJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXI7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1Ci0KLQkgICAgZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYyA+ICRjd3JhcHBlcnNvdXJjZQotCi0JICAgICMgVGhlIHdyYXBwZXIgZXhlY3V0YWJsZSBpcyBidWlsdCB1c2luZyB0aGUgJGhvc3QgY29tcGlsZXIsCi0JICAgICMgYmVjYXVzZSBpdCBjb250YWlucyAkaG9zdCBwYXRocyBhbmQgZmlsZXMuIElmIGNyb3NzLQotCSAgICAjIGNvbXBpbGluZywgaXQsIGxpa2UgdGhlIHRhcmdldCBleGVjdXRhYmxlLCBtdXN0IGJlCi0JICAgICMgZXhlY3V0ZWQgb24gdGhlICRob3N0IG9yIHVuZGVyIGFuIGVtdWxhdGlvbiBlbnZpcm9ubWVudC4KLQkgICAgJG9wdF9kcnlfcnVuIHx8IHsKLQkgICAgICAkTFRDQyAkTFRDRkxBR1MgLW8gJGN3cmFwcGVyICRjd3JhcHBlcnNvdXJjZQotCSAgICAgICRTVFJJUCAkY3dyYXBwZXIKLQkgICAgfQotCi0JICAgICMgTm93LCBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0IGZvciBmdW5jX3NvdXJjZSB1c2U6Ci0JICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgJGN3cmFwcGVyCi0JICAgICRSTSAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKLQkgICAgdHJhcCAiJFJNICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKLQkgICAgJG9wdF9kcnlfcnVuIHx8IHsKLQkgICAgICAjIG5vdGU6IHRoaXMgc2NyaXB0IHdpbGwgbm90IGJlIGV4ZWN1dGVkLCBzbyBkbyBub3QgY2htb2QuCi0JICAgICAgaWYgdGVzdCAieCRidWlsZCIgPSAieCRob3N0IiA7IHRoZW4KLQkJJGN3cmFwcGVyIC0tbHQtZHVtcC1zY3JpcHQgPiAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKLQkgICAgICBlbHNlCi0JCWZ1bmNfZW1pdF93cmFwcGVyIG5vID4gJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0Ci0JICAgICAgZmkKLQkgICAgfQotCSAgOzsKLQkgICogKQotCSAgICAkUk0gJG91dHB1dAotCSAgICB0cmFwICIkUk0gJG91dHB1dDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKLQotCSAgICBmdW5jX2VtaXRfd3JhcHBlciBubyA+ICRvdXRwdXQKLQkgICAgY2htb2QgK3ggJG91dHB1dAotCSAgOzsKLQllc2FjCi0gICAgICB9Ci0gICAgICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCi0gICAgZm9yIG9sZGxpYiBpbiAkb2xkbGliczsgZG8KLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBjb252ZW5pZW5jZTsgdGhlbgotCW9sZG9ianM9IiRsaWJvYmpzX3NhdmUgJHN5bWZpbGVvYmoiCi0JYWRkbGlicz0iJGNvbnZlbmllbmNlIgotCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotICAgICAgZWxzZQotCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbW9kdWxlOyB0aGVuCi0JICBvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgotCSAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JZWxzZQotCSAgb2xkb2Jqcz0iJG9sZF9kZXBsaWJzICRub25fcGljX29iamVjdHMiCi0JICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXMgJiYgdGVzdCAtZiAiJHN5bWZpbGVvYmoiOyB0aGVuCi0JICAgIG9sZG9ianM9IiRvbGRvYmpzICRzeW1maWxlb2JqIgotCSAgZmkKLQlmaQotCWFkZGxpYnM9IiRvbGRfY29udmVuaWVuY2UiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkYWRkbGlicyI7IHRoZW4KLQlnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgotCWdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCi0JZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGFkZGxpYnMKLQlvbGRvYmpzPSIkb2xkb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKLSAgICAgIGZpCi0KLSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgotICAgICAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JY21kcz0kb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcwotICAgICAgZWxzZQotCi0JIyBBZGQgYW55IG9iamVjdHMgZnJvbSBwcmVsb2FkZWQgY29udmVuaWVuY2UgbGlicmFyaWVzCi0JaWYgdGVzdCAtbiAiJGRscHJlZmlsZXMiOyB0aGVuCi0JICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgotCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCi0KLQkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRkbHByZWZpbGVzCi0JICBvbGRvYmpzPSIkb2xkb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKLQlmaQotCi0JIyBQT1NJWCBkZW1hbmRzIG5vIHBhdGhzIHRvIGJlIGVuY29kZWQgaW4gYXJjaGl2ZXMuICBXZSBoYXZlCi0JIyB0byBhdm9pZCBjcmVhdGluZyBhcmNoaXZlcyB3aXRoIGR1cGxpY2F0ZSBiYXNlbmFtZXMgaWYgd2UKLQkjIG1pZ2h0IGhhdmUgdG8gZXh0cmFjdCB0aGVtIGFmdGVyd2FyZHMsIGUuZy4sIHdoZW4gY3JlYXRpbmcgYQotCSMgc3RhdGljIGFyY2hpdmUgb3V0IG9mIGEgY29udmVuaWVuY2UgbGlicmFyeSwgb3Igd2hlbiBsaW5raW5nCi0JIyB0aGUgZW50aXJldHkgb2YgYSBsaWJ0b29sIGFyY2hpdmUgaW50byBhbm90aGVyIChjdXJyZW50bHkKLQkjIG5vdCBzdXBwb3J0ZWQgYnkgbGlidG9vbCkuCi0JaWYgKGZvciBvYmogaW4gJG9sZG9ianMKLQkgICAgZG8KLQkgICAgICBmdW5jX2Jhc2VuYW1lICIkb2JqIgotCSAgICAgICRFQ0hPICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0JICAgIGRvbmUgfCBzb3J0IHwgc29ydCAtdWMgPi9kZXYvbnVsbCAyPiYxKTsgdGhlbgotCSAgOgotCWVsc2UKLQkgIGVjaG8gImNvcHlpbmcgc2VsZWN0ZWQgb2JqZWN0IGZpbGVzIHRvIGF2b2lkIGJhc2VuYW1lIGNvbmZsaWN0cy4uLiIKLQkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCi0JICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKLQkgIGZ1bmNfbWtkaXJfcCAiJGdlbnRvcCIKLQkgIHNhdmVfb2xkb2Jqcz0kb2xkb2JqcwotCSAgb2xkb2Jqcz0KLQkgIGNvdW50ZXI9MQotCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCi0JICBkbwotCSAgICBmdW5jX2Jhc2VuYW1lICIkb2JqIgotCSAgICBvYmpiYXNlPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0JICAgIGNhc2UgIiAkb2xkb2JqcyAiIGluCi0JICAgICIgIikgb2xkb2Jqcz0kb2JqIDs7Ci0JICAgICpbXCAvXSIkb2JqYmFzZSAiKikKLQkgICAgICB3aGlsZSA6OyBkbwotCQkjIE1ha2Ugc3VyZSB3ZSBkb24ndCBwaWNrIGFuIGFsdGVybmF0ZSBuYW1lIHRoYXQgYWxzbwotCQkjIG92ZXJsYXBzLgotCQluZXdvYmo9bHQkY291bnRlci0kb2JqYmFzZQotCQlmdW5jX2FyaXRoICRjb3VudGVyICsgMQotCQljb3VudGVyPSRmdW5jX2FyaXRoX3Jlc3VsdAotCQljYXNlICIgJG9sZG9ianMgIiBpbgotCQkqW1wgL10iJG5ld29iaiAiKikgOzsKLQkJKikgaWYgdGVzdCAhIC1mICIkZ2VudG9wLyRuZXdvYmoiOyB0aGVuIGJyZWFrOyBmaSA7OwotCQllc2FjCi0JICAgICAgZG9uZQotCSAgICAgIGZ1bmNfc2hvd19ldmFsICJsbiAkb2JqICRnZW50b3AvJG5ld29iaiB8fCBjcCAkb2JqICRnZW50b3AvJG5ld29iaiIKLQkgICAgICBvbGRvYmpzPSIkb2xkb2JqcyAkZ2VudG9wLyRuZXdvYmoiCi0JICAgICAgOzsKLQkgICAgKikgb2xkb2Jqcz0iJG9sZG9ianMgJG9iaiIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgotCi0JZnVuY19sZW4gIiAkY21kcyIKLQlsZW49JGZ1bmNfbGVuX3Jlc3VsdAotCWlmIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgotCSAgY21kcz0kb2xkX2FyY2hpdmVfY21kcwotCWVsc2UKLQkgICMgdGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBsaW5rIGluIG9uZSBzdGVwLCBsaW5rIGluIHBhcnRzCi0JICBmdW5jX3ZlcmJvc2UgInVzaW5nIHBpZWNld2lzZSBhcmNoaXZlIGxpbmtpbmcuLi4iCi0JICBzYXZlX1JBTkxJQj0kUkFOTElCCi0JICBSQU5MSUI9OgotCSAgb2JqbGlzdD0KLQkgIGNvbmNhdF9jbWRzPQotCSAgc2F2ZV9vbGRvYmpzPSRvbGRvYmpzCi0JICBvbGRvYmpzPQotCSAgIyBJcyB0aGVyZSBhIGJldHRlciB3YXkgb2YgZmluZGluZyB0aGUgbGFzdCBvYmplY3QgaW4gdGhlIGxpc3Q/Ci0JICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKLQkgIGRvCi0JICAgIGxhc3Rfb2xkb2JqPSRvYmoKLQkgIGRvbmUKLQkgIGV2YWwgdGVzdF9jbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgotCSAgZnVuY19sZW4gIiAkdGVzdF9jbWRzIgotCSAgbGVuMD0kZnVuY19sZW5fcmVzdWx0Ci0JICBsZW49JGxlbjAKLQkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcwotCSAgZG8KLQkgICAgZnVuY19sZW4gIiAkb2JqIgotCSAgICBmdW5jX2FyaXRoICRsZW4gKyAkZnVuY19sZW5fcmVzdWx0Ci0JICAgIGxlbj0kZnVuY19hcml0aF9yZXN1bHQKLQkgICAgZnVuY19hcHBlbmQgb2JqbGlzdCAiICRvYmoiCi0JICAgIGlmIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIjsgdGhlbgotCSAgICAgIDoKLQkgICAgZWxzZQotCSAgICAgICMgdGhlIGFib3ZlIGNvbW1hbmQgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIGl0IGdldHMgdG9vIGxvbmcKLQkgICAgICBvbGRvYmpzPSRvYmpsaXN0Ci0JICAgICAgaWYgdGVzdCAiJG9iaiIgPSAiJGxhc3Rfb2xkb2JqIiA7IHRoZW4KLQkJUkFOTElCPSRzYXZlX1JBTkxJQgotCSAgICAgIGZpCi0JICAgICAgdGVzdCAteiAiJGNvbmNhdF9jbWRzIiB8fCBjb25jYXRfY21kcz0kY29uY2F0X2NtZHN+Ci0JICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfSRvbGRfYXJjaGl2ZV9jbWRzXCIKLQkgICAgICBvYmpsaXN0PQotCSAgICAgIGxlbj0kbGVuMAotCSAgICBmaQotCSAgZG9uZQotCSAgUkFOTElCPSRzYXZlX1JBTkxJQgotCSAgb2xkb2Jqcz0kb2JqbGlzdAotCSAgaWYgdGVzdCAiWCRvbGRvYmpzIiA9ICJYIiA7IHRoZW4KLQkgICAgZXZhbCBjbWRzPVwiXCRjb25jYXRfY21kc1wiCi0JICBlbHNlCi0JICAgIGV2YWwgY21kcz1cIlwkY29uY2F0X2NtZHN+XCRvbGRfYXJjaGl2ZV9jbWRzXCIKLQkgIGZpCi0JZmkKLSAgICAgIGZpCi0gICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJGNtZHMiICdleGl0ICQ/JwotICAgIGRvbmUKLQotICAgIHRlc3QgLW4gIiRnZW5lcmF0ZWQiICYmIFwKLSAgICAgIGZ1bmNfc2hvd19ldmFsICIke1JNfXIkZ2VuZXJhdGVkIgotCi0gICAgIyBOb3cgY3JlYXRlIHRoZSBsaWJ0b29sIGFyY2hpdmUuCi0gICAgY2FzZSAkb3V0cHV0IGluCi0gICAgKi5sYSkKLSAgICAgIG9sZF9saWJyYXJ5PQotICAgICAgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiBvbGRfbGlicmFyeT0iJGxpYm5hbWUuJGxpYmV4dCIKLSAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgJG91dHB1dCIKLQotICAgICAgIyBQcmVzZXJ2ZSBhbnkgdmFyaWFibGVzIHRoYXQgbWF5IGFmZmVjdCBjb21waWxlciBiZWhhdmlvcgotICAgICAgZm9yIHZhciBpbiAkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms7IGRvCi0JaWYgZXZhbCB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCI7IHRoZW4KLQkgIHJlbGlua19jb21tYW5kPSJ7IHRlc3QgLXogXCJcJHskdmFyK3NldH1cIiB8fCAkbHRfdW5zZXQgJHZhciB8fCB7ICR2YXI9OyBleHBvcnQgJHZhcjsgfTsgfTsgJHJlbGlua19jb21tYW5kIgotCWVsaWYgZXZhbCB2YXJfdmFsdWU9XCQkdmFyOyB0ZXN0IC16ICIkdmFyX3ZhbHVlIjsgdGhlbgotCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgotCWVsc2UKLQkgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiR2YXJfdmFsdWUiCi0JICByZWxpbmtfY29tbWFuZD0iJHZhcj0kZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgICMgUXVvdGUgdGhlIGxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCi0gICAgICByZWxpbmtfY29tbWFuZD0iKGNkIGBwd2RgOyAkU0hFTEwgJHByb2dwYXRoICRwcmVzZXJ2ZV9hcmdzIC0tbW9kZT1yZWxpbmsgJGxpYnRvb2xfYXJncyBAaW5zdF9wcmVmaXhfZGlyQCkiCi0gICAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIiRyZWxpbmtfY29tbWFuZCIgfCAkU0VEICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hdXRvbWF0aWMiID0geWVzIDsgdGhlbgotCXJlbGlua19jb21tYW5kPQotICAgICAgZmkKLQotICAgICAgIyBPbmx5IGNyZWF0ZSB0aGUgb3V0cHV0IGlmIG5vdCBhIGRyeSBydW4uCi0gICAgICAkb3B0X2RyeV9ydW4gfHwgewotCWZvciBpbnN0YWxsZWQgaW4gbm8geWVzOyBkbwotCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGluc3RhbGxfbGliZGlyIjsgdGhlbgotCSAgICAgIGJyZWFrCi0JICAgIGZpCi0JICAgIG91dHB1dD0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiaQotCSAgICAjIFJlcGxhY2UgYWxsIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzIHdpdGggdGhlIGluc3RhbGxlZCBvbmVzCi0JICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KLQkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICAgIGNhc2UgJGRlcGxpYiBpbgotCSAgICAgICoubGEpCi0JCWZ1bmNfYmFzZW5hbWUgIiRkZXBsaWIiCi0JCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKLQkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAotCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGRlcGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgotCQluZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGxpYmRpci8kbmFtZSIKLQkJOzsKLQkgICAgICAqKSBuZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGRlcGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgIGRvbmUKLQkgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgICBuZXdkbGZpbGVzPQotCi0JICAgIGZvciBsaWIgaW4gJGRsZmlsZXM7IGRvCi0JICAgICAgY2FzZSAkbGliIGluCi0JICAgICAgKi5sYSkKLQkgICAgICAgIGZ1bmNfYmFzZW5hbWUgIiRsaWIiCi0JCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKLQkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAotCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgotCQluZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliZGlyLyRuYW1lIgotCQk7OwotCSAgICAgICopIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBkb25lCi0JICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgotCSAgICBuZXdkbHByZWZpbGVzPQotCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbwotCSAgICAgIGNhc2UgJGxpYiBpbgotCSAgICAgICoubGEpCi0JCSMgT25seSBwYXNzIHByZW9wZW5lZCBmaWxlcyB0byB0aGUgcHNldWRvLWFyY2hpdmUgKGZvcgotCQkjIGV2ZW50dWFsIGxpbmtpbmcgd2l0aCB0aGUgYXBwLiB0aGF0IGxpbmtzIGl0KSBpZiB3ZQotCQkjIGRpZG4ndCBhbHJlYWR5IGxpbmsgdGhlIHByZW9wZW5lZCBvYmplY3RzIGRpcmVjdGx5IGludG8KLQkJIyB0aGUgbGlicmFyeToKLQkJZnVuY19iYXNlbmFtZSAiJGxpYiIKLQkJbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotCQlldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkbGliYAotCQl0ZXN0IC16ICIkbGliZGlyIiAmJiBcCi0JCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCi0JCW5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRsaWJkaXIvJG5hbWUiCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICBkb25lCi0JICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgotCSAgZWxzZQotCSAgICBuZXdkbGZpbGVzPQotCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbwotCSAgICAgIGNhc2UgJGxpYiBpbgotCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKLQkJKikgYWJzPWBwd2RgIi8kbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkYWJzIgotCSAgICBkb25lCi0JICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgotCSAgICBuZXdkbHByZWZpbGVzPQotCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbwotCSAgICAgIGNhc2UgJGxpYiBpbgotCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKLQkJKikgYWJzPWBwd2RgIi8kbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkYWJzIgotCSAgICBkb25lCi0JICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgotCSAgZmkKLQkgICRSTSAkb3V0cHV0Ci0JICAjIHBsYWNlIGRsbmFtZSBpbiBjb3JyZWN0IHBvc2l0aW9uIGZvciBjeWd3aW4KLQkgICMgSW4gZmFjdCwgaXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCB1c2UgdGhpcyBjb2RlIGZvciBhbGwgdGFyZ2V0Ci0JICAjIHN5c3RlbXMgdGhhdCBjYW4ndCBoYXJkLWNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHRoZWlyIGV4ZWN1dGFibGVzCi0JICAjIGFuZCB0aGF0IGhhdmUgbm8gc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZSBpbmRlcGVuZGVudCBvZiBQQVRILAotCSAgIyBidXQgaXQgdHVybnMgb3V0IHdlIGNhbid0IGVhc2lseSBkZXRlcm1pbmUgdGhhdCBmcm9tIGluc3BlY3RpbmcKLQkgICMgbGlidG9vbCB2YXJpYWJsZXMsIHNvIHdlIGhhdmUgdG8gaGFyZC1jb2RlIHRoZSBPU3MgdG8gd2hpY2ggaXQKLQkgICMgYXBwbGllcyBoZXJlOyBhdCB0aGUgbW9tZW50LCB0aGF0IG1lYW5zIHBsYXRmb3JtcyB0aGF0IHVzZSB0aGUgUEUKLQkgICMgb2JqZWN0IGZvcm1hdCB3aXRoIERMTCBmaWxlcy4gIFNlZSB0aGUgbG9uZyBjb21tZW50IGF0IHRoZSB0b3Agb2YKLQkgICMgdGVzdHMvYmluZGlyLmF0IGZvciBmdWxsIGRldGFpbHMuCi0JICB0ZGxuYW1lPSRkbG5hbWUKLQkgIGNhc2UgJGhvc3QsJG91dHB1dCwkaW5zdGFsbGVkLCRtb2R1bGUsJGRsbmFtZSBpbgotCSAgICAqY3lnd2luKiwqbGFpLHllcyxubywqLmRsbCB8ICptaW5ndyosKmxhaSx5ZXMsbm8sKi5kbGwgfCAqY2VnY2MqLCpsYWkseWVzLG5vLCouZGxsKQotCSAgICAgICMgSWYgYSAtYmluZGlyIGFyZ3VtZW50IHdhcyBzdXBwbGllZCwgcGxhY2UgdGhlIGRsbCB0aGVyZS4KLQkgICAgICBpZiB0ZXN0ICJ4JGJpbmRpciIgIT0geCA7Ci0JICAgICAgdGhlbgotCQlmdW5jX3JlbGF0aXZlX3BhdGggIiRpbnN0YWxsX2xpYmRpciIgIiRiaW5kaXIiCi0JCXRkbG5hbWU9JGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQkZGxuYW1lCi0JICAgICAgZWxzZQotCQkjIE90aGVyd2lzZSBmYWxsIGJhY2sgb24gaGV1cmlzdGljLgotCQl0ZGxuYW1lPS4uL2Jpbi8kZGxuYW1lCi0JICAgICAgZmkKLQkgICAgICA7OwotCSAgZXNhYwotCSAgJEVDSE8gPiAkb3V0cHV0ICJcCi0jICRvdXRwdXRuYW1lIC0gYSBsaWJ0b29sIGxpYnJhcnkgZmlsZQotIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OCi0jCi0jIFBsZWFzZSBETyBOT1QgZGVsZXRlIHRoaXMgZmlsZSEKLSMgSXQgaXMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHRoZSBsaWJyYXJ5LgotCi0jIFRoZSBuYW1lIHRoYXQgd2UgY2FuIGRsb3BlbigzKS4KLWRsbmFtZT0nJHRkbG5hbWUnCi0KLSMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgotbGlicmFyeV9uYW1lcz0nJGxpYnJhcnlfbmFtZXMnCi0KLSMgVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhcmNoaXZlLgotb2xkX2xpYnJhcnk9JyRvbGRfbGlicmFyeScKLQotIyBMaW5rZXIgZmxhZ3MgdGhhdCBjYW4gbm90IGdvIGluIGRlcGVuZGVuY3lfbGlicy4KLWluaGVyaXRlZF9saW5rZXJfZmxhZ3M9JyRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncycKLQotIyBMaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCi1kZXBlbmRlbmN5X2xpYnM9JyRkZXBlbmRlbmN5X2xpYnMnCi0KLSMgTmFtZXMgb2YgYWRkaXRpb25hbCB3ZWFrIGxpYnJhcmllcyBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkKLXdlYWtfbGlicmFyeV9uYW1lcz0nJHdlYWtfbGlicycKLQotIyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciAkbGlibmFtZS4KLWN1cnJlbnQ9JGN1cnJlbnQKLWFnZT0kYWdlCi1yZXZpc2lvbj0kcmV2aXNpb24KLQotIyBJcyB0aGlzIGFuIGFscmVhZHkgaW5zdGFsbGVkIGxpYnJhcnk/Ci1pbnN0YWxsZWQ9JGluc3RhbGxlZAotCi0jIFNob3VsZCB3ZSB3YXJuIGFib3V0IHBvcnRhYmlsaXR5IHdoZW4gbGlua2luZyBhZ2FpbnN0IC1tb2R1bGVzPwotc2hvdWxkbm90bGluaz0kbW9kdWxlCi0KLSMgRmlsZXMgdG8gZGxvcGVuL2RscHJlb3BlbgotZGxvcGVuPSckZGxmaWxlcycKLWRscHJlb3Blbj0nJGRscHJlZmlsZXMnCi0KLSMgRGlyZWN0b3J5IHRoYXQgdGhpcyBsaWJyYXJ5IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBpbjoKLWxpYmRpcj0nJGluc3RhbGxfbGliZGlyJyIKLQkgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0gbm8gJiYgdGVzdCAiJG5lZWRfcmVsaW5rIiA9IHllczsgdGhlbgotCSAgICAkRUNITyA+PiAkb3V0cHV0ICJcCi1yZWxpbmtfY29tbWFuZD1cIiRyZWxpbmtfY29tbWFuZFwiIgotCSAgZmkKLQlkb25lCi0gICAgICB9Ci0KLSAgICAgICMgRG8gYSBzeW1ib2xpYyBsaW5rIHNvIHRoYXQgdGhlIGxpYnRvb2wgYXJjaGl2ZSBjYW4gYmUgZm91bmQgaW4KLSAgICAgICMgTERfTElCUkFSWV9QQVRIIGJlZm9yZSB0aGUgcHJvZ3JhbSBpcyBpbnN0YWxsZWQuCi0gICAgICBmdW5jX3Nob3dfZXZhbCAnKCBjZCAiJG91dHB1dF9vYmpkaXIiICYmICRSTSAiJG91dHB1dG5hbWUiICYmICRMTl9TICIuLi8kb3V0cHV0bmFtZSIgIiRvdXRwdXRuYW1lIiApJyAnZXhpdCAkPycKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotfQotCi17IHRlc3QgIiRtb2RlIiA9IGxpbmsgfHwgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB9ICYmCi0gICAgZnVuY19tb2RlX2xpbmsgJHsxKyIkQCJ9Ci0KLQotIyBmdW5jX21vZGVfdW5pbnN0YWxsIGFyZy4uLgotZnVuY19tb2RlX3VuaW5zdGFsbCAoKQotewotICAgICRvcHRfZGVidWcKLSAgICBSTT0iJG5vbm9wdCIKLSAgICBmaWxlcz0KLSAgICBybWZvcmNlPQotICAgIGV4aXRfc3RhdHVzPTAKLQotICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgotICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgotCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1mKSBSTT0iJFJNICRhcmciOyBybWZvcmNlPXllcyA7OwotICAgICAgLSopIFJNPSIkUk0gJGFyZyIgOzsKLSAgICAgICopIGZpbGVzPSIkZmlsZXMgJGFyZyIgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICB0ZXN0IC16ICIkUk0iICYmIFwKLSAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhbiBSTSBwcm9ncmFtIgotCi0gICAgcm1kaXJzPQotCi0gICAgb3JpZ29iamRpcj0iJG9iamRpciIKLSAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0gICAgICBmdW5jX2Rpcm5hbWUgIiRmaWxlIiAiIiAiLiIKLSAgICAgIGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCi0gICAgICBpZiB0ZXN0ICJYJGRpciIgPSBYLjsgdGhlbgotCW9iamRpcj0iJG9yaWdvYmpkaXIiCi0gICAgICBlbHNlCi0Jb2JqZGlyPSIkZGlyLyRvcmlnb2JqZGlyIgotICAgICAgZmkKLSAgICAgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgotICAgICAgbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotICAgICAgdGVzdCAiJG1vZGUiID0gdW5pbnN0YWxsICYmIG9iamRpcj0iJGRpciIKLQotICAgICAgIyBSZW1lbWJlciBvYmpkaXIgZm9yIHJlbW92YWwgbGF0ZXIsIGJlaW5nIGNhcmVmdWwgdG8gYXZvaWQgZHVwbGljYXRlcwotICAgICAgaWYgdGVzdCAiJG1vZGUiID0gY2xlYW47IHRoZW4KLQljYXNlICIgJHJtZGlycyAiIGluCi0JICAqIiAkb2JqZGlyICIqKSA7OwotCSAgKikgcm1kaXJzPSIkcm1kaXJzICRvYmpkaXIiIDs7Ci0JZXNhYwotICAgICAgZmkKLQotICAgICAgIyBEb24ndCBlcnJvciBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IGFuZCBybSAtZiB3YXMgdXNlZC4KLSAgICAgIGlmIHsgdGVzdCAtTCAiJGZpbGUiOyB9ID4vZGV2L251bGwgMj4mMSB8fAotCSB7IHRlc3QgLWggIiRmaWxlIjsgfSA+L2Rldi9udWxsIDI+JjEgfHwKLQkgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCi0JOgotICAgICAgZWxpZiB0ZXN0IC1kICIkZmlsZSI7IHRoZW4KLQlleGl0X3N0YXR1cz0xCi0JY29udGludWUKLSAgICAgIGVsaWYgdGVzdCAiJHJtZm9yY2UiID0geWVzOyB0aGVuCi0JY29udGludWUKLSAgICAgIGZpCi0KLSAgICAgIHJtZmlsZXM9IiRmaWxlIgotCi0gICAgICBjYXNlICRuYW1lIGluCi0gICAgICAqLmxhKQotCSMgUG9zc2libHkgYSBsaWJ0b29sIGFyY2hpdmUsIHNvIHZlcmlmeSBpdC4KLQlpZiBmdW5jX2xhbGliX3AgIiRmaWxlIjsgdGhlbgotCSAgZnVuY19zb3VyY2UgJGRpci8kbmFtZQotCi0JICAjIERlbGV0ZSB0aGUgbGlidG9vbCBsaWJyYXJpZXMgYW5kIHN5bWxpbmtzLgotCSAgZm9yIG4gaW4gJGxpYnJhcnlfbmFtZXM7IGRvCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG4iCi0JICBkb25lCi0JICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG9sZF9saWJyYXJ5IgotCi0JICBjYXNlICIkbW9kZSIgaW4KLQkgIGNsZWFuKQotCSAgICBjYXNlICIgICRsaWJyYXJ5X25hbWVzICIgaW4KLQkgICAgIyAiICAiIGluIHRoZSBiZWdpbm5pbmcgY2F0Y2hlcyBlbXB0eSAkZGxuYW1lCi0JICAgICoiICRkbG5hbWUgIiopIDs7Ci0JICAgICopIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJGRsbmFtZSIgOzsKLQkgICAgZXNhYwotCSAgICB0ZXN0IC1uICIkbGliZGlyIiAmJiBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRuYW1lICRvYmpkaXIvJHtuYW1lfWkiCi0JICAgIDs7Ci0JICB1bmluc3RhbGwpCi0JICAgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgdGhlbgotCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgotCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcG9zdHVuaW5zdGFsbF9jbWRzIiAndGVzdCAiJHJtZm9yY2UiID0geWVzIHx8IGV4aXRfc3RhdHVzPTEnCi0JICAgIGZpCi0KLQkgICAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBvbGRfcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KLQkgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMiICd0ZXN0ICIkcm1mb3JjZSIgPSB5ZXMgfHwgZXhpdF9zdGF0dXM9MScKLQkgICAgZmkKLQkgICAgIyBGSVhNRTogc2hvdWxkIHJlaW5zdGFsbCB0aGUgYmVzdCByZW1haW5pbmcgc2hhcmVkIGxpYnJhcnkuCi0JICAgIDs7Ci0JICBlc2FjCi0JZmkKLQk7OwotCi0gICAgICAqLmxvKQotCSMgUG9zc2libHkgYSBsaWJ0b29sIG9iamVjdCwgc28gdmVyaWZ5IGl0LgotCWlmIGZ1bmNfbGFsaWJfcCAiJGZpbGUiOyB0aGVuCi0KLQkgICMgUmVhZCB0aGUgLmxvIGZpbGUKLQkgIGZ1bmNfc291cmNlICRkaXIvJG5hbWUKLQotCSAgIyBBZGQgUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCi0JICBpZiB0ZXN0IC1uICIkcGljX29iamVjdCIgJiYKLQkgICAgIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJHBpY19vYmplY3QiCi0JICBmaQotCi0JICAjIEFkZCBub24tUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCi0JICBpZiB0ZXN0IC1uICIkbm9uX3BpY19vYmplY3QiICYmCi0JICAgICB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kbm9uX3BpY19vYmplY3QiCi0JICBmaQotCWZpCi0JOzsKLQotICAgICAgKikKLQlpZiB0ZXN0ICIkbW9kZSIgPSBjbGVhbiA7IHRoZW4KLQkgIG5vZXhlbmFtZT0kbmFtZQotCSAgY2FzZSAkZmlsZSBpbgotCSAgKi5leGUpCi0JICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZpbGUiCi0JICAgIGZpbGU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRuYW1lIgotCSAgICBub2V4ZW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCSAgICAjICRmaWxlIHdpdGggLmV4ZSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHJtZmlsZXMsCi0JICAgICMgYWRkICRmaWxlIHdpdGhvdXQgLmV4ZQotCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZmlsZSIKLQkgICAgOzsKLQkgIGVzYWMKLQkgICMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIGEgbGlidG9vbCBwcm9ncmFtLgotCSAgaWYgZnVuY19sdHdyYXBwZXJfcCAiJGZpbGUiOyB0aGVuCi0JICAgIGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJGZpbGUiOyB0aGVuCi0JICAgICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZSAiJGZpbGUiCi0JICAgICAgcmVsaW5rX2NvbW1hbmQ9Ci0JICAgICAgZnVuY19zb3VyY2UgJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0Ci0JICAgICAgcm1maWxlcz0iJHJtZmlsZXMgJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0IgotCSAgICBlbHNlCi0JICAgICAgcmVsaW5rX2NvbW1hbmQ9Ci0JICAgICAgZnVuY19zb3VyY2UgJGRpci8kbm9leGVuYW1lCi0JICAgIGZpCi0KLQkgICAgIyBub3RlICRuYW1lIHN0aWxsIGNvbnRhaW5zIC5leGUgaWYgaXQgd2FzIGluICRmaWxlIG9yaWdpbmFsbHkKLQkgICAgIyBhcyBkb2VzIHRoZSB2ZXJzaW9uIG9mICRmaWxlIHRoYXQgd2FzIGFkZGVkIGludG8gJHJtZmlsZXMKLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbmFtZSAkb2JqZGlyLyR7bmFtZX1TLiR7b2JqZXh0fSIKLQkgICAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgotCSAgICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvbHQtJG5hbWUiCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgIlgkbm9leGVuYW1lIiAhPSAiWCRuYW1lIiA7IHRoZW4KLQkgICAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyL2x0LSR7bm9leGVuYW1lfS5jIgotCSAgICBmaQotCSAgZmkKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgICBmdW5jX3Nob3dfZXZhbCAiJFJNICRybWZpbGVzIiAnZXhpdF9zdGF0dXM9MScKLSAgICBkb25lCi0gICAgb2JqZGlyPSIkb3JpZ29iamRpciIKLQotICAgICMgVHJ5IHRvIHJlbW92ZSB0aGUgJHtvYmpkaXJ9cyBpbiB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgd2UgZGVsZXRlZCBmaWxlcwotICAgIGZvciBkaXIgaW4gJHJtZGlyczsgZG8KLSAgICAgIGlmIHRlc3QgLWQgIiRkaXIiOyB0aGVuCi0JZnVuY19zaG93X2V2YWwgInJtZGlyICRkaXIgPi9kZXYvbnVsbCAyPiYxIgotICAgICAgZmkKLSAgICBkb25lCi0KLSAgICBleGl0ICRleGl0X3N0YXR1cwotfQotCi17IHRlc3QgIiRtb2RlIiA9IHVuaW5zdGFsbCB8fCB0ZXN0ICIkbW9kZSIgPSBjbGVhbjsgfSAmJgotICAgIGZ1bmNfbW9kZV91bmluc3RhbGwgJHsxKyIkQCJ9Ci0KLXRlc3QgLXogIiRtb2RlIiAmJiB7Ci0gIGhlbHA9IiRnZW5lcmljX2hlbHAiCi0gIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIE1PREUiCi19Ci0KLXRlc3QgLXogIiRleGVjX2NtZCIgJiYgXAotICBmdW5jX2ZhdGFsX2hlbHAgImludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciCi0KLWlmIHRlc3QgLW4gIiRleGVjX2NtZCI7IHRoZW4KLSAgZXZhbCBleGVjICIkZXhlY19jbWQiCi0gIGV4aXQgJEVYSVRfRkFJTFVSRQotZmkKLQotZXhpdCAkZXhpdF9zdGF0dXMKLQotCi0jIFRoZSBUQUdzIGJlbG93IGFyZSBkZWZpbmVkIHN1Y2ggdGhhdCB3ZSBuZXZlciBnZXQgaW50byBhIHNpdHVhdGlvbgotIyBpbiB3aGljaCB3ZSBkaXNhYmxlIGJvdGgga2luZHMgb2YgbGlicmFyaWVzLiAgR2l2ZW4gY29uZmxpY3RpbmcKLSMgY2hvaWNlcywgd2UgZ28gZm9yIGEgc3RhdGljIGxpYnJhcnksIHRoYXQgaXMgdGhlIG1vc3QgcG9ydGFibGUsCi0jIHNpbmNlIHdlIGNhbid0IHRlbGwgd2hldGhlciBzaGFyZWQgbGlicmFyaWVzIHdlcmUgZGlzYWJsZWQgYmVjYXVzZQotIyB0aGUgdXNlciBhc2tlZCBmb3IgdGhhdCBvciBiZWNhdXNlIHRoZSBwbGF0Zm9ybSBkb2Vzbid0IHN1cHBvcnQKLSMgdGhlbS4gIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBvbiBBSVgsIGJlY2F1c2Ugd2UgZG9uJ3QKLSMgc3VwcG9ydCBoYXZpbmcgYm90aCBzdGF0aWMgYW5kIHNoYXJlZCBsaWJyYXJpZXMgZW5hYmxlZCBhdCB0aGUgc2FtZQotIyB0aW1lIG9uIHRoYXQgcGxhdGZvcm0sIHNvIHdlIGRlZmF1bHQgdG8gYSBzaGFyZWQtb25seSBjb25maWd1cmF0aW9uLgotIyBJZiBhIGRpc2FibGUtc2hhcmVkIHRhZyBpcyBnaXZlbiwgd2UnbGwgZmFsbGJhY2sgdG8gYSBzdGF0aWMtb25seQotIyBjb25maWd1cmF0aW9uLiAgQnV0IHdlJ2xsIG5ldmVyIGdvIGZyb20gc3RhdGljLW9ubHkgdG8gc2hhcmVkLW9ubHkuCi0KLSMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zaGFyZWQKLWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotYnVpbGRfb2xkX2xpYnM9eWVzCi0jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXNoYXJlZAotCi0jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc3RhdGljCi1idWlsZF9vbGRfbGlicz1gY2FzZSAkYnVpbGRfbGlidG9vbF9saWJzIGluIHllcykgZWNobyBubzs7ICopIGVjaG8geWVzOzsgZXNhY2AKLSMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc3RhdGljCi0KLSMgTG9jYWwgVmFyaWFibGVzOgotIyBtb2RlOnNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjoyCi0jIEVuZDoKLSMgdmk6c3c9MgotCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL21pc3NpbmcgYi9zcmMvbGlicG5nL21pc3NpbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4MDU1ZDIuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9taXNzaW5nCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29tbW9uIHN0dWIgZm9yIGEgZmV3IG1pc3NpbmcgR05VIHByb2dyYW1zIHdoaWxlIGluc3RhbGxpbmcuCi0KLXNjcmlwdHZlcnNpb249MjAwOS0wNC0yOC4yMTsgIyBVVEMKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsCi0jIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIE9yaWdpbmFsbHkgYnkgRnJhbixjb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+LCAxOTk2LgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLWlmIHRlc3QgJCMgLWVxIDA7IHRoZW4KLSAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgotICBleGl0IDEKLWZpCi0KLXJ1bj06Ci1zZWRfb3V0cHV0PSdzLy4qIC0tb3V0cHV0WyA9XVwoW14gXSpcKS4qL1wxL3AnCi1zZWRfbWludXNvPSdzLy4qIC1vIFwoW14gXSpcKS4qL1wxL3AnCi0KLSMgSW4gdGhlIGNhc2VzIHdoZXJlIHRoaXMgbWF0dGVycywgYG1pc3NpbmcnIGlzIGJlaW5nIHJ1biBpbiB0aGUKLSMgc3JjZGlyIGFscmVhZHkuCi1pZiB0ZXN0IC1mIGNvbmZpZ3VyZS5hYzsgdGhlbgotICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmFjCi1lbHNlCi0gIGNvbmZpZ3VyZV9hYz1jb25maWd1cmUuaW4KLWZpCi0KLW1zZz0ibWlzc2luZyBvbiB5b3VyIHN5c3RlbSIKLQotY2FzZSAkMSBpbgotLS1ydW4pCi0gICMgVHJ5IHRvIHJ1biByZXF1ZXN0ZWQgcHJvZ3JhbSwgYW5kIGp1c3QgZXhpdCBpZiBpdCBzdWNjZWVkcy4KLSAgcnVuPQotICBzaGlmdAotICAiJEAiICYmIGV4aXQgMAotICAjIEV4aXQgY29kZSA2MyBtZWFucyB2ZXJzaW9uIG1pc21hdGNoLiAgVGhpcyBvZnRlbiBoYXBwZW5zCi0gICMgd2hlbiB0aGUgdXNlciB0cnkgdG8gdXNlIGFuIGFuY2llbnQgdmVyc2lvbiBvZiBhIHRvb2wgb24KLSAgIyBhIGZpbGUgdGhhdCByZXF1aXJlcyBhIG1pbmltdW0gdmVyc2lvbi4gIEluIHRoaXMgY2FzZSB3ZQotICAjIHdlIHNob3VsZCBwcm9jZWVkIGhhcyBpZiB0aGUgcHJvZ3JhbSBoYWQgYmVlbiBhYnNlbnQsIG9yCi0gICMgaWYgLS1ydW4gaGFkbid0IGJlZW4gcGFzc2VkLgotICBpZiB0ZXN0ICQ/ID0gNjM7IHRoZW4KLSAgICBydW49OgotICAgIG1zZz0icHJvYmFibHkgdG9vIG9sZCIKLSAgZmkKLSAgOzsKLQotICAtaHwtLWh8LS1oZXwtLWhlbHwtLWhlbHApCi0gICAgZWNobyAiXAotJDAgW09QVElPTl0uLi4gUFJPR1JBTSBbQVJHVU1FTlRdLi4uCi0KLUhhbmRsZSBcYFBST0dSQU0gW0FSR1VNRU5UXS4uLicgZm9yIHdoZW4gUFJPR1JBTSBpcyBtaXNzaW5nLCBvciByZXR1cm4gYW4KLWVycm9yIHN0YXR1cyBpZiB0aGVyZSBpcyBubyBrbm93biBoYW5kbGluZyBmb3IgUFJPR1JBTS4KLQotT3B0aW9uczoKLSAgLWgsIC0taGVscCAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gIC12LCAtLXZlcnNpb24gICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAtLXJ1biAgICAgICAgICAgdHJ5IHRvIHJ1biB0aGUgZ2l2ZW4gY29tbWFuZCwgYW5kIGVtdWxhdGUgaXQgaWYgaXQgZmFpbHMKLQotU3VwcG9ydGVkIFBST0dSQU0gdmFsdWVzOgotICBhY2xvY2FsICAgICAgdG91Y2ggZmlsZSBcYGFjbG9jYWwubTQnCi0gIGF1dG9jb25mICAgICB0b3VjaCBmaWxlIFxgY29uZmlndXJlJwotICBhdXRvaGVhZGVyICAgdG91Y2ggZmlsZSBcYGNvbmZpZy5oLmluJwotICBhdXRvbTR0ZSAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlLCBvciBjcmVhdGUgYSBzdHViIG9uZQotICBhdXRvbWFrZSAgICAgdG91Y2ggYWxsIFxgTWFrZWZpbGUuaW4nIGZpbGVzCi0gIGJpc29uICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KLSAgZmxleCAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKLSAgaGVscDJtYW4gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQotICBsZXggICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYwotICBtYWtlaW5mbyAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCi0gIHRhciAgICAgICAgICB0cnkgdGFyLCBnbnV0YXIsIGd0YXIsIHRoZW4gdGFyIHdpdGhvdXQgbm9uLXBvcnRhYmxlIGZsYWdzCi0gIHlhY2MgICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KLQotVmVyc2lvbiBzdWZmaXhlcyB0byBQUk9HUkFNIGFzIHdlbGwgYXMgdGhlIHByZWZpeGVzIFxgZ251LScsIFxgZ251JywgYW5kCi1cYGcnIGFyZSBpZ25vcmVkIHdoZW4gY2hlY2tpbmcgdGhlIG5hbWUuCi0KLVNlbmQgYnVnIHJlcG9ydHMgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4iCi0gICAgZXhpdCAkPwotICAgIDs7Ci0KLSAgLXZ8LS12fC0tdmV8LS12ZXJ8LS12ZXJzfC0tdmVyc2l8LS12ZXJzaW98LS12ZXJzaW9uKQotICAgIGVjaG8gIm1pc3NpbmcgJHNjcmlwdHZlcnNpb24gKEdOVSBBdXRvbWFrZSkiCi0gICAgZXhpdCAkPwotICAgIDs7Ci0KLSAgLSopCi0gICAgZWNobyAxPiYyICIkMDogVW5rbm93biBcYCQxJyBvcHRpb24iCi0gICAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgotICAgIGV4aXQgMQotICAgIDs7Ci0KLWVzYWMKLQotIyBub3JtYWxpemUgcHJvZ3JhbSBuYW1lIHRvIGNoZWNrIGZvci4KLXByb2dyYW09YGVjaG8gIiQxIiB8IHNlZCAnCi0gIHMvXmdudS0vLzsgdAotICBzL15nbnUvLzsgdAotICBzL15nLy87IHQnYAotCi0jIE5vdyBleGl0IGlmIHdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuICBBbHNvIGV4aXQgbm93IGlmIHdlCi0jIGRvbid0IGhhdmUgaXQgYW5kIC0tdmVyc2lvbiB3YXMgcGFzc2VkIChtb3N0IGxpa2VseSB0byBkZXRlY3QKLSMgdGhlIHByb2dyYW0pLiAgVGhpcyBpcyBhYm91dCBub24tR05VIHByb2dyYW1zLCBzbyB1c2UgJDEgbm90Ci0jICRwcm9ncmFtLgotY2FzZSAkMSBpbgotICBsZXgqfHlhY2MqKQotICAgICMgTm90IEdOVSBwcm9ncmFtcywgdGhleSBkb24ndCBoYXZlIC0tdmVyc2lvbi4KLSAgICA7OwotCi0gIHRhciopCi0gICAgaWYgdGVzdCAtbiAiJHJ1biI7IHRoZW4KLSAgICAgICBlY2hvIDE+JjIgIkVSUk9SOiBcYHRhcicgcmVxdWlyZXMgLS1ydW4iCi0gICAgICAgZXhpdCAxCi0gICAgZWxpZiB0ZXN0ICJ4JDIiID0gIngtLXZlcnNpb24iIHx8IHRlc3QgIngkMiIgPSAieC0taGVscCI7IHRoZW4KLSAgICAgICBleGl0IDEKLSAgICBmaQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgotICAgICAgIGV4aXQgMQotICAgIGVsaWYgdGVzdCAieCQyIiA9ICJ4LS12ZXJzaW9uIiB8fCB0ZXN0ICJ4JDIiID0gIngtLWhlbHAiOyB0aGVuCi0gICAgICAgIyBDb3VsZCBub3QgcnVuIC0tdmVyc2lvbiBvciAtLWhlbHAuICBUaGlzIGlzIHByb2JhYmx5IHNvbWVvbmUKLSAgICAgICAjIHJ1bm5pbmcgYCRUT09MIC0tdmVyc2lvbicgb3IgYCRUT09MIC0taGVscCcgdG8gY2hlY2sgd2hldGhlcgotICAgICAgICMgJFRPT0wgZXhpc3RzIGFuZCBub3Qga25vd2luZyAkVE9PTCB1c2VzIG1pc3NpbmcuCi0gICAgICAgZXhpdCAxCi0gICAgZmkKLSAgICA7OwotZXNhYwotCi0jIElmIGl0IGRvZXMgbm90IGV4aXN0LCBvciBmYWlscyB0byBydW4gKHBvc3NpYmx5IGFuIG91dGRhdGVkIHZlcnNpb24pLAotIyB0cnkgdG8gZW11bGF0ZSBpdC4KLWNhc2UgJHByb2dyYW0gaW4KLSAgYWNsb2NhbCopCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjaW5jbHVkZS5tNCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKLSAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20KLSAgICAgICAgIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICB0b3VjaCBhY2xvY2FsLm00Ci0gICAgOzsKLQotICBhdXRvY29uZiopCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZQotICAgICAgICAgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUKLSAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCi0gICAgdG91Y2ggY29uZmlndXJlCi0gICAgOzsKLQotICBhdXRvaGVhZGVyKikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNjb25maWcuaCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKLSAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b2NvbmYnIGFuZCBcYEdOVSBtNCcgcGFja2FnZXMuICBHcmFiIHRoZW0KLSAgICAgICAgIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIGZpbGVzPWBzZWQgLW4gJ3MvXlsgXSpBW0NNXV9DT05GSUdfSEVBREVSKFwoW14pXSpcKSkuKi9cMS9wJyAke2NvbmZpZ3VyZV9hY31gCi0gICAgdGVzdCAteiAiJGZpbGVzIiAmJiBmaWxlcz0iY29uZmlnLmgiCi0gICAgdG91Y2hfZmlsZXM9Ci0gICAgZm9yIGYgaW4gJGZpbGVzOyBkbwotICAgICAgY2FzZSAkZiBpbgotICAgICAgKjoqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICJgZWNobyAiJGYiIHwKLQkJCQkgICAgICAgc2VkIC1lICdzL15bXjpdKjovLycgLWUgJ3MvOi4qLy8nYDs7Ci0gICAgICAqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICRmLmluIjs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICAgIHRvdWNoICR0b3VjaF9maWxlcwotICAgIDs7Ci0KLSAgYXV0b21ha2UqKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBNYWtlZmlsZS5hbScsIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuCi0gICAgICAgICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4KLSAgICAgICAgIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaW5kIC4gLXR5cGUgZiAtbmFtZSBNYWtlZmlsZS5hbSAtcHJpbnQgfAotCSAgIHNlZCAncy9cLmFtJC8uaW4vJyB8Ci0JICAgd2hpbGUgcmVhZCBmOyBkbyB0b3VjaCAiJGYiOyBkb25lCi0gICAgOzsKLQotICBhdXRvbTR0ZSopCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGJ1dCBpcyAkbXNnLgotICAgICAgICAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKLSAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLgotICAgICAgICAgWW91IGNhbiBnZXQgXGAkMScgYXMgcGFydCBvZiBcYEF1dG9jb25mJyBmcm9tIGFueSBHTlUKLSAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCi0KLSAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfb3V0cHV0ImAKLSAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX21pbnVzbyJgCi0gICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCi0JdG91Y2ggJGZpbGUKLSAgICBlbHNlCi0JdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCi0JZWNobyAiIyEgL2Jpbi9zaCIKLQllY2hvICIjIENyZWF0ZWQgYnkgR05VIEF1dG9tYWtlIG1pc3NpbmcgYXMgYSByZXBsYWNlbWVudCBvZiIKLQllY2hvICIjICAkICRAIgotCWVjaG8gImV4aXQgMCIKLQljaG1vZCAreCAkZmlsZQotCWV4aXQgMQotICAgIGZpCi0gICAgOzsKLQotICBiaXNvbip8eWFjYyopCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnknIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgQmlzb24nIHBhY2thZ2UKLSAgICAgICAgIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UgZWZmZWN0LiAgWW91IGNhbiBnZXQKLSAgICAgICAgIFxgQmlzb24nIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIHJtIC1mIHkudGFiLmMgeS50YWIuaAotICAgIGlmIHRlc3QgJCMgLW5lIDE7IHRoZW4KLSAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCi0JY2FzZSAkTEFTVEFSRyBpbgotCSoueSkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2MvJ2AKLQkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5jCi0JICAgIGZpCi0JICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9oLydgCi0JICAgIGlmIHRlc3QgLWYgIiRTUkNGSUxFIjsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAotCSAgICBmaQotCSAgOzsKLQllc2FjCi0gICAgZmkKLSAgICBpZiB0ZXN0ICEgLWYgeS50YWIuaDsgdGhlbgotCWVjaG8gPnkudGFiLmgKLSAgICBmaQotICAgIGlmIHRlc3QgISAtZiB5LnRhYi5jOyB0aGVuCi0JZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID55LnRhYi5jCi0gICAgZmkKLSAgICA7OwotCi0gIGxleCp8ZmxleCopCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLmwnIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgRmxleCcgcGFja2FnZQotICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAotICAgICAgICAgXGBGbGV4JyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBybSAtZiBsZXgueXkuYwotICAgIGlmIHRlc3QgJCMgLW5lIDE7IHRoZW4KLSAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCi0JY2FzZSAkTEFTVEFSRyBpbgotCSoubCkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL2wkL2MvJ2AKLQkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiBsZXgueXkuYwotCSAgICBmaQotCSAgOzsKLQllc2FjCi0gICAgZmkKLSAgICBpZiB0ZXN0ICEgLWYgbGV4Lnl5LmM7IHRoZW4KLQllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPmxleC55eS5jCi0gICAgZmkKLSAgICA7OwotCi0gIGhlbHAybWFuKikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotCSB5b3UgbW9kaWZpZWQgYSBkZXBlbmRlbmN5IG9mIGEgbWFudWFsIHBhZ2UuICBZb3UgbWF5IG5lZWQgdGhlCi0JIFxgSGVscDJtYW4nIHBhY2thZ2UgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZQotCSBlZmZlY3QuICBZb3UgY2FuIGdldCBcYEhlbHAybWFuJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLQotICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9vdXRwdXQiYAotICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfbWludXNvImAKLSAgICBpZiB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KLQl0b3VjaCAkZmlsZQotICAgIGVsc2UKLQl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKLQllY2hvICIuYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlIgotCWV4aXQgJD8KLSAgICBmaQotICAgIDs7Ci0KLSAgbWFrZWluZm8qKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC50ZXhpJyBvciBcYC50ZXhpbmZvJyBmaWxlLCBvciBhbnkgb3RoZXIgZmlsZQotICAgICAgICAgaW5kaXJlY3RseSBhZmZlY3RpbmcgdGhlIGFzcGVjdCBvZiB0aGUgbWFudWFsLiAgVGhlIHNwdXJpb3VzCi0gICAgICAgICBjYWxsIG1pZ2h0IGFsc28gYmUgdGhlIGNvbnNlcXVlbmNlIG9mIHVzaW5nIGEgYnVnZ3kgXGBtYWtlJyAoQUlYLAotICAgICAgICAgRFUsIElSSVgpLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUgXGBUZXhpbmZvJyBwYWNrYWdlIG9yCi0gICAgICAgICB0aGUgXGBHTlUgbWFrZScgcGFja2FnZS4gIEdyYWIgZWl0aGVyIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgICMgVGhlIGZpbGUgdG8gdG91Y2ggaXMgdGhhdCBzcGVjaWZpZWQgd2l0aCAtbyAuLi4KLSAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfb3V0cHV0ImAKLSAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX21pbnVzbyJgCi0gICAgaWYgdGVzdCAteiAiJGZpbGUiOyB0aGVuCi0gICAgICAjIC4uLiBvciBpdCBpcyB0aGUgb25lIHNwZWNpZmllZCB3aXRoIEBzZXRmaWxlbmFtZSAuLi4KLSAgICAgIGluZmlsZT1gZWNobyAiJCoiIHwgc2VkICdzLy4qIFwoW14gXSpcKSAqJC9cMS8nYAotICAgICAgZmlsZT1gc2VkIC1uICcKLQkvXkBzZXRmaWxlbmFtZS97Ci0JICBzLy4qIFwoW14gXSpcKSAqJC9cMS8KLQkgIHAKLQkgIHEKLQl9JyAkaW5maWxlYAotICAgICAgIyAuLi4gb3IgaXQgaXMgZGVyaXZlZCBmcm9tIHRoZSBzb3VyY2UgbmFtZSAoZGlyL2YudGV4aSBiZWNvbWVzIGYuaW5mbykKLSAgICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkaW5maWxlIiB8IHNlZCAncywuKi8sLDtzLC5bXi5dKiQsLCdgLmluZm8KLSAgICBmaQotICAgICMgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZSB1c2VyIHJlYWxseSBuZWVkcyBtYWtlaW5mbzsKLSAgICAjIGxldCdzIGZhaWwgd2l0aG91dCB0b3VjaGluZyBhbnl0aGluZy4KLSAgICB0ZXN0IC1mICRmaWxlIHx8IGV4aXQgMQotICAgIHRvdWNoICRmaWxlCi0gICAgOzsKLQotICB0YXIqKQotICAgIHNoaWZ0Ci0KLSAgICAjIFdlIGhhdmUgYWxyZWFkeSB0cmllZCB0YXIgaW4gdGhlIGdlbmVyaWMgcGFydC4KLSAgICAjIExvb2sgZm9yIGdudXRhci9ndGFyIGJlZm9yZSBpbnZvY2F0aW9uIHRvIGF2b2lkIHVnbHkgZXJyb3IKLSAgICAjIG1lc3NhZ2VzLgotICAgIGlmIChnbnV0YXIgLS12ZXJzaW9uID4gL2Rldi9udWxsIDI+JjEpOyB0aGVuCi0gICAgICAgZ251dGFyICIkQCIgJiYgZXhpdCAwCi0gICAgZmkKLSAgICBpZiAoZ3RhciAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSk7IHRoZW4KLSAgICAgICBndGFyICIkQCIgJiYgZXhpdCAwCi0gICAgZmkKLSAgICBmaXJzdGFyZz0iJDEiCi0gICAgaWYgc2hpZnQ7IHRoZW4KLQljYXNlICRmaXJzdGFyZyBpbgotCSpvKikKLQkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9vLy9gCi0JICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAotCSAgICA7OwotCWVzYWMKLQljYXNlICRmaXJzdGFyZyBpbgotCSpoKikKLQkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9oLy9gCi0JICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAotCSAgICA7OwotCWVzYWMKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBJIGNhbid0IHNlZW0gdG8gYmUgYWJsZSB0byBydW4gXGB0YXInIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KLSAgICAgICAgIFlvdSBtYXkgd2FudCB0byBpbnN0YWxsIEdOVSB0YXIgb3IgRnJlZSBwYXh1dGlscywgb3IgY2hlY2sgdGhlCi0gICAgICAgICBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gICopCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGFuZCBpcyAkbXNnLgotICAgICAgICAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKLSAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLiAgQ2hlY2sgdGhlIFxgUkVBRE1FJyBmaWxlLAotICAgICAgICAgaXQgb2Z0ZW4gdGVsbHMgeW91IGFib3V0IHRoZSBuZWVkZWQgcHJlcmVxdWlzaXRlcyBmb3IgaW5zdGFsbGluZwotICAgICAgICAgdGhpcyBwYWNrYWdlLiAgWW91IG1heSBhbHNvIHBlZWsgYXQgYW55IEdOVSBhcmNoaXZlIHNpdGUsIGluIGNhc2UKLSAgICAgICAgIHNvbWUgb3RoZXIgcGFja2FnZSB3b3VsZCBjb250YWluIHRoaXMgbWlzc2luZyBcYCQxJyBwcm9ncmFtLiIKLSAgICBleGl0IDEKLSAgICA7OwotZXNhYwotCi1leGl0IDAKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKLSMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCi0jIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9wbmcuNSBiL3NyYy9saWJwbmcvcG5nLjUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OTdkZGMuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9wbmcuNQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS5USCBQTkcgNSAiSnVseSAxMCwgMjAxMiIKLS5TSCBOQU1FCi1wbmcgXC0gUG9ydGFibGUgTmV0d29yayBHcmFwaGljcyAoUE5HKSBmb3JtYXQKLS5TSCBERVNDUklQVElPTgotUE5HIChQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzKSBpcyBhbiBleHRlbnNpYmxlIGZpbGUgZm9ybWF0IGZvciB0aGUKLWxvc3NsZXNzLCBwb3J0YWJsZSwgd2VsbC1jb21wcmVzc2VkIHN0b3JhZ2Ugb2YgcmFzdGVyIGltYWdlcy4gUE5HIHByb3ZpZGVzCi1hIHBhdGVudC1mcmVlIHJlcGxhY2VtZW50IGZvciBHSUYgYW5kIGNhbiBhbHNvIHJlcGxhY2UgbWFueQotY29tbW9uIHVzZXMgb2YgVElGRi4gSW5kZXhlZC1jb2xvciwgZ3JheXNjYWxlLCBhbmQgdHJ1ZWNvbG9yIGltYWdlcyBhcmUKLXN1cHBvcnRlZCwgcGx1cyBhbiBvcHRpb25hbCBhbHBoYSBjaGFubmVsLiBTYW1wbGUgZGVwdGhzIHJhbmdlIGZyb20KLTEgdG8gMTYgYml0cy4KLS5icgotCi1QTkcgaXMgZGVzaWduZWQgdG8gd29yayB3ZWxsIGluIG9ubGluZSB2aWV3aW5nIGFwcGxpY2F0aW9ucywgc3VjaCBhcyB0aGUKLVdvcmxkIFdpZGUgV2ViLCBzbyBpdCBpcyBmdWxseSBzdHJlYW1hYmxlIHdpdGggYSBwcm9ncmVzc2l2ZSBkaXNwbGF5Ci1vcHRpb24uIFBORyBpcyByb2J1c3QsIHByb3ZpZGluZyBib3RoIGZ1bGwgZmlsZSBpbnRlZ3JpdHkgY2hlY2tpbmcgYW5kCi1mYXN0LCBzaW1wbGUgZGV0ZWN0aW9uIG9mIGNvbW1vbiB0cmFuc21pc3Npb24gZXJyb3JzLiBBbHNvLCBQTkcgY2FuIHN0b3JlCi1nYW1tYSBhbmQgY2hyb21hdGljaXR5IGRhdGEgZm9yIGltcHJvdmVkIGNvbG9yIG1hdGNoaW5nIG9uIGhldGVyb2dlbmVvdXMKLXBsYXRmb3Jtcy4KLQotLlNIICJTRUUgQUxTTyIKLS5CUiAibGlicG5nIigzKSwgIiBsaWJwbmdwZiIoMyksICIgemxpYiIoMyksICIgZGVmbGF0ZSIoNSksICIgIiBhbmQgIiB6bGliIig1KQotLkxQCi1QTkcgc3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pLCBOb3ZlbWJlciAyMDAzOgotLklQCi0uYnIKLSAgPGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvUkVDLVBORy0yMDAzMTExMC8KLVBORyAxLjIgc3BlY2lmaWNhdGlvbiwgSnVseSAxOTk5OgotLklQCi0uYnIKLWh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nCi0uTFAKLVBORyAxLjAgc3BlY2lmaWNhdGlvbiwgT2N0b2JlciAxOTk2OgotLklQCi0uYnIKLVJGQyAyMDgzCi0uSVAKLS5icgotZnRwOi8vZHMuaW50ZXJuaWMubmV0L3JmYy9yZmMyMDgzLnR4dAotLmJyCi1vciAoYXMgYSBXM0MgUmVjb21tZW5kYXRpb24pIGF0Ci0uYnIKLWh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1wbmcuaHRtbAotLlNIIEFVVEhPUlMKLVRoaXMgbWFuIHBhZ2U6IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotLkxQCi1Qb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIFNwZWNpZmljYXRpb24gKFNlY29uZCBFZGl0aW9uKQotSW5mb3JtYXRpb24gdGVjaG5vbG9neSAtIENvbXB1dGVyIGdyYXBoaWNzIGFuZCBpbWFnZSBwcm9jZXNzaW5nIC0KLVBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MgKFBORyk6IEZ1bmN0aW9uYWwgc3BlY2lmaWNhdGlvbi4KLUlTTy9JRUMgMTU5NDg6MjAwMyAoRSkgKE5vdmVtYmVyIDEwLCAyMDAzKTogRGF2aWQgRHVjZSBhbmQgb3RoZXJzLgotLkxQCi1Qb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIFNwZWNpZmljYXRpb24gVmVyc2lvbiAxLjIgKEp1bHkgOCwgMTk5OSk6Ci1HbGVubiBSYW5kZXJzLVBlaHJzb24gYW5kIG90aGVycyAocG5nLWxpc3QpLgotLkxQCi1Qb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIFNwZWNpZmljYXRpb24gVmVyc2lvbiAxLjAgKE9jdG9iZXIgMSwgMTk5Nik6Ci1UaG9tYXMgQm91dGVsbCBhbmQgb3RoZXJzIChwbmctbGlzdCkuCi0uTFAKLQotCi0uU0ggQ09QWVJJR0hUIE5PVElDRQotLkxQCi1UaGlzIG1hbiBwYWdlIGlzIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IEdsZW5uIFJhbmRlcnMtUGVocnNvbi4gIFNlZSBwbmcuaAotZm9yIGNvbmRpdGlvbnMgb2YgdXNlIGFuZCBkaXN0cmlidXRpb24uCi0uTFAKLVRoZSBQTkcgU3BlY2lmaWNhdGlvbiAoU2Vjb25kIEVkaXRpb24pIGlzCi1Db3B5cmlnaHQgKGMpIDIwMDMgVzNDLiAoTUlULCBFUkNJTSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0uTFAKLVRoZSBQTkctMS4yIHNwZWNpZmljYXRpb24gaXMgY29weXJpZ2h0IChjKSAxOTk5IEdsZW5uIFJhbmRlcnMtUGVocnNvbi4KLVNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgY29uZGl0aW9ucyBvZiB1c2UgYW5kIGRpc3RyaWJ1dGlvbi4KLS5MUAotVGhlIFBORy0xLjAgc3BlY2lmaWNhdGlvbiBpcyBjb3B5cmlnaHQgKGMpIDE5OTYgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YKLVRlY2hub2xvZ3kuICBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGNvbmRpdGlvbnMgb2YgdXNlIGFuZCBkaXN0cmlidXRpb24uCi0uTFAKLS5cIiBlbmQgb2YgbWFuIHBhZ2UKLQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9wbmcuYyBiL3NyYy9saWJwbmcvcG5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NGUyMGUuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9wbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDkxNCArMCwwIEBACi0KLS8qIHBuZy5jIC0gbG9jYXRpb24gZm9yIGdlbmVyYWwgcHVycG9zZSBsaWJwbmcgZnVuY3Rpb25zCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjQuNiBbTWFyY2ggOCwgMjAxMV0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDExIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCi0gKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0gKi8KLQotI2RlZmluZSBQTkdfTk9fRVhURVJOCi0jZGVmaW5lIFBOR19OT19QRURBTlRJQ19XQVJOSU5HUwotI2luY2x1ZGUgInBuZy5oIgotI2luY2x1ZGUgInBuZ3ByaXYuaCIKLQotLyogR2VuZXJhdGUgYSBjb21waWxlciBlcnJvciBpZiB0aGVyZSBpcyBhbiBvbGQgcG5nLmggaW4gdGhlIHNlYXJjaCBwYXRoLiAqLwotdHlwZWRlZiB2ZXJzaW9uXzFfNF8xMiBZb3VyX3BuZ19oX2lzX25vdF92ZXJzaW9uXzFfNF8xMjsKLQotLyogVGVsbHMgbGlicG5nIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIGZpcnN0ICJudW1fYnl0ZXMiIGJ5dGVzCi0gKiBvZiB0aGUgUE5HIGZpbGUgc2lnbmF0dXJlLiAgSWYgdGhlIFBORyBkYXRhIGlzIGVtYmVkZGVkIGludG8gYW5vdGhlcgotICogc3RyZWFtIHdlIGNhbiBzZXQgbnVtX2J5dGVzID0gOCBzbyB0aGF0IGxpYnBuZyB3aWxsIG5vdCBhdHRlbXB0IHRvIHJlYWQKLSAqIG9yIHdyaXRlIGFueSBvZiB0aGUgbWFnaWMgYnl0ZXMgYmVmb3JlIGl0IHN0YXJ0cyBvbiB0aGUgSUhEUi4KLSAqLwotCi0jaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECi12b2lkIFBOR0FQSQotcG5nX3NldF9zaWdfYnl0ZXMocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IG51bV9ieXRlcykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9zaWdfYnl0ZXMiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgaWYgKG51bV9ieXRlcyA+IDgpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlRvbyBtYW55IGJ5dGVzIGZvciBQTkcgc2lnbmF0dXJlIik7Ci0KLSAgIHBuZ19wdHItPnNpZ19ieXRlcyA9IChwbmdfYnl0ZSkobnVtX2J5dGVzIDwgMCA/IDAgOiBudW1fYnl0ZXMpOwotfQotCi0vKiBDaGVja3Mgd2hldGhlciB0aGUgc3VwcGxpZWQgYnl0ZXMgbWF0Y2ggdGhlIFBORyBzaWduYXR1cmUuICBXZSBhbGxvdwotICogY2hlY2tpbmcgbGVzcyB0aGFuIHRoZSBmdWxsIDgtYnl0ZSBzaWduYXR1cmUgc28gdGhhdCB0aG9zZSBhcHBzIHRoYXQKLSAqIGFscmVhZHkgcmVhZCB0aGUgZmlyc3QgZmV3IGJ5dGVzIG9mIGEgZmlsZSB0byBkZXRlcm1pbmUgdGhlIGZpbGUgdHlwZQotICogY2FuIHNpbXBseSBjaGVjayB0aGUgcmVtYWluaW5nIGJ5dGVzIGZvciBleHRyYSBhc3N1cmFuY2UuICBSZXR1cm5zCi0gKiBhbiBpbnRlZ2VyIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvIGlmIHNpZyBpcyBmb3VuZCwKLSAqIHJlc3BlY3RpdmVseSwgdG8gYmUgbGVzcyB0aGFuLCB0byBtYXRjaCwgb3IgYmUgZ3JlYXRlciB0aGFuIHRoZSBjb3JyZWN0Ci0gKiBQTkcgc2lnbmF0dXJlICh0aGlzIGlzIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBzdHJjbXAsIG1lbWNtcCwgZXRjKS4KLSAqLwotaW50IFBOR0FQSQotcG5nX3NpZ19jbXAocG5nX2J5dGVwIHNpZywgcG5nX3NpemVfdCBzdGFydCwgcG5nX3NpemVfdCBudW1fdG9fY2hlY2spCi17Ci0gICBwbmdfYnl0ZSBwbmdfc2lnbmF0dXJlWzhdID0gezEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTB9OwotICAgaWYgKG51bV90b19jaGVjayA+IDgpCi0gICAgICBudW1fdG9fY2hlY2sgPSA4OwotICAgZWxzZSBpZiAobnVtX3RvX2NoZWNrIDwgMSkKLSAgICAgIHJldHVybiAoLTEpOwotCi0gICBpZiAoc3RhcnQgPiA3KQotICAgICAgcmV0dXJuICgtMSk7Ci0KLSAgIGlmIChzdGFydCArIG51bV90b19jaGVjayA+IDgpCi0gICAgICBudW1fdG9fY2hlY2sgPSA4IC0gc3RhcnQ7Ci0KLSAgIHJldHVybiAoKGludCkocG5nX21lbWNtcCgmc2lnW3N0YXJ0XSwgJnBuZ19zaWduYXR1cmVbc3RhcnRdLCBudW1fdG9fY2hlY2spKSk7Ci19Ci0KLSNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgKi8KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpCi0vKiBGdW5jdGlvbiB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHpsaWIgYW5kIGNsZWFyIGl0IHRvIDAuICovCi12b2lkcGYgLyogUFJJVkFURSAqLwotcG5nX3phbGxvYyh2b2lkcGYgcG5nX3B0ciwgdUludCBpdGVtcywgdUludCBzaXplKQotewotICAgcG5nX3ZvaWRwIHB0cjsKLSAgIHBuZ19zdHJ1Y3RwIHA9KHBuZ19zdHJ1Y3RwKXBuZ19wdHI7Ci0gICBwbmdfdWludF8zMiBzYXZlX2ZsYWdzPXAtPmZsYWdzOwotICAgcG5nX2FsbG9jX3NpemVfdCBudW1fYnl0ZXM7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm4gKE5VTEwpOwotICAgaWYgKGl0ZW1zID4gUE5HX1VJTlRfMzJfTUFYL3NpemUpCi0gICB7Ci0gICAgIHBuZ193YXJuaW5nIChwLCAiUG90ZW50aWFsIG92ZXJmbG93IGluIHBuZ196YWxsb2MoKSIpOwotICAgICByZXR1cm4gKE5VTEwpOwotICAgfQotICAgbnVtX2J5dGVzID0gKHBuZ19hbGxvY19zaXplX3QpaXRlbXMgKiBzaXplOwotCi0gICBwLT5mbGFnc3w9UE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LOwotICAgcHRyID0gKHBuZ192b2lkcClwbmdfbWFsbG9jKChwbmdfc3RydWN0cClwbmdfcHRyLCBudW1fYnl0ZXMpOwotICAgcC0+ZmxhZ3M9c2F2ZV9mbGFnczsKLQotICAgcmV0dXJuICgodm9pZHBmKXB0cik7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGZyZWUgbWVtb3J5IGZvciB6bGliICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ196ZnJlZSh2b2lkcGYgcG5nX3B0ciwgdm9pZHBmIHB0cikKLXsKLSAgIHBuZ19mcmVlKChwbmdfc3RydWN0cClwbmdfcHRyLCAocG5nX3ZvaWRwKXB0cik7Ci19Ci0KLS8qIFJlc2V0IHRoZSBDUkMgdmFyaWFibGUgdG8gMzIgYml0cyBvZiAxJ3MuICBDYXJlIG11c3QgYmUgdGFrZW4KLSAqIGluIGNhc2UgQ1JDIGlzID4gMzIgYml0cyB0byBsZWF2ZSB0aGUgdG9wIGJpdHMgMC4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcmVzZXRfY3JjKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfcHRyLT5jcmMgPSBjcmMzMigwLCBaX05VTEwsIDApOwotfQotCi0vKiBDYWxjdWxhdGUgdGhlIENSQyBvdmVyIGEgc2VjdGlvbiBvZiBkYXRhLiAgV2UgY2FuIG9ubHkgcGFzcyBhcwotICogbXVjaCBkYXRhIHRvIHRoaXMgcm91dGluZSBhcyB0aGUgbGFyZ2VzdCBzaW5nbGUgYnVmZmVyIHNpemUuICBXZQotICogYWxzbyBjaGVjayB0aGF0IHRoaXMgZGF0YSB3aWxsIGFjdHVhbGx5IGJlIHVzZWQgYmVmb3JlIGdvaW5nIHRvIHRoZQotICogdHJvdWJsZSBvZiBjYWxjdWxhdGluZyBpdC4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfY2FsY3VsYXRlX2NyYyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgcHRyLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIGludCBuZWVkX2NyYyA9IDE7Ci0KLSAgIGlmIChwbmdfcHRyLT5jaHVua19uYW1lWzBdICYgMHgyMCkgICAgICAgICAgICAgICAgICAgICAvKiBhbmNpbGxhcnkgKi8KLSAgIHsKLSAgICAgIGlmICgocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX01BU0spID09Ci0gICAgICAgICAgKFBOR19GTEFHX0NSQ19BTkNJTExBUllfVVNFIHwgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9OT1dBUk4pKQotICAgICAgICAgbmVlZF9jcmMgPSAwOwotICAgfQotICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcml0aWNhbCAqLwotICAgewotICAgICAgaWYgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX0lHTk9SRSkKLSAgICAgICAgIG5lZWRfY3JjID0gMDsKLSAgIH0KLQotICAgaWYgKG5lZWRfY3JjKQotICAgICAgcG5nX3B0ci0+Y3JjID0gY3JjMzIocG5nX3B0ci0+Y3JjLCBwdHIsICh1SW50KWxlbmd0aCk7Ci19Ci0KLS8qIEFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIGFuIGluZm9fc3RydWN0IGZvciB0aGUgYXBwbGljYXRpb24uICBXZSBkb24ndAotICogcmVhbGx5IG5lZWQgdGhlIHBuZ19wdHIsIGJ1dCBpdCBjb3VsZCBwb3RlbnRpYWxseSBiZSB1c2VmdWwgaW4gdGhlCi0gKiBmdXR1cmUuICBUaGlzIHNob3VsZCBiZSB1c2VkIGluIGZhdm91ciBvZiBtYWxsb2MocG5nX3NpemVvZihwbmdfaW5mbykpCi0gKiBhbmQgcG5nX2luZm9faW5pdCgpIHNvIHRoYXQgYXBwbGljYXRpb25zIHRoYXQgd2FudCB0byB1c2UgYSBzaGFyZWQKLSAqIGxpYnBuZyBkb24ndCBoYXZlIHRvIGJlIHJlY29tcGlsZWQgaWYgcG5nX2luZm8gY2hhbmdlcyBzaXplLgotICovCi1wbmdfaW5mb3AgUE5HQVBJCi1wbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfaW5mb3AgaW5mb19wdHI7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuIChOVUxMKTsKLQotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgIGluZm9fcHRyID0gKHBuZ19pbmZvcClwbmdfY3JlYXRlX3N0cnVjdF8yKFBOR19TVFJVQ1RfSU5GTywKLSAgICAgIHBuZ19wdHItPm1hbGxvY19mbiwgcG5nX3B0ci0+bWVtX3B0cik7Ci0jZWxzZQotICAgaW5mb19wdHIgPSAocG5nX2luZm9wKXBuZ19jcmVhdGVfc3RydWN0KFBOR19TVFJVQ1RfSU5GTyk7Ci0jZW5kaWYKLSAgIGlmIChpbmZvX3B0ciAhPSBOVUxMKQotICAgICAgcG5nX2luZm9faW5pdF8zKCZpbmZvX3B0ciwgcG5nX3NpemVvZihwbmdfaW5mbykpOwotCi0gICByZXR1cm4gKGluZm9fcHRyKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBmcmVlcyB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBpbmZvIHN0cnVjdC4KLSAqIE5vcm1hbGx5LCBvbmUgd291bGQgdXNlIGVpdGhlciBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgpIG9yCi0gKiBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKSB0byBmcmVlIGFuIGluZm8gc3RydWN0LCBidXQgdGhpcyBtYXkgYmUKLSAqIHVzZWZ1bCBmb3Igc29tZSBhcHBsaWNhdGlvbnMuCi0gKi8KLXZvaWQgUE5HQVBJCi1wbmdfZGVzdHJveV9pbmZvX3N0cnVjdChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3BwIGluZm9fcHRyX3B0cikKLXsKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IE5VTEw7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgaWYgKGluZm9fcHRyX3B0ciAhPSBOVUxMKQotICAgICAgaW5mb19wdHIgPSAqaW5mb19wdHJfcHRyOwotCi0gICBpZiAoaW5mb19wdHIgIT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ19pbmZvX2Rlc3Ryb3kocG5nX3B0ciwgaW5mb19wdHIpOwotCi0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgICAgcG5nX2Rlc3Ryb3lfc3RydWN0XzIoKHBuZ192b2lkcClpbmZvX3B0ciwgcG5nX3B0ci0+ZnJlZV9mbiwKLSAgICAgICAgICBwbmdfcHRyLT5tZW1fcHRyKTsKLSNlbHNlCi0gICAgICBwbmdfZGVzdHJveV9zdHJ1Y3QoKHBuZ192b2lkcClpbmZvX3B0cik7Ci0jZW5kaWYKLSAgICAgICppbmZvX3B0cl9wdHIgPSBOVUxMOwotICAgfQotfQotCi0vKiBJbml0aWFsaXplIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMgbm93IGFuIGludGVybmFsIGZ1bmN0aW9uICgwLjg5KQotICogYW5kIGFwcGxpY2F0aW9ucyB1c2luZyBpdCBhcmUgdXJnZWQgdG8gdXNlIHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QoKQotICogaW5zdGVhZC4KLSAqLwotCi12b2lkIFBOR0FQSQotcG5nX2luZm9faW5pdF8zKHBuZ19pbmZvcHAgcHRyX3B0ciwgcG5nX3NpemVfdCBwbmdfaW5mb19zdHJ1Y3Rfc2l6ZSkKLXsKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9ICpwdHJfcHRyOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19pbmZvX2luaXRfMyIpOwotCi0gICBpZiAoaW5mb19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgaWYgKHBuZ19zaXplb2YocG5nX2luZm8pID4gcG5nX2luZm9fc3RydWN0X3NpemUpCi0gICB7Ci0gICAgICBwbmdfZGVzdHJveV9zdHJ1Y3QoaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgPSAocG5nX2luZm9wKXBuZ19jcmVhdGVfc3RydWN0KFBOR19TVFJVQ1RfSU5GTyk7Ci0gICAgICAqcHRyX3B0ciA9IGluZm9fcHRyOwotICAgfQotCi0gICAvKiBTZXQgZXZlcnl0aGluZyB0byAwICovCi0gICBwbmdfbWVtc2V0KGluZm9fcHRyLCAwLCBwbmdfc2l6ZW9mKHBuZ19pbmZvKSk7Ci19Ci0KLXZvaWQgUE5HQVBJCi1wbmdfZGF0YV9mcmVlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBpbnQgZnJlZXIsIHBuZ191aW50XzMyIG1hc2spCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kYXRhX2ZyZWVyIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgaWYgKGZyZWVyID09IFBOR19ERVNUUk9ZX1dJTExfRlJFRV9EQVRBKQotICAgICAgaW5mb19wdHItPmZyZWVfbWUgfD0gbWFzazsKLSAgIGVsc2UgaWYgKGZyZWVyID09IFBOR19VU0VSX1dJTExfRlJFRV9EQVRBKQotICAgICAgaW5mb19wdHItPmZyZWVfbWUgJj0gfm1hc2s7Ci0gICBlbHNlCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgIlVua25vd24gZnJlZXIgcGFyYW1ldGVyIGluIHBuZ19kYXRhX2ZyZWVyIik7Ci19Ci0KLXZvaWQgUE5HQVBJCi1wbmdfZnJlZV9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbWFzaywKLSAgIGludCBudW0pCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19mcmVlX2RhdGEiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0jaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECi0gICAvKiBGcmVlIHRleHQgaXRlbSBudW0gb3IgKGlmIG51bSA9PSAtMSkgYWxsIHRleHQgaXRlbXMgKi8KLSAgIGlmICgobWFzayAmIFBOR19GUkVFX1RFWFQpICYgaW5mb19wdHItPmZyZWVfbWUpCi0gICB7Ci0gICAgICBpZiAobnVtICE9IC0xKQotICAgICAgewotICAgICAgICAgaWYgKGluZm9fcHRyLT50ZXh0ICYmIGluZm9fcHRyLT50ZXh0W251bV0ua2V5KQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnRleHRbbnVtXS5rZXkpOwotICAgICAgICAgICAgaW5mb19wdHItPnRleHRbbnVtXS5rZXkgPSBOVUxMOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgaW50IGk7Ci0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5mb19wdHItPm51bV90ZXh0OyBpKyspCi0gICAgICAgICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfVEVYVCwgaSk7Ci0gICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+dGV4dCk7Ci0gICAgICAgICBpbmZvX3B0ci0+dGV4dCA9IE5VTEw7Ci0gICAgICAgICBpbmZvX3B0ci0+bnVtX3RleHQ9MDsKLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX3RSTlNfU1VQUE9SVEVECi0gICAvKiBGcmVlIGFueSB0Uk5TIGVudHJ5ICovCi0gICBpZiAoKG1hc2sgJiBQTkdfRlJFRV9UUk5TKSAmIGluZm9fcHRyLT5mcmVlX21lKQotICAgewotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnRyYW5zX2FscGhhKTsKLSAgICAgIGluZm9fcHRyLT50cmFuc19hbHBoYSA9IE5VTEw7Ci0gICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX3RSTlM7Ci0gICB9Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19zQ0FMX1NVUFBPUlRFRAotICAgLyogRnJlZSBhbnkgc0NBTCBlbnRyeSAqLwotICAgaWYgKChtYXNrICYgUE5HX0ZSRUVfU0NBTCkgJiBpbmZvX3B0ci0+ZnJlZV9tZSkKLSAgIHsKLSNpZiBkZWZpbmVkKFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpCi0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+c2NhbF9zX3dpZHRoKTsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5zY2FsX3NfaGVpZ2h0KTsKLSAgICAgIGluZm9fcHRyLT5zY2FsX3Nfd2lkdGggPSBOVUxMOwotICAgICAgaW5mb19wdHItPnNjYWxfc19oZWlnaHQgPSBOVUxMOwotI2VuZGlmCi0gICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX3NDQUw7Ci0gICB9Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19wQ0FMX1NVUFBPUlRFRAotICAgLyogRnJlZSBhbnkgcENBTCBlbnRyeSAqLwotICAgaWYgKChtYXNrICYgUE5HX0ZSRUVfUENBTCkgJiBpbmZvX3B0ci0+ZnJlZV9tZSkKLSAgIHsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5wY2FsX3B1cnBvc2UpOwotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnBjYWxfdW5pdHMpOwotICAgICAgaW5mb19wdHItPnBjYWxfcHVycG9zZSA9IE5VTEw7Ci0gICAgICBpbmZvX3B0ci0+cGNhbF91bml0cyA9IE5VTEw7Ci0gICAgICBpZiAoaW5mb19wdHItPnBjYWxfcGFyYW1zICE9IE5VTEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KWluZm9fcHRyLT5wY2FsX25wYXJhbXM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5wY2FsX3BhcmFtc1tpXSk7Ci0gICAgICAgICAgICAgICBpbmZvX3B0ci0+cGNhbF9wYXJhbXNbaV0gPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnBjYWxfcGFyYW1zKTsKLSAgICAgICAgICAgIGluZm9fcHRyLT5wY2FsX3BhcmFtcyA9IE5VTEw7Ci0gICAgICAgICB9Ci0gICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX3BDQUw7Ci0gICB9Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19pQ0NQX1NVUFBPUlRFRAotICAgLyogRnJlZSBhbnkgaUNDUCBlbnRyeSAqLwotICAgaWYgKChtYXNrICYgUE5HX0ZSRUVfSUNDUCkgJiBpbmZvX3B0ci0+ZnJlZV9tZSkKLSAgIHsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5pY2NwX25hbWUpOwotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPmljY3BfcHJvZmlsZSk7Ci0gICAgICBpbmZvX3B0ci0+aWNjcF9uYW1lID0gTlVMTDsKLSAgICAgIGluZm9fcHRyLT5pY2NwX3Byb2ZpbGUgPSBOVUxMOwotICAgICAgaW5mb19wdHItPnZhbGlkICY9IH5QTkdfSU5GT19pQ0NQOwotICAgfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfc1BMVF9TVVBQT1JURUQKLSAgIC8qIEZyZWUgYSBnaXZlbiBzUExUIGVudHJ5LCBvciAoaWYgbnVtID09IC0xKSBhbGwgc1BMVCBlbnRyaWVzICovCi0gICBpZiAoKG1hc2sgJiBQTkdfRlJFRV9TUExUKSAmIGluZm9fcHRyLT5mcmVlX21lKQotICAgewotICAgICAgaWYgKG51bSAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgIGlmIChpbmZvX3B0ci0+c3BsdF9wYWxldHRlcykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzW251bV0ubmFtZSk7Ci0gICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+c3BsdF9wYWxldHRlc1tudW1dLmVudHJpZXMpOwotICAgICAgICAgICAgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNbbnVtXS5uYW1lID0gTlVMTDsKLSAgICAgICAgICAgIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzW251bV0uZW50cmllcyA9IE5VTEw7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpZiAoaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNfbnVtKQotICAgICAgICAgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludClpbmZvX3B0ci0+c3BsdF9wYWxldHRlc19udW07IGkrKykKLSAgICAgICAgICAgICAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIFBOR19GUkVFX1NQTFQsIGkpOwotCi0gICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+c3BsdF9wYWxldHRlcyk7Ci0gICAgICAgICAgICBpbmZvX3B0ci0+c3BsdF9wYWxldHRlcyA9IE5VTEw7Ci0gICAgICAgICAgICBpbmZvX3B0ci0+c3BsdF9wYWxldHRlc19udW0gPSAwOwotICAgICAgICAgfQotICAgICAgICAgaW5mb19wdHItPnZhbGlkICY9IH5QTkdfSU5GT19zUExUOwotICAgICAgfQotICAgfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhKQotICAgewotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhKTsKLSAgICAgIHBuZ19wdHItPnVua25vd25fY2h1bmsuZGF0YSA9IE5VTEw7Ci0gICB9Ci0KLSAgIGlmICgobWFzayAmIFBOR19GUkVFX1VOS04pICYgaW5mb19wdHItPmZyZWVfbWUpCi0gICB7Ci0gICAgICBpZiAobnVtICE9IC0xKQotICAgICAgewotICAgICAgICAgIGlmIChpbmZvX3B0ci0+dW5rbm93bl9jaHVua3MpCi0gICAgICAgICAgewotICAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT51bmtub3duX2NodW5rc1tudW1dLmRhdGEpOwotICAgICAgICAgICAgIGluZm9fcHRyLT51bmtub3duX2NodW5rc1tudW1dLmRhdGEgPSBOVUxMOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGludCBpOwotCi0gICAgICAgICBpZiAoaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KWluZm9fcHRyLT51bmtub3duX2NodW5rc19udW07IGkrKykKLSAgICAgICAgICAgICAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIFBOR19GUkVFX1VOS04sIGkpOwotCi0gICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3MpOwotICAgICAgICAgICAgaW5mb19wdHItPnVua25vd25fY2h1bmtzID0gTlVMTDsKLSAgICAgICAgICAgIGluZm9fcHRyLT51bmtub3duX2NodW5rc19udW0gPSAwOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfaElTVF9TVVBQT1JURUQKLSAgIC8qIEZyZWUgYW55IGhJU1QgZW50cnkgKi8KLSAgIGlmICgobWFzayAmIFBOR19GUkVFX0hJU1QpICAmIGluZm9fcHRyLT5mcmVlX21lKQotICAgewotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPmhpc3QpOwotICAgICAgaW5mb19wdHItPmhpc3QgPSBOVUxMOwotICAgICAgaW5mb19wdHItPnZhbGlkICY9IH5QTkdfSU5GT19oSVNUOwotICAgfQotI2VuZGlmCi0KLSAgIC8qIEZyZWUgYW55IFBMVEUgZW50cnkgdGhhdCB3YXMgaW50ZXJuYWxseSBhbGxvY2F0ZWQgKi8KLSAgIGlmICgobWFzayAmIFBOR19GUkVFX1BMVEUpICYgaW5mb19wdHItPmZyZWVfbWUpCi0gICB7Ci0gICAgICBwbmdfemZyZWUocG5nX3B0ciwgaW5mb19wdHItPnBhbGV0dGUpOwotICAgICAgaW5mb19wdHItPnBhbGV0dGUgPSBOVUxMOwotICAgICAgaW5mb19wdHItPnZhbGlkICY9IH5QTkdfSU5GT19QTFRFOwotICAgICAgaW5mb19wdHItPm51bV9wYWxldHRlID0gMDsKLSAgIH0KLQotI2lmZGVmIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRAotICAgLyogRnJlZSBhbnkgaW1hZ2UgYml0cyBhdHRhY2hlZCB0byB0aGUgaW5mbyBzdHJ1Y3R1cmUgKi8KLSAgIGlmICgobWFzayAmIFBOR19GUkVFX1JPV1MpICYgaW5mb19wdHItPmZyZWVfbWUpCi0gICB7Ci0gICAgICBpZiAoaW5mb19wdHItPnJvd19wb2ludGVycykKLSAgICAgIHsKLSAgICAgICAgIGludCByb3c7Ci0gICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IChpbnQpaW5mb19wdHItPmhlaWdodDsgcm93KyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+cm93X3BvaW50ZXJzW3Jvd10pOwotICAgICAgICAgICAgaW5mb19wdHItPnJvd19wb2ludGVyc1tyb3ddID0gTlVMTDsKLSAgICAgICAgIH0KLSAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5yb3dfcG9pbnRlcnMpOwotICAgICAgICAgaW5mb19wdHItPnJvd19wb2ludGVycyA9IE5VTEw7Ci0gICAgICB9Ci0gICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX0lEQVQ7Ci0gICB9Ci0jZW5kaWYKLQotICAgaWYgKG51bSA9PSAtMSkKLSAgICAgIGluZm9fcHRyLT5mcmVlX21lICY9IH5tYXNrOwotICAgZWxzZQotICAgICAgaW5mb19wdHItPmZyZWVfbWUgJj0gfihtYXNrICYgflBOR19GUkVFX01VTCk7Ci19Ci0KLS8qIFRoaXMgaXMgYW4gaW50ZXJuYWwgcm91dGluZSB0byBmcmVlIGFueSBtZW1vcnkgdGhhdCB0aGUgaW5mbyBzdHJ1Y3QgaXMKLSAqIHBvaW50aW5nIHRvIGJlZm9yZSByZS11c2luZyBpdCBvciBmcmVlaW5nIHRoZSBzdHJ1Y3QgaXRzZWxmLiAgUmVjYWxsCi0gKiB0aGF0IHBuZ19mcmVlKCkgY2hlY2tzIGZvciBOVUxMIHBvaW50ZXJzIGZvciB1cy4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfaW5mb19kZXN0cm95KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2luZm9fZGVzdHJveSIpOwotCi0gICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9BTEwsIC0xKTsKLQotI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKLSAgIGlmIChwbmdfcHRyLT5udW1fY2h1bmtfbGlzdCkKLSAgIHsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rX2xpc3QpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtfbGlzdCA9IE5VTEw7Ci0gICAgICBwbmdfcHRyLT5udW1fY2h1bmtfbGlzdCA9IDA7Ci0gICB9Ci0jZW5kaWYKLQotICAgcG5nX2luZm9faW5pdF8zKCZpbmZvX3B0ciwgcG5nX3NpemVvZihwbmdfaW5mbykpOwotfQotI2VuZGlmIC8qIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGlvX3B0ciBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIKLSAqIGZ1bmN0aW9ucy4gIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZnJlZSBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gKiBwb2ludGVyIGJlZm9yZSBwbmdfd3JpdGVfZGVzdHJveSgpIG9yIHBuZ19yZWFkX2Rlc3Ryb3koKSBhcmUgY2FsbGVkLgotICovCi1wbmdfdm9pZHAgUE5HQVBJCi1wbmdfZ2V0X2lvX3B0cihwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0gICByZXR1cm4gKHBuZ19wdHItPmlvX3B0cik7Ci19Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQotI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQKLS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgaW5wdXQvb3V0cHV0IGZ1bmN0aW9ucyBmb3IgdGhlIFBORyBmaWxlLiAgSWYgeW91Ci0gKiB1c2UgeW91ciBvd24gcmVhZCBvciB3cml0ZSByb3V0aW5lcywgeW91IGNhbiBjYWxsIGVpdGhlciBwbmdfc2V0X3JlYWRfZm4oKQotICogb3IgcG5nX3NldF93cml0ZV9mbigpIGluc3RlYWQgb2YgcG5nX2luaXRfaW8oKS4gIElmIHlvdSBoYXZlIGRlZmluZWQKLSAqIFBOR19OT19TVERJTywgeW91IG11c3QgdXNlIGEgZnVuY3Rpb24gb2YgeW91ciBvd24gYmVjYXVzZSAiRklMRSAqIiBpc24ndAotICogbmVjZXNzYXJpbHkgYXZhaWxhYmxlLgotICovCi12b2lkIFBOR0FQSQotcG5nX2luaXRfaW8ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX0ZJTEVfcCBmcCkKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2luaXRfaW8iKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgcG5nX3B0ci0+aW9fcHRyID0gKHBuZ192b2lkcClmcDsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQKLS8qIENvbnZlcnQgdGhlIHN1cHBsaWVkIHRpbWUgaW50byBhbiBSRkMgMTEyMyBzdHJpbmcgc3VpdGFibGUgZm9yIHVzZSBpbgotICogYSAiQ3JlYXRpb24gVGltZSIgb3Igb3RoZXIgdGV4dC1iYXNlZCB0aW1lIHN0cmluZy4KLSAqLwotcG5nX2NoYXJwIFBOR0FQSQotcG5nX2NvbnZlcnRfdG9fcmZjMTEyMyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdGltZXAgcHRpbWUpCi17Ci0gICBzdGF0aWMgUE5HX0NPTlNUIGNoYXIgc2hvcnRfbW9udGhzWzEyXVs0XSA9Ci0gICAgICAgIHsiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLAotICAgICAgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIn07Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm4gKE5VTEwpOwotICAgaWYgKHBuZ19wdHItPnRpbWVfYnVmZmVyID09IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfcHRyLT50aW1lX2J1ZmZlciA9IChwbmdfY2hhcnApcG5nX21hbGxvYyhwbmdfcHRyLCAocG5nX3VpbnRfMzIpKDI5KgotICAgICAgICAgcG5nX3NpemVvZihjaGFyKSkpOwotICAgfQotCi0jaWZkZWYgVVNFX0ZBUl9LRVlXT1JECi0gICB7Ci0gICAgICBjaGFyIG5lYXJfdGltZV9idWZbMjldOwotICAgICAgcG5nX3NucHJpbnRmNihuZWFyX3RpbWVfYnVmLCAyOSwgIiVkICVzICVkICUwMmQ6JTAyZDolMDJkICswMDAwIiwKLSAgICAgICAgICBwdGltZS0+ZGF5ICUgMzIsIHNob3J0X21vbnRoc1socHRpbWUtPm1vbnRoIC0gMSkgJSAxMl0sCi0gICAgICAgICAgcHRpbWUtPnllYXIsIHB0aW1lLT5ob3VyICUgMjQsIHB0aW1lLT5taW51dGUgJSA2MCwKLSAgICAgICAgICBwdGltZS0+c2Vjb25kICUgNjEpOwotICAgICAgcG5nX21lbWNweShwbmdfcHRyLT50aW1lX2J1ZmZlciwgbmVhcl90aW1lX2J1ZiwKLSAgICAgICAgICAyOSpwbmdfc2l6ZW9mKGNoYXIpKTsKLSAgIH0KLSNlbHNlCi0gICBwbmdfc25wcmludGY2KHBuZ19wdHItPnRpbWVfYnVmZmVyLCAyOSwgIiVkICVzICVkICUwMmQ6JTAyZDolMDJkICswMDAwIiwKLSAgICAgICBwdGltZS0+ZGF5ICUgMzIsIHNob3J0X21vbnRoc1socHRpbWUtPm1vbnRoIC0gMSkgJSAxMl0sCi0gICAgICAgcHRpbWUtPnllYXIsIHB0aW1lLT5ob3VyICUgMjQsIHB0aW1lLT5taW51dGUgJSA2MCwKLSAgICAgICBwdGltZS0+c2Vjb25kICUgNjEpOwotI2VuZGlmCi0gICByZXR1cm4gKChwbmdfY2hhcnApcG5nX3B0ci0+dGltZV9idWZmZXIpOwotfQotI2VuZGlmIC8qIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVEICovCi0KLSNlbmRpZiAvKiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKSAqLwotCi1wbmdfY2hhcnAgUE5HQVBJCi1wbmdfZ2V0X2NvcHlyaWdodChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyKQotewotICAgUE5HX1VOVVNFRChwbmdfcHRyKSAgLyogU2lsZW5jZSBjb21waWxlciB3YXJuaW5nIGFib3V0IHVudXNlZCBwbmdfcHRyICovCi0jaWZkZWYgUE5HX1NUUklOR19DT1BZUklHSFQKLSAgICAgIHJldHVybiBQTkdfU1RSSU5HX0NPUFlSSUdIVAotI2Vsc2UKLSNpZmRlZiBfX1NURENfXwotICAgcmV0dXJuICgocG5nX2NoYXJwKSBQTkdfU1RSSU5HX05FV0xJTkUgXAotICAgICAibGlicG5nIHZlcnNpb24gMS40LjEyIC0gSnVseSAxMCwgMjAxMiIgUE5HX1NUUklOR19ORVdMSU5FIFwKLSAgICAgIkNvcHlyaWdodCAoYykgMTk5OC0yMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbiIgUE5HX1NUUklOR19ORVdMSU5FIFwKLSAgICAgIkNvcHlyaWdodCAoYykgMTk5Ni0xOTk3IEFuZHJlYXMgRGlsZ2VyIiBQTkdfU1RSSU5HX05FV0xJTkUgXAotICAgICAiQ29weXJpZ2h0IChjKSAxOTk1LTE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuIiBcCi0gICAgIFBOR19TVFJJTkdfTkVXTElORSk7Ci0jZWxzZQotICAgICAgcmV0dXJuICgocG5nX2NoYXJwKSAibGlicG5nIHZlcnNpb24gMS40LjEyIC0gSnVseSAxMCwgMjAxMlwKLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvblwKLSAgICAgIENvcHlyaWdodCAoYykgMTk5Ni0xOTk3IEFuZHJlYXMgRGlsZ2VyXAotICAgICAgQ29weXJpZ2h0IChjKSAxOTk1LTE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuIik7Ci0jZW5kaWYKLSNlbmRpZgotfQotCi0vKiBUaGUgZm9sbG93aW5nIHJldHVybiB0aGUgbGlicmFyeSB2ZXJzaW9uIGFzIGEgc2hvcnQgc3RyaW5nIGluIHRoZQotICogZm9ybWF0IDEuMC4wIHRocm91Z2ggOTkuOTkuOTl6ei4gIFRvIGdldCB0aGUgdmVyc2lvbiBvZiAqLmggZmlsZXMKLSAqIHVzZWQgd2l0aCB5b3VyIGFwcGxpY2F0aW9uLCBwcmludCBvdXQgUE5HX0xJQlBOR19WRVJfU1RSSU5HLCB3aGljaAotICogaXMgZGVmaW5lZCBpbiBwbmcuaC4KLSAqIE5vdGU6IG5vdyB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gcG5nX2dldF9saWJwbmdfdmVyKCkgYW5kCi0gKiBwbmdfZ2V0X2hlYWRlcl92ZXIoKS4gIER1ZSB0byB0aGUgdmVyc2lvbl9ubl9ubl9ubiB0eXBlZGVmIGd1YXJkLAotICogaXQgaXMgZ3VhcmFudGVlZCB0aGF0IHBuZy5jIHVzZXMgdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiBwbmcuaC4KLSAqLwotcG5nX2NoYXJwIFBOR0FQSQotcG5nX2dldF9saWJwbmdfdmVyKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICAvKiBWZXJzaW9uIG9mICouYyBmaWxlcyB1c2VkIHdoZW4gYnVpbGRpbmcgbGlicG5nICovCi0gICBQTkdfVU5VU0VEKHBuZ19wdHIpICAvKiBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBuZ19wdHIgKi8KLSAgIHJldHVybiAoKHBuZ19jaGFycCkgUE5HX0xJQlBOR19WRVJfU1RSSU5HKTsKLX0KLQotcG5nX2NoYXJwIFBOR0FQSQotcG5nX2dldF9oZWFkZXJfdmVyKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICAvKiBWZXJzaW9uIG9mICouaCBmaWxlcyB1c2VkIHdoZW4gYnVpbGRpbmcgbGlicG5nICovCi0gICBQTkdfVU5VU0VEKHBuZ19wdHIpICAvKiBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBuZ19wdHIgKi8KLSAgIHJldHVybiAoKHBuZ19jaGFycCkgUE5HX0xJQlBOR19WRVJfU1RSSU5HKTsKLX0KLQotcG5nX2NoYXJwIFBOR0FQSQotcG5nX2dldF9oZWFkZXJfdmVyc2lvbihwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyKQotewotICAgLyogUmV0dXJucyBsb25nZXIgc3RyaW5nIGNvbnRhaW5pbmcgYm90aCB2ZXJzaW9uIGFuZCBkYXRlICovCi0gICBwbmdfcHRyID0gcG5nX3B0cjsgIC8qIFNpbGVuY2UgY29tcGlsZXIgd2FybmluZyBhYm91dCB1bnVzZWQgcG5nX3B0ciAqLwotI2lmZGVmIF9fU1REQ19fCi0gICByZXR1cm4gKChwbmdfY2hhcnApIFBOR19IRUFERVJfVkVSU0lPTl9TVFJJTkcKLSNpZm5kZWYgUE5HX1JFQURfU1VQUE9SVEVECi0gICAiICAgICAoTk8gUkVBRCBTVVBQT1JUKSIKLSNlbmRpZgotICAgUE5HX1NUUklOR19ORVdMSU5FKTsKLSNlbHNlCi0gICByZXR1cm4gKChwbmdfY2hhcnApIFBOR19IRUFERVJfVkVSU0lPTl9TVFJJTkcpOwotI2VuZGlmCi19Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQotI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKLWludCBQTkdBUEkKLXBuZ19oYW5kbGVfYXNfdW5rbm93bihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgY2h1bmtfbmFtZSkKLXsKLSAgIC8qIENoZWNrIGNodW5rX25hbWUgYW5kIHJldHVybiAia2VlcCIgdmFsdWUgaWYgaXQncyBvbiB0aGUgbGlzdCwgZWxzZSAwICovCi0gICBpbnQgaTsKLSAgIHBuZ19ieXRlcCBwOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBjaHVua19uYW1lID09IE5VTEwgfHwgcG5nX3B0ci0+bnVtX2NodW5rX2xpc3Q8PTApCi0gICAgICByZXR1cm4gMDsKLSAgIHAgPSBwbmdfcHRyLT5jaHVua19saXN0ICsgcG5nX3B0ci0+bnVtX2NodW5rX2xpc3QqNSAtIDU7Ci0gICBmb3IgKGkgPSBwbmdfcHRyLT5udW1fY2h1bmtfbGlzdDsgaTsgaS0tLCBwIC09IDUpCi0gICAgICBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcCwgNCkpCi0gICAgICAgIHJldHVybiAoKGludCkqKHAgKyA0KSk7Ci0gICByZXR1cm4gMDsKLX0KLSNlbmRpZgotI2VuZGlmIC8qIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpICovCi0KLSNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKLS8qIFRoaXMgZnVuY3Rpb24sIGFkZGVkIHRvIGxpYnBuZy0xLjAuNmcsIGlzIHVudGVzdGVkLiAqLwotaW50IFBOR0FQSQotcG5nX3Jlc2V0X3pzdHJlYW0ocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICByZXR1cm4gKGluZmxhdGVSZXNldCgmcG5nX3B0ci0+enN0cmVhbSkpOwotfQotI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLwotCi0vKiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCB0byBsaWJwbmctMS4wLjcgKi8KLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlcih2b2lkKQotewotICAgLyogVmVyc2lvbiBvZiAqLmMgZmlsZXMgdXNlZCB3aGVuIGJ1aWxkaW5nIGxpYnBuZyAqLwotICAgcmV0dXJuKChwbmdfdWludF8zMikgUE5HX0xJQlBOR19WRVIpOwotfQotCi0KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpCi0jaWZkZWYgUE5HX1NJWkVfVAotLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS4yLjYgKi8KLSAgIFBOR19FWFRFUk4gcG5nX3NpemVfdCBQTkdBUEkgcG5nX2NvbnZlcnRfc2l6ZSBQTkdBUkcoKHNpemVfdCBzaXplKSk7Ci1wbmdfc2l6ZV90IFBOR0FQSQotcG5nX2NvbnZlcnRfc2l6ZShzaXplX3Qgc2l6ZSkKLXsKLSAgIGlmIChzaXplID4gKHBuZ19zaXplX3QpLTEpCi0gICAgICBQTkdfQUJPUlQoKTsgIC8qIFdlIGhhdmVuJ3QgZ290IGFjY2VzcyB0byBwbmdfcHRyLCBzbyBubyBwbmdfZXJyb3IoKSAqLwotICAgcmV0dXJuICgocG5nX3NpemVfdClzaXplKTsKLX0KLSNlbmRpZiAvKiBQTkdfU0laRV9UICovCi0KLS8qIEFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuMi4zNCBhbmQgMS40LjAgKG1vdmVkIGZyb20gcG5nc2V0LmMpICovCi0jaWZkZWYgUE5HX2NIUk1fU1VQUE9SVEVECi0jaWZkZWYgUE5HX0NIRUNLX2NIUk1fU1VQUE9SVEVECi0KLS8qCi0gKiAgICBNdWx0aXBseSB0d28gMzItYml0IG51bWJlcnMsIFYxIGFuZCBWMiwgdXNpbmcgMzItYml0Ci0gKiAgICBhcml0aG1ldGljLCB0byBwcm9kdWNlIGEgNjQgYml0IHJlc3VsdCBpbiB0aGUgSEkvTE8gd29yZHMuCi0gKgotICogICAgICAgICAgICAgICAgICBBIEIKLSAqICAgICAgICAgICAgICAgIHggQyBECi0gKiAgICAgICAgICAgICAgIC0tLS0tLQotICogICAgICAgICAgICAgIEFEIHx8IEJECi0gKiAgICAgICAgQUMgfHwgQ0IgfHwgMAotICoKLSAqICAgIHdoZXJlIEEgYW5kIEIgYXJlIHRoZSBoaWdoIGFuZCBsb3cgMTYtYml0IHdvcmRzIG9mIFYxLAotICogICAgQyBhbmQgRCBhcmUgdGhlIDE2LWJpdCB3b3JkcyBvZiBWMiwgQUQgaXMgdGhlIHByb2R1Y3Qgb2YKLSAqICAgIEEgYW5kIEQsIGFuZCBYIHx8IFkgaXMgKFggPDwgMTYpICsgWS4KLSovCi0KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nXzY0Yml0X3Byb2R1Y3QobG9uZyB2MSwgbG9uZyB2MiwgdW5zaWduZWQgbG9uZyAqaGlfcHJvZHVjdCwKLSAgIHVuc2lnbmVkIGxvbmcgKmxvX3Byb2R1Y3QpCi17Ci0gICBpbnQgYSwgYiwgYywgZDsKLSAgIGxvbmcgbG8sIGhpLCB4LCB5OwotCi0gICBhID0gKHYxID4+IDE2KSAmIDB4ZmZmZjsKLSAgIGIgPSB2MSAmIDB4ZmZmZjsKLSAgIGMgPSAodjIgPj4gMTYpICYgMHhmZmZmOwotICAgZCA9IHYyICYgMHhmZmZmOwotCi0gICBsbyA9IGIgKiBkOyAgICAgICAgICAgICAgICAgICAvKiBCRCAqLwotICAgeCA9IGEgKiBkICsgYyAqIGI7ICAgICAgICAgICAgLyogQUQgKyBDQiAqLwotICAgeSA9ICgobG8gPj4gMTYpICYgMHhmZmZmKSArIHg7Ci0KLSAgIGxvID0gKGxvICYgMHhmZmZmKSB8ICgoeSAmIDB4ZmZmZikgPDwgMTYpOwotICAgaGkgPSAoeSA+PiAxNikgJiAweGZmZmY7Ci0KLSAgIGhpICs9IGEgKiBjOyAgICAgICAgICAgICAgICAgIC8qIEFDICovCi0KLSAgICpoaV9wcm9kdWN0ID0gKHVuc2lnbmVkIGxvbmcpaGk7Ci0gICAqbG9fcHJvZHVjdCA9ICh1bnNpZ25lZCBsb25nKWxvOwotfQotCi1pbnQgLyogUFJJVkFURSAqLwotcG5nX2NoZWNrX2NIUk1fZml4ZWQocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19maXhlZF9wb2ludCB3aGl0ZV94LCBwbmdfZml4ZWRfcG9pbnQgd2hpdGVfeSwgcG5nX2ZpeGVkX3BvaW50IHJlZF94LAotICAgcG5nX2ZpeGVkX3BvaW50IHJlZF95LCBwbmdfZml4ZWRfcG9pbnQgZ3JlZW5feCwgcG5nX2ZpeGVkX3BvaW50IGdyZWVuX3ksCi0gICBwbmdfZml4ZWRfcG9pbnQgYmx1ZV94LCBwbmdfZml4ZWRfcG9pbnQgYmx1ZV95KQotewotICAgaW50IHJldCA9IDE7Ci0gICB1bnNpZ25lZCBsb25nIHh5X2hpLHh5X2xvLHl4X2hpLHl4X2xvOwotCi0gICBwbmdfZGVidWcoMSwgImluIGZ1bmN0aW9uIHBuZ19jaGVja19jSFJNX2ZpeGVkIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm4gMDsKLQotICAgaWYgKHdoaXRlX3ggPCAwIHx8IHdoaXRlX3kgPD0gMCB8fAotICAgICAgICAgcmVkX3ggPCAwIHx8ICAgcmVkX3kgPCAgMCB8fAotICAgICAgIGdyZWVuX3ggPCAwIHx8IGdyZWVuX3kgPCAgMCB8fAotICAgICAgICBibHVlX3ggPCAwIHx8ICBibHVlX3kgPCAgMCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICJJZ25vcmluZyBhdHRlbXB0IHRvIHNldCBuZWdhdGl2ZSBjaHJvbWF0aWNpdHkgdmFsdWUiKTsKLSAgICAgIHJldCA9IDA7Ci0gICB9Ci0gICBpZiAod2hpdGVfeCA+IChwbmdfZml4ZWRfcG9pbnQpIFBOR19VSU5UXzMxX01BWCB8fAotICAgICAgIHdoaXRlX3kgPiAocG5nX2ZpeGVkX3BvaW50KSBQTkdfVUlOVF8zMV9NQVggfHwKLSAgICAgICAgIHJlZF94ID4gKHBuZ19maXhlZF9wb2ludCkgUE5HX1VJTlRfMzFfTUFYIHx8Ci0gICAgICAgICByZWRfeSA+IChwbmdfZml4ZWRfcG9pbnQpIFBOR19VSU5UXzMxX01BWCB8fAotICAgICAgIGdyZWVuX3ggPiAocG5nX2ZpeGVkX3BvaW50KSBQTkdfVUlOVF8zMV9NQVggfHwKLSAgICAgICBncmVlbl95ID4gKHBuZ19maXhlZF9wb2ludCkgUE5HX1VJTlRfMzFfTUFYIHx8Ci0gICAgICAgIGJsdWVfeCA+IChwbmdfZml4ZWRfcG9pbnQpIFBOR19VSU5UXzMxX01BWCB8fAotICAgICAgICBibHVlX3kgPiAocG5nX2ZpeGVkX3BvaW50KSBQTkdfVUlOVF8zMV9NQVggKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgIklnbm9yaW5nIGF0dGVtcHQgdG8gc2V0IGNocm9tYXRpY2l0eSB2YWx1ZSBleGNlZWRpbmcgMjE0NzQuODMiKTsKLSAgICAgIHJldCA9IDA7Ci0gICB9Ci0gICBpZiAod2hpdGVfeCA+IDEwMDAwMEwgLSB3aGl0ZV95KQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgY0hSTSB3aGl0ZSBwb2ludCIpOwotICAgICAgcmV0ID0gMDsKLSAgIH0KLSAgIGlmIChyZWRfeCA+IDEwMDAwMEwgLSByZWRfeSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGNIUk0gcmVkIHBvaW50Iik7Ci0gICAgICByZXQgPSAwOwotICAgfQotICAgaWYgKGdyZWVuX3ggPiAxMDAwMDBMIC0gZ3JlZW5feSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGNIUk0gZ3JlZW4gcG9pbnQiKTsKLSAgICAgIHJldCA9IDA7Ci0gICB9Ci0gICBpZiAoYmx1ZV94ID4gMTAwMDAwTCAtIGJsdWVfeSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGNIUk0gYmx1ZSBwb2ludCIpOwotICAgICAgcmV0ID0gMDsKLSAgIH0KLQotICAgcG5nXzY0Yml0X3Byb2R1Y3QoZ3JlZW5feCAtIHJlZF94LCBibHVlX3kgLSByZWRfeSwgJnh5X2hpLCAmeHlfbG8pOwotICAgcG5nXzY0Yml0X3Byb2R1Y3QoZ3JlZW5feSAtIHJlZF95LCBibHVlX3ggLSByZWRfeCwgJnl4X2hpLCAmeXhfbG8pOwotCi0gICBpZiAoeHlfaGkgPT0geXhfaGkgJiYgeHlfbG8gPT0geXhfbG8pCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgIklnbm9yaW5nIGF0dGVtcHQgdG8gc2V0IGNIUk0gUkdCIHRyaWFuZ2xlIHdpdGggemVybyBhcmVhIik7Ci0gICAgICByZXQgPSAwOwotICAgfQotCi0gICByZXR1cm4gcmV0OwotfQotI2VuZGlmIC8qIFBOR19DSEVDS19jSFJNX1NVUFBPUlRFRCAqLwotI2VuZGlmIC8qIFBOR19jSFJNX1NVUFBPUlRFRCAqLwotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19jaGVja19JSERSKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfdWludF8zMiB3aWR0aCwgcG5nX3VpbnRfMzIgaGVpZ2h0LCBpbnQgYml0X2RlcHRoLAotICAgaW50IGNvbG9yX3R5cGUsIGludCBpbnRlcmxhY2VfdHlwZSwgaW50IGNvbXByZXNzaW9uX3R5cGUsCi0gICBpbnQgZmlsdGVyX3R5cGUpCi17Ci0gICBpbnQgZXJyb3IgPSAwOwotCi0gICAvKiBDaGVjayBmb3Igd2lkdGggYW5kIGhlaWdodCB2YWxpZCB2YWx1ZXMgKi8KLSAgIGlmICh3aWR0aCA9PSAwKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkltYWdlIHdpZHRoIGlzIHplcm8gaW4gSUhEUiIpOwotICAgICAgZXJyb3IgPSAxOwotICAgfQotCi0gICBpZiAoaGVpZ2h0ID09IDApCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW1hZ2UgaGVpZ2h0IGlzIHplcm8gaW4gSUhEUiIpOwotICAgICAgZXJyb3IgPSAxOwotICAgfQotCi0jaWZkZWYgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKLSAgIGlmICh3aWR0aCA+IHBuZ19wdHItPnVzZXJfd2lkdGhfbWF4IHx8IHdpZHRoID4gUE5HX1VTRVJfV0lEVEhfTUFYKQotI2Vsc2UKLSAgIGlmICh3aWR0aCA+IFBOR19VU0VSX1dJRFRIX01BWCkKLSNlbmRpZgotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkltYWdlIHdpZHRoIGV4Y2VlZHMgdXNlciBsaW1pdCBpbiBJSERSIik7Ci0gICAgICBlcnJvciA9IDE7Ci0gICB9Ci0KLSNpZmRlZiBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRAotICAgaWYgKGhlaWdodCA+IHBuZ19wdHItPnVzZXJfaGVpZ2h0X21heCB8fCBoZWlnaHQgPiBQTkdfVVNFUl9IRUlHSFRfTUFYKQotI2Vsc2UKLSAgIGlmIChoZWlnaHQgPiBQTkdfVVNFUl9IRUlHSFRfTUFYKQotI2VuZGlmCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW1hZ2UgaGVpZ2h0IGV4Y2VlZHMgdXNlciBsaW1pdCBpbiBJSERSIik7Ci0gICAgICBlcnJvciA9IDE7Ci0gICB9Ci0KLSAgIGlmICh3aWR0aCA+IFBOR19VSU5UXzMxX01BWCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGltYWdlIHdpZHRoIGluIElIRFIiKTsKLSAgICAgIGVycm9yID0gMTsKLSAgIH0KLQotICAgaWYgKCBoZWlnaHQgPiBQTkdfVUlOVF8zMV9NQVgpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBpbWFnZSBoZWlnaHQgaW4gSUhEUiIpOwotICAgICAgZXJyb3IgPSAxOwotICAgfQotCi0gICBpZiAoIHdpZHRoID4gKFBOR19VSU5UXzMyX01BWAotICAgICAgICAgICAgICAgICA+PiAzKSAgICAgIC8qIDgtYnl0ZSBSR0JBIHBpeGVscyAqLwotICAgICAgICAgICAgICAgICAtIDY0ICAgICAgIC8qIGJpZ3Jvd2J1ZiBoYWNrICovCi0gICAgICAgICAgICAgICAgIC0gMSAgICAgICAgLyogZmlsdGVyIGJ5dGUgKi8KLSAgICAgICAgICAgICAgICAgLSA3KjggICAgICAvKiByb3VuZGluZyBvZiB3aWR0aCB0byBtdWx0aXBsZSBvZiA4IHBpeGVscyAqLwotICAgICAgICAgICAgICAgICAtIDgpICAgICAgIC8qIGV4dHJhIG1heF9waXhlbF9kZXB0aCBwYWQgKi8KLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJXaWR0aCBpcyB0b28gbGFyZ2UgZm9yIGxpYnBuZyB0byBwcm9jZXNzIHBpeGVscyIpOwotCi0gICAvKiBDaGVjayBvdGhlciB2YWx1ZXMgKi8KLSAgIGlmIChiaXRfZGVwdGggIT0gMSAmJiBiaXRfZGVwdGggIT0gMiAmJiBiaXRfZGVwdGggIT0gNCAmJgotICAgICAgIGJpdF9kZXB0aCAhPSA4ICYmIGJpdF9kZXB0aCAhPSAxNikKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGJpdCBkZXB0aCBpbiBJSERSIik7Ci0gICAgICBlcnJvciA9IDE7Ci0gICB9Ci0KLSAgIGlmIChjb2xvcl90eXBlIDwgMCB8fCBjb2xvcl90eXBlID09IDEgfHwKLSAgICAgICBjb2xvcl90eXBlID09IDUgfHwgY29sb3JfdHlwZSA+IDYpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBjb2xvciB0eXBlIGluIElIRFIiKTsKLSAgICAgIGVycm9yID0gMTsKLSAgIH0KLQotICAgaWYgKCgoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKSAmJiBiaXRfZGVwdGggPiA4KSB8fAotICAgICAgICgoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKLSAgICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSB8fAotICAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpICYmIGJpdF9kZXB0aCA8IDgpKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgY29sb3IgdHlwZS9iaXQgZGVwdGggY29tYmluYXRpb24gaW4gSUhEUiIpOwotICAgICAgZXJyb3IgPSAxOwotICAgfQotCi0gICBpZiAoaW50ZXJsYWNlX3R5cGUgPj0gUE5HX0lOVEVSTEFDRV9MQVNUKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVua25vd24gaW50ZXJsYWNlIG1ldGhvZCBpbiBJSERSIik7Ci0gICAgICBlcnJvciA9IDE7Ci0gICB9Ci0KLSAgIGlmIChjb21wcmVzc2lvbl90eXBlICE9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgaW4gSUhEUiIpOwotICAgICAgZXJyb3IgPSAxOwotICAgfQotCi0jaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKLSAgIC8qIEFjY2VwdCBmaWx0ZXJfbWV0aG9kIDY0IChpbnRyYXBpeGVsIGRpZmZlcmVuY2luZykgb25seSBpZgotICAgICogMS4gTGlicG5nIHdhcyBjb21waWxlZCB3aXRoIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEIGFuZAotICAgICogMi4gTGlicG5nIGRpZCBub3QgcmVhZCBhIFBORyBzaWduYXR1cmUgKHRoaXMgZmlsdGVyX21ldGhvZCBpcyBvbmx5Ci0gICAgKiAgICB1c2VkIGluIFBORyBkYXRhc3RyZWFtcyB0aGF0IGFyZSBlbWJlZGRlZCBpbiBNTkcgZGF0YXN0cmVhbXMpIGFuZAotICAgICogMy4gVGhlIGFwcGxpY2F0aW9uIGNhbGxlZCBwbmdfcGVybWl0X21uZ19mZWF0dXJlcyB3aXRoIGEgbWFzayB0aGF0Ci0gICAgKiAgICBpbmNsdWRlZCBQTkdfRkxBR19NTkdfRklMVEVSXzY0IGFuZAotICAgICogNC4gVGhlIGZpbHRlcl9tZXRob2QgaXMgNjQgYW5kCi0gICAgKiA1LiBUaGUgY29sb3JfdHlwZSBpcyBSR0Igb3IgUkdCQQotICAgICovCi0gICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTkdfU0lHTkFUVVJFKSAmJgotICAgICAgIHBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQpCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTU5HIGZlYXR1cmVzIGFyZSBub3QgYWxsb3dlZCBpbiBhIFBORyBkYXRhc3RyZWFtIik7Ci0KLSAgIGlmIChmaWx0ZXJfdHlwZSAhPSBQTkdfRklMVEVSX1RZUEVfQkFTRSkKLSAgIHsKLSAgICAgIGlmICghKChwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkICYgUE5HX0ZMQUdfTU5HX0ZJTFRFUl82NCkgJiYKLSAgICAgICAgIChmaWx0ZXJfdHlwZSA9PSBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcpICYmCi0gICAgICAgICAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTkdfU0lHTkFUVVJFKSA9PSAwKSAmJgotICAgICAgICAgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8Ci0gICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkpKQotICAgICAgewotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVua25vd24gZmlsdGVyIG1ldGhvZCBpbiBJSERSIik7Ci0gICAgICAgICBlcnJvciA9IDE7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUE5HX1NJR05BVFVSRSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGZpbHRlciBtZXRob2QgaW4gSUhEUiIpOwotICAgICAgICAgZXJyb3IgPSAxOwotICAgICAgfQotICAgfQotCi0jZWxzZQotICAgaWYgKGZpbHRlcl90eXBlICE9IFBOR19GSUxURVJfVFlQRV9CQVNFKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVua25vd24gZmlsdGVyIG1ldGhvZCBpbiBJSERSIik7Ci0gICAgICBlcnJvciA9IDE7Ci0gICB9Ci0jZW5kaWYKLQotICAgaWYgKGVycm9yID09IDEpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgSUhEUiBkYXRhIik7Ci19Ci0jZW5kaWYgLyogZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkgKi8KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvcG5nLmggYi9zcmMvbGlicG5nL3BuZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFkYTdkLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvcG5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzM3ICswLDAgQEAKLQotLyogcG5nLmggLSBoZWFkZXIgZmlsZSBmb3IgUE5HIHJlZmVyZW5jZSBsaWJyYXJ5Ci0gKgotICogbGlicG5nIHZlcnNpb24gMS40LjEyIC0gSnVseSAxMCwgMjAxMgotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTEgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlIChTZWUgTElDRU5TRSwgYmVsb3cpCi0gKgotICogQXV0aG9ycyBhbmQgbWFpbnRhaW5lcnM6Ci0gKiAgbGlicG5nIHZlcnNpb25zIDAuNzEsIE1heSAxOTk1LCB0aHJvdWdoIDAuODgsIEphbnVhcnkgMTk5NjogR3V5IFNjaGFsbmF0Ci0gKiAgbGlicG5nIHZlcnNpb25zIDAuODljLCBKdW5lIDE5OTYsIHRocm91Z2ggMC45NiwgTWF5IDE5OTc6IEFuZHJlYXMgRGlsZ2VyCi0gKiAgbGlicG5nIHZlcnNpb25zIDAuOTcsIEphbnVhcnkgMTk5OCwgdGhyb3VnaCAxLjQuMTIgLSBKdWx5IDEwLCAyMDEyOiBHbGVubgotICogIFNlZSBhbHNvICJDb250cmlidXRpbmcgQXV0aG9ycyIsIGJlbG93LgotICoKLSAqIE5vdGUgYWJvdXQgbGlicG5nIHZlcnNpb24gbnVtYmVyczoKLSAqCi0gKiAgICBEdWUgdG8gdmFyaW91cyBtaXNjb21tdW5pY2F0aW9ucywgdW5mb3Jlc2VlbiBjb2RlIGluY29tcGF0aWJpbGl0aWVzCi0gKiAgICBhbmQgb2NjYXNpb25hbCBmYWN0b3JzIG91dHNpZGUgdGhlIGF1dGhvcnMnIGNvbnRyb2wsIHZlcnNpb24gbnVtYmVyaW5nCi0gKiAgICBvbiB0aGUgbGlicmFyeSBoYXMgbm90IGFsd2F5cyBiZWVuIGNvbnNpc3RlbnQgYW5kIHN0cmFpZ2h0Zm9yd2FyZC4KLSAqICAgIFRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyBtYXR0ZXJzIHNpbmNlIHZlcnNpb24gMC44OWMsIHdoaWNoIHdhcwotICogICAgdGhlIGZpcnN0IHdpZGVseSB1c2VkIHJlbGVhc2U6Ci0gKgotICogICAgc291cmNlICAgICAgICAgICAgICAgICBwbmcuaCAgcG5nLmggIHNoYXJlZC1saWIKLSAqICAgIHZlcnNpb24gICAgICAgICAgICAgICAgc3RyaW5nICAgaW50ICB2ZXJzaW9uCi0gKiAgICAtLS0tLS0tICAgICAgICAgICAgICAgIC0tLS0tLSAtLS0tLSAgLS0tLS0tLS0tLQotICogICAgMC44OWMgIjEuMCBiZXRhIDMiICAgICAwLjg5ICAgICAgODkgIDEuMC44OQotICogICAgMC45MCAgIjEuMCBiZXRhIDQiICAgICAwLjkwICAgICAgOTAgIDAuOTAgIFtzaG91bGQgaGF2ZSBiZWVuIDIuMC45MF0KLSAqICAgIDAuOTUgICIxLjAgYmV0YSA1IiAgICAgMC45NSAgICAgIDk1ICAwLjk1ICBbc2hvdWxkIGhhdmUgYmVlbiAyLjAuOTVdCi0gKiAgICAwLjk2ICAiMS4wIGJldGEgNiIgICAgIDAuOTYgICAgICA5NiAgMC45NiAgW3Nob3VsZCBoYXZlIGJlZW4gMi4wLjk2XQotICogICAgMC45N2IgIjEuMDAuOTcgYmV0YSA3IiAxLjAwLjk3ICAgOTcgIDEuMC4xIFtzaG91bGQgaGF2ZSBiZWVuIDIuMC45N10KLSAqICAgIDAuOTdjICAgICAgICAgICAgICAgICAgMC45NyAgICAgIDk3ICAyLjAuOTcKLSAqICAgIDAuOTggICAgICAgICAgICAgICAgICAgMC45OCAgICAgIDk4ICAyLjAuOTgKLSAqICAgIDAuOTkgICAgICAgICAgICAgICAgICAgMC45OSAgICAgIDk4ICAyLjAuOTkKLSAqICAgIDAuOTlhLW0gICAgICAgICAgICAgICAgMC45OSAgICAgIDk5ICAyLjAuOTkKLSAqICAgIDEuMDAgICAgICAgICAgICAgICAgICAgMS4wMCAgICAgMTAwICAyLjEuMCBbMTAwIHNob3VsZCBiZSAxMDAwMF0KLSAqICAgIDEuMC4wICAgICAgKGZyb20gaGVyZSBvbiwgdGhlICAgMTAwICAyLjEuMCBbMTAwIHNob3VsZCBiZSAxMDAwMF0KLSAqICAgIDEuMC4xICAgICAgIHBuZy5oIHN0cmluZyBpcyAgIDEwMDAxICAyLjEuMAotICogICAgMS4wLjFhLWUgICAgaWRlbnRpY2FsIHRvIHRoZSAgMTAwMDIgIGZyb20gaGVyZSBvbiwgdGhlIHNoYXJlZCBsaWJyYXJ5Ci0gKiAgICAxLjAuMiAgICAgICBzb3VyY2UgdmVyc2lvbikgICAxMDAwMiAgaXMgMi5WIHdoZXJlIFYgaXMgdGhlIHNvdXJjZSBjb2RlCi0gKiAgICAxLjAuMmEtYiAgICAgICAgICAgICAgICAgICAgICAxMDAwMyAgdmVyc2lvbiwgZXhjZXB0IGFzIG5vdGVkLgotICogICAgMS4wLjMgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDMKLSAqICAgIDEuMC4zYS1kICAgICAgICAgICAgICAgICAgICAgIDEwMDA0Ci0gKiAgICAxLjAuNCAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwNAotICogICAgMS4wLjRhLWYgICAgICAgICAgICAgICAgICAgICAgMTAwMDUKLSAqICAgIDEuMC41ICgrIDIgcGF0Y2hlcykgICAgICAgICAgIDEwMDA1Ci0gKiAgICAxLjAuNWEtZCAgICAgICAgICAgICAgICAgICAgICAxMDAwNgotICogICAgMS4wLjVlLXIgICAgICAgICAgICAgICAgICAgICAgMTAxMDAgKG5vdCBzb3VyY2UgY29tcGF0aWJsZSkKLSAqICAgIDEuMC41cy12ICAgICAgICAgICAgICAgICAgICAgIDEwMDA2IChub3QgYmluYXJ5IGNvbXBhdGlibGUpCi0gKiAgICAxLjAuNiAoKyAzIHBhdGNoZXMpICAgICAgICAgICAxMDAwNiAoc3RpbGwgYmluYXJ5IGluY29tcGF0aWJsZSkKLSAqICAgIDEuMC42ZC1mICAgICAgICAgICAgICAgICAgICAgIDEwMDA3IChzdGlsbCBiaW5hcnkgaW5jb21wYXRpYmxlKQotICogICAgMS4wLjZnICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDcKLSAqICAgIDEuMC42aCAgICAgICAgICAgICAgICAgICAgICAgIDEwMDA3ICAxMC42aCAodGVzdGluZyB4eS56IHNvLW51bWJlcmluZykKLSAqICAgIDEuMC42aSAgICAgICAgICAgICAgICAgICAgICAgIDEwMDA3ICAxMC42aQotICogICAgMS4wLjZqICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDcgIDIuMS4wLjZqIChpbmNvbXBhdGlibGUgd2l0aCAxLjAuMCkKLSAqICAgIDEuMC43YmV0YTExLTE0ICAgICAgICBETExOVU0gIDEwMDA3ICAyLjEuMC43YmV0YTExLTE0IChiaW5hcnkgY29tcGF0aWJsZSkKLSAqICAgIDEuMC43YmV0YTE1LTE4ICAgICAgICAgICAxICAgIDEwMDA3ICAyLjEuMC43YmV0YTE1LTE4IChiaW5hcnkgY29tcGF0aWJsZSkKLSAqICAgIDEuMC43cmMxLTIgICAgICAgICAgICAgICAxICAgIDEwMDA3ICAyLjEuMC43cmMxLTIgKGJpbmFyeSBjb21wYXRpYmxlKQotICogICAgMS4wLjcgICAgICAgICAgICAgICAgICAgIDEgICAgMTAwMDcgIChzdGlsbCBjb21wYXRpYmxlKQotICogICAgMS4wLjhiZXRhMS00ICAgICAgICAgICAgIDEgICAgMTAwMDggIDIuMS4wLjhiZXRhMS00Ci0gKiAgICAxLjAuOHJjMSAgICAgICAgICAgICAgICAgMSAgICAxMDAwOCAgMi4xLjAuOHJjMQotICogICAgMS4wLjggICAgICAgICAgICAgICAgICAgIDEgICAgMTAwMDggIDIuMS4wLjgKLSAqICAgIDEuMC45YmV0YTEtNiAgICAgICAgICAgICAxICAgIDEwMDA5ICAyLjEuMC45YmV0YTEtNgotICogICAgMS4wLjlyYzEgICAgICAgICAgICAgICAgIDEgICAgMTAwMDkgIDIuMS4wLjlyYzEKLSAqICAgIDEuMC45YmV0YTctMTAgICAgICAgICAgICAxICAgIDEwMDA5ICAyLjEuMC45YmV0YTctMTAKLSAqICAgIDEuMC45cmMyICAgICAgICAgICAgICAgICAxICAgIDEwMDA5ICAyLjEuMC45cmMyCi0gKiAgICAxLjAuOSAgICAgICAgICAgICAgICAgICAgMSAgICAxMDAwOSAgMi4xLjAuOQotICogICAgMS4wLjEwYmV0YTEgICAgICAgICAgICAgIDEgICAgMTAwMTAgIDIuMS4wLjEwYmV0YTEKLSAqICAgIDEuMC4xMHJjMSAgICAgICAgICAgICAgICAxICAgIDEwMDEwICAyLjEuMC4xMHJjMQotICogICAgMS4wLjEwICAgICAgICAgICAgICAgICAgIDEgICAgMTAwMTAgIDIuMS4wLjEwCi0gKiAgICAxLjAuMTFiZXRhMS0zICAgICAgICAgICAgMSAgICAxMDAxMSAgMi4xLjAuMTFiZXRhMS0zCi0gKiAgICAxLjAuMTFyYzEgICAgICAgICAgICAgICAgMSAgICAxMDAxMSAgMi4xLjAuMTFyYzEKLSAqICAgIDEuMC4xMSAgICAgICAgICAgICAgICAgICAxICAgIDEwMDExICAyLjEuMC4xMQotICogICAgMS4wLjEyYmV0YTEtMiAgICAgICAgICAgIDIgICAgMTAwMTIgIDIuMS4wLjEyYmV0YTEtMgotICogICAgMS4wLjEycmMxICAgICAgICAgICAgICAgIDIgICAgMTAwMTIgIDIuMS4wLjEycmMxCi0gKiAgICAxLjAuMTIgICAgICAgICAgICAgICAgICAgMiAgICAxMDAxMiAgMi4xLjAuMTIKLSAqICAgIDEuMS4wYS1mICAgICAgICAgICAgICAgICAtICAgIDEwMTAwICAyLjEuMS4wYS1mIChicmFuY2ggYWJhbmRvbmVkKQotICogICAgMS4yLjBiZXRhMS0yICAgICAgICAgICAgIDIgICAgMTAyMDAgIDIuMS4yLjBiZXRhMS0yCi0gKiAgICAxLjIuMGJldGEzLTUgICAgICAgICAgICAgMyAgICAxMDIwMCAgMy4xLjIuMGJldGEzLTUKLSAqICAgIDEuMi4wcmMxICAgICAgICAgICAgICAgICAzICAgIDEwMjAwICAzLjEuMi4wcmMxCi0gKiAgICAxLjIuMCAgICAgICAgICAgICAgICAgICAgMyAgICAxMDIwMCAgMy4xLjIuMAotICogICAgMS4yLjFiZXRhMS00ICAgICAgICAgICAgIDMgICAgMTAyMDEgIDMuMS4yLjFiZXRhMS00Ci0gKiAgICAxLjIuMXJjMS0yICAgICAgICAgICAgICAgMyAgICAxMDIwMSAgMy4xLjIuMXJjMS0yCi0gKiAgICAxLjIuMSAgICAgICAgICAgICAgICAgICAgMyAgICAxMDIwMSAgMy4xLjIuMQotICogICAgMS4yLjJiZXRhMS02ICAgICAgICAgICAgMTIgICAgMTAyMDIgIDEyLnNvLjAuMS4yLjJiZXRhMS02Ci0gKiAgICAxLjAuMTNiZXRhMSAgICAgICAgICAgICAxMCAgICAxMDAxMyAgMTAuc28uMC4xLjAuMTNiZXRhMQotICogICAgMS4wLjEzcmMxICAgICAgICAgICAgICAgMTAgICAgMTAwMTMgIDEwLnNvLjAuMS4wLjEzcmMxCi0gKiAgICAxLjIuMnJjMSAgICAgICAgICAgICAgICAxMiAgICAxMDIwMiAgMTIuc28uMC4xLjIuMnJjMQotICogICAgMS4wLjEzICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMTMgIDEwLnNvLjAuMS4wLjEzCi0gKiAgICAxLjIuMiAgICAgICAgICAgICAgICAgICAxMiAgICAxMDIwMiAgMTIuc28uMC4xLjIuMgotICogICAgMS4yLjNyYzEtNiAgICAgICAgICAgICAgMTIgICAgMTAyMDMgIDEyLnNvLjAuMS4yLjNyYzEtNgotICogICAgMS4yLjMgICAgICAgICAgICAgICAgICAgMTIgICAgMTAyMDMgIDEyLnNvLjAuMS4yLjMKLSAqICAgIDEuMi40YmV0YTEtMyAgICAgICAgICAgIDEzICAgIDEwMjA0ICAxMi5zby4wLjEuMi40YmV0YTEtMwotICogICAgMS4wLjE0cmMxICAgICAgICAgICAgICAgMTMgICAgMTAwMTQgIDEwLnNvLjAuMS4wLjE0cmMxCi0gKiAgICAxLjIuNHJjMSAgICAgICAgICAgICAgICAxMyAgICAxMDIwNCAgMTIuc28uMC4xLjIuNHJjMQotICogICAgMS4wLjE0ICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMTQgIDEwLnNvLjAuMS4wLjE0Ci0gKiAgICAxLjIuNCAgICAgICAgICAgICAgICAgICAxMyAgICAxMDIwNCAgMTIuc28uMC4xLjIuNAotICogICAgMS4yLjViZXRhMS0yICAgICAgICAgICAgMTMgICAgMTAyMDUgIDEyLnNvLjAuMS4yLjViZXRhMS0yCi0gKiAgICAxLjAuMTVyYzEtMyAgICAgICAgICAgICAxMCAgICAxMDAxNSAgMTAuc28uMC4xLjAuMTVyYzEtMwotICogICAgMS4yLjVyYzEtMyAgICAgICAgICAgICAgMTMgICAgMTAyMDUgIDEyLnNvLjAuMS4yLjVyYzEtMwotICogICAgMS4wLjE1ICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMTUgIDEwLnNvLjAuMS4wLjE1Ci0gKiAgICAxLjIuNSAgICAgICAgICAgICAgICAgICAxMyAgICAxMDIwNSAgMTIuc28uMC4xLjIuNQotICogICAgMS4yLjZiZXRhMS00ICAgICAgICAgICAgMTMgICAgMTAyMDYgIDEyLnNvLjAuMS4yLjZiZXRhMS00Ci0gKiAgICAxLjAuMTYgICAgICAgICAgICAgICAgICAxMCAgICAxMDAxNiAgMTAuc28uMC4xLjAuMTYKLSAqICAgIDEuMi42ICAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjA2ICAxMi5zby4wLjEuMi42Ci0gKiAgICAxLjIuN2JldGExLTIgICAgICAgICAgICAxMyAgICAxMDIwNyAgMTIuc28uMC4xLjIuN2JldGExLTIKLSAqICAgIDEuMC4xN3JjMSAgICAgICAgICAgICAgIDEwICAgIDEwMDE3ICAxMi5zby4wLjEuMC4xN3JjMQotICogICAgMS4yLjdyYzEgICAgICAgICAgICAgICAgMTMgICAgMTAyMDcgIDEyLnNvLjAuMS4yLjdyYzEKLSAqICAgIDEuMC4xNyAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDE3ICAxMi5zby4wLjEuMC4xNwotICogICAgMS4yLjcgICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMDcgIDEyLnNvLjAuMS4yLjcKLSAqICAgIDEuMi44YmV0YTEtNSAgICAgICAgICAgIDEzICAgIDEwMjA4ICAxMi5zby4wLjEuMi44YmV0YTEtNQotICogICAgMS4wLjE4cmMxLTUgICAgICAgICAgICAgMTAgICAgMTAwMTggIDEyLnNvLjAuMS4wLjE4cmMxLTUKLSAqICAgIDEuMi44cmMxLTUgICAgICAgICAgICAgIDEzICAgIDEwMjA4ICAxMi5zby4wLjEuMi44cmMxLTUKLSAqICAgIDEuMC4xOCAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDE4ICAxMi5zby4wLjEuMC4xOAotICogICAgMS4yLjggICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMDggIDEyLnNvLjAuMS4yLjgKLSAqICAgIDEuMi45YmV0YTEtMyAgICAgICAgICAgIDEzICAgIDEwMjA5ICAxMi5zby4wLjEuMi45YmV0YTEtMwotICogICAgMS4yLjliZXRhNC0xMSAgICAgICAgICAgMTMgICAgMTAyMDkgIDEyLnNvLjAuOVsuMF0KLSAqICAgIDEuMi45cmMxICAgICAgICAgICAgICAgIDEzICAgIDEwMjA5ICAxMi5zby4wLjlbLjBdCi0gKiAgICAxLjIuOSAgICAgICAgICAgICAgICAgICAxMyAgICAxMDIwOSAgMTIuc28uMC45Wy4wXQotICogICAgMS4yLjEwYmV0YTEtNyAgICAgICAgICAgMTMgICAgMTAyMTAgIDEyLnNvLjAuMTBbLjBdCi0gKiAgICAxLjIuMTByYzEtMiAgICAgICAgICAgICAxMyAgICAxMDIxMCAgMTIuc28uMC4xMFsuMF0KLSAqICAgIDEuMi4xMCAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjEwICAxMi5zby4wLjEwWy4wXQotICogICAgMS40LjBiZXRhMS01ICAgICAgICAgICAgMTQgICAgMTA0MDAgIDE0LnNvLjAuMFsuMF0KLSAqICAgIDEuMi4xMWJldGExLTQgICAgICAgICAgIDEzICAgIDEwMjExICAxMi5zby4wLjExWy4wXQotICogICAgMS40LjBiZXRhNy04ICAgICAgICAgICAgMTQgICAgMTA0MDAgIDE0LnNvLjAuMFsuMF0KLSAqICAgIDEuMi4xMSAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjExICAxMi5zby4wLjExWy4wXQotICogICAgMS4yLjEyICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMTIgIDEyLnNvLjAuMTJbLjBdCi0gKiAgICAxLjQuMGJldGE5LTE0ICAgICAgICAgICAxNCAgICAxMDQwMCAgMTQuc28uMC4wWy4wXQotICogICAgMS4yLjEzICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMTMgIDEyLnNvLjAuMTNbLjBdCi0gKiAgICAxLjQuMGJldGExNS0zNiAgICAgICAgICAxNCAgICAxMDQwMCAgMTQuc28uMC4wWy4wXQotICogICAgMS40LjBiZXRhMzctODcgICAgICAgICAgMTQgICAgMTA0MDAgIDE0LnNvLjE0LjBbLjBdCi0gKiAgICAxLjQuMHJjMDEgICAgICAgICAgICAgICAxNCAgICAxMDQwMCAgMTQuc28uMTQuMFsuMF0KLSAqICAgIDEuNC4wYmV0YTg4LTEwOSAgICAgICAgIDE0ICAgIDEwNDAwICAxNC5zby4xNC4wWy4wXQotICogICAgMS40LjByYzAyLTA4ICAgICAgICAgICAgMTQgICAgMTA0MDAgIDE0LnNvLjE0LjBbLjBdCi0gKiAgICAxLjQuMCAgICAgICAgICAgICAgICAgICAxNCAgICAxMDQwMCAgMTQuc28uMTQuMFsuMF0KLSAqICAgIDEuNC4xYmV0YTAxLTAzICAgICAgICAgIDE0ICAgIDEwNDAxICAxNC5zby4xNC4xWy4wXQotICogICAgMS40LjFyYzAxICAgICAgICAgICAgICAgMTQgICAgMTA0MDEgIDE0LnNvLjE0LjFbLjBdCi0gKiAgICAxLjQuMWJldGEwNC0xMiAgICAgICAgICAxNCAgICAxMDQwMSAgMTQuc28uMTQuMVsuMF0KLSAqICAgIDEuNC4xcmMwMi0wNCAgICAgICAgICAgIDE0ICAgIDEwNDAxICAxNC5zby4xNC4xWy4wXQotICogICAgMS40LjEgICAgICAgICAgICAgICAgICAgMTQgICAgMTA0MDEgIDE0LnNvLjE0LjFbLjBdCi0gKiAgICAxLjQuMmJldGEwMSAgICAgICAgICAgICAxNCAgICAxMDQwMiAgMTQuc28uMTQuMlsuMF0KLSAqICAgIDEuNC4ycmMwMi0wNiAgICAgICAgICAgIDE0ICAgIDEwNDAyICAxNC5zby4xNC4yWy4wXQotICogICAgMS40LjIgICAgICAgICAgICAgICAgICAgMTQgICAgMTA0MDIgIDE0LnNvLjE0LjJbLjBdCi0gKiAgICAxLjQuM2JldGEwMS0wNSAgICAgICAgICAxNCAgICAxMDQwMyAgMTQuc28uMTQuM1suMF0KLSAqICAgIDEuNC4zcmMwMS0wMyAgICAgICAgICAgIDE0ICAgIDEwNDAzICAxNC5zby4xNC4zWy4wXQotICogICAgMS40LjMgICAgICAgICAgICAgICAgICAgMTQgICAgMTA0MDMgIDE0LnNvLjE0LjNbLjBdCi0gKiAgICAxLjQuNGJldGEwMS0wOCAgICAgICAgICAxNCAgICAxMDQwNCAgMTQuc28uMTQuNFsuMF0KLSAqICAgIDEuNC40cmMwMS0wNSAgICAgICAgICAgIDE0ICAgIDEwNDA0ICAxNC5zby4xNC40Wy4wXQotICogICAgMS40LjQgICAgICAgICAgICAgICAgICAgMTQgICAgMTA0MDQgIDE0LnNvLjE0LjRbLjBdCi0gKiAgICAxLjQuNWJldGEwMS0wNCAgICAgICAgICAxNCAgICAxMDQwNSAgMTQuc28uMTQuNVsuMF0KLSAqICAgIDEuNC41cmMwMSAgICAgICAgICAgICAgIDE0ICAgIDEwNDA1ICAxNC5zby4xNC41Wy4wXQotICogICAgMS40LjViZXRhMDUtMDcgICAgICAgICAgMTQgICAgMTA0MDUgIDE0LnNvLjE0LjVbLjBdCi0gKiAgICAxLjQuNXJjMDItMDMgICAgICAgICAgICAxNCAgICAxMDQwNSAgMTQuc28uMTQuNVsuMF0KLSAqICAgIDEuNC41ICAgICAgICAgICAgICAgICAgIDE0ICAgIDEwNDA1ICAxNC5zby4xNC41Wy4wXQotICogICAgMS40LjZiZXRhMDEtMDcgICAgICAgICAgMTQgICAgMTA0MDYgIDE0LnNvLjE0LjZbLjBdCi0gKiAgICAxLjQuNnJjMDEgICAgICAgICAgICAgICAxNCAgICAxMDQwNiAgMTQuc28uMTQuNlsuMF0KLSAqICAgIDEuNC42ICAgICAgICAgICAgICAgICAgIDE0ICAgIDEwNDA2ICAxNC5zby4xNC42Wy4wXQotICogICAgMS40LjdyYzAxICAgICAgICAgICAgICAgMTQgICAgMTA0MDcgIDE0LnNvLjE0LjdbLjBdCi0gKiAgICAxLjQuNyAgICAgICAgICAgICAgICAgICAxNCAgICAxMDQwNyAgMTQuc28uMTQuN1suMF0KLSAqICAgIDEuNC44YmV0YTAxLTA1ICAgICAgICAgIDE0ICAgIDEwNDA4ICAxNC5zby4xNC44Wy4wXQotICogICAgMS40LjhyYzAxICAgICAgICAgICAgICAgMTQgICAgMTA0MDggIDE0LnNvLjE0LjhbLjBdCi0gKiAgICAxLjQuOCAgICAgICAgICAgICAgICAgICAxNCAgICAxMDQwOCAgMTQuc28uMTQuOFsuMF0KLSAqICAgIDEuNC45YmV0YTAxICAgICAgICAgICAgIDE0ICAgIDEwNDA5ICAxNC5zby4xNC45Wy4wXQotICogICAgMS40LjlyYzAxICAgICAgICAgICAgICAgMTQgICAgMTA0MDkgIDE0LnNvLjE0LjlbLjBdCi0gKiAgICAxLjQuOSAgICAgICAgICAgICAgICAgICAxNCAgICAxMDQwOSAgMTQuc28uMTQuOVsuMF0KLSAqICAgIDEuNC4xMGJldGEwMSAgICAgICAgICAgIDE0ICAgIDEwNDEwICAxNC5zby4xNC4xMFsuMF0KLSAqICAgIDEuNC4xMHJjMDEtMDIgICAgICAgICAgIDE0ICAgIDEwNDEwICAxNC5zby4xNC4xMFsuMF0KLSAqICAgIDEuNC4xMCAgICAgICAgICAgICAgICAgIDE0ICAgIDEwNDEwICAxNC5zby4xNC4xMFsuMF0KLSAqICAgIDEuNC4xMXJjMDEgICAgICAgICAgICAgIDE0ICAgIDEwNDExICAxNC5zby4xNC4xMVsuMF0KLSAqICAgIDEuNC4xMSAgICAgICAgICAgICAgICAgIDE0ICAgIDEwNDExICAxNC5zby4xNC4xMVsuMF0KLSAqICAgIDEuNC4xMiAgICAgICAgICAgICAgICAgIDE0ICAgIDEwNDEyICAxNC5zby4xNC4xMlsuMF0KLSAqCi0gKiAgICBIZW5jZWZvcnRoIHRoZSBzb3VyY2UgdmVyc2lvbiB3aWxsIG1hdGNoIHRoZSBzaGFyZWQtbGlicmFyeSBtYWpvcgotICogICAgYW5kIG1pbm9yIG51bWJlcnM7IHRoZSBzaGFyZWQtbGlicmFyeSBtYWpvciB2ZXJzaW9uIG51bWJlciB3aWxsIGJlCi0gKiAgICB1c2VkIGZvciBjaGFuZ2VzIGluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGFzIGl0IGlzIGludGVuZGVkLiAgVGhlCi0gKiAgICBQTkdfTElCUE5HX1ZFUiBtYWNybywgd2hpY2ggaXMgbm90IHVzZWQgd2l0aGluIGxpYnBuZyBidXQgaXMgYXZhaWxhYmxlCi0gKiAgICBmb3IgYXBwbGljYXRpb25zLCBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIG9mIHRoZSBmb3JtIHh5eXp6IGNvcnJlc3BvbmRpbmcKLSAqICAgIHRvIHRoZSBzb3VyY2UgdmVyc2lvbiB4LnkueiAobGVhZGluZyB6ZXJvcyBpbiB5IGFuZCB6KS4gIEJldGEgdmVyc2lvbnMKLSAqICAgIHdlcmUgZ2l2ZW4gdGhlIHByZXZpb3VzIHB1YmxpYyByZWxlYXNlIG51bWJlciBwbHVzIGEgbGV0dGVyLCB1bnRpbAotICogICAgdmVyc2lvbiAxLjAuNmo7IGZyb20gdGhlbiBvbiB0aGV5IHdlcmUgZ2l2ZW4gdGhlIHVwY29taW5nIHB1YmxpYwotICogICAgcmVsZWFzZSBudW1iZXIgcGx1cyAiYmV0YU5OIiBvciAicmNOTiIuCi0gKgotICogICAgQmluYXJ5IGluY29tcGF0aWJpbGl0eSBleGlzdHMgb25seSB3aGVuIGFwcGxpY2F0aW9ucyBtYWtlIGRpcmVjdCBhY2Nlc3MKLSAqICAgIHRvIHRoZSBpbmZvX3B0ciBvciBwbmdfcHRyIG1lbWJlcnMgdGhyb3VnaCBwbmcuaCwgYW5kIHRoZSBjb21waWxlZAotICogICAgYXBwbGljYXRpb24gaXMgbG9hZGVkIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4KLSAqCi0gKiAgICBETExOVU0gd2lsbCBjaGFuZ2UgZWFjaCB0aW1lIHRoZXJlIGFyZSBmb3J3YXJkIG9yIGJhY2t3YXJkIGNoYW5nZXMKLSAqICAgIGluIGJpbmFyeSBjb21wYXRpYmlsaXR5IChlLmcuLCB3aGVuIGEgbmV3IGZlYXR1cmUgaXMgYWRkZWQpLgotICoKLSAqIFNlZSBsaWJwbmcudHh0IG9yIGxpYnBuZy4zIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgVGhlIFBORyBzcGVjaWZpY2F0aW9uCi0gKiBpcyBhdmFpbGFibGUgYXMgYSBXM0MgUmVjb21tZW5kYXRpb24gYW5kIGFzIGFuIElTTyBTcGVjaWZpY2F0aW9uLAotICogPGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvUkVDLVBORy0yMDAzMTExMC8KLSAqLwotCi0vKgotICogQ09QWVJJR0hUIE5PVElDRSwgRElTQ0xBSU1FUiwgYW5kIExJQ0VOU0U6Ci0gKgotICogSWYgeW91IG1vZGlmeSBsaWJwbmcgeW91IG1heSBpbnNlcnQgYWRkaXRpb25hbCBub3RpY2VzIGltbWVkaWF0ZWx5IGZvbGxvd2luZwotICogdGhpcyBzZW50ZW5jZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICoKLSAqIGxpYnBuZyB2ZXJzaW9ucyAxLjIuNiwgQXVndXN0IDE1LCAyMDA0LCB0aHJvdWdoIDEuNC4xMiwgSnVseSAxMCwgMjAxMiwgYXJlCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYtMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFuZCBhcmUKLSAqIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0xLjIuNQotICogd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWwgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6Ci0gKgotICogICAgQ29zbWluIFRydXRhCi0gKgotICogbGlicG5nIHZlcnNpb25zIDEuMC43LCBKdWx5IDEsIDIwMDAsIHRocm91Z2ggMS4yLjUsIE9jdG9iZXIgMywgMjAwMiwgYXJlCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFuZCBhcmUKLSAqIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0xLjAuNgotICogd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgotICoKLSAqICAgIFNpbW9uLVBpZXJyZSBDYWRpZXV4Ci0gKiAgICBFcmljIFMuIFJheW1vbmQKLSAqICAgIEdpbGxlcyBWb2xsYW50Ci0gKgotICogYW5kIHdpdGggdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgdG8gdGhlIGRpc2NsYWltZXI6Ci0gKgotICogICAgVGhlcmUgaXMgbm8gd2FycmFudHkgYWdhaW5zdCBpbnRlcmZlcmVuY2Ugd2l0aCB5b3VyIGVuam95bWVudCBvZiB0aGUKLSAqICAgIGxpYnJhcnkgb3IgYWdhaW5zdCBpbmZyaW5nZW1lbnQuICBUaGVyZSBpcyBubyB3YXJyYW50eSB0aGF0IG91cgotICogICAgZWZmb3J0cyBvciB0aGUgbGlicmFyeSB3aWxsIGZ1bGZpbGwgYW55IG9mIHlvdXIgcGFydGljdWxhciBwdXJwb3NlcwotICogICAgb3IgbmVlZHMuICBUaGlzIGxpYnJhcnkgaXMgcHJvdmlkZWQgd2l0aCBhbGwgZmF1bHRzLCBhbmQgdGhlIGVudGlyZQotICogICAgcmlzayBvZiBzYXRpc2ZhY3RvcnkgcXVhbGl0eSwgcGVyZm9ybWFuY2UsIGFjY3VyYWN5LCBhbmQgZWZmb3J0IGlzIHdpdGgKLSAqICAgIHRoZSB1c2VyLgotICoKLSAqIGxpYnBuZyB2ZXJzaW9ucyAwLjk3LCBKYW51YXJ5IDE5OTgsIHRocm91Z2ggMS4wLjYsIE1hcmNoIDIwLCAyMDAwLCBhcmUKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFuZCBhcmUKLSAqIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0wLjk2LAotICogd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgotICoKLSAqICAgIFRvbSBMYW5lCi0gKiAgICBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqICAgIFdpbGxlbSB2YW4gU2NoYWlrCi0gKgotICogbGlicG5nIHZlcnNpb25zIDAuODksIEp1bmUgMTk5NiwgdGhyb3VnaCAwLjk2LCBNYXkgMTk5NywgYXJlCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLSAqIERpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0wLjg4LAotICogd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgotICoKLSAqICAgIEpvaG4gQm93bGVyCi0gKiAgICBLZXZpbiBCcmFjZXkKLSAqICAgIFNhbSBCdXNoZWxsCi0gKiAgICBNYWdudXMgSG9sbWdyZW4KLSAqICAgIEdyZWcgUm9lbG9mcwotICogICAgVG9tIFRhbm5lcgotICoKLSAqIGxpYnBuZyB2ZXJzaW9ucyAwLjUsIE1heSAxOTk1LCB0aHJvdWdoIDAuODgsIEphbnVhcnkgMTk5NiwgYXJlCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCi0gKgotICogRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGNvcHlyaWdodCBhbmQgbGljZW5zZSwgIkNvbnRyaWJ1dGluZyBBdXRob3JzIgotICogaXMgZGVmaW5lZCBhcyB0aGUgZm9sbG93aW5nIHNldCBvZiBpbmRpdmlkdWFsczoKLSAqCi0gKiAgICBBbmRyZWFzIERpbGdlcgotICogICAgRGF2ZSBNYXJ0aW5kYWxlCi0gKiAgICBHdXkgRXJpYyBTY2hhbG5hdAotICogICAgUGF1bCBTY2htaWR0Ci0gKiAgICBUaW0gV2VnbmVyCi0gKgotICogVGhlIFBORyBSZWZlcmVuY2UgTGlicmFyeSBpcyBzdXBwbGllZCAiQVMgSVMiLiAgVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzCi0gKiBhbmQgR3JvdXAgNDIsIEluYy4gZGlzY2xhaW0gYWxsIHdhcnJhbnRpZXMsIGV4cHJlc3NlZCBvciBpbXBsaWVkLAotICogaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZSB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgb2YKLSAqIGZpdG5lc3MgZm9yIGFueSBwdXJwb3NlLiAgVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzIGFuZCBHcm91cCA0MiwgSW5jLgotICogYXNzdW1lIG5vIGxpYWJpbGl0eSBmb3IgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAotICogb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCB3aGljaCBtYXkgcmVzdWx0IGZyb20gdGhlIHVzZSBvZiB0aGUgUE5HCi0gKiBSZWZlcmVuY2UgTGlicmFyeSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCi0gKiBzb3VyY2UgY29kZSwgb3IgcG9ydGlvbnMgaGVyZW9mLCBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLSAqCi0gKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc291cmNlIGNvZGUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQuCi0gKgotICogMi4gQWx0ZXJlZCB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2ggYW5kCi0gKiBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc291cmNlLgotICoKLSAqIDMuIFRoaXMgQ29weXJpZ2h0IG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tCi0gKiAgICBhbnkgc291cmNlIG9yIGFsdGVyZWQgc291cmNlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUaGUgQ29udHJpYnV0aW5nIEF1dGhvcnMgYW5kIEdyb3VwIDQyLCBJbmMuIHNwZWNpZmljYWxseSBwZXJtaXQsIHdpdGhvdXQKLSAqIGZlZSwgYW5kIGVuY291cmFnZSB0aGUgdXNlIG9mIHRoaXMgc291cmNlIGNvZGUgYXMgYSBjb21wb25lbnQgdG8KLSAqIHN1cHBvcnRpbmcgdGhlIFBORyBmaWxlIGZvcm1hdCBpbiBjb21tZXJjaWFsIHByb2R1Y3RzLiAgSWYgeW91IHVzZSB0aGlzCi0gKiBzb3VyY2UgY29kZSBpbiBhIHByb2R1Y3QsIGFja25vd2xlZGdtZW50IGlzIG5vdCByZXF1aXJlZCBidXQgd291bGQgYmUKLSAqIGFwcHJlY2lhdGVkLgotICovCi0KLS8qCi0gKiBBICJwbmdfZ2V0X2NvcHlyaWdodCIgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCBmb3IgY29udmVuaWVudCB1c2UgaW4gImFib3V0IgotICogYm94ZXMgYW5kIHRoZSBsaWtlOgotICoKLSAqICAgICBwcmludGYoIiVzIixwbmdfZ2V0X2NvcHlyaWdodChOVUxMKSk7Ci0gKgotICogQWxzbywgdGhlIFBORyBsb2dvIChpbiBQTkcgZm9ybWF0LCBvZiBjb3Vyc2UpIGlzIHN1cHBsaWVkIGluIHRoZQotICogZmlsZXMgInBuZ2Jhci5wbmciIGFuZCAicG5nYmFyLmpwZyAoODh4MzEpIGFuZCAicG5nbm93LnBuZyIgKDk4eDMxKS4KLSAqLwotCi0vKgotICogTGlicG5nIGlzIE9TSSBDZXJ0aWZpZWQgT3BlbiBTb3VyY2UgU29mdHdhcmUuICBPU0kgQ2VydGlmaWVkIGlzIGEKLSAqIGNlcnRpZmljYXRpb24gbWFyayBvZiB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KLSAqLwotCi0vKgotICogVGhlIGNvbnRyaWJ1dGluZyBhdXRob3JzIHdvdWxkIGxpa2UgdG8gdGhhbmsgYWxsIHRob3NlIHdobyBoZWxwZWQKLSAqIHdpdGggdGVzdGluZywgYnVnIGZpeGVzLCBhbmQgcGF0aWVuY2UuICBUaGlzIHdvdWxkbid0IGhhdmUgYmVlbgotICogcG9zc2libGUgd2l0aG91dCBhbGwgb2YgeW91LgotICoKLSAqIFRoYW5rcyB0byBGcmFuayBKLiBULiBXb2pjaWsgZm9yIGhlbHBpbmcgd2l0aCB0aGUgZG9jdW1lbnRhdGlvbi4KLSAqLwotCi0vKgotICogWTJLIGNvbXBsaWFuY2UgaW4gbGlicG5nOgotICogPT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqICAgIEp1bHkgMTAsIDIwMTIKLSAqCi0gKiAgICBTaW5jZSB0aGUgUE5HIERldmVsb3BtZW50IGdyb3VwIGlzIGFuIGFkLWhvYyBib2R5LCB3ZSBjYW4ndCBtYWtlCi0gKiAgICBhbiBvZmZpY2lhbCBkZWNsYXJhdGlvbi4KLSAqCi0gKiAgICBUaGlzIGlzIHlvdXIgdW5vZmZpY2lhbCBhc3N1cmFuY2UgdGhhdCBsaWJwbmcgZnJvbSB2ZXJzaW9uIDAuNzEgYW5kCi0gKiAgICB1cHdhcmQgdGhyb3VnaCAxLjQuMTIgYXJlIFkySyBjb21wbGlhbnQuICBJdCBpcyBteSBiZWxpZWYgdGhhdCBlYXJsaWVyCi0gKiAgICB2ZXJzaW9ucyB3ZXJlIGFsc28gWTJLIGNvbXBsaWFudC4KLSAqCi0gKiAgICBMaWJwbmcgb25seSBoYXMgdGhyZWUgeWVhciBmaWVsZHMuICBPbmUgaXMgYSAyLWJ5dGUgdW5zaWduZWQgaW50ZWdlcgotICogICAgdGhhdCB3aWxsIGhvbGQgeWVhcnMgdXAgdG8gNjU1MzUuICBUaGUgb3RoZXIgdHdvIGhvbGQgdGhlIGRhdGUgaW4gdGV4dAotICogICAgZm9ybWF0LCBhbmQgd2lsbCBob2xkIHllYXJzIHVwIHRvIDk5OTkuCi0gKgotICogICAgVGhlIGludGVnZXIgaXMKLSAqICAgICAgICAicG5nX3VpbnRfMTYgeWVhciIgaW4gcG5nX3RpbWVfc3RydWN0LgotICoKLSAqICAgIFRoZSBzdHJpbmdzIGFyZQotICogICAgICAgICJwbmdfY2hhcnAgdGltZV9idWZmZXIiIGluIHBuZ19zdHJ1Y3QgYW5kCi0gKiAgICAgICAgIm5lYXJfdGltZV9idWZmZXIiLCB3aGljaCBpcyBhIGxvY2FsIGNoYXJhY3RlciBzdHJpbmcgaW4gcG5nLmMuCi0gKgotICogICAgVGhlcmUgYXJlIHNldmVuIHRpbWUtcmVsYXRlZCBmdW5jdGlvbnM6Ci0gKiAgICAgICAgcG5nLmM6IHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzKCkgaW4gcG5nLmMKLSAqICAgICAgICAgIChmb3JtZXJseSBwbmdfY29udmVydF90b19yZmNfMTE1MigpIGluIGVycm9yKQotICogICAgICAgIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKCkgaW4gcG5nd3JpdGUuYywgY2FsbGVkIGluIHBuZ3dyaXRlLmMKLSAqICAgICAgICBwbmdfY29udmVydF9mcm9tX3RpbWVfdCgpIGluIHBuZ3dyaXRlLmMKLSAqICAgICAgICBwbmdfZ2V0X3RJTUUoKSBpbiBwbmdnZXQuYwotICogICAgICAgIHBuZ19oYW5kbGVfdElNRSgpIGluIHBuZ3J1dGlsLmMsIGNhbGxlZCBpbiBwbmdyZWFkLmMKLSAqICAgICAgICBwbmdfc2V0X3RJTUUoKSBpbiBwbmdzZXQuYwotICogICAgICAgIHBuZ193cml0ZV90SU1FKCkgaW4gcG5nd3V0aWwuYywgY2FsbGVkIGluIHBuZ3dyaXRlLmMKLSAqCi0gKiAgICBBbGwgaGFuZGxlIGRhdGVzIHByb3Blcmx5IGluIGEgWTJLIGVudmlyb25tZW50LiAgVGhlCi0gKiAgICBwbmdfY29udmVydF9mcm9tX3RpbWVfdCgpIGZ1bmN0aW9uIGNhbGxzIGdtdGltZSgpIHRvIGNvbnZlcnQgZnJvbSBzeXN0ZW0KLSAqICAgIGNsb2NrIHRpbWUsIHdoaWNoIHJldHVybnMgKHllYXIgLSAxOTAwKSwgd2hpY2ggd2UgcHJvcGVybHkgY29udmVydCB0bwotICogICAgdGhlIGZ1bGwgNC1kaWdpdCB5ZWFyLiAgVGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IGFwcGxpY2F0aW9ucyB1c2luZwotICogICAgbGlicG5nIGFyZSBub3QgcGFzc2luZyA0LWRpZ2l0IHllYXJzIGludG8gdGhlIHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzKCkKLSAqICAgIGZ1bmN0aW9uLCBvciB0aGF0IHRoZXkgYXJlIGluY29ycmVjdGx5IHBhc3Npbmcgb25seSBhIDItZGlnaXQgeWVhcgotICogICAgaW5zdGVhZCBvZiAieWVhciAtIDE5MDAiIGludG8gdGhlIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKCkgZnVuY3Rpb24sCi0gKiAgICBidXQgdGhpcyBpcyBub3QgdW5kZXIgb3VyIGNvbnRyb2wuICBUaGUgbGlicG5nIGRvY3VtZW50YXRpb24gaGFzIGFsd2F5cwotICogICAgc3RhdGVkIHRoYXQgaXQgd29ya3Mgd2l0aCA0LWRpZ2l0IHllYXJzLCBhbmQgdGhlIEFQSXMgaGF2ZSBiZWVuCi0gKiAgICBkb2N1bWVudGVkIGFzIHN1Y2guCi0gKgotICogICAgVGhlIHRJTUUgY2h1bmsgaXRzZWxmIGlzIGFsc28gWTJLIGNvbXBsaWFudC4gIEl0IHVzZXMgYSAyLWJ5dGUgdW5zaWduZWQKLSAqICAgIGludGVnZXIgdG8gaG9sZCB0aGUgeWVhciwgYW5kIGNhbiBob2xkIHllYXJzIGFzIGxhcmdlIGFzIDY1NTM1LgotICoKLSAqICAgIHpsaWIsIHVwb24gd2hpY2ggbGlicG5nIGRlcGVuZHMsIGlzIGFsc28gWTJLIGNvbXBsaWFudC4gIEl0IGNvbnRhaW5zCi0gKiAgICBubyBkYXRlLXJlbGF0ZWQgY29kZS4KLSAqCi0gKiAgICAgICBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqICAgICAgIGxpYnBuZyBtYWludGFpbmVyCi0gKiAgICAgICBQTkcgRGV2ZWxvcG1lbnQgR3JvdXAKLSAqLwotCi0jaWZuZGVmIFBOR19ICi0jZGVmaW5lIFBOR19ICi0KLS8qIFRoaXMgaXMgbm90IHRoZSBwbGFjZSB0byBsZWFybiBob3cgdG8gdXNlIGxpYnBuZy4gIFRoZSBmaWxlIGxpYnBuZy50eHQKLSAqIGRlc2NyaWJlcyBob3cgdG8gdXNlIGxpYnBuZywgYW5kIHRoZSBmaWxlIGV4YW1wbGUuYyBzdW1tYXJpemVzIGl0Ci0gKiB3aXRoIHNvbWUgY29kZSBvbiB3aGljaCB0byBidWlsZC4gIFRoaXMgZmlsZSBpcyB1c2VmdWwgZm9yIGxvb2tpbmcKLSAqIGF0IHRoZSBhY3R1YWwgZnVuY3Rpb24gZGVmaW5pdGlvbnMgYW5kIHN0cnVjdHVyZSBjb21wb25lbnRzLgotICovCi0KLS8qIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIHBuZy5oIC0gdGhpcyBzaG91bGQgbWF0Y2ggdGhlIHZlcnNpb24gaW4gcG5nLmMgKi8KLSNkZWZpbmUgUE5HX0xJQlBOR19WRVJfU1RSSU5HICIxLjQuMTIiCi0jZGVmaW5lIFBOR19IRUFERVJfVkVSU0lPTl9TVFJJTkcgXAotICAgIiBsaWJwbmcgdmVyc2lvbiAxLjQuMTIgLSBKdWx5IDEwLCAyMDEyXG4iCi0KLSNkZWZpbmUgUE5HX0xJQlBOR19WRVJfU09OVU0gICAxNAotI2RlZmluZSBQTkdfTElCUE5HX1ZFUl9ETExOVU0gIDE0Ci0KLS8qIFRoZXNlIHNob3VsZCBtYXRjaCB0aGUgZmlyc3QgMyBjb21wb25lbnRzIG9mIFBOR19MSUJQTkdfVkVSX1NUUklORzogKi8KLSNkZWZpbmUgUE5HX0xJQlBOR19WRVJfTUFKT1IgICAxCi0jZGVmaW5lIFBOR19MSUJQTkdfVkVSX01JTk9SICAgNAotI2RlZmluZSBQTkdfTElCUE5HX1ZFUl9SRUxFQVNFIDEyCi0vKiBUaGlzIHNob3VsZCBtYXRjaCB0aGUgbnVtZXJpYyBwYXJ0IG9mIHRoZSBmaW5hbCBjb21wb25lbnQgb2YKLSAqIFBOR19MSUJQTkdfVkVSX1NUUklORywgb21pdHRpbmcgYW55IGxlYWRpbmcgemVybzoKLSAqLwotCi0jZGVmaW5lIFBOR19MSUJQTkdfVkVSX0JVSUxEICAwCi0KLS8qIFJlbGVhc2UgU3RhdHVzICovCi0jZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfQUxQSEEgICAgMQotI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX0JFVEEgICAgIDIKLSNkZWZpbmUgUE5HX0xJQlBOR19CVUlMRF9SQyAgICAgICAzCi0jZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfU1RBQkxFICAgNAotI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX1JFTEVBU0VfU1RBVFVTX01BU0sgNwotCi0vKiBSZWxlYXNlLVNwZWNpZmljIEZsYWdzICovCi0jZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfUEFUQ0ggICAgOCAvKiBDYW4gYmUgT1InZWQgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0xJQlBOR19CVUlMRF9TVEFCTEUgb25seSAqLwotI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX1BSSVZBVEUgMTYgLyogQ2Fubm90IGJlIE9SJ2VkIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19MSUJQTkdfQlVJTERfU1BFQ0lBTCAqLwotI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX1NQRUNJQUwgMzIgLyogQ2Fubm90IGJlIE9SJ2VkIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19MSUJQTkdfQlVJTERfUFJJVkFURSAqLwotCi0jZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfQkFTRV9UWVBFIFBOR19MSUJQTkdfQlVJTERfU1RBQkxFCi0KLS8qIENhcmVmdWwgaGVyZS4gIEF0IG9uZSB0aW1lLCBHdXkgd2FudGVkIHRvIHVzZSAwODIsIGJ1dCB0aGF0IHdvdWxkIGJlIG9jdGFsLgotICogV2UgbXVzdCBub3QgaW5jbHVkZSBsZWFkaW5nIHplcm9zLgotICogVmVyc2lvbnMgMC43IHRocm91Z2ggMS4wLjAgd2VyZSBpbiB0aGUgcmFuZ2UgMCB0byAxMDAgaGVyZSAob25seQotICogdmVyc2lvbiAxLjAuMCB3YXMgbWlzLW51bWJlcmVkIDEwMCBpbnN0ZWFkIG9mIDEwMDAwKS4gIEZyb20KLSAqIHZlcnNpb24gMS4wLjEgaXQncyAgICB4eHl5enosIHdoZXJlIHg9bWFqb3IsIHk9bWlub3IsIHo9cmVsZWFzZQotICovCi0jZGVmaW5lIFBOR19MSUJQTkdfVkVSIDEwNDEyIC8qIDEuNC4xMiAqLwotCi0jaWZuZGVmIFBOR19WRVJTSU9OX0lORk9fT05MWQotLyogSW5jbHVkZSB0aGUgY29tcHJlc3Npb24gbGlicmFyeSdzIGhlYWRlciAqLwotI2luY2x1ZGUgInpsaWIuaCIKLSNlbmRpZgotCi0vKiBJbmNsdWRlIGFsbCB1c2VyIGNvbmZpZ3VyYWJsZSBpbmZvLCBpbmNsdWRpbmcgb3B0aW9uYWwgYXNzZW1ibGVyIHJvdXRpbmVzICovCi0jaW5jbHVkZSAicG5nY29uZi5oIgotCi0vKgotICogQWRkZWQgYXQgbGlicG5nLTEuMi44Ci0gKgotICogUmVmIE1TRE46IFByaXZhdGUgYXMgcHJpb3JpdHkgb3ZlciBTcGVjaWFsCi0gKiBWU19GRl9QUklWQVRFQlVJTEQgRmlsZSAqd2FzIG5vdCogYnVpbHQgdXNpbmcgc3RhbmRhcmQgcmVsZWFzZQotICogcHJvY2VkdXJlcy4gSWYgdGhpcyB2YWx1ZSBpcyBnaXZlbiwgdGhlIFN0cmluZ0ZpbGVJbmZvIGJsb2NrIG11c3QKLSAqIGNvbnRhaW4gYSBQcml2YXRlQnVpbGQgc3RyaW5nLgotICoKLSAqIFZTX0ZGX1NQRUNJQUxCVUlMRCBGaWxlICp3YXMqIGJ1aWx0IGJ5IHRoZSBvcmlnaW5hbCBjb21wYW55IHVzaW5nCi0gKiBzdGFuZGFyZCByZWxlYXNlIHByb2NlZHVyZXMgYnV0IGlzIGEgdmFyaWF0aW9uIG9mIHRoZSBzdGFuZGFyZAotICogZmlsZSBvZiB0aGUgc2FtZSB2ZXJzaW9uIG51bWJlci4gSWYgdGhpcyB2YWx1ZSBpcyBnaXZlbiwgdGhlCi0gKiBTdHJpbmdGaWxlSW5mbyBibG9jayBtdXN0IGNvbnRhaW4gYSBTcGVjaWFsQnVpbGQgc3RyaW5nLgotICovCi0KLSNpZmRlZiBQTkdfVVNFUl9QUklWQVRFQlVJTEQKLSMgIGRlZmluZSBQTkdfTElCUE5HX0JVSUxEX1RZUEUgXAotICAgICAgICAgIChQTkdfTElCUE5HX0JVSUxEX0JBU0VfVFlQRSB8IFBOR19MSUJQTkdfQlVJTERfUFJJVkFURSkKLSNlbHNlCi0jICBpZmRlZiBQTkdfTElCUE5HX1NQRUNJQUxCVUlMRAotIyAgICBkZWZpbmUgUE5HX0xJQlBOR19CVUlMRF9UWVBFIFwKLSAgICAgICAgICAgIChQTkdfTElCUE5HX0JVSUxEX0JBU0VfVFlQRSB8IFBOR19MSUJQTkdfQlVJTERfU1BFQ0lBTCkKLSMgIGVsc2UKLSMgICAgZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfVFlQRSAoUE5HX0xJQlBOR19CVUlMRF9CQVNFX1RZUEUpCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgUE5HX1ZFUlNJT05fSU5GT19PTkxZCi0KLS8qIEluaGliaXQgQysrIG5hbWUtbWFuZ2xpbmcgZm9yIGxpYnBuZyBmdW5jdGlvbnMgYnV0IG5vdCBmb3Igc3lzdGVtIGNhbGxzLiAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0vKiBUaGlzIGZpbGUgaXMgYXJyYW5nZWQgaW4gc2V2ZXJhbCBzZWN0aW9ucy4gIFRoZSBmaXJzdCBzZWN0aW9uIGNvbnRhaW5zCi0gKiBzdHJ1Y3R1cmUgYW5kIHR5cGUgZGVmaW5pdGlvbnMuICBUaGUgc2Vjb25kIHNlY3Rpb24gY29udGFpbnMgdGhlIGV4dGVybmFsCi0gKiBsaWJyYXJ5IGZ1bmN0aW9ucywgd2hpbGUgdGhlIHRoaXJkIGhhcyB0aGUgaW50ZXJuYWwgbGlicmFyeSBmdW5jdGlvbnMsCi0gKiB3aGljaCBhcHBsaWNhdGlvbnMgYXJlbid0IGV4cGVjdGVkIHRvIHVzZSBkaXJlY3RseS4KLSAqLwotCi0vKiBWYXJpYWJsZXMgZGVjbGFyZWQgaW4gcG5nLmMgLSBvbmx5IGl0IG5lZWRzIHRvIGRlZmluZSBQTkdfTk9fRVhURVJOICovCi0jaWYgIWRlZmluZWQoUE5HX05PX0VYVEVSTikgfHwgZGVmaW5lZChQTkdfQUxXQVlTX0VYVEVSTikKLS8qIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIEMgZmlsZXMsIHN0b3JlZCBpbiBwbmcuYy4gIFRoaXMgaGFkIGJldHRlciBtYXRjaAotICogdGhlIHZlcnNpb24gYWJvdmUuCi0gKi8KLSNkZWZpbmUgcG5nX2xpYnBuZ192ZXIgcG5nX2dldF9oZWFkZXJfdmVyKE5VTEwpCi0KLSNlbmRpZiAvKiBQTkdfTk9fRVhURVJOICovCi0KLS8qIFRocmVlIGNvbG9yIGRlZmluaXRpb25zLiAgVGhlIG9yZGVyIG9mIHRoZSByZWQsIGdyZWVuLCBhbmQgYmx1ZSwgKGFuZCB0aGUKLSAqIGV4YWN0IHNpemUpIGlzIG5vdCBpbXBvcnRhbnQsIGFsdGhvdWdoIHRoZSBzaXplIG9mIHRoZSBmaWVsZHMgbmVlZCB0bwotICogYmUgcG5nX2J5dGUgb3IgcG5nX3VpbnRfMTYgKGFzIGRlZmluZWQgYmVsb3cpLgotICovCi10eXBlZGVmIHN0cnVjdCBwbmdfY29sb3Jfc3RydWN0Ci17Ci0gICBwbmdfYnl0ZSByZWQ7Ci0gICBwbmdfYnl0ZSBncmVlbjsKLSAgIHBuZ19ieXRlIGJsdWU7Ci19IHBuZ19jb2xvcjsKLXR5cGVkZWYgcG5nX2NvbG9yIEZBUiAqIHBuZ19jb2xvcnA7Ci10eXBlZGVmIHBuZ19jb2xvciBGQVIgKiBGQVIgKiBwbmdfY29sb3JwcDsKLQotdHlwZWRlZiBzdHJ1Y3QgcG5nX2NvbG9yXzE2X3N0cnVjdAotewotICAgcG5nX2J5dGUgaW5kZXg7ICAgIC8qIHVzZWQgZm9yIHBhbGV0dGUgZmlsZXMgKi8KLSAgIHBuZ191aW50XzE2IHJlZDsgICAvKiBmb3IgdXNlIGluIHJlZCBncmVlbiBibHVlIGZpbGVzICovCi0gICBwbmdfdWludF8xNiBncmVlbjsKLSAgIHBuZ191aW50XzE2IGJsdWU7Ci0gICBwbmdfdWludF8xNiBncmF5OyAgLyogZm9yIHVzZSBpbiBncmF5c2NhbGUgZmlsZXMgKi8KLX0gcG5nX2NvbG9yXzE2OwotdHlwZWRlZiBwbmdfY29sb3JfMTYgRkFSICogcG5nX2NvbG9yXzE2cDsKLXR5cGVkZWYgcG5nX2NvbG9yXzE2IEZBUiAqIEZBUiAqIHBuZ19jb2xvcl8xNnBwOwotCi10eXBlZGVmIHN0cnVjdCBwbmdfY29sb3JfOF9zdHJ1Y3QKLXsKLSAgIHBuZ19ieXRlIHJlZDsgICAvKiBmb3IgdXNlIGluIHJlZCBncmVlbiBibHVlIGZpbGVzICovCi0gICBwbmdfYnl0ZSBncmVlbjsKLSAgIHBuZ19ieXRlIGJsdWU7Ci0gICBwbmdfYnl0ZSBncmF5OyAgLyogZm9yIHVzZSBpbiBncmF5c2NhbGUgZmlsZXMgKi8KLSAgIHBuZ19ieXRlIGFscGhhOyAvKiBmb3IgYWxwaGEgY2hhbm5lbCBmaWxlcyAqLwotfSBwbmdfY29sb3JfODsKLXR5cGVkZWYgcG5nX2NvbG9yXzggRkFSICogcG5nX2NvbG9yXzhwOwotdHlwZWRlZiBwbmdfY29sb3JfOCBGQVIgKiBGQVIgKiBwbmdfY29sb3JfOHBwOwotCi0vKgotICogVGhlIGZvbGxvd2luZyB0d28gc3RydWN0dXJlcyBhcmUgdXNlZCBmb3IgdGhlIGluLWNvcmUgcmVwcmVzZW50YXRpb24KLSAqIG9mIHNQTFQgY2h1bmtzLgotICovCi10eXBlZGVmIHN0cnVjdCBwbmdfc1BMVF9lbnRyeV9zdHJ1Y3QKLXsKLSAgIHBuZ191aW50XzE2IHJlZDsKLSAgIHBuZ191aW50XzE2IGdyZWVuOwotICAgcG5nX3VpbnRfMTYgYmx1ZTsKLSAgIHBuZ191aW50XzE2IGFscGhhOwotICAgcG5nX3VpbnRfMTYgZnJlcXVlbmN5OwotfSBwbmdfc1BMVF9lbnRyeTsKLXR5cGVkZWYgcG5nX3NQTFRfZW50cnkgRkFSICogcG5nX3NQTFRfZW50cnlwOwotdHlwZWRlZiBwbmdfc1BMVF9lbnRyeSBGQVIgKiBGQVIgKiBwbmdfc1BMVF9lbnRyeXBwOwotCi0vKiAgV2hlbiB0aGUgZGVwdGggb2YgdGhlIHNQTFQgcGFsZXR0ZSBpcyA4IGJpdHMsIHRoZSBjb2xvciBhbmQgYWxwaGEgc2FtcGxlcwotICogIG9jY3VweSB0aGUgTFNCIG9mIHRoZWlyIHJlc3BlY3RpdmUgbWVtYmVycywgYW5kIHRoZSBNU0Igb2YgZWFjaCBtZW1iZXIKLSAqICBpcyB6ZXJvLWZpbGxlZC4gIFRoZSBmcmVxdWVuY3kgbWVtYmVyIGFsd2F5cyBvY2N1cGllcyB0aGUgZnVsbCAxNiBiaXRzLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHBuZ19zUExUX3N0cnVjdAotewotICAgcG5nX2NoYXJwIG5hbWU7ICAgICAgICAgICAvKiBwYWxldHRlIG5hbWUgKi8KLSAgIHBuZ19ieXRlIGRlcHRoOyAgICAgICAgICAgLyogZGVwdGggb2YgcGFsZXR0ZSBzYW1wbGVzICovCi0gICBwbmdfc1BMVF9lbnRyeXAgZW50cmllczsgIC8qIHBhbGV0dGUgZW50cmllcyAqLwotICAgcG5nX2ludF8zMiBuZW50cmllczsgICAgICAvKiBudW1iZXIgb2YgcGFsZXR0ZSBlbnRyaWVzICovCi19IHBuZ19zUExUX3Q7Ci10eXBlZGVmIHBuZ19zUExUX3QgRkFSICogcG5nX3NQTFRfdHA7Ci10eXBlZGVmIHBuZ19zUExUX3QgRkFSICogRkFSICogcG5nX3NQTFRfdHBwOwotCi0jaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECi0vKiBwbmdfdGV4dCBob2xkcyB0aGUgY29udGVudHMgb2YgYSB0ZXh0L3p0eHQvaXR4dCBjaHVuayBpbiBhIFBORyBmaWxlLAotICogYW5kIHdoZXRoZXIgdGhhdCBjb250ZW50cyBpcyBjb21wcmVzc2VkIG9yIG5vdC4gIFRoZSAia2V5IiBmaWVsZAotICogcG9pbnRzIHRvIGEgcmVndWxhciB6ZXJvLXRlcm1pbmF0ZWQgQyBzdHJpbmcuICBUaGUgInRleHQiLCAibGFuZyIsIGFuZAotICogImxhbmdfa2V5IiBmaWVsZHMgY2FuIGJlIHJlZ3VsYXIgQyBzdHJpbmdzLCBlbXB0eSBzdHJpbmdzLCBvciBOVUxMIHBvaW50ZXJzLgotICogSG93ZXZlciwgdGhlICogc3RydWN0dXJlIHJldHVybmVkIGJ5IHBuZ19nZXRfdGV4dCgpIHdpbGwgYWx3YXlzIGNvbnRhaW4KLSAqIHJlZ3VsYXIgemVyby10ZXJtaW5hdGVkIEMgc3RyaW5ncyAocG9zc2libHkgZW1wdHkpLCBuZXZlciBOVUxMIHBvaW50ZXJzLAotICogc28gdGhleSBjYW4gYmUgc2FmZWx5IHVzZWQgaW4gcHJpbnRmKCkgYW5kIG90aGVyIHN0cmluZy1oYW5kbGluZyBmdW5jdGlvbnMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHBuZ190ZXh0X3N0cnVjdAotewotICAgaW50ICBjb21wcmVzc2lvbjsgICAgICAgLyogY29tcHJlc3Npb24gdmFsdWU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOiB0RVh0LCBub25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiB6VFh0LCBkZWZsYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBpVFh0LCBub25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiBpVFh0LCBkZWZsYXRlICAqLwotICAgcG5nX2NoYXJwIGtleTsgICAgICAgICAgLyoga2V5d29yZCwgMS03OSBjaGFyYWN0ZXIgZGVzY3JpcHRpb24gb2YgInRleHQiICovCi0gICBwbmdfY2hhcnAgdGV4dDsgICAgICAgICAvKiBjb21tZW50LCBtYXkgYmUgYW4gZW1wdHkgc3RyaW5nIChpZSAiIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgTlVMTCBwb2ludGVyICovCi0gICBwbmdfc2l6ZV90IHRleHRfbGVuZ3RoOyAvKiBsZW5ndGggb2YgdGhlIHRleHQgc3RyaW5nICovCi0jaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECi0gICBwbmdfc2l6ZV90IGl0eHRfbGVuZ3RoOyAvKiBsZW5ndGggb2YgdGhlIGl0eHQgc3RyaW5nICovCi0gICBwbmdfY2hhcnAgbGFuZzsgICAgICAgICAvKiBsYW5ndWFnZSBjb2RlLCAwLTc5IGNoYXJhY3RlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgTlVMTCBwb2ludGVyICovCi0gICBwbmdfY2hhcnAgbGFuZ19rZXk7ICAgICAvKiBrZXl3b3JkIHRyYW5zbGF0ZWQgVVRGLTggc3RyaW5nLCAwIG9yIG1vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzIG9yIGEgTlVMTCBwb2ludGVyICovCi0jZW5kaWYKLX0gcG5nX3RleHQ7Ci10eXBlZGVmIHBuZ190ZXh0IEZBUiAqIHBuZ190ZXh0cDsKLXR5cGVkZWYgcG5nX3RleHQgRkFSICogRkFSICogcG5nX3RleHRwcDsKLSNlbmRpZgotCi0vKiBTdXBwb3J0ZWQgY29tcHJlc3Npb24gdHlwZXMgZm9yIHRleHQgaW4gUE5HIGZpbGVzICh0RVh0LCBhbmQgelRYdCkuCi0gKiBUaGUgdmFsdWVzIG9mIHRoZSBQTkdfVEVYVF9DT01QUkVTU0lPTl8gZGVmaW5lcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuICovCi0jZGVmaW5lIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1IgLTMKLSNkZWZpbmUgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdF9XUiAtMgotI2RlZmluZSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FICAgIC0xCi0jZGVmaW5lIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQgICAgIDAKLSNkZWZpbmUgUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORSAgICAgMQotI2RlZmluZSBQTkdfSVRYVF9DT01QUkVTU0lPTl96VFh0ICAgICAyCi0jZGVmaW5lIFBOR19URVhUX0NPTVBSRVNTSU9OX0xBU1QgICAgIDMgIC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCi0KLS8qIHBuZ190aW1lIGlzIGEgd2F5IHRvIGhvbGQgdGhlIHRpbWUgaW4gYW4gbWFjaGluZSBpbmRlcGVuZGVudCB3YXkuCi0gKiBUd28gY29udmVyc2lvbnMgYXJlIHByb3ZpZGVkLCBib3RoIGZyb20gdGltZV90IGFuZCBzdHJ1Y3QgdG0uICBUaGVyZQotICogaXMgbm8gcG9ydGFibGUgd2F5IHRvIGNvbnZlcnQgdG8gZWl0aGVyIG9mIHRoZXNlIHN0cnVjdHVyZXMsIGFzIGZhcgotICogYXMgSSBrbm93LiAgSWYgeW91IGtub3cgb2YgYSBwb3J0YWJsZSB3YXksIHNlbmQgaXQgdG8gbWUuICBBcyBhIHNpZGUKLSAqIG5vdGUgLSBQTkcgaGFzIGFsd2F5cyBiZWVuIFllYXIgMjAwMCBjb21wbGlhbnQhCi0gKi8KLXR5cGVkZWYgc3RydWN0IHBuZ190aW1lX3N0cnVjdAotewotICAgcG5nX3VpbnRfMTYgeWVhcjsgLyogZnVsbCB5ZWFyLCBhcyBpbiwgMTk5NSAqLwotICAgcG5nX2J5dGUgbW9udGg7ICAgLyogbW9udGggb2YgeWVhciwgMSAtIDEyICovCi0gICBwbmdfYnl0ZSBkYXk7ICAgICAvKiBkYXkgb2YgbW9udGgsIDEgLSAzMSAqLwotICAgcG5nX2J5dGUgaG91cjsgICAgLyogaG91ciBvZiBkYXksIDAgLSAyMyAqLwotICAgcG5nX2J5dGUgbWludXRlOyAgLyogbWludXRlIG9mIGhvdXIsIDAgLSA1OSAqLwotICAgcG5nX2J5dGUgc2Vjb25kOyAgLyogc2Vjb25kIG9mIG1pbnV0ZSwgMCAtIDYwIChmb3IgbGVhcCBzZWNvbmRzKSAqLwotfSBwbmdfdGltZTsKLXR5cGVkZWYgcG5nX3RpbWUgRkFSICogcG5nX3RpbWVwOwotdHlwZWRlZiBwbmdfdGltZSBGQVIgKiBGQVIgKiBwbmdfdGltZXBwOwotCi0jaWYgZGVmaW5lZChQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKSB8fCBcCi0gZGVmaW5lZChQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVEKQotLyogcG5nX3Vua25vd25fY2h1bmsgaXMgYSBzdHJ1Y3R1cmUgdG8gaG9sZCBxdWV1ZWQgY2h1bmtzIGZvciB3aGljaCB0aGVyZSBpcwotICogbm8gc3BlY2lmaWMgc3VwcG9ydC4gIFRoZSBpZGVhIGlzIHRoYXQgd2UgY2FuIHVzZSB0aGlzIHRvIHF1ZXVlCi0gKiB1cCBwcml2YXRlIGNodW5rcyBmb3Igb3V0cHV0IGV2ZW4gdGhvdWdoIHRoZSBsaWJyYXJ5IGRvZXNuJ3QgYWN0dWFsbHkKLSAqIGtub3cgYWJvdXQgdGhlaXIgc2VtYW50aWNzLgotICovCi10eXBlZGVmIHN0cnVjdCBwbmdfdW5rbm93bl9jaHVua190Ci17Ci0gICAgcG5nX2J5dGUgbmFtZVs1XTsKLSAgICBwbmdfYnl0ZSAqZGF0YTsKLSAgICBwbmdfc2l6ZV90IHNpemU7Ci0KLSAgICAvKiBsaWJwbmctdXNpbmcgYXBwbGljYXRpb25zIHNob3VsZCBOT1QgZGlyZWN0bHkgbW9kaWZ5IHRoaXMgYnl0ZS4gKi8KLSAgICBwbmdfYnl0ZSBsb2NhdGlvbjsgLyogbW9kZSBvZiBvcGVyYXRpb24gYXQgcmVhZCB0aW1lICovCi19Ci1wbmdfdW5rbm93bl9jaHVuazsKLXR5cGVkZWYgcG5nX3Vua25vd25fY2h1bmsgRkFSICogcG5nX3Vua25vd25fY2h1bmtwOwotdHlwZWRlZiBwbmdfdW5rbm93bl9jaHVuayBGQVIgKiBGQVIgKiBwbmdfdW5rbm93bl9jaHVua3BwOwotI2VuZGlmCi0KLS8qIHBuZ19pbmZvIGlzIGEgc3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIGluZm9ybWF0aW9uIGluIGEgUE5HIGZpbGUgc28KLSAqIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbiBmaW5kIG91dCB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBpbWFnZS4KLSAqIElmIHlvdSBhcmUgcmVhZGluZyB0aGUgZmlsZSwgdGhpcyBzdHJ1Y3R1cmUgd2lsbCB0ZWxsIHlvdSB3aGF0IGlzCi0gKiBpbiB0aGUgUE5HIGZpbGUuICBJZiB5b3UgYXJlIHdyaXRpbmcgdGhlIGZpbGUsIGZpbGwgaW4gdGhlIGluZm9ybWF0aW9uCi0gKiB5b3Ugd2FudCB0byBwdXQgaW50byB0aGUgUE5HIGZpbGUsIHRoZW4gY2FsbCBwbmdfd3JpdGVfaW5mbygpLgotICogVGhlIG5hbWVzIGNob3NlbiBzaG91bGQgYmUgdmVyeSBjbG9zZSB0byB0aGUgUE5HIHNwZWNpZmljYXRpb24sIHNvCi0gKiBjb25zdWx0IHRoYXQgZG9jdW1lbnQgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZWFuaW5nIG9mIGVhY2ggZmllbGQuCi0gKgotICogV2l0aCBsaWJwbmcgPCAwLjk1LCBpdCB3YXMgb25seSBwb3NzaWJsZSB0byBkaXJlY3RseSBzZXQgYW5kIHJlYWQgdGhlCi0gKiB0aGUgdmFsdWVzIGluIHRoZSBwbmdfaW5mb19zdHJ1Y3QsIHdoaWNoIG1lYW50IHRoYXQgdGhlIGNvbnRlbnRzIGFuZAotICogb3JkZXIgb2YgdGhlIHZhbHVlcyBoYWQgdG8gcmVtYWluIGZpeGVkLiAgV2l0aCBsaWJwbmcgMC45NSBhbmQgbGF0ZXIsCi0gKiBob3dldmVyLCB0aGVyZSBhcmUgbm93IGZ1bmN0aW9ucyB0aGF0IGFic3RyYWN0IHRoZSBjb250ZW50cyBvZgotICogcG5nX2luZm9fc3RydWN0IGZyb20gdGhlIGFwcGxpY2F0aW9uLCBzbyB0aGlzIG1ha2VzIGl0IGVhc2llciB0byB1c2UKLSAqIGxpYnBuZyB3aXRoIGR5bmFtaWMgbGlicmFyaWVzLCBhbmQgZXZlbiBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UKLSAqIGxpYnJhcmllcyB0aGF0IGRvbid0IGhhdmUgYWxsIG9mIHRoZSBsaWJwbmcgYW5jaWxsYXJ5IGNodW5rLWhhbmRpbmcKLSAqIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogSW4gYW55IGNhc2UsIHRoZSBvcmRlciBvZiB0aGUgcGFyYW1ldGVycyBpbiBwbmdfaW5mb19zdHJ1Y3Qgc2hvdWxkIE5PVAotICogYmUgY2hhbmdlZCBmb3IgYXMgbG9uZyBhcyBwb3NzaWJsZSB0byBrZWVwIGNvbXBhdGliaWxpdHkgd2l0aCBhcHBsaWNhdGlvbnMKLSAqIHRoYXQgdXNlIHRoZSBvbGQgZGlyZWN0LWFjY2VzcyBtZXRob2Qgd2l0aCBwbmdfaW5mb19zdHJ1Y3QuCi0gKgotICogVGhlIGZvbGxvd2luZyBtZW1iZXJzIG1heSBoYXZlIGFsbG9jYXRlZCBzdG9yYWdlIGF0dGFjaGVkIHRoYXQgc2hvdWxkIGJlCi0gKiBjbGVhbmVkIHVwIGJlZm9yZSB0aGUgc3RydWN0dXJlIGlzIGRpc2NhcmRlZDogcGFsZXR0ZSwgdHJhbnMsIHRleHQsCi0gKiBwY2FsX3B1cnBvc2UsIHBjYWxfdW5pdHMsIHBjYWxfcGFyYW1zLCBoaXN0LCBpY2NwX25hbWUsIGljY3BfcHJvZmlsZSwKLSAqIHNwbHRfcGFsZXR0ZXMsIHNjYWxfdW5pdCwgcm93X3BvaW50ZXJzLCBhbmQgdW5rbm93bnMuICAgQnkgZGVmYXVsdCwgdGhlc2UKLSAqIGFyZSBhdXRvbWF0aWNhbGx5IGZyZWVkIHdoZW4gdGhlIGluZm8gc3RydWN0dXJlIGlzIGRlYWxsb2NhdGVkLCBpZiB0aGV5IHdlcmUKLSAqIGFsbG9jYXRlZCBpbnRlcm5hbGx5IGJ5IGxpYnBuZy4gIFRoaXMgYmVoYXZpb3IgY2FuIGJlIGNoYW5nZWQgYnkgbWVhbnMKLSAqIG9mIHRoZSBwbmdfZGF0YV9mcmVlcigpIGZ1bmN0aW9uLgotICoKLSAqIE1vcmUgYWxsb2NhdGlvbiBkZXRhaWxzOiBhbGwgdGhlIGNodW5rLXJlYWRpbmcgZnVuY3Rpb25zIHRoYXQKLSAqIGNoYW5nZSB0aGVzZSBtZW1iZXJzIGdvIHRocm91Z2ggdGhlIGNvcnJlc3BvbmRpbmcgcG5nX3NldF8qCi0gKiBmdW5jdGlvbnMuICBBIGZ1bmN0aW9uIHRvIGNsZWFyIHRoZXNlIG1lbWJlcnMgaXMgYXZhaWxhYmxlOiBzZWUKLSAqIHBuZ19mcmVlX2RhdGEoKS4gIFRoZSBwbmdfc2V0XyogZnVuY3Rpb25zIGRvIG5vdCBkZXBlbmQgb24gYmVpbmcKLSAqIGFibGUgdG8gcG9pbnQgaW5mbyBzdHJ1Y3R1cmUgbWVtYmVycyB0byBhbnkgb2YgdGhlIHN0b3JhZ2UgdGhleSBhcmUKLSAqIHBhc3NlZCAodGhleSBtYWtlIHRoZWlyIG93biBjb3BpZXMpLCBFWENFUFQgdGhhdCB0aGUgcG5nX3NldF90ZXh0Ci0gKiBmdW5jdGlvbnMgdXNlIHRoZSBzYW1lIHN0b3JhZ2UgcGFzc2VkIHRvIHRoZW0gaW4gdGhlIHRleHRfcHRyIG9yCi0gKiBpdHh0X3B0ciBzdHJ1Y3R1cmUgYXJndW1lbnQsIGFuZCB0aGUgcG5nX3NldF9yb3dzIGFuZCBwbmdfc2V0X3Vua25vd25zCi0gKiBmdW5jdGlvbnMgZG8gbm90IG1ha2UgdGhlaXIgb3duIGNvcGllcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgcG5nX2luZm9fc3RydWN0Ci17Ci0gICAvKiB0aGUgZm9sbG93aW5nIGFyZSBuZWNlc3NhcnkgZm9yIGV2ZXJ5IFBORyBmaWxlICovCi0gICBwbmdfdWludF8zMiB3aWR0aCBQTkdfREVQU1RSVUNUOyAgLyogd2lkdGggb2YgaW1hZ2UgaW4gcGl4ZWxzIChmcm9tIElIRFIpICovCi0gICBwbmdfdWludF8zMiBoZWlnaHQgUE5HX0RFUFNUUlVDVDsgLyogaGVpZ2h0IG9mIGltYWdlIGluIHBpeGVscyAoZnJvbSBJSERSKSAqLwotICAgcG5nX3VpbnRfMzIgdmFsaWQgUE5HX0RFUFNUUlVDVDsgIC8qIHZhbGlkIGNodW5rIGRhdGEgKHNlZSBQTkdfSU5GT18KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxvdykgKi8KLSAgIHBuZ19zaXplX3Qgcm93Ynl0ZXMgUE5HX0RFUFNUUlVDVDsgLyogYnl0ZXMgbmVlZGVkIHRvIGhvbGQgYW4gdW50cmFuc2Zvcm1lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgKi8KLSAgIHBuZ19jb2xvcnAgcGFsZXR0ZSBQTkdfREVQU1RSVUNUOyAgICAgIC8qIGFycmF5IG9mIGNvbG9yIHZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbGlkICYgUE5HX0lORk9fUExURSkgKi8KLSAgIHBuZ191aW50XzE2IG51bV9wYWxldHRlIFBOR19ERVBTVFJVQ1Q7IC8qIG51bWJlciBvZiBjb2xvciBlbnRyaWVzIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFsZXR0ZSIgKFBMVEUpICovCi0gICBwbmdfdWludF8xNiBudW1fdHJhbnMgUE5HX0RFUFNUUlVDVDsgICAvKiBudW1iZXIgb2YgdHJhbnNwYXJlbnQgcGFsZXR0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgKHRSTlMpICovCi0gICBwbmdfYnl0ZSBiaXRfZGVwdGggUE5HX0RFUFNUUlVDVDsgICAgICAvKiAxLCAyLCA0LCA4LCBvciAxNiBiaXRzL2NoYW5uZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcm9tIElIRFIpICovCi0gICBwbmdfYnl0ZSBjb2xvcl90eXBlIFBOR19ERVBTVFJVQ1Q7ICAgICAvKiBzZWUgUE5HX0NPTE9SX1RZUEVfIGJlbG93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJvbSBJSERSKSAqLwotICAgLyogVGhlIGZvbGxvd2luZyB0aHJlZSBzaG91bGQgaGF2ZSBiZWVuIG5hbWVkICpfbWV0aG9kIG5vdCAqX3R5cGUgKi8KLSAgIHBuZ19ieXRlIGNvbXByZXNzaW9uX3R5cGUgUE5HX0RFUFNUUlVDVDsgLyogbXVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSAoSUhEUikgKi8KLSAgIHBuZ19ieXRlIGZpbHRlcl90eXBlIFBOR19ERVBTVFJVQ1Q7ICAgIC8qIG11c3QgYmUgUE5HX0ZJTFRFUl9UWVBFX0JBU0UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcm9tIElIRFIpICovCi0gICBwbmdfYnl0ZSBpbnRlcmxhY2VfdHlwZSBQTkdfREVQU1RSVUNUOyAvKiBPbmUgb2YgUE5HX0lOVEVSTEFDRV9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9BREFNNyAqLwotCi0gICAvKiBUaGUgZm9sbG93aW5nIGlzIGluZm9ybWF0aW9uYWwgb25seSBvbiByZWFkLCBhbmQgbm90IHVzZWQgb24gd3JpdGVzLiAqLwotICAgcG5nX2J5dGUgY2hhbm5lbHMgUE5HX0RFUFNUUlVDVDsgICAgICAgLyogbnVtYmVyIG9mIGRhdGEgY2hhbm5lbHMgcGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbCAoMSwgMiwgMywgNCkgKi8KLSAgIHBuZ19ieXRlIHBpeGVsX2RlcHRoIFBOR19ERVBTVFJVQ1Q7ICAgIC8qIG51bWJlciBvZiBiaXRzIHBlciBwaXhlbCAqLwotICAgcG5nX2J5dGUgc3BhcmVfYnl0ZSBQTkdfREVQU1RSVUNUOyAgICAgLyogdG8gYWxpZ24gdGhlIGRhdGEsIGFuZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZSB1c2UgKi8KLSAgIHBuZ19ieXRlIHNpZ25hdHVyZVs4XSBQTkdfREVQU1RSVUNUOyAgIC8qIG1hZ2ljIGJ5dGVzIHJlYWQgYnkgbGlicG5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHN0YXJ0IG9mIGZpbGUgKi8KLQotICAgLyogVGhlIHJlc3Qgb2YgdGhlIGRhdGEgaXMgb3B0aW9uYWwuICBJZiB5b3UgYXJlIHJlYWRpbmcsIGNoZWNrIHRoZQotICAgICogdmFsaWQgZmllbGQgdG8gc2VlIGlmIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGVzZSBhcmUgdmFsaWQuICBJZiB5b3UKLSAgICAqIGFyZSB3cml0aW5nLCBzZXQgdGhlIHZhbGlkIGZpZWxkIHRvIHRob3NlIGNodW5rcyB5b3Ugd2FudCB3cml0dGVuLAotICAgICogYW5kIGluaXRpYWxpemUgdGhlIGFwcHJvcHJpYXRlIGZpZWxkcyBiZWxvdy4KLSAgICAqLwotCi0jaWYgZGVmaW5lZChQTkdfZ0FNQV9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkKLSAgIC8qIFRoZSBnQU1BIGNodW5rIGRlc2NyaWJlcyB0aGUgZ2FtbWEgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBzeXN0ZW0KLSAgICAqIG9uIHdoaWNoIHRoZSBpbWFnZSB3YXMgY3JlYXRlZCwgbm9ybWFsbHkgaW4gdGhlIHJhbmdlIFsxLjAsIDIuNV0uCi0gICAgKiBEYXRhIGlzIHZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX2dBTUEpIGlzIG5vbi16ZXJvLgotICAgICovCi0gICBmbG9hdCBnYW1tYSBQTkdfREVQU1RSVUNUOyAvKiBnYW1tYSB2YWx1ZSBvZiBpbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCAmIFBOR19JTkZPX2dBTUEpICovCi0jZW5kaWYKLQotI2lmZGVmIFBOR19zUkdCX1NVUFBPUlRFRAotICAgIC8qIEdSLVAsIDAuOTZhICovCi0gICAgLyogRGF0YSB2YWxpZCBpZiAodmFsaWQgJiBQTkdfSU5GT19zUkdCKSBub24temVyby4gKi8KLSAgIHBuZ19ieXRlIHNyZ2JfaW50ZW50IFBOR19ERVBTVFJVQ1Q7IC8qIHNSR0IgcmVuZGVyaW5nIGludGVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAsIDEsIDIsIG9yIDNdICovCi0jZW5kaWYKLQotI2lmZGVmIFBOR19URVhUX1NVUFBPUlRFRAotICAgLyogVGhlIHRFWHQsIGFuZCB6VFh0IGNodW5rcyBjb250YWluIGh1bWFuLXJlYWRhYmxlIHRleHR1YWwgZGF0YSBpbgotICAgICogdW5jb21wcmVzc2VkLCBjb21wcmVzc2VkLCBhbmQgb3B0aW9uYWxseSBjb21wcmVzc2VkIGZvcm1zLCByZXNwZWN0aXZlbHkuCi0gICAgKiBUaGUgZGF0YSBpbiAidGV4dCIgaXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdW5jb21wcmVzc2VkLAotICAgICogbnVsbC10ZXJtaW5hdGVkIEMgc3RyaW5ncy4gRWFjaCBjaHVuayBoYXMgYSBrZXl3b3JkIHRoYXQgZGVzY3JpYmVzIHRoZQotICAgICogdGV4dHVhbCBkYXRhIGNvbnRhaW5lZCBpbiB0aGF0IGNodW5rLiAgS2V5d29yZHMgYXJlIG5vdCByZXF1aXJlZCB0byBiZQotICAgICogdW5pcXVlLCBhbmQgdGhlIHRleHQgc3RyaW5nIG1heSBiZSBlbXB0eS4gIEFueSBudW1iZXIgb2YgdGV4dCBjaHVua3MgbWF5Ci0gICAgKiBiZSBpbiBhbiBpbWFnZS4KLSAgICAqLwotICAgaW50IG51bV90ZXh0IFBOR19ERVBTVFJVQ1Q7IC8qIG51bWJlciBvZiBjb21tZW50cyByZWFkL3RvIHdyaXRlICovCi0gICBpbnQgbWF4X3RleHQgUE5HX0RFUFNUUlVDVDsgLyogY3VycmVudCBzaXplIG9mIHRleHQgYXJyYXkgKi8KLSAgIHBuZ190ZXh0cCB0ZXh0IFBOR19ERVBTVFJVQ1Q7IC8qIGFycmF5IG9mIGNvbW1lbnRzIHJlYWQvdG8gd3JpdGUgKi8KLSNlbmRpZiAvKiBQTkdfVEVYVF9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBOR190SU1FX1NVUFBPUlRFRAotICAgLyogVGhlIHRJTUUgY2h1bmsgaG9sZHMgdGhlIGxhc3QgdGltZSB0aGUgZGlzcGxheWVkIGltYWdlIGRhdGEgd2FzCi0gICAgKiBtb2RpZmllZC4gIFNlZSB0aGUgcG5nX3RpbWUgc3RydWN0IGZvciB0aGUgY29udGVudHMgb2YgdGhpcyBzdHJ1Y3QuCi0gICAgKi8KLSAgIHBuZ190aW1lIG1vZF90aW1lIFBOR19ERVBTVFJVQ1Q7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19zQklUX1NVUFBPUlRFRAotICAgLyogVGhlIHNCSVQgY2h1bmsgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgaGlnaC1vcmRlciBiaXRzCi0gICAgKiBpbiB0aGUgcGl4ZWwgZGF0YS4gIFZhbHVlcyBhcmUgaW4gdGhlIHJhbmdlIFsxLCBiaXRfZGVwdGhdLCBhbmQgYXJlCi0gICAgKiBvbmx5IHNwZWNpZmllZCBmb3IgdGhlIGNoYW5uZWxzIGluIHRoZSBwaXhlbCBkYXRhLiAgVGhlIGNvbnRlbnRzIG9mCi0gICAgKiB0aGUgbG93LW9yZGVyIGJpdHMgaXMgbm90IHNwZWNpZmllZC4gIERhdGEgaXMgdmFsaWQgaWYKLSAgICAqICh2YWxpZCAmIFBOR19JTkZPX3NCSVQpIGlzIG5vbi16ZXJvLgotICAgICovCi0gICBwbmdfY29sb3JfOCBzaWdfYml0IFBOR19ERVBTVFJVQ1Q7IC8qIHNpZ25pZmljYW50IGJpdHMgaW4gY29sb3IgY2hhbm5lbHMgKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfdFJOU19TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCkgfHwgXAotZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkKLSAgIC8qIFRoZSB0Uk5TIGNodW5rIHN1cHBsaWVzIHRyYW5zcGFyZW5jeSBkYXRhIGZvciBwYWxldHRlZCBpbWFnZXMgYW5kCi0gICAgKiBvdGhlciBpbWFnZSB0eXBlcyB0aGF0IGRvbid0IG5lZWQgYSBmdWxsIGFscGhhIGNoYW5uZWwuICBUaGVyZSBhcmUKLSAgICAqICJudW1fdHJhbnMiIHRyYW5zcGFyZW5jeSB2YWx1ZXMgZm9yIGEgcGFsZXR0ZWQgaW1hZ2UsIHN0b3JlZCBpbiB0aGUKLSAgICAqIHNhbWUgb3JkZXIgYXMgdGhlIHBhbGV0dGUgY29sb3JzLCBzdGFydGluZyBmcm9tIGluZGV4IDAuICBWYWx1ZXMKLSAgICAqIGZvciB0aGUgZGF0YSBhcmUgaW4gdGhlIHJhbmdlIFswLCAyNTVdLCByYW5naW5nIGZyb20gZnVsbHkgdHJhbnNwYXJlbnQKLSAgICAqIHRvIGZ1bGx5IG9wYXF1ZSwgcmVzcGVjdGl2ZWx5LiAgRm9yIG5vbi1wYWxldHRlZCBpbWFnZXMsIHRoZXJlIGlzIGEKLSAgICAqIHNpbmdsZSBjb2xvciBzcGVjaWZpZWQgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBmdWxseSB0cmFuc3BhcmVudC4KLSAgICAqIERhdGEgaXMgdmFsaWQgaWYgKHZhbGlkICYgUE5HX0lORk9fdFJOUykgaXMgbm9uLXplcm8uCi0gICAgKi8KLSAgIHBuZ19ieXRlcCB0cmFuc19hbHBoYSBQTkdfREVQU1RSVUNUOyAgICAvKiBhbHBoYSB2YWx1ZXMgZm9yIHBhbGV0dGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgKi8KLSAgIHBuZ19jb2xvcl8xNiB0cmFuc19jb2xvciBQTkdfREVQU1RSVUNUOyAvKiB0cmFuc3BhcmVudCBjb2xvciBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24tcGFsZXR0ZSBpbWFnZSAqLwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19iS0dEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkKLSAgIC8qIFRoZSBiS0dEIGNodW5rIGdpdmVzIHRoZSBzdWdnZXN0ZWQgaW1hZ2UgYmFja2dyb3VuZCBjb2xvciBpZiB0aGUKLSAgICAqIGRpc3BsYXkgcHJvZ3JhbSBkb2VzIG5vdCBoYXZlIGl0cyBvd24gYmFja2dyb3VuZCBjb2xvciBhbmQgdGhlIGltYWdlCi0gICAgKiBpcyBuZWVkcyB0byBjb21wb3NpdGVkIG9udG8gYSBiYWNrZ3JvdW5kIGJlZm9yZSBkaXNwbGF5LiAgVGhlIGNvbG9ycwotICAgICogaW4gImJhY2tncm91bmQiIGFyZSBub3JtYWxseSBpbiB0aGUgc2FtZSBjb2xvciBzcGFjZS9kZXB0aCBhcyB0aGUKLSAgICAqIHBpeGVsIGRhdGEuICBEYXRhIGlzIHZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX2JLR0QpIGlzIG5vbi16ZXJvLgotICAgICovCi0gICBwbmdfY29sb3JfMTYgYmFja2dyb3VuZCBQTkdfREVQU1RSVUNUOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfb0ZGc19TVVBQT1JURUQKLSAgIC8qIFRoZSBvRkZzIGNodW5rIGdpdmVzIHRoZSBvZmZzZXQgaW4gIm9mZnNldF91bml0X3R5cGUiIHVuaXRzIHJpZ2h0d2FyZHMKLSAgICAqIGFuZCBkb3dud2FyZHMgZnJvbSB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBkaXNwbGF5LCBwYWdlLCBvciBvdGhlcgotICAgICogYXBwbGljYXRpb24tc3BlY2lmaWMgY28tb3JkaW5hdGUgc3BhY2UuICBTZWUgdGhlIFBOR19PRkZTRVRfIGRlZmluZXMKLSAgICAqIGJlbG93IGZvciB0aGUgdW5pdCB0eXBlcy4gIFZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX29GRnMpIG5vbi16ZXJvLgotICAgICovCi0gICBwbmdfaW50XzMyIHhfb2Zmc2V0IFBOR19ERVBTVFJVQ1Q7IC8qIHggb2Zmc2V0IG9uIHBhZ2UgKi8KLSAgIHBuZ19pbnRfMzIgeV9vZmZzZXQgUE5HX0RFUFNUUlVDVDsgLyogeSBvZmZzZXQgb24gcGFnZSAqLwotICAgcG5nX2J5dGUgb2Zmc2V0X3VuaXRfdHlwZSBQTkdfREVQU1RSVUNUOyAvKiBvZmZzZXQgdW5pdHMgdHlwZSAqLwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfcEhZc19TVVBQT1JURUQKLSAgIC8qIFRoZSBwSFlzIGNodW5rIGdpdmVzIHRoZSBwaHlzaWNhbCBwaXhlbCBkZW5zaXR5IG9mIHRoZSBpbWFnZSBmb3IKLSAgICAqIGRpc3BsYXkgb3IgcHJpbnRpbmcgaW4gInBoeXNfdW5pdF90eXBlIiB1bml0cyAoc2VlIFBOR19SRVNPTFVUSU9OXwotICAgICogZGVmaW5lcyBiZWxvdykuICBEYXRhIGlzIHZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX3BIWXMpIGlzIG5vbi16ZXJvLgotICAgICovCi0gICBwbmdfdWludF8zMiB4X3BpeGVsc19wZXJfdW5pdCBQTkdfREVQU1RSVUNUOyAvKiBob3Jpem9udGFsIHBpeGVsIGRlbnNpdHkgKi8KLSAgIHBuZ191aW50XzMyIHlfcGl4ZWxzX3Blcl91bml0IFBOR19ERVBTVFJVQ1Q7IC8qIHZlcnRpY2FsIHBpeGVsIGRlbnNpdHkgKi8KLSAgIHBuZ19ieXRlIHBoeXNfdW5pdF90eXBlIFBOR19ERVBTVFJVQ1Q7IC8qIHJlc29sdXRpb24gdHlwZSAoc2VlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfUkVTT0xVVElPTl8gYmVsb3cpICovCi0jZW5kaWYKLQotI2lmZGVmIFBOR19oSVNUX1NVUFBPUlRFRAotICAgLyogVGhlIGhJU1QgY2h1bmsgY29udGFpbnMgdGhlIHJlbGF0aXZlIGZyZXF1ZW5jeSBvciBpbXBvcnRhbmNlIG9mIHRoZQotICAgICogdmFyaW91cyBwYWxldHRlIGVudHJpZXMsIHNvIHRoYXQgYSB2aWV3ZXIgY2FuIGludGVsbGlnZW50bHkgc2VsZWN0IGEKLSAgICAqIHJlZHVjZWQtY29sb3IgcGFsZXR0ZSwgaWYgcmVxdWlyZWQuICBEYXRhIGlzIGFuIGFycmF5IG9mICJudW1fcGFsZXR0ZSIKLSAgICAqIHZhbHVlcyBpbiB0aGUgcmFuZ2UgWzAsNjU1MzVdLiBEYXRhIHZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX2hJU1QpCi0gICAgKiBpcyBub24temVyby4KLSAgICAqLwotICAgcG5nX3VpbnRfMTZwIGhpc3QgUE5HX0RFUFNUUlVDVDsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX2NIUk1fU1VQUE9SVEVECi0gICAvKiBUaGUgY0hSTSBjaHVuayBkZXNjcmliZXMgdGhlIENJRSBjb2xvciBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIG1vbml0b3IKLSAgICAqIG9uIHdoaWNoIHRoZSBQTkcgd2FzIGNyZWF0ZWQuICBUaGlzIGRhdGEgYWxsb3dzIHRoZSB2aWV3ZXIgdG8gZG8gZ2FtdXQKLSAgICAqIG1hcHBpbmcgb2YgdGhlIGlucHV0IGltYWdlIHRvIGVuc3VyZSB0aGF0IHRoZSB2aWV3ZXIgc2VlcyB0aGUgc2FtZQotICAgICogY29sb3JzIGluIHRoZSBpbWFnZSBhcyB0aGUgY3JlYXRvci4gIFZhbHVlcyBhcmUgaW4gdGhlIHJhbmdlCi0gICAgKiBbMC4wLCAwLjhdLiAgRGF0YSB2YWxpZCBpZiAodmFsaWQgJiBQTkdfSU5GT19jSFJNKSBub24temVyby4KLSAgICAqLwotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgIGZsb2F0IHhfd2hpdGUgUE5HX0RFUFNUUlVDVDsKLSAgIGZsb2F0IHlfd2hpdGUgUE5HX0RFUFNUUlVDVDsKLSAgIGZsb2F0IHhfcmVkIFBOR19ERVBTVFJVQ1Q7Ci0gICBmbG9hdCB5X3JlZCBQTkdfREVQU1RSVUNUOwotICAgZmxvYXQgeF9ncmVlbiBQTkdfREVQU1RSVUNUOwotICAgZmxvYXQgeV9ncmVlbiBQTkdfREVQU1RSVUNUOwotICAgZmxvYXQgeF9ibHVlIFBOR19ERVBTVFJVQ1Q7Ci0gICBmbG9hdCB5X2JsdWUgUE5HX0RFUFNUUlVDVDsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBQTkdfcENBTF9TVVBQT1JURUQKLSAgIC8qIFRoZSBwQ0FMIGNodW5rIGRlc2NyaWJlcyBhIHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gdGhlIHN0b3JlZCBwaXhlbAotICAgICogdmFsdWVzIGFuZCBvcmlnaW5hbCBwaHlzaWNhbCBkYXRhIHZhbHVlcyB1c2VkIHRvIGNyZWF0ZSB0aGUgaW1hZ2UuCi0gICAgKiBUaGUgaW50ZWdlciByYW5nZSBbMCwgMl5iaXRfZGVwdGggLSAxXSBtYXBzIHRvIHRoZSBmbG9hdGluZy1wb2ludAotICAgICogcmFuZ2UgZ2l2ZW4gYnkgW3BjYWxfWDAsIHBjYWxfWDFdLCBhbmQgYXJlIGZ1cnRoZXIgdHJhbnNmb3JtZWQgYnkgYQotICAgICogKHBvc3NpYmx5IG5vbi1saW5lYXIpIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIGdpdmVuIGJ5ICJwY2FsX3R5cGUiCi0gICAgKiBhbmQgInBjYWxfcGFyYW1zIiBpbnRvICJwY2FsX3VuaXRzIi4gIFBsZWFzZSBzZWUgdGhlIFBOR19FUVVBVElPTl8KLSAgICAqIGRlZmluZXMgYmVsb3csIGFuZCB0aGUgUE5HLUdyb3VwJ3MgUE5HIGV4dGVuc2lvbnMgZG9jdW1lbnQgZm9yIGEKLSAgICAqIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbnMgYW5kIGhvdyB0aGV5IHNob3VsZCBiZQotICAgICogaW1wbGVtZW50ZWQsIGFuZCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgQVNDSUkgcGFyYW1ldGVyIHN0cmluZ3MuCi0gICAgKiBEYXRhIHZhbHVlcyBhcmUgdmFsaWQgaWYgKHZhbGlkICYgUE5HX0lORk9fcENBTCkgbm9uLXplcm8uCi0gICAgKi8KLSAgIHBuZ19jaGFycCBwY2FsX3B1cnBvc2UgUE5HX0RFUFNUUlVDVDsgIC8qIHBDQUwgY2h1bmsgZGVzY3JpcHRpb24gc3RyaW5nICovCi0gICBwbmdfaW50XzMyIHBjYWxfWDAgUE5HX0RFUFNUUlVDVDsgICAgICAvKiBtaW5pbXVtIHZhbHVlICovCi0gICBwbmdfaW50XzMyIHBjYWxfWDEgUE5HX0RFUFNUUlVDVDsgICAgICAvKiBtYXhpbXVtIHZhbHVlICovCi0gICBwbmdfY2hhcnAgcGNhbF91bml0cyBQTkdfREVQU1RSVUNUOyAgICAvKiBMYXRpbi0xIHN0cmluZyBnaXZpbmcgcGh5c2ljYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzICovCi0gICBwbmdfY2hhcnBwIHBjYWxfcGFyYW1zIFBOR19ERVBTVFJVQ1Q7ICAvKiBBU0NJSSBzdHJpbmdzIGNvbnRhaW5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciB2YWx1ZXMgKi8KLSAgIHBuZ19ieXRlIHBjYWxfdHlwZSBQTkdfREVQU1RSVUNUOyAgICAgIC8qIGVxdWF0aW9uIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWUgUE5HX0VRVUFUSU9OXyBiZWxvdykgKi8KLSAgIHBuZ19ieXRlIHBjYWxfbnBhcmFtcyBQTkdfREVQU1RSVUNUOyAgIC8qIG51bWJlciBvZiBwYXJhbWV0ZXJzIGdpdmVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBwY2FsX3BhcmFtcyAqLwotI2VuZGlmCi0KLS8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjAuNiAqLwotICAgcG5nX3VpbnRfMzIgZnJlZV9tZSBQTkdfREVQU1RSVUNUOyAgICAgLyogZmxhZ3MgaXRlbXMgbGlicG5nIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zaWJsZSBmb3IgZnJlZWluZyAqLwotCi0jaWYgZGVmaW5lZChQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKSB8fCBcCi0gZGVmaW5lZChQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVEKQotICAgLyogU3RvcmFnZSBmb3IgdW5rbm93biBjaHVua3MgdGhhdCB0aGUgbGlicmFyeSBkb2Vzbid0IHJlY29nbml6ZS4gKi8KLSAgIHBuZ191bmtub3duX2NodW5rcCB1bmtub3duX2NodW5rcyBQTkdfREVQU1RSVUNUOwotICAgcG5nX3NpemVfdCB1bmtub3duX2NodW5rc19udW0gUE5HX0RFUFNUUlVDVDsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX2lDQ1BfU1VQUE9SVEVECi0gICAvKiBpQ0NQIGNodW5rIGRhdGEuICovCi0gICBwbmdfY2hhcnAgaWNjcF9uYW1lIFBOR19ERVBTVFJVQ1Q7ICAgICAvKiBwcm9maWxlIG5hbWUgKi8KLSAgIHBuZ19jaGFycCBpY2NwX3Byb2ZpbGUgUE5HX0RFUFNUUlVDVDsgIC8qIEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90ZSB0byBtYWludGFpbmVyOiBzaG91bGQgYmUgcG5nX2J5dGVwICovCi0gICBwbmdfdWludF8zMiBpY2NwX3Byb2ZsZW4gUE5HX0RFUFNUUlVDVDsgIC8qIElDQyBwcm9maWxlIGRhdGEgbGVuZ3RoICovCi0gICBwbmdfYnl0ZSBpY2NwX2NvbXByZXNzaW9uIFBOR19ERVBTVFJVQ1Q7IC8qIEFsd2F5cyB6ZXJvICovCi0jZW5kaWYKLQotI2lmZGVmIFBOR19zUExUX1NVUFBPUlRFRAotICAgLyogRGF0YSBvbiBzUExUIGNodW5rcyAodGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUpLiAqLwotICAgcG5nX3NQTFRfdHAgc3BsdF9wYWxldHRlcyBQTkdfREVQU1RSVUNUOwotICAgcG5nX3VpbnRfMzIgc3BsdF9wYWxldHRlc19udW0gUE5HX0RFUFNUUlVDVDsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX3NDQUxfU1VQUE9SVEVECi0gICAvKiBUaGUgc0NBTCBjaHVuayBkZXNjcmliZXMgdGhlIGFjdHVhbCBwaHlzaWNhbCBkaW1lbnNpb25zIG9mIHRoZQotICAgICogc3ViamVjdCBtYXR0ZXIgb2YgdGhlIGdyYXBoaWMuICBUaGUgY2h1bmsgY29udGFpbnMgYSB1bml0IHNwZWNpZmljYXRpb24KLSAgICAqIGEgYnl0ZSB2YWx1ZSwgYW5kIHR3byBBU0NJSSBzdHJpbmdzIHJlcHJlc2VudGluZyBmbG9hdGluZy1wb2ludAotICAgICogdmFsdWVzLiAgVGhlIHZhbHVlcyBhcmUgd2lkdGggYW5kIGhlaWdodCBjb3JyZXNwb25zaW5nIHRvIG9uZSBwaXhlbAotICAgICogaW4gdGhlIGltYWdlLiAgVGhpcyBleHRlcm5hbCByZXByZXNlbnRhdGlvbiBpcyBjb252ZXJ0ZWQgdG8gZG91YmxlCi0gICAgKiBoZXJlLiAgRGF0YSB2YWx1ZXMgYXJlIHZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX3NDQUwpIGlzIG5vbi16ZXJvLgotICAgICovCi0gICBwbmdfYnl0ZSBzY2FsX3VuaXQgUE5HX0RFUFNUUlVDVDsgICAgICAgICAvKiB1bml0IG9mIHBoeXNpY2FsIHNjYWxlICovCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgZG91YmxlIHNjYWxfcGl4ZWxfd2lkdGggUE5HX0RFUFNUUlVDVDsgICAgLyogd2lkdGggb2Ygb25lIHBpeGVsICovCi0gICBkb3VibGUgc2NhbF9waXhlbF9oZWlnaHQgUE5HX0RFUFNUUlVDVDsgICAvKiBoZWlnaHQgb2Ygb25lIHBpeGVsICovCi0jZW5kaWYKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi0gICBwbmdfY2hhcnAgc2NhbF9zX3dpZHRoIFBOR19ERVBTVFJVQ1Q7ICAgICAvKiBzdHJpbmcgY29udGFpbmluZyBoZWlnaHQgKi8KLSAgIHBuZ19jaGFycCBzY2FsX3NfaGVpZ2h0IFBOR19ERVBTVFJVQ1Q7ICAgIC8qIHN0cmluZyBjb250YWluaW5nIHdpZHRoICovCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVECi0gICAvKiBNZW1vcnkgaGFzIGJlZW4gYWxsb2NhdGVkIGlmICh2YWxpZCAmIFBOR19BTExPQ0FURURfSU5GT19ST1dTKQotICAgICAgbm9uLXplcm8gKi8KLSAgIC8qIERhdGEgdmFsaWQgaWYgKHZhbGlkICYgUE5HX0lORk9fSURBVCkgbm9uLXplcm8gKi8KLSAgIHBuZ19ieXRlcHAgcm93X3BvaW50ZXJzIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAvKiB0aGUgaW1hZ2UgYml0cyAqLwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX2dBTUFfU1VQUE9SVEVEKQotICAgcG5nX2ZpeGVkX3BvaW50IGludF9nYW1tYSBQTkdfREVQU1RSVUNUOyAvKiBnYW1tYSBvZiBpbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkICYgUE5HX0lORk9fZ0FNQSkgKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfY0hSTV9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRCkKLSAgIHBuZ19maXhlZF9wb2ludCBpbnRfeF93aGl0ZSBQTkdfREVQU1RSVUNUOwotICAgcG5nX2ZpeGVkX3BvaW50IGludF95X3doaXRlIFBOR19ERVBTVFJVQ1Q7Ci0gICBwbmdfZml4ZWRfcG9pbnQgaW50X3hfcmVkIFBOR19ERVBTVFJVQ1Q7Ci0gICBwbmdfZml4ZWRfcG9pbnQgaW50X3lfcmVkIFBOR19ERVBTVFJVQ1Q7Ci0gICBwbmdfZml4ZWRfcG9pbnQgaW50X3hfZ3JlZW4gUE5HX0RFUFNUUlVDVDsKLSAgIHBuZ19maXhlZF9wb2ludCBpbnRfeV9ncmVlbiBQTkdfREVQU1RSVUNUOwotICAgcG5nX2ZpeGVkX3BvaW50IGludF94X2JsdWUgUE5HX0RFUFNUUlVDVDsKLSAgIHBuZ19maXhlZF9wb2ludCBpbnRfeV9ibHVlIFBOR19ERVBTVFJVQ1Q7Ci0jZW5kaWYKLQotfSBwbmdfaW5mbzsKLQotdHlwZWRlZiBwbmdfaW5mbyBGQVIgKiBwbmdfaW5mb3A7Ci10eXBlZGVmIFBOR19DT05TVCBwbmdfaW5mbyBGQVIgKiBwbmdfY29uc3RfaW5mb3A7Ci10eXBlZGVmIHBuZ19pbmZvIEZBUiAqIEZBUiAqIHBuZ19pbmZvcHA7Ci0KLS8qIE1heGltdW0gcG9zaXRpdmUgaW50ZWdlciB1c2VkIGluIFBORyBpcyAoMl4zMSktMSAqLwotI2RlZmluZSBQTkdfVUlOVF8zMV9NQVggKChwbmdfdWludF8zMikweDdmZmZmZmZmTCkKLSNkZWZpbmUgUE5HX1VJTlRfMzJfTUFYICgocG5nX3VpbnRfMzIpKC0xKSkKLSNkZWZpbmUgUE5HX1NJWkVfTUFYICgocG5nX3NpemVfdCkoLTEpKQotCi0vKiBUaGVzZSBkZXNjcmliZSB0aGUgY29sb3JfdHlwZSBmaWVsZCBpbiBwbmdfaW5mby4gKi8KLS8qIGNvbG9yIHR5cGUgbWFza3MgKi8KLSNkZWZpbmUgUE5HX0NPTE9SX01BU0tfUEFMRVRURSAgICAxCi0jZGVmaW5lIFBOR19DT0xPUl9NQVNLX0NPTE9SICAgICAgMgotI2RlZmluZSBQTkdfQ09MT1JfTUFTS19BTFBIQSAgICAgIDQKLQotLyogY29sb3IgdHlwZXMuICBOb3RlIHRoYXQgbm90IGFsbCBjb21iaW5hdGlvbnMgYXJlIGxlZ2FsICovCi0jZGVmaW5lIFBOR19DT0xPUl9UWVBFX0dSQVkgMAotI2RlZmluZSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFICAoUE5HX0NPTE9SX01BU0tfQ09MT1IgfCBQTkdfQ09MT1JfTUFTS19QQUxFVFRFKQotI2RlZmluZSBQTkdfQ09MT1JfVFlQRV9SR0IgICAgICAgIChQTkdfQ09MT1JfTUFTS19DT0xPUikKLSNkZWZpbmUgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBICAoUE5HX0NPTE9SX01BU0tfQ09MT1IgfCBQTkdfQ09MT1JfTUFTS19BTFBIQSkKLSNkZWZpbmUgUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSAoUE5HX0NPTE9SX01BU0tfQUxQSEEpCi0vKiBhbGlhc2VzICovCi0jZGVmaW5lIFBOR19DT0xPUl9UWVBFX1JHQkEgIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQQotI2RlZmluZSBQTkdfQ09MT1JfVFlQRV9HQSAgUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQQotCi0vKiBUaGlzIGlzIGZvciBjb21wcmVzc2lvbiB0eXBlLiBQTkcgMS4wLTEuMiBvbmx5IGRlZmluZSB0aGUgc2luZ2xlIHR5cGUuICovCi0jZGVmaW5lIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UgMCAvKiBEZWZsYXRlIG1ldGhvZCA4LCAzMksgd2luZG93ICovCi0jZGVmaW5lIFBOR19DT01QUkVTU0lPTl9UWVBFX0RFRkFVTFQgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRQotCi0vKiBUaGlzIGlzIGZvciBmaWx0ZXIgdHlwZS4gUE5HIDEuMC0xLjIgb25seSBkZWZpbmUgdGhlIHNpbmdsZSB0eXBlLiAqLwotI2RlZmluZSBQTkdfRklMVEVSX1RZUEVfQkFTRSAgICAgIDAgLyogU2luZ2xlIHJvdyBwZXItYnl0ZSBmaWx0ZXJpbmcgKi8KLSNkZWZpbmUgUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HIDY0IC8qIFVzZWQgb25seSBpbiBNTkcgZGF0YXN0cmVhbXMgKi8KLSNkZWZpbmUgUE5HX0ZJTFRFUl9UWVBFX0RFRkFVTFQgICBQTkdfRklMVEVSX1RZUEVfQkFTRQotCi0vKiBUaGVzZSBhcmUgZm9yIHRoZSBpbnRlcmxhY2luZyB0eXBlLiAgVGhlc2UgdmFsdWVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4gKi8KLSNkZWZpbmUgUE5HX0lOVEVSTEFDRV9OT05FICAgICAgICAwIC8qIE5vbi1pbnRlcmxhY2VkIGltYWdlICovCi0jZGVmaW5lIFBOR19JTlRFUkxBQ0VfQURBTTcgICAgICAgMSAvKiBBZGFtNyBpbnRlcmxhY2luZyAqLwotI2RlZmluZSBQTkdfSU5URVJMQUNFX0xBU1QgICAgICAgIDIgLyogTm90IGEgdmFsaWQgdmFsdWUgKi8KLQotLyogVGhlc2UgYXJlIGZvciB0aGUgb0ZGcyBjaHVuay4gIFRoZXNlIHZhbHVlcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuICovCi0jZGVmaW5lIFBOR19PRkZTRVRfUElYRUwgICAgICAgICAgMCAvKiBPZmZzZXQgaW4gcGl4ZWxzICovCi0jZGVmaW5lIFBOR19PRkZTRVRfTUlDUk9NRVRFUiAgICAgMSAvKiBPZmZzZXQgaW4gbWljcm9tZXRlcnMgKDEvMTBeNiBtZXRlcikgKi8KLSNkZWZpbmUgUE5HX09GRlNFVF9MQVNUICAgICAgICAgICAyIC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCi0KLS8qIFRoZXNlIGFyZSBmb3IgdGhlIHBDQUwgY2h1bmsuICBUaGVzZSB2YWx1ZXMgc2hvdWxkIE5PVCBiZSBjaGFuZ2VkLiAqLwotI2RlZmluZSBQTkdfRVFVQVRJT05fTElORUFSICAgICAgIDAgLyogTGluZWFyIHRyYW5zZm9ybWF0aW9uICovCi0jZGVmaW5lIFBOR19FUVVBVElPTl9CQVNFX0UgICAgICAgMSAvKiBFeHBvbmVudGlhbCBiYXNlIGUgdHJhbnNmb3JtICovCi0jZGVmaW5lIFBOR19FUVVBVElPTl9BUkJJVFJBUlkgICAgMiAvKiBBcmJpdHJhcnkgYmFzZSBleHBvbmVudGlhbCB0cmFuc2Zvcm0gKi8KLSNkZWZpbmUgUE5HX0VRVUFUSU9OX0hZUEVSQk9MSUMgICAzIC8qIEh5cGVyYm9saWMgc2luZSB0cmFuc2Zvcm1hdGlvbiAqLwotI2RlZmluZSBQTkdfRVFVQVRJT05fTEFTVCAgICAgICAgIDQgLyogTm90IGEgdmFsaWQgdmFsdWUgKi8KLQotLyogVGhlc2UgYXJlIGZvciB0aGUgc0NBTCBjaHVuay4gIFRoZXNlIHZhbHVlcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuICovCi0jZGVmaW5lIFBOR19TQ0FMRV9VTktOT1dOICAgICAgICAgMCAvKiB1bmtub3duIHVuaXQgKGltYWdlIHNjYWxlKSAqLwotI2RlZmluZSBQTkdfU0NBTEVfTUVURVIgICAgICAgICAgIDEgLyogbWV0ZXJzIHBlciBwaXhlbCAqLwotI2RlZmluZSBQTkdfU0NBTEVfUkFESUFOICAgICAgICAgIDIgLyogcmFkaWFucyBwZXIgcGl4ZWwgKi8KLSNkZWZpbmUgUE5HX1NDQUxFX0xBU1QgICAgICAgICAgICAzIC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCi0KLS8qIFRoZXNlIGFyZSBmb3IgdGhlIHBIWXMgY2h1bmsuICBUaGVzZSB2YWx1ZXMgc2hvdWxkIE5PVCBiZSBjaGFuZ2VkLiAqLwotI2RlZmluZSBQTkdfUkVTT0xVVElPTl9VTktOT1dOICAgIDAgLyogcGl4ZWxzL3Vua25vd24gdW5pdCAoYXNwZWN0IHJhdGlvKSAqLwotI2RlZmluZSBQTkdfUkVTT0xVVElPTl9NRVRFUiAgICAgIDEgLyogcGl4ZWxzL21ldGVyICovCi0jZGVmaW5lIFBOR19SRVNPTFVUSU9OX0xBU1QgICAgICAgMiAvKiBOb3QgYSB2YWxpZCB2YWx1ZSAqLwotCi0vKiBUaGVzZSBhcmUgZm9yIHRoZSBzUkdCIGNodW5rLiAgVGhlc2UgdmFsdWVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4gKi8KLSNkZWZpbmUgUE5HX3NSR0JfSU5URU5UX1BFUkNFUFRVQUwgMAotI2RlZmluZSBQTkdfc1JHQl9JTlRFTlRfUkVMQVRJVkUgICAxCi0jZGVmaW5lIFBOR19zUkdCX0lOVEVOVF9TQVRVUkFUSU9OIDIKLSNkZWZpbmUgUE5HX3NSR0JfSU5URU5UX0FCU09MVVRFICAgMwotI2RlZmluZSBQTkdfc1JHQl9JTlRFTlRfTEFTVCAgICAgICA0IC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCi0KLS8qIFRoaXMgaXMgZm9yIHRleHQgY2h1bmtzICovCi0jZGVmaW5lIFBOR19LRVlXT1JEX01BWF9MRU5HVEggICAgIDc5Ci0KLS8qIE1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgaW4gUExURS9zUExUL3RSTlMgYXJyYXlzICovCi0jZGVmaW5lIFBOR19NQVhfUEFMRVRURV9MRU5HVEggICAgMjU2Ci0KLS8qIFRoZXNlIGRldGVybWluZSBpZiBhbiBhbmNpbGxhcnkgY2h1bmsncyBkYXRhIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZWFkCi0gKiBmcm9tIHRoZSBQTkcgaGVhZGVyLCBvciBpZiB0aGUgYXBwbGljYXRpb24gaGFzIGZpbGxlZCBpbiB0aGUgY29ycmVzcG9uZGluZwotICogZGF0YSBpbiB0aGUgaW5mb19zdHJ1Y3QgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFRoZSB2YWx1ZXMKLSAqIG9mIHRoZSBQTkdfSU5GT188Y2h1bms+IGRlZmluZXMgc2hvdWxkIE5PVCBiZSBjaGFuZ2VkLgotICovCi0jZGVmaW5lIFBOR19JTkZPX2dBTUEgMHgwMDAxCi0jZGVmaW5lIFBOR19JTkZPX3NCSVQgMHgwMDAyCi0jZGVmaW5lIFBOR19JTkZPX2NIUk0gMHgwMDA0Ci0jZGVmaW5lIFBOR19JTkZPX1BMVEUgMHgwMDA4Ci0jZGVmaW5lIFBOR19JTkZPX3RSTlMgMHgwMDEwCi0jZGVmaW5lIFBOR19JTkZPX2JLR0QgMHgwMDIwCi0jZGVmaW5lIFBOR19JTkZPX2hJU1QgMHgwMDQwCi0jZGVmaW5lIFBOR19JTkZPX3BIWXMgMHgwMDgwCi0jZGVmaW5lIFBOR19JTkZPX29GRnMgMHgwMTAwCi0jZGVmaW5lIFBOR19JTkZPX3RJTUUgMHgwMjAwCi0jZGVmaW5lIFBOR19JTkZPX3BDQUwgMHgwNDAwCi0jZGVmaW5lIFBOR19JTkZPX3NSR0IgMHgwODAwICAgLyogR1ItUCwgMC45NmEgKi8KLSNkZWZpbmUgUE5HX0lORk9faUNDUCAweDEwMDAgICAvKiBFU1IsIDEuMC42ICovCi0jZGVmaW5lIFBOR19JTkZPX3NQTFQgMHgyMDAwICAgLyogRVNSLCAxLjAuNiAqLwotI2RlZmluZSBQTkdfSU5GT19zQ0FMIDB4NDAwMCAgIC8qIEVTUiwgMS4wLjYgKi8KLSNkZWZpbmUgUE5HX0lORk9fSURBVCAweDgwMDBMICAvKiBFU1IsIDEuMC42ICovCi0KLS8qIFRoaXMgaXMgdXNlZCBmb3IgdGhlIHRyYW5zZm9ybWF0aW9uIHJvdXRpbmVzLCBhcyBzb21lIG9mIHRoZW0KLSAqIGNoYW5nZSB0aGVzZSB2YWx1ZXMgZm9yIHRoZSByb3cuICBJdCBhbHNvIHNob3VsZCBlbmFibGUgdXNpbmcKLSAqIHRoZSByb3V0aW5lcyBmb3Igb3RoZXIgcHVycG9zZXMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHBuZ19yb3dfaW5mb19zdHJ1Y3QKLXsKLSAgIHBuZ191aW50XzMyIHdpZHRoOyAvKiB3aWR0aCBvZiByb3cgKi8KLSAgIHBuZ19zaXplX3Qgcm93Ynl0ZXM7IC8qIG51bWJlciBvZiBieXRlcyBpbiByb3cgKi8KLSAgIHBuZ19ieXRlIGNvbG9yX3R5cGU7IC8qIGNvbG9yIHR5cGUgb2Ygcm93ICovCi0gICBwbmdfYnl0ZSBiaXRfZGVwdGg7IC8qIGJpdCBkZXB0aCBvZiByb3cgKi8KLSAgIHBuZ19ieXRlIGNoYW5uZWxzOyAvKiBudW1iZXIgb2YgY2hhbm5lbHMgKDEsIDIsIDMsIG9yIDQpICovCi0gICBwbmdfYnl0ZSBwaXhlbF9kZXB0aDsgLyogYml0cyBwZXIgcGl4ZWwgKGRlcHRoICogY2hhbm5lbHMpICovCi19IHBuZ19yb3dfaW5mbzsKLQotdHlwZWRlZiBwbmdfcm93X2luZm8gRkFSICogcG5nX3Jvd19pbmZvcDsKLXR5cGVkZWYgcG5nX3Jvd19pbmZvIEZBUiAqIEZBUiAqIHBuZ19yb3dfaW5mb3BwOwotCi0vKiBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9uIHR5cGVzIGZvciB0aGUgSS9PIGZ1bmN0aW9ucyBhbmQgZm9yIHRoZSBmdW5jdGlvbnMKLSAqIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgSS9PIGZ1bmN0aW9ucyB3aXRoIGhpcyBvciBoZXIKLSAqIG93bi4gIFRoZSBwbmdfZXJyb3JfcHRyIHR5cGUgc2hvdWxkIG1hdGNoIHRoYXQgb2YgdXNlci1zdXBwbGllZCB3YXJuaW5nCi0gKiBhbmQgZXJyb3IgZnVuY3Rpb25zLCB3aGlsZSB0aGUgcG5nX3J3X3B0ciB0eXBlIHNob3VsZCBtYXRjaCB0aGF0IG9mIHRoZQotICogdXNlciByZWFkL3dyaXRlIGRhdGEgZnVuY3Rpb25zLgotICovCi10eXBlZGVmIHN0cnVjdCBwbmdfc3RydWN0X2RlZiBwbmdfc3RydWN0OwotdHlwZWRlZiBwbmdfc3RydWN0IEZBUiAqIHBuZ19zdHJ1Y3RwOwotdHlwZWRlZiBQTkdfQ09OU1QgcG5nX3N0cnVjdCBGQVIgKiBwbmdfY29uc3Rfc3RydWN0cDsKLQotdHlwZWRlZiB2b2lkIChQTkdBUEkgKnBuZ19lcnJvcl9wdHIpIFBOR0FSRygocG5nX3N0cnVjdHAsIHBuZ19jb25zdF9jaGFycCkpOwotdHlwZWRlZiB2b2lkIChQTkdBUEkgKnBuZ19yd19wdHIpIFBOR0FSRygocG5nX3N0cnVjdHAsIHBuZ19ieXRlcCwgcG5nX3NpemVfdCkpOwotdHlwZWRlZiB2b2lkIChQTkdBUEkgKnBuZ19mbHVzaF9wdHIpIFBOR0FSRygocG5nX3N0cnVjdHApKTsKLXR5cGVkZWYgdm9pZCAoUE5HQVBJICpwbmdfcmVhZF9zdGF0dXNfcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwLCBwbmdfdWludF8zMiwKLSAgIGludCkpOwotdHlwZWRlZiB2b2lkIChQTkdBUEkgKnBuZ193cml0ZV9zdGF0dXNfcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwLCBwbmdfdWludF8zMiwKLSAgIGludCkpOwotCi0jaWZkZWYgUE5HX1BST0dSRVNTSVZFX1JFQURfU1VQUE9SVEVECi10eXBlZGVmIHZvaWQgKFBOR0FQSSAqcG5nX3Byb2dyZXNzaXZlX2luZm9fcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwLAotICAgcG5nX2luZm9wKSk7Ci10eXBlZGVmIHZvaWQgKFBOR0FQSSAqcG5nX3Byb2dyZXNzaXZlX2VuZF9wdHIpIFBOR0FSRygocG5nX3N0cnVjdHAsIHBuZ19pbmZvcCkpOwotdHlwZWRlZiB2b2lkIChQTkdBUEkgKnBuZ19wcm9ncmVzc2l2ZV9yb3dfcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwLCBwbmdfYnl0ZXAsCi0gICBwbmdfdWludF8zMiwgaW50KSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKQotdHlwZWRlZiB2b2lkIChQTkdBUEkgKnBuZ191c2VyX3RyYW5zZm9ybV9wdHIpIFBOR0FSRygocG5nX3N0cnVjdHAsCi0gICAgcG5nX3Jvd19pbmZvcCwgcG5nX2J5dGVwKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19VU0VSX0NIVU5LU19TVVBQT1JURUQKLXR5cGVkZWYgaW50IChQTkdBUEkgKnBuZ191c2VyX2NodW5rX3B0cikgUE5HQVJHKChwbmdfc3RydWN0cCwKLSAgIHBuZ191bmtub3duX2NodW5rcCkpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAotdHlwZWRlZiB2b2lkIChQTkdBUEkgKnBuZ191bmtub3duX2NodW5rX3B0cikgUE5HQVJHKChwbmdfc3RydWN0cCkpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLS8qIFRoaXMgbXVzdCBtYXRjaCB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiA8c2V0am1wLmg+LCBhbmQgdGhlCi0gKiBhcHBsaWNhdGlvbiBtdXN0IGluY2x1ZGUgdGhpcyBiZWZvcmUgcG5nLmggdG8gb2J0YWluIHRoZSBkZWZpbml0aW9uCi0gKiBvZiBqbXBfYnVmLgotICovCi10eXBlZGVmIHZvaWQgKFBOR0FQSSAqcG5nX2xvbmdqbXBfcHRyKSBQTkdBUkcoKGptcF9idWYsIGludCkpOwotI2VuZGlmCi0KLS8qIFRyYW5zZm9ybSBtYXNrcyBmb3IgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fSURFTlRJVFkgICAgICAgMHgwMDAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1RSSVBfMTYgICAgICAgMHgwMDAxICAgIC8qIHJlYWQgb25seSAqLwotI2RlZmluZSBQTkdfVFJBTlNGT1JNX1NUUklQX0FMUEhBICAgIDB4MDAwMiAgICAvKiByZWFkIG9ubHkgKi8KLSNkZWZpbmUgUE5HX1RSQU5TRk9STV9QQUNLSU5HICAgICAgICAweDAwMDQgICAgLyogcmVhZCBhbmQgd3JpdGUgKi8KLSNkZWZpbmUgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCAgICAgICAweDAwMDggICAgLyogcmVhZCBhbmQgd3JpdGUgKi8KLSNkZWZpbmUgUE5HX1RSQU5TRk9STV9FWFBBTkQgICAgICAgICAweDAwMTAgICAgLyogcmVhZCBvbmx5ICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fSU5WRVJUX01PTk8gICAgMHgwMDIwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fU0hJRlQgICAgICAgICAgMHgwMDQwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fQkdSICAgICAgICAgICAgMHgwMDgwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSAgICAgMHgwMTAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4gICAgMHgwMjAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBICAgMHgwNDAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSICAgMHgwODAwICAgIC8qIHdyaXRlIG9ubHkgKi8KLS8qIEFkZGVkIHRvIGxpYnBuZy0xLjIuMzQgKi8KLSNkZWZpbmUgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQkVGT1JFIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0FGVEVSIDB4MTAwMCAvKiB3cml0ZSBvbmx5ICovCi0vKiBBZGRlZCB0byBsaWJwbmctMS40LjAgKi8KLSNkZWZpbmUgUE5HX1RSQU5TRk9STV9HUkFZX1RPX1JHQiAgIDB4MjAwMCAgICAgIC8qIHJlYWQgb25seSAqLwotCi0vKiBGbGFncyBmb3IgTU5HIHN1cHBvcnRlZCBmZWF0dXJlcyAqLwotI2RlZmluZSBQTkdfRkxBR19NTkdfRU1QVFlfUExURSAgICAgMHgwMQotI2RlZmluZSBQTkdfRkxBR19NTkdfRklMVEVSXzY0ICAgICAgMHgwNAotI2RlZmluZSBQTkdfQUxMX01OR19GRUFUVVJFUyAgICAgICAgMHgwNQotCi10eXBlZGVmIHBuZ192b2lkcCAoKnBuZ19tYWxsb2NfcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwLCBwbmdfYWxsb2Nfc2l6ZV90KSk7Ci10eXBlZGVmIHZvaWQgKCpwbmdfZnJlZV9wdHIpIFBOR0FSRygocG5nX3N0cnVjdHAsIHBuZ192b2lkcCkpOwotCi0vKiBUaGUgc3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIGluZm9ybWF0aW9uIHRvIHJlYWQgYW5kIHdyaXRlIFBORyBmaWxlcy4KLSAqIFRoZSBvbmx5IHBlb3BsZSB3aG8gbmVlZCB0byBjYXJlIGFib3V0IHdoYXQgaXMgaW5zaWRlIG9mIHRoaXMgYXJlIHRoZQotICogcGVvcGxlIHdobyB3aWxsIGJlIG1vZGlmeWluZyB0aGUgbGlicmFyeSBmb3IgdGhlaXIgb3duIHNwZWNpYWwgbmVlZHMuCi0gKiBJdCBzaG91bGQgTk9UIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGJ5IGFuIGFwcGxpY2F0aW9uLCBleGNlcHQgdG8gc3RvcmUKLSAqIHRoZSBqbXBfYnVmLgotICovCi0KLXN0cnVjdCBwbmdfc3RydWN0X2RlZgotewotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0gICBqbXBfYnVmIGptcGJ1ZiBQTkdfREVQU1RSVUNUOyAgICAgICAgICAgIC8qIHVzZWQgaW4gcG5nX2Vycm9yICovCi0gICBwbmdfbG9uZ2ptcF9wdHIgbG9uZ2ptcF9mbiBQTkdfREVQU1RSVUNUOy8qIHNldGptcCBub24tbG9jYWwgZ290bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4gKi8KLSNlbmRpZgotICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiBQTkdfREVQU1RSVUNUOyAgICAvKiBmdW5jdGlvbiBmb3IgcHJpbnRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzIGFuZCBhYm9ydGluZyAqLwotICAgcG5nX2Vycm9yX3B0ciB3YXJuaW5nX2ZuIFBOR19ERVBTVFJVQ1Q7ICAvKiBmdW5jdGlvbiBmb3IgcHJpbnRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MgKi8KLSAgIHBuZ192b2lkcCBlcnJvcl9wdHIgUE5HX0RFUFNUUlVDVDsgICAgICAgLyogdXNlciBzdXBwbGllZCBzdHJ1Y3QgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIGZ1bmN0aW9ucyAqLwotICAgcG5nX3J3X3B0ciB3cml0ZV9kYXRhX2ZuIFBOR19ERVBTVFJVQ1Q7ICAvKiBmdW5jdGlvbiBmb3Igd3JpdGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgZGF0YSAqLwotICAgcG5nX3J3X3B0ciByZWFkX2RhdGFfZm4gUE5HX0RFUFNUUlVDVDsgICAvKiBmdW5jdGlvbiBmb3IgcmVhZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBkYXRhICovCi0gICBwbmdfdm9pZHAgaW9fcHRyIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgIC8qIHB0ciB0byBhcHBsaWNhdGlvbiBzdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIEkvTyBmdW5jdGlvbnMgKi8KLQotI2lmZGVmIFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAotICAgcG5nX3VzZXJfdHJhbnNmb3JtX3B0ciByZWFkX3VzZXJfdHJhbnNmb3JtX2ZuIFBOR19ERVBTVFJVQ1Q7IC8qIHVzZXIgcmVhZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gKi8KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAotICAgcG5nX3VzZXJfdHJhbnNmb3JtX3B0ciB3cml0ZV91c2VyX3RyYW5zZm9ybV9mbiBQTkdfREVQU1RSVUNUOyAvKiB1c2VyIHdyaXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gKi8KLSNlbmRpZgotCi0vKiBUaGVzZSB3ZXJlIGFkZGVkIGluIGxpYnBuZy0xLjAuMiAqLwotI2lmZGVmIFBOR19VU0VSX1RSQU5TRk9STV9QVFJfU1VQUE9SVEVECi0jaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpCi0gICBwbmdfdm9pZHAgdXNlcl90cmFuc2Zvcm1fcHRyIFBOR19ERVBTVFJVQ1Q7IC8qIHVzZXIgc3VwcGxpZWQgc3RydWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB1c2VyIHRyYW5zZm9ybSAqLwotICAgcG5nX2J5dGUgdXNlcl90cmFuc2Zvcm1fZGVwdGggUE5HX0RFUFNUUlVDVDsgICAgLyogYml0IGRlcHRoIG9mIHVzZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkIHBpeGVscyAqLwotICAgcG5nX2J5dGUgdXNlcl90cmFuc2Zvcm1fY2hhbm5lbHMgUE5HX0RFUFNUUlVDVDsgLyogY2hhbm5lbHMgaW4gdXNlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWQgcGl4ZWxzICovCi0jZW5kaWYKLSNlbmRpZgotCi0gICBwbmdfdWludF8zMiBtb2RlIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgIC8qIHRlbGxzIHVzIHdoZXJlIHdlIGFyZSBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgUE5HIGZpbGUgKi8KLSAgIHBuZ191aW50XzMyIGZsYWdzIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgLyogZmxhZ3MgaW5kaWNhdGluZyB2YXJpb3VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5ncyB0byBsaWJwbmcgKi8KLSAgIHBuZ191aW50XzMyIHRyYW5zZm9ybWF0aW9ucyBQTkdfREVQU1RSVUNUOyAvKiB3aGljaCB0cmFuc2Zvcm1hdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBwZXJmb3JtICovCi0KLSAgIHpfc3RyZWFtIHpzdHJlYW0gUE5HX0RFUFNUUlVDVDsgICAgICAgICAgLyogcG9pbnRlciB0byBkZWNvbXByZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSAoYmVsb3cpICovCi0gICBwbmdfYnl0ZXAgemJ1ZiBQTkdfREVQU1RSVUNUOyAgICAgICAgICAgIC8qIGJ1ZmZlciBmb3IgemxpYiAqLwotICAgcG5nX3NpemVfdCB6YnVmX3NpemUgUE5HX0RFUFNUUlVDVDsgICAgICAvKiBzaXplIG9mIHpidWYgKi8KLSAgIGludCB6bGliX2xldmVsIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgICAgLyogaG9sZHMgemxpYiBjb21wcmVzc2lvbiBsZXZlbCAqLwotICAgaW50IHpsaWJfbWV0aG9kIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIG1ldGhvZCAqLwotICAgaW50IHpsaWJfd2luZG93X2JpdHMgUE5HX0RFUFNUUlVDVDsgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIHdpbmRvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzICovCi0gICBpbnQgemxpYl9tZW1fbGV2ZWwgUE5HX0RFUFNUUlVDVDsgICAgICAgIC8qIGhvbGRzIHpsaWIgY29tcHJlc3Npb24gbWVtb3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsICovCi0gICBpbnQgemxpYl9zdHJhdGVneSBQTkdfREVQU1RSVUNUOyAgICAgICAgIC8qIGhvbGRzIHpsaWIgY29tcHJlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3kgKi8KLQotICAgcG5nX3VpbnRfMzIgd2lkdGggUE5HX0RFUFNUUlVDVDsgICAgICAgICAvKiB3aWR0aCBvZiBpbWFnZSBpbiBwaXhlbHMgKi8KLSAgIHBuZ191aW50XzMyIGhlaWdodCBQTkdfREVQU1RSVUNUOyAgICAgICAgLyogaGVpZ2h0IG9mIGltYWdlIGluIHBpeGVscyAqLwotICAgcG5nX3VpbnRfMzIgbnVtX3Jvd3MgUE5HX0RFUFNUUlVDVDsgICAgICAvKiBudW1iZXIgb2Ygcm93cyBpbiBjdXJyZW50IHBhc3MgKi8KLSAgIHBuZ191aW50XzMyIHVzcl93aWR0aCBQTkdfREVQU1RSVUNUOyAgICAgLyogd2lkdGggb2Ygcm93IGF0IHN0YXJ0IG9mIHdyaXRlICovCi0gICBwbmdfc2l6ZV90IHJvd2J5dGVzIFBOR19ERVBTVFJVQ1Q7ICAgICAgIC8qIHNpemUgb2Ygcm93IGluIGJ5dGVzICovCi0jaWYgMCAvKiBSZXBsYWNlZCB3aXRoIHRoZSBmb2xsb3dpbmcgaW4gbGlicG5nLTEuNC4xICovCi0gICBwbmdfc2l6ZV90IGlyb3dieXRlcyBQTkdfREVQU1RSVUNUOwotI2VuZGlmCi0vKiBBZGRlZCBpbiBsaWJwbmctMS40LjEgKi8KLSNpZmRlZiBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVECi0gICAvKiBUb3RhbCBtZW1vcnkgdGhhdCBhIHpUWHQsIHNQTFQsIGlUWHQsIGlDQ1AsIG9yIHVua25vd24gY2h1bmsKLSAgICAqIGNhbiBvY2N1cHkgd2hlbiBkZWNvbXByZXNzZWQuICAwIG1lYW5zIHVubGltaXRlZC4KLSAgICAqIFdlIHdpbGwgY2hhbmdlIHRoZSB0eXBlZGVmIGZyb20gcG5nX3NpemVfdCB0byBwbmdfYWxsb2Nfc2l6ZV90Ci0gICAgKiBpbiBsaWJwbmctMS42LjAKLSAgICAqLwotICAgcG5nX2FsbG9jX3NpemVfdCB1c2VyX2NodW5rX21hbGxvY19tYXggUE5HX0RFUFNUUlVDVDsKLSNlbmRpZgotICAgcG5nX3VpbnRfMzIgaXdpZHRoIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAvKiB3aWR0aCBvZiBjdXJyZW50IGludGVybGFjZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93IGluIHBpeGVscyAqLwotICAgcG5nX3VpbnRfMzIgcm93X251bWJlciBQTkdfREVQU1RSVUNUOyAgICAvKiBjdXJyZW50IHJvdyBpbiBpbnRlcmxhY2UgcGFzcyAqLwotICAgcG5nX2J5dGVwIHByZXZfcm93IFBOR19ERVBTVFJVQ1Q7ICAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSBwcmV2aW91cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5maWx0ZXJlZCkgcm93ICovCi0gICBwbmdfYnl0ZXAgcm93X2J1ZiBQTkdfREVQU1RSVUNUOyAgICAgICAgIC8qIGJ1ZmZlciB0byBzYXZlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuZmlsdGVyZWQpIHJvdyAqLwotICAgcG5nX2J5dGVwIHN1Yl9yb3cgUE5HX0RFUFNUUlVDVDsgICAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSAic3ViIiByb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBmaWx0ZXJpbmcgKi8KLSAgIHBuZ19ieXRlcCB1cF9yb3cgUE5HX0RFUFNUUlVDVDsgICAgICAgICAgLyogYnVmZmVyIHRvIHNhdmUgInVwIiByb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBmaWx0ZXJpbmcgKi8KLSAgIHBuZ19ieXRlcCBhdmdfcm93IFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgLyogYnVmZmVyIHRvIHNhdmUgImF2ZyIgcm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gZmlsdGVyaW5nICovCi0gICBwbmdfYnl0ZXAgcGFldGhfcm93IFBOR19ERVBTVFJVQ1Q7ICAgICAgIC8qIGJ1ZmZlciB0byBzYXZlICJQYWV0aCIgcm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gZmlsdGVyaW5nICovCi0gICBwbmdfcm93X2luZm8gcm93X2luZm8gUE5HX0RFUFNUUlVDVDsgICAgIC8qIHVzZWQgZm9yIHRyYW5zZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmVzICovCi0KLSAgIHBuZ191aW50XzMyIGlkYXRfc2l6ZSBQTkdfREVQU1RSVUNUOyAgICAgLyogY3VycmVudCBJREFUIHNpemUgZm9yIHJlYWQgKi8KLSAgIHBuZ191aW50XzMyIGNyYyBQTkdfREVQU1RSVUNUOyAgICAgICAgICAgLyogY3VycmVudCBjaHVuayBDUkMgdmFsdWUgKi8KLSAgIHBuZ19jb2xvcnAgcGFsZXR0ZSBQTkdfREVQU1RSVUNUOyAgICAgICAgLyogcGFsZXR0ZSBmcm9tIHRoZSBpbnB1dCBmaWxlICovCi0gICBwbmdfdWludF8xNiBudW1fcGFsZXR0ZSBQTkdfREVQU1RSVUNUOyAgIC8qIG51bWJlciBvZiBjb2xvciBlbnRyaWVzIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgKi8KLSAgIHBuZ191aW50XzE2IG51bV90cmFucyBQTkdfREVQU1RSVUNUOyAgICAgLyogbnVtYmVyIG9mIHRyYW5zcGFyZW5jeSB2YWx1ZXMgKi8KLSAgIHBuZ19ieXRlIGNodW5rX25hbWVbNV0gUE5HX0RFUFNUUlVDVDsgICAgLyogbnVsbC10ZXJtaW5hdGVkIG5hbWUgb2YgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuayAqLwotICAgcG5nX2J5dGUgY29tcHJlc3Npb24gUE5HX0RFUFNUUlVDVDsgICAgICAvKiBmaWxlIGNvbXByZXNzaW9uIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsd2F5cyAwKSAqLwotICAgcG5nX2J5dGUgZmlsdGVyIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgICAvKiBmaWxlIGZpbHRlciB0eXBlIChhbHdheXMgMCkgKi8KLSAgIHBuZ19ieXRlIGludGVybGFjZWQgUE5HX0RFUFNUUlVDVDsgICAgICAgLyogUE5HX0lOVEVSTEFDRV9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSU5URVJMQUNFX0FEQU03ICovCi0gICBwbmdfYnl0ZSBwYXNzIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgICAgIC8qIGN1cnJlbnQgaW50ZXJsYWNlIHBhc3MgKDAgLSA2KSAqLwotICAgcG5nX2J5dGUgZG9fZmlsdGVyIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAvKiByb3cgZmlsdGVyIGZsYWdzIChzZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0ZJTFRFUl8gYmVsb3cgKSAqLwotICAgcG5nX2J5dGUgY29sb3JfdHlwZSBQTkdfREVQU1RSVUNUOyAgICAgICAvKiBjb2xvciB0eXBlIG9mIGZpbGUgKi8KLSAgIHBuZ19ieXRlIGJpdF9kZXB0aCBQTkdfREVQU1RSVUNUOyAgICAgICAgLyogYml0IGRlcHRoIG9mIGZpbGUgKi8KLSAgIHBuZ19ieXRlIHVzcl9iaXRfZGVwdGggUE5HX0RFUFNUUlVDVDsgICAgLyogYml0IGRlcHRoIG9mIHVzZXJzIHJvdyAqLwotICAgcG5nX2J5dGUgcGl4ZWxfZGVwdGggUE5HX0RFUFNUUlVDVDsgICAgICAvKiBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwgKi8KLSAgIHBuZ19ieXRlIGNoYW5uZWxzIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzIGluIGZpbGUgKi8KLSAgIHBuZ19ieXRlIHVzcl9jaGFubmVscyBQTkdfREVQU1RSVUNUOyAgICAgLyogY2hhbm5lbHMgYXQgc3RhcnQgb2Ygd3JpdGUgKi8KLSAgIHBuZ19ieXRlIHNpZ19ieXRlcyBQTkdfREVQU1RSVUNUOyAgICAgICAgLyogbWFnaWMgYnl0ZXMgcmVhZC93cml0dGVuIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgb2YgZmlsZSAqLwotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKQotICAgcG5nX3VpbnRfMTYgZmlsbGVyIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgICAvKiBmaWxsZXIgYnl0ZXMgZm9yIHBpeGVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuc2lvbiAqLwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfYktHRF9TVVBQT1JURUQKLSAgIHBuZ19ieXRlIGJhY2tncm91bmRfZ2FtbWFfdHlwZSBQTkdfREVQU1RSVUNUOwotIyAgaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgZmxvYXQgYmFja2dyb3VuZF9nYW1tYSBQTkdfREVQU1RSVUNUOwotIyAgZW5kaWYKLSAgIHBuZ19jb2xvcl8xNiBiYWNrZ3JvdW5kIFBOR19ERVBTVFJVQ1Q7ICAgLyogYmFja2dyb3VuZCBjb2xvciBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW4gZ2FtbWEgc3BhY2UgKi8KLSNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKLSAgIHBuZ19jb2xvcl8xNiBiYWNrZ3JvdW5kXzEgUE5HX0RFUFNUUlVDVDsgLyogYmFja2dyb3VuZCBub3JtYWxpemVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGdhbW1hIDEuMCAqLwotI2VuZGlmCi0jZW5kaWYgLyogUE5HX2JLR0RfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECi0gICBwbmdfZmx1c2hfcHRyIG91dHB1dF9mbHVzaF9mbiBQTkdfREVQU1RSVUNUOyAvKiBGdW5jdGlvbiBmb3IgZmx1c2hpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICovCi0gICBwbmdfdWludF8zMiBmbHVzaF9kaXN0IFBOR19ERVBTVFJVQ1Q7ICAgIC8qIGhvdyBtYW55IHJvd3MgYXBhcnQgdG8gZmx1c2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBubyBmbHVzaCAqLwotICAgcG5nX3VpbnRfMzIgZmx1c2hfcm93cyBQTkdfREVQU1RSVUNUOyAgICAvKiBudW1iZXIgb2Ygcm93cyB3cml0dGVuIHNpbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgZmx1c2ggKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCi0gICBpbnQgZ2FtbWFfc2hpZnQgUE5HX0RFUFNUUlVDVDsgICAgICAvKiBudW1iZXIgb2YgImluc2lnbmlmaWNhbnQiIGJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LWJpdCBnYW1tYSAqLwotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgIGZsb2F0IGdhbW1hIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgIC8qIGZpbGUgZ2FtbWEgdmFsdWUgKi8KLSAgIGZsb2F0IHNjcmVlbl9nYW1tYSBQTkdfREVQU1RSVUNUOyAgIC8qIHNjcmVlbiBnYW1tYSB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpc3BsYXlfZXhwb25lbnQpICovCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCi0gICBwbmdfYnl0ZXAgZ2FtbWFfdGFibGUgUE5HX0RFUFNUUlVDVDsgICAgIC8qIGdhbW1hIHRhYmxlIGZvciA4LWJpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCBmaWxlcyAqLwotICAgcG5nX2J5dGVwIGdhbW1hX2Zyb21fMSBQTkdfREVQU1RSVUNUOyAgICAvKiBjb252ZXJ0cyBmcm9tIDEuMCB0byBzY3JlZW4gKi8KLSAgIHBuZ19ieXRlcCBnYW1tYV90b18xIFBOR19ERVBTVFJVQ1Q7ICAgICAgLyogY29udmVydHMgZnJvbSBmaWxlIHRvIDEuMCAqLwotICAgcG5nX3VpbnRfMTZwcCBnYW1tYV8xNl90YWJsZSBQTkdfREVQU1RSVUNUOyAvKiBnYW1tYSB0YWJsZSBmb3IgMTYtYml0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoIGZpbGVzICovCi0gICBwbmdfdWludF8xNnBwIGdhbW1hXzE2X2Zyb21fMSBQTkdfREVQU1RSVUNUOyAvKiBjb252ZXJ0cyBmcm9tIDEuMCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuICovCi0gICBwbmdfdWludF8xNnBwIGdhbW1hXzE2X3RvXzEgUE5HX0RFUFNUUlVDVDsgLyogY29udmVydHMgZnJvbSBmaWxlIHRvIDEuMCAqLwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfc0JJVF9TVVBQT1JURUQpCi0gICBwbmdfY29sb3JfOCBzaWdfYml0IFBOR19ERVBTVFJVQ1Q7ICAgICAgIC8qIHNpZ25pZmljYW50IGJpdHMgaW4gZWFjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgY2hhbm5lbCAqLwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVEKQotICAgcG5nX2NvbG9yXzggc2hpZnQgUE5HX0RFUFNUUlVDVDsgICAgICAgICAvKiBzaGlmdCBmb3Igc2lnbmlmaWNhbnQgYml0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5mb3JtYXRpb24gKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfdFJOU19TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIFwKLSB8fCBkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCi0gICBwbmdfYnl0ZXAgdHJhbnNfYWxwaGEgUE5HX0RFUFNUUlVDVDsgICAgICAgICAgIC8qIGFscGhhIHZhbHVlcyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZWQgZmlsZXMgKi8KLSAgIHBuZ19jb2xvcl8xNiB0cmFuc19jb2xvciBQTkdfREVQU1RSVUNUOyAgLyogdHJhbnNwYXJlbnQgY29sb3IgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1wYWxldHRlZCBmaWxlcyAqLwotI2VuZGlmCi0KLSAgIHBuZ19yZWFkX3N0YXR1c19wdHIgcmVhZF9yb3dfZm4gUE5HX0RFUFNUUlVDVDsgICAvKiBjYWxsZWQgYWZ0ZXIgZWFjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyBpcyBkZWNvZGVkICovCi0gICBwbmdfd3JpdGVfc3RhdHVzX3B0ciB3cml0ZV9yb3dfZm4gUE5HX0RFUFNUUlVDVDsgLyogY2FsbGVkIGFmdGVyIGVhY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgaXMgZW5jb2RlZCAqLwotI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRAotICAgcG5nX3Byb2dyZXNzaXZlX2luZm9fcHRyIGluZm9fZm4gUE5HX0RFUFNUUlVDVDsgLyogY2FsbGVkIGFmdGVyIGhlYWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBmdWxseSByZWFkICovCi0gICBwbmdfcHJvZ3Jlc3NpdmVfcm93X3B0ciByb3dfZm4gUE5HX0RFUFNUUlVDVDsgICAvKiBjYWxsZWQgYWZ0ZXIgZWFjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZy4gcm93IGlzIGRlY29kZWQgKi8KLSAgIHBuZ19wcm9ncmVzc2l2ZV9lbmRfcHRyIGVuZF9mbiBQTkdfREVQU1RSVUNUOyAgIC8qIGNhbGxlZCBhZnRlciBpbWFnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgY29tcGxldGUgKi8KLSAgIHBuZ19ieXRlcCBzYXZlX2J1ZmZlcl9wdHIgUE5HX0RFUFNUUlVDVDsgICAgICAgIC8qIGN1cnJlbnQgbG9jYXRpb24gaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVfYnVmZmVyICovCi0gICBwbmdfYnl0ZXAgc2F2ZV9idWZmZXIgUE5HX0RFUFNUUlVDVDsgICAgICAgICAgICAvKiBidWZmZXIgZm9yIHByZXZpb3VzbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgZGF0YSAqLwotICAgcG5nX2J5dGVwIGN1cnJlbnRfYnVmZmVyX3B0ciBQTkdfREVQU1RSVUNUOyAgICAgLyogY3VycmVudCBsb2NhdGlvbiBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9idWZmZXIgKi8KLSAgIHBuZ19ieXRlcCBjdXJyZW50X2J1ZmZlciBQTkdfREVQU1RSVUNUOyAgICAgICAgIC8qIGJ1ZmZlciBmb3IgcmVjZW50bHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgZGF0YSAqLwotICAgcG5nX3VpbnRfMzIgcHVzaF9sZW5ndGggUE5HX0RFUFNUUlVDVDsgICAgICAgICAgLyogc2l6ZSBvZiBjdXJyZW50IGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuayAqLwotICAgcG5nX3VpbnRfMzIgc2tpcF9sZW5ndGggUE5HX0RFUFNUUlVDVDsgICAgICAgICAgLyogYnl0ZXMgdG8gc2tpcCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgZGF0YSAqLwotICAgcG5nX3NpemVfdCBzYXZlX2J1ZmZlcl9zaXplIFBOR19ERVBTVFJVQ1Q7ICAgICAgLyogYW1vdW50IG9mIGRhdGEgbm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBzYXZlX2J1ZmZlciAqLwotICAgcG5nX3NpemVfdCBzYXZlX2J1ZmZlcl9tYXggUE5HX0RFUFNUUlVDVDsgICAgICAgLyogdG90YWwgc2l6ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZV9idWZmZXIgKi8KLSAgIHBuZ19zaXplX3QgYnVmZmVyX3NpemUgUE5HX0RFUFNUUlVDVDsgICAgICAgICAgIC8qIHRvdGFsIGFtb3VudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIGlucHV0IGRhdGEgKi8KLSAgIHBuZ19zaXplX3QgY3VycmVudF9idWZmZXJfc2l6ZSBQTkdfREVQU1RSVUNUOyAgIC8qIGFtb3VudCBvZiBkYXRhIG5vdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY3VycmVudF9idWZmZXIgKi8KLSAgIGludCBwcm9jZXNzX21vZGUgUE5HX0RFUFNUUlVDVDsgICAgICAgICAgICAgICAgIC8qIHdoYXQgcHVzaCBsaWJyYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBjdXJyZW50bHkgZG9pbmcgKi8KLSAgIGludCBjdXJfcGFsZXR0ZSBQTkdfREVQU1RSVUNUOyAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgcHVzaCBsaWJyYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlIGluZGV4ICovCi0KLSMgIGlmZGVmIFBOR19URVhUX1NVUFBPUlRFRAotICAgICBwbmdfc2l6ZV90IGN1cnJlbnRfdGV4dF9zaXplIFBOR19ERVBTVFJVQ1Q7ICAgLyogY3VycmVudCBzaXplIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0IGlucHV0IGRhdGEgKi8KLSAgICAgcG5nX3NpemVfdCBjdXJyZW50X3RleHRfbGVmdCBQTkdfREVQU1RSVUNUOyAgIC8qIGhvdyBtdWNoIHRleHQgbGVmdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVhZCBpbiBpbnB1dCAqLwotICAgICBwbmdfY2hhcnAgY3VycmVudF90ZXh0IFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgLyogY3VycmVudCB0ZXh0IGNodW5rCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgKi8KLSAgICAgcG5nX2NoYXJwIGN1cnJlbnRfdGV4dF9wdHIgUE5HX0RFUFNUUlVDVDsgICAgIC8qIGN1cnJlbnQgbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGN1cnJlbnRfdGV4dCAqLwotIyAgZW5kaWYgLyogUE5HX1BST0dSRVNTSVZFX1JFQURfU1VQUE9SVEVEICYmIFBOR19URVhUX1NVUFBPUlRFRCAqLwotCi0jZW5kaWYgLyogUE5HX1BST0dSRVNTSVZFX1JFQURfU1VQUE9SVEVEICovCi0KLSNpZiBkZWZpbmVkKF9fVFVSQk9DX18pICYmICFkZWZpbmVkKF9XaW5kb3dzKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykKLS8qIEZvciB0aGUgQm9ybGFuZCBzcGVjaWFsIDY0SyBzZWdtZW50IGhhbmRsZXIgKi8KLSAgIHBuZ19ieXRlcHAgb2Zmc2V0X3RhYmxlX3B0ciBQTkdfREVQU1RSVUNUOwotICAgcG5nX2J5dGVwIG9mZnNldF90YWJsZSBQTkdfREVQU1RSVUNUOwotICAgcG5nX3VpbnRfMTYgb2Zmc2V0X3RhYmxlX251bWJlciBQTkdfREVQU1RSVUNUOwotICAgcG5nX3VpbnRfMTYgb2Zmc2V0X3RhYmxlX2NvdW50IFBOR19ERVBTVFJVQ1Q7Ci0gICBwbmdfdWludF8xNiBvZmZzZXRfdGFibGVfY291bnRfZnJlZSBQTkdfREVQU1RSVUNUOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9RVUFOVElaRV9TVVBQT1JURUQKLSAgIHBuZ19ieXRlcCBwYWxldHRlX2xvb2t1cCBQTkdfREVQU1RSVUNUOyAvKiBsb29rdXAgdGFibGUgZm9yIHF1YW50aXppbmcgKi8KLSAgIHBuZ19ieXRlcCBxdWFudGl6ZV9pbmRleCBQTkdfREVQU1RSVUNUOyAvKiBpbmRleCB0cmFuc2xhdGlvbiBmb3IgcGFsZXR0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfUVVBTlRJWkVfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19oSVNUX1NVUFBPUlRFRCkKLSAgIHBuZ191aW50XzE2cCBoaXN0IFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgICAgICAgIC8qIGhpc3RvZ3JhbSAqLwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRAotICAgcG5nX2J5dGUgaGV1cmlzdGljX21ldGhvZCBQTkdfREVQU1RSVUNUOyAgICAgICAgLyogaGV1cmlzdGljIGZvciByb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciBzZWxlY3Rpb24gKi8KLSAgIHBuZ19ieXRlIG51bV9wcmV2X2ZpbHRlcnMgUE5HX0RFUFNUUlVDVDsgICAgICAgIC8qIG51bWJlciBvZiB3ZWlnaHRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcHJldmlvdXMgcm93cyAqLwotICAgcG5nX2J5dGVwIHByZXZfZmlsdGVycyBQTkdfREVQU1RSVUNUOyAgICAgICAgICAgLyogZmlsdGVyIHR5cGUocykgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzIHJvdyhzKSAqLwotICAgcG5nX3VpbnRfMTZwIGZpbHRlcl93ZWlnaHRzIFBOR19ERVBTVFJVQ1Q7ICAgICAgLyogd2VpZ2h0KHMpIGZvciBwcmV2aW91cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZShzKSAqLwotICAgcG5nX3VpbnRfMTZwIGludl9maWx0ZXJfd2VpZ2h0cyBQTkdfREVQU1RSVUNUOyAgLyogMS93ZWlnaHQocykgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyBsaW5lKHMpICovCi0gICBwbmdfdWludF8xNnAgZmlsdGVyX2Nvc3RzIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAvKiByZWxhdGl2ZSBmaWx0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0aW9uIGNvc3QgKi8KLSAgIHBuZ191aW50XzE2cCBpbnZfZmlsdGVyX2Nvc3RzIFBOR19ERVBTVFJVQ1Q7ICAgIC8qIDEvcmVsYXRpdmUgZmlsdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGlvbiBjb3N0ICovCi0jZW5kaWYKLQotI2lmZGVmIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVECi0gICBwbmdfY2hhcnAgdGltZV9idWZmZXIgUE5HX0RFUFNUUlVDVDsgLyogU3RyaW5nIHRvIGhvbGQgUkZDIDExMjMgdGltZSB0ZXh0ICovCi0jZW5kaWYKLQotLyogTmV3IG1lbWJlcnMgYWRkZWQgaW4gbGlicG5nLTEuMC42ICovCi0KLSAgIHBuZ191aW50XzMyIGZyZWVfbWUgUE5HX0RFUFNUUlVDVDsgICAgLyogZmxhZ3MgaXRlbXMgbGlicG5nIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nICovCi0KLSNpZmRlZiBQTkdfVVNFUl9DSFVOS1NfU1VQUE9SVEVECi0gICBwbmdfdm9pZHAgdXNlcl9jaHVua19wdHIgUE5HX0RFUFNUUlVDVDsKLSAgIHBuZ191c2VyX2NodW5rX3B0ciByZWFkX3VzZXJfY2h1bmtfZm4gUE5HX0RFUFNUUlVDVDsgLyogdXNlciByZWFkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rIGhhbmRsZXIgKi8KLSNlbmRpZgotCi0jaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAotICAgaW50IG51bV9jaHVua19saXN0IFBOR19ERVBTVFJVQ1Q7Ci0gICBwbmdfYnl0ZXAgY2h1bmtfbGlzdCBQTkdfREVQU1RSVUNUOwotI2VuZGlmCi0KLS8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjAuMyAqLwotI2lmZGVmIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRAotICAgcG5nX2J5dGUgcmdiX3RvX2dyYXlfc3RhdHVzIFBOR19ERVBTVFJVQ1Q7Ci0gICAvKiBUaGVzZSB3ZXJlIGNoYW5nZWQgZnJvbSBwbmdfYnl0ZSBpbiBsaWJwbmctMS4wLjYgKi8KLSAgIHBuZ191aW50XzE2IHJnYl90b19ncmF5X3JlZF9jb2VmZiBQTkdfREVQU1RSVUNUOwotICAgcG5nX3VpbnRfMTYgcmdiX3RvX2dyYXlfZ3JlZW5fY29lZmYgUE5HX0RFUFNUUlVDVDsKLSAgIHBuZ191aW50XzE2IHJnYl90b19ncmF5X2JsdWVfY29lZmYgUE5HX0RFUFNUUlVDVDsKLSNlbmRpZgotCi0vKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjAuNCAocmVuYW1lZCBpbiAxLjAuOSkgKi8KLSNpZiBkZWZpbmVkKFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfUkVBRF9FTVBUWV9QTFRFX1NVUFBPUlRFRCkgfHwgXAotICAgIGRlZmluZWQoUE5HX1dSSVRFX0VNUFRZX1BMVEVfU1VQUE9SVEVEKQotLyogQ2hhbmdlZCBmcm9tIHBuZ19ieXRlIHRvIHBuZ191aW50XzMyIGF0IHZlcnNpb24gMS4yLjAgKi8KLSAgIHBuZ191aW50XzMyIG1uZ19mZWF0dXJlc19wZXJtaXR0ZWQgUE5HX0RFUFNUUlVDVDsKLSNlbmRpZgotCi0vKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjAuNyAqLwotI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQotICAgcG5nX2ZpeGVkX3BvaW50IGludF9nYW1tYSBQTkdfREVQU1RSVUNUOwotI2VuZGlmCi0KLS8qIE5ldyBtZW1iZXIgYWRkZWQgaW4gbGlicG5nLTEuMC45LCBpZmRlZidlZCBvdXQgaW4gMS4wLjEyLCBlbmFibGVkIGluIDEuMi4wICovCi0jaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKLSAgIHBuZ19ieXRlIGZpbHRlcl90eXBlIFBOR19ERVBTVFJVQ1Q7Ci0jZW5kaWYKLQotLyogTmV3IG1lbWJlcnMgYWRkZWQgaW4gbGlicG5nLTEuMi4wICovCi0KLS8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjAuMiBidXQgZmlyc3QgZW5hYmxlZCBieSBkZWZhdWx0IGluIDEuMi4wICovCi0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgcG5nX3ZvaWRwIG1lbV9wdHIgUE5HX0RFUFNUUlVDVDsgICAgICAgICAgICAgLyogdXNlciBzdXBwbGllZCBzdHJ1Y3QgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW0gZnVuY3Rpb25zICovCi0gICBwbmdfbWFsbG9jX3B0ciBtYWxsb2NfZm4gUE5HX0RFUFNUUlVDVDsgICAgICAvKiBmdW5jdGlvbiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpbmcgbWVtb3J5ICovCi0gICBwbmdfZnJlZV9wdHIgZnJlZV9mbiBQTkdfREVQU1RSVUNUOyAgICAgICAgICAvKiBmdW5jdGlvbiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVpbmcgbWVtb3J5ICovCi0jZW5kaWYKLQotLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4wLjEzIGFuZCAxLjIuMCAqLwotICAgcG5nX2J5dGVwIGJpZ19yb3dfYnVmIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgLyogYnVmZmVyIHRvIHNhdmUgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuZmlsdGVyZWQpIHJvdyAqLwotCi0jaWZkZWYgUE5HX1JFQURfUVVBTlRJWkVfU1VQUE9SVEVECi0vKiBUaGUgZm9sbG93aW5nIHRocmVlIG1lbWJlcnMgd2VyZSBhZGRlZCBhdCB2ZXJzaW9uIDEuMC4xNCBhbmQgMS4yLjQgKi8KLSAgIHBuZ19ieXRlcCBxdWFudGl6ZV9zb3J0IFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgIC8qIHdvcmtpbmcgc29ydCBhcnJheSAqLwotICAgcG5nX2J5dGVwIGluZGV4X3RvX3BhbGV0dGUgUE5HX0RFUFNUUlVDVDsgICAgICAgLyogd2hlcmUgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4IGN1cnJlbnRseSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcGFsZXR0ZSAqLwotICAgcG5nX2J5dGVwIHBhbGV0dGVfdG9faW5kZXggUE5HX0RFUFNUUlVDVDsgICAgICAgLyogd2hpY2ggb3JpZ2luYWwgaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyB0byB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlIGNvbG9yICovCi0jZW5kaWYKLQotLyogTmV3IG1lbWJlcnMgYWRkZWQgaW4gbGlicG5nLTEuMC4xNiBhbmQgMS4yLjYgKi8KLSAgIHBuZ19ieXRlIGNvbXByZXNzaW9uX3R5cGUgUE5HX0RFUFNUUlVDVDsKLQotI2lmZGVmIFBOR19VU0VSX0xJTUlUU19TVVBQT1JURUQKLSAgIHBuZ191aW50XzMyIHVzZXJfd2lkdGhfbWF4IFBOR19ERVBTVFJVQ1Q7Ci0gICBwbmdfdWludF8zMiB1c2VyX2hlaWdodF9tYXggUE5HX0RFUFNUUlVDVDsKLSAgIC8qIEFkZGVkIGluIGxpYnBuZy0xLjQuMDogVG90YWwgbnVtYmVyIG9mIHNQTFQsIHRleHQsIGFuZCB1bmtub3duCi0gICAgKiBjaHVua3MgdGhhdCBjYW4gYmUgc3RvcmVkICgwIG1lYW5zIHVubGltaXRlZCkuCi0gICAgKi8KLSAgIHBuZ191aW50XzMyIHVzZXJfY2h1bmtfY2FjaGVfbWF4IFBOR19ERVBTVFJVQ1Q7Ci0jZW5kaWYKLQotLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4wLjI1IGFuZCAxLjIuMTcgKi8KLSNpZmRlZiBQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECi0gICAvKiBTdG9yYWdlIGZvciB1bmtub3duIGNodW5rIHRoYXQgdGhlIGxpYnJhcnkgZG9lc24ndCByZWNvZ25pemUuICovCi0gICBwbmdfdW5rbm93bl9jaHVuayB1bmtub3duX2NodW5rIFBOR19ERVBTVFJVQ1Q7Ci0jZW5kaWYKLQotLyogTmV3IG1lbWJlcnMgYWRkZWQgaW4gbGlicG5nLTEuMi4yNiAqLwotICBwbmdfdWludF8zMiBvbGRfYmlnX3Jvd19idWZfc2l6ZSBQTkdfREVQU1RSVUNUOwotICBwbmdfdWludF8zMiBvbGRfcHJldl9yb3dfc2l6ZSBQTkdfREVQU1RSVUNUOwotCi0vKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjIuMzAgKi8KLSAgcG5nX2NoYXJwIGNodW5rZGF0YSBQTkdfREVQU1RSVUNUOyAgLyogYnVmZmVyIGZvciByZWFkaW5nIGNodW5rIGRhdGEgKi8KLQotI2lmZGVmIFBOR19JT19TVEFURV9TVVBQT1JURUQKLS8qIE5ldyBtZW1iZXIgYWRkZWQgaW4gbGlicG5nLTEuNC4wICovCi0gICBwbmdfdWludF8zMiBpb19zdGF0ZSBQTkdfREVQU1RSVUNUOwotI2VuZGlmCi19OwotCi0KLS8qIFRoaXMgdHJpZ2dlcnMgYSBjb21waWxlciBlcnJvciBpbiBwbmcuYywgaWYgcG5nLmMgYW5kIHBuZy5oCi0gKiBkbyBub3QgYWdyZWUgdXBvbiB0aGUgdmVyc2lvbiBudW1iZXIuCi0gKi8KLXR5cGVkZWYgcG5nX3N0cnVjdHAgdmVyc2lvbl8xXzRfMTI7Ci0KLXR5cGVkZWYgcG5nX3N0cnVjdCBGQVIgKiBGQVIgKiBwbmdfc3RydWN0cHA7Ci0KLS8qIEhlcmUgYXJlIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9ucyBtb3N0IGNvbW1vbmx5IHVzZWQuICBUaGlzIGlzIG5vdAotICogdGhlIHBsYWNlIHRvIGZpbmQgb3V0IGhvdyB0byB1c2UgbGlicG5nLiAgU2VlIGxpYnBuZy50eHQgZm9yIHRoZQotICogZnVsbCBleHBsYW5hdGlvbiwgc2VlIGV4YW1wbGUuYyBmb3IgdGhlIHN1bW1hcnkuICBUaGlzIGp1c3QgcHJvdmlkZXMKLSAqIGEgc2ltcGxlIG9uZSBsaW5lIGRlc2NyaXB0aW9uIG9mIHRoZSB1c2Ugb2YgZWFjaCBmdW5jdGlvbi4KLSAqLwotCi0vKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbGlicmFyeSAqLwotUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfYWNjZXNzX3ZlcnNpb25fbnVtYmVyKSBQTkdBUkcoKHZvaWQpKTsKLQotLyogVGVsbCBsaWIgd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIGZpcnN0IDxudW1fYnl0ZXM+IG1hZ2ljIGJ5dGVzLgotICogSGFuZGxpbmcgbW9yZSB0aGFuIDggYnl0ZXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIGlzIGFuIGVycm9yLgotICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9zaWdfYnl0ZXMpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIGludCBudW1fYnl0ZXMpKTsKLQotLyogQ2hlY2sgc2lnW3N0YXJ0XSB0aHJvdWdoIHNpZ1tzdGFydCArIG51bV90b19jaGVjayAtIDFdIHRvIHNlZSBpZiBpdCdzIGEKLSAqIFBORyBmaWxlLiAgUmV0dXJucyB6ZXJvIGlmIHRoZSBzdXBwbGllZCBieXRlcyBtYXRjaCB0aGUgOC1ieXRlIFBORwotICogc2lnbmF0dXJlLCBhbmQgbm9uLXplcm8gb3RoZXJ3aXNlLiAgSGF2aW5nIG51bV90b19jaGVjayA9PSAwIG9yCi0gKiBzdGFydCA+IDcgd2lsbCBhbHdheXMgZmFpbCAoaWUgcmV0dXJuIG5vbi16ZXJvKS4KLSAqLwotUE5HX0VYUE9SVChpbnQscG5nX3NpZ19jbXApIFBOR0FSRygocG5nX2J5dGVwIHNpZywgcG5nX3NpemVfdCBzdGFydCwKLSAgIHBuZ19zaXplX3QgbnVtX3RvX2NoZWNrKSk7Ci0KLS8qIFNpbXBsZSBzaWduYXR1cmUgY2hlY2tpbmcgZnVuY3Rpb24uICBUaGlzIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcKLSAqIHBuZ19jaGVja19zaWcoc2lnLCBuKSA6PSAhcG5nX3NpZ19jbXAoc2lnLCAwLCBuKS4KLSAqLwotI2RlZmluZSBwbmdfY2hlY2tfc2lnKHNpZyxuKSAhcG5nX3NpZ19jbXAoKHNpZyksIDAsIChuKSkKLQotLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcG5nX3B0ciBzdHJ1Y3QgZm9yIHJlYWRpbmcsIGFuZCBhbnkgb3RoZXIgbWVtb3J5LiAqLwotUE5HX0VYUE9SVChwbmdfc3RydWN0cCxwbmdfY3JlYXRlX3JlYWRfc3RydWN0KQotICAgUE5HQVJHKChwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLAotICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwgcG5nX2Vycm9yX3B0ciB3YXJuX2ZuKSkgUE5HX0FMTE9DQVRFRDsKLQotLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcG5nX3B0ciBzdHJ1Y3QgZm9yIHdyaXRpbmcsIGFuZCBhbnkgb3RoZXIgbWVtb3J5ICovCi1QTkdfRVhQT1JUKHBuZ19zdHJ1Y3RwLHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KQotICAgUE5HQVJHKChwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLAotICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwgcG5nX2Vycm9yX3B0ciB3YXJuX2ZuKSkgUE5HX0FMTE9DQVRFRDsKLQotUE5HX0VYUE9SVChwbmdfc2l6ZV90LHBuZ19nZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUpCi0gICBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIpKTsKLQotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUpCi0gICBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19zaXplX3Qgc2l6ZSkpOwotCi0vKiBNb3ZlZCBmcm9tIHBuZ2NvbmYuaCBpbiAxLjQuMCBhbmQgbW9kaWZpZWQgdG8gZW5zdXJlIHNldGptcC9sb25nam1wCi0gKiBtYXRjaCB1cC4KLSAqLwotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGptcF9idWYgYnVpbHQgaW4gdG8gKnBuZ19wdHIuICBJdCBtdXN0IGJlCi0gKiBzdXBwbGllZCB3aXRoIGFuIGFwcHJvcHJpYXRlICdsb25nam1wJyBmdW5jdGlvbiB0byB1c2Ugb24gdGhhdCBqbXBfYnVmCi0gKiB1bmxlc3MgdGhlIGRlZmF1bHQgZXJyb3IgZnVuY3Rpb24gaXMgb3ZlcnJpZGRlbiBpbiB3aGljaCBjYXNlIE5VTEwgaXMKLSAqIGFjY2VwdGFibGUuICBUaGUgc2l6ZSBvZiB0aGUgam1wX2J1ZiBpcyBjaGVja2VkIGFnYWluc3QgdGhlIGFjdHVhbCBzaXplCi0gKiBhbGxvY2F0ZWQgYnkgdGhlIGxpYnJhcnkgLSB0aGUgY2FsbCB3aWxsIHJldHVybiBOVUxMIG9uIGEgbWlzbWF0Y2gKLSAqIGluZGljYXRpbmcgYW4gQUJJIG1pc21hdGNoLgotICovCi1QTkdfRVhQT1JUKGptcF9idWYqLCBwbmdfc2V0X2xvbmdqbXBfZm4pCi0gICBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19sb25nam1wX3B0ciBsb25nam1wX2ZuLCBzaXplX3QKLSAgICAgICBqbXBfYnVmX3NpemUpKTsKLSMgIGRlZmluZSBwbmdfam1wYnVmKHBuZ19wdHIpIFwKLSAgICgqcG5nX3NldF9sb25nam1wX2ZuKChwbmdfcHRyKSwgbG9uZ2ptcCwgc2l6ZW9mIChqbXBfYnVmKSkpCi0jZWxzZQotIyAgZGVmaW5lIHBuZ19qbXBidWYocG5nX3B0cikgXAotICAgKExJQlBOR19XQVNfQ09NUElMRURfV0lUSF9fUE5HX05PX1NFVEpNUCkKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECi0vKiBSZXNldCB0aGUgY29tcHJlc3Npb24gc3RyZWFtICovCi1QTkdfRVhQT1JUKGludCxwbmdfcmVzZXRfenN0cmVhbSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0jZW5kaWYKLQotLyogTmV3IGZ1bmN0aW9ucyBhZGRlZCBpbiBsaWJwbmctMS4wLjIgKG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQgdW50aWwgMS4yLjApICovCi0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotUE5HX0VYUE9SVChwbmdfc3RydWN0cCxwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIpCi0gICBQTkdBUkcoKHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ192b2lkcCBlcnJvcl9wdHIsCi0gICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLCBwbmdfZXJyb3JfcHRyIHdhcm5fZm4sIHBuZ192b2lkcCBtZW1fcHRyLAotICAgcG5nX21hbGxvY19wdHIgbWFsbG9jX2ZuLCBwbmdfZnJlZV9wdHIgZnJlZV9mbikpIFBOR19BTExPQ0FURUQ7Ci1QTkdfRVhQT1JUKHBuZ19zdHJ1Y3RwLHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIpCi0gICBQTkdBUkcoKHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ192b2lkcCBlcnJvcl9wdHIsCi0gICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLCBwbmdfZXJyb3JfcHRyIHdhcm5fZm4sIHBuZ192b2lkcCBtZW1fcHRyLAotICAgcG5nX21hbGxvY19wdHIgbWFsbG9jX2ZuLCBwbmdfZnJlZV9wdHIgZnJlZV9mbikpIFBOR19BTExPQ0FURUQ7Ci0jZW5kaWYKLQotLyogV3JpdGUgdGhlIFBORyBmaWxlIHNpZ25hdHVyZS4gKi8KLVBOR19FWFBPUlQodm9pZCxwbmdfd3JpdGVfc2lnKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLQotLyogV3JpdGUgYSBQTkcgY2h1bmsgLSBzaXplLCB0eXBlLCAob3B0aW9uYWwpIGRhdGEsIENSQy4gKi8KLVBOR19FWFBPUlQodm9pZCxwbmdfd3JpdGVfY2h1bmspIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19ieXRlcCBjaHVua19uYW1lLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpKTsKLQotLyogV3JpdGUgdGhlIHN0YXJ0IG9mIGEgUE5HIGNodW5rIC0gbGVuZ3RoIGFuZCBjaHVuayBuYW1lLiAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9jaHVua19zdGFydCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2J5dGVwIGNodW5rX25hbWUsIHBuZ191aW50XzMyIGxlbmd0aCkpOwotCi0vKiBXcml0ZSB0aGUgZGF0YSBvZiBhIFBORyBjaHVuayBzdGFydGVkIHdpdGggcG5nX3dyaXRlX2NodW5rX3N0YXJ0KCkuICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX3dyaXRlX2NodW5rX2RhdGEpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkpOwotCi0vKiBGaW5pc2ggYSBjaHVuayBzdGFydGVkIHdpdGggcG5nX3dyaXRlX2NodW5rX3N0YXJ0KCkgKGluY2x1ZGVzIENSQykuICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX3dyaXRlX2NodW5rX2VuZCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0KLS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBpbmZvIHN0cnVjdHVyZSAqLwotUE5HX0VYUE9SVChwbmdfaW5mb3AscG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCkKLSAgIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpIFBOR19BTExPQ0FURUQ7Ci0KLVBOR19FWFBPUlQodm9pZCxwbmdfaW5mb19pbml0XzMpIFBOR0FSRygocG5nX2luZm9wcCBpbmZvX3B0ciwKLSAgICBwbmdfc2l6ZV90IHBuZ19pbmZvX3N0cnVjdF9zaXplKSk7Ci0KLS8qIFdyaXRlcyBhbGwgdGhlIFBORyBpbmZvcm1hdGlvbiBiZWZvcmUgdGhlIGltYWdlLiAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIpKTsKLVBOR19FWFBPUlQodm9pZCxwbmdfd3JpdGVfaW5mbykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci0KLSNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAotLyogUmVhZCB0aGUgaW5mb3JtYXRpb24gYmVmb3JlIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YS4gKi8KLVBOR19FWFBPUlQodm9pZCxwbmdfcmVhZF9pbmZvKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQKLVBOR19FWFBPUlQocG5nX2NoYXJwLHBuZ19jb252ZXJ0X3RvX3JmYzExMjMpCi0gICBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ190aW1lcCBwdGltZSkpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfQ09OVkVSVF90SU1FX1NVUFBPUlRFRAotLyogQ29udmVydCBmcm9tIGEgc3RydWN0IHRtIHRvIHBuZ190aW1lICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0pIFBOR0FSRygocG5nX3RpbWVwIHB0aW1lLAotICAgc3RydWN0IHRtIEZBUiAqIHR0aW1lKSk7Ci0KLS8qIENvbnZlcnQgZnJvbSB0aW1lX3QgdG8gcG5nX3RpbWUuICBVc2VzIGdtdGltZSgpICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX2NvbnZlcnRfZnJvbV90aW1lX3QpIFBOR0FSRygocG5nX3RpbWVwIHB0aW1lLAotICAgdGltZV90IHR0aW1lKSk7Ci0jZW5kaWYgLyogUE5HX0NPTlZFUlRfdElNRV9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKLS8qIEV4cGFuZCBkYXRhIHRvIDI0LWJpdCBSR0IsIG9yIDgtYml0IGdyYXlzY2FsZSwgd2l0aCBhbHBoYSBpZiBhdmFpbGFibGUuICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9leHBhbmQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCkgUE5HQVJHKChwbmdfc3RydWN0cAotICBwbmdfcHRyKSk7Ci1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9wYWxldHRlX3RvX3JnYikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF90Uk5TX3RvX2FscGhhKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9CR1JfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9CR1JfU1VQUE9SVEVEKQotLyogVXNlIGJsdWUsIGdyZWVuLCByZWQgb3JkZXIgZm9yIHBpeGVscy4gKi8KLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2JncikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRAotLyogRXhwYW5kIHRoZSBncmF5c2NhbGUgdG8gMjQtYml0IFJHQiBpZiBuZWNlc3NhcnkuICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9ncmF5X3RvX3JnYikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRAotLyogUmVkdWNlIFJHQiB0byBncmF5c2NhbGUuICovCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfcmdiX3RvX2dyYXkpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIGludCBlcnJvcl9hY3Rpb24sIGRvdWJsZSByZWQsIGRvdWJsZSBncmVlbiApKTsKLSNlbmRpZgotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIGludCBlcnJvcl9hY3Rpb24sIHBuZ19maXhlZF9wb2ludCByZWQsIHBuZ19maXhlZF9wb2ludCBncmVlbiApKTsKLVBOR19FWFBPUlQocG5nX2J5dGUscG5nX2dldF9yZ2JfdG9fZ3JheV9zdGF0dXMpIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAKLSAgIHBuZ19wdHIpKTsKLSNlbmRpZgotCi1QTkdfRVhQT1JUKHZvaWQscG5nX2J1aWxkX2dyYXlzY2FsZV9wYWxldHRlKSBQTkdBUkcoKGludCBiaXRfZGVwdGgsCi0gICBwbmdfY29sb3JwIHBhbGV0dGUpKTsKLQotI2lmZGVmIFBOR19SRUFEX1NUUklQX0FMUEhBX1NVUFBPUlRFRAotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfc3RyaXBfYWxwaGEpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NXQVBfQUxQSEFfU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQpCi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9zd2FwX2FscGhhKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfQUxQSEFfU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfV1JJVEVfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRCkKLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2ludmVydF9hbHBoYSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRCkKLS8qIEFkZCBhIGZpbGxlciBieXRlIHRvIDgtYml0IEdyYXkgb3IgMjQtYml0IFJHQiBpbWFnZXMuICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9maWxsZXIpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ191aW50XzMyIGZpbGxlciwgaW50IGZsYWdzKSk7Ci0vKiBUaGUgdmFsdWVzIG9mIHRoZSBQTkdfRklMTEVSXyBkZWZpbmVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZCAqLwotI2RlZmluZSBQTkdfRklMTEVSX0JFRk9SRSAwCi0jZGVmaW5lIFBOR19GSUxMRVJfQUZURVIgMQotLyogQWRkIGFuIGFscGhhIGJ5dGUgdG8gOC1iaXQgR3JheSBvciAyNC1iaXQgUkdCIGltYWdlcy4gKi8KLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2FkZF9hbHBoYSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX3VpbnRfMzIgZmlsbGVyLCBpbnQgZmxhZ3MpKTsKLSNlbmRpZiAvKiBQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEIHx8IFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEICovCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NXQVBfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TV0FQX1NVUFBPUlRFRCkKLS8qIFN3YXAgYnl0ZXMgaW4gMTYtYml0IGRlcHRoIGZpbGVzLiAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfc3dhcCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS19TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVEKQotLyogVXNlIDEgYnl0ZSBwZXIgcGl4ZWwgaW4gMSwgMiwgb3IgNC1iaXQgZGVwdGggZmlsZXMuICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9wYWNraW5nKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQpCi0vKiBTd2FwIHBhY2tpbmcgb3JkZXIgb2YgcGl4ZWxzIGluIGJ5dGVzLiAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfcGFja3N3YXApIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVEKQotLyogQ29udmVydHMgZmlsZXMgdG8gbGVnYWwgYml0IGRlcHRocy4gKi8KLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3NoaWZ0KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfY29sb3JfOHAgdHJ1ZV9iaXRzKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVEKQotLyogSGF2ZSB0aGUgY29kZSBoYW5kbGUgdGhlIGludGVybGFjaW5nLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhc3Nlcy4gKi8KLVBOR19FWFBPUlQoaW50LHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEKQotLyogSW52ZXJ0IG1vbm9jaHJvbWUgZmlsZXMgKi8KLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2ludmVydF9tb25vKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKLS8qIEhhbmRsZSBhbHBoYSBhbmQgdFJOUyBieSByZXBsYWNpbmcgd2l0aCBhIGJhY2tncm91bmQgY29sb3IuICovCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfYmFja2dyb3VuZCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2NvbG9yXzE2cCBiYWNrZ3JvdW5kX2NvbG9yLCBpbnQgYmFja2dyb3VuZF9nYW1tYV9jb2RlLAotICAgaW50IG5lZWRfZXhwYW5kLCBkb3VibGUgYmFja2dyb3VuZF9nYW1tYSkpOwotI2VuZGlmCi0jZGVmaW5lIFBOR19CQUNLR1JPVU5EX0dBTU1BX1VOS05PV04gMAotI2RlZmluZSBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4gIDEKLSNkZWZpbmUgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfRklMRSAgICAyCi0jZGVmaW5lIFBOR19CQUNLR1JPVU5EX0dBTU1BX1VOSVFVRSAgMwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF8xNl9UT184X1NVUFBPUlRFRAotLyogU3RyaXAgdGhlIHNlY29uZCBieXRlIG9mIGluZm9ybWF0aW9uIGZyb20gYSAxNi1iaXQgZGVwdGggZmlsZS4gKi8KLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3N0cmlwXzE2KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfUVVBTlRJWkVfU1VQUE9SVEVECi0vKiBUdXJuIG9uIHF1YW50aXppbmcsIGFuZCByZWR1Y2UgdGhlIHBhbGV0dGUgdG8gdGhlIG51bWJlciBvZiBjb2xvcnMKLSAqIGF2YWlsYWJsZS4gIFByaW9yIHRvIGxpYnBuZy0xLjQuMiwgdGhpcyB3YXMgcG5nX3NldF9kaXRoZXIoKS4KLSAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfcXVhbnRpemUpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb2xvcnAgcGFsZXR0ZSwgaW50IG51bV9wYWxldHRlLCBpbnQgbWF4aW11bV9jb2xvcnMsCi0gICBwbmdfdWludF8xNnAgaGlzdG9ncmFtLCBpbnQgZnVsbF9xdWFudGl6ZSkpOwotI2VuZGlmCi0vKiBUaGlzIG1pZ3JhdGlvbiBhaWQgd2lsbCBiZSByZW1vdmVkIGZyb20gbGlicG5nLTEuNS4wICovCi0jZGVmaW5lIHBuZ19zZXRfZGl0aGVyIHBuZ19zZXRfcXVhbnRpemUKLQotI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAotLyogSGFuZGxlIGdhbW1hIGNvcnJlY3Rpb24uIFNjcmVlbl9nYW1tYT0oZGlzcGxheV9leHBvbmVudCkgKi8KLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9nYW1tYSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgZG91YmxlIHNjcmVlbl9nYW1tYSwgZG91YmxlIGRlZmF1bHRfZmlsZV9nYW1tYSkpOwotI2VuZGlmCi0jZW5kaWYKLQotCi0jaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRAotLyogU2V0IGhvdyBtYW55IGxpbmVzIGJldHdlZW4gb3V0cHV0IGZsdXNoZXMgLSAwIGZvciBubyBmbHVzaGluZyAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfZmx1c2gpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IG5yb3dzKSk7Ci0vKiBGbHVzaCB0aGUgY3VycmVudCBQTkcgb3V0cHV0IGJ1ZmZlciAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9mbHVzaCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0jZW5kaWYKLQotLyogT3B0aW9uYWwgdXBkYXRlIHBhbGV0dGUgd2l0aCByZXF1ZXN0ZWQgdHJhbnNmb3JtYXRpb25zICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX3N0YXJ0X3JlYWRfaW1hZ2UpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotCi0vKiBPcHRpb25hbCBjYWxsIHRvIHVwZGF0ZSB0aGUgdXNlcnMgaW5mbyBzdHJ1Y3R1cmUgKi8KLVBOR19FWFBPUlQodm9pZCxwbmdfcmVhZF91cGRhdGVfaW5mbykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci0KLSNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAotLyogUmVhZCBvbmUgb3IgbW9yZSByb3dzIG9mIGltYWdlIGRhdGEuICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX3JlYWRfcm93cykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2J5dGVwcCByb3csIHBuZ19ieXRlcHAgZGlzcGxheV9yb3csIHBuZ191aW50XzMyIG51bV9yb3dzKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECi0vKiBSZWFkIGEgcm93IG9mIGRhdGEuICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX3JlYWRfcm93KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfYnl0ZXAgcm93LAotICAgcG5nX2J5dGVwIGRpc3BsYXlfcm93KSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECi0vKiBSZWFkIHRoZSB3aG9sZSBpbWFnZSBpbnRvIG1lbW9yeSBhdCBvbmNlLiAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19yZWFkX2ltYWdlKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfYnl0ZXBwIGltYWdlKSk7Ci0jZW5kaWYKLQotLyogV3JpdGUgYSByb3cgb2YgaW1hZ2UgZGF0YSAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9yb3cpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19ieXRlcCByb3cpKTsKLQotLyogV3JpdGUgYSBmZXcgcm93cyBvZiBpbWFnZSBkYXRhICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX3dyaXRlX3Jvd3MpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19ieXRlcHAgcm93LCBwbmdfdWludF8zMiBudW1fcm93cykpOwotCi0vKiBXcml0ZSB0aGUgaW1hZ2UgZGF0YSAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9pbWFnZSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2J5dGVwcCBpbWFnZSkpOwotCi0vKiBXcml0ZSB0aGUgZW5kIG9mIHRoZSBQTkcgZmlsZS4gKi8KLVBOR19FWFBPUlQodm9pZCxwbmdfd3JpdGVfZW5kKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIpKTsKLQotI2lmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECi0vKiBSZWFkIHRoZSBlbmQgb2YgdGhlIFBORyBmaWxlLiAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19yZWFkX2VuZCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci0jZW5kaWYKLQotLyogRnJlZSBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcG5nX2luZm9fc3RydWN0ICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcHAgaW5mb19wdHJfcHRyKSk7Ci0KLS8qIEZyZWUgYW55IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHBuZ19zdHJ1Y3QgYW5kIHRoZSBwbmdfaW5mb19zdHJ1Y3RzICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QpIFBOR0FSRygocG5nX3N0cnVjdHBwCi0gICBwbmdfcHRyX3B0ciwgcG5nX2luZm9wcCBpbmZvX3B0cl9wdHIsIHBuZ19pbmZvcHAgZW5kX2luZm9fcHRyX3B0cikpOwotCi0vKiBGcmVlIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwbmdfc3RydWN0IGFuZCB0aGUgcG5nX2luZm9fc3RydWN0cyAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCkKLSAgIFBOR0FSRygocG5nX3N0cnVjdHBwIHBuZ19wdHJfcHRyLCBwbmdfaW5mb3BwIGluZm9fcHRyX3B0cikpOwotCi0vKiBTZXQgdGhlIGxpYnBuZyBtZXRob2Qgb2YgaGFuZGxpbmcgY2h1bmsgQ1JDIGVycm9ycyAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfY3JjX2FjdGlvbikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgaW50IGNyaXRfYWN0aW9uLCBpbnQgYW5jaWxfYWN0aW9uKSk7Ci0KLS8qIFZhbHVlcyBmb3IgcG5nX3NldF9jcmNfYWN0aW9uKCkgdG8gc2F5IGhvdyB0byBoYW5kbGUgQ1JDIGVycm9ycyBpbgotICogYW5jaWxsYXJ5IGFuZCBjcml0aWNhbCBjaHVua3MsIGFuZCB3aGV0aGVyIHRvIHVzZSB0aGUgZGF0YSBjb250YWluZWQKLSAqIHRoZXJlaW4uICBOb3RlIHRoYXQgaXQgaXMgaW1wb3NzaWJsZSB0byAiZGlzY2FyZCIgZGF0YSBpbiBhIGNyaXRpY2FsCi0gKiBjaHVuay4gIEZvciB2ZXJzaW9ucyBwcmlvciB0byAwLjkwLCB0aGUgYWN0aW9uIHdhcyBhbHdheXMgZXJyb3IvcXVpdCwKLSAqIHdoZXJlYXMgaW4gdmVyc2lvbiAwLjkwIGFuZCBsYXRlciwgdGhlIGFjdGlvbiBmb3IgQ1JDIGVycm9ycyBpbiBhbmNpbGxhcnkKLSAqIGNodW5rcyBpcyB3YXJuL2Rpc2NhcmQuICBUaGVzZSB2YWx1ZXMgc2hvdWxkIE5PVCBiZSBjaGFuZ2VkLgotICoKLSAqICAgICAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjpjcml0aWNhbCAgICAgYWN0aW9uOmFuY2lsbGFyeQotICovCi0jZGVmaW5lIFBOR19DUkNfREVGQVVMVCAgICAgICAwICAvKiBlcnJvci9xdWl0ICAgICAgICAgIHdhcm4vZGlzY2FyZCBkYXRhICovCi0jZGVmaW5lIFBOR19DUkNfRVJST1JfUVVJVCAgICAxICAvKiBlcnJvci9xdWl0ICAgICAgICAgIGVycm9yL3F1aXQgICAgICAgICovCi0jZGVmaW5lIFBOR19DUkNfV0FSTl9ESVNDQVJEICAyICAvKiAoSU5WQUxJRCkgICAgICAgICAgIHdhcm4vZGlzY2FyZCBkYXRhICovCi0jZGVmaW5lIFBOR19DUkNfV0FSTl9VU0UgICAgICAzICAvKiB3YXJuL3VzZSBkYXRhICAgICAgIHdhcm4vdXNlIGRhdGEgICAgICovCi0jZGVmaW5lIFBOR19DUkNfUVVJRVRfVVNFICAgICA0ICAvKiBxdWlldC91c2UgZGF0YSAgICAgIHF1aWV0L3VzZSBkYXRhICAgICovCi0jZGVmaW5lIFBOR19DUkNfTk9fQ0hBTkdFICAgICA1ICAvKiB1c2UgY3VycmVudCB2YWx1ZSAgIHVzZSBjdXJyZW50IHZhbHVlICovCi0KLS8qIFRoZXNlIGZ1bmN0aW9ucyBnaXZlIHRoZSB1c2VyIGNvbnRyb2wgb3ZlciB0aGUgc2Nhbi1saW5lIGZpbHRlcmluZyBpbgotICogbGlicG5nIGFuZCB0aGUgY29tcHJlc3Npb24gbWV0aG9kcyB1c2VkIGJ5IHpsaWIuICBUaGVzZSBmdW5jdGlvbnMgYXJlCi0gKiBtYWlubHkgdXNlZnVsIGZvciB0ZXN0aW5nLCBhcyB0aGUgZGVmYXVsdHMgc2hvdWxkIHdvcmsgd2l0aCBtb3N0IHVzZXJzLgotICogVGhvc2UgdXNlcnMgd2hvIGFyZSB0aWdodCBvbiBtZW1vcnkgb3Igd2FudCBmYXN0ZXIgcGVyZm9ybWFuY2UgYXQgdGhlCi0gKiBleHBlbnNlIG9mIGNvbXByZXNzaW9uIGNhbiBtb2RpZnkgdGhlbS4gIFNlZSB0aGUgY29tcHJlc3Npb24gbGlicmFyeQotICogaGVhZGVyIGZpbGUgKHpsaWIuaCkgZm9yIGFuIGV4cGxpbmF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBmdW5jdGlvbnMuCi0gKi8KLQotLyogU2V0IHRoZSBmaWx0ZXJpbmcgbWV0aG9kKHMpIHVzZWQgYnkgbGlicG5nLiAgQ3VycmVudGx5LCB0aGUgb25seSB2YWxpZAotICogdmFsdWUgZm9yICJtZXRob2QiIGlzIDAuCi0gKi8KLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2ZpbHRlcikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgbWV0aG9kLAotICAgaW50IGZpbHRlcnMpKTsKLQotLyogRmxhZ3MgZm9yIHBuZ19zZXRfZmlsdGVyKCkgdG8gc2F5IHdoaWNoIGZpbHRlcnMgdG8gdXNlLiAgVGhlIGZsYWdzCi0gKiBhcmUgY2hvc2VuIHNvIHRoYXQgdGhleSBkb24ndCBjb25mbGljdCB3aXRoIHJlYWwgZmlsdGVyIHR5cGVzCi0gKiBiZWxvdywgaW4gY2FzZSB0aGV5IGFyZSBzdXBwbGllZCBpbnN0ZWFkIG9mIHRoZSAjZGVmaW5lZCBjb25zdGFudHMuCi0gKiBUaGVzZSB2YWx1ZXMgc2hvdWxkIE5PVCBiZSBjaGFuZ2VkLgotICovCi0jZGVmaW5lIFBOR19OT19GSUxURVJTICAgICAweDAwCi0jZGVmaW5lIFBOR19GSUxURVJfTk9ORSAgICAweDA4Ci0jZGVmaW5lIFBOR19GSUxURVJfU1VCICAgICAweDEwCi0jZGVmaW5lIFBOR19GSUxURVJfVVAgICAgICAweDIwCi0jZGVmaW5lIFBOR19GSUxURVJfQVZHICAgICAweDQwCi0jZGVmaW5lIFBOR19GSUxURVJfUEFFVEggICAweDgwCi0jZGVmaW5lIFBOR19BTExfRklMVEVSUyAoUE5HX0ZJTFRFUl9OT05FIHwgUE5HX0ZJTFRFUl9TVUIgfCBQTkdfRklMVEVSX1VQIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19GSUxURVJfQVZHIHwgUE5HX0ZJTFRFUl9QQUVUSCkKLQotLyogRmlsdGVyIHZhbHVlcyAobm90IGZsYWdzKSAtIHVzZWQgaW4gcG5nd3JpdGUuYywgcG5nd3V0aWwuYyBmb3Igbm93LgotICogVGhlc2UgZGVmaW5lcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuCi0gKi8KLSNkZWZpbmUgUE5HX0ZJTFRFUl9WQUxVRV9OT05FICAwCi0jZGVmaW5lIFBOR19GSUxURVJfVkFMVUVfU1VCICAgMQotI2RlZmluZSBQTkdfRklMVEVSX1ZBTFVFX1VQICAgIDIKLSNkZWZpbmUgUE5HX0ZJTFRFUl9WQUxVRV9BVkcgICAzCi0jZGVmaW5lIFBOR19GSUxURVJfVkFMVUVfUEFFVEggNAotI2RlZmluZSBQTkdfRklMVEVSX1ZBTFVFX0xBU1QgIDUKLQotI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEIC8qIEVYUEVSSU1FTlRBTCAqLwotLyogVGhlICJoZXVyaXN0aWNfbWV0aG9kIiBpcyBnaXZlbiBieSBvbmUgb2YgdGhlIFBOR19GSUxURVJfSEVVUklTVElDXwotICogZGVmaW5lcywgZWl0aGVyIHRoZSBkZWZhdWx0IChtaW5pbXVtLXN1bS1vZi1hYnNvbHV0ZS1kaWZmZXJlbmNlcyksIG9yCi0gKiB0aGUgZXhwZXJpbWVudGFsIG1ldGhvZCAod2VpZ2h0ZWQtbWluaW11bS1zdW0tb2YtYWJzb2x1dGUtZGlmZmVyZW5jZXMpLgotICoKLSAqIFdlaWdodHMgYXJlIGZhY3RvcnMgPj0gMS4wLCBpbmRpY2F0aW5nIGhvdyBpbXBvcnRhbnQgaXQgaXMgdG8ga2VlcCB0aGUKLSAqIGZpbHRlciB0eXBlIGNvbnNpc3RlbnQgYmV0d2VlbiByb3dzLiAgTGFyZ2VyIG51bWJlcnMgbWVhbiB0aGUgY3VycmVudAotICogZmlsdGVyIGlzIHRoYXQgbWFueSB0aW1lcyBhcyBsaWtlbHkgdG8gYmUgdGhlIHNhbWUgYXMgdGhlICJudW1fd2VpZ2h0cyIKLSAqIHByZXZpb3VzIGZpbHRlcnMuICBUaGlzIGlzIGN1bXVsYXRpdmUgZm9yIGVhY2ggcHJldmlvdXMgcm93IHdpdGggYSB3ZWlnaHQuCi0gKiBUaGVyZSBuZWVkcyB0byBiZSAibnVtX3dlaWdodHMiIHZhbHVlcyBpbiAiZmlsdGVyX3dlaWdodHMiLCBvciBpdCBjYW4gYmUKLSAqIE5VTEwgaWYgdGhlIHdlaWdodHMgYXJlbid0IGJlaW5nIHNwZWNpZmllZC4gIFdlaWdodHMgaGF2ZSBubyBpbmZsdWVuY2Ugb24KLSAqIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGZpcnN0IHJvdyBmaWx0ZXIuICBXZWxsIGNob3NlbiB3ZWlnaHRzIGNhbiAoaW4gdGhlb3J5KQotICogaW1wcm92ZSB0aGUgY29tcHJlc3Npb24gZm9yIGEgZ2l2ZW4gaW1hZ2UuCi0gKgotICogQ29zdHMgYXJlIGZhY3RvcnMgPj0gMS4wIGluZGljYXRpbmcgdGhlIHJlbGF0aXZlIGRlY29kaW5nIGNvc3RzIG9mIGEKLSAqIGZpbHRlciB0eXBlLiAgSGlnaGVyIGNvc3RzIGluZGljYXRlIG1vcmUgZGVjb2RpbmcgZXhwZW5zZSwgYW5kIGFyZQotICogdGhlcmVmb3JlIGxlc3MgbGlrZWx5IHRvIGJlIHNlbGVjdGVkIG92ZXIgYSBmaWx0ZXIgd2l0aCBsb3dlciBjb21wdXRhdGlvbmFsCi0gKiBjb3N0cy4gIFRoZXJlIG5lZWRzIHRvIGJlIGEgdmFsdWUgaW4gImZpbHRlcl9jb3N0cyIgZm9yIGVhY2ggdmFsaWQgZmlsdGVyCi0gKiB0eXBlIChnaXZlbiBieSBQTkdfRklMVEVSX1ZBTFVFX0xBU1QpLCBvciBpdCBjYW4gYmUgTlVMTCBpZiB5b3UgYXJlbid0Ci0gKiBzZXR0aW5nIHRoZSBjb3N0cy4gIENvc3RzIHRyeSB0byBpbXByb3ZlIHRoZSBzcGVlZCBvZiBkZWNvbXByZXNzaW9uIHdpdGhvdXQKLSAqIHVuZHVseSBpbmNyZWFzaW5nIHRoZSBjb21wcmVzc2VkIGltYWdlIHNpemUuCi0gKgotICogQSBuZWdhdGl2ZSB3ZWlnaHQgb3IgY29zdCBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQgdmFsdWUgaXMgdG8gYmUgdXNlZCwgYW5kCi0gKiB2YWx1ZXMgaW4gdGhlIHJhbmdlIFswLjAsIDEuMCkgaW5kaWNhdGUgdGhlIHZhbHVlIGlzIHRvIHJlbWFpbiB1bmNoYW5nZWQuCi0gKiBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGJvdGggd2VpZ2h0cyBhbmQgY29zdHMgYXJlIGN1cnJlbnRseSAxLjAsIGJ1dCBtYXkKLSAqIGNoYW5nZSBpZiBnb29kIGdlbmVyYWwgd2VpZ2h0aW5nL2Nvc3QgaGV1cmlzdGljcyBjYW4gYmUgZm91bmQuICBJZiBib3RoCi0gKiB0aGUgd2VpZ2h0cyBhbmQgY29zdHMgYXJlIHNldCB0byAxLjAsIHRoaXMgZGVnZW5lcmF0ZXMgdGhlIFdFSUdIVEVEIG1ldGhvZAotICogdG8gdGhlIFVOV0VJR0hURUQgbWV0aG9kLCBidXQgd2l0aCBhZGRlZCBlbmNvZGluZyB0aW1lL2NvbXB1dGF0aW9uLgotICovCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3MpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIGludCBoZXVyaXN0aWNfbWV0aG9kLCBpbnQgbnVtX3dlaWdodHMsIHBuZ19kb3VibGVwIGZpbHRlcl93ZWlnaHRzLAotICAgcG5nX2RvdWJsZXAgZmlsdGVyX2Nvc3RzKSk7Ci0jZW5kaWYKLSNlbmRpZiAvKiAgUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQgKi8KLQotLyogSGV1cmlzdGljIHVzZWQgZm9yIHJvdyBmaWx0ZXIgc2VsZWN0aW9uLiAgVGhlc2UgZGVmaW5lcyBzaG91bGQgTk9UIGJlCi0gKiBjaGFuZ2VkLgotICovCi0jZGVmaW5lIFBOR19GSUxURVJfSEVVUklTVElDX0RFRkFVTFQgICAgMCAgLyogQ3VycmVudGx5ICJVTldFSUdIVEVEIiAqLwotI2RlZmluZSBQTkdfRklMVEVSX0hFVVJJU1RJQ19VTldFSUdIVEVEIDEgIC8qIFVzZWQgYnkgbGlicG5nIDwgMC45NSAqLwotI2RlZmluZSBQTkdfRklMVEVSX0hFVVJJU1RJQ19XRUlHSFRFRCAgIDIgIC8qIEV4cGVyaW1lbnRhbCBmZWF0dXJlICovCi0jZGVmaW5lIFBOR19GSUxURVJfSEVVUklTVElDX0xBU1QgICAgICAgMyAgLyogTm90IGEgdmFsaWQgdmFsdWUgKi8KLQotLyogU2V0IHRoZSBsaWJyYXJ5IGNvbXByZXNzaW9uIGxldmVsLiAgQ3VycmVudGx5LCB2YWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbQotICogMCAtIDksIGNvcnJlc3BvbmRpbmcgZGlyZWN0bHkgdG8gdGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWxzIDAgLSA5Ci0gKiAoMCAtIG5vIGNvbXByZXNzaW9uLCA5IC0gIm1heGltYWwiIGNvbXByZXNzaW9uKS4gIE5vdGUgdGhhdCB0ZXN0cyBoYXZlCi0gKiBzaG93biB0aGF0IHpsaWIgY29tcHJlc3Npb24gbGV2ZWxzIDMtNiB1c3VhbGx5IHBlcmZvcm0gYXMgd2VsbCBhcyBsZXZlbCA5Ci0gKiBmb3IgUE5HIGltYWdlcywgYW5kIGRvIGNvbnNpZGVyYWJseSBmZXdlciBjYWNsdWxhdGlvbnMuICBJbiB0aGUgZnV0dXJlLAotICogdGhlc2UgdmFsdWVzIG1heSBub3QgY29ycmVzcG9uZCBkaXJlY3RseSB0byB0aGUgemxpYiBjb21wcmVzc2lvbiBsZXZlbHMuCi0gKi8KLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBpbnQgbGV2ZWwpKTsKLQotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsKQotICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgbWVtX2xldmVsKSk7Ci0KLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KQotICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgc3RyYXRlZ3kpKTsKLQotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMpCi0gICBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCB3aW5kb3dfYml0cykpOwotCi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIGludCBtZXRob2QpKTsKLQotLyogVGhlc2UgbmV4dCBmdW5jdGlvbnMgYXJlIGNhbGxlZCBmb3IgaW5wdXQvb3V0cHV0LCBtZW1vcnksIGFuZCBlcnJvcgotICogaGFuZGxpbmcuICBUaGV5IGFyZSBpbiB0aGUgZmlsZSBwbmdyaW8uYywgcG5nd2lvLmMsIGFuZCBwbmdlcnJvci5jLAotICogYW5kIGNhbGwgc3RhbmRhcmQgQyBJL08gcm91dGluZXMgc3VjaCBhcyBmcmVhZCgpLCBmd3JpdGUoKSwgYW5kCi0gKiBmcHJpbnRmKCkuICBUaGVzZSBmdW5jdGlvbnMgY2FuIGJlIG1hZGUgdG8gdXNlIG90aGVyIEkvTyByb3V0aW5lcwotICogYXQgcnVuIHRpbWUgZm9yIHRob3NlIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gaGFuZGxlIEkvTyBpbiBhCi0gKiBkaWZmZXJlbnQgbWFubmVyIGJ5IGNhbGxpbmcgcG5nX3NldF8/Pz9fZm4oKS4gIFNlZSBsaWJwbmcudHh0IGZvcgotICogbW9yZSBpbmZvcm1hdGlvbi4KLSAqLwotCi0jaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAotLyogSW5pdGlhbGl6ZSB0aGUgaW5wdXQvb3V0cHV0IGZvciB0aGUgUE5HIGZpbGUgdG8gdGhlIGRlZmF1bHQgZnVuY3Rpb25zLiAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19pbml0X2lvKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgcG5nX0ZJTEVfcCBmcCkpOwotI2VuZGlmCi0KLS8qIFJlcGxhY2UgdGhlIChlcnJvciBhbmQgYWJvcnQpLCBhbmQgd2FybmluZyBmdW5jdGlvbnMgd2l0aCB1c2VyCi0gKiBzdXBwbGllZCBmdW5jdGlvbnMuICBJZiBubyBtZXNzYWdlcyBhcmUgdG8gYmUgcHJpbnRlZCB5b3UgbXVzdCBzdGlsbAotICogd3JpdGUgYW5kIHVzZSByZXBsYWNlbWVudCBmdW5jdGlvbnMuIFRoZSByZXBsYWNlbWVudCBlcnJvcl9mbiBzaG91bGQKLSAqIHN0aWxsIGRvIGEgbG9uZ2ptcCB0byB0aGUgbGFzdCBzZXRqbXAgbG9jYXRpb24gaWYgeW91IGFyZSB1c2luZyB0aGlzCi0gKiBtZXRob2Qgb2YgZXJyb3IgaGFuZGxpbmcuICBJZiBlcnJvcl9mbiBvciB3YXJuaW5nX2ZuIGlzIE5VTEwsIHRoZQotICogZGVmYXVsdCBmdW5jdGlvbiB3aWxsIGJlIHVzZWQuCi0gKi8KLQotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfZXJyb3JfZm4pIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ192b2lkcCBlcnJvcl9wdHIsIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sIHBuZ19lcnJvcl9wdHIgd2FybmluZ19mbikpOwotCi0vKiBSZXR1cm4gdGhlIHVzZXIgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yIGZ1bmN0aW9ucyAqLwotUE5HX0VYUE9SVChwbmdfdm9pZHAscG5nX2dldF9lcnJvcl9wdHIpIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0cikpOwotCi0vKiBSZXBsYWNlIHRoZSBkZWZhdWx0IGRhdGEgb3V0cHV0IGZ1bmN0aW9ucyB3aXRoIGEgdXNlciBzdXBwbGllZCBvbmUocykuCi0gKiBJZiBidWZmZXJlZCBvdXRwdXQgaXMgbm90IHVzZWQsIHRoZW4gb3V0cHV0X2ZsdXNoX2ZuIGNhbiBiZSBzZXQgdG8gTlVMTC4KLSAqIElmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQgYXQgbGlicG5nIGNvbXBpbGUgdGltZQotICogb3V0cHV0X2ZsdXNoX2ZuIHdpbGwgYmUgaWdub3JlZCAoYW5kIHRodXMgY2FuIGJlIE5VTEwpLgotICogSXQgaXMgcHJvYmFibHkgYSBtaXN0YWtlIHRvIHVzZSBOVUxMIGZvciBvdXRwdXRfZmx1c2hfZm4gaWYKLSAqIHdyaXRlX2RhdGFfZm4gaXMgbm90IGFsc28gTlVMTCB1bmxlc3MgeW91IGhhdmUgYnVpbHQgbGlicG5nIHdpdGgKLSAqIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQgdW5kZWZpbmVkLCBiZWNhdXNlIGluIHRoaXMgY2FzZSBsaWJwbmcncwotICogZGVmYXVsdCBmbHVzaCBmdW5jdGlvbiwgd2hpY2ggdXNlcyB0aGUgc3RhbmRhcmQgKkZJTEUgc3RydWN0dXJlLCB3aWxsCi0gKiBiZSB1c2VkLgotICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF93cml0ZV9mbikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX3ZvaWRwIGlvX3B0ciwgcG5nX3J3X3B0ciB3cml0ZV9kYXRhX2ZuLCBwbmdfZmx1c2hfcHRyIG91dHB1dF9mbHVzaF9mbikpOwotCi0vKiBSZXBsYWNlIHRoZSBkZWZhdWx0IGRhdGEgaW5wdXQgZnVuY3Rpb24gd2l0aCBhIHVzZXIgc3VwcGxpZWQgb25lLiAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfcmVhZF9mbikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX3ZvaWRwIGlvX3B0ciwgcG5nX3J3X3B0ciByZWFkX2RhdGFfZm4pKTsKLQotLyogUmV0dXJuIHRoZSB1c2VyIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBJL08gZnVuY3Rpb25zICovCi1QTkdfRVhQT1JUKHBuZ192b2lkcCxwbmdfZ2V0X2lvX3B0cikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0KLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3JlYWRfc3RhdHVzX2ZuKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfcmVhZF9zdGF0dXNfcHRyIHJlYWRfcm93X2ZuKSk7Ci0KLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3dyaXRlX3N0YXR1c19mbikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX3dyaXRlX3N0YXR1c19wdHIgd3JpdGVfcm93X2ZuKSk7Ci0KLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0vKiBSZXBsYWNlIHRoZSBkZWZhdWx0IG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyB3aXRoIHVzZXIgc3VwcGxpZWQgb25lKHMpLiAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfbWVtX2ZuKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfdm9pZHAgbWVtX3B0ciwgcG5nX21hbGxvY19wdHIgbWFsbG9jX2ZuLCBwbmdfZnJlZV9wdHIgZnJlZV9mbikpOwotLyogUmV0dXJuIHRoZSB1c2VyIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZW1vcnkgZnVuY3Rpb25zICovCi1QTkdfRVhQT1JUKHBuZ192b2lkcCxwbmdfZ2V0X21lbV9wdHIpIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0cikpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3JlYWRfdXNlcl90cmFuc2Zvcm1fZm4pIFBOR0FSRygocG5nX3N0cnVjdHAKLSAgIHBuZ19wdHIsIHBuZ191c2VyX3RyYW5zZm9ybV9wdHIgcmVhZF91c2VyX3RyYW5zZm9ybV9mbikpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF93cml0ZV91c2VyX3RyYW5zZm9ybV9mbikgUE5HQVJHKChwbmdfc3RydWN0cAotICAgcG5nX3B0ciwgcG5nX3VzZXJfdHJhbnNmb3JtX3B0ciB3cml0ZV91c2VyX3RyYW5zZm9ybV9mbikpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkgfHwgXAotICAgIGRlZmluZWQoUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkKLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3VzZXJfdHJhbnNmb3JtX2luZm8pIFBOR0FSRygocG5nX3N0cnVjdHAKLSAgIHBuZ19wdHIsIHBuZ192b2lkcCB1c2VyX3RyYW5zZm9ybV9wdHIsIGludCB1c2VyX3RyYW5zZm9ybV9kZXB0aCwKLSAgIGludCB1c2VyX3RyYW5zZm9ybV9jaGFubmVscykpOwotLyogUmV0dXJuIHRoZSB1c2VyIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRyYW5zZm9ybSBmdW5jdGlvbnMgKi8KLVBOR19FWFBPUlQocG5nX3ZvaWRwLHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKQotICAgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19VU0VSX0NIVU5LU19TVVBQT1JURUQKLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX3ZvaWRwIHVzZXJfY2h1bmtfcHRyLCBwbmdfdXNlcl9jaHVua19wdHIgcmVhZF91c2VyX2NodW5rX2ZuKSk7Ci1QTkdfRVhQT1JUKHBuZ192b2lkcCxwbmdfZ2V0X3VzZXJfY2h1bmtfcHRyKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwCi0gICBwbmdfcHRyKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRAotLyogU2V0cyB0aGUgZnVuY3Rpb24gY2FsbGJhY2tzIGZvciB0aGUgcHVzaCByZWFkZXIsIGFuZCBhIHBvaW50ZXIgdG8gYQotICogdXNlci1kZWZpbmVkIHN0cnVjdHVyZSBhdmFpbGFibGUgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucy4KLSAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX3ZvaWRwIHByb2dyZXNzaXZlX3B0ciwKLSAgIHBuZ19wcm9ncmVzc2l2ZV9pbmZvX3B0ciBpbmZvX2ZuLCBwbmdfcHJvZ3Jlc3NpdmVfcm93X3B0ciByb3dfZm4sCi0gICBwbmdfcHJvZ3Jlc3NpdmVfZW5kX3B0ciBlbmRfZm4pKTsKLQotLyogUmV0dXJucyB0aGUgdXNlciBwb2ludGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHVzaCByZWFkIGZ1bmN0aW9ucyAqLwotUE5HX0VYUE9SVChwbmdfdm9pZHAscG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIpCi0gICBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIpKTsKLQotLyogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19wcm9jZXNzX2RhdGEpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3NpemVfdCBidWZmZXJfc2l6ZSkpOwotCi0vKiBGdW5jdGlvbiB0aGF0IGNvbWJpbmVzIHJvd3MuICBOb3QgdmVyeSBtdWNoIGRpZmZlcmVudCB0aGFuIHRoZQotICogcG5nX2NvbWJpbmVfcm93KCkgY2FsbC4gIElzIHRoaXMgZXZlbiB1c2VkPz8/Pz8KLSAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2J5dGVwIG9sZF9yb3csIHBuZ19ieXRlcCBuZXdfcm93KSk7Ci0jZW5kaWYgLyogUE5HX1BST0dSRVNTSVZFX1JFQURfU1VQUE9SVEVEICovCi0KLVBOR19FWFBPUlQocG5nX3ZvaWRwLHBuZ19tYWxsb2MpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19hbGxvY19zaXplX3Qgc2l6ZSkpIFBOR19BTExPQ0FURUQ7Ci0vKiBBZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjQuMCAqLwotUE5HX0VYUE9SVChwbmdfdm9pZHAscG5nX2NhbGxvYykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2FsbG9jX3NpemVfdCBzaXplKSkgUE5HX0FMTE9DQVRFRDsKLQotLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS4yLjQgKi8KLVBOR19FWFBPUlQocG5nX3ZvaWRwLHBuZ19tYWxsb2Nfd2FybikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2FsbG9jX3NpemVfdCBzaXplKSkgUE5HX0FMTE9DQVRFRDsKLQotLyogRnJlZXMgYSBwb2ludGVyIGFsbG9jYXRlZCBieSBwbmdfbWFsbG9jKCkgKi8KLVBOR19FWFBPUlQodm9pZCxwbmdfZnJlZSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgcHRyKSk7Ci0KLS8qIEZyZWUgZGF0YSB0aGF0IHdhcyBhbGxvY2F0ZWQgaW50ZXJuYWxseSAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19mcmVlX2RhdGEpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgZnJlZV9tZSwgaW50IG51bSkpOwotLyogUmVhc3NpZ24gcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgZXhpc3RpbmcgZGF0YSwgd2hldGhlciBhbGxvY2F0ZWQKLSAqIGJ5IGxpYnBuZyBvciBieSB0aGUgYXBwbGljYXRpb24gKi8KLVBOR19FWFBPUlQodm9pZCxwbmdfZGF0YV9mcmVlcikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgZnJlZXIsIHBuZ191aW50XzMyIG1hc2spKTsKLS8qIEFzc2lnbm1lbnRzIGZvciBwbmdfZGF0YV9mcmVlciAqLwotI2RlZmluZSBQTkdfREVTVFJPWV9XSUxMX0ZSRUVfREFUQSAxCi0jZGVmaW5lIFBOR19TRVRfV0lMTF9GUkVFX0RBVEEgMQotI2RlZmluZSBQTkdfVVNFUl9XSUxMX0ZSRUVfREFUQSAyCi0vKiBGbGFncyBmb3IgcG5nX3B0ci0+ZnJlZV9tZSBhbmQgaW5mb19wdHItPmZyZWVfbWUgKi8KLSNkZWZpbmUgUE5HX0ZSRUVfSElTVCAweDAwMDgKLSNkZWZpbmUgUE5HX0ZSRUVfSUNDUCAweDAwMTAKLSNkZWZpbmUgUE5HX0ZSRUVfU1BMVCAweDAwMjAKLSNkZWZpbmUgUE5HX0ZSRUVfUk9XUyAweDAwNDAKLSNkZWZpbmUgUE5HX0ZSRUVfUENBTCAweDAwODAKLSNkZWZpbmUgUE5HX0ZSRUVfU0NBTCAweDAxMDAKLSNkZWZpbmUgUE5HX0ZSRUVfVU5LTiAweDAyMDAKLSNkZWZpbmUgUE5HX0ZSRUVfTElTVCAweDA0MDAKLSNkZWZpbmUgUE5HX0ZSRUVfUExURSAweDEwMDAKLSNkZWZpbmUgUE5HX0ZSRUVfVFJOUyAweDIwMDAKLSNkZWZpbmUgUE5HX0ZSRUVfVEVYVCAweDQwMDAKLSNkZWZpbmUgUE5HX0ZSRUVfQUxMICAweDdmZmYKLSNkZWZpbmUgUE5HX0ZSRUVfTVVMICAweDQyMjAgLyogUE5HX0ZSRUVfU1BMVHxQTkdfRlJFRV9URVhUfFBOR19GUkVFX1VOS04gKi8KLQotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLVBOR19FWFBPUlQocG5nX3ZvaWRwLHBuZ19tYWxsb2NfZGVmYXVsdCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2FsbG9jX3NpemVfdCBzaXplKSkgUE5HX0FMTE9DQVRFRDsKLVBOR19FWFBPUlQodm9pZCxwbmdfZnJlZV9kZWZhdWx0KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfdm9pZHAgcHRyKSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBQTkdfTk9fRVJST1JfVEVYVAotLyogRmF0YWwgZXJyb3IgaW4gUE5HIGltYWdlIG9mIGxpYnBuZyAtIGNhbid0IGNvbnRpbnVlICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX2Vycm9yKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbWVzc2FnZSkpIFBOR19OT1JFVFVSTjsKLQotLyogVGhlIHNhbWUsIGJ1dCB0aGUgY2h1bmsgbmFtZSBpcyBwcmVwZW5kZWQgdG8gdGhlIGVycm9yIHN0cmluZy4gKi8KLVBOR19FWFBPUlQodm9pZCxwbmdfY2h1bmtfZXJyb3IpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKSkgUE5HX05PUkVUVVJOOwotCi0jZWxzZQotLyogRmF0YWwgZXJyb3IgaW4gUE5HIGltYWdlIG9mIGxpYnBuZyAtIGNhbid0IGNvbnRpbnVlICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX2VycikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSkgUE5HX05PUkVUVVJOOwotI2VuZGlmCi0KLS8qIE5vbi1mYXRhbCBlcnJvciBpbiBsaWJwbmcuICBDYW4gY29udGludWUsIGJ1dCBtYXkgaGF2ZSBhIHByb2JsZW0uICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX3dhcm5pbmcpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21lc3NhZ2UpKTsKLQotLyogTm9uLWZhdGFsIGVycm9yIGluIGxpYnBuZywgY2h1bmsgbmFtZSBpcyBwcmVwZW5kZWQgdG8gbWVzc2FnZS4gKi8KLVBOR19FWFBPUlQodm9pZCxwbmdfY2h1bmtfd2FybmluZykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2NvbnN0X2NoYXJwIHdhcm5pbmdfbWVzc2FnZSkpOwotCi0jaWZkZWYgUE5HX0JFTklHTl9FUlJPUlNfU1VQUE9SVEVECi0vKiBCZW5pZ24gZXJyb3IgaW4gbGlicG5nLiAgQ2FuIGNvbnRpbnVlLCBidXQgbWF5IGhhdmUgYSBwcm9ibGVtLgotICogVXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdG8gaGFuZGxlIGFzIGEgZmF0YWwgZXJyb3Igb3IgYXMgYSB3YXJuaW5nLiAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19iZW5pZ25fZXJyb3IpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21lc3NhZ2UpKTsKLQotLyogU2FtZSwgY2h1bmsgbmFtZSBpcyBwcmVwZW5kZWQgdG8gbWVzc2FnZS4gKi8KLVBOR19FWFBPUlQodm9pZCxwbmdfY2h1bmtfYmVuaWduX2Vycm9yKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKSk7Ci0KLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2Jlbmlnbl9lcnJvcnMpIFBOR0FSRygocG5nX3N0cnVjdHAKLSAgIHBuZ19wdHIsIGludCBhbGxvd2VkKSk7Ci0jZW5kaWYKLQotLyogVGhlIHBuZ19zZXRfPGNodW5rPiBmdW5jdGlvbnMgYXJlIGZvciBzdG9yaW5nIHZhbHVlcyBpbiB0aGUgcG5nX2luZm9fc3RydWN0LgotICogU2ltaWxhcmx5LCB0aGUgcG5nX2dldF88Y2h1bms+IGNhbGxzIGFyZSB1c2VkIHRvIHJlYWQgdmFsdWVzIGZyb20gdGhlCi0gKiBwbmdfaW5mb19zdHJ1Y3QsIGVpdGhlciBzdG9yaW5nIHRoZSBwYXJhbWV0ZXJzIGluIHRoZSBwYXNzZWQgdmFyaWFibGVzLCBvcgotICogc2V0dGluZyBwb2ludGVycyBpbnRvIHRoZSBwbmdfaW5mb19zdHJ1Y3Qgd2hlcmUgdGhlIGRhdGEgaXMgc3RvcmVkLiAgVGhlCi0gKiBwbmdfZ2V0XzxjaHVuaz4gZnVuY3Rpb25zIHJldHVybiBhIG5vbi16ZXJvIHZhbHVlIGlmIHRoZSBkYXRhIHdhcyBhdmFpbGFibGUKLSAqIGluIGluZm9fcHRyLCBvciByZXR1cm4gemVybyBhbmQgZG8gbm90IGNoYW5nZSBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgaWYgdGhlCi0gKiBkYXRhIHdhcyBub3QgYXZhaWxhYmxlLgotICoKLSAqIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGRpcmVjdGx5IGFjY2Vzc2luZyBwbmdfaW5mbwotICogdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBmdXR1cmUgY2hhbmdlcyBpbiB0aGUgc2l6ZSBhbmQgaW50ZXJuYWwgbGF5b3V0IG9mCi0gKiBwbmdfaW5mb19zdHJ1Y3QuCi0gKi8KLS8qIFJldHVybnMgImZsYWciIGlmIGNodW5rIGRhdGEgaXMgdmFsaWQgaW4gaW5mb19wdHIuICovCi1QTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfdmFsaWQpIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgZmxhZykpOwotCi0vKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gaG9sZCBhIHRyYW5zZm9ybWVkIHJvdy4gKi8KLVBOR19FWFBPUlQocG5nX3NpemVfdCxwbmdfZ2V0X3Jvd2J5dGVzKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIpKTsKLQotI2lmZGVmIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRAotLyogUmV0dXJucyByb3dfcG9pbnRlcnMsIHdoaWNoIGlzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNjYW5saW5lcyB0aGF0IHdhcwotICogcmV0dXJuZWQgZnJvbSBwbmdfcmVhZF9wbmcoKS4KLSAqLwotUE5HX0VYUE9SVChwbmdfYnl0ZXBwLHBuZ19nZXRfcm93cykgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKSk7Ci0vKiBTZXQgcm93X3BvaW50ZXJzLCB3aGljaCBpcyBhbiBhcnJheSBvZiBwb2ludGVycyB0byBzY2FubGluZXMgZm9yIHVzZQotICogYnkgcG5nX3dyaXRlX3BuZygpLgotICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9yb3dzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19ieXRlcHAgcm93X3BvaW50ZXJzKSk7Ci0jZW5kaWYKLQotLyogUmV0dXJucyBudW1iZXIgb2YgY29sb3IgY2hhbm5lbHMgaW4gaW1hZ2UuICovCi1QTkdfRVhQT1JUKHBuZ19ieXRlLHBuZ19nZXRfY2hhbm5lbHMpIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0cikpOwotCi0jaWZkZWYgUE5HX0VBU1lfQUNDRVNTX1NVUFBPUlRFRAotLyogUmV0dXJucyBpbWFnZSB3aWR0aCBpbiBwaXhlbHMuICovCi1QTkdfRVhQT1JUKHBuZ191aW50XzMyLCBwbmdfZ2V0X2ltYWdlX3dpZHRoKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwCi0gICBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIpKTsKLQotLyogUmV0dXJucyBpbWFnZSBoZWlnaHQgaW4gcGl4ZWxzLiAqLwotUE5HX0VYUE9SVChwbmdfdWludF8zMiwgcG5nX2dldF9pbWFnZV9oZWlnaHQpIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAKLSAgIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0cikpOwotCi0vKiBSZXR1cm5zIGltYWdlIGJpdF9kZXB0aC4gKi8KLVBOR19FWFBPUlQocG5nX2J5dGUsIHBuZ19nZXRfYml0X2RlcHRoKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwCi0gICBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIpKTsKLQotLyogUmV0dXJucyBpbWFnZSBjb2xvcl90eXBlLiAqLwotUE5HX0VYUE9SVChwbmdfYnl0ZSwgcG5nX2dldF9jb2xvcl90eXBlKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwCi0gICBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIpKTsKLQotLyogUmV0dXJucyBpbWFnZSBmaWx0ZXJfdHlwZS4gKi8KLVBOR19FWFBPUlQocG5nX2J5dGUsIHBuZ19nZXRfZmlsdGVyX3R5cGUpIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAKLSAgIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0cikpOwotCi0vKiBSZXR1cm5zIGltYWdlIGludGVybGFjZV90eXBlLiAqLwotUE5HX0VYUE9SVChwbmdfYnl0ZSwgcG5nX2dldF9pbnRlcmxhY2VfdHlwZSkgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cAotICAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKSk7Ci0KLS8qIFJldHVybnMgaW1hZ2UgY29tcHJlc3Npb25fdHlwZS4gKi8KLVBOR19FWFBPUlQocG5nX2J5dGUsIHBuZ19nZXRfY29tcHJlc3Npb25fdHlwZSkgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cAotICAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKSk7Ci0KLS8qIFJldHVybnMgaW1hZ2UgcmVzb2x1dGlvbiBpbiBwaXhlbHMgcGVyIG1ldGVyLCBmcm9tIHBIWXMgY2h1bmsgZGF0YS4gKi8KLVBOR19FWFBPUlQocG5nX3VpbnRfMzIsIHBuZ19nZXRfcGl4ZWxzX3Blcl9tZXRlcikgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cAotICAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKSk7Ci1QTkdfRVhQT1JUKHBuZ191aW50XzMyLCBwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9tZXRlcikgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cAotICAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKSk7Ci1QTkdfRVhQT1JUKHBuZ191aW50XzMyLCBwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlcikgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cAotICAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKSk7Ci0KLS8qIFJldHVybnMgcGl4ZWwgYXNwZWN0IHJhdGlvLCBjb21wdXRlZCBmcm9tIHBIWXMgY2h1bmsgZGF0YS4gICovCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotUE5HX0VYUE9SVChmbG9hdCwgcG5nX2dldF9waXhlbF9hc3BlY3RfcmF0aW8pIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAKLSAgIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0cikpOwotI2VuZGlmCi0KLS8qIFJldHVybnMgaW1hZ2UgeCwgeSBvZmZzZXQgaW4gcGl4ZWxzIG9yIG1pY3JvbnMsIGZyb20gb0ZGcyBjaHVuayBkYXRhLiAqLwotUE5HX0VYUE9SVChwbmdfaW50XzMyLCBwbmdfZ2V0X3hfb2Zmc2V0X3BpeGVscykgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cAotICAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKSk7Ci1QTkdfRVhQT1JUKHBuZ19pbnRfMzIsIHBuZ19nZXRfeV9vZmZzZXRfcGl4ZWxzKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwCi0gICBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIpKTsKLVBOR19FWFBPUlQocG5nX2ludF8zMiwgcG5nX2dldF94X29mZnNldF9taWNyb25zKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwCi0gICBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIpKTsKLVBOR19FWFBPUlQocG5nX2ludF8zMiwgcG5nX2dldF95X29mZnNldF9taWNyb25zKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwCi0gICBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIpKTsKLQotI2VuZGlmIC8qIFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQgKi8KLQotLyogUmV0dXJucyBwb2ludGVyIHRvIHNpZ25hdHVyZSBzdHJpbmcgcmVhZCBmcm9tIFBORyBoZWFkZXIgKi8KLVBOR19FWFBPUlQocG5nX2J5dGVwLHBuZ19nZXRfc2lnbmF0dXJlKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIpKTsKLQotI2lmZGVmIFBOR19iS0dEX1NVUFBPUlRFRAotUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X2JLR0QpIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2NvbG9yXzE2cCAqYmFja2dyb3VuZCkpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfYktHRF9TVVBQT1JURUQKLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2JLR0QpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2NvbG9yXzE2cCBiYWNrZ3JvdW5kKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19jSFJNX1NVUFBPUlRFRAotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLVBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9jSFJNKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIsIGRvdWJsZSAqd2hpdGVfeCwgZG91YmxlICp3aGl0ZV95LCBkb3VibGUgKnJlZF94LAotICAgZG91YmxlICpyZWRfeSwgZG91YmxlICpncmVlbl94LCBkb3VibGUgKmdyZWVuX3ksIGRvdWJsZSAqYmx1ZV94LAotICAgZG91YmxlICpibHVlX3kpKTsKLSNlbmRpZgotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLVBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9jSFJNX2ZpeGVkKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIsIHBuZ19maXhlZF9wb2ludCAqaW50X3doaXRlX3gsIHBuZ19maXhlZF9wb2ludAotICAgKmludF93aGl0ZV95LCBwbmdfZml4ZWRfcG9pbnQgKmludF9yZWRfeCwgcG5nX2ZpeGVkX3BvaW50ICppbnRfcmVkX3ksCi0gICBwbmdfZml4ZWRfcG9pbnQgKmludF9ncmVlbl94LCBwbmdfZml4ZWRfcG9pbnQgKmludF9ncmVlbl95LCBwbmdfZml4ZWRfcG9pbnQKLSAgICppbnRfYmx1ZV94LCBwbmdfZml4ZWRfcG9pbnQgKmludF9ibHVlX3kpKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBQTkdfY0hSTV9TVVBQT1JURUQKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9jSFJNKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIGRvdWJsZSB3aGl0ZV94LCBkb3VibGUgd2hpdGVfeSwgZG91YmxlIHJlZF94LAotICAgZG91YmxlIHJlZF95LCBkb3VibGUgZ3JlZW5feCwgZG91YmxlIGdyZWVuX3ksIGRvdWJsZSBibHVlX3gsIGRvdWJsZSBibHVlX3kpKTsKLSNlbmRpZgotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2NIUk1fZml4ZWQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2ZpeGVkX3BvaW50IGludF93aGl0ZV94LCBwbmdfZml4ZWRfcG9pbnQgaW50X3doaXRlX3ksCi0gICBwbmdfZml4ZWRfcG9pbnQgaW50X3JlZF94LCBwbmdfZml4ZWRfcG9pbnQgaW50X3JlZF95LCBwbmdfZml4ZWRfcG9pbnQKLSAgIGludF9ncmVlbl94LCBwbmdfZml4ZWRfcG9pbnQgaW50X2dyZWVuX3ksIHBuZ19maXhlZF9wb2ludCBpbnRfYmx1ZV94LAotICAgcG5nX2ZpeGVkX3BvaW50IGludF9ibHVlX3kpKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBQTkdfZ0FNQV9TVVBQT1JURUQKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi1QTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfZ0FNQSkgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyLCBkb3VibGUgKmZpbGVfZ2FtbWEpKTsKLSNlbmRpZgotUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X2dBTUFfZml4ZWQpIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0ciwgcG5nX2ZpeGVkX3BvaW50ICppbnRfZmlsZV9nYW1tYSkpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfZ0FNQV9TVVBQT1JURUQKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9nQU1BKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIGRvdWJsZSBmaWxlX2dhbW1hKSk7Ci0jZW5kaWYKLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2dBTUFfZml4ZWQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2ZpeGVkX3BvaW50IGludF9maWxlX2dhbW1hKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19oSVNUX1NVUFBPUlRFRAotUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X2hJU1QpIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMTZwICpoaXN0KSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19oSVNUX1NVUFBPUlRFRAotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfaElTVCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8xNnAgaGlzdCkpOwotI2VuZGlmCi0KLVBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9JSERSKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyICp3aWR0aCwgcG5nX3VpbnRfMzIgKmhlaWdodCwKLSAgIGludCAqYml0X2RlcHRoLCBpbnQgKmNvbG9yX3R5cGUsIGludCAqaW50ZXJsYWNlX21ldGhvZCwKLSAgIGludCAqY29tcHJlc3Npb25fbWV0aG9kLCBpbnQgKmZpbHRlcl9tZXRob2QpKTsKLQotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfSUhEUikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiB3aWR0aCwgcG5nX3VpbnRfMzIgaGVpZ2h0LCBpbnQgYml0X2RlcHRoLAotICAgaW50IGNvbG9yX3R5cGUsIGludCBpbnRlcmxhY2VfbWV0aG9kLCBpbnQgY29tcHJlc3Npb25fbWV0aG9kLAotICAgaW50IGZpbHRlcl9tZXRob2QpKTsKLQotI2lmZGVmIFBOR19vRkZzX1NVUFBPUlRFRAotUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X29GRnMpIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0ciwgcG5nX2ludF8zMiAqb2Zmc2V0X3gsIHBuZ19pbnRfMzIgKm9mZnNldF95LAotICAgaW50ICp1bml0X3R5cGUpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX29GRnNfU1VQUE9SVEVECi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9vRkZzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19pbnRfMzIgb2Zmc2V0X3gsIHBuZ19pbnRfMzIgb2Zmc2V0X3ksCi0gICBpbnQgdW5pdF90eXBlKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19wQ0FMX1NVUFBPUlRFRAotUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X3BDQUwpIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0ciwgcG5nX2NoYXJwICpwdXJwb3NlLCBwbmdfaW50XzMyICpYMCwgcG5nX2ludF8zMiAqWDEsCi0gICBpbnQgKnR5cGUsIGludCAqbnBhcmFtcywgcG5nX2NoYXJwICp1bml0cywgcG5nX2NoYXJwcCAqcGFyYW1zKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19wQ0FMX1NVUFBPUlRFRAotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfcENBTCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfY2hhcnAgcHVycG9zZSwgcG5nX2ludF8zMiBYMCwgcG5nX2ludF8zMiBYMSwKLSAgIGludCB0eXBlLCBpbnQgbnBhcmFtcywgcG5nX2NoYXJwIHVuaXRzLCBwbmdfY2hhcnBwIHBhcmFtcykpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfcEhZc19TVVBQT1JURUQKLVBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9wSFlzKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyICpyZXNfeCwgcG5nX3VpbnRfMzIgKnJlc195LCBpbnQgKnVuaXRfdHlwZSkpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfcEhZc19TVVBQT1JURUQKLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3BIWXMpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgcmVzX3gsIHBuZ191aW50XzMyIHJlc195LCBpbnQgdW5pdF90eXBlKSk7Ci0jZW5kaWYKLQotUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X1BMVEUpIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0ciwgcG5nX2NvbG9ycCAqcGFsZXR0ZSwgaW50ICpudW1fcGFsZXR0ZSkpOwotCi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9QTFRFKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19jb2xvcnAgcGFsZXR0ZSwgaW50IG51bV9wYWxldHRlKSk7Ci0KLSNpZmRlZiBQTkdfc0JJVF9TVVBQT1JURUQKLVBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9zQklUKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19jb2xvcl84cCAqc2lnX2JpdCkpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfc0JJVF9TVVBQT1JURUQKLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3NCSVQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2NvbG9yXzhwIHNpZ19iaXQpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX3NSR0JfU1VQUE9SVEVECi1QTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfc1JHQikgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyLCBpbnQgKmludGVudCkpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfc1JHQl9TVVBQT1JURUQKLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3NSR0IpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50IGludGVudCkpOwotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfc1JHQl9nQU1BX2FuZF9jSFJNKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIGludCBpbnRlbnQpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX2lDQ1BfU1VQUE9SVEVECi1QTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfaUNDUCkgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyLCBwbmdfY2hhcnBwIG5hbWUsIGludCAqY29tcHJlc3Npb25fdHlwZSwKLSAgIHBuZ19jaGFycHAgcHJvZmlsZSwgcG5nX3VpbnRfMzIgKnByb2ZsZW4pKTsKLSAgIC8qIE5vdGUgdG8gbWFpbnRhaW5lcjogcHJvZmlsZSBzaG91bGQgYmUgcG5nX2J5dGVwcCAqLwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfaUNDUF9TVVBQT1JURUQKLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2lDQ1ApIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2NoYXJwIG5hbWUsIGludCBjb21wcmVzc2lvbl90eXBlLAotICAgcG5nX2NoYXJwIHByb2ZpbGUsIHBuZ191aW50XzMyIHByb2ZsZW4pKTsKLSAgIC8qIE5vdGUgdG8gbWFpbnRhaW5lcjogcHJvZmlsZSBzaG91bGQgYmUgcG5nX2J5dGVwICovCi0jZW5kaWYKLQotI2lmZGVmIFBOR19zUExUX1NVUFBPUlRFRAotUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X3NQTFQpIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0ciwgcG5nX3NQTFRfdHBwIGVudHJpZXMpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX3NQTFRfU1VQUE9SVEVECi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9zUExUKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19zUExUX3RwIGVudHJpZXMsIGludCBuZW50cmllcykpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQKLS8qIHBuZ19nZXRfdGV4dCBhbHNvIHJldHVybnMgdGhlIG51bWJlciBvZiB0ZXh0IGNodW5rcyBpbiAqbnVtX3RleHQgKi8KLVBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF90ZXh0KSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIsIHBuZ190ZXh0cCAqdGV4dF9wdHIsIGludCAqbnVtX3RleHQpKTsKLSNlbmRpZgotCi0vKiBOb3RlIHdoaWxlIHBuZ19zZXRfdGV4dCgpIHdpbGwgYWNjZXB0IGEgc3RydWN0dXJlIHdob3NlIHRleHQsCi0gKiBsYW5ndWFnZSwgYW5kICB0cmFuc2xhdGVkIGtleXdvcmRzIGFyZSBOVUxMIHBvaW50ZXJzLCB0aGUgc3RydWN0dXJlCi0gKiByZXR1cm5lZCBieSBwbmdfZ2V0X3RleHQgd2lsbCBhbHdheXMgY29udGFpbiByZWd1bGFyCi0gKiB6ZXJvLXRlcm1pbmF0ZWQgQyBzdHJpbmdzLiAgVGhleSBtaWdodCBiZSBlbXB0eSBzdHJpbmdzIGJ1dAotICogdGhleSB3aWxsIG5ldmVyIGJlIE5VTEwgcG9pbnRlcnMuCi0gKi8KLQotI2lmZGVmIFBOR19URVhUX1NVUFBPUlRFRAotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfdGV4dCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdGV4dHAgdGV4dF9wdHIsIGludCBudW1fdGV4dCkpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfdElNRV9TVVBQT1JURUQKLVBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF90SU1FKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ190aW1lcCAqbW9kX3RpbWUpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX3RJTUVfU1VQUE9SVEVECi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF90SU1FKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ190aW1lcCBtb2RfdGltZSkpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfdFJOU19TVVBQT1JURUQKLVBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF90Uk5TKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19ieXRlcCAqdHJhbnNfYWxwaGEsIGludCAqbnVtX3RyYW5zLAotICAgcG5nX2NvbG9yXzE2cCAqdHJhbnNfY29sb3IpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX3RSTlNfU1VQUE9SVEVECi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF90Uk5TKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19ieXRlcCB0cmFuc19hbHBoYSwgaW50IG51bV90cmFucywKLSAgIHBuZ19jb2xvcl8xNnAgdHJhbnNfY29sb3IpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX3RSTlNfU1VQUE9SVEVECi0jZW5kaWYKLQotI2lmZGVmIFBOR19zQ0FMX1NVUFBPUlRFRAotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLVBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9zQ0FMKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIsIGludCAqdW5pdCwgZG91YmxlICp3aWR0aCwgZG91YmxlICpoZWlnaHQpKTsKLSNlbHNlCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X3NDQUxfcykgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyLCBpbnQgKnVuaXQsIHBuZ19jaGFycHAgc3dpZHRoLCBwbmdfY2hhcnBwIHNoZWlnaHQpKTsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYgLyogUE5HX3NDQUxfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBQTkdfc0NBTF9TVVBQT1JURUQKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9zQ0FMKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIGludCB1bml0LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQpKTsKLSNlbHNlCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfc0NBTF9zKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIGludCB1bml0LCBwbmdfY2hhcnAgc3dpZHRoLCBwbmdfY2hhcnAgc2hlaWdodCkpOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZiAvKiBQTkdfc0NBTF9TVVBQT1JURUQgfHwgUE5HX1dSSVRFX3NDQUxfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVECi0vKiBQcm92aWRlIGEgbGlzdCBvZiBjaHVua3MgYW5kIGhvdyB0aGV5IGFyZSB0byBiZSBoYW5kbGVkLCBpZiB0aGUgYnVpbHQtaW4KLSAgIGhhbmRsaW5nIG9yIGRlZmF1bHQgdW5rbm93biBjaHVuayBoYW5kbGluZyBpcyBub3QgZGVzaXJlZC4gIEFueSBjaHVua3Mgbm90Ci0gICBsaXN0ZWQgd2lsbCBiZSBoYW5kbGVkIGluIHRoZSBkZWZhdWx0IG1hbm5lci4gIFRoZSBJSERSIGFuZCBJRU5EIGNodW5rcwotICAgbXVzdCBub3QgYmUgbGlzdGVkLgotICAgICAga2VlcCA9IDA6IGZvbGxvdyBkZWZhdWx0IGJlaGF2aW91cgotICAgICAgICAgICA9IDE6IGRvIG5vdCBrZWVwCi0gICAgICAgICAgID0gMjoga2VlcCBvbmx5IGlmIHNhZmUtdG8tY29weQotICAgICAgICAgICA9IDM6IGtlZXAgZXZlbiBpZiB1bnNhZmUtdG8tY29weQotKi8KLVBOR19FWFBPUlQodm9pZCwgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCi0gICBwbmdfcHRyLCBpbnQga2VlcCwgcG5nX2J5dGVwIGNodW5rX2xpc3QsIGludCBudW1fY2h1bmtzKSk7Ci1QTkdfRVhQT1JUKGludCxwbmdfaGFuZGxlX2FzX3Vua25vd24pIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwCi0gICBjaHVua19uYW1lKSk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECi1QTkdfRVhQT1JUKHZvaWQsIHBuZ19zZXRfdW5rbm93bl9jaHVua3MpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3Vua25vd25fY2h1bmtwIHVua25vd25zLCBpbnQgbnVtX3Vua25vd25zKSk7Ci1QTkdfRVhQT1JUKHZvaWQsIHBuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbikKLSAgIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgY2h1bmssIGludCBsb2NhdGlvbikpOwotUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X3Vua25vd25fY2h1bmtzKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwCi0gICBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIsIHBuZ191bmtub3duX2NodW5rcHAgZW50cmllcykpOwotI2VuZGlmCi0KLS8qIFBuZ19mcmVlX2RhdGEoKSB3aWxsIHR1cm4gb2ZmIHRoZSAidmFsaWQiIGZsYWcgZm9yIGFueXRoaW5nIGl0IGZyZWVzLgotICogSWYgeW91IG5lZWQgdG8gdHVybiBpdCBvZmYgZm9yIGEgY2h1bmsgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGhhcyBmcmVlZCwKLSAqIHlvdSBjYW4gdXNlIHBuZ19zZXRfaW52YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fQ0hOSyk7Ci0gKi8KLVBOR19FWFBPUlQodm9pZCwgcG5nX3NldF9pbnZhbGlkKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIGludCBtYXNrKSk7Ci0KLSNpZmRlZiBQTkdfSU5GT19JTUFHRV9TVVBQT1JURUQKLS8qIFRoZSAicGFyYW1zIiBwb2ludGVyIGlzIGN1cnJlbnRseSBub3QgdXNlZCBhbmQgaXMgZm9yIGZ1dHVyZSBleHBhbnNpb24uICovCi1QTkdfRVhQT1JUKHZvaWQsIHBuZ19yZWFkX3BuZykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2luZm9wIGluZm9fcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zZm9ybXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfdm9pZHAgcGFyYW1zKSk7Ci1QTkdfRVhQT1JUKHZvaWQsIHBuZ193cml0ZV9wbmcpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc2Zvcm1zLAotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3ZvaWRwIHBhcmFtcykpOwotI2VuZGlmCi0KLVBOR19FWFBPUlQocG5nX2NoYXJwLHBuZ19nZXRfY29weXJpZ2h0KSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIpKTsKLVBOR19FWFBPUlQocG5nX2NoYXJwLHBuZ19nZXRfaGVhZGVyX3ZlcikgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyKSk7Ci1QTkdfRVhQT1JUKHBuZ19jaGFycCxwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwCi0gICAgcG5nX3B0cikpOwotUE5HX0VYUE9SVChwbmdfY2hhcnAscG5nX2dldF9saWJwbmdfdmVyKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIpKTsKLQotI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECi1QTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCi0gICBwbmdfcHRyLCBwbmdfdWludF8zMiBtbmdfZmVhdHVyZXNfcGVybWl0dGVkKSk7Ci0jZW5kaWYKLQotLyogRm9yIHVzZSBpbiBwbmdfc2V0X2tlZXBfdW5rbm93biwgYWRkZWQgdG8gdmVyc2lvbiAxLjIuNiAqLwotI2RlZmluZSBQTkdfSEFORExFX0NIVU5LX0FTX0RFRkFVTFQgICAwCi0jZGVmaW5lIFBOR19IQU5ETEVfQ0hVTktfTkVWRVIgICAgICAgIDEKLSNkZWZpbmUgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFICAgICAgMgotI2RlZmluZSBQTkdfSEFORExFX0NIVU5LX0FMV0FZUyAgICAgICAzCi0KLS8qIFN0cmlwIHRoZSBwcmVwZW5kZWQgZXJyb3IgbnVtYmVycyAoIiNubm4gIikgZnJvbSBlcnJvciBhbmQgd2FybmluZwotICogbWVzc2FnZXMgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUgZXJyb3Igb3Igd2FybmluZyBoYW5kbGVyLgotICovCi0jaWZkZWYgUE5HX0VSUk9SX05VTUJFUlNfU1VQUE9SVEVECi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9zdHJpcF9lcnJvcl9udW1iZXJzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCi0gICBwbmdfcHRyLCBwbmdfdWludF8zMiBzdHJpcF9tb2RlKSk7Ci0jZW5kaWYKLQotLyogQWRkZWQgaW4gbGlicG5nLTEuMi42ICovCi0jaWZkZWYgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKLVBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3VzZXJfbGltaXRzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCi0gICBwbmdfcHRyLCBwbmdfdWludF8zMiB1c2VyX3dpZHRoX21heCwgcG5nX3VpbnRfMzIgdXNlcl9oZWlnaHRfbWF4KSk7Ci1QTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfdXNlcl93aWR0aF9tYXgpIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAKLSAgIHBuZ19wdHIpKTsKLVBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF91c2VyX2hlaWdodF9tYXgpIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAKLSAgIHBuZ19wdHIpKTsKLS8qIEFkZGVkIGluIGxpYnBuZy0xLjQuMCAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfY2h1bmtfY2FjaGVfbWF4KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCi0gICBwbmdfcHRyLCBwbmdfdWludF8zMiB1c2VyX2NodW5rX2NhY2hlX21heCkpOwotUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X2NodW5rX2NhY2hlX21heCkKLSAgIFBOR0FSRygocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0cikpOwotLyogQWRkZWQgaW4gbGlicG5nLTEuNC4xICovCi1QTkdfRVhQT1JUKHZvaWQscG5nX3NldF9jaHVua19tYWxsb2NfbWF4KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCi0gICBwbmdfcHRyLCBwbmdfYWxsb2Nfc2l6ZV90IHVzZXJfY2h1bmtfY2FjaGVfbWF4KSk7Ci1QTkdfRVhQT1JUKHBuZ19hbGxvY19zaXplX3QscG5nX2dldF9jaHVua19tYWxsb2NfbWF4KQotICAgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX0lOQ0hfQ09OVkVSU0lPTlMpICYmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkKLVBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9waXhlbHNfcGVyX2luY2gpCi0gICBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0cikpOwotCi1QTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfeF9waXhlbHNfcGVyX2luY2gpCi0gICBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0cikpOwotCi1QTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfeV9waXhlbHNfcGVyX2luY2gpCi0gICBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0cikpOwotCi1QTkdfRVhQT1JUKGZsb2F0LHBuZ19nZXRfeF9vZmZzZXRfaW5jaGVzKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIpKTsKLQotUE5HX0VYUE9SVChmbG9hdCxwbmdfZ2V0X3lfb2Zmc2V0X2luY2hlcykgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKSk7Ci0KLSNpZmRlZiBQTkdfcEhZc19TVVBQT1JURUQKLVBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9wSFlzX2RwaSkgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiAqcmVzX3gsIHBuZ191aW50XzMyICpyZXNfeSwKLSAgIGludCAqdW5pdF90eXBlKSk7Ci0jZW5kaWYgLyogUE5HX3BIWXNfU1VQUE9SVEVEICovCi0jZW5kaWYgIC8qIFBOR19JTkNIX0NPTlZFUlNJT05TICYmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQgKi8KLQotLyogQWRkZWQgaW4gbGlicG5nLTEuNC4wICovCi0jaWZkZWYgUE5HX0lPX1NUQVRFX1NVUFBPUlRFRAotUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X2lvX3N0YXRlKSBQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIpKTsKLQotUE5HX0VYUE9SVChwbmdfYnl0ZXAscG5nX2dldF9pb19jaHVua19uYW1lKQotICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0KLS8qIFRoZSBmbGFncyByZXR1cm5lZCBieSBwbmdfZ2V0X2lvX3N0YXRlKCkgYXJlIHRoZSBmb2xsb3dpbmc6ICovCi0jZGVmaW5lIFBOR19JT19OT05FICAgICAgICAweDAwMDAgICAvKiBubyBJL08gYXQgdGhpcyBtb21lbnQgKi8KLSNkZWZpbmUgUE5HX0lPX1JFQURJTkcgICAgIDB4MDAwMSAgIC8qIGN1cnJlbnRseSByZWFkaW5nICovCi0jZGVmaW5lIFBOR19JT19XUklUSU5HICAgICAweDAwMDIgICAvKiBjdXJyZW50bHkgd3JpdGluZyAqLwotI2RlZmluZSBQTkdfSU9fU0lHTkFUVVJFICAgMHgwMDEwICAgLyogY3VycmVudGx5IGF0IHRoZSBmaWxlIHNpZ25hdHVyZSAqLwotI2RlZmluZSBQTkdfSU9fQ0hVTktfSERSICAgMHgwMDIwICAgLyogY3VycmVudGx5IGF0IHRoZSBjaHVuayBoZWFkZXIgKi8KLSNkZWZpbmUgUE5HX0lPX0NIVU5LX0RBVEEgIDB4MDA0MCAgIC8qIGN1cnJlbnRseSBhdCB0aGUgY2h1bmsgZGF0YSAqLwotI2RlZmluZSBQTkdfSU9fQ0hVTktfQ1JDICAgMHgwMDgwICAgLyogY3VycmVudGx5IGF0IHRoZSBjaHVuayBjcmMgKi8KLSNkZWZpbmUgUE5HX0lPX01BU0tfT1AgICAgIDB4MDAwZiAgIC8qIGN1cnJlbnQgb3BlcmF0aW9uOiByZWFkaW5nL3dyaXRpbmcgKi8KLSNkZWZpbmUgUE5HX0lPX01BU0tfTE9DICAgIDB4MDBmMCAgIC8qIGN1cnJlbnQgbG9jYXRpb246IHNpZy9oZHIvZGF0YS9jcmMgKi8KLSNlbmRpZiAvKiA/UE5HX0lPX1NUQVRFX1NVUFBPUlRFRCAqLwotCi0vKiBNYWludGFpbmVyOiBQdXQgbmV3IHB1YmxpYyBwcm90b3R5cGVzIGhlcmUgXiwgaW4gbGlicG5nLjMsIGFuZCBwcm9qZWN0Ci0gKiBkZWZzCi0gKi8KLQotI2lmZGVmIFBOR19SRUFEX0NPTVBPU0lURV9OT0RJVl9TVVBQT1JURUQKLS8qIFdpdGggdGhlc2Ugcm91dGluZXMgd2UgYXZvaWQgYW4gaW50ZWdlciBkaXZpZGUsIHdoaWNoIHdpbGwgYmUgc2xvd2VyIG9uCi0gKiBtb3N0IG1hY2hpbmVzLiAgSG93ZXZlciwgaXQgZG9lcyB0YWtlIG1vcmUgb3BlcmF0aW9ucyB0aGFuIHRoZSBjb3JyZXNwb25kaW5nCi0gKiBkaXZpZGUgbWV0aG9kLCBzbyBpdCBtYXkgYmUgc2xvd2VyIG9uIGEgZmV3IFJJU0Mgc3lzdGVtcy4gIFRoZXJlIGFyZSB0d28KLSAqIHNoaWZ0cyAoYnkgOCBvciAxNiBiaXRzKSBhbmQgYW4gYWRkaXRpb24sIHZlcnN1cyBhIHNpbmdsZSBpbnRlZ2VyIGRpdmlkZS4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlIHJvdW5kaW5nIGZhY3RvcnMgYXJlIE5PVCBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSEgIDEyOCBhbmQKLSAqIDMyNzY4IGFyZSBjb3JyZWN0IGZvciB0aGUgTk9ESVYgY29kZTsgMTI3IGFuZCAzMjc2NyBhcmUgY29ycmVjdCBmb3IgdGhlCi0gKiBzdGFuZGFyZCBtZXRob2QuCi0gKgotICogW09wdGltaXplZCBjb2RlIGJ5IEdyZWcgUm9lbG9mcyBhbmQgTWFyayBBZGxlci4uLmJsYW1lIHVzIGZvciBidWdzLiA6LSkgXQotICovCi0KLSAvKiBmZyBhbmQgYmcgc2hvdWxkIGJlIGluIGBnYW1tYSAxLjAnIHNwYWNlOyBhbHBoYSBpcyB0aGUgb3BhY2l0eSAgICAgICAgICAqLwotCi0jICBkZWZpbmUgcG5nX2NvbXBvc2l0ZShjb21wb3NpdGUsIGZnLCBhbHBoYSwgYmcpICAgICAgICAgXAotICAgICB7IHBuZ191aW50XzE2IHRlbXAgPSAocG5nX3VpbnRfMTYpKChwbmdfdWludF8xNikoZmcpIFwKLSAgICAgICAgICAgKiAocG5nX3VpbnRfMTYpKGFscGhhKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICsgKHBuZ191aW50XzE2KShiZykqKHBuZ191aW50XzE2KSgyNTUgICAgICAgICAgXAotICAgICAgICAgICAtIChwbmdfdWludF8xNikoYWxwaGEpKSArIChwbmdfdWludF8xNikxMjgpOyAgIFwKLSAgICAgICAoY29tcG9zaXRlKSA9IChwbmdfYnl0ZSkoKHRlbXAgKyAodGVtcCA+PiA4KSkgPj4gOCk7IH0KLQotIyAgZGVmaW5lIHBuZ19jb21wb3NpdGVfMTYoY29tcG9zaXRlLCBmZywgYWxwaGEsIGJnKSAgICAgICBcCi0gICAgIHsgcG5nX3VpbnRfMzIgdGVtcCA9IChwbmdfdWludF8zMikoKHBuZ191aW50XzMyKShmZykgIFwKLSAgICAgICAgICAgKiAocG5nX3VpbnRfMzIpKGFscGhhKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICArIChwbmdfdWludF8zMikoYmcpKihwbmdfdWludF8zMikoNjU1MzVMICAgICAgICBcCi0gICAgICAgICAgIC0gKHBuZ191aW50XzMyKShhbHBoYSkpICsgKHBuZ191aW50XzMyKTMyNzY4TCk7IFwKLSAgICAgICAoY29tcG9zaXRlKSA9IChwbmdfdWludF8xNikoKHRlbXAgKyAodGVtcCA+PiAxNikpID4+IDE2KTsgfQotCi0jZWxzZSAgLyogU3RhbmRhcmQgbWV0aG9kIHVzaW5nIGludGVnZXIgZGl2aXNpb24gKi8KLQotIyAgZGVmaW5lIHBuZ19jb21wb3NpdGUoY29tcG9zaXRlLCBmZywgYWxwaGEsIGJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIChjb21wb3NpdGUpID0gKHBuZ19ieXRlKSgoKHBuZ191aW50XzE2KShmZykgKiAocG5nX3VpbnRfMTYpKGFscGhhKSArICAgIFwKLSAgICAgICAocG5nX3VpbnRfMTYpKGJnKSAqIChwbmdfdWludF8xNikoMjU1IC0gKHBuZ191aW50XzE2KShhbHBoYSkpICsgICAgICAgXAotICAgICAgIChwbmdfdWludF8xNikxMjcpIC8gMjU1KQotCi0jICBkZWZpbmUgcG5nX2NvbXBvc2l0ZV8xNihjb21wb3NpdGUsIGZnLCBhbHBoYSwgYmcpICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgKGNvbXBvc2l0ZSkgPSAocG5nX3VpbnRfMTYpKCgocG5nX3VpbnRfMzIpKGZnKSAqIChwbmdfdWludF8zMikoYWxwaGEpICsgXAotICAgICAgIChwbmdfdWludF8zMikoYmcpKihwbmdfdWludF8zMikoNjU1MzVMIC0gKHBuZ191aW50XzMyKShhbHBoYSkpICsgICAgICBcCi0gICAgICAgKHBuZ191aW50XzMyKTMyNzY3KSAvIChwbmdfdWludF8zMik2NTUzNUwpCi0jZW5kaWYgLyogUE5HX1JFQURfQ09NUE9TSVRFX05PRElWX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX1VTRV9SRUFEX01BQ1JPUwotLyogSW5saW5lIG1hY3JvcyB0byBkbyBkaXJlY3QgcmVhZHMgb2YgYnl0ZXMgZnJvbSB0aGUgaW5wdXQgYnVmZmVyLgotICogVGhlIHBuZ19nZXRfaW50XzMyKCkgcm91dGluZSBhc3N1bWVzIHdlIGFyZSB1c2luZyB0d28ncyBjb21wbGVtZW50Ci0gKiBmb3JtYXQgZm9yIG5lZ2F0aXZlIHZhbHVlcywgd2hpY2ggaXMgYWxtb3N0IGNlcnRhaW5seSB0cnVlLgotICovCi0jICBkZWZpbmUgcG5nX2dldF91aW50XzMyKGJ1ZikgXAotICAgICAoKChwbmdfdWludF8zMikoKihidWYpKSA8PCAyNCkgKyBcCi0gICAgICAoKHBuZ191aW50XzMyKSgqKChidWYpICsgMSkpIDw8IDE2KSArIFwKLSAgICAgICgocG5nX3VpbnRfMzIpKCooKGJ1ZikgKyAyKSkgPDwgOCkgKyBcCi0gICAgICAoKHBuZ191aW50XzMyKSgqKChidWYpICsgMykpKSkKLQotICAvKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb24gaW50cm9kdWNlcyBhbiBBUEkgaW5jb21wYXRpYmlsaXR5IChidXQgbm90Ci0gICAqIGFuIEFCSSBpbmNvbXBhdGliaWxpdHkpIHdpdGggbGlicG5nLTEuNC4wIHRocm91Z2ggMS40LjQuICBQcmlvciB0bwotICAgKiBsaWJwbmctMS40LjUgdGhlIG1hY3JvLCB3aGljaCBpcyB1c2VkIGJ5IGRlZmF1bHQsIHJldHVybmVkIChpbmNvcnJlY3RseSkKLSAgICogYSAocG5nX3VpbnRfMzIpLCB3aGlsZSB0aGUgZnVuY3Rpb24sIGlmIHVzZWQgaW5zdGVhZCwgY29ycmVjdGx5IHJldHVybmVkCi0gICAqIGEgKHBuZ191aW50XzE2KS4KLSAgICoKLSAgICogTGlicG5nIHZlcnNpb25zIDEuMC54IGFuZCAxLjIueCBvbmx5IHVzZWQgYSBmdW5jdGlvbiBzbyBhcmUgbm90IGFmZmVjdGVkCi0gICAqIGJ5IHRoaXMgcG90ZW50aWFsIEFQSSBpbmNvbXBhdGliaWxpdHkgYmV0d2VlbiBtYWNyb3MuCi0gICAqLwotIyAgZGVmaW5lIHBuZ19nZXRfdWludF8xNihidWYpIFwKLSAgICAgKChwbmdfdWludF8xNikgXAotICAgICAgICgoKHVuc2lnbmVkIGludCkoKihidWYpKSA8PCA4KSArIFwKLSAgICAgICAgKCh1bnNpZ25lZCBpbnQpKCooKGJ1ZikgKyAxKSkpKSkKLQotIyAgZGVmaW5lIHBuZ19nZXRfaW50XzMyKGJ1ZikgXAotICAgICAoKHBuZ19pbnRfMzIpKCgqKGJ1ZikgJiAweDgwKSBcCi0gICAgICA/IC0oKHBuZ19pbnRfMzIpKChwbmdfZ2V0X3VpbnRfMzIoYnVmKSBeIDB4ZmZmZmZmZmZMKSArIDEpKSBcCi0gICAgICA6IChwbmdfaW50XzMyKXBuZ19nZXRfdWludF8zMihidWYpKSkKLSNlbHNlCi1QTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfdWludF8zMikgUE5HQVJHKChwbmdfYnl0ZXAgYnVmKSk7Ci1QTkdfRVhQT1JUKHBuZ191aW50XzE2LHBuZ19nZXRfdWludF8xNikgUE5HQVJHKChwbmdfYnl0ZXAgYnVmKSk7Ci0jaWZkZWYgUE5HX0dFVF9JTlRfMzJfU1VQUE9SVEVECi1QTkdfRVhQT1JUKHBuZ19pbnRfMzIscG5nX2dldF9pbnRfMzIpIFBOR0FSRygocG5nX2J5dGVwIGJ1ZikpOwotI2VuZGlmCi0jZW5kaWYKLVBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF91aW50XzMxKQotICBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBidWYpKTsKLS8qIE5vIHBuZ19nZXRfaW50XzE2IC0tIG1heSBiZSBhZGRlZCBpZiB0aGVyZSdzIGEgcmVhbCBuZWVkIGZvciBpdC4gKi8KLQotLyogUGxhY2UgYSAzMi1iaXQgbnVtYmVyIGludG8gYSBidWZmZXIgaW4gUE5HIGJ5dGUgb3JkZXIgKGJpZy1lbmRpYW4pLiAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19zYXZlX3VpbnRfMzIpCi0gICBQTkdBUkcoKHBuZ19ieXRlcCBidWYsIHBuZ191aW50XzMyIGkpKTsKLVBOR19FWFBPUlQodm9pZCxwbmdfc2F2ZV9pbnRfMzIpCi0gICBQTkdBUkcoKHBuZ19ieXRlcCBidWYsIHBuZ19pbnRfMzIgaSkpOwotCi0vKiBQbGFjZSBhIDE2LWJpdCBudW1iZXIgaW50byBhIGJ1ZmZlciBpbiBQTkcgYnl0ZSBvcmRlci4KLSAqIFRoZSBwYXJhbWV0ZXIgaXMgZGVjbGFyZWQgdW5zaWduZWQgaW50LCBub3QgcG5nX3VpbnRfMTYsCi0gKiBqdXN0IHRvIGF2b2lkIHBvdGVudGlhbCBwcm9ibGVtcyBvbiBwcmUtQU5TSSBDIGNvbXBpbGVycy4KLSAqLwotUE5HX0VYUE9SVCh2b2lkLHBuZ19zYXZlX3VpbnRfMTYpCi0gICBQTkdBUkcoKHBuZ19ieXRlcCBidWYsIHVuc2lnbmVkIGludCBpKSk7Ci0vKiBObyBwbmdfc2F2ZV9pbnRfMTYgLS0gbWF5IGJlIGFkZGVkIGlmIHRoZXJlJ3MgYSByZWFsIG5lZWQgZm9yIGl0LiAqLwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIFZhcmlvdXMgbW9kZXMgb2Ygb3BlcmF0aW9uLiAgTm90ZSB0aGF0IGFmdGVyIGFuIGluaXQsIG1vZGUgaXMgc2V0IHRvCi0gKiB6ZXJvIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgc3RydWN0dXJlIGlzIGNyZWF0ZWQuCi0gKi8KLSNkZWZpbmUgUE5HX0hBVkVfSUhEUiAgICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgUE5HX0hBVkVfUExURSAgICAgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgUE5HX0hBVkVfSURBVCAgICAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgUE5HX0FGVEVSX0lEQVQgICAgICAgICAgICAgIDB4MDggLyogSGF2ZSBjb21wbGV0ZSB6bGliIGRhdGFzdHJlYW0gKi8KLSNkZWZpbmUgUE5HX0hBVkVfSUVORCAgICAgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgUE5HX0hBVkVfZ0FNQSAgICAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgUE5HX0hBVkVfY0hSTSAgICAgICAgICAgICAgIDB4NDAKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIFBOR19WRVJTSU9OX0lORk9fT05MWSAqLwotLyogRG8gbm90IHB1dCBhbnl0aGluZyBwYXN0IHRoaXMgbGluZSAqLwotI2VuZGlmIC8qIFBOR19IICovCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3BuZ2Jhci5qcGcgYi9zcmMvbGlicG5nL3BuZ2Jhci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYmE4ZDguLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9wbmdiYXIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9wbmdiYXIucG5nIGIvc3JjL2xpYnBuZy9wbmdiYXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTc5OGM4Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvcG5nYmFyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvcG5nY29uZi5oIGIvc3JjL2xpYnBuZy9wbmdjb25mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMWU3N2MuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9wbmdjb25mLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU2ICswLDAgQEAKLQotI2lmbmRlZiBQTkdfVVNFUl9DT05GSUcKLSNkZWZpbmUgUE5HX1VTRVJfQ09ORklHCi0jZW5kaWYKLQotLyogcG5nY29uZi5oIC0gbWFjaGluZSBjb25maWd1cmFibGUgZmlsZSBmb3IgbGlicG5nCi0gKgotICogbGlicG5nIHZlcnNpb24gMS40LjEyIC0gSnVseSAxMCwgMjAxMgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQotICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQotICoKLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0gKiBhbmQgbGljZW5zZSBpbiBwbmcuaAotICoKLSAqLwotCi0vKiBBbnkgbWFjaGluZSBzcGVjaWZpYyBjb2RlIGlzIG5lYXIgdGhlIGZyb250IG9mIHRoaXMgZmlsZSwgc28gaWYgeW91Ci0gKiBhcmUgY29uZmlndXJpbmcgbGlicG5nIGZvciBhIG1hY2hpbmUsIHlvdSBtYXkgd2FudCB0byByZWFkIHRoZSBzZWN0aW9uCi0gKiBzdGFydGluZyBoZXJlIGRvd24gdG8gd2hlcmUgaXQgc3RhcnRzIHRvIHR5cGVkZWYgcG5nX2NvbG9yLCBwbmdfdGV4dCwKLSAqIGFuZCBwbmdfaW5mby4KLSAqLwotCi0jaWZuZGVmIFBOR0NPTkZfSAotI2RlZmluZSBQTkdDT05GX0gKLQotI2lmbmRlZiBQTkdfTk9fTElNSVRTX0gKLSMgIGluY2x1ZGUgPGxpbWl0cy5oPgotI2VuZGlmCi0KLS8qIEFkZGVkIGF0IGxpYnBuZy0xLjIuOSAqLwotCi0vKiBjb25maWcuaCBpcyBjcmVhdGVkIGJ5IGFuZCBQTkdfQ09ORklHVVJFX0xJQlBORyBpcyBzZXQgYnkgdGhlICJjb25maWd1cmUiCi0gKiBzY3JpcHQuCi0gKi8KLSNpZmRlZiBQTkdfQ09ORklHVVJFX0xJQlBORwotIyAgaWZkZWYgSEFWRV9DT05GSUdfSAotIyAgICBpbmNsdWRlICJjb25maWcuaCIKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyoKLSAqIEFkZGVkIGF0IGxpYnBuZy0xLjIuOAotICoKLSAqIFBOR19VU0VSX0NPTkZJRyBoYXMgdG8gYmUgZGVmaW5lZCBvbiB0aGUgY29tcGlsZXIgY29tbWFuZCBsaW5lLiBUaGlzCi0gKiBpbmNsdWRlcyB0aGUgcmVzb3VyY2UgY29tcGlsZXIgZm9yIFdpbmRvd3MgRExMIGNvbmZpZ3VyYXRpb25zLgotICovCi0jaWZkZWYgUE5HX1VTRVJfQ09ORklHCi0jICBpbmNsdWRlICJwbmd1c3IuaCIKLSMgIGlmbmRlZiBQTkdfVVNFUl9QUklWQVRFQlVJTEQKLSMgICAgZGVmaW5lIFBOR19VU0VSX1BSSVZBVEVCVUlMRAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKgotICogSWYgeW91IGNyZWF0ZSBhIHByaXZhdGUgRExMIHlvdSBzaG91bGQgZGVmaW5lIGluICJwbmd1c3IuaCIgdGhlIGZvbGxvd2luZzoKLSAqICNkZWZpbmUgUE5HX1VTRVJfUFJJVkFURUJVSUxEIDxEZXNjcmliZXMgYnkgd2hvbSBhbmQgd2h5IHRoaXMgdmVyc2lvbiBvZgotICogICAgICAgIHRoZSBETEwgd2FzIGJ1aWx0PgotICogIGUuZy4gI2RlZmluZSBQTkdfVVNFUl9QUklWQVRFQlVJTEQgIkJ1aWxkIGJ5IE15Q29tcGFueSBmb3IgeHl6IHJlYXNvbnMuIgotICogI2RlZmluZSBQTkdfVVNFUl9ETExGTkFNRV9QT1NURklYIDx0d28tbGV0dGVyIHBvc3RmaXggdGhhdCBzZXJ2ZSB0bwotICogICAgICAgIGRpc3Rpbmd1aXNoIHlvdXIgRExMIGZyb20gdGhvc2Ugb2YgdGhlIG9mZmljaWFsIHJlbGVhc2UuIFRoZXNlCi0gKiAgICAgICAgY29ycmVzcG9uZCB0byB0aGUgdHJhaWxpbmcgbGV0dGVycyB0aGF0IGNvbWUgYWZ0ZXIgdGhlIHZlcnNpb24KLSAqICAgICAgICBudW1iZXIgYW5kIG11c3QgbWF0Y2ggeW91ciBwcml2YXRlIERMTCBuYW1lPgotICogIGUuZy4gLy8gcHJpdmF0ZSBETEwgImxpYnBuZzE0Z3guZGxsIgotICogICAgICAgI2RlZmluZSBQTkdfVVNFUl9ETExGTkFNRV9QT1NURklYICJneCIKLSAqCi0gKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgYWxzbyBhdCB5b3VyIGRpc3Bvc2FsIGlmIHlvdSB3YW50IHRvIGNvbXBsZXRlIHRoZQotICogRExMIFZFUlNJT05JTkZPIHN0cnVjdHVyZS4KLSAqIC0gUE5HX1VTRVJfVkVSU0lPTklORk9fQ09NTUVOVFMKLSAqIC0gUE5HX1VTRVJfVkVSU0lPTklORk9fQ09NUEFOWU5BTUUKLSAqIC0gUE5HX1VTRVJfVkVSU0lPTklORk9fTEVHQUxUUkFERU1BUktTCi0gKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jICBpZmRlZiBTUEVDSUFMQlVJTEQKLSMgICAgcHJhZ21hIG1lc3NhZ2UoIlBOR19MSUJQTkdfU1BFQ0lBTEJVSUxEIChhbmQgZGVwcmVjYXRlZCBTUEVDSUFMQlVJTEQpXAotICAgICBhcmUgbm93IExJQlBORyByZXNlcnZlZCBtYWNyb3MuIFVzZSBQTkdfVVNFUl9QUklWQVRFQlVJTEQgaW5zdGVhZC4iKQotIyAgZW5kaWYKLQotIyAgaWZkZWYgUFJJVkFURUJVSUxECi0jICAgIHByYWdtYSBtZXNzYWdlKCJQUklWQVRFQlVJTEQgaXMgZGVwcmVjYXRlZC5cCi0gICAgIFVzZSBQTkdfVVNFUl9QUklWQVRFQlVJTEQgaW5zdGVhZC4iKQotIyAgICBkZWZpbmUgUE5HX1VTRVJfUFJJVkFURUJVSUxEIFBSSVZBVEVCVUlMRAotIyAgZW5kaWYKLSNlbmRpZiAvKiBfX1NURENfXyAqLwotCi0vKiBFbmQgb2YgbWF0ZXJpYWwgYWRkZWQgdG8gbGlicG5nLTEuMi44ICovCi0KLS8qIEFkZGVkIGF0IGxpYnBuZy0xLjQuNiAqLwotI2lmbmRlZiBQTkdfVU5VU0VECi0vKiBVbnVzZWQgZm9ybWFsIHBhcmFtZXRlciB3YXJuaW5ncyBhcmUgc2lsZW5jZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBtYWNybwotICogd2hpY2ggaXMgZXhwZWN0ZWQgdG8gaGF2ZSBubyBiYWQgZWZmZWN0cyBvbiBwZXJmb3JtYW5jZSAob3B0aW1pemluZwotICogY29tcGlsZXJzIHdpbGwgcHJvYmFibHkgcmVtb3ZlIGl0IGVudGlyZWx5KS4gIE5vdGUgdGhhdCBpZiB5b3UgcmVwbGFjZQotICogaXQgd2l0aCBzb21ldGhpbmcgb3RoZXIgdGhhbiB3aGl0ZXNwYWNlLCB5b3UgbXVzdCBpbmNsdWRlIHRoZSB0ZXJtaW5hdGluZwotICogc2VtaWNvbG9uLgotICovCi0jICBkZWZpbmUgUE5HX1VOVVNFRChwYXJhbSkgKHZvaWQpcGFyYW07Ci0jZW5kaWYKLS8qIEVuZCBvZiBtYXRlcmlhbCBhZGRlZCB0byBsaWJwbmctMS40LjYgKi8KLQotI2lmbmRlZiBQTkdfVkVSU0lPTl9JTkZPX09OTFkKLQotLyogVGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3Npb24gYnVmZmVyLCBhbmQgdGh1cyB0aGUgc2l6ZSBvZgotICogYW4gSURBVCBjaHVuay4gIE1ha2UgdGhpcyB3aGF0ZXZlciBzaXplIHlvdSBmZWVsIGlzIGJlc3QgZm9yIHlvdXIKLSAqIG1hY2hpbmUuICBPbmUgb2YgdGhlc2Ugd2lsbCBiZSBhbGxvY2F0ZWQgcGVyIHBuZ19zdHJ1Y3QuICBXaGVuIHRoaXMKLSAqIGlzIGZ1bGwsIGl0IHdyaXRlcyB0aGUgZGF0YSB0byB0aGUgZGlzaywgYW5kIGRvZXMgc29tZSBvdGhlcgotICogY2FsY3VsYXRpb25zLiAgTWFraW5nIHRoaXMgYW4gZXh0cmVtZWx5IHNtYWxsIHNpemUgd2lsbCBzbG93Ci0gKiB0aGUgbGlicmFyeSBkb3duLCBidXQgeW91IG1heSB3YW50IHRvIGV4cGVyaW1lbnQgdG8gZGV0ZXJtaW5lCi0gKiB3aGVyZSBpdCBiZWNvbWVzIHNpZ25pZmljYW50LCBpZiB5b3UgYXJlIGNvbmNlcm5lZCB3aXRoIG1lbW9yeQotICogdXNhZ2UuICBOb3RlIHRoYXQgemxpYiBhbGxvY2F0ZXMgYXQgbGVhc3QgMzJLYiBhbHNvLiAgRm9yIHJlYWRlcnMsCi0gKiB0aGlzIGRlc2NyaWJlcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGF2YWlsYWJsZSB0byByZWFkIHRoZSBkYXRhIGluLgotICogVW5sZXNzIHRoaXMgZ2V0cyBzbWFsbGVyIHRoYW4gdGhlIHNpemUgb2YgYSByb3cgKGNvbXByZXNzZWQpLAotICogaXQgc2hvdWxkIG5vdCBtYWtlIG11Y2ggZGlmZmVyZW5jZSBob3cgYmlnIHRoaXMgaXMuCi0gKi8KLQotI2lmbmRlZiBQTkdfWkJVRl9TSVpFCi0jICBkZWZpbmUgUE5HX1pCVUZfU0laRSA4MTkyCi0jZW5kaWYKLQotLyogRW5hYmxlIGlmIHlvdSB3YW50IGEgd3JpdGUtb25seSBsaWJwbmcgKi8KLQotI2lmbmRlZiBQTkdfTk9fUkVBRF9TVVBQT1JURUQKLSMgIGRlZmluZSBQTkdfUkVBRF9TVVBQT1JURUQKLSNlbmRpZgotCi0vKiBFbmFibGUgaWYgeW91IHdhbnQgYSByZWFkLW9ubHkgbGlicG5nICovCi0KLSNpZm5kZWYgUE5HX05PX1dSSVRFX1NVUFBPUlRFRAotIyAgZGVmaW5lIFBOR19XUklURV9TVVBQT1JURUQKLSNlbmRpZgotCi0vKiBFbmFibGVkIGluIDEuNC4wLiAqLwotI2lmZGVmIFBOR19BTExPV19CRU5JR05fRVJST1JTCi0jICBkZWZpbmUgcG5nX2Jlbmlnbl9lcnJvciBwbmdfd2FybmluZwotIyAgZGVmaW5lIHBuZ19jaHVua19iZW5pZ25fZXJyb3IgcG5nX2NodW5rX3dhcm5pbmcKLSNlbHNlCi0jICBpZm5kZWYgUE5HX0JFTklHTl9FUlJPUlNfU1VQUE9SVEVECi0jICAgIGRlZmluZSBwbmdfYmVuaWduX2Vycm9yIHBuZ19lcnJvcgotIyAgICBkZWZpbmUgcG5nX2NodW5rX2Jlbmlnbl9lcnJvciBwbmdfY2h1bmtfZXJyb3IKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS40LjAgKi8KLSNpZiAhZGVmaW5lZChQTkdfTk9fV0FSTklOR1MpICYmICFkZWZpbmVkKFBOR19XQVJOSU5HU19TVVBQT1JURUQpCi0jICBkZWZpbmUgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRAotI2VuZGlmCi0KLS8qIEFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuNC4wICovCi0jaWYgIWRlZmluZWQoUE5HX05PX0VSUk9SX1RFWFQpICYmICFkZWZpbmVkKFBOR19FUlJPUl9URVhUX1NVUFBPUlRFRCkKLSMgIGRlZmluZSBQTkdfRVJST1JfVEVYVF9TVVBQT1JURUQKLSNlbmRpZgotCi0vKiBBZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjQuMCAqLwotI2lmICFkZWZpbmVkKFBOR19OT19DSEVDS19jSFJNKSAmJiAhZGVmaW5lZChQTkdfQ0hFQ0tfY0hSTV9TVVBQT1JURUQpCi0jICBkZWZpbmUgUE5HX0NIRUNLX2NIUk1fU1VQUE9SVEVECi0jZW5kaWYKLQotLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS40LjAgKi8KLSNpZiAhZGVmaW5lZChQTkdfTk9fQUxJR05FRF9NRU1PUlkpICYmICFkZWZpbmVkKFBOR19BTElHTkVEX01FTU9SWV9TVVBQT1JURUQpCi0jICBkZWZpbmUgUE5HX0FMSUdORURfTUVNT1JZX1NVUFBPUlRFRAotI2VuZGlmCi0KLS8qIEVuYWJsZWQgYnkgZGVmYXVsdCBpbiAxLjIuMC4gIFlvdSBjYW4gZGlzYWJsZSB0aGlzIGlmIHlvdSBkb24ndCBuZWVkIHRvCi0gICBzdXBwb3J0IFBOR3MgdGhhdCBhcmUgZW1iZWRkZWQgaW4gTU5HIGRhdGFzdHJlYW1zICovCi0jaWZuZGVmIFBOR19OT19NTkdfRkVBVFVSRVMKLSMgIGlmbmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS40LjAgKi8KLSNpZm5kZWYgUE5HX05PX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotIyAgaWZuZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogQWRkZWQgYXQgbGlicG5nLTEuNC4wYmV0YTQ5IGZvciB0ZXN0aW5nICh0aGlzIHRlc3QgaXMgbm8gbG9uZ2VyIHVzZWQKLSAgIGluIGxpYnBuZyBhbmQgcG5nX2NhbGxvYygpIGlzIGFsd2F5cyBwcmVzZW50KQotICovCi0jZGVmaW5lIFBOR19DQUxMT0NfU1VQUE9SVEVECi0KLS8qIElmIHlvdSBhcmUgcnVubmluZyBvbiBhIG1hY2hpbmUgd2hlcmUgeW91IGNhbm5vdCBhbGxvY2F0ZSBtb3JlCi0gKiB0aGFuIDY0SyBvZiBtZW1vcnkgYXQgb25jZSwgdW5jb21tZW50IHRoaXMuICBXaGlsZSBsaWJwbmcgd2lsbCBub3QKLSAqIG5vcm1hbGx5IG5lZWQgdGhhdCBtdWNoIG1lbW9yeSBpbiBhIGNodW5rICh1bmxlc3MgeW91IGxvYWQgdXAgYSB2ZXJ5Ci0gKiBsYXJnZSBmaWxlKSwgemxpYiBuZWVkcyB0byBrbm93IGhvdyBiaWcgb2YgYSBjaHVuayBpdCBjYW4gdXNlLCBhbmQKLSAqIGxpYnBuZyB0aHVzIG1ha2VzIHN1cmUgdG8gY2hlY2sgYW55IG1lbW9yeSBhbGxvY2F0aW9uIHRvIHZlcmlmeSBpdAotICogd2lsbCBmaXQgaW50byBtZW1vcnkuCi0jZGVmaW5lIFBOR19NQVhfTUFMTE9DXzY0SwotICovCi0jaWYgZGVmaW5lZChNQVhTRUdfNjRLKSAmJiAhZGVmaW5lZChQTkdfTUFYX01BTExPQ182NEspCi0jICBkZWZpbmUgUE5HX01BWF9NQUxMT0NfNjRLCi0jZW5kaWYKLQotLyogU3BlY2lhbCBtdW5naW5nIHRvIHN1cHBvcnQgZG9pbmcgdGhpbmdzIHRoZSAnY3lnd2luJyB3YXk6Ci0gKiAnTm9ybWFsJyBwbmctb24td2luMzIgZGVmaW5lcy9kZWZhdWx0czoKLSAqICAgUE5HX0JVSUxEX0RMTCAtLSBidWlsZGluZyBkbGwKLSAqICAgUE5HX1VTRV9ETEwgICAtLSBidWlsZGluZyBhbiBhcHBsaWNhdGlvbiwgbGlua2luZyB0byBkbGwKLSAqICAgKG5vIGRlZmluZSkgICAtLSBidWlsZGluZyBzdGF0aWMgbGlicmFyeSwgb3IgYnVpbGRpbmcgYW4KLSAqICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBhbmQgbGlua2luZyB0byB0aGUgc3RhdGljIGxpYgotICogJ0N5Z3dpbicgZGVmaW5lcy9kZWZhdWx0czoKLSAqICAgUE5HX0JVSUxEX0RMTCAtLSAoaWdub3JlZCkgYnVpbGRpbmcgdGhlIGRsbAotICogICAobm8gZGVmaW5lKSAgIC0tIChpZ25vcmVkKSBidWlsZGluZyBhbiBhcHBsaWNhdGlvbiwgbGlua2luZyB0byB0aGUgZGxsCi0gKiAgIFBOR19TVEFUSUMgICAgLS0gKGlnbm9yZWQpIGJ1aWxkaW5nIHRoZSBzdGF0aWMgbGliLCBvciBidWlsZGluZyBhbgotICogICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHRoYXQgbGlua3MgdG8gdGhlIHN0YXRpYyBsaWIuCi0gKiAgIEFMTF9TVEFUSUMgICAgLS0gKGlnbm9yZWQpIGJ1aWxkaW5nIHZhcmlvdXMgc3RhdGljIGxpYnMsIG9yIGJ1aWxkaW5nIGFuCi0gKiAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gdGhhdCBsaW5rcyB0byB0aGUgc3RhdGljIGxpYnMuCi0gKiBUaHVzLAotICogYSBjeWd3aW4gdXNlciBzaG91bGQgZGVmaW5lIGVpdGhlciBQTkdfQlVJTERfRExMIG9yIFBOR19TVEFUSUMsIGFuZAotICogdGhpcyBiaXQgb2YgI2lmZGVmcyB3aWxsIGRlZmluZSB0aGUgJ2NvcnJlY3QnIGNvbmZpZyB2YXJpYWJsZXMgYmFzZWQgb24KLSAqIHRoYXQuIElmIGEgY3lnd2luIHVzZXIgKndhbnRzKiB0byBkZWZpbmUgJ1BOR19VU0VfRExMJyB0aGF0J3Mgb2theSwgYnV0Ci0gKiB1bm5lY2Vzc2FyeS4KLSAqCi0gKiBBbHNvLCB0aGUgcHJlY2VkZW5jZSBvcmRlciBpczoKLSAqICAgQUxMX1NUQVRJQyAoc2luY2Ugd2UgY2FuJ3QgI3VuZGVmIHNvbWV0aGluZyBvdXRzaWRlIG91ciBuYW1lc3BhY2UpCi0gKiAgIFBOR19CVUlMRF9ETEwKLSAqICAgUE5HX1NUQVRJQwotICogICAobm90aGluZykgPT0gUE5HX1VTRV9ETEwKLSAqCi0gKiBDWUdXSU4gKDIwMDItMDEtMjApOiBUaGUgcHJlY2VkaW5nIGlzIG5vdyBvYnNvbGV0ZS4gV2l0aCB0aGUgYWR2ZW50Ci0gKiAgIG9mIGF1dG8taW1wb3J0IGluIGJpbnV0aWxzLCB3ZSBubyBsb25nZXIgbmVlZCB0byB3b3JyeSBhYm91dAotICogICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgLyBfX2RlY2xzcGVjKGRsbGltcG9ydCkgYW5kIGZyaWVuZHMuICBUaGVyZWZvcmUsCi0gKiAgIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgUE5HX1NUQVRJQyBvciBBTExfU1RBVElDIHdoZW4gaXQgY29tZXMKLSAqICAgdG8gX19kZWNsc3BlYygpIHN0dWZmLiAgSG93ZXZlciwgd2UgRE8gbmVlZCB0byB3b3JyeSBhYm91dAotICogICBQTkdfQlVJTERfRExMIGFuZCBQTkdfU1RBVElDIGJlY2F1c2UgdGhvc2UgY2hhbmdlIHNvbWUgZGVmYXVsdHMKLSAqICAgc3VjaCBhcyBDT05TT0xFX0lPLgotICovCi0jaWZkZWYgX19DWUdXSU5fXwotIyAgaWZkZWYgQUxMX1NUQVRJQwotIyAgICBpZmRlZiBQTkdfQlVJTERfRExMCi0jICAgICAgdW5kZWYgUE5HX0JVSUxEX0RMTAotIyAgICBlbmRpZgotIyAgICBpZmRlZiBQTkdfVVNFX0RMTAotIyAgICAgIHVuZGVmIFBOR19VU0VfRExMCi0jICAgIGVuZGlmCi0jICAgIGlmZGVmIFBOR19ETEwKLSMgICAgICB1bmRlZiBQTkdfRExMCi0jICAgIGVuZGlmCi0jICAgIGlmbmRlZiBQTkdfU1RBVElDCi0jICAgICAgZGVmaW5lIFBOR19TVEFUSUMKLSMgICAgZW5kaWYKLSMgIGVsc2UKLSMgICAgaWZkZWYgUE5HX0JVSUxEX0RMTAotIyAgICAgIGlmZGVmIFBOR19TVEFUSUMKLSMgICAgICAgIHVuZGVmIFBOR19TVEFUSUMKLSMgICAgICBlbmRpZgotIyAgICAgIGlmZGVmIFBOR19VU0VfRExMCi0jICAgICAgICB1bmRlZiBQTkdfVVNFX0RMTAotIyAgICAgIGVuZGlmCi0jICAgICAgaWZuZGVmIFBOR19ETEwKLSMgICAgICAgIGRlZmluZSBQTkdfRExMCi0jICAgICAgZW5kaWYKLSMgICAgZWxzZQotIyAgICAgIGlmZGVmIFBOR19TVEFUSUMKLSMgICAgICAgIGlmZGVmIFBOR19VU0VfRExMCi0jICAgICAgICAgIHVuZGVmIFBOR19VU0VfRExMCi0jICAgICAgICBlbmRpZgotIyAgICAgICAgaWZkZWYgUE5HX0RMTAotIyAgICAgICAgICB1bmRlZiBQTkdfRExMCi0jICAgICAgICBlbmRpZgotIyAgICAgIGVsc2UKLSMgICAgICAgIGlmbmRlZiBQTkdfVVNFX0RMTAotIyAgICAgICAgICBkZWZpbmUgUE5HX1VTRV9ETEwKLSMgICAgICAgIGVuZGlmCi0jICAgICAgICBpZm5kZWYgUE5HX0RMTAotIyAgICAgICAgICBkZWZpbmUgUE5HX0RMTAotIyAgICAgICAgZW5kaWYKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBUaGlzIHByb3RlY3RzIHVzIGFnYWluc3QgY29tcGlsZXJzIHRoYXQgcnVuIG9uIGEgd2luZG93aW5nIHN5c3RlbQotICogYW5kIHRodXMgZG9uJ3QgaGF2ZSBvciB3b3VsZCByYXRoZXIgdXMgbm90IHVzZSB0aGUgc3RkaW8gdHlwZXM6Ci0gKiBzdGRpbiwgc3Rkb3V0LCBhbmQgc3RkZXJyLiAgVGhlIG9ubHkgb25lIGN1cnJlbnRseSB1c2VkIGlzIHN0ZGVycgotICogaW4gcG5nX2Vycm9yKCkgYW5kIHBuZ193YXJuaW5nKCkuICAjZGVmaW5pbmcgUE5HX05PX0NPTlNPTEVfSU8gd2lsbAotICogcHJldmVudCB0aGVzZSBmcm9tIGJlaW5nIGNvbXBpbGVkIGFuZCB1c2VkLiAjZGVmaW5pbmcgUE5HX05PX1NURElPCi0gKiB3aWxsIGFsc28gcHJldmVudCB0aGVzZSwgcGx1cyB3aWxsIHByZXZlbnQgdGhlIGVudGlyZSBzZXQgb2Ygc3RkaW8KLSAqIG1hY3JvcyBhbmQgZnVuY3Rpb25zIChGSUxFICosIHByaW50ZiwgZXRjLikgZnJvbSBiZWluZyBjb21waWxlZCBhbmQgdXNlZCwKLSAqIHVubGVzcyAoUE5HX0RFQlVHID4gMCkgaGFzIGJlZW4gI2RlZmluZWQuCi0gKgotICogI2RlZmluZSBQTkdfTk9fQ09OU09MRV9JTwotICogI2RlZmluZSBQTkdfTk9fU1RESU8KLSAqLwotCi0jaWZkZWYgX1dJTjMyX1dDRQotIyAgZGVmaW5lIFBOR19OT19DT05TT0xFX0lPCi0jICBkZWZpbmUgUE5HX05PX1NURElPCi0jICBkZWZpbmUgUE5HX05PX1RJTUVfUkZDMTEyMwotIyAgaWZkZWYgUE5HX0RFQlVHCi0jICAgIHVuZGVmIFBOR19ERUJVRwotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoUE5HX05PX1NURElPKSAmJiAhZGVmaW5lZChQTkdfU1RESU9fU1VQUE9SVEVEKQotIyAgZGVmaW5lIFBOR19TVERJT19TVVBQT1JURUQKLSNlbmRpZgotCi0jaWZkZWYgUE5HX0JVSUxEX0RMTAotIyAgaWYgIWRlZmluZWQoUE5HX0NPTlNPTEVfSU9fU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfTk9fQ09OU09MRV9JTykKLSMgICAgZGVmaW5lIFBOR19OT19DT05TT0xFX0lPCi0jICBlbmRpZgotI2VuZGlmCi0KLSMgIGlmZGVmIFBOR19OT19TVERJTwotIyAgICBpZm5kZWYgUE5HX05PX0NPTlNPTEVfSU8KLSMgICAgICBkZWZpbmUgUE5HX05PX0NPTlNPTEVfSU8KLSMgICAgZW5kaWYKLSMgICAgaWZkZWYgUE5HX0RFQlVHCi0jICAgICAgaWYgKFBOR19ERUJVRyA+IDApCi0jICAgICAgICBpbmNsdWRlIDxzdGRpby5oPgotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jICBlbHNlCi0jICAgIGluY2x1ZGUgPHN0ZGlvLmg+Ci0jICBlbmRpZgotCi0jaWYgIShkZWZpbmVkIFBOR19OT19DT05TT0xFX0lPKSAmJiAhZGVmaW5lZChQTkdfQ09OU09MRV9JT19TVVBQT1JURUQpCi0jICBkZWZpbmUgUE5HX0NPTlNPTEVfSU9fU1VQUE9SVEVECi0jZW5kaWYKLQotLyogVGhpcyBtYWNybyBwcm90ZWN0cyB1cyBhZ2FpbnN0IG1hY2hpbmVzIHRoYXQgZG9uJ3QgaGF2ZSBmdW5jdGlvbgotICogcHJvdG90eXBlcyAoaWUgSyZSIHN0eWxlIGhlYWRlcnMpLiAgSWYgeW91ciBjb21waWxlciBkb2VzIG5vdCBoYW5kbGUKLSAqIGZ1bmN0aW9uIHByb3RvdHlwZXMsIGRlZmluZSB0aGlzIG1hY3JvIGFuZCB1c2UgdGhlIGluY2x1ZGVkIGFuc2kya25yLgotICogSSd2ZSBhbHdheXMgYmVlbiBhYmxlIHRvIHVzZSBfTk9fUFJPVE8gYXMgdGhlIGluZGljYXRvciwgYnV0IHlvdSBtYXkKLSAqIG5lZWQgdG8gZHJhZyB0aGUgZW1wdHkgZGVjbGFyYXRpb24gb3V0IGluIGZyb250IG9mIGhlcmUsIG9yIGNoYW5nZSB0aGUKLSAqIGlmZGVmIHRvIHN1aXQgeW91ciBvd24gbmVlZHMuCi0gKi8KLSNpZm5kZWYgUE5HQVJHCi0KLSNpZmRlZiBPRiAvKiB6bGliIHByb3RvdHlwZSBtdW5nZXIgKi8KLSMgIGRlZmluZSBQTkdBUkcoYXJnbGlzdCkgT0YoYXJnbGlzdCkKLSNlbHNlCi0KLSNpZmRlZiBfTk9fUFJPVE8KLSMgIGRlZmluZSBQTkdBUkcoYXJnbGlzdCkgKCkKLSNlbHNlCi0jICBkZWZpbmUgUE5HQVJHKGFyZ2xpc3QpIGFyZ2xpc3QKLSNlbmRpZiAvKiBfTk9fUFJPVE8gKi8KLQotI2VuZGlmIC8qIE9GICovCi0KLSNlbmRpZiAvKiBQTkdBUkcgKi8KLQotLyogVHJ5IHRvIGRldGVybWluZSBpZiB3ZSBhcmUgY29tcGlsaW5nIG9uIGEgTWFjLiAgTm90ZSB0aGF0IHRlc3RpbmcgZm9yCi0gKiBqdXN0IF9fTVdFUktTX18gaXMgbm90IGdvb2QgZW5vdWdoLCBiZWNhdXNlIHRoZSBDb2Rld2FycmlvciBpcyBub3cgdXNlZAotICogb24gbm9uLU1hYyBwbGF0Zm9ybXMuCi0gKi8KLSNpZm5kZWYgTUFDT1MKLSMgIGlmIChkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQobWFjaW50b3NoKSkgfHwgZGVmaW5lZChhcHBsZWMpIHx8IFwKLSAgICAgIGRlZmluZWQoVEhJTktfQykgfHwgZGVmaW5lZChfX1NDX18pIHx8IGRlZmluZWQoVEFSR0VUX09TX01BQykKLSMgICAgZGVmaW5lIE1BQ09TCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIEVub3VnaCBwZW9wbGUgbmVlZCB0aGlzIGZvciB2YXJpb3VzIHJlYXNvbnMgdG8gaW5jbHVkZSBpdCBoZXJlICovCi0jaWYgIWRlZmluZWQoTUFDT1MpICYmICFkZWZpbmVkKFJJU0NPUykKLSMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0KLS8qIFBOR19TRVRKTVBfTk9UX1NVUFBPUlRFRCBhbmQgUE5HX05PX1NFVEpNUF9TVVBQT1JURUQgYXJlIGRlcHJlY2F0ZWQuICovCi0jaWYgIWRlZmluZWQoUE5HX05PX1NFVEpNUCkgJiYgXAotICAgICFkZWZpbmVkKFBOR19TRVRKTVBfTk9UX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX05PX1NFVEpNUF9TVVBQT1JURUQpCi0jICBkZWZpbmUgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLS8qIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBmb3JjZSBhIHNpbmdsZSBzZXRqbXAgYmVoYXZpb3VyIG9uIExpbnV4LiAgSWYKLSAqIHRoZSBYIGNvbmZpZyBzdHVmZiBkaWRuJ3QgZGVmaW5lIF9CU0RfU09VUkNFIHdlIHdvdWxkbid0IG5lZWQgdGhpcy4KLSAqCi0gKiBZb3UgY2FuIGJ5cGFzcyB0aGlzIHRlc3QgaWYgeW91IGtub3cgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIHVzZXMgZXhhY3RseQotICogdGhlIHNhbWUgc2V0am1wLmggdGhhdCB3YXMgaW5jbHVkZWQgd2hlbiBsaWJwbmcgd2FzIGJ1aWx0LiAgT25seSBkZWZpbmUKLSAqIFBOR19TS0lQX1NFVEpNUF9DSEVDSyB3aGlsZSBidWlsZGluZyB5b3VyIGFwcGxpY2F0aW9uLCBwcmlvciB0byB0aGUKLSAqIGFwcGxpY2F0aW9uJ3MgJyNpbmNsdWRlICJwbmcuaCInLiBEb24ndCBkZWZpbmUgUE5HX1NLSVBfU0VUSk1QX0NIRUNLCi0gKiB3aGlsZSBidWlsZGluZyBhIHNlcGFyYXRlIGxpYnBuZyBsaWJyYXJ5IGZvciBnZW5lcmFsIHVzZS4KLSAqLwotCi0jICBpZm5kZWYgUE5HX1NLSVBfU0VUSk1QX0NIRUNLCi0jICAgIGlmZGVmIF9fbGludXhfXwotIyAgICAgIGlmZGVmIF9CU0RfU09VUkNFCi0jICAgICAgICBkZWZpbmUgUE5HX1NBVkVfQlNEX1NPVVJDRQotIyAgICAgICAgdW5kZWYgX0JTRF9TT1VSQ0UKLSMgICAgICBlbmRpZgotIyAgICAgIGlmZGVmIF9TRVRKTVBfSAotICAgICAgIC8qIElmIHlvdSBlbmNvdW50ZXIgYSBjb21waWxlciBlcnJvciBoZXJlLCBzZWUgdGhlIGV4cGxhbmF0aW9uCi0gICAgICAgICogbmVhciB0aGUgZW5kIG9mIElOU1RBTEwuCi0gICAgICAgICovCi0gICAgICAgICAgIF9fcG5nY29uZi5oX18gaW4gbGlicG5nIGFscmVhZHkgaW5jbHVkZXMgc2V0am1wLmg7Ci0gICAgICAgICAgIF9fZG9udF9fIGluY2x1ZGUgaXQgYWdhaW4uOwotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmIC8qIF9fbGludXhfXyAqLwotIyAgZW5kaWYgLyogUE5HX1NLSVBfU0VUSk1QX0NIRUNLICovCi0KLSAgIC8qIEluY2x1ZGUgc2V0am1wLmggZm9yIGVycm9yIGhhbmRsaW5nICovCi0jICBpbmNsdWRlIDxzZXRqbXAuaD4KLQotIyAgaWZkZWYgX19saW51eF9fCi0jICAgIGlmZGVmIFBOR19TQVZFX0JTRF9TT1VSQ0UKLSMgICAgICBpZmRlZiBfQlNEX1NPVVJDRQotIyAgICAgICAgdW5kZWYgX0JTRF9TT1VSQ0UKLSMgICAgICBlbmRpZgotIyAgICAgIGRlZmluZSBfQlNEX1NPVVJDRQotIyAgICAgIHVuZGVmIFBOR19TQVZFX0JTRF9TT1VSQ0UKLSMgICAgZW5kaWYKLSMgIGVuZGlmIC8qIF9fbGludXhfXyAqLwotI2VuZGlmIC8qIFBOR19TRVRKTVBfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBCU0QKLSMgIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbHNlCi0jICBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi0vKiBPdGhlciBkZWZpbmVzIGZvciB0aGluZ3MgbGlrZSBtZW1vcnkgYW5kIHRoZSBsaWtlIGNhbiBnbyBoZXJlLiAgKi8KLQotLyogVGhpcyBjb250cm9scyBob3cgZmluZSB0aGUgcXVhbnRpemluZyBnZXRzLiAgQXMgdGhpcyBhbGxvY2F0ZXMKLSAqIGEgbGFyZ2lzaCBjaHVuayBvZiBtZW1vcnkgKDMySyksIHRob3NlIHdobyBhcmUgbm90IGFzIGNvbmNlcm5lZAotICogd2l0aCBxdWFudGl6aW5nIHF1YWxpdHkgY2FuIGRlY3JlYXNlIHNvbWUgb3IgYWxsIG9mIHRoZXNlLgotICovCi0KLS8qIFByaW9yIHRvIGxpYnBuZy0xLjQuMiwgdGhlc2Ugd2VyZSBQTkdfRElUSEVSXypfQklUUwotICogVGhlc2UgbWlncmF0aW9uIGFpZHMgd2lsbCBiZSByZW1vdmVkIGZyb20gbGlicG5nLTEuNS4wLgotICovCi0jaWZkZWYgUE5HX0RJVEhFUl9SRURfQklUUwotIyAgZGVmaW5lIFBOR19RVUFOVElaRV9SRURfQklUUyBQTkdfRElUSEVSX1JFRF9CSVRTCi0jZW5kaWYKLSNpZmRlZiBQTkdfRElUSEVSX0dSRUVOX0JJVFMKLSMgIGRlZmluZSBQTkdfUVVBTlRJWkVfR1JFRU5fQklUUyBQTkdfRElUSEVSX0dSRUVOX0JJVFMKLSNlbmRpZgotI2lmZGVmIFBOR19ESVRIRVJfQkxVRV9CSVRTCi0jICBkZWZpbmUgUE5HX1FVQU5USVpFX0JMVUVfQklUUyBQTkdfRElUSEVSX0JMVUVfQklUUwotI2VuZGlmCi0KLSNpZm5kZWYgUE5HX1FVQU5USVpFX1JFRF9CSVRTCi0jICBkZWZpbmUgUE5HX1FVQU5USVpFX1JFRF9CSVRTIDUKLSNlbmRpZgotI2lmbmRlZiBQTkdfUVVBTlRJWkVfR1JFRU5fQklUUwotIyAgZGVmaW5lIFBOR19RVUFOVElaRV9HUkVFTl9CSVRTIDUKLSNlbmRpZgotI2lmbmRlZiBQTkdfUVVBTlRJWkVfQkxVRV9CSVRTCi0jICBkZWZpbmUgUE5HX1FVQU5USVpFX0JMVUVfQklUUyA1Ci0jZW5kaWYKLQotLyogVGhpcyBjb250cm9scyBob3cgZmluZSB0aGUgZ2FtbWEgY29ycmVjdGlvbiBiZWNvbWVzIHdoZW4geW91Ci0gKiBhcmUgb25seSBpbnRlcmVzdGVkIGluIDggYml0cyBhbnl3YXkuICBJbmNyZWFzaW5nIHRoaXMgdmFsdWUKLSAqIHJlc3VsdHMgaW4gbW9yZSBtZW1vcnkgYmVpbmcgdXNlZCwgYW5kIG1vcmUgcG93KCkgZnVuY3Rpb25zCi0gKiBiZWluZyBjYWxsZWQgdG8gZmlsbCBpbiB0aGUgZ2FtbWEgdGFibGVzLiAgRG9uJ3Qgc2V0IHRoaXMgdmFsdWUKLSAqIGxlc3MgdGhlbiA4LCBhbmQgZXZlbiB0aGF0IG1heSBub3Qgd29yayAoSSBoYXZlbid0IHRlc3RlZCBpdCkuCi0gKi8KLQotI2lmbmRlZiBQTkdfTUFYX0dBTU1BXzgKLSMgIGRlZmluZSBQTkdfTUFYX0dBTU1BXzggMTEKLSNlbmRpZgotCi0vKiBUaGlzIGNvbnRyb2xzIGhvdyBtdWNoIGEgZGlmZmVyZW5jZSBpbiBnYW1tYSB3ZSBjYW4gdG9sZXJhdGUgYmVmb3JlCi0gKiB3ZSBhY3R1YWxseSBzdGFydCBkb2luZyBnYW1tYSBjb252ZXJzaW9uLgotICovCi0jaWZuZGVmIFBOR19HQU1NQV9USFJFU0hPTEQKLSMgIGRlZmluZSBQTkdfR0FNTUFfVEhSRVNIT0xEIDAuMDUKLSNlbmRpZgotCi0vKiBUaGUgZm9sbG93aW5nIHVzZXMgY29uc3QgY2hhciAqIGluc3RlYWQgb2YgY2hhciAqIGZvciBlcnJvcgotICogYW5kIHdhcm5pbmcgbWVzc2FnZSBmdW5jdGlvbnMsIHNvIHNvbWUgY29tcGlsZXJzIHdvbid0IGNvbXBsYWluLgotICogSWYgeW91IGRvIG5vdCB3YW50IHRvIHVzZSBjb25zdCwgZGVmaW5lIFBOR19OT19DT05TVC4KLSAqLwotCi0jaWZuZGVmIFBOR19DT05TVAotIyAgaWZuZGVmIFBOR19OT19DT05TVAotIyAgICBkZWZpbmUgUE5HX0NPTlNUIGNvbnN0Ci0jICBlbHNlCi0jICAgIGRlZmluZSBQTkdfQ09OU1QKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIGdpdmUgeW91IHRoZSBhYmlsaXR5IHRvIHJlbW92ZSBjb2RlIGZyb20gdGhlCi0gKiBsaWJyYXJ5IHRoYXQgeW91IHdpbGwgbm90IGJlIHVzaW5nLiAgSSB3aXNoIEkgY291bGQgZmlndXJlIG91dCBob3cgdG8KLSAqIGF1dG9tYXRlIHRoaXMsIGJ1dCBJIGNhbid0IGRvIHRoYXQgd2l0aG91dCBtYWtpbmcgaXQgc2VyaW91c2x5IGhhcmQKLSAqIG9uIHRoZSB1c2Vycy4gIFNvIGlmIHlvdSBhcmUgbm90IHVzaW5nIGFuIGFiaWxpdHksIGNoYW5nZSB0aGUgI2RlZmluZQotICogdG8gYW4gI3VuZGVmLCBvciBwYXNzIGluIFBOR19OT19mZWF0dXJlIGFuZCB0aGF0IHBhcnQgb2YgdGhlIGxpYnJhcnkKLSAqIHdpbGwgbm90IGJlIGNvbXBpbGVkLgotCi0gKiBJZiB5b3VyIGxpbmtlciBjYW4ndCBmaW5kIGEgZnVuY3Rpb24sIHlvdSBtYXkgd2FudCB0byBtYWtlIHN1cmUgdGhlCi0gKiBhYmlsaXR5IGlzIGRlZmluZWQgaGVyZS4gIFNvbWUgb2YgdGhlc2UgZGVwZW5kIHVwb24gc29tZSBvdGhlcnMgYmVpbmcKLSAqIGRlZmluZWQuICBJIGhhdmVuJ3QgZmlndXJlZCBvdXQgYWxsIHRoZSBpbnRlcmFjdGlvbnMgaGVyZSwgc28geW91IG1heQotICogaGF2ZSB0byBleHBlcmltZW50IGF3aGlsZSB0byBnZXQgZXZlcnl0aGluZyB0byBjb21waWxlLiAgSWYgeW91IGFyZQotICogY3JlYXRpbmcgb3IgdXNpbmcgYSBzaGFyZWQgbGlicmFyeSwgeW91IHByb2JhYmx5IHNob3VsZG4ndCB0b3VjaCB0aGlzLAotICogYXMgaXQgd2lsbCBhZmZlY3QgdGhlIHNpemUgb2YgdGhlIHN0cnVjdHVyZXMsIGFuZCB0aGlzIHdpbGwgY2F1c2UgYmFkCi0gKiB0aGluZ3MgdG8gaGFwcGVuIGlmIHRoZSBsaWJyYXJ5IGFuZC9vciBhcHBsaWNhdGlvbiBldmVyIGNoYW5nZS4KLSAqLwotCi0vKiBBbnkgZmVhdHVyZXMgeW91IHdpbGwgbm90IGJlIHVzaW5nIGNhbiBiZSB1bmRlZidlZCBoZXJlICovCi0KLS8qIEdSLVAsIDAuOTZhOiBTZXQgIipUUkFOU0ZPUk1TX1NVUFBPUlRFRCBhcyBkZWZhdWx0IGJ1dCBhbGxvdyB1c2VyCi0gKiB0byB0dXJuIGl0IG9mZiB3aXRoIFBOR19OT19SRUFEfFdSSVRFX1RSQU5TRk9STVMgb24gdGhlIGNvbXBpbGUgbGluZSwKLSAqIHRoZW4gcGljayBhbmQgY2hvb3NlIHdoaWNoIG9uZXMgdG8gZGVmaW5lIHdpdGhvdXQgaGF2aW5nIHRvIGVkaXQgdGhpcwotICogZmlsZS4gSXQgaXMgc2FmZSB0byB1c2UgdGhlIFBOR19OT19SRUFEfFdSSVRFX1RSQU5TRk9STVMKLSAqIGlmIHlvdSBvbmx5IHdhbnQgdG8gaGF2ZSBhIHBuZy1jb21wbGlhbnQgcmVhZGVyL3dyaXRlciBidXQgZG9uJ3QgbmVlZAotICogYW55IG9mIHRoZSBleHRyYSB0cmFuc2Zvcm1hdGlvbnMuICBUaGlzIHNhdmVzIGFib3V0IDgwIGtieXRlcyBpbiBhCi0gKiB0eXBpY2FsIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4gKFBOR19OT18qIGZvcm0gYWRkZWQgaW4gdmVyc2lvbgotICogMS4wLjFjLCBmb3IgY29uc2lzdGVuY3k7IFBOR18qX1RSQU5TRk9STVNfTk9UX1NVUFBPUlRFRCBkZXByZWNhdGVkIGluCi0gKiAxLjQuMCkKLSAqLwotCi0vKiBJZ25vcmUgYXR0ZW1wdCB0byB0dXJuIG9mZiBib3RoIGZsb2F0aW5nIGFuZCBmaXhlZCBwb2ludCBzdXBwb3J0ICovCi0jaWYgIWRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkgfHwgXAotICAgICFkZWZpbmVkKFBOR19OT19GSVhFRF9QT0lOVF9TVVBQT1JURUQpCi0jICBkZWZpbmUgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKLQotLyogUE5HX1JFQURfVFJBTlNGT1JNU19OT1RfU1VQUE9SVEVEIGlzIGRlcHJlY2F0ZWQuICovCi0jaWYgIWRlZmluZWQoUE5HX1JFQURfVFJBTlNGT1JNU19OT1RfU1VQUE9SVEVEKSAmJiBcCi0gICAgICAhZGVmaW5lZChQTkdfTk9fUkVBRF9UUkFOU0ZPUk1TKQotIyAgZGVmaW5lIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVECi0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVECi0jICBpZm5kZWYgUE5HX05PX1JFQURfRVhQQU5ECi0jICAgIGRlZmluZSBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19SRUFEX1NISUZUCi0jICAgIGRlZmluZSBQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1JFQURfUEFDSwotIyAgICBkZWZpbmUgUE5HX1JFQURfUEFDS19TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1JFQURfQkdSCi0jICAgIGRlZmluZSBQTkdfUkVBRF9CR1JfU1VQUE9SVEVECi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19SRUFEX1NXQVAKLSMgICAgZGVmaW5lIFBOR19SRUFEX1NXQVBfU1VQUE9SVEVECi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19SRUFEX1BBQ0tTV0FQCi0jICAgIGRlZmluZSBQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1JFQURfSU5WRVJUCi0jICAgIGRlZmluZSBQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVECi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19SRUFEX1FVQU5USVpFCi0gICAgIC8qIFByaW9yIHRvIGxpYnBuZy0xLjQuMCB0aGlzIHdhcyBQTkdfUkVBRF9ESVRIRVJfU1VQUE9SVEVEICovCi0jICAgIGlmbmRlZiBQTkdfTk9fUkVBRF9ESVRIRVIgIC8qIFRoaXMgbWlncmF0aW9uIGFpZCB3aWxsIGJlIHJlbW92ZWQgKi8KLSMgICAgICBkZWZpbmUgUE5HX1JFQURfUVVBTlRJWkVfU1VQUE9SVEVECi0jICAgIGVuZGlmCi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19SRUFEX0JBQ0tHUk9VTkQKLSMgICAgZGVmaW5lIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVECi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19SRUFEXzE2X1RPXzgKLSMgICAgZGVmaW5lIFBOR19SRUFEXzE2X1RPXzhfU1VQUE9SVEVECi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19SRUFEX0ZJTExFUgotIyAgICBkZWZpbmUgUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRAotIyAgZW5kaWYKLSMgIGlmbmRlZiBQTkdfTk9fUkVBRF9HQU1NQQotIyAgICBkZWZpbmUgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19SRUFEX0dSQVlfVE9fUkdCCi0jICAgIGRlZmluZSBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1JFQURfU1dBUF9BTFBIQQotIyAgICBkZWZpbmUgUE5HX1JFQURfU1dBUF9BTFBIQV9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1JFQURfSU5WRVJUX0FMUEhBCi0jICAgIGRlZmluZSBQTkdfUkVBRF9JTlZFUlRfQUxQSEFfU1VQUE9SVEVECi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19SRUFEX1NUUklQX0FMUEhBCi0jICAgIGRlZmluZSBQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1JFQURfVVNFUl9UUkFOU0ZPUk0KLSMgICAgZGVmaW5lIFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAotIyAgZW5kaWYKLSMgIGlmbmRlZiBQTkdfTk9fUkVBRF9SR0JfVE9fR1JBWQotIyAgICBkZWZpbmUgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmIC8qIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVEICovCi0KLS8qIFBOR19QUk9HUkVTU0lWRV9SRUFEX05PVF9TVVBQT1JURUQgaXMgZGVwcmVjYXRlZC4gKi8KLSNpZiAhZGVmaW5lZChQTkdfTk9fUFJPR1JFU1NJVkVfUkVBRCkgJiYgXAotICFkZWZpbmVkKFBOR19QUk9HUkVTU0lWRV9SRUFEX05PVF9TVVBQT1JURUQpICAvKiBpZiB5b3UgZG9uJ3QgZG8gcHJvZ3Jlc3NpdmUgKi8KLSMgIGRlZmluZSBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQgICAgIC8qIHJlYWRpbmcuICBUaGlzIGlzIG5vdCB0YWxraW5nICovCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWJvdXQgaW50ZXJsYWNpbmcgY2FwYWJpbGl0eSEgIFlvdSdsbCAqLwotICAgICAgICAgICAgLyogc3RpbGwgaGF2ZSBpbnRlcmxhY2luZyB1bmxlc3MgeW91IGNoYW5nZSB0aGUgZm9sbG93aW5nIGRlZmluZTogKi8KLQotI2RlZmluZSBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQgLyogcmVxdWlyZWQgZm9yIFBORy1jb21wbGlhbnQgZGVjb2RlcnMgKi8KLQotLyogUE5HX05PX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQgaXMgZGVwcmVjYXRlZC4gKi8KLSNpZiAhZGVmaW5lZChQTkdfTk9fU0VRVUVOVElBTF9SRUFEKSAmJiBcCi0gICAgIWRlZmluZWQoUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQpICYmIFwKLSAgICAhZGVmaW5lZChQTkdfTk9fU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCkKLSMgIGRlZmluZSBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAotI2VuZGlmCi0KLSNpZm5kZWYgUE5HX05PX1JFQURfQ09NUE9TSVRFX05PRElWCi0jICBpZm5kZWYgUE5HX05PX1JFQURfQ09NUE9TSVRFRF9OT0RJViAgLyogbGlicG5nLTEuMC54IG1pc3NwZWxsaW5nICovCi0jICAgIGRlZmluZSBQTkdfUkVBRF9DT01QT1NJVEVfTk9ESVZfU1VQUE9SVEVEICAgLyogd2VsbCB0ZXN0ZWQgb24gSW50ZWwsIFNHSSAqLwotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoUE5HX05PX0dFVF9JTlRfMzIpIHx8IGRlZmluZWQoUE5HX1JFQURfb0ZGU19TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19SRUFEX3BDQUxfU1VQUE9SVEVEKQotIyAgaWZuZGVmIFBOR19HRVRfSU5UXzMyX1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX0dFVF9JTlRfMzJfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0KLSNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKLQotLyogUE5HX1dSSVRFX1RSQU5TRk9STVNfTk9UX1NVUFBPUlRFRCBpcyBkZXByZWNhdGVkLiAqLwotI2lmICFkZWZpbmVkKFBOR19XUklURV9UUkFOU0ZPUk1TX05PVF9TVVBQT1JURUQpICYmIFwKLSAgICAhZGVmaW5lZChQTkdfTk9fV1JJVEVfVFJBTlNGT1JNUykKLSMgIGRlZmluZSBQTkdfV1JJVEVfVFJBTlNGT1JNU19TVVBQT1JURUQKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX1RSQU5TRk9STVNfU1VQUE9SVEVECi0jICBpZm5kZWYgUE5HX05PX1dSSVRFX1NISUZUCi0jICAgIGRlZmluZSBQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVECi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19XUklURV9QQUNLCi0jICAgIGRlZmluZSBQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1dSSVRFX0JHUgotIyAgICBkZWZpbmUgUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1dSSVRFX1NXQVAKLSMgICAgZGVmaW5lIFBOR19XUklURV9TV0FQX1NVUFBPUlRFRAotIyAgZW5kaWYKLSMgIGlmbmRlZiBQTkdfTk9fV1JJVEVfUEFDS1NXQVAKLSMgICAgZGVmaW5lIFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1dSSVRFX0lOVkVSVAotIyAgICBkZWZpbmUgUE5HX1dSSVRFX0lOVkVSVF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1dSSVRFX0ZJTExFUgotIyAgICBkZWZpbmUgUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQgICAvKiBzYW1lIGFzIFdSSVRFX1NUUklQX0FMUEhBICovCi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19XUklURV9TV0FQX0FMUEhBCi0jICAgIGRlZmluZSBQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1dSSVRFX0lOVkVSVF9BTFBIQQotIyAgICBkZWZpbmUgUE5HX1dSSVRFX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1dSSVRFX1VTRVJfVFJBTlNGT1JNCi0jICAgIGRlZmluZSBQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmIC8qIFBOR19XUklURV9UUkFOU0ZPUk1TX1NVUFBPUlRFRCAqLwotCi0jaWYgIWRlZmluZWQoUE5HX05PX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCkgJiYgXAotICAgICFkZWZpbmVkKFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQpCi0gICAgLyogVGhpcyBpcyBub3QgcmVxdWlyZWQgZm9yIFBORy1jb21wbGlhbnQgZW5jb2RlcnMsIGJ1dCBjYW4gY2F1c2UKLSAgICAgKiB0cm91YmxlIGlmIGxlZnQgdW5kZWZpbmVkCi0gICAgKi8KLSMgIGRlZmluZSBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVECi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFBOR19OT19XUklURV9XRUlHSFRFRF9GSUxURVIpICYmIFwKLSAgICAhZGVmaW5lZChQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSKSAmJiBcCi0gICAgIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkKLSMgIGRlZmluZSBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRAotI2VuZGlmCi0KLSNpZm5kZWYgUE5HX05PX1dSSVRFX0ZMVVNICi0jICBkZWZpbmUgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRAotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChQTkdfTk9fU0FWRV9JTlRfMzIpIHx8IGRlZmluZWQoUE5HX1dSSVRFX29GRlNfU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfV1JJVEVfcENBTF9TVVBQT1JURUQpCi0jICBpZm5kZWYgUE5HX1NBVkVfSU5UXzMyX1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX1NBVkVfSU5UXzMyX1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotCi0jZW5kaWYgLyogUE5HX1dSSVRFX1NVUFBPUlRFRCAqLwotCi0jZGVmaW5lIFBOR19OT19FUlJPUl9OVU1CRVJTCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkgfHwgXAotICAgIGRlZmluZWQoUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkKLSMgIGlmbmRlZiBQTkdfTk9fVVNFUl9UUkFOU0ZPUk1fUFRSCi0jICAgIGRlZmluZSBQTkdfVVNFUl9UUkFOU0ZPUk1fUFRSX1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfU1RESU9fU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRCkKLSMgIGRlZmluZSBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRAotI2VuZGlmCi0KLS8qIFRoaXMgYWRkcyBleHRyYSBmdW5jdGlvbnMgaW4gcG5nZ2V0LmMgZm9yIGFjY2Vzc2luZyBkYXRhIGZyb20gdGhlCi0gKiBpbmZvIHBvaW50ZXIgKGFkZGVkIGluIHZlcnNpb24gMC45OSkKLSAqIHBuZ19nZXRfaW1hZ2Vfd2lkdGgoKQotICogcG5nX2dldF9pbWFnZV9oZWlnaHQoKQotICogcG5nX2dldF9iaXRfZGVwdGgoKQotICogcG5nX2dldF9jb2xvcl90eXBlKCkKLSAqIHBuZ19nZXRfY29tcHJlc3Npb25fdHlwZSgpCi0gKiBwbmdfZ2V0X2ZpbHRlcl90eXBlKCkKLSAqIHBuZ19nZXRfaW50ZXJsYWNlX3R5cGUoKQotICogcG5nX2dldF9waXhlbF9hc3BlY3RfcmF0aW8oKQotICogcG5nX2dldF9waXhlbHNfcGVyX21ldGVyKCkKLSAqIHBuZ19nZXRfeF9vZmZzZXRfcGl4ZWxzKCkKLSAqIHBuZ19nZXRfeV9vZmZzZXRfcGl4ZWxzKCkKLSAqIHBuZ19nZXRfeF9vZmZzZXRfbWljcm9ucygpCi0gKiBwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMoKQotICovCi0jaWYgIWRlZmluZWQoUE5HX05PX0VBU1lfQUNDRVNTKSAmJiAhZGVmaW5lZChQTkdfRUFTWV9BQ0NFU1NfU1VQUE9SVEVEKQotIyAgZGVmaW5lIFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQKLSNlbmRpZgotCi0vKiBBZGRlZCBhdCBsaWJwbmctMS4yLjAgKi8KLSNpZiAhZGVmaW5lZChQTkdfTk9fVVNFUl9NRU0pICYmICFkZWZpbmVkKFBOR19VU0VSX01FTV9TVVBQT1JURUQpCi0jICBkZWZpbmUgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotI2VuZGlmCi0KLS8qIEFkZGVkIGF0IGxpYnBuZy0xLjIuNiAqLwotI2lmbmRlZiBQTkdfTk9fU0VUX1VTRVJfTElNSVRTCi0jICBpZm5kZWYgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECi0jICBlbmRpZgotICAvKiBGZWF0dXJlIGFkZGVkIGF0IGxpYnBuZy0xLjQuMCwgdGhpcyBmbGFnIGFkZGVkIGF0IDEuNC4xICovCi0jICBpZm5kZWYgUE5HX1NFVF9DSFVOS19DQUNIRV9MSU1JVF9TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19TRVRfQ0hVTktfQ0FDSEVfTElNSVRfU1VQUE9SVEVECi0jICBlbmRpZgotICAvKiBGZWF0dXJlIGFkZGVkIGF0IGxpYnBuZy0xLjQuMSwgdGhpcyBmbGFnIGFkZGVkIGF0IDEuNC4xICovCi0jICBpZm5kZWYgUE5HX1NFVF9DSFVOS19NQUxMT0NfTElNSVRfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfU0VUX0NIVU5LX01BTExPQ19MSU1JVF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogQWRkZWQgYXQgbGlicG5nLTEuMi40MyAqLwotI2lmbmRlZiBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVECi0jICBpZm5kZWYgUE5HX05PX1VTRVJfTElNSVRTCi0jICAgIGRlZmluZSBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIEFkZGVkIGF0IGxpYnBuZy0xLjAuMTYgYW5kIDEuMi42LiAgVG8gYWNjZXB0IGFsbCB2YWxpZCBQTkdzIG5vIG1hdHRlcgotICogaG93IGxhcmdlLCBzZXQgdGhlc2UgdHdvIGxpbWl0cyB0byAweDdmZmZmZmZmTAotICovCi0jaWZuZGVmIFBOR19VU0VSX1dJRFRIX01BWAotIyAgZGVmaW5lIFBOR19VU0VSX1dJRFRIX01BWCAxMDAwMDAwTAotI2VuZGlmCi0jaWZuZGVmIFBOR19VU0VSX0hFSUdIVF9NQVgKLSMgIGRlZmluZSBQTkdfVVNFUl9IRUlHSFRfTUFYIDEwMDAwMDBMCi0jZW5kaWYKLQotLyogQWRkZWQgYXQgbGlicG5nLTEuMi40My4gIFRvIGFjY2VwdCBhbGwgdmFsaWQgUE5HcyBubyBtYXR0ZXIKLSAqIGhvdyBsYXJnZSwgc2V0IHRoZXNlIHR3byBsaW1pdHMgdG8gMC4KLSAqLwotI2lmbmRlZiBQTkdfVVNFUl9DSFVOS19DQUNIRV9NQVgKLSMgIGRlZmluZSBQTkdfVVNFUl9DSFVOS19DQUNIRV9NQVggMAotI2VuZGlmCi0KLS8qIEFkZGVkIGF0IGxpYnBuZy0xLjIuNDMgKi8KLSNpZm5kZWYgUE5HX1VTRVJfQ0hVTktfTUFMTE9DX01BWAotIyAgZGVmaW5lIFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVggMAotI2VuZGlmCi0KLS8qIEFkZGVkIGF0IGxpYnBuZy0xLjQuMCAqLwotI2lmICFkZWZpbmVkKFBOR19OT19JT19TVEFURSkgJiYgIWRlZmluZWQoUE5HX0lPX1NUQVRFX1NVUFBPUlRFRCkKLSMgIGRlZmluZSBQTkdfSU9fU1RBVEVfU1VQUE9SVEVECi0jZW5kaWYKLQotI2lmbmRlZiBQTkdfTElURVJBTF9TSEFSUAotIyAgZGVmaW5lIFBOR19MSVRFUkFMX1NIQVJQIDB4MjMKLSNlbmRpZgotI2lmbmRlZiBQTkdfTElURVJBTF9MRUZUX1NRVUFSRV9CUkFDS0VUCi0jICBkZWZpbmUgUE5HX0xJVEVSQUxfTEVGVF9TUVVBUkVfQlJBQ0tFVCAweDViCi0jZW5kaWYKLSNpZm5kZWYgUE5HX0xJVEVSQUxfUklHSFRfU1FVQVJFX0JSQUNLRVQKLSMgIGRlZmluZSBQTkdfTElURVJBTF9SSUdIVF9TUVVBUkVfQlJBQ0tFVCAweDVkCi0jZW5kaWYKLSNpZm5kZWYgUE5HX1NUUklOR19ORVdMSU5FCi0jZGVmaW5lIFBOR19TVFJJTkdfTkVXTElORSAiXG4iCi0jZW5kaWYKLQotLyogVGhlc2UgYXJlIGN1cnJlbnRseSBleHBlcmltZW50YWwgZmVhdHVyZXMsIGRlZmluZSB0aGVtIGlmIHlvdSB3YW50ICovCi0KLS8qIFZlcnkgbGl0dGxlIHRlc3RpbmcgKi8KLS8qCi0jaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECi0jICBpZm5kZWYgUE5HX1JFQURfMTZfVE9fOF9BQ0NVUkFURV9TQ0FMRV9TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19SRUFEXzE2X1RPXzhfQUNDVVJBVEVfU0NBTEVfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0qLwotCi0vKiBUaGlzIGlzIG9ubHkgZm9yIFBvd2VyUEMgYmlnLWVuZGlhbiBhbmQgNjgweDAgc3lzdGVtcyAqLwotLyogc29tZSB0ZXN0aW5nICovCi0vKgotI2lmbmRlZiBQTkdfUkVBRF9CSUdfRU5ESUFOX1NVUFBPUlRFRAotIyAgZGVmaW5lIFBOR19SRUFEX0JJR19FTkRJQU5fU1VQUE9SVEVECi0jZW5kaWYKLSovCi0KLSNpZiAhZGVmaW5lZChQTkdfTk9fVVNFX1JFQURfTUFDUk9TKSAmJiAhZGVmaW5lZChQTkdfVVNFX1JFQURfTUFDUk9TKQotIyAgZGVmaW5lIFBOR19VU0VfUkVBRF9NQUNST1MKLSNlbmRpZgotCi0vKiBCdWdneSBjb21waWxlcnMgKGUuZy4sIGdjYyAyLjcuMi4yKSBuZWVkIFBOR19OT19QT0lOVEVSX0lOREVYSU5HICovCi0KLSNpZiAhZGVmaW5lZChQTkdfTk9fUE9JTlRFUl9JTkRFWElORykgJiYgXAotICAgICFkZWZpbmVkKFBOR19QT0lOVEVSX0lOREVYSU5HX1NVUFBPUlRFRCkKLSMgIGRlZmluZSBQTkdfUE9JTlRFUl9JTkRFWElOR19TVVBQT1JURUQKLSNlbmRpZgotCi0KLS8qIEFueSBjaHVua3MgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbiwgeW91IGNhbiB1bmRlZiBoZXJlLiAgVGhlCi0gKiBvbmVzIHRoYXQgYWxsb2NhdGUgbWVtb3J5IG1heSBiZSBleHBlY2lhbGx5IGltcG9ydGFudCAoaElTVCwKLSAqIHRFWHQsIHpUWHQsIHRSTlMsIHBDQUwpLiAgT3RoZXJzIHdpbGwganVzdCBzYXZlIHRpbWUgYW5kIG1ha2UgcG5nX2luZm8KLSAqIGEgYml0IHNtYWxsZXIuCi0gKi8KLQotLyogVGhlIHNpemUgb2YgdGhlIHBuZ190ZXh0IHN0cnVjdHVyZSBjaGFuZ2VkIGluIGxpYnBuZy0xLjAuNiB3aGVuCi0gKiBpVFh0IHN1cHBvcnQgd2FzIGFkZGVkLiAgaVRYdCBzdXBwb3J0IHdhcyB0dXJuZWQgb2ZmIGJ5IGRlZmF1bHQgdGhyb3VnaAotICogbGlicG5nLTEuMi54LCB0byBzdXBwb3J0IG9sZCBhcHBzIHRoYXQgbWFsbG9jIHRoZSBwbmdfdGV4dCBzdHJ1Y3R1cmUKLSAqIGluc3RlYWQgb2YgY2FsbGluZyBwbmdfc2V0X3RleHQoKSBhbmQgbGV0dGluZyBsaWJwbmcgbWFsbG9jIGl0LiAgSXQKLSAqIHdhcyB0dXJuZWQgb24gYnkgZGVmYXVsdCBpbiBsaWJwbmctMS40LjAuCi0gKi8KLQotLyogUE5HX1JFQURfQU5DSUxMQVJZX0NIVU5LU19OT1RfU1VQUE9SVEVEIGlzIGRlcHJlY2F0ZWQuICovCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpICYmIFwKLSAgICAhZGVmaW5lZChQTkdfUkVBRF9BTkNJTExBUllfQ0hVTktTX05PVF9TVVBQT1JURUQpICYmIFwKLSAgICAhZGVmaW5lZChQTkdfTk9fUkVBRF9BTkNJTExBUllfQ0hVTktTKQotIyAgZGVmaW5lIFBOR19SRUFEX0FOQ0lMTEFSWV9DSFVOS1NfU1VQUE9SVEVECi0jZW5kaWYKLQotLyogUE5HX1dSSVRFX0FOQ0lMTEFSWV9DSFVOS1NfTk9UX1NVUFBPUlRFRCBpcyBkZXByZWNhdGVkLiAqLwotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkgJiYgXAotICAgICFkZWZpbmVkKFBOR19XUklURV9BTkNJTExBUllfQ0hVTktTX05PVF9TVVBQT1JURUQpICYmIFwKLSAgICAhZGVmaW5lZChQTkdfTk9fV1JJVEVfQU5DSUxMQVJZX0NIVU5LUykKLSMgIGRlZmluZSBQTkdfV1JJVEVfQU5DSUxMQVJZX0NIVU5LU19TVVBQT1JURUQKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfQU5DSUxMQVJZX0NIVU5LU19TVVBQT1JURUQKLQotI2lmZGVmIFBOR19OT19SRUFEX1RFWFQKLSMgIGRlZmluZSBQTkdfTk9fUkVBRF9pVFh0Ci0jICBkZWZpbmUgUE5HX05PX1JFQURfdEVYdAotIyAgZGVmaW5lIFBOR19OT19SRUFEX3pUWHQKLSNlbmRpZgotCi0jaWZuZGVmIFBOR19OT19SRUFEX2JLR0QKLSMgIGRlZmluZSBQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRAotIyAgZGVmaW5lIFBOR19iS0dEX1NVUFBPUlRFRAotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19SRUFEX2NIUk0KLSMgIGRlZmluZSBQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRAotIyAgZGVmaW5lIFBOR19jSFJNX1NVUFBPUlRFRAotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19SRUFEX2dBTUEKLSMgIGRlZmluZSBQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRAotIyAgZGVmaW5lIFBOR19nQU1BX1NVUFBPUlRFRAotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19SRUFEX2hJU1QKLSMgIGRlZmluZSBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRAotIyAgZGVmaW5lIFBOR19oSVNUX1NVUFBPUlRFRAotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19SRUFEX2lDQ1AKLSMgIGRlZmluZSBQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRAotIyAgZGVmaW5lIFBOR19pQ0NQX1NVUFBPUlRFRAotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19SRUFEX2lUWHQKLSMgIGlmbmRlZiBQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX2lUWHRfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfaVRYdF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfb0ZGcwotIyAgZGVmaW5lIFBOR19SRUFEX29GRnNfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX29GRnNfU1VQUE9SVEVECi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfcENBTAotIyAgZGVmaW5lIFBOR19SRUFEX3BDQUxfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX3BDQUxfU1VQUE9SVEVECi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfc0NBTAotIyAgZGVmaW5lIFBOR19SRUFEX3NDQUxfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX3NDQUxfU1VQUE9SVEVECi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfcEhZcwotIyAgZGVmaW5lIFBOR19SRUFEX3BIWXNfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX3BIWXNfU1VQUE9SVEVECi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfc0JJVAotIyAgZGVmaW5lIFBOR19SRUFEX3NCSVRfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX3NCSVRfU1VQUE9SVEVECi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfc1BMVAotIyAgZGVmaW5lIFBOR19SRUFEX3NQTFRfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX3NQTFRfU1VQUE9SVEVECi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfc1JHQgotIyAgZGVmaW5lIFBOR19SRUFEX3NSR0JfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX3NSR0JfU1VQUE9SVEVECi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfdEVYdAotIyAgZGVmaW5lIFBOR19SRUFEX3RFWHRfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX3RFWHRfU1VQUE9SVEVECi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfdElNRQotIyAgZGVmaW5lIFBOR19SRUFEX3RJTUVfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX3RJTUVfU1VQUE9SVEVECi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfdFJOUwotIyAgZGVmaW5lIFBOR19SRUFEX3RSTlNfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX3RSTlNfU1VQUE9SVEVECi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfelRYdAotIyAgZGVmaW5lIFBOR19SRUFEX3pUWHRfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX3pUWHRfU1VQUE9SVEVECi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfT1BUX1BMVEUKLSMgIGRlZmluZSBQTkdfUkVBRF9PUFRfUExURV9TVVBQT1JURUQgLyogb25seSBhZmZlY3RzIHN1cHBvcnQgb2YgdGhlICovCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgLyogb3B0aW9uYWwgUExURSBjaHVuayBpbiBSR0IgYW5kIFJHQkEgaW1hZ2VzICovCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF90RVh0X1NVUFBPUlRFRCkgfHwgXAotICAgIGRlZmluZWQoUE5HX1JFQURfelRYdF9TVVBQT1JURUQpCi0jICBkZWZpbmUgUE5HX1JFQURfVEVYVF9TVVBQT1JURUQKLSMgIGRlZmluZSBQTkdfVEVYVF9TVVBQT1JURUQKLSNlbmRpZgotCi0jZW5kaWYgLyogUE5HX1JFQURfQU5DSUxMQVJZX0NIVU5LU19TVVBQT1JURUQgKi8KLQotI2lmbmRlZiBQTkdfTk9fUkVBRF9VTktOT1dOX0NIVU5LUwotIyAgaWZuZGVmIFBOR19SRUFEX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX1JFQURfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfVVNFUl9DSFVOS1MKLSMgIGlmbmRlZiBQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19SRUFEX1VTRVJfQ0hVTktTX1NVUFBPUlRFRAotIyAgZW5kaWYKLSMgIGlmbmRlZiBQTkdfVVNFUl9DSFVOS1NfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfVVNFUl9DSFVOS1NfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19IQU5ETEVfQVNfVU5LTk9XTgotIyAgaWZuZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKLSNpZmRlZiBQTkdfV1JJVEVfQU5DSUxMQVJZX0NIVU5LU19TVVBQT1JURUQKLQotI2lmZGVmIFBOR19OT19XUklURV9URVhUCi0jICBkZWZpbmUgUE5HX05PX1dSSVRFX2lUWHQKLSMgIGRlZmluZSBQTkdfTk9fV1JJVEVfdEVYdAotIyAgZGVmaW5lIFBOR19OT19XUklURV96VFh0Ci0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1dSSVRFX2JLR0QKLSMgIGRlZmluZSBQTkdfV1JJVEVfYktHRF9TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfYktHRF9TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19iS0dEX1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fV1JJVEVfY0hSTQotIyAgZGVmaW5lIFBOR19XUklURV9jSFJNX1NVUFBPUlRFRAotIyAgaWZuZGVmIFBOR19jSFJNX1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX2NIUk1fU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19XUklURV9nQU1BCi0jICBkZWZpbmUgUE5HX1dSSVRFX2dBTUFfU1VQUE9SVEVECi0jICBpZm5kZWYgUE5HX2dBTUFfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfZ0FNQV9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1dSSVRFX2hJU1QKLSMgIGRlZmluZSBQTkdfV1JJVEVfaElTVF9TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfaElTVF9TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19oSVNUX1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fV1JJVEVfaUNDUAotIyAgZGVmaW5lIFBOR19XUklURV9pQ0NQX1NVUFBPUlRFRAotIyAgaWZuZGVmIFBOR19pQ0NQX1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX2lDQ1BfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19XUklURV9pVFh0Ci0jICBpZm5kZWYgUE5HX1dSSVRFX2lUWHRfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX2lUWHRfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfaVRYdF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1dSSVRFX29GRnMKLSMgIGRlZmluZSBQTkdfV1JJVEVfb0ZGc19TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfb0ZGc19TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19vRkZzX1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fV1JJVEVfcENBTAotIyAgZGVmaW5lIFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRAotIyAgaWZuZGVmIFBOR19wQ0FMX1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX3BDQUxfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19XUklURV9zQ0FMCi0jICBkZWZpbmUgUE5HX1dSSVRFX3NDQUxfU1VQUE9SVEVECi0jICBpZm5kZWYgUE5HX3NDQUxfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfc0NBTF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1dSSVRFX3BIWXMKLSMgIGRlZmluZSBQTkdfV1JJVEVfcEhZc19TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfcEhZc19TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19wSFlzX1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fV1JJVEVfc0JJVAotIyAgZGVmaW5lIFBOR19XUklURV9zQklUX1NVUFBPUlRFRAotIyAgaWZuZGVmIFBOR19zQklUX1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX3NCSVRfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19XUklURV9zUExUCi0jICBkZWZpbmUgUE5HX1dSSVRFX3NQTFRfU1VQUE9SVEVECi0jICBpZm5kZWYgUE5HX3NQTFRfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfc1BMVF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1dSSVRFX3NSR0IKLSMgIGRlZmluZSBQTkdfV1JJVEVfc1JHQl9TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfc1JHQl9TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19zUkdCX1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fV1JJVEVfdEVYdAotIyAgZGVmaW5lIFBOR19XUklURV90RVh0X1NVUFBPUlRFRAotIyAgaWZuZGVmIFBOR190RVh0X1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX3RFWHRfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19XUklURV90SU1FCi0jICBkZWZpbmUgUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVECi0jICBpZm5kZWYgUE5HX3RJTUVfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfdElNRV9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1dSSVRFX3RSTlMKLSMgIGRlZmluZSBQTkdfV1JJVEVfdFJOU19TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfdFJOU19TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR190Uk5TX1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fV1JJVEVfelRYdAotIyAgZGVmaW5lIFBOR19XUklURV96VFh0X1NVUFBPUlRFRAotIyAgaWZuZGVmIFBOR196VFh0X1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX3pUWHRfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX3RFWHRfU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfV1JJVEVfelRYdF9TVVBQT1JURUQpCi0jICBkZWZpbmUgUE5HX1dSSVRFX1RFWFRfU1VQUE9SVEVECi0jICBpZm5kZWYgUE5HX1RFWFRfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfVEVYVF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV90SU1FX1NVUFBPUlRFRAotIyAgaWZuZGVmIFBOR19OT19DT05WRVJUX3RJTUUKLSMgICAgaWZuZGVmIF9XSU4zMl9XQ0UKLS8qICAgVGhlICJ0bSIgc3RydWN0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93c0NFICovCi0jICAgICAgaWZuZGVmIFBOR19DT05WRVJUX3RJTUVfU1VQUE9SVEVECi0jICAgICAgICBkZWZpbmUgUE5HX0NPTlZFUlRfdElNRV9TVVBQT1JURUQKLSMgICAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNlbmRpZiAvKiBQTkdfV1JJVEVfQU5DSUxMQVJZX0NIVU5LU19TVVBQT1JURUQgKi8KLQotI2lmbmRlZiBQTkdfTk9fV1JJVEVfRklMVEVSCi0jICBpZm5kZWYgUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgUE5HX05PX1dSSVRFX1VOS05PV05fQ0hVTktTCi0jICBkZWZpbmUgUE5HX1dSSVRFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAotIyAgaWZuZGVmIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX0hBTkRMRV9BU19VTktOT1dOCi0jICBpZm5kZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotI2VuZGlmIC8qIFBOR19XUklURV9TVVBQT1JURUQgKi8KLQotLyogVHVybiB0aGlzIG9mZiB0byBkaXNhYmxlIHBuZ19yZWFkX3BuZygpIGFuZAotICogcG5nX3dyaXRlX3BuZygpIGFuZCBsZWF2ZSB0aGUgcm93X3BvaW50ZXJzIG1lbWJlcgotICogb3V0IG9mIHRoZSBpbmZvIHN0cnVjdHVyZS4KLSAqLwotI2lmbmRlZiBQTkdfTk9fSU5GT19JTUFHRQotIyAgZGVmaW5lIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRAotI2VuZGlmCi0KLS8qIE5lZWQgdGhlIHRpbWUgaW5mb3JtYXRpb24gZm9yIGNvbnZlcnRpbmcgdElNRSBjaHVua3MgKi8KLSNpZmRlZiBQTkdfQ09OVkVSVF90SU1FX1NVUFBPUlRFRAotICAgICAvKiAidGltZS5oIiBmdW5jdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93c0NFICovCi0jICAgIGluY2x1ZGUgPHRpbWUuaD4KLSNlbmRpZgotCi0vKiBTb21lIHR5cGVkZWZzIHRvIGdldCB1cyBzdGFydGVkLiAgVGhlc2Ugc2hvdWxkIGJlIHNhZmUgb24gbW9zdCBvZiB0aGUKLSAqIGNvbW1vbiBwbGF0Zm9ybXMuICBUaGUgdHlwZWRlZnMgc2hvdWxkIGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZQotICogbnVtYmVycyBzdWdnZXN0IChhIHBuZ191aW50XzMyIG11c3QgYmUgYXQgbGVhc3QgMzIgYml0cyBsb25nKSwgYnV0IHRoZXkKLSAqIGRvbid0IGhhdmUgdG8gYmUgZXhhY3RseSB0aGF0IHNpemUuICBTb21lIGNvbXBpbGVycyBkaXNsaWtlIHBhc3NpbmcKLSAqIHVuc2lnbmVkIHNob3J0cyBhcyBmdW5jdGlvbiBwYXJhbWV0ZXJzLCBzbyB5b3UgbWF5IGJlIGJldHRlciBvZmYgdXNpbmcKLSAqIHVuc2lnbmVkIGludCBmb3IgcG5nX3VpbnRfMTYuCi0gKi8KLQotI2lmIGRlZmluZWQoSU5UX01BWCkgJiYgKElOVF9NQVggPiAweDdmZmZmZmZlTCkKLXR5cGVkZWYgdW5zaWduZWQgaW50IHBuZ191aW50XzMyOwotdHlwZWRlZiBpbnQgcG5nX2ludF8zMjsKLSNlbHNlCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgcG5nX3VpbnRfMzI7Ci10eXBlZGVmIGxvbmcgcG5nX2ludF8zMjsKLSNlbmRpZgotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBwbmdfdWludF8xNjsKLXR5cGVkZWYgc2hvcnQgcG5nX2ludF8xNjsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBwbmdfYnl0ZTsKLQotI2lmZGVmIFBOR19OT19TSVpFX1QKLSAgIHR5cGVkZWYgdW5zaWduZWQgaW50IHBuZ19zaXplX3Q7Ci0jZWxzZQotICAgdHlwZWRlZiBzaXplX3QgcG5nX3NpemVfdDsKLSNlbmRpZgotI2RlZmluZSBwbmdfc2l6ZW9mKHgpIChzaXplb2YgKHgpKQotCi0vKiBUaGUgZm9sbG93aW5nIGlzIG5lZWRlZCBmb3IgbWVkaXVtIG1vZGVsIHN1cHBvcnQuICBJdCBjYW5ub3QgYmUgaW4gdGhlCi0gKiBwbmdwcml2LmggaGVhZGVyLiAgTmVlZHMgbW9kaWZpY2F0aW9uIGZvciBvdGhlciBjb21waWxlcnMgYmVzaWRlcwotICogTVNDLiAgTW9kZWwgaW5kZXBlbmRlbnQgc3VwcG9ydCBkZWNsYXJlcyBhbGwgYXJyYXlzIGFuZCBwb2ludGVycyB0byBiZQotICogbGFyZ2UgdXNpbmcgdGhlIGZhciBrZXl3b3JkLiAgVGhlIHpsaWIgdmVyc2lvbiB1c2VkIG11c3QgYWxzbyBzdXBwb3J0Ci0gKiBtb2RlbCBpbmRlcGVuZGVudCBkYXRhLiAgQXMgb2YgdmVyc2lvbiB6bGliIDEuMC40LCB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMKLSAqIGhhdmUgYmVlbiBtYWRlIGluIHpsaWIuICBUaGUgVVNFX0ZBUl9LRVlXT1JEIGRlZmluZSB0cmlnZ2VycyBvdGhlcgotICogY2hhbmdlcyB0aGF0IGFyZSBuZWVkZWQuIChUaW0gV2VnbmVyKQotICovCi0KLS8qIFNlcGFyYXRlIGNvbXBpbGVyIGRlcGVuZGVuY2llcyAocHJvYmxlbSBoZXJlIGlzIHRoYXQgemxpYi5oIGFsd2F5cwotICogZGVmaW5lcyBGQVIuIChTSlQpCi0gKi8KLSNpZmRlZiBfX0JPUkxBTkRDX18KLSMgIGlmIGRlZmluZWQoX19MQVJHRV9fKSB8fCBkZWZpbmVkKF9fSFVHRV9fKSB8fCBkZWZpbmVkKF9fQ09NUEFDVF9fKQotIyAgICBkZWZpbmUgTERBVEEgMQotIyAgZWxzZQotIyAgICBkZWZpbmUgTERBVEEgMAotIyAgZW5kaWYKLSAgIC8qIEdSUjogIHdoeSBpcyBDeWd3aW4gaW4gaGVyZT8gIEN5Z3dpbiBpcyBub3QgQm9ybGFuZCBDLi4uICovCi0jICBpZiAhZGVmaW5lZChfX1dJTjMyX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotIyAgICBkZWZpbmUgUE5HX01BWF9NQUxMT0NfNjRLCi0jICAgIGlmIChMREFUQSAhPSAxKQotIyAgICAgIGlmbmRlZiBGQVIKLSMgICAgICAgIGRlZmluZSBGQVIgX19mYXIKLSMgICAgICBlbmRpZgotIyAgICAgIGRlZmluZSBVU0VfRkFSX0tFWVdPUkQKLSMgICAgZW5kaWYgICAvKiBMREFUQSAhPSAxICovCi0gICAgIC8qIFBvc3NpYmx5IHVzZWZ1bCBmb3IgbW92aW5nIGRhdGEgb3V0IG9mIGRlZmF1bHQgc2VnbWVudC4KLSAgICAgICogVW5jb21tZW50IGl0IGlmIHlvdSB3YW50LiBDb3VsZCBhbHNvIGRlZmluZSBGQVJEQVRBIGFzCi0gICAgICAqIGNvbnN0IGlmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgaXQuIChTSlQpCi0jICAgIGRlZmluZSBGQVJEQVRBIEZBUgotICAgICAgKi8KLSMgIGVuZGlmICAvKiBfX1dJTjMyX18sIF9fRkxBVF9fLCBfX0NZR1dJTl9fICovCi0jZW5kaWYgICAvKiBfX0JPUkxBTkRDX18gKi8KLQotCi0vKiBTdWdnZXN0IHRlc3RpbmcgZm9yIHNwZWNpZmljIGNvbXBpbGVyIGZpcnN0IGJlZm9yZSB0ZXN0aW5nIGZvcgotICogRkFSLiAgVGhlIFdhdGNvbSBjb21waWxlciBkZWZpbmVzIGJvdGggX19NRURJVU1fXyBhbmQgTV9JODZNTSwKLSAqIG1ha2luZyByZWxpYW5jZSBvbmNlcnRhaW4ga2V5d29yZHMgc3VzcGVjdC4gKFNKVCkKLSAqLwotCi0vKiBNU0MgTWVkaXVtIG1vZGVsICovCi0jaWZkZWYgRkFSCi0jICBpZmRlZiBNX0k4Nk1NCi0jICAgIGRlZmluZSBVU0VfRkFSX0tFWVdPUkQKLSMgICAgZGVmaW5lIEZBUkRBVEEgRkFSCi0jICAgIGluY2x1ZGUgPGRvcy5oPgotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBTSlQ6IGRlZmF1bHQgY2FzZSAqLwotI2lmbmRlZiBGQVIKLSMgIGRlZmluZSBGQVIKLSNlbmRpZgotCi0vKiBBdCB0aGlzIHBvaW50IEZBUiBpcyBhbHdheXMgZGVmaW5lZCAqLwotI2lmbmRlZiBGQVJEQVRBCi0jICBkZWZpbmUgRkFSREFUQQotI2VuZGlmCi0KLS8qIFR5cGVkZWYgZm9yIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgdGhhdCBhcmUgY29udmVydGVkCi0gICB0byBmaXhlZC1wb2ludCB3aXRoIGEgbXVsdGlwbGUgb2YgMTAwLDAwMCwgZS5nLiwgaW50X2dhbW1hICovCi10eXBlZGVmIHBuZ19pbnRfMzIgcG5nX2ZpeGVkX3BvaW50OwotCi0vKiBBZGQgdHlwZWRlZnMgZm9yIHBvaW50ZXJzICovCi10eXBlZGVmIHZvaWQgICAgICAgICAgICBGQVIgKiBwbmdfdm9pZHA7Ci10eXBlZGVmIHBuZ19ieXRlICAgICAgICBGQVIgKiBwbmdfYnl0ZXA7Ci10eXBlZGVmIHBuZ191aW50XzMyICAgICBGQVIgKiBwbmdfdWludF8zMnA7Ci10eXBlZGVmIHBuZ19pbnRfMzIgICAgICBGQVIgKiBwbmdfaW50XzMycDsKLXR5cGVkZWYgcG5nX3VpbnRfMTYgICAgIEZBUiAqIHBuZ191aW50XzE2cDsKLXR5cGVkZWYgcG5nX2ludF8xNiAgICAgIEZBUiAqIHBuZ19pbnRfMTZwOwotdHlwZWRlZiBQTkdfQ09OU1QgY2hhciAgRkFSICogcG5nX2NvbnN0X2NoYXJwOwotdHlwZWRlZiBjaGFyICAgICAgICAgICAgRkFSICogcG5nX2NoYXJwOwotdHlwZWRlZiBwbmdfZml4ZWRfcG9pbnQgRkFSICogcG5nX2ZpeGVkX3BvaW50X3A7Ci0KLSNpZm5kZWYgUE5HX05PX1NURElPCi10eXBlZGVmIEZJTEUgICAgICAgICAgICAgICAgKiBwbmdfRklMRV9wOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi10eXBlZGVmIGRvdWJsZSAgICAgICAgICBGQVIgKiBwbmdfZG91YmxlcDsKLSNlbmRpZgotCi0vKiBQb2ludGVycyB0byBwb2ludGVyczsgaS5lLiBhcnJheXMgKi8KLXR5cGVkZWYgcG5nX2J5dGUgICAgICAgIEZBUiAqIEZBUiAqIHBuZ19ieXRlcHA7Ci10eXBlZGVmIHBuZ191aW50XzMyICAgICBGQVIgKiBGQVIgKiBwbmdfdWludF8zMnBwOwotdHlwZWRlZiBwbmdfaW50XzMyICAgICAgRkFSICogRkFSICogcG5nX2ludF8zMnBwOwotdHlwZWRlZiBwbmdfdWludF8xNiAgICAgRkFSICogRkFSICogcG5nX3VpbnRfMTZwcDsKLXR5cGVkZWYgcG5nX2ludF8xNiAgICAgIEZBUiAqIEZBUiAqIHBuZ19pbnRfMTZwcDsKLXR5cGVkZWYgUE5HX0NPTlNUIGNoYXIgIEZBUiAqIEZBUiAqIHBuZ19jb25zdF9jaGFycHA7Ci10eXBlZGVmIGNoYXIgICAgICAgICAgICBGQVIgKiBGQVIgKiBwbmdfY2hhcnBwOwotdHlwZWRlZiBwbmdfZml4ZWRfcG9pbnQgRkFSICogRkFSICogcG5nX2ZpeGVkX3BvaW50X3BwOwotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLXR5cGVkZWYgZG91YmxlICAgICAgICAgIEZBUiAqIEZBUiAqIHBuZ19kb3VibGVwcDsKLSNlbmRpZgotCi0vKiBQb2ludGVycyB0byBwb2ludGVycyB0byBwb2ludGVyczsgaS5lLiwgcG9pbnRlciB0byBhcnJheSAqLwotdHlwZWRlZiBjaGFyICAgICAgICAgICAgRkFSICogRkFSICogRkFSICogcG5nX2NoYXJwcHA7Ci0KLS8qIERlZmluZSBQTkdfQlVJTERfRExMIGlmIHRoZSBtb2R1bGUgYmVpbmcgYnVpbHQgaXMgYSBXaW5kb3dzCi0gKiBMSUJQTkcgRExMLgotICoKLSAqIERlZmluZSBQTkdfVVNFX0RMTCBpZiB5b3Ugd2FudCB0byAqbGluayogdG8gdGhlIFdpbmRvd3MgTElCUE5HIERMTC4KLSAqIEl0IGlzIGVxdWl2YWxlbnQgdG8gTWljcm9zb2Z0IHByZWRlZmluZWQgbWFjcm8gX0RMTCB0aGF0IGlzCi0gKiBhdXRvbWF0aWNhbGx5IGRlZmluZWQgd2hlbiB5b3UgY29tcGlsZSB1c2luZyB0aGUgc2hhcmUKLSAqIHZlcnNpb24gb2YgdGhlIENSVCAoQyBSdW4tVGltZSBsaWJyYXJ5KQotICoKLSAqIFRoZSBjeWd3aW4gbW9kcyBtYWtlIHRoaXMgYmVoYXZpb3IgYSBsaXR0bGUgZGlmZmVyZW50OgotICogRGVmaW5lIFBOR19CVUlMRF9ETEwgaWYgeW91IGFyZSBidWlsZGluZyBhIGRsbCBmb3IgdXNlIHdpdGggY3lnd2luCi0gKiBEZWZpbmUgUE5HX1NUQVRJQyBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEgc3RhdGljIGxpYnJhcnkgZm9yIHVzZSB3aXRoIGN5Z3dpbiwKLSAqICAgLW9yLSBpZiB5b3UgYXJlIGJ1aWxkaW5nIGFuIGFwcGxpY2F0aW9uIHRoYXQgeW91IHdhbnQgdG8gbGluayB0byB0aGUKLSAqICAgc3RhdGljIGxpYnJhcnkuCi0gKiBQTkdfVVNFX0RMTCBpcyBkZWZpbmVkIGJ5IGRlZmF1bHQgKG5vIHVzZXIgYWN0aW9uIG5lZWRlZCkgdW5sZXNzIG9uZSBvZgotICogICB0aGUgb3RoZXIgZmxhZ3MgaXMgZGVmaW5lZC4KLSAqLwotCi0jaWYgIWRlZmluZWQoUE5HX0RMTCkgJiYgKGRlZmluZWQoUE5HX0JVSUxEX0RMTCkgfHwgZGVmaW5lZChQTkdfVVNFX0RMTCkpCi0jICBkZWZpbmUgUE5HX0RMTAotI2VuZGlmCi0KLS8qIElmIHlvdSBkZWZpbmUgUE5HQVBJLCBlLmcuLCB3aXRoIGNvbXBpbGVyIG9wdGlvbiAiLURQTkdBUEk9X19zdGRjYWxsIiwKLSAqIHlvdSBtYXkgZ2V0IHdhcm5pbmdzIHJlZ2FyZGluZyB0aGUgbGlua2FnZSBvZiBwbmdfemFsbG9jIGFuZCBwbmdfemZyZWUuCi0gKiBEb24ndCBpZ25vcmUgdGhvc2Ugd2FybmluZ3M7IHlvdSBtdXN0IGFsc28gcmVzZXQgdGhlIGRlZmF1bHQgY2FsbGluZwotICogY29udmVudGlvbiBpbiB5b3VyIGNvbXBpbGVyIHRvIG1hdGNoIHlvdXIgUE5HQVBJLCBhbmQgeW91IG11c3QgYnVpbGQKLSAqIHpsaWIgYW5kIHlvdXIgYXBwbGljYXRpb25zIHRoZSBzYW1lIHdheSB5b3UgYnVpbGQgbGlicG5nLgotICovCi0KLSNpZmRlZiBfX0NZR1dJTl9fCi0jICB1bmRlZiBQTkdBUEkKLSMgIGRlZmluZSBQTkdBUEkgX19jZGVjbAotIyAgdW5kZWYgUE5HX0lNUEVYUAotIyAgZGVmaW5lIFBOR19JTVBFWFAKLSNlbmRpZgotCi0jaWZkZWYgX19XQVRDT01DX18KLSMgIGlmbmRlZiBQTkdBUEkKLSMgICAgZGVmaW5lIFBOR0FQSQotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX01JTkdXMzJfXykgJiYgIWRlZmluZWQoUE5HX01PRFVMRURFRikKLSMgIGlmbmRlZiBQTkdfTk9fTU9EVUxFREVGCi0jICAgIGRlZmluZSBQTkdfTk9fTU9EVUxFREVGCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChQTkdfSU1QRVhQKSAmJiBkZWZpbmVkKFBOR19CVUlMRF9ETEwpICYmICFkZWZpbmVkKFBOR19OT19NT0RVTEVERUYpCi0jICBkZWZpbmUgUE5HX0lNUEVYUAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19ETEwpIHx8IGRlZmluZWQoX0RMTCkgfHwgZGVmaW5lZChfX0RMTF9fICkgfHwgXAotICAgICgoIGRlZmluZWQoX1dpbmRvd3MpIHx8IGRlZmluZWQoX1dJTkRPV1MpIHx8IFwKLSAgICAgICBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pICkpCi0KLSMgIGlmbmRlZiBQTkdBUEkKLSMgICAgIGlmIGRlZmluZWQoX19HTlVDX18pIHx8IChkZWZpbmVkIChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDgwMCkpCi0jICAgICAgICBkZWZpbmUgUE5HQVBJIF9fY2RlY2wKLSMgICAgIGVsc2UKLSMgICAgICAgIGRlZmluZSBQTkdBUEkgX2NkZWNsCi0jICAgICBlbmRpZgotIyAgZW5kaWYKLQotIyAgaWYgIWRlZmluZWQoUE5HX0lNUEVYUCkgJiYgKCFkZWZpbmVkKFBOR19ETEwpIHx8IFwKLSAgICAgICAwIC8qIFdJTkNPTVBJTEVSX1dJVEhfTk9fU1VQUE9SVF9GT1JfREVDTElNUEVYUCAqLykKLSMgICAgIGRlZmluZSBQTkdfSU1QRVhQCi0jICBlbmRpZgotCi0jICBpZm5kZWYgUE5HX0lNUEVYUAotCi0jICAgIGRlZmluZSBQTkdfRVhQT1JUX1RZUEUxKHR5cGUsc3ltYm9sKSAgUE5HX0lNUEVYUCB0eXBlIFBOR0FQSSBzeW1ib2wKLSMgICAgZGVmaW5lIFBOR19FWFBPUlRfVFlQRTIodHlwZSxzeW1ib2wpICB0eXBlIFBOR19JTVBFWFAgUE5HQVBJIHN5bWJvbAotCi0gICAgIC8qIEJvcmxhbmQvTWljcm9zb2Z0ICovCi0jICAgIGlmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQotIyAgICAgIGlmIChfTVNDX1ZFUiA+PSA4MDApIHx8IChfX0JPUkxBTkRDX18gPj0gMHg1MDApCi0jICAgICAgICAgZGVmaW5lIFBOR19FWFBPUlQgUE5HX0VYUE9SVF9UWVBFMQotIyAgICAgIGVsc2UKLSMgICAgICAgICBkZWZpbmUgUE5HX0VYUE9SVCBQTkdfRVhQT1JUX1RZUEUyCi0jICAgICAgICAgaWZkZWYgUE5HX0JVSUxEX0RMTAotIyAgICAgICAgICAgIGRlZmluZSBQTkdfSU1QRVhQIF9fZXhwb3J0Ci0jICAgICAgICAgZWxzZQotIyAgICAgICAgICAgIGRlZmluZSBQTkdfSU1QRVhQIC8qX19pbXBvcnQgKi8gLyogZG9lc24ndCBleGlzdCBBRkFJSyBpbiBWQysrICovCi0jICAgICAgICAgZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFeGlzdHMgaW4gQm9ybGFuZCBDKysgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDKysgY2xhc3NlcyAoPT0gaHVnZSkgKi8KLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotCi0jICAgIGlmbmRlZiBQTkdfSU1QRVhQCi0jICAgICAgaWZkZWYgUE5HX0JVSUxEX0RMTAotIyAgICAgICAgZGVmaW5lIFBOR19JTVBFWFAgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jICAgICAgZWxzZQotIyAgICAgICAgZGVmaW5lIFBOR19JTVBFWFAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgIGVuZGlmICAvKiBQTkdfSU1QRVhQICovCi0jZWxzZSAvKiAhKERMTCB8fCBub24tY3lnd2luIFdJTkRPV1MpICovCi0jICAgaWYgKGRlZmluZWQoX19JQk1DX18pIHx8IGRlZmluZWQoX19JQk1DUFBfXykpICYmIGRlZmluZWQoX19PUzJfXykKLSMgICAgIGlmbmRlZiBQTkdBUEkKLSMgICAgICAgZGVmaW5lIFBOR0FQSSBfU3lzdGVtCi0jICAgICBlbmRpZgotIyAgIGVsc2UKLSMgICAgIGlmIDAgLyogLi4uIG90aGVyIHBsYXRmb3Jtcywgd2l0aCBvdGhlciBtZWFuaW5ncyAqLwotIyAgICAgZW5kaWYKLSMgICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgUE5HQVBJCi0jICBkZWZpbmUgUE5HQVBJCi0jZW5kaWYKLSNpZm5kZWYgUE5HX0lNUEVYUAotIyAgZGVmaW5lIFBOR19JTVBFWFAKLSNlbmRpZgotCi0jaWZkZWYgUE5HX0JVSUxEU1lNUwotIyAgaWZuZGVmIFBOR19FWFBPUlQKLSMgICAgZGVmaW5lIFBOR19FWFBPUlQodHlwZSxzeW1ib2wpIFBOR19GVU5DVElPTl9FWFBPUlQgc3ltYm9sIEVORAotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFBOR19FWFBPUlQKLSMgIGRlZmluZSBQTkdfRVhQT1JUKHR5cGUsc3ltYm9sKSBQTkdfSU1QRVhQIHR5cGUgUE5HQVBJIHN5bWJvbAotI2VuZGlmCi0KLSNkZWZpbmUgUE5HX1VTRV9MT0NBTF9BUlJBWVMgLyogTm90IHVzZWQgaW4gbGlicG5nLCBkZWZpbmVkIGZvciBsZWdhY3kgYXBwcyAqLwotCi0vKiBTdXBwb3J0IGZvciBjb21waWxlciBzcGVjaWZpYyBmdW5jdGlvbiBhdHRyaWJ1dGVzLiAgVGhlc2UgYXJlIHVzZWQKLSAqIHNvIHRoYXQgd2hlcmUgY29tcGlsZXIgc3VwcG9ydCBpcyBhdmFpbGFibGUgaW5jb3JyZWN0IHVzZSBvZiBBUEkKLSAqIGZ1bmN0aW9ucyBpbiBwbmcuaCB3aWxsIGdlbmVyYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgotICoKLSAqIEFkZGVkIGF0IGxpYnBuZy0xLjIuNDEuCi0gKi8KLQotI2lmbmRlZiBQTkdfTk9fUEVEQU5USUNfV0FSTklOR1MKLSMgIGlmbmRlZiBQTkdfUEVEQU5USUNfV0FSTklOR1NfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfUEVEQU5USUNfV0FSTklOR1NfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUEVEQU5USUNfV0FSTklOR1NfU1VQUE9SVEVECi0vKiBTdXBwb3J0IGZvciBjb21waWxlciBzcGVjaWZpYyBmdW5jdGlvbiBhdHRyaWJ1dGVzLiAgVGhlc2UgYXJlIHVzZWQKLSAqIHNvIHRoYXQgd2hlcmUgY29tcGlsZXIgc3VwcG9ydCBpcyBhdmFpbGFibGUgaW5jb3JyZWN0IHVzZSBvZiBBUEkKLSAqIGZ1bmN0aW9ucyBpbiBwbmcuaCB3aWxsIGdlbmVyYXRlIGNvbXBpbGVyIHdhcm5pbmdzLiAgQWRkZWQgYXQgbGlicG5nCi0gKiB2ZXJzaW9uIDEuMi40MS4KLSAqLwotIyAgaWZkZWYgX19HTlVDX18KLSMgICAgaWZuZGVmIFBOR19VU0VfUkVTVUxUCi0jICAgICAgZGVmaW5lIFBOR19VU0VfUkVTVUxUIF9fYXR0cmlidXRlX18oKF9fd2Fybl91bnVzZWRfcmVzdWx0X18pKQotIyAgICBlbmRpZgotIyAgICBpZm5kZWYgUE5HX05PUkVUVVJOCi0jICAgICAgZGVmaW5lIFBOR19OT1JFVFVSTiAgIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCi0jICAgIGVuZGlmCi0jICAgIGlmbmRlZiBQTkdfQUxMT0NBVEVECi0jICAgICAgZGVmaW5lIFBOR19BTExPQ0FURUQgIF9fYXR0cmlidXRlX18oKF9fbWFsbG9jX18pKQotIyAgICBlbmRpZgotIyAgICBpZm5kZWYgUE5HX0RFUFJFQ0FURUQKLSMgICAgICBkZWZpbmUgUE5HX0RFUFJFQ0FURUQgX19hdHRyaWJ1dGVfXygoX19kZXByZWNhdGVkX18pKQotIyAgICBlbmRpZgotCi0gICAgLyogVGhpcyBzcGVjaWZpY2FsbHkgcHJvdGVjdHMgc3RydWN0dXJlIG1lbWJlcnMgdGhhdCBzaG91bGQgb25seSBiZQotICAgICAqIGFjY2Vzc2VkIGZyb20gd2l0aGluIHRoZSBsaWJyYXJ5LCB0aGVyZWZvcmUgc2hvdWxkIGJlIGVtcHR5IGR1cmluZwotICAgICAqIGEgbGlicmFyeSBidWlsZC4KLSAgICAgKi8KLSMgICAgaWZuZGVmIFBOR19ERVBTVFJVQ1QKLSMgICAgICBkZWZpbmUgUE5HX0RFUFNUUlVDVCAgX19hdHRyaWJ1dGVfXygoX19kZXByZWNhdGVkX18pKQotIyAgICBlbmRpZgotIyAgICBpZm5kZWYgUE5HX1BSSVZBVEUKLSMgICAgICBpZiAwIC8qIERvZXNuJ3Qgd29yayBzbyB3ZSB1c2UgZGVwcmVjYXRlZCBpbnN0ZWFkKi8KLSMgICAgICAgIGRlZmluZSBQTkdfUFJJVkFURSBcCi0gICAgICAgICAgX19hdHRyaWJ1dGVfXygod2FybmluZygiVGhpcyBmdW5jdGlvbiBpcyBub3QgZXhwb3J0ZWQgYnkgbGlicG5nLiIpKSkKLSMgICAgICBlbHNlCi0jICAgICAgICBkZWZpbmUgUE5HX1BSSVZBVEUgXAotICAgICAgICAgIF9fYXR0cmlidXRlX18oKF9fZGVwcmVjYXRlZF9fKSkKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZiAvKiBQTkdfUFJJVkFURSAqLwotIyAgZW5kaWYgLyogX19HTlVDX18gKi8KLSNlbmRpZiAvKiBQTkdfUEVEQU5USUNfV0FSTklOR1MgKi8KLQotI2lmbmRlZiBQTkdfREVQUkVDQVRFRAotIyAgZGVmaW5lIFBOR19ERVBSRUNBVEVEICAvKiBVc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkICovCi0jZW5kaWYKLSNpZm5kZWYgUE5HX1VTRV9SRVNVTFQKLSMgIGRlZmluZSBQTkdfVVNFX1JFU1VMVCAgLyogVGhlIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2hlY2tlZCAqLwotI2VuZGlmCi0jaWZuZGVmIFBOR19OT1JFVFVSTgotIyAgZGVmaW5lIFBOR19OT1JFVFVSTiAgICAvKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiAqLwotI2VuZGlmCi0jaWZuZGVmIFBOR19BTExPQ0FURUQKLSMgIGRlZmluZSBQTkdfQUxMT0NBVEVEICAgLyogVGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gaXMgbmV3IG1lbW9yeSAqLwotI2VuZGlmCi0jaWZuZGVmIFBOR19ERVBTVFJVQ1QKLSMgIGRlZmluZSBQTkdfREVQU1RSVUNUICAgLyogQWNjZXNzIHRvIHRoaXMgc3RydWN0IG1lbWJlciBpcyBkZXByZWNhdGVkICovCi0jZW5kaWYKLSNpZm5kZWYgUE5HX1BSSVZBVEUKLSMgIGRlZmluZSBQTkdfUFJJVkFURSAgICAgLyogVGhpcyBpcyBhIHByaXZhdGUgbGlicG5nIGZ1bmN0aW9uICovCi0jZW5kaWYKLQotLyogVXNlcnMgbWF5IHdhbnQgdG8gdXNlIHRoZXNlIHNvIHRoZXkgYXJlIG5vdCBwcml2YXRlLiAgQW55IGxpYnJhcnkKLSAqIGZ1bmN0aW9ucyB0aGF0IGFyZSBwYXNzZWQgZmFyIGRhdGEgbXVzdCBiZSBtb2RlbC1pbmRlcGVuZGVudC4KLSAqLwotCi0vKiBtZW1vcnkgbW9kZWwvcGxhdGZvcm0gaW5kZXBlbmRlbnQgZm5zICovCi0jaWZuZGVmIFBOR19BQk9SVAotIyAgaWYgKGRlZmluZWQoX1dpbmRvd3MpIHx8IGRlZmluZWQoX1dJTkRPV1MpIHx8IGRlZmluZWQoX1dJTkRPV1NfKSkKLSMgICAgIGRlZmluZSBQTkdfQUJPUlQoKSBFeGl0UHJvY2VzcygwKQotIyAgZWxzZQotIyAgICAgZGVmaW5lIFBOR19BQk9SVCgpIGFib3J0KCkKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFVTRV9GQVJfS0VZV09SRAotLyogVXNlIHRoaXMgdG8gbWFrZSBmYXItdG8tbmVhciBhc3NpZ25tZW50cyAqLwotIyAgZGVmaW5lIENIRUNLICAgMQotIyAgZGVmaW5lIE5PQ0hFQ0sgMAotIyAgZGVmaW5lIENWVF9QVFIocHRyKSAocG5nX2Zhcl90b19uZWFyKHBuZ19wdHIscHRyLENIRUNLKSkKLSMgIGRlZmluZSBDVlRfUFRSX05PQ0hFQ0socHRyKSAocG5nX2Zhcl90b19uZWFyKHBuZ19wdHIscHRyLE5PQ0hFQ0spKQotIyAgZGVmaW5lIHBuZ19zdHJjcHkgIF9mc3RyY3B5Ci0jICBkZWZpbmUgcG5nX3N0cm5jcHkgX2ZzdHJuY3B5ICAgLyogQWRkZWQgdG8gdiAxLjIuNiAqLwotIyAgZGVmaW5lIHBuZ19zdHJsZW4gIF9mc3RybGVuCi0jICBkZWZpbmUgcG5nX21lbWNtcCAgX2ZtZW1jbXAgICAgLyogU0pUOiBhZGRlZCAqLwotIyAgZGVmaW5lIHBuZ19tZW1jcHkgIF9mbWVtY3B5Ci0jICBkZWZpbmUgcG5nX21lbXNldCAgX2ZtZW1zZXQKLSMgIGRlZmluZSBwbmdfc3ByaW50ZiBzcHJpbnRmCi0jZWxzZQotIyAgaWYgKGRlZmluZWQoX1dpbmRvd3MpIHx8IGRlZmluZWQoX1dJTkRPV1MpIHx8IGRlZmluZWQoX1dJTkRPV1NfKSkKLSMgICAgLyogRmF2b3IgV2luZG93cyBvdmVyIEMgcnVudGltZSBmbnMgKi8KLSMgICAgZGVmaW5lIENWVF9QVFIocHRyKSAgICAgICAgIChwdHIpCi0jICAgIGRlZmluZSBDVlRfUFRSX05PQ0hFQ0socHRyKSAocHRyKQotIyAgICBkZWZpbmUgcG5nX3N0cmNweSAgbHN0cmNweUEKLSMgICAgZGVmaW5lIHBuZ19zdHJuY3B5IGxzdHJjcHluQQotIyAgICBkZWZpbmUgcG5nX3N0cmxlbiAgbHN0cmxlbkEKLSMgICAgZGVmaW5lIHBuZ19tZW1jbXAgIG1lbWNtcAotIyAgICBkZWZpbmUgcG5nX21lbWNweSAgQ29weU1lbW9yeQotIyAgICBkZWZpbmUgcG5nX21lbXNldCAgbWVtc2V0Ci0jICAgIGRlZmluZSBwbmdfc3ByaW50ZiB3c3ByaW50ZkEKLSMgIGVsc2UKLSMgICAgZGVmaW5lIENWVF9QVFIocHRyKSAgICAgICAgIChwdHIpCi0jICAgIGRlZmluZSBDVlRfUFRSX05PQ0hFQ0socHRyKSAocHRyKQotIyAgICBkZWZpbmUgcG5nX3N0cmNweSAgc3RyY3B5Ci0jICAgIGRlZmluZSBwbmdfc3RybmNweSBzdHJuY3B5ICAgICAvKiBBZGRlZCB0byB2IDEuMi42ICovCi0jICAgIGRlZmluZSBwbmdfc3RybGVuICBzdHJsZW4KLSMgICAgZGVmaW5lIHBuZ19tZW1jbXAgIG1lbWNtcCAgICAgIC8qIFNKVDogYWRkZWQgKi8KLSMgICAgZGVmaW5lIHBuZ19tZW1jcHkgIG1lbWNweQotIyAgICBkZWZpbmUgcG5nX21lbXNldCAgbWVtc2V0Ci0jICAgIGRlZmluZSBwbmdfc3ByaW50ZiBzcHJpbnRmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgUE5HX05PX1NOUFJJTlRGCi0jICBpZmRlZiBfTVNDX1ZFUgotIyAgICBkZWZpbmUgcG5nX3NucHJpbnRmIF9zbnByaW50ZiAgIC8qIEFkZGVkIHRvIHYgMS4yLjE5ICovCi0jICAgIGRlZmluZSBwbmdfc25wcmludGYyIF9zbnByaW50ZgotIyAgICBkZWZpbmUgcG5nX3NucHJpbnRmNiBfc25wcmludGYKLSMgIGVsc2UKLSMgICAgZGVmaW5lIHBuZ19zbnByaW50ZiBzbnByaW50ZiAgIC8qIEFkZGVkIHRvIHYgMS4yLjE5ICovCi0jICAgIGRlZmluZSBwbmdfc25wcmludGYyIHNucHJpbnRmCi0jICAgIGRlZmluZSBwbmdfc25wcmludGY2IHNucHJpbnRmCi0jICBlbmRpZgotI2Vsc2UKLSAgIC8qIFlvdSBkb24ndCBoYXZlIG9yIGRvbid0IHdhbnQgdG8gdXNlIHNucHJpbnRmKCkuICBDYXV0aW9uOiBVc2luZwotICAgICogc3ByaW50ZiBpbnN0ZWFkIG9mIHNucHJpbnRmIGV4cG9zZXMgeW91ciBhcHBsaWNhdGlvbiB0byBhY2NpZGVudGFsCi0gICAgKiBvciBtYWxldm9sZW50IGJ1ZmZlciBvdmVyZmxvd3MuICBJZiB5b3UgZG9uJ3QgaGF2ZSBzbnByaW50ZigpCi0gICAgKiBhcyBhIGdlbmVyYWwgcnVsZSB5b3Ugc2hvdWxkIHByb3ZpZGUgb25lICh5b3UgY2FuIGdldCBvbmUgZnJvbQotICAgICogUG9ydGFibGUgT3BlblNTSCkuCi0gICAgKi8KLSMgIGRlZmluZSBwbmdfc25wcmludGYoczEsbixmbXQseDEpIHBuZ19zcHJpbnRmKHMxLGZtdCx4MSkKLSMgIGRlZmluZSBwbmdfc25wcmludGYyKHMxLG4sZm10LHgxLHgyKSBwbmdfc3ByaW50ZihzMSxmbXQseDEseDIpCi0jICBkZWZpbmUgcG5nX3NucHJpbnRmNihzMSxuLGZtdCx4MSx4Mix4Myx4NCx4NSx4NikgXAotICAgICAgcG5nX3NwcmludGYoczEsZm10LHgxLHgyLHgzLHg0LHg1LHg2KQotI2VuZGlmCi0KLS8qIHBuZ19hbGxvY19zaXplX3QgaXMgZ3VhcmFudGVlZCB0byBiZSBubyBzbWFsbGVyIHRoYW4gcG5nX3NpemVfdCwKLSAqIGFuZCBubyBzbWFsbGVyIHRoYW4gcG5nX3VpbnRfMzIuICBDYXN0cyBmcm9tIHBuZ19zaXplX3Qgb3IgcG5nX3VpbnRfMzIKLSAqIHRvIHBuZ19hbGxvY19zaXplX3QgYXJlIG5vdCBuZWNlc3Nhcnk7IGluIGZhY3QsIGl0IGlzIHJlY29tbWVuZGVkCi0gKiBub3QgdG8gdXNlIHRoZW0gYXQgYWxsIHNvIHRoYXQgdGhlIGNvbXBpbGVyIGNhbiBjb21wbGFpbiB3aGVuIHNvbWV0aGluZwotICogdHVybnMgb3V0IHRvIGJlIHByb2JsZW1hdGljLgotICogQ2FzdHMgaW4gdGhlIG90aGVyIGRpcmVjdGlvbiAoZnJvbSBwbmdfYWxsb2Nfc2l6ZV90IHRvIHBuZ19zaXplX3Qgb3IKLSAqIHBuZ191aW50XzMyKSBzaG91bGQgYmUgZXhwbGljaXRseSBhcHBsaWVkOyBob3dldmVyLCB3ZSBkbyBub3QgZXhwZWN0Ci0gKiB0byBlbmNvdW50ZXIgcHJhY3RpY2FsIHNpdHVhdGlvbnMgdGhhdCByZXF1aXJlIHN1Y2ggY29udmVyc2lvbnMuCi0gKi8KLSNpZiBkZWZpbmVkKF9fVFVSQk9DX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKQotICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIHBuZ19hbGxvY19zaXplX3Q7Ci0jZWxzZQotIyAgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChNQVhTRUdfNjRLKQotICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgcG5nX2FsbG9jX3NpemVfdDsKLSMgIGVsc2UKLSAgICAgLyogVGhpcyBpcyBhbiBhdHRlbXB0IHRvIGRldGVjdCBhbiBvbGQgV2luZG93cyBzeXN0ZW0gd2hlcmUgKGludCkgaXMKLSAgICAgICogYWN0dWFsbHkgMTYgYml0cywgaW4gdGhhdCBjYXNlIHBuZ19tYWxsb2MgbXVzdCBoYXZlIGFuIGFyZ3VtZW50IHdpdGggYQotICAgICAgKiBiaWdnZXIgc2l6ZSB0byBhY2NvbW9kYXRlIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIGxpYnJhcnkuCi0gICAgICAqLwotIyAgICBpZiAoZGVmaW5lZChfV2luZG93cykgfHwgZGVmaW5lZChfV0lORE9XUykgfHwgZGVmaW5lZChfV0lORE9XU18pKSAmJiBcCi0gICAgICAgICghZGVmaW5lZChJTlRfTUFYKSB8fCBJTlRfTUFYIDw9IDB4N2ZmZmZmZmVMKQotICAgICAgIHR5cGVkZWYgRFdPUkQgICAgICAgICBwbmdfYWxsb2Nfc2l6ZV90OwotIyAgICBlbHNlCi0gICAgICAgdHlwZWRlZiBwbmdfc2l6ZV90ICAgIHBuZ19hbGxvY19zaXplX3Q7Ci0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0vKiBFbmQgb2YgbWVtb3J5IG1vZGVsL3BsYXRmb3JtIGluZGVwZW5kZW50IHN1cHBvcnQgKi8KLQotLyogSnVzdCBhIGxpdHRsZSBjaGVjayB0aGF0IHNvbWVvbmUgaGFzbid0IHRyaWVkIHRvIGRlZmluZSBzb21ldGhpbmcKLSAqIGNvbnRyYWRpY3RvcnkuCi0gKi8KLSNpZiAoUE5HX1pCVUZfU0laRSA+IDY1NTM2TCkgJiYgZGVmaW5lZChQTkdfTUFYX01BTExPQ182NEspCi0jICB1bmRlZiBQTkdfWkJVRl9TSVpFCi0jICBkZWZpbmUgUE5HX1pCVUZfU0laRSA2NTUzNkwKLSNlbmRpZgotCi0KLS8qIEFkZGVkIGF0IGxpYnBuZy0xLjIuOCAqLwotI2VuZGlmIC8qIFBOR19WRVJTSU9OX0lORk9fT05MWSAqLwotCi0jZW5kaWYgLyogUE5HQ09ORl9IICovCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3BuZ2Vycm9yLmMgYi9zcmMvbGlicG5nL3BuZ2Vycm9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOThmNjIuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9wbmdlcnJvci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLQotLyogcG5nZXJyb3IuYyAtIHN0dWIgZnVuY3Rpb25zIGZvciBpL28gYW5kIG1lbW9yeSBhbGxvY2F0aW9uCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjQuOCBbSnVseSA3LCAyMDExXQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTEgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSAqCi0gKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSBsb2NhdGlvbiBmb3IgYWxsIGVycm9yIGhhbmRsaW5nLiAgVXNlcnMgd2hvCi0gKiBuZWVkIHNwZWNpYWwgZXJyb3IgaGFuZGxpbmcgYXJlIGV4cGVjdGVkIHRvIHdyaXRlIHJlcGxhY2VtZW50IGZ1bmN0aW9ucwotICogYW5kIHVzZSBwbmdfc2V0X2Vycm9yX2ZuKCkgdG8gdXNlIHRob3NlIGZ1bmN0aW9ucy4gIFNlZSB0aGUgaW5zdHJ1Y3Rpb25zCi0gKiBhdCBlYWNoIGZ1bmN0aW9uLgotICovCi0KLSNkZWZpbmUgUE5HX05PX1BFREFOVElDX1dBUk5JTkdTCi0jaW5jbHVkZSAicG5nLmgiCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkKLSNpbmNsdWRlICJwbmdwcml2LmgiCi0KLXN0YXRpYyB2b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kZWZhdWx0X2Vycm9yIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpKSBQTkdfTk9SRVRVUk47Ci0jaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRAotc3RhdGljIHZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RlZmF1bHRfd2FybmluZyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21lc3NhZ2UpKTsKLSNlbmRpZiAvKiBQTkdfV0FSTklOR1NfU1VQUE9SVEVEICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIHRoZXJlIGlzIGEgZmF0YWwgZXJyb3IuICBUaGlzIGZ1bmN0aW9uCi0gKiBzaG91bGQgbm90IGJlIGNoYW5nZWQuICBJZiB0aGVyZSBpcyBhIG5lZWQgdG8gaGFuZGxlIGVycm9ycyBkaWZmZXJlbnRseSwKLSAqIHlvdSBzaG91bGQgc3VwcGx5IGEgcmVwbGFjZW1lbnQgZXJyb3IgZnVuY3Rpb24gYW5kIHVzZSBwbmdfc2V0X2Vycm9yX2ZuKCkKLSAqIHRvIHJlcGxhY2UgdGhlIGVycm9yIGZ1bmN0aW9uIGF0IHJ1bi10aW1lLgotICovCi0jaWZkZWYgUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVECi12b2lkIFBOR0FQSQotcG5nX2Vycm9yKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKQotewotI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRAotICAgY2hhciBtc2dbMTZdOwotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKLSAgIHsKLSAgICAgaWYgKHBuZ19wdHItPmZsYWdzJgotICAgICAgIChQTkdfRkxBR19TVFJJUF9FUlJPUl9OVU1CRVJTfFBOR19GTEFHX1NUUklQX0VSUk9SX1RFWFQpKQotICAgICB7Ci0gICAgICAgaWYgKCplcnJvcl9tZXNzYWdlID09IFBOR19MSVRFUkFMX1NIQVJQKQotICAgICAgIHsKLSAgICAgICAgICAgLyogU3RyaXAgIiNubm5uICIgZnJvbSBiZWdpbm5pbmcgb2YgZXJyb3IgbWVzc2FnZS4gKi8KLSAgICAgICAgICAgaW50IG9mZnNldDsKLSAgICAgICAgICAgZm9yIChvZmZzZXQgPSAxOyBvZmZzZXQ8MTU7IG9mZnNldCsrKQotICAgICAgICAgICAgICBpZiAoZXJyb3JfbWVzc2FnZVtvZmZzZXRdID09ICcgJykKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBpZiAocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfU1RSSVBfRVJST1JfVEVYVCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9mZnNldCAtIDE7IGkrKykKLSAgICAgICAgICAgICAgICAgbXNnW2ldID0gZXJyb3JfbWVzc2FnZVtpICsgMV07Ci0gICAgICAgICAgICAgIG1zZ1tpIC0gMV0gPSAnXDAnOwotICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gbXNnOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSArPSBvZmZzZXQ7Ci0gICAgICAgfQotICAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgICAgIGlmIChwbmdfcHRyLT5mbGFncyZQTkdfRkxBR19TVFJJUF9FUlJPUl9URVhUKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1zZ1swXSA9ICcwJzsKLSAgICAgICAgICAgICAgbXNnWzFdID0gJ1wwJzsKLSAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9IG1zZzsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgfQotI2VuZGlmCi0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIHBuZ19wdHItPmVycm9yX2ZuICE9IE5VTEwpCi0gICAgICAoKihwbmdfcHRyLT5lcnJvcl9mbikpKHBuZ19wdHIsIGVycm9yX21lc3NhZ2UpOwotCi0gICAvKiBJZiB0aGUgY3VzdG9tIGhhbmRsZXIgZG9lc24ndCBleGlzdCwgb3IgaWYgaXQgcmV0dXJucywKLSAgICAgIHVzZSB0aGUgZGVmYXVsdCBoYW5kbGVyLCB3aGljaCB3aWxsIG5vdCByZXR1cm4uICovCi0gICBwbmdfZGVmYXVsdF9lcnJvcihwbmdfcHRyLCBlcnJvcl9tZXNzYWdlKTsKLX0KLSNlbHNlCi12b2lkIFBOR0FQSQotcG5nX2Vycihwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgLyogUHJpb3IgdG8gMS40LjggdGhlIGVycm9yX2ZuIHJlY2VpdmVkIGEgTlVMTCBwb2ludGVyLCBleHByZXNzZWQKLSAgICAqIGVycm9uZW91c2x5IGFzICdcMCcsIGluc3RlYWQgb2YgdGhlIGVtcHR5IHN0cmluZyAiIi4gIFRoaXMgd2FzCi0gICAgKiBhcHBhcmVudGx5IGFuIGVycm9yLCBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjIuMjAsIGFuZCBwbmdfZGVmYXVsdF9lcnJvcgotICAgICogd2lsbCBjcmFzaCBpbiB0aGlzIGNhc2UuCi0gICAgKi8KLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgcG5nX3B0ci0+ZXJyb3JfZm4gIT0gTlVMTCkKLSAgICAgICgqKHBuZ19wdHItPmVycm9yX2ZuKSkocG5nX3B0ciwgIiIpOwotCi0gICAvKiBJZiB0aGUgY3VzdG9tIGhhbmRsZXIgZG9lc24ndCBleGlzdCwgb3IgaWYgaXQgcmV0dXJucywKLSAgICAgIHVzZSB0aGUgZGVmYXVsdCBoYW5kbGVyLCB3aGljaCB3aWxsIG5vdCByZXR1cm4uICovCi0gICBwbmdfZGVmYXVsdF9lcnJvcihwbmdfcHRyLCAiIik7Ci19Ci0jZW5kaWYgLyogUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVECi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciB0aGVyZSBpcyBhIG5vbi1mYXRhbCBlcnJvci4gIFRoaXMgZnVuY3Rpb24KLSAqIHNob3VsZCBub3QgYmUgY2hhbmdlZC4gIElmIHRoZXJlIGlzIGEgbmVlZCB0byBoYW5kbGUgd2FybmluZ3MgZGlmZmVyZW50bHksCi0gKiB5b3Ugc2hvdWxkIHN1cHBseSBhIHJlcGxhY2VtZW50IHdhcm5pbmcgZnVuY3Rpb24gYW5kIHVzZQotICogcG5nX3NldF9lcnJvcl9mbigpIHRvIHJlcGxhY2UgdGhlIHdhcm5pbmcgZnVuY3Rpb24gYXQgcnVuLXRpbWUuCi0gKi8KLXZvaWQgUE5HQVBJCi1wbmdfd2FybmluZyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKQotewotICAgaW50IG9mZnNldCA9IDA7Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMKQotICAgewotI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPmZsYWdzJgotICAgICAoUE5HX0ZMQUdfU1RSSVBfRVJST1JfTlVNQkVSU3xQTkdfRkxBR19TVFJJUF9FUlJPUl9URVhUKSkKLSNlbmRpZgotICAgICB7Ci0gICAgICAgaWYgKCp3YXJuaW5nX21lc3NhZ2UgPT0gUE5HX0xJVEVSQUxfU0hBUlApCi0gICAgICAgewotICAgICAgICAgICBmb3IgKG9mZnNldCA9IDE7IG9mZnNldCA8IDE1OyBvZmZzZXQrKykKLSAgICAgICAgICAgICAgaWYgKHdhcm5pbmdfbWVzc2FnZVtvZmZzZXRdID09ICcgJykKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgIH0KLSAgICAgfQotICAgfQotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBwbmdfcHRyLT53YXJuaW5nX2ZuICE9IE5VTEwpCi0gICAgICAoKihwbmdfcHRyLT53YXJuaW5nX2ZuKSkocG5nX3B0ciwgd2FybmluZ19tZXNzYWdlICsgb2Zmc2V0KTsKLSAgIGVsc2UKLSAgICAgIHBuZ19kZWZhdWx0X3dhcm5pbmcocG5nX3B0ciwgd2FybmluZ19tZXNzYWdlICsgb2Zmc2V0KTsKLX0KLSNlbmRpZiAvKiBQTkdfV0FSTklOR1NfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBQTkdfQkVOSUdOX0VSUk9SU19TVVBQT1JURUQKLXZvaWQgUE5HQVBJCi1wbmdfYmVuaWduX2Vycm9yKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKQotewotICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19CRU5JR05fRVJST1JTX1dBUk4pCi0gICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgZXJyb3JfbWVzc2FnZSk7Ci0gIGVsc2UKLSAgICBwbmdfZXJyb3IocG5nX3B0ciwgZXJyb3JfbWVzc2FnZSk7Ci19Ci0jZW5kaWYKLQotLyogVGhlc2UgdXRpbGl0aWVzIGFyZSB1c2VkIGludGVybmFsbHkgdG8gYnVpbGQgYW4gZXJyb3IgbWVzc2FnZSB0aGF0IHJlbGF0ZXMKLSAqIHRvIHRoZSBjdXJyZW50IGNodW5rLiAgVGhlIGNodW5rIG5hbWUgY29tZXMgZnJvbSBwbmdfcHRyLT5jaHVua19uYW1lLAotICogdGhpcyBpcyB1c2VkIHRvIHByZWZpeCB0aGUgbWVzc2FnZS4gIFRoZSBtZXNzYWdlIGlzIGxpbWl0ZWQgaW4gbGVuZ3RoCi0gKiB0byA2MyBieXRlcywgdGhlIG5hbWUgY2hhcmFjdGVycyBhcmUgb3V0cHV0IGFzIGhleCBkaWdpdHMgd3JhcHBlZCBpbiBbXQotICogaWYgdGhlIGNoYXJhY3RlciBpcyBpbnZhbGlkLgotICovCi0jZGVmaW5lIGlzbm9uYWxwaGEoYykgKChjKSA8IDY1IHx8IChjKSA+IDEyMiB8fCAoKGMpID4gOTAgJiYgKGMpIDwgOTcpKQotc3RhdGljIFBOR19DT05TVCBjaGFyIHBuZ19kaWdpdFsxNl0gPSB7Ci0gICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCi0gICAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnCi19OwotCi0jZGVmaW5lIFBOR19NQVhfRVJST1JfVEVYVCA2NAotI2lmIGRlZmluZWQoUE5HX1dBUk5JTkdTX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfRVJST1JfVEVYVF9TVVBQT1JURUQpCi1zdGF0aWMgdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZm9ybWF0X2J1ZmZlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY2hhcnAgYnVmZmVyLCBwbmdfY29uc3RfY2hhcnAKLSAgIGVycm9yX21lc3NhZ2UpCi17Ci0gICBpbnQgaW91dCA9IDAsIGlpbiA9IDA7Ci0KLSAgIHdoaWxlIChpaW4gPCA0KQotICAgewotICAgICAgaW50IGMgPSBwbmdfcHRyLT5jaHVua19uYW1lW2lpbisrXTsKLSAgICAgIGlmIChpc25vbmFscGhhKGMpKQotICAgICAgewotICAgICAgICAgYnVmZmVyW2lvdXQrK10gPSBQTkdfTElURVJBTF9MRUZUX1NRVUFSRV9CUkFDS0VUOwotICAgICAgICAgYnVmZmVyW2lvdXQrK10gPSBwbmdfZGlnaXRbKGMgJiAweGYwKSA+PiA0XTsKLSAgICAgICAgIGJ1ZmZlcltpb3V0KytdID0gcG5nX2RpZ2l0W2MgJiAweDBmXTsKLSAgICAgICAgIGJ1ZmZlcltpb3V0KytdID0gUE5HX0xJVEVSQUxfUklHSFRfU1FVQVJFX0JSQUNLRVQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBidWZmZXJbaW91dCsrXSA9IChwbmdfYnl0ZSljOwotICAgICAgfQotICAgfQotCi0gICBpZiAoZXJyb3JfbWVzc2FnZSA9PSBOVUxMKQotICAgICAgYnVmZmVyW2lvdXRdID0gJ1wwJzsKLSAgIGVsc2UKLSAgIHsKLSAgICAgIGJ1ZmZlcltpb3V0KytdID0gJzonOwotICAgICAgYnVmZmVyW2lvdXQrK10gPSAnICc7Ci0KLSAgICAgIGlpbiA9IDA7Ci0gICAgICB3aGlsZSAoaWluIDwgUE5HX01BWF9FUlJPUl9URVhULTEgJiYgZXJyb3JfbWVzc2FnZVtpaW5dICE9ICdcMCcpCi0gICAgICAgICBidWZmZXJbaW91dCsrXSA9IGVycm9yX21lc3NhZ2VbaWluKytdOwotCi0gICAgICAvKiBpaW4gPCBQTkdfTUFYX0VSUk9SX1RFWFQsIHNvIHRoZSBmb2xsb3dpbmcgaXMgc2FmZTogKi8KLSAgICAgIGJ1ZmZlcltpb3V0XSA9ICdcMCc7Ci0gICB9Ci19Ci0KLSNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKLXZvaWQgUE5HQVBJCi1wbmdfY2h1bmtfZXJyb3IocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpCi17Ci0gICBjaGFyIG1zZ1sxOCtQTkdfTUFYX0VSUk9SX1RFWFRdOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIGVycm9yX21lc3NhZ2UpOwotICAgZWxzZQotICAgewotICAgICBwbmdfZm9ybWF0X2J1ZmZlcihwbmdfcHRyLCBtc2csIGVycm9yX21lc3NhZ2UpOwotICAgICBwbmdfZXJyb3IocG5nX3B0ciwgbXNnKTsKLSAgIH0KLX0KLSNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgKi8KLSNlbmRpZiAvKiBQTkdfV0FSTklOR1NfU1VQUE9SVEVEIHx8IFBOR19FUlJPUl9URVhUX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRAotdm9pZCBQTkdBUEkKLXBuZ19jaHVua193YXJuaW5nKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21lc3NhZ2UpCi17Ci0gICBjaGFyIG1zZ1sxOCtQTkdfTUFYX0VSUk9SX1RFWFRdOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgd2FybmluZ19tZXNzYWdlKTsKLSAgIGVsc2UKLSAgIHsKLSAgICAgcG5nX2Zvcm1hdF9idWZmZXIocG5nX3B0ciwgbXNnLCB3YXJuaW5nX21lc3NhZ2UpOwotICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCBtc2cpOwotICAgfQotfQotI2VuZGlmIC8qIFBOR19XQVJOSU5HU19TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRAotI2lmZGVmIFBOR19CRU5JR05fRVJST1JTX1NVUFBPUlRFRAotdm9pZCBQTkdBUEkKLXBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpCi17Ci0gIGlmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0JFTklHTl9FUlJPUlNfV0FSTikKLSAgICBwbmdfY2h1bmtfd2FybmluZyhwbmdfcHRyLCBlcnJvcl9tZXNzYWdlKTsKLSAgZWxzZQotICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCBlcnJvcl9tZXNzYWdlKTsKLX0KLSNlbmRpZgotI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLS8qIFRoaXMgQVBJIG9ubHkgZXhpc3RzIGlmIEFOU0ktQyBzdHlsZSBlcnJvciBoYW5kbGluZyBpcyB1c2VkLAotICogb3RoZXJ3aXNlIGl0IGlzIG5lY2Vzc2FyeSBmb3IgcG5nX2RlZmF1bHRfZXJyb3IgdG8gYmUgb3ZlcnJpZGRlbi4KLSAqLwotam1wX2J1ZiogUE5HQVBJCi1wbmdfc2V0X2xvbmdqbXBfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2xvbmdqbXBfcHRyIGxvbmdqbXBfZm4sCi0gICAgc2l6ZV90IGptcF9idWZfc2l6ZSkKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgam1wX2J1Zl9zaXplICE9IHBuZ19zaXplb2Yoam1wX2J1ZikpCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgcG5nX3B0ci0+bG9uZ2ptcF9mbiA9IGxvbmdqbXBfZm47Ci0gICByZXR1cm4gJnBuZ19wdHItPmptcGJ1ZjsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9uLiAgTm90ZSB0aGF0IHJlcGxhY2VtZW50cyBmb3IKLSAqIHRoaXMgZnVuY3Rpb24gTVVTVCBOT1QgUkVUVVJOLCBvciB0aGUgcHJvZ3JhbSB3aWxsIGxpa2VseSBjcmFzaC4gIFRoaXMKLSAqIGZ1bmN0aW9uIGlzIHVzZWQgYnkgZGVmYXVsdCwgb3IgaWYgdGhlIHByb2dyYW0gc3VwcGxpZXMgTlVMTCBmb3IgdGhlCi0gKiBlcnJvciBmdW5jdGlvbiBwb2ludGVyIGluIHBuZ19zZXRfZXJyb3JfZm4oKS4KLSAqLwotc3RhdGljIHZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RlZmF1bHRfZXJyb3IocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpCi17Ci0jaWZkZWYgUE5HX0NPTlNPTEVfSU9fU1VQUE9SVEVECi0jaWZkZWYgUE5HX0VSUk9SX05VTUJFUlNfU1VQUE9SVEVECi0gICBpZiAoKmVycm9yX21lc3NhZ2UgPT0gUE5HX0xJVEVSQUxfU0hBUlApCi0gICB7Ci0gICAgIC8qIFN0cmlwICIjbm5ubiAiIGZyb20gYmVnaW5uaW5nIG9mIGVycm9yIG1lc3NhZ2UuICovCi0gICAgIGludCBvZmZzZXQ7Ci0gICAgIGNoYXIgZXJyb3JfbnVtYmVyWzE2XTsKLSAgICAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQ8MTU7IG9mZnNldCsrKQotICAgICB7Ci0gICAgICAgICBlcnJvcl9udW1iZXJbb2Zmc2V0XSA9IGVycm9yX21lc3NhZ2Vbb2Zmc2V0ICsgMV07Ci0gICAgICAgICBpZiAoZXJyb3JfbWVzc2FnZVtvZmZzZXRdID09ICcgJykKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgfQotICAgICBpZiAoKG9mZnNldCA+IDEpICYmIChvZmZzZXQgPCAxNSkpCi0gICAgIHsKLSAgICAgICBlcnJvcl9udW1iZXJbb2Zmc2V0IC0gMV0gPSAnXDAnOwotICAgICAgIGZwcmludGYoc3RkZXJyLCAibGlicG5nIGVycm9yIG5vLiAlczogJXMiLAotICAgICAgICAgIGVycm9yX251bWJlciwgZXJyb3JfbWVzc2FnZSArIG9mZnNldCArIDEpOwotICAgICAgIGZwcmludGYoc3RkZXJyLCBQTkdfU1RSSU5HX05FV0xJTkUpOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgIGZwcmludGYoc3RkZXJyLCAibGlicG5nIGVycm9yOiAlcywgb2Zmc2V0PSVkIiwKLSAgICAgICAgICBlcnJvcl9tZXNzYWdlLCBvZmZzZXQpOwotICAgICAgIGZwcmludGYoc3RkZXJyLCBQTkdfU1RSSU5HX05FV0xJTkUpOwotICAgICB9Ci0gICB9Ci0gICBlbHNlCi0jZW5kaWYKLSAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAibGlicG5nIGVycm9yOiAlcyIsIGVycm9yX21lc3NhZ2UpOwotICAgICAgZnByaW50ZihzdGRlcnIsIFBOR19TVFJJTkdfTkVXTElORSk7Ci0gICB9Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ciAmJiBwbmdfcHRyLT5sb25nam1wX2ZuKQotICAgewotIyAgaWZkZWYgVVNFX0ZBUl9LRVlXT1JECi0gICB7Ci0gICAgICBqbXBfYnVmIGptcGJ1ZjsKLSAgICAgIHBuZ19tZW1jcHkoam1wYnVmLCBwbmdfcHRyLT5qbXBidWYsIHBuZ19zaXplb2Yoam1wX2J1ZikpOwotICAgICBwbmdfcHRyLT5sb25nam1wX2ZuKGptcGJ1ZiwgMSk7Ci0gICB9Ci0jICBlbHNlCi0gICBwbmdfcHRyLT5sb25nam1wX2ZuKHBuZ19wdHItPmptcGJ1ZiwgMSk7Ci0jICBlbmRpZgotICAgfQotI2VuZGlmCi0gICAvKiBIZXJlIGlmIG5vdCBzZXRqbXAgc3VwcG9ydCBvciBpZiBwbmdfcHRyIGlzIG51bGwuICovCi0gICBQTkdfQUJPUlQoKTsKLSNpZm5kZWYgUE5HX0NPTlNPTEVfSU9fU1VQUE9SVEVECi0gICBQTkdfVU5VU0VEKGVycm9yX21lc3NhZ2UpIC8qIE1ha2UgY29tcGlsZXIgaGFwcHkgKi8KLSNlbmRpZgotfQotCi0jaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRAotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIHdhcm5pbmcsIGJ1dCB0aGUgbGlicmFyeSB0aGlua3MKLSAqIGl0IGNhbiBjb250aW51ZSBhbnl3YXkuICBSZXBsYWNlbWVudCBmdW5jdGlvbnMgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZwotICogaGVyZSBpZiB5b3UgZG9uJ3Qgd2FudCB0aGVtIHRvLiAgSW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgcG5nX3B0ciBpcwotICogbm90IHVzZWQsIGJ1dCBpdCBpcyBwYXNzZWQgaW4gY2FzZSBpdCBtYXkgYmUgdXNlZnVsLgotICovCi1zdGF0aWMgdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZGVmYXVsdF93YXJuaW5nKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21lc3NhZ2UpCi17Ci0jaWZkZWYgUE5HX0NPTlNPTEVfSU9fU1VQUE9SVEVECi0jICBpZmRlZiBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQKLSAgIGlmICgqd2FybmluZ19tZXNzYWdlID09IFBOR19MSVRFUkFMX1NIQVJQKQotICAgewotICAgICBpbnQgb2Zmc2V0OwotICAgICBjaGFyIHdhcm5pbmdfbnVtYmVyWzE2XTsKLSAgICAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCAxNTsgb2Zmc2V0KyspCi0gICAgIHsKLSAgICAgICAgd2FybmluZ19udW1iZXJbb2Zmc2V0XSA9IHdhcm5pbmdfbWVzc2FnZVtvZmZzZXQgKyAxXTsKLSAgICAgICAgaWYgKHdhcm5pbmdfbWVzc2FnZVtvZmZzZXRdID09ICcgJykKLSAgICAgICAgICAgIGJyZWFrOwotICAgICB9Ci0gICAgIGlmICgob2Zmc2V0ID4gMSkgJiYgKG9mZnNldCA8IDE1KSkKLSAgICAgewotICAgICAgIHdhcm5pbmdfbnVtYmVyW29mZnNldCArIDFdID0gJ1wwJzsKLSAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxpYnBuZyB3YXJuaW5nIG5vLiAlczogJXMiLAotICAgICAgICAgIHdhcm5pbmdfbnVtYmVyLCB3YXJuaW5nX21lc3NhZ2UgKyBvZmZzZXQpOwotICAgICAgIGZwcmludGYoc3RkZXJyLCBQTkdfU1RSSU5HX05FV0xJTkUpOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgIGZwcmludGYoc3RkZXJyLCAibGlicG5nIHdhcm5pbmc6ICVzIiwKLSAgICAgICAgICB3YXJuaW5nX21lc3NhZ2UpOwotICAgICAgIGZwcmludGYoc3RkZXJyLCBQTkdfU1RSSU5HX05FV0xJTkUpOwotICAgICB9Ci0gICB9Ci0gICBlbHNlCi0jICBlbmRpZgotICAgewotICAgICBmcHJpbnRmKHN0ZGVyciwgImxpYnBuZyB3YXJuaW5nOiAlcyIsIHdhcm5pbmdfbWVzc2FnZSk7Ci0gICAgIGZwcmludGYoc3RkZXJyLCBQTkdfU1RSSU5HX05FV0xJTkUpOwotICAgfQotI2Vsc2UKLSAgIFBOR19VTlVTRUQod2FybmluZ19tZXNzYWdlKSAvKiBNYWtlIGNvbXBpbGVyIGhhcHB5ICovCi0jZW5kaWYKLSAgIFBOR19VTlVTRUQocG5nX3B0cikgLyogTWFrZSBjb21waWxlciBoYXBweSAqLwotfQotI2VuZGlmIC8qIFBOR19XQVJOSU5HU19TVVBQT1JURUQgKi8KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gd2FudHMgdG8gdXNlIGFub3RoZXIgbWV0aG9kCi0gKiBvZiBoYW5kbGluZyBlcnJvcnMgYW5kIHdhcm5pbmdzLiAgTm90ZSB0aGF0IHRoZSBlcnJvciBmdW5jdGlvbiBNVVNUIE5PVAotICogcmV0dXJuIHRvIHRoZSBjYWxsaW5nIHJvdXRpbmUgb3Igc2VyaW91cyBwcm9ibGVtcyB3aWxsIG9jY3VyLiAgVGhlIHJldHVybgotICogbWV0aG9kIHVzZWQgaW4gdGhlIGRlZmF1bHQgcm91dGluZSBjYWxscyBsb25nam1wKHBuZ19wdHItPmptcGJ1ZiwgMSkKLSAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfZXJyb3JfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIGVycm9yX3B0ciwKLSAgIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sIHBuZ19lcnJvcl9wdHIgd2FybmluZ19mbikKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcHRyLT5lcnJvcl9wdHIgPSBlcnJvcl9wdHI7Ci0gICBwbmdfcHRyLT5lcnJvcl9mbiA9IGVycm9yX2ZuOwotICAgcG5nX3B0ci0+d2FybmluZ19mbiA9IHdhcm5pbmdfZm47Ci19Ci0KLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZXJyb3JfcHRyIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlcgotICogZnVuY3Rpb25zLiAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBmcmVlIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAqIHBvaW50ZXIgYmVmb3JlIHBuZ193cml0ZV9kZXN0cm95IGFuZCBwbmdfcmVhZF9kZXN0cm95IGFyZSBjYWxsZWQuCi0gKi8KLXBuZ192b2lkcCBQTkdBUEkKLXBuZ19nZXRfZXJyb3JfcHRyKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICByZXR1cm4gKChwbmdfdm9pZHApcG5nX3B0ci0+ZXJyb3JfcHRyKTsKLX0KLQotCi0jaWZkZWYgUE5HX0VSUk9SX05VTUJFUlNfU1VQUE9SVEVECi12b2lkIFBOR0FQSQotcG5nX3NldF9zdHJpcF9lcnJvcl9udW1iZXJzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHN0cmlwX21vZGUpCi17Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMKQotICAgewotICAgICBwbmdfcHRyLT5mbGFncyAmPQotICAgICAgICgofihQTkdfRkxBR19TVFJJUF9FUlJPUl9OVU1CRVJTfFBOR19GTEFHX1NUUklQX0VSUk9SX1RFWFQpKSZzdHJpcF9tb2RlKTsKLSAgIH0KLX0KLSNlbmRpZgotI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCB8fCBQTkdfV1JJVEVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3BuZ2dldC5jIGIvc3JjL2xpYnBuZy9wbmdnZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1ZTI3Yy4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3BuZ2dldC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTMxICswLDAgQEAKLQotLyogcG5nZ2V0LmMgLSByZXRyaWV2YWwgb2YgdmFsdWVzIGZyb20gaW5mbyBzdHJ1Y3QKLSAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNC42IFtBcHJpbCA4LCAyMDExXQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTEgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSAqCi0gKi8KLQotI2RlZmluZSBQTkdfTk9fUEVEQU5USUNfV0FSTklOR1MKLSNpbmNsdWRlICJwbmcuaCIKLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQotI2luY2x1ZGUgInBuZ3ByaXYuaCIKLQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X3ZhbGlkKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0ciwKLSAgICBwbmdfdWludF8zMiBmbGFnKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotICAgICAgcmV0dXJuKGluZm9fcHRyLT52YWxpZCAmIGZsYWcpOwotCi0gICBlbHNlCi0gICAgICByZXR1cm4oMCk7Ci19Ci0KLXBuZ19zaXplX3QgUE5HQVBJCi1wbmdfZ2V0X3Jvd2J5dGVzKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKLSAgICAgIHJldHVybihpbmZvX3B0ci0+cm93Ynl0ZXMpOwotCi0gICBlbHNlCi0gICAgICByZXR1cm4oMCk7Ci19Ci0KLSNpZmRlZiBQTkdfSU5GT19JTUFHRV9TVVBQT1JURUQKLXBuZ19ieXRlcHAgUE5HQVBJCi1wbmdfZ2V0X3Jvd3MocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotICAgICAgcmV0dXJuKGluZm9fcHRyLT5yb3dfcG9pbnRlcnMpOwotCi0gICBlbHNlCi0gICAgICByZXR1cm4oMCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQKLS8qIEVhc3kgYWNjZXNzIHRvIGluZm8sIGFkZGVkIGluIGxpYnBuZy0wLjk5ICovCi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfaW1hZ2Vfd2lkdGgocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotICAgICAgcmV0dXJuIGluZm9fcHRyLT53aWR0aDsKLQotICAgcmV0dXJuICgwKTsKLX0KLQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X2ltYWdlX2hlaWdodChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCi0gICAgICByZXR1cm4gaW5mb19wdHItPmhlaWdodDsKLQotICAgcmV0dXJuICgwKTsKLX0KLQotcG5nX2J5dGUgUE5HQVBJCi1wbmdfZ2V0X2JpdF9kZXB0aChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCi0gICAgICByZXR1cm4gaW5mb19wdHItPmJpdF9kZXB0aDsKLQotICAgcmV0dXJuICgwKTsKLX0KLQotcG5nX2J5dGUgUE5HQVBJCi1wbmdfZ2V0X2NvbG9yX3R5cGUocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotICAgICAgcmV0dXJuIGluZm9fcHRyLT5jb2xvcl90eXBlOwotCi0gICByZXR1cm4gKDApOwotfQotCi1wbmdfYnl0ZSBQTkdBUEkKLXBuZ19nZXRfZmlsdGVyX3R5cGUocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotICAgICAgcmV0dXJuIGluZm9fcHRyLT5maWx0ZXJfdHlwZTsKLQotICAgcmV0dXJuICgwKTsKLX0KLQotcG5nX2J5dGUgUE5HQVBJCi1wbmdfZ2V0X2ludGVybGFjZV90eXBlKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKLSAgICAgIHJldHVybiBpbmZvX3B0ci0+aW50ZXJsYWNlX3R5cGU7Ci0KLSAgIHJldHVybiAoMCk7Ci19Ci0KLXBuZ19ieXRlIFBOR0FQSQotcG5nX2dldF9jb21wcmVzc2lvbl90eXBlKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKLSAgICAgIHJldHVybiBpbmZvX3B0ci0+Y29tcHJlc3Npb25fdHlwZTsKLQotICAgcmV0dXJuICgwKTsKLX0KLQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X3hfcGl4ZWxzX3Blcl9tZXRlcihwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCi0jaWZkZWYgUE5HX3BIWXNfU1VQUE9SVEVECi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fcEhZcykKLSAgIHsKLSAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9tZXRlciIpOwotCi0gICAgICBpZiAoaW5mb19wdHItPnBoeXNfdW5pdF90eXBlICE9IFBOR19SRVNPTFVUSU9OX01FVEVSKQotICAgICAgICAgIHJldHVybiAoMCk7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gKGluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdCk7Ci0gICB9Ci0jZWxzZQotICAgcmV0dXJuICgwKTsKLSNlbmRpZgotICAgcmV0dXJuICgwKTsKLX0KLQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlcihwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCi0jaWZkZWYgUE5HX3BIWXNfU1VQUE9SVEVECi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fcEhZcykKLSAgIHsKLSAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlciIpOwotCi0gICAgICBpZiAoaW5mb19wdHItPnBoeXNfdW5pdF90eXBlICE9IFBOR19SRVNPTFVUSU9OX01FVEVSKQotICAgICAgICAgIHJldHVybiAoMCk7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gKGluZm9fcHRyLT55X3BpeGVsc19wZXJfdW5pdCk7Ci0gICB9Ci0jZWxzZQotICAgcmV0dXJuICgwKTsKLSNlbmRpZgotICAgcmV0dXJuICgwKTsKLX0KLQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X3BpeGVsc19wZXJfbWV0ZXIocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotI2lmZGVmIFBOR19wSFlzX1NVUFBPUlRFRAotICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BIWXMpCi0gICB7Ci0gICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicG5nX2dldF9waXhlbHNfcGVyX21ldGVyIik7Ci0KLSAgICAgIGlmIChpbmZvX3B0ci0+cGh5c191bml0X3R5cGUgIT0gUE5HX1JFU09MVVRJT05fTUVURVIgfHwKLSAgICAgICAgIGluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdCAhPSBpbmZvX3B0ci0+eV9waXhlbHNfcGVyX3VuaXQpCi0gICAgICAgICAgcmV0dXJuICgwKTsKLQotICAgICAgZWxzZQotICAgICAgICAgIHJldHVybiAoaW5mb19wdHItPnhfcGl4ZWxzX3Blcl91bml0KTsKLSAgIH0KLSNlbHNlCi0gICByZXR1cm4gKDApOwotI2VuZGlmCi0gICByZXR1cm4gKDApOwotfQotCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotZmxvYXQgUE5HQVBJCi1wbmdfZ2V0X3BpeGVsX2FzcGVjdF9yYXRpbyhwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIpCi0gICB7Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCi0jaWZkZWYgUE5HX3BIWXNfU1VQUE9SVEVECi0KLSAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wSFlzKQotICAgewotICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInBuZ19nZXRfYXNwZWN0X3JhdGlvIik7Ci0KLSAgICAgIGlmIChpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQgPT0gMCkKLSAgICAgICAgIHJldHVybiAoKGZsb2F0KTAuMCk7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIHJldHVybiAoKGZsb2F0KSgoZmxvYXQpaW5mb19wdHItPnlfcGl4ZWxzX3Blcl91bml0Ci0gICAgICAgICAgICAvKGZsb2F0KWluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdCkpOwotICAgfQotI2Vsc2UKLSAgICAgIHJldHVybiAoMC4wKTsKLSNlbmRpZgotICAgcmV0dXJuICgoZmxvYXQpMC4wKTsKLX0KLSNlbmRpZgotCi1wbmdfaW50XzMyIFBOR0FQSQotcG5nX2dldF94X29mZnNldF9taWNyb25zKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKLSNpZmRlZiBQTkdfb0ZGc19TVVBQT1JURUQKLQotICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX29GRnMpCi0gICB7Ci0gICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicG5nX2dldF94X29mZnNldF9taWNyb25zIik7Ci0KLSAgICAgIGlmIChpbmZvX3B0ci0+b2Zmc2V0X3VuaXRfdHlwZSAhPSBQTkdfT0ZGU0VUX01JQ1JPTUVURVIpCi0gICAgICAgICAgcmV0dXJuICgwKTsKLQotICAgICAgZWxzZQotICAgICAgICAgIHJldHVybiAoaW5mb19wdHItPnhfb2Zmc2V0KTsKLSAgIH0KLSNlbHNlCi0gICAgICByZXR1cm4gKDApOwotI2VuZGlmCi0gICByZXR1cm4gKDApOwotfQotCi1wbmdfaW50XzMyIFBOR0FQSQotcG5nX2dldF95X29mZnNldF9taWNyb25zKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKLQotI2lmZGVmIFBOR19vRkZzX1NVUFBPUlRFRAotICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX29GRnMpCi0gICB7Ci0gICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicG5nX2dldF95X29mZnNldF9taWNyb25zIik7Ci0KLSAgICAgIGlmIChpbmZvX3B0ci0+b2Zmc2V0X3VuaXRfdHlwZSAhPSBQTkdfT0ZGU0VUX01JQ1JPTUVURVIpCi0gICAgICAgICAgcmV0dXJuICgwKTsKLQotICAgICAgZWxzZQotICAgICAgICAgIHJldHVybiAoaW5mb19wdHItPnlfb2Zmc2V0KTsKLSAgIH0KLSNlbHNlCi0gICByZXR1cm4gKDApOwotI2VuZGlmCi0gICByZXR1cm4gKDApOwotfQotCi1wbmdfaW50XzMyIFBOR0FQSQotcG5nX2dldF94X29mZnNldF9waXhlbHMocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotCi0jaWZkZWYgUE5HX29GRnNfU1VQUE9SVEVECi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fb0ZGcykKLSAgIHsKLSAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwbmdfZ2V0X3hfb2Zmc2V0X21pY3JvbnMiKTsKLQotICAgICAgaWYgKGluZm9fcHRyLT5vZmZzZXRfdW5pdF90eXBlICE9IFBOR19PRkZTRVRfUElYRUwpCi0gICAgICAgICAgcmV0dXJuICgwKTsKLQotICAgICAgZWxzZQotICAgICAgICAgIHJldHVybiAoaW5mb19wdHItPnhfb2Zmc2V0KTsKLSAgIH0KLSNlbHNlCi0gICByZXR1cm4gKDApOwotI2VuZGlmCi0gICByZXR1cm4gKDApOwotfQotCi1wbmdfaW50XzMyIFBOR0FQSQotcG5nX2dldF95X29mZnNldF9waXhlbHMocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotCi0jaWZkZWYgUE5HX29GRnNfU1VQUE9SVEVECi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fb0ZGcykKLSAgIHsKLSAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMiKTsKLQotICAgICAgaWYgKGluZm9fcHRyLT5vZmZzZXRfdW5pdF90eXBlICE9IFBOR19PRkZTRVRfUElYRUwpCi0gICAgICAgICAgcmV0dXJuICgwKTsKLQotICAgICAgZWxzZQotICAgICAgICAgIHJldHVybiAoaW5mb19wdHItPnlfb2Zmc2V0KTsKLSAgIH0KLSNlbHNlCi0gICByZXR1cm4gKDApOwotI2VuZGlmCi0gICByZXR1cm4gKDApOwotfQotCi0jaWYgZGVmaW5lZChQTkdfSU5DSF9DT05WRVJTSU9OUykgJiYgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X3BpeGVsc19wZXJfaW5jaChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIpCi17Ci0gICByZXR1cm4gKChwbmdfdWludF8zMikoKGZsb2F0KXBuZ19nZXRfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLCBpbmZvX3B0cikKLSAgICAgKi4wMjU0ICsuNSkpOwotfQotCi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfeF9waXhlbHNfcGVyX2luY2gocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKQotewotICAgcmV0dXJuICgocG5nX3VpbnRfMzIpKChmbG9hdClwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLCBpbmZvX3B0cikKLSAgICAgKi4wMjU0ICsuNSkpOwotfQotCi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfeV9waXhlbHNfcGVyX2luY2gocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKQotewotICAgcmV0dXJuICgocG5nX3VpbnRfMzIpKChmbG9hdClwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLCBpbmZvX3B0cikKLSAgICAgKi4wMjU0ICsuNSkpOwotfQotCi1mbG9hdCBQTkdBUEkKLXBuZ19nZXRfeF9vZmZzZXRfaW5jaGVzKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0cikKLXsKLSAgIHJldHVybiAoKGZsb2F0KXBuZ19nZXRfeF9vZmZzZXRfbWljcm9ucyhwbmdfcHRyLCBpbmZvX3B0cikKLSAgICAgKi4wMDAwMzkzNyk7Ci19Ci0KLWZsb2F0IFBOR0FQSQotcG5nX2dldF95X29mZnNldF9pbmNoZXMocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKQotewotICAgcmV0dXJuICgoZmxvYXQpcG5nX2dldF95X29mZnNldF9taWNyb25zKHBuZ19wdHIsIGluZm9fcHRyKQotICAgICAqLjAwMDAzOTM3KTsKLX0KLQotI2lmZGVmIFBOR19wSFlzX1NVUFBPUlRFRAotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X3BIWXNfZHBpKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ191aW50XzMyICpyZXNfeCwgcG5nX3VpbnRfMzIgKnJlc195LCBpbnQgKnVuaXRfdHlwZSkKLXsKLSAgIHBuZ191aW50XzMyIHJldHZhbCA9IDA7Ci0KLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fcEhZcykpCi0gICB7Ci0gICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicEhZcyIpOwotCi0gICAgICBpZiAocmVzX3ggIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgICpyZXNfeCA9IGluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdDsKLSAgICAgICAgIHJldHZhbCB8PSBQTkdfSU5GT19wSFlzOwotICAgICAgfQotICAgICAgaWYgKHJlc195ICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAqcmVzX3kgPSBpbmZvX3B0ci0+eV9waXhlbHNfcGVyX3VuaXQ7Ci0gICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsKLSAgICAgIH0KLSAgICAgIGlmICh1bml0X3R5cGUgIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgICp1bml0X3R5cGUgPSAoaW50KWluZm9fcHRyLT5waHlzX3VuaXRfdHlwZTsKLSAgICAgICAgIHJldHZhbCB8PSBQTkdfSU5GT19wSFlzOwotICAgICAgICAgaWYgKCp1bml0X3R5cGUgPT0gMSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZXNfeCAhPSBOVUxMKSAqcmVzX3ggPSAocG5nX3VpbnRfMzIpKCpyZXNfeCAqIC4wMjU0ICsgLjUwKTsKLSAgICAgICAgICAgIGlmIChyZXNfeSAhPSBOVUxMKSAqcmVzX3kgPSAocG5nX3VpbnRfMzIpKCpyZXNfeSAqIC4wMjU0ICsgLjUwKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLSAgIHJldHVybiAocmV0dmFsKTsKLX0KLSNlbmRpZiAvKiBQTkdfcEhZc19TVVBQT1JURUQgKi8KLSNlbmRpZiAgLyogUE5HX0lOQ0hfQ09OVkVSU0lPTlMgJiYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCAqLwotCi0vKiBwbmdfZ2V0X2NoYW5uZWxzIHJlYWxseSBiZWxvbmdzIGluIGhlcmUsIHRvbywgYnV0IGl0J3MgYmVlbiBhcm91bmQgbG9uZ2VyICovCi0KLSNlbmRpZiAgLyogUE5HX0VBU1lfQUNDRVNTX1NVUFBPUlRFRCAqLwotCi1wbmdfYnl0ZSBQTkdBUEkKLXBuZ19nZXRfY2hhbm5lbHMocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotICAgICAgcmV0dXJuKGluZm9fcHRyLT5jaGFubmVscyk7Ci0gICBlbHNlCi0gICAgICByZXR1cm4gKDApOwotfQotCi1wbmdfYnl0ZXAgUE5HQVBJCi1wbmdfZ2V0X3NpZ25hdHVyZShwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCi0gICAgICByZXR1cm4oaW5mb19wdHItPnNpZ25hdHVyZSk7Ci0gICBlbHNlCi0gICAgICByZXR1cm4gKE5VTEwpOwotfQotCi0jaWZkZWYgUE5HX2JLR0RfU1VQUE9SVEVECi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfYktHRChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfY29sb3JfMTZwICpiYWNrZ3JvdW5kKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19iS0dEKQotICAgICAgJiYgYmFja2dyb3VuZCAhPSBOVUxMKQotICAgewotICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgImJLR0QiKTsKLQotICAgICAgKmJhY2tncm91bmQgPSAmKGluZm9fcHRyLT5iYWNrZ3JvdW5kKTsKLSAgICAgIHJldHVybiAoUE5HX0lORk9fYktHRCk7Ci0gICB9Ci0gICByZXR1cm4gKDApOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfY0hSTV9TVVBQT1JURUQKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfY0hSTShwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIsCi0gICBkb3VibGUgKndoaXRlX3gsIGRvdWJsZSAqd2hpdGVfeSwgZG91YmxlICpyZWRfeCwgZG91YmxlICpyZWRfeSwKLSAgIGRvdWJsZSAqZ3JlZW5feCwgZG91YmxlICpncmVlbl95LCBkb3VibGUgKmJsdWVfeCwgZG91YmxlICpibHVlX3kpCi17Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2NIUk0pKQotICAgewotICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgImNIUk0iKTsKLQotICAgICAgaWYgKHdoaXRlX3ggIT0gTlVMTCkKLSAgICAgICAgICp3aGl0ZV94ID0gKGRvdWJsZSlpbmZvX3B0ci0+eF93aGl0ZTsKLSAgICAgIGlmICh3aGl0ZV95ICE9IE5VTEwpCi0gICAgICAgICAqd2hpdGVfeSA9IChkb3VibGUpaW5mb19wdHItPnlfd2hpdGU7Ci0gICAgICBpZiAocmVkX3ggIT0gTlVMTCkKLSAgICAgICAgICpyZWRfeCA9IChkb3VibGUpaW5mb19wdHItPnhfcmVkOwotICAgICAgaWYgKHJlZF95ICE9IE5VTEwpCi0gICAgICAgICAqcmVkX3kgPSAoZG91YmxlKWluZm9fcHRyLT55X3JlZDsKLSAgICAgIGlmIChncmVlbl94ICE9IE5VTEwpCi0gICAgICAgICAqZ3JlZW5feCA9IChkb3VibGUpaW5mb19wdHItPnhfZ3JlZW47Ci0gICAgICBpZiAoZ3JlZW5feSAhPSBOVUxMKQotICAgICAgICAgKmdyZWVuX3kgPSAoZG91YmxlKWluZm9fcHRyLT55X2dyZWVuOwotICAgICAgaWYgKGJsdWVfeCAhPSBOVUxMKQotICAgICAgICAgKmJsdWVfeCA9IChkb3VibGUpaW5mb19wdHItPnhfYmx1ZTsKLSAgICAgIGlmIChibHVlX3kgIT0gTlVMTCkKLSAgICAgICAgICpibHVlX3kgPSAoZG91YmxlKWluZm9fcHRyLT55X2JsdWU7Ci0gICAgICByZXR1cm4gKFBOR19JTkZPX2NIUk0pOwotICAgfQotICAgcmV0dXJuICgwKTsKLX0KLSNlbmRpZgotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9jSFJNX2ZpeGVkKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ19maXhlZF9wb2ludCAqd2hpdGVfeCwgcG5nX2ZpeGVkX3BvaW50ICp3aGl0ZV95LCBwbmdfZml4ZWRfcG9pbnQgKnJlZF94LAotICAgcG5nX2ZpeGVkX3BvaW50ICpyZWRfeSwgcG5nX2ZpeGVkX3BvaW50ICpncmVlbl94LCBwbmdfZml4ZWRfcG9pbnQgKmdyZWVuX3ksCi0gICBwbmdfZml4ZWRfcG9pbnQgKmJsdWVfeCwgcG5nX2ZpeGVkX3BvaW50ICpibHVlX3kpCi17Ci0gICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiY0hSTSIpOwotCi0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2NIUk0pKQotICAgewotICAgICAgaWYgKHdoaXRlX3ggIT0gTlVMTCkKLSAgICAgICAgICp3aGl0ZV94ID0gaW5mb19wdHItPmludF94X3doaXRlOwotICAgICAgaWYgKHdoaXRlX3kgIT0gTlVMTCkKLSAgICAgICAgICp3aGl0ZV95ID0gaW5mb19wdHItPmludF95X3doaXRlOwotICAgICAgaWYgKHJlZF94ICE9IE5VTEwpCi0gICAgICAgICAqcmVkX3ggPSBpbmZvX3B0ci0+aW50X3hfcmVkOwotICAgICAgaWYgKHJlZF95ICE9IE5VTEwpCi0gICAgICAgICAqcmVkX3kgPSBpbmZvX3B0ci0+aW50X3lfcmVkOwotICAgICAgaWYgKGdyZWVuX3ggIT0gTlVMTCkKLSAgICAgICAgICpncmVlbl94ID0gaW5mb19wdHItPmludF94X2dyZWVuOwotICAgICAgaWYgKGdyZWVuX3kgIT0gTlVMTCkKLSAgICAgICAgICpncmVlbl95ID0gaW5mb19wdHItPmludF95X2dyZWVuOwotICAgICAgaWYgKGJsdWVfeCAhPSBOVUxMKQotICAgICAgICAgKmJsdWVfeCA9IGluZm9fcHRyLT5pbnRfeF9ibHVlOwotICAgICAgaWYgKGJsdWVfeSAhPSBOVUxMKQotICAgICAgICAgKmJsdWVfeSA9IGluZm9fcHRyLT5pbnRfeV9ibHVlOwotICAgICAgcmV0dXJuIChQTkdfSU5GT19jSFJNKTsKLSAgIH0KLSAgIHJldHVybiAoMCk7Ci19Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgUE5HX2dBTUFfU1VQUE9SVEVECi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X2dBTUEocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyLCBkb3VibGUgKmZpbGVfZ2FtbWEpCi17Ci0gICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiZ0FNQSIpOwotCi0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2dBTUEpCi0gICAgICAmJiBmaWxlX2dhbW1hICE9IE5VTEwpCi0gICB7Ci0gICAgICAqZmlsZV9nYW1tYSA9IChkb3VibGUpaW5mb19wdHItPmdhbW1hOwotICAgICAgcmV0dXJuIChQTkdfSU5GT19nQU1BKTsKLSAgIH0KLSAgIHJldHVybiAoMCk7Ci19Ci0jZW5kaWYKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfZ0FNQV9maXhlZChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIsCi0gICAgcG5nX2ZpeGVkX3BvaW50ICppbnRfZmlsZV9nYW1tYSkKLXsKLSAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJnQU1BIik7Ci0KLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fZ0FNQSkKLSAgICAgICYmIGludF9maWxlX2dhbW1hICE9IE5VTEwpCi0gICB7Ci0gICAgICAqaW50X2ZpbGVfZ2FtbWEgPSBpbmZvX3B0ci0+aW50X2dhbW1hOwotICAgICAgcmV0dXJuIChQTkdfSU5GT19nQU1BKTsKLSAgIH0KLSAgIHJldHVybiAoMCk7Ci19Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgUE5HX3NSR0JfU1VQUE9SVEVECi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfc1JHQihwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIsCi0gICAgaW50ICpmaWxlX3NyZ2JfaW50ZW50KQotewotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInNSR0IiKTsKLQotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zUkdCKQotICAgICAgJiYgZmlsZV9zcmdiX2ludGVudCAhPSBOVUxMKQotICAgewotICAgICAgKmZpbGVfc3JnYl9pbnRlbnQgPSAoaW50KWluZm9fcHRyLT5zcmdiX2ludGVudDsKLSAgICAgIHJldHVybiAoUE5HX0lORk9fc1JHQik7Ci0gICB9Ci0gICByZXR1cm4gKDApOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfaUNDUF9TVVBQT1JURUQKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9pQ0NQKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0ciwKLSAgICAgICAgICAgICBwbmdfY2hhcnBwIG5hbWUsIGludCAqY29tcHJlc3Npb25fdHlwZSwKLSAgICAgICAgICAgICBwbmdfY2hhcnBwIHByb2ZpbGUsIHBuZ191aW50XzMyICpwcm9mbGVuKQotewotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgImlDQ1AiKTsKLQotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19pQ0NQKQotICAgICAgJiYgbmFtZSAhPSBOVUxMICYmIHByb2ZpbGUgIT0gTlVMTCAmJiBwcm9mbGVuICE9IE5VTEwpCi0gICB7Ci0gICAgICAqbmFtZSA9IGluZm9fcHRyLT5pY2NwX25hbWU7Ci0gICAgICAqcHJvZmlsZSA9IGluZm9fcHRyLT5pY2NwX3Byb2ZpbGU7Ci0gICAgICAvKiBDb21wcmVzc2lvbl90eXBlIGlzIGEgZHVtbXkgc28gdGhlIEFQSSB3b24ndCBoYXZlIHRvIGNoYW5nZQotICAgICAgICogaWYgd2UgaW50cm9kdWNlIG11bHRpcGxlIGNvbXByZXNzaW9uIHR5cGVzIGxhdGVyLgotICAgICAgICovCi0gICAgICAqcHJvZmxlbiA9IChpbnQpaW5mb19wdHItPmljY3BfcHJvZmxlbjsKLSAgICAgICpjb21wcmVzc2lvbl90eXBlID0gKGludClpbmZvX3B0ci0+aWNjcF9jb21wcmVzc2lvbjsKLSAgICAgIHJldHVybiAoUE5HX0lORk9faUNDUCk7Ci0gICB9Ci0gICByZXR1cm4gKDApOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfc1BMVF9TVVBQT1JURUQKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9zUExUKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0ciwKLSAgICAgICAgICAgICBwbmdfc1BMVF90cHAgc3BhbGV0dGVzKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIHNwYWxldHRlcyAhPSBOVUxMKQotICAgewotICAgICAqc3BhbGV0dGVzID0gaW5mb19wdHItPnNwbHRfcGFsZXR0ZXM7Ci0gICAgIHJldHVybiAoKHBuZ191aW50XzMyKWluZm9fcHRyLT5zcGx0X3BhbGV0dGVzX251bSk7Ci0gICB9Ci0gICByZXR1cm4gKDApOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfaElTVF9TVVBQT1JURUQKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9oSVNUKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0ciwKLSAgICBwbmdfdWludF8xNnAgKmhpc3QpCi17Ci0gICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiaElTVCIpOwotCi0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2hJU1QpCi0gICAgICAmJiBoaXN0ICE9IE5VTEwpCi0gICB7Ci0gICAgICAqaGlzdCA9IGluZm9fcHRyLT5oaXN0OwotICAgICAgcmV0dXJuIChQTkdfSU5GT19oSVNUKTsKLSAgIH0KLSAgIHJldHVybiAoMCk7Ci19Ci0jZW5kaWYKLQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X0lIRFIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX3VpbnRfMzIgKndpZHRoLCBwbmdfdWludF8zMiAqaGVpZ2h0LCBpbnQgKmJpdF9kZXB0aCwKLSAgIGludCAqY29sb3JfdHlwZSwgaW50ICppbnRlcmxhY2VfdHlwZSwgaW50ICpjb21wcmVzc2lvbl90eXBlLAotICAgaW50ICpmaWx0ZXJfdHlwZSkKLQotewotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgIklIRFIiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMIHx8IHdpZHRoID09IE5VTEwgfHwKLSAgICAgICBoZWlnaHQgPT0gTlVMTCB8fCBiaXRfZGVwdGggPT0gTlVMTCB8fCBjb2xvcl90eXBlID09IE5VTEwpCi0gICAgICByZXR1cm4gKDApOwotCi0gICAqd2lkdGggPSBpbmZvX3B0ci0+d2lkdGg7Ci0gICAqaGVpZ2h0ID0gaW5mb19wdHItPmhlaWdodDsKLSAgICpiaXRfZGVwdGggPSBpbmZvX3B0ci0+Yml0X2RlcHRoOwotICAgKmNvbG9yX3R5cGUgPSBpbmZvX3B0ci0+Y29sb3JfdHlwZTsKLQotICAgaWYgKGNvbXByZXNzaW9uX3R5cGUgIT0gTlVMTCkKLSAgICAgICpjb21wcmVzc2lvbl90eXBlID0gaW5mb19wdHItPmNvbXByZXNzaW9uX3R5cGU7Ci0KLSAgIGlmIChmaWx0ZXJfdHlwZSAhPSBOVUxMKQotICAgICAgKmZpbHRlcl90eXBlID0gaW5mb19wdHItPmZpbHRlcl90eXBlOwotCi0gICBpZiAoaW50ZXJsYWNlX3R5cGUgIT0gTlVMTCkKLSAgICAgICppbnRlcmxhY2VfdHlwZSA9IGluZm9fcHRyLT5pbnRlcmxhY2VfdHlwZTsKLQotICAgLyogVGhpcyBpcyByZWR1bmRhbnQgaWYgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgaW5mb19wdHIgdmFsdWVzIHdlcmUgYWxsCi0gICAgKiBhc3NpZ25lZCBpbiBwbmdfc2V0X0lIRFIoKS4gIFdlIGRvIHRoZSBjaGVjayBhbnlob3cgaW4gY2FzZSBhbgotICAgICogYXBwbGljYXRpb24gaGFzIGlnbm9yZWQgb3VyIGFkdmljZSBub3QgdG8gbWVzcyB3aXRoIHRoZSBtZW1iZXJzCi0gICAgKiBvZiBpbmZvX3B0ciBkaXJlY3RseS4KLSAgICAqLwotICAgcG5nX2NoZWNrX0lIRFIgKHBuZ19wdHIsIGluZm9fcHRyLT53aWR0aCwgaW5mb19wdHItPmhlaWdodCwKLSAgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoLCBpbmZvX3B0ci0+Y29sb3JfdHlwZSwgaW5mb19wdHItPmludGVybGFjZV90eXBlLAotICAgICAgIGluZm9fcHRyLT5jb21wcmVzc2lvbl90eXBlLCBpbmZvX3B0ci0+ZmlsdGVyX3R5cGUpOwotCi0gICByZXR1cm4gKDEpOwotfQotCi0jaWZkZWYgUE5HX29GRnNfU1VQUE9SVEVECi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfb0ZGcyhwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfaW50XzMyICpvZmZzZXRfeCwgcG5nX2ludF8zMiAqb2Zmc2V0X3ksIGludCAqdW5pdF90eXBlKQotewotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgIm9GRnMiKTsKLQotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19vRkZzKQotICAgICAgJiYgb2Zmc2V0X3ggIT0gTlVMTCAmJiBvZmZzZXRfeSAhPSBOVUxMICYmIHVuaXRfdHlwZSAhPSBOVUxMKQotICAgewotICAgICAgKm9mZnNldF94ID0gaW5mb19wdHItPnhfb2Zmc2V0OwotICAgICAgKm9mZnNldF95ID0gaW5mb19wdHItPnlfb2Zmc2V0OwotICAgICAgKnVuaXRfdHlwZSA9IChpbnQpaW5mb19wdHItPm9mZnNldF91bml0X3R5cGU7Ci0gICAgICByZXR1cm4gKFBOR19JTkZPX29GRnMpOwotICAgfQotICAgcmV0dXJuICgwKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX3BDQUxfU1VQUE9SVEVECi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfcENBTChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfY2hhcnAgKnB1cnBvc2UsIHBuZ19pbnRfMzIgKlgwLCBwbmdfaW50XzMyICpYMSwgaW50ICp0eXBlLCBpbnQgKm5wYXJhbXMsCi0gICBwbmdfY2hhcnAgKnVuaXRzLCBwbmdfY2hhcnBwICpwYXJhbXMpCi17Ci0gICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicENBTCIpOwotCi0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BDQUwpCi0gICAgICAgJiYgcHVycG9zZSAhPSBOVUxMICYmIFgwICE9IE5VTEwgJiYgWDEgIT0gTlVMTCAmJiB0eXBlICE9IE5VTEwgJiYKLSAgICAgICBucGFyYW1zICE9IE5VTEwgJiYgdW5pdHMgIT0gTlVMTCAmJiBwYXJhbXMgIT0gTlVMTCkKLSAgIHsKLSAgICAgICpwdXJwb3NlID0gaW5mb19wdHItPnBjYWxfcHVycG9zZTsKLSAgICAgICpYMCA9IGluZm9fcHRyLT5wY2FsX1gwOwotICAgICAgKlgxID0gaW5mb19wdHItPnBjYWxfWDE7Ci0gICAgICAqdHlwZSA9IChpbnQpaW5mb19wdHItPnBjYWxfdHlwZTsKLSAgICAgICpucGFyYW1zID0gKGludClpbmZvX3B0ci0+cGNhbF9ucGFyYW1zOwotICAgICAgKnVuaXRzID0gaW5mb19wdHItPnBjYWxfdW5pdHM7Ci0gICAgICAqcGFyYW1zID0gaW5mb19wdHItPnBjYWxfcGFyYW1zOwotICAgICAgcmV0dXJuIChQTkdfSU5GT19wQ0FMKTsKLSAgIH0KLSAgIHJldHVybiAoMCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19zQ0FMX1NVUFBPUlRFRAotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9zQ0FMKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0ciwKLSAgICAgICAgICAgICBpbnQgKnVuaXQsIGRvdWJsZSAqd2lkdGgsIGRvdWJsZSAqaGVpZ2h0KQotewotICAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgotICAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc0NBTCkpCi0gICAgewotICAgICAgICAqdW5pdCA9IGluZm9fcHRyLT5zY2FsX3VuaXQ7Ci0gICAgICAgICp3aWR0aCA9IGluZm9fcHRyLT5zY2FsX3BpeGVsX3dpZHRoOwotICAgICAgICAqaGVpZ2h0ID0gaW5mb19wdHItPnNjYWxfcGl4ZWxfaGVpZ2h0OwotICAgICAgICByZXR1cm4gKFBOR19JTkZPX3NDQUwpOwotICAgIH0KLSAgICByZXR1cm4oMCk7Ci19Ci0jZWxzZQotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9zQ0FMX3MocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyLAotICAgICAgICAgICAgIGludCAqdW5pdCwgcG5nX2NoYXJwcCB3aWR0aCwgcG5nX2NoYXJwcCBoZWlnaHQpCi17Ci0gICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmCi0gICAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zQ0FMKSkKLSAgICB7Ci0gICAgICAgICp1bml0ID0gaW5mb19wdHItPnNjYWxfdW5pdDsKLSAgICAgICAgKndpZHRoID0gaW5mb19wdHItPnNjYWxfc193aWR0aDsKLSAgICAgICAgKmhlaWdodCA9IGluZm9fcHRyLT5zY2FsX3NfaGVpZ2h0OwotICAgICAgICByZXR1cm4gKFBOR19JTkZPX3NDQUwpOwotICAgIH0KLSAgICByZXR1cm4oMCk7Ci19Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBQTkdfcEhZc19TVVBQT1JURUQKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9wSFlzKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ191aW50XzMyICpyZXNfeCwgcG5nX3VpbnRfMzIgKnJlc195LCBpbnQgKnVuaXRfdHlwZSkKLXsKLSAgIHBuZ191aW50XzMyIHJldHZhbCA9IDA7Ci0KLSAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwSFlzIik7Ci0KLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgotICAgICAgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BIWXMpKQotICAgewotICAgICAgaWYgKHJlc194ICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAqcmVzX3ggPSBpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQ7Ci0gICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsKLSAgICAgIH0KLQotICAgICAgaWYgKHJlc195ICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAqcmVzX3kgPSBpbmZvX3B0ci0+eV9waXhlbHNfcGVyX3VuaXQ7Ci0gICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsKLSAgICAgIH0KLQotICAgICAgaWYgKHVuaXRfdHlwZSAhPSBOVUxMKQotICAgICAgewotICAgICAgICAgKnVuaXRfdHlwZSA9IChpbnQpaW5mb19wdHItPnBoeXNfdW5pdF90eXBlOwotICAgICAgICAgcmV0dmFsIHw9IFBOR19JTkZPX3BIWXM7Ci0gICAgICB9Ci0gICB9Ci0gICByZXR1cm4gKHJldHZhbCk7Ci19Ci0jZW5kaWYKLQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X1BMVEUocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyLAotICAgIHBuZ19jb2xvcnAgKnBhbGV0dGUsCi0gICBpbnQgKm51bV9wYWxldHRlKQotewotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgIlBMVEUiKTsKLQotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19QTFRFKQotICAgICAgICYmIHBhbGV0dGUgIT0gTlVMTCkKLSAgIHsKLSAgICAgICpwYWxldHRlID0gaW5mb19wdHItPnBhbGV0dGU7Ci0gICAgICAqbnVtX3BhbGV0dGUgPSBpbmZvX3B0ci0+bnVtX3BhbGV0dGU7Ci0gICAgICBwbmdfZGVidWcxKDMsICJudW1fcGFsZXR0ZSA9ICVkIiwgKm51bV9wYWxldHRlKTsKLSAgICAgIHJldHVybiAoUE5HX0lORk9fUExURSk7Ci0gICB9Ci0gICByZXR1cm4gKDApOwotfQotCi0jaWZkZWYgUE5HX3NCSVRfU1VQUE9SVEVECi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfc0JJVChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICAgcG5nX2NvbG9yXzhwICpzaWdfYml0KQotewotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInNCSVQiKTsKLQotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zQklUKQotICAgICAgJiYgc2lnX2JpdCAhPSBOVUxMKQotICAgewotICAgICAgKnNpZ19iaXQgPSAmKGluZm9fcHRyLT5zaWdfYml0KTsKLSAgICAgIHJldHVybiAoUE5HX0lORk9fc0JJVCk7Ci0gICB9Ci0gICByZXR1cm4gKDApOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF90ZXh0KHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0ciwKLSAgICBwbmdfdGV4dHAgKnRleHRfcHRyLCBpbnQgKm51bV90ZXh0KQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyLT5udW1fdGV4dCA+IDApCi0gICB7Ci0gICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLAotICAgICAgICAgKHBuZ19wdHItPmNodW5rX25hbWVbMF0gPT0gJ1wwJyA/ICJ0ZXh0IgotICAgICAgICAgICAgIDogKHBuZ19jb25zdF9jaGFycClwbmdfcHRyLT5jaHVua19uYW1lKSk7Ci0KLSAgICAgIGlmICh0ZXh0X3B0ciAhPSBOVUxMKQotICAgICAgICAgKnRleHRfcHRyID0gaW5mb19wdHItPnRleHQ7Ci0KLSAgICAgIGlmIChudW1fdGV4dCAhPSBOVUxMKQotICAgICAgICAgKm51bV90ZXh0ID0gaW5mb19wdHItPm51bV90ZXh0OwotCi0gICAgICByZXR1cm4gKChwbmdfdWludF8zMilpbmZvX3B0ci0+bnVtX3RleHQpOwotICAgfQotICAgaWYgKG51bV90ZXh0ICE9IE5VTEwpCi0gICAgICpudW1fdGV4dCA9IDA7Ci0gICByZXR1cm4oMCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR190SU1FX1NVUFBPUlRFRAotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X3RJTUUocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgIHBuZ190aW1lcCAqbW9kX3RpbWUpCi17Ci0gICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAidElNRSIpOwotCi0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3RJTUUpCi0gICAgICAgJiYgbW9kX3RpbWUgIT0gTlVMTCkKLSAgIHsKLSAgICAgICptb2RfdGltZSA9ICYoaW5mb19wdHItPm1vZF90aW1lKTsKLSAgICAgIHJldHVybiAoUE5HX0lORk9fdElNRSk7Ci0gICB9Ci0gICByZXR1cm4gKDApOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfdFJOU19TVVBQT1JURUQKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF90Uk5TKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ19ieXRlcCAqdHJhbnNfYWxwaGEsIGludCAqbnVtX3RyYW5zLCBwbmdfY29sb3JfMTZwICp0cmFuc19jb2xvcikKLXsKLSAgIHBuZ191aW50XzMyIHJldHZhbCA9IDA7Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3RSTlMpKQotICAgewotICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInRSTlMiKTsKLQotICAgICAgaWYgKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICB7Ci0gICAgICAgICAgaWYgKHRyYW5zX2FscGhhICE9IE5VTEwpCi0gICAgICAgICAgewotICAgICAgICAgICAgICp0cmFuc19hbHBoYSA9IGluZm9fcHRyLT50cmFuc19hbHBoYTsKLSAgICAgICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fdFJOUzsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAodHJhbnNfY29sb3IgIT0gTlVMTCkKLSAgICAgICAgICAgICAqdHJhbnNfY29sb3IgPSAmKGluZm9fcHRyLT50cmFuc19jb2xvcik7Ci0gICAgICB9Ci0gICAgICBlbHNlIC8qIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSAhPSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKSAqLwotICAgICAgewotICAgICAgICAgIGlmICh0cmFuc19jb2xvciAhPSBOVUxMKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAqdHJhbnNfY29sb3IgPSAmKGluZm9fcHRyLT50cmFuc19jb2xvcik7Ci0gICAgICAgICAgICAgcmV0dmFsIHw9IFBOR19JTkZPX3RSTlM7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKHRyYW5zX2FscGhhICE9IE5VTEwpCi0gICAgICAgICAgICAgKnRyYW5zX2FscGhhID0gTlVMTDsKLSAgICAgIH0KLSAgICAgIGlmIChudW1fdHJhbnMgIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgICpudW1fdHJhbnMgPSBpbmZvX3B0ci0+bnVtX3RyYW5zOwotICAgICAgICAgcmV0dmFsIHw9IFBOR19JTkZPX3RSTlM7Ci0gICAgICB9Ci0gICB9Ci0gICByZXR1cm4gKHJldHZhbCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF91bmtub3duX2NodW5rcyhwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3AgaW5mb19wdHIsCi0gICAgICAgICAgICAgcG5nX3Vua25vd25fY2h1bmtwcCB1bmtub3ducykKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiB1bmtub3ducyAhPSBOVUxMKQotICAgewotICAgICAqdW5rbm93bnMgPSBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3M7Ci0gICAgIHJldHVybiAoKHBuZ191aW50XzMyKWluZm9fcHRyLT51bmtub3duX2NodW5rc19udW0pOwotICAgfQotICAgcmV0dXJuICgwKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVECi1wbmdfYnl0ZSBQTkdBUEkKLXBuZ19nZXRfcmdiX3RvX2dyYXlfc3RhdHVzKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICByZXR1cm4gKHBuZ19ieXRlKShwbmdfcHRyPyBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9zdGF0dXMgOiAwKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1VTRVJfQ0hVTktTX1NVUFBPUlRFRAotcG5nX3ZvaWRwIFBOR0FQSQotcG5nX2dldF91c2VyX2NodW5rX3B0cihwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyKQotewotICAgcmV0dXJuIChwbmdfcHRyPyBwbmdfcHRyLT51c2VyX2NodW5rX3B0ciA6IE5VTEwpOwotfQotI2VuZGlmCi0KLXBuZ19zaXplX3QgUE5HQVBJCi1wbmdfZ2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICByZXR1cm4gKHBuZ19wdHIgPyBwbmdfcHRyLT56YnVmX3NpemUgOiAwTCk7Ci19Ci0KLQotI2lmZGVmIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECi0vKiBUaGVzZSBmdW5jdGlvbnMgd2VyZSBhZGRlZCB0byBsaWJwbmcgMS4yLjYgYW5kIHdlcmUgZW5hYmxlZAotICogYnkgZGVmYXVsdCBpbiBsaWJwbmctMS40LjAgKi8KLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF91c2VyX3dpZHRoX21heChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyKQotewotICAgIHJldHVybiAocG5nX3B0cj8gcG5nX3B0ci0+dXNlcl93aWR0aF9tYXggOiAwKTsKLX0KLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF91c2VyX2hlaWdodF9tYXgocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgICByZXR1cm4gKHBuZ19wdHI/IHBuZ19wdHItPnVzZXJfaGVpZ2h0X21heCA6IDApOwotfQotLyogVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gbGlicG5nIDEuNC4wICovCi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfY2h1bmtfY2FjaGVfbWF4KHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICAgcmV0dXJuIChwbmdfcHRyPyBwbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCA6IDApOwotfQotLyogVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gbGlicG5nIDEuNC4xICovCi1wbmdfYWxsb2Nfc2l6ZV90IFBOR0FQSQotcG5nX2dldF9jaHVua19tYWxsb2NfbWF4KHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICAgcmV0dXJuIChwbmdfcHRyPwotICAgICAgIHBuZ19wdHItPnVzZXJfY2h1bmtfbWFsbG9jX21heCA6IDApOwotfQotI2VuZGlmIC8qID9QTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRCAqLwotCi0vKiBUaGVzZSBmdW5jdGlvbnMgd2VyZSBhZGRlZCB0byBsaWJwbmcgMS40LjAgKi8KLSNpZmRlZiBQTkdfSU9fU1RBVEVfU1VQUE9SVEVECi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfaW9fc3RhdGUocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgICByZXR1cm4gcG5nX3B0ci0+aW9fc3RhdGU7Ci19Ci0KLXBuZ19ieXRlcCBQTkdBUEkKLXBuZ19nZXRfaW9fY2h1bmtfbmFtZShwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcmV0dXJuIHBuZ19wdHItPmNodW5rX25hbWU7Ci19Ci0jZW5kaWYgLyogP1BOR19JT19TVEFURV9TVVBQT1JURUQgKi8KLQotI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCB8fCBQTkdfV1JJVEVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3BuZ21lbS5jIGIvc3JjL2xpYnBuZy9wbmdtZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYwMGNmZi4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3BuZ21lbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjExICswLDAgQEAKLQotLyogcG5nbWVtLmMgLSBzdHViIGZ1bmN0aW9ucyBmb3IgbWVtb3J5IGFsbG9jYXRpb24KLSAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNC42IFtBcHJpbCA4LCAyMDExXQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTEgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSAqCi0gKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSBsb2NhdGlvbiBmb3IgYWxsIG1lbW9yeSBhbGxvY2F0aW9uLiAgVXNlcnMgd2hvCi0gKiBuZWVkIHNwZWNpYWwgbWVtb3J5IGhhbmRsaW5nIGFyZSBleHBlY3RlZCB0byBzdXBwbHkgcmVwbGFjZW1lbnQKLSAqIGZ1bmN0aW9ucyBmb3IgcG5nX21hbGxvYygpIGFuZCBwbmdfZnJlZSgpLCBhbmQgdG8gdXNlCi0gKiBwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIoKSBhbmQgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMigpIHRvCi0gKiBpZGVudGlmeSB0aGUgcmVwbGFjZW1lbnQgZnVuY3Rpb25zLgotICovCi0KLSNkZWZpbmUgUE5HX05PX1BFREFOVElDX1dBUk5JTkdTCi0jaW5jbHVkZSAicG5nLmgiCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkKLSNpbmNsdWRlICJwbmdwcml2LmgiCi0KLS8qIEJvcmxhbmQgRE9TIHNwZWNpYWwgbWVtb3J5IGhhbmRsZXIgKi8KLSNpZiBkZWZpbmVkKF9fVFVSQk9DX18pICYmICFkZWZpbmVkKF9XaW5kb3dzKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykKLS8qIElmIHlvdSBjaGFuZ2UgdGhpcywgYmUgc3VyZSB0byBjaGFuZ2UgdGhlIG9uZSBpbiBwbmcuaCBhbHNvICovCi0KLS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYSBwbmdfc3RydWN0LiAgVGhlIG1hbGxvYyBhbmQgbWVtc2V0IGNhbiBiZSByZXBsYWNlZAotICAgYnkgYSBzaW5nbGUgY2FsbCB0byBjYWxsb2MoKSBpZiB0aGlzIGlzIHRob3VnaHQgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4gKi8KLXBuZ192b2lkcCAvKiBQUklWQVRFICovCi1wbmdfY3JlYXRlX3N0cnVjdChpbnQgdHlwZSkKLXsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICByZXR1cm4gKHBuZ19jcmVhdGVfc3RydWN0XzIodHlwZSwgTlVMTCwgTlVMTCkpOwotfQotCi0vKiBBbHRlcm5hdGUgdmVyc2lvbiBvZiBwbmdfY3JlYXRlX3N0cnVjdCwgZm9yIHVzZSB3aXRoIHVzZXItZGVmaW5lZCBtYWxsb2MuICovCi1wbmdfdm9pZHAgLyogUFJJVkFURSAqLwotcG5nX2NyZWF0ZV9zdHJ1Y3RfMihpbnQgdHlwZSwgcG5nX21hbGxvY19wdHIgbWFsbG9jX2ZuLCBwbmdfdm9pZHAgbWVtX3B0cikKLXsKLSNlbmRpZiAvKiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEICovCi0gICBwbmdfc2l6ZV90IHNpemU7Ci0gICBwbmdfdm9pZHAgc3RydWN0X3B0cjsKLQotICAgaWYgKHR5cGUgPT0gUE5HX1NUUlVDVF9JTkZPKQotICAgICAgc2l6ZSA9IHBuZ19zaXplb2YocG5nX2luZm8pOwotICAgZWxzZSBpZiAodHlwZSA9PSBQTkdfU1RSVUNUX1BORykKLSAgICAgIHNpemUgPSBwbmdfc2l6ZW9mKHBuZ19zdHJ1Y3QpOwotICAgZWxzZQotICAgICAgcmV0dXJuIChwbmdfZ2V0X2NvcHlyaWdodChOVUxMKSk7Ci0KLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBpZiAobWFsbG9jX2ZuICE9IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfc3RydWN0IGR1bW15X3N0cnVjdDsKLSAgICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSAmZHVtbXlfc3RydWN0OwotICAgICAgcG5nX3B0ci0+bWVtX3B0cj1tZW1fcHRyOwotICAgICAgc3RydWN0X3B0ciA9ICgqKG1hbGxvY19mbikpKHBuZ19wdHIsIChwbmdfdWludF8zMilzaXplKTsKLSAgIH0KLSAgIGVsc2UKLSNlbmRpZiAvKiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEICovCi0gICBzdHJ1Y3RfcHRyID0gKHBuZ192b2lkcClmYXJtYWxsb2Moc2l6ZSk7Ci0gICBpZiAoc3RydWN0X3B0ciAhPSBOVUxMKQotICAgICAgcG5nX21lbXNldChzdHJ1Y3RfcHRyLCAwLCBzaXplKTsKLSAgIHJldHVybiAoc3RydWN0X3B0cik7Ci19Ci0KLS8qIEZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSBhIHBuZ19jcmVhdGVfc3RydWN0KCkgY2FsbCAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZGVzdHJveV9zdHJ1Y3QocG5nX3ZvaWRwIHN0cnVjdF9wdHIpCi17Ci0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgcG5nX2Rlc3Ryb3lfc3RydWN0XzIoc3RydWN0X3B0ciwgTlVMTCwgTlVMTCk7Ci19Ci0KLS8qIEZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSBhIHBuZ19jcmVhdGVfc3RydWN0KCkgY2FsbCAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZGVzdHJveV9zdHJ1Y3RfMihwbmdfdm9pZHAgc3RydWN0X3B0ciwgcG5nX2ZyZWVfcHRyIGZyZWVfZm4sCi0gICAgcG5nX3ZvaWRwIG1lbV9wdHIpCi17Ci0jZW5kaWYKLSAgIGlmIChzdHJ1Y3RfcHRyICE9IE5VTEwpCi0gICB7Ci0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgICAgaWYgKGZyZWVfZm4gIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19zdHJ1Y3QgZHVtbXlfc3RydWN0OwotICAgICAgICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9ICZkdW1teV9zdHJ1Y3Q7Ci0gICAgICAgICBwbmdfcHRyLT5tZW1fcHRyPW1lbV9wdHI7Ci0gICAgICAgICAoKihmcmVlX2ZuKSkocG5nX3B0ciwgc3RydWN0X3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0jZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAqLwotICAgICAgZmFyZnJlZSAoc3RydWN0X3B0cik7Ci0gICB9Ci19Ci0KLS8qIEFsbG9jYXRlIG1lbW9yeS4gIEZvciByZWFzb25hYmxlIGZpbGVzLCBzaXplIHNob3VsZCBuZXZlciBleGNlZWQKLSAqIDY0Sy4gIEhvd2V2ZXIsIHpsaWIgbWF5IGFsbG9jYXRlIG1vcmUgdGhlbiA2NEsgaWYgeW91IGRvbid0IHRlbGwKLSAqIGl0IG5vdCB0by4gIFNlZSB6Y29uZi5oIGFuZCBwbmcuaCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gemxpYiBkb2VzCi0gKiBuZWVkIHRvIGFsbG9jYXRlIGV4YWN0bHkgNjRLLCBzbyB3aGF0ZXZlciB5b3UgY2FsbCBoZXJlIG11c3QKLSAqIGhhdmUgdGhlIGFiaWxpdHkgdG8gZG8gdGhhdC4KLSAqCi0gKiBCb3JsYW5kIHNlZW1zIHRvIGhhdmUgYSBwcm9ibGVtIGluIERPUyBtb2RlIGZvciBleGFjdGx5IDY0Sy4KLSAqIEl0IGdpdmVzIHlvdSBhIHNlZ21lbnQgd2l0aCBhbiBvZmZzZXQgb2YgOCAocGVyaGFwcyB0byBzdG9yZSBpdHMKLSAqIG1lbW9yeSBzdHVmZikuICB6bGliIGRvZXNuJ3QgbGlrZSB0aGlzIGF0IGFsbCwgc28gd2UgaGF2ZSB0bwotICogZGV0ZWN0IGFuZCBkZWFsIHdpdGggaXQuICBUaGlzIGNvZGUgc2hvdWxkIG5vdCBiZSBuZWVkZWQgaW4KLSAqIFdpbmRvd3Mgb3IgT1MvMiBtb2RlcywgYW5kIG9ubHkgaW4gMTYgYml0IG1vZGUuICBUaGlzIGNvZGUgaGFzCi0gKiBiZWVuIHVwZGF0ZWQgYnkgQWxleGFuZGVyIExlaG1hbm4gZm9yIHZlcnNpb24gMC44OSB0byB3YXN0ZSBsZXNzCi0gKiBtZW1vcnkuCi0gKgotICogTm90ZSB0aGF0IHdlIGNhbid0IHVzZSBwbmdfc2l6ZV90IGZvciB0aGUgInNpemUiIGRlY2xhcmF0aW9uLAotICogc2luY2Ugb24gc29tZSBzeXN0ZW1zIGEgcG5nX3NpemVfdCBpcyBhIDE2LWJpdCBxdWFudGl0eSwgYW5kIGFzIGEKLSAqIHJlc3VsdCwgd2Ugd291bGQgYmUgdHJ1bmNhdGluZyBwb3RlbnRpYWxseSBsYXJnZXIgbWVtb3J5IHJlcXVlc3RzCi0gKiAod2hpY2ggc2hvdWxkIGNhdXNlIGEgZmF0YWwgZXJyb3IpIGFuZCBpbnRyb2R1Y2luZyBtYWpvciBwcm9ibGVtcy4KLSAqLwotcG5nX3ZvaWRwIFBOR0FQSQotcG5nX2NhbGxvYyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpCi17Ci0gICBwbmdfdm9pZHAgcmV0OwotCi0gICByZXQgPSAocG5nX21hbGxvYyhwbmdfcHRyLCBzaXplKSk7Ci0gICBpZiAocmV0ICE9IE5VTEwpCi0gICAgICBwbmdfbWVtc2V0KHJldCwwLChwbmdfc2l6ZV90KXNpemUpOwotICAgcmV0dXJuIChyZXQpOwotfQotCi1wbmdfdm9pZHAgUE5HQVBJCi1wbmdfbWFsbG9jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19hbGxvY19zaXplX3Qgc2l6ZSkKLXsKLSAgIHBuZ192b2lkcCByZXQ7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgc2l6ZSA9PSAwKQotICAgICAgcmV0dXJuIChOVUxMKTsKLQotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgIGlmIChwbmdfcHRyLT5tYWxsb2NfZm4gIT0gTlVMTCkKLSAgICAgIHJldCA9ICgocG5nX3ZvaWRwKSgqKHBuZ19wdHItPm1hbGxvY19mbikpKHBuZ19wdHIsIChwbmdfc2l6ZV90KXNpemUpKTsKLSAgIGVsc2UKLSAgICAgIHJldCA9IChwbmdfbWFsbG9jX2RlZmF1bHQocG5nX3B0ciwgc2l6ZSkpOwotICAgaWYgKHJldCA9PSBOVUxMICYmIChwbmdfcHRyLT5mbGFncyZQTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0spID09IDApCi0gICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPdXQgb2YgbWVtb3J5Iik7Ci0gICByZXR1cm4gKHJldCk7Ci19Ci0KLXBuZ192b2lkcCBQTkdBUEkKLXBuZ19tYWxsb2NfZGVmYXVsdChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpCi17Ci0gICBwbmdfdm9pZHAgcmV0OwotI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBzaXplID09IDApCi0gICAgICByZXR1cm4gKE5VTEwpOwotCi0jaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCi0gICBpZiAoc2l6ZSA+IChwbmdfdWludF8zMik2NTUzNkwpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiQ2Fubm90IEFsbG9jYXRlID4gNjRLIik7Ci0gICAgICByZXQgPSBOVUxMOwotICAgfQotICAgZWxzZQotI2VuZGlmCi0KLSAgIGlmIChzaXplICE9IChzaXplX3Qpc2l6ZSkKLSAgICAgIHJldCA9IE5VTEw7Ci0gICBlbHNlIGlmIChzaXplID09IChwbmdfdWludF8zMik2NTUzNkwpCi0gICB7Ci0gICAgICBpZiAocG5nX3B0ci0+b2Zmc2V0X3RhYmxlID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAvKiBUcnkgdG8gc2VlIGlmIHdlIG5lZWQgdG8gZG8gYW55IG9mIHRoaXMgZmFuY3kgc3R1ZmYgKi8KLSAgICAgICAgIHJldCA9IGZhcm1hbGxvYyhzaXplKTsKLSAgICAgICAgIGlmIChyZXQgPT0gTlVMTCB8fCAoKHBuZ19zaXplX3QpcmV0ICYgMHhmZmZmKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBudW1fYmxvY2tzOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgdG90YWxfc2l6ZTsKLSAgICAgICAgICAgIHBuZ19ieXRlcCB0YWJsZTsKLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgcG5nX2J5dGUgaHVnZSAqIGhwdHI7Ci0KLSAgICAgICAgICAgIGlmIChyZXQgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGZhcmZyZWUocmV0KTsKLSAgICAgICAgICAgICAgIHJldCA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT56bGliX3dpbmRvd19iaXRzID4gMTQpCi0gICAgICAgICAgICAgICBudW1fYmxvY2tzID0gKGludCkoMSA8PCAocG5nX3B0ci0+emxpYl93aW5kb3dfYml0cyAtIDE0KSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBudW1fYmxvY2tzID0gMTsKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT56bGliX21lbV9sZXZlbCA+PSA3KQotICAgICAgICAgICAgICAgbnVtX2Jsb2NrcyArPSAoaW50KSgxIDw8IChwbmdfcHRyLT56bGliX21lbV9sZXZlbCAtIDcpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIG51bV9ibG9ja3MrKzsKLQotICAgICAgICAgICAgdG90YWxfc2l6ZSA9ICgocG5nX3VpbnRfMzIpNjU1MzZMKSAqIChwbmdfdWludF8zMiludW1fYmxvY2tzKzE2OwotCi0gICAgICAgICAgICB0YWJsZSA9IGZhcm1hbGxvYyh0b3RhbF9zaXplKTsKLQotICAgICAgICAgICAgaWYgKHRhYmxlID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0jaWZuZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgICAgICAgICAgICAgIGlmICgocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LKSA9PSAwKQotICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPdXQgT2YgTWVtb3J5Iik7IC8qIE5vdGUgIk8iLCAiTSIgKi8KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJPdXQgT2YgTWVtb3J5Iik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgIHJldHVybiAoTlVMTCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgocG5nX3NpemVfdCl0YWJsZSAmIDB4ZmZmMCkKLSAgICAgICAgICAgIHsKLSNpZm5kZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyZQTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0spID09IDApCi0gICAgICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgIkZhcm1hbGxvYyBkaWRuJ3QgcmV0dXJuIG5vcm1hbGl6ZWQgcG9pbnRlciIpOwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgIkZhcm1hbGxvYyBkaWRuJ3QgcmV0dXJuIG5vcm1hbGl6ZWQgcG9pbnRlciIpOwotI2VuZGlmCi0gICAgICAgICAgICAgICByZXR1cm4gKE5VTEwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwbmdfcHRyLT5vZmZzZXRfdGFibGUgPSB0YWJsZTsKLSAgICAgICAgICAgIHBuZ19wdHItPm9mZnNldF90YWJsZV9wdHIgPSBmYXJtYWxsb2MobnVtX2Jsb2NrcyAqCi0gICAgICAgICAgICAgICBwbmdfc2l6ZW9mKHBuZ19ieXRlcCkpOwotCi0gICAgICAgICAgICBpZiAocG5nX3B0ci0+b2Zmc2V0X3RhYmxlX3B0ciA9PSBOVUxMKQotICAgICAgICAgICAgewotI2lmbmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICAgICAgICAgICAgICBpZiAoKHBuZ19wdHItPmZsYWdzJlBOR19GTEFHX01BTExPQ19OVUxMX01FTV9PSykgPT0gMCkKLSAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiT3V0IE9mIG1lbW9yeSIpOyAvKiBOb3RlICJPIiwgIm0iICovCi0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3V0IE9mIG1lbW9yeSIpOwotI2VuZGlmCi0gICAgICAgICAgICAgICByZXR1cm4gKE5VTEwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBocHRyID0gKHBuZ19ieXRlIGh1Z2UgKil0YWJsZTsKLSAgICAgICAgICAgIGlmICgocG5nX3NpemVfdClocHRyICYgMHhmKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaHB0ciA9IChwbmdfYnl0ZSBodWdlICopKChsb25nKShocHRyKSAmIDB4ZmZmZmZmZjBMKTsKLSAgICAgICAgICAgICAgIGhwdHIgPSBocHRyICsgMTZMOyAgLyogImhwdHIgKz0gMTZMIiBmYWlscyBvbiBUdXJibyBDKysgMy4wICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3B0ci0+b2Zmc2V0X3RhYmxlX3B0cltpXSA9IChwbmdfYnl0ZXApaHB0cjsKLSAgICAgICAgICAgICAgIGhwdHIgPSBocHRyICsgKHBuZ191aW50XzMyKTY1NTM2TDsgIC8qICIrPSIgZmFpbHMgb24gVEMrKzMuMCAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwbmdfcHRyLT5vZmZzZXRfdGFibGVfbnVtYmVyID0gbnVtX2Jsb2NrczsKLSAgICAgICAgICAgIHBuZ19wdHItPm9mZnNldF90YWJsZV9jb3VudCA9IDA7Ci0gICAgICAgICAgICBwbmdfcHRyLT5vZmZzZXRfdGFibGVfY291bnRfZnJlZSA9IDA7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwbmdfcHRyLT5vZmZzZXRfdGFibGVfY291bnQgPj0gcG5nX3B0ci0+b2Zmc2V0X3RhYmxlX251bWJlcikKLSAgICAgIHsKLSNpZm5kZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyZQTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0spID09IDApCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk91dCBvZiBNZW1vcnkiKTsgLyogTm90ZSAibyIgYW5kICJNIiAqLwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk91dCBvZiBNZW1vcnkiKTsKLSNlbmRpZgotICAgICAgICAgcmV0dXJuIChOVUxMKTsKLSAgICAgIH0KLQotICAgICAgcmV0ID0gcG5nX3B0ci0+b2Zmc2V0X3RhYmxlX3B0cltwbmdfcHRyLT5vZmZzZXRfdGFibGVfY291bnQrK107Ci0gICB9Ci0gICBlbHNlCi0gICAgICByZXQgPSBmYXJtYWxsb2Moc2l6ZSk7Ci0KLSNpZm5kZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgaWYgKHJldCA9PSBOVUxMKQotICAgewotICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyZQTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0spID09IDApCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk91dCBvZiBtZW1vcnkiKTsgLyogTm90ZSAibyIgYW5kICJtIiAqLwotICAgICAgZWxzZQotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk91dCBvZiBtZW1vcnkiKTsgLyogTm90ZSAibyIgYW5kICJtIiAqLwotICAgfQotI2VuZGlmCi0KLSAgIHJldHVybiAocmV0KTsKLX0KLQotLyogRnJlZSBhIHBvaW50ZXIgYWxsb2NhdGVkIGJ5IHBuZ19tYWxsb2MoKS4gIEluIHRoZSBkZWZhdWx0Ci0gKiBjb25maWd1cmF0aW9uLCBwbmdfcHRyIGlzIG5vdCB1c2VkLCBidXQgaXMgcGFzc2VkIGluIGNhc2UgaXQKLSAqIGlzIG5lZWRlZC4gIElmIHB0ciBpcyBOVUxMLCByZXR1cm4gd2l0aG91dCB0YWtpbmcgYW55IGFjdGlvbi4KLSAqLwotdm9pZCBQTkdBUEkKLXBuZ19mcmVlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBwdHIpCi17Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IHB0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPmZyZWVfZm4gIT0gTlVMTCkKLSAgIHsKLSAgICAgICgqKHBuZ19wdHItPmZyZWVfZm4pKShwbmdfcHRyLCBwdHIpOwotICAgICAgcmV0dXJuOwotICAgfQotICAgZWxzZQotICAgICAgcG5nX2ZyZWVfZGVmYXVsdChwbmdfcHRyLCBwdHIpOwotfQotCi12b2lkIFBOR0FQSQotcG5nX2ZyZWVfZGVmYXVsdChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgcHRyKQotewotI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBwdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgaWYgKHBuZ19wdHItPm9mZnNldF90YWJsZSAhPSBOVUxMKQotICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBwbmdfcHRyLT5vZmZzZXRfdGFibGVfY291bnQ7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIGlmIChwdHIgPT0gcG5nX3B0ci0+b2Zmc2V0X3RhYmxlX3B0cltpXSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHB0ciA9IE5VTEw7Ci0gICAgICAgICAgICBwbmdfcHRyLT5vZmZzZXRfdGFibGVfY291bnRfZnJlZSsrOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAocG5nX3B0ci0+b2Zmc2V0X3RhYmxlX2NvdW50X2ZyZWUgPT0gcG5nX3B0ci0+b2Zmc2V0X3RhYmxlX2NvdW50KQotICAgICAgewotICAgICAgICAgZmFyZnJlZShwbmdfcHRyLT5vZmZzZXRfdGFibGUpOwotICAgICAgICAgZmFyZnJlZShwbmdfcHRyLT5vZmZzZXRfdGFibGVfcHRyKTsKLSAgICAgICAgIHBuZ19wdHItPm9mZnNldF90YWJsZSA9IE5VTEw7Ci0gICAgICAgICBwbmdfcHRyLT5vZmZzZXRfdGFibGVfcHRyID0gTlVMTDsKLSAgICAgIH0KLSAgIH0KLQotICAgaWYgKHB0ciAhPSBOVUxMKQotICAgewotICAgICAgZmFyZnJlZShwdHIpOwotICAgfQotfQotCi0jZWxzZSAvKiBOb3QgdGhlIEJvcmxhbmQgRE9TIHNwZWNpYWwgbWVtb3J5IGhhbmRsZXIgKi8KLQotLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhIHBuZ19zdHJ1Y3Qgb3IgYSBwbmdfaW5mby4gIFRoZSBtYWxsb2MgYW5kCi0gICBtZW1zZXQgY2FuIGJlIHJlcGxhY2VkIGJ5IGEgc2luZ2xlIGNhbGwgdG8gY2FsbG9jKCkgaWYgdGhpcyBpcyB0aG91Z2h0Ci0gICB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIG5vdGljYWJseS4gKi8KLXBuZ192b2lkcCAvKiBQUklWQVRFICovCi1wbmdfY3JlYXRlX3N0cnVjdChpbnQgdHlwZSkKLXsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICByZXR1cm4gKHBuZ19jcmVhdGVfc3RydWN0XzIodHlwZSwgTlVMTCwgTlVMTCkpOwotfQotCi0vKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgcG5nX3N0cnVjdCBvciBhIHBuZ19pbmZvLiAgVGhlIG1hbGxvYyBhbmQKLSAgIG1lbXNldCBjYW4gYmUgcmVwbGFjZWQgYnkgYSBzaW5nbGUgY2FsbCB0byBjYWxsb2MoKSBpZiB0aGlzIGlzIHRob3VnaHQKLSAgIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugbm90aWNhYmx5LiAqLwotcG5nX3ZvaWRwIC8qIFBSSVZBVEUgKi8KLXBuZ19jcmVhdGVfc3RydWN0XzIoaW50IHR5cGUsIHBuZ19tYWxsb2NfcHRyIG1hbGxvY19mbiwgcG5nX3ZvaWRwIG1lbV9wdHIpCi17Ci0jZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAqLwotICAgcG5nX3NpemVfdCBzaXplOwotICAgcG5nX3ZvaWRwIHN0cnVjdF9wdHI7Ci0KLSAgIGlmICh0eXBlID09IFBOR19TVFJVQ1RfSU5GTykKLSAgICAgIHNpemUgPSBwbmdfc2l6ZW9mKHBuZ19pbmZvKTsKLSAgIGVsc2UgaWYgKHR5cGUgPT0gUE5HX1NUUlVDVF9QTkcpCi0gICAgICBzaXplID0gcG5nX3NpemVvZihwbmdfc3RydWN0KTsKLSAgIGVsc2UKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0KLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBpZiAobWFsbG9jX2ZuICE9IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfc3RydWN0IGR1bW15X3N0cnVjdDsKLSAgICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSAmZHVtbXlfc3RydWN0OwotICAgICAgcG5nX3B0ci0+bWVtX3B0cj1tZW1fcHRyOwotICAgICAgc3RydWN0X3B0ciA9ICgqKG1hbGxvY19mbikpKHBuZ19wdHIsIHNpemUpOwotICAgICAgaWYgKHN0cnVjdF9wdHIgIT0gTlVMTCkKLSAgICAgICAgIHBuZ19tZW1zZXQoc3RydWN0X3B0ciwgMCwgc2l6ZSk7Ci0gICAgICByZXR1cm4gKHN0cnVjdF9wdHIpOwotICAgfQotI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KLQotI2lmIGRlZmluZWQoX19UVVJCT0NfXykgJiYgIWRlZmluZWQoX19GTEFUX18pCi0gICBzdHJ1Y3RfcHRyID0gKHBuZ192b2lkcClmYXJtYWxsb2Moc2l6ZSk7Ci0jZWxzZQotIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKE1BWFNFR182NEspCi0gICBzdHJ1Y3RfcHRyID0gKHBuZ192b2lkcCloYWxsb2Moc2l6ZSwgMSk7Ci0jIGVsc2UKLSAgIHN0cnVjdF9wdHIgPSAocG5nX3ZvaWRwKW1hbGxvYyhzaXplKTsKLSMgZW5kaWYKLSNlbmRpZgotICAgaWYgKHN0cnVjdF9wdHIgIT0gTlVMTCkKLSAgICAgIHBuZ19tZW1zZXQoc3RydWN0X3B0ciwgMCwgc2l6ZSk7Ci0KLSAgIHJldHVybiAoc3RydWN0X3B0cik7Ci19Ci0KLQotLyogRnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IGEgcG5nX2NyZWF0ZV9zdHJ1Y3QoKSBjYWxsICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kZXN0cm95X3N0cnVjdChwbmdfdm9pZHAgc3RydWN0X3B0cikKLXsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBwbmdfZGVzdHJveV9zdHJ1Y3RfMihzdHJ1Y3RfcHRyLCBOVUxMLCBOVUxMKTsKLX0KLQotLyogRnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IGEgcG5nX2NyZWF0ZV9zdHJ1Y3QoKSBjYWxsICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kZXN0cm95X3N0cnVjdF8yKHBuZ192b2lkcCBzdHJ1Y3RfcHRyLCBwbmdfZnJlZV9wdHIgZnJlZV9mbiwKLSAgICBwbmdfdm9pZHAgbWVtX3B0cikKLXsKLSNlbmRpZiAvKiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEICovCi0gICBpZiAoc3RydWN0X3B0ciAhPSBOVUxMKQotICAgewotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgICAgIGlmIChmcmVlX2ZuICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBwbmdfc3RydWN0IGR1bW15X3N0cnVjdDsKLSAgICAgICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSAmZHVtbXlfc3RydWN0OwotICAgICAgICAgcG5nX3B0ci0+bWVtX3B0cj1tZW1fcHRyOwotICAgICAgICAgKCooZnJlZV9mbikpKHBuZ19wdHIsIHN0cnVjdF9wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KLSNpZiBkZWZpbmVkKF9fVFVSQk9DX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKQotICAgICAgZmFyZnJlZShzdHJ1Y3RfcHRyKTsKLSNlbHNlCi0jIGlmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoTUFYU0VHXzY0SykKLSAgICAgIGhmcmVlKHN0cnVjdF9wdHIpOwotIyBlbHNlCi0gICAgICBmcmVlKHN0cnVjdF9wdHIpOwotIyBlbmRpZgotI2VuZGlmCi0gICB9Ci19Ci0KLS8qIEFsbG9jYXRlIG1lbW9yeS4gIEZvciByZWFzb25hYmxlIGZpbGVzLCBzaXplIHNob3VsZCBuZXZlciBleGNlZWQKLSAqIDY0Sy4gIEhvd2V2ZXIsIHpsaWIgbWF5IGFsbG9jYXRlIG1vcmUgdGhlbiA2NEsgaWYgeW91IGRvbid0IHRlbGwKLSAqIGl0IG5vdCB0by4gIFNlZSB6Y29uZi5oIGFuZCBwbmcuaCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIHpsaWIgZG9lcwotICogbmVlZCB0byBhbGxvY2F0ZSBleGFjdGx5IDY0Sywgc28gd2hhdGV2ZXIgeW91IGNhbGwgaGVyZSBtdXN0Ci0gKiBoYXZlIHRoZSBhYmlsaXR5IHRvIGRvIHRoYXQuCi0gKi8KLQotcG5nX3ZvaWRwIFBOR0FQSQotcG5nX2NhbGxvYyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpCi17Ci0gICBwbmdfdm9pZHAgcmV0OwotCi0gICByZXQgPSAocG5nX21hbGxvYyhwbmdfcHRyLCBzaXplKSk7Ci0gICBpZiAocmV0ICE9IE5VTEwpCi0gICAgICBwbmdfbWVtc2V0KHJldCwwLChwbmdfc2l6ZV90KXNpemUpOwotICAgcmV0dXJuIChyZXQpOwotfQotCi1wbmdfdm9pZHAgUE5HQVBJCi1wbmdfbWFsbG9jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19hbGxvY19zaXplX3Qgc2l6ZSkKLXsKLSAgIHBuZ192b2lkcCByZXQ7Ci0KLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IHNpemUgPT0gMCkKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0KLSAgIGlmIChwbmdfcHRyLT5tYWxsb2NfZm4gIT0gTlVMTCkKLSAgICAgIHJldCA9ICgocG5nX3ZvaWRwKSgqKHBuZ19wdHItPm1hbGxvY19mbikpKHBuZ19wdHIsIChwbmdfc2l6ZV90KXNpemUpKTsKLSAgIGVsc2UKLSAgICAgIHJldCA9IChwbmdfbWFsbG9jX2RlZmF1bHQocG5nX3B0ciwgc2l6ZSkpOwotICAgaWYgKHJldCA9PSBOVUxMICYmIChwbmdfcHRyLT5mbGFncyZQTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0spID09IDApCi0gICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPdXQgb2YgTWVtb3J5Iik7Ci0gICByZXR1cm4gKHJldCk7Ci19Ci0KLXBuZ192b2lkcCBQTkdBUEkKLXBuZ19tYWxsb2NfZGVmYXVsdChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpCi17Ci0gICBwbmdfdm9pZHAgcmV0OwotI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBzaXplID09IDApCi0gICAgICByZXR1cm4gKE5VTEwpOwotCi0jaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCi0gICBpZiAoc2l6ZSA+IChwbmdfdWludF8zMik2NTUzNkwpCi0gICB7Ci0jaWZuZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgICAgIGlmICgocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LKSA9PSAwKQotICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJDYW5ub3QgQWxsb2NhdGUgPiA2NEsiKTsKLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICB9Ci0jZW5kaWYKLQotICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0jaWYgZGVmaW5lZChfX1RVUkJPQ19fKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykKLSAgIGlmIChzaXplICE9ICh1bnNpZ25lZCBsb25nKXNpemUpCi0gICAgICByZXQgPSBOVUxMOwotICAgZWxzZQotICAgICAgcmV0ID0gZmFybWFsbG9jKHNpemUpOwotI2Vsc2UKLSMgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChNQVhTRUdfNjRLKQotICAgaWYgKHNpemUgIT0gKHVuc2lnbmVkIGxvbmcpc2l6ZSkKLSAgICAgIHJldCA9IE5VTEw7Ci0gICBlbHNlCi0gICAgICByZXQgPSBoYWxsb2Moc2l6ZSwgMSk7Ci0jIGVsc2UKLSAgIGlmIChzaXplICE9IChzaXplX3Qpc2l6ZSkKLSAgICAgIHJldCA9IE5VTEw7Ci0gICBlbHNlCi0gICAgICByZXQgPSBtYWxsb2MoKHNpemVfdClzaXplKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgIGlmIChyZXQgPT0gTlVMTCAmJiAocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LKSA9PSAwKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPdXQgb2YgTWVtb3J5Iik7Ci0jZW5kaWYKLQotICAgcmV0dXJuIChyZXQpOwotfQotCi0vKiBGcmVlIGEgcG9pbnRlciBhbGxvY2F0ZWQgYnkgcG5nX21hbGxvYygpLiAgSWYgcHRyIGlzIE5VTEwsIHJldHVybgotICogd2l0aG91dCB0YWtpbmcgYW55IGFjdGlvbi4KLSAqLwotdm9pZCBQTkdBUEkKLXBuZ19mcmVlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBwdHIpCi17Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IHB0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPmZyZWVfZm4gIT0gTlVMTCkKLSAgIHsKLSAgICAgICgqKHBuZ19wdHItPmZyZWVfZm4pKShwbmdfcHRyLCBwdHIpOwotICAgICAgcmV0dXJuOwotICAgfQotICAgZWxzZQotICAgICAgcG5nX2ZyZWVfZGVmYXVsdChwbmdfcHRyLCBwdHIpOwotfQotdm9pZCBQTkdBUEkKLXBuZ19mcmVlX2RlZmF1bHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0cikKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSNlbmRpZiAvKiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEICovCi0KLSNpZiBkZWZpbmVkKF9fVFVSQk9DX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKQotICAgZmFyZnJlZShwdHIpOwotI2Vsc2UKLSMgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChNQVhTRUdfNjRLKQotICAgaGZyZWUocHRyKTsKLSMgZWxzZQotICAgZnJlZShwdHIpOwotIyBlbmRpZgotI2VuZGlmCi19Ci0KLSNlbmRpZiAvKiBOb3QgQm9ybGFuZCBET1Mgc3BlY2lhbCBtZW1vcnkgaGFuZGxlciAqLwotCi0vKiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjIuMy4gIFRoZSBwbmdfbWFsbG9jX3dhcm4oKQotICogZnVuY3Rpb24gd2lsbCBzZXQgdXAgcG5nX21hbGxvYygpIHRvIGlzc3VlIGEgcG5nX3dhcm5pbmcgYW5kIHJldHVybiBOVUxMCi0gKiBpbnN0ZWFkIG9mIGlzc3VpbmcgYSBwbmdfZXJyb3IsIGlmIGl0IGZhaWxzIHRvIGFsbG9jYXRlIHRoZSByZXF1ZXN0ZWQKLSAqIG1lbW9yeS4KLSAqLwotcG5nX3ZvaWRwIFBOR0FQSQotcG5nX21hbGxvY193YXJuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19hbGxvY19zaXplX3Qgc2l6ZSkKLXsKLSAgIHBuZ192b2lkcCBwdHI7Ci0gICBwbmdfdWludF8zMiBzYXZlX2ZsYWdzOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0KLSAgIHNhdmVfZmxhZ3MgPSBwbmdfcHRyLT5mbGFnczsKLSAgIHBuZ19wdHItPmZsYWdzfD1QTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0s7Ci0gICBwdHIgPSAocG5nX3ZvaWRwKXBuZ19tYWxsb2MoKHBuZ19zdHJ1Y3RwKXBuZ19wdHIsIHNpemUpOwotICAgcG5nX3B0ci0+ZmxhZ3M9c2F2ZV9mbGFnczsKLSAgIHJldHVybihwdHIpOwotfQotCi0KLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0byB1c2UgYW5vdGhlciBtZXRob2QKLSAqIG9mIGFsbG9jYXRpbmcgYW5kIGZyZWVpbmcgbWVtb3J5LgotICovCi12b2lkIFBOR0FQSQotcG5nX3NldF9tZW1fZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIG1lbV9wdHIsIHBuZ19tYWxsb2NfcHRyCi0gIG1hbGxvY19mbiwgcG5nX2ZyZWVfcHRyIGZyZWVfZm4pCi17Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMKQotICAgewotICAgICAgcG5nX3B0ci0+bWVtX3B0ciA9IG1lbV9wdHI7Ci0gICAgICBwbmdfcHRyLT5tYWxsb2NfZm4gPSBtYWxsb2NfZm47Ci0gICAgICBwbmdfcHRyLT5mcmVlX2ZuID0gZnJlZV9mbjsKLSAgIH0KLX0KLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbWVtX3B0ciBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIKLSAqIGZ1bmN0aW9ucy4gIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZnJlZSBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gKiBwb2ludGVyIGJlZm9yZSBwbmdfd3JpdGVfZGVzdHJveSBhbmQgcG5nX3JlYWRfZGVzdHJveSBhcmUgY2FsbGVkLgotICovCi1wbmdfdm9pZHAgUE5HQVBJCi1wbmdfZ2V0X21lbV9wdHIocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm4gKE5VTEwpOwotICAgcmV0dXJuICgocG5nX3ZvaWRwKXBuZ19wdHItPm1lbV9wdHIpOwotfQotI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KLSNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgfHwgUE5HX1dSSVRFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9wbmdub3cucG5nIGIvc3JjL2xpYnBuZy9wbmdub3cucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mjc5M2ViLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvcG5nbm93LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvcG5ncHJlYWQuYyBiL3NyYy9saWJwbmcvcG5ncHJlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFhZDY5OS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3BuZ3ByZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjM0ICswLDAgQEAKLQotLyogcG5ncHJlYWQuYyAtIHJlYWQgYSBwbmcgZmlsZSBpbiBwdXNoIG1vZGUKLSAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNC4xMCBbTWFyY2ggOCwgMjAxMl0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEyIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCi0gKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0gKi8KLQotI2RlZmluZSBQTkdfTk9fUEVEQU5USUNfV0FSTklOR1MKLSNpbmNsdWRlICJwbmcuaCIKLSNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQKLSNpbmNsdWRlICJwbmdwcml2LmgiCi0KLS8qIFB1c2ggbW9kZWwgbW9kZXMgKi8KLSNkZWZpbmUgUE5HX1JFQURfU0lHX01PREUgICAwCi0jZGVmaW5lIFBOR19SRUFEX0NIVU5LX01PREUgMQotI2RlZmluZSBQTkdfUkVBRF9JREFUX01PREUgIDIKLSNkZWZpbmUgUE5HX1NLSVBfTU9ERSAgICAgICAzCi0jZGVmaW5lIFBOR19SRUFEX3RFWHRfTU9ERSAgNAotI2RlZmluZSBQTkdfUkVBRF96VFh0X01PREUgIDUKLSNkZWZpbmUgUE5HX1JFQURfRE9ORV9NT0RFICA2Ci0jZGVmaW5lIFBOR19SRUFEX2lUWHRfTU9ERSAgNwotI2RlZmluZSBQTkdfRVJST1JfTU9ERSAgICAgIDgKLQotdm9pZCBQTkdBUEkKLXBuZ19wcm9jZXNzX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3NpemVfdCBidWZmZXJfc2l6ZSkKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgcG5nX3B1c2hfcmVzdG9yZV9idWZmZXIocG5nX3B0ciwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7Ci0KLSAgIHdoaWxlIChwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgIHsKLSAgICAgIHBuZ19wcm9jZXNzX3NvbWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICB9Ci19Ci0KLS8qIFdoYXQgd2UgZG8gd2l0aCB0aGUgaW5jb21pbmcgZGF0YSBkZXBlbmRzIG9uIHdoYXQgd2Ugd2VyZSBwcmV2aW91c2x5Ci0gKiBkb2luZyBiZWZvcmUgd2UgcmFuIG91dCBvZiBkYXRhLi4uCi0gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3Byb2Nlc3Nfc29tZV9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIHN3aXRjaCAocG5nX3B0ci0+cHJvY2Vzc19tb2RlKQotICAgewotICAgICAgY2FzZSBQTkdfUkVBRF9TSUdfTU9ERToKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3JlYWRfc2lnKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIFBOR19SRUFEX0NIVU5LX01PREU6Ci0gICAgICB7Ci0gICAgICAgICBwbmdfcHVzaF9yZWFkX2NodW5rKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIFBOR19SRUFEX0lEQVRfTU9ERToKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3JlYWRfSURBVChwbmdfcHRyKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIFBOR19TS0lQX01PREU6Ci0gICAgICB7Ci0gICAgICAgICBwbmdfcHVzaF9jcmNfZmluaXNoKHBuZ19wdHIpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5idWZmZXJfc2l6ZSA9IDA7Ci0gICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgIH0KLX0KLQotLyogUmVhZCBhbnkgcmVtYWluaW5nIHNpZ25hdHVyZSBieXRlcyBmcm9tIHRoZSBzdHJlYW0gYW5kIGNvbXBhcmUgdGhlbSB3aXRoCi0gKiB0aGUgY29ycmVjdCBQTkcgc2lnbmF0dXJlLiAgSXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkCi0gKiB3aXRoIGJ5dGVzIGFscmVhZHkgcmVhZCBmcm9tIHRoZSBzaWduYXR1cmUsIGVpdGhlciBiZWNhdXNlIHRoZXkgaGF2ZSBiZWVuCi0gKiBjaGVja2VkIGJ5IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLCBvciBiZWNhdXNlIG9mIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMKLSAqIHJvdXRpbmUuCi0gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3B1c2hfcmVhZF9zaWcocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotewotICAgcG5nX3NpemVfdCBudW1fY2hlY2tlZCA9IHBuZ19wdHItPnNpZ19ieXRlcywKLSAgICAgICAgICAgICBudW1fdG9fY2hlY2sgPSA4IC0gbnVtX2NoZWNrZWQ7Ci0KLSAgIGlmIChwbmdfcHRyLT5idWZmZXJfc2l6ZSA8IG51bV90b19jaGVjaykKLSAgIHsKLSAgICAgIG51bV90b19jaGVjayA9IHBuZ19wdHItPmJ1ZmZlcl9zaXplOwotICAgfQotCi0gICBwbmdfcHVzaF9maWxsX2J1ZmZlcihwbmdfcHRyLCAmKGluZm9fcHRyLT5zaWduYXR1cmVbbnVtX2NoZWNrZWRdKSwKLSAgICAgIG51bV90b19jaGVjayk7Ci0gICBwbmdfcHRyLT5zaWdfYnl0ZXMgPSAocG5nX2J5dGUpKHBuZ19wdHItPnNpZ19ieXRlcyArIG51bV90b19jaGVjayk7Ci0KLSAgIGlmIChwbmdfc2lnX2NtcChpbmZvX3B0ci0+c2lnbmF0dXJlLCBudW1fY2hlY2tlZCwgbnVtX3RvX2NoZWNrKSkKLSAgIHsKLSAgICAgIGlmIChudW1fY2hlY2tlZCA8IDQgJiYKLSAgICAgICAgICBwbmdfc2lnX2NtcChpbmZvX3B0ci0+c2lnbmF0dXJlLCBudW1fY2hlY2tlZCwgbnVtX3RvX2NoZWNrIC0gNCkpCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk5vdCBhIFBORyBmaWxlIik7Ci0gICAgICBlbHNlCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlBORyBmaWxlIGNvcnJ1cHRlZCBieSBBU0NJSSBjb252ZXJzaW9uIik7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICBpZiAocG5nX3B0ci0+c2lnX2J5dGVzID49IDgpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5wcm9jZXNzX21vZGUgPSBQTkdfUkVBRF9DSFVOS19NT0RFOwotICAgICAgfQotICAgfQotfQotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19wdXNoX3JlYWRfY2h1bmsocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotewotICAgICAgUE5HX0lIRFI7Ci0gICAgICBQTkdfSURBVDsKLSAgICAgIFBOR19JRU5EOwotICAgICAgUE5HX1BMVEU7Ci0jaWZkZWYgUE5HX1JFQURfYktHRF9TVVBQT1JURUQKLSAgICAgIFBOR19iS0dEOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQKLSAgICAgIFBOR19jSFJNOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQKLSAgICAgIFBOR19nQU1BOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfaElTVF9TVVBQT1JURUQKLSAgICAgIFBOR19oSVNUOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQKLSAgICAgIFBOR19pQ0NQOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKLSAgICAgIFBOR19pVFh0OwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfb0ZGc19TVVBQT1JURUQKLSAgICAgIFBOR19vRkZzOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfcENBTF9TVVBQT1JURUQKLSAgICAgIFBOR19wQ0FMOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfcEhZc19TVVBQT1JURUQKLSAgICAgIFBOR19wSFlzOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfc0JJVF9TVVBQT1JURUQKLSAgICAgIFBOR19zQklUOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfc0NBTF9TVVBQT1JURUQKLSAgICAgIFBOR19zQ0FMOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQKLSAgICAgIFBOR19zUkdCOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfc1BMVF9TVVBQT1JURUQKLSAgICAgIFBOR19zUExUOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfdEVYdF9TVVBQT1JURUQKLSAgICAgIFBOR190RVh0OwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfdElNRV9TVVBQT1JURUQKLSAgICAgIFBOR190SU1FOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfdFJOU19TVVBQT1JURUQKLSAgICAgIFBOR190Uk5TOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfelRYdF9TVVBQT1JURUQKLSAgICAgIFBOR196VFh0OwotI2VuZGlmCi0KLSAgIC8qIEZpcnN0IHdlIG1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBkYXRhIGZvciB0aGUgNCBieXRlIGNodW5rIG5hbWUKLSAgICAqIGFuZCB0aGUgNCBieXRlIGNodW5rIGxlbmd0aCBiZWZvcmUgcHJvY2VlZGluZyB3aXRoIGRlY29kaW5nIHRoZQotICAgICogY2h1bmsgZGF0YS4gIFRvIGZ1bGx5IGRlY29kZSBlYWNoIG9mIHRoZXNlIGNodW5rcywgd2UgYWxzbyBtYWtlCi0gICAgKiBzdXJlIHdlIGhhdmUgZW5vdWdoIGRhdGEgaW4gdGhlIGJ1ZmZlciBmb3IgdGhlIDQgYnl0ZSBDUkMgYXQgdGhlCi0gICAgKiBlbmQgb2YgZXZlcnkgY2h1bmsgKGV4Y2VwdCBJREFULCB3aGljaCBpcyBoYW5kbGVkIHNlcGFyYXRlbHkpLgotICAgICovCi0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfQ0hVTktfSEVBREVSKSkKLSAgIHsKLSAgICAgIHBuZ19ieXRlIGNodW5rX2xlbmd0aFs0XTsKLQotICAgICAgaWYgKHBuZ19wdHItPmJ1ZmZlcl9zaXplIDwgOCkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfcHVzaF9maWxsX2J1ZmZlcihwbmdfcHRyLCBjaHVua19sZW5ndGgsIDQpOwotICAgICAgcG5nX3B0ci0+cHVzaF9sZW5ndGggPSBwbmdfZ2V0X3VpbnRfMzEocG5nX3B0ciwgY2h1bmtfbGVuZ3RoKTsKLSAgICAgIHBuZ19yZXNldF9jcmMocG5nX3B0cik7Ci0gICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbmFtZSwgNCk7Ci0gICAgICBwbmdfY2hlY2tfY2h1bmtfbmFtZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19uYW1lKTsKLSAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfQ0hVTktfSEVBREVSOwotICAgfQotCi0gICBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX0lEQVQsIDQpKQotICAgICBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19BRlRFUl9JREFUKQotICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0NIVU5LX0FGVEVSX0lEQVQ7Ci0KLSAgIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfSUhEUiwgNCkpCi0gICB7Ci0gICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggIT0gMTMpCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgSUhEUiBsZW5ndGgiKTsKLQotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0gICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfSUVORCwgNCkpCi0gICB7Ci0gICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgcG5nX2hhbmRsZV9JRU5EKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7Ci0KLSAgICAgIHBuZ19wdHItPnByb2Nlc3NfbW9kZSA9IFBOR19SRUFEX0RPTkVfTU9ERTsKLSAgICAgIHBuZ19wdXNoX2hhdmVfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgIH0KLQotI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKLSAgIGVsc2UgaWYgKHBuZ19oYW5kbGVfYXNfdW5rbm93bihwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19uYW1lKSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX0lEQVQsIDQpKQotICAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9JREFUOwotCi0gICAgICBwbmdfaGFuZGxlX3Vua25vd24ocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLQotICAgICAgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19QTFRFLCA0KSkKLSAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfUExURTsKLQotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX0lEQVQsIDQpKQotICAgICAgewotICAgICAgICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIElEQVQiKTsKLQotICAgICAgICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFICYmCi0gICAgICAgICAgICAgICAgICAhKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKSkKLSAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBQTFRFIGJlZm9yZSBJREFUIik7Ci0gICAgICB9Ci0gICB9Ci0KLSNlbmRpZgotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX1BMVEUsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBwbmdfaGFuZGxlX1BMVEUocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLSAgIH0KLQotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX0lEQVQsIDQpKQotICAgewotICAgICAgLyogSWYgd2UgcmVhY2ggYW4gSURBVCBjaHVuaywgdGhpcyBtZWFucyB3ZSBoYXZlIHJlYWQgYWxsIG9mIHRoZQotICAgICAgICogaGVhZGVyIGNodW5rcywgYW5kIHdlIGNhbiBzdGFydCByZWFkaW5nIHRoZSBpbWFnZSAob3IgaWYgdGhpcwotICAgICAgICogaXMgY2FsbGVkIGFmdGVyIHRoZSBpbWFnZSBoYXMgYmVlbiByZWFkIC0gd2UgaGF2ZSBhbiBlcnJvcikuCi0gICAgICAgKi8KLQotICAgICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQotICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIElEQVQiKTsKLQotICAgICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFICYmCi0gICAgICAgICAgIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUExURSkpCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgUExURSBiZWZvcmUgSURBVCIpOwotCi0gICAgICBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpCi0gICAgICB7Ci0gICAgICAgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfQ0hVTktfQUZURVJfSURBVCkpCi0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfQUZURVJfSURBVCkKLSAgICAgICAgICAgIHBuZ19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIlRvbyBtYW55IElEQVRzIGZvdW5kIik7Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19wdHItPmlkYXRfc2l6ZSA9IHBuZ19wdHItPnB1c2hfbGVuZ3RoOwotICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9JREFUOwotICAgICAgcG5nX3B0ci0+cHJvY2Vzc19tb2RlID0gUE5HX1JFQURfSURBVF9NT0RFOwotICAgICAgcG5nX3B1c2hfaGF2ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0KLSAgICAgICAgICAodUludCkgUE5HX1JPV0JZVEVTKHBuZ19wdHItPnBpeGVsX2RlcHRoLAotICAgICAgICAgIHBuZ19wdHItPml3aWR0aCkgKyAxOwotICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IHBuZ19wdHItPnJvd19idWY7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSNpZmRlZiBQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRAotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX2dBTUEsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9zQklUX1NVUFBPUlRFRAotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX3NCSVQsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRAotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX2NIUk0sIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfY0hSTShwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRAotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX3NSR0IsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRAotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX2lDQ1AsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9zUExUX1NVUFBPUlRFRAotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX3NQTFQsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfc1BMVChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF90Uk5TX1NVUFBPUlRFRAotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX3RSTlMsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfdFJOUyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRAotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX2JLR0QsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRAotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX2hJU1QsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfaElTVChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRAotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX3BIWXMsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9vRkZzX1NVUFBPUlRFRAotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX29GRnMsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfb0ZGcyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9wQ0FMX1NVUFBPUlRFRAotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX3BDQUwsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfcENBTChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRAotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX3NDQUwsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfc0NBTChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF90SU1FX1NVUFBPUlRFRAotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX3RJTUUsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfdElNRShwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRAotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX3RFWHQsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfdEVYdChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRAotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX3pUWHQsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfelRYdChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRAotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX2lUWHQsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfaVRYdChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0jZW5kaWYKLSAgIGVsc2UKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgcG5nX2hhbmRsZV91bmtub3duKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7Ci0gICB9Ci0KLSAgIHBuZ19wdHItPm1vZGUgJj0gflBOR19IQVZFX0NIVU5LX0hFQURFUjsKLX0KLQotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcHVzaF9jcmNfc2tpcChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiBza2lwKQotewotICAgcG5nX3B0ci0+cHJvY2Vzc19tb2RlID0gUE5HX1NLSVBfTU9ERTsKLSAgIHBuZ19wdHItPnNraXBfbGVuZ3RoID0gc2tpcDsKLX0KLQotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcHVzaF9jcmNfZmluaXNoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBpZiAocG5nX3B0ci0+c2tpcF9sZW5ndGggJiYgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSkKLSAgIHsKLSAgICAgIHBuZ19zaXplX3Qgc2F2ZV9zaXplOwotCi0gICAgICBpZiAocG5nX3B0ci0+c2tpcF9sZW5ndGggPCAocG5nX3VpbnRfMzIpcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSkKLSAgICAgICAgIHNhdmVfc2l6ZSA9IChwbmdfc2l6ZV90KXBuZ19wdHItPnNraXBfbGVuZ3RoOwotICAgICAgZWxzZQotICAgICAgICAgc2F2ZV9zaXplID0gcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZTsKLQotICAgICAgcG5nX2NhbGN1bGF0ZV9jcmMocG5nX3B0ciwgcG5nX3B0ci0+c2F2ZV9idWZmZXJfcHRyLCBzYXZlX3NpemUpOwotCi0gICAgICBwbmdfcHRyLT5za2lwX2xlbmd0aCAtPSBzYXZlX3NpemU7Ci0gICAgICBwbmdfcHRyLT5idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7Ci0gICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplIC09IHNhdmVfc2l6ZTsKLSAgICAgIHBuZ19wdHItPnNhdmVfYnVmZmVyX3B0ciArPSBzYXZlX3NpemU7Ci0gICB9Ci0gICBpZiAocG5nX3B0ci0+c2tpcF9sZW5ndGggJiYgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSkKLSAgIHsKLSAgICAgIHBuZ19zaXplX3Qgc2F2ZV9zaXplOwotCi0gICAgICBpZiAocG5nX3B0ci0+c2tpcF9sZW5ndGggPCAocG5nX3VpbnRfMzIpcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSkKLSAgICAgICAgIHNhdmVfc2l6ZSA9IChwbmdfc2l6ZV90KXBuZ19wdHItPnNraXBfbGVuZ3RoOwotICAgICAgZWxzZQotICAgICAgICAgc2F2ZV9zaXplID0gcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZTsKLQotICAgICAgcG5nX2NhbGN1bGF0ZV9jcmMocG5nX3B0ciwgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfcHRyLCBzYXZlX3NpemUpOwotCi0gICAgICBwbmdfcHRyLT5za2lwX2xlbmd0aCAtPSBzYXZlX3NpemU7Ci0gICAgICBwbmdfcHRyLT5idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7Ci0gICAgICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplIC09IHNhdmVfc2l6ZTsKLSAgICAgIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3B0ciArPSBzYXZlX3NpemU7Ci0gICB9Ci0gICBpZiAoIXBuZ19wdHItPnNraXBfbGVuZ3RoKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPmJ1ZmZlcl9zaXplIDwgNCkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKTsKLSAgICAgIHBuZ19wdHItPnByb2Nlc3NfbW9kZSA9IFBOR19SRUFEX0NIVU5LX01PREU7Ci0gICB9Ci19Ci0KLXZvaWQgUE5HQVBJCi1wbmdfcHVzaF9maWxsX2J1ZmZlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIHBuZ19ieXRlcCBwdHI7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIHB0ciA9IGJ1ZmZlcjsKLSAgIGlmIChwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplKQotICAgewotICAgICAgcG5nX3NpemVfdCBzYXZlX3NpemU7Ci0KLSAgICAgIGlmIChsZW5ndGggPCBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplKQotICAgICAgICAgc2F2ZV9zaXplID0gbGVuZ3RoOwotICAgICAgZWxzZQotICAgICAgICAgc2F2ZV9zaXplID0gcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZTsKLQotICAgICAgcG5nX21lbWNweShwdHIsIHBuZ19wdHItPnNhdmVfYnVmZmVyX3B0ciwgc2F2ZV9zaXplKTsKLSAgICAgIGxlbmd0aCAtPSBzYXZlX3NpemU7Ci0gICAgICBwdHIgKz0gc2F2ZV9zaXplOwotICAgICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOwotICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7Ci0gICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIgKz0gc2F2ZV9zaXplOwotICAgfQotICAgaWYgKGxlbmd0aCAmJiBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplKQotICAgewotICAgICAgcG5nX3NpemVfdCBzYXZlX3NpemU7Ci0KLSAgICAgIGlmIChsZW5ndGggPCBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplKQotICAgICAgICAgc2F2ZV9zaXplID0gbGVuZ3RoOwotCi0gICAgICBlbHNlCi0gICAgICAgICBzYXZlX3NpemUgPSBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplOwotCi0gICAgICBwbmdfbWVtY3B5KHB0ciwgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfcHRyLCBzYXZlX3NpemUpOwotICAgICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOwotICAgICAgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7Ci0gICAgICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIgKz0gc2F2ZV9zaXplOwotICAgfQotfQotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBpZiAocG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIgIT0gcG5nX3B0ci0+c2F2ZV9idWZmZXIpCi0gICAgICB7Ci0gICAgICAgICBwbmdfc2l6ZV90IGksIGlzdG9wOwotICAgICAgICAgcG5nX2J5dGVwIHNwOwotICAgICAgICAgcG5nX2J5dGVwIGRwOwotCi0gICAgICAgICBpc3RvcCA9IHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemU7Ci0gICAgICAgICBmb3IgKGkgPSAwLCBzcCA9IHBuZ19wdHItPnNhdmVfYnVmZmVyX3B0ciwgZHAgPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcjsKLSAgICAgICAgICAgIGkgPCBpc3RvcDsgaSsrLCBzcCsrLCBkcCsrKQotICAgICAgICAgewotICAgICAgICAgICAgKmRwID0gKnNwOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotICAgaWYgKHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUgKyBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplID4KLSAgICAgIHBuZ19wdHItPnNhdmVfYnVmZmVyX21heCkKLSAgIHsKLSAgICAgIHBuZ19zaXplX3QgbmV3X21heDsKLSAgICAgIHBuZ19ieXRlcCBvbGRfYnVmZmVyOwotCi0gICAgICBpZiAocG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSA+IFBOR19TSVpFX01BWCAtCi0gICAgICAgICAocG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSArIDI1NikpCi0gICAgICB7Ci0gICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiUG90ZW50aWFsIG92ZXJmbG93IG9mIHNhdmVfYnVmZmVyIik7Ci0gICAgICB9Ci0KLSAgICAgIG5ld19tYXggPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplICsgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSArIDI1NjsKLSAgICAgIG9sZF9idWZmZXIgPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcjsKLSAgICAgIHBuZ19wdHItPnNhdmVfYnVmZmVyID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKLSAgICAgICAgIG5ld19tYXgpOwotICAgICAgaWYgKHBuZ19wdHItPnNhdmVfYnVmZmVyID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIG9sZF9idWZmZXIpOwotICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgZm9yIHNhdmVfYnVmZmVyIik7Ci0gICAgICB9Ci0gICAgICBwbmdfbWVtY3B5KHBuZ19wdHItPnNhdmVfYnVmZmVyLCBvbGRfYnVmZmVyLCBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplKTsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIG9sZF9idWZmZXIpOwotICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfbWF4ID0gbmV3X21heDsKLSAgIH0KLSAgIGlmIChwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplKQotICAgewotICAgICAgcG5nX21lbWNweShwbmdfcHRyLT5zYXZlX2J1ZmZlciArIHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUsCi0gICAgICAgICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIsIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUpOwotICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSArPSBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplOwotICAgICAgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSA9IDA7Ci0gICB9Ci0gICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIgPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcjsKLSAgIHBuZ19wdHItPmJ1ZmZlcl9zaXplID0gMDsKLX0KLQotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcHVzaF9yZXN0b3JlX2J1ZmZlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmZmVyLAotICAgcG5nX3NpemVfdCBidWZmZXJfbGVuZ3RoKQotewotICAgcG5nX3B0ci0+Y3VycmVudF9idWZmZXIgPSBidWZmZXI7Ci0gICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplID0gYnVmZmVyX2xlbmd0aDsKLSAgIHBuZ19wdHItPmJ1ZmZlcl9zaXplID0gYnVmZmVyX2xlbmd0aCArIHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemU7Ci0gICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIgPSBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcjsKLX0KLQotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcHVzaF9yZWFkX0lEQVQocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIFBOR19JREFUOwotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0NIVU5LX0hFQURFUikpCi0gICB7Ci0gICAgICBwbmdfYnl0ZSBjaHVua19sZW5ndGhbNF07Ci0KLSAgICAgIGlmIChwbmdfcHRyLT5idWZmZXJfc2l6ZSA8IDgpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgcG5nX3B1c2hfZmlsbF9idWZmZXIocG5nX3B0ciwgY2h1bmtfbGVuZ3RoLCA0KTsKLSAgICAgIHBuZ19wdHItPnB1c2hfbGVuZ3RoID0gcG5nX2dldF91aW50XzMxKHBuZ19wdHIsIGNodW5rX2xlbmd0aCk7Ci0gICAgICBwbmdfcmVzZXRfY3JjKHBuZ19wdHIpOwotICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rX25hbWUsIDQpOwotICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9DSFVOS19IRUFERVI7Ci0KLSAgICAgIGlmIChwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19JREFULCA0KSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdHItPnByb2Nlc3NfbW9kZSA9IFBOR19SRUFEX0NIVU5LX01PREU7Ci0gICAgICAgICBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1pMSUJfRklOSVNIRUQpKQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJOb3QgZW5vdWdoIGNvbXByZXNzZWQgZGF0YSIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfcHRyLT5pZGF0X3NpemUgPSBwbmdfcHRyLT5wdXNoX2xlbmd0aDsKLSAgIH0KLSAgIGlmIChwbmdfcHRyLT5pZGF0X3NpemUgJiYgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSkKLSAgIHsKLSAgICAgIHBuZ19zaXplX3Qgc2F2ZV9zaXplOwotCi0gICAgICBpZiAocG5nX3B0ci0+aWRhdF9zaXplIDwgKHBuZ191aW50XzMyKXBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUpCi0gICAgICB7Ci0gICAgICAgICBzYXZlX3NpemUgPSAocG5nX3NpemVfdClwbmdfcHRyLT5pZGF0X3NpemU7Ci0KLSAgICAgICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLwotICAgICAgICAgaWYgKChwbmdfdWludF8zMilzYXZlX3NpemUgIT0gcG5nX3B0ci0+aWRhdF9zaXplKQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJzYXZlX3NpemUgb3ZlcmZsb3dlZCBpbiBwbmdwcmVhZCIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICAgc2F2ZV9zaXplID0gcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZTsKLQotICAgICAgcG5nX2NhbGN1bGF0ZV9jcmMocG5nX3B0ciwgcG5nX3B0ci0+c2F2ZV9idWZmZXJfcHRyLCBzYXZlX3NpemUpOwotCi0gICAgICBwbmdfcHJvY2Vzc19JREFUX2RhdGEocG5nX3B0ciwgcG5nX3B0ci0+c2F2ZV9idWZmZXJfcHRyLCBzYXZlX3NpemUpOwotCi0gICAgICBwbmdfcHRyLT5pZGF0X3NpemUgLT0gc2F2ZV9zaXplOwotICAgICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOwotICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7Ci0gICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIgKz0gc2F2ZV9zaXplOwotICAgfQotICAgaWYgKHBuZ19wdHItPmlkYXRfc2l6ZSAmJiBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplKQotICAgewotICAgICAgcG5nX3NpemVfdCBzYXZlX3NpemU7Ci0KLSAgICAgIGlmIChwbmdfcHRyLT5pZGF0X3NpemUgPCAocG5nX3VpbnRfMzIpcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHNhdmVfc2l6ZSA9IChwbmdfc2l6ZV90KXBuZ19wdHItPmlkYXRfc2l6ZTsKLQotICAgICAgICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gICAgICAgICBpZiAoKHBuZ191aW50XzMyKXNhdmVfc2l6ZSAhPSBwbmdfcHRyLT5pZGF0X3NpemUpCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInNhdmVfc2l6ZSBvdmVyZmxvd2VkIGluIHBuZ3ByZWFkIik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgICBzYXZlX3NpemUgPSBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplOwotCi0gICAgICBwbmdfY2FsY3VsYXRlX2NyYyhwbmdfcHRyLCBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIsIHNhdmVfc2l6ZSk7Ci0KLSAgICAgIHBuZ19wcm9jZXNzX0lEQVRfZGF0YShwbmdfcHRyLCBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIsIHNhdmVfc2l6ZSk7Ci0KLSAgICAgIHBuZ19wdHItPmlkYXRfc2l6ZSAtPSBzYXZlX3NpemU7Ci0gICAgICBwbmdfcHRyLT5idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7Ci0gICAgICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplIC09IHNhdmVfc2l6ZTsKLSAgICAgIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3B0ciArPSBzYXZlX3NpemU7Ci0gICB9Ci0gICBpZiAoIXBuZ19wdHItPmlkYXRfc2l6ZSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5idWZmZXJfc2l6ZSA8IDQpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCk7Ci0gICAgICBwbmdfcHRyLT5tb2RlICY9IH5QTkdfSEFWRV9DSFVOS19IRUFERVI7Ci0gICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19BRlRFUl9JREFUOwotICAgfQotfQotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19wcm9jZXNzX0lEQVRfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmZmVyLAotICAgcG5nX3NpemVfdCBidWZmZXJfbGVuZ3RoKQotewotICAgLyogVGhlIGNhbGxlciBjaGVja3MgZm9yIGEgbm9uLXplcm8gYnVmZmVyIGxlbmd0aC4gKi8KLSAgIGlmICghKGJ1ZmZlcl9sZW5ndGggPiAwKSB8fCBidWZmZXIgPT0gTlVMTCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTm8gSURBVCBkYXRhIChpbnRlcm5hbCBlcnJvcikiKTsKLQotICAgLyogVGhpcyByb3V0aW5lIG11c3QgcHJvY2VzcyBhbGwgdGhlIGRhdGEgaXQgaGFzIGJlZW4gZ2l2ZW4KLSAgICAqIGJlZm9yZSByZXR1cm5pbmcsIGNhbGxpbmcgdGhlIHJvdyBjYWxsYmFjayBhcyByZXF1aXJlZCB0bwotICAgICogaGFuZGxlIHRoZSB1bmNvbXByZXNzZWQgcmVzdWx0cy4KLSAgICAqLwotICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X2luID0gYnVmZmVyOwotICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KWJ1ZmZlcl9sZW5ndGg7Ci0KLSAgIC8qIEtlZXAgZ29pbmcgdW50aWwgdGhlIGRlY29tcHJlc3NlZCBkYXRhIGlzIGFsbCBwcm9jZXNzZWQKLSAgICAqIG9yIHRoZSBzdHJlYW0gbWFya2VkIGFzIGZpbmlzaGVkLgotICAgICovCi0gICB3aGlsZSAocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA+IDAgJiYKLSAgICAgICEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19aTElCX0ZJTklTSEVEKSkKLSAgIHsKLSAgICAgIGludCByZXQ7Ci0KLSAgICAgIC8qIFdlIGhhdmUgZGF0YSBmb3IgemxpYiwgYnV0IHdlIG11c3QgY2hlY2sgdGhhdCB6bGliCi0gICAgICAgKiBoYXMgc29tZXdoZXJlIHRvIHB1dCB0aGUgcmVzdWx0cy4gIEl0IGRvZXNuJ3QgbWF0dGVyCi0gICAgICAgKiBpZiB3ZSBkb24ndCBleHBlY3QgYW55IHJlc3VsdHMgLS0gaXQgbWF5IGJlIHRoZSBpbnB1dAotICAgICAgICogZGF0YSBpcyBqdXN0IHRoZSBMWiBlbmQgY29kZS4KLSAgICAgICAqLwotICAgICAgaWYgKCEocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPiAwKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0KLSAgICAgICAgICAgICAodUludCkgUE5HX1JPV0JZVEVTKHBuZ19wdHItPnBpeGVsX2RlcHRoLAotICAgICAgICAgICAgIHBuZ19wdHItPml3aWR0aCkgKyAxOwotICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IHBuZ19wdHItPnJvd19idWY7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFVzaW5nIFpfU1lOQ19GTFVTSCBoZXJlIG1lYW5zIHRoYXQgYW4gdW50ZXJtaW5hdGVkCi0gICAgICAgKiBMWiBzdHJlYW0gY2FuIHN0aWxsIGJlIGhhbmRsZWQgKGEgc3RyZWFtIHdpdGggYSBtaXNzaW5nCi0gICAgICAgKiBlbmQgY29kZSksIG90aGVyd2lzZSAoWl9OT19GTFVTSCkgYSBmdXR1cmUgemxpYgotICAgICAgICogaW1wbGVtZW50YXRpb24gbWlnaHQgZGVmZXIgb3V0cHV0IGFuZCwgdGhlcmVmb3JlLAotICAgICAgICogY2hhbmdlIHRoZSBjdXJyZW50IGJlaGF2aW9yLiAgKFNlZSBjb21tZW50cyBpbiBpbmZsYXRlLmMKLSAgICAgICAqIGZvciB3aHkgdGhpcyBkb2Vzbid0IGhhcHBlbiBhdCBwcmVzZW50IHdpdGggemxpYiAxLjIuNS4pCi0gICAgICAgKi8KLSAgICAgIHJldCA9IGluZmxhdGUoJnBuZ19wdHItPnpzdHJlYW0sIFpfU1lOQ19GTFVTSCk7Ci0KLSAgICAgIC8qIENoZWNrIGZvciBhbnkgZmFpbHVyZSBiZWZvcmUgcHJvY2VlZGluZy4gKi8KLSAgICAgIGlmIChyZXQgIT0gWl9PSyAmJiByZXQgIT0gWl9TVFJFQU1fRU5EKQotICAgICAgewotICAgICAgICAgLyogVGVybWluYXRlIHRoZSBkZWNvbXByZXNzaW9uLiAqLwotICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfWkxJQl9GSU5JU0hFRDsKLQotICAgICAgICAgLyogVGhpcyBtYXkgYmUgYSB0cnVuY2F0ZWQgc3RyZWFtIChtaXNzaW5nIG9yCi0gICAgICAgICAgKiBkYW1hZ2VkIGVuZCBjb2RlKS4gIFRyZWF0IHRoYXQgYXMgYSB3YXJuaW5nLgotICAgICAgICAgICovCi0gICAgICAgICBpZiAocG5nX3B0ci0+cm93X251bWJlciA+PSBwbmdfcHRyLT5udW1fcm93cyB8fAotICAgICAgICAgICAgIHBuZ19wdHItPnBhc3MgPiA2KQotICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlRydW5jYXRlZCBjb21wcmVzc2VkIGRhdGEgaW4gSURBVCIpOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJEZWNvbXByZXNzaW9uIGVycm9yIGluIElEQVQiKTsKLQotICAgICAgICAgLyogU2tpcCB0aGUgY2hlY2sgb24gdW5wcm9jZXNzZWQgaW5wdXQgKi8KLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLyogRGlkIGluZmxhdGUgb3V0cHV0IGFueSBkYXRhPyAqLwotICAgICAgaWYgKHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgIT0gcG5nX3B0ci0+cm93X2J1ZikKLSAgICAgIHsKLSAgICAgICAgIC8qIElzIHRoaXMgdW5leHBlY3RlZCBkYXRhIGFmdGVyIHRoZSBsYXN0IHJvdz8KLSAgICAgICAgICAqIElmIGl0IGlzLCBhcnRpZmljaWFsbHkgdGVybWluYXRlIHRoZSBMWiBvdXRwdXQKLSAgICAgICAgICAqIGhlcmUuCi0gICAgICAgICAgKi8KLSAgICAgICAgIGlmIChwbmdfcHRyLT5yb3dfbnVtYmVyID49IHBuZ19wdHItPm51bV9yb3dzIHx8Ci0gICAgICAgICAgICAgcG5nX3B0ci0+cGFzcyA+IDYpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKiBFeHRyYSBkYXRhLiAqLwotICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkV4dHJhIGNvbXByZXNzZWQgZGF0YSBpbiBJREFUIik7Ci0gICAgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0ZJTklTSEVEOwotICAgICAgICAgICAgLyogRG8gbm8gbW9yZSBwcm9jZXNzaW5nOyBza2lwIHRoZSB1bnByb2Nlc3NlZAotICAgICAgICAgICAgICogaW5wdXQgY2hlY2sgYmVsb3cuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgIH0KLQotICAgICAgICAgLyogRG8gd2UgaGF2ZSBhIGNvbXBsZXRlIHJvdz8gKi8KLSAgICAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9PSAwKQotICAgICAgICAgICAgcG5nX3B1c2hfcHJvY2Vzc19yb3cocG5nX3B0cik7Ci0gICAgICB9Ci0KLSAgICAgIC8qIEFuZCBjaGVjayBmb3IgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLiAqLwotICAgICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQpCi0gICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0ZJTklTSEVEOwotICAgfQotCi0gICAvKiBBbGwgdGhlIGRhdGEgc2hvdWxkIGhhdmUgYmVlbiBwcm9jZXNzZWQsIGlmIGFueXRoaW5nCi0gICAgKiBpcyBsZWZ0IGF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBieXRlcyBvZiBJREFUIGRhdGEKLSAgICAqIGFmdGVyIHRoZSB6bGliIGVuZCBjb2RlLgotICAgICovCi0gICBpZiAocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA+IDApCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiRXh0cmEgY29tcHJlc3Npb24gZGF0YSIpOwotfQotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19wdXNoX3Byb2Nlc3Nfcm93KHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfcHRyLT5yb3dfaW5mby5jb2xvcl90eXBlID0gcG5nX3B0ci0+Y29sb3JfdHlwZTsKLSAgIHBuZ19wdHItPnJvd19pbmZvLndpZHRoID0gcG5nX3B0ci0+aXdpZHRoOwotICAgcG5nX3B0ci0+cm93X2luZm8uY2hhbm5lbHMgPSBwbmdfcHRyLT5jaGFubmVsczsKLSAgIHBuZ19wdHItPnJvd19pbmZvLmJpdF9kZXB0aCA9IHBuZ19wdHItPmJpdF9kZXB0aDsKLSAgIHBuZ19wdHItPnJvd19pbmZvLnBpeGVsX2RlcHRoID0gcG5nX3B0ci0+cGl4ZWxfZGVwdGg7Ci0KLSAgIHBuZ19wdHItPnJvd19pbmZvLnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHBuZ19wdHItPnJvd19pbmZvLnBpeGVsX2RlcHRoLAotICAgICAgIHBuZ19wdHItPnJvd19pbmZvLndpZHRoKTsKLQotICAgcG5nX3JlYWRfZmlsdGVyX3JvdyhwbmdfcHRyLCAmKHBuZ19wdHItPnJvd19pbmZvKSwKLSAgICAgICBwbmdfcHRyLT5yb3dfYnVmICsgMSwgcG5nX3B0ci0+cHJldl9yb3cgKyAxLAotICAgICAgIChpbnQpKHBuZ19wdHItPnJvd19idWZbMF0pKTsKLQotICAgcG5nX21lbWNweShwbmdfcHRyLT5wcmV2X3JvdywgcG5nX3B0ci0+cm93X2J1ZiwgcG5nX3B0ci0+cm93Ynl0ZXMgKyAxKTsKLQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8fCAocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfU1RSSVBfQUxQSEEpKQotICAgICAgcG5nX2RvX3JlYWRfdHJhbnNmb3JtYXRpb25zKHBuZ19wdHIpOwotCi0jaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECi0gICAvKiBCbG93IHVwIGludGVybGFjZWQgcm93cyB0byBmdWxsIHNpemUgKi8KLSAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkICYmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wYXNzIDwgNikKLS8qICAgICAgIG9sZCBpbnRlcmZhY2UgKHByZS0xLjAuOSk6Ci0gICAgICAgICBwbmdfZG9fcmVhZF9pbnRlcmxhY2UoJihwbmdfcHRyLT5yb3dfaW5mbyksCi0gICAgICAgICAgICAgcG5nX3B0ci0+cm93X2J1ZiArIDEsIHBuZ19wdHItPnBhc3MsIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyk7Ci0gKi8KLSAgICAgICAgIHBuZ19kb19yZWFkX2ludGVybGFjZShwbmdfcHRyKTsKLQotICAgIHN3aXRjaCAocG5nX3B0ci0+cGFzcykKLSAgICB7Ci0gICAgICAgICBjYXNlIDA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4ICYmIHBuZ19wdHItPnBhc3MgPT0gMDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOyAvKiBVcGRhdGVzIHBuZ19wdHItPnBhc3MgKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gMikgLyogUGFzcyAxIG1pZ2h0IGJlIGVtcHR5ICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNCAmJiBwbmdfcHRyLT5wYXNzID09IDI7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA9PSA0ICYmIHBuZ19wdHItPmhlaWdodCA8PSA0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIgJiYgcG5nX3B0ci0+cGFzcyA9PSA0OyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gNiAmJiBwbmdfcHRyLT5oZWlnaHQgPD0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotCi0gICAgICAgICBjYXNlIDE6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4ICYmIHBuZ19wdHItPnBhc3MgPT0gMTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA9PSAyKSAvKiBTa2lwIHRvcCA0IGdlbmVyYXRlZCByb3dzICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNCAmJiBwbmdfcHRyLT5wYXNzID09IDI7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotICAgICAgICAgY2FzZSAyOgotICAgICAgICAgewotICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0ICYmIHBuZ19wdHItPnBhc3MgPT0gMjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNCAmJiBwbmdfcHRyLT5wYXNzID09IDI7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIE5VTEwpOwotICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA9PSA0KSAvKiBQYXNzIDMgbWlnaHQgYmUgZW1wdHkgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyICYmIHBuZ19wdHItPnBhc3MgPT0gNDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotCi0gICAgICAgICBjYXNlIDM6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQgJiYgcG5nX3B0ci0+cGFzcyA9PSAzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7Ci0gICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wYXNzID09IDQpIC8qIFNraXAgdG9wIHR3byBnZW5lcmF0ZWQgcm93cyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIgJiYgcG5nX3B0ci0+cGFzcyA9PSA0OyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMiAmJiBwbmdfcHRyLT5wYXNzID09IDQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIgJiYgcG5nX3B0ci0+cGFzcyA9PSA0OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBOVUxMKTsKLSAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gNikgLyogUGFzcyA1IG1pZ2h0IGJlIGVtcHR5ICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBOVUxMKTsKLSAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGNhc2UgNToKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMiAmJiBwbmdfcHRyLT5wYXNzID09IDU7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gNikgLyogU2tpcCB0b3AgZ2VuZXJhdGVkIHJvdyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgTlVMTCk7Ci0gICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotCi0gICAgICAgICBkZWZhdWx0OgotICAgICAgICAgY2FzZSA2OgotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOwotCi0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyAhPSA2KQotICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIE5VTEwpOwotICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotICAgZWxzZQotI2VuZGlmCi0gICB7Ci0gICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7Ci0gICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICB9Ci19Ci0KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICAvKiBBcnJheXMgdG8gZmFjaWxpdGF0ZSBlYXN5IGludGVybGFjaW5nIC0gdXNlIHBhc3MgKDAgLSA2KSBhcyBpbmRleCAqLwotCi0gICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgKi8KLSAgIFBOR19DT05TVCBpbnQgRkFSREFUQSBwbmdfcGFzc19zdGFydFtdID0gezAsIDQsIDAsIDIsIDAsIDEsIDB9OwotCi0gICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgKi8KLSAgIFBOR19DT05TVCBpbnQgRkFSREFUQSBwbmdfcGFzc19pbmNbXSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsKLQotICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLwotICAgUE5HX0NPTlNUIGludCBGQVJEQVRBIHBuZ19wYXNzX3lzdGFydFtdID0gezAsIDAsIDQsIDAsIDIsIDAsIDF9OwotCi0gICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovCi0gICBQTkdfQ09OU1QgaW50IEZBUkRBVEEgcG5nX3Bhc3NfeWluY1tdID0gezgsIDgsIDgsIDQsIDQsIDIsIDJ9OwotCi0gICAvKiBIZWlnaHQgb2YgaW50ZXJsYWNlIGJsb2NrLiAgVGhpcyBpcyBub3QgY3VycmVudGx5IHVzZWQgLSBpZiB5b3UgbmVlZAotICAgICogaXQsIHVuY29tbWVudCBpdCBoZXJlIGFuZCBpbiBwbmcuaAotICAgUE5HX0NPTlNUIGludCBGQVJEQVRBIHBuZ19wYXNzX2hlaWdodFtdID0gezgsIDgsIDQsIDQsIDIsIDIsIDF9OwotICAgKi8KLQotICAgcG5nX3B0ci0+cm93X251bWJlcisrOwotICAgaWYgKHBuZ19wdHItPnJvd19udW1iZXIgPCBwbmdfcHRyLT5udW1fcm93cykKLSAgICAgIHJldHVybjsKLQotI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQpCi0gICB7Ci0gICAgICBwbmdfcHRyLT5yb3dfbnVtYmVyID0gMDsKLSAgICAgIHBuZ19tZW1zZXQocG5nX3B0ci0+cHJldl9yb3csIDAsCi0gICAgICAgICBwbmdfcHRyLT5yb3dieXRlcyArIDEpOwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdHItPnBhc3MrKzsKLSAgICAgICAgIGlmICgocG5nX3B0ci0+cGFzcyA9PSAxICYmIHBuZ19wdHItPndpZHRoIDwgNSkgfHwKLSAgICAgICAgICAgICAocG5nX3B0ci0+cGFzcyA9PSAzICYmIHBuZ19wdHItPndpZHRoIDwgMykgfHwKLSAgICAgICAgICAgICAocG5nX3B0ci0+cGFzcyA9PSA1ICYmIHBuZ19wdHItPndpZHRoIDwgMikpCi0gICAgICAgICAgIHBuZ19wdHItPnBhc3MrKzsKLQotICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPiA3KQotICAgICAgICAgICAgcG5nX3B0ci0+cGFzcy0tOwotCi0gICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA+PSA3KQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIHBuZ19wdHItPml3aWR0aCA9IChwbmdfcHRyLT53aWR0aCArCi0gICAgICAgICAgICBwbmdfcGFzc19pbmNbcG5nX3B0ci0+cGFzc10gLSAxIC0KLSAgICAgICAgICAgIHBuZ19wYXNzX3N0YXJ0W3BuZ19wdHItPnBhc3NdKSAvCi0gICAgICAgICAgICBwbmdfcGFzc19pbmNbcG5nX3B0ci0+cGFzc107Ci0KLSAgICAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIHBuZ19wdHItPm51bV9yb3dzID0gKHBuZ19wdHItPmhlaWdodCArCi0gICAgICAgICAgICBwbmdfcGFzc195aW5jW3BuZ19wdHItPnBhc3NdIC0gMSAtCi0gICAgICAgICAgICBwbmdfcGFzc195c3RhcnRbcG5nX3B0ci0+cGFzc10pIC8KLSAgICAgICAgICAgIHBuZ19wYXNzX3lpbmNbcG5nX3B0ci0+cGFzc107Ci0KLSAgICAgIH0gd2hpbGUgKHBuZ19wdHItPml3aWR0aCA9PSAwIHx8IHBuZ19wdHItPm51bV9yb3dzID09IDApOwotICAgfQotI2VuZGlmIC8qIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCAqLwotfQotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19wdXNoX2hhdmVfaW5mbyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBpZiAocG5nX3B0ci0+aW5mb19mbiAhPSBOVUxMKQotICAgICAgKCoocG5nX3B0ci0+aW5mb19mbikpKHBuZ19wdHIsIGluZm9fcHRyKTsKLX0KLQotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcHVzaF9oYXZlX2VuZChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBpZiAocG5nX3B0ci0+ZW5kX2ZuICE9IE5VTEwpCi0gICAgICAoKihwbmdfcHRyLT5lbmRfZm4pKShwbmdfcHRyLCBpbmZvX3B0cik7Ci19Ci0KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIHJvdykKLXsKLSAgIGlmIChwbmdfcHRyLT5yb3dfZm4gIT0gTlVMTCkKLSAgICAgICgqKHBuZ19wdHItPnJvd19mbikpKHBuZ19wdHIsIHJvdywgcG5nX3B0ci0+cm93X251bWJlciwKLSAgICAgICAgIChpbnQpcG5nX3B0ci0+cGFzcyk7Ci19Ci0KLXZvaWQgUE5HQVBJCi1wbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19ieXRlcCBvbGRfcm93LCBwbmdfYnl0ZXAgbmV3X3JvdykKLXsKLSAgIFBOR19DT05TVCBpbnQgRkFSREFUQSBwbmdfcGFzc19kc3BfbWFza1s3XSA9Ci0gICAgICB7MHhmZiwgMHgwZiwgMHhmZiwgMHgzMywgMHhmZiwgMHg1NSwgMHhmZn07Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIGlmIChuZXdfcm93ICE9IE5VTEwpICAgIC8qIG5ld19yb3cgbXVzdCA9PSBwbmdfcHRyLT5yb3dfYnVmIGhlcmUuICovCi0gICAgICBwbmdfY29tYmluZV9yb3cocG5nX3B0ciwgb2xkX3JvdywgcG5nX3Bhc3NfZHNwX21hc2tbcG5nX3B0ci0+cGFzc10pOwotfQotCi12b2lkIFBOR0FQSQotcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBwcm9ncmVzc2l2ZV9wdHIsCi0gICBwbmdfcHJvZ3Jlc3NpdmVfaW5mb19wdHIgaW5mb19mbiwgcG5nX3Byb2dyZXNzaXZlX3Jvd19wdHIgcm93X2ZuLAotICAgcG5nX3Byb2dyZXNzaXZlX2VuZF9wdHIgZW5kX2ZuKQotewotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgcG5nX3B0ci0+aW5mb19mbiA9IGluZm9fZm47Ci0gICBwbmdfcHRyLT5yb3dfZm4gPSByb3dfZm47Ci0gICBwbmdfcHRyLT5lbmRfZm4gPSBlbmRfZm47Ci0KLSAgIHBuZ19zZXRfcmVhZF9mbihwbmdfcHRyLCBwcm9ncmVzc2l2ZV9wdHIsIHBuZ19wdXNoX2ZpbGxfYnVmZmVyKTsKLX0KLQotcG5nX3ZvaWRwIFBOR0FQSQotcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm4gKE5VTEwpOwotCi0gICByZXR1cm4gcG5nX3B0ci0+aW9fcHRyOwotfQotI2VuZGlmIC8qIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9wbmdwcml2LmggYi9zcmMvbGlicG5nL3BuZ3ByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgzM2Y2MC4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3BuZ3ByaXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDk2NiArMCwwIEBACi0KLS8qIHBuZ3ByaXYuaCAtIHByaXZhdGUgZGVjbGFyYXRpb25zIGZvciB1c2UgaW5zaWRlIGxpYnBuZwotICoKLSAqIGxpYnBuZyB2ZXJzaW9uIDEuNC4xMiAtIEp1bHkgMTAsIDIwMTIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTEgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSAqLwotCi0vKiBUaGUgc3ltYm9scyBkZWNsYXJlZCBpbiB0aGlzIGZpbGUgKGluY2x1ZGluZyB0aGUgZnVuY3Rpb25zIGRlY2xhcmVkCi0gKiBhcyBQTkdfRVhURVJOKSBhcmUgUFJJVkFURS4gIFRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBsaWJwbmcgcHVibGljCi0gKiBpbnRlcmZhY2UsIGFuZCBhcmUgbm90IHJlY29tbWVuZGVkIGZvciB1c2UgYnkgcmVndWxhciBhcHBsaWNhdGlvbnMuCi0gKiBTb21lIG9mIHRoZW0gbWF5IGJlY29tZSBwdWJsaWMgaW4gdGhlIGZ1dHVyZTsgb3RoZXJzIG1heSBzdGF5IHByaXZhdGUsCi0gKiBjaGFuZ2UgaW4gYW4gaW5jb21wYXRpYmxlIHdheSwgb3IgZXZlbiBkaXNhcHBlYXIuCi0gKiBBbHRob3VnaCB0aGUgbGlicG5nIHVzZXJzIGFyZSBub3QgZm9yYmlkZGVuIHRvIGluY2x1ZGUgdGhpcyBoZWFkZXIsCi0gKiB0aGV5IHNob3VsZCBiZSB3ZWxsIGF3YXJlIG9mIHRoZSBpc3N1ZXMgdGhhdCBtYXkgYXJpc2UgZnJvbSBkb2luZyBzby4KLSAqLwotCi0jaWZuZGVmIFBOR1BSSVZfSAotI2RlZmluZSBQTkdQUklWX0gKLQotI2lmbmRlZiBQTkdfVkVSU0lPTl9JTkZPX09OTFkKLQotI2lmIGRlZmluZWQoX0FJWCkgJiYgZGVmaW5lZChfQUxMX1NPVVJDRSkKLSAgIC8qIE9uIEFJWCBpZiBfQUxMX1NPVVJDRSBpcyBkZWZpbmVkIHN0YW5kYXJkIGhlYWRlciBmaWxlcyAoaW5jbHVkaW5nCi0gICAgKiBzdGRsaWIuaCkgZGVmaW5lIGlkZW50aWZpZXJzIHRoYXQgYXJlIG5vdCBwZXJtaXR0ZWQgYnkgdGhlIEFOU0kgYW5kCi0gICAgKiBQT1NJWCBzdGFuZGFyZHMuICBJbiBwYXJ0aWN1bGFyICdqbXBidWYnIGlzICNkZWZpbmVkIGFuZCB0aGlzIHdpbGwKLSAgICAqIHByZXZlbnQgY29tcGlsYXRpb24gb2YgbGlicG5nLiAgVGhlIGZvbGxvd2luZyBwcmV2ZW50cyB0aGlzOgotICAgICovCi0jICB1bmRlZiBfQUxMX1NPVVJDRQotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2lmbmRlZiBQTkdfRVhURVJOCi0vKiBUaGUgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IFBOR19FWFRFUk4gYXJlIGludGVybmFsIGZ1bmN0aW9ucywgd2hpY2gKLSAqIGFyZW4ndCB1c3VhbGx5IHVzZWQgb3V0c2lkZSB0aGUgbGlicmFyeSAoYXMgZmFyIGFzIEkga25vdyksIHNvIGl0IGlzCi0gKiBkZWJhdGFibGUgaWYgdGhleSBzaG91bGQgYmUgZXhwb3J0ZWQgYXQgYWxsLiAgSW4gdGhlIGZ1dHVyZSwgd2hlbiBpdAotICogaXMgcG9zc2libGUgdG8gaGF2ZSBydW4tdGltZSByZWdpc3RyeSBvZiBjaHVuay1oYW5kbGluZyBmdW5jdGlvbnMsCi0gKiBzb21lIG9mIHRoZXNlIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgYWdhaW4uCi0jICBkZWZpbmUgUE5HX0VYVEVSTiBleHRlcm4KLSAqLwotIyAgZGVmaW5lIFBOR19FWFRFUk4KLSNlbmRpZgotCi0vKiBPdGhlciBkZWZpbmVzIHNwZWNpZmljIHRvIGNvbXBpbGVycyBjYW4gZ28gaGVyZS4gIFRyeSB0byBrZWVwCi0gKiB0aGVtIGluc2lkZSBhbiBhcHByb3ByaWF0ZSBpZmRlZi9lbmRpZiBwYWlyIGZvciBwb3J0YWJpbGl0eS4KLSAqLwotCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotIyAgaWZkZWYgTUFDT1MKLSAgICAgLyogV2UgbmVlZCB0byBjaGVjayB0aGF0IDxtYXRoLmg+IGhhc24ndCBhbHJlYWR5IGJlZW4gaW5jbHVkZWQgZWFybGllcgotICAgICAgKiBhcyBpdCBzZWVtcyBpdCBkb2Vzbid0IGFncmVlIHdpdGggPGZwLmg+LCB5ZXQgd2Ugc2hvdWxkIHJlYWxseSB1c2UKLSAgICAgICogPGZwLmg+IGlmIHBvc3NpYmxlLgotICAgICAgKi8KLSMgICAgaWYgIWRlZmluZWQoX19NQVRIX0hfXykgJiYgIWRlZmluZWQoX19NQVRIX0gpICYmICFkZWZpbmVkKF9fY21hdGhfXykKLSMgICAgICBpbmNsdWRlIDxmcC5oPgotIyAgICBlbmRpZgotIyAgZWxzZQotIyAgICBpbmNsdWRlIDxtYXRoLmg+Ci0jICBlbmRpZgotIyAgaWYgZGVmaW5lZChfQU1JR0EpICYmIGRlZmluZWQoX19TQVNDKSAmJiBkZWZpbmVkKF9NNjg4ODEpCi0gICAgIC8qIEFtaWdhIFNBUy9DOiBXZSBtdXN0IGluY2x1ZGUgYnVpbHRpbiBGUFUgZnVuY3Rpb25zIHdoZW4gY29tcGlsaW5nIHVzaW5nCi0gICAgICAqIE1BVEg9Njg4ODEKLSAgICAgICovCi0jICAgIGluY2x1ZGUgPG02ODg4MS5oPgotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBDb2Rld2FycmlvciBvbiBOVCBoYXMgbGlua2luZyBwcm9ibGVtcyB3aXRob3V0IHRoaXMuICovCi0jaWYgKGRlZmluZWQoX19NV0VSS1NfXykgJiYgZGVmaW5lZChXSU4zMikpIHx8IGRlZmluZWQoX19TVERDX18pCi0jICBkZWZpbmUgUE5HX0FMV0FZU19FWFRFUk4KLSNlbmRpZgotCi0vKiBUaGlzIHByb3ZpZGVzIHRoZSBub24tQU5TSSAoZmFyKSBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcy4gKi8KLSNpZiBkZWZpbmVkKF9fVFVSQk9DX18pICYmIGRlZmluZWQoX19NU0RPU19fKQotIyAgaW5jbHVkZSA8bWVtLmg+Ci0jICBpbmNsdWRlIDxhbGxvYy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XaW5kb3dzKSB8fCBkZWZpbmVkKF9XSU5ET1dTKSB8fCBcCi0gICAgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKQotIyAgaW5jbHVkZSA8d2luZG93cy5oPiAgLyogZGVmaW5lcyBfV0lORE9XU18gbWFjcm8gKi8KLSNlbmRpZgotCi0vKiBWYXJpb3VzIG1vZGVzIG9mIG9wZXJhdGlvbi4gIE5vdGUgdGhhdCBhZnRlciBhbiBpbml0LCBtb2RlIGlzIHNldCB0bwotICogemVybyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHN0cnVjdHVyZSBpcyBjcmVhdGVkLgotICovCi0jZGVmaW5lIFBOR19IQVZFX0lIRFIgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIFBOR19IQVZFX1BMVEUgICAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIFBOR19IQVZFX0lEQVQgICAgICAgICAgICAgICAweDA0Ci0jZGVmaW5lIFBOR19BRlRFUl9JREFUICAgICAgICAgICAgICAweDA4IC8qIEhhdmUgY29tcGxldGUgemxpYiBkYXRhc3RyZWFtICovCi0jZGVmaW5lIFBOR19IQVZFX0lFTkQgICAgICAgICAgICAgICAweDEwCi0jZGVmaW5lIFBOR19IQVZFX2dBTUEgICAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIFBOR19IQVZFX2NIUk0gICAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIFBOR19IQVZFX3NSR0IgICAgICAgICAgICAgICAweDgwCi0jZGVmaW5lIFBOR19IQVZFX0NIVU5LX0hFQURFUiAgICAgIDB4MTAwCi0jZGVmaW5lIFBOR19XUk9URV90SU1FICAgICAgICAgICAgIDB4MjAwCi0jZGVmaW5lIFBOR19XUk9URV9JTkZPX0JFRk9SRV9QTFRFIDB4NDAwCi0jZGVmaW5lIFBOR19CQUNLR1JPVU5EX0lTX0dSQVkgICAgIDB4ODAwCi0jZGVmaW5lIFBOR19IQVZFX1BOR19TSUdOQVRVUkUgICAgMHgxMDAwCi0jZGVmaW5lIFBOR19IQVZFX0NIVU5LX0FGVEVSX0lEQVQgMHgyMDAwIC8qIEhhdmUgYW5vdGhlciBjaHVuayBhZnRlciBJREFUICovCi0KLS8qIEZsYWdzIGZvciB0aGUgdHJhbnNmb3JtYXRpb25zIHRoZSBQTkcgbGlicmFyeSBkb2VzIG9uIHRoZSBpbWFnZSBkYXRhICovCi0jZGVmaW5lIFBOR19CR1IgICAgICAgICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBQTkdfSU5URVJMQUNFICAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgUE5HX1BBQ0sgICAgICAgICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIFBOR19TSElGVCAgICAgICAgICAgICAgIDB4MDAwOAotI2RlZmluZSBQTkdfU1dBUF9CWVRFUyAgICAgICAgICAweDAwMTAKLSNkZWZpbmUgUE5HX0lOVkVSVF9NT05PICAgICAgICAgMHgwMDIwCi0jZGVmaW5lIFBOR19RVUFOVElaRSAgICAgICAgICAgIDB4MDA0MCAvKiBmb3JtZXJseSBQTkdfRElUSEVSICovCi0jZGVmaW5lIFBOR19CQUNLR1JPVU5EICAgICAgICAgIDB4MDA4MAotI2RlZmluZSBQTkdfQkFDS0dST1VORF9FWFBBTkQgICAweDAxMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMHgwMjAwIHVudXNlZCAqLwotI2RlZmluZSBQTkdfMTZfVE9fOCAgICAgICAgICAgICAweDA0MDAKLSNkZWZpbmUgUE5HX1JHQkEgICAgICAgICAgICAgICAgMHgwODAwCi0jZGVmaW5lIFBOR19FWFBBTkQgICAgICAgICAgICAgIDB4MTAwMAotI2RlZmluZSBQTkdfR0FNTUEgICAgICAgICAgICAgICAweDIwMDAKLSNkZWZpbmUgUE5HX0dSQVlfVE9fUkdCICAgICAgICAgMHg0MDAwCi0jZGVmaW5lIFBOR19GSUxMRVIgICAgICAgICAgICAgIDB4ODAwMEwKLSNkZWZpbmUgUE5HX1BBQ0tTV0FQICAgICAgICAgICAweDEwMDAwTAotI2RlZmluZSBQTkdfU1dBUF9BTFBIQSAgICAgICAgIDB4MjAwMDBMCi0jZGVmaW5lIFBOR19TVFJJUF9BTFBIQSAgICAgICAgMHg0MDAwMEwKLSNkZWZpbmUgUE5HX0lOVkVSVF9BTFBIQSAgICAgICAweDgwMDAwTAotI2RlZmluZSBQTkdfVVNFUl9UUkFOU0ZPUk0gICAgMHgxMDAwMDBMCi0jZGVmaW5lIFBOR19SR0JfVE9fR1JBWV9FUlIgICAweDIwMDAwMEwKLSNkZWZpbmUgUE5HX1JHQl9UT19HUkFZX1dBUk4gIDB4NDAwMDAwTAotI2RlZmluZSBQTkdfUkdCX1RPX0dSQVkgICAgICAgMHg2MDAwMDBMICAvKiB0d28gYml0cywgUkdCX1RPX0dSQVlfRVJSfFdBUk4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgLyogICAgIDB4ODAwMDAwTCAgICAgVW51c2VkICovCi0jZGVmaW5lIFBOR19BRERfQUxQSEEgICAgICAgICAweDEwMDAwMDBMICAvKiBBZGRlZCB0byBsaWJwbmctMS4yLjcgKi8KLSNkZWZpbmUgUE5HX0VYUEFORF90Uk5TICAgICAgIDB4MjAwMDAwMEwgIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjIuOSAqLwotICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDB4NDAwMDAwMEwgIHVudXNlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDB4ODAwMDAwMEwgIHVudXNlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAvKiAgMHgxMDAwMDAwMEwgIHVudXNlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAvKiAgMHgyMDAwMDAwMEwgIHVudXNlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAvKiAgMHg0MDAwMDAwMEwgIHVudXNlZCAqLwotCi0vKiBGbGFncyBmb3IgcG5nX2NyZWF0ZV9zdHJ1Y3QgKi8KLSNkZWZpbmUgUE5HX1NUUlVDVF9QTkcgICAweDAwMDEKLSNkZWZpbmUgUE5HX1NUUlVDVF9JTkZPICAweDAwMDIKLQotLyogU2NhbGluZyBmYWN0b3IgZm9yIGZpbHRlciBoZXVyaXN0aWMgd2VpZ2h0aW5nIGNhbGN1bGF0aW9ucyAqLwotI2RlZmluZSBQTkdfV0VJR0hUX1NISUZUIDgKLSNkZWZpbmUgUE5HX1dFSUdIVF9GQUNUT1IgKDE8PChQTkdfV0VJR0hUX1NISUZUKSkKLSNkZWZpbmUgUE5HX0NPU1RfU0hJRlQgMwotI2RlZmluZSBQTkdfQ09TVF9GQUNUT1IgKDE8PChQTkdfQ09TVF9TSElGVCkpCi0KLS8qIEZsYWdzIGZvciB0aGUgcG5nX3B0ci0+ZmxhZ3MgcmF0aGVyIHRoYW4gZGVjbGFyaW5nIGEgYnl0ZSBmb3IgZWFjaCBvbmUgKi8KLSNkZWZpbmUgUE5HX0ZMQUdfWkxJQl9DVVNUT01fU1RSQVRFR1kgICAgIDB4MDAwMQotI2RlZmluZSBQTkdfRkxBR19aTElCX0NVU1RPTV9MRVZFTCAgICAgICAgMHgwMDAyCi0jZGVmaW5lIFBOR19GTEFHX1pMSUJfQ1VTVE9NX01FTV9MRVZFTCAgICAweDAwMDQKLSNkZWZpbmUgUE5HX0ZMQUdfWkxJQl9DVVNUT01fV0lORE9XX0JJVFMgIDB4MDAwOAotI2RlZmluZSBQTkdfRkxBR19aTElCX0NVU1RPTV9NRVRIT0QgICAgICAgMHgwMDEwCi0jZGVmaW5lIFBOR19GTEFHX1pMSUJfRklOSVNIRUQgICAgICAgICAgICAweDAwMjAKLSNkZWZpbmUgUE5HX0ZMQUdfUk9XX0lOSVQgICAgICAgICAgICAgICAgIDB4MDA0MAotI2RlZmluZSBQTkdfRkxBR19GSUxMRVJfQUZURVIgICAgICAgICAgICAgMHgwMDgwCi0jZGVmaW5lIFBOR19GTEFHX0NSQ19BTkNJTExBUllfVVNFICAgICAgICAweDAxMDAKLSNkZWZpbmUgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9OT1dBUk4gICAgIDB4MDIwMAotI2RlZmluZSBQTkdfRkxBR19DUkNfQ1JJVElDQUxfVVNFICAgICAgICAgMHgwNDAwCi0jZGVmaW5lIFBOR19GTEFHX0NSQ19DUklUSUNBTF9JR05PUkUgICAgICAweDA4MDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgIDB4MTAwMCAgdW51c2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAweDIwMDAgIHVudXNlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgMHg0MDAwICB1bnVzZWQgKi8KLSNkZWZpbmUgUE5HX0ZMQUdfS0VFUF9VTktOT1dOX0NIVU5LUyAgICAgIDB4ODAwMEwKLSNkZWZpbmUgUE5HX0ZMQUdfS0VFUF9VTlNBRkVfQ0hVTktTICAgICAgIDB4MTAwMDBMCi0jZGVmaW5lIFBOR19GTEFHX0xJQlJBUllfTUlTTUFUQ0ggICAgICAgICAweDIwMDAwTAotI2RlZmluZSBQTkdfRkxBR19TVFJJUF9FUlJPUl9OVU1CRVJTICAgICAgMHg0MDAwMEwKLSNkZWZpbmUgUE5HX0ZMQUdfU1RSSVBfRVJST1JfVEVYVCAgICAgICAgIDB4ODAwMDBMCi0jZGVmaW5lIFBOR19GTEFHX01BTExPQ19OVUxMX01FTV9PSyAgICAgICAweDEwMDAwMEwKLSNkZWZpbmUgUE5HX0ZMQUdfQUREX0FMUEhBICAgICAgICAgICAgICAgIDB4MjAwMDAwTCAgLyogQWRkZWQgdG8gbGlicG5nLTEuMi44ICovCi0jZGVmaW5lIFBOR19GTEFHX1NUUklQX0FMUEhBICAgICAgICAgICAgICAweDQwMDAwMEwgIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjIuOCAqLwotI2RlZmluZSBQTkdfRkxBR19CRU5JR05fRVJST1JTX1dBUk4gICAgICAgMHg4MDAwMDBMICAvKiBBZGRlZCB0byBsaWJwbmctMS40LjAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgMHgxMDAwMDAwTCAgdW51c2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgIDB4MjAwMDAwMEwgIHVudXNlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAweDQwMDAwMDBMICB1bnVzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgMHg4MDAwMDAwTCAgdW51c2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMHgxMDAwMDAwMEwgIHVudXNlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIDB4MjAwMDAwMDBMICB1bnVzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAweDQwMDAwMDAwTCAgdW51c2VkICovCi0KLSNkZWZpbmUgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9NQVNLIChQTkdfRkxBR19DUkNfQU5DSUxMQVJZX1VTRSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX05PV0FSTikKLQotI2RlZmluZSBQTkdfRkxBR19DUkNfQ1JJVElDQUxfTUFTSyAgKFBOR19GTEFHX0NSQ19DUklUSUNBTF9VU0UgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX0lHTk9SRSkKLQotI2RlZmluZSBQTkdfRkxBR19DUkNfTUFTSyAgICAgICAgICAgKFBOR19GTEFHX0NSQ19BTkNJTExBUllfTUFTSyB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfRkxBR19DUkNfQ1JJVElDQUxfTUFTSykKLQotLyogU2F2ZSB0eXBpbmcgYW5kIG1ha2UgY29kZSBlYXNpZXIgdG8gdW5kZXJzdGFuZCAqLwotCi0jZGVmaW5lIFBOR19DT0xPUl9ESVNUKGMxLCBjMikgKGFicygoaW50KSgoYzEpLnJlZCkgLSAoaW50KSgoYzIpLnJlZCkpICsgXAotICAgYWJzKChpbnQpKChjMSkuZ3JlZW4pIC0gKGludCkoKGMyKS5ncmVlbikpICsgXAotICAgYWJzKChpbnQpKChjMSkuYmx1ZSkgLSAoaW50KSgoYzIpLmJsdWUpKSkKLQotLyogQWRkZWQgdG8gbGlicG5nLTEuMi42IEpCICovCi0jZGVmaW5lIFBOR19ST1dCWVRFUyhwaXhlbF9iaXRzLCB3aWR0aCkgXAotICAgICgocGl4ZWxfYml0cykgPj0gOCA/IFwKLSAgICAoKHBuZ19zaXplX3QpKHdpZHRoKSAqICgoKHBuZ19zaXplX3QpKHBpeGVsX2JpdHMpKSA+PiAzKSkgOiBcCi0gICAgKCggKChwbmdfc2l6ZV90KSh3aWR0aCkgKiAoKHBuZ19zaXplX3QpKHBpeGVsX2JpdHMpKSkgKyA3KSA+PiAzKSApCi0KLS8qIFBOR19PVVRfT0ZfUkFOR0UgcmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIG91dHNpZGUgdGhlIHJhbmdlCi0gKiBpZGVhbC1kZWx0YS4uaWRlYWwrZGVsdGEuICBFYWNoIGFyZ3VtZW50IGlzIGV2YWx1YXRlZCB0d2ljZS4KLSAqICJpZGVhbCIgYW5kICJkZWx0YSIgc2hvdWxkIGJlIGNvbnN0YW50cywgbm9ybWFsbHkgc2ltcGxlCi0gKiBpbnRlZ2VycywgInZhbHVlIiBhIHZhcmlhYmxlLiBBZGRlZCB0byBsaWJwbmctMS4yLjYgSkIKLSAqLwotI2RlZmluZSBQTkdfT1VUX09GX1JBTkdFKHZhbHVlLCBpZGVhbCwgZGVsdGEpIFwKLSAgICAgICAgKCAodmFsdWUpIDwgKGlkZWFsKS0oZGVsdGEpIHx8ICh2YWx1ZSkgPiAoaWRlYWwpKyhkZWx0YSkgKQotCi0vKiBDb25zdGFudCBzdHJpbmdzIGZvciBrbm93biBjaHVuayB0eXBlcy4gIElmIHlvdSBuZWVkIHRvIGFkZCBhIGNodW5rLAotICogZGVmaW5lIHRoZSBuYW1lIGhlcmUsIGFuZCBhZGQgYW4gaW52b2NhdGlvbiBvZiB0aGUgbWFjcm8gd2hlcmV2ZXIgaXQncwotICogbmVlZGVkLgotICovCi0jZGVmaW5lIFBOR19JSERSIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfSUhEUls1XSA9IHsgNzMsICA3MiwgIDY4LCAgODIsICdcMCd9Ci0jZGVmaW5lIFBOR19JREFUIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfSURBVFs1XSA9IHsgNzMsICA2OCwgIDY1LCAgODQsICdcMCd9Ci0jZGVmaW5lIFBOR19JRU5EIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfSUVORFs1XSA9IHsgNzMsICA2OSwgIDc4LCAgNjgsICdcMCd9Ci0jZGVmaW5lIFBOR19QTFRFIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfUExURVs1XSA9IHsgODAsICA3NiwgIDg0LCAgNjksICdcMCd9Ci0jZGVmaW5lIFBOR19iS0dEIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfYktHRFs1XSA9IHsgOTgsICA3NSwgIDcxLCAgNjgsICdcMCd9Ci0jZGVmaW5lIFBOR19jSFJNIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfY0hSTVs1XSA9IHsgOTksICA3MiwgIDgyLCAgNzcsICdcMCd9Ci0jZGVmaW5lIFBOR19nQU1BIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfZ0FNQVs1XSA9IHsxMDMsICA2NSwgIDc3LCAgNjUsICdcMCd9Ci0jZGVmaW5lIFBOR19oSVNUIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfaElTVFs1XSA9IHsxMDQsICA3MywgIDgzLCAgODQsICdcMCd9Ci0jZGVmaW5lIFBOR19pQ0NQIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfaUNDUFs1XSA9IHsxMDUsICA2NywgIDY3LCAgODAsICdcMCd9Ci0jZGVmaW5lIFBOR19pVFh0IFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfaVRYdFs1XSA9IHsxMDUsICA4NCwgIDg4LCAxMTYsICdcMCd9Ci0jZGVmaW5lIFBOR19vRkZzIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfb0ZGc1s1XSA9IHsxMTEsICA3MCwgIDcwLCAxMTUsICdcMCd9Ci0jZGVmaW5lIFBOR19wQ0FMIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcENBTFs1XSA9IHsxMTIsICA2NywgIDY1LCAgNzYsICdcMCd9Ci0jZGVmaW5lIFBOR19zQ0FMIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfc0NBTFs1XSA9IHsxMTUsICA2NywgIDY1LCAgNzYsICdcMCd9Ci0jZGVmaW5lIFBOR19wSFlzIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcEhZc1s1XSA9IHsxMTIsICA3MiwgIDg5LCAxMTUsICdcMCd9Ci0jZGVmaW5lIFBOR19zQklUIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfc0JJVFs1XSA9IHsxMTUsICA2NiwgIDczLCAgODQsICdcMCd9Ci0jZGVmaW5lIFBOR19zUExUIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfc1BMVFs1XSA9IHsxMTUsICA4MCwgIDc2LCAgODQsICdcMCd9Ci0jZGVmaW5lIFBOR19zUkdCIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfc1JHQls1XSA9IHsxMTUsICA4MiwgIDcxLCAgNjYsICdcMCd9Ci0jZGVmaW5lIFBOR19zVEVSIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfc1RFUls1XSA9IHsxMTUsICA4NCwgIDY5LCAgODIsICdcMCd9Ci0jZGVmaW5lIFBOR190RVh0IFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfdEVYdFs1XSA9IHsxMTYsICA2OSwgIDg4LCAxMTYsICdcMCd9Ci0jZGVmaW5lIFBOR190SU1FIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfdElNRVs1XSA9IHsxMTYsICA3MywgIDc3LCAgNjksICdcMCd9Ci0jZGVmaW5lIFBOR190Uk5TIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfdFJOU1s1XSA9IHsxMTYsICA4MiwgIDc4LCAgODMsICdcMCd9Ci0jZGVmaW5lIFBOR196VFh0IFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfelRYdFs1XSA9IHsxMjIsICA4NCwgIDg4LCAxMTYsICdcMCd9Ci0KLQotLyogSW5oaWJpdCBDKysgbmFtZS1tYW5nbGluZyBmb3IgbGlicG5nIGZ1bmN0aW9ucyBidXQgbm90IGZvciBzeXN0ZW0gY2FsbHMuICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBpbnRlcm5hbGx5IGluIHRoZSBjb2RlLiAgVGhleSBnZW5lcmFsbHkKLSAqIHNob3VsZG4ndCBiZSB1c2VkIHVubGVzcyB5b3UgYXJlIHdyaXRpbmcgY29kZSB0byBhZGQgb3IgcmVwbGFjZSBzb21lCi0gKiBmdW5jdGlvbmFsaXR5IGluIGxpYnBuZy4gIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbW9zdCBmdW5jdGlvbnMgY2FuCi0gKiBiZSBmb3VuZCBpbiB0aGUgZmlsZXMgd2hlcmUgdGhlIGZ1bmN0aW9ucyBhcmUgbG9jYXRlZC4KLSAqLwotCi0vKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIGludGVybmFsIGxpYnBuZyBzdHJ1Y3QgKi8KLVBOR19FWFRFUk4gcG5nX3ZvaWRwIHBuZ19jcmVhdGVfc3RydWN0IFBOR0FSRygoaW50IHR5cGUpKTsKLQotLyogRnJlZSBtZW1vcnkgZnJvbSBpbnRlcm5hbCBsaWJwbmcgc3RydWN0ICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX2Rlc3Ryb3lfc3RydWN0IFBOR0FSRygocG5nX3ZvaWRwIHN0cnVjdF9wdHIpKTsKLQotUE5HX0VYVEVSTiBwbmdfdm9pZHAgcG5nX2NyZWF0ZV9zdHJ1Y3RfMiBQTkdBUkcoKGludCB0eXBlLCBwbmdfbWFsbG9jX3B0cgotICBtYWxsb2NfZm4sIHBuZ192b2lkcCBtZW1fcHRyKSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX2Rlc3Ryb3lfc3RydWN0XzIgUE5HQVJHKChwbmdfdm9pZHAgc3RydWN0X3B0ciwKLSAgIHBuZ19mcmVlX3B0ciBmcmVlX2ZuLCBwbmdfdm9pZHAgbWVtX3B0cikpOwotCi0vKiBGcmVlIGFueSBtZW1vcnkgdGhhdCBpbmZvX3B0ciBwb2ludHMgdG8gYW5kIHJlc2V0IHN0cnVjdC4gKi8KLVBOR19FWFRFUk4gdm9pZCBwbmdfaW5mb19kZXN0cm95IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0cikpOwotCi0vKiBGdW5jdGlvbiB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHpsaWIuICBQTkdBUEkgaXMgZGlzYWxsb3dlZC4gKi8KLVBOR19FWFRFUk4gdm9pZHBmIHBuZ196YWxsb2MgUE5HQVJHKCh2b2lkcGYgcG5nX3B0ciwgdUludCBpdGVtcywgdUludCBzaXplKSk7Ci0KLS8qIEZ1bmN0aW9uIHRvIGZyZWUgbWVtb3J5IGZvciB6bGliLiAgUE5HQVBJIGlzIGRpc2FsbG93ZWQuICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX3pmcmVlIFBOR0FSRygodm9pZHBmIHBuZ19wdHIsIHZvaWRwZiBwdHIpKTsKLQotLyogTmV4dCBmb3VyIGZ1bmN0aW9ucyBhcmUgdXNlZCBpbnRlcm5hbGx5IGFzIGNhbGxiYWNrcy4gIFBOR0FQSSBpcyByZXF1aXJlZAotICogYnV0IG5vdCBQTkdfRVhQT1JULiAgUE5HQVBJIGFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuMi4zLiAqLwotCi1QTkdfRVhURVJOIHZvaWQgUE5HQVBJIHBuZ19kZWZhdWx0X3JlYWRfZGF0YSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpKTsKLQotI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIFBOR0FQSSBwbmdfcHVzaF9maWxsX2J1ZmZlciBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfc2l6ZV90IGxlbmd0aCkpOwotI2VuZGlmCi0KLVBOR19FWFRFUk4gdm9pZCBQTkdBUEkgcG5nX2RlZmF1bHRfd3JpdGVfZGF0YSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpKTsKLQotI2lmZGVmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQKLSNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECi1QTkdfRVhURVJOIHZvaWQgUE5HQVBJIHBuZ19kZWZhdWx0X2ZsdXNoIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotI2VuZGlmCi0jZW5kaWYKLQotLyogUmVzZXQgdGhlIENSQyB2YXJpYWJsZSAqLwotUE5HX0VYVEVSTiB2b2lkIHBuZ19yZXNldF9jcmMgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0KLS8qIFdyaXRlIHRoZSAiZGF0YSIgYnVmZmVyIHRvIHdoYXRldmVyIG91dHB1dCB5b3UgYXJlIHVzaW5nICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX2RhdGEgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwKLSAgIHBuZ19zaXplX3QgbGVuZ3RoKSk7Ci0KLS8qIFJlYWQgYW5kIGNoZWNrIHRoZSBQTkcgZmlsZSBzaWduYXR1cmUgKi8KLVBOR19FWFRFUk4gdm9pZCBwbmdfcmVhZF9zaWcgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpKTsKLQotLyogUmVhZCB0aGUgY2h1bmsgaGVhZGVyIChsZW5ndGggKyB0eXBlIG5hbWUpICovCi1QTkdfRVhURVJOIHBuZ191aW50XzMyIHBuZ19yZWFkX2NodW5rX2hlYWRlciBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLQotLyogUmVhZCBkYXRhIGZyb20gd2hhdGV2ZXIgaW5wdXQgeW91IGFyZSB1c2luZyBpbnRvIHRoZSAiZGF0YSIgYnVmZmVyICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX3JlYWRfZGF0YSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLAotICAgcG5nX3NpemVfdCBsZW5ndGgpKTsKLQotLyogUmVhZCBieXRlcyBpbnRvIGJ1ZiwgYW5kIHVwZGF0ZSBwbmdfcHRyLT5jcmMgKi8KLVBOR19FWFRFUk4gdm9pZCBwbmdfY3JjX3JlYWQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmLAotICAgcG5nX3NpemVfdCBsZW5ndGgpKTsKLQotLyogRGVjb21wcmVzcyBkYXRhIGluIGEgY2h1bmsgdGhhdCB1c2VzIGNvbXByZXNzaW9uICovCi0jaWYgZGVmaW5lZChQTkdfelRYdF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX2lUWHRfU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfaUNDUF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX3NQTFRfU1VQUE9SVEVEKQotUE5HX0VYVEVSTiB2b2lkIHBuZ19kZWNvbXByZXNzX2NodW5rIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIGludCBjb21wX3R5cGUsIHBuZ19zaXplX3QgY2h1bmtsZW5ndGgsIHBuZ19zaXplX3QgcHJlZml4X2xlbmd0aCwKLSAgIHBuZ19zaXplX3QgKmRhdGFfbGVuZ3RoKSk7Ci0jZW5kaWYKLQotLyogUmVhZCAic2tpcCIgYnl0ZXMsIHJlYWQgdGhlIGZpbGUgY3JjLCBhbmQgKG9wdGlvbmFsbHkpIHZlcmlmeSBwbmdfcHRyLT5jcmMgKi8KLVBOR19FWFRFUk4gaW50IHBuZ19jcmNfZmluaXNoIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgc2tpcCkpOwotCi0vKiBSZWFkIHRoZSBDUkMgZnJvbSB0aGUgZmlsZSBhbmQgY29tcGFyZSBpdCB0byB0aGUgbGlicG5nIGNhbGN1bGF0ZWQgQ1JDICovCi1QTkdfRVhURVJOIGludCBwbmdfY3JjX2Vycm9yIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotCi0vKiBDYWxjdWxhdGUgdGhlIENSQyBvdmVyIGEgc2VjdGlvbiBvZiBkYXRhLiAgTm90ZSB0aGF0IHdlIGFyZSBvbmx5Ci0gKiBwYXNzaW5nIGEgbWF4aW11bSBvZiA2NEsgb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhpcyBhcyBhIG1lbW9yeSBsaW1pdCwKLSAqIHNpbmNlIHRoaXMgaXMgdGhlIG1heGltdW0gYnVmZmVyIHNpemUgd2UgY2FuIHNwZWNpZnkuCi0gKi8KLVBOR19FWFRFUk4gdm9pZCBwbmdfY2FsY3VsYXRlX2NyYyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBwdHIsCi0gICBwbmdfc2l6ZV90IGxlbmd0aCkpOwotCi0jaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ19mbHVzaCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNlbmRpZgotCi0vKiBXcml0ZSB2YXJpb3VzIGNodW5rcyAqLwotCi0vKiBXcml0ZSB0aGUgSUhEUiBjaHVuaywgYW5kIHVwZGF0ZSB0aGUgcG5nX3N0cnVjdCB3aXRoIHRoZSBuZWNlc3NhcnkKLSAqIGluZm9ybWF0aW9uLgotICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX0lIRFIgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiB3aWR0aCwKLSAgIHBuZ191aW50XzMyIGhlaWdodCwKLSAgIGludCBiaXRfZGVwdGgsIGludCBjb2xvcl90eXBlLCBpbnQgY29tcHJlc3Npb25fbWV0aG9kLCBpbnQgZmlsdGVyX21ldGhvZCwKLSAgIGludCBpbnRlcmxhY2VfbWV0aG9kKSk7Ci0KLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfUExURSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb2xvcnAgcGFsZXR0ZSwKLSAgIHBuZ191aW50XzMyIG51bV9wYWwpKTsKLQotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9JREFUIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsCi0gICBwbmdfc2l6ZV90IGxlbmd0aCkpOwotCi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX0lFTkQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0KLSNpZmRlZiBQTkdfV1JJVEVfZ0FNQV9TVVBQT1JURUQKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX2dBTUEgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBkb3VibGUgZmlsZV9nYW1tYSkpOwotI2VuZGlmCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9nQU1BX2ZpeGVkIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICBwbmdfZml4ZWRfcG9pbnQgZmlsZV9nYW1tYSkpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9zQklUX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9zQklUIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbG9yXzhwIHNiaXQsCi0gICBpbnQgY29sb3JfdHlwZSkpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfY0hSTV9TVVBQT1JURUQKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX2NIUk0gUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgZG91YmxlIHdoaXRlX3gsIGRvdWJsZSB3aGl0ZV95LAotICAgZG91YmxlIHJlZF94LCBkb3VibGUgcmVkX3ksIGRvdWJsZSBncmVlbl94LCBkb3VibGUgZ3JlZW5feSwKLSAgIGRvdWJsZSBibHVlX3gsIGRvdWJsZSBibHVlX3kpKTsKLSNlbmRpZgotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9jSFJNX2ZpeGVkIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19maXhlZF9wb2ludCBpbnRfd2hpdGVfeCwgcG5nX2ZpeGVkX3BvaW50IGludF93aGl0ZV95LAotICAgcG5nX2ZpeGVkX3BvaW50IGludF9yZWRfeCwgcG5nX2ZpeGVkX3BvaW50IGludF9yZWRfeSwgcG5nX2ZpeGVkX3BvaW50Ci0gICBpbnRfZ3JlZW5feCwgcG5nX2ZpeGVkX3BvaW50IGludF9ncmVlbl95LCBwbmdfZml4ZWRfcG9pbnQgaW50X2JsdWVfeCwKLSAgIHBuZ19maXhlZF9wb2ludCBpbnRfYmx1ZV95KSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9zUkdCX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9zUkdCIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIGludCBpbnRlbnQpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVECi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX2lDQ1AgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2NoYXJwIG5hbWUsIGludCBjb21wcmVzc2lvbl90eXBlLAotICAgcG5nX2NoYXJwIHByb2ZpbGUsIGludCBwcm9mbGVuKSk7Ci0gICAvKiBOb3RlIHRvIG1haW50YWluZXI6IHByb2ZpbGUgc2hvdWxkIGJlIHBuZ19ieXRlcCAqLwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfc1BMVF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfc1BMVCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfc1BMVF90cCBwYWxldHRlKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV90Uk5TX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV90Uk5TIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIHRyYW5zLAotICAgcG5nX2NvbG9yXzE2cCB2YWx1ZXMsIGludCBudW1iZXIsIGludCBjb2xvcl90eXBlKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9iS0dEX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9iS0dEIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb2xvcl8xNnAgdmFsdWVzLCBpbnQgY29sb3JfdHlwZSkpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfaElTVF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfaElTVCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzE2cCBoaXN0LAotICAgaW50IG51bV9oaXN0KSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1RFWFRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRCkgfHwgXAotICAgIGRlZmluZWQoUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9zUExUX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gcG5nX3NpemVfdCBwbmdfY2hlY2tfa2V5d29yZCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfY2hhcnAga2V5LCBwbmdfY2hhcnBwIG5ld19rZXkpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX3RFWHRfU1VQUE9SVEVECi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX3RFWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY2hhcnAga2V5LAotICAgcG5nX2NoYXJwIHRleHQsIHBuZ19zaXplX3QgdGV4dF9sZW4pKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX3pUWHRfU1VQUE9SVEVECi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX3pUWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY2hhcnAga2V5LAotICAgcG5nX2NoYXJwIHRleHQsIHBuZ19zaXplX3QgdGV4dF9sZW4sIGludCBjb21wcmVzc2lvbikpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfaVRYdCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBpbnQgY29tcHJlc3Npb24sIHBuZ19jaGFycCBrZXksIHBuZ19jaGFycCBsYW5nLCBwbmdfY2hhcnAgbGFuZ19rZXksCi0gICBwbmdfY2hhcnAgdGV4dCkpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQgIC8qIEFkZGVkIGF0IHZlcnNpb24gMS4wLjE0IGFuZCAxLjIuNCAqLwotUE5HX0VYVEVSTiBpbnQgcG5nX3NldF90ZXh0XzIgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdGV4dHAgdGV4dF9wdHIsIGludCBudW1fdGV4dCkpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfb0ZGc19TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfb0ZGcyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW50XzMyIHhfb2Zmc2V0LCBwbmdfaW50XzMyIHlfb2Zmc2V0LCBpbnQgdW5pdF90eXBlKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9wQ0FMIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NoYXJwIHB1cnBvc2UsCi0gICBwbmdfaW50XzMyIFgwLCBwbmdfaW50XzMyIFgxLCBpbnQgdHlwZSwgaW50IG5wYXJhbXMsCi0gICBwbmdfY2hhcnAgdW5pdHMsIHBuZ19jaGFycHAgcGFyYW1zKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9wSFlzX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9wSFlzIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ191aW50XzMyIHhfcGl4ZWxzX3Blcl91bml0LCBwbmdfdWludF8zMiB5X3BpeGVsc19wZXJfdW5pdCwKLSAgIGludCB1bml0X3R5cGUpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVECi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX3RJTUUgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX3RpbWVwIG1vZF90aW1lKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9zQ0FMX1NVUFBPUlRFRAotI2lmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfU1RESU9fU1VQUE9SVEVEKQotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9zQ0FMIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIGludCB1bml0LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQpKTsKLSNlbHNlCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9zQ0FMX3MgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgaW50IHVuaXQsIHBuZ19jaGFycCB3aWR0aCwgcG5nX2NoYXJwIGhlaWdodCkpOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBDYWxsZWQgd2hlbiBmaW5pc2hlZCBwcm9jZXNzaW5nIGEgcm93IG9mIGRhdGEgKi8KLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfZmluaXNoX3JvdyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLQotLyogSW50ZXJuYWwgdXNlIG9ubHkuICAgQ2FsbGVkIGJlZm9yZSBmaXJzdCByb3cgb2YgZGF0YSAqLwotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9zdGFydF9yb3cgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0KLSNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfYnVpbGRfZ2FtbWFfdGFibGUgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2J5dGUgYml0X2RlcHRoKSk7Ci0jZW5kaWYKLQotLyogQ29tYmluZSBhIHJvdyBvZiBkYXRhLCBkZWFsaW5nIHdpdGggYWxwaGEsIGV0Yy4gaWYgcmVxdWVzdGVkICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX2NvbWJpbmVfcm93IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIHJvdywKLSAgIGludCBtYXNrKSk7Ci0KLSNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLS8qIEV4cGFuZCBhbiBpbnRlcmxhY2VkIHJvdyAqLwotLyogT0xEIHByZS0xLjAuOSBpbnRlcmZhY2U6Ci1QTkdfRVhURVJOIHZvaWQgcG5nX2RvX3JlYWRfaW50ZXJsYWNlIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywKLSAgIHBuZ19ieXRlcCByb3csIGludCBwYXNzLCBwbmdfdWludF8zMiB0cmFuc2Zvcm1hdGlvbnMpKTsKLSAqLwotUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19yZWFkX2ludGVybGFjZSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNlbmRpZgotCi0vKiBHUlIgVE8gRE8gKDIuMCBvciB3aGVuZXZlcik6ICBzaW1wbGlmeSBvdGhlciBpbnRlcm5hbCBjYWxsaW5nIGludGVyZmFjZXMgKi8KLQotI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLS8qIEdyYWIgcGl4ZWxzIG91dCBvZiBhIHJvdyBmb3IgYW4gaW50ZXJsYWNlZCBwYXNzICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX2RvX3dyaXRlX2ludGVybGFjZSBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCi0gICBwbmdfYnl0ZXAgcm93LCBpbnQgcGFzcykpOwotI2VuZGlmCi0KLS8qIFVuZmlsdGVyIGEgcm93ICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX3JlYWRfZmlsdGVyX3JvdyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfYnl0ZXAgcHJldl9yb3csIGludCBmaWx0ZXIpKTsKLQotLyogQ2hvb3NlIHRoZSBiZXN0IGZpbHRlciB0byB1c2UgYW5kIGZpbHRlciB0aGUgcm93IGRhdGEgKi8KLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfZmluZF9maWx0ZXIgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX3Jvd19pbmZvcCByb3dfaW5mbykpOwotCi0vKiBXcml0ZSBvdXQgdGhlIGZpbHRlcmVkIHJvdy4gKi8KLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfZmlsdGVyZWRfcm93IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19ieXRlcCBmaWx0ZXJlZF9yb3cpKTsKLS8qIEZpbmlzaCBhIHJvdyB3aGlsZSByZWFkaW5nLCBkZWFsaW5nIHdpdGggaW50ZXJsYWNpbmcgcGFzc2VzLCBldGMuICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX3JlYWRfZmluaXNoX3JvdyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLQotLyogSW5pdGlhbGl6ZSB0aGUgcm93IGJ1ZmZlcnMsIGV0Yy4gKi8KLVBOR19FWFRFUk4gdm9pZCBwbmdfcmVhZF9zdGFydF9yb3cgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0vKiBPcHRpb25hbCBjYWxsIHRvIHVwZGF0ZSB0aGUgdXNlcnMgaW5mbyBzdHJ1Y3R1cmUgKi8KLVBOR19FWFRFUk4gdm9pZCBwbmdfcmVhZF90cmFuc2Zvcm1faW5mbyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIpKTsKLQotLyogVGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgdGhhdCBkbyB0aGUgdHJhbnNmb3JtYXRpb25zICovCi0jaWZkZWYgUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19yZWFkX2ZpbGxlciBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCi0gICBwbmdfYnl0ZXAgcm93LCBwbmdfdWludF8zMiBmaWxsZXIsIHBuZ191aW50XzMyIGZsYWdzKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX1NXQVBfQUxQSEFfU1VQUE9SVEVECi1QTkdfRVhURVJOIHZvaWQgcG5nX2RvX3JlYWRfc3dhcF9hbHBoYSBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCi0gICBwbmdfYnl0ZXAgcm93KSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9TV0FQX0FMUEhBX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ19kb193cml0ZV9zd2FwX2FscGhhIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywKLSAgIHBuZ19ieXRlcCByb3cpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19yZWFkX2ludmVydF9hbHBoYSBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCi0gICBwbmdfYnl0ZXAgcm93KSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9JTlZFUlRfQUxQSEFfU1VQUE9SVEVECi1QTkdfRVhURVJOIHZvaWQgcG5nX2RvX3dyaXRlX2ludmVydF9hbHBoYSBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCi0gICBwbmdfYnl0ZXAgcm93KSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19SRUFEX1NUUklQX0FMUEhBX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fc3RyaXBfZmlsbGVyIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywKLSAgIHBuZ19ieXRlcCByb3csIHBuZ191aW50XzMyIGZsYWdzKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU1dBUF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVEKQotUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19zd2FwIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRCkgfHwgXAotICAgIGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fcGFja3N3YXAgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRAotUE5HX0VYVEVSTiBpbnQgcG5nX2RvX3JnYl90b19ncmF5IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3Jvd19pbmZvcAotICAgcm93X2luZm8sIHBuZ19ieXRlcCByb3cpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVECi1QTkdfRVhURVJOIHZvaWQgcG5nX2RvX2dyYXlfdG9fcmdiIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywKLSAgIHBuZ19ieXRlcCByb3cpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfUEFDS19TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fdW5wYWNrIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fdW5zaGlmdCBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csCi0gICBwbmdfY29sb3JfOHAgc2lnX2JpdHMpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEKQotUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19pbnZlcnQgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEXzE2X1RPXzhfU1VQUE9SVEVECi1QTkdfRVhURVJOIHZvaWQgcG5nX2RvX2Nob3AgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19xdWFudGl6ZSBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCi0gICBwbmdfYnl0ZXAgcm93LCBwbmdfYnl0ZXAgcGFsZXR0ZV9sb29rdXAsIHBuZ19ieXRlcCBxdWFudGl6ZV9sb29rdXApKTsKLQotIyAgaWZkZWYgUE5HX0NPUlJFQ1RfUEFMRVRURV9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfY29ycmVjdF9wYWxldHRlIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb2xvcnAgcGFsZXR0ZSwgaW50IG51bV9wYWxldHRlKSk7Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JHUl9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX2RvX2JnciBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVECi1QTkdfRVhURVJOIHZvaWQgcG5nX2RvX3BhY2sgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLAotICAgcG5nX2J5dGVwIHJvdywgcG5nX3VpbnRfMzIgYml0X2RlcHRoKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9TSElGVF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fc2hpZnQgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LAotICAgcG5nX2NvbG9yXzhwIGJpdF9kZXB0aCkpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRAotI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19iYWNrZ3JvdW5kIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKLSAgIHBuZ19jb2xvcl8xNnAgdHJhbnNfY29sb3IsIHBuZ19jb2xvcl8xNnAgYmFja2dyb3VuZCwKLSAgIHBuZ19jb2xvcl8xNnAgYmFja2dyb3VuZF8xLAotICAgcG5nX2J5dGVwIGdhbW1hX3RhYmxlLCBwbmdfYnl0ZXAgZ2FtbWFfZnJvbV8xLCBwbmdfYnl0ZXAgZ2FtbWFfdG9fMSwKLSAgIHBuZ191aW50XzE2cHAgZ2FtbWFfMTYsIHBuZ191aW50XzE2cHAgZ2FtbWFfMTZfZnJvbV8xLAotICAgcG5nX3VpbnRfMTZwcCBnYW1tYV8xNl90b18xLCBpbnQgZ2FtbWFfc2hpZnQpKTsKLSNlbHNlCi1QTkdfRVhURVJOIHZvaWQgcG5nX2RvX2JhY2tncm91bmQgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LAotICAgcG5nX2NvbG9yXzE2cCB0cmFuc19jb2xvciwgcG5nX2NvbG9yXzE2cCBiYWNrZ3JvdW5kKSk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECi1QTkdfRVhURVJOIHZvaWQgcG5nX2RvX2dhbW1hIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKLSAgIHBuZ19ieXRlcCBnYW1tYV90YWJsZSwgcG5nX3VpbnRfMTZwcCBnYW1tYV8xNl90YWJsZSwKLSAgIGludCBnYW1tYV9zaGlmdCkpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECi1QTkdfRVhURVJOIHZvaWQgcG5nX2RvX2V4cGFuZF9wYWxldHRlIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywKLSAgIHBuZ19ieXRlcCByb3csIHBuZ19jb2xvcnAgcGFsZXR0ZSwgcG5nX2J5dGVwIHRyYW5zLCBpbnQgbnVtX3RyYW5zKSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX2RvX2V4cGFuZCBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCi0gICBwbmdfYnl0ZXAgcm93LCBwbmdfY29sb3JfMTZwIHRyYW5zX3ZhbHVlKSk7Ci0jZW5kaWYKLQotLyogVGhlIGZvbGxvd2luZyBkZWNvZGVzIHRoZSBhcHByb3ByaWF0ZSBjaHVua3MsIGFuZCBkb2VzIGVycm9yIGNvcnJlY3Rpb24sCi0gKiB0aGVuIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFjayBmb3IgdGhlIGNodW5rIGlmIGl0IGlzIHZhbGlkLgotICovCi0KLS8qIERlY29kZSB0aGUgSUhEUiBjaHVuayAqLwotUE5HX0VYVEVSTiB2b2lkIHBuZ19oYW5kbGVfSUhEUiBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ191aW50XzMyIGxlbmd0aCkpOwotUE5HX0VYVEVSTiB2b2lkIHBuZ19oYW5kbGVfUExURSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ191aW50XzMyIGxlbmd0aCkpOwotUE5HX0VYVEVSTiB2b2lkIHBuZ19oYW5kbGVfSUVORCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ191aW50XzMyIGxlbmd0aCkpOwotCi0jaWZkZWYgUE5HX1JFQURfYktHRF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX2JLR0QgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX2NIUk0gUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX2dBTUEgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfaElTVF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX2hJU1QgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX2lDQ1AgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZiAvKiBQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX2lUWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfb0ZGc19TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX29GRnMgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfcENBTF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3BDQUwgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfcEhZc19TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3BIWXMgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfc0JJVF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3NCSVQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfc0NBTF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3NDQUwgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfc1BMVF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3NQTFQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZiAvKiBQTkdfUkVBRF9zUExUX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3NSR0IgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfdEVYdF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3RFWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfdElNRV9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3RJTUUgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfdFJOU19TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3RSTlMgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfelRYdF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3pUWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi1QTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV91bmtub3duIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7Ci0KLVBOR19FWFRFUk4gdm9pZCBwbmdfY2hlY2tfY2h1bmtfbmFtZSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfYnl0ZXAgY2h1bmtfbmFtZSkpOwotCi0vKiBIYW5kbGUgdGhlIHRyYW5zZm9ybWF0aW9ucyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyAqLwotUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fd3JpdGVfdHJhbnNmb3JtYXRpb25zIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotCi1QTkdfRVhURVJOIHZvaWQgcG5nX2luaXRfcmVhZF90cmFuc2Zvcm1hdGlvbnMgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0KLSNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9yZWFkX2NodW5rIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0cikpOwotUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX3JlYWRfc2lnIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0cikpOwotUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX2NoZWNrX2NyYyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLVBOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9jcmNfc2tpcCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLVBOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9jcmNfZmluaXNoIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX3NhdmVfYnVmZmVyIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX3Jlc3RvcmVfYnVmZmVyIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19ieXRlcCBidWZmZXIsIHBuZ19zaXplX3QgYnVmZmVyX2xlbmd0aCkpOwotUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX3JlYWRfSURBVCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLVBOR19FWFRFUk4gdm9pZCBwbmdfcHJvY2Vzc19JREFUX2RhdGEgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3NpemVfdCBidWZmZXJfbGVuZ3RoKSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfcHJvY2Vzc19yb3cgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfaGFuZGxlX3Vua25vd24gUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpKTsKLVBOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9oYXZlX2luZm8gUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfaGF2ZV9lbmQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfaGF2ZV9yb3cgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgcm93KSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfcmVhZF9lbmQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX3Byb2Nlc3Nfc29tZV9kYXRhIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0cikpOwotUE5HX0VYVEVSTiB2b2lkIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNpZmRlZiBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX2hhbmRsZV90RVh0IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfcmVhZF90RVh0IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0cikpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfelRYdF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9oYW5kbGVfelRYdCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkpOwotUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX3JlYWRfelRYdCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIpKTsKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX2lUWHRfU1VQUE9SVEVECi1QTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfaGFuZGxlX2lUWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpKTsKLVBOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9yZWFkX2lUWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fcmVhZF9pbnRyYXBpeGVsIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywKLSAgIHBuZ19ieXRlcCByb3cpKTsKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fd3JpdGVfaW50cmFwaXhlbCBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCi0gICBwbmdfYnl0ZXAgcm93KSk7Ci0jZW5kaWYKLQotLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS40LjAgKi8KLSNpZmRlZiBQTkdfY0hSTV9TVVBQT1JURUQKLVBOR19FWFRFUk4gaW50IHBuZ19jaGVja19jSFJNX2ZpeGVkIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19maXhlZF9wb2ludCBpbnRfd2hpdGVfeCwgcG5nX2ZpeGVkX3BvaW50IGludF93aGl0ZV95LAotICAgcG5nX2ZpeGVkX3BvaW50IGludF9yZWRfeCwgcG5nX2ZpeGVkX3BvaW50IGludF9yZWRfeSwgcG5nX2ZpeGVkX3BvaW50Ci0gICBpbnRfZ3JlZW5feCwgcG5nX2ZpeGVkX3BvaW50IGludF9ncmVlbl95LCBwbmdfZml4ZWRfcG9pbnQgaW50X2JsdWVfeCwKLSAgIHBuZ19maXhlZF9wb2ludCBpbnRfYmx1ZV95KSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19jSFJNX1NVUFBPUlRFRAotI2lmZGVmIFBOR19DSEVDS19jSFJNX1NVUFBPUlRFRAotLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS4yLjM0IGFuZCAxLjQuMCAqLwotUE5HX0VYVEVSTiB2b2lkIHBuZ182NGJpdF9wcm9kdWN0IFBOR0FSRygobG9uZyB2MSwgbG9uZyB2MiwKLSAgIHVuc2lnbmVkIGxvbmcgKmhpX3Byb2R1Y3QsIHVuc2lnbmVkIGxvbmcgKmxvX3Byb2R1Y3QpKTsKLSNlbmRpZgotI2VuZGlmCi0KLS8qIEFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuNC4wICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX2NoZWNrX0lIRFIgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX3VpbnRfMzIgd2lkdGgsIHBuZ191aW50XzMyIGhlaWdodCwgaW50IGJpdF9kZXB0aCwKLSAgIGludCBjb2xvcl90eXBlLCBpbnQgaW50ZXJsYWNlX3R5cGUsIGludCBjb21wcmVzc2lvbl90eXBlLAotICAgaW50IGZpbHRlcl90eXBlKSk7Ci0KLS8qIEZyZWUgYWxsIG1lbW9yeSB1c2VkIGJ5IHRoZSByZWFkIChvbGQgbWV0aG9kIC0gTk9UIERMTCBFWFBPUlRFRCkgKi8KLVBOR19FWFRFUk4gdm9pZCBwbmdfcmVhZF9kZXN0cm95IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX2luZm9wIGVuZF9pbmZvX3B0cikpOwotCi0vKiBGcmVlIGFueSBtZW1vcnkgdXNlZCBpbiBwbmdfcHRyIHN0cnVjdCAob2xkIG1ldGhvZCAtIE5PVCBETEwgRVhQT1JURUQpICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX2Rlc3Ryb3kgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0KLSNpZmRlZiBVU0VfRkFSX0tFWVdPUkQgIC8qIG1lbW9yeSBtb2RlbCBjb252ZXJzaW9uIGZ1bmN0aW9uICovCi1QTkdfRVhURVJOIHZvaWQgKnBuZ19mYXJfdG9fbmVhciBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIscG5nX3ZvaWRwIHB0ciwKLSAgIGludCBjaGVjaykpOwotI2VuZGlmIC8qIFVTRV9GQVJfS0VZV09SRCAqLwotCi0vKiBEZWZpbmUgUE5HX0RFQlVHIGF0IGNvbXBpbGUgdGltZSBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgSGlnaGVyCi0gKiBudW1iZXJzIGZvciBQTkdfREVCVUcgbWVhbiBtb3JlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgaGFzCi0gKiBvbmx5IGJlZW4gYWRkZWQgc2luY2UgdmVyc2lvbiAwLjk1IHNvIGl0IGlzIG5vdCBpbXBsZW1lbnRlZCB0aHJvdWdob3V0Ci0gKiBsaWJwbmcgeWV0LCBidXQgbW9yZSBzdXBwb3J0IHdpbGwgYmUgYWRkZWQgYXMgbmVlZGVkLgotICovCi0jaWZkZWYgUE5HX0RFQlVHCi0jaWYgKFBOR19ERUJVRyA+IDApCi0jaWYgIWRlZmluZWQoUE5HX0RFQlVHX0ZJTEUpICYmIGRlZmluZWQoX01TQ19WRVIpCi0jaW5jbHVkZSA8Y3J0ZGJnLmg+Ci0jaWYgKFBOR19ERUJVRyA+IDEpCi0jaWZuZGVmIF9ERUJVRwotIyAgZGVmaW5lIF9ERUJVRwotI2VuZGlmCi0jaWZuZGVmIHBuZ19kZWJ1ZwotI2RlZmluZSBwbmdfZGVidWcobCxtKSAgX1JQVDAoX0NSVF9XQVJOLG0gUE5HX1NUUklOR19ORVdMSU5FKQotI2VuZGlmCi0jaWZuZGVmIHBuZ19kZWJ1ZzEKLSNkZWZpbmUgcG5nX2RlYnVnMShsLG0scDEpICBfUlBUMShfQ1JUX1dBUk4sbSBQTkdfU1RSSU5HX05FV0xJTkUscDEpCi0jZW5kaWYKLSNpZm5kZWYgcG5nX2RlYnVnMgotI2RlZmluZSBwbmdfZGVidWcyKGwsbSxwMSxwMikgX1JQVDIoX0NSVF9XQVJOLG0gUE5HX1NUUklOR19ORVdMSU5FLHAxLHAyKQotI2VuZGlmCi0jZW5kaWYKLSNlbHNlIC8qIFBOR19ERUJVR19GSUxFIHx8ICFfTVNDX1ZFUiAqLwotI2lmbmRlZiBQTkdfREVCVUdfRklMRQotI2RlZmluZSBQTkdfREVCVUdfRklMRSBzdGRlcnIKLSNlbmRpZiAvKiBQTkdfREVCVUdfRklMRSAqLwotCi0jaWYgKFBOR19ERUJVRyA+IDEpCi0vKiBOb3RlOiBbIiVzIm0gUE5HX1NUUklOR19ORVdMSU5FXSBwcm9iYWJseSBkb2VzIG5vdCB3b3JrIG9uCi0gKiBub24tSVNPIGNvbXBpbGVycwotICovCi0jICBpZmRlZiBfX1NURENfXwotIyAgICBpZm5kZWYgcG5nX2RlYnVnCi0jICAgICAgZGVmaW5lIHBuZ19kZWJ1ZyhsLG0pIFwKLSAgICAgICB7IFwKLSAgICAgICBpbnQgbnVtX3RhYnM9bDsgXAotICAgICAgIGZwcmludGYoUE5HX0RFQlVHX0ZJTEUsIiVzIm0gUE5HX1NUUklOR19ORVdMSU5FLChudW1fdGFicz09MSA/ICJcdCIgOiBcCi0gICAgICAgICAobnVtX3RhYnM9PTIgPyAiXHRcdCI6KG51bV90YWJzPjIgPyAiXHRcdFx0IjoiIikpKSk7IFwKLSAgICAgICB9Ci0jICAgIGVuZGlmCi0jICAgIGlmbmRlZiBwbmdfZGVidWcxCi0jICAgICAgZGVmaW5lIHBuZ19kZWJ1ZzEobCxtLHAxKSBcCi0gICAgICAgeyBcCi0gICAgICAgaW50IG51bV90YWJzPWw7IFwKLSAgICAgICBmcHJpbnRmKFBOR19ERUJVR19GSUxFLCIlcyJtIFBOR19TVFJJTkdfTkVXTElORSwobnVtX3RhYnM9PTEgPyAiXHQiIDogXAotICAgICAgICAgKG51bV90YWJzPT0yID8gIlx0XHQiOihudW1fdGFicz4yID8gIlx0XHRcdCI6IiIpKSkscDEpOyBcCi0gICAgICAgfQotIyAgICBlbmRpZgotIyAgICBpZm5kZWYgcG5nX2RlYnVnMgotIyAgICAgIGRlZmluZSBwbmdfZGVidWcyKGwsbSxwMSxwMikgXAotICAgICAgIHsgXAotICAgICAgIGludCBudW1fdGFicz1sOyBcCi0gICAgICAgZnByaW50ZihQTkdfREVCVUdfRklMRSwiJXMibSBQTkdfU1RSSU5HX05FV0xJTkUsKG51bV90YWJzPT0xID8gIlx0IiA6IFwKLSAgICAgICAgIChudW1fdGFicz09MiA/ICJcdFx0IjoobnVtX3RhYnM+MiA/ICJcdFx0XHQiOiIiKSkpLHAxLHAyKTsgXAotICAgICAgIH0KLSMgICAgZW5kaWYKLSMgIGVsc2UgLyogX19TVERDIF9fICovCi0jICAgIGlmbmRlZiBwbmdfZGVidWcKLSMgICAgICBkZWZpbmUgcG5nX2RlYnVnKGwsbSkgXAotICAgICAgIHsgXAotICAgICAgIGludCBudW1fdGFicz1sOyBcCi0gICAgICAgY2hhciBmb3JtYXRbMjU2XTsgXAotICAgICAgIHNucHJpbnRmKGZvcm1hdCwyNTYsIiVzJXMlcyIsKG51bV90YWJzPT0xID8gIlx0IiA6IFwKLSAgICAgICAgIChudW1fdGFicz09MiA/ICJcdFx0IjoobnVtX3RhYnM+MiA/ICJcdFx0XHQiOiIiKSkpLCBcCi0gICAgICAgICBtLFBOR19TVFJJTkdfTkVXTElORSk7IFwKLSAgICAgICBmcHJpbnRmKFBOR19ERUJVR19GSUxFLGZvcm1hdCk7IFwKLSAgICAgICB9Ci0jICAgIGVuZGlmCi0jICAgIGlmbmRlZiBwbmdfZGVidWcxCi0jICAgICAgZGVmaW5lIHBuZ19kZWJ1ZzEobCxtLHAxKSBcCi0gICAgICAgeyBcCi0gICAgICAgaW50IG51bV90YWJzPWw7IFwKLSAgICAgICBjaGFyIGZvcm1hdFsyNTZdOyBcCi0gICAgICAgc25wcmludGYoZm9ybWF0LDI1NiwiJXMlcyVzIiwobnVtX3RhYnM9PTEgPyAiXHQiIDogXAotICAgICAgICAgKG51bV90YWJzPT0yID8gIlx0XHQiOihudW1fdGFicz4yID8gIlx0XHRcdCI6IiIpKSksIFwKLSAgICAgICAgIG0sUE5HX1NUUklOR19ORVdMSU5FKTsgXAotICAgICAgIGZwcmludGYoUE5HX0RFQlVHX0ZJTEUsZm9ybWF0LHAxKTsgXAotICAgICAgIH0KLSMgICAgZW5kaWYKLSMgICAgaWZuZGVmIHBuZ19kZWJ1ZzIKLSMgICAgICBkZWZpbmUgcG5nX2RlYnVnMihsLG0scDEscDIpIFwKLSAgICAgICB7IFwKLSAgICAgICBpbnQgbnVtX3RhYnM9bDsgXAotICAgICAgIGNoYXIgZm9ybWF0WzI1Nl07IFwKLSAgICAgICBzbnByaW50Zihmb3JtYXQsMjU2LCIlcyVzJXMiLChudW1fdGFicz09MSA/ICJcdCIgOiBcCi0gICAgICAgICAobnVtX3RhYnM9PTIgPyAiXHRcdCI6KG51bV90YWJzPjIgPyAiXHRcdFx0IjoiIikpKSwgXAotICAgICAgICAgbSxQTkdfU1RSSU5HX05FV0xJTkUpOyBcCi0gICAgICAgZnByaW50ZihQTkdfREVCVUdfRklMRSxmb3JtYXQscDEscDIpOyBcCi0gICAgICAgfQotIyAgICBlbmRpZgotIyAgZW5kaWYgLyogX19TVERDIF9fICovCi0jZW5kaWYgLyogKFBOR19ERUJVRyA+IDEpICovCi0KLSNlbmRpZiAvKiBfTVNDX1ZFUiAqLwotI2VuZGlmIC8qIChQTkdfREVCVUcgPiAwKSAqLwotI2VuZGlmIC8qIFBOR19ERUJVRyAqLwotI2lmbmRlZiBwbmdfZGVidWcKLSNkZWZpbmUgcG5nX2RlYnVnKGwsIG0pCi0jZW5kaWYKLSNpZm5kZWYgcG5nX2RlYnVnMQotI2RlZmluZSBwbmdfZGVidWcxKGwsIG0sIHAxKQotI2VuZGlmCi0jaWZuZGVmIHBuZ19kZWJ1ZzIKLSNkZWZpbmUgcG5nX2RlYnVnMihsLCBtLCBwMSwgcDIpCi0jZW5kaWYKLQotLyogTWFpbnRhaW5lcjogUHV0IG5ldyBwcml2YXRlIHByb3RvdHlwZXMgaGVyZSBeIGFuZCBpbiBsaWJwbmdwZi4zICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBQTkdfVkVSU0lPTl9JTkZPX09OTFkgKi8KLSNlbmRpZiAvKiBQTkdQUklWX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvcG5ncmVhZC5jIGIvc3JjL2xpYnBuZy9wbmdyZWFkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOTJiNWYuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9wbmdyZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQwICswLDAgQEAKLQotLyogcG5ncmVhZC5jIC0gcmVhZCBhIFBORyBmaWxlCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjQuMTAgW01hcmNoIDgsIDIwMTJdCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMiBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQotICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQotICoKLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0gKiBhbmQgbGljZW5zZSBpbiBwbmcuaAotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbGxzIGRpcmVjdGx5IHRvCi0gKiByZWFkIGEgUE5HIGZpbGUgb3Igc3RyZWFtLgotICovCi0KLSNkZWZpbmUgUE5HX05PX1BFREFOVElDX1dBUk5JTkdTCi0jaW5jbHVkZSAicG5nLmgiCi0jaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECi0jaW5jbHVkZSAicG5ncHJpdi5oIgotCi0KLS8qIENyZWF0ZSBhIFBORyBzdHJ1Y3R1cmUgZm9yIHJlYWRpbmcsIGFuZCBhbGxvY2F0ZSBhbnkgbWVtb3J5IG5lZWRlZC4gKi8KLXBuZ19zdHJ1Y3RwIFBOR0FQSQotcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLAotICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwgcG5nX2Vycm9yX3B0ciB3YXJuX2ZuKQotewotCi0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgcmV0dXJuIChwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIodXNlcl9wbmdfdmVyLCBlcnJvcl9wdHIsIGVycm9yX2ZuLAotICAgICAgd2Fybl9mbiwgTlVMTCwgTlVMTCwgTlVMTCkpOwotfQotCi0vKiBBbHRlcm5hdGUgY3JlYXRlIFBORyBzdHJ1Y3R1cmUgZm9yIHJlYWRpbmcsIGFuZCBhbGxvY2F0ZSBhbnkgbWVtb3J5Ci0gKiBuZWVkZWQuCi0gKi8KLXBuZ19zdHJ1Y3RwIFBOR0FQSQotcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ192b2lkcCBlcnJvcl9wdHIsCi0gICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLCBwbmdfZXJyb3JfcHRyIHdhcm5fZm4sIHBuZ192b2lkcCBtZW1fcHRyLAotICAgcG5nX21hbGxvY19wdHIgbWFsbG9jX2ZuLCBwbmdfZnJlZV9wdHIgZnJlZV9mbikKLXsKLSNlbmRpZiAvKiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEICovCi0KLSNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAotICAgdm9sYXRpbGUKLSNlbmRpZgotICAgcG5nX3N0cnVjdHAgcG5nX3B0cjsKLSAgIHZvbGF0aWxlIGludCBwbmdfY2xlYW51cF9uZWVkZWQgPSAwOwotCi0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSNpZmRlZiBVU0VfRkFSX0tFWVdPUkQKLSAgIGptcF9idWYgam1wYnVmOwotI2VuZGlmCi0jZW5kaWYKLQotICAgaW50IGk7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCIpOwotCi0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgcG5nX3B0ciA9IChwbmdfc3RydWN0cClwbmdfY3JlYXRlX3N0cnVjdF8yKFBOR19TVFJVQ1RfUE5HLAotICAgICAgbWFsbG9jX2ZuLCBtZW1fcHRyKTsKLSNlbHNlCi0gICBwbmdfcHRyID0gKHBuZ19zdHJ1Y3RwKXBuZ19jcmVhdGVfc3RydWN0KFBOR19TVFJVQ1RfUE5HKTsKLSNlbmRpZgotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0KLSAgIC8qIEFkZGVkIGF0IGxpYnBuZy0xLjIuNiAqLwotI2lmZGVmIFBOR19VU0VSX0xJTUlUU19TVVBQT1JURUQKLSAgIHBuZ19wdHItPnVzZXJfd2lkdGhfbWF4ID0gUE5HX1VTRVJfV0lEVEhfTUFYOwotICAgcG5nX3B0ci0+dXNlcl9oZWlnaHRfbWF4ID0gUE5HX1VTRVJfSEVJR0hUX01BWDsKLQotICAgLyogQWRkZWQgYXQgbGlicG5nLTEuMi40MyBhbmQgMS40LjAgKi8KLSAgIHBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID0gUE5HX1VTRVJfQ0hVTktfQ0FDSEVfTUFYOwotCi0gICAvKiBBZGRlZCBhdCBsaWJwbmctMS40LjEgKi8KLSAgIHBuZ19wdHItPnVzZXJfY2h1bmtfbWFsbG9jX21heCA9IFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVg7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0vKiBBcHBsaWNhdGlvbnMgdGhhdCBuZWdsZWN0IHRvIHNldCB1cCB0aGVpciBvd24gc2V0am1wKCkgYW5kIHRoZW4KLSAgIGVuY291bnRlciBhIHBuZ19lcnJvcigpIHdpbGwgbG9uZ2ptcCBoZXJlLiAgU2luY2UgdGhlIGptcGJ1ZiBpcwotICAgdGhlbiBtZWFuaW5nbGVzcyB3ZSBhYm9ydCBpbnN0ZWFkIG9mIHJldHVybmluZy4gKi8KLSNpZmRlZiBVU0VfRkFSX0tFWVdPUkQKLSAgIGlmIChzZXRqbXAoam1wYnVmKSkKLSNlbHNlCi0gICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKSAvKiBTZXRzIGxvbmdqbXAgdG8gbWF0Y2ggc2V0am1wICovCi0jZW5kaWYKLSAgICAgIFBOR19BQk9SVCgpOwotI2lmZGVmIFVTRV9GQVJfS0VZV09SRAotICAgcG5nX21lbWNweShwbmdfam1wYnVmKHBuZ19wdHIpLCBqbXBidWYsIHBuZ19zaXplb2Yoam1wX2J1ZikpOwotI2VuZGlmCi0jZW5kaWYgLyogUE5HX1NFVEpNUF9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgIHBuZ19zZXRfbWVtX2ZuKHBuZ19wdHIsIG1lbV9wdHIsIG1hbGxvY19mbiwgZnJlZV9mbik7Ci0jZW5kaWYKLQotICAgcG5nX3NldF9lcnJvcl9mbihwbmdfcHRyLCBlcnJvcl9wdHIsIGVycm9yX2ZuLCB3YXJuX2ZuKTsKLQotICAgaWYgKHVzZXJfcG5nX3ZlcikKLSAgIHsKLSAgICAgIGkgPSAwOwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgIGlmICh1c2VyX3BuZ192ZXJbaV0gIT0gcG5nX2xpYnBuZ192ZXJbaV0pCi0gICAgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19MSUJSQVJZX01JU01BVENIOwotICAgICAgfSB3aGlsZSAocG5nX2xpYnBuZ192ZXJbaSsrXSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0xJQlJBUllfTUlTTUFUQ0g7Ci0KLQotICAgIGlmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0xJQlJBUllfTUlTTUFUQ0gpCi0gICAgewotICAgICAgIC8qIExpYnBuZyAwLjkwIGFuZCBsYXRlciBhcmUgYmluYXJ5IGluY29tcGF0aWJsZSB3aXRoIGxpYnBuZyAwLjg5LCBzbwotICAgICAgICogd2UgbXVzdCByZWNvbXBpbGUgYW55IGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBhbnkgb2xkZXIgbGlicmFyeSB2ZXJzaW9uLgotICAgICAgICogRm9yIHZlcnNpb25zIGFmdGVyIGxpYnBuZyAxLjAsIHdlIHdpbGwgYmUgY29tcGF0aWJsZSwgc28gd2UgbmVlZAotICAgICAgICogb25seSBjaGVjayB0aGUgZmlyc3QgZGlnaXQuCi0gICAgICAgKi8KLSAgICAgIGlmICh1c2VyX3BuZ192ZXIgPT0gTlVMTCB8fCB1c2VyX3BuZ192ZXJbMF0gIT0gcG5nX2xpYnBuZ192ZXJbMF0gfHwKLSAgICAgICAgICAodXNlcl9wbmdfdmVyWzBdID09ICcxJyAmJiB1c2VyX3BuZ192ZXJbMl0gIT0gcG5nX2xpYnBuZ192ZXJbMl0pIHx8Ci0gICAgICAgICAgKHVzZXJfcG5nX3ZlclswXSA9PSAnMCcgJiYgdXNlcl9wbmdfdmVyWzJdIDwgJzknKSkKLSAgICAgIHsKLSNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECi0gICAgICAgICBjaGFyIG1zZ1s4MF07Ci0gICAgICAgICBpZiAodXNlcl9wbmdfdmVyKQotICAgICAgICAgewotICAgICAgICAgICBwbmdfc25wcmludGYobXNnLCA4MCwKLSAgICAgICAgICAgICAgIkFwcGxpY2F0aW9uIHdhcyBjb21waWxlZCB3aXRoIHBuZy5oIGZyb20gbGlicG5nLSUuMjBzIiwKLSAgICAgICAgICAgICAgdXNlcl9wbmdfdmVyKTsKLSAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgbXNnKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHBuZ19zbnByaW50Zihtc2csIDgwLAotICAgICAgICAgICAgICJBcHBsaWNhdGlvbiAgaXMgIHJ1bm5pbmcgd2l0aCBwbmcuYyBmcm9tIGxpYnBuZy0lLjIwcyIsCi0gICAgICAgICAgICAgcG5nX2xpYnBuZ192ZXIpOwotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgbXNnKTsKLSNlbmRpZgotI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRAotICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgPSAwOwotI2VuZGlmCi0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAgIkluY29tcGF0aWJsZSBsaWJwbmcgdmVyc2lvbiBpbiBhcHBsaWNhdGlvbiBhbmQgbGlicmFyeSIpOwotCi0gICAgICAgICBwbmdfY2xlYW51cF9uZWVkZWQgPSAxOwotICAgICAgfQotICAgfQotCi0gICBpZiAoIXBuZ19jbGVhbnVwX25lZWRlZCkKLSAgIHsKLSAgIC8qIEluaXRpYWxpemUgemJ1ZiAtIGNvbXByZXNzaW9uIGJ1ZmZlciAqLwotICAgcG5nX3B0ci0+emJ1Zl9zaXplID0gUE5HX1pCVUZfU0laRTsKLSAgIHBuZ19wdHItPnpidWYgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLAotICAgICBwbmdfcHRyLT56YnVmX3NpemUpOwotICAgaWYgKHBuZ19wdHItPnpidWYgPT0gTlVMTCkKLSAgICAgICAgcG5nX2NsZWFudXBfbmVlZGVkID0gMTsKLSAgIH0KLSAgIHBuZ19wdHItPnpzdHJlYW0uemFsbG9jID0gcG5nX3phbGxvYzsKLSAgIHBuZ19wdHItPnpzdHJlYW0uemZyZWUgPSBwbmdfemZyZWU7Ci0gICBwbmdfcHRyLT56c3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpcG5nX3B0cjsKLQotICAgaWYgKCFwbmdfY2xlYW51cF9uZWVkZWQpCi0gICB7Ci0gICAgICBzd2l0Y2ggKGluZmxhdGVJbml0KCZwbmdfcHRyLT56c3RyZWFtKSkKLSAgICAgIHsKLSAgICAgICAgIGNhc2UgWl9PSzogLyogRG8gbm90aGluZyAqLyBicmVhazsKLSAgICAgICAgIGNhc2UgWl9NRU1fRVJST1I6Ci0gICAgICAgICBjYXNlIFpfU1RSRUFNX0VSUk9SOiBwbmdfd2FybmluZyhwbmdfcHRyLCAiemxpYiBtZW1vcnkgZXJyb3IiKTsKLSAgICAgICAgICAgIHBuZ19jbGVhbnVwX25lZWRlZCA9IDE7IGJyZWFrOwotICAgICAgICAgY2FzZSBaX1ZFUlNJT05fRVJST1I6IHBuZ193YXJuaW5nKHBuZ19wdHIsICJ6bGliIHZlcnNpb24gZXJyb3IiKTsKLSAgICAgICAgICAgIHBuZ19jbGVhbnVwX25lZWRlZCA9IDE7IGJyZWFrOwotICAgICAgICAgZGVmYXVsdDogcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVua25vd24gemxpYiBlcnJvciIpOwotICAgICAgICAgICAgcG5nX2NsZWFudXBfbmVlZGVkID0gMTsKLSAgICAgIH0KLSAgIH0KLQotICAgaWYgKHBuZ19jbGVhbnVwX25lZWRlZCkKLSAgIHsKLSAgICAgIC8qIENsZWFuIHVwIFBORyBzdHJ1Y3R1cmUgYW5kIGRlYWxsb2NhdGUgYW55IG1lbW9yeS4gKi8KLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnpidWYpOwotICAgICAgcG5nX3B0ci0+emJ1ZiA9IE5VTEw7Ci0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgICAgcG5nX2Rlc3Ryb3lfc3RydWN0XzIoKHBuZ192b2lkcClwbmdfcHRyLAotICAgICAgICAgKHBuZ19mcmVlX3B0cilmcmVlX2ZuLCAocG5nX3ZvaWRwKW1lbV9wdHIpOwotI2Vsc2UKLSAgICAgIHBuZ19kZXN0cm95X3N0cnVjdCgocG5nX3ZvaWRwKXBuZ19wdHIpOwotI2VuZGlmCi0gICAgICByZXR1cm4gKE5VTEwpOwotICAgfQotCi0gICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKLSAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpcG5nX3B0ci0+emJ1Zl9zaXplOwotCi0gICBwbmdfc2V0X3JlYWRfZm4ocG5nX3B0ciwgTlVMTCwgTlVMTCk7Ci0KLQotICAgcmV0dXJuIChwbmdfcHRyKTsKLX0KLQotCi0jaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKLS8qIFJlYWQgdGhlIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgYWN0dWFsIGltYWdlIGRhdGEuICBUaGlzIGhhcyBiZWVuCi0gKiBjaGFuZ2VkIGluIHYwLjkwIHRvIGFsbG93IHJlYWRpbmcgYSBmaWxlIHRoYXQgYWxyZWFkeSBoYXMgdGhlIG1hZ2ljCi0gKiBieXRlcyByZWFkIGZyb20gdGhlIHN0cmVhbS4gIFlvdSBjYW4gdGVsbCBsaWJwbmcgaG93IG1hbnkgYnl0ZXMgaGF2ZQotICogYmVlbiByZWFkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtICh1cCB0byB0aGUgbWF4aW11bSBvZiA4KQotICogdmlhIHBuZ19zZXRfc2lnX2J5dGVzKCksIGFuZCB3ZSB3aWxsIG9ubHkgY2hlY2sgdGhlIHJlbWFpbmluZyBieXRlcwotICogaGVyZS4gIFRoZSBhcHBsaWNhdGlvbiBjYW4gdGhlbiBoYXZlIGFjY2VzcyB0byB0aGUgc2lnbmF0dXJlIGJ5dGVzIHdlCi0gKiByZWFkIGlmIGl0IGlzIGRldGVybWluZWQgdGhhdCB0aGlzIGlzbid0IGEgdmFsaWQgUE5HIGZpbGUuCi0gKi8KLXZvaWQgUE5HQVBJCi1wbmdfcmVhZF9pbmZvKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3JlYWRfaW5mbyIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIC8qIFJlYWQgYW5kIGNoZWNrIHRoZSBQTkcgZmlsZSBzaWduYXR1cmUuICovCi0gICBwbmdfcmVhZF9zaWcocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICBmb3IgKDs7KQotICAgewotICAgICAgUE5HX0lIRFI7Ci0gICAgICBQTkdfSURBVDsKLSAgICAgIFBOR19JRU5EOwotICAgICAgUE5HX1BMVEU7Ci0jaWZkZWYgUE5HX1JFQURfYktHRF9TVVBQT1JURUQKLSAgICAgIFBOR19iS0dEOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQKLSAgICAgIFBOR19jSFJNOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQKLSAgICAgIFBOR19nQU1BOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfaElTVF9TVVBQT1JURUQKLSAgICAgIFBOR19oSVNUOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQKLSAgICAgIFBOR19pQ0NQOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKLSAgICAgIFBOR19pVFh0OwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfb0ZGc19TVVBQT1JURUQKLSAgICAgIFBOR19vRkZzOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfcENBTF9TVVBQT1JURUQKLSAgICAgIFBOR19wQ0FMOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfcEhZc19TVVBQT1JURUQKLSAgICAgIFBOR19wSFlzOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfc0JJVF9TVVBQT1JURUQKLSAgICAgIFBOR19zQklUOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfc0NBTF9TVVBQT1JURUQKLSAgICAgIFBOR19zQ0FMOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfc1BMVF9TVVBQT1JURUQKLSAgICAgIFBOR19zUExUOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQKLSAgICAgIFBOR19zUkdCOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfdEVYdF9TVVBQT1JURUQKLSAgICAgIFBOR190RVh0OwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfdElNRV9TVVBQT1JURUQKLSAgICAgIFBOR190SU1FOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfdFJOU19TVVBQT1JURUQKLSAgICAgIFBOR190Uk5TOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfelRYdF9TVVBQT1JURUQKLSAgICAgIFBOR196VFh0OwotI2VuZGlmCi0gICAgICBwbmdfdWludF8zMiBsZW5ndGggPSBwbmdfcmVhZF9jaHVua19oZWFkZXIocG5nX3B0cik7Ci0gICAgICBQTkdfQ09OU1QgcG5nX2J5dGVwIGNodW5rX25hbWUgPSBwbmdfcHRyLT5jaHVua19uYW1lOwotCi0gICAgICAvKiBUaGlzIHNob3VsZCBiZSBhIGJpbmFyeSBzdWJkaXZpc2lvbiBzZWFyY2ggb3IgYSBoYXNoIGZvcgotICAgICAgICogbWF0Y2hpbmcgdGhlIGNodW5rIG5hbWUgcmF0aGVyIHRoYW4gYSBsaW5lYXIgc2VhcmNoLgotICAgICAgICovCi0gICAgICBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX0lEQVQsIDQpKQotICAgICAgICBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19BRlRFUl9JREFUKQotICAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfQ0hVTktfQUZURVJfSURBVDsKLQotICAgICAgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19JSERSLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19JRU5ELCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfSUVORChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNpZmRlZiBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVECi0gICAgICBlbHNlIGlmIChwbmdfaGFuZGxlX2FzX3Vua25vd24ocG5nX3B0ciwgY2h1bmtfbmFtZSkpCi0gICAgICB7Ci0gICAgICAgICBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX0lEQVQsIDQpKQotICAgICAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9JREFUOwotICAgICAgICAgcG5nX2hhbmRsZV91bmtub3duKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotICAgICAgICAgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19QTFRFLCA0KSkKLSAgICAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfUExURTsKLSAgICAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19JREFULCA0KSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKLSAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBJREFUIik7Ci0gICAgICAgICAgICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgJiYKLSAgICAgICAgICAgICAgICAgICAgICEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpKQotICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIFBMVEUgYmVmb3JlIElEQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgfQotI2VuZGlmCi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfUExURSwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX1BMVEUocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfSURBVCwgNCkpCi0gICAgICB7Ci0gICAgICAgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgSURBVCIpOwotICAgICAgICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFICYmCi0gICAgICAgICAgICAgICAgICAhKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKSkKLSAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBQTFRFIGJlZm9yZSBJREFUIik7Ci0KLSAgICAgICAgIHBuZ19wdHItPmlkYXRfc2l6ZSA9IGxlbmd0aDsKLSAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfSURBVDsKLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotI2lmZGVmIFBOR19SRUFEX2JLR0RfU1VQUE9SVEVECi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfYktHRCwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX2JLR0QocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRAotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX2NIUk0sIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9jSFJNKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19nQU1BLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX2hJU1RfU1VQUE9SVEVECi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfaElTVCwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX2hJU1QocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9vRkZzX1NVUFBPUlRFRAotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX29GRnMsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9vRkZzKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfcENBTF9TVVBQT1JURUQKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19wQ0FMLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfcENBTChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX3NDQUxfU1VQUE9SVEVECi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfc0NBTCwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX3NDQUwocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRAotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3BIWXMsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9wSFlzKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfc0JJVF9TVVBQT1JURUQKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19zQklULCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX3NSR0JfU1VQUE9SVEVECi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfc1JHQiwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX3NSR0IocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRAotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX2lDQ1AsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9pQ0NQKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfc1BMVF9TVVBQT1JURUQKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19zUExULCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfc1BMVChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX3RFWHRfU1VQUE9SVEVECi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfdEVYdCwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX3RFWHQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF90SU1FX1NVUFBPUlRFRAotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3RJTUUsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV90SU1FKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfdFJOU19TVVBQT1JURUQKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ190Uk5TLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfdFJOUyhwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX3pUWHRfU1VQUE9SVEVECi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfelRYdCwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX3pUWHQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRAotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX2lUWHQsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9pVFh0KHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0gICAgICBlbHNlCi0gICAgICAgICBwbmdfaGFuZGxlX3Vua25vd24ocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0gICB9Ci19Ci0jZW5kaWYgLyogUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQgKi8KLQotLyogT3B0aW9uYWwgY2FsbCB0byB1cGRhdGUgdGhlIHVzZXJzIGluZm9fcHRyIHN0cnVjdHVyZSAqLwotdm9pZCBQTkdBUEkKLXBuZ19yZWFkX3VwZGF0ZV9pbmZvKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3JlYWRfdXBkYXRlX2luZm8iKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIGlmICghKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfUk9XX0lOSVQpKQotICAgICAgcG5nX3JlYWRfc3RhcnRfcm93KHBuZ19wdHIpOwotICAgZWxzZQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICJJZ25vcmluZyBleHRyYSBwbmdfcmVhZF91cGRhdGVfaW5mbygpIGNhbGw7IHJvdyBidWZmZXIgbm90IHJlYWxsb2NhdGVkIik7Ci0KLSAgIHBuZ19yZWFkX3RyYW5zZm9ybV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLX0KLQotI2lmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECi0vKiBJbml0aWFsaXplIHBhbGV0dGUsIGJhY2tncm91bmQsIGV0YywgYWZ0ZXIgdHJhbnNmb3JtYXRpb25zCi0gKiBhcmUgc2V0LCBidXQgYmVmb3JlIGFueSByZWFkaW5nIHRha2VzIHBsYWNlLiAgVGhpcyBhbGxvd3MKLSAqIHRoZSB1c2VyIHRvIG9idGFpbiBhIGdhbW1hLWNvcnJlY3RlZCBwYWxldHRlLCBmb3IgZXhhbXBsZS4KLSAqIElmIHRoZSB1c2VyIGRvZXNuJ3QgY2FsbCB0aGlzLCB3ZSB3aWxsIGRvIGl0IG91cnNlbHZlcy4KLSAqLwotdm9pZCBQTkdBUEkKLXBuZ19zdGFydF9yZWFkX2ltYWdlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zdGFydF9yZWFkX2ltYWdlIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1JPV19JTklUKSkKLSAgICAgIHBuZ19yZWFkX3N0YXJ0X3JvdyhwbmdfcHRyKTsKLX0KLSNlbmRpZiAvKiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKLXZvaWQgUE5HQVBJCi1wbmdfcmVhZF9yb3cocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIHJvdywgcG5nX2J5dGVwIGRzcF9yb3cpCi17Ci0gICBQTkdfSURBVDsKLSNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSAgIFBOR19DT05TVCBpbnQgcG5nX3Bhc3NfZHNwX21hc2tbN10gPSB7MHhmZiwgMHgwZiwgMHhmZiwgMHgzMywgMHhmZiwgMHg1NSwKLSAgICAgIDB4ZmZ9OwotICAgUE5HX0NPTlNUIGludCBwbmdfcGFzc19tYXNrWzddID0gezB4ODAsIDB4MDgsIDB4ODgsIDB4MjIsIDB4YWEsIDB4NTUsIDB4ZmZ9OwotICAgaW50IHJldDsKLSNlbmRpZgotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBwbmdfZGVidWcyKDEsICJpbiBwbmdfcmVhZF9yb3cgKHJvdyAlbHUsIHBhc3MgJWQpIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBwbmdfcHRyLT5yb3dfbnVtYmVyLCBwbmdfcHRyLT5wYXNzKTsKLQotICAgaWYgKCEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19ST1dfSU5JVCkpCi0gICAgICBwbmdfcmVhZF9zdGFydF9yb3cocG5nX3B0cik7Ci0gICBpZiAocG5nX3B0ci0+cm93X251bWJlciA9PSAwICYmIHBuZ19wdHItPnBhc3MgPT0gMCkKLSAgIHsKLSAgIC8qIENoZWNrIGZvciB0cmFuc2Zvcm1zIHRoYXQgaGF2ZSBiZWVuIHNldCBidXQgd2VyZSBkZWZpbmVkIG91dCAqLwotI2lmIGRlZmluZWQoUE5HX1dSSVRFX0lOVkVSVF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX0lOVkVSVF9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVkVSVF9NT05PKQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19SRUFEX0lOVkVSVF9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQiKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0ZJTExFUikKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQpICYmIFwKLSAgICAhZGVmaW5lZChQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0tTV0FQKQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZCIpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLKQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19SRUFEX1BBQ0tfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV9TSElGVF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCkKLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU0hJRlQpCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV9CR1JfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfUkVBRF9CR1JfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CR1IpCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1JFQURfQkdSX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZCIpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX1NXQVBfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TV0FQX0JZVEVTKQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19SRUFEX1NXQVBfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7Ci0jZW5kaWYKLSAgIH0KLQotI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotICAgLyogSWYgaW50ZXJsYWNlZCBhbmQgd2UgZG8gbm90IG5lZWQgYSBuZXcgcm93LCBjb21iaW5lIHJvdyBhbmQgcmV0dXJuICovCi0gICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCAmJiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkpCi0gICB7Ci0gICAgICBzd2l0Y2ggKHBuZ19wdHItPnBhc3MpCi0gICAgICB7Ci0gICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cm93X251bWJlciAmIDB4MDcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoZHNwX3JvdyAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIGRzcF9yb3csCi0gICAgICAgICAgICAgICAgICAgICBwbmdfcGFzc19kc3BfbWFza1twbmdfcHRyLT5wYXNzXSk7Ci0gICAgICAgICAgICAgICBwbmdfcmVhZF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGlmICgocG5nX3B0ci0+cm93X251bWJlciAmIDB4MDcpIHx8IHBuZ19wdHItPndpZHRoIDwgNSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChkc3Bfcm93ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICBwbmdfY29tYmluZV9yb3cocG5nX3B0ciwgZHNwX3JvdywKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19wYXNzX2RzcF9tYXNrW3BuZ19wdHItPnBhc3NdKTsKLSAgICAgICAgICAgICAgIHBuZ19yZWFkX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwNykgIT0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChkc3Bfcm93ICE9IE5VTEwgJiYgKHBuZ19wdHItPnJvd19udW1iZXIgJiA0KSkKLSAgICAgICAgICAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LAotICAgICAgICAgICAgICAgICAgICAgcG5nX3Bhc3NfZHNwX21hc2tbcG5nX3B0ci0+cGFzc10pOwotICAgICAgICAgICAgICAgcG5nX3JlYWRfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAzKSB8fCBwbmdfcHRyLT53aWR0aCA8IDMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoZHNwX3JvdyAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIGRzcF9yb3csCi0gICAgICAgICAgICAgICAgICAgICBwbmdfcGFzc19kc3BfbWFza1twbmdfcHRyLT5wYXNzXSk7Ci0gICAgICAgICAgICAgICBwbmdfcmVhZF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGlmICgocG5nX3B0ci0+cm93X251bWJlciAmIDMpICE9IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoZHNwX3JvdyAhPSBOVUxMICYmIChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMikpCi0gICAgICAgICAgICAgICAgICBwbmdfY29tYmluZV9yb3cocG5nX3B0ciwgZHNwX3JvdywKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19wYXNzX2RzcF9tYXNrW3BuZ19wdHItPnBhc3NdKTsKLSAgICAgICAgICAgICAgIHBuZ19yZWFkX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMSkgfHwgcG5nX3B0ci0+d2lkdGggPCAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKGRzcF9yb3cgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LAotICAgICAgICAgICAgICAgICAgICAgcG5nX3Bhc3NfZHNwX21hc2tbcG5nX3B0ci0+cGFzc10pOwotICAgICAgICAgICAgICAgcG5nX3JlYWRfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBkZWZhdWx0OgotICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgaWYgKCEocG5nX3B0ci0+cm93X251bWJlciAmIDEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3JlYWRfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgfQotI2VuZGlmCi0KLSAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBhdHRlbXB0IHRvIHJlYWQgcm93IGRhdGEiKTsKLQotICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IHBuZ19wdHItPnJvd19idWY7Ci0gICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9Ci0gICAgICAgKHVJbnQpKFBOR19ST1dCWVRFUyhwbmdfcHRyLT5waXhlbF9kZXB0aCwKLSAgICAgICBwbmdfcHRyLT5pd2lkdGgpICsgMSk7Ci0gICBkbwotICAgewotICAgICAgaWYgKCEocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbikpCi0gICAgICB7Ci0gICAgICAgICB3aGlsZSAoIXBuZ19wdHItPmlkYXRfc2l6ZSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApOwotCi0gICAgICAgICAgICBwbmdfcHRyLT5pZGF0X3NpemUgPSBwbmdfcmVhZF9jaHVua19oZWFkZXIocG5nX3B0cik7Ci0gICAgICAgICAgICBpZiAocG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfSURBVCwgNCkpCi0gICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk5vdCBlbm91Z2ggaW1hZ2UgZGF0YSIpOwotICAgICAgICAgfQotICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXBuZ19wdHItPnpidWZfc2l6ZTsKLSAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9pbiA9IHBuZ19wdHItPnpidWY7Ci0gICAgICAgICBpZiAocG5nX3B0ci0+emJ1Zl9zaXplID4gcG5nX3B0ci0+aWRhdF9zaXplKQotICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXBuZ19wdHItPmlkYXRfc2l6ZTsKLSAgICAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBwbmdfcHRyLT56YnVmLAotICAgICAgICAgICAgKHBuZ19zaXplX3QpcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbik7Ci0gICAgICAgICBwbmdfcHRyLT5pZGF0X3NpemUgLT0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbjsKLSAgICAgIH0KLSAgICAgIHJldCA9IGluZmxhdGUoJnBuZ19wdHItPnpzdHJlYW0sIFpfUEFSVElBTF9GTFVTSCk7Ci0gICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKLSAgICAgIHsKLSAgICAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCB8fCBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luIHx8Ci0gICAgICAgICAgICBwbmdfcHRyLT5pZGF0X3NpemUpCi0gICAgICAgICAgICBwbmdfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJFeHRyYSBjb21wcmVzc2VkIGRhdGEiKTsKLSAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0FGVEVSX0lEQVQ7Ci0gICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0ZJTklTSEVEOwotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAocmV0ICE9IFpfT0spCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgcG5nX3B0ci0+enN0cmVhbS5tc2cgPyBwbmdfcHRyLT56c3RyZWFtLm1zZyA6Ci0gICAgICAgICAgICAgICAgICAgIkRlY29tcHJlc3Npb24gZXJyb3IiKTsKLQotICAgfSB3aGlsZSAocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQpOwotCi0gICBwbmdfcHRyLT5yb3dfaW5mby5jb2xvcl90eXBlID0gcG5nX3B0ci0+Y29sb3JfdHlwZTsKLSAgIHBuZ19wdHItPnJvd19pbmZvLndpZHRoID0gcG5nX3B0ci0+aXdpZHRoOwotICAgcG5nX3B0ci0+cm93X2luZm8uY2hhbm5lbHMgPSBwbmdfcHRyLT5jaGFubmVsczsKLSAgIHBuZ19wdHItPnJvd19pbmZvLmJpdF9kZXB0aCA9IHBuZ19wdHItPmJpdF9kZXB0aDsKLSAgIHBuZ19wdHItPnJvd19pbmZvLnBpeGVsX2RlcHRoID0gcG5nX3B0ci0+cGl4ZWxfZGVwdGg7Ci0gICBwbmdfcHRyLT5yb3dfaW5mby5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhwbmdfcHRyLT5yb3dfaW5mby5waXhlbF9kZXB0aCwKLSAgICAgICBwbmdfcHRyLT5yb3dfaW5mby53aWR0aCk7Ci0KLSAgIGlmIChwbmdfcHRyLT5yb3dfYnVmWzBdKQotICAgcG5nX3JlYWRfZmlsdGVyX3JvdyhwbmdfcHRyLCAmKHBuZ19wdHItPnJvd19pbmZvKSwKLSAgICAgIHBuZ19wdHItPnJvd19idWYgKyAxLCBwbmdfcHRyLT5wcmV2X3JvdyArIDEsCi0gICAgICAoaW50KShwbmdfcHRyLT5yb3dfYnVmWzBdKSk7Ci0KLSAgIHBuZ19tZW1jcHkocG5nX3B0ci0+cHJldl9yb3csIHBuZ19wdHItPnJvd19idWYsIHBuZ19wdHItPnJvd2J5dGVzICsgMSk7Ci0KLSNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAotICAgaWYgKChwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkICYgUE5HX0ZMQUdfTU5HX0ZJTFRFUl82NCkgJiYKLSAgICAgIChwbmdfcHRyLT5maWx0ZXJfdHlwZSA9PSBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcpKQotICAgewotICAgICAgLyogSW50cmFwaXhlbCBkaWZmZXJlbmNpbmcgKi8KLSAgICAgIHBuZ19kb19yZWFkX2ludHJhcGl4ZWwoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSAgIH0KLSNlbmRpZgotCi0KLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfHwgKHBuZ19wdHItPmZsYWdzJlBOR19GTEFHX1NUUklQX0FMUEhBKSkKLSAgICAgIHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucyhwbmdfcHRyKTsKLQotI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotICAgLyogQmxvdyB1cCBpbnRlcmxhY2VkIHJvd3MgdG8gZnVsbCBzaXplICovCi0gICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCAmJgotICAgICAgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlRFUkxBQ0UpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPCA2KQotICAgICAgICAgLyogT2xkIGludGVyZmFjZSAocHJlLTEuMC45KToKLSAgICAgICAgICAqIHBuZ19kb19yZWFkX2ludGVybGFjZSgmKHBuZ19wdHItPnJvd19pbmZvKSwKLSAgICAgICAgICAqICAgIHBuZ19wdHItPnJvd19idWYgKyAxLCBwbmdfcHRyLT5wYXNzLCBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMpOwotICAgICAgICAgICovCi0gICAgICAgICBwbmdfZG9fcmVhZF9pbnRlcmxhY2UocG5nX3B0cik7Ci0KLSAgICAgIGlmIChkc3Bfcm93ICE9IE5VTEwpCi0gICAgICAgICBwbmdfY29tYmluZV9yb3cocG5nX3B0ciwgZHNwX3JvdywKLSAgICAgICAgICAgIHBuZ19wYXNzX2RzcF9tYXNrW3BuZ19wdHItPnBhc3NdKTsKLSAgICAgIGlmIChyb3cgIT0gTlVMTCkKLSAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCByb3csCi0gICAgICAgICAgICBwbmdfcGFzc19tYXNrW3BuZ19wdHItPnBhc3NdKTsKLSAgIH0KLSAgIGVsc2UKLSNlbmRpZgotICAgewotICAgICAgaWYgKHJvdyAhPSBOVUxMKQotICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIHJvdywgMHhmZik7Ci0gICAgICBpZiAoZHNwX3JvdyAhPSBOVUxMKQotICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIGRzcF9yb3csIDB4ZmYpOwotICAgfQotICAgcG5nX3JlYWRfZmluaXNoX3JvdyhwbmdfcHRyKTsKLQotICAgaWYgKHBuZ19wdHItPnJlYWRfcm93X2ZuICE9IE5VTEwpCi0gICAgICAoKihwbmdfcHRyLT5yZWFkX3Jvd19mbikpKHBuZ19wdHIsIHBuZ19wdHItPnJvd19udW1iZXIsIHBuZ19wdHItPnBhc3MpOwotfQotI2VuZGlmIC8qIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAotLyogUmVhZCBvbmUgb3IgbW9yZSByb3dzIG9mIGltYWdlIGRhdGEuICBJZiB0aGUgaW1hZ2UgaXMgaW50ZXJsYWNlZCwKLSAqIGFuZCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIGhhcyBiZWVuIGNhbGxlZCwgdGhlIHJvd3MgbmVlZCB0bwotICogY29udGFpbiB0aGUgY29udGVudHMgb2YgdGhlIHJvd3MgZnJvbSB0aGUgcHJldmlvdXMgcGFzcy4gIElmIHRoZQotICogaW1hZ2UgaGFzIGFscGhhIG9yIHRyYW5zcGFyZW5jeSwgYW5kIHBuZ19oYW5kbGVfYWxwaGEoKVsqXSBoYXMgYmVlbgotICogY2FsbGVkLCB0aGUgcm93cyBjb250ZW50cyBtdXN0IGJlIGluaXRpYWxpemVkIHRvIHRoZSBjb250ZW50cyBvZiB0aGUKLSAqIHNjcmVlbi4KLSAqCi0gKiAicm93IiBob2xkcyB0aGUgYWN0dWFsIGltYWdlLCBhbmQgcGl4ZWxzIGFyZSBwbGFjZWQgaW4gaXQKLSAqIGFzIHRoZXkgYXJyaXZlLiAgSWYgdGhlIGltYWdlIGlzIGRpc3BsYXllZCBhZnRlciBlYWNoIHBhc3MsIGl0IHdpbGwKLSAqIGFwcGVhciB0byAic3BhcmtsZSIgaW4uICAiZGlzcGxheV9yb3ciIGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgYQotICogImNodW5reSIgcHJvZ3Jlc3NpdmUgaW1hZ2UsIHdpdGggZmluZXIgZGV0YWlsIGFkZGVkIGFzIGl0IGJlY29tZXMKLSAqIGF2YWlsYWJsZS4gIElmIHlvdSBkbyBub3Qgd2FudCB0aGlzICJjaHVua3kiIGRpc3BsYXksIHlvdSBtYXkgcGFzcwotICogTlVMTCBmb3IgZGlzcGxheV9yb3cuICBJZiB5b3UgZG8gbm90IHdhbnQgdGhlIHNwYXJrbGUgZGlzcGxheSwgYW5kCi0gKiB5b3UgaGF2ZSBub3QgY2FsbGVkIHBuZ19oYW5kbGVfYWxwaGEoKSwgeW91IG1heSBwYXNzIE5VTEwgZm9yIHJvd3MuCi0gKiBJZiB5b3UgaGF2ZSBjYWxsZWQgcG5nX2hhbmRsZV9hbHBoYSgpLCBhbmQgdGhlIGltYWdlIGhhcyBlaXRoZXIgYW4KLSAqIGFscGhhIGNoYW5uZWwgb3IgYSB0cmFuc3BhcmVuY3kgY2h1bmssIHlvdSBtdXN0IHByb3ZpZGUgYSBidWZmZXIgZm9yCi0gKiByb3dzLiAgSW4gdGhpcyBjYXNlLCB5b3UgZG8gbm90IGhhdmUgdG8gcHJvdmlkZSBhIGRpc3BsYXlfcm93IGJ1ZmZlcgotICogYWxzbywgYnV0IHlvdSBtYXkuICBJZiB0aGUgaW1hZ2UgaXMgbm90IGludGVybGFjZWQsIG9yIGlmIHlvdSBoYXZlCi0gKiBub3QgY2FsbGVkIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCksIHRoZSBkaXNwbGF5X3JvdyBidWZmZXIgd2lsbAotICogYmUgaWdub3JlZCwgc28gcGFzcyBOVUxMIHRvIGl0LgotICoKLSAqIFsqXSBwbmdfaGFuZGxlX2FscGhhKCkgZG9lcyBub3QgZXhpc3QgeWV0LCBhcyBvZiB0aGlzIHZlcnNpb24gb2YgbGlicG5nCi0gKi8KLQotdm9pZCBQTkdBUEkKLXBuZ19yZWFkX3Jvd3MocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwcCByb3csCi0gICBwbmdfYnl0ZXBwIGRpc3BsYXlfcm93LCBwbmdfdWludF8zMiBudW1fcm93cykKLXsKLSAgIHBuZ191aW50XzMyIGk7Ci0gICBwbmdfYnl0ZXBwIHJwOwotICAgcG5nX2J5dGVwcCBkcDsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcmVhZF9yb3dzIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBycCA9IHJvdzsKLSAgIGRwID0gZGlzcGxheV9yb3c7Ci0gICBpZiAocnAgIT0gTlVMTCAmJiBkcCAhPSBOVUxMKQotICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9yb3dzOyBpKyspCi0gICAgICB7Ci0gICAgICAgICBwbmdfYnl0ZXAgcnB0ciA9ICpycCsrOwotICAgICAgICAgcG5nX2J5dGVwIGRwdHIgPSAqZHArKzsKLQotICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIHJwdHIsIGRwdHIpOwotICAgICAgfQotICAgZWxzZSBpZiAocnAgIT0gTlVMTCkKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcm93czsgaSsrKQotICAgICAgewotICAgICAgICAgcG5nX2J5dGVwIHJwdHIgPSAqcnA7Ci0gICAgICAgICBwbmdfcmVhZF9yb3cocG5nX3B0ciwgcnB0ciwgTlVMTCk7Ci0gICAgICAgICBycCsrOwotICAgICAgfQotICAgZWxzZSBpZiAoZHAgIT0gTlVMTCkKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcm93czsgaSsrKQotICAgICAgewotICAgICAgICAgcG5nX2J5dGVwIGRwdHIgPSAqZHA7Ci0gICAgICAgICBwbmdfcmVhZF9yb3cocG5nX3B0ciwgTlVMTCwgZHB0cik7Ci0gICAgICAgICBkcCsrOwotICAgICAgfQotfQotI2VuZGlmIC8qIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAotLyogUmVhZCB0aGUgZW50aXJlIGltYWdlLiAgSWYgdGhlIGltYWdlIGhhcyBhbiBhbHBoYSBjaGFubmVsIG9yIGEgdFJOUwotICogY2h1bmssIGFuZCB5b3UgaGF2ZSBjYWxsZWQgcG5nX2hhbmRsZV9hbHBoYSgpWypdLCB5b3Ugd2lsbCBuZWVkIHRvCi0gKiBpbml0aWFsaXplIHRoZSBpbWFnZSB0byB0aGUgY3VycmVudCBpbWFnZSB0aGF0IFBORyB3aWxsIGJlIG92ZXJsYXlpbmcuCi0gKiBXZSBzZXQgdGhlIG51bV9yb3dzIGFnYWluIGhlcmUsIGluIGNhc2UgaXQgd2FzIGluY29ycmVjdGx5IHNldCBpbgotICogcG5nX3JlYWRfc3RhcnRfcm93KCkgYnkgYSBjYWxsIHRvIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgb3IKLSAqIHBuZ19zdGFydF9yZWFkX2ltYWdlKCkgaWYgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSB3YXNuJ3QgY2FsbGVkCi0gKiBwcmlvciB0byBlaXRoZXIgb2YgdGhlc2UgZnVuY3Rpb25zIGxpa2UgaXQgc2hvdWxkIGhhdmUgYmVlbi4gIFlvdSBjYW4KLSAqIG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uIG9uY2UuICBJZiB5b3UgZGVzaXJlIHRvIGhhdmUgYW4gaW1hZ2UgZm9yCi0gKiBlYWNoIHBhc3Mgb2YgYSBpbnRlcmxhY2VkIGltYWdlLCB1c2UgcG5nX3JlYWRfcm93cygpIGluc3RlYWQuCi0gKgotICogWypdIHBuZ19oYW5kbGVfYWxwaGEoKSBkb2VzIG5vdCBleGlzdCB5ZXQsIGFzIG9mIHRoaXMgdmVyc2lvbiBvZiBsaWJwbmcKLSAqLwotdm9pZCBQTkdBUEkKLXBuZ19yZWFkX2ltYWdlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcHAgaW1hZ2UpCi17Ci0gICBwbmdfdWludF8zMiBpLCBpbWFnZV9oZWlnaHQ7Ci0gICBpbnQgcGFzcywgajsKLSAgIHBuZ19ieXRlcHAgcnA7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3JlYWRfaW1hZ2UiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotICAgcGFzcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOwotI2Vsc2UKLSAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsCi0gICAgICAgICJDYW5ub3QgcmVhZCBpbnRlcmxhY2VkIGltYWdlIC0tIGludGVybGFjZSBoYW5kbGVyIGRpc2FibGVkIik7Ci0gICBwYXNzID0gMTsKLSNlbmRpZgotCi0KLSAgIGltYWdlX2hlaWdodD1wbmdfcHRyLT5oZWlnaHQ7Ci0gICBwbmdfcHRyLT5udW1fcm93cyA9IGltYWdlX2hlaWdodDsgLyogTWFrZSBzdXJlIHRoaXMgaXMgc2V0IGNvcnJlY3RseSAqLwotCi0gICBmb3IgKGogPSAwOyBqIDwgcGFzczsgaisrKQotICAgewotICAgICAgcnAgPSBpbWFnZTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpbWFnZV9oZWlnaHQ7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCAqcnAsIE5VTEwpOwotICAgICAgICAgcnArKzsKLSAgICAgIH0KLSAgIH0KLX0KLSNlbmRpZiAvKiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKLS8qIFJlYWQgdGhlIGVuZCBvZiB0aGUgUE5HIGZpbGUuICBXaWxsIG5vdCByZWFkIHBhc3QgdGhlIGVuZCBvZiB0aGUKLSAqIGZpbGUsIHdpbGwgdmVyaWZ5IHRoZSBlbmQgaXMgYWNjdXJhdGUsIGFuZCB3aWxsIHJlYWQgYW55IGNvbW1lbnRzCi0gKiBvciB0aW1lIGluZm9ybWF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIGlmIGluZm8gaXMgbm90IE5VTEwuCi0gKi8KLXZvaWQgUE5HQVBJCi1wbmdfcmVhZF9lbmQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcmVhZF9lbmQiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApOyAvKiBGaW5pc2ggb2ZmIENSQyBmcm9tIGxhc3QgSURBVCBjaHVuayAqLwotCi0gICBkbwotICAgewotICAgICAgUE5HX0lIRFI7Ci0gICAgICBQTkdfSURBVDsKLSAgICAgIFBOR19JRU5EOwotICAgICAgUE5HX1BMVEU7Ci0jaWZkZWYgUE5HX1JFQURfYktHRF9TVVBQT1JURUQKLSAgICAgIFBOR19iS0dEOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQKLSAgICAgIFBOR19jSFJNOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQKLSAgICAgIFBOR19nQU1BOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfaElTVF9TVVBQT1JURUQKLSAgICAgIFBOR19oSVNUOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQKLSAgICAgIFBOR19pQ0NQOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKLSAgICAgIFBOR19pVFh0OwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfb0ZGc19TVVBQT1JURUQKLSAgICAgIFBOR19vRkZzOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfcENBTF9TVVBQT1JURUQKLSAgICAgIFBOR19wQ0FMOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfcEhZc19TVVBQT1JURUQKLSAgICAgIFBOR19wSFlzOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfc0JJVF9TVVBQT1JURUQKLSAgICAgIFBOR19zQklUOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfc0NBTF9TVVBQT1JURUQKLSAgICAgIFBOR19zQ0FMOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfc1BMVF9TVVBQT1JURUQKLSAgICAgIFBOR19zUExUOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQKLSAgICAgIFBOR19zUkdCOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfdEVYdF9TVVBQT1JURUQKLSAgICAgIFBOR190RVh0OwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfdElNRV9TVVBQT1JURUQKLSAgICAgIFBOR190SU1FOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfdFJOU19TVVBQT1JURUQKLSAgICAgIFBOR190Uk5TOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfelRYdF9TVVBQT1JURUQKLSAgICAgIFBOR196VFh0OwotI2VuZGlmCi0gICAgICBwbmdfdWludF8zMiBsZW5ndGggPSBwbmdfcmVhZF9jaHVua19oZWFkZXIocG5nX3B0cik7Ci0gICAgICBQTkdfQ09OU1QgcG5nX2J5dGVwIGNodW5rX25hbWUgPSBwbmdfcHRyLT5jaHVua19uYW1lOwotCi0gICAgICBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX0lIRFIsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX0lFTkQsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9JRU5EKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKLSAgICAgIGVsc2UgaWYgKHBuZ19oYW5kbGVfYXNfdW5rbm93bihwbmdfcHRyLCBjaHVua19uYW1lKSkKLSAgICAgIHsKLSAgICAgICAgIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfSURBVCwgNCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGxlbmd0aCA+IDApIHx8IChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfQ0hVTktfQUZURVJfSURBVCkpCi0gICAgICAgICAgICAgICBwbmdfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJUb28gbWFueSBJREFUcyBmb3VuZCIpOwotICAgICAgICAgfQotICAgICAgICAgcG5nX2hhbmRsZV91bmtub3duKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotICAgICAgICAgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19QTFRFLCA0KSkKLSAgICAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfUExURTsKLSAgICAgIH0KLSNlbmRpZgotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX0lEQVQsIDQpKQotICAgICAgewotICAgICAgICAgLyogWmVybyBsZW5ndGggSURBVHMgYXJlIGxlZ2FsIGFmdGVyIHRoZSBsYXN0IElEQVQgaGFzIGJlZW4KLSAgICAgICAgICAqIHJlYWQsIGJ1dCBub3QgYWZ0ZXIgb3RoZXIgY2h1bmtzIGhhdmUgYmVlbiByZWFkLgotICAgICAgICAgICovCi0gICAgICAgICBpZiAoKGxlbmd0aCA+IDApIHx8IChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfQ0hVTktfQUZURVJfSURBVCkpCi0gICAgICAgICAgICBwbmdfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJUb28gbWFueSBJREFUcyBmb3VuZCIpOwotICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19QTFRFLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNpZmRlZiBQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRAotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX2JLR0QsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19jSFJNLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfY0hSTShwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX2dBTUFfU1VQUE9SVEVECi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfZ0FNQSwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX2dBTUEocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRAotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX2hJU1QsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfb0ZGc19TVVBQT1JURUQKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19vRkZzLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfb0ZGcyhwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX3BDQUxfU1VQUE9SVEVECi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfcENBTCwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX3BDQUwocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRAotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3NDQUwsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9zQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfcEhZc19TVVBQT1JURUQKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19wSFlzLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX3NCSVRfU1VQUE9SVEVECi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfc0JJVCwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX3NCSVQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRAotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3NSR0IsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9zUkdCKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19pQ0NQLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX3NQTFRfU1VQUE9SVEVECi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfc1BMVCwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX3NQTFQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRAotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3RFWHQsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV90RVh0KHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfdElNRV9TVVBQT1JURUQKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ190SU1FLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfdElNRShwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX3RSTlNfU1VQUE9SVEVECi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfdFJOUywgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX3RSTlMocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRAotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3pUWHQsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV96VFh0KHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19pVFh0LCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfaVRYdChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotICAgICAgZWxzZQotICAgICAgICAgcG5nX2hhbmRsZV91bmtub3duKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotICAgfSB3aGlsZSAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUVORCkpOwotfQotI2VuZGlmIC8qIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEICovCi0KLS8qIEZyZWUgYWxsIG1lbW9yeSB1c2VkIGJ5IHRoZSByZWFkICovCi12b2lkIFBOR0FQSQotcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QocG5nX3N0cnVjdHBwIHBuZ19wdHJfcHRyLCBwbmdfaW5mb3BwIGluZm9fcHRyX3B0ciwKLSAgIHBuZ19pbmZvcHAgZW5kX2luZm9fcHRyX3B0cikKLXsKLSAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBOVUxMOwotICAgcG5nX2luZm9wIGluZm9fcHRyID0gTlVMTCwgZW5kX2luZm9fcHRyID0gTlVMTDsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBwbmdfZnJlZV9wdHIgZnJlZV9mbiA9IE5VTEw7Ci0gICBwbmdfdm9pZHAgbWVtX3B0ciA9IE5VTEw7Ci0jZW5kaWYKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCIpOwotCi0gICBpZiAocG5nX3B0cl9wdHIgIT0gTlVMTCkKLSAgICAgIHBuZ19wdHIgPSAqcG5nX3B0cl9wdHI7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgZnJlZV9mbiA9IHBuZ19wdHItPmZyZWVfZm47Ci0gICBtZW1fcHRyID0gcG5nX3B0ci0+bWVtX3B0cjsKLSNlbmRpZgotCi0gICBpZiAoaW5mb19wdHJfcHRyICE9IE5VTEwpCi0gICAgICBpbmZvX3B0ciA9ICppbmZvX3B0cl9wdHI7Ci0KLSAgIGlmIChlbmRfaW5mb19wdHJfcHRyICE9IE5VTEwpCi0gICAgICBlbmRfaW5mb19wdHIgPSAqZW5kX2luZm9fcHRyX3B0cjsKLQotICAgcG5nX3JlYWRfZGVzdHJveShwbmdfcHRyLCBpbmZvX3B0ciwgZW5kX2luZm9fcHRyKTsKLQotICAgaWYgKGluZm9fcHRyICE9IE5VTEwpCi0gICB7Ci0jaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECi0gICAgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9URVhULCAtMSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgICAgIHBuZ19kZXN0cm95X3N0cnVjdF8yKChwbmdfdm9pZHApaW5mb19wdHIsIChwbmdfZnJlZV9wdHIpZnJlZV9mbiwKLSAgICAgICAgICAocG5nX3ZvaWRwKW1lbV9wdHIpOwotI2Vsc2UKLSAgICAgIHBuZ19kZXN0cm95X3N0cnVjdCgocG5nX3ZvaWRwKWluZm9fcHRyKTsKLSNlbmRpZgotICAgICAgKmluZm9fcHRyX3B0ciA9IE5VTEw7Ci0gICB9Ci0KLSAgIGlmIChlbmRfaW5mb19wdHIgIT0gTlVMTCkKLSAgIHsKLSNpZmRlZiBQTkdfUkVBRF9URVhUX1NVUFBPUlRFRAotICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBlbmRfaW5mb19wdHIsIFBOR19GUkVFX1RFWFQsIC0xKTsKLSNlbmRpZgotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgICAgIHBuZ19kZXN0cm95X3N0cnVjdF8yKChwbmdfdm9pZHApZW5kX2luZm9fcHRyLCAocG5nX2ZyZWVfcHRyKWZyZWVfZm4sCi0gICAgICAgICAocG5nX3ZvaWRwKW1lbV9wdHIpOwotI2Vsc2UKLSAgICAgIHBuZ19kZXN0cm95X3N0cnVjdCgocG5nX3ZvaWRwKWVuZF9pbmZvX3B0cik7Ci0jZW5kaWYKLSAgICAgICplbmRfaW5mb19wdHJfcHRyID0gTlVMTDsKLSAgIH0KLQotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKLSAgIHsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICAgICBwbmdfZGVzdHJveV9zdHJ1Y3RfMigocG5nX3ZvaWRwKXBuZ19wdHIsIChwbmdfZnJlZV9wdHIpZnJlZV9mbiwKLSAgICAgICAgICAocG5nX3ZvaWRwKW1lbV9wdHIpOwotI2Vsc2UKLSAgICAgIHBuZ19kZXN0cm95X3N0cnVjdCgocG5nX3ZvaWRwKXBuZ19wdHIpOwotI2VuZGlmCi0gICAgICAqcG5nX3B0cl9wdHIgPSBOVUxMOwotICAgfQotfQotCi0vKiBGcmVlIGFsbCBtZW1vcnkgdXNlZCBieSB0aGUgcmVhZCAob2xkIG1ldGhvZCkgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3JlYWRfZGVzdHJveShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICAgcG5nX2luZm9wIGVuZF9pbmZvX3B0cikKLXsKLSNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAotICAgam1wX2J1ZiB0bXBfam1wOwotI2VuZGlmCi0gICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuOwotICAgcG5nX2Vycm9yX3B0ciB3YXJuaW5nX2ZuOwotICAgcG5nX3ZvaWRwIGVycm9yX3B0cjsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBwbmdfZnJlZV9wdHIgZnJlZV9mbjsKLSNlbmRpZgotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19yZWFkX2Rlc3Ryb3kiKTsKLQotICAgaWYgKGluZm9fcHRyICE9IE5VTEwpCi0gICAgICBwbmdfaW5mb19kZXN0cm95KHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgaWYgKGVuZF9pbmZvX3B0ciAhPSBOVUxMKQotICAgICAgcG5nX2luZm9fZGVzdHJveShwbmdfcHRyLCBlbmRfaW5mb19wdHIpOwotCi0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT56YnVmKTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmJpZ19yb3dfYnVmKTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnByZXZfcm93KTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0jaWZkZWYgUE5HX1JFQURfUVVBTlRJWkVfU1VQUE9SVEVECi0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5wYWxldHRlX2xvb2t1cCk7Ci0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5xdWFudGl6ZV9pbmRleCk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmdhbW1hX3RhYmxlKTsKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVECi0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV9mcm9tXzEpOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Z2FtbWFfdG9fMSk7Ci0jZW5kaWYKLSAgIGlmIChwbmdfcHRyLT5mcmVlX21lICYgUE5HX0ZSRUVfUExURSkKLSAgICAgIHBuZ196ZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5wYWxldHRlKTsKLSAgIHBuZ19wdHItPmZyZWVfbWUgJj0gflBOR19GUkVFX1BMVEU7Ci0jaWYgZGVmaW5lZChQTkdfdFJOU19TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+ZnJlZV9tZSAmIFBOR19GUkVFX1RSTlMpCi0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT50cmFuc19hbHBoYSk7Ci0gICBwbmdfcHRyLT5mcmVlX21lICY9IH5QTkdfRlJFRV9UUk5TOwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfaElTVF9TVVBQT1JURUQKLSAgIGlmIChwbmdfcHRyLT5mcmVlX21lICYgUE5HX0ZSRUVfSElTVCkKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmhpc3QpOwotICAgcG5nX3B0ci0+ZnJlZV9tZSAmPSB+UE5HX0ZSRUVfSElTVDsKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPmdhbW1hXzE2X3RhYmxlICE9IE5VTEwpCi0gICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGludCBpc3RvcCA9ICgxIDw8ICg4IC0gcG5nX3B0ci0+Z2FtbWFfc2hpZnQpKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQotICAgICAgewotICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Z2FtbWFfMTZfdGFibGVbaV0pOwotICAgICAgfQotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Z2FtbWFfMTZfdGFibGUpOwotICAgfQotI2lmZGVmIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+Z2FtbWFfMTZfZnJvbV8xICE9IE5VTEwpCi0gICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGludCBpc3RvcCA9ICgxIDw8ICg4IC0gcG5nX3B0ci0+Z2FtbWFfc2hpZnQpKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQotICAgICAgewotICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Z2FtbWFfMTZfZnJvbV8xW2ldKTsKLSAgICAgIH0KLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMSk7Ci0gICB9Ci0gICBpZiAocG5nX3B0ci0+Z2FtbWFfMTZfdG9fMSAhPSBOVUxMKQotICAgewotICAgICAgaW50IGk7Ci0gICAgICBpbnQgaXN0b3AgPSAoMSA8PCAoOCAtIHBuZ19wdHItPmdhbW1hX3NoaWZ0KSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmdhbW1hXzE2X3RvXzFbaV0pOwotICAgICAgfQotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMSk7Ci0gICB9Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVECi0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT50aW1lX2J1ZmZlcik7Ci0jZW5kaWYKLQotICAgaW5mbGF0ZUVuZCgmcG5nX3B0ci0+enN0cmVhbSk7Ci0jaWZkZWYgUE5HX1BST0dSRVNTSVZFX1JFQURfU1VQUE9SVEVECi0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5zYXZlX2J1ZmZlcik7Ci0jZW5kaWYKLQotICAgLyogU2F2ZSB0aGUgaW1wb3J0YW50IGluZm8gb3V0IG9mIHRoZSBwbmdfc3RydWN0LCBpbiBjYXNlIGl0IGlzCi0gICAgKiBiZWluZyB1c2VkIGFnYWluLgotICAgICovCi0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSAgIHBuZ19tZW1jcHkodG1wX2ptcCwgcG5nX3B0ci0+am1wYnVmLCBwbmdfc2l6ZW9mKGptcF9idWYpKTsKLSNlbmRpZgotCi0gICBlcnJvcl9mbiA9IHBuZ19wdHItPmVycm9yX2ZuOwotICAgd2FybmluZ19mbiA9IHBuZ19wdHItPndhcm5pbmdfZm47Ci0gICBlcnJvcl9wdHIgPSBwbmdfcHRyLT5lcnJvcl9wdHI7Ci0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgZnJlZV9mbiA9IHBuZ19wdHItPmZyZWVfZm47Ci0jZW5kaWYKLQotICAgcG5nX21lbXNldChwbmdfcHRyLCAwLCBwbmdfc2l6ZW9mKHBuZ19zdHJ1Y3QpKTsKLQotICAgcG5nX3B0ci0+ZXJyb3JfZm4gPSBlcnJvcl9mbjsKLSAgIHBuZ19wdHItPndhcm5pbmdfZm4gPSB3YXJuaW5nX2ZuOwotICAgcG5nX3B0ci0+ZXJyb3JfcHRyID0gZXJyb3JfcHRyOwotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgIHBuZ19wdHItPmZyZWVfZm4gPSBmcmVlX2ZuOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAotICAgcG5nX21lbWNweShwbmdfcHRyLT5qbXBidWYsIHRtcF9qbXAsIHBuZ19zaXplb2Yoam1wX2J1ZikpOwotI2VuZGlmCi0KLX0KLQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfcmVhZF9zdGF0dXNfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3JlYWRfc3RhdHVzX3B0ciByZWFkX3Jvd19mbikKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcHRyLT5yZWFkX3Jvd19mbiA9IHJlYWRfcm93X2ZuOwotfQotCi0KLSNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAotI2lmZGVmIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRAotdm9pZCBQTkdBUEkKLXBuZ19yZWFkX3BuZyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNmb3JtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwIHBhcmFtcykKLXsKLSAgIGludCByb3c7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIC8qIHBuZ19yZWFkX2luZm8oKSBnaXZlcyB1cyBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlCi0gICAgKiBQTkcgZmlsZSBiZWZvcmUgdGhlIGZpcnN0IElEQVQgKGltYWdlIGRhdGEgY2h1bmspLgotICAgICovCi0gICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgIGlmIChpbmZvX3B0ci0+aGVpZ2h0ID4gUE5HX1VJTlRfMzJfTUFYL3BuZ19zaXplb2YocG5nX2J5dGVwKSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW1hZ2UgaXMgdG9vIGhpZ2ggdG8gcHJvY2VzcyB3aXRoIHBuZ19yZWFkX3BuZygpIik7Ci0KLSAgIC8qIC0tLS0tLS0tLS0tLS0tIGltYWdlIHRyYW5zZm9ybWF0aW9ucyBzdGFydCBoZXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmZGVmIFBOR19SRUFEXzE2X1RPXzhfU1VQUE9SVEVECi0gICAvKiBUZWxsIGxpYnBuZyB0byBzdHJpcCAxNiBiaXQvY29sb3IgZmlsZXMgZG93biB0byA4IGJpdHMgcGVyIGNvbG9yLgotICAgICovCi0gICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU1RSSVBfMTYpCi0gICAgICBwbmdfc2V0X3N0cmlwXzE2KHBuZ19wdHIpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQKLSAgIC8qIFN0cmlwIGFscGhhIGJ5dGVzIGZyb20gdGhlIGlucHV0IGRhdGEgd2l0aG91dCBjb21iaW5pbmcgd2l0aAotICAgICogdGhlIGJhY2tncm91bmQgKG5vdCByZWNvbW1lbmRlZCkuCi0gICAgKi8KLSAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9TVFJJUF9BTFBIQSkKLSAgICAgIHBuZ19zZXRfc3RyaXBfYWxwaGEocG5nX3B0cik7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS19TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpCi0gICAvKiBFeHRyYWN0IG11bHRpcGxlIHBpeGVscyB3aXRoIGJpdCBkZXB0aHMgb2YgMSwgMiwgb3IgNCBmcm9tIGEgc2luZ2xlCi0gICAgKiBieXRlIGludG8gc2VwYXJhdGUgYnl0ZXMgKHVzZWZ1bCBmb3IgcGFsZXR0ZWQgYW5kIGdyYXlzY2FsZSBpbWFnZXMpLgotICAgICovCi0gICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fUEFDS0lORykKLSAgICAgIHBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVECi0gICAvKiBDaGFuZ2UgdGhlIG9yZGVyIG9mIHBhY2tlZCBwaXhlbHMgdG8gbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGZpcnN0Ci0gICAgKiAobm90IHVzZWZ1bCBpZiB5b3UgYXJlIHVzaW5nIHBuZ19zZXRfcGFja2luZykuCi0gICAgKi8KLSAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCkKLSAgICAgIHBuZ19zZXRfcGFja3N3YXAocG5nX3B0cik7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKLSAgIC8qIEV4cGFuZCBwYWxldHRlZCBjb2xvcnMgaW50byB0cnVlIFJHQiB0cmlwbGV0cwotICAgICogRXhwYW5kIGdyYXlzY2FsZSBpbWFnZXMgdG8gZnVsbCA4IGJpdHMgZnJvbSAxLCAyLCBvciA0IGJpdHMvcGl4ZWwKLSAgICAqIEV4cGFuZCBwYWxldHRlZCBvciBSR0IgaW1hZ2VzIHdpdGggdHJhbnNwYXJlbmN5IHRvIGZ1bGwgYWxwaGEKLSAgICAqIGNoYW5uZWxzIHNvIHRoZSBkYXRhIHdpbGwgYmUgYXZhaWxhYmxlIGFzIFJHQkEgcXVhcnRldHMuCi0gICAgKi8KLSAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9FWFBBTkQpCi0gICAgICBpZiAoKHBuZ19wdHItPmJpdF9kZXB0aCA8IDgpIHx8Ci0gICAgICAgICAgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkgfHwKLSAgICAgICAgICAocG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fdFJOUykpKQotICAgICAgICAgcG5nX3NldF9leHBhbmQocG5nX3B0cik7Ci0jZW5kaWYKLQotICAgLyogV2UgZG9uJ3QgaGFuZGxlIGJhY2tncm91bmQgY29sb3Igb3IgZ2FtbWEgdHJhbnNmb3JtYXRpb24gb3IgcXVhbnRpemluZy4KLSAgICAqLwotCi0jaWZkZWYgUE5HX1JFQURfSU5WRVJUX1NVUFBPUlRFRAotICAgLyogSW52ZXJ0IG1vbm9jaHJvbWUgZmlsZXMgdG8gaGF2ZSAwIGFzIHdoaXRlIGFuZCAxIGFzIGJsYWNrCi0gICAgKi8KLSAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9JTlZFUlRfTU9OTykKLSAgICAgIHBuZ19zZXRfaW52ZXJ0X21vbm8ocG5nX3B0cik7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRAotICAgLyogSWYgeW91IHdhbnQgdG8gc2hpZnQgdGhlIHBpeGVsIHZhbHVlcyBmcm9tIHRoZSByYW5nZSBbMCwyNTVdIG9yCi0gICAgKiBbMCw2NTUzNV0gdG8gdGhlIG9yaWdpbmFsIFswLDddIG9yIFswLDMxXSwgb3Igd2hhdGV2ZXIgcmFuZ2UgdGhlCi0gICAgKiBjb2xvcnMgd2VyZSBvcmlnaW5hbGx5IGluOgotICAgICovCi0gICBpZiAoKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NISUZUKQotICAgICAgICYmIHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX3NCSVQpKQotICAgewotICAgICAgcG5nX2NvbG9yXzhwIHNpZ19iaXQ7Ci0KLSAgICAgIHBuZ19nZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpOwotICAgICAgcG5nX3NldF9zaGlmdChwbmdfcHRyLCBzaWdfYml0KTsKLSAgIH0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfQkdSX1NVUFBPUlRFRAotICAgLyogRmxpcCB0aGUgUkdCIHBpeGVscyB0byBCR1IgKG9yIFJHQkEgdG8gQkdSQSkKLSAgICAqLwotICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX0JHUikKLSAgICAgIHBuZ19zZXRfYmdyKHBuZ19wdHIpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9TV0FQX0FMUEhBX1NVUFBPUlRFRAotICAgLyogU3dhcCB0aGUgUkdCQSBvciBHQSBkYXRhIHRvIEFSR0Igb3IgQUcgKG9yIEJHUkEgdG8gQUJHUikKLSAgICAqLwotICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NXQVBfQUxQSEEpCi0gICAgICAgcG5nX3NldF9zd2FwX2FscGhhKHBuZ19wdHIpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9TV0FQX1NVUFBPUlRFRAotICAgLyogU3dhcCBieXRlcyBvZiAxNiBiaXQgZmlsZXMgdG8gbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdAotICAgICovCi0gICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4pCi0gICAgICBwbmdfc2V0X3N3YXAocG5nX3B0cik7Ci0jZW5kaWYKLQotLyogQWRkZWQgYXQgbGlicG5nLTEuMi40MSAqLwotI2lmZGVmIFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQKLSAgIC8qIEludmVydCB0aGUgYWxwaGEgY2hhbm5lbCBmcm9tIG9wYWNpdHkgdG8gdHJhbnNwYXJlbmN5Ci0gICAgKi8KLSAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9JTlZFUlRfQUxQSEEpCi0gICAgICAgcG5nX3NldF9pbnZlcnRfYWxwaGEocG5nX3B0cik7Ci0jZW5kaWYKLQotLyogQWRkZWQgYXQgbGlicG5nLTEuMi40MSAqLwotI2lmZGVmIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRAotICAgLyogRXhwYW5kIGdyYXlzY2FsZSBpbWFnZSB0byBSR0IKLSAgICAqLwotICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX0dSQVlfVE9fUkdCKQotICAgICAgIHBuZ19zZXRfZ3JheV90b19yZ2IocG5nX3B0cik7Ci0jZW5kaWYKLQotICAgLyogV2UgZG9uJ3QgaGFuZGxlIGFkZGluZyBmaWxsZXIgYnl0ZXMgKi8KLQotICAgLyogT3B0aW9uYWwgY2FsbCB0byBnYW1tYSBjb3JyZWN0IGFuZCBhZGQgdGhlIGJhY2tncm91bmQgdG8gdGhlIHBhbGV0dGUKLSAgICAqIGFuZCB1cGRhdGUgaW5mbyBzdHJ1Y3R1cmUuICBSRVFVSVJFRCBpZiB5b3UgYXJlIGV4cGVjdGluZyBsaWJwbmcgdG8KLSAgICAqIHVwZGF0ZSB0aGUgcGFsZXR0ZSBmb3IgeW91IChpLmUuLCB5b3Ugc2VsZWN0ZWQgc3VjaCBhIHRyYW5zZm9ybSBhYm92ZSkuCi0gICAgKi8KLSAgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgLyogLS0tLS0tLS0tLS0tLS0gaW1hZ2UgdHJhbnNmb3JtYXRpb25zIGVuZCBoZXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfUk9XUywgMCk7Ci0gICBpZiAoaW5mb19wdHItPnJvd19wb2ludGVycyA9PSBOVUxMKQotICAgewotICAgIHBuZ191aW50XzMyIGlwdHI7Ci0KLSAgICAgIGluZm9fcHRyLT5yb3dfcG9pbnRlcnMgPSAocG5nX2J5dGVwcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICBpbmZvX3B0ci0+aGVpZ2h0ICogcG5nX3NpemVvZihwbmdfYnl0ZXApKTsKLSAgICAgIGZvciAoaXB0cj0wOyBpcHRyPGluZm9fcHRyLT5oZWlnaHQ7IGlwdHIrKykKLSAgICAgICAgIGluZm9fcHRyLT5yb3dfcG9pbnRlcnNbaXB0cl0gPSBOVUxMOwotCi0gICAgICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9ST1dTOwotCi0gICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IChpbnQpaW5mb19wdHItPmhlaWdodDsgcm93KyspCi0gICAgICAgICBpbmZvX3B0ci0+cm93X3BvaW50ZXJzW3Jvd10gPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgIHBuZ19nZXRfcm93Ynl0ZXMocG5nX3B0ciwgaW5mb19wdHIpKTsKLSAgIH0KLQotICAgcG5nX3JlYWRfaW1hZ2UocG5nX3B0ciwgaW5mb19wdHItPnJvd19wb2ludGVycyk7Ci0gICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fSURBVDsKLQotICAgLyogUmVhZCByZXN0IG9mIGZpbGUsIGFuZCBnZXQgYWRkaXRpb25hbCBjaHVua3MgaW4gaW5mb19wdHIgLSBSRVFVSVJFRCAqLwotICAgcG5nX3JlYWRfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgUE5HX1VOVVNFRCh0cmFuc2Zvcm1zKSAgIC8qIFF1aWV0IGNvbXBpbGVyIHdhcm5pbmdzICovCi0gICBQTkdfVU5VU0VEKHBhcmFtcykKLQotfQotI2VuZGlmIC8qIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRCAqLwotI2VuZGlmIC8qIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEICovCi0jZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3BuZ3Jpby5jIGIvc3JjL2xpYnBuZy9wbmdyaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEwZjRmMC4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3BuZ3Jpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLQotLyogcG5ncmlvLmMgLSBmdW5jdGlvbnMgZm9yIGRhdGEgaW5wdXQKLSAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNC42IFtKYW51YXJ5IDE0LCAyMDExXQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTEgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSAqCi0gKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSBsb2NhdGlvbiBmb3IgYWxsIGlucHV0LiAgVXNlcnMgd2hvIG5lZWQKLSAqIHNwZWNpYWwgaGFuZGxpbmcgYXJlIGV4cGVjdGVkIHRvIHdyaXRlIGEgZnVuY3Rpb24gdGhhdCBoYXMgdGhlIHNhbWUKLSAqIGFyZ3VtZW50cyBhcyB0aGlzIGFuZCBwZXJmb3JtcyBhIHNpbWlsYXIgZnVuY3Rpb24sIGJ1dCB0aGF0IHBvc3NpYmx5Ci0gKiBoYXMgYSBkaWZmZXJlbnQgaW5wdXQgbWV0aG9kLiAgTm90ZSB0aGF0IHlvdSBzaG91bGRuJ3QgY2hhbmdlIHRoaXMKLSAqIGZ1bmN0aW9uLCBidXQgcmF0aGVyIHdyaXRlIGEgcmVwbGFjZW1lbnQgZnVuY3Rpb24gYW5kIHRoZW4gbWFrZQotICogbGlicG5nIHVzZSBpdCBhdCBydW4gdGltZSB3aXRoIHBuZ19zZXRfcmVhZF9mbiguLi4pLgotICovCi0KLSNkZWZpbmUgUE5HX05PX1BFREFOVElDX1dBUk5JTkdTCi0jaW5jbHVkZSAicG5nLmgiCi0jaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECi0jaW5jbHVkZSAicG5ncHJpdi5oIgotCi0vKiBSZWFkIHRoZSBkYXRhIGZyb20gd2hhdGV2ZXIgaW5wdXQgeW91IGFyZSB1c2luZy4gIFRoZSBkZWZhdWx0IHJvdXRpbmUKLSAqIHJlYWRzIGZyb20gYSBmaWxlIHBvaW50ZXIuICBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIHNvbWV0aW1lcyBnZXRzIGNhbGxlZAotICogd2l0aCB2ZXJ5IHNtYWxsIGxlbmd0aHMsIHNvIHlvdSBzaG91bGQgaW1wbGVtZW50IHNvbWUga2luZCBvZiBzaW1wbGUKLSAqIGJ1ZmZlcmluZyBpZiB5b3UgYXJlIHVzaW5nIHVuYnVmZmVyZWQgcmVhZHMuICBUaGlzIHNob3VsZCBuZXZlciBiZSBhc2tlZAotICogdG8gcmVhZCBtb3JlIHRoZW4gNjRLIG9uIGEgMTYgYml0IG1hY2hpbmUuCi0gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3JlYWRfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCi17Ci0gICBwbmdfZGVidWcxKDQsICJyZWFkaW5nICVkIGJ5dGVzIiwgKGludClsZW5ndGgpOwotCi0gICBpZiAocG5nX3B0ci0+cmVhZF9kYXRhX2ZuICE9IE5VTEwpCi0gICAgICAoKihwbmdfcHRyLT5yZWFkX2RhdGFfZm4pKShwbmdfcHRyLCBkYXRhLCBsZW5ndGgpOwotICAgZWxzZQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJDYWxsIHRvIE5VTEwgcmVhZCBmdW5jdGlvbiIpOwotfQotCi0jaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAotLyogVGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBkb2VzIHRoZSBhY3R1YWwgcmVhZGluZyBvZiBkYXRhLiAgSWYgeW91IGFyZQotICogbm90IHJlYWRpbmcgZnJvbSBhIHN0YW5kYXJkIEMgc3RyZWFtLCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIHJlcGxhY2VtZW50Ci0gKiByZWFkX2RhdGEgZnVuY3Rpb24gYW5kIHVzZSBpdCBhdCBydW4gdGltZSB3aXRoIHBuZ19zZXRfcmVhZF9mbigpLCByYXRoZXIKLSAqIHRoYW4gY2hhbmdpbmcgdGhlIGxpYnJhcnkuCi0gKi8KLSNpZm5kZWYgVVNFX0ZBUl9LRVlXT1JECi12b2lkIFBOR0FQSQotcG5nX2RlZmF1bHRfcmVhZF9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIHBuZ19zaXplX3QgY2hlY2s7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICAvKiBmcmVhZCgpIHJldHVybnMgMCBvbiBlcnJvciwgc28gaXQgaXMgT0sgdG8gc3RvcmUgdGhpcyBpbiBhIHBuZ19zaXplX3QKLSAgICAqIGluc3RlYWQgb2YgYW4gaW50LCB3aGljaCBpcyB3aGF0IGZyZWFkKCkgYWN0dWFsbHkgcmV0dXJucy4KLSAgICAqLwotICAgY2hlY2sgPSBmcmVhZChkYXRhLCAxLCBsZW5ndGgsIChwbmdfRklMRV9wKXBuZ19wdHItPmlvX3B0cik7Ci0KLSAgIGlmIChjaGVjayAhPSBsZW5ndGgpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlJlYWQgRXJyb3IiKTsKLX0KLSNlbHNlCi0vKiBUaGlzIGlzIHRoZSBtb2RlbC1pbmRlcGVuZGVudCB2ZXJzaW9uLiBTaW5jZSB0aGUgc3RhbmRhcmQgSS9PIGxpYnJhcnkKLSAgIGNhbid0IGhhbmRsZSBmYXIgYnVmZmVycyBpbiB0aGUgbWVkaXVtIGFuZCBzbWFsbCBtb2RlbHMsIHdlIGhhdmUgdG8gY29weQotICAgdGhlIGRhdGEuCi0qLwotCi0jZGVmaW5lIE5FQVJfQlVGX1NJWkUgMTAyNAotI2RlZmluZSBNSU4oYSxiKSAoYSA8PSBiID8gYSA6IGIpCi0KLXN0YXRpYyB2b2lkIFBOR0FQSQotcG5nX2RlZmF1bHRfcmVhZF9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIHBuZ19zaXplX3QgY2hlY2s7Ci0gICBwbmdfYnl0ZSAqbl9kYXRhOwotICAgcG5nX0ZJTEVfcCBpb19wdHI7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICAvKiBDaGVjayBpZiBkYXRhIHJlYWxseSBpcyBuZWFyLiBJZiBzbywgdXNlIHVzdWFsIGNvZGUuICovCi0gICBuX2RhdGEgPSAocG5nX2J5dGUgKilDVlRfUFRSX05PQ0hFQ0soZGF0YSk7Ci0gICBpb19wdHIgPSAocG5nX0ZJTEVfcClDVlRfUFRSKHBuZ19wdHItPmlvX3B0cik7Ci0gICBpZiAoKHBuZ19ieXRlcCluX2RhdGEgPT0gZGF0YSkKLSAgIHsKLSAgICAgIGNoZWNrID0gZnJlYWQobl9kYXRhLCAxLCBsZW5ndGgsIGlvX3B0cik7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICBwbmdfYnl0ZSBidWZbTkVBUl9CVUZfU0laRV07Ci0gICAgICBwbmdfc2l6ZV90IHJlYWQsIHJlbWFpbmluZywgZXJyOwotICAgICAgY2hlY2sgPSAwOwotICAgICAgcmVtYWluaW5nID0gbGVuZ3RoOwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgIHJlYWQgPSBNSU4oTkVBUl9CVUZfU0laRSwgcmVtYWluaW5nKTsKLSAgICAgICAgIGVyciA9IGZyZWFkKGJ1ZiwgMSwgcmVhZCwgaW9fcHRyKTsKLSAgICAgICAgIHBuZ19tZW1jcHkoZGF0YSwgYnVmLCByZWFkKTsgLyogY29weSBmYXIgYnVmZmVyIHRvIG5lYXIgYnVmZmVyICovCi0gICAgICAgICBpZiAoZXJyICE9IHJlYWQpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNoZWNrICs9IGVycjsKLSAgICAgICAgIGRhdGEgKz0gcmVhZDsKLSAgICAgICAgIHJlbWFpbmluZyAtPSByZWFkOwotICAgICAgfQotICAgICAgd2hpbGUgKHJlbWFpbmluZyAhPSAwKTsKLSAgIH0KLSAgIGlmICgocG5nX3VpbnRfMzIpY2hlY2sgIT0gKHBuZ191aW50XzMyKWxlbmd0aCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicmVhZCBFcnJvciIpOwotfQotI2VuZGlmCi0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHN1cHBseSBhIG5ldyBpbnB1dCBmdW5jdGlvbgotICogZm9yIGxpYnBuZyBpZiBzdGFuZGFyZCBDIHN0cmVhbXMgYXJlbid0IGJlaW5nIHVzZWQuCi0gKgotICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBpdHMgYXJndW1lbnRzOgotICogcG5nX3B0ciAgICAgIC0gcG9pbnRlciB0byBhIHBuZyBpbnB1dCBkYXRhIHN0cnVjdHVyZQotICogaW9fcHRyICAgICAgIC0gcG9pbnRlciB0byB1c2VyIHN1cHBsaWVkIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm8gYWJvdXQKLSAqICAgICAgICAgICAgICAgIHRoZSBpbnB1dCBmdW5jdGlvbnMuICBNYXkgYmUgTlVMTC4KLSAqIHJlYWRfZGF0YV9mbiAtIHBvaW50ZXIgdG8gYSBuZXcgaW5wdXQgZnVuY3Rpb24gdGhhdCB0YWtlcyBhcyBpdHMKLSAqICAgICAgICAgICAgICAgIGFyZ3VtZW50cyBhIHBvaW50ZXIgdG8gYSBwbmdfc3RydWN0LCBhIHBvaW50ZXIgdG8KLSAqICAgICAgICAgICAgICAgIGEgbG9jYXRpb24gd2hlcmUgaW5wdXQgZGF0YSBjYW4gYmUgc3RvcmVkLCBhbmQgYSAzMi1iaXQKLSAqICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0aGF0IGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZC4KLSAqICAgICAgICAgICAgICAgIFRvIGV4aXQgYW5kIG91dHB1dCBhbnkgZmF0YWwgZXJyb3IgbWVzc2FnZXMgdGhlIG5ldyB3cml0ZQotICogICAgICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGNhbGwgcG5nX2Vycm9yKHBuZ19wdHIsICJFcnJvciBtc2ciKS4KLSAqICAgICAgICAgICAgICAgIE1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIGxpYnBuZydzIGRlZmF1bHQgZnVuY3Rpb24gd2lsbAotICogICAgICAgICAgICAgICAgYmUgdXNlZC4KLSAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfcmVhZF9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgaW9fcHRyLAotICAgcG5nX3J3X3B0ciByZWFkX2RhdGFfZm4pCi17Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3B0ci0+aW9fcHRyID0gaW9fcHRyOwotCi0jaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAotICAgaWYgKHJlYWRfZGF0YV9mbiAhPSBOVUxMKQotICAgICAgcG5nX3B0ci0+cmVhZF9kYXRhX2ZuID0gcmVhZF9kYXRhX2ZuOwotICAgZWxzZQotICAgICAgcG5nX3B0ci0+cmVhZF9kYXRhX2ZuID0gcG5nX2RlZmF1bHRfcmVhZF9kYXRhOwotI2Vsc2UKLSAgIHBuZ19wdHItPnJlYWRfZGF0YV9mbiA9IHJlYWRfZGF0YV9mbjsKLSNlbmRpZgotCi0gICAvKiBJdCBpcyBhbiBlcnJvciB0byB3cml0ZSB0byBhIHJlYWQgZGV2aWNlICovCi0gICBpZiAocG5nX3B0ci0+d3JpdGVfZGF0YV9mbiAhPSBOVUxMKQotICAgewotICAgICAgcG5nX3B0ci0+d3JpdGVfZGF0YV9mbiA9IE5VTEw7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgIkl0J3MgYW4gZXJyb3IgdG8gc2V0IGJvdGggcmVhZF9kYXRhX2ZuIGFuZCB3cml0ZV9kYXRhX2ZuIGluIHRoZSAiKTsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAic2FtZSBzdHJ1Y3R1cmUuICBSZXNldHRpbmcgd3JpdGVfZGF0YV9mbiB0byBOVUxMIik7Ci0gICB9Ci0KLSNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECi0gICBwbmdfcHRyLT5vdXRwdXRfZmx1c2hfZm4gPSBOVUxMOwotI2VuZGlmCi19Ci0jZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3BuZ3J0cmFuLmMgYi9zcmMvbGlicG5nL3BuZ3J0cmFuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZjZmMWUuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9wbmdydHJhbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDI0NCArMCwwIEBACi0KLS8qIHBuZ3J0cmFuLmMgLSB0cmFuc2Zvcm1zIHRoZSBkYXRhIGluIGEgcm93IGZvciBQTkcgcmVhZGVycwotICoKLSAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS40LjExIFtNYXJjaCAyOSwgMjAxMl0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEyIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCi0gKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBvcHRpb25hbGx5IGNhbGxlZCBieSBhbiBhcHBsaWNhdGlvbgotICogaW4gb3JkZXIgdG8gdGVsbCBsaWJwbmcgaG93IHRvIGhhbmRsZSBkYXRhIHdoZW4gcmVhZGluZyBhIFBORy4KLSAqIFRyYW5zZm9ybWF0aW9ucyB0aGF0IGFyZSB1c2VkIGluIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZyBhcmUKLSAqIGluIHBuZ3RyYW5zLmMuCi0gKi8KLQotI2RlZmluZSBQTkdfTk9fUEVEQU5USUNfV0FSTklOR1MKLSNpbmNsdWRlICJwbmcuaCIKLSNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKLSNpbmNsdWRlICJwbmdwcml2LmgiCi0KLS8qIFNldCB0aGUgYWN0aW9uIG9uIGdldHRpbmcgYSBDUkMgZXJyb3IgZm9yIGFuIGFuY2lsbGFyeSBvciBjcml0aWNhbCBjaHVuay4gKi8KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2NyY19hY3Rpb24ocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IGNyaXRfYWN0aW9uLCBpbnQgYW5jaWxfYWN0aW9uKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2NyY19hY3Rpb24iKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgLyogVGVsbCBsaWJwbmcgaG93IHdlIHJlYWN0IHRvIENSQyBlcnJvcnMgaW4gY3JpdGljYWwgY2h1bmtzICovCi0gICBzd2l0Y2ggKGNyaXRfYWN0aW9uKQotICAgewotICAgICAgY2FzZSBQTkdfQ1JDX05PX0NIQU5HRTogICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWF2ZSBzZXR0aW5nIGFzIGlzICovCi0gICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBQTkdfQ1JDX1dBUk5fVVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYXJuL3VzZSBkYXRhICovCi0gICAgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX01BU0s7Ci0gICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19DUkNfQ1JJVElDQUxfVVNFOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUE5HX0NSQ19RVUlFVF9VU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRdWlldC91c2UgZGF0YSAqLwotICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0NSQ19DUklUSUNBTF9NQVNLOwotICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX1VTRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfRkxBR19DUkNfQ1JJVElDQUxfSUdOT1JFOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUE5HX0NSQ19XQVJOX0RJU0NBUkQ6ICAgIC8qIE5vdCBhIHZhbGlkIGFjdGlvbiBmb3IgY3JpdGljYWwgZGF0YSAqLwotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgICAgICJDYW4ndCBkaXNjYXJkIGNyaXRpY2FsIGRhdGEgb24gQ1JDIGVycm9yIik7Ci0gICAgICBjYXNlIFBOR19DUkNfRVJST1JfUVVJVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yL3F1aXQgKi8KLQotICAgICAgY2FzZSBQTkdfQ1JDX0RFRkFVTFQ6Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0NSQ19DUklUSUNBTF9NQVNLOwotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIC8qIFRlbGwgbGlicG5nIGhvdyB3ZSByZWFjdCB0byBDUkMgZXJyb3JzIGluIGFuY2lsbGFyeSBjaHVua3MgKi8KLSAgIHN3aXRjaCAoYW5jaWxfYWN0aW9uKQotICAgewotICAgICAgY2FzZSBQTkdfQ1JDX05PX0NIQU5HRTogICAgICAgICAgICAgICAgICAgICAgIC8qIExlYXZlIHNldHRpbmcgYXMgaXMgKi8KLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFBOR19DUkNfV0FSTl9VU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2Fybi91c2UgZGF0YSAqLwotICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0NSQ19BTkNJTExBUllfTUFTSzsKLSAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0NSQ19BTkNJTExBUllfVVNFOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUE5HX0NSQ19RVUlFVF9VU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFF1aWV0L3VzZSBkYXRhICovCi0gICAgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9NQVNLOwotICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9VU0UgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9OT1dBUk47Ci0gICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBQTkdfQ1JDX0VSUk9SX1FVSVQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yL3F1aXQgKi8KLSAgICAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19DUkNfQU5DSUxMQVJZX01BU0s7Ci0gICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX05PV0FSTjsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFBOR19DUkNfV0FSTl9ESVNDQVJEOiAgICAgICAgICAgICAgICAgICAgICAvKiBXYXJuL2Rpc2NhcmQgZGF0YSAqLwotCi0gICAgICBjYXNlIFBOR19DUkNfREVGQVVMVDoKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9NQVNLOwotICAgICAgICAgYnJlYWs7Ci0gICB9Ci19Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSAmJiBcCi0gICAgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQotLyogSGFuZGxlIGFscGhhIGFuZCB0Uk5TIHZpYSBhIGJhY2tncm91bmQgY29sb3IgKi8KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2JhY2tncm91bmQocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb2xvcl8xNnAgYmFja2dyb3VuZF9jb2xvciwgaW50IGJhY2tncm91bmRfZ2FtbWFfY29kZSwKLSAgIGludCBuZWVkX2V4cGFuZCwgZG91YmxlIGJhY2tncm91bmRfZ2FtbWEpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfYmFja2dyb3VuZCIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgaWYgKGJhY2tncm91bmRfZ2FtbWFfY29kZSA9PSBQTkdfQkFDS0dST1VORF9HQU1NQV9VTktOT1dOKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkFwcGxpY2F0aW9uIG11c3Qgc3VwcGx5IGEga25vd24gYmFja2dyb3VuZCBnYW1tYSIpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0JBQ0tHUk9VTkQ7Ci0gICBwbmdfbWVtY3B5KCYocG5nX3B0ci0+YmFja2dyb3VuZCksIGJhY2tncm91bmRfY29sb3IsCi0gICAgICBwbmdfc2l6ZW9mKHBuZ19jb2xvcl8xNikpOwotICAgcG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYSA9IChmbG9hdCliYWNrZ3JvdW5kX2dhbW1hOwotICAgcG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYV90eXBlID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kX2dhbW1hX2NvZGUpOwotICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IChuZWVkX2V4cGFuZCA/IFBOR19CQUNLR1JPVU5EX0VYUEFORCA6IDApOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF8xNl9UT184X1NVUFBPUlRFRAotLyogU3RyaXAgMTYgYml0IGRlcHRoIGZpbGVzIHRvIDggYml0IGRlcHRoICovCi12b2lkIFBOR0FQSQotcG5nX3NldF9zdHJpcF8xNihwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3N0cmlwXzE2Iik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HXzE2X1RPXzg7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX1NUUklQX0FMUEhBX1NVUFBPUlRFRAotdm9pZCBQTkdBUEkKLXBuZ19zZXRfc3RyaXBfYWxwaGEocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9zdHJpcF9hbHBoYSIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfU1RSSVBfQUxQSEE7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRAotLyogUXVhbnRpemUgZmlsZSB0byA4IGJpdC4gIFN1cHBseSBhIHBhbGV0dGUsIHRoZSBjdXJyZW50IG51bWJlcgotICogb2YgZWxlbWVudHMgaW4gdGhlIHBhbGV0dGUsIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cwotICogYWxsb3dlZCwgYW5kIGEgaGlzdG9ncmFtIGlmIHBvc3NpYmxlLiAgSWYgdGhlIGN1cnJlbnQgbnVtYmVyCi0gKiBvZiBjb2xvcnMgaXMgZ3JlYXRlciB0aGVuIHRoZSBtYXhpbXVtIG51bWJlciwgdGhlIHBhbGV0dGUgd2lsbCBiZQotICogbW9kaWZpZWQgdG8gZml0IGluIHRoZSBtYXhpbXVtIG51bWJlci4gICJmdWxsX3F1YW50aXplIiBpbmRpY2F0ZXMKLSAqIHdoZXRoZXIgd2UgbmVlZCBhIHF1YW50aXplaW5nIGN1YmUgc2V0IHVwIGZvciBSR0IgaW1hZ2VzLCBvciBpZiB3ZQotICogc2ltcGx5IGFyZSByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIGNvbG9ycyBpbiBhIHBhbGV0dGVkIGltYWdlLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHBuZ19kc29ydF9zdHJ1Y3QKLXsKLSAgIHN0cnVjdCBwbmdfZHNvcnRfc3RydWN0IEZBUiAqIG5leHQ7Ci0gICBwbmdfYnl0ZSBsZWZ0OwotICAgcG5nX2J5dGUgcmlnaHQ7Ci19IHBuZ19kc29ydDsKLXR5cGVkZWYgcG5nX2Rzb3J0IEZBUiAqICAgICAgIHBuZ19kc29ydHA7Ci10eXBlZGVmIHBuZ19kc29ydCBGQVIgKiBGQVIgKiBwbmdfZHNvcnRwcDsKLQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfcXVhbnRpemUocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbG9ycCBwYWxldHRlLAotICAgaW50IG51bV9wYWxldHRlLCBpbnQgbWF4aW11bV9jb2xvcnMsIHBuZ191aW50XzE2cCBoaXN0b2dyYW0sCi0gICBpbnQgZnVsbF9xdWFudGl6ZSkKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9xdWFudGl6ZSIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19RVUFOVElaRTsKLQotICAgaWYgKCFmdWxsX3F1YW50aXplKQotICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIHBuZ19wdHItPnF1YW50aXplX2luZGV4ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAocG5nX3VpbnRfMzIpKG51bV9wYWxldHRlICogcG5nX3NpemVvZihwbmdfYnl0ZSkpKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFsZXR0ZTsgaSsrKQotICAgICAgICAgcG5nX3B0ci0+cXVhbnRpemVfaW5kZXhbaV0gPSAocG5nX2J5dGUpaTsKLSAgIH0KLQotICAgaWYgKG51bV9wYWxldHRlID4gbWF4aW11bV9jb2xvcnMpCi0gICB7Ci0gICAgICBpZiAoaGlzdG9ncmFtICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAvKiBUaGlzIGlzIGVhc3kgZW5vdWdoLCBqdXN0IHRocm93IG91dCB0aGUgbGVhc3QgdXNlZCBjb2xvcnMuCi0gICAgICAgICAgKiBQZXJoYXBzIG5vdCB0aGUgYmVzdCBzb2x1dGlvbiwgYnV0IGdvb2QgZW5vdWdoLgotICAgICAgICAgICovCi0KLSAgICAgICAgIGludCBpOwotCi0gICAgICAgICAvKiBJbml0aWFsaXplIGFuIGFycmF5IHRvIHNvcnQgY29sb3JzICovCi0gICAgICAgICBwbmdfcHRyLT5xdWFudGl6ZV9zb3J0ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAgICAocG5nX3VpbnRfMzIpKG51bV9wYWxldHRlICogcG5nX3NpemVvZihwbmdfYnl0ZSkpKTsKLQotICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcXVhbnRpemVfc29ydCBhcnJheSAqLwotICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYWxldHRlOyBpKyspCi0gICAgICAgICAgICBwbmdfcHRyLT5xdWFudGl6ZV9zb3J0W2ldID0gKHBuZ19ieXRlKWk7Ci0KLSAgICAgICAgIC8qIEZpbmQgdGhlIGxlYXN0IHVzZWQgcGFsZXR0ZSBlbnRyaWVzIGJ5IHN0YXJ0aW5nIGEKLSAgICAgICAgICAqIGJ1YmJsZSBzb3J0LCBhbmQgcnVubmluZyBpdCB1bnRpbCB3ZSBoYXZlIHNvcnRlZAotICAgICAgICAgICogb3V0IGVub3VnaCBjb2xvcnMuICBOb3RlIHRoYXQgd2UgZG9uJ3QgY2FyZSBhYm91dAotICAgICAgICAgICogc29ydGluZyBhbGwgdGhlIGNvbG9ycywganVzdCBmaW5kaW5nIHdoaWNoIGFyZQotICAgICAgICAgICogbGVhc3QgdXNlZC4KLSAgICAgICAgICAqLwotCi0gICAgICAgICBmb3IgKGkgPSBudW1fcGFsZXR0ZSAtIDE7IGkgPj0gbWF4aW11bV9jb2xvcnM7IGktLSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBkb25lOyAvKiBUbyBzdG9wIGVhcmx5IGlmIHRoZSBsaXN0IGlzIHByZS1zb3J0ZWQgKi8KLSAgICAgICAgICAgIGludCBqOwotCi0gICAgICAgICAgICBkb25lID0gMTsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoaGlzdG9ncmFtW3BuZ19wdHItPnF1YW50aXplX3NvcnRbal1dCi0gICAgICAgICAgICAgICAgICAgPCBoaXN0b2dyYW1bcG5nX3B0ci0+cXVhbnRpemVfc29ydFtqICsgMV1dKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgdDsKLQotICAgICAgICAgICAgICAgICAgdCA9IHBuZ19wdHItPnF1YW50aXplX3NvcnRbal07Ci0gICAgICAgICAgICAgICAgICBwbmdfcHRyLT5xdWFudGl6ZV9zb3J0W2pdID0gcG5nX3B0ci0+cXVhbnRpemVfc29ydFtqICsgMV07Ci0gICAgICAgICAgICAgICAgICBwbmdfcHRyLT5xdWFudGl6ZV9zb3J0W2ogKyAxXSA9IHQ7Ci0gICAgICAgICAgICAgICAgICBkb25lID0gMDsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkb25lKQotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIC8qIFN3YXAgdGhlIHBhbGV0dGUgYXJvdW5kLCBhbmQgc2V0IHVwIGEgdGFibGUsIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgICAgaWYgKGZ1bGxfcXVhbnRpemUpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaiA9IG51bV9wYWxldHRlOwotCi0gICAgICAgICAgICAvKiBQdXQgYWxsIHRoZSB1c2VmdWwgY29sb3JzIHdpdGhpbiB0aGUgbWF4LCBidXQgZG9uJ3QKLSAgICAgICAgICAgICAqIG1vdmUgdGhlIG90aGVycy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1heGltdW1fY29sb3JzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoKGludClwbmdfcHRyLT5xdWFudGl6ZV9zb3J0W2ldID49IG1heGltdW1fY29sb3JzKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgIGotLTsKLSAgICAgICAgICAgICAgICAgIHdoaWxlICgoaW50KXBuZ19wdHItPnF1YW50aXplX3NvcnRbal0gPj0gbWF4aW11bV9jb2xvcnMpOwotICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IHBhbGV0dGVbal07Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaiA9IG51bV9wYWxldHRlOwotCi0gICAgICAgICAgICAvKiBNb3ZlIGFsbCB0aGUgdXNlZCBjb2xvcnMgaW5zaWRlIHRoZSBtYXggbGltaXQsIGFuZAotICAgICAgICAgICAgICogZGV2ZWxvcCBhIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWF4aW11bV9jb2xvcnM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8qIE9ubHkgbW92ZSB0aGUgY29sb3JzIHdlIG5lZWQgdG8gKi8KLSAgICAgICAgICAgICAgIGlmICgoaW50KXBuZ19wdHItPnF1YW50aXplX3NvcnRbaV0gPj0gbWF4aW11bV9jb2xvcnMpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfY29sb3IgdG1wX2NvbG9yOwotCi0gICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgai0tOwotICAgICAgICAgICAgICAgICAgd2hpbGUgKChpbnQpcG5nX3B0ci0+cXVhbnRpemVfc29ydFtqXSA+PSBtYXhpbXVtX2NvbG9ycyk7Ci0KLSAgICAgICAgICAgICAgICAgIHRtcF9jb2xvciA9IHBhbGV0dGVbal07Ci0gICAgICAgICAgICAgICAgICBwYWxldHRlW2pdID0gcGFsZXR0ZVtpXTsKLSAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0gPSB0bXBfY29sb3I7Ci0gICAgICAgICAgICAgICAgICAvKiBJbmRpY2F0ZSB3aGVyZSB0aGUgY29sb3Igd2VudCAqLwotICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+cXVhbnRpemVfaW5kZXhbal0gPSAocG5nX2J5dGUpaTsKLSAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnF1YW50aXplX2luZGV4W2ldID0gKHBuZ19ieXRlKWo7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEZpbmQgY2xvc2VzdCBjb2xvciBmb3IgdGhvc2UgY29sb3JzIHdlIGFyZSBub3QgdXNpbmcgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFsZXR0ZTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKChpbnQpcG5nX3B0ci0+cXVhbnRpemVfaW5kZXhbaV0gPj0gbWF4aW11bV9jb2xvcnMpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpbnQgbWluX2QsIGssIG1pbl9rLCBkX2luZGV4OwotCi0gICAgICAgICAgICAgICAgICAvKiBGaW5kIHRoZSBjbG9zZXN0IGNvbG9yIHRvIG9uZSB3ZSB0aHJldyBvdXQgKi8KLSAgICAgICAgICAgICAgICAgIGRfaW5kZXggPSBwbmdfcHRyLT5xdWFudGl6ZV9pbmRleFtpXTsKLSAgICAgICAgICAgICAgICAgIG1pbl9kID0gUE5HX0NPTE9SX0RJU1QocGFsZXR0ZVtkX2luZGV4XSwgcGFsZXR0ZVswXSk7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGsgPSAxLCBtaW5fayA9IDA7IGsgPCBtYXhpbXVtX2NvbG9yczsgaysrKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaW50IGQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgIGQgPSBQTkdfQ09MT1JfRElTVChwYWxldHRlW2RfaW5kZXhdLCBwYWxldHRlW2tdKTsKLQotICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPCBtaW5fZCkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9kID0gZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9rID0gazsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIGNsb3Nlc3QgY29sb3IgKi8KLSAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnF1YW50aXplX2luZGV4W2ldID0gKHBuZ19ieXRlKW1pbl9rOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+cXVhbnRpemVfc29ydCk7Ci0gICAgICAgICBwbmdfcHRyLT5xdWFudGl6ZV9zb3J0ID0gTlVMTDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIC8qIFRoaXMgaXMgbXVjaCBoYXJkZXIgdG8gZG8gc2ltcGx5IChhbmQgcXVpY2tseSkuICBQZXJoYXBzCi0gICAgICAgICAgKiB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggYSBtZWRpYW4gY3V0IHJvdXRpbmUsIGJ1dCB0aG9zZQotICAgICAgICAgICogZG9uJ3QgYWx3YXlzIGJlaGF2ZSB0aGVtc2VsdmVzIHdpdGggb25seSBhIGZldyBjb2xvcnMKLSAgICAgICAgICAqIGFzIGlucHV0LiAgU28gd2Ugd2lsbCBqdXN0IGZpbmQgdGhlIGNsb3Nlc3QgdHdvIGNvbG9ycywKLSAgICAgICAgICAqIGFuZCB0aHJvdyBvdXQgb25lIG9mIHRoZW0gKGNob3NlbiBzb21ld2hhdCByYW5kb21seSkuCi0gICAgICAgICAgKiBbV2UgZG9uJ3QgdW5kZXJzdGFuZCB0aGlzIGF0IGFsbCwgc28gaWYgc29tZW9uZSB3YW50cyB0bwotICAgICAgICAgICogIHdvcmsgb24gaW1wcm92aW5nIGl0LCBiZSBvdXIgZ3Vlc3QgLSBBRUQsIEdSUF0KLSAgICAgICAgICAqLwotICAgICAgICAgaW50IGk7Ci0gICAgICAgICBpbnQgbWF4X2Q7Ci0gICAgICAgICBpbnQgbnVtX25ld19wYWxldHRlOwotICAgICAgICAgcG5nX2Rzb3J0cCB0OwotICAgICAgICAgcG5nX2Rzb3J0cHAgaGFzaDsKLQotICAgICAgICAgdCA9IE5VTEw7Ci0KLSAgICAgICAgIC8qIEluaXRpYWxpemUgcGFsZXR0ZSBpbmRleCBhcnJheXMgKi8KLSAgICAgICAgIHBuZ19wdHItPmluZGV4X3RvX3BhbGV0dGUgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgIChwbmdfdWludF8zMikobnVtX3BhbGV0dGUgKiBwbmdfc2l6ZW9mKHBuZ19ieXRlKSkpOwotICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleCA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgKHBuZ191aW50XzMyKShudW1fcGFsZXR0ZSAqIHBuZ19zaXplb2YocG5nX2J5dGUpKSk7Ci0KLSAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHNvcnQgYXJyYXkgKi8KLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFsZXR0ZTsgaSsrKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtpXSA9IChwbmdfYnl0ZSlpOwotICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleFtpXSA9IChwbmdfYnl0ZSlpOwotICAgICAgICAgfQotCi0gICAgICAgICBoYXNoID0gKHBuZ19kc29ydHBwKXBuZ19jYWxsb2MocG5nX3B0ciwgKHBuZ191aW50XzMyKSg3NjkgKgotICAgICAgICAgICAgcG5nX3NpemVvZihwbmdfZHNvcnRwKSkpOwotCi0gICAgICAgICBudW1fbmV3X3BhbGV0dGUgPSBudW1fcGFsZXR0ZTsKLQotICAgICAgICAgLyogSW5pdGlhbCB3aWxkIGd1ZXNzIGF0IGhvdyBmYXIgYXBhcnQgdGhlIGZhcnRoZXN0IHBpeGVsCi0gICAgICAgICAgKiBwYWlyIHdlIHdpbGwgYmUgZWxpbWluYXRpbmcgd2lsbCBiZS4gIExhcmdlcgotICAgICAgICAgICogbnVtYmVycyBtZWFuIG1vcmUgYXJlYXMgd2lsbCBiZSBhbGxvY2F0ZWQsIFNtYWxsZXIKLSAgICAgICAgICAqIG51bWJlcnMgcnVuIHRoZSByaXNrIG9mIG5vdCBzYXZpbmcgZW5vdWdoIGRhdGEsIGFuZAotICAgICAgICAgICogaGF2aW5nIHRvIGRvIHRoaXMgYWxsIG92ZXIgYWdhaW4uCi0gICAgICAgICAgKgotICAgICAgICAgICogSSBoYXZlIG5vdCBkb25lIGV4dGVuc2l2ZSBjaGVja2luZyBvbiB0aGlzIG51bWJlci4KLSAgICAgICAgICAqLwotICAgICAgICAgbWF4X2QgPSA5NjsKLQotICAgICAgICAgd2hpbGUgKG51bV9uZXdfcGFsZXR0ZSA+IG1heGltdW1fY29sb3JzKQotICAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9uZXdfcGFsZXR0ZSAtIDE7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGludCBqOwotCi0gICAgICAgICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IG51bV9uZXdfcGFsZXR0ZTsgaisrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaW50IGQ7Ci0KLSAgICAgICAgICAgICAgICAgIGQgPSBQTkdfQ09MT1JfRElTVChwYWxldHRlW2ldLCBwYWxldHRlW2pdKTsKLQotICAgICAgICAgICAgICAgICAgaWYgKGQgPD0gbWF4X2QpCi0gICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgIHQgPSAocG5nX2Rzb3J0cClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAocG5nX3VpbnRfMzIpKHBuZ19zaXplb2YocG5nX2Rzb3J0KSkpOwotICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgIHQtPm5leHQgPSBoYXNoW2RdOwotICAgICAgICAgICAgICAgICAgICAgdC0+bGVmdCA9IChwbmdfYnl0ZSlpOwotICAgICAgICAgICAgICAgICAgICAgdC0+cmlnaHQgPSAocG5nX2J5dGUpajsKLSAgICAgICAgICAgICAgICAgICAgIGhhc2hbZF0gPSB0OwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgaWYgKHQgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodCAhPSBOVUxMKQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBtYXhfZDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKGhhc2hbaV0gIT0gTlVMTCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBuZ19kc29ydHAgcDsKLQotICAgICAgICAgICAgICAgICAgZm9yIChwID0gaGFzaFtpXTsgcDsgcCA9IHAtPm5leHQpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoKGludClwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW3AtPmxlZnRdCi0gICAgICAgICAgICAgICAgICAgICAgICA8IG51bV9uZXdfcGFsZXR0ZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGludClwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW3AtPnJpZ2h0XQotICAgICAgICAgICAgICAgICAgICAgICAgPCBudW1fbmV3X3BhbGV0dGUpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaiwgbmV4dF9qOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtX25ld19wYWxldHRlICYgMHgwMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBwLT5sZWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9qID0gcC0+cmlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gcC0+cmlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2ogPSBwLT5sZWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1fbmV3X3BhbGV0dGUtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVbcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtqXV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPSBwYWxldHRlW251bV9uZXdfcGFsZXR0ZV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZ1bGxfcXVhbnRpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG51bV9wYWxldHRlOyBrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG5nX3B0ci0+cXVhbnRpemVfaW5kZXhba10gPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmluZGV4X3RvX3BhbGV0dGVbal0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5xdWFudGl6ZV9pbmRleFtrXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW25leHRfal07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGludClwbmdfcHRyLT5xdWFudGl6ZV9pbmRleFtrXSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX25ld19wYWxldHRlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+cXVhbnRpemVfaW5kZXhba10gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtqXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtwbmdfcHRyLT5wYWxldHRlX3RvX2luZGV4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBbbnVtX25ld19wYWxldHRlXV0gPSBwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW2pdOwotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleFtwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW2pdXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBwbmdfcHRyLT5wYWxldHRlX3RvX2luZGV4W251bV9uZXdfcGFsZXR0ZV07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmluZGV4X3RvX3BhbGV0dGVbal0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwbmdfYnl0ZSludW1fbmV3X3BhbGV0dGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5wYWxldHRlX3RvX2luZGV4W251bV9uZXdfcGFsZXR0ZV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwbmdfYnl0ZSlqOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgaWYgKG51bV9uZXdfcGFsZXR0ZSA8PSBtYXhpbXVtX2NvbG9ycykKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgaWYgKG51bV9uZXdfcGFsZXR0ZSA8PSBtYXhpbXVtX2NvbG9ycykKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzY5OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoaGFzaFtpXSAhPSBOVUxMKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcG5nX2Rzb3J0cCBwID0gaGFzaFtpXTsKLSAgICAgICAgICAgICAgICAgIHdoaWxlIChwKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgdCA9IHAtPm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwKTsKLSAgICAgICAgICAgICAgICAgICAgIHAgPSB0OwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgaGFzaFtpXSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXhfZCArPSA5NjsKLSAgICAgICAgIH0KLSAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGhhc2gpOwotICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleCk7Ci0gICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5pbmRleF90b19wYWxldHRlKTsKLSAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVfdG9faW5kZXggPSBOVUxMOwotICAgICAgICAgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZSA9IE5VTEw7Ci0gICAgICB9Ci0gICAgICBudW1fcGFsZXR0ZSA9IG1heGltdW1fY29sb3JzOwotICAgfQotICAgaWYgKHBuZ19wdHItPnBhbGV0dGUgPT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ19wdHItPnBhbGV0dGUgPSBwYWxldHRlOwotICAgfQotICAgcG5nX3B0ci0+bnVtX3BhbGV0dGUgPSAocG5nX3VpbnRfMTYpbnVtX3BhbGV0dGU7Ci0KLSAgIGlmIChmdWxsX3F1YW50aXplKQotICAgewotICAgICAgaW50IGk7Ci0gICAgICBwbmdfYnl0ZXAgZGlzdGFuY2U7Ci0gICAgICBpbnQgdG90YWxfYml0cyA9IFBOR19RVUFOVElaRV9SRURfQklUUyArIFBOR19RVUFOVElaRV9HUkVFTl9CSVRTICsKLSAgICAgICAgIFBOR19RVUFOVElaRV9CTFVFX0JJVFM7Ci0gICAgICBpbnQgbnVtX3JlZCA9ICgxIDw8IFBOR19RVUFOVElaRV9SRURfQklUUyk7Ci0gICAgICBpbnQgbnVtX2dyZWVuID0gKDEgPDwgUE5HX1FVQU5USVpFX0dSRUVOX0JJVFMpOwotICAgICAgaW50IG51bV9ibHVlID0gKDEgPDwgUE5HX1FVQU5USVpFX0JMVUVfQklUUyk7Ci0gICAgICBwbmdfc2l6ZV90IG51bV9lbnRyaWVzID0gKChwbmdfc2l6ZV90KTEgPDwgdG90YWxfYml0cyk7Ci0KLSAgICAgIHBuZ19wdHItPnBhbGV0dGVfbG9va3VwID0gKHBuZ19ieXRlcCApcG5nX2NhbGxvYyhwbmdfcHRyLAotICAgICAgICAgKHBuZ191aW50XzMyKShudW1fZW50cmllcyAqIHBuZ19zaXplb2YocG5nX2J5dGUpKSk7Ci0KLSAgICAgIGRpc3RhbmNlID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsIChwbmdfdWludF8zMikobnVtX2VudHJpZXMgKgotICAgICAgICAgcG5nX3NpemVvZihwbmdfYnl0ZSkpKTsKLSAgICAgIHBuZ19tZW1zZXQoZGlzdGFuY2UsIDB4ZmYsIG51bV9lbnRyaWVzICogcG5nX3NpemVvZihwbmdfYnl0ZSkpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhbGV0dGU7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIGludCBpciwgaWcsIGliOwotICAgICAgICAgaW50IHIgPSAocGFsZXR0ZVtpXS5yZWQgPj4gKDggLSBQTkdfUVVBTlRJWkVfUkVEX0JJVFMpKTsKLSAgICAgICAgIGludCBnID0gKHBhbGV0dGVbaV0uZ3JlZW4gPj4gKDggLSBQTkdfUVVBTlRJWkVfR1JFRU5fQklUUykpOwotICAgICAgICAgaW50IGIgPSAocGFsZXR0ZVtpXS5ibHVlID4+ICg4IC0gUE5HX1FVQU5USVpFX0JMVUVfQklUUykpOwotCi0gICAgICAgICBmb3IgKGlyID0gMDsgaXIgPCBudW1fcmVkOyBpcisrKQotICAgICAgICAgewotICAgICAgICAgICAgLyogaW50IGRyID0gYWJzKGlyIC0gcik7ICovCi0gICAgICAgICAgICBpbnQgZHIgPSAoKGlyID4gcikgPyBpciAtIHIgOiByIC0gaXIpOwotICAgICAgICAgICAgaW50IGluZGV4X3IgPSAoaXIgPDwgKFBOR19RVUFOVElaRV9CTFVFX0JJVFMgKwotICAgICAgICAgICAgICAgIFBOR19RVUFOVElaRV9HUkVFTl9CSVRTKSk7Ci0KLSAgICAgICAgICAgIGZvciAoaWcgPSAwOyBpZyA8IG51bV9ncmVlbjsgaWcrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8qIGludCBkZyA9IGFicyhpZyAtIGcpOyAqLwotICAgICAgICAgICAgICAgaW50IGRnID0gKChpZyA+IGcpID8gaWcgLSBnIDogZyAtIGlnKTsKLSAgICAgICAgICAgICAgIGludCBkdCA9IGRyICsgZGc7Ci0gICAgICAgICAgICAgICBpbnQgZG0gPSAoKGRyID4gZGcpID8gZHIgOiBkZyk7Ci0gICAgICAgICAgICAgICBpbnQgaW5kZXhfZyA9IGluZGV4X3IgfCAoaWcgPDwgUE5HX1FVQU5USVpFX0JMVUVfQklUUyk7Ci0KLSAgICAgICAgICAgICAgIGZvciAoaWIgPSAwOyBpYiA8IG51bV9ibHVlOyBpYisrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaW50IGRfaW5kZXggPSBpbmRleF9nIHwgaWI7Ci0gICAgICAgICAgICAgICAgICAvKiBpbnQgZGIgPSBhYnMoaWIgLSBiKTsgKi8KLSAgICAgICAgICAgICAgICAgIGludCBkYiA9ICgoaWIgPiBiKSA/IGliIC0gYiA6IGIgLSBpYik7Ci0gICAgICAgICAgICAgICAgICBpbnQgZG1heCA9ICgoZG0gPiBkYikgPyBkbSA6IGRiKTsKLSAgICAgICAgICAgICAgICAgIGludCBkID0gZG1heCArIGR0ICsgZGI7Ci0KLSAgICAgICAgICAgICAgICAgIGlmIChkIDwgKGludClkaXN0YW5jZVtkX2luZGV4XSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlW2RfaW5kZXhdID0gKHBuZ19ieXRlKWQ7Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5wYWxldHRlX2xvb2t1cFtkX2luZGV4XSA9IChwbmdfYnl0ZSlpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBkaXN0YW5jZSk7Ci0gICB9Ci19Ci0jZW5kaWYgLyogUE5HX1JFQURfUVVBTlRJWkVfU1VQUE9SVEVEICovCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQotLyogVHJhbnNmb3JtIHRoZSBpbWFnZSBmcm9tIHRoZSBmaWxlX2dhbW1hIHRvIHRoZSBzY3JlZW5fZ2FtbWEuICBXZQotICogb25seSBkbyB0cmFuc2Zvcm1hdGlvbnMgb24gaW1hZ2VzIHdoZXJlIHRoZSBmaWxlX2dhbW1hIGFuZCBzY3JlZW5fZ2FtbWEKLSAqIGFyZSBub3QgY2xvc2UgcmVjaXByb2NhbHMsIG90aGVyd2lzZSBpdCBzbG93cyB0aGluZ3MgZG93biBzbGlnaHRseSwgYW5kCi0gKiBhbHNvIG5lZWRsZXNzbHkgaW50cm9kdWNlcyBzbWFsbCBlcnJvcnMuCi0gKgotICogV2Ugd2lsbCB0dXJuIG9mZiBnYW1tYSB0cmFuc2Zvcm1hdGlvbiBsYXRlciBpZiBubyBzZW1pdHJhbnNwYXJlbnQgZW50cmllcwotICogYXJlIHByZXNlbnQgaW4gdGhlIHRSTlMgYXJyYXkgZm9yIHBhbGV0dGUgaW1hZ2VzLiAgV2UgY2FuJ3QgZG8gaXQgaGVyZQotICogYmVjYXVzZSB3ZSBkb24ndCBuZWNlc3NhcmlseSBoYXZlIHRoZSB0Uk5TIGNodW5rIHlldC4KLSAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfZ2FtbWEocG5nX3N0cnVjdHAgcG5nX3B0ciwgZG91YmxlIHNjcm5fZ2FtbWEsIGRvdWJsZSBmaWxlX2dhbW1hKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2dhbW1hIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIGlmICgoZmFicyhzY3JuX2dhbW1hICogZmlsZV9nYW1tYSAtIDEuMCkgPiBQTkdfR0FNTUFfVEhSRVNIT0xEKSB8fAotICAgICAgIChwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpIHx8Ci0gICAgICAgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkpCi0gICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfR0FNTUE7Ci0gICBwbmdfcHRyLT5nYW1tYSA9IChmbG9hdClmaWxlX2dhbW1hOwotICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hID0gKGZsb2F0KXNjcm5fZ2FtbWE7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKLS8qIEV4cGFuZCBwYWxldHRlZCBpbWFnZXMgdG8gUkdCLCBleHBhbmQgZ3JheXNjYWxlIGltYWdlcyBvZgotICogbGVzcyB0aGFuIDgtYml0IGRlcHRoIHRvIDgtYml0IGRlcHRoLCBhbmQgZXhwYW5kIHRSTlMgY2h1bmtzCi0gKiB0byBhbHBoYSBjaGFubmVscy4KLSAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfZXhwYW5kKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfZXhwYW5kIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSAoUE5HX0VYUEFORCB8IFBOR19FWFBBTkRfdFJOUyk7Ci0gICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfUk9XX0lOSVQ7Ci19Ci0KLS8qIEdSUiAxOTk5MDYyNzogIHRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGN1cnJlbnRseSBhcmUgaWRlbnRpY2FsCi0gKiAgdG8gcG5nX3NldF9leHBhbmQoKS4gIEhvd2V2ZXIsIGl0IGlzIGVudGlyZWx5IHJlYXNvbmFibGUgdGhhdCBzb21lb25lCi0gKiAgbWlnaHQgd2lzaCB0byBleHBhbmQgYW4gaW5kZXhlZCBpbWFnZSB0byBSR0IgYnV0ICpub3QqIGV4cGFuZCBhIHNpbmdsZSwKLSAqICBmdWxseSB0cmFuc3BhcmVudCBwYWxldHRlIGVudHJ5IHRvIGEgZnVsbCBhbHBoYSBjaGFubmVsLS1wZXJoYXBzIGluc3RlYWQKLSAqICBjb252ZXJ0IHRSTlMgdG8gdGhlIGdyYXlzY2FsZS9SR0IgZm9ybWF0ICgxNi1iaXQgUkdCIHZhbHVlKSwgb3IgcmVwbGFjZQotICogIHRoZSB0cmFuc3BhcmVudCBjb2xvciB3aXRoIGEgcGFydGljdWxhciBSR0IgdmFsdWUsIG9yIGRyb3AgdFJOUyBlbnRpcmVseS4KLSAqICBJT1csIGEgZnV0dXJlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbWF5IG1ha2UgdGhlIHRyYW5zZm9ybWF0aW9ucyBmbGFnCi0gKiAgYSBiaXQgbW9yZSBmaW5lLWdyYWluZWQsIHdpdGggc2VwYXJhdGUgYml0cyBmb3IgZWFjaCBvZiB0aGVzZSB0aHJlZQotICogIGZ1bmN0aW9ucy4KLSAqCi0gKiAgTW9yZSB0byB0aGUgcG9pbnQsIHRoZXNlIGZ1bmN0aW9ucyBtYWtlIGl0IG9idmlvdXMgd2hhdCBsaWJwbmcgd2lsbCBiZQotICogIGRvaW5nLCB3aGVyZWFzICJleHBhbmQiIGNhbiAoYW5kIGRvZXMpIG1lYW4gYW55IG51bWJlciBvZiB0aGluZ3MuCi0gKgotICogIEdSUCAyMDA2MDMwNzogSW4gbGlicG5nLTEuMi45LCBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpIHdhcyBtb2RpZmllZAotICogIHRvIGV4cGFuZCBvbmx5IHRoZSBzYW1wbGUgZGVwdGggYnV0IG5vdCB0byBleHBhbmQgdGhlIHRSTlMgdG8gYWxwaGEKLSAqICBhbmQgaXRzIG5hbWUgd2FzIGNoYW5nZWQgdG8gcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkuCi0gKi8KLQotLyogRXhwYW5kIHBhbGV0dGVkIGltYWdlcyB0byBSR0IuICovCi12b2lkIFBOR0FQSQotcG5nX3NldF9wYWxldHRlX3RvX3JnYihwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSAoUE5HX0VYUEFORCB8IFBOR19FWFBBTkRfdFJOUyk7Ci0gICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfUk9XX0lOSVQ7Ci19Ci0KLS8qIEV4cGFuZCBncmF5c2NhbGUgaW1hZ2VzIG9mIGxlc3MgdGhhbiA4LWJpdCBkZXB0aCB0byA4IGJpdHMuICovCi12b2lkIFBOR0FQSQotcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0VYUEFORDsKLSAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19ST1dfSU5JVDsKLX0KLQotCi0KLS8qIEV4cGFuZCB0Uk5TIGNodW5rcyB0byBhbHBoYSBjaGFubmVscy4gKi8KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3RSTlNfdG9fYWxwaGEocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF90Uk5TX3RvX2FscGhhIik7Ci0KLSAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSAoUE5HX0VYUEFORCB8IFBOR19FWFBBTkRfdFJOUyk7Ci0gICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfUk9XX0lOSVQ7Ci19Ci0jZW5kaWYgLyogZGVmaW5lZChQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEKSAqLwotCi0jaWZkZWYgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVECi12b2lkIFBOR0FQSQotcG5nX3NldF9ncmF5X3RvX3JnYihwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2dyYXlfdG9fcmdiIik7Ci0KLSAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfR1JBWV9UT19SR0I7Ci0gICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfUk9XX0lOSVQ7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRAotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLS8qIENvbnZlcnQgYSBSR0IgaW1hZ2UgdG8gYSBncmF5c2NhbGUgb2YgdGhlIHNhbWUgd2lkdGguICBUaGlzIGFsbG93cyB1cywKLSAqIGZvciBleGFtcGxlLCB0byBjb252ZXJ0IGEgMjQgYnBwIFJHQiBpbWFnZSBpbnRvIGFuIDggYnBwIGdyYXlzY2FsZSBpbWFnZS4KLSAqLwotCi12b2lkIFBOR0FQSQotcG5nX3NldF9yZ2JfdG9fZ3JheShwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgZXJyb3JfYWN0aW9uLCBkb3VibGUgcmVkLAotICAgZG91YmxlIGdyZWVuKQotewotICAgaW50IHJlZF9maXhlZCwgZ3JlZW5fZml4ZWQ7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgaWYgKHJlZCA+IDIxNDc0LjgzNjQ3IHx8IHJlZCA8IC0yMTQ3NC44MzY0OCB8fAotICAgICAgIGdyZWVuID4gMjE0NzQuODM2NDcgfHwgZ3JlZW4gPCAtMjE0NzQuODM2NDgpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiaWdub3Jpbmcgb3V0IG9mIHJhbmdlIHJnYl90b19ncmF5IGNvZWZmaWNpZW50cyIpOwotICAgICAgcmVkX2ZpeGVkID0gLTE7Ci0gICAgICBncmVlbl9maXhlZCA9IC0xOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgcmVkX2ZpeGVkID0gKGludCkoKGZsb2F0KXJlZCoxMDAwMDAuMCArIDAuNSk7Ci0gICAgICBncmVlbl9maXhlZCA9IChpbnQpKChmbG9hdClncmVlbioxMDAwMDAuMCArIDAuNSk7Ci0gICB9Ci0gICBwbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkKHBuZ19wdHIsIGVycm9yX2FjdGlvbiwgcmVkX2ZpeGVkLCBncmVlbl9maXhlZCk7Ci19Ci0jZW5kaWYKLQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IGVycm9yX2FjdGlvbiwKLSAgIHBuZ19maXhlZF9wb2ludCByZWQsIHBuZ19maXhlZF9wb2ludCBncmVlbikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9yZ2JfdG9fZ3JheSIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBzd2l0Y2goZXJyb3JfYWN0aW9uKQotICAgewotICAgICAgY2FzZSAxOiBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1JHQl9UT19HUkFZOwotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAyOiBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1JHQl9UT19HUkFZX1dBUk47Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDM6IHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfUkdCX1RPX0dSQVlfRVJSOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludmFsaWQgZXJyb3IgYWN0aW9uIGluIHBuZ19zZXRfcmdiX3RvX2dyYXkiKTsKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECi0gICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0VYUEFORDsKLSNlbHNlCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAiQ2Fubm90IGRvIFJHQl9UT19HUkFZIHdpdGhvdXQgRVhQQU5EX1NVUFBPUlRFRCIpOwotICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfUkdCX1RPX0dSQVk7Ci0gICB9Ci0jZW5kaWYKLSAgIHsKLSAgICAgIGlmIChyZWQgPj0gMCAmJiBncmVlbiA+PSAwICYmIHJlZCArIGdyZWVuIDw9IDEwMDAwMEwpCi0gICAgICB7Ci0gICAgICAgICBwbmdfdWludF8xNiByZWRfaW50LCBncmVlbl9pbnQ7Ci0KLSAgICAgICAgIHJlZF9pbnQgPSAocG5nX3VpbnRfMTYpKCgocG5nX3VpbnRfMzIpcmVkKjMyNzY4TCkvMTAwMDAwTCk7Ci0gICAgICAgICBncmVlbl9pbnQgPSAocG5nX3VpbnRfMTYpKCgocG5nX3VpbnRfMzIpZ3JlZW4qMzI3NjhMKS8xMDAwMDBMKTsKLQotICAgICAgICAgcG5nX3B0ci0+cmdiX3RvX2dyYXlfcmVkX2NvZWZmICAgPSByZWRfaW50OwotICAgICAgICAgcG5nX3B0ci0+cmdiX3RvX2dyYXlfZ3JlZW5fY29lZmYgPSBncmVlbl9pbnQ7Ci0gICAgICAgICBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9ibHVlX2NvZWZmICA9Ci0gICAgICAgICAgKHBuZ191aW50XzE2KSgzMjc2OCAtIHJlZF9pbnQgLSBncmVlbl9pbnQpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpZiAocmVkID49IDAgJiYgZ3JlZW4gPj0gMCkKLSAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAiaWdub3Jpbmcgb3V0IG9mIHJhbmdlIHJnYl90b19ncmF5IGNvZWZmaWNpZW50cyIpOwotCi0gICAgICAgICAvKiBVc2UgdGhlIGRlZmF1bHRzLCBmcm9tIHRoZSBjSFJNIGNodW5rIGlmIHNldCwgZWxzZSB0aGUgYnVpbHQgaW4gUmVjCi0gICAgICAgICAgKiA3MDkgdmFsdWVzICh3aGljaCBjb3JyZXNwb25kIHRvIHNSR0IsIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkKLSAgICAgICAgICAqIGFib3V0IHRoZSBzUkdCIGNodW5rISkKLSAgICAgICAgICAqLwotICAgICAgICAgaWYgKHBuZ19wdHItPnJnYl90b19ncmF5X3JlZF9jb2VmZiA9PSAwICYmCi0gICAgICAgICAgICBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9ncmVlbl9jb2VmZiA9PSAwICYmCi0gICAgICAgICAgICBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9ibHVlX2NvZWZmID09IDApCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9yZWRfY29lZmYgICA9IDY5Njg7ICAvKiAuMjEyNjcxICogMzI3NjggKyAuNSAqLwotICAgICAgICAgICAgcG5nX3B0ci0+cmdiX3RvX2dyYXlfZ3JlZW5fY29lZmYgPSAyMzQzNDsgLyogLjcxNTE2MCAqIDMyNzY4ICsgLjUgKi8KLSAgICAgICAgICAgIHBuZ19wdHItPnJnYl90b19ncmF5X2JsdWVfY29lZmYgID0gMjM2NjsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpCi12b2lkIFBOR0FQSQotcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191c2VyX3RyYW5zZm9ybV9wdHIKLSAgIHJlYWRfdXNlcl90cmFuc2Zvcm1fZm4pCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfcmVhZF91c2VyX3RyYW5zZm9ybV9mbiIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0jaWZkZWYgUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECi0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1VTRVJfVFJBTlNGT1JNOwotICAgcG5nX3B0ci0+cmVhZF91c2VyX3RyYW5zZm9ybV9mbiA9IHJlYWRfdXNlcl90cmFuc2Zvcm1fZm47Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0vKiBJbml0aWFsaXplIGV2ZXJ5dGhpbmcgbmVlZGVkIGZvciB0aGUgcmVhZC4gIFRoaXMgaW5jbHVkZXMgbW9kaWZ5aW5nCi0gKiB0aGUgcGFsZXR0ZS4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfaW5pdF9yZWFkX3RyYW5zZm9ybWF0aW9ucyhwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaW5pdF9yZWFkX3RyYW5zZm9ybWF0aW9ucyIpOwotCi0gIHsKLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkKLSAgIGludCBjb2xvcl90eXBlID0gcG5nX3B0ci0+Y29sb3JfdHlwZTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQotCi0jaWZkZWYgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVECi0gICAvKiBEZXRlY3QgZ3JheSBiYWNrZ3JvdW5kIGFuZCBhdHRlbXB0IHRvIGVuYWJsZSBvcHRpbWl6YXRpb24KLSAgICAqIGZvciBncmF5IC0tPiBSR0IgY2FzZQotICAgICoKLSAgICAqIE5vdGU6ICBpZiBQTkdfQkFDS0dST1VORF9FWFBBTkQgaXMgc2V0IGFuZCBjb2xvcl90eXBlIGlzIGVpdGhlciBSR0Igb3IKLSAgICAqIFJHQl9BTFBIQSAoaW4gd2hpY2ggY2FzZSBuZWVkX2V4cGFuZCBpcyBzdXBlcmZsdW91cyBhbnl3YXkpLCB0aGUKLSAgICAqIGJhY2tncm91bmQgY29sb3IgbWlnaHQgYWN0dWFsbHkgYmUgZ3JheSB5ZXQgbm90IGJlIGZsYWdnZWQgYXMgc3VjaC4KLSAgICAqIFRoaXMgaXMgbm90IGEgcHJvYmxlbSBmb3IgdGhlIGN1cnJlbnQgY29kZSwgd2hpY2ggdXNlcwotICAgICogUE5HX0JBQ0tHUk9VTkRfSVNfR1JBWSBvbmx5IHRvIGRlY2lkZSB3aGVuIHRvIGRvIHRoZQotICAgICogcG5nX2RvX2dyYXlfdG9fcmdiKCkgdHJhbnNmb3JtYXRpb24uCi0gICAgKi8KLSAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JBQ0tHUk9VTkRfRVhQQU5EKSAmJgotICAgICAgICEoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSkKLSAgIHsKLSAgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19CQUNLR1JPVU5EX0lTX0dSQVk7Ci0gICB9IGVsc2UgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkFDS0dST1VORCkgJiYKLSAgICAgICAgICAgICAgIShwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkFDS0dST1VORF9FWFBBTkQpICYmCi0gICAgICAgICAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfR1JBWV9UT19SR0IpICYmCi0gICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQucmVkID09IHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4gJiYKLSAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgPT0gcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlKQotICAgewotICAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0JBQ0tHUk9VTkRfSVNfR1JBWTsKLSAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZDsKLSAgIH0KLSNlbmRpZgotCi0gICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CQUNLR1JPVU5EX0VYUEFORCkgJiYKLSAgICAgICAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORCkpCi0gICB7Ci0gICAgICBpZiAoIShjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKSAgLyogaS5lLiwgR1JBWSBvciBHUkFZX0FMUEhBICovCi0gICAgICB7Ci0gICAgICAgICAvKiBFeHBhbmQgYmFja2dyb3VuZCBhbmQgdFJOUyBjaHVua3MgKi8KLSAgICAgICAgIHN3aXRjaCAocG5nX3B0ci0+Yml0X2RlcHRoKQotICAgICAgICAgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5ICo9IChwbmdfdWludF8xNikweGZmOwotICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuCi0gICAgICAgICAgICAgICAgID0gIHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSA9IHBuZ19wdHItPmJhY2tncm91bmQuZ3JheTsKLSAgICAgICAgICAgICAgIGlmICghKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkRfdFJOUykpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zX2NvbG9yLmdyYXkgKj0gKHBuZ191aW50XzE2KTB4ZmY7Ci0gICAgICAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zX2NvbG9yLnJlZCA9IHBuZ19wdHItPnRyYW5zX2NvbG9yLmdyZWVuCi0gICAgICAgICAgICAgICAgICAgPSBwbmdfcHRyLT50cmFuc19jb2xvci5ibHVlID0gcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JheTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgKj0gKHBuZ191aW50XzE2KTB4NTU7Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA9IHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4KLSAgICAgICAgICAgICAgICAgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXk7Ci0gICAgICAgICAgICAgICBpZiAoIShwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EX3RSTlMpKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICBwbmdfcHRyLT50cmFuc19jb2xvci5ncmF5ICo9IChwbmdfdWludF8xNikweDU1OwotICAgICAgICAgICAgICAgICBwbmdfcHRyLT50cmFuc19jb2xvci5yZWQgPSBwbmdfcHRyLT50cmFuc19jb2xvci5ncmVlbgotICAgICAgICAgICAgICAgICAgID0gcG5nX3B0ci0+dHJhbnNfY29sb3IuYmx1ZSA9IHBuZ19wdHItPnRyYW5zX2NvbG9yLmdyYXk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5ICo9IChwbmdfdWludF8xNikweDExOwotICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuCi0gICAgICAgICAgICAgICAgID0gcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlID0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5OwotICAgICAgICAgICAgICAgaWYgKCEocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORF90Uk5TKSkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JheSAqPSAocG5nX3VpbnRfMTYpMHgxMTsKLSAgICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNfY29sb3IucmVkID0gcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JlZW4KLSAgICAgICAgICAgICAgICAgICA9IHBuZ19wdHItPnRyYW5zX2NvbG9yLmJsdWUgPSBwbmdfcHRyLT50cmFuc19jb2xvci5ncmF5OwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0KLSAgICAgICAgICAgIGNhc2UgODoKLQotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQucmVkID0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbgotICAgICAgICAgICAgICAgICA9IHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSA9IHBuZ19wdHItPmJhY2tncm91bmQuZ3JheTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgewotICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgICA9Ci0gICAgICAgICAgICBwbmdfcHRyLT5wYWxldHRlW3BuZ19wdHItPmJhY2tncm91bmQuaW5kZXhdLnJlZDsKLSAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4gPQotICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmluZGV4XS5ncmVlbjsKLSAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSAgPQotICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmluZGV4XS5ibHVlOwotCi0jaWZkZWYgUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAotICAgICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVkVSVF9BTFBIQSkKLSAgICAgICAgewotI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKLSAgICAgICAgICAgaWYgKCEocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORF90Uk5TKSkKLSNlbmRpZgotICAgICAgICAgICB7Ci0gICAgICAgICAgIC8qIEludmVydCB0aGUgYWxwaGEgY2hhbm5lbCAoaW4gdFJOUykgdW5sZXNzIHRoZSBwaXhlbHMgYXJlCi0gICAgICAgICAgICAqIGdvaW5nIHRvIGJlIGV4cGFuZGVkLCBpbiB3aGljaCBjYXNlIGxlYXZlIGl0IGZvciBsYXRlcgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgaW50IGksIGlzdG9wOwotICAgICAgICAgICAgICBpc3RvcD0oaW50KXBuZ19wdHItPm51bV90cmFuczsKLSAgICAgICAgICAgICAgZm9yIChpPTA7IGk8aXN0b3A7IGkrKykKLSAgICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNfYWxwaGFbaV0gPSAocG5nX2J5dGUpKDI1NSAtIHBuZ19wdHItPnRyYW5zX2FscGhhW2ldKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgfQotICAgfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkKLSAgIHBuZ19wdHItPmJhY2tncm91bmRfMSA9IHBuZ19wdHItPmJhY2tncm91bmQ7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQotCi0gICBpZiAoKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAmJiBwbmdfcHRyLT5udW1fdHJhbnMgIT0gMCkKLSAgICAgICAmJiAoZmFicyhwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgKiBwbmdfcHRyLT5nYW1tYSAtIDEuMCkKLSAgICAgICAgIDwgUE5HX0dBTU1BX1RIUkVTSE9MRCkpCi0gICB7Ci0gICAgaW50IGksIGs7Ci0gICAgaz0wOwotICAgIGZvciAoaT0wOyBpPHBuZ19wdHItPm51bV90cmFuczsgaSsrKQotICAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT50cmFuc19hbHBoYVtpXSAhPSAwICYmIHBuZ19wdHItPnRyYW5zX2FscGhhW2ldICE9IDB4ZmYpCi0gICAgICAgIGs9MTsgLyogUGFydGlhbCB0cmFuc3BhcmVuY3kgaXMgcHJlc2VudCAqLwotICAgIH0KLSAgICBpZiAoayA9PSAwKQotICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfR0FNTUE7Ci0gICB9Ci0KLSAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgKFBOR19HQU1NQSB8IFBOR19SR0JfVE9fR1JBWSkpICYmCi0gICAgICAgIHBuZ19wdHItPmdhbW1hICE9IDAuMCkKLSAgIHsKLSAgICAgIHBuZ19idWlsZF9nYW1tYV90YWJsZShwbmdfcHRyLCBwbmdfcHRyLT5iaXRfZGVwdGgpOwotCi0jaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKLSAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkFDS0dST1VORCkKLSAgICAgIHsKLSAgICAgICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICAgICB7Ci0gICAgICAgICAgIC8qIENvdWxkIHNraXAgaWYgbm8gdHJhbnNwYXJlbmN5ICovCi0gICAgICAgICAgICBwbmdfY29sb3IgYmFjaywgYmFja18xOwotICAgICAgICAgICAgcG5nX2NvbG9ycCBwYWxldHRlID0gcG5nX3B0ci0+cGFsZXR0ZTsKLSAgICAgICAgICAgIGludCBudW1fcGFsZXR0ZSA9IHBuZ19wdHItPm51bV9wYWxldHRlOwotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYV90eXBlID09IFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBiYWNrLnJlZCA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BuZ19wdHItPmJhY2tncm91bmQucmVkXTsKLSAgICAgICAgICAgICAgIGJhY2suZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuXTsKLSAgICAgICAgICAgICAgIGJhY2suYmx1ZSA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BuZ19wdHItPmJhY2tncm91bmQuYmx1ZV07Ci0KLSAgICAgICAgICAgICAgIGJhY2tfMS5yZWQgPSBwbmdfcHRyLT5nYW1tYV90b18xW3BuZ19wdHItPmJhY2tncm91bmQucmVkXTsKLSAgICAgICAgICAgICAgIGJhY2tfMS5ncmVlbiA9IHBuZ19wdHItPmdhbW1hX3RvXzFbcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbl07Ci0gICAgICAgICAgICAgICBiYWNrXzEuYmx1ZSA9IHBuZ19wdHItPmdhbW1hX3RvXzFbcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGRvdWJsZSBnLCBnczsKLQotICAgICAgICAgICAgICAgc3dpdGNoIChwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hX3R5cGUpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTjoKLSAgICAgICAgICAgICAgICAgICAgIGcgPSAocG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsKLSAgICAgICAgICAgICAgICAgICAgIGdzID0gMS4wOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgIGNhc2UgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfRklMRToKLSAgICAgICAgICAgICAgICAgICAgIGcgPSAxLjAgLyAocG5nX3B0ci0+Z2FtbWEpOwotICAgICAgICAgICAgICAgICAgICAgZ3MgPSAxLjAgLyAocG5nX3B0ci0+Z2FtbWEgKiBwbmdfcHRyLT5zY3JlZW5fZ2FtbWEpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgIGNhc2UgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfVU5JUVVFOgotICAgICAgICAgICAgICAgICAgICAgZyA9IDEuMCAvIChwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hKTsKLSAgICAgICAgICAgICAgICAgICAgIGdzID0gMS4wIC8gKHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWEgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgIGcgPSAxLjA7ICAgIC8qIGJhY2tfMSAqLwotICAgICAgICAgICAgICAgICAgICAgZ3MgPSAxLjA7ICAgLyogYmFjayAqLwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBpZiAoIGZhYnMoZ3MgLSAxLjApIDwgUE5HX0dBTU1BX1RIUkVTSE9MRCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJhY2sucmVkICAgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQ7Ci0gICAgICAgICAgICAgICAgICBiYWNrLmdyZWVuID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW47Ci0gICAgICAgICAgICAgICAgICBiYWNrLmJsdWUgID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQuYmx1ZTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJhY2sucmVkID0gKHBuZ19ieXRlKShwb3coCi0gICAgICAgICAgICAgICAgICAgICAoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQucmVkLzI1NS4wLCBncykgKiAyNTUuMCArIC41KTsKLSAgICAgICAgICAgICAgICAgIGJhY2suZ3JlZW4gPSAocG5nX2J5dGUpKHBvdygKLSAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbi8yNTUuMCwgZ3MpICogMjU1LjAKLSAgICAgICAgICAgICAgICAgICAgICAgICArIC41KTsKLSAgICAgICAgICAgICAgICAgIGJhY2suYmx1ZSA9IChwbmdfYnl0ZSkocG93KAotICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUvMjU1LjAsIGdzKSAqIDI1NS4wICsgLjUpOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBiYWNrXzEucmVkID0gKHBuZ19ieXRlKShwb3coCi0gICAgICAgICAgICAgICAgICAoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQucmVkLzI1NS4wLCBnKSAqIDI1NS4wICsgLjUpOwotICAgICAgICAgICAgICAgYmFja18xLmdyZWVuID0gKHBuZ19ieXRlKShwb3coCi0gICAgICAgICAgICAgICAgICAoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4vMjU1LjAsIGcpICogMjU1LjAgKyAuNSk7Ci0gICAgICAgICAgICAgICBiYWNrXzEuYmx1ZSA9IChwbmdfYnl0ZSkocG93KAotICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUvMjU1LjAsIGcpICogMjU1LjAgKyAuNSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhbGV0dGU7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChpIDwgKGludClwbmdfcHRyLT5udW1fdHJhbnMgJiYgcG5nX3B0ci0+dHJhbnNfYWxwaGFbaV0gIT0gMHhmZikKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmIChwbmdfcHRyLT50cmFuc19hbHBoYVtpXSA9PSAwKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IGJhY2s7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIC8qIGlmIChwbmdfcHRyLT50cmFuc19hbHBoYVtpXSAhPSAweGZmKSAqLwotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgdiwgdzsKLQotICAgICAgICAgICAgICAgICAgICAgdiA9IHBuZ19wdHItPmdhbW1hX3RvXzFbcGFsZXR0ZVtpXS5yZWRdOwotICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSh3LCB2LCBwbmdfcHRyLT50cmFuc19hbHBoYVtpXSwgYmFja18xLnJlZCk7Ci0gICAgICAgICAgICAgICAgICAgICBwYWxldHRlW2ldLnJlZCA9IHBuZ19wdHItPmdhbW1hX2Zyb21fMVt3XTsKLQotICAgICAgICAgICAgICAgICAgICAgdiA9IHBuZ19wdHItPmdhbW1hX3RvXzFbcGFsZXR0ZVtpXS5ncmVlbl07Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHcsIHYsIHBuZ19wdHItPnRyYW5zX2FscGhhW2ldLCBiYWNrXzEuZ3JlZW4pOwotICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ncmVlbiA9IHBuZ19wdHItPmdhbW1hX2Zyb21fMVt3XTsKLQotICAgICAgICAgICAgICAgICAgICAgdiA9IHBuZ19wdHItPmdhbW1hX3RvXzFbcGFsZXR0ZVtpXS5ibHVlXTsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGUodywgdiwgcG5nX3B0ci0+dHJhbnNfYWxwaGFbaV0sIGJhY2tfMS5ibHVlKTsKLSAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IHBuZ19wdHItPmdhbW1hX2Zyb21fMVt3XTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0ucmVkID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcGFsZXR0ZVtpXS5yZWRdOwotICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ncmVlbiA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BhbGV0dGVbaV0uZ3JlZW5dOwotICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ibHVlID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcGFsZXR0ZVtpXS5ibHVlXTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFByZXZlbnQgdGhlIHRyYW5zZm9ybWF0aW9ucyBiZWluZyBkb25lIGFnYWluLCBhbmQgbWFrZSBzdXJlCi0gICAgICAgICAgICAgKiB0aGF0IHRoZSBub3cgc3B1cmlvdXMgYWxwaGEgY2hhbm5lbCBpcyBzdHJpcHBlZCAtIHRoZSBjb2RlCi0gICAgICAgICAgICAgKiBoYXMganVzdCByZWR1Y2VkIGJhY2tncm91bmQgY29tcG9zaXRpb24gYW5kIGdhbW1hIGNvcnJlY3Rpb24KLSAgICAgICAgICAgICAqIHRvIGEgc2ltcGxlIGFscGhhIGNoYW5uZWwgc3RyaXAuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmPSB+UE5HX0JBQ0tHUk9VTkQ7Ci0gICAgICAgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJj0gflBOR19HQU1NQTsKLSAgICAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX1NUUklQX0FMUEhBOwotICAgICAgICAgfQotICAgICAgICAgLyogaWYgKHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWFfdHlwZSE9UE5HX0JBQ0tHUk9VTkRfR0FNTUFfVU5LTk9XTikgKi8KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIC8qIGNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAqLwotICAgICAgICAgewotICAgICAgICAgICAgZG91YmxlIG0gPSAoZG91YmxlKSgoKHBuZ191aW50XzMyKTEgPDwgcG5nX3B0ci0+Yml0X2RlcHRoKSAtIDEpOwotICAgICAgICAgICAgZG91YmxlIGcgPSAxLjA7Ci0gICAgICAgICAgICBkb3VibGUgZ3MgPSAxLjA7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAocG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYV90eXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU46Ci0gICAgICAgICAgICAgICAgICBnID0gKHBuZ19wdHItPnNjcmVlbl9nYW1tYSk7Ci0gICAgICAgICAgICAgICAgICBncyA9IDEuMDsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEU6Ci0gICAgICAgICAgICAgICAgICBnID0gMS4wIC8gKHBuZ19wdHItPmdhbW1hKTsKLSAgICAgICAgICAgICAgICAgIGdzID0gMS4wIC8gKHBuZ19wdHItPmdhbW1hICogcG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX1VOSVFVRToKLSAgICAgICAgICAgICAgICAgIGcgPSAxLjAgLyAocG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYSk7Ci0gICAgICAgICAgICAgICAgICBncyA9IDEuMCAvIChwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hICoKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnNjcmVlbl9nYW1tYSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW52YWxpZCBiYWNrZ3JvdW5kIGdhbW1hIHR5cGUiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZF8xLmdyYXkgPSAocG5nX3VpbnRfMTYpKHBvdygKLSAgICAgICAgICAgICAgIChkb3VibGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5IC8gbSwgZykgKiBtICsgLjUpOwotICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5ID0gKHBuZ191aW50XzE2KShwb3coCi0gICAgICAgICAgICAgICAoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JheSAvIG0sIGdzKSAqIG0gKyAuNSk7Ci0KLSAgICAgICAgICAgIGlmICgocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgIT0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbikgfHwKLSAgICAgICAgICAgICAgICAocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgIT0gcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlKSB8fAotICAgICAgICAgICAgICAgIChwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCAhPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLyogUkdCIG9yIFJHQkEgd2l0aCBjb2xvciBiYWNrZ3JvdW5kICovCi0gICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kXzEucmVkID0gKHBuZ191aW50XzE2KShwb3coCi0gICAgICAgICAgICAgICAgICAoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQucmVkIC8gbSwgZykgKiBtICsgLjUpOwotICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZF8xLmdyZWVuID0gKHBuZ191aW50XzE2KShwb3coCi0gICAgICAgICAgICAgICAgICAoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4gLyBtLCBnKSAqIG0gKyAuNSk7Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kXzEuYmx1ZSA9IChwbmdfdWludF8xNikocG93KAotICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgLyBtLCBnKSAqIG0gKyAuNSk7Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA9IChwbmdfdWludF8xNikocG93KAotICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCAvIG0sIGdzKSAqIG0gKyAuNSk7Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuID0gKHBuZ191aW50XzE2KShwb3coCi0gICAgICAgICAgICAgICAgICAoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4gLyBtLCBncykgKiBtICsgLjUpOwotICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlID0gKHBuZ191aW50XzE2KShwb3coCi0gICAgICAgICAgICAgICAgICAoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSAvIG0sIGdzKSAqIG0gKyAuNSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBHUkFZLCBHUkFZIEFMUEhBLCBSR0IsIG9yIFJHQkEgd2l0aCBncmF5IGJhY2tncm91bmQgKi8KLSAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmRfMS5yZWQgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kXzEuZ3JlZW4KLSAgICAgICAgICAgICAgICAgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kXzEuYmx1ZSA9IHBuZ19wdHItPmJhY2tncm91bmRfMS5ncmF5OwotICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuCi0gICAgICAgICAgICAgICAgID0gcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlID0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5OwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgLyogVHJhbnNmb3JtYXRpb24gZG9lcyBub3QgaW5jbHVkZSBQTkdfQkFDS0dST1VORCAqLwotI2VuZGlmIC8qIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEICovCi0gICAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgewotICAgICAgICAgcG5nX2NvbG9ycCBwYWxldHRlID0gcG5nX3B0ci0+cGFsZXR0ZTsKLSAgICAgICAgIGludCBudW1fcGFsZXR0ZSA9IHBuZ19wdHItPm51bV9wYWxldHRlOwotICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFsZXR0ZTsgaSsrKQotICAgICAgICAgewotICAgICAgICAgICAgcGFsZXR0ZVtpXS5yZWQgPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLnJlZF07Ci0gICAgICAgICAgICBwYWxldHRlW2ldLmdyZWVuID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcGFsZXR0ZVtpXS5ncmVlbl07Ci0gICAgICAgICAgICBwYWxldHRlW2ldLmJsdWUgPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLmJsdWVdOwotICAgICAgICAgfQotCi0gICAgICAgICAvKiBEb25lIHRoZSBnYW1tYSBjb3JyZWN0aW9uLiAqLwotICAgICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfR0FNTUE7Ci0gICAgICB9Ci0gICB9Ci0jaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKLSAgIGVsc2UKLSNlbmRpZgotI2VuZGlmIC8qIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCAmJiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEICovCi0jaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKLSAgIC8qIE5vIEdBTU1BIHRyYW5zZm9ybWF0aW9uICovCi0gICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CQUNLR1JPVU5EKSAmJgotICAgICAgIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpKQotICAgewotICAgICAgaW50IGk7Ci0gICAgICBpbnQgaXN0b3AgPSAoaW50KXBuZ19wdHItPm51bV90cmFuczsKLSAgICAgIHBuZ19jb2xvciBiYWNrOwotICAgICAgcG5nX2NvbG9ycCBwYWxldHRlID0gcG5nX3B0ci0+cGFsZXR0ZTsKLQotICAgICAgYmFjay5yZWQgICA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZDsKLSAgICAgIGJhY2suZ3JlZW4gPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbjsKLSAgICAgIGJhY2suYmx1ZSAgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIGlmIChwbmdfcHRyLT50cmFuc19hbHBoYVtpXSA9PSAwKQotICAgICAgICAgewotICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IGJhY2s7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlIGlmIChwbmdfcHRyLT50cmFuc19hbHBoYVtpXSAhPSAweGZmKQotICAgICAgICAgewotICAgICAgICAgICAgLyogVGhlIHBuZ19jb21wb3NpdGUoKSBtYWNybyBpcyBkZWZpbmVkIGluIHBuZy5oICovCi0gICAgICAgICAgICBwbmdfY29tcG9zaXRlKHBhbGV0dGVbaV0ucmVkLCBwYWxldHRlW2ldLnJlZCwKLSAgICAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zX2FscGhhW2ldLCBiYWNrLnJlZCk7Ci0gICAgICAgICAgICBwbmdfY29tcG9zaXRlKHBhbGV0dGVbaV0uZ3JlZW4sIHBhbGV0dGVbaV0uZ3JlZW4sCi0gICAgICAgICAgICAgICBwbmdfcHRyLT50cmFuc19hbHBoYVtpXSwgYmFjay5ncmVlbik7Ci0gICAgICAgICAgICBwbmdfY29tcG9zaXRlKHBhbGV0dGVbaV0uYmx1ZSwgcGFsZXR0ZVtpXS5ibHVlLAotICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNfYWxwaGFbaV0sIGJhY2suYmx1ZSk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIEhhbmRsZWQgYWxwaGEsIHN0aWxsIG5lZWQgdG8gc3RyaXAgdGhlIGNoYW5uZWwuICovCi0gICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJj0gflBOR19CQUNLR1JPVU5EOwotICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfU1RSSVBfQUxQSEE7Ci0gICB9Ci0jZW5kaWYgLyogUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRAotICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU0hJRlQpICYmCi0gICAgICAhKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkQpICYmCi0gICAgICAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKSkKLSAgIHsKLSAgICAgIHBuZ191aW50XzE2IGk7Ci0gICAgICBwbmdfdWludF8xNiBpc3RvcCA9IHBuZ19wdHItPm51bV9wYWxldHRlOwotICAgICAgaW50IHNyID0gOCAtIHBuZ19wdHItPnNpZ19iaXQucmVkOwotICAgICAgaW50IHNnID0gOCAtIHBuZ19wdHItPnNpZ19iaXQuZ3JlZW47Ci0gICAgICBpbnQgc2IgPSA4IC0gcG5nX3B0ci0+c2lnX2JpdC5ibHVlOwotCi0gICAgICBpZiAoc3IgPCAwIHx8IHNyID4gOCkKLSAgICAgICAgIHNyID0gMDsKLSAgICAgIGlmIChzZyA8IDAgfHwgc2cgPiA4KQotICAgICAgICAgc2cgPSAwOwotICAgICAgaWYgKHNiIDwgMCB8fCBzYiA+IDgpCi0gICAgICAgICBzYiA9IDA7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVbaV0ucmVkID4+PSBzcjsKLSAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVbaV0uZ3JlZW4gPj49IHNnOwotICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZVtpXS5ibHVlID4+PSBzYjsKLSAgICAgIH0KLQotICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfU0hJRlQ7Ci0gICB9Ci0jZW5kaWYgIC8qIFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCAqLwotIH0KLSNpZiAhZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCkgXAotICYmICFkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHIpCi0gICAgICByZXR1cm47Ci0jZW5kaWYKLX0KLQotLyogTW9kaWZ5IHRoZSBpbmZvIHN0cnVjdHVyZSB0byByZWZsZWN0IHRoZSB0cmFuc2Zvcm1hdGlvbnMuICBUaGUKLSAqIGluZm8gc2hvdWxkIGJlIHVwZGF0ZWQgc28gYSBQTkcgZmlsZSBjb3VsZCBiZSB3cml0dGVuIHdpdGggaXQsCi0gKiBhc3N1bWluZyB0aGUgdHJhbnNmb3JtYXRpb25zIHJlc3VsdCBpbiB2YWxpZCBQTkcgZGF0YS4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcmVhZF90cmFuc2Zvcm1faW5mbyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19yZWFkX3RyYW5zZm9ybV9pbmZvIik7Ci0KLSNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORCkKLSAgIHsKLSAgICAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgewotICAgICAgICAgaWYgKHBuZ19wdHItPm51bV90cmFucykKLSAgICAgICAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgaW5mb19wdHItPmNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0I7Ci0gICAgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoID0gODsKLSAgICAgICAgIGluZm9fcHRyLT5udW1fdHJhbnMgPSAwOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgaWYgKHBuZ19wdHItPm51bV90cmFucykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EX3RSTlMpCi0gICAgICAgICAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlIHw9IFBOR19DT0xPUl9NQVNLX0FMUEhBOwotICAgICAgICAgfQotICAgICAgICAgaWYgKGluZm9fcHRyLT5iaXRfZGVwdGggPCA4KQotICAgICAgICAgICAgaW5mb19wdHItPmJpdF9kZXB0aCA9IDg7Ci0gICAgICAgICBpbmZvX3B0ci0+bnVtX3RyYW5zID0gMDsKLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkFDS0dST1VORCkKLSAgIHsKLSAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlICY9IH5QTkdfQ09MT1JfTUFTS19BTFBIQTsKLSAgICAgIGluZm9fcHRyLT5udW1fdHJhbnMgPSAwOwotICAgICAgaW5mb19wdHItPmJhY2tncm91bmQgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kOwotICAgfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfR0FNTUEpCi0gICB7Ci0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgICAgaW5mb19wdHItPmdhbW1hID0gcG5nX3B0ci0+Z2FtbWE7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi0gICAgICBpbmZvX3B0ci0+aW50X2dhbW1hID0gcG5nX3B0ci0+aW50X2dhbW1hOwotI2VuZGlmCi0gICB9Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEXzE2X1RPXzhfU1VQUE9SVEVECi0gICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR18xNl9UT184KSAmJiAoaW5mb19wdHItPmJpdF9kZXB0aCA9PSAxNikpCi0gICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoID0gODsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0dSQVlfVE9fUkdCKQotICAgICAgaW5mb19wdHItPmNvbG9yX3R5cGUgfD0gUE5HX0NPTE9SX01BU0tfQ09MT1I7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19SR0JfVE9fR1JBWSkKLSAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlICY9IH5QTkdfQ09MT1JfTUFTS19DT0xPUjsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfUVVBTlRJWkVfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1FVQU5USVpFKQotICAgewotICAgICAgaWYgKCgoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKSB8fAotICAgICAgICAgIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpKSAmJgotICAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVfbG9va3VwICYmIGluZm9fcHRyLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgIHsKLSAgICAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURTsKLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfUEFDS19TVVBQT1JURUQKLSAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0spICYmIChpbmZvX3B0ci0+Yml0X2RlcHRoIDwgOCkpCi0gICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoID0gODsKLSNlbmRpZgotCi0gICBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgIGluZm9fcHRyLT5jaGFubmVscyA9IDE7Ci0gICBlbHNlIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQotICAgICAgaW5mb19wdHItPmNoYW5uZWxzID0gMzsKLSAgIGVsc2UKLSAgICAgIGluZm9fcHRyLT5jaGFubmVscyA9IDE7Ci0KLSNpZmRlZiBQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQKLSAgIGlmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1NUUklQX0FMUEhBKQotICAgICAgaW5mb19wdHItPmNvbG9yX3R5cGUgJj0gflBOR19DT0xPUl9NQVNLX0FMUEhBOwotI2VuZGlmCi0KLSAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQotICAgICAgaW5mb19wdHItPmNoYW5uZWxzKys7Ci0KLSNpZmRlZiBQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVECi0gICAvKiBTVFJJUF9BTFBIQSBhbmQgRklMTEVSIGFsbG93ZWQ6ICBNQVNLX0FMUEhBIGJpdCBzdHJpcHBlZCBhYm92ZSAqLwotICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRklMTEVSKSAmJgotICAgICAgICgoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKSB8fAotICAgICAgIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKSkpCi0gICB7Ci0gICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMrKzsKLSAgICAgIC8qIElmIGFkZGluZyBhIHRydWUgYWxwaGEgY2hhbm5lbCBub3QganVzdCBmaWxsZXIgKi8KLSAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQUREX0FMUEhBKQotICAgICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSB8PSBQTkdfQ09MT1JfTUFTS19BTFBIQTsKLSAgIH0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfVVNFUl9UUkFOU0ZPUk1fUFRSX1NVUFBPUlRFRCkgJiYgXAotZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1VTRVJfVFJBTlNGT1JNKQotICAgICB7Ci0gICAgICAgaWYgKGluZm9fcHRyLT5iaXRfZGVwdGggPCBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9kZXB0aCkKLSAgICAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGggPSBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9kZXB0aDsKLSAgICAgICBpZiAoaW5mb19wdHItPmNoYW5uZWxzIDwgcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fY2hhbm5lbHMpCi0gICAgICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMgPSBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9jaGFubmVsczsKLSAgICAgfQotI2VuZGlmCi0KLSAgIGluZm9fcHRyLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkoaW5mb19wdHItPmNoYW5uZWxzICoKLSAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGgpOwotCi0gICBpbmZvX3B0ci0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMoaW5mb19wdHItPnBpeGVsX2RlcHRoLCBpbmZvX3B0ci0+d2lkdGgpOwotCi0jaWZuZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKLSAgIGlmIChwbmdfcHRyKQotICAgICAgcmV0dXJuOwotI2VuZGlmCi19Ci0KLS8qIFRyYW5zZm9ybSB0aGUgcm93LiAgVGhlIG9yZGVyIG9mIHRyYW5zZm9ybWF0aW9ucyBpcyBzaWduaWZpY2FudCwKLSAqIGFuZCBpcyB2ZXJ5IHRvdWNoeS4gIElmIHlvdSBhZGQgYSB0cmFuc2Zvcm1hdGlvbiwgdGFrZSBjYXJlIHRvCi0gKiBkZWNpZGUgaG93IGl0IGZpdHMgaW4gd2l0aCB0aGUgb3RoZXIgdHJhbnNmb3JtYXRpb25zIGhlcmUuCi0gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RvX3JlYWRfdHJhbnNmb3JtYXRpb25zKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucyIpOwotCi0gICBpZiAocG5nX3B0ci0+cm93X2J1ZiA9PSBOVUxMKQotICAgewotI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQKLSAgICAgIGNoYXIgbXNnWzUwXTsKLQotICAgICAgcG5nX3NucHJpbnRmMihtc2csIDUwLAotICAgICAgICAgIk5VTEwgcm93IGJ1ZmZlciBmb3Igcm93ICVsZCwgcGFzcyAlZCIsIChsb25nKXBuZ19wdHItPnJvd19udW1iZXIsCi0gICAgICAgICBwbmdfcHRyLT5wYXNzKTsKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBtc2cpOwotI2Vsc2UKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTlVMTCByb3cgYnVmZmVyIik7Ci0jZW5kaWYKLSAgIH0KLSNpZmRlZiBQTkdfV0FSTl9VTklOSVRJQUxJWkVEX1JPVwotICAgaWYgKCEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19ST1dfSU5JVCkpCi0gICAgICAvKiBBcHBsaWNhdGlvbiBoYXMgZmFpbGVkIHRvIGNhbGwgZWl0aGVyIHBuZ19yZWFkX3N0YXJ0X2ltYWdlKCkKLSAgICAgICAqIG9yIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgYWZ0ZXIgc2V0dGluZyB0cmFuc2Zvcm1zIHRoYXQgZXhwYW5kCi0gICAgICAgKiBwaXhlbHMuICBUaGlzIGNoZWNrIGFkZGVkIHRvIGxpYnBuZy0xLjIuMTkKLSAgICAgICAqLwotI2lmIChQTkdfV0FSTl9VTklOSVRJQUxJWkVEX1JPVz09MSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVW5pbml0aWFsaXplZCByb3ciKTsKLSNlbHNlCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5pbml0aWFsaXplZCByb3ciKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORCkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5yb3dfaW5mby5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICB7Ci0gICAgICAgICBwbmdfZG9fZXhwYW5kX3BhbGV0dGUoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxLAotICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZSwgcG5nX3B0ci0+dHJhbnNfYWxwaGEsIHBuZ19wdHItPm51bV90cmFucyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpZiAocG5nX3B0ci0+bnVtX3RyYW5zICYmCi0gICAgICAgICAgICAgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkRfdFJOUykpCi0gICAgICAgICAgICBwbmdfZG9fZXhwYW5kKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKLSAgICAgICAgICAgICAgICYocG5nX3B0ci0+dHJhbnNfY29sb3IpKTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBuZ19kb19leHBhbmQoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxLAotICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX1NUUklQX0FMUEhBX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfU1RSSVBfQUxQSEEpCi0gICAgICBwbmdfZG9fc3RyaXBfZmlsbGVyKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKLSAgICAgICAgIFBOR19GTEFHX0ZJTExFUl9BRlRFUiB8IChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1NUUklQX0FMUEhBKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19SR0JfVE9fR1JBWSkKLSAgIHsKLSAgICAgIGludCByZ2JfZXJyb3IgPQotICAgICAgICAgcG5nX2RvX3JnYl90b19ncmF5KHBuZ19wdHIsICYocG5nX3B0ci0+cm93X2luZm8pLAotICAgICAgICAgICAgIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSAgICAgIGlmIChyZ2JfZXJyb3IpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9zdGF0dXM9MTsKLSAgICAgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1JHQl9UT19HUkFZKSA9PQotICAgICAgICAgICAgIFBOR19SR0JfVE9fR1JBWV9XQVJOKQotICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgInBuZ19kb19yZ2JfdG9fZ3JheSBmb3VuZCBub25ncmF5IHBpeGVsIik7Ci0gICAgICAgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19SR0JfVE9fR1JBWSkgPT0KLSAgICAgICAgICAgICBQTkdfUkdCX1RPX0dSQVlfRVJSKQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJwbmdfZG9fcmdiX3RvX2dyYXkgZm91bmQgbm9uZ3JheSBwaXhlbCIpOwotICAgICAgfQotICAgfQotI2VuZGlmCi0KLS8qIEZyb20gQW5kcmVhcyBEaWxnZXIgZS1tYWlsIHRvIHBuZy1pbXBsZW1lbnQsIDI2IE1hcmNoIDE5OTg6Ci0gKgotICogICBJbiBtb3N0IGNhc2VzLCB0aGUgInNpbXBsZSB0cmFuc3BhcmVuY3kiIHNob3VsZCBiZSBkb25lIHByaW9yIHRvIGRvaW5nCi0gKiAgIGdyYXktdG8tUkdCLCBvciB5b3Ugd2lsbCBoYXZlIHRvIHRlc3QgM3ggYXMgbWFueSBieXRlcyB0byBjaGVjayBpZiBhCi0gKiAgIHBpeGVsIGlzIHRyYW5zcGFyZW50LiAgWW91IHdvdWxkIGFsc28gbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUKLSAqICAgdHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uIGlzIHVwZ3JhZGVkIHRvIFJHQi4KLSAqCi0gKiAgIFRvIHN1bW1hcml6ZSwgdGhlIGN1cnJlbnQgZmxvdyBpczoKLSAqICAgLSBHcmF5ICsgc2ltcGxlIHRyYW5zcGFyZW5jeSAtPiBjb21wYXJlIDEgb3IgMiBncmF5IGJ5dGVzIGFuZCBjb21wb3NpdGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGJhY2tncm91bmQgImluIHBsYWNlIiBpZiB0cmFuc3BhcmVudCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0IHRvIFJHQiBpZiBuZWNlc3NhcnkKLSAqICAgLSBHcmF5ICsgYWxwaGEgLT4gY29tcG9zaXRlIHdpdGggZ3JheSBiYWNrZ3JvdW5kIGFuZCByZW1vdmUgYWxwaGEgYnl0ZXMsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydCB0byBSR0IgaWYgbmVjZXNzYXJ5Ci0gKgotICogICBUbyBzdXBwb3J0IFJHQiBiYWNrZ3JvdW5kcyBmb3IgZ3JheSBpbWFnZXMgd2UgbmVlZDoKLSAqICAgLSBHcmF5ICsgc2ltcGxlIHRyYW5zcGFyZW5jeSAtPiBjb252ZXJ0IHRvIFJHQiArIHNpbXBsZSB0cmFuc3BhcmVuY3ksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZSAzIG9yIDYgYnl0ZXMgYW5kIGNvbXBvc2l0ZSB3aXRoCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCAiaW4gcGxhY2UiIGlmIHRyYW5zcGFyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDN4IGNvbXBhcmUvcGl4ZWwgY29tcGFyZWQgdG8gZG9pbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUgd2l0aCBncmF5IGJrZ3JuZCkKLSAqICAgLSBHcmF5ICsgYWxwaGEgLT4gY29udmVydCB0byBSR0IgKyBhbHBoYSwgY29tcG9zaXRlIHdpdGggYmFja2dyb3VuZCBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUgYWxwaGEgYnl0ZXMgKDN4IGZsb2F0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucy9waXhlbCBjb21wYXJlZCB3aXRoIGNvbXBvc2l0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGdyYXkgYmFja2dyb3VuZCkKLSAqCi0gKiAgR3JlZydzIGNoYW5nZSB3aWxsIGRvIHRoaXMuICBUaGUgcmVhc29uIGl0IHdhc24ndCBkb25lIGJlZm9yZSBpcyBmb3IKLSAqICBwZXJmb3JtYW5jZSwgYXMgdGhpcyBpbmNyZWFzZXMgdGhlIHBlci1waXhlbCBvcGVyYXRpb25zLiAgSWYgd2Ugd291bGQgY2hlY2sKLSAqICBpbiBhZHZhbmNlIGlmIHRoZSBiYWNrZ3JvdW5kIHdhcyBncmF5IG9yIFJHQiwgYW5kIHBvc2l0aW9uIHRoZSBncmF5LXRvLVJHQgotICogIHRyYW5zZm9ybSBhcHByb3ByaWF0ZWx5LCB0aGVuIGl0IHdvdWxkIHNhdmUgYSBsb3Qgb2Ygd29yay90aW1lLgotICovCi0KLSNpZmRlZiBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQKLSAgIC8qIElmIGdyYXkgLT4gUkdCLCBkbyBzbyBub3cgb25seSBpZiBiYWNrZ3JvdW5kIGlzIG5vbi1ncmF5OyBlbHNlIGRvIGxhdGVyCi0gICAgKiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucwotICAgICovCi0gICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19HUkFZX1RPX1JHQikgJiYKLSAgICAgICAhKHBuZ19wdHItPm1vZGUgJiBQTkdfQkFDS0dST1VORF9JU19HUkFZKSkKLSAgICAgIHBuZ19kb19ncmF5X3RvX3JnYigmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRAotICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkFDS0dST1VORCkgJiYKLSAgICAgICgocG5nX3B0ci0+bnVtX3RyYW5zICE9IDAgKSB8fAotICAgICAgKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkpKQotICAgICAgcG5nX2RvX2JhY2tncm91bmQoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxLAotICAgICAgICAgJihwbmdfcHRyLT50cmFuc19jb2xvciksICYocG5nX3B0ci0+YmFja2dyb3VuZCkKLSNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKLSAgICAgICAgICwgJihwbmdfcHRyLT5iYWNrZ3JvdW5kXzEpLAotICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfdGFibGUsIHBuZ19wdHItPmdhbW1hX2Zyb21fMSwKLSAgICAgICAgIHBuZ19wdHItPmdhbW1hX3RvXzEsIHBuZ19wdHItPmdhbW1hXzE2X3RhYmxlLAotICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfZnJvbV8xLCBwbmdfcHRyLT5nYW1tYV8xNl90b18xLAotICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfc2hpZnQKLSNlbmRpZgotKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECi0gICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19HQU1NQSkgJiYKLSNpZmRlZiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRAotICAgICAgICEoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CQUNLR1JPVU5EKSAmJgotICAgICAgICgocG5nX3B0ci0+bnVtX3RyYW5zICE9IDApIHx8Ci0gICAgICAgKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkpKSAmJgotI2VuZGlmCi0gICAgICAgKHBuZ19wdHItPmNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkpCi0gICAgICBwbmdfZG9fZ2FtbWEoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxLAotICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3RhYmxlLCBwbmdfcHRyLT5nYW1tYV8xNl90YWJsZSwKLSAgICAgICAgICBwbmdfcHRyLT5nYW1tYV9zaGlmdCk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEXzE2X1RPXzhfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HXzE2X1RPXzgpCi0gICAgICBwbmdfZG9fY2hvcCgmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9RVUFOVElaRV9TVVBQT1JURUQKLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUVVBTlRJWkUpCi0gICB7Ci0gICAgICBwbmdfZG9fcXVhbnRpemUoKHBuZ19yb3dfaW5mb3ApJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxLAotICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZV9sb29rdXAsIHBuZ19wdHItPnF1YW50aXplX2luZGV4KTsKLSAgICAgIGlmIChwbmdfcHRyLT5yb3dfaW5mby5yb3dieXRlcyA9PSAocG5nX3VpbnRfMzIpMCkKLSAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicG5nX2RvX3F1YW50aXplIHJldHVybmVkIHJvd2J5dGVzPTAiKTsKLSAgIH0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfSU5WRVJUX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlZFUlRfTU9OTykKLSAgICAgIHBuZ19kb19pbnZlcnQoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NISUZUKQotICAgICAgcG5nX2RvX3Vuc2hpZnQoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxLAotICAgICAgICAgJihwbmdfcHRyLT5zaGlmdCkpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9QQUNLX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLKQotICAgICAgcG5nX2RvX3VucGFjaygmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9CR1JfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JHUikKLSAgICAgIHBuZ19kb19iZ3IoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0tTV0FQKQotICAgICAgcG5nX2RvX3BhY2tzd2FwKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRAotICAgLyogSWYgZ3JheSAtPiBSR0IsIGRvIHNvIG5vdyBvbmx5IGlmIHdlIGRpZCBub3QgZG8gc28gYWJvdmUgKi8KLSAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0dSQVlfVE9fUkdCKSAmJgotICAgICAgIChwbmdfcHRyLT5tb2RlICYgUE5HX0JBQ0tHUk9VTkRfSVNfR1JBWSkpCi0gICAgICBwbmdfZG9fZ3JheV90b19yZ2IoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19GSUxMRVIpCi0gICAgICBwbmdfZG9fcmVhZF9maWxsZXIoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxLAotICAgICAgICAgKHBuZ191aW50XzMyKXBuZ19wdHItPmZpbGxlciwgcG5nX3B0ci0+ZmxhZ3MpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9JTlZFUlRfQUxQSEFfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVkVSVF9BTFBIQSkKLSAgICAgIHBuZ19kb19yZWFkX2ludmVydF9hbHBoYSgmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9TV0FQX0FMUEhBX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TV0FQX0FMUEhBKQotICAgICAgcG5nX2RvX3JlYWRfc3dhcF9hbHBoYSgmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9TV0FQX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TV0FQX0JZVEVTKQotICAgICAgcG5nX2RvX3N3YXAoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1VTRVJfVFJBTlNGT1JNKQotICAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuICE9IE5VTEwpCi0gICAgICAgICAoKihwbmdfcHRyLT5yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKSkgLyogVXNlciByZWFkIHRyYW5zZm9ybSBmdW5jdGlvbiAqLwotICAgICAgICAgICAgKHBuZ19wdHIsICAgICAgICAgICAgICAgICAgICAvKiBwbmdfcHRyICovCi0gICAgICAgICAgICAgICAmKHBuZ19wdHItPnJvd19pbmZvKSwgICAgIC8qIHJvd19pbmZvOiAqLwotICAgICAgICAgICAgICAgLyogIHBuZ191aW50XzMyIHdpZHRoOyAgICAgICB3aWR0aCBvZiByb3cgKi8KLSAgICAgICAgICAgICAgIC8qICBwbmdfdWludF8zMiByb3dieXRlczsgICAgbnVtYmVyIG9mIGJ5dGVzIGluIHJvdyAqLwotICAgICAgICAgICAgICAgLyogIHBuZ19ieXRlIGNvbG9yX3R5cGU7ICAgICBjb2xvciB0eXBlIG9mIHBpeGVscyAqLwotICAgICAgICAgICAgICAgLyogIHBuZ19ieXRlIGJpdF9kZXB0aDsgICAgICBiaXQgZGVwdGggb2Ygc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgLyogIHBuZ19ieXRlIGNoYW5uZWxzOyAgICAgICBudW1iZXIgb2YgY2hhbm5lbHMgKDEtNCkgKi8KLSAgICAgICAgICAgICAgIC8qICBwbmdfYnl0ZSBwaXhlbF9kZXB0aDsgICAgYml0cyBwZXIgcGl4ZWwgKGRlcHRoKmNoYW5uZWxzKSAqLwotICAgICAgICAgICAgICAgcG5nX3B0ci0+cm93X2J1ZiArIDEpOyAgICAvKiBzdGFydCBvZiBwaXhlbCBkYXRhIGZvciByb3cgKi8KLSNpZmRlZiBQTkdfVVNFUl9UUkFOU0ZPUk1fUFRSX1NVUFBPUlRFRAotICAgICAgaWYgKHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2RlcHRoKQotICAgICAgICAgcG5nX3B0ci0+cm93X2luZm8uYml0X2RlcHRoID0gcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fZGVwdGg7Ci0gICAgICBpZiAocG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fY2hhbm5lbHMpCi0gICAgICAgICBwbmdfcHRyLT5yb3dfaW5mby5jaGFubmVscyA9IHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2NoYW5uZWxzOwotI2VuZGlmCi0gICAgICBwbmdfcHRyLT5yb3dfaW5mby5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkocG5nX3B0ci0+cm93X2luZm8uYml0X2RlcHRoICoKLSAgICAgICAgIHBuZ19wdHItPnJvd19pbmZvLmNoYW5uZWxzKTsKLSAgICAgIHBuZ19wdHItPnJvd19pbmZvLnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHBuZ19wdHItPnJvd19pbmZvLnBpeGVsX2RlcHRoLAotICAgICAgICAgcG5nX3B0ci0+cm93X2luZm8ud2lkdGgpOwotICAgfQotI2VuZGlmCi0KLX0KLQotI2lmZGVmIFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVECi0vKiBVbnBhY2sgcGl4ZWxzIG9mIDEsIDIsIG9yIDQgYml0cyBwZXIgcGl4ZWwgaW50byAxIGJ5dGUgcGVyIHBpeGVsLAotICogd2l0aG91dCBjaGFuZ2luZyB0aGUgYWN0dWFsIHZhbHVlcy4gIFRodXMsIGlmIHlvdSBoYWQgYSByb3cgd2l0aAotICogYSBiaXQgZGVwdGggb2YgMSwgeW91IHdvdWxkIGVuZCB1cCB3aXRoIGJ5dGVzIHRoYXQgb25seSBjb250YWluZWQKLSAqIHRoZSBudW1iZXJzIDAgb3IgMS4gIElmIHlvdSB3b3VsZCByYXRoZXIgdGhleSBjb250YWluIDAgYW5kIDI1NSwgdXNlCi0gKiBwbmdfZG9fc2hpZnQoKSBhZnRlciB0aGlzLgotICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb191bnBhY2socG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3VucGFjayIpOwotCi0gICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA8IDgpCi0gICB7Ci0gICAgICBwbmdfdWludF8zMiBpOwotICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoPXJvd19pbmZvLT53aWR0aDsKLQotICAgICAgc3dpdGNoIChyb3dfaW5mby0+Yml0X2RlcHRoKQotICAgICAgewotICAgICAgICAgY2FzZSAxOgotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3QpKChyb3dfd2lkdGggLSAxKSA+PiAzKTsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAtIDE7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBzaGlmdCA9IDcgLSAoaW50KSgocm93X3dpZHRoICsgNykgJiAweDA3KTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkoKCpzcCA+PiBzaGlmdCkgJiAweDAxKTsKLSAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSA3KQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOwotICAgICAgICAgICAgICAgICAgc3AtLTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHNoaWZ0Kys7Ci0KLSAgICAgICAgICAgICAgIGRwLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotICAgICAgICAgY2FzZSAyOgotICAgICAgICAgewotCi0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDIpOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHNoaWZ0ID0gKGludCkoKDMgLSAoKHJvd193aWR0aCArIDMpICYgMHgwMykpIDw8IDEpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgoKnNwID4+IHNoaWZ0KSAmIDB4MDMpOwotICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDYpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICBzcC0tOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgc2hpZnQgKz0gMjsKLQotICAgICAgICAgICAgICAgZHAtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotCi0gICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDEpOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHNoaWZ0ID0gKGludCkoKDEgLSAoKHJvd193aWR0aCArIDEpICYgMHgwMSkpIDw8IDIpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgoKnNwID4+IHNoaWZ0KSAmIDB4MGYpOwotICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDQpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICBzcC0tOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgc2hpZnQgPSA0OwotCi0gICAgICAgICAgICAgICBkcC0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGggPSA4OwotICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKSg4ICogcm93X2luZm8tPmNoYW5uZWxzKTsKLSAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIHJvd19pbmZvLT5jaGFubmVsczsKLSAgIH0KLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVECi0vKiBSZXZlcnNlIHRoZSBlZmZlY3RzIG9mIHBuZ19kb19zaGlmdC4gIFRoaXMgcm91dGluZSBtZXJlbHkgc2hpZnRzIHRoZQotICogcGl4ZWxzIGJhY2sgdG8gdGhlaXIgc2lnbmlmaWNhbnQgYml0cyB2YWx1ZXMuICBUaHVzLCBpZiB5b3UgaGF2ZQotICogYSByb3cgb2YgYml0IGRlcHRoIDgsIGJ1dCBvbmx5IDUgYXJlIHNpZ25pZmljYW50LCB0aGlzIHdpbGwgc2hpZnQKLSAqIHRoZSB2YWx1ZXMgYmFjayB0byAwIHRocm91Z2ggMzEuCi0gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RvX3Vuc2hpZnQocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX2NvbG9yXzhwIHNpZ19iaXRzKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fdW5zaGlmdCIpOwotCi0gICBpZiAoCi0gICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgIHsKLSAgICAgIGludCBzaGlmdFs0XTsKLSAgICAgIGludCBjaGFubmVscyA9IDA7Ci0gICAgICBpbnQgYzsKLSAgICAgIHBuZ191aW50XzE2IHZhbHVlID0gMDsKLSAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKLQotICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCi0gICAgICB7Ci0gICAgICAgICBzaGlmdFtjaGFubmVscysrXSA9IHJvd19pbmZvLT5iaXRfZGVwdGggLSBzaWdfYml0cy0+cmVkOwotICAgICAgICAgc2hpZnRbY2hhbm5lbHMrK10gPSByb3dfaW5mby0+Yml0X2RlcHRoIC0gc2lnX2JpdHMtPmdyZWVuOwotICAgICAgICAgc2hpZnRbY2hhbm5lbHMrK10gPSByb3dfaW5mby0+Yml0X2RlcHRoIC0gc2lnX2JpdHMtPmJsdWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBzaGlmdFtjaGFubmVscysrXSA9IHJvd19pbmZvLT5iaXRfZGVwdGggLSBzaWdfYml0cy0+Z3JheTsKLSAgICAgIH0KLSAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQotICAgICAgewotICAgICAgICAgc2hpZnRbY2hhbm5lbHMrK10gPSByb3dfaW5mby0+Yml0X2RlcHRoIC0gc2lnX2JpdHMtPmFscGhhOwotICAgICAgfQotCi0gICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykKLSAgICAgIHsKLSAgICAgICAgIGlmIChzaGlmdFtjXSA8PSAwKQotICAgICAgICAgICAgc2hpZnRbY10gPSAwOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgdmFsdWUgPSAxOwotICAgICAgfQotCi0gICAgICBpZiAoIXZhbHVlKQotICAgICAgICAgcmV0dXJuOwotCi0gICAgICBzd2l0Y2ggKHJvd19pbmZvLT5iaXRfZGVwdGgpCi0gICAgICB7Ci0gICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7IAotCi0gICAgICAgICBjYXNlIDI6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgYnA7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaXN0b3AgPSByb3dfaW5mby0+cm93Ynl0ZXM7Ci0KLSAgICAgICAgICAgIGZvciAoYnAgPSByb3csIGkgPSAwOyBpIDwgaXN0b3A7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICpicCA+Pj0gMTsKLSAgICAgICAgICAgICAgICpicCsrICY9IDB4NTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotICAgICAgICAgY2FzZSA0OgotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIGJwID0gcm93OwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzOwotICAgICAgICAgICAgcG5nX2J5dGUgbWFzayA9IChwbmdfYnl0ZSkoKCgoaW50KTB4ZjAgPj4gc2hpZnRbMF0pICYgKGludCkweGYwKSB8Ci0gICAgICAgICAgICAgICAocG5nX2J5dGUpKChpbnQpMHhmID4+IHNoaWZ0WzBdKSk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgKmJwID4+PSBzaGlmdFswXTsKLSAgICAgICAgICAgICAgICpicCsrICY9IG1hc2s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotICAgICAgICAgY2FzZSA4OgotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIGJwID0gcm93OwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X3dpZHRoICogY2hhbm5lbHM7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgKmJwKysgPj49IHNoaWZ0W2klY2hhbm5lbHNdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgYnAgPSByb3c7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaXN0b3AgPSBjaGFubmVscyAqIHJvd193aWR0aDsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlzdG9wOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB2YWx1ZSA9IChwbmdfdWludF8xNikoKCpicCA8PCA4KSArICooYnAgKyAxKSk7Ci0gICAgICAgICAgICAgICB2YWx1ZSA+Pj0gc2hpZnRbaSVjaGFubmVsc107Ci0gICAgICAgICAgICAgICAqYnArKyA9IChwbmdfYnl0ZSkodmFsdWUgPj4gOCk7Ci0gICAgICAgICAgICAgICAqYnArKyA9IChwbmdfYnl0ZSkodmFsdWUgJiAweGZmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF8xNl9UT184X1NVUFBPUlRFRAotLyogQ2hvcCByb3dzIG9mIGJpdCBkZXB0aCAxNiBkb3duIHRvIDggKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RvX2Nob3AocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX2Nob3AiKTsKLQotICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCi0gICB7Ci0gICAgICBwbmdfYnl0ZXAgc3AgPSByb3c7Ci0gICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7Ci0gICAgICBwbmdfdWludF8zMiBpOwotICAgICAgcG5nX3VpbnRfMzIgaXN0b3AgPSByb3dfaW5mby0+d2lkdGggKiByb3dfaW5mby0+Y2hhbm5lbHM7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGk8aXN0b3A7IGkrKywgc3AgKz0gMiwgZHArKykKLSAgICAgIHsKLSNpZmRlZiBQTkdfUkVBRF8xNl9UT184X0FDQ1VSQVRFX1NDQUxFX1NVUFBPUlRFRAotICAgICAgICAgLyogVGhpcyBkb2VzIGEgbW9yZSBhY2N1cmF0ZSBzY2FsaW5nIG9mIHRoZSAxNi1iaXQgY29sb3IKLSAgICAgICAgICAqIHZhbHVlLCByYXRoZXIgdGhhbiBhIHNpbXBsZSBsb3ctYnl0ZSB0cnVuY2F0aW9uLgotICAgICAgICAgICoKLSAgICAgICAgICAqIFByaW9yIHRvIGxpYnBuZy0xLjQuOCBhbmQgMS41LjQsIHRoZSBjYWxjdWxhdGlvbiBoZXJlIHdhcwotICAgICAgICAgICogaW5jb3JyZWN0LCBzbyBpZiB5b3UgdXNlZCBBQ0NVUkFURV9TQ0FMRSB5b3Ugd2lsbCBub3cgc2VlCi0gICAgICAgICAgKiBhIHNsaWdodGx5IGRpZmZlcmVudCByZXN1bHQuICBJbiBsaWJwbmctMS41LjQgYW5kCi0gICAgICAgICAgKiBsYXRlciB5b3Ugd2lsbCBuZWVkIHRvIHVzZSB0aGUgbmV3IHBuZ19zZXRfc2NhbGVfMTZfdG9fOCgpCi0gICAgICAgICAgKiBBUEkgdG8gb2J0YWluIGFjY3VyYXRlIDE2LXRvLTggc2NhbGluZy4KLSAgICAgICAgICAqLwotICAgICAgICAgcG5nX2ludF8zMiB0bXAgPSAqc3A7IC8qIG11c3QgYmUgc2lnbmVkISAqLwotICAgICAgICAgdG1wICs9ICgoKGludClzcFsxXSAtIHRtcCArIDEyOCkgKiA2NTUzNSkgPj4gMjQ7Ci0gICAgICAgICAqZHAgPSAocG5nX2J5dGUpdG1wOwotI2Vsc2UKLSAgICAgICAvKiBTaW1wbHkgZGlzY2FyZCB0aGUgbG93IG9yZGVyIGJ5dGUgKi8KLSAgICAgICAgICpkcCA9ICpzcDsKLSNlbmRpZgotICAgICAgfQotICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9IDg7Ci0gICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKDggKiByb3dfaW5mby0+Y2hhbm5lbHMpOwotICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X2luZm8tPndpZHRoICogcm93X2luZm8tPmNoYW5uZWxzOwotICAgfQotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9TV0FQX0FMUEhBX1NVUFBPUlRFRAotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9fcmVhZF9zd2FwX2FscGhhKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19yZWFkX3N3YXBfYWxwaGEiKTsKLQotICAgewotICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOwotICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKLSAgICAgIHsKLSAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBSR0JBIHRvIEFSR0IgKi8KLSAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXM7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcDsKLSAgICAgICAgICAgIHBuZ19ieXRlIHNhdmU7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzYXZlID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSBzYXZlOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIFJSR0dCQkFBIHRvIEFBUlJHR0JCICovCi0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXM7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcDsKLSAgICAgICAgICAgIHBuZ19ieXRlIHNhdmVbMl07Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzYXZlWzBdID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgIHNhdmVbMV0gPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9IHNhdmVbMF07Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gc2F2ZVsxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgICB7Ci0gICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gR0EgdG8gQUcgKi8KLSAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXM7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcDsKLSAgICAgICAgICAgIHBuZ19ieXRlIHNhdmU7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzYXZlID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9IHNhdmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gR0dBQSB0byBBQUdHICovCi0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXM7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcDsKLSAgICAgICAgICAgIHBuZ19ieXRlIHNhdmVbMl07Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzYXZlWzBdID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgIHNhdmVbMV0gPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSBzYXZlWzBdOwotICAgICAgICAgICAgICAgKigtLWRwKSA9IHNhdmVbMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RvX3JlYWRfaW52ZXJ0X2FscGhhKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19yZWFkX2ludmVydF9hbHBoYSIpOwotCi0gICB7Ci0gICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0gICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgewotICAgICAgICAgLyogVGhpcyBpbnZlcnRzIHRoZSBhbHBoYSBjaGFubmVsIGluIFJHQkEgKi8KLSAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXM7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcDsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAocG5nX2J5dGUpKDI1NSAtICooLS1zcCkpOwotCi0vKiAgICAgICAgICAgICBUaGlzIGRvZXMgbm90aGluZzoKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgIFdlIGNhbiByZXBsYWNlIGl0IHdpdGg6Ci0qLwotICAgICAgICAgICAgICAgc3AtPTM7Ci0gICAgICAgICAgICAgICBkcD1zcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIC8qIFRoaXMgaW52ZXJ0cyB0aGUgYWxwaGEgY2hhbm5lbCBpbiBSUkdHQkJBQSAqLwotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3A7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKHBuZ19ieXRlKSgyNTUgLSAqKC0tc3ApKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAocG5nX2J5dGUpKDI1NSAtICooLS1zcCkpOwotCi0vKiAgICAgICAgICAgICBUaGlzIGRvZXMgbm90aGluZzoKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgIFdlIGNhbiByZXBsYWNlIGl0IHdpdGg6Ci0qLwotICAgICAgICAgICAgICAgc3AtPTY7Ci0gICAgICAgICAgICAgICBkcD1zcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgICB7Ci0gICAgICAgICAvKiBUaGlzIGludmVydHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gR0EgKi8KLSAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXM7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcDsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAocG5nX2J5dGUpKDI1NSAtICooLS1zcCkpOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICAvKiBUaGlzIGludmVydHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gR0dBQSAqLwotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwICA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgKigtLWRwKSA9IChwbmdfYnl0ZSkoMjU1IC0gKigtLXNwKSk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKHBuZ19ieXRlKSgyNTUgLSAqKC0tc3ApKTsKLS8qCi0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotKi8KLSAgICAgICAgICAgICAgIHNwLT0yOwotICAgICAgICAgICAgICAgZHA9c3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQKLS8qIEFkZCBmaWxsZXIgY2hhbm5lbCBpZiB3ZSBoYXZlIFJHQiBjb2xvciAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9fcmVhZF9maWxsZXIocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKLSAgIHBuZ191aW50XzMyIGZpbGxlciwgcG5nX3VpbnRfMzIgZmxhZ3MpCi17Ci0gICBwbmdfdWludF8zMiBpOwotICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOwotCi0gICBwbmdfYnl0ZSBoaV9maWxsZXIgPSAocG5nX2J5dGUpKChmaWxsZXI+PjgpICYgMHhmZik7Ci0gICBwbmdfYnl0ZSBsb19maWxsZXIgPSAocG5nX2J5dGUpKGZpbGxlciAmIDB4ZmYpOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19yZWFkX2ZpbGxlciIpOwotCi0gICBpZiAoCi0gICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKLSAgIHsKLSAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICB7Ci0gICAgICAgICAvKiBUaGlzIGNoYW5nZXMgdGhlIGRhdGEgZnJvbSBHIHRvIEdYICovCi0gICAgICAgICBpZiAoZmxhZ3MgJiBQTkdfRkxBR19GSUxMRVJfQUZURVIpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGg7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSAgc3AgKyAocG5nX3NpemVfdClyb3dfd2lkdGg7Ci0gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOwotICAgICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gMjsKLSAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDE2OwotICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogMjsKLSAgICAgICAgIH0KLSAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgZGF0YSBmcm9tIEcgdG8gWEcgKi8KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aDsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aDsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDI7Ci0gICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAxNjsKLSAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDI7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQotICAgICAgewotICAgICAgICAgLyogVGhpcyBjaGFuZ2VzIHRoZSBkYXRhIGZyb20gR0cgdG8gR0dYWCAqLwotICAgICAgICAgaWYgKGZsYWdzICYgUE5HX0ZMQUdfRklMTEVSX0FGVEVSKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMjsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDI7Ci0gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gaGlfZmlsbGVyOwotICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqKC0tZHApID0gaGlfZmlsbGVyOwotICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKLSAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDI7Ci0gICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAzMjsKLSAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDQ7Ci0gICAgICAgICB9Ci0gICAgICAgICAvKiBUaGlzIGNoYW5nZXMgdGhlIGRhdGEgZnJvbSBHRyB0byBYWEdHICovCi0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAyOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3AgICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMjsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gaGlfZmlsbGVyOwotICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDI7Ci0gICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAzMjsKLSAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDQ7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9IC8qIENPTE9SX1RZUEUgPT0gR1JBWSAqLwotICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgewotICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgIHsKLSAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgZGF0YSBmcm9tIFJHQiB0byBSR0JYICovCi0gICAgICAgICBpZiAoZmxhZ3MgJiBQTkdfRkxBR19GSUxMRVJfQUZURVIpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAzOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3AgICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoOwotICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICooLS1kcCkgPSBsb19maWxsZXI7Ci0gICAgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSA0OwotICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gMzI7Ci0gICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGggKiA0OwotICAgICAgICAgfQotICAgICAgLyogVGhpcyBjaGFuZ2VzIHRoZSBkYXRhIGZyb20gUkdCIHRvIFhSR0IgKi8KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDM7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcCArIChwbmdfc2l6ZV90KXJvd193aWR0aDsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSBsb19maWxsZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSA0OwotICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gMzI7Ci0gICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGggKiA0OwotICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKLSAgICAgIHsKLSAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgZGF0YSBmcm9tIFJSR0dCQiB0byBSUkdHQkJYWCAqLwotICAgICAgICAgaWYgKGZsYWdzICYgUE5HX0ZMQUdfRklMTEVSX0FGVEVSKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogNjsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDI7Ci0gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gaGlfZmlsbGVyOwotICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICooLS1kcCkgPSBoaV9maWxsZXI7Ci0gICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOwotICAgICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gNDsKLSAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDY0OwotICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogODsKLSAgICAgICAgIH0KLSAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgZGF0YSBmcm9tIFJSR0dCQiB0byBYWFJSR0dCQiAqLwotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogNjsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDI7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gaGlfZmlsbGVyOwotICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDQ7Ci0gICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSA2NDsKLSAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDg7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9IC8qIENPTE9SX1RZUEUgPT0gUkdCICovCi19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRAotLyogRXhwYW5kIGdyYXlzY2FsZSBmaWxlcyB0byBSR0IsIHdpdGggb3Igd2l0aG91dCBhbHBoYSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9fZ3JheV90b19yZ2IocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKLXsKLSAgIHBuZ191aW50XzMyIGk7Ci0gICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX2dyYXlfdG9fcmdiIik7Ci0KLSAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID49IDggJiYKLSAgICAgICEocm93X2luZm8tPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikpCi0gICB7Ci0gICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKLSAgICAgIHsKLSAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3AgICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMjsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICooZHAtLSkgPSAqc3A7Ci0gICAgICAgICAgICAgICAqKGRwLS0pID0gKnNwOwotICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAyIC0gMTsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDQ7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAqKGRwLS0pID0gKnNwOwotICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AgLSAxKTsKLSAgICAgICAgICAgICAgICooZHAtLSkgPSAqc3A7Ci0gICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcCAtIDEpOwotICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7Ci0gICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcC0tKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgICB7Ci0gICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMiAtIDE7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcCAgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAyOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7Ci0gICAgICAgICAgICAgICAqKGRwLS0pID0gKnNwOwotICAgICAgICAgICAgICAgKihkcC0tKSA9ICpzcDsKLSAgICAgICAgICAgICAgICooZHAtLSkgPSAqKHNwLS0pOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogNCAtIDE7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcCAgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiA0OwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7Ci0gICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcC0tKTsKLSAgICAgICAgICAgICAgICooZHAtLSkgPSAqc3A7Ci0gICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcCAtIDEpOwotICAgICAgICAgICAgICAgKihkcC0tKSA9ICpzcDsKLSAgICAgICAgICAgICAgICooZHAtLSkgPSAqKHNwIC0gMSk7Ci0gICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcC0tKTsKLSAgICAgICAgICAgICAgICooZHAtLSkgPSAqKHNwLS0pOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgcm93X2luZm8tPmNoYW5uZWxzICs9IChwbmdfYnl0ZSkyOwotICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgfD0gUE5HX0NPTE9SX01BU0tfQ09MT1I7Ci0gICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKHJvd19pbmZvLT5jaGFubmVscyAqCi0gICAgICAgICByb3dfaW5mby0+Yml0X2RlcHRoKTsKLSAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhyb3dfaW5mby0+cGl4ZWxfZGVwdGgsIHJvd193aWR0aCk7Ci0gICB9Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRAotLyogUmVkdWNlIFJHQiBmaWxlcyB0byBncmF5c2NhbGUsIHdpdGggb3Igd2l0aG91dCBhbHBoYQotICogdXNpbmcgdGhlIGVxdWF0aW9uIGdpdmVuIGluIFBveW50b24ncyBDb2xvckZBUSBhdAotICogPGh0dHA6Ly93d3cuaW5mb3JhbXAubmV0L35wb3ludG9uLz4gIChUSElTIExJTksgSVMgREVBRCBKdW5lIDIwMDgpCi0gKiBOZXcgbGluazoKLSAqIDxodHRwOi8vd3d3LnBveW50b24uY29tL25vdGVzL2NvbG91cl9hbmRfZ2FtbWEvPgotICogQ2hhcmxlcyBQb3ludG9uIHBveW50b24gYXQgcG95bnRvbi5jb20KLSAqCi0gKiAgICAgWSA9IDAuMjEyNjcxICogUiArIDAuNzE1MTYwICogRyArIDAuMDcyMTY5ICogQgotICoKLSAqICBXZSBhcHByb3hpbWF0ZSB0aGlzIHdpdGgKLSAqCi0gKiAgICAgWSA9IDAuMjEyNjggKiBSICAgICsgMC43MTUxICogRyAgICArIDAuMDcyMTcgKiBCCi0gKgotICogIHdoaWNoIGNhbiBiZSBleHByZXNzZWQgd2l0aCBpbnRlZ2VycyBhcwotICoKLSAqICAgICBZID0gKDY5NjkgKiBSICsgMjM0MzQgKiBHICsgMjM2NSAqIEIpLzMyNzY4Ci0gKgotICogIFRoZSBjYWxjdWxhdGlvbiBpcyB0byBiZSBkb25lIGluIGEgbGluZWFyIGNvbG9yc3BhY2UuCi0gKgotICogIE90aGVyIGludGVnZXIgY29lZmZpY2VudHMgY2FuIGJlIHVzZWQgdmlhIHBuZ19zZXRfcmdiX3RvX2dyYXkoKS4KLSAqLwotaW50IC8qIFBSSVZBVEUgKi8KLXBuZ19kb19yZ2JfdG9fZ3JheShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQotCi17Ci0gICBwbmdfdWludF8zMiBpOwotCi0gICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0gICBpbnQgcmdiX2Vycm9yID0gMDsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fcmdiX3RvX2dyYXkiKTsKLQotICAgaWYgKCEocm93X2luZm8tPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19QQUxFVFRFKSAmJgotICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKQotICAgewotICAgICAgcG5nX3VpbnRfMzIgcmMgPSBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9yZWRfY29lZmY7Ci0gICAgICBwbmdfdWludF8zMiBnYyA9IHBuZ19wdHItPnJnYl90b19ncmF5X2dyZWVuX2NvZWZmOwotICAgICAgcG5nX3VpbnRfMzIgYmMgPSBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9ibHVlX2NvZWZmOwotCi0gICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgICAgewotICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgICAgIHsKLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5nYW1tYV9mcm9tXzEgIT0gTlVMTCAmJiBwbmdfcHRyLT5nYW1tYV90b18xICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7Ci0KLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIHJlZCAgID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVsqKHNwKyspXTsKLSAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGdyZWVuID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVsqKHNwKyspXTsKLSAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGJsdWUgID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVsqKHNwKyspXTsKLSAgICAgICAgICAgICAgICAgIGlmIChyZWQgIT0gZ3JlZW4gfHwgcmVkICE9IGJsdWUpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICByZ2JfZXJyb3IgfD0gMTsKLSAgICAgICAgICAgICAgICAgICAgICooZHArKykgPSBwbmdfcHRyLT5nYW1tYV9mcm9tXzFbCi0gICAgICAgICAgICAgICAgICAgICAgIChyYypyZWQgKyBnYypncmVlbiArIGJjKmJsdWUpPj4xNV07Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCAtIDEpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfYnl0ZSByZWQgICA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBncmVlbiA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBibHVlICA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAgICBpZiAocmVkICE9IGdyZWVuIHx8IHJlZCAhPSBibHVlKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcmdiX2Vycm9yIHw9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSgocmMqcmVkICsgZ2MqZ3JlZW4gKyBiYypibHVlKT4+MTUpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3AgLSAxKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZSAvKiBSR0IgYml0X2RlcHRoID09IDE2ICovCi0gICAgICAgICB7Ci0jaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCi0gICAgICAgICAgICBpZiAocG5nX3B0ci0+Z2FtbWFfMTZfdG9fMSAhPSBOVUxMICYmCi0gICAgICAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfZnJvbV8xICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiByZWQsIGdyZWVuLCBibHVlLCB3OwotCi0gICAgICAgICAgICAgICAgICByZWQgICA9IChwbmdfdWludF8xNikoKCgqKHNwKSk8PDgpIHwgKihzcCsxKSk7IHNwKz0yOwotICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAocG5nX3VpbnRfMTYpKCgoKihzcCkpPDw4KSB8ICooc3ArMSkpOyBzcCs9MjsKLSAgICAgICAgICAgICAgICAgIGJsdWUgID0gKHBuZ191aW50XzE2KSgoKCooc3ApKTw8OCkgfCAqKHNwKzEpKTsgc3ArPTI7Ci0KLSAgICAgICAgICAgICAgICAgIGlmIChyZWQgPT0gZ3JlZW4gJiYgcmVkID09IGJsdWUpCi0gICAgICAgICAgICAgICAgICAgICB3ID0gcmVkOwotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgcmVkXzEgICA9IHBuZ19wdHItPmdhbW1hXzE2X3RvXzFbKHJlZCYweGZmKSA+PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtyZWQ+PjhdOwotICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgZ3JlZW5fMSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMVsoZ3JlZW4mMHhmZikgPj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV9zaGlmdF1bZ3JlZW4+PjhdOwotICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgYmx1ZV8xICA9IHBuZ19wdHItPmdhbW1hXzE2X3RvXzFbKGJsdWUmMHhmZikgPj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV9zaGlmdF1bYmx1ZT4+OF07Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBncmF5MTYgID0gKHBuZ191aW50XzE2KSgocmMqcmVkXzEgKyBnYypncmVlbl8xCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBiYypibHVlXzEpPj4xNSk7Ci0gICAgICAgICAgICAgICAgICAgICB3ID0gcG5nX3B0ci0+Z2FtbWFfMTZfZnJvbV8xWyhncmF5MTYmMHhmZikgPj4KLSAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV9zaGlmdF1bZ3JheTE2ID4+IDhdOwotICAgICAgICAgICAgICAgICAgICAgcmdiX2Vycm9yIHw9IDE7Ci0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKCh3Pj44KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkodyAmIDB4ZmYpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiByZWQsIGdyZWVuLCBibHVlLCBncmF5MTY7Ci0KLSAgICAgICAgICAgICAgICAgIHJlZCAgID0gKHBuZ191aW50XzE2KSgoKCooc3ApKTw8OCkgfCAqKHNwKzEpKTsgc3ArPTI7Ci0gICAgICAgICAgICAgICAgICBncmVlbiA9IChwbmdfdWludF8xNikoKCgqKHNwKSk8PDgpIHwgKihzcCsxKSk7IHNwKz0yOwotICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAocG5nX3VpbnRfMTYpKCgoKihzcCkpPDw4KSB8ICooc3ArMSkpOyBzcCs9MjsKLQotICAgICAgICAgICAgICAgICAgaWYgKHJlZCAhPSBncmVlbiB8fCByZWQgIT0gYmx1ZSkKLSAgICAgICAgICAgICAgICAgICAgIHJnYl9lcnJvciB8PSAxOwotICAgICAgICAgICAgICAgICAgZ3JheTE2ICA9IChwbmdfdWludF8xNikoKHJjKnJlZCArIGdjKmdyZWVuICsgYmMqYmx1ZSk+PjE1KTsKLSAgICAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKChncmF5MTY+PjgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKShncmF5MTYgJiAweGZmKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCi0gICAgICB7Ci0gICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgICAgICAgewotI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQotICAgICAgICAgICAgaWYgKHBuZ19wdHItPmdhbW1hX2Zyb21fMSAhPSBOVUxMICYmIHBuZ19wdHItPmdhbW1hX3RvXzEgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdzsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIHJlZCAgID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVsqKHNwKyspXTsKLSAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGdyZWVuID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVsqKHNwKyspXTsKLSAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGJsdWUgID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVsqKHNwKyspXTsKLSAgICAgICAgICAgICAgICAgIGlmIChyZWQgIT0gZ3JlZW4gfHwgcmVkICE9IGJsdWUpCi0gICAgICAgICAgICAgICAgICAgICByZ2JfZXJyb3IgfD0gMTsKLSAgICAgICAgICAgICAgICAgICooZHArKykgPSAgcG5nX3B0ci0+Z2FtbWFfZnJvbV8xCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsocmMqcmVkICsgZ2MqZ3JlZW4gKyBiYypibHVlKT4+MTVdOwotICAgICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7ICAvKiBhbHBoYSAqLwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfYnl0ZSByZWQgICA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBncmVlbiA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBibHVlICA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAgICBpZiAocmVkICE9IGdyZWVuIHx8IHJlZCAhPSBibHVlKQotICAgICAgICAgICAgICAgICAgICAgcmdiX2Vycm9yIHw9IDE7Ci0gICAgICAgICAgICAgICAgICAqKGRwKyspID0gIChwbmdfYnl0ZSkoKHJjKnJlZCArIGdjKmdyZWVuICsgYmMqYmx1ZSk+PjE1KTsKLSAgICAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOyAgLyogYWxwaGEgKi8KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgLyogUkdCQSBiaXRfZGVwdGggPT0gMTYgKi8KLSAgICAgICAgIHsKLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5nYW1tYV8xNl90b18xICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV8xNl9mcm9tXzEgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdzsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHJlZCwgZ3JlZW4sIGJsdWUsIHc7Ci0KLSAgICAgICAgICAgICAgICAgIHJlZCAgID0gKHBuZ191aW50XzE2KSgoKCooc3ApKTw8OCkgfCAqKHNwKzEpKTsgc3ArPTI7Ci0gICAgICAgICAgICAgICAgICBncmVlbiA9IChwbmdfdWludF8xNikoKCgqKHNwKSk8PDgpIHwgKihzcCsxKSk7IHNwKz0yOwotICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAocG5nX3VpbnRfMTYpKCgoKihzcCkpPDw4KSB8ICooc3ArMSkpOyBzcCs9MjsKLQotICAgICAgICAgICAgICAgICAgaWYgKHJlZCA9PSBncmVlbiAmJiByZWQgPT0gYmx1ZSkKLSAgICAgICAgICAgICAgICAgICAgIHcgPSByZWQ7Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiByZWRfMSAgID0gcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMVsocmVkJjB4ZmYpID4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfc2hpZnRdW3JlZD4+OF07Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBncmVlbl8xID0KLSAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV8xNl90b18xWyhncmVlbiYweGZmKSA+PgotICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtncmVlbj4+OF07Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBibHVlXzEgID0gcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMVsoYmx1ZSYweGZmKSA+PgotICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtibHVlPj44XTsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGdyYXkxNiAgPSAocG5nX3VpbnRfMTYpKChyYyAqIHJlZF8xCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBnYyAqIGdyZWVuXzEgKyBiYyAqIGJsdWVfMSk+PjE1KTsKLSAgICAgICAgICAgICAgICAgICAgIHcgPSBwbmdfcHRyLT5nYW1tYV8xNl9mcm9tXzFbKGdyYXkxNiYweGZmKSA+PgotICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtncmF5MTYgPj4gOF07Ci0gICAgICAgICAgICAgICAgICAgICByZ2JfZXJyb3IgfD0gMTsKLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoKHc+PjgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSh3ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsgIC8qIGFscGhhICovCi0gICAgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93OwotICAgICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93OwotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgcmVkLCBncmVlbiwgYmx1ZSwgZ3JheTE2OwotICAgICAgICAgICAgICAgICAgcmVkICAgPSAocG5nX3VpbnRfMTYpKCgqKHNwKTw8OCkgfCAqKHNwKzEpKTsgc3ArPTI7Ci0gICAgICAgICAgICAgICAgICBncmVlbiA9IChwbmdfdWludF8xNikoKCooc3ApPDw4KSB8ICooc3ArMSkpOyBzcCs9MjsKLSAgICAgICAgICAgICAgICAgIGJsdWUgID0gKHBuZ191aW50XzE2KSgoKihzcCk8PDgpIHwgKihzcCsxKSk7IHNwKz0yOwotICAgICAgICAgICAgICAgICAgaWYgKHJlZCAhPSBncmVlbiB8fCByZWQgIT0gYmx1ZSkKLSAgICAgICAgICAgICAgICAgICAgIHJnYl9lcnJvciB8PSAxOwotICAgICAgICAgICAgICAgICAgZ3JheTE2ICA9IChwbmdfdWludF8xNikoKHJjKnJlZCArIGdjKmdyZWVuICsgYmMqYmx1ZSk+PjE1KTsKLSAgICAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKChncmF5MTY+PjgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKShncmF5MTYgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOyAgLyogYWxwaGEgKi8KLSAgICAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgcm93X2luZm8tPmNoYW5uZWxzIC09IChwbmdfYnl0ZSkyOwotICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgJj0gflBOR19DT0xPUl9NQVNLX0NPTE9SOwotICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKShyb3dfaW5mby0+Y2hhbm5lbHMgKgotICAgICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCk7Ci0gICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8tPnBpeGVsX2RlcHRoLCByb3dfd2lkdGgpOwotICAgfQotICAgcmV0dXJuIHJnYl9lcnJvcjsKLX0KLSNlbmRpZgotCi0vKiBCdWlsZCBhIGdyYXlzY2FsZSBwYWxldHRlLiAgUGFsZXR0ZSBpcyBhc3N1bWVkIHRvIGJlIDEgPDwgYml0X2RlcHRoCi0gKiBsYXJnZSBvZiBwbmdfY29sb3IuICBUaGlzIGxldHMgZ3JheXNjYWxlIGltYWdlcyBiZSB0cmVhdGVkIGFzCi0gKiBwYWxldHRlZC4gIE1vc3QgdXNlZnVsIGZvciBnYW1tYSBjb3JyZWN0aW9uIGFuZCBzaW1wbGlmaWNhdGlvbgotICogb2YgY29kZS4KLSAqLwotdm9pZCBQTkdBUEkKLXBuZ19idWlsZF9ncmF5c2NhbGVfcGFsZXR0ZShpbnQgYml0X2RlcHRoLCBwbmdfY29sb3JwIHBhbGV0dGUpCi17Ci0gICBpbnQgbnVtX3BhbGV0dGU7Ci0gICBpbnQgY29sb3JfaW5jOwotICAgaW50IGk7Ci0gICBpbnQgdjsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fYnVpbGRfZ3JheXNjYWxlX3BhbGV0dGUiKTsKLQotICAgaWYgKHBhbGV0dGUgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgc3dpdGNoIChiaXRfZGVwdGgpCi0gICB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgICBudW1fcGFsZXR0ZSA9IDI7Ci0gICAgICAgICBjb2xvcl9pbmMgPSAweGZmOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMjoKLSAgICAgICAgIG51bV9wYWxldHRlID0gNDsKLSAgICAgICAgIGNvbG9yX2luYyA9IDB4NTU7Ci0gICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSA0OgotICAgICAgICAgbnVtX3BhbGV0dGUgPSAxNjsKLSAgICAgICAgIGNvbG9yX2luYyA9IDB4MTE7Ci0gICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSA4OgotICAgICAgICAgbnVtX3BhbGV0dGUgPSAyNTY7Ci0gICAgICAgICBjb2xvcl9pbmMgPSAxOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICBudW1fcGFsZXR0ZSA9IDA7Ci0gICAgICAgICBjb2xvcl9pbmMgPSAwOwotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIGZvciAoaSA9IDAsIHYgPSAwOyBpIDwgbnVtX3BhbGV0dGU7IGkrKywgdiArPSBjb2xvcl9pbmMpCi0gICB7Ci0gICAgICBwYWxldHRlW2ldLnJlZCA9IChwbmdfYnl0ZSl2OwotICAgICAgcGFsZXR0ZVtpXS5ncmVlbiA9IChwbmdfYnl0ZSl2OwotICAgICAgcGFsZXR0ZVtpXS5ibHVlID0gKHBuZ19ieXRlKXY7Ci0gICB9Ci19Ci0KLQotI2lmZGVmIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVECi0vKiBSZXBsYWNlIGFueSBhbHBoYSBvciB0cmFuc3BhcmVuY3kgd2l0aCB0aGUgc3VwcGxpZWQgYmFja2dyb3VuZCBjb2xvci4KLSAqICJiYWNrZ3JvdW5kIiBpcyBhbHJlYWR5IGluIHRoZSBzY3JlZW4gZ2FtbWEsIHdoaWxlICJiYWNrZ3JvdW5kXzEiIGlzCi0gKiBhdCBhIGdhbW1hIG9mIDEuMC4gIFBhbGV0dGVkIGZpbGVzIGhhdmUgYWxyZWFkeSBiZWVuIHRha2VuIGNhcmUgb2YuCi0gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RvX2JhY2tncm91bmQocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKLSAgIHBuZ19jb2xvcl8xNnAgdHJhbnNfY29sb3IsIHBuZ19jb2xvcl8xNnAgYmFja2dyb3VuZAotI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAotICAgLCBwbmdfY29sb3JfMTZwIGJhY2tncm91bmRfMSwKLSAgIHBuZ19ieXRlcCBnYW1tYV90YWJsZSwgcG5nX2J5dGVwIGdhbW1hX2Zyb21fMSwgcG5nX2J5dGVwIGdhbW1hX3RvXzEsCi0gICBwbmdfdWludF8xNnBwIGdhbW1hXzE2LCBwbmdfdWludF8xNnBwIGdhbW1hXzE2X2Zyb21fMSwKLSAgIHBuZ191aW50XzE2cHAgZ2FtbWFfMTZfdG9fMSwgaW50IGdhbW1hX3NoaWZ0Ci0jZW5kaWYKLSAgICkKLXsKLSAgIHBuZ19ieXRlcCBzcCwgZHA7Ci0gICBwbmdfdWludF8zMiBpOwotICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoPXJvd19pbmZvLT53aWR0aDsKLSAgIGludCBzaGlmdDsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fYmFja2dyb3VuZCIpOwotCi0gICBpZiAoYmFja2dyb3VuZCAhPSBOVUxMICYmCi0gICAgICAoIShyb3dfaW5mby0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKSB8fAotICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgJiYgdHJhbnNfY29sb3IpKSkKLSAgIHsKLSAgICAgIHN3aXRjaCAocm93X2luZm8tPmNvbG9yX3R5cGUpCi0gICAgICB7Ci0gICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVk6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHJvd19pbmZvLT5iaXRfZGVwdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNzsKLSAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmICgocG5nX3VpbnRfMTYpKCgqc3AgPj4gc2hpZnQpICYgMHgwMSkKLSAgICAgICAgICAgICAgICAgICAgICAgID09IHRyYW5zX2NvbG9yLT5ncmF5KQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKnNwICY9IChwbmdfYnl0ZSkoKDB4N2Y3ZiA+PiAoNyAtIHNoaWZ0KSkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpzcCB8PSAocG5nX2J5dGUpKGJhY2tncm91bmQtPmdyYXkgPDwgc2hpZnQpOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaGlmdCkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwKys7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGlmdC0tOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgIHsKLSNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKLSAgICAgICAgICAgICAgICAgIGlmIChnYW1tYV90YWJsZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDY7Ci0gICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBuZ191aW50XzE2KSgoKnNwID4+IHNoaWZ0KSAmIDB4MDMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gdHJhbnNfY29sb3ItPmdyYXkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgJj0gKHBuZ19ieXRlKSgoMHgzZjNmID4+ICg2IC0gc2hpZnQpKSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwIHw9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+Z3JheSA8PCBzaGlmdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBwID0gKHBuZ19ieXRlKSgoKnNwID4+IHNoaWZ0KSAmIDB4MDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgZyA9IChwbmdfYnl0ZSkoKGdhbW1hX3RhYmxlIFtwIHwgKHAgPDwgMikgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwIDw8IDQpIHwgKHAgPDwgNildID4+IDYpICYgMHgwMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgJj0gKHBuZ19ieXRlKSgoMHgzZjNmID4+ICg2IC0gc2hpZnQpKSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwIHw9IChwbmdfYnl0ZSkoZyA8PCBzaGlmdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNoaWZ0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDI7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA2OwotICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwbmdfdWludF8xNikoKCpzcCA+PiBzaGlmdCkgJiAweDAzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHRyYW5zX2NvbG9yLT5ncmF5KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwICY9IChwbmdfYnl0ZSkoKDB4M2YzZiA+PiAoNiAtIHNoaWZ0KSkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCB8PSAocG5nX2J5dGUpKGJhY2tncm91bmQtPmdyYXkgPDwgc2hpZnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaGlmdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCAtPSAyOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgIHsKLSNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKLSAgICAgICAgICAgICAgICAgIGlmIChnYW1tYV90YWJsZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBuZ191aW50XzE2KSgoKnNwID4+IHNoaWZ0KSAmIDB4MGYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gdHJhbnNfY29sb3ItPmdyYXkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgJj0gKHBuZ19ieXRlKSgoMHhmMGYgPj4gKDQgLSBzaGlmdCkpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgfD0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ncmF5IDw8IHNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIHAgPSAocG5nX2J5dGUpKCgqc3AgPj4gc2hpZnQpICYgMHgwZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBnID0gKHBuZ19ieXRlKSgoZ2FtbWFfdGFibGVbcCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwIDw8IDQpXSA+PiA0KSAmIDB4MGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwICY9IChwbmdfYnl0ZSkoKDB4ZjBmID4+ICg0IC0gc2hpZnQpKSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwIHw9IChwbmdfYnl0ZSkoZyA8PCBzaGlmdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNoaWZ0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDQ7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA0OwotICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwbmdfdWludF8xNikoKCpzcCA+PiBzaGlmdCkgJiAweDBmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHRyYW5zX2NvbG9yLT5ncmF5KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwICY9IChwbmdfYnl0ZSkoKDB4ZjBmID4+ICg0IC0gc2hpZnQpKSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwIHw9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+Z3JheSA8PCBzaGlmdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNoaWZ0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDQ7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgewotI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAotICAgICAgICAgICAgICAgICAgaWYgKGdhbW1hX3RhYmxlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3ArKykKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqc3AgPT0gdHJhbnNfY29sb3ItPmdyYXkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpYmFja2dyb3VuZC0+Z3JheTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCsrKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpzcCA9PSB0cmFuc19jb2xvci0+Z3JheSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5ncmF5OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgICB7Ci0jaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECi0gICAgICAgICAgICAgICAgICBpZiAoZ2FtbWFfMTYgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSAyKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgdjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdiA9IChwbmdfdWludF8xNikoKCgqc3ApIDw8IDgpICsgKihzcCArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID09IHRyYW5zX2NvbG9yLT5ncmF5KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmFja2dyb3VuZCBpcyBhbHJlYWR5IGluIHNjcmVlbiBnYW1tYSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgoYmFja2dyb3VuZC0+Z3JheSA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ncmF5ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSAyKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgdjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdiA9IChwbmdfdWludF8xNikoKCgqc3ApIDw8IDgpICsgKihzcCArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID09IHRyYW5zX2NvbG9yLT5ncmF5KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgoYmFja2dyb3VuZC0+Z3JheSA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ncmF5ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCOgotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKLSAgICAgICAgICAgICAgIGlmIChnYW1tYV90YWJsZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDMpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoKnNwID09IHRyYW5zX2NvbG9yLT5yZWQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9PSB0cmFuc19jb2xvci0+Z3JlZW4gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAyKSA9PSB0cmFuc19jb2xvci0+Ymx1ZSkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5yZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpYmFja2dyb3VuZC0+Z3JlZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpYmFja2dyb3VuZC0+Ymx1ZTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSBnYW1tYV90YWJsZVsqKHNwICsgMSldOwotICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDIpID0gZ2FtbWFfdGFibGVbKihzcCArIDIpXTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDMpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoKnNwID09IHRyYW5zX2NvbG9yLT5yZWQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9PSB0cmFuc19jb2xvci0+Z3JlZW4gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAyKSA9PSB0cmFuc19jb2xvci0+Ymx1ZSkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5yZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpYmFja2dyb3VuZC0+Z3JlZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpYmFja2dyb3VuZC0+Ymx1ZTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLyogaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpICovCi0gICAgICAgICAgICB7Ci0jaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECi0gICAgICAgICAgICAgICBpZiAoZ2FtbWFfMTYgIT0gTlVMTCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSA2KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgciA9IChwbmdfdWludF8xNikoKCgqc3ApIDw8IDgpICsgKihzcCArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGcgPSAocG5nX3VpbnRfMTYpKCgoKihzcCsyKSkgPDwgOCkgKyAqKHNwKzMpKTsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGIgPSAocG5nX3VpbnRfMTYpKCgoKihzcCs0KSkgPDwgOCkgKyAqKHNwKzUpKTsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChyID09IHRyYW5zX2NvbG9yLT5yZWQgJiYgZyA9PSB0cmFuc19jb2xvci0+Z3JlZW4gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGIgPT0gdHJhbnNfY29sb3ItPmJsdWUpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBCYWNrZ3JvdW5kIGlzIGFscmVhZHkgaW4gc2NyZWVuIGdhbW1hICovCi0gICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5yZWQgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+cmVkICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5ncmVlbiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDMpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ncmVlbiAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDQpID0gKHBuZ19ieXRlKSgoYmFja2dyb3VuZC0+Ymx1ZSA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDUpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ibHVlICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2ID0gZ2FtbWFfMTZbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOwotICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZbKihzcCArIDMpID4+IGdhbW1hX3NoaWZ0XVsqKHNwICsgMildOwotICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDIpID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDMpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZbKihzcCArIDUpID4+IGdhbW1hX3NoaWZ0XVsqKHNwICsgNCldOwotICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDQpID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDUpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSA2KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgciA9IChwbmdfdWludF8xNikoKCgqc3ApIDw8IDgpICsgKihzcCsxKSk7Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBnID0gKHBuZ191aW50XzE2KSgoKCooc3ArMikpIDw8IDgpICsgKihzcCszKSk7Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBiID0gKHBuZ191aW50XzE2KSgoKCooc3ArNCkpIDw8IDgpICsgKihzcCs1KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgIGlmIChyID09IHRyYW5zX2NvbG9yLT5yZWQgJiYgZyA9PSB0cmFuc19jb2xvci0+Z3JlZW4gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGIgPT0gdHJhbnNfY29sb3ItPmJsdWUpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5yZWQgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+cmVkICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5ncmVlbiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDMpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ncmVlbiAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDQpID0gKHBuZ19ieXRlKSgoYmFja2dyb3VuZC0+Ymx1ZSA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDUpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ibHVlICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBOgotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKLSAgICAgICAgICAgICAgIGlmIChnYW1tYV90b18xICE9IE5VTEwgJiYgZ2FtbWFfZnJvbV8xICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICAgICBnYW1tYV90YWJsZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICAgICBkcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gMiwgZHArKykKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGEgPSAqKHNwICsgMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IDB4ZmYpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSBnYW1tYV90YWJsZVsqc3BdOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogQmFja2dyb3VuZCBpcyBhbHJlYWR5IGluIHNjcmVlbiBnYW1tYSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKWJhY2tncm91bmQtPmdyYXk7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSB2LCB3OwotCi0gICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfdG9fMVsqc3BdOwotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSh3LCB2LCBhLCBiYWNrZ3JvdW5kXzEtPmdyYXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gZ2FtbWFfZnJvbV8xW3ddOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgIGRwID0gcm93OwotICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSAyLCBkcCsrKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgYSA9ICooc3AgKyAxKTsKLQotICAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMHhmZikKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9ICpzcDsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKLSAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGEgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5ncmF5OwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSgqZHAsICpzcCwgYSwgYmFja2dyb3VuZF8xLT5ncmF5KTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpYmFja2dyb3VuZC0+Z3JheTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKiBpZiAocG5nX3B0ci0+Yml0X2RlcHRoID09IDE2KSAqLwotICAgICAgICAgICAgewotI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAotICAgICAgICAgICAgICAgaWYgKGdhbW1hXzE2ICE9IE5VTEwgJiYgZ2FtbWFfMTZfZnJvbV8xICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICAgICBnYW1tYV8xNl90b18xICE9IE5VTEwpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgIGRwID0gcm93OwotICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSA0LCBkcCArPSAyKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgYSA9IChwbmdfdWludF8xNikoKCgqKHNwKzIpKSA8PCA4KSArICooc3ArMykpOwotCi0gICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAocG5nX3VpbnRfMTYpMHhmZmZmKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgdjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2Wyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAotICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYSA9PSAwKQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogQmFja2dyb3VuZCBpcyBhbHJlYWR5IGluIHNjcmVlbiBnYW1tYSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgoYmFja2dyb3VuZC0+Z3JheSA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ncmF5ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECi0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBnLCB2LCB3OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBnID0gZ2FtbWFfMTZfdG9fMVsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHYsIGcsIGEsIGJhY2tncm91bmRfMS0+Z3JheSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3ID0gZ2FtbWFfMTZfZnJvbV8xWyh2JjB4ZmYpID4+IGdhbW1hX3NoaWZ0XVt2ID4+IDhdOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgodyA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gKHBuZ19ieXRlKSh3ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICAgICBkcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gNCwgZHAgKz0gMikKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGEgPSAocG5nX3VpbnRfMTYpKCgoKihzcCsyKSkgPDwgOCkgKyAqKHNwKzMpKTsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IChwbmdfdWludF8xNikweGZmZmYpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfbWVtY3B5KGRwLCBzcCwgMik7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECi0gICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhID09IDApCi0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5ncmF5ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMSkgPSAocG5nX2J5dGUpKGJhY2tncm91bmQtPmdyYXkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGcsIHY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAocG5nX3VpbnRfMTYpKCgoKnNwKSA8PCA4KSArICooc3AgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHYsIGcsIGEsIGJhY2tncm91bmRfMS0+Z3JheSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOgotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKLSAgICAgICAgICAgICAgIGlmIChnYW1tYV90b18xICE9IE5VTEwgJiYgZ2FtbWFfZnJvbV8xICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICAgICBnYW1tYV90YWJsZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICAgICBkcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gNCwgZHAgKz0gMykKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGEgPSAqKHNwICsgMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IDB4ZmYpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSBnYW1tYV90YWJsZVsqc3BdOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gZ2FtbWFfdGFibGVbKihzcCArIDEpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAyKSA9IGdhbW1hX3RhYmxlWyooc3AgKyAyKV07Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhID09IDApCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBCYWNrZ3JvdW5kIGlzIGFscmVhZHkgaW4gc2NyZWVuIGdhbW1hICovCi0gICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpYmFja2dyb3VuZC0+cmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gKHBuZ19ieXRlKWJhY2tncm91bmQtPmdyZWVuOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDIpID0gKHBuZ19ieXRlKWJhY2tncm91bmQtPmJsdWU7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSB2LCB3OwotCi0gICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfdG9fMVsqc3BdOwotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSh3LCB2LCBhLCBiYWNrZ3JvdW5kXzEtPnJlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSBnYW1tYV9mcm9tXzFbd107Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfdG9fMVsqKHNwICsgMSldOwotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSh3LCB2LCBhLCBiYWNrZ3JvdW5kXzEtPmdyZWVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAxKSA9IGdhbW1hX2Zyb21fMVt3XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV90b18xWyooc3AgKyAyKV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHcsIHYsIGEsIGJhY2tncm91bmRfMS0+Ymx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMikgPSBnYW1tYV9mcm9tXzFbd107Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgICAgZHAgPSByb3c7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDQsIGRwICs9IDMpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBhID0gKihzcCArIDMpOwotCi0gICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAweGZmKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKnNwOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gKihzcCArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDIpID0gKihzcCArIDIpOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKWJhY2tncm91bmQtPnJlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAxKSA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5ncmVlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAyKSA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5ibHVlOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSgqZHAsICpzcCwgYSwgYmFja2dyb3VuZC0+cmVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGUoKihkcCArIDEpLCAqKHNwICsgMSksIGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLT5ncmVlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKCooZHAgKyAyKSwgKihzcCArIDIpLCBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC0+Ymx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8qIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KSAqLwotICAgICAgICAgICAgewotI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAotICAgICAgICAgICAgICAgaWYgKGdhbW1hXzE2ICE9IE5VTEwgJiYgZ2FtbWFfMTZfZnJvbV8xICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICAgICBnYW1tYV8xNl90b18xICE9IE5VTEwpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgIGRwID0gcm93OwotICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSA4LCBkcCArPSA2KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgYSA9IChwbmdfdWludF8xNikoKChwbmdfdWludF8xNikoKihzcCArIDYpKQotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDgpICsgKHBuZ191aW50XzE2KSgqKHNwICsgNykpKTsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IChwbmdfdWludF8xNikweGZmZmYpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2OwotCi0gICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZbKihzcCArIDMpID4+IGdhbW1hX3NoaWZ0XVsqKHNwICsgMildOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDIpID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDMpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZbKihzcCArIDUpID4+IGdhbW1hX3NoaWZ0XVsqKHNwICsgNCldOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDQpID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDUpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhID09IDApCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBCYWNrZ3JvdW5kIGlzIGFscmVhZHkgaW4gc2NyZWVuIGdhbW1hICovCi0gICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5yZWQgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAxKSA9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+cmVkICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMikgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5ncmVlbiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDMpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ncmVlbiAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDQpID0gKHBuZ19ieXRlKSgoYmFja2dyb3VuZC0+Ymx1ZSA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDUpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ibHVlICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2LCB3LCB4OwotCi0gICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZfdG9fMVsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHcsIHYsIGEsIGJhY2tncm91bmRfMS0+cmVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHggPSBnYW1tYV8xNl9mcm9tXzFbKCh3JjB4ZmYpID4+IGdhbW1hX3NoaWZ0KV1bdyA+PiA4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkoKHggPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAxKSA9IChwbmdfYnl0ZSkoeCAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2X3RvXzFbKihzcCArIDMpID4+IGdhbW1hX3NoaWZ0XVsqKHNwICsgMildOwotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZV8xNih3LCB2LCBhLCBiYWNrZ3JvdW5kXzEtPmdyZWVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHggPSBnYW1tYV8xNl9mcm9tXzFbKCh3JjB4ZmYpID4+IGdhbW1hX3NoaWZ0KV1bdyA+PiA4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAyKSA9IChwbmdfYnl0ZSkoKHggPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAzKSA9IChwbmdfYnl0ZSkoeCAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2X3RvXzFbKihzcCArIDUpID4+IGdhbW1hX3NoaWZ0XVsqKHNwICsgNCldOwotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZV8xNih3LCB2LCBhLCBiYWNrZ3JvdW5kXzEtPmJsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGdhbW1hXzE2X2Zyb21fMVsodyAmIDB4ZmYpID4+IGdhbW1hX3NoaWZ0XVt3ID4+IDhdOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDQpID0gKHBuZ19ieXRlKSgoeCA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDUpID0gKHBuZ19ieXRlKSh4ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgICAgZHAgPSByb3c7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDgsIGRwICs9IDYpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBhID0gKHBuZ191aW50XzE2KSgoKHBuZ191aW50XzE2KSgqKHNwICsgNikpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCA4KSArIChwbmdfdWludF8xNikoKihzcCArIDcpKSk7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAocG5nX3VpbnRfMTYpMHhmZmZmKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX21lbWNweShkcCwgc3AsIDYpOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgoYmFja2dyb3VuZC0+cmVkID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMSkgPSAocG5nX2J5dGUpKGJhY2tncm91bmQtPnJlZCAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDIpID0gKHBuZ19ieXRlKSgoYmFja2dyb3VuZC0+Z3JlZW4gPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAzKSA9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+Z3JlZW4gJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyA0KSA9IChwbmdfYnl0ZSkoKGJhY2tncm91bmQtPmJsdWUgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyA1KSA9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+Ymx1ZSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgdjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgciA9IChwbmdfdWludF8xNikoKCgqc3ApIDw8IDgpICsgKihzcCArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGcgPSAocG5nX3VpbnRfMTYpKCgoKihzcCArIDIpKSA8PCA4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKihzcCArIDMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGIgPSAocG5nX3VpbnRfMTYpKCgoKihzcCArIDQpKSA8PCA4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKihzcCArIDUpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZV8xNih2LCByLCBhLCBiYWNrZ3JvdW5kLT5yZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHYsIGcsIGEsIGJhY2tncm91bmQtPmdyZWVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAyKSA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAzKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZV8xNih2LCBiLCBhLCBiYWNrZ3JvdW5kLT5ibHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyA0KSA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyA1KSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpCi0gICAgICB7Ci0gICAgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSAmPSB+UE5HX0NPTE9SX01BU0tfQUxQSEE7Ci0gICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMtLTsKLSAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkocm93X2luZm8tPmNoYW5uZWxzICoKLSAgICAgICAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGgpOwotICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwgcm93X3dpZHRoKTsKLSAgICAgIH0KLSAgIH0KLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECi0vKiBHYW1tYSBjb3JyZWN0IHRoZSBpbWFnZSwgYXZvaWRpbmcgdGhlIGFscGhhIGNoYW5uZWwuICBNYWtlIHN1cmUKLSAqIHlvdSBkbyB0aGlzIGFmdGVyIHlvdSBkZWFsIHdpdGggdGhlIHRyYW5zcGFyZW5jeSBpc3N1ZSBvbiBncmF5c2NhbGUKLSAqIG9yIFJHQiBpbWFnZXMuIElmIHlvdXIgYml0IGRlcHRoIGlzIDgsIHVzZSBnYW1tYV90YWJsZSwgaWYgaXQKLSAqIGlzIDE2LCB1c2UgZ2FtbWFfMTZfdGFibGUgYW5kIGdhbW1hX3NoaWZ0LiAgQnVpbGQgdGhlc2Ugd2l0aAotICogYnVpbGRfZ2FtbWFfdGFibGUoKS4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9fZ2FtbWEocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKLSAgIHBuZ19ieXRlcCBnYW1tYV90YWJsZSwgcG5nX3VpbnRfMTZwcCBnYW1tYV8xNl90YWJsZSwKLSAgIGludCBnYW1tYV9zaGlmdCkKLXsKLSAgIHBuZ19ieXRlcCBzcDsKLSAgIHBuZ191aW50XzMyIGk7Ci0gICBwbmdfdWludF8zMiByb3dfd2lkdGg9cm93X2luZm8tPndpZHRoOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19nYW1tYSIpOwotCi0gICBpZiAoCi0gICAgICAgKChyb3dfaW5mby0+Yml0X2RlcHRoIDw9IDggJiYgZ2FtbWFfdGFibGUgIT0gTlVMTCkgfHwKLSAgICAgICAgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYgJiYgZ2FtbWFfMTZfdGFibGUgIT0gTlVMTCkpKQotICAgewotICAgICAgc3dpdGNoIChyb3dfaW5mby0+Y29sb3JfdHlwZSkKLSAgICAgIHsKLSAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCOgotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsKLSAgICAgICAgICAgICAgICAgIHNwKys7Ci0gICAgICAgICAgICAgICAgICAqc3AgPSBnYW1tYV90YWJsZVsqc3BdOwotICAgICAgICAgICAgICAgICAgc3ArKzsKLSAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07Ci0gICAgICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKiBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgdjsKLQotICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2X3RhYmxlWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsKLSAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgc3AgKz0gMjsKLSAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNl90YWJsZVsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07Ci0gICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgIHNwICs9IDI7Ci0gICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZfdGFibGVbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOwotICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICBzcCArPSAyOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOgotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsKLSAgICAgICAgICAgICAgICAgIHNwKys7Ci0gICAgICAgICAgICAgICAgICAqc3AgPSBnYW1tYV90YWJsZVsqc3BdOwotICAgICAgICAgICAgICAgICAgc3ArKzsKLSAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07Ci0gICAgICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgICAgICAgc3ArKzsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLyogaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHYgPSBnYW1tYV8xNl90YWJsZVsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07Ci0gICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgIHNwICs9IDI7Ci0gICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZfdGFibGVbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOwotICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICBzcCArPSAyOwotICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2X3RhYmxlWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsKLSAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgc3AgKz0gNDsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotCi0gICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAqc3AgPSBnYW1tYV90YWJsZVsqc3BdOwotICAgICAgICAgICAgICAgICAgc3AgKz0gMjsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLyogaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHYgPSBnYW1tYV8xNl90YWJsZVsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07Ci0gICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgIHNwICs9IDQ7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZOgotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSArPSA0KQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaW50IGEgPSAqc3AgJiAweGMwOwotICAgICAgICAgICAgICAgICAgaW50IGIgPSAqc3AgJiAweDMwOwotICAgICAgICAgICAgICAgICAgaW50IGMgPSAqc3AgJiAweDBjOwotICAgICAgICAgICAgICAgICAgaW50IGQgPSAqc3AgJiAweDAzOwotCi0gICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKAotICAgICAgICAgICAgICAgICAgICAgICgoKChpbnQpZ2FtbWFfdGFibGVbYXwoYT4+Mil8KGE+PjQpfChhPj42KV0pICAgKSAmIDB4YzApfAotICAgICAgICAgICAgICAgICAgICAgICgoKChpbnQpZ2FtbWFfdGFibGVbKGI8PDIpfGJ8KGI+PjIpfChiPj40KV0pPj4yKSAmIDB4MzApfAotICAgICAgICAgICAgICAgICAgICAgICgoKChpbnQpZ2FtbWFfdGFibGVbKGM8PDQpfChjPDwyKXxjfChjPj4yKV0pPj40KSAmIDB4MGMpfAotICAgICAgICAgICAgICAgICAgICAgICgoKChpbnQpZ2FtbWFfdGFibGVbKGQ8PDYpfChkPDw0KXwoZDw8Mil8ZF0pPj42KSApKTsKLSAgICAgICAgICAgICAgICAgIHNwKys7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkgKz0gMikKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGludCBtc2IgPSAqc3AgJiAweGYwOwotICAgICAgICAgICAgICAgICAgaW50IGxzYiA9ICpzcCAmIDB4MGY7Ci0KLSAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKCgoaW50KWdhbW1hX3RhYmxlW21zYiB8IChtc2IgPj4gNCldKSAmIDB4ZjApCi0gICAgICAgICAgICAgICAgICAgICAgfCAoKChpbnQpZ2FtbWFfdGFibGVbKGxzYiA8PCA0KSB8IGxzYl0pID4+IDQpKTsKLSAgICAgICAgICAgICAgICAgIHNwKys7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsKLSAgICAgICAgICAgICAgICAgIHNwKys7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHYgPSBnYW1tYV8xNl90YWJsZVsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07Ci0gICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgIHNwICs9IDI7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgfQotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECi0vKiBFeHBhbmRzIGEgcGFsZXR0ZSByb3cgdG8gYW4gUkdCIG9yIFJHQkEgcm93IGRlcGVuZGluZwotICogdXBvbiB3aGV0aGVyIHlvdSBzdXBwbHkgdHJhbnMgYW5kIG51bV90cmFucy4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9fZXhwYW5kX3BhbGV0dGUocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKLSAgIHBuZ19jb2xvcnAgcGFsZXR0ZSwgcG5nX2J5dGVwIHRyYW5zX2FscGhhLCBpbnQgbnVtX3RyYW5zKQotewotICAgaW50IHNoaWZ0LCB2YWx1ZTsKLSAgIHBuZ19ieXRlcCBzcCwgZHA7Ci0gICBwbmdfdWludF8zMiBpOwotICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoPXJvd19pbmZvLT53aWR0aDsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fZXhwYW5kX3BhbGV0dGUiKTsKLQotICAgaWYgKAotICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICB7Ci0gICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA8IDgpCi0gICAgICB7Ci0gICAgICAgICBzd2l0Y2ggKHJvd19pbmZvLT5iaXRfZGVwdGgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X3dpZHRoIC0gMSkgPj4gMyk7Ci0gICAgICAgICAgICAgICBkcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAtIDE7Ci0gICAgICAgICAgICAgICBzaGlmdCA9IDcgLSAoaW50KSgocm93X3dpZHRoICsgNykgJiAweDA3KTsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICgoKnNwID4+IHNoaWZ0KSAmIDB4MDEpCi0gICAgICAgICAgICAgICAgICAgICAqZHAgPSAxOwotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgKmRwID0gMDsKLSAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSA3KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgc3AtLTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIHNoaWZ0Kys7Ci0KLSAgICAgICAgICAgICAgICAgIGRwLS07Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDIpOwotICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOwotICAgICAgICAgICAgICAgc2hpZnQgPSAoaW50KSgoMyAtICgocm93X3dpZHRoICsgMykgJiAweDAzKSkgPDwgMSk7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgqc3AgPj4gc2hpZnQpICYgMHgwMzsKLSAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSA2KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgc3AtLTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDI7Ci0KLSAgICAgICAgICAgICAgICAgIGRwLS07Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDEpOwotICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOwotICAgICAgICAgICAgICAgc2hpZnQgPSAoaW50KSgocm93X3dpZHRoICYgMHgwMSkgPDwgMik7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgqc3AgPj4gc2hpZnQpICYgMHgwZjsKLSAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSA0KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgc3AtLTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDQ7Ci0KLSAgICAgICAgICAgICAgICAgIGRwLS07Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9IDg7Ci0gICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSA4OwotICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoOwotICAgICAgfQotICAgICAgc3dpdGNoIChyb3dfaW5mby0+Yml0X2RlcHRoKQotICAgICAgewotICAgICAgICAgY2FzZSA4OgotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHRyYW5zX2FscGhhICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAtIDE7Ci0gICAgICAgICAgICAgICBkcCA9IHJvdyArIChwbmdfc2l6ZV90KShyb3dfd2lkdGggPDwgMikgLSAxOwotCi0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoKGludCkoKnNwKSA+PSBudW1fdHJhbnMpCi0gICAgICAgICAgICAgICAgICAgICAqZHAtLSA9IDB4ZmY7Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAqZHAtLSA9IHRyYW5zX2FscGhhWypzcF07Ci0gICAgICAgICAgICAgICAgICAqZHAtLSA9IHBhbGV0dGVbKnNwXS5ibHVlOwotICAgICAgICAgICAgICAgICAgKmRwLS0gPSBwYWxldHRlWypzcF0uZ3JlZW47Ci0gICAgICAgICAgICAgICAgICAqZHAtLSA9IHBhbGV0dGVbKnNwXS5yZWQ7Ci0gICAgICAgICAgICAgICAgICBzcC0tOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9IDg7Ci0gICAgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAzMjsKLSAgICAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDQ7Ci0gICAgICAgICAgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSA9IDY7Ci0gICAgICAgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOwotICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdCkocm93X3dpZHRoICogMykgLSAxOwotCi0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAqZHAtLSA9IHBhbGV0dGVbKnNwXS5ibHVlOwotICAgICAgICAgICAgICAgICAgKmRwLS0gPSBwYWxldHRlWypzcF0uZ3JlZW47Ci0gICAgICAgICAgICAgICAgICAqZHAtLSA9IHBhbGV0dGVbKnNwXS5yZWQ7Ci0gICAgICAgICAgICAgICAgICBzcC0tOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICByb3dfaW5mby0+Yml0X2RlcHRoID0gODsKLSAgICAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDI0OwotICAgICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogMzsKLSAgICAgICAgICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlID0gMjsKLSAgICAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLX0KLQotLyogSWYgdGhlIGJpdCBkZXB0aCA8IDgsIGl0IGlzIGV4cGFuZGVkIHRvIDguICBBbHNvLCBpZiB0aGUgYWxyZWFkeQotICogZXhwYW5kZWQgdHJhbnNwYXJlbmN5IHZhbHVlIGlzIHN1cHBsaWVkLCBhbiBhbHBoYSBjaGFubmVsIGlzIGJ1aWx0LgotICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb19leHBhbmQocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKLSAgIHBuZ19jb2xvcl8xNnAgdHJhbnNfdmFsdWUpCi17Ci0gICBpbnQgc2hpZnQsIHZhbHVlOwotICAgcG5nX2J5dGVwIHNwLCBkcDsKLSAgIHBuZ191aW50XzMyIGk7Ci0gICBwbmdfdWludF8zMiByb3dfd2lkdGg9cm93X2luZm8tPndpZHRoOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19leHBhbmQiKTsKLQotICAgewotICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfdWludF8xNiBncmF5ID0gKHBuZ191aW50XzE2KSh0cmFuc192YWx1ZSA/IHRyYW5zX3ZhbHVlLT5ncmF5IDogMCk7Ci0KLSAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoIDwgOCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAocm93X2luZm8tPmJpdF9kZXB0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGdyYXkgPSAocG5nX3VpbnRfMTYpKChncmF5JjB4MDEpKjB4ZmYpOwotICAgICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDMpOwotICAgICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOwotICAgICAgICAgICAgICAgICAgc2hpZnQgPSA3IC0gKGludCkoKHJvd193aWR0aCArIDcpICYgMHgwNyk7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoKCpzcCA+PiBzaGlmdCkgJiAweDAxKQotICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gNykKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwLS07Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCsrOwotCi0gICAgICAgICAgICAgICAgICAgICBkcC0tOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGdyYXkgPSAocG5nX3VpbnRfMTYpKChncmF5JjB4MDMpKjB4NTUpOwotICAgICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDIpOwotICAgICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOwotICAgICAgICAgICAgICAgICAgc2hpZnQgPSAoaW50KSgoMyAtICgocm93X3dpZHRoICsgMykgJiAweDAzKSkgPDwgMSk7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgqc3AgPj4gc2hpZnQpICYgMHgwMzsKLSAgICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkodmFsdWUgfCAodmFsdWUgPDwgMikgfCAodmFsdWUgPDwgNCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlIDw8IDYpKTsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSA2KQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgc3AtLTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDI7Ci0KLSAgICAgICAgICAgICAgICAgICAgIGRwLS07Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZ3JheSA9IChwbmdfdWludF8xNikoKGdyYXkmMHgwZikqMHgxMSk7Ci0gICAgICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X3dpZHRoIC0gMSkgPj4gMSk7Ci0gICAgICAgICAgICAgICAgICBkcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAtIDE7Ci0gICAgICAgICAgICAgICAgICBzaGlmdCA9IChpbnQpKCgxIC0gKChyb3dfd2lkdGggKyAxKSAmIDB4MDEpKSA8PCAyKTsKLSAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKCpzcCA+PiBzaGlmdCkgJiAweDBmOwotICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSh2YWx1ZSB8ICh2YWx1ZSA8PCA0KSk7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gNCkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwLS07Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgIGRwLS07Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByb3dfaW5mby0+Yml0X2RlcHRoID0gODsKLSAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDg7Ci0gICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGg7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmICh0cmFuc192YWx1ZSAhPSBOVUxMKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGdyYXkgPSBncmF5ICYgMHhmZjsKLSAgICAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsKLSAgICAgICAgICAgICAgIGRwID0gcm93ICsgKHBuZ19zaXplX3QpKHJvd193aWR0aCA8PCAxKSAtIDE7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoKnNwID09IGdyYXkpCi0gICAgICAgICAgICAgICAgICAgICAqZHAtLSA9IDA7Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAqZHAtLSA9IDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGUgZ3JheV9oaWdoID0gKGdyYXkgPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgICAgcG5nX2J5dGUgZ3JheV9sb3cgPSBncmF5ICYgMHhmZjsKLSAgICAgICAgICAgICAgIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzIC0gMTsKLSAgICAgICAgICAgICAgIGRwID0gcm93ICsgKHJvd19pbmZvLT5yb3dieXRlcyA8PCAxKSAtIDE7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoKihzcCAtIDEpID09IGdyYXlfaGlnaCAmJiAqKHNwKSA9PSBncmF5X2xvdykKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICpkcC0tID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICpkcC0tID0gMDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICpkcC0tID0gMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICpkcC0tID0gMHhmZjsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07Ci0gICAgICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE7Ci0gICAgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSAyOwotICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKShyb3dfaW5mby0+Yml0X2RlcHRoIDw8IDEpOwotICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwKLSAgICAgICAgICAgICAgIHJvd193aWR0aCk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgJiYgdHJhbnNfdmFsdWUpCi0gICAgICB7Ci0gICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGUgcmVkID0gdHJhbnNfdmFsdWUtPnJlZCAmIDB4ZmY7Ci0gICAgICAgICAgICBwbmdfYnl0ZSBncmVlbiA9IHRyYW5zX3ZhbHVlLT5ncmVlbiAmIDB4ZmY7Ci0gICAgICAgICAgICBwbmdfYnl0ZSBibHVlID0gdHJhbnNfdmFsdWUtPmJsdWUgJiAweGZmOwotICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfaW5mby0+cm93Ynl0ZXMgLSAxOwotICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdCkocm93X3dpZHRoIDw8IDIpIC0gMTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmICgqKHNwIC0gMikgPT0gcmVkICYmICooc3AgLSAxKSA9PSBncmVlbiAmJiAqKHNwKSA9PSBibHVlKQotICAgICAgICAgICAgICAgICAgKmRwLS0gPSAwOwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgKmRwLS0gPSAweGZmOwotICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsKLSAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07Ci0gICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlIHJlZF9oaWdoID0gKHRyYW5zX3ZhbHVlLT5yZWQgPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgcG5nX2J5dGUgZ3JlZW5faGlnaCA9ICh0cmFuc192YWx1ZS0+Z3JlZW4gPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgcG5nX2J5dGUgYmx1ZV9oaWdoID0gKHRyYW5zX3ZhbHVlLT5ibHVlID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgIHBuZ19ieXRlIHJlZF9sb3cgPSB0cmFuc192YWx1ZS0+cmVkICYgMHhmZjsKLSAgICAgICAgICAgIHBuZ19ieXRlIGdyZWVuX2xvdyA9IHRyYW5zX3ZhbHVlLT5ncmVlbiAmIDB4ZmY7Ci0gICAgICAgICAgICBwbmdfYnl0ZSBibHVlX2xvdyA9IHRyYW5zX3ZhbHVlLT5ibHVlICYgMHhmZjsKLSAgICAgICAgICAgIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzIC0gMTsKLSAgICAgICAgICAgIGRwID0gcm93ICsgKHBuZ19zaXplX3QpKHJvd193aWR0aCA8PCAzKSAtIDE7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoKihzcCAtIDUpID09IHJlZF9oaWdoICYmCi0gICAgICAgICAgICAgICAgICAqKHNwIC0gNCkgPT0gcmVkX2xvdyAmJgotICAgICAgICAgICAgICAgICAgKihzcCAtIDMpID09IGdyZWVuX2hpZ2ggJiYKLSAgICAgICAgICAgICAgICAgICooc3AgLSAyKSA9PSBncmVlbl9sb3cgJiYKLSAgICAgICAgICAgICAgICAgICooc3AgLSAxKSA9PSBibHVlX2hpZ2ggJiYKLSAgICAgICAgICAgICAgICAgICooc3AgICAgKSA9PSBibHVlX2xvdykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICpkcC0tID0gMDsKLSAgICAgICAgICAgICAgICAgICpkcC0tID0gMDsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICpkcC0tID0gMHhmZjsKLSAgICAgICAgICAgICAgICAgICpkcC0tID0gMHhmZjsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07Ci0gICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOwotICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsKLSAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07Ci0gICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOwotICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOwotICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gNDsKLSAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkocm93X2luZm8tPmJpdF9kZXB0aCA8PCAyKTsKLSAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhyb3dfaW5mby0+cGl4ZWxfZGVwdGgsIHJvd193aWR0aCk7Ci0gICAgICB9Ci0gICB9Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRAotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9fcXVhbnRpemUocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKLSAgICBwbmdfYnl0ZXAgcGFsZXR0ZV9sb29rdXAsIHBuZ19ieXRlcCBxdWFudGl6ZV9sb29rdXApCi17Ci0gICBwbmdfYnl0ZXAgc3AsIGRwOwotICAgcG5nX3VpbnRfMzIgaTsKLSAgIHBuZ191aW50XzMyIHJvd193aWR0aD1yb3dfaW5mby0+d2lkdGg7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3F1YW50aXplIik7Ci0KLSAgIHsKLSAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgJiYKLSAgICAgICAgIHBhbGV0dGVfbG9va3VwICYmIHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgIHsKLSAgICAgICAgIGludCByLCBnLCBiLCBwOwotICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICBkcCA9IHJvdzsKLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHIgPSAqc3ArKzsKLSAgICAgICAgICAgIGcgPSAqc3ArKzsKLSAgICAgICAgICAgIGIgPSAqc3ArKzsKLQotICAgICAgICAgICAgLyogVGhpcyBsb29rcyByZWFsIG1lc3N5LCBidXQgdGhlIGNvbXBpbGVyIHdpbGwgcmVkdWNlCi0gICAgICAgICAgICAgKiBpdCBkb3duIHRvIGEgcmVhc29uYWJsZSBmb3JtdWxhLiAgRm9yIGV4YW1wbGUsIHdpdGgKLSAgICAgICAgICAgICAqIDUgYml0cyBwZXIgY29sb3IsIHdlIGdldDoKLSAgICAgICAgICAgICAqIHAgPSAoKChyID4+IDMpICYgMHgxZikgPDwgMTApIHwKLSAgICAgICAgICAgICAqICAgICgoKGcgPj4gMykgJiAweDFmKSA8PCA1KSB8Ci0gICAgICAgICAgICAgKiAgICAoKGIgPj4gMykgJiAweDFmKTsKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcCA9ICgoKHIgPj4gKDggLSBQTkdfUVVBTlRJWkVfUkVEX0JJVFMpKSAmCi0gICAgICAgICAgICAgICAoKDEgPDwgUE5HX1FVQU5USVpFX1JFRF9CSVRTKSAtIDEpKSA8PAotICAgICAgICAgICAgICAgKFBOR19RVUFOVElaRV9HUkVFTl9CSVRTICsgUE5HX1FVQU5USVpFX0JMVUVfQklUUykpIHwKLSAgICAgICAgICAgICAgICgoKGcgPj4gKDggLSBQTkdfUVVBTlRJWkVfR1JFRU5fQklUUykpICYKLSAgICAgICAgICAgICAgICgoMSA8PCBQTkdfUVVBTlRJWkVfR1JFRU5fQklUUykgLSAxKSkgPDwKLSAgICAgICAgICAgICAgIChQTkdfUVVBTlRJWkVfQkxVRV9CSVRTKSkgfAotICAgICAgICAgICAgICAgKChiID4+ICg4IC0gUE5HX1FVQU5USVpFX0JMVUVfQklUUykpICYKLSAgICAgICAgICAgICAgICgoMSA8PCBQTkdfUVVBTlRJWkVfQkxVRV9CSVRTKSAtIDEpKTsKLQotICAgICAgICAgICAgKmRwKysgPSBwYWxldHRlX2xvb2t1cFtwXTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURTsKLSAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDE7Ci0gICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSByb3dfaW5mby0+Yml0X2RlcHRoOwotICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwgcm93X3dpZHRoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSAmJgotICAgICAgICAgcGFsZXR0ZV9sb29rdXAgIT0gTlVMTCAmJiByb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICB7Ci0gICAgICAgICBpbnQgciwgZywgYiwgcDsKLSAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgZHAgPSByb3c7Ci0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICByID0gKnNwKys7Ci0gICAgICAgICAgICBnID0gKnNwKys7Ci0gICAgICAgICAgICBiID0gKnNwKys7Ci0gICAgICAgICAgICBzcCsrOwotCi0gICAgICAgICAgICBwID0gKCgociA+PiAoOCAtIFBOR19RVUFOVElaRV9SRURfQklUUykpICYKLSAgICAgICAgICAgICAgICgoMSA8PCBQTkdfUVVBTlRJWkVfUkVEX0JJVFMpIC0gMSkpIDw8Ci0gICAgICAgICAgICAgICAoUE5HX1FVQU5USVpFX0dSRUVOX0JJVFMgKyBQTkdfUVVBTlRJWkVfQkxVRV9CSVRTKSkgfAotICAgICAgICAgICAgICAgKCgoZyA+PiAoOCAtIFBOR19RVUFOVElaRV9HUkVFTl9CSVRTKSkgJgotICAgICAgICAgICAgICAgKCgxIDw8IFBOR19RVUFOVElaRV9HUkVFTl9CSVRTKSAtIDEpKSA8PAotICAgICAgICAgICAgICAgKFBOR19RVUFOVElaRV9CTFVFX0JJVFMpKSB8Ci0gICAgICAgICAgICAgICAoKGIgPj4gKDggLSBQTkdfUVVBTlRJWkVfQkxVRV9CSVRTKSkgJgotICAgICAgICAgICAgICAgKCgxIDw8IFBOR19RVUFOVElaRV9CTFVFX0JJVFMpIC0gMSkpOwotCi0gICAgICAgICAgICAqZHArKyA9IHBhbGV0dGVfbG9va3VwW3BdOwotICAgICAgICAgfQotICAgICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFOwotICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gMTsKLSAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IHJvd19pbmZvLT5iaXRfZGVwdGg7Ci0gICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8tPnBpeGVsX2RlcHRoLCByb3dfd2lkdGgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAmJgotICAgICAgICAgcXVhbnRpemVfbG9va3VwICYmIHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgIHsKLSAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCsrKQotICAgICAgICAgewotICAgICAgICAgICAgKnNwID0gcXVhbnRpemVfbG9va3VwWypzcF07Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKLXN0YXRpYyBQTkdfQ09OU1QgaW50IHBuZ19nYW1tYV9zaGlmdFtdID0KLSAgIHsweDEwLCAweDIxLCAweDQyLCAweDg0LCAweDExMCwgMHgyNDgsIDB4NTUwLCAweGZmMCwgMHgwMH07Ci0KLS8qIFdlIGJ1aWxkIHRoZSA4LSBvciAxNi1iaXQgZ2FtbWEgdGFibGVzIGhlcmUuICBOb3RlIHRoYXQgZm9yIDE2LWJpdAotICogdGFibGVzLCB3ZSBkb24ndCBtYWtlIGEgZnVsbCB0YWJsZSBpZiB3ZSBhcmUgcmVkdWNpbmcgdG8gOC1iaXQgaW4KLSAqIHRoZSBmdXR1cmUuICBOb3RlIGFsc28gaG93IHRoZSBnYW1tYV8xNiB0YWJsZXMgYXJlIHNlZ21lbnRlZCBzbyB0aGF0Ci0gKiB3ZSBkb24ndCBuZWVkIHRvIGFsbG9jYXRlID4gNjRLIGNodW5rcyBmb3IgYSBmdWxsIDE2LWJpdCB0YWJsZS4KLSAqCi0gKiBTZWUgdGhlIFBORyBleHRlbnNpb25zIGRvY3VtZW50IGZvciBhbiBpbnRlZ2VyIGFsZ29yaXRobSBmb3IgY3JlYXRpbmcKLSAqIHRoZSBnYW1tYSB0YWJsZXMuICBNYXliZSB3ZSB3aWxsIGltcGxlbWVudCB0aGF0IGhlcmUgc29tZWRheS4KLSAqCi0gKiBXZSBzaG91bGQgb25seSByZWFjaCB0aGlzIHBvaW50IGlmCi0gKgotICogICAgICB0aGUgZmlsZV9nYW1tYSBpcyBrbm93biAoaS5lLiwgdGhlIGdBTUEgb3Igc1JHQiBjaHVuayBpcyBwcmVzZW50LAotICogICAgICBvciB0aGUgYXBwbGljYXRpb24gaGFzIHByb3ZpZGVkIGEgZmlsZV9nYW1tYSkKLSAqCi0gKiAgIEFORAotICogICAgICB7Ci0gKiAgICAgICAgIHRoZSBzY3JlZW5fZ2FtbWEgaXMga25vd24KLSAqCi0gKiAgICAgIE9SCi0gKgotICogICAgICAgICBSR0JfdG9fZ3JheSB0cmFuc2Zvcm1hdGlvbiBpcyBiZWluZyBwZXJmb3JtZWQKLSAqICAgICAgfQotICoKLSAqICAgQU5ECi0gKiAgICAgIHsKLSAqICAgICAgICAgdGhlIHNjcmVlbl9nYW1tYSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgcmVjaXByb2NhbCBvZiB0aGUKLSAqICAgICAgICAgZmlsZV9nYW1tYSBieSBtb3JlIHRoYW4gdGhlIHNwZWNpZmllZCB0aHJlc2hvbGQKLSAqCi0gKiAgICAgIE9SCi0gKgotICogICAgICAgICBhIGJhY2tncm91bmQgY29sb3IgaGFzIGJlZW4gc3BlY2lmaWVkIGFuZCB0aGUgZmlsZV9nYW1tYQotICogICAgICAgICBhbmQgc2NyZWVuX2dhbW1hIGFyZSBub3QgMS4wLCB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aHJlc2hvbGQuCi0gKiAgICAgIH0KLSAqLwotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19idWlsZF9nYW1tYV90YWJsZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZSBiaXRfZGVwdGgpCi17Ci0gIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2J1aWxkX2dhbW1hX3RhYmxlIik7Ci0KLSAgaWYgKGJpdF9kZXB0aCA8PSA4KQotICB7Ci0gICAgIGludCBpOwotICAgICBkb3VibGUgZzsKLQotICAgICBpZiAocG5nX3B0ci0+c2NyZWVuX2dhbW1hID4gLjAwMDAwMSkKLSAgICAgICAgZyA9IDEuMCAvIChwbmdfcHRyLT5nYW1tYSAqIHBuZ19wdHItPnNjcmVlbl9nYW1tYSk7Ci0KLSAgICAgZWxzZQotICAgICAgICBnID0gMS4wOwotCi0gICAgIHBuZ19wdHItPmdhbW1hX3RhYmxlID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgIChwbmdfdWludF8zMikyNTYpOwotCi0gICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICAgewotICAgICAgICBwbmdfcHRyLT5nYW1tYV90YWJsZVtpXSA9IChwbmdfYnl0ZSkocG93KChkb3VibGUpaSAvIDI1NS4wLAotICAgICAgICAgICBnKSAqIDI1NS4wICsgLjUpOwotICAgICB9Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSB8fCBcCi0gICBkZWZpbmVkKFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRCkKLSAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmICgoUE5HX0JBQ0tHUk9VTkQpIHwgUE5HX1JHQl9UT19HUkFZKSkKLSAgICAgewotCi0gICAgICAgIGcgPSAxLjAgLyAocG5nX3B0ci0+Z2FtbWEpOwotCi0gICAgICAgIHBuZ19wdHItPmdhbW1hX3RvXzEgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgKHBuZ191aW50XzMyKTI1Nik7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3RvXzFbaV0gPSAocG5nX2J5dGUpKHBvdygoZG91YmxlKWkgLyAyNTUuMCwKLSAgICAgICAgICAgICAgZykgKiAyNTUuMCArIC41KTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcG5nX3B0ci0+Z2FtbWFfZnJvbV8xID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAgIChwbmdfdWludF8zMikyNTYpOwotCi0gICAgICAgIGlmIChwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgPiAwLjAwMDAwMSkKLSAgICAgICAgICAgZyA9IDEuMCAvIHBuZ19wdHItPnNjcmVlbl9nYW1tYTsKLQotICAgICAgICBlbHNlCi0gICAgICAgICAgIGcgPSBwbmdfcHRyLT5nYW1tYTsgICAvKiBQcm9iYWJseSBkb2luZyByZ2JfdG9fZ3JheSAqLwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV9mcm9tXzFbaV0gPSAocG5nX2J5dGUpKHBvdygoZG91YmxlKWkgLyAyNTUuMCwKLSAgICAgICAgICAgICAgZykgKiAyNTUuMCArIC41KTsKLQotICAgICAgICB9Ci0gICAgIH0KLSNlbmRpZiAvKiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCB8fCBQTkdfUkdCX1RPX0dSQVlfU1VQUE9SVEVEICovCi0gIH0KLSAgZWxzZQotICB7Ci0gICAgIGRvdWJsZSBnOwotICAgICBpbnQgaSwgaiwgc2hpZnQsIG51bTsKLSAgICAgaW50IHNpZ19iaXQ7Ci0gICAgIHBuZ191aW50XzMyIGlnOwotCi0gICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCi0gICAgIHsKLSAgICAgICAgc2lnX2JpdCA9IChpbnQpcG5nX3B0ci0+c2lnX2JpdC5yZWQ7Ci0KLSAgICAgICAgaWYgKChpbnQpcG5nX3B0ci0+c2lnX2JpdC5ncmVlbiA+IHNpZ19iaXQpCi0gICAgICAgICAgIHNpZ19iaXQgPSBwbmdfcHRyLT5zaWdfYml0LmdyZWVuOwotCi0gICAgICAgIGlmICgoaW50KXBuZ19wdHItPnNpZ19iaXQuYmx1ZSA+IHNpZ19iaXQpCi0gICAgICAgICAgIHNpZ19iaXQgPSBwbmdfcHRyLT5zaWdfYml0LmJsdWU7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgIHNpZ19iaXQgPSAoaW50KXBuZ19wdHItPnNpZ19iaXQuZ3JheTsKLSAgICAgfQotCi0gICAgIGlmIChzaWdfYml0ID4gMCkKLSAgICAgICAgc2hpZnQgPSAxNiAtIHNpZ19iaXQ7Ci0KLSAgICAgZWxzZQotICAgICAgICBzaGlmdCA9IDA7Ci0KLSAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR18xNl9UT184KQotICAgICB7Ci0gICAgICAgIGlmIChzaGlmdCA8ICgxNiAtIFBOR19NQVhfR0FNTUFfOCkpCi0gICAgICAgICAgIHNoaWZ0ID0gKDE2IC0gUE5HX01BWF9HQU1NQV84KTsKLSAgICAgfQotCi0gICAgIGlmIChzaGlmdCA+IDgpCi0gICAgICAgIHNoaWZ0ID0gODsKLQotICAgICBpZiAoc2hpZnQgPCAwKQotICAgICAgICBzaGlmdCA9IDA7Ci0KLSAgICAgcG5nX3B0ci0+Z2FtbWFfc2hpZnQgPSAocG5nX2J5dGUpc2hpZnQ7Ci0KLSAgICAgbnVtID0gKDEgPDwgKDggLSBzaGlmdCkpOwotCi0gICAgIGlmIChwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgPiAuMDAwMDAxKQotICAgICAgICBnID0gMS4wIC8gKHBuZ19wdHItPmdhbW1hICogcG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsKLSAgICAgZWxzZQotICAgICAgICBnID0gMS4wOwotCi0gICAgIHBuZ19wdHItPmdhbW1hXzE2X3RhYmxlID0gKHBuZ191aW50XzE2cHApcG5nX2NhbGxvYyhwbmdfcHRyLAotICAgICAgICAocG5nX3VpbnRfMzIpKG51bSAqIHBuZ19zaXplb2YocG5nX3VpbnRfMTZwKSkpOwotCi0gICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiAoUE5HXzE2X1RPXzggfCBQTkdfQkFDS0dST1VORCkpCi0gICAgIHsKLSAgICAgICAgZG91YmxlIGZpbiwgZm91dDsKLSAgICAgICAgcG5nX3VpbnRfMzIgbGFzdCwgbWF4OwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKLSAgICAgICAgewotICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV8xNl90YWJsZVtpXSA9IChwbmdfdWludF8xNnApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgICAocG5nX3VpbnRfMzIpKDI1NiAqIHBuZ19zaXplb2YocG5nX3VpbnRfMTYpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBnID0gMS4wIC8gZzsKLSAgICAgICAgbGFzdCA9IDA7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICBmb3V0ID0gKChkb3VibGUpaSArIDAuNSkgLyAyNTYuMDsKLSAgICAgICAgICAgZmluID0gcG93KGZvdXQsIGcpOwotICAgICAgICAgICBtYXggPSAocG5nX3VpbnRfMzIpKGZpbiAqIChkb3VibGUpKChwbmdfdWludF8zMiludW0gPDwgOCkpOwotICAgICAgICAgICB3aGlsZSAobGFzdCA8PSBtYXgpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfdGFibGVbKGludCkobGFzdCAmICgweGZmID4+IHNoaWZ0KSldCi0gICAgICAgICAgICAgICAgIFsoaW50KShsYXN0ID4+ICg4IC0gc2hpZnQpKV0gPSAocG5nX3VpbnRfMTYpKAotICAgICAgICAgICAgICAgICAocG5nX3VpbnRfMTYpaSB8ICgocG5nX3VpbnRfMTYpaSA8PCA4KSk7Ci0gICAgICAgICAgICAgIGxhc3QrKzsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChsYXN0IDwgKChwbmdfdWludF8zMiludW0gPDwgOCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfdGFibGVbKGludCkobGFzdCAmICgweGZmID4+IHNoaWZ0KSldCi0gICAgICAgICAgICAgIFsoaW50KShsYXN0ID4+ICg4IC0gc2hpZnQpKV0gPSAocG5nX3VpbnRfMTYpNjU1MzVMOwotICAgICAgICAgICBsYXN0Kys7Ci0gICAgICAgIH0KLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X3RhYmxlW2ldID0gKHBuZ191aW50XzE2cClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAgICAgIChwbmdfdWludF8zMikoMjU2ICogcG5nX3NpemVvZihwbmdfdWludF8xNikpKTsKLQotICAgICAgICAgICBpZyA9ICgoKHBuZ191aW50XzMyKWkgKiAocG5nX3VpbnRfMzIpcG5nX2dhbW1hX3NoaWZ0W3NoaWZ0XSkgPj4gNCk7Ci0KLSAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X3RhYmxlW2ldW2pdID0KLSAgICAgICAgICAgICAgICAgKHBuZ191aW50XzE2KShwb3coKGRvdWJsZSkoaWcgKyAoKHBuZ191aW50XzMyKWogPDwgOCkpIC8KLSAgICAgICAgICAgICAgICAgICAgNjU1MzUuMCwgZykgKiA2NTUzNS4wICsgLjUpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgfQotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgfHwgXAotICAgZGVmaW5lZChQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQpCi0gICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiAoUE5HX0JBQ0tHUk9VTkQgfCBQTkdfUkdCX1RPX0dSQVkpKQotICAgICB7Ci0KLSAgICAgICAgZyA9IDEuMCAvIChwbmdfcHRyLT5nYW1tYSk7Ci0KLSAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMSA9IChwbmdfdWludF8xNnBwKXBuZ19jYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgKHBuZ191aW50XzMyKShudW0gKiBwbmdfc2l6ZW9mKHBuZ191aW50XzE2cCApKSk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X3RvXzFbaV0gPSAocG5nX3VpbnRfMTZwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgICAgKHBuZ191aW50XzMyKSgyNTYgKiBwbmdfc2l6ZW9mKHBuZ191aW50XzE2KSkpOwotCi0gICAgICAgICAgIGlnID0gKCgocG5nX3VpbnRfMzIpaSAqCi0gICAgICAgICAgICAgIChwbmdfdWludF8zMilwbmdfZ2FtbWFfc2hpZnRbc2hpZnRdKSA+PiA0KTsKLSAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X3RvXzFbaV1bal0gPQotICAgICAgICAgICAgICAgICAocG5nX3VpbnRfMTYpKHBvdygoZG91YmxlKShpZyArICgocG5nX3VpbnRfMzIpaiA8PCA4KSkgLwotICAgICAgICAgICAgICAgICAgICA2NTUzNS4wLCBnKSAqIDY1NTM1LjAgKyAuNSk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgPiAwLjAwMDAwMSkKLSAgICAgICAgICAgZyA9IDEuMCAvIHBuZ19wdHItPnNjcmVlbl9nYW1tYTsKLQotICAgICAgICBlbHNlCi0gICAgICAgICAgIGcgPSBwbmdfcHRyLT5nYW1tYTsgICAvKiBQcm9iYWJseSBkb2luZyByZ2JfdG9fZ3JheSAqLwotCi0gICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMSA9IChwbmdfdWludF8xNnBwKXBuZ19jYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgKHBuZ191aW50XzMyKShudW0gKiBwbmdfc2l6ZW9mKHBuZ191aW50XzE2cCkpKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfZnJvbV8xW2ldID0gKHBuZ191aW50XzE2cClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAgICAgIChwbmdfdWludF8zMikoMjU2ICogcG5nX3NpemVvZihwbmdfdWludF8xNikpKTsKLQotICAgICAgICAgICBpZyA9ICgoKHBuZ191aW50XzMyKWkgKgotICAgICAgICAgICAgICAocG5nX3VpbnRfMzIpcG5nX2dhbW1hX3NoaWZ0W3NoaWZ0XSkgPj4gNCk7Ci0KLSAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMVtpXVtqXSA9Ci0gICAgICAgICAgICAgICAgIChwbmdfdWludF8xNikocG93KChkb3VibGUpKGlnICsgKChwbmdfdWludF8zMilqIDw8IDgpKSAvCi0gICAgICAgICAgICAgICAgICAgIDY1NTM1LjAsIGcpICogNjU1MzUuMCArIC41KTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgIH0KLSNlbmRpZiAvKiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCB8fCBQTkdfUkdCX1RPX0dSQVlfU1VQUE9SVEVEICovCi0gIH0KLX0KLSNlbmRpZgotLyogVG8gZG86IGluc3RhbGwgaW50ZWdlciB2ZXJzaW9uIG9mIHBuZ19idWlsZF9nYW1tYV90YWJsZSBoZXJlICovCi0jZW5kaWYKLQotI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECi0vKiBVbmRvZXMgaW50cmFwaXhlbCBkaWZmZXJlbmNpbmcgICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb19yZWFkX2ludHJhcGl4ZWwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3JlYWRfaW50cmFwaXhlbCIpOwotCi0gICBpZiAoCi0gICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKQotICAgewotICAgICAgaW50IGJ5dGVzX3Blcl9waXhlbDsKLSAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKLSAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICB7Ci0gICAgICAgICBwbmdfYnl0ZXAgcnA7Ci0gICAgICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gMzsKLQotICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gNDsKLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSBieXRlc19wZXJfcGl4ZWwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAqKHJwKSA9IChwbmdfYnl0ZSkoKDI1NiArICpycCArICoocnArMSkpJjB4ZmYpOwotICAgICAgICAgICAgKihycCsyKSA9IChwbmdfYnl0ZSkoKDI1NiArICoocnArMikgKyAqKHJwKzEpKSYweGZmKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCi0gICAgICB7Ci0gICAgICAgICBwbmdfYnl0ZXAgcnA7Ci0gICAgICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gNjsKLQotICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gODsKLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSBieXRlc19wZXJfcGl4ZWwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBzMCAgID0gKCoocnAgICAgKSA8PCA4KSB8ICoocnAgKyAxKTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHMxICAgPSAoKihycCArIDIpIDw8IDgpIHwgKihycCArIDMpOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgczIgICA9ICgqKHJwICsgNCkgPDwgOCkgfCAqKHJwICsgNSk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByZWQgID0gKHBuZ191aW50XzMyKSgoczAgKyBzMSArIDY1NTM2TCkgJiAweGZmZmZMKTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGJsdWUgPSAocG5nX3VpbnRfMzIpKChzMiArIHMxICsgNjU1MzZMKSAmIDB4ZmZmZkwpOwotICAgICAgICAgICAgKihycCAgKSA9IChwbmdfYnl0ZSkoKHJlZCA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgKihycCsxKSA9IChwbmdfYnl0ZSkocmVkICYgMHhmZik7Ci0gICAgICAgICAgICAqKHJwKzQpID0gKHBuZ19ieXRlKSgoYmx1ZSA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgKihycCs1KSA9IChwbmdfYnl0ZSkoYmx1ZSAmIDB4ZmYpOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotfQotI2VuZGlmIC8qIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEICovCi0jZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3BuZ3J1dGlsLmMgYi9zcmMvbGlicG5nL3BuZ3J1dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwY2I2ZjIuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9wbmdydXRpbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQzMCArMCwwIEBACi0KLS8qIHBuZ3J1dGlsLmMgLSB1dGlsaXRpZXMgdG8gcmVhZCBhIFBORyBmaWxlCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjQuMTAgW01hcmNoIDgsIDIwMTJdCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMiBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQotICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQotICoKLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0gKiBhbmQgbGljZW5zZSBpbiBwbmcuaAotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0aGF0IGFyZSBvbmx5IGNhbGxlZCBmcm9tIHdpdGhpbgotICogbGlicG5nIGl0c2VsZiBkdXJpbmcgdGhlIGNvdXJzZSBvZiByZWFkaW5nIGFuIGltYWdlLgotICovCi0KLSNkZWZpbmUgUE5HX05PX1BFREFOVElDX1dBUk5JTkdTCi0jaW5jbHVkZSAicG5nLmgiCi0jaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECi0jaW5jbHVkZSAicG5ncHJpdi5oIgotCi0jICAgIGRlZmluZSBwbmdfc3RydG9kKHAsYSxiKSBzdHJ0b2QoYSxiKQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X3VpbnRfMzEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGJ1ZikKLXsKLSAgIHBuZ191aW50XzMyIHZhbCA9IHBuZ19nZXRfdWludF8zMihidWYpOwotCi0gICBpZiAodmFsID4gUE5HX1VJTlRfMzFfTUFYKQotICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlBORyB1bnNpZ25lZCBpbnRlZ2VyIG91dCBvZiByYW5nZSIpOwotICAgcmV0dXJuICh2YWwpOwotfQotCi0jaWZuZGVmIFBOR19VU0VfUkVBRF9NQUNST1MKLS8qIFRoZSBwYXJlbnRoZXNlcyBhcm91bmQgIlBOR0FQSSBmdW5jdGlvbl9uYW1lIiBpbiB0aGUgZm9sbG93aW5nIHRocmVlCi0gKiBmdW5jdGlvbnMgYXJlIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZXkgYWxsb3cgdGhlIG1hY3JvcyB0byBjby1leGlzdCB3aXRoCi0gKiB0aGVzZSAodW51c2VkIGJ1dCBleHBvcnRlZCkgZnVuY3Rpb25zLgotICovCi0KLS8qIEdyYWIgYW4gdW5zaWduZWQgMzItYml0IGludGVnZXIgZnJvbSBhIGJ1ZmZlciBpbiBiaWctZW5kaWFuIGZvcm1hdC4gKi8KLXBuZ191aW50XzMyIChQTkdBUEkKLXBuZ19nZXRfdWludF8zMikocG5nX2J5dGVwIGJ1ZikKLXsKLSAgIHBuZ191aW50XzMyIHV2YWwgPSBwbmdfZ2V0X3VpbnRfMzIoYnVmKTsKLSAgIGlmICgodXZhbCAmIDB4ODAwMDAwMDBMKSA9PSAwKSAvKiBub24tbmVnYXRpdmUgKi8KLSAgICAgIHJldHVybiB1dmFsOwotCi0gICB1dmFsID0gKHV2YWwgXiAweGZmZmZmZmZmTCkgKyAxOyAgLyogMidzIGNvbXBsZW1lbnQ6IC14ID0gfngrMSAqLwotICAgcmV0dXJuIC0ocG5nX2ludF8zMil1dmFsOwotfQotCi0vKiBHcmFiIGEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIGZyb20gYSBidWZmZXIgaW4gYmlnLWVuZGlhbiBmb3JtYXQuICBUaGUKLSAqIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBQTkcgZmlsZSBpbiB0d28ncyBjb21wbGVtZW50IGZvcm1hdCBhbmQgdGhlcmUKLSAqIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGEgJ3BuZ19pbnRfMzInIGlzIGV4YWN0bHkgMzIgYml0cywgdGhlcmVmb3JlCi0gKiB0aGUgZm9sbG93aW5nIGNvZGUgZG9lcyBhIHR3bydzIGNvbXBsZW1lbnQgdG8gbmF0aXZlIGNvbnZlcnNpb24uCi0gKi8KLXBuZ19pbnRfMzIgKFBOR0FQSQotcG5nX2dldF9pbnRfMzIpKHBuZ19ieXRlcCBidWYpCi17Ci0gICBwbmdfdWludF8zMiB1dmFsID0gcG5nX2dldF91aW50XzMyKGJ1Zik7Ci0gICBpZiAoKHV2YWwgJiAweDgwMDAwMDAwTCkgPT0gMCkgLyogbm9uLW5lZ2F0aXZlICovCi0gICAgICByZXR1cm4gdXZhbDsKLQotICAgdXZhbCA9ICh1dmFsIF4gMHhmZmZmZmZmZkwpICsgMTsgIC8qIDIncyBjb21wbGVtZW50OiAteCA9IH54KzEgKi8KLSAgIHJldHVybiAtKHBuZ19pbnRfMzIpdXZhbDsKLX0KLQotLyogR3JhYiBhbiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlciBmcm9tIGEgYnVmZmVyIGluIGJpZy1lbmRpYW4gZm9ybWF0LiAqLwotcG5nX3VpbnRfMTYgKFBOR0FQSQotcG5nX2dldF91aW50XzE2KShwbmdfYnl0ZXAgYnVmKQotewotICAgLyogQU5TSS1DIHJlcXVpcmVzIGFuIGludCB2YWx1ZSB0byBhY2NvbW9kYXRlIGF0IGxlYXN0IDE2IGJpdHMgc28gdGhpcwotICAgICogd29ya3MgYW5kIGFsbG93cyB0aGUgY29tcGlsZXIgbm90IHRvIHdvcnJ5IGFib3V0IHBvc3NpYmxlIG5hcnJvd2luZwotICAgICogb24gMzIgYml0IHN5c3RlbXMuICAoUHJlLUFOU0kgc3lzdGVtcyBkaWQgbm90IG1ha2UgaW50ZWdlcnMgc21hbGxlcgotICAgICogdGhhbiAxNiBiaXRzIGVpdGhlci4pCi0gICAgKi8KLSAgIHVuc2lnbmVkIGludCB2YWwgPQotICAgICAgICgodW5zaWduZWQgaW50KSgqYnVmKSA8PCA4KSArCi0gICAgICAgKCh1bnNpZ25lZCBpbnQpKCooYnVmICsgMSkpKTsKLQotICAgcmV0dXJuIChwbmdfdWludF8xNil2YWw7Ci19Ci0jZW5kaWYgLyogUE5HX1VTRV9SRUFEX01BQ1JPUyAqLwotCi0vKiBSZWFkIGFuZCBjaGVjayB0aGUgUE5HIGZpbGUgc2lnbmF0dXJlICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19yZWFkX3NpZyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBwbmdfc2l6ZV90IG51bV9jaGVja2VkLCBudW1fdG9fY2hlY2s7Ci0KLSAgIC8qIEV4aXQgaWYgdGhlIHVzZXIgYXBwbGljYXRpb24gZG9lcyBub3QgZXhwZWN0IGEgc2lnbmF0dXJlLiAqLwotICAgaWYgKHBuZ19wdHItPnNpZ19ieXRlcyA+PSA4KQotICAgICAgcmV0dXJuOwotCi0gICBudW1fY2hlY2tlZCA9IHBuZ19wdHItPnNpZ19ieXRlczsKLSAgIG51bV90b19jaGVjayA9IDggLSBudW1fY2hlY2tlZDsKLQotI2lmZGVmIFBOR19JT19TVEFURV9TVVBQT1JURUQKLSAgIHBuZ19wdHItPmlvX3N0YXRlID0gUE5HX0lPX1JFQURJTkcgfCBQTkdfSU9fU0lHTkFUVVJFOwotI2VuZGlmCi0KLSAgIC8qIFRoZSBzaWduYXR1cmUgbXVzdCBiZSBzZXJpYWxpemVkIGluIGEgc2luZ2xlIEkvTyBjYWxsLiAqLwotICAgcG5nX3JlYWRfZGF0YShwbmdfcHRyLCAmKGluZm9fcHRyLT5zaWduYXR1cmVbbnVtX2NoZWNrZWRdKSwgbnVtX3RvX2NoZWNrKTsKLSAgIHBuZ19wdHItPnNpZ19ieXRlcyA9IDg7Ci0KLSAgIGlmIChwbmdfc2lnX2NtcChpbmZvX3B0ci0+c2lnbmF0dXJlLCBudW1fY2hlY2tlZCwgbnVtX3RvX2NoZWNrKSkKLSAgIHsKLSAgICAgIGlmIChudW1fY2hlY2tlZCA8IDQgJiYKLSAgICAgICAgICBwbmdfc2lnX2NtcChpbmZvX3B0ci0+c2lnbmF0dXJlLCBudW1fY2hlY2tlZCwgbnVtX3RvX2NoZWNrIC0gNCkpCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk5vdCBhIFBORyBmaWxlIik7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiUE5HIGZpbGUgY29ycnVwdGVkIGJ5IEFTQ0lJIGNvbnZlcnNpb24iKTsKLSAgIH0KLSAgIGlmIChudW1fY2hlY2tlZCA8IDMpCi0gICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX1BOR19TSUdOQVRVUkU7Ci19Ci0KLS8qIFJlYWQgdGhlIGNodW5rIGhlYWRlciAobGVuZ3RoICsgdHlwZSBuYW1lKS4KLSAqIFB1dCB0aGUgdHlwZSBuYW1lIGludG8gcG5nX3B0ci0+Y2h1bmtfbmFtZSwgYW5kIHJldHVybiB0aGUgbGVuZ3RoLgotICovCi1wbmdfdWludF8zMiAvKiBQUklWQVRFICovCi1wbmdfcmVhZF9jaHVua19oZWFkZXIocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19ieXRlIGJ1Zls4XTsKLSAgIHBuZ191aW50XzMyIGxlbmd0aDsKLQotI2lmZGVmIFBOR19JT19TVEFURV9TVVBQT1JURUQKLSAgIHBuZ19wdHItPmlvX3N0YXRlID0gUE5HX0lPX1JFQURJTkcgfCBQTkdfSU9fQ0hVTktfSERSOwotI2VuZGlmCi0KLSAgIC8qIFJlYWQgdGhlIGxlbmd0aCBhbmQgdGhlIGNodW5rIG5hbWUuCi0gICAgKiBUaGlzIG11c3QgYmUgcGVyZm9ybWVkIGluIGEgc2luZ2xlIEkvTyBjYWxsLgotICAgICovCi0gICBwbmdfcmVhZF9kYXRhKHBuZ19wdHIsIGJ1ZiwgOCk7Ci0gICBsZW5ndGggPSBwbmdfZ2V0X3VpbnRfMzEocG5nX3B0ciwgYnVmKTsKLQotICAgLyogUHV0IHRoZSBjaHVuayBuYW1lIGludG8gcG5nX3B0ci0+Y2h1bmtfbmFtZS4gKi8KLSAgIHBuZ19tZW1jcHkocG5nX3B0ci0+Y2h1bmtfbmFtZSwgYnVmICsgNCwgNCk7Ci0KLSAgIHBuZ19kZWJ1ZzIoMCwgIlJlYWRpbmcgJXMgY2h1bmssIGxlbmd0aCA9ICVsdSIsCi0gICAgICBwbmdfcHRyLT5jaHVua19uYW1lLCAodW5zaWduZWQgbG9uZylsZW5ndGgpOwotCi0gICAvKiBSZXNldCB0aGUgY3JjIGFuZCBydW4gaXQgb3ZlciB0aGUgY2h1bmsgbmFtZS4gKi8KLSAgIHBuZ19yZXNldF9jcmMocG5nX3B0cik7Ci0gICBwbmdfY2FsY3VsYXRlX2NyYyhwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19uYW1lLCA0KTsKLQotICAgLyogQ2hlY2sgdG8gc2VlIGlmIGNodW5rIG5hbWUgaXMgdmFsaWQuICovCi0gICBwbmdfY2hlY2tfY2h1bmtfbmFtZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19uYW1lKTsKLQotI2lmZGVmIFBOR19JT19TVEFURV9TVVBQT1JURUQKLSAgIC8qIEl0IGlzIHVuc3BlY2lmaWVkIGhvdyBtYW55IEkvTyBjYWxscyB3aWxsIGJlIHBlcmZvcm1lZAotICAgICogZHVyaW5nIHRoZSBzZXJpYWxpemF0aW9uIG9mIHRoZSBjaHVuayBkYXRhLgotICAgICovCi0gICBwbmdfcHRyLT5pb19zdGF0ZSA9IFBOR19JT19SRUFESU5HIHwgUE5HX0lPX0NIVU5LX0RBVEE7Ci0jZW5kaWYKLQotICAgcmV0dXJuIGxlbmd0aDsKLX0KLQotLyogUmVhZCBkYXRhLCBhbmQgKG9wdGlvbmFsbHkpIHJ1biBpdCB0aHJvdWdoIHRoZSBDUkMuICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19jcmNfcmVhZChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIHBuZ19yZWFkX2RhdGEocG5nX3B0ciwgYnVmLCBsZW5ndGgpOwotICAgcG5nX2NhbGN1bGF0ZV9jcmMocG5nX3B0ciwgYnVmLCBsZW5ndGgpOwotfQotCi0vKiBPcHRpb25hbGx5IHNraXAgZGF0YSBhbmQgdGhlbiBjaGVjayB0aGUgQ1JDLiAgRGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UKLSAqIGFyZSByZWFkaW5nIGEgYW5jaWxsYXJ5IG9yIGNyaXRpY2FsIGNodW5rLCBhbmQgaG93IHRoZSBwcm9ncmFtIGhhcyBzZXQKLSAqIHRoaW5ncyB1cCwgd2UgbWF5IGNhbGN1bGF0ZSB0aGUgQ1JDIG9uIHRoZSBkYXRhIGFuZCBwcmludCBhIG1lc3NhZ2UuCi0gKiBSZXR1cm5zICcxJyBpZiB0aGVyZSB3YXMgYSBDUkMgZXJyb3IsICcwJyBvdGhlcndpc2UuCi0gKi8KLWludCAvKiBQUklWQVRFICovCi1wbmdfY3JjX2ZpbmlzaChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiBza2lwKQotewotICAgcG5nX3NpemVfdCBpOwotICAgcG5nX3NpemVfdCBpc3RvcCA9IHBuZ19wdHItPnpidWZfc2l6ZTsKLQotICAgZm9yIChpID0gKHBuZ19zaXplX3Qpc2tpcDsgaSA+IGlzdG9wOyBpIC09IGlzdG9wKQotICAgewotICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIHBuZ19wdHItPnpidWYsIHBuZ19wdHItPnpidWZfc2l6ZSk7Ci0gICB9Ci0KLSAgIGlmIChpKQotICAgewotICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIHBuZ19wdHItPnpidWYsIGkpOwotICAgfQotCi0gICBpZiAocG5nX2NyY19lcnJvcihwbmdfcHRyKSkKLSAgIHsKLSAgICAgIGlmICgoKHBuZ19wdHItPmNodW5rX25hbWVbMF0gJiAweDIwKSAmJiAgICAgICAgICAgICAgICAvKiBBbmNpbGxhcnkgKi8KLSAgICAgICAgICAhKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9OT1dBUk4pKSB8fAotICAgICAgICAgICghKHBuZ19wdHItPmNodW5rX25hbWVbMF0gJiAweDIwKSAmJiAgICAgICAgICAgICAvKiBDcml0aWNhbCAgKi8KLSAgICAgICAgICAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19DUkNfQ1JJVElDQUxfVVNFKSkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfY2h1bmtfd2FybmluZyhwbmdfcHRyLCAiQ1JDIGVycm9yIik7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIkNSQyBlcnJvciIpOwotICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuICgxKTsKLSAgIH0KLQotICAgcmV0dXJuICgwKTsKLX0KLQotLyogQ29tcGFyZSB0aGUgQ1JDIHN0b3JlZCBpbiB0aGUgUE5HIGZpbGUgd2l0aCB0aGF0IGNhbGN1bGF0ZWQgYnkgbGlicG5nIGZyb20KLSAqIHRoZSBkYXRhIGl0IGhhcyByZWFkIHRodXMgZmFyLgotICovCi1pbnQgLyogUFJJVkFURSAqLwotcG5nX2NyY19lcnJvcihwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2J5dGUgY3JjX2J5dGVzWzRdOwotICAgcG5nX3VpbnRfMzIgY3JjOwotICAgaW50IG5lZWRfY3JjID0gMTsKLQotICAgaWYgKHBuZ19wdHItPmNodW5rX25hbWVbMF0gJiAweDIwKSAgICAgICAgICAgICAgICAgICAgIC8qIGFuY2lsbGFyeSAqLwotICAgewotICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTUFTSykgPT0KLSAgICAgICAgICAoUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9VU0UgfCBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX05PV0FSTikpCi0gICAgICAgICBuZWVkX2NyYyA9IDA7Ci0gICB9Ci0KLSAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JpdGljYWwgKi8KLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19DUklUSUNBTF9JR05PUkUpCi0gICAgICAgICBuZWVkX2NyYyA9IDA7Ci0gICB9Ci0KLSNpZmRlZiBQTkdfSU9fU1RBVEVfU1VQUE9SVEVECi0gICBwbmdfcHRyLT5pb19zdGF0ZSA9IFBOR19JT19SRUFESU5HIHwgUE5HX0lPX0NIVU5LX0NSQzsKLSNlbmRpZgotCi0gICAvKiBUaGUgY2h1bmsgQ1JDIG11c3QgYmUgc2VyaWFsaXplZCBpbiBhIHNpbmdsZSBJL08gY2FsbC4gKi8KLSAgIHBuZ19yZWFkX2RhdGEocG5nX3B0ciwgY3JjX2J5dGVzLCA0KTsKLQotICAgaWYgKG5lZWRfY3JjKQotICAgewotICAgICAgY3JjID0gcG5nX2dldF91aW50XzMyKGNyY19ieXRlcyk7Ci0gICAgICByZXR1cm4gKChpbnQpKGNyYyAhPSBwbmdfcHRyLT5jcmMpKTsKLSAgIH0KLQotICAgZWxzZQotICAgICAgcmV0dXJuICgwKTsKLX0KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfelRYdF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfaVRYdF9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVEKQotc3RhdGljIHBuZ19zaXplX3QKLXBuZ19pbmZsYXRlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGNvbnN0IHBuZ19ieXRlICpkYXRhLCBwbmdfc2l6ZV90IHNpemUsCi0gICAgICAgIHBuZ19ieXRlcCBvdXRwdXQsIHBuZ19zaXplX3Qgb3V0cHV0X3NpemUpCi17Ci0gICBwbmdfc2l6ZV90IGNvdW50ID0gMDsKLQotICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X2luID0gKHBuZ19ieXRlcClkYXRhOyAvKiBjb25zdF9jYXN0OiBWQUxJRCAqLwotICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9IHNpemU7Ci0KLSAgIHdoaWxlICgxKQotICAgewotICAgICAgaW50IHJldCwgYXZhaWw7Ci0KLSAgICAgIC8qIFJlc2V0IHRoZSBvdXRwdXQgYnVmZmVyIGVhY2ggdGltZSByb3VuZCAtIHdlIGVtcHR5IGl0Ci0gICAgICAgKiBhZnRlciBldmVyeSBpbmZsYXRlIGNhbGwuCi0gICAgICAgKi8KLSAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT56YnVmOwotICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSBwbmdfcHRyLT56YnVmX3NpemU7Ci0KLSAgICAgIHJldCA9IGluZmxhdGUoJnBuZ19wdHItPnpzdHJlYW0sIFpfTk9fRkxVU0gpOwotICAgICAgYXZhaWwgPSBwbmdfcHRyLT56YnVmX3NpemUgLSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dDsKLQotICAgICAgLyogRmlyc3QgY29weS9jb3VudCBhbnkgbmV3IG91dHB1dCAtIGJ1dCBvbmx5IGlmIHdlIGRpZG4ndAotICAgICAgICogZ2V0IGFuIGVycm9yIGNvZGUuCi0gICAgICAgKi8KLSAgICAgIGlmICgocmV0ID09IFpfT0sgfHwgcmV0ID09IFpfU1RSRUFNX0VORCkgJiYgYXZhaWwgPiAwKQotICAgICAgewotICAgICAgICAgaWYgKG91dHB1dCAhPSAwICYmIG91dHB1dF9zaXplID4gY291bnQpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfc2l6ZV90IGNvcHkgPSBvdXRwdXRfc2l6ZSAtIGNvdW50OwotICAgICAgICAgICAgaWYgKChwbmdfc2l6ZV90KSBhdmFpbCA8IGNvcHkpIGNvcHkgPSAocG5nX3NpemVfdCkgYXZhaWw7Ci0gICAgICAgICAgICBwbmdfbWVtY3B5KG91dHB1dCArIGNvdW50LCBwbmdfcHRyLT56YnVmLCBjb3B5KTsKLSAgICAgICAgIH0KLQotICAgICAgICAgY291bnQgKz0gYXZhaWw7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChyZXQgPT0gWl9PSykKLSAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvKiBUZXJtaW5hdGlvbiBjb25kaXRpb25zIC0gYWx3YXlzIHJlc2V0IHRoZSB6c3RyZWFtLCBpdAotICAgICAgICogbXVzdCBiZSBsZWZ0IGluIGluZmxhdGVJbml0IHN0YXRlLgotICAgICAgICovCi0gICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gMDsKLSAgICAgIGluZmxhdGVSZXNldCgmcG5nX3B0ci0+enN0cmVhbSk7Ci0KLSAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EKQotICAgICAgICAgcmV0dXJuIGNvdW50OyAvKiBOT1RFOiBtYXkgYmUgemVyby4gKi8KLQotICAgICAgLyogTm93IGhhbmRsZSB0aGUgZXJyb3IgY29kZXMgLSB0aGUgQVBJIGFsd2F5cyByZXR1cm5zIDAKLSAgICAgICAqIGFuZCB0aGUgZXJyb3IgbWVzc2FnZSBpcyBkdW1wZWQgaW50byB0aGUgdW5jb21wcmVzc2VkCi0gICAgICAgKiBidWZmZXIgaWYgYXZhaWxhYmxlLgotICAgICAgICovCi0gICAgICB7Ci0gICAgICAgICBQTkdfQ09OU1QgY2hhciAqbXNnOwotICAgICAgICAgaWYgKHBuZ19wdHItPnpzdHJlYW0ubXNnICE9IDApCi0gICAgICAgICAgICBtc2cgPSBwbmdfcHRyLT56c3RyZWFtLm1zZzsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECi0gICAgICAgICAgICBjaGFyIHVtc2dbNTJdOwotCi0gICAgICAgICAgICBzd2l0Y2ggKHJldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgWl9CVUZfRVJST1I6Ci0gICAgICAgICAgICAgICAgICBtc2cgPSAiQnVmZmVyIGVycm9yIGluIGNvbXByZXNzZWQgZGF0YXN0cmVhbSBpbiAlcyBjaHVuayI7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgY2FzZSBaX0RBVEFfRVJST1I6Ci0gICAgICAgICAgICAgICAgICBtc2cgPSAiRGF0YSBlcnJvciBpbiBjb21wcmVzc2VkIGRhdGFzdHJlYW0gaW4gJXMgY2h1bmsiOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICBtc2cgPSAiSW5jb21wbGV0ZSBjb21wcmVzc2VkIGRhdGFzdHJlYW0gaW4gJXMgY2h1bmsiOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBuZ19zbnByaW50Zih1bXNnLCBzaXplb2YgdW1zZywgbXNnLCBwbmdfcHRyLT5jaHVua19uYW1lKTsKLSAgICAgICAgICAgIG1zZyA9IHVtc2c7Ci0jZWxzZQotICAgICAgICAgICAgbXNnID0gIkRhbWFnZWQgY29tcHJlc3NlZCBkYXRhc3RyZWFtIGluIGNodW5rIG90aGVyIHRoYW4gSURBVCI7Ci0jZW5kaWYKLSAgICAgICAgIH0KLQotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgbXNnKTsKLSAgICAgIH0KLQotICAgICAgLyogMCBtZWFucyBhbiBlcnJvciAtIG5vdGljZSB0aGF0IHRoaXMgY29kZSBzaW1wbGUgaWdub3JlcwotICAgICAgICogemVybyBsZW5ndGggY29tcHJlc3NlZCBjaHVua3MgYXMgYSByZXN1bHQuCi0gICAgICAgKi8KLSAgICAgIHJldHVybiAwOwotICAgfQotfQotCi0vKgotICogRGVjb21wcmVzcyB0cmFpbGluZyBkYXRhIGluIGEgY2h1bmsuICBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IGNodW5rZGF0YQotICogcG9pbnRzIGF0IGFuIGFsbG9jYXRlZCBhcmVhIGhvbGRpbmcgdGhlIGNvbnRlbnRzIG9mIGEgY2h1bmsgd2l0aCBhCi0gKiB0cmFpbGluZyBjb21wcmVzc2VkIHBhcnQuICBXaGF0IHdlIGdldCBiYWNrIGlzIGFuIGFsbG9jYXRlZCBhcmVhCi0gKiBob2xkaW5nIHRoZSBvcmlnaW5hbCBwcmVmaXggcGFydCBhbmQgYW4gdW5jb21wcmVzc2VkIHZlcnNpb24gb2YgdGhlCi0gKiB0cmFpbGluZyBwYXJ0ICh0aGUgbWFsbG9jIGFyZWEgcGFzc2VkIGluIGlzIGZyZWVkKS4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZGVjb21wcmVzc19jaHVuayhwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgY29tcF90eXBlLAotICAgIHBuZ19zaXplX3QgY2h1bmtsZW5ndGgsCi0gICAgcG5nX3NpemVfdCBwcmVmaXhfc2l6ZSwgcG5nX3NpemVfdCAqbmV3bGVuZ3RoKQotewotICAgLyogVGhlIGNhbGxlciBzaG91bGQgZ3VhcmFudGVlIHRoaXMgKi8KLSAgIGlmIChwcmVmaXhfc2l6ZSA+IGNodW5rbGVuZ3RoKQotICAgewotICAgICAgLyogVGhlIHJlY292ZXJ5IGlzIHRvIGRlbGV0ZSB0aGUgY2h1bmsuICovCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiaW52YWxpZCBjaHVua2xlbmd0aCIpOwotICAgICAgcHJlZml4X3NpemUgPSAwOyAvKiBUbyBkZWxldGUgZXZlcnl0aGluZyAqLwotICAgfQotCi0gICBlbHNlIGlmIChjb21wX3R5cGUgPT0gUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSkKLSAgIHsKLSAgICAgIHBuZ19zaXplX3QgZXhwYW5kZWRfc2l6ZSA9IHBuZ19pbmZsYXRlKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgKHBuZ19ieXRlcCkocG5nX3B0ci0+Y2h1bmtkYXRhICsgcHJlZml4X3NpemUpLAotICAgICAgICAgICAgICAgIGNodW5rbGVuZ3RoIC0gcHJlZml4X3NpemUsCi0gICAgICAgICAgICAgICAgMC8qb3V0cHV0Ki8sIDAvKm91dHB1dCBzaXplKi8pOwotCi0gICAgICAvKiBOb3cgY2hlY2sgdGhlIGxpbWl0cyBvbiB0aGlzIGNodW5rIC0gaWYgdGhlIGxpbWl0IGZhaWxzIHRoZQotICAgICAgICogY29tcHJlc3NlZCBkYXRhIHdpbGwgYmUgcmVtb3ZlZCwgdGhlIHByZWZpeCB3aWxsIHJlbWFpbi4KLSAgICAgICAqLwotICAgICAgaWYgKHByZWZpeF9zaXplID49ICh+KHBuZ19zaXplX3QpMCkgLSAxIHx8Ci0gICAgICAgICBleHBhbmRlZF9zaXplID49ICh+KHBuZ19zaXplX3QpMCkgLSAxIC0gcHJlZml4X3NpemUKLSNpZmRlZiBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVECi0gICAgICAgICB8fCAocG5nX3B0ci0+dXNlcl9jaHVua19tYWxsb2NfbWF4ICYmCi0gICAgICAgICAgKHByZWZpeF9zaXplICsgZXhwYW5kZWRfc2l6ZSA+PSBwbmdfcHRyLT51c2VyX2NodW5rX21hbGxvY19tYXggLSAxKSkKLSNlbHNlCi0gICAgICAgICB8fCAoKFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVggPiAwKSAmJgotICAgICAgICAgIHByZWZpeF9zaXplICsgZXhwYW5kZWRfc2l6ZSA+PSBQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYIC0gMSkKLSNlbmRpZgotICAgICAgICAgKQotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkV4Y2VlZGVkIHNpemUgbGltaXQgd2hpbGUgZXhwYW5kaW5nIGNodW5rIik7Ci0KLSAgICAgIC8qIElmIHRoZSBzaXplIGlzIHplcm8gZWl0aGVyIHRoZXJlIHdhcyBhbiBlcnJvciBhbmQgYSBtZXNzYWdlCi0gICAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIG91dHB1dCAod2FybmluZykgb3IgdGhlIHNpemUgcmVhbGx5IGlzIHplcm8KLSAgICAgICAqIGFuZCB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8gLSB0aGUgY29kZSB3aWxsIGV4aXQgdGhyb3VnaCB0aGUKLSAgICAgICAqIGVycm9yIGNhc2UgYmVsb3cuCi0gICAgICAgKi8KLSAgICAgIGVsc2UgaWYgKGV4cGFuZGVkX3NpemUgPiAwKQotICAgICAgewotICAgICAgICAgLyogU3VjY2VzcyAobWF5YmUpIC0gcmVhbGx5IHVuY29tcHJlc3MgdGhlIGNodW5rLiAqLwotICAgICAgICAgcG5nX3NpemVfdCBuZXdfc2l6ZSA9IDA7Ci0gICAgICAgICBwbmdfY2hhcnAgdGV4dCA9IHBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4X3NpemUgKyBleHBhbmRlZF9zaXplICsgMSk7Ci0KLSAgICAgICAgIGlmICh0ZXh0ICE9IE5VTEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfbWVtY3B5KHRleHQsIHBuZ19wdHItPmNodW5rZGF0YSwgcHJlZml4X3NpemUpOwotICAgICAgICAgICAgbmV3X3NpemUgPSBwbmdfaW5mbGF0ZShwbmdfcHRyLAotICAgICAgICAgICAgICAgIChwbmdfYnl0ZXApKHBuZ19wdHItPmNodW5rZGF0YSArIHByZWZpeF9zaXplKSwKLSAgICAgICAgICAgICAgICBjaHVua2xlbmd0aCAtIHByZWZpeF9zaXplLAotICAgICAgICAgICAgICAgIChwbmdfYnl0ZXApKHRleHQgKyBwcmVmaXhfc2l6ZSksIGV4cGFuZGVkX3NpemUpOwotICAgICAgICAgICAgdGV4dFtwcmVmaXhfc2l6ZSArIGV4cGFuZGVkX3NpemVdID0gMDsgLyoganVzdCBpbiBjYXNlICovCi0KLSAgICAgICAgICAgIGlmIChuZXdfc2l6ZSA9PSBleHBhbmRlZF9zaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgICAgICAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IHRleHQ7Ci0gICAgICAgICAgICAgICAqbmV3bGVuZ3RoID0gcHJlZml4X3NpemUgKyBleHBhbmRlZF9zaXplOwotICAgICAgICAgICAgICAgcmV0dXJuOyAvKiBUaGUgc3VjY2VzcyByZXR1cm4hICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJwbmdfaW5mbGF0ZSBsb2dpYyBlcnJvciIpOwotICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgdGV4dCk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gZGVjb21wcmVzcyBjaHVuayIpOwotICAgICAgfQotICAgfQotCi0gICBlbHNlIC8qIGlmIChjb21wX3R5cGUgIT0gUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSkgKi8KLSAgIHsKLSNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECi0gICAgICBjaGFyIHVtc2dbNTBdOwotCi0gICAgICBwbmdfc25wcmludGYodW1zZywgc2l6ZW9mIHVtc2csICJVbmtub3duIHpUWHQgY29tcHJlc3Npb24gdHlwZSAlZCIsCi0gICAgICAgICAgY29tcF90eXBlKTsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIHVtc2cpOwotI2Vsc2UKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmtub3duIHpUWHQgY29tcHJlc3Npb24gdHlwZSIpOwotI2VuZGlmCi0KLSAgICAgIC8qIFRoZSByZWNvdmVyeSBpcyB0byBzaW1wbHkgZHJvcCB0aGUgZGF0YS4gKi8KLSAgIH0KLQotICAgLyogR2VuZXJpYyBlcnJvciByZXR1cm4gLSBsZWF2ZSB0aGUgcHJlZml4LCBkZWxldGUgdGhlIGNvbXByZXNzZWQKLSAgICAqIGRhdGEsIHJlYWxsb2NhdGUgdGhlIGNodW5rZGF0YSB0byByZW1vdmUgdGhlIHBvdGVudGlhbGx5IGxhcmdlCi0gICAgKiBhbW91bnQgb2YgY29tcHJlc3NlZCBkYXRhLgotICAgICovCi0gICB7Ci0gICAgICBwbmdfY2hhcnAgdGV4dCA9IHBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBwcmVmaXhfc2l6ZSArIDEpOwotICAgICAgaWYgKHRleHQgIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIGlmIChwcmVmaXhfc2l6ZSA+IDApCi0gICAgICAgICAgICBwbmdfbWVtY3B5KHRleHQsIHBuZ19wdHItPmNodW5rZGF0YSwgcHJlZml4X3NpemUpOwotICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IHRleHQ7Ci0KLSAgICAgICAgIC8qIFRoaXMgaXMgYW4gZXh0cmEgemVybyBpbiB0aGUgJ3VuY29tcHJlc3NlZCcgcGFydC4gKi8KLSAgICAgICAgICoocG5nX3B0ci0+Y2h1bmtkYXRhICsgcHJlZml4X3NpemUpID0gMHgwMDsKLSAgICAgIH0KLSAgICAgIC8qIElnbm9yZSBhIG1hbGxvYyBlcnJvciBoZXJlIC0gaXQgaXMgc2FmZS4gKi8KLSAgIH0KLQotICAgKm5ld2xlbmd0aCA9IHByZWZpeF9zaXplOwotfQotI2VuZGlmCi0KLS8qIFJlYWQgYW5kIGNoZWNrIHRoZSBJREhSIGNodW5rICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfSUhEUihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLXsKLSAgIHBuZ19ieXRlIGJ1ZlsxM107Ci0gICBwbmdfdWludF8zMiB3aWR0aCwgaGVpZ2h0OwotICAgaW50IGJpdF9kZXB0aCwgY29sb3JfdHlwZSwgY29tcHJlc3Npb25fdHlwZSwgZmlsdGVyX3R5cGU7Ci0gICBpbnQgaW50ZXJsYWNlX3R5cGU7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9JSERSIik7Ci0KLSAgIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiT3V0IG9mIHBsYWNlIElIRFIiKTsKLQotICAgLyogQ2hlY2sgdGhlIGxlbmd0aCAqLwotICAgaWYgKGxlbmd0aCAhPSAxMykKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBJSERSIGNodW5rIik7Ci0KLSAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfSUhEUjsKLQotICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgMTMpOwotICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCk7Ci0KLSAgIHdpZHRoID0gcG5nX2dldF91aW50XzMxKHBuZ19wdHIsIGJ1Zik7Ci0gICBoZWlnaHQgPSBwbmdfZ2V0X3VpbnRfMzEocG5nX3B0ciwgYnVmICsgNCk7Ci0gICBiaXRfZGVwdGggPSBidWZbOF07Ci0gICBjb2xvcl90eXBlID0gYnVmWzldOwotICAgY29tcHJlc3Npb25fdHlwZSA9IGJ1ZlsxMF07Ci0gICBmaWx0ZXJfdHlwZSA9IGJ1ZlsxMV07Ci0gICBpbnRlcmxhY2VfdHlwZSA9IGJ1ZlsxMl07Ci0KLSAgIC8qIFNldCBpbnRlcm5hbCB2YXJpYWJsZXMgKi8KLSAgIHBuZ19wdHItPndpZHRoID0gd2lkdGg7Ci0gICBwbmdfcHRyLT5oZWlnaHQgPSBoZWlnaHQ7Ci0gICBwbmdfcHRyLT5iaXRfZGVwdGggPSAocG5nX2J5dGUpYml0X2RlcHRoOwotICAgcG5nX3B0ci0+aW50ZXJsYWNlZCA9IChwbmdfYnl0ZSlpbnRlcmxhY2VfdHlwZTsKLSAgIHBuZ19wdHItPmNvbG9yX3R5cGUgPSAocG5nX2J5dGUpY29sb3JfdHlwZTsKLSNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAotICAgcG5nX3B0ci0+ZmlsdGVyX3R5cGUgPSAocG5nX2J5dGUpZmlsdGVyX3R5cGU7Ci0jZW5kaWYKLSAgIHBuZ19wdHItPmNvbXByZXNzaW9uX3R5cGUgPSAocG5nX2J5dGUpY29tcHJlc3Npb25fdHlwZTsKLQotICAgLyogRmluZCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgIHN3aXRjaCAocG5nX3B0ci0+Y29sb3JfdHlwZSkKLSAgIHsKLSAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWToKLSAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUEFMRVRURToKLSAgICAgICAgIHBuZ19wdHItPmNoYW5uZWxzID0gMTsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoKLSAgICAgICAgIHBuZ19wdHItPmNoYW5uZWxzID0gMzsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE6Ci0gICAgICAgICBwbmdfcHRyLT5jaGFubmVscyA9IDI7Ci0gICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE6Ci0gICAgICAgICBwbmdfcHRyLT5jaGFubmVscyA9IDQ7Ci0gICAgICAgICBicmVhazsKLSAgIH0KLQotICAgLyogU2V0IHVwIG90aGVyIHVzZWZ1bCBpbmZvICovCi0gICBwbmdfcHRyLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkocG5nX3B0ci0+Yml0X2RlcHRoICoKLSAgIHBuZ19wdHItPmNoYW5uZWxzKTsKLSAgIHBuZ19wdHItPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHBuZ19wdHItPnBpeGVsX2RlcHRoLCBwbmdfcHRyLT53aWR0aCk7Ci0gICBwbmdfZGVidWcxKDMsICJiaXRfZGVwdGggPSAlZCIsIHBuZ19wdHItPmJpdF9kZXB0aCk7Ci0gICBwbmdfZGVidWcxKDMsICJjaGFubmVscyA9ICVkIiwgcG5nX3B0ci0+Y2hhbm5lbHMpOwotICAgcG5nX2RlYnVnMSgzLCAicm93Ynl0ZXMgPSAlbHUiLCBwbmdfcHRyLT5yb3dieXRlcyk7Ci0gICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwKLSAgICAgIGNvbG9yX3R5cGUsIGludGVybGFjZV90eXBlLCBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfdHlwZSk7Ci19Ci0KLS8qIFJlYWQgYW5kIGNoZWNrIHRoZSBwYWxldHRlICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfUExURShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLXsKLSAgIHBuZ19jb2xvciBwYWxldHRlW1BOR19NQVhfUEFMRVRURV9MRU5HVEhdOwotICAgaW50IG51bSwgaTsKLSNpZmRlZiBQTkdfUE9JTlRFUl9JTkRFWElOR19TVVBQT1JURUQKLSAgIHBuZ19jb2xvcnAgcGFsX3B0cjsKLSNlbmRpZgotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfUExURSIpOwotCi0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgUExURSIpOwotCi0gICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIFBMVEUgYWZ0ZXIgSURBVCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkR1cGxpY2F0ZSBQTFRFIGNodW5rIik7Ci0KLSAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfUExURTsKLQotICAgaWYgKCEocG5nX3B0ci0+Y29sb3JfdHlwZSZQTkdfQ09MT1JfTUFTS19DT0xPUikpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAiSWdub3JpbmcgUExURSBjaHVuayBpbiBncmF5c2NhbGUgUE5HIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotI2lmbmRlZiBQTkdfUkVBRF9PUFRfUExURV9TVVBQT1JURUQKLSAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICB7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotI2VuZGlmCi0KLSAgIGlmIChsZW5ndGggPiAzKlBOR19NQVhfUEFMRVRURV9MRU5HVEggfHwgbGVuZ3RoICUgMykKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBwYWxldHRlIGNodW5rIik7Ci0gICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgcGFsZXR0ZSBjaHVuayIpOwotICAgICAgfQotICAgfQotCi0gICBudW0gPSAoaW50KWxlbmd0aCAvIDM7Ci0KLSNpZmRlZiBQTkdfUE9JTlRFUl9JTkRFWElOR19TVVBQT1JURUQKLSAgIGZvciAoaSA9IDAsIHBhbF9wdHIgPSBwYWxldHRlOyBpIDwgbnVtOyBpKyssIHBhbF9wdHIrKykKLSAgIHsKLSAgICAgIHBuZ19ieXRlIGJ1ZlszXTsKLQotICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgMyk7Ci0gICAgICBwYWxfcHRyLT5yZWQgPSBidWZbMF07Ci0gICAgICBwYWxfcHRyLT5ncmVlbiA9IGJ1ZlsxXTsKLSAgICAgIHBhbF9wdHItPmJsdWUgPSBidWZbMl07Ci0gICB9Ci0jZWxzZQotICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQotICAgewotICAgICAgcG5nX2J5dGUgYnVmWzNdOwotCi0gICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCAzKTsKLSAgICAgIC8qIERvbid0IGRlcGVuZCB1cG9uIHBuZ19jb2xvciBiZWluZyBhbnkgb3JkZXIgKi8KLSAgICAgIHBhbGV0dGVbaV0ucmVkID0gYnVmWzBdOwotICAgICAgcGFsZXR0ZVtpXS5ncmVlbiA9IGJ1ZlsxXTsKLSAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IGJ1ZlsyXTsKLSAgIH0KLSNlbmRpZgotCi0gICAvKiBJZiB3ZSBhY3R1YWxseSBORUVEIHRoZSBQTFRFIGNodW5rIChpZSBmb3IgYSBwYWxldHRlZCBpbWFnZSksIHdlIGRvCi0gICAgKiB3aGF0ZXZlciB0aGUgbm9ybWFsIENSQyBjb25maWd1cmF0aW9uIHRlbGxzIHVzLiAgSG93ZXZlciwgaWYgd2UKLSAgICAqIGhhdmUgYW4gUkdCIGltYWdlLCB0aGUgUExURSBjYW4gYmUgY29uc2lkZXJlZCBhbmNpbGxhcnksIHNvCi0gICAgKiB3ZSB3aWxsIGFjdCBhcyB0aG91Z2ggaXQgaXMuCi0gICAgKi8KLSNpZm5kZWYgUE5HX1JFQURfT1BUX1BMVEVfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotI2VuZGlmCi0gICB7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKTsKLSAgIH0KLSNpZm5kZWYgUE5HX1JFQURfT1BUX1BMVEVfU1VQUE9SVEVECi0gICBlbHNlIGlmIChwbmdfY3JjX2Vycm9yKHBuZ19wdHIpKSAgLyogT25seSBpZiB3ZSBoYXZlIGEgQ1JDIGVycm9yICovCi0gICB7Ci0gICAgICAvKiBJZiB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgZGF0YSBmcm9tIGFuIGFuY2lsbGFyeSBjaHVuaywKLSAgICAgICAgIHdlIGhhdmUgdHdvIG9wdGlvbnM6IGFuIGVycm9yIGFib3J0LCBvciBhIHdhcm5pbmcgYW5kIHdlCi0gICAgICAgICBpZ25vcmUgdGhlIGRhdGEgaW4gdGhpcyBjaHVuayAod2hpY2ggc2hvdWxkIGJlIE9LLCBzaW5jZQotICAgICAgICAgaXQncyBjb25zaWRlcmVkIGFuY2lsbGFyeSBmb3IgYSBSR0Igb3IgUkdCQSBpbWFnZSkuICovCi0gICAgICBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19BTkNJTExBUllfVVNFKSkKLSAgICAgIHsKLSAgICAgICAgIGlmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiQ1JDIGVycm9yIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfY2h1bmtfd2FybmluZyhwbmdfcHRyLCAiQ1JDIGVycm9yIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvKiBPdGhlcndpc2UsIHdlIChvcHRpb25hbGx5KSBlbWl0IGEgd2FybmluZyBhbmQgdXNlIHRoZSBjaHVuay4gKi8KLSAgICAgIGVsc2UgaWYgKCEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX05PV0FSTikpCi0gICAgICB7Ci0gICAgICAgICBwbmdfY2h1bmtfd2FybmluZyhwbmdfcHRyLCAiQ1JDIGVycm9yIik7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLQotICAgcG5nX3NldF9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLCBwYWxldHRlLCBudW0pOwotCi0jaWZkZWYgUE5HX1JFQURfdFJOU19TVVBQT1JURUQKLSAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICB7Ci0gICAgICBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fdFJOUykpCi0gICAgICB7Ci0gICAgICAgICBpZiAocG5nX3B0ci0+bnVtX3RyYW5zID4gKHBuZ191aW50XzE2KW51bSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJUcnVuY2F0aW5nIGluY29ycmVjdCB0Uk5TIGNodW5rIGxlbmd0aCIpOwotICAgICAgICAgICAgcG5nX3B0ci0+bnVtX3RyYW5zID0gKHBuZ191aW50XzE2KW51bTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChpbmZvX3B0ci0+bnVtX3RyYW5zID4gKHBuZ191aW50XzE2KW51bSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJUcnVuY2F0aW5nIGluY29ycmVjdCBpbmZvIHRSTlMgY2h1bmsgbGVuZ3RoIik7Ci0gICAgICAgICAgICBpbmZvX3B0ci0+bnVtX3RyYW5zID0gKHBuZ191aW50XzE2KW51bTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotCi19Ci0KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2hhbmRsZV9JRU5EKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX0lFTkQiKTsKLQotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpIHx8ICEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpKQotICAgewotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJObyBpbWFnZSBpbiBmaWxlIik7Ci0gICB9Ci0KLSAgIHBuZ19wdHItPm1vZGUgfD0gKFBOR19BRlRFUl9JREFUIHwgUE5HX0hBVkVfSUVORCk7Ci0KLSAgIGlmIChsZW5ndGggIT0gMCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbmNvcnJlY3QgSUVORCBjaHVuayBsZW5ndGgiKTsKLSAgIH0KLSAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0KLSAgIFBOR19VTlVTRUQoaW5mb19wdHIpIC8qIFF1aWV0IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IHVudXNlZCBpbmZvX3B0ciAqLwotfQotCi0jaWZkZWYgUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2hhbmRsZV9nQU1BKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQotewotICAgcG5nX2ZpeGVkX3BvaW50IGlnYW1tYTsKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICBmbG9hdCBmaWxlX2dhbW1hOwotI2VuZGlmCi0gICBwbmdfYnl0ZSBidWZbNF07Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9nQU1BIik7Ci0KLSAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBnQU1BIik7Ci0gICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGdBTUEgYWZ0ZXIgSURBVCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKQotICAgICAgLyogU2hvdWxkIGJlIGFuIGVycm9yLCBidXQgd2UgY2FuIGNvcGUgd2l0aCBpdCAqLwotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk91dCBvZiBwbGFjZSBnQU1BIGNodW5rIik7Ci0KLSAgIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19nQU1BKQotI2lmZGVmIFBOR19SRUFEX3NSR0JfU1VQUE9SVEVECi0gICAgICAmJiAhKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NSR0IpCi0jZW5kaWYKLSAgICAgICkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJEdXBsaWNhdGUgZ0FNQSBjaHVuayIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgaWYgKGxlbmd0aCAhPSA0KQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluY29ycmVjdCBnQU1BIGNodW5rIGxlbmd0aCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgNCk7Ci0gICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpCi0gICAgICByZXR1cm47Ci0KLSAgIGlnYW1tYSA9IChwbmdfZml4ZWRfcG9pbnQpcG5nX2dldF91aW50XzMyKGJ1Zik7Ci0gICAvKiBDaGVjayBmb3IgemVybyBnYW1tYSAqLwotICAgaWYgKGlnYW1tYSA9PSAwKQotICAgICAgewotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgICAgIklnbm9yaW5nIGdBTUEgY2h1bmsgd2l0aCBnYW1tYT0wIik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSNpZmRlZiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRAotICAgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NSR0IpKQotICAgICAgaWYgKFBOR19PVVRfT0ZfUkFOR0UoaWdhbW1hLCA0NTUwMEwsIDUwMCkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAiSWdub3JpbmcgaW5jb3JyZWN0IGdBTUEgdmFsdWUgd2hlbiBzUkdCIGlzIGFsc28gcHJlc2VudCIpOwotI2lmZGVmIFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRAotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnYW1tYSA9ICglZC8xMDAwMDApIiwgKGludClpZ2FtbWEpOwotI2VuZGlmCi0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0jZW5kaWYgLyogUE5HX1JFQURfc1JHQl9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgIGZpbGVfZ2FtbWEgPSAoZmxvYXQpaWdhbW1hIC8gKGZsb2F0KTEwMDAwMC4wOwotIyAgaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECi0gICAgIHBuZ19wdHItPmdhbW1hID0gZmlsZV9nYW1tYTsKLSMgIGVuZGlmCi0gICAgIHBuZ19zZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgZmlsZV9nYW1tYSk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi0gICBwbmdfc2V0X2dBTUFfZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsIGlnYW1tYSk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfc0JJVF9TVVBQT1JURUQKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2hhbmRsZV9zQklUKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQotewotICAgcG5nX3NpemVfdCB0cnVlbGVuOwotICAgcG5nX2J5dGUgYnVmWzRdOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfc0JJVCIpOwotCi0gICBidWZbMF0gPSBidWZbMV0gPSBidWZbMl0gPSBidWZbM10gPSAwOwotCi0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgc0JJVCIpOwotICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBzQklUIGFmdGVyIElEQVQiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUExURSkKLSAgIHsKLSAgICAgIC8qIFNob3VsZCBiZSBhbiBlcnJvciwgYnV0IHdlIGNhbiBjb3BlIHdpdGggaXQgKi8KLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJPdXQgb2YgcGxhY2Ugc0JJVCBjaHVuayIpOwotICAgfQotICAgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NCSVQpKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkR1cGxpY2F0ZSBzQklUIGNodW5rIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgdHJ1ZWxlbiA9IDM7Ci0gICBlbHNlCi0gICAgICB0cnVlbGVuID0gKHBuZ19zaXplX3QpcG5nX3B0ci0+Y2hhbm5lbHM7Ci0KLSAgIGlmIChsZW5ndGggIT0gdHJ1ZWxlbiB8fCBsZW5ndGggPiA0KQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluY29ycmVjdCBzQklUIGNodW5rIGxlbmd0aCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgdHJ1ZWxlbik7Ci0gICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpCi0gICAgICByZXR1cm47Ci0KLSAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCi0gICB7Ci0gICAgICBwbmdfcHRyLT5zaWdfYml0LnJlZCA9IGJ1ZlswXTsKLSAgICAgIHBuZ19wdHItPnNpZ19iaXQuZ3JlZW4gPSBidWZbMV07Ci0gICAgICBwbmdfcHRyLT5zaWdfYml0LmJsdWUgPSBidWZbMl07Ci0gICAgICBwbmdfcHRyLT5zaWdfYml0LmFscGhhID0gYnVmWzNdOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgcG5nX3B0ci0+c2lnX2JpdC5ncmF5ID0gYnVmWzBdOwotICAgICAgcG5nX3B0ci0+c2lnX2JpdC5yZWQgPSBidWZbMF07Ci0gICAgICBwbmdfcHRyLT5zaWdfYml0LmdyZWVuID0gYnVmWzBdOwotICAgICAgcG5nX3B0ci0+c2lnX2JpdC5ibHVlID0gYnVmWzBdOwotICAgICAgcG5nX3B0ci0+c2lnX2JpdC5hbHBoYSA9IGJ1ZlsxXTsKLSAgIH0KLSAgIHBuZ19zZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJihwbmdfcHRyLT5zaWdfYml0KSk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX2NIUk1fU1VQUE9SVEVECi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfY0hSTShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLXsKLSAgIHBuZ19ieXRlIGJ1ZlszMl07Ci0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgZmxvYXQgd2hpdGVfeCwgd2hpdGVfeSwgcmVkX3gsIHJlZF95LCBncmVlbl94LCBncmVlbl95LCBibHVlX3gsIGJsdWVfeTsKLSNlbmRpZgotICAgcG5nX2ZpeGVkX3BvaW50IGludF94X3doaXRlLCBpbnRfeV93aGl0ZSwgaW50X3hfcmVkLCBpbnRfeV9yZWQsIGludF94X2dyZWVuLAotICAgICAgaW50X3lfZ3JlZW4sIGludF94X2JsdWUsIGludF95X2JsdWU7Ci0KLSAgIHBuZ191aW50XzMyIHVpbnRfeCwgdWludF95OwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfY0hSTSIpOwotCi0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgY0hSTSIpOwotICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBjSFJNIGFmdGVyIElEQVQiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUExURSkKLSAgICAgIC8qIFNob3VsZCBiZSBhbiBlcnJvciwgYnV0IHdlIGNhbiBjb3BlIHdpdGggaXQgKi8KLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJNaXNzaW5nIFBMVEUgYmVmb3JlIGNIUk0iKTsKLQotICAgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2NIUk0pCi0jaWZkZWYgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQKLSAgICAgICYmICEoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc1JHQikKLSNlbmRpZgotICAgICAgKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkR1cGxpY2F0ZSBjSFJNIGNodW5rIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBpZiAobGVuZ3RoICE9IDMyKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluY29ycmVjdCBjSFJNIGNodW5rIGxlbmd0aCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgMzIpOwotICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQotICAgICAgcmV0dXJuOwotCi0gICB1aW50X3ggPSBwbmdfZ2V0X3VpbnRfMzIoYnVmKTsKLSAgIHVpbnRfeSA9IHBuZ19nZXRfdWludF8zMihidWYgKyA0KTsKLSAgIGludF94X3doaXRlID0gKHBuZ19maXhlZF9wb2ludCl1aW50X3g7Ci0gICBpbnRfeV93aGl0ZSA9IChwbmdfZml4ZWRfcG9pbnQpdWludF95OwotCi0gICB1aW50X3ggPSBwbmdfZ2V0X3VpbnRfMzIoYnVmICsgOCk7Ci0gICB1aW50X3kgPSBwbmdfZ2V0X3VpbnRfMzIoYnVmICsgMTIpOwotICAgaW50X3hfcmVkID0gKHBuZ19maXhlZF9wb2ludCl1aW50X3g7Ci0gICBpbnRfeV9yZWQgPSAocG5nX2ZpeGVkX3BvaW50KXVpbnRfeTsKLQotICAgdWludF94ID0gcG5nX2dldF91aW50XzMyKGJ1ZiArIDE2KTsKLSAgIHVpbnRfeSA9IHBuZ19nZXRfdWludF8zMihidWYgKyAyMCk7Ci0gICBpbnRfeF9ncmVlbiA9IChwbmdfZml4ZWRfcG9pbnQpdWludF94OwotICAgaW50X3lfZ3JlZW4gPSAocG5nX2ZpeGVkX3BvaW50KXVpbnRfeTsKLQotICAgdWludF94ID0gcG5nX2dldF91aW50XzMyKGJ1ZiArIDI0KTsKLSAgIHVpbnRfeSA9IHBuZ19nZXRfdWludF8zMihidWYgKyAyOCk7Ci0gICBpbnRfeF9ibHVlID0gKHBuZ19maXhlZF9wb2ludCl1aW50X3g7Ci0gICBpbnRfeV9ibHVlID0gKHBuZ19maXhlZF9wb2ludCl1aW50X3k7Ci0KLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICB3aGl0ZV94ID0gKGZsb2F0KWludF94X3doaXRlIC8gKGZsb2F0KTEwMDAwMC4wOwotICAgd2hpdGVfeSA9IChmbG9hdClpbnRfeV93aGl0ZSAvIChmbG9hdCkxMDAwMDAuMDsKLSAgIHJlZF94ICAgPSAoZmxvYXQpaW50X3hfcmVkICAgLyAoZmxvYXQpMTAwMDAwLjA7Ci0gICByZWRfeSAgID0gKGZsb2F0KWludF95X3JlZCAgIC8gKGZsb2F0KTEwMDAwMC4wOwotICAgZ3JlZW5feCA9IChmbG9hdClpbnRfeF9ncmVlbiAvIChmbG9hdCkxMDAwMDAuMDsKLSAgIGdyZWVuX3kgPSAoZmxvYXQpaW50X3lfZ3JlZW4gLyAoZmxvYXQpMTAwMDAwLjA7Ci0gICBibHVlX3ggID0gKGZsb2F0KWludF94X2JsdWUgIC8gKGZsb2F0KTEwMDAwMC4wOwotICAgYmx1ZV95ICA9IChmbG9hdClpbnRfeV9ibHVlICAvIChmbG9hdCkxMDAwMDAuMDsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQKLSAgIGlmICgoaW5mb19wdHIgIT0gTlVMTCkgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NSR0IpKQotICAgICAgewotICAgICAgaWYgKFBOR19PVVRfT0ZfUkFOR0UoaW50X3hfd2hpdGUsIDMxMjcwLCAgMTAwMCkgfHwKLSAgICAgICAgICBQTkdfT1VUX09GX1JBTkdFKGludF95X3doaXRlLCAzMjkwMCwgIDEwMDApIHx8Ci0gICAgICAgICAgUE5HX09VVF9PRl9SQU5HRShpbnRfeF9yZWQsICAgNjQwMDBMLCAxMDAwKSB8fAotICAgICAgICAgIFBOR19PVVRfT0ZfUkFOR0UoaW50X3lfcmVkLCAgIDMzMDAwLCAgMTAwMCkgfHwKLSAgICAgICAgICBQTkdfT1VUX09GX1JBTkdFKGludF94X2dyZWVuLCAzMDAwMCwgIDEwMDApIHx8Ci0gICAgICAgICAgUE5HX09VVF9PRl9SQU5HRShpbnRfeV9ncmVlbiwgNjAwMDBMLCAxMDAwKSB8fAotICAgICAgICAgIFBOR19PVVRfT0ZfUkFOR0UoaW50X3hfYmx1ZSwgIDE1MDAwLCAgMTAwMCkgfHwKLSAgICAgICAgICBQTkdfT1VUX09GX1JBTkdFKGludF95X2JsdWUsICAgNjAwMCwgIDEwMDApKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgICAgICAgIklnbm9yaW5nIGluY29ycmVjdCBjSFJNIHZhbHVlIHdoZW4gc1JHQiBpcyBhbHNvIHByZXNlbnQiKTsKLSNpZmRlZiBQTkdfQ09OU09MRV9JT19TVVBQT1JURUQKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInd4PSVmLCB3eT0lZiwgcng9JWYsIHJ5PSVmXG4iLAotICAgICAgICAgICAgICAgd2hpdGVfeCwgd2hpdGVfeSwgcmVkX3gsIHJlZF95KTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3g9JWYsIGd5PSVmLCBieD0lZiwgYnk9JWZcbiIsCi0gICAgICAgICAgICAgICBncmVlbl94LCBncmVlbl95LCBibHVlX3gsIGJsdWVfeSk7Ci0jZWxzZQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ3eD0lbGQsIHd5PSVsZCwgcng9JWxkLCByeT0lbGRcbiIsCi0gICAgICAgICAgICAgICAobG9uZylpbnRfeF93aGl0ZSwgKGxvbmcpaW50X3lfd2hpdGUsCi0gICAgICAgICAgICAgICAobG9uZylpbnRfeF9yZWQsIChsb25nKWludF95X3JlZCk7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd4PSVsZCwgZ3k9JWxkLCBieD0lbGQsIGJ5PSVsZFxuIiwKLSAgICAgICAgICAgICAgIChsb25nKWludF94X2dyZWVuLCAobG9uZylpbnRfeV9ncmVlbiwKLSAgICAgICAgICAgICAgIChsb25nKWludF94X2JsdWUsIChsb25nKWludF95X2JsdWUpOwotI2VuZGlmCi0jZW5kaWYgLyogUE5HX0NPTlNPTEVfSU9fU1VQUE9SVEVEICovCi0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0jZW5kaWYgLyogUE5HX1JFQURfc1JHQl9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgIHBuZ19zZXRfY0hSTShwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAgIHdoaXRlX3gsIHdoaXRlX3ksIHJlZF94LCByZWRfeSwgZ3JlZW5feCwgZ3JlZW5feSwgYmx1ZV94LCBibHVlX3kpOwotI2VuZGlmCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotICAgcG5nX3NldF9jSFJNX2ZpeGVkKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgaW50X3hfd2hpdGUsIGludF95X3doaXRlLCBpbnRfeF9yZWQsIGludF95X3JlZCwgaW50X3hfZ3JlZW4sCi0gICAgICBpbnRfeV9ncmVlbiwgaW50X3hfYmx1ZSwgaW50X3lfYmx1ZSk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2hhbmRsZV9zUkdCKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQotewotICAgaW50IGludGVudDsKLSAgIHBuZ19ieXRlIGJ1ZlsxXTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX3NSR0IiKTsKLQotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIHNSR0IiKTsKLSAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgc1JHQiBhZnRlciBJREFUIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpCi0gICAgICAvKiBTaG91bGQgYmUgYW4gZXJyb3IsIGJ1dCB3ZSBjYW4gY29wZSB3aXRoIGl0ICovCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3V0IG9mIHBsYWNlIHNSR0IgY2h1bmsiKTsKLQotICAgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NSR0IpKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkR1cGxpY2F0ZSBzUkdCIGNodW5rIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBpZiAobGVuZ3RoICE9IDEpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5jb3JyZWN0IHNSR0IgY2h1bmsgbGVuZ3RoIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCAxKTsKLSAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkKLSAgICAgIHJldHVybjsKLQotICAgaW50ZW50ID0gYnVmWzBdOwotICAgLyogQ2hlY2sgZm9yIGJhZCBpbnRlbnQgKi8KLSAgIGlmIChpbnRlbnQgPj0gUE5HX3NSR0JfSU5URU5UX0xBU1QpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5rbm93biBzUkdCIGludGVudCIpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpCi0gICBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fZ0FNQSkpCi0gICB7Ci0gICBwbmdfZml4ZWRfcG9pbnQgaWdhbW1hOwotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLSAgICAgIGlnYW1tYT1pbmZvX3B0ci0+aW50X2dhbW1hOwotI2Vsc2UKLSMgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgICAgIGlnYW1tYT0ocG5nX2ZpeGVkX3BvaW50KShpbmZvX3B0ci0+Z2FtbWEgKiAxMDAwMDAuKTsKLSMgIGVuZGlmCi0jZW5kaWYKLSAgICAgIGlmIChQTkdfT1VUX09GX1JBTkdFKGlnYW1tYSwgNDU1MDBMLCA1MDApKQotICAgICAgewotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgICAgIklnbm9yaW5nIGluY29ycmVjdCBnQU1BIHZhbHVlIHdoZW4gc1JHQiBpcyBhbHNvIHByZXNlbnQiKTsKLSNpZmRlZiBQTkdfQ09OU09MRV9JT19TVVBQT1JURUQKLSMgIGlmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5jb3JyZWN0IGdhbW1hPSglZC8xMDAwMDApXG4iLAotICAgICAgICAgICAgKGludClwbmdfcHRyLT5pbnRfZ2FtbWEpOwotIyAgZWxzZQotIyAgICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImluY29ycmVjdCBnYW1tYT0lZlxuIiwgcG5nX3B0ci0+Z2FtbWEpOwotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotICAgICAgfQotICAgfQotI2VuZGlmIC8qIFBOR19SRUFEX2dBTUFfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRAotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLSAgIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19jSFJNKSkKLSAgICAgIGlmIChQTkdfT1VUX09GX1JBTkdFKGluZm9fcHRyLT5pbnRfeF93aGl0ZSwgMzEyNzAsICAxMDAwKSB8fAotICAgICAgICAgIFBOR19PVVRfT0ZfUkFOR0UoaW5mb19wdHItPmludF95X3doaXRlLCAzMjkwMCwgIDEwMDApIHx8Ci0gICAgICAgICAgUE5HX09VVF9PRl9SQU5HRShpbmZvX3B0ci0+aW50X3hfcmVkLCAgIDY0MDAwTCwgMTAwMCkgfHwKLSAgICAgICAgICBQTkdfT1VUX09GX1JBTkdFKGluZm9fcHRyLT5pbnRfeV9yZWQsICAgMzMwMDAsICAxMDAwKSB8fAotICAgICAgICAgIFBOR19PVVRfT0ZfUkFOR0UoaW5mb19wdHItPmludF94X2dyZWVuLCAzMDAwMCwgIDEwMDApIHx8Ci0gICAgICAgICAgUE5HX09VVF9PRl9SQU5HRShpbmZvX3B0ci0+aW50X3lfZ3JlZW4sIDYwMDAwTCwgMTAwMCkgfHwKLSAgICAgICAgICBQTkdfT1VUX09GX1JBTkdFKGluZm9fcHRyLT5pbnRfeF9ibHVlLCAgMTUwMDAsICAxMDAwKSB8fAotICAgICAgICAgIFBOR19PVVRfT0ZfUkFOR0UoaW5mb19wdHItPmludF95X2JsdWUsICAgNjAwMCwgIDEwMDApKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgICAgICAgIklnbm9yaW5nIGluY29ycmVjdCBjSFJNIHZhbHVlIHdoZW4gc1JHQiBpcyBhbHNvIHByZXNlbnQiKTsKLSAgICAgICAgIH0KLSNlbmRpZiAvKiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEICovCi0jZW5kaWYgLyogUE5HX1JFQURfY0hSTV9TVVBQT1JURUQgKi8KLQotICAgcG5nX3NldF9zUkdCX2dBTUFfYW5kX2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsIGludGVudCk7Ci19Ci0jZW5kaWYgLyogUE5HX1JFQURfc1JHQl9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVECi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfaUNDUChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLS8qIE5vdGU6IHRoaXMgZG9lcyBub3QgcHJvcGVybHkgaGFuZGxlIGNodW5rcyB0aGF0IGFyZSA+IDY0SyB1bmRlciBET1MgKi8KLXsKLSAgIHBuZ19ieXRlIGNvbXByZXNzaW9uX3R5cGU7Ci0gICBwbmdfYnl0ZXAgcEM7Ci0gICBwbmdfY2hhcnAgcHJvZmlsZTsKLSAgIHBuZ191aW50XzMyIHNraXAgPSAwOwotICAgcG5nX3VpbnRfMzIgcHJvZmlsZV9zaXplLCBwcm9maWxlX2xlbmd0aDsKLSAgIHBuZ19zaXplX3Qgc2xlbmd0aCwgcHJlZml4X2xlbmd0aCwgZGF0YV9sZW5ndGg7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9pQ0NQIik7Ci0KLSAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBpQ0NQIik7Ci0gICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGlDQ1AgYWZ0ZXIgSURBVCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKQotICAgICAgLyogU2hvdWxkIGJlIGFuIGVycm9yLCBidXQgd2UgY2FuIGNvcGUgd2l0aCBpdCAqLwotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk91dCBvZiBwbGFjZSBpQ0NQIGNodW5rIik7Ci0KLSAgIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19pQ0NQKSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJEdXBsaWNhdGUgaUNDUCBjaHVuayIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotI2lmZGVmIFBOR19NQVhfTUFMTE9DXzY0SwotICAgaWYgKGxlbmd0aCA+IChwbmdfdWludF8zMik2NTUzNUwpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiaUNDUCBjaHVuayB0b28gbGFyZ2UgdG8gZml0IGluIG1lbW9yeSIpOwotICAgICAgc2tpcCA9IGxlbmd0aCAtIChwbmdfdWludF8zMik2NTUzNUw7Ci0gICAgICBsZW5ndGggPSAocG5nX3VpbnRfMzIpNjU1MzVMOwotICAgfQotI2VuZGlmCi0KLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICBwbmdfcHRyLT5jaHVua2RhdGEgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2MocG5nX3B0ciwgbGVuZ3RoICsgMSk7Ci0gICBzbGVuZ3RoID0gKHBuZ19zaXplX3QpbGVuZ3RoOwotICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3B0ci0+Y2h1bmtkYXRhLCBzbGVuZ3RoKTsKLQotICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIHNraXApKQotICAgewotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIHBuZ19wdHItPmNodW5rZGF0YVtzbGVuZ3RoXSA9IDB4MDA7Ci0KLSAgIGZvciAocHJvZmlsZSA9IHBuZ19wdHItPmNodW5rZGF0YTsgKnByb2ZpbGU7IHByb2ZpbGUrKykKLSAgICAgIC8qIEVtcHR5IGxvb3AgdG8gZmluZCBlbmQgb2YgbmFtZSAqLyA7Ci0KLSAgICsrcHJvZmlsZTsKLQotICAgLyogVGhlcmUgc2hvdWxkIGJlIGF0IGxlYXN0IG9uZSB6ZXJvICh0aGUgY29tcHJlc3Npb24gdHlwZSBieXRlKQotICAgICogZm9sbG93aW5nIHRoZSBzZXBhcmF0b3IsIGFuZCB3ZSBzaG91bGQgYmUgb24gaXQKLSAgICAqLwotICAgaWYgKCBwcm9maWxlID49IHBuZ19wdHItPmNodW5rZGF0YSArIHNsZW5ndGggLSAxKQotICAgewotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTWFsZm9ybWVkIGlDQ1AgY2h1bmsiKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgLyogQ29tcHJlc3Npb25fdHlwZSBzaG91bGQgYWx3YXlzIGJlIHplcm8gKi8KLSAgIGNvbXByZXNzaW9uX3R5cGUgPSAqcHJvZmlsZSsrOwotICAgaWYgKGNvbXByZXNzaW9uX3R5cGUpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSWdub3Jpbmcgbm9uemVybyBjb21wcmVzc2lvbiB0eXBlIGluIGlDQ1AgY2h1bmsiKTsKLSAgICAgIGNvbXByZXNzaW9uX3R5cGUgPSAweDAwOyAgLyogUmVzZXQgaXQgdG8gemVybyAobGlicG5nLTEuMC42IHRocm91Z2ggMS4wLjgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyb3RlIG5vbnplcm8pICovCi0gICB9Ci0KLSAgIHByZWZpeF9sZW5ndGggPSBwcm9maWxlIC0gcG5nX3B0ci0+Y2h1bmtkYXRhOwotICAgcG5nX2RlY29tcHJlc3NfY2h1bmsocG5nX3B0ciwgY29tcHJlc3Npb25fdHlwZSwKLSAgICAgc2xlbmd0aCwgcHJlZml4X2xlbmd0aCwgJmRhdGFfbGVuZ3RoKTsKLQotICAgcHJvZmlsZV9sZW5ndGggPSBkYXRhX2xlbmd0aCAtIHByZWZpeF9sZW5ndGg7Ci0KLSAgIGlmICggcHJlZml4X2xlbmd0aCA+IGRhdGFfbGVuZ3RoIHx8IHByb2ZpbGVfbGVuZ3RoIDwgNCkKLSAgIHsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlByb2ZpbGUgc2l6ZSBmaWVsZCBtaXNzaW5nIGZyb20gaUNDUCBjaHVuayIpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICAvKiBDaGVjayB0aGUgcHJvZmlsZV9zaXplIHJlY29yZGVkIGluIHRoZSBmaXJzdCAzMiBiaXRzIG9mIHRoZSBJQ0MgcHJvZmlsZSAqLwotICAgcEMgPSAocG5nX2J5dGVwKShwbmdfcHRyLT5jaHVua2RhdGEgKyBwcmVmaXhfbGVuZ3RoKTsKLSAgIHByb2ZpbGVfc2l6ZSA9ICgoKihwQyAgICApKTw8MjQpIHwKLSAgICAgICAgICAgICAgICAgICgoKihwQyArIDEpKTw8MTYpIHwKLSAgICAgICAgICAgICAgICAgICgoKihwQyArIDIpKTw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICgoKihwQyArIDMpKSAgICApOwotCi0gICBpZiAocHJvZmlsZV9zaXplIDwgcHJvZmlsZV9sZW5ndGgpCi0gICAgICBwcm9maWxlX2xlbmd0aCA9IHByb2ZpbGVfc2l6ZTsKLQotICAgaWYgKHByb2ZpbGVfc2l6ZSA+IHByb2ZpbGVfbGVuZ3RoKQotICAgewotI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQKLSAgICAgICAgIGNoYXIgdW1zZ1s1MF07Ci0jZW5kaWYKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIklnbm9yaW5nIHRydW5jYXRlZCBpQ0NQIHByb2ZpbGUiKTsKLSNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECi0KLSAgICAgIHBuZ19zbnByaW50Zih1bXNnLCA1MCwgImRlY2xhcmVkIHByb2ZpbGUgc2l6ZSA9ICVsdSIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpcHJvZmlsZV9zaXplKTsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIHVtc2cpOwotICAgICAgcG5nX3NucHJpbnRmKHVtc2csIDUwLCAiYWN0dWFsIHByb2ZpbGUgbGVuZ3RoID0gJWx1IiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZylwcm9maWxlX2xlbmd0aCk7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCB1bXNnKTsKLSNlbmRpZgotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfc2V0X2lDQ1AocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSwKLSAgICAgY29tcHJlc3Npb25fdHlwZSwgcG5nX3B0ci0+Y2h1bmtkYXRhICsgcHJlZml4X2xlbmd0aCwgcHJvZmlsZV9sZW5ndGgpOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci19Ci0jZW5kaWYgLyogUE5HX1JFQURfaUNDUF9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBOR19SRUFEX3NQTFRfU1VQUE9SVEVECi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfc1BMVChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLS8qIE5vdGU6IHRoaXMgZG9lcyBub3QgcHJvcGVybHkgaGFuZGxlIGNodW5rcyB0aGF0IGFyZSA+IDY0SyB1bmRlciBET1MgKi8KLXsKLSAgIHBuZ19ieXRlcCBlbnRyeV9zdGFydDsKLSAgIHBuZ19zUExUX3QgbmV3X3BhbGV0dGU7Ci0gICBwbmdfc1BMVF9lbnRyeXAgcHA7Ci0gICBpbnQgZGF0YV9sZW5ndGgsIGVudHJ5X3NpemUsIGk7Ci0gICBwbmdfdWludF8zMiBza2lwID0gMDsKLSAgIHBuZ19zaXplX3Qgc2xlbmd0aDsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX3NQTFQiKTsKLQotI2lmZGVmIFBOR19VU0VSX0xJTUlUU19TVVBQT1JURUQKLQotICAgaWYgKHBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ICE9IDApCi0gICB7Ci0gICAgICBpZiAocG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggPT0gMSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAoLS1wbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCA9PSAxKQotICAgICAgewotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk5vIHNwYWNlIGluIGNodW5rIGNhY2hlIGZvciBzUExUIik7Ci0gICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgfQotI2VuZGlmCi0KLSAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBzUExUIik7Ci0gICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHNQTFQgYWZ0ZXIgSURBVCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotI2lmZGVmIFBOR19NQVhfTUFMTE9DXzY0SwotICAgaWYgKGxlbmd0aCA+IChwbmdfdWludF8zMik2NTUzNUwpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAic1BMVCBjaHVuayB0b28gbGFyZ2UgdG8gZml0IGluIG1lbW9yeSIpOwotICAgICAgc2tpcCA9IGxlbmd0aCAtIChwbmdfdWludF8zMik2NTUzNUw7Ci0gICAgICBsZW5ndGggPSAocG5nX3VpbnRfMzIpNjU1MzVMOwotICAgfQotI2VuZGlmCi0KLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICBwbmdfcHRyLT5jaHVua2RhdGEgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2MocG5nX3B0ciwgbGVuZ3RoICsgMSk7Ci0gICBzbGVuZ3RoID0gbGVuZ3RoOwotICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3B0ci0+Y2h1bmtkYXRhLCBzbGVuZ3RoKTsKLQotICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIHNraXApKQotICAgewotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIHBuZ19wdHItPmNodW5rZGF0YVtzbGVuZ3RoXSA9IDB4MDA7Ci0KLSAgIGZvciAoZW50cnlfc3RhcnQgPSAocG5nX2J5dGVwKXBuZ19wdHItPmNodW5rZGF0YTsgKmVudHJ5X3N0YXJ0OwotICAgICAgIGVudHJ5X3N0YXJ0KyspCi0gICAgICAvKiBFbXB0eSBsb29wIHRvIGZpbmQgZW5kIG9mIG5hbWUgKi8gOwotICAgKytlbnRyeV9zdGFydDsKLQotICAgLyogQSBzYW1wbGUgZGVwdGggc2hvdWxkIGZvbGxvdyB0aGUgc2VwYXJhdG9yLCBhbmQgd2Ugc2hvdWxkIGJlIG9uIGl0ICAqLwotICAgaWYgKGVudHJ5X3N0YXJ0ID4gKHBuZ19ieXRlcClwbmdfcHRyLT5jaHVua2RhdGEgKyBzbGVuZ3RoIC0gMikKLSAgIHsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIm1hbGZvcm1lZCBzUExUIGNodW5rIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIG5ld19wYWxldHRlLmRlcHRoID0gKmVudHJ5X3N0YXJ0Kys7Ci0gICBlbnRyeV9zaXplID0gKG5ld19wYWxldHRlLmRlcHRoID09IDggPyA2IDogMTApOwotICAgZGF0YV9sZW5ndGggPSAoc2xlbmd0aCAtIChlbnRyeV9zdGFydCAtIChwbmdfYnl0ZXApcG5nX3B0ci0+Y2h1bmtkYXRhKSk7Ci0KLSAgIC8qIEludGVncml0eS1jaGVjayB0aGUgZGF0YSBsZW5ndGggKi8KLSAgIGlmIChkYXRhX2xlbmd0aCAlIGVudHJ5X3NpemUpCi0gICB7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJzUExUIGNodW5rIGhhcyBiYWQgbGVuZ3RoIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIG5ld19wYWxldHRlLm5lbnRyaWVzID0gKHBuZ19pbnRfMzIpICggZGF0YV9sZW5ndGggLyBlbnRyeV9zaXplKTsKLSAgIGlmICgocG5nX3VpbnRfMzIpIG5ld19wYWxldHRlLm5lbnRyaWVzID4KLSAgICAgICAocG5nX3VpbnRfMzIpIChQTkdfU0laRV9NQVggLyBwbmdfc2l6ZW9mKHBuZ19zUExUX2VudHJ5KSkpCi0gICB7Ci0gICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgInNQTFQgY2h1bmsgdG9vIGxvbmciKTsKLSAgICAgICByZXR1cm47Ci0gICB9Ci0gICBuZXdfcGFsZXR0ZS5lbnRyaWVzID0gKHBuZ19zUExUX2VudHJ5cClwbmdfbWFsbG9jX3dhcm4oCi0gICAgICAgcG5nX3B0ciwgbmV3X3BhbGV0dGUubmVudHJpZXMgKiBwbmdfc2l6ZW9mKHBuZ19zUExUX2VudHJ5KSk7Ci0gICBpZiAobmV3X3BhbGV0dGUuZW50cmllcyA9PSBOVUxMKQotICAgewotICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJzUExUIGNodW5rIHJlcXVpcmVzIHRvbyBtdWNoIG1lbW9yeSIpOwotICAgICAgIHJldHVybjsKLSAgIH0KLQotI2lmZGVmIFBOR19QT0lOVEVSX0lOREVYSU5HX1NVUFBPUlRFRAotICAgZm9yIChpID0gMDsgaSA8IG5ld19wYWxldHRlLm5lbnRyaWVzOyBpKyspCi0gICB7Ci0gICAgICBwcCA9IG5ld19wYWxldHRlLmVudHJpZXMgKyBpOwotCi0gICAgICBpZiAobmV3X3BhbGV0dGUuZGVwdGggPT0gOCkKLSAgICAgIHsKLSAgICAgICAgICBwcC0+cmVkID0gKmVudHJ5X3N0YXJ0Kys7Ci0gICAgICAgICAgcHAtPmdyZWVuID0gKmVudHJ5X3N0YXJ0Kys7Ci0gICAgICAgICAgcHAtPmJsdWUgPSAqZW50cnlfc3RhcnQrKzsKLSAgICAgICAgICBwcC0+YWxwaGEgPSAqZW50cnlfc3RhcnQrKzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgICBwcC0+cmVkICAgPSBwbmdfZ2V0X3VpbnRfMTYoZW50cnlfc3RhcnQpOyBlbnRyeV9zdGFydCArPSAyOwotICAgICAgICAgIHBwLT5ncmVlbiA9IHBuZ19nZXRfdWludF8xNihlbnRyeV9zdGFydCk7IGVudHJ5X3N0YXJ0ICs9IDI7Ci0gICAgICAgICAgcHAtPmJsdWUgID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKLSAgICAgICAgICBwcC0+YWxwaGEgPSBwbmdfZ2V0X3VpbnRfMTYoZW50cnlfc3RhcnQpOyBlbnRyeV9zdGFydCArPSAyOwotICAgICAgfQotICAgICAgcHAtPmZyZXF1ZW5jeSA9IHBuZ19nZXRfdWludF8xNihlbnRyeV9zdGFydCk7IGVudHJ5X3N0YXJ0ICs9IDI7Ci0gICB9Ci0jZWxzZQotICAgcHAgPSBuZXdfcGFsZXR0ZS5lbnRyaWVzOwotICAgZm9yIChpID0gMDsgaSA8IG5ld19wYWxldHRlLm5lbnRyaWVzOyBpKyspCi0gICB7Ci0KLSAgICAgIGlmIChuZXdfcGFsZXR0ZS5kZXB0aCA9PSA4KQotICAgICAgewotICAgICAgICAgIHBwW2ldLnJlZCAgID0gKmVudHJ5X3N0YXJ0Kys7Ci0gICAgICAgICAgcHBbaV0uZ3JlZW4gPSAqZW50cnlfc3RhcnQrKzsKLSAgICAgICAgICBwcFtpXS5ibHVlICA9ICplbnRyeV9zdGFydCsrOwotICAgICAgICAgIHBwW2ldLmFscGhhID0gKmVudHJ5X3N0YXJ0Kys7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICAgcHBbaV0ucmVkICAgPSBwbmdfZ2V0X3VpbnRfMTYoZW50cnlfc3RhcnQpOyBlbnRyeV9zdGFydCArPSAyOwotICAgICAgICAgIHBwW2ldLmdyZWVuID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKLSAgICAgICAgICBwcFtpXS5ibHVlICA9IHBuZ19nZXRfdWludF8xNihlbnRyeV9zdGFydCk7IGVudHJ5X3N0YXJ0ICs9IDI7Ci0gICAgICAgICAgcHBbaV0uYWxwaGEgPSBwbmdfZ2V0X3VpbnRfMTYoZW50cnlfc3RhcnQpOyBlbnRyeV9zdGFydCArPSAyOwotICAgICAgfQotICAgICAgcHBbaV0uZnJlcXVlbmN5ID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKLSAgIH0KLSNlbmRpZgotCi0gICAvKiBEaXNjYXJkIGFsbCBjaHVuayBkYXRhIGV4Y2VwdCB0aGUgbmFtZSBhbmQgc3Rhc2ggdGhhdCAqLwotICAgbmV3X3BhbGV0dGUubmFtZSA9IHBuZ19wdHItPmNodW5rZGF0YTsKLQotICAgcG5nX3NldF9zUExUKHBuZ19wdHIsIGluZm9fcHRyLCAmbmV3X3BhbGV0dGUsIDEpOwotCi0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIG5ld19wYWxldHRlLmVudHJpZXMpOwotfQotI2VuZGlmIC8qIFBOR19SRUFEX3NQTFRfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBQTkdfUkVBRF90Uk5TX1NVUFBPUlRFRAotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfaGFuZGxlX3RSTlMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCi17Ci0gICBwbmdfYnl0ZSByZWFkYnVmW1BOR19NQVhfUEFMRVRURV9MRU5HVEhdOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfdFJOUyIpOwotCi0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgdFJOUyIpOwotICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCB0Uk5TIGFmdGVyIElEQVQiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBlbHNlIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT190Uk5TKSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJEdXBsaWNhdGUgdFJOUyBjaHVuayIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKLSAgIHsKLSAgICAgIHBuZ19ieXRlIGJ1ZlsyXTsKLQotICAgICAgaWYgKGxlbmd0aCAhPSAyKQotICAgICAgewotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluY29ycmVjdCB0Uk5TIGNodW5rIGxlbmd0aCIpOwotICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgMik7Ci0gICAgICBwbmdfcHRyLT5udW1fdHJhbnMgPSAxOwotICAgICAgcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JheSA9IHBuZ19nZXRfdWludF8xNihidWYpOwotICAgfQotICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCi0gICB7Ci0gICAgICBwbmdfYnl0ZSBidWZbNl07Ci0KLSAgICAgIGlmIChsZW5ndGggIT0gNikKLSAgICAgIHsKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbmNvcnJlY3QgdFJOUyBjaHVuayBsZW5ndGgiKTsKLSAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCAocG5nX3NpemVfdClsZW5ndGgpOwotICAgICAgcG5nX3B0ci0+bnVtX3RyYW5zID0gMTsKLSAgICAgIHBuZ19wdHItPnRyYW5zX2NvbG9yLnJlZCA9IHBuZ19nZXRfdWludF8xNihidWYpOwotICAgICAgcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JlZW4gPSBwbmdfZ2V0X3VpbnRfMTYoYnVmICsgMik7Ci0gICAgICBwbmdfcHRyLT50cmFuc19jb2xvci5ibHVlID0gcG5nX2dldF91aW50XzE2KGJ1ZiArIDQpOwotICAgfQotICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgewotICAgICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpKQotICAgICAgewotICAgICAgICAgLyogU2hvdWxkIGJlIGFuIGVycm9yLCBidXQgd2UgY2FuIGNvcGUgd2l0aCBpdC4gKi8KLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJNaXNzaW5nIFBMVEUgYmVmb3JlIHRSTlMiKTsKLSAgICAgIH0KLSAgICAgIGlmIChsZW5ndGggPiAocG5nX3VpbnRfMzIpcG5nX3B0ci0+bnVtX3BhbGV0dGUgfHwKLSAgICAgICAgICBsZW5ndGggPiBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIKQotICAgICAgewotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluY29ycmVjdCB0Uk5TIGNodW5rIGxlbmd0aCIpOwotICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChsZW5ndGggPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJaZXJvIGxlbmd0aCB0Uk5TIGNodW5rIik7Ci0gICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIHJlYWRidWYsIChwbmdfc2l6ZV90KWxlbmd0aCk7Ci0gICAgICBwbmdfcHRyLT5udW1fdHJhbnMgPSAocG5nX3VpbnRfMTYpbGVuZ3RoOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgInRSTlMgY2h1bmsgbm90IGFsbG93ZWQgd2l0aCBhbHBoYSBjaGFubmVsIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpCi0gICB7Ci0gICAgICBwbmdfcHRyLT5udW1fdHJhbnMgPSAwOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfc2V0X3RSTlMocG5nX3B0ciwgaW5mb19wdHIsIHJlYWRidWYsIHBuZ19wdHItPm51bV90cmFucywKLSAgICAgICYocG5nX3B0ci0+dHJhbnNfY29sb3IpKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfYktHRF9TVVBQT1JURUQKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2hhbmRsZV9iS0dEKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQotewotICAgcG5nX3NpemVfdCB0cnVlbGVuOwotICAgcG5nX2J5dGUgYnVmWzZdOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfYktHRCIpOwotCi0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgYktHRCIpOwotICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBiS0dEIGFmdGVyIElEQVQiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgJiYKLSAgICAgICAgICAgICEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk1pc3NpbmcgUExURSBiZWZvcmUgYktHRCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIGVsc2UgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2JLR0QpKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkR1cGxpY2F0ZSBiS0dEIGNodW5rIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgdHJ1ZWxlbiA9IDE7Ci0gICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCi0gICAgICB0cnVlbGVuID0gNjsKLSAgIGVsc2UKLSAgICAgIHRydWVsZW4gPSAyOwotCi0gICBpZiAobGVuZ3RoICE9IHRydWVsZW4pCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5jb3JyZWN0IGJLR0QgY2h1bmsgbGVuZ3RoIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCB0cnVlbGVuKTsKLSAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkKLSAgICAgIHJldHVybjsKLQotICAgLyogV2UgY29udmVydCB0aGUgaW5kZXggdmFsdWUgaW50byBSR0IgY29tcG9uZW50cyBzbyB0aGF0IHdlIGNhbiBhbGxvdwotICAgICogYXJiaXRyYXJ5IFJHQiB2YWx1ZXMgZm9yIGJhY2tncm91bmQgd2hlbiB3ZSBoYXZlIHRyYW5zcGFyZW5jeSwgYW5kCi0gICAgKiBzbyBpdCBpcyBlYXN5IHRvIGRldGVybWluZSB0aGUgUkdCIHZhbHVlcyBvZiB0aGUgYmFja2dyb3VuZCBjb2xvcgotICAgICogZnJvbSB0aGUgaW5mb19wdHIgc3RydWN0LiAqLwotICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgIHsKLSAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuaW5kZXggPSBidWZbMF07Ci0gICAgICBpZiAoaW5mb19wdHIgJiYgaW5mb19wdHItPm51bV9wYWxldHRlKQotICAgICAgewotICAgICAgICAgIGlmIChidWZbMF0gPj0gaW5mb19wdHItPm51bV9wYWxldHRlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5jb3JyZWN0IGJLR0QgY2h1bmsgaW5kZXggdmFsdWUiKTsKLSAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQucmVkID0KLSAgICAgICAgICAgICAocG5nX3VpbnRfMTYpcG5nX3B0ci0+cGFsZXR0ZVtidWZbMF1dLnJlZDsKLSAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuID0KLSAgICAgICAgICAgICAocG5nX3VpbnRfMTYpcG5nX3B0ci0+cGFsZXR0ZVtidWZbMF1dLmdyZWVuOwotICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSA9Ci0gICAgICAgICAgICAgKHBuZ191aW50XzE2KXBuZ19wdHItPnBhbGV0dGVbYnVmWzBdXS5ibHVlOwotICAgICAgfQotICAgfQotICAgZWxzZSBpZiAoIShwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKSAvKiBHUkFZICovCi0gICB7Ci0gICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA9Ci0gICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuID0KLSAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSA9Ci0gICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgPSBwbmdfZ2V0X3VpbnRfMTYoYnVmKTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIHBuZ19wdHItPmJhY2tncm91bmQucmVkID0gcG5nX2dldF91aW50XzE2KGJ1Zik7Ci0gICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuID0gcG5nX2dldF91aW50XzE2KGJ1ZiArIDIpOwotICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlID0gcG5nX2dldF91aW50XzE2KGJ1ZiArIDQpOwotICAgfQotCi0gICBwbmdfc2V0X2JLR0QocG5nX3B0ciwgaW5mb19wdHIsICYocG5nX3B0ci0+YmFja2dyb3VuZCkpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRAotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfaGFuZGxlX2hJU1QocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCi17Ci0gICB1bnNpZ25lZCBpbnQgbnVtLCBpOwotICAgcG5nX3VpbnRfMTYgcmVhZGJ1ZltQTkdfTUFYX1BBTEVUVEVfTEVOR1RIXTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX2hJU1QiKTsKLQotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIGhJU1QiKTsKLSAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgaElTVCBhZnRlciBJREFUIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotICAgZWxzZSBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUExURSkpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTWlzc2luZyBQTFRFIGJlZm9yZSBoSVNUIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotICAgZWxzZSBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9faElTVCkpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiRHVwbGljYXRlIGhJU1QgY2h1bmsiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIGlmIChsZW5ndGggPiAyKlBOR19NQVhfUEFMRVRURV9MRU5HVEggfHwKLSAgICAgICBsZW5ndGggIT0gKHVuc2lnbmVkIGludCkgKDIqcG5nX3B0ci0+bnVtX3BhbGV0dGUpKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluY29ycmVjdCBoSVNUIGNodW5rIGxlbmd0aCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgbnVtID0gbGVuZ3RoIC8gMiA7Ci0KLSAgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKLSAgIHsKLSAgICAgIHBuZ19ieXRlIGJ1ZlsyXTsKLQotICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgMik7Ci0gICAgICByZWFkYnVmW2ldID0gcG5nX2dldF91aW50XzE2KGJ1Zik7Ci0gICB9Ci0KLSAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkKLSAgICAgIHJldHVybjsKLQotICAgcG5nX3NldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCByZWFkYnVmKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfcEhZc19TVVBQT1JURUQKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2hhbmRsZV9wSFlzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQotewotICAgcG5nX2J5dGUgYnVmWzldOwotICAgcG5nX3VpbnRfMzIgcmVzX3gsIHJlc195OwotICAgaW50IHVuaXRfdHlwZTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX3BIWXMiKTsKLQotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIHBIWXMiKTsKLSAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgcEhZcyBhZnRlciBJREFUIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotICAgZWxzZSBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fcEhZcykpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiRHVwbGljYXRlIHBIWXMgY2h1bmsiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIGlmIChsZW5ndGggIT0gOSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbmNvcnJlY3QgcEhZcyBjaHVuayBsZW5ndGgiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWYsIDkpOwotICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQotICAgICAgcmV0dXJuOwotCi0gICByZXNfeCA9IHBuZ19nZXRfdWludF8zMihidWYpOwotICAgcmVzX3kgPSBwbmdfZ2V0X3VpbnRfMzIoYnVmICsgNCk7Ci0gICB1bml0X3R5cGUgPSBidWZbOF07Ci0gICBwbmdfc2V0X3BIWXMocG5nX3B0ciwgaW5mb19wdHIsIHJlc194LCByZXNfeSwgdW5pdF90eXBlKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfb0ZGc19TVVBQT1JURUQKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2hhbmRsZV9vRkZzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQotewotICAgcG5nX2J5dGUgYnVmWzldOwotICAgcG5nX2ludF8zMiBvZmZzZXRfeCwgb2Zmc2V0X3k7Ci0gICBpbnQgdW5pdF90eXBlOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfb0ZGcyIpOwotCi0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgb0ZGcyIpOwotICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBvRkZzIGFmdGVyIElEQVQiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBlbHNlIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19vRkZzKSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJEdXBsaWNhdGUgb0ZGcyBjaHVuayIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgaWYgKGxlbmd0aCAhPSA5KQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluY29ycmVjdCBvRkZzIGNodW5rIGxlbmd0aCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgOSk7Ci0gICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpCi0gICAgICByZXR1cm47Ci0KLSAgIG9mZnNldF94ID0gcG5nX2dldF9pbnRfMzIoYnVmKTsKLSAgIG9mZnNldF95ID0gcG5nX2dldF9pbnRfMzIoYnVmICsgNCk7Ci0gICB1bml0X3R5cGUgPSBidWZbOF07Ci0gICBwbmdfc2V0X29GRnMocG5nX3B0ciwgaW5mb19wdHIsIG9mZnNldF94LCBvZmZzZXRfeSwgdW5pdF90eXBlKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfcENBTF9TVVBQT1JURUQKLS8qIFJlYWQgdGhlIHBDQUwgY2h1bmsgKGRlc2NyaWJlZCBpbiB0aGUgUE5HIEV4dGVuc2lvbnMgZG9jdW1lbnQpICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfcENBTChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLXsKLSAgIHBuZ19pbnRfMzIgWDAsIFgxOwotICAgcG5nX2J5dGUgdHlwZSwgbnBhcmFtczsKLSAgIHBuZ19jaGFycCBidWYsIHVuaXRzLCBlbmRwdHI7Ci0gICBwbmdfY2hhcnBwIHBhcmFtczsKLSAgIHBuZ19zaXplX3Qgc2xlbmd0aDsKLSAgIGludCBpOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfcENBTCIpOwotCi0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgcENBTCIpOwotICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBwQ0FMIGFmdGVyIElEQVQiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBlbHNlIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wQ0FMKSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJEdXBsaWNhdGUgcENBTCBjaHVuayIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX2RlYnVnMSgyLCAiQWxsb2NhdGluZyBhbmQgcmVhZGluZyBwQ0FMIGNodW5rIGRhdGEgKCVsdSBieXRlcykiLAotICAgICAgKHVuc2lnbmVkIGxvbmcpKGxlbmd0aCArIDEpKTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICBwbmdfcHRyLT5jaHVua2RhdGEgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGggKyAxKTsKLSAgIGlmIChwbmdfcHRyLT5jaHVua2RhdGEgPT0gTlVMTCkKLSAgICAgewotICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJObyBtZW1vcnkgZm9yIHBDQUwgcHVycG9zZSIpOwotICAgICAgIHJldHVybjsKLSAgICAgfQotICAgc2xlbmd0aCA9IChwbmdfc2l6ZV90KWxlbmd0aDsKLSAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19wdHItPmNodW5rZGF0YSwgc2xlbmd0aCk7Ci0KLSAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkKLSAgIHsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfcHRyLT5jaHVua2RhdGFbc2xlbmd0aF0gPSAweDAwOyAvKiBOdWxsIHRlcm1pbmF0ZSB0aGUgbGFzdCBzdHJpbmcgKi8KLQotICAgcG5nX2RlYnVnKDMsICJGaW5kaW5nIGVuZCBvZiBwQ0FMIHB1cnBvc2Ugc3RyaW5nIik7Ci0gICBmb3IgKGJ1ZiA9IHBuZ19wdHItPmNodW5rZGF0YTsgKmJ1ZjsgYnVmKyspCi0gICAgICAvKiBFbXB0eSBsb29wICovIDsKLQotICAgZW5kcHRyID0gcG5nX3B0ci0+Y2h1bmtkYXRhICsgc2xlbmd0aDsKLQotICAgLyogV2UgbmVlZCB0byBoYXZlIGF0IGxlYXN0IDEyIGJ5dGVzIGFmdGVyIHRoZSBwdXJwb3NlIHN0cmluZwotICAgICAgaW4gb3JkZXIgdG8gZ2V0IHRoZSBwYXJhbWV0ZXIgaW5mb3JtYXRpb24uICovCi0gICBpZiAoZW5kcHRyIDw9IGJ1ZiArIDEyKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgcENBTCBkYXRhIik7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX2RlYnVnKDMsICJSZWFkaW5nIHBDQUwgWDAsIFgxLCB0eXBlLCBucGFyYW1zLCBhbmQgdW5pdHMiKTsKLSAgIFgwID0gcG5nX2dldF9pbnRfMzIoKHBuZ19ieXRlcClidWYrMSk7Ci0gICBYMSA9IHBuZ19nZXRfaW50XzMyKChwbmdfYnl0ZXApYnVmKzUpOwotICAgdHlwZSA9IGJ1Zls5XTsKLSAgIG5wYXJhbXMgPSBidWZbMTBdOwotICAgdW5pdHMgPSBidWYgKyAxMTsKLQotICAgcG5nX2RlYnVnKDMsICJDaGVja2luZyBwQ0FMIGVxdWF0aW9uIHR5cGUgYW5kIG51bWJlciBvZiBwYXJhbWV0ZXJzIik7Ci0gICAvKiBDaGVjayB0aGF0IHdlIGhhdmUgdGhlIHJpZ2h0IG51bWJlciBvZiBwYXJhbWV0ZXJzIGZvciBrbm93bgotICAgICAgZXF1YXRpb24gdHlwZXMuICovCi0gICBpZiAoKHR5cGUgPT0gUE5HX0VRVUFUSU9OX0xJTkVBUiAmJiBucGFyYW1zICE9IDIpIHx8Ci0gICAgICAgKHR5cGUgPT0gUE5HX0VRVUFUSU9OX0JBU0VfRSAmJiBucGFyYW1zICE9IDMpIHx8Ci0gICAgICAgKHR5cGUgPT0gUE5HX0VRVUFUSU9OX0FSQklUUkFSWSAmJiBucGFyYW1zICE9IDMpIHx8Ci0gICAgICAgKHR5cGUgPT0gUE5HX0VRVUFUSU9OX0hZUEVSQk9MSUMgJiYgbnBhcmFtcyAhPSA0KSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHBDQUwgcGFyYW1ldGVycyBmb3IgZXF1YXRpb24gdHlwZSIpOwotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBlbHNlIGlmICh0eXBlID49IFBOR19FUVVBVElPTl9MQVNUKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVucmVjb2duaXplZCBlcXVhdGlvbiB0eXBlIGZvciBwQ0FMIGNodW5rIik7Ci0gICB9Ci0KLSAgIGZvciAoYnVmID0gdW5pdHM7ICpidWY7IGJ1ZisrKQotICAgICAgLyogRW1wdHkgbG9vcCB0byBtb3ZlIHBhc3QgdGhlIHVuaXRzIHN0cmluZy4gKi8gOwotCi0gICBwbmdfZGVidWcoMywgIkFsbG9jYXRpbmcgcENBTCBwYXJhbWV0ZXJzIGFycmF5Iik7Ci0gICBwYXJhbXMgPSAocG5nX2NoYXJwcClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKLSAgICAgIChwbmdfc2l6ZV90KShucGFyYW1zICogcG5nX3NpemVvZihwbmdfY2hhcnApKSk7Ci0gICBpZiAocGFyYW1zID09IE5VTEwpCi0gICAgIHsKLSAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk5vIG1lbW9yeSBmb3IgcENBTCBwYXJhbXMiKTsKLSAgICAgICByZXR1cm47Ci0gICAgIH0KLQotICAgLyogR2V0IHBvaW50ZXJzIHRvIHRoZSBzdGFydCBvZiBlYWNoIHBhcmFtZXRlciBzdHJpbmcuICovCi0gICBmb3IgKGkgPSAwOyBpIDwgKGludClucGFyYW1zOyBpKyspCi0gICB7Ci0gICAgICBidWYrKzsgLyogU2tpcCB0aGUgbnVsbCBzdHJpbmcgdGVybWluYXRvciBmcm9tIHByZXZpb3VzIHBhcmFtZXRlci4gKi8KLQotICAgICAgcG5nX2RlYnVnMSgzLCAiUmVhZGluZyBwQ0FMIHBhcmFtZXRlciAlZCIsIGkpOwotICAgICAgZm9yIChwYXJhbXNbaV0gPSBidWY7IGJ1ZiA8PSBlbmRwdHIgJiYgKmJ1ZiAhPSAweDAwOyBidWYrKykKLSAgICAgICAgIC8qIEVtcHR5IGxvb3AgdG8gbW92ZSBwYXN0IGVhY2ggcGFyYW1ldGVyIHN0cmluZyAqLyA7Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlbid0IHJ1biBvdXQgb2YgZGF0YSB5ZXQgKi8KLSAgICAgIGlmIChidWYgPiBlbmRwdHIpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBwQ0FMIGRhdGEiKTsKLSAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcGFyYW1zKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgIH0KLQotICAgcG5nX3NldF9wQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEsIFgwLCBYMSwgdHlwZSwgbnBhcmFtcywKLSAgICAgIHVuaXRzLCBwYXJhbXMpOwotCi0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBhcmFtcyk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX3NDQUxfU1VQUE9SVEVECi0vKiBSZWFkIHRoZSBzQ0FMIGNodW5rICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfc0NBTChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLXsKLSAgIHBuZ19jaGFycCBlcDsKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICBkb3VibGUgd2lkdGgsIGhlaWdodDsKLSAgIHBuZ19jaGFycCB2cDsKLSNlbHNlCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotICAgcG5nX2NoYXJwIHN3aWR0aCwgc2hlaWdodDsKLSNlbmRpZgotI2VuZGlmCi0gICBwbmdfc2l6ZV90IHNsZW5ndGg7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9zQ0FMIik7Ci0KLSAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBzQ0FMIik7Ci0gICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHNDQUwgYWZ0ZXIgSURBVCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIGVsc2UgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NDQUwpKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkR1cGxpY2F0ZSBzQ0FMIGNodW5rIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICAvKiBOZWVkIHVuaXQgdHlwZSwgd2lkdGgsIFwwLCBoZWlnaHQ6IG1pbmltdW0gNCBieXRlcyAqLwotICAgZWxzZSBpZiAobGVuZ3RoIDwgNCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJzQ0FMIGNodW5rIHRvbyBzaG9ydCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX2RlYnVnMSgyLCAiQWxsb2NhdGluZyBhbmQgcmVhZGluZyBzQ0FMIGNodW5rIGRhdGEgKCVsdSBieXRlcykiLAotICAgICAgKHVuc2lnbmVkIGxvbmcpKGxlbmd0aCArIDEpKTsKLSAgIHBuZ19wdHItPmNodW5rZGF0YSA9IChwbmdfY2hhcnApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIGxlbmd0aCArIDEpOwotICAgaWYgKHBuZ19wdHItPmNodW5rZGF0YSA9PSBOVUxMKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk91dCBvZiBtZW1vcnkgd2hpbGUgcHJvY2Vzc2luZyBzQ0FMIGNodW5rIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotICAgc2xlbmd0aCA9IChwbmdfc2l6ZV90KWxlbmd0aDsKLSAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19wdHItPmNodW5rZGF0YSwgc2xlbmd0aCk7Ci0KLSAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkKLSAgIHsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfcHRyLT5jaHVua2RhdGFbc2xlbmd0aF0gPSAweDAwOyAvKiBOdWxsIHRlcm1pbmF0ZSB0aGUgbGFzdCBzdHJpbmcgKi8KLQotICAgZXAgPSBwbmdfcHRyLT5jaHVua2RhdGEgKyAxOyAgICAgICAgLyogU2tpcCB1bml0IGJ5dGUgKi8KLQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgIHdpZHRoID0gcG5nX3N0cnRvZChwbmdfcHRyLCBlcCwgJnZwKTsKLSAgIGlmICgqdnApCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAibWFsZm9ybWVkIHdpZHRoIHN0cmluZyBpbiBzQ0FMIGNodW5rIik7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgICAgIHJldHVybjsKLSAgIH0KLSNlbHNlCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotICAgc3dpZHRoID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgcG5nX3N0cmxlbihlcCkgKyAxKTsKLSAgIGlmIChzd2lkdGggPT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJPdXQgb2YgbWVtb3J5IHdoaWxlIHByb2Nlc3Npbmcgc0NBTCBjaHVuayB3aWR0aCIpOwotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBwbmdfbWVtY3B5KHN3aWR0aCwgZXAsIHBuZ19zdHJsZW4oZXApKzEpOwotI2VuZGlmCi0jZW5kaWYKLQotICAgZm9yIChlcCA9IHBuZ19wdHItPmNodW5rZGF0YSsxOyAqZXA7IGVwKyspCi0gICAgICAvKiBFbXB0eSBsb29wICovIDsKLSAgIGVwKys7Ci0KLSAgIGlmIChwbmdfcHRyLT5jaHVua2RhdGEgKyBzbGVuZ3RoIDwgZXApCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVHJ1bmNhdGVkIHNDQUwgY2h1bmsiKTsKLSNpZiBkZWZpbmVkKFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpCi0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBzd2lkdGgpOwotI2VuZGlmCi0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgIGhlaWdodCA9IHBuZ19zdHJ0b2QocG5nX3B0ciwgZXAsICZ2cCk7Ci0gICBpZiAoKnZwKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIm1hbGZvcm1lZCBoZWlnaHQgc3RyaW5nIGluIHNDQUwgY2h1bmsiKTsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICAgcmV0dXJuOwotICAgfQotI2Vsc2UKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi0gICBzaGVpZ2h0ID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgcG5nX3N0cmxlbihlcCkgKyAxKTsKLSAgIGlmIChzaGVpZ2h0ID09IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3V0IG9mIG1lbW9yeSB3aGlsZSBwcm9jZXNzaW5nIHNDQUwgY2h1bmsgaGVpZ2h0Iik7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHN3aWR0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBwbmdfbWVtY3B5KHNoZWlnaHQsIGVwLCBwbmdfc3RybGVuKGVwKSsxKTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgIGlmIChwbmdfcHRyLT5jaHVua2RhdGEgKyBzbGVuZ3RoIDwgZXAKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICAgICB8fCB3aWR0aCA8PSAwLiB8fCBoZWlnaHQgPD0gMC4KLSNlbmRpZgotICAgICAgKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgc0NBTCBkYXRhIik7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSNpZiBkZWZpbmVkKFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpCi0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBzd2lkdGgpOwotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgc2hlaWdodCk7Ci0jZW5kaWYKLSAgICAgIHJldHVybjsKLSAgIH0KLQotCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgcG5nX3NldF9zQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5jaHVua2RhdGFbMF0sIHdpZHRoLCBoZWlnaHQpOwotI2Vsc2UKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi0gICBwbmdfc2V0X3NDQUxfcyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhWzBdLCBzd2lkdGgsIHNoZWlnaHQpOwotI2VuZGlmCi0jZW5kaWYKLQotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0jaWYgZGVmaW5lZChQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQotICAgcG5nX2ZyZWUocG5nX3B0ciwgc3dpZHRoKTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHNoZWlnaHQpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX3RJTUVfU1VQUE9SVEVECi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfdElNRShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLXsKLSAgIHBuZ19ieXRlIGJ1Zls3XTsKLSAgIHBuZ190aW1lIG1vZF90aW1lOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfdElNRSIpOwotCi0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk91dCBvZiBwbGFjZSB0SU1FIGNodW5rIik7Ci0gICBlbHNlIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT190SU1FKSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJEdXBsaWNhdGUgdElNRSBjaHVuayIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsKLQotICAgaWYgKGxlbmd0aCAhPSA3KQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluY29ycmVjdCB0SU1FIGNodW5rIGxlbmd0aCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgNyk7Ci0gICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpCi0gICAgICByZXR1cm47Ci0KLSAgIG1vZF90aW1lLnNlY29uZCA9IGJ1Zls2XTsKLSAgIG1vZF90aW1lLm1pbnV0ZSA9IGJ1Zls1XTsKLSAgIG1vZF90aW1lLmhvdXIgPSBidWZbNF07Ci0gICBtb2RfdGltZS5kYXkgPSBidWZbM107Ci0gICBtb2RfdGltZS5tb250aCA9IGJ1ZlsyXTsKLSAgIG1vZF90aW1lLnllYXIgPSBwbmdfZ2V0X3VpbnRfMTYoYnVmKTsKLQotICAgcG5nX3NldF90SU1FKHBuZ19wdHIsIGluZm9fcHRyLCAmbW9kX3RpbWUpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRAotLyogTm90ZTogdGhpcyBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgY2h1bmtzIHRoYXQgYXJlID4gNjRLIHVuZGVyIERPUyAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfaGFuZGxlX3RFWHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCi17Ci0gICBwbmdfdGV4dHAgdGV4dF9wdHI7Ci0gICBwbmdfY2hhcnAga2V5OwotICAgcG5nX2NoYXJwIHRleHQ7Ci0gICBwbmdfdWludF8zMiBza2lwID0gMDsKLSAgIHBuZ19zaXplX3Qgc2xlbmd0aDsKLSAgIGludCByZXQ7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV90RVh0Iik7Ci0KLSNpZmRlZiBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggIT0gMCkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCA9PSAxKQotICAgICAgewotICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmICgtLXBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID09IDEpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTm8gc3BhY2UgaW4gY2h1bmsgY2FjaGUgZm9yIHRFWHQiKTsKLSAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLQotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIHRFWHQiKTsKLQotICAgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsKLQotI2lmZGVmIFBOR19NQVhfTUFMTE9DXzY0SwotICAgaWYgKGxlbmd0aCA+IChwbmdfdWludF8zMik2NTUzNUwpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAidEVYdCBjaHVuayB0b28gbGFyZ2UgdG8gZml0IGluIG1lbW9yeSIpOwotICAgICAgc2tpcCA9IGxlbmd0aCAtIChwbmdfdWludF8zMik2NTUzNUw7Ci0gICAgICBsZW5ndGggPSAocG5nX3VpbnRfMzIpNjU1MzVMOwotICAgfQotI2VuZGlmCi0KLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0KLSAgIHBuZ19wdHItPmNodW5rZGF0YSA9IChwbmdfY2hhcnApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIGxlbmd0aCArIDEpOwotICAgaWYgKHBuZ19wdHItPmNodW5rZGF0YSA9PSBOVUxMKQotICAgewotICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTm8gbWVtb3J5IHRvIHByb2Nlc3MgdGV4dCBjaHVuayIpOwotICAgICByZXR1cm47Ci0gICB9Ci0gICBzbGVuZ3RoID0gKHBuZ19zaXplX3QpbGVuZ3RoOwotICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3B0ci0+Y2h1bmtkYXRhLCBzbGVuZ3RoKTsKLQotICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIHNraXApKQotICAgewotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIGtleSA9IHBuZ19wdHItPmNodW5rZGF0YTsKLQotICAga2V5W3NsZW5ndGhdID0gMHgwMDsKLQotICAgZm9yICh0ZXh0ID0ga2V5OyAqdGV4dDsgdGV4dCsrKQotICAgICAgLyogRW1wdHkgbG9vcCB0byBmaW5kIGVuZCBvZiBrZXkgKi8gOwotCi0gICBpZiAodGV4dCAhPSBrZXkgKyBzbGVuZ3RoKQotICAgICAgdGV4dCsrOwotCi0gICB0ZXh0X3B0ciA9IChwbmdfdGV4dHApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCi0gICAgICBwbmdfc2l6ZW9mKHBuZ190ZXh0KSk7Ci0gICBpZiAodGV4dF9wdHIgPT0gTlVMTCkKLSAgIHsKLSAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHByb2Nlc3MgdGV4dCBjaHVuayIpOwotICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICByZXR1cm47Ci0gICB9Ci0gICB0ZXh0X3B0ci0+Y29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FOwotICAgdGV4dF9wdHItPmtleSA9IGtleTsKLSNpZmRlZiBQTkdfaVRYdF9TVVBQT1JURUQKLSAgIHRleHRfcHRyLT5sYW5nID0gTlVMTDsKLSAgIHRleHRfcHRyLT5sYW5nX2tleSA9IE5VTEw7Ci0gICB0ZXh0X3B0ci0+aXR4dF9sZW5ndGggPSAwOwotI2VuZGlmCi0gICB0ZXh0X3B0ci0+dGV4dCA9IHRleHQ7Ci0gICB0ZXh0X3B0ci0+dGV4dF9sZW5ndGggPSBwbmdfc3RybGVuKHRleHQpOwotCi0gICByZXQgPSBwbmdfc2V0X3RleHRfMihwbmdfcHRyLCBpbmZvX3B0ciwgdGV4dF9wdHIsIDEpOwotCi0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHRleHRfcHRyKTsKLSAgIGlmIChyZXQpCi0gICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIHByb2Nlc3MgdGV4dCBjaHVuayIpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRAotLyogTm90ZTogdGhpcyBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIGNodW5rcyB0aGF0IGFyZSA+IDY0SyB1bmRlciBET1MgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2hhbmRsZV96VFh0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQotewotICAgcG5nX3RleHRwIHRleHRfcHRyOwotICAgcG5nX2NoYXJwIHRleHQ7Ci0gICBpbnQgY29tcF90eXBlOwotICAgaW50IHJldDsKLSAgIHBuZ19zaXplX3Qgc2xlbmd0aCwgcHJlZml4X2xlbiwgZGF0YV9sZW47Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV96VFh0Iik7Ci0KLSNpZmRlZiBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggIT0gMCkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCA9PSAxKQotICAgICAgewotICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmICgtLXBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID09IDEpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTm8gc3BhY2UgaW4gY2h1bmsgY2FjaGUgZm9yIHpUWHQiKTsKLSAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLQotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIHpUWHQiKTsKLQotICAgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsKLQotI2lmZGVmIFBOR19NQVhfTUFMTE9DXzY0SwotICAgLyogV2Ugd2lsbCBubyBkb3VidCBoYXZlIHByb2JsZW1zIHdpdGggY2h1bmtzIGV2ZW4gaGFsZiB0aGlzIHNpemUsIGJ1dAotICAgICAgdGhlcmUgaXMgbm8gaGFyZCBhbmQgZmFzdCBydWxlIHRvIHRlbGwgdXMgd2hlcmUgdG8gc3RvcC4gKi8KLSAgIGlmIChsZW5ndGggPiAocG5nX3VpbnRfMzIpNjU1MzVMKQotICAgewotICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAielRYdCBjaHVuayB0b28gbGFyZ2UgdG8gZml0IGluIG1lbW9yeSIpOwotICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICByZXR1cm47Ci0gICB9Ci0jZW5kaWYKLQotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgIHBuZ19wdHItPmNodW5rZGF0YSA9IChwbmdfY2hhcnApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIGxlbmd0aCArIDEpOwotICAgaWYgKHBuZ19wdHItPmNodW5rZGF0YSA9PSBOVUxMKQotICAgewotICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3V0IG9mIG1lbW9yeSBwcm9jZXNzaW5nIHpUWHQgY2h1bmsiKTsKLSAgICAgcmV0dXJuOwotICAgfQotICAgc2xlbmd0aCA9IChwbmdfc2l6ZV90KWxlbmd0aDsKLSAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19wdHItPmNodW5rZGF0YSwgc2xlbmd0aCk7Ci0gICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpCi0gICB7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX3B0ci0+Y2h1bmtkYXRhW3NsZW5ndGhdID0gMHgwMDsKLQotICAgZm9yICh0ZXh0ID0gcG5nX3B0ci0+Y2h1bmtkYXRhOyAqdGV4dDsgdGV4dCsrKQotICAgICAgLyogRW1wdHkgbG9vcCAqLyA7Ci0KLSAgIC8qIHpUWHQgbXVzdCBoYXZlIHNvbWUgdGV4dCBhZnRlciB0aGUgY2h1bmtkYXRhd29yZCAqLwotICAgaWYgKHRleHQgPj0gcG5nX3B0ci0+Y2h1bmtkYXRhICsgc2xlbmd0aCAtIDIpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVHJ1bmNhdGVkIHpUWHQgY2h1bmsiKTsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICAgcmV0dXJuOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgIGNvbXBfdHlwZSA9ICooKyt0ZXh0KTsKLSAgICAgICBpZiAoY29tcF90eXBlICE9IFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQpCi0gICAgICAgewotICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmtub3duIGNvbXByZXNzaW9uIHR5cGUgaW4gelRYdCBjaHVuayIpOwotICAgICAgICAgIGNvbXBfdHlwZSA9IFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQ7Ci0gICAgICAgfQotICAgICAgIHRleHQrKzsgICAgICAgIC8qIFNraXAgdGhlIGNvbXByZXNzaW9uX21ldGhvZCBieXRlICovCi0gICB9Ci0gICBwcmVmaXhfbGVuID0gdGV4dCAtIHBuZ19wdHItPmNodW5rZGF0YTsKLQotICAgcG5nX2RlY29tcHJlc3NfY2h1bmsocG5nX3B0ciwgY29tcF90eXBlLAotICAgICAocG5nX3NpemVfdClsZW5ndGgsIHByZWZpeF9sZW4sICZkYXRhX2xlbik7Ci0KLSAgIHRleHRfcHRyID0gKHBuZ190ZXh0cClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKLSAgICAgIHBuZ19zaXplb2YocG5nX3RleHQpKTsKLSAgIGlmICh0ZXh0X3B0ciA9PSBOVUxMKQotICAgewotICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcHJvY2VzcyB6VFh0IGNodW5rIik7Ci0gICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgIHJldHVybjsKLSAgIH0KLSAgIHRleHRfcHRyLT5jb21wcmVzc2lvbiA9IGNvbXBfdHlwZTsKLSAgIHRleHRfcHRyLT5rZXkgPSBwbmdfcHRyLT5jaHVua2RhdGE7Ci0jaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECi0gICB0ZXh0X3B0ci0+bGFuZyA9IE5VTEw7Ci0gICB0ZXh0X3B0ci0+bGFuZ19rZXkgPSBOVUxMOwotICAgdGV4dF9wdHItPml0eHRfbGVuZ3RoID0gMDsKLSNlbmRpZgotICAgdGV4dF9wdHItPnRleHQgPSBwbmdfcHRyLT5jaHVua2RhdGEgKyBwcmVmaXhfbGVuOwotICAgdGV4dF9wdHItPnRleHRfbGVuZ3RoID0gZGF0YV9sZW47Ci0KLSAgIHJldCA9IHBuZ19zZXRfdGV4dF8yKHBuZ19wdHIsIGluZm9fcHRyLCB0ZXh0X3B0ciwgMSk7Ci0KLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHRleHRfcHRyKTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgaWYgKHJldCkKLSAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIHN0b3JlIHpUWHQgY2h1bmsiKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKLS8qIE5vdGU6IHRoaXMgZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSBjaHVua3MgdGhhdCBhcmUgPiA2NEsgdW5kZXIgRE9TICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfaVRYdChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLXsKLSAgIHBuZ190ZXh0cCB0ZXh0X3B0cjsKLSAgIHBuZ19jaGFycCBrZXksIGxhbmcsIHRleHQsIGxhbmdfa2V5OwotICAgaW50IGNvbXBfZmxhZzsKLSAgIGludCBjb21wX3R5cGUgPSAwOwotICAgaW50IHJldDsKLSAgIHBuZ19zaXplX3Qgc2xlbmd0aCwgcHJlZml4X2xlbiwgZGF0YV9sZW47Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9pVFh0Iik7Ci0KLSNpZmRlZiBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggIT0gMCkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCA9PSAxKQotICAgICAgewotICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmICgtLXBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID09IDEpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTm8gc3BhY2UgaW4gY2h1bmsgY2FjaGUgZm9yIGlUWHQiKTsKLSAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLQotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIGlUWHQiKTsKLQotICAgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsKLQotI2lmZGVmIFBOR19NQVhfTUFMTE9DXzY0SwotICAgLyogV2Ugd2lsbCBubyBkb3VidCBoYXZlIHByb2JsZW1zIHdpdGggY2h1bmtzIGV2ZW4gaGFsZiB0aGlzIHNpemUsIGJ1dAotICAgICAgdGhlcmUgaXMgbm8gaGFyZCBhbmQgZmFzdCBydWxlIHRvIHRlbGwgdXMgd2hlcmUgdG8gc3RvcC4gKi8KLSAgIGlmIChsZW5ndGggPiAocG5nX3VpbnRfMzIpNjU1MzVMKQotICAgewotICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiaVRYdCBjaHVuayB0b28gbGFyZ2UgdG8gZml0IGluIG1lbW9yeSIpOwotICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICByZXR1cm47Ci0gICB9Ci0jZW5kaWYKLQotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgIHBuZ19wdHItPmNodW5rZGF0YSA9IChwbmdfY2hhcnApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIGxlbmd0aCArIDEpOwotICAgaWYgKHBuZ19wdHItPmNodW5rZGF0YSA9PSBOVUxMKQotICAgewotICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTm8gbWVtb3J5IHRvIHByb2Nlc3MgaVRYdCBjaHVuayIpOwotICAgICByZXR1cm47Ci0gICB9Ci0gICBzbGVuZ3RoID0gKHBuZ19zaXplX3QpbGVuZ3RoOwotICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3B0ci0+Y2h1bmtkYXRhLCBzbGVuZ3RoKTsKLSAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkKLSAgIHsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfcHRyLT5jaHVua2RhdGFbc2xlbmd0aF0gPSAweDAwOwotCi0gICBmb3IgKGxhbmcgPSBwbmdfcHRyLT5jaHVua2RhdGE7ICpsYW5nOyBsYW5nKyspCi0gICAgICAvKiBFbXB0eSBsb29wICovIDsKLSAgIGxhbmcrKzsgICAgICAgIC8qIFNraXAgTlVMIHNlcGFyYXRvciAqLwotCi0gICAvKiBpVFh0IG11c3QgaGF2ZSBhIGxhbmd1YWdlIHRhZyAocG9zc2libHkgZW1wdHkpLCB0d28gY29tcHJlc3Npb24gYnl0ZXMsCi0gICAgKiB0cmFuc2xhdGVkIGtleXdvcmQgKHBvc3NpYmx5IGVtcHR5KSwgYW5kIHBvc3NpYmx5IHNvbWUgdGV4dCBhZnRlciB0aGUKLSAgICAqIGtleXdvcmQKLSAgICAqLwotCi0gICBpZiAobGFuZyA+PSBwbmdfcHRyLT5jaHVua2RhdGEgKyBzbGVuZ3RoIC0gMykKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJUcnVuY2F0ZWQgaVRYdCBjaHVuayIpOwotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICAgY29tcF9mbGFnID0gKmxhbmcrKzsKLSAgICAgICBjb21wX3R5cGUgPSAqbGFuZysrOwotICAgfQotCi0gICBmb3IgKGxhbmdfa2V5ID0gbGFuZzsgKmxhbmdfa2V5OyBsYW5nX2tleSsrKQotICAgICAgLyogRW1wdHkgbG9vcCAqLyA7Ci0gICBsYW5nX2tleSsrOyAgICAgICAgLyogU2tpcCBOVUwgc2VwYXJhdG9yICovCi0KLSAgIGlmIChsYW5nX2tleSA+PSBwbmdfcHRyLT5jaHVua2RhdGEgKyBzbGVuZ3RoKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlRydW5jYXRlZCBpVFh0IGNodW5rIik7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgZm9yICh0ZXh0ID0gbGFuZ19rZXk7ICp0ZXh0OyB0ZXh0KyspCi0gICAgICAvKiBFbXB0eSBsb29wICovIDsKLSAgIHRleHQrKzsgICAgICAgIC8qIFNraXAgTlVMIHNlcGFyYXRvciAqLwotICAgaWYgKHRleHQgPj0gcG5nX3B0ci0+Y2h1bmtkYXRhICsgc2xlbmd0aCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJNYWxmb3JtZWQgaVRYdCBjaHVuayIpOwotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIHByZWZpeF9sZW4gPSB0ZXh0IC0gcG5nX3B0ci0+Y2h1bmtkYXRhOwotCi0gICBrZXk9cG5nX3B0ci0+Y2h1bmtkYXRhOwotICAgaWYgKGNvbXBfZmxhZykKLSAgICAgICBwbmdfZGVjb21wcmVzc19jaHVuayhwbmdfcHRyLCBjb21wX3R5cGUsCi0gICAgICAgICAoc2l6ZV90KWxlbmd0aCwgcHJlZml4X2xlbiwgJmRhdGFfbGVuKTsKLSAgIGVsc2UKLSAgICAgICBkYXRhX2xlbiA9IHBuZ19zdHJsZW4ocG5nX3B0ci0+Y2h1bmtkYXRhICsgcHJlZml4X2xlbik7Ci0gICB0ZXh0X3B0ciA9IChwbmdfdGV4dHApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCi0gICAgICBwbmdfc2l6ZW9mKHBuZ190ZXh0KSk7Ci0gICBpZiAodGV4dF9wdHIgPT0gTlVMTCkKLSAgIHsKLSAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHByb2Nlc3MgaVRYdCBjaHVuayIpOwotICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICByZXR1cm47Ci0gICB9Ci0gICB0ZXh0X3B0ci0+Y29tcHJlc3Npb24gPSAoaW50KWNvbXBfZmxhZyArIDE7Ci0gICB0ZXh0X3B0ci0+bGFuZ19rZXkgPSBwbmdfcHRyLT5jaHVua2RhdGEgKyAobGFuZ19rZXkgLSBrZXkpOwotICAgdGV4dF9wdHItPmxhbmcgPSBwbmdfcHRyLT5jaHVua2RhdGEgKyAobGFuZyAtIGtleSk7Ci0gICB0ZXh0X3B0ci0+aXR4dF9sZW5ndGggPSBkYXRhX2xlbjsKLSAgIHRleHRfcHRyLT50ZXh0X2xlbmd0aCA9IDA7Ci0gICB0ZXh0X3B0ci0+a2V5ID0gcG5nX3B0ci0+Y2h1bmtkYXRhOwotICAgdGV4dF9wdHItPnRleHQgPSBwbmdfcHRyLT5jaHVua2RhdGEgKyBwcmVmaXhfbGVuOwotCi0gICByZXQgPSBwbmdfc2V0X3RleHRfMihwbmdfcHRyLCBpbmZvX3B0ciwgdGV4dF9wdHIsIDEpOwotCi0gICBwbmdfZnJlZShwbmdfcHRyLCB0ZXh0X3B0cik7Ci0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgIGlmIChyZXQpCi0gICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBzdG9yZSBpVFh0IGNodW5rIik7Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBoYXZlbid0IGZvdW5kIGEgaGFuZGxlciBmb3IgYQotICAgY2h1bmsuICBJZiB0aGVyZSBpc24ndCBhIHByb2JsZW0gd2l0aCB0aGUgY2h1bmsgaXRzZWxmIChpZSBiYWQKLSAgIGNodW5rIG5hbWUsIENSQywgb3IgYSBjcml0aWNhbCBjaHVuayksIHRoZSBjaHVuayBpcyBzaWxlbnRseSBpZ25vcmVkCi0gICAtLSB1bmxlc3MgdGhlIFBOR19GTEFHX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCBmbGFnIGlzIG9uIGluIHdoaWNoCi0gICBjYXNlIGl0IHdpbGwgYmUgc2F2ZWQgYXdheSB0byBiZSB3cml0dGVuIG91dCBsYXRlci4gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2hhbmRsZV91bmtub3duKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQotewotICAgcG5nX3VpbnRfMzIgc2tpcCA9IDA7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV91bmtub3duIik7Ci0KLSNpZmRlZiBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggIT0gMCkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCA9PSAxKQotICAgICAgewotICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmICgtLXBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID09IDEpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTm8gc3BhY2UgaW4gY2h1bmsgY2FjaGUgZm9yIHVua25vd24gY2h1bmsiKTsKLSAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLQotICAgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgewotICAgICAgUE5HX0lEQVQ7Ci0gICAgICBpZiAocG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfSURBVCwgNCkpICAvKiBOb3QgYW4gSURBVCAqLwotICAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsKLSAgIH0KLQotICAgaWYgKCEocG5nX3B0ci0+Y2h1bmtfbmFtZVswXSAmIDB4MjApKQotICAgewotI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKLSAgICAgIGlmIChwbmdfaGFuZGxlX2FzX3Vua25vd24ocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbmFtZSkgIT0KLSAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMKLSNpZmRlZiBQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQKLSAgICAgICAgICAgJiYgcG5nX3B0ci0+cmVhZF91c2VyX2NodW5rX2ZuID09IE5VTEwKLSNlbmRpZgotICAgICAgICApCi0jZW5kaWYKLSAgICAgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgInVua25vd24gY3JpdGljYWwgY2h1bmsiKTsKLSAgIH0KLQotI2lmZGVmIFBOR19SRUFEX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAotICAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0tFRVBfVU5LTk9XTl9DSFVOS1MpCi0jaWZkZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECi0gICAgICAgfHwgKHBuZ19wdHItPnJlYWRfdXNlcl9jaHVua19mbiAhPSBOVUxMKQotI2VuZGlmCi0gICAgICAgICkKLSAgIHsKLSNpZmRlZiBQTkdfTUFYX01BTExPQ182NEsKLSAgICAgICBpZiAobGVuZ3RoID4gKHBuZ191aW50XzMyKTY1NTM1TCkKLSAgICAgICB7Ci0gICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJ1bmtub3duIGNodW5rIHRvbyBsYXJnZSB0byBmaXQgaW4gbWVtb3J5Iik7Ci0gICAgICAgICAgIHNraXAgPSBsZW5ndGggLSAocG5nX3VpbnRfMzIpNjU1MzVMOwotICAgICAgICAgICBsZW5ndGggPSAocG5nX3VpbnRfMzIpNjU1MzVMOwotICAgICAgIH0KLSNlbmRpZgotICAgICAgIHBuZ19tZW1jcHkoKHBuZ19jaGFycClwbmdfcHRyLT51bmtub3duX2NodW5rLm5hbWUsCi0gICAgICAgICAgICAgICAgICAocG5nX2NoYXJwKXBuZ19wdHItPmNodW5rX25hbWUsCi0gICAgICAgICAgICAgICAgICBwbmdfc2l6ZW9mKHBuZ19wdHItPnVua25vd25fY2h1bmsubmFtZSkpOwotICAgICAgIHBuZ19wdHItPnVua25vd25fY2h1bmsubmFtZVtwbmdfc2l6ZW9mKHBuZ19wdHItPnVua25vd25fY2h1bmsubmFtZSktMV0KLSAgICAgICAgICAgPSAnXDAnOwotICAgICAgIHBuZ19wdHItPnVua25vd25fY2h1bmsuc2l6ZSA9IChwbmdfc2l6ZV90KWxlbmd0aDsKLSAgICAgICBpZiAobGVuZ3RoID09IDApCi0gICAgICAgICBwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEgPSBOVUxMOwotICAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19wdHItPnVua25vd25fY2h1bmsuZGF0YSwgbGVuZ3RoKTsKLSAgICAgICB9Ci0jaWZkZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECi0gICAgICAgaWYgKHBuZ19wdHItPnJlYWRfdXNlcl9jaHVua19mbiAhPSBOVUxMKQotICAgICAgIHsKLSAgICAgICAgICAvKiBDYWxsYmFjayB0byB1c2VyIHVua25vd24gY2h1bmsgaGFuZGxlciAqLwotICAgICAgICAgIGludCByZXQ7Ci0gICAgICAgICAgcmV0ID0gKCoocG5nX3B0ci0+cmVhZF91c2VyX2NodW5rX2ZuKSkKLSAgICAgICAgICAgIChwbmdfcHRyLCAmcG5nX3B0ci0+dW5rbm93bl9jaHVuayk7Ci0gICAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJlcnJvciBpbiB1c2VyIGNodW5rIik7Ci0gICAgICAgICAgaWYgKHJldCA9PSAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBpZiAoIShwbmdfcHRyLT5jaHVua19uYW1lWzBdICYgMHgyMCkpCi0jaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAotICAgICAgICAgICAgICAgIGlmIChwbmdfaGFuZGxlX2FzX3Vua25vd24ocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbmFtZSkgIT0KLSAgICAgICAgICAgICAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTKQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJ1bmtub3duIGNyaXRpY2FsIGNodW5rIik7Ci0gICAgICAgICAgICAgcG5nX3NldF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAgICAgICAgICAgICZwbmdfcHRyLT51bmtub3duX2NodW5rLCAxKTsKLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3MocG5nX3B0ciwgaW5mb19wdHIsICZwbmdfcHRyLT51bmtub3duX2NodW5rLCAxKTsKLSAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEpOwotICAgICAgIHBuZ19wdHItPnVua25vd25fY2h1bmsuZGF0YSA9IE5VTEw7Ci0gICB9Ci0gICBlbHNlCi0jZW5kaWYKLSAgICAgIHNraXAgPSBsZW5ndGg7Ci0KLSAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIHNraXApOwotCi0jaWZuZGVmIFBOR19SRUFEX1VTRVJfQ0hVTktTX1NVUFBPUlRFRAotICAgUE5HX1VOVVNFRChpbmZvX3B0cikgLyogUXVpZXQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgdW51c2VkIGluZm9fcHRyICovCi0jZW5kaWYKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdmVyaWZ5IHRoYXQgYSBjaHVuayBuYW1lIGlzIHZhbGlkLgotICAgVGhpcyBmdW5jdGlvbiBjYW4ndCBoYXZlIHRoZSAiY3JpdGljYWwgY2h1bmsgY2hlY2siIGluY29ycG9yYXRlZAotICAgaW50byBpdCwgc2luY2UgaW4gdGhlIGZ1dHVyZSB3ZSB3aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBjYWxsIHVzZXIKLSAgIGZ1bmN0aW9ucyB0byBoYW5kbGUgdW5rbm93biBjcml0aWNhbCBjaHVua3MgYWZ0ZXIgd2UgY2hlY2sgdGhhdAotICAgdGhlIGNodW5rIG5hbWUgaXRzZWxmIGlzIHZhbGlkLiAqLwotCi0jZGVmaW5lIGlzbm9uYWxwaGEoYykgKChjKSA8IDY1IHx8IChjKSA+IDEyMiB8fCAoKGMpID4gOTAgJiYgKGMpIDwgOTcpKQotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19jaGVja19jaHVua19uYW1lKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBjaHVua19uYW1lKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfY2hlY2tfY2h1bmtfbmFtZSIpOwotICAgaWYgKGlzbm9uYWxwaGEoY2h1bmtfbmFtZVswXSkgfHwgaXNub25hbHBoYShjaHVua19uYW1lWzFdKSB8fAotICAgICAgIGlzbm9uYWxwaGEoY2h1bmtfbmFtZVsyXSkgfHwgaXNub25hbHBoYShjaHVua19uYW1lWzNdKSkKLSAgIHsKLSAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAiaW52YWxpZCBjaHVuayB0eXBlIik7Ci0gICB9Ci19Ci0KLS8qIENvbWJpbmVzIHRoZSByb3cgcmVjZW50bHkgcmVhZCBpbiB3aXRoIHRoZSBleGlzdGluZyBwaXhlbHMgaW4gdGhlCi0gICByb3cuICBUaGlzIHJvdXRpbmUgdGFrZXMgY2FyZSBvZiBhbHBoYSBhbmQgdHJhbnNwYXJlbmN5IGlmIHJlcXVlc3RlZC4KLSAgIFRoaXMgcm91dGluZSBhbHNvIGhhbmRsZXMgdGhlIHR3byBtZXRob2RzIG9mIHByb2dyZXNzaXZlIGRpc3BsYXkKLSAgIG9mIGludGVybGFjZWQgaW1hZ2VzLCBkZXBlbmRpbmcgb24gdGhlIG1hc2sgdmFsdWUuCi0gICBUaGUgbWFzayB2YWx1ZSBkZXNjcmliZXMgd2hpY2ggcGl4ZWxzIGFyZSB0byBiZSBjb21iaW5lZCB3aXRoCi0gICB0aGUgcm93LiAgVGhlIHBhdHRlcm4gYWx3YXlzIHJlcGVhdHMgZXZlcnkgOCBwaXhlbHMsIHNvIGp1c3QgOAotICAgYml0cyBhcmUgbmVlZGVkLiAgQSBvbmUgaW5kaWNhdGVzIHRoZSBwaXhlbCBpcyB0byBiZSBjb21iaW5lZCwKLSAgIGEgemVybyBpbmRpY2F0ZXMgdGhlIHBpeGVsIGlzIHRvIGJlIHNraXBwZWQuICBUaGlzIGlzIGluIGFkZGl0aW9uCi0gICB0byBhbnkgYWxwaGEgb3IgdHJhbnNwYXJlbmN5IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGl4ZWwuICBJZgotICAgeW91IHdhbnQgYWxsIHBpeGVscyB0byBiZSBjb21iaW5lZCwgcGFzcyAweGZmICgyNTUpIGluIG1hc2suICAqLwotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19jb21iaW5lX3Jvdyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgcm93LCBpbnQgbWFzaykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2NvbWJpbmVfcm93Iik7Ci0gICBpZiAobWFzayA9PSAweGZmKQotICAgewotICAgICAgcG5nX21lbWNweShyb3csIHBuZ19wdHItPnJvd19idWYgKyAxLAotICAgICAgICAgUE5HX1JPV0JZVEVTKHBuZ19wdHItPnJvd19pbmZvLnBpeGVsX2RlcHRoLCBwbmdfcHRyLT53aWR0aCkpOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgc3dpdGNoIChwbmdfcHRyLT5yb3dfaW5mby5waXhlbF9kZXB0aCkKLSAgICAgIHsKLSAgICAgICAgIGNhc2UgMToKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHBuZ19wdHItPnJvd19idWYgKyAxOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93OwotICAgICAgICAgICAgaW50IHNfaW5jLCBzX3N0YXJ0LCBzX2VuZDsKLSAgICAgICAgICAgIGludCBtID0gMHg4MDsKLSAgICAgICAgICAgIGludCBzaGlmdDsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSBwbmdfcHRyLT53aWR0aDsKLQotI2lmZGVmIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRAotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzX3N0YXJ0ID0gMDsKLSAgICAgICAgICAgICAgICBzX2VuZCA9IDc7Ci0gICAgICAgICAgICAgICAgc19pbmMgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc19zdGFydCA9IDc7Ci0gICAgICAgICAgICAgICAgc19lbmQgPSAwOwotICAgICAgICAgICAgICAgIHNfaW5jID0gLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNoaWZ0ID0gc19zdGFydDsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKG0gJiBtYXNrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaW50IHZhbHVlOwotCi0gICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgqc3AgPj4gc2hpZnQpICYgMHgwMTsKLSAgICAgICAgICAgICAgICAgICpkcCAmPSAocG5nX2J5dGUpKCgweDdmN2YgPj4gKDcgLSBzaGlmdCkpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqZHAgfD0gKHBuZ19ieXRlKSh2YWx1ZSA8PCBzaGlmdCk7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSBzX2VuZCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gc19zdGFydDsKLSAgICAgICAgICAgICAgICAgIHNwKys7Ci0gICAgICAgICAgICAgICAgICBkcCsrOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgc2hpZnQgKz0gc19pbmM7Ci0KLSAgICAgICAgICAgICAgIGlmIChtID09IDEpCi0gICAgICAgICAgICAgICAgICBtID0gMHg4MDsKLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIG0gPj49IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHBuZ19wdHItPnJvd19idWYgKyAxOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93OwotICAgICAgICAgICAgaW50IHNfc3RhcnQsIHNfZW5kLCBzX2luYzsKLSAgICAgICAgICAgIGludCBtID0gMHg4MDsKLSAgICAgICAgICAgIGludCBzaGlmdDsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSBwbmdfcHRyLT53aWR0aDsKLSAgICAgICAgICAgIGludCB2YWx1ZTsKLQotI2lmZGVmIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRAotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNfc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgc19lbmQgPSA2OwotICAgICAgICAgICAgICAgc19pbmMgPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzX3N0YXJ0ID0gNjsKLSAgICAgICAgICAgICAgIHNfZW5kID0gMDsKLSAgICAgICAgICAgICAgIHNfaW5jID0gLTI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNoaWZ0ID0gc19zdGFydDsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKG0gJiBtYXNrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoKnNwID4+IHNoaWZ0KSAmIDB4MDM7Ci0gICAgICAgICAgICAgICAgICAqZHAgJj0gKHBuZ19ieXRlKSgoMHgzZjNmID4+ICg2IC0gc2hpZnQpKSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgKmRwIHw9IChwbmdfYnl0ZSkodmFsdWUgPDwgc2hpZnQpOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gc19lbmQpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzaGlmdCA9IHNfc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgICAgICAgZHArKzsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IHNfaW5jOwotICAgICAgICAgICAgICAgaWYgKG0gPT0gMSkKLSAgICAgICAgICAgICAgICAgIG0gPSAweDgwOwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgbSA+Pj0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSA0OgotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcG5nX3B0ci0+cm93X2J1ZiArIDE7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7Ci0gICAgICAgICAgICBpbnQgc19zdGFydCwgc19lbmQsIHNfaW5jOwotICAgICAgICAgICAgaW50IG0gPSAweDgwOwotICAgICAgICAgICAgaW50IHNoaWZ0OwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHBuZ19wdHItPndpZHRoOwotICAgICAgICAgICAgaW50IHZhbHVlOwotCi0jaWZkZWYgUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVECi0gICAgICAgICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0tTV0FQKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc19zdGFydCA9IDA7Ci0gICAgICAgICAgICAgICBzX2VuZCA9IDQ7Ci0gICAgICAgICAgICAgICBzX2luYyA9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNfc3RhcnQgPSA0OwotICAgICAgICAgICAgICAgc19lbmQgPSAwOwotICAgICAgICAgICAgICAgc19pbmMgPSAtNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNoaWZ0ID0gc19zdGFydDsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKG0gJiBtYXNrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoKnNwID4+IHNoaWZ0KSAmIDB4ZjsKLSAgICAgICAgICAgICAgICAgICpkcCAmPSAocG5nX2J5dGUpKCgweGYwZiA+PiAoNCAtIHNoaWZ0KSkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICpkcCB8PSAocG5nX2J5dGUpKHZhbHVlIDw8IHNoaWZ0KTsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IHNfZW5kKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc2hpZnQgPSBzX3N0YXJ0OwotICAgICAgICAgICAgICAgICAgc3ArKzsKLSAgICAgICAgICAgICAgICAgIGRwKys7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBzaGlmdCArPSBzX2luYzsKLSAgICAgICAgICAgICAgIGlmIChtID09IDEpCi0gICAgICAgICAgICAgICAgICBtID0gMHg4MDsKLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIG0gPj49IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSBwbmdfcHRyLT5yb3dfYnVmICsgMTsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdzsKLSAgICAgICAgICAgIHBuZ19zaXplX3QgcGl4ZWxfYnl0ZXMgPSAocG5nX3B0ci0+cm93X2luZm8ucGl4ZWxfZGVwdGggPj4gMyk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcG5nX3B0ci0+d2lkdGg7Ci0gICAgICAgICAgICBwbmdfYnl0ZSBtID0gMHg4MDsKLQotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAobSAmIG1hc2spCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfbWVtY3B5KGRwLCBzcCwgcGl4ZWxfYnl0ZXMpOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBzcCArPSBwaXhlbF9ieXRlczsKLSAgICAgICAgICAgICAgIGRwICs9IHBpeGVsX2J5dGVzOwotCi0gICAgICAgICAgICAgICBpZiAobSA9PSAxKQotICAgICAgICAgICAgICAgICAgbSA9IDB4ODA7Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBtID4+PSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci19Ci0KLSNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLS8qIE9MRCBwcmUtMS4wLjkgaW50ZXJmYWNlOgotdm9pZCBwbmdfZG9fcmVhZF9pbnRlcmxhY2UocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgaW50IHBhc3MsCi0gICBwbmdfdWludF8zMiB0cmFuc2Zvcm1hdGlvbnMpCi0gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RvX3JlYWRfaW50ZXJsYWNlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfcm93X2luZm9wIHJvd19pbmZvID0gJihwbmdfcHRyLT5yb3dfaW5mbyk7Ci0gICBwbmdfYnl0ZXAgcm93ID0gcG5nX3B0ci0+cm93X2J1ZiArIDE7Ci0gICBpbnQgcGFzcyA9IHBuZ19wdHItPnBhc3M7Ci0gICBwbmdfdWludF8zMiB0cmFuc2Zvcm1hdGlvbnMgPSBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnM7Ci0gICAvKiBBcnJheXMgdG8gZmFjaWxpdGF0ZSBlYXN5IGludGVybGFjaW5nIC0gdXNlIHBhc3MgKDAgLSA2KSBhcyBpbmRleCAqLwotICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrICovCi0gICBQTkdfQ09OU1QgaW50IHBuZ19wYXNzX2luY1s3XSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fcmVhZF9pbnRlcmxhY2UiKTsKLSAgIGlmIChyb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMKQotICAgewotICAgICAgcG5nX3VpbnRfMzIgZmluYWxfd2lkdGg7Ci0KLSAgICAgIGZpbmFsX3dpZHRoID0gcm93X2luZm8tPndpZHRoICogcG5nX3Bhc3NfaW5jW3Bhc3NdOwotCi0gICAgICBzd2l0Y2ggKHJvd19pbmZvLT5waXhlbF9kZXB0aCkKLSAgICAgIHsKLSAgICAgICAgIGNhc2UgMToKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X2luZm8tPndpZHRoIC0gMSkgPj4gMyk7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3cgKyAocG5nX3NpemVfdCkoKGZpbmFsX3dpZHRoIC0gMSkgPj4gMyk7Ci0gICAgICAgICAgICBpbnQgc3NoaWZ0LCBkc2hpZnQ7Ci0gICAgICAgICAgICBpbnQgc19zdGFydCwgc19lbmQsIHNfaW5jOwotICAgICAgICAgICAgaW50IGpzdG9wID0gcG5nX3Bhc3NfaW5jW3Bhc3NdOwotICAgICAgICAgICAgcG5nX2J5dGUgdjsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBpbnQgajsKLQotI2lmZGVmIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRAotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzc2hpZnQgPSAoaW50KSgocm93X2luZm8tPndpZHRoICsgNykgJiAweDA3KTsKLSAgICAgICAgICAgICAgICBkc2hpZnQgPSAoaW50KSgoZmluYWxfd2lkdGggKyA3KSAmIDB4MDcpOwotICAgICAgICAgICAgICAgIHNfc3RhcnQgPSA3OwotICAgICAgICAgICAgICAgIHNfZW5kID0gMDsKLSAgICAgICAgICAgICAgICBzX2luYyA9IC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3NoaWZ0ID0gNyAtIChpbnQpKChyb3dfaW5mby0+d2lkdGggKyA3KSAmIDB4MDcpOwotICAgICAgICAgICAgICAgIGRzaGlmdCA9IDcgLSAoaW50KSgoZmluYWxfd2lkdGggKyA3KSAmIDB4MDcpOwotICAgICAgICAgICAgICAgIHNfc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgIHNfZW5kID0gNzsKLSAgICAgICAgICAgICAgICBzX2luYyA9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfaW5mby0+d2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHYgPSAocG5nX2J5dGUpKCgqc3AgPj4gc3NoaWZ0KSAmIDB4MDEpOwotICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGpzdG9wOyBqKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAqZHAgJj0gKHBuZ19ieXRlKSgoMHg3ZjdmID4+ICg3IC0gZHNoaWZ0KSkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICpkcCB8PSAocG5nX2J5dGUpKHYgPDwgZHNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgIGlmIChkc2hpZnQgPT0gc19lbmQpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBkc2hpZnQgPSBzX3N0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgZHAtLTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIGRzaGlmdCArPSBzX2luYzsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGlmIChzc2hpZnQgPT0gc19lbmQpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzc2hpZnQgPSBzX3N0YXJ0OwotICAgICAgICAgICAgICAgICAgc3AtLTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHNzaGlmdCArPSBzX2luYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSAyOgotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ191aW50XzMyKSgocm93X2luZm8tPndpZHRoIC0gMSkgPj4gMik7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3cgKyAocG5nX3VpbnRfMzIpKChmaW5hbF93aWR0aCAtIDEpID4+IDIpOwotICAgICAgICAgICAgaW50IHNzaGlmdCwgZHNoaWZ0OwotICAgICAgICAgICAgaW50IHNfc3RhcnQsIHNfZW5kLCBzX2luYzsKLSAgICAgICAgICAgIGludCBqc3RvcCA9IHBuZ19wYXNzX2luY1twYXNzXTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0KLSNpZmRlZiBQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDS1NXQVApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzc2hpZnQgPSAoaW50KSgoKHJvd19pbmZvLT53aWR0aCArIDMpICYgMHgwMykgPDwgMSk7Ci0gICAgICAgICAgICAgICBkc2hpZnQgPSAoaW50KSgoKGZpbmFsX3dpZHRoICsgMykgJiAweDAzKSA8PCAxKTsKLSAgICAgICAgICAgICAgIHNfc3RhcnQgPSA2OwotICAgICAgICAgICAgICAgc19lbmQgPSAwOwotICAgICAgICAgICAgICAgc19pbmMgPSAtMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3NoaWZ0ID0gKGludCkoKDMgLSAoKHJvd19pbmZvLT53aWR0aCArIDMpICYgMHgwMykpIDw8IDEpOwotICAgICAgICAgICAgICAgZHNoaWZ0ID0gKGludCkoKDMgLSAoKGZpbmFsX3dpZHRoICsgMykgJiAweDAzKSkgPDwgMSk7Ci0gICAgICAgICAgICAgICBzX3N0YXJ0ID0gMDsKLSAgICAgICAgICAgICAgIHNfZW5kID0gNjsKLSAgICAgICAgICAgICAgIHNfaW5jID0gMjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd19pbmZvLT53aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGUgdjsKLSAgICAgICAgICAgICAgIGludCBqOwotCi0gICAgICAgICAgICAgICB2ID0gKHBuZ19ieXRlKSgoKnNwID4+IHNzaGlmdCkgJiAweDAzKTsKLSAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBqc3RvcDsgaisrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgKmRwICY9IChwbmdfYnl0ZSkoKDB4M2YzZiA+PiAoNiAtIGRzaGlmdCkpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqZHAgfD0gKHBuZ19ieXRlKSh2IDw8IGRzaGlmdCk7Ci0gICAgICAgICAgICAgICAgICBpZiAoZHNoaWZ0ID09IHNfZW5kKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgZHNoaWZ0ID0gc19zdGFydDsKLSAgICAgICAgICAgICAgICAgICAgIGRwLS07Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICBkc2hpZnQgKz0gc19pbmM7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBpZiAoc3NoaWZ0ID09IHNfZW5kKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc3NoaWZ0ID0gc19zdGFydDsKLSAgICAgICAgICAgICAgICAgIHNwLS07Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBzc2hpZnQgKz0gc19pbmM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X2luZm8tPndpZHRoIC0gMSkgPj4gMSk7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3cgKyAocG5nX3NpemVfdCkoKGZpbmFsX3dpZHRoIC0gMSkgPj4gMSk7Ci0gICAgICAgICAgICBpbnQgc3NoaWZ0LCBkc2hpZnQ7Ci0gICAgICAgICAgICBpbnQgc19zdGFydCwgc19lbmQsIHNfaW5jOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIGludCBqc3RvcCA9IHBuZ19wYXNzX2luY1twYXNzXTsKLQotI2lmZGVmIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRAotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNzaGlmdCA9IChpbnQpKCgocm93X2luZm8tPndpZHRoICsgMSkgJiAweDAxKSA8PCAyKTsKLSAgICAgICAgICAgICAgIGRzaGlmdCA9IChpbnQpKCgoZmluYWxfd2lkdGggKyAxKSAmIDB4MDEpIDw8IDIpOwotICAgICAgICAgICAgICAgc19zdGFydCA9IDQ7Ci0gICAgICAgICAgICAgICBzX2VuZCA9IDA7Ci0gICAgICAgICAgICAgICBzX2luYyA9IC00OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzc2hpZnQgPSAoaW50KSgoMSAtICgocm93X2luZm8tPndpZHRoICsgMSkgJiAweDAxKSkgPDwgMik7Ci0gICAgICAgICAgICAgICBkc2hpZnQgPSAoaW50KSgoMSAtICgoZmluYWxfd2lkdGggKyAxKSAmIDB4MDEpKSA8PCAyKTsKLSAgICAgICAgICAgICAgIHNfc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgc19lbmQgPSA0OwotICAgICAgICAgICAgICAgc19pbmMgPSA0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X2luZm8tPndpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZSB2ID0gKHBuZ19ieXRlKSgoKnNwID4+IHNzaGlmdCkgJiAweGYpOwotICAgICAgICAgICAgICAgaW50IGo7Ci0KLSAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBqc3RvcDsgaisrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgKmRwICY9IChwbmdfYnl0ZSkoKDB4ZjBmID4+ICg0IC0gZHNoaWZ0KSkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICpkcCB8PSAocG5nX2J5dGUpKHYgPDwgZHNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgIGlmIChkc2hpZnQgPT0gc19lbmQpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBkc2hpZnQgPSBzX3N0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgZHAtLTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIGRzaGlmdCArPSBzX2luYzsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGlmIChzc2hpZnQgPT0gc19lbmQpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzc2hpZnQgPSBzX3N0YXJ0OwotICAgICAgICAgICAgICAgICAgc3AtLTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHNzaGlmdCArPSBzX2luYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19zaXplX3QgcGl4ZWxfYnl0ZXMgPSAocm93X2luZm8tPnBpeGVsX2RlcHRoID4+IDMpOwotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3QpKHJvd19pbmZvLT53aWR0aCAtIDEpCi0gICAgICAgICAgICAgICAgKiBwaXhlbF9ieXRlczsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdyArIChwbmdfc2l6ZV90KShmaW5hbF93aWR0aCAtIDEpICogcGl4ZWxfYnl0ZXM7Ci0KLSAgICAgICAgICAgIGludCBqc3RvcCA9IHBuZ19wYXNzX2luY1twYXNzXTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfaW5mby0+d2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlIHZbOF07Ci0gICAgICAgICAgICAgICBpbnQgajsKLQotICAgICAgICAgICAgICAgcG5nX21lbWNweSh2LCBzcCwgcGl4ZWxfYnl0ZXMpOwotICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGpzdG9wOyBqKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfbWVtY3B5KGRwLCB2LCBwaXhlbF9ieXRlcyk7Ci0gICAgICAgICAgICAgICAgICBkcCAtPSBwaXhlbF9ieXRlczsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIHNwIC09IHBpeGVsX2J5dGVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByb3dfaW5mby0+d2lkdGggPSBmaW5hbF93aWR0aDsKLSAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhyb3dfaW5mby0+cGl4ZWxfZGVwdGgsIGZpbmFsX3dpZHRoKTsKLSAgIH0KLSNpZm5kZWYgUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVECi0gICBQTkdfVU5VU0VEKHRyYW5zZm9ybWF0aW9ucykgIC8qIFNpbGVuY2UgY29tcGlsZXIgd2FybmluZyAqLwotI2VuZGlmCi19Ci0jZW5kaWYgLyogUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEICovCi0KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3JlYWRfZmlsdGVyX3Jvdyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LAotICAgcG5nX2J5dGVwIHByZXZfcm93LCBpbnQgZmlsdGVyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcmVhZF9maWx0ZXJfcm93Iik7Ci0gICBwbmdfZGVidWcyKDIsICJyb3cgPSAlbHUsIGZpbHRlciA9ICVkIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKXBuZ19wdHItPnJvd19udW1iZXIsIGZpbHRlcik7Ci0gICBzd2l0Y2ggKGZpbHRlcikKLSAgIHsKLSAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9OT05FOgotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBOR19GSUxURVJfVkFMVUVfU1VCOgotICAgICAgewotICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzOwotICAgICAgICAgcG5nX3VpbnRfMzIgYnBwID0gKHJvd19pbmZvLT5waXhlbF9kZXB0aCArIDcpID4+IDM7Ci0gICAgICAgICBwbmdfYnl0ZXAgcnAgPSByb3cgKyBicHA7Ci0gICAgICAgICBwbmdfYnl0ZXAgbHAgPSByb3c7Ci0KLSAgICAgICAgIGZvciAoaSA9IGJwcDsgaSA8IGlzdG9wOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICAqcnAgPSAocG5nX2J5dGUpKCgoaW50KSgqcnApICsgKGludCkoKmxwKyspKSAmIDB4ZmYpOwotICAgICAgICAgICAgcnArKzsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBQTkdfRklMVEVSX1ZBTFVFX1VQOgotICAgICAgewotICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzOwotICAgICAgICAgcG5nX2J5dGVwIHJwID0gcm93OwotICAgICAgICAgcG5nX2J5dGVwIHBwID0gcHJldl9yb3c7Ci0KLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQotICAgICAgICAgewotICAgICAgICAgICAgKnJwID0gKHBuZ19ieXRlKSgoKGludCkoKnJwKSArIChpbnQpKCpwcCsrKSkgJiAweGZmKTsKLSAgICAgICAgICAgIHJwKys7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9BVkc6Ci0gICAgICB7Ci0gICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgcG5nX2J5dGVwIHJwID0gcm93OwotICAgICAgICAgcG5nX2J5dGVwIHBwID0gcHJldl9yb3c7Ci0gICAgICAgICBwbmdfYnl0ZXAgbHAgPSByb3c7Ci0gICAgICAgICBwbmdfdWludF8zMiBicHAgPSAocm93X2luZm8tPnBpeGVsX2RlcHRoICsgNykgPj4gMzsKLSAgICAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzIC0gYnBwOwotCi0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnBwOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICAqcnAgPSAocG5nX2J5dGUpKCgoaW50KSgqcnApICsKLSAgICAgICAgICAgICAgICgoaW50KSgqcHArKykgLyAyICkpICYgMHhmZik7Ci0gICAgICAgICAgICBycCsrOwotICAgICAgICAgfQotCi0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgICpycCA9IChwbmdfYnl0ZSkoKChpbnQpKCpycCkgKwotICAgICAgICAgICAgICAgKGludCkoKnBwKysgKyAqbHArKykgLyAyICkgJiAweGZmKTsKLSAgICAgICAgICAgIHJwKys7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSDoKLSAgICAgIHsKLSAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICBwbmdfYnl0ZXAgcnAgPSByb3c7Ci0gICAgICAgICBwbmdfYnl0ZXAgcHAgPSBwcmV2X3JvdzsKLSAgICAgICAgIHBuZ19ieXRlcCBscCA9IHJvdzsKLSAgICAgICAgIHBuZ19ieXRlcCBjcCA9IHByZXZfcm93OwotICAgICAgICAgcG5nX3VpbnRfMzIgYnBwID0gKHJvd19pbmZvLT5waXhlbF9kZXB0aCArIDcpID4+IDM7Ci0gICAgICAgICBwbmdfdWludF8zMiBpc3RvcD1yb3dfaW5mby0+cm93Ynl0ZXMgLSBicHA7Ci0KLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBicHA7IGkrKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgICpycCA9IChwbmdfYnl0ZSkoKChpbnQpKCpycCkgKyAoaW50KSgqcHArKykpICYgMHhmZik7Ci0gICAgICAgICAgICBycCsrOwotICAgICAgICAgfQotCi0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykgICAvKiBVc2UgbGVmdG92ZXIgcnAscHAgKi8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBhLCBiLCBjLCBwYSwgcGIsIHBjLCBwOwotCi0gICAgICAgICAgICBhID0gKmxwKys7Ci0gICAgICAgICAgICBiID0gKnBwKys7Ci0gICAgICAgICAgICBjID0gKmNwKys7Ci0KLSAgICAgICAgICAgIHAgPSBiIC0gYzsKLSAgICAgICAgICAgIHBjID0gYSAtIGM7Ci0KLSNpZmRlZiBQTkdfVVNFX0FCUwotICAgICAgICAgICAgcGEgPSBhYnMocCk7Ci0gICAgICAgICAgICBwYiA9IGFicyhwYyk7Ci0gICAgICAgICAgICBwYyA9IGFicyhwICsgcGMpOwotI2Vsc2UKLSAgICAgICAgICAgIHBhID0gcCA8IDAgPyAtcCA6IHA7Ci0gICAgICAgICAgICBwYiA9IHBjIDwgMCA/IC1wYyA6IHBjOwotICAgICAgICAgICAgcGMgPSAocCArIHBjKSA8IDAgPyAtKHAgKyBwYykgOiBwICsgcGM7Ci0jZW5kaWYKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgIGlmIChwYSA8PSBwYiAmJiBwYSA8PSBwYykKLSAgICAgICAgICAgICAgICAgIHAgPSBhOwotICAgICAgICAgICAgICAgZWxzZSBpZiAocGIgPD0gcGMpCi0gICAgICAgICAgICAgICAgICBwID0gYjsKLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHAgPSBjOwotICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIHAgPSAocGEgPD0gcGIgJiYgcGEgPD0gcGMpID8gYSA6IChwYiA8PSBwYykgPyBiIDogYzsKLQotICAgICAgICAgICAgKnJwID0gKHBuZ19ieXRlKSgoKGludCkoKnJwKSArIHApICYgMHhmZik7Ci0gICAgICAgICAgICBycCsrOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIklnbm9yaW5nIGJhZCBhZGFwdGl2ZSBmaWx0ZXIgdHlwZSIpOwotICAgICAgICAgKnJvdyA9IDA7Ci0gICAgICAgICBicmVhazsKLSAgIH0KLX0KLQotI2lmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19yZWFkX2ZpbmlzaF9yb3cocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSAgIC8qIEFycmF5cyB0byBmYWNpbGl0YXRlIGVhc3kgaW50ZXJsYWNpbmcgLSB1c2UgcGFzcyAoMCAtIDYpIGFzIGluZGV4ICovCi0KLSAgIC8qIFN0YXJ0IG9mIGludGVybGFjZSBibG9jayAqLwotICAgUE5HX0NPTlNUIGludCBwbmdfcGFzc19zdGFydFs3XSA9IHswLCA0LCAwLCAyLCAwLCAxLCAwfTsKLQotICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrICovCi0gICBQTkdfQ09OU1QgaW50IHBuZ19wYXNzX2luY1s3XSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsKLQotICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLwotICAgUE5HX0NPTlNUIGludCBwbmdfcGFzc195c3RhcnRbN10gPSB7MCwgMCwgNCwgMCwgMiwgMCwgMX07Ci0KLSAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayBpbiB0aGUgeSBkaXJlY3Rpb24gKi8KLSAgIFBOR19DT05TVCBpbnQgcG5nX3Bhc3NfeWluY1s3XSA9IHs4LCA4LCA4LCA0LCA0LCAyLCAyfTsKLSNlbmRpZiAvKiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQgKi8KLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcmVhZF9maW5pc2hfcm93Iik7Ci0gICBwbmdfcHRyLT5yb3dfbnVtYmVyKys7Ci0gICBpZiAocG5nX3B0ci0+cm93X251bWJlciA8IHBuZ19wdHItPm51bV9yb3dzKQotICAgICAgcmV0dXJuOwotCi0jaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCkKLSAgIHsKLSAgICAgIHBuZ19wdHItPnJvd19udW1iZXIgPSAwOwotICAgICAgcG5nX21lbXNldChwbmdfcHRyLT5wcmV2X3JvdywgMCwKLSAgICAgICAgIHBuZ19wdHItPnJvd2J5dGVzICsgMSk7Ci0gICAgICBkbwotICAgICAgewotICAgICAgICAgcG5nX3B0ci0+cGFzcysrOwotICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPj0gNykKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgcG5nX3B0ci0+aXdpZHRoID0gKHBuZ19wdHItPndpZHRoICsKLSAgICAgICAgICAgIHBuZ19wYXNzX2luY1twbmdfcHRyLT5wYXNzXSAtIDEgLQotICAgICAgICAgICAgcG5nX3Bhc3Nfc3RhcnRbcG5nX3B0ci0+cGFzc10pIC8KLSAgICAgICAgICAgIHBuZ19wYXNzX2luY1twbmdfcHRyLT5wYXNzXTsKLQotICAgICAgICAgaWYgKCEocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfcHRyLT5udW1fcm93cyA9IChwbmdfcHRyLT5oZWlnaHQgKwotICAgICAgICAgICAgICAgcG5nX3Bhc3NfeWluY1twbmdfcHRyLT5wYXNzXSAtIDEgLQotICAgICAgICAgICAgICAgcG5nX3Bhc3NfeXN0YXJ0W3BuZ19wdHItPnBhc3NdKSAvCi0gICAgICAgICAgICAgICBwbmdfcGFzc195aW5jW3BuZ19wdHItPnBhc3NdOwotICAgICAgICAgICAgaWYgKCEocG5nX3B0ci0+bnVtX3Jvd3MpKQotICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlICAvKiBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgfSB3aGlsZSAocG5nX3B0ci0+aXdpZHRoID09IDApOwotCi0gICAgICBpZiAocG5nX3B0ci0+cGFzcyA8IDcpCi0gICAgICAgICByZXR1cm47Ci0gICB9Ci0jZW5kaWYgLyogUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEICovCi0KLSAgIGlmICghKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfWkxJQl9GSU5JU0hFRCkpCi0gICB7Ci0gICAgICBQTkdfSURBVDsKLSAgICAgIGNoYXIgZXh0cmE7Ci0gICAgICBpbnQgcmV0OwotCi0gICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUgKikmZXh0cmE7Ci0gICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KTE7Ci0gICAgICBmb3IgKDs7KQotICAgICAgewotICAgICAgICAgaWYgKCEocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbikpCi0gICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoIXBuZ19wdHItPmlkYXRfc2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApOwotICAgICAgICAgICAgICAgcG5nX3B0ci0+aWRhdF9zaXplID0gcG5nX3JlYWRfY2h1bmtfaGVhZGVyKHBuZ19wdHIpOwotICAgICAgICAgICAgICAgaWYgKHBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX0lEQVQsIDQpKQotICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJOb3QgZW5vdWdoIGltYWdlIGRhdGEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAodUludClwbmdfcHRyLT56YnVmX3NpemU7Ci0gICAgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfaW4gPSBwbmdfcHRyLT56YnVmOwotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnpidWZfc2l6ZSA+IHBuZ19wdHItPmlkYXRfc2l6ZSkKLSAgICAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAodUludClwbmdfcHRyLT5pZGF0X3NpemU7Ci0gICAgICAgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgcG5nX3B0ci0+emJ1ZiwgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbik7Ci0gICAgICAgICAgICBwbmdfcHRyLT5pZGF0X3NpemUgLT0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbjsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldCA9IGluZmxhdGUoJnBuZ19wdHItPnpzdHJlYW0sIFpfUEFSVElBTF9GTFVTSCk7Ci0gICAgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0KSB8fCBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luIHx8Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT5pZGF0X3NpemUpCi0gICAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiRXh0cmEgY29tcHJlc3NlZCBkYXRhIik7Ci0gICAgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19BRlRFUl9JREFUOwotICAgICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfWkxJQl9GSU5JU0hFRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgaWYgKHJldCAhPSBaX09LKQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIHBuZ19wdHItPnpzdHJlYW0ubXNnID8gcG5nX3B0ci0+enN0cmVhbS5tc2cgOgotICAgICAgICAgICAgICAgICAgICAgICJEZWNvbXByZXNzaW9uIEVycm9yIik7Ci0KLSAgICAgICAgIGlmICghKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0KSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJFeHRyYSBjb21wcmVzc2VkIGRhdGEiKTsKLSAgICAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0FGVEVSX0lEQVQ7Ci0gICAgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0ZJTklTSEVEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gMDsKLSAgIH0KLQotICAgaWYgKHBuZ19wdHItPmlkYXRfc2l6ZSB8fCBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luKQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkV4dHJhIGNvbXByZXNzaW9uIGRhdGEiKTsKLQotICAgaW5mbGF0ZVJlc2V0KCZwbmdfcHRyLT56c3RyZWFtKTsKLQotICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsKLX0KLSNlbmRpZiAvKiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCAqLwotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19yZWFkX3N0YXJ0X3Jvdyhwbmdfc3RydWN0cCBwbmdfcHRyKQotewotI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotICAgLyogQXJyYXlzIHRvIGZhY2lsaXRhdGUgZWFzeSBpbnRlcmxhY2luZyAtIHVzZSBwYXNzICgwIC0gNikgYXMgaW5kZXggKi8KLQotICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrICovCi0gICBQTkdfQ09OU1QgaW50IHBuZ19wYXNzX3N0YXJ0WzddID0gezAsIDQsIDAsIDIsIDAsIDEsIDB9OwotCi0gICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgKi8KLSAgIFBOR19DT05TVCBpbnQgcG5nX3Bhc3NfaW5jWzddID0gezgsIDgsIDQsIDQsIDIsIDIsIDF9OwotCi0gICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovCi0gICBQTkdfQ09OU1QgaW50IHBuZ19wYXNzX3lzdGFydFs3XSA9IHswLCAwLCA0LCAwLCAyLCAwLCAxfTsKLQotICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLwotICAgUE5HX0NPTlNUIGludCBwbmdfcGFzc195aW5jWzddID0gezgsIDgsIDgsIDQsIDQsIDIsIDJ9OwotI2VuZGlmCi0KLSAgIGludCBtYXhfcGl4ZWxfZGVwdGg7Ci0gICBwbmdfc2l6ZV90IHJvd19ieXRlczsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcmVhZF9zdGFydF9yb3ciKTsKLSAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAwOwotICAgcG5nX2luaXRfcmVhZF90cmFuc2Zvcm1hdGlvbnMocG5nX3B0cik7Ci0jaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCkKLSAgIHsKLSAgICAgIGlmICghKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlRFUkxBQ0UpKQotICAgICAgICAgcG5nX3B0ci0+bnVtX3Jvd3MgPSAocG5nX3B0ci0+aGVpZ2h0ICsgcG5nX3Bhc3NfeWluY1swXSAtIDEgLQotICAgICAgICAgICAgcG5nX3Bhc3NfeXN0YXJ0WzBdKSAvIHBuZ19wYXNzX3lpbmNbMF07Ci0gICAgICBlbHNlCi0gICAgICAgICBwbmdfcHRyLT5udW1fcm93cyA9IHBuZ19wdHItPmhlaWdodDsKLQotICAgICAgcG5nX3B0ci0+aXdpZHRoID0gKHBuZ19wdHItPndpZHRoICsKLSAgICAgICAgIHBuZ19wYXNzX2luY1twbmdfcHRyLT5wYXNzXSAtIDEgLQotICAgICAgICAgcG5nX3Bhc3Nfc3RhcnRbcG5nX3B0ci0+cGFzc10pIC8KLSAgICAgICAgIHBuZ19wYXNzX2luY1twbmdfcHRyLT5wYXNzXTsKLSAgIH0KLSAgIGVsc2UKLSNlbmRpZiAvKiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQgKi8KLSAgIHsKLSAgICAgIHBuZ19wdHItPm51bV9yb3dzID0gcG5nX3B0ci0+aGVpZ2h0OwotICAgICAgcG5nX3B0ci0+aXdpZHRoID0gcG5nX3B0ci0+d2lkdGg7Ci0gICB9Ci0gICBtYXhfcGl4ZWxfZGVwdGggPSBwbmdfcHRyLT5waXhlbF9kZXB0aDsKLQotI2lmZGVmIFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVECi0gICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLKSAmJiBwbmdfcHRyLT5iaXRfZGVwdGggPCA4KQotICAgICAgbWF4X3BpeGVsX2RlcHRoID0gODsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkQpCi0gICB7Ci0gICAgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgewotICAgICAgICAgaWYgKHBuZ19wdHItPm51bV90cmFucykKLSAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDMyOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gMjQ7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpCi0gICAgICB7Ci0gICAgICAgICBpZiAobWF4X3BpeGVsX2RlcHRoIDwgOCkKLSAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDg7Ci0gICAgICAgICBpZiAocG5nX3B0ci0+bnVtX3RyYW5zKQotICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoICo9IDI7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKLSAgICAgIHsKLSAgICAgICAgIGlmIChwbmdfcHRyLT5udW1fdHJhbnMpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggKj0gNDsKLSAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCAvPSAzOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgKFBOR19GSUxMRVIpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDMyOwotICAgICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQotICAgICAgewotICAgICAgICAgaWYgKG1heF9waXhlbF9kZXB0aCA8PSA4KQotICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gMTY7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSAzMjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgICAgewotICAgICAgICAgaWYgKG1heF9waXhlbF9kZXB0aCA8PSAzMikKLSAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDMyOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gNjQ7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19HUkFZX1RPX1JHQikKLSAgIHsKLSAgICAgIGlmICgKLSNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECi0gICAgICAgIChwbmdfcHRyLT5udW1fdHJhbnMgJiYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkQpKSB8fAotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRAotICAgICAgICAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgKFBOR19GSUxMRVIpKSB8fAotI2VuZGlmCi0gICAgICAgIHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKLSAgICAgIHsKLSAgICAgICAgIGlmIChtYXhfcGl4ZWxfZGVwdGggPD0gMTYpCi0gICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSAzMjsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDY0OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgaWYgKG1heF9waXhlbF9kZXB0aCA8PSA4KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gMzI7Ci0gICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gMjQ7Ci0gICAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gNjQ7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSA0ODsKLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpICYmIFwKLWRlZmluZWQoUE5HX1VTRVJfVFJBTlNGT1JNX1BUUl9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1VTRVJfVFJBTlNGT1JNKQotICAgICB7Ci0gICAgICAgaW50IHVzZXJfcGl4ZWxfZGVwdGggPSBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9kZXB0aCoKLSAgICAgICAgIHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2NoYW5uZWxzOwotICAgICAgIGlmICh1c2VyX3BpeGVsX2RlcHRoID4gbWF4X3BpeGVsX2RlcHRoKQotICAgICAgICAgbWF4X3BpeGVsX2RlcHRoPXVzZXJfcGl4ZWxfZGVwdGg7Ci0gICAgIH0KLSNlbmRpZgotCi0gICAvKiBBbGlnbiB0aGUgd2lkdGggb24gdGhlIG5leHQgbGFyZ2VyIDggcGl4ZWxzLiAgTWFpbmx5IHVzZWQKLSAgICAqIGZvciBpbnRlcmxhY2luZwotICAgICovCi0gICByb3dfYnl0ZXMgPSAoKHBuZ19wdHItPndpZHRoICsgNykgJiB+KChwbmdfdWludF8zMik3KSk7Ci0gICAvKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gYnl0ZXMgbmVlZGVkLCBhZGRpbmcgYSBieXRlIGFuZCBhIHBpeGVsCi0gICAgKiBmb3Igc2FmZXR5J3Mgc2FrZQotICAgICovCi0gICByb3dfYnl0ZXMgPSBQTkdfUk9XQllURVMobWF4X3BpeGVsX2RlcHRoLCByb3dfYnl0ZXMpICsKLSAgICAgIDEgKyAoKG1heF9waXhlbF9kZXB0aCArIDcpID4+IDMpOwotI2lmZGVmIFBOR19NQVhfTUFMTE9DXzY0SwotICAgaWYgKHJvd19ieXRlcyA+IChwbmdfdWludF8zMik2NTUzNkwpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlRoaXMgaW1hZ2UgcmVxdWlyZXMgYSByb3cgZ3JlYXRlciB0aGFuIDY0S0IiKTsKLSNlbmRpZgotCi0gICBpZiAocm93X2J5dGVzICsgNDggPiBwbmdfcHRyLT5vbGRfYmlnX3Jvd19idWZfc2l6ZSkKLSAgIHsKLSAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+YmlnX3Jvd19idWYpOwotICAgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCkKLSAgICAgICAgcG5nX3B0ci0+YmlnX3Jvd19idWYgPSAocG5nX2J5dGVwKXBuZ19jYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgIHJvd19ieXRlcyArIDQ4KTsKLSAgICAgZWxzZQotICAgICAgICBwbmdfcHRyLT5iaWdfcm93X2J1ZiA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgcm93X2J5dGVzICsgNDgpOwotICAgICBwbmdfcHRyLT5vbGRfYmlnX3Jvd19idWZfc2l6ZSA9IHJvd19ieXRlcyArIDQ4OwotCi0jaWZkZWYgUE5HX0FMSUdORURfTUVNT1JZX1NVUFBPUlRFRAotICAgICAvKiBVc2UgMTYtYnl0ZSBhbGlnbmVkIG1lbW9yeSBmb3Igcm93X2J1ZiB3aXRoIGF0IGxlYXN0IDE2IGJ5dGVzCi0gICAgICAqIG9mIHBhZGRpbmcgYmVmb3JlIGFuZCBhZnRlciByb3dfYnVmLgotICAgICAgKi8KLSAgICAgcG5nX3B0ci0+cm93X2J1ZiA9IHBuZ19wdHItPmJpZ19yb3dfYnVmICsgMzIKLSAgICAgICAgIC0gKCgocG5nX2FsbG9jX3NpemVfdCkmKHBuZ19wdHItPmJpZ19yb3dfYnVmWzBdKSArIDE1KSAlIDE2KTsKLSAgICAgcG5nX3B0ci0+b2xkX2JpZ19yb3dfYnVmX3NpemUgPSByb3dfYnl0ZXMgKyA0ODsKLSNlbHNlCi0gICAgIC8qIFVzZSAzMiBieXRlcyBvZiBwYWRkaW5nIGJlZm9yZSBhbmQgMTYgYnl0ZXMgYWZ0ZXIgcm93X2J1Zi4gKi8KLSAgICAgcG5nX3B0ci0+cm93X2J1ZiA9IHBuZ19wdHItPmJpZ19yb3dfYnVmICsgMzI7Ci0jZW5kaWYKLSAgICAgcG5nX3B0ci0+b2xkX2JpZ19yb3dfYnVmX3NpemUgPSByb3dfYnl0ZXMgKyA0ODsKLSAgIH0KLQotI2lmZGVmIFBOR19NQVhfTUFMTE9DXzY0SwotICAgaWYgKChwbmdfdWludF8zMilwbmdfcHRyLT5yb3dieXRlcyArIDEgPiAocG5nX3VpbnRfMzIpNjU1MzZMKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJUaGlzIGltYWdlIHJlcXVpcmVzIGEgcm93IGdyZWF0ZXIgdGhhbiA2NEtCIik7Ci0jZW5kaWYKLSAgIGlmICgocG5nX3VpbnRfMzIpcG5nX3B0ci0+cm93Ynl0ZXMgPiAocG5nX3VpbnRfMzIpKFBOR19TSVpFX01BWCAtIDEpKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJSb3cgaGFzIHRvbyBtYW55IGJ5dGVzIHRvIGFsbG9jYXRlIGluIG1lbW9yeSIpOwotCi0gICBpZiAocG5nX3B0ci0+cm93Ynl0ZXMgKyAxID4gcG5nX3B0ci0+b2xkX3ByZXZfcm93X3NpemUpCi0gICB7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5wcmV2X3Jvdyk7Ci0gICAgICBwbmdfcHRyLT5wcmV2X3JvdyA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLCAocG5nX3VpbnRfMzIpKAotICAgICAgICBwbmdfcHRyLT5yb3dieXRlcyArIDEpKTsKLSAgICAgIHBuZ19wdHItPm9sZF9wcmV2X3Jvd19zaXplID0gcG5nX3B0ci0+cm93Ynl0ZXMgKyAxOwotICAgfQotCi0gICBwbmdfbWVtc2V0KHBuZ19wdHItPnByZXZfcm93LCAwLCBwbmdfcHRyLT5yb3dieXRlcyArIDEpOwotCi0gICBwbmdfZGVidWcxKDMsICJ3aWR0aCA9ICVsdSwiLCAodW5zaWduZWQgbG9uZylwbmdfcHRyLT53aWR0aCk7Ci0gICBwbmdfZGVidWcxKDMsICJoZWlnaHQgPSAlbHUsIiwgKHVuc2lnbmVkIGxvbmcpcG5nX3B0ci0+aGVpZ2h0KTsKLSAgIHBuZ19kZWJ1ZzEoMywgIml3aWR0aCA9ICVsdSwiLCAodW5zaWduZWQgbG9uZylwbmdfcHRyLT5pd2lkdGgpOwotICAgcG5nX2RlYnVnMSgzLCAibnVtX3Jvd3MgPSAlbHUsIiwgKHVuc2lnbmVkIGxvbmcpcG5nX3B0ci0+bnVtX3Jvd3MpOwotICAgcG5nX2RlYnVnMSgzLCAicm93Ynl0ZXMgPSAlbHUsIiwgKHVuc2lnbmVkIGxvbmcpcG5nX3B0ci0+cm93Ynl0ZXMpOwotICAgcG5nX2RlYnVnMSgzLCAiaXJvd2J5dGVzID0gJWx1IiwKLSAgICAgICAodW5zaWduZWQgbG9uZylQTkdfUk9XQllURVMocG5nX3B0ci0+cGl4ZWxfZGVwdGgsIHBuZ19wdHItPml3aWR0aCkgKyAxKTsKLQotICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfUk9XX0lOSVQ7Ci19Ci0jZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3BuZ3NldC5jIGIvc3JjL2xpYnBuZy9wbmdzZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkZGZjYS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3BuZ3NldC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4MyArMCwwIEBACi0KLS8qIHBuZ3NldC5jIC0gc3RvcmFnZSBvZiBpbWFnZSBpbmZvcm1hdGlvbiBpbnRvIGluZm8gc3RydWN0Ci0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjQuMTEgW01hcmNoIDI5LCAyMDEyXQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTIgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSAqCi0gKiBUaGUgZnVuY3Rpb25zIGhlcmUgYXJlIHVzZWQgZHVyaW5nIHJlYWRzIHRvIHN0b3JlIGRhdGEgZnJvbSB0aGUgZmlsZQotICogaW50byB0aGUgaW5mbyBzdHJ1Y3QsIGFuZCBkdXJpbmcgd3JpdGVzIHRvIHN0b3JlIGFwcGxpY2F0aW9uIGRhdGEKLSAqIGludG8gdGhlIGluZm8gc3RydWN0IGZvciB3cml0aW5nIGludG8gdGhlIGZpbGUuICBUaGlzIGFic3RyYWN0cyB0aGUKLSAqIGluZm8gc3RydWN0IGFuZCBhbGxvd3MgdXMgdG8gY2hhbmdlIHRoZSBzdHJ1Y3R1cmUgaW4gdGhlIGZ1dHVyZS4KLSAqLwotCi0jZGVmaW5lIFBOR19OT19QRURBTlRJQ19XQVJOSU5HUwotI2luY2x1ZGUgInBuZy5oIgotI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpCi0jaW5jbHVkZSAicG5ncHJpdi5oIgotCi0jaWZkZWYgUE5HX2JLR0RfU1VQUE9SVEVECi12b2lkIFBOR0FQSQotcG5nX3NldF9iS0dEKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2NvbG9yXzE2cCBiYWNrZ3JvdW5kKQotewotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJiS0dEIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgcG5nX21lbWNweSgmKGluZm9fcHRyLT5iYWNrZ3JvdW5kKSwgYmFja2dyb3VuZCwgcG5nX3NpemVvZihwbmdfY29sb3JfMTYpKTsKLSAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19iS0dEOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfY0hSTV9TVVBQT1JURUQKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi12b2lkIFBOR0FQSQotcG5nX3NldF9jSFJNKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIGRvdWJsZSB3aGl0ZV94LCBkb3VibGUgd2hpdGVfeSwgZG91YmxlIHJlZF94LCBkb3VibGUgcmVkX3ksCi0gICBkb3VibGUgZ3JlZW5feCwgZG91YmxlIGdyZWVuX3ksIGRvdWJsZSBibHVlX3gsIGRvdWJsZSBibHVlX3kpCi17Ci0gICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgImNIUk0iKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBpbmZvX3B0ci0+eF93aGl0ZSA9IChmbG9hdCl3aGl0ZV94OwotICAgaW5mb19wdHItPnlfd2hpdGUgPSAoZmxvYXQpd2hpdGVfeTsKLSAgIGluZm9fcHRyLT54X3JlZCAgID0gKGZsb2F0KXJlZF94OwotICAgaW5mb19wdHItPnlfcmVkICAgPSAoZmxvYXQpcmVkX3k7Ci0gICBpbmZvX3B0ci0+eF9ncmVlbiA9IChmbG9hdClncmVlbl94OwotICAgaW5mb19wdHItPnlfZ3JlZW4gPSAoZmxvYXQpZ3JlZW5feTsKLSAgIGluZm9fcHRyLT54X2JsdWUgID0gKGZsb2F0KWJsdWVfeDsKLSAgIGluZm9fcHRyLT55X2JsdWUgID0gKGZsb2F0KWJsdWVfeTsKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi0gICBpbmZvX3B0ci0+aW50X3hfd2hpdGUgPSAocG5nX2ZpeGVkX3BvaW50KSh3aGl0ZV94KjEwMDAwMC4rMC41KTsKLSAgIGluZm9fcHRyLT5pbnRfeV93aGl0ZSA9IChwbmdfZml4ZWRfcG9pbnQpKHdoaXRlX3kqMTAwMDAwLiswLjUpOwotICAgaW5mb19wdHItPmludF94X3JlZCAgID0gKHBuZ19maXhlZF9wb2ludCkoICByZWRfeCoxMDAwMDAuKzAuNSk7Ci0gICBpbmZvX3B0ci0+aW50X3lfcmVkICAgPSAocG5nX2ZpeGVkX3BvaW50KSggIHJlZF95KjEwMDAwMC4rMC41KTsKLSAgIGluZm9fcHRyLT5pbnRfeF9ncmVlbiA9IChwbmdfZml4ZWRfcG9pbnQpKGdyZWVuX3gqMTAwMDAwLiswLjUpOwotICAgaW5mb19wdHItPmludF95X2dyZWVuID0gKHBuZ19maXhlZF9wb2ludCkoZ3JlZW5feSoxMDAwMDAuKzAuNSk7Ci0gICBpbmZvX3B0ci0+aW50X3hfYmx1ZSAgPSAocG5nX2ZpeGVkX3BvaW50KSggYmx1ZV94KjEwMDAwMC4rMC41KTsKLSAgIGluZm9fcHRyLT5pbnRfeV9ibHVlICA9IChwbmdfZml4ZWRfcG9pbnQpKCBibHVlX3kqMTAwMDAwLiswLjUpOwotI2VuZGlmCi0gICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fY0hSTTsKLX0KLSNlbmRpZiAvKiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi12b2lkIFBOR0FQSQotcG5nX3NldF9jSFJNX2ZpeGVkKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ19maXhlZF9wb2ludCB3aGl0ZV94LCBwbmdfZml4ZWRfcG9pbnQgd2hpdGVfeSwgcG5nX2ZpeGVkX3BvaW50IHJlZF94LAotICAgcG5nX2ZpeGVkX3BvaW50IHJlZF95LCBwbmdfZml4ZWRfcG9pbnQgZ3JlZW5feCwgcG5nX2ZpeGVkX3BvaW50IGdyZWVuX3ksCi0gICBwbmdfZml4ZWRfcG9pbnQgYmx1ZV94LCBwbmdfZml4ZWRfcG9pbnQgYmx1ZV95KQotewotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJjSFJNIGZpeGVkIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotI2lmZGVmIFBOR19DSEVDS19jSFJNX1NVUFBPUlRFRAotICAgaWYgKHBuZ19jaGVja19jSFJNX2ZpeGVkKHBuZ19wdHIsCi0gICAgICB3aGl0ZV94LCB3aGl0ZV95LCByZWRfeCwgcmVkX3ksIGdyZWVuX3gsIGdyZWVuX3ksIGJsdWVfeCwgYmx1ZV95KSkKLSNlbmRpZgotICAgewotICAgICAgaW5mb19wdHItPmludF94X3doaXRlID0gd2hpdGVfeDsKLSAgICAgIGluZm9fcHRyLT5pbnRfeV93aGl0ZSA9IHdoaXRlX3k7Ci0gICAgICBpbmZvX3B0ci0+aW50X3hfcmVkICAgPSByZWRfeDsKLSAgICAgIGluZm9fcHRyLT5pbnRfeV9yZWQgICA9IHJlZF95OwotICAgICAgaW5mb19wdHItPmludF94X2dyZWVuID0gZ3JlZW5feDsKLSAgICAgIGluZm9fcHRyLT5pbnRfeV9ncmVlbiA9IGdyZWVuX3k7Ci0gICAgICBpbmZvX3B0ci0+aW50X3hfYmx1ZSAgPSBibHVlX3g7Ci0gICAgICBpbmZvX3B0ci0+aW50X3lfYmx1ZSAgPSBibHVlX3k7Ci0jaWZkZWYgIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgICAgIGluZm9fcHRyLT54X3doaXRlID0gKGZsb2F0KSh3aGl0ZV94LzEwMDAwMC4pOwotICAgICAgaW5mb19wdHItPnlfd2hpdGUgPSAoZmxvYXQpKHdoaXRlX3kvMTAwMDAwLik7Ci0gICAgICBpbmZvX3B0ci0+eF9yZWQgICA9IChmbG9hdCkoICByZWRfeC8xMDAwMDAuKTsKLSAgICAgIGluZm9fcHRyLT55X3JlZCAgID0gKGZsb2F0KSggIHJlZF95LzEwMDAwMC4pOwotICAgICAgaW5mb19wdHItPnhfZ3JlZW4gPSAoZmxvYXQpKGdyZWVuX3gvMTAwMDAwLik7Ci0gICAgICBpbmZvX3B0ci0+eV9ncmVlbiA9IChmbG9hdCkoZ3JlZW5feS8xMDAwMDAuKTsKLSAgICAgIGluZm9fcHRyLT54X2JsdWUgID0gKGZsb2F0KSggYmx1ZV94LzEwMDAwMC4pOwotICAgICAgaW5mb19wdHItPnlfYmx1ZSAgPSAoZmxvYXQpKCBibHVlX3kvMTAwMDAwLik7Ci0jZW5kaWYKLSAgICAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19jSFJNOwotICAgfQotfQotI2VuZGlmIC8qIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQgKi8KLSNlbmRpZiAvKiBQTkdfY0hSTV9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBOR19nQU1BX1NVUFBPUlRFRAotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2dBTUEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBkb3VibGUgZmlsZV9nYW1tYSkKLXsKLSAgIGRvdWJsZSBwbmdfZ2FtbWE7Ci0KLSAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAiZ0FNQSIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLwotICAgaWYgKGZpbGVfZ2FtbWEgPiAyMTQ3NC44MykKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJMaW1pdGluZyBnYW1tYSB0byAyMTQ3NC44MyIpOwotICAgICAgcG5nX2dhbW1hPTIxNDc0LjgzOwotICAgfQotICAgZWxzZQotICAgICAgcG5nX2dhbW1hID0gZmlsZV9nYW1tYTsKLSAgIGluZm9fcHRyLT5nYW1tYSA9IChmbG9hdClwbmdfZ2FtbWE7Ci0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotICAgaW5mb19wdHItPmludF9nYW1tYSA9IChpbnQpKHBuZ19nYW1tYSoxMDAwMDAuKy41KTsKLSNlbmRpZgotICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX2dBTUE7Ci0gICBpZiAocG5nX2dhbW1hID09IDAuMCkKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJTZXR0aW5nIGdhbW1hPTAiKTsKLX0KLSNlbmRpZgotdm9pZCBQTkdBUEkKLXBuZ19zZXRfZ0FNQV9maXhlZChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19maXhlZF9wb2ludAotICAgaW50X2dhbW1hKQotewotICAgcG5nX2ZpeGVkX3BvaW50IHBuZ19nYW1tYTsKLQotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJnQU1BIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgaWYgKGludF9nYW1tYSA+IChwbmdfZml4ZWRfcG9pbnQpUE5HX1VJTlRfMzFfTUFYKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkxpbWl0aW5nIGdhbW1hIHRvIDIxNDc0LjgzIik7Ci0gICAgICBwbmdfZ2FtbWE9UE5HX1VJTlRfMzFfTUFYOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgaWYgKGludF9nYW1tYSA8IDApCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiU2V0dGluZyBuZWdhdGl2ZSBnYW1tYSB0byB6ZXJvIik7Ci0gICAgICAgICBwbmdfZ2FtbWEgPSAwOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICAgcG5nX2dhbW1hID0gaW50X2dhbW1hOwotICAgfQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgIGluZm9fcHRyLT5nYW1tYSA9IChmbG9hdCkocG5nX2dhbW1hLzEwMDAwMC4pOwotI2VuZGlmCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotICAgaW5mb19wdHItPmludF9nYW1tYSA9IHBuZ19nYW1tYTsKLSNlbmRpZgotICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX2dBTUE7Ci0gICBpZiAocG5nX2dhbW1hID09IDApCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiU2V0dGluZyBnYW1tYT0wIik7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19oSVNUX1NVUFBPUlRFRAotdm9pZCBQTkdBUEkKLXBuZ19zZXRfaElTVChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzE2cCBoaXN0KQotewotICAgaW50IGk7Ci0KLSAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAiaElTVCIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIGlmIChpbmZvX3B0ci0+bnVtX3BhbGV0dGUgPT0gMCB8fCBpbmZvX3B0ci0+bnVtX3BhbGV0dGUKLSAgICAgICA+IFBOR19NQVhfUEFMRVRURV9MRU5HVEgpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgIkludmFsaWQgcGFsZXR0ZSBzaXplLCBoSVNUIGFsbG9jYXRpb24gc2tpcHBlZCIpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9ISVNULCAwKTsKLSAgIC8qIENoYW5nZWQgZnJvbSBpbmZvLT5udW1fcGFsZXR0ZSB0byBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIIGluCi0gICAgKiB2ZXJzaW9uIDEuMi4xCi0gICAgKi8KLSAgIHBuZ19wdHItPmhpc3QgPSAocG5nX3VpbnRfMTZwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLAotICAgICAgUE5HX01BWF9QQUxFVFRFX0xFTkdUSCAqIHBuZ19zaXplb2YocG5nX3VpbnRfMTYpKTsKLSAgIGlmIChwbmdfcHRyLT5oaXN0ID09IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgaElTVCBjaHVuayBkYXRhIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIGZvciAoaSA9IDA7IGkgPCBpbmZvX3B0ci0+bnVtX3BhbGV0dGU7IGkrKykKLSAgICAgIHBuZ19wdHItPmhpc3RbaV0gPSBoaXN0W2ldOwotICAgaW5mb19wdHItPmhpc3QgPSBwbmdfcHRyLT5oaXN0OwotICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX2hJU1Q7Ci0KLSAgIGluZm9fcHRyLT5mcmVlX21lIHw9IFBOR19GUkVFX0hJU1Q7Ci19Ci0jZW5kaWYKLQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfSUhEUihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiB3aWR0aCwgcG5nX3VpbnRfMzIgaGVpZ2h0LCBpbnQgYml0X2RlcHRoLAotICAgaW50IGNvbG9yX3R5cGUsIGludCBpbnRlcmxhY2VfdHlwZSwgaW50IGNvbXByZXNzaW9uX3R5cGUsCi0gICBpbnQgZmlsdGVyX3R5cGUpCi17Ci0gICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgIklIRFIiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBpbmZvX3B0ci0+d2lkdGggPSB3aWR0aDsKLSAgIGluZm9fcHRyLT5oZWlnaHQgPSBoZWlnaHQ7Ci0gICBpbmZvX3B0ci0+Yml0X2RlcHRoID0gKHBuZ19ieXRlKWJpdF9kZXB0aDsKLSAgIGluZm9fcHRyLT5jb2xvcl90eXBlID0gKHBuZ19ieXRlKWNvbG9yX3R5cGU7Ci0gICBpbmZvX3B0ci0+Y29tcHJlc3Npb25fdHlwZSA9IChwbmdfYnl0ZSljb21wcmVzc2lvbl90eXBlOwotICAgaW5mb19wdHItPmZpbHRlcl90eXBlID0gKHBuZ19ieXRlKWZpbHRlcl90eXBlOwotICAgaW5mb19wdHItPmludGVybGFjZV90eXBlID0gKHBuZ19ieXRlKWludGVybGFjZV90eXBlOwotCi0gICBwbmdfY2hlY2tfSUhEUiAocG5nX3B0ciwgaW5mb19wdHItPndpZHRoLCBpbmZvX3B0ci0+aGVpZ2h0LAotICAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGgsIGluZm9fcHRyLT5jb2xvcl90eXBlLCBpbmZvX3B0ci0+aW50ZXJsYWNlX3R5cGUsCi0gICAgICAgaW5mb19wdHItPmNvbXByZXNzaW9uX3R5cGUsIGluZm9fcHRyLT5maWx0ZXJfdHlwZSk7Ci0KLSAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgaW5mb19wdHItPmNoYW5uZWxzID0gMTsKLSAgIGVsc2UgaWYgKGluZm9fcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCi0gICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMgPSAzOwotICAgZWxzZQotICAgICAgaW5mb19wdHItPmNoYW5uZWxzID0gMTsKLSAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQotICAgICAgaW5mb19wdHItPmNoYW5uZWxzKys7Ci0gICBpbmZvX3B0ci0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKGluZm9fcHRyLT5jaGFubmVscyAqIGluZm9fcHRyLT5iaXRfZGVwdGgpOwotCi0gICAvKiBDaGVjayBmb3IgcG90ZW50aWFsIG92ZXJmbG93ICovCi0gICBpZiAod2lkdGggPiAoUE5HX1VJTlRfMzJfTUFYCi0gICAgICAgICAgICAgICAgID4+IDMpICAgICAgLyogOC1ieXRlIFJHQkEgcGl4ZWxzICovCi0gICAgICAgICAgICAgICAgIC0gNjQgICAgICAgLyogYmlncm93YnVmIGhhY2sgKi8KLSAgICAgICAgICAgICAgICAgLSAxICAgICAgICAvKiBmaWx0ZXIgYnl0ZSAqLwotICAgICAgICAgICAgICAgICAtIDcqOCAgICAgIC8qIHJvdW5kaW5nIG9mIHdpZHRoIHRvIG11bHRpcGxlIG9mIDggcGl4ZWxzICovCi0gICAgICAgICAgICAgICAgIC0gOCkgICAgICAgLyogZXh0cmEgbWF4X3BpeGVsX2RlcHRoIHBhZCAqLwotICAgICAgaW5mb19wdHItPnJvd2J5dGVzID0gMDsKLSAgIGVsc2UKLSAgICAgIGluZm9fcHRyLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhpbmZvX3B0ci0+cGl4ZWxfZGVwdGgsIHdpZHRoKTsKLX0KLQotI2lmZGVmIFBOR19vRkZzX1NVUFBPUlRFRAotdm9pZCBQTkdBUEkKLXBuZ19zZXRfb0ZGcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfaW50XzMyIG9mZnNldF94LCBwbmdfaW50XzMyIG9mZnNldF95LCBpbnQgdW5pdF90eXBlKQotewotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJvRkZzIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgaW5mb19wdHItPnhfb2Zmc2V0ID0gb2Zmc2V0X3g7Ci0gICBpbmZvX3B0ci0+eV9vZmZzZXQgPSBvZmZzZXRfeTsKLSAgIGluZm9fcHRyLT5vZmZzZXRfdW5pdF90eXBlID0gKHBuZ19ieXRlKXVuaXRfdHlwZTsKLSAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19vRkZzOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfcENBTF9TVVBQT1JURUQKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3BDQUwocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX2NoYXJwIHB1cnBvc2UsIHBuZ19pbnRfMzIgWDAsIHBuZ19pbnRfMzIgWDEsIGludCB0eXBlLCBpbnQgbnBhcmFtcywKLSAgIHBuZ19jaGFycCB1bml0cywgcG5nX2NoYXJwcCBwYXJhbXMpCi17Ci0gICBwbmdfc2l6ZV90IGxlbmd0aDsKLSAgIGludCBpOwotCi0gICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInBDQUwiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBsZW5ndGggPSBwbmdfc3RybGVuKHB1cnBvc2UpICsgMTsKLSAgIHBuZ19kZWJ1ZzEoMywgImFsbG9jYXRpbmcgcHVycG9zZSBmb3IgaW5mbyAoJWx1IGJ5dGVzKSIsCi0gICAgICh1bnNpZ25lZCBsb25nKWxlbmd0aCk7Ci0gICBpbmZvX3B0ci0+cGNhbF9wdXJwb3NlID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgbGVuZ3RoKTsKLSAgIGlmIChpbmZvX3B0ci0+cGNhbF9wdXJwb3NlID09IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgcENBTCBwdXJwb3NlIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBwbmdfbWVtY3B5KGluZm9fcHRyLT5wY2FsX3B1cnBvc2UsIHB1cnBvc2UsIGxlbmd0aCk7Ci0KLSAgIHBuZ19kZWJ1ZygzLCAic3RvcmluZyBYMCwgWDEsIHR5cGUsIGFuZCBucGFyYW1zIGluIGluZm8iKTsKLSAgIGluZm9fcHRyLT5wY2FsX1gwID0gWDA7Ci0gICBpbmZvX3B0ci0+cGNhbF9YMSA9IFgxOwotICAgaW5mb19wdHItPnBjYWxfdHlwZSA9IChwbmdfYnl0ZSl0eXBlOwotICAgaW5mb19wdHItPnBjYWxfbnBhcmFtcyA9IChwbmdfYnl0ZSlucGFyYW1zOwotCi0gICBsZW5ndGggPSBwbmdfc3RybGVuKHVuaXRzKSArIDE7Ci0gICBwbmdfZGVidWcxKDMsICJhbGxvY2F0aW5nIHVuaXRzIGZvciBpbmZvICglbHUgYnl0ZXMpIiwKLSAgICAgKHVuc2lnbmVkIGxvbmcpbGVuZ3RoKTsKLSAgIGluZm9fcHRyLT5wY2FsX3VuaXRzID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgbGVuZ3RoKTsKLSAgIGlmIChpbmZvX3B0ci0+cGNhbF91bml0cyA9PSBOVUxMKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgZm9yIHBDQUwgdW5pdHMiKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIHBuZ19tZW1jcHkoaW5mb19wdHItPnBjYWxfdW5pdHMsIHVuaXRzLCBsZW5ndGgpOwotCi0gICBpbmZvX3B0ci0+cGNhbF9wYXJhbXMgPSAocG5nX2NoYXJwcClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKLSAgICAgIChwbmdfc2l6ZV90KSgobnBhcmFtcyArIDEpICogcG5nX3NpemVvZihwbmdfY2hhcnApKSk7Ci0gICBpZiAoaW5mb19wdHItPnBjYWxfcGFyYW1zID09IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgcENBTCBwYXJhbXMiKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX21lbXNldChpbmZvX3B0ci0+cGNhbF9wYXJhbXMsIDAsIChucGFyYW1zICsgMSkgKiBwbmdfc2l6ZW9mKHBuZ19jaGFycCkpOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgbnBhcmFtczsgaSsrKQotICAgewotICAgICAgbGVuZ3RoID0gcG5nX3N0cmxlbihwYXJhbXNbaV0pICsgMTsKLSAgICAgIHBuZ19kZWJ1ZzIoMywgImFsbG9jYXRpbmcgcGFyYW1ldGVyICVkIGZvciBpbmZvICglbHUgYnl0ZXMpIiwgaSwKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpbGVuZ3RoKTsKLSAgICAgIGluZm9fcHRyLT5wY2FsX3BhcmFtc1tpXSA9IChwbmdfY2hhcnApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICBpZiAoaW5mb19wdHItPnBjYWxfcGFyYW1zW2ldID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgcENBTCBwYXJhbWV0ZXIiKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHBuZ19tZW1jcHkoaW5mb19wdHItPnBjYWxfcGFyYW1zW2ldLCBwYXJhbXNbaV0sIGxlbmd0aCk7Ci0gICB9Ci0KLSAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19wQ0FMOwotICAgaW5mb19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfUENBTDsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfc0NBTF9TVVBQT1JURUQpCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotdm9pZCBQTkdBUEkKLXBuZ19zZXRfc0NBTChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICAgICAgICAgICAgaW50IHVuaXQsIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCkKLXsKLSAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAic0NBTCIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIGluZm9fcHRyLT5zY2FsX3VuaXQgPSAocG5nX2J5dGUpdW5pdDsKLSAgIGluZm9fcHRyLT5zY2FsX3BpeGVsX3dpZHRoID0gd2lkdGg7Ci0gICBpbmZvX3B0ci0+c2NhbF9waXhlbF9oZWlnaHQgPSBoZWlnaHQ7Ci0KLSAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19zQ0FMOwotfQotI2Vsc2UKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi12b2lkIFBOR0FQSQotcG5nX3NldF9zQ0FMX3MocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgICAgICAgICAgIGludCB1bml0LCBwbmdfY2hhcnAgc3dpZHRoLCBwbmdfY2hhcnAgc2hlaWdodCkKLXsKLSAgIHBuZ19zaXplX3QgbGVuZ3RoOwotCi0gICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInNDQUwiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBpbmZvX3B0ci0+c2NhbF91bml0ID0gKHBuZ19ieXRlKXVuaXQ7Ci0KLSAgIGxlbmd0aCA9IHBuZ19zdHJsZW4oc3dpZHRoKSArIDE7Ci0gICBwbmdfZGVidWcxKDMsICJhbGxvY2F0aW5nIHVuaXQgZm9yIGluZm8gKCV1IGJ5dGVzKSIsCi0gICAgICAodW5zaWduZWQgaW50KWxlbmd0aCk7Ci0gICBpbmZvX3B0ci0+c2NhbF9zX3dpZHRoID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgbGVuZ3RoKTsKLSAgIGlmIChpbmZvX3B0ci0+c2NhbF9zX3dpZHRoID09IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCB3aGlsZSBwcm9jZXNzaW5nIHNDQUwiKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIHBuZ19tZW1jcHkoaW5mb19wdHItPnNjYWxfc193aWR0aCwgc3dpZHRoLCBsZW5ndGgpOwotCi0gICBsZW5ndGggPSBwbmdfc3RybGVuKHNoZWlnaHQpICsgMTsKLSAgIHBuZ19kZWJ1ZzEoMywgImFsbG9jYXRpbmcgdW5pdCBmb3IgaW5mbyAoJXUgYnl0ZXMpIiwKLSAgICAgICh1bnNpZ25lZCBpbnQpbGVuZ3RoKTsKLSAgIGluZm9fcHRyLT5zY2FsX3NfaGVpZ2h0ID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgbGVuZ3RoKTsKLSAgIGlmIChpbmZvX3B0ci0+c2NhbF9zX2hlaWdodCA9PSBOVUxMKQotICAgewotICAgICAgcG5nX2ZyZWUgKHBuZ19wdHIsIGluZm9fcHRyLT5zY2FsX3Nfd2lkdGgpOwotICAgICAgaW5mb19wdHItPnNjYWxfc193aWR0aCA9IE5VTEw7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCB3aGlsZSBwcm9jZXNzaW5nIHNDQUwiKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIHBuZ19tZW1jcHkoaW5mb19wdHItPnNjYWxfc19oZWlnaHQsIHNoZWlnaHQsIGxlbmd0aCk7Ci0gICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fc0NBTDsKLSAgIGluZm9fcHRyLT5mcmVlX21lIHw9IFBOR19GUkVFX1NDQUw7Ci19Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBQTkdfcEhZc19TVVBQT1JURUQKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3BIWXMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX3VpbnRfMzIgcmVzX3gsIHBuZ191aW50XzMyIHJlc195LCBpbnQgdW5pdF90eXBlKQotewotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJwSFlzIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgaW5mb19wdHItPnhfcGl4ZWxzX3Blcl91bml0ID0gcmVzX3g7Ci0gICBpbmZvX3B0ci0+eV9waXhlbHNfcGVyX3VuaXQgPSByZXNfeTsKLSAgIGluZm9fcHRyLT5waHlzX3VuaXRfdHlwZSA9IChwbmdfYnl0ZSl1bml0X3R5cGU7Ci0gICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fcEhZczsKLX0KLSNlbmRpZgotCi12b2lkIFBOR0FQSQotcG5nX3NldF9QTFRFKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ19jb2xvcnAgcGFsZXR0ZSwgaW50IG51bV9wYWxldHRlKQotewotCi0gICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgIlBMVEUiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBpZiAobnVtX3BhbGV0dGUgPCAwIHx8IG51bV9wYWxldHRlID4gUE5HX01BWF9QQUxFVFRFX0xFTkdUSCkKLSAgIHsKLSAgICAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIHBhbGV0dGUgbGVuZ3RoIik7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBwYWxldHRlIGxlbmd0aCIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgfQotCi0gICAvKiBJdCBtYXkgbm90IGFjdHVhbGx5IGJlIG5lY2Vzc2FyeSB0byBzZXQgcG5nX3B0ci0+cGFsZXR0ZSBoZXJlOwotICAgICogd2UgZG8gaXQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgd2F5IHRoZSBwbmdfaGFuZGxlX3RSTlMKLSAgICAqIGZ1bmN0aW9uIHVzZWQgdG8gZG8gdGhlIGFsbG9jYXRpb24uCi0gICAgKi8KLSAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIFBOR19GUkVFX1BMVEUsIDApOwotCi0gICAvKiBDaGFuZ2VkIGluIGxpYnBuZy0xLjIuMSB0byBhbGxvY2F0ZSBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIIGluc3RlYWQKLSAgICAqIG9mIG51bV9wYWxldHRlIGVudHJpZXMsIGluIGNhc2Ugb2YgYW4gaW52YWxpZCBQTkcgZmlsZSB0aGF0IGhhcwotICAgICogdG9vLWxhcmdlIHNhbXBsZSB2YWx1ZXMuCi0gICAgKi8KLSAgIHBuZ19wdHItPnBhbGV0dGUgPSAocG5nX2NvbG9ycClwbmdfY2FsbG9jKHBuZ19wdHIsCi0gICAgICBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIICogcG5nX3NpemVvZihwbmdfY29sb3IpKTsKLSAgIHBuZ19tZW1jcHkocG5nX3B0ci0+cGFsZXR0ZSwgcGFsZXR0ZSwgbnVtX3BhbGV0dGUgKiBwbmdfc2l6ZW9mKHBuZ19jb2xvcikpOwotICAgaW5mb19wdHItPnBhbGV0dGUgPSBwbmdfcHRyLT5wYWxldHRlOwotICAgaW5mb19wdHItPm51bV9wYWxldHRlID0gcG5nX3B0ci0+bnVtX3BhbGV0dGUgPSAocG5nX3VpbnRfMTYpbnVtX3BhbGV0dGU7Ci0KLSAgIGluZm9fcHRyLT5mcmVlX21lIHw9IFBOR19GUkVFX1BMVEU7Ci0KLSAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19QTFRFOwotfQotCi0jaWZkZWYgUE5HX3NCSVRfU1VQUE9SVEVECi12b2lkIFBOR0FQSQotcG5nX3NldF9zQklUKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ19jb2xvcl84cCBzaWdfYml0KQotewotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJzQklUIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgcG5nX21lbWNweSgmKGluZm9fcHRyLT5zaWdfYml0KSwgc2lnX2JpdCwgcG5nX3NpemVvZihwbmdfY29sb3JfOCkpOwotICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX3NCSVQ7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19zUkdCX1NVUFBPUlRFRAotdm9pZCBQTkdBUEkKLXBuZ19zZXRfc1JHQihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIGludCBpbnRlbnQpCi17Ci0gICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInNSR0IiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBpbmZvX3B0ci0+c3JnYl9pbnRlbnQgPSAocG5nX2J5dGUpaW50ZW50OwotICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX3NSR0I7Ci19Ci0KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3NSR0JfZ0FNQV9hbmRfY0hSTShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBpbnQgaW50ZW50KQotewotI2lmZGVmIFBOR19nQU1BX1NVUFBPUlRFRAotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgIGZsb2F0IGZpbGVfZ2FtbWE7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi0gICBwbmdfZml4ZWRfcG9pbnQgaW50X2ZpbGVfZ2FtbWE7Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIFBOR19jSFJNX1NVUFBPUlRFRAotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgIGZsb2F0IHdoaXRlX3gsIHdoaXRlX3ksIHJlZF94LCByZWRfeSwgZ3JlZW5feCwgZ3JlZW5feSwgYmx1ZV94LCBibHVlX3k7Ci0jZW5kaWYKLSAgIHBuZ19maXhlZF9wb2ludCBpbnRfd2hpdGVfeCwgaW50X3doaXRlX3ksIGludF9yZWRfeCwgaW50X3JlZF95LCBpbnRfZ3JlZW5feCwKLSAgICAgIGludF9ncmVlbl95LCBpbnRfYmx1ZV94LCBpbnRfYmx1ZV95OwotI2VuZGlmCi0gICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInNSR0JfZ0FNQV9hbmRfY0hSTSIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIHBuZ19zZXRfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgaW50ZW50KTsKLQotI2lmZGVmIFBOR19nQU1BX1NVUFBPUlRFRAotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgIGZpbGVfZ2FtbWEgPSAoZmxvYXQpLjQ1NDU1OwotICAgcG5nX3NldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCBmaWxlX2dhbW1hKTsKLSNlbmRpZgotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLSAgIGludF9maWxlX2dhbW1hID0gNDU0NTVMOwotICAgcG5nX3NldF9nQU1BX2ZpeGVkKHBuZ19wdHIsIGluZm9fcHRyLCBpbnRfZmlsZV9nYW1tYSk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgUE5HX2NIUk1fU1VQUE9SVEVECi0gICBpbnRfd2hpdGVfeCA9IDMxMjcwTDsKLSAgIGludF93aGl0ZV95ID0gMzI5MDBMOwotICAgaW50X3JlZF94ICAgPSA2NDAwMEw7Ci0gICBpbnRfcmVkX3kgICA9IDMzMDAwTDsKLSAgIGludF9ncmVlbl94ID0gMzAwMDBMOwotICAgaW50X2dyZWVuX3kgPSA2MDAwMEw7Ci0gICBpbnRfYmx1ZV94ICA9IDE1MDAwTDsKLSAgIGludF9ibHVlX3kgID0gIDYwMDBMOwotCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgd2hpdGVfeCA9IChmbG9hdCkuMzEyNzsKLSAgIHdoaXRlX3kgPSAoZmxvYXQpLjMyOTA7Ci0gICByZWRfeCAgID0gKGZsb2F0KS42NDsKLSAgIHJlZF95ICAgPSAoZmxvYXQpLjMzOwotICAgZ3JlZW5feCA9IChmbG9hdCkuMzA7Ci0gICBncmVlbl95ID0gKGZsb2F0KS42MDsKLSAgIGJsdWVfeCAgPSAoZmxvYXQpLjE1OwotICAgYmx1ZV95ICA9IChmbG9hdCkuMDY7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLSAgIHBuZ19zZXRfY0hSTV9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAgICBpbnRfd2hpdGVfeCwgaW50X3doaXRlX3ksIGludF9yZWRfeCwgaW50X3JlZF95LCBpbnRfZ3JlZW5feCwKLSAgICAgICBpbnRfZ3JlZW5feSwgaW50X2JsdWVfeCwgaW50X2JsdWVfeSk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICBwbmdfc2V0X2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgd2hpdGVfeCwgd2hpdGVfeSwgcmVkX3gsIHJlZF95LCBncmVlbl94LCBncmVlbl95LCBibHVlX3gsIGJsdWVfeSk7Ci0jZW5kaWYKLSNlbmRpZiAvKiBjSFJNICovCi19Ci0jZW5kaWYgLyogc1JHQiAqLwotCi0KLSNpZmRlZiBQTkdfaUNDUF9TVVBQT1JURUQKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2lDQ1AocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgICAgICAgICAgIHBuZ19jaGFycCBuYW1lLCBpbnQgY29tcHJlc3Npb25fdHlwZSwKLSAgICAgICAgICAgICBwbmdfY2hhcnAgcHJvZmlsZSwgcG5nX3VpbnRfMzIgcHJvZmxlbikKLXsKLSAgIHBuZ19jaGFycCBuZXdfaWNjcF9uYW1lOwotICAgcG5nX2NoYXJwIG5ld19pY2NwX3Byb2ZpbGU7Ci0gICBwbmdfdWludF8zMiBsZW5ndGg7Ci0KLSAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAiaUNDUCIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMIHx8IHByb2ZpbGUgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgbGVuZ3RoID0gcG5nX3N0cmxlbihuYW1lKSsxOwotICAgbmV3X2ljY3BfbmFtZSA9IChwbmdfY2hhcnApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICBpZiAobmV3X2ljY3BfbmFtZSA9PSBOVUxMKQotICAgewotICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBwcm9jZXNzIGlDQ1AgY2h1bmsiKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIHBuZ19tZW1jcHkobmV3X2ljY3BfbmFtZSwgbmFtZSwgbGVuZ3RoKTsKLSAgIG5ld19pY2NwX3Byb2ZpbGUgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBwcm9mbGVuKTsKLSAgIGlmIChuZXdfaWNjcF9wcm9maWxlID09IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfZnJlZSAocG5nX3B0ciwgbmV3X2ljY3BfbmFtZSk7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIHByb2Nlc3MgaUNDUCBwcm9maWxlIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBwbmdfbWVtY3B5KG5ld19pY2NwX3Byb2ZpbGUsIHByb2ZpbGUsIChwbmdfc2l6ZV90KXByb2ZsZW4pOwotCi0gICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9JQ0NQLCAwKTsKLQotICAgaW5mb19wdHItPmljY3BfcHJvZmxlbiA9IHByb2ZsZW47Ci0gICBpbmZvX3B0ci0+aWNjcF9uYW1lID0gbmV3X2ljY3BfbmFtZTsKLSAgIGluZm9fcHRyLT5pY2NwX3Byb2ZpbGUgPSBuZXdfaWNjcF9wcm9maWxlOwotICAgLyogQ29tcHJlc3Npb24gaXMgYWx3YXlzIHplcm8gYnV0IGlzIGhlcmUgc28gdGhlIEFQSSBhbmQgaW5mbyBzdHJ1Y3R1cmUKLSAgICAqIGRvZXMgbm90IGhhdmUgdG8gY2hhbmdlIGlmIHdlIGludHJvZHVjZSBtdWx0aXBsZSBjb21wcmVzc2lvbiB0eXBlcwotICAgICovCi0gICBpbmZvX3B0ci0+aWNjcF9jb21wcmVzc2lvbiA9IChwbmdfYnl0ZSljb21wcmVzc2lvbl90eXBlOwotICAgaW5mb19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfSUNDUDsKLSAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19pQ0NQOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3RleHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdGV4dHAgdGV4dF9wdHIsCi0gICAgICAgICAgICAgaW50IG51bV90ZXh0KQotewotICAgaW50IHJldDsKLSAgIHJldCA9IHBuZ19zZXRfdGV4dF8yKHBuZ19wdHIsIGluZm9fcHRyLCB0ZXh0X3B0ciwgbnVtX3RleHQpOwotICAgaWYgKHJldCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBzdG9yZSB0ZXh0Iik7Ci19Ci0KLWludCAvKiBQUklWQVRFICovCi1wbmdfc2V0X3RleHRfMihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ190ZXh0cCB0ZXh0X3B0ciwKLSAgICAgICAgICAgICAgIGludCBudW1fdGV4dCkKLXsKLSAgIGludCBpOwotCi0gICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgKChwbmdfcHRyID09IE5VTEwgfHwKLSAgICAgIHBuZ19wdHItPmNodW5rX25hbWVbMF0gPT0gJ1wwJykgPwotICAgICAgInRleHQiIDogKHBuZ19jb25zdF9jaGFycClwbmdfcHRyLT5jaHVua19uYW1lKSk7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCB8fCBudW1fdGV4dCA9PSAwKQotICAgICAgcmV0dXJuKDApOwotCi0gICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgaW4gdGhlICJ0ZXh0IiBhcnJheSBpbiBpbmZvX3N0cnVjdAotICAgICogdG8gaG9sZCBhbGwgb2YgdGhlIGluY29taW5nIHRleHRfcHRyIG9iamVjdHMuCi0gICAgKi8KLSAgIGlmIChpbmZvX3B0ci0+bnVtX3RleHQgKyBudW1fdGV4dCA+IGluZm9fcHRyLT5tYXhfdGV4dCkKLSAgIHsKLSAgICAgIGludCBvbGRfbWF4X3RleHQgPSBpbmZvX3B0ci0+bWF4X3RleHQ7Ci0gICAgICBpbnQgb2xkX251bV90ZXh0ID0gaW5mb19wdHItPm51bV90ZXh0OwotCi0gICAgICBpZiAoaW5mb19wdHItPnRleHQgIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIHBuZ190ZXh0cCBvbGRfdGV4dDsKLQotICAgICAgICAgaW5mb19wdHItPm1heF90ZXh0ID0gaW5mb19wdHItPm51bV90ZXh0ICsgbnVtX3RleHQgKyA4OwotICAgICAgICAgb2xkX3RleHQgPSBpbmZvX3B0ci0+dGV4dDsKLQotICAgICAgICAgaW5mb19wdHItPnRleHQgPSAocG5nX3RleHRwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLAotICAgICAgICAgICAgKHBuZ19zaXplX3QpKGluZm9fcHRyLT5tYXhfdGV4dCAqIHBuZ19zaXplb2YocG5nX3RleHQpKSk7Ci0gICAgICAgICBpZiAoaW5mb19wdHItPnRleHQgPT0gTlVMTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIFJlc3RvcmUgdG8gcHJldmlvdXMgY29uZGl0aW9uICovCi0gICAgICAgICAgICBpbmZvX3B0ci0+bWF4X3RleHQgPSBvbGRfbWF4X3RleHQ7Ci0gICAgICAgICAgICBpbmZvX3B0ci0+dGV4dCA9IG9sZF90ZXh0OwotICAgICAgICAgICAgcmV0dXJuKDEpOwotICAgICAgICAgfQotICAgICAgICAgcG5nX21lbWNweShpbmZvX3B0ci0+dGV4dCwgb2xkX3RleHQsIChwbmdfc2l6ZV90KShvbGRfbWF4X3RleHQgKgotICAgICAgICAgICAgcG5nX3NpemVvZihwbmdfdGV4dCkpKTsKLSAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIG9sZF90ZXh0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGluZm9fcHRyLT5tYXhfdGV4dCA9IG51bV90ZXh0ICsgODsKLSAgICAgICAgIGluZm9fcHRyLT5udW1fdGV4dCA9IDA7Ci0gICAgICAgICBpbmZvX3B0ci0+dGV4dCA9IChwbmdfdGV4dHApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCi0gICAgICAgICAgICAocG5nX3NpemVfdCkoaW5mb19wdHItPm1heF90ZXh0ICogcG5nX3NpemVvZihwbmdfdGV4dCkpKTsKLSAgICAgICAgIGlmIChpbmZvX3B0ci0+dGV4dCA9PSBOVUxMKQotICAgICAgICAgewotICAgICAgICAgICAgLyogUmVzdG9yZSB0byBwcmV2aW91cyBjb25kaXRpb24gKi8KLSAgICAgICAgICAgIGluZm9fcHRyLT5udW1fdGV4dCA9IG9sZF9udW1fdGV4dDsKLSAgICAgICAgICAgIGluZm9fcHRyLT5tYXhfdGV4dCA9IG9sZF9tYXhfdGV4dDsKLSAgICAgICAgICAgIHJldHVybigxKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGluZm9fcHRyLT5mcmVlX21lIHw9IFBOR19GUkVFX1RFWFQ7Ci0gICAgICB9Ci0gICAgICBwbmdfZGVidWcxKDMsICJhbGxvY2F0ZWQgJWQgZW50cmllcyBmb3IgaW5mb19wdHItPnRleHQiLAotICAgICAgICAgaW5mb19wdHItPm1heF90ZXh0KTsKLSAgIH0KLSAgIGZvciAoaSA9IDA7IGkgPCBudW1fdGV4dDsgaSsrKQotICAgewotICAgICAgcG5nX3NpemVfdCB0ZXh0X2xlbmd0aCwga2V5X2xlbjsKLSAgICAgIHBuZ19zaXplX3QgbGFuZ19sZW4sIGxhbmdfa2V5X2xlbjsKLSAgICAgIHBuZ190ZXh0cCB0ZXh0cCA9ICYoaW5mb19wdHItPnRleHRbaW5mb19wdHItPm51bV90ZXh0XSk7Ci0KLSAgICAgIGlmICh0ZXh0X3B0cltpXS5rZXkgPT0gTlVMTCkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKHRleHRfcHRyW2ldLmNvbXByZXNzaW9uIDwgUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORSB8fAotICAgICAgICAgIHRleHRfcHRyW2ldLmNvbXByZXNzaW9uID49IFBOR19URVhUX0NPTVBSRVNTSU9OX0xBU1QpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAidGV4dCBjb21wcmVzc2lvbiBtb2RlIGlzIG91dCBvZiByYW5nZSIpOwotICAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGtleV9sZW4gPSBwbmdfc3RybGVuKHRleHRfcHRyW2ldLmtleSk7Ci0KLSAgICAgIGlmICh0ZXh0X3B0cltpXS5jb21wcmVzc2lvbiA8PSAwKQotICAgICAgewotICAgICAgICAgbGFuZ19sZW4gPSAwOwotICAgICAgICAgbGFuZ19rZXlfbGVuID0gMDsKLSAgICAgIH0KLQotICAgICAgZWxzZQotI2lmZGVmIFBOR19pVFh0X1NVUFBPUlRFRAotICAgICAgewotICAgICAgICAgLyogU2V0IGlUWHQgZGF0YSAqLwotCi0gICAgICAgICBpZiAodGV4dF9wdHJbaV0ubGFuZyAhPSBOVUxMKQotICAgICAgICAgICAgbGFuZ19sZW4gPSBwbmdfc3RybGVuKHRleHRfcHRyW2ldLmxhbmcpOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgbGFuZ19sZW4gPSAwOwotICAgICAgICAgaWYgKHRleHRfcHRyW2ldLmxhbmdfa2V5ICE9IE5VTEwpCi0gICAgICAgICAgICBsYW5nX2tleV9sZW4gPSBwbmdfc3RybGVuKHRleHRfcHRyW2ldLmxhbmdfa2V5KTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxhbmdfa2V5X2xlbiA9IDA7Ci0gICAgICB9Ci0jZWxzZSAvKiBQTkdfaVRYdF9TVVBQT1JURUQgKi8KLSAgICAgIHsKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJpVFh0IGNodW5rIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIGlmICh0ZXh0X3B0cltpXS50ZXh0ID09IE5VTEwgfHwgdGV4dF9wdHJbaV0udGV4dFswXSA9PSAnXDAnKQotICAgICAgewotICAgICAgICAgdGV4dF9sZW5ndGggPSAwOwotI2lmZGVmIFBOR19pVFh0X1NVUFBPUlRFRAotICAgICAgICAgaWYgKHRleHRfcHRyW2ldLmNvbXByZXNzaW9uID4gMCkKLSAgICAgICAgICAgIHRleHRwLT5jb21wcmVzc2lvbiA9IFBOR19JVFhUX0NPTVBSRVNTSU9OX05PTkU7Ci0gICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgIHRleHRwLT5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIHRleHRfbGVuZ3RoID0gcG5nX3N0cmxlbih0ZXh0X3B0cltpXS50ZXh0KTsKLSAgICAgICAgIHRleHRwLT5jb21wcmVzc2lvbiA9IHRleHRfcHRyW2ldLmNvbXByZXNzaW9uOwotICAgICAgfQotCi0gICAgICB0ZXh0cC0+a2V5ID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKLSAgICAgICAgIChwbmdfc2l6ZV90KQotICAgICAgICAgKGtleV9sZW4gKyB0ZXh0X2xlbmd0aCArIGxhbmdfbGVuICsgbGFuZ19rZXlfbGVuICsgNCkpOwotICAgICAgaWYgKHRleHRwLT5rZXkgPT0gTlVMTCkKLSAgICAgICAgIHJldHVybigxKTsKLSAgICAgIHBuZ19kZWJ1ZzIoMiwgIkFsbG9jYXRlZCAlbHUgYnl0ZXMgYXQgJXggaW4gcG5nX3NldF90ZXh0IiwKLSAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKHBuZ191aW50XzMyKQotICAgICAgICAgICAgICAgICAoa2V5X2xlbiArIGxhbmdfbGVuICsgbGFuZ19rZXlfbGVuICsgdGV4dF9sZW5ndGggKyA0KSwKLSAgICAgICAgICAgICAgICAgKGludCl0ZXh0cC0+a2V5KTsKLQotICAgICAgcG5nX21lbWNweSh0ZXh0cC0+a2V5LCB0ZXh0X3B0cltpXS5rZXksKHBuZ19zaXplX3QpKGtleV9sZW4pKTsKLSAgICAgICoodGV4dHAtPmtleSArIGtleV9sZW4pID0gJ1wwJzsKLSNpZmRlZiBQTkdfaVRYdF9TVVBQT1JURUQKLSAgICAgIGlmICh0ZXh0X3B0cltpXS5jb21wcmVzc2lvbiA+IDApCi0gICAgICB7Ci0gICAgICAgICB0ZXh0cC0+bGFuZyA9IHRleHRwLT5rZXkgKyBrZXlfbGVuICsgMTsKLSAgICAgICAgIHBuZ19tZW1jcHkodGV4dHAtPmxhbmcsIHRleHRfcHRyW2ldLmxhbmcsIGxhbmdfbGVuKTsKLSAgICAgICAgICoodGV4dHAtPmxhbmcgKyBsYW5nX2xlbikgPSAnXDAnOwotICAgICAgICAgdGV4dHAtPmxhbmdfa2V5ID0gdGV4dHAtPmxhbmcgKyBsYW5nX2xlbiArIDE7Ci0gICAgICAgICBwbmdfbWVtY3B5KHRleHRwLT5sYW5nX2tleSwgdGV4dF9wdHJbaV0ubGFuZ19rZXksIGxhbmdfa2V5X2xlbik7Ci0gICAgICAgICAqKHRleHRwLT5sYW5nX2tleSArIGxhbmdfa2V5X2xlbikgPSAnXDAnOwotICAgICAgICAgdGV4dHAtPnRleHQgPSB0ZXh0cC0+bGFuZ19rZXkgKyBsYW5nX2tleV9sZW4gKyAxOwotICAgICAgfQotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICB7Ci0jaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECi0gICAgICAgICB0ZXh0cC0+bGFuZz1OVUxMOwotICAgICAgICAgdGV4dHAtPmxhbmdfa2V5PU5VTEw7Ci0jZW5kaWYKLSAgICAgICAgIHRleHRwLT50ZXh0ID0gdGV4dHAtPmtleSArIGtleV9sZW4gKyAxOwotICAgICAgfQotICAgICAgaWYgKHRleHRfbGVuZ3RoKQotICAgICAgICAgcG5nX21lbWNweSh0ZXh0cC0+dGV4dCwgdGV4dF9wdHJbaV0udGV4dCwKLSAgICAgICAgICAgIChwbmdfc2l6ZV90KSh0ZXh0X2xlbmd0aCkpOwotICAgICAgKih0ZXh0cC0+dGV4dCArIHRleHRfbGVuZ3RoKSA9ICdcMCc7Ci0KLSNpZmRlZiBQTkdfaVRYdF9TVVBQT1JURUQKLSAgICAgIGlmICh0ZXh0cC0+Y29tcHJlc3Npb24gPiAwKQotICAgICAgewotICAgICAgICAgdGV4dHAtPnRleHRfbGVuZ3RoID0gMDsKLSAgICAgICAgIHRleHRwLT5pdHh0X2xlbmd0aCA9IHRleHRfbGVuZ3RoOwotICAgICAgfQotICAgICAgZWxzZQotI2VuZGlmCi0KLSAgICAgIHsKLSAgICAgICAgIHRleHRwLT50ZXh0X2xlbmd0aCA9IHRleHRfbGVuZ3RoOwotI2lmZGVmIFBOR19pVFh0X1NVUFBPUlRFRAotICAgICAgICAgdGV4dHAtPml0eHRfbGVuZ3RoID0gMDsKLSNlbmRpZgotICAgICAgfQotICAgICAgaW5mb19wdHItPm51bV90ZXh0Kys7Ci0gICAgICBwbmdfZGVidWcxKDMsICJ0cmFuc2ZlcnJlZCB0ZXh0IGNodW5rICVkIiwgaW5mb19wdHItPm51bV90ZXh0KTsKLSAgIH0KLSAgIHJldHVybigwKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX3RJTUVfU1VQUE9SVEVECi12b2lkIFBOR0FQSQotcG5nX3NldF90SU1FKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3RpbWVwIG1vZF90aW1lKQotewotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJ0SU1FIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCB8fAotICAgICAgIChwbmdfcHRyLT5tb2RlICYgUE5HX1dST1RFX3RJTUUpKQotICAgICAgcmV0dXJuOwotCi0gICBwbmdfbWVtY3B5KCYoaW5mb19wdHItPm1vZF90aW1lKSwgbW9kX3RpbWUsIHBuZ19zaXplb2YocG5nX3RpbWUpKTsKLSAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT190SU1FOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfdFJOU19TVVBQT1JURUQKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3RSTlMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX2J5dGVwIHRyYW5zX2FscGhhLCBpbnQgbnVtX3RyYW5zLCBwbmdfY29sb3JfMTZwIHRyYW5zX2NvbG9yKQotewotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJ0Uk5TIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgaWYgKHRyYW5zX2FscGhhICE9IE5VTEwpCi0gICB7Ci0gICAgICAgLyogSXQgbWF5IG5vdCBhY3R1YWxseSBiZSBuZWNlc3NhcnkgdG8gc2V0IHBuZ19wdHItPnRyYW5zX2FscGhhIGhlcmU7Ci0gICAgICAgICogd2UgZG8gaXQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgd2F5IHRoZSBwbmdfaGFuZGxlX3RSTlMKLSAgICAgICAgKiBmdW5jdGlvbiB1c2VkIHRvIGRvIHRoZSBhbGxvY2F0aW9uLgotICAgICAgICAqLwotCi0gICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfVFJOUywgMCk7Ci0KLSAgICAgICAvKiBDaGFuZ2VkIGZyb20gbnVtX3RyYW5zIHRvIFBOR19NQVhfUEFMRVRURV9MRU5HVEggaW4gdmVyc2lvbiAxLjIuMSAqLwotICAgICAgIHBuZ19wdHItPnRyYW5zX2FscGhhID0gaW5mb19wdHItPnRyYW5zX2FscGhhID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAgIChwbmdfc2l6ZV90KVBOR19NQVhfUEFMRVRURV9MRU5HVEgpOwotICAgICAgIGlmIChudW1fdHJhbnMgPiAwICYmIG51bV90cmFucyA8PSBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIKQotICAgICAgICAgIHBuZ19tZW1jcHkoaW5mb19wdHItPnRyYW5zX2FscGhhLCB0cmFuc19hbHBoYSwgKHBuZ19zaXplX3QpbnVtX3RyYW5zKTsKLSAgIH0KLQotICAgaWYgKHRyYW5zX2NvbG9yICE9IE5VTEwpCi0gICB7Ci0gICAgICBpbnQgc2FtcGxlX21heCA9ICgxIDw8IGluZm9fcHRyLT5iaXRfZGVwdGgpOwotICAgICAgaWYgKChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmCi0gICAgICAgICAgKGludCl0cmFuc19jb2xvci0+Z3JheSA+IHNhbXBsZV9tYXgpIHx8Ci0gICAgICAgICAgKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiAmJgotICAgICAgICAgICgoaW50KXRyYW5zX2NvbG9yLT5yZWQgPiBzYW1wbGVfbWF4IHx8Ci0gICAgICAgICAgKGludCl0cmFuc19jb2xvci0+Z3JlZW4gPiBzYW1wbGVfbWF4IHx8Ci0gICAgICAgICAgKGludCl0cmFuc19jb2xvci0+Ymx1ZSA+IHNhbXBsZV9tYXgpKSkKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAgICAidFJOUyBjaHVuayBoYXMgb3V0LW9mLXJhbmdlIHNhbXBsZXMgZm9yIGJpdF9kZXB0aCIpOwotICAgICAgcG5nX21lbWNweSgmKGluZm9fcHRyLT50cmFuc19jb2xvciksIHRyYW5zX2NvbG9yLAotICAgICAgICAgcG5nX3NpemVvZihwbmdfY29sb3JfMTYpKTsKLSAgICAgIGlmIChudW1fdHJhbnMgPT0gMCkKLSAgICAgICAgIG51bV90cmFucyA9IDE7Ci0gICB9Ci0KLSAgIGluZm9fcHRyLT5udW1fdHJhbnMgPSAocG5nX3VpbnRfMTYpbnVtX3RyYW5zOwotICAgaWYgKG51bV90cmFucyAhPSAwKQotICAgewotICAgICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX3RSTlM7Ci0gICAgICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9UUk5TOwotICAgfQotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfc1BMVF9TVVBQT1JURUQKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3NQTFQocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICAgICAgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19zUExUX3RwIGVudHJpZXMsIGludCBuZW50cmllcykKLS8qCi0gKiAgZW50cmllcyAgICAgICAgLSBhcnJheSBvZiBwbmdfc1BMVF90IHN0cnVjdHVyZXMKLSAqICAgICAgICAgICAgICAgICAgIHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHBhbGV0dGVzCi0gKiAgICAgICAgICAgICAgICAgICBpbiB0aGUgaW5mbyBzdHJ1Y3R1cmUuCi0gKiAgbmVudHJpZXMgICAgICAgLSBudW1iZXIgb2YgcGFsZXR0ZSBzdHJ1Y3R1cmVzIHRvIGJlCi0gKiAgICAgICAgICAgICAgICAgICBhZGRlZC4KLSAqLwotewotICAgcG5nX3NQTFRfdHAgbnA7Ci0gICBpbnQgaTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBucCA9IChwbmdfc1BMVF90cClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKLSAgICAgICAoaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNfbnVtICsgbmVudHJpZXMpICoKLSAgICAgICAgKHBuZ19zaXplX3QpcG5nX3NpemVvZihwbmdfc1BMVF90KSk7Ci0gICBpZiAobnAgPT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJObyBtZW1vcnkgZm9yIHNQTFQgcGFsZXR0ZXMiKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX21lbWNweShucCwgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXMsCi0gICAgICAgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNfbnVtICogcG5nX3NpemVvZihwbmdfc1BMVF90KSk7Ci0gICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+c3BsdF9wYWxldHRlcyk7Ci0gICBpbmZvX3B0ci0+c3BsdF9wYWxldHRlcz1OVUxMOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgbmVudHJpZXM7IGkrKykKLSAgIHsKLSAgICAgIHBuZ19zUExUX3RwIHRvID0gbnAgKyBpbmZvX3B0ci0+c3BsdF9wYWxldHRlc19udW0gKyBpOwotICAgICAgcG5nX3NQTFRfdHAgZnJvbSA9IGVudHJpZXMgKyBpOwotICAgICAgcG5nX3VpbnRfMzIgbGVuZ3RoOwotCi0gICAgICBsZW5ndGggPSBwbmdfc3RybGVuKGZyb20tPm5hbWUpICsgMTsKLSAgICAgIHRvLT5uYW1lID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgKHBuZ19zaXplX3QpbGVuZ3RoKTsKLSAgICAgIGlmICh0by0+bmFtZSA9PSBOVUxMKQotICAgICAgewotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgICAgIk91dCBvZiBtZW1vcnkgd2hpbGUgcHJvY2Vzc2luZyBzUExUIGNodW5rIik7Ci0gICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIHBuZ19tZW1jcHkodG8tPm5hbWUsIGZyb20tPm5hbWUsIGxlbmd0aCk7Ci0gICAgICB0by0+ZW50cmllcyA9IChwbmdfc1BMVF9lbnRyeXApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCi0gICAgICAgICAgKHBuZ19zaXplX3QpKGZyb20tPm5lbnRyaWVzICogcG5nX3NpemVvZihwbmdfc1BMVF9lbnRyeSkpKTsKLSAgICAgIGlmICh0by0+ZW50cmllcyA9PSBOVUxMKQotICAgICAgewotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgICAgIk91dCBvZiBtZW1vcnkgd2hpbGUgcHJvY2Vzc2luZyBzUExUIGNodW5rIik7Ci0gICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCB0by0+bmFtZSk7Ci0gICAgICAgICB0by0+bmFtZSA9IE5VTEw7Ci0gICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIHBuZ19tZW1jcHkodG8tPmVudHJpZXMsIGZyb20tPmVudHJpZXMsCi0gICAgICAgICAgZnJvbS0+bmVudHJpZXMgKiBwbmdfc2l6ZW9mKHBuZ19zUExUX2VudHJ5KSk7Ci0gICAgICB0by0+bmVudHJpZXMgPSBmcm9tLT5uZW50cmllczsKLSAgICAgIHRvLT5kZXB0aCA9IGZyb20tPmRlcHRoOwotICAgfQotCi0gICBpbmZvX3B0ci0+c3BsdF9wYWxldHRlcyA9IG5wOwotICAgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNfbnVtICs9IG5lbnRyaWVzOwotICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX3NQTFQ7Ci0gICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9TUExUOwotfQotI2VuZGlmIC8qIFBOR19zUExUX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAotdm9pZCBQTkdBUEkKLXBuZ19zZXRfdW5rbm93bl9jaHVua3MocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3Vua25vd25fY2h1bmtwIHVua25vd25zLCBpbnQgbnVtX3Vua25vd25zKQotewotICAgcG5nX3Vua25vd25fY2h1bmtwIG5wOwotICAgaW50IGk7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCB8fCBudW1fdW5rbm93bnMgPT0gMCkKLSAgICAgIHJldHVybjsKLQotICAgbnAgPSAocG5nX3Vua25vd25fY2h1bmtwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLAotICAgICAgIChwbmdfc2l6ZV90KSgoaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSArIG51bV91bmtub3ducykgKgotICAgICAgIHBuZ19zaXplb2YocG5nX3Vua25vd25fY2h1bmspKSk7Ci0gICBpZiAobnAgPT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAgIk91dCBvZiBtZW1vcnkgd2hpbGUgcHJvY2Vzc2luZyB1bmtub3duIGNodW5rIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIHBuZ19tZW1jcHkobnAsIGluZm9fcHRyLT51bmtub3duX2NodW5rcywKLSAgICAgICBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtICogcG5nX3NpemVvZihwbmdfdW5rbm93bl9jaHVuaykpOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnVua25vd25fY2h1bmtzKTsKLSAgIGluZm9fcHRyLT51bmtub3duX2NodW5rcyA9IE5VTEw7Ci0KLSAgIGZvciAoaSA9IDA7IGkgPCBudW1fdW5rbm93bnM7IGkrKykKLSAgIHsKLSAgICAgIHBuZ191bmtub3duX2NodW5rcCB0byA9IG5wICsgaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSArIGk7Ci0gICAgICBwbmdfdW5rbm93bl9jaHVua3AgZnJvbSA9IHVua25vd25zICsgaTsKLQotICAgICAgcG5nX21lbWNweSgocG5nX2NoYXJwKXRvLT5uYW1lLCAocG5nX2NoYXJwKWZyb20tPm5hbWUsCi0gICAgICAgICAgcG5nX3NpemVvZihmcm9tLT5uYW1lKSk7Ci0gICAgICB0by0+bmFtZVtwbmdfc2l6ZW9mKHRvLT5uYW1lKS0xXSA9ICdcMCc7Ci0gICAgICB0by0+c2l6ZSA9IGZyb20tPnNpemU7Ci0gICAgICAvKiBOb3RlIG91ciBsb2NhdGlvbiBpbiB0aGUgcmVhZCBvciB3cml0ZSBzZXF1ZW5jZSAqLwotICAgICAgdG8tPmxvY2F0aW9uID0gKHBuZ19ieXRlKShwbmdfcHRyLT5tb2RlICYgMHhmZik7Ci0KLSAgICAgIGlmIChmcm9tLT5zaXplID09IDApCi0gICAgICAgICB0by0+ZGF0YT1OVUxMOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgdG8tPmRhdGEgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLAotICAgICAgICAgICAocG5nX3NpemVfdClmcm9tLT5zaXplKTsKLSAgICAgICAgIGlmICh0by0+ZGF0YSA9PSBOVUxMKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgICAgICAiT3V0IG9mIG1lbW9yeSB3aGlsZSBwcm9jZXNzaW5nIHVua25vd24gY2h1bmsiKTsKLSAgICAgICAgICAgIHRvLT5zaXplID0gMDsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBuZ19tZW1jcHkodG8tPmRhdGEsIGZyb20tPmRhdGEsIGZyb20tPnNpemUpOwotICAgICAgfQotICAgfQotCi0gICBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3MgPSBucDsKLSAgIGluZm9fcHRyLT51bmtub3duX2NodW5rc19udW0gKz0gbnVtX3Vua25vd25zOwotICAgaW5mb19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfVU5LTjsKLX0KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgaW50IGNodW5rLCBpbnQgbG9jYXRpb24pCi17Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgY2h1bmsgPj0gMCAmJiBjaHVuayA8Ci0gICAgICAgKGludClpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtKQotICAgICAgaW5mb19wdHItPnVua25vd25fY2h1bmtzW2NodW5rXS5sb2NhdGlvbiA9IChwbmdfYnl0ZSlsb2NhdGlvbjsKLX0KLSNlbmRpZgotCi0KLSNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfcGVybWl0X21uZ19mZWF0dXJlcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiBtbmdfZmVhdHVyZXMpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm4gKHBuZ191aW50XzMyKTA7Ci0gICBwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkID0KLSAgICAgKHBuZ19ieXRlKShtbmdfZmVhdHVyZXMgJiBQTkdfQUxMX01OR19GRUFUVVJFUyk7Ci0gICByZXR1cm4gKHBuZ191aW50XzMyKXBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQ7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IGtlZXAsIHBuZ19ieXRlcAotICAgY2h1bmtfbGlzdCwgaW50IG51bV9jaHVua3MpCi17Ci0gICBwbmdfYnl0ZXAgbmV3X2xpc3QsIHA7Ci0gICBpbnQgaSwgb2xkX251bV9jaHVua3M7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgaWYgKG51bV9jaHVua3MgPT0gMCkKLSAgIHsKLSAgICAgIGlmIChrZWVwID09IFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTIHx8IGtlZXAgPT0gUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFKQotICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfS0VFUF9VTktOT1dOX0NIVU5LUzsKLSAgICAgIGVsc2UKLSAgICAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19LRUVQX1VOS05PV05fQ0hVTktTOwotCi0gICAgICBpZiAoa2VlcCA9PSBQTkdfSEFORExFX0NIVU5LX0FMV0FZUykKLSAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0tFRVBfVU5TQUZFX0NIVU5LUzsKLSAgICAgIGVsc2UKLSAgICAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19LRUVQX1VOU0FGRV9DSFVOS1M7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBpZiAoY2h1bmtfbGlzdCA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgb2xkX251bV9jaHVua3MgPSBwbmdfcHRyLT5udW1fY2h1bmtfbGlzdDsKLSAgIG5ld19saXN0PShwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgKHBuZ19zaXplX3QpCi0gICAgICAgKDUqKG51bV9jaHVua3MgKyBvbGRfbnVtX2NodW5rcykpKTsKLSAgIGlmIChwbmdfcHRyLT5jaHVua19saXN0ICE9IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfbWVtY3B5KG5ld19saXN0LCBwbmdfcHRyLT5jaHVua19saXN0LAotICAgICAgICAgIChwbmdfc2l6ZV90KSg1Km9sZF9udW1fY2h1bmtzKSk7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19saXN0KTsKLSAgICAgIHBuZ19wdHItPmNodW5rX2xpc3Q9TlVMTDsKLSAgIH0KLSAgIHBuZ19tZW1jcHkobmV3X2xpc3QgKyA1Km9sZF9udW1fY2h1bmtzLCBjaHVua19saXN0LAotICAgICAgIChwbmdfc2l6ZV90KSg1Km51bV9jaHVua3MpKTsKLSAgIGZvciAocCA9IG5ld19saXN0ICsgNSpvbGRfbnVtX2NodW5rcyArIDQsIGkgPSAwOyBpPG51bV9jaHVua3M7IGkrKywgcCArPSA1KQotICAgICAgKnA9KHBuZ19ieXRlKWtlZXA7Ci0gICBwbmdfcHRyLT5udW1fY2h1bmtfbGlzdCA9IG9sZF9udW1fY2h1bmtzICsgbnVtX2NodW5rczsKLSAgIHBuZ19wdHItPmNodW5rX2xpc3QgPSBuZXdfbGlzdDsKLSAgIHBuZ19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfTElTVDsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECi12b2lkIFBOR0FQSQotcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIHVzZXJfY2h1bmtfcHRyLAotICAgcG5nX3VzZXJfY2h1bmtfcHRyIHJlYWRfdXNlcl9jaHVua19mbikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4iKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgcG5nX3B0ci0+cmVhZF91c2VyX2NodW5rX2ZuID0gcmVhZF91c2VyX2NodW5rX2ZuOwotICAgcG5nX3B0ci0+dXNlcl9jaHVua19wdHIgPSB1c2VyX2NodW5rX3B0cjsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVECi12b2lkIFBOR0FQSQotcG5nX3NldF9yb3dzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2J5dGVwcCByb3dfcG9pbnRlcnMpCi17Ci0gICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInJvd3MiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBpZiAoaW5mb19wdHItPnJvd19wb2ludGVycyAmJiAoaW5mb19wdHItPnJvd19wb2ludGVycyAhPSByb3dfcG9pbnRlcnMpKQotICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfUk9XUywgMCk7Ci0gICBpbmZvX3B0ci0+cm93X3BvaW50ZXJzID0gcm93X3BvaW50ZXJzOwotICAgaWYgKHJvd19wb2ludGVycykKLSAgICAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19JREFUOwotfQotI2VuZGlmCi0KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgcG5nX3NpemVfdCBzaXplKQotewotICAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICAgcmV0dXJuOwotICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnpidWYpOwotICAgIHBuZ19wdHItPnpidWZfc2l6ZSA9IHNpemU7Ci0gICAgcG5nX3B0ci0+emJ1ZiA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLCBzaXplKTsKLSAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKLSAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXBuZ19wdHItPnpidWZfc2l6ZTsKLX0KLQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfaW52YWxpZChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIGludCBtYXNrKQotewotICAgaWYgKHBuZ19wdHIgJiYgaW5mb19wdHIpCi0gICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gfm1hc2s7Ci19Ci0KLQotCi0jaWZkZWYgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKLS8qIFRoaXMgZnVuY3Rpb24gd2FzIGFkZGVkIHRvIGxpYnBuZyAxLjIuNiAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfdXNlcl9saW1pdHMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgdXNlcl93aWR0aF9tYXgsCi0gICAgcG5nX3VpbnRfMzIgdXNlcl9oZWlnaHRfbWF4KQotewotICAgLyogSW1hZ2VzIHdpdGggZGltZW5zaW9ucyBsYXJnZXIgdGhhbiB0aGVzZSBsaW1pdHMgd2lsbCBiZQotICAgICogcmVqZWN0ZWQgYnkgcG5nX3NldF9JSERSKCkuICBUbyBhY2NlcHQgYW55IFBORyBkYXRhc3RyZWFtCi0gICAgKiByZWdhcmRsZXNzIG9mIGRpbWVuc2lvbnMsIHNldCBib3RoIGxpbWl0cyB0byAweDdmZmZmZmZMLgotICAgICovCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3B0ci0+dXNlcl93aWR0aF9tYXggPSB1c2VyX3dpZHRoX21heDsKLSAgIHBuZ19wdHItPnVzZXJfaGVpZ2h0X21heCA9IHVzZXJfaGVpZ2h0X21heDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gbGlicG5nIDEuNC4wICovCi12b2lkIFBOR0FQSQotcG5nX3NldF9jaHVua19jYWNoZV9tYXgocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ191aW50XzMyIHVzZXJfY2h1bmtfY2FjaGVfbWF4KQotewotICAgIGlmIChwbmdfcHRyKQotICAgICAgIHBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID0gdXNlcl9jaHVua19jYWNoZV9tYXg7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gd2FzIGFkZGVkIHRvIGxpYnBuZyAxLjQuMSAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfY2h1bmtfbWFsbG9jX21heChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2FsbG9jX3NpemVfdCB1c2VyX2NodW5rX21hbGxvY19tYXgpCi17Ci0gICAgaWYgKHBuZ19wdHIpCi0gICAgICAgcG5nX3B0ci0+dXNlcl9jaHVua19tYWxsb2NfbWF4ID0KLSAgICAgICAgICAocG5nX3NpemVfdCl1c2VyX2NodW5rX21hbGxvY19tYXg7Ci19Ci0jZW5kaWYgLyogP1BOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVEICovCi0KLQotI2lmZGVmIFBOR19CRU5JR05fRVJST1JTX1NVUFBPUlRFRAotdm9pZCBQTkdBUEkKLXBuZ19zZXRfYmVuaWduX2Vycm9ycyhwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgYWxsb3dlZCkKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9iZW5pZ25fZXJyb3JzIik7Ci0KLSAgIGlmIChhbGxvd2VkKQotICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfQkVOSUdOX0VSUk9SU19XQVJOOwotICAgZWxzZQotICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0JFTklHTl9FUlJPUlNfV0FSTjsKLX0KLSNlbmRpZiAvKiBQTkdfQkVOSUdOX0VSUk9SU19TVVBQT1JURUQgKi8KLSNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgfHwgUE5HX1dSSVRFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9wbmd0ZXN0LmMgYi9zcmMvbGlicG5nL3BuZ3Rlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcwZjQ5My4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3BuZ3Rlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MDUgKzAsMCBAQAotCi0vKiBwbmd0ZXN0LmMgLSBhIHNpbXBsZSB0ZXN0IHByb2dyYW0gdG8gdGVzdCBsaWJwbmcKLSAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNC44IFtKdWx5IDcsIDIwMTFdCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQotICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQotICoKLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0gKiBhbmQgbGljZW5zZSBpbiBwbmcuaAotICoKLSAqIFRoaXMgcHJvZ3JhbSByZWFkcyBpbiBhIFBORyBpbWFnZSwgd3JpdGVzIGl0IG91dCBhZ2FpbiwgYW5kIHRoZW4KLSAqIGNvbXBhcmVzIHRoZSB0d28gZmlsZXMuICBJZiB0aGUgZmlsZXMgYXJlIGlkZW50aWNhbCwgdGhpcyBzaG93cyB0aGF0Ci0gKiB0aGUgYmFzaWMgY2h1bmsgaGFuZGxpbmcsIGZpbHRlcmluZywgYW5kIChkZSljb21wcmVzc2lvbiBjb2RlIGlzIHdvcmtpbmcKLSAqIHByb3Blcmx5LiAgSXQgZG9lcyBub3QgY3VycmVudGx5IHRlc3QgYWxsIG9mIHRoZSB0cmFuc2Zvcm1zLCBhbHRob3VnaAotICogaXQgcHJvYmFibHkgc2hvdWxkLgotICoKLSAqIFRoZSBwcm9ncmFtIHdpbGwgcmVwb3J0ICJGQUlMIiBpbiBjZXJ0YWluIGxlZ2l0aW1hdGUgY2FzZXM6Ci0gKiAxKSB3aGVuIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBvciBmaWx0ZXIgc2VsZWN0aW9uIG1ldGhvZCBpcyBjaGFuZ2VkLgotICogMikgd2hlbiB0aGUgbWF4aW11bSBJREFUIHNpemUgKFBOR19aQlVGX1NJWkUgaW4gcG5nY29uZi5oKSBpcyBub3QgODE5Mi4KLSAqIDMpIHVua25vd24gdW5zYWZlLXRvLWNvcHkgYW5jaWxsYXJ5IGNodW5rcyBvciB1bmtub3duIGNyaXRpY2FsIGNodW5rcwotICogICAgZXhpc3QgaW4gdGhlIGlucHV0IGZpbGUuCi0gKiA0KSBvdGhlcnMgbm90IGxpc3RlZCBoZXJlLi4uCi0gKiBJbiB0aGVzZSBjYXNlcywgaXQgaXMgYmVzdCB0byBjaGVjayB3aXRoIGFub3RoZXIgdG9vbCBzdWNoIGFzICJwbmdjaGVjayIKLSAqIHRvIHNlZSB3aGF0IHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gZmlsZXMgYXJlLgotICoKLSAqIElmIGEgZmlsZW5hbWUgaXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQtbGluZSwgdGhlbiB0aGlzIGZpbGUgaXMgdXNlZAotICogZm9yIHRoZSBpbnB1dCwgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgInBuZ3Rlc3QucG5nIi4gIFRoaXMgYWxsb3dzCi0gKiB0ZXN0aW5nIGEgd2lkZSB2YXJpZXR5IG9mIGZpbGVzIGVhc2lseS4gIFlvdSBjYW4gYWxzbyB0ZXN0IGEgbnVtYmVyCi0gKiBvZiBmaWxlcyBhdCBvbmNlIGJ5IHR5cGluZyAicG5ndGVzdCAtbSBmaWxlMS5wbmcgZmlsZTIucG5nIC4uLiIKLSAqLwotCi0jaW5jbHVkZSAiemxpYi5oIgotI2luY2x1ZGUgInBuZy5oIgotCi0vKiBDb3BpZWQgZnJvbSBwbmdwcml2LmggYnV0IG9ubHkgdXNlZCBpbiBlcnJvciBtZXNzYWdlcyBiZWxvdy4gKi8KLSNpZm5kZWYgUE5HX1pCVUZfU0laRQotIyAgZGVmaW5lIFBOR19aQlVGX1NJWkUgODE5MgotI2VuZGlmCi0KLSMgIGluY2x1ZGUgPHN0ZGlvLmg+Ci0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgIGRlZmluZSBGQ0xPU0UoZmlsZSkgZmNsb3NlKGZpbGUpCi0KLSNpZm5kZWYgUE5HX1NURElPX1NVUFBPUlRFRAotICAgICB0eXBlZGVmIEZJTEUgICAgICAgICAgICAgICAgKiBwbmdfRklMRV9wOwotI2VuZGlmCi0KLS8qIE1ha2VzIHBuZ3Rlc3QgdmVyYm9zZSBzbyB3ZSBjYW4gZmluZCBwcm9ibGVtcyAobmVlZHMgdG8gYmUgYmVmb3JlIHBuZy5oKSAqLwotI2lmbmRlZiBQTkdfREVCVUcKLSMgIGRlZmluZSBQTkdfREVCVUcgMAotI2VuZGlmCi0KLSNpZiBQTkdfREVCVUcgPiAxCi0jICBkZWZpbmUgcG5ndGVzdF9kZWJ1ZyhtKSAgICAgICAgKCh2b2lkKWZwcmludGYoc3RkZXJyLCBtICJcbiIpKQotIyAgZGVmaW5lIHBuZ3Rlc3RfZGVidWcxKG0scDEpICAgICgodm9pZClmcHJpbnRmKHN0ZGVyciwgbSAiXG4iLCBwMSkpCi0jICBkZWZpbmUgcG5ndGVzdF9kZWJ1ZzIobSxwMSxwMikgKCh2b2lkKWZwcmludGYoc3RkZXJyLCBtICJcbiIsIHAxLCBwMikpCi0jZWxzZQotIyAgZGVmaW5lIHBuZ3Rlc3RfZGVidWcobSkgICAgICAgICgodm9pZCkwKQotIyAgZGVmaW5lIHBuZ3Rlc3RfZGVidWcxKG0scDEpICAgICgodm9pZCkwKQotIyAgZGVmaW5lIHBuZ3Rlc3RfZGVidWcyKG0scDEscDIpICgodm9pZCkwKQotI2VuZGlmCi0KLSNpZiAhUE5HX0RFQlVHCi0jICBkZWZpbmUgU0lOR0xFX1JPV0JVRl9BTExPQyAgLyogTWFrZXMgYnVmZmVyIG92ZXJydW5zIGVhc2llciB0byBuYWlsICovCi0jZW5kaWYKLQotLyogVHVybiBvbiBDUFUgdGltaW5nCi0jZGVmaW5lIFBOR1RFU1RfVElNSU5HCi0qLwotCi0jaWZuZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSN1bmRlZiBQTkdURVNUX1RJTUlORwotI2VuZGlmCi0KLSNpZmRlZiBQTkdURVNUX1RJTUlORwotc3RhdGljIGZsb2F0IHRfc3RhcnQsIHRfc3RvcCwgdF9kZWNvZGUsIHRfZW5jb2RlLCB0X21pc2M7Ci0jaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfdElNRV9TVFJJTkdfTEVOR1RIIDI5Ci1zdGF0aWMgaW50IHRJTUVfY2h1bmtfcHJlc2VudCA9IDA7Ci1zdGF0aWMgY2hhciB0SU1FX3N0cmluZ1tQTkdfdElNRV9TVFJJTkdfTEVOR1RIXSA9ICJ0SU1FIGNodW5rIGlzIG5vdCBwcmVzZW50IjsKLSNlbmRpZgotCi1zdGF0aWMgaW50IHZlcmJvc2UgPSAwOwotCi1pbnQgdGVzdF9vbmVfZmlsZSBQTkdBUkcoKFBOR19DT05TVCBjaGFyICppbm5hbWUsIFBOR19DT05TVCBjaGFyICpvdXRuYW1lKSk7Ci0KLSNpZmRlZiBfX1RVUkJPQ19fCi0jaW5jbHVkZSA8bWVtLmg+Ci0jZW5kaWYKLQotLyogRGVmaW5lZCBzbyBJIGNhbiB3cml0ZSB0byBhIGZpbGUgb24gZ3VpL3dpbmRvd2luZyBwbGF0Zm9ybXMgKi8KLS8qICAjZGVmaW5lIFNUREVSUiBzdGRlcnIgICovCi0jZGVmaW5lIFNUREVSUiBzdGRvdXQgICAvKiBGb3IgRE9TICovCi0KLS8qIEluIGNhc2UgYSBzeXN0ZW0gaGVhZGVyIChlLmcuLCBvbiBBSVgpIGRlZmluZWQgam1wYnVmICovCi0jaWZkZWYgam1wYnVmCi0jICB1bmRlZiBqbXBidWYKLSNlbmRpZgotCi0vKiBEZWZpbmUgcG5nX2ptcGJ1ZigpIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGEgcHJlLTEuMC42IHZlcnNpb24gb2YgbGlicG5nICovCi0jaWZuZGVmIHBuZ19qbXBidWYKLSMgIGRlZmluZSBwbmdfam1wYnVmKHBuZ19wdHIpIHBuZ19wdHItPmptcGJ1ZgotI2VuZGlmCi0KLS8qIEV4YW1wbGUgb2YgdXNpbmcgcm93IGNhbGxiYWNrcyB0byBtYWtlIGEgc2ltcGxlIHByb2dyZXNzIG1ldGVyICovCi1zdGF0aWMgaW50IHN0YXR1c19wYXNzID0gMTsKLXN0YXRpYyBpbnQgc3RhdHVzX2RvdHNfcmVxdWVzdGVkID0gMDsKLXN0YXRpYyBpbnQgc3RhdHVzX2RvdHMgPSAxOwotCi12b2lkCi1yZWFkX3Jvd19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiByb3dfbnVtYmVyLCBpbnQgcGFzcyk7Ci12b2lkCi1yZWFkX3Jvd19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiByb3dfbnVtYmVyLCBpbnQgcGFzcykKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgcm93X251bWJlciA+IFBOR19VSU5UXzMxX01BWCkKLSAgICAgIHJldHVybjsKLSAgIGlmIChzdGF0dXNfcGFzcyAhPSBwYXNzKQotICAgewotICAgICAgZnByaW50ZihzdGRvdXQsICJcbiBQYXNzICVkOiAiLCBwYXNzKTsKLSAgICAgIHN0YXR1c19wYXNzID0gcGFzczsKLSAgICAgIHN0YXR1c19kb3RzID0gMzE7Ci0gICB9Ci0gICBzdGF0dXNfZG90cy0tOwotICAgaWYgKHN0YXR1c19kb3RzID09IDApCi0gICB7Ci0gICAgICBmcHJpbnRmKHN0ZG91dCwgIlxuICAgICAgICAgIik7Ci0gICAgICBzdGF0dXNfZG90cz0zMDsKLSAgIH0KLSAgIGZwcmludGYoc3Rkb3V0LCAiciIpOwotfQotCi12b2lkCi13cml0ZV9yb3dfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgcm93X251bWJlciwgaW50IHBhc3MpOwotdm9pZAotd3JpdGVfcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHJvd19udW1iZXIsIGludCBwYXNzKQotewotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCByb3dfbnVtYmVyID4gUE5HX1VJTlRfMzFfTUFYIHx8IHBhc3MgPiA3KQotICAgICAgcmV0dXJuOwotICAgZnByaW50ZihzdGRvdXQsICJ3Iik7Ci19Ci0KLQotI2lmZGVmIFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAotLyogRXhhbXBsZSBvZiB1c2luZyB1c2VyIHRyYW5zZm9ybSBjYWxsYmFjayAod2UgZG9uJ3QgdHJhbnNmb3JtIGFueXRoaW5nLAotICogYnV0IG1lcmVseSBleGFtaW5lIHRoZSByb3cgZmlsdGVycy4gIFdlIHNldCB0aGlzIHRvIDI1NiByYXRoZXIgdGhhbgotICogNSBpbiBjYXNlIGlsbGVnYWwgZmlsdGVyIHZhbHVlcyBhcmUgcHJlc2VudC4pCi0gKi8KLXN0YXRpYyBwbmdfdWludF8zMiBmaWx0ZXJzX3VzZWRbMjU2XTsKLXZvaWQKLWNvdW50X2ZpbHRlcnMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIGRhdGEpOwotdm9pZAotY291bnRfZmlsdGVycyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgZGF0YSkKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgcm93X2luZm8gIT0gTlVMTCkKLSAgICAgICsrZmlsdGVyc191c2VkWyooZGF0YSAtIDEpXTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAotLyogRXhhbXBsZSBvZiB1c2luZyB1c2VyIHRyYW5zZm9ybSBjYWxsYmFjayAod2UgZG9uJ3QgdHJhbnNmb3JtIGFueXRoaW5nLAotICogYnV0IG1lcmVseSBjb3VudCB0aGUgemVybyBzYW1wbGVzKQotICovCi0KLXN0YXRpYyBwbmdfdWludF8zMiB6ZXJvX3NhbXBsZXM7Ci0KLXZvaWQKLWNvdW50X3plcm9fc2FtcGxlcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgZGF0YSk7Ci12b2lkCi1jb3VudF96ZXJvX3NhbXBsZXMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIGRhdGEpCi17Ci0gICBwbmdfYnl0ZXAgZHAgPSBkYXRhOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTClyZXR1cm47Ci0KLSAgIC8qIENvbnRlbnRzIG9mIHJvd19pbmZvOgotICAgICogIHBuZ191aW50XzMyIHdpZHRoICAgICAgd2lkdGggb2Ygcm93Ci0gICAgKiAgcG5nX3VpbnRfMzIgcm93Ynl0ZXMgICBudW1iZXIgb2YgYnl0ZXMgaW4gcm93Ci0gICAgKiAgcG5nX2J5dGUgY29sb3JfdHlwZSAgICBjb2xvciB0eXBlIG9mIHBpeGVscwotICAgICogIHBuZ19ieXRlIGJpdF9kZXB0aCAgICAgYml0IGRlcHRoIG9mIHNhbXBsZXMKLSAgICAqICBwbmdfYnl0ZSBjaGFubmVscyAgICAgIG51bWJlciBvZiBjaGFubmVscyAoMS00KQotICAgICogIHBuZ19ieXRlIHBpeGVsX2RlcHRoICAgYml0cyBwZXIgcGl4ZWwgKGRlcHRoKmNoYW5uZWxzKQotICAgICovCi0KLSAgICAvKiBDb3VudHMgdGhlIG51bWJlciBvZiB6ZXJvIHNhbXBsZXMgKG9yIHplcm8gcGl4ZWxzIGlmIGNvbG9yX3R5cGUgaXMgMyAqLwotCi0gICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IDAgfHwgcm93X2luZm8tPmNvbG9yX3R5cGUgPT0gMykKLSAgICB7Ci0gICAgICAgaW50IHBvcyA9IDA7Ci0gICAgICAgcG5nX3VpbnRfMzIgbiwgbnN0b3A7Ci0gICAgICAgZm9yIChuID0gMCwgbnN0b3A9cm93X2luZm8tPndpZHRoOyBuPG5zdG9wOyBuKyspCi0gICAgICAgewotICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDEpCi0gICAgICAgICAgewotICAgICAgICAgICAgIGlmICgoKCpkcCA8PCBwb3MrKyApICYgMHg4MCkgPT0gMCkKLSAgICAgICAgICAgICAgICB6ZXJvX3NhbXBsZXMrKzsKLSAgICAgICAgICAgICBpZiAocG9zID09IDgpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgZHArKzsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDIpCi0gICAgICAgICAgewotICAgICAgICAgICAgIGlmICgoKCpkcCA8PCAocG9zKz0yKSkgJiAweGMwKSA9PSAwKQotICAgICAgICAgICAgICAgIHplcm9fc2FtcGxlcysrOwotICAgICAgICAgICAgIGlmIChwb3MgPT0gOCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9zID0gMDsKLSAgICAgICAgICAgICAgICBkcCsrOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gNCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgaWYgKCgoKmRwIDw8IChwb3MrPTQpKSAmIDB4ZjApID09IDApCi0gICAgICAgICAgICAgICAgemVyb19zYW1wbGVzKys7Ci0gICAgICAgICAgICAgaWYgKHBvcyA9PSA4KQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3MgPSAwOwotICAgICAgICAgICAgICAgIGRwKys7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgICAgICAgICAgIGlmICgqZHArKyA9PSAwKQotICAgICAgICAgICAgICAgIHplcm9fc2FtcGxlcysrOwotICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBpZiAoKCpkcCB8ICooZHArMSkpID09IDApCi0gICAgICAgICAgICAgICAgemVyb19zYW1wbGVzKys7Ci0gICAgICAgICAgICAgZHArPTI7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvKiBPdGhlciBjb2xvciB0eXBlcyAqLwotICAgIHsKLSAgICAgICBwbmdfdWludF8zMiBuLCBuc3RvcDsKLSAgICAgICBpbnQgY2hhbm5lbDsKLSAgICAgICBpbnQgY29sb3JfY2hhbm5lbHMgPSByb3dfaW5mby0+Y2hhbm5lbHM7Ci0gICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID4gMyljb2xvcl9jaGFubmVscy0tOwotCi0gICAgICAgZm9yIChuID0gMCwgbnN0b3A9cm93X2luZm8tPndpZHRoOyBuPG5zdG9wOyBuKyspCi0gICAgICAgewotICAgICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjb2xvcl9jaGFubmVsczsgY2hhbm5lbCsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgICAgICAgICAgICAgIGlmICgqZHArKyA9PSAwKQotICAgICAgICAgICAgICAgICAgIHplcm9fc2FtcGxlcysrOwotICAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKCpkcCB8ICooZHArMSkpID09IDApCi0gICAgICAgICAgICAgICAgICAgemVyb19zYW1wbGVzKys7Ci0gICAgICAgICAgICAgICAgZHArPTI7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPiAzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBkcCsrOwotICAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQotICAgICAgICAgICAgICAgIGRwKys7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICB9Ci19Ci0jZW5kaWYgLyogUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCAqLwotCi1zdGF0aWMgaW50IHdyb3RlX3F1ZXN0aW9uID0gMDsKLQotI2lmbmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECi0vKiBTVEFSVCBvZiBjb2RlIHRvIHZhbGlkYXRlIHN0ZGlvLWZyZWUgY29tcGlsYXRpb24gKi8KLS8qIFRoZXNlIGNvcGllcyBvZiB0aGUgZGVmYXVsdCByZWFkL3dyaXRlIGZ1bmN0aW9ucyBjb21lIGZyb20gcG5ncmlvLmMgYW5kCi0gKiBwbmd3aW8uYy4gIFRoZXkgYWxsb3cgImRvbid0IGluY2x1ZGUgc3RkaW8iIHRlc3Rpbmcgb2YgdGhlIGxpYnJhcnkuCi0gKiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGRvZXMgdGhlIGFjdHVhbCByZWFkaW5nIG9mIGRhdGEuICBJZiB5b3UgYXJlCi0gKiBub3QgcmVhZGluZyBmcm9tIGEgc3RhbmRhcmQgQyBzdHJlYW0sIHlvdSBzaG91bGQgY3JlYXRlIGEgcmVwbGFjZW1lbnQKLSAqIHJlYWRfZGF0YSBmdW5jdGlvbiBhbmQgdXNlIGl0IGF0IHJ1biB0aW1lIHdpdGggcG5nX3NldF9yZWFkX2ZuKCksIHJhdGhlcgotICogdGhhbiBjaGFuZ2luZyB0aGUgbGlicmFyeS4KLSAqLwotCi0jaWZkZWYgUE5HX0lPX1NUQVRFX1NVUFBPUlRFRAotdm9pZAotcG5ndGVzdF9jaGVja19pb19zdGF0ZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfc2l6ZV90IGRhdGFfbGVuZ3RoLAotICAgcG5nX3VpbnRfMzIgaW9fb3ApOwotdm9pZAotcG5ndGVzdF9jaGVja19pb19zdGF0ZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfc2l6ZV90IGRhdGFfbGVuZ3RoLAotICAgcG5nX3VpbnRfMzIgaW9fb3ApCi17Ci0gICBwbmdfdWludF8zMiBpb19zdGF0ZSA9IHBuZ19nZXRfaW9fc3RhdGUocG5nX3B0cik7Ci0gICBpbnQgZXJyID0gMDsKLQotICAgLyogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIChyZWFkaW5nIC8gd3JpdGluZykgaXMgYXMgZXhwZWN0ZWQuICovCi0gICBpZiAoKGlvX3N0YXRlICYgUE5HX0lPX01BU0tfT1ApICE9IGlvX29wKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbmNvcnJlY3Qgb3BlcmF0aW9uIGluIEkvTyBzdGF0ZSIpOwotCi0gICAvKiBDaGVjayBpZiB0aGUgYnVmZmVyIHNpemUgc3BlY2lmaWMgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24KLSAgICAqIChmaWxlIHNpZ25hdHVyZSAvIGhlYWRlciAvIGRhdGEgLyBjcmMpIGlzIGFzIGV4cGVjdGVkLgotICAgICovCi0gICBzd2l0Y2ggKGlvX3N0YXRlICYgUE5HX0lPX01BU0tfTE9DKQotICAgewotICAgY2FzZSBQTkdfSU9fU0lHTkFUVVJFOgotICAgICAgaWYgKGRhdGFfbGVuZ3RoID4gOCkKLSAgICAgICAgIGVyciA9IDE7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgUE5HX0lPX0NIVU5LX0hEUjoKLSAgICAgIGlmIChkYXRhX2xlbmd0aCAhPSA4KQotICAgICAgICAgZXJyID0gMTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBQTkdfSU9fQ0hVTktfREFUQToKLSAgICAgIGJyZWFrOyAgLyogbm8gcmVzdHJpY3Rpb25zIGhlcmUgKi8KLSAgIGNhc2UgUE5HX0lPX0NIVU5LX0NSQzoKLSAgICAgIGlmIChkYXRhX2xlbmd0aCAhPSA0KQotICAgICAgICAgZXJyID0gMTsKLSAgICAgIGJyZWFrOwotICAgZGVmYXVsdDoKLSAgICAgIGVyciA9IDE7ICAvKiB1bmluaXRpYWxpemVkICovCi0gICB9Ci0gICBpZiAoZXJyKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJCYWQgSS9PIHN0YXRlIG9yIGJ1ZmZlciBzaXplIik7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBVU0VfRkFSX0tFWVdPUkQKLXN0YXRpYyB2b2lkCi1wbmd0ZXN0X3JlYWRfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCi17Ci0gICBwbmdfc2l6ZV90IGNoZWNrID0gMDsKLSAgIHBuZ192b2lkcCBpb19wdHI7Ci0KLSAgIC8qIGZyZWFkKCkgcmV0dXJucyAwIG9uIGVycm9yLCBzbyBpdCBpcyBPSyB0byBzdG9yZSB0aGlzIGluIGEgcG5nX3NpemVfdAotICAgICogaW5zdGVhZCBvZiBhbiBpbnQsIHdoaWNoIGlzIHdoYXQgZnJlYWQoKSBhY3R1YWxseSByZXR1cm5zLgotICAgICovCi0gICBpb19wdHIgPSBwbmdfZ2V0X2lvX3B0cihwbmdfcHRyKTsKLSAgIGlmIChpb19wdHIgIT0gTlVMTCkKLSAgIHsKLSAgICAgIGNoZWNrID0gZnJlYWQoZGF0YSwgMSwgbGVuZ3RoLCAocG5nX0ZJTEVfcClpb19wdHIpOwotICAgfQotCi0gICBpZiAoY2hlY2sgIT0gbGVuZ3RoKQotICAgewotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJSZWFkIEVycm9yIik7Ci0gICB9Ci0KLSNpZmRlZiBQTkdfSU9fU1RBVEVfU1VQUE9SVEVECi0gICBwbmd0ZXN0X2NoZWNrX2lvX3N0YXRlKHBuZ19wdHIsIGxlbmd0aCwgUE5HX0lPX1JFQURJTkcpOwotI2VuZGlmCi19Ci0jZWxzZQotLyogVGhpcyBpcyB0aGUgbW9kZWwtaW5kZXBlbmRlbnQgdmVyc2lvbi4gU2luY2UgdGhlIHN0YW5kYXJkIEkvTyBsaWJyYXJ5Ci0gICBjYW4ndCBoYW5kbGUgZmFyIGJ1ZmZlcnMgaW4gdGhlIG1lZGl1bSBhbmQgc21hbGwgbW9kZWxzLCB3ZSBoYXZlIHRvIGNvcHkKLSAgIHRoZSBkYXRhLgotKi8KLQotI2RlZmluZSBORUFSX0JVRl9TSVpFIDEwMjQKLSNkZWZpbmUgTUlOKGEsYikgKGEgPD0gYiA/IGEgOiBiKQotCi1zdGF0aWMgdm9pZAotcG5ndGVzdF9yZWFkX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQotewotICAgcG5nX3NpemVfdCBjaGVjazsKLSAgIHBuZ19ieXRlICpuX2RhdGE7Ci0gICBwbmdfRklMRV9wIGlvX3B0cjsKLQotICAgLyogQ2hlY2sgaWYgZGF0YSByZWFsbHkgaXMgbmVhci4gSWYgc28sIHVzZSB1c3VhbCBjb2RlLiAqLwotICAgbl9kYXRhID0gKHBuZ19ieXRlICopQ1ZUX1BUUl9OT0NIRUNLKGRhdGEpOwotICAgaW9fcHRyID0gKHBuZ19GSUxFX3ApQ1ZUX1BUUihwbmdfZ2V0X2lvX3B0cihwbmdfcHRyKSk7Ci0gICBpZiAoKHBuZ19ieXRlcCluX2RhdGEgPT0gZGF0YSkKLSAgIHsKLSAgICAgIGNoZWNrID0gZnJlYWQobl9kYXRhLCAxLCBsZW5ndGgsIGlvX3B0cik7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICBwbmdfYnl0ZSBidWZbTkVBUl9CVUZfU0laRV07Ci0gICAgICBwbmdfc2l6ZV90IHJlYWQsIHJlbWFpbmluZywgZXJyOwotICAgICAgY2hlY2sgPSAwOwotICAgICAgcmVtYWluaW5nID0gbGVuZ3RoOwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgIHJlYWQgPSBNSU4oTkVBUl9CVUZfU0laRSwgcmVtYWluaW5nKTsKLSAgICAgICAgIGVyciA9IGZyZWFkKGJ1ZiwgMSwgMSwgaW9fcHRyKTsKLSAgICAgICAgIHBuZ19tZW1jcHkoZGF0YSwgYnVmLCByZWFkKTsgLyogQ29weSBmYXIgYnVmZmVyIHRvIG5lYXIgYnVmZmVyICovCi0gICAgICAgICBpZiAoZXJyICE9IHJlYWQpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNoZWNrICs9IGVycjsKLSAgICAgICAgIGRhdGEgKz0gcmVhZDsKLSAgICAgICAgIHJlbWFpbmluZyAtPSByZWFkOwotICAgICAgfQotICAgICAgd2hpbGUgKHJlbWFpbmluZyAhPSAwKTsKLSAgIH0KLSAgIGlmIChjaGVjayAhPSBsZW5ndGgpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlJlYWQgRXJyb3IiKTsKLQotI2lmZGVmIFBOR19JT19TVEFURV9TVVBQT1JURUQKLSAgIHBuZ3Rlc3RfY2hlY2tfaW9fc3RhdGUocG5nX3B0ciwgbGVuZ3RoLCBQTkdfSU9fUkVBRElORyk7Ci0jZW5kaWYKLX0KLSNlbmRpZiAvKiBVU0VfRkFSX0tFWVdPUkQgKi8KLQotI2lmZGVmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQKLXN0YXRpYyB2b2lkCi1wbmd0ZXN0X2ZsdXNoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICAvKiBEbyBub3RoaW5nOyBmZmx1c2goKSBpcyBzYWlkIHRvIGJlIGp1c3QgYSB3YXN0ZSBvZiBlbmVyZ3kuICovCi0gICBQTkdfVU5VU0VEKHBuZ19wdHIpICAgLyogU3RpZmxlIGNvbXBpbGVyIHdhcm5pbmcgKi8KLX0KLSNlbmRpZgotCi0vKiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGRvZXMgdGhlIGFjdHVhbCB3cml0aW5nIG9mIGRhdGEuICBJZiB5b3UgYXJlCi0gKiBub3Qgd3JpdGluZyB0byBhIHN0YW5kYXJkIEMgc3RyZWFtLCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIHJlcGxhY2VtZW50Ci0gKiB3cml0ZV9kYXRhIGZ1bmN0aW9uIGFuZCB1c2UgaXQgYXQgcnVuIHRpbWUgd2l0aCBwbmdfc2V0X3dyaXRlX2ZuKCksIHJhdGhlcgotICogdGhhbiBjaGFuZ2luZyB0aGUgbGlicmFyeS4KLSAqLwotI2lmbmRlZiBVU0VfRkFSX0tFWVdPUkQKLXN0YXRpYyB2b2lkCi1wbmd0ZXN0X3dyaXRlX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQotewotICAgcG5nX3NpemVfdCBjaGVjazsKLSAgIHBuZ19GSUxFX3AgaW9fcHRyOwotICAgaW9fcHRyID0gKHBuZ19GSUxFX3ApQ1ZUX1BUUihwbmdfZ2V0X2lvX3B0cihwbmdfcHRyKSk7Ci0KLSAgIGNoZWNrID0gZndyaXRlKGRhdGEsIDEsIGxlbmd0aCwgaW9fcHRyKTsKLSAgIGlmIChjaGVjayAhPSBsZW5ndGgpCi0gICB7Ci0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIldyaXRlIEVycm9yIik7Ci0gICB9Ci0KLSNpZmRlZiBQTkdfSU9fU1RBVEVfU1VQUE9SVEVECi0gICBwbmd0ZXN0X2NoZWNrX2lvX3N0YXRlKHBuZ19wdHIsIGxlbmd0aCwgUE5HX0lPX1dSSVRJTkcpOwotI2VuZGlmCi19Ci0jZWxzZQotLyogVGhpcyBpcyB0aGUgbW9kZWwtaW5kZXBlbmRlbnQgdmVyc2lvbi4gU2luY2UgdGhlIHN0YW5kYXJkIEkvTyBsaWJyYXJ5Ci0gICBjYW4ndCBoYW5kbGUgZmFyIGJ1ZmZlcnMgaW4gdGhlIG1lZGl1bSBhbmQgc21hbGwgbW9kZWxzLCB3ZSBoYXZlIHRvIGNvcHkKLSAgIHRoZSBkYXRhLgotKi8KLQotI2RlZmluZSBORUFSX0JVRl9TSVpFIDEwMjQKLSNkZWZpbmUgTUlOKGEsYikgKGEgPD0gYiA/IGEgOiBiKQotCi1zdGF0aWMgdm9pZAotcG5ndGVzdF93cml0ZV9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIHBuZ19zaXplX3QgY2hlY2s7Ci0gICBwbmdfYnl0ZSAqbmVhcl9kYXRhOyAgLyogTmVlZHMgdG8gYmUgInBuZ19ieXRlICoiIGluc3RlYWQgb2YgInBuZ19ieXRlcCIgKi8KLSAgIHBuZ19GSUxFX3AgaW9fcHRyOwotCi0gICAvKiBDaGVjayBpZiBkYXRhIHJlYWxseSBpcyBuZWFyLiBJZiBzbywgdXNlIHVzdWFsIGNvZGUuICovCi0gICBuZWFyX2RhdGEgPSAocG5nX2J5dGUgKilDVlRfUFRSX05PQ0hFQ0soZGF0YSk7Ci0gICBpb19wdHIgPSAocG5nX0ZJTEVfcClDVlRfUFRSKHBuZ19wdHItPmlvX3B0cik7Ci0gICBpZiAoKHBuZ19ieXRlcCluZWFyX2RhdGEgPT0gZGF0YSkKLSAgIHsKLSAgICAgIGNoZWNrID0gZndyaXRlKG5lYXJfZGF0YSwgMSwgbGVuZ3RoLCBpb19wdHIpOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgcG5nX2J5dGUgYnVmW05FQVJfQlVGX1NJWkVdOwotICAgICAgcG5nX3NpemVfdCB3cml0dGVuLCByZW1haW5pbmcsIGVycjsKLSAgICAgIGNoZWNrID0gMDsKLSAgICAgIHJlbWFpbmluZyA9IGxlbmd0aDsKLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgICB3cml0dGVuID0gTUlOKE5FQVJfQlVGX1NJWkUsIHJlbWFpbmluZyk7Ci0gICAgICAgICBwbmdfbWVtY3B5KGJ1ZiwgZGF0YSwgd3JpdHRlbik7IC8qIENvcHkgZmFyIGJ1ZmZlciB0byBuZWFyIGJ1ZmZlciAqLwotICAgICAgICAgZXJyID0gZndyaXRlKGJ1ZiwgMSwgd3JpdHRlbiwgaW9fcHRyKTsKLSAgICAgICAgIGlmIChlcnIgIT0gd3JpdHRlbikKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgY2hlY2sgKz0gZXJyOwotICAgICAgICAgZGF0YSArPSB3cml0dGVuOwotICAgICAgICAgcmVtYWluaW5nIC09IHdyaXR0ZW47Ci0gICAgICB9Ci0gICAgICB3aGlsZSAocmVtYWluaW5nICE9IDApOwotICAgfQotICAgaWYgKGNoZWNrICE9IGxlbmd0aCkKLSAgIHsKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiV3JpdGUgRXJyb3IiKTsKLSAgIH0KLQotI2lmZGVmIFBOR19JT19TVEFURV9TVVBQT1JURUQKLSAgIHBuZ3Rlc3RfY2hlY2tfaW9fc3RhdGUocG5nX3B0ciwgbGVuZ3RoLCBQTkdfSU9fV1JJVElORyk7Ci0jZW5kaWYKLX0KLSNlbmRpZiAvKiBVU0VfRkFSX0tFWVdPUkQgKi8KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIHdhcm5pbmcsIGJ1dCB0aGUgbGlicmFyeSB0aGlua3MKLSAqIGl0IGNhbiBjb250aW51ZSBhbnl3YXkuICBSZXBsYWNlbWVudCBmdW5jdGlvbnMgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZwotICogaGVyZSBpZiB5b3UgZG9uJ3Qgd2FudCB0by4gIEluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIHBuZ19wdHIgaXMKLSAqIG5vdCB1c2VkLCBidXQgaXQgaXMgcGFzc2VkIGluIGNhc2UgaXQgbWF5IGJlIHVzZWZ1bC4KLSAqLwotc3RhdGljIHZvaWQKLXBuZ3Rlc3Rfd2FybmluZyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbWVzc2FnZSkKLXsKLSAgIFBOR19DT05TVCBjaGFyICpuYW1lID0gIlVOS05PV04gKEVSUk9SISkiOwotICAgY2hhciAqdGVzdDsKLSAgIHRlc3QgPSBwbmdfZ2V0X2Vycm9yX3B0cihwbmdfcHRyKTsKLSAgIGlmICh0ZXN0ID09IE5VTEwpCi0gICAgIGZwcmludGYoU1RERVJSLCAiJXM6IGxpYnBuZyB3YXJuaW5nOiAlc1xuIiwgbmFtZSwgbWVzc2FnZSk7Ci0gICBlbHNlCi0gICAgIGZwcmludGYoU1RERVJSLCAiJXM6IGxpYnBuZyB3YXJuaW5nOiAlc1xuIiwgdGVzdCwgbWVzc2FnZSk7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb24uICBOb3RlIHRoYXQgcmVwbGFjZW1lbnRzIGZvcgotICogdGhpcyBmdW5jdGlvbiBNVVNUIE5PVCBSRVRVUk4sIG9yIHRoZSBwcm9ncmFtIHdpbGwgbGlrZWx5IGNyYXNoLiAgVGhpcwotICogZnVuY3Rpb24gaXMgdXNlZCBieSBkZWZhdWx0LCBvciBpZiB0aGUgcHJvZ3JhbSBzdXBwbGllcyBOVUxMIGZvciB0aGUKLSAqIGVycm9yIGZ1bmN0aW9uIHBvaW50ZXIgaW4gcG5nX3NldF9lcnJvcl9mbigpLgotICovCi1zdGF0aWMgdm9pZAotcG5ndGVzdF9lcnJvcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbWVzc2FnZSkKLXsKLSAgIHBuZ3Rlc3Rfd2FybmluZyhwbmdfcHRyLCBtZXNzYWdlKTsKLSAgIC8qIFdlIGNhbiByZXR1cm4gYmVjYXVzZSBwbmdfZXJyb3IgY2FsbHMgdGhlIGRlZmF1bHQgaGFuZGxlciwgd2hpY2ggaXMKLSAgICAqIGFjdHVhbGx5IE9LIGluIHRoaXMgY2FzZS4KLSAgICAqLwotfQotI2VuZGlmIC8qICFQTkdfU1RESU9fU1VQUE9SVEVEICovCi0vKiBFTkQgb2YgY29kZSB0byB2YWxpZGF0ZSBzdGRpby1mcmVlIGNvbXBpbGF0aW9uICovCi0KLS8qIFNUQVJUIG9mIGNvZGUgdG8gdmFsaWRhdGUgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiAqLwotI2lmIGRlZmluZWQoUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCkgJiYgUE5HX0RFQlVHCi0KLS8qIEFsbG9jYXRlIG1lbW9yeS4gIEZvciByZWFzb25hYmxlIGZpbGVzLCBzaXplIHNob3VsZCBuZXZlciBleGNlZWQKLSAqIDY0Sy4gIEhvd2V2ZXIsIHpsaWIgbWF5IGFsbG9jYXRlIG1vcmUgdGhlbiA2NEsgaWYgeW91IGRvbid0IHRlbGwKLSAqIGl0IG5vdCB0by4gIFNlZSB6Y29uZi5oIGFuZCBwbmcuaCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIHpsaWIgZG9lcwotICogbmVlZCB0byBhbGxvY2F0ZSBleGFjdGx5IDY0Sywgc28gd2hhdGV2ZXIgeW91IGNhbGwgaGVyZSBtdXN0Ci0gKiBoYXZlIHRoZSBhYmlsaXR5IHRvIGRvIHRoYXQuCi0gKgotICogVGhpcyBwaWVjZSBvZiBjb2RlIGNhbiBiZSBjb21waWxlZCB0byB2YWxpZGF0ZSBtYXggNjRLIGFsbG9jYXRpb25zCi0gKiBieSBzZXR0aW5nIE1BWFNFR182NEsgaW4gemxpYiB6Y29uZi5oICpvciogUE5HX01BWF9NQUxMT0NfNjRLLgotICovCi10eXBlZGVmIHN0cnVjdCBtZW1vcnlfaW5mb3JtYXRpb24KLXsKLSAgIHBuZ19hbGxvY19zaXplX3QgICAgICAgICAgc2l6ZTsKLSAgIHBuZ192b2lkcCAgICAgICAgICAgICAgICAgcG9pbnRlcjsKLSAgIHN0cnVjdCBtZW1vcnlfaW5mb3JtYXRpb24gRkFSICpuZXh0OwotfSBtZW1vcnlfaW5mb3JtYXRpb247Ci10eXBlZGVmIG1lbW9yeV9pbmZvcm1hdGlvbiBGQVIgKm1lbW9yeV9pbmZvcDsKLQotc3RhdGljIG1lbW9yeV9pbmZvcCBwaW5mb3JtYXRpb24gPSBOVUxMOwotc3RhdGljIGludCBjdXJyZW50X2FsbG9jYXRpb24gPSAwOwotc3RhdGljIGludCBtYXhpbXVtX2FsbG9jYXRpb24gPSAwOwotc3RhdGljIGludCB0b3RhbF9hbGxvY2F0aW9uID0gMDsKLXN0YXRpYyBpbnQgbnVtX2FsbG9jYXRpb25zID0gMDsKLQotcG5nX3ZvaWRwIHBuZ3Rlc3RfZGVidWdfbWFsbG9jCi0gICBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19hbGxvY19zaXplX3Qgc2l6ZSkpOwotdm9pZCBwbmd0ZXN0X2RlYnVnX2ZyZWUgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgcHRyKSk7Ci0KLXBuZ192b2lkcAotcG5ndGVzdF9kZWJ1Z19tYWxsb2MocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2FsbG9jX3NpemVfdCBzaXplKQotewotCi0gICAvKiBwbmdfbWFsbG9jIGhhcyBhbHJlYWR5IHRlc3RlZCBmb3IgTlVMTDsgcG5nX2NyZWF0ZV9zdHJ1Y3QgY2FsbHMKLSAgICAqIHBuZ3Rlc3RfZGVidWdfbWFsbG9jIGRpcmVjdGx5LCB3aXRoIHBuZ19wdHIgPT0gTlVMTCB3aGljaCBpcyBPSwotICAgICovCi0KLSAgIGlmIChzaXplID09IDApCi0gICAgICByZXR1cm4gKE5VTEwpOwotCi0gICAvKiBUaGlzIGNhbGxzIHRoZSBsaWJyYXJ5IGFsbG9jYXRvciB0d2ljZSwgb25jZSB0byBnZXQgdGhlIHJlcXVlc3RlZAotICAgICAgYnVmZmVyIGFuZCBvbmNlIHRvIGdldCBhIG5ldyBmcmVlIGxpc3QgZW50cnkuICovCi0gICB7Ci0gICAgICAvKiBEaXNhYmxlIG1hbGxvY19mbiBhbmQgZnJlZV9mbiAqLwotICAgICAgbWVtb3J5X2luZm9wIHBpbmZvOwotICAgICAgcG5nX3NldF9tZW1fZm4ocG5nX3B0ciwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gICAgICBwaW5mbyA9IChtZW1vcnlfaW5mb3ApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgcG5nX3NpemVvZigqcGluZm8pKTsKLSAgICAgIHBpbmZvLT5zaXplID0gc2l6ZTsKLSAgICAgIGN1cnJlbnRfYWxsb2NhdGlvbiArPSBzaXplOwotICAgICAgdG90YWxfYWxsb2NhdGlvbiArPSBzaXplOwotICAgICAgbnVtX2FsbG9jYXRpb25zICsrOwotICAgICAgaWYgKGN1cnJlbnRfYWxsb2NhdGlvbiA+IG1heGltdW1fYWxsb2NhdGlvbikKLSAgICAgICAgIG1heGltdW1fYWxsb2NhdGlvbiA9IGN1cnJlbnRfYWxsb2NhdGlvbjsKLSAgICAgIHBpbmZvLT5wb2ludGVyID0gcG5nX21hbGxvYyhwbmdfcHRyLCBzaXplKTsKLSAgICAgIC8qIFJlc3RvcmUgbWFsbG9jX2ZuIGFuZCBmcmVlX2ZuICovCi0gICAgICBwbmdfc2V0X21lbV9mbihwbmdfcHRyLAotICAgICAgICAgIE5VTEwsIHBuZ3Rlc3RfZGVidWdfbWFsbG9jLCBwbmd0ZXN0X2RlYnVnX2ZyZWUpOwotICAgICAgaWYgKHNpemUgIT0gMCAmJiBwaW5mby0+cG9pbnRlciA9PSBOVUxMKQotICAgICAgewotICAgICAgICAgY3VycmVudF9hbGxvY2F0aW9uIC09IHNpemU7Ci0gICAgICAgICB0b3RhbF9hbGxvY2F0aW9uIC09IHNpemU7Ci0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwKLSAgICAgICAgICAgIm91dCBvZiBtZW1vcnkgaW4gcG5ndGVzdC0+cG5ndGVzdF9kZWJ1Z19tYWxsb2MiKTsKLSAgICAgIH0KLSAgICAgIHBpbmZvLT5uZXh0ID0gcGluZm9ybWF0aW9uOwotICAgICAgcGluZm9ybWF0aW9uID0gcGluZm87Ci0gICAgICAvKiBNYWtlIHN1cmUgdGhlIGNhbGxlciBpc24ndCBhc3N1bWluZyB6ZXJvZWQgbWVtb3J5LiAqLwotICAgICAgcG5nX21lbXNldChwaW5mby0+cG9pbnRlciwgMHhkZCwgcGluZm8tPnNpemUpOwotICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICBwcmludGYoInBuZ19tYWxsb2MgJWx1IGJ5dGVzIGF0ICV4XG4iLCAodW5zaWduZWQgbG9uZylzaXplLAotICAgICAgICAgICAgcGluZm8tPnBvaW50ZXIpOwotICAgICAgcmV0dXJuIChwbmdfdm9pZHApKHBpbmZvLT5wb2ludGVyKTsKLSAgIH0KLX0KLQotLyogRnJlZSBhIHBvaW50ZXIuICBJdCBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3QgYXQgdGhlIHNhbWUgdGltZS4gKi8KLXZvaWQKLXBuZ3Rlc3RfZGVidWdfZnJlZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgcHRyKQotewotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIGZwcmludGYoU1RERVJSLCAiTlVMTCBwb2ludGVyIHRvIHBuZ3Rlc3RfZGVidWdfZnJlZS5cbiIpOwotICAgaWYgKHB0ciA9PSAwKQotICAgewotI2lmIDAgLyogVGhpcyBoYXBwZW5zIGFsbCB0aGUgdGltZS4gKi8KLSAgICAgIGZwcmludGYoU1RERVJSLCAiV0FSTklORzogZnJlZWluZyBOVUxMIHBvaW50ZXJcbiIpOwotI2VuZGlmCi0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIC8qIFVubGluayB0aGUgZWxlbWVudCBmcm9tIHRoZSBsaXN0LiAqLwotICAgewotICAgICAgbWVtb3J5X2luZm9wIEZBUiAqcHBpbmZvID0gJnBpbmZvcm1hdGlvbjsKLSAgICAgIGZvciAoOzspCi0gICAgICB7Ci0gICAgICAgICBtZW1vcnlfaW5mb3AgcGluZm8gPSAqcHBpbmZvOwotICAgICAgICAgaWYgKHBpbmZvLT5wb2ludGVyID09IHB0cikKLSAgICAgICAgIHsKLSAgICAgICAgICAgICpwcGluZm8gPSBwaW5mby0+bmV4dDsKLSAgICAgICAgICAgIGN1cnJlbnRfYWxsb2NhdGlvbiAtPSBwaW5mby0+c2l6ZTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50X2FsbG9jYXRpb24gPCAwKQotICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICJEdXBsaWNhdGUgZnJlZSBvZiBtZW1vcnlcbiIpOwotICAgICAgICAgICAgLyogV2UgbXVzdCBmcmVlIHRoZSBsaXN0IGVsZW1lbnQgdG9vLCBidXQgZmlyc3Qga2lsbAotICAgICAgICAgICAgICAgdGhlIG1lbW9yeSB0aGF0IGlzIHRvIGJlIGZyZWVkLiAqLwotICAgICAgICAgICAgcG5nX21lbXNldChwdHIsIDB4NTUsIHBpbmZvLT5zaXplKTsKLSAgICAgICAgICAgIHBuZ19mcmVlX2RlZmF1bHQocG5nX3B0ciwgcGluZm8pOwotICAgICAgICAgICAgcGluZm8gPSBOVUxMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAocGluZm8tPm5leHQgPT0gTlVMTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiUG9pbnRlciAleCBub3QgZm91bmRcbiIsICh1bnNpZ25lZCBpbnQpcHRyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgcHBpbmZvID0gJnBpbmZvLT5uZXh0OwotICAgICAgfQotICAgfQotCi0gICAvKiBGaW5hbGx5IGZyZWUgdGhlIGRhdGEuICovCi0gICBpZiAodmVyYm9zZSkKLSAgICAgIHByaW50ZigiRnJlZWluZyAleFxuIiwgcHRyKTsKLSAgIHBuZ19mcmVlX2RlZmF1bHQocG5nX3B0ciwgcHRyKTsKLSAgIHB0ciA9IE5VTEw7Ci19Ci0jZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAmJiBQTkdfREVCVUcgKi8KLS8qIEVORCBvZiBjb2RlIHRvIHRlc3QgbWVtb3J5IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uICovCi0KLQotLyogRGVtb25zdHJhdGlvbiBvZiB1c2VyIGNodW5rIHN1cHBvcnQgb2YgdGhlIHNURVIgYW5kIHZwQWcgY2h1bmtzICovCi0jaWZkZWYgUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAotCi0vKiAoc1RFUiBpcyBhIHB1YmxpYyBjaHVuayBub3QgeWV0IGtub3duIGJ5IGxpYnBuZy4gIHZwQWcgaXMgYSBwcml2YXRlCi1jaHVuayB1c2VkIGluIEltYWdlTWFnaWNrIHRvIHN0b3JlICJ2aXJ0dWFsIHBhZ2UiIHNpemUpLiAgKi8KLQotc3RhdGljIHBuZ191aW50XzMyIHVzZXJfY2h1bmtfZGF0YVs0XTsKLQotICAgIC8qIDA6IHNURVIgbW9kZSArIDEKLSAgICAgKiAxOiB2cEFnIHdpZHRoCi0gICAgICogMjogdnBBZyBoZWlnaHQKLSAgICAgKiAzOiB2cEFnIHVuaXRzCi0gICAgICovCi0KLXN0YXRpYyBpbnQgcmVhZF91c2VyX2NodW5rX2NhbGxiYWNrKHBuZ19zdHJ1Y3QgKnBuZ19wdHIsCi0gICBwbmdfdW5rbm93bl9jaHVua3AgY2h1bmspCi17Ci0gICBwbmdfdWludF8zMgotICAgICAqbXlfdXNlcl9jaHVua19kYXRhOwotCi0gICAvKiBSZXR1cm4gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgKiAgICByZXR1cm4gKC1uKTsgIGNodW5rIGhhZCBhbiBlcnJvcgotICAgICogICAgcmV0dXJuICgwKTsgIGRpZCBub3QgcmVjb2duaXplCi0gICAgKiAgICByZXR1cm4gKG4pOyAgc3VjY2VzcwotICAgICoKLSAgICAqIFRoZSB1bmtub3duIGNodW5rIHN0cnVjdHVyZSBjb250YWlucyB0aGUgY2h1bmsgZGF0YToKLSAgICAqIHBuZ19ieXRlIG5hbWVbNV07Ci0gICAgKiBwbmdfYnl0ZSAqZGF0YTsKLSAgICAqIHBuZ19zaXplX3Qgc2l6ZTsKLSAgICAqCi0gICAgKiBOb3RlIHRoYXQgbGlicG5nIGhhcyBhbHJlYWR5IHRha2VuIGNhcmUgb2YgdGhlIENSQyBoYW5kbGluZy4KLSAgICAqLwotCi0gICBpZiAoY2h1bmstPm5hbWVbMF0gPT0gMTE1ICYmIGNodW5rLT5uYW1lWzFdID09ICA4NCAmJiAgICAgLyogcyAgVCAqLwotICAgICAgIGNodW5rLT5uYW1lWzJdID09ICA2OSAmJiBjaHVuay0+bmFtZVszXSA9PSAgODIpICAgICAgIC8qIEUgIFIgKi8KLSAgICAgIHsKLSAgICAgICAgIC8qIEZvdW5kIHNURVIgY2h1bmsgKi8KLSAgICAgICAgIGlmIChjaHVuay0+c2l6ZSAhPSAxKQotICAgICAgICAgICAgcmV0dXJuICgtMSk7IC8qIEVycm9yIHJldHVybiAqLwotICAgICAgICAgaWYgKGNodW5rLT5kYXRhWzBdICE9IDAgJiYgY2h1bmstPmRhdGFbMF0gIT0gMSkKLSAgICAgICAgICAgIHJldHVybiAoLTEpOyAgLyogSW52YWxpZCBtb2RlICovCi0gICAgICAgICBteV91c2VyX2NodW5rX2RhdGE9KHBuZ191aW50XzMyICopIHBuZ19nZXRfdXNlcl9jaHVua19wdHIocG5nX3B0cik7Ci0gICAgICAgICBteV91c2VyX2NodW5rX2RhdGFbMF09Y2h1bmstPmRhdGFbMF0rMTsKLSAgICAgICAgIHJldHVybiAoMSk7Ci0gICAgICB9Ci0KLSAgIGlmIChjaHVuay0+bmFtZVswXSAhPSAxMTggfHwgY2h1bmstPm5hbWVbMV0gIT0gMTEyIHx8ICAgIC8qIHYgIHAgKi8KLSAgICAgICBjaHVuay0+bmFtZVsyXSAhPSAgNjUgfHwgY2h1bmstPm5hbWVbM10gIT0gMTAzKSAgICAgIC8qIEEgIGcgKi8KLSAgICAgIHJldHVybiAoMCk7IC8qIERpZCBub3QgcmVjb2duaXplICovCi0KLSAgIC8qIEZvdW5kIEltYWdlTWFnaWNrIHZwQWcgY2h1bmsgKi8KLQotICAgaWYgKGNodW5rLT5zaXplICE9IDkpCi0gICAgICByZXR1cm4gKC0xKTsgLyogRXJyb3IgcmV0dXJuICovCi0KLSAgIG15X3VzZXJfY2h1bmtfZGF0YT0ocG5nX3VpbnRfMzIgKikgcG5nX2dldF91c2VyX2NodW5rX3B0cihwbmdfcHRyKTsKLQotICAgbXlfdXNlcl9jaHVua19kYXRhWzFdPXBuZ19nZXRfdWludF8zMShwbmdfcHRyLCBjaHVuay0+ZGF0YSk7Ci0gICBteV91c2VyX2NodW5rX2RhdGFbMl09cG5nX2dldF91aW50XzMxKHBuZ19wdHIsIGNodW5rLT5kYXRhICsgNCk7Ci0gICBteV91c2VyX2NodW5rX2RhdGFbM109KHBuZ191aW50XzMyKWNodW5rLT5kYXRhWzhdOwotCi0gICByZXR1cm4gKDEpOwotCi19Ci0jZW5kaWYKLS8qIEVORCBvZiBjb2RlIHRvIGRlbW9uc3RyYXRlIHVzZXIgY2h1bmsgc3VwcG9ydCAqLwotCi0vKiBUZXN0IG9uZSBmaWxlICovCi1pbnQKLXRlc3Rfb25lX2ZpbGUoUE5HX0NPTlNUIGNoYXIgKmlubmFtZSwgUE5HX0NPTlNUIGNoYXIgKm91dG5hbWUpCi17Ci0gICBzdGF0aWMgcG5nX0ZJTEVfcCBmcGluOwotICAgc3RhdGljIHBuZ19GSUxFX3AgZnBvdXQ7ICAvKiAic3RhdGljIiBwcmV2ZW50cyBzZXRqbXAgY29ycnVwdGlvbiAqLwotICAgcG5nX3N0cnVjdHAgcmVhZF9wdHI7Ci0gICBwbmdfaW5mb3AgcmVhZF9pbmZvX3B0ciwgZW5kX2luZm9fcHRyOwotI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKLSAgIHBuZ19zdHJ1Y3RwIHdyaXRlX3B0cjsKLSAgIHBuZ19pbmZvcCB3cml0ZV9pbmZvX3B0cjsKLSAgIHBuZ19pbmZvcCB3cml0ZV9lbmRfaW5mb19wdHI7Ci0jZWxzZQotICAgcG5nX3N0cnVjdHAgd3JpdGVfcHRyID0gTlVMTDsKLSAgIHBuZ19pbmZvcCB3cml0ZV9pbmZvX3B0ciA9IE5VTEw7Ci0gICBwbmdfaW5mb3Agd3JpdGVfZW5kX2luZm9fcHRyID0gTlVMTDsKLSNlbmRpZgotICAgcG5nX2J5dGVwIHJvd19idWY7Ci0gICBwbmdfdWludF8zMiB5OwotICAgcG5nX3VpbnRfMzIgd2lkdGgsIGhlaWdodDsKLSAgIGludCBudW1fcGFzcywgcGFzczsKLSAgIGludCBiaXRfZGVwdGgsIGNvbG9yX3R5cGU7Ci0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSNpZmRlZiBVU0VfRkFSX0tFWVdPUkQKLSAgIGptcF9idWYgam1wYnVmOwotI2VuZGlmCi0jZW5kaWYKLQotICAgY2hhciBpbmJ1ZlsyNTZdLCBvdXRidWZbMjU2XTsKLQotICAgcm93X2J1ZiA9IE5VTEw7Ci0KLSAgIGlmICgoZnBpbiA9IGZvcGVuKGlubmFtZSwgInJiIikpID09IE5VTEwpCi0gICB7Ci0gICAgICBmcHJpbnRmKFNUREVSUiwgIkNvdWxkIG5vdCBmaW5kIGlucHV0IGZpbGUgJXNcbiIsIGlubmFtZSk7Ci0gICAgICByZXR1cm4gKDEpOwotICAgfQotCi0gICBpZiAoKGZwb3V0ID0gZm9wZW4ob3V0bmFtZSwgIndiIikpID09IE5VTEwpCi0gICB7Ci0gICAgICBmcHJpbnRmKFNUREVSUiwgIkNvdWxkIG5vdCBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCBvdXRuYW1lKTsKLSAgICAgIEZDTE9TRShmcGluKTsKLSAgICAgIHJldHVybiAoMSk7Ci0gICB9Ci0KLSAgIHBuZ3Rlc3RfZGVidWcoIkFsbG9jYXRpbmcgcmVhZCBhbmQgd3JpdGUgc3RydWN0dXJlcyIpOwotI2lmIGRlZmluZWQoUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCkgJiYgUE5HX0RFQlVHCi0gICByZWFkX3B0ciA9Ci0gICAgICBwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBOVUxMLAotICAgICAgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAgIChwbmdfbWFsbG9jX3B0cilwbmd0ZXN0X2RlYnVnX21hbGxvYywgKHBuZ19mcmVlX3B0cilwbmd0ZXN0X2RlYnVnX2ZyZWUpOwotI2Vsc2UKLSAgIHJlYWRfcHRyID0KLSAgICAgIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBOVUxMLCBOVUxMLCBOVUxMKTsKLSNlbmRpZgotI2lmbmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECi0gICBwbmdfc2V0X2Vycm9yX2ZuKHJlYWRfcHRyLCAocG5nX3ZvaWRwKWlubmFtZSwgcG5ndGVzdF9lcnJvciwKLSAgICAgICBwbmd0ZXN0X3dhcm5pbmcpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECi0gICB1c2VyX2NodW5rX2RhdGFbMF0gPSAwOwotICAgdXNlcl9jaHVua19kYXRhWzFdID0gMDsKLSAgIHVzZXJfY2h1bmtfZGF0YVsyXSA9IDA7Ci0gICB1c2VyX2NodW5rX2RhdGFbM10gPSAwOwotICAgcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4ocmVhZF9wdHIsIHVzZXJfY2h1bmtfZGF0YSwKLSAgICAgcmVhZF91c2VyX2NodW5rX2NhbGxiYWNrKTsKLQotI2VuZGlmCi0jaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAotI2lmIGRlZmluZWQoUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCkgJiYgUE5HX0RFQlVHCi0gICB3cml0ZV9wdHIgPQotICAgICAgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMihQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIE5VTEwsCi0gICAgICBOVUxMLCBOVUxMLCBOVUxMLCBwbmd0ZXN0X2RlYnVnX21hbGxvYywgcG5ndGVzdF9kZWJ1Z19mcmVlKTsKLSNlbHNlCi0gICB3cml0ZV9wdHIgPQotICAgICAgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBOVUxMLCBOVUxMLCBOVUxMKTsKLSNlbmRpZgotI2lmbmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECi0gICBwbmdfc2V0X2Vycm9yX2ZuKHdyaXRlX3B0ciwgKHBuZ192b2lkcClpbm5hbWUsIHBuZ3Rlc3RfZXJyb3IsCi0gICAgICAgcG5ndGVzdF93YXJuaW5nKTsKLSNlbmRpZgotI2VuZGlmCi0gICBwbmd0ZXN0X2RlYnVnKCJBbGxvY2F0aW5nIHJlYWRfaW5mbywgd3JpdGVfaW5mbyBhbmQgZW5kX2luZm8gc3RydWN0dXJlcyIpOwotICAgcmVhZF9pbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocmVhZF9wdHIpOwotICAgZW5kX2luZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChyZWFkX3B0cik7Ci0jaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAotICAgd3JpdGVfaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHdyaXRlX3B0cik7Ci0gICB3cml0ZV9lbmRfaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHdyaXRlX3B0cik7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0gICBwbmd0ZXN0X2RlYnVnKCJTZXR0aW5nIGptcGJ1ZiBmb3IgcmVhZCBzdHJ1Y3QiKTsKLSNpZmRlZiBVU0VfRkFSX0tFWVdPUkQKLSAgIGlmIChzZXRqbXAoam1wYnVmKSkKLSNlbHNlCi0gICBpZiAoc2V0am1wKHBuZ19qbXBidWYocmVhZF9wdHIpKSkKLSNlbmRpZgotICAgewotICAgICAgZnByaW50ZihTVERFUlIsICIlcyAtPiAlczogbGlicG5nIHJlYWQgZXJyb3JcbiIsIGlubmFtZSwgb3V0bmFtZSk7Ci0gICAgICBwbmdfZnJlZShyZWFkX3B0ciwgcm93X2J1Zik7Ci0gICAgICByb3dfYnVmID0gTlVMTDsKLSAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZyZWFkX3B0ciwgJnJlYWRfaW5mb19wdHIsICZlbmRfaW5mb19wdHIpOwotI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKLSAgICAgIHBuZ19kZXN0cm95X2luZm9fc3RydWN0KHdyaXRlX3B0ciwgJndyaXRlX2VuZF9pbmZvX3B0cik7Ci0gICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJndyaXRlX3B0ciwgJndyaXRlX2luZm9fcHRyKTsKLSNlbmRpZgotICAgICAgRkNMT1NFKGZwaW4pOwotICAgICAgRkNMT1NFKGZwb3V0KTsKLSAgICAgIHJldHVybiAoMSk7Ci0gICB9Ci0jaWZkZWYgVVNFX0ZBUl9LRVlXT1JECi0gICBwbmdfbWVtY3B5KHBuZ19qbXBidWYocmVhZF9wdHIpLCBqbXBidWYsIHBuZ19zaXplb2Yoam1wX2J1ZikpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECi0gICBwbmd0ZXN0X2RlYnVnKCJTZXR0aW5nIGptcGJ1ZiBmb3Igd3JpdGUgc3RydWN0Iik7Ci0jaWZkZWYgVVNFX0ZBUl9LRVlXT1JECi0gICBpZiAoc2V0am1wKGptcGJ1ZikpCi0jZWxzZQotICAgaWYgKHNldGptcChwbmdfam1wYnVmKHdyaXRlX3B0cikpKQotI2VuZGlmCi0gICB7Ci0gICAgICBmcHJpbnRmKFNUREVSUiwgIiVzIC0+ICVzOiBsaWJwbmcgd3JpdGUgZXJyb3JcbiIsIGlubmFtZSwgb3V0bmFtZSk7Ci0gICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcmVhZF9wdHIsICZyZWFkX2luZm9fcHRyLCAmZW5kX2luZm9fcHRyKTsKLSAgICAgIHBuZ19kZXN0cm95X2luZm9fc3RydWN0KHdyaXRlX3B0ciwgJndyaXRlX2VuZF9pbmZvX3B0cik7Ci0jaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAotICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZ3cml0ZV9wdHIsICZ3cml0ZV9pbmZvX3B0cik7Ci0jZW5kaWYKLSAgICAgIEZDTE9TRShmcGluKTsKLSAgICAgIEZDTE9TRShmcG91dCk7Ci0gICAgICByZXR1cm4gKDEpOwotICAgfQotI2lmZGVmIFVTRV9GQVJfS0VZV09SRAotICAgcG5nX21lbWNweShwbmdfam1wYnVmKHdyaXRlX3B0ciksIGptcGJ1ZiwgcG5nX3NpemVvZihqbXBfYnVmKSk7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSAgIHBuZ3Rlc3RfZGVidWcoIkluaXRpYWxpemluZyBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMiKTsKLSNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECi0gICBwbmdfaW5pdF9pbyhyZWFkX3B0ciwgZnBpbik7Ci0jICBpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECi0gICBwbmdfaW5pdF9pbyh3cml0ZV9wdHIsIGZwb3V0KTsKLSMgIGVuZGlmCi0jZWxzZQotICAgcG5nX3NldF9yZWFkX2ZuKHJlYWRfcHRyLCAocG5nX3ZvaWRwKWZwaW4sIHBuZ3Rlc3RfcmVhZF9kYXRhKTsKLSMgIGlmZGVmIFBOR19XUklURV9TVVBQT1JURUQKLSAgIHBuZ19zZXRfd3JpdGVfZm4od3JpdGVfcHRyLCAocG5nX3ZvaWRwKWZwb3V0LCAgcG5ndGVzdF93cml0ZV9kYXRhLAotIyAgICBpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECi0gICAgICBwbmd0ZXN0X2ZsdXNoKTsKLSMgICAgZWxzZQotICAgICAgTlVMTCk7Ci0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0gICBpZiAoc3RhdHVzX2RvdHNfcmVxdWVzdGVkID09IDEpCi0gICB7Ci0jaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAotICAgICAgcG5nX3NldF93cml0ZV9zdGF0dXNfZm4od3JpdGVfcHRyLCB3cml0ZV9yb3dfY2FsbGJhY2spOwotI2VuZGlmCi0gICAgICBwbmdfc2V0X3JlYWRfc3RhdHVzX2ZuKHJlYWRfcHRyLCByZWFkX3Jvd19jYWxsYmFjayk7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0jaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAotICAgICAgcG5nX3NldF93cml0ZV9zdGF0dXNfZm4od3JpdGVfcHRyLCBOVUxMKTsKLSNlbmRpZgotICAgICAgcG5nX3NldF9yZWFkX3N0YXR1c19mbihyZWFkX3B0ciwgTlVMTCk7Ci0gICB9Ci0KLSNpZmRlZiBQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKLSAgIHsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaTwyNTY7IGkrKykKLSAgICAgICAgIGZpbHRlcnNfdXNlZFtpXSA9IDA7Ci0gICAgICBwbmdfc2V0X3JlYWRfdXNlcl90cmFuc2Zvcm1fZm4ocmVhZF9wdHIsIGNvdW50X2ZpbHRlcnMpOwotICAgfQotI2VuZGlmCi0jaWZkZWYgUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAotICAgemVyb19zYW1wbGVzID0gMDsKLSAgIHBuZ19zZXRfd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4od3JpdGVfcHRyLCBjb3VudF96ZXJvX3NhbXBsZXMpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfSEFORExFX0NIVU5LX0FMV0FZUwotIyAgICBkZWZpbmUgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMgICAgICAgMwotIyAgZW5kaWYKLSAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhyZWFkX3B0ciwgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMsCi0gICAgICBOVUxMLCAwKTsKLSNlbmRpZgotI2lmZGVmIFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkUKLSMgICAgZGVmaW5lIFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRSAgICAgIDIKLSMgIGVuZGlmCi0gICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3Mod3JpdGVfcHRyLCBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkUsCi0gICAgICBOVUxMLCAwKTsKLSNlbmRpZgotCi0gICBwbmd0ZXN0X2RlYnVnKCJSZWFkaW5nIGluZm8gc3RydWN0Iik7Ci0gICBwbmdfcmVhZF9pbmZvKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyKTsKLQotICAgcG5ndGVzdF9kZWJ1ZygiVHJhbnNmZXJyaW5nIGluZm8gc3RydWN0Iik7Ci0gICB7Ci0gICAgICBpbnQgaW50ZXJsYWNlX3R5cGUsIGNvbXByZXNzaW9uX3R5cGUsIGZpbHRlcl90eXBlOwotCi0gICAgICBpZiAocG5nX2dldF9JSERSKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmd2lkdGgsICZoZWlnaHQsICZiaXRfZGVwdGgsCi0gICAgICAgICAgJmNvbG9yX3R5cGUsICZpbnRlcmxhY2VfdHlwZSwgJmNvbXByZXNzaW9uX3R5cGUsICZmaWx0ZXJfdHlwZSkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfc2V0X0lIRFIod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgd2lkdGgsIGhlaWdodCwgYml0X2RlcHRoLAotI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSAgICAgICAgICAgIGNvbG9yX3R5cGUsIGludGVybGFjZV90eXBlLCBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfdHlwZSk7Ci0jZWxzZQotICAgICAgICAgICAgY29sb3JfdHlwZSwgUE5HX0lOVEVSTEFDRV9OT05FLCBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfdHlwZSk7Ci0jZW5kaWYKLSAgICAgIH0KLSAgIH0KLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi0jaWZkZWYgUE5HX2NIUk1fU1VQUE9SVEVECi0gICB7Ci0gICAgICBwbmdfZml4ZWRfcG9pbnQgd2hpdGVfeCwgd2hpdGVfeSwgcmVkX3gsIHJlZF95LCBncmVlbl94LCBncmVlbl95LCBibHVlX3gsCi0gICAgICAgICBibHVlX3k7Ci0gICAgICBpZiAocG5nX2dldF9jSFJNX2ZpeGVkKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmd2hpdGVfeCwgJndoaXRlX3ksCi0gICAgICAgICAmcmVkX3gsICZyZWRfeSwgJmdyZWVuX3gsICZncmVlbl95LCAmYmx1ZV94LCAmYmx1ZV95KSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19zZXRfY0hSTV9maXhlZCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCB3aGl0ZV94LCB3aGl0ZV95LCByZWRfeCwKLSAgICAgICAgICAgIHJlZF95LCBncmVlbl94LCBncmVlbl95LCBibHVlX3gsIGJsdWVfeSk7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLSNpZmRlZiBQTkdfZ0FNQV9TVVBQT1JURUQKLSAgIHsKLSAgICAgIHBuZ19maXhlZF9wb2ludCBnYW1tYTsKLQotICAgICAgaWYgKHBuZ19nZXRfZ0FNQV9maXhlZChyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJmdhbW1hKSkKLSAgICAgICAgIHBuZ19zZXRfZ0FNQV9maXhlZCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBnYW1tYSk7Ci0gICB9Ci0jZW5kaWYKLSNlbHNlIC8qIFVzZSBmbG9hdGluZyBwb2ludCB2ZXJzaW9ucyAqLwotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSNpZmRlZiBQTkdfY0hSTV9TVVBQT1JURUQKLSAgIHsKLSAgICAgIGRvdWJsZSB3aGl0ZV94LCB3aGl0ZV95LCByZWRfeCwgcmVkX3ksIGdyZWVuX3gsIGdyZWVuX3ksIGJsdWVfeCwKLSAgICAgICAgIGJsdWVfeTsKLSAgICAgIGlmIChwbmdfZ2V0X2NIUk0ocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZ3aGl0ZV94LCAmd2hpdGVfeSwgJnJlZF94LAotICAgICAgICAgJnJlZF95LCAmZ3JlZW5feCwgJmdyZWVuX3ksICZibHVlX3gsICZibHVlX3kpKQotICAgICAgewotICAgICAgICAgcG5nX3NldF9jSFJNKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIHdoaXRlX3gsIHdoaXRlX3ksIHJlZF94LAotICAgICAgICAgICAgcmVkX3ksIGdyZWVuX3gsIGdyZWVuX3ksIGJsdWVfeCwgYmx1ZV95KTsKLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotI2lmZGVmIFBOR19nQU1BX1NVUFBPUlRFRAotICAgewotICAgICAgZG91YmxlIGdhbW1hOwotCi0gICAgICBpZiAocG5nX2dldF9nQU1BKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmZ2FtbWEpKQotICAgICAgICAgcG5nX3NldF9nQU1BKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIGdhbW1hKTsKLSAgIH0KLSNlbmRpZgotI2VuZGlmIC8qIEZsb2F0aW5nIHBvaW50ICovCi0jZW5kaWYgLyogRml4ZWQgcG9pbnQgKi8KLSNpZmRlZiBQTkdfaUNDUF9TVVBQT1JURUQKLSAgIHsKLSAgICAgIHBuZ19jaGFycCBuYW1lOwotICAgICAgcG5nX2NoYXJwIHByb2ZpbGU7Ci0gICAgICBwbmdfdWludF8zMiBwcm9mbGVuOwotICAgICAgaW50IGNvbXByZXNzaW9uX3R5cGU7Ci0KLSAgICAgIGlmIChwbmdfZ2V0X2lDQ1AocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZuYW1lLCAmY29tcHJlc3Npb25fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAmcHJvZmlsZSwgJnByb2ZsZW4pKQotICAgICAgewotICAgICAgICAgcG5nX3NldF9pQ0NQKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIG5hbWUsIGNvbXByZXNzaW9uX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSwgcHJvZmxlbik7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLSNpZmRlZiBQTkdfc1JHQl9TVVBQT1JURUQKLSAgIHsKLSAgICAgIGludCBpbnRlbnQ7Ci0KLSAgICAgIGlmIChwbmdfZ2V0X3NSR0IocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZpbnRlbnQpKQotICAgICAgICAgcG5nX3NldF9zUkdCKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIGludGVudCk7Ci0gICB9Ci0jZW5kaWYKLSAgIHsKLSAgICAgIHBuZ19jb2xvcnAgcGFsZXR0ZTsKLSAgICAgIGludCBudW1fcGFsZXR0ZTsKLQotICAgICAgaWYgKHBuZ19nZXRfUExURShyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJnBhbGV0dGUsICZudW1fcGFsZXR0ZSkpCi0gICAgICAgICBwbmdfc2V0X1BMVEUod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgcGFsZXR0ZSwgbnVtX3BhbGV0dGUpOwotICAgfQotI2lmZGVmIFBOR19iS0dEX1NVUFBPUlRFRAotICAgewotICAgICAgcG5nX2NvbG9yXzE2cCBiYWNrZ3JvdW5kOwotCi0gICAgICBpZiAocG5nX2dldF9iS0dEKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmYmFja2dyb3VuZCkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfc2V0X2JLR0Qod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgYmFja2dyb3VuZCk7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLSNpZmRlZiBQTkdfaElTVF9TVVBQT1JURUQKLSAgIHsKLSAgICAgIHBuZ191aW50XzE2cCBoaXN0OwotCi0gICAgICBpZiAocG5nX2dldF9oSVNUKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmaGlzdCkpCi0gICAgICAgICBwbmdfc2V0X2hJU1Qod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgaGlzdCk7Ci0gICB9Ci0jZW5kaWYKLSNpZmRlZiBQTkdfb0ZGc19TVVBQT1JURUQKLSAgIHsKLSAgICAgIHBuZ19pbnRfMzIgb2Zmc2V0X3gsIG9mZnNldF95OwotICAgICAgaW50IHVuaXRfdHlwZTsKLQotICAgICAgaWYgKHBuZ19nZXRfb0ZGcyhyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJm9mZnNldF94LCAmb2Zmc2V0X3ksCi0gICAgICAgICAgJnVuaXRfdHlwZSkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfc2V0X29GRnMod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgb2Zmc2V0X3gsIG9mZnNldF95LCB1bml0X3R5cGUpOwotICAgICAgfQotICAgfQotI2VuZGlmCi0jaWZkZWYgUE5HX3BDQUxfU1VQUE9SVEVECi0gICB7Ci0gICAgICBwbmdfY2hhcnAgcHVycG9zZSwgdW5pdHM7Ci0gICAgICBwbmdfY2hhcnBwIHBhcmFtczsKLSAgICAgIHBuZ19pbnRfMzIgWDAsIFgxOwotICAgICAgaW50IHR5cGUsIG5wYXJhbXM7Ci0KLSAgICAgIGlmIChwbmdfZ2V0X3BDQUwocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZwdXJwb3NlLCAmWDAsICZYMSwgJnR5cGUsCi0gICAgICAgICAmbnBhcmFtcywgJnVuaXRzLCAmcGFyYW1zKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19zZXRfcENBTCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBwdXJwb3NlLCBYMCwgWDEsIHR5cGUsCi0gICAgICAgICAgICBucGFyYW1zLCB1bml0cywgcGFyYW1zKTsKLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotI2lmZGVmIFBOR19wSFlzX1NVUFBPUlRFRAotICAgewotICAgICAgcG5nX3VpbnRfMzIgcmVzX3gsIHJlc195OwotICAgICAgaW50IHVuaXRfdHlwZTsKLQotICAgICAgaWYgKHBuZ19nZXRfcEhZcyhyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJnJlc194LCAmcmVzX3ksICZ1bml0X3R5cGUpKQotICAgICAgICAgcG5nX3NldF9wSFlzKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIHJlc194LCByZXNfeSwgdW5pdF90eXBlKTsKLSAgIH0KLSNlbmRpZgotI2lmZGVmIFBOR19zQklUX1NVUFBPUlRFRAotICAgewotICAgICAgcG5nX2NvbG9yXzhwIHNpZ19iaXQ7Ci0KLSAgICAgIGlmIChwbmdfZ2V0X3NCSVQocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZzaWdfYml0KSkKLSAgICAgICAgIHBuZ19zZXRfc0JJVCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBzaWdfYml0KTsKLSAgIH0KLSNlbmRpZgotI2lmZGVmIFBOR19zQ0FMX1NVUFBPUlRFRAotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgIHsKLSAgICAgIGludCB1bml0OwotICAgICAgZG91YmxlIHNjYWxfd2lkdGgsIHNjYWxfaGVpZ2h0OwotCi0gICAgICBpZiAocG5nX2dldF9zQ0FMKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmdW5pdCwgJnNjYWxfd2lkdGgsCi0gICAgICAgICAmc2NhbF9oZWlnaHQpKQotICAgICAgewotICAgICAgICAgcG5nX3NldF9zQ0FMKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIHVuaXQsIHNjYWxfd2lkdGgsIHNjYWxfaGVpZ2h0KTsKLSAgICAgIH0KLSAgIH0KLSNlbHNlCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotICAgewotICAgICAgaW50IHVuaXQ7Ci0gICAgICBwbmdfY2hhcnAgc2NhbF93aWR0aCwgc2NhbF9oZWlnaHQ7Ci0KLSAgICAgIGlmIChwbmdfZ2V0X3NDQUxfcyhyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJnVuaXQsICZzY2FsX3dpZHRoLAotICAgICAgICAgICZzY2FsX2hlaWdodCkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfc2V0X3NDQUxfcyh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCB1bml0LCBzY2FsX3dpZHRoLAotICAgICAgICAgICAgIHNjYWxfaGVpZ2h0KTsKLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQKLSAgIHsKLSAgICAgIHBuZ190ZXh0cCB0ZXh0X3B0cjsKLSAgICAgIGludCBudW1fdGV4dDsKLQotICAgICAgaWYgKHBuZ19nZXRfdGV4dChyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJnRleHRfcHRyLCAmbnVtX3RleHQpID4gMCkKLSAgICAgIHsKLSAgICAgICAgIHBuZ3Rlc3RfZGVidWcxKCJIYW5kbGluZyAlZCBpVFh0L3RFWHQvelRYdCBjaHVua3MiLCBudW1fdGV4dCk7Ci0gICAgICAgICBwbmdfc2V0X3RleHQod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgdGV4dF9wdHIsIG51bV90ZXh0KTsKLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotI2lmZGVmIFBOR190SU1FX1NVUFBPUlRFRAotICAgewotICAgICAgcG5nX3RpbWVwIG1vZF90aW1lOwotCi0gICAgICBpZiAocG5nX2dldF90SU1FKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmbW9kX3RpbWUpKQotICAgICAgewotICAgICAgICAgcG5nX3NldF90SU1FKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIG1vZF90aW1lKTsKLSNpZmRlZiBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRAotICAgICAgICAgLyogV2UgaGF2ZSB0byB1c2UgcG5nX21lbWNweSBpbnN0ZWFkIG9mICI9IiBiZWNhdXNlIHRoZSBzdHJpbmcKLSAgICAgICAgICAqIHBvaW50ZWQgdG8gYnkgcG5nX2NvbnZlcnRfdG9fcmZjMTEyMygpIGdldHMgZnJlZSdlZCBiZWZvcmUKLSAgICAgICAgICAqIHdlIHVzZSBpdC4KLSAgICAgICAgICAqLwotICAgICAgICAgcG5nX21lbWNweSh0SU1FX3N0cmluZywKLSAgICAgICAgICAgICAgICAgICAgcG5nX2NvbnZlcnRfdG9fcmZjMTEyMyhyZWFkX3B0ciwgbW9kX3RpbWUpLAotICAgICAgICAgICAgICAgICAgICBwbmdfc2l6ZW9mKHRJTUVfc3RyaW5nKSk7Ci0gICAgICAgICB0SU1FX3N0cmluZ1twbmdfc2l6ZW9mKHRJTUVfc3RyaW5nKSAtIDFdID0gJ1wwJzsKLSAgICAgICAgIHRJTUVfY2h1bmtfcHJlc2VudCsrOwotI2VuZGlmIC8qIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVEICovCi0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLSNpZmRlZiBQTkdfdFJOU19TVVBQT1JURUQKLSAgIHsKLSAgICAgIHBuZ19ieXRlcCB0cmFuc19hbHBoYTsKLSAgICAgIGludCBudW1fdHJhbnM7Ci0gICAgICBwbmdfY29sb3JfMTZwIHRyYW5zX2NvbG9yOwotCi0gICAgICBpZiAocG5nX2dldF90Uk5TKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmdHJhbnNfYWxwaGEsICZudW1fdHJhbnMsCi0gICAgICAgICAmdHJhbnNfY29sb3IpKQotICAgICAgewotICAgICAgICAgaW50IHNhbXBsZV9tYXggPSAoMSA8PCBiaXRfZGVwdGgpOwotICAgICAgICAgLyogbGlicG5nIGRvZXNuJ3QgcmVqZWN0IGEgdFJOUyBjaHVuayB3aXRoIG91dC1vZi1yYW5nZSBzYW1wbGVzICovCi0gICAgICAgICBpZiAoISgoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmCi0gICAgICAgICAgICAgKGludCl0cmFuc19jb2xvci0+Z3JheSA+IHNhbXBsZV9tYXgpIHx8Ci0gICAgICAgICAgICAgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCICYmCi0gICAgICAgICAgICAgKChpbnQpdHJhbnNfY29sb3ItPnJlZCA+IHNhbXBsZV9tYXggfHwKLSAgICAgICAgICAgICAoaW50KXRyYW5zX2NvbG9yLT5ncmVlbiA+IHNhbXBsZV9tYXggfHwKLSAgICAgICAgICAgICAoaW50KXRyYW5zX2NvbG9yLT5ibHVlID4gc2FtcGxlX21heCkpKSkKLSAgICAgICAgICAgIHBuZ19zZXRfdFJOUyh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCB0cmFuc19hbHBoYSwgbnVtX3RyYW5zLAotICAgICAgICAgICAgICAgdHJhbnNfY29sb3IpOwotICAgICAgfQotICAgfQotI2VuZGlmCi0jaWZkZWYgUE5HX1dSSVRFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAotICAgewotICAgICAgcG5nX3Vua25vd25fY2h1bmtwIHVua25vd25zOwotICAgICAgaW50IG51bV91bmtub3ducyA9IChpbnQpcG5nX2dldF91bmtub3duX2NodW5rcyhyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwKLSAgICAgICAgICZ1bmtub3ducyk7Ci0gICAgICBpZiAobnVtX3Vua25vd25zKQotICAgICAgewotICAgICAgICAgcG5nX3NpemVfdCBpOwotICAgICAgICAgcG5nX3NldF91bmtub3duX2NodW5rcyh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCB1bmtub3ducywKLSAgICAgICAgICAgbnVtX3Vua25vd25zKTsKLSAgICAgICAgIC8qIENvcHkgdGhlIGxvY2F0aW9ucyBmcm9tIHRoZSByZWFkX2luZm9fcHRyLiAgVGhlIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgICAqIGdlbmVyYXRlZCBsb2NhdGlvbnMgaW4gd3JpdGVfaW5mb19wdHIgYXJlIHdyb25nIGJlY2F1c2Ugd2UKLSAgICAgICAgICAqIGhhdmVuJ3Qgd3JpdHRlbiBhbnl0aGluZyB5ZXQuCi0gICAgICAgICAgKi8KLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAocG5nX3NpemVfdCludW1fdW5rbm93bnM7IGkrKykKLSAgICAgICAgICAgcG5nX3NldF91bmtub3duX2NodW5rX2xvY2F0aW9uKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIGksCi0gICAgICAgICAgICAgdW5rbm93bnNbaV0ubG9jYXRpb24pOwotICAgICAgfQotICAgfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECi0gICBwbmd0ZXN0X2RlYnVnKCJXcml0aW5nIGluZm8gc3RydWN0Iik7Ci0KLS8qIElmIHdlIHdhbnRlZCwgd2UgY291bGQgd3JpdGUgaW5mbyBpbiB0d28gc3RlcHM6Ci0gKiBwbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURSh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyKTsKLSAqLwotICAgcG5nX3dyaXRlX2luZm8od3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0cik7Ci0KLSNpZmRlZiBQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECi0gICBpZiAodXNlcl9jaHVua19kYXRhWzBdICE9IDApCi0gICB7Ci0gICAgICBwbmdfYnl0ZSBwbmdfc1RFUls1XSA9IHsxMTUsICA4NCwgIDY5LCAgODIsICdcMCd9OwotCi0gICAgICB1bnNpZ25lZCBjaGFyCi0gICAgICAgIHN0ZXJfY2h1bmtfZGF0YVsxXTsKLQotICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICBmcHJpbnRmKFNUREVSUiwgIlxuIHN0ZXJlbyBtb2RlID0gJWx1XG4iLAotICAgICAgICAgICAodW5zaWduZWQgbG9uZykodXNlcl9jaHVua19kYXRhWzBdIC0gMSkpOwotICAgICAgc3Rlcl9jaHVua19kYXRhWzBdPSh1bnNpZ25lZCBjaGFyKSh1c2VyX2NodW5rX2RhdGFbMF0gLSAxKTsKLSAgICAgIHBuZ193cml0ZV9jaHVuayh3cml0ZV9wdHIsIHBuZ19zVEVSLCBzdGVyX2NodW5rX2RhdGEsIDEpOwotICAgfQotICAgaWYgKHVzZXJfY2h1bmtfZGF0YVsxXSAhPSAwIHx8IHVzZXJfY2h1bmtfZGF0YVsyXSAhPSAwKQotICAgewotICAgICAgcG5nX2J5dGUgcG5nX3ZwQWdbNV0gPSB7MTE4LCAxMTIsICA2NSwgMTAzLCAnXDAnfTsKLQotICAgICAgdW5zaWduZWQgY2hhcgotICAgICAgICB2cGFnX2NodW5rX2RhdGFbOV07Ci0KLSAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgZnByaW50ZihTVERFUlIsICIgdnBBZyA9ICVsdSB4ICVsdSwgdW5pdHMgPSAlbHVcbiIsCi0gICAgICAgICAgICh1bnNpZ25lZCBsb25nKXVzZXJfY2h1bmtfZGF0YVsxXSwKLSAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpdXNlcl9jaHVua19kYXRhWzJdLAotICAgICAgICAgICAodW5zaWduZWQgbG9uZyl1c2VyX2NodW5rX2RhdGFbM10pOwotICAgICAgcG5nX3NhdmVfdWludF8zMih2cGFnX2NodW5rX2RhdGEsIHVzZXJfY2h1bmtfZGF0YVsxXSk7Ci0gICAgICBwbmdfc2F2ZV91aW50XzMyKHZwYWdfY2h1bmtfZGF0YSArIDQsIHVzZXJfY2h1bmtfZGF0YVsyXSk7Ci0gICAgICB2cGFnX2NodW5rX2RhdGFbOF0gPSAodW5zaWduZWQgY2hhcikodXNlcl9jaHVua19kYXRhWzNdICYgMHhmZik7Ci0gICAgICBwbmdfd3JpdGVfY2h1bmsod3JpdGVfcHRyLCBwbmdfdnBBZywgdnBhZ19jaHVua19kYXRhLCA5KTsKLSAgIH0KLQotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFNJTkdMRV9ST1dCVUZfQUxMT0MKLSAgIHBuZ3Rlc3RfZGVidWcoIkFsbG9jYXRpbmcgcm93IGJ1ZmZlci4uLiIpOwotICAgcm93X2J1ZiA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhyZWFkX3B0ciwKLSAgICAgIHBuZ19nZXRfcm93Ynl0ZXMocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIpKTsKLSAgIHBuZ3Rlc3RfZGVidWcxKCIweCUwOGx4IiwgKHVuc2lnbmVkIGxvbmcpcm93X2J1Zik7Ci0jZW5kaWYgLyogU0lOR0xFX1JPV0JVRl9BTExPQyAqLwotICAgcG5ndGVzdF9kZWJ1ZygiV3JpdGluZyByb3cgZGF0YSIpOwotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQpIHx8IFwKLSAgZGVmaW5lZChQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVEKQotICAgbnVtX3Bhc3MgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhyZWFkX3B0cik7Ci0jICBpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECi0gICBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyh3cml0ZV9wdHIpOwotIyAgZW5kaWYKLSNlbHNlCi0gICBudW1fcGFzcyA9IDE7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR1RFU1RfVElNSU5HCi0gICB0X3N0b3AgPSAoZmxvYXQpY2xvY2soKTsKLSAgIHRfbWlzYyArPSAodF9zdG9wIC0gdF9zdGFydCk7Ci0gICB0X3N0YXJ0ID0gdF9zdG9wOwotI2VuZGlmCi0gICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgbnVtX3Bhc3M7IHBhc3MrKykKLSAgIHsKLSAgICAgIHBuZ3Rlc3RfZGVidWcxKCJXcml0aW5nIHJvdyBkYXRhIGZvciBwYXNzICVkIiwgcGFzcyk7Ci0gICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCi0gICAgICB7Ci0jaWZuZGVmIFNJTkdMRV9ST1dCVUZfQUxMT0MKLSAgICAgICAgIHBuZ3Rlc3RfZGVidWcyKCJBbGxvY2F0aW5nIHJvdyBidWZmZXIgKHBhc3MgJWQsIHkgPSAlbGQpLi4uIiwgcGFzcywgeSk7Ci0gICAgICAgICByb3dfYnVmID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHJlYWRfcHRyLAotICAgICAgICAgICAgcG5nX2dldF9yb3dieXRlcyhyZWFkX3B0ciwgcmVhZF9pbmZvX3B0cikpOwotICAgICAgICAgcG5ndGVzdF9kZWJ1ZzIoIjB4JTA4bHggKCVsZCBieXRlcykiLCAodW5zaWduZWQgbG9uZylyb3dfYnVmLAotICAgICAgICAgICAgcG5nX2dldF9yb3dieXRlcyhyZWFkX3B0ciwgcmVhZF9pbmZvX3B0cikpOwotI2VuZGlmIC8qICFTSU5HTEVfUk9XQlVGX0FMTE9DICovCi0gICAgICAgICBwbmdfcmVhZF9yb3dzKHJlYWRfcHRyLCAocG5nX2J5dGVwcCkmcm93X2J1ZiwgTlVMTCwgMSk7Ci0KLSNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECi0jaWZkZWYgUE5HVEVTVF9USU1JTkcKLSAgICAgICAgIHRfc3RvcCA9IChmbG9hdCljbG9jaygpOwotICAgICAgICAgdF9kZWNvZGUgKz0gKHRfc3RvcCAtIHRfc3RhcnQpOwotICAgICAgICAgdF9zdGFydCA9IHRfc3RvcDsKLSNlbmRpZgotICAgICAgICAgcG5nX3dyaXRlX3Jvd3Mod3JpdGVfcHRyLCAocG5nX2J5dGVwcCkmcm93X2J1ZiwgMSk7Ci0jaWZkZWYgUE5HVEVTVF9USU1JTkcKLSAgICAgICAgIHRfc3RvcCA9IChmbG9hdCljbG9jaygpOwotICAgICAgICAgdF9lbmNvZGUgKz0gKHRfc3RvcCAtIHRfc3RhcnQpOwotICAgICAgICAgdF9zdGFydCA9IHRfc3RvcDsKLSNlbmRpZgotI2VuZGlmIC8qIFBOR19XUklURV9TVVBQT1JURUQgKi8KLQotI2lmbmRlZiBTSU5HTEVfUk9XQlVGX0FMTE9DCi0gICAgICAgICBwbmd0ZXN0X2RlYnVnMigiRnJlZWluZyByb3cgYnVmZmVyIChwYXNzICVkLCB5ID0gJWxkKSIsIHBhc3MsIHkpOwotICAgICAgICAgcG5nX2ZyZWUocmVhZF9wdHIsIHJvd19idWYpOwotICAgICAgICAgcm93X2J1ZiA9IE5VTEw7Ci0jZW5kaWYgLyogIVNJTkdMRV9ST1dCVUZfQUxMT0MgKi8KLSAgICAgIH0KLSAgIH0KLQotI2lmZGVmIFBOR19SRUFEX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAotICAgcG5nX2ZyZWVfZGF0YShyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgUE5HX0ZSRUVfVU5LTiwgLTEpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1dSSVRFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAotICAgcG5nX2ZyZWVfZGF0YSh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBQTkdfRlJFRV9VTktOLCAtMSk7Ci0jZW5kaWYKLQotICAgcG5ndGVzdF9kZWJ1ZygiUmVhZGluZyBhbmQgd3JpdGluZyBlbmRfaW5mbyBkYXRhIik7Ci0KLSAgIHBuZ19yZWFkX2VuZChyZWFkX3B0ciwgZW5kX2luZm9fcHRyKTsKLSNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQKLSAgIHsKLSAgICAgIHBuZ190ZXh0cCB0ZXh0X3B0cjsKLSAgICAgIGludCBudW1fdGV4dDsKLQotICAgICAgaWYgKHBuZ19nZXRfdGV4dChyZWFkX3B0ciwgZW5kX2luZm9fcHRyLCAmdGV4dF9wdHIsICZudW1fdGV4dCkgPiAwKQotICAgICAgewotICAgICAgICAgcG5ndGVzdF9kZWJ1ZzEoIkhhbmRsaW5nICVkIGlUWHQvdEVYdC96VFh0IGNodW5rcyIsIG51bV90ZXh0KTsKLSAgICAgICAgIHBuZ19zZXRfdGV4dCh3cml0ZV9wdHIsIHdyaXRlX2VuZF9pbmZvX3B0ciwgdGV4dF9wdHIsIG51bV90ZXh0KTsKLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotI2lmZGVmIFBOR190SU1FX1NVUFBPUlRFRAotICAgewotICAgICAgcG5nX3RpbWVwIG1vZF90aW1lOwotCi0gICAgICBpZiAocG5nX2dldF90SU1FKHJlYWRfcHRyLCBlbmRfaW5mb19wdHIsICZtb2RfdGltZSkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfc2V0X3RJTUUod3JpdGVfcHRyLCB3cml0ZV9lbmRfaW5mb19wdHIsIG1vZF90aW1lKTsKLSNpZmRlZiBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRAotICAgICAgICAgLyogV2UgaGF2ZSB0byB1c2UgcG5nX21lbWNweSBpbnN0ZWFkIG9mICI9IiBiZWNhdXNlIHRoZSBzdHJpbmcKLSAgICAgICAgICAgIHBvaW50ZWQgdG8gYnkgcG5nX2NvbnZlcnRfdG9fcmZjMTEyMygpIGdldHMgZnJlZSdlZCBiZWZvcmUKLSAgICAgICAgICAgIHdlIHVzZSBpdCAqLwotICAgICAgICAgcG5nX21lbWNweSh0SU1FX3N0cmluZywKLSAgICAgICAgICAgICAgICAgICAgcG5nX2NvbnZlcnRfdG9fcmZjMTEyMyhyZWFkX3B0ciwgbW9kX3RpbWUpLAotICAgICAgICAgICAgICAgICAgICBwbmdfc2l6ZW9mKHRJTUVfc3RyaW5nKSk7Ci0gICAgICAgICB0SU1FX3N0cmluZ1twbmdfc2l6ZW9mKHRJTUVfc3RyaW5nKSAtIDFdID0gJ1wwJzsKLSAgICAgICAgIHRJTUVfY2h1bmtfcHJlc2VudCsrOwotI2VuZGlmIC8qIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVEICovCi0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLSNpZmRlZiBQTkdfV1JJVEVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECi0gICB7Ci0gICAgICBwbmdfdW5rbm93bl9jaHVua3AgdW5rbm93bnM7Ci0gICAgICBpbnQgbnVtX3Vua25vd25zOwotICAgICAgbnVtX3Vua25vd25zID0gKGludClwbmdfZ2V0X3Vua25vd25fY2h1bmtzKHJlYWRfcHRyLCBlbmRfaW5mb19wdHIsCi0gICAgICAgICAmdW5rbm93bnMpOwotICAgICAgaWYgKG51bV91bmtub3ducykKLSAgICAgIHsKLSAgICAgICAgIHBuZ19zaXplX3QgaTsKLSAgICAgICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3Mod3JpdGVfcHRyLCB3cml0ZV9lbmRfaW5mb19wdHIsIHVua25vd25zLAotICAgICAgICAgICBudW1fdW5rbm93bnMpOwotICAgICAgICAgLyogQ29weSB0aGUgbG9jYXRpb25zIGZyb20gdGhlIHJlYWRfaW5mb19wdHIuICBUaGUgYXV0b21hdGljYWxseQotICAgICAgICAgICogZ2VuZXJhdGVkIGxvY2F0aW9ucyBpbiB3cml0ZV9lbmRfaW5mb19wdHIgYXJlIHdyb25nIGJlY2F1c2Ugd2UKLSAgICAgICAgICAqIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZW5kX2luZm8geWV0LgotICAgICAgICAgICovCi0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHBuZ19zaXplX3QpbnVtX3Vua25vd25zOyBpKyspCi0gICAgICAgICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbih3cml0ZV9wdHIsIHdyaXRlX2VuZF9pbmZvX3B0ciwgaSwKLSAgICAgICAgICAgICB1bmtub3duc1tpXS5sb2NhdGlvbik7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLSNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECi0gICBwbmdfd3JpdGVfZW5kKHdyaXRlX3B0ciwgd3JpdGVfZW5kX2luZm9fcHRyKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX0VBU1lfQUNDRVNTX1NVUFBPUlRFRAotICAgaWYgKHZlcmJvc2UpCi0gICB7Ci0gICAgICBwbmdfdWludF8zMiBpd2lkdGgsIGloZWlnaHQ7Ci0gICAgICBpd2lkdGggPSBwbmdfZ2V0X2ltYWdlX3dpZHRoKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIpOwotICAgICAgaWhlaWdodCA9IHBuZ19nZXRfaW1hZ2VfaGVpZ2h0KHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIpOwotICAgICAgZnByaW50ZihTVERFUlIsICJcbiBJbWFnZSB3aWR0aCA9ICVsdSwgaGVpZ2h0ID0gJWx1XG4iLAotICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaXdpZHRoLCAodW5zaWduZWQgbG9uZylpaGVpZ2h0KTsKLSAgIH0KLSNlbmRpZgotCi0gICBwbmd0ZXN0X2RlYnVnKCJEZXN0cm95aW5nIGRhdGEgc3RydWN0cyIpOwotI2lmZGVmIFNJTkdMRV9ST1dCVUZfQUxMT0MKLSAgIHBuZ3Rlc3RfZGVidWcoImRlc3Ryb3lpbmcgcm93X2J1ZiBmb3IgcmVhZF9wdHIiKTsKLSAgIHBuZ19mcmVlKHJlYWRfcHRyLCByb3dfYnVmKTsKLSAgIHJvd19idWYgPSBOVUxMOwotI2VuZGlmIC8qIFNJTkdMRV9ST1dCVUZfQUxMT0MgKi8KLSAgIHBuZ3Rlc3RfZGVidWcoImRlc3Ryb3lpbmcgcmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsIGVuZF9pbmZvX3B0ciIpOwotICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnJlYWRfcHRyLCAmcmVhZF9pbmZvX3B0ciwgJmVuZF9pbmZvX3B0cik7Ci0jaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAotICAgcG5ndGVzdF9kZWJ1ZygiZGVzdHJveWluZyB3cml0ZV9lbmRfaW5mb19wdHIiKTsKLSAgIHBuZ19kZXN0cm95X2luZm9fc3RydWN0KHdyaXRlX3B0ciwgJndyaXRlX2VuZF9pbmZvX3B0cik7Ci0gICBwbmd0ZXN0X2RlYnVnKCJkZXN0cm95aW5nIHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIiKTsKLSAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmd3JpdGVfcHRyLCAmd3JpdGVfaW5mb19wdHIpOwotI2VuZGlmCi0gICBwbmd0ZXN0X2RlYnVnKCJEZXN0cnVjdGlvbiBjb21wbGV0ZS4iKTsKLQotICAgRkNMT1NFKGZwaW4pOwotICAgRkNMT1NFKGZwb3V0KTsKLQotICAgcG5ndGVzdF9kZWJ1ZygiT3BlbmluZyBmaWxlcyBmb3IgY29tcGFyaXNvbiIpOwotICAgaWYgKChmcGluID0gZm9wZW4oaW5uYW1lLCAicmIiKSkgPT0gTlVMTCkKLSAgIHsKLSAgICAgIGZwcmludGYoU1RERVJSLCAiQ291bGQgbm90IGZpbmQgZmlsZSAlc1xuIiwgaW5uYW1lKTsKLSAgICAgIHJldHVybiAoMSk7Ci0gICB9Ci0KLSAgIGlmICgoZnBvdXQgPSBmb3BlbihvdXRuYW1lLCAicmIiKSkgPT0gTlVMTCkKLSAgIHsKLSAgICAgIGZwcmludGYoU1RERVJSLCAiQ291bGQgbm90IGZpbmQgZmlsZSAlc1xuIiwgb3V0bmFtZSk7Ci0gICAgICBGQ0xPU0UoZnBpbik7Ci0gICAgICByZXR1cm4gKDEpOwotICAgfQotCi0gICBmb3IgKDs7KQotICAgewotICAgICAgcG5nX3NpemVfdCBudW1faW4sIG51bV9vdXQ7Ci0KLSAgICAgICAgIG51bV9pbiA9IGZyZWFkKGluYnVmLCAxLCAxLCBmcGluKTsKLSAgICAgICAgIG51bV9vdXQgPSBmcmVhZChvdXRidWYsIDEsIDEsIGZwb3V0KTsKLQotICAgICAgaWYgKG51bV9pbiAhPSBudW1fb3V0KQotICAgICAgewotICAgICAgICAgZnByaW50ZihTVERFUlIsICJcbkZpbGVzICVzIGFuZCAlcyBhcmUgb2YgYSBkaWZmZXJlbnQgc2l6ZVxuIiwKLSAgICAgICAgICAgICAgICAgaW5uYW1lLCBvdXRuYW1lKTsKLSAgICAgICAgIGlmICh3cm90ZV9xdWVzdGlvbiA9PSAwKQotICAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihTVERFUlIsCi0gICAgICAgICAiICAgV2FzICVzIHdyaXR0ZW4gd2l0aCB0aGUgc2FtZSBtYXhpbXVtIElEQVQgY2h1bmsgc2l6ZSAoJWQgYnl0ZXMpLCIsCi0gICAgICAgICAgICAgIGlubmFtZSwgUE5HX1pCVUZfU0laRSk7Ci0gICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwKLSAgICAgICAgICAgICAgIlxuICAgZmlsdGVyaW5nIGhldXJpc3RpYyAobGlicG5nIGRlZmF1bHQpLCBjb21wcmVzc2lvbiIpOwotICAgICAgICAgICAgZnByaW50ZihTVERFUlIsCi0gICAgICAgICAgICAgICIgbGV2ZWwgKHpsaWIgZGVmYXVsdCksXG4gICBhbmQgemxpYiB2ZXJzaW9uICglcyk/XG5cbiIsCi0gICAgICAgICAgICAgIFpMSUJfVkVSU0lPTik7Ci0gICAgICAgICAgICB3cm90ZV9xdWVzdGlvbiA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICBGQ0xPU0UoZnBpbik7Ci0gICAgICAgICBGQ0xPU0UoZnBvdXQpOwotICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFudW1faW4pCi0gICAgICAgICBicmVhazsKLQotICAgICAgaWYgKHBuZ19tZW1jbXAoaW5idWYsIG91dGJ1ZiwgbnVtX2luKSkKLSAgICAgIHsKLSAgICAgICAgIGZwcmludGYoU1RERVJSLCAiXG5GaWxlcyAlcyBhbmQgJXMgYXJlIGRpZmZlcmVudFxuIiwgaW5uYW1lLCBvdXRuYW1lKTsKLSAgICAgICAgIGlmICh3cm90ZV9xdWVzdGlvbiA9PSAwKQotICAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihTVERFUlIsCi0gICAgICAgICAiICAgV2FzICVzIHdyaXR0ZW4gd2l0aCB0aGUgc2FtZSBtYXhpbXVtIElEQVQgY2h1bmsgc2l6ZSAoJWQgYnl0ZXMpLCIsCi0gICAgICAgICAgICAgICAgIGlubmFtZSwgUE5HX1pCVUZfU0laRSk7Ci0gICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwKLSAgICAgICAgICAgICAgIlxuICAgZmlsdGVyaW5nIGhldXJpc3RpYyAobGlicG5nIGRlZmF1bHQpLCBjb21wcmVzc2lvbiIpOwotICAgICAgICAgICAgZnByaW50ZihTVERFUlIsCi0gICAgICAgICAgICAgICIgbGV2ZWwgKHpsaWIgZGVmYXVsdCksXG4gICBhbmQgemxpYiB2ZXJzaW9uICglcyk/XG5cbiIsCi0gICAgICAgICAgICAgIFpMSUJfVkVSU0lPTik7Ci0gICAgICAgICAgICB3cm90ZV9xdWVzdGlvbiA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICBGQ0xPU0UoZnBpbik7Ci0gICAgICAgICBGQ0xPU0UoZnBvdXQpOwotICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgIH0KLSAgIH0KLQotICAgRkNMT1NFKGZwaW4pOwotICAgRkNMT1NFKGZwb3V0KTsKLQotICAgcmV0dXJuICgwKTsKLX0KLQotLyogSW5wdXQgYW5kIG91dHB1dCBmaWxlbmFtZXMgKi8KLSNpZmRlZiBSSVNDT1MKLXN0YXRpYyBQTkdfQ09OU1QgY2hhciAqaW5uYW1lID0gInBuZ3Rlc3QvcG5nIjsKLXN0YXRpYyBQTkdfQ09OU1QgY2hhciAqb3V0bmFtZSA9ICJwbmdvdXQvcG5nIjsKLSNlbHNlCi1zdGF0aWMgUE5HX0NPTlNUIGNoYXIgKmlubmFtZSA9ICJwbmd0ZXN0LnBuZyI7Ci1zdGF0aWMgUE5HX0NPTlNUIGNoYXIgKm91dG5hbWUgPSAicG5nb3V0LnBuZyI7Ci0jZW5kaWYKLQotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gICBpbnQgbXVsdGlwbGUgPSAwOwotICAgaW50IGllcnJvciA9IDA7Ci0KLSAgIGZwcmludGYoU1RERVJSLCAiXG4gVGVzdGluZyBsaWJwbmcgdmVyc2lvbiAlc1xuIiwgUE5HX0xJQlBOR19WRVJfU1RSSU5HKTsKLSAgIGZwcmludGYoU1RERVJSLCAiICAgd2l0aCB6bGliICAgdmVyc2lvbiAlc1xuIiwgWkxJQl9WRVJTSU9OKTsKLSAgIGZwcmludGYoU1RERVJSLCAiJXMiLCBwbmdfZ2V0X2NvcHlyaWdodChOVUxMKSk7Ci0gICAvKiBTaG93IHRoZSB2ZXJzaW9uIG9mIGxpYnBuZyB1c2VkIGluIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5ICovCi0gICBmcHJpbnRmKFNUREVSUiwgIiBsaWJyYXJ5ICglbHUpOiVzIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKXBuZ19hY2Nlc3NfdmVyc2lvbl9udW1iZXIoKSwKLSAgICAgIHBuZ19nZXRfaGVhZGVyX3ZlcnNpb24oTlVMTCkpOwotICAgLyogU2hvdyB0aGUgdmVyc2lvbiBvZiBsaWJwbmcgdXNlZCBpbiBidWlsZGluZyB0aGUgYXBwbGljYXRpb24gKi8KLSAgIGZwcmludGYoU1RERVJSLCAiIHBuZ3Rlc3QgKCVsdSk6JXMiLCAodW5zaWduZWQgbG9uZylQTkdfTElCUE5HX1ZFUiwKLSAgICAgIFBOR19IRUFERVJfVkVSU0lPTl9TVFJJTkcpOwotICAgZnByaW50ZihTVERFUlIsICIgc2l6ZW9mKHBuZ19zdHJ1Y3QpPSVsZCwgc2l6ZW9mKHBuZ19pbmZvKT0lbGRcbiIsCi0gICAgICAgICAgICAgICAgICAgIChsb25nKXBuZ19zaXplb2YocG5nX3N0cnVjdCksIChsb25nKXBuZ19zaXplb2YocG5nX2luZm8pKTsKLQotICAgLyogRG8gc29tZSBjb25zaXN0ZW5jeSBjaGVja2luZyBvbiB0aGUgbWVtb3J5IGFsbG9jYXRpb24gc2V0dGluZ3MsIEknbQotICAgICogbm90IHN1cmUgdGhpcyBtYXR0ZXJzLCBidXQgaXQgaXMgbmljZSB0byBrbm93LCB0aGUgZmlyc3Qgb2YgdGhlc2UKLSAgICAqIHRlc3RzIHNob3VsZCBiZSBpbXBvc3NpYmxlIGJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgbWFjcm9zIGFyZSBzZXQKLSAgICAqIGluIHBuZ2NvbmYuaAotICAgICovCi0jaWYgZGVmaW5lZChNQVhTRUdfNjRLKSAmJiAhZGVmaW5lZChQTkdfTUFYX01BTExPQ182NEspCi0gICAgICBmcHJpbnRmKFNUREVSUiwgIiBOT1RFOiBabGliIGNvbXBpbGVkIGZvciBtYXggNjRrLCBsaWJwbmcgbm90XG4iKTsKLSNlbmRpZgotICAgLyogSSB0aGluayB0aGUgZm9sbG93aW5nIGNhbiBoYXBwZW4uICovCi0jaWYgIWRlZmluZWQoTUFYU0VHXzY0SykgJiYgZGVmaW5lZChQTkdfTUFYX01BTExPQ182NEspCi0gICAgICBmcHJpbnRmKFNUREVSUiwgIiBOT1RFOiBsaWJwbmcgY29tcGlsZWQgZm9yIG1heCA2NGssIHpsaWIgbm90XG4iKTsKLSNlbmRpZgotCi0gICBpZiAoc3RyY21wKHBuZ19saWJwbmdfdmVyLCBQTkdfTElCUE5HX1ZFUl9TVFJJTkcpKQotICAgewotICAgICAgZnByaW50ZihTVERFUlIsCi0gICAgICAgICAiV2FybmluZzogdmVyc2lvbnMgYXJlIGRpZmZlcmVudCBiZXR3ZWVuIHBuZy5oIGFuZCBwbmcuY1xuIik7Ci0gICAgICBmcHJpbnRmKFNUREVSUiwgIiAgcG5nLmggdmVyc2lvbjogJXNcbiIsIFBOR19MSUJQTkdfVkVSX1NUUklORyk7Ci0gICAgICBmcHJpbnRmKFNUREVSUiwgIiAgcG5nLmMgdmVyc2lvbjogJXNcblxuIiwgcG5nX2xpYnBuZ192ZXIpOwotICAgICAgKytpZXJyb3I7Ci0gICB9Ci0KLSAgIGlmIChhcmdjID4gMSkKLSAgIHsKLSAgICAgIGlmIChzdHJjbXAoYXJndlsxXSwgIi1tIikgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIG11bHRpcGxlID0gMTsKLSAgICAgICAgIHN0YXR1c19kb3RzX3JlcXVlc3RlZCA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIi1tdiIpID09IDAgfHwKLSAgICAgICAgICAgICAgIHN0cmNtcChhcmd2WzFdLCAiLXZtIikgPT0gMCApCi0gICAgICB7Ci0gICAgICAgICBtdWx0aXBsZSA9IDE7Ci0gICAgICAgICB2ZXJib3NlID0gMTsKLSAgICAgICAgIHN0YXR1c19kb3RzX3JlcXVlc3RlZCA9IDE7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIi12IikgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIHZlcmJvc2UgPSAxOwotICAgICAgICAgc3RhdHVzX2RvdHNfcmVxdWVzdGVkID0gMTsKLSAgICAgICAgIGlubmFtZSA9IGFyZ3ZbMl07Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpbm5hbWUgPSBhcmd2WzFdOwotICAgICAgICAgc3RhdHVzX2RvdHNfcmVxdWVzdGVkID0gMDsKLSAgICAgIH0KLSAgIH0KLQotICAgaWYgKCFtdWx0aXBsZSAmJiBhcmdjID09IDMgKyB2ZXJib3NlKQotICAgICBvdXRuYW1lID0gYXJndlsyICsgdmVyYm9zZV07Ci0KLSAgIGlmICgoIW11bHRpcGxlICYmIGFyZ2MgPiAzICsgdmVyYm9zZSkgfHwgKG11bHRpcGxlICYmIGFyZ2MgPCAyKSkKLSAgIHsKLSAgICAgZnByaW50ZihTVERFUlIsCi0gICAgICAgInVzYWdlOiAlcyBbaW5maWxlLnBuZ10gW291dGZpbGUucG5nXVxuXHQlcyAtbSB7aW5maWxlLnBuZ31cbiIsCi0gICAgICAgIGFyZ3ZbMF0sIGFyZ3ZbMF0pOwotICAgICBmcHJpbnRmKFNUREVSUiwKLSAgICAgICAiICByZWFkcy93cml0ZXMgb25lIFBORyBmaWxlICh3aXRob3V0IC1tKSBvciBtdWx0aXBsZSBmaWxlcyAoLW0pXG4iKTsKLSAgICAgZnByaW50ZihTVERFUlIsCi0gICAgICAgIiAgd2l0aCAtbSAlcyBpcyB1c2VkIGFzIGEgdGVtcG9yYXJ5IGZpbGVcbiIsIG91dG5hbWUpOwotICAgICBleGl0KDEpOwotICAgfQotCi0gICBpZiAobXVsdGlwbGUpCi0gICB7Ci0gICAgICBpbnQgaTsKLSNpZiBkZWZpbmVkKFBOR19VU0VSX01FTV9TVVBQT1JURUQpICYmIFBOR19ERUJVRwotICAgICAgaW50IGFsbG9jYXRpb25fbm93ID0gY3VycmVudF9hbGxvY2F0aW9uOwotI2VuZGlmCi0gICAgICBmb3IgKGk9MjsgaTxhcmdjOyArK2kpCi0gICAgICB7Ci0gICAgICAgICBpbnQga2Vycm9yOwotICAgICAgICAgZnByaW50ZihTVERFUlIsICJcbiBUZXN0aW5nICVzOiIsIGFyZ3ZbaV0pOwotICAgICAgICAga2Vycm9yID0gdGVzdF9vbmVfZmlsZShhcmd2W2ldLCBvdXRuYW1lKTsKLSAgICAgICAgIGlmIChrZXJyb3IgPT0gMCkKLSAgICAgICAgIHsKLSNpZmRlZiBQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKLSAgICAgICAgICAgIGludCBrOwotI2VuZGlmCi0jaWZkZWYgUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAotICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICJcbiBQQVNTICglbHUgemVybyBzYW1wbGVzKVxuIiwKLSAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXplcm9fc2FtcGxlcyk7Ci0jZWxzZQotICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICIgUEFTU1xuIik7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKLSAgICAgICAgICAgIGZvciAoayA9IDA7IGs8MjU2OyBrKyspCi0gICAgICAgICAgICAgICBpZiAoZmlsdGVyc191c2VkW2tdKQotICAgICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICIgRmlsdGVyICVkIHdhcyB1c2VkICVsdSB0aW1lc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgIGssICh1bnNpZ25lZCBsb25nKWZpbHRlcnNfdXNlZFtrXSk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRAotICAgICAgICAgaWYgKHRJTUVfY2h1bmtfcHJlc2VudCAhPSAwKQotICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICIgdElNRSA9ICVzXG4iLCB0SU1FX3N0cmluZyk7Ci0gICAgICAgICB0SU1FX2NodW5rX3ByZXNlbnQgPSAwOwotI2VuZGlmIC8qIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVEICovCi0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiBGQUlMXG4iKTsKLSAgICAgICAgICAgIGllcnJvciArPSBrZXJyb3I7Ci0gICAgICAgICB9Ci0jaWYgZGVmaW5lZChQTkdfVVNFUl9NRU1fU1VQUE9SVEVEKSAmJiBQTkdfREVCVUcKLSAgICAgICAgIGlmIChhbGxvY2F0aW9uX25vdyAhPSBjdXJyZW50X2FsbG9jYXRpb24pCi0gICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIk1FTU9SWSBFUlJPUjogJWQgYnl0ZXMgbG9zdFxuIiwKLSAgICAgICAgICAgICAgIGN1cnJlbnRfYWxsb2NhdGlvbiAtIGFsbG9jYXRpb25fbm93KTsKLSAgICAgICAgIGlmIChjdXJyZW50X2FsbG9jYXRpb24gIT0gMCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIG1lbW9yeV9pbmZvcCBwaW5mbyA9IHBpbmZvcm1hdGlvbjsKLQotICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICJNRU1PUlkgRVJST1I6ICVkIGJ5dGVzIHN0aWxsIGFsbG9jYXRlZFxuIiwKLSAgICAgICAgICAgICAgIGN1cnJlbnRfYWxsb2NhdGlvbik7Ci0gICAgICAgICAgICB3aGlsZSAocGluZm8gIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiICVsdSBieXRlcyBhdCAleFxuIiwKLSAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpcGluZm8tPnNpemUsCi0gICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpIHBpbmZvLT5wb2ludGVyKTsKLSAgICAgICAgICAgICAgIHBpbmZvID0gcGluZm8tPm5leHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0jZW5kaWYKLSAgICAgIH0KLSNpZiBkZWZpbmVkKFBOR19VU0VSX01FTV9TVVBQT1JURUQpICYmIFBOR19ERUJVRwotICAgICAgICAgZnByaW50ZihTVERFUlIsICIgQ3VycmVudCBtZW1vcnkgYWxsb2NhdGlvbjogJTEwZCBieXRlc1xuIiwKLSAgICAgICAgICAgIGN1cnJlbnRfYWxsb2NhdGlvbik7Ci0gICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiBNYXhpbXVtIG1lbW9yeSBhbGxvY2F0aW9uOiAlMTBkIGJ5dGVzXG4iLAotICAgICAgICAgICAgbWF4aW11bV9hbGxvY2F0aW9uKTsKLSAgICAgICAgIGZwcmludGYoU1RERVJSLCAiIFRvdGFsICAgbWVtb3J5IGFsbG9jYXRpb246ICUxMGQgYnl0ZXNcbiIsCi0gICAgICAgICAgICB0b3RhbF9hbGxvY2F0aW9uKTsKLSAgICAgICAgIGZwcmludGYoU1RERVJSLCAiICAgICBOdW1iZXIgb2YgYWxsb2NhdGlvbnM6ICUxMGRcbiIsCi0gICAgICAgICAgICBudW1fYWxsb2NhdGlvbnMpOwotI2VuZGlmCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDA7IGk8MzsgKytpKQotICAgICAgewotICAgICAgICAgaW50IGtlcnJvcjsKLSNpZiBkZWZpbmVkKFBOR19VU0VSX01FTV9TVVBQT1JURUQpICYmIFBOR19ERUJVRwotICAgICAgICAgaW50IGFsbG9jYXRpb25fbm93ID0gY3VycmVudF9hbGxvY2F0aW9uOwotI2VuZGlmCi0gICAgICAgICBpZiAoaSA9PSAxKSBzdGF0dXNfZG90c19yZXF1ZXN0ZWQgPSAxOwotICAgICAgICAgZWxzZSBpZiAodmVyYm9zZSA9PSAwKXN0YXR1c19kb3RzX3JlcXVlc3RlZCA9IDA7Ci0gICAgICAgICBpZiAoaSA9PSAwIHx8IHZlcmJvc2UgPT0gMSB8fCBpZXJyb3IgIT0gMCkKLSAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiXG4gVGVzdGluZyAlczoiLCBpbm5hbWUpOwotICAgICAgICAga2Vycm9yID0gdGVzdF9vbmVfZmlsZShpbm5hbWUsIG91dG5hbWUpOwotICAgICAgICAgaWYgKGtlcnJvciA9PSAwKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZlcmJvc2UgPT0gMSB8fCBpID09IDIpCi0gICAgICAgICAgICB7Ci0jaWZkZWYgUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECi0gICAgICAgICAgICAgICAgaW50IGs7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECi0gICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICJcbiBQQVNTICglbHUgemVybyBzYW1wbGVzKVxuIiwKLSAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl6ZXJvX3NhbXBsZXMpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiBQQVNTXG4iKTsKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAotICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGs8MjU2OyBrKyspCi0gICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlcnNfdXNlZFtrXSkKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiBGaWx0ZXIgJWQgd2FzIHVzZWQgJWx1IHRpbWVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGssICh1bnNpZ25lZCBsb25nKWZpbHRlcnNfdXNlZFtrXSk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRAotICAgICAgICAgICAgIGlmICh0SU1FX2NodW5rX3ByZXNlbnQgIT0gMCkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiB0SU1FID0gJXNcbiIsIHRJTUVfc3RyaW5nKTsKLSNlbmRpZiAvKiBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZlcmJvc2UgPT0gMCAmJiBpICE9IDIpCi0gICAgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIlxuIFRlc3RpbmcgJXM6IiwgaW5uYW1lKTsKLSAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiIEZBSUxcbiIpOwotICAgICAgICAgICAgaWVycm9yICs9IGtlcnJvcjsKLSAgICAgICAgIH0KLSNpZiBkZWZpbmVkKFBOR19VU0VSX01FTV9TVVBQT1JURUQpICYmIFBOR19ERUJVRwotICAgICAgICAgaWYgKGFsbG9jYXRpb25fbm93ICE9IGN1cnJlbnRfYWxsb2NhdGlvbikKLSAgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIk1FTU9SWSBFUlJPUjogJWQgYnl0ZXMgbG9zdFxuIiwKLSAgICAgICAgICAgICAgIGN1cnJlbnRfYWxsb2NhdGlvbiAtIGFsbG9jYXRpb25fbm93KTsKLSAgICAgICAgIGlmIChjdXJyZW50X2FsbG9jYXRpb24gIT0gMCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgICBtZW1vcnlfaW5mb3AgcGluZm8gPSBwaW5mb3JtYXRpb247Ci0KLSAgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIk1FTU9SWSBFUlJPUjogJWQgYnl0ZXMgc3RpbGwgYWxsb2NhdGVkXG4iLAotICAgICAgICAgICAgICAgIGN1cnJlbnRfYWxsb2NhdGlvbik7Ci0gICAgICAgICAgICAgd2hpbGUgKHBpbmZvICE9IE5VTEwpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiICVsdSBieXRlcyBhdCAleFxuIiwKLSAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylwaW5mby0+c2l6ZSwgKHVuc2lnbmVkIGludClwaW5mby0+cG9pbnRlcik7Ci0gICAgICAgICAgICAgICAgcGluZm8gPSBwaW5mby0+bmV4dDsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgfQotI2lmIGRlZmluZWQoUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCkgJiYgUE5HX0RFQlVHCi0gICAgICAgZnByaW50ZihTVERFUlIsICIgQ3VycmVudCBtZW1vcnkgYWxsb2NhdGlvbjogJTEwZCBieXRlc1xuIiwKLSAgICAgICAgICBjdXJyZW50X2FsbG9jYXRpb24pOwotICAgICAgIGZwcmludGYoU1RERVJSLCAiIE1heGltdW0gbWVtb3J5IGFsbG9jYXRpb246ICUxMGQgYnl0ZXNcbiIsCi0gICAgICAgICAgbWF4aW11bV9hbGxvY2F0aW9uKTsKLSAgICAgICBmcHJpbnRmKFNUREVSUiwgIiBUb3RhbCAgIG1lbW9yeSBhbGxvY2F0aW9uOiAlMTBkIGJ5dGVzXG4iLAotICAgICAgICAgIHRvdGFsX2FsbG9jYXRpb24pOwotICAgICAgIGZwcmludGYoU1RERVJSLCAiICAgICBOdW1iZXIgb2YgYWxsb2NhdGlvbnM6ICUxMGRcbiIsCi0gICAgICAgICAgICBudW1fYWxsb2NhdGlvbnMpOwotI2VuZGlmCi0gICB9Ci0KLSNpZmRlZiBQTkdURVNUX1RJTUlORwotICAgdF9zdG9wID0gKGZsb2F0KWNsb2NrKCk7Ci0gICB0X21pc2MgKz0gKHRfc3RvcCAtIHRfc3RhcnQpOwotICAgdF9zdGFydCA9IHRfc3RvcDsKLSAgIGZwcmludGYoU1RERVJSLCAiIENQVSB0aW1lIHVzZWQgPSAlLjNmIHNlY29uZHMiLAotICAgICAgKHRfbWlzYyt0X2RlY29kZSt0X2VuY29kZSkvKGZsb2F0KUNMT0NLU19QRVJfU0VDKTsKLSAgIGZwcmludGYoU1RERVJSLCAiIChkZWNvZGluZyAlLjNmLFxuIiwKLSAgICAgIHRfZGVjb2RlLyhmbG9hdClDTE9DS1NfUEVSX1NFQyk7Ci0gICBmcHJpbnRmKFNUREVSUiwgIiAgICAgICAgZW5jb2RpbmcgJS4zZiAsIiwKLSAgICAgIHRfZW5jb2RlLyhmbG9hdClDTE9DS1NfUEVSX1NFQyk7Ci0gICBmcHJpbnRmKFNUREVSUiwgIiBvdGhlciAlLjNmIHNlY29uZHMpXG5cbiIsCi0gICAgICB0X21pc2MvKGZsb2F0KUNMT0NLU19QRVJfU0VDKTsKLSNlbmRpZgotCi0gICBpZiAoaWVycm9yID09IDApCi0gICAgICBmcHJpbnRmKFNUREVSUiwgIiBsaWJwbmcgcGFzc2VzIHRlc3RcbiIpOwotICAgZWxzZQotICAgICAgZnByaW50ZihTVERFUlIsICIgbGlicG5nIEZBSUxTIHRlc3RcbiIpOwotICAgcmV0dXJuIChpbnQpKGllcnJvciAhPSAwKTsKLX0KLQotLyogR2VuZXJhdGUgYSBjb21waWxlciBlcnJvciBpZiB0aGVyZSBpcyBhbiBvbGQgcG5nLmggaW4gdGhlIHNlYXJjaCBwYXRoLiAqLwotdHlwZWRlZiB2ZXJzaW9uXzFfNF8xMiB5b3VyX3BuZ19oX2lzX25vdF92ZXJzaW9uXzFfNF8xMjsKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvcG5ndGVzdC5wbmcgYi9zcmMvbGlicG5nL3BuZ3Rlc3QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmRkMzZmLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvcG5ndGVzdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3BuZ3RyYW5zLmMgYi9zcmMvbGlicG5nL3BuZ3RyYW5zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNDJjMjkuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9wbmd0cmFucy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjc3ICswLDAgQEAKLQotLyogcG5ndHJhbnMuYyAtIHRyYW5zZm9ybXMgdGhlIGRhdGEgaW4gYSByb3cgKHVzZWQgYnkgYm90aCByZWFkZXJzIGFuZCB3cml0ZXJzKQotICoKLSAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS40LjYgWyBBcHJpbCA4LCAyMDExXQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTEgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSAqLwotCi0jZGVmaW5lIFBOR19OT19QRURBTlRJQ19XQVJOSU5HUwotI2luY2x1ZGUgInBuZy5oIgotI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpCi0jaW5jbHVkZSAicG5ncHJpdi5oIgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9CR1JfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9CR1JfU1VQUE9SVEVEKQotLyogVHVybiBvbiBCR1ItdG8tUkdCIG1hcHBpbmcgKi8KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2Jncihwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2JnciIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19CR1I7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU1dBUF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVEKQotLyogVHVybiBvbiAxNiBiaXQgYnl0ZSBzd2FwcGluZyAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfc3dhcChwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3N3YXAiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPT0gMTYpCi0gICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1NXQVBfQllURVM7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS19TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVEKQotLyogVHVybiBvbiBwaXhlbCBwYWNraW5nICovCi12b2lkIFBOR0FQSQotcG5nX3NldF9wYWNraW5nKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfcGFja2luZyIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgaWYgKHBuZ19wdHItPmJpdF9kZXB0aCA8IDgpCi0gICB7Ci0gICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1BBQ0s7Ci0gICAgICBwbmdfcHRyLT51c3JfYml0X2RlcHRoID0gODsKLSAgIH0KLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQpfHxkZWZpbmVkKFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQpCi0vKiBUdXJuIG9uIHBhY2tlZCBwaXhlbCBzd2FwcGluZyAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfcGFja3N3YXAocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9wYWNrc3dhcCIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgaWYgKHBuZ19wdHItPmJpdF9kZXB0aCA8IDgpCi0gICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1BBQ0tTV0FQOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVEKQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfc2hpZnQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbG9yXzhwIHRydWVfYml0cykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9zaGlmdCIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19TSElGVDsKLSAgIHBuZ19wdHItPnNoaWZ0ID0gKnRydWVfYml0czsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQpCi1pbnQgUE5HQVBJCi1wbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2ludGVybGFjZSBoYW5kbGluZyIpOwotCi0gICBpZiAocG5nX3B0ciAmJiBwbmdfcHRyLT5pbnRlcmxhY2VkKQotICAgewotICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19JTlRFUkxBQ0U7Ci0gICAgICByZXR1cm4gKDcpOwotICAgfQotCi0gICByZXR1cm4gKDEpOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQpCi0vKiBBZGQgYSBmaWxsZXIgYnl0ZSBvbiByZWFkLCBvciByZW1vdmUgYSBmaWxsZXIgb3IgYWxwaGEgYnl0ZSBvbiB3cml0ZS4KLSAqIFRoZSBmaWxsZXIgdHlwZSBoYXMgY2hhbmdlZCBpbiB2MC45NSB0byBhbGxvdyBmdXR1cmUgMi1ieXRlIGZpbGxlcnMKLSAqIGZvciA0OC1iaXQgaW5wdXQgZGF0YSwgYXMgd2VsbCBhcyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHNvbWUgY29tcGlsZXJzCi0gKiB0aGF0IGRvbid0IGxpa2UgYnl0ZXMgYXMgcGFyYW1ldGVycy4KLSAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfZmlsbGVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIGZpbGxlciwgaW50IGZpbGxlcl9sb2MpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfZmlsbGVyIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0ZJTExFUjsKLSAgIHBuZ19wdHItPmZpbGxlciA9IChwbmdfdWludF8xNilmaWxsZXI7Ci0gICBpZiAoZmlsbGVyX2xvYyA9PSBQTkdfRklMTEVSX0FGVEVSKQotICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfRklMTEVSX0FGVEVSOwotICAgZWxzZQotICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0ZJTExFUl9BRlRFUjsKLQotICAgLyogVGhpcyBzaG91bGQgcHJvYmFibHkgZ28gaW4gdGhlICJkb19yZWFkX2ZpbGxlciIgcm91dGluZS4KLSAgICAqIEkgYXR0ZW1wdGVkIHRvIGRvIHRoYXQgaW4gbGlicG5nLTEuMC4xYSBidXQgdGhhdCBjYXVzZWQgcHJvYmxlbXMKLSAgICAqIHNvIEkgcmVzdG9yZWQgaXQgaW4gbGlicG5nLTEuMC4yYQotICAgKi8KLQotICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgewotICAgICAgcG5nX3B0ci0+dXNyX2NoYW5uZWxzID0gNDsKLSAgIH0KLQotICAgLyogQWxzbyBJIGFkZGVkIHRoaXMgaW4gbGlicG5nLTEuMC4yYSAod2hhdCBoYXBwZW5zIHdoZW4gd2UgZXhwYW5kCi0gICAgKiBhIGxlc3MtdGhhbi04LWJpdCBncmF5c2NhbGUgdG8gR0E/ICovCi0KLSAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgJiYgcG5nX3B0ci0+Yml0X2RlcHRoID49IDgpCi0gICB7Ci0gICAgICBwbmdfcHRyLT51c3JfY2hhbm5lbHMgPSAyOwotICAgfQotfQotCi0vKiBBZGRlZCB0byBsaWJwbmctMS4yLjcgKi8KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2FkZF9hbHBoYShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiBmaWxsZXIsIGludCBmaWxsZXJfbG9jKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2FkZF9hbHBoYSIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgZmlsbGVyLCBmaWxsZXJfbG9jKTsKLSAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfQUREX0FMUEhBOwotfQotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU1dBUF9BTFBIQV9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19XUklURV9TV0FQX0FMUEhBX1NVUFBPUlRFRCkKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3N3YXBfYWxwaGEocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9zd2FwX2FscGhhIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1NXQVBfQUxQSEE7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRCkgfHwgXAotICAgIGRlZmluZWQoUE5HX1dSSVRFX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQpCi12b2lkIFBOR0FQSQotcG5nX3NldF9pbnZlcnRfYWxwaGEocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9pbnZlcnRfYWxwaGEiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfSU5WRVJUX0FMUEhBOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0lOVkVSVF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX0lOVkVSVF9TVVBQT1JURUQpCi12b2lkIFBOR0FQSQotcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2ludmVydF9tb25vIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0lOVkVSVF9NT05POwotfQotCi0vKiBJbnZlcnQgbW9ub2Nocm9tZSBncmF5c2NhbGUgZGF0YSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9faW52ZXJ0KHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19pbnZlcnQiKTsKLQotICAvKiBUaGlzIHRlc3QgcmVtb3ZlZCBmcm9tIGxpYnBuZyB2ZXJzaW9uIDEuMC4xMyBhbmQgMS4yLjA6Ci0gICAqICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMSAmJgotICAgKi8KLSAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQotICAgewotICAgICAgcG5nX2J5dGVwIHJwID0gcm93OwotICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykKLSAgICAgIHsKLSAgICAgICAgICpycCA9IChwbmdfYnl0ZSkofigqcnApKTsKLSAgICAgICAgIHJwKys7Ci0gICAgICB9Ci0gICB9Ci0gICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBICYmCi0gICAgICByb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICB7Ci0gICAgICBwbmdfYnl0ZXAgcnAgPSByb3c7Ci0gICAgICBwbmdfdWludF8zMiBpOwotICAgICAgcG5nX3VpbnRfMzIgaXN0b3AgPSByb3dfaW5mby0+cm93Ynl0ZXM7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSs9MikKLSAgICAgIHsKLSAgICAgICAgICpycCA9IChwbmdfYnl0ZSkofigqcnApKTsKLSAgICAgICAgIHJwKz0yOwotICAgICAgfQotICAgfQotICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSAmJgotICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKLSAgIHsKLSAgICAgIHBuZ19ieXRlcCBycCA9IHJvdzsKLSAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICBwbmdfdWludF8zMiBpc3RvcCA9IHJvd19pbmZvLT5yb3dieXRlczsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGlzdG9wOyBpKz00KQotICAgICAgewotICAgICAgICAgKnJwID0gKHBuZ19ieXRlKSh+KCpycCkpOwotICAgICAgICAgKihycCsxKSA9IChwbmdfYnl0ZSkofigqKHJwKzEpKSk7Ci0gICAgICAgICBycCs9NDsKLSAgICAgIH0KLSAgIH0KLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TV0FQX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQpCi0vKiBTd2FwcyBieXRlIG9yZGVyIG9uIDE2IGJpdCBkZXB0aCBpbWFnZXMgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RvX3N3YXAocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3N3YXAiKTsKLQotICAgaWYgKAotICAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCi0gICB7Ci0gICAgICBwbmdfYnl0ZXAgcnAgPSByb3c7Ci0gICAgICBwbmdfdWludF8zMiBpOwotICAgICAgcG5nX3VpbnRfMzIgaXN0b3A9IHJvd19pbmZvLT53aWR0aCAqIHJvd19pbmZvLT5jaGFubmVsczsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGlzdG9wOyBpKyssIHJwICs9IDIpCi0gICAgICB7Ci0gICAgICAgICBwbmdfYnl0ZSB0ID0gKnJwOwotICAgICAgICAgKnJwID0gKihycCArIDEpOwotICAgICAgICAgKihycCArIDEpID0gdDsKLSAgICAgIH0KLSAgIH0KLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQpfHxkZWZpbmVkKFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQpCi1zdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIG9uZWJwcHN3YXB0YWJsZVsyNTZdID0gewotICAgMHgwMCwgMHg4MCwgMHg0MCwgMHhDMCwgMHgyMCwgMHhBMCwgMHg2MCwgMHhFMCwKLSAgIDB4MTAsIDB4OTAsIDB4NTAsIDB4RDAsIDB4MzAsIDB4QjAsIDB4NzAsIDB4RjAsCi0gICAweDA4LCAweDg4LCAweDQ4LCAweEM4LCAweDI4LCAweEE4LCAweDY4LCAweEU4LAotICAgMHgxOCwgMHg5OCwgMHg1OCwgMHhEOCwgMHgzOCwgMHhCOCwgMHg3OCwgMHhGOCwKLSAgIDB4MDQsIDB4ODQsIDB4NDQsIDB4QzQsIDB4MjQsIDB4QTQsIDB4NjQsIDB4RTQsCi0gICAweDE0LCAweDk0LCAweDU0LCAweEQ0LCAweDM0LCAweEI0LCAweDc0LCAweEY0LAotICAgMHgwQywgMHg4QywgMHg0QywgMHhDQywgMHgyQywgMHhBQywgMHg2QywgMHhFQywKLSAgIDB4MUMsIDB4OUMsIDB4NUMsIDB4REMsIDB4M0MsIDB4QkMsIDB4N0MsIDB4RkMsCi0gICAweDAyLCAweDgyLCAweDQyLCAweEMyLCAweDIyLCAweEEyLCAweDYyLCAweEUyLAotICAgMHgxMiwgMHg5MiwgMHg1MiwgMHhEMiwgMHgzMiwgMHhCMiwgMHg3MiwgMHhGMiwKLSAgIDB4MEEsIDB4OEEsIDB4NEEsIDB4Q0EsIDB4MkEsIDB4QUEsIDB4NkEsIDB4RUEsCi0gICAweDFBLCAweDlBLCAweDVBLCAweERBLCAweDNBLCAweEJBLCAweDdBLCAweEZBLAotICAgMHgwNiwgMHg4NiwgMHg0NiwgMHhDNiwgMHgyNiwgMHhBNiwgMHg2NiwgMHhFNiwKLSAgIDB4MTYsIDB4OTYsIDB4NTYsIDB4RDYsIDB4MzYsIDB4QjYsIDB4NzYsIDB4RjYsCi0gICAweDBFLCAweDhFLCAweDRFLCAweENFLCAweDJFLCAweEFFLCAweDZFLCAweEVFLAotICAgMHgxRSwgMHg5RSwgMHg1RSwgMHhERSwgMHgzRSwgMHhCRSwgMHg3RSwgMHhGRSwKLSAgIDB4MDEsIDB4ODEsIDB4NDEsIDB4QzEsIDB4MjEsIDB4QTEsIDB4NjEsIDB4RTEsCi0gICAweDExLCAweDkxLCAweDUxLCAweEQxLCAweDMxLCAweEIxLCAweDcxLCAweEYxLAotICAgMHgwOSwgMHg4OSwgMHg0OSwgMHhDOSwgMHgyOSwgMHhBOSwgMHg2OSwgMHhFOSwKLSAgIDB4MTksIDB4OTksIDB4NTksIDB4RDksIDB4MzksIDB4QjksIDB4NzksIDB4RjksCi0gICAweDA1LCAweDg1LCAweDQ1LCAweEM1LCAweDI1LCAweEE1LCAweDY1LCAweEU1LAotICAgMHgxNSwgMHg5NSwgMHg1NSwgMHhENSwgMHgzNSwgMHhCNSwgMHg3NSwgMHhGNSwKLSAgIDB4MEQsIDB4OEQsIDB4NEQsIDB4Q0QsIDB4MkQsIDB4QUQsIDB4NkQsIDB4RUQsCi0gICAweDFELCAweDlELCAweDVELCAweERELCAweDNELCAweEJELCAweDdELCAweEZELAotICAgMHgwMywgMHg4MywgMHg0MywgMHhDMywgMHgyMywgMHhBMywgMHg2MywgMHhFMywKLSAgIDB4MTMsIDB4OTMsIDB4NTMsIDB4RDMsIDB4MzMsIDB4QjMsIDB4NzMsIDB4RjMsCi0gICAweDBCLCAweDhCLCAweDRCLCAweENCLCAweDJCLCAweEFCLCAweDZCLCAweEVCLAotICAgMHgxQiwgMHg5QiwgMHg1QiwgMHhEQiwgMHgzQiwgMHhCQiwgMHg3QiwgMHhGQiwKLSAgIDB4MDcsIDB4ODcsIDB4NDcsIDB4QzcsIDB4MjcsIDB4QTcsIDB4NjcsIDB4RTcsCi0gICAweDE3LCAweDk3LCAweDU3LCAweEQ3LCAweDM3LCAweEI3LCAweDc3LCAweEY3LAotICAgMHgwRiwgMHg4RiwgMHg0RiwgMHhDRiwgMHgyRiwgMHhBRiwgMHg2RiwgMHhFRiwKLSAgIDB4MUYsIDB4OUYsIDB4NUYsIDB4REYsIDB4M0YsIDB4QkYsIDB4N0YsIDB4RkYKLX07Ci0KLXN0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgdHdvYnBwc3dhcHRhYmxlWzI1Nl0gPSB7Ci0gICAweDAwLCAweDQwLCAweDgwLCAweEMwLCAweDEwLCAweDUwLCAweDkwLCAweEQwLAotICAgMHgyMCwgMHg2MCwgMHhBMCwgMHhFMCwgMHgzMCwgMHg3MCwgMHhCMCwgMHhGMCwKLSAgIDB4MDQsIDB4NDQsIDB4ODQsIDB4QzQsIDB4MTQsIDB4NTQsIDB4OTQsIDB4RDQsCi0gICAweDI0LCAweDY0LCAweEE0LCAweEU0LCAweDM0LCAweDc0LCAweEI0LCAweEY0LAotICAgMHgwOCwgMHg0OCwgMHg4OCwgMHhDOCwgMHgxOCwgMHg1OCwgMHg5OCwgMHhEOCwKLSAgIDB4MjgsIDB4NjgsIDB4QTgsIDB4RTgsIDB4MzgsIDB4NzgsIDB4QjgsIDB4RjgsCi0gICAweDBDLCAweDRDLCAweDhDLCAweENDLCAweDFDLCAweDVDLCAweDlDLCAweERDLAotICAgMHgyQywgMHg2QywgMHhBQywgMHhFQywgMHgzQywgMHg3QywgMHhCQywgMHhGQywKLSAgIDB4MDEsIDB4NDEsIDB4ODEsIDB4QzEsIDB4MTEsIDB4NTEsIDB4OTEsIDB4RDEsCi0gICAweDIxLCAweDYxLCAweEExLCAweEUxLCAweDMxLCAweDcxLCAweEIxLCAweEYxLAotICAgMHgwNSwgMHg0NSwgMHg4NSwgMHhDNSwgMHgxNSwgMHg1NSwgMHg5NSwgMHhENSwKLSAgIDB4MjUsIDB4NjUsIDB4QTUsIDB4RTUsIDB4MzUsIDB4NzUsIDB4QjUsIDB4RjUsCi0gICAweDA5LCAweDQ5LCAweDg5LCAweEM5LCAweDE5LCAweDU5LCAweDk5LCAweEQ5LAotICAgMHgyOSwgMHg2OSwgMHhBOSwgMHhFOSwgMHgzOSwgMHg3OSwgMHhCOSwgMHhGOSwKLSAgIDB4MEQsIDB4NEQsIDB4OEQsIDB4Q0QsIDB4MUQsIDB4NUQsIDB4OUQsIDB4REQsCi0gICAweDJELCAweDZELCAweEFELCAweEVELCAweDNELCAweDdELCAweEJELCAweEZELAotICAgMHgwMiwgMHg0MiwgMHg4MiwgMHhDMiwgMHgxMiwgMHg1MiwgMHg5MiwgMHhEMiwKLSAgIDB4MjIsIDB4NjIsIDB4QTIsIDB4RTIsIDB4MzIsIDB4NzIsIDB4QjIsIDB4RjIsCi0gICAweDA2LCAweDQ2LCAweDg2LCAweEM2LCAweDE2LCAweDU2LCAweDk2LCAweEQ2LAotICAgMHgyNiwgMHg2NiwgMHhBNiwgMHhFNiwgMHgzNiwgMHg3NiwgMHhCNiwgMHhGNiwKLSAgIDB4MEEsIDB4NEEsIDB4OEEsIDB4Q0EsIDB4MUEsIDB4NUEsIDB4OUEsIDB4REEsCi0gICAweDJBLCAweDZBLCAweEFBLCAweEVBLCAweDNBLCAweDdBLCAweEJBLCAweEZBLAotICAgMHgwRSwgMHg0RSwgMHg4RSwgMHhDRSwgMHgxRSwgMHg1RSwgMHg5RSwgMHhERSwKLSAgIDB4MkUsIDB4NkUsIDB4QUUsIDB4RUUsIDB4M0UsIDB4N0UsIDB4QkUsIDB4RkUsCi0gICAweDAzLCAweDQzLCAweDgzLCAweEMzLCAweDEzLCAweDUzLCAweDkzLCAweEQzLAotICAgMHgyMywgMHg2MywgMHhBMywgMHhFMywgMHgzMywgMHg3MywgMHhCMywgMHhGMywKLSAgIDB4MDcsIDB4NDcsIDB4ODcsIDB4QzcsIDB4MTcsIDB4NTcsIDB4OTcsIDB4RDcsCi0gICAweDI3LCAweDY3LCAweEE3LCAweEU3LCAweDM3LCAweDc3LCAweEI3LCAweEY3LAotICAgMHgwQiwgMHg0QiwgMHg4QiwgMHhDQiwgMHgxQiwgMHg1QiwgMHg5QiwgMHhEQiwKLSAgIDB4MkIsIDB4NkIsIDB4QUIsIDB4RUIsIDB4M0IsIDB4N0IsIDB4QkIsIDB4RkIsCi0gICAweDBGLCAweDRGLCAweDhGLCAweENGLCAweDFGLCAweDVGLCAweDlGLCAweERGLAotICAgMHgyRiwgMHg2RiwgMHhBRiwgMHhFRiwgMHgzRiwgMHg3RiwgMHhCRiwgMHhGRgotfTsKLQotc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBmb3VyYnBwc3dhcHRhYmxlWzI1Nl0gPSB7Ci0gICAweDAwLCAweDEwLCAweDIwLCAweDMwLCAweDQwLCAweDUwLCAweDYwLCAweDcwLAotICAgMHg4MCwgMHg5MCwgMHhBMCwgMHhCMCwgMHhDMCwgMHhEMCwgMHhFMCwgMHhGMCwKLSAgIDB4MDEsIDB4MTEsIDB4MjEsIDB4MzEsIDB4NDEsIDB4NTEsIDB4NjEsIDB4NzEsCi0gICAweDgxLCAweDkxLCAweEExLCAweEIxLCAweEMxLCAweEQxLCAweEUxLCAweEYxLAotICAgMHgwMiwgMHgxMiwgMHgyMiwgMHgzMiwgMHg0MiwgMHg1MiwgMHg2MiwgMHg3MiwKLSAgIDB4ODIsIDB4OTIsIDB4QTIsIDB4QjIsIDB4QzIsIDB4RDIsIDB4RTIsIDB4RjIsCi0gICAweDAzLCAweDEzLCAweDIzLCAweDMzLCAweDQzLCAweDUzLCAweDYzLCAweDczLAotICAgMHg4MywgMHg5MywgMHhBMywgMHhCMywgMHhDMywgMHhEMywgMHhFMywgMHhGMywKLSAgIDB4MDQsIDB4MTQsIDB4MjQsIDB4MzQsIDB4NDQsIDB4NTQsIDB4NjQsIDB4NzQsCi0gICAweDg0LCAweDk0LCAweEE0LCAweEI0LCAweEM0LCAweEQ0LCAweEU0LCAweEY0LAotICAgMHgwNSwgMHgxNSwgMHgyNSwgMHgzNSwgMHg0NSwgMHg1NSwgMHg2NSwgMHg3NSwKLSAgIDB4ODUsIDB4OTUsIDB4QTUsIDB4QjUsIDB4QzUsIDB4RDUsIDB4RTUsIDB4RjUsCi0gICAweDA2LCAweDE2LCAweDI2LCAweDM2LCAweDQ2LCAweDU2LCAweDY2LCAweDc2LAotICAgMHg4NiwgMHg5NiwgMHhBNiwgMHhCNiwgMHhDNiwgMHhENiwgMHhFNiwgMHhGNiwKLSAgIDB4MDcsIDB4MTcsIDB4MjcsIDB4MzcsIDB4NDcsIDB4NTcsIDB4NjcsIDB4NzcsCi0gICAweDg3LCAweDk3LCAweEE3LCAweEI3LCAweEM3LCAweEQ3LCAweEU3LCAweEY3LAotICAgMHgwOCwgMHgxOCwgMHgyOCwgMHgzOCwgMHg0OCwgMHg1OCwgMHg2OCwgMHg3OCwKLSAgIDB4ODgsIDB4OTgsIDB4QTgsIDB4QjgsIDB4QzgsIDB4RDgsIDB4RTgsIDB4RjgsCi0gICAweDA5LCAweDE5LCAweDI5LCAweDM5LCAweDQ5LCAweDU5LCAweDY5LCAweDc5LAotICAgMHg4OSwgMHg5OSwgMHhBOSwgMHhCOSwgMHhDOSwgMHhEOSwgMHhFOSwgMHhGOSwKLSAgIDB4MEEsIDB4MUEsIDB4MkEsIDB4M0EsIDB4NEEsIDB4NUEsIDB4NkEsIDB4N0EsCi0gICAweDhBLCAweDlBLCAweEFBLCAweEJBLCAweENBLCAweERBLCAweEVBLCAweEZBLAotICAgMHgwQiwgMHgxQiwgMHgyQiwgMHgzQiwgMHg0QiwgMHg1QiwgMHg2QiwgMHg3QiwKLSAgIDB4OEIsIDB4OUIsIDB4QUIsIDB4QkIsIDB4Q0IsIDB4REIsIDB4RUIsIDB4RkIsCi0gICAweDBDLCAweDFDLCAweDJDLCAweDNDLCAweDRDLCAweDVDLCAweDZDLCAweDdDLAotICAgMHg4QywgMHg5QywgMHhBQywgMHhCQywgMHhDQywgMHhEQywgMHhFQywgMHhGQywKLSAgIDB4MEQsIDB4MUQsIDB4MkQsIDB4M0QsIDB4NEQsIDB4NUQsIDB4NkQsIDB4N0QsCi0gICAweDhELCAweDlELCAweEFELCAweEJELCAweENELCAweERELCAweEVELCAweEZELAotICAgMHgwRSwgMHgxRSwgMHgyRSwgMHgzRSwgMHg0RSwgMHg1RSwgMHg2RSwgMHg3RSwKLSAgIDB4OEUsIDB4OUUsIDB4QUUsIDB4QkUsIDB4Q0UsIDB4REUsIDB4RUUsIDB4RkUsCi0gICAweDBGLCAweDFGLCAweDJGLCAweDNGLCAweDRGLCAweDVGLCAweDZGLCAweDdGLAotICAgMHg4RiwgMHg5RiwgMHhBRiwgMHhCRiwgMHhDRiwgMHhERiwgMHhFRiwgMHhGRgotfTsKLQotLyogU3dhcHMgcGl4ZWwgcGFja2luZyBvcmRlciB3aXRoaW4gYnl0ZXMgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RvX3BhY2tzd2FwKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19wYWNrc3dhcCIpOwotCi0gICBpZiAoCi0gICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA8IDgpCi0gICB7Ci0gICAgICBwbmdfYnl0ZXAgcnAsIGVuZCwgdGFibGU7Ci0KLSAgICAgIGVuZCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsKLQotICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMSkKLSAgICAgICAgIHRhYmxlID0gKHBuZ19ieXRlcClvbmVicHBzd2FwdGFibGU7Ci0gICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDIpCi0gICAgICAgICB0YWJsZSA9IChwbmdfYnl0ZXApdHdvYnBwc3dhcHRhYmxlOwotICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA0KQotICAgICAgICAgdGFibGUgPSAocG5nX2J5dGVwKWZvdXJicHBzd2FwdGFibGU7Ci0gICAgICBlbHNlCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIGZvciAocnAgPSByb3c7IHJwIDwgZW5kOyBycCsrKQotICAgICAgICAgKnJwID0gdGFibGVbKnJwXTsKLSAgIH0KLX0KLSNlbmRpZiAvKiBQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQgb3IgUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCAqLwotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRCkgfHwgXAotICAgIGRlZmluZWQoUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVEKQotLyogUmVtb3ZlIGZpbGxlciBvciBhbHBoYSBieXRlKHMpICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb19zdHJpcF9maWxsZXIocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX3VpbnRfMzIgZmxhZ3MpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19zdHJpcF9maWxsZXIiKTsKLQotICAgewotICAgICAgcG5nX2J5dGVwIHNwPXJvdzsKLSAgICAgIHBuZ19ieXRlcCBkcD1yb3c7Ci0gICAgICBwbmdfdWludF8zMiByb3dfd2lkdGg9cm93X2luZm8tPndpZHRoOwotICAgICAgcG5nX3VpbnRfMzIgaTsKLQotICAgICAgaWYgKChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKLSAgICAgICAgICAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBICYmCi0gICAgICAgICAgKGZsYWdzICYgUE5HX0ZMQUdfU1RSSVBfQUxQSEEpKSkgJiYKLSAgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPT0gNCkKLSAgICAgIHsKLSAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gUkdCWCBvciBSR0JBIHRvIFJHQiAqLwotICAgICAgICAgICAgaWYgKGZsYWdzICYgUE5HX0ZMQUdfRklMTEVSX0FGVEVSKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZHArPTM7IHNwKz00OwotICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKLSAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOwotICAgICAgICAgICAgICAgICAgc3ArKzsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBYUkdCIG9yIEFSR0IgdG8gUkdCICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKLSAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gMjQ7Ci0gICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGggKiAzOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSAvKiBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikgKi8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChmbGFncyAmIFBOR19GTEFHX0ZJTExFUl9BRlRFUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBSUkdHQkJYWCBvciBSUkdHQkJBQSB0byBSUkdHQkIgKi8KLSAgICAgICAgICAgICAgIHNwICs9IDg7IGRwICs9IDY7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvKiBUaGlzIGNvdWxkIGJlIChhbHRob3VnaCBwbmdfbWVtY3B5IGlzIHByb2JhYmx5IHNsb3dlcik6Ci0gICAgICAgICAgICAgICAgICBwbmdfbWVtY3B5KGRwLCBzcCwgNik7Ci0gICAgICAgICAgICAgICAgICBzcCArPSA4OwotICAgICAgICAgICAgICAgICAgZHAgKz0gNjsKLSAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOwotICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKLSAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOwotICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKLSAgICAgICAgICAgICAgICAgIHNwICs9IDI7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gWFhSUkdHQkIgb3IgQUFSUkdHQkIgdG8gUlJHR0JCICovCi0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvKiBUaGlzIGNvdWxkIGJlIChhbHRob3VnaCBwbmdfbWVtY3B5IGlzIHByb2JhYmx5IHNsb3dlcik6Ci0gICAgICAgICAgICAgICAgICBwbmdfbWVtY3B5KGRwLCBzcCwgNik7Ci0gICAgICAgICAgICAgICAgICBzcCArPSA4OwotICAgICAgICAgICAgICAgICAgZHAgKz0gNjsKLSAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgIHNwKz0yOwotICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKLSAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOwotICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKLSAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gNDg7Ci0gICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGggKiA2OwotICAgICAgICAgfQotICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gMzsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8Ci0gICAgICAgICAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSAmJgotICAgICAgICAgKGZsYWdzICYgUE5HX0ZMQUdfU1RSSVBfQUxQSEEpKSkgJiYKLSAgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPT0gMikKLSAgICAgIHsKLSAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gR1ggb3IgR0EgdG8gRyAqLwotICAgICAgICAgICAgaWYgKGZsYWdzICYgUE5HX0ZMQUdfRklMTEVSX0FGVEVSKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKLSAgICAgICAgICAgICAgICAgIHNwKys7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gWEcgb3IgQUcgdG8gRyAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc3ArKzsKLSAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSA4OwotICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSAvKiBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikgKi8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChmbGFncyAmIFBOR19GTEFHX0ZJTExFUl9BRlRFUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBHR1hYIG9yIEdHQUEgdG8gR0cgKi8KLSAgICAgICAgICAgICAgIHNwICs9IDQ7IGRwICs9IDI7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOwotICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKLSAgICAgICAgICAgICAgICAgIHNwICs9IDI7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gWFhHRyBvciBBQUdHIHRvIEdHICovCi0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzcCArPSAyOwotICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKLSAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAxNjsKLSAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDI7Ci0gICAgICAgICB9Ci0gICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSAxOwotICAgICAgfQotICAgICAgaWYgKGZsYWdzICYgUE5HX0ZMQUdfU1RSSVBfQUxQSEEpCi0gICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlICY9IH5QTkdfQ09MT1JfTUFTS19BTFBIQTsKLSAgIH0KLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9CR1JfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9CR1JfU1VQUE9SVEVEKQotLyogU3dhcHMgcmVkIGFuZCBibHVlIGJ5dGVzIHdpdGhpbiBhIHBpeGVsICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb19iZ3IocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX2JnciIpOwotCi0gICBpZiAoCi0gICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKQotICAgewotICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOwotICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgIHsKLSAgICAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgcnA7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSAzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZSA9ICpycDsKLSAgICAgICAgICAgICAgICpycCA9ICoocnAgKyAyKTsKLSAgICAgICAgICAgICAgICoocnAgKyAyKSA9IHNhdmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgcnA7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSA0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZSA9ICpycDsKLSAgICAgICAgICAgICAgICpycCA9ICoocnAgKyAyKTsKLSAgICAgICAgICAgICAgICoocnAgKyAyKSA9IHNhdmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQotICAgICAgewotICAgICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBycDsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyssIHJwICs9IDYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlID0gKnJwOwotICAgICAgICAgICAgICAgKnJwID0gKihycCArIDQpOwotICAgICAgICAgICAgICAgKihycCArIDQpID0gc2F2ZTsKLSAgICAgICAgICAgICAgIHNhdmUgPSAqKHJwICsgMSk7Ci0gICAgICAgICAgICAgICAqKHJwICsgMSkgPSAqKHJwICsgNSk7Ci0gICAgICAgICAgICAgICAqKHJwICsgNSkgPSBzYXZlOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHJwOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLQotICAgICAgICAgICAgZm9yIChpID0gMCwgcnAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKywgcnAgKz0gOCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlIHNhdmUgPSAqcnA7Ci0gICAgICAgICAgICAgICAqcnAgPSAqKHJwICsgNCk7Ci0gICAgICAgICAgICAgICAqKHJwICsgNCkgPSBzYXZlOwotICAgICAgICAgICAgICAgc2F2ZSA9ICoocnAgKyAxKTsKLSAgICAgICAgICAgICAgICoocnAgKyAxKSA9ICoocnAgKyA1KTsKLSAgICAgICAgICAgICAgICoocnAgKyA1KSA9IHNhdmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci19Ci0jZW5kaWYgLyogUE5HX1JFQURfQkdSX1NVUFBPUlRFRCBvciBQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRCAqLwotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpCi12b2lkIFBOR0FQSQotcG5nX3NldF91c2VyX3RyYW5zZm9ybV9pbmZvKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcAotICAgdXNlcl90cmFuc2Zvcm1fcHRyLCBpbnQgdXNlcl90cmFuc2Zvcm1fZGVwdGgsIGludCB1c2VyX3RyYW5zZm9ybV9jaGFubmVscykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF91c2VyX3RyYW5zZm9ybV9pbmZvIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0jaWZkZWYgUE5HX1VTRVJfVFJBTlNGT1JNX1BUUl9TVVBQT1JURUQKLSAgIHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX3B0ciA9IHVzZXJfdHJhbnNmb3JtX3B0cjsKLSAgIHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2RlcHRoID0gKHBuZ19ieXRlKXVzZXJfdHJhbnNmb3JtX2RlcHRoOwotICAgcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fY2hhbm5lbHMgPSAocG5nX2J5dGUpdXNlcl90cmFuc2Zvcm1fY2hhbm5lbHM7Ci0jZWxzZQotICAgaWYgKHVzZXJfdHJhbnNmb3JtX3B0ciB8fCB1c2VyX3RyYW5zZm9ybV9kZXB0aCB8fCB1c2VyX3RyYW5zZm9ybV9jaGFubmVscykKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICJUaGlzIHZlcnNpb24gb2YgbGlicG5nIGRvZXMgbm90IHN1cHBvcnQgdXNlciB0cmFuc2Zvcm0gaW5mbyIpOwotI2VuZGlmCi19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHVzZXJfdHJhbnNmb3JtX3B0ciBhc3NvY2lhdGVkIHdpdGgKLSAqIHRoZSB1c2VyIHRyYW5zZm9ybSBmdW5jdGlvbnMuICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGZyZWUgYW55IG1lbW9yeQotICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgcG9pbnRlciBiZWZvcmUgcG5nX3dyaXRlX2Rlc3Ryb3kgYW5kIHBuZ19yZWFkX2Rlc3Ryb3kKLSAqIGFyZSBjYWxsZWQuCi0gKi8KLXBuZ192b2lkcCBQTkdBUEkKLXBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuIChOVUxMKTsKLSNpZmRlZiBQTkdfVVNFUl9UUkFOU0ZPUk1fUFRSX1NVUFBPUlRFRAotICAgcmV0dXJuICgocG5nX3ZvaWRwKXBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX3B0cik7Ci0jZWxzZQotICAgcmV0dXJuIChOVUxMKTsKLSNlbmRpZgotfQotI2VuZGlmIC8qIFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCB8fAotICAgICAgICAgIFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQgKi8KLSNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgfHwgUE5HX1dSSVRFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9wbmd1c3IuaCBiL3NyYy9saWJwbmcvcG5ndXNyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNWJkZTAuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9wbmd1c3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLQotLyogcG5ndXNyLmggLSBwcml2YXRlIGxpYnBuZyBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciBPcHRpUE5HCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgQ29zbWluIFRydXRhLgotICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNpbmcgYW5kIHdhcnJhbnR5IHRlcm1zCi0gKiBhcyBsaWJwbmcuCi0gKi8KLQotI2lmbmRlZiBQTkdVU1JfSAotI2RlZmluZSBQTkdVU1JfSAotCi0vKiBUcmFjayBtZW1vcnkgYWxsb2NhdGlvbnMgdW5kZXIgTVMgVmlzdWFsIEMrKy4gKi8KLSNpZiBkZWZpbmVkKF9ERUJVRykgJiYgZGVmaW5lZChfTVNDX1ZFUikKLSNkZWZpbmUgX0NSVERCR19NQVBfQUxMT0MKLSNpbmNsdWRlIDxjcnRkYmcuaD4KLSNpbmNsdWRlIDxtYWxsb2MuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0vKiBSZW1vdmUgdGhlIGxpYnBuZyBmZWF0dXJlcyB0aGF0IGFyZSBub3QgbmVlZGVkIGJ5IE9wdGlQTkcuICovCi0jZGVmaW5lIFBOR19OT19BU1NFTUJMRVJfQ09ERQotI2RlZmluZSBQTkdfTk9fRVJST1JfTlVNQkVSUwotI2RlZmluZSBQTkdfTk9fRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19OT19MRUdBQ1lfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19OT19NTkdfRkVBVFVSRVMKLSNkZWZpbmUgUE5HX05PX1BST0dSRVNTSVZFX1JFQUQKLSNkZWZpbmUgUE5HX05PX1JFQURfVFJBTlNGT1JNUwotI2RlZmluZSBQTkdfTk9fU0VUSk1QX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfTk9fVElNRV9SRkMxMTIzCi0jZGVmaW5lIFBOR19OT19VU0VSX01FTQotI2RlZmluZSBQTkdfTk9fVVNFUl9UUkFOU0ZPUk1fUFRSCi0jZGVmaW5lIFBOR19OT19XUklURV9UUkFOU0ZPUk1TCi0jZGVmaW5lIFBOR19OT19aQUxMT0NfWkVSTwotCi0jZW5kaWYJLyogUE5HVVNSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvcG5nd2lvLmMgYi9zcmMvbGlicG5nL3BuZ3dpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTNhNzFhLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvcG5nd2lvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotCi0vKiBwbmd3aW8uYyAtIGZ1bmN0aW9ucyBmb3IgZGF0YSBvdXRwdXQKLSAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNC4wIFtKYW51YXJ5IDMsIDIwMTBdCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQotICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQotICoKLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0gKiBhbmQgbGljZW5zZSBpbiBwbmcuaAotICoKLSAqIFRoaXMgZmlsZSBwcm92aWRlcyBhIGxvY2F0aW9uIGZvciBhbGwgb3V0cHV0LiAgVXNlcnMgd2hvIG5lZWQKLSAqIHNwZWNpYWwgaGFuZGxpbmcgYXJlIGV4cGVjdGVkIHRvIHdyaXRlIGZ1bmN0aW9ucyB0aGF0IGhhdmUgdGhlIHNhbWUKLSAqIGFyZ3VtZW50cyBhcyB0aGVzZSBhbmQgcGVyZm9ybSBzaW1pbGFyIGZ1bmN0aW9ucywgYnV0IHRoYXQgcG9zc2libHkKLSAqIHVzZSBkaWZmZXJlbnQgb3V0cHV0IG1ldGhvZHMuICBOb3RlIHRoYXQgeW91IHNob3VsZG4ndCBjaGFuZ2UgdGhlc2UKLSAqIGZ1bmN0aW9ucywgYnV0IHJhdGhlciB3cml0ZSByZXBsYWNlbWVudCBmdW5jdGlvbnMgYW5kIHRoZW4gY2hhbmdlCi0gKiB0aGVtIGF0IHJ1biB0aW1lIHdpdGggcG5nX3NldF93cml0ZV9mbiguLi4pLgotICovCi0KLSNkZWZpbmUgUE5HX05PX1BFREFOVElDX1dBUk5JTkdTCi0jaW5jbHVkZSAicG5nLmgiCi0jaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAotI2luY2x1ZGUgInBuZ3ByaXYuaCIKLQotLyogV3JpdGUgdGhlIGRhdGEgdG8gd2hhdGV2ZXIgb3V0cHV0IHlvdSBhcmUgdXNpbmcuICBUaGUgZGVmYXVsdCByb3V0aW5lCi0gKiB3cml0ZXMgdG8gYSBmaWxlIHBvaW50ZXIuICBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIHNvbWV0aW1lcyBnZXRzIGNhbGxlZAotICogd2l0aCB2ZXJ5IHNtYWxsIGxlbmd0aHMsIHNvIHlvdSBzaG91bGQgaW1wbGVtZW50IHNvbWUga2luZCBvZiBzaW1wbGUKLSAqIGJ1ZmZlcmluZyBpZiB5b3UgYXJlIHVzaW5nIHVuYnVmZmVyZWQgd3JpdGVzLiAgVGhpcyBzaG91bGQgbmV2ZXIgYmUgYXNrZWQKLSAqIHRvIHdyaXRlIG1vcmUgdGhhbiA2NEsgb24gYSAxNiBiaXQgbWFjaGluZS4KLSAqLwotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIGlmIChwbmdfcHRyLT53cml0ZV9kYXRhX2ZuICE9IE5VTEwgKQotICAgICAgKCoocG5nX3B0ci0+d3JpdGVfZGF0YV9mbikpKHBuZ19wdHIsIGRhdGEsIGxlbmd0aCk7Ci0gICBlbHNlCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkNhbGwgdG8gTlVMTCB3cml0ZSBmdW5jdGlvbiIpOwotfQotCi0jaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAotLyogVGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBkb2VzIHRoZSBhY3R1YWwgd3JpdGluZyBvZiBkYXRhLiAgSWYgeW91IGFyZQotICogbm90IHdyaXRpbmcgdG8gYSBzdGFuZGFyZCBDIHN0cmVhbSwgeW91IHNob3VsZCBjcmVhdGUgYSByZXBsYWNlbWVudAotICogd3JpdGVfZGF0YSBmdW5jdGlvbiBhbmQgdXNlIGl0IGF0IHJ1biB0aW1lIHdpdGggcG5nX3NldF93cml0ZV9mbigpLCByYXRoZXIKLSAqIHRoYW4gY2hhbmdpbmcgdGhlIGxpYnJhcnkuCi0gKi8KLSNpZm5kZWYgVVNFX0ZBUl9LRVlXT1JECi12b2lkIFBOR0FQSQotcG5nX2RlZmF1bHRfd3JpdGVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCi17Ci0gICBwbmdfdWludF8zMiBjaGVjazsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIGNoZWNrID0gZndyaXRlKGRhdGEsIDEsIGxlbmd0aCwgKHBuZ19GSUxFX3ApKHBuZ19wdHItPmlvX3B0cikpOwotICAgaWYgKGNoZWNrICE9IGxlbmd0aCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiV3JpdGUgRXJyb3IiKTsKLX0KLSNlbHNlCi0vKiBUaGlzIGlzIHRoZSBtb2RlbC1pbmRlcGVuZGVudCB2ZXJzaW9uLiBTaW5jZSB0aGUgc3RhbmRhcmQgSS9PIGxpYnJhcnkKLSAqIGNhbid0IGhhbmRsZSBmYXIgYnVmZmVycyBpbiB0aGUgbWVkaXVtIGFuZCBzbWFsbCBtb2RlbHMsIHdlIGhhdmUgdG8gY29weQotICogdGhlIGRhdGEuCi0gKi8KLQotI2RlZmluZSBORUFSX0JVRl9TSVpFIDEwMjQKLSNkZWZpbmUgTUlOKGEsYikgKGEgPD0gYiA/IGEgOiBiKQotCi12b2lkIFBOR0FQSQotcG5nX2RlZmF1bHRfd3JpdGVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCi17Ci0gICBwbmdfdWludF8zMiBjaGVjazsKLSAgIHBuZ19ieXRlICpuZWFyX2RhdGE7ICAvKiBOZWVkcyB0byBiZSAicG5nX2J5dGUgKiIgaW5zdGVhZCBvZiAicG5nX2J5dGVwIiAqLwotICAgcG5nX0ZJTEVfcCBpb19wdHI7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICAvKiBDaGVjayBpZiBkYXRhIHJlYWxseSBpcyBuZWFyLiBJZiBzbywgdXNlIHVzdWFsIGNvZGUuICovCi0gICBuZWFyX2RhdGEgPSAocG5nX2J5dGUgKilDVlRfUFRSX05PQ0hFQ0soZGF0YSk7Ci0gICBpb19wdHIgPSAocG5nX0ZJTEVfcClDVlRfUFRSKHBuZ19wdHItPmlvX3B0cik7Ci0gICBpZiAoKHBuZ19ieXRlcCluZWFyX2RhdGEgPT0gZGF0YSkKLSAgIHsKLSAgICAgIGNoZWNrID0gZndyaXRlKG5lYXJfZGF0YSwgMSwgbGVuZ3RoLCBpb19wdHIpOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgcG5nX2J5dGUgYnVmW05FQVJfQlVGX1NJWkVdOwotICAgICAgcG5nX3NpemVfdCB3cml0dGVuLCByZW1haW5pbmcsIGVycjsKLSAgICAgIGNoZWNrID0gMDsKLSAgICAgIHJlbWFpbmluZyA9IGxlbmd0aDsKLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgICB3cml0dGVuID0gTUlOKE5FQVJfQlVGX1NJWkUsIHJlbWFpbmluZyk7Ci0gICAgICAgICBwbmdfbWVtY3B5KGJ1ZiwgZGF0YSwgd3JpdHRlbik7IC8qIENvcHkgZmFyIGJ1ZmZlciB0byBuZWFyIGJ1ZmZlciAqLwotICAgICAgICAgZXJyID0gZndyaXRlKGJ1ZiwgMSwgd3JpdHRlbiwgaW9fcHRyKTsKLSAgICAgICAgIGlmIChlcnIgIT0gd3JpdHRlbikKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBjaGVjayArPSBlcnI7Ci0KLSAgICAgICAgIGRhdGEgKz0gd3JpdHRlbjsKLSAgICAgICAgIHJlbWFpbmluZyAtPSB3cml0dGVuOwotICAgICAgfQotICAgICAgd2hpbGUgKHJlbWFpbmluZyAhPSAwKTsKLSAgIH0KLSAgIGlmIChjaGVjayAhPSBsZW5ndGgpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIldyaXRlIEVycm9yIik7Ci19Ci0KLSNlbmRpZgotI2VuZGlmCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIG91dHB1dCBhbnkgZGF0YSBwZW5kaW5nIHdyaXRpbmcgKG5vcm1hbGx5Ci0gKiB0byBkaXNrKS4gIEFmdGVyIHBuZ19mbHVzaCBpcyBjYWxsZWQsIHRoZXJlIHNob3VsZCBiZSBubyBkYXRhIHBlbmRpbmcKLSAqIHdyaXRpbmcgaW4gYW55IGJ1ZmZlcnMuCi0gKi8KLSNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19mbHVzaChwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgaWYgKHBuZ19wdHItPm91dHB1dF9mbHVzaF9mbiAhPSBOVUxMKQotICAgICAgKCoocG5nX3B0ci0+b3V0cHV0X2ZsdXNoX2ZuKSkocG5nX3B0cik7Ci19Ci0KLSNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECi12b2lkIFBOR0FQSQotcG5nX2RlZmF1bHRfZmx1c2gocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19GSUxFX3AgaW9fcHRyOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIGlvX3B0ciA9IChwbmdfRklMRV9wKUNWVF9QVFIoKHBuZ19wdHItPmlvX3B0cikpOwotICAgZmZsdXNoKGlvX3B0cik7Ci19Ci0jZW5kaWYKLSNlbmRpZgotCi0vKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gc3VwcGx5IG5ldyBvdXRwdXQgZnVuY3Rpb25zIGZvcgotICogbGlicG5nIGlmIHN0YW5kYXJkIEMgc3RyZWFtcyBhcmVuJ3QgYmVpbmcgdXNlZC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIGl0cyBhcmd1bWVudHM6Ci0gKiBwbmdfcHRyICAgICAgIC0gcG9pbnRlciB0byBhIHBuZyBvdXRwdXQgZGF0YSBzdHJ1Y3R1cmUKLSAqIGlvX3B0ciAgICAgICAgLSBwb2ludGVyIHRvIHVzZXIgc3VwcGxpZWQgc3RydWN0dXJlIGNvbnRhaW5pbmcgaW5mbyBhYm91dAotICogICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgZnVuY3Rpb25zLiAgTWF5IGJlIE5VTEwuCi0gKiB3cml0ZV9kYXRhX2ZuIC0gcG9pbnRlciB0byBhIG5ldyBvdXRwdXQgZnVuY3Rpb24gdGhhdCB0YWtlcyBhcyBpdHMKLSAqICAgICAgICAgICAgICAgICBhcmd1bWVudHMgYSBwb2ludGVyIHRvIGEgcG5nX3N0cnVjdCwgYSBwb2ludGVyIHRvCi0gKiAgICAgICAgICAgICAgICAgZGF0YSB0byBiZSB3cml0dGVuLCBhbmQgYSAzMi1iaXQgdW5zaWduZWQgaW50IHRoYXQgaXMKLSAqICAgICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4uICBUaGUgbmV3IHdyaXRlCi0gKiAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGNhbGwgcG5nX2Vycm9yKHBuZ19wdHIsICJFcnJvciBtc2ciKQotICogICAgICAgICAgICAgICAgIHRvIGV4aXQgYW5kIG91dHB1dCBhbnkgZmF0YWwgZXJyb3IgbWVzc2FnZXMuICBNYXkgYmUKLSAqICAgICAgICAgICAgICAgICBOVUxMLCBpbiB3aGljaCBjYXNlIGxpYnBuZydzIGRlZmF1bHQgZnVuY3Rpb24gd2lsbAotICogICAgICAgICAgICAgICAgIGJlIHVzZWQuCi0gKiBmbHVzaF9kYXRhX2ZuIC0gcG9pbnRlciB0byBhIG5ldyBmbHVzaCBmdW5jdGlvbiB0aGF0IHRha2VzIGFzIGl0cwotICogICAgICAgICAgICAgICAgIGFyZ3VtZW50cyBhIHBvaW50ZXIgdG8gYSBwbmdfc3RydWN0LiAgQWZ0ZXIgYSBjYWxsIHRvCi0gKiAgICAgICAgICAgICAgICAgdGhlIGZsdXNoIGZ1bmN0aW9uLCB0aGVyZSBzaG91bGQgYmUgbm8gZGF0YSBpbiBhbnkgYnVmZmVycwotICogICAgICAgICAgICAgICAgIG9yIHBlbmRpbmcgdHJhbnNtaXNzaW9uLiAgSWYgdGhlIG91dHB1dCBtZXRob2QgZG9lc24ndCBkbwotICogICAgICAgICAgICAgICAgIGFueSBidWZmZXJpbmcgb2Ygb3V0cHV0LCBhIGZ1bmN0aW9uIHByb3RvdHlwZSBtdXN0IHN0aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgc3VwcGxpZWQgYWx0aG91Z2ggaXQgZG9lc24ndCBoYXZlIHRvIGRvIGFueXRoaW5nLiAgSWYKLSAqICAgICAgICAgICAgICAgICBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIGF0IGxpYnBuZyBjb21waWxlCi0gKiAgICAgICAgICAgICAgICAgdGltZSwgb3V0cHV0X2ZsdXNoX2ZuIHdpbGwgYmUgaWdub3JlZCwgYWx0aG91Z2ggaXQgbXVzdCBiZQotICogICAgICAgICAgICAgICAgIHN1cHBsaWVkIGZvciBjb21wYXRpYmlsaXR5LiAgTWF5IGJlIE5VTEwsIGluIHdoaWNoIGNhc2UKLSAqICAgICAgICAgICAgICAgICBsaWJwbmcncyBkZWZhdWx0IGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCwgaWYKLSAqICAgICAgICAgICAgICAgICBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVEIGlzIGRlZmluZWQuICBUaGlzIGlzIG5vdAotICogICAgICAgICAgICAgICAgIGEgZ29vZCBpZGVhIGlmIGlvX3B0ciBkb2VzIG5vdCBwb2ludCB0byBhIHN0YW5kYXJkCi0gKiAgICAgICAgICAgICAgICAgKkZJTEUgc3RydWN0dXJlLgotICovCi12b2lkIFBOR0FQSQotcG5nX3NldF93cml0ZV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgaW9fcHRyLAotICAgcG5nX3J3X3B0ciB3cml0ZV9kYXRhX2ZuLCBwbmdfZmx1c2hfcHRyIG91dHB1dF9mbHVzaF9mbikKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIHBuZ19wdHItPmlvX3B0ciA9IGlvX3B0cjsKLQotI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQKLSAgIGlmICh3cml0ZV9kYXRhX2ZuICE9IE5VTEwpCi0gICAgICBwbmdfcHRyLT53cml0ZV9kYXRhX2ZuID0gd3JpdGVfZGF0YV9mbjsKLQotICAgZWxzZQotICAgICAgcG5nX3B0ci0+d3JpdGVfZGF0YV9mbiA9IHBuZ19kZWZhdWx0X3dyaXRlX2RhdGE7Ci0jZWxzZQotICAgcG5nX3B0ci0+d3JpdGVfZGF0YV9mbiA9IHdyaXRlX2RhdGFfZm47Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQKLSNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECi0gICBpZiAob3V0cHV0X2ZsdXNoX2ZuICE9IE5VTEwpCi0gICAgICBwbmdfcHRyLT5vdXRwdXRfZmx1c2hfZm4gPSBvdXRwdXRfZmx1c2hfZm47Ci0KLSAgIGVsc2UKLSAgICAgIHBuZ19wdHItPm91dHB1dF9mbHVzaF9mbiA9IHBuZ19kZWZhdWx0X2ZsdXNoOwotI2Vsc2UKLSAgIHBuZ19wdHItPm91dHB1dF9mbHVzaF9mbiA9IG91dHB1dF9mbHVzaF9mbjsKLSNlbmRpZgotI2VuZGlmIC8qIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQgKi8KLQotICAgLyogSXQgaXMgYW4gZXJyb3IgdG8gcmVhZCB3aGlsZSB3cml0aW5nIGEgcG5nIGZpbGUgKi8KLSAgIGlmIChwbmdfcHRyLT5yZWFkX2RhdGFfZm4gIT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ19wdHItPnJlYWRfZGF0YV9mbiA9IE5VTEw7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgIkF0dGVtcHRlZCB0byBzZXQgYm90aCByZWFkX2RhdGFfZm4gYW5kIHdyaXRlX2RhdGFfZm4gaW4iKTsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAidGhlIHNhbWUgc3RydWN0dXJlLiAgUmVzZXR0aW5nIHJlYWRfZGF0YV9mbiB0byBOVUxMIik7Ci0gICB9Ci19Ci0KLSNpZmRlZiBVU0VfRkFSX0tFWVdPUkQKLSNpZmRlZiBfTVNDX1ZFUgotdm9pZCAqcG5nX2Zhcl90b19uZWFyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBwdHIsIGludCBjaGVjaykKLXsKLSAgIHZvaWQgKm5lYXJfcHRyOwotICAgdm9pZCBGQVIgKmZhcl9wdHI7Ci0gICBGUF9PRkYobmVhcl9wdHIpID0gRlBfT0ZGKHB0cik7Ci0gICBmYXJfcHRyID0gKHZvaWQgRkFSICopbmVhcl9wdHI7Ci0KLSAgIGlmIChjaGVjayAhPSAwKQotICAgICAgaWYgKEZQX1NFRyhwdHIpICE9IEZQX1NFRyhmYXJfcHRyKSkKLSAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAic2VnbWVudCBsb3N0IGluIGNvbnZlcnNpb24iKTsKLQotICAgcmV0dXJuKG5lYXJfcHRyKTsKLX0KLSMgIGVsc2UKLXZvaWQgKnBuZ19mYXJfdG9fbmVhcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgcHRyLCBpbnQgY2hlY2spCi17Ci0gICB2b2lkICpuZWFyX3B0cjsKLSAgIHZvaWQgRkFSICpmYXJfcHRyOwotICAgbmVhcl9wdHIgPSAodm9pZCBGQVIgKilwdHI7Ci0gICBmYXJfcHRyID0gKHZvaWQgRkFSICopbmVhcl9wdHI7Ci0KLSAgIGlmIChjaGVjayAhPSAwKQotICAgICAgaWYgKGZhcl9wdHIgIT0gcHRyKQotICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJzZWdtZW50IGxvc3QgaW4gY29udmVyc2lvbiIpOwotCi0gICByZXR1cm4obmVhcl9wdHIpOwotfQotIyAgIGVuZGlmCi0jICAgZW5kaWYKLSNlbmRpZiAvKiBQTkdfV1JJVEVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3BuZ3dyaXRlLmMgYi9zcmMvbGlicG5nL3BuZ3dyaXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkY2I5MjkuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9wbmd3cml0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1OSArMCwwIEBACi0KLS8qIHBuZ3dyaXRlLmMgLSBnZW5lcmFsIHJvdXRpbmVzIHRvIHdyaXRlIGEgUE5HIGZpbGUKLSAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNC44IFtKdWx5IDcsIDIwMTFdCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQotICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQotICoKLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0gKiBhbmQgbGljZW5zZSBpbiBwbmcuaAotICovCi0KLS8qIEdldCBpbnRlcm5hbCBhY2Nlc3MgdG8gcG5nLmggKi8KLSNkZWZpbmUgUE5HX05PX1BFREFOVElDX1dBUk5JTkdTCi0jaW5jbHVkZSAicG5nLmgiCi0jaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAotI2luY2x1ZGUgInBuZ3ByaXYuaCIKLQotLyogV3JpdGVzIGFsbCB0aGUgUE5HIGluZm9ybWF0aW9uLiAgVGhpcyBpcyB0aGUgc3VnZ2VzdGVkIHdheSB0byB1c2UgdGhlCi0gKiBsaWJyYXJ5LiAgSWYgeW91IGhhdmUgYSBuZXcgY2h1bmsgdG8gYWRkLCBtYWtlIGEgZnVuY3Rpb24gdG8gd3JpdGUgaXQsCi0gKiBhbmQgcHV0IGl0IGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uIGhlcmUuICBJZiB5b3Ugd2FudCB0aGUgY2h1bmsgd3JpdHRlbgotICogYWZ0ZXIgdGhlIGltYWdlIGRhdGEsIHB1dCBpdCBpbiBwbmdfd3JpdGVfZW5kKCkuICBJIHN0cm9uZ2x5IGVuY291cmFnZQotICogeW91IHRvIHN1cHBseSBhIFBOR19JTkZPXyBmbGFnLCBhbmQgY2hlY2sgaW5mb19wdHItPnZhbGlkIGJlZm9yZSB3cml0aW5nCi0gKiB0aGUgY2h1bmssIGFzIHRoYXQgd2lsbCBrZWVwIHRoZSBjb2RlIGZyb20gYnJlYWtpbmcgaWYgeW91IHdhbnQgdG8ganVzdAotICogd3JpdGUgYSBwbGFpbiBQTkcgZmlsZS4gIElmIHlvdSBoYXZlIGxvbmcgY29tbWVudHMsIEkgc3VnZ2VzdCB3cml0aW5nCi0gKiB0aGVtIGluIHBuZ193cml0ZV9lbmQoKSwgYW5kIGNvbXByZXNzaW5nIHRoZW0uCi0gKi8KLXZvaWQgUE5HQVBJCi1wbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfV1JPVEVfSU5GT19CRUZPUkVfUExURSkpCi0gICB7Ci0gICAvKiBXcml0ZSBQTkcgc2lnbmF0dXJlICovCi0gICBwbmdfd3JpdGVfc2lnKHBuZ19wdHIpOwotI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECi0gICBpZiAoKHBuZ19wdHItPm1vZGUmUE5HX0hBVkVfUE5HX1NJR05BVFVSRSkgJiYgXAotICAgICAgKHBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQpKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk1ORyBmZWF0dXJlcyBhcmUgbm90IGFsbG93ZWQgaW4gYSBQTkcgZGF0YXN0cmVhbSIpOwotICAgICAgcG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCA9IDA7Ci0gICB9Ci0jZW5kaWYKLSAgIC8qIFdyaXRlIElIRFIgaW5mb3JtYXRpb24uICovCi0gICBwbmdfd3JpdGVfSUhEUihwbmdfcHRyLCBpbmZvX3B0ci0+d2lkdGgsIGluZm9fcHRyLT5oZWlnaHQsCi0gICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoLCBpbmZvX3B0ci0+Y29sb3JfdHlwZSwgaW5mb19wdHItPmNvbXByZXNzaW9uX3R5cGUsCi0gICAgICBpbmZvX3B0ci0+ZmlsdGVyX3R5cGUsCi0jaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotICAgICAgaW5mb19wdHItPmludGVybGFjZV90eXBlKTsKLSNlbHNlCi0gICAgICAwKTsKLSNlbmRpZgotICAgLyogVGhlIHJlc3Qgb2YgdGhlc2UgY2hlY2sgdG8gc2VlIGlmIHRoZSB2YWxpZCBmaWVsZCBoYXMgdGhlIGFwcHJvcHJpYXRlCi0gICAgKiBmbGFnIHNldCwgYW5kIGlmIGl0IGRvZXMsIHdyaXRlcyB0aGUgY2h1bmsuCi0gICAgKi8KLSNpZmRlZiBQTkdfV1JJVEVfZ0FNQV9TVVBQT1JURUQKLSAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19nQU1BKQotICAgewotIyAgaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgICAgcG5nX3dyaXRlX2dBTUEocG5nX3B0ciwgaW5mb19wdHItPmdhbW1hKTsKLSNlbHNlCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotICAgICAgcG5nX3dyaXRlX2dBTUFfZml4ZWQocG5nX3B0ciwgaW5mb19wdHItPmludF9nYW1tYSk7Ci0jICBlbmRpZgotI2VuZGlmCi0gICB9Ci0jZW5kaWYKLSNpZmRlZiBQTkdfV1JJVEVfc1JHQl9TVVBQT1JURUQKLSAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zUkdCKQotICAgICAgcG5nX3dyaXRlX3NSR0IocG5nX3B0ciwgKGludClpbmZvX3B0ci0+c3JnYl9pbnRlbnQpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVECi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9faUNDUCkKLSAgICAgIHBuZ193cml0ZV9pQ0NQKHBuZ19wdHIsIGluZm9fcHRyLT5pY2NwX25hbWUsIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UsCi0gICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+aWNjcF9wcm9maWxlLCAoaW50KWluZm9fcHRyLT5pY2NwX3Byb2ZsZW4pOwotI2VuZGlmCi0jaWZkZWYgUE5HX1dSSVRFX3NCSVRfU1VQUE9SVEVECi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc0JJVCkKLSAgICAgIHBuZ193cml0ZV9zQklUKHBuZ19wdHIsICYoaW5mb19wdHItPnNpZ19iaXQpLCBpbmZvX3B0ci0+Y29sb3JfdHlwZSk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfV1JJVEVfY0hSTV9TVVBQT1JURUQKLSAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19jSFJNKQotICAgewotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgICAgIHBuZ193cml0ZV9jSFJNKHBuZ19wdHIsCi0gICAgICAgICBpbmZvX3B0ci0+eF93aGl0ZSwgaW5mb19wdHItPnlfd2hpdGUsCi0gICAgICAgICBpbmZvX3B0ci0+eF9yZWQsIGluZm9fcHRyLT55X3JlZCwKLSAgICAgICAgIGluZm9fcHRyLT54X2dyZWVuLCBpbmZvX3B0ci0+eV9ncmVlbiwKLSAgICAgICAgIGluZm9fcHRyLT54X2JsdWUsIGluZm9fcHRyLT55X2JsdWUpOwotI2Vsc2UKLSMgIGlmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLSAgICAgIHBuZ193cml0ZV9jSFJNX2ZpeGVkKHBuZ19wdHIsCi0gICAgICAgICBpbmZvX3B0ci0+aW50X3hfd2hpdGUsIGluZm9fcHRyLT5pbnRfeV93aGl0ZSwKLSAgICAgICAgIGluZm9fcHRyLT5pbnRfeF9yZWQsIGluZm9fcHRyLT5pbnRfeV9yZWQsCi0gICAgICAgICBpbmZvX3B0ci0+aW50X3hfZ3JlZW4sIGluZm9fcHRyLT5pbnRfeV9ncmVlbiwKLSAgICAgICAgIGluZm9fcHRyLT5pbnRfeF9ibHVlLCBpbmZvX3B0ci0+aW50X3lfYmx1ZSk7Ci0jICBlbmRpZgotI2VuZGlmCi0gICB9Ci0jZW5kaWYKLSNpZmRlZiBQTkdfV1JJVEVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECi0gICBpZiAoaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSkKLSAgIHsKLSAgICAgIHBuZ191bmtub3duX2NodW5rICp1cDsKLQotICAgICAgcG5nX2RlYnVnKDUsICJ3cml0aW5nIGV4dHJhIGNodW5rcyIpOwotCi0gICAgICBmb3IgKHVwID0gaW5mb19wdHItPnVua25vd25fY2h1bmtzOwotICAgICAgICAgICB1cCA8IGluZm9fcHRyLT51bmtub3duX2NodW5rcyArIGluZm9fcHRyLT51bmtub3duX2NodW5rc19udW07Ci0gICAgICAgICAgIHVwKyspCi0gICAgICB7Ci0gICAgICAgICBpbnQga2VlcCA9IHBuZ19oYW5kbGVfYXNfdW5rbm93bihwbmdfcHRyLCB1cC0+bmFtZSk7Ci0gICAgICAgICBpZiAoa2VlcCAhPSBQTkdfSEFORExFX0NIVU5LX05FVkVSICYmCi0gICAgICAgICAgICB1cC0+bG9jYXRpb24gJiYgISh1cC0+bG9jYXRpb24gJiBQTkdfSEFWRV9QTFRFKSAmJgotICAgICAgICAgICAgISh1cC0+bG9jYXRpb24gJiBQTkdfSEFWRV9JREFUKSAmJgotICAgICAgICAgICAgKCh1cC0+bmFtZVszXSAmIDB4MjApIHx8IGtlZXAgPT0gUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMgfHwKLSAgICAgICAgICAgIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0tFRVBfVU5TQUZFX0NIVU5LUykpKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHVwLT5zaXplID09IDApCi0gICAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiV3JpdGluZyB6ZXJvLWxlbmd0aCB1bmtub3duIGNodW5rIik7Ci0gICAgICAgICAgICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgdXAtPm5hbWUsIHVwLT5kYXRhLCB1cC0+c2l6ZSk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLSAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX1dST1RFX0lORk9fQkVGT1JFX1BMVEU7Ci0gICB9Ci19Ci0KLXZvaWQgUE5HQVBJCi1wbmdfd3JpdGVfaW5mbyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0jaWYgZGVmaW5lZChQTkdfV1JJVEVfVEVYVF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX3NQTFRfU1VQUE9SVEVEKQotICAgaW50IGk7Ci0jZW5kaWYKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfaW5mbyIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX1BMVEUpCi0gICAgICBwbmdfd3JpdGVfUExURShwbmdfcHRyLCBpbmZvX3B0ci0+cGFsZXR0ZSwKLSAgICAgICAgIChwbmdfdWludF8zMilpbmZvX3B0ci0+bnVtX3BhbGV0dGUpOwotICAgZWxzZSBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVmFsaWQgcGFsZXR0ZSByZXF1aXJlZCBmb3IgcGFsZXR0ZWQgaW1hZ2VzIik7Ci0KLSNpZmRlZiBQTkdfV1JJVEVfdFJOU19TVVBQT1JURUQKLSAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT190Uk5TKQotICAgewotI2lmZGVmIFBOR19XUklURV9JTlZFUlRfQUxQSEFfU1VQUE9SVEVECi0gICAgICAvKiBJbnZlcnQgdGhlIGFscGhhIGNoYW5uZWwgKGluIHRSTlMpICovCi0gICAgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlZFUlRfQUxQSEEpICYmCi0gICAgICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgewotICAgICAgICAgaW50IGo7Ci0gICAgICAgICBmb3IgKGogPSAwOyBqPChpbnQpaW5mb19wdHItPm51bV90cmFuczsgaisrKQotICAgICAgICAgICAgaW5mb19wdHItPnRyYW5zX2FscGhhW2pdID0gKHBuZ19ieXRlKSgyNTUgLSBpbmZvX3B0ci0+dHJhbnNfYWxwaGFbal0pOwotICAgICAgfQotI2VuZGlmCi0gICAgICBwbmdfd3JpdGVfdFJOUyhwbmdfcHRyLCBpbmZvX3B0ci0+dHJhbnNfYWxwaGEsICYoaW5mb19wdHItPnRyYW5zX2NvbG9yKSwKLSAgICAgICAgIGluZm9fcHRyLT5udW1fdHJhbnMsIGluZm9fcHRyLT5jb2xvcl90eXBlKTsKLSAgIH0KLSNlbmRpZgotI2lmZGVmIFBOR19XUklURV9iS0dEX1NVUFBPUlRFRAotICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2JLR0QpCi0gICAgICBwbmdfd3JpdGVfYktHRChwbmdfcHRyLCAmKGluZm9fcHRyLT5iYWNrZ3JvdW5kKSwgaW5mb19wdHItPmNvbG9yX3R5cGUpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1dSSVRFX2hJU1RfU1VQUE9SVEVECi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9faElTVCkKLSAgICAgIHBuZ193cml0ZV9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLT5oaXN0LCBpbmZvX3B0ci0+bnVtX3BhbGV0dGUpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1dSSVRFX29GRnNfU1VQUE9SVEVECi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fb0ZGcykKLSAgICAgIHBuZ193cml0ZV9vRkZzKHBuZ19wdHIsIGluZm9fcHRyLT54X29mZnNldCwgaW5mb19wdHItPnlfb2Zmc2V0LAotICAgICAgICAgaW5mb19wdHItPm9mZnNldF91bml0X3R5cGUpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1dSSVRFX3BDQUxfU1VQUE9SVEVECi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fcENBTCkKLSAgICAgIHBuZ193cml0ZV9wQ0FMKHBuZ19wdHIsIGluZm9fcHRyLT5wY2FsX3B1cnBvc2UsIGluZm9fcHRyLT5wY2FsX1gwLAotICAgICAgICAgaW5mb19wdHItPnBjYWxfWDEsIGluZm9fcHRyLT5wY2FsX3R5cGUsIGluZm9fcHRyLT5wY2FsX25wYXJhbXMsCi0gICAgICAgICBpbmZvX3B0ci0+cGNhbF91bml0cywgaW5mb19wdHItPnBjYWxfcGFyYW1zKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX3NDQUxfU1VQUE9SVEVECi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc0NBTCkKLSNpZmRlZiBQTkdfV1JJVEVfc0NBTF9TVVBQT1JURUQKLSNpZiBkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1NURElPX1NVUFBPUlRFRCkKLSAgICAgIHBuZ193cml0ZV9zQ0FMKHBuZ19wdHIsIChpbnQpaW5mb19wdHItPnNjYWxfdW5pdCwKLSAgICAgICAgICBpbmZvX3B0ci0+c2NhbF9waXhlbF93aWR0aCwgaW5mb19wdHItPnNjYWxfcGl4ZWxfaGVpZ2h0KTsKLSNlbHNlIC8qICFGTE9BVElOR19QT0lOVCAqLwotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLSAgICAgIHBuZ193cml0ZV9zQ0FMX3MocG5nX3B0ciwgKGludClpbmZvX3B0ci0+c2NhbF91bml0LAotICAgICAgICAgIGluZm9fcHRyLT5zY2FsX3Nfd2lkdGgsIGluZm9fcHRyLT5zY2FsX3NfaGVpZ2h0KTsKLSNlbmRpZiAvKiBGSVhFRF9QT0lOVCAqLwotI2VuZGlmIC8qIEZMT0FUSU5HX1BPSU5UICovCi0jZWxzZSAgLyogIVdSSVRFX3NDQUwgKi8KLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAgInBuZ193cml0ZV9zQ0FMIG5vdCBzdXBwb3J0ZWQ7IHNDQUwgY2h1bmsgbm90IHdyaXR0ZW4iKTsKLSNlbmRpZiAvKiBXUklURV9zQ0FMICovCi0jZW5kaWYgLyogc0NBTCAqLwotCi0jaWZkZWYgUE5HX1dSSVRFX3BIWXNfU1VQUE9SVEVECi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fcEhZcykKLSAgICAgIHBuZ193cml0ZV9wSFlzKHBuZ19wdHIsIGluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdCwKLSAgICAgICAgIGluZm9fcHRyLT55X3BpeGVsc19wZXJfdW5pdCwgaW5mb19wdHItPnBoeXNfdW5pdF90eXBlKTsKLSNlbmRpZiAvKiBwSFlzICovCi0KLSNpZmRlZiBQTkdfV1JJVEVfdElNRV9TVVBQT1JURUQKLSAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT190SU1FKQotICAgewotICAgICAgcG5nX3dyaXRlX3RJTUUocG5nX3B0ciwgJihpbmZvX3B0ci0+bW9kX3RpbWUpKTsKLSAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX1dST1RFX3RJTUU7Ci0gICB9Ci0jZW5kaWYgLyogdElNRSAqLwotCi0jaWZkZWYgUE5HX1dSSVRFX3NQTFRfU1VQUE9SVEVECi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc1BMVCkKLSAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNfbnVtOyBpKyspCi0gICAgICAgcG5nX3dyaXRlX3NQTFQocG5nX3B0ciwgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXMgKyBpKTsKLSNlbmRpZiAvKiBzUExUICovCi0KLSNpZmRlZiBQTkdfV1JJVEVfVEVYVF9TVVBQT1JURUQKLSAgIC8qIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHdyaXRlIHRleHQgY2h1bmtzICovCi0gICBmb3IgKGkgPSAwOyBpIDwgaW5mb19wdHItPm51bV90ZXh0OyBpKyspCi0gICB7Ci0gICAgICBwbmdfZGVidWcyKDIsICJXcml0aW5nIGhlYWRlciB0ZXh0IGNodW5rICVkLCB0eXBlICVkIiwgaSwKLSAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uKTsKLSAgICAgIC8qIEFuIGludGVybmF0aW9uYWxpemVkIGNodW5rPyAqLwotICAgICAgaWYgKGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID4gMCkKLSAgICAgIHsKLSNpZmRlZiBQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQKLSAgICAgICAgICAvKiBXcml0ZSBpbnRlcm5hdGlvbmFsIGNodW5rICovCi0gICAgICAgICAgcG5nX3dyaXRlX2lUWHQocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0ubGFuZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5sYW5nX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS50ZXh0KTsKLSNlbHNlCi0gICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVuYWJsZSB0byB3cml0ZSBpbnRlcm5hdGlvbmFsIHRleHQiKTsKLSNlbmRpZgotICAgICAgICAgIC8qIE1hcmsgdGhpcyBjaHVuayBhcyB3cml0dGVuICovCi0gICAgICAgICAgaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FX1dSOwotICAgICAgfQotICAgICAgLyogSWYgd2Ugd2FudCBhIGNvbXByZXNzZWQgdGV4dCBjaHVuayAqLwotICAgICAgZWxzZSBpZiAoaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24gPT0gUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdCkKLSAgICAgIHsKLSNpZmRlZiBQTkdfV1JJVEVfelRYdF9TVVBQT1JURUQKLSAgICAgICAgIC8qIFdyaXRlIGNvbXByZXNzZWQgY2h1bmsgKi8KLSAgICAgICAgIHBuZ193cml0ZV96VFh0KHBuZ19wdHIsIGluZm9fcHRyLT50ZXh0W2ldLmtleSwKLSAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLnRleHQsIDAsCi0gICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbik7Ci0jZWxzZQotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVuYWJsZSB0byB3cml0ZSBjb21wcmVzc2VkIHRleHQiKTsKLSNlbmRpZgotICAgICAgICAgLyogTWFyayB0aGlzIGNodW5rIGFzIHdyaXR0ZW4gKi8KLSAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdF9XUjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID09IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUpCi0gICAgICB7Ci0jaWZkZWYgUE5HX1dSSVRFX3RFWHRfU1VQUE9SVEVECi0gICAgICAgICAvKiBXcml0ZSB1bmNvbXByZXNzZWQgY2h1bmsgKi8KLSAgICAgICAgIHBuZ193cml0ZV90RVh0KHBuZ19wdHIsIGluZm9fcHRyLT50ZXh0W2ldLmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS50ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgLyogTWFyayB0aGlzIGNodW5rIGFzIHdyaXR0ZW4gKi8KLSAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORV9XUjsKLSNlbHNlCi0gICAgICAgICAvKiBDYW4ndCBnZXQgaGVyZSAqLwotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVuYWJsZSB0byB3cml0ZSB1bmNvbXByZXNzZWQgdGV4dCIpOwotI2VuZGlmCi0gICAgICB9Ci0gICB9Ci0jZW5kaWYgLyogdEVYdCAqLwotCi0jaWZkZWYgUE5HX1dSSVRFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAotICAgaWYgKGluZm9fcHRyLT51bmtub3duX2NodW5rc19udW0pCi0gICB7Ci0gICAgICBwbmdfdW5rbm93bl9jaHVuayAqdXA7Ci0KLSAgICAgIHBuZ19kZWJ1Zyg1LCAid3JpdGluZyBleHRyYSBjaHVua3MiKTsKLQotICAgICAgZm9yICh1cCA9IGluZm9fcHRyLT51bmtub3duX2NodW5rczsKLSAgICAgICAgICAgdXAgPCBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3MgKyBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtOwotICAgICAgICAgICB1cCsrKQotICAgICAgewotICAgICAgICAgaW50IGtlZXAgPSBwbmdfaGFuZGxlX2FzX3Vua25vd24ocG5nX3B0ciwgdXAtPm5hbWUpOwotICAgICAgICAgaWYgKGtlZXAgIT0gUE5HX0hBTkRMRV9DSFVOS19ORVZFUiAmJgotICAgICAgICAgICAgdXAtPmxvY2F0aW9uICYmICh1cC0+bG9jYXRpb24gJiBQTkdfSEFWRV9QTFRFKSAmJgotICAgICAgICAgICAgISh1cC0+bG9jYXRpb24gJiBQTkdfSEFWRV9JREFUKSAmJgotICAgICAgICAgICAgISh1cC0+bG9jYXRpb24gJiBQTkdfQUZURVJfSURBVCkgJiYKLSAgICAgICAgICAgICgodXAtPm5hbWVbM10gJiAweDIwKSB8fCBrZWVwID09IFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTIHx8Ci0gICAgICAgICAgICAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19LRUVQX1VOU0FGRV9DSFVOS1MpKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCB1cC0+bmFtZSwgdXAtPmRhdGEsIHVwLT5zaXplKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotfQotCi0vKiBXcml0ZXMgdGhlIGVuZCBvZiB0aGUgUE5HIGZpbGUuICBJZiB5b3UgZG9uJ3Qgd2FudCB0byB3cml0ZSBjb21tZW50cyBvcgotICogdGltZSBpbmZvcm1hdGlvbiwgeW91IGNhbiBwYXNzIE5VTEwgZm9yIGluZm8uICBJZiB5b3UgYWxyZWFkeSB3cm90ZSB0aGVzZQotICogaW4gcG5nX3dyaXRlX2luZm8oKSwgZG8gbm90IHdyaXRlIHRoZW0gYWdhaW4gaGVyZS4gIElmIHlvdSBoYXZlIGxvbmcKLSAqIGNvbW1lbnRzLCBJIHN1Z2dlc3Qgd3JpdGluZyB0aGVtIGhlcmUsIGFuZCBjb21wcmVzc2luZyB0aGVtLgotICovCi12b2lkIFBOR0FQSQotcG5nX3dyaXRlX2VuZChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9lbmQiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTm8gSURBVHMgd3JpdHRlbiBpbnRvIGZpbGUiKTsKLQotICAgLyogU2VlIGlmIHVzZXIgd2FudHMgdXMgdG8gd3JpdGUgaW5mb3JtYXRpb24gY2h1bmtzICovCi0gICBpZiAoaW5mb19wdHIgIT0gTlVMTCkKLSAgIHsKLSNpZmRlZiBQTkdfV1JJVEVfVEVYVF9TVVBQT1JURUQKLSAgICAgIGludCBpOyAvKiBsb2NhbCBpbmRleCB2YXJpYWJsZSAqLwotI2VuZGlmCi0jaWZkZWYgUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVECi0gICAgICAvKiBDaGVjayB0byBzZWUgaWYgdXNlciBoYXMgc3VwcGxpZWQgYSB0aW1lIGNodW5rICovCi0gICAgICBpZiAoKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3RJTUUpICYmCi0gICAgICAgICAhKHBuZ19wdHItPm1vZGUgJiBQTkdfV1JPVEVfdElNRSkpCi0gICAgICAgICBwbmdfd3JpdGVfdElNRShwbmdfcHRyLCAmKGluZm9fcHRyLT5tb2RfdGltZSkpOwotI2VuZGlmCi0jaWZkZWYgUE5HX1dSSVRFX1RFWFRfU1VQUE9SVEVECi0gICAgICAvKiBMb29wIHRocm91Z2ggY29tbWVudCBjaHVua3MgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvX3B0ci0+bnVtX3RleHQ7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIHBuZ19kZWJ1ZzIoMiwgIldyaXRpbmcgdHJhaWxlciB0ZXh0IGNodW5rICVkLCB0eXBlICVkIiwgaSwKLSAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uKTsKLSAgICAgICAgIC8qIEFuIGludGVybmF0aW9uYWxpemVkIGNodW5rPyAqLwotICAgICAgICAgaWYgKGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID4gMCkKLSAgICAgICAgIHsKLSNpZmRlZiBQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQKLSAgICAgICAgICAgIC8qIFdyaXRlIGludGVybmF0aW9uYWwgY2h1bmsgKi8KLSAgICAgICAgICAgIHBuZ193cml0ZV9pVFh0KHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmxhbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5sYW5nX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLnRleHQpOwotI2Vsc2UKLSAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmFibGUgdG8gd3JpdGUgaW50ZXJuYXRpb25hbCB0ZXh0Iik7Ci0jZW5kaWYKLSAgICAgICAgICAgIC8qIE1hcmsgdGhpcyBjaHVuayBhcyB3cml0dGVuICovCi0gICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1I7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlIGlmIChpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA+PSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0KQotICAgICAgICAgewotI2lmZGVmIFBOR19XUklURV96VFh0X1NVUFBPUlRFRAotICAgICAgICAgICAgLyogV3JpdGUgY29tcHJlc3NlZCBjaHVuayAqLwotICAgICAgICAgICAgcG5nX3dyaXRlX3pUWHQocG5nX3B0ciwgaW5mb19wdHItPnRleHRbaV0ua2V5LAotICAgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0udGV4dCwgMCwKLSAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uKTsKLSNlbHNlCi0gICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5hYmxlIHRvIHdyaXRlIGNvbXByZXNzZWQgdGV4dCIpOwotI2VuZGlmCi0gICAgICAgICAgICAvKiBNYXJrIHRoaXMgY2h1bmsgYXMgd3JpdHRlbiAqLwotICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0X1dSOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSBpZiAoaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24gPT0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORSkKLSAgICAgICAgIHsKLSNpZmRlZiBQTkdfV1JJVEVfdEVYdF9TVVBQT1JURUQKLSAgICAgICAgICAgIC8qIFdyaXRlIHVuY29tcHJlc3NlZCBjaHVuayAqLwotICAgICAgICAgICAgcG5nX3dyaXRlX3RFWHQocG5nX3B0ciwgaW5mb19wdHItPnRleHRbaV0ua2V5LAotICAgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0udGV4dCwgMCk7Ci0jZWxzZQotICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVuYWJsZSB0byB3cml0ZSB1bmNvbXByZXNzZWQgdGV4dCIpOwotI2VuZGlmCi0KLSAgICAgICAgICAgIC8qIE1hcmsgdGhpcyBjaHVuayBhcyB3cml0dGVuICovCi0gICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1I7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0jZW5kaWYKLSNpZmRlZiBQTkdfV1JJVEVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECi0gICBpZiAoaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSkKLSAgIHsKLSAgICAgIHBuZ191bmtub3duX2NodW5rICp1cDsKLQotICAgICAgcG5nX2RlYnVnKDUsICJ3cml0aW5nIGV4dHJhIGNodW5rcyIpOwotCi0gICAgICBmb3IgKHVwID0gaW5mb19wdHItPnVua25vd25fY2h1bmtzOwotICAgICAgICAgICB1cCA8IGluZm9fcHRyLT51bmtub3duX2NodW5rcyArIGluZm9fcHRyLT51bmtub3duX2NodW5rc19udW07Ci0gICAgICAgICAgIHVwKyspCi0gICAgICB7Ci0gICAgICAgICBpbnQga2VlcCA9IHBuZ19oYW5kbGVfYXNfdW5rbm93bihwbmdfcHRyLCB1cC0+bmFtZSk7Ci0gICAgICAgICBpZiAoa2VlcCAhPSBQTkdfSEFORExFX0NIVU5LX05FVkVSICYmCi0gICAgICAgICAgICB1cC0+bG9jYXRpb24gJiYgKHVwLT5sb2NhdGlvbiAmIFBOR19BRlRFUl9JREFUKSAmJgotICAgICAgICAgICAgKCh1cC0+bmFtZVszXSAmIDB4MjApIHx8IGtlZXAgPT0gUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMgfHwKLSAgICAgICAgICAgIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0tFRVBfVU5TQUZFX0NIVU5LUykpKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIHVwLT5uYW1lLCB1cC0+ZGF0YSwgdXAtPnNpemUpOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotI2VuZGlmCi0gICB9Ci0KLSAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0FGVEVSX0lEQVQ7Ci0KLSAgIC8qIFdyaXRlIGVuZCBvZiBQTkcgZmlsZSAqLwotICAgcG5nX3dyaXRlX0lFTkQocG5nX3B0cik7Ci0gICAvKiBUaGlzIGZsdXNoLCBhZGRlZCBpbiBsaWJwbmctMS4wLjgsIHJlbW92ZWQgZnJvbSBsaWJwbmctMS4wLjliZXRhMDMsCi0gICAgKiBhbmQgcmVzdG9yZWQgYWdhaW4gaW4gbGlicG5nLTEuMi4zMCwgbWF5IGNhdXNlIHNvbWUgYXBwbGljYXRpb25zIHRoYXQKLSAgICAqIGRvIG5vdCBzZXQgcG5nX3B0ci0+b3V0cHV0X2ZsdXNoX2ZuIHRvIGNyYXNoLiAgSWYgeW91ciBhcHBsaWNhdGlvbgotICAgICogZXhwZXJpZW5jZXMgYSBwcm9ibGVtLCBwbGVhc2UgdHJ5IGJ1aWxkaW5nIGxpYnBuZyB3aXRoCi0gICAgKiBQTkdfV1JJVEVfRkxVU0hfQUZURVJfSUVORF9TVVBQT1JURUQgZGVmaW5lZCwgYW5kIHJlcG9ydCB0aGUgZXZlbnQgdG8KLSAgICAqIHBuZy1tbmctaW1wbGVtZW50IGF0IGxpc3RzLnNmLm5ldCAuCi0gICAgKi8KLSNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECi0jICBpZmRlZiBQTkdfV1JJVEVfRkxVU0hfQUZURVJfSUVORF9TVVBQT1JURUQKLSAgIHBuZ19mbHVzaChwbmdfcHRyKTsKLSMgIGVuZGlmCi0jZW5kaWYKLX0KLQotI2lmZGVmIFBOR19DT05WRVJUX3RJTUVfU1VQUE9SVEVECi0vKiAidG0iIHN0cnVjdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3NDRSAqLwotdm9pZCBQTkdBUEkKLXBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKHBuZ190aW1lcCBwdGltZSwgc3RydWN0IHRtIEZBUiAqIHR0aW1lKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSIpOwotCi0gICBwdGltZS0+eWVhciA9IChwbmdfdWludF8xNikoMTkwMCArIHR0aW1lLT50bV95ZWFyKTsKLSAgIHB0aW1lLT5tb250aCA9IChwbmdfYnl0ZSkodHRpbWUtPnRtX21vbiArIDEpOwotICAgcHRpbWUtPmRheSA9IChwbmdfYnl0ZSl0dGltZS0+dG1fbWRheTsKLSAgIHB0aW1lLT5ob3VyID0gKHBuZ19ieXRlKXR0aW1lLT50bV9ob3VyOwotICAgcHRpbWUtPm1pbnV0ZSA9IChwbmdfYnl0ZSl0dGltZS0+dG1fbWluOwotICAgcHRpbWUtPnNlY29uZCA9IChwbmdfYnl0ZSl0dGltZS0+dG1fc2VjOwotfQotCi12b2lkIFBOR0FQSQotcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QocG5nX3RpbWVwIHB0aW1lLCB0aW1lX3QgdHRpbWUpCi17Ci0gICBzdHJ1Y3QgdG0gKnRidWY7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QiKTsKLQotICAgdGJ1ZiA9IGdtdGltZSgmdHRpbWUpOwotICAgcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0ocHRpbWUsIHRidWYpOwotfQotI2VuZGlmCi0KLS8qIEluaXRpYWxpemUgcG5nX3B0ciBzdHJ1Y3R1cmUsIGFuZCBhbGxvY2F0ZSBhbnkgbWVtb3J5IG5lZWRlZCAqLwotcG5nX3N0cnVjdHAgUE5HQVBJCi1wbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLAotICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwgcG5nX2Vycm9yX3B0ciB3YXJuX2ZuKQotewotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgIHJldHVybiAocG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMih1c2VyX3BuZ192ZXIsIGVycm9yX3B0ciwgZXJyb3JfZm4sCi0gICAgICB3YXJuX2ZuLCBOVUxMLCBOVUxMLCBOVUxMKSk7Ci19Ci0KLS8qIEFsdGVybmF0ZSBpbml0aWFsaXplIHBuZ19wdHIgc3RydWN0dXJlLCBhbmQgYWxsb2NhdGUgYW55IG1lbW9yeSBuZWVkZWQgKi8KLXBuZ19zdHJ1Y3RwIFBOR0FQSQotcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMihwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLAotICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwgcG5nX2Vycm9yX3B0ciB3YXJuX2ZuLCBwbmdfdm9pZHAgbWVtX3B0ciwKLSAgIHBuZ19tYWxsb2NfcHRyIG1hbGxvY19mbiwgcG5nX2ZyZWVfcHRyIGZyZWVfZm4pCi17Ci0jZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAqLwotICAgdm9sYXRpbGUgaW50IHBuZ19jbGVhbnVwX25lZWRlZCA9IDA7Ci0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSAgIHZvbGF0aWxlCi0jZW5kaWYKLSAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHI7Ci0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSNpZmRlZiBVU0VfRkFSX0tFWVdPUkQKLSAgIGptcF9idWYgam1wYnVmOwotI2VuZGlmCi0jZW5kaWYKLSAgIGludCBpOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0Iik7Ci0KLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBwbmdfcHRyID0gKHBuZ19zdHJ1Y3RwKXBuZ19jcmVhdGVfc3RydWN0XzIoUE5HX1NUUlVDVF9QTkcsCi0gICAgICAocG5nX21hbGxvY19wdHIpbWFsbG9jX2ZuLCAocG5nX3ZvaWRwKW1lbV9wdHIpOwotI2Vsc2UKLSAgIHBuZ19wdHIgPSAocG5nX3N0cnVjdHApcG5nX2NyZWF0ZV9zdHJ1Y3QoUE5HX1NUUlVDVF9QTkcpOwotI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm4gKE5VTEwpOwotCi0gICAvKiBBZGRlZCBhdCBsaWJwbmctMS4yLjYgKi8KLSNpZmRlZiBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRAotICAgcG5nX3B0ci0+dXNlcl93aWR0aF9tYXggPSBQTkdfVVNFUl9XSURUSF9NQVg7Ci0gICBwbmdfcHRyLT51c2VyX2hlaWdodF9tYXggPSBQTkdfVVNFUl9IRUlHSFRfTUFYOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAotLyogQXBwbGljYXRpb25zIHRoYXQgbmVnbGVjdCB0byBzZXQgdXAgdGhlaXIgb3duIHNldGptcCgpIGFuZCB0aGVuCi0gICBlbmNvdW50ZXIgYSBwbmdfZXJyb3IoKSB3aWxsIGxvbmdqbXAgaGVyZS4gIFNpbmNlIHRoZSBqbXBidWYgaXMKLSAgIHRoZW4gbWVhbmluZ2xlc3Mgd2UgYWJvcnQgaW5zdGVhZCBvZiByZXR1cm5pbmcuICovCi0jaWZkZWYgVVNFX0ZBUl9LRVlXT1JECi0gICBpZiAoc2V0am1wKGptcGJ1ZikpCi0jZWxzZQotICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkgLyogc2V0cyBsb25nam1wIHRvIG1hdGNoIHNldGptcCAqLwotI2VuZGlmCi0jaWZkZWYgVVNFX0ZBUl9LRVlXT1JECi0gICBwbmdfbWVtY3B5KHBuZ19qbXBidWYocG5nX3B0ciksIGptcGJ1ZiwgcG5nX3NpemVvZihqbXBfYnVmKSk7Ci0jZW5kaWYKLSAgICAgIFBOR19BQk9SVCgpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBwbmdfc2V0X21lbV9mbihwbmdfcHRyLCBtZW1fcHRyLCBtYWxsb2NfZm4sIGZyZWVfZm4pOwotI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KLSAgIHBuZ19zZXRfZXJyb3JfZm4ocG5nX3B0ciwgZXJyb3JfcHRyLCBlcnJvcl9mbiwgd2Fybl9mbik7Ci0KLSAgIGlmICh1c2VyX3BuZ192ZXIpCi0gICB7Ci0gICAgICBpID0gMDsKLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgICBpZiAodXNlcl9wbmdfdmVyW2ldICE9IHBuZ19saWJwbmdfdmVyW2ldKQotICAgICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfTElCUkFSWV9NSVNNQVRDSDsKLSAgICAgIH0gd2hpbGUgKHBuZ19saWJwbmdfdmVyW2krK10pOwotICAgfQotCi0gICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19MSUJSQVJZX01JU01BVENIKQotICAgewotICAgICAvKiBMaWJwbmcgMC45MCBhbmQgbGF0ZXIgYXJlIGJpbmFyeSBpbmNvbXBhdGlibGUgd2l0aCBsaWJwbmcgMC44OSwgc28KLSAgICAgICogd2UgbXVzdCByZWNvbXBpbGUgYW55IGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBhbnkgb2xkZXIgbGlicmFyeSB2ZXJzaW9uLgotICAgICAgKiBGb3IgdmVyc2lvbnMgYWZ0ZXIgbGlicG5nIDEuMCwgd2Ugd2lsbCBiZSBjb21wYXRpYmxlLCBzbyB3ZSBuZWVkCi0gICAgICAqIG9ubHkgY2hlY2sgdGhlIGZpcnN0IGRpZ2l0LgotICAgICAgKi8KLSAgICAgaWYgKHVzZXJfcG5nX3ZlciA9PSBOVUxMIHx8IHVzZXJfcG5nX3ZlclswXSAhPSBwbmdfbGlicG5nX3ZlclswXSB8fAotICAgICAgICAgKHVzZXJfcG5nX3ZlclswXSA9PSAnMScgJiYgdXNlcl9wbmdfdmVyWzJdICE9IHBuZ19saWJwbmdfdmVyWzJdKSB8fAotICAgICAgICAgKHVzZXJfcG5nX3ZlclswXSA9PSAnMCcgJiYgdXNlcl9wbmdfdmVyWzJdIDwgJzknKSkKLSAgICAgewotI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQKLSAgICAgICAgY2hhciBtc2dbODBdOwotICAgICAgICBpZiAodXNlcl9wbmdfdmVyKQotICAgICAgICB7Ci0gICAgICAgICAgIHBuZ19zbnByaW50Zihtc2csIDgwLAotICAgICAgICAgICAgICAiQXBwbGljYXRpb24gd2FzIGNvbXBpbGVkIHdpdGggcG5nLmggZnJvbSBsaWJwbmctJS4yMHMiLAotICAgICAgICAgICAgICB1c2VyX3BuZ192ZXIpOwotICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCBtc2cpOwotICAgICAgICB9Ci0gICAgICAgIHBuZ19zbnByaW50Zihtc2csIDgwLAotICAgICAgICAgICAiQXBwbGljYXRpb24gIGlzICBydW5uaW5nIHdpdGggcG5nLmMgZnJvbSBsaWJwbmctJS4yMHMiLAotICAgICAgICAgICBwbmdfbGlicG5nX3Zlcik7Ci0gICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIG1zZyk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQKLSAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgPSAwOwotI2VuZGlmCi0gICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAgICJJbmNvbXBhdGlibGUgbGlicG5nIHZlcnNpb24gaW4gYXBwbGljYXRpb24gYW5kIGxpYnJhcnkiKTsKLSAgICAgICAgcG5nX2NsZWFudXBfbmVlZGVkID0gMTsKLSAgICAgfQotICAgfQotCi0gICAvKiBJbml0aWFsaXplIHpidWYgLSBjb21wcmVzc2lvbiBidWZmZXIgKi8KLSAgIHBuZ19wdHItPnpidWZfc2l6ZSA9IFBOR19aQlVGX1NJWkU7Ci0gICBpZiAoIXBuZ19jbGVhbnVwX25lZWRlZCkKLSAgIHsKLSAgICAgIHBuZ19wdHItPnpidWYgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLAotICAgICAgICAgcG5nX3B0ci0+emJ1Zl9zaXplKTsKLSAgICAgIGlmIChwbmdfcHRyLT56YnVmID09IE5VTEwpCi0gICAgICAgICBwbmdfY2xlYW51cF9uZWVkZWQgPSAxOwotICAgfQotICAgaWYgKHBuZ19jbGVhbnVwX25lZWRlZCkKLSAgIHsKLSAgICAgICAvKiBDbGVhbiB1cCBQTkcgc3RydWN0dXJlIGFuZCBkZWFsbG9jYXRlIGFueSBtZW1vcnkuICovCi0gICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+emJ1Zik7Ci0gICAgICAgcG5nX3B0ci0+emJ1ZiA9IE5VTEw7Ci0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgICAgIHBuZ19kZXN0cm95X3N0cnVjdF8yKChwbmdfdm9pZHApcG5nX3B0ciwKLSAgICAgICAgICAocG5nX2ZyZWVfcHRyKWZyZWVfZm4sIChwbmdfdm9pZHApbWVtX3B0cik7Ci0jZWxzZQotICAgICAgIHBuZ19kZXN0cm95X3N0cnVjdCgocG5nX3ZvaWRwKXBuZ19wdHIpOwotI2VuZGlmCi0gICAgICAgcmV0dXJuIChOVUxMKTsKLSAgIH0KLQotICAgcG5nX3NldF93cml0ZV9mbihwbmdfcHRyLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQotI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVECi0gICBwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzKHBuZ19wdHIsIFBOR19GSUxURVJfSEVVUklTVElDX0RFRkFVTFQsCi0gICAgICAxLCBOVUxMLCBOVUxMKTsKLSNlbmRpZgotCi0gICByZXR1cm4gKHBuZ19wdHIpOwotfQotCi0KLS8qIFdyaXRlIGEgZmV3IHJvd3Mgb2YgaW1hZ2UgZGF0YS4gIElmIHRoZSBpbWFnZSBpcyBpbnRlcmxhY2VkLAotICogZWl0aGVyIHlvdSB3aWxsIGhhdmUgdG8gd3JpdGUgdGhlIDcgc3ViIGltYWdlcywgb3IsIGlmIHlvdQotICogaGF2ZSBjYWxsZWQgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSwgeW91IHdpbGwgaGF2ZSB0bwotICogIndyaXRlIiB0aGUgaW1hZ2Ugc2V2ZW4gdGltZXMuCi0gKi8KLXZvaWQgUE5HQVBJCi1wbmdfd3JpdGVfcm93cyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXBwIHJvdywKLSAgIHBuZ191aW50XzMyIG51bV9yb3dzKQotewotICAgcG5nX3VpbnRfMzIgaTsgLyogcm93IGNvdW50ZXIgKi8KLSAgIHBuZ19ieXRlcHAgcnA7IC8qIHJvdyBwb2ludGVyICovCi0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3Jvd3MiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgLyogTG9vcCB0aHJvdWdoIHRoZSByb3dzICovCi0gICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IG51bV9yb3dzOyBpKyssIHJwKyspCi0gICB7Ci0gICAgICBwbmdfd3JpdGVfcm93KHBuZ19wdHIsICpycCk7Ci0gICB9Ci19Ci0KLS8qIFdyaXRlIHRoZSBpbWFnZS4gIFlvdSBvbmx5IG5lZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIG9uY2UsIGV2ZW4KLSAqIGlmIHlvdSBhcmUgd3JpdGluZyBhbiBpbnRlcmxhY2VkIGltYWdlLgotICovCi12b2lkIFBOR0FQSQotcG5nX3dyaXRlX2ltYWdlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcHAgaW1hZ2UpCi17Ci0gICBwbmdfdWludF8zMiBpOyAvKiByb3cgaW5kZXggKi8KLSAgIGludCBwYXNzLCBudW1fcGFzczsgLyogcGFzcyB2YXJpYWJsZXMgKi8KLSAgIHBuZ19ieXRlcHAgcnA7IC8qIHBvaW50cyB0byBjdXJyZW50IHJvdyAqLwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9pbWFnZSIpOwotCi0jaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotICAgLyogSW5pdGlhbGl6ZSBpbnRlcmxhY2UgaGFuZGxpbmcuICBJZiBpbWFnZSBpcyBub3QgaW50ZXJsYWNlZCwKLSAgICAqIHRoaXMgd2lsbCBzZXQgcGFzcyB0byAxCi0gICAgKi8KLSAgIG51bV9wYXNzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7Ci0jZWxzZQotICAgbnVtX3Bhc3MgPSAxOwotI2VuZGlmCi0gICAvKiBMb29wIHRocm91Z2ggcGFzc2VzICovCi0gICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgbnVtX3Bhc3M7IHBhc3MrKykKLSAgIHsKLSAgICAgIC8qIExvb3AgdGhyb3VnaCBpbWFnZSAqLwotICAgICAgZm9yIChpID0gMCwgcnAgPSBpbWFnZTsgaSA8IHBuZ19wdHItPmhlaWdodDsgaSsrLCBycCsrKQotICAgICAgewotICAgICAgICAgcG5nX3dyaXRlX3JvdyhwbmdfcHRyLCAqcnApOwotICAgICAgfQotICAgfQotfQotCi0vKiBDYWxsZWQgYnkgdXNlciB0byB3cml0ZSBhIHJvdyBvZiBpbWFnZSBkYXRhICovCi12b2lkIFBOR0FQSQotcG5nX3dyaXRlX3Jvdyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgcm93KQotewotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgcG5nX2RlYnVnMigxLCAiaW4gcG5nX3dyaXRlX3JvdyAocm93ICVsdSwgcGFzcyAlZCkiLAotICAgICAgKHVuc2lnbmVkIGxvbmcpcG5nX3B0ci0+cm93X251bWJlciwgcG5nX3B0ci0+cGFzcyk7Ci0KLSAgIC8qIEluaXRpYWxpemUgdHJhbnNmb3JtYXRpb25zIGFuZCBvdGhlciBzdHVmZiBpZiBmaXJzdCB0aW1lICovCi0gICBpZiAocG5nX3B0ci0+cm93X251bWJlciA9PSAwICYmIHBuZ19wdHItPnBhc3MgPT0gMCkKLSAgIHsKLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSB3cm90ZSB0aGUgaGVhZGVyIGluZm8gKi8KLSAgICAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfV1JPVEVfSU5GT19CRUZPUkVfUExURSkpCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwKLSAgICAgICAgICAgICJwbmdfd3JpdGVfaW5mbyB3YXMgbmV2ZXIgY2FsbGVkIGJlZm9yZSBwbmdfd3JpdGVfcm93Iik7Ci0KLSAgICAgIC8qIENoZWNrIGZvciB0cmFuc2Zvcm1zIHRoYXQgaGF2ZSBiZWVuIHNldCBidXQgd2VyZSBkZWZpbmVkIG91dCAqLwotI2lmICFkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19SRUFEX0lOVkVSVF9TVVBQT1JURUQpCi0gICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVkVSVF9NT05PKQotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZChQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEKQotICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19GSUxMRVIpCi0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQiKTsKLSNlbmRpZgotI2lmICFkZWZpbmVkKFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQpICYmIFwKLSAgICBkZWZpbmVkKFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRCkKLSAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDS1NXQVApCi0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAgICJQTkdfV1JJVEVfUEFDS1NXQVBfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZChQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1JFQURfUEFDS19TVVBQT1JURUQpCi0gICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0spCi0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZChQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCkKLSAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU0hJRlQpCi0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZCIpOwotI2VuZGlmCi0jaWYgIWRlZmluZWQoUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1JFQURfQkdSX1NVUFBPUlRFRCkKLSAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkdSKQotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19XUklURV9CR1JfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1JFQURfU1dBUF9TVVBQT1JURUQpCi0gICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NXQVBfQllURVMpCi0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7Ci0jZW5kaWYKLQotICAgICAgcG5nX3dyaXRlX3N0YXJ0X3JvdyhwbmdfcHRyKTsKLSAgIH0KLQotI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSAgIC8qIElmIGludGVybGFjZWQgYW5kIG5vdCBpbnRlcmVzdGVkIGluIHJvdywgcmV0dXJuICovCi0gICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCAmJiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkpCi0gICB7Ci0gICAgICBzd2l0Y2ggKHBuZ19wdHItPnBhc3MpCi0gICAgICB7Ci0gICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cm93X251bWJlciAmIDB4MDcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwNykgfHwgcG5nX3B0ci0+d2lkdGggPCA1KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGlmICgocG5nX3B0ci0+cm93X251bWJlciAmIDB4MDcpICE9IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwMykgfHwgcG5nX3B0ci0+d2lkdGggPCAzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGlmICgocG5nX3B0ci0+cm93X251bWJlciAmIDB4MDMpICE9IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwMSkgfHwgcG5nX3B0ci0+d2lkdGggPCAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIGlmICghKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDAxKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ193cml0ZV9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLQotICAgLyogU2V0IHVwIHJvdyBpbmZvIGZvciB0cmFuc2Zvcm1hdGlvbnMgKi8KLSAgIHBuZ19wdHItPnJvd19pbmZvLmNvbG9yX3R5cGUgPSBwbmdfcHRyLT5jb2xvcl90eXBlOwotICAgcG5nX3B0ci0+cm93X2luZm8ud2lkdGggPSBwbmdfcHRyLT51c3Jfd2lkdGg7Ci0gICBwbmdfcHRyLT5yb3dfaW5mby5jaGFubmVscyA9IHBuZ19wdHItPnVzcl9jaGFubmVsczsKLSAgIHBuZ19wdHItPnJvd19pbmZvLmJpdF9kZXB0aCA9IHBuZ19wdHItPnVzcl9iaXRfZGVwdGg7Ci0gICBwbmdfcHRyLT5yb3dfaW5mby5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkocG5nX3B0ci0+cm93X2luZm8uYml0X2RlcHRoICoKLSAgICAgIHBuZ19wdHItPnJvd19pbmZvLmNoYW5uZWxzKTsKLQotICAgcG5nX3B0ci0+cm93X2luZm8ucm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocG5nX3B0ci0+cm93X2luZm8ucGl4ZWxfZGVwdGgsCi0gICAgICBwbmdfcHRyLT5yb3dfaW5mby53aWR0aCk7Ci0KLSAgIHBuZ19kZWJ1ZzEoMywgInJvd19pbmZvLT5jb2xvcl90eXBlID0gJWQiLCBwbmdfcHRyLT5yb3dfaW5mby5jb2xvcl90eXBlKTsKLSAgIHBuZ19kZWJ1ZzEoMywgInJvd19pbmZvLT53aWR0aCA9ICVsdSIsCi0gICAgICAodW5zaWduZWQgbG9uZylwbmdfcHRyLT5yb3dfaW5mby53aWR0aCk7Ci0gICBwbmdfZGVidWcxKDMsICJyb3dfaW5mby0+Y2hhbm5lbHMgPSAlZCIsIHBuZ19wdHItPnJvd19pbmZvLmNoYW5uZWxzKTsKLSAgIHBuZ19kZWJ1ZzEoMywgInJvd19pbmZvLT5iaXRfZGVwdGggPSAlZCIsIHBuZ19wdHItPnJvd19pbmZvLmJpdF9kZXB0aCk7Ci0gICBwbmdfZGVidWcxKDMsICJyb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAlZCIsIHBuZ19wdHItPnJvd19pbmZvLnBpeGVsX2RlcHRoKTsKLSAgIHBuZ19kZWJ1ZzEoMywgInJvd19pbmZvLT5yb3dieXRlcyA9ICVsdSIsIHBuZ19wdHItPnJvd19pbmZvLnJvd2J5dGVzKTsKLQotICAgLyogQ29weSB1c2VyJ3Mgcm93IGludG8gYnVmZmVyLCBsZWF2aW5nIHJvb20gZm9yIGZpbHRlciBieXRlLiAqLwotICAgcG5nX21lbWNweShwbmdfcHRyLT5yb3dfYnVmICsgMSwgcm93LCBwbmdfcHRyLT5yb3dfaW5mby5yb3dieXRlcyk7Ci0KLSNpZmRlZiBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVECi0gICAvKiBIYW5kbGUgaW50ZXJsYWNpbmcgKi8KLSAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkICYmIHBuZ19wdHItPnBhc3MgPCA2ICYmCi0gICAgICAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkpCi0gICB7Ci0gICAgICBwbmdfZG9fd3JpdGVfaW50ZXJsYWNlKCYocG5nX3B0ci0+cm93X2luZm8pLAotICAgICAgICAgcG5nX3B0ci0+cm93X2J1ZiArIDEsIHBuZ19wdHItPnBhc3MpOwotICAgICAgLyogVGhpcyBzaG91bGQgYWx3YXlzIGdldCBjYXVnaHQgYWJvdmUsIGJ1dCBzdGlsbCAuLi4gKi8KLSAgICAgIGlmICghKHBuZ19wdHItPnJvd19pbmZvLndpZHRoKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ193cml0ZV9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgfQotI2VuZGlmCi0KLSAgIC8qIEhhbmRsZSBvdGhlciB0cmFuc2Zvcm1hdGlvbnMgKi8KLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMpCi0gICAgICBwbmdfZG9fd3JpdGVfdHJhbnNmb3JtYXRpb25zKHBuZ19wdHIpOwotCi0jaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKLSAgIC8qIFdyaXRlIGZpbHRlcl9tZXRob2QgNjQgKGludHJhcGl4ZWwgZGlmZmVyZW5jaW5nKSBvbmx5IGlmCi0gICAgKiAxLiBMaWJwbmcgd2FzIGNvbXBpbGVkIHdpdGggUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQgYW5kCi0gICAgKiAyLiBMaWJwbmcgZGlkIG5vdCB3cml0ZSBhIFBORyBzaWduYXR1cmUgKHRoaXMgZmlsdGVyX21ldGhvZCBpcyBvbmx5Ci0gICAgKiAgICB1c2VkIGluIFBORyBkYXRhc3RyZWFtcyB0aGF0IGFyZSBlbWJlZGRlZCBpbiBNTkcgZGF0YXN0cmVhbXMpIGFuZAotICAgICogMy4gVGhlIGFwcGxpY2F0aW9uIGNhbGxlZCBwbmdfcGVybWl0X21uZ19mZWF0dXJlcyB3aXRoIGEgbWFzayB0aGF0Ci0gICAgKiAgICBpbmNsdWRlZCBQTkdfRkxBR19NTkdfRklMVEVSXzY0IGFuZAotICAgICogNC4gVGhlIGZpbHRlcl9tZXRob2QgaXMgNjQgYW5kCi0gICAgKiA1LiBUaGUgY29sb3JfdHlwZSBpcyBSR0Igb3IgUkdCQQotICAgICovCi0gICBpZiAoKHBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQgJiBQTkdfRkxBR19NTkdfRklMVEVSXzY0KSAmJgotICAgICAgKHBuZ19wdHItPmZpbHRlcl90eXBlID09IFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORykpCi0gICB7Ci0gICAgICAvKiBJbnRyYXBpeGVsIGRpZmZlcmVuY2luZyAqLwotICAgICAgcG5nX2RvX3dyaXRlX2ludHJhcGl4ZWwoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSAgIH0KLSNlbmRpZgotCi0gICAvKiBGaW5kIGEgZmlsdGVyIGlmIG5lY2Vzc2FyeSwgZmlsdGVyIHRoZSByb3cgYW5kIHdyaXRlIGl0IG91dC4gKi8KLSAgIHBuZ193cml0ZV9maW5kX2ZpbHRlcihwbmdfcHRyLCAmKHBuZ19wdHItPnJvd19pbmZvKSk7Ci0KLSAgIGlmIChwbmdfcHRyLT53cml0ZV9yb3dfZm4gIT0gTlVMTCkKLSAgICAgICgqKHBuZ19wdHItPndyaXRlX3Jvd19mbikpKHBuZ19wdHIsIHBuZ19wdHItPnJvd19udW1iZXIsIHBuZ19wdHItPnBhc3MpOwotfQotCi0jaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRAotLyogU2V0IHRoZSBhdXRvbWF0aWMgZmx1c2ggaW50ZXJ2YWwgb3IgMCB0byB0dXJuIGZsdXNoaW5nIG9mZiAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfZmx1c2gocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IG5yb3dzKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2ZsdXNoIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcHRyLT5mbHVzaF9kaXN0ID0gKG5yb3dzIDwgMCA/IDAgOiBucm93cyk7Ci19Ci0KLS8qIEZsdXNoIHRoZSBjdXJyZW50IG91dHB1dCBidWZmZXJzIG5vdyAqLwotdm9pZCBQTkdBUEkKLXBuZ193cml0ZV9mbHVzaChwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgaW50IHdyb3RlX0lEQVQ7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2ZsdXNoIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICAvKiBXZSBoYXZlIGFscmVhZHkgd3JpdHRlbiBvdXQgYWxsIG9mIHRoZSBkYXRhICovCi0gICBpZiAocG5nX3B0ci0+cm93X251bWJlciA+PSBwbmdfcHRyLT5udW1fcm93cykKLSAgICAgIHJldHVybjsKLQotICAgZG8KLSAgIHsKLSAgICAgIGludCByZXQ7Ci0KLSAgICAgIC8qIENvbXByZXNzIHRoZSBkYXRhICovCi0gICAgICByZXQgPSBkZWZsYXRlKCZwbmdfcHRyLT56c3RyZWFtLCBaX1NZTkNfRkxVU0gpOwotICAgICAgd3JvdGVfSURBVCA9IDA7Ci0KLSAgICAgIC8qIENoZWNrIGZvciBjb21wcmVzc2lvbiBlcnJvcnMgKi8KLSAgICAgIGlmIChyZXQgIT0gWl9PSykKLSAgICAgIHsKLSAgICAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLm1zZyAhPSBOVUxMKQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIHBuZ19wdHItPnpzdHJlYW0ubXNnKTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiemxpYiBlcnJvciIpOwotICAgICAgfQotCi0gICAgICBpZiAoIShwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCkpCi0gICAgICB7Ci0gICAgICAgICAvKiBXcml0ZSB0aGUgSURBVCBhbmQgcmVzZXQgdGhlIHpsaWIgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgcG5nX3dyaXRlX0lEQVQocG5nX3B0ciwgcG5nX3B0ci0+emJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnpidWZfc2l6ZSk7Ci0gICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKLSAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpcG5nX3B0ci0+emJ1Zl9zaXplOwotICAgICAgICAgd3JvdGVfSURBVCA9IDE7Ci0gICAgICB9Ci0gICB9IHdoaWxlKHdyb3RlX0lEQVQgPT0gMSk7Ci0KLSAgIC8qIElmIHRoZXJlIGlzIGFueSBkYXRhIGxlZnQgdG8gYmUgb3V0cHV0LCB3cml0ZSBpdCBpbnRvIGEgbmV3IElEQVQgKi8KLSAgIGlmIChwbmdfcHRyLT56YnVmX3NpemUgIT0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQpCi0gICB7Ci0gICAgICAvKiBXcml0ZSB0aGUgSURBVCBhbmQgcmVzZXQgdGhlIHpsaWIgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgcG5nX3dyaXRlX0lEQVQocG5nX3B0ciwgcG5nX3B0ci0+emJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnpidWZfc2l6ZSAtIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0KTsKLSAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT56YnVmOwotICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAodUludClwbmdfcHRyLT56YnVmX3NpemU7Ci0gICB9Ci0gICBwbmdfcHRyLT5mbHVzaF9yb3dzID0gMDsKLSAgIHBuZ19mbHVzaChwbmdfcHRyKTsKLX0KLSNlbmRpZiAvKiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVEICovCi0KLS8qIEZyZWUgYWxsIG1lbW9yeSB1c2VkIGJ5IHRoZSB3cml0ZSAqLwotdm9pZCBQTkdBUEkKLXBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdChwbmdfc3RydWN0cHAgcG5nX3B0cl9wdHIsIHBuZ19pbmZvcHAgaW5mb19wdHJfcHRyKQotewotICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IE5VTEw7Ci0gICBwbmdfaW5mb3AgaW5mb19wdHIgPSBOVUxMOwotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgIHBuZ19mcmVlX3B0ciBmcmVlX2ZuID0gTlVMTDsKLSAgIHBuZ192b2lkcCBtZW1fcHRyID0gTlVMTDsKLSNlbmRpZgotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCIpOwotCi0gICBpZiAocG5nX3B0cl9wdHIgIT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ19wdHIgPSAqcG5nX3B0cl9wdHI7Ci0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgICAgZnJlZV9mbiA9IHBuZ19wdHItPmZyZWVfZm47Ci0gICAgICBtZW1fcHRyID0gcG5nX3B0ci0+bWVtX3B0cjsKLSNlbmRpZgotICAgfQotCi0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKLSAgIHsKLSAgICAgIGZyZWVfZm4gPSBwbmdfcHRyLT5mcmVlX2ZuOwotICAgICAgbWVtX3B0ciA9IHBuZ19wdHItPm1lbV9wdHI7Ci0gICB9Ci0jZW5kaWYKLQotICAgaWYgKGluZm9fcHRyX3B0ciAhPSBOVUxMKQotICAgICAgaW5mb19wdHIgPSAqaW5mb19wdHJfcHRyOwotCi0gICBpZiAoaW5mb19wdHIgIT0gTlVMTCkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIFBOR19GUkVFX0FMTCwgLTEpOwotCi0jaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAotICAgICAgICBpZiAocG5nX3B0ci0+bnVtX2NodW5rX2xpc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbGlzdCk7Ci0gICAgICAgICAgIHBuZ19wdHItPm51bV9jaHVua19saXN0ID0gMDsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICB9Ci0KLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICAgICBwbmdfZGVzdHJveV9zdHJ1Y3RfMigocG5nX3ZvaWRwKWluZm9fcHRyLCAocG5nX2ZyZWVfcHRyKWZyZWVfZm4sCi0gICAgICAgICAocG5nX3ZvaWRwKW1lbV9wdHIpOwotI2Vsc2UKLSAgICAgIHBuZ19kZXN0cm95X3N0cnVjdCgocG5nX3ZvaWRwKWluZm9fcHRyKTsKLSNlbmRpZgotICAgICAgKmluZm9fcHRyX3B0ciA9IE5VTEw7Ci0gICB9Ci0KLSAgIGlmIChwbmdfcHRyICE9IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfd3JpdGVfZGVzdHJveShwbmdfcHRyKTsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICAgICBwbmdfZGVzdHJveV9zdHJ1Y3RfMigocG5nX3ZvaWRwKXBuZ19wdHIsIChwbmdfZnJlZV9wdHIpZnJlZV9mbiwKLSAgICAgICAgIChwbmdfdm9pZHApbWVtX3B0cik7Ci0jZWxzZQotICAgICAgcG5nX2Rlc3Ryb3lfc3RydWN0KChwbmdfdm9pZHApcG5nX3B0cik7Ci0jZW5kaWYKLSAgICAgICpwbmdfcHRyX3B0ciA9IE5VTEw7Ci0gICB9Ci19Ci0KLQotLyogRnJlZSBhbnkgbWVtb3J5IHVzZWQgaW4gcG5nX3B0ciBzdHJ1Y3QgKG9sZCBtZXRob2QpICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV9kZXN0cm95KHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSAgIGptcF9idWYgdG1wX2ptcDsgLyogU2F2ZSBqdW1wIGJ1ZmZlciAqLwotI2VuZGlmCi0gICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuOwotICAgcG5nX2Vycm9yX3B0ciB3YXJuaW5nX2ZuOwotICAgcG5nX3ZvaWRwIGVycm9yX3B0cjsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBwbmdfZnJlZV9wdHIgZnJlZV9mbjsKLSNlbmRpZgotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9kZXN0cm95Iik7Ci0KLSAgIC8qIEZyZWUgYW55IG1lbW9yeSB6bGliIHVzZXMgKi8KLSAgIGRlZmxhdGVFbmQoJnBuZ19wdHItPnpzdHJlYW0pOwotCi0gICAvKiBGcmVlIG91ciBtZW1vcnkuICBwbmdfZnJlZSBjaGVja3MgTlVMTCBmb3IgdXMuICovCi0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT56YnVmKTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnJvd19idWYpOwotI2lmZGVmIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVECi0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5wcmV2X3Jvdyk7Ci0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5zdWJfcm93KTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnVwX3Jvdyk7Ci0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5hdmdfcm93KTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnBhZXRoX3Jvdyk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVECi0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT50aW1lX2J1ZmZlcik7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVECi0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5wcmV2X2ZpbHRlcnMpOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHMpOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzKTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmZpbHRlcl9jb3N0cyk7Ci0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSAgIC8qIFJlc2V0IHN0cnVjdHVyZSAqLwotICAgcG5nX21lbWNweSh0bXBfam1wLCBwbmdfcHRyLT5qbXBidWYsIHBuZ19zaXplb2Yoam1wX2J1ZikpOwotI2VuZGlmCi0KLSAgIGVycm9yX2ZuID0gcG5nX3B0ci0+ZXJyb3JfZm47Ci0gICB3YXJuaW5nX2ZuID0gcG5nX3B0ci0+d2FybmluZ19mbjsKLSAgIGVycm9yX3B0ciA9IHBuZ19wdHItPmVycm9yX3B0cjsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBmcmVlX2ZuID0gcG5nX3B0ci0+ZnJlZV9mbjsKLSNlbmRpZgotCi0gICBwbmdfbWVtc2V0KHBuZ19wdHIsIDAsIHBuZ19zaXplb2YocG5nX3N0cnVjdCkpOwotCi0gICBwbmdfcHRyLT5lcnJvcl9mbiA9IGVycm9yX2ZuOwotICAgcG5nX3B0ci0+d2FybmluZ19mbiA9IHdhcm5pbmdfZm47Ci0gICBwbmdfcHRyLT5lcnJvcl9wdHIgPSBlcnJvcl9wdHI7Ci0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgcG5nX3B0ci0+ZnJlZV9mbiA9IGZyZWVfZm47Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0gICBwbmdfbWVtY3B5KHBuZ19wdHItPmptcGJ1ZiwgdG1wX2ptcCwgcG5nX3NpemVvZihqbXBfYnVmKSk7Ci0jZW5kaWYKLX0KLQotLyogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIHNlbGVjdCBvbmUgb3IgbW9yZSByb3cgZmlsdGVycyB0byB1c2UuICovCi12b2lkIFBOR0FQSQotcG5nX3NldF9maWx0ZXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IG1ldGhvZCwgaW50IGZpbHRlcnMpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfZmlsdGVyIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0jaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKLSAgIGlmICgocG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCAmIFBOR19GTEFHX01OR19GSUxURVJfNjQpICYmCi0gICAgICAobWV0aG9kID09IFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORykpCi0gICAgICAgICBtZXRob2QgPSBQTkdfRklMVEVSX1RZUEVfQkFTRTsKLSNlbmRpZgotICAgaWYgKG1ldGhvZCA9PSBQTkdfRklMVEVSX1RZUEVfQkFTRSkKLSAgIHsKLSAgICAgIHN3aXRjaCAoZmlsdGVycyAmIChQTkdfQUxMX0ZJTFRFUlMgfCAweDA3KSkKLSAgICAgIHsKLSNpZmRlZiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRAotICAgICAgICAgY2FzZSA1OgotICAgICAgICAgY2FzZSA2OgotICAgICAgICAgY2FzZSA3OiBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5rbm93biByb3cgZmlsdGVyIGZvciBtZXRob2QgMCIpOwotI2VuZGlmIC8qIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVEICovCi0gICAgICAgICBjYXNlIFBOR19GSUxURVJfVkFMVUVfTk9ORToKLSAgICAgICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyID0gUE5HX0ZJTFRFUl9OT05FOyBicmVhazsKLSNpZmRlZiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRAotICAgICAgICAgY2FzZSBQTkdfRklMVEVSX1ZBTFVFX1NVQjoKLSAgICAgICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyID0gUE5HX0ZJTFRFUl9TVUI7IGJyZWFrOwotICAgICAgICAgY2FzZSBQTkdfRklMVEVSX1ZBTFVFX1VQOgotICAgICAgICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgPSBQTkdfRklMVEVSX1VQOyBicmVhazsKLSAgICAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9BVkc6Ci0gICAgICAgICAgICAgIHBuZ19wdHItPmRvX2ZpbHRlciA9IFBOR19GSUxURVJfQVZHOyBicmVhazsKLSAgICAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSDoKLSAgICAgICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyID0gUE5HX0ZJTFRFUl9QQUVUSDsgYnJlYWs7Ci0gICAgICAgICBkZWZhdWx0OiBwbmdfcHRyLT5kb19maWx0ZXIgPSAocG5nX2J5dGUpZmlsdGVyczsgYnJlYWs7Ci0jZWxzZQotICAgICAgICAgZGVmYXVsdDogcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVua25vd24gcm93IGZpbHRlciBmb3IgbWV0aG9kIDAiKTsKLSNlbmRpZiAvKiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRCAqLwotICAgICAgfQotCi0gICAgICAvKiBJZiB3ZSBoYXZlIGFsbG9jYXRlZCB0aGUgcm93X2J1ZiwgdGhpcyBtZWFucyB3ZSBoYXZlIGFscmVhZHkgc3RhcnRlZAotICAgICAgICogd2l0aCB0aGUgaW1hZ2UgYW5kIHdlIHNob3VsZCBoYXZlIGFsbG9jYXRlZCBhbGwgb2YgdGhlIGZpbHRlciBidWZmZXJzCi0gICAgICAgKiB0aGF0IGhhdmUgYmVlbiBzZWxlY3RlZC4gIElmIHByZXZfcm93IGlzbid0IGFscmVhZHkgYWxsb2NhdGVkLCB0aGVuCi0gICAgICAgKiBpdCBpcyB0b28gbGF0ZSB0byBzdGFydCB1c2luZyB0aGUgZmlsdGVycyB0aGF0IG5lZWQgaXQsIHNpbmNlIHdlCi0gICAgICAgKiB3aWxsIGJlIG1pc3NpbmcgdGhlIGRhdGEgaW4gdGhlIHByZXZpb3VzIHJvdy4gIElmIGFuIGFwcGxpY2F0aW9uCi0gICAgICAgKiB3YW50cyB0byBzdGFydCBhbmQgc3RvcCB1c2luZyBwYXJ0aWN1bGFyIGZpbHRlcnMgZHVyaW5nIGNvbXByZXNzaW9uLAotICAgICAgICogaXQgc2hvdWxkIHN0YXJ0IG91dCB3aXRoIGFsbCBvZiB0aGUgZmlsdGVycywgYW5kIHRoZW4gYWRkIGFuZAotICAgICAgICogcmVtb3ZlIHRoZW0gYWZ0ZXIgdGhlIHN0YXJ0IG9mIGNvbXByZXNzaW9uLgotICAgICAgICovCi0gICAgICBpZiAocG5nX3B0ci0+cm93X2J1ZiAhPSBOVUxMKQotICAgICAgewotI2lmZGVmIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVECi0gICAgICAgICBpZiAoKHBuZ19wdHItPmRvX2ZpbHRlciAmIFBOR19GSUxURVJfU1VCKSAmJiBwbmdfcHRyLT5zdWJfcm93ID09IE5VTEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfcHRyLT5zdWJfcm93ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAgICAgIChwbmdfcHRyLT5yb3dieXRlcyArIDEpKTsKLSAgICAgICAgICAgIHBuZ19wdHItPnN1Yl9yb3dbMF0gPSBQTkdfRklMVEVSX1ZBTFVFX1NVQjsKLSAgICAgICAgIH0KLQotICAgICAgICAgaWYgKChwbmdfcHRyLT5kb19maWx0ZXIgJiBQTkdfRklMVEVSX1VQKSAmJiBwbmdfcHRyLT51cF9yb3cgPT0gTlVMTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wcmV2X3JvdyA9PSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkNhbid0IGFkZCBVcCBmaWx0ZXIgYWZ0ZXIgc3RhcnRpbmciKTsKLSAgICAgICAgICAgICAgIHBuZ19wdHItPmRvX2ZpbHRlciAmPSB+UE5HX0ZJTFRFUl9VUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19wdHItPnVwX3JvdyA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgKHBuZ19wdHItPnJvd2J5dGVzICsgMSkpOwotICAgICAgICAgICAgICAgcG5nX3B0ci0+dXBfcm93WzBdID0gUE5HX0ZJTFRFUl9WQUxVRV9VUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgaWYgKChwbmdfcHRyLT5kb19maWx0ZXIgJiBQTkdfRklMVEVSX0FWRykgJiYgcG5nX3B0ci0+YXZnX3JvdyA9PSBOVUxMKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfcm93ID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiQ2FuJ3QgYWRkIEF2ZXJhZ2UgZmlsdGVyIGFmdGVyIHN0YXJ0aW5nIik7Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgJj0gflBOR19GSUxURVJfQVZHOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3B0ci0+YXZnX3JvdyA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgKHBuZ19wdHItPnJvd2J5dGVzICsgMSkpOwotICAgICAgICAgICAgICAgcG5nX3B0ci0+YXZnX3Jvd1swXSA9IFBOR19GSUxURVJfVkFMVUVfQVZHOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICBpZiAoKHBuZ19wdHItPmRvX2ZpbHRlciAmIFBOR19GSUxURVJfUEFFVEgpICYmCi0gICAgICAgICAgICAgcG5nX3B0ci0+cGFldGhfcm93ID09IE5VTEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cHJldl9yb3cgPT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJDYW4ndCBhZGQgUGFldGggZmlsdGVyIGFmdGVyIHN0YXJ0aW5nIik7Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgJj0gKHBuZ19ieXRlKSh+UE5HX0ZJTFRFUl9QQUVUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT5wYWV0aF9yb3cgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgIChwbmdfcHRyLT5yb3dieXRlcyArIDEpKTsKLSAgICAgICAgICAgICAgIHBuZ19wdHItPnBhZXRoX3Jvd1swXSA9IFBOR19GSUxURVJfVkFMVUVfUEFFVEg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmIChwbmdfcHRyLT5kb19maWx0ZXIgPT0gUE5HX05PX0ZJTFRFUlMpCi0jZW5kaWYgLyogUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQgKi8KLSAgICAgICAgICAgIHBuZ19wdHItPmRvX2ZpbHRlciA9IFBOR19GSUxURVJfTk9ORTsKLSAgICAgIH0KLSAgIH0KLSAgIGVsc2UKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVW5rbm93biBjdXN0b20gZmlsdGVyIG1ldGhvZCIpOwotfQotCi0vKiBUaGlzIGFsbG93cyB1cyB0byBpbmZsdWVuY2UgdGhlIHdheSBpbiB3aGljaCBsaWJwbmcgY2hvb3NlcyB0aGUgImJlc3QiCi0gKiBmaWx0ZXIgZm9yIHRoZSBjdXJyZW50IHNjYW5saW5lLiAgV2hpbGUgdGhlICJtaW5pbXVtLXN1bS1vZi1hYnNvbHV0ZS0KLSAqIGRpZmZlcmVuY2VzIG1ldHJpYyBpcyByZWxhdGl2ZWx5IGZhc3QgYW5kIGVmZmVjdGl2ZSwgdGhlcmUgaXMgc29tZQotICogcXVlc3Rpb24gYXMgdG8gd2hldGhlciBpdCBjYW4gYmUgaW1wcm92ZWQgdXBvbiBieSB0cnlpbmcgdG8ga2VlcCB0aGUKLSAqIGZpbHRlcmVkIGRhdGEgZ29pbmcgdG8gemxpYiBtb3JlIGNvbnNpc3RlbnQsIGhvcGVmdWxseSByZXN1bHRpbmcgaW4KLSAqIGJldHRlciBjb21wcmVzc2lvbi4KLSAqLwotI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEICAgICAgLyogR1JSIDk3MDExNiAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3MocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IGhldXJpc3RpY19tZXRob2QsCi0gICBpbnQgbnVtX3dlaWdodHMsIHBuZ19kb3VibGVwIGZpbHRlcl93ZWlnaHRzLAotICAgcG5nX2RvdWJsZXAgZmlsdGVyX2Nvc3RzKQotewotICAgaW50IGk7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9maWx0ZXJfaGV1cmlzdGljcyIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgaWYgKGhldXJpc3RpY19tZXRob2QgPj0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfTEFTVCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmtub3duIGZpbHRlciBoZXVyaXN0aWMgbWV0aG9kIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIGlmIChoZXVyaXN0aWNfbWV0aG9kID09IFBOR19GSUxURVJfSEVVUklTVElDX0RFRkFVTFQpCi0gICB7Ci0gICAgICBoZXVyaXN0aWNfbWV0aG9kID0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfVU5XRUlHSFRFRDsKLSAgIH0KLQotICAgaWYgKG51bV93ZWlnaHRzIDwgMCB8fCBmaWx0ZXJfd2VpZ2h0cyA9PSBOVUxMIHx8Ci0gICAgICBoZXVyaXN0aWNfbWV0aG9kID09IFBOR19GSUxURVJfSEVVUklTVElDX1VOV0VJR0hURUQpCi0gICB7Ci0gICAgICBudW1fd2VpZ2h0cyA9IDA7Ci0gICB9Ci0KLSAgIHBuZ19wdHItPm51bV9wcmV2X2ZpbHRlcnMgPSAocG5nX2J5dGUpbnVtX3dlaWdodHM7Ci0gICBwbmdfcHRyLT5oZXVyaXN0aWNfbWV0aG9kID0gKHBuZ19ieXRlKWhldXJpc3RpY19tZXRob2Q7Ci0KLSAgIGlmIChudW1fd2VpZ2h0cyA+IDApCi0gICB7Ci0gICAgICBpZiAocG5nX3B0ci0+cHJldl9maWx0ZXJzID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5wcmV2X2ZpbHRlcnMgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgIChwbmdfdWludF8zMikocG5nX3NpemVvZihwbmdfYnl0ZSkgKiBudW1fd2VpZ2h0cykpOwotCi0gICAgICAgICAvKiBUbyBtYWtlIHN1cmUgdGhhdCB0aGUgd2VpZ2h0aW5nIHN0YXJ0cyBvdXQgZmFpcmx5ICovCi0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3dlaWdodHM7IGkrKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19wdHItPnByZXZfZmlsdGVyc1tpXSA9IDI1NTsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHBuZ19wdHItPmZpbHRlcl93ZWlnaHRzID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0cyA9IChwbmdfdWludF8xNnApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgKHBuZ191aW50XzMyKShwbmdfc2l6ZW9mKHBuZ191aW50XzE2KSAqIG51bV93ZWlnaHRzKSk7Ci0KLSAgICAgICAgIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0cyA9IChwbmdfdWludF8xNnApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgKHBuZ191aW50XzMyKShwbmdfc2l6ZW9mKHBuZ191aW50XzE2KSAqIG51bV93ZWlnaHRzKSk7Ci0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3dlaWdodHM7IGkrKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tpXSA9Ci0gICAgICAgICAgICBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0c1tpXSA9IFBOR19XRUlHSFRfRkFDVE9SOwotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3dlaWdodHM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIGlmIChmaWx0ZXJfd2VpZ2h0c1tpXSA8IDAuMCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tpXSA9Ci0gICAgICAgICAgICBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0c1tpXSA9IFBOR19XRUlHSFRfRkFDVE9SOwotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2ldID0KLSAgICAgICAgICAgICAgIChwbmdfdWludF8xNikoKGRvdWJsZSlQTkdfV0VJR0hUX0ZBQ1RPUipmaWx0ZXJfd2VpZ2h0c1tpXSswLjUpOwotICAgICAgICAgICAgcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHNbaV0gPQotICAgICAgICAgICAgICAgKHBuZ191aW50XzE2KSgoZG91YmxlKVBOR19XRUlHSFRfRkFDVE9SL2ZpbHRlcl93ZWlnaHRzW2ldKzAuNSk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIElmLCBpbiB0aGUgZnV0dXJlLCB0aGVyZSBhcmUgb3RoZXIgZmlsdGVyIG1ldGhvZHMsIHRoaXMgd291bGQKLSAgICAqIG5lZWQgdG8gYmUgYmFzZWQgb24gcG5nX3B0ci0+ZmlsdGVyLgotICAgICovCi0gICBpZiAocG5nX3B0ci0+ZmlsdGVyX2Nvc3RzID09IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfcHRyLT5maWx0ZXJfY29zdHMgPSAocG5nX3VpbnRfMTZwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgIChwbmdfdWludF8zMikocG5nX3NpemVvZihwbmdfdWludF8xNikgKiBQTkdfRklMVEVSX1ZBTFVFX0xBU1QpKTsKLQotICAgICAgcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0cyA9IChwbmdfdWludF8xNnApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgKHBuZ191aW50XzMyKShwbmdfc2l6ZW9mKHBuZ191aW50XzE2KSAqIFBOR19GSUxURVJfVkFMVUVfTEFTVCkpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgUE5HX0ZJTFRFUl9WQUxVRV9MQVNUOyBpKyspCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW2ldID0KLSAgICAgICAgIHBuZ19wdHItPmZpbHRlcl9jb3N0c1tpXSA9IFBOR19DT1NUX0ZBQ1RPUjsKLSAgICAgIH0KLSAgIH0KLQotICAgLyogSGVyZSBpcyB3aGVyZSB3ZSBzZXQgdGhlIHJlbGF0aXZlIGNvc3RzIG9mIHRoZSBkaWZmZXJlbnQgZmlsdGVycy4gIFdlCi0gICAgKiBzaG91bGQgdGFrZSB0aGUgZGVzaXJlZCBjb21wcmVzc2lvbiBsZXZlbCBpbnRvIGFjY291bnQgd2hlbiBzZXR0aW5nCi0gICAgKiB0aGUgY29zdHMsIHNvIHRoYXQgUGFldGgsIGZvciBpbnN0YW5jZSwgaGFzIGEgaGlnaCByZWxhdGl2ZSBjb3N0IGF0IGxvdwotICAgICogY29tcHJlc3Npb24gbGV2ZWxzLCB3aGlsZSBpdCBoYXMgYSBsb3dlciByZWxhdGl2ZSBjb3N0IGF0IGhpZ2hlcgotICAgICogY29tcHJlc3Npb24gc2V0dGluZ3MuICBUaGUgZmlsdGVyIHR5cGVzIGFyZSBpbiBvcmRlciBvZiBpbmNyZWFzaW5nCi0gICAgKiByZWxhdGl2ZSBjb3N0LCBzbyBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBkbyB0aGlzIHdpdGggYW4gYWxnb3JpdGhtLgotICAgICovCi0gICBmb3IgKGkgPSAwOyBpIDwgUE5HX0ZJTFRFUl9WQUxVRV9MQVNUOyBpKyspCi0gICB7Ci0gICAgICBpZiAoZmlsdGVyX2Nvc3RzID09IE5VTEwgfHwgZmlsdGVyX2Nvc3RzW2ldIDwgMC4wKQotICAgICAgewotICAgICAgICAgcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0c1tpXSA9Ci0gICAgICAgICBwbmdfcHRyLT5maWx0ZXJfY29zdHNbaV0gPSBQTkdfQ09TVF9GQUNUT1I7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChmaWx0ZXJfY29zdHNbaV0gPj0gMS4wKQotICAgICAgewotICAgICAgICAgcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0c1tpXSA9Ci0gICAgICAgICAgICAocG5nX3VpbnRfMTYpKChkb3VibGUpUE5HX0NPU1RfRkFDVE9SIC8gZmlsdGVyX2Nvc3RzW2ldICsgMC41KTsKLSAgICAgICAgIHBuZ19wdHItPmZpbHRlcl9jb3N0c1tpXSA9Ci0gICAgICAgICAgICAocG5nX3VpbnRfMTYpKChkb3VibGUpUE5HX0NPU1RfRkFDVE9SICogZmlsdGVyX2Nvc3RzW2ldICsgMC41KTsKLSAgICAgIH0KLSAgIH0KLX0KLSNlbmRpZiAvKiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRCAqLwotCi12b2lkIFBOR0FQSQotcG5nX3NldF9jb21wcmVzc2lvbl9sZXZlbChwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgbGV2ZWwpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX1pMSUJfQ1VTVE9NX0xFVkVMOwotICAgcG5nX3B0ci0+emxpYl9sZXZlbCA9IGxldmVsOwotfQotCi12b2lkIFBOR0FQSQotcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IG1lbV9sZXZlbCkKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX1pMSUJfQ1VTVE9NX01FTV9MRVZFTDsKLSAgIHBuZ19wdHItPnpsaWJfbWVtX2xldmVsID0gbWVtX2xldmVsOwotfQotCi12b2lkIFBOR0FQSQotcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneShwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgc3RyYXRlZ3kpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfY29tcHJlc3Npb25fc3RyYXRlZ3kiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX1pMSUJfQ1VTVE9NX1NUUkFURUdZOwotICAgcG5nX3B0ci0+emxpYl9zdHJhdGVneSA9IHN0cmF0ZWd5OwotfQotCi12b2lkIFBOR0FQSQotcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyhwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgd2luZG93X2JpdHMpCi17Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgaWYgKHdpbmRvd19iaXRzID4gMTUpCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT25seSBjb21wcmVzc2lvbiB3aW5kb3dzIDw9IDMyayBzdXBwb3J0ZWQgYnkgUE5HIik7Ci0gICBlbHNlIGlmICh3aW5kb3dfYml0cyA8IDgpCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT25seSBjb21wcmVzc2lvbiB3aW5kb3dzID49IDI1NiBzdXBwb3J0ZWQgYnkgUE5HIik7Ci0jaWZuZGVmIFdCSVRTXzhfT0sKLSAgIC8qIEF2b2lkIGxpYnBuZyBidWcgd2l0aCAyNTYtYnl0ZSB3aW5kb3dzICovCi0gICBpZiAod2luZG93X2JpdHMgPT0gOCkKLSAgICAgewotICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJDb21wcmVzc2lvbiB3aW5kb3cgaXMgYmVpbmcgcmVzZXQgdG8gNTEyIik7Ci0gICAgICAgd2luZG93X2JpdHMgPSA5OwotICAgICB9Ci0jZW5kaWYKLSAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX1pMSUJfQ1VTVE9NX1dJTkRPV19CSVRTOwotICAgcG5nX3B0ci0+emxpYl93aW5kb3dfYml0cyA9IHdpbmRvd19iaXRzOwotfQotCi12b2lkIFBOR0FQSQotcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IG1ldGhvZCkKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIGlmIChtZXRob2QgIT0gOCkKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJPbmx5IGNvbXByZXNzaW9uIG1ldGhvZCA4IGlzIHN1cHBvcnRlZCBieSBQTkciKTsKLSAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX1pMSUJfQ1VTVE9NX01FVEhPRDsKLSAgIHBuZ19wdHItPnpsaWJfbWV0aG9kID0gbWV0aG9kOwotfQotCi12b2lkIFBOR0FQSQotcG5nX3NldF93cml0ZV9zdGF0dXNfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3dyaXRlX3N0YXR1c19wdHIgd3JpdGVfcm93X2ZuKQotewotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIHBuZ19wdHItPndyaXRlX3Jvd19mbiA9IHdyaXRlX3Jvd19mbjsKLX0KLQotI2lmZGVmIFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3dyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191c2VyX3RyYW5zZm9ybV9wdHIKLSAgIHdyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3dyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1VTRVJfVFJBTlNGT1JNOwotICAgcG5nX3B0ci0+d3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4gPSB3cml0ZV91c2VyX3RyYW5zZm9ybV9mbjsKLX0KLSNlbmRpZgotCi0KLSNpZmRlZiBQTkdfSU5GT19JTUFHRV9TVVBQT1JURUQKLXZvaWQgUE5HQVBJCi1wbmdfd3JpdGVfcG5nKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgICAgICAgICAgICAgaW50IHRyYW5zZm9ybXMsIHZvaWRwIHBhcmFtcykKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgLyogV3JpdGUgdGhlIGZpbGUgaGVhZGVyIGluZm9ybWF0aW9uLiAqLwotICAgcG5nX3dyaXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICAvKiAtLS0tLS0gdGhlc2UgdHJhbnNmb3JtYXRpb25zIGRvbid0IHRvdWNoIHRoZSBpbmZvIHN0cnVjdHVyZSAtLS0tLS0tICovCi0KLSNpZmRlZiBQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRAotICAgLyogSW52ZXJ0IG1vbm9jaHJvbWUgcGl4ZWxzICovCi0gICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fSU5WRVJUX01PTk8pCi0gICAgICBwbmdfc2V0X2ludmVydF9tb25vKHBuZ19wdHIpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVECi0gICAvKiBTaGlmdCB0aGUgcGl4ZWxzIHVwIHRvIGEgbGVnYWwgYml0IGRlcHRoIGFuZCBmaWxsIGluCi0gICAgKiBhcyBhcHByb3ByaWF0ZSB0byBjb3JyZWN0bHkgc2NhbGUgdGhlIGltYWdlLgotICAgICovCi0gICBpZiAoKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NISUZUKQotICAgICAgICAgICAgICAgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NCSVQpKQotICAgICAgcG5nX3NldF9zaGlmdChwbmdfcHRyLCAmaW5mb19wdHItPnNpZ19iaXQpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQKLSAgIC8qIFBhY2sgcGl4ZWxzIGludG8gYnl0ZXMgKi8KLSAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9QQUNLSU5HKQotICAgICAgIHBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX1NXQVBfQUxQSEFfU1VQUE9SVEVECi0gICAvKiBTd2FwIGxvY2F0aW9uIG9mIGFscGhhIGJ5dGVzIGZyb20gQVJHQiB0byBSR0JBICovCi0gICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSkKLSAgICAgIHBuZ19zZXRfc3dhcF9hbHBoYShwbmdfcHRyKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQKLSAgIC8qIFBhY2sgWFJHQi9SR0JYL0FSR0IvUkdCQSBpbnRvIFJHQiAoNCBjaGFubmVscyAtPiAzIGNoYW5uZWxzKSAqLwotICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUl9BRlRFUikKLSAgICAgIHBuZ19zZXRfZmlsbGVyKHBuZ19wdHIsIDAsIFBOR19GSUxMRVJfQUZURVIpOwotICAgZWxzZSBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0JFRk9SRSkKLSAgICAgIHBuZ19zZXRfZmlsbGVyKHBuZ19wdHIsIDAsIFBOR19GSUxMRVJfQkVGT1JFKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQKLSAgIC8qIEZsaXAgQkdSIHBpeGVscyB0byBSR0IgKi8KLSAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9CR1IpCi0gICAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVECi0gICAvKiBTd2FwIGJ5dGVzIG9mIDE2LWJpdCBmaWxlcyB0byBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKi8KLSAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9TV0FQX0VORElBTikKLSAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRAotICAgLyogU3dhcCBiaXRzIG9mIDEsIDIsIDQgYml0IHBhY2tlZCBwaXhlbCBmb3JtYXRzICovCi0gICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fUEFDS1NXQVApCi0gICAgICBwbmdfc2V0X3BhY2tzd2FwKHBuZ19wdHIpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAotICAgLyogSW52ZXJ0IHRoZSBhbHBoYSBjaGFubmVsIGZyb20gb3BhY2l0eSB0byB0cmFuc3BhcmVuY3kgKi8KLSAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9JTlZFUlRfQUxQSEEpCi0gICAgICBwbmdfc2V0X2ludmVydF9hbHBoYShwbmdfcHRyKTsKLSNlbmRpZgotCi0gICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlbmQgb2YgdHJhbnNmb3JtYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgLyogV3JpdGUgdGhlIGJpdHMgKi8KLSAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19JREFUKQotICAgICAgIHBuZ193cml0ZV9pbWFnZShwbmdfcHRyLCBpbmZvX3B0ci0+cm93X3BvaW50ZXJzKTsKLQotICAgLyogSXQgaXMgUkVRVUlSRUQgdG8gY2FsbCB0aGlzIHRvIGZpbmlzaCB3cml0aW5nIHRoZSByZXN0IG9mIHRoZSBmaWxlICovCi0gICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgUE5HX1VOVVNFRCh0cmFuc2Zvcm1zKSAgIC8qIFF1aWV0IGNvbXBpbGVyIHdhcm5pbmdzICovCi0gICBQTkdfVU5VU0VEKHBhcmFtcykKLX0KLSNlbmRpZgotI2VuZGlmIC8qIFBOR19XUklURV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvcG5nd3RyYW4uYyBiL3NyYy9saWJwbmcvcG5nd3RyYW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyNWE5My4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3BuZ3d0cmFuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjkgKzAsMCBAQAotCi0vKiBwbmd3dHJhbi5jIC0gdHJhbnNmb3JtcyB0aGUgZGF0YSBpbiBhIHJvdyBmb3IgUE5HIHdyaXRlcnMKLSAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNC4xIFtGZWJydWFyeSAyNSwgMjAxMF0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCi0gKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0gKi8KLQotI2RlZmluZSBQTkdfTk9fUEVEQU5USUNfV0FSTklOR1MKLSNpbmNsdWRlICJwbmcuaCIKLSNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECi0jaW5jbHVkZSAicG5ncHJpdi5oIgotCi0vKiBUcmFuc2Zvcm0gdGhlIGRhdGEgYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3Mgd2lzaGVzLiAgVGhlIG9yZGVyIG9mCi0gKiB0cmFuc2Zvcm1hdGlvbnMgaXMgc2lnbmlmaWNhbnQuCi0gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RvX3dyaXRlX3RyYW5zZm9ybWF0aW9ucyhwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fd3JpdGVfdHJhbnNmb3JtYXRpb25zIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSNpZmRlZiBQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1VTRVJfVFJBTlNGT1JNKQotICAgICAgaWYgKHBuZ19wdHItPndyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuICE9IE5VTEwpCi0gICAgICAgICgqKHBuZ19wdHItPndyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuKSkgLyogVXNlciB3cml0ZSB0cmFuc2Zvcm0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAqLwotICAgICAgICAgIChwbmdfcHRyLCAgICAgICAgICAgICAgICAgICAgLyogcG5nX3B0ciAqLwotICAgICAgICAgICAmKHBuZ19wdHItPnJvd19pbmZvKSwgICAgICAgLyogcm93X2luZm86ICAgICAqLwotICAgICAgICAgICAgIC8qICBwbmdfdWludF8zMiB3aWR0aDsgICAgICAgICAgd2lkdGggb2Ygcm93ICovCi0gICAgICAgICAgICAgLyogIHBuZ191aW50XzMyIHJvd2J5dGVzOyAgICAgICBudW1iZXIgb2YgYnl0ZXMgaW4gcm93ICovCi0gICAgICAgICAgICAgLyogIHBuZ19ieXRlIGNvbG9yX3R5cGU7ICAgICAgICBjb2xvciB0eXBlIG9mIHBpeGVscyAqLwotICAgICAgICAgICAgIC8qICBwbmdfYnl0ZSBiaXRfZGVwdGg7ICAgICAgICAgYml0IGRlcHRoIG9mIHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAvKiAgcG5nX2J5dGUgY2hhbm5lbHM7ICAgICAgICAgIG51bWJlciBvZiBjaGFubmVscyAoMS00KSAqLwotICAgICAgICAgICAgIC8qICBwbmdfYnl0ZSBwaXhlbF9kZXB0aDsgICAgICAgYml0cyBwZXIgcGl4ZWwgKGRlcHRoKmNoYW5uZWxzKSAqLwotICAgICAgICAgICBwbmdfcHRyLT5yb3dfYnVmICsgMSk7ICAgICAgLyogc3RhcnQgb2YgcGl4ZWwgZGF0YSBmb3Igcm93ICovCi0jZW5kaWYKLSNpZmRlZiBQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19GSUxMRVIpCi0gICAgICBwbmdfZG9fc3RyaXBfZmlsbGVyKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKLSAgICAgICAgIHBuZ19wdHItPmZsYWdzKTsKLSNlbmRpZgotI2lmZGVmIFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQKLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDS1NXQVApCi0gICAgICBwbmdfZG9fcGFja3N3YXAoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSNlbmRpZgotI2lmZGVmIFBOR19XUklURV9QQUNLX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLKQotICAgICAgcG5nX2RvX3BhY2soJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxLAotICAgICAgICAgKHBuZ191aW50XzMyKXBuZ19wdHItPmJpdF9kZXB0aCk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQKLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU1dBUF9CWVRFUykKLSAgICAgIHBuZ19kb19zd2FwKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NISUZUKQotICAgICAgcG5nX2RvX3NoaWZ0KCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKLSAgICAgICAgICYocG5nX3B0ci0+c2hpZnQpKTsKLSNlbmRpZgotI2lmZGVmIFBOR19XUklURV9TV0FQX0FMUEhBX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TV0FQX0FMUEhBKQotICAgICAgcG5nX2RvX3dyaXRlX3N3YXBfYWxwaGEoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSNlbmRpZgotI2lmZGVmIFBOR19XUklURV9JTlZFUlRfQUxQSEFfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVkVSVF9BTFBIQSkKLSAgICAgIHBuZ19kb193cml0ZV9pbnZlcnRfYWxwaGEoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSNlbmRpZgotI2lmZGVmIFBOR19XUklURV9CR1JfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JHUikKLSAgICAgIHBuZ19kb19iZ3IoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSNlbmRpZgotI2lmZGVmIFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVkVSVF9NT05PKQotICAgICAgcG5nX2RvX2ludmVydCgmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQKLS8qIFBhY2sgcGl4ZWxzIGludG8gYnl0ZXMuICBQYXNzIHRoZSB0cnVlIGJpdCBkZXB0aCBpbiBiaXRfZGVwdGguICBUaGUKLSAqIHJvd19pbmZvIGJpdCBkZXB0aCBzaG91bGQgYmUgOCAob25lIHBpeGVsIHBlciBieXRlKS4gIFRoZSBjaGFubmVscwotICogc2hvdWxkIGJlIDEgKHRoaXMgb25seSBoYXBwZW5zIG9uIGdyYXlzY2FsZSBhbmQgcGFsZXR0ZWQgaW1hZ2VzKS4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9fcGFjayhwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfdWludF8zMiBiaXRfZGVwdGgpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19wYWNrIik7Ci0KLSAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDggJiYKLSAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9PSAxKQotICAgewotICAgICAgc3dpdGNoICgoaW50KWJpdF9kZXB0aCkKLSAgICAgIHsKLSAgICAgICAgIGNhc2UgMToKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7Ci0gICAgICAgICAgICBpbnQgbWFzaywgdjsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0KLSAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgZHAgPSByb3c7Ci0gICAgICAgICAgICBtYXNrID0gMHg4MDsKLSAgICAgICAgICAgIHYgPSAwOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoKnNwICE9IDApCi0gICAgICAgICAgICAgICAgICB2IHw9IG1hc2s7Ci0gICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgICAgaWYgKG1hc2sgPiAxKQotICAgICAgICAgICAgICAgICAgbWFzayA+Pj0gMTsKLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG1hc2sgPSAweDgwOwotICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXY7Ci0gICAgICAgICAgICAgICAgICBkcCsrOwotICAgICAgICAgICAgICAgICAgdiA9IDA7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWFzayAhPSAweDgwKQotICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7Ci0gICAgICAgICAgICBpbnQgc2hpZnQsIHY7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOwotCi0gICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgIGRwID0gcm93OwotICAgICAgICAgICAgc2hpZnQgPSA2OwotICAgICAgICAgICAgdiA9IDA7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZSB2YWx1ZTsKLQotICAgICAgICAgICAgICAgdmFsdWUgPSAocG5nX2J5dGUpKCpzcCAmIDB4MDMpOwotICAgICAgICAgICAgICAgdiB8PSAodmFsdWUgPDwgc2hpZnQpOwotICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDApCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzaGlmdCA9IDY7Ci0gICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpdjsKLSAgICAgICAgICAgICAgICAgIGRwKys7Ci0gICAgICAgICAgICAgICAgICB2ID0gMDsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDI7Ci0gICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNoaWZ0ICE9IDYpCi0gICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSA0OgotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsKLSAgICAgICAgICAgIGludCBzaGlmdCwgdjsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0KLSAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgZHAgPSByb3c7Ci0gICAgICAgICAgICBzaGlmdCA9IDQ7Ci0gICAgICAgICAgICB2ID0gMDsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlIHZhbHVlOwotCi0gICAgICAgICAgICAgICB2YWx1ZSA9IChwbmdfYnl0ZSkoKnNwICYgMHgwZik7Ci0gICAgICAgICAgICAgICB2IHw9ICh2YWx1ZSA8PCBzaGlmdCk7Ci0KLSAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSAwKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc2hpZnQgPSA0OwotICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXY7Ci0gICAgICAgICAgICAgICAgICBkcCsrOwotICAgICAgICAgICAgICAgICAgdiA9IDA7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBzaGlmdCAtPSA0OwotCi0gICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNoaWZ0ICE9IDQpCi0gICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotCi0gICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICByb3dfaW5mby0+Yml0X2RlcHRoID0gKHBuZ19ieXRlKWJpdF9kZXB0aDsKLSAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkoYml0X2RlcHRoICogcm93X2luZm8tPmNoYW5uZWxzKTsKLSAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhyb3dfaW5mby0+cGl4ZWxfZGVwdGgsCi0gICAgICAgICByb3dfaW5mby0+d2lkdGgpOwotICAgfQotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVECi0vKiBTaGlmdCBwaXhlbCB2YWx1ZXMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2Ygd2hvbGUgcmFuZ2UuICBQYXNzIHRoZQotICogdHJ1ZSBudW1iZXIgb2YgYml0cyBpbiBiaXRfZGVwdGguICBUaGUgcm93IHNob3VsZCBiZSBwYWNrZWQKLSAqIGFjY29yZGluZyB0byByb3dfaW5mby0+Yml0X2RlcHRoLiAgVGh1cywgaWYgeW91IGhhZCBhIHJvdyBvZgotICogYml0IGRlcHRoIDQsIGJ1dCB0aGUgcGl4ZWxzIG9ubHkgaGFkIHZhbHVlcyBmcm9tIDAgdG8gNywgeW91Ci0gKiB3b3VsZCBwYXNzIDMgYXMgYml0X2RlcHRoLCBhbmQgdGhpcyByb3V0aW5lIHdvdWxkIHRyYW5zbGF0ZSB0aGUKLSAqIGRhdGEgdG8gMCB0byAxNS4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9fc2hpZnQocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX2NvbG9yXzhwIGJpdF9kZXB0aCkKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3NoaWZ0Iik7Ci0KLSAgIGlmICgKLSAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICB7Ci0gICAgICBpbnQgc2hpZnRfc3RhcnRbNF0sIHNoaWZ0X2RlY1s0XTsKLSAgICAgIGludCBjaGFubmVscyA9IDA7Ci0KLSAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQotICAgICAgewotICAgICAgICAgc2hpZnRfc3RhcnRbY2hhbm5lbHNdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIGJpdF9kZXB0aC0+cmVkOwotICAgICAgICAgc2hpZnRfZGVjW2NoYW5uZWxzXSA9IGJpdF9kZXB0aC0+cmVkOwotICAgICAgICAgY2hhbm5lbHMrKzsKLSAgICAgICAgIHNoaWZ0X3N0YXJ0W2NoYW5uZWxzXSA9IHJvd19pbmZvLT5iaXRfZGVwdGggLSBiaXRfZGVwdGgtPmdyZWVuOwotICAgICAgICAgc2hpZnRfZGVjW2NoYW5uZWxzXSA9IGJpdF9kZXB0aC0+Z3JlZW47Ci0gICAgICAgICBjaGFubmVscysrOwotICAgICAgICAgc2hpZnRfc3RhcnRbY2hhbm5lbHNdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIGJpdF9kZXB0aC0+Ymx1ZTsKLSAgICAgICAgIHNoaWZ0X2RlY1tjaGFubmVsc10gPSBiaXRfZGVwdGgtPmJsdWU7Ci0gICAgICAgICBjaGFubmVscysrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgc2hpZnRfc3RhcnRbY2hhbm5lbHNdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIGJpdF9kZXB0aC0+Z3JheTsKLSAgICAgICAgIHNoaWZ0X2RlY1tjaGFubmVsc10gPSBiaXRfZGVwdGgtPmdyYXk7Ci0gICAgICAgICBjaGFubmVscysrOwotICAgICAgfQotICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpCi0gICAgICB7Ci0gICAgICAgICBzaGlmdF9zdGFydFtjaGFubmVsc10gPSByb3dfaW5mby0+Yml0X2RlcHRoIC0gYml0X2RlcHRoLT5hbHBoYTsKLSAgICAgICAgIHNoaWZ0X2RlY1tjaGFubmVsc10gPSBiaXRfZGVwdGgtPmFscGhhOwotICAgICAgICAgY2hhbm5lbHMrKzsKLSAgICAgIH0KLQotICAgICAgLyogV2l0aCBsb3cgcm93IGRlcHRocywgY291bGQgb25seSBiZSBncmF5c2NhbGUsIHNvIG9uZSBjaGFubmVsICovCi0gICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA8IDgpCi0gICAgICB7Ci0gICAgICAgICBwbmdfYnl0ZXAgYnAgPSByb3c7Ci0gICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgcG5nX2J5dGUgbWFzazsKLSAgICAgICAgIHBuZ191aW50XzMyIHJvd19ieXRlcyA9IHJvd19pbmZvLT5yb3dieXRlczsKLQotICAgICAgICAgaWYgKGJpdF9kZXB0aC0+Z3JheSA9PSAxICYmIHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMikKLSAgICAgICAgICAgIG1hc2sgPSAweDU1OwotICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA0ICYmIGJpdF9kZXB0aC0+Z3JheSA9PSAzKQotICAgICAgICAgICAgbWFzayA9IDB4MTE7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBtYXNrID0gMHhmZjsKLQotICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd19ieXRlczsgaSsrLCBicCsrKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3VpbnRfMTYgdjsKLSAgICAgICAgICAgIGludCBqOwotCi0gICAgICAgICAgICB2ID0gKmJwOwotICAgICAgICAgICAgKmJwID0gMDsKLSAgICAgICAgICAgIGZvciAoaiA9IHNoaWZ0X3N0YXJ0WzBdOyBqID4gLXNoaWZ0X2RlY1swXTsgaiAtPSBzaGlmdF9kZWNbMF0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoaiA+IDApCi0gICAgICAgICAgICAgICAgICAqYnAgfD0gKHBuZ19ieXRlKSgodiA8PCBqKSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgKmJwIHw9IChwbmdfYnl0ZSkoKHYgPj4gKC1qKSkgJiBtYXNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19ieXRlcCBicCA9IHJvdzsKLSAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICBwbmdfdWludF8zMiBpc3RvcCA9IGNoYW5uZWxzICogcm93X2luZm8tPndpZHRoOwotCi0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKywgYnArKykKLSAgICAgICAgIHsKLQotICAgICAgICAgICAgcG5nX3VpbnRfMTYgdjsKLSAgICAgICAgICAgIGludCBqOwotICAgICAgICAgICAgaW50IGMgPSAoaW50KShpJWNoYW5uZWxzKTsKLQotICAgICAgICAgICAgdiA9ICpicDsKLSAgICAgICAgICAgICpicCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGogPSBzaGlmdF9zdGFydFtjXTsgaiA+IC1zaGlmdF9kZWNbY107IGogLT0gc2hpZnRfZGVjW2NdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKGogPiAwKQotICAgICAgICAgICAgICAgICAgKmJwIHw9IChwbmdfYnl0ZSkoKHYgPDwgaikgJiAweGZmKTsKLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICpicCB8PSAocG5nX2J5dGUpKCh2ID4+ICgtaikpICYgMHhmZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBwbmdfYnl0ZXAgYnA7Ci0gICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgcG5nX3VpbnRfMzIgaXN0b3AgPSBjaGFubmVscyAqIHJvd19pbmZvLT53aWR0aDsKLQotICAgICAgICAgZm9yIChicCA9IHJvdywgaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQotICAgICAgICAgewotICAgICAgICAgICAgaW50IGMgPSAoaW50KShpJWNoYW5uZWxzKTsKLSAgICAgICAgICAgIHBuZ191aW50XzE2IHZhbHVlLCB2OwotICAgICAgICAgICAgaW50IGo7Ci0KLSAgICAgICAgICAgIHYgPSAocG5nX3VpbnRfMTYpKCgocG5nX3VpbnRfMTYpKCpicCkgPDwgOCkgKyAqKGJwICsgMSkpOwotICAgICAgICAgICAgdmFsdWUgPSAwOwotICAgICAgICAgICAgZm9yIChqID0gc2hpZnRfc3RhcnRbY107IGogPiAtc2hpZnRfZGVjW2NdOyBqIC09IHNoaWZ0X2RlY1tjXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChqID4gMCkKLSAgICAgICAgICAgICAgICAgIHZhbHVlIHw9IChwbmdfdWludF8xNikoKHYgPDwgaikgJiAocG5nX3VpbnRfMTYpMHhmZmZmKTsKLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHZhbHVlIHw9IChwbmdfdWludF8xNikoKHYgPj4gKC1qKSkgJiAocG5nX3VpbnRfMTYpMHhmZmZmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpicCsrID0gKHBuZ19ieXRlKSh2YWx1ZSA+PiA4KTsKLSAgICAgICAgICAgICpicCsrID0gKHBuZ19ieXRlKSh2YWx1ZSAmIDB4ZmYpOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RvX3dyaXRlX3N3YXBfYWxwaGEocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3dyaXRlX3N3YXBfYWxwaGEiKTsKLQotICAgewotICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKLSAgICAgIHsKLSAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBBUkdCIHRvIFJHQkEgKi8KLSAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKLSAgICAgICAgICAgIGZvciAoaSA9IDAsIHNwID0gZHAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlIHNhdmUgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKihkcCsrKSA9IHNhdmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gQUFSUkdHQkIgdG8gUlJHR0JCQUEgKi8KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwLCBzcCA9IGRwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlWzJdOwotICAgICAgICAgICAgICAgc2F2ZVswXSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICBzYXZlWzFdID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSBzYXZlWzBdOwotICAgICAgICAgICAgICAgKihkcCsrKSA9IHNhdmVbMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgICAgewotICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIEFHIHRvIEdBICovCi0gICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDAsIHNwID0gZHAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlIHNhdmUgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gc2F2ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBBQUdHIHRvIEdHQUEgKi8KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwLCBzcCA9IGRwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlWzJdOwotICAgICAgICAgICAgICAgc2F2ZVswXSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICBzYXZlWzFdID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gc2F2ZVswXTsKLSAgICAgICAgICAgICAgICooZHArKykgPSBzYXZlWzFdOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgfQotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9fd3JpdGVfaW52ZXJ0X2FscGhhKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb193cml0ZV9pbnZlcnRfYWxwaGEiKTsKLQotICAgewotICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKLSAgICAgIHsKLSAgICAgICAgIC8qIFRoaXMgaW52ZXJ0cyB0aGUgYWxwaGEgY2hhbm5lbCBpbiBSR0JBICovCi0gICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwLCBzcCA9IGRwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBEb2VzIG5vdGhpbmcKLSAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBzcCs9MzsgZHAgPSBzcDsKLSAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKDI1NSAtICooc3ArKykpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgLyogVGhpcyBpbnZlcnRzIHRoZSBhbHBoYSBjaGFubmVsIGluIFJSR0dCQkFBICovCi0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKLQotICAgICAgICAgICAgZm9yIChpID0gMCwgc3AgPSBkcCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLyogRG9lcyBub3RoaW5nCi0gICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgc3ArPTY7IGRwID0gc3A7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSgyNTUgLSAqKHNwKyspKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKDI1NSAtICooc3ArKykpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKLSAgICAgIHsKLSAgICAgICAgIC8qIFRoaXMgaW52ZXJ0cyB0aGUgYWxwaGEgY2hhbm5lbCBpbiBHQSAqLwotICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwLCBzcCA9IGRwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKDI1NSAtICooc3ArKykpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgLyogVGhpcyBpbnZlcnRzIHRoZSBhbHBoYSBjaGFubmVsIGluIEdHQUEgKi8KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwLCBzcCA9IGRwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBEb2VzIG5vdGhpbmcKLSAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgc3ArPTI7IGRwID0gc3A7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSgyNTUgLSAqKHNwKyspKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKDI1NSAtICooc3ArKykpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgfQotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAotLyogVW5kb2VzIGludHJhcGl4ZWwgZGlmZmVyZW5jaW5nICAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9fd3JpdGVfaW50cmFwaXhlbChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fd3JpdGVfaW50cmFwaXhlbCIpOwotCi0gICBpZiAoCi0gICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKQotICAgewotICAgICAgaW50IGJ5dGVzX3Blcl9waXhlbDsKLSAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKLSAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICB7Ci0gICAgICAgICBwbmdfYnl0ZXAgcnA7Ci0gICAgICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gMzsKLSAgICAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKLSAgICAgICAgICAgIGJ5dGVzX3Blcl9waXhlbCA9IDQ7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyssIHJwICs9IGJ5dGVzX3Blcl9waXhlbCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgICoocnApICAgPSAocG5nX2J5dGUpKCgqcnAgICAgIC0gKihycCsxKSkmMHhmZik7Ci0gICAgICAgICAgICAqKHJwKzIpID0gKHBuZ19ieXRlKSgoKihycCsyKSAtICoocnArMSkpJjB4ZmYpOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKLSAgICAgIHsKLSAgICAgICAgIHBuZ19ieXRlcCBycDsKLSAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0KLSAgICAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCi0gICAgICAgICAgICBieXRlc19wZXJfcGl4ZWwgPSA2OwotICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gODsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgZm9yIChpID0gMCwgcnAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKywgcnAgKz0gYnl0ZXNfcGVyX3BpeGVsKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3VpbnRfMzIgczAgICA9ICgqKHJwICApIDw8IDgpIHwgKihycCsxKTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHMxICAgPSAoKihycCsyKSA8PCA4KSB8ICoocnArMyk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBzMiAgID0gKCoocnArNCkgPDwgOCkgfCAqKHJwKzUpOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgcmVkICA9IChwbmdfdWludF8zMikoKHMwIC0gczEpICYgMHhmZmZmTCk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBibHVlID0gKHBuZ191aW50XzMyKSgoczIgLSBzMSkgJiAweGZmZmZMKTsKLSAgICAgICAgICAgICoocnAgICkgPSAocG5nX2J5dGUpKChyZWQgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICoocnArMSkgPSAocG5nX2J5dGUpKHJlZCAmIDB4ZmYpOwotICAgICAgICAgICAgKihycCs0KSA9IChwbmdfYnl0ZSkoKGJsdWUgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICoocnArNSkgPSAocG5nX2J5dGUpKGJsdWUgJiAweGZmKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLX0KLSNlbmRpZiAvKiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRCAqLwotI2VuZGlmIC8qIFBOR19XUklURV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvcG5nd3V0aWwuYyBiL3NyYy9saWJwbmcvcG5nd3V0aWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkOWZjMi4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3BuZ3d1dGlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODA2ICswLDAgQEAKLQotLyogcG5nd3V0aWwuYyAtIHV0aWxpdGllcyB0byB3cml0ZSBhIFBORyBmaWxlCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjQuOCBbSnVseSA3LCAyMDExXQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTEgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSAqLwotCi0jZGVmaW5lIFBOR19OT19QRURBTlRJQ19XQVJOSU5HUwotI2luY2x1ZGUgInBuZy5oIgotI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKLSNpbmNsdWRlICJwbmdwcml2LmgiCi0KLS8qIFBsYWNlIGEgMzItYml0IG51bWJlciBpbnRvIGEgYnVmZmVyIGluIFBORyBieXRlIG9yZGVyLiAgV2Ugd29yawotICogd2l0aCB1bnNpZ25lZCBudW1iZXJzIGZvciBjb252ZW5pZW5jZSwgYWx0aG91Z2ggb25lIHN1cHBvcnRlZAotICogYW5jaWxsYXJ5IGNodW5rIHVzZXMgc2lnbmVkICh0d28ncyBjb21wbGVtZW50KSBudW1iZXJzLgotICovCi12b2lkIFBOR0FQSQotcG5nX3NhdmVfdWludF8zMihwbmdfYnl0ZXAgYnVmLCBwbmdfdWludF8zMiBpKQotewotICAgYnVmWzBdID0gKHBuZ19ieXRlKSgoaSA+PiAyNCkgJiAweGZmKTsKLSAgIGJ1ZlsxXSA9IChwbmdfYnl0ZSkoKGkgPj4gMTYpICYgMHhmZik7Ci0gICBidWZbMl0gPSAocG5nX2J5dGUpKChpID4+IDgpICYgMHhmZik7Ci0gICBidWZbM10gPSAocG5nX2J5dGUpKGkgJiAweGZmKTsKLX0KLQotI2lmZGVmIFBOR19TQVZFX0lOVF8zMl9TVVBQT1JURUQKLS8qIFRoZSBwbmdfc2F2ZV9pbnRfMzIgZnVuY3Rpb24gYXNzdW1lcyBpbnRlZ2VycyBhcmUgc3RvcmVkIGluIHR3bydzCi0gKiBjb21wbGVtZW50IGZvcm1hdC4gIElmIHRoaXMgaXNuJ3QgdGhlIGNhc2UsIHRoZW4gdGhpcyByb3V0aW5lIG5lZWRzIHRvCi0gKiBiZSBtb2RpZmllZCB0byB3cml0ZSBkYXRhIGluIHR3bydzIGNvbXBsZW1lbnQgZm9ybWF0LgotICovCi12b2lkIFBOR0FQSQotcG5nX3NhdmVfaW50XzMyKHBuZ19ieXRlcCBidWYsIHBuZ19pbnRfMzIgaSkKLXsKLSAgIGJ1ZlswXSA9IChwbmdfYnl0ZSkoKGkgPj4gMjQpICYgMHhmZik7Ci0gICBidWZbMV0gPSAocG5nX2J5dGUpKChpID4+IDE2KSAmIDB4ZmYpOwotICAgYnVmWzJdID0gKHBuZ19ieXRlKSgoaSA+PiA4KSAmIDB4ZmYpOwotICAgYnVmWzNdID0gKHBuZ19ieXRlKShpICYgMHhmZik7Ci19Ci0jZW5kaWYKLQotLyogUGxhY2UgYSAxNi1iaXQgbnVtYmVyIGludG8gYSBidWZmZXIgaW4gUE5HIGJ5dGUgb3JkZXIuCi0gKiBUaGUgcGFyYW1ldGVyIGlzIGRlY2xhcmVkIHVuc2lnbmVkIGludCwgbm90IHBuZ191aW50XzE2LAotICoganVzdCB0byBhdm9pZCBwb3RlbnRpYWwgcHJvYmxlbXMgb24gcHJlLUFOU0kgQyBjb21waWxlcnMuCi0gKi8KLXZvaWQgUE5HQVBJCi1wbmdfc2F2ZV91aW50XzE2KHBuZ19ieXRlcCBidWYsIHVuc2lnbmVkIGludCBpKQotewotICAgYnVmWzBdID0gKHBuZ19ieXRlKSgoaSA+PiA4KSAmIDB4ZmYpOwotICAgYnVmWzFdID0gKHBuZ19ieXRlKShpICYgMHhmZik7Ci19Ci0KLS8qIFNpbXBsZSBmdW5jdGlvbiB0byB3cml0ZSB0aGUgc2lnbmF0dXJlLiAgSWYgd2UgaGF2ZSBhbHJlYWR5IHdyaXR0ZW4KLSAqIHRoZSBtYWdpYyBieXRlcyBvZiB0aGUgc2lnbmF0dXJlLCBvciBtb3JlIGxpa2VseSwgdGhlIFBORyBzdHJlYW0gaXMKLSAqIGJlaW5nIGVtYmVkZGVkIGludG8gYW5vdGhlciBzdHJlYW0gYW5kIGRvZXNuJ3QgbmVlZCBpdHMgb3duIHNpZ25hdHVyZSwKLSAqIHdlIHNob3VsZCBjYWxsIHBuZ19zZXRfc2lnX2J5dGVzKCkgdG8gdGVsbCBsaWJwbmcgaG93IG1hbnkgb2YgdGhlCi0gKiBieXRlcyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLgotICovCi12b2lkIFBOR0FQSQotcG5nX3dyaXRlX3NpZyhwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2J5dGUgcG5nX3NpZ25hdHVyZVs4XSA9IHsxMzcsIDgwLCA3OCwgNzEsIDEzLCAxMCwgMjYsIDEwfTsKLQotI2lmZGVmIFBOR19JT19TVEFURV9TVVBQT1JURUQKLSAgIC8qIEluZm9ybSB0aGUgSS9PIGNhbGxiYWNrIHRoYXQgdGhlIHNpZ25hdHVyZSBpcyBiZWluZyB3cml0dGVuICovCi0gICBwbmdfcHRyLT5pb19zdGF0ZSA9IFBOR19JT19XUklUSU5HIHwgUE5HX0lPX1NJR05BVFVSRTsKLSNlbmRpZgotCi0gICAvKiBXcml0ZSB0aGUgcmVzdCBvZiB0aGUgOCBieXRlIHNpZ25hdHVyZSAqLwotICAgcG5nX3dyaXRlX2RhdGEocG5nX3B0ciwgJnBuZ19zaWduYXR1cmVbcG5nX3B0ci0+c2lnX2J5dGVzXSwKLSAgICAgIChwbmdfc2l6ZV90KSg4IC0gcG5nX3B0ci0+c2lnX2J5dGVzKSk7Ci0gICBpZiAocG5nX3B0ci0+c2lnX2J5dGVzIDwgMykKLSAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfUE5HX1NJR05BVFVSRTsKLX0KLQotLyogV3JpdGUgYSBQTkcgY2h1bmsgYWxsIGF0IG9uY2UuICBUaGUgdHlwZSBpcyBhbiBhcnJheSBvZiBBU0NJSSBjaGFyYWN0ZXJzCi0gKiByZXByZXNlbnRpbmcgdGhlIGNodW5rIG5hbWUuICBUaGUgYXJyYXkgbXVzdCBiZSBhdCBsZWFzdCA0IGJ5dGVzIGluCi0gKiBsZW5ndGgsIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIG51bGwgdGVybWluYXRlZC4gIFRvIGJlIHNhZmUsIHBhc3MgdGhlCi0gKiBwcmUtZGVmaW5lZCBjaHVuayBuYW1lcyBoZXJlLCBhbmQgaWYgeW91IG5lZWQgYSBuZXcgb25lLCBkZWZpbmUgaXQKLSAqIHdoZXJlIHRoZSBvdGhlcnMgYXJlIGRlZmluZWQuICBUaGUgbGVuZ3RoIGlzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEuCi0gKiBBbGwgdGhlIGRhdGEgbXVzdCBiZSBwcmVzZW50LiAgSWYgdGhhdCBpcyBub3QgcG9zc2libGUsIHVzZSB0aGUKLSAqIHBuZ193cml0ZV9jaHVua19zdGFydCgpLCBwbmdfd3JpdGVfY2h1bmtfZGF0YSgpLCBhbmQgcG5nX3dyaXRlX2NodW5rX2VuZCgpCi0gKiBmdW5jdGlvbnMgaW5zdGVhZC4KLSAqLwotdm9pZCBQTkdBUEkKLXBuZ193cml0ZV9jaHVuayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgY2h1bmtfbmFtZSwKLSAgIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfd3JpdGVfY2h1bmtfc3RhcnQocG5nX3B0ciwgY2h1bmtfbmFtZSwgKHBuZ191aW50XzMyKWxlbmd0aCk7Ci0gICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBkYXRhLCAocG5nX3NpemVfdClsZW5ndGgpOwotICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsKLX0KLQotLyogV3JpdGUgdGhlIHN0YXJ0IG9mIGEgUE5HIGNodW5rLiAgVGhlIHR5cGUgaXMgdGhlIGNodW5rIHR5cGUuCi0gKiBUaGUgdG90YWxfbGVuZ3RoIGlzIHRoZSBzdW0gb2YgdGhlIGxlbmd0aHMgb2YgYWxsIHRoZSBkYXRhIHlvdSB3aWxsIGJlCi0gKiBwYXNzaW5nIGluIHBuZ193cml0ZV9jaHVua19kYXRhKCkuCi0gKi8KLXZvaWQgUE5HQVBJCi1wbmdfd3JpdGVfY2h1bmtfc3RhcnQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGNodW5rX25hbWUsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpCi17Ci0gICBwbmdfYnl0ZSBidWZbOF07Ci0KLSAgIHBuZ19kZWJ1ZzIoMCwgIldyaXRpbmcgJXMgY2h1bmssIGxlbmd0aCA9ICVsdSIsIGNodW5rX25hbWUsCi0gICAgICAodW5zaWduZWQgbG9uZylsZW5ndGgpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0jaWZkZWYgUE5HX0lPX1NUQVRFX1NVUFBPUlRFRAotICAgLyogSW5mb3JtIHRoZSBJL08gY2FsbGJhY2sgdGhhdCB0aGUgY2h1bmsgaGVhZGVyIGlzIGJlaW5nIHdyaXR0ZW4uCi0gICAgKiBQTkdfSU9fQ0hVTktfSERSIHJlcXVpcmVzIGEgc2luZ2xlIEkvTyBjYWxsLgotICAgICovCi0gICBwbmdfcHRyLT5pb19zdGF0ZSA9IFBOR19JT19XUklUSU5HIHwgUE5HX0lPX0NIVU5LX0hEUjsKLSNlbmRpZgotCi0gICAvKiBXcml0ZSB0aGUgbGVuZ3RoIGFuZCB0aGUgY2h1bmsgbmFtZSAqLwotICAgcG5nX3NhdmVfdWludF8zMihidWYsIGxlbmd0aCk7Ci0gICBwbmdfbWVtY3B5KGJ1ZiArIDQsIGNodW5rX25hbWUsIDQpOwotICAgcG5nX3dyaXRlX2RhdGEocG5nX3B0ciwgYnVmLCAocG5nX3NpemVfdCk4KTsKLSAgIC8qIFB1dCB0aGUgY2h1bmsgbmFtZSBpbnRvIHBuZ19wdHItPmNodW5rX25hbWUgKi8KLSAgIHBuZ19tZW1jcHkocG5nX3B0ci0+Y2h1bmtfbmFtZSwgY2h1bmtfbmFtZSwgNCk7Ci0gICAvKiBSZXNldCB0aGUgY3JjIGFuZCBydW4gaXQgb3ZlciB0aGUgY2h1bmsgbmFtZSAqLwotICAgcG5nX3Jlc2V0X2NyYyhwbmdfcHRyKTsKLSAgIHBuZ19jYWxjdWxhdGVfY3JjKHBuZ19wdHIsIGNodW5rX25hbWUsIDQpOwotCi0jaWZkZWYgUE5HX0lPX1NUQVRFX1NVUFBPUlRFRAotICAgLyogSW5mb3JtIHRoZSBJL08gY2FsbGJhY2sgdGhhdCBjaHVuayBkYXRhIHdpbGwgKHBvc3NpYmx5KSBiZSB3cml0dGVuLgotICAgICogUE5HX0lPX0NIVU5LX0RBVEEgZG9lcyBOT1QgcmVxdWlyZSBhIHNwZWNpZmljIG51bWJlciBvZiBJL08gY2FsbHMuCi0gICAgKi8KLSAgIHBuZ19wdHItPmlvX3N0YXRlID0gUE5HX0lPX1dSSVRJTkcgfCBQTkdfSU9fQ0hVTktfREFUQTsKLSNlbmRpZgotfQotCi0vKiBXcml0ZSB0aGUgZGF0YSBvZiBhIFBORyBjaHVuayBzdGFydGVkIHdpdGggcG5nX3dyaXRlX2NodW5rX3N0YXJ0KCkuCi0gKiBOb3RlIHRoYXQgbXVsdGlwbGUgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBhcmUgYWxsb3dlZCwgYW5kIHRoYXQgdGhlCi0gKiBzdW0gb2YgdGhlIGxlbmd0aHMgZnJvbSB0aGVzZSBjYWxscyAqbXVzdCogYWRkIHVwIHRvIHRoZSB0b3RhbF9sZW5ndGgKLSAqIGdpdmVuIHRvIHBuZ193cml0ZV9jaHVua19zdGFydCgpLgotICovCi12b2lkIFBOR0FQSQotcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQotewotICAgLyogV3JpdGUgdGhlIGRhdGEsIGFuZCBydW4gdGhlIENSQyBvdmVyIGl0ICovCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgaWYgKGRhdGEgIT0gTlVMTCAmJiBsZW5ndGggPiAwKQotICAgewotICAgICAgcG5nX3dyaXRlX2RhdGEocG5nX3B0ciwgZGF0YSwgbGVuZ3RoKTsKLSAgICAgIC8qIFVwZGF0ZSB0aGUgQ1JDIGFmdGVyIHdyaXRpbmcgdGhlIGRhdGEsCi0gICAgICAgKiBpbiBjYXNlIHRoYXQgdGhlIHVzZXIgSS9PIHJvdXRpbmUgYWx0ZXJzIGl0LgotICAgICAgICovCi0gICAgICBwbmdfY2FsY3VsYXRlX2NyYyhwbmdfcHRyLCBkYXRhLCBsZW5ndGgpOwotICAgfQotfQotCi0vKiBGaW5pc2ggYSBjaHVuayBzdGFydGVkIHdpdGggcG5nX3dyaXRlX2NodW5rX3N0YXJ0KCkuICovCi12b2lkIFBOR0FQSQotcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2J5dGUgYnVmWzRdOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKSByZXR1cm47Ci0KLSNpZmRlZiBQTkdfSU9fU1RBVEVfU1VQUE9SVEVECi0gICAvKiBJbmZvcm0gdGhlIEkvTyBjYWxsYmFjayB0aGF0IHRoZSBjaHVuayBDUkMgaXMgYmVpbmcgd3JpdHRlbi4KLSAgICAqIFBOR19JT19DSFVOS19DUkMgcmVxdWlyZXMgYSBzaW5nbGUgSS9PIGZ1bmN0aW9uIGNhbGwuCi0gICAgKi8KLSAgIHBuZ19wdHItPmlvX3N0YXRlID0gUE5HX0lPX1dSSVRJTkcgfCBQTkdfSU9fQ0hVTktfQ1JDOwotI2VuZGlmCi0KLSAgIC8qIFdyaXRlIHRoZSBjcmMgaW4gYSBzaW5nbGUgb3BlcmF0aW9uICovCi0gICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiwgcG5nX3B0ci0+Y3JjKTsKLQotICAgcG5nX3dyaXRlX2RhdGEocG5nX3B0ciwgYnVmLCAocG5nX3NpemVfdCk0KTsKLX0KLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1RFWFRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9pQ0NQX1NVUFBPUlRFRCkKLS8qIFRoaXMgcGFpciBvZiBmdW5jdGlvbnMgZW5jYXBzdWxhdGVzIHRoZSBvcGVyYXRpb24gb2YgKGEpIGNvbXByZXNzaW5nIGEKLSAqIHRleHQgc3RyaW5nLCBhbmQgKGIpIGlzc3VpbmcgaXQgbGF0ZXIgYXMgYSBzZXJpZXMgb2YgY2h1bmsgZGF0YSB3cml0ZXMuCi0gKiBUaGUgY29tcHJlc3Npb25fc3RhdGUgc3RydWN0dXJlIGlzIHNoYXJlZCBjb250ZXh0IGZvciB0aGVzZSBmdW5jdGlvbnMKLSAqIHNldCB1cCBieSB0aGUgY2FsbGVyIGluIG9yZGVyIHRvIG1ha2UgdGhlIHdob2xlIG1lc3MgdGhyZWFkLXNhZmUuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgIGNoYXIgKmlucHV0OyAgIC8qIFRoZSB1bmNvbXByZXNzZWQgaW5wdXQgZGF0YSAqLwotICAgaW50IGlucHV0X2xlbjsgICAvKiBJdHMgbGVuZ3RoICovCi0gICBpbnQgbnVtX291dHB1dF9wdHI7IC8qIE51bWJlciBvZiBvdXRwdXQgcG9pbnRlcnMgdXNlZCAqLwotICAgaW50IG1heF9vdXRwdXRfcHRyOyAvKiBTaXplIG9mIG91dHB1dF9wdHIgKi8KLSAgIHBuZ19jaGFycHAgb3V0cHV0X3B0cjsgLyogQXJyYXkgb2YgcG9pbnRlcnMgdG8gb3V0cHV0ICovCi19IGNvbXByZXNzaW9uX3N0YXRlOwotCi0vKiBDb21wcmVzcyBnaXZlbiB0ZXh0IGludG8gc3RvcmFnZSBpbiB0aGUgcG5nX3B0ciBzdHJ1Y3R1cmUgKi8KLXN0YXRpYyBpbnQgLyogUFJJVkFURSAqLwotcG5nX3RleHRfY29tcHJlc3MocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICAgcG5nX2NoYXJwIHRleHQsIHBuZ19zaXplX3QgdGV4dF9sZW4sIGludCBjb21wcmVzc2lvbiwKLSAgICAgICAgY29tcHJlc3Npb25fc3RhdGUgKmNvbXApCi17Ci0gICBpbnQgcmV0OwotCi0gICBjb21wLT5udW1fb3V0cHV0X3B0ciA9IDA7Ci0gICBjb21wLT5tYXhfb3V0cHV0X3B0ciA9IDA7Ci0gICBjb21wLT5vdXRwdXRfcHRyID0gTlVMTDsKLSAgIGNvbXAtPmlucHV0ID0gTlVMTDsKLSAgIGNvbXAtPmlucHV0X2xlbiA9IDA7Ci0KLSAgIC8qIFdlIG1heSBqdXN0IHdhbnQgdG8gcGFzcyB0aGUgdGV4dCByaWdodCB0aHJvdWdoICovCi0gICBpZiAoY29tcHJlc3Npb24gPT0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORSkKLSAgIHsKLSAgICAgICBjb21wLT5pbnB1dCA9IHRleHQ7Ci0gICAgICAgY29tcC0+aW5wdXRfbGVuID0gdGV4dF9sZW47Ci0gICAgICAgcmV0dXJuKChpbnQpdGV4dF9sZW4pOwotICAgfQotCi0gICBpZiAoY29tcHJlc3Npb24gPj0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTEFTVCkKLSAgIHsKLSNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECi0gICAgICBjaGFyIG1zZ1s1MF07Ci0gICAgICBwbmdfc25wcmludGYobXNnLCA1MCwgIlVua25vd24gY29tcHJlc3Npb24gdHlwZSAlZCIsIGNvbXByZXNzaW9uKTsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIG1zZyk7Ci0jZWxzZQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVua25vd24gY29tcHJlc3Npb24gdHlwZSIpOwotI2VuZGlmCi0gICB9Ci0KLSAgIC8qIFdlIGNhbid0IHdyaXRlIHRoZSBjaHVuayB1bnRpbCB3ZSBmaW5kIG91dCBob3cgbXVjaCBkYXRhIHdlIGhhdmUsCi0gICAgKiB3aGljaCBtZWFucyB3ZSBuZWVkIHRvIHJ1biB0aGUgY29tcHJlc3NvciBmaXJzdCBhbmQgc2F2ZSB0aGUKLSAgICAqIG91dHB1dC4gIFRoaXMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbSwgYXMgdGhlIHZhc3QgbWFqb3JpdHkgb2YKLSAgICAqIGNvbW1lbnRzIHNob3VsZCBiZSByZWFzb25hYmxlLCBidXQgd2Ugd2lsbCBzZXQgdXAgYW4gYXJyYXkgb2YKLSAgICAqIG1hbGxvYydkIHBvaW50ZXJzIHRvIGJlIHN1cmUuCi0gICAgKgotICAgICogSWYgd2Uga25ldyB0aGUgYXBwbGljYXRpb24gd2FzIHdlbGwgYmVoYXZlZCwgd2UgY291bGQgc2ltcGxpZnkgdGhpcwotICAgICogZ3JlYXRseSBieSBhc3N1bWluZyB3ZSBjYW4gYWx3YXlzIG1hbGxvYyBhbiBvdXRwdXQgYnVmZmVyIGxhcmdlCi0gICAgKiBlbm91Z2ggdG8gaG9sZCB0aGUgY29tcHJlc3NlZCB0ZXh0ICgoMTAwMSAqIHRleHRfbGVuIC8gMTAwMCkgKyAxMikKLSAgICAqIGFuZCBtYWxsb2MgdGhpcyBkaXJlY3RseS4gIFRoZSBvbmx5IHRpbWUgdGhpcyB3b3VsZCBiZSBhIGJhZCBpZGVhIGlzCi0gICAgKiBpZiB3ZSBjYW4ndCBtYWxsb2MgbW9yZSB0aGFuIDY0SyBhbmQgd2UgaGF2ZSA2NEsgb2YgcmFuZG9tIGlucHV0Ci0gICAgKiBkYXRhLCBvciBpZiB0aGUgaW5wdXQgc3RyaW5nIGlzIGluY3JlZGlibHkgbGFyZ2UgKGFsdGhvdWdoIHRoaXMKLSAgICAqIHdvdWxkbid0IGNhdXNlIGEgZmFpbHVyZSwganVzdCBhIHNsb3dkb3duIGR1ZSB0byBzd2FwcGluZykuCi0gICAgKi8KLQotICAgLyogU2V0IHVwIHRoZSBjb21wcmVzc2lvbiBidWZmZXJzICovCi0gICAvKiBUT0RPOiB0aGUgZm9sbG93aW5nIGNhc3QgaGlkZXMgYSBwb3RlbnRpYWwgb3ZlcmZsb3cgcHJvYmxlbS4gKi8KLSAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAodUludCl0ZXh0X2xlbjsKLSAgIC8qIE5PVEU6IGFzc3VtZSB6bGliIGRvZXNuJ3Qgb3ZlcndyaXRlIHRoZSBpbnB1dCAqLwotICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X2luID0gKEJ5dGVmICopdGV4dDsKLSAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gcG5nX3B0ci0+emJ1Zl9zaXplOwotICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IHBuZ19wdHItPnpidWY7Ci0KLSAgIC8qIFRoaXMgaXMgdGhlIHNhbWUgY29tcHJlc3Npb24gbG9vcCBhcyBpbiBwbmdfd3JpdGVfcm93KCkgKi8KLSAgIGRvCi0gICB7Ci0gICAgICAvKiBDb21wcmVzcyB0aGUgZGF0YSAqLwotICAgICAgcmV0ID0gZGVmbGF0ZSgmcG5nX3B0ci0+enN0cmVhbSwgWl9OT19GTFVTSCk7Ci0gICAgICBpZiAocmV0ICE9IFpfT0spCi0gICAgICB7Ci0gICAgICAgICAvKiBFcnJvciAqLwotICAgICAgICAgaWYgKHBuZ19wdHItPnpzdHJlYW0ubXNnICE9IE5VTEwpCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgcG5nX3B0ci0+enN0cmVhbS5tc2cpOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJ6bGliIGVycm9yIik7Ci0gICAgICB9Ci0gICAgICAvKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCBtb3JlIHJvb20gKi8KLSAgICAgIGlmICghKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0KSkKLSAgICAgIHsKLSAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgb3V0cHV0IGFycmF5IGhhcyByb29tICovCi0gICAgICAgICBpZiAoY29tcC0+bnVtX291dHB1dF9wdHIgPj0gY29tcC0+bWF4X291dHB1dF9wdHIpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgb2xkX21heDsKLQotICAgICAgICAgICAgb2xkX21heCA9IGNvbXAtPm1heF9vdXRwdXRfcHRyOwotICAgICAgICAgICAgY29tcC0+bWF4X291dHB1dF9wdHIgPSBjb21wLT5udW1fb3V0cHV0X3B0ciArIDQ7Ci0gICAgICAgICAgICBpZiAoY29tcC0+b3V0cHV0X3B0ciAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2NoYXJwcCBvbGRfcHRyOwotCi0gICAgICAgICAgICAgICBvbGRfcHRyID0gY29tcC0+b3V0cHV0X3B0cjsKLSAgICAgICAgICAgICAgIGNvbXAtPm91dHB1dF9wdHIgPSAocG5nX2NoYXJwcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAocG5nX2FsbG9jX3NpemVfdCkKLSAgICAgICAgICAgICAgICAgIChjb21wLT5tYXhfb3V0cHV0X3B0ciAqIHBuZ19zaXplb2YocG5nX2NoYXJwcCkpKTsKLSAgICAgICAgICAgICAgIHBuZ19tZW1jcHkoY29tcC0+b3V0cHV0X3B0ciwgb2xkX3B0ciwgb2xkX21heAotICAgICAgICAgICAgICAgICAgKiBwbmdfc2l6ZW9mKHBuZ19jaGFycCkpOwotICAgICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgb2xkX3B0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBjb21wLT5vdXRwdXRfcHRyID0gKHBuZ19jaGFycHApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgKHBuZ19hbGxvY19zaXplX3QpCi0gICAgICAgICAgICAgICAgICAoY29tcC0+bWF4X291dHB1dF9wdHIgKiBwbmdfc2l6ZW9mKHBuZ19jaGFycCkpKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgLyogU2F2ZSB0aGUgZGF0YSAqLwotICAgICAgICAgY29tcC0+b3V0cHV0X3B0cltjb21wLT5udW1fb3V0cHV0X3B0cl0gPQotICAgICAgICAgICAgKHBuZ19jaGFycClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAgICAocG5nX2FsbG9jX3NpemVfdClwbmdfcHRyLT56YnVmX3NpemUpOwotICAgICAgICAgcG5nX21lbWNweShjb21wLT5vdXRwdXRfcHRyW2NvbXAtPm51bV9vdXRwdXRfcHRyXSwgcG5nX3B0ci0+emJ1ZiwKLSAgICAgICAgICAgIHBuZ19wdHItPnpidWZfc2l6ZSk7Ci0gICAgICAgICBjb21wLT5udW1fb3V0cHV0X3B0cisrOwotCi0gICAgICAgICAvKiBhbmQgcmVzZXQgdGhlIGJ1ZmZlciAqLwotICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAodUludClwbmdfcHRyLT56YnVmX3NpemU7Ci0gICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKLSAgICAgIH0KLSAgIC8qIENvbnRpbnVlIHVudGlsIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgdG8gY29tcHJlc3MgKi8KLSAgIH0gd2hpbGUgKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4pOwotCi0gICAvKiBGaW5pc2ggdGhlIGNvbXByZXNzaW9uICovCi0gICBkbwotICAgewotICAgICAgLyogVGVsbCB6bGliIHdlIGFyZSBmaW5pc2hlZCAqLwotICAgICAgcmV0ID0gZGVmbGF0ZSgmcG5nX3B0ci0+enN0cmVhbSwgWl9GSU5JU0gpOwotCi0gICAgICBpZiAocmV0ID09IFpfT0spCi0gICAgICB7Ci0gICAgICAgICAvKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCBtb3JlIHJvb20gKi8KLSAgICAgICAgIGlmICghKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0KSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIENoZWNrIHRvIG1ha2Ugc3VyZSBvdXIgb3V0cHV0IGFycmF5IGhhcyByb29tICovCi0gICAgICAgICAgICBpZiAoY29tcC0+bnVtX291dHB1dF9wdHIgPj0gY29tcC0+bWF4X291dHB1dF9wdHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpbnQgb2xkX21heDsKLQotICAgICAgICAgICAgICAgb2xkX21heCA9IGNvbXAtPm1heF9vdXRwdXRfcHRyOwotICAgICAgICAgICAgICAgY29tcC0+bWF4X291dHB1dF9wdHIgPSBjb21wLT5udW1fb3V0cHV0X3B0ciArIDQ7Ci0gICAgICAgICAgICAgICBpZiAoY29tcC0+b3V0cHV0X3B0ciAhPSBOVUxMKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcG5nX2NoYXJwcCBvbGRfcHRyOwotCi0gICAgICAgICAgICAgICAgICBvbGRfcHRyID0gY29tcC0+b3V0cHV0X3B0cjsKLSAgICAgICAgICAgICAgICAgIC8qIFRoaXMgY291bGQgYmUgb3B0aW1pemVkIHRvIHJlYWxsb2MoKSAqLwotICAgICAgICAgICAgICAgICAgY29tcC0+b3V0cHV0X3B0ciA9IChwbmdfY2hhcnBwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgIChwbmdfYWxsb2Nfc2l6ZV90KShjb21wLT5tYXhfb3V0cHV0X3B0ciAqCi0gICAgICAgICAgICAgICAgICAgICBwbmdfc2l6ZW9mKHBuZ19jaGFycCkpKTsKLSAgICAgICAgICAgICAgICAgIHBuZ19tZW1jcHkoY29tcC0+b3V0cHV0X3B0ciwgb2xkX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgIG9sZF9tYXggKiBwbmdfc2l6ZW9mKHBuZ19jaGFycCkpOwotICAgICAgICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgb2xkX3B0cik7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBjb21wLT5vdXRwdXRfcHRyID0gKHBuZ19jaGFycHApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgKHBuZ19hbGxvY19zaXplX3QpKGNvbXAtPm1heF9vdXRwdXRfcHRyICoKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19zaXplb2YocG5nX2NoYXJwKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBTYXZlIHRoZSBkYXRhICovCi0gICAgICAgICAgICBjb21wLT5vdXRwdXRfcHRyW2NvbXAtPm51bV9vdXRwdXRfcHRyXSA9Ci0gICAgICAgICAgICAgICAocG5nX2NoYXJwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgICAgIChwbmdfYWxsb2Nfc2l6ZV90KXBuZ19wdHItPnpidWZfc2l6ZSk7Ci0gICAgICAgICAgICBwbmdfbWVtY3B5KGNvbXAtPm91dHB1dF9wdHJbY29tcC0+bnVtX291dHB1dF9wdHJdLCBwbmdfcHRyLT56YnVmLAotICAgICAgICAgICAgICAgcG5nX3B0ci0+emJ1Zl9zaXplKTsKLSAgICAgICAgICAgIGNvbXAtPm51bV9vdXRwdXRfcHRyKys7Ci0KLSAgICAgICAgICAgIC8qIGFuZCByZXNldCB0aGUgYnVmZmVyIHBvaW50ZXJzICovCi0gICAgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXBuZ19wdHItPnpidWZfc2l6ZTsKLSAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT56YnVmOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAocmV0ICE9IFpfU1RSRUFNX0VORCkKLSAgICAgIHsKLSAgICAgICAgIC8qIFdlIGdvdCBhbiBlcnJvciAqLwotICAgICAgICAgaWYgKHBuZ19wdHItPnpzdHJlYW0ubXNnICE9IE5VTEwpCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgcG5nX3B0ci0+enN0cmVhbS5tc2cpOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJ6bGliIGVycm9yIik7Ci0gICAgICB9Ci0gICB9IHdoaWxlIChyZXQgIT0gWl9TVFJFQU1fRU5EKTsKLQotICAgLyogVGV4dCBsZW5ndGggaXMgbnVtYmVyIG9mIGJ1ZmZlcnMgcGx1cyBsYXN0IGJ1ZmZlciAqLwotICAgdGV4dF9sZW4gPSBwbmdfcHRyLT56YnVmX3NpemUgKiBjb21wLT5udW1fb3V0cHV0X3B0cjsKLSAgIGlmIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA8IHBuZ19wdHItPnpidWZfc2l6ZSkKLSAgICAgIHRleHRfbGVuICs9IHBuZ19wdHItPnpidWZfc2l6ZSAtIChwbmdfc2l6ZV90KXBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0OwotCi0gICByZXR1cm4oKGludCl0ZXh0X2xlbik7Ci19Ci0KLS8qIFNoaXAgdGhlIGNvbXByZXNzZWQgdGV4dCBvdXQgdmlhIGNodW5rIHdyaXRlcyAqLwotc3RhdGljIHZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX2NvbXByZXNzZWRfZGF0YV9vdXQocG5nX3N0cnVjdHAgcG5nX3B0ciwgY29tcHJlc3Npb25fc3RhdGUgKmNvbXApCi17Ci0gICBpbnQgaTsKLQotICAgLyogSGFuZGxlIHRoZSBuby1jb21wcmVzc2lvbiBjYXNlICovCi0gICBpZiAoY29tcC0+aW5wdXQpCi0gICB7Ci0gICAgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKWNvbXAtPmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwbmdfc2l6ZV90KWNvbXAtPmlucHV0X2xlbik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIC8qIFdyaXRlIHNhdmVkIG91dHB1dCBidWZmZXJzLCBpZiBhbnkgKi8KLSAgIGZvciAoaSA9IDA7IGkgPCBjb21wLT5udW1fb3V0cHV0X3B0cjsgaSsrKQotICAgewotICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgKHBuZ19ieXRlcCljb21wLT5vdXRwdXRfcHRyW2ldLAotICAgICAgICAgKHBuZ19zaXplX3QpcG5nX3B0ci0+emJ1Zl9zaXplKTsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGNvbXAtPm91dHB1dF9wdHJbaV0pOwotICAgfQotICAgaWYgKGNvbXAtPm1heF9vdXRwdXRfcHRyICE9IDApCi0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBjb21wLT5vdXRwdXRfcHRyKTsKLSAgIC8qIFdyaXRlIGFueXRoaW5nIGxlZnQgaW4gemJ1ZiAqLwotICAgaWYgKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0IDwgKHBuZ191aW50XzMyKXBuZ19wdHItPnpidWZfc2l6ZSkKLSAgICAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIHBuZ19wdHItPnpidWYsCi0gICAgICAgICAocG5nX3NpemVfdCkocG5nX3B0ci0+emJ1Zl9zaXplIC0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQpKTsKLQotICAgLyogUmVzZXQgemxpYiBmb3IgYW5vdGhlciB6VFh0L2lUWHQgb3IgaW1hZ2UgZGF0YSAqLwotICAgZGVmbGF0ZVJlc2V0KCZwbmdfcHRyLT56c3RyZWFtKTsKLSAgIHBuZ19wdHItPnpzdHJlYW0uZGF0YV90eXBlID0gWl9CSU5BUlk7Ci19Ci0jZW5kaWYKLQotLyogV3JpdGUgdGhlIElIRFIgY2h1bmssIGFuZCB1cGRhdGUgdGhlIHBuZ19zdHJ1Y3Qgd2l0aCB0aGUgbmVjZXNzYXJ5Ci0gKiBpbmZvcm1hdGlvbi4gIE5vdGUgdGhhdCB0aGUgcmVzdCBvZiB0aGlzIGNvZGUgZGVwZW5kcyB1cG9uIHRoaXMKLSAqIGluZm9ybWF0aW9uIGJlaW5nIGNvcnJlY3QuCi0gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX0lIRFIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgd2lkdGgsIHBuZ191aW50XzMyIGhlaWdodCwKLSAgIGludCBiaXRfZGVwdGgsIGludCBjb2xvcl90eXBlLCBpbnQgY29tcHJlc3Npb25fdHlwZSwgaW50IGZpbHRlcl90eXBlLAotICAgaW50IGludGVybGFjZV90eXBlKQotewotICAgUE5HX0lIRFI7Ci0gICBpbnQgcmV0OwotCi0gICBwbmdfYnl0ZSBidWZbMTNdOyAvKiBCdWZmZXIgdG8gc3RvcmUgdGhlIElIRFIgaW5mbyAqLwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9JSERSIik7Ci0KLSAgIC8qIENoZWNrIHRoYXQgd2UgaGF2ZSB2YWxpZCBpbnB1dCBkYXRhIGZyb20gdGhlIGFwcGxpY2F0aW9uIGluZm8gKi8KLSAgIHN3aXRjaCAoY29sb3JfdHlwZSkKLSAgIHsKLSAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWToKLSAgICAgICAgIHN3aXRjaCAoYml0X2RlcHRoKQotICAgICAgICAgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgY2FzZSAxNjogcG5nX3B0ci0+Y2hhbm5lbHMgPSAxOyBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6IHBuZ19lcnJvcihwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGJpdCBkZXB0aCBmb3IgZ3JheXNjYWxlIGltYWdlIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCOgotICAgICAgICAgaWYgKGJpdF9kZXB0aCAhPSA4ICYmIGJpdF9kZXB0aCAhPSAxNikKLSAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBiaXQgZGVwdGggZm9yIFJHQiBpbWFnZSIpOwotICAgICAgICAgcG5nX3B0ci0+Y2hhbm5lbHMgPSAzOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1BBTEVUVEU6Ci0gICAgICAgICBzd2l0Y2ggKGJpdF9kZXB0aCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGNhc2UgODogcG5nX3B0ci0+Y2hhbm5lbHMgPSAxOyBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6IHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBiaXQgZGVwdGggZm9yIHBhbGV0dGVkIGltYWdlIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQToKLSAgICAgICAgIGlmIChiaXRfZGVwdGggIT0gOCAmJiBiaXRfZGVwdGggIT0gMTYpCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgYml0IGRlcHRoIGZvciBncmF5c2NhbGUrYWxwaGEgaW1hZ2UiKTsKLSAgICAgICAgIHBuZ19wdHItPmNoYW5uZWxzID0gMjsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE6Ci0gICAgICAgICBpZiAoYml0X2RlcHRoICE9IDggJiYgYml0X2RlcHRoICE9IDE2KQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIGJpdCBkZXB0aCBmb3IgUkdCQSBpbWFnZSIpOwotICAgICAgICAgcG5nX3B0ci0+Y2hhbm5lbHMgPSA0OwotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIGltYWdlIGNvbG9yIHR5cGUgc3BlY2lmaWVkIik7Ci0gICB9Ci0KLSAgIGlmIChjb21wcmVzc2lvbl90eXBlICE9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBjb21wcmVzc2lvbiB0eXBlIHNwZWNpZmllZCIpOwotICAgICAgY29tcHJlc3Npb25fdHlwZSA9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0U7Ci0gICB9Ci0KLSAgIC8qIFdyaXRlIGZpbHRlcl9tZXRob2QgNjQgKGludHJhcGl4ZWwgZGlmZmVyZW5jaW5nKSBvbmx5IGlmCi0gICAgKiAxLiBMaWJwbmcgd2FzIGNvbXBpbGVkIHdpdGggUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQgYW5kCi0gICAgKiAyLiBMaWJwbmcgZGlkIG5vdCB3cml0ZSBhIFBORyBzaWduYXR1cmUgKHRoaXMgZmlsdGVyX21ldGhvZCBpcyBvbmx5Ci0gICAgKiAgICB1c2VkIGluIFBORyBkYXRhc3RyZWFtcyB0aGF0IGFyZSBlbWJlZGRlZCBpbiBNTkcgZGF0YXN0cmVhbXMpIGFuZAotICAgICogMy4gVGhlIGFwcGxpY2F0aW9uIGNhbGxlZCBwbmdfcGVybWl0X21uZ19mZWF0dXJlcyB3aXRoIGEgbWFzayB0aGF0Ci0gICAgKiAgICBpbmNsdWRlZCBQTkdfRkxBR19NTkdfRklMVEVSXzY0IGFuZAotICAgICogNC4gVGhlIGZpbHRlcl9tZXRob2QgaXMgNjQgYW5kCi0gICAgKiA1LiBUaGUgY29sb3JfdHlwZSBpcyBSR0Igb3IgUkdCQQotICAgICovCi0gICBpZiAoCi0jaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKLSAgICAgICEoKHBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQgJiBQTkdfRkxBR19NTkdfRklMVEVSXzY0KSAmJgotICAgICAgKChwbmdfcHRyLT5tb2RlJlBOR19IQVZFX1BOR19TSUdOQVRVUkUpID09IDApICYmCi0gICAgICAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKLSAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkgJiYKLSAgICAgIChmaWx0ZXJfdHlwZSA9PSBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcpKSAmJgotI2VuZGlmCi0gICAgICBmaWx0ZXJfdHlwZSAhPSBQTkdfRklMVEVSX1RZUEVfQkFTRSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGZpbHRlciB0eXBlIHNwZWNpZmllZCIpOwotICAgICAgZmlsdGVyX3R5cGUgPSBQTkdfRklMVEVSX1RZUEVfQkFTRTsKLSAgIH0KLQotI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSAgIGlmIChpbnRlcmxhY2VfdHlwZSAhPSBQTkdfSU5URVJMQUNFX05PTkUgJiYKLSAgICAgIGludGVybGFjZV90eXBlICE9IFBOR19JTlRFUkxBQ0VfQURBTTcpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBpbnRlcmxhY2UgdHlwZSBzcGVjaWZpZWQiKTsKLSAgICAgIGludGVybGFjZV90eXBlID0gUE5HX0lOVEVSTEFDRV9BREFNNzsKLSAgIH0KLSNlbHNlCi0gICBpbnRlcmxhY2VfdHlwZT1QTkdfSU5URVJMQUNFX05PTkU7Ci0jZW5kaWYKLQotICAgLyogU2F2ZSB0aGUgcmVsZXZlbnQgaW5mb3JtYXRpb24gKi8KLSAgIHBuZ19wdHItPmJpdF9kZXB0aCA9IChwbmdfYnl0ZSliaXRfZGVwdGg7Ci0gICBwbmdfcHRyLT5jb2xvcl90eXBlID0gKHBuZ19ieXRlKWNvbG9yX3R5cGU7Ci0gICBwbmdfcHRyLT5pbnRlcmxhY2VkID0gKHBuZ19ieXRlKWludGVybGFjZV90eXBlOwotI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECi0gICBwbmdfcHRyLT5maWx0ZXJfdHlwZSA9IChwbmdfYnl0ZSlmaWx0ZXJfdHlwZTsKLSNlbmRpZgotICAgcG5nX3B0ci0+Y29tcHJlc3Npb25fdHlwZSA9IChwbmdfYnl0ZSljb21wcmVzc2lvbl90eXBlOwotICAgcG5nX3B0ci0+d2lkdGggPSB3aWR0aDsKLSAgIHBuZ19wdHItPmhlaWdodCA9IGhlaWdodDsKLQotICAgcG5nX3B0ci0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKGJpdF9kZXB0aCAqIHBuZ19wdHItPmNoYW5uZWxzKTsKLSAgIHBuZ19wdHItPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHBuZ19wdHItPnBpeGVsX2RlcHRoLCB3aWR0aCk7Ci0gICAvKiBTZXQgdGhlIHVzciBpbmZvLCBzbyBhbnkgdHJhbnNmb3JtYXRpb25zIGNhbiBtb2RpZnkgaXQgKi8KLSAgIHBuZ19wdHItPnVzcl93aWR0aCA9IHBuZ19wdHItPndpZHRoOwotICAgcG5nX3B0ci0+dXNyX2JpdF9kZXB0aCA9IHBuZ19wdHItPmJpdF9kZXB0aDsKLSAgIHBuZ19wdHItPnVzcl9jaGFubmVscyA9IHBuZ19wdHItPmNoYW5uZWxzOwotCi0gICAvKiBQYWNrIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gaW50byB0aGUgYnVmZmVyICovCi0gICBwbmdfc2F2ZV91aW50XzMyKGJ1Ziwgd2lkdGgpOwotICAgcG5nX3NhdmVfdWludF8zMihidWYgKyA0LCBoZWlnaHQpOwotICAgYnVmWzhdID0gKHBuZ19ieXRlKWJpdF9kZXB0aDsKLSAgIGJ1Zls5XSA9IChwbmdfYnl0ZSljb2xvcl90eXBlOwotICAgYnVmWzEwXSA9IChwbmdfYnl0ZSljb21wcmVzc2lvbl90eXBlOwotICAgYnVmWzExXSA9IChwbmdfYnl0ZSlmaWx0ZXJfdHlwZTsKLSAgIGJ1ZlsxMl0gPSAocG5nX2J5dGUpaW50ZXJsYWNlX3R5cGU7Ci0KLSAgIC8qIFdyaXRlIHRoZSBjaHVuayAqLwotICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX0lIRFIsIGJ1ZiwgKHBuZ19zaXplX3QpMTMpOwotCi0gICAvKiBJbml0aWFsaXplIHpsaWIgd2l0aCBQTkcgaW5mbyAqLwotICAgcG5nX3B0ci0+enN0cmVhbS56YWxsb2MgPSBwbmdfemFsbG9jOwotICAgcG5nX3B0ci0+enN0cmVhbS56ZnJlZSA9IHBuZ196ZnJlZTsKLSAgIHBuZ19wdHItPnpzdHJlYW0ub3BhcXVlID0gKHZvaWRwZilwbmdfcHRyOwotICAgaWYgKCEocG5nX3B0ci0+ZG9fZmlsdGVyKSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgfHwKLSAgICAgICAgIHBuZ19wdHItPmJpdF9kZXB0aCA8IDgpCi0gICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgPSBQTkdfRklMVEVSX05PTkU7Ci0gICAgICBlbHNlCi0gICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgPSBQTkdfQUxMX0ZJTFRFUlM7Ci0gICB9Ci0gICBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1pMSUJfQ1VTVE9NX1NUUkFURUdZKSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5kb19maWx0ZXIgIT0gUE5HX0ZJTFRFUl9OT05FKQotICAgICAgICAgcG5nX3B0ci0+emxpYl9zdHJhdGVneSA9IFpfRklMVEVSRUQ7Ci0gICAgICBlbHNlCi0gICAgICAgICBwbmdfcHRyLT56bGliX3N0cmF0ZWd5ID0gWl9ERUZBVUxUX1NUUkFURUdZOwotICAgfQotICAgaWYgKCEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19aTElCX0NVU1RPTV9MRVZFTCkpCi0gICAgICBwbmdfcHRyLT56bGliX2xldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OOwotICAgaWYgKCEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19aTElCX0NVU1RPTV9NRU1fTEVWRUwpKQotICAgICAgcG5nX3B0ci0+emxpYl9tZW1fbGV2ZWwgPSA4OwotICAgaWYgKCEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19aTElCX0NVU1RPTV9XSU5ET1dfQklUUykpCi0gICAgICBwbmdfcHRyLT56bGliX3dpbmRvd19iaXRzID0gMTU7Ci0gICBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1pMSUJfQ1VTVE9NX01FVEhPRCkpCi0gICAgICBwbmdfcHRyLT56bGliX21ldGhvZCA9IDg7Ci0gICByZXQgPSBkZWZsYXRlSW5pdDIoJnBuZ19wdHItPnpzdHJlYW0sIHBuZ19wdHItPnpsaWJfbGV2ZWwsCi0gICAgICAgICBwbmdfcHRyLT56bGliX21ldGhvZCwgcG5nX3B0ci0+emxpYl93aW5kb3dfYml0cywKLSAgICAgICAgIHBuZ19wdHItPnpsaWJfbWVtX2xldmVsLCBwbmdfcHRyLT56bGliX3N0cmF0ZWd5KTsKLSAgIGlmIChyZXQgIT0gWl9PSykKLSAgIHsKLSAgICAgIGlmIChyZXQgPT0gWl9WRVJTSU9OX0VSUk9SKSBwbmdfZXJyb3IocG5nX3B0ciwKLSAgICAgICAgICAiemxpYiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb21wcmVzc29yIC0tIHZlcnNpb24gZXJyb3IiKTsKLSAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRVJST1IpIHBuZ19lcnJvcihwbmdfcHRyLAotICAgICAgICAgICAiemxpYiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb21wcmVzc29yIC0tIHN0cmVhbSBlcnJvciIpOwotICAgICAgaWYgKHJldCA9PSBaX01FTV9FUlJPUikgcG5nX2Vycm9yKHBuZ19wdHIsCi0gICAgICAgICAgICJ6bGliIGZhaWxlZCB0byBpbml0aWFsaXplIGNvbXByZXNzb3IgLS0gbWVtIGVycm9yIik7Ci0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInpsaWIgZmFpbGVkIHRvIGluaXRpYWxpemUgY29tcHJlc3NvciIpOwotICAgfQotICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IHBuZ19wdHItPnpidWY7Ci0gICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXBuZ19wdHItPnpidWZfc2l6ZTsKLSAgIC8qIGxpYnBuZyBpcyBub3QgaW50ZXJlc3RlZCBpbiB6c3RyZWFtLmRhdGFfdHlwZSAqLwotICAgLyogU2V0IGl0IHRvIGEgcHJlZGVmaW5lZCB2YWx1ZSwgdG8gYXZvaWQgaXRzIGV2YWx1YXRpb24gaW5zaWRlIHpsaWIgKi8KLSAgIHBuZ19wdHItPnpzdHJlYW0uZGF0YV90eXBlID0gWl9CSU5BUlk7Ci0KLSAgIHBuZ19wdHItPm1vZGUgPSBQTkdfSEFWRV9JSERSOwotfQotCi0vKiBXcml0ZSB0aGUgcGFsZXR0ZS4gIFdlIGFyZSBjYXJlZnVsIG5vdCB0byB0cnVzdCBwbmdfY29sb3IgdG8gYmUgaW4gdGhlCi0gKiBjb3JyZWN0IG9yZGVyIGZvciBQTkcsIHNvIHBlb3BsZSBjYW4gcmVkZWZpbmUgaXQgdG8gYW55IGNvbnZlbmllbnQKLSAqIHN0cnVjdHVyZS4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfUExURShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29sb3JwIHBhbGV0dGUsIHBuZ191aW50XzMyIG51bV9wYWwpCi17Ci0gICBQTkdfUExURTsKLSAgIHBuZ191aW50XzMyIGk7Ci0gICBwbmdfY29sb3JwIHBhbF9wdHI7Ci0gICBwbmdfYnl0ZSBidWZbM107Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX1BMVEUiKTsKLQotICAgaWYgKCgKLSNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAotICAgICAgICAhKHBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQgJiBQTkdfRkxBR19NTkdfRU1QVFlfUExURSkgJiYKLSNlbmRpZgotICAgICAgICBudW1fcGFsID09IDApIHx8IG51bV9wYWwgPiAyNTYpCi0gICB7Ci0gICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgIHsKLSAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIG51bWJlciBvZiBjb2xvcnMgaW4gcGFsZXR0ZSIpOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBudW1iZXIgb2YgY29sb3JzIGluIHBhbGV0dGUiKTsKLSAgICAgICAgcmV0dXJuOwotICAgICB9Ci0gICB9Ci0KLSAgIGlmICghKHBuZ19wdHItPmNvbG9yX3R5cGUmUE5HX0NPTE9SX01BU0tfQ09MT1IpKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgIklnbm9yaW5nIHJlcXVlc3QgdG8gd3JpdGUgYSBQTFRFIGNodW5rIGluIGdyYXlzY2FsZSBQTkciKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX3B0ci0+bnVtX3BhbGV0dGUgPSAocG5nX3VpbnRfMTYpbnVtX3BhbDsKLSAgIHBuZ19kZWJ1ZzEoMywgIm51bV9wYWxldHRlID0gJWQiLCBwbmdfcHRyLT5udW1fcGFsZXR0ZSk7Ci0KLSAgIHBuZ193cml0ZV9jaHVua19zdGFydChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19QTFRFLAotICAgICAocG5nX3VpbnRfMzIpKG51bV9wYWwgKiAzKSk7Ci0jaWZkZWYgUE5HX1BPSU5URVJfSU5ERVhJTkdfU1VQUE9SVEVECi0gICBmb3IgKGkgPSAwLCBwYWxfcHRyID0gcGFsZXR0ZTsgaSA8IG51bV9wYWw7IGkrKywgcGFsX3B0cisrKQotICAgewotICAgICAgYnVmWzBdID0gcGFsX3B0ci0+cmVkOwotICAgICAgYnVmWzFdID0gcGFsX3B0ci0+Z3JlZW47Ci0gICAgICBidWZbMl0gPSBwYWxfcHRyLT5ibHVlOwotICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgYnVmLCAocG5nX3NpemVfdCkzKTsKLSAgIH0KLSNlbHNlCi0gICAvKiBUaGlzIGlzIGEgbGl0dGxlIHNsb3dlciBidXQgc29tZSBidWdneSBjb21waWxlcnMgbmVlZCB0byBkbyB0aGlzCi0gICAgKiBpbnN0ZWFkCi0gICAgKi8KLSAgIHBhbF9wdHI9cGFsZXR0ZTsKLSAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFsOyBpKyspCi0gICB7Ci0gICAgICBidWZbMF0gPSBwYWxfcHRyW2ldLnJlZDsKLSAgICAgIGJ1ZlsxXSA9IHBhbF9wdHJbaV0uZ3JlZW47Ci0gICAgICBidWZbMl0gPSBwYWxfcHRyW2ldLmJsdWU7Ci0gICAgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBidWYsIChwbmdfc2l6ZV90KTMpOwotICAgfQotI2VuZGlmCi0gICBwbmdfd3JpdGVfY2h1bmtfZW5kKHBuZ19wdHIpOwotICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9QTFRFOwotfQotCi0vKiBXcml0ZSBhbiBJREFUIGNodW5rICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV9JREFUKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIFBOR19JREFUOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9JREFUIik7Ci0KLSAgIC8qIE9wdGltaXplIHRoZSBDTUYgZmllbGQgaW4gdGhlIHpsaWIgc3RyZWFtLiAqLwotICAgLyogVGhpcyBoYWNrIG9mIHRoZSB6bGliIHN0cmVhbSBpcyBjb21wbGlhbnQgdG8gdGhlIHN0cmVhbSBzcGVjaWZpY2F0aW9uLiAqLwotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpICYmCi0gICAgICAgcG5nX3B0ci0+Y29tcHJlc3Npb25fdHlwZSA9PSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFKQotICAgewotICAgICAgdW5zaWduZWQgaW50IHpfY21mID0gZGF0YVswXTsgIC8qIHpsaWIgY29tcHJlc3Npb24gbWV0aG9kIGFuZCBmbGFncyAqLwotICAgICAgaWYgKCh6X2NtZiAmIDB4MGYpID09IDggJiYgKHpfY21mICYgMHhmMCkgPD0gMHg3MCkKLSAgICAgIHsKLSAgICAgICAgIC8qIEF2b2lkIG1lbW9yeSB1bmRlcmZsb3dzIGFuZCBtdWx0aXBsaWNhdGlvbiBvdmVyZmxvd3MuCi0gICAgICAgICAgKgotICAgICAgICAgICogVGhlIGNvbmRpdGlvbnMgYmVsb3cgYXJlIHByYWN0aWNhbGx5IGFsd2F5cyBzYXRpc2ZpZWQ7Ci0gICAgICAgICAgKiBob3dldmVyLCB0aGV5IHN0aWxsIG11c3QgYmUgY2hlY2tlZC4KLSAgICAgICAgICAqLwotICAgICAgICAgaWYgKGxlbmd0aCA+PSAyICYmCi0gICAgICAgICAgICAgcG5nX3B0ci0+aGVpZ2h0IDwgMTYzODQgJiYgcG5nX3B0ci0+d2lkdGggPCAxNjM4NCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCB6X2NpbmZvOwotICAgICAgICAgICAgdW5zaWduZWQgaW50IGhhbGZfel93aW5kb3dfc2l6ZTsKLQotICAgICAgICAgICAgLyogQ29tcHV0ZSB0aGUgbWF4aW11bSBwb3NzaWJsZSBsZW5ndGggb2YgdGhlIGRhdGFzdHJlYW0gKi8KLQotICAgICAgICAgICAgLyogTnVtYmVyIG9mIHBpeGVscywgcGx1cyBmb3IgZWFjaCByb3cgYSBmaWx0ZXIgYnl0ZQotICAgICAgICAgICAgICogYW5kIHBvc3NpYmx5IGEgcGFkZGluZyBieXRlLCBzbyBpbmNyZWFzZSB0aGUgbWF4aW11bQotICAgICAgICAgICAgICogc2l6ZSB0byBhY2NvdW50IGZvciB0aGVzZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgdW5jb21wcmVzc2VkX2lkYXRfc2l6ZSA9IHBuZ19wdHItPmhlaWdodCAqCi0gICAgICAgICAgICAgICAoKHBuZ19wdHItPndpZHRoICoKLSAgICAgICAgICAgICAgIHBuZ19wdHItPmNoYW5uZWxzICogcG5nX3B0ci0+Yml0X2RlcHRoICsgMTUpID4+IDMpOwotCi0gICAgICAgICAgICAvKiBJZiBpdCdzIGludGVybGFjZWQsIGVhY2ggYmxvY2sgb2YgOCByb3dzIGlzIHNlbnQgYXMgdXAgdG8KLSAgICAgICAgICAgICAqIDE0IHJvd3MsIGkuZS4sIDYgYWRkaXRpb25hbCByb3dzLCBlYWNoIHdpdGggYSBmaWx0ZXIgYnl0ZQotICAgICAgICAgICAgICogYW5kIHBvc3NpYmx5IGEgcGFkZGluZyBieXRlCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkKQotICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkX2lkYXRfc2l6ZSArPSAoKHBuZ19wdHItPmhlaWdodCArIDcpLzgpICoKLSAgICAgICAgICAgICAgICAgICAocG5nX3B0ci0+Yml0X2RlcHRoIDwgOCA/IDEyIDogNik7Ci0KLSAgICAgICAgICAgIHpfY2luZm8gPSB6X2NtZiA+PiA0OwotICAgICAgICAgICAgaGFsZl96X3dpbmRvd19zaXplID0gMSA8PCAoel9jaW5mbyArIDcpOwotICAgICAgICAgICAgd2hpbGUgKHVuY29tcHJlc3NlZF9pZGF0X3NpemUgPD0gaGFsZl96X3dpbmRvd19zaXplICYmCi0gICAgICAgICAgICAgICAgICAgaGFsZl96X3dpbmRvd19zaXplID49IDI1NikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHpfY2luZm8tLTsKLSAgICAgICAgICAgICAgIGhhbGZfel93aW5kb3dfc2l6ZSA+Pj0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHpfY21mID0gKHpfY21mICYgMHgwZikgfCAoel9jaW5mbyA8PCA0KTsKLSAgICAgICAgICAgIGlmIChkYXRhWzBdICE9IChwbmdfYnl0ZSl6X2NtZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGRhdGFbMF0gPSAocG5nX2J5dGUpel9jbWY7Ci0gICAgICAgICAgICAgICBkYXRhWzFdICY9IDB4ZTA7Ci0gICAgICAgICAgICAgICBkYXRhWzFdICs9IChwbmdfYnl0ZSkoMHgxZiAtICgoel9jbWYgPDwgOCkgKyBkYXRhWzFdKSAlIDB4MWYpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsCi0gICAgICAgICAgICAiSW52YWxpZCB6bGliIGNvbXByZXNzaW9uIG1ldGhvZCBvciBmbGFncyBpbiBJREFUIik7Ci0gICB9Ci0KLSAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19JREFULCBkYXRhLCBsZW5ndGgpOwotICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9JREFUOwotfQotCi0vKiBXcml0ZSBhbiBJRU5EIGNodW5rICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV9JRU5EKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBQTkdfSUVORDsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfSUVORCIpOwotCi0gICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfSUVORCwgTlVMTCwKLSAgICAgKHBuZ19zaXplX3QpMCk7Ci0gICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0lFTkQ7Ci19Ci0KLSNpZmRlZiBQTkdfV1JJVEVfZ0FNQV9TVVBQT1JURUQKLS8qIFdyaXRlIGEgZ0FNQSBjaHVuayAqLwotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX2dBTUEocG5nX3N0cnVjdHAgcG5nX3B0ciwgZG91YmxlIGZpbGVfZ2FtbWEpCi17Ci0gICBQTkdfZ0FNQTsKLSAgIHBuZ191aW50XzMyIGlnYW1tYTsKLSAgIHBuZ19ieXRlIGJ1Zls0XTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfZ0FNQSIpOwotCi0gICAvKiBmaWxlX2dhbW1hIGlzIHNhdmVkIGluIDEvMTAwLDAwMHRocyAqLwotICAgaWdhbW1hID0gKHBuZ191aW50XzMyKShmaWxlX2dhbW1hICogMTAwMDAwLjAgKyAwLjUpOwotICAgcG5nX3NhdmVfdWludF8zMihidWYsIGlnYW1tYSk7Ci0gICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfZ0FNQSwgYnVmLCAocG5nX3NpemVfdCk0KTsKLX0KLSNlbmRpZgotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX2dBTUFfZml4ZWQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2ZpeGVkX3BvaW50IGZpbGVfZ2FtbWEpCi17Ci0gICBQTkdfZ0FNQTsKLSAgIHBuZ19ieXRlIGJ1Zls0XTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfZ0FNQSIpOwotCi0gICAvKiBmaWxlX2dhbW1hIGlzIHNhdmVkIGluIDEvMTAwLDAwMHRocyAqLwotICAgcG5nX3NhdmVfdWludF8zMihidWYsIChwbmdfdWludF8zMilmaWxlX2dhbW1hKTsKLSAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19nQU1BLCBidWYsIChwbmdfc2l6ZV90KTQpOwotfQotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9zUkdCX1NVUFBPUlRFRAotLyogV3JpdGUgYSBzUkdCIGNodW5rICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV9zUkdCKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBzcmdiX2ludGVudCkKLXsKLSAgIFBOR19zUkdCOwotICAgcG5nX2J5dGUgYnVmWzFdOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9zUkdCIik7Ci0KLSAgIGlmIChzcmdiX2ludGVudCA+PSBQTkdfc1JHQl9JTlRFTlRfTEFTVCkKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAgICAiSW52YWxpZCBzUkdCIHJlbmRlcmluZyBpbnRlbnQgc3BlY2lmaWVkIik7Ci0gICBidWZbMF09KHBuZ19ieXRlKXNyZ2JfaW50ZW50OwotICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3NSR0IsIGJ1ZiwgKHBuZ19zaXplX3QpMSk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9pQ0NQX1NVUFBPUlRFRAotLyogV3JpdGUgYW4gaUNDUCBjaHVuayAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfaUNDUChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY2hhcnAgbmFtZSwgaW50IGNvbXByZXNzaW9uX3R5cGUsCi0gICBwbmdfY2hhcnAgcHJvZmlsZSwgaW50IHByb2ZpbGVfbGVuKQotewotICAgUE5HX2lDQ1A7Ci0gICBwbmdfc2l6ZV90IG5hbWVfbGVuOwotICAgcG5nX2NoYXJwIG5ld19uYW1lOwotICAgY29tcHJlc3Npb25fc3RhdGUgY29tcDsKLSAgIGludCBlbWJlZGRlZF9wcm9maWxlX2xlbiA9IDA7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2lDQ1AiKTsKLQotICAgY29tcC5udW1fb3V0cHV0X3B0ciA9IDA7Ci0gICBjb21wLm1heF9vdXRwdXRfcHRyID0gMDsKLSAgIGNvbXAub3V0cHV0X3B0ciA9IE5VTEw7Ci0gICBjb21wLmlucHV0ID0gTlVMTDsKLSAgIGNvbXAuaW5wdXRfbGVuID0gMDsKLQotICAgaWYgKChuYW1lX2xlbiA9IHBuZ19jaGVja19rZXl3b3JkKHBuZ19wdHIsIG5hbWUsCi0gICAgICAmbmV3X25hbWUpKSA9PSAwKQotICAgICAgcmV0dXJuOwotCi0gICBpZiAoY29tcHJlc3Npb25fdHlwZSAhPSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFKQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVua25vd24gY29tcHJlc3Npb24gdHlwZSBpbiBpQ0NQIGNodW5rIik7Ci0KLSAgIGlmIChwcm9maWxlID09IE5VTEwpCi0gICAgICBwcm9maWxlX2xlbiA9IDA7Ci0KLSAgIGlmIChwcm9maWxlX2xlbiA+IDMpCi0gICAgICBlbWJlZGRlZF9wcm9maWxlX2xlbiA9Ci0gICAgICAgICAgKCgqKCAocG5nX2J5dGVwKXByb2ZpbGUgICAgKSk8PDI0KSB8Ci0gICAgICAgICAgKCgqKCAocG5nX2J5dGVwKXByb2ZpbGUgKyAxKSk8PDE2KSB8Ci0gICAgICAgICAgKCgqKCAocG5nX2J5dGVwKXByb2ZpbGUgKyAyKSk8PCA4KSB8Ci0gICAgICAgICAgKCgqKCAocG5nX2J5dGVwKXByb2ZpbGUgKyAzKSkgICAgKTsKLQotICAgaWYgKGVtYmVkZGVkX3Byb2ZpbGVfbGVuIDwgMCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICJFbWJlZGRlZCBwcm9maWxlIGxlbmd0aCBpbiBpQ0NQIGNodW5rIGlzIG5lZ2F0aXZlIik7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBuZXdfbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIGlmIChwcm9maWxlX2xlbiA8IGVtYmVkZGVkX3Byb2ZpbGVfbGVuKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgIkVtYmVkZGVkIHByb2ZpbGUgbGVuZ3RoIHRvbyBsYXJnZSBpbiBpQ0NQIGNodW5rIik7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBuZXdfbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIGlmIChwcm9maWxlX2xlbiA+IGVtYmVkZGVkX3Byb2ZpbGVfbGVuKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgIlRydW5jYXRpbmcgcHJvZmlsZSB0byBhY3R1YWwgbGVuZ3RoIGluIGlDQ1AgY2h1bmsiKTsKLSAgICAgIHByb2ZpbGVfbGVuID0gZW1iZWRkZWRfcHJvZmlsZV9sZW47Ci0gICB9Ci0KLSAgIGlmIChwcm9maWxlX2xlbikKLSAgICAgIHByb2ZpbGVfbGVuID0gcG5nX3RleHRfY29tcHJlc3MocG5nX3B0ciwgcHJvZmlsZSwKLSAgICAgICAgKHBuZ19zaXplX3QpcHJvZmlsZV9sZW4sIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UsICZjb21wKTsKLQotICAgLyogTWFrZSBzdXJlIHdlIGluY2x1ZGUgdGhlIE5VTEwgYWZ0ZXIgdGhlIG5hbWUgYW5kIHRoZSBjb21wcmVzc2lvbiB0eXBlICovCi0gICBwbmdfd3JpdGVfY2h1bmtfc3RhcnQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfaUNDUCwKLSAgICAgICAgICAocG5nX3VpbnRfMzIpKG5hbWVfbGVuICsgcHJvZmlsZV9sZW4gKyAyKSk7Ci0gICBuZXdfbmFtZVtuYW1lX2xlbiArIDFdID0gMHgwMDsKLSAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChwbmdfYnl0ZXApbmV3X25hbWUsCi0gICAgIChwbmdfc2l6ZV90KShuYW1lX2xlbiArIDIpKTsKLQotICAgaWYgKHByb2ZpbGVfbGVuKQotICAgICAgcG5nX3dyaXRlX2NvbXByZXNzZWRfZGF0YV9vdXQocG5nX3B0ciwgJmNvbXApOwotCi0gICBwbmdfd3JpdGVfY2h1bmtfZW5kKHBuZ19wdHIpOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgbmV3X25hbWUpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfc1BMVF9TVVBQT1JURUQKLS8qIFdyaXRlIGEgc1BMVCBjaHVuayAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfc1BMVChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfc1BMVF90cCBzcGFsZXR0ZSkKLXsKLSAgIFBOR19zUExUOwotICAgcG5nX3NpemVfdCBuYW1lX2xlbjsKLSAgIHBuZ19jaGFycCBuZXdfbmFtZTsKLSAgIHBuZ19ieXRlIGVudHJ5YnVmWzEwXTsKLSAgIHBuZ19zaXplX3QgZW50cnlfc2l6ZSA9IChzcGFsZXR0ZS0+ZGVwdGggPT0gOCA/IDYgOiAxMCk7Ci0gICBwbmdfc2l6ZV90IHBhbGV0dGVfc2l6ZSA9IGVudHJ5X3NpemUgKiBzcGFsZXR0ZS0+bmVudHJpZXM7Ci0gICBwbmdfc1BMVF9lbnRyeXAgZXA7Ci0jaWZuZGVmIFBOR19QT0lOVEVSX0lOREVYSU5HX1NVUFBPUlRFRAotICAgaW50IGk7Ci0jZW5kaWYKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfc1BMVCIpOwotCi0gICBpZiAoKG5hbWVfbGVuID0gcG5nX2NoZWNrX2tleXdvcmQocG5nX3B0cixzcGFsZXR0ZS0+bmFtZSwgJm5ld19uYW1lKSk9PTApCi0gICAgICByZXR1cm47Ci0KLSAgIC8qIE1ha2Ugc3VyZSB3ZSBpbmNsdWRlIHRoZSBOVUxMIGFmdGVyIHRoZSBuYW1lICovCi0gICBwbmdfd3JpdGVfY2h1bmtfc3RhcnQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfc1BMVCwKLSAgICAgKHBuZ191aW50XzMyKShuYW1lX2xlbiArIDIgKyBwYWxldHRlX3NpemUpKTsKLSAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChwbmdfYnl0ZXApbmV3X25hbWUsCi0gICAgIChwbmdfc2l6ZV90KShuYW1lX2xlbiArIDEpKTsKLSAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChwbmdfYnl0ZXApJnNwYWxldHRlLT5kZXB0aCwgKHBuZ19zaXplX3QpMSk7Ci0KLSAgIC8qIExvb3AgdGhyb3VnaCBlYWNoIHBhbGV0dGUgZW50cnksIHdyaXRpbmcgYXBwcm9wcmlhdGVseSAqLwotI2lmZGVmIFBOR19QT0lOVEVSX0lOREVYSU5HX1NVUFBPUlRFRAotICAgZm9yIChlcCA9IHNwYWxldHRlLT5lbnRyaWVzOyBlcDxzcGFsZXR0ZS0+ZW50cmllcyArIHNwYWxldHRlLT5uZW50cmllczsgZXArKykKLSAgIHsKLSAgICAgIGlmIChzcGFsZXR0ZS0+ZGVwdGggPT0gOCkKLSAgICAgIHsKLSAgICAgICAgICBlbnRyeWJ1ZlswXSA9IChwbmdfYnl0ZSllcC0+cmVkOwotICAgICAgICAgIGVudHJ5YnVmWzFdID0gKHBuZ19ieXRlKWVwLT5ncmVlbjsKLSAgICAgICAgICBlbnRyeWJ1ZlsyXSA9IChwbmdfYnl0ZSllcC0+Ymx1ZTsKLSAgICAgICAgICBlbnRyeWJ1ZlszXSA9IChwbmdfYnl0ZSllcC0+YWxwaGE7Ci0gICAgICAgICAgcG5nX3NhdmVfdWludF8xNihlbnRyeWJ1ZiArIDQsIGVwLT5mcmVxdWVuY3kpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyAwLCBlcC0+cmVkKTsKLSAgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgMiwgZXAtPmdyZWVuKTsKLSAgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgNCwgZXAtPmJsdWUpOwotICAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyA2LCBlcC0+YWxwaGEpOwotICAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyA4LCBlcC0+ZnJlcXVlbmN5KTsKLSAgICAgIH0KLSAgICAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIGVudHJ5YnVmLCAocG5nX3NpemVfdCllbnRyeV9zaXplKTsKLSAgIH0KLSNlbHNlCi0gICBlcD1zcGFsZXR0ZS0+ZW50cmllczsKLSAgIGZvciAoaT0wOyBpPnNwYWxldHRlLT5uZW50cmllczsgaSsrKQotICAgewotICAgICAgaWYgKHNwYWxldHRlLT5kZXB0aCA9PSA4KQotICAgICAgewotICAgICAgICAgIGVudHJ5YnVmWzBdID0gKHBuZ19ieXRlKWVwW2ldLnJlZDsKLSAgICAgICAgICBlbnRyeWJ1ZlsxXSA9IChwbmdfYnl0ZSllcFtpXS5ncmVlbjsKLSAgICAgICAgICBlbnRyeWJ1ZlsyXSA9IChwbmdfYnl0ZSllcFtpXS5ibHVlOwotICAgICAgICAgIGVudHJ5YnVmWzNdID0gKHBuZ19ieXRlKWVwW2ldLmFscGhhOwotICAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyA0LCBlcFtpXS5mcmVxdWVuY3kpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyAwLCBlcFtpXS5yZWQpOwotICAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyAyLCBlcFtpXS5ncmVlbik7Ci0gICAgICAgICAgcG5nX3NhdmVfdWludF8xNihlbnRyeWJ1ZiArIDQsIGVwW2ldLmJsdWUpOwotICAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyA2LCBlcFtpXS5hbHBoYSk7Ci0gICAgICAgICAgcG5nX3NhdmVfdWludF8xNihlbnRyeWJ1ZiArIDgsIGVwW2ldLmZyZXF1ZW5jeSk7Ci0gICAgICB9Ci0gICAgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBlbnRyeWJ1ZiwgKHBuZ19zaXplX3QpZW50cnlfc2l6ZSk7Ci0gICB9Ci0jZW5kaWYKLQotICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIG5ld19uYW1lKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX3NCSVRfU1VQUE9SVEVECi0vKiBXcml0ZSB0aGUgc0JJVCBjaHVuayAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfc0JJVChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29sb3JfOHAgc2JpdCwgaW50IGNvbG9yX3R5cGUpCi17Ci0gICBQTkdfc0JJVDsKLSAgIHBuZ19ieXRlIGJ1Zls0XTsKLSAgIHBuZ19zaXplX3Qgc2l6ZTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfc0JJVCIpOwotCi0gICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgZGVwZW5kIHVwb24gdGhlIG9yZGVyIG9mIFBOR19DT0xPUl84ICovCi0gICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQotICAgewotICAgICAgcG5nX2J5dGUgbWF4Yml0czsKLQotICAgICAgbWF4Yml0cyA9IChwbmdfYnl0ZSkoY29sb3JfdHlwZT09UE5HX0NPTE9SX1RZUEVfUEFMRVRURSA/IDggOgotICAgICAgICAgICAgICAgIHBuZ19wdHItPnVzcl9iaXRfZGVwdGgpOwotICAgICAgaWYgKHNiaXQtPnJlZCA9PSAwIHx8IHNiaXQtPnJlZCA+IG1heGJpdHMgfHwKLSAgICAgICAgICBzYml0LT5ncmVlbiA9PSAwIHx8IHNiaXQtPmdyZWVuID4gbWF4Yml0cyB8fAotICAgICAgICAgIHNiaXQtPmJsdWUgPT0gMCB8fCBzYml0LT5ibHVlID4gbWF4Yml0cykKLSAgICAgIHsKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHNCSVQgZGVwdGggc3BlY2lmaWVkIik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBidWZbMF0gPSBzYml0LT5yZWQ7Ci0gICAgICBidWZbMV0gPSBzYml0LT5ncmVlbjsKLSAgICAgIGJ1ZlsyXSA9IHNiaXQtPmJsdWU7Ci0gICAgICBzaXplID0gMzsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGlmIChzYml0LT5ncmF5ID09IDAgfHwgc2JpdC0+Z3JheSA+IHBuZ19wdHItPnVzcl9iaXRfZGVwdGgpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBzQklUIGRlcHRoIHNwZWNpZmllZCIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgYnVmWzBdID0gc2JpdC0+Z3JheTsKLSAgICAgIHNpemUgPSAxOwotICAgfQotCi0gICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQotICAgewotICAgICAgaWYgKHNiaXQtPmFscGhhID09IDAgfHwgc2JpdC0+YWxwaGEgPiBwbmdfcHRyLT51c3JfYml0X2RlcHRoKQotICAgICAgewotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgc0JJVCBkZXB0aCBzcGVjaWZpZWQiKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGJ1ZltzaXplKytdID0gc2JpdC0+YWxwaGE7Ci0gICB9Ci0KLSAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19zQklULCBidWYsIHNpemUpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfY0hSTV9TVVBQT1JURUQKLS8qIFdyaXRlIHRoZSBjSFJNIGNodW5rICovCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfY0hSTShwbmdfc3RydWN0cCBwbmdfcHRyLCBkb3VibGUgd2hpdGVfeCwgZG91YmxlIHdoaXRlX3ksCi0gICBkb3VibGUgcmVkX3gsIGRvdWJsZSByZWRfeSwgZG91YmxlIGdyZWVuX3gsIGRvdWJsZSBncmVlbl95LAotICAgZG91YmxlIGJsdWVfeCwgZG91YmxlIGJsdWVfeSkKLXsKLSAgIFBOR19jSFJNOwotICAgcG5nX2J5dGUgYnVmWzMyXTsKLQotICAgcG5nX2ZpeGVkX3BvaW50IGludF93aGl0ZV94LCBpbnRfd2hpdGVfeSwgaW50X3JlZF94LCBpbnRfcmVkX3ksCi0gICAgICBpbnRfZ3JlZW5feCwgaW50X2dyZWVuX3ksIGludF9ibHVlX3gsIGludF9ibHVlX3k7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2NIUk0iKTsKLQotICAgaW50X3doaXRlX3ggPSAocG5nX3VpbnRfMzIpKHdoaXRlX3ggKiAxMDAwMDAuMCArIDAuNSk7Ci0gICBpbnRfd2hpdGVfeSA9IChwbmdfdWludF8zMikod2hpdGVfeSAqIDEwMDAwMC4wICsgMC41KTsKLSAgIGludF9yZWRfeCAgID0gKHBuZ191aW50XzMyKShyZWRfeCAgICogMTAwMDAwLjAgKyAwLjUpOwotICAgaW50X3JlZF95ICAgPSAocG5nX3VpbnRfMzIpKHJlZF95ICAgKiAxMDAwMDAuMCArIDAuNSk7Ci0gICBpbnRfZ3JlZW5feCA9IChwbmdfdWludF8zMikoZ3JlZW5feCAqIDEwMDAwMC4wICsgMC41KTsKLSAgIGludF9ncmVlbl95ID0gKHBuZ191aW50XzMyKShncmVlbl95ICogMTAwMDAwLjAgKyAwLjUpOwotICAgaW50X2JsdWVfeCAgPSAocG5nX3VpbnRfMzIpKGJsdWVfeCAgKiAxMDAwMDAuMCArIDAuNSk7Ci0gICBpbnRfYmx1ZV95ICA9IChwbmdfdWludF8zMikoYmx1ZV95ICAqIDEwMDAwMC4wICsgMC41KTsKLQotI2lmZGVmIFBOR19DSEVDS19jSFJNX1NVUFBPUlRFRAotICAgaWYgKHBuZ19jaGVja19jSFJNX2ZpeGVkKHBuZ19wdHIsIGludF93aGl0ZV94LCBpbnRfd2hpdGVfeSwKLSAgICAgIGludF9yZWRfeCwgaW50X3JlZF95LCBpbnRfZ3JlZW5feCwgaW50X2dyZWVuX3ksIGludF9ibHVlX3gsIGludF9ibHVlX3kpKQotI2VuZGlmCi0gICB7Ci0gICAgICAvKiBFYWNoIHZhbHVlIGlzIHNhdmVkIGluIDEvMTAwLDAwMHRocyAqLwotCi0gICAgICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiwgaW50X3doaXRlX3gpOwotICAgICAgcG5nX3NhdmVfdWludF8zMihidWYgKyA0LCBpbnRfd2hpdGVfeSk7Ci0KLSAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgOCwgaW50X3JlZF94KTsKLSAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgMTIsIGludF9yZWRfeSk7Ci0KLSAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgMTYsIGludF9ncmVlbl94KTsKLSAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgMjAsIGludF9ncmVlbl95KTsKLQotICAgICAgcG5nX3NhdmVfdWludF8zMihidWYgKyAyNCwgaW50X2JsdWVfeCk7Ci0gICAgICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiArIDI4LCBpbnRfYmx1ZV95KTsKLQotICAgICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX2NIUk0sIGJ1ZiwgKHBuZ19zaXplX3QpMzIpOwotICAgfQotfQotI2VuZGlmCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfY0hSTV9maXhlZChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfZml4ZWRfcG9pbnQgd2hpdGVfeCwKLSAgIHBuZ19maXhlZF9wb2ludCB3aGl0ZV95LCBwbmdfZml4ZWRfcG9pbnQgcmVkX3gsIHBuZ19maXhlZF9wb2ludCByZWRfeSwKLSAgIHBuZ19maXhlZF9wb2ludCBncmVlbl94LCBwbmdfZml4ZWRfcG9pbnQgZ3JlZW5feSwgcG5nX2ZpeGVkX3BvaW50IGJsdWVfeCwKLSAgIHBuZ19maXhlZF9wb2ludCBibHVlX3kpCi17Ci0gICBQTkdfY0hSTTsKLSAgIHBuZ19ieXRlIGJ1ZlszMl07Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2NIUk0iKTsKLQotICAgLyogRWFjaCB2YWx1ZSBpcyBzYXZlZCBpbiAxLzEwMCwwMDB0aHMgKi8KLSNpZmRlZiBQTkdfQ0hFQ0tfY0hSTV9TVVBQT1JURUQKLSAgIGlmIChwbmdfY2hlY2tfY0hSTV9maXhlZChwbmdfcHRyLCB3aGl0ZV94LCB3aGl0ZV95LCByZWRfeCwgcmVkX3ksCi0gICAgICBncmVlbl94LCBncmVlbl95LCBibHVlX3gsIGJsdWVfeSkpCi0jZW5kaWYKLSAgIHsKLSAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmLCAocG5nX3VpbnRfMzIpd2hpdGVfeCk7Ci0gICAgICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiArIDQsIChwbmdfdWludF8zMil3aGl0ZV95KTsKLQotICAgICAgcG5nX3NhdmVfdWludF8zMihidWYgKyA4LCAocG5nX3VpbnRfMzIpcmVkX3gpOwotICAgICAgcG5nX3NhdmVfdWludF8zMihidWYgKyAxMiwgKHBuZ191aW50XzMyKXJlZF95KTsKLQotICAgICAgcG5nX3NhdmVfdWludF8zMihidWYgKyAxNiwgKHBuZ191aW50XzMyKWdyZWVuX3gpOwotICAgICAgcG5nX3NhdmVfdWludF8zMihidWYgKyAyMCwgKHBuZ191aW50XzMyKWdyZWVuX3kpOwotCi0gICAgICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiArIDI0LCAocG5nX3VpbnRfMzIpYmx1ZV94KTsKLSAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgMjgsIChwbmdfdWludF8zMilibHVlX3kpOwotCi0gICAgICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfY0hSTSwgYnVmLCAocG5nX3NpemVfdCkzMik7Ci0gICB9Ci19Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX3RSTlNfU1VQUE9SVEVECi0vKiBXcml0ZSB0aGUgdFJOUyBjaHVuayAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfdFJOUyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgdHJhbnNfYWxwaGEsIHBuZ19jb2xvcl8xNnAgdHJhbiwKLSAgIGludCBudW1fdHJhbnMsIGludCBjb2xvcl90eXBlKQotewotICAgUE5HX3RSTlM7Ci0gICBwbmdfYnl0ZSBidWZbNl07Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3RSTlMiKTsKLQotICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgIHsKLSAgICAgIGlmIChudW1fdHJhbnMgPD0gMCB8fCBudW1fdHJhbnMgPiAoaW50KXBuZ19wdHItPm51bV9wYWxldHRlKQotICAgICAgewotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgbnVtYmVyIG9mIHRyYW5zcGFyZW50IGNvbG9ycyBzcGVjaWZpZWQiKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIC8qIFdyaXRlIHRoZSBjaHVuayBvdXQgYXMgaXQgaXMgKi8KLSAgICAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ190Uk5TLCB0cmFuc19hbHBoYSwKLSAgICAgICAgKHBuZ19zaXplX3QpbnVtX3RyYW5zKTsKLSAgIH0KLSAgIGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKLSAgIHsKLSAgICAgIC8qIE9uZSAxNiBiaXQgdmFsdWUgKi8KLSAgICAgIGlmICh0cmFuLT5ncmF5ID49ICgxIDw8IHBuZ19wdHItPmJpdF9kZXB0aCkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAiSWdub3JpbmcgYXR0ZW1wdCB0byB3cml0ZSB0Uk5TIGNodW5rIG91dC1vZi1yYW5nZSBmb3IgYml0X2RlcHRoIik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiwgdHJhbi0+Z3JheSk7Ci0gICAgICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfdFJOUywgYnVmLCAocG5nX3NpemVfdCkyKTsKLSAgIH0KLSAgIGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgewotICAgICAgLyogVGhyZWUgMTYgYml0IHZhbHVlcyAqLwotICAgICAgcG5nX3NhdmVfdWludF8xNihidWYsIHRyYW4tPnJlZCk7Ci0gICAgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiArIDIsIHRyYW4tPmdyZWVuKTsKLSAgICAgIHBuZ19zYXZlX3VpbnRfMTYoYnVmICsgNCwgdHJhbi0+Ymx1ZSk7Ci0gICAgICBpZiAocG5nX3B0ci0+Yml0X2RlcHRoID09IDggJiYgKGJ1ZlswXSB8IGJ1ZlsyXSB8IGJ1Zls0XSkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAiSWdub3JpbmcgYXR0ZW1wdCB0byB3cml0ZSAxNi1iaXQgdFJOUyBjaHVuayB3aGVuIGJpdF9kZXB0aCBpcyA4Iik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfdFJOUywgYnVmLCAocG5nX3NpemVfdCk2KTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJDYW4ndCB3cml0ZSB0Uk5TIHdpdGggYW4gYWxwaGEgY2hhbm5lbCIpOwotICAgfQotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfYktHRF9TVVBQT1JURUQKLS8qIFdyaXRlIHRoZSBiYWNrZ3JvdW5kIGNodW5rICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV9iS0dEKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb2xvcl8xNnAgYmFjaywgaW50IGNvbG9yX3R5cGUpCi17Ci0gICBQTkdfYktHRDsKLSAgIHBuZ19ieXRlIGJ1Zls2XTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfYktHRCIpOwotCi0gICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgewotICAgICAgaWYgKAotI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECi0gICAgICAgICAgKHBuZ19wdHItPm51bV9wYWxldHRlIHx8Ci0gICAgICAgICAgKCEocG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCAmIFBOR19GTEFHX01OR19FTVBUWV9QTFRFKSkpICYmCi0jZW5kaWYKLSAgICAgICAgIGJhY2stPmluZGV4ID49IHBuZ19wdHItPm51bV9wYWxldHRlKQotICAgICAgewotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgYmFja2dyb3VuZCBwYWxldHRlIGluZGV4Iik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBidWZbMF0gPSBiYWNrLT5pbmRleDsKLSAgICAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19iS0dELCBidWYsIChwbmdfc2l6ZV90KTEpOwotICAgfQotICAgZWxzZSBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQotICAgewotICAgICAgcG5nX3NhdmVfdWludF8xNihidWYsIGJhY2stPnJlZCk7Ci0gICAgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiArIDIsIGJhY2stPmdyZWVuKTsKLSAgICAgIHBuZ19zYXZlX3VpbnRfMTYoYnVmICsgNCwgYmFjay0+Ymx1ZSk7Ci0gICAgICBpZiAocG5nX3B0ci0+Yml0X2RlcHRoID09IDggJiYgKGJ1ZlswXSB8IGJ1ZlsyXSB8IGJ1Zls0XSkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAiSWdub3JpbmcgYXR0ZW1wdCB0byB3cml0ZSAxNi1iaXQgYktHRCBjaHVuayB3aGVuIGJpdF9kZXB0aCBpcyA4Iik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfYktHRCwgYnVmLCAocG5nX3NpemVfdCk2KTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGlmIChiYWNrLT5ncmF5ID49ICgxIDw8IHBuZ19wdHItPmJpdF9kZXB0aCkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAiSWdub3JpbmcgYXR0ZW1wdCB0byB3cml0ZSBiS0dEIGNodW5rIG91dC1vZi1yYW5nZSBmb3IgYml0X2RlcHRoIik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiwgYmFjay0+Z3JheSk7Ci0gICAgICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfYktHRCwgYnVmLCAocG5nX3NpemVfdCkyKTsKLSAgIH0KLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX2hJU1RfU1VQUE9SVEVECi0vKiBXcml0ZSB0aGUgaGlzdG9ncmFtICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV9oSVNUKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzE2cCBoaXN0LCBpbnQgbnVtX2hpc3QpCi17Ci0gICBQTkdfaElTVDsKLSAgIGludCBpOwotICAgcG5nX2J5dGUgYnVmWzNdOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9oSVNUIik7Ci0KLSAgIGlmIChudW1faGlzdCA+IChpbnQpcG5nX3B0ci0+bnVtX3BhbGV0dGUpCi0gICB7Ci0gICAgICBwbmdfZGVidWcyKDMsICJudW1faGlzdCA9ICVkLCBudW1fcGFsZXR0ZSA9ICVkIiwgbnVtX2hpc3QsCi0gICAgICAgICBwbmdfcHRyLT5udW1fcGFsZXR0ZSk7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBudW1iZXIgb2YgaGlzdG9ncmFtIGVudHJpZXMgc3BlY2lmaWVkIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIHBuZ193cml0ZV9jaHVua19zdGFydChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19oSVNULAotICAgICAocG5nX3VpbnRfMzIpKG51bV9oaXN0ICogMikpOwotICAgZm9yIChpID0gMDsgaSA8IG51bV9oaXN0OyBpKyspCi0gICB7Ci0gICAgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiwgaGlzdFtpXSk7Ci0gICAgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBidWYsIChwbmdfc2l6ZV90KTIpOwotICAgfQotICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfVEVYVF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX3BDQUxfU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfV1JJVEVfaUNDUF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX3NQTFRfU1VQUE9SVEVEKQotLyogQ2hlY2sgdGhhdCB0aGUgdEVYdCBvciB6VFh0IGtleXdvcmQgaXMgdmFsaWQgcGVyIFBORyAxLjAgc3BlY2lmaWNhdGlvbiwKLSAqIGFuZCBpZiBpbnZhbGlkLCBjb3JyZWN0IHRoZSBrZXl3b3JkIHJhdGhlciB0aGFuIGRpc2NhcmRpbmcgdGhlIGVudGlyZQotICogY2h1bmsuICBUaGUgUE5HIDEuMCBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIGtleXdvcmRzIDEtNzkgY2hhcmFjdGVycyBpbgotICogbGVuZ3RoLCBmb3JiaWRzIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSwgbXVsdGlwbGUgaW50ZXJuYWwgc3BhY2VzLAotICogYW5kIHRoZSBub24tYnJlYWsgc3BhY2UgKDB4ODApIGZyb20gSVNPIDg4NTktMS4gIFJldHVybnMga2V5d29yZCBsZW5ndGguCi0gKgotICogVGhlIG5ld19rZXkgaXMgYWxsb2NhdGVkIHRvIGhvbGQgdGhlIGNvcnJlY3RlZCBrZXl3b3JkIGFuZCBtdXN0IGJlIGZyZWVkCi0gKiBieSB0aGUgY2FsbGluZyByb3V0aW5lLiAgVGhpcyBhdm9pZHMgcHJvYmxlbXMgd2l0aCB0cnlpbmcgdG8gd3JpdGUgdG8KLSAqIHN0YXRpYyBrZXl3b3JkcyB3aXRob3V0IGhhdmluZyB0byBoYXZlIGR1cGxpY2F0ZSBjb3BpZXMgb2YgdGhlIHN0cmluZ3MuCi0gKi8KLXBuZ19zaXplX3QgLyogUFJJVkFURSAqLwotcG5nX2NoZWNrX2tleXdvcmQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NoYXJwIGtleSwgcG5nX2NoYXJwcCBuZXdfa2V5KQotewotICAgcG5nX3NpemVfdCBrZXlfbGVuOwotICAgcG5nX2NoYXJwIGtwLCBkcDsKLSAgIGludCBrZmxhZzsKLSAgIGludCBrd2Fybj0wOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19jaGVja19rZXl3b3JkIik7Ci0KLSAgICpuZXdfa2V5ID0gTlVMTDsKLQotICAgaWYgKGtleSA9PSBOVUxMIHx8IChrZXlfbGVuID0gcG5nX3N0cmxlbihrZXkpKSA9PSAwKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgInplcm8gbGVuZ3RoIGtleXdvcmQiKTsKLSAgICAgIHJldHVybiAoKHBuZ19zaXplX3QpMCk7Ci0gICB9Ci0KLSAgIHBuZ19kZWJ1ZzEoMiwgIktleXdvcmQgdG8gYmUgY2hlY2tlZCBpcyAnJXMnIiwga2V5KTsKLQotICAgKm5ld19rZXkgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCAocG5nX3VpbnRfMzIpKGtleV9sZW4gKyAyKSk7Ci0gICBpZiAoKm5ld19rZXkgPT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJPdXQgb2YgbWVtb3J5IHdoaWxlIHByb2Nlc2luZyBrZXl3b3JkIik7Ci0gICAgICByZXR1cm4gKChwbmdfc2l6ZV90KTApOwotICAgfQotCi0gICAvKiBSZXBsYWNlIG5vbi1wcmludGluZyBjaGFyYWN0ZXJzIHdpdGggYSBibGFuayBhbmQgcHJpbnQgYSB3YXJuaW5nICovCi0gICBmb3IgKGtwID0ga2V5LCBkcCA9ICpuZXdfa2V5OyAqa3AgIT0gJ1wwJzsga3ArKywgZHArKykKLSAgIHsKLSAgICAgIGlmICgocG5nX2J5dGUpKmtwIDwgMHgyMCB8fAotICAgICAgICAgKChwbmdfYnl0ZSkqa3AgPiAweDdFICYmIChwbmdfYnl0ZSkqa3AgPCAweEExKSkKLSAgICAgIHsKLSNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECi0gICAgICAgICBjaGFyIG1zZ1s0MF07Ci0KLSAgICAgICAgIHBuZ19zbnByaW50Zihtc2csIDQwLAotICAgICAgICAgICAiaW52YWxpZCBrZXl3b3JkIGNoYXJhY3RlciAweCUwMlgiLCAocG5nX2J5dGUpKmtwKTsKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIG1zZyk7Ci0jZWxzZQotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgImludmFsaWQgY2hhcmFjdGVyIGluIGtleXdvcmQiKTsKLSNlbmRpZgotICAgICAgICAgKmRwID0gJyAnOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgKmRwID0gKmtwOwotICAgICAgfQotICAgfQotICAgKmRwID0gJ1wwJzsKLQotICAgLyogUmVtb3ZlIGFueSB0cmFpbGluZyB3aGl0ZSBzcGFjZS4gKi8KLSAgIGtwID0gKm5ld19rZXkgKyBrZXlfbGVuIC0gMTsKLSAgIGlmICgqa3AgPT0gJyAnKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgInRyYWlsaW5nIHNwYWNlcyByZW1vdmVkIGZyb20ga2V5d29yZCIpOwotCi0gICAgICB3aGlsZSAoKmtwID09ICcgJykKLSAgICAgIHsKLSAgICAgICAgICooa3AtLSkgPSAnXDAnOwotICAgICAgICAga2V5X2xlbi0tOwotICAgICAgfQotICAgfQotCi0gICAvKiBSZW1vdmUgYW55IGxlYWRpbmcgd2hpdGUgc3BhY2UuICovCi0gICBrcCA9ICpuZXdfa2V5OwotICAgaWYgKCprcCA9PSAnICcpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAibGVhZGluZyBzcGFjZXMgcmVtb3ZlZCBmcm9tIGtleXdvcmQiKTsKLQotICAgICAgd2hpbGUgKCprcCA9PSAnICcpCi0gICAgICB7Ci0gICAgICAgICBrcCsrOwotICAgICAgICAga2V5X2xlbi0tOwotICAgICAgfQotICAgfQotCi0gICBwbmdfZGVidWcxKDIsICJDaGVja2luZyBmb3IgbXVsdGlwbGUgaW50ZXJuYWwgc3BhY2VzIGluICclcyciLCBrcCk7Ci0KLSAgIC8qIFJlbW92ZSBtdWx0aXBsZSBpbnRlcm5hbCBzcGFjZXMuICovCi0gICBmb3IgKGtmbGFnID0gMCwgZHAgPSAqbmV3X2tleTsgKmtwICE9ICdcMCc7IGtwKyspCi0gICB7Ci0gICAgICBpZiAoKmtwID09ICcgJyAmJiBrZmxhZyA9PSAwKQotICAgICAgewotICAgICAgICAgKihkcCsrKSA9ICprcDsKLSAgICAgICAgIGtmbGFnID0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCprcCA9PSAnICcpCi0gICAgICB7Ci0gICAgICAgICBrZXlfbGVuLS07Ci0gICAgICAgICBrd2Fybj0xOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgKihkcCsrKSA9ICprcDsKLSAgICAgICAgIGtmbGFnID0gMDsKLSAgICAgIH0KLSAgIH0KLSAgICpkcCA9ICdcMCc7Ci0gICBpZiAoa3dhcm4pCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiZXh0cmEgaW50ZXJpb3Igc3BhY2VzIHJlbW92ZWQgZnJvbSBrZXl3b3JkIik7Ci0KLSAgIGlmIChrZXlfbGVuID09IDApCi0gICB7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCAqbmV3X2tleSk7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiWmVybyBsZW5ndGgga2V5d29yZCIpOwotICAgfQotCi0gICBpZiAoa2V5X2xlbiA+IDc5KQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgImtleXdvcmQgbGVuZ3RoIG11c3QgYmUgMSAtIDc5IGNoYXJhY3RlcnMiKTsKLSAgICAgICgqbmV3X2tleSlbNzldID0gJ1wwJzsKLSAgICAgIGtleV9sZW4gPSA3OTsKLSAgIH0KLQotICAgcmV0dXJuIChrZXlfbGVuKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX3RFWHRfU1VQUE9SVEVECi0vKiBXcml0ZSBhIHRFWHQgY2h1bmsgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX3RFWHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NoYXJwIGtleSwgcG5nX2NoYXJwIHRleHQsCi0gICBwbmdfc2l6ZV90IHRleHRfbGVuKQotewotICAgUE5HX3RFWHQ7Ci0gICBwbmdfc2l6ZV90IGtleV9sZW47Ci0gICBwbmdfY2hhcnAgbmV3X2tleTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfdEVYdCIpOwotCi0gICBpZiAoKGtleV9sZW4gPSBwbmdfY2hlY2tfa2V5d29yZChwbmdfcHRyLCBrZXksICZuZXdfa2V5KSk9PTApCi0gICAgICByZXR1cm47Ci0KLSAgIGlmICh0ZXh0ID09IE5VTEwgfHwgKnRleHQgPT0gJ1wwJykKLSAgICAgIHRleHRfbGVuID0gMDsKLSAgIGVsc2UKLSAgICAgIHRleHRfbGVuID0gcG5nX3N0cmxlbih0ZXh0KTsKLQotICAgLyogTWFrZSBzdXJlIHdlIGluY2x1ZGUgdGhlIDAgYWZ0ZXIgdGhlIGtleSAqLwotICAgcG5nX3dyaXRlX2NodW5rX3N0YXJ0KHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3RFWHQsCi0gICAgICAocG5nX3VpbnRfMzIpKGtleV9sZW4gKyB0ZXh0X2xlbiArIDEpKTsKLSAgIC8qCi0gICAgKiBXZSBsZWF2ZSBpdCB0byB0aGUgYXBwbGljYXRpb24gdG8gbWVldCBQTkctMS4wIHJlcXVpcmVtZW50cyBvbiB0aGUKLSAgICAqIGNvbnRlbnRzIG9mIHRoZSB0ZXh0LiAgUE5HLTEuMCB0aHJvdWdoIFBORy0xLjIgZGlzY291cmFnZSB0aGUgdXNlIG9mCi0gICAgKiBhbnkgbm9uLUxhdGluLTEgY2hhcmFjdGVycyBleGNlcHQgZm9yIE5FV0xJTkUuICBJU08gUE5HIHdpbGwgZm9yYmlkIHRoZW0uCi0gICAgKiBUaGUgTlVMIGNoYXJhY3RlciBpcyBmb3JiaWRkZW4gYnkgUE5HLTEuMCB0aHJvdWdoIFBORy0xLjIgYW5kIElTTyBQTkcuCi0gICAgKi8KLSAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChwbmdfYnl0ZXApbmV3X2tleSwKLSAgICAgKHBuZ19zaXplX3QpKGtleV9sZW4gKyAxKSk7Ci0gICBpZiAodGV4dF9sZW4pCi0gICAgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKXRleHQsIChwbmdfc2l6ZV90KXRleHRfbGVuKTsKLQotICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIG5ld19rZXkpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfelRYdF9TVVBQT1JURUQKLS8qIFdyaXRlIGEgY29tcHJlc3NlZCB0ZXh0IGNodW5rICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV96VFh0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jaGFycCBrZXksIHBuZ19jaGFycCB0ZXh0LAotICAgcG5nX3NpemVfdCB0ZXh0X2xlbiwgaW50IGNvbXByZXNzaW9uKQotewotICAgUE5HX3pUWHQ7Ci0gICBwbmdfc2l6ZV90IGtleV9sZW47Ci0gICBjaGFyIGJ1ZlsxXTsKLSAgIHBuZ19jaGFycCBuZXdfa2V5OwotICAgY29tcHJlc3Npb25fc3RhdGUgY29tcDsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfelRYdCIpOwotCi0gICBjb21wLm51bV9vdXRwdXRfcHRyID0gMDsKLSAgIGNvbXAubWF4X291dHB1dF9wdHIgPSAwOwotICAgY29tcC5vdXRwdXRfcHRyID0gTlVMTDsKLSAgIGNvbXAuaW5wdXQgPSBOVUxMOwotICAgY29tcC5pbnB1dF9sZW4gPSAwOwotCi0gICBpZiAoKGtleV9sZW4gPSBwbmdfY2hlY2tfa2V5d29yZChwbmdfcHRyLCBrZXksICZuZXdfa2V5KSk9PTApCi0gICB7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBuZXdfa2V5KTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgaWYgKHRleHQgPT0gTlVMTCB8fCAqdGV4dCA9PSAnXDAnIHx8IGNvbXByZXNzaW9uPT1QTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FKQotICAgewotICAgICAgcG5nX3dyaXRlX3RFWHQocG5nX3B0ciwgbmV3X2tleSwgdGV4dCwgKHBuZ19zaXplX3QpMCk7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBuZXdfa2V5KTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgdGV4dF9sZW4gPSBwbmdfc3RybGVuKHRleHQpOwotCi0gICAvKiBDb21wdXRlIHRoZSBjb21wcmVzc2VkIGRhdGE7IGRvIGl0IG5vdyBmb3IgdGhlIGxlbmd0aCAqLwotICAgdGV4dF9sZW4gPSBwbmdfdGV4dF9jb21wcmVzcyhwbmdfcHRyLCB0ZXh0LCB0ZXh0X2xlbiwgY29tcHJlc3Npb24sCi0gICAgICAgJmNvbXApOwotCi0gICAvKiBXcml0ZSBzdGFydCBvZiBjaHVuayAqLwotICAgcG5nX3dyaXRlX2NodW5rX3N0YXJ0KHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3pUWHQsCi0gICAgIChwbmdfdWludF8zMikoa2V5X2xlbit0ZXh0X2xlbiArIDIpKTsKLSAgIC8qIFdyaXRlIGtleSAqLwotICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgKHBuZ19ieXRlcCluZXdfa2V5LAotICAgICAocG5nX3NpemVfdCkoa2V5X2xlbiArIDEpKTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIG5ld19rZXkpOwotCi0gICBidWZbMF0gPSAocG5nX2J5dGUpY29tcHJlc3Npb247Ci0gICAvKiBXcml0ZSBjb21wcmVzc2lvbiAqLwotICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgKHBuZ19ieXRlcClidWYsIChwbmdfc2l6ZV90KTEpOwotICAgLyogV3JpdGUgdGhlIGNvbXByZXNzZWQgZGF0YSAqLwotICAgcG5nX3dyaXRlX2NvbXByZXNzZWRfZGF0YV9vdXQocG5nX3B0ciwgJmNvbXApOwotCi0gICAvKiBDbG9zZSB0aGUgY2h1bmsgKi8KLSAgIHBuZ193cml0ZV9jaHVua19lbmQocG5nX3B0cik7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9pVFh0X1NVUFBPUlRFRAotLyogV3JpdGUgYW4gaVRYdCBjaHVuayAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfaVRYdChwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgY29tcHJlc3Npb24sIHBuZ19jaGFycCBrZXksCi0gICAgcG5nX2NoYXJwIGxhbmcsIHBuZ19jaGFycCBsYW5nX2tleSwgcG5nX2NoYXJwIHRleHQpCi17Ci0gICBQTkdfaVRYdDsKLSAgIHBuZ19zaXplX3QgbGFuZ19sZW4sIGtleV9sZW4sIGxhbmdfa2V5X2xlbiwgdGV4dF9sZW47Ci0gICBwbmdfY2hhcnAgbmV3X2xhbmc7Ci0gICBwbmdfY2hhcnAgbmV3X2tleSA9IE5VTEw7Ci0gICBwbmdfYnl0ZSBjYnVmWzJdOwotICAgY29tcHJlc3Npb25fc3RhdGUgY29tcDsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfaVRYdCIpOwotCi0gICBjb21wLm51bV9vdXRwdXRfcHRyID0gMDsKLSAgIGNvbXAubWF4X291dHB1dF9wdHIgPSAwOwotICAgY29tcC5vdXRwdXRfcHRyID0gTlVMTDsKLSAgIGNvbXAuaW5wdXQgPSBOVUxMOwotCi0gICBpZiAoKGtleV9sZW4gPSBwbmdfY2hlY2tfa2V5d29yZChwbmdfcHRyLCBrZXksICZuZXdfa2V5KSk9PTApCi0gICAgICByZXR1cm47Ci0KLSAgIGlmICgobGFuZ19sZW4gPSBwbmdfY2hlY2tfa2V5d29yZChwbmdfcHRyLCBsYW5nLCAmbmV3X2xhbmcpKT09MCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJFbXB0eSBsYW5ndWFnZSBmaWVsZCBpbiBpVFh0IGNodW5rIik7Ci0gICAgICBuZXdfbGFuZyA9IE5VTEw7Ci0gICAgICBsYW5nX2xlbiA9IDA7Ci0gICB9Ci0KLSAgIGlmIChsYW5nX2tleSA9PSBOVUxMKQotICAgICAgbGFuZ19rZXlfbGVuID0gMDsKLSAgIGVsc2UKLSAgICAgIGxhbmdfa2V5X2xlbiA9IHBuZ19zdHJsZW4obGFuZ19rZXkpOwotCi0gICBpZiAodGV4dCA9PSBOVUxMKQotICAgICAgdGV4dF9sZW4gPSAwOwotICAgZWxzZQotICAgICAgdGV4dF9sZW4gPSBwbmdfc3RybGVuKHRleHQpOwotCi0gICAvKiBDb21wdXRlIHRoZSBjb21wcmVzc2VkIGRhdGE7IGRvIGl0IG5vdyBmb3IgdGhlIGxlbmd0aCAqLwotICAgdGV4dF9sZW4gPSBwbmdfdGV4dF9jb21wcmVzcyhwbmdfcHRyLCB0ZXh0LCB0ZXh0X2xlbiwgY29tcHJlc3Npb24tMiwKLSAgICAgICZjb21wKTsKLQotCi0gICAvKiBNYWtlIHN1cmUgd2UgaW5jbHVkZSB0aGUgY29tcHJlc3Npb24gZmxhZywgdGhlIGNvbXByZXNzaW9uIGJ5dGUsCi0gICAgKiBhbmQgdGhlIE5VTHMgYWZ0ZXIgdGhlIGtleSwgbGFuZywgYW5kIGxhbmdfa2V5IHBhcnRzICovCi0KLSAgIHBuZ193cml0ZV9jaHVua19zdGFydChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19pVFh0LAotICAgICAgICAgIChwbmdfdWludF8zMikoCi0gICAgICAgIDUgLyogY29tcCBieXRlLCBjb21wIGZsYWcsIHRlcm1pbmF0b3JzIGZvciBrZXksIGxhbmcgYW5kIGxhbmdfa2V5ICovCi0gICAgICAgICsga2V5X2xlbgotICAgICAgICArIGxhbmdfbGVuCi0gICAgICAgICsgbGFuZ19rZXlfbGVuCi0gICAgICAgICsgdGV4dF9sZW4pKTsKLQotICAgLyogV2UgbGVhdmUgaXQgdG8gdGhlIGFwcGxpY2F0aW9uIHRvIG1lZXQgUE5HLTEuMCByZXF1aXJlbWVudHMgb24gdGhlCi0gICAgKiBjb250ZW50cyBvZiB0aGUgdGV4dC4gIFBORy0xLjAgdGhyb3VnaCBQTkctMS4yIGRpc2NvdXJhZ2UgdGhlIHVzZSBvZgotICAgICogYW55IG5vbi1MYXRpbi0xIGNoYXJhY3RlcnMgZXhjZXB0IGZvciBORVdMSU5FLiAgSVNPIFBORyB3aWxsIGZvcmJpZCB0aGVtLgotICAgICogVGhlIE5VTCBjaGFyYWN0ZXIgaXMgZm9yYmlkZGVuIGJ5IFBORy0xLjAgdGhyb3VnaCBQTkctMS4yIGFuZCBJU08gUE5HLgotICAgICovCi0gICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKW5ld19rZXksCi0gICAgIChwbmdfc2l6ZV90KShrZXlfbGVuICsgMSkpOwotCi0gICAvKiBTZXQgdGhlIGNvbXByZXNzaW9uIGZsYWcgKi8KLSAgIGlmIChjb21wcmVzc2lvbiA9PSBQTkdfSVRYVF9DT01QUkVTU0lPTl9OT05FIHx8IFwKLSAgICAgICBjb21wcmVzc2lvbiA9PSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FKQotICAgICAgIGNidWZbMF0gPSAwOwotICAgZWxzZSAvKiBjb21wcmVzc2lvbiA9PSBQTkdfSVRYVF9DT01QUkVTU0lPTl96VFh0ICovCi0gICAgICAgY2J1ZlswXSA9IDE7Ci0gICAvKiBTZXQgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCAqLwotICAgY2J1ZlsxXSA9IDA7Ci0gICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBjYnVmLCAocG5nX3NpemVfdCkyKTsKLQotICAgY2J1ZlswXSA9IDA7Ci0gICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAobmV3X2xhbmcgPyAocG5nX2J5dGVwKW5ld19sYW5nIDogY2J1ZiksCi0gICAgIChwbmdfc2l6ZV90KShsYW5nX2xlbiArIDEpKTsKLSAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChsYW5nX2tleSA/IChwbmdfYnl0ZXApbGFuZ19rZXkgOiBjYnVmKSwKLSAgICAgKHBuZ19zaXplX3QpKGxhbmdfa2V5X2xlbiArIDEpKTsKLSAgIHBuZ193cml0ZV9jb21wcmVzc2VkX2RhdGFfb3V0KHBuZ19wdHIsICZjb21wKTsKLQotICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIG5ld19rZXkpOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgbmV3X2xhbmcpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfb0ZGc19TVVBQT1JURUQKLS8qIFdyaXRlIHRoZSBvRkZzIGNodW5rICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV9vRkZzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbnRfMzIgeF9vZmZzZXQsIHBuZ19pbnRfMzIgeV9vZmZzZXQsCi0gICBpbnQgdW5pdF90eXBlKQotewotICAgUE5HX29GRnM7Ci0gICBwbmdfYnl0ZSBidWZbOV07Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX29GRnMiKTsKLQotICAgaWYgKHVuaXRfdHlwZSA+PSBQTkdfT0ZGU0VUX0xBU1QpCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5yZWNvZ25pemVkIHVuaXQgdHlwZSBmb3Igb0ZGcyBjaHVuayIpOwotCi0gICBwbmdfc2F2ZV9pbnRfMzIoYnVmLCB4X29mZnNldCk7Ci0gICBwbmdfc2F2ZV9pbnRfMzIoYnVmICsgNCwgeV9vZmZzZXQpOwotICAgYnVmWzhdID0gKHBuZ19ieXRlKXVuaXRfdHlwZTsKLQotICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX29GRnMsIGJ1ZiwgKHBuZ19zaXplX3QpOSk7Ci19Ci0jZW5kaWYKLSNpZmRlZiBQTkdfV1JJVEVfcENBTF9TVVBQT1JURUQKLS8qIFdyaXRlIHRoZSBwQ0FMIGNodW5rIChkZXNjcmliZWQgaW4gdGhlIFBORyBleHRlbnNpb25zIGRvY3VtZW50KSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfcENBTChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY2hhcnAgcHVycG9zZSwgcG5nX2ludF8zMiBYMCwKLSAgIHBuZ19pbnRfMzIgWDEsIGludCB0eXBlLCBpbnQgbnBhcmFtcywgcG5nX2NoYXJwIHVuaXRzLCBwbmdfY2hhcnBwIHBhcmFtcykKLXsKLSAgIFBOR19wQ0FMOwotICAgcG5nX3NpemVfdCBwdXJwb3NlX2xlbiwgdW5pdHNfbGVuLCB0b3RhbF9sZW47Ci0gICBwbmdfdWludF8zMnAgcGFyYW1zX2xlbjsKLSAgIHBuZ19ieXRlIGJ1ZlsxMF07Ci0gICBwbmdfY2hhcnAgbmV3X3B1cnBvc2U7Ci0gICBpbnQgaTsKLQotICAgcG5nX2RlYnVnMSgxLCAiaW4gcG5nX3dyaXRlX3BDQUwgKCVkIHBhcmFtZXRlcnMpIiwgbnBhcmFtcyk7Ci0KLSAgIGlmICh0eXBlID49IFBOR19FUVVBVElPTl9MQVNUKQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVucmVjb2duaXplZCBlcXVhdGlvbiB0eXBlIGZvciBwQ0FMIGNodW5rIik7Ci0KLSAgIHB1cnBvc2VfbGVuID0gcG5nX2NoZWNrX2tleXdvcmQocG5nX3B0ciwgcHVycG9zZSwgJm5ld19wdXJwb3NlKSArIDE7Ci0gICBwbmdfZGVidWcxKDMsICJwQ0FMIHB1cnBvc2UgbGVuZ3RoID0gJWQiLCAoaW50KXB1cnBvc2VfbGVuKTsKLSAgIHVuaXRzX2xlbiA9IHBuZ19zdHJsZW4odW5pdHMpICsgKG5wYXJhbXMgPT0gMCA/IDAgOiAxKTsKLSAgIHBuZ19kZWJ1ZzEoMywgInBDQUwgdW5pdHMgbGVuZ3RoID0gJWQiLCAoaW50KXVuaXRzX2xlbik7Ci0gICB0b3RhbF9sZW4gPSBwdXJwb3NlX2xlbiArIHVuaXRzX2xlbiArIDEwOwotCi0gICBwYXJhbXNfbGVuID0gKHBuZ191aW50XzMycClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAocG5nX2FsbG9jX3NpemVfdCkobnBhcmFtcyAqIHBuZ19zaXplb2YocG5nX3VpbnRfMzIpKSk7Ci0KLSAgIC8qIEZpbmQgdGhlIGxlbmd0aCBvZiBlYWNoIHBhcmFtZXRlciwgbWFraW5nIHN1cmUgd2UgZG9uJ3QgY291bnQgdGhlCi0gICAgICBudWxsIHRlcm1pbmF0b3IgZm9yIHRoZSBsYXN0IHBhcmFtZXRlci4gKi8KLSAgIGZvciAoaSA9IDA7IGkgPCBucGFyYW1zOyBpKyspCi0gICB7Ci0gICAgICBwYXJhbXNfbGVuW2ldID0gcG5nX3N0cmxlbihwYXJhbXNbaV0pICsgKGkgPT0gbnBhcmFtcyAtIDEgPyAwIDogMSk7Ci0gICAgICBwbmdfZGVidWcyKDMsICJwQ0FMIHBhcmFtZXRlciAlZCBsZW5ndGggPSAlbHUiLCBpLAotICAgICAgICAodW5zaWduZWQgbG9uZykgcGFyYW1zX2xlbltpXSk7Ci0gICAgICB0b3RhbF9sZW4gKz0gKHBuZ19zaXplX3QpcGFyYW1zX2xlbltpXTsKLSAgIH0KLQotICAgcG5nX2RlYnVnMSgzLCAicENBTCB0b3RhbCBsZW5ndGggPSAlZCIsIChpbnQpdG90YWxfbGVuKTsKLSAgIHBuZ193cml0ZV9jaHVua19zdGFydChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19wQ0FMLCAocG5nX3VpbnRfMzIpdG90YWxfbGVuKTsKLSAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChwbmdfYnl0ZXApbmV3X3B1cnBvc2UsCi0gICAgIChwbmdfc2l6ZV90KXB1cnBvc2VfbGVuKTsKLSAgIHBuZ19zYXZlX2ludF8zMihidWYsIFgwKTsKLSAgIHBuZ19zYXZlX2ludF8zMihidWYgKyA0LCBYMSk7Ci0gICBidWZbOF0gPSAocG5nX2J5dGUpdHlwZTsKLSAgIGJ1Zls5XSA9IChwbmdfYnl0ZSlucGFyYW1zOwotICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgYnVmLCAocG5nX3NpemVfdCkxMCk7Ci0gICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKXVuaXRzLCAocG5nX3NpemVfdCl1bml0c19sZW4pOwotCi0gICBwbmdfZnJlZShwbmdfcHRyLCBuZXdfcHVycG9zZSk7Ci0KLSAgIGZvciAoaSA9IDA7IGkgPCBucGFyYW1zOyBpKyspCi0gICB7Ci0gICAgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKXBhcmFtc1tpXSwKLSAgICAgICAgIChwbmdfc2l6ZV90KXBhcmFtc19sZW5baV0pOwotICAgfQotCi0gICBwbmdfZnJlZShwbmdfcHRyLCBwYXJhbXNfbGVuKTsKLSAgIHBuZ193cml0ZV9jaHVua19lbmQocG5nX3B0cik7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9zQ0FMX1NVUFBPUlRFRAotLyogV3JpdGUgdGhlIHNDQUwgY2h1bmsgKi8KLSNpZiBkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1NURElPX1NVUFBPUlRFRCkKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX3NDQUwocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IHVuaXQsIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCkKLXsKLSAgIFBOR19zQ0FMOwotICAgY2hhciBidWZbNjRdOwotICAgcG5nX3NpemVfdCB0b3RhbF9sZW47Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3NDQUwiKTsKLQotICAgYnVmWzBdID0gKGNoYXIpdW5pdDsKLSAgIHBuZ19zbnByaW50ZihidWYgKyAxLCA2MywgIiUxMi4xMmUiLCB3aWR0aCk7Ci0gICB0b3RhbF9sZW4gPSAxICsgcG5nX3N0cmxlbihidWYgKyAxKSArIDE7Ci0gICBwbmdfc25wcmludGYoYnVmICsgdG90YWxfbGVuLCA2NC10b3RhbF9sZW4sICIlMTIuMTJlIiwgaGVpZ2h0KTsKLSAgIHRvdGFsX2xlbiArPSBwbmdfc3RybGVuKGJ1ZiArIHRvdGFsX2xlbik7Ci0KLSAgIHBuZ19kZWJ1ZzEoMywgInNDQUwgdG90YWwgbGVuZ3RoID0gJXUiLCAodW5zaWduZWQgaW50KXRvdGFsX2xlbik7Ci0gICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfc0NBTCwgKHBuZ19ieXRlcClidWYsIHRvdGFsX2xlbik7Ci19Ci0jZWxzZQotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX3NDQUxfcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgdW5pdCwgcG5nX2NoYXJwIHdpZHRoLAotICAgcG5nX2NoYXJwIGhlaWdodCkKLXsKLSAgIFBOR19zQ0FMOwotICAgcG5nX2J5dGUgYnVmWzY0XTsKLSAgIHBuZ19zaXplX3Qgd2xlbiwgaGxlbiwgdG90YWxfbGVuOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9zQ0FMX3MiKTsKLQotICAgd2xlbiA9IHBuZ19zdHJsZW4od2lkdGgpOwotICAgaGxlbiA9IHBuZ19zdHJsZW4oaGVpZ2h0KTsKLSAgIHRvdGFsX2xlbiA9IHdsZW4gKyBobGVuICsgMjsKLSAgIGlmICh0b3RhbF9sZW4gPiA2NCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJDYW4ndCB3cml0ZSBzQ0FMIChidWZmZXIgdG9vIHNtYWxsKSIpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBidWZbMF0gPSAocG5nX2J5dGUpdW5pdDsKLSAgIHBuZ19tZW1jcHkoYnVmICsgMSwgd2lkdGgsIHdsZW4gKyAxKTsgICAgICAvKiBBcHBlbmQgdGhlICdcMCcgaGVyZSAqLwotICAgcG5nX21lbWNweShidWYgKyB3bGVuICsgMiwgaGVpZ2h0LCBobGVuKTsgIC8qIERvIE5PVCBhcHBlbmQgdGhlICdcMCcgaGVyZSAqLwotCi0gICBwbmdfZGVidWcxKDMsICJzQ0FMIHRvdGFsIGxlbmd0aCA9ICV1IiwgKHVuc2lnbmVkIGludCl0b3RhbF9sZW4pOwotICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3NDQUwsIGJ1ZiwgdG90YWxfbGVuKTsKLX0KLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9wSFlzX1NVUFBPUlRFRAotLyogV3JpdGUgdGhlIHBIWXMgY2h1bmsgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX3BIWXMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgeF9waXhlbHNfcGVyX3VuaXQsCi0gICBwbmdfdWludF8zMiB5X3BpeGVsc19wZXJfdW5pdCwKLSAgIGludCB1bml0X3R5cGUpCi17Ci0gICBQTkdfcEhZczsKLSAgIHBuZ19ieXRlIGJ1Zls5XTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfcEhZcyIpOwotCi0gICBpZiAodW5pdF90eXBlID49IFBOR19SRVNPTFVUSU9OX0xBU1QpCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5yZWNvZ25pemVkIHVuaXQgdHlwZSBmb3IgcEhZcyBjaHVuayIpOwotCi0gICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiwgeF9waXhlbHNfcGVyX3VuaXQpOwotICAgcG5nX3NhdmVfdWludF8zMihidWYgKyA0LCB5X3BpeGVsc19wZXJfdW5pdCk7Ci0gICBidWZbOF0gPSAocG5nX2J5dGUpdW5pdF90eXBlOwotCi0gICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfcEhZcywgYnVmLCAocG5nX3NpemVfdCk5KTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVECi0vKiBXcml0ZSB0aGUgdElNRSBjaHVuay4gIFVzZSBlaXRoZXIgcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0oKQotICogb3IgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSwgb3IgZmlsbCBpbiB0aGUgc3RydWN0dXJlIHlvdXJzZWxmLgotICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV90SU1FKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ190aW1lcCBtb2RfdGltZSkKLXsKLSAgIFBOR190SU1FOwotICAgcG5nX2J5dGUgYnVmWzddOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV90SU1FIik7Ci0KLSAgIGlmIChtb2RfdGltZS0+bW9udGggID4gMTIgfHwgbW9kX3RpbWUtPm1vbnRoICA8IDEgfHwKLSAgICAgICBtb2RfdGltZS0+ZGF5ICAgID4gMzEgfHwgbW9kX3RpbWUtPmRheSAgICA8IDEgfHwKLSAgICAgICBtb2RfdGltZS0+aG91ciAgID4gMjMgfHwgbW9kX3RpbWUtPnNlY29uZCA+IDYwKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgdGltZSBzcGVjaWZpZWQgZm9yIHRJTUUgY2h1bmsiKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX3NhdmVfdWludF8xNihidWYsIG1vZF90aW1lLT55ZWFyKTsKLSAgIGJ1ZlsyXSA9IG1vZF90aW1lLT5tb250aDsKLSAgIGJ1ZlszXSA9IG1vZF90aW1lLT5kYXk7Ci0gICBidWZbNF0gPSBtb2RfdGltZS0+aG91cjsKLSAgIGJ1Zls1XSA9IG1vZF90aW1lLT5taW51dGU7Ci0gICBidWZbNl0gPSBtb2RfdGltZS0+c2Vjb25kOwotCi0gICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfdElNRSwgYnVmLCAocG5nX3NpemVfdCk3KTsKLX0KLSNlbmRpZgotCi0vKiBJbml0aWFsaXplcyB0aGUgcm93IHdyaXRpbmcgY2FwYWJpbGl0eSBvZiBsaWJwbmcgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX3N0YXJ0X3Jvdyhwbmdfc3RydWN0cCBwbmdfcHRyKQotewotI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSAgIC8qIEFycmF5cyB0byBmYWNpbGl0YXRlIGVhc3kgaW50ZXJsYWNpbmcgLSB1c2UgcGFzcyAoMCAtIDYpIGFzIGluZGV4ICovCi0KLSAgIC8qIFN0YXJ0IG9mIGludGVybGFjZSBibG9jayAqLwotICAgaW50IHBuZ19wYXNzX3N0YXJ0WzddID0gezAsIDQsIDAsIDIsIDAsIDEsIDB9OwotCi0gICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgKi8KLSAgIGludCBwbmdfcGFzc19pbmNbN10gPSB7OCwgOCwgNCwgNCwgMiwgMiwgMX07Ci0KLSAgIC8qIFN0YXJ0IG9mIGludGVybGFjZSBibG9jayBpbiB0aGUgeSBkaXJlY3Rpb24gKi8KLSAgIGludCBwbmdfcGFzc195c3RhcnRbN10gPSB7MCwgMCwgNCwgMCwgMiwgMCwgMX07Ci0KLSAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayBpbiB0aGUgeSBkaXJlY3Rpb24gKi8KLSAgIGludCBwbmdfcGFzc195aW5jWzddID0gezgsIDgsIDgsIDQsIDQsIDIsIDJ9OwotI2VuZGlmCi0KLSAgIHBuZ19zaXplX3QgYnVmX3NpemU7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3N0YXJ0X3JvdyIpOwotCi0gICBidWZfc2l6ZSA9IChwbmdfc2l6ZV90KShQTkdfUk9XQllURVMoCi0gICAgICBwbmdfcHRyLT51c3JfY2hhbm5lbHMqcG5nX3B0ci0+dXNyX2JpdF9kZXB0aCwgcG5nX3B0ci0+d2lkdGgpICsgMSk7Ci0KLSAgIC8qIFNldCB1cCByb3cgYnVmZmVyICovCi0gICBwbmdfcHRyLT5yb3dfYnVmID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgIChwbmdfYWxsb2Nfc2l6ZV90KWJ1Zl9zaXplKTsKLSAgIHBuZ19wdHItPnJvd19idWZbMF0gPSBQTkdfRklMVEVSX1ZBTFVFX05PTkU7Ci0KLSNpZmRlZiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRAotICAgLyogU2V0IHVwIGZpbHRlcmluZyBidWZmZXIsIGlmIHVzaW5nIHRoaXMgZmlsdGVyICovCi0gICBpZiAocG5nX3B0ci0+ZG9fZmlsdGVyICYgUE5HX0ZJTFRFUl9TVUIpCi0gICB7Ci0gICAgICBwbmdfcHRyLT5zdWJfcm93ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAocG5nX2FsbG9jX3NpemVfdCkocG5nX3B0ci0+cm93Ynl0ZXMgKyAxKSk7Ci0gICAgICBwbmdfcHRyLT5zdWJfcm93WzBdID0gUE5HX0ZJTFRFUl9WQUxVRV9TVUI7Ci0gICB9Ci0KLSAgIC8qIFdlIG9ubHkgbmVlZCB0byBrZWVwIHRoZSBwcmV2aW91cyByb3cgaWYgd2UgYXJlIHVzaW5nIG9uZSBvZiB0aGVzZS4gKi8KLSAgIGlmIChwbmdfcHRyLT5kb19maWx0ZXIgJiAoUE5HX0ZJTFRFUl9BVkcgfCBQTkdfRklMVEVSX1VQIHwgUE5HX0ZJTFRFUl9QQUVUSCkpCi0gICB7Ci0gICAgICAvKiBTZXQgdXAgcHJldmlvdXMgcm93IGJ1ZmZlciAqLwotICAgICAgcG5nX3B0ci0+cHJldl9yb3cgPSAocG5nX2J5dGVwKXBuZ19jYWxsb2MocG5nX3B0ciwKLSAgICAgICAgIChwbmdfYWxsb2Nfc2l6ZV90KWJ1Zl9zaXplKTsKLQotICAgICAgaWYgKHBuZ19wdHItPmRvX2ZpbHRlciAmIFBOR19GSUxURVJfVVApCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT51cF9yb3cgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgIChwbmdfc2l6ZV90KShwbmdfcHRyLT5yb3dieXRlcyArIDEpKTsKLSAgICAgICAgIHBuZ19wdHItPnVwX3Jvd1swXSA9IFBOR19GSUxURVJfVkFMVUVfVVA7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwbmdfcHRyLT5kb19maWx0ZXIgJiBQTkdfRklMVEVSX0FWRykKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdHItPmF2Z19yb3cgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgIChwbmdfYWxsb2Nfc2l6ZV90KShwbmdfcHRyLT5yb3dieXRlcyArIDEpKTsKLSAgICAgICAgIHBuZ19wdHItPmF2Z19yb3dbMF0gPSBQTkdfRklMVEVSX1ZBTFVFX0FWRzsKLSAgICAgIH0KLQotICAgICAgaWYgKHBuZ19wdHItPmRvX2ZpbHRlciAmIFBOR19GSUxURVJfUEFFVEgpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5wYWV0aF9yb3cgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgIChwbmdfc2l6ZV90KShwbmdfcHRyLT5yb3dieXRlcyArIDEpKTsKLSAgICAgICAgIHBuZ19wdHItPnBhZXRoX3Jvd1swXSA9IFBOR19GSUxURVJfVkFMVUVfUEFFVEg7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYgLyogUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSAgIC8qIElmIGludGVybGFjZWQsIHdlIG5lZWQgdG8gc2V0IHVwIHdpZHRoIGFuZCBoZWlnaHQgb2YgcGFzcyAqLwotICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQpCi0gICB7Ci0gICAgICBpZiAoIShwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdHItPm51bV9yb3dzID0gKHBuZ19wdHItPmhlaWdodCArIHBuZ19wYXNzX3lpbmNbMF0gLSAxIC0KLSAgICAgICAgICAgIHBuZ19wYXNzX3lzdGFydFswXSkgLyBwbmdfcGFzc195aW5jWzBdOwotICAgICAgICAgcG5nX3B0ci0+dXNyX3dpZHRoID0gKHBuZ19wdHItPndpZHRoICsgcG5nX3Bhc3NfaW5jWzBdIC0gMSAtCi0gICAgICAgICAgICBwbmdfcGFzc19zdGFydFswXSkgLyBwbmdfcGFzc19pbmNbMF07Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5udW1fcm93cyA9IHBuZ19wdHItPmhlaWdodDsKLSAgICAgICAgIHBuZ19wdHItPnVzcl93aWR0aCA9IHBuZ19wdHItPndpZHRoOwotICAgICAgfQotICAgfQotICAgZWxzZQotI2VuZGlmCi0gICB7Ci0gICAgICBwbmdfcHRyLT5udW1fcm93cyA9IHBuZ19wdHItPmhlaWdodDsKLSAgICAgIHBuZ19wdHItPnVzcl93aWR0aCA9IHBuZ19wdHItPndpZHRoOwotICAgfQotICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAodUludClwbmdfcHRyLT56YnVmX3NpemU7Ci0gICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKLX0KLQotLyogSW50ZXJuYWwgdXNlIG9ubHkuICBDYWxsZWQgd2hlbiBmaW5pc2hlZCBwcm9jZXNzaW5nIGEgcm93IG9mIGRhdGEuICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV9maW5pc2hfcm93KHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0jaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotICAgLyogQXJyYXlzIHRvIGZhY2lsaXRhdGUgZWFzeSBpbnRlcmxhY2luZyAtIHVzZSBwYXNzICgwIC0gNikgYXMgaW5kZXggKi8KLQotICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrICovCi0gICBpbnQgcG5nX3Bhc3Nfc3RhcnRbN10gPSB7MCwgNCwgMCwgMiwgMCwgMSwgMH07Ci0KLSAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayAqLwotICAgaW50IHBuZ19wYXNzX2luY1s3XSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsKLQotICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLwotICAgaW50IHBuZ19wYXNzX3lzdGFydFs3XSA9IHswLCAwLCA0LCAwLCAyLCAwLCAxfTsKLQotICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLwotICAgaW50IHBuZ19wYXNzX3lpbmNbN10gPSB7OCwgOCwgOCwgNCwgNCwgMiwgMn07Ci0jZW5kaWYKLQotICAgaW50IHJldDsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfZmluaXNoX3JvdyIpOwotCi0gICAvKiBOZXh0IHJvdyAqLwotICAgcG5nX3B0ci0+cm93X251bWJlcisrOwotCi0gICAvKiBTZWUgaWYgd2UgYXJlIGRvbmUgKi8KLSAgIGlmIChwbmdfcHRyLT5yb3dfbnVtYmVyIDwgcG5nX3B0ci0+bnVtX3Jvd3MpCi0gICAgICByZXR1cm47Ci0KLSNpZmRlZiBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVECi0gICAvKiBJZiBpbnRlcmxhY2VkLCBnbyB0byBuZXh0IHBhc3MgKi8KLSAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkKQotICAgewotICAgICAgcG5nX3B0ci0+cm93X251bWJlciA9IDA7Ci0gICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdHItPnBhc3MrKzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIC8qIExvb3AgdW50aWwgd2UgZmluZCBhIG5vbi16ZXJvIHdpZHRoIG9yIGhlaWdodCBwYXNzICovCi0gICAgICAgICBkbwotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3B0ci0+cGFzcysrOwotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPj0gNykKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgcG5nX3B0ci0+dXNyX3dpZHRoID0gKHBuZ19wdHItPndpZHRoICsKLSAgICAgICAgICAgICAgIHBuZ19wYXNzX2luY1twbmdfcHRyLT5wYXNzXSAtIDEgLQotICAgICAgICAgICAgICAgcG5nX3Bhc3Nfc3RhcnRbcG5nX3B0ci0+cGFzc10pIC8KLSAgICAgICAgICAgICAgIHBuZ19wYXNzX2luY1twbmdfcHRyLT5wYXNzXTsKLSAgICAgICAgICAgIHBuZ19wdHItPm51bV9yb3dzID0gKHBuZ19wdHItPmhlaWdodCArCi0gICAgICAgICAgICAgICBwbmdfcGFzc195aW5jW3BuZ19wdHItPnBhc3NdIC0gMSAtCi0gICAgICAgICAgICAgICBwbmdfcGFzc195c3RhcnRbcG5nX3B0ci0+cGFzc10pIC8KLSAgICAgICAgICAgICAgIHBuZ19wYXNzX3lpbmNbcG5nX3B0ci0+cGFzc107Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfSB3aGlsZSAocG5nX3B0ci0+dXNyX3dpZHRoID09IDAgfHwgcG5nX3B0ci0+bnVtX3Jvd3MgPT0gMCk7Ci0KLSAgICAgIH0KLQotICAgICAgLyogUmVzZXQgdGhlIHJvdyBhYm92ZSB0aGUgaW1hZ2UgZm9yIHRoZSBuZXh0IHBhc3MgKi8KLSAgICAgIGlmIChwbmdfcHRyLT5wYXNzIDwgNykKLSAgICAgIHsKLSAgICAgICAgIGlmIChwbmdfcHRyLT5wcmV2X3JvdyAhPSBOVUxMKQotICAgICAgICAgICAgcG5nX21lbXNldChwbmdfcHRyLT5wcmV2X3JvdywgMCwKLSAgICAgICAgICAgICAgIChwbmdfc2l6ZV90KShQTkdfUk9XQllURVMocG5nX3B0ci0+dXNyX2NoYW5uZWxzKgotICAgICAgICAgICAgICAgcG5nX3B0ci0+dXNyX2JpdF9kZXB0aCwgcG5nX3B0ci0+d2lkdGgpKSArIDEpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgfQotI2VuZGlmCi0KLSAgIC8qIElmIHdlIGdldCBoZXJlLCB3ZSd2ZSBqdXN0IHdyaXR0ZW4gdGhlIGxhc3Qgcm93LCBzbyB3ZSBuZWVkCi0gICAgICB0byBmbHVzaCB0aGUgY29tcHJlc3NvciAqLwotICAgZG8KLSAgIHsKLSAgICAgIC8qIFRlbGwgdGhlIGNvbXByZXNzb3Igd2UgYXJlIGRvbmUgKi8KLSAgICAgIHJldCA9IGRlZmxhdGUoJnBuZ19wdHItPnpzdHJlYW0sIFpfRklOSVNIKTsKLSAgICAgIC8qIENoZWNrIGZvciBhbiBlcnJvciAqLwotICAgICAgaWYgKHJldCA9PSBaX09LKQotICAgICAgewotICAgICAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgbW9yZSByb29tICovCi0gICAgICAgICBpZiAoIShwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfd3JpdGVfSURBVChwbmdfcHRyLCBwbmdfcHRyLT56YnVmLCBwbmdfcHRyLT56YnVmX3NpemUpOwotICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IHBuZ19wdHItPnpidWY7Ci0gICAgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXBuZ19wdHItPnpidWZfc2l6ZTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJldCAhPSBaX1NUUkVBTV9FTkQpCi0gICAgICB7Ci0gICAgICAgICBpZiAocG5nX3B0ci0+enN0cmVhbS5tc2cgIT0gTlVMTCkKLSAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBwbmdfcHRyLT56c3RyZWFtLm1zZyk7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInpsaWIgZXJyb3IiKTsKLSAgICAgIH0KLSAgIH0gd2hpbGUgKHJldCAhPSBaX1NUUkVBTV9FTkQpOwotCi0gICAvKiBXcml0ZSBhbnkgZXh0cmEgc3BhY2UgKi8KLSAgIGlmIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA8IHBuZ19wdHItPnpidWZfc2l6ZSkKLSAgIHsKLSAgICAgIHBuZ193cml0ZV9JREFUKHBuZ19wdHIsIHBuZ19wdHItPnpidWYsIHBuZ19wdHItPnpidWZfc2l6ZSAtCi0gICAgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCk7Ci0gICB9Ci0KLSAgIGRlZmxhdGVSZXNldCgmcG5nX3B0ci0+enN0cmVhbSk7Ci0gICBwbmdfcHRyLT56c3RyZWFtLmRhdGFfdHlwZSA9IFpfQklOQVJZOwotfQotCi0jaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotLyogUGljayBvdXQgdGhlIGNvcnJlY3QgcGl4ZWxzIGZvciB0aGUgaW50ZXJsYWNlIHBhc3MuCi0gKiBUaGUgYmFzaWMgaWRlYSBoZXJlIGlzIHRvIGdvIHRocm91Z2ggdGhlIHJvdyB3aXRoIGEgc291cmNlCi0gKiBwb2ludGVyIGFuZCBhIGRlc3RpbmF0aW9uIHBvaW50ZXIgKHNwIGFuZCBkcCksIGFuZCBjb3B5IHRoZQotICogY29ycmVjdCBwaXhlbHMgZm9yIHRoZSBwYXNzLiAgQXMgdGhlIHJvdyBnZXRzIGNvbXBhY3RlZCwKLSAqIHNwIHdpbGwgYWx3YXlzIGJlID49IGRwLCBzbyB3ZSBzaG91bGQgbmV2ZXIgb3ZlcndyaXRlIGFueXRoaW5nLgotICogU2VlIHRoZSBkZWZhdWx0OiBjYXNlIGZvciB0aGUgZWFzaWVzdCBjb2RlIHRvIHVuZGVyc3RhbmQuCi0gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RvX3dyaXRlX2ludGVybGFjZShwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBpbnQgcGFzcykKLXsKLSAgIC8qIEFycmF5cyB0byBmYWNpbGl0YXRlIGVhc3kgaW50ZXJsYWNpbmcgLSB1c2UgcGFzcyAoMCAtIDYpIGFzIGluZGV4ICovCi0KLSAgIC8qIFN0YXJ0IG9mIGludGVybGFjZSBibG9jayAqLwotICAgaW50IHBuZ19wYXNzX3N0YXJ0WzddID0gezAsIDQsIDAsIDIsIDAsIDEsIDB9OwotCi0gICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgKi8KLSAgIGludCBwbmdfcGFzc19pbmNbN10gPSB7OCwgOCwgNCwgNCwgMiwgMiwgMX07Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3dyaXRlX2ludGVybGFjZSIpOwotCi0gICAvKiBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIG9uIHRoZSBsYXN0IHBhc3MgKDYpICovCi0gICBpZiAocGFzcyA8IDYpCi0gICB7Ci0gICAgICAvKiBFYWNoIHBpeGVsIGRlcHRoIGlzIGhhbmRsZWQgc2VwYXJhdGVseSAqLwotICAgICAgc3dpdGNoIChyb3dfaW5mby0+cGl4ZWxfZGVwdGgpCi0gICAgICB7Ci0gICAgICAgICBjYXNlIDE6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3A7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHA7Ci0gICAgICAgICAgICBpbnQgc2hpZnQ7Ci0gICAgICAgICAgICBpbnQgZDsKLSAgICAgICAgICAgIGludCB2YWx1ZTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0KLSAgICAgICAgICAgIGRwID0gcm93OwotICAgICAgICAgICAgZCA9IDA7Ci0gICAgICAgICAgICBzaGlmdCA9IDc7Ci0gICAgICAgICAgICBmb3IgKGkgPSBwbmdfcGFzc19zdGFydFtwYXNzXTsgaSA8IHJvd193aWR0aDsKLSAgICAgICAgICAgICAgIGkgKz0gcG5nX3Bhc3NfaW5jW3Bhc3NdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoaSA+PiAzKTsKLSAgICAgICAgICAgICAgIHZhbHVlID0gKGludCkoKnNwID4+ICg3IC0gKGludCkoaSAmIDB4MDcpKSkgJiAweDAxOwotICAgICAgICAgICAgICAgZCB8PSAodmFsdWUgPDwgc2hpZnQpOwotCi0gICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gMCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNzsKLSAgICAgICAgICAgICAgICAgICpkcCsrID0gKHBuZ19ieXRlKWQ7Ci0gICAgICAgICAgICAgICAgICBkID0gMDsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHNoaWZ0LS07Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzaGlmdCAhPSA3KQotICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcDsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcDsKLSAgICAgICAgICAgIGludCBzaGlmdDsKLSAgICAgICAgICAgIGludCBkOwotICAgICAgICAgICAgaW50IHZhbHVlOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKLQotICAgICAgICAgICAgZHAgPSByb3c7Ci0gICAgICAgICAgICBzaGlmdCA9IDY7Ci0gICAgICAgICAgICBkID0gMDsKLSAgICAgICAgICAgIGZvciAoaSA9IHBuZ19wYXNzX3N0YXJ0W3Bhc3NdOyBpIDwgcm93X3dpZHRoOwotICAgICAgICAgICAgICAgaSArPSBwbmdfcGFzc19pbmNbcGFzc10pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KShpID4+IDIpOwotICAgICAgICAgICAgICAgdmFsdWUgPSAoKnNwID4+ICgoMyAtIChpbnQpKGkgJiAweDAzKSkgPDwgMSkpICYgMHgwMzsKLSAgICAgICAgICAgICAgIGQgfD0gKHZhbHVlIDw8IHNoaWZ0KTsKLQotICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDApCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzaGlmdCA9IDY7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9IChwbmdfYnl0ZSlkOwotICAgICAgICAgICAgICAgICAgZCA9IDA7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBzaGlmdCAtPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNoaWZ0ICE9IDYpCi0gICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcDsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcDsKLSAgICAgICAgICAgIGludCBzaGlmdDsKLSAgICAgICAgICAgIGludCBkOwotICAgICAgICAgICAgaW50IHZhbHVlOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKLQotICAgICAgICAgICAgZHAgPSByb3c7Ci0gICAgICAgICAgICBzaGlmdCA9IDQ7Ci0gICAgICAgICAgICBkID0gMDsKLSAgICAgICAgICAgIGZvciAoaSA9IHBuZ19wYXNzX3N0YXJ0W3Bhc3NdOyBpIDwgcm93X3dpZHRoOwotICAgICAgICAgICAgICAgaSArPSBwbmdfcGFzc19pbmNbcGFzc10pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KShpID4+IDEpOwotICAgICAgICAgICAgICAgdmFsdWUgPSAoKnNwID4+ICgoMSAtIChpbnQpKGkgJiAweDAxKSkgPDwgMikpICYgMHgwZjsKLSAgICAgICAgICAgICAgIGQgfD0gKHZhbHVlIDw8IHNoaWZ0KTsKLQotICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDApCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzaGlmdCA9IDQ7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9IChwbmdfYnl0ZSlkOwotICAgICAgICAgICAgICAgICAgZCA9IDA7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBzaGlmdCAtPSA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNoaWZ0ICE9IDQpCi0gICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcDsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcDsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0gICAgICAgICAgICBwbmdfc2l6ZV90IHBpeGVsX2J5dGVzOwotCi0gICAgICAgICAgICAvKiBTdGFydCBhdCB0aGUgYmVnaW5uaW5nICovCi0gICAgICAgICAgICBkcCA9IHJvdzsKLSAgICAgICAgICAgIC8qIEZpbmQgb3V0IGhvdyBtYW55IGJ5dGVzIGVhY2ggcGl4ZWwgdGFrZXMgdXAgKi8KLSAgICAgICAgICAgIHBpeGVsX2J5dGVzID0gKHJvd19pbmZvLT5waXhlbF9kZXB0aCA+PiAzKTsKLSAgICAgICAgICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgcm93LCBvbmx5IGxvb2tpbmcgYXQgdGhlIHBpeGVscyB0aGF0Ci0gICAgICAgICAgICAgICBtYXR0ZXIgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IHBuZ19wYXNzX3N0YXJ0W3Bhc3NdOyBpIDwgcm93X3dpZHRoOwotICAgICAgICAgICAgICAgaSArPSBwbmdfcGFzc19pbmNbcGFzc10pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBGaW5kIG91dCB3aGVyZSB0aGUgb3JpZ2luYWwgcGl4ZWwgaXMgKi8KLSAgICAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3QpaSAqIHBpeGVsX2J5dGVzOwotICAgICAgICAgICAgICAgLyogTW92ZSB0aGUgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgIGlmIChkcCAhPSBzcCkKLSAgICAgICAgICAgICAgICAgIHBuZ19tZW1jcHkoZHAsIHNwLCBwaXhlbF9ieXRlcyk7Ci0gICAgICAgICAgICAgICAvKiBOZXh0IHBpeGVsICovCi0gICAgICAgICAgICAgICBkcCArPSBwaXhlbF9ieXRlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgLyogU2V0IG5ldyByb3cgd2lkdGggKi8KLSAgICAgIHJvd19pbmZvLT53aWR0aCA9IChyb3dfaW5mby0+d2lkdGggKwotICAgICAgICAgcG5nX3Bhc3NfaW5jW3Bhc3NdIC0gMSAtCi0gICAgICAgICBwbmdfcGFzc19zdGFydFtwYXNzXSkgLwotICAgICAgICAgcG5nX3Bhc3NfaW5jW3Bhc3NdOwotICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwKLSAgICAgICAgICAgIHJvd19pbmZvLT53aWR0aCk7Ci0gICB9Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBmaWx0ZXJzIHRoZSByb3csIGNob29zZXMgd2hpY2ggZmlsdGVyIHRvIHVzZSwgaWYgaXQgaGFzIG5vdCBhbHJlYWR5Ci0gKiBiZWVuIHNwZWNpZmllZCBieSB0aGUgYXBwbGljYXRpb24sIGFuZCB0aGVuIHdyaXRlcyB0aGUgcm93IG91dCB3aXRoIHRoZQotICogY2hvc2VuIGZpbHRlci4KLSAqLwotI2RlZmluZSBQTkdfTUFYU1VNICgoKHBuZ191aW50XzMyKSgtMSkpID4+IDEpCi0jZGVmaW5lIFBOR19ISVNISUZUIDEwCi0jZGVmaW5lIFBOR19MT01BU0sgKChwbmdfdWludF8zMikweGZmZmZMKQotI2RlZmluZSBQTkdfSElNQVNLICgocG5nX3VpbnRfMzIpKH5QTkdfTE9NQVNLID4+IFBOR19ISVNISUZUKSkKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX2ZpbmRfZmlsdGVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19yb3dfaW5mb3Agcm93X2luZm8pCi17Ci0gICBwbmdfYnl0ZXAgYmVzdF9yb3c7Ci0jaWZkZWYgUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQKLSAgIHBuZ19ieXRlcCBwcmV2X3Jvdywgcm93X2J1ZjsKLSAgIHBuZ191aW50XzMyIG1pbnMsIGJwcDsKLSAgIHBuZ19ieXRlIGZpbHRlcl90b19kbyA9IHBuZ19wdHItPmRvX2ZpbHRlcjsKLSAgIHBuZ191aW50XzMyIHJvd19ieXRlcyA9IHJvd19pbmZvLT5yb3dieXRlczsKLSNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRAotICAgaW50IG51bV9wX2ZpbHRlcnMgPSAoaW50KXBuZ19wdHItPm51bV9wcmV2X2ZpbHRlcnM7Ci0jZW5kaWYKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfZmluZF9maWx0ZXIiKTsKLQotI2lmbmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRAotICBpZiAocG5nX3B0ci0+cm93X251bWJlciA9PSAwICYmIGZpbHRlcl90b19kbyA9PSBQTkdfQUxMX0ZJTFRFUlMpCi0gIHsKLSAgICAgIC8qIFRoZXNlIHdpbGwgbmV2ZXIgYmUgc2VsZWN0ZWQgc28gd2UgbmVlZCBub3QgdGVzdCB0aGVtLiAqLwotICAgICAgZmlsdGVyX3RvX2RvICY9IH4oUE5HX0ZJTFRFUl9VUCB8IFBOR19GSUxURVJfUEFFVEgpOwotICB9Ci0jZW5kaWYKLQotICAgLyogRmluZCBvdXQgaG93IG1hbnkgYnl0ZXMgb2Zmc2V0IGVhY2ggcGl4ZWwgaXMgKi8KLSAgIGJwcCA9IChyb3dfaW5mby0+cGl4ZWxfZGVwdGggKyA3KSA+PiAzOwotCi0gICBwcmV2X3JvdyA9IHBuZ19wdHItPnByZXZfcm93OwotI2VuZGlmCi0gICBiZXN0X3JvdyA9IHBuZ19wdHItPnJvd19idWY7Ci0jaWZkZWYgUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQKLSAgIHJvd19idWYgPSBiZXN0X3JvdzsKLSAgIG1pbnMgPSBQTkdfTUFYU1VNOwotCi0gICAvKiBUaGUgcHJlZGljdGlvbiBtZXRob2Qgd2UgdXNlIGlzIHRvIGZpbmQgd2hpY2ggbWV0aG9kIHByb3ZpZGVzIHRoZQotICAgICogc21hbGxlc3QgdmFsdWUgd2hlbiBzdW1taW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIGRpc3RhbmNlcwotICAgICogZnJvbSB6ZXJvLCB1c2luZyBhbnl0aGluZyA+PSAxMjggYXMgbmVnYXRpdmUgbnVtYmVycy4gIFRoaXMgaXMga25vd24KLSAgICAqIGFzIHRoZSAibWluaW11bSBzdW0gb2YgYWJzb2x1dGUgZGlmZmVyZW5jZXMiIGhldXJpc3RpYy4gIE90aGVyCi0gICAgKiBoZXVyaXN0aWNzIGFyZSB0aGUgIndlaWdodGVkIG1pbmltdW0gc3VtIG9mIGFic29sdXRlIGRpZmZlcmVuY2VzIgotICAgICogKGV4cGVyaW1lbnRhbCBhbmQgY2FuIGluIHRoZW9yeSBpbXByb3ZlIGNvbXByZXNzaW9uKSwgYW5kIHRoZSAiemxpYgotICAgICogcHJlZGljdGl2ZSIgbWV0aG9kIChub3QgaW1wbGVtZW50ZWQgeWV0KSwgd2hpY2ggZG9lcyB0ZXN0IGNvbXByZXNzaW9ucwotICAgICogb2YgbGluZXMgdXNpbmcgZGlmZmVyZW50IGZpbHRlciBtZXRob2RzLCBhbmQgdGhlbiBjaG9vc2VzIHRoZQotICAgICogKHNlcmllcyBvZikgZmlsdGVyKHMpIHRoYXQgZ2l2ZSBtaW5pbXVtIGNvbXByZXNzZWQgZGF0YSBzaXplIChWRVJZCi0gICAgKiBjb21wdXRhdGlvbmFsbHkgZXhwZW5zaXZlKS4KLSAgICAqCi0gICAgKiBHUlIgOTgwNTI1OiAgY29uc2lkZXIgYWxzbwotICAgICogICAoMSkgbWluaW11bSBzdW0gb2YgYWJzb2x1dGUgZGlmZmVyZW5jZXMgZnJvbSBydW5uaW5nIGF2ZXJhZ2UgKGkuZS4sCi0gICAgKiAgICAgICBrZWVwIHJ1bm5pbmcgc3VtIG9mIG5vbi1hYnNvbHV0ZSBkaWZmZXJlbmNlcyAmIGNvdW50IG9mIGJ5dGVzKQotICAgICogICAgICAgW3RyYWNrIGRpc3BlcnNpb24sIHRvbz8gIHJlc3RhcnQgYXZlcmFnZSBpZiBkaXNwZXJzaW9uIHRvbyBsYXJnZT9dCi0gICAgKiAgKDFiKSBtaW5pbXVtIHN1bSBvZiBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBmcm9tIHNsaWRpbmcgYXZlcmFnZSwgcHJvYmFibHkKLSAgICAqICAgICAgIHdpdGggd2luZG93IHNpemUgPD0gZGVmbGF0ZSB3aW5kb3cgKHVzdWFsbHkgMzJLKQotICAgICogICAoMikgbWluaW11bSBzdW0gb2Ygc3F1YXJlZCBkaWZmZXJlbmNlcyBmcm9tIHplcm8gb3IgcnVubmluZyBhdmVyYWdlCi0gICAgKiAgICAgICAoaS5lLiwgfiByb290LW1lYW4tc3F1YXJlIGFwcHJvYWNoKQotICAgICovCi0KLQotICAgLyogV2UgZG9uJ3QgbmVlZCB0byB0ZXN0IHRoZSAnbm8gZmlsdGVyJyBjYXNlIGlmIHRoaXMgaXMgdGhlIG9ubHkgZmlsdGVyCi0gICAgKiB0aGF0IGhhcyBiZWVuIGNob3NlbiwgYXMgaXQgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyB0byB0aGUgZGF0YS4KLSAgICAqLwotICAgaWYgKChmaWx0ZXJfdG9fZG8gJiBQTkdfRklMVEVSX05PTkUpICYmCi0gICAgICAgZmlsdGVyX3RvX2RvICE9IFBOR19GSUxURVJfTk9ORSkKLSAgIHsKLSAgICAgIHBuZ19ieXRlcCBycDsKLSAgICAgIHBuZ191aW50XzMyIHN1bSA9IDA7Ci0gICAgICBwbmdfdWludF8zMiBpOwotICAgICAgaW50IHY7Ci0KLSAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93X2J1ZiArIDE7IGkgPCByb3dfYnl0ZXM7IGkrKywgcnArKykKLSAgICAgIHsKLSAgICAgICAgIHYgPSAqcnA7Ci0gICAgICAgICBzdW0gKz0gKHYgPCAxMjgpID8gdiA6IDI1NiAtIHY7Ci0gICAgICB9Ci0KLSNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRAotICAgICAgaWYgKHBuZ19wdHItPmhldXJpc3RpY19tZXRob2QgPT0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQpCi0gICAgICB7Ci0gICAgICAgICBwbmdfdWludF8zMiBzdW1oaSwgc3VtbG87Ci0gICAgICAgICBpbnQgajsKLSAgICAgICAgIHN1bWxvID0gc3VtICYgUE5HX0xPTUFTSzsKLSAgICAgICAgIHN1bWhpID0gKHN1bSA+PiBQTkdfSElTSElGVCkgJiBQTkdfSElNQVNLOyAvKiBHaXZlcyB1cyBzb21lIGZvb3Ryb29tICovCi0KLSAgICAgICAgIC8qIFJlZHVjZSB0aGUgc3VtIGlmIHdlIG1hdGNoIGFueSBvZiB0aGUgcHJldmlvdXMgcm93cyAqLwotICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9wX2ZpbHRlcnM7IGorKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbal0gPT0gUE5HX0ZJTFRFUl9WQUxVRV9OT05FKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3VtbG8gPSAoc3VtbG8gKiBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KLSAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7Ci0gICAgICAgICAgICAgICBzdW1oaSA9IChzdW1oaSAqIHBuZ19wdHItPmZpbHRlcl93ZWlnaHRzW2pdKSA+PgotICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgLyogRmFjdG9yIGluIHRoZSBjb3N0IG9mIHRoaXMgZmlsdGVyICh0aGlzIGlzIGhlcmUgZm9yIGNvbXBsZXRlbmVzcywKLSAgICAgICAgICAqIGJ1dCBpdCBtYWtlcyBubyBzZW5zZSB0byBoYXZlIGEgImNvc3QiIGZvciB0aGUgTk9ORSBmaWx0ZXIsIGFzCi0gICAgICAgICAgKiBpdCBoYXMgdGhlIG1pbmltdW0gcG9zc2libGUgY29tcHV0YXRpb25hbCBjb3N0IC0gbm9uZSkuCi0gICAgICAgICAgKi8KLSAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfTk9ORV0pID4+Ci0gICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKLSAgICAgICAgIHN1bWhpID0gKHN1bWhpICogcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfTk9ORV0pID4+Ci0gICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKLQotICAgICAgICAgaWYgKHN1bWhpID4gUE5HX0hJTUFTSykKLSAgICAgICAgICAgIHN1bSA9IFBOR19NQVhTVU07Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdW0gPSAoc3VtaGkgPDwgUE5HX0hJU0hJRlQpICsgc3VtbG87Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIG1pbnMgPSBzdW07Ci0gICB9Ci0KLSAgIC8qIFN1YiBmaWx0ZXIgKi8KLSAgIGlmIChmaWx0ZXJfdG9fZG8gPT0gUE5HX0ZJTFRFUl9TVUIpCi0gICAvKiBJdCdzIHRoZSBvbmx5IGZpbHRlciBzbyBubyB0ZXN0aW5nIGlzIG5lZWRlZCAqLwotICAgewotICAgICAgcG5nX2J5dGVwIHJwLCBscCwgZHA7Ci0gICAgICBwbmdfdWludF8zMiBpOwotICAgICAgZm9yIChpID0gMCwgcnAgPSByb3dfYnVmICsgMSwgZHAgPSBwbmdfcHRyLT5zdWJfcm93ICsgMTsgaSA8IGJwcDsKLSAgICAgICAgICAgaSsrLCBycCsrLCBkcCsrKQotICAgICAgewotICAgICAgICAgKmRwID0gKnJwOwotICAgICAgfQotICAgICAgZm9yIChscCA9IHJvd19idWYgKyAxOyBpIDwgcm93X2J5dGVzOwotICAgICAgICAgaSsrLCBycCsrLCBscCsrLCBkcCsrKQotICAgICAgewotICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgoKGludCkqcnAgLSAoaW50KSpscCkgJiAweGZmKTsKLSAgICAgIH0KLSAgICAgIGJlc3Rfcm93ID0gcG5nX3B0ci0+c3ViX3JvdzsKLSAgIH0KLQotICAgZWxzZSBpZiAoZmlsdGVyX3RvX2RvICYgUE5HX0ZJTFRFUl9TVUIpCi0gICB7Ci0gICAgICBwbmdfYnl0ZXAgcnAsIGRwLCBscDsKLSAgICAgIHBuZ191aW50XzMyIHN1bSA9IDAsIGxtaW5zID0gbWluczsKLSAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICBpbnQgdjsKLQotI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVECi0gICAgICAvKiBXZSB0ZW1wb3JhcmlseSBpbmNyZWFzZSB0aGUgIm1pbmltdW0gc3VtIiBieSB0aGUgZmFjdG9yIHdlCi0gICAgICAgKiB3b3VsZCByZWR1Y2UgdGhlIHN1bSBvZiB0aGlzIGZpbHRlciwgc28gdGhhdCB3ZSBjYW4gZG8gdGhlCi0gICAgICAgKiBlYXJseSBleGl0IGNvbXBhcmlzb24gd2l0aG91dCBzY2FsaW5nIHRoZSBzdW0gZWFjaCB0aW1lLgotICAgICAgICovCi0gICAgICBpZiAocG5nX3B0ci0+aGV1cmlzdGljX21ldGhvZCA9PSBQTkdfRklMVEVSX0hFVVJJU1RJQ19XRUlHSFRFRCkKLSAgICAgIHsKLSAgICAgICAgIGludCBqOwotICAgICAgICAgcG5nX3VpbnRfMzIgbG1oaSwgbG1sbzsKLSAgICAgICAgIGxtbG8gPSBsbWlucyAmIFBOR19MT01BU0s7Ci0gICAgICAgICBsbWhpID0gKGxtaW5zID4+IFBOR19ISVNISUZUKSAmIFBOR19ISU1BU0s7Ci0KLSAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fcF9maWx0ZXJzOyBqKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cHJldl9maWx0ZXJzW2pdID09IFBOR19GSUxURVJfVkFMVUVfU1VCKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgbG1sbyA9IChsbWxvICogcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2pdKSA+PgotICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKLSAgICAgICAgICAgICAgIGxtaGkgPSAobG1oaSAqIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KLSAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGxtbG8gPSAobG1sbyAqIHBuZ19wdHItPmludl9maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9TVUJdKSA+PgotICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7Ci0gICAgICAgICBsbWhpID0gKGxtaGkgKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfU1VCXSkgPj4KLSAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOwotCi0gICAgICAgICBpZiAobG1oaSA+IFBOR19ISU1BU0spCi0gICAgICAgICAgICBsbWlucyA9IFBOR19NQVhTVU07Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBsbWlucyA9IChsbWhpIDw8IFBOR19ISVNISUZUKSArIGxtbG87Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgICAgZm9yIChpID0gMCwgcnAgPSByb3dfYnVmICsgMSwgZHAgPSBwbmdfcHRyLT5zdWJfcm93ICsgMTsgaSA8IGJwcDsKLSAgICAgICAgICAgaSsrLCBycCsrLCBkcCsrKQotICAgICAgewotICAgICAgICAgdiA9ICpkcCA9ICpycDsKLQotICAgICAgICAgc3VtICs9ICh2IDwgMTI4KSA/IHYgOiAyNTYgLSB2OwotICAgICAgfQotICAgICAgZm9yIChscCA9IHJvd19idWYgKyAxOyBpIDwgcm93X2J5dGVzOwotICAgICAgICAgaSsrLCBycCsrLCBscCsrLCBkcCsrKQotICAgICAgewotICAgICAgICAgdiA9ICpkcCA9IChwbmdfYnl0ZSkoKChpbnQpKnJwIC0gKGludCkqbHApICYgMHhmZik7Ci0KLSAgICAgICAgIHN1bSArPSAodiA8IDEyOCkgPyB2IDogMjU2IC0gdjsKLQotICAgICAgICAgaWYgKHN1bSA+IGxtaW5zKSAgLyogV2UgYXJlIGFscmVhZHkgd29yc2UsIGRvbid0IGNvbnRpbnVlLiAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRAotICAgICAgaWYgKHBuZ19wdHItPmhldXJpc3RpY19tZXRob2QgPT0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQpCi0gICAgICB7Ci0gICAgICAgICBpbnQgajsKLSAgICAgICAgIHBuZ191aW50XzMyIHN1bWhpLCBzdW1sbzsKLSAgICAgICAgIHN1bWxvID0gc3VtICYgUE5HX0xPTUFTSzsKLSAgICAgICAgIHN1bWhpID0gKHN1bSA+PiBQTkdfSElTSElGVCkgJiBQTkdfSElNQVNLOwotCi0gICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3BfZmlsdGVyczsgaisrKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfZmlsdGVyc1tqXSA9PSBQTkdfRklMVEVSX1ZBTFVFX1NVQikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2pdKSA+PgotICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKLSAgICAgICAgICAgICAgIHN1bWhpID0gKHN1bWhpICogcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2pdKSA+PgotICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgc3VtbG8gPSAoc3VtbG8gKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfU1VCXSkgPj4KLSAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOwotICAgICAgICAgc3VtaGkgPSAoc3VtaGkgKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfU1VCXSkgPj4KLSAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOwotCi0gICAgICAgICBpZiAoc3VtaGkgPiBQTkdfSElNQVNLKQotICAgICAgICAgICAgc3VtID0gUE5HX01BWFNVTTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN1bSA9IChzdW1oaSA8PCBQTkdfSElTSElGVCkgKyBzdW1sbzsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICBpZiAoc3VtIDwgbWlucykKLSAgICAgIHsKLSAgICAgICAgIG1pbnMgPSBzdW07Ci0gICAgICAgICBiZXN0X3JvdyA9IHBuZ19wdHItPnN1Yl9yb3c7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIFVwIGZpbHRlciAqLwotICAgaWYgKGZpbHRlcl90b19kbyA9PSBQTkdfRklMVEVSX1VQKQotICAgewotICAgICAgcG5nX2J5dGVwIHJwLCBkcCwgcHA7Ci0gICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICBmb3IgKGkgPSAwLCBycCA9IHJvd19idWYgKyAxLCBkcCA9IHBuZ19wdHItPnVwX3JvdyArIDEsCi0gICAgICAgICAgIHBwID0gcHJldl9yb3cgKyAxOyBpIDwgcm93X2J5dGVzOwotICAgICAgICAgICBpKyssIHJwKyssIHBwKyssIGRwKyspCi0gICAgICB7Ci0gICAgICAgICAqZHAgPSAocG5nX2J5dGUpKCgoaW50KSpycCAtIChpbnQpKnBwKSAmIDB4ZmYpOwotICAgICAgfQotICAgICAgYmVzdF9yb3cgPSBwbmdfcHRyLT51cF9yb3c7Ci0gICB9Ci0KLSAgIGVsc2UgaWYgKGZpbHRlcl90b19kbyAmIFBOR19GSUxURVJfVVApCi0gICB7Ci0gICAgICBwbmdfYnl0ZXAgcnAsIGRwLCBwcDsKLSAgICAgIHBuZ191aW50XzMyIHN1bSA9IDAsIGxtaW5zID0gbWluczsKLSAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICBpbnQgdjsKLQotCi0jaWZkZWYgUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQKLSAgICAgIGlmIChwbmdfcHRyLT5oZXVyaXN0aWNfbWV0aG9kID09IFBOR19GSUxURVJfSEVVUklTVElDX1dFSUdIVEVEKQotICAgICAgewotICAgICAgICAgaW50IGo7Ci0gICAgICAgICBwbmdfdWludF8zMiBsbWhpLCBsbWxvOwotICAgICAgICAgbG1sbyA9IGxtaW5zICYgUE5HX0xPTUFTSzsKLSAgICAgICAgIGxtaGkgPSAobG1pbnMgPj4gUE5HX0hJU0hJRlQpICYgUE5HX0hJTUFTSzsKLQotICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9wX2ZpbHRlcnM7IGorKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbal0gPT0gUE5HX0ZJTFRFUl9WQUxVRV9VUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGxtbG8gPSAobG1sbyAqIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KLSAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7Ci0gICAgICAgICAgICAgICBsbWhpID0gKGxtaGkgKiBwbmdfcHRyLT5pbnZfZmlsdGVyX3dlaWdodHNbal0pID4+Ci0gICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICBsbWxvID0gKGxtbG8gKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfVVBdKSA+PgotICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7Ci0gICAgICAgICBsbWhpID0gKGxtaGkgKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfVVBdKSA+PgotICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7Ci0KLSAgICAgICAgIGlmIChsbWhpID4gUE5HX0hJTUFTSykKLSAgICAgICAgICAgIGxtaW5zID0gUE5HX01BWFNVTTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxtaW5zID0gKGxtaGkgPDwgUE5HX0hJU0hJRlQpICsgbG1sbzsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICBmb3IgKGkgPSAwLCBycCA9IHJvd19idWYgKyAxLCBkcCA9IHBuZ19wdHItPnVwX3JvdyArIDEsCi0gICAgICAgICAgIHBwID0gcHJldl9yb3cgKyAxOyBpIDwgcm93X2J5dGVzOyBpKyspCi0gICAgICB7Ci0gICAgICAgICB2ID0gKmRwKysgPSAocG5nX2J5dGUpKCgoaW50KSpycCsrIC0gKGludCkqcHArKykgJiAweGZmKTsKLQotICAgICAgICAgc3VtICs9ICh2IDwgMTI4KSA/IHYgOiAyNTYgLSB2OwotCi0gICAgICAgICBpZiAoc3VtID4gbG1pbnMpICAvKiBXZSBhcmUgYWxyZWFkeSB3b3JzZSwgZG9uJ3QgY29udGludWUuICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVECi0gICAgICBpZiAocG5nX3B0ci0+aGV1cmlzdGljX21ldGhvZCA9PSBQTkdfRklMVEVSX0hFVVJJU1RJQ19XRUlHSFRFRCkKLSAgICAgIHsKLSAgICAgICAgIGludCBqOwotICAgICAgICAgcG5nX3VpbnRfMzIgc3VtaGksIHN1bWxvOwotICAgICAgICAgc3VtbG8gPSBzdW0gJiBQTkdfTE9NQVNLOwotICAgICAgICAgc3VtaGkgPSAoc3VtID4+IFBOR19ISVNISUZUKSAmIFBOR19ISU1BU0s7Ci0KLSAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fcF9maWx0ZXJzOyBqKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cHJldl9maWx0ZXJzW2pdID09IFBOR19GSUxURVJfVkFMVUVfVVApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzdW1sbyA9IChzdW1sbyAqIHBuZ19wdHItPmZpbHRlcl93ZWlnaHRzW2pdKSA+PgotICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKLSAgICAgICAgICAgICAgIHN1bWhpID0gKHN1bWhpICogcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHNbal0pID4+Ci0gICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICBzdW1sbyA9IChzdW1sbyAqIHBuZ19wdHItPmZpbHRlcl9jb3N0c1tQTkdfRklMVEVSX1ZBTFVFX1VQXSkgPj4KLSAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOwotICAgICAgICAgc3VtaGkgPSAoc3VtaGkgKiBwbmdfcHRyLT5maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9VUF0pID4+Ci0gICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKLQotICAgICAgICAgaWYgKHN1bWhpID4gUE5HX0hJTUFTSykKLSAgICAgICAgICAgIHN1bSA9IFBOR19NQVhTVU07Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdW0gPSAoc3VtaGkgPDwgUE5HX0hJU0hJRlQpICsgc3VtbG87Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgICAgaWYgKHN1bSA8IG1pbnMpCi0gICAgICB7Ci0gICAgICAgICBtaW5zID0gc3VtOwotICAgICAgICAgYmVzdF9yb3cgPSBwbmdfcHRyLT51cF9yb3c7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIEF2ZyBmaWx0ZXIgKi8KLSAgIGlmIChmaWx0ZXJfdG9fZG8gPT0gUE5HX0ZJTFRFUl9BVkcpCi0gICB7Ci0gICAgICBwbmdfYnl0ZXAgcnAsIGRwLCBwcCwgbHA7Ci0gICAgICBwbmdfdWludF8zMiBpOwotICAgICAgZm9yIChpID0gMCwgcnAgPSByb3dfYnVmICsgMSwgZHAgPSBwbmdfcHRyLT5hdmdfcm93ICsgMSwKLSAgICAgICAgICAgcHAgPSBwcmV2X3JvdyArIDE7IGkgPCBicHA7IGkrKykKLSAgICAgIHsKLSAgICAgICAgICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtICgoaW50KSpwcCsrIC8gMikpICYgMHhmZik7Ci0gICAgICB9Ci0gICAgICBmb3IgKGxwID0gcm93X2J1ZiArIDE7IGkgPCByb3dfYnl0ZXM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtICgoKGludCkqcHArKyArIChpbnQpKmxwKyspIC8gMikpCi0gICAgICAgICAgICAgICAgICYgMHhmZik7Ci0gICAgICB9Ci0gICAgICBiZXN0X3JvdyA9IHBuZ19wdHItPmF2Z19yb3c7Ci0gICB9Ci0KLSAgIGVsc2UgaWYgKGZpbHRlcl90b19kbyAmIFBOR19GSUxURVJfQVZHKQotICAgewotICAgICAgcG5nX2J5dGVwIHJwLCBkcCwgcHAsIGxwOwotICAgICAgcG5nX3VpbnRfMzIgc3VtID0gMCwgbG1pbnMgPSBtaW5zOwotICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgIGludCB2OwotCi0jaWZkZWYgUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQKLSAgICAgIGlmIChwbmdfcHRyLT5oZXVyaXN0aWNfbWV0aG9kID09IFBOR19GSUxURVJfSEVVUklTVElDX1dFSUdIVEVEKQotICAgICAgewotICAgICAgICAgaW50IGo7Ci0gICAgICAgICBwbmdfdWludF8zMiBsbWhpLCBsbWxvOwotICAgICAgICAgbG1sbyA9IGxtaW5zICYgUE5HX0xPTUFTSzsKLSAgICAgICAgIGxtaGkgPSAobG1pbnMgPj4gUE5HX0hJU0hJRlQpICYgUE5HX0hJTUFTSzsKLQotICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9wX2ZpbHRlcnM7IGorKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbal0gPT0gUE5HX0ZJTFRFUl9WQUxVRV9BVkcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBsbWxvID0gKGxtbG8gKiBwbmdfcHRyLT5pbnZfZmlsdGVyX3dlaWdodHNbal0pID4+Ci0gICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOwotICAgICAgICAgICAgICAgbG1oaSA9IChsbWhpICogcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2pdKSA+PgotICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgbG1sbyA9IChsbWxvICogcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0c1tQTkdfRklMVEVSX1ZBTFVFX0FWR10pID4+Ci0gICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKLSAgICAgICAgIGxtaGkgPSAobG1oaSAqIHBuZ19wdHItPmludl9maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9BVkddKSA+PgotICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7Ci0KLSAgICAgICAgIGlmIChsbWhpID4gUE5HX0hJTUFTSykKLSAgICAgICAgICAgIGxtaW5zID0gUE5HX01BWFNVTTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxtaW5zID0gKGxtaGkgPDwgUE5HX0hJU0hJRlQpICsgbG1sbzsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICBmb3IgKGkgPSAwLCBycCA9IHJvd19idWYgKyAxLCBkcCA9IHBuZ19wdHItPmF2Z19yb3cgKyAxLAotICAgICAgICAgICBwcCA9IHByZXZfcm93ICsgMTsgaSA8IGJwcDsgaSsrKQotICAgICAgewotICAgICAgICAgdiA9ICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtICgoaW50KSpwcCsrIC8gMikpICYgMHhmZik7Ci0KLSAgICAgICAgIHN1bSArPSAodiA8IDEyOCkgPyB2IDogMjU2IC0gdjsKLSAgICAgIH0KLSAgICAgIGZvciAobHAgPSByb3dfYnVmICsgMTsgaSA8IHJvd19ieXRlczsgaSsrKQotICAgICAgewotICAgICAgICAgdiA9ICpkcCsrID0KLSAgICAgICAgICAocG5nX2J5dGUpKCgoaW50KSpycCsrIC0gKCgoaW50KSpwcCsrICsgKGludCkqbHArKykgLyAyKSkgJiAweGZmKTsKLQotICAgICAgICAgc3VtICs9ICh2IDwgMTI4KSA/IHYgOiAyNTYgLSB2OwotCi0gICAgICAgICBpZiAoc3VtID4gbG1pbnMpICAvKiBXZSBhcmUgYWxyZWFkeSB3b3JzZSwgZG9uJ3QgY29udGludWUuICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVECi0gICAgICBpZiAocG5nX3B0ci0+aGV1cmlzdGljX21ldGhvZCA9PSBQTkdfRklMVEVSX0hFVVJJU1RJQ19XRUlHSFRFRCkKLSAgICAgIHsKLSAgICAgICAgIGludCBqOwotICAgICAgICAgcG5nX3VpbnRfMzIgc3VtaGksIHN1bWxvOwotICAgICAgICAgc3VtbG8gPSBzdW0gJiBQTkdfTE9NQVNLOwotICAgICAgICAgc3VtaGkgPSAoc3VtID4+IFBOR19ISVNISUZUKSAmIFBOR19ISU1BU0s7Ci0KLSAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fcF9maWx0ZXJzOyBqKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cHJldl9maWx0ZXJzW2pdID09IFBOR19GSUxURVJfVkFMVUVfTk9ORSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHNbal0pID4+Ci0gICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOwotICAgICAgICAgICAgICAgc3VtaGkgPSAoc3VtaGkgKiBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KLSAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfQVZHXSkgPj4KLSAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOwotICAgICAgICAgc3VtaGkgPSAoc3VtaGkgKiBwbmdfcHRyLT5maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9BVkddKSA+PgotICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7Ci0KLSAgICAgICAgIGlmIChzdW1oaSA+IFBOR19ISU1BU0spCi0gICAgICAgICAgICBzdW0gPSBQTkdfTUFYU1VNOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3VtID0gKHN1bWhpIDw8IFBOR19ISVNISUZUKSArIHN1bWxvOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIGlmIChzdW0gPCBtaW5zKQotICAgICAgewotICAgICAgICAgbWlucyA9IHN1bTsKLSAgICAgICAgIGJlc3Rfcm93ID0gcG5nX3B0ci0+YXZnX3JvdzsKLSAgICAgIH0KLSAgIH0KLQotICAgLyogUGFldGggZmlsdGVyICovCi0gICBpZiAoZmlsdGVyX3RvX2RvID09IFBOR19GSUxURVJfUEFFVEgpCi0gICB7Ci0gICAgICBwbmdfYnl0ZXAgcnAsIGRwLCBwcCwgY3AsIGxwOwotICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93X2J1ZiArIDEsIGRwID0gcG5nX3B0ci0+cGFldGhfcm93ICsgMSwKLSAgICAgICAgICAgcHAgPSBwcmV2X3JvdyArIDE7IGkgPCBicHA7IGkrKykKLSAgICAgIHsKLSAgICAgICAgICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtIChpbnQpKnBwKyspICYgMHhmZik7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAobHAgPSByb3dfYnVmICsgMSwgY3AgPSBwcmV2X3JvdyArIDE7IGkgPCByb3dfYnl0ZXM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIGludCBhLCBiLCBjLCBwYSwgcGIsIHBjLCBwOwotCi0gICAgICAgICBiID0gKnBwKys7Ci0gICAgICAgICBjID0gKmNwKys7Ci0gICAgICAgICBhID0gKmxwKys7Ci0KLSAgICAgICAgIHAgPSBiIC0gYzsKLSAgICAgICAgIHBjID0gYSAtIGM7Ci0KLSNpZmRlZiBQTkdfVVNFX0FCUwotICAgICAgICAgcGEgPSBhYnMocCk7Ci0gICAgICAgICBwYiA9IGFicyhwYyk7Ci0gICAgICAgICBwYyA9IGFicyhwICsgcGMpOwotI2Vsc2UKLSAgICAgICAgIHBhID0gcCA8IDAgPyAtcCA6IHA7Ci0gICAgICAgICBwYiA9IHBjIDwgMCA/IC1wYyA6IHBjOwotICAgICAgICAgcGMgPSAocCArIHBjKSA8IDAgPyAtKHAgKyBwYykgOiBwICsgcGM7Ci0jZW5kaWYKLQotICAgICAgICAgcCA9IChwYSA8PSBwYiAmJiBwYSA8PXBjKSA/IGEgOiAocGIgPD0gcGMpID8gYiA6IGM7Ci0KLSAgICAgICAgICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtIHApICYgMHhmZik7Ci0gICAgICB9Ci0gICAgICBiZXN0X3JvdyA9IHBuZ19wdHItPnBhZXRoX3JvdzsKLSAgIH0KLQotICAgZWxzZSBpZiAoZmlsdGVyX3RvX2RvICYgUE5HX0ZJTFRFUl9QQUVUSCkKLSAgIHsKLSAgICAgIHBuZ19ieXRlcCBycCwgZHAsIHBwLCBjcCwgbHA7Ci0gICAgICBwbmdfdWludF8zMiBzdW0gPSAwLCBsbWlucyA9IG1pbnM7Ci0gICAgICBwbmdfdWludF8zMiBpOwotICAgICAgaW50IHY7Ci0KLSNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRAotICAgICAgaWYgKHBuZ19wdHItPmhldXJpc3RpY19tZXRob2QgPT0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQpCi0gICAgICB7Ci0gICAgICAgICBpbnQgajsKLSAgICAgICAgIHBuZ191aW50XzMyIGxtaGksIGxtbG87Ci0gICAgICAgICBsbWxvID0gbG1pbnMgJiBQTkdfTE9NQVNLOwotICAgICAgICAgbG1oaSA9IChsbWlucyA+PiBQTkdfSElTSElGVCkgJiBQTkdfSElNQVNLOwotCi0gICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3BfZmlsdGVyczsgaisrKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfZmlsdGVyc1tqXSA9PSBQTkdfRklMVEVSX1ZBTFVFX1BBRVRIKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgbG1sbyA9IChsbWxvICogcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2pdKSA+PgotICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKLSAgICAgICAgICAgICAgIGxtaGkgPSAobG1oaSAqIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KLSAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGxtbG8gPSAobG1sbyAqIHBuZ19wdHItPmludl9maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSF0pID4+Ci0gICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKLSAgICAgICAgIGxtaGkgPSAobG1oaSAqIHBuZ19wdHItPmludl9maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSF0pID4+Ci0gICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKLQotICAgICAgICAgaWYgKGxtaGkgPiBQTkdfSElNQVNLKQotICAgICAgICAgICAgbG1pbnMgPSBQTkdfTUFYU1VNOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgbG1pbnMgPSAobG1oaSA8PCBQTkdfSElTSElGVCkgKyBsbWxvOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93X2J1ZiArIDEsIGRwID0gcG5nX3B0ci0+cGFldGhfcm93ICsgMSwKLSAgICAgICAgICAgcHAgPSBwcmV2X3JvdyArIDE7IGkgPCBicHA7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIHYgPSAqZHArKyA9IChwbmdfYnl0ZSkoKChpbnQpKnJwKysgLSAoaW50KSpwcCsrKSAmIDB4ZmYpOwotCi0gICAgICAgICBzdW0gKz0gKHYgPCAxMjgpID8gdiA6IDI1NiAtIHY7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAobHAgPSByb3dfYnVmICsgMSwgY3AgPSBwcmV2X3JvdyArIDE7IGkgPCByb3dfYnl0ZXM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIGludCBhLCBiLCBjLCBwYSwgcGIsIHBjLCBwOwotCi0gICAgICAgICBiID0gKnBwKys7Ci0gICAgICAgICBjID0gKmNwKys7Ci0gICAgICAgICBhID0gKmxwKys7Ci0KLSNpZm5kZWYgUE5HX1NMT1dfUEFFVEgKLSAgICAgICAgIHAgPSBiIC0gYzsKLSAgICAgICAgIHBjID0gYSAtIGM7Ci0jaWZkZWYgUE5HX1VTRV9BQlMKLSAgICAgICAgIHBhID0gYWJzKHApOwotICAgICAgICAgcGIgPSBhYnMocGMpOwotICAgICAgICAgcGMgPSBhYnMocCArIHBjKTsKLSNlbHNlCi0gICAgICAgICBwYSA9IHAgPCAwID8gLXAgOiBwOwotICAgICAgICAgcGIgPSBwYyA8IDAgPyAtcGMgOiBwYzsKLSAgICAgICAgIHBjID0gKHAgKyBwYykgPCAwID8gLShwICsgcGMpIDogcCArIHBjOwotI2VuZGlmCi0gICAgICAgICBwID0gKHBhIDw9IHBiICYmIHBhIDw9cGMpID8gYSA6IChwYiA8PSBwYykgPyBiIDogYzsKLSNlbHNlIC8qIFBOR19TTE9XX1BBRVRIICovCi0gICAgICAgICBwID0gYSArIGIgLSBjOwotICAgICAgICAgcGEgPSBhYnMocCAtIGEpOwotICAgICAgICAgcGIgPSBhYnMocCAtIGIpOwotICAgICAgICAgcGMgPSBhYnMocCAtIGMpOwotICAgICAgICAgaWYgKHBhIDw9IHBiICYmIHBhIDw9IHBjKQotICAgICAgICAgICAgcCA9IGE7Ci0gICAgICAgICBlbHNlIGlmIChwYiA8PSBwYykKLSAgICAgICAgICAgIHAgPSBiOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcCA9IGM7Ci0jZW5kaWYgLyogUE5HX1NMT1dfUEFFVEggKi8KLQotICAgICAgICAgdiA9ICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtIHApICYgMHhmZik7Ci0KLSAgICAgICAgIHN1bSArPSAodiA8IDEyOCkgPyB2IDogMjU2IC0gdjsKLQotICAgICAgICAgaWYgKHN1bSA+IGxtaW5zKSAgLyogV2UgYXJlIGFscmVhZHkgd29yc2UsIGRvbid0IGNvbnRpbnVlLiAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRAotICAgICAgaWYgKHBuZ19wdHItPmhldXJpc3RpY19tZXRob2QgPT0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQpCi0gICAgICB7Ci0gICAgICAgICBpbnQgajsKLSAgICAgICAgIHBuZ191aW50XzMyIHN1bWhpLCBzdW1sbzsKLSAgICAgICAgIHN1bWxvID0gc3VtICYgUE5HX0xPTUFTSzsKLSAgICAgICAgIHN1bWhpID0gKHN1bSA+PiBQTkdfSElTSElGVCkgJiBQTkdfSElNQVNLOwotCi0gICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3BfZmlsdGVyczsgaisrKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfZmlsdGVyc1tqXSA9PSBQTkdfRklMVEVSX1ZBTFVFX1BBRVRIKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3VtbG8gPSAoc3VtbG8gKiBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KLSAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7Ci0gICAgICAgICAgICAgICBzdW1oaSA9IChzdW1oaSAqIHBuZ19wdHItPmZpbHRlcl93ZWlnaHRzW2pdKSA+PgotICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgc3VtbG8gPSAoc3VtbG8gKiBwbmdfcHRyLT5maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSF0pID4+Ci0gICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKLSAgICAgICAgIHN1bWhpID0gKHN1bWhpICogcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfUEFFVEhdKSA+PgotICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7Ci0KLSAgICAgICAgIGlmIChzdW1oaSA+IFBOR19ISU1BU0spCi0gICAgICAgICAgICBzdW0gPSBQTkdfTUFYU1VNOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3VtID0gKHN1bWhpIDw8IFBOR19ISVNISUZUKSArIHN1bWxvOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIGlmIChzdW0gPCBtaW5zKQotICAgICAgewotICAgICAgICAgYmVzdF9yb3cgPSBwbmdfcHRyLT5wYWV0aF9yb3c7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYgLyogUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQgKi8KLSAgIC8qIERvIHRoZSBhY3R1YWwgd3JpdGluZyBvZiB0aGUgZmlsdGVyZWQgcm93IGRhdGEgZnJvbSB0aGUgY2hvc2VuIGZpbHRlci4gKi8KLQotICAgcG5nX3dyaXRlX2ZpbHRlcmVkX3JvdyhwbmdfcHRyLCBiZXN0X3Jvdyk7Ci0KLSNpZmRlZiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRAotI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVECi0gICAvKiBTYXZlIHRoZSB0eXBlIG9mIGZpbHRlciB3ZSBwaWNrZWQgdGhpcyB0aW1lIGZvciBmdXR1cmUgY2FsY3VsYXRpb25zICovCi0gICBpZiAocG5nX3B0ci0+bnVtX3ByZXZfZmlsdGVycyA+IDApCi0gICB7Ci0gICAgICBpbnQgajsKLSAgICAgIGZvciAoaiA9IDE7IGogPCBudW1fcF9maWx0ZXJzOyBqKyspCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbal0gPSBwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbaiAtIDFdOwotICAgICAgfQotICAgICAgcG5nX3B0ci0+cHJldl9maWx0ZXJzW2pdID0gYmVzdF9yb3dbMF07Ci0gICB9Ci0jZW5kaWYKLSNlbmRpZiAvKiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRCAqLwotfQotCi0KLS8qIERvIHRoZSBhY3R1YWwgd3JpdGluZyBvZiBhIHByZXZpb3VzbHkgZmlsdGVyZWQgcm93LiAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfZmlsdGVyZWRfcm93KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBmaWx0ZXJlZF9yb3cpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9maWx0ZXJlZF9yb3ciKTsKLQotICAgcG5nX2RlYnVnMSgyLCAiZmlsdGVyID0gJWQiLCBmaWx0ZXJlZF9yb3dbMF0pOwotICAgLyogU2V0IHVwIHRoZSB6bGliIGlucHV0IGJ1ZmZlciAqLwotCi0gICBwbmdfcHRyLT56c3RyZWFtLm5leHRfaW4gPSBmaWx0ZXJlZF9yb3c7Ci0gICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpcG5nX3B0ci0+cm93X2luZm8ucm93Ynl0ZXMgKyAxOwotICAgLyogUmVwZWF0IHVudGlsIHdlIGhhdmUgY29tcHJlc3NlZCBhbGwgdGhlIGRhdGEgKi8KLSAgIGRvCi0gICB7Ci0gICAgICBpbnQgcmV0OyAvKiBSZXR1cm4gb2YgemxpYiAqLwotCi0gICAgICAvKiBDb21wcmVzcyB0aGUgZGF0YSAqLwotICAgICAgcmV0ID0gZGVmbGF0ZSgmcG5nX3B0ci0+enN0cmVhbSwgWl9OT19GTFVTSCk7Ci0gICAgICAvKiBDaGVjayBmb3IgY29tcHJlc3Npb24gZXJyb3JzICovCi0gICAgICBpZiAocmV0ICE9IFpfT0spCi0gICAgICB7Ci0gICAgICAgICBpZiAocG5nX3B0ci0+enN0cmVhbS5tc2cgIT0gTlVMTCkKLSAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBwbmdfcHRyLT56c3RyZWFtLm1zZyk7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInpsaWIgZXJyb3IiKTsKLSAgICAgIH0KLQotICAgICAgLyogU2VlIGlmIGl0IGlzIHRpbWUgdG8gd3JpdGUgYW5vdGhlciBJREFUICovCi0gICAgICBpZiAoIShwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCkpCi0gICAgICB7Ci0gICAgICAgICAvKiBXcml0ZSB0aGUgSURBVCBhbmQgcmVzZXQgdGhlIHpsaWIgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgcG5nX3dyaXRlX0lEQVQocG5nX3B0ciwgcG5nX3B0ci0+emJ1ZiwgcG5nX3B0ci0+emJ1Zl9zaXplKTsKLSAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT56YnVmOwotICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAodUludClwbmdfcHRyLT56YnVmX3NpemU7Ci0gICAgICB9Ci0gICAvKiBSZXBlYXQgdW50aWwgYWxsIGRhdGEgaGFzIGJlZW4gY29tcHJlc3NlZCAqLwotICAgfSB3aGlsZSAocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbik7Ci0KLSAgIC8qIFN3YXAgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHJvd3MgKi8KLSAgIGlmIChwbmdfcHRyLT5wcmV2X3JvdyAhPSBOVUxMKQotICAgewotICAgICAgcG5nX2J5dGVwIHRwdHI7Ci0KLSAgICAgIHRwdHIgPSBwbmdfcHRyLT5wcmV2X3JvdzsKLSAgICAgIHBuZ19wdHItPnByZXZfcm93ID0gcG5nX3B0ci0+cm93X2J1ZjsKLSAgICAgIHBuZ19wdHItPnJvd19idWYgPSB0cHRyOwotICAgfQotCi0gICAvKiBGaW5pc2ggcm93IC0gdXBkYXRlcyBjb3VudGVycyBhbmQgZmx1c2hlcyB6bGliIGlmIGxhc3Qgcm93ICovCi0gICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsKLQotI2lmZGVmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQKLSAgIHBuZ19wdHItPmZsdXNoX3Jvd3MrKzsKLQotICAgaWYgKHBuZ19wdHItPmZsdXNoX2Rpc3QgPiAwICYmCi0gICAgICAgcG5nX3B0ci0+Zmx1c2hfcm93cyA+PSBwbmdfcHRyLT5mbHVzaF9kaXN0KQotICAgewotICAgICAgcG5nX3dyaXRlX2ZsdXNoKHBuZ19wdHIpOwotICAgfQotI2VuZGlmCi19Ci0jZW5kaWYgLyogUE5HX1dSSVRFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNi9SRUFETUUudHh0IGIvc3JjL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNi9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzhhZjZjLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzYvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLU1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMCBmb3IgbGlicG5nLgotCi1Db3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBTaW1vbi1QaWVycmUgQ2FkaWV1eC4KLUNvcHlyaWdodCAoQykgMjAwNCBDb3NtaW4gVHJ1dGEuCi0KLVRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi1Gb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotTk9URTogVGhpcyBwcm9qZWN0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjUuMC4gIEl0IGhhcwotYmVlbiByZXBsYWNlZCB3aXRoIHRoZSAidnN0dWRpbyIgcHJvamVjdC4KLQotQXNzdW1wdGlvbnM6Ci0qIFRoZSBsaWJwbmcgc291cmNlIGZpbGVzIGFyZSBpbiAuLlwuLgotKiBUaGUgemxpYiBzb3VyY2UgZmlsZXMgYXJlIGluIC4uXC4uXC4uXHpsaWIKLSogVGhlIHpsaWIgcHJvamVjdCBmaWxlcyBhcmUgaW4gLi5cLi5cLi5cemxpYlxwcm9qZWN0c1x2aXN1YWxjNgotCi0KLVRvIHVzZToKLQotMSkgT24gdGhlIG1haW4gbWVudSwgc2VsZWN0ICJGaWxlIHwgT3BlbiBXb3Jrc3BhY2UiLgotICAgT3BlbiAibGlicG5nLmRzdyIuCi0KLTIpIFNlbGVjdCAiQnVpbGQgfCBTZXQgQWN0aXZlIENvbmZpZ3VyYXRpb24iLgotICAgQ2hvb3NlIHRoZSBjb25maWd1cmF0aW9uIHlvdSB3aXNoIHRvIGJ1aWxkLgotICAgKENob29zZSBsaWJwbmcgb3IgcG5ndGVzdDsgemxpYiB3aWxsIGJlIGJ1aWx0IGF1dG9tYXRpY2FsbHkuKQotCi0zKSBTZWxlY3QgIkJ1aWxkIHwgQ2xlYW4iLgotCi00KSBTZWxlY3QgIkJ1aWxkIHwgQnVpbGQgLi4uIChGNykiLiAgSWdub3JlIHdhcm5pbmcgbWVzc2FnZXMgYWJvdXQKLSAgIG5vdCBiZWluZyBhYmxlIHRvIGZpbmQgY2VydGFpbiBpbmNsdWRlIGZpbGVzIChlLmcuIGFsbG9jLmgpLgotCi01KSBJZiB5b3UgYnVpbHQgdGhlIHNhbXBsZSBwcm9ncmFtIChwbmd0ZXN0KSwKLSAgIHNlbGVjdCAiQnVpbGQgfCBFeGVjdXRlIC4uLiAoQ3RybCtGNSkiLgotCi0KLVRoaXMgcHJvamVjdCBidWlsZHMgdGhlIGxpYnBuZyBiaW5hcmllcyBhcyBmb2xsb3dzOgotCi0qIFdpbjMyX0RMTF9SZWxlYXNlXGxpYnBuZzE0LmRsbCAgICAgIERMTCBidWlsZAotKiBXaW4zMl9ETExfRGVidWdcbGlicG5nMTRkLmRsbCAgICAgICBETEwgYnVpbGQgKGRlYnVnIHZlcnNpb24pCi0qIFdpbjMyX0RMTF9WQlxsaWJwbmcxNHZiLmRsbCAgICAgICAgIERMTCBidWlsZCBmb3IgVmlzdWFsIEJhc2ljLCB1c2luZyBzdGRjYWxsCi0qIFdpbjMyX0xJQl9SZWxlYXNlXGxpYnBuZy5saWIgICAgICAgIHN0YXRpYyBidWlsZAotKiBXaW4zMl9MSUJfRGVidWdcbGlicG5nZC5saWIgICAgICAgICBzdGF0aWMgYnVpbGQgKGRlYnVnIHZlcnNpb24pCi0KLQotTm90ZXM6Ci0KLUlmIHlvdSBjaGFuZ2UgYW55dGhpbmcgaW4gdGhlIHNvdXJjZSBmaWxlcywgb3Igc2VsZWN0IGRpZmZlcmVudCBjb21waWxlcgotc2V0dGluZ3MsIHBsZWFzZSBjaGFuZ2UgdGhlIERMTCBuYW1lIHRvIHNvbWV0aGluZyBkaWZmZXJlbnQgdGhhbiBhbnkgb2YKLXRoZSBhYm92ZSBuYW1lcy4gQWxzbywgbWFrZSBzdXJlIHRoYXQgaW4geW91ciAicG5ndXNyLmgiIHlvdSBkZWZpbmUKLVBOR19VU0VSX1BSSVZBVEVCVUlMRCBhbmQgUE5HX1VTRVJfRExMRk5BTUVfUE9TVEZJWCBhY2NvcmRpbmcgdG8gdGhlCi1pbnN0cnVjdGlvbnMgcHJvdmlkZWQgaW4gInBuZ2NvbmYuaCIuCi0KLUFsbCBETExzIGJ1aWx0IGJ5IHRoaXMgcHJvamVjdCB1c2UgdGhlIE1pY3Jvc29mdCBkeW5hbWljIEMgcnVudGltZSBsaWJyYXJ5Ci1NU1ZDUlQuRExMIChNU1ZDUlRELkRMTCBmb3IgZGVidWcgdmVyc2lvbnMpLiAgSWYgeW91IGRpc3RyaWJ1dGUgYW55IG9mIHRoZQotYWJvdmUgbWVudGlvbmVkIGxpYnJhcmllcyB5b3Ugc2hvdWxkIGFsc28gaW5jbHVkZSB0aGlzIERMTCBpbiB5b3VyIHBhY2thZ2UuCi1Gb3IgYSBsaXN0IG9mIGZpbGVzIHRoYXQgYXJlIHJlZGlzdHJpYnV0YWJsZSBpbiBWaXN1YWwgQysrIDYuMCwgc2VlCi1Db21tb25cUmVkaXN0XFJlZGlzdC50eHQgb24gRGlzYyAxIG9mIHRoZSBWaXN1YWwgQysrIDYuMCBwcm9kdWN0IENEcy4KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzYvbGlicG5nLmRzcCBiL3NyYy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzYvbGlicG5nLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwNDI1NS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM2L2xpYnBuZy5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJsaWJwbmciIC0gUGFja2FnZSBPd25lcj08ND4NCi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQotIyAqKiBETyBOT1QgRURJVCAqKg0KLQ0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDINCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIgMHgwMTA0DQotDQotQ0ZHPWxpYnBuZyAtIFdpbjMyIERMTCBSZWxlYXNlDQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KLSFNRVNTQUdFDQotIU1FU1NBR0UgTk1BS0UgL2YgImxpYnBuZy5tYWsiLg0KLSFNRVNTQUdFDQotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KLSFNRVNTQUdFDQotIU1FU1NBR0UgTk1BS0UgL2YgImxpYnBuZy5tYWsiIENGRz0ibGlicG5nIC0gV2luMzIgRExMIFJlbGVhc2UiDQotIU1FU1NBR0UNCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToNCi0hTUVTU0FHRQ0KLSFNRVNTQUdFICJsaWJwbmcgLSBXaW4zMiBETEwgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpDQotIU1FU1NBR0UgImxpYnBuZyAtIFdpbjMyIERMTCBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpDQotIU1FU1NBR0UgImxpYnBuZyAtIFdpbjMyIERMTCBWQiIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpDQotIU1FU1NBR0UgImxpYnBuZyAtIFdpbjMyIExJQiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCi0hTUVTU0FHRSAibGlicG5nIC0gV2luMzIgTElCIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCi0hTUVTU0FHRQ0KLQ0KLSMgQmVnaW4gUHJvamVjdA0KLSMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQotDQotIUlGICAiJChDRkcpIiA9PSAibGlicG5nIC0gV2luMzIgRExMIFJlbGVhc2UiDQotDQotIyBQUk9QIEJBU0UgVXNlX01GQyAwDQotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAibGlicG5nX19fV2luMzJfRExMX1JlbGVhc2UiDQotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAibGlicG5nX19fV2luMzJfRExMX1JlbGVhc2UiDQotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KLSMgUFJPUCBVc2VfTUZDIDANCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0RMTF9SZWxlYXNlIg0KLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJXaW4zMl9ETExfUmVsZWFzZSINCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KLSMgUFJPUCBUYXJnZXRfRGlyICIiDQotQ1BQPWNsLmV4ZQ0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRkQgL2MNCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWCAvWWMgL1l1DQotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0kgIi4uXC4uIiAvSSAiLi5cLi5cLi5cemxpYiIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiUE5HX0JVSUxEX0RMTCIgL0QgIlpMSUJfRExMIiAvRkQgL2MNCi0jIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KLU1UTD1taWRsLmV4ZQ0KLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCi1SU0M9cmMuZXhlDQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIlBOR19OT19QRURBTlRJQ19XQVJOSU5HUyIgL2QgIk5ERUJVRyINCi0jIEFERCBSU0MgL2wgMHg0MDkgL2kgIi4uXC4uIiAvZCAiUE5HX05PX1BFREFOVElDX1dBUk5JTkdTIiAvZCAiTkRFQlVHIg0KLUJTQzMyPWJzY21ha2UuZXhlDQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQotIyBBREQgQlNDMzIgL25vbG9nbw0KLUxJTkszMj1saW5rLmV4ZQ0KLSMgQUREIEJBU0UgTElOSzMyIC9ub2xvZ28gL2RsbCAvbWFjaGluZTpJMzg2DQotIyBBREQgTElOSzMyIHpsaWIxLmxpYiAvbm9sb2dvIC9kbGwgL21hY2hpbmU6STM4NiAvb3V0OiJXaW4zMl9ETExfUmVsZWFzZVxsaWJwbmcxNC5kbGwiIC9saWJwYXRoOiIuLlwuLlwuLlx6bGliXHByb2plY3RzXHZpc3VhbGM2XFdpbjMyX0RMTF9SZWxlYXNlIg0KLQ0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJwbmcgLSBXaW4zMiBETEwgRGVidWciDQotDQotIyBQUk9QIEJBU0UgVXNlX01GQyAwDQotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAibGlicG5nX19fV2luMzJfRExMX1JlbGVhc2UiDQotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAibGlicG5nX19fV2luMzJfRExMX1JlbGVhc2UiDQotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KLSMgUFJPUCBVc2VfTUZDIDANCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0RMTF9EZWJ1ZyINCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiV2luMzJfRExMX0RlYnVnIg0KLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQotIyBQUk9QIFRhcmdldF9EaXIgIiINCi1DUFA9Y2wuZXhlDQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9GRCAvR1ogL2MNCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWCAvWWMgL1l1DQotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0kgIi4uXC4uIiAvSSAiLi5cLi5cLi5cemxpYiIgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiREVCVUciIC9EIFBOR19ERUJVRz0xIC9EICJQTkdfQlVJTERfRExMIiAvRCAiWkxJQl9ETEwiIC9GRCAvR1ogL2MNCi0jIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KLU1UTD1taWRsLmV4ZQ0KLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCi1SU0M9cmMuZXhlDQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIlBOR19OT19QRURBTlRJQ19XQVJOSU5HUyIgL2QgIl9ERUJVRyINCi0jIEFERCBSU0MgL2wgMHg0MDkgL2kgIi4uXC4uIiAvZCAiUE5HX05PX1BFREFOVElDX1dBUk5JTkdTIiAvZCAiX0RFQlVHIiAvZCBQTkdfREVCVUc9MQ0KLUJTQzMyPWJzY21ha2UuZXhlDQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQotIyBBREQgQlNDMzIgL25vbG9nbw0KLUxJTkszMj1saW5rLmV4ZQ0KLSMgQUREIEJBU0UgTElOSzMyIC9ub2xvZ28gL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQotIyBBREQgTElOSzMyIHpsaWIxZC5saWIgL25vbG9nbyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IldpbjMyX0RMTF9EZWJ1Z1xsaWJwbmcxNGQuZGxsIiAvbGlicGF0aDoiLi5cLi5cLi5cemxpYlxwcm9qZWN0c1x2aXN1YWxjNlxXaW4zMl9ETExfRGVidWciDQotDQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYnBuZyAtIFdpbjMyIERMTCBWQiINCi0NCi0jIFBST1AgQkFTRSBVc2VfTUZDIDANCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJsaWJwbmdfX19XaW4zMl9ETExfVkIiDQotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAibGlicG5nX19fV2luMzJfRExMX1ZCIg0KLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCi0jIFBST1AgVXNlX01GQyAwDQotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9ETExfVkIiDQotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0RMTF9WQiINCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KLSMgUFJPUCBUYXJnZXRfRGlyICIiDQotQ1BQPWNsLmV4ZQ0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRkQgL2MNCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWCAvWWMgL1l1DQotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0kgIi4uXC4uIiAvSSAiLi5cLi5cLi5cemxpYiIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiUE5HX0JVSUxEX0RMTCIgL0QgIlpMSUJfRExMIiAvRCBQTkdBUEk9X19zdGRjYWxsIC9EICJQTkdfTk9fTU9EVUxFREVGIiAvRCAiUE5HX0xJQlBOR19TUEVDSUFMQlVJTEQiIC9GRCAvYw0KLSMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQotTVRMPW1pZGwuZXhlDQotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KLVJTQz1yYy5leGUNCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiUE5HX05PX1BFREFOVElDX1dBUk5JTkdTIiAvZCAiTkRFQlVHIg0KLSMgQUREIFJTQyAvbCAweDQwOSAvaSAiLi5cLi4iIC9kICJQTkdfTk9fUEVEQU5USUNfV0FSTklOR1MiIC9kICJOREVCVUciIC9kUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYPSIiIiJWQiIiIiIgL2RQTkdfTElCUE5HX1NQRUNJQUxCVUlMRD0iIiIiX19zdGRjYWxsIGNhbGxpbmcgY29udmVudGlvbiB1c2VkIGZvciBleHBvcnRlZCBmdW5jdGlvbnMiIiIiDQotQlNDMzI9YnNjbWFrZS5leGUNCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCi0jIEFERCBCU0MzMiAvbm9sb2dvDQotTElOSzMyPWxpbmsuZXhlDQotIyBBREQgQkFTRSBMSU5LMzIgL25vbG9nbyAvZGxsIC9tYWNoaW5lOkkzODYNCi0jIEFERCBMSU5LMzIgemxpYjEubGliIC9ub2xvZ28gL2RsbCAvbWFjaGluZTpJMzg2IC9vdXQ6IldpbjMyX0RMTF9WQlxsaWJwbmcxNHZiLmRsbCIgL2xpYnBhdGg6Ii4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzZcV2luMzJfRExMX1JlbGVhc2UiDQotIyBCZWdpbiBTcGVjaWFsIEJ1aWxkIFRvb2wNCi1PdXREaXI9LlxXaW4zMl9ETExfVkINCi1UYXJnZXROYW1lPWxpYnBuZzE0dmINCi1TT1VSQ0U9IiQoSW5wdXRQYXRoKSINCi1Qb3N0QnVpbGRfQ21kcz1lY2hvICAgIERlbGV0aW5nICQodGFyZ2V0bmFtZSkgaW1wb3J0IGxpYnJhcnkgYW5kIGV4cG9ydCBmaWxlIChOb3QgcmVxdWlyZWQgZm9yIFZCIHByb2plY3RzKQlkZWwgJChvdXRkaXIpXCQodGFyZ2V0bmFtZSkubGliCWRlbCAkKG91dGRpcilcJCh0YXJnZXRuYW1lKS5leHANCi0jIEVuZCBTcGVjaWFsIEJ1aWxkIFRvb2wNCi0NCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlicG5nIC0gV2luMzIgTElCIFJlbGVhc2UiDQotDQotIyBQUk9QIEJBU0UgVXNlX01GQyAwDQotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAibGlicG5nX19fV2luMzJfTElCX1JlbGVhc2UiDQotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAibGlicG5nX19fV2luMzJfTElCX1JlbGVhc2UiDQotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KLSMgUFJPUCBVc2VfTUZDIDANCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0xJQl9SZWxlYXNlIg0KLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJXaW4zMl9MSUJfUmVsZWFzZSINCi0jIFBST1AgVGFyZ2V0X0RpciAiIg0KLUNQUD1jbC5leGUNCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0ZEIC9jDQotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVggL1ljIC9ZdQ0KLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9JICIuLlwuLiIgL0kgIi4uXC4uXC4uXHpsaWIiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0ZEIC9jDQotIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCi1SU0M9cmMuZXhlDQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIlBOR19OT19QRURBTlRJQ19XQVJOSU5HUyIgL2QgIk5ERUJVRyINCi0jIEFERCBSU0MgL2wgMHg0MDkgL2kgIi4uXC4uIiAvZCAiUE5HX05PX1BFREFOVElDX1dBUk5JTkdTIiAvZCAiTkRFQlVHIg0KLUJTQzMyPWJzY21ha2UuZXhlDQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQotIyBBREQgQlNDMzIgL25vbG9nbw0KLUxJQjMyPWxpbmsuZXhlIC1saWINCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28NCi0jIEFERCBMSUIzMiAvbm9sb2dvDQotDQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYnBuZyAtIFdpbjMyIExJQiBEZWJ1ZyINCi0NCi0jIFBST1AgQkFTRSBVc2VfTUZDIDANCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJsaWJwbmdfX19XaW4zMl9MSUJfRGVidWciDQotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAibGlicG5nX19fV2luMzJfTElCX0RlYnVnIg0KLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCi0jIFBST1AgVXNlX01GQyAwDQotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9MSUJfRGVidWciDQotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0xJQl9EZWJ1ZyINCi0jIFBST1AgVGFyZ2V0X0RpciAiIg0KLUNQUD1jbC5leGUNCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0ZEIC9HWiAvYw0KLSMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYIC9ZYyAvWXUNCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL1pJIC9PZCAvSSAiLi5cLi4iIC9JICIuLlwuLlwuLlx6bGliIiAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJERUJVRyIgL0QgUE5HX0RFQlVHPTEgL0ZEIC9HWiAvYw0KLSMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQotUlNDPXJjLmV4ZQ0KLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJQTkdfTk9fUEVEQU5USUNfV0FSTklOR1MiIC9kICJfREVCVUciDQotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJQTkdfTk9fUEVEQU5USUNfV0FSTklOR1MiIC9kICJfREVCVUciDQotQlNDMzI9YnNjbWFrZS5leGUNCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCi0jIEFERCBCU0MzMiAvbm9sb2dvDQotTElCMzI9bGluay5leGUgLWxpYg0KLSMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KLSMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiV2luMzJfTElCX0RlYnVnXGxpYnBuZ2QubGliIg0KLQ0KLSFFTkRJRiANCi0NCi0jIEJlZ2luIFRhcmdldA0KLQ0KLSMgTmFtZSAibGlicG5nIC0gV2luMzIgRExMIFJlbGVhc2UiDQotIyBOYW1lICJsaWJwbmcgLSBXaW4zMiBETEwgRGVidWciDQotIyBOYW1lICJsaWJwbmcgLSBXaW4zMiBETEwgVkIiDQotIyBOYW1lICJsaWJwbmcgLSBXaW4zMiBMSUIgUmVsZWFzZSINCi0jIE5hbWUgImxpYnBuZyAtIFdpbjMyIExJQiBEZWJ1ZyINCi0jIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQotDQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5ccG5nLmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5ccG5nZXJyb3IuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlxwbmdnZXQuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlxwbmdtZW0uYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlxwbmdwcmVhZC5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXHBuZ3JlYWQuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlxwbmdyaW8uYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlxwbmdydHJhbi5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXHBuZ3J1dGlsLmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5ccG5nc2V0LmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5ccG5ndHJhbnMuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlxzY3JpcHRzXHBuZ3dpbi5kZWYNCi0NCi0hSUYgICIkKENGRykiID09ICJsaWJwbmcgLSBXaW4zMiBETEwgUmVsZWFzZSINCi0NCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlicG5nIC0gV2luMzIgRExMIERlYnVnIg0KLQ0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJwbmcgLSBXaW4zMiBETEwgVkIiDQotDQotIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQotDQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYnBuZyAtIFdpbjMyIExJQiBSZWxlYXNlIg0KLQ0KLSMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQ0KLQ0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJwbmcgLSBXaW4zMiBMSUIgRGVidWciDQotDQotIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQotDQotIUVORElGIA0KLQ0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlxwbmd3aW8uYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlxwbmd3cml0ZS5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXHBuZ3d0cmFuLmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5ccG5nd3V0aWwuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBFbmQgR3JvdXANCi0jIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQotDQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5ccG5nLmgNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5ccG5nY29uZi5oDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXHBuZ3ByaXYuaA0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBFbmQgR3JvdXANCi0jIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyINCi0NCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXHNjcmlwdHNccG5nd2luLnJjDQotDQotIUlGICAiJChDRkcpIiA9PSAibGlicG5nIC0gV2luMzIgRExMIFJlbGVhc2UiDQotDQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYnBuZyAtIFdpbjMyIERMTCBEZWJ1ZyINCi0NCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlicG5nIC0gV2luMzIgRExMIFZCIg0KLQ0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJwbmcgLSBXaW4zMiBMSUIgUmVsZWFzZSINCi0NCi0jIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCi0NCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlicG5nIC0gV2luMzIgTElCIERlYnVnIg0KLQ0KLSMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQ0KLQ0KLSFFTkRJRiANCi0NCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgRW5kIEdyb3VwDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uXFJFQURNRS50eHQNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgRW5kIFRhcmdldA0KLSMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM2L2xpYnBuZy5kc3cgYi9zcmMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM2L2xpYnBuZy5kc3cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOTg2NDYuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNi9saWJwbmcuZHN3CisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gV29ya3NwYWNlIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCi0jIFdBUk5JTkc6IERPIE5PVCBFRElUIE9SIERFTEVURSBUSElTIFdPUktTUEFDRSBGSUxFIQ0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1Qcm9qZWN0OiAibGlicG5nIj0iLlxsaWJwbmcuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQotDQotUGFja2FnZT08NT4NCi17e3sNCi19fX0NCi0NCi1QYWNrYWdlPTw0Pg0KLXt7ew0KLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCi0gICAgUHJvamVjdF9EZXBfTmFtZSB6bGliDQotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCi19fX0NCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotUHJvamVjdDogInBuZ3Rlc3QiPSIuXHBuZ3Rlc3QuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQotDQotUGFja2FnZT08NT4NCi17e3sNCi19fX0NCi0NCi1QYWNrYWdlPTw0Pg0KLXt7ew0KLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCi0gICAgUHJvamVjdF9EZXBfTmFtZSBsaWJwbmcNCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KLX19fQ0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1Qcm9qZWN0OiAiemxpYiI9Ii4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzZcemxpYi5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4NCi0NCi1QYWNrYWdlPTw1Pg0KLXt7ew0KLX19fQ0KLQ0KLVBhY2thZ2U9PDQ+DQote3t7DQotfX19DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUdsb2JhbDoNCi0NCi1QYWNrYWdlPTw1Pg0KLXt7ew0KLX19fQ0KLQ0KLVBhY2thZ2U9PDM+DQote3t7DQotfX19DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzYvcG5ndGVzdC5kc3AgYi9zcmMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM2L3BuZ3Rlc3QuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2NiMDY4Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzYvcG5ndGVzdC5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJwbmd0ZXN0IiAtIFBhY2thZ2UgT3duZXI9PDQ+DQotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KLSMgKiogRE8gTk9UIEVESVQgKioNCi0NCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMNCi0NCi1DRkc9cG5ndGVzdCAtIFdpbjMyIERMTCBSZWxlYXNlDQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KLSFNRVNTQUdFIA0KLSFNRVNTQUdFIE5NQUtFIC9mICJwbmd0ZXN0Lm1hayIuDQotIU1FU1NBR0UgDQotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KLSFNRVNTQUdFIA0KLSFNRVNTQUdFIE5NQUtFIC9mICJwbmd0ZXN0Lm1hayIgQ0ZHPSJwbmd0ZXN0IC0gV2luMzIgRExMIFJlbGVhc2UiDQotIU1FU1NBR0UgDQotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQotIU1FU1NBR0UgDQotIU1FU1NBR0UgInBuZ3Rlc3QgLSBXaW4zMiBETEwgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCi0hTUVTU0FHRSAicG5ndGVzdCAtIFdpbjMyIERMTCBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCi0hTUVTU0FHRSAicG5ndGVzdCAtIFdpbjMyIExJQiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KLSFNRVNTQUdFICJwbmd0ZXN0IC0gV2luMzIgTElCIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KLSFNRVNTQUdFIA0KLQ0KLSMgQmVnaW4gUHJvamVjdA0KLSMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQotQ1BQPWNsLmV4ZQ0KLVJTQz1yYy5leGUNCi0NCi0hSUYgICIkKENGRykiID09ICJwbmd0ZXN0IC0gV2luMzIgRExMIFJlbGVhc2UiDQotDQotIyBQUk9QIEJBU0UgVXNlX01GQyAwDQotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAicG5ndGVzdF9fX1dpbjMyX0RMTF9SZWxlYXNlIg0KLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInBuZ3Rlc3RfX19XaW4zMl9ETExfUmVsZWFzZSINCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQotIyBQUk9QIFVzZV9NRkMgMA0KLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCi0jIFBST1AgT3V0cHV0X0RpciAiV2luMzJfRExMX1JlbGVhc2UiDQotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0RMTF9SZWxlYXNlIg0KLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQotIyBQUk9QIFRhcmdldF9EaXIgIiINCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRkQgL2MNCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWA0KLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9JICIuLlwuLlwuLlx6bGliIiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJQTkdfRExMIiAvRCAiUE5HX05PX1NURElPIiAvRkQgL2MNCi0jIFNVQlRSQUNUIENQUCAvWVgNCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KLUJTQzMyPWJzY21ha2UuZXhlDQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQotIyBBREQgQlNDMzIgL25vbG9nbw0KLUxJTkszMj1saW5rLmV4ZQ0KLSMgQUREIEJBU0UgTElOSzMyIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCi0jIEFERCBMSU5LMzIgV2luMzJfRExMX1JlbGVhc2VcbGlicG5nMTQubGliIC4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzZcV2luMzJfRExMX1JlbGVhc2VcemxpYjEubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCi0jIEJlZ2luIFNwZWNpYWwgQnVpbGQgVG9vbA0KLU91dERpcj0uXFdpbjMyX0RMTF9SZWxlYXNlDQotU09VUkNFPSIkKElucHV0UGF0aCkiDQotUG9zdEJ1aWxkX0Rlc2M9W1J1biBUZXN0XQ0KLVBvc3RCdWlsZF9DbWRzPXNldCBwYXRoPSQob3V0ZGlyKTsuLlwuLlwuLlx6bGliXHByb2plY3RzXHZpc3VhbGM2XFdpbjMyX0RMTF9SZWxlYXNlOwkkKG91dGRpcilccG5ndGVzdC5leGUgLi5cLi5ccG5ndGVzdC5wbmcNCi0jIEVuZCBTcGVjaWFsIEJ1aWxkIFRvb2wNCi0NCi0hRUxTRUlGICAiJChDRkcpIiA9PSAicG5ndGVzdCAtIFdpbjMyIERMTCBEZWJ1ZyINCi0NCi0jIFBST1AgQkFTRSBVc2VfTUZDIDANCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJwbmd0ZXN0X19fV2luMzJfRExMX0RlYnVnIg0KLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInBuZ3Rlc3RfX19XaW4zMl9ETExfRGVidWciDQotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KLSMgUFJPUCBVc2VfTUZDIDANCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0RMTF9EZWJ1ZyINCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiV2luMzJfRExMX0RlYnVnIg0KLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQotIyBQUk9QIFRhcmdldF9EaXIgIiINCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9GRCAvR1ogL2MNCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWA0KLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvWkkgL09kIC9JICIuLlwuLlwuLlx6bGliIiAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJQTkdfRExMIiAvRCAiUE5HX05PX1NURElPIiAvRkQgL0daIC9jDQotIyBTVUJUUkFDVCBDUFAgL1lYDQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyINCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyINCi1CU0MzMj1ic2NtYWtlLmV4ZQ0KLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KLSMgQUREIEJTQzMyIC9ub2xvZ28NCi1MSU5LMzI9bGluay5leGUNCi0jIEFERCBCQVNFIExJTkszMiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQotIyBBREQgTElOSzMyIFdpbjMyX0RMTF9EZWJ1Z1xsaWJwbmcxNGQubGliIC4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzZcV2luMzJfRExMX0RlYnVnXHpsaWIxZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KLSMgQmVnaW4gU3BlY2lhbCBCdWlsZCBUb29sDQotT3V0RGlyPS5cV2luMzJfRExMX0RlYnVnDQotU09VUkNFPSIkKElucHV0UGF0aCkiDQotUG9zdEJ1aWxkX0Rlc2M9W1J1biBUZXN0XQ0KLVBvc3RCdWlsZF9DbWRzPXNldCBwYXRoPSQob3V0ZGlyKTsuLlwuLlwuLlx6bGliXHByb2plY3RzXHZpc3VhbGM2XFdpbjMyX0RMTF9EZWJ1ZzsJJChvdXRkaXIpXHBuZ3Rlc3QuZXhlIC4uXC4uXHBuZ3Rlc3QucG5nDQotIyBFbmQgU3BlY2lhbCBCdWlsZCBUb29sDQotDQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInBuZ3Rlc3QgLSBXaW4zMiBMSUIgUmVsZWFzZSINCi0NCi0jIFBST1AgQkFTRSBVc2VfTUZDIDANCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJwbmd0ZXN0X19fV2luMzJfTElCX1JlbGVhc2UiDQotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAicG5ndGVzdF9fX1dpbjMyX0xJQl9SZWxlYXNlIg0KLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCi0jIFBST1AgVXNlX01GQyAwDQotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9MSUJfUmVsZWFzZSINCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiV2luMzJfTElCX1JlbGVhc2UiDQotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCi0jIFBST1AgVGFyZ2V0X0RpciAiIg0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9GRCAvYw0KLSMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYDQotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0kgIi4uXC4uXC4uXHpsaWIiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0ZEIC9jDQotIyBTVUJUUkFDVCBDUFAgL1lYDQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyINCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyINCi1CU0MzMj1ic2NtYWtlLmV4ZQ0KLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KLSMgQUREIEJTQzMyIC9ub2xvZ28NCi1MSU5LMzI9bGluay5leGUNCi0jIEFERCBCQVNFIExJTkszMiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2DQotIyBBREQgTElOSzMyIFdpbjMyX0xJQl9SZWxlYXNlXGxpYnBuZy5saWIgLi5cLi5cLi5cemxpYlxwcm9qZWN0c1x2aXN1YWxjNlxXaW4zMl9MSUJfUmVsZWFzZVx6bGliLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2DQotIyBCZWdpbiBTcGVjaWFsIEJ1aWxkIFRvb2wNCi1PdXREaXI9LlxXaW4zMl9MSUJfUmVsZWFzZQ0KLVNPVVJDRT0iJChJbnB1dFBhdGgpIg0KLVBvc3RCdWlsZF9EZXNjPVtSdW4gVGVzdF0NCi1Qb3N0QnVpbGRfQ21kcz0kKG91dGRpcilccG5ndGVzdC5leGUgLi5cLi5ccG5ndGVzdC5wbmcNCi0jIEVuZCBTcGVjaWFsIEJ1aWxkIFRvb2wNCi0NCi0hRUxTRUlGICAiJChDRkcpIiA9PSAicG5ndGVzdCAtIFdpbjMyIExJQiBEZWJ1ZyINCi0NCi0jIFBST1AgQkFTRSBVc2VfTUZDIDANCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJwbmd0ZXN0X19fV2luMzJfTElCX0RlYnVnIg0KLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInBuZ3Rlc3RfX19XaW4zMl9MSUJfRGVidWciDQotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KLSMgUFJPUCBVc2VfTUZDIDANCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0xJQl9EZWJ1ZyINCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiV2luMzJfTElCX0RlYnVnIg0KLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQotIyBQUk9QIFRhcmdldF9EaXIgIiINCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9GRCAvR1ogL2MNCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWA0KLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvWkkgL09kIC9JICIuLlwuLlwuLlx6bGliIiAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9GRCAvR1ogL2MNCi0jIFNVQlRSQUNUIENQUCAvWVgNCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KLUJTQzMyPWJzY21ha2UuZXhlDQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQotIyBBREQgQlNDMzIgL25vbG9nbw0KLUxJTkszMj1saW5rLmV4ZQ0KLSMgQUREIEJBU0UgTElOSzMyIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCi0jIEFERCBMSU5LMzIgV2luMzJfTElCX0RlYnVnXGxpYnBuZ2QubGliIC4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzZcV2luMzJfTElCX0RlYnVnXHpsaWJkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQotIyBCZWdpbiBTcGVjaWFsIEJ1aWxkIFRvb2wNCi1PdXREaXI9LlxXaW4zMl9MSUJfRGVidWcNCi1TT1VSQ0U9IiQoSW5wdXRQYXRoKSINCi1Qb3N0QnVpbGRfRGVzYz1bUnVuIFRlc3RdDQotUG9zdEJ1aWxkX0NtZHM9JChvdXRkaXIpXHBuZ3Rlc3QuZXhlIC4uXC4uXHBuZ3Rlc3QucG5nDQotIyBFbmQgU3BlY2lhbCBCdWlsZCBUb29sDQotDQotIUVORElGIA0KLQ0KLSMgQmVnaW4gVGFyZ2V0DQotDQotIyBOYW1lICJwbmd0ZXN0IC0gV2luMzIgRExMIFJlbGVhc2UiDQotIyBOYW1lICJwbmd0ZXN0IC0gV2luMzIgRExMIERlYnVnIg0KLSMgTmFtZSAicG5ndGVzdCAtIFdpbjMyIExJQiBSZWxlYXNlIg0KLSMgTmFtZSAicG5ndGVzdCAtIFdpbjMyIExJQiBEZWJ1ZyINCi0jIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQotDQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5ccG5ndGVzdC5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEVuZCBHcm91cA0KLSMgRW5kIFRhcmdldA0KLSMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9QUkowMDQxLm1hayBiL3NyYy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1BSSjAwNDEubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTVlMTJiLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1BSSjAwNDEubWFrCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyBQcmV2ZW50ICJDYW5ub3QgZmluZCBtaXNzaW5nIGRlcGVuZGVuY3kuLi4iIHdhcm5pbmdzIHdoaWxlIGNvbXBpbGluZwotIyBwbmd3aW4ucmMgKFBSSjAwNDEpLgotCi1hbGw6ICQoSW50RGlyKVxhbGxvYy5oIFwKLQkgJChJbnREaXIpXGZwLmggXAotCSAkKEludERpcilcbTY4ODgxLmggXAotCSAkKEludERpcilcbWVtLmggXAotCSAkKEludERpcilccG5ndXNyLmggXAotCSAkKEludERpcilcc3RyaW5ncy5oIFwKLQkgJChJbnREaXIpXHVuaXN0ZC5oIFwKLQkgJChJbnREaXIpXHVuaXhpby5oCi0JIAotJChJbnREaXIpXGFsbG9jLmggXAotJChJbnREaXIpXGZwLmggXAotJChJbnREaXIpXG02ODg4MS5oIFwKLSQoSW50RGlyKVxtZW0uaCBcCi0kKEludERpcilccG5ndXNyLmggXAotJChJbnREaXIpXHN0cmluZ3MuaCBcCi0kKEludERpcilcdW5pc3RkLmggXAotJChJbnREaXIpXHVuaXhpby5oOgotCUAhZWNoby4+JEAKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1JFQURNRS50eHQgYi9zcmMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTVhODJhLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1NaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUsIEZvcm1hdCBWZXJzaW9uIDcuMTAgZm9yIGxpYnBuZy4KLQotQ29weXJpZ2h0IChDKSAyMDA0IFNpbW9uLVBpZXJyZSBDYWRpZXV4LgotCi1UaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0KLU5PVEU6IFRoaXMgcHJvamVjdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBsaWJwbmctMS41LjAuICBJdCBoYXMKLWJlZW4gcmVwbGFjZWQgd2l0aCB0aGUgInZzdHVkaW8iIHByb2plY3QuCi0KLUFzc3VtcHRpb25zOgotKiBUaGUgbGlicG5nIHNvdXJjZSBmaWxlcyBhcmUgaW4gLi5cLi4KLSogVGhlIHpsaWIgc291cmNlIGZpbGVzIGFyZSBpbiAuLlwuLlwuLlx6bGliCi0qIFRoZSB6bGliIHByb2plY3QgZmlsZSBpcyBpbiAuIC8qIFdhcm5pbmc6IFRoaXMgaXMgdW50aWwgdGhlIHpsaWIgcHJvamVjdAotICBmaWxlcyBnZXQgaW50ZXJncmF0ZWQgaW50byB0aGUgbmV4dCB6bGliIHJlbGVhc2UuIFRoZSBmaW5hbCB6bGliIHByb2plY3QKLSAgZGlyZWN0b3J5IHdpbGwgdGhlbiBiZSAuLlwuLlwuLlx6bGliXHByb2plY3RzXHZpc3VhbGM3MS4gKi8KLQotVG8gdXNlOgotCi0xKSBPbiB0aGUgbWFpbiBtZW51LCBzZWxlY3QgIkZpbGUgfCBPcGVuIFNvbHV0aW9uIi4KLSAgIE9wZW4gImxpYnBuZy5zbG4iLgotCi0yKSBEaXNwbGF5IHRoZSBTb2x1dGlvbiBFeHBsb3JlciB2aWV3IChDdHJsK0FsdCtMKQotCi0zKSBTZXQgb25lIG9mIHRoZSBwcm9qZWN0IGFzIHRoZSBTdGFydFVwIHByb2plY3QuIElmIHlvdSBqdXN0IHdhbnQgdG8gYnVpbGQgdGhlCi0gICBiaW5hcmllcyBzZXQgImxpYnBuZyIgYXMgdGhlIHN0YXJ0dXAgcHJvamVjdCAoU2VsZWN0ICJsaWJwbmciIHRyZWUgdmlldwotICAgaXRlbSArIFByb2plY3QgfCBTZXQgYXMgU3RhcnRVcCBwcm9qZWN0KS4gSWYgeW91IHdhbnQgdG8gYnVpbGQgYW5kIHRlc3QgdGhlCi0gICBiaW5hcmllcyBzZXQgaXQgdG8gInBuZ3Rlc3QiIChTZWxlY3QgInBuZ3Rlc3QiIHRyZWUgdmlldyBpdGVtICsKLSAgIFByb2plY3QgfCBTZXQgYXMgU3RhcnRVcCBwcm9qZWN0KQotCi00KSBTZWxlY3QgIkJ1aWxkIHwgQ29uZmlndXJhdGlvbiBNYW5hZ2VyLi4uIi4KLSAgIENob29zZSB0aGUgY29uZmlndXJhdGlvbiB5b3Ugd2lzaCB0byBidWlsZC4KLQotNSkgU2VsZWN0ICJCdWlsZCB8IENsZWFuIFNvbHV0aW9uIi4KLQotNikgU2VsZWN0ICJCdWlsZCB8IEJ1aWxkIFNvbHV0aW9uIChDdHJsLVNoaWZ0LUIpIgotCi1UaGlzIHByb2plY3QgYnVpbGRzIHRoZSBsaWJwbmcgYmluYXJpZXMgYXMgZm9sbG93czoKLQotKiBXaW4zMl9ETExfUmVsZWFzZVxsaWJwbmcxNC5kbGwgICAgICBETEwgYnVpbGQKLSogV2luMzJfRExMX0RlYnVnXGxpYnBuZzE0ZC5kbGwgICAgICAgRExMIGJ1aWxkIChkZWJ1ZyB2ZXJzaW9uKQotKiBXaW4zMl9ETExfVkJcbGlicG5nMTR2Yi5kbGwgICAgICAgICBETEwgYnVpbGQgZm9yIFZpc3VhbCBCYXNpYywgdXNpbmcgc3RkY2FsbAotKiBXaW4zMl9MSUJfUmVsZWFzZVxsaWJwbmcubGliICAgICAgICBzdGF0aWMgYnVpbGQKLSogV2luMzJfTElCX0RlYnVnXGxpYnBuZ2QubGliICAgICAgICAgc3RhdGljIGJ1aWxkIChkZWJ1ZyB2ZXJzaW9uKQotCi1Ob3RlczoKLQotSWYgeW91IGNoYW5nZSBhbnl0aGluZyBpbiB0aGUgc291cmNlIGZpbGVzLCBvciBzZWxlY3QgZGlmZmVyZW50IGNvbXBpbGVyCi1zZXR0aW5ncywgcGxlYXNlIGNoYW5nZSB0aGUgRExMIG5hbWUgdG8gc29tZXRoaW5nIGRpZmZlcmVudCB0aGFuIGFueSBvZgotdGhlIGFib3ZlIG5hbWVzLiBBbHNvLCBtYWtlIHN1cmUgdGhhdCBpbiB5b3VyICJwbmd1c3IuaCIgeW91IGRlZmluZQotUE5HX1VTRVJfUFJJVkFURUJVSUxEIGFuZCBQTkdfVVNFUl9ETExGTkFNRV9QT1NURklYIGFjY29yZGluZyB0byB0aGUKLWluc3RydWN0aW9ucyBwcm92aWRlZCBpbiAicG5nY29uZi5oIi4KLQotQWxsIERMTHMgYnVpbHQgYnkgdGhpcyBwcm9qZWN0IHVzZSB0aGUgTWljcm9zb2Z0IGR5bmFtaWMgQyBydW50aW1lIGxpYnJhcnkKLU1TVkNSNzEuRExMIChNU1ZDUjcxRC5ETEwgZm9yIGRlYnVnIHZlcnNpb25zKS4gIElmIHlvdSBkaXN0cmlidXRlIGFueSBvZiB0aGUKLWFib3ZlIG1lbnRpb25lZCBsaWJyYXJpZXMgeW91IG1heSBoYXZlIHRvIGluY2x1ZGUgdGhpcyBETEwgaW4geW91ciBwYWNrYWdlLgotRm9yIGEgbGlzdCBvZiBmaWxlcyB0aGF0IGFyZSByZWRpc3RyaWJ1dGFibGUgaW4gVmlzdWFsIFN0dWRpbyBzZWUKLSQoVkNJTlNUQUxMRElSKVxyZWRpc3QudHh0LgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvUkVBRE1FX3psaWIudHh0IGIvc3JjL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvUkVBRE1FX3psaWIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWQxMWNiLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1JFQURNRV96bGliLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIFdBUk5JTkc6IFRoaXMgZmlsZSB3YXMgcHV0IGluIHRoZSBMaWJQTkcgZGlzdHJpYnV0aW9uIGZvciBjb252ZW5pZW5jZSBvbmx5LgotICAgICAgICAgICAgSXQgaXMgZXhwZWN0ZWQgdG8gYmUgcGFydCBvZiB0aGUgbmV4dCB6bGliIHJlbGVhc2UgdW5kZXIKLSAgICAgICAgICAgICJwcm9qZWN0c1x2aXN1YWxjNzFcUkVBRE1FLnR4dC4iICovCi0KLU1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSwgRm9ybWF0IFZlcnNpb24gNy4xMCBmb3IgemxpYi4KLQotQ29weXJpZ2h0IChDKSAyMDA0IFNpbW9uLVBpZXJyZSBDYWRpZXV4LgotQ29weXJpZ2h0IChDKSAyMDA0IENvc21pbiBUcnV0YS4KLQotVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLUZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmguCi0KLU5PVEU6IFRoaXMgcHJvamVjdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBsaWJwbmctMS41LjAuICBJdCBoYXMKLWJlZW4gcmVwbGFjZWQgd2l0aCB0aGUgInZzdHVkaW8iIHByb2plY3QuCi0KLVRvIHVzZToKLQotMSkgT24gdGhlIG1haW4gbWVudSwgc2VsZWN0ICJGaWxlIHwgT3BlbiBTb2x1dGlvbiIuCi0gICBPcGVuICJ6bGliLnNsbiIuCi0KLTIpIERpc3BsYXkgdGhlIFNvbHV0aW9uIEV4cGxvcmVyIHZpZXcgKEN0cmwrQWx0K0wpCi0KLTMpIFNldCBvbmUgb2YgdGhlIHByb2plY3QgYXMgdGhlIFN0YXJ0VXAgcHJvamVjdC4gSWYgeW91IGp1c3Qgd2FudCB0byBidWlsZCB0aGUKLSAgIGJpbmFyaWVzIHNldCAiemxpYiIgYXMgdGhlIHN0YXJ0dXAgcHJvamVjdCAoU2VsZWN0ICJ6bGliIiB0cmVlIHZpZXcgaXRlbSArCi0gICBQcm9qZWN0IHwgU2V0IGFzIFN0YXJ0VXAgcHJvamVjdCkuIElmIHlvdSB3YW50IHRvIGJ1aWxkIGFuZCB0ZXN0IHRoZQotICAgYmluYXJpZXMgc2V0IGl0IHRvICJleGFtcGxlIiAoU2VsZWN0ICJleGFtcGxlIiB0cmVlIHZpZXcgaXRlbSArIFByb2plY3QgfAotICAgU2V0IGFzIFN0YXJ0VXAgcHJvamVjdCksIElmIHlvdSB3YW50IHRvIGJ1aWxkIHRoZSBtaW5pZ3ppcCB1dGlsaXR5IHNldCBpdCB0bwotICAgIm1pbmlnemlwIiAoU2VsZWN0ICJtaW5pZ3ppcCIgdHJlZSB2aWV3IGl0ZW0gKyBQcm9qZWN0IHwgU2V0IGFzIFN0YXJ0VXAKLSAgIHByb2plY3QKLQotNCkgU2VsZWN0ICJCdWlsZCB8IENvbmZpZ3VyYXRpb24gTWFuYWdlci4uLiIuCi0gICBDaG9vc2UgdGhlIGNvbmZpZ3VyYXRpb24geW91IHdpc2ggdG8gYnVpbGQuCi0KLTUpIFNlbGVjdCAiQnVpbGQgfCBDbGVhbiBTb2x1dGlvbiIuCi0KLTYpIFNlbGVjdCAiQnVpbGQgfCBCdWlsZCBTb2x1dGlvbiAoQ3RybC1TaGlmdC1CKSIKLQotVGhpcyBwcm9qZWN0IGJ1aWxkcyB0aGUgemxpYiBiaW5hcmllcyBhcyBmb2xsb3dzOgotCi0qIFdpbjMyX0RMTF9SZWxlYXNlXHpsaWIxLmRsbCAgICAgICBETEwgYnVpbGQKLSogV2luMzJfRExMX0RlYnVnXHpsaWIxZC5kbGwgICAgICAgIERMTCBidWlsZCAoZGVidWcgdmVyc2lvbikKLSogV2luMzJfTElCX1JlbGVhc2VcemxpYi5saWIgICAgICAgIHN0YXRpYyBidWlsZAotKiBXaW4zMl9MSUJfRGVidWdcemxpYmQubGliICAgICAgICAgc3RhdGljIGJ1aWxkIChkZWJ1ZyB2ZXJzaW9uKQotCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vbGlicG5nL2xpYnBuZy52Y3hwcm9qIGIvc3JjL2xpYnBuZy9wcm9qZWN0cy92c3R1ZGlvL2xpYnBuZy9saWJwbmcudmN4cHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNkNGViNS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vbGlicG5nL2xpYnBuZy52Y3hwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KLSAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWcgTGlicmFyeXxXaW4zMiI+Ci0gICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZyBMaWJyYXJ5PC9Db25maWd1cmF0aW9uPgotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KLSAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgotICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+Ci0gICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSBMaWJyYXJ5fFdpbjMyIj4KLSAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2UgTGlicmFyeTwvQ29uZmlndXJhdGlvbj4KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+Ci0gICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KLSAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgotICA8L0l0ZW1Hcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgotICAgIDxQcm9qZWN0R3VpZD57RDY5NzMwNzYtOTMxNy00RUYyLUEwQjgtQjdBMThBQzA3MTNFfTwvUHJvamVjdEd1aWQ+Ci0gICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPgotICAgIDxSb290TmFtZXNwYWNlPmxpYnBuZzwvUm9vdE5hbWVzcGFjZT4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPgotICA8SW1wb3J0IFByb2plY3Q9IiQoU29sdXRpb25EaXIpXHpsaWIucHJvcHMiIC8+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+Ci0gICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KLSAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgotICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTGlicmFyeXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KLSAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+Ci0gICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+Ci0gICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KLSAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KLSAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgotICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KLSAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPgotICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4KLSAgPC9JbXBvcnRHcm91cD4KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgotICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KLSAgPC9JbXBvcnRHcm91cD4KLSAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTGlicmFyeXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgLz4KLSAgPC9JbXBvcnRHcm91cD4KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgotICA8L0ltcG9ydEdyb3VwPgotICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgotICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIC8+Ci0gIDwvSW1wb3J0R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+Ci0gICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgotICAgIDxDdXN0b21CdWlsZEJlZm9yZVRhcmdldHM+Ci0gICAgPC9DdXN0b21CdWlsZEJlZm9yZVRhcmdldHM+Ci0gICAgPFRhcmdldE5hbWU+JChQcm9qZWN0TmFtZSkxNDwvVGFyZ2V0TmFtZT4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIj4KLSAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+Ci0gICAgPEN1c3RvbUJ1aWxkQmVmb3JlVGFyZ2V0cyAvPgotICAgIDxUYXJnZXROYW1lPiQoUHJvamVjdE5hbWUpMTQ8L1RhcmdldE5hbWU+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Ci0gICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgotICAgIDxDdXN0b21CdWlsZEJlZm9yZVRhcmdldHM+Ci0gICAgPC9DdXN0b21CdWlsZEJlZm9yZVRhcmdldHM+Ci0gICAgPFRhcmdldE5hbWU+JChQcm9qZWN0TmFtZSkxNDwvVGFyZ2V0TmFtZT4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTGlicmFyeXxXaW4zMiciPgotICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KLSAgICA8Q3VzdG9tQnVpbGRCZWZvcmVUYXJnZXRzIC8+Ci0gICAgPFRhcmdldE5hbWU+JChQcm9qZWN0TmFtZSkxNDwvVGFyZ2V0TmFtZT4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+Ci0gICAgPENsQ29tcGlsZT4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+Ci0gICAgICA8V2FybmluZ0xldmVsPkxldmVsNDwvV2FybmluZ0xldmVsPgotICAgICAgPE1pbmltYWxSZWJ1aWxkPmZhbHNlPC9NaW5pbWFsUmVidWlsZD4KLSAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPgotICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7UE5HX0JVSUxEX0RMTDtQTkdfTk9fTU9EVUxFREVGO19ERUJVRztfV0lORE9XUztfVVNSRExMOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgotICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgotICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4KLSAgICAgIDxUcmVhdFdDaGFyX3RBc0J1aWx0SW5UeXBlPmZhbHNlPC9UcmVhdFdDaGFyX3RBc0J1aWx0SW5UeXBlPgotICAgICAgPFByZWNvbXBpbGVkSGVhZGVyRmlsZT5wbmcuaDwvUHJlY29tcGlsZWRIZWFkZXJGaWxlPgotICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgotICAgICAgPENvbXBpbGVBcz5Db21waWxlQXNDPC9Db21waWxlQXM+Ci0gICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPgotICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQ5OTY7NDEyNzwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+Ci0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFpMaWJTcmNEaXIpOy4uXC4uXC4uXHNjcmlwdHM7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KLSAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPnRydWU8L1RyZWF0V2FybmluZ0FzRXJyb3I+Ci0gICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPExpbms+Ci0gICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+emxpYi5saWI7bXN2Y3J0ZC5saWI7a2VybmVsMzIubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgotICAgICAgPElnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+dHJ1ZTwvSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz4KLSAgICAgIDxWZXJzaW9uPjE0PC9WZXJzaW9uPgotICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChPdXREaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgotICAgIDwvTGluaz4KLSAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIj4KLSAgICA8Q2xDb21waWxlPgotICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWw0PC9XYXJuaW5nTGV2ZWw+Ci0gICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgotICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+Ci0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X1dJTkRPV1M7X1VTUkRMTDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KLSAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+Ci0gICAgICA8VHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT5mYWxzZTwvVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlckZpbGU+cG5nLmg8L1ByZWNvbXBpbGVkSGVhZGVyRmlsZT4KLSAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4KLSAgICAgIDxDb21waWxlQXM+Q29tcGlsZUFzQzwvQ29tcGlsZUFzPgotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KLSAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40OTk2OzQxMjc8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTsuLlwuLlwuLlxzY3JpcHRzOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Ci0gICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj50cnVlPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxMaW5rPgotICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+Ci0gICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KLSAgICA8L0xpbms+Ci0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4KLSAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Ci0gICAgPENsQ29tcGlsZT4KLSAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWw0PC9XYXJuaW5nTGV2ZWw+Ci0gICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgotICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5PgotICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgotICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7UE5HX0JVSUxEX0RMTDtQTkdfTk9fTU9EVUxFREVGO05ERUJVRztfV0lORE9XUztfVVNSRExMOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+Ci0gICAgICA8VHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT5mYWxzZTwvVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlckZpbGU+cG5nLmg8L1ByZWNvbXBpbGVkSGVhZGVyRmlsZT4KLSAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4KLSAgICAgIDxDb21waWxlQXM+Q29tcGlsZUFzQzwvQ29tcGlsZUFzPgotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KLSAgICAgIDxNaW5pbWFsUmVidWlsZD5mYWxzZTwvTWluaW1hbFJlYnVpbGQ+Ci0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDk5Njs0MTI3PC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYjFEaXIpOy4uXC4uXC4uXHNjcmlwdHM7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KLSAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPnRydWU8L1RyZWF0V2FybmluZ0FzRXJyb3I+Ci0gICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8TGluaz4KLSAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgotICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+Ci0gICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgotICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+Ci0gICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz56ZGxsLmxpYjttc3ZjcnQubGliO2tlcm5lbDMyLmxpYjwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KLSAgICAgIDxJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPnRydWU8L0lnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+Ci0gICAgICA8VmVyc2lvbj4xNDwvVmVyc2lvbj4KLSAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoWkxpYjFEaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgotICAgIDwvTGluaz4KLSAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTGlicmFyeXxXaW4zMiciPgotICAgIDxDbENvbXBpbGU+Ci0gICAgICA8V2FybmluZ0xldmVsPkxldmVsNDwvV2FybmluZ0xldmVsPgotICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KLSAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4KLSAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KLSAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfV0lORE9XUztfVVNSRExMOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+Ci0gICAgICA8VHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT5mYWxzZTwvVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlckZpbGU+cG5nLmg8L1ByZWNvbXBpbGVkSGVhZGVyRmlsZT4KLSAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4KLSAgICAgIDxDb21waWxlQXM+Q29tcGlsZUFzQzwvQ29tcGlsZUFzPgotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KLSAgICAgIDxNaW5pbWFsUmVidWlsZD5mYWxzZTwvTWluaW1hbFJlYnVpbGQ+Ci0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDk5Njs0MTI3PC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYjFEaXIpOy4uXC4uXC4uXHNjcmlwdHM7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KLSAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPnRydWU8L1RyZWF0V2FybmluZ0FzRXJyb3I+Ci0gICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8TGluaz4KLSAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgotICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+Ci0gICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgotICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+Ci0gICAgPC9MaW5rPgotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmcuYyI+Ci0gICAgICA8UHJlY29tcGlsZWRIZWFkZXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkNyZWF0ZTwvUHJlY29tcGlsZWRIZWFkZXI+Ci0gICAgICA8UHJlY29tcGlsZWRIZWFkZXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyI+Q3JlYXRlPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5DcmVhdGU8L1ByZWNvbXBpbGVkSGVhZGVyPgotICAgICAgPFByZWNvbXBpbGVkSGVhZGVyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyI+Q3JlYXRlPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ2Vycm9yLmMiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmdnZXQuYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ21lbS5jIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5ccG5ncHJlYWQuYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ3JlYWQuYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ3Jpby5jIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5ccG5ncnRyYW4uYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ3J1dGlsLmMiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmdzZXQuYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ3RyYW5zLmMiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmd3aW8uYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ3dyaXRlLmMiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmd3dHJhbi5jIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5ccG5nd3V0aWwuYyIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPFJlc291cmNlQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzY3JpcHRzXHBuZ3dpbi5yYyI+Ci0gICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+Ci0gICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4KLSAgICA8L1Jlc291cmNlQ29tcGlsZT4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+Ci0gIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+Ci0gIDwvSW1wb3J0R3JvdXA+Ci08L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vcG5ndGVzdC9wbmd0ZXN0LnZjeHByb2ogYi9zcmMvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vcG5ndGVzdC9wbmd0ZXN0LnZjeHByb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYzQ2OTAuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9wcm9qZWN0cy92c3R1ZGlvL3BuZ3Rlc3QvcG5ndGVzdC52Y3hwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KLSAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWcgTGlicmFyeXxXaW4zMiI+Ci0gICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZyBMaWJyYXJ5PC9Db25maWd1cmF0aW9uPgotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KLSAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgotICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+Ci0gICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSBMaWJyYXJ5fFdpbjMyIj4KLSAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2UgTGlicmFyeTwvQ29uZmlndXJhdGlvbj4KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+Ci0gICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KLSAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgotICA8L0l0ZW1Hcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgotICAgIDxQcm9qZWN0R3VpZD57MjI4QkE5NjUtNTBENS00MkIyLThCQ0YtQUZDQzIyN0UzQzFEfTwvUHJvamVjdEd1aWQ+Ci0gICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPgotICAgIDxSb290TmFtZXNwYWNlPnBuZ3Rlc3Q8L1Jvb3ROYW1lc3BhY2U+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKFNvbHV0aW9uRGlyKVx6bGliLnByb3BzIiAvPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgotICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+Ci0gICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgotICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+Ci0gICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgotICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+Ci0gICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+Ci0gICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KLSAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+Ci0gIDwvSW1wb3J0R3JvdXA+Ci0gIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KLSAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+Ci0gIDwvSW1wb3J0R3JvdXA+Ci0gIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgotICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIC8+Ci0gIDwvSW1wb3J0R3JvdXA+Ci0gIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgotICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KLSAgPC9JbXBvcnRHcm91cD4KLSAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KLSAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiAvPgotICA8L0ltcG9ydEdyb3VwPgotICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgotICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KLSAgICA8Q3VzdG9tQnVpbGRBZnRlclRhcmdldHMgLz4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIj4KLSAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+Ci0gICAgPEN1c3RvbUJ1aWxkQWZ0ZXJUYXJnZXRzIC8+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Ci0gICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgotICAgIDxDdXN0b21CdWlsZEFmdGVyVGFyZ2V0cyAvPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyI+Ci0gICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgotICAgIDxDdXN0b21CdWlsZEFmdGVyVGFyZ2V0cyAvPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KLSAgICA8Q2xDb21waWxlPgotICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWw0PC9XYXJuaW5nTGV2ZWw+Ci0gICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgotICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+Ci0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTsuLlwuLlwuLlxzY3JpcHRzOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Ci0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDk5NjwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+Ci0gICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4KLSAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPnRydWU8L1RyZWF0V2FybmluZ0FzRXJyb3I+Ci0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+Ci0gICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+ZmFsc2U8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgotICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxMaW5rPgotICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+Ci0gICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KLSAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmxpYnBuZzE0LmxpYjt6bGliLmxpYjttc3ZjcnRkLmxpYjtrZXJuZWwzMi5saWI8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+Ci0gICAgICA8SWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz50cnVlPC9JZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPgotICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChPdXREaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgotICAgIDwvTGluaz4KLSAgICA8Q3VzdG9tQnVpbGRTdGVwPgotICAgICAgPE1lc3NhZ2U+RXhlY3V0aW5nIFBORyB0ZXN0IHByb2dyYW08L01lc3NhZ2U+Ci0gICAgICA8Q29tbWFuZD4iJChPdXREaXIpcG5ndGVzdC5leGUiIC4uXC4uXC4uXHBuZ3Rlc3QucG5nICIkKEludERpcilwbmdvdXQucG5nIjwvQ29tbWFuZD4KLSAgICAgIDxPdXRwdXRzPiQoSW50RGlyKXBuZ291dC5wbmc8L091dHB1dHM+Ci0gICAgICA8SW5wdXRzPi4uXC4uXC4uXHBuZ3Rlc3QucG5nOyQoT3V0RGlyKXBuZ3Rlc3QuZXhlPC9JbnB1dHM+Ci0gICAgPC9DdXN0b21CdWlsZFN0ZXA+Ci0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4KLSAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyI+Ci0gICAgPENsQ29tcGlsZT4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+Ci0gICAgICA8V2FybmluZ0xldmVsPkxldmVsNDwvV2FybmluZ0xldmVsPgotICAgICAgPE1pbmltYWxSZWJ1aWxkPmZhbHNlPC9NaW5pbWFsUmVidWlsZD4KLSAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KLSAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPgotICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYlNyY0Rpcik7Li5cLi5cLi5cc2NyaXB0czslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgotICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQ5OTY8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgotICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+Ci0gICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj50cnVlPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgotICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+Ci0gICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPgotICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPmZhbHNlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KLSAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8TGluaz4KLSAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgotICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+Ci0gICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5saWJwbmcxNC5saWI7emxpYi5saWI7bXN2Y3J0ZC5saWI7a2VybmVsMzIubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgotICAgICAgPElnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+dHJ1ZTwvSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz4KLSAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoT3V0RGlyKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4KLSAgICA8L0xpbms+Ci0gICAgPEN1c3RvbUJ1aWxkU3RlcD4KLSAgICAgIDxNZXNzYWdlPkV4ZWN1dGluZyBQTkcgdGVzdCBwcm9ncmFtPC9NZXNzYWdlPgotICAgICAgPENvbW1hbmQ+IiQoT3V0RGlyKXBuZ3Rlc3QuZXhlIiAuLlwuLlwuLlxwbmd0ZXN0LnBuZyAiJChJbnREaXIpcG5nb3V0LnBuZyI8L0NvbW1hbmQ+Ci0gICAgICA8T3V0cHV0cz4kKEludERpcilwbmdvdXQucG5nPC9PdXRwdXRzPgotICAgICAgPElucHV0cz4uLlwuLlwuLlxwbmd0ZXN0LnBuZzskKE91dERpcilwbmd0ZXN0LmV4ZTwvSW5wdXRzPgotICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+Ci0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgotICAgIDxDbENvbXBpbGU+Ci0gICAgICA8V2FybmluZ0xldmVsPkxldmVsNDwvV2FybmluZ0xldmVsPgotICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KLSAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPgotICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5PgotICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPmZhbHNlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KLSAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFpMaWIxRGlyKTsuLlwuLlwuLlxzY3JpcHRzOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Ci0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDk5NjwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+Ci0gICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4KLSAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPnRydWU8L1RyZWF0V2FybmluZ0FzRXJyb3I+Ci0gICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPgotICAgICAgPE1pbmltYWxSZWJ1aWxkPmZhbHNlPC9NaW5pbWFsUmVidWlsZD4KLSAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8TGluaz4KLSAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgotICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+Ci0gICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgotICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+Ci0gICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5saWJwbmcxNC5saWI7bXN2Y3J0LmxpYjtrZXJuZWwzMi5saWI8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+Ci0gICAgICA8SWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz50cnVlPC9JZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPgotICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChPdXREaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgotICAgIDwvTGluaz4KLSAgICA8Q3VzdG9tQnVpbGRTdGVwPgotICAgICAgPE1lc3NhZ2U+RXhlY3V0aW5nIFBORyB0ZXN0IHByb2dyYW08L01lc3NhZ2U+Ci0gICAgICA8Q29tbWFuZD4iJChPdXREaXIpcG5ndGVzdC5leGUiIC4uXC4uXC4uXHBuZ3Rlc3QucG5nICIkKEludERpcilwbmdvdXQucG5nIjwvQ29tbWFuZD4KLSAgICAgIDxPdXRwdXRzPiQoSW50RGlyKXBuZ291dC5wbmc8L091dHB1dHM+Ci0gICAgICA8SW5wdXRzPi4uXC4uXC4uXHBuZ3Rlc3QucG5nOyQoT3V0RGlyKXBuZ3Rlc3QuZXhlPC9JbnB1dHM+Ci0gICAgPC9DdXN0b21CdWlsZFN0ZXA+Ci0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4KLSAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIj4KLSAgICA8Q2xDb21waWxlPgotICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDQ8L1dhcm5pbmdMZXZlbD4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+Ci0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+Ci0gICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4KLSAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4KLSAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz5mYWxzZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+Ci0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliMURpcik7Li5cLi5cLi5cc2NyaXB0czslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgotICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQ5OTY8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgotICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+Ci0gICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj50cnVlPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KLSAgICAgIDxNaW5pbWFsUmVidWlsZD5mYWxzZTwvTWluaW1hbFJlYnVpbGQ+Ci0gICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPExpbms+Ci0gICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KLSAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgotICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlicG5nMTQubGliO3psaWIubGliO21zdmNydC5saWI7a2VybmVsMzIubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgotICAgICAgPElnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+dHJ1ZTwvSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz4KLSAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoT3V0RGlyKTskKFpMaWIxRGlyKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4KLSAgICA8L0xpbms+Ci0gICAgPEN1c3RvbUJ1aWxkU3RlcD4KLSAgICAgIDxNZXNzYWdlPkV4ZWN1dGluZyBQTkcgdGVzdCBwcm9ncmFtPC9NZXNzYWdlPgotICAgICAgPENvbW1hbmQ+JChPdXREaXIpcG5ndGVzdC5leGUgLi5cLi5cLi5ccG5ndGVzdC5wbmcgJChJbnREaXIpcG5nb3V0LnBuZzwvQ29tbWFuZD4KLSAgICAgIDxDb21tYW5kPiIkKE91dERpcilwbmd0ZXN0LmV4ZSIgLi5cLi5cLi5ccG5ndGVzdC5wbmcgIiQoSW50RGlyKXBuZ291dC5wbmciPC9Db21tYW5kPgotICAgICAgPE91dHB1dHM+JChJbnREaXIpcG5nb3V0LnBuZzwvT3V0cHV0cz4KLSAgICAgIDxJbnB1dHM+Li5cLi5cLi5ccG5ndGVzdC5wbmc7JChPdXREaXIpcG5ndGVzdC5leGU8L0lucHV0cz4KLSAgICA8L0N1c3RvbUJ1aWxkU3RlcD4KLSAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5ccG5ndGVzdC5jIiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4KLSAgPC9JbXBvcnRHcm91cD4KLTwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvcHJvamVjdHMvdnN0dWRpby9yZWFkbWUudHh0IGIvc3JjL2xpYnBuZy9wcm9qZWN0cy92c3R1ZGlvL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MjQwMzcuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9wcm9qZWN0cy92c3R1ZGlvL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0KLVZpc3VhbFN0dWRpbyBpbnN0cnVjdGlvbnMKLQotbGlicG5nIHZlcnNpb24gMS40LjEyIC0gSnVseSAxMCwgMjAxMgotCi1Db3B5cmlnaHQgKGMpIDE5OTgtMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLQotVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLUZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLWFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLVRoaXMgZGlyZWN0b3J5ICBjb250YWlucyBzdXBwb3J0IGZvciBidWlsZGluZyBsaWJwbmcgdW5kZXIgTWljcm9Tb2Z0Ci1WaXN1YWxTdHVkaW8gMjAxMC4gIEl0IG1heSBhbHNvIHdvcmsgdW5kZXIgbGF0ZXIgdmVyc2lvbnMgb2YgVmlzdWFsU3R1ZGlvLgotWW91IHNob3VsZCBiZSBmYW1pbGlhciB3aXRoIFZpc3VhbFN0dWRpbyBiZWZvcmUgdXNpbmcgdGhpcyBkaXJlY3RvcnkuCi0KLVRoaXMgaXMgYSBzbGlnaHRseSBtb2RpZmllZCBjb3B5IG9mIHRoZSAndnN0dWRpbycgc29sdXRpb24gZnJvbSBsaWJwbmcKLTEuNTsgaXQgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBjb21wYXRpYmlsaXR5IGZvciBsaWJwbmcgMS40IHdpdGggbGF0ZXIKLXJlbGVhc2VzIG9mIHpsaWIgKGZyb20gMS4yLjQpIGFuZCB0byBwcm92aWRlIGEgbWlncmF0aW9uIGFpZCBmb3IgMS41LgotCi1BICdWQicgRExMIGlzIG5vIGxvbmdlciBwcm9kdWNlZCAtIHVzZSB0aGUgc3RhbmRhcmQgJ1JlbGVhc2UnIERMTC4KLQotSW5pdGlhbCBwcmVwYXJhdGlvbnMKLT09PT09PT09PT09PT09PT09PT09Ci1Zb3Ugc2hvdWxkIGluc3RhbGwgdGhlICdvZmZpY2lhbCcgYnVpbGQgb2YgemxpYiBvbiB5b3VyIHN5c3RlbSAtIGZvbGxvdyB0aGUKLWluc3RydWN0aW9ucyBwcm92aWRlZCBvbiBodHRwOi8vd3d3LnpsaWIubmV0LiAgV2hlbiBhIG5ldyByZWxlYXNlIGlzIGJlaW5nCi1tYWRlIG9mIHpsaWIgdGhlIGluc3RydWN0aW9ucyBkaXNhcHBlYXIgZm9yIGEgd2hpbGUgdW50aWwgdGhlIG5ldyBvZmZpY2lhbAotYnVpbGQgaXMgYXZhaWxhYmxlLiAgWW91IHdpbGwgaGF2ZSB0byB3YWl0LgotCi1Zb3UgbXVzdCBlbnRlciBzb21lIGluZm9ybWF0aW9uIGluIHpsaWIucHJvcHMgYmVmb3JlIGF0dGVtcHRpbmcgdG8gYnVpbGQKLXdpdGggdGhpcyAnc29sdXRpb24nLiAgUGxlYXNlIHJlYWQgYW5kIGVkaXQgemxpYi5wcm9wcyBmaXJzdC4gIFlvdSB3aWxsCi1wcm9iYWJseSBub3QgYmUgZmFtaWxpYXIgd2l0aCB0aGUgY29udGVudHMgb2YgemxpYi5wcm9wcyAtIGRvIG5vdCB3b3JyeSwKLWl0IGlzIG1vc3RseSBoYXJtbGVzcy4KLQotTWFrZSBzdXJlIHRoYXQgeW91ciBvZmZpY2lhbCBidWlsZCBsYXlvdXQgbWF0Y2hlcyB0aGUgcmVxdWlyZW1lbnRzIGxpc3RlZAotaW4gemxpYi5wcm9wcy4gIFByaW9yIHRvIHpsaWItMS4yLjQgdGhlIG9mZmljaWFsIGJ1aWxkICgxLjIuMykgcGxhY2VkCi1pbmNsdWRlIGFuZCBsaWJyYXJ5IGZpbGVzIGluIGRpZmZlcmVudCBkaXJlY3RvcmllcyAtIGlmIHlvdSBmaW5kIHRoaXMKLWhhcyBoYXBwZW5lZCBqdXN0IHB1dCB0aGVtIGFsbCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCi0KLVRoaXMgaXMgYWxsIHlvdSBuZWVkIHRvIGRvIHRvIGJ1aWxkIHRoZSAncmVsZWFzZScgYW5kICdyZWxlYXNlIGxpYnJhcnknCi1jb25maWd1cmF0aW9ucy4KLQotRGVidWdnaW5nCi09PT09PT09PT0KLVRoZSByZWxlYXNlIGNvbmZpZ3VyYXRpb25zIGRlZmF1bHQgdG8gL094IG9wdGltaXphdGlvbi4gIEZ1bGwgZGVidWdnaW5nCi1pbmZvcm1hdGlvbiBpcyBwcm9kdWNlZCAoaW4gdGhlIC5wZGIpLCBidXQgaWYgeW91IGVuY291bnRlciBhIHByb2JsZW0gdGhlCi1vcHRpbWl6YXRpb24gbWF5IG1ha2UgaXQgZGlmZmljdWx0IHRvIGRlYnVnLiAgU2ltcGx5IHJlYnVpbGQgd2l0aCBhIGxvd2VyCi1vcHRpbWl6YXRpb24gbGV2ZWwgKGUuZy4gL09kLikKLQotU3RvcCByZWFkaW5nIGhlcmUKLT09PT09PT09PT09PT09PT09Ci1Zb3UgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYnVpbGQgYSB3b3JraW5nIGFwcGxpY2F0aW9uLgotCi1EZWJ1ZyB2ZXJzaW9ucyBoYXZlIGxpbWl0ZWQgc3VwcG9ydAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVRoaXMgc29sdXRpb24gaW5jbHVkZXMgbGltaXRlZCBzdXBwb3J0IGZvciBkZWJ1ZyB2ZXJzaW9ucyBvZiBsaWJwbmcuICBZb3UKLWRvIG5vdCBuZWVkIHRoZXNlIHVubGVzcyB5b3VyIG93biBzb2x1dGlvbiBpdHNlbGYgdXNlcyBkZWJ1ZyBidWlsZHMgKGl0IGlzCi1mYXIgbW9yZSBlZmZlY3RpdmUgdG8gZGVidWcgb24gdGhlIHJlbGVhc2UgYnVpbGRzLCB0aGVyZSBpcyBubyBwb2ludCBidWlsZGluZwotYSBzcGVjaWFsIGRlYnVnIGJ1aWxkLikKLQotSWYsIGRlc3BpdGUgdGhlIHByZXZpb3VzIHBhcmFncmFwaCwgeW91IHN0aWxsIGZlZWwgeW91IG5lZWQgYSBkZWJ1ZyBidWlsZCB5b3UKLXdpbGwgaGF2ZSB0byBkb3dubG9hZCB0aGUgemxpYiBzb3VyY2UgYXMgd2VsbCAoaHR0cDovL3d3dy56bGliLm5ldCkgYW5kIGluY2x1ZGUKLXRoZSBkaXJlY3Rvcnkgd2hlcmUgeW91IHVucGFjayBpdCBpbiB6bGliLnByb3BzLiAgVGhpcyBzb2x1dGlvbiB3aWxsIHRoZW4gYmUKLWFibGUgdG8gYnVpbGQgYSBtaW5pbWFsIHpsaWIgc3VmZmljaWVudCBmb3IgbGlicG5nLiAgVGhpcyBidWlsZCBpcyBvbmx5Ci1zdWl0YWJsZSBmb3IgbWFraW5nIGEgZGVidWcgbGlicG5nLgotCi1UaGUgZGVidWcgYnVpbGQgb2YgbGlicG5nIGlzIG1pbmltYWxseSBzdXBwb3J0ZWQuICBTdXBwb3J0IGZvciBkZWJ1ZyBidWlsZHMgb2YKLXpsaWIgaXMgYWxzbyBtaW5pbWFsLiAgWW91IHJlYWxseSBkb24ndCB3YW50IHRvIGRvIHRoaXMuCi0KLVRoaXMgc29sdXRpb24gb25seSBzdXBwb3J0cyB0aGUgTXVsdGktVGhyZWFkZWQgRExMIEMgUnVudGltZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1JZiB5b3UgZXhhbWluZSB0aGUgc29sdXRpb24geW91IHdpbGwgZmluZCB0aGF0IGl0IHZlcnkgZGVsaWJlcmF0ZWx5IGxpc3RzCi1leGFjdGx5IHdoaWNoIE1pY3JvU29mdCBETExzIGl0IGlzIGxpbmtpbmcgYWdhaW5zdC4gIEl0IGV4cGxpY2l0bHkgbGlua3MKLWFnYWluc3QgbXN2Y3J0LmxpYi4gIFRoZSBkZWJ1ZyB2ZXJzaW9uIGxpbmtzIGFnYWluc3QgbXN2Y3J0ZC5saWIgKHRoaXMgaXMKLXdoeSBpdCBpcyBhIGRlYnVnIHZlcnNpb24gLSBpdCdzIG5vdGhpbmcgdG8gZG8gd2l0aCBoYXZpbmcgYW55IHNwZWNpYWwKLWRlYnVnIHN1cHBvcnQsIGl0IGRvZXNuJ3QpLgotCi1UaGVzZSB2ZXJzaW9ucyBvZiB0aGUgTWljcm9Tb2Z0IEMgcnVudGltZSBjb3JyZXNwb25kIHRvIHRoZSBjb21waWxlciBmbGFncwotL01EIChyZWxlYXNlKSBhbmQgL01EZCAoZGVidWcpIC0gdGhlICJNdWx0aS1UaHJlYWRlZCBETEwiIGltcGxlbWVudGF0aW9uIG9mIHRoZQotQyBydW50aW1lIGxpYnJhcnkuCi0KLUlmIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGlzIHRoZW4geW91IHdpbGwgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCBib3RoIHRoZQotY29tcGlsZXIgZmxhZ3MgYW5kIHRoZSAiLmxpYiIgaW4gdGhlIGxpbmtlciBkZXBlbmRlbmNlcyBtYXRjaCB1cC4gIEZvcnR1bmF0ZWx5Ci1uZWl0aGVyIHpsaWIgbm9yIGxpYnBuZyByZXF1aXJlIGxpYnJhcmllcyBvdGhlciB0aGFuIGEgQyBydW50aW1lIGFuZAota2VybmVsMzIuCi0KLVlvdSBjYW5ub3QgcGFzcyAoRklMRSopIG9iamVjdHMgZnJvbSBhIGRpZmZlcmVudCBydW50aW1lIChpbmNsdWRpbmcgbXN2Y3J0ZAotdG8gbXN2Y3J0KSB0byBsaWJwbmcuICBJZiB5b3UgZG8gdGhlbiB5b3VyIHByb2dyYW0gd2lsbCBjcmFzaCB3aXRoaW4gbGlicG5nCi13aGVuIGl0IGZpcnN0IG1ha2VzIGEgZmlsZSByZWFkIG9yIHdyaXRlIGNhbGwuCi0KLUl0IGlzIGxpa2VseSBpZiB5b3UgaGF2ZSByZWFkIHRoaXMgZmFyIHRoYXQgeW91IGhhdmUgZm91bmQgeW91IGNhbid0IGF2b2lkCi1oYXZpbmcgbXVsdGlwbGUgQyBydW50aW1lcyBpbiB5b3VyIHByb2dyYW0uICBUaGlzIGlzIE9LLCBpdCBkb2VzIHdvcmssIGJ1dAoteW91IHdpbGwgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIGxpYnBuZyBmaWxlIHJlYWQvd3JpdGUgY2FsbGJhY2tzIHJhdGhlciB0aGFuCi11c2luZyB0aGUgaW50ZXJuYWwgbGlicG5nIGRlZmF1bHQuICBUaGlzIGlzIGVhc3kuCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vemxpYi5wcm9wcyBiL3NyYy9saWJwbmcvcHJvamVjdHMvdnN0dWRpby96bGliLnByb3BzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGIwN2Q5Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvcHJvamVjdHMvdnN0dWRpby96bGliLnByb3BzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSAqIHpsaWIucHJvcHMgLSBsb2NhdGlvbiBvZiB6bGliIHNvdXJjZSBhbmQgYnVpbGQKLSAqCi0gKiBsaWJwbmcgdmVyc2lvbiAxLjQuMTIgLSBKdWx5IDEwLCAyMDEyCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTEgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSAqIFlvdSBtdXN0IGVkaXQgdGhpcyBmaWxlIHRvIHJlY29yZCB0aGUgbG9jYXRpb24gb2YgdGhlIHpsaWIKLSAqIG9mZmljaWFsIGFuZCBkZWJ1ZyBidWlsZHMgdW5sZXNzIHRoZXkgYXJlIGluIHRoZSBkZWZhdWx0Ci0gKiBkaXJlY3RvcmllczoKLQotICogICBvZmZpY2lhbDogemxpYjEKLSAqICAgZGVidWc6ICAgIHpsaWIgZGVidWcKLSAtLT4KLQotPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+Ci0gICAgPCEtLSBQbGFjZSB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIG9mZmljaWFsCi0gICAgICAgICBidWlsZCBvZiB6bGliIGFuZCB0aGUgY29ycmVzcG9uZGluZyBoZWFkZXIgZmlsZXMgaW4gdGhpcwotICAgICAgICAgcHJvcGVydHkuICBUaGUgZGlyZWN0b3J5IGlzIGV4cGVjdGVkIHRvIGNvbnRhaW4gYXQgbGVhc3Q6Ci0KLSAgICAgICAgICAgIHpkbGwubGliICAjIFRoZSBETEwgaW1wb3J0IGxpYnJhcnkKLSAgICAgICAgICAgIHpsaWIubGliICAjIFRoZSBzdGF0aWMgbGlicmFyeQotICAgICAgICAgICAgemxpYi5oICAgICMgVGhlIGhlYWRlciBmaWxlCi0gICAgICAgICAgICB6Y29uZi5oICAgIyBBbm90aGVyIGhlYWRlciBmaWxlIGluY2x1ZGVkIGJ5IHpsaWIuaAotICAgICAtLT4KLSAgICA8WkxpYjFEaXI+Li5cLi5cLi5cLi5cemxpYjEyNS1kbGxcemxpYi0xLjIuNTwvWkxpYjFEaXI+Ci0KLSAgICA8IS0tIFBsYWNlIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgc291cmNlIG9mCi0gICAgICAgICB6bGliIHVzZWQgZm9yIGRlYnVnZ2luZyBpbiB0aGlzIHByb3BlcnR5LgotICAgICAgICAgVGhlIGRpcmVjdG9yeSBuZWVkIG9ubHkgY29udGFpbiB0aGUgJy5jJyBhbmQgJy5oJyBmaWxlcwotICAgICAgICAgZnJvbSB0aGUgc291cmNlLiAgRm9yIHlvdXIgb3duIHNhbml0eSBtYWtlIHN1cmUgdGhhdCB0aGUKLSAgICAgICAgICcuaCcgZmlsZXMgaW4gdGhlIHNvdXJjZSBtYXRjaCB0aG9zZSBmcm9tIHRoZSAnb2ZmaWNpYWwnCi0gICAgICAgICBidWlsZCBhYm92ZS4KLSAgICAgLS0+Ci0gICAgPFpMaWJTcmNEaXI+Li5cLi5cLi5cLi5cemxpYi0xLjIuNTwvWkxpYlNyY0Rpcj4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9wcm9qZWN0cy92c3R1ZGlvL3psaWIvemxpYi52Y3hwcm9qIGIvc3JjL2xpYnBuZy9wcm9qZWN0cy92c3R1ZGlvL3psaWIvemxpYi52Y3hwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQ3NWEzLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvcHJvamVjdHMvdnN0dWRpby96bGliL3psaWIudmN4cHJvagorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+Ci0gICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnIExpYnJhcnl8V2luMzIiPgotICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWcgTGlicmFyeTwvQ29uZmlndXJhdGlvbj4KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPgotICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+Ci0gICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgotICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChaTGliU3JjRGlyKVxhZGxlcjMyLmMiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFpMaWJTcmNEaXIpXGNvbXByZXNzLmMiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFpMaWJTcmNEaXIpXGNyYzMyLmMiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFpMaWJTcmNEaXIpXGRlZmxhdGUuYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoWkxpYlNyY0RpcilcaW5mYmFjay5jIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChaTGliU3JjRGlyKVxpbmZmYXN0LmMiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFpMaWJTcmNEaXIpXGluZmxhdGUuYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoWkxpYlNyY0RpcilcaW5mdHJlZXMuYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoWkxpYlNyY0RpcilcdHJlZXMuYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoWkxpYlNyY0RpcilcdW5jb21wci5jIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChaTGliU3JjRGlyKVx6dXRpbC5jIiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgotICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPgotICA8SW1wb3J0IFByb2plY3Q9IiQoU29sdXRpb25EaXIpXHpsaWIucHJvcHMiIC8+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+Ci0gICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KLSAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+Ci0gICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KLSAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPgotICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4KLSAgPC9JbXBvcnRHcm91cD4KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgotICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KLSAgPC9JbXBvcnRHcm91cD4KLSAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTGlicmFyeXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgLz4KLSAgPC9JbXBvcnRHcm91cD4KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgotICA8L0ltcG9ydEdyb3VwPgotICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgotICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIj4KLSAgICA8TGlua0luY3JlbWVudGFsPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KLSAgICA8TGlua0luY3JlbWVudGFsPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+Ci0gICAgPENsQ29tcGlsZT4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtaTElCX0RMTDtfREVCVUc7X1dJTkRPV1M7X1VTUkRMTDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4KLSAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+Ci0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+Ci0gICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+Ci0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8TGluaz4KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+Ci0gICAgICA8VmVyc2lvbj4xPC9WZXJzaW9uPgotICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bXN2Y3J0ZC5saWI7a2VybmVsMzIubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgotICAgICAgPElnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+dHJ1ZTwvSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz4KLSAgICA8L0xpbms+Ci0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4KLSAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyI+Ci0gICAgPENsQ29tcGlsZT4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X1dJTkRPV1M7X1VTUkRMTDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4KLSAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+Ci0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+Ci0gICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPExpbms+Ci0gICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPgotICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+Ci0gICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KLSAgICA8L0xpbms+Ci0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4KLSAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Ci0gICAgPENsQ29tcGlsZT4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtERUJVR1pMSUJfRVhQT1JUUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+Ci0gICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgotICAgIDwvQ2xDb21waWxlPgotICAgIDxMaW5rPgotICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+Ci0gICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgotICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+Ci0gICAgPC9MaW5rPgotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+Ci0gIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+Ci0gIDwvSW1wb3J0R3JvdXA+Ci08L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3Byb2plY3RzL3hjb2RlL1JFQURNRS50eHQgYi9zcmMvbGlicG5nL3Byb2plY3RzL3hjb2RlL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZjkxY2EuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9wcm9qZWN0cy94Y29kZS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLTEgU2VwdGVtYmVyIDIwMTA6IFBoaWxpcHBlIEhhdXNsZXIgdXBkYXRlZCB0aGUgeGNvZGUgcHJvamVjdCB0byB3b3JrCi13aXRoIGxpYnBuZy0xLjQueCBhbmQgYWRkZWQgaU9TIHRhcmdldHMgZm9yIHNpbXVsYXRvciBhbmQgZGV2aWNlLgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9wcm9qZWN0cy94Y29kZS9saWJwbmcueGNvZGVwcm9qLy5naXRpZ25vcmUgYi9zcmMvbGlicG5nL3Byb2plY3RzL3hjb2RlL2xpYnBuZy54Y29kZXByb2ovLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEyYjE0Yi4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3Byb2plY3RzL3hjb2RlL2xpYnBuZy54Y29kZXByb2ovLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5tb2RlMSoKLSoucGJ4dXNlcgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9wcm9qZWN0cy94Y29kZS9saWJwbmcueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL3NyYy9saWJwbmcvcHJvamVjdHMveGNvZGUvbGlicG5nLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNDNiODEuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9wcm9qZWN0cy94Y29kZS9saWJwbmcueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysgL2Rldi9udWxsCkBAIC0xLDgwNSArMCwwIEBACi0vLyAhJCpVVEY4KiQhCi17Ci0JYXJjaGl2ZVZlcnNpb24gPSAxOwotCWNsYXNzZXMgPSB7Ci0JfTsKLQlvYmplY3RWZXJzaW9uID0gNDU7Ci0Jb2JqZWN0cyA9IHsKLQotLyogQmVnaW4gUEJYQWdncmVnYXRlVGFyZ2V0IHNlY3Rpb24gKi8KLQkJNUJGM0IxMTAxMjJCMUM4NjAwOTJBRTRFIC8qIGxpYnBuZyAqLyA9IHsKLQkJCWlzYSA9IFBCWEFnZ3JlZ2F0ZVRhcmdldDsKLQkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA1QkYzQjExQjEyMkIxQ0Q4MDA5MkFFNEUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgImxpYnBuZyIgKi87Ci0JCQlidWlsZFBoYXNlcyA9ICgKLQkJCSk7Ci0JCQlkZXBlbmRlbmNpZXMgPSAoCi0JCQkJNUJGM0IxMTQxMjJCMUM5QjAwOTJBRTRFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCi0JCQkJNUJGM0IxMTYxMjJCMUM5QjAwOTJBRTRFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCi0JCQkpOwotCQkJbmFtZSA9IGxpYnBuZzsKLQkJCXByb2R1Y3ROYW1lID0gImxpYnBuZyAoaU9TKSI7Ci0JCX07Ci0JCTVCRjNCMTQ4MTIyREU1MUUwMDkyQUU0RSAvKiBDb25maWd1cmUgKi8gPSB7Ci0JCQlpc2EgPSBQQlhBZ2dyZWdhdGVUYXJnZXQ7Ci0JCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNUJGM0IxNEIxMjJERTU0MzAwOTJBRTRFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYQWdncmVnYXRlVGFyZ2V0ICJDb25maWd1cmUiICovOwotCQkJYnVpbGRQaGFzZXMgPSAoCi0JCQkJNUJGM0IxNDcxMjJERTUxRTAwOTJBRTRFIC8qIENvbmZpZ3VyZSAqLywKLQkJCSk7Ci0JCQlkZXBlbmRlbmNpZXMgPSAoCi0JCQkpOwotCQkJbmFtZSA9IENvbmZpZ3VyZTsKLQkJCXByb2R1Y3ROYW1lID0gQ29uZmlndXJlOwotCQl9OwotLyogRW5kIFBCWEFnZ3JlZ2F0ZVRhcmdldCBzZWN0aW9uICovCi0KLS8qIEJlZ2luIFBCWEJ1aWxkRmlsZSBzZWN0aW9uICovCi0JCTVCRjNCMEM5MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdwcml2LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBCNTEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncHJpdi5oICovOyB9OwotCQk1QkYzQjBDQTEyMkIxQkVFMDA5MkFFNEUgLyogcG5nLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBCNjEyMkIxQkVFMDA5MkFFNEUgLyogcG5nLmMgKi87IH07Ci0JCTVCRjNCMENCMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmcuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEI3MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmcuaCAqLzsgfTsKLQkJNUJGM0IwQ0MxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ2NvbmYuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEI4MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdjb25mLmggKi87IH07Ci0JCTVCRjNCMENEMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdlcnJvci5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQjkxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ2Vycm9yLmMgKi87IH07Ci0JCTVCRjNCMENGMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdnZXQuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEJCMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdnZXQuYyAqLzsgfTsKLQkJNUJGM0IwRDAxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ21lbS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQkMxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ21lbS5jICovOyB9OwotCQk1QkYzQjBEMTEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncHJlYWQuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEJEMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdwcmVhZC5jICovOyB9OwotCQk1QkYzQjBEMjEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncmVhZC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQkUxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3JlYWQuYyAqLzsgfTsKLQkJNUJGM0IwRDMxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3Jpby5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQkYxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3Jpby5jICovOyB9OwotCQk1QkYzQjBENDEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncnRyYW4uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEMwMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdydHJhbi5jICovOyB9OwotCQk1QkYzQjBENTEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncnV0aWwuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEMxMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdydXRpbC5jICovOyB9OwotCQk1QkYzQjBENjEyMkIxQkVFMDA5MkFFNEUgLyogcG5nc2V0LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBDMjEyMkIxQkVFMDA5MkFFNEUgLyogcG5nc2V0LmMgKi87IH07Ci0JCTVCRjNCMEQ3MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd0cmFucy5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQzMxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3RyYW5zLmMgKi87IH07Ci0JCTVCRjNCMEQ5MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd3aW8uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEM1MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd3aW8uYyAqLzsgfTsKLQkJNUJGM0IwREExMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3dyaXRlLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBDNjEyMkIxQkVFMDA5MkFFNEUgLyogcG5nd3JpdGUuYyAqLzsgfTsKLQkJNUJGM0IwREIxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3d0cmFuLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBDNzEyMkIxQkVFMDA5MkFFNEUgLyogcG5nd3RyYW4uYyAqLzsgfTsKLQkJNUJGM0IwREMxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3d1dGlsLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBDODEyMkIxQkVFMDA5MkFFNEUgLyogcG5nd3V0aWwuYyAqLzsgfTsKLQkJNUJGM0IwREQxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3ByaXYuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEI1MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdwcml2LmggKi87IH07Ci0JCTVCRjNCMERFMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmcuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEI2MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmcuYyAqLzsgfTsKLQkJNUJGM0IwREYxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQjcxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZy5oICovOyB9OwotCQk1QkYzQjBFMDEyMkIxQkVFMDA5MkFFNEUgLyogcG5nY29uZi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQjgxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ2NvbmYuaCAqLzsgfTsKLQkJNUJGM0IwRTExMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ2Vycm9yLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBCOTEyMkIxQkVFMDA5MkFFNEUgLyogcG5nZXJyb3IuYyAqLzsgfTsKLQkJNUJGM0IwRTMxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ2dldC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQkIxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ2dldC5jICovOyB9OwotCQk1QkYzQjBFNDEyMkIxQkVFMDA5MkFFNEUgLyogcG5nbWVtLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBCQzEyMkIxQkVFMDA5MkFFNEUgLyogcG5nbWVtLmMgKi87IH07Ci0JCTVCRjNCMEU1MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdwcmVhZC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQkQxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3ByZWFkLmMgKi87IH07Ci0JCTVCRjNCMEU2MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdyZWFkLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBCRTEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncmVhZC5jICovOyB9OwotCQk1QkYzQjBFNzEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncmlvLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBCRjEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncmlvLmMgKi87IH07Ci0JCTVCRjNCMEU4MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdydHJhbi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQzAxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3J0cmFuLmMgKi87IH07Ci0JCTVCRjNCMEU5MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdydXRpbC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQzExMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3J1dGlsLmMgKi87IH07Ci0JCTVCRjNCMEVBMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdzZXQuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEMyMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdzZXQuYyAqLzsgfTsKLQkJNUJGM0IwRUIxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3RyYW5zLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBDMzEyMkIxQkVFMDA5MkFFNEUgLyogcG5ndHJhbnMuYyAqLzsgfTsKLQkJNUJGM0IwRUQxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3dpby5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQzUxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3dpby5jICovOyB9OwotCQk1QkYzQjBFRTEyMkIxQkVFMDA5MkFFNEUgLyogcG5nd3JpdGUuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEM2MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd3cml0ZS5jICovOyB9OwotCQk1QkYzQjBFRjEyMkIxQkVFMDA5MkFFNEUgLyogcG5nd3RyYW4uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEM3MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd3dHJhbi5jICovOyB9OwotCQk1QkYzQjBGMDEyMkIxQkVFMDA5MkFFNEUgLyogcG5nd3V0aWwuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEM4MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd3dXRpbC5jICovOyB9OwotCQk1QkYzQjBGMTEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncHJpdi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQjUxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3ByaXYuaCAqLzsgfTsKLQkJNUJGM0IwRjIxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZy5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQjYxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZy5jICovOyB9OwotCQk1QkYzQjBGMzEyMkIxQkVFMDA5MkFFNEUgLyogcG5nLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBCNzEyMkIxQkVFMDA5MkFFNEUgLyogcG5nLmggKi87IH07Ci0JCTVCRjNCMEY0MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdjb25mLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBCODEyMkIxQkVFMDA5MkFFNEUgLyogcG5nY29uZi5oICovOyB9OwotCQk1QkYzQjBGNTEyMkIxQkVFMDA5MkFFNEUgLyogcG5nZXJyb3IuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEI5MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdlcnJvci5jICovOyB9OwotCQk1QkYzQjBGNzEyMkIxQkVFMDA5MkFFNEUgLyogcG5nZ2V0LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBCQjEyMkIxQkVFMDA5MkFFNEUgLyogcG5nZ2V0LmMgKi87IH07Ci0JCTVCRjNCMEY4MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdtZW0uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEJDMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdtZW0uYyAqLzsgfTsKLQkJNUJGM0IwRjkxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3ByZWFkLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBCRDEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncHJlYWQuYyAqLzsgfTsKLQkJNUJGM0IwRkExMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3JlYWQuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEJFMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdyZWFkLmMgKi87IH07Ci0JCTVCRjNCMEZCMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdyaW8uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEJGMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdyaW8uYyAqLzsgfTsKLQkJNUJGM0IwRkMxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3J0cmFuLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBDMDEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncnRyYW4uYyAqLzsgfTsKLQkJNUJGM0IwRkQxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3J1dGlsLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBDMTEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncnV0aWwuYyAqLzsgfTsKLQkJNUJGM0IwRkUxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3NldC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQzIxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3NldC5jICovOyB9OwotCQk1QkYzQjBGRjEyMkIxQkVFMDA5MkFFNEUgLyogcG5ndHJhbnMuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDVCRjNCMEMzMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd0cmFucy5jICovOyB9OwotCQk1QkYzQjEwMTEyMkIxQkVFMDA5MkFFNEUgLyogcG5nd2lvLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1QkYzQjBDNTEyMkIxQkVFMDA5MkFFNEUgLyogcG5nd2lvLmMgKi87IH07Ci0JCTVCRjNCMTAyMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd3cml0ZS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQzYxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3dyaXRlLmMgKi87IH07Ci0JCTVCRjNCMTAzMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd3dHJhbi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQzcxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3d0cmFuLmMgKi87IH07Ci0JCTVCRjNCMTA0MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd3dXRpbC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IwQzgxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3d1dGlsLmMgKi87IH07Ci0JCTVCRjNCMTM1MTIyREUzQUEwMDkyQUU0RSAvKiBsaWJ6LmR5bGliIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNUJGM0IxMzQxMjJERTNBQTAwOTJBRTRFIC8qIGxpYnouZHlsaWIgKi87IH07Ci0vKiBFbmQgUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KLQotLyogQmVnaW4gUEJYQ29udGFpbmVySXRlbVByb3h5IHNlY3Rpb24gKi8KLQkJNUJGM0IxMTMxMjJCMUM5QjAwOTJBRTRFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKLQkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKLQkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKLQkJCXByb3h5VHlwZSA9IDE7Ci0JCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDVCRjNCMDhCMTIyQjFCNkEwMDkyQUU0RSAvKiBsaWJwbmcgZHluYW1pYyAoTWFjIE9TIFgpICovOwotCQkJcmVtb3RlSW5mbyA9ICJsaWJwbmcgZHluYW1pYyAoTWFjIE9TIFgpIjsKLQkJfTsKLQkJNUJGM0IxMTUxMjJCMUM5QjAwOTJBRTRFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKLQkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKLQkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKLQkJCXByb3h5VHlwZSA9IDE7Ci0JCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDVCRjNCMTBCMTIyQjFDMDcwMDkyQUU0RSAvKiBsaWJwbmcgc3RhdGljIChpT1MgU2ltdWxhdG9yICYgRGV2aWNlKSAqLzsKLQkJCXJlbW90ZUluZm8gPSAibGlicG5nIHN0YXRpYyAoaU9TIFNpbXVsYXRvciAmIERldmljZSkiOwotCQl9OwotCQk1QkYzQjExNzEyMkIxQ0E1MDA5MkFFNEUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0gewotCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OwotCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOwotCQkJcHJveHlUeXBlID0gMTsKLQkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gRDJBQUMwNDUwNTU0NjRFNTAwREI1MThEIC8qIGxpYnBuZyBzdGF0aWMgKE1hYyBPUyBYKSAqLzsKLQkJCXJlbW90ZUluZm8gPSAibGlicG5nIHN0YXRpYyAoTWFjIE9TIFgpIjsKLQkJfTsKLQkJNUJGM0IxMTkxMjJCMUNBNTAwOTJBRTRFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKLQkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKLQkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKLQkJCXByb3h5VHlwZSA9IDE7Ci0JCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDVCRjNCMDkzMTIyQjFCOUIwMDkyQUU0RSAvKiBsaWJwbmcgc3RhdGljIChpT1MpICovOwotCQkJcmVtb3RlSW5mbyA9ICJsaWJwbmcgc3RhdGljIChpT1MpIjsKLQkJfTsKLQkJNUJGM0IxNTgxMjJERTVDQzAwOTJBRTRFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKLQkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKLQkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKLQkJCXByb3h5VHlwZSA9IDE7Ci0JCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDVCRjNCMTQ4MTIyREU1MUUwMDkyQUU0RSAvKiBDb25maWd1cmUgKi87Ci0JCQlyZW1vdGVJbmZvID0gQ29uZmlndXJlOwotCQl9OwotCQk1QkYzQjE1QTEyMkRFNUQyMDA5MkFFNEUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0gewotCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OwotCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOwotCQkJcHJveHlUeXBlID0gMTsKLQkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gNUJGM0IxNDgxMjJERTUxRTAwOTJBRTRFIC8qIENvbmZpZ3VyZSAqLzsKLQkJCXJlbW90ZUluZm8gPSBDb25maWd1cmU7Ci0JCX07Ci0JCTVCRjNCMTVDMTIyREU1RDgwMDkyQUU0RSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7Ci0JCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7Ci0JCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87Ci0JCQlwcm94eVR5cGUgPSAxOwotCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA1QkYzQjE0ODEyMkRFNTFFMDA5MkFFNEUgLyogQ29uZmlndXJlICovOwotCQkJcmVtb3RlSW5mbyA9IENvbmZpZ3VyZTsKLQkJfTsKLS8qIEVuZCBQQlhDb250YWluZXJJdGVtUHJveHkgc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBQQlhGaWxlUmVmZXJlbmNlIHNlY3Rpb24gKi8KLQkJNUJGM0IwOEMxMjJCMUI2QTAwOTJBRTRFIC8qIGxpYnBuZy5keWxpYiAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5keWxpYiI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IGxpYnBuZy5keWxpYjsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKLQkJNUJGM0IwOTQxMjJCMUI5QjAwOTJBRTRFIC8qIGxpYnBuZy5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBsaWJwbmcuYTsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKLQkJNUJGM0IwQjMxMjJCMUJEQTAwOTJBRTRFIC8qIFJFQURNRS50eHQgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gUkVBRE1FLnR4dDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJNUJGM0IwQjUxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3ByaXYuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gcG5ncHJpdi5oOyBwYXRoID0gLi4vLi4vcG5ncHJpdi5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07Ci0JCTVCRjNCMEI2MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmcuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gcG5nLmM7IHBhdGggPSAuLi8uLi9wbmcuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OwotCQk1QkYzQjBCNzEyMkIxQkVFMDA5MkFFNEUgLyogcG5nLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IHBuZy5oOyBwYXRoID0gLi4vLi4vcG5nLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKLQkJNUJGM0IwQjgxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ2NvbmYuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gcG5nY29uZi5oOyBwYXRoID0gLi4vLi4vcG5nY29uZi5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07Ci0JCTVCRjNCMEI5MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdlcnJvci5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBwbmdlcnJvci5jOyBwYXRoID0gLi4vLi4vcG5nZXJyb3IuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OwotCQk1QkYzQjBCQjEyMkIxQkVFMDA5MkFFNEUgLyogcG5nZ2V0LmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IHBuZ2dldC5jOyBwYXRoID0gLi4vLi4vcG5nZ2V0LmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKLQkJNUJGM0IwQkMxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ21lbS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBwbmdtZW0uYzsgcGF0aCA9IC4uLy4uL3BuZ21lbS5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07Ci0JCTVCRjNCMEJEMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdwcmVhZC5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBwbmdwcmVhZC5jOyBwYXRoID0gLi4vLi4vcG5ncHJlYWQuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OwotCQk1QkYzQjBCRTEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncmVhZC5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBwbmdyZWFkLmM7IHBhdGggPSAuLi8uLi9wbmdyZWFkLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKLQkJNUJGM0IwQkYxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3Jpby5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBwbmdyaW8uYzsgcGF0aCA9IC4uLy4uL3BuZ3Jpby5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07Ci0JCTVCRjNCMEMwMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdydHJhbi5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBwbmdydHJhbi5jOyBwYXRoID0gLi4vLi4vcG5ncnRyYW4uYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OwotCQk1QkYzQjBDMTEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncnV0aWwuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gcG5ncnV0aWwuYzsgcGF0aCA9IC4uLy4uL3BuZ3J1dGlsLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKLQkJNUJGM0IwQzIxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3NldC5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBwbmdzZXQuYzsgcGF0aCA9IC4uLy4uL3BuZ3NldC5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07Ci0JCTVCRjNCMEMzMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd0cmFucy5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBwbmd0cmFucy5jOyBwYXRoID0gLi4vLi4vcG5ndHJhbnMuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OwotCQk1QkYzQjBDNTEyMkIxQkVFMDA5MkFFNEUgLyogcG5nd2lvLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IHBuZ3dpby5jOyBwYXRoID0gLi4vLi4vcG5nd2lvLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKLQkJNUJGM0IwQzYxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3dyaXRlLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IHBuZ3dyaXRlLmM7IHBhdGggPSAuLi8uLi9wbmd3cml0ZS5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07Ci0JCTVCRjNCMEM3MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd3dHJhbi5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBwbmd3dHJhbi5jOyBwYXRoID0gLi4vLi4vcG5nd3RyYW4uYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OwotCQk1QkYzQjBDODEyMkIxQkVFMDA5MkFFNEUgLyogcG5nd3V0aWwuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gcG5nd3V0aWwuYzsgcGF0aCA9IC4uLy4uL3BuZ3d1dGlsLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKLQkJNUJGM0IxMEMxMjJCMUMwNzAwOTJBRTRFIC8qIGxpYnBuZy5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBsaWJwbmcuYTsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKLQkJNUJGM0IxMzQxMjJERTNBQTAwOTJBRTRFIC8qIGxpYnouZHlsaWIgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmR5bGliIjsgbmFtZSA9IGxpYnouZHlsaWI7IHBhdGggPSB1c3IvbGliL2xpYnouZHlsaWI7IHNvdXJjZVRyZWUgPSBTREtST09UOyB9OwotCQlEMkFBQzA0NjA1NTQ2NEU1MDBEQjUxOEQgLyogbGlicG5nLmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IGFyY2hpdmUuYXI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IGxpYnBuZy5hOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OwotLyogRW5kIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCi0JCTVCRjNCMDhBMTIyQjFCNkEwMDkyQUU0RSAvKiBGcmFtZXdvcmtzICovID0gewotCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7Ci0JCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwotCQkJZmlsZXMgPSAoCi0JCQkJNUJGM0IxMzUxMjJERTNBQTAwOTJBRTRFIC8qIGxpYnouZHlsaWIgaW4gRnJhbWV3b3JrcyAqLywKLQkJCSk7Ci0JCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKLQkJfTsKLQkJNUJGM0IwOTIxMjJCMUI5QjAwOTJBRTRFIC8qIEZyYW1ld29ya3MgKi8gPSB7Ci0JCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKLQkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7Ci0JCQlmaWxlcyA9ICgKLQkJCSk7Ci0JCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKLQkJfTsKLQkJRDI4OTk4NzQwNUU2OERDQjAwNEVEQjg2IC8qIEZyYW1ld29ya3MgKi8gPSB7Ci0JCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKLQkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7Ci0JCQlmaWxlcyA9ICgKLQkJCSk7Ci0JCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKLQkJfTsKLS8qIEVuZCBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCi0KLS8qIEJlZ2luIFBCWEdyb3VwIHNlY3Rpb24gKi8KLQkJMDhGQjc3OTRGRTg0MTU1REMwMkFBQzA3IC8qIHBuZyAqLyA9IHsKLQkJCWlzYSA9IFBCWEdyb3VwOwotCQkJY2hpbGRyZW4gPSAoCi0JCQkJNUJGM0IwQjMxMjJCMUJEQTAwOTJBRTRFIC8qIFJFQURNRS50eHQgKi8sCi0JCQkJMDhGQjc3OTVGRTg0MTU1REMwMkFBQzA3IC8qIFNvdXJjZSAqLywKLQkJCQk1QkYzQjE0MzEyMkRFNDYyMDA5MkFFNEUgLyogTGlicmFyaWVzICovLAotCQkJCTFBQjY3NEFERkU5RDU0QjUxMUNBMkNCQiAvKiBQcm9kdWN0cyAqLywKLQkJCSk7Ci0JCQluYW1lID0gcG5nOwotCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKLQkJfTsKLQkJMDhGQjc3OTVGRTg0MTU1REMwMkFBQzA3IC8qIFNvdXJjZSAqLyA9IHsKLQkJCWlzYSA9IFBCWEdyb3VwOwotCQkJY2hpbGRyZW4gPSAoCi0JCQkJNUJGM0IwQjUxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3ByaXYuaCAqLywKLQkJCQk1QkYzQjBCNjEyMkIxQkVFMDA5MkFFNEUgLyogcG5nLmMgKi8sCi0JCQkJNUJGM0IwQjcxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZy5oICovLAotCQkJCTVCRjNCMEI4MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdjb25mLmggKi8sCi0JCQkJNUJGM0IwQjkxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ2Vycm9yLmMgKi8sCi0JCQkJNUJGM0IwQkIxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ2dldC5jICovLAotCQkJCTVCRjNCMEJDMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdtZW0uYyAqLywKLQkJCQk1QkYzQjBCRDEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncHJlYWQuYyAqLywKLQkJCQk1QkYzQjBCRTEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncmVhZC5jICovLAotCQkJCTVCRjNCMEJGMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdyaW8uYyAqLywKLQkJCQk1QkYzQjBDMDEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncnRyYW4uYyAqLywKLQkJCQk1QkYzQjBDMTEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncnV0aWwuYyAqLywKLQkJCQk1QkYzQjBDMjEyMkIxQkVFMDA5MkFFNEUgLyogcG5nc2V0LmMgKi8sCi0JCQkJNUJGM0IwQzMxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3RyYW5zLmMgKi8sCi0JCQkJNUJGM0IwQzUxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3dpby5jICovLAotCQkJCTVCRjNCMEM2MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd3cml0ZS5jICovLAotCQkJCTVCRjNCMEM3MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd3dHJhbi5jICovLAotCQkJCTVCRjNCMEM4MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd3dXRpbC5jICovLAotCQkJKTsKLQkJCW5hbWUgPSBTb3VyY2U7Ci0JCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOwotCQl9OwotCQkxQUI2NzRBREZFOUQ1NEI1MTFDQTJDQkIgLyogUHJvZHVjdHMgKi8gPSB7Ci0JCQlpc2EgPSBQQlhHcm91cDsKLQkJCWNoaWxkcmVuID0gKAotCQkJCUQyQUFDMDQ2MDU1NDY0RTUwMERCNTE4RCAvKiBsaWJwbmcuYSAqLywKLQkJCQk1QkYzQjA4QzEyMkIxQjZBMDA5MkFFNEUgLyogbGlicG5nLmR5bGliICovLAotCQkJCTVCRjNCMDk0MTIyQjFCOUIwMDkyQUU0RSAvKiBsaWJwbmcuYSAqLywKLQkJCQk1QkYzQjEwQzEyMkIxQzA3MDA5MkFFNEUgLyogbGlicG5nLmEgKi8sCi0JCQkpOwotCQkJbmFtZSA9IFByb2R1Y3RzOwotCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKLQkJfTsKLQkJNUJGM0IxNDMxMjJERTQ2MjAwOTJBRTRFIC8qIExpYnJhcmllcyAqLyA9IHsKLQkJCWlzYSA9IFBCWEdyb3VwOwotCQkJY2hpbGRyZW4gPSAoCi0JCQkJNUJGM0IxMzQxMjJERTNBQTAwOTJBRTRFIC8qIGxpYnouZHlsaWIgKi8sCi0JCQkpOwotCQkJbmFtZSA9IExpYnJhcmllczsKLQkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7Ci0JCX07Ci0vKiBFbmQgUEJYR3JvdXAgc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBQQlhIZWFkZXJzQnVpbGRQaGFzZSBzZWN0aW9uICovCi0JCTVCRjNCMDg4MTIyQjFCNkEwMDkyQUU0RSAvKiBIZWFkZXJzICovID0gewotCQkJaXNhID0gUEJYSGVhZGVyc0J1aWxkUGhhc2U7Ci0JCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwotCQkJZmlsZXMgPSAoCi0JCQkJNUJGM0IwREQxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3ByaXYuaCBpbiBIZWFkZXJzICovLAotCQkJCTVCRjNCMERGMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmcuaCBpbiBIZWFkZXJzICovLAotCQkJCTVCRjNCMEUwMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdjb25mLmggaW4gSGVhZGVycyAqLywKLQkJCSk7Ci0JCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKLQkJfTsKLQkJNUJGM0IwOTAxMjJCMUI5QjAwOTJBRTRFIC8qIEhlYWRlcnMgKi8gPSB7Ci0JCQlpc2EgPSBQQlhIZWFkZXJzQnVpbGRQaGFzZTsKLQkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7Ci0JCQlmaWxlcyA9ICgKLQkJCQk1QkYzQjBGMTEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncHJpdi5oIGluIEhlYWRlcnMgKi8sCi0JCQkJNUJGM0IwRjMxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZy5oIGluIEhlYWRlcnMgKi8sCi0JCQkJNUJGM0IwRjQxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ2NvbmYuaCBpbiBIZWFkZXJzICovLAotCQkJKTsKLQkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwotCQl9OwotCQlEMkFBQzA0MzA1NTQ2NEU1MDBEQjUxOEQgLyogSGVhZGVycyAqLyA9IHsKLQkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOwotCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKLQkJCWZpbGVzID0gKAotCQkJCTVCRjNCMEM5MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdwcml2LmggaW4gSGVhZGVycyAqLywKLQkJCQk1QkYzQjBDQjEyMkIxQkVFMDA5MkFFNEUgLyogcG5nLmggaW4gSGVhZGVycyAqLywKLQkJCQk1QkYzQjBDQzEyMkIxQkVFMDA5MkFFNEUgLyogcG5nY29uZi5oIGluIEhlYWRlcnMgKi8sCi0JCQkpOwotCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7Ci0JCX07Ci0vKiBFbmQgUEJYSGVhZGVyc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLwotCQk1QkYzQjA4QjEyMkIxQjZBMDA5MkFFNEUgLyogbGlicG5nIGR5bmFtaWMgKE1hYyBPUyBYKSAqLyA9IHsKLQkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKLQkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA1QkYzQjA4RjEyMkIxQjk4MDA5MkFFNEUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImxpYnBuZyBkeW5hbWljIChNYWMgT1MgWCkiICovOwotCQkJYnVpbGRQaGFzZXMgPSAoCi0JCQkJNUJGM0IwODgxMjJCMUI2QTAwOTJBRTRFIC8qIEhlYWRlcnMgKi8sCi0JCQkJNUJGM0IwODkxMjJCMUI2QTAwOTJBRTRFIC8qIFNvdXJjZXMgKi8sCi0JCQkJNUJGM0IwOEExMjJCMUI2QTAwOTJBRTRFIC8qIEZyYW1ld29ya3MgKi8sCi0JCQkpOwotCQkJYnVpbGRSdWxlcyA9ICgKLQkJCSk7Ci0JCQlkZXBlbmRlbmNpZXMgPSAoCi0JCQkJNUJGM0IxNUIxMjJERTVEMjAwOTJBRTRFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCi0JCQkpOwotCQkJbmFtZSA9ICJsaWJwbmcgZHluYW1pYyAoTWFjIE9TIFgpIjsKLQkJCXByb2R1Y3ROYW1lID0gcG5nOwotCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDVCRjNCMDhDMTIyQjFCNkEwMDkyQUU0RSAvKiBsaWJwbmcuZHlsaWIgKi87Ci0JCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmxpYnJhcnkuZHluYW1pYyI7Ci0JCX07Ci0JCTVCRjNCMDkzMTIyQjFCOUIwMDkyQUU0RSAvKiBsaWJwbmcgc3RhdGljIChpT1MpICovID0gewotCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OwotCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDVCRjNCMDlBMTIyQjFCOUYwMDkyQUU0RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAibGlicG5nIHN0YXRpYyAoaU9TKSIgKi87Ci0JCQlidWlsZFBoYXNlcyA9ICgKLQkJCQk1QkYzQjA5MDEyMkIxQjlCMDA5MkFFNEUgLyogSGVhZGVycyAqLywKLQkJCQk1QkYzQjA5MTEyMkIxQjlCMDA5MkFFNEUgLyogU291cmNlcyAqLywKLQkJCQk1QkYzQjA5MjEyMkIxQjlCMDA5MkFFNEUgLyogRnJhbWV3b3JrcyAqLywKLQkJCSk7Ci0JCQlidWlsZFJ1bGVzID0gKAotCQkJKTsKLQkJCWRlcGVuZGVuY2llcyA9ICgKLQkJCQk1QkYzQjE1RDEyMkRFNUQ4MDA5MkFFNEUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKLQkJCSk7Ci0JCQluYW1lID0gImxpYnBuZyBzdGF0aWMgKGlPUykiOwotCQkJcHJvZHVjdE5hbWUgPSBwbmc7Ci0JCQlwcm9kdWN0UmVmZXJlbmNlID0gNUJGM0IwOTQxMjJCMUI5QjAwOTJBRTRFIC8qIGxpYnBuZy5hICovOwotCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5saWJyYXJ5LnN0YXRpYyI7Ci0JCX07Ci0JCTVCRjNCMTBCMTIyQjFDMDcwMDkyQUU0RSAvKiBsaWJwbmcgc3RhdGljIChpT1MgU2ltdWxhdG9yICYgRGV2aWNlKSAqLyA9IHsKLQkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKLQkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA1QkYzQjEwRjEyMkIxQzNBMDA5MkFFNEUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImxpYnBuZyBzdGF0aWMgKGlPUyBTaW11bGF0b3IgJiBEZXZpY2UpIiAqLzsKLQkJCWJ1aWxkUGhhc2VzID0gKAotCQkJCTVCRjNCMTFEMTIyQjFEMTcwMDkyQUU0RSAvKiBHZW5lcmF0ZSBVbml2ZXJzYWwgQmluYXJ5ICovLAotCQkJKTsKLQkJCWJ1aWxkUnVsZXMgPSAoCi0JCQkpOwotCQkJZGVwZW5kZW5jaWVzID0gKAotCQkJCTVCRjNCMTE4MTIyQjFDQTUwMDkyQUU0RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAotCQkJCTVCRjNCMTFBMTIyQjFDQTUwMDkyQUU0RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAotCQkJKTsKLQkJCW5hbWUgPSAibGlicG5nIHN0YXRpYyAoaU9TIFNpbXVsYXRvciAmIERldmljZSkiOwotCQkJcHJvZHVjdE5hbWUgPSBwbmc7Ci0JCQlwcm9kdWN0UmVmZXJlbmNlID0gNUJGM0IxMEMxMjJCMUMwNzAwOTJBRTRFIC8qIGxpYnBuZy5hICovOwotCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5saWJyYXJ5LnN0YXRpYyI7Ci0JCX07Ci0JCUQyQUFDMDQ1MDU1NDY0RTUwMERCNTE4RCAvKiBsaWJwbmcgc3RhdGljIChNYWMgT1MgWCkgKi8gPSB7Ci0JCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7Ci0JCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMURFQjkxRUIwODczM0RCNzAwMTBFOUNEIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJsaWJwbmcgc3RhdGljIChNYWMgT1MgWCkiICovOwotCQkJYnVpbGRQaGFzZXMgPSAoCi0JCQkJRDJBQUMwNDMwNTU0NjRFNTAwREI1MThEIC8qIEhlYWRlcnMgKi8sCi0JCQkJRDJBQUMwNDQwNTU0NjRFNTAwREI1MThEIC8qIFNvdXJjZXMgKi8sCi0JCQkJRDI4OTk4NzQwNUU2OERDQjAwNEVEQjg2IC8qIEZyYW1ld29ya3MgKi8sCi0JCQkpOwotCQkJYnVpbGRSdWxlcyA9ICgKLQkJCSk7Ci0JCQlkZXBlbmRlbmNpZXMgPSAoCi0JCQkJNUJGM0IxNTkxMjJERTVDQzAwOTJBRTRFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCi0JCQkpOwotCQkJbmFtZSA9ICJsaWJwbmcgc3RhdGljIChNYWMgT1MgWCkiOwotCQkJcHJvZHVjdE5hbWUgPSBwbmc7Ci0JCQlwcm9kdWN0UmVmZXJlbmNlID0gRDJBQUMwNDYwNTU0NjRFNTAwREI1MThEIC8qIGxpYnBuZy5hICovOwotCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5saWJyYXJ5LnN0YXRpYyI7Ci0JCX07Ci0vKiBFbmQgUEJYTmF0aXZlVGFyZ2V0IHNlY3Rpb24gKi8KLQotLyogQmVnaW4gUEJYUHJvamVjdCBzZWN0aW9uICovCi0JCTA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLyA9IHsKLQkJCWlzYSA9IFBCWFByb2plY3Q7Ci0JCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMURFQjkxRUYwODczM0RCNzAwMTBFOUNEIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAibGlicG5nIiAqLzsKLQkJCWNvbXBhdGliaWxpdHlWZXJzaW9uID0gIlhjb2RlIDMuMSI7Ci0JCQloYXNTY2FubmVkRm9yRW5jb2RpbmdzID0gMTsKLQkJCW1haW5Hcm91cCA9IDA4RkI3Nzk0RkU4NDE1NURDMDJBQUMwNyAvKiBwbmcgKi87Ci0JCQlwcm9qZWN0RGlyUGF0aCA9ICIiOwotCQkJcHJvamVjdFJvb3QgPSAiIjsKLQkJCXRhcmdldHMgPSAoCi0JCQkJNUJGM0IxMTAxMjJCMUM4NjAwOTJBRTRFIC8qIGxpYnBuZyAqLywKLQkJCQk1QkYzQjE0ODEyMkRFNTFFMDA5MkFFNEUgLyogQ29uZmlndXJlICovLAotCQkJCUQyQUFDMDQ1MDU1NDY0RTUwMERCNTE4RCAvKiBsaWJwbmcgc3RhdGljIChNYWMgT1MgWCkgKi8sCi0JCQkJNUJGM0IwOEIxMjJCMUI2QTAwOTJBRTRFIC8qIGxpYnBuZyBkeW5hbWljIChNYWMgT1MgWCkgKi8sCi0JCQkJNUJGM0IwOTMxMjJCMUI5QjAwOTJBRTRFIC8qIGxpYnBuZyBzdGF0aWMgKGlPUykgKi8sCi0JCQkJNUJGM0IxMEIxMjJCMUMwNzAwOTJBRTRFIC8qIGxpYnBuZyBzdGF0aWMgKGlPUyBTaW11bGF0b3IgJiBEZXZpY2UpICovLAotCQkJKTsKLQkJfTsKLS8qIEVuZCBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KLQotLyogQmVnaW4gUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlIHNlY3Rpb24gKi8KLQkJNUJGM0IxMUQxMjJCMUQxNzAwOTJBRTRFIC8qIEdlbmVyYXRlIFVuaXZlcnNhbCBCaW5hcnkgKi8gPSB7Ci0JCQlpc2EgPSBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2U7Ci0JCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwotCQkJZmlsZXMgPSAoCi0JCQkpOwotCQkJaW5wdXRQYXRocyA9ICgKLQkJCSk7Ci0JCQluYW1lID0gIkdlbmVyYXRlIFVuaXZlcnNhbCBCaW5hcnkiOwotCQkJb3V0cHV0UGF0aHMgPSAoCi0JCQkpOwotCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7Ci0JCQlzaGVsbFBhdGggPSAvYmluL3NoOwotCQkJc2hlbGxTY3JpcHQgPSAibGlwbyAkQlVJTERfRElSLyRDT05GSUdVUkFUSU9OL2lwaG9uZW9zLyRFWEVDVVRBQkxFX05BTUUgJEJVSUxEX0RJUi8kQ09ORklHVVJBVElPTi9tYWNvc3gvJEVYRUNVVEFCTEVfTkFNRSAtY3JlYXRlIC1vdXRwdXQgJEJVSUxEX0RJUi8kQ09ORklHVVJBVElPTi8kRVhFQ1VUQUJMRV9OQU1FIjsKLQkJfTsKLQkJNUJGM0IxNDcxMjJERTUxRTAwOTJBRTRFIC8qIENvbmZpZ3VyZSAqLyA9IHsKLQkJCWlzYSA9IFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZTsKLQkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7Ci0JCQlmaWxlcyA9ICgKLQkJCSk7Ci0JCQlpbnB1dFBhdGhzID0gKAotCQkJKTsKLQkJCW5hbWUgPSBDb25maWd1cmU7Ci0JCQlvdXRwdXRQYXRocyA9ICgKLQkJCSk7Ci0JCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKLQkJCXNoZWxsUGF0aCA9IC9iaW4vc2g7Ci0JCQlzaGVsbFNjcmlwdCA9ICJpZiBbIC1lICRQUk9KRUNUX0RJUi8uLi8uLi9jb25maWd1cmUuaCBdOyB0aGVuXG5cdCRQUk9KRUNUX0RJUi8uLi8uLi9jb25maWd1cmVcbmZpXG5leGl0IDBcbiI7Ci0JCX07Ci0vKiBFbmQgUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlIHNlY3Rpb24gKi8KLQotLyogQmVnaW4gUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLwotCQk1QkYzQjA4OTEyMkIxQjZBMDA5MkFFNEUgLyogU291cmNlcyAqLyA9IHsKLQkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOwotCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKLQkJCWZpbGVzID0gKAotCQkJCTVCRjNCMERFMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmcuYyBpbiBTb3VyY2VzICovLAotCQkJCTVCRjNCMEUxMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdlcnJvci5jIGluIFNvdXJjZXMgKi8sCi0JCQkJNUJGM0IwRTMxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ2dldC5jIGluIFNvdXJjZXMgKi8sCi0JCQkJNUJGM0IwRTQxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ21lbS5jIGluIFNvdXJjZXMgKi8sCi0JCQkJNUJGM0IwRTUxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3ByZWFkLmMgaW4gU291cmNlcyAqLywKLQkJCQk1QkYzQjBFNjEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncmVhZC5jIGluIFNvdXJjZXMgKi8sCi0JCQkJNUJGM0IwRTcxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3Jpby5jIGluIFNvdXJjZXMgKi8sCi0JCQkJNUJGM0IwRTgxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3J0cmFuLmMgaW4gU291cmNlcyAqLywKLQkJCQk1QkYzQjBFOTEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncnV0aWwuYyBpbiBTb3VyY2VzICovLAotCQkJCTVCRjNCMEVBMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdzZXQuYyBpbiBTb3VyY2VzICovLAotCQkJCTVCRjNCMEVCMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd0cmFucy5jIGluIFNvdXJjZXMgKi8sCi0JCQkJNUJGM0IwRUQxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3dpby5jIGluIFNvdXJjZXMgKi8sCi0JCQkJNUJGM0IwRUUxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3dyaXRlLmMgaW4gU291cmNlcyAqLywKLQkJCQk1QkYzQjBFRjEyMkIxQkVFMDA5MkFFNEUgLyogcG5nd3RyYW4uYyBpbiBTb3VyY2VzICovLAotCQkJCTVCRjNCMEYwMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd3dXRpbC5jIGluIFNvdXJjZXMgKi8sCi0JCQkpOwotCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7Ci0JCX07Ci0JCTVCRjNCMDkxMTIyQjFCOUIwMDkyQUU0RSAvKiBTb3VyY2VzICovID0gewotCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7Ci0JCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwotCQkJZmlsZXMgPSAoCi0JCQkJNUJGM0IwRjIxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZy5jIGluIFNvdXJjZXMgKi8sCi0JCQkJNUJGM0IwRjUxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ2Vycm9yLmMgaW4gU291cmNlcyAqLywKLQkJCQk1QkYzQjBGNzEyMkIxQkVFMDA5MkFFNEUgLyogcG5nZ2V0LmMgaW4gU291cmNlcyAqLywKLQkJCQk1QkYzQjBGODEyMkIxQkVFMDA5MkFFNEUgLyogcG5nbWVtLmMgaW4gU291cmNlcyAqLywKLQkJCQk1QkYzQjBGOTEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncHJlYWQuYyBpbiBTb3VyY2VzICovLAotCQkJCTVCRjNCMEZBMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdyZWFkLmMgaW4gU291cmNlcyAqLywKLQkJCQk1QkYzQjBGQjEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncmlvLmMgaW4gU291cmNlcyAqLywKLQkJCQk1QkYzQjBGQzEyMkIxQkVFMDA5MkFFNEUgLyogcG5ncnRyYW4uYyBpbiBTb3VyY2VzICovLAotCQkJCTVCRjNCMEZEMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdydXRpbC5jIGluIFNvdXJjZXMgKi8sCi0JCQkJNUJGM0IwRkUxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3NldC5jIGluIFNvdXJjZXMgKi8sCi0JCQkJNUJGM0IwRkYxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3RyYW5zLmMgaW4gU291cmNlcyAqLywKLQkJCQk1QkYzQjEwMTEyMkIxQkVFMDA5MkFFNEUgLyogcG5nd2lvLmMgaW4gU291cmNlcyAqLywKLQkJCQk1QkYzQjEwMjEyMkIxQkVFMDA5MkFFNEUgLyogcG5nd3JpdGUuYyBpbiBTb3VyY2VzICovLAotCQkJCTVCRjNCMTAzMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd3dHJhbi5jIGluIFNvdXJjZXMgKi8sCi0JCQkJNUJGM0IxMDQxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3d1dGlsLmMgaW4gU291cmNlcyAqLywKLQkJCSk7Ci0JCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKLQkJfTsKLQkJRDJBQUMwNDQwNTU0NjRFNTAwREI1MThEIC8qIFNvdXJjZXMgKi8gPSB7Ci0JCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKLQkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7Ci0JCQlmaWxlcyA9ICgKLQkJCQk1QkYzQjBDQTEyMkIxQkVFMDA5MkFFNEUgLyogcG5nLmMgaW4gU291cmNlcyAqLywKLQkJCQk1QkYzQjBDRDEyMkIxQkVFMDA5MkFFNEUgLyogcG5nZXJyb3IuYyBpbiBTb3VyY2VzICovLAotCQkJCTVCRjNCMENGMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdnZXQuYyBpbiBTb3VyY2VzICovLAotCQkJCTVCRjNCMEQwMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdtZW0uYyBpbiBTb3VyY2VzICovLAotCQkJCTVCRjNCMEQxMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdwcmVhZC5jIGluIFNvdXJjZXMgKi8sCi0JCQkJNUJGM0IwRDIxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3JlYWQuYyBpbiBTb3VyY2VzICovLAotCQkJCTVCRjNCMEQzMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdyaW8uYyBpbiBTb3VyY2VzICovLAotCQkJCTVCRjNCMEQ0MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmdydHJhbi5jIGluIFNvdXJjZXMgKi8sCi0JCQkJNUJGM0IwRDUxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3J1dGlsLmMgaW4gU291cmNlcyAqLywKLQkJCQk1QkYzQjBENjEyMkIxQkVFMDA5MkFFNEUgLyogcG5nc2V0LmMgaW4gU291cmNlcyAqLywKLQkJCQk1QkYzQjBENzEyMkIxQkVFMDA5MkFFNEUgLyogcG5ndHJhbnMuYyBpbiBTb3VyY2VzICovLAotCQkJCTVCRjNCMEQ5MTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd3aW8uYyBpbiBTb3VyY2VzICovLAotCQkJCTVCRjNCMERBMTIyQjFCRUUwMDkyQUU0RSAvKiBwbmd3cml0ZS5jIGluIFNvdXJjZXMgKi8sCi0JCQkJNUJGM0IwREIxMjJCMUJFRTAwOTJBRTRFIC8qIHBuZ3d0cmFuLmMgaW4gU291cmNlcyAqLywKLQkJCQk1QkYzQjBEQzEyMkIxQkVFMDA5MkFFNEUgLyogcG5nd3V0aWwuYyBpbiBTb3VyY2VzICovLAotCQkJKTsKLQkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwotCQl9OwotLyogRW5kIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KLQotLyogQmVnaW4gUEJYVGFyZ2V0RGVwZW5kZW5jeSBzZWN0aW9uICovCi0JCTVCRjNCMTE0MTIyQjFDOUIwMDkyQUU0RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0gewotCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKLQkJCXRhcmdldCA9IDVCRjNCMDhCMTIyQjFCNkEwMDkyQUU0RSAvKiBsaWJwbmcgZHluYW1pYyAoTWFjIE9TIFgpICovOwotCQkJdGFyZ2V0UHJveHkgPSA1QkYzQjExMzEyMkIxQzlCMDA5MkFFNEUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOwotCQl9OwotCQk1QkYzQjExNjEyMkIxQzlCMDA5MkFFNEUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKLQkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7Ci0JCQl0YXJnZXQgPSA1QkYzQjEwQjEyMkIxQzA3MDA5MkFFNEUgLyogbGlicG5nIHN0YXRpYyAoaU9TIFNpbXVsYXRvciAmIERldmljZSkgKi87Ci0JCQl0YXJnZXRQcm94eSA9IDVCRjNCMTE1MTIyQjFDOUIwMDkyQUU0RSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87Ci0JCX07Ci0JCTVCRjNCMTE4MTIyQjFDQTUwMDkyQUU0RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0gewotCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKLQkJCXRhcmdldCA9IEQyQUFDMDQ1MDU1NDY0RTUwMERCNTE4RCAvKiBsaWJwbmcgc3RhdGljIChNYWMgT1MgWCkgKi87Ci0JCQl0YXJnZXRQcm94eSA9IDVCRjNCMTE3MTIyQjFDQTUwMDkyQUU0RSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87Ci0JCX07Ci0JCTVCRjNCMTFBMTIyQjFDQTUwMDkyQUU0RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0gewotCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKLQkJCXRhcmdldCA9IDVCRjNCMDkzMTIyQjFCOUIwMDkyQUU0RSAvKiBsaWJwbmcgc3RhdGljIChpT1MpICovOwotCQkJdGFyZ2V0UHJveHkgPSA1QkYzQjExOTEyMkIxQ0E1MDA5MkFFNEUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOwotCQl9OwotCQk1QkYzQjE1OTEyMkRFNUNDMDA5MkFFNEUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKLQkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7Ci0JCQl0YXJnZXQgPSA1QkYzQjE0ODEyMkRFNTFFMDA5MkFFNEUgLyogQ29uZmlndXJlICovOwotCQkJdGFyZ2V0UHJveHkgPSA1QkYzQjE1ODEyMkRFNUNDMDA5MkFFNEUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOwotCQl9OwotCQk1QkYzQjE1QjEyMkRFNUQyMDA5MkFFNEUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKLQkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7Ci0JCQl0YXJnZXQgPSA1QkYzQjE0ODEyMkRFNTFFMDA5MkFFNEUgLyogQ29uZmlndXJlICovOwotCQkJdGFyZ2V0UHJveHkgPSA1QkYzQjE1QTEyMkRFNUQyMDA5MkFFNEUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOwotCQl9OwotCQk1QkYzQjE1RDEyMkRFNUQ4MDA5MkFFNEUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKLQkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7Ci0JCQl0YXJnZXQgPSA1QkYzQjE0ODEyMkRFNTFFMDA5MkFFNEUgLyogQ29uZmlndXJlICovOwotCQkJdGFyZ2V0UHJveHkgPSA1QkYzQjE1QzEyMkRFNUQ4MDA5MkFFNEUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOwotCQl9OwotLyogRW5kIFBCWFRhcmdldERlcGVuZGVuY3kgc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCi0JCTFERUI5MUVDMDg3MzNEQjcwMDEwRTlDRCAvKiBEZWJ1ZyAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTzsKLQkJCQlDT05GSUdVUkFUSU9OX0JVSUxEX0RJUiA9ICIkKEJVSUxEX0RJUikvJChDT05GSUdVUkFUSU9OKS8kKFBMQVRGT1JNX05BTUUpIjsKLQkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87Ci0JCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87Ci0JCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gWUVTOwotCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKLQkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMDsKLQkJCQlJTlNUQUxMX1BBVEggPSAvdXNyL2xvY2FsL2xpYjsKLQkJCQlPTkxZX0FDVElWRV9BUkNIID0gTk87Ci0JCQkJT1RIRVJfQ0ZMQUdTID0gIi1ESEFWRV9DT05GSUdfSCI7Ci0JCQkJUFJPRFVDVF9OQU1FID0gcG5nOwotCQkJfTsKLQkJCW5hbWUgPSBEZWJ1ZzsKLQkJfTsKLQkJMURFQjkxRUQwODczM0RCNzAwMTBFOUNEIC8qIFJlbGVhc2UgKi8gPSB7Ci0JCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKLQkJCWJ1aWxkU2V0dGluZ3MgPSB7Ci0JCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gTk87Ci0JCQkJQ09ORklHVVJBVElPTl9CVUlMRF9ESVIgPSAiJChCVUlMRF9ESVIpLyQoQ09ORklHVVJBVElPTikvJChQTEFURk9STV9OQU1FKSI7Ci0JCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gImR3YXJmLXdpdGgtZHN5bSI7Ci0JCQkJR0NDX01PREVMX1RVTklORyA9IEc1OwotCQkJCUlOU1RBTExfUEFUSCA9IC91c3IvbG9jYWwvbGliOwotCQkJCU9OTFlfQUNUSVZFX0FSQ0ggPSBOTzsKLQkJCQlPVEhFUl9DRkxBR1MgPSAiLURIQVZFX0NPTkZJR19IIjsKLQkJCQlQUk9EVUNUX05BTUUgPSBwbmc7Ci0JCQl9OwotCQkJbmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTFERUI5MUYwMDg3MzNEQjcwMDEwRTlDRCAvKiBEZWJ1ZyAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCQlBUkNIUyA9ICIkKEFSQ0hTX1NUQU5EQVJEXzMyXzY0X0JJVCkiOwotCQkJCUdDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gZ251OTk7Ci0JCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7Ci0JCQkJR0NDX1dBUk5fQUJPVVRfUkVUVVJOX1RZUEUgPSBZRVM7Ci0JCQkJR0NDX1dBUk5fVU5VU0VEX1ZBUklBQkxFID0gWUVTOwotCQkJCU9OTFlfQUNUSVZFX0FSQ0ggPSBZRVM7Ci0JCQkJUFJFQklORElORyA9IE5POwotCQkJCVNES1JPT1QgPSBtYWNvc3gxMC42OwotCQkJfTsKLQkJCW5hbWUgPSBEZWJ1ZzsKLQkJfTsKLQkJMURFQjkxRjEwODczM0RCNzAwMTBFOUNEIC8qIFJlbGVhc2UgKi8gPSB7Ci0JCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKLQkJCWJ1aWxkU2V0dGluZ3MgPSB7Ci0JCQkJQVJDSFMgPSAiJChBUkNIU19TVEFOREFSRF8zMl82NF9CSVQpIjsKLQkJCQlHQ0NfQ19MQU5HVUFHRV9TVEFOREFSRCA9IGdudTk5OwotCQkJCUdDQ19XQVJOX0FCT1VUX1JFVFVSTl9UWVBFID0gWUVTOwotCQkJCUdDQ19XQVJOX1VOVVNFRF9WQVJJQUJMRSA9IFlFUzsKLQkJCQlQUkVCSU5ESU5HID0gTk87Ci0JCQkJU0RLUk9PVCA9IG1hY29zeDEwLjY7Ci0JCQl9OwotCQkJbmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTVCRjNCMDhEMTIyQjFCNkEwMDkyQUU0RSAvKiBEZWJ1ZyAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTzsKLQkJCQlDT05GSUdVUkFUSU9OX0JVSUxEX0RJUiA9ICIkKEJVSUxEX0RJUikvJChDT05GSUdVUkFUSU9OKS8kKFBMQVRGT1JNX05BTUUpIjsKLQkJCQlDT05GSUdVUkFUSU9OX1RFTVBfRElSID0gIiQoUFJPSkVDVF9URU1QX0RJUikvJChDT05GSUdVUkFUSU9OKS8kKFBMQVRGT1JNX05BTUUpIjsKLQkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87Ci0JCQkJRFlMSUJfQ09NUEFUSUJJTElUWV9WRVJTSU9OID0gMTsKLQkJCQlEWUxJQl9DVVJSRU5UX1ZFUlNJT04gPSAxOwotCQkJCUVYRUNVVEFCTEVfUFJFRklYID0gbGliOwotCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POwotCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IFlFUzsKLQkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7Ci0JCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7Ci0JCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKLQkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICIiOwotCQkJCUlOU1RBTExfUEFUSCA9IC91c3IvbG9jYWwvbGliOwotCQkJCU9OTFlfQUNUSVZFX0FSQ0ggPSBOTzsKLQkJCQlPVEhFUl9DRkxBR1MgPSAiLURIQVZFX0NPTkZJR19IIjsKLQkJCQlPVEhFUl9MREZMQUdTID0gIiI7Ci0JCQkJUFJFQklORElORyA9IE5POwotCQkJCVBST0RVQ1RfTkFNRSA9IHBuZzsKLQkJCX07Ci0JCQluYW1lID0gRGVidWc7Ci0JCX07Ci0JCTVCRjNCMDhFMTIyQjFCNkEwMDkyQUU0RSAvKiBSZWxlYXNlICovID0gewotCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247Ci0JCQlidWlsZFNldHRpbmdzID0gewotCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IE5POwotCQkJCUNPTkZJR1VSQVRJT05fQlVJTERfRElSID0gIiQoQlVJTERfRElSKS8kKENPTkZJR1VSQVRJT04pLyQoUExBVEZPUk1fTkFNRSkiOwotCQkJCUNPTkZJR1VSQVRJT05fVEVNUF9ESVIgPSAiJChQUk9KRUNUX1RFTVBfRElSKS8kKENPTkZJR1VSQVRJT04pLyQoUExBVEZPUk1fTkFNRSkiOwotCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBZRVM7Ci0JCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gImR3YXJmLXdpdGgtZHN5bSI7Ci0JCQkJRFlMSUJfQ09NUEFUSUJJTElUWV9WRVJTSU9OID0gMTsKLQkJCQlEWUxJQl9DVVJSRU5UX1ZFUlNJT04gPSAxOwotCQkJCUVYRUNVVEFCTEVfUFJFRklYID0gbGliOwotCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IE5POwotCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKLQkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOwotCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiI7Ci0JCQkJSU5TVEFMTF9QQVRIID0gL3Vzci9sb2NhbC9saWI7Ci0JCQkJT05MWV9BQ1RJVkVfQVJDSCA9IE5POwotCQkJCU9USEVSX0NGTEFHUyA9ICItREhBVkVfQ09ORklHX0giOwotCQkJCU9USEVSX0xERkxBR1MgPSAiIjsKLQkJCQlQUkVCSU5ESU5HID0gTk87Ci0JCQkJUFJPRFVDVF9OQU1FID0gcG5nOwotCQkJCVpFUk9fTElOSyA9IE5POwotCQkJfTsKLQkJCW5hbWUgPSBSZWxlYXNlOwotCQl9OwotCQk1QkYzQjA5NTEyMkIxQjlCMDA5MkFFNEUgLyogRGVidWcgKi8gPSB7Ci0JCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKLQkJCWJ1aWxkU2V0dGluZ3MgPSB7Ci0JCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gTk87Ci0JCQkJQVJDSFMgPSAiJChBUkNIU19TVEFOREFSRF8zMl9CSVQpIjsKLQkJCQlDT05GSUdVUkFUSU9OX0JVSUxEX0RJUiA9ICIkKEJVSUxEX0RJUikvJChDT05GSUdVUkFUSU9OKS8kKFBMQVRGT1JNX05BTUUpIjsKLQkJCQlDT05GSUdVUkFUSU9OX1RFTVBfRElSID0gIiQoUFJPSkVDVF9URU1QX0RJUikvJChDT05GSUdVUkFUSU9OKS8kKFBMQVRGT1JNX05BTUUpIjsKLQkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87Ci0JCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87Ci0JCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7Ci0JCQkJT05MWV9BQ1RJVkVfQVJDSCA9IE5POwotCQkJCU9USEVSX0NGTEFHUyA9ICItREhBVkVfQ09ORklHX0giOwotCQkJCVBSRUJJTkRJTkcgPSBOTzsKLQkJCQlQUk9EVUNUX05BTUUgPSBwbmc7Ci0JCQkJU0RLUk9PVCA9IGlwaG9uZW9zNC4wOwotCQkJfTsKLQkJCW5hbWUgPSBEZWJ1ZzsKLQkJfTsKLQkJNUJGM0IwOTYxMjJCMUI5QjAwOTJBRTRFIC8qIFJlbGVhc2UgKi8gPSB7Ci0JCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKLQkJCWJ1aWxkU2V0dGluZ3MgPSB7Ci0JCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gTk87Ci0JCQkJQVJDSFMgPSAiJChBUkNIU19TVEFOREFSRF8zMl9CSVQpIjsKLQkJCQlDT05GSUdVUkFUSU9OX0JVSUxEX0RJUiA9ICIkKEJVSUxEX0RJUikvJChDT05GSUdVUkFUSU9OKS8kKFBMQVRGT1JNX05BTUUpIjsKLQkJCQlDT05GSUdVUkFUSU9OX1RFTVBfRElSID0gIiQoUFJPSkVDVF9URU1QX0RJUikvJChDT05GSUdVUkFUSU9OKS8kKFBMQVRGT1JNX05BTUUpIjsKLQkJCQlDT1BZX1BIQVNFX1NUUklQID0gWUVTOwotCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9ICJkd2FyZi13aXRoLWRzeW0iOwotCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IE5POwotCQkJCU9OTFlfQUNUSVZFX0FSQ0ggPSBOTzsKLQkJCQlPVEhFUl9DRkxBR1MgPSAiLURIQVZFX0NPTkZJR19IIjsKLQkJCQlQUkVCSU5ESU5HID0gTk87Ci0JCQkJUFJPRFVDVF9OQU1FID0gcG5nOwotCQkJCVNES1JPT1QgPSBpcGhvbmVvczQuMDsKLQkJCQlaRVJPX0xJTksgPSBOTzsKLQkJCX07Ci0JCQluYW1lID0gUmVsZWFzZTsKLQkJfTsKLQkJNUJGM0IxMEQxMjJCMUMwNzAwOTJBRTRFIC8qIERlYnVnICovID0gewotCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247Ci0JCQlidWlsZFNldHRpbmdzID0gewotCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IE5POwotCQkJCUNPTkZJR1VSQVRJT05fQlVJTERfRElSID0gIiQoQlVJTERfRElSKS8kKENPTkZJR1VSQVRJT04pIjsKLQkJCQlDT05GSUdVUkFUSU9OX1RFTVBfRElSID0gIiQoUFJPSkVDVF9URU1QX0RJUikvJChDT05GSUdVUkFUSU9OKSI7Ci0JCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POwotCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POwotCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOwotCQkJCVBSRUJJTkRJTkcgPSBOTzsKLQkJCQlQUk9EVUNUX05BTUUgPSBwbmc7Ci0JCQl9OwotCQkJbmFtZSA9IERlYnVnOwotCQl9OwotCQk1QkYzQjEwRTEyMkIxQzA3MDA5MkFFNEUgLyogUmVsZWFzZSAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTzsKLQkJCQlDT05GSUdVUkFUSU9OX0JVSUxEX0RJUiA9ICIkKEJVSUxEX0RJUikvJChDT05GSUdVUkFUSU9OKSI7Ci0JCQkJQ09ORklHVVJBVElPTl9URU1QX0RJUiA9ICIkKFBST0pFQ1RfVEVNUF9ESVIpLyQoQ09ORklHVVJBVElPTikiOwotCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBZRVM7Ci0JCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gImR3YXJmLXdpdGgtZHN5bSI7Ci0JCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87Ci0JCQkJUFJFQklORElORyA9IE5POwotCQkJCVBST0RVQ1RfTkFNRSA9IHBuZzsKLQkJCQlaRVJPX0xJTksgPSBOTzsKLQkJCX07Ci0JCQluYW1lID0gUmVsZWFzZTsKLQkJfTsKLQkJNUJGM0IxMTExMjJCMUM4NjAwOTJBRTRFIC8qIERlYnVnICovID0gewotCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247Ci0JCQlidWlsZFNldHRpbmdzID0gewotCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKLQkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKLQkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMDsKLQkJCQlQUk9EVUNUX05BTUUgPSAibGlicG5nIChpT1MpIjsKLQkJCX07Ci0JCQluYW1lID0gRGVidWc7Ci0JCX07Ci0JCTVCRjNCMTEyMTIyQjFDODYwMDkyQUU0RSAvKiBSZWxlYXNlICovID0gewotCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247Ci0JCQlidWlsZFNldHRpbmdzID0gewotCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBZRVM7Ci0JCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gImR3YXJmLXdpdGgtZHN5bSI7Ci0JCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87Ci0JCQkJUFJPRFVDVF9OQU1FID0gImxpYnBuZyAoaU9TKSI7Ci0JCQkJWkVST19MSU5LID0gTk87Ci0JCQl9OwotCQkJbmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTVCRjNCMTQ5MTIyREU1MUYwMDkyQUU0RSAvKiBEZWJ1ZyAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87Ci0JCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87Ci0JCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7Ci0JCQkJUFJPRFVDVF9OQU1FID0gQ29uZmlndXJlOwotCQkJfTsKLQkJCW5hbWUgPSBEZWJ1ZzsKLQkJfTsKLQkJNUJGM0IxNEExMjJERTUxRjAwOTJBRTRFIC8qIFJlbGVhc2UgKi8gPSB7Ci0JCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKLQkJCWJ1aWxkU2V0dGluZ3MgPSB7Ci0JCQkJQ09QWV9QSEFTRV9TVFJJUCA9IFlFUzsKLQkJCQlERUJVR19JTkZPUk1BVElPTl9GT1JNQVQgPSAiZHdhcmYtd2l0aC1kc3ltIjsKLQkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKLQkJCQlQUk9EVUNUX05BTUUgPSBDb25maWd1cmU7Ci0JCQkJWkVST19MSU5LID0gTk87Ci0JCQl9OwotCQkJbmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0vKiBFbmQgWENCdWlsZENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KLQkJMURFQjkxRUIwODczM0RCNzAwMTBFOUNEIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJsaWJwbmcgc3RhdGljIChNYWMgT1MgWCkiICovID0gewotCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKLQkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCi0JCQkJMURFQjkxRUMwODczM0RCNzAwMTBFOUNEIC8qIERlYnVnICovLAotCQkJCTFERUI5MUVEMDg3MzNEQjcwMDEwRTlDRCAvKiBSZWxlYXNlICovLAotCQkJKTsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTFERUI5MUVGMDg3MzNEQjcwMDEwRTlDRCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgImxpYnBuZyIgKi8gPSB7Ci0JCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OwotCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKLQkJCQkxREVCOTFGMDA4NzMzREI3MDAxMEU5Q0QgLyogRGVidWcgKi8sCi0JCQkJMURFQjkxRjEwODczM0RCNzAwMTBFOUNEIC8qIFJlbGVhc2UgKi8sCi0JCQkpOwotCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOwotCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKLQkJfTsKLQkJNUJGM0IwOEYxMjJCMUI5ODAwOTJBRTRFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJsaWJwbmcgZHluYW1pYyAoTWFjIE9TIFgpIiAqLyA9IHsKLQkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7Ci0JCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAotCQkJCTVCRjNCMDhEMTIyQjFCNkEwMDkyQUU0RSAvKiBEZWJ1ZyAqLywKLQkJCQk1QkYzQjA4RTEyMkIxQjZBMDA5MkFFNEUgLyogUmVsZWFzZSAqLywKLQkJCSk7Ci0JCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7Ci0JCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOwotCQl9OwotCQk1QkYzQjA5QTEyMkIxQjlGMDA5MkFFNEUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImxpYnBuZyBzdGF0aWMgKGlPUykiICovID0gewotCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKLQkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCi0JCQkJNUJGM0IwOTUxMjJCMUI5QjAwOTJBRTRFIC8qIERlYnVnICovLAotCQkJCTVCRjNCMDk2MTIyQjFCOUIwMDkyQUU0RSAvKiBSZWxlYXNlICovLAotCQkJKTsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTVCRjNCMTBGMTIyQjFDM0EwMDkyQUU0RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAibGlicG5nIHN0YXRpYyAoaU9TIFNpbXVsYXRvciAmIERldmljZSkiICovID0gewotCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKLQkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCi0JCQkJNUJGM0IxMEQxMjJCMUMwNzAwOTJBRTRFIC8qIERlYnVnICovLAotCQkJCTVCRjNCMTBFMTIyQjFDMDcwMDkyQUU0RSAvKiBSZWxlYXNlICovLAotCQkJKTsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTVCRjNCMTFCMTIyQjFDRDgwMDkyQUU0RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAibGlicG5nIiAqLyA9IHsKLQkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7Ci0JCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAotCQkJCTVCRjNCMTExMTIyQjFDODYwMDkyQUU0RSAvKiBEZWJ1ZyAqLywKLQkJCQk1QkYzQjExMjEyMkIxQzg2MDA5MkFFNEUgLyogUmVsZWFzZSAqLywKLQkJCSk7Ci0JCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7Ci0JCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOwotCQl9OwotCQk1QkYzQjE0QjEyMkRFNTQzMDA5MkFFNEUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIkNvbmZpZ3VyZSIgKi8gPSB7Ci0JCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OwotCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKLQkJCQk1QkYzQjE0OTEyMkRFNTFGMDA5MkFFNEUgLyogRGVidWcgKi8sCi0JCQkJNUJGM0IxNEExMjJERTUxRjAwOTJBRTRFIC8qIFJlbGVhc2UgKi8sCi0JCQkpOwotCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOwotCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKLQkJfTsKLS8qIEVuZCBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KLQl9OwotCXJvb3RPYmplY3QgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87Ci19CmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3NjcmlwdHMvUkVBRE1FLnR4dCBiL3NyYy9saWJwbmcvc2NyaXB0cy9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Q3MWNjLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotCi1NYWtlZmlsZXMgZm9yICBsaWJwbmcgdmVyc2lvbiAxLjQuMTIgLSBKdWx5IDEwLCAyMDEyCi0KLSBtYWtlZmlsZS5saW51eCAgICA9PiAgTGludXgvRUxGIG1ha2VmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgIChnY2MsIGNyZWF0ZXMgbGlicG5nMTQuc28uMTQuMS40LjEyKQotIG1ha2VmaWxlLmdjYyAgICAgID0+ICBHZW5lcmljIG1ha2VmaWxlIChnY2MsIGNyZWF0ZXMgc3RhdGljIGxpYnBuZy5hKQotIG1ha2VmaWxlLmtuciAgICAgID0+ICBBcmNoYWljIFVOSVggTWFrZWZpbGUgdGhhdCBjb252ZXJ0cyBmaWxlcyB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgIGFuc2kya25yIChSZXF1aXJlcyBhbnNpMmtuci5jIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgZnRwOi8vZnRwLmNzLndpc2MuZWR1L2dob3N0KQotIG1ha2VmaWxlLmFjb3JuICAgID0+ICBBY29ybiBtYWtlZmlsZQotIG1ha2VmaWxlLmFpeCAgICAgID0+ICBBSVgvZ2NjIG1ha2VmaWxlCi0gbWFrZWZpbGUuYW1pZ2EgICAgPT4gIEFtaWdhIG1ha2VmaWxlCi0gbWFrZWZpbGUuYXRhcmkgICAgPT4gIEF0YXJpIG1ha2VmaWxlCi0gbWFrZWZpbGUuYmMzMiAgICAgPT4gIDMyLWJpdCBCb3JsYW5kIEMrKyAoYWxsIG1vZHVsZXMgY29tcGlsZWQgaW4gQyBtb2RlKQotIG1ha2VmaWxlLmJlb3MgICAgID0+ICBiZW9zIG1ha2VmaWxlCi0gbWFrZWZpbGUuYm9yICAgICAgPT4gIEJvcmxhbmQgbWFrZWZpbGUgKHVzZXMgYmNjKQotIG1ha2VmaWxlLmNlZ2NjICAgID0+ICBtaW5nZTMyY2UgZm9yIFdpbmRvd3MgQ0UgbWFrZWZpbGUKLSBtYWtlZmlsZS5jeWd3aW4gICA9PiAgQ3lnd2luL2djYyBtYWtlZmlsZQotIG1ha2VmaWxlLmRhcndpbiAgID0+ICBEYXJ3aW4gbWFrZWZpbGUsIGNhbiB1c2Ugb24gTWFjb3NYCi0gbWFrZWZpbGUuZGVjICAgICAgPT4gIERFQyBBbHBoYSBVTklYIG1ha2VmaWxlCi0gbWFrZWZpbGUuZGoyICAgICAgPT4gIERKR1BQIDIgbWFrZWZpbGUKLSBtYWtlZmlsZS5lbGYgICAgICA9PiAgTGludXgvRUxGIG1ha2VmaWxlIHN5bWJvbCB2ZXJzaW9uaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAoZ2NjLCBjcmVhdGVzIGxpYnBuZzE0LnNvLjE0LjEuNC4xMikKLSBtYWtlZmlsZS5mcmVlYnNkICA9PiAgRnJlZUJTRCBtYWtlZmlsZQotIG1ha2VmaWxlLmdjYyAgICAgID0+ICBHZW5lcmljIGdjYyBtYWtlZmlsZQotIG1ha2VmaWxlLmhwZ2NjICAgID0+ICBIUFVYIG1ha2VmaWxlIHVzaW5nIGdjYwotIG1ha2VmaWxlLmhwdXggICAgID0+ICBIUFVYICgxMC4yMCBhbmQgMTEuMDApIG1ha2VmaWxlCi0gbWFrZWZpbGUuaHA2NCAgICAgPT4gIEhQVVggKDEwLjIwIGFuZCAxMS4wMCkgbWFrZWZpbGUsIDY0LWJpdAotIG1ha2VmaWxlLmlibWMgICAgID0+ICBJQk0gQy9DKysgdmVyc2lvbiAzLnggZm9yIFdpbjMyIGFuZCBPUy8yIChzdGF0aWMpCi0gbWFrZWZpbGUuaW50ZWwgICAgPT4gIEludGVsIEMvQysrIHZlcnNpb24gNC4wIGFuZCBsYXRlcgotIG1ha2VmaWxlLm1pbmd3ICAgID0+ICBNaW5ndyBtYWtlZmlsZQotIG1ha2VmaWxlLm1pcHMgICAgID0+ICBNSVBTIG1ha2VmaWxlCi0gbWFrZWZpbGUubXNjICAgICAgPT4gIE1pY3Jvc29mdCBDIG1ha2VmaWxlCi0gbWFrZWZpbGUubmV0YnNkICAgPT4gIE5ldEJTRC9jYyBtYWtlZmlsZSwgbWFrZXMgbGlicG5nLnNvLgotIG1ha2VmaWxlLm9wZW5ic2QgID0+ICBPcGVuQlNEIG1ha2VmaWxlCi0gbWFrZWZpbGUub3MyICAgICAgPT4gIE9TLzIgTWFrZWZpbGUgKGdjYyBhbmQgZW14LCByZXF1aXJlcyBwbmdvczIuZGVmKQotIG1ha2VmaWxlLnNjbyAgICAgID0+ICBGb3IgU0NPIE9TcjUgIEVMRiBhbmQgVW5peHdhcmUgNyB3aXRoIE5hdGl2ZSBjYwotIG1ha2VmaWxlLnNnZ2NjICAgID0+ICBTaWxpY29uIEdyYXBoaWNzIChnY2MsCi0gICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZXMgbGlicG5nMTQuc28uMTQuMS40LjEyKQotIG1ha2VmaWxlLnNnaSAgICAgID0+ICBTaWxpY29uIEdyYXBoaWNzIElSSVggbWFrZWZpbGUgKGNjLCBjcmVhdGVzIHN0YXRpYyBsaWIpCi0gbWFrZWZpbGUuc29sYXJpcyAgPT4gIFNvbGFyaXMgMi5YIG1ha2VmaWxlIChnY2MsCi0gICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZXMgbGlicG5nMTQuc28uMTQuMS40LjEyKQotIG1ha2VmaWxlLnNvOSAgICAgID0+ICBTb2xhcmlzIDkgbWFrZWZpbGUgKGdjYywKLSAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlcyBsaWJwbmcxNC5zby4xNC4xLjQuMTIpCi0gbWFrZWZpbGUuc3RkICAgICAgPT4gIEdlbmVyaWMgVU5JWCBtYWtlZmlsZSAoY2MsIGNyZWF0ZXMgc3RhdGljIGxpYnBuZy5hKQotIG1ha2VmaWxlLnN1bm9zICAgID0+ICBTdW4gbWFrZWZpbGUKLSBtYWtlZmlsZS4zMnN1bnUgICA9PiAgU3VuIFVsdHJhIDMyLWJpdCBtYWtlZmlsZQotIG1ha2VmaWxlLjY0c3VudSAgID0+ICBTdW4gVWx0cmEgNjQtYml0IG1ha2VmaWxlCi0gbWFrZWZpbGUudGMzICAgICAgPT4gIFR1cmJvIEMgMy4wIG1ha2VmaWxlCi0gbWFrZWZpbGUudmN3aW4zMiAgPT4gIG1ha2VmaWxlIGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyA0LjAgYW5kIGxhdGVyCi0gbWFrZWZpbGUud2F0Y29tICAgPT4gIFdhdGNvbSAxMGErIE1ha2VmaWxlLCAzMi1iaXQgZmxhdCBtZW1vcnkgbW9kZWwKLSBtYWtldm1zLmNvbSAgICAgICA9PiAgVk1TIGJ1aWxkIHNjcmlwdAotIHNtYWtlZmlsZS5wcGMgICAgID0+ICBBTUlHQSBzbWFrZWZpbGUgZm9yIFNBUyBDIFY2LjU4LzcuMDAgUFBDIGNvbXBpbGVyCi0gICAgICAgICAgICAgICAgICAgICAgIChSZXF1aXJlcyBTQ09QVElPTlMsIGNvcGllZCBmcm9tIHNjcmlwdHMvU0NPUFRJT05TLnBwYykKLQotT3RoZXIgc3VwcG9ydGluZyBzY3JpcHRzOgotIGRlc2NyaXAubW1zICAgICAgID0+ICBWTVMgbWFrZWZpbGUgZm9yIE1NUyBvciBNTUsKLSBsaWJwbmctY29uZmlnLWJvZHkuaW4gPT4gdXNlZCBieSBzZXZlcmFsIG1ha2VmaWxlcyB0byBjcmVhdGUgbGlicG5nLWNvbmZpZwotIGxpYnBuZy1jb25maWctaGVhZC5pbiA9PiB1c2VkIGJ5IHNldmVyYWwgbWFrZWZpbGVzIHRvIGNyZWF0ZSBsaWJwbmctY29uZmlnCi0gbGlicG5nLnBjLmluICAgICAgPT4gIFVzZWQgYnkgc2V2ZXJhbCBtYWtlZmlsZXMgdG8gY3JlYXRlIGxpYnBuZy5wYwotIHBuZ29zMi5kZWYgICAgICAgID0+ICBPUy8yIG1vZHVsZSBkZWZpbml0aW9uIGZpbGUgdXNlZCBieSBtYWtlZmlsZS5vczIKLSBwbmd3aW4uZGVmICAgICAgICA9PiAgTW9kdWxlIGRlZmluaXRpb25zIGZvciBtYWtlZmlsZS5jeWd3aW4gYW5kIG1pbmd3Ci0gcG5nMzJjZS5kZWYgICAgICAgPT4gIE1vZHVsZSBkZWZpbml0aW9uIGZpbGUgdXNlZCBieSBtYWtlZmlsZS5jZWdjYwotIHBuZ3dpbi5yYyAgICAgICAgID0+ICBVc2VkIGJ5IHRoZSB2aXN1YWxjNiBhbmQgdmlzdWFsYzcxIHByb2plY3RzLgotIFNDT1BUSU9OUy5wcGMgICAgID0+ICBVc2VkIHdpdGggc21ha2VmaWxlLnBwYwotCi1GdXJ0aGVyIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBjb21tZW50cyBpbiB0aGUgaW5kaXZpZHVhbCBtYWtlZmlsZXMuCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3NjcmlwdHMvU0NPUFRJT05TLnBwYyBiL3NyYy9saWJwbmcvc2NyaXB0cy9TQ09QVElPTlMucHBjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzM1MDNlLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9TQ09QVElPTlMucHBjCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1PUFRJTUlaRQotT1BUUEVFUAotT1BUVElNRQotT1BUU0NIRUQKLUFVVE9SRUdJU1RFUgotUEFSTVM9UkVHSVNURVJTCi1JTkNMVURFRElSPWhscDpwcGMvaW5jbHVkZQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL2Rlc2NyaXAubW1zIGIvc3JjL2xpYnBuZy9zY3JpcHRzL2Rlc2NyaXAubW1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDY0MmMwLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9kZXNjcmlwLm1tcworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLQotY2NfZGVmcyA9IC9pbmM9JChaTElCU1JDKQotY19kZWIgPQotCi0uaWZkZWYgX19ERUNDX18KLXByZWYgPSAvcHJlZml4PWFsbAotLmVuZGlmCi0KLQotCi1PQkpTID0gcG5nLm9iaiwgcG5nc2V0Lm9iaiwgcG5nZ2V0Lm9iaiwgcG5ncnV0aWwub2JqLCBwbmd0cmFucy5vYmosXAotCXBuZ3d1dGlsLm9iaiwgcG5ncmVhZC5vYmosIHBuZ21lbS5vYmosIHBuZ3dyaXRlLm9iaiwgcG5ncnRyYW4ub2JqLFwKLQlwbmd3dHJhbi5vYmosIHBuZ3Jpby5vYmosIHBuZ3dpby5vYmosIHBuZ2Vycm9yLm9iaiwgcG5ncHJlYWQub2JqCi0KLQotQ0ZMQUdTPSAkKENfREVCKSAkKENDX0RFRlMpICQoUFJFRikKLQotYWxsIDogcG5ndGVzdC5leGUgbGlicG5nLm9sYgotCQlAIHdyaXRlIHN5cyRvdXRwdXQgIiBwbmd0ZXN0IGF2YWlsYWJsZSIKLQotbGlicG5nLm9sYiA6IGxpYnBuZy5vbGIoJChPQkpTKSkKLQlAIHdyaXRlIHN5cyRvdXRwdXQgIiBMaWJwbmcgYXZhaWxhYmxlIgotCi0KLXBuZ3Rlc3QuZXhlIDogcG5ndGVzdC5vYmogbGlicG5nLm9sYgotICAgICAgICAgICAgICBsaW5rIHBuZ3Rlc3QsbGlicG5nLm9sYi9saWIsJChaTElCU1JDKWxpYnoub2xiL2xpYgotCi10ZXN0IDogcG5ndGVzdC5leGUKLSAgIHJ1biBwbmd0ZXN0Ci0KLWNsZWFuIDoKLQlkZWxldGUgKi5vYmo7KiwqLmV4ZTsKLQotCi0jIE90aGVyIGRlcGVuZGVuY2llcy4KLXBuZy5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdwcml2LmgKLXBuZ3ByZWFkLm9iaiA6IHBuZy5oLCBwbmdjb25mLmgsIHBuZ3ByaXYuaAotcG5nc2V0Lm9iaiA6IHBuZy5oLCBwbmdjb25mLmgsIHBuZ3ByaXYuaAotcG5nZ2V0Lm9iaiA6IHBuZy5oLCBwbmdjb25mLmgsIHBuZ3ByaXYuaAotcG5ncmVhZC5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdwcml2LmgKLXBuZ3J0cmFuLm9iaiA6IHBuZy5oLCBwbmdjb25mLmgsIHBuZ3ByaXYuaAotcG5ncnV0aWwub2JqIDogcG5nLmgsIHBuZ2NvbmYuaCwgcG5ncHJpdi5oCi1wbmdlcnJvci5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdwcml2LmgKLXBuZ21lbS5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdwcml2LmgKLXBuZ3Jpby5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdwcml2LmgKLXBuZ3dpby5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdwcml2LmgKLXBuZ3RyYW5zLm9iaiA6IHBuZy5oLCBwbmdjb25mLmgsIHBuZ3ByaXYuaAotcG5nd3JpdGUub2JqIDogcG5nLmgsIHBuZ2NvbmYuaCwgcG5ncHJpdi5oCi1wbmd3dHJhbi5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdwcml2LmgKLXBuZ3d1dGlsLm9iaiA6IHBuZy5oLCBwbmdjb25mLmgsIHBuZ3ByaXYuaAotCi1wbmd0ZXN0Lm9iaiA6IHBuZy5oLCBwbmdjb25mLmgKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gYi9zcmMvbGlicG5nL3NjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDY2NDMyLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0KLXVzYWdlKCkKLXsKLSAgICBjYXQgPDxFT0YKLVVzYWdlOiBsaWJwbmctY29uZmlnIFtPUFRJT05dIC4uLgotCi1Lbm93biB2YWx1ZXMgZm9yIE9QVElPTiBhcmU6Ci0KLSAgLS1wcmVmaXggICAgICAgIHByaW50IGxpYnBuZyBwcmVmaXgKLSAgLS1saWJkaXIgICAgICAgIHByaW50IHBhdGggdG8gZGlyZWN0b3J5IGNvbnRhaW5pbmcgbGlicmFyeQotICAtLWxpYnMgICAgICAgICAgcHJpbnQgbGlicmFyeSBsaW5raW5nIGluZm9ybWF0aW9uCi0gIC0tY2NvcHRzICAgICAgICBwcmludCBjb21waWxlciBvcHRpb25zCi0gIC0tY3BwZmxhZ3MgICAgICBwcmludCBwcmUtcHJvY2Vzc29yIGZsYWdzCi0gIC0tY2ZsYWdzICAgICAgICBwcmludCBwcmVwcm9jZXNzb3IgZmxhZ3MsIElfb3B0cywgYW5kIGNvbXBpbGVyIG9wdGlvbnMKLSAgLS1JX29wdHMgICAgICAgIHByaW50ICItSSIgaW5jbHVkZSBvcHRpb25zCi0gIC0tTF9vcHRzICAgICAgICBwcmludCBsaW5rZXIgIi1MIiBmbGFncyBmb3IgZHluYW1pYyBsaW5raW5nCi0gIC0tUl9vcHRzICAgICAgICBwcmludCBkeW5hbWljIGxpbmtlciAiLVIiIG9yICItcnBhdGgiIGZsYWdzCi0gIC0tbGRvcHRzICAgICAgICBwcmludCBsaW5rZXIgb3B0aW9ucwotICAtLWxkZmxhZ3MgICAgICAgcHJpbnQgbGlua2VyIGZsYWdzIChsZG9wdHMsIExfb3B0cywgUl9vcHRzLCBhbmQgbGlicykKLSAgLS1zdGF0aWMgICAgICAgIHJldmlzZSBzdWJzZXF1ZW50IG91dHB1dHMgZm9yIHN0YXRpYyBsaW5raW5nCi0gIC0taGVscCAgICAgICAgICBwcmludCB0aGlzIGhlbHAgYW5kIGV4aXQKLSAgLS12ZXJzaW9uICAgICAgIHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24KLUVPRgotCi0gICAgZXhpdCAkMQotfQotCi1pZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCi0gICAgdXNhZ2UgMQotZmkKLQotd2hpbGUgdGVzdCAkIyAtZ3QgMDsgZG8KLSAgICBjYXNlICIkMSIgaW4KLQotICAgIC0tcHJlZml4KQotICAgICAgICBlY2hvICR7cHJlZml4fQotICAgICAgICA7OwotCi0gICAgLS12ZXJzaW9uKQotICAgICAgICBlY2hvICR7dmVyc2lvbn0KLSAgICAgICAgZXhpdCAwCi0gICAgICAgIDs7Ci0KLSAgICAtLWhlbHApCi0gICAgICAgIHVzYWdlIDAKLSAgICAgICAgOzsKLQotICAgIC0tY2NvcHRzKQotICAgICAgICBlY2hvICR7Y2NvcHRzfQotICAgICAgICA7OwotCi0gICAgLS1jcHBmbGFncykKLSAgICAgICAgZWNobyAke2NwcGZsYWdzfQotICAgICAgICA7OwotCi0gICAgLS1jZmxhZ3MpCi0gICAgICAgIGVjaG8gJHtJX29wdHN9ICR7Y3BwZmxhZ3N9ICR7Y2NvcHRzfQotICAgICAgICA7OwotCi0gICAgLS1saWJkaXIpCi0gICAgICAgIGVjaG8gJHtsaWJkaXJ9Ci0gICAgICAgIDs7Ci0KLSAgICAtLWxpYnMpCi0gICAgICAgIGVjaG8gJHtsaWJzfQotICAgICAgICA7OwotCi0gICAgLS1JX29wdHMpCi0gICAgICAgIGVjaG8gJHtJX29wdHN9Ci0gICAgICAgIDs7Ci0KLSAgICAtLUxfb3B0cykKLSAgICAgICAgZWNobyAke0xfb3B0c30KLSAgICAgICAgOzsKLQotICAgIC0tUl9vcHRzKQotICAgICAgICBlY2hvICR7Ul9vcHRzfQotICAgICAgICA7OwotCi0gICAgLS1sZGZsYWdzKQotICAgICAgICBlY2hvICR7bGRmbGFnc30gJHtMX29wdHN9ICR7Ul9vcHRzfSAke2xpYnN9Ci0gICAgICAgIDs7Ci0KLSAgICAtLXN0YXRpYykKLSAgICAgICAgUl9vcHRzPSIiCi0gICAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgICB1c2FnZQotICAgICAgICBleGl0IDEKLSAgICAgICAgOzsKLSAgICBlc2FjCi0gICAgc2hpZnQKLWRvbmUKLQotZXhpdCAwCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3NjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluIGIvc3JjL2xpYnBuZy9zY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGI4YmMxYi4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3NjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIGxpYnBuZy1jb25maWcKLSMgcHJvdmlkZXMgY29uZmlndXJhdGlvbiBpbmZvIGZvciBsaWJwbmcuCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAyIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBNb2RlbGVkIGFmdGVyIGxpYnhtbC1jb25maWcuCi0KLXZlcnNpb249MS40LjEyCi1wcmVmaXg9IiIKLWxpYmRpcj0iIgotbGlicz0iIgotSV9vcHRzPSIiCi1MX29wdHM9IiIKLVJfb3B0cz0iIgotY3BwZmxhZ3M9IiIKLWNjb3B0cz0iIgotbGRvcHRzPSIiCi0KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9saWJwbmcucGMuaW4gYi9zcmMvbGlicG5nL3NjcmlwdHMvbGlicG5nLnBjLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTI1OGUxLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9saWJwbmcucGMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wcmVmaXg9QHByZWZpeEAKLWV4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKLWxpYmRpcj1AbGliZGlyQAotaW5jbHVkZWRpcj1AaW5jbHVkZWRpckAvbGlicG5nMTQKLQotTmFtZTogbGlicG5nCi1EZXNjcmlwdGlvbjogTG9hZHMgYW5kIHNhdmVzIFBORyBmaWxlcwotVmVyc2lvbjogMS40LjEyCi1MaWJzOiAtTCR7bGliZGlyfSAtbHBuZzE0Ci1DZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLjMyc3VudSBiL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS4zMnN1bnUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZDlmZWYuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLjMyc3VudQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgb24gU29sYXJpcyAyLnggd2l0aCBjYwotIyBDb250cmlidXRlZCBieSBXaWxsaWFtIEwuIFNlYm9rLCBiYXNlZCBvbiBtYWtlZmlsZS5saW51eAotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYsIDIwMTAgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5OCBHcmVnIFJvZWxvZnMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCi0KLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIExpYnJhcnkgbmFtZToKLUxJQk5BTUU9bGlicG5nMTQKLVBOR01BSiA9IDE0Ci0KLSMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6Ci1MSUJTTz0kKExJQk5BTUUpLnNvCi1MSUJTT01BSj0kKExJQk5BTUUpLnNvLiQoUE5HTUFKKQotTElCU09SRUw9JChMSUJTT01BSikuJChSRUxFQVNFKQotT0xEU089bGlicG5nLnNvCi0KLSMgVXRpbGl0aWVzOgotQ0M9Y2MKLUFSX1JDPWFyIHJjCi1NS0RJUl9QPW1rZGlyIC1wCi1MTl9TRj1sbiAtZiAtcwotUkFOTElCPWVjaG8KLVJNX0Y9L2Jpbi9ybSAtZgotCi1TVU5fQ0NfRkxBR1M9LWZhc3QgLXh0YXJnZXQ9dWx0cmEKLVNVTl9MRF9GTEFHUz0tZmFzdCAteHRhcmdldD11bHRyYQotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hLCBsaWJwbmcxNC5zbyBhbmQgbGlicG5nMTQvcG5nLmgKLXByZWZpeD0vYQotZXhlY19wcmVmaXg9JChwcmVmaXgpCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotIyBDaGFuZ2luZyB0aGVzZSB0byAuLi96bGliIHBvc2VzIGEgc2VjdXJpdHkgcmlzay4gIElmIHlvdSB3YW50Ci0jIHRvIGhhdmUgemxpYiBpbiBhbiBhZGphY2VudCBkaXJlY3RvcnksIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aCBpbnN0ZWFkIG9mICIuLiIuCi0jWkxJQkxJQj0uLi96bGliCi0jWkxJQklOQz0uLi96bGliCi0KLVpMSUJMSUI9L3Vzci9saWIKLVpMSUJJTkM9L3Vzci9pbmNsdWRlCi0KLVdBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAotCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAotCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgotQ0ZMQUdTPS1JJChaTElCSU5DKSAkKFNVTl9DQ19GTEFHUykgXAotCSMgJChXQVJOTU9SRSkgLWcgLURQTkdfREVCVUc9NQotTERGTEFHUz0kKFNVTl9MRF9GTEFHUykgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSBsaWJwbmcuYSAtbHogLWxtCi0KLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCi1NQU5QQVRIPSQocHJlZml4KS9tYW4KLUJJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLURCPSQoREVTVERJUikkKEJJTlBBVEgpCi1EST0kKERFU1RESVIpJChJTkNQQVRIKQotREw9JChERVNURElSKSQoTElCUEFUSCkKLURNPSQoREVTVERJUikkKE1BTlBBVEgpCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCi0KLS5TVUZGSVhFUzogICAgICAuYyAubyAucGljLm8KLQotLmMucGljLm86Ci0JJChDQykgLWMgJChDRkxBR1MpIC1LUElDIC1vICRAICQqLmMKLQotYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JJChBUl9SQykgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxNCEtbHBuZzE0XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzoKLQkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIGxpYmRpcj1cIiQoTElCUEFUSClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIFJfb3B0cz1cIi1SJChMSUJQQVRIKVwiOyBcCi0JZWNobyBjY29wdHM9XCIteHRhcmdldD11bHRyYVwiOyBcCi0JZWNobyBsZG9wdHM9XCIteHRhcmdldD11bHRyYVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmcxNCAtbHogLWxtXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0KLSQoTElCU09NQUopOiAkKE9CSlNETEwpCi0JQGNhc2UgImB0eXBlIGxkYCIgaW4gKnVjYiopIFwKLQllY2hvOyBcCi0JZWNobyAnIyMgV0FSTklORzonOyBcCi0JZWNobyAnIyMgVGhlIGNvbW1hbmRzICJDQyIgYW5kICJMRCIgbXVzdCBOT1QgcmVmZXIgdG8gL3Vzci91Y2IvY2MnOyBcCi0JZWNobyAnIyMgYW5kIC91c3IvdWNiL2xkLiAgSWYgdGhleSBkbywgeW91IG5lZWQgdG8gYWRqdXN0IHlvdXIgUEFUSCc7IFwKLQllY2hvICcjIyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwdXQgL3Vzci9jY3MvYmluIGFoZWFkIG9mIC91c3IvdWNiLic7IFwKLQllY2hvICcjIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTERfTElCUkFSWV9QQVRIIHNob3VsZCBub3QgYmUgc2V0JzsgXAotCWVjaG8gJyMjIGF0IGFsbC4gIElmIGl0IGlzLCB0aGluZ3MgYXJlIGxpa2VseSB0byBicmVhayBiZWNhdXNlIG9mJzsgXAotCWVjaG8gJyMjIHRoZSBsaWJ1Y2IgZGVwZW5kZW5jeSB0aGF0IGlzIGNyZWF0ZWQuJzsgXAotCWVjaG87IFwKLQk7OyBcCi0JZXNhYwotCSQoTEQpIC1HIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikgLWggJChMSUJTT01BSikgXAotCSAtbyAkKExJQlNPTUFKKSAkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKLQotaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZwotCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAkKFNVTl9DQ19GTEFHUykgLUkkKERJKSAtSSQoWkxJQklOQykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1vIHBuZ3Rlc3RkIC1MJChETCkgLVIkKERMKSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgIFwKLQkgICAkKFNVTl9MRF9GTEFHUykgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKQotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KLQkkKENDKSAkKFNVTl9DQ19GTEFHUykgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtbyBwbmd0ZXN0aSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgIFwKLQkgICAkKFNVTl9MRF9GTEFHUykgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKQotCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmd0ZXN0aSBwbmdvdXQucG5nIFwKLQlsaWJwbmctY29uZmlnICQoTElCU08pICQoTElCU09NQUopKiBcCi0JbGlicG5nLnBjCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm8gcG5nLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyaW8ubyBwbmdyaW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3dpby5vIHBuZ3dpby5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nbWVtLm8gcG5nbWVtLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdzZXQubyBwbmdzZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ2dldC5vIHBuZ2dldC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncmVhZC5vIHBuZ3JlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3J0cmFuLm8gcG5ncnRyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3J1dGlsLm8gcG5ncnV0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3dyaXRlLm8gcG5nd3JpdGUucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3d0cmFuLm8gcG5nd3RyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3ByZWFkLm8gcG5ncHJlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQotcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmgKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS42NHN1bnUgYi9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuNjRzdW51CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTZkOTRlLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS42NHN1bnUKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nIG9uIFNvbGFyaXMgMi54IHdpdGggY2MKLSMgQ29udHJpYnV0ZWQgYnkgV2lsbGlhbSBMLiBTZWJvaywgYmFzZWQgb24gbWFrZWZpbGUubGludXgKLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2LCAyMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDE5OTggR3JlZyBSb2Vsb2ZzCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgotCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FPWxpYnBuZzE0Ci1QTkdNQUogPSAxNAotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbwotTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKLUxJQlNPUkVMPSQoTElCU09NQUopLiQoUkVMRUFTRSkKLU9MRFNPPWxpYnBuZy5zbwotCi0jIFV0aWxpdGllczoKLUNDPWNjCi1BUl9SQz1hciByYwotTUtESVJfUD1ta2RpciAtcAotTE5fU0Y9bG4gLWYgLXMKLVJBTkxJQj1lY2hvCi1STV9GPS9iaW4vcm0gLWYKLQotU1VOX0NDX0ZMQUdTPS1mYXN0IC14dGFyZ2V0PXVsdHJhIC14YXJjaD12OQotU1VOX0xEX0ZMQUdTPS1mYXN0IC14dGFyZ2V0PXVsdHJhIC14YXJjaD12OQotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hLCBsaWJwbmcxNC5zbyBhbmQgbGlicG5nMTQvcG5nLmgKLXByZWZpeD0vYQotZXhlY19wcmVmaXg9JChwcmVmaXgpCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotIyBDaGFuZ2luZyB0aGVzZSB0byAuLi96bGliIHBvc2VzIGEgc2VjdXJpdHkgcmlzay4gIElmIHlvdSB3YW50Ci0jIHRvIGhhdmUgemxpYiBpbiBhbiBhZGphY2VudCBkaXJlY3RvcnksIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aCBpbnN0ZWFkIG9mICIuLiIuCi0jWkxJQkxJQj0uLi96bGliCi0jWkxJQklOQz0uLi96bGliCi0KLVpMSUJMSUI9L3Vzci9saWIKLVpMSUJJTkM9L3Vzci9pbmNsdWRlCi0KLVdBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAotCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAotCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgotQ0ZMQUdTPS1JJChaTElCSU5DKSAkKFNVTl9DQ19GTEFHUykgXAotCSMgJChXQVJOTU9SRSkgLWcgLURQTkdfREVCVUc9NQotTERGTEFHUz0tTC4gLVIuICQoU1VOX0xEX0ZMQUdTKSAtTCQoWkxJQkxJQikgLVIkKFpMSUJMSUIpIC1scG5nMTQgLWx6IC1sbQotCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgotTUFOUEFUSD0kKHByZWZpeCkvbWFuCi1CSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi1EQj0kKERFU1RESVIpJChCSU5QQVRIKQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi1ETT0kKERFU1RESVIpJChNQU5QQVRIKQotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLU9CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQotCi0uU1VGRklYRVM6ICAgICAgLmMgLm8gLnBpYy5vCi0KLS5jLnBpYy5vOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtS1BJQyAtbyAkQCAkKi5jCi0KLWFsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotbGlicG5nLnBjOgotCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAotCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAotCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAotCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKLQktZSBzIS1scG5nMTQhLWxwbmcxNFwgLWx6XCAtbG0hID4gbGlicG5nLnBjCi0KLWxpYnBuZy1jb25maWc6Ci0JKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKLQllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCi0JZWNobyBsaWJkaXI9XCIkKExJQlBBVEgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIExfb3B0cz1cIi1MJChMSUJQQVRIKVwiOyBcCi0JZWNobyBSX29wdHM9XCItUiQoTElCUEFUSClcIjsgXAotCWVjaG8gY2NvcHRzPVwiLXh0YXJnZXQ9dWx0cmEgLXhhcmNoPXY5XCI7IFwKLQllY2hvIGxkb3B0cz1cIi14dGFyZ2V0PXVsdHJhIC14YXJjaD12OVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmcxNCAtbHogLWxtXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0KLSQoTElCU09NQUopOiAkKE9CSlNETEwpCi0JQGNhc2UgImB0eXBlIGxkYCIgaW4gKnVjYiopIFwKLQllY2hvOyBcCi0JZWNobyAnIyMgV0FSTklORzonOyBcCi0JZWNobyAnIyMgVGhlIGNvbW1hbmRzICJDQyIgYW5kICJMRCIgbXVzdCBOT1QgcmVmZXIgdG8gL3Vzci91Y2IvY2MnOyBcCi0JZWNobyAnIyMgYW5kIC91c3IvdWNiL2xkLiAgSWYgdGhleSBkbywgeW91IG5lZWQgdG8gYWRqdXN0IHlvdXIgUEFUSCc7IFwKLQllY2hvICcjIyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwdXQgL3Vzci9jY3MvYmluIGFoZWFkIG9mIC91c3IvdWNiLic7IFwKLQllY2hvICcjIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTERfTElCUkFSWV9QQVRIIHNob3VsZCBub3QgYmUgc2V0JzsgXAotCWVjaG8gJyMjIGF0IGFsbC4gIElmIGl0IGlzLCB0aGluZ3MgYXJlIGxpa2VseSB0byBicmVhayBiZWNhdXNlIG9mJzsgXAotCWVjaG8gJyMjIHRoZSBsaWJ1Y2IgZGVwZW5kZW5jeSB0aGF0IGlzIGNyZWF0ZWQuJzsgXAotCWVjaG87IFwKLQk7OyBcCi0JZXNhYwotCSQoTEQpIC1HIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikgLWggJChMSUJTT01BSikgXAotCSAtbyAkKExJQlNPTUFKKSAkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKLQotaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZwotCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAkKFNVTl9DQ19GTEFHUykgLUkkKERJKSAtSSQoWkxJQklOQykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1vIHBuZ3Rlc3RkIC1MJChETCkgLVIkKERMKSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgIFwKLQkgICAkKFNVTl9MRF9GTEFHUykgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKQotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KLQkkKENDKSAkKFNVTl9DQ19GTEFHUykgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtbyBwbmd0ZXN0aSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgIFwKLQkgICAkKFNVTl9MRF9GTEFHUykgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKQotCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmd0ZXN0aSBwbmdvdXQucG5nIFwKLQlsaWJwbmctY29uZmlnICQoTElCU08pICQoTElCU09NQUopKiBcCi0JbGlicG5nLnBjCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm8gcG5nLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyaW8ubyBwbmdyaW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3dpby5vIHBuZ3dpby5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nbWVtLm8gcG5nbWVtLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdzZXQubyBwbmdzZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ2dldC5vIHBuZ2dldC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncmVhZC5vIHBuZ3JlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3J0cmFuLm8gcG5ncnRyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3J1dGlsLm8gcG5ncnV0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3dyaXRlLm8gcG5nd3JpdGUucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3d0cmFuLm8gcG5nd3RyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3ByZWFkLm8gcG5ncHJlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQotcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmgKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5hY29ybiBiL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5hY29ybgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBlNTc3Yi4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYWNvcm4KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0jIFByb2plY3Q6ICAgbGlicG5nCi0KLQotIyBUb29sZmxhZ3M6Ci1DQ2ZsYWdzID0gLWMgLWRlcGVuZCAhRGVwZW5kIC1JQzosWmxpYjogLWcgLXRocm93YmFjayAgLURSSVNDT1MgIC1mbmFoCi1DKytmbGFncyA9IC1jIC1kZXBlbmQgIURlcGVuZCAtSUM6IC10aHJvd2JhY2sKLUxpbmtmbGFncyA9IC1haWYgLWMrKyAtbyAkQAotT2JqQXNtZmxhZ3MgPSAtdGhyb3diYWNrIC1Ob0NhY2hlIC1kZXBlbmQgIURlcGVuZAotQ01IR2ZsYWdzID0KLUxpYkZpbGVmbGFncyA9IC1jIC1sIC1vICRACi1TcXVlZXplZmxhZ3MgPSAtbyAkQAotCi0jIEZpbmFsIHRhcmdldHM6Ci1ALmxpYnBuZy1saWI6ICAgQC5vLnBuZyBALm8ucG5nZXJyb3IgQC5vLnBuZ3JpbyBALm8ucG5nd2lvIEAuby5wbmdtZW0gXAotCUAuby5wbmdwcmVhZCBALm8ucG5nc2V0IEAuby5wbmdnZXQgQC5vLnBuZ3JlYWQgQC5vLnBuZ3J0cmFuIFwKLQlALm8ucG5ncnV0aWwgQC5vLnBuZ3RyYW5zIEAuby5wbmd3cml0ZSBALm8ucG5nd3RyYW4gQC5vLnBuZ3d1dGlsCi0JTGliRmlsZSAkKExpYkZpbGVmbGFncykgQC5vLnBuZyBALm8ucG5nZXJyb3IgQC5vLnBuZ3JpbyBALm8ucG5ncnRyYW4gXAotCUAuby5wbmdtZW0gQC5vLnBuZ3ByZWFkIEAuby5wbmdzZXQgQC5vLnBuZ2dldCBALm8ucG5ncmVhZCBALm8ucG5nd2lvIFwKLQlALm8ucG5ncnV0aWwgQC5vLnBuZ3RyYW5zICBALm8ucG5nd3JpdGUgQC5vLnBuZ3d0cmFuIEAuby5wbmd3dXRpbAotQC5tbS1saWJwbmctbGliOiAgIEAubW0ucG5nIEAubW0ucG5nZXJyb3IgQC5tbS5wbmdyaW8gQC5tbS5wbmd3aW8gQC5tbS5wbmdtZW0gXAotCUAubW0ucG5ncHJlYWQgQC5tbS5wbmdzZXQgQC5tbS5wbmdnZXQgQC5tbS5wbmdyZWFkIEAubW0ucG5ncnRyYW4gXAotCUAubW0ucG5ncnV0aWwgQC5tbS5wbmd0cmFucyBALm1tLnBuZ3dyaXRlIEAubW0ucG5nd3RyYW4gQC5tbS5wbmd3dXRpbAotCUxpYkZpbGUgJChMaWJGaWxlZmxhZ3MpIEAubW0ucG5nIEAubW0ucG5nZXJyb3IgQC5tbS5wbmdyaW8gXAotCUAubW0ucG5nd2lvIEAubW0ucG5nbWVtIEAubW0ucG5ncHJlYWQgQC5tbS5wbmdzZXQgQC5tbS5wbmdnZXQgXAotCUAubW0ucG5ncmVhZCBALm1tLnBuZ3J0cmFuIEAubW0ucG5ncnV0aWwgQC5tbS5wbmd0cmFucyBALm1tLnBuZ3dyaXRlIFwKLQlALm1tLnBuZ3d0cmFuIEAubW0ucG5nd3V0aWwKLQotCi0jIFVzZXItZWRpdGFibGUgZGVwZW5kZW5jaWVzOgotIyAoQykgQ29weXJpZ2h0IDE5OTcgVG9tIFRhbm5lcgotVGVzdDogQC5wbmd0ZXN0Ci0JPFByZWZpeCREaXI+LnBuZ3Rlc3QKLQlAcmVtb3ZlIDxQcmVmaXgkRGlyPi5wbmd0ZXN0Ci0KLSNJdCB3b3VsZCBiZSBuaWNlIGlmIHlvdSBjb3VsZCBzdG9wICJtYWtlIiBsaXN0aW5nIGZyb20gaGVyZSBvbiEKLUAucG5ndGVzdDogICBALm8ucG5ndGVzdCBALmxpYnBuZy1saWIgQzpvLlN0dWJzIFpsaWI6emxpYl9saWIKLQlMaW5rICQoTGlua2ZsYWdzKSBALm8ucG5ndGVzdCBALmxpYnBuZy1saWIgQzpvLlN0dWJzIFpsaWI6emxpYl9saWIKLQotLlNVRkZJWEVTOiAubyAubW0gLmMKLQotLmMubW06Ci0JTWVtQ2hlY2suQ0MgY2MgJChjY2ZsYWdzKSAtbyAkQCBMaWJQbmc6JDwKLS5jLm86Ci0JY2MgJChjY2ZsYWdzKSAtbyAkQCAkPAotCi0KLSMgU3RhdGljIGRlcGVuZGVuY2llczoKLQotCi0jIER5bmFtaWMgZGVwZW5kZW5jaWVzOgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmFpeCBiL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5haXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YTdkZDEuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmFpeAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgdXNpbmcgZ2NjIChnZW5lcmljLCBzdGF0aWMgbGlicmFyeSkKLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2LTIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMjAwMCBDb3NtaW4gVHJ1dGEKLSMgQ29weXJpZ2h0IChDKSAyMDAwIE1hcmMgTy4gR2xvb3IgKEFJWCBzdXBwb3J0IGFkZGVkLCBmcm9tIG1ha2VmaWxlLmdjYykKLSMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgTG9jYXRpb24gb2YgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcwotWkxJQklOQyA9IC4uL3psaWIKLVpMSUJMSUIgPSAuLi96bGliCi0KLSMgQ29tcGlsZXIsIGxpbmtlciwgbGliIGFuZCBvdGhlciB0b29scwotQ0MgPSBnY2MKLUxEID0gJChDQykKLUFSX1JDID0gYXIgcmNzCi1NS0RJUl9QID0gbWtkaXIgLXAKLVJBTkxJQiA9IHJhbmxpYgotUk1fRiA9IHJtIC1mCi1MTl9TRiA9IGxuIC1mIC1zCi0KLUxJQk5BTUU9bGlicG5nMTQKLVBOR01BSiA9IDE0Ci0KLXByZWZpeD0vdXNyL2xvY2FsCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQocHJlZml4KS9saWIKLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi0KLUNERUJVRyA9IC1nIC1EUE5HX0RFQlVHPTUKLUxEREVCVUcgPQotQ1JFTEVBU0UgPSAtTzIKLUxEUkVMRUFTRSA9IC1zCi1XQVJOTU9SRT0tVyAtV2FsbAotQ0ZMQUdTID0gLURfQUxMX1NPVVJDRSAtSSQoWkxJQklOQykgJChXQVJOTU9SRSkgJChDUkVMRUFTRSkKLUxERkxBR1MgPSAtTC4gLUwkKFpMSUJMSUIpIC1scG5nMTQgLWx6IC1sbSAkKExEUkVMRUFTRSkKLQotIyBGaWxlIGV4dGVuc2lvbnMKLU89Lm8KLUE9LmEKLUU9Ci0KLSMgVmFyaWFibGVzCi1PQkpTID0gIHBuZyQoTykgcG5nZXJyb3IkKE8pIHBuZ2dldCQoTykgcG5nbWVtJChPKSBwbmdwcmVhZCQoTykgXAotCXBuZ3JlYWQkKE8pIHBuZ3JpbyQoTykgcG5ncnRyYW4kKE8pIHBuZ3J1dGlsJChPKSBwbmdzZXQkKE8pIFwKLQlwbmd0cmFucyQoTykgcG5nd2lvJChPKSBwbmd3cml0ZSQoTykgcG5nd3RyYW4kKE8pIHBuZ3d1dGlsJChPKQotCi0jIFRhcmdldHMKLWFsbDogJChMSUJOQU1FKSQoQSkgcG5ndGVzdCQoRSkKLQotJChMSUJOQU1FKSQoQSk6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLXRlc3Q6IHBuZ3Rlc3QkKEUpCi0JLi9wbmd0ZXN0JChFKQotCi1wbmd0ZXN0JChFKTogcG5ndGVzdCQoTykgJChMSUJOQU1FKSQoQSkKLQkkKExEKSAtbyAkQCBwbmd0ZXN0JChPKSAkKExERkxBR1MpCi0KLWluc3RhbGw6ICQoTElCTkFNRSkkKEEpCi0JLUBpZiBbICEgLWQgJChESSkgIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKLQktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpICBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREkpLyQoTElCTkFNRSkvcG5nLmgKLQktQCQoUk1fRikgJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvcG5nLmgKLQktQCQoUk1fRikgJChESSkvcG5nY29uZi5oCi0JY3AgcG5nLmggcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCBcCi0JJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmgKLQktQCQoUk1fRikgLXIgJChESSkvbGlicG5nCi0JKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCTkFNRSkkKEEpCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZyQoQSkKLQljcCAkKExJQk5BTUUpJChBKSAkKERMKS8kKExJQk5BTUUpJChBKQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpJChBKQotCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKSQoQSkgbGlicG5nJChBKSkKLQkoY2QgJChESSk7ICQoTE5fU0YpIGxpYnBuZy8qIC47KQotCi1jbGVhbjoKLQkkKFJNX0YpICoubyAkKExJQk5BTUUpJChBKSBwbmd0ZXN0IHBuZ291dC5wbmcKLQotcG5nJChPKTogICAgICBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdlcnJvciQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ2dldCQoTyk6ICAgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nbWVtJChPKTogICBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdwcmVhZCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3JlYWQkKE8pOiAgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncmlvJChPKTogICBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3J1dGlsJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nc2V0JChPKTogICBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd0cmFucyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3dpbyQoTyk6ICAgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3JpdGUkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3d1dGlsJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCi1wbmd0ZXN0JChPKTogIHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmFtaWdhIGIvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmFtaWdhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmYwZjQ1Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5hbWlnYQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMgQ29tbW9kb3JlIEFtaWdhIE1ha2VmaWxlCi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgYW5kIFNBUyBDIFY2LjV4IGNvbXBpbGVyCi0jIENvcHlyaWdodCAoQykgMTk5NS0yMDAwIFdvbGYgRmF1c3QKLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotIwotIyBOb3RlOiBVc2UgI2RlZmluZSBQTkdfUkVBRF9CSUdfRU5ESUFOX1NVUFBPUlRFRCBpbiBwbmdjb25mLmgKLSMKLSMgTG9jYXRpb24vcGF0aCBvZiB6bGliIGluY2x1ZGUgZmlsZXMKLVpMSUI9L3psaWIKLSNjb21waWxlcgotQ0M9c2MKLSNjb21waWxlciBmbGFncwotIyBXQVJOSU5HOiBhIGJ1ZyBpbiBWNi41MSBjYXVzZXMgYmFkIGNvZGUgd2l0aCBPUFRHTwotIyAgICAgICAgICBTbyB1c2UgVjYuNTUgb3Igc2V0IE5PT1BUR08hISEhISEhISEKLUNGTEFHUz0gTk9TVEtDSEsgUEFSTVM9UkVHIE9QVElNSVpFIE9QVEdPIE9QVFBFRVAgT1BUSU5MT0NBTCBPUFRJTkxcCi0JT1BUTE9PUCBPUFRSREVQPTQgT1BUREVQPTQgT1BUQ09NUD00IElOQ0xVREVESVI9JChaTElCKSBcCi0JREVGSU5FPVBOR19JTlRFUk5BTAotI2xpbmtlciBmbGFncwotTERGTEFHUz0gU0QgTkQgQkFUQ0gKLSNsaW5rIGxpYnMKLUxETElCUz0gbGlicG5nLmxpYiBsaWJnei5saWIgTElCOnNjbS5saWIgTElCOnNjLmxpYiBMaWI6YW1pZ2EubGliCi0jIGxpbmtlcgotTE49IHNsaW5rCi0jIGZpbGUgZGVsZXRpb24gY29tbWFuZAotUk09IGRlbGV0ZSBxdWlldAotIyBsaWJyYXJ5ICgubGliKSBmaWxlIGNyZWF0aW9uIGNvbW1hbmQKLUFSPSBvbWwKLSMgbWFrZSBkaXJlY3RvcnkgY29tbWFuZAotTUtESVI9IG1ha2VkaXIKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1hbGw6IGxpYnBuZy5saWIgcG5ndGVzdAotCi1saWJwbmcubGliOiAkKE9CSlMpCi0tJChSTSkgbGlicG5nLmxpYgotJChBUikgbGlicG5nLmxpYiByICQoT0JKUykKLQotcG5ndGVzdDogcG5ndGVzdC5vIGxpYnBuZy5saWIKLSQoTE4pIDxXSVRIIDwKLSQoTERGTEFHUykKLVRPIHBuZ3Rlc3QKLUZST00gTElCOmMubyBwbmd0ZXN0Lm8KLUxJQiAkKExETElCUykKLTwKLQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmF0YXJpIGIvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmF0YXJpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTFjYTcyLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5hdGFyaQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZwotIyBDb3B5cmlnaHQgKEMpIDIwMDIgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotIwotIyBNb2RpZmllZCBmb3IgTEM1Ni9BVEFSSSBhc3N1bWVzIGxpYnoubGliIGlzIGluIHNhbWUgZGlyIGFuZCB1c2VzIGRlZmF1bHQKLSMgcnVsZXMgZm9yIGxpYnJhcnkgbWFuYWdlbWVudAotIwotQ0ZMQUdTPS1JLi5cemxpYiAtTwotTEJSID0gcG5nLmxpYgotTERGTEFHUz0tbHBuZyAtbHogLWxtCi0KLSMgd2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEgYW5kIHBuZy5oCi1wcmVmaXg9L3Vzci9sb2NhbAotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKHByZWZpeCkvbGliCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLU9CSlMgPSAkKExCUikocG5nLm8pICQoTEJSKShwbmdzZXQubykgJChMQlIpKHBuZ2dldC5vKSAkKExCUikocG5ncnV0aWwubylcCi0JJChMQlIpKHBuZ3RyYW5zLm8pICQoTEJSKShwbmd3dXRpbC5vKVwKLQkkKExCUikocG5ncmVhZC5vKSAkKExCUikocG5nZXJyb3IubykgJChMQlIpKHBuZ3dyaXRlLm8pXAotCSQoTEJSKShwbmdydHJhbi5vKSAkKExCUikocG5nd3RyYW4ubylcCi0JJChMQlIpKHBuZ21lbS5vKSAkKExCUikocG5ncmlvLm8pICQoTEJSKShwbmd3aW8ubykgJChMQlIpKHBuZ3ByZWFkLm8pCi0KLWFsbDogJChMQlIpIHBuZ3Rlc3QudHRwCi0KLSQoTEJSKTogJChPQkpTKQotCi1wbmd0ZXN0LnR0cDogcG5ndGVzdC5vICQoTEJSKQotCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vJEAgcG5ndGVzdC5vCi0KLWluc3RhbGw6IGxpYnBuZy5hCi0JLUBta2RpciAkKERFU1RESVIpJChJTkNQQVRIKQotCS1AbWtkaXIgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCi0JLUBta2RpciAkKERFU1RESVIpJChMSUJQQVRIKQotCS1Acm0gLWYgJChERVNURElSKSQoSU5DUEFUSCkvcG5nLmgKLQktQHJtIC1mICQoREVTVERJUikkKElOQ1BBVEgpL3BuZ2NvbmYuaAotCWNwIHBuZy5oICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZwotCWNwIHBuZ2NvbmYuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKLQljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZy5oCi0JY2htb2QgNjQ0ICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZy9wbmdjb25mLmgKLQkoY2QgJChERVNURElSKSQoSU5DUEFUSCk7IGxuIC1mIC1zICQoTElCTkFNRSkgbGlicG5nOyBcCi0JbG4gLWYgLXMgJChMSUJOQU1FKS8qIC4pCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYmMzMiBiL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5iYzMyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDIwZTZlLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5iYzMyCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIGxpYnBuZwotIyAzMi1iaXQgQm9ybGFuZCBDKysgKE5vdGU6IEFsbCBtb2R1bGVzIGFyZSBjb21waWxlZCBpbiBDIG1vZGUpCi0jIFRvIGJ1aWxkIHRoZSBsaWJyYXJ5LCBkbzoKLSMgICAgICAgIm1ha2UgLWZtYWtlZmlsZS5iYzMyIgotIwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAzMi1iaXQgQm9ybGFuZCBDKysgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyMjIEFic29sdXRlbHkgbmVjZXNzYXJ5IGZvciB0aGlzIG1ha2VmaWxlIHRvIHdvcmsKLS5BVVRPREVQRU5ECi0KLSMjIFdoZXJlIHpsaWIuaCwgemNvbmYuaCBhbmQgemxpYi5saWIgYXJlCi1aTElCX0RJUj0uLlx6bGliCi0KLSMjIENvbXBpbGVyLCBsaW5rZXIgYW5kIGxpYiBzdHVmZgotQ0M9YmNjMzIKLUxEPWJjYzMyCi1MSUI9dGxpYgotCi0jIC0zID0gMzg2LCAtNCA9IDQ4NiwgLTUgPSBQZW50aXVtIGV0Yy4KLSFpZm5kZWYgVEFSR0VUX0NQVQotI1RBUkdFVF9DUFU9LTYKLSFlbmRpZgotCi0jIFVzZSB0aGlzIGlmIHlvdSBkb24ndCB3YW50IEJvcmxhbmQncyBmYW5jeSBleGNlcHRpb24gaGFuZGxpbmcKLSMgKENhdXRpb246IGRvZXNuJ3Qgd29yayB3aXRoIENCdWlsZGVyWCkKLSNOT0VITElCPW5vZWgzMi5saWIKLQotIWlmZGVmIERFQlVHCi1DREVCVUc9LXYKLUxERUJVRz0tdgotIWVsc2UKLUNERUJVRz0KLUxERUJVRz0KLSFlbmRpZgotCi0jIFNUQUNLT0ZMT1c9MQotIWlmZGVmIFNUQUNLT0ZMT1cKLUNERUJVRz0kKENERUJVRykgLU4KLUxERUJVRz0kKExERUJVRykgLU4KLSFlbmRpZgotCi0jIC1PMiBvcHRpbWl6ZSBmb3Igc3BlZWQKLSMgLWQgIG1lcmdlIGR1cGxpY2F0ZSBzdHJpbmdzCi0jIC1rLSB0dXJuIG9mZiBzdGFuZGFyZCBzdGFjayBmcmFtZQotIyAtdyAgZGlzcGxheSBhbGwgd2FybmluZ3MKLUNGTEFHUz0tSSQoWkxJQl9ESVIpIC1PMiAtZCAtay0gLXcgJChUQVJHRVRfQ1BVKSAkKENERUJVRykKLQotIyAtTSAgZ2VuZXJhdGUgbWFwIGZpbGUKLUxERkxBR1M9LUwkKFpMSUJfRElSKSAtTSAkKExERUJVRykKLQotIyMgVmFyaWFibGVzCi1PQkpTID0gXAotCXBuZy5vYmogXAotCXBuZ2Vycm9yLm9iaiBcCi0JcG5nZ2V0Lm9iaiBcCi0JcG5nbWVtLm9iaiBcCi0JcG5ncHJlYWQub2JqIFwKLQlwbmdyZWFkLm9iaiBcCi0JcG5ncmlvLm9iaiBcCi0JcG5ncnRyYW4ub2JqIFwKLQlwbmdydXRpbC5vYmogXAotCXBuZ3NldC5vYmogXAotCXBuZ3RyYW5zLm9iaiBcCi0JcG5nd2lvLm9iaiBcCi0JcG5nd3JpdGUub2JqIFwKLQlwbmd3dHJhbi5vYmogXAotCXBuZ3d1dGlsLm9iagotCi1MSUJPQkpTID0gXAotCStwbmcub2JqIFwKLQkrcG5nZXJyb3Iub2JqIFwKLQkrcG5nZ2V0Lm9iaiBcCi0JK3BuZ21lbS5vYmogXAotCStwbmdwcmVhZC5vYmogXAotCStwbmdyZWFkLm9iaiBcCi0JK3BuZ3Jpby5vYmogXAotCStwbmdydHJhbi5vYmogXAotCStwbmdydXRpbC5vYmogXAotCStwbmdzZXQub2JqIFwKLQkrcG5ndHJhbnMub2JqIFwKLQkrcG5nd2lvLm9iaiBcCi0JK3BuZ3dyaXRlLm9iaiBcCi0JK3BuZ3d0cmFuLm9iaiBcCi0JK3BuZ3d1dGlsLm9iagotCi1MSUJOQU1FPWxpYnBuZy5saWIKLQotIyMgSW1wbGljaXQgcnVsZXMKLSMgQnJhY2VzIGxldCBtYWtlICJiYXRjaCIgY2FsbHMgdG8gdGhlIGNvbXBpbGVyLAotIyAyIGNhbGxzIGluc3RlYWQgb2YgMTI7IHNwYWNlIGlzIGltcG9ydGFudC4KLS5jLm9iajoKLQkkKENDKSAkKENGTEFHUykgLWMgeyQqLmMgfQotCi0uYy5leGU6Ci0JJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgJCouYyAkKExJQk5BTUUpIHpsaWIubGliICQoTk9FSExJQikKLQotLm9iai5leGU6Ci0JJChMRCkgJChMREZMQUdTKSAkKi5vYmogJChMSUJOQU1FKSB6bGliLmxpYiAkKE5PRUhMSUIpCi0KLSMjIE1ham9yIHRhcmdldHMKLWFsbDogbGlicG5nIHBuZ3Rlc3QKLQotbGlicG5nOiAkKExJQk5BTUUpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QuZXhlCi0KLXRlc3Q6IHBuZ3Rlc3QuZXhlCi0JcG5ndGVzdAotCi0jIyBNaW5vciBUYXJnZXRzCi0KLXBuZy5vYmo6IHBuZy5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ2Vycm9yLm9iajogcG5nZXJyb3IuYyBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdnZXQub2JqOiBwbmdnZXQuYyBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdtZW0ub2JqOiBwbmdtZW0uYyBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdwcmVhZC5vYmo6IHBuZ3ByZWFkLmMgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncmVhZC5vYmo6IHBuZ3JlYWQuYyBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyaW8ub2JqOiBwbmdyaW8uYyBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydHJhbi5vYmo6IHBuZ3J0cmFuLmMgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnV0aWwub2JqOiBwbmdydXRpbC5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3NldC5vYmo6IHBuZ3NldC5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3RyYW5zLm9iajogcG5ndHJhbnMuYyBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3aW8ub2JqOiBwbmd3aW8uYyBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3cml0ZS5vYmo6IHBuZ3dyaXRlLmMgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3RyYW4ub2JqOiBwbmd3dHJhbi5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3d1dGlsLm9iajogcG5nd3V0aWwuYyBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd0ZXN0Lm9iajogcG5ndGVzdC5jIHBuZy5oIHBuZ2NvbmYuaAotCi0kKExJQk5BTUUpOiAkKE9CSlMpCi0JLWRlbCAkKExJQk5BTUUpCi0JJChMSUIpICQoTElCTkFNRSkgQCYmfAotJChMSUJPQkpTKSwgbGlicG5nCi18Ci0KLSMgQ2xlYW51cAotY2xlYW46Ci0JLWRlbCAqLm9iagotCS1kZWwgJChMSUJOQU1FKQotCS1kZWwgcG5ndGVzdC5leGUKLQktZGVsICoubHN0Ci0JLWRlbCAqLm1hcAotCS1kZWwgKi50ZHMKLQktZGVsIHBuZ291dC5wbmcKLQotIyBFbmQgb2YgbWFrZWZpbGUgZm9yIGxpYnBuZwpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmJlb3MgYi9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYmVvcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmMDk4MC4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYmVvcworKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgb24gQmVPUyB4ODYgRUxGIHdpdGggZ2NjCi0jIG1vZGlmaWVkIGZyb20gbWFrZWZpbGUubGludXggYnkgU2FuZGVyIFN0b2tzCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiwgMjAwOCwgMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk5IEdyZWcgUm9lbG9mcwotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIExpYnJhcnkgbmFtZToKLUxJQk5BTUU9bGlicG5nMTQKLVBOR01BSiA9IDE0Ci0KLSMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6Ci1MSUJTTz0kKExJQk5BTUUpLnNvCi1MSUJTT01BSj0kKExJQk5BTUUpLnNvLiQoUE5HTUFKKQotTElCU09SRUw9JChMSUJTT01BSikuJChSRUxFQVNFKQotT0xEU089bGlicG5nLnNvCi0KLSMgVXRpbGl0aWVzOgotQ0M9Z2NjCi1BUl9SQz1hciByYwotTUtESVJfUD1ta2RpciAtcAotTE5fU0Y9bG4gLXNmCi1SQU5MSUI9cmFubGliCi1STV9GPS9iaW4vcm0gLWYKLQotIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCi1aTElCTElCPS91c3IvbG9jYWwvbGliCi1aTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQotCi1BTElHTj0KLSMgRm9yIGkzODY6Ci0jIEFMSUdOPS1tYWxpZ24tbG9vcHM9MiAtbWFsaWduLWZ1bmN0aW9ucz0yCi0KLVdBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAotCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAotCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgotCi0jIE9uIEJlT1MsIC1PMSBpcyBhY3R1YWxseSBiZXR0ZXIgdGhhbiAtTzMuICBUaGlzIGlzIGEga25vd24gYnVnIGJ1dCBpdCdzCi0jIHN0aWxsIGhlcmUgaW4gUjQuNQotQ0ZMQUdTPS1JJChaTElCSU5DKSAtVyAtV2FsbCAtTzEgLWZ1bnJvbGwtbG9vcHMgXAotCSQoQUxJR04pICMgJChXQVJOTU9SRSkgLWcgLURQTkdfREVCVUc9NQotIyBMREZMQUdTPS1MLiAtV2wsLXJwYXRoLC4gLUwkKFpMSUJMSUIpIC1XbCwtcnBhdGgsJChaTElCTElCKSAtbHBuZyAtbHoKLUxERkxBR1M9LUwuIC1XbCwtc29uYW1lPSQoTElCU09NQUopIC1MJChaTElCTElCKSAtbHoKLQotIyB3aGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSwgbGlicG5nMTQuc28qLCBhbmQgcG5nLmgKLXByZWZpeD0vdXNyL2xvY2FsCi1leGVjX3ByZWZpeD0kKHByZWZpeCkKLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCi1NQU5QQVRIPSQocHJlZml4KS9tYW4KLUJJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLURCPSQoREVTVERJUikkKEJJTlBBVEgpCi1EST0kKERFU1RESVIpJChJTkNQQVRIKQotREw9JChERVNURElSKSQoTElCUEFUSCkKLURNPSQoREVTVERJUikkKE1BTlBBVEgpCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotT0JKU0RMTCA9ICQoT0JKUykKLQotLlNVRkZJWEVTOiAgICAgIC5jIC5vCi0KLWFsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotbGlicG5nLnBjOgotCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAotCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAotCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAotCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKLQktZSBzIS1scG5nMTQhLWxwbmcxNFwgLWx6XCAtbG0hID4gbGlicG5nLnBjCi0KLWxpYnBuZy1jb25maWc6Ci0JKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKLQllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCi0JZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmcxNCAtbHogXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0JY3AgJChMSUJTTykqIC9ib290L2hvbWUvY29uZmlnL2xpYgotCi0kKExJQlNPTUFKKTogJChPQkpTRExMKQotCSQoQ0MpIC1ub3N0YXJ0IC1XbCwtc29uYW1lLCQoTElCU09NQUopIC1vIFwKLQkkKExJQlNPTUFKKSAkKE9CSlNETEwpICQoTERGTEFHUykKLQotcG5ndGVzdDogcG5ndGVzdC5vICQoTElCU08pCi0JJChDQykgLUwkKFpMSUJMSUIpIC1MLiAtbHogLWxwbmcxNCAtbyBwbmd0ZXN0IHBuZ3Rlc3QubwotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oCi0JLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQotCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JY3AgcG5nLmggcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvbGlicG5nCi0JKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCi0JY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQotCS1AJChSTV9GKSAkKERMKS9saWJwbmcuYQotCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQotCi1pbnN0YWxsLXNoYXJlZDogaW5zdGFsbC1oZWFkZXJzICQoTElCU09NQUopIGxpYnBuZy5wYwotCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZwotCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAtSSQoREkpICQoQ0ZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKERMKSAtTCQoWkxJQkxJQikgLVdsLC1ycGF0aCAkKFpMSUJMSUIpOiQoREwpIFwKLQkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCi0JLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZwotCi10ZXN0LWluc3RhbGxlZDoKLQkkKENDKSAkKENGTEFHUykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZyBsaWJwbmctY29uZmlnIFwKLQkkKExJQlNPKSAkKExJQlNPTUFKKSogcG5ndGVzdGkgXAotCWxpYnBuZy5wYwotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vIHBuZy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3aW8ubyBwbmd3aW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ21lbS5vIHBuZ21lbS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdnZXQubyBwbmdnZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydXRpbC5vIHBuZ3J1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dHJhbi5vIHBuZ3d0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYm9yIGIvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmJvcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjM2M2My4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYm9yCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIGxpYnBuZwotIyAxNi1iaXQgQm9ybGFuZCBDKysgKE5vdGU6IEFsbCBtb2R1bGVzIGFyZSBjb21waWxlZCBpbiBDIG1vZGUpCi0jIFRvIGJ1aWxkIHRoZSBsaWJyYXJ5LCBkbzoKLSMgICAgICAgIm1ha2UgLWZtYWtlZmlsZS5ib3IgLURNT0RFTD1jIgotIyBvcjogICAibWFrZSAtZm1ha2VmaWxlLmJvciAtRE1PREVMPWwiCi0jCi0jIC0tLS0tLS0tLS0tLSBCb3JsYW5kIEMrKyAtLS0tLS0tLS0tLS0KLQotIyMjIEFic29sdXRlbHkgbmVjZXNzYXJ5IGZvciB0aGlzIG1ha2VmaWxlIHRvIHdvcmsKLS5BVVRPREVQRU5ECi0KLSMjIFdoZXJlIHpsaWIuaCwgemNvbmYuaCBhbmQgemxpYl9NT0RFTC5saWIgYXJlCi1aTElCX0RJUj0uLlx6bGliCi0KLSMjIENvbXBpbGVyLCBsaW5rZXIgYW5kIGxpYiBzdHVmZgotQ0M9YmNjCi1MRD1iY2MKLUxJQj10bGliCi0KLSFpZm5kZWYgTU9ERUwKLU1PREVMPWwKLSFlbmRpZgotCi1NT0RFTF9BUkc9LW0kKE1PREVMKQotCi0jVEFSR0VUX0NQVT0zCi0jIDIgPSAyODYsIDMgPSAzODYsIGV0Yy4KLSFpZm5kZWYgVEFSR0VUX0NQVQotVEFSR0VUX0NQVT0yCi0hZW5kaWYKLQotIyBVc2UgdGhpcyBpZiB5b3UgZG9uJ3Qgd2FudCBCb3JsYW5kJ3MgZmFuY3kgZXhjZXB0aW9uIGhhbmRsaW5nCi0jIChmb3IgQm9ybGFuZCBDKysgNC4wIG9yIGxhdGVyKQotI05PRUhMSUI9bm9laCQoTU9ERUwpLmxpYgotCi0haWZkZWYgREVCVUcKLUNERUJVRz0tdgotTERFQlVHPS12Ci0hZWxzZQotQ0RFQlVHPQotTERFQlVHPQotIWVuZGlmCi0KLSMgU1RBQ0tPRkxPVz0xCi0haWZkZWYgU1RBQ0tPRkxPVwotQ0RFQlVHPSQoQ0RFQlVHKSAtTgotTERFQlVHPSQoTERFQlVHKSAtTgotIWVuZGlmCi0KLSMgLVgtIHR1cm4gb24gZGVwZW5kZW5jeSBnZW5lcmF0aW9uIGluIHRoZSBvYmplY3QgZmlsZQotIyAtdyAgc2V0IGFsbCB3YXJuaW5ncyBvbgotIyAtTzIgb3B0aW1pemUgZm9yIHNwZWVkCi0jIC1aICBnbG9iYWwgb3B0aW1pemF0aW9uCi1DRkxBR1M9LU8yIC1aIC1YLSAtdyAtSSQoWkxJQl9ESVIpIC0kKFRBUkdFVF9DUFUpICQoTU9ERUxfQVJHKSAkKENERUJVRykKLQotIyAtTSAgZ2VuZXJhdGUgbWFwIGZpbGUKLUxERkxBR1M9LU0gLUwkKFpMSUJfRElSKSAkKE1PREVMX0FSRykgJChMREVCVUcpCi0KLSMjIFZhcmlhYmxlcwotCi1PQkpTID0gXAotCXBuZy5vYmogXAotCXBuZ2Vycm9yLm9iaiBcCi0JcG5nZ2V0Lm9iaiBcCi0JcG5nbWVtLm9iaiBcCi0JcG5ncHJlYWQub2JqIFwKLQlwbmdyZWFkLm9iaiBcCi0JcG5ncmlvLm9iaiBcCi0JcG5ncnRyYW4ub2JqIFwKLQlwbmdydXRpbC5vYmogXAotCXBuZ3NldC5vYmogXAotCXBuZ3RyYW5zLm9iaiBcCi0JcG5nd2lvLm9iaiBcCi0JcG5nd3JpdGUub2JqIFwKLQlwbmd3dHJhbi5vYmogXAotCXBuZ3d1dGlsLm9iagotCi1MSUJPQkpTID0gXAotCStwbmcub2JqIFwKLQkrcG5nZXJyb3Iub2JqIFwKLQkrcG5nZ2V0Lm9iaiBcCi0JK3BuZ21lbS5vYmogXAotCStwbmdwcmVhZC5vYmogXAotCStwbmdyZWFkLm9iaiBcCi0JK3BuZ3Jpby5vYmogXAotCStwbmdydHJhbi5vYmogXAotCStwbmdydXRpbC5vYmogXAotCStwbmdzZXQub2JqIFwKLQkrcG5ndHJhbnMub2JqIFwKLQkrcG5nd2lvLm9iaiBcCi0JK3BuZ3dyaXRlLm9iaiBcCi0JK3BuZ3d0cmFuLm9iaiBcCi0JK3BuZ3d1dGlsLm9iagotCi1MSUJOQU1FPWxpYnBuZyQoTU9ERUwpLmxpYgotCi0jIyBJbXBsaWNpdCBydWxlcwotCi0jIEJyYWNlcyBsZXQgbWFrZSAiYmF0Y2giIGNhbGxzIHRvIHRoZSBjb21waWxlciwKLSMgMiBjYWxscyBpbnN0ZWFkIG9mIDEyOyBzcGFjZSBpcyBpbXBvcnRhbnQuCi0uYy5vYmo6Ci0JJChDQykgJChDRkxBR1MpIC1jIHskKi5jIH0KLQotLmMuZXhlOgotCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpICQqLmMgJChMSUJOQU1FKSB6bGliXyQoTU9ERUwpLmxpYiAkKE5PRUhMSUIpCi0KLSMjIE1ham9yIHRhcmdldHMKLQotYWxsOiBsaWJwbmcgcG5ndGVzdAotCi1saWJwbmc6ICQoTElCTkFNRSkKLQotcG5ndGVzdDogcG5ndGVzdCQoTU9ERUwpLmV4ZQotCi10ZXN0OiBwbmd0ZXN0JChNT0RFTCkuZXhlCi0JcG5ndGVzdCQoTU9ERUwpCi0KLSMjIE1pbm9yIFRhcmdldHMKLQotcG5nLm9iajogcG5nLmMgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZXJyb3Iub2JqOiBwbmdlcnJvci5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ2dldC5vYmo6IHBuZ2dldC5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ21lbS5vYmo6IHBuZ21lbS5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3ByZWFkLm9iajogcG5ncHJlYWQuYyBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyZWFkLm9iajogcG5ncmVhZC5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3Jpby5vYmo6IHBuZ3Jpby5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3J0cmFuLm9iajogcG5ncnRyYW4uYyBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydXRpbC5vYmo6IHBuZ3J1dGlsLmMgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nc2V0Lm9iajogcG5nc2V0LmMgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ndHJhbnMub2JqOiBwbmd0cmFucy5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3dpby5vYmo6IHBuZ3dpby5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3dyaXRlLm9iajogcG5nd3JpdGUuYyBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dHJhbi5vYmo6IHBuZ3d0cmFuLmMgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3V0aWwub2JqOiBwbmd3dXRpbC5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQotJChMSUJOQU1FKTogJChPQkpTKQotCS1kZWwgJChMSUJOQU1FKQotCSQoTElCKSAkKExJQk5BTUUpIEAmJnwKLSQoTElCT0JKUyksIGxpYnBuZyQoTU9ERUwpCi18Ci0KLXBuZ3Rlc3QkKE1PREVMKS5vYmo6IHBuZ3Rlc3QuYyBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAkKENGTEFHUykgLW9wbmd0ZXN0JChNT0RFTCkgLWMgcG5ndGVzdC5jCi0KLXBuZ3Rlc3QkKE1PREVMKS5leGU6IHBuZ3Rlc3QkKE1PREVMKS5vYmoKLQkkKExEKSAkKExERkxBR1MpIHBuZ3Rlc3QkKE1PREVMKS5vYmogJChMSUJOQU1FKSB6bGliXyQoTU9ERUwpLmxpYiAkKE5PRUhMSUIpCi0KLSMgQ2xlYW4gdXAgYW55dGhpbmcgZWxzZSB5b3Ugd2FudAotY2xlYW46Ci0JLWRlbCAqLm9iagotCS1kZWwgKi5leGUKLQktZGVsICoubGliCi0JLWRlbCAqLmxzdAotCS1kZWwgKi5tYXAKLQotIyBFbmQgb2YgbWFrZWZpbGUgZm9yIGxpYnBuZwpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmNlZ2NjIGIvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmNlZ2NjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWU2YjhlLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5jZWdjYworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBjcmVhdGluZyBXaW5kb3dzIENFIHJlbGVhc2UgYXJjaGl2ZXMsIHdpdGggdGhlCi0jIG1pbmd3MzJjZSBjb21waWxlci4KLQotIyBMYXN0IHVwZGF0ZWQ6IDIyLUp1bC0yMDA4Ci0KLSMgQ29weXJpZ2h0IChDKSAyMDA4IFZpbmNlbnQgVG9ycmkKLQotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgVG8gZ2V0IHNvbWUgaGVscCwgdHlwZQotIwotIyBtYWtlIGhlbHAKLSMKLSMgVG8gY3JlYXRlIHRoZSBhcmNoaXZlcwotIwotIyBtYWtlCi0jCi0jIFRvIHJlbW92ZSBldmVyeXRoaW5nLCB0eXBlOgotIwotIyBtYWtlIGNsZWFuCi0KLVZFUk1BSiA9IDEKLVZFUk1JTiA9IDQKLVZFUk1JQyA9IDEyCi1WRVIgPSAkKFZFUk1BSikuJChWRVJNSU4pLiQoVkVSTUlDKQotTkFNRSA9IGxpYnBuZwotUEFDS0FHRSA9ICQoTkFNRSktJChWRVIpCi0KLUJJTiA9IGxpYnBuZzE0LTAuZGxsCi1MSUIgPSBsaWJwbmcxNC5hIGxpYnBuZzE0LmRsbC5hIGxpYnBuZy5hIGxpYnBuZy5kbGwuYSBzY3JpcHRzL3BuZzMyY2UuZGVmCi1JTkNMVURFID0gcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotUEMgPSBsaWJwbmcxNC5wYyBsaWJwbmcucGMKLQotTUFOSUZFU1RWRVJCSU4gPSAiTGlicG5nLSQoVkVSKTogQmluYXJ5IGZpbGVzIgotTUFOSUZFU1RWRVJERVYgPSAiTGlicG5nLSQoVkVSKTogRGV2ZWxvcGVyIGZpbGVzIgotTUFOSUZFU1RWRVJERVNDID0gIkxpYnBuZzogdGhlIG9mZmljaWFsIFBORyByZWZlcmVuY2UgbGlicmFyeSIKLQotYWxsOiAkKE5BTUUpCi0KLSQoTkFNRSk6IHJlbW92ZS1vbGQgY29weS1zcmMgY29tcGlsYXRpb24gY29weSBtYW5pZmVzdCBhcmNoaXZlCi0JQGVjaG8gIiAqIFJlbW92YWwgb2YgdGhlIGRpcmVjdG9yaWVzIgotCUBybSAtcmYgJChQQUNLQUdFKS8gJChQQUNLQUdFKS1iaW4vICQoUEFDS0FHRSktZGV2LwotCi1yZW1vdmUtb2xkOgotCUBlY2hvICIgKiBSZW1vdmFsIG9mIHRoZSBvbGQgZmlsZXMiCi0JQHJtIC1yZiAkKFBBQ0tBR0UpLWJpbioKLQlAcm0gLXJmICQoUEFDS0FHRSktZGV2KgotCi1jb3B5LXNyYzoKLQlAZWNobyAiICogQ29weSBvZiBzb3VyY2UgZmlsZXMiCi0JQGNwIC1SIC4uL3NyYy8kKFBBQ0tBR0UpIC4KLQlAZWNobyAiICogQ3JlYXRpb24gb2YgZGlyZWN0b3JpZXMgYW5kIGZpbGVzIgotCUBta2RpciAtcCAkKFBBQ0tBR0UpLWJpbi9iaW4KLQlAbWtkaXIgLXAgJChQQUNLQUdFKS1iaW4vbWFuaWZlc3QKLQlAbWtkaXIgLXAgJChQQUNLQUdFKS1kZXYvbGliL3BrZ2NvbmZpZwotCUBta2RpciAtcCAkKFBBQ0tBR0UpLWRldi9pbmNsdWRlLyQoTkFNRSkkKFZFUk1BSikkKFZFUk1JTikKLQlAbWtkaXIgLXAgJChQQUNLQUdFKS1kZXYvbWFuaWZlc3QKLQlAdG91Y2ggJChQQUNLQUdFKS1iaW4vbWFuaWZlc3QvJChQQUNLQUdFKS1iaW4ubWZ0Ci0JQHRvdWNoICQoUEFDS0FHRSktYmluL21hbmlmZXN0LyQoUEFDS0FHRSktYmluLnZlcgotCUB0b3VjaCAkKFBBQ0tBR0UpLWRldi9tYW5pZmVzdC8kKFBBQ0tBR0UpLWRldi5tZnQKLQlAdG91Y2ggJChQQUNLQUdFKS1kZXYvbWFuaWZlc3QvJChQQUNLQUdFKS1kZXYudmVyCi0KLWNvbXBpbGF0aW9uOgotCUBlY2hvICIgKiBDb21waWxhdGlvbiBvZiAkKFBBQ0tBR0UpIgotCWNkICQoUEFDS0FHRSkgJiYgQ1BQRkxBR1M9IiQoQ1BQRkxBR1MpIC1EUE5HX0JVSUxEX0RMTCAtRFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRCAtRF9XSU4zMl9XQ0U9MHgwNDIwIiBDRkxBR1M9IiQoQ0ZMQUdTKSAtbW1zLWJpdGZpZWxkcyAtTzMgLXBpcGUgLWZvbWl0LWZyYW1lLXBvaW50ZXIiIExERkxBR1M9IiQoTERGTEFHUykgLVdsLC0tZW5hYmxlLWF1dG8taW1wb3J0IC1XbCwtcyIgLi9jb25maWd1cmUgLS1wcmVmaXg9L29wdC93aW5jZSAtLWhvc3Q9YXJtLW1pbmd3MzJjZSAmJiBtYWtlCi0KLWNvcHk6Ci0JQGVjaG8gIiAqIENvcHkgb2YgYmluYXJ5IGFuZCBkZXZlbG9wbWVudCBmaWxlcyIKLQlAZm9yIGkgaW4gJChCSU4pOyBkbyBcCi0JICBjcCAkKFBBQ0tBR0UpLy5saWJzLyQkaSAkKFBBQ0tBR0UpLWJpbi9iaW47IFwKLQlkb25lCi0JQGZvciBpIGluICQoTElCKTsgZG8gXAotCSAgY3AgJChQQUNLQUdFKS8ubGlicy8kJGkgJChQQUNLQUdFKS1kZXYvbGliOyBcCi0JZG9uZQotCUBmb3IgaSBpbiAkKElOQ0xVREUpOyBkbyBcCi0JICBjcCAkKFBBQ0tBR0UpLyQkaSAkKFBBQ0tBR0UpLWRldi9pbmNsdWRlLyQoTkFNRSkkKFZFUk1BSikkKFZFUk1JTik7IFwKLQlkb25lCi0JQGZvciBpIGluICQoUEMpOyBkbyBcCi0JICBjcCAkKFBBQ0tBR0UpLyQkaSAkKFBBQ0tBR0UpLWRldi9saWIvcGtnY29uZmlnOyBcCi0JZG9uZQotCi1tYW5pZmVzdDoKLQlAZWNobyAiICogQ3JlYXRpb24gb2YgdGhlIG1hbmlmZXN0IgotCUBjZCAkKFBBQ0tBR0UpLWJpbiAmJiBmaW5kICogPj4gbWFuaWZlc3QvJChQQUNLQUdFKS1iaW4ubWZ0Ci0JQGNkICQoUEFDS0FHRSktYmluICYmIFwKLQkgIGVjaG8gJChNQU5JRkVTVFZFUkJJTikgPj4gbWFuaWZlc3QvJChQQUNLQUdFKS1iaW4udmVyICYmIFwKLQkgIGVjaG8gJChNQU5JRkVTVFZFUkRFU0MpID4+IG1hbmlmZXN0LyQoUEFDS0FHRSktYmluLnZlcgotCUBjZCAkKFBBQ0tBR0UpLWRldiAmJiBmaW5kICogPj4gbWFuaWZlc3QvJChQQUNLQUdFKS1kZXYubWZ0Ci0JQGNkICQoUEFDS0FHRSktZGV2ICYmIFwKLQkgIGVjaG8gJChNQU5JRkVTVFZFUkRFVikgPj4gbWFuaWZlc3QvJChQQUNLQUdFKS1kZXYudmVyICYmIFwKLQkgIGVjaG8gJChNQU5JRkVTVFZFUkRFU0MpID4+IG1hbmlmZXN0LyQoUEFDS0FHRSktZGV2LnZlcgotCi1hcmNoaXZlOgotCUBlY2hvICIgKiBDcmVhdGlvbiBvZiB0aGUgYXJjaGl2ZXMiCi0JQHRhciBjZiAkKFBBQ0tBR0UpLWJpbi50YXIgJChQQUNLQUdFKS1iaW4KLQlAYnppcDIgLTkgJChQQUNLQUdFKS1iaW4udGFyCi0JQHRhciBjZiAkKFBBQ0tBR0UpLWRldi50YXIgJChQQUNLQUdFKS1kZXYKLQlAYnppcDIgLTkgJChQQUNLQUdFKS1kZXYudGFyCi0KLWNsZWFuOgotCUBlY2hvICIgKiBDbGVhbmluZyIKLQlAcm0gLXJmICQoUEFDS0FHRSkqCi0KLWhlbHA6Ci0JQGVjaG8KLQlAZWNobyAiVG8gY3JlYXRlIHRoZSBhcmNoaXZlcywgdHlwZToiCi0JQGVjaG8gIiBtYWtlIgotCUBlY2hvCi0JQGVjaG8gIlRvIHJlbW92ZSBldmVyeXRoaW5nLCB0eXBlOiIKLQlAZWNobyAiIG1ha2UgY2xlYW4iCi0JQGVjaG8KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5jeWd3aW4gYi9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuY3lnd2luCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2NhYmIxLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5jeWd3aW4KKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgY3lnd2luIG9uIHg4NgotIyAgIEJ1aWxkcyBib3RoIGRsbCAod2l0aCBpbXBvcnQgbGliKSBhbmQgc3RhdGljIGxpYiB2ZXJzaW9ucwotIyAgIG9mIHRoZSBsaWJyYXJ5LCBhbmQgYnVpbGRzIHR3byBjb3BpZXMgb2YgcG5ndGVzdDogb25lCi0jICAgc3RhdGljYWxseSBsaW5rZWQgYW5kIG9uZSBkeW5hbWljYWxseSBsaW5rZWQuCi0jCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNi0yMDA4IFNvcmVuIEFuZGVyc29uLCBDaGFybGVzIFdpbHNvbiwKLSMgICAgYW5kIEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYmFzZWQgb24gbWFrZWZpbGUgZm9yIGxpbnV4LWVsZiB3L21teCBieToKLSMgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgR3JlZyBSb2Vsb2ZzCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgVGhpcyBtYWtlZmlsZSBpbnRlbmRzIHRvIHN1cHBvcnQgYnVpbGRpbmcgb3V0c2lkZSB0aGUgc3JjIGRpcmVjdG9yeQotIyBpZiBkZXNpcmVkLiBXaGVuIGludm9raW5nIGl0LCBzcGVjaWZ5IGFuIGFyZ3VtZW50IHRvIFNSQ0RJUiBvbiB0aGUKLSMgY29tbWFuZCBsaW5lIHRoYXQgcG9pbnRzIHRvIHRoZSB0b3Agb2YgdGhlIGRpcmVjdG9yeSB3aGVyZSB5b3VyIHNvdXJjZQotIyBpcyBsb2NhdGVkLgotCi1pZmRlZiBTUkNESVIKLVZQQVRIID0gJChTUkNESVIpCi1lbHNlCi1TUkNESVIgPSAuCi1lbmRpZgotCi0jIE92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi0KLURFU1RESVI9Ci0KLUNDPWdjYwotaWZkZWYgTUlOR1cKLU1JTkdXX0NDRkxBR1M9LW1uby1jeWd3aW4gLUkvdXNyL2luY2x1ZGUvbWluZ3cKLU1JTkdXX0xERkxBR1M9LW1uby1jeWd3aW4gLUwvdXNyL2xpYi9taW5ndwotZW5kaWYKLQotIyBXaGVyZSAibWFrZSBpbnN0YWxsIiBwdXRzIGxpYnBuZyouYSwgKnBuZyouZGxsLCBwbmcuaCwgYW5kIHBuZ2NvbmYuaAotaWZuZGVmIHByZWZpeAotcHJlZml4PS91c3IKLSQod2FybmluZyBZb3UgaGF2ZW4ndCBzcGVjaWZpZWQgYSAncHJlZml4PScgbG9jYXRpb24uIERlZmF1bHRpbmcgdG8gIi91c3IiKQotZW5kaWYKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLVpMSUJMSUI9IC91c3IvbGliCi1aTElCSU5DPQotI1pMSUJMSUI9Li4vemxpYgotI1pMSUJJTkM9Li4vemxpYgotCi1BTElHTj0KLSMgZm9yIGkzODY6Ci0jQUxJR049LW1hbGlnbi1sb29wcz0yIC1tYWxpZ24tZnVuY3Rpb25zPTIKLQotV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyBcCi0JLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCi0JLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAjLVdjb252ZXJzaW9uCi0KLUNGTEFHUz0gJChzdHJpcCAkKE1JTkdXX0NDRkxBR1MpICQoYWRkcHJlZml4IC1JLCQoWkxJQklOQykpIFwKLSAgICAgICAgLVcgLVdhbGwgLU8zICQoQUxJR04pIC1mdW5yb2xsLWxvb3BzIFwKLQktZm9taXQtZnJhbWUtcG9pbnRlcikgIyAkKFdBUk5NT1JFKSAtZyAtRFBOR19ERUJVRz01Ci0KLUxJQk5BTUUgPSBsaWJwbmcxNAotUE5HTUFKID0gMTQKLUNZR0RMTCA9IDE0Ci0KLVNIQVJFRExJQj1jeWdwbmckKENZR0RMTCkuZGxsCi1TVEFUTElCPWxpYnBuZy5hCi1JTVBMSUI9bGlicG5nLmRsbC5hCi1TSEFSRURERUY9bGlicG5nLmRlZgotTElCUz0kKFNIQVJFRExJQikgJChTVEFUTElCKQotRVhFPS5leGUKLQotTERGTEFHUz0kKHN0cmlwIC1MLiAkKE1JTkdXX0xERkxBR1MpIC1scG5nICQoYWRkcHJlZml4IC1MLCQoWkxJQkxJQikpIC1seikKLUxEU0ZMQUdTPSQoc3RyaXAgLXNoYXJlZCAtTC4gICQoTUlOR1dfTERGTEFHUykgLVdsLC0tZXhwb3J0LWFsbCkKLUxERVhUUkE9LVdsLC0tb3V0LWltcGxpYj0kKElNUExJQikgJChhZGRwcmVmaXggLUwsJChaTElCTElCKSkgLWx6Ci0KLU1LRElSX1A9L2Jpbi9ta2RpciAtcHYKLVJBTkxJQj1yYW5saWIKLSNSQU5MSUI9ZWNobwotCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgotCi1CSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgotTUFOUEFUSD0kKHByZWZpeCkvbWFuCi1NQU4zUEFUSD0kKE1BTlBBVEgpL21hbjMKLU1BTjVQQVRIPSQoTUFOUEFUSCkvbWFuNQotCi0jIGNvc21ldGljOiBzaG9ydGVuZWQgc3RyaW5nczoKLVMgPSQoU1JDRElSKQotRCA9JChERVNURElSKQotREIgPSQoRCkkKEJJTlBBVEgpCi1ESSA9JChEKSQoSU5DUEFUSCkKLURMID0kKEQpJChMSUJQQVRIKQotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLU9CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQotCi0uU1VGRklYRVM6IC5jIC5vIC5waWMubwotCi0lLm8gOiAlLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgJDwKLSUucGljLm8gOiBDRkxBR1MgKz0gLURQTkdfQlVJTERfRExMCi0lLnBpYy5vIDogJS5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLWFsbDogYWxsLXN0YXRpYyBhbGwtc2hhcmVkIGxpYnBuZy5wYyBsaWJwbmctY29uZmlnIGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLSMgTWFrZSB0aGlzIHRvIHZlcmlmeSB0aGF0ICJtYWtlIFsuLi5dIGluc3RhbGwiIHdpbGwgZG8gd2hhdCB5b3Ugd2FudC4KLWJ1aWxkc2V0dXAtdGVsbDoKLQlAZWNobyAgVlBBVEggaXMgc2V0IHRvOiBcIiQoVlBBVEgpXCIKLQlAZWNobyAgcHJlZml4IGlzIHNldCB0bzogXCIkKHByZWZpeClcIgotCUBlY2hvIC1lIElOQ1BBVEgsTElCUEFUSCwgZXRjLiBhcmUgc2V0IHRvOidcbicgXAotICQoYWRkcHJlZml4ICQoRCksJChJTkNQQVRIKSdcbicgJChMSUJQQVRIKSdcbicgJChCSU5QQVRIKSdcbicgXAotICAgJChNQU5QQVRIKSdcbicgJChNQU4zUEFUSCknXG4nICQoTUFONVBBVEgpJ1xuJyknXG4nCi0KLWxpYnBuZy5wYzogc2NyaXB0cy9saWJwbmcucGMuaW4KLQlAZWNobyAtZSBNYWtpbmcgcGtnLWNvbmZpZyBmaWxlIGZvciB0aGlzIGxpYnBuZyBpbnN0YWxsYXRpb24uLidcbicgXAotICAgICAgICAgICB1c2luZyBQUkVGSVg9XCIkKHByZWZpeClcIidcbicKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzE0IS1scG5nMTRcIC1seiEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzogc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW4gc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4KLQlAZWNobyAtZSBNYWtpbmcgJChMSUJOQU1FKSBsaWJwbmctY29uZmlnIGZpbGUgZm9yIHRoaXMgbGlicG5nIFwKLSBpbnN0YWxsYXRpb24uLidcbicgdXNpbmcgUFJFRklYPVwiJChwcmVmaXgpXCInXG4nCi0JKCBjYXQgJChTKS9zY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIExfb3B0cz1cIi1MJChMSUJQQVRIKVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmckKENZR0RMTCkgLWx6XCI7IFwKLQljYXQgJChTKS9zY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZwotCWNobW9kICt4IGxpYnBuZy1jb25maWcKLQotc3RhdGljOiBhbGwtc3RhdGljCi1zaGFyZWQ6IGFsbC1zaGFyZWQKLWFsbC1zdGF0aWM6ICQoU1RBVExJQikgcG5ndGVzdC1zdGF0JChFWEUpCi1hbGwtc2hhcmVkOiAkKFNIQVJFRExJQikgcG5ndGVzdCQoRVhFKQotCi0kKFNUQVRMSUIpOiAkKE9CSlMpCi0JYXIgcmMgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi0kKFNIQVJFRERFRik6IHNjcmlwdHMvcG5nd2luLmRlZgotCWNhdCAkPCB8IHNlZCAtZSAnMXtHO3MvXlwoLipcKVwoXG5cKS9FWFBPUlRTLzt9OzIsL15FWFBPUlRTL2QnIHwgXAotCXNlZCAtZSAncy9cKFteO10qXCk7LzsvJyA+ICRACi0KLSQoU0hBUkVETElCKTogJChPQkpTRExMKSAkKFNIQVJFRERFRikKLQkkKENDKSAkKExEU0ZMQUdTKSAtbyAkQCAkKE9CSlNETEwpIC1MLiAkKExERVhUUkEpCi0KLXBuZ3Rlc3QkKEVYRSk6IHBuZ3Rlc3QucGljLm8gJChTSEFSRURMSUIpCi0JJChDQykgJChDRkxBR1MpICQ8ICQoTERGTEFHUykgLW8gJEAKLQotcG5ndGVzdC1zdGF0JChFWEUpOiBwbmd0ZXN0Lm8gJChTVEFUTElCKQotCSQoQ0MpIC1zdGF0aWMgJChDRkxBR1MpICQ8ICQoTERGTEFHUykgLW8gJEAKLQotcG5ndGVzdC5waWMubzogcG5ndGVzdC5jCi0JJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACi0KLXBuZ3Rlc3QubzogcG5ndGVzdC5jIHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPCAtbyAkQAotCi10ZXN0OiB0ZXN0LXN0YXRpYyB0ZXN0LXNoYXJlZAotCi10ZXN0LXN0YXRpYzogcG5ndGVzdC1zdGF0JChFWEUpCi0JLi9wbmd0ZXN0LXN0YXQgJChTKS9wbmd0ZXN0LnBuZwotCi10ZXN0LXNoYXJlZDogcG5ndGVzdCQoRVhFKQotCS4vcG5ndGVzdCAkKFMpL3BuZ3Rlc3QucG5nCi0KLWluc3RhbGwtc3RhdGljOiAkKFNUQVRMSUIpIGluc3RhbGwtaGVhZGVycyBpbnN0YWxsLW1hbgotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQlpbnN0YWxsIC1tIDY0NCAkKFNUQVRMSUIpICQoREwpLyQoTElCTkFNRSkuYQotCS1Acm0gLWYgJChETCkvJChTVEFUTElCKQotCShjZCAkKERMKTsgbG4gLXNmICQoTElCTkFNRSkuYSAkKFNUQVRMSUIpKQotCi1pbnN0YWxsLXNoYXJlZDogJChTSEFSRURMSUIpIGxpYnBuZy5wYyBsaWJwbmctY29uZmlnIGluc3RhbGwtaGVhZGVycyBpbnN0YWxsLW1hbgotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCi0JLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCi0JLUAvYmluL3JtIC1mICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JLUAvYmluL3JtIC1mICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKLQlpbnN0YWxsIC1tIDY0NCAkKElNUExJQikgJChETCkvJChMSUJOQU1FKS5kbGwuYQotCS1Acm0gLWYgJChETCkvJChJTVBMSUIpCi0JKGNkICQoREwpOyBsbiAtc2YgJChMSUJOQU1FKS5kbGwuYSAkKElNUExJQikpCi0JaW5zdGFsbCAtcyAtbSA3NTUgJChTSEFSRURMSUIpICQoREIpCi0JaW5zdGFsbCAtbSA2NDQgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgbG4gLXNmICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLWhlYWRlcnM6Ci0JLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQotCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JLUBybSAtZiAkKERJKS9wbmcuaAotCS1Acm0gLWYgJChESSkvcG5nY29uZi5oCi0JaW5zdGFsbCAtbSA2NDQgJChTKS9wbmcuaCAkKFMpL3BuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JLUBybSAtZiAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7IGxuIC1zZiAkKExJQk5BTUUpIGxpYnBuZzsgbG4gLXNmICQoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLW1hbjoKLQktQGlmIFsgISAtZCAkKEQpJChNQU4zUEFUSCkgXTsgdGhlbiAkKE1LRElSX1ApICQoRCkkKE1BTjNQQVRIKTsgZmkKLQktQGlmIFsgISAtZCAkKEQpJChNQU41UEFUSCkgXTsgdGhlbiAkKE1LRElSX1ApICQoRCkkKE1BTjVQQVRIKTsgZmkKLQlpbnN0YWxsIC1tIDY0NCAkKFMpL2xpYnBuZ3BmLjMgJChTKS9saWJwbmcuMyAkKEQpJChNQU4zUEFUSCkKLQlpbnN0YWxsIC1tIDY0NCAkKFMpL3BuZy41ICQoRCkkKE1BTjVQQVRIKQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQC9iaW4vcm0gLWYgJChEQikvbGlicG5nLWNvbmZpZwotCS1AL2Jpbi9ybSAtZiAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7IGxuIC1zZiAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQotCi0jIFJ1biB0aGlzIHRvIHZlcmlmeSB0aGF0IGEgZnV0dXJlIGBjb25maWd1cmUnIHJ1biB3aWxsIHBpY2sgdXAgdGhlIHNldHRpbmdzCi0jIHlvdSB3YW50LgotdGVzdC1jb25maWctaW5zdGFsbDogU0hFTEw9L2Jpbi9iYXNoCi10ZXN0LWNvbmZpZy1pbnN0YWxsOiAkKERCKS9saWJwbmctY29uZmlnCi0JQGVjaG8gLWUgVGVzdGluZyBsaWJwbmctY29uZmlnIGZ1bmN0aW9ucy4uLidcbicKLQlAIGZvciBUWVJBIGluIExERkxBR1MgQ1BQRkxBR1MgQ0ZMQUdTIExJQlMgVkVSU0lPTjsgXAotICAgZG8gXAotICAgIHByaW50ZiAiKCVkKVx0ICUxMHMgPSVzXG4iICQkKCgkJGd5dGl1ICsgMSkpICQkVFlSQSBcCi0gICAgIiQkKCQoREIpL2xpYnBuZy1jb25maWcgYGVjaG8gLS0kJFRZUkEgfHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nYCkiOyBcCi0gICAgZ3l0aXU9JCQoKCAkJGd5dGl1ICsgMSApKTsgXAotICAgZG9uZQotCi1pbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZwotCi0jIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKLSMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0Ci0jIGJlZm9yZSB0aGVuLgotCi10ZXN0LWRkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCi0JJChDQykgLUkkKERJKSAkKENGTEFHUykgXAotCSAgIGAkKEJJTlBBVEgpL2xpYnBuZzE0LWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvbGlicG5nMTQtY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RkIHBuZ3Rlc3QucG5nCi0KLXRlc3QtaW5zdGFsbGVkOgotCSQoQ0MpICQoQ0ZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvbGlicG5nMTQtY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGkkKEVYRSkgYCQoQklOUEFUSCkvbGlicG5nMTQtY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpJChFWEUpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCS9iaW4vcm0gLWYgKi5waWMubyAqLm8gJChTVEFUTElCKSAkKElNUExJQikgJChTSEFSRURMSUIpIFwKLQlwbmd0ZXN0LXN0YXQkKEVYRSkgcG5ndGVzdCQoRVhFKSBwbmdvdXQucG5nICQoU0hBUkVEREVGKSBcCi0JbGlicG5nLWNvbmZpZyBsaWJwbmcucGMgcG5ndGVzdGkkKEVYRSkKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotLlBIT05ZOiBidWlsZHNldHVwLXRlbGwgbGlicG5nLnBjIGxpYnBuZy1jb25maWcgdGVzdC1jb25maWctaW5zdGFsbCBjbGVhbgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vIHBuZy5waWMubzoJCXBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmggcG5nLmMKLXBuZ2Vycm9yLm8gcG5nZXJyb3IucGljLm86CXBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmggcG5nZXJyb3IuYwotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOgkJcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaCBwbmdyaW8uYwotcG5nd2lvLm8gcG5nd2lvLnBpYy5vOgkJcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaCBwbmd3aW8uYwotcG5nbWVtLm8gcG5nbWVtLnBpYy5vOgkJcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaCBwbmdtZW0uYwotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOgkJcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaCBwbmdzZXQuYwotcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOgkJcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaCBwbmdnZXQuYwotcG5ncmVhZC5vIHBuZ3JlYWQucGljLm86CXBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmggcG5ncmVhZC5jCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oIHBuZ3J0cmFuLmMKLXBuZ3J1dGlsLm8gcG5ncnV0aWwucGljLm86CXBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmggcG5ncnV0aWwuYwotcG5ndHJhbnMubyBwbmd0cmFucy5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaCBwbmd0cmFucy5jCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oIHBuZ3dyaXRlLmMKLXBuZ3d0cmFuLm8gcG5nd3RyYW4ucGljLm86CXBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmggcG5nd3RyYW4uYwotcG5nd3V0aWwubyBwbmd3dXRpbC5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaCBwbmd3dXRpbC5jCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oIHBuZ3ByZWFkLmMKLQotcG5ndGVzdC5vOgkJCXBuZy5oIHBuZ2NvbmYuaCBwbmd0ZXN0LmMKLXBuZ3Rlc3Qtc3RhdC5vOgkJCXBuZy5oIHBuZ2NvbmYuaCBwbmd0ZXN0LmMKLQotCi0KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5kYXJ3aW4gYi9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZGFyd2luCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGU3ZjA2Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5kYXJ3aW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nIG9uIERhcndpbiAvIE1hYyBPUyBYCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNCwgMjAwNiwgMjAwOCwgMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAyMDAxIENocmlzdG9waCBQZmlzdGVyZXIKLSMgZGVyaXZlZCBmcm9tIG1ha2VmaWxlLmxpbnV4OgotIyAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEdyZWcgUm9lbG9mcwotIyAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyB3aGVyZSAibWFrZSBpbnN0YWxsIiBwdXRzIGxpYnBuZy5hLCBsaWJwbmcxNC5keWxpYiwgcG5nLmggYW5kIHBuZ2NvbmYuaAotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLSNaTElCTElCPS91c3IvbG9jYWwvbGliCi0jWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKLVpMSUJMSUI9Li4vemxpYgotWkxJQklOQz0uLi96bGliCi0KLSMgTGlicmFyeSBuYW1lOgotTElCTkFNRSA9IGxpYnBuZzE0Ci1QTkdNQUogPSAxNAotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5keWxpYgotTElCU09NQUo9JChMSUJOQU1FKS4kKFBOR01BSikuZHlsaWIKLUxJQlNPUkVMPSQoTElCTkFNRSkuJChQTkdNQUopLiQoUkVMRUFTRSkuZHlsaWIKLU9MRFNPPWxpYnBuZy5keWxpYgotCi0jIFV0aWxpdGllczoKLUNDPWNjCi1BUl9SQz1hciByYwotTUtESVJfUD1ta2RpciAtcAotTE5fU0Y9bG4gLXNmCi1SQU5MSUI9cmFubGliCi1STV9GPS9iaW4vcm0gLWYKLQotIyBDRkxBR1M9LUkkKFpMSUJJTkMpIC1XIC1XYWxsIC1PMyAtZnVucm9sbC1sb29wcwotQ0ZMQUdTPS1JJChaTElCSU5DKSAtVyAtV2FsbCAtTyAtZnVucm9sbC1sb29wcwotTERGTEFHUz0tTC4gLUwkKFpMSUJMSUIpIC1scG5nMTQgLWx6Ci0KLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCi1NQU5QQVRIPSQocHJlZml4KS9tYW4KLUJJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLURCPSQoREVTVERJUikkKEJJTlBBVEgpCi1EST0kKERFU1RESVIpJChJTkNQQVRIKQotREw9JChERVNURElSKSQoTElCUEFUSCkKLURNPSQoREVTVERJUikkKE1BTlBBVEgpCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCi0KLS5TVUZGSVhFUzogICAgICAuYyAubyAucGljLm8KLQotLmMucGljLm86Ci0JJChDQykgLWMgJChDRkxBR1MpIC1mbm8tY29tbW9uIC1vICRAICQqLmMKLQotYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JJChBUl9SQykgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxNCEtbHBuZzE0XCAtbHohID4gbGlicG5nLnBjCi0KLWxpYnBuZy1jb25maWc6Ci0JKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKLQllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCi0JZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCi0JZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAotCWVjaG8gbGlicz1cIi1scG5nMTQgLWx6XCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0KLSQoTElCU09NQUopOiAkKE9CSlNETEwpCi0JJChDQykgLWR5bmFtaWNsaWIgXAotCSAtaW5zdGFsbF9uYW1lICQoTElCUEFUSCkvJChMSUJTT01BSikgXAotCSAtY3VycmVudF92ZXJzaW9uIDE0IC1jb21wYXRpYmlsaXR5X3ZlcnNpb24gMTQgXAotCSAtbyAkKExJQlNPTUFKKSBcCi0JICQoT0JKU0RMTCkgLUwkKFpMSUJMSUIpIC1segotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gJChMSUJTTykKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oCi0JLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQotCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JY3AgcG5nLmggcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvbGlicG5nCi0JKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCi0JY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQotCSQoUkFOTElCKSAkKERMKS8kKExJQk5BTUUpLmEKLQktQCQoUk1fRikgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKLQotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPTUFKKSBsaWJwbmcucGMKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09SRUwpCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JY3AgJChMSUJTT01BSikgJChETCkvJChMSUJTT1JFTCkKLQljaG1vZCA3NTUgJChETCkvJChMSUJTT1JFTCkKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKExJQlNPUkVMKSAkKExJQlNPKTsgXAotCSQoTE5fU0YpICQoTElCU08pICQoT0xEU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpIC1JJChESSkgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JJChDQykgJChDRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZyBsaWJwbmctY29uZmlnIFwKLQlsaWJwbmcucGMgJChMSUJOQU1FKS4qZHlsaWIgcG5ndGVzdGkKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ2Vycm9yLm8gcG5nZXJyb3IucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3Jpby5vIHBuZ3Jpby5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdtZW0ubyBwbmdtZW0ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3NldC5vIHBuZ3NldC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyZWFkLm8gcG5ncmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnRyYW4ubyBwbmdydHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ndHJhbnMubyBwbmd0cmFucy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3JpdGUubyBwbmd3cml0ZS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3V0aWwubyBwbmd3dXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncHJlYWQubyBwbmdwcmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmRlYyBiL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5kZWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZDZlMTkuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmRlYworKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgb24gREVDIEFscGhhIFVuaXgKLSMgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIsIDIwMDYsIDIwMTAgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIExpYnJhcnkgbmFtZToKLVBOR01BSiA9IDE0Ci1MSUJOQU1FID0gbGlicG5nMTQKLQotIyBTaGFyZWQgbGlicmFyeSBuYW1lczoKLUxJQlNPPSQoTElCTkFNRSkuc28KLUxJQlNPTUFKPSQoTElCTkFNRSkuc28uJChQTkdNQUopCi1MSUJTT1JFTD0kKExJQlNPTUFKKS4kKFJFTEVBU0UpCi1PTERTTz1saWJwbmcuc28KLQotIyBVdGlsaXRpZXM6Ci1BUl9SQz1hciByYwotQ0M9Y2MKLU1LRElSX1A9bWtkaXIKLUxOX1NGPWxuIC1mIC1zCi1SQU5MSUI9cmFubGliCi1STV9GPS9iaW4vcm0gLWYKLQotIyB3aGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSBhbmQgcG5nLmgKLXByZWZpeD0vdXNyL2xvY2FsCi1leGVjX3ByZWZpeD0kKHByZWZpeCkKLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCi1NQU5QQVRIPSQocHJlZml4KS9tYW4KLUJJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLURCPSQoREVTVERJUikkKEJJTlBBVEgpCi1EST0kKERFU1RESVIpJChJTkNQQVRIKQotREw9JChERVNURElSKSQoTElCUEFUSCkKLURNPSQoREVTVERJUikkKE1BTlBBVEgpCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotI1pMSUJMSUI9L3Vzci9sb2NhbC9saWIKLSNaTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQotWkxJQkxJQj0uLi96bGliCi1aTElCSU5DPS4uL3psaWIKLQotQ0ZMQUdTPS1zdGQgLXcxIC1JJChaTElCSU5DKSAtTyAjIC1nIC1EUE5HX0RFQlVHPTEKLUxERkxBR1M9LUwkKFpMSUJMSUIpIC1ycGF0aCAkKFpMSUJMSUIpIGxpYnBuZy5hIC1seiAtbG0KLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1hbGw6ICQoTElCU08pIGxpYnBuZy5hIHBuZ3Rlc3QgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxNCEtbHBuZzE0XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzoKLQkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIGNjb3B0cz1cIi1zdGRcIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzE0IC1seiAtbG1cIjsgXAotCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZwotCWNobW9kICt4IGxpYnBuZy1jb25maWcKLQotJChMSUJTTyk6ICQoTElCU09NQUopCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKLQotJChMSUJTT01BSik6ICQoT0JKUykKLQkkKENDKSAtc2hhcmVkIC1vICRAICQoT0JKUykgLUwkKFpMSUJMSUIpIFwKLQktc29uYW1lICQoTElCU09NQUopCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAvYmluL3JtIC1mICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaAotCS1AL2Jpbi9ybSAtZiAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQktQC9iaW4vcm0gLWYgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AL2Jpbi9ybSAtZiAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAvYmluL3JtIC1mICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AL2Jpbi9ybSAtZiAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQC9iaW4vcm0gLWYgJChEQikvbGlicG5nLWNvbmZpZwotCS1AL2Jpbi9ybSAtZiAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQotCi1pbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZwotCi0jIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKLSMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0Ci0jIGJlZm9yZSB0aGVuLgotCi10ZXN0LWRkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCi0JJChDQykgLXcxIC1JJChESSkgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSAgLVIkKFpMSUJMSUIpIC1SJChETCkgXAotCSAgIC1vIHBuZ3Rlc3RkIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RkIHBuZ3Rlc3QucG5nCi0KLXRlc3QtaW5zdGFsbGVkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkuCi0JJChDQykgLXcxIC1JJChaTElCSU5DKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JL2Jpbi9ybSAtZiAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmd0ZXN0aSBwbmdvdXQucG5nIFwKLQlsaWJwbmctY29uZmlnICQoTElCU08pICQoTElCU09NQUopKiBcCi0JbGlicG5nLnBjCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ2Vycm9yLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3Jpby5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3aW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nbWVtLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3NldC5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdnZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3cml0ZS5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdwcmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZGoyIGIvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmRqMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE4ZWI3NC4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZGoyCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIyBESkdQUCAoRE9TIGdjYykgbWFrZWZpbGUgZm9yIGxpYnBuZwotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYsIDIwMDktMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgd2hlcmUgbWFrZSBpbnN0YWxsIHdpbGwgcHV0IGxpYnBuZy5hIGFuZCBwbmcuaAotI3ByZWZpeD0vdXNyL2xvY2FsCi1wcmVmaXg9LgotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKHByZWZpeCkvbGliCi0KLUNDPWdjYwotQ0ZMQUdTPS1JLi4vemxpYiAtTyAtRFBOR19OT19TTlBSSU5URgotTERGTEFHUz0tTC4gLUwuLi96bGliLyAtbHBuZyAtbHogLWxtCi0KLVJBTkxJQj1yYW5saWIKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIHBuZ3d0cmFuLm8gXAotCXBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1hbGw6IGxpYnBuZy5hIHBuZ3Rlc3QKLQotbGlicG5nLmE6ICQoT0JKUykKLQlhciByYyAkQCAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gbGlicG5nLmEKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCWNvZmYyZXhlIHBuZ3Rlc3QKLQotdGVzdDogcG5ndGVzdAotCS4vcG5ndGVzdAotY2xlYW46Ci0Jcm0gLWYgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZwotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdlcnJvci5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyaW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd2lvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ21lbS5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdzZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZ2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3JlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnV0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ndHJhbnMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3RyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3V0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmVsZiBiL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5lbGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MGI4NzguLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmVsZgorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcuYSBhbmQgbGlicG5nMTQuc28gb24gTGludXggRUxGIHdpdGggZ2NjCi0jIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMiwgMjAwNiwgMjAwOCwgMjAxMCBHcmVnIFJvZWxvZnMKLSMgYW5kIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIE1vZGlmaWVkIGZvciBEZWJpYW4gYnkgSnVuaWNoaSBVZWthd2EgYW5kIEpvc3NlbGluIE1vdWV0dGUKLSMgTWFqb3IgbW9kaWZpY2F0aW9ucyBhcmU6Ci0jICAgICogbGluayBsaWJwbmcgZXhwbGljaXRseSB3aXRoIGxpYnogYW5kIGxpYm0KLSMgICAgKiAkKE9MRFNPKS4xNCBpcyBhIHN5bWxpbmsgcmF0aGVyIHRoYW4gYSBkaWZmZXJlbnQgbGlicmFyeQotIyAgICAqIHZlcnNpb25lZCBzeW1ib2xzCi0KLSMgTGlicmFyeSBuYW1lOgotTElCTkFNRSA9IGxpYnBuZzE0Ci1QTkdNQUogPSAxNAotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbwotTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKLUxJQlNPUkVMPSQoTElCU09NQUopLiQoUkVMRUFTRSkKLU9MRFNPPWxpYnBuZy5zbwotT0xEU09NQUo9bGlicG5nLnNvLjE0Ci0KLSMgVXRpbGl0aWVzOgotQVJfUkM9YXIgcmMKLUNDPWdjYwotTUtESVJfUD1ta2RpciAtcAotTE5fU0Y9bG4gLXNmCi1SQU5MSUI9cmFubGliCi1STV9GPS9iaW4vcm0gLWYKLQotIyB3aGVyZSAibWFrZSBpbnN0YWxsIiBwdXRzIGxpYnBuZzE0LmEsIGxpYnBuZzE0LnNvKiwKLSMgbGlicG5nMTQvcG5nLmggYW5kIGxpYnBuZzE0L3BuZ2NvbmYuaAotIyBQcmVmaXggbXVzdCBiZSBhIGZ1bGwgcGF0aG5hbWUuCi1wcmVmaXg9L3Vzci9sb2NhbAotZXhlY19wcmVmaXg9JChwcmVmaXgpCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZC4KLVpMSUJMSUI9L3Vzci9sb2NhbC9saWIKLVpMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCi0jIFpMSUJMSUI9Li4vemxpYgotIyBaTElCSU5DPS4uL3psaWIKLQotQUxJR049Ci0jIGZvciBpMzg2OgotI0FMSUdOPS1tYWxpZ24tbG9vcHM9MiAtbWFsaWduLWZ1bmN0aW9ucz0yCi0KLVdBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAotCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAotCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgotCi0jIGZvciBwZ2NjIHZlcnNpb24gMi45NS4xLCAtTzMgaXMgYnVnZ3k7IGRvbid0IHVzZSBpdC4KLQotQ0ZMQUdTPS1XIC1XYWxsIC1EX1JFRU5UUkFOVCAtTzIgXAotCSQoQUxJR04pICMgJChXQVJOTU9SRSkgLWcgLURQTkdfREVCVUc9NQotCi1MREZMQUdTPS1MLiAtbHBuZzE0Ci1MREZMQUdTX0E9bGlicG5nLmEgLWx6IC1sbQotTElCQURERkxBR1M9LWx6IC1sbQotCi0KLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCi1NQU5QQVRIPSQocHJlZml4KS9tYW4KLUJJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLURCPSQoREVTVERJUikkKEJJTlBBVEgpCi1EST0kKERFU1RESVIpJChJTkNQQVRIKQotREw9JChERVNURElSKSQoTElCUEFUSCkKLURNPSQoREVTVERJUikkKE1BTlBBVEgpCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCi0KLS5TVUZGSVhFUzogICAgICAuYyAubyAucGljLm8KLQotLmMucGljLm86Ci0JJChDQykgLWMgJChDRkxBR1MpIC1mUElDIC1vICRAICQqLmMKLQotYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IHBuZ3Rlc3Qtc3RhdGljIGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JJChBUl9SQykgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxNCEtbHBuZzE0XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLnN5bXM6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtRSAtRFBOR19CVUlMRFNZTVMgLURQTkdfSU5URVJOQUwgcG5nLmggfFwKLQlhd2sgLUYgJ1tcdCBbXFxdKCk7XScgLXYgUE5HTUFKPSQoUE5HTUFKKSAnQkVHSU57cHJpbnRmKCJQTkcxNF8lcyB7Z2xvYmFsOlxuIixQTkdNQUopfVwKLQl7IGZvciAoaT0xO2krMjw9TkY7KytpKVwKLQkJaWYgKCQkKGkpPT0iUE5HX0ZVTkNUSU9OX0VYUE9SVCIgJiYgJCQoaSsyKT09IkVORCIpXAotCQkJcHJpbnQgJCQoaSsxKSAiOyI7XAotCWZvciAoaT0xO2krMTw9TkY7KytpKVwKLQkJaWYgKCQkKGkpPT0iUE5HX0RBVEFfRVhQT1JUIilcCi0JCQlwcmludCAkJChpKzEpICI7Ijt9XAotCUVORHtwcmludCAibG9jYWw6ICo7IH07In0nID4kQC5uZXcKLQkkKFJNX0YpICRACi0JbXYgJEAubmV3ICRACi0KLWxpYnBuZy1jb25maWc6Ci0JKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKLQllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCi0JZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCi0JZWNobyBMX29wdHM9XCJcIjsgXAotCWVjaG8gUl9vcHRzPVwiXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzE0XCI7IFwKLQllY2hvIGFsbF9saWJzPVwiLWxwbmcxNCAkKExJQkFEREZMQUdTKVwiOyBcCi0JY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCi0JY2htb2QgK3ggbGlicG5nLWNvbmZpZwotCi0kKExJQlNPKTogJChMSUJTT01BSikKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQotCi0kKExJQlNPTUFKKTogJChPQkpTRExMKSBsaWJwbmcuc3ltcwotCSQoQ0MpIC1zaGFyZWQgLVdsLC1zb25hbWUsJChMSUJTT01BSikgXAotCS1XbCwtdmVyc2lvbi1zY3JpcHQsbGlicG5nLnN5bXMgXAotCS1vICQoTElCU09NQUopIFwKLQkkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXBuZ3Rlc3Qtc3RhdGljOiBwbmd0ZXN0Lm8gbGlicG5nLmEKLQkkKENDKSAtbyBwbmd0ZXN0LXN0YXRpYyAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHU19BKQotCi10ZXN0OiBwbmd0ZXN0IHBuZ3Rlc3Qtc3RhdGljCi0JQGVjaG8gIiIKLQlAZWNobyAiICAgUnVubmluZyBwbmd0ZXN0IGR5bmFtaWNhbGx5IGxpbmtlZCB3aXRoICQoTElCU08pOiIKLQlAZWNobyAiIgotCUxEX0xJQlJBUllfUEFUSD0iLjoke0xEX0xJQlJBUllfUEFUSH0iIC4vcG5ndGVzdAotCUBlY2hvICIiCi0JQGVjaG8gIiAgIFJ1bm5pbmcgcG5ndGVzdCBzdGF0aWNhbGx5IGxpbmtlZCB3aXRoIGxpYnBuZy5hOiIKLQlAZWNobyAiIgotCS4vcG5ndGVzdC1zdGF0aWMKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKLQotaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZwotCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAtSSQoREkpIC1JJChaTElCSU5DKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKERMKSAtTCQoWkxJQkxJQikgLVdsLCAtcnBhdGgsJChETCkgLVdsLC1ycGF0aCwkKFpMSUJMSUIpIFwKLQkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCi0JLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZwotCi10ZXN0LWluc3RhbGxlZDoKLQkkKENDKSAtSSQoWkxJQklOQykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIGxpYnBuZy5zeW1zIHBuZ3Rlc3QgcG5nb3V0LnBuZyBsaWJwbmctY29uZmlnIFwKLQkkKExJQlNPKSAkKExJQlNPTUFKKSogcG5ndGVzdC1zdGF0aWMgcG5ndGVzdGkgXAotCWxpYnBuZy5wYwotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vIHBuZy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3aW8ubyBwbmd3aW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ21lbS5vIHBuZ21lbS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdnZXQubyBwbmdnZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydXRpbC5vIHBuZ3J1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dHJhbi5vIHBuZ3d0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZnJlZWJzZCBiL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5mcmVlYnNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjY1MjIxLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5mcmVlYnNkCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nIHVuZGVyIEZyZWVCU0QKLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA3LCAyMDA5IEdsZW5uIFJhbmRlcnMtUGVocnNvbiBhbmQgQW5kcmV5IEEuIENoZXJub3YKLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi1QUkVGSVg/PSAgICAgICAgL3Vzci9sb2NhbAotU0hMSUJfVkVSPz0gICAgIDE0Ci0KLUxJQj0JCXBuZwotU0hMSUJfTUFKT1I9CSR7U0hMSUJfVkVSfQotU0hMSUJfTUlOT1I9CTAKLU5PUFJPRklMRT0JWUVTCi1OT09CSj0gICAgICAgICAgWUVTCi0KLSMgd2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEgYW5kIHBuZy5oCi1ERVNURElSPQkke1BSRUZJWH0KLUxJQkRJUj0JCS9saWIKLUlOQ1M9CQlwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1JTkNTRElSPQkvaW5jbHVkZS9saWJwbmcKLUlOQ0RJUj0JCSR7SU5DU0RJUn0JCSMgZm9yIDQueCBic2QubGliLm1rCi1NQU49CQlsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci1NQU5ESVI9CQkvbWFuL21hbgotU1lNTElOS1M9ICAgICAgIGxpYnBuZy9wbmcuaCAke0lOQ1NESVJ9Ly4uL3BuZy5oIFwKLQkJbGlicG5nL3BuZ2NvbmYuaCAke0lOQ1NESVJ9Ly4uL3BuZ2NvbmYuaAotCi1MREFERCs9ICAgICAgICAgLWxtIC1segotIyBMREFERCs9ICAgICAgICAgLWxtIC1seiAtbHNzcF9ub25zaGFyZWQgICAjIGZvciBPU1ZFUlNJT04gPj0gODAwMDAwID8KLQotRFBBREQrPSAgICAgICAgICR7TElCTX0gJHtMSUJafQotCi1DRkxBR1MrPSAtSS4KLQotU1JDUz0JcG5nLmMgcG5nc2V0LmMgcG5nZ2V0LmMgcG5ncnV0aWwuYyBwbmd0cmFucy5jIHBuZ3d1dGlsLmMgXAotCXBuZ3JlYWQuYyBwbmdyaW8uYyBwbmd3aW8uYyBwbmd3cml0ZS5jIHBuZ3J0cmFuLmMgXAotCXBuZ3d0cmFuLmMgcG5nbWVtLmMgcG5nZXJyb3IuYyBwbmdwcmVhZC5jCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQotCSR7Q0N9ICR7Q0ZMQUdTfSAtTC4gLXN0YXRpYyAtbyBwbmd0ZXN0IHBuZ3Rlc3QubyAtbHBuZyAtbHogLWxtCi0KLUNMRUFORklMRVM9IHBuZ3Rlc3QgcG5ndGVzdC5vIHBuZ291dC5wbmcKLQotdGVzdDogcG5ndGVzdAotCS4vcG5ndGVzdAotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0uaW5jbHVkZSA8YnNkLmxpYi5taz4KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5nY2MgYi9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZ2NjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzFhZGVlLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5nY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgdXNpbmcgZ2NjIChnZW5lcmljLCBzdGF0aWMgbGlicmFyeSkKLSMgQ29weXJpZ2h0IChDKSAyMDA4IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDIwMDAgQ29zbWluIFRydXRhCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIExvY2F0aW9uIG9mIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMKLVpMSUJJTkMgPSAuLi96bGliCi1aTElCTElCID0gLi4vemxpYgotCi0jIENvbXBpbGVyLCBsaW5rZXIsIGxpYiBhbmQgb3RoZXIgdG9vbHMKLUNDID0gZ2NjCi1MRCA9ICQoQ0MpCi1BUl9SQyA9IGFyIHJjcwotUkFOTElCID0gcmFubGliCi1STV9GID0gcm0gLWYKLQotQ0RFQlVHID0gLWcgLURQTkdfREVCVUc9NQotTERERUJVRyA9Ci1DUkVMRUFTRSA9IC1PMgotTERSRUxFQVNFID0gLXMKLSNDRkxBR1MgPSAtVyAtV2FsbCAkKENERUJVRykKLUNGTEFHUyA9IC1XIC1XYWxsICQoQ1JFTEVBU0UpCi0jTERGTEFHUyA9ICQoTERERUJVRykKLUxERkxBR1MgPSAkKExEUkVMRUFTRSkKLUxJQlMgPSAtbHogLWxtCi0KLSMgRmlsZSBleHRlbnNpb25zCi1PPS5vCi1BPS5hCi1FWEU9Ci0KLSMgVmFyaWFibGVzCi1PQkpTID0gIHBuZyQoTykgcG5nZXJyb3IkKE8pIHBuZ2dldCQoTykgcG5nbWVtJChPKSBwbmdwcmVhZCQoTykgXAotCXBuZ3JlYWQkKE8pIHBuZ3JpbyQoTykgcG5ncnRyYW4kKE8pIHBuZ3J1dGlsJChPKSBwbmdzZXQkKE8pIFwKLQlwbmd0cmFucyQoTykgcG5nd2lvJChPKSBwbmd3cml0ZSQoTykgcG5nd3RyYW4kKE8pIHBuZ3d1dGlsJChPKQotCi0jIFRhcmdldHMKLWFsbDogc3RhdGljCi0KLS5jJChPKToKLQkkKENDKSAtYyAkKENGTEFHUykgLUkkKFpMSUJJTkMpICQ8Ci0KLXN0YXRpYzogbGlicG5nJChBKSBwbmd0ZXN0JChFWEUpCi0KLXNoYXJlZDoKLQlAZWNobyBUaGlzIGlzIGEgZ2VuZXJpYyBtYWtlZmlsZSB0aGF0IGNhbm5vdCBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcy4KLQlAZWNobyBQbGVhc2UgdXNlIGEgY29uZmlndXJhdGlvbiB0aGF0IGlzIHNwZWNpZmljIHRvIHlvdXIgcGxhdGZvcm0uCi0JQGZhbHNlCi0KLWxpYnBuZyQoQSk6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLXRlc3Q6IHBuZ3Rlc3QkKEVYRSkKLQkuL3BuZ3Rlc3QkKEVYRSkKLQotcG5ndGVzdCQoRVhFKTogcG5ndGVzdCQoTykgbGlicG5nJChBKQotCSQoTEQpICQoTERGTEFHUykgLUwkKFpMSUJMSUIpIC1vICRAIHBuZ3Rlc3QkKE8pIGxpYnBuZyQoQSkgJChMSUJTKQotCi1jbGVhbjoKLQkkKFJNX0YpICokKE8pIGxpYnBuZyQoQSkgcG5ndGVzdCQoRVhFKSBwbmdvdXQucG5nCi0KLXBuZyQoTyk6ICAgICAgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZXJyb3IkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdnZXQkKE8pOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ21lbSQoTyk6ICAgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncHJlYWQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyZWFkJChPKTogIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3JpbyQoTyk6ICAgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnRyYW4kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3NldCQoTyk6ICAgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ndHJhbnMkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3aW8kKE8pOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3dyaXRlJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3RyYW4kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQotcG5ndGVzdCQoTyk6ICBwbmcuaCBwbmdjb25mLmgKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5ocDY0IGIvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmhwNjQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZWZlY2EuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmhwNjQKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nLCBIUFVYICgxMC4yMCBhbmQgMTEuMDApIHVzaW5nIHRoZSBBTlNJL0MgcHJvZHVjdC4KLSMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIsIDIwMDYsIDIwMDksIDIwMTAgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIKLSMgY29udHJpYnV0ZWQgYnkgSmltIFJpY2UgYW5kIHVwZGF0ZWQgYnkgQ2hyaXMgU2NobGVpY2hlciwgSGV3bGV0dCBQYWNrYXJkCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCi1aTElCTElCPS9vcHQvemxpYi9saWIKLVpMSUJJTkM9L29wdC96bGliL2luY2x1ZGUKLQotIyBOb3RlIHRoYXQgaWYgeW91IHBsYW4gdG8gYnVpbGQgYSBsaWJwbmcgc2hhcmVkIGxpYnJhcnksIHpsaWIgbXVzdCBhbHNvCi0jIGJlIGEgc2hhcmVkIGxpYnJhcnksIHdoaWNoIHpsaWIncyBjb25maWd1cmUgZG9lcyBub3QgZG8uICBBZnRlciBydW5uaW5nCi0jIHpsaWIncyBjb25maWd1cmUsIGVkaXQgdGhlIGFwcHJvcHJpYXRlIGxpbmVzIG9mIG1ha2VmaWxlIHRvIHJlYWQ6Ci0jICAgQ0ZMQUdTPS1PMSAtREhBVkVfVU5JU1REIC1EVVNFX01BUCAtZlBJQyBcCi0jICAgTERTSEFSRUQ9bGQgLWIKLSMgICBTSEFSRURMSUI9bGliei5zbAotCi0jIExpYnJhcnkgbmFtZToKLUxJQk5BTUUgPSBsaWJwbmcxNAotUE5HTUFKID0gMTQKLQotIyBTaGFyZWQgbGlicmFyeSBuYW1lczoKLUxJQlNPPSQoTElCTkFNRSkuc2wKLUxJQlNPTUFKPSQoTElCTkFNRSkuc2wuJChQTkdNQUopCi1MSUJTT1JFTD0kKExJQlNPTUFKKS4kKFJFTEVBU0UpCi1PTERTTz1saWJwbmcuc2wKLQotIyBVdGlsaXRpZXM6Ci1BUl9SQz1hciByYwotQ0M9Y2MKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1zZgotUkFOTElCPXJhbmxpYgotUk1fRj0vYmluL3JtIC1mCi0KLUNGTEFHUz0tSSQoWkxJQklOQykgLU8gLUFlIC1XbCwrdm5vY29tcGF0d2FybmluZ3MgK0RENjQgXAotLURfTEFSR0VGSUxFX1NPVVJDRSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0ICtaIC1ESEFWRV9VTklTVERfSCAtRFVTRV9NTUFQCi0jIENhdXRpb246IGJlIHN1cmUgeW91IGhhdmUgYnVpbHQgemxpYiB3aXRoIHRoZSBzYW1lIENGTEFHUy4KLUNDRkxBR1M9LUkkKFpMSUJJTkMpIC1PIC1BZSAtV2wsK3Zub2NvbXBhdHdhcm5pbmdzICtERDY0IFwKLS1EX0xBUkdFRklMRV9TT1VSQ0UgLURfRklMRV9PRkZTRVRfQklUUz02NCArWiAtREhBVkVfVU5JU1REX0ggLURVU0VfTU1BUAotCi1MREZMQUdTPS1MLiAtTCQoWkxJQkxJQikgLWxwbmcgLWx6IC1sbQotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hLCBsaWJwbmcxNC5zbCwgYW5kIHBuZy5oCi1wcmVmaXg9L29wdC9saWJwbmcKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1PQkpTRExMID0gJChPQkpTOi5vPS5waWMubykKLQotLlNVRkZJWEVTOgkuYyAubyAucGljLm8KLQotLmMucGljLm86Ci0JJChDQykgLWMgJChDRkxBR1MpICt6IC1vICRAICQqLmMKLQotYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JJChBUl9SQykgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxNCEtbHBuZzE0XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzoKLQkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIGNjb3B0cz1cIi1BZSArREExLjEgK0RTMi4wXCI7IFwKLQllY2hvIExfb3B0cz1cIi1MJChMSUJQQVRIKVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmcxNCAtbHogLWxtXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0KLSQoTElCU09NQUopOiAkKE9CSlNETEwpCi0JJChMRCkgLWIgK3MgXAotCStoICQoTElCU09NQUopIC1vICQoTElCU09NQUopICQoT0JKU0RMTCkKLQotcG5ndGVzdDogcG5ndGVzdC5vIGxpYnBuZy5hCi0JJChDQykgLW8gcG5ndGVzdCAkKENDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKLQotaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZwotCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAtSSQoREkpIC1JJChaTElCSU5DKSAkKENDRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KLQkkKENDKSAkKENDRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5ndGVzdGkgcG5nb3V0LnBuZyBcCi0JbGlicG5nLWNvbmZpZyAkKExJQlNPKSAkKExJQlNPTUFKKSogXAotCWxpYnBuZy5wYwotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdlcnJvci5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyaW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd2lvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ21lbS5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdzZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZ2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3JlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnV0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ndHJhbnMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3RyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3V0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmhwZ2NjIGIvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmhwZ2NjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTk3NmY2Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5ocGdjYworKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgb24gSFAtVVggdXNpbmcgR0NDIHdpdGggdGhlIEhQIEFOU0kvQyBsaW5rZXIuCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNi0yMDA4LCAyMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIExhdXJlbnQgZmFpbGxpZQotIyBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgR3JlZyBSb2Vsb2ZzCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgTGlicmFyeSBuYW1lOgotTElCTkFNRSA9IGxpYnBuZzE0Ci1QTkdNQUogPSAxNAotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbAotTElCU09NQUo9JChMSUJOQU1FKS5zbC4kKFBOR01BSikKLUxJQlNPUkVMPSQoTElCU09NQUopLiQoUkVMRUFTRSkKLU9MRFNPPWxpYnBuZy5zbAotCi0jIFV0aWxpdGllczoKLUNDPWdjYwotTEQ9bGQKLUFSX1JDPWFyIHJjCi1NS0RJUl9QPW1rZGlyIC1wCi1MTl9TRj1sbiAtc2YKLVJBTkxJQj1yYW5saWIKLVJNX0Y9L2Jpbi9ybSAtZgotCi0jIHdoZXJlICJtYWtlIGluc3RhbGwiIHB1dHMgbGlicG5nLmEsICQoT0xEU08pKiwgcG5nLmggYW5kIHBuZ2NvbmYuaAotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLVpMSUJMSUI9L29wdC96bGliL2xpYgotWkxJQklOQz0vb3B0L3psaWIvaW5jbHVkZQotCi0jIE5vdGUgdGhhdCBpZiB5b3UgcGxhbiB0byBidWlsZCBhIGxpYnBuZyBzaGFyZWQgbGlicmFyeSwgemxpYiBtdXN0IGFsc28KLSMgYmUgYSBzaGFyZWQgbGlicmFyeSwgd2hpY2ggemxpYidzIGNvbmZpZ3VyZSBkb2VzIG5vdCBkby4gIEFmdGVyIHJ1bm5pbmcKLSMgemxpYidzIGNvbmZpZ3VyZSwgZWRpdCB0aGUgYXBwcm9wcmlhdGUgbGluZXMgb2YgbWFrZWZpbGUgdG8gcmVhZDoKLSMgICBDRkxBR1M9LU8xIC1ESEFWRV9VTklTVEQgLURVU0VfTUFQIC1mUElDIFwKLSMgICBMRFNIQVJFRD1sZCAtYgotIyAgIFNIQVJFRExJQj1saWJ6LnNsCi0KLUFMSUdOPQotIyBmb3IgaTM4NjoKLSNBTElHTj0tbWFsaWduLWxvb3BzPTIgLW1hbGlnbi1mdW5jdGlvbnM9MgotCi1XQVJOTU9SRT0tV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1Xc2hhZG93IFwKLQktV21pc3NpbmctZGVjbGFyYXRpb25zIC1XdHJhZGl0aW9uYWwgLVdjYXN0LWFsaWduIFwKLQktV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzICMtV2NvbnZlcnNpb24KLQotIyBmb3IgcGdjYyB2ZXJzaW9uIDIuOTUuMSwgLU8zIGlzIGJ1Z2d5OyBkb24ndCB1c2UgaXQuCi0KLUNGTEFHUz0tSSQoWkxJQklOQykgLVcgLVdhbGwgLU8zIC1mdW5yb2xsLWxvb3BzIC1EUE5HX05PX01NWF9DT0RFIFwKLQkkKEFMSUdOKSAjICQoV0FSTk1PUkUpIC1nIC1EUE5HX0RFQlVHPTUKLSNMREZMQUdTPS1MLiAtV2wsLXJwYXRoLC4gLUwkKFpMSUJMSUIpIC1XbCwtcnBhdGgsJChaTElCTElCKSAtbHBuZzE0IC1seiAtbG0KLUxERkxBR1M9LUwuIC1MJChaTElCTElCKSAtbHBuZzE0IC1seiAtbG0KLQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1PQkpTRExMID0gJChPQkpTOi5vPS5waWMubykKLQotLlNVRkZJWEVTOiAgICAgIC5jIC5vIC5waWMubwotCi0uYy5waWMubzoKLQkkKENDKSAtYyAkKENGTEFHUykgLWZQSUMgLW8gJEAgJCouYwotCi1hbGw6IGxpYnBuZy5hICQoTElCU08pIHBuZ3Rlc3QgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLWxpYnBuZy5wYzoKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzE0IS1scG5nMTRcIC1selwgLWxtISA+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOgotCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gbGlicz1cIi1scG5nMTQgLWx6IC1sbVwiOyBcCi0JY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCi0JY2htb2QgK3ggbGlicG5nLWNvbmZpZwotCi0kKExJQlNPKTogJChMSUJTT01BSikKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQotCi0kKExJQlNPTUFKKTogJChPQkpTRExMKQotCSQoTEQpIC1iICtzIFwKLQkraCAkKExJQlNPTUFKKSAtbyAkKExJQlNPTUFKKSAkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotCi1pbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaAotCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKLQktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQotCWNwIHBuZy5oIHBuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQktQCQoUk1fRikgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKLQotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPTUFKKSBsaWJwbmcucGMKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09SRUwpCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JY3AgJChMSUJTT01BSikgJChETCkvJChMSUJTT1JFTCkKLQljaG1vZCA3NTUgJChETCkvJChMSUJTT1JFTCkKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKExJQlNPUkVMKSAkKExJQlNPKTsgXAotCSQoTE5fU0YpICQoTElCU08pICQoT0xEU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpIC1JJChESSkgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoREwpIC1XbCwtcnBhdGgsJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KLQkkKENDKSAtSSQoWkxJQklOQykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5ndGVzdGkgcG5nb3V0LnBuZyBcCi0JbGlicG5nLWNvbmZpZyAkKExJQlNPKSAkKExJQlNPTUFKKSogXAotCWxpYnBuZy5wYwotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vIHBuZy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3aW8ubyBwbmd3aW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ21lbS5vIHBuZ21lbS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdnZXQubyBwbmdnZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydXRpbC5vIHBuZ3J1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dHJhbi5vIHBuZ3d0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuaHB1eCBiL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5ocHV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjZhNjAwLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5ocHV4CisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZywgSFBVWCAoMTAuMjAgYW5kIDExLjAwKSB1c2luZyB0aGUgQU5TSS9DIHByb2R1Y3QuCi0jIENvcHlyaWdodCAoQykgMTk5OS0yMDAyLCAyMDA2LCAyMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDE5OTUgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyCi0jIGNvbnRyaWJ1dGVkIGJ5IEppbSBSaWNlIGFuZCB1cGRhdGVkIGJ5IENocmlzIFNjaGxlaWNoZXIsIEhld2xldHQgUGFja2FyZAotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotWkxJQkxJQj0vb3B0L3psaWIvbGliCi1aTElCSU5DPS9vcHQvemxpYi9pbmNsdWRlCi0KLSMgTm90ZSB0aGF0IGlmIHlvdSBwbGFuIHRvIGJ1aWxkIGEgbGlicG5nIHNoYXJlZCBsaWJyYXJ5LCB6bGliIG11c3QgYWxzbwotIyBiZSBhIHNoYXJlZCBsaWJyYXJ5LCB3aGljaCB6bGliJ3MgY29uZmlndXJlIGRvZXMgbm90IGRvLiAgQWZ0ZXIgcnVubmluZwotIyB6bGliJ3MgY29uZmlndXJlLCBlZGl0IHRoZSBhcHByb3ByaWF0ZSBsaW5lcyBvZiBtYWtlZmlsZSB0byByZWFkOgotIyAgIENGTEFHUz0tTzEgLURIQVZFX1VOSVNURCAtRFVTRV9NQVAgLWZQSUMgXAotIyAgIExEU0hBUkVEPWxkIC1iCi0jICAgU0hBUkVETElCPWxpYnouc2wKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FID0gbGlicG5nMTQKLVBOR01BSiA9IDE0Ci0KLSMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6Ci1MSUJTTz0kKExJQk5BTUUpLnNsCi1MSUJTT01BSj0kKExJQk5BTUUpLnNsLiQoUE5HTUFKKQotTElCU09SRUw9JChMSUJTT01BSikuJChSRUxFQVNFKQotT0xEU089bGlicG5nLnNsCi0KLSMgVXRpbGl0aWVzOgotQVJfUkM9YXIgcmMKLUNDPWNjCi1NS0RJUl9QPW1rZGlyIC1wCi1MTl9TRj1sbiAtc2YKLVJBTkxJQj1yYW5saWIKLVJNX0Y9L2Jpbi9ybSAtZgotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hLCBsaWJwbmcxNC5zbCwgYW5kIHBuZy5oCi1wcmVmaXg9L29wdC9saWJwbmcKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotQ0ZMQUdTPS1JJChaTElCSU5DKSAtTyAtQWUgK0RBMS4xICtEUzIuMAotIyBDYXV0aW9uOiBiZSBzdXJlIHlvdSBoYXZlIGJ1aWx0IHpsaWIgd2l0aCB0aGUgc2FtZSBDRkxBR1MuCi1DQ0ZMQUdTPS1JJChaTElCSU5DKSAtTyAtQWUgK0RBMS4xICtEUzIuMAotTERGTEFHUz0tTC4gLUwkKFpMSUJMSUIpIC1scG5nIC1seiAtbG0KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1PQkpTRExMID0gJChPQkpTOi5vPS5waWMubykKLQotLlNVRkZJWEVTOgkuYyAubyAucGljLm8KLQotLmMucGljLm86Ci0JJChDQykgLWMgJChDRkxBR1MpICt6IC1vICRAICQqLmMKLQotYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JJChBUl9SQykgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxNCEtbHBuZzE0XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzoKLQkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIGNjb3B0cz1cIi1BZSArREExLjEgK0RTMi4wXCI7IFwKLQllY2hvIExfb3B0cz1cIi1MJChMSUJQQVRIKVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmcxNCAtbHogLWxtXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0KLSQoTElCU09NQUopOiAkKE9CSlNETEwpCi0JJChMRCkgLWIgK3MgXAotCStoICQoTElCU09NQUopIC1vICQoTElCU09NQUopICQoT0JKU0RMTCkKLQotcG5ndGVzdDogcG5ndGVzdC5vIGxpYnBuZy5hCi0JJChDQykgLW8gcG5ndGVzdCAkKENDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKLQotaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZwotCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAtSSQoREkpIC1JJChaTElCSU5DKSAkKENDRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KLQkkKENDKSAkKENDRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5ndGVzdGkgcG5nb3V0LnBuZyBcCi0JbGlicG5nLWNvbmZpZyAkKExJQlNPKSAkKExJQlNPTUFKKSogXAotCWxpYnBuZy5wYwotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdlcnJvci5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyaW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd2lvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ21lbS5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdzZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZ2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3JlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnV0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ndHJhbnMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3RyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3V0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmlibWMgYi9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuaWJtYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiNDQ1YS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuaWJtYworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIGxpYnBuZyAoc3RhdGljKQotIyBJQk0gQyB2ZXJzaW9uIDMueCBmb3IgV2luMzIgYW5kIE9TLzIKLSMgQ29weXJpZ2h0IChDKSAyMDA2IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDIwMDAgQ29zbWluIFRydXRhCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSMKLSMgTm90ZXM6Ci0jICAgRGVyaXZlZCBmcm9tIG1ha2VmaWxlLnN0ZAotIyAgIEFsbCBtb2R1bGVzIGFyZSBjb21waWxlZCBpbiBDIG1vZGUKLSMgICBUZXN0ZWQgdW5kZXIgV2luMzIsIGV4cGVjdGVkIHRvIHdvcmsgdW5kZXIgT1MvMgotIyAgIENhbiBiZSBlYXNpbHkgYWRhcHRlZCBmb3IgSUJNIFZpc3VhbEFnZS9DKysgZm9yIEFJWAotCi0jIExvY2F0aW9uIG9mIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMKLVpMSUJJTkMgPSAuLi96bGliCi1aTElCTElCID0gLi4vemxpYgotCi0jIENvbXBpbGVyLCBsaW5rZXIsIGxpYiBhbmQgb3RoZXIgdG9vbHMKLUNDID0gaWNjCi1MRCA9IGlsaW5rCi1BUiA9IGlsaWIKLVJNID0gZGVsCi0KLUNGTEFHUyA9IC1JJChaTElCSU5DKSAtTWMgLU8yIC1XMwotTERGTEFHUyA9Ci0KLSMgRmlsZSBleHRlbnNpb25zCi1PPS5vYmoKLUE9LmxpYgotRT0uZXhlCi0KLSMgVmFyaWFibGVzCi1PQkpTID0gcG5nJChPKSBwbmdlcnJvciQoTykgcG5nZ2V0JChPKSBwbmdtZW0kKE8pIHBuZ3ByZWFkJChPKSBcCi0JcG5ncmVhZCQoTykgcG5ncmlvJChPKSBwbmdydHJhbiQoTykgcG5ncnV0aWwkKE8pIHBuZ3NldCQoTykgXAotCXBuZ3RyYW5zJChPKSBwbmd3aW8kKE8pIHBuZ3dyaXRlJChPKSBwbmd3dHJhbiQoTykgcG5nd3V0aWwkKE8pCi0KLUxJQlMgPSBsaWJwbmckKEEpICQoWkxJQkxJQikvemxpYiQoQSkKLQotIyBUYXJnZXRzCi1hbGw6IGxpYnBuZyQoQSkgcG5ndGVzdCQoRSkKLQotbGlicG5nJChBKTogJChPQkpTKQotCSQoQVIpIC1vdXQ6JEAgJChPQkpTKQotCi10ZXN0OiBwbmd0ZXN0JChFKQotCXBuZ3Rlc3QkKEUpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QkKEUpCi0KLXBuZ3Rlc3QkKEUpOiBwbmd0ZXN0JChPKSBsaWJwbmckKEEpCi0JJChMRCkgJChMREZMQUdTKSBwbmd0ZXN0JChPKSAkKExJQlMpCi0KLWNsZWFuOgotCSQoUk0pICokKE8pCi0JJChSTSkgbGlicG5nJChBKQotCSQoUk0pIHBuZ3Rlc3QkKEUpCi0JJChSTSkgcG5nb3V0LnBuZwotCi1wbmckKE8pOiAgICAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ2Vycm9yJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZ2V0JChPKTogICBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdtZW0kKE8pOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3ByZWFkJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncmVhZCQoTyk6ICBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyaW8kKE8pOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3J0cmFuJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnV0aWwkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdzZXQkKE8pOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3RyYW5zJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd2lvJChPKTogICBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3cml0ZSQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3d0cmFuJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3V0aWwkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0KLXBuZ3Rlc3QkKE8pOiAgcG5nLmggcG5nY29uZi5oCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuaW50ZWwgYi9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuaW50ZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNzA1ZTEuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmludGVsCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIGxpYnBuZwotIyBNaWNyb3NvZnQgVmlzdWFsIEMrKyB3aXRoIEludGVsIEMvQysrIENvbXBpbGVyIDQuMCBhbmQgbGF0ZXIKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDYgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMjAwMCwgUGF3ZWwgTXJvY2hlbiwgYmFzZWQgb24gbWFrZWZpbGUubXNjIHdoaWNoIGlzCi0jIGNvcHlyaWdodCAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0jCi0jIFRvIHVzZSwgZG8gIm5tYWtlIC9mIHNjcmlwdHNcbWFrZWZpbGUuaW50ZWwiCi0jCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0gSW50ZWwgQy9DKysgQ29tcGlsZXIgNC4wIGFuZCBsYXRlciAtLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotWkxJQkxJQj0uLlx6bGliCi1aTElCSU5DPS4uXHpsaWIKLQotIyBUYXJnZXQgQ1BVCi1DUFU9NgkJIyBQZW50aXVtIElJCi0jQ1BVPTUJCSMgUGVudGl1bQotCi0jIENhbGxpbmcgY29udmVudGlvbgotQ0FMTElORz1yCSMgX19mYXN0Y2FsbAotI0NBTExJTkc9egkjIF9fc3RkY2FsbAotI0NBTExJTkc9ZAkjIF9fY2RlY2wKLQotIyBVbmNvbW1lbnQgbmV4dCB0byBwdXQgZXJyb3IgbWVzc2FnZXMgaW4gYSBmaWxlCi0jRVJSRklMRT0+PnBuZ2VycnMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DQz1pY2wgLWMKLUNGTEFHUz0tTzIgLUckKENQVSkkKENBTExJTkcpIC1RaXAgLVF1bnJvbGw0IC1JJChaTElCSU5DKSAtbm9sb2dvCi1MRD1saW5rCi1MREZMQUdTPS9TVUJTWVNURU06Q09OU09MRSAvTk9MT0dPCi0KLU89Lm9iagotCi1PQkpTPXBuZyQoTykgcG5nc2V0JChPKSBwbmdnZXQkKE8pIHBuZ3J1dGlsJChPKSBwbmd0cmFucyQoTykgcG5nd3V0aWwkKE8pIFwKLXBuZ21lbSQoTykgcG5ncHJlYWQkKE8pIHBuZ3JlYWQkKE8pIHBuZ2Vycm9yJChPKSBwbmd3cml0ZSQoTykgXAotcG5ncnRyYW4kKE8pIHBuZ3d0cmFuJChPKSBwbmdyaW8kKE8pIHBuZ3dpbyQoTykKLQotYWxsOiB0ZXN0Ci0KLXBuZyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3NldCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ2dldCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3JlYWQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdwcmVhZCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3J0cmFuJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncnV0aWwkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdlcnJvciQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ21lbSQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3JpbyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3dpbyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3RyYW5zJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nd3JpdGUkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd3dHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3d1dGlsJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotbGlicG5nLmxpYjogJChPQkpTKQotCWlmIGV4aXN0IGxpYnBuZy5saWIgZGVsIGxpYnBuZy5saWIKLQlsaWIgL05PTE9HTyAvT1VUOmxpYnBuZy5saWIgJChPQkpTKQotCi1wbmd0ZXN0LmV4ZTogcG5ndGVzdC5vYmogbGlicG5nLmxpYgotCSQoTEQpICQoTERGTEFHUykgL09VVDpwbmd0ZXN0LmV4ZSBwbmd0ZXN0Lm9iaiBsaWJwbmcubGliICQoWkxJQkxJQilcemxpYi5saWIKLQotcG5ndGVzdCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotdGVzdDogcG5ndGVzdC5leGUKLQlwbmd0ZXN0LmV4ZQotCi0KLSMgRW5kIG9mIG1ha2VmaWxlIGZvciBsaWJwbmcKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5rbnIgYi9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUua25yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWNiMWI1Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5rbnIKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiwgMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0jCi0jIFRoaXMgbWFrZWZpbGUgcmVxdWlyZXMgdGhlIGZpbGUgYW5zaTJrbnIuYywgd2hpY2ggeW91IGNhbiBnZXQKLSMgZnJvbSB0aGUgR2hvc3RzY3JpcHQgZnRwIHNpdGUgYXQgZnRwOi8vZnRwLmNzLndpc2MuZWR1L2dob3N0LwotIyBJZiB5b3UgaGF2ZSBsaWJqcGVnLCB5b3UgcHJvYmFibHkgYWxyZWFkeSBoYXZlIGFuc2kya25yLmMgaW4gdGhlIGpwZWcKLSMgc291cmNlIGRpc3RyaWJ1dGlvbi4KLQotIyB3aGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSBhbmQgcG5nLmgKLXByZWZpeD0vdXNyL2xvY2FsCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQocHJlZml4KS9saWIKLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotQ0M9Y2MKLUNGTEFHUz0tSS4uL3psaWIgLU8KLUxERkxBR1M9LUwuIC1MLi4vemxpYi8gLWxwbmcgLWx6IC1sbQotIyBmbGFncyBmb3IgYW5zaTJrbnIKLUFOU0kyS05SRkxBR1M9Ci0KLVJBTkxJQj1yYW5saWIKLSNSQU5MSUI9ZWNobwotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLWFsbDogYW5zaTJrbnIgbGlicG5nLmEgcG5ndGVzdAotCi0jIGdlbmVyYWwgcnVsZSB0byBhbGxvdyBhbnNpMmtuciB0byB3b3JrCi0uYy5vOgotCS4vYW5zaTJrbnIgJCouYyBUJCouYwotCSQoQ0MpICQoQ0ZMQUdTKSAtYyBUJCouYwotCXJtIC1mIFQkKi5jICQqLm8KLQltdiBUJCoubyAkKi5vCi0KLWFuc2kya25yOiBhbnNpMmtuci5jCi0JJChDQykgJChDRkxBR1MpICQoQU5TSTJLTlJGTEFHUykgLW8gYW5zaTJrbnIgYW5zaTJrbnIuYwotCi1saWJwbmcuYTogYW5zaTJrbnIgJChPQkpTKQotCWFyIHJjICRAICAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbDogbGlicG5nLmEgcG5nLmggcG5nY29uZi5oCi0JLUBta2RpciAkKERFU1RESVIpJChJTkNQQVRIKQotCS1AbWtkaXIgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCi0JLUBta2RpciAkKERFU1RESVIpJChMSUJQQVRIKQotCS1Acm0gLWYgJChERVNURElSKSQoSU5DUEFUSCkvcG5nLmgKLQktQHJtIC1mICQoREVTVERJUikkKElOQ1BBVEgpL3BuZ2NvbmYuaAotCWNwIHBuZy5oICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZwotCWNwIHBuZ2NvbmYuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKLQljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZy5oCi0JY2htb2QgNjQ0ICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZy9wbmdjb25mLmgKLQkoY2QgJChERVNURElSKSQoSU5DUEFUSCk7IGxuIC1mIC1zIGxpYnBuZy8qIC4pCi0JY3AgbGlicG5nLmEgJChERVNURElSKSQoTElCUEFUSCkKLQljaG1vZCA2NDQgJChERVNURElSKSQoTElCUEFUSCkvbGlicG5nLmEKLQotY2xlYW46Ci0Jcm0gLWYgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZyBhbnNpMmtucgotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdlcnJvci5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyaW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd2lvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ21lbS5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdzZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZ2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3JlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnV0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ndHJhbnMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3RyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3V0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmxpbnV4IGIvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmxpbnV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWMyY2E1Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5saW51eAorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcuYSBhbmQgbGlicG5nMTQuc28gb24gTGludXggRUxGIHdpdGggZ2NjCi0jIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMiwgMjAwNiwgMjAwOCwgMjAxMCBHcmVnIFJvZWxvZnMgYW5kCi0jIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIExpYnJhcnkgbmFtZToKLUxJQk5BTUUgPSBsaWJwbmcxNAotUE5HTUFKID0gMTQKLVJFTEVBU0UgPSAxMgotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbwotTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKLUxJQlNPUkVMPSQoTElCU09NQUopLiQoUkVMRUFTRSkKLU9MRFNPPWxpYnBuZy5zbwotCi0jIFV0aWxpdGllczoKLUFSX1JDPWFyIHJjCi1DQz1nY2MKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1zZgotUkFOTElCPXJhbmxpYgotUk1fRj0vYmluL3JtIC1mCi0KLSMgd2hlcmUgIm1ha2UgaW5zdGFsbCIgcHV0cyBsaWJwbmcxNC5hLCBsaWJwbmcxNC5zbyosCi0jIGxpYnBuZzE0L3BuZy5oIGFuZCBsaWJwbmcxNC9wbmdjb25mLmgKLSMgUHJlZml4IG11c3QgYmUgYSBmdWxsIHBhdGhuYW1lLgotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQuCi0jWkxJQkxJQj0vdXNyL2xvY2FsL2xpYgotI1pMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCi1aTElCTElCPS4uL3psaWIKLVpMSUJJTkM9Li4vemxpYgotCi1BTElHTj0KLSMgZm9yIGkzODY6Ci0jQUxJR049LW1hbGlnbi1sb29wcz0yIC1tYWxpZ24tZnVuY3Rpb25zPTIKLQotV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyBcCi0JLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCi0JLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAjLVdjb252ZXJzaW9uCi0KLSMgZm9yIHBnY2MgdmVyc2lvbiAyLjk1LjEsIC1PMyBpcyBidWdneTsgZG9uJ3QgdXNlIGl0LgotCi1DRkxBR1M9LUkkKFpMSUJJTkMpIC1XIC1XYWxsIC1PMyAtZnVucm9sbC1sb29wcyBcCi0JJChBTElHTikgIyAkKFdBUk5NT1JFKSAtZyAtRFBOR19ERUJVRz01Ci0KLUxERkxBR1M9LUwuIC1XbCwtcnBhdGgsLiAtTCQoWkxJQkxJQikgLVdsLC1ycGF0aCwkKFpMSUJMSUIpIC1scG5nMTQgLWx6IC1sbQotTERGTEFHU19BPS1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgbGlicG5nLmEgLWx6IC1sbQotCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgotTUFOUEFUSD0kKHByZWZpeCkvbWFuCi1CSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi1EQj0kKERFU1RESVIpJChCSU5QQVRIKQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi1ETT0kKERFU1RESVIpJChNQU5QQVRIKQotCi1PQkpTID0gIHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1PQkpTRExMID0gJChPQkpTOi5vPS5waWMubykKLQotLlNVRkZJWEVTOiAgICAgIC5jIC5vIC5waWMubwotCi0uYy5waWMubzoKLQkkKENDKSAtYyAkKENGTEFHUykgLWZQSUMgLW8gJEAgJCouYwotCi1hbGw6IGxpYnBuZy5hICQoTElCU08pIHBuZ3Rlc3QgcG5ndGVzdC1zdGF0aWMgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLWxpYnBuZy5wYzoKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzE0IS1scG5nMTRcIC1selwgLWxtISA+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOgotCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIFJfb3B0cz1cIi1XbCwtcnBhdGgsJChMSUJQQVRIKVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmcxNCAtbHogLWxtXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0KLSQoTElCU09NQUopOiAkKE9CSlNETEwpCi0JJChDQykgLXNoYXJlZCAtV2wsLXNvbmFtZSwkKExJQlNPTUFKKSAtbyAkKExJQlNPTUFKKSAkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXBuZ3Rlc3Qtc3RhdGljOiBwbmd0ZXN0Lm8gbGlicG5nLmEKLQkkKENDKSAtbyBwbmd0ZXN0LXN0YXRpYyAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHU19BKQotCi10ZXN0OiBwbmd0ZXN0IHBuZ3Rlc3Qtc3RhdGljCi0JQGVjaG8gIiIKLQlAZWNobyAiICAgUnVubmluZyBwbmd0ZXN0IGR5bmFtaWNhbGx5IGxpbmtlZCB3aXRoICQoTElCU08pOiIKLQlAZWNobyAiIgotCS4vcG5ndGVzdAotCUBlY2hvICIiCi0JQGVjaG8gIiAgIFJ1bm5pbmcgcG5ndGVzdCBzdGF0aWNhbGx5IGxpbmtlZCB3aXRoIGxpYnBuZy5hOiIKLQlAZWNobyAiIgotCS4vcG5ndGVzdC1zdGF0aWMKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKLQotaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKLQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpIC1JJChESSkgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSAtV2wsIC1ycGF0aCwkKERMKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RkIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RkIHBuZ3Rlc3QucG5nCi0KLXRlc3QtaW5zdGFsbGVkOgotCSQoQ0MpIC1JJChaTElCSU5DKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKFpMSUJMSUIpIC1XbCwtcnBhdGgsJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmdvdXQucG5nIGxpYnBuZy1jb25maWcgXAotCSQoTElCU08pICQoTElCU09NQUopKiBwbmd0ZXN0LXN0YXRpYyBwbmd0ZXN0aSBcCi0JbGlicG5nLnBjCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm8gcG5nLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyaW8ubyBwbmdyaW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3dpby5vIHBuZ3dpby5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nbWVtLm8gcG5nbWVtLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdzZXQubyBwbmdzZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ2dldC5vIHBuZ2dldC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncmVhZC5vIHBuZ3JlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3J0cmFuLm8gcG5ncnRyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3J1dGlsLm8gcG5ncnV0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3dyaXRlLm8gcG5nd3JpdGUucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3d0cmFuLm8gcG5nd3RyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3ByZWFkLm8gcG5ncHJlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQotcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmgKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5taW5ndyBiL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5taW5ndwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjMDEzZC4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUubWluZ3cKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbWluZ3cgb24geDg2Ci0jICAgQnVpbGRzIGJvdGggZGxsICh3aXRoIGltcG9ydCBsaWIpIGFuZCBzdGF0aWMgbGliIHZlcnNpb25zCi0jICAgb2YgdGhlIGxpYnJhcnksIGFuZCBidWlsZHMgdHdvIGNvcGllcyBvZiBwbmd0ZXN0OiBvbmUKLSMgICBzdGF0aWNhbGx5IGxpbmtlZCBhbmQgb25lIGR5bmFtaWNhbGx5IGxpbmtlZC4KLSMKLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2LCAyMDA4IFNvcmVuIEFuZGVyc29uLCBDaGFybGVzIFdpbHNvbiwKLSMgICAgYW5kIEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYmFzZWQgb24gbWFrZWZpbGUgZm9yIGxpbnV4LWVsZiB3L21teCBieToKLSMgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAsIDIwMDcgR3JlZyBSb2Vsb2ZzCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgQnVpbHQgZnJvbSBtYWtlZmlsZS5jeWd3aW4KLQotIyBUaGlzIG1ha2VmaWxlIGV4cGVjdHMgdG8gYmUgcnVuIHVuZGVyIHRoZSBNU1lTIHNoZWxsIChwYXJ0IG9mCi0jIHRoZSBNSU5HVyBwcm9qZWN0KSBhbmQgbm90IHVuZGVyIENNRC5FWEUgd2hpY2ggZG9lcyBub3QgcHJvdmlkZQotIyAiY2F0IiBvciAic2VkIi4KLQotIyBUaGlzIG1ha2VmaWxlIGludGVuZHMgdG8gc3VwcG9ydCBidWlsZGluZyBvdXRzaWRlIHRoZSBzcmMgZGlyZWN0b3J5Ci0jIGlmIGRlc2lyZWQuIFdoZW4gaW52b2tpbmcgaXQsIHNwZWNpZnkgYW4gYXJndW1lbnQgdG8gU1JDRElSIG9uIHRoZQotIyBjb21tYW5kIGxpbmUgdGhhdCBwb2ludHMgdG8gdGhlIHRvcCBvZiB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdXIgc291cmNlCi0jIGlzIGxvY2F0ZWQuCi1pZmRlZiBTUkNESVIKLVZQQVRIID0gJChTUkNESVIpCi1lbHNlCi1TUkNESVIgPSAuCi1lbmRpZgotCi0jIE92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi0jIElmIHlvdSdyZSB1c2luZyBhIGNyb3NzLWNvbXBpbGVyLCBhZGQgdGhlIGFwcHJvcHJpYXRlIHByZWZpeCAoZS5nLiwKLSMgImkzODYtbWluZ3czMm1zdmMtIikgdG8gdGhlIGZvbGxvd2luZyB0aHJlZSBjb21tYW5kczoKLUNDPWdjYwotQVI9YXIKLVJBTkxJQj1yYW5saWIKLQotTUtESVJfUD0vYmluL21rZGlyIC1wdgotCi0jIFdoZXJlICJtYWtlIGluc3RhbGwiIHB1dHMgbGlicG5nKi5hLCAqcG5nKi5kbGwsIHBuZy5oLCBhbmQgcG5nY29uZi5oCi1pZm5kZWYgcHJlZml4Ci1wcmVmaXg9L3VzcgotJCh3YXJuaW5nICJZb3UgaGF2ZW4ndCBzcGVjaWZpZWQgYSAncHJlZml4PScgbG9jYXRpb24uIERlZmF1bHRpbmcgdG8gJy91c3InIikKLWVuZGlmCi1leGVjX3ByZWZpeD0kKHByZWZpeCkKLQotIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCi1aTElCTElCPSAvdXNyL2xpYgotWkxJQklOQz0KLQotQUxJR049Ci0jIGZvciBpMzg2OgotI0FMSUdOPS1tYWxpZ24tbG9vcHM9MiAtbWFsaWduLWZ1bmN0aW9ucz0yCi0KLVdBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAotCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAotCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgotCi1DRkxBR1M9ICQoc3RyaXAgJChNSU5HV19DQ0ZMQUdTKSAkKGFkZHByZWZpeCAtSSwkKFpMSUJJTkMpKSBcCi0gICAgICAgIC1XIC1XYWxsIC1PMyAkKEFMSUdOKSAtZnVucm9sbC1sb29wcyBcCi0JLWZvbWl0LWZyYW1lLXBvaW50ZXIpICMgJChXQVJOTU9SRSkgLWcgLURQTkdfREVCVUc9NQotCi1MSUJOQU1FID0gbGlicG5nMTQKLVBOR01BSiA9IDE0Ci1NSU5HRExMID0gMTQKLQotU0hBUkVETElCPWxpYnBuZyQoTUlOR0RMTCkuZGxsCi1TVEFUTElCPWxpYnBuZy5hCi1JTVBMSUI9bGlicG5nLmRsbC5hCi1TSEFSRURERUY9bGlicG5nLmRlZgotTElCUz0kKFNIQVJFRExJQikgJChTVEFUTElCKQotRVhFPS5leGUKLQotTERGTEFHUz0kKHN0cmlwIC1MLiAkKE1JTkdXX0xERkxBR1MpIC1scG5nICQoYWRkcHJlZml4IC1MLCQoWkxJQkxJQikpIC1seikKLUxEU0ZMQUdTPSQoc3RyaXAgLXNoYXJlZCAtTC4gICQoTUlOR1dfTERGTEFHUykpCi1MREVYVFJBPS1XbCwtLW91dC1pbXBsaWI9JChJTVBMSUIpICQoYWRkcHJlZml4IC1MLCQoWkxJQkxJQikpIC1segotCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgotCi1CSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgotTUFOUEFUSD0kKHByZWZpeCkvbWFuCi1NQU4zUEFUSD0kKE1BTlBBVEgpL21hbjMKLU1BTjVQQVRIPSQoTUFOUEFUSCkvbWFuNQotCi0jIGNvc21ldGljOiBzaG9ydGVuZWQgc3RyaW5nczoKLVMgPSQoU1JDRElSKQotRCA9JChERVNURElSKQotREIgPSQoRCkkKEJJTlBBVEgpCi1ESSA9JChEKSQoSU5DUEFUSCkKLURMID0kKEQpJChMSUJQQVRIKQotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLU9CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQotCi0uU1VGRklYRVM6IC5jIC5vIC5waWMubwotCi0lLm8gOiAlLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgJDwKLSUucGljLm8gOiBDRkxBR1MgKz0gLURQTkdfQlVJTERfRExMCi0lLnBpYy5vIDogJS5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLWFsbDogYWxsLXN0YXRpYyBhbGwtc2hhcmVkIGxpYnBuZy5wYyBsaWJwbmctY29uZmlnIGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLSMgTWFrZSB0aGlzIHRvIHZlcmlmeSB0aGF0ICJtYWtlIFsuLi5dIGluc3RhbGwiIHdpbGwgZG8gd2hhdCB5b3Ugd2FudC4KLWJ1aWxkc2V0dXAtdGVsbDoKLQlAZWNobyAgVlBBVEggaXMgc2V0IHRvOiBcIiQoVlBBVEgpXCIKLQlAZWNobyAgcHJlZml4IGlzIHNldCB0bzogXCIkKHByZWZpeClcIgotCUBlY2hvIC1lIElOQ1BBVEgsTElCUEFUSCwgZXRjLiBhcmUgc2V0IHRvOidcbicgXAotICQoYWRkcHJlZml4ICQoRCksJChJTkNQQVRIKSdcbicgJChMSUJQQVRIKSdcbicgJChCSU5QQVRIKSdcbicgXAotICAgJChNQU5QQVRIKSdcbicgJChNQU4zUEFUSCknXG4nICQoTUFONVBBVEgpJ1xuJyknXG4nCi0KLWxpYnBuZy5wYzogc2NyaXB0cy9saWJwbmcucGMuaW4KLQlAZWNobyAtZSBNYWtpbmcgcGtnLWNvbmZpZyBmaWxlIGZvciB0aGlzIGxpYnBuZyBpbnN0YWxsYXRpb24uLidcbicgXAotICAgICAgICAgICB1c2luZyBQUkVGSVg9XCIkKHByZWZpeClcIidcbicKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxNCEtbHBuZzE0XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzogc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW4gc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4KLQlAZWNobyAtZSBNYWtpbmcgJChMSUJOQU1FKSBsaWJwbmctY29uZmlnIGZpbGUgZm9yIHRoaXMgbGlicG5nIFwKLSBpbnN0YWxsYXRpb24uLidcbicgdXNpbmcgUFJFRklYPVwiJChwcmVmaXgpXCInXG4nCi0JKCBjYXQgJChTKS9zY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIExfb3B0cz1cIi1MJChMSUJQQVRIKVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmckKE1JTkdETEwpIC1selwiOyBcCi0JY2F0ICQoUykvc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLXN0YXRpYzogYWxsLXN0YXRpYwotc2hhcmVkOiBhbGwtc2hhcmVkCi1hbGwtc3RhdGljOiAkKFNUQVRMSUIpIHBuZ3Rlc3Qtc3RhdCQoRVhFKQotYWxsLXNoYXJlZDogJChTSEFSRURMSUIpIHBuZ3Rlc3QkKEVYRSkKLQotJChTVEFUTElCKTogJChPQkpTKQotCSQoQVIpIHJjICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotJChTSEFSRURERUYpOiBzY3JpcHRzL3BuZ3dpbi5kZWYKLQljYXQgJDwgfCBzZWQgLWUgJzF7RztzL15cKC4qXClcKFxuXCkvRVhQT1JUUy87fTsyLC9eRVhQT1JUUy9kJyB8IFwKLQlzZWQgLWUgJ3MvXChbXjtdKlwpOy87LycgPiAkQAotCi0kKFNIQVJFRExJQik6ICQoT0JKU0RMTCkgJChTSEFSRURERUYpCi0JJChDQykgJChMRFNGTEFHUykgLW8gJEAgJChPQkpTRExMKSAtTC4gJChMREVYVFJBKQotCi1wbmd0ZXN0JChFWEUpOiBwbmd0ZXN0LnBpYy5vICQoU0hBUkVETElCKQotCSQoQ0MpICQoQ0ZMQUdTKSAkPCAkKExERkxBR1MpIC1vICRACi0KLXBuZ3Rlc3Qtc3RhdCQoRVhFKTogcG5ndGVzdC5vICQoU1RBVExJQikKLQkkKENDKSAtc3RhdGljICQoQ0ZMQUdTKSAkPCAkKExERkxBR1MpIC1vICRACi0KLXRlc3Q6IHRlc3Qtc3RhdGljIHRlc3Qtc2hhcmVkCi0KLXRlc3Qtc3RhdGljOiBwbmd0ZXN0LXN0YXQkKEVYRSkKLQkuL3BuZ3Rlc3Qtc3RhdCAkKFMpL3BuZ3Rlc3QucG5nCi0KLXRlc3Qtc2hhcmVkOiBwbmd0ZXN0JChFWEUpCi0JLi9wbmd0ZXN0ICQoUykvcG5ndGVzdC5wbmcKLQotaW5zdGFsbC1zdGF0aWM6ICQoU1RBVExJQikgaW5zdGFsbC1oZWFkZXJzIGluc3RhbGwtbWFuCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWluc3RhbGwgLW0gNjQ0ICQoU1RBVExJQikgJChETCkvJChMSUJOQU1FKS5hCi0JLUBybSAtZiAkKERMKS8kKFNUQVRMSUIpCi0JKGNkICQoREwpOyBsbiAtc2YgJChMSUJOQU1FKS5hICQoU1RBVExJQikpCi0KLWluc3RhbGwtc2hhcmVkOiAkKFNIQVJFRExJQikgbGlicG5nLnBjIGxpYnBuZy1jb25maWcgaW5zdGFsbC1oZWFkZXJzIGluc3RhbGwtbWFuCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQC9iaW4vcm0gLWYgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQC9iaW4vcm0gLWYgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWluc3RhbGwgLW0gNjQ0ICQoSU1QTElCKSAkKERMKS8kKExJQk5BTUUpLmRsbC5hCi0JLUBybSAtZiAkKERMKS8kKElNUExJQikKLQkoY2QgJChETCk7IGxuIC1zZiAkKExJQk5BTUUpLmRsbC5hICQoSU1QTElCKSkKLQlpbnN0YWxsIC1zIC1tIDc1NSAkKFNIQVJFRExJQikgJChEQikKLQlpbnN0YWxsIC1tIDY0NCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQkoY2QgJChETCkvcGtnY29uZmlnOyBsbiAtc2YgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtaGVhZGVyczoKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQktQHJtIC1mICQoREkpL3BuZy5oCi0JLUBybSAtZiAkKERJKS9wbmdjb25mLmgKLQlpbnN0YWxsIC1tIDY0NCAkKFMpL3BuZy5oICQoUykvcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQktQHJtIC1mICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgbG4gLXNmICQoTElCTkFNRSkgbGlicG5nOyBsbiAtc2YgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtbWFuOgotCS1AaWYgWyAhIC1kICQoRCkkKE1BTjNQQVRIKSBdOyB0aGVuICQoTUtESVJfUCkgJChEKSQoTUFOM1BBVEgpOyBmaQotCS1AaWYgWyAhIC1kICQoRCkkKE1BTjVQQVRIKSBdOyB0aGVuICQoTUtESVJfUCkgJChEKSQoTUFONVBBVEgpOyBmaQotCWluc3RhbGwgLW0gNjQ0ICQoUykvbGlicG5ncGYuMyAkKFMpL2xpYnBuZy4zICQoRCkkKE1BTjNQQVRIKQotCWluc3RhbGwgLW0gNjQ0ICQoUykvcG5nLjUgJChEKSQoTUFONVBBVEgpCi0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AL2Jpbi9ybSAtZiAkKERCKS9saWJwbmctY29uZmlnCi0JLUAvYmluL3JtIC1mICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgbG4gLXNmICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLSMgUnVuIHRoaXMgdG8gdmVyaWZ5IHRoYXQgYSBmdXR1cmUgYGNvbmZpZ3VyZScgcnVuIHdpbGwgcGljayB1cCB0aGUgc2V0dGluZ3MKLSMgeW91IHdhbnQuCi10ZXN0LWNvbmZpZy1pbnN0YWxsOiBTSEVMTD0vYmluL2Jhc2gKLXRlc3QtY29uZmlnLWluc3RhbGw6ICQoREIpL2xpYnBuZy1jb25maWcKLQlAZWNobyAtZSBUZXN0aW5nIGxpYnBuZy1jb25maWcgZnVuY3Rpb25zLi4uJ1xuJwotCUAgZm9yIFRZUkEgaW4gTERGTEFHUyBDUFBGTEFHUyBDRkxBR1MgTElCUyBWRVJTSU9OOyBcCi0gICBkbyBcCi0gICAgcHJpbnRmICIoJWQpXHQgJTEwcyA9JXNcbiIgJCQoKCQkZ3l0aXUgKyAxKSkgJCRUWVJBIFwKLSAgICAiJCQoJChEQikvbGlicG5nLWNvbmZpZyBgZWNobyAtLSQkVFlSQSB8dHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XSdgKSI7IFwKLSAgICBneXRpdT0kJCgoICQkZ3l0aXUgKyAxICkpOyBcCi0gICBkb25lCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAtSSQoREkpICQoQ0ZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvbGlicG5nMTQtY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIFwKLQkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS9saWJwbmcxNC1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JJChDQykgJChDRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS9saWJwbmcxNC1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKFpMSUJMSUIpIFwKLQkgICAtbyBwbmd0ZXN0aSQoRVhFKSBgJChCSU5QQVRIKS9saWJwbmcxNC1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGkkKEVYRSkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JL2Jpbi9ybSAtZiAqLnBpYy5vICoubyAkKFNUQVRMSUIpICQoSU1QTElCKSAkKFNIQVJFRExJQikgXAotCSAgIHBuZ3Rlc3Qtc3RhdCQoRVhFKSBwbmd0ZXN0JChFWEUpIHBuZ291dC5wbmcgJChTSEFSRURERUYpIFwKLQkgICBsaWJwbmctY29uZmlnIGxpYnBuZy5wYyBwbmd0ZXN0aSQoRVhFKQotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0uUEhPTlk6IGJ1aWxkc2V0dXAtdGVsbCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZyB0ZXN0LWNvbmZpZy1pbnN0YWxsIGNsZWFuCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm8gcG5nLnBpYy5vOgkJcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaCBwbmcuYwotcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaCBwbmdlcnJvci5jCi1wbmdyaW8ubyBwbmdyaW8ucGljLm86CQlwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oIHBuZ3Jpby5jCi1wbmd3aW8ubyBwbmd3aW8ucGljLm86CQlwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oIHBuZ3dpby5jCi1wbmdtZW0ubyBwbmdtZW0ucGljLm86CQlwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oIHBuZ21lbS5jCi1wbmdzZXQubyBwbmdzZXQucGljLm86CQlwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oIHBuZ3NldC5jCi1wbmdnZXQubyBwbmdnZXQucGljLm86CQlwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oIHBuZ2dldC5jCi1wbmdyZWFkLm8gcG5ncmVhZC5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaCBwbmdyZWFkLmMKLXBuZ3J0cmFuLm8gcG5ncnRyYW4ucGljLm86CXBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmggcG5ncnRyYW4uYwotcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaCBwbmdydXRpbC5jCi1wbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oIHBuZ3RyYW5zLmMKLXBuZ3dyaXRlLm8gcG5nd3JpdGUucGljLm86CXBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmggcG5nd3JpdGUuYwotcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaCBwbmd3dHJhbi5jCi1wbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oIHBuZ3d1dGlsLmMKLXBuZ3ByZWFkLm8gcG5ncHJlYWQucGljLm86CXBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmggcG5ncHJlYWQuYwotCi1wbmd0ZXN0Lm8gcG5ndGVzdC5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3Rlc3QuYwpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm1pcHMgYi9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUubWlwcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUxMDQwZS4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUubWlwcworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZwotIyBDb3B5cmlnaHQgKEMpIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDE5OTUgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyB3aGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSBhbmQgcG5nLmgKLXByZWZpeD0vdXNyL2xvY2FsCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQocHJlZml4KS9saWIKLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotQ0M9Y2MKLUNGTEFHUz0tSS4uL3psaWIgLU8gLXN5c3R5cGUgc3lzdiAtRFNZU1YgLXcgLURtaXBzCi0jQ0ZMQUdTPS1PCi1MREZMQUdTPS1MLiAtTC4uL3psaWIvIC1scG5nIC1seiAtbG0KLQotI1JBTkxJQj1yYW5saWIKLVJBTkxJQj1lY2hvCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotYWxsOiBsaWJwbmcuYSBwbmd0ZXN0Ci0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JYXIgcmMgJEAgICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotcG5ndGVzdDogcG5ndGVzdC5vIGxpYnBuZy5hCi0JJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKLQotdGVzdDogcG5ndGVzdAotCS4vcG5ndGVzdAotCi1pbnN0YWxsOiBsaWJwbmcuYQotCS1AbWtkaXIgJChERVNURElSKSQoSU5DUEFUSCkKLQktQG1rZGlyICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZwotCS1AbWtkaXIgJChERVNURElSKSQoTElCUEFUSCkKLQktQHJtIC1mICQoREVTVERJUikkKElOQ1BBVEgpL3BuZy5oCi0JLUBybSAtZiAkKERFU1RESVIpJChJTkNQQVRIKS9wbmdjb25mLmgKLQljcCBwbmcuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKLQljcCBwbmdjb25mLmggJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCi0JY2htb2QgNjQ0ICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZy9wbmcuaAotCWNobW9kIDY0NCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcvcG5nY29uZi5oCi0JKGNkICQoREVTVERJUikkKElOQ1BBVEgpOyBsbiAtZiAtcyBsaWJwbmcvKiAuKQotCWNwIGxpYnBuZy5hICQoREVTVERJUikkKExJQlBBVEgpCi0JY2htb2QgNjQ0ICQoREVTVERJUikkKExJQlBBVEgpL2xpYnBuZy5hCi0KLWNsZWFuOgotCXJtIC1mICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ291dC5wbmcKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZXJyb3IubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncmlvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3dpby5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdtZW0ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nc2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ2dldC5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3ByZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3J0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3J1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3RyYW5zLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3dyaXRlLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3d0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3d1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQotcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmgKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5tc2MgYi9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUubXNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQ0NjQ0Li4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5tc2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcKLSMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotIyBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSMKLSMgQXNzdW1lcyB0aGF0IHpsaWIubGliLCB6Y29uZi5oLCBhbmQgemxpYi5oIGhhdmUgYmVlbiBjb3BpZWQgdG8gLi5cemxpYgotCi0jIC0tLS0tLS0tIE1pY3Jvc29mdCBDIDUuMSBhbmQgbGF0ZXIsIGRvZXMgbm90IHVzZSBhc3NlbWJsZXIgY29kZSAtLS0tLS0tLQotTU9ERUw9TAotQ0ZMQUdTPS1PYWl0IC1HcyAtbm9sb2dvIC1XMyAtQSQoTU9ERUwpIC1JLi5cemxpYgotIy1PeCBnZW5lcmF0ZXMgYmFkIGNvZGUgd2l0aCBNU0MgNS4xCi1DQz1jbAotTEQ9bGluawotTERGTEFHUz0vZS9zdDoweDE1MDAvbm9lCi1PPS5vYmoKLQotI3VuY29tbWVudCBuZXh0IHRvIHB1dCBlcnJvciBtZXNzYWdlcyBpbiBhIGZpbGUKLUVSUkZJTEU9ID4+IHBuZ2VycnMKLQotIyB2YXJpYWJsZXMKLU9CSlMxID0gcG5nJChPKSBwbmdzZXQkKE8pIHBuZ2dldCQoTykgcG5ncnV0aWwkKE8pIHBuZ3RyYW5zJChPKSBwbmd3dXRpbCQoTykKLU9CSlMyID0gcG5nbWVtJChPKSBwbmdwcmVhZCQoTykgcG5ncmVhZCQoTykgcG5nZXJyb3IkKE8pIHBuZ3dyaXRlJChPKQotT0JKUzMgPSBwbmdydHJhbiQoTykgcG5nd3RyYW4kKE8pIHBuZ3JpbyQoTykgcG5nd2lvJChPKQotCi1hbGw6IGxpYnBuZy5saWIKLQotcG5nJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCQkgICQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nc2V0JChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nZ2V0JChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncmVhZCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3ByZWFkJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCQkgICQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncnRyYW4kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdydXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ2Vycm9yJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nbWVtJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncmlvJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nd2lvJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ndHJhbnMkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd3cml0ZSQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3d0cmFuJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nd3V0aWwkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1saWJwbmcubGliOiAkKE9CSlMxKSAkKE9CSlMyKSAkKE9CSlMzKQotCWRlbCBsaWJwbmcubGliCi0JbGliIGxpYnBuZyAkKE9CSlMxKTsKLQlsaWIgbGlicG5nICQoT0JKUzIpOwotCWxpYiBsaWJwbmcgJChPQkpTMyk7Ci0KLXBuZ3Rlc3QkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3Rlc3QuZXhlOiBwbmd0ZXN0Lm9iaiBsaWJwbmcubGliCi0JJChMRCkgJChMREZMQUdTKSBwbmd0ZXN0Lm9iaiwsLGxpYnBuZy5saWIgLi5cemxpYlx6bGliLmxpYiA7Ci0KLXRlc3Q6IHBuZ3Rlc3QuZXhlCi0JcG5ndGVzdAotCi0jIEVuZCBvZiBtYWtlZmlsZSBmb3IgbGlicG5nCi0KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5uZTEyYnNkIGIvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm5lMTJic2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZGRlNmMuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm5lMTJic2QKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgZm9yIE5ldEJTRCBmb3IgdGhlIHN0YW5kYXJkCi0jIG1ha2Ugb2JqICYmIG1ha2UgZGVwZW5kICYmIG1ha2UgJiYgbWFrZSB0ZXN0Ci0jIG1ha2UgaW5jbHVkZXMgJiYgbWFrZSBpbnN0YWxsCi0jIENvcHlyaWdodCAoQykgMjAwMiBQYXRyaWNrIFIuTC4gV2VsY2hlCi0jIENvcHlyaWdodCAoQykgMjAwNywgMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIFlvdSBzaG91bGQgYWxzbyBydW4gbWFrZWZpbGUubmV0YnNkCi0KLUxPQ0FMQkFTRT89L3Vzci9sb2NhbAotTElCRElSPQkke0xPQ0FMQkFTRX0vbGliCi1NQU5ESVI9ICR7TE9DQUxCQVNFfS9tYW4KLUlOQ1NESVI9JHtMT0NBTEJBU0V9L2luY2x1ZGUvbGlicG5nMTQKLQotTElCPQlwbmcxNAotU0hMSUJfTUFKT1I9CTAKLVNITElCX01JTk9SPQkxLjQuMTIKLVNSQ1M9CXBuZy5jIHBuZ3NldC5jIHBuZ2dldC5jIHBuZ3J1dGlsLmMgcG5ndHJhbnMuYyBwbmd3dXRpbC5jIFwKLQlwbmdyZWFkLmMgcG5ncmlvLmMgcG5nd2lvLmMgcG5nd3JpdGUuYyBwbmdydHJhbi5jIFwKLQlwbmd3dHJhbi5jIHBuZ21lbS5jIHBuZ2Vycm9yLmMgcG5ncHJlYWQuYwotSU5DUz0JcG5nLmggcG5nY29uZi5oCi1NQU49CWxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLQotQ1BQRkxBR1MrPS1JJHsuQ1VSRElSfQotCi0jIFdlIHNob3VsZCBiZSBhYmxlIHRvIGRvIHNvbWV0aGluZyBsaWtlIHRoaXMgaW5zdGVhZCBvZiB0aGUgbWFudWFsCi0jIHVuY29tbWVudGluZywgYnV0IGl0IGNvcmUgZHVtcHMgZm9yIG1lIGF0IHRoZSBtb21lbnQ6Ci0jIC5pZiAke01BQ0hJTkVfQVJDSH0gPT0gImkzODYiCi0jICAgTUtMSU5UPSBubwotIyAuZW5kaWYKLQotQ0xFQU5GSUxFUys9cG5ndGVzdC5vIHBuZ3Rlc3QKLQotcG5ndGVzdC5vOglwbmd0ZXN0LmMKLQkke0NDfSAtYyAke0NQUEZMQUdTfSAke0NGTEFHU30gJHsuQUxMU1JDfSAtbyAkey5UQVJHRVR9Ci0KLXBuZ3Rlc3Q6CXBuZ3Rlc3QubyBsaWJwbmcuYQotCSR7Q0N9ICR7TERGTEFHU30gJHsuQUxMU1JDfSAtbyR7LlRBUkdFVH0gLWx6IC1sbQotCi10ZXN0Oglwbmd0ZXN0Ci0JY2QgJHsuQ1VSRElSfSAmJiAkey5PQkpESVJ9L3BuZ3Rlc3QKLQotLmluY2x1ZGUgPGJzZC5saWIubWs+CmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUubmV0YnNkIGIvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm5ldGJzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwOTFhMi4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUubmV0YnNkCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nIGZvciBOZXRCU0QgZm9yIHRoZSBzdGFuZGFyZAotIyBtYWtlIG9iaiAmJiBtYWtlIGRlcGVuZCAmJiBtYWtlICYmIG1ha2UgdGVzdAotIyBtYWtlIGluY2x1ZGVzICYmIG1ha2UgaW5zdGFsbAotIyBDb3B5cmlnaHQgKEMpIDIwMDIgUGF0cmljayBSLkwuIFdlbGNoZQotIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIFlvdSBzaG91bGQgYWxzbyBydW4gbWFrZWZpbGUubmUxNGJzZAotCi1MT0NBTEJBU0U/PS91c3IvbG9jYWwKLUxJQkRJUj0JJHtMT0NBTEJBU0V9L2xpYgotTUFORElSPSAke0xPQ0FMQkFTRX0vbWFuCi1JTkNTRElSPSR7TE9DQUxCQVNFfS9pbmNsdWRlCi0KLUxJQj0JcG5nCi1TSExJQl9NQUpPUj0JMwotU0hMSUJfTUlOT1I9CTEuNC4xMgotU1JDUz0JcG5nLmMgcG5nc2V0LmMgcG5nZ2V0LmMgcG5ncnV0aWwuYyBwbmd0cmFucy5jIHBuZ3d1dGlsLmMgXAotCXBuZ3JlYWQuYyBwbmdyaW8uYyBwbmd3aW8uYyBwbmd3cml0ZS5jIHBuZ3J0cmFuLmMgXAotCXBuZ3d0cmFuLmMgcG5nbWVtLmMgcG5nZXJyb3IuYyBwbmdwcmVhZC5jCi1JTkNTPQlwbmcuaCBwbmdjb25mLmgKLU1BTj0JbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCi1DUFBGTEFHUys9LUkkey5DVVJESVJ9Ci0KLSMgV2Ugc2hvdWxkIGJlIGFibGUgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhpcyBpbnN0ZWFkIG9mIHRoZSBtYW51YWwKLSMgdW5jb21tZW50aW5nLCBidXQgaXQgY29yZSBkdW1wcyBmb3IgbWUgYXQgdGhlIG1vbWVudDoKLSMgLmlmICR7TUFDSElORV9BUkNIfSA9PSAiaTM4NiIKLSMgICBNS0xJTlQ9IG5vCi0jIC5lbmRpZgotCi1DTEVBTkZJTEVTKz1wbmd0ZXN0Lm8gcG5ndGVzdAotCi1wbmd0ZXN0Lm86CXBuZ3Rlc3QuYwotCSR7Q0N9IC1jICR7Q1BQRkxBR1N9ICR7Q0ZMQUdTfSAkey5BTExTUkN9IC1vICR7LlRBUkdFVH0KLQotcG5ndGVzdDoJcG5ndGVzdC5vIGxpYnBuZy5hCi0JJHtDQ30gJHtMREZMQUdTfSAkey5BTExTUkN9IC1vJHsuVEFSR0VUfSAtbHogLWxtCi0KLXRlc3Q6CXBuZ3Rlc3QKLQljZCAkey5DVVJESVJ9ICYmICR7Lk9CSkRJUn0vcG5ndGVzdAotCi0uaW5jbHVkZSA8YnNkLmxpYi5taz4KZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5vcGVuYnNkIGIvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm9wZW5ic2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTE5Y2IuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm9wZW5ic2QKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcKLSMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi1QUkVGSVg/PSAvdXNyL2xvY2FsCi1MSUJESVI9CSR7UFJFRklYfS9saWIKLU1BTkRJUj0gJHtQUkVGSVh9L21hbi9jYXQKLQotU0hMSUJfTUFKT1I9CTAKLVNITElCX01JTk9SPQkxLjQuMTIKLQotTElCPQlwbmcKLVNSQ1M9CXBuZy5jIHBuZ2Vycm9yLmMgcG5nZ2V0LmMgcG5nbWVtLmMgcG5ncHJlYWQuYyBcCi0JcG5ncmVhZC5jIHBuZ3Jpby5jIHBuZ3J0cmFuLmMgcG5ncnV0aWwuYyBwbmdzZXQuYyBwbmd0cmFucy5jIFwKLQlwbmd3aW8uYyBwbmd3cml0ZS5jIHBuZ3d0cmFuLmMgcG5nd3V0aWwuYwotCi1IRFJTPQlwbmcuaCBwbmdjb25mLmgKLQotQ0ZMQUdTKz0gLVcgLVdhbGwKLUNQUEZMQUdTKz0gLUkkey5DVVJESVJ9Ci0KLU5PUFJPRklMRT0gWWVzCi0KLUNMRUFORklMRVMrPSBwbmd0ZXN0Lm8gcG5ndGVzdAotCi1NQU49CWxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPIGxpYnBuZy50eHQKLQotcG5ndGVzdC5vOglwbmd0ZXN0LmMKLQkke0NDfSAke0NQUEZMQUdTfSAke0NGTEFHU30gLWMgJHsuQUxMU1JDfSAtbyAkey5UQVJHRVR9Ci0KLXBuZ3Rlc3Q6CXBuZ3Rlc3QubwotCSR7Q0N9ICR7TERGTEFHU30gJHsuQUxMU1JDfSAtbyAkey5UQVJHRVR9IC1MJHsuT0JKRElSfSAtbHBuZyAtbHogLWxtCi0KLXRlc3Q6CXBuZ3Rlc3QKLQljZCAkey5PQkpESVJ9ICYmIGVudiBcCi0JCUxEX0xJQlJBUllfUEFUSD0iJHsuT0JKRElSfSIgJHsuT0JKRElSfS9wbmd0ZXN0Ci0KLWJlZm9yZWluc3RhbGw6Ci0JaWYgWyAhIC1kICR7REVTVERJUn0ke1BSRUZJWH0vaW5jbHVkZS9saWJwbmcgXTsgdGhlbiBcCi0JICAke0lOU1RBTEx9IC1kIC1vIHJvb3QgLWcgd2hlZWwgJHtERVNURElSfSR7UFJFRklYfS9pbmNsdWRlOyBcCi0JZmkKLQlpZiBbICEgLWQgJHtERVNURElSfSR7TElCRElSfSBdOyB0aGVuIFwKLQkgICR7SU5TVEFMTH0gLWQgLW8gcm9vdCAtZyB3aGVlbCAke0RFU1RESVJ9JHtMSUJESVJ9OyBcCi0JZmkKLQlpZiBbICEgLWQgJHtERVNURElSfSR7TElCRElSfS9kZWJ1ZyBdOyB0aGVuIFwKLQkgICR7SU5TVEFMTH0gLWQgLW8gcm9vdCAtZyB3aGVlbCAke0RFU1RESVJ9JHtMSUJESVJ9L2RlYnVnOyBcCi0JZmkKLQlpZiBbICEgLWQgJHtERVNURElSfSR7TUFORElSfTMgXTsgdGhlbiBcCi0JICAke0lOU1RBTEx9IC1kIC1vIHJvb3QgLWcgd2hlZWwgJHtERVNURElSfSR7TUFORElSfTM7IFwKLQlmaQotCWlmIFsgISAtZCAke0RFU1RESVJ9JHtNQU5ESVJ9NSBdOyB0aGVuIFwKLQkgICR7SU5TVEFMTH0gLWQgLW8gcm9vdCAtZyB3aGVlbCAke0RFU1RESVJ9JHtNQU5ESVJ9NTsgXAotCWZpCi0JaWYgWyAhIC1kICR7REVTVERJUn0ke1BSRUZJWH0vc2hhcmUvZG9jL3BuZyBdOyB0aGVuIFwKLQkgICR7SU5TVEFMTH0gLWQgLW8gcm9vdCAtZyB3aGVlbCAke0RFU1RESVJ9JHtQUkVGSVh9L3NoYXJlL2RvYy9wbmc7IFwKLQlmaQotCi1hZnRlcmluc3RhbGw6Ci0JQHJtIC1mICR7REVTVERJUn0ke0xJQkRJUn0vbGlicG5nX3BpYy5hCi0JQHJtIC1mICR7REVTVERJUn0ke0xJQkRJUn0vZGVidWcvbGlicG5nLmEKLQlAcm0gLWYgJHtERVNURElSfSR7UFJFRklYfS9pbmNsdWRlL3BuZy5oCi0JQHJtIC1mICR7REVTVERJUn0ke1BSRUZJWH0vaW5jbHVkZS9wbmdjb25mLmgKLQlAcm1kaXIgJHtERVNURElSfSR7TElCRElSfS9kZWJ1ZyAyPi9kZXYvbnVsbCB8fCB0cnVlCi0JJHtJTlNUQUxMfSAke0lOU1RBTExfQ09QWX0gLW8gJHtTSEFSRU9XTn0gLWcgJHtTSEFSRUdSUH0gXAotCQktbSAke05PTkJJTk1PREV9ICR7SERSU30gJHtERVNURElSfSR7UFJFRklYfS9pbmNsdWRlCi0JJHtJTlNUQUxMfSAke0lOU1RBTExfQ09QWX0gLW8gJHtTSEFSRU9XTn0gLWcgJHtTSEFSRUdSUH0gXAotCQktbSAke05PTkJJTk1PREV9ICR7SERSU30gJHtERVNURElSfSR7UFJFRklYfS9pbmNsdWRlCi0JJHtJTlNUQUxMfSAke0lOU1RBTExfQ09QWX0gLW8gJHtTSEFSRU9XTn0gLWcgJHtTSEFSRUdSUH0gXAotCQktbSAke05PTkJJTk1PREV9ICR7RE9DU30gJHtERVNURElSfSR7UFJFRklYfS9zaGFyZS9kb2MvcG5nCi0KLS5pbmNsdWRlIDxic2QubGliLm1rPgpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm9zMiBiL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5vczIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZmIwM2MuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm9zMgorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZyBvbiBPUy8yIHdpdGggZ2NjCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBSZWxhdGVkIGZpbGVzOiBwbmdvczIuZGVmCi0KLUNDPWdjYyAtWm9tZiAtcwotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLVpMSUJMSUI9Li4vemxpYgotWkxJQklOQz0uLi96bGliCi0KLVdBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAotCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAotCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgotQ0ZMQUdTPS1JJChaTElCSU5DKSAtVyAtV2FsbCAtTzYgLWZ1bnJvbGwtbG9vcHMgLW1hbGlnbi1sb29wcz0yIFwKLQktbWFsaWduLWZ1bmN0aW9ucz0yICMkKFdBUk5NT1JFKSAtZyAtRFBOR19ERUJVRz01Ci1MREZMQUdTPS1MLiAtTCQoWkxJQkxJQikgLWxwbmcgLWx6ZGxsIC1aY3J0ZGxsCi1BUj1lbXhvbWZhcgotCi1QTkdMSUI9cG5nLmxpYgotSU1QTElCPWVteGltcAotU0hBUkVETElCPXBuZy5kbGwKLVNIQVJFRExJQklNUD1wbmdkbGwubGliCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotLlNVRkZJWEVTOiAgICAgIC5jIC5vCi0KLWFsbDogJChQTkdMSUIpICQoU0hBUkVETElCKSAkKFNIQVJFRExJQklNUCkKLQotJChQTkdMSUIpOiAkKE9CSlMpCi0JJChBUikgcmMgJEAgJChPQkpTKQotCi0kKFNIQVJFRExJQik6ICQoT0JKUykgcG5nb3MyLmRlZgotCSQoQ0MpICQoTERGTEFHUykgLVpkbGwgLW8gJEAgJF4KLQotJChTSEFSRURMSUJJTVApOiBwbmdvczIuZGVmCi0JJChJTVBMSUIpIC1vICRAICReCi0KLXBuZ3Rlc3QuZXhlOiBwbmd0ZXN0Lm8gcG5nLmRsbCBwbmdkbGwubGliCi0JJChDQykgLW8gJEAgJChDRkxBR1MpICQ8ICQoTERGTEFHUykKLQotdGVzdDogcG5ndGVzdC5leGUKLQkuL3BuZ3Rlc3QuZXhlCi0KLWNsZWFuOgotCXJtIC1mICoubyAkKFBOR0xJQikgcG5nLmRsbCBwbmdkbGwubGliIHBuZ3Rlc3QuZXhlIHBuZ291dC5wbmcKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ2Vycm9yLm8gcG5nZXJyb3IucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3Jpby5vIHBuZ3Jpby5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdtZW0ubyBwbmdtZW0ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3NldC5vIHBuZ3NldC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyZWFkLm8gcG5ncmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnRyYW4ubyBwbmdydHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ndHJhbnMubyBwbmd0cmFucy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3JpdGUubyBwbmd3cml0ZS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3V0aWwubyBwbmd3dXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncHJlYWQubyBwbmdwcmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnNjbyBiL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zY28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkY2I3ZDkuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnNjbworKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBTQ08gT1NyNSAgRUxGIGFuZCBVbml4d2FyZSA3IHdpdGggTmF0aXZlIGNjCi0jIENvbnRyaWJ1dGVkIGJ5IE1pa2UgSG9wa2lyayAoaG9wc0BzY28uY29tKSBtb2RpZmllZCBmcm9tIE1ha2VmaWxlLmxueAotIyAgIGZvcmNlIEVMRiBidWlsZCBkeW5hbWljIGxpbmtpbmcsIFNPTkFNRSBzZXR0aW5nIGluIGxpYiBhbmQgUlBBVEggaW4gYXBwCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiwgMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk4IEdyZWcgUm9lbG9mcwotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIExpYnJhcnkgbmFtZToKLUxJQk5BTUUgPSBsaWJwbmcxNAotUE5HTUFKID0gMTQKLQotIyBTaGFyZWQgbGlicmFyeSBuYW1lczoKLUxJQlNPPSQoTElCTkFNRSkuc28KLUxJQlNPTUFKPSQoTElCTkFNRSkuc28uJChQTkdNQUopCi1MSUJTT1JFTD0kKExJQlNPTUFKKS4kKFJFTEVBU0UpCi1PTERTTz1saWJwbmcuc28KLQotIyBVdGlsaXRpZXM6Ci1DQz1jYwotQVJfUkM9YXIgcmMKLU1LRElSX1A9bWtkaXIKLUxOX1NGPWxuIC1mIC1zCi1SQU5MSUI9ZWNobwotUk1fRj0vYmluL3JtIC1mCi0KLSMgd2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEsICQoT0xEU08pKiwgYW5kIHBuZy5oCi1wcmVmaXg9L3Vzci9sb2NhbAotZXhlY19wcmVmaXg9JChwcmVmaXgpCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotI1pMSUJMSUI9L3Vzci9sb2NhbC9saWIKLSNaTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQotWkxJQkxJQj0uLi96bGliCi1aTElCSU5DPS4uL3psaWIKLQotQ0ZMQUdTPSAtZHkgLWJlbGYgLUkkKFpMSUJJTkMpIC1PMwotTERGTEFHUz0tTC4gLUwkKFpMSUJMSUIpIC1scG5nMTQgLWx6IC1sbQotCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgotTUFOUEFUSD0kKHByZWZpeCkvbWFuCi1CSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi1EQj0kKERFU1RESVIpJChCSU5QQVRIKQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi1ETT0kKERFU1RESVIpJChNQU5QQVRIKQotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLU9CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQotCi0uU1VGRklYRVM6ICAgICAgLmMgLm8gLnBpYy5vCi0KLS5jLnBpYy5vOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtS1BJQyAtbyAkQCAkKi5jCi0KLWFsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotbGlicG5nLnBjOgotCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAotCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAotCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAotCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKLQktZSBzIS1scG5nMTQhLWxwbmcxNFwgLWx6XCAtbG0hID4gbGlicG5nLnBjCi0KLWxpYnBuZy1jb25maWc6Ci0JKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKLQllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCi0JZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCi0JZWNobyBjY29wdHM9XCItYmVsZlwiOyBcCi0JZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAotCWVjaG8gbGlicz1cIi1scG5nMTQgLWx6IC1sbVwiOyBcCi0JY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCi0JY2htb2QgK3ggbGlicG5nLWNvbmZpZwotCi0kKExJQlNPKTogJChMSUJTT01BSikKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQotCi0kKExJQlNPTUFKKTogJChPQkpTRExMKQotCSQoQ0MpIC1HICAtV2wsLWgsJChMSUJTT01BSikgLW8gJChMSUJTT01BSikgXAotCSAkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCUxEX1JVTl9QQVRIPS46JChaTElCTElCKSAkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oCi0JLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQotCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oCi0JLUAkKFJNX0YpICQoREkpL3BuZ2NvbmYuaAotCWNwIHBuZy5oIHBuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQktQCQoUk1fRikgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKLQotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPTUFKKSBsaWJwbmcucGMKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09SRUwpCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JY3AgJChMSUJTT01BSikgJChETCkvJChMSUJTT1JFTCkKLQljaG1vZCA3NTUgJChETCkvJChMSUJTT1JFTCkKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKExJQlNPUkVMKSAkKExJQlNPKTsgXAotCSQoTE5fU0YpICQoTElCU08pICQoT0xEU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpIC1JJChESSkgJChDRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JJChDQykgJChDRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZyBsaWJwbmctY29uZmlnIFwKLQkkKExJQlNPKSAkKExJQlNPTUFKKSogcG5ndGVzdC1zdGF0aWMgcG5ndGVzdGkgXAotCWxpYnBuZy5wYwotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vIHBuZy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3aW8ubyBwbmd3aW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ21lbS5vIHBuZ21lbS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdnZXQubyBwbmdnZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydXRpbC5vIHBuZ3J1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dHJhbi5vIHBuZ3d0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc2dnY2MgYi9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc2dnY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNDlmYjkuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnNnZ2NjCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZy5hIGFuZCBsaWJwbmcxNC5zbywgU0dJIElSSVggd2l0aCAnY2MnCi0jIENvcHlyaWdodCAoQykgMjAwMS0yMDAyLCAyMDA2LCAyMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDE5OTUgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FPWxpYnBuZzE0Ci1QTkdNQUogPSAxNAotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbwotTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKLUxJQlNPUkVMPSQoTElCU09NQUopLiQoUkVMRUFTRSkKLU9MRFNPPWxpYnBuZy5zbwotCi0jIFV0aWxpdGllczoKLUFSX1JDPWFyIHJjCi1DQz1nY2MKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1zZgotUkFOTElCPWVjaG8KLVJNX0Y9L2Jpbi9ybSAtZgotCi0jIFdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hLCBsaWJwbmcxNC5zbywgYW5kIGxpYnBuZzE0L3BuZy5oCi0jIFByZWZpeCBtdXN0IGJlIGEgZnVsbCBwYXRobmFtZS4KLQotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLSNaTElCTElCPS91c3IvbG9jYWwvbGliMzIKLSNaTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQotI1pMSUJMSUI9L3Vzci9sb2NhbC9saWIKLSNaTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQotWkxJQkxJQj0uLi96bGliCi1aTElCSU5DPS4uL3psaWIKLQotIyBBQkkgY2FuIGJlIGJsYW5rIHRvIHVzZSBkZWZhdWx0IGZvciB5b3VyIHN5c3RlbSwgLTMyLCAtbzMyLCAtbjMyLCBvciAtNjQKLSMgU2VlICJtYW4gYWJpIi4gIHpsaWIgbXVzdCBiZSBidWlsdCB3aXRoIHRoZSBzYW1lIEFCSS4KLUFCST0KLQotV0FSTk1PUkU9ICMgLWcgLURQTkdfREVCVUc9NQotQ0ZMQUdTPSQoQUJJKSAtSSQoWkxJQklOQykgLU8gJChXQVJOTU9SRSkgLWZQSUMgLW1hYmk9bjMyCi1MREZMQUdTPSQoQUJJKSAtTC4gLUwkKFpMSUJMSUIpIC1scG5nIC1seiAtbG0KLUxEU0hBUkVEPWNjICQoQUJJKSAtc2hhcmVkIC1zb25hbWUgJChMSUJTT01BSikgXAotICAtc2V0X3ZlcnNpb24gc2dpJChQTkdNQUopLjAKLSMgU2VlICJtYW4gZHNvIiBmb3IgaW5mbyBhYm91dCBzaGFyZWQgb2JqZWN0cwotCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgotI0xJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliMzIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotT0JKUyA9ICBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotYWxsOiBsaWJwbmcuYSBwbmd0ZXN0IHNoYXJlZCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotc2hhcmVkOiAkKExJQlNPTUFKKQotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxNCEtbHBuZzE0XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzoKLQkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIGNjb3B0cz1cIiQoQUJJKVwiOyBcCi0JZWNobyBjcHBmbGFncz1cIlwiOyBcCi0JZWNobyBsZG9wdHM9XCIkKEFCSSlcIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYmRpcj1cIiQoTElCUEFUSClcIjsgXAotCWVjaG8gbGlicz1cIi1scG5nMTQgLWx6IC1sbVwiOyBcCi0JY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCi0JY2htb2QgK3ggbGlicG5nLWNvbmZpZwotCi0kKExJQlNPKTogJChMSUJTT01BSikKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQotCi0kKExJQlNPTUFKKTogJChPQkpTKQotCSQoTERTSEFSRUQpIC1vICRAICQoT0JKUykKLQkkKFJNX0YpICQoTElCU08pICQoTElCU09NQUopCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQllY2hvCi0JZWNobyBUZXN0aW5nIGxvY2FsIHN0YXRpYyBsaWJyYXJ5LgotCS4vcG5ndGVzdAotCi1pbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaAotCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKLQktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQotCWNwIHBuZy5oIHBuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQktQCQoUk1fRikgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKLQotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPTUFKKSBsaWJwbmcucGMKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09SRUwpCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JY3AgJChMSUJTT01BSikgJChETCkvJChMSUJTT1JFTCkKLQljaG1vZCA3NTUgJChETCkvJChMSUJTT1JFTCkKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKExJQlNPUkVMKSAkKExJQlNPKTsgXAotCSQoTE5fU0YpICQoTElCU08pICQoT0xEU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpIC1JJChESSkgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSBcCi0gICAgICAgICAgIC1ycGF0aCAkKFpMSUJMSUIpOiQoREwpIFwKLQkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCi0JLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZwotCi10ZXN0LWluc3RhbGxlZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5LgotCSQoQ0MpIC1JJChaTElCSU5DKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKFpMSUJMSUIpIFwKLSAgICAgICAgICAgLXJwYXRoICQoWkxJQkxJQik6YCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1saWJkaXJgIFwKLQkgICAtbyBwbmd0ZXN0aSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCi0JLi9wbmd0ZXN0aSBwbmd0ZXN0LnBuZwotCi1jbGVhbjoKLQkkKFJNX0YpIGxpYnBuZy5hIHBuZ3Rlc3QgcG5ndGVzdGkgcG5nb3V0LnBuZyBsaWJwbmcucGMgXAotICAgICAgICBzb19sb2NhdGlvbnMgbGlicG5nLWNvbmZpZyAkKExJQlNPKSAkKExJQlNPTUFKKSoKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZXJyb3IubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncmlvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3dpby5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdtZW0ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nc2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ2dldC5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3J0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3J1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3RyYW5zLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3dyaXRlLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3d0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3d1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3ByZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQotcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmgKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zZ2kgYi9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzM4MWRhLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nLmEgYW5kIGxpYnBuZzE0LnNvLCBTR0kgSVJJWCB3aXRoICdjYycKLSMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIsIDIwMDYsIDIwMDcsIDIwMTAgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIExpYnJhcnkgbmFtZToKLUxJQk5BTUU9bGlicG5nMTQKLVBOR01BSiA9IDE0Ci0KLSMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6Ci1MSUJTTz0kKExJQk5BTUUpLnNvCi1MSUJTT01BSj0kKExJQk5BTUUpLnNvLiQoUE5HTUFKKQotTElCU09SRUw9JChMSUJTT01BSikuJChSRUxFQVNFKQotT0xEU089bGlicG5nLnNvCi0KLSMgVXRpbGl0aWVzOgotQVJfUkM9YXIgcmMKLUNDPWNjCi1NS0RJUl9QPW1rZGlyIC1wCi1MTl9TRj1sbiAtc2YKLVJBTkxJQj1lY2hvCi1STV9GPS9iaW4vcm0gLWYKLQotIyBXaGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSwgbGlicG5nMTQuc28sIGFuZCBsaWJwbmcxNC9wbmcuaAotIyBQcmVmaXggbXVzdCBiZSBhIGZ1bGwgcGF0aG5hbWUuCi0KLXByZWZpeD0vdXNyL2xvY2FsCi1leGVjX3ByZWZpeD0kKHByZWZpeCkKLQotIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCi0jWkxJQkxJQj0vdXNyL2xvY2FsL2xpYjMyCi0jWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKLSNaTElCTElCPS91c3IvbG9jYWwvbGliCi0jWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKLVpMSUJMSUI9Li4vemxpYgotWkxJQklOQz0uLi96bGliCi0KLSMgQUJJIGNhbiBiZSBibGFuayB0byB1c2UgZGVmYXVsdCBmb3IgeW91ciBzeXN0ZW0sIC0zMiwgLW8zMiwgLW4zMiwgb3IgLTY0Ci0jIFNlZSAibWFuIGFiaSIuICB6bGliIG11c3QgYmUgYnVpbHQgd2l0aCB0aGUgc2FtZSBBQkkuCi1BQkk9Ci0KLVdBUk5NT1JFPS1mdWxsd2FybgotIyBOb3RlOiAtS1BJQyBpcyB0aGUgZGVmYXVsdCBhbnlob3cKLSNDRkxBR1M9ICQoQUJJKSAtSSQoWkxJQklOQykgLU8gJChXQVJOTU9SRSkgLUtQSUMgIyAtZyAtRFBOR19ERUJVRz01Ci1DRkxBR1M9JChBQkkpIC1JJChaTElCSU5DKSAtTyAkKFdBUk5NT1JFKQotTERGTEFHU19BPSQoQUJJKSAtTC4gLUwkKFpMSUJMSUIpIC1scG5nMTQgLWx6IC1sbQotTERGTEFHUz0kKEFCSSkgLUwuIC1MJChaTElCTElCKSAtbHBuZyAtbHogLWxtCi1MRFNIQVJFRD1jYyAkKEFCSSkgLXNoYXJlZCAtc29uYW1lICQoTElCU09NQUopIFwKLSAgLXNldF92ZXJzaW9uIHNnaSQoUE5HTUFKKS4wCi0jIFNlZSAibWFuIGRzbyIgZm9yIGluZm8gYWJvdXQgc2hhcmVkIG9iamVjdHMKLQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLSNMSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYjMyCi1NQU5QQVRIPSQocHJlZml4KS9tYW4KLUJJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLURCPSQoREVTVERJUikkKEJJTlBBVEgpCi1EST0kKERFU1RESVIpJChJTkNQQVRIKQotREw9JChERVNURElSKSQoTElCUEFUSCkKLURNPSQoREVTVERJUikkKE1BTlBBVEgpCi0KLU9CSlMgPSAgcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLWFsbDogbGlicG5nLmEgcG5ndGVzdCBzaGFyZWQgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLWxpYnBuZy5wYzoKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzE0IS1scG5nMTRcIC1selwgLWxtISA+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOgotCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gY2NvcHRzPVwiJChBQkkpXCI7IFwKLQllY2hvIGxkb3B0cz1cIiQoQUJJKVwiOyBcCi0JZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAotCWVjaG8gbGliZGlyPVwiJChMSUJQQVRIKVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmcxNCAtbHogLWxtXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0KLSQoTElCU09NQUopOiAkKE9CSlMpCi0JJChMRFNIQVJFRCkgLW8gJEAgJChPQkpTKQotCSQoUk1fRikgJChMSUJTTykgJChMSUJTT01BSikKLQotcG5ndGVzdDogcG5ndGVzdC5vIGxpYnBuZy5hCi0JJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKLQotdGVzdDogcG5ndGVzdAotCWVjaG8KLQllY2hvIFRlc3RpbmcgbG9jYWwgc3RhdGljIGxpYnJhcnkuCi0JLi9wbmd0ZXN0Ci0KLWluc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oCi0JLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQotCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JY3AgcG5nLmggcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvbGlicG5nCi0JKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCi0JY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQotCS1AJChSTV9GKSAkKERMKS9saWJwbmcuYQotCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQotCi1pbnN0YWxsLXNoYXJlZDogaW5zdGFsbC1oZWFkZXJzICQoTElCU09NQUopIGxpYnBuZy5wYwotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQktQCQoUk1fRikgJChETCkvJChMSUJTTykKLQktQCQoUk1fRikgJChETCkvJChMSUJTT1JFTCkKLQktQCQoUk1fRikgJChETCkvJChPTERTTykKLQljcCAkKExJQlNPTUFKKSAkKERMKS8kKExJQlNPUkVMKQotCWNobW9kIDc1NSAkKERMKS8kKExJQlNPUkVMKQotCShjZCAkKERMKTsgXAotCSQoTE5fU0YpICQoTElCU09SRUwpICQoTElCU08pOyBcCi0JJChMTl9TRikgJChMSUJTTykgJChPTERTTykpCi0JLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKLQljcCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQljaG1vZCA2NDQgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQkoY2QgJChETCkvcGtnY29uZmlnOyAkKExOX1NGKSAkKExJQk5BTUUpLnBjIGxpYnBuZy5wYykKLQotaW5zdGFsbC1tYW46IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLQktQGlmIFsgISAtZCAkKERNKSBdOyB0aGVuICQoTUtESVJfUCkgJChETSk7IGZpCi0JLUBpZiBbICEgLWQgJChETSkvbWFuMyBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuMzsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmcuMwotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZ3BmLjMKLQljcCBsaWJwbmcuMyAkKERNKS9tYW4zCi0JY3AgbGlicG5ncGYuMyAkKERNKS9tYW4zCi0JLUBpZiBbICEgLWQgJChETSkvbWFuNSBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuNTsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuNS9wbmcuNQotCWNwIHBuZy41ICQoRE0pL21hbjUKLQotaW5zdGFsbC1jb25maWc6IGxpYnBuZy1jb25maWcKLQktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCi0JLUAkKFJNX0YpICQoREIpL2xpYnBuZy1jb25maWcKLQktQCQoUk1fRikgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljcCBsaWJwbmctY29uZmlnICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY2htb2QgNzU1ICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JKGNkICQoREIpOyAkKExOX1NGKSAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQotCi1pbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZwotCi0jIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKLSMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0Ci0jIGJlZm9yZSB0aGVuLgotCi10ZXN0LWRkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCi0JJChDQykgLUkkKERJKSAtSSQoWkxJQklOQykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIFwKLSAgICAgICAgICAgLXJwYXRoICQoWkxJQkxJQik6JChETCkgXAotCSAgIC1vIHBuZ3Rlc3RkIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RkIHBuZ3Rlc3QucG5nCi0KLXRlc3QtaW5zdGFsbGVkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkuCi0JJChDQykgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoWkxJQkxJQikgXAotICAgICAgICAgICAtcnBhdGggJChaTElCTElCKTpgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxpYmRpcmAgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5ndGVzdGkgcG5nb3V0LnBuZyBsaWJwbmcucGMgbGlicG5nLWNvbmZpZyBcCi0JJChMSUJTTykgJChMSUJTT01BSikqIFwKLQlzb19sb2NhdGlvbnMKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZXJyb3IubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncmlvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3dpby5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdtZW0ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nc2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ2dldC5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3J0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3J1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3RyYW5zLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3dyaXRlLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3d0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3d1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3ByZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQotcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmgKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zbzkgYi9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc285CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDUyZTNkLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zbzkKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nIG9uIFNvbGFyaXMgOSAoYmV0YSkgd2l0aCBGb3J0ZSBjYwotIyBVcGRhdGVkIGJ5IENoYWQgU2Nocm9jayBmb3IgU29sYXJpcyA5Ci0jIENvbnRyaWJ1dGVkIGJ5IFdpbGxpYW0gTC4gU2Vib2ssIGJhc2VkIG9uIG1ha2VmaWxlLmxpbnV4Ci0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiwgMjAwOCwgMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDEgR3JlZyBSb2Vsb2ZzCi0jIENvcHlyaWdodCAoQykgMTk5Ni0xOTk3IEFuZHJlYXMgRGlsZ2VyCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBMaWJyYXJ5IG5hbWU6Ci1QTkdNQUogPSAxNAotTElCTkFNRSA9IGxpYnBuZzE0Ci0KLSMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6Ci1MSUJTTz0kKExJQk5BTUUpLnNvCi1MSUJTT01BSj0kKExJQk5BTUUpLnNvLiQoUE5HTUFKKQotTElCU09SRUw9JChMSUJTT01BSikuJChSRUxFQVNFKQotT0xEU089bGlicG5nLnNvCi0KLSMgVXRpbGl0aWVzOgotIyBnY2MgMi45NSBkb2Vzbid0IHdvcmsuCi1DQz1jYwotQVJfUkM9YXIgcmMKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1mIC1zCi1SQU5MSUI9ZWNobwotUk1fRj0vYmluL3JtIC1mCi0KLSMgV2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEsICQoT0xEU08pKiwgYW5kIHBuZy5oCi1wcmVmaXg9L3Vzci9sb2NhbAotZXhlY19wcmVmaXg9JChwcmVmaXgpCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotIyBDaGFuZ2luZyB0aGVzZSB0byAuLi96bGliIHBvc2VzIGEgc2VjdXJpdHkgcmlzay4gIElmIHlvdSB3YW50Ci0jIHRvIGhhdmUgemxpYiBpbiBhbiBhZGphY2VudCBkaXJlY3RvcnksIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aCBpbnN0ZWFkIG9mICIuLiIuCi0jWkxJQkxJQj0uLi96bGliCi0jWkxJQklOQz0uLi96bGliCi0jWkxJQkxJQj0vdXNyL2xvY2FsL2xpYgotI1pMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCi0jVXNlIHRoZSBwcmVpbnN0YWxsZWQgemxpYiB0aGF0IGNvbWVzIHdpdGggU29sYXJpcyA5OgotWkxJQkxJQj0vdXNyL2xpYgotWkxJQklOQz0vdXNyL2luY2x1ZGUKLQotI1dBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAotCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAotCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgotI0NGTEFHUz0tSSQoWkxJQklOQykgLVcgLVdhbGwgLU8zICQoV0FSTk1PUkUpIC1nIC1EUE5HX0RFQlVHPTUgLURQTkdfTk9fTU1YX0NPREUKLUNGTEFHUz0tSSQoWkxJQklOQykgLU8zIC1EUE5HX05PX01NWF9DT0RFCi1MREZMQUdTPS1MLiAtUi4gLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSAtbHBuZzE0IC1seiAtbG0KLQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1PQkpTRExMID0gJChPQkpTOi5vPS5waWMubykKLQotLlNVRkZJWEVTOiAgICAgIC5jIC5vIC5waWMubwotCi0uYy5waWMubzoKLQkkKENDKSAtYyAkKENGTEFHUykgLUtQSUMgLW8gJEAgJCouYwotCi1hbGw6IGxpYnBuZy5hICQoTElCU08pIHBuZ3Rlc3QgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLWxpYnBuZy5wYzoKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzE0IS1scG5nMTRcIC1selwgLWxtISA+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOgotCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIFJfb3B0cz1cIi1SJChMSUJQQVRIKVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmcxNCAtbHogLWxtXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0KLSQoTElCU09NQUopOiAkKE9CSlNETEwpCi0JQGNhc2UgImB0eXBlIGxkYCIgaW4gKnVjYiopIFwKLQllY2hvOyBcCi0JZWNobyAnIyMgV0FSTklORzonOyBcCi0JZWNobyAnIyMgVGhlIGNvbW1hbmRzICJDQyIgYW5kICJMRCIgbXVzdCBOT1QgcmVmZXIgdG8gL3Vzci91Y2IvY2MnOyBcCi0JZWNobyAnIyMgYW5kIC91c3IvdWNiL2xkLiAgSWYgdGhleSBkbywgeW91IG5lZWQgdG8gYWRqdXN0IHlvdXIgUEFUSCc7IFwKLQllY2hvICcjIyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwdXQgL3Vzci9jY3MvYmluIGFoZWFkIG9mIC91c3IvdWNiLic7IFwKLQllY2hvICcjIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTERfTElCUkFSWV9QQVRIIHNob3VsZCBub3QgYmUgc2V0JzsgXAotCWVjaG8gJyMjIGF0IGFsbC4gIElmIGl0IGlzLCB0aGluZ3MgYXJlIGxpa2VseSB0byBicmVhayBiZWNhdXNlIG9mJzsgXAotCWVjaG8gJyMjIHRoZSBsaWJ1Y2IgZGVwZW5kZW5jeSB0aGF0IGlzIGNyZWF0ZWQuJzsgXAotCWVjaG87IFwKLQk7OyBcCi0JZXNhYwotCSQoTEQpIC1HIC1oICQoTElCU09NQUopIFwKLQkgLW8gJChMSUJTT01BSikgJChPQkpTRExMKQotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gJChMSUJTTykKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oCi0JLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQotCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JY3AgcG5nLmggcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvbGlicG5nCi0JKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCi0JY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQotCS1AJChSTV9GKSAkKERMKS9saWJwbmcuYQotCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQotCi1pbnN0YWxsLXNoYXJlZDogaW5zdGFsbC1oZWFkZXJzICQoTElCU09NQUopIGxpYnBuZy5wYwotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQktQCQoUk1fRikgJChETCkvJChMSUJTTykKLQktQCQoUk1fRikgJChETCkvJChMSUJTT1JFTCkKLQktQCQoUk1fRikgJChETCkvJChPTERTTykKLQljcCAkKExJQlNPTUFKKSAkKERMKS8kKExJQlNPUkVMKQotCWNobW9kIDc1NSAkKERMKS8kKExJQlNPUkVMKQotCShjZCAkKERMKTsgXAotCSQoTE5fU0YpICQoTElCU09SRUwpICQoTElCU08pOyBcCi0JJChMTl9TRikgJChMSUJTTykgJChPTERTTykpCi0JLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKLQljcCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQljaG1vZCA2NDQgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQkoY2QgJChETCkvcGtnY29uZmlnOyAkKExOX1NGKSAkKExJQk5BTUUpLnBjIGxpYnBuZy5wYykKLQotaW5zdGFsbC1tYW46IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLQktQGlmIFsgISAtZCAkKERNKSBdOyB0aGVuICQoTUtESVJfUCkgJChETSk7IGZpCi0JLUBpZiBbICEgLWQgJChETSkvbWFuMyBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuMzsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmcuMwotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZ3BmLjMKLQljcCBsaWJwbmcuMyAkKERNKS9tYW4zCi0JY3AgbGlicG5ncGYuMyAkKERNKS9tYW4zCi0JLUBpZiBbICEgLWQgJChETSkvbWFuNSBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuNTsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuNS9wbmcuNQotCWNwIHBuZy41ICQoRE0pL21hbjUKLQotaW5zdGFsbC1jb25maWc6IGxpYnBuZy1jb25maWcKLQktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCi0JLUAkKFJNX0YpICQoREIpL2xpYnBuZy1jb25maWcKLQktQCQoUk1fRikgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljcCBsaWJwbmctY29uZmlnICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY2htb2QgNzU1ICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JKGNkICQoREIpOyAkKExOX1NGKSAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQotCi1pbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZwotCi0jIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKLSMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0Ci0jIGJlZm9yZSB0aGVuLgotCi10ZXN0LWRkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCi0JJChDQykgLUkkKERJKSAtSSQoWkxJQklOQykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1vIHBuZ3Rlc3RkIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AgXAotCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpICAtUiQoWkxJQkxJQikgLVIkKERMKQotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KLQkkKENDKSAtSSQoWkxJQklOQykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AgXAotCSAgIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5ndGVzdGkgcG5nb3V0LnBuZyBcCi0JbGlicG5nLWNvbmZpZyAkKExJQlNPKSAkKExJQlNPTUFKKSogXAotCWxpYnBuZy5wYwotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vIHBuZy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3aW8ubyBwbmd3aW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ21lbS5vIHBuZ21lbS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdnZXQubyBwbmdnZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydXRpbC5vIHBuZ3J1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dHJhbi5vIHBuZ3d0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc29sYXJpcyBiL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zb2xhcmlzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTk0MDVlLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zb2xhcmlzCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZyBvbiBTb2xhcmlzIDIueCB3aXRoIGdjYwotIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDYtMjAwOCwgMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29udHJpYnV0ZWQgYnkgV2lsbGlhbSBMLiBTZWJvaywgYmFzZWQgb24gbWFrZWZpbGUubGludXgKLSMgQ29weXJpZ2h0IChDKSAxOTk4IEdyZWcgUm9lbG9mcwotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIExpYnJhcnkgbmFtZToKLUxJQk5BTUUgPSBsaWJwbmcxNAotUE5HTUFKID0gMTQKLQotIyBTaGFyZWQgbGlicmFyeSBuYW1lczoKLUxJQlNPPSQoTElCTkFNRSkuc28KLUxJQlNPTUFKPSQoTElCTkFNRSkuc28uJChQTkdNQUopCi1MSUJTT1JFTD0kKExJQlNPTUFKKS4kKFJFTEVBU0UpCi1PTERTTz1saWJwbmcuc28KLQotIyBVdGlsaXRpZXM6Ci1BUl9SQz1hciByYwotQ0M9Z2NjCi1NS0RJUl9QPW1rZGlyIC1wCi1MTl9TRj1sbiAtZiAtcwotUkFOTElCPWVjaG8KLVJNX0Y9L2Jpbi9ybSAtZgotCi0jIFdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hLCBsaWJwbmcxNC5zbyosIGFuZCBwbmcuaAotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLSMgQ2hhbmdpbmcgdGhlc2UgdG8gLi4vemxpYiBwb3NlcyBhIHNlY3VyaXR5IHJpc2suICBJZiB5b3Ugd2FudAotIyB0byBoYXZlIHpsaWIgaW4gYW4gYWRqYWNlbnQgZGlyZWN0b3J5LCBzcGVjaWZ5IHRoZSBmdWxsIHBhdGggaW5zdGVhZCBvZiAiLi4iLgotI1pMSUJMSUI9Li4vemxpYgotI1pMSUJJTkM9Li4vemxpYgotCi1aTElCTElCPS91c3IvbG9jYWwvbGliCi1aTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQotCi1XQVJOTU9SRT0tV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1Xc2hhZG93IFwKLQktV21pc3NpbmctZGVjbGFyYXRpb25zIC1XdHJhZGl0aW9uYWwgLVdjYXN0LWFsaWduIFwKLQktV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzICMtV2NvbnZlcnNpb24KLUNGTEFHUz0tSSQoWkxJQklOQykgLVcgLVdhbGwgLU8gXAotCSMgJChXQVJOTU9SRSkgLWcgLURQTkdfREVCVUc9NQotTERGTEFHUz0tTC4gLVIuIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikgLWxwbmcxNCAtbHogLWxtCi0KLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCi1NQU5QQVRIPSQocHJlZml4KS9tYW4KLUJJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLURCPSQoREVTVERJUikkKEJJTlBBVEgpCi1EST0kKERFU1RESVIpJChJTkNQQVRIKQotREw9JChERVNURElSKSQoTElCUEFUSCkKLURNPSQoREVTVERJUikkKE1BTlBBVEgpCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCi0KLS5TVUZGSVhFUzogICAgICAuYyAubyAucGljLm8KLQotLmMucGljLm86Ci0JJChDQykgLWMgJChDRkxBR1MpIC1mUElDIC1vICRAICQqLmMKLQotYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JJChBUl9SQykgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxNCEtbHBuZzE0XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzoKLQkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIGNwcGZsYWdzPVwiXCI7IFwKLQllY2hvIExfb3B0cz1cIi1MJChMSUJQQVRIKVwiOyBcCi0JZWNobyBSX29wdHM9XCItUiQoTElCUEFUSClcIjsgXAotCWVjaG8gbGlicz1cIi1scG5nMTQgLWx6IC1sbVwiOyBcCi0JY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCi0JY2htb2QgK3ggbGlicG5nLWNvbmZpZwotCi0kKExJQlNPKTogJChMSUJTT01BSikKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQotCi0kKExJQlNPTUFKKTogJChPQkpTRExMKQotCUBjYXNlICJgdHlwZSBsZGAiIGluICp1Y2IqKSBcCi0JZWNobzsgXAotCWVjaG8gJyMjIFdBUk5JTkc6JzsgXAotCWVjaG8gJyMjIFRoZSBjb21tYW5kcyAiQ0MiIGFuZCAiTEQiIG11c3QgTk9UIHJlZmVyIHRvIC91c3IvdWNiL2NjJzsgXAotCWVjaG8gJyMjIGFuZCAvdXNyL3VjYi9sZC4gIElmIHRoZXkgZG8sIHlvdSBuZWVkIHRvIGFkanVzdCB5b3VyIFBBVEgnOyBcCi0JZWNobyAnIyMgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcHV0IC91c3IvY2NzL2JpbiBhaGVhZCBvZiAvdXNyL3VjYi4nOyBcCi0JZWNobyAnIyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIExEX0xJQlJBUllfUEFUSCBzaG91bGQgbm90IGJlIHNldCc7IFwKLQllY2hvICcjIyBhdCBhbGwuICBJZiBpdCBpcywgdGhpbmdzIGFyZSBsaWtlbHkgdG8gYnJlYWsgYmVjYXVzZSBvZic7IFwKLQllY2hvICcjIyB0aGUgbGlidWNiIGRlcGVuZGVuY3kgdGhhdCBpcyBjcmVhdGVkLic7IFwKLQllY2hvOyBcCi0JOzsgXAotCWVzYWMKLQkkKExEKSAtRyAtaCAkKExJQlNPTUFKKSBcCi0JIC1vICQoTElCU09NQUopICQoT0JKU0RMTCkKLQotcG5ndGVzdDogcG5ndGVzdC5vICQoTElCU08pCi0JJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKLQotdGVzdDogcG5ndGVzdAotCS4vcG5ndGVzdAotCi1pbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaAotCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKLQktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQotCWNwIHBuZy5oIHBuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQktQCQoUk1fRikgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKLQotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPTUFKKSBsaWJwbmcucGMKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09SRUwpCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JY3AgJChMSUJTT01BSikgJChETCkvJChMSUJTT1JFTCkKLQljaG1vZCA3NTUgJChETCkvJChMSUJTT1JFTCkKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKExJQlNPUkVMKSAkKExJQlNPKTsgXAotCSQoTE5fU0YpICQoTElCU08pICQoT0xEU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpIC1JJChESSkgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikgLVIkKERMKQotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KLQkkKENDKSAtSSQoWkxJQklOQykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AgXAotCSAgIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5ndGVzdGkgcG5nb3V0LnBuZyBcCi0JbGlicG5nLWNvbmZpZyAkKExJQlNPKSAkKExJQlNPTUFKKSogXAotCWxpYnBuZy5wYwotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vIHBuZy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3aW8ubyBwbmd3aW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ21lbS5vIHBuZ21lbS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdnZXQubyBwbmdnZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydXRpbC5vIHBuZ3J1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dHJhbi5vIHBuZ3d0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc29sYXJpcy14ODYgYi9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc29sYXJpcy14ODYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OGIyOTIuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnNvbGFyaXMteDg2CisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZyBvbiBTb2xhcmlzIDIueCB3aXRoIGdjYwotIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDYtMjAwOCwgMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29udHJpYnV0ZWQgYnkgV2lsbGlhbSBMLiBTZWJvaywgYmFzZWQgb24gbWFrZWZpbGUubGludXgKLSMgQ29weXJpZ2h0IChDKSAxOTk4IEdyZWcgUm9lbG9mcwotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLQotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgTGlicmFyeSBuYW1lOgotTElCTkFNRSA9IGxpYnBuZzE0Ci1QTkdNQUogPSAxNAotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbwotTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKLUxJQlNPUkVMPSQoTElCU09NQUopLiQoUkVMRUFTRSkKLU9MRFNPPWxpYnBuZy5zbwotCi0jIFV0aWxpdGllczoKLUFSX1JDPWFyIHJjCi1DQz1nY2MKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1mIC1zCi1SQU5MSUI9ZWNobwotUk1fRj0vYmluL3JtIC1mCi0KLSMgV2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEsIGxpYnBuZzE0LnNvKiwgYW5kIHBuZy5oCi1wcmVmaXg9L3Vzci9sb2NhbAotZXhlY19wcmVmaXg9JChwcmVmaXgpCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotIyBDaGFuZ2luZyB0aGVzZSB0byAuLi96bGliIHBvc2VzIGEgc2VjdXJpdHkgcmlzay4gIElmIHlvdSB3YW50Ci0jIHRvIGhhdmUgemxpYiBpbiBhbiBhZGphY2VudCBkaXJlY3RvcnksIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aCBpbnN0ZWFkIG9mICIuLiIuCi0jWkxJQkxJQj0uLi96bGliCi0jWkxJQklOQz0uLi96bGliCi0KLVpMSUJMSUI9L3Vzci9sb2NhbC9saWIKLVpMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCi0KLVdBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAotCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAotCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgotQ0ZMQUdTPS1JJChaTElCSU5DKSAtVyAtV2FsbCAtTyBcCi0JIyAkKFdBUk5NT1JFKSAtZyAtRFBOR19ERUJVRz01Ci1MREZMQUdTPS1MLiAtUi4gLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSAtbHBuZzE0IC1seiAtbG0KLQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1PQkpTRExMID0gJChPQkpTOi5vPS5waWMubykKLQotLlNVRkZJWEVTOiAgICAgIC5jIC5vIC5waWMubwotCi0uYy5waWMubzoKLQkkKENDKSAtYyAkKENGTEFHUykgLWZQSUMgLW8gJEAgJCouYwotCi1hbGw6IGxpYnBuZy5hICQoTElCU08pIHBuZ3Rlc3QgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLWxpYnBuZy5wYzoKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzE0IS1scG5nMTRcIC1selwgLWxtISA+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOgotCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gY3BwZmxhZ3M9XCIiOyBcCi0JZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAotCWVjaG8gUl9vcHRzPVwiLVIkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzE0IC1seiAtbG1cIjsgXAotCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZwotCWNobW9kICt4IGxpYnBuZy1jb25maWcKLQotJChMSUJTTyk6ICQoTElCU09NQUopCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKLQotJChMSUJTT01BSik6ICQoT0JKU0RMTCkKLQlAY2FzZSAiYHR5cGUgbGRgIiBpbiAqdWNiKikgXAotCWVjaG87IFwKLQllY2hvICcjIyBXQVJOSU5HOic7IFwKLQllY2hvICcjIyBUaGUgY29tbWFuZHMgIkNDIiBhbmQgIkxEIiBtdXN0IE5PVCByZWZlciB0byAvdXNyL3VjYi9jYyc7IFwKLQllY2hvICcjIyBhbmQgL3Vzci91Y2IvbGQuICBJZiB0aGV5IGRvLCB5b3UgbmVlZCB0byBhZGp1c3QgeW91ciBQQVRIJzsgXAotCWVjaG8gJyMjIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHB1dCAvdXNyL2Njcy9iaW4gYWhlYWQgb2YgL3Vzci91Y2IuJzsgXAotCWVjaG8gJyMjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMRF9MSUJSQVJZX1BBVEggc2hvdWxkIG5vdCBiZSBzZXQnOyBcCi0JZWNobyAnIyMgYXQgYWxsLiAgSWYgaXQgaXMsIHRoaW5ncyBhcmUgbGlrZWx5IHRvIGJyZWFrIGJlY2F1c2Ugb2YnOyBcCi0JZWNobyAnIyMgdGhlIGxpYnVjYiBkZXBlbmRlbmN5IHRoYXQgaXMgY3JlYXRlZC4nOyBcCi0JZWNobzsgXAotCTs7IFwKLQllc2FjCi0JJChMRCkgLUcgLWggJChMSUJTT01BSikgXAotCSAtbyAkKExJQlNPTUFKKSAkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKLQotaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZwotCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAtSSQoREkpIC1JJChaTElCSU5DKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYCBcCi0JICAgLUwkKERMKSAtTCQoWkxJQkxJQikgLVIkKFpMSUJMSUIpIC1SJChETCkKLQkuL3BuZ3Rlc3RkIHBuZ3Rlc3QucG5nCi0KLXRlc3QtaW5zdGFsbGVkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkuCi0JJChDQykgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtbyBwbmd0ZXN0aSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgIFwKLQkgICAtTCQoWkxJQkxJQikgLVIkKFpMSUJMSUIpCi0JLi9wbmd0ZXN0aSBwbmd0ZXN0LnBuZwotCi1jbGVhbjoKLQkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ3Rlc3RpIHBuZ291dC5wbmcgXAotCWxpYnBuZy1jb25maWcgJChMSUJTTykgJChMSUJTT01BSikqIFwKLQlsaWJwbmcucGMKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ2Vycm9yLm8gcG5nZXJyb3IucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3Jpby5vIHBuZ3Jpby5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdtZW0ubyBwbmdtZW0ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3NldC5vIHBuZ3NldC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyZWFkLm8gcG5ncmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnRyYW4ubyBwbmdydHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ndHJhbnMubyBwbmd0cmFucy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3JpdGUubyBwbmd3cml0ZS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3V0aWwubyBwbmd3dXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncHJlYWQubyBwbmdwcmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnN0ZCBiL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjg4NWEuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnN0ZAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZwotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hIGFuZCBwbmcuaAotcHJlZml4PS91c3IvbG9jYWwKLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChwcmVmaXgpL2xpYgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLSNaTElCTElCPS91c3IvbG9jYWwvbGliCi0jWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKLVpMSUJMSUI9Li4vemxpYgotWkxJQklOQz0uLi96bGliCi0KLUNDPWNjCi1BUl9SQz1hciByYwotTUtESVJfUD1ta2RpcgotTE5fU0Y9bG4gLXNmCi1SQU5MSUI9cmFubGliCi1STV9GPXJtIC1mCi0KLUNGTEFHUz0tSSQoWkxJQklOQykgLU8gIyAtZyAtRFBOR19ERUJVRz01Ci1MREZMQUdTPS1MLiAtTCQoWkxJQkxJQikgLWxwbmcgLWx6IC1sbQotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLWFsbDogbGlicG5nLmEgcG5ndGVzdAotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbDogbGlicG5nLmEKLQktQCQoTUtESVJfUCkgJChERVNURElSKSQoSU5DUEFUSCkKLQktQCQoTUtESVJfUCkgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCi0JLUAkKE1LRElSX1ApICQoREVTVERJUikkKExJQlBBVEgpCi0JLUAkKFJNX0YpICQoREVTVERJUikkKElOQ1BBVEgpL3BuZy5oCi0JLUAkKFJNX0YpICQoREVTVERJUikkKElOQ1BBVEgpL3BuZ2NvbmYuaAotCWNwIHBuZy5oICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZwotCWNwIHBuZ2NvbmYuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKLQljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZy5oCi0JY2htb2QgNjQ0ICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZy9wbmdjb25mLmgKLQkoY2QgJChERVNURElSKSQoSU5DUEFUSCk7IGxuIC1mIC1zIGxpYnBuZy8qIC4pCi0JY3AgbGlicG5nLmEgJChERVNURElSKSQoTElCUEFUSCkKLQljaG1vZCA2NDQgJChERVNURElSKSQoTElCUEFUSCkvbGlicG5nLmEKLQotY2xlYW46Ci0JJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmdvdXQucG5nCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ2Vycm9yLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3Jpby5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3aW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nbWVtLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3NldC5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdnZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdydXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3cml0ZS5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmd3dXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdwcmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc3Vub3MgYi9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc3Vub3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NDM3OWMuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnN1bm9zCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZwotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hIGFuZCBwbmcuaAotcHJlZml4PS91c3IvbG9jYWwKLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChwcmVmaXgpL2xpYgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLSNaTElCTElCPS91c3IvbG9jYWwvbGliCi0jWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKLVpMSUJMSUI9Li4vemxpYgotWkxJQklOQz0uLi96bGliCi0KLQotV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyAtV2NvbnZlcnNpb24gXAotCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAotCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMKLQotQ0M9Z2NjCi1BUl9SQz1hciByYwotTUtESVJfUD1ta2RpciAtcAotTE5fU0Y9bG4gLWYgLXMKLVJBTkxJQj1yYW5saWIKLVJNX0Y9L2Jpbi9ybSAtZgotCi1DRkxBR1M9LUkkKFpMSUJJTkMpIC1PICMgJChXQVJOTU9SRSkgLURQTkdfREVCVUc9NQotTERGTEFHUz0tTC4gLUwkKFpMSUJMSUIpIC1scG5nIC1seiAtbG0KLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1hbGw6IGxpYnBuZy5hIHBuZ3Rlc3QKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gbGlicG5nLmEKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGw6IGxpYnBuZy5hCi0JLUAkKE1LRElSX1ApICQoREVTVERJUikkKElOQ1BBVEgpCi0JLUAkKE1LRElSX1ApICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZwotCS1AJChNS0RJUl9QKSAkKERFU1RESVIpJChMSUJQQVRIKQotCS1AJChSTV9GKSAkKERFU1RESVIpJChJTkNQQVRIKS9wbmcuaAotCS1AJChSTV9GKSAkKERFU1RESVIpJChJTkNQQVRIKS9wbmdjb25mLmgKLQljcCBwbmcuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKLQljcCBwbmdjb25mLmggJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCi0JY2htb2QgNjQ0ICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZy9wbmcuaAotCWNobW9kIDY0NCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcvcG5nY29uZi5oCi0JKGNkICQoREVTVERJUikkKElOQ1BBVEgpOyAkKExOX1NGKSBsaWJwbmcvKiAuKQotCWNwIGxpYnBuZy5hICQoREVTVERJUikkKExJQlBBVEgpCi0JY2htb2QgNjQ0ICQoREVTVERJUikkKExJQlBBVEgpL2xpYnBuZy5hCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZwotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdlcnJvci5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdyaW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd2lvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ21lbS5vOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi1wbmdzZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nZ2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLXBuZ3JlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncnV0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ndHJhbnMubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3RyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5nd3V0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnRjMyBiL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS50YzMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNmFkZTYuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnRjMworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIGxpYnBuZwotIyBUdXJib0MvQysrIChOb3RlOiBBbGwgbW9kdWxlcyBhcmUgY29tcGlsZWQgaW4gQyBtb2RlKQotCi0jIFRvIHVzZSwgZG8gIm1ha2UgLWZtYWtlZmlsZS50YzMiCi0KLSMgLS0tLS0gVHVyYm8gQyAzLjAwIChjYW4gYmUgbW9kaWZpZWQgdG8gd29yayB3aXRoIGVhcmxpZXIgdmVyc2lvbnMpIC0tLS0tCi0KLU1PREVMPWwKLUNGTEFHUz0tTzIgLVogLW0kKE1PREVMKSAtSS4uXHpsaWIKLSNDRkxBR1M9LURfTk9fUFJPVE8gLU8yIC1aIC1tJChNT0RFTCkgLUkuLlx6bGliICAjIFR1cmJvIEMgb2xkZXIgdGhhbiAzLjAwCi1DQz10Y2MKLUxEPXRjYwotTElCPXRsaWIKLUxERkxBR1M9LW0kKE1PREVMKSAtTC4uXHpsaWIKLU89Lm9iagotRT0uZXhlCi0KLSMgdmFyaWFibGVzCi1PQkpTMSA9IHBuZyQoTykgcG5nc2V0JChPKSBwbmdnZXQkKE8pIHBuZ3J1dGlsJChPKSBwbmd0cmFucyQoTykgcG5nd3V0aWwkKE8pCi1PQkpTMiA9IHBuZ21lbSQoTykgcG5ncHJlYWQkKE8pIHBuZ3JlYWQkKE8pIHBuZ2Vycm9yJChPKSBwbmd3cml0ZSQoTykKLU9CSlMzID0gcG5ncnRyYW4kKE8pIHBuZ3d0cmFuJChPKSBwbmdyaW8kKE8pIHBuZ3dpbyQoTykKLU9CSlNMMSA9ICtwbmckKE8pICtwbmdzZXQkKE8pICtwbmdnZXQkKE8pICtwbmdydXRpbCQoTykgK3BuZ3RyYW5zJChPKQotT0JKU0wyID0gK3BuZ3d1dGlsJChPKSArcG5nbWVtJChPKSArcG5ncHJlYWQkKE8pICtwbmdyZWFkJChPKSArcG5nZXJyb3IkKE8pCi1PQkpTTDMgPSArcG5nd3JpdGUkKE8pICtwbmdydHJhbiQoTykgK3BuZ3d0cmFuJChPKSArcG5ncmlvJChPKSArcG5nd2lvJChPKQotCi1hbGw6IGxpYnBuZyQoTU9ERUwpLmxpYiBwbmd0ZXN0JChFKQotCi1wbmd0ZXN0OiBwbmd0ZXN0JChFKQotCi10ZXN0OiBwbmd0ZXN0JChFKQotCXBuZ3Rlc3QkKEUpCi0KLXBuZyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkJICAkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1wbmdzZXQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JCSAgJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotcG5nZ2V0JChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCQkgICQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLXBuZ3JlYWQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JCSAgJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotcG5ncHJlYWQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JCSAgJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotcG5ncnRyYW4kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JCSAgJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotcG5ncnV0aWwkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JCSAgJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotcG5nZXJyb3IkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotcG5nbWVtJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLXBuZ3JpbyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1wbmd3aW8kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotcG5ndGVzdCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLXBuZ3RyYW5zJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLXBuZ3dyaXRlJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLXBuZ3d0cmFuJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLXBuZ3d1dGlsJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLWxpYnBuZyQoTU9ERUwpLmxpYjogJChPQkpTMSkgJChPQkpTMikgJChPQkpTMykKLQkkKExJQikgbGlicG5nJChNT0RFTCkgKyQoT0JKU0wxKQotCSQoTElCKSBsaWJwbmckKE1PREVMKSArJChPQkpTTDIpCi0JJChMSUIpIGxpYnBuZyQoTU9ERUwpICskKE9CSlNMMykKLQotcG5ndGVzdCQoRSk6IHBuZ3Rlc3QkKE8pIGxpYnBuZyQoTU9ERUwpLmxpYgotCSQoTEQpICQoTERGTEFHUykgcG5ndGVzdC5vYmogbGlicG5nJChNT0RFTCkubGliIHpsaWJfJChNT0RFTCkubGliCi0KLSMgRW5kIG9mIG1ha2VmaWxlIGZvciBsaWJwbmcKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS52Y3dpbjMyIGIvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnZjd2luMzIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyM2MwNzUuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnZjd2luMzIKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nCi0jIENvcHlyaWdodCAoQykgMTk5OCBUaW0gV2VnbmVyCi0jIENvcHlyaWdodCAoQykgMjAwNiwyMDA5IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0jCi0jIEFzc3VtZXMgdGhhdCB6bGliLmxpYiwgemNvbmYuaCwgYW5kIHpsaWIuaCBoYXZlIGJlZW4gY29waWVkIHRvIC4uXHpsaWIKLSMgVG8gdXNlLCBkbyAibm1ha2UgL2Ygc2NyaXB0c1xtYWtlZmlsZS52Y3dpbjMyIgotCi0jIC0tLS0tLS0tIE1pY3Jvc29mdCBWaXN1YWwgQysrIDIuMCBhbmQgbGF0ZXIsIG5vIGFzc2VtYmxlciBjb2RlIC0tLS0tLS0tCi0KLSMgQ29tcGlsZXIsIGxpbmtlciwgbGlicmFyaWFuLCBhbmQgb3RoZXIgdG9vbHMKLUNDID0gY2wKLUxEID0gbGluawotQVIgPSBsaWIKLUNGTEFHUyAgPSAtbm9sb2dvIC1EX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIC1NRCAtTzIgLVczIC1JLi5cemxpYgotTERGTEFHUyA9IC1ub2xvZ28KLUFSRkxBR1MgPSAtbm9sb2dvCi1STSA9IGRlbAotCi0jIEZpbGUgZXh0ZW5zaW9ucwotTz0ub2JqCi0KLSN1bmNvbW1lbnQgbmV4dCB0byBwdXQgZXJyb3IgbWVzc2FnZXMgaW4gYSBmaWxlCi0jRVJSRklMRT0gPj4gcG5nZXJycy5sb2cKLQotIyBWYXJpYWJsZXMKLU9CSlMxID0gcG5nJChPKSBwbmdlcnJvciQoTykgcG5nZ2V0JChPKSBwbmdtZW0kKE8pIHBuZ3ByZWFkJChPKQotT0JKUzIgPSBwbmdyZWFkJChPKSBwbmdyaW8kKE8pIHBuZ3J0cmFuJChPKSBwbmdydXRpbCQoTykgcG5nc2V0JChPKQotT0JKUzMgPSBwbmd0cmFucyQoTykgcG5nd2lvJChPKSBwbmd3cml0ZSQoTykgcG5nd3RyYW4kKE8pIHBuZ3d1dGlsJChPKQotT0JKUyAgPSAkKE9CSlMxKSAkKE9CSlMyKSAkKE9CSlMzKQotCi0jIFRhcmdldHMKLWFsbDogbGlicG5nLmxpYgotCi1wbmckKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdzZXQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdnZXQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdyZWFkJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncHJlYWQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdydHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3J1dGlsJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nZXJyb3IkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdtZW0kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdyaW8kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd3aW8kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd0cmFucyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3dyaXRlJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nd3RyYW4kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd3dXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLWxpYnBuZy5saWI6ICQoT0JKUykKLQktJChSTSkgJEAKLQkkKEFSKSAkKEFSRkxBR1MpIC1vdXQ6JEAgJChPQkpTKSAkKEVSUkZJTEUpCi0KLXBuZ3Rlc3QkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3Rlc3QuZXhlOiBwbmd0ZXN0JChPKSBsaWJwbmcubGliCi0JJChMRCkgJChMREZMQUdTKSAtb3V0OiRAIHBuZ3Rlc3QkKE8pIGxpYnBuZy5saWIgLi5cemxpYlx6bGliLmxpYiAkKEVSUkZJTEUpCi0KLXRlc3Q6IHBuZ3Rlc3QuZXhlCi0JcG5ndGVzdAotCi1jbGVhbjoKLQktJChSTSkgKiQoTykKLQktJChSTSkgbGlicG5nLmxpYgotCS0kKFJNKSBwbmd0ZXN0LmV4ZQotCS0kKFJNKSBwbmdvdXQucG5nCi0KLSMgRW5kIG9mIG1ha2VmaWxlIGZvciBsaWJwbmcKLQpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLndhdGNvbSBiL3NyYy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS53YXRjb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNGQ1MzQuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLndhdGNvbQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBsaWJwbmcKLSMgV2F0Y29tIEMvQysrIDEwLjAgYW5kIGxhdGVyLCAzMi1iaXQgcHJvdGVjdGVkIG1vZGUsIGZsYXQgbWVtb3J5IG1vZGVsCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAwLCBQYXdlbCBNcm9jaGVuLCBiYXNlZCBvbiBtYWtlZmlsZS5tc2Mgd2hpY2ggaXMKLSMgY29weXJpZ2h0IDE5OTUgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBUbyB1c2UsIGRvICJ3bWFrZSAvZiBzY3JpcHRzXG1ha2VmaWxlLndhdGNvbSIKLQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2F0Y29tIEMvQysrIDEwLjAgYW5kIGxhdGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotWkxJQkxJQj0uLlx6bGliCi1aTElCSU5DPS4uXHpsaWIKLQotIyBUYXJnZXQgT1MKLU9TPURPUwotI09TPU5UCi0KLSMgVGFyZ2V0IENQVQotQ1BVPTYJCSMgUGVudGl1bSBQcm8KLSNDUFU9NQkJIyBQZW50aXVtCi0KLSMgQ2FsbGluZyBjb252ZW50aW9uCi1DQUxMSU5HPXIJIyByZWdpc3RlcnMKLSNDQUxMSU5HPXMJIyBzdGFjawotCi0jIFVuY29tbWVudCBuZXh0IHRvIHB1dCBlcnJvciBtZXNzYWdlcyBpbiBhIGZpbGUKLSNFUlJGSUxFPT4+cG5nZXJycwotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotQ0M9d2NjMzg2Ci1DRkxBR1M9LSQoQ1BVKSQoQ0FMTElORykgLWZwJChDUFUpIC1mcGk4NyAtb25lYXR4IC1tZiAtYnQ9JChPUykgLWk9JChaTElCSU5DKSAtenEKLUxEPXdjbDM4NgotTERGTEFHUz0tenEKLQotTz0ub2JqCi0KLU9CSlMxPXBuZyQoTykgcG5nc2V0JChPKSBwbmdnZXQkKE8pIHBuZ3J1dGlsJChPKSBwbmd0cmFucyQoTykgcG5nd3V0aWwkKE8pCi1PQkpTMj1wbmdtZW0kKE8pIHBuZ3ByZWFkJChPKSBwbmdyZWFkJChPKSBwbmdlcnJvciQoTykgcG5nd3JpdGUkKE8pCi1PQkpTMz1wbmdydHJhbiQoTykgcG5nd3RyYW4kKE8pIHBuZ3JpbyQoTykgcG5nd2lvJChPKQotCi0KLWFsbDogdGVzdAotCi1wbmckKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdzZXQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdnZXQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdyZWFkJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncHJlYWQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdydHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3J1dGlsJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nZXJyb3IkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdtZW0kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdyaW8kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd3aW8kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd0ZXN0JChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd0cmFucyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3dyaXRlJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nd3RyYW4kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd3dXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLWxpYnBuZy5saWI6ICQoT0JKUzEpICQoT0JKUzIpICQoT0JKUzMpCi0Jd2xpYiAtYiAtYyAtbiAtcSBsaWJwbmcubGliICQoT0JKUzEpCi0Jd2xpYiAtYiAtYyAtcSBsaWJwbmcubGliICQoT0JKUzIpCi0Jd2xpYiAtYiAtYyAtcSBsaWJwbmcubGliICQoT0JKUzMpCi0KLXBuZ3Rlc3QuZXhlOiBwbmd0ZXN0Lm9iaiBsaWJwbmcubGliCi0JJChMRCkgJChMREZMQUdTKSBwbmd0ZXN0Lm9iaiBsaWJwbmcubGliICQoWkxJQkxJQilcemxpYi5saWIKLQotdGVzdDogcG5ndGVzdC5leGUgLnN5bWJvbGljCi0JcG5ndGVzdC5leGUKLQotCi0jIEVuZCBvZiBtYWtlZmlsZSBmb3IgbGlicG5nCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZXZtcy5jb20gYi9zcmMvbGlicG5nL3NjcmlwdHMvbWFrZXZtcy5jb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJmYTlkMGQuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL21ha2V2bXMuY29tCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLSQhIG1ha2UgbGlicG5nIHVuZGVyIFZNUwotJCEKLSQhCi0kISBDaGVjayBmb3IgTU1LL01NUwotJCEKLSQhIFRoaXMgcHJvY2VkdXJlIGFjY2VwdHMgb25lIHBhcmFtZXRlciAoY29udHJpYiksIHdoaWNoIGNhdXNlcyBpdCB0byBidWlsZAotJCEgdGhlIHByb2dyYW1zIGZyb20gdGhlIGNvbnRyaWIgZGlyZWN0b3J5IGluc3RlYWQgb2YgbGlicG5nLgotJCEKLSQgcDEgPSBmJGVkaXQocDEsIlVQQ0FTRSIpCi0kIGlmIHAxIC5lcXMuICJDT05UUklCIgotJCB0aGVuCi0kICAgc2V0IGRlZiBbLmNvbnRyaWIuZ3JlZ2Jvb2tdCi0kICAgQG1ha2V2bXMKLSQgICBzZXQgZGVmIFstLnBuZ21pbnVzXQotJCAgIEBtYWtldm1zCi0kICAgc2V0IGRlZiBbLS1dCi0kICAgZXhpdAotJCBlbmRpZgotJCBNYWtlID0gIiIKLSQgSWYgRiRTZWFyY2ggKCJTeXMkU3lzdGVtOk1NUy5FWEUiKSAubmVzLiAiIiBUaGVuIE1ha2UgPSAiTU1TIgotJCBJZiBGJFR5cGUgKE1NSykgLmVxcy4gIlNUUklORyIgVGhlbiBNYWtlID0gIk1NSyIKLSQhCi0kISBMb29rIGZvciB0aGUgY29tcGlsZXIgdXNlZAotJCEKLSQgemxpYnNyYyA9ICJbLS56bGliXSIKLSQgY2NvcHQ9Ii9pbmNsdWRlPScnemxpYnNyYyciCi0kIGlmIGYkZ2V0c3lpKCJIV19NT0RFTCIpLmdlLjEwMjQKLSQgdGhlbgotJCAgY2NvcHQgPSAiL3ByZWZpeD1hbGwiK2Njb3B0Ci0kICBjb21wICA9ICJfX2RlY2NfXz0xIgotJCAgaWYgZiR0cm5sbm0oIlNZUyIpLmVxcy4iIiB0aGVuIGRlZmluZSBzeXMgc3lzJGxpYnJhcnk6Ci0kIGVsc2UKLSQgIGlmIGYkc2VhcmNoKCJTWVMkU1lTVEVNOkRFQ0MkQ09NUElMRVIuRVhFIikuZXFzLiIiCi0kICAgdGhlbgotJCAgICBpZiBmJHRybmxubSgiU1lTIikuZXFzLiIiIHRoZW4gZGVmaW5lIHN5cyBzeXMkbGlicmFyeToKLSQgICAgaWYgZiRzZWFyY2goIlNZUyRTWVNURU06VkFYQy5FWEUiKS5lcXMuIiIKLSQgICAgIHRoZW4KLSQgICAgICBjb21wICA9ICJfX2djY19fPTEiCi0kICAgICAgQ0MgOj09IEdDQwotJCAgICAgZWxzZQotJCAgICAgIGNvbXAgPSAiX192YXhjX189MSIKLSQgICAgIGVuZGlmCi0kICAgZWxzZQotJCAgICBpZiBmJHRybmxubSgiU1lTIikuZXFzLiIiIHRoZW4gZGVmaW5lIHN5cyBkZWNjJGxpYnJhcnlfaW5jbHVkZToKLSQgICAgY2NvcHQgPSAiL2RlY2MvcHJlZml4PWFsbCIrY2NvcHQKLSQgICAgY29tcCAgPSAiX19kZWNjX189MSIKLSQgIGVuZGlmCi0kIGVuZGlmCi0kIQotJCEgQnVpbGQgdGhlIHRoaW5nIHBsYWluIG9yIHdpdGggbW1zL21tawotJCEKLSQgd3JpdGUgc3lzJG91dHB1dCAiQ29tcGlsaW5nIExpYnBuZyBzb3VyY2VzIC4uLiIKLSQgaWYgbWFrZS5lcXMuIiIKLSQgIHRoZW4KLSQgICBkZWxlIHBuZ3Rlc3Qub2JqOyoKLSQgICBDQUxMIE1BS0UgcG5nLk9CSiAiY2MgJydDQ09QVCcgcG5nIiAtCi0JcG5nLmMgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotJCAgIENBTEwgTUFLRSBwbmdzZXQuT0JKICJjYyAnJ0NDT1BUJyBwbmdzZXQiIC0KLQlwbmdzZXQuYyBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0kICAgQ0FMTCBNQUtFIHBuZ2dldC5PQkogImNjICcnQ0NPUFQnIHBuZ2dldCIgLQotCXBuZ2dldC5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLSQgICBDQUxMIE1BS0UgcG5ncmVhZC5PQkogImNjICcnQ0NPUFQnIHBuZ3JlYWQiIC0KLQlwbmdyZWFkLmMgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotJCAgIENBTEwgTUFLRSBwbmdwcmVhZC5PQkogImNjICcnQ0NPUFQnIHBuZ3ByZWFkIiAtCi0JcG5ncHJlYWQuYyBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0kICAgQ0FMTCBNQUtFIHBuZ3J0cmFuLk9CSiAiY2MgJydDQ09QVCcgcG5ncnRyYW4iIC0KLQlwbmdydHJhbi5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLSQgICBDQUxMIE1BS0UgcG5ncnV0aWwuT0JKICJjYyAnJ0NDT1BUJyBwbmdydXRpbCIgLQotCXBuZ3J1dGlsLmMgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotJCAgIENBTEwgTUFLRSBwbmdlcnJvci5PQkogImNjICcnQ0NPUFQnIHBuZ2Vycm9yIiAtCi0JcG5nZXJyb3IuYyBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0kICAgQ0FMTCBNQUtFIHBuZ21lbS5PQkogImNjICcnQ0NPUFQnIHBuZ21lbSIgLQotCXBuZ21lbS5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLSQgICBDQUxMIE1BS0UgcG5ncmlvLk9CSiAiY2MgJydDQ09QVCcgcG5ncmlvIiAtCi0JcG5ncmlvLmMgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotJCAgIENBTEwgTUFLRSBwbmd3aW8uT0JKICJjYyAnJ0NDT1BUJyBwbmd3aW8iIC0KLQlwbmd3aW8uYyBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0kICAgQ0FMTCBNQUtFIHBuZ3RyYW5zLk9CSiAiY2MgJydDQ09QVCcgcG5ndHJhbnMiIC0KLQlwbmd0cmFucy5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLSQgICBDQUxMIE1BS0UgcG5nd3JpdGUuT0JKICJjYyAnJ0NDT1BUJyBwbmd3cml0ZSIgLQotCXBuZ3dyaXRlLmMgcG5nLmggcG5nY29uZi5oIHBuZ3ByaXYuaAotJCAgIENBTEwgTUFLRSBwbmd3dHJhbi5PQkogImNjICcnQ0NPUFQnIHBuZ3d0cmFuIiAtCi0JcG5nd3RyYW4uYyBwbmcuaCBwbmdjb25mLmggcG5ncHJpdi5oCi0kICAgQ0FMTCBNQUtFIHBuZ3d1dGlsLk9CSiAiY2MgJydDQ09QVCcgcG5nd3V0aWwiIC0KLQlwbmd3dXRpbC5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdwcml2LmgKLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJCdWlsZGluZyBMaWJwbmcgLi4uIgotJCAgIENBTEwgTUFLRSBsaWJwbmcuT0xCICJsaWIvY3JlYSBsaWJwbmcub2xiICoub2JqIiAqLk9CSgotJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIHBuZ3Rlc3QuLi4iCi0kICAgQ0FMTCBNQUtFIHBuZ3Rlc3QuT0JKICJjYyAnJ0NDT1BUJyBwbmd0ZXN0IiAtCi0JcG5ndGVzdC5jIHBuZy5oIHBuZ2NvbmYuaAotJCAgIGNhbGwgbWFrZSBwbmd0ZXN0LmV4ZSAtCi0JIkxJTksgcG5ndGVzdCxsaWJwbmcub2xiL2xpYiwnJ3psaWJzcmMnbGliei5vbGIvbGliIiAtCi0JcG5ndGVzdC5vYmogbGlicG5nLm9sYgotJCAgIHdyaXRlIHN5cyRvdXRwdXQgIlRlc3RpbmcgTGlicG5nLi4uIgotJCAgIHJ1biBwbmd0ZXN0Ci0kICBlbHNlCi0kICAgaWYgZiRzZWFyY2goIkRFU0NSSVAuTU1TIikgLmVxcy4gIiIgdGhlbiBjb3B5L25vbG9nIFsuU0NSSVBUU11ERVNDUklQLk1NUyBbXQotJCAgICdtYWtlJy9tYWNybz0oJ2NvbXAnLHpsaWJzcmM9J3psaWJzcmMnKQotJCAgZW5kaWYKLSQgd3JpdGUgc3lzJG91dHB1dCAiTGlicG5nIGJ1aWxkIGNvbXBsZXRlZCIKLSQgZXhpdAotJCEKLSQhCi0kTUFLRTogU1VCUk9VVElORSAgICFTVUJST1VUSU5FIFRPIENIRUNLIERFUEVOREVOQ0lFUwotJCBWID0gJ0YkVmVyaWZ5KDApCi0kISBQMSA9IFdoYXQgd2UgYXJlIHRyeWluZyB0byBtYWtlCi0kISBQMiA9IENvbW1hbmQgdG8gbWFrZSBpdAotJCEgUDMgLSBQOCAgV2hhdCBpdCBkZXBlbmRzIG9uCi0kCi0kIElmIEYkU2VhcmNoKFAxKSAuRXFzLiAiIiBUaGVuIEdvdG8gTWFrZWl0Ci0kIFRpbWUgPSBGJEN2VGltZShGJEZpbGUoUDEsIlJEVCIpKQotJGFyZz0zCi0kTG9vcDoKLSQgICAgICAgQXJndW1lbnQgPSBQJ2FyZwotJCAgICAgICBJZiBBcmd1bWVudCAuRXFzLiAiIiBUaGVuIEdvdG8gRXhpdAotJCAgICAgICBFbD0wCi0kTG9vcDI6Ci0kICAgICAgIEZpbGUgPSBGJEVsZW1lbnQoRWwsIiAiLEFyZ3VtZW50KQotJCAgICAgICBJZiBGaWxlIC5FcXMuICIgIiBUaGVuIEdvdG8gRW5kbAotJCAgICAgICBBRmlsZSA9ICIiCi0kTG9vcDM6Ci0kICAgICAgIE9GaWxlID0gQUZpbGUKLSQgICAgICAgQUZpbGUgPSBGJFNlYXJjaChGaWxlKQotJCAgICAgICBJZiBBRmlsZSAuRXFzLiAiIiAuT3IuIEFGaWxlIC5FcXMuIE9GaWxlIFRoZW4gR290byBOZXh0RWwKLSQgICAgICAgSWYgRiRDdlRpbWUoRiRGaWxlKEFGaWxlLCJSRFQiKSkgLkdlcy4gVGltZSBUaGVuIEdvdG8gTWFrZWl0Ci0kICAgICAgIEdvdG8gTG9vcDMKLSROZXh0RUw6Ci0kICAgICAgIEVsID0gRWwgKyAxCi0kICAgICAgIEdvdG8gTG9vcDIKLSRFbmRMOgotJCBhcmc9YXJnKzEKLSQgSWYgYXJnIC5MZS4gOCBUaGVuIEdvdG8gTG9vcAotJCBHb3RvIEV4aXQKLSQKLSRNYWtlaXQ6Ci0kIFZWPUYkVkVSSUZZKDApCi0kIHdyaXRlIHN5cyRvdXRwdXQgUDIKLSQgJ1AyCi0kIFZWPSdGJFZlcmlmeShWVikKLSRFeGl0OgotJCBJZiBWIFRoZW4gU2V0IFZlcmlmeQotJEVORFNVQlJPVVRJTkUKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9wbmczMmNlLmRlZiBiL3NyYy9saWJwbmcvc2NyaXB0cy9wbmczMmNlLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY2MTA3Mi4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3NjcmlwdHMvcG5nMzJjZS5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMSUJQTkcgbW9kdWxlIGRlZmluaXRpb24gZmlsZSBmb3IgV2luZG93cwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1MSUJSQVJZIGxwbmdjZQotCi0gcG5nX21lbWNweV9jaGVjawotIHBuZ19tZW1zZXRfY2hlY2sKLSBwbmdfc2V0X3F1YW50aXplCi0gcG5nX3JlYWRfaW5pdF8zCi0gcG5nX3dyaXRlX2luaXRfMwotIHBuZ19zZXRfc3RyaXBfZXJyb3JfbnVtYmVycwotIHBuZ19nZXRfdWludF8zMgotIHBuZ19nZXRfdWludF8xNgotIHBuZ19nZXRfaW50XzMyCi0KLUVYUE9SVFMKLTtWZXJzaW9uIDEuNC4xMgotICBwbmdfYnVpbGRfZ3JheXNjYWxlX3BhbGV0dGUgIEAxCi07ICBwbmdfY2hlY2tfc2lnICAgICAgICBAMgotICBwbmdfY2h1bmtfZXJyb3IgICAgICBAMwotICBwbmdfY2h1bmtfd2FybmluZyAgICAgIEA0Ci07ICBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSAgIEA1Ci07ICBwbmdfY29udmVydF9mcm9tX3RpbWVfdCAgICBANgotICBwbmdfY3JlYXRlX2luZm9fc3RydWN0ICAgICBANwotICBwbmdfY3JlYXRlX3JlYWRfc3RydWN0ICAgICBAOAotICBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCAgICBAOQotICBwbmdfZGF0YV9mcmVlciAgICBAMTAKLSAgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QgIEAxMQotICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCAgQDEyCi0gIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCAgQDEzCi0gIHBuZ19lcnJvciAgICBAMTQKLSAgcG5nX2ZyZWUgICAgICBAMTUKLSAgcG5nX2ZyZWVfZGF0YSAgICBAMTYKLSAgcG5nX2dldF9JSERSICAgIEAxNwotICBwbmdfZ2V0X1BMVEUgICAgQDE4Ci0gIHBuZ19nZXRfYktHRCAgICBAMTkKLSAgcG5nX2dldF9iaXRfZGVwdGggICAgQDIwCi0gIHBuZ19nZXRfY0hSTSAgICBAMjEKLSAgcG5nX2dldF9jSFJNX2ZpeGVkICBAMjIKLSAgcG5nX2dldF9jaGFubmVscyAgICBAMjMKLSAgcG5nX2dldF9jb2xvcl90eXBlICBAMjQKLSAgcG5nX2dldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSAgQDI1Ci0gIHBuZ19nZXRfY29tcHJlc3Npb25fdHlwZSAgQDI2Ci0gIHBuZ19nZXRfY29weXJpZ2h0ICAgIEAyNwotICBwbmdfZ2V0X2Vycm9yX3B0ciAgICBAMjgKLSAgcG5nX2dldF9maWx0ZXJfdHlwZSAgQDI5Ci0gIHBuZ19nZXRfZ0FNQSAgICBAMzAKLSAgcG5nX2dldF9nQU1BX2ZpeGVkICBAMzEKLSAgcG5nX2dldF9oSVNUICAgIEAzMgotICBwbmdfZ2V0X2hlYWRlcl92ZXIgIEAzMwotICBwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uICBAMzQKLSAgcG5nX2dldF9pQ0NQICAgIEAzNQotICBwbmdfZ2V0X2ltYWdlX2hlaWdodCAgQDM2Ci0gIHBuZ19nZXRfaW1hZ2Vfd2lkdGggIEAzNwotICBwbmdfZ2V0X2ludGVybGFjZV90eXBlICBAMzgKLSAgcG5nX2dldF9pb19wdHIgICAgQDM5Ci0gIHBuZ19nZXRfbGlicG5nX3ZlciAgQDQwCi0gIHBuZ19nZXRfb0ZGcyAgICBANDEKLSAgcG5nX2dldF9wQ0FMICAgIEA0MgotICBwbmdfZ2V0X3BIWXMgICAgQDQzCi0gIHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvICBANDQKLSAgcG5nX2dldF9waXhlbHNfcGVyX21ldGVyICBANDUKLSAgcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIgIEA0NgotICBwbmdfZ2V0X3JnYl90b19ncmF5X3N0YXR1cyAgQDQ3Ci0gIHBuZ19nZXRfcm93Ynl0ZXMgICAgQDQ4Ci0gIHBuZ19nZXRfcm93cyAgICBANDkKLSAgcG5nX2dldF9zQklUICAgIEA1MAotICBwbmdfZ2V0X3NDQUwgICAgQDUxCi0gIHBuZ19nZXRfc1BMVCAgICBANTIKLSAgcG5nX2dldF9zUkdCICAgIEA1MwotICBwbmdfZ2V0X3NpZ25hdHVyZSAgICBANTQKLSAgcG5nX2dldF90SU1FICAgIEA1NQotICBwbmdfZ2V0X3RSTlMgICAgQDU2Ci0gIHBuZ19nZXRfdGV4dCAgICBANTcKLSAgcG5nX2dldF91bmtub3duX2NodW5rcyAgQDU4Ci0gIHBuZ19nZXRfdXNlcl9jaHVua19wdHIgIEA1OQotICBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0ciAgQDYwCi0gIHBuZ19nZXRfdmFsaWQgICAgQDYxCi0gIHBuZ19nZXRfeF9vZmZzZXRfbWljcm9ucyAgQDYyCi0gIHBuZ19nZXRfeF9vZmZzZXRfcGl4ZWxzICBANjMKLSAgcG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIgIEA2NAotICBwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMgIEA2NQotICBwbmdfZ2V0X3lfb2Zmc2V0X3BpeGVscyAgQDY2Ci0gIHBuZ19nZXRfeV9waXhlbHNfcGVyX21ldGVyICBANjcKLSAgcG5nX21hbGxvYyAgICBANjgKLTsgIHBuZ19tZW1jcHlfY2hlY2sgICAgQDY5Ci07ICBwbmdfbWVtc2V0X2NoZWNrICAgIEA3MAotICBwbmdfcGVybWl0X2VtcHR5X3BsdGUgIEA3MQotICBwbmdfcHJvY2Vzc19kYXRhICAgIEA3MgotICBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cgIEA3MwotICBwbmdfcmVhZF9lbmQgICAgQDc0Ci0gIHBuZ19yZWFkX2ltYWdlICAgIEA3NQotICBwbmdfcmVhZF9pbmZvICAgIEA3NgotOyBwbmdfcmVhZF9pbml0IGlzIGRlcHJlY2F0ZWQKLSAgcG5nX3JlYWRfaW5pdCAgICBANzcKLSAgcG5nX3JlYWRfcG5nICAgIEA3OAotICBwbmdfcmVhZF9yb3cgICAgQDc5Ci0gIHBuZ19yZWFkX3Jvd3MgICAgQDgwCi0gIHBuZ19yZWFkX3VwZGF0ZV9pbmZvICBAODEKLSAgcG5nX3Jlc2V0X3pzdHJlYW0gICAgQDgyCi0gIHBuZ19zZXRfSUhEUiAgICBAODMKLSAgcG5nX3NldF9QTFRFICAgIEA4NAotICBwbmdfc2V0X2JLR0QgICAgQDg1Ci0gIHBuZ19zZXRfYmFja2dyb3VuZCAgQDg2Ci0gIHBuZ19zZXRfYmdyICAgIEA4NwotICBwbmdfc2V0X2NIUk0gICAgQDg4Ci0gIHBuZ19zZXRfY0hSTV9maXhlZCAgQDg5Ci0gIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUgIEA5MAotICBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsICBAOTEKLSAgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwgIEA5MgotICBwbmdfc2V0X2NvbXByZXNzaW9uX21ldGhvZCAgQDkzCi0gIHBuZ19zZXRfY29tcHJlc3Npb25fc3RyYXRlZ3kgIEA5NAotICBwbmdfc2V0X2NvbXByZXNzaW9uX3dpbmRvd19iaXRzICBAOTUKLSAgcG5nX3NldF9jcmNfYWN0aW9uICBAOTYKLSAgcG5nX3NldF9xdWFudGl6ZSAgICBAOTcKLSAgcG5nX3NldF9lcnJvcl9mbiAgICBAOTgKLSAgcG5nX3NldF9leHBhbmQgICAgQDk5Ci0gIHBuZ19zZXRfZmlsbGVyICAgIEAxMDAKLSAgcG5nX3NldF9maWx0ZXIgICAgQDEwMQotICBwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzICBAMTAyCi0gIHBuZ19zZXRfZmx1c2ggICAgQDEwMwotICBwbmdfc2V0X2dBTUEgICAgQDEwNAotICBwbmdfc2V0X2dBTUFfZml4ZWQgIEAxMDUKLSAgcG5nX3NldF9nYW1tYSAgICBAMTA2Ci0gIHBuZ19zZXRfZ3JheV8xXzJfNF90b184ICBAMTA3IDsgZGVwcmVjYXRlZAotICBwbmdfc2V0X2dyYXlfdG9fcmdiICBAMTA4Ci0gIHBuZ19zZXRfaElTVCAgICBAMTA5Ci0gIHBuZ19zZXRfaUNDUCAgICBAMTEwCi0gIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nICBAMTExCi0gIHBuZ19zZXRfaW52ZXJ0X2FscGhhICBAMTEyCi0gIHBuZ19zZXRfaW52ZXJ0X21vbm8gIEAxMTMKLSAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzICBAMTE0Ci0gIHBuZ19zZXRfb0ZGcyAgICBAMTE1Ci0gIHBuZ19zZXRfcENBTCAgICBAMTE2Ci0gIHBuZ19zZXRfcEhZcyAgICBAMTE3Ci0gIHBuZ19zZXRfcGFja2luZyAgICBAMTE4Ci0gIHBuZ19zZXRfcGFja3N3YXAgICAgQDExOQotICBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiICBAMTIwCi0gIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbiAgQDEyMQotICBwbmdfc2V0X3JlYWRfZm4gICAgQDEyMgotICBwbmdfc2V0X3JlYWRfc3RhdHVzX2ZuICBAMTIzCi0gIHBuZ19zZXRfcmVhZF91c2VyX2NodW5rX2ZuICBAMTI0Ci0gIHBuZ19zZXRfcmVhZF91c2VyX3RyYW5zZm9ybV9mbiAgQDEyNQotICBwbmdfc2V0X3JnYl90b19ncmF5ICBAMTI2Ci0gIHBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQgIEAxMjcKLSAgcG5nX3NldF9yb3dzICAgIEAxMjgKLSAgcG5nX3NldF9zQklUICAgIEAxMjkKLSAgcG5nX3NldF9zQ0FMICAgIEAxMzAKLSAgcG5nX3NldF9zUExUICAgIEAxMzEKLSAgcG5nX3NldF9zUkdCICAgIEAxMzIKLSAgcG5nX3NldF9zUkdCX2dBTUFfYW5kX2NIUk0gIEAxMzMKLSAgcG5nX3NldF9zaGlmdCAgICBAMTM0Ci0gIHBuZ19zZXRfc2lnX2J5dGVzICAgIEAxMzUKLSAgcG5nX3NldF9zdHJpcF8xNiAgICBAMTM2Ci0gIHBuZ19zZXRfc3RyaXBfYWxwaGEgIEAxMzcKLSAgcG5nX3NldF9zd2FwICAgIEAxMzgKLSAgcG5nX3NldF9zd2FwX2FscGhhICBAMTM5Ci0gIHBuZ19zZXRfdElNRSAgICBAMTQwCi0gIHBuZ19zZXRfdFJOUyAgICBAMTQxCi0gIHBuZ19zZXRfdFJOU190b19hbHBoYSAgQDE0MgotICBwbmdfc2V0X3RleHQgICAgQDE0MwotICBwbmdfc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24gIEAxNDQKLSAgcG5nX3NldF91bmtub3duX2NodW5rcyAgQDE0NQotICBwbmdfc2V0X3VzZXJfdHJhbnNmb3JtX2luZm8gIEAxNDYKLSAgcG5nX3NldF93cml0ZV9mbiAgICBAMTQ3Ci0gIHBuZ19zZXRfd3JpdGVfc3RhdHVzX2ZuICBAMTQ4Ci0gIHBuZ19zZXRfd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4gIEAxNDkKLSAgcG5nX3NpZ19jbXAgICAgQDE1MAotICBwbmdfc3RhcnRfcmVhZF9pbWFnZSAgQDE1MQotICBwbmdfd2FybmluZyAgICBAMTUyCi0gIHBuZ193cml0ZV9jaHVuayAgICBAMTUzCi0gIHBuZ193cml0ZV9jaHVua19kYXRhICBAMTU0Ci0gIHBuZ193cml0ZV9jaHVua19lbmQgIEAxNTUKLSAgcG5nX3dyaXRlX2NodW5rX3N0YXJ0ICBAMTU2Ci0gIHBuZ193cml0ZV9lbmQgICAgQDE1NwotICBwbmdfd3JpdGVfZmx1c2ggICAgQDE1OAotICBwbmdfd3JpdGVfaW1hZ2UgICAgQDE1OQotICBwbmdfd3JpdGVfaW5mbyAgICBAMTYwCi0gIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFICBAMTYxCi07IHBuZ193cml0ZV9pbml0IGlzIGRlcHJlY2F0ZWQKLSAgcG5nX3dyaXRlX2luaXQgICAgQDE2MgotICBwbmdfd3JpdGVfcG5nICAgIEAxNjMKLSAgcG5nX3dyaXRlX3JvdyAgICBAMTY0Ci0gIHBuZ193cml0ZV9yb3dzICAgIEAxNjUKLTsgcG5nX3JlYWRfaW5pdF8yIGFuZCBwbmdfd3JpdGVfaW5pdF8yIGFyZSBkZXByZWNhdGVkLgotICBwbmdfcmVhZF9pbml0XzIgICAgQDE2NgotICBwbmdfd3JpdGVfaW5pdF8yICAgIEAxNjcKLSAgcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlciAgQDE2OAotOyAgcG5nX3NpZ19ieXRlcyAgICBAMTY5Ci07ICBwbmdfbGlicG5nX3ZlciAgICBAMTcwCi0gIHBuZ19pbml0X2lvICAgIEAxNzEKLSAgcG5nX2NvbnZlcnRfdG9fcmZjMTEyMyAgICAgQDE3MgotICBwbmdfc2V0X2ludmFsaWQgIEAxNzMKLTsgQWRkZWQgYXQgdmVyc2lvbiAxLjAuMTIKLTsgRm9yIGNvbXBhdGlibGl0eSB3aXRoIDEuMC43LTEuMC4xMQotICBwbmdfaW5mb19pbml0IEAxNzQKLTsgIHBuZ19yZWFkX2luaXRfMyAgICBAMTc1Ci07ICBwbmdfd3JpdGVfaW5pdF8zICAgIEAxNzYKLSAgcG5nX2luZm9faW5pdF8zIEAxNzcKLTsgIE1vdmVkIHRvIHBuZ3ByaXYuaAotOyAgcG5nX2Rlc3Ryb3lfc3RydWN0ICBAMTc4Ci07IEFkZGVkIGF0IHZlcnNpb24gMS4yLjAKLTsgRm9yIHVzZSB3aXRoIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLTsgIE1vdmVkIHRvIHBuZ3ByaXYuaAotOyBwbmdfZGVzdHJveV9zdHJ1Y3RfMiAgQDE3OQotOyBwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIgQDE4MAotOyBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yIEAxODEKLTsgcG5nX21hbGxvY19kZWZhdWx0IEAxODIKLTsgcG5nX2ZyZWVfZGVmYXVsdCBAMTgzCi07IE1ORyBmZWF0dXJlcwotOyBwbmdfcGVybWl0X21uZ19mZWF0dXJlcyAgQDE4NAotOyBNTVggc3VwcG9ydAotOyBwbmdfbW14X3N1cHBvcnQgIEAxODUKLTsgcG5nX2dldF9tbXhfZmxhZ21hc2sgIEAxODYKLTsgcG5nX2dldF9hc21fZmxhZ21hc2sgIEAxODcKLTsgcG5nX2dldF9hc21fZmxhZ3MgIEAxODgKLTsgcG5nX2dldF9tbXhfYml0ZGVwdGhfdGhyZXNob2xkICBAMTg5Ci07IHBuZ19nZXRfbW14X3Jvd2J5dGVzX3RocmVzaG9sZCAgQDE5MAotOyBwbmdfc2V0X2FzbV9mbGFncyAgQDE5MQotOyBwbmdfaW5pdF9tbXhfZmxhZ3MgIEAxOTIKLTsgU3RyaXAgZXJyb3IgbnVtYmVycwotOyBwbmdfc2V0X3N0cmlwX2Vycm9yX251bWJlcnMgQDE5MwotOyBBZGRlZCBhdCB2ZXJzaW9uIDEuMi4yCi0gIHBuZ19oYW5kbGVfYXNfdW5rbm93biBAMTc5Ci0gIHBuZ196YWxsb2MgQDE4MAotICBwbmdfemZyZWUgQDE4MQotOyBwbmdfaGFuZGxlX2FzX3Vua25vd24gQDE5NAotOyBwbmdfemFsbG9jIEAxOTUKLTsgcG5nX3pmcmVlIEAxOTYKLTsgQWRkZWQgYXQgdmVyc2lvbiAxLjIuNgotICBwbmdfbWFsbG9jX3dhcm4gQDE5NQotICBwbmdfZ2V0X3VzZXJfaGVpZ2h0X21heCBAMTk2Ci0gIHBuZ19nZXRfdXNlcl93aWR0aF9tYXggQDE5NwotICBwbmdfc2V0X3VzZXJfbGltaXRzIEAxOTgKLTsgQWRkZWQgYXQgdmVyc2lvbiAxLjIuNwotICBwbmdfc2V0X2FkZF9hbHBoYSBAMTk5Ci07IEFkZGVkIGF0IHZlcnNpb24gMS4yLjkKLTsgIHBuZ19nZXRfdWludF8zMiBAMjAwCi0gIHBuZ19zYXZlX3VpbnRfMzIgQDIwMQotOyAgcG5nX2dldF91aW50XzE2IEAyMDIKLSAgcG5nX3NhdmVfdWludF8xNiBAMjAzCi07ICBwbmdfZ2V0X2ludF8zMiBAMjA0Ci0gIHBuZ19zYXZlX2ludF8zMiBAMjA1Ci0gIHBuZ19nZXRfdWludF8zMSBAMjA2Ci0gIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCAgQDIwNwotOyBBZGRlZCBhdCB2ZXJzaW9uIDEuMi40MQotICBwbmdfd3JpdGVfc2lnIEAyMDgKLSAgcG5nX2Jlbmlnbl9lcnJvciBAMjA5Ci0gIHBuZ19jaHVua19iZW5pZ25fZXJyb3IgQDIxMAotICBwbmdfc2V0X2Jlbmlnbl9lcnJvciBAMjExCi0gIHBuZ19nZXRfaW9fY2h1bmtfbmFtZSBAMjEyCi0gIHBuZ19nZXRfaW9fc3RhdGUgQDIxMwotICBwbmdfZ2V0X2NodW5rX2NhY2hlX21heCBAMjE1Ci0gIHBuZ19zZXRfY2h1bmtfY2FjaGVfbWF4IEAyMTYKLTsgTW92ZWQgdG8gcG5ncHJpdi5oCi07IHBuZ19jaGVja19jSFJNX2ZpeGVkIEAyMTcKLSAgcG5nX2NhbGxvYyBAMjE4Ci0gIHBuZ19zZXRfbG9uZ2ptcF9mbiBAMjE5Ci07IEFkZGVkIGF0IHZlcnNpb24gMS40LjEKLSAgcG5nX2dldF9jaHVua19tYWxsb2NfbWF4IEAyMjAKLSAgcG5nX3NldF9jaHVua19tYWxsb2NfbWF4IEAyMjEKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9wbmdvczIuZGVmIGIvc3JjL2xpYnBuZy9zY3JpcHRzL3BuZ29zMi5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOTc4YzUuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL3BuZ29zMi5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE5HLkxJQiBtb2R1bGUgZGVmaW5pdGlvbiBmaWxlIGZvciBPUy8yCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi07IFZlcnNpb24gMS40LjEyCi0KLUxJQlJBUlkJCVBORwotREVTQ1JJUFRJT04JIlBORyBpbWFnZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGZvciBPUy8yIgotQ09ERQkJUFJFTE9BRCBNT1ZFQUJMRSBESVNDQVJEQUJMRQotREFUQQkJUFJFTE9BRCBNT1ZFQUJMRSBNVUxUSVBMRQotCi1FWFBPUlRTCi0KLSAgcG5nX2J1aWxkX2dyYXlzY2FsZV9wYWxldHRlCi0gIHBuZ19jaHVua19lcnJvcgotICBwbmdfY2h1bmtfd2FybmluZwotICBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bQotICBwbmdfY29udmVydF9mcm9tX3RpbWVfdAotICBwbmdfY3JlYXRlX2luZm9fc3RydWN0Ci0gIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QKLSAgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QKLSAgcG5nX2RhdGFfZnJlZXIKLSAgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QKLSAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QKLSAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0Ci0gIHBuZ19lcnJvcgotICBwbmdfZnJlZQotICBwbmdfZnJlZV9kYXRhCi0gIHBuZ19nZXRfSUhEUgotICBwbmdfZ2V0X1BMVEUKLSAgcG5nX2dldF9iS0dECi0gIHBuZ19nZXRfYml0X2RlcHRoCi0gIHBuZ19nZXRfY0hSTQotICBwbmdfZ2V0X2NIUk1fZml4ZWQKLSAgcG5nX2dldF9jaGFubmVscwotICBwbmdfZ2V0X2NvbG9yX3R5cGUKLSAgcG5nX2dldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZQotICBwbmdfZ2V0X2NvbXByZXNzaW9uX3R5cGUKLSAgcG5nX2dldF9jb3B5cmlnaHQKLSAgcG5nX2dldF9lcnJvcl9wdHIKLSAgcG5nX2dldF9maWx0ZXJfdHlwZQotICBwbmdfZ2V0X2dBTUEKLSAgcG5nX2dldF9nQU1BX2ZpeGVkCi0gIHBuZ19nZXRfaElTVAotICBwbmdfZ2V0X2hlYWRlcl92ZXIKLSAgcG5nX2dldF9oZWFkZXJfdmVyc2lvbgotICBwbmdfZ2V0X2lDQ1AKLSAgcG5nX2dldF9pbWFnZV9oZWlnaHQKLSAgcG5nX2dldF9pbWFnZV93aWR0aAotICBwbmdfZ2V0X2ludGVybGFjZV90eXBlCi0gIHBuZ19nZXRfaW9fcHRyCi0gIHBuZ19nZXRfbGlicG5nX3ZlcgotICBwbmdfZ2V0X29GRnMKLSAgcG5nX2dldF9wQ0FMCi0gIHBuZ19nZXRfcEhZcwotICBwbmdfZ2V0X3BpeGVsX2FzcGVjdF9yYXRpbwotICBwbmdfZ2V0X3BpeGVsc19wZXJfbWV0ZXIKLSAgcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIKLSAgcG5nX2dldF9yZ2JfdG9fZ3JheV9zdGF0dXMKLSAgcG5nX2dldF9yb3dieXRlcwotICBwbmdfZ2V0X3Jvd3MKLSAgcG5nX2dldF9zQklUCi0gIHBuZ19nZXRfc0NBTAotICBwbmdfZ2V0X3NQTFQKLSAgcG5nX2dldF9zUkdCCi0gIHBuZ19nZXRfc2lnbmF0dXJlCi0gIHBuZ19nZXRfdElNRQotICBwbmdfZ2V0X3RSTlMKLSAgcG5nX2dldF90ZXh0Ci0gIHBuZ19nZXRfdW5rbm93bl9jaHVua3MKLSAgcG5nX2dldF91c2VyX2NodW5rX3B0cgotICBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0cgotICBwbmdfZ2V0X3ZhbGlkCi0gIHBuZ19nZXRfeF9vZmZzZXRfbWljcm9ucwotICBwbmdfZ2V0X3hfb2Zmc2V0X3BpeGVscwotICBwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9tZXRlcgotICBwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMKLSAgcG5nX2dldF95X29mZnNldF9waXhlbHMKLSAgcG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIKLSAgcG5nX21hbGxvYwotICBwbmdfcHJvY2Vzc19kYXRhCi0gIHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdwotICBwbmdfcmVhZF9lbmQKLSAgcG5nX3JlYWRfaW1hZ2UKLSAgcG5nX3JlYWRfaW5mbwotICBwbmdfcmVhZF9wbmcKLSAgcG5nX3JlYWRfcm93Ci0gIHBuZ19yZWFkX3Jvd3MKLSAgcG5nX3JlYWRfdXBkYXRlX2luZm8KLSAgcG5nX3Jlc2V0X3pzdHJlYW0KLSAgcG5nX3NldF9JSERSCi0gIHBuZ19zZXRfUExURQotICBwbmdfc2V0X2JLR0QKLSAgcG5nX3NldF9iYWNrZ3JvdW5kCi0gIHBuZ19zZXRfYmdyCi0gIHBuZ19zZXRfY0hSTQotICBwbmdfc2V0X2NIUk1fZml4ZWQKLSAgcG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZQotICBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsCi0gIHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsCi0gIHBuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kCi0gIHBuZ19zZXRfY29tcHJlc3Npb25fc3RyYXRlZ3kKLSAgcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cwotICBwbmdfc2V0X2NyY19hY3Rpb24KLSAgcG5nX3NldF9lcnJvcl9mbgotICBwbmdfc2V0X2V4cGFuZAotICBwbmdfc2V0X2ZpbGxlcgotICBwbmdfc2V0X2ZpbHRlcgotICBwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzCi0gIHBuZ19zZXRfZmx1c2gKLSAgcG5nX3NldF9nQU1BCi0gIHBuZ19zZXRfZ0FNQV9maXhlZAotICBwbmdfc2V0X2dhbW1hCi0gIHBuZ19zZXRfZ3JheV90b19yZ2IKLSAgcG5nX3NldF9oSVNUCi0gIHBuZ19zZXRfaUNDUAotICBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZwotICBwbmdfc2V0X2ludmVydF9hbHBoYQotICBwbmdfc2V0X2ludmVydF9tb25vCi0gIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcwotICBwbmdfc2V0X29GRnMKLSAgcG5nX3NldF9wQ0FMCi0gIHBuZ19zZXRfcEhZcwotICBwbmdfc2V0X3BhY2tpbmcKLSAgcG5nX3NldF9wYWNrc3dhcAotICBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiCi0gIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbgotICBwbmdfc2V0X3JlYWRfZm4KLSAgcG5nX3NldF9yZWFkX3N0YXR1c19mbgotICBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbgotICBwbmdfc2V0X3JlYWRfdXNlcl90cmFuc2Zvcm1fZm4KLSAgcG5nX3NldF9yZ2JfdG9fZ3JheQotICBwbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkCi0gIHBuZ19zZXRfcm93cwotICBwbmdfc2V0X3NCSVQKLSAgcG5nX3NldF9zQ0FMCi0gIHBuZ19zZXRfc1BMVAotICBwbmdfc2V0X3NSR0IKLSAgcG5nX3NldF9zUkdCX2dBTUFfYW5kX2NIUk0KLSAgcG5nX3NldF9zaGlmdAotICBwbmdfc2V0X3NpZ19ieXRlcwotICBwbmdfc2V0X3N0cmlwXzE2Ci0gIHBuZ19zZXRfc3RyaXBfYWxwaGEKLSAgcG5nX3NldF9zd2FwCi0gIHBuZ19zZXRfc3dhcF9hbHBoYQotICBwbmdfc2V0X3RJTUUKLSAgcG5nX3NldF90Uk5TCi0gIHBuZ19zZXRfdFJOU190b19hbHBoYQotICBwbmdfc2V0X3RleHQKLSAgcG5nX3NldF91bmtub3duX2NodW5rX2xvY2F0aW9uCi0gIHBuZ19zZXRfdW5rbm93bl9jaHVua3MKLSAgcG5nX3NldF91c2VyX3RyYW5zZm9ybV9pbmZvCi0gIHBuZ19zZXRfd3JpdGVfZm4KLSAgcG5nX3NldF93cml0ZV9zdGF0dXNfZm4KLSAgcG5nX3NldF93cml0ZV91c2VyX3RyYW5zZm9ybV9mbgotICBwbmdfc2lnX2NtcAotICBwbmdfc3RhcnRfcmVhZF9pbWFnZQotICBwbmdfd2FybmluZwotICBwbmdfd3JpdGVfY2h1bmsKLSAgcG5nX3dyaXRlX2NodW5rX2RhdGEKLSAgcG5nX3dyaXRlX2NodW5rX2VuZAotICBwbmdfd3JpdGVfY2h1bmtfc3RhcnQKLSAgcG5nX3dyaXRlX2VuZAotICBwbmdfd3JpdGVfZmx1c2gKLSAgcG5nX3dyaXRlX2ltYWdlCi0gIHBuZ193cml0ZV9pbmZvCi0gIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFCi0gIHBuZ193cml0ZV9wbmcKLSAgcG5nX3dyaXRlX3JvdwotICBwbmdfd3JpdGVfcm93cwotICBwbmdfd3JpdGVfc2lnCi0gIHBuZ19hY2Nlc3NfdmVyc2lvbl9udW1iZXIKLSAgcG5nX2luaXRfaW8KLSAgcG5nX2NvbnZlcnRfdG9fcmZjMTEyMwotICBwbmdfc2V0X2ludmFsaWQKLQotOyBBZGRlZCBhdCB2ZXJzaW9uIDEuMi4wOgotICBwbmdfcGVybWl0X2VtcHR5X3BsdGUKLSAgcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMKLQotOyBBZGRlZCBhdCB2ZXJzaW9uIDEuMi4yOgotICBwbmdfaGFuZGxlX2FzX3Vua25vd24KLQotOyBBZGRlZCBhdCB2ZXJzaW9uIDEuMi4yIGFuZCBkZWxldGVkIGZyb20gMS4yLjM6Ci07IHBuZ196YWxsb2MKLTsgcG5nX3pmcmVlCi0KLTsgQWRkZWQgYXQgdmVyc2lvbiAxLjIuNAotICBwbmdfbWFsbG9jX3dhcm4KLQotOyBBZGRlZCBhdCB2ZXJzaW9uIDEuMi42Ci0gIHBuZ19zZXRfdXNlcl9saW1pdHMKLSAgcG5nX2dldF91c2VyX2hlaWdodF9tYXgKLSAgcG5nX2dldF91c2VyX3dpZHRoX21heAotOyBBZGRlZCBhdCB2ZXJzaW9uIDEuMi43Ci0gIHBuZ19zZXRfYWRkX2FscGhhCi0KLTsgQWRkZWQgYXQgdmVyc2lvbiAxLjIuOQotICBwbmdfc2F2ZV91aW50XzMyCi0gIHBuZ19zYXZlX3VpbnRfMTYKLSAgcG5nX3NhdmVfaW50XzMyCi0gIHBuZ19nZXRfdWludF8zMQotICBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgKLQotOyBBZGRlZCBhdCB2ZXJzaW9uIDEuMi40MQotICBwbmdfd3JpdGVfc2lnCi07IHBuZ19iZW5pZ25fZXJyb3IKLTsgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcgotOyBwbmdfc2V0X2Jlbmlnbl9lcnJvcgotICBwbmdfZ2V0X2lvX2NodW5rX25hbWUKLSAgcG5nX2dldF9pb19zdGF0ZQotICBwbmdfZ2V0X2NodW5rX2NhY2hlX21heAotICBwbmdfc2V0X2NodW5rX2NhY2hlX21heAotOyBNb3ZlZCB0byBwbmdwcml2LmgKLTsgcG5nX2NoZWNrX2NIUk1fZml4ZWQgQDIxNwotICBwbmdfY2FsbG9jCi0gIHBuZ19zZXRfbG9uZ2ptcF9mbgotOyBBZGRlZCBhdCB2ZXJzaW9uIDEuNC4xCi0gIHBuZ19nZXRfY2h1bmtfbWFsbG9jX21heAotICBwbmdfc2V0X2NodW5rX21hbGxvY19tYXgKLTsgQWRkZWQgYXQgdmVyc2lvbiAxLjQuMgotICBwbmdfc2V0X3F1YW50aXplCi0KLTsgVGhlc2UgYXJlIG5vdCBwcmVzZW50IHdoZW4gbGlicG5nIGlzIGNvbXBpbGVkIHdpdGggUE5HX05PX0dMT0JBTF9BUlJBWVMKLSAgcG5nX2xpYnBuZ192ZXIKLSAgcG5nX3Bhc3Nfc3RhcnQKLSAgcG5nX3Bhc3NfaW5jCi0gIHBuZ19wYXNzX3lzdGFydAotICBwbmdfcGFzc195aW5jCi0gIHBuZ19wYXNzX21hc2sKLSAgcG5nX3Bhc3NfZHNwX21hc2sKLTsgcG5nX3Bhc3Nfd2lkdGgKLTsgcG5nX3Bhc3NfaGVpZ2h0Ci0KLTsgVGhlc2UgYXJlIG5vdCBwcmVzZW50IHdoZW4gbGlicG5nIGlzIGNvbXBpbGVkIHdpdGggUE5HX05PX0dMT0JBTF9BUlJBWVMKLSAgcG5nX0lIRFIKLSAgcG5nX0lEQVQKLSAgcG5nX0lFTkQKLSAgcG5nX1BMVEUKLSAgcG5nX2JLR0QKLSAgcG5nX2NIUk0KLSAgcG5nX2dBTUEKLSAgcG5nX2hJU1QKLSAgcG5nX2lDQ1AKLSAgcG5nX2lUWHQKLSAgcG5nX29GRnMKLSAgcG5nX3BDQUwKLSAgcG5nX3BIWXMKLSAgcG5nX3NCSVQKLSAgcG5nX3NDQUwKLSAgcG5nX3NQTFQKLSAgcG5nX3NSR0IKLSAgcG5nX3RFWHQKLSAgcG5nX3RJTUUKLSAgcG5nX3RSTlMKLSAgcG5nX3pUWHQKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9wbmd3aW4uZGVmIGIvc3JjL2xpYnBuZy9zY3JpcHRzL3BuZ3dpbi5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZjBjNTYuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zY3JpcHRzL3BuZ3dpbi5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMSUJQTkcgbW9kdWxlIGRlZmluaXRpb24gZmlsZSBmb3IgV2luZG93cwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1MSUJSQVJZCi0KLUVYUE9SVFMKLTtWZXJzaW9uIDEuNC4xMgotICBwbmdfYnVpbGRfZ3JheXNjYWxlX3BhbGV0dGUKLSAgcG5nX2NodW5rX2Vycm9yCi0gIHBuZ19jaHVua193YXJuaW5nCi0gIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtCi0gIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90Ci0gIHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QKLSAgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdAotICBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdAotICBwbmdfZGF0YV9mcmVlcgotICBwbmdfZGVzdHJveV9pbmZvX3N0cnVjdAotICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdAotICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QKLSAgcG5nX2Vycm9yCi0gIHBuZ19mcmVlCi0gIHBuZ19mcmVlX2RhdGEKLSAgcG5nX2dldF9JSERSCi0gIHBuZ19nZXRfUExURQotICBwbmdfZ2V0X2JLR0QKLSAgcG5nX2dldF9iaXRfZGVwdGgKLSAgcG5nX2dldF9jSFJNCi0gIHBuZ19nZXRfY0hSTV9maXhlZAotICBwbmdfZ2V0X2NoYW5uZWxzCi0gIHBuZ19nZXRfY29sb3JfdHlwZQotICBwbmdfZ2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplCi0gIHBuZ19nZXRfY29tcHJlc3Npb25fdHlwZQotICBwbmdfZ2V0X2NvcHlyaWdodAotICBwbmdfZ2V0X2Vycm9yX3B0cgotICBwbmdfZ2V0X2ZpbHRlcl90eXBlCi0gIHBuZ19nZXRfZ0FNQQotICBwbmdfZ2V0X2dBTUFfZml4ZWQKLSAgcG5nX2dldF9oSVNUCi0gIHBuZ19nZXRfaGVhZGVyX3ZlcgotICBwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uCi0gIHBuZ19nZXRfaUNDUAotICBwbmdfZ2V0X2ltYWdlX2hlaWdodAotICBwbmdfZ2V0X2ltYWdlX3dpZHRoCi0gIHBuZ19nZXRfaW50ZXJsYWNlX3R5cGUKLSAgcG5nX2dldF9pb19wdHIKLSAgcG5nX2dldF9saWJwbmdfdmVyCi0gIHBuZ19nZXRfb0ZGcwotICBwbmdfZ2V0X3BDQUwKLSAgcG5nX2dldF9wSFlzCi0gIHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvCi0gIHBuZ19nZXRfcGl4ZWxzX3Blcl9tZXRlcgotICBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cgotICBwbmdfZ2V0X3JnYl90b19ncmF5X3N0YXR1cwotICBwbmdfZ2V0X3Jvd2J5dGVzCi0gIHBuZ19nZXRfcm93cwotICBwbmdfZ2V0X3NCSVQKLSAgcG5nX2dldF9zQ0FMCi0gIHBuZ19nZXRfc1BMVAotICBwbmdfZ2V0X3NSR0IKLSAgcG5nX2dldF9zaWduYXR1cmUKLSAgcG5nX2dldF90SU1FCi0gIHBuZ19nZXRfdFJOUwotICBwbmdfZ2V0X3RleHQKLSAgcG5nX2dldF91bmtub3duX2NodW5rcwotICBwbmdfZ2V0X3VzZXJfY2h1bmtfcHRyCi0gIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyCi0gIHBuZ19nZXRfdmFsaWQKLSAgcG5nX2dldF94X29mZnNldF9taWNyb25zCi0gIHBuZ19nZXRfeF9vZmZzZXRfcGl4ZWxzCi0gIHBuZ19nZXRfeF9waXhlbHNfcGVyX21ldGVyCi0gIHBuZ19nZXRfeV9vZmZzZXRfbWljcm9ucwotICBwbmdfZ2V0X3lfb2Zmc2V0X3BpeGVscwotICBwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlcgotICBwbmdfbWFsbG9jCi0gIHBuZ19wcm9jZXNzX2RhdGEKLSAgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93Ci0gIHBuZ19yZWFkX2VuZAotICBwbmdfcmVhZF9pbWFnZQotICBwbmdfcmVhZF9pbmZvCi0gIHBuZ19yZWFkX3BuZwotICBwbmdfcmVhZF9yb3cKLSAgcG5nX3JlYWRfcm93cwotICBwbmdfcmVhZF91cGRhdGVfaW5mbwotICBwbmdfcmVzZXRfenN0cmVhbQotICBwbmdfc2V0X0lIRFIKLSAgcG5nX3NldF9QTFRFCi0gIHBuZ19zZXRfYktHRAotICBwbmdfc2V0X2JhY2tncm91bmQKLSAgcG5nX3NldF9iZ3IKLSAgcG5nX3NldF9jSFJNCi0gIHBuZ19zZXRfY0hSTV9maXhlZAotICBwbmdfc2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplCi0gIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwKLSAgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwKLSAgcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QKLSAgcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneQotICBwbmdfc2V0X2NvbXByZXNzaW9uX3dpbmRvd19iaXRzCi0gIHBuZ19zZXRfY3JjX2FjdGlvbgotICBwbmdfc2V0X2Vycm9yX2ZuCi0gIHBuZ19zZXRfZXhwYW5kCi0gIHBuZ19zZXRfZmlsbGVyCi0gIHBuZ19zZXRfZmlsdGVyCi0gIHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3MKLSAgcG5nX3NldF9mbHVzaAotICBwbmdfc2V0X2dBTUEKLSAgcG5nX3NldF9nQU1BX2ZpeGVkCi0gIHBuZ19zZXRfZ2FtbWEKLSAgcG5nX3NldF9ncmF5X3RvX3JnYgotICBwbmdfc2V0X2hJU1QKLSAgcG5nX3NldF9pQ0NQCi0gIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nCi0gIHBuZ19zZXRfaW52ZXJ0X2FscGhhCi0gIHBuZ19zZXRfaW52ZXJ0X21vbm8KLSAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzCi0gIHBuZ19zZXRfb0ZGcwotICBwbmdfc2V0X3BDQUwKLSAgcG5nX3NldF9wSFlzCi0gIHBuZ19zZXRfcGFja2luZwotICBwbmdfc2V0X3BhY2tzd2FwCi0gIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IKLSAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuCi0gIHBuZ19zZXRfcmVhZF9mbgotICBwbmdfc2V0X3JlYWRfc3RhdHVzX2ZuCi0gIHBuZ19zZXRfcmVhZF91c2VyX2NodW5rX2ZuCi0gIHBuZ19zZXRfcmVhZF91c2VyX3RyYW5zZm9ybV9mbgotICBwbmdfc2V0X3JnYl90b19ncmF5Ci0gIHBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQKLSAgcG5nX3NldF9yb3dzCi0gIHBuZ19zZXRfc0JJVAotICBwbmdfc2V0X3NDQUwKLSAgcG5nX3NldF9zUExUCi0gIHBuZ19zZXRfc1JHQgotICBwbmdfc2V0X3NSR0JfZ0FNQV9hbmRfY0hSTQotICBwbmdfc2V0X3NoaWZ0Ci0gIHBuZ19zZXRfc2lnX2J5dGVzCi0gIHBuZ19zZXRfc3RyaXBfMTYKLSAgcG5nX3NldF9zdHJpcF9hbHBoYQotICBwbmdfc2V0X3N3YXAKLSAgcG5nX3NldF9zd2FwX2FscGhhCi0gIHBuZ19zZXRfdElNRQotICBwbmdfc2V0X3RSTlMKLSAgcG5nX3NldF90Uk5TX3RvX2FscGhhCi0gIHBuZ19zZXRfdGV4dAotICBwbmdfc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24KLSAgcG5nX3NldF91bmtub3duX2NodW5rcwotICBwbmdfc2V0X3VzZXJfdHJhbnNmb3JtX2luZm8KLSAgcG5nX3NldF93cml0ZV9mbgotICBwbmdfc2V0X3dyaXRlX3N0YXR1c19mbgotICBwbmdfc2V0X3dyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuCi0gIHBuZ19zaWdfY21wCi0gIHBuZ19zdGFydF9yZWFkX2ltYWdlCi0gIHBuZ193YXJuaW5nCi0gIHBuZ193cml0ZV9jaHVuawotICBwbmdfd3JpdGVfY2h1bmtfZGF0YQotICBwbmdfd3JpdGVfY2h1bmtfZW5kCi0gIHBuZ193cml0ZV9jaHVua19zdGFydAotICBwbmdfd3JpdGVfZW5kCi0gIHBuZ193cml0ZV9mbHVzaAotICBwbmdfd3JpdGVfaW1hZ2UKLSAgcG5nX3dyaXRlX2luZm8KLSAgcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUKLSAgcG5nX3dyaXRlX3BuZwotICBwbmdfd3JpdGVfcm93Ci0gIHBuZ193cml0ZV9yb3dzCi0gIHBuZ19hY2Nlc3NfdmVyc2lvbl9udW1iZXIKLSAgcG5nX2luaXRfaW8KLSAgcG5nX2NvbnZlcnRfdG9fcmZjMTEyMwotICBwbmdfc2V0X2ludmFsaWQKLTsgQWRkZWQgYXQgdmVyc2lvbiAxLjAuMTIKLSAgcG5nX2luZm9faW5pdF8zCi07IE1vdmVkIHRvIHBuZ3ByaXYuaAotOyAgcG5nX2Rlc3Ryb3lfc3RydWN0Ci07IEFkZGVkIGF0IHZlcnNpb24gMS4yLjAKLTsgRm9yIHVzZSB3aXRoIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLTsgTW92ZWQgdG8gcG5ncHJpdi5oCi07ICBwbmdfZGVzdHJveV9zdHJ1Y3RfMgotICBwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIKLSAgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMgotICBwbmdfbWFsbG9jX2RlZmF1bHQKLSAgcG5nX2ZyZWVfZGVmYXVsdAotOyBNTkcgZmVhdHVyZXMKLSAgcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMKLTsgQWRkZWQgYXQgdmVyc2lvbiAxLjIuMgotICBwbmdfaGFuZGxlX2FzX3Vua25vd24KLTsgQWRkZWQgYXQgdmVyc2lvbiAxLjIuMiBhbmQgZGVsZXRlZCBmcm9tIDEuMi4zCi07IHBuZ196YWxsb2MKLTsgcG5nX3pmcmVlCi07IEFkZGVkIGF0IHZlcnNpb24gMS4yLjQKLSAgcG5nX21hbGxvY193YXJuCi0gIHBuZ19nZXRfdXNlcl9oZWlnaHRfbWF4Ci0gIHBuZ19nZXRfdXNlcl93aWR0aF9tYXgKLSAgcG5nX3NldF91c2VyX2xpbWl0cwotOyBBZGRlZCBhdCB2ZXJzaW9uIDEuMi43Ci0gIHBuZ19zZXRfYWRkX2FscGhhCi07IEFkZGVkIGF0IHZlcnNpb24gMS4yLjkKLSAgcG5nX3NhdmVfdWludF8zMgotICBwbmdfc2F2ZV91aW50XzE2Ci0gIHBuZ19zYXZlX2ludF8zMgotICBwbmdfZ2V0X3VpbnRfMzEKLSAgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184Ci07IEFkZGVkIGF0IHZlcnNpb24gMS4yLjQxCi0gIHBuZ193cml0ZV9zaWcKLTsgcG5nX2Jlbmlnbl9lcnJvcgotOyBwbmdfY2h1bmtfYmVuaWduX2Vycm9yCi07IHBuZ19zZXRfYmVuaWduX2Vycm9yCi0gIHBuZ19nZXRfaW9fY2h1bmtfbmFtZQotICBwbmdfZ2V0X2lvX3N0YXRlCi0gIHBuZ19nZXRfY2h1bmtfY2FjaGVfbWF4Ci0gIHBuZ19zZXRfY2h1bmtfY2FjaGVfbWF4Ci07IE1vdmVkIHRvIHBuZ3ByaXYuaAotOyBwbmdfY2hlY2tfY0hSTV9maXhlZCBAMjE3Ci0gIHBuZ19jYWxsb2MKLSAgcG5nX3NldF9sb25nam1wX2ZuCi07IEFkZGVkIGF0IHZlcnNpb24gMS40LjEKLSAgcG5nX2dldF9jaHVua19tYWxsb2NfbWF4Ci0gIHBuZ19zZXRfY2h1bmtfbWFsbG9jX21heAotOyBBZGRlZCBhdCB2ZXJzaW9uIDEuNC4yCi0gIHBuZ19zZXRfcXVhbnRpemUKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc2NyaXB0cy9wbmd3aW4ucmMgYi9zcmMvbGlicG5nL3NjcmlwdHMvcG5nd2luLnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzM1Y2JiLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9wbmd3aW4ucmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotI2RlZmluZSBQTkdfVkVSU0lPTl9JTkZPX09OTFkKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlICIuLi9wbmcuaCIKLQotI2RlZmluZSBfUVVPVEUoeCkgIyB4Ci0jZGVmaW5lIFFVT1RFKHgpIF9RVU9URSh4KQotCi0jZGVmaW5lIFBOR19MSUJQTkdfRExMRk5BTUUgIkxJQlBORyIKLQotLyogU3VwcG9ydCBkZXByZWNhdGVkIFBSSVZBVEVCVUlMRCBtYWNybyAqLwotI2lmIGRlZmluZWQoUFJJVkFURUJVSUxEKSAmJiAhZGVmaW5lZChQTkdfVVNFUl9QUklWQVRFQlVJTEQpCi0jICBkZWZpbmUgUE5HX1VTRVJfUFJJVkFURUJVSUxEIFBSSVZBVEVCVUlMRAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19VU0VSX0RMTEZOQU1FX1BPU1RGSVgpICYmICFkZWZpbmVkKFBOR19VU0VSX1BSSVZBVEVCVUlMRCkKLSMgIGVycm9yICJQTkdfVVNFUl9QUklWQVRFQlVJTEQgbXVzdCBiZSBkZWZpbmVkIGFzIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlXAotIGN1c3RvbSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGxpYnJhcnkuIgotI2VuZGlmCi0KLS8qIFByaW9yaXRpemUgUE5HX1VTRVJfeCBvdmVyIFBOR19MSUJQTkdfeCAqLwotI2lmZGVmIFBOR19VU0VSX0RMTEZOQU1FX1BPU1RGSVgKLSMgIHVuZGVmIFBOR19MSUJQTkdfRExMRk5BTUVfUE9TVEZJWAotIyAgZGVmaW5lIFBOR19MSUJQTkdfRExMRk5BTUVfUE9TVEZJWCBQTkdfVVNFUl9ETExGTkFNRV9QT1NURklYCi0jZW5kaWYKLQotI2lmZGVmIFBOR19VU0VSX1ZFUlNJT05JTkZPX0NPTU1FTlRTCi0jICB1bmRlZiBQTkdfTElCUE5HX1ZFUlNJT05JTkZPX0NPTU1FTlRTCi0jICBkZWZpbmUgUE5HX0xJQlBOR19WRVJTSU9OSU5GT19DT01NRU5UUyBQTkdfVVNFUl9WRVJTSU9OSU5GT19DT01NRU5UUwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19ERUJVRykgJiYgKFBOR19ERUJVRyA+IDApCi0jICBkZWZpbmUgVlNfREVCVUcgVlNfRkZfREVCVUcKLSMgIGlmbmRlZiBQTkdfTElCUE5HX0RMTEZOQU1FX1BPU1RGSVgKLSMgICAgZGVmaW5lIFBOR19MSUJQTkdfRExMRk5BTUVfUE9TVEZJWCAiRCIKLSMgIGVuZGlmIC8qIFBOR19MSUJQTkdfRExMRk5BTUVfUE9TVEZJWCAqLwotIyAgaWZuZGVmIFBOR19MSUJQTkdfVkVSU0lPTklORk9fQ09NTUVOVFMKLSMgICAgZGVmaW5lIFBOR19MSUJQTkdfVkVSU0lPTklORk9fQ09NTUVOVFMgIlBOR19ERUJVRz0iIFFVT1RFKFBOR19ERUJVRykKLSMgIGVuZGlmIC8qIFBOR19MSUJQTkdfVkVSU0lPTklORk9fQ09NTUVOVFMgKi8KLSNlbHNlCi0jICBkZWZpbmUgVlNfREVCVUcgMAotIyAgaWZuZGVmIFBOR19MSUJQTkdfRExMRk5BTUVfUE9TVEZJWAotIyAgICAgZGVmaW5lIFBOR19MSUJQTkdfRExMRk5BTUVfUE9TVEZJWAotIyAgZW5kaWYgLyogUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYICovCi0jZW5kaWYgLyogZGVmaW5lZChERUJVRykuLi4gKi8KLQotI2lmZGVmIFBOR19VU0VSX1BSSVZBVEVCVUlMRAotIyAgZGVmaW5lIFZTX1BSSVZBVEVCVUlMRCBWU19GRl9QUklWQVRFQlVJTEQKLSNlbHNlCi0jICBkZWZpbmUgVlNfUFJJVkFURUJVSUxEIDAKLSNlbmRpZiAvKiBQTkdfVVNFUl9QUklWQVRFQlVJTEQgKi8KLQotI2lmZGVmIFBOR19MSUJQTkdfU1BFQ0lBTEJVSUxECi0jICBkZWZpbmUgVlNfU1BFQ0lBTEJVSUxEIFZTX0ZGX1NQRUNJQUxCVUlMRAotI2Vsc2UKLSMgIGRlZmluZSBWU19TUEVDSUFMQlVJTEQgMAotI2VuZGlmIC8qIFBOR19MSUJQTkdfQlVJTERfU1BFQ0lBTCAqLwotCi0jaWYgKChQTkdfTElCUE5HX0JVSUxEX0JBU0VfVFlQRSAmIFBOR19MSUJQTkdfUkVMRUFTRV9TVEFUVVNfTUFTSykgIT1cCi0gICAgICBQTkdfTElCUE5HX0JVSUxEX1NUQUJMRSkKLSMgIGRlZmluZSBWU19QUkVSRUxFQVNFIFZTX0ZGX1BSRVJFTEVBU0UKLSMgIGRlZmluZSBWU19QQVRDSEVEIDAKLSNlbHNlCi0jICBkZWZpbmUgVlNfUFJFUkVMRUFTRSAwCi0jICBpZiAoUE5HX0xJQlBOR19CVUlMRF9CQVNFX1RZUEUgJiBQTkdfTElCUE5HX0JVSUxEX1BBVENIRUQpCi0jICAgIGRlZmluZSBWU19QQVRDSEVEIFZTX0ZGX1BBVENIRUQKLSMgIGVsc2UKLSMgICAgZGVmaW5lIFZTX1BBVENIRUQgMAotIyAgZW5kaWYKLSNlbmRpZgotCi1WU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8KLUZJTEVWRVJTSU9OIFBOR19MSUJQTkdfVkVSX01BSk9SLCBQTkdfTElCUE5HX1ZFUl9NSU5PUiwgUE5HX0xJQlBOR19WRVJfUkVMRUFTRSwgUE5HX0xJQlBOR19WRVJfQlVJTEQKLVBST0RVQ1RWRVJTSU9OIFBOR19MSUJQTkdfVkVSX01BSk9SLCBQTkdfTElCUE5HX1ZFUl9NSU5PUiwgUE5HX0xJQlBOR19WRVJfUkVMRUFTRSwgUE5HX0xJQlBOR19WRVJfQlVJTEQKLUZJTEVGTEFHU01BU0sgVlNfRkZJX0ZJTEVGTEFHU01BU0sKLUZJTEVGTEFHUyBWU19ERUJVRyB8IFZTX1BSSVZBVEVCVUlMRCB8IFZTX1NQRUNJQUxCVUlMRCB8IFZTX1BSRVJFTEVBU0UgfCBWU19QQVRDSEVECi1GSUxFT1MgVk9TX19XSU5ET1dTMzIKLUZJTEVUWVBFIFZGVF9ETEwKLUZJTEVTVUJUWVBFIFZGVDJfVU5LTk9XTgotQkVHSU4KLSAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgotICBCRUdJTiBCTE9DSyAiMDQwOTA0RTQiIC8qIExhbmd1YWdlIHR5cGUgPSBVLlMgRW5nbGlzaCgweDA0MDkpIGFuZCBDaGFyYWN0ZXIgU2V0ID0gV2luZG93cywgTXVsdGlsaW5ndWFsKDB4MDRFNCkgKi8KLSAgICBCRUdJTgotI2lmZGVmIFBOR19MSUJQTkdfVkVSU0lPTklORk9fQ09NTUVOVFMKLSAgICAgIFZBTFVFICJDb21tZW50cyIsIFBOR19MSUJQTkdfVkVSU0lPTklORk9fQ09NTUVOVFMgIlwwMDAiCi0jZW5kaWYgLyogUE5HX0xJQlBOR19WRVJTSU9OSU5GT19DT01NRU5UUyAqLwotI2lmZGVmIFBOR19VU0VSX1ZFUlNJT05JTkZPX0NPTVBBTllOQU1FCi0gICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCBQTkdfVVNFUl9WRVJTSU9OSU5GT19DT01QQU5ZTkFNRSAiXDAwMCIKLSNlbmRpZiAvKiBQTkdfVVNFUl9WRVJTSU9OSU5GT19DT01QQU5ZTkFNRSAqLwotICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJQTkcgaW1hZ2UgY29tcHJlc3Npb24gbGlicmFyeVwwMDAiCi0gICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCBQTkdfTElCUE5HX1ZFUl9TVFJJTkcgIlwwMDAiCi0gICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgUE5HX0xJQlBOR19ETExGTkFNRSBRVU9URShQTkdfTElCUE5HX1ZFUl9ETExOVU0pIFBOR19MSUJQTkdfRExMRk5BTUVfUE9TVEZJWCAiIChXaW5kb3dzIDMyIGJpdClcMDAwIgotICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIlwyNTEgMTk5OC0yMDA5IEdsZW5uIFJhbmRlcnMtUGVocnNvbiBldCBhbC5cMDAwIgotI2lmZGVmIFBOR19VU0VSX1ZFUlNJT05JTkZPX0xFR0FMVFJBREVNQVJLUwotICAgICAgVkFMVUUgIkxlZ2FsVHJhZGVtYXJrcyIsIFBOR19VU0VSX1ZFUlNJT05JTkZPX0xFR0FMVFJBREVNQVJLUyAiXDAwMCIKLSNlbmRpZiAvKiBQTkdfVVNFUl9WRVJTSU9OSU5GT19MRUdBTFRSQURFTUFSS1MgKi8KLSAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgUE5HX0xJQlBOR19ETExGTkFNRSBRVU9URShQTkdfTElCUE5HX1ZFUl9ETExOVU0pIFBOR19MSUJQTkdfRExMRk5BTUVfUE9TVEZJWCAiLkRMTFwwMDAiCi0jaWZkZWYgUE5HX1VTRVJfUFJJVkFURUJVSUxECi0gICAgICBWQUxVRSAiUHJpdmF0ZUJ1aWxkIiwgUE5HX1VTRVJfUFJJVkFURUJVSUxEICJcMDAwIgotI2VuZGlmIC8qIFBOR19VU0VSX1BSSVZBVEVCVUlMRCAqLwotICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgIkxpYlBOR1wwMDAiCi0gICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAiMVwwMDAiCi0jaWZkZWYgUE5HX0xJQlBOR19TUEVDSUFMQlVJTEQKLSAgICAgIFZBTFVFICJTcGVjaWFsQnVpbGQiLCBQTkdfTElCUE5HX1NQRUNJQUxCVUlMRCAiXDAwMCIKLSNlbmRpZiAvKiBQTkdfTElCUE5HX1NQRUNJQUxCVUlMRCAqLwotICAgIEVORAotICBFTkQKLSAgQkxPQ0sgIlZhckZpbGVJbmZvIgotICBCRUdJTgotICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4MDQwOSwgMHgwNEU0Ci0gIEVORAotRU5ECmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3NjcmlwdHMvc21ha2VmaWxlLnBwYyBiL3NyYy9saWJwbmcvc2NyaXB0cy9zbWFrZWZpbGUucHBjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzFjNjkzLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvc2NyaXB0cy9zbWFrZWZpbGUucHBjCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIyBBbWlnYSBwb3dlclVQIChUTSkgTWFrZWZpbGUKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZyBhbmQgU0FTIEMgVjYuNTgvNy4wMCBQUEMgY29tcGlsZXIKLSMgQ29weXJpZ2h0IChDKSAxOTk4IGJ5IEFuZHJlYXMgUi4gS2xlaW5lcnQKLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi1DQyAgICAgICA9IHNjcHBjCi1DRkxBR1MgICA9IE5PU1RLQ0hLIE5PU0lOVCBPUFRJTUlaRSBPUFRHTyBPUFRQRUVQIE9QVElOTE9DQUwgT1BUSU5MIElESVIgL3psaWIgXAotICAgICAgICAgICBPUFRMT09QIE9QVFJERVA9OCBPUFRERVA9OCBPUFRDT01QPTgKLUxJQk5BTUUgID0gbGlicG5nLmEKLUFSICAgICAgID0gcHBjLWFtaWdhb3MtYXIKLUFSX0ZMQUdTID0gY3IKLVJBTkxJQiAgID0gcHBjLWFtaWdhb3MtcmFubGliCi1MREZMQUdTICA9IC1yIC1vCi1MRExJQlMgICA9ICAuLi96bGliL2xpYnppcC5hIExJQjpzY3BwYy5hCi1MTiAgICAgICA9IHBwYy1hbWlnYW9zLWxkCi1STSAgICAgICA9IGRlbGV0ZSBxdWlldAotTUtESVIgICAgPSBtYWtlZGlyCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBwbmdyZWFkLm8gXAotcG5nZXJyb3IubyBwbmdwcmVhZC5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBwbmd3dHJhbi5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ21lbS5vCi0KLWFsbDogJChMSUJOQU1FKSBwbmd0ZXN0Ci0KLSQoTElCTkFNRSk6ICQoT0JKUykKLSAgICAgICAgICAgICQoQVIpICQoQVJfRkxBR1MpICRAICQoT0JKUykKLSAgICAgICAgICAgICQoUkFOTElCKSAkQAotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gJChMSUJOQU1FKQotICAgICAgICAkKExOKSAkKExERkxBR1MpIHBuZ3Rlc3QgTElCOmNfcHBjLm8gcG5ndGVzdC5vICQoTElCTkFNRSkgJChMRExJQlMpIFwKLUxJQjplbmQubwpkaWZmIC0tZ2l0IGEvc3JjL2xpYnBuZy9zdW5maXgtbWFrZWZpbGUucGF0Y2ggYi9zcmMvbGlicG5nL3N1bmZpeC1tYWtlZmlsZS5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBlYTQwMy4uMDAwMDAwMAotLS0gYS9zcmMvbGlicG5nL3N1bmZpeC1tYWtlZmlsZS5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLUluZGV4OiBsaWJwbmctMS4yLjQ2L01ha2VmaWxlLmFtCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0gbGlicG5nLTEuMi40Ni5vcmlnL01ha2VmaWxlLmFtCTIwMTEtMDgtMzAgMTQ6NDg6NDMuMDM5MjIzNDc2ICswNDAwCi0rKysgbGlicG5nLTEuMi40Ni9NYWtlZmlsZS5hbQkyMDExLTA4LTMwIDE1OjAyOjE4Ljc3NTg2MTkxOSArMDQwMAotQEAgLTQ5LDcgKzQ5LDExIEBACi0gCi0gaWYgSEFWRV9MRF9WRVJTSU9OX1NDUklQVAotICAgIyBWZXJzaW9uZWQgc3ltYm9scyBhbmQgcmVzdHJpY3RlZCBleHBvcnRzCi0raWYgSEFWRV9TT0xBUklTX0xECi0rICBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0xERkxBR1MgKz0gLVdsLC1NIFdsLGxpYnBuZy52ZXJzCi0rZWxzZQotKyAgbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9MREZMQUdTICs9IC1XbCwtLXZlcnNpb24tc2NyaXB0PWxpYnBuZy52ZXJzCi0rZW5kaWYKLSAgIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfREVQRU5ERU5DSUVTID0gbGlicG5nLnZlcnMKLSBlbHNlCi0gICAjIE9ubHkgcmVzdHJpY3RlZCBleHBvcnRzIHdoZW4gcG9zc2libGUKZGlmZiAtLWdpdCBhL3NyYy9saWJwbmcvc3VuZml4LnBhdGNoIGIvc3JjL2xpYnBuZy9zdW5maXgucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMjgxY2QuLjAwMDAwMDAKLS0tIGEvc3JjL2xpYnBuZy9zdW5maXgucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1JbmRleDogbGlicG5nLTEuMi40Ni9jb25maWd1cmUuYWMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLSBsaWJwbmctMS4yLjQ2Lm9yaWcvY29uZmlndXJlLmFjCTIwMTEtMDgtMzAgMTQ6NDg6NDMuMDM5MDI4Mjg5ICswNDAwCi0rKysgbGlicG5nLTEuMi40Ni9jb25maWd1cmUuYWMJMjAxMS0wOC0zMCAxNDo1NjowOS42ODAwMjEzODkgKzA0MDAKLUBAIC03OCw4ICs3OCwyMyBAQAotIEFDX1NVQlNUKExJQlBOR19ERUZJTkVTKQotIEFDX1NVQlNUKExJQlBOR19OT19NTVgpCi0gCi0rQUNfTVNHX0NIRUNLSU5HKFtpZiB1c2luZyBTb2xhcmlzIGxpbmtlcl0pCi0rU0xEPWAkTEQgLS12ZXJzaW9uIDI+JjEgfCBncmVwIFNvbGFyaXNgCi0raWYgdGVzdCAiJFNMRCI7IHRoZW4KLSsgICAgaGF2ZV9zb2xhcmlzX2xkPXllcwotKyAgICBBQ19NU0dfUkVTVUxUKHllcykKLStlbHNlCi0rICAgIGhhdmVfc29sYXJpc19sZD1ubwotKyAgICBBQ19NU0dfUkVTVUxUKG5vKQotK2ZpCi0rQU1fQ09ORElUSU9OQUwoSEFWRV9TT0xBUklTX0xELCB0ZXN0ICIkaGF2ZV9zb2xhcmlzX2xkIiA9ICJ5ZXMiKQotKwotIEFDX01TR19DSEVDS0lORyhbaWYgbGlicmFyaWVzIGNhbiBiZSB2ZXJzaW9uZWRdKQotLUdMRD1gJExEIC0taGVscCA8IC9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8IGdyZXAgdmVyc2lvbi1zY3JpcHRgCi0raWYgdGVzdCAiJGhhdmVfc29sYXJpc19sZCIgPSAieWVzIjsgdGhlbgotKyAgICBHTEQ9YCRMRCAtLWhlbHAgPCAvZGV2L251bGwgMj4mMSB8IGdyZXAgJ00gbWFwZmlsZSdgCi0rZWxzZQotKyAgICBHTEQ9YCRMRCAtLWhlbHAgPCAvZGV2L251bGwgMj4vZGV2L251bGwgfCBncmVwIHZlcnNpb24tc2NyaXB0YAotK2ZpCi0gaWYgdGVzdCAiJEdMRCI7IHRoZW4KLSAgICAgaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdD15ZXMKLSAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCi1JbmRleDogbGlicG5nLTEuMi40Ni9NYWtlZmlsZS5hbQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tIGxpYnBuZy0xLjIuNDYub3JpZy9NYWtlZmlsZS5hbQkyMDExLTA4LTMwIDE0OjQ4OjQzLjAzOTIyMzQ3NiArMDQwMAotKysrIGxpYnBuZy0xLjIuNDYvTWFrZWZpbGUuYW0JMjAxMS0wOC0zMCAxNTowMjoxOC43NzU4NjE5MTkgKzA0MDAKLUBAIC00OSw3ICs0OSwxMSBAQAotIAotIGlmIEhBVkVfTERfVkVSU0lPTl9TQ1JJUFQKLSAgICMgVmVyc2lvbmVkIHN5bWJvbHMgYW5kIHJlc3RyaWN0ZWQgZXhwb3J0cwotK2lmIEhBVkVfU09MQVJJU19MRAotKyAgbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9MREZMQUdTICs9IC1XbCwtTSBXbCxsaWJwbmcudmVycwotK2Vsc2UKLSsgIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfTERGTEFHUyArPSAtV2wsLS12ZXJzaW9uLXNjcmlwdD1saWJwbmcudmVycwotK2VuZGlmCi0gICBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0RFUEVOREVOQ0lFUyA9IGxpYnBuZy52ZXJzCi0gZWxzZQotICAgIyBPbmx5IHJlc3RyaWN0ZWQgZXhwb3J0cyB3aGVuIHBvc3NpYmxlCmRpZmYgLS1naXQgYS9zcmMvbGlicG5nL3Rlc3QtcG5ndGVzdC5zaCBiL3NyYy9saWJwbmcvdGVzdC1wbmd0ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTM0YThhLi4wMDAwMDAwCi0tLSBhL3NyYy9saWJwbmcvdGVzdC1wbmd0ZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIS9iaW4vc2gKLQotLi9wbmd0ZXN0ICR7c3JjZGlyfS9wbmd0ZXN0LnBuZwpkaWZmIC0tZ2l0IGEvc3JjL21pbml0aWZmL01ha2VmaWxlLmluIGIvc3JjL21pbml0aWZmL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2U2NzU5Li4wMDAwMDAwCi0tLSBhL3NyYy9taW5pdGlmZi9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS5QSE9OWTogYWxsIHRlc3QgY2hlY2sgY2xlYW4gZGlzdGNsZWFuCi0uUFJFQ0lPVVM6IE1ha2VmaWxlCi0uU1VGRklYRVM6IC5jIC5vIC5hCi0KLUNDID0gQENDQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUCA9IEBDUFBACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUxEID0gQExEQAotTERGTEFHUyA9IEBMREZMQUdTQAotQVIgPSBAQVJACi1BUkZMQUdTID0gQEFSRkxBR1NACi1SQU5MSUIgPSBAUkFOTElCQAotTElCUyA9IEBMSUJTQAotUk1fRiA9IEBSTV9GQAotCi1NSU5JVElGRl9MSUIgPSBsaWJtaW5pdGlmZi5hCi1NSU5JVElGRl9PQkpTID0gdGlmZmJhc2UubyB0aWZmcmVhZC5vICN0aWZmd3JpdGUubwotVElGRjJQTk0gPSB0ZXN0L3RpZmYycG5tJChFWEVFWFQpCi1USUZGMlBOTV9PQkpTID0gdGVzdC90aWZmMnBubS5vCi0KLWFsbDogJChNSU5JVElGRl9MSUIpICQoVElGRjJQTk0pCi0KLXRlc3Q6ICQoVElGRjJQTk0pCi0jIFRPRE86IHJ1biAkKFRJRkYyUE5NKQotCi1jaGVjazogdGVzdAotCi0uYy5vOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi0kKE1JTklUSUZGX0xJQik6ICQoTUlOSVRJRkZfT0JKUykKLQkkKEFSKSAkKEFSRkxBR1MpICRAICQoTUlOSVRJRkZfT0JKUykKLQkkKFJBTkxJQikgJEAKLQotJChUSUZGMlBOTSk6ICQoVElGRjJQTk1fT0JKUykgJChNSU5JVElGRl9MSUIpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKFRJRkYyUE5NX09CSlMpICQoTUlOSVRJRkZfTElCKSAkKExJQlMpCi0KLXRpZmZiYXNlLm86IHRpZmZiYXNlLmMgbWluaXRpZmYuaAotdGlmZnJlYWQubzogdGlmZnJlYWQuYyBtaW5pdGlmZi5oIHRpZmZkZWYuaAotdGlmZndyaXRlLm86IHRpZmZ3cml0ZS5jCi0KLXRlc3QvdGlmZjJwbm0ubzogdGVzdC90aWZmMnBubS5jIG1pbml0aWZmLmgKLQkkKENDKSAtYyAtSS4gJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQqLmMKLQotY2xlYW46Ci0JLSQoUk1fRikgJChNSU5JVElGRl9MSUIpICQoTUlOSVRJRkZfT0JKUykKLQktJChSTV9GKSAkKFRJRkYyUE5NKSAkKFRJRkYyUE5NX09CSlMpCi0KLWRpc3RjbGVhbjogY2xlYW4KLQktJChSTV9GKSBNYWtlZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21pbml0aWZmL1JFQURNRS5vcHRpcG5nLnR4dCBiL3NyYy9taW5pdGlmZi9SRUFETUUub3B0aXBuZy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNjFmZWMuLjAwMDAwMDAKLS0tIGEvc3JjL21pbml0aWZmL1JFQURNRS5vcHRpcG5nLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotTmFtZTogbWluaXRpZmYKLVN1bW1hcnk6IE1pbmltYWwgSS9PIGludGVyZmFjZSB0byB0aGUgVGFnZ2VkIEltYWdlIEZpbGUgRm9ybWF0IChUSUZGKQotQXV0aG9yOiBDb3NtaW4gVHJ1dGEKLVZlcnNpb246IDAuMQotTGljZW5zZTogemxpYgpkaWZmIC0tZ2l0IGEvc3JjL21pbml0aWZmL21pbml0aWZmLmggYi9zcmMvbWluaXRpZmYvbWluaXRpZmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwZDdmNS4uMDAwMDAwMAotLS0gYS9zcmMvbWluaXRpZmYvbWluaXRpZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioKLSAqIG1pbml0aWZmLmgKLSAqIE1pbmltYWwgSS9PIGludGVyZmFjZSB0byB0aGUgVGFnZ2VkIEltYWdlIEZpbGUgRm9ybWF0IChUSUZGKS4KLSAqIFZlcnNpb24gMC4xLCBSZWxlYXNlIDIwMDYtSnVseS0yMS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgQ29zbWluIFRydXRhLgotICoKLSAqIG1pbml0aWZmIGlzIG9wZW4tc291cmNlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgemxpYiBsaWNlbnNlLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcihzKSBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0gKgotICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0gKgotICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi0gKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0gKiovCi0KLQotI2lmbmRlZiBNSU5JVElGRl9ICi0jZGVmaW5lIE1JTklUSUZGX0gKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0vKioKLSAqIFRoZSBtaW5pdGlmZiBkYXRhIHN0cnVjdHVyZS4KLSAqKi8KLXN0cnVjdCBtaW5pdGlmZl9pbmZvCi17Ci0gICAgdm9pZCAoKmVycm9yX2hhbmRsZXIpKGNvbnN0IGNoYXIgKm1zZyk7Ci0gICAgdm9pZCAoKndhcm5pbmdfaGFuZGxlcikoY29uc3QgY2hhciAqbXNnKTsKLSAgICBpbnQgYnl0ZV9vcmRlcjsKLSAgICBzaXplX3Qgd2lkdGgsIGhlaWdodDsKLSAgICB1bnNpZ25lZCBpbnQgYml0c19wZXJfc2FtcGxlOwotICAgIHVuc2lnbmVkIGludCBjb21wcmVzc2lvbjsKLSAgICB1bnNpZ25lZCBpbnQgcGhvdG9tZXRyaWM7Ci0gICAgc2l6ZV90IHN0cmlwX29mZnNldHNfY291bnQ7Ci0gICAgbG9uZyAqc3RyaXBfb2Zmc2V0czsKLSAgICB1bnNpZ25lZCBpbnQgc2FtcGxlc19wZXJfcGl4ZWw7Ci0gICAgdW5zaWduZWQgaW50IHJvd3NfcGVyX3N0cmlwOwotfTsKLQotCi0vKioKLSAqIENvbnN0cnVjdG9yLCB2YWxpZGF0b3IgYW5kIGRlc3RydWN0b3IuCi0gKiovCi12b2lkIG1pbml0aWZmX2luaXRfaW5mbyhzdHJ1Y3QgbWluaXRpZmZfaW5mbyAqbWluaXRpZmZfcHRyKTsKLXZvaWQgbWluaXRpZmZfdmFsaWRhdGVfaW5mbyhzdHJ1Y3QgbWluaXRpZmZfaW5mbyAqdGlmZl9wdHIpOwotdm9pZCBtaW5pdGlmZl9kZXN0cm95X2luZm8oc3RydWN0IG1pbml0aWZmX2luZm8gKm1pbml0aWZmX3B0cik7Ci0KLQotLyoqCi0gKiBJbnB1dCBmdW5jdGlvbnMuCi0gKiovCi12b2lkIG1pbml0aWZmX3JlYWRfaW5mbyhzdHJ1Y3QgbWluaXRpZmZfaW5mbyAqbWluaXRpZmZfcHRyLCBGSUxFICpmcCk7Ci12b2lkIG1pbml0aWZmX3JlYWRfcm93KHN0cnVjdCBtaW5pdGlmZl9pbmZvICptaW5pdGlmZl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ5dGVfcHRyLCBzaXplX3Qgcm93X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICBGSUxFICpmcCk7Ci0KLQotLyoqCi0gKiBPdXRwdXQgZnVuY3Rpb25zLgotICoqLwotdm9pZCBtaW5pdGlmZl93cml0ZV9pbmZvKHN0cnVjdCBtaW5pdGlmZl9pbmZvICptaW5pdGlmZl9wdHIsIEZJTEUgKmZwKTsKLXZvaWQgbWluaXRpZmZfd3JpdGVfcm93KGNvbnN0IHN0cnVjdCBtaW5pdGlmZl9pbmZvICptaW5pdGlmZl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlX3B0ciwgc2l6ZV90IHJvd19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZJTEUgKmZwKTsKLQotCi0vKioKLSAqIEVycm9yIHJlcG9ydGluZy4KLSAqKi8KLXZvaWQgbWluaXRpZmZfZXJyb3Ioc3RydWN0IG1pbml0aWZmX2luZm8gKm1pbml0aWZmX3B0ciwgY29uc3QgY2hhciAqbXNnKTsKLXZvaWQgbWluaXRpZmZfd2FybmluZyhzdHJ1Y3QgbWluaXRpZmZfaW5mbyAqbWluaXRpZmZfcHRyLCBjb25zdCBjaGFyICptc2cpOwotCi0KLS8qKgotICogR2xvYmFsIGNvbnN0YW50czoKLSAqIFRJRkYgZmlsZSBzaWduYXR1cmUuCi0gKiovCi1leHRlcm4gY29uc3QgY2hhciBtaW5pdGlmZl9zaWdfbVs0XTsKLWV4dGVybiBjb25zdCBjaGFyIG1pbml0aWZmX3NpZ19pWzRdOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLyogZXh0ZXJuICJDIiAqLwotI2VuZGlmCi0KLSNlbmRpZiAgLyogTUlOSVRJRkZfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21pbml0aWZmL3Rlc3QvdGlmZjJwbm0uYyBiL3NyYy9taW5pdGlmZi90ZXN0L3RpZmYycG5tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOTAxMDEuLjAwMDAwMDAKLS0tIGEvc3JjL21pbml0aWZmL3Rlc3QvdGlmZjJwbm0uYworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgIm1pbml0aWZmLmgiCi0KLQotc3RhdGljIHZvaWQgZXJyb3IoY29uc3QgY2hhciAqbXNnKQotewotICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIG1zZyk7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gICAgRklMRSAqaW5fZmlsZSwgKm91dF9maWxlOwotICAgIHN0cnVjdCBtaW5pdGlmZl9pbmZvIHRpZmZfaW5mbzsKLSAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIGhlaWdodCwgZGVwdGgsIHk7Ci0gICAgdW5zaWduZWQgY2hhciAqcm93OwotCi0gICAgaWYgKGFyZ2MgPD0gMikKLSAgICAgICAgZXJyb3IoIlVzYWdlOiB0aWZmMnBubSBpbnB1dC50aWYgb3V0cHV0LnBubSIpOwotCi0gICAgaW5fZmlsZSA9IGZvcGVuKGFyZ3ZbMV0sICJyYiIpOwotICAgIGlmIChpbl9maWxlID09IE5VTEwpCi0gICAgICAgIGVycm9yKCJDYW4ndCBvcGVuIGlucHV0IChUSUZGKSBmaWxlIik7Ci0gICAgbWluaXRpZmZfaW5pdF9pbmZvKCZ0aWZmX2luZm8pOwotICAgIG1pbml0aWZmX3JlYWRfaW5mbygmdGlmZl9pbmZvLCBpbl9maWxlKTsKLSAgICB3aWR0aCAgPSB0aWZmX2luZm8ud2lkdGg7Ci0gICAgaGVpZ2h0ID0gdGlmZl9pbmZvLmhlaWdodDsKLSAgICBkZXB0aCAgPSB0aWZmX2luZm8uc2FtcGxlc19wZXJfcGl4ZWw7Ci0gICAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApCi0gICAgICAgIGVycm9yKCJJbnZhbGlkIFRJRkYgZGltZW5zaW9ucyIpOwotICAgIGlmIChkZXB0aCAhPSAxICYmIGRlcHRoICE9IDMpCi0gICAgICAgIGVycm9yKCJJbnZhbGlkIG51bWJlciBvZiBjb2xvciBwbGFuZXMiKTsKLQotICAgIHJvdyA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKGRlcHRoICogd2lkdGgpOwotICAgIGlmIChyb3cgPT0gTlVMTCkKLSAgICAgICAgZXJyb3IoIk91dCBvZiBtZW1vcnkiKTsKLQotICAgIG91dF9maWxlID0gZm9wZW4oYXJndlsyXSwgIndiIik7Ci0gICAgaWYgKG91dF9maWxlID09IE5VTEwpCi0gICAgICAgIGVycm9yKCJDYW4ndCBvcGVuIG91dHB1dCAoUE5NKSBmaWxlIik7Ci0gICAgZnByaW50ZihvdXRfZmlsZSwgIlAlY1xuJWQgJWRcbjI1NVxuIiwKLSAgICAgICAgKChkZXB0aCA9PSAxKSA/ICc1JyA6ICc2JyksCi0gICAgICAgIHdpZHRoLCBoZWlnaHQpOwotCi0gICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KQotICAgIHsKLSAgICAgICAgbWluaXRpZmZfcmVhZF9yb3coJnRpZmZfaW5mbywgcm93LCB5LCBpbl9maWxlKTsKLSAgICAgICAgaWYgKGZ3cml0ZShyb3csIGRlcHRoLCB3aWR0aCwgb3V0X2ZpbGUpICE9IHdpZHRoKQotICAgICAgICAgICAgZXJyb3IoIkNhbid0IHdyaXRlIHRvIG91dHB1dCBmaWxlIik7Ci0gICAgfQotCi0gICAgbWluaXRpZmZfZGVzdHJveV9pbmZvKCZ0aWZmX2luZm8pOwotICAgIGZjbG9zZShpbl9maWxlKTsKLSAgICBmY2xvc2Uob3V0X2ZpbGUpOwotICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWluaXRpZmYvdGlmZmJhc2UuYyBiL3NyYy9taW5pdGlmZi90aWZmYmFzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzFkNzAzLi4wMDAwMDAwCi0tLSBhL3NyYy9taW5pdGlmZi90aWZmYmFzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiB0aWZmYmFzZS5jCi0gKiBHZW5lcmFsLXB1cnBvc2Ugcm91dGluZXMgZm9yIG1pbml0aWZmLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBDb3NtaW4gVHJ1dGEuCi0gKgotICogbWluaXRpZmYgaXMgb3Blbi1zb3VyY2Ugc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB6bGliIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gbWluaXRpZmYuaC4KLSAqKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJtaW5pdGlmZi5oIgotCi0KLS8qKgotICogQ29uc3RydWN0b3IuCi0gKiovCi12b2lkIG1pbml0aWZmX2luaXRfaW5mbyhzdHJ1Y3QgbWluaXRpZmZfaW5mbyAqbWluaXRpZmZfcHRyKQotewotICAgIG1lbXNldChtaW5pdGlmZl9wdHIsIDAsIHNpemVvZigqbWluaXRpZmZfcHRyKSk7Ci0gICAgbWluaXRpZmZfcHRyLT5waG90b21ldHJpYyA9ICh1bnNpZ25lZCBpbnQpKC0xKTsKLX0KLQotCi0vKioKLSAqIFZhbGlkYXRvci4KLSAqKi8KLXZvaWQgbWluaXRpZmZfdmFsaWRhdGVfaW5mbyhzdHJ1Y3QgbWluaXRpZmZfaW5mbyAqdGlmZl9wdHIpCi17Ci0gICAgaWYgKHRpZmZfcHRyLT53aWR0aCA9PSAwIHx8IHRpZmZfcHRyLT5oZWlnaHQgPT0gMAotICAgICB8fCB0aWZmX3B0ci0+Yml0c19wZXJfc2FtcGxlID09IDAgfHwgdGlmZl9wdHItPnNhbXBsZXNfcGVyX3BpeGVsID09IDApCi0gICAgICAgIG1pbml0aWZmX2Vycm9yKHRpZmZfcHRyLCAiSW52YWxpZCBUSUZGIGRpbWVuc2lvbnMiKTsKLSAgICBpZiAodGlmZl9wdHItPnN0cmlwX29mZnNldHMgPT0gTlVMTCB8fCB0aWZmX3B0ci0+cm93c19wZXJfc3RyaXAgPT0gMCkKLSAgICAgICAgbWluaXRpZmZfZXJyb3IodGlmZl9wdHIsICJJbnZhbGlkIFRJRkYgc3RyaXAgaW5mbyIpOwotICAgIGlmICh0aWZmX3B0ci0+cGhvdG9tZXRyaWMgPj0gMykKLSAgICAgICAgbWluaXRpZmZfZXJyb3IodGlmZl9wdHIsICJVbmtub3duIHBob3RvbWV0cmljIGludGVycHJldGF0aW9uIik7Ci19Ci0KLQotLyoqCi0gKiBEZXN0cnVjdG9yLgotICoqLwotdm9pZCBtaW5pdGlmZl9kZXN0cm95X2luZm8oc3RydWN0IG1pbml0aWZmX2luZm8gKm1pbml0aWZmX3B0cikKLXsKLSAgICBpZiAobWluaXRpZmZfcHRyLT5zdHJpcF9vZmZzZXRzICE9IE5VTEwpCi0gICAgICAgIGZyZWUobWluaXRpZmZfcHRyLT5zdHJpcF9vZmZzZXRzKTsKLX0KLQotCi0vKioKLSAqIEVycm9yIHJlcG9ydGluZy4KLSAqKi8KLXN0YXRpYyB2b2lkIG1pbml0aWZmX2RlZmF1bHRfZXJyb3JfaGFuZGxlcihjb25zdCBjaGFyICptc2cpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICIqKiBFcnJvcjogJXNcbiIsIG1zZyk7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCi12b2lkIG1pbml0aWZmX2Vycm9yKHN0cnVjdCBtaW5pdGlmZl9pbmZvICptaW5pdGlmZl9wdHIsIGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgICBpZiAobWluaXRpZmZfcHRyLT5lcnJvcl9oYW5kbGVyICE9IE5VTEwpCi0gICAgICAgIG1pbml0aWZmX3B0ci0+ZXJyb3JfaGFuZGxlcihtc2cpOwotICAgIGVsc2UKLSAgICAgICAgbWluaXRpZmZfZGVmYXVsdF9lcnJvcl9oYW5kbGVyKG1zZyk7Ci0gICAgYWJvcnQoKTsKLX0KLQotc3RhdGljIHZvaWQgbWluaXRpZmZfZGVmYXVsdF93YXJuaW5nX2hhbmRsZXIoY29uc3QgY2hhciAqbXNnKQotewotICAgIGZwcmludGYoc3RkZXJyLCAiKiogV2FybmluZzogJXNcbiIsIG1zZyk7Ci19Ci0KLXZvaWQgbWluaXRpZmZfd2FybmluZyhzdHJ1Y3QgbWluaXRpZmZfaW5mbyAqbWluaXRpZmZfcHRyLCBjb25zdCBjaGFyICptc2cpCi17Ci0gICAgaWYgKG1pbml0aWZmX3B0ci0+d2FybmluZ19oYW5kbGVyICE9IE5VTEwpCi0gICAgICAgIG1pbml0aWZmX3B0ci0+d2FybmluZ19oYW5kbGVyKG1zZyk7Ci0gICAgZWxzZQotICAgICAgICBtaW5pdGlmZl9kZWZhdWx0X3dhcm5pbmdfaGFuZGxlcihtc2cpOwotfQotCi0KLS8qKgotICogR2xvYmFsIGNvbnN0YW50czoKLSAqIFRJRkYgZmlsZSBzaWduYXR1cmUuCi0gKiovCi1jb25zdCBjaGFyIG1pbml0aWZmX3NpZ19tWzRdID0geyAweDRkLCAweDRkLCAweDAwLCAweDJhIH07ICAvKiAiTU1cMCoiICovCi1jb25zdCBjaGFyIG1pbml0aWZmX3NpZ19pWzRdID0geyAweDQ5LCAweDQ5LCAweDJhLCAweDAwIH07ICAvKiAiSUkqXDAiICovCmRpZmYgLS1naXQgYS9zcmMvbWluaXRpZmYvdGlmZmRlZi5oIGIvc3JjL21pbml0aWZmL3RpZmZkZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y3YWVkMi4uMDAwMDAwMAotLS0gYS9zcmMvbWluaXRpZmYvdGlmZmRlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqCi0gKiB0aWZmZGVmLmgKLSAqIE1hY3JvIGRlZmluaXRpb25zIGZvciBtaW5pdGlmZiAocHJpdmF0ZSkuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2IENvc21pbiBUcnV0YS4KLSAqCi0gKiBtaW5pdGlmZiBpcyBvcGVuLXNvdXJjZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHpsaWIgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBtaW5pdGlmZi5oLgotICoqLwotCi0jaWZuZGVmIE1JTklUSUZGX0RFRl9ICi0jZGVmaW5lIE1JTklUSUZGX0RFRl9ICi0KLSNkZWZpbmUgVElGRl9UQUdfU1VCRklMRV9UWVBFICAgICAgICAgICAweDAwZmUKLSNkZWZpbmUgVElGRl9UQUdfV0lEVEggICAgICAgICAgICAgICAgICAweDAxMDAKLSNkZWZpbmUgVElGRl9UQUdfSEVJR0hUICAgICAgICAgICAgICAgICAweDAxMDEKLSNkZWZpbmUgVElGRl9UQUdfQklUU19QRVJfU0FNUExFICAgICAgICAweDAxMDIKLSNkZWZpbmUgVElGRl9UQUdfQ09NUFJFU1NJT04gICAgICAgICAgICAweDAxMDMKLSNkZWZpbmUgVElGRl9UQUdfUEhPVE9NRVRSSUMgICAgICAgICAgICAweDAxMDYKLSNkZWZpbmUgVElGRl9UQUdfRE9DVU1FTlRfTkFNRSAgICAgICAgICAweDAxMGQKLSNkZWZpbmUgVElGRl9UQUdfSU1BR0VfREVTQ1JJUFRJT04gICAgICAweDAxMGUKLSNkZWZpbmUgVElGRl9UQUdfTUFLRSAgICAgICAgICAgICAgICAgICAweDAxMGYKLSNkZWZpbmUgVElGRl9UQUdfTU9ERUwgICAgICAgICAgICAgICAgICAweDAxMTAKLSNkZWZpbmUgVElGRl9UQUdfU1RSSVBfT0ZGU0VUUyAgICAgICAgICAweDAxMTEKLSNkZWZpbmUgVElGRl9UQUdfT1JJRU5UQVRJT04gICAgICAgICAgICAweDAxMTIKLSNkZWZpbmUgVElGRl9UQUdfU0FNUExFU19QRVJfUElYRUwgICAgICAweDAxMTUKLSNkZWZpbmUgVElGRl9UQUdfUk9XU19QRVJfU1RSSVAgICAgICAgICAweDAxMTYKLSNkZWZpbmUgVElGRl9UQUdfU1RSSVBfQllURV9DT1VOVFMgICAgICAweDAxMTcKLSNkZWZpbmUgVElGRl9UQUdfTUlOX1NBTVBMRV9WQUxVRSAgICAgICAweDAxMTgKLSNkZWZpbmUgVElGRl9UQUdfTUFYX1NBTVBMRV9WQUxVRSAgICAgICAweDAxMTkKLSNkZWZpbmUgVElGRl9UQUdfWF9SRVNPTFVUSU9OICAgICAgICAgICAweDAxMWEKLSNkZWZpbmUgVElGRl9UQUdfWV9SRVNPTFVUSU9OICAgICAgICAgICAweDAxMWIKLSNkZWZpbmUgVElGRl9UQUdfUExBTkFSX0NPTkZJR1VSQVRJT04gICAweDAxMWMKLSNkZWZpbmUgVElGRl9UQUdfUEFHRV9OQU1FICAgICAgICAgICAgICAweDAxMWQKLSNkZWZpbmUgVElGRl9UQUdfWF9QT1NJVElPTiAgICAgICAgICAgICAweDAxMWUKLSNkZWZpbmUgVElGRl9UQUdfWV9QT1NJVElPTiAgICAgICAgICAgICAweDAxMWYKLSNkZWZpbmUgVElGRl9UQUdfUkVTT0xVVElPTl9VTklUICAgICAgICAweDAxMjgKLSNkZWZpbmUgVElGRl9UQUdfUEFHRV9OVU1CRVIgICAgICAgICAgICAweDAxMjkKLSNkZWZpbmUgVElGRl9UQUdfU09GVFdBUkUgICAgICAgICAgICAgICAweDAxMzEKLSNkZWZpbmUgVElGRl9UQUdfREFURV9USU1FICAgICAgICAgICAgICAweDAxMzIKLSNkZWZpbmUgVElGRl9UQUdfQVJUSVNUICAgICAgICAgICAgICAgICAweDAxM2IKLSNkZWZpbmUgVElGRl9UQUdfSE9TVF9DT01QVVRFUiAgICAgICAgICAweDAxM2MKLSNkZWZpbmUgVElGRl9UQUdfUFJFRElDVE9SICAgICAgICAgICAgICAweDAxM2QKLQotLyogVElGRiBleHRlbnNpb25zICovCi0jZGVmaW5lIFRJRkZfVEFHRVhUX1hNUCAgICAgICAgICAgICAgICAgICAgIDB4MDJiYwotI2RlZmluZSBUSUZGX1RBR0VYVF9JUFRDICAgICAgICAgICAgICAgICAgICAweDgzYmIKLSNkZWZpbmUgVElGRl9UQUdFWFRfRVhJRl9JRkQgICAgICAgICAgICAgICAgMHg4NzY5Ci0jZGVmaW5lIFRJRkZfVEFHRVhUX0dQU19JRkQgICAgICAgICAgICAgICAgIDB4ODgyNQotI2RlZmluZSBUSUZGX1RBR0VYVF9JTlRFUk9QRVJBQklMSVRZX0lGRCAgICAweGEwMDUKLSNkZWZpbmUgVElGRl9UQUdFWFRfUFJJTlRfSU0gICAgICAgICAgICAgICAgMHhjNGE1Ci0KLSNlbmRpZiAgLyogTUlOSVRJRkZfREVGX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9taW5pdGlmZi90aWZmcmVhZC5jIGIvc3JjL21pbml0aWZmL3RpZmZyZWFkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OTEwZWMuLjAwMDAwMDAKLS0tIGEvc3JjL21pbml0aWZmL3RpZmZyZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyoqCi0gKiB0aWZmcmVhZC5jCi0gKiBGaWxlIGlucHV0IHJvdXRpbmVzIGZvciBtaW5pdGlmZi4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgQ29zbWluIFRydXRhLgotICoKLSAqIG1pbml0aWZmIGlzIG9wZW4tc291cmNlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgemxpYiBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIG1pbml0aWZmLmguCi0gKiovCi0KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAibWluaXRpZmYuaCIKLSNpbmNsdWRlICJ0aWZmZGVmLmgiCi0KLQotLyoqCi0gKiBFcnJvciBtZXNzYWdlcy4KLSAqKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKLXRpZmZfZXJyX3JlYWQgICAgICAgID0gIkVycm9yIHJlYWRpbmcgVElGRiBmaWxlIjsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotdGlmZl9lcnJfbm90aWZmICAgICAgPSAiTm90IGEgVElGRiBmaWxlIjsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotdGlmZl9lcnJfaW52YWxpZCAgICAgPSAiSW52YWxpZCBUSUZGIGZpbGUiOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi10aWZmX2Vycl91bnN1cHBvcnRlZCA9ICJVbnN1cHBvcnRlZCBkYXRhIGZvcm1hdCBpbiBUSUZGIGZpbGUiOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi10aWZmX2Vycl9jb21wciAgICAgICA9ICJVbnN1cHBvcnRlZCBjb21wcmVzc2lvbiBpbiBUSUZGIGZpbGUiOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi10aWZmX2Vycl9tZW1vcnkgICAgICA9ICJPdXQgb2YgbWVtb3J5IjsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotdGlmZl93YXJuX3RhZyAgICAgICAgPSAiVW5yZWNvZ25pemVkIHRhZyhzKSBpbiBUSUZGIGZpbGUiOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi10aWZmX3dhcm5fbWV0YWRhdGEgICA9ICJVbnJlY29nbml6ZWQgRVhJRi9JUFRDL1hNUCBtZXRhZGF0YSBpbiBUSUZGIGZpbGUiOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi10aWZmX3dhcm5fbXVsdGlwbGUgICA9ICJTZWxlY3RlZCBmaXJzdCBpbWFnZSBmcm9tIG11bHRpLWltYWdlIFRJRkYgZmlsZSI7Ci0KLQotLyoqCi0gKiBVdGlsaXRpZXMuCi0gKiovCi1zdHJ1Y3QKLW1pbml0aWZmX2dldF9zdHJ1Y3QKLXsKLSAgICB1bnNpZ25lZCBpbnQgICgqZ2V0X3VzaG9ydCkoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmX3B0cik7Ci0gICAgdW5zaWduZWQgbG9uZyAoKmdldF91bG9uZykgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Zl9wdHIpOwotfTsKLQotc3RhdGljIHVuc2lnbmVkIGludAotZ2V0X3VzaG9ydF9tKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Zl9wdHIpCi17Ci0gICAgcmV0dXJuICgodW5zaWduZWQgaW50KWJ1Zl9wdHJbMF0gPDwgOCkgKwotICAgICAgICAgICAoKHVuc2lnbmVkIGludClidWZfcHRyWzFdKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotZ2V0X3VzaG9ydF9pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Zl9wdHIpCi17Ci0gICAgcmV0dXJuICgodW5zaWduZWQgaW50KWJ1Zl9wdHJbMF0pICAgICAgKwotICAgICAgICAgICAoKHVuc2lnbmVkIGludClidWZfcHRyWzFdIDw8IDgpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZ2V0X3Vsb25nX20oY29uc3QgdW5zaWduZWQgY2hhciAqYnVmX3B0cikKLXsKLSAgICByZXR1cm4gKCh1bnNpZ25lZCBsb25nKWJ1Zl9wdHJbMF0gPDwgMjQpICsKLSAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKWJ1Zl9wdHJbMV0gPDwgMTYpICsKLSAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKWJ1Zl9wdHJbMl0gPDwgOCkgICsKLSAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKWJ1Zl9wdHJbM10pOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZ2V0X3Vsb25nX2koY29uc3QgdW5zaWduZWQgY2hhciAqYnVmX3B0cikKLXsKLSAgICByZXR1cm4gKCh1bnNpZ25lZCBsb25nKWJ1Zl9wdHJbMF0pICAgICAgICsKLSAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKWJ1Zl9wdHJbMV0gPDwgOCkgICsKLSAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKWJ1Zl9wdHJbMl0gPDwgMTYpICsKLSAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKWJ1Zl9wdHJbM10gPDwgMjQpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZ2V0X3Vsb25nX3ZhbHVlKHN0cnVjdCBtaW5pdGlmZl9nZXRfc3RydWN0ICpnZXRfcHRyLCBpbnQgdGFnX3R5cGUsCi0gICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmX3B0cikKLXsKLSAgICBzd2l0Y2ggKHRhZ190eXBlKQotICAgIHsKLSAgICBjYXNlIDE6ICAvKiBieXRlICovCi0gICAgICAgIHJldHVybiAodW5zaWduZWQgbG9uZylidWZfcHRyWzBdOwotICAgIGNhc2UgMzogIC8qIHVzaG9ydCAqLwotICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpZ2V0X3B0ci0+Z2V0X3VzaG9ydChidWZfcHRyKTsKLSAgICBjYXNlIDQ6ICAvKiB1bG9uZyAqLwotICAgICAgICByZXR1cm4gZ2V0X3B0ci0+Z2V0X3Vsb25nKGJ1Zl9wdHIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiAodW5zaWduZWQgbG9uZyktMUw7ICAvKiBlcnJvciAqLwotICAgIH0KLX0KLQotc3RhdGljIHNpemVfdAotcmVhZF91bG9uZ192YWx1ZXMoc3RydWN0IG1pbml0aWZmX2dldF9zdHJ1Y3QgKmdldF9wdHIsIGludCB0YWdfdHlwZSwKLSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWVzW10sIHNpemVfdCBjb3VudCwgRklMRSAqZnApCi17Ci0gICAgdW5zaWduZWQgY2hhciBidWZbNF07Ci0gICAgc2l6ZV90IHZhbHVlX3NpemU7Ci0gICAgc2l6ZV90IGk7Ci0KLSAgICBpZiAodGFnX3R5cGUgPT0gMSkgIC8qIGJ5dGUgKi8KLSAgICAgICAgdmFsdWVfc2l6ZSA9IDE7Ci0gICAgZWxzZSBpZiAodGFnX3R5cGUgPT0gMykgIC8qIHVzaG9ydCAqLwotICAgICAgICB2YWx1ZV9zaXplID0gMjsKLSAgICBlbHNlIGlmICh0YWdfdHlwZSA9PSA0KSAgLyogdWxvbmcgKi8KLSAgICAgICAgdmFsdWVfc2l6ZSA9IDQ7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsgIC8qIHJlYWQgbm90aGluZyAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCi0gICAgewotICAgICAgICBpZiAoZnJlYWQoYnVmLCB2YWx1ZV9zaXplLCAxLCBmcCkgIT0gMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB2YWx1ZXNbaV0gPSBnZXRfdWxvbmdfdmFsdWUoZ2V0X3B0ciwgdGFnX3R5cGUsIGJ1Zik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGk7Ci19Ci0KLQotLyoqCi0gKiBSZWFkIGluaXRpYWxpemVyLgotICoqLwotdm9pZAotbWluaXRpZmZfcmVhZF9pbmZvKHN0cnVjdCBtaW5pdGlmZl9pbmZvICp0aWZmX3B0ciwgRklMRSAqZnApCi17Ci0gICAgc3RydWN0IG1pbml0aWZmX2dldF9zdHJ1Y3QgZ2V0dGVyOwotICAgIHVuc2lnbmVkIGNoYXIgYnVmWzEyXTsKLSAgICB1bnNpZ25lZCBjaGFyICp2YnVmID0gYnVmICsgODsKLSAgICBsb25nIGRpcl9vZmZzZXQ7Ci0gICAgdW5zaWduZWQgaW50IGRpcl9zaXplLCBpOwotICAgIHVuc2lnbmVkIGludCB0YWdfaWQsIHRhZ190eXBlOwotICAgIHNpemVfdCBjb3VudDsKLSAgICBzaXplX3QgYml0c19wZXJfc2FtcGxlX2NvdW50OwotICAgIHVuc2lnbmVkIGludCBiaXRzX3Blcl9zYW1wbGVfdGFnX3R5cGUsIHN0cmlwX29mZnNldHNfdGFnX3R5cGU7Ci0gICAgbG9uZyBiaXRzX3Blcl9zYW1wbGVfb2Zmc2V0LCBzdHJpcF9vZmZzZXRzX29mZnNldDsKLSAgICBpbnQgdW5rbm93bl90YWdfZm91bmQsIHVua25vd25fbWV0YWRhdGFfZm91bmQ7Ci0KLSAgICAvKiBSZWFkIHRoZSBUSUZGIGhlYWRlci4gKi8KLSAgICBpZiAoZnJlYWQoYnVmLCA4LCAxLCBmcCkgIT0gMSkKLSAgICAgICAgZ290byBlcnJfcmVhZDsKLSAgICBpZiAobWVtY21wKGJ1ZiwgbWluaXRpZmZfc2lnX20sIDQpID09IDApCi0gICAgewotICAgICAgICB0aWZmX3B0ci0+Ynl0ZV9vcmRlciA9ICdNJzsKLSAgICAgICAgZ2V0dGVyLmdldF91c2hvcnQgPSBnZXRfdXNob3J0X207Ci0gICAgICAgIGdldHRlci5nZXRfdWxvbmcgID0gZ2V0X3Vsb25nX207Ci0gICAgfQotICAgIGVsc2UgaWYgKG1lbWNtcChidWYsIG1pbml0aWZmX3NpZ19pLCA0KSA9PSAwKQotICAgIHsKLSAgICAgICAgdGlmZl9wdHItPmJ5dGVfb3JkZXIgPSAnSSc7Ci0gICAgICAgIGdldHRlci5nZXRfdXNob3J0ID0gZ2V0X3VzaG9ydF9pOwotICAgICAgICBnZXR0ZXIuZ2V0X3Vsb25nICA9IGdldF91bG9uZ19pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtaW5pdGlmZl9lcnJvcih0aWZmX3B0ciwgdGlmZl9lcnJfbm90aWZmKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBiaXRzX3Blcl9zYW1wbGVfY291bnQgPSAwOwotICAgIGJpdHNfcGVyX3NhbXBsZV90YWdfdHlwZSA9IHN0cmlwX29mZnNldHNfdGFnX3R5cGUgPSAwOwotICAgIGJpdHNfcGVyX3NhbXBsZV9vZmZzZXQgPSBzdHJpcF9vZmZzZXRzX29mZnNldCA9IDA7Ci0gICAgZGlyX29mZnNldCA9IChsb25nKWdldHRlci5nZXRfdWxvbmcoYnVmICsgNCk7Ci0gICAgaWYgKGRpcl9vZmZzZXQgPCA4TCkKLSAgICAgICAgZ290byBlcnJfaW52YWxpZDsKLSAgICBpZiAoZnNlZWsoZnAsIGRpcl9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgICAgICBnb3RvIGVycl9yZWFkOwotCi0gICAgLyogUmVhZCB0aGUgVElGRiBkaXJlY3RvcnkuICovCi0gICAgaWYgKGZyZWFkKGJ1ZiwgMiwgMSwgZnApICE9IDEpCi0gICAgICAgIGdvdG8gZXJyX3JlYWQ7Ci0gICAgZGlyX3NpemUgPSBnZXR0ZXIuZ2V0X3VzaG9ydChidWYpOwotICAgIHVua25vd25fdGFnX2ZvdW5kID0gdW5rbm93bl9tZXRhZGF0YV9mb3VuZCA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IGRpcl9zaXplOyArK2kpCi0gICAgewotICAgICAgICBpZiAoZnJlYWQoYnVmLCAxMiwgMSwgZnApICE9IDEpCi0gICAgICAgICAgICBnb3RvIGVycl9yZWFkOwotICAgICAgICB0YWdfaWQgICA9IGdldHRlci5nZXRfdXNob3J0KGJ1Zik7Ci0gICAgICAgIHRhZ190eXBlID0gZ2V0dGVyLmdldF91c2hvcnQoYnVmICsgMik7Ci0gICAgICAgIGNvdW50ICAgID0gKHNpemVfdClnZXR0ZXIuZ2V0X3Vsb25nKGJ1ZiArIDQpOwotICAgICAgICBpZiAoY291bnQgPT0gMCkKLSAgICAgICAgICAgIGdvdG8gZXJyX3Vuc3VwcG9ydGVkOwotICAgICAgICBzd2l0Y2ggKHRhZ19pZCkKLSAgICAgICAgewotICAgICAgICBjYXNlIFRJRkZfVEFHX1NVQkZJTEVfVFlQRToKLSAgICAgICAgICAgIGlmIChjb3VudCAhPSAxCi0gICAgICAgICAgICAgfHwgKGdldF91bG9uZ192YWx1ZSgmZ2V0dGVyLCB0YWdfdHlwZSwgdmJ1ZikgJiB+KDJVTCkpICE9IDApCi0gICAgICAgICAgICAgICAgZ290byBlcnJfdW5zdXBwb3J0ZWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUSUZGX1RBR19XSURUSDoKLSAgICAgICAgICAgIGlmIChjb3VudCAhPSAxKQotICAgICAgICAgICAgICAgIGdvdG8gZXJyX3Vuc3VwcG9ydGVkOwotICAgICAgICAgICAgdGlmZl9wdHItPndpZHRoID0gKHNpemVfdClnZXRfdWxvbmdfdmFsdWUoJmdldHRlciwgdGFnX3R5cGUsIHZidWYpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVElGRl9UQUdfSEVJR0hUOgotICAgICAgICAgICAgaWYgKGNvdW50ICE9IDEpCi0gICAgICAgICAgICAgICAgZ290byBlcnJfdW5zdXBwb3J0ZWQ7Ci0gICAgICAgICAgICB0aWZmX3B0ci0+aGVpZ2h0ID0gKHNpemVfdClnZXRfdWxvbmdfdmFsdWUoJmdldHRlciwgdGFnX3R5cGUsIHZidWYpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVElGRl9UQUdfQklUU19QRVJfU0FNUExFOgotICAgICAgICAgICAgaWYgKGNvdW50ID09IDEpCi0gICAgICAgICAgICAgICAgdGlmZl9wdHItPmJpdHNfcGVyX3NhbXBsZSA9Ci0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZ2V0X3Vsb25nX3ZhbHVlKCZnZXR0ZXIsIHRhZ190eXBlLCB2YnVmKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiaXRzX3Blcl9zYW1wbGVfY291bnQgICAgPSBjb3VudDsKLSAgICAgICAgICAgICAgICBiaXRzX3Blcl9zYW1wbGVfdGFnX3R5cGUgPSB0YWdfdHlwZTsKLSAgICAgICAgICAgICAgICBiaXRzX3Blcl9zYW1wbGVfb2Zmc2V0ICAgPSAobG9uZylnZXR0ZXIuZ2V0X3Vsb25nKHZidWYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVElGRl9UQUdfQ09NUFJFU1NJT046Ci0gICAgICAgICAgICBpZiAoY291bnQgPT0gMSAmJiBnZXRfdWxvbmdfdmFsdWUoJmdldHRlciwgdGFnX3R5cGUsIHZidWYpID09IDEpCi0gICAgICAgICAgICAgICAgdGlmZl9wdHItPmNvbXByZXNzaW9uID0gMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtaW5pdGlmZl9lcnJvcih0aWZmX3B0ciwgdGlmZl9lcnJfY29tcHIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVElGRl9UQUdfUEhPVE9NRVRSSUM6Ci0gICAgICAgICAgICBpZiAoY291bnQgIT0gMSkKLSAgICAgICAgICAgICAgICBnb3RvIGVycl91bnN1cHBvcnRlZDsKLSAgICAgICAgICAgIHRpZmZfcHRyLT5waG90b21ldHJpYyA9Ci0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClnZXRfdWxvbmdfdmFsdWUoJmdldHRlciwgdGFnX3R5cGUsIHZidWYpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVElGRl9UQUdfU1RSSVBfT0ZGU0VUUzoKLSAgICAgICAgICAgIHRpZmZfcHRyLT5zdHJpcF9vZmZzZXRzX2NvdW50ID0gY291bnQ7Ci0gICAgICAgICAgICBpZiAoY291bnQgPT0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodGlmZl9wdHItPnN0cmlwX29mZnNldHMgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJfaW52YWxpZDsKLSAgICAgICAgICAgICAgICB0aWZmX3B0ci0+c3RyaXBfb2Zmc2V0cyA9IChsb25nICopbWFsbG9jKHNpemVvZihsb25nKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpZmZfcHRyLT5zdHJpcF9vZmZzZXRzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyX21lbW9yeTsKLSAgICAgICAgICAgICAgICB0aWZmX3B0ci0+c3RyaXBfb2Zmc2V0c1swXSA9Ci0gICAgICAgICAgICAgICAgICAgIChsb25nKWdldF91bG9uZ192YWx1ZSgmZ2V0dGVyLCB0YWdfdHlwZSwgdmJ1Zik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaXBfb2Zmc2V0c190YWdfdHlwZSA9IHRhZ190eXBlOwotICAgICAgICAgICAgICAgIHN0cmlwX29mZnNldHNfb2Zmc2V0ICAgPSAobG9uZylnZXR0ZXIuZ2V0X3Vsb25nKHZidWYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVElGRl9UQUdfT1JJRU5UQVRJT046Ci0gICAgICAgICAgICBpZiAoY291bnQgIT0gMSB8fCBnZXRfdWxvbmdfdmFsdWUoJmdldHRlciwgdGFnX3R5cGUsIHZidWYpICE9IDEpCi0gICAgICAgICAgICAgICAgbWluaXRpZmZfd2FybmluZyh0aWZmX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgIk5vbi1kZWZhdWx0IFRJRkYgaW1hZ2Ugb3JpZW50YXRpb24iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRJRkZfVEFHX1NBTVBMRVNfUEVSX1BJWEVMOgotICAgICAgICAgICAgaWYgKGNvdW50ICE9IDEpCi0gICAgICAgICAgICAgICAgZ290byBlcnJfdW5zdXBwb3J0ZWQ7Ci0gICAgICAgICAgICB0aWZmX3B0ci0+c2FtcGxlc19wZXJfcGl4ZWwgPQotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZ2V0X3Vsb25nX3ZhbHVlKCZnZXR0ZXIsIHRhZ190eXBlLCB2YnVmKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRJRkZfVEFHX1JPV1NfUEVSX1NUUklQOgotICAgICAgICAgICAgaWYgKGNvdW50ICE9IDEpCi0gICAgICAgICAgICAgICAgZ290byBlcnJfdW5zdXBwb3J0ZWQ7Ci0gICAgICAgICAgICB0aWZmX3B0ci0+cm93c19wZXJfc3RyaXAgPQotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZ2V0X3Vsb25nX3ZhbHVlKCZnZXR0ZXIsIHRhZ190eXBlLCB2YnVmKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRJRkZfVEFHX1NUUklQX0JZVEVfQ09VTlRTOgotICAgICAgICAgICAgLyogaWdub3JlZCBmb3IgdW5jb21wcmVzc2VkIGltYWdlcyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVElGRl9UQUdfUExBTkFSX0NPTkZJR1VSQVRJT046Ci0gICAgICAgIGNhc2UgVElGRl9UQUdfUFJFRElDVE9SOgotICAgICAgICAgICAgaWYgKGNvdW50ICE9IDEgfHwgZ2V0X3Vsb25nX3ZhbHVlKCZnZXR0ZXIsIHRhZ190eXBlLCB2YnVmKSAhPSAxKQotICAgICAgICAgICAgICAgIGdvdG8gZXJyX3Vuc3VwcG9ydGVkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVElGRl9UQUdfRE9DVU1FTlRfTkFNRToKLSAgICAgICAgY2FzZSBUSUZGX1RBR19JTUFHRV9ERVNDUklQVElPTjoKLSAgICAgICAgY2FzZSBUSUZGX1RBR19NQUtFOgotICAgICAgICBjYXNlIFRJRkZfVEFHX01PREVMOgotICAgICAgICBjYXNlIFRJRkZfVEFHX01JTl9TQU1QTEVfVkFMVUU6Ci0gICAgICAgIGNhc2UgVElGRl9UQUdfTUFYX1NBTVBMRV9WQUxVRToKLSAgICAgICAgY2FzZSBUSUZGX1RBR19YX1JFU09MVVRJT046Ci0gICAgICAgIGNhc2UgVElGRl9UQUdfWV9SRVNPTFVUSU9OOgotICAgICAgICBjYXNlIFRJRkZfVEFHX1hfUE9TSVRJT046Ci0gICAgICAgIGNhc2UgVElGRl9UQUdfWV9QT1NJVElPTjoKLSAgICAgICAgY2FzZSBUSUZGX1RBR19SRVNPTFVUSU9OX1VOSVQ6Ci0gICAgICAgIGNhc2UgVElGRl9UQUdfUEFHRV9OQU1FOgotICAgICAgICBjYXNlIFRJRkZfVEFHX1BBR0VfTlVNQkVSOgotICAgICAgICBjYXNlIFRJRkZfVEFHX1NPRlRXQVJFOgotICAgICAgICBjYXNlIFRJRkZfVEFHX0RBVEVfVElNRToKLSAgICAgICAgY2FzZSBUSUZGX1RBR19BUlRJU1Q6Ci0gICAgICAgIGNhc2UgVElGRl9UQUdfSE9TVF9DT01QVVRFUjoKLSAgICAgICAgICAgIC8qIGlnbm9yZSAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVElGRl9UQUdFWFRfWE1QOgotICAgICAgICBjYXNlIFRJRkZfVEFHRVhUX0lQVEM6Ci0gICAgICAgIGNhc2UgVElGRl9UQUdFWFRfRVhJRl9JRkQ6Ci0gICAgICAgIGNhc2UgVElGRl9UQUdFWFRfR1BTX0lGRDoKLSAgICAgICAgY2FzZSBUSUZGX1RBR0VYVF9JTlRFUk9QRVJBQklMSVRZX0lGRDoKLSAgICAgICAgY2FzZSBUSUZGX1RBR0VYVF9QUklOVF9JTToKLSAgICAgICAgICAgIGlmICghdW5rbm93bl9tZXRhZGF0YV9mb3VuZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1bmtub3duX21ldGFkYXRhX2ZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICBtaW5pdGlmZl93YXJuaW5nKHRpZmZfcHRyLCB0aWZmX3dhcm5fbWV0YWRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoIXVua25vd25fdGFnX2ZvdW5kKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVua25vd25fdGFnX2ZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICBtaW5pdGlmZl93YXJuaW5nKHRpZmZfcHRyLCB0aWZmX3dhcm5fdGFnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogSXMgdGhpcyB0aGUgbGFzdCBUSUZGIGRpcmVjdG9yeT8gKi8KLSAgICBpZiAoZnJlYWQoYnVmLCA0LCAxLCBmcCkgIT0gMSkKLSAgICAgICAgZ290byBlcnJfcmVhZDsKLSAgICBpZiAoZ2V0dGVyLmdldF91bG9uZyhidWYpICE9IDApCi0gICAgICAgIG1pbml0aWZmX3dhcm5pbmcodGlmZl9wdHIsIHRpZmZfd2Fybl9tdWx0aXBsZSk7Ci0KLSAgICAvKiBGaW5pc2ggdXAgdGhlIGluY29tcGxldGUgcmVhZGluZ3MuICovCi0gICAgaWYgKGJpdHNfcGVyX3NhbXBsZV9vZmZzZXQgIT0gMCkKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWVzWzRdOwotICAgICAgICBjb3VudCA9IGJpdHNfcGVyX3NhbXBsZV9jb3VudDsKLSAgICAgICAgaWYgKGNvdW50ICE9IChzaXplX3QpdGlmZl9wdHItPnNhbXBsZXNfcGVyX3BpeGVsKQotICAgICAgICAgICAgZ290byBlcnJfaW52YWxpZDsKLSAgICAgICAgaWYgKGNvdW50ID4gNCkKLSAgICAgICAgICAgIGdvdG8gZXJyX3Vuc3VwcG9ydGVkOwotICAgICAgICBpZiAoZnNlZWsoZnAsIGJpdHNfcGVyX3NhbXBsZV9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgICAgICAgICAgZ290byBlcnJfcmVhZDsKLSAgICAgICAgaWYgKHJlYWRfdWxvbmdfdmFsdWVzKCZnZXR0ZXIsIGJpdHNfcGVyX3NhbXBsZV90YWdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgY291bnQsIGZwKSAhPSBjb3VudCkKLSAgICAgICAgICAgIGdvdG8gZXJyX3JlYWQ7Ci0gICAgICAgIHdoaWxlICgtLWNvdW50ID4gMCkKLSAgICAgICAgICAgIGlmICh2YWx1ZXNbMF0gIT0gdmFsdWVzW2NvdW50XSkKLSAgICAgICAgICAgICAgICBnb3RvIGVycl91bnN1cHBvcnRlZDsKLSAgICAgICAgdGlmZl9wdHItPmJpdHNfcGVyX3NhbXBsZSA9ICh1bnNpZ25lZCBpbnQpdmFsdWVzWzBdOwotICAgIH0KLSAgICBpZiAoc3RyaXBfb2Zmc2V0c19vZmZzZXQgIT0gMCkKLSAgICB7Ci0gICAgICAgIGNvdW50ID0gdGlmZl9wdHItPnN0cmlwX29mZnNldHNfY291bnQ7Ci0gICAgICAgIGlmIChjb3VudCA9PSAwIHx8IGNvdW50ID4gdGlmZl9wdHItPmhlaWdodCkKLSAgICAgICAgICAgIGdvdG8gZXJyX2ludmFsaWQ7Ci0gICAgICAgIHRpZmZfcHRyLT5zdHJpcF9vZmZzZXRzID0gKGxvbmcgKiltYWxsb2MoY291bnQgKiBzaXplb2YobG9uZykpOwotICAgICAgICBpZiAodGlmZl9wdHItPnN0cmlwX29mZnNldHMgPT0gTlVMTCkKLSAgICAgICAgICAgIGdvdG8gZXJyX21lbW9yeTsKLSAgICAgICAgaWYgKGZzZWVrKGZwLCBzdHJpcF9vZmZzZXRzX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgICAgICAgICBnb3RvIGVycl9yZWFkOwotICAgICAgICBpZiAocmVhZF91bG9uZ192YWx1ZXMoJmdldHRlciwgc3RyaXBfb2Zmc2V0c190YWdfdHlwZSwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyAqKXRpZmZfcHRyLT5zdHJpcF9vZmZzZXRzLCBjb3VudCwgZnApICE9IGNvdW50KQotICAgICAgICAgICAgZ290byBlcnJfcmVhZDsKLSAgICB9Ci0KLSAgICAvKiBUZXJtaW5hdGUuICovCi0gICAgcmV0dXJuOwotCi0gICAgLyogUXVpY2sgYW5kIGRpcnR5IGdvdG8gbGFiZWxzLiAqLwotICAgIGVycl9yZWFkOgotICAgICAgICBtaW5pdGlmZl9lcnJvcih0aWZmX3B0ciwgdGlmZl9lcnJfcmVhZCk7Ci0gICAgZXJyX2ludmFsaWQ6Ci0gICAgICAgIG1pbml0aWZmX2Vycm9yKHRpZmZfcHRyLCB0aWZmX2Vycl9pbnZhbGlkKTsKLSAgICBlcnJfdW5zdXBwb3J0ZWQ6Ci0gICAgICAgIG1pbml0aWZmX2Vycm9yKHRpZmZfcHRyLCB0aWZmX2Vycl91bnN1cHBvcnRlZCk7Ci0gICAgZXJyX21lbW9yeToKLSAgICAgICAgbWluaXRpZmZfZXJyb3IodGlmZl9wdHIsIHRpZmZfZXJyX21lbW9yeSk7Ci19Ci0KLQotLyoqCi0gKiBSb3cgcmVhZGVyLgotICoqLwotdm9pZAotbWluaXRpZmZfcmVhZF9yb3coc3RydWN0IG1pbml0aWZmX2luZm8gKnRpZmZfcHRyLAotICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcm93X3B0ciwgc2l6ZV90IHJvd19pbmRleCwgRklMRSAqZnApCi17Ci0gICAgc2l6ZV90IHJvd19zaXplLCBzdHJpcF9pbmRleDsKLSAgICB1bnNpZ25lZCBpbnQgYnl0ZXNfcGVyX3NhbXBsZSwgc2FtcGxlX21heDsKLSAgICBsb25nIG9mZnNldDsKLSAgICBzaXplX3QgaTsKLQotICAgIC8qIERvIG5vdCBkbyB2YWxpZGF0aW9uIGhlcmUuICovCi0gICAgLyogQ2FsbCBtaW5pdGlmZl92YWxpZGF0ZV9pbmZvKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gKi8KLQotICAgIGJ5dGVzX3Blcl9zYW1wbGUgPSAodGlmZl9wdHItPmJpdHNfcGVyX3NhbXBsZSArIDcpIC8gODsKLSAgICByb3dfc2l6ZSA9IHRpZmZfcHRyLT53aWR0aCAqIHRpZmZfcHRyLT5zYW1wbGVzX3Blcl9waXhlbAotICAgICAgICAgICAgICAgKiBieXRlc19wZXJfc2FtcGxlOwotCi0gICAgLyogUG9zaXRpb24gdGhlIGZpbGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByb3csCi0gICAgICogaWYgdGhhdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LgotICAgICAqLwotICAgIHN0cmlwX2luZGV4ID0gcm93X2luZGV4IC8gdGlmZl9wdHItPnJvd3NfcGVyX3N0cmlwOwotICAgIGlmIChzdHJpcF9pbmRleCA+PSB0aWZmX3B0ci0+c3RyaXBfb2Zmc2V0c19jb3VudCkKLSAgICAgICAgZ290byBlcnJfaW52YWxpZDsKLSAgICBvZmZzZXQgPSB0aWZmX3B0ci0+c3RyaXBfb2Zmc2V0c1tzdHJpcF9pbmRleF0KLSAgICAgICAgICAgICArIHJvd19zaXplICogKHJvd19pbmRleCAlIHRpZmZfcHRyLT5yb3dzX3Blcl9zdHJpcCk7Ci0gICAgaWYgKG9mZnNldCA8PSAwKQotICAgICAgICBnb3RvIGVycl9pbnZhbGlkOwotICAgIGlmIChmdGVsbChmcCkgIT0gb2Zmc2V0KQotICAgICAgICBpZiAoZnNlZWsoZnAsIG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgICAgICAgICBnb3RvIGVycl9yZWFkOwotCi0gICAgLyogUmVhZCB0aGUgcm93LCBhbmQgZG8gYWxsIHRoZSBuZWNlc3NhcnkgYWRqdXN0bWVudHMuICovCi0gICAgaWYgKGZyZWFkKHJvd19wdHIsIHJvd19zaXplLCAxLCBmcCkgIT0gMSkKLSAgICAgICAgZ290byBlcnJfcmVhZDsKLSAgICBpZiAodGlmZl9wdHItPnBob3RvbWV0cmljID09IDApICAvKiB3aGl0ZSBpcyB6ZXJvICovCi0gICAgewotICAgICAgICBpZiAoYnl0ZXNfcGVyX3NhbXBsZSA+IDEpCi0gICAgICAgICAgICBnb3RvIGVycl91bnN1cHBvcnRlZDsKLSAgICAgICAgc2FtcGxlX21heCA9ICgxIDw8IHRpZmZfcHRyLT5iaXRzX3Blcl9zYW1wbGUpIC0gMTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd19zaXplOyArK2kpCi0gICAgICAgICAgICByb3dfcHRyW2ldID0gKHVuc2lnbmVkIGNoYXIpKHNhbXBsZV9tYXggLSByb3dfcHRyW2ldKTsKLSAgICB9Ci0KLSAgICAvKiBUZXJtaW5hdGUuICovCi0gICAgcmV0dXJuOwotCi0gICAgLyogUXVpY2sgYW5kIGRpcnR5IGdvdG8gbGFiZWxzLiAqLwotICAgIGVycl9yZWFkOgotICAgICAgICBtaW5pdGlmZl9lcnJvcih0aWZmX3B0ciwgdGlmZl9lcnJfcmVhZCk7Ci0gICAgZXJyX2ludmFsaWQ6Ci0gICAgICAgIG1pbml0aWZmX2Vycm9yKHRpZmZfcHRyLCB0aWZmX2Vycl9pbnZhbGlkKTsKLSAgICBlcnJfdW5zdXBwb3J0ZWQ6Ci0gICAgICAgIG1pbml0aWZmX2Vycm9yKHRpZmZfcHRyLCB0aWZmX2Vycl91bnN1cHBvcnRlZCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWluaXRpZmYvdGlmZndyaXRlLmMgYi9zcmMvbWluaXRpZmYvdGlmZndyaXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMTNlM2MuLjAwMDAwMDAKLS0tIGEvc3JjL21pbml0aWZmL3RpZmZ3cml0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyoqCi0gKiB0aWZmd3JpdGUuYwotICogRmlsZSBvdXRwdXQgcm91dGluZXMgZm9yIG1pbml0aWZmLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBDb3NtaW4gVHJ1dGEuCi0gKgotICogbWluaXRpZmYgaXMgb3Blbi1zb3VyY2Ugc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB6bGliIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gbWluaXRpZmYuaC4KLSAqKi8KLQotCi0jaWYgMAotI2Vycm9yIE5vIGZpbGUgd3JpdGluZyBoYXMgYmVlbiBpbXBsZW1lbnRlZCB5ZXQuCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9vcHRpcG5nL01ha2VmaWxlLmluIGIvc3JjL29wdGlwbmcvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MTM4NzguLjAwMDAwMDAKLS0tIGEvc3JjL29wdGlwbmcvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLlBIT05ZOiBhbGwgdGVzdCBjaGVjayBjbGVhbiBkaXN0Y2xlYW4gaW5zdGFsbCB1bmluc3RhbGwKLS5QUkVDSU9VUzogTWFrZWZpbGUKLS5TVUZGSVhFUzogLmMgLm8gLmEKLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotYmluZGlyID0gQGJpbmRpckAKLW1hbmRpciA9IEBtYW5kaXJACi1tYW4xZGlyID0gQG1hbjFkaXJACi0KLUNDID0gQENDQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUCA9IEBDUFBACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUxEID0gQExEQAotTERGTEFHUyA9IEBMREZMQUdTQAotRElGRiA9IEBESUZGQAotUk1fRiA9IEBSTV9GQAotCi1AVVNFX1NZU1RFTV9MSUJQTkdfRkFMU0VATElCX0xJQlBORyA9Ci1AVVNFX1NZU1RFTV9MSUJQTkdfVFJVRUBMSUJfTElCUE5HID0gQExJQlBOR0AKLUBVU0VfU1lTVEVNX1pMSUJfRkFMU0VATElCX1pMSUIgPQotQFVTRV9TWVNURU1fWkxJQl9UUlVFQExJQl9aTElCID0gQExJQlpACi1MSUJNID0gQExJQk1ACi1MSUJTID0gQExJQlNACi1BTExfTElCUyA9ICQoTElCX0xJQlBORykgJChMSUJfWkxJQikgJChMSUJNKSAkKExJQlMpCi0KLU9QVElQTkdfRElSID0gLi4vb3B0aXBuZwotQ0VYQ0VQVF9ESVIgPSAuLi9jZXhjZXB0Ci1PUE5HUkVEVUNfRElSID0gLi4vb3BuZ3JlZHVjCi1PUE5HUkVEVUNfTElCID0gbGlib3BuZ3JlZHVjLmEKLU9QTkdSRURVQ19NSyA9IEBPUE5HUkVEVUNfTUtACi1QTkdYVEVSTl9ESVIgPSAuLi9wbmd4dGVybgotUE5HWFRFUk5fTElCID0gbGlicG5neHRlcm4uYQotUE5HWFRFUk5fTUsgPSBAUE5HWFRFUk5fTUtACi1AVVNFX1NZU1RFTV9MSUJQTkdfRkFMU0VATElCUE5HX0RJUiA9IC4uL2xpYnBuZwotQFVTRV9TWVNURU1fTElCUE5HX0ZBTFNFQExJQlBOR19MSUIgPSBsaWJwbmcuYQotQFVTRV9TWVNURU1fTElCUE5HX1RSVUVATElCUE5HX0xJQiA9IC1scG5nCi1AVVNFX1NZU1RFTV9MSUJQTkdfRkFMU0VATElCUE5HX01LID0gQExJQlBOR19NS0AKLUBVU0VfU1lTVEVNX1pMSUJfRkFMU0VAWkxJQl9ESVIgPSAuLi96bGliCi1AVVNFX1NZU1RFTV9aTElCX0ZBTFNFQFpMSUJfTElCID0gbGliei5hCi1AVVNFX1NZU1RFTV9aTElCX1RSVUVAWkxJQl9MSUIgPSAtbHoKLUBVU0VfU1lTVEVNX1pMSUJfRkFMU0VAWkxJQl9NSyA9IEBaTElCX01LQAotR0lGX0RJUiA9IC4uL2dpZnJlYWQKLUdJRl9MSUIgPSBsaWJnaWZyZWFkLmEKLUdJRl9NSyA9IEBHSUZfTUtACi1QTk1fRElSID0gLi4vcG5taW8KLVBOTV9MSUIgPSBsaWJwbm1pby5hCi1QTk1fTUsgPSBAUE5NX01LQAotVElGRl9ESVIgPSAuLi9taW5pdGlmZgotVElGRl9MSUIgPSBsaWJtaW5pdGlmZi5hCi1USUZGX01LID0gQFRJRkZfTUtACi0KLU9QVElQTkdfT0JKUyA9IFwKLSAgb3B0aXBuZy5vIFwKLSAgb3B0aW0ubyBcCi0gIGNiaXRzZXQubyBcCi0gIG9zeXMubyBcCi0gIHdpbGRhcmdzLm8KLQotQFVTRV9TWVNURU1fWkxJQl9GQUxTRUBPUFRJUE5HX0RFUExJQl9aTElCID0gJChaTElCX0RJUikvJChaTElCX0xJQikKLUBVU0VfU1lTVEVNX1pMSUJfVFJVRUBPUFRJUE5HX0RFUExJQl9aTElCID0KLUBVU0VfU1lTVEVNX0xJQlBOR19GQUxTRUBPUFRJUE5HX0RFUExJQl9MSUJQTkcgPSAkKExJQlBOR19ESVIpLyQoTElCUE5HX0xJQikKLUBVU0VfU1lTVEVNX0xJQlBOR19UUlVFQE9QVElQTkdfREVQTElCX1pMSUIgPQotT1BUSVBOR19ERVBMSUJTID0gXAotICAkKE9QTkdSRURVQ19ESVIpLyQoT1BOR1JFRFVDX0xJQikgXAotICAkKFBOR1hURVJOX0RJUikvJChQTkdYVEVSTl9MSUIpIFwKLSAgJChPUFRJUE5HX0RFUExJQl9MSUJQTkcpIFwKLSAgJChPUFRJUE5HX0RFUExJQl9aTElCKSBcCi0gICQoR0lGX0RJUikvJChHSUZfTElCKSBcCi0gICQoUE5NX0RJUikvJChQTk1fTElCKSBcCi0gICQoVElGRl9ESVIpLyQoVElGRl9MSUIpCi0KLUBVU0VfU1lTVEVNX1pMSUJfRkFMU0VAT1BUSVBOR19ERVBJTkNMVURFX1pMSUIgPSAtSSQoWkxJQl9ESVIpCi1AVVNFX1NZU1RFTV9aTElCX1RSVUVAT1BUSVBOR19ERVBJTkNMVURFX1pMSUIgPQotQFVTRV9TWVNURU1fTElCUE5HX0ZBTFNFQE9QVElQTkdfREVQSU5DTFVERV9MSUJQTkcgPSAtSSQoTElCUE5HX0RJUikKLUBVU0VfU1lTVEVNX0xJQlBOR19UUlVFQE9QVElQTkdfREVQSU5DTFVERV9MSUJQTkcgPQotT1BUSVBOR19ERVBJTkNMVURFUyA9IFwKLSAgLUkkKENFWENFUFRfRElSKSBcCi0gICQoT1BUSVBOR19ERVBJTkNMVURFX1pMSUIpIFwKLSAgJChPUFRJUE5HX0RFUElOQ0xVREVfTElCUE5HKSBcCi0gIC1JJChPUE5HUkVEVUNfRElSKSBcCi0gIC1JJChQTkdYVEVSTl9ESVIpCi0KLU9QVElQTkdfVEVTVFMgPSBcCi0gIHRlc3QvY2JpdHNldF90ZXN0JChFWEVFWFQpIFwKLSAgdGVzdC9wcmludF9yYXRpb190ZXN0JChFWEVFWFQpCi1PUFRJUE5HX1RFU1RPQkpTID0gXAotICB0ZXN0L2NiaXRzZXRfdGVzdC5vIFwKLSAgdGVzdC9wcmludF9yYXRpb190ZXN0Lm8gXAotICB0ZXN0L3NwcmludF9yYXRpby5nZW5lcmF0ZWQubwotT1BUSVBOR19URVNUT1VUID0gKi5vdXQucG5nIHRlc3QvKi5vdXQKLQotYWxsOiBvcHRpcG5nJChFWEVFWFQpCi0KLW9wdGlwbmckKEVYRUVYVCk6ICQoT1BUSVBOR19PQkpTKSAkKE9QVElQTkdfREVQTElCUykKLQkkKExEKSAkKExERkxBR1MpIC1vICRAICQoT1BUSVBOR19PQkpTKSAkKE9QVElQTkdfREVQTElCUykgJChBTExfTElCUykKLQotLmMubzoKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJChPUFRJUE5HX0RFUElOQ0xVREVTKSAtbyAkQCAkPAotCi1vcHRpcG5nLm86IG9wdGlwbmcuYyBvcHRpcG5nLmggY2JpdHNldC5oIG9zeXMuaCBwcm9naW5mby5oCi1vcHRpbS5vOiBvcHRpbS5jIG9wdGlwbmcuaCBjYml0c2V0Lmggb3N5cy5oCi1jYml0c2V0Lm86IGNiaXRzZXQuYyBjYml0c2V0LmgKLW9zeXMubzogb3N5cy5jIG9zeXMuaAotd2lsZGFyZ3Mubzogd2lsZGFyZ3MuYwotCi0kKE9QTkdSRURVQ19ESVIpLyQoT1BOR1JFRFVDX0xJQik6Ci0JY2QgJChPUE5HUkVEVUNfRElSKSAmJiBcCi0JJChNQUtFKSAtZiAkKE9QTkdSRURVQ19NSykgJChPUE5HUkVEVUNfTElCKSAmJiBcCi0JY2QgJChPUFRJUE5HX0RJUikKLQotJChQTkdYVEVSTl9ESVIpLyQoUE5HWFRFUk5fTElCKTogXAotICAkKE9QVElQTkdfREVQTElCX0xJQlBORykgXAotICAkKEdJRl9ESVIpLyQoR0lGX0xJQikgXAotICAkKFBOTV9ESVIpLyQoUE5NX0xJQikgXAotICAkKFRJRkZfRElSKS8kKFRJRkZfTElCKQotCWNkICQoUE5HWFRFUk5fRElSKSAmJiBcCi0JJChNQUtFKSAtZiAkKFBOR1hURVJOX01LKSAkKFBOR1hURVJOX0xJQikgJiYgXAotCWNkICQoT1BUSVBOR19ESVIpCi0KLSQoTElCUE5HX0RJUikvJChMSUJQTkdfTElCKTogXAotICAkKE9QVElQTkdfREVQTElCX1pMSUIpCi0JY2QgJChMSUJQTkdfRElSKSAmJiBcCi0JJChNQUtFKSAtZiAkKExJQlBOR19NSykgJChMSUJQTkdfTElCKSAmJiBcCi0JY2QgJChPUFRJUE5HX0RJUikKLQotJChaTElCX0RJUikvJChaTElCX0xJQik6Ci0JY2QgJChaTElCX0RJUikgJiYgXAotCSQoTUFLRSkgLWYgJChaTElCX01LKSAkKFpMSUJfTElCKSAmJiBcCi0JY2QgJChPUFRJUE5HX0RJUikKLQotJChHSUZfRElSKS8kKEdJRl9MSUIpOgotCWNkICQoR0lGX0RJUikgJiYgXAotCSQoTUFLRSkgLWYgJChHSUZfTUspICQoR0lGX0xJQikgJiYgXAotCWNkICQoT1BUSVBOR19ESVIpCi0KLSQoUE5NX0RJUikvJChQTk1fTElCKToKLQljZCAkKFBOTV9ESVIpICYmIFwKLQkkKE1BS0UpIC1mICQoUE5NX01LKSAkKFBOTV9MSUIpICYmIFwKLQljZCAkKE9QVElQTkdfRElSKQotCi0kKFRJRkZfRElSKS8kKFRJRkZfTElCKToKLQljZCAkKFRJRkZfRElSKSAmJiBcCi0JJChNQUtFKSAtZiAkKFRJRkZfTUspICQoVElGRl9MSUIpICYmIFwKLQljZCAkKE9QVElQTkdfRElSKQotCi10ZXN0OiBsb2NhbC10ZXN0IHRlc3QtbGlicG5nIHRlc3QtZ2lmcmVhZCB0ZXN0LW1pbml0aWZmCi0KLS5QSE9OWTogbG9jYWwtdGVzdAotbG9jYWwtdGVzdDogb3B0aXBuZyQoRVhFRVhUKSAkKE9QVElQTkdfVEVTVFMpCi0JLUAkKFJNX0YpIHBuZ3Rlc3Qub3V0LnBuZwotCS4vb3B0aXBuZyQoRVhFRVhUKSAtbzEgLXEgaW1nL3BuZ3Rlc3QucG5nIC1vdXQ9cG5ndGVzdC5vdXQucG5nCi0JLUBlY2hvIG9wdGlwbmcgLi4uIG9rCi0JdGVzdC9jYml0c2V0X3Rlc3QkKEVYRUVYVCkgPCB0ZXN0L2NiaXRzZXRfdGVzdC5kYXQgPiB0ZXN0L2NiaXRzZXRfdGVzdC5vdXQKLQlARElGRkAgdGVzdC9jYml0c2V0X3Rlc3QuZXhwZWN0IHRlc3QvY2JpdHNldF90ZXN0Lm91dAotCS1AZWNobyBjYml0c2V0X3Rlc3QgLi4uIG9rCi0JdGVzdC9wcmludF9yYXRpb190ZXN0JChFWEVFWFQpID4gdGVzdC9wcmludF9yYXRpb190ZXN0Lm91dAotCS1AZWNobyBwcmludF9yYXRpb190ZXN0IC4uLiBvawotCi10ZXN0L2NiaXRzZXRfdGVzdCQoRVhFRVhUKTogdGVzdC9jYml0c2V0X3Rlc3QubyBjYml0c2V0Lm8KLQkkKExEKSAkKExERkxBR1MpIC1vICRAIFwKLQkgIHRlc3QvY2JpdHNldF90ZXN0Lm8gY2JpdHNldC5vICQoTElCUykKLQotdGVzdC9wcmludF9yYXRpb190ZXN0JChFWEVFWFQpOiBcCi0gIHRlc3QvcHJpbnRfcmF0aW9fdGVzdC5vIHRlc3Qvc3ByaW50X3JhdGlvLmdlbmVyYXRlZC5vCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCBcCi0JICB0ZXN0L3ByaW50X3JhdGlvX3Rlc3QubyB0ZXN0L3NwcmludF9yYXRpby5nZW5lcmF0ZWQubwotCi10ZXN0L2NiaXRzZXRfdGVzdC5vOiB0ZXN0L2NiaXRzZXRfdGVzdC5jIGNiaXRzZXQuaAotCSQoQ0MpIC1jIC1JLiAkKENQUEZMQUdTKSAkKENGTEFHUykgLW8gJEAgJCouYwotCi10ZXN0L3ByaW50X3JhdGlvX3Rlc3QubzogdGVzdC9wcmludF9yYXRpb190ZXN0LmMgdGVzdC9wcmludF9yYXRpby5oCi0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQqLmMKLQotdGVzdC9zcHJpbnRfcmF0aW8uZ2VuZXJhdGVkLm86IFwKLSAgdGVzdC9zcHJpbnRfcmF0aW8uZ2VuZXJhdGVkLmMgdGVzdC9wcmludF9yYXRpby5oIG9zeXMuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAkKi5jCi0KLSN0ZXN0L3NwcmludF9yYXRpby5nZW5lcmF0ZWQuYzogdGVzdC9leHRyYWN0X3ByaW50X3JhdGlvLnNoIG9wdGltLmMKLSMJJChTSEVMTCkgLWMgdGVzdC9leHRyYWN0X3ByaW50X3JhdGlvLnNoCi0KLS5QSE9OWTogdGVzdC1saWJwbmcKLXRlc3QtbGlicG5nOiB0ZXN0LXpsaWIKLUBVU0VfU1lTVEVNX0xJQlBOR19GQUxTRUAJY2QgJChMSUJQTkdfRElSKSAmJiBcCi1AVVNFX1NZU1RFTV9MSUJQTkdfRkFMU0VACSQoTUFLRSkgLWYgJChMSUJQTkdfTUspIHRlc3QgJiYgXAotQFVTRV9TWVNURU1fTElCUE5HX0ZBTFNFQAljZCAkKE9QVElQTkdfRElSKQotCi0jIEZJWE1FOgotIyBDYW4ndCB0ZXN0IHpsaWIgaWYgTk9fR1pDT01QUkVTIGFuZCBOT19HWklQIGFyZSBlbmFibGVkLgotLlBIT05ZOiB0ZXN0LXpsaWIKLXRlc3QtemxpYjoKLSNAVVNFX1NZU1RFTV9aTElCX0ZBTFNFQAljZCAkKFpMSUJfRElSKSAmJiBcCi0jQFVTRV9TWVNURU1fWkxJQl9GQUxTRUAJJChNQUtFKSAtZiAkKFpMSUJfTUspIHRlc3QgJiYgXAotI0BVU0VfU1lTVEVNX1pMSUJfRkFMU0VACWNkICQoT1BUSVBOR19ESVIpCi0KLS5QSE9OWTogdGVzdC1naWZyZWFkCi10ZXN0LWdpZnJlYWQ6Ci0JY2QgJChHSUZfRElSKSAmJiBcCi0JJChNQUtFKSAtZiAkKEdJRl9NSykgdGVzdCAmJiBcCi0JY2QgJChPUFRJUE5HX0RJUikKLQotLlBIT05ZOiB0ZXN0LW1pbml0aWZmCi10ZXN0LW1pbml0aWZmOgotCWNkICQoVElGRl9ESVIpICYmIFwKLQkkKE1BS0UpIC1mICQoVElGRl9NSykgdGVzdCAmJiBcCi0JY2QgJChPUFRJUE5HX0RJUikKLQotY2hlY2s6IHRlc3QKLQotY2xlYW46IFwKLSAgbG9jYWwtY2xlYW4gXAotICBjbGVhbi1vcG5ncmVkdWMgXAotICBjbGVhbi1wbmd4dGVybi1naWYtcG5tLXRpZmYgXAotICBjbGVhbi1saWJwbmcgXAotICBjbGVhbi16bGliCi0KLS5QSE9OWTogY2xlYW4tb3BuZ3JlZHVjCi1jbGVhbi1vcG5ncmVkdWM6Ci0JY2QgJChPUE5HUkVEVUNfRElSKSAmJiBcCi0JJChNQUtFKSAtZiAkKE9QTkdSRURVQ19NSykgY2xlYW4gJiYgXAotCWNkICQoT1BUSVBOR19ESVIpCi0KLS5QSE9OWTogY2xlYW4tcG5neHRlcm4tZ2lmLXBubS10aWZmCi1jbGVhbi1wbmd4dGVybi1naWYtcG5tLXRpZmY6Ci0JY2QgJChQTkdYVEVSTl9ESVIpICYmIFwKLQkkKE1BS0UpIC1mICQoUE5HWFRFUk5fTUspIGNsZWFuICYmIFwKLQljZCAkKE9QVElQTkdfRElSKQotCWNkICQoR0lGX0RJUikgJiYgXAotCSQoTUFLRSkgLWYgJChHSUZfTUspIGNsZWFuICYmIFwKLQljZCAkKE9QVElQTkdfRElSKQotCWNkICQoUE5NX0RJUikgJiYgXAotCSQoTUFLRSkgLWYgJChQTk1fTUspIGNsZWFuICYmIFwKLQljZCAkKE9QVElQTkdfRElSKQotCWNkICQoVElGRl9ESVIpICYmIFwKLQkkKE1BS0UpIC1mICQoVElGRl9NSykgY2xlYW4gJiYgXAotCWNkICQoT1BUSVBOR19ESVIpCi0KLS5QSE9OWTogY2xlYW4tbGlicG5nCi1jbGVhbi1saWJwbmc6Ci1AVVNFX1NZU1RFTV9MSUJQTkdfRkFMU0VACWNkICQoTElCUE5HX0RJUikgJiYgXAotQFVTRV9TWVNURU1fTElCUE5HX0ZBTFNFQAkkKE1BS0UpIC1mICQoTElCUE5HX01LKSBjbGVhbiAmJiBcCi1AVVNFX1NZU1RFTV9MSUJQTkdfRkFMU0VACWNkICQoT1BUSVBOR19ESVIpCi0KLS5QSE9OWTogY2xlYW4temxpYgotY2xlYW4temxpYjoKLUBVU0VfU1lTVEVNX1pMSUJfRkFMU0VACWNkICQoWkxJQl9ESVIpICYmIFwKLUBVU0VfU1lTVEVNX1pMSUJfRkFMU0VACSQoTUFLRSkgLWYgJChaTElCX01LKSBjbGVhbiAmJiBcCi1AVVNFX1NZU1RFTV9aTElCX0ZBTFNFQAljZCAkKE9QVElQTkdfRElSKQotCi1kaXN0Y2xlYW46IFwKLSAgbG9jYWwtY2xlYW4gXAotICBkaXN0Y2xlYW4tb3BuZ3JlZHVjIFwKLSAgZGlzdGNsZWFuLXBuZ3h0ZXJuLWdpZi1wbm0tdGlmZiBcCi0gIGRpc3RjbGVhbi1saWJwbmcgXAotICBkaXN0Y2xlYW4temxpYgotCS0kKFJNX0YpIE1ha2VmaWxlIG1hbi9NYWtlZmlsZQotCi0uUEhPTlk6IGRpc3RjbGVhbi1vcG5ncmVkdWMKLWRpc3RjbGVhbi1vcG5ncmVkdWM6Ci0JY2QgJChPUE5HUkVEVUNfRElSKSAmJiBcCi0JJChNQUtFKSAtZiAkKE9QTkdSRURVQ19NSykgZGlzdGNsZWFuICYmIFwKLQljZCAkKE9QVElQTkdfRElSKQotCi0uUEhPTlk6IGRpc3RjbGVhbi1wbmd4dGVybi1naWYtcG5tLXRpZmYKLWRpc3RjbGVhbi1wbmd4dGVybi1naWYtcG5tLXRpZmY6Ci0JY2QgJChQTkdYVEVSTl9ESVIpICYmIFwKLQkkKE1BS0UpIC1mICQoUE5HWFRFUk5fTUspIGRpc3RjbGVhbiAmJiBcCi0JY2QgJChPUFRJUE5HX0RJUikKLQljZCAkKEdJRl9ESVIpICYmIFwKLQkkKE1BS0UpIC1mICQoR0lGX01LKSBkaXN0Y2xlYW4gJiYgXAotCWNkICQoT1BUSVBOR19ESVIpCi0JY2QgJChQTk1fRElSKSAmJiBcCi0JJChNQUtFKSAtZiAkKFBOTV9NSykgZGlzdGNsZWFuICYmIFwKLQljZCAkKE9QVElQTkdfRElSKQotCWNkICQoVElGRl9ESVIpICYmIFwKLQkkKE1BS0UpIC1mICQoVElGRl9NSykgZGlzdGNsZWFuICYmIFwKLQljZCAkKE9QVElQTkdfRElSKQotCi0uUEhPTlk6IGRpc3RjbGVhbi1saWJwbmcKLWRpc3RjbGVhbi1saWJwbmc6Ci1AVVNFX1NZU1RFTV9MSUJQTkdfRkFMU0VACWNkICQoTElCUE5HX0RJUikgJiYgXAotQFVTRV9TWVNURU1fTElCUE5HX0ZBTFNFQAkkKE1BS0UpIC1mICQoTElCUE5HX01LKSBjbGVhbiAmJiBcCi1AVVNFX1NZU1RFTV9MSUJQTkdfRkFMU0VACWNkICQoT1BUSVBOR19ESVIpCi0KLS5QSE9OWTogZGlzdGNsZWFuLXpsaWIKLWRpc3RjbGVhbi16bGliOgotQFVTRV9TWVNURU1fWkxJQl9GQUxTRUAJY2QgJChaTElCX0RJUikgJiYgXAotQFVTRV9TWVNURU1fWkxJQl9GQUxTRUAJJChNQUtFKSAtZiAkKFpMSUJfTUspIGRpc3RjbGVhbiAmJiBcCi1AVVNFX1NZU1RFTV9aTElCX0ZBTFNFQAljZCAkKE9QVElQTkdfRElSKQotCi0uUEhPTlk6IGxvY2FsLWNsZWFuCi1sb2NhbC1jbGVhbjoKLQktJChSTV9GKSBvcHRpcG5nJChFWEVFWFQpICQoT1BUSVBOR19PQkpTKQotCS0kKFJNX0YpICQoT1BUSVBOR19URVNUUykgJChPUFRJUE5HX1RFU1RPQkpTKSAkKE9QVElQTkdfVEVTVE9VVCkKLQotaW5zdGFsbDogb3B0aXBuZyQoRVhFRVhUKQotCW1rZGlyIC1wICQoREVTVERJUikkKGJpbmRpcikKLQlta2RpciAtcCAkKERFU1RESVIpJChtYW4xZGlyKQotCS1AJChSTV9GKSAkKERFU1RESVIpJChiaW5kaXIpL29wdGlwbmckKEVYRUVYVCkKLQktQCQoUk1fRikgJChERVNURElSKSQobWFuMWRpcikvb3B0aXBuZy4xCi0JY3AgLWYgLXAgb3B0aXBuZyQoRVhFRVhUKSAkKERFU1RESVIpJChiaW5kaXIpCi0JY3AgLWYgLXAgbWFuL29wdGlwbmcuMSAkKERFU1RESVIpJChtYW4xZGlyKQotCi11bmluc3RhbGw6Ci0JLSQoUk1fRikgJChERVNURElSKSQoYmluZGlyKS9vcHRpcG5nJChFWEVFWFQpCi0JLSQoUk1fRikgJChERVNURElSKSQobWFuMWRpcikvb3B0aXBuZy4xCmRpZmYgLS1naXQgYS9zcmMvb3B0aXBuZy9jYml0c2V0LmMgYi9zcmMvb3B0aXBuZy9jYml0c2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMDA1MTcuLjAwMDAwMDAKLS0tIGEvc3JjL29wdGlwbmcvY2JpdHNldC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qCi0gKiBjYml0c2V0LmMKLSAqIFBsYWluIG9sZCBiaXRzZXQgZGF0YSB0eXBlLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIENvc21pbiBUcnV0YS4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB6bGliIGxpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIHRoZSBhdHRhY2hlZCBMSUNFTlNFIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICovCi0KLQotI2luY2x1ZGUgImNiaXRzZXQuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotCi0vKgotICogUHJpdmF0ZSBoZWxwZXIgbWFjcm9zOiBfYml0c2V0X01JTiBhbmQgX2JpdHNldF9NQVguCi0gKi8KLSNkZWZpbmUgX2JpdHNldF9NSU4oYSwgYikgXAotICAgICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0jZGVmaW5lIF9iaXRzZXRfTUFYKGEsIGIpIFwKLSAgICAoKGEpID4gKGIpID8gKGEpIDogKGIpKQotCi0KLS8qCi0gKiBQcml2YXRlIGhlbHBlciBtYWNybzogX2JpdHNldF9QVFJfU0tJUF9QUkVELgotICoKLSAqIFNraXBzIHRoZSBnaXZlbiBwb2ludGVyIHBhc3QgdGhlIGVsZW1lbnRzIHRoYXQgc2F0aXNmeSB0aGUgZ2l2ZW4gcHJlZGljYXRlLgotICogRS5nLiwgX2JpdHNldF9QVFJfU0tJUF9QUkVEKHN0ciwgaXNzcGFjZSkgc2tpcHMgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZS4KLSAqLwotI2RlZmluZSBfYml0c2V0X1BUUl9TS0lQX1BSRUQocHRyLCBwcmVkaWNhdGUpIFwKLSAgICB7IHdoaWxlIChwcmVkaWNhdGUoKihwdHIpKSkgKysocHRyKTsgfQotCi0KLS8qCi0gKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIGJpdHNldC4KLSAqLwotdW5zaWduZWQgaW50IGJpdHNldF9jb3VudChiaXRzZXRfdCBzZXQpCi17Ci0gICAgdW5zaWduZWQgaW50IHJlc3VsdDsKLQotICAgIC8qIEFwcGx5IFdlZ25lcidzIG1ldGhvZC4gKi8KLSAgICByZXN1bHQgPSAwOwotICAgIHdoaWxlIChzZXQgIT0gQklUU0VUX0VNUFRZKQotICAgIHsKLSAgICAgICAgc2V0ICY9IChzZXQgLSAxKTsKLSAgICAgICAgKytyZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyoKLSAqIEZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IGluIGEgYml0c2V0LgotICovCi1pbnQgYml0c2V0X2ZpbmRfZmlyc3QoYml0c2V0X3Qgc2V0KQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8PSBCSVRTRVRfRUxUX01BWDsgKytpKQotICAgIHsKLSAgICAgICAgaWYgKGJpdHNldF90ZXN0KHNldCwgaSkpCi0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi0KLS8qCi0gKiBGaW5kcyB0aGUgbmV4dCBlbGVtZW50IGluIGEgYml0c2V0LgotICovCi1pbnQgYml0c2V0X2ZpbmRfbmV4dChiaXRzZXRfdCBzZXQsIGludCBlbHQpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSBfYml0c2V0X01BWChlbHQsIC0xKSArIDE7IGkgPD0gQklUU0VUX0VMVF9NQVg7ICsraSkKLSAgICB7Ci0gICAgICAgIGlmIChiaXRzZXRfdGVzdChzZXQsIGkpKQotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQotCi0vKgotICogRmluZHMgdGhlIGxhc3QgZWxlbWVudCBpbiBhIGJpdHNldC4KLSAqLwotaW50IGJpdHNldF9maW5kX2xhc3QoYml0c2V0X3Qgc2V0KQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gQklUU0VUX0VMVF9NQVg7IGkgPj0gMDsgLS1pKQotICAgIHsKLSAgICAgICAgaWYgKGJpdHNldF90ZXN0KHNldCwgaSkpCi0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi0KLS8qCi0gKiBGaW5kcyB0aGUgcHJldmlvdXMgZWxlbWVudCBpbiBhIGJpdHNldC4KLSAqLwotaW50IGJpdHNldF9maW5kX3ByZXYoYml0c2V0X3Qgc2V0LCBpbnQgZWx0KQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gX2JpdHNldF9NSU4oZWx0LCBCSVRTRVRfRUxUX01BWCArIDEpIC0gMTsgaSA+PSAwOyAtLWkpCi0gICAgewotICAgICAgICBpZiAoYml0c2V0X3Rlc3Qoc2V0LCBpKSkKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLQotLyoKLSAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgYml0c2V0LgotICovCi1iaXRzZXRfdCBzdHJpbmdfdG9fYml0c2V0KGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90ICplbmRfaWR4KQotewotICAgIGJpdHNldF90IHJlc3VsdDsKLSAgICBjb25zdCBjaGFyICpwdHI7Ci0gICAgaW50IG91dF9vZl9yYW5nZTsKLQotICAgIHB0ciA9IHN0cjsKLSAgICBfYml0c2V0X1BUUl9TS0lQX1BSRUQocHRyLCBpc3NwYWNlKTsKLSAgICBpZiAoKnB0ciAhPSAnMCcgJiYgKnB0ciAhPSAnMScpCi0gICAgewotICAgICAgICAvKiBJbnZhbGlkIGlucHV0LiAqLwotICAgICAgICBpZiAoZW5kX2lkeCAhPSBOVUxMKQotICAgICAgICAgICAgKmVuZF9pZHggPSAwOwotI2lmZGVmIEVJTlZBTAotICAgICAgICBlcnJubyA9IEVJTlZBTDsKLSNlbmRpZgotICAgICAgICByZXR1cm4gQklUU0VUX0VNUFRZOwotICAgIH0KLQotICAgIHJlc3VsdCA9IEJJVFNFVF9FTVBUWTsKLSAgICBvdXRfb2ZfcmFuZ2UgPSAwOwotICAgIGZvciAoIDsgOyArK3B0cikKLSAgICB7Ci0gICAgICAgIGlmICgqcHRyID09ICcwJyB8fCAqcHRyID09ICcxJykKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCAxKSB8ICgqcHRyIC0gJzAnKTsKLSAgICAgICAgICAgIGlmIChiaXRzZXRfdGVzdChyZXN1bHQsIEJJVFNFVF9FTFRfTUFYKSkKLSAgICAgICAgICAgICAgICBvdXRfb2ZfcmFuZ2UgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGVuZF9pZHggIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAqZW5kX2lkeCA9IChzaXplX3QpKHB0ciAtIHN0cik7Ci0gICAgICAgICAgICBpZiAob3V0X29mX3JhbmdlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJpdHNldF9zZXQoJnJlc3VsdCwgQklUU0VUX0VMVF9NQVgpOwotI2lmZGVmIEVSQU5HRQotICAgICAgICAgICAgICAgIGVycm5vID0gRVJBTkdFOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotfQotCi0KLS8qCi0gKiBDb252ZXJ0cyBhIGJpdHNldCB0byBhIHN0cmluZy4KLSAqLwotc2l6ZV90IGJpdHNldF90b19zdHJpbmcoY2hhciAqc2J1Ziwgc2l6ZV90IHNidWZfc2l6ZSwgYml0c2V0X3Qgc2V0KQotewotICAgIHNpemVfdCByZXN1bHQ7Ci0gICAgY2hhciAqcHRyOwotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gQklUU0VUX0VMVF9NQVg7IGkgPiAwOyAtLWkpCi0gICAgewotICAgICAgICBpZiAoYml0c2V0X3Rlc3Qoc2V0LCBpKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJlc3VsdCA9IChzaXplX3QpaSArIDE7Ci0gICAgaWYgKHJlc3VsdCA+PSBzYnVmX3NpemUpCi0gICAgewotICAgICAgICAvKiBCdWZmZXIgdG9vIHNtYWxsLiAqLwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB0ciA9IHNidWY7Ci0gICAgZm9yICggOyBpID49IDA7IC0taSkKLSAgICAgICAgKnB0cisrID0gKGNoYXIpKGJpdHNldF90ZXN0KHNldCwgaSkgPyAnMScgOiAnMCcpOwotICAgICpwdHIgPSAoY2hhcikwOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyoKLSAqIENvbnZlcnRzIGEgcmFuZ2VzZXQgc3RyaW5nIHRvIGEgYml0c2V0LgotICovCi1iaXRzZXRfdCByYW5nZXNldF9zdHJpbmdfdG9fYml0c2V0KGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90ICplbmRfaWR4KQotewotICAgIGJpdHNldF90IHJlc3VsdDsKLSAgICBjb25zdCBjaGFyICpwdHI7Ci0gICAgaW50IHN0YXRlOwotICAgIGludCBudW0sIG51bTEsIG51bTI7Ci0gICAgaW50IG91dF9vZl9yYW5nZTsKLQotICAgIHJlc3VsdCA9IEJJVFNFVF9FTVBUWTsKLSAgICBwdHIgPSBzdHI7Ci0gICAgc3RhdGUgPSAwOwotICAgIG91dF9vZl9yYW5nZSA9IDA7Ci0gICAgbnVtMSA9IG51bTIgPSAtMTsKLQotICAgIGZvciAoIDsgOyApCi0gICAgewotICAgICAgICBfYml0c2V0X1BUUl9TS0lQX1BSRUQocHRyLCBpc3NwYWNlKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkKLSAgICAgICAgewotICAgICAgICBjYXNlIDA6ICAvKiAiIiAqLwotICAgICAgICBjYXNlIDI6ICAvKiAiTi0iICovCi0gICAgICAgICAgICAvKiBFeHBlY3RpbmcgbnVtYmVyOyBnbyB0byBuZXh0IHN0YXRlLiAqLwotICAgICAgICAgICAgaWYgKCpwdHIgPj0gJzAnICYmICpwdHIgPD0gJzknKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG51bSA9IDA7Ci0gICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG51bSA9IDEwICogbnVtICsgKCpwdHIgLSAnMCcpOwotICAgICAgICAgICAgICAgICAgICBpZiAobnVtID4gQklUU0VUX0VMVF9NQVgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dF9vZl9yYW5nZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBCSVRTRVRfRUxUX01BWDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICArK3B0cjsKLSAgICAgICAgICAgICAgICB9IHdoaWxlICgqcHRyID49ICcwJyAmJiAqcHRyIDw9ICc5Jyk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IDApCi0gICAgICAgICAgICAgICAgICAgIG51bTEgPSBudW07Ci0gICAgICAgICAgICAgICAgbnVtMiA9IG51bTsKLSAgICAgICAgICAgICAgICArK3N0YXRlOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogIC8qICJOIiAqLwotICAgICAgICAgICAgLyogRXhwZWN0aW5nIHJhbmdlIG9wZXJhdG9yOyBnbyB0byBuZXh0IHN0YXRlLiAqLwotICAgICAgICAgICAgaWYgKCpwdHIgPT0gJy0nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICsrcHRyOwotICAgICAgICAgICAgICAgIG51bTIgPSBCSVRTRVRfRUxUX01BWDsKLSAgICAgICAgICAgICAgICArK3N0YXRlOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhdGUgPiAwKSAgLyogIk4iLCAiTi0iIG9yICJOLU4iICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFN0b3JlIHRoZSBwYXJ0aWFsIHJlc3VsdDsgZ28gdG8gc3RhdGUgMC4gKi8KLSAgICAgICAgICAgIHN0YXRlID0gMDsKLSAgICAgICAgICAgIGlmIChudW0yID4gQklUU0VUX0VMVF9NQVgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0X29mX3JhbmdlID0gMTsKLSAgICAgICAgICAgICAgICBudW0yID0gQklUU0VUX0VMVF9NQVg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobnVtMSA8PSBudW0yKQotICAgICAgICAgICAgICAgIGJpdHNldF9zZXRfcmFuZ2UoJnJlc3VsdCwgbnVtMSwgbnVtMik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgb3V0X29mX3JhbmdlID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgqcHRyID09ICcsJyB8fCAqcHRyID09ICc7JykKLSAgICAgICAgewotICAgICAgICAgICAgLyogU2VwYXJhdG9yOiBjb250aW51ZSB0aGUgbG9vcC4gKi8KLSAgICAgICAgICAgICsrcHRyOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBVbmV4cGVjdGVkIGNoYXJhY3RlciBvciBlbmQgb2Ygc3RyaW5nOiBicmVhayB0aGUgbG9vcC4gKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG51bTEgPT0gLTEpCi0gICAgewotICAgICAgICAvKiBUaGVyZSB3ZXJlIG5vIHBhcnRpYWwgcmVzdWx0cy4gKi8KLSAgICAgICAgaWYgKGVuZF9pZHggIT0gTlVMTCkKLSAgICAgICAgICAgICplbmRfaWR4ID0gMDsKLSAgICAgICAgLyogTm8gRUlOVkFMIGhlcmU6IHRoZSBlbXB0eSBzZXQgaXMgYSB2YWxpZCBpbnB1dC4gKi8KLSAgICAgICAgcmV0dXJuIEJJVFNFVF9FTVBUWTsKLSAgICB9Ci0gICAgaWYgKGVuZF9pZHggIT0gTlVMTCkKLSAgICAgICAgKmVuZF9pZHggPSAoc2l6ZV90KShwdHIgLSBzdHIpOwotI2lmZGVmIEVSQU5HRQotICAgIGlmIChvdXRfb2ZfcmFuZ2UpCi0gICAgICAgIGVycm5vID0gRVJBTkdFOwotI2VuZGlmCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKgotICogQ29udmVydHMgYSBiaXRzZXQgdG8gYSByYW5nZXNldCBzdHJpbmcuCi0gKi8KLXNpemVfdCBiaXRzZXRfdG9fcmFuZ2VzZXRfc3RyaW5nKGNoYXIgKnNidWYsIHNpemVfdCBzYnVmX3NpemUsIGJpdHNldF90IHNldCk7Ci0vKiBub3QgaW1wbGVtZW50ZWQgKi8KZGlmZiAtLWdpdCBhL3NyYy9vcHRpcG5nL2NiaXRzZXQuaCBiL3NyYy9vcHRpcG5nL2NiaXRzZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc5ZDZlNS4uMDAwMDAwMAotLS0gYS9zcmMvb3B0aXBuZy9jYml0c2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoKLSAqIGNiaXRzZXQuaAotICogUGxhaW4gb2xkIGJpdHNldCBkYXRhIHR5cGUuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgQ29zbWluIFRydXRhLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHpsaWIgbGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgdGhlIGF0dGFjaGVkIExJQ0VOU0UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKi8KLQotCi0jaWZuZGVmIENCSVRTRVRfSAotI2RlZmluZSBDQklUU0VUX0gKLQotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLS8qCi0gKiBUaGUgYml0c2V0IHR5cGUuCi0gKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IGJpdHNldF90OwotLyogVE8gRE86IGJpdHNldDhfdCwgYml0c2V0MTZfdCwgYml0c2V0MzJfdCwgLi4uLCBiaXRzZXRtYXhfdC4gKi8KLQotCi0vKgotICogVGhlIHNpemUgb3BlcmF0b3IgKG5vdCByZXN0cmljdGVkIHRvIGJpdHNldF90KS4KLSAqLwotI2RlZmluZSBCSVRTSVpFT0Yob2JqZWN0KSAoc2l6ZW9mKG9iamVjdCkgKiBDSEFSX0JJVCkKLQotCi0vKgotICogQml0c2V0IGNvbnN0YW50cy4KLSAqLwotI2RlZmluZSBCSVRTRVRfRU1QVFkgMFUKLSNkZWZpbmUgQklUU0VUX0ZVTEwgKH5CSVRTRVRfRU1QVFkpCi0KLQotLyoKLSAqIEJpdHNldCBsaW1pdHMuCi0gKi8KLWVudW0KLXsKLSAgICBCSVRTRVRfRUxUX01JTiA9IDAsCi0gICAgQklUU0VUX0VMVF9NQVggPSAoaW50KShCSVRTSVpFT0YoYml0c2V0X3QpIC0gMSkKLX07Ci0KLQotLyoKLSAqIERpcmVjdCBiaXRzZXQgYWNjZXNzIG1ldGhvZHMuCi0gKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi1pbmxpbmUgaW50IGJpdHNldF90ZXN0KGJpdHNldF90IHNldCwgaW50IGVsdCkKLXsKLSAgICByZXR1cm4gKHNldCAmICgxVSA8PCBlbHQpKSAhPSAwOwotfQotCi1pbmxpbmUgdm9pZCBiaXRzZXRfc2V0KGJpdHNldF90ICpzZXQsIGludCBlbHQpCi17Ci0gICAgKnNldCB8PSAoMVUgPDwgZWx0KTsKLX0KLQotaW5saW5lIHZvaWQgYml0c2V0X3Jlc2V0KGJpdHNldF90ICpzZXQsIGludCBlbHQpCi17Ci0gICAgKnNldCAmPSB+KDFVIDw8IGVsdCk7Ci19Ci0KLWlubGluZSB2b2lkIGJpdHNldF9mbGlwKGJpdHNldF90ICpzZXQsIGludCBlbHQpCi17Ci0gICAgKnNldCBePSAoMVUgPDwgZWx0KTsKLX0KLQotaW5saW5lIHZvaWQgYml0c2V0X3NldF9yYW5nZShiaXRzZXRfdCAqc2V0LCBpbnQgc3RhcnRfZWx0LCBpbnQgc3RvcF9lbHQpCi17Ci0gICAgaWYgKHN0YXJ0X2VsdCA8PSBzdG9wX2VsdCkKLSAgICAgICAgKnNldCB8PSAoKCgxVSA8PCAoc3RvcF9lbHQgLSBzdGFydF9lbHQpIDw8IDEpIC0gMSkgPDwgc3RhcnRfZWx0KTsKLX0KLQotaW5saW5lIHZvaWQgYml0c2V0X3Jlc2V0X3JhbmdlKGJpdHNldF90ICpzZXQsIGludCBzdGFydF9lbHQsIGludCBzdG9wX2VsdCkKLXsKLSAgICBpZiAoc3RhcnRfZWx0IDw9IHN0b3BfZWx0KQotICAgICAgICAqc2V0ICY9IH4oKCgxVSA8PCAoc3RvcF9lbHQgLSBzdGFydF9lbHQpIDw8IDEpIC0gMSkgPDwgc3RhcnRfZWx0KTsKLX0KLQotaW5saW5lIHZvaWQgYml0c2V0X2ZsaXBfcmFuZ2UoYml0c2V0X3QgKnNldCwgaW50IHN0YXJ0X2VsdCwgaW50IHN0b3BfZWx0KQotewotICAgIGlmIChzdGFydF9lbHQgPD0gc3RvcF9lbHQpCi0gICAgICAgICpzZXQgXj0gKCgoMVUgPDwgKHN0b3BfZWx0IC0gc3RhcnRfZWx0KSA8PCAxKSAtIDEpIDw8IHN0YXJ0X2VsdCk7Ci19Ci0KLSNlbHNlICAvKiAhX19jcGx1c3BsdXMgKi8KLQotI2RlZmluZSBiaXRzZXRfdGVzdChzZXQsIGVsdCkgXAotICAgICgoKHNldCkgJiAoMVUgPDwgKGVsdCkpKSAhPSAwKQotCi0jZGVmaW5lIGJpdHNldF9zZXQoc2V0LCBlbHQpIFwKLSAgICAoKihzZXQpIHw9ICgxVSA8PCAoZWx0KSkpCi0KLSNkZWZpbmUgYml0c2V0X3Jlc2V0KHNldCwgZWx0KSBcCi0gICAgKCooc2V0KSAmPSB+KDFVIDw8IChlbHQpKSkKLQotI2RlZmluZSBiaXRzZXRfZmxpcChzZXQsIGVsdCkgXAotICAgICgqKHNldCkgXj0gKDFVIDw8IChlbHQpKSkKLQotI2RlZmluZSBiaXRzZXRfc2V0X3JhbmdlKHNldCwgc3RhcnRfZWx0LCBzdG9wX2VsdCkgXAotICAgICgqKHNldCkgfD0gKChzdGFydF9lbHQpIDw9IChzdG9wX2VsdCkpIFwKLSAgICAgICAgPyAoKCgxVSA8PCAoKHN0b3BfZWx0KSAtIChzdGFydF9lbHQpKSA8PCAxKSAtIDEpIDw8IChzdGFydF9lbHQpKSBcCi0gICAgICAgIDogMFUpCi0KLSNkZWZpbmUgYml0c2V0X3Jlc2V0X3JhbmdlKHNldCwgc3RhcnRfZWx0LCBzdG9wX2VsdCkgXAotICAgICgqKHNldCkgJj0gKChzdGFydF9lbHQpIDw9IChzdG9wX2VsdCkpIFwKLSAgICAgICAgPyB+KCgoMVUgPDwgKChzdG9wX2VsdCkgLSAoc3RhcnRfZWx0KSkgPDwgMSkgLSAxKSA8PCAoc3RhcnRfZWx0KSkgXAotICAgICAgICA6IH4wVSkKLQotI2RlZmluZSBiaXRzZXRfZmxpcF9yYW5nZShzZXQsIHN0YXJ0X2VsdCwgc3RvcF9lbHQpIFwKLSAgICAoKihzZXQpIF49ICgoc3RhcnRfZWx0KSA8PSAoc3RvcF9lbHQpKSBcCi0gICAgICAgID8gKCgoMVUgPDwgKChzdG9wX2VsdCkgLSAoc3RhcnRfZWx0KSkgPDwgMSkgLSAxKSA8PCAoc3RhcnRfZWx0KSkgXAotICAgICAgICA6IDBVKQotCi0jZW5kaWYgIC8qIF9fY3BsdXNwbHVzICovCi0KLQotLyoKLSAqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgYml0c2V0LgotICoKLSAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyBzZXQgdG8gMS4KLSAqLwotdW5zaWduZWQgaW50IGJpdHNldF9jb3VudChiaXRzZXRfdCBzZXQpOwotCi0KLS8qCi0gKiBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiBhIGJpdHNldC4KLSAqCi0gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJpdCBzZXQgdG8gMSwKLSAqIG9yIC0xIGlmIGFsbCBiaXRzIGFyZSBzZXQgdG8gMC4KLSAqLwotaW50IGJpdHNldF9maW5kX2ZpcnN0KGJpdHNldF90IHNldCk7Ci0KLQotLyoKLSAqIEZpbmRzIHRoZSBuZXh0IGVsZW1lbnQgaW4gYSBiaXRzZXQuCi0gKgotICogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGJpdCBzZXQgdG8gMSwKLSAqIG9yIC0xIGlmIGFsbCB0aGUgZm9sbG93aW5nIGJpdHMgYXJlIHNldCB0byAwLgotICovCi1pbnQgYml0c2V0X2ZpbmRfbmV4dChiaXRzZXRfdCBzZXQsIGludCBlbHQpOwotCi0KLS8qCi0gKiBGaW5kcyB0aGUgbGFzdCBlbGVtZW50IGluIGEgYml0c2V0LgotICoKLSAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBiaXQgc2V0IHRvIDEsCi0gKiBvciAtMSBpZiBhbGwgYml0cyBhcmUgc2V0IHRvIDAuCi0gKi8KLWludCBiaXRzZXRfZmluZF9sYXN0KGJpdHNldF90IHNldCk7Ci0KLQotLyoKLSAqIEZpbmRzIHRoZSBwcmV2aW91cyBlbGVtZW50IGluIGEgYml0c2V0LgotICoKLSAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgcHJldmlvdXMgYml0IHNldCB0byAxLAotICogb3IgLTEgaWYgYWxsIHRoZSBwcmVjZWRpbmcgYml0cyBhcmUgc2V0IHRvIDAuCi0gKi8KLWludCBiaXRzZXRfZmluZF9wcmV2KGJpdHNldF90IHNldCwgaW50IGVsdCk7Ci0KLQotLyoKLSAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgYml0c2V0LgotICoKLSAqIFRoZSBmdW5jdGlvbiBza2lwcyB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMsIHBhcnNlcwotICogdGhlIHNlcXVlbmNlIG9mICcwJyBhbmQgJzEnIGNoYXJhY3RlcnMsIGFuZCBzdG9wcyBhdCB0aGUgZmlyc3QKLSAqIGNoYXJhY3RlciB0aGF0IGlzIG5vdCByZWNvZ25pemVkLgotICoKLSAqIElmIGVuZF9pZHggaXMgbm90IG51bGwsIHRoZSBmdW5jdGlvbiBzZXRzICplbmRfaWR4IHRvIHBvaW50IHRvCi0gKiB0aGUgY2hhcmFjdGVyIHRoYXQgc3RvcHBlZCB0aGUgc2Nhbi4gIElmIHRoZSBpbnB1dCBpcyBpbnZhbGlkCi0gKiBhbmQgZW5kX2lkeCBpcyBub3QgbnVsbCwgdGhlIGZ1bmN0aW9uIHNldHMgKmVuZF9pZHggdG8gMC4KLSAqCi0gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGNvbnZlcnRlZCBiaXRzZXQuCi0gKiBJZiB0aGUgcmVzdWx0IG9mIGNvbnZlcnNpb24gY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIGEgYml0c2V0X3QsCi0gKiB0aGUgZnVuY3Rpb24gc2V0cyBlcnJubyB0byBFUkFOR0UgYW5kIHJldHVybnMgdGhlIGxvd2VyLW9yZGVyCi0gKiBiaXRzIGZyb20gdGhlIHJlc3VsdCwgd2l0aCB0aGUgaGlnaGVzdC1vcmRlciBiaXQgc2V0IHRvIDEuCi0gKiBJZiB0aGUgaW5wdXQgaXMgaW52YWxpZCwgdGhlIGZ1bmN0aW9uIHNldHMgZXJybm8gdG8gRUlOVkFMIGFuZAotICogcmV0dXJucyBCSVRTRVRfRU1QVFkuCi0gKi8KLWJpdHNldF90IHN0cmluZ190b19iaXRzZXQoY29uc3QgY2hhciAqc3RyLCBzaXplX3QgKmVuZF9pZHgpOwotCi0KLS8qCi0gKiBDb252ZXJ0cyBhIGJpdHNldCB0byBhIHN0cmluZy4KLSAqCi0gKiBUaGUgZnVuY3Rpb24gY29udmVydHMgdGhlIGJpdHNldCB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbiwgYW5kCi0gKiBhdHRlbXB0cyB0byBzdG9yZSBpdCBpbiBzYnVmLCBpZiBzYnVmIGlzIGxhcmdlIGVub3VnaC4gIE90aGVyd2lzZSwKLSAqIGl0IGxlYXZlcyBzYnVmIGludGFjdC4KLSAqCi0gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gKi8KLXNpemVfdCBiaXRzZXRfdG9fc3RyaW5nKGNoYXIgKnNidWYsIHNpemVfdCBzYnVmX3NpemUsIGJpdHNldF90IHNldCk7Ci0KLQotLyoKLSAqIENvbnZlcnRzIGEgcmFuZ2VzZXQgc3RyaW5nIHRvIGEgYml0c2V0LgotICoKLSAqIEEgcmFuZ2VzZXQgc3RyaW5nIGlzIGFuIGFyYml0cmFyeSBzZXF1ZW5jZSBvZiBlbGVtZW50cyAoIk4iKSBhbmQKLSAqIHJhbmdlcyAoIk0tTiIgb3IgIk0tIiksIHNlcGFyYXRlZCBieSAnLCcgb3IgJzsnLiAgV2hpdGVzcGFjZSBpcwotICogYWxsb3dlZCBhcm91bmQgbGV4aWNhbCBlbGVtZW50cywgYW5kIGlzIGlnbm9yZWQuCi0gKgotICogSGVyZSBhcmUgYSBmZXcgZXhhbXBsZXMsIGFzc3VtaW5nIEJJVFNJWkVPRihiaXRzZXRfdCkgPT0gMTY6Ci0gKiAgIjAsMyw1LTciICA9PiAwMDAwMDAwMDExMTAxMDAxCi0gKiAgIjAtMyw1LDctIiA9PiAxMTExMTExMTEwMTAxMTExCi0gKiAgIjgtLDQiICAgICA9PiAxMTExMTExMTAwMDEwMDAwCi0gKiAgIiIgICAgICAgICA9PiAwMDAwMDAwMDAwMDAwMDAwCi0gKiAgIjgtNCIgICAgICA9PiAwMDAwMDAwMDAwMDAwMDAwLCBlcnJubyA9IEVSQU5HRQotICogICI5OSIgICAgICAgPT4gMTAwMDAwMDAwMDAwMDAwMCwgZXJybm8gPSBFUkFOR0UKLSAqICAiaW52YWxpZCIgID0+IDAwMDAwMDAwMDAwMDAwMDAsIGVycm5vID0gRUlOVkFMCi0gKgotICogSWYgZW5kX2lkeCBpcyBub3QgbnVsbCwgdGhlIGZ1bmN0aW9uIHNldHMgKmVuZF9pZHggdG8gcG9pbnQgdG8KLSAqIHRoZSBjaGFyYWN0ZXIgdGhhdCBzdG9wcGVkIHRoZSBzY2FuLiAgSWYgdGhlIGlucHV0IGlzIGludmFsaWQgYW5kCi0gKiBlbmRfaWR4IGlzIG5vdCBudWxsLCB0aGUgZnVuY3Rpb24gc2V0cyAqZW5kX2lkeCB0byAwLgotICoKLSAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgY29udmVydGVkIGJpdHNldC4gIElmIHRoZQotICogaW5wdXQgY29udGFpbnMgbm9uLXJlcHJlc2VudGFibGUgZWxlbWVudHMgb3IgcmFuZ2VzIChlLmcuIGVsZW1lbnRzCi0gKiBsYXJnZXIgdGhhbiBCSVRTRVRfRUxUX01BWCksIHRoZSBmdW5jdGlvbiBzZXRzIGVycm5vIHRvIEVSQU5HRS4KLSAqIElmIHRoZSBpbnB1dCBpcyBpbnZhbGlkLCB0aGUgZnVuY3Rpb24gc2V0cyBlcnJubyB0byBFSU5WQUwgYW5kCi0gKiByZXR1cm5zIEJJVFNFVF9FTVBUWS4KLSAqLwotYml0c2V0X3QgcmFuZ2VzZXRfc3RyaW5nX3RvX2JpdHNldChjb25zdCBjaGFyICpzdHIsIHNpemVfdCAqZW5kX2lkeCk7Ci0KLQotLyoKLSAqIENvbnZlcnRzIGEgYml0c2V0IHRvIGEgcmFuZ2VzZXQgc3RyaW5nLgotICoKLSAqIFRoZSBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgYml0c2V0IHRvIGEgcmFuZ2VzZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0gKiBhbmQgYXR0ZW1wdHMgdG8gc3RvcmUgaXQgaW4gc2J1ZiwgaWYgc2J1ZiBpcyBsYXJnZSBlbm91Z2guICBPdGhlcndpc2UsCi0gKiBpdCBsZWF2ZXMgc2J1ZiBpbnRhY3QuCi0gKgotICogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2VzZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotICovCi1zaXplX3QgYml0c2V0X3RvX3Jhbmdlc2V0X3N0cmluZyhjaGFyICpzYnVmLCBzaXplX3Qgc2J1Zl9zaXplLCBiaXRzZXRfdCBzZXQpOwotCi0KLS8qCi0gKiBUTyBETzoKLSAqIHdzdHJpbmdfdG9fYml0c2V0LAotICogYml0c2V0X3RvX3dzdHJpbmcsCi0gKiByYW5nZXNldF93c3RyaW5nX3RvX2JpdHNldCwKLSAqIGJpdHNldF90b19yYW5nZXNldF93c3RyaW5nLgotICovCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvKiBleHRlcm4gIkMiICovCi0jZW5kaWYKLQotCi0jZW5kaWYgIC8qIENCSVRTRVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL29wdGlwbmcvaW1nL2luZGV4LnR4dCBiL3NyYy9vcHRpcG5nL2ltZy9pbmRleC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDRjYzYuLjAwMDAwMDAKLS0tIGEvc3JjL29wdGlwbmcvaW1nL2luZGV4LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXBuZ3Rlc3QucG5nOiBUaGUgdGVzdCBpbWFnZSB1c2VkIGJ5IGxpYnBuZy4KZGlmZiAtLWdpdCBhL3NyYy9vcHRpcG5nL2ltZy9wbmd0ZXN0LnBuZyBiL3NyYy9vcHRpcG5nL2ltZy9wbmd0ZXN0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkZDM2Zi4uMDAwMDAwMAotLS0gYS9zcmMvb3B0aXBuZy9pbWcvcG5ndGVzdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvb3B0aXBuZy9tYW4vTWFrZWZpbGUuaW4gYi9zcmMvb3B0aXBuZy9tYW4vTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MWQ1ZjAuLjAwMDAwMDAKLS0tIGEvc3JjL29wdGlwbmcvbWFuL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLlBIT05ZOiBhbGwgdGVzdCBjaGVjayBkaXN0IGNsZWFuIGRpc3RjbGVhbiBpbnN0YWxsIHVuaW5zdGFsbAotLlBSRUNJT1VTOiBNYWtlZmlsZQotCi1wcmVmaXggPSBAcHJlZml4QAotbWFuZGlyID0gQG1hbmRpckAKLW1hbjFkaXIgPSBAbWFuMWRpckAKLQotYWxsOiBvcHRpcG5nLm1hbi50eHQgb3B0aXBuZy5tYW4ucHMgb3B0aXBuZy5tYW4ucGRmIG9wdGlwbmcubWFuLmh0bWwKLQotb3B0aXBuZy5tYW4udHh0OiBvcHRpcG5nLjEKLQlucm9mZiAtbWFuIC1jIC1UYXNjaWkgJDwgfCBjb2wgLWIgLXggfCB1bmlxID4gJEAKLQotb3B0aXBuZy5tYW4ucHM6IG9wdGlwbmcuMQotCWdyb2ZmIC1tYW4gLVRwcyAtUC1nICQ8ID4gJEAKLQotb3B0aXBuZy5tYW4ucGRmOiBvcHRpcG5nLm1hbi5wcwotCXBzMnBkZiAkPCAkQAotCi1vcHRpcG5nLm1hbi5odG1sOiBvcHRpcG5nLjEKLQlncm9mZiAtbWFuIC1UaHRtbCAtUC1sICQ8ID4gJEAKLQotdGVzdDoKLQotY2hlY2s6Ci0KLWRpc3Q6IG9wdGlwbmcubWFuLnR4dCBvcHRpcG5nLm1hbi5wZGYgb3B0aXBuZy5tYW4uaHRtbAotCWNwIC1mIC1wIG9wdGlwbmcubWFuLnR4dCAuLi8uLi8uLi9kb2MvCi0JY3AgLWYgLXAgb3B0aXBuZy5tYW4ucGRmIC4uLy4uLy4uL2RvYy8KLQljcCAtZiAtcCBvcHRpcG5nLm1hbi5odG1sIC4uLy4uLy4uL2RvYy8KLQotY2xlYW46Ci0Jcm0gLWYgb3B0aXBuZy5tYW4udHh0Ci0Jcm0gLWYgb3B0aXBuZy5tYW4ucHMKLQlybSAtZiBvcHRpcG5nLm1hbi5wZGYKLQlybSAtZiBvcHRpcG5nLm1hbi5odG1sCi0KLWRpc3RjbGVhbjogZGlzdCBjbGVhbgotCXJtIC1mIE1ha2VmaWxlCi0KLWluc3RhbGw6IG9wdGlwbmcuMQotCW1rZGlyIC1wICQoREVTVERJUikkKG1hbjFkaXIpCi0JY3AgLWYgLXAgb3B0aXBuZy4xICQoREVTVERJUikkKG1hbjFkaXIpCi0KLXVuaW5zdGFsbDoKLQlybSAtZiAkKERFU1RESVIpJChtYW4xZGlyKS9vcHRpcG5nLjEKZGlmZiAtLWdpdCBhL3NyYy9vcHRpcG5nL21hbi9vcHRpcG5nLjEgYi9zcmMvb3B0aXBuZy9tYW4vb3B0aXBuZy4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzJkZDhmLi4wMDAwMDAwCi0tLSBhL3NyYy9vcHRpcG5nL21hbi9vcHRpcG5nLjEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotLlRIIE9QVElQTkcgMSAiMjAxMi1PY3QtMjEiICJPcHRpUE5HIHZlcnNpb24gMC43LjQiCi0KLS5TSCBOQU1FCi0uQiBPcHRpUE5HCi1cLSBPcHRpbWl6ZSBQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIGZpbGVzCi0KLS5TSCBTWU5PUFNJUwotLkIgb3B0aXBuZwotW1xmQlwtP1xmUCB8IFxmQlwtaFxmUCB8IFxmQlwtaGVscFxmUF0KLS5icgotLkIgb3B0aXBuZwotW1xmSW9wdGlvbnMuLi5cZlBdIFxmSWZpbGVzLi4uXGZQCi0KLS5TSCBERVNDUklQVElPTgotVGhlCi0uQiBPcHRpUE5HCi1wcm9ncmFtIHNoYWxsIGF0dGVtcHQgdG8gXGZJb3B0aW1pemVcZlAgUE5HIGZpbGVzLCBpLmUuIHJlZHVjZSB0aGVpciBzaXplIHRvCi1hIG1pbmltdW0sIHdpdGhvdXQgbG9zaW5nIHNlbWFudGljIGluZm9ybWF0aW9uLiBJbiBhZGRpdGlvbiwgdGhpcyBwcm9ncmFtIHNoYWxsCi1wZXJmb3JtIGEgc3VpdGUgb2YgYXV4aWxpYXJ5IGZ1bmN0aW9ucyBsaWtlIGludGVncml0eSBjaGVja3MsIG1ldGFkYXRhIHJlY292ZXJ5Ci1hbmQgcGl4bWFwLXRvLVBORyBjb252ZXJzaW9uLgotLlAKLVRoZSBvcHRpbWl6YXRpb24gYXR0ZW1wdHMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIHN1Y2NlZWQuIFZhbGlkIFBORyBmaWxlcyB0aGF0Ci1jYW5ub3QgYmUgb3B0aW1pemVkIGJ5IHRoaXMgcHJvZ3JhbSBhcmUgbm9ybWFsbHkgbGVmdCBpbnRhY3Q7IHRoZWlyIHNpemUgd2lsbAotbm90IGdyb3cuIFRoZSB1c2VyIG1heSByZXF1ZXN0IHRvIG92ZXJyaWRlIHRoaXMgZGVmYXVsdCBiZWhhdmlvci4KLQotLlNIIEZJTEVTCi1UaGUgaW5wdXQgZmlsZXMgYXJlIHJhc3RlciBpbWFnZSBmaWxlcyBlbmNvZGVkIGVpdGhlciBpbiBQTkcgZm9ybWF0ICh0aGUgbmF0aXZlCi1mb3JtYXQpLCBvciBpbiBhbiBleHRlcm5hbCBmb3JtYXQuIFRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIGV4dGVybmFsIGZvcm1hdHMgYXJlCi1HSUYsIEJNUCwgUE5NIGFuZCBUSUZGLgotLlAKLS5CIE9wdGlQTkcKLXByb2Nlc3NlcyBlYWNoIGltYWdlIGZpbGUgZ2l2ZW4gaW4gdGhlIGNvbW1hbmQgbGluZSBhcyBmb2xsb3dzOgotLlAKLVwtIElmIHRoZSBpbWFnZSBpcyBpbiBQTkcgZm9ybWF0OgotLklQCi1BdHRlbXB0cyB0byBvcHRpbWl6ZSB0aGUgZ2l2ZW4gZmlsZSBpbi1wbGFjZS4gSWYgb3B0aW1pemF0aW9uIGlzIHN1Y2Nlc3NmdWwsIG9yCi1pZiB0aGUgb3B0aW9uIFxmQlwtZm9yY2VcZlAgaXMgZW5hYmxlZCwgcmVwbGFjZXMgdGhlIG9yaWdpbmFsIGZpbGUgd2l0aCBpdHMKLW9wdGltaXplZCB2ZXJzaW9uLiBUaGUgb3JpZ2luYWwgZmlsZSBpcyBiYWNrZWQgdXAgaWYgdGhlIG9wdGlvbiBcZkJcLWtlZXBcZlAKLWlzIGVuYWJsZWQuCi0uUAotXC0gSWYgdGhlIGltYWdlIGlzIGluIGFuIGV4dGVybmFsIGZvcm1hdDoKLS5JUAotQ3JlYXRlcyBhbiBvcHRpbWl6ZWQgUE5HIHZlcnNpb24gb2YgdGhlIGdpdmVuIGZpbGUuIFRoZSBvdXRwdXQgZmlsZSBuYW1lIGlzCi1jb21wb3NlZCBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlIG5hbWUgYW5kIHRoZSBcZkMucG5nXGZQIGV4dGVuc2lvbi4KLS5QCi1FeGlzdGluZyBmaWxlcyBhcmUgXGZJbm90XGZQIG92ZXJ3cml0dGVuLCB1bmxlc3MgdGhlIG9wdGlvbiBcZkJcLWNsb2JiZXJcZlAgaXMKLWVuYWJsZWQuCi0KLS5TSCBPUFRJT05TCi0uU1MgIkdlbmVyYWwgb3B0aW9ucyIKLS5UUAotXGZCXC0/XGZQLCBcZkJcLWhcZlAsIFxmQlwtaGVscFxmUAotU2hvdyBhIGNvbXBsZXRlIHN1bW1hcnkgb2Ygb3B0aW9ucy4KLS5UUAotXGZCXC1iYWNrdXBcZlAsIFxmQlwta2VlcFxmUAotS2VlcCBhIGJhY2t1cCBvZiB0aGUgbW9kaWZpZWQgZmlsZXMuCi0uVFAKLVxmQlwtY2xvYmJlclxmUAotT3ZlcndyaXRlIHRoZSBleGlzdGluZyBvdXRwdXQgYW5kIGJhY2t1cCBmaWxlcy4KLS5icgotVW5kZXIgdGhpcyBvcHRpb24sIGlmIHRoZSBvcHRpb24gXGZCXC1iYWNrdXBcZlAgaXMgbm90IGVuYWJsZWQsIHRoZSBvbGQgYmFja3Vwcwotb2YgdGhlIG92ZXJ3cml0dGVuIGZpbGVzIGFyZSBkZWxldGVkLgotLlRQCi1cZkJcLWRpclxmUCBcZklkaXJlY3RvcnlcZlAKLVdyaXRlIHRoZSBvdXRwdXQgZmlsZXMgdG8gXGZJZGlyZWN0b3J5XGZQLgotLlRQCi1cZkJcLWZpeFxmUAotRW5hYmxlIGVycm9yIHJlY292ZXJ5LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHZhbGlkIGlucHV0IGZpbGVzLgotLmJyCi1UaGUgcHJvZ3JhbSB3aWxsIHNwZW5kIGEgcmVhc29uYWJsZSBhbW91bnQgb2YgZWZmb3J0IHRvIHJlY292ZXIgYXMgbXVjaCBkYXRhIGFzCi1wb3NzaWJsZSwgd2l0aG91dCBpbmNyZWFzaW5nIHRoZSBvdXRwdXQgZmlsZSBzaXplLCBidXQgdGhlIHN1Y2Nlc3MgY2Fubm90IGJlCi1nZW5lcmFsbHkgZ3VhcmFudGVlZC4gVGhlIHByb2dyYW0gbWF5IGV2ZW4gaW5jcmVhc2UgdGhlIGZpbGUgc2l6ZSwgZS5nLiwgYnkKLXJlY29uc3RydWN0aW5nIG1pc3NpbmcgY3JpdGljYWwgZGF0YS4gVW5kZXIgdGhpcyBvcHRpb24sIGludGVncml0eSBzaGFsbCB0YWtlCi1wcmVjZWRlbmNlIG92ZXIgZmlsZSBzaXplLgotLmJyCi1XaGVuIHRoaXMgb3B0aW9uIGlzIG5vdCB1c2VkLCB0aGUgaW52YWxpZCBpbnB1dCBmaWxlcyBhcmUgbGVmdCB1bnByb2Nlc3NlZC4KLS5UUAotXGZCXC1mb3JjZVxmUAotRW5mb3JjZSB3cml0aW5nIG9mIGEgbmV3IG91dHB1dCBmaWxlLgotLmJyCi1UaGlzIG9wdGlvbiBvdmVycmlkZXMgdGhlIHByb2dyYW0ncyBkZWNpc2lvbiBub3QgdG8gd3JpdGUgc3VjaCBmaWxlLCBlLmcuIHdoZW4KLXRoZSBQTkcgaW5wdXQgaXMgZGlnaXRhbGx5IHNpZ25lZCAodXNpbmcgZFNJRyksIG9yIHdoZW4gdGhlIFBORyBvdXRwdXQgYmVjb21lcwotbGFyZ2VyIHRoYW4gdGhlIFBORyBpbnB1dC4KLS5UUAotXGZCXC1sb2dcZlAgXGZJZmlsZVxmUAotTG9nIG1lc3NhZ2VzIHRvIFxmSWZpbGVcZlAuCi1Gb3Igc2FmZXR5IHJlYXNvbnMsIFxmSWZpbGVcZlAgbXVzdCBoYXZlIHRoZSBleHRlbnNpb24gXGZDLmxvZ1xmUC4KLS5icgotVGhpcyBvcHRpb24gaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGV2ZW50dWFsbHkuIFVzZSBzaGVsbAotcmVkaXJlY3Rpb24uCi0uVFAKLVxmQlwtb3V0XGZQIFxmSWZpbGVcZlAKLVdyaXRlIG91dHB1dCBmaWxlIHRvIFxmSWZpbGVcZlAuCi1UaGUgY29tbWFuZCBsaW5lIG11c3QgY29udGFpbiBleGFjdGx5IG9uZSBpbnB1dCBmaWxlLgotLlRQCi1cZkJcLXByZXNlcnZlXGZQCi1QcmVzZXJ2ZSBmaWxlIGF0dHJpYnV0ZXMgKHRpbWUgc3RhbXBzLCBmaWxlIGFjY2VzcyByaWdodHMsIGV0Yy4pIHdoZXJlCi1hcHBsaWNhYmxlLgotLlRQCi1cZkJcLXF1aWV0XGZQLCBcZkJcLXNpbGVudFxmUAotUnVuIGluIHF1aWV0IG1vZGUuCi0uYnIKLVRoZSBtZXNzYWdlcyBhcmUgc3RpbGwgd3JpdHRlbiB0byB0aGUgbG9nIGZpbGUgaWYgdGhlIG9wdGlvbiBcZkJcLWxvZ1xmUCBpcwotZW5hYmxlZC4KLS5UUAotXGZCXC1zaW11bGF0ZVxmUAotUnVuIGluIHNpbXVsYXRpb24gbW9kZTogcGVyZm9ybSB0aGUgdHJpYWxzLCBidXQgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMuCi0uVFAKLVxmQlwtdlxmUAotRW5hYmxlIHRoZSBvcHRpb25zIFxmQlwtdmVyYm9zZVxmUCBhbmQgXGZCXC12ZXJzaW9uXGZQLgotLlRQCi1cZkJcLXZlcmJvc2VcZlAKLVJ1biBpbiB2ZXJib3NlIG1vZGUuCi0uVFAKLVxmQlwtdmVyc2lvblxmUAotU2hvdyBjb3B5cmlnaHQsIHZlcnNpb24gYW5kIGJ1aWxkIGluZm8uCi0uVFAKLVxmQlwtXC1cZlAKLVN0b3Agb3B0aW9uIHN3aXRjaCBwYXJzaW5nLgotLlNTICJQTkcgZW5jb2RpbmcgYW5kIG9wdGltaXphdGlvbiBvcHRpb25zIgotLlRQCi1cZkJcLW9cZlAgXGZJbGV2ZWxcZlAKLVNlbGVjdCB0aGUgb3B0aW1pemF0aW9uIGxldmVsLgotLmJyCi1UaGUgb3B0aW1pemF0aW9uIGxldmVsIDAgZW5hYmxlcyBhIHNldCBvZiBvcHRpbWl6YXRpb24gb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUKLW1pbmltYWwgZWZmb3J0LiBUaGVyZSB3aWxsIGJlIG5vIGNoYW5nZXMgdG8gaW1hZ2UgYXR0cmlidXRlcyBsaWtlIGJpdCBkZXB0aAotb3IgY29sb3IgdHlwZSwgYW5kIG5vIHJlY29tcHJlc3Npb24gb2YgZXhpc3RpbmcgSURBVCBkYXRhc3RyZWFtcy4KLS5icgotVGhlIG9wdGltaXphdGlvbiBsZXZlbCAxIGVuYWJsZXMgYSBzaW5nbGUgSURBVCBjb21wcmVzc2lvbiB0cmlhbC4gVGhlIHRyaWFsCi1jaG9zZW4gaXMgd2hhdCBcZkJPcHRpUE5HXGZQIFxmSXRoaW5rc1xmUCBpdCdzIHByb2JhYmx5IHRoZSBtb3N0IGVmZmVjdGl2ZS4KLS5icgotVGhlIG9wdGltaXphdGlvbiBsZXZlbHMgMiBhbmQgaGlnaGVyIGVuYWJsZSBtdWx0aXBsZSBJREFUIGNvbXByZXNzaW9uIHRyaWFsczsKLXRoZSBoaWdoZXIgdGhlIGxldmVsLCB0aGUgbW9yZSB0cmlhbHMuCi0uYnIKLVRoZSBiZWhhdmlvciBhbmQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBvcHRpb24gbWF5IGNoYW5nZSBhY3Jvc3MgZGlmZmVyZW50Ci1wcm9ncmFtIHZlcnNpb25zLiBVc2UgdGhlIG9wdGlvbiBcZkJcLWhcZlAgdG8gc2VlIHRoZSBkZXRhaWxzIHBlcnRhaW5pbmcgdG8KLXlvdXIgc3BlY2lmaWMgdmVyc2lvbi4KLS5UUAotXGZCXC1mXGZQIFxmSWZpbHRlcnNcZlAKLVNlbGVjdCB0aGUgUE5HIGRlbHRhIGZpbHRlcnMuCi0uYnIKLVRoZSBcZklmaWx0ZXJzXGZQIGFyZ3VtZW50IGlzIHNwZWNpZmllZCBhcyBhIHJhbmdlc2V0IChlLmcuIFxmQlwtZjBcLTVcZlApLAotYW5kIHRoZSBkZWZhdWx0IFxmSWZpbHRlcnNcZlAgdmFsdWUgZGVwZW5kcyBvbiB0aGUgb3B0aW1pemF0aW9uIGxldmVsIHNldCBieQotdGhlIG9wdGlvbiBcZkJcLW9cZlAuCi0uYnIKLVRoZSBmaWx0ZXIgdmFsdWVzIDAsIDEsIDIsIDMgYW5kIDQgaW5kaWNhdGUgc3RhdGljIGZpbHRlcmluZywgYW5kIGNvcnJlc3BvbmQgdG8KLXRoZSBzdGFuZGFyZCBQTkcgZmlsdGVyIGNvZGVzIChcZklOb25lXGZQLCBcZklMZWZ0XGZQLCBcZklVcFxmUCwgXGZJQXZlcmFnZVxmUAotYW5kIFxmSVBhZXRoXGZQLCByZXNwZWN0aXZlbHkpLiBUaGUgZmlsdGVyIHZhbHVlIDUgaW5kaWNhdGVzIGFkYXB0aXZlIGZpbHRlcmluZywKLXdob3NlIGVmZmVjdCBpcyBkZWZpbmVkIGJ5IHRoZSBcZkJsaWJwbmdcZlAoMykgbGlicmFyeSB1c2VkIGJ5IFxmQk9wdGlQTkdcZlAuCi0uVFAKLVxmQlwtZnVsbFxmUAotUHJvZHVjZSBhIGZ1bGwgcmVwb3J0IG9uIElEQVQuCi1UaGlzIG9wdGlvbiBtaWdodCBzbG93IGRvd24gdGhlIHRyaWFscy4KLS5UUAotXGZCXC1pXGZQIFxmSXR5cGVcZlAKLVNlbGVjdCB0aGUgaW50ZXJsYWNlIHR5cGUgKDBcLTEpLgotLmJyCi1JZiB0aGUgaW50ZXJsYWNlIHR5cGUgMCBpcyBzZWxlY3RlZCwgdGhlIG91dHB1dCBpbWFnZSBzaGFsbCBiZSBub24taW50ZXJsYWNlZAotKGkuZS4gcHJvZ3Jlc3NpdmUtc2Nhbm5lZCkuIElmIHRoZSBpbnRlcmxhY2UgdHlwZSAxIGlzIHNlbGVjdGVkLCB0aGUgb3V0cHV0Ci1pbWFnZSBzaGFsbCBiZSBpbnRlcmxhY2VkIHVzaW5nIHRoZSBcZklBZGFtN1xmUCBtZXRob2QuCi0uYnIKLUJ5IGRlZmF1bHQsIHRoZSBvdXRwdXQgc2hhbGwgaGF2ZSB0aGUgc2FtZSBpbnRlcmxhY2UgdHlwZSBhcyB0aGUgaW5wdXQuCi0uVFAKLVxmQlwtbmJcZlAKLURvIG5vdCBhcHBseSBiaXQgZGVwdGggcmVkdWN0aW9uLgotLlRQCi1cZkJcLW5jXGZQCi1EbyBub3QgYXBwbHkgY29sb3IgdHlwZSByZWR1Y3Rpb24uCi0uVFAKLVxmQlwtbnBcZlAKLURvIG5vdCBhcHBseSBwYWxldHRlIHJlZHVjdGlvbi4KLS5UUAotXGZCXC1ueFxmUAotRG8gbm90IGFwcGx5IGFueSBsb3NzbGVzcyBpbWFnZSByZWR1Y3Rpb246Ci1lbmFibGUgdGhlIG9wdGlvbnMgXGZCXC1uYlxmUCwgXGZCXC1uY1xmUCBhbmQgXGZCXC1ucFxmUC4KLS5UUAotXGZCXC1uelxmUAotRG8gbm90IHJlY29kZSBJREFUIGRhdGFzdHJlYW1zLgotLmJyCi1UaGUgSURBVCBvcHRpbWl6YXRpb24gb3BlcmF0aW9ucyB0aGF0IGRvIG5vdCByZXF1aXJlIHJlY29kaW5nIChlLmcuIElEQVQKLWNodW5rIGNvbmNhdGVuYXRpb24pIGFyZSBzdGlsbCBwZXJmb3JtZWQuCi0uYnIKLVRoaXMgb3B0aW9uIGhhcyBlZmZlY3Qgb24gUE5HIGlucHV0IGZpbGVzIG9ubHkuCi0uVFAKLVxmQlwtemNcZlAgXGZJbGV2ZWxzXGZQCi1TZWxlY3QgdGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWxzIHVzZWQgaW4gSURBVCBjb21wcmVzc2lvbi4KLS5icgotVGhlIFxmSWxldmVsc1xmUCBhcmd1bWVudCBpcyBzcGVjaWZpZWQgYXMgYSByYW5nZXNldCAoZS5nLiBcZkJcLXpjNlwtOVxmUCksCi1hbmQgdGhlIGRlZmF1bHQgXGZJbGV2ZWxzXGZQIHZhbHVlIGRlcGVuZHMgb24gdGhlIG9wdGltaXphdGlvbiBsZXZlbCBzZXQgYnkKLXRoZSBvcHRpb24gXGZCXC1vXGZQLgotLmJyCi1UaGUgZWZmZWN0IG9mIHRoaXMgb3B0aW9uIGlzIGRlZmluZWQgYnkgdGhlIFxmQnpsaWJcZlAoMykgbGlicmFyeSB1c2VkIGJ5Ci1cZkJPcHRpUE5HXGZQLgotLlRQCi1cZkJcLXptXGZQIFxmSWxldmVsc1xmUAotU2VsZWN0IHRoZSB6bGliIG1lbW9yeSBsZXZlbHMgdXNlZCBpbiBJREFUIGNvbXByZXNzaW9uLgotLmJyCi1UaGUgXGZJbGV2ZWxzXGZQIGFyZ3VtZW50IGlzIHNwZWNpZmllZCBhcyBhIHJhbmdlc2V0IChlLmcuIFxmQlwtem04XC05XGZQKSwKLWFuZCB0aGUgZGVmYXVsdCBcZklsZXZlbHNcZlAgdmFsdWUgZGVwZW5kcyBvbiB0aGUgb3B0aW1pemF0aW9uIGxldmVsIHNldCBieQotdGhlIG9wdGlvbiBcZkJcLW9cZlAuCi0uYnIKLVRoZSBlZmZlY3Qgb2YgdGhpcyBvcHRpb24gaXMgZGVmaW5lZCBieSB0aGUgXGZCemxpYlxmUCgzKSBsaWJyYXJ5IHVzZWQgYnkKLVxmQk9wdGlQTkdcZlAuCi0uVFAKLVxmQlwtenNcZlAgXGZJc3RyYXRlZ2llc1xmUAotU2VsZWN0IHRoZSB6bGliIGNvbXByZXNzaW9uIHN0cmF0ZWdpZXMgdXNlZCBpbiBJREFUIGNvbXByZXNzaW9uLgotLmJyCi1UaGUgXGZJc3RyYXRlZ2llc1xmUCBhcmd1bWVudCBpcyBzcGVjaWZpZWQgYXMgYSByYW5nZXNldCAoZS5nLiBcZkJcLXpzMFwtM1xmUCksCi1hbmQgdGhlIGRlZmF1bHQgXGZJc3RyYXRlZ2llc1xmUCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBvcHRpbWl6YXRpb24gbGV2ZWwgc2V0IGJ5Ci10aGUgb3B0aW9uIFxmQlwtb1xmUC4KLS5icgotVGhlIGVmZmVjdCBvZiB0aGlzIG9wdGlvbiBpcyBkZWZpbmVkIGJ5IHRoZSBcZkJ6bGliXGZQKDMpIGxpYnJhcnkgdXNlZCBieQotXGZCT3B0aVBOR1xmUC4KLS5UUAotXGZCXC16d1xmUCBcZklzaXplXGZQCi1TZWxlY3QgdGhlIHpsaWIgd2luZG93IHNpemUgKDMyaywxNmssOGssNGssMmssMWssNTEyLDI1NikgdXNlZCBpbiBJREFUCi1jb21wcmVzc2lvbi4KLS5icgotVGhlIFxmSXNpemVcZlAgYXJndW1lbnQgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgaW4gYnl0ZXMgKGUuZy4gMTYzODQpIG9yCi1raWxvYnl0ZXMgKGUuZy4gMTZrKS4gVGhlIGRlZmF1bHQgXGZJc2l6ZVxmUCB2YWx1ZSBpcyBzZXQgdG8gdGhlIGxvd2VzdAotd2luZG93IHNpemUgdGhhdCB5aWVsZHMgYW4gSURBVCBvdXRwdXQgYXMgYmlnIGFzIGlmIHlpZWxkZWQgYnkgdGhlIHZhbHVlIDMyNzY4LgotLmJyCi1UaGUgZWZmZWN0IG9mIHRoaXMgb3B0aW9uIGlzIGRlZmluZWQgYnkgdGhlIFxmQnpsaWJcZlAoMykgbGlicmFyeSB1c2VkIGJ5Ci1cZkJPcHRpUE5HXGZQLgotLlNTICJFZGl0aW5nIG9wdGlvbnMiCi0uVFAKLVxmQlwtc25pcFxmUAotQ3V0IG9uZSBpbWFnZSBvdXQgb2YgbXVsdGktaW1hZ2UsIGFuaW1hdGlvbiBvciB2aWRlbyBmaWxlcy4KLS5icgotRGVwZW5kaW5nIG9uIHRoZSBpbnB1dCBmb3JtYXQsIHRoaXMgbWF5IGJlIGVpdGhlciB0aGUgZmlyc3Qgb3IgdGhlIG1vc3QKLXJlbGV2YW50IChlLmcuIHRoZSBsYXJnZXN0KSBpbWFnZS4KLS5UUAotXGZCXC1zdHJpcFxmUCBcZklvYmplY3RzXGZQCi1TdHJpcCBtZXRhZGF0YSBvYmplY3RzIGZyb20gYSBQTkcgZmlsZS4KLS5icgotUE5HIG1ldGFkYXRhIGlzIHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gYW55IGFuY2lsbGFyeSBjaHVuayBleGNlcHQgdFJOUy4KLSh0Uk5TIHJlcHJlc2VudHMgdGhlIGFscGhhIGNoYW5uZWwsIHdoaWNoLCBldmVuIGlmIGlnbm9yZWQgaW4gcmVuZGVyaW5nLCBpcwotc3RpbGwgYSBwcm9wZXIgaW1hZ2UgY2hhbm5lbCBpbiB0aGUgUkdCQSBjb2xvciBzcGFjZS4pCi0uYnIKLVRoZSBvbmx5IG9wdGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGlzIFxmQlwtc3RyaXAgYWxsXGZQLgotLlNTICJOb3RlcyIKLU9wdGlvbnMgbWF5IGNvbWUgaW4gYW55IG9yZGVyIChleGNlcHQgZm9yIFxmQlwtXC1cZlApLCBiZWZvcmUsIGFmdGVyLCBvcgotYWx0ZXJuYXRpbmcgd2l0aCBmaWxlIG5hbWVzLiBPcHRpb24gbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIG1heSBiZQotYWJicmV2aWF0ZWQgdG8gdGhlaXIgc2hvcnRlc3QgdW5pcXVlIHByZWZpeC4KLS5QCi1Tb21lIG9wdGlvbnMgbWF5IGhhdmUgYXJndW1lbnRzIHRoYXQgZm9sbG93IHRoZSBvcHRpb24gbmFtZSwgc2VwYXJhdGVkIGJ5Ci13aGl0ZXNwYWNlIG9yIHRoZSBlcXVhbCBzaWduICgnXGZCPVxmUCcpLiBJZiB0aGUgb3B0aW9uIGFyZ3VtZW50IGlzIGEgbnVtYmVyCi1vciBhIHJhbmdlc2V0LCB0aGUgc2VwYXJhdG9yIG1heSBiZSBvbWl0dGVkLiBGb3IgZXhhbXBsZToKLS5JUAotXGZCXC1vdXRcZlAgXGZDbmV3ZmlsZS5wbmdcZlAgXCA8PT4gXCBcZkJcLW91dD1cZlBcZkNuZXdmaWxlLnBuZ1xmUAotLmJyCi1cZkJcLW8zXGZQIFwgPD0+IFwgXGZCXC1vIDNcZlAgXCA8PT4gXCBcZkJcLW89M1xmUAotLmJyCi1cZkJcLWYwLDNcLTVcZlAgXCA8PT4gXCBcZkJcLWYgMCwzXC01XGZQIFwgPD0+IFwgXGZCXC1mPTAsM1wtNVxmUAotLlAKLVJhbmdlc2V0IGFyZ3VtZW50cyBhcmUgY3VtdWxhdGl2ZTsgZS5nLgotLklQCi1cZkJcLWYwIFwtZjNcLTVcZlAgXCA8PT4gXCBcZkJcLWYwLDNcLTVcZlAKLS5icgotXGZCXC16czAgXC16czEgXC16czJcLTNcZlAgXCA8PT4gXCBcZkJcLXpzMCwxLDIsM1xmUCBcIDw9PiBcIFxmQlwtenMwXC0zXGZQCi0KLS5TSCAiRVhURU5ERUQgREVTQ1JJUFRJT04iCi1UaGUgUE5HIG9wdGltaXphdGlvbiBhbGdvcml0aG0gY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBzdGVwczoKLS5UUCA0Ci0xLgotUmVkdWNlIHRoZSBiaXQgZGVwdGgsIHRoZSBjb2xvciB0eXBlIGFuZCB0aGUgY29sb3IgcGFsZXR0ZSBvZiB0aGUgaW1hZ2UuCi1UaGlzIHN0ZXAgbWF5IHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGltYWdlLCB3aGljaCwgaW5kaXJlY3RseSwgbWF5Ci1yZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgaW1hZ2UgKGkuZS4gdGhlIHNpemUgb2YgdGhlIG91dHB1dCBQTkcgZmlsZSkuCi0uVFAgNAotMi4KLVJ1biBhIHN1aXRlIG9mIGNvbXByZXNzaW9uIG1ldGhvZHMgYW5kIHN0cmF0ZWdpZXMgYW5kIHNlbGVjdCB0aGUgY29tcHJlc3Npb24KLXBhcmFtZXRlcnMgdGhhdCB5aWVsZCB0aGUgc21hbGxlc3Qgb3V0cHV0IGZpbGUuCi0uVFAgNAotMy4KLVN0b3JlIGFsbCBJREFUIGNvbnRlbnRzIGludG8gYSBzaW5nbGUgY2h1bmssIGVsaW1pbmF0aW5nIHRoZSBvdmVyaGVhZAotaW5jdXJyZWQgYnkgcmVwZWF0ZWQgSURBVCBoZWFkZXJzIGFuZCBDUkNzLgotLlRQIDQKLTQuCi1TZXQgdGhlIHpsaWIgd2luZG93IHNpemUgaW5zaWRlIElEQVQgdG8gYSBtaW5pbnVtIHRoYXQgZG9lcyBub3QgYWZmZWN0IHRoZQotY29tcHJlc3Npb24gcmF0aW8sIHJlZHVjaW5nIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIG9mIFBORyBkZWNvZGVycy4KLS5QCi1Ob3QgYWxsIG9mIHRoZSBhYm92ZSBzdGVwcyBuZWVkIHRvIGJlIGV4ZWN1dGVkLiBUaGUgYmVoYXZpb3IgZGVwZW5kcyBvbiB0aGUKLWFjdHVhbCBpbnB1dCBmaWxlcyBhbmQgdXNlciBvcHRpb25zLgotLlAKLVN0ZXAgMSBtYXkgYmUgY3VzdG9taXplZCB2aWEgdGhlIG5vLXJlZHVjZSBvcHRpb25zIFxmQlwtbmJcZlAsIFxmQlwtbmNcZlAsCi1cZkJcLW5wXGZQIGFuZCBcZkJcLW54XGZQLiBTdGVwIDIgbWF5IGJlIGN1c3RvbWl6ZWQgdmlhIHRoZSBcZkJcLW9cZlAgb3B0aW9uLAotYW5kIG1heSBiZSBmaW5lLXR1bmVkIHZpYSB0aGUgb3B0aW9ucyBcZkJcLXpjXGZQLCBcZkJcLXptXGZQLCBcZkJcLXpzXGZQIGFuZAotXGZCXC16d1xmUC4gU3RlcCAzIGlzIGFsd2F5cyBleGVjdXRlZC4gU3RlcCA0IGlzIGV4ZWN1dGVkIG9ubHkgaWYgYSBuZXcgSURBVCBpcwotYmVpbmcgY3JlYXRlZCwgYW5kIG1heSBiZSBmaW5lLXR1bmVkIHZpYSB0aGUgb3B0aW9uIFxmQlwtendcZlAuCi0uUAotRXh0cmVtZWx5IGV4aGF1c3RpdmUgc2VhcmNoZXMgYXJlIG5vdCBnZW5lcmFsbHkgZXhwZWN0ZWQgdG8geWllbGQgc2lnbmlmaWNhbnQKLWltcHJvdmVtZW50cyBpbiBjb21wcmVzc2lvbiByYXRpbywgYW5kIGFyZSByZWNvbW1lbmRlZCB0byBhZHZhbmNlZCB1c2VycyBvbmx5LgotCi0uU0ggRVhBTVBMRVMKLVxmQ29wdGlwbmcgZmlsZS5wbmcgXCBcIFwgXCBcIFxmUCMgZGVmYXVsdCBzcGVlZAotLmJyCi1cZkNvcHRpcG5nIC1vNSBmaWxlLnBuZyBcIFxmUCMgc2xvdwotLmJyCi1cZkNvcHRpcG5nIC1vNyBmaWxlLnBuZyBcIFxmUCMgdmVyeSBzbG93Ci0KLS5TSCBCVUdTCi1Mb3NzbGVzcyBpbWFnZSByZWR1Y3Rpb25zIGFyZSBub3QgY29tcGxldGVseSBpbXBsZW1lbnRlZC4KLShUaGlzIGRvZXMgXGZJbm90XGZQIGFmZmVjdCB0aGUgaW50ZWdyaXR5IG9mIHRoZSBvdXRwdXQgZmlsZXMuKQotSGVyZSBhcmUgdGhlIG1pc3NpbmcgcGllY2VzOgotLklQCi1cLSBUaGUgY29sb3IgcGFsZXR0ZSByZWR1Y3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbmx5IHBhcnRpYWxseS4KLS5icgotXC0gVGhlIGJpdCBkZXB0aCByZWR1Y3Rpb25zIGJlbG93IDgsIGZvciBncmF5c2NhbGUgaW1hZ2VzLCBhcmUgbm90IGltcGxlbWVudGVkCi15ZXQuCi0uUAotRW5jb2Rpbmcgb2YgaW1hZ2VzIHdob3NlIHRvdGFsIElEQVQgc2l6ZSBleGNlZWRzIDJHQiBpcyBub3Qgc3VwcG9ydGVkLgotLlAKLVRJRkYgc3VwcG9ydCBpcyBsaW1pdGVkIHRvIHVuY29tcHJlc3NlZCwgUE5HLWNvbXBhdGlibGUgKGdyYXlzY2FsZSwgUkdCIGFuZAotUkdCQSkgaW1hZ2VzLgotLlAKLU1ldGFkYXRhIGlzIG5vdCBpbXBvcnRlZCBmcm9tIHRoZSBleHRlcm5hbCBpbWFnZSBmb3JtYXRzLgotLlAKLVRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHBpcGVzIG9yIHN0cmVhbXMuCi0KLS5TSCAiU0VFIEFMU08iCi1cZkJwbmdcZlAoNSksCi1cZkJsaWJwbmdcZlAoMyksCi1cZkJ6bGliXGZQKDMpLAotXGZCcG5nY3J1c2hcZlAoMSksCi1cZkJwbmdyZXdyaXRlXGZQKDEpLgotCi0uU0ggU1RBTkRBUkRTCi1UaGUgZmlsZXMgcHJvZHVjZWQgYnkgXGZCT3B0aVBOR1xmUCBhcmUgY29tcGxpYW50IHdpdGggXGZCUE5HXC0yMDAzXGZQOgotLmJyCi1HbGVubiBSYW5kZXJzLVBlaHJzb24gZXQgYWwuCi1cZklQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIFNwZWNpZmljYXRpb24sIFNlY29uZCBFZGl0aW9uXGZQLgotLmJyCi1XM0MgUmVjb21tZW5kYXRpb24gMTAgTm92ZW1iZXIgMjAwMzsgSVNPL0lFQyBJUyAxNTk0ODoyMDAzIChFKS4KLS5icgotXGZDaHR0cDovL3d3dy53My5vcmcvVFIvUE5HL1xmUAotCi0uU0ggQVVUSE9SCi1cZkJPcHRpUE5HXGZQIGlzIHdyaXR0ZW4gYW5kIG1haW50YWluZWQgYnkgQ29zbWluIFRydXRhLgotLlBQCi1UaGlzIG1hbnVhbCBwYWdlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTmVsc29uIEEuIGRlIE9saXZlaXJhCi1mb3IgdGhlIERlYmlhbiBQcm9qZWN0LiBJdCB3YXMgbGF0ZXIgdXBkYXRlZCBieSBDb3NtaW4gVHJ1dGEsCi1hbmQgaXMgbm93IHBhcnQgb2YgdGhlIFxmQk9wdGlQTkdcZlAgZGlzdHJpYnV0aW9uLgpkaWZmIC0tZ2l0IGEvc3JjL29wdGlwbmcvb3B0aW0uYyBiL3NyYy9vcHRpcG5nL29wdGltLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MmVjOGYuLjAwMDAwMDAKLS0tIGEvc3JjL29wdGlwbmcvb3B0aW0uYworKysgL2Rldi9udWxsCkBAIC0xLDE5MzYgKzAsMCBAQAotLyoKLSAqIG9wdGltLmMKLSAqIFRoZSBtYWluIFBORyBvcHRpbWl6YXRpb24gZW5naW5lLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDEyIENvc21pbiBUcnV0YS4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB6bGliIGxpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIHRoZSBhdHRhY2hlZCBMSUNFTlNFIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAib3B0aXBuZy5oIgotI2luY2x1ZGUgInByb2dpbmZvLmgiCi0KLSNpbmNsdWRlICJjYml0c2V0LmgiCi0jaW5jbHVkZSAib3BuZ3JlZHVjLmgiCi0jaW5jbHVkZSAib3N5cy5oIgotI2luY2x1ZGUgInBuZy5oIgotI2luY2x1ZGUgInBuZ3h0ZXJuLmgiCi0jaW5jbHVkZSAicG5neHV0aWwuaCIKLSNpbmNsdWRlICJ6bGliLmgiCi0KLQotLyoKLSAqIFVzZXIgZXhjZXB0aW9uIHNldHVwLgotICovCi0jaW5jbHVkZSAiY2V4Y2VwdC5oIgotZGVmaW5lX2V4Y2VwdGlvbl90eXBlKGNvbnN0IGNoYXIgKik7Ci1zdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgdGhlX2V4Y2VwdGlvbl9jb250ZXh0WzFdOwotCi0KLS8qCi0gKiBPcHRpbWl6YXRpb24gdGFibGVzIGFuZCBwcmVzZXRzCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjb21wcl9sZXZlbF9wcmVzZXRzW09QTkdfT1BUSU1fTEVWRUxfTUFYICsgMV0gPQotICAgIHsgIiIsICIiLCAiOSIsICI5IiwgIjkiLCAiOSIsICIxLTkiLCAiMS05IiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKm1lbV9sZXZlbF9wcmVzZXRzW09QTkdfT1BUSU1fTEVWRUxfTUFYICsgMV0gPQotICAgIHsgIiIsICIiLCAiOCIsICI4LTkiLCAiOCIsICI4LTkiLCAiOCIsICI4LTkiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqc3RyYXRlZ3lfcHJlc2V0c1tPUE5HX09QVElNX0xFVkVMX01BWCArIDFdID0KLSAgICB7ICIiLCAiIiwgIjAtIiwgIjAtIiwgIjAtIiwgIjAtIiwgIjAtIiwgIjAtIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKmZpbHRlcl9wcmVzZXRzW09QTkdfT1BUSU1fTEVWRUxfTUFYICsgMV0gPQotICAgIHsgIiIsICIiLCAiMCw1IiwgIjAsNSIsICIwLSIsICIwLSIsICIwLSIsICIwLSIgfTsKLXN0YXRpYyBjb25zdCBpbnQgZmlsdGVyX3RhYmxlW09QTkdfRklMVEVSX01BWCArIDFdID0KLXsKLSAgICBQTkdfRklMVEVSX05PTkUgIC8qIDAgKi8sCi0gICAgUE5HX0ZJTFRFUl9TVUIgICAvKiAxICovLAotICAgIFBOR19GSUxURVJfVVAgICAgLyogMiAqLywKLSAgICBQTkdfRklMVEVSX0FWRyAgIC8qIDMgKi8sCi0gICAgUE5HX0ZJTFRFUl9QQUVUSCAvKiA0ICovLAotICAgIFBOR19BTExfRklMVEVSUyAgLyogNSAqLwotfTsKLQotLyoKLSAqIFN0YXR1cyBmbGFncwotICovCi1lbnVtCi17Ci0gICAgSU5QVVRfSVNfUE5HX0ZJTEUgICAgICAgICAgID0gMHgwMDAxLAotICAgIElOUFVUX0hBU19QTkdfREFUQVNUUkVBTSAgICA9IDB4MDAwMiwKLSAgICBJTlBVVF9IQVNfUE5HX1NJR05BVFVSRSAgICAgPSAweDAwMDQsCi0gICAgSU5QVVRfSEFTX0RJR0lUQUxfU0lHTkFUVVJFID0gMHgwMDA4LAotICAgIElOUFVUX0hBU19NVUxUSVBMRV9JTUFHRVMgICA9IDB4MDAxMCwKLSAgICBJTlBVVF9IQVNfQVBORyAgICAgICAgICAgICAgPSAweDAwMjAsCi0gICAgSU5QVVRfSEFTX1NUUklQUEVEX0RBVEEgICAgID0gMHgwMDQwLAotICAgIElOUFVUX0hBU19KVU5LICAgICAgICAgICAgICA9IDB4MDA4MCwKLSAgICBJTlBVVF9IQVNfRVJST1JTICAgICAgICAgICAgPSAweDAxMDAsCi0gICAgT1VUUFVUX05FRURTX05FV19GSUxFICAgICAgID0gMHgxMDAwLAotICAgIE9VVFBVVF9ORUVEU19ORVdfSURBVCAgICAgICA9IDB4MjAwMCwKLSAgICBPVVRQVVRfSEFTX0VSUk9SUyAgICAgICAgICAgPSAweDQwMDAKLX07Ci0KLS8qCi0gKiBUaGUgY2h1bmtzIGhhbmRsZWQgYnkgT3B0aVBORwotICovCi1zdGF0aWMgY29uc3QgcG5nX2J5dGUgc2lnX1BMVEVbNF0gPSB7IDB4NTAsIDB4NGMsIDB4NTQsIDB4NDUgfTsKLXN0YXRpYyBjb25zdCBwbmdfYnl0ZSBzaWdfdFJOU1s0XSA9IHsgMHg3NCwgMHg1MiwgMHg0ZSwgMHg1MyB9Owotc3RhdGljIGNvbnN0IHBuZ19ieXRlIHNpZ19JREFUWzRdID0geyAweDQ5LCAweDQ0LCAweDQxLCAweDU0IH07Ci1zdGF0aWMgY29uc3QgcG5nX2J5dGUgc2lnX0lFTkRbNF0gPSB7IDB4NDksIDB4NDUsIDB4NGUsIDB4NDQgfTsKLXN0YXRpYyBjb25zdCBwbmdfYnl0ZSBzaWdfYktHRFs0XSA9IHsgMHg2MiwgMHg0YiwgMHg0NywgMHg0NCB9Owotc3RhdGljIGNvbnN0IHBuZ19ieXRlIHNpZ19oSVNUWzRdID0geyAweDY4LCAweDQ5LCAweDUzLCAweDU0IH07Ci1zdGF0aWMgY29uc3QgcG5nX2J5dGUgc2lnX3NCSVRbNF0gPSB7IDB4NzMsIDB4NDIsIDB4NDksIDB4NTQgfTsKLXN0YXRpYyBjb25zdCBwbmdfYnl0ZSBzaWdfZFNJR1s0XSA9IHsgMHg2NCwgMHg1MywgMHg0OSwgMHg0NyB9Owotc3RhdGljIGNvbnN0IHBuZ19ieXRlIHNpZ19hY1RMWzRdID0geyAweDYxLCAweDYzLCAweDU0LCAweDRjIH07Ci1zdGF0aWMgY29uc3QgcG5nX2J5dGUgc2lnX2ZjVExbNF0gPSB7IDB4NjYsIDB4NjMsIDB4NTQsIDB4NGMgfTsKLXN0YXRpYyBjb25zdCBwbmdfYnl0ZSBzaWdfZmRBVFs0XSA9IHsgMHg2NiwgMHg2NCwgMHg0MSwgMHg1NCB9OwotCi0vKgotICogVGhlIG9wdGltaXphdGlvbiBlbmdpbmUuCi0gKiBTaW5jZSB0aGUgZW5naW5lIGlzIG5vdCBtdWx0aXRocmVhZGVkLCB0aGVyZSBpc24ndCBtdWNoIHRvIHB1dCBpbiBoZXJlLi4uCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgb3BuZ19lbmdpbmVfc3RydWN0Ci17Ci0gICAgaW50IHN0YXJ0ZWQ7Ci19IGVuZ2luZTsKLQotLyoKLSAqIFRoZSBvcHRpbWl6YXRpb24gcHJvY2VzcwotICovCi1zdGF0aWMgc3RydWN0IG9wbmdfcHJvY2Vzc19zdHJ1Y3QKLXsKLSAgICB1bnNpZ25lZCBpbnQgc3RhdHVzOwotICAgIGludCBudW1faXRlcmF0aW9uczsKLSAgICBvc3lzX2ZvZmZzZXRfdCBpbl9kYXRhc3RyZWFtX29mZnNldDsKLSAgICBvc3lzX2ZzaXplX3QgaW5fZmlsZV9zaXplLCBvdXRfZmlsZV9zaXplOwotICAgIG9zeXNfZnNpemVfdCBpbl9pZGF0X3NpemUsIG91dF9pZGF0X3NpemU7Ci0gICAgb3N5c19mc2l6ZV90IGJlc3RfaWRhdF9zaXplLCBtYXhfaWRhdF9zaXplOwotICAgIHBuZ191aW50XzMyIGluX3BsdGVfdHJuc19zaXplLCBvdXRfcGx0ZV90cm5zX3NpemU7Ci0gICAgcG5nX3VpbnRfMzIgcmVkdWN0aW9uczsKLSAgICBiaXRzZXRfdCBjb21wcl9sZXZlbF9zZXQsIG1lbV9sZXZlbF9zZXQsIHN0cmF0ZWd5X3NldCwgZmlsdGVyX3NldDsKLSAgICBpbnQgYmVzdF9jb21wcl9sZXZlbCwgYmVzdF9tZW1fbGV2ZWwsIGJlc3Rfc3RyYXRlZ3ksIGJlc3RfZmlsdGVyOwotfSBwcm9jZXNzOwotCi0vKgotICogVGhlIG9wdGltaXphdGlvbiBwcm9jZXNzIGxpbWl0cwotICovCi1zdGF0aWMgY29uc3Qgb3N5c19mc2l6ZV90IGlkYXRfc2l6ZV9tYXggPSBQTkdfVUlOVF8zMV9NQVg7Ci1zdGF0aWMgY29uc3QgY2hhciAqaWRhdF9zaXplX21heF9zdHJpbmcgPSAiMkdCIjsKLQotLyoKLSAqIFRoZSBvcHRpbWl6YXRpb24gcHJvY2VzcyBzdW1tYXJ5Ci0gKi8KLXN0YXRpYyBzdHJ1Y3Qgb3BuZ19zdW1tYXJ5X3N0cnVjdAotewotICAgIHVuc2lnbmVkIGludCBmaWxlX2NvdW50OwotICAgIHVuc2lnbmVkIGludCBlcnJfY291bnQ7Ci0gICAgdW5zaWduZWQgaW50IGZpeF9jb3VudDsKLSAgICB1bnNpZ25lZCBpbnQgc25pcF9jb3VudDsKLX0gc3VtbWFyeTsKLQotLyoKLSAqIFRoZSBvcHRpbWl6ZWQgaW1hZ2UKLSAqLwotc3RhdGljIHN0cnVjdCBvcG5nX2ltYWdlX3N0cnVjdAotewotICAgIHBuZ191aW50XzMyIHdpZHRoOyAgICAgICAgICAgICAvKiBJSERSICovCi0gICAgcG5nX3VpbnRfMzIgaGVpZ2h0OwotICAgIGludCBiaXRfZGVwdGg7Ci0gICAgaW50IGNvbG9yX3R5cGU7Ci0gICAgaW50IGNvbXByZXNzaW9uX3R5cGU7Ci0gICAgaW50IGZpbHRlcl90eXBlOwotICAgIGludCBpbnRlcmxhY2VfdHlwZTsKLSAgICBwbmdfYnl0ZXBwIHJvd19wb2ludGVyczsgICAgICAgLyogSURBVCAqLwotICAgIHBuZ19jb2xvcnAgcGFsZXR0ZTsgICAgICAgICAgICAvKiBQTFRFICovCi0gICAgaW50IG51bV9wYWxldHRlOwotICAgIHBuZ19jb2xvcl8xNnAgYmFja2dyb3VuZF9wdHI7ICAvKiBiS0dEICovCi0gICAgcG5nX2NvbG9yXzE2IGJhY2tncm91bmQ7Ci0gICAgcG5nX3VpbnRfMTZwIGhpc3Q7ICAgICAgICAgICAgIC8qIGhJU1QgKi8KLSAgICBwbmdfY29sb3JfOHAgc2lnX2JpdF9wdHI7ICAgICAgLyogc0JJVCAqLwotICAgIHBuZ19jb2xvcl84IHNpZ19iaXQ7Ci0gICAgcG5nX2J5dGVwIHRyYW5zX2FscGhhOyAgICAgICAgIC8qIHRSTlMgKi8KLSAgICBpbnQgbnVtX3RyYW5zOwotICAgIHBuZ19jb2xvcl8xNnAgdHJhbnNfY29sb3JfcHRyOwotICAgIHBuZ19jb2xvcl8xNiB0cmFuc19jb2xvcjsKLSAgICBwbmdfdW5rbm93bl9jaHVua3AgdW5rbm93bnM7ICAgLyogZXZlcnl0aGluZyBlbHNlICovCi0gICAgaW50IG51bV91bmtub3duczsKLX0gaW1hZ2U7Ci0KLS8qCi0gKiBUaGUgdXNlciBvcHRpb25zCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgb3BuZ19vcHRpb25zIG9wdGlvbnM7Ci0KLQotLyoKLSAqIFRoZSB1c2VyIGludGVyZmFjZQotICovCi1zdGF0aWMgdm9pZCAoKnVzcl9wcmludGYpKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKLXN0YXRpYyB2b2lkICgqdXNyX3ByaW50X2NudHJsKShpbnQgY250cmxfY29kZSk7Ci1zdGF0aWMgdm9pZCAoKnVzcl9wcm9ncmVzcykodW5zaWduZWQgbG9uZyBudW0sIHVuc2lnbmVkIGxvbmcgZGVub20pOwotc3RhdGljIHZvaWQgKCp1c3JfcGFuaWMpKGNvbnN0IGNoYXIgKm1zZyk7Ci0KLQotLyoKLSAqIE1vcmUgZ2xvYmFsIHZhcmlhYmxlcywgZm9yIHF1aWNrIGFjY2VzcyBhbmQgYm9udXMgc3R5bGUgcG9pbnRzCi0gKi8KLXN0YXRpYyBwbmdfc3RydWN0cCByZWFkX3B0cjsKLXN0YXRpYyBwbmdfaW5mb3AgcmVhZF9pbmZvX3B0cjsKLXN0YXRpYyBwbmdfc3RydWN0cCB3cml0ZV9wdHI7Ci1zdGF0aWMgcG5nX2luZm9wIHdyaXRlX2luZm9fcHRyOwotCi0KLS8qCi0gKiBJbnRlcm5hbCBkZWJ1Z2dpbmcgdG9vbAotICovCi0jZGVmaW5lIE9QTkdfRU5TVVJFKGNvbmQsIG1zZykgXAotICAgIHsgaWYgKCEoY29uZCkpIHVzcl9wYW5pYyhtc2cpOyB9ICAvKiBzdHJvbmcgY2hlY2ssIG5vICNpZmRlZidzICovCi0KLQotLyoKLSAqIFNpemUgcmF0aW8gZGlzcGxheQotICovCi1zdGF0aWMgdm9pZAotb3BuZ19wcmludF9mc2l6ZV9yYXRpbyhvc3lzX2ZzaXplX3QgbnVtLCBvc3lzX2ZzaXplX3QgZGVub20sIGludCBmb3JjZV9wZXJjZW50KQotewotICAgIC8qICgxKSBudW0vZGVub20gPSAwLzAgICAgICAgICAgICAgICAgICA9PT4gcHJpbnQgIj8/JSIKLSAgICAgKiAoMikgbnVtL2Rlbm9tID0gSU5GSU5JVFkgICAgICAgICAgICAgPT0+IHByaW50ICJJTkZUWSUiCi0gICAgICogKDMpIDAgPD0gbnVtL2Rlbm9tIDwgOTkuOTk1JSAgICAgICAgID09PiB1c2UgdGhlIHBlcmNlbnQgZm9ybWF0ICI5OS45OSUiCi0gICAgICogICAgIGlmIGZvcmNlX3BlcmNlbnQ6Ci0gICAgICogKDQpICAgIDAuOTk1IDw9IG51bS9kZW5vbSA8IElORklOSVRZID09PiB1c2UgdGhlIHBlcmNlbnQgZm9ybWF0ICI5OTklIgotICAgICAqICAgICBlbHNlOgotICAgICAqICg1KSAgICAwLjk5NSA8PSBudW0vZGVub20gPCA5OS45OTUgICA9PT4gdXNlIHRoZSBmYWN0b3IgZm9ybWF0ICI5Ljk5eCIKLSAgICAgKiAoNikgICAgOTkuNSA8PSBudW0vZGVub20gPCBJTkZJTklUWSAgPT0+IHVzZSB0aGUgZmFjdG9yIGZvcm1hdCAiOTk5eCIKLSAgICAgKiAgICAgZW5kIGlmCi0gICAgICovCi0KLSAgICBvc3lzX2ZzaXplX3QgaW50ZWdlcl9wYXJ0LCByZW1haW5kZXI7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uYWxfcGFydCwgc2NhbGU7Ci0gICAgZG91YmxlIHNjYWxlZF9yYXRpbzsKLQotICAgIC8qICgxLDIpOiBudW0vZGVub20gPSAwLzAgb3IgbnVtL2Rlbm9tID0gSU5GSU5JVFkgKi8KLSAgICBpZiAoZGVub20gPT0gMCkKLSAgICB7Ci0gICAgICAgIHVzcl9wcmludGYobnVtID09IDAgPyAiPz8lJSIgOiAiSU5GVFklJSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogKDMpOiAwIDw9IG51bS9kZW5vbSA8IDk5Ljk5NSUgKi8KLSAgICAvKiBudW0vZGVub20gPCA5OS45OTUlIDw9PT4gZGVub20vKGRlbm9tLW51bSkgPCAyMDAwMCAqLwotICAgIGlmIChudW0gPCBkZW5vbSAmJiBkZW5vbSAvIChkZW5vbSAtIG51bSkgPCAyMDAwMCkKLSAgICB7Ci0gICAgICAgIHNjYWxlID0gMTAwMDA7Ci0gICAgICAgIHNjYWxlZF9yYXRpbyA9ICgoZG91YmxlKW51bSAqIChkb3VibGUpc2NhbGUpIC8gKGRvdWJsZSlkZW5vbTsKLSAgICAgICAgZnJhY3Rpb25hbF9wYXJ0ID0gKHVuc2lnbmVkIGludCkoc2NhbGVkX3JhdGlvICsgMC41KTsKLSAgICAgICAgLyogQWRqdXN0IHRoZSBzY2FsZWQgcmVzdWx0IGluIHRoZSBldmVudCBvZiBhIHJvdW5kb2ZmIGVycm9yLiAqLwotICAgICAgICAvKiBTdWNoIGVycm9yIG1heSBvY2N1ciBvbmx5IGlmIHRoZSBudW1lcmF0b3IgaXMgZXh0cmVtZWx5IGxhcmdlLiAqLwotICAgICAgICBpZiAoZnJhY3Rpb25hbF9wYXJ0ID49IHNjYWxlKQotICAgICAgICAgICAgZnJhY3Rpb25hbF9wYXJ0ID0gc2NhbGUgLSAxOwotICAgICAgICB1c3JfcHJpbnRmKCIldS4lMDJ1JSUiLCBmcmFjdGlvbmFsX3BhcnQgLyAxMDAsIGZyYWN0aW9uYWxfcGFydCAlIDEwMCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBFeHRyYWN0IHRoZSBpbnRlZ2VyIHBhcnQgb3V0IG9mIHRoZSBmcmFjdGlvbiBmb3IgdGhlIHJlbWFpbmluZyBjYXNlcy4gKi8KLSAgICBpbnRlZ2VyX3BhcnQgPSBudW0gLyBkZW5vbTsKLSAgICByZW1haW5kZXIgPSBudW0gJSBkZW5vbTsKLSAgICBzY2FsZSA9IDEwMDsKLSAgICBzY2FsZWRfcmF0aW8gPSAoKGRvdWJsZSlyZW1haW5kZXIgKiAoZG91YmxlKXNjYWxlKSAvIChkb3VibGUpZGVub207Ci0gICAgZnJhY3Rpb25hbF9wYXJ0ID0gKHVuc2lnbmVkIGludCkoc2NhbGVkX3JhdGlvICsgMC41KTsKLSAgICBpZiAoZnJhY3Rpb25hbF9wYXJ0ID49IHNjYWxlKQotICAgIHsKLSAgICAgICAgZnJhY3Rpb25hbF9wYXJ0ID0gMDsKLSAgICAgICAgKytpbnRlZ2VyX3BhcnQ7Ci0gICAgfQotCi0gICAgLyogKDQpOiAwLjk5NSA8PSBudW0vZGVub20gPCBJTkZJTklUWSAqLwotICAgIGlmIChmb3JjZV9wZXJjZW50KQotICAgIHsKLSAgICAgICAgdXNyX3ByaW50ZigiJSIgT1NZU19GU0laRV9QUkl1ICIlMDJ1JSUiLAotICAgICAgICAgICAgICAgICAgIGludGVnZXJfcGFydCwgZnJhY3Rpb25hbF9wYXJ0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qICg1KTogMC45OTUgPD0gbnVtL2Rlbm9tIDwgOTkuOTk1ICovCi0gICAgaWYgKGludGVnZXJfcGFydCA8IDEwMCkKLSAgICB7Ci0gICAgICAgIHVzcl9wcmludGYoIiUiIE9TWVNfRlNJWkVfUFJJdSAiLiUwMnV4IiwKLSAgICAgICAgICAgICAgICAgICBpbnRlZ2VyX3BhcnQsIGZyYWN0aW9uYWxfcGFydCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiAoNik6IDk5LjUgPD0gbnVtL2Rlbm9tIDwgSU5GSU5JVFkgKi8KLSAgICAvKiBSb3VuZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAqLwotICAgIC8qIFJlY2FsY3VsYXRlIHRoZSBpbnRlZ2VyIHBhcnQsIGZvciBjb3JuZXIgY2FzZXMgbGlrZSAxMjMuOTk5LiAqLwotICAgIGludGVnZXJfcGFydCA9IG51bSAvIGRlbm9tOwotICAgIGlmIChyZW1haW5kZXIgPiAoZGVub20gLSAxKSAvIDIpCi0gICAgICAgICsraW50ZWdlcl9wYXJ0OwotICAgIHVzcl9wcmludGYoIiUiIE9TWVNfRlNJWkVfUFJJdSAieCIsIGludGVnZXJfcGFydCk7Ci19Ci0KLS8qCi0gKiBTaXplIGNoYW5nZSBkaXNwbGF5Ci0gKi8KLXN0YXRpYyB2b2lkCi1vcG5nX3ByaW50X2ZzaXplX2RpZmZlcmVuY2Uob3N5c19mc2l6ZV90IGluaXRfc2l6ZSwgb3N5c19mc2l6ZV90IGZpbmFsX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNob3dfcmF0aW8pCi17Ci0gICAgb3N5c19mc2l6ZV90IGRpZmZlcmVuY2U7Ci0gICAgaW50IHNpZ247Ci0KLSAgICBpZiAoaW5pdF9zaXplIDw9IGZpbmFsX3NpemUpCi0gICAgewotICAgICAgICBzaWduID0gMDsKLSAgICAgICAgZGlmZmVyZW5jZSA9IGZpbmFsX3NpemUgLSBpbml0X3NpemU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNpZ24gPSAxOwotICAgICAgICBkaWZmZXJlbmNlID0gaW5pdF9zaXplIC0gZmluYWxfc2l6ZTsKLSAgICB9Ci0KLSAgICBpZiAoZGlmZmVyZW5jZSA9PSAwKQotICAgIHsKLSAgICAgICAgdXNyX3ByaW50Zigibm8gY2hhbmdlIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGRpZmZlcmVuY2UgPT0gMSkKLSAgICAgICAgdXNyX3ByaW50ZigiMSBieXRlIik7Ci0gICAgZWxzZQotICAgICAgICB1c3JfcHJpbnRmKCIlIiBPU1lTX0ZTSVpFX1BSSXUgIiBieXRlcyIsIGRpZmZlcmVuY2UpOwotICAgIGlmIChzaG93X3JhdGlvICYmIGluaXRfc2l6ZSA+IDApCi0gICAgewotICAgICAgICB1c3JfcHJpbnRmKCIgPSAiKTsKLSAgICAgICAgb3BuZ19wcmludF9mc2l6ZV9yYXRpbyhkaWZmZXJlbmNlLCBpbml0X3NpemUsIDApOwotICAgIH0KLSAgICB1c3JfcHJpbnRmKHNpZ24gPT0gMCA/ICIgaW5jcmVhc2UiIDogIiBkZWNyZWFzZSIpOwotfQotCi0vKgotICogSW1hZ2UgaW5mbyBkaXNwbGF5Ci0gKi8KLXN0YXRpYyB2b2lkCi1vcG5nX3ByaW50X2ltYWdlX2luZm8oaW50IHNob3dfZGltLCBpbnQgc2hvd19kZXB0aCwgaW50IHNob3dfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hvd19pbnRlcmxhY2VkKQotewotICAgIHN0YXRpYyBjb25zdCBpbnQgdHlwZV9jaGFubmVsc1s4XSA9IHsxLCAwLCAzLCAxLCAyLCAwLCA0LCAwfTsKLSAgICBpbnQgY2hhbm5lbHMsIHByaW50ZWQ7Ci0KLSAgICBwcmludGVkID0gMDsKLSAgICBpZiAoc2hvd19kaW0pCi0gICAgewotICAgICAgICBwcmludGVkID0gMTsKLSAgICAgICAgdXNyX3ByaW50ZigiJWx1eCVsdSBwaXhlbHMiLAotICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWltYWdlLndpZHRoLCAodW5zaWduZWQgbG9uZylpbWFnZS5oZWlnaHQpOwotICAgIH0KLSAgICBpZiAoc2hvd19kZXB0aCkKLSAgICB7Ci0gICAgICAgIGlmIChwcmludGVkKQotICAgICAgICAgICAgdXNyX3ByaW50ZigiLCAiKTsKLSAgICAgICAgcHJpbnRlZCA9IDE7Ci0gICAgICAgIGNoYW5uZWxzID0gdHlwZV9jaGFubmVsc1tpbWFnZS5jb2xvcl90eXBlICYgN107Ci0gICAgICAgIGlmIChjaGFubmVscyAhPSAxKQotICAgICAgICAgICAgdXNyX3ByaW50ZigiJWR4JWQgYml0cy9waXhlbCIsIGNoYW5uZWxzLCBpbWFnZS5iaXRfZGVwdGgpOwotICAgICAgICBlbHNlIGlmIChpbWFnZS5iaXRfZGVwdGggIT0gMSkKLSAgICAgICAgICAgIHVzcl9wcmludGYoIiVkIGJpdHMvcGl4ZWwiLCBpbWFnZS5iaXRfZGVwdGgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1c3JfcHJpbnRmKCIxIGJpdC9waXhlbCIpOwotICAgIH0KLSAgICBpZiAoc2hvd190eXBlKQotICAgIHsKLSAgICAgICAgaWYgKHByaW50ZWQpCi0gICAgICAgICAgICB1c3JfcHJpbnRmKCIsICIpOwotICAgICAgICBwcmludGVkID0gMTsKLSAgICAgICAgaWYgKGltYWdlLmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19QQUxFVFRFKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaW1hZ2UubnVtX3BhbGV0dGUgPT0gMSkKLSAgICAgICAgICAgICAgICB1c3JfcHJpbnRmKCIxIGNvbG9yIik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNyX3ByaW50ZigiJWQgY29sb3JzIiwgaW1hZ2UubnVtX3BhbGV0dGUpOwotICAgICAgICAgICAgaWYgKGltYWdlLm51bV90cmFucyA+IDApCi0gICAgICAgICAgICAgICAgdXNyX3ByaW50ZigiICglZCB0cmFuc3BhcmVudCkiLCBpbWFnZS5udW1fdHJhbnMpOwotICAgICAgICAgICAgdXNyX3ByaW50ZigiIGluIHBhbGV0dGUiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzcl9wcmludGYoKGltYWdlLmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgPwotICAgICAgICAgICAgICAgICAgICAgICAiUkdCIiA6ICJncmF5c2NhbGUiKTsKLSAgICAgICAgICAgIGlmIChpbWFnZS5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpCi0gICAgICAgICAgICAgICAgdXNyX3ByaW50ZigiK2FscGhhIik7Ci0gICAgICAgICAgICBlbHNlIGlmIChpbWFnZS50cmFuc19jb2xvcl9wdHIgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICB1c3JfcHJpbnRmKCIrdHJhbnNwYXJlbmN5Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHNob3dfaW50ZXJsYWNlZCkKLSAgICB7Ci0gICAgICAgIGlmIChpbWFnZS5pbnRlcmxhY2VfdHlwZSAhPSBQTkdfSU5URVJMQUNFX05PTkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwcmludGVkKQotICAgICAgICAgICAgICAgIHVzcl9wcmludGYoIiwgIik7Ci0gICAgICAgICAgICB1c3JfcHJpbnRmKCJpbnRlcmxhY2VkIik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qCi0gKiBXYXJuaW5nIGRpc3BsYXkKLSAqLwotc3RhdGljIHZvaWQKLW9wbmdfcHJpbnRfd2FybmluZyhjb25zdCBjaGFyICptc2cpCi17Ci0gICAgdXNyX3ByaW50X2NudHJsKCdcdicpOyAgLyogVlQ6IG5ldyBwYXJhZ3JhcGggKi8KLSAgICB1c3JfcHJpbnRmKCJXYXJuaW5nOiAlc1xuIiwgbXNnKTsKLX0KLQotLyoKLSAqIEVycm9yIGRpc3BsYXkKLSAqLwotc3RhdGljIHZvaWQKLW9wbmdfcHJpbnRfZXJyb3IoY29uc3QgY2hhciAqbXNnKQotewotICAgIHVzcl9wcmludF9jbnRybCgnXHYnKTsgIC8qIFZUOiBuZXcgcGFyYWdyYXBoICovCi0gICAgdXNyX3ByaW50ZigiRXJyb3I6ICVzXG4iLCBtc2cpOwotfQotCi0vKgotICogV2FybmluZyBoYW5kbGVyCi0gKi8KLXN0YXRpYyB2b2lkCi1vcG5nX3dhcm5pbmcocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1zZykKLXsKLSAgICAvKiBFcnJvciBpbiBpbnB1dCBvciBvdXRwdXQgZmlsZTsgcHJvY2Vzc2luZyBtYXkgY29udGludWUuICovCi0gICAgLyogUmVjb3ZlcnkgcmVxdWlyZXMgKHJlKWNvbXByZXNzaW9uIG9mIElEQVQuICovCi0gICAgaWYgKHBuZ19wdHIgPT0gcmVhZF9wdHIpCi0gICAgICAgIHByb2Nlc3Muc3RhdHVzIHw9IChJTlBVVF9IQVNfRVJST1JTIHwgT1VUUFVUX05FRURTX05FV19JREFUKTsKLSAgICBvcG5nX3ByaW50X3dhcm5pbmcobXNnKTsKLX0KLQotLyoKLSAqIEVycm9yIGhhbmRsZXIKLSAqLwotc3RhdGljIHZvaWQKLW9wbmdfZXJyb3IocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1zZykKLXsKLSAgICAvKiBFcnJvciBpbiBpbnB1dCBvciBvdXRwdXQgZmlsZTsgcHJvY2Vzc2luZyBtdXN0IHN0b3AuICovCi0gICAgLyogUmVjb3ZlcnkgcmVxdWlyZXMgKHJlKWNvbXByZXNzaW9uIG9mIElEQVQuICovCi0gICAgaWYgKHBuZ19wdHIgPT0gcmVhZF9wdHIpCi0gICAgICAgIHByb2Nlc3Muc3RhdHVzIHw9IChJTlBVVF9IQVNfRVJST1JTIHwgT1VUUFVUX05FRURTX05FV19JREFUKTsKLSAgICBUaHJvdyBtc2c7Ci19Ci0KLS8qCi0gKiBNZW1vcnkgZGVhbGxvY2F0b3IKLSAqLwotc3RhdGljIHZvaWQKLW9wbmdfZnJlZSh2b2lkICpwdHIpCi17Ci0gICAgLyogVGhpcyBkZWFsbG9jYXRvciBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCBsaWJwbmcncyBtZW1vcnkgYWxsb2NhdGlvbgotICAgICAqIHJvdXRpbmVzLCBwbmdfbWFsbG9jKCkgYW5kIHBuZ19mcmVlKCkuCi0gICAgICogSWYgdGhvc2Ugcm91dGluZXMgY2hhbmdlLCB0aGlzIG9uZSBtdXN0IGJlIGNoYW5nZWQgYWNjb3JkaW5nbHkuCi0gICAgICovCi0gICAgZnJlZShwdHIpOwotfQotCi0vKgotICogSURBVCBzaXplIGNoZWNrZXIKLSAqLwotc3RhdGljIHZvaWQKLW9wbmdfY2hlY2tfaWRhdF9zaXplKG9zeXNfZnNpemVfdCBzaXplKQotewotICAgIGlmIChzaXplID4gaWRhdF9zaXplX21heCkKLSAgICAgICAgVGhyb3cgIklEQVQgc2l6ZXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gY2h1bmsgc2l6ZSAiCi0gICAgICAgICAgICAgICJhcmUgY3VycmVudGx5IHVuc3VwcG9ydGVkIjsKLX0KLQotLyoKLSAqIENodW5rIGhhbmRsZXIKLSAqLwotc3RhdGljIHZvaWQKLW9wbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVuayhwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZWVwLCBwbmdfYnl0ZXAgY2h1bmtfdHlwZSkKLXsKLSAgICBwbmdfYnl0ZSBjaHVua19uYW1lWzVdOwotCi0gICAgLyogQ2FsbCBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSBvbmNlIHBlciBlYWNoIGNodW5rIHR5cGUgb25seS4gKi8KLSAgICBtZW1jcHkoY2h1bmtfbmFtZSwgY2h1bmtfdHlwZSwgNCk7Ci0gICAgY2h1bmtfbmFtZVs0XSA9IDA7Ci0gICAgaWYgKCFwbmdfaGFuZGxlX2FzX3Vua25vd24ocG5nX3B0ciwgY2h1bmtfbmFtZSkpCi0gICAgICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBrZWVwLCBjaHVua19uYW1lLCAxKTsKLX0KLQotLyoKLSAqIENodW5rIGNhdGVnb3JpemF0aW9uCi0gKi8KLXN0YXRpYyBpbnQKLW9wbmdfaXNfaW1hZ2VfY2h1bmsocG5nX2J5dGVwIGNodW5rX3R5cGUpCi17Ci0gICAgaWYgKChjaHVua190eXBlWzBdICYgMHgyMCkgPT0gMCkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgLyogQWx0aG91Z2ggdFJOUyBpcyBsaXN0ZWQgYXMgYW5jaWxsYXJ5IGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgaXQgc3RvcmVzCi0gICAgICogYWxwaGEgc2FtcGxlcywgd2hpY2ggaXMgY3JpdGljYWwgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCB0Uk5TIGNhbm5vdAotICAgICAqIGJlIGdlbmVyYWxseSBpZ25vcmVkIHdoZW4gcmVuZGVyaW5nIGFuaW1hdGlvbnMuCi0gICAgICogT3BlcmF0aW9ucyBjbGFpbWVkIHRvIGJlIGxvc3NsZXNzIG11c3QgdHJlYXQgdFJOUyBhcyBhIGNyaXRpY2FsIGNodW5rLgotICAgICAqLwotICAgIGlmIChtZW1jbXAoY2h1bmtfdHlwZSwgc2lnX3RSTlMsIDQpID09IDApCi0gICAgICAgIHJldHVybiAxOwotICAgIHJldHVybiAwOwotfQotCi0vKgotICogQ2h1bmsgY2F0ZWdvcml6YXRpb24KLSAqLwotc3RhdGljIGludAotb3BuZ19pc19hcG5nX2NodW5rKHBuZ19ieXRlcCBjaHVua190eXBlKQotewotICAgIGlmIChtZW1jbXAoY2h1bmtfdHlwZSwgc2lnX2FjVEwsIDQpID09IDAgfHwKLSAgICAgICAgbWVtY21wKGNodW5rX3R5cGUsIHNpZ19mY1RMLCA0KSA9PSAwIHx8Ci0gICAgICAgIG1lbWNtcChjaHVua190eXBlLCBzaWdfZmRBVCwgNCkgPT0gMCkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDaHVuayBmaWx0ZXIKLSAqLwotc3RhdGljIGludAotb3BuZ19hbGxvd19jaHVuayhwbmdfYnl0ZXAgY2h1bmtfdHlwZSkKLXsKLSAgICAvKiBBbHdheXMgYWxsb3cgY3JpdGljYWwgY2h1bmtzIGFuZCB0Uk5TLiAqLwotICAgIGlmIChvcG5nX2lzX2ltYWdlX2NodW5rKGNodW5rX3R5cGUpKQotICAgICAgICByZXR1cm4gMTsKLSAgICAvKiBCbG9jayBhbGwgdGhlIG90aGVyIGNodW5rcyBpZiByZXF1ZXN0ZWQuICovCi0gICAgaWYgKG9wdGlvbnMuc3RyaXBfYWxsKQotICAgICAgICByZXR1cm4gMDsKLSAgICAvKiBBbHdheXMgYmxvY2sgdGhlIGRpZ2l0YWwgc2lnbmF0dXJlIGNodW5rcy4gKi8KLSAgICBpZiAobWVtY21wKGNodW5rX3R5cGUsIHNpZ19kU0lHLCA0KSA9PSAwKQotICAgICAgICByZXR1cm4gMDsKLSAgICAvKiBCbG9jayB0aGUgQVBORyBjaHVua3Mgd2hlbiBzbmlwcGluZy4gKi8KLSAgICBpZiAob3B0aW9ucy5zbmlwICYmIG9wbmdfaXNfYXBuZ19jaHVuayhjaHVua190eXBlKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgLyogQWxsb3cgYWxsIHRoZSBvdGhlciBjaHVua3MuICovCi0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBDaHVuayBoYW5kbGVyCi0gKi8KLXN0YXRpYyB2b2lkCi1vcG5nX2hhbmRsZV9jaHVuayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgY2h1bmtfdHlwZSkKLXsKLSAgICBpbnQga2VlcDsKLQotICAgIGlmIChvcG5nX2lzX2ltYWdlX2NodW5rKGNodW5rX3R5cGUpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAob3B0aW9ucy5zdHJpcF9hbGwpCi0gICAgewotICAgICAgICBwcm9jZXNzLnN0YXR1cyB8PSBJTlBVVF9IQVNfU1RSSVBQRURfREFUQSB8IElOUFVUX0hBU19KVU5LOwotICAgICAgICBvcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmsocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfTkVWRVIsIGNodW5rX3R5cGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogTGV0IGxpYnBuZyBoYW5kbGUgYktHRCwgaElTVCBhbmQgc0JJVC4gKi8KLSAgICBpZiAobWVtY21wKGNodW5rX3R5cGUsIHNpZ19iS0dELCA0KSA9PSAwIHx8Ci0gICAgICAgIG1lbWNtcChjaHVua190eXBlLCBzaWdfaElTVCwgNCkgPT0gMCB8fAotICAgICAgICBtZW1jbXAoY2h1bmtfdHlwZSwgc2lnX3NCSVQsIDQpID09IDApCi0gICAgICAgIHJldHVybjsKLQotICAgIC8qIEV2ZXJ5dGhpbmcgZWxzZSBpcyBoYW5kbGVkIGFzIHVua25vd24gYnkgbGlicG5nLiAqLwotICAgIGtlZXAgPSBQTkdfSEFORExFX0NIVU5LX0FMV0FZUzsKLSAgICBpZiAobWVtY21wKGNodW5rX3R5cGUsIHNpZ19kU0lHLCA0KSA9PSAwKSAgLyogZGlnaXRhbCBzaWduYXR1cmU/ICovCi0gICAgICAgIHByb2Nlc3Muc3RhdHVzIHw9IElOUFVUX0hBU19ESUdJVEFMX1NJR05BVFVSRTsKLSAgICBlbHNlIGlmIChvcG5nX2lzX2FwbmdfY2h1bmsoY2h1bmtfdHlwZSkpICAvKiBBUE5HPyAqLwotICAgIHsKLSAgICAgICAgcHJvY2Vzcy5zdGF0dXMgfD0gSU5QVVRfSEFTX0FQTkc7Ci0gICAgICAgIGlmIChtZW1jbXAoY2h1bmtfdHlwZSwgc2lnX2ZkQVQsIDQpID09IDApCi0gICAgICAgICAgICBwcm9jZXNzLnN0YXR1cyB8PSBJTlBVVF9IQVNfTVVMVElQTEVfSU1BR0VTOwotICAgICAgICBpZiAob3B0aW9ucy5zbmlwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9jZXNzLnN0YXR1cyB8PSBJTlBVVF9IQVNfSlVOSzsKLSAgICAgICAgICAgIGtlZXAgPSBQTkdfSEFORExFX0NIVU5LX05FVkVSOwotICAgICAgICB9Ci0gICAgfQotICAgIG9wbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVuayhwbmdfcHRyLCBrZWVwLCBjaHVua190eXBlKTsKLX0KLQotLyoKLSAqIEluaXRpYWxpemF0aW9uIGZvciBpbnB1dCBoYW5kbGVyCi0gKi8KLXN0YXRpYyB2b2lkCi1vcG5nX2luaXRfcmVhZF9kYXRhKHZvaWQpCi17Ci0gICAgLyogVGhlIHJlbGV2YW50IHByb2Nlc3MgZGF0YSBtZW1iZXJzIGFyZSBzZXQgdG8gemVybywKLSAgICAgKiBhbmQgbm90aGluZyBlbHNlIG5lZWRzIHRvIGJlIGRvbmUgYXQgdGhpcyBtb21lbnQuCi0gICAgICovCi19Ci0KLS8qCi0gKiBJbml0aWFsaXphdGlvbiBmb3Igb3V0cHV0IGhhbmRsZXIKLSAqLwotc3RhdGljIHZvaWQKLW9wbmdfaW5pdF93cml0ZV9kYXRhKHZvaWQpCi17Ci0gICAgcHJvY2Vzcy5vdXRfZmlsZV9zaXplID0gMDsKLSAgICBwcm9jZXNzLm91dF9wbHRlX3RybnNfc2l6ZSA9IDA7Ci0gICAgcHJvY2Vzcy5vdXRfaWRhdF9zaXplID0gMDsKLX0KLQotLyoKLSAqIElucHV0IGhhbmRsZXIKLSAqLwotc3RhdGljIHZvaWQKLW9wbmdfcmVhZF9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBzaXplX3QgbGVuZ3RoKQotewotICAgIEZJTEUgKnN0cmVhbSA9IChGSUxFICopcG5nX2dldF9pb19wdHIocG5nX3B0cik7Ci0gICAgaW50IGlvX3N0YXRlID0gcG5neF9nZXRfaW9fc3RhdGUocG5nX3B0cik7Ci0gICAgaW50IGlvX3N0YXRlX2xvYyA9IGlvX3N0YXRlICYgUE5HWF9JT19NQVNLX0xPQzsKLSAgICBwbmdfYnl0ZXAgY2h1bmtfc2lnOwotCi0gICAgLyogUmVhZCB0aGUgZGF0YS4gKi8KLSAgICBpZiAoZnJlYWQoZGF0YSwgMSwgbGVuZ3RoLCBzdHJlYW0pICE9IGxlbmd0aCkKLSAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsCi0gICAgICAgICAgICAiQ2FuJ3QgcmVhZCB0aGUgaW5wdXQgZmlsZSBvciB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0KLSAgICBpZiAocHJvY2Vzcy5pbl9maWxlX3NpemUgPT0gMCkgIC8qIGZpcnN0IHBpZWNlIG9mIFBORyBkYXRhICovCi0gICAgewotICAgICAgICBPUE5HX0VOU1VSRShsZW5ndGggPT0gOCwgIlBORyBJL08gbXVzdCBzdGFydCB3aXRoIHRoZSBmaXJzdCA4IGJ5dGVzIik7Ci0gICAgICAgIHByb2Nlc3MuaW5fZGF0YXN0cmVhbV9vZmZzZXQgPSBvc3lzX2Z0ZWxsbyhzdHJlYW0pIC0gODsKLSAgICAgICAgcHJvY2Vzcy5zdGF0dXMgfD0gSU5QVVRfSEFTX1BOR19EQVRBU1RSRUFNOwotICAgICAgICBpZiAoaW9fc3RhdGVfbG9jID09IFBOR1hfSU9fU0lHTkFUVVJFKQotICAgICAgICAgICAgcHJvY2Vzcy5zdGF0dXMgfD0gSU5QVVRfSEFTX1BOR19TSUdOQVRVUkU7Ci0gICAgICAgIGlmIChwcm9jZXNzLmluX2RhdGFzdHJlYW1fb2Zmc2V0ID09IDApCi0gICAgICAgICAgICBwcm9jZXNzLnN0YXR1cyB8PSBJTlBVVF9JU19QTkdfRklMRTsKLSAgICAgICAgZWxzZSBpZiAocHJvY2Vzcy5pbl9kYXRhc3RyZWFtX29mZnNldCA8IDApCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAiQ2FuJ3QgZ2V0IHRoZSBmaWxlLXBvc2l0aW9uIGluZGljYXRvciBpbiBpbnB1dCBmaWxlIik7Ci0gICAgICAgIHByb2Nlc3MuaW5fZmlsZV9zaXplID0gKG9zeXNfZnNpemVfdClwcm9jZXNzLmluX2RhdGFzdHJlYW1fb2Zmc2V0OwotICAgIH0KLSAgICBwcm9jZXNzLmluX2ZpbGVfc2l6ZSArPSBsZW5ndGg7Ci0KLSAgICAvKiBIYW5kbGUgdGhlIE9wdGlQTkctc3BlY2lmaWMgZXZlbnRzLiAqLwotICAgIE9QTkdfRU5TVVJFKChpb19zdGF0ZSAmIFBOR1hfSU9fUkVBRElORykgJiYgKGlvX3N0YXRlX2xvYyAhPSAwKSwKLSAgICAgICAgICAgICAgICAiSW5jb3JyZWN0IGluZm8gaW4gcG5nX3B0ci0+aW9fc3RhdGUiKTsKLSAgICBpZiAoaW9fc3RhdGVfbG9jID09IFBOR1hfSU9fQ0hVTktfSERSKQotICAgIHsKLSAgICAgICAgLyogSW4gbGlicG5nIDEuNC54IGFuZCBsYXRlciwgdGhlIGNodW5rIGxlbmd0aCBhbmQgdGhlIGNodW5rIG5hbWUKLSAgICAgICAgICogYXJlIHNlcmlhbGl6ZWQgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLiBUaGlzIGlzIGFsc28gZW5zdXJlZCBieQotICAgICAgICAgKiB0aGUgb3BuZ2lvIGFkZC1vbiBmb3IgbGlicG5nIDEuMi54IGFuZCBlYXJsaWVyLgotICAgICAgICAgKi8KLSAgICAgICAgT1BOR19FTlNVUkUobGVuZ3RoID09IDgsICJSZWFkaW5nIGNodW5rIGhlYWRlciwgZXhwZWN0aW5nIDggYnl0ZXMiKTsKLSAgICAgICAgY2h1bmtfc2lnID0gZGF0YSArIDQ7Ci0KLSAgICAgICAgaWYgKG1lbWNtcChjaHVua19zaWcsIHNpZ19JREFULCA0KSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBPUE5HX0VOU1VSRShwbmdfcHRyID09IHJlYWRfcHRyLCAiSW5jb3JyZWN0IEkvTyBoYW5kbGVyIHNldHVwIik7Ci0gICAgICAgICAgICBpZiAocG5nX2dldF9yb3dzKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyKSA9PSBOVUxMKSAgLyogMXN0IElEQVQgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPUE5HX0VOU1VSRShwcm9jZXNzLmluX2lkYXRfc2l6ZSA9PSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb3VuZCBJREFUIHdpdGggbm8gcm93cyIpOwotICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIHRoZSByb3dzIGhlcmUsIGJ5cGFzc2luZyBsaWJwbmcuCi0gICAgICAgICAgICAgICAgICogVGhpcyBhbGxvd3MgdG8gaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgYW5kIHBlcmZvcm0gcmVjb3ZlcnkKLSAgICAgICAgICAgICAgICAgKiBpbiBjYXNlIG9mIGEgcHJlbWF0dXJlIEVPRi4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAocG5nX2dldF9pbWFnZV9oZWlnaHQocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsgIC8qIHByZW1hdHVyZSBJREFUOyBhbiBlcnJvciB3aWxsIG9jY3VyIGxhdGVyICovCi0gICAgICAgICAgICAgICAgT1BOR19FTlNVUkUocG5neF9tYWxsb2Nfcm93cyhyZWFkX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfaW5mb19wdHIsIDApICE9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCBhbGxvY2F0aW9uIG9mIGltYWdlIHJvd3M7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zYWZlIGxpYnBuZyBhbGxvY2F0b3IiKTsKLSAgICAgICAgICAgICAgICBwbmdfZGF0YV9mcmVlcihyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfVVNFUl9XSUxMX0ZSRUVfREFUQSwgUE5HX0ZSRUVfUk9XUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVGhlcmUgaXMgc3BsaXQgSURBVCBvdmVyaGVhZC4gSm9pbiBJREFUcy4gKi8KLSAgICAgICAgICAgICAgICBwcm9jZXNzLnN0YXR1cyB8PSBJTlBVVF9IQVNfSlVOSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2Nlc3MuaW5faWRhdF9zaXplICs9IHBuZ19nZXRfdWludF8zMihkYXRhKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZW1jbXAoY2h1bmtfc2lnLCBzaWdfUExURSwgNCkgPT0gMCB8fAotICAgICAgICAgICAgICAgICBtZW1jbXAoY2h1bmtfc2lnLCBzaWdfdFJOUywgNCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQWRkIHRoZSBjaHVuayBvdmVyaGVhZCAoaGVhZGVyICsgQ1JDKSB0byB0aGUgZGF0YSBzaXplLiAqLwotICAgICAgICAgICAgcHJvY2Vzcy5pbl9wbHRlX3RybnNfc2l6ZSArPSBwbmdfZ2V0X3VpbnRfMzIoZGF0YSkgKyAxMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBvcG5nX2hhbmRsZV9jaHVuayhwbmdfcHRyLCBjaHVua19zaWcpOwotICAgIH0KLSAgICBlbHNlIGlmIChpb19zdGF0ZV9sb2MgPT0gUE5HWF9JT19DSFVOS19DUkMpCi0gICAgewotICAgICAgICBPUE5HX0VOU1VSRShsZW5ndGggPT0gNCwgIlJlYWRpbmcgY2h1bmsgQ1JDLCBleHBlY3RpbmcgNCBieXRlcyIpOwotICAgIH0KLX0KLQotLyoKLSAqIE91dHB1dCBoYW5kbGVyCi0gKi8KLXN0YXRpYyB2b2lkCi1vcG5nX3dyaXRlX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHNpemVfdCBsZW5ndGgpCi17Ci0gICAgc3RhdGljIGludCBhbGxvd19jcnRfY2h1bms7Ci0gICAgc3RhdGljIGludCBjcnRfY2h1bmtfaXNfaWRhdDsKLSAgICBzdGF0aWMgb3N5c19mb2Zmc2V0X3QgY3J0X2lkYXRfb2Zmc2V0OwotICAgIHN0YXRpYyBvc3lzX2ZzaXplX3QgY3J0X2lkYXRfc2l6ZTsgCi0gICAgc3RhdGljIHBuZ191aW50XzMyIGNydF9pZGF0X2NyYzsKLSAgICBGSUxFICpzdHJlYW0gPSAoRklMRSAqKXBuZ19nZXRfaW9fcHRyKHBuZ19wdHIpOwotICAgIGludCBpb19zdGF0ZSA9IHBuZ3hfZ2V0X2lvX3N0YXRlKHBuZ19wdHIpOwotICAgIGludCBpb19zdGF0ZV9sb2MgPSBpb19zdGF0ZSAmIFBOR1hfSU9fTUFTS19MT0M7Ci0gICAgcG5nX2J5dGVwIGNodW5rX3NpZzsKLSAgICBwbmdfYnl0ZSBidWZbNF07Ci0KLSAgICBPUE5HX0VOU1VSRSgoaW9fc3RhdGUgJiBQTkdYX0lPX1dSSVRJTkcpICYmIChpb19zdGF0ZV9sb2MgIT0gMCksCi0gICAgICAgICAgICAgICAgIkluY29ycmVjdCBpbmZvIGluIHBuZ19wdHItPmlvX3N0YXRlIik7Ci0KLSAgICAvKiBIYW5kbGUgdGhlIE9wdGlQTkctc3BlY2lmaWMgZXZlbnRzLiAqLwotICAgIGlmIChpb19zdGF0ZV9sb2MgPT0gUE5HWF9JT19DSFVOS19IRFIpCi0gICAgewotICAgICAgICBPUE5HX0VOU1VSRShsZW5ndGggPT0gOCwgIldyaXRpbmcgY2h1bmsgaGVhZGVyLCBleHBlY3RpbmcgOCBieXRlcyIpOwotICAgICAgICBjaHVua19zaWcgPSBkYXRhICsgNDsKLSAgICAgICAgYWxsb3dfY3J0X2NodW5rID0gb3BuZ19hbGxvd19jaHVuayhjaHVua19zaWcpOwotICAgICAgICBpZiAobWVtY21wKGNodW5rX3NpZywgc2lnX0lEQVQsIDQpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNydF9jaHVua19pc19pZGF0ID0gMTsKLSAgICAgICAgICAgIHByb2Nlc3Mub3V0X2lkYXRfc2l6ZSArPSBwbmdfZ2V0X3VpbnRfMzIoZGF0YSk7Ci0gICAgICAgICAgICAvKiBBYmFuZG9uIHRoZSB0cmlhbCBpZiBJREFUIGlzIGJpZ2dlciB0aGFuIHRoZSBtYXhpbXVtIGFsbG93ZWQuICovCi0gICAgICAgICAgICBpZiAoc3RyZWFtID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3Mub3V0X2lkYXRfc2l6ZSA+IHByb2Nlc3MubWF4X2lkYXRfc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgVGhyb3cgTlVMTDsgIC8qIGVhcmx5IGludGVycnVwdGlvbiwgbm90IGFuIGVycm9yICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgLyogbm90IElEQVQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgY3J0X2NodW5rX2lzX2lkYXQgPSAwOwotICAgICAgICAgICAgaWYgKG1lbWNtcChjaHVua19zaWcsIHNpZ19QTFRFLCA0KSA9PSAwIHx8Ci0gICAgICAgICAgICAgICAgbWVtY21wKGNodW5rX3NpZywgc2lnX3RSTlMsIDQpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogQWRkIHRoZSBjaHVuayBvdmVyaGVhZCAoaGVhZGVyICsgQ1JDKSB0byB0aGUgZGF0YSBzaXplLiAqLwotICAgICAgICAgICAgICAgIHByb2Nlc3Mub3V0X3BsdGVfdHJuc19zaXplICs9IHBuZ19nZXRfdWludF8zMihkYXRhKSArIDEyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlvX3N0YXRlX2xvYyA9PSBQTkdYX0lPX0NIVU5LX0NSQykKLSAgICB7Ci0gICAgICAgIE9QTkdfRU5TVVJFKGxlbmd0aCA9PSA0LCAiV3JpdGluZyBjaHVuayBDUkMsIGV4cGVjdGluZyA0IGJ5dGVzIik7Ci0gICAgfQotCi0gICAgLyogRXhpdCBlYXJseSBpZiB0aGlzIGlzIG9ubHkgYSB0cmlhbC4gKi8KLSAgICBpZiAoc3RyZWFtID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8qIENvbnRpbnVlIG9ubHkgaWYgdGhlIGN1cnJlbnQgY2h1bmsgdHlwZSBpcyBhbGxvd2VkLiAqLwotICAgIGlmIChpb19zdGF0ZV9sb2MgIT0gUE5HWF9JT19TSUdOQVRVUkUgJiYgIWFsbG93X2NydF9jaHVuaykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLyogSGVyZSBjb21lcyBhbiBlbGFib3JhdGUgd2F5IG9mIHdyaXRpbmcgdGhlIGRhdGEsIGluIHdoaWNoIGFsbCBJREFUcwotICAgICAqIGFyZSBqb2luZWQgaW50byBhIHNpbmdsZSBjaHVuay4KLSAgICAgKiBOb3JtYWxseSwgdGhlIHVzZXItc3VwcGxpZWQgSS9PIHJvdXRpbmVzIGFyZSBub3Qgc28gY29tcGxpY2F0ZWQuCi0gICAgICovCi0gICAgc3dpdGNoIChpb19zdGF0ZV9sb2MpCi0gICAgewotICAgICAgICBjYXNlIFBOR1hfSU9fQ0hVTktfSERSOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3J0X2NodW5rX2lzX2lkYXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNydF9pZGF0X29mZnNldCA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgaGVhZGVyIG9mIHRoZSBmaXJzdCBJREFULiAqLwotICAgICAgICAgICAgICAgICAgICBjcnRfaWRhdF9vZmZzZXQgPSBvc3lzX2Z0ZWxsbyhzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICAvKiBUcnkgZ3Vlc3NpbmcgdGhlIHNpemUgb2YgdGhlIGZpbmFsIChqb2luZWQpIElEQVQuICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmJlc3RfaWRhdF9zaXplID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGd1ZXNzIGlzIGV4cGVjdGVkIHRvIGJlIHJpZ2h0LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY3J0X2lkYXRfc2l6ZSA9IHByb2Nlc3MuYmVzdF9pZGF0X3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZ3Vlc3MgY291bGQgYmUgd3JvbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgZmluYWwgSURBVCB3aWxsIGJlIHJldmlzZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNydF9pZGF0X3NpemUgPSBsZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcG5nX3NhdmVfdWludF8zMihkYXRhLCAocG5nX3VpbnRfMzIpY3J0X2lkYXRfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IGNvbXB1dGluZyB0aGUgQ1JDIG9mIHRoZSBmaW5hbCBJREFULiAqLwotICAgICAgICAgICAgICAgICAgICBjcnRfaWRhdF9jcmMgPSBjcmMzMigwLCBzaWdfSURBVCwgNCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgbm90IHRoZSBmaXJzdCBJREFULiBEbyBub3Qgd3JpdGUgaXRzIGhlYWRlci4gKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY3J0X2lkYXRfb2Zmc2V0ICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBoZWFkZXIgb2YgdGhlIGZpcnN0IGNodW5rIGFmdGVyIElEQVQuCi0gICAgICAgICAgICAgICAgICAgICAqIEZpbmFsaXplIElEQVQgYmVmb3JlIHJlc3VtaW5nIHRoZSBub3JtYWwgb3BlcmF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcG5nX3NhdmVfdWludF8zMihidWYsIGNydF9pZGF0X2NyYyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmd3JpdGUoYnVmLCAxLCA0LCBzdHJlYW0pICE9IDQpCi0gICAgICAgICAgICAgICAgICAgICAgICBpb19zdGF0ZSA9IDA7ICAvKiBlcnJvciAqLwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLm91dF9maWxlX3NpemUgKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3Mub3V0X2lkYXRfc2l6ZSAhPSBjcnRfaWRhdF9zaXplKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgSURBVCBzaXplIGhhcyBub3QgYmVlbiBndWVzc2VkIGNvcnJlY3RseS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIEl0IG11c3QgYmUgdXBkYXRlZCBpbiBhIG5vbi1zdHJlYW1hYmxlIHdheS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgT1BOR19FTlNVUkUocHJvY2Vzcy5iZXN0X2lkYXRfc2l6ZSA9PSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldyb25nIGd1ZXNzIG9mIHRoZSBvdXRwdXQgSURBVCBzaXplIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcG5nX2NoZWNrX2lkYXRfc2l6ZShwcm9jZXNzLm91dF9pZGF0X3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3NhdmVfdWludF8zMihidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwbmdfdWludF8zMilwcm9jZXNzLm91dF9pZGF0X3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9zeXNfZndyaXRlX2F0KHN0cmVhbSwgY3J0X2lkYXRfb2Zmc2V0LCBTRUVLX1NFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIDQpICE9IDQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9fc3RhdGUgPSAwOyAgLyogZXJyb3IgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaW9fc3RhdGUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiQ2FuJ3QgZmluYWxpemUgSURBVCIpOwotICAgICAgICAgICAgICAgICAgICBjcnRfaWRhdF9vZmZzZXQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgUE5HWF9JT19DSFVOS19EQVRBOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3J0X2NodW5rX2lzX2lkYXQpCi0gICAgICAgICAgICAgICAgY3J0X2lkYXRfY3JjID0gY3JjMzIoY3J0X2lkYXRfY3JjLCBkYXRhLCBsZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBQTkdYX0lPX0NIVU5LX0NSQzoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNydF9jaHVua19pc19pZGF0KQotICAgICAgICAgICAgICAgIHJldHVybjsgIC8qIGRlZmVyIHdyaXRpbmcgdW50aWwgdGhlIGZpcnN0IG5vbi1JREFUIG9jY3VycyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBXcml0ZSB0aGUgZGF0YS4gKi8KLSAgICBpZiAoZndyaXRlKGRhdGEsIDEsIGxlbmd0aCwgc3RyZWFtKSAhPSBsZW5ndGgpCi0gICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiQ2FuJ3Qgd3JpdGUgdGhlIG91dHB1dCBmaWxlIik7Ci0gICAgcHJvY2Vzcy5vdXRfZmlsZV9zaXplICs9IGxlbmd0aDsKLX0KLQotLyoKLSAqIEltYWdlIGluZm8gaW5pdGlhbGl6YXRpb24KLSAqLwotc3RhdGljIHZvaWQKLW9wbmdfY2xlYXJfaW1hZ2VfaW5mbyh2b2lkKQotewotICAgIG1lbXNldCgmaW1hZ2UsIDAsIHNpemVvZihpbWFnZSkpOwotfQotCi0vKgotICogSW1hZ2UgaW5mbyB0cmFuc2ZlcgotICovCi1zdGF0aWMgdm9pZAotb3BuZ19sb2FkX2ltYWdlX2luZm8ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgbG9hZF9tZXRhKQotewotICAgIG1lbXNldCgmaW1hZ2UsIDAsIHNpemVvZihpbWFnZSkpOwotCi0gICAgcG5nX2dldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgICAmaW1hZ2Uud2lkdGgsICZpbWFnZS5oZWlnaHQsICZpbWFnZS5iaXRfZGVwdGgsICZpbWFnZS5jb2xvcl90eXBlLAotICAgICAgICAmaW1hZ2UuaW50ZXJsYWNlX3R5cGUsICZpbWFnZS5jb21wcmVzc2lvbl90eXBlLCAmaW1hZ2UuZmlsdGVyX3R5cGUpOwotICAgIGltYWdlLnJvd19wb2ludGVycyA9IHBuZ19nZXRfcm93cyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICAgcG5nX2dldF9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLCAmaW1hZ2UucGFsZXR0ZSwgJmltYWdlLm51bV9wYWxldHRlKTsKLSAgICAvKiBUcmFuc3BhcmVuY3kgaXMgbm90IGNvbnNpZGVyZWQgbWV0YWRhdGEsIGFsdGhvdWdoIHRSTlMgaXMgYW5jaWxsYXJ5LgotICAgICAqIFNlZSB0aGUgY29tbWVudCBpbiBvcG5nX2lzX2ltYWdlX2NodW5rKCkgYWJvdmUuCi0gICAgICovCi0gICAgaWYgKHBuZ19nZXRfdFJOUyhwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAgICAgJmltYWdlLnRyYW5zX2FscGhhLCAmaW1hZ2UubnVtX3RyYW5zLCAmaW1hZ2UudHJhbnNfY29sb3JfcHRyKSkKLSAgICB7Ci0gICAgICAgIC8qIERvdWJsZSBjb3B5aW5nIChwb2ludGVyICsgdmFsdWUpIGlzIG5lY2Vzc2FyeSBoZXJlCi0gICAgICAgICAqIGR1ZSB0byBhbiBpbmNvbnNpc3RlbmN5IGluIHRoZSBsaWJwbmcgZGVzaWduLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGltYWdlLnRyYW5zX2NvbG9yX3B0ciAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbWFnZS50cmFuc19jb2xvciA9ICppbWFnZS50cmFuc19jb2xvcl9wdHI7Ci0gICAgICAgICAgICBpbWFnZS50cmFuc19jb2xvcl9wdHIgPSAmaW1hZ2UudHJhbnNfY29sb3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWxvYWRfbWV0YSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlLmJhY2tncm91bmRfcHRyKSkKLSAgICB7Ci0gICAgICAgIC8qIFNhbWUgcHJvYmxlbSBhcyBpbiB0Uk5TLiAqLwotICAgICAgICBpbWFnZS5iYWNrZ3JvdW5kID0gKmltYWdlLmJhY2tncm91bmRfcHRyOwotICAgICAgICBpbWFnZS5iYWNrZ3JvdW5kX3B0ciA9ICZpbWFnZS5iYWNrZ3JvdW5kOwotICAgIH0KLSAgICBwbmdfZ2V0X2hJU1QocG5nX3B0ciwgaW5mb19wdHIsICZpbWFnZS5oaXN0KTsKLSAgICBpZiAocG5nX2dldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmaW1hZ2Uuc2lnX2JpdF9wdHIpKQotICAgIHsKLSAgICAgICAgLyogU2FtZSBwcm9ibGVtIGFzIGluIHRSTlMuICovCi0gICAgICAgIGltYWdlLnNpZ19iaXQgPSAqaW1hZ2Uuc2lnX2JpdF9wdHI7Ci0gICAgICAgIGltYWdlLnNpZ19iaXRfcHRyID0gJmltYWdlLnNpZ19iaXQ7Ci0gICAgfQotICAgIGltYWdlLm51bV91bmtub3ducyA9Ci0gICAgICAgIHBuZ19nZXRfdW5rbm93bl9jaHVua3MocG5nX3B0ciwgaW5mb19wdHIsICZpbWFnZS51bmtub3ducyk7Ci19Ci0KLS8qCi0gKiBJbWFnZSBpbmZvIHRyYW5zZmVyCi0gKi8KLXN0YXRpYyB2b2lkCi1vcG5nX3N0b3JlX2ltYWdlX2luZm8ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgc3RvcmVfbWV0YSkKLXsKLSAgICBPUE5HX0VOU1VSRShpbWFnZS5yb3dfcG9pbnRlcnMgIT0gTlVMTCwgIk5vIGluZm8gaW4gaW1hZ2UiKTsKLQotICAgIHBuZ19zZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAgICAgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgaW1hZ2UuYml0X2RlcHRoLCBpbWFnZS5jb2xvcl90eXBlLAotICAgICAgICBpbWFnZS5pbnRlcmxhY2VfdHlwZSwgaW1hZ2UuY29tcHJlc3Npb25fdHlwZSwgaW1hZ2UuZmlsdGVyX3R5cGUpOwotICAgIHBuZ19zZXRfcm93cyh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBpbWFnZS5yb3dfcG9pbnRlcnMpOwotICAgIGlmIChpbWFnZS5wYWxldHRlICE9IE5VTEwpCi0gICAgICAgIHBuZ19zZXRfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgaW1hZ2UucGFsZXR0ZSwgaW1hZ2UubnVtX3BhbGV0dGUpOwotICAgIC8qIFRyYW5zcGFyZW5jeSBpcyBub3QgY29uc2lkZXJlZCBtZXRhZGF0YSwgYWx0aG91Z2ggdFJOUyBpcyBhbmNpbGxhcnkuCi0gICAgICogU2VlIHRoZSBjb21tZW50IGluIG9wbmdfaXNfaW1hZ2VfY2h1bmsoKSBhYm92ZS4KLSAgICAgKi8KLSAgICBpZiAoaW1hZ2UudHJhbnNfYWxwaGEgIT0gTlVMTCB8fCBpbWFnZS50cmFuc19jb2xvcl9wdHIgIT0gTlVMTCkKLSAgICAgICAgcG5nX3NldF90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgICAgICAgaW1hZ2UudHJhbnNfYWxwaGEsIGltYWdlLm51bV90cmFucywgaW1hZ2UudHJhbnNfY29sb3JfcHRyKTsKLQotICAgIGlmICghc3RvcmVfbWV0YSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKGltYWdlLmJhY2tncm91bmRfcHRyICE9IE5VTEwpCi0gICAgICAgIHBuZ19zZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgaW1hZ2UuYmFja2dyb3VuZF9wdHIpOwotICAgIGlmIChpbWFnZS5oaXN0ICE9IE5VTEwpCi0gICAgICAgIHBuZ19zZXRfaElTVChwbmdfcHRyLCBpbmZvX3B0ciwgaW1hZ2UuaGlzdCk7Ci0gICAgaWYgKGltYWdlLnNpZ19iaXRfcHRyICE9IE5VTEwpCi0gICAgICAgIHBuZ19zZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgaW1hZ2Uuc2lnX2JpdF9wdHIpOwotICAgIGlmIChpbWFnZS5udW1fdW5rbm93bnMgIT0gMCkKLSAgICB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgICAgICAgaW1hZ2UudW5rbm93bnMsIGltYWdlLm51bV91bmtub3ducyk7Ci0gICAgICAgIC8qIElzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gU2hvdWxkIGl0IG5vdCBiZSBpbXBsZW1lbnRlZCBpbiBsaWJwbmc/ICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbWFnZS5udW1fdW5rbm93bnM7ICsraSkKLSAgICAgICAgICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbihwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAgICAgICAgICAgICBpLCBpbWFnZS51bmtub3duc1tpXS5sb2NhdGlvbik7Ci0gICAgfQotfQotCi0vKgotICogSW1hZ2UgaW5mbyBkZXN0cnVjdGlvbgotICovCi1zdGF0aWMgdm9pZAotb3BuZ19kZXN0cm95X2ltYWdlX2luZm8odm9pZCkKLXsKLSAgICBwbmdfdWludF8zMiBpOwotICAgIGludCBqOwotCi0gICAgaWYgKGltYWdlLnJvd19wb2ludGVycyA9PSBOVUxMKQotICAgICAgICByZXR1cm47ICAvKiBub3RoaW5nIHRvIGNsZWFuIHVwICovCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgaW1hZ2UuaGVpZ2h0OyArK2kpCi0gICAgICAgIG9wbmdfZnJlZShpbWFnZS5yb3dfcG9pbnRlcnNbaV0pOwotICAgIG9wbmdfZnJlZShpbWFnZS5yb3dfcG9pbnRlcnMpOwotICAgIG9wbmdfZnJlZShpbWFnZS5wYWxldHRlKTsKLSAgICBvcG5nX2ZyZWUoaW1hZ2UudHJhbnNfYWxwaGEpOwotICAgIG9wbmdfZnJlZShpbWFnZS5oaXN0KTsKLSAgICBmb3IgKGogPSAwOyBqIDwgaW1hZ2UubnVtX3Vua25vd25zOyArK2opCi0gICAgICAgIG9wbmdfZnJlZShpbWFnZS51bmtub3duc1tqXS5kYXRhKTsKLSAgICBvcG5nX2ZyZWUoaW1hZ2UudW5rbm93bnMpOwotICAgIC8qIERPIE5PVCBkZWFsbG9jYXRlIGJhY2tncm91bmRfcHRyLCBzaWdfYml0X3B0ciwgdHJhbnNfY29sb3JfcHRyLgotICAgICAqIFNlZSB0aGUgY29tbWVudHMgcmVnYXJkaW5nIGRvdWJsZSBjb3B5aW5nIGluc2lkZSBvcG5nX2xvYWRfaW1hZ2VfaW5mbygpLgotICAgICAqLwotCi0gICAgLyogQ2xlYXIgdGhlIHNwYWNlIGhlcmUgYW5kIGRvIG5vdCB3b3JyeSBhYm91dCBkb3VibGUtZGVhbGxvY2F0aW9uIGlzc3VlcwotICAgICAqIHRoYXQgbWlnaHQgYXJpc2UgbGF0ZXIgb24uCi0gICAgICovCi0gICAgbWVtc2V0KCZpbWFnZSwgMCwgc2l6ZW9mKGltYWdlKSk7Ci19Ci0KLS8qCi0gKiBJbWFnZSBmaWxlIHJlYWRpbmcKLSAqLwotc3RhdGljIHZvaWQKLW9wbmdfcmVhZF9maWxlKEZJTEUgKmluZmlsZSkKLXsKLSAgICBjb25zdCBjaGFyICpmbXRfbmFtZTsKLSAgICBpbnQgbnVtX2ltZzsKLSAgICBwbmdfdWludF8zMiByZWR1Y3Rpb25zOwotICAgIGNvbnN0IGNoYXIgKiB2b2xhdGlsZSBlcnJfbXNnOyAgLyogdm9sYXRpbGUgaXMgcmVxdWlyZWQgYnkgY2V4Y2VwdCAqLwotCi0gICAgVHJ5Ci0gICAgewotICAgICAgICByZWFkX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBOVUxMLAotICAgICAgICAgICAgb3BuZ19lcnJvciwgb3BuZ193YXJuaW5nKTsKLSAgICAgICAgcmVhZF9pbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocmVhZF9wdHIpOwotICAgICAgICBpZiAocmVhZF9pbmZvX3B0ciA9PSBOVUxMKQotICAgICAgICAgICAgVGhyb3cgIk91dCBvZiBtZW1vcnkiOwotCi0gICAgICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhyZWFkX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTLCBOVUxMLCAwKTsKLQotICAgICAgICAvKiBSZWFkIHRoZSBpbnB1dCBpbWFnZSBmaWxlLiAqLwotICAgICAgICBvcG5nX2luaXRfcmVhZF9kYXRhKCk7Ci0gICAgICAgIHBuZ3hfc2V0X3JlYWRfZm4ocmVhZF9wdHIsIGluZmlsZSwgb3BuZ19yZWFkX2RhdGEpOwotICAgICAgICBmbXRfbmFtZSA9IE5VTEw7Ci0gICAgICAgIG51bV9pbWcgPSBwbmd4X3JlYWRfaW1hZ2UocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZmbXRfbmFtZSwgTlVMTCk7Ci0gICAgICAgIGlmIChudW1faW1nIDw9IDApCi0gICAgICAgICAgICBUaHJvdyAiVW5yZWNvZ25pemVkIGltYWdlIGZpbGUgZm9ybWF0IjsKLSAgICAgICAgaWYgKG51bV9pbWcgPiAxKQotICAgICAgICAgICAgcHJvY2Vzcy5zdGF0dXMgfD0gSU5QVVRfSEFTX01VTFRJUExFX0lNQUdFUzsKLSAgICAgICAgaWYgKChwcm9jZXNzLnN0YXR1cyAmIElOUFVUX0lTX1BOR19GSUxFKSAmJgotICAgICAgICAgICAgKHByb2Nlc3Muc3RhdHVzICYgSU5QVVRfSEFTX01VTFRJUExFX0lNQUdFUykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHBuZ3h0ZXJuIGNhbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4gQVBORyBhbmQgcHJvcGVyIFBORy4gKi8KLSAgICAgICAgICAgIGZtdF9uYW1lID0gKHByb2Nlc3Muc3RhdHVzICYgSU5QVVRfSEFTX1BOR19TSUdOQVRVUkUpID8KLSAgICAgICAgICAgICAgICAgICAgICAgIkFQTkciIDogIkFQTkcgZGF0YXN0cmVhbSI7Ci0gICAgICAgIH0KLSAgICAgICAgT1BOR19FTlNVUkUoZm10X25hbWUgIT0gTlVMTCwgIk5vIGZvcm1hdCBuYW1lIGZyb20gcG5neHRlcm4iKTsKLQotICAgICAgICBpZiAocHJvY2Vzcy5pbl9maWxlX3NpemUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG9zeXNfZmdldHNpemUoaW5maWxlLCAmcHJvY2Vzcy5pbl9maWxlX3NpemUpIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcG5nX3ByaW50X3dhcm5pbmcoIkNhbid0IGdldCB0aGUgY29ycmVjdCBmaWxlIHNpemUiKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzLmluX2ZpbGVfc2l6ZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBlcnJfbXNnID0gTlVMTDsgIC8qIGV2ZXJ5dGhpbmcgaXMgb2sgKi8KLSAgICB9Ci0gICAgQ2F0Y2ggKGVycl9tc2cpCi0gICAgewotICAgICAgICAvKiBJZiB0aGUgY3JpdGljYWwgaW5mbyBoYXMgYmVlbiBsb2FkZWQsIHRyZWF0IGFsbCBlcnJvcnMgYXMgd2FybmluZ3MuCi0gICAgICAgICAqIFRoaXMgZW5hYmxlcyBhIG1vcmUgYWR2YW5jZWQgZGF0YSByZWNvdmVyeS4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChvcG5nX3ZhbGlkYXRlX2ltYWdlKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyKSkKLSAgICAgICAgewotICAgICAgICAgICBwbmdfd2FybmluZyhyZWFkX3B0ciwgZXJyX21zZyk7Ci0gICAgICAgICAgIGVycl9tc2cgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgVHJ5Ci0gICAgewotICAgICAgICBpZiAoZXJyX21zZyAhPSBOVUxMKQotICAgICAgICAgICAgVGhyb3cgZXJyX21zZzsKLQotICAgICAgICAvKiBEaXNwbGF5IGZvcm1hdCBhbmQgaW1hZ2UgaW5mb3JtYXRpb24uICovCi0gICAgICAgIGlmIChzdHJjbXAoZm10X25hbWUsICJQTkciKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c3JfcHJpbnRmKCJJbXBvcnRpbmcgJXMiLCBmbXRfbmFtZSk7Ci0gICAgICAgICAgICBpZiAocHJvY2Vzcy5zdGF0dXMgJiBJTlBVVF9IQVNfTVVMVElQTEVfSU1BR0VTKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghKHByb2Nlc3Muc3RhdHVzICYgSU5QVVRfSVNfUE5HX0ZJTEUpKQotICAgICAgICAgICAgICAgICAgICB1c3JfcHJpbnRmKCIgKG11bHRpLWltYWdlIG9yIGFuaW1hdGlvbikiKTsKLSAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zbmlwKQotICAgICAgICAgICAgICAgICAgICB1c3JfcHJpbnRmKCI7IHNuaXBwaW5nLi4uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1c3JfcHJpbnRmKCJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIG9wbmdfbG9hZF9pbWFnZV9pbmZvKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAxKTsKLSAgICAgICAgb3BuZ19wcmludF9pbWFnZV9pbmZvKDEsIDEsIDEsIDEpOwotICAgICAgICB1c3JfcHJpbnRmKCJcbiIpOwotCi0gICAgICAgIC8qIENob29zZSB0aGUgYXBwbGljYWJsZSBpbWFnZSByZWR1Y3Rpb25zLiAqLwotICAgICAgICByZWR1Y3Rpb25zID0gT1BOR19SRURVQ0VfQUxMICYgfk9QTkdfUkVEVUNFX01FVEFEQVRBOwotICAgICAgICBpZiAob3B0aW9ucy5uYikKLSAgICAgICAgICAgIHJlZHVjdGlvbnMgJj0gfk9QTkdfUkVEVUNFX0JJVF9ERVBUSDsKLSAgICAgICAgaWYgKG9wdGlvbnMubmMpCi0gICAgICAgICAgICByZWR1Y3Rpb25zICY9IH5PUE5HX1JFRFVDRV9DT0xPUl9UWVBFOwotICAgICAgICBpZiAob3B0aW9ucy5ucCkKLSAgICAgICAgICAgIHJlZHVjdGlvbnMgJj0gfk9QTkdfUkVEVUNFX1BBTEVUVEU7Ci0gICAgICAgIGlmIChvcHRpb25zLm56ICYmIChwcm9jZXNzLnN0YXR1cyAmIElOUFVUX0hBU19QTkdfREFUQVNUUkVBTSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIERvIG5vdCByZWR1Y2UgZmlsZXMgd2l0aCBQTkcgZGF0YXN0cmVhbXMgdW5kZXIgLW56LiAqLwotICAgICAgICAgICAgcmVkdWN0aW9ucyA9IE9QTkdfUkVEVUNFX05PTkU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb2Nlc3Muc3RhdHVzICYgSU5QVVRfSEFTX0RJR0lUQUxfU0lHTkFUVVJFKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBEbyBub3QgcmVkdWNlIHNpZ25lZCBmaWxlcy4gKi8KLSAgICAgICAgICAgIHJlZHVjdGlvbnMgPSBPUE5HX1JFRFVDRV9OT05FOwotICAgICAgICB9Ci0gICAgICAgIGlmICgocHJvY2Vzcy5zdGF0dXMgJiBJTlBVVF9JU19QTkdfRklMRSkgJiYKLSAgICAgICAgICAgIChwcm9jZXNzLnN0YXR1cyAmIElOUFVUX0hBU19NVUxUSVBMRV9JTUFHRVMpICYmCi0gICAgICAgICAgICAocmVkdWN0aW9ucyAhPSBPUE5HX1JFRFVDRV9OT05FKSAmJiAhb3B0aW9ucy5zbmlwKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c3JfcHJpbnRmKAotICAgICAgICAgICAgICAgICJDYW4ndCByZWxpYWJseSByZWR1Y2UgQVBORyBmaWxlOyBkaXNhYmxpbmcgcmVkdWN0aW9ucy5cbiIKLSAgICAgICAgICAgICAgICAiKERpZCB5b3Ugd2FudCB0byAtc25pcCBhbmQgb3B0aW1pemUgdGhlIGZpcnN0IGZyYW1lPylcbiIpOwotICAgICAgICAgICAgcmVkdWN0aW9ucyA9IE9QTkdfUkVEVUNFX05PTkU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBUcnkgdG8gcmVkdWNlIHRoZSBpbWFnZS4gKi8KLSAgICAgICAgcHJvY2Vzcy5yZWR1Y3Rpb25zID0KLSAgICAgICAgICAgIG9wbmdfcmVkdWNlX2ltYWdlKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCByZWR1Y3Rpb25zKTsKLQotICAgICAgICAvKiBJZiB0aGUgaW1hZ2UgaXMgcmVkdWNlZCwgZW5mb3JjZSBmdWxsIGNvbXByZXNzaW9uLiAqLwotICAgICAgICBpZiAocHJvY2Vzcy5yZWR1Y3Rpb25zICE9IE9QTkdfUkVEVUNFX05PTkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9wbmdfbG9hZF9pbWFnZV9pbmZvKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAxKTsKLSAgICAgICAgICAgIHVzcl9wcmludGYoIlJlZHVjaW5nIGltYWdlIHRvICIpOwotICAgICAgICAgICAgb3BuZ19wcmludF9pbWFnZV9pbmZvKDAsIDEsIDEsIDApOwotICAgICAgICAgICAgdXNyX3ByaW50ZigiXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENoYW5nZSB0aGUgaW50ZXJsYWNlIHR5cGUgaWYgcmVxdWlyZWQuICovCi0gICAgICAgIGlmIChvcHRpb25zLmludGVybGFjZSA+PSAwICYmCi0gICAgICAgICAgICBpbWFnZS5pbnRlcmxhY2VfdHlwZSAhPSBvcHRpb25zLmludGVybGFjZSkKLSAgICAgICAgewotICAgICAgICAgICAgaW1hZ2UuaW50ZXJsYWNlX3R5cGUgPSBvcHRpb25zLmludGVybGFjZTsKLSAgICAgICAgICAgIC8qIEEgY2hhbmdlIGluIGludGVybGFjaW5nIHJlcXVpcmVzIElEQVQgcmVjb2RpbmcuICovCi0gICAgICAgICAgICBwcm9jZXNzLnN0YXR1cyB8PSBPVVRQVVRfTkVFRFNfTkVXX0lEQVQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ2F0Y2ggKGVycl9tc2cpCi0gICAgewotICAgICAgICAvKiBEbyB0aGUgY2xlYW51cCwgdGhlbiByZXRocm93IHRoZSBleGNlcHRpb24uICovCi0gICAgICAgIHBuZ19kYXRhX2ZyZWVyKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLAotICAgICAgICAgICAgICAgICAgICAgICBQTkdfREVTVFJPWV9XSUxMX0ZSRUVfREFUQSwgUE5HX0ZSRUVfQUxMKTsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnJlYWRfcHRyLCAmcmVhZF9pbmZvX3B0ciwgTlVMTCk7Ci0gICAgICAgIFRocm93IGVycl9tc2c7Ci0gICAgfQotCi0gICAgLyogRGVzdHJveSB0aGUgbGlicG5nIHN0cnVjdHVyZXMsIGJ1dCBsZWF2ZSB0aGUgZW5jbG9zZWQgZGF0YSBpbnRhY3QKLSAgICAgKiB0byBhbGxvdyBmdXJ0aGVyIHByb2Nlc3NpbmcuCi0gICAgICovCi0gICAgcG5nX2RhdGFfZnJlZXIocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsCi0gICAgICAgICAgICAgICAgICAgUE5HX1VTRVJfV0lMTF9GUkVFX0RBVEEsIFBOR19GUkVFX0FMTCk7Ci0gICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnJlYWRfcHRyLCAmcmVhZF9pbmZvX3B0ciwgTlVMTCk7Ci19Ci0KLS8qCi0gKiBQTkcgZmlsZSB3cml0aW5nCi0gKgotICogSWYgdGhlIG91dHB1dCBmaWxlIGlzIE5VTEwsIFBORyBlbmNvZGluZyBpcyBzdGlsbCBkb25lLAotICogYnV0IG5vIGZpbGUgaXMgd3JpdHRlbi4KLSAqLwotc3RhdGljIHZvaWQKLW9wbmdfd3JpdGVfZmlsZShGSUxFICpvdXRmaWxlLAotICAgICAgICAgICAgICAgIGludCBjb21wcmVzc2lvbl9sZXZlbCwgaW50IG1lbW9yeV9sZXZlbCwKLSAgICAgICAgICAgICAgICBpbnQgY29tcHJlc3Npb25fc3RyYXRlZ3ksIGludCBmaWx0ZXIpCi17Ci0gICAgY29uc3QgY2hhciAqIHZvbGF0aWxlIGVycl9tc2c7ICAvKiB2b2xhdGlsZSBpcyByZXF1aXJlZCBieSBjZXhjZXB0ICovCi0KLSAgICBPUE5HX0VOU1VSRSgKLSAgICAgICAgY29tcHJlc3Npb25fbGV2ZWwgPj0gT1BOR19DT01QUl9MRVZFTF9NSU4gJiYKLSAgICAgICAgY29tcHJlc3Npb25fbGV2ZWwgPD0gT1BOR19DT01QUl9MRVZFTF9NQVggJiYKLSAgICAgICAgbWVtb3J5X2xldmVsID49IE9QTkdfTUVNX0xFVkVMX01JTiAmJgotICAgICAgICBtZW1vcnlfbGV2ZWwgPD0gT1BOR19NRU1fTEVWRUxfTUFYICYmCi0gICAgICAgIGNvbXByZXNzaW9uX3N0cmF0ZWd5ID49IE9QTkdfU1RSQVRFR1lfTUlOICYmCi0gICAgICAgIGNvbXByZXNzaW9uX3N0cmF0ZWd5IDw9IE9QTkdfU1RSQVRFR1lfTUFYICYmCi0gICAgICAgIGZpbHRlciA+PSBPUE5HX0ZJTFRFUl9NSU4gJiYKLSAgICAgICAgZmlsdGVyIDw9IE9QTkdfRklMVEVSX01BWCwKLSAgICAgICAgIkludmFsaWQgZW5jb2RpbmcgcGFyYW1ldGVycyIpOwotCi0gICAgVHJ5Ci0gICAgewotICAgICAgICB3cml0ZV9wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsCi0gICAgICAgICAgICBOVUxMLCBvcG5nX2Vycm9yLCBvcG5nX3dhcm5pbmcpOwotICAgICAgICB3cml0ZV9pbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3Qod3JpdGVfcHRyKTsKLSAgICAgICAgaWYgKHdyaXRlX2luZm9fcHRyID09IE5VTEwpCi0gICAgICAgICAgICBUaHJvdyAiT3V0IG9mIG1lbW9yeSI7Ci0KLSAgICAgICAgcG5nX3NldF9jb21wcmVzc2lvbl9sZXZlbCh3cml0ZV9wdHIsIGNvbXByZXNzaW9uX2xldmVsKTsKLSAgICAgICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwod3JpdGVfcHRyLCBtZW1vcnlfbGV2ZWwpOwotICAgICAgICBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHdyaXRlX3B0ciwgY29tcHJlc3Npb25fc3RyYXRlZ3kpOwotICAgICAgICBwbmdfc2V0X2ZpbHRlcih3cml0ZV9wdHIsIFBOR19GSUxURVJfVFlQRV9CQVNFLCBmaWx0ZXJfdGFibGVbZmlsdGVyXSk7Ci0gICAgICAgIGlmIChjb21wcmVzc2lvbl9zdHJhdGVneSAhPSBaX0hVRkZNQU5fT05MWSAmJgotICAgICAgICAgICAgY29tcHJlc3Npb25fc3RyYXRlZ3kgIT0gWl9STEUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvcHRpb25zLndpbmRvd19iaXRzID4gMCkKLSAgICAgICAgICAgICAgICBwbmdfc2V0X2NvbXByZXNzaW9uX3dpbmRvd19iaXRzKHdyaXRlX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMud2luZG93X2JpdHMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotI2lmZGVmIFdCSVRTXzhfT0sKLSAgICAgICAgICAgIHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMod3JpdGVfcHRyLCA4KTsKLSNlbHNlCi0gICAgICAgICAgICBwbmdfc2V0X2NvbXByZXNzaW9uX3dpbmRvd19iaXRzKHdyaXRlX3B0ciwgOSk7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3Mod3JpdGVfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMsIE5VTEwsIDApOwotICAgICAgICBvcG5nX3N0b3JlX2ltYWdlX2luZm8od3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgKG91dGZpbGUgIT0gTlVMTCkpOwotCi0gICAgICAgIC8qIFdyaXRlIHRoZSBQTkcgc3RyZWFtLiAqLwotICAgICAgICBvcG5nX2luaXRfd3JpdGVfZGF0YSgpOwotICAgICAgICBwbmd4X3NldF93cml0ZV9mbih3cml0ZV9wdHIsIG91dGZpbGUsIG9wbmdfd3JpdGVfZGF0YSwgTlVMTCk7Ci0gICAgICAgIHBuZ193cml0ZV9wbmcod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgMCwgTlVMTCk7Ci0KLSAgICAgICAgZXJyX21zZyA9IE5VTEw7ICAvKiBldmVyeXRoaW5nIGlzIG9rICovCi0gICAgfQotICAgIENhdGNoIChlcnJfbXNnKQotICAgIHsKLSAgICAgICAgLyogU2V0IElEQVQgc2l6ZSB0byBpbnZhbGlkLiAqLwotICAgICAgICBwcm9jZXNzLm91dF9pZGF0X3NpemUgPSBpZGF0X3NpemVfbWF4ICsgMTsKLSAgICB9Ci0KLSAgICAvKiBEZXN0cm95IHRoZSBsaWJwbmcgc3RydWN0dXJlcy4gKi8KLSAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJndyaXRlX3B0ciwgJndyaXRlX2luZm9fcHRyKTsKLQotICAgIGlmIChlcnJfbXNnICE9IE5VTEwpCi0gICAgICAgIFRocm93IGVycl9tc2c7Ci19Ci0KLS8qCi0gKiBQTkcgZmlsZSBjb3B5aW5nCi0gKi8KLXN0YXRpYyB2b2lkCi1vcG5nX2NvcHlfZmlsZShGSUxFICppbmZpbGUsIEZJTEUgKm91dGZpbGUpCi17Ci0gICAgdm9sYXRpbGUgcG5nX2J5dGVwIGJ1ZjsgIC8qIHZvbGF0aWxlIGlzIHJlcXVpcmVkIGJ5IGNleGNlcHQgKi8KLSAgICBjb25zdCBwbmdfdWludF8zMiBidWZfc2l6ZV9pbmNyID0gMHgxMDAwOwotICAgIHBuZ191aW50XzMyIGJ1Zl9zaXplLCBsZW5ndGg7Ci0gICAgcG5nX2J5dGUgY2h1bmtfaGRyWzhdOwotICAgIGNvbnN0IGNoYXIgKiB2b2xhdGlsZSBlcnJfbXNnOwotCi0gICAgd3JpdGVfcHRyID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAotICAgICAgICBOVUxMLCBvcG5nX2Vycm9yLCBvcG5nX3dhcm5pbmcpOwotICAgIGlmICh3cml0ZV9wdHIgPT0gTlVMTCkKLSAgICAgICAgVGhyb3cgIk91dCBvZiBtZW1vcnkiOwotICAgIG9wbmdfaW5pdF93cml0ZV9kYXRhKCk7Ci0gICAgcG5neF9zZXRfd3JpdGVfZm4od3JpdGVfcHRyLCBvdXRmaWxlLCBvcG5nX3dyaXRlX2RhdGEsIE5VTEwpOwotCi0gICAgVHJ5Ci0gICAgewotICAgICAgICBidWYgPSBOVUxMOwotICAgICAgICBidWZfc2l6ZSA9IDA7Ci0KLSAgICAgICAgLyogV3JpdGUgdGhlIHNpZ25hdHVyZSBpbiB0aGUgb3V0cHV0IGZpbGUuICovCi0gICAgICAgIHBuZ3hfd3JpdGVfc2lnKHdyaXRlX3B0cik7Ci0KLSAgICAgICAgLyogQ29weSBhbGwgY2h1bmtzIHVudGlsIElFTkQuICovCi0gICAgICAgIC8qIEVycm9yIGNoZWNraW5nIGlzIGRvbmUgb25seSBhdCBhIHZlcnkgYmFzaWMgbGV2ZWwuICovCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChmcmVhZChjaHVua19oZHIsIDgsIDEsIGluZmlsZSkgIT0gMSkgIC8qIGxlbmd0aCArIG5hbWUgKi8KLSAgICAgICAgICAgICAgICBUaHJvdyAiUmVhZCBlcnJvciI7Ci0gICAgICAgICAgICBsZW5ndGggPSBwbmdfZ2V0X3VpbnRfMzIoY2h1bmtfaGRyKTsKLSAgICAgICAgICAgIGlmIChsZW5ndGggPiBQTkdfVUlOVF8zMV9NQVgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMICYmIGxlbmd0aCA9PSAweDg5NTA0ZTQ3VUwpICAvKiAiXHg4OVBORyIgKi8KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAvKiBza2lwIHRoZSBzaWduYXR1cmUgKi8KLSAgICAgICAgICAgICAgICBUaHJvdyAiRGF0YSBlcnJvciI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGVuZ3RoICsgNCA+IGJ1Zl9zaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBuZ19mcmVlKHdyaXRlX3B0ciwgYnVmKTsKLSAgICAgICAgICAgICAgICBidWZfc2l6ZSA9ICgoKGxlbmd0aCArIDQpICsgKGJ1Zl9zaXplX2luY3IgLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIGJ1Zl9zaXplX2luY3IpICogYnVmX3NpemVfaW5jcjsKLSAgICAgICAgICAgICAgICBidWYgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2Mod3JpdGVfcHRyLCBidWZfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgLyogRG8gbm90IHVzZSByZWFsbG9jKCkgaGVyZSwgaXQncyBzbG93ZXIuICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZnJlYWQoYnVmLCBsZW5ndGggKyA0LCAxLCBpbmZpbGUpICE9IDEpICAvKiBkYXRhICsgY3JjICovCi0gICAgICAgICAgICAgICAgVGhyb3cgIlJlYWQgZXJyb3IiOwotICAgICAgICAgICAgcG5nX3dyaXRlX2NodW5rKHdyaXRlX3B0ciwgY2h1bmtfaGRyICsgNCwgYnVmLCBsZW5ndGgpOwotICAgICAgICB9IHdoaWxlIChtZW1jbXAoY2h1bmtfaGRyICsgNCwgc2lnX0lFTkQsIDQpICE9IDApOwotCi0gICAgICAgIGVycl9tc2cgPSBOVUxMOyAgLyogZXZlcnl0aGluZyBpcyBvayAqLwotICAgIH0KLSAgICBDYXRjaCAoZXJyX21zZykKLSAgICB7Ci0gICAgfQotCi0gICAgcG5nX2ZyZWUod3JpdGVfcHRyLCBidWYpOwotICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmd3JpdGVfcHRyLCBOVUxMKTsKLQotICAgIGlmIChlcnJfbXNnICE9IE5VTEwpCi0gICAgICAgIFRocm93IGVycl9tc2c7Ci19Ci0KLS8qCi0gKiBJdGVyYXRpb24gaW5pdGlhbGl6YXRpb24KLSAqLwotc3RhdGljIHZvaWQKLW9wbmdfaW5pdF9pdGVyYXRpb24oYml0c2V0X3QgY21kbGluZV9zZXQsIGJpdHNldF90IG1hc2tfc2V0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcmVzZXQsIGJpdHNldF90ICpvdXRwdXRfc2V0KQotewotICAgIGJpdHNldF90IHByZXNldF9zZXQ7Ci0KLSAgICAqb3V0cHV0X3NldCA9IGNtZGxpbmVfc2V0ICYgbWFza19zZXQ7Ci0gICAgaWYgKCpvdXRwdXRfc2V0ID09IEJJVFNFVF9FTVBUWSAmJiBjbWRsaW5lX3NldCAhPSBCSVRTRVRfRU1QVFkpCi0gICAgICAgIFRocm93ICJJdGVyYXRpb24gcGFyYW1ldGVyKHMpIG91dCBvZiByYW5nZSI7Ci0gICAgaWYgKCpvdXRwdXRfc2V0ID09IEJJVFNFVF9FTVBUWSB8fCBvcHRpb25zLm9wdGltX2xldmVsID49IDApCi0gICAgewotICAgICAgICBwcmVzZXRfc2V0ID0gcmFuZ2VzZXRfc3RyaW5nX3RvX2JpdHNldChwcmVzZXQsIE5VTEwpOwotICAgICAgICAqb3V0cHV0X3NldCB8PSBwcmVzZXRfc2V0ICYgbWFza19zZXQ7Ci0gICAgfQotfQotCi0vKgotICogSXRlcmF0aW9uIGluaXRpYWxpemF0aW9uCi0gKi8KLXN0YXRpYyB2b2lkCi1vcG5nX2luaXRfaXRlcmF0aW9ucyh2b2lkKQotewotICAgIGJpdHNldF90IGNvbXByX2xldmVsX3NldCwgbWVtX2xldmVsX3NldCwgc3RyYXRlZ3lfc2V0LCBmaWx0ZXJfc2V0OwotICAgIGludCBwcmVzZXRfaW5kZXg7Ci0gICAgaW50IHQxLCB0MjsKLQotICAgIC8qIFNldCB0aGUgSURBVCBzaXplIGxpbWl0LiBUaGUgdHJpYWxzIHRoYXQgcGFzcyB0aGlzIGxpbWl0IHdpbGwgYmUKLSAgICAgKiBhYmFuZG9uZWQsIGFzIHRoZXJlIHdpbGwgYmUgbm8gbmVlZCB0byB3YWl0IHVudGlsIHRoZWlyIGNvbXBsZXRpb24uCi0gICAgICogVGhpcyBsaW1pdCBtYXkgZnVydGhlciBkZWNyZWFzZSBhcyBpdGVyYXRpb25zIGdvIG9uLgotICAgICAqLwotICAgIGlmICgocHJvY2Vzcy5zdGF0dXMgJiBPVVRQVVRfTkVFRFNfTkVXX0lEQVQpIHx8IG9wdGlvbnMuZnVsbCkKLSAgICAgICAgcHJvY2Vzcy5tYXhfaWRhdF9zaXplID0gaWRhdF9zaXplX21heDsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBPUE5HX0VOU1VSRShwcm9jZXNzLmluX2lkYXRfc2l6ZSA+IDAsICJObyBJREFUIGluIGlucHV0Iik7Ci0gICAgICAgIC8qIEFkZCB0aGUgaW5wdXQgUExURSBhbmQgdFJOUyBzaXplcyB0byB0aGUgaW5pdGlhbCBtYXggSURBVCBzaXplLAotICAgICAgICAgKiB0byBhY2NvdW50IGZvciB0aGUgY2hhbmdlcyB0aGF0IG1heSBvY2N1ciBkdXJpbmcgcmVkdWN0aW9uLgotICAgICAgICAgKiBUaGlzIGluY3VycyBhIG5lZ2xpZ2libGUgb3ZlcmhlYWQgb24gcHJvY2Vzc2luZyBvbmx5OiB0aGUgZmluYWwKLSAgICAgICAgICogSURBVCBzaXplIHdpbGwgbm90IGJlIGFmZmVjdGVkLCBiZWNhdXNlIGEgcHJlY2lzZSBjaGVjayB3aWxsIGJlCi0gICAgICAgICAqIHBlcmZvcm1lZCBhdCB0aGUgZW5kLCBpbnNpZGUgb3BuZ19maW5pc2hfaXRlcmF0aW9ucygpLgotICAgICAgICAgKi8KLSAgICAgICAgcHJvY2Vzcy5tYXhfaWRhdF9zaXplID0KLSAgICAgICAgICAgIHByb2Nlc3MuaW5faWRhdF9zaXplICsgcHJvY2Vzcy5pbl9wbHRlX3RybnNfc2l6ZTsKLSAgICB9Ci0KLSAgICAvKiBHZXQgcHJlc2V0X2luZGV4IGZyb20gb3B0aW9ucy5vcHRpbV9sZXZlbCwgYnV0IGxlYXZlIHRoZSBsYXR0ZXIgaW50YWN0LAotICAgICAqIGJlY2F1c2UgdGhlIGVmZmVjdCBvZiAib3B0aXBuZyAtbzIgLXouLi4gLWYuLi4iIGlzIHNsaWdodGx5IGRpZmZlcmVudAotICAgICAqIHRoYW4gdGhlIGVmZmVjdCBvZiAib3B0aXBuZyAtei4uLiAtZi4uLiIgKHdpdGhvdXQgIi1vIikuCi0gICAgICovCi0gICAgcHJlc2V0X2luZGV4ID0gb3B0aW9ucy5vcHRpbV9sZXZlbDsKLSAgICBpZiAocHJlc2V0X2luZGV4IDwgMCkKLSAgICAgICAgcHJlc2V0X2luZGV4ID0gT1BOR19PUFRJTV9MRVZFTF9ERUZBVUxUOwotICAgIGVsc2UgaWYgKHByZXNldF9pbmRleCA+IE9QTkdfT1BUSU1fTEVWRUxfTUFYKQotICAgICAgICBwcmVzZXRfaW5kZXggPSBPUE5HX09QVElNX0xFVkVMX01BWDsKLQotICAgIC8qIEluaXRpYWxpemUgdGhlIGl0ZXJhdGlvbiBzZXRzLgotICAgICAqIENvbWJpbmUgdGhlIHVzZXItZGVmaW5lZCB2YWx1ZXMgd2l0aCB0aGUgb3B0aW1pemF0aW9uIHByZXNldHMuCi0gICAgICovCi0gICAgb3BuZ19pbml0X2l0ZXJhdGlvbihvcHRpb25zLmNvbXByX2xldmVsX3NldCwgT1BOR19DT01QUl9MRVZFTF9TRVRfTUFTSywKLSAgICAgICAgY29tcHJfbGV2ZWxfcHJlc2V0c1twcmVzZXRfaW5kZXhdLCAmY29tcHJfbGV2ZWxfc2V0KTsKLSAgICBvcG5nX2luaXRfaXRlcmF0aW9uKG9wdGlvbnMubWVtX2xldmVsX3NldCwgT1BOR19NRU1fTEVWRUxfU0VUX01BU0ssCi0gICAgICAgIG1lbV9sZXZlbF9wcmVzZXRzW3ByZXNldF9pbmRleF0sICZtZW1fbGV2ZWxfc2V0KTsKLSAgICBvcG5nX2luaXRfaXRlcmF0aW9uKG9wdGlvbnMuc3RyYXRlZ3lfc2V0LCBPUE5HX1NUUkFURUdZX1NFVF9NQVNLLAotICAgICAgICBzdHJhdGVneV9wcmVzZXRzW3ByZXNldF9pbmRleF0sICZzdHJhdGVneV9zZXQpOwotICAgIG9wbmdfaW5pdF9pdGVyYXRpb24ob3B0aW9ucy5maWx0ZXJfc2V0LCBPUE5HX0ZJTFRFUl9TRVRfTUFTSywKLSAgICAgICAgZmlsdGVyX3ByZXNldHNbcHJlc2V0X2luZGV4XSwgJmZpbHRlcl9zZXQpOwotCi0gICAgLyogUmVwbGFjZSB0aGUgZW1wdHkgc2V0cyB3aXRoIHRoZSBsaWJwbmcncyAiYmVzdCBndWVzcyIgaGV1cmlzdGljcy4gKi8KLSAgICBpZiAoY29tcHJfbGV2ZWxfc2V0ID09IEJJVFNFVF9FTVBUWSkKLSAgICAgICAgYml0c2V0X3NldCgmY29tcHJfbGV2ZWxfc2V0LCBaX0JFU1RfQ09NUFJFU1NJT04pOyAgLyogLXpjOSAqLwotICAgIGlmIChtZW1fbGV2ZWxfc2V0ID09IEJJVFNFVF9FTVBUWSkKLSAgICAgICAgYml0c2V0X3NldCgmbWVtX2xldmVsX3NldCwgOCk7Ci0gICAgaWYgKGltYWdlLmJpdF9kZXB0aCA8IDggfHwgaW1hZ2UucGFsZXR0ZSAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgaWYgKHN0cmF0ZWd5X3NldCA9PSBCSVRTRVRfRU1QVFkpCi0gICAgICAgICAgICBiaXRzZXRfc2V0KCZzdHJhdGVneV9zZXQsIFpfREVGQVVMVF9TVFJBVEVHWSk7ICAvKiAtenMwICovCi0gICAgICAgIGlmIChmaWx0ZXJfc2V0ID09IEJJVFNFVF9FTVBUWSkKLSAgICAgICAgICAgIGJpdHNldF9zZXQoJmZpbHRlcl9zZXQsIDApOyAgLyogLWYwICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChzdHJhdGVneV9zZXQgPT0gQklUU0VUX0VNUFRZKQotICAgICAgICAgICAgYml0c2V0X3NldCgmc3RyYXRlZ3lfc2V0LCBaX0ZJTFRFUkVEKTsgIC8qIC16czEgKi8KLSAgICAgICAgaWYgKGZpbHRlcl9zZXQgPT0gQklUU0VUX0VNUFRZKQotICAgICAgICAgICAgYml0c2V0X3NldCgmZmlsdGVyX3NldCwgNSk7ICAvKiAtZjAgKi8KLSAgICB9Ci0KLSAgICAvKiBTdG9yZSB0aGUgcmVzdWx0cyBpbnRvIHByb2Nlc3MuICovCi0gICAgcHJvY2Vzcy5jb21wcl9sZXZlbF9zZXQgPSBjb21wcl9sZXZlbF9zZXQ7Ci0gICAgcHJvY2Vzcy5tZW1fbGV2ZWxfc2V0ICAgPSBtZW1fbGV2ZWxfc2V0OwotICAgIHByb2Nlc3Muc3RyYXRlZ3lfc2V0ICAgID0gc3RyYXRlZ3lfc2V0OwotICAgIHByb2Nlc3MuZmlsdGVyX3NldCAgICAgID0gZmlsdGVyX3NldDsKLSAgICB0MSA9IGJpdHNldF9jb3VudChjb21wcl9sZXZlbF9zZXQpICoKLSAgICAgICAgIGJpdHNldF9jb3VudChzdHJhdGVneV9zZXQgJiB+KCgxIDw8IFpfSFVGRk1BTl9PTkxZKSB8ICgxIDw8IFpfUkxFKSkpOwotICAgIHQyID0gYml0c2V0X2NvdW50KHN0cmF0ZWd5X3NldCAmICAoKDEgPDwgWl9IVUZGTUFOX09OTFkpIHwgKDEgPDwgWl9STEUpKSk7Ci0gICAgcHJvY2Vzcy5udW1faXRlcmF0aW9ucyA9Ci0gICAgICAgICh0MSArIHQyKSAqIGJpdHNldF9jb3VudChtZW1fbGV2ZWxfc2V0KSAqIGJpdHNldF9jb3VudChmaWx0ZXJfc2V0KTsKLSAgICBPUE5HX0VOU1VSRShwcm9jZXNzLm51bV9pdGVyYXRpb25zID4gMCwgIkludmFsaWQgaXRlcmF0aW9uIHBhcmFtZXRlcnMiKTsKLX0KLQotLyoKLSAqIEl0ZXJhdGlvbgotICovCi1zdGF0aWMgdm9pZAotb3BuZ19pdGVyYXRlKHZvaWQpCi17Ci0gICAgYml0c2V0X3QgY29tcHJfbGV2ZWxfc2V0LCBtZW1fbGV2ZWxfc2V0LCBzdHJhdGVneV9zZXQsIGZpbHRlcl9zZXQ7Ci0gICAgYml0c2V0X3Qgc2F2ZWRfY29tcHJfbGV2ZWxfc2V0OwotICAgIGludCBjb21wcl9sZXZlbCwgbWVtX2xldmVsLCBzdHJhdGVneSwgZmlsdGVyOwotICAgIGludCBjb3VudGVyOwotICAgIGludCBsaW5lX3JldXNlZDsKLQotICAgIE9QTkdfRU5TVVJFKHByb2Nlc3MubnVtX2l0ZXJhdGlvbnMgPiAwLCAiSXRlcmF0aW9ucyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICBpZiAoKHByb2Nlc3MubnVtX2l0ZXJhdGlvbnMgPT0gMSkgJiYKLSAgICAgICAgKHByb2Nlc3Muc3RhdHVzICYgT1VUUFVUX05FRURTX05FV19JREFUKSkKLSAgICB7Ci0gICAgICAgLyogV2UgYWxyZWFkeSBrbm93IHRoaXMgY29tYmluYXRpb24gd2lsbCBiZSBzZWxlY3RlZC4KLSAgICAgICAgKiBEbyBub3Qgd2FzdGUgdGltZSBydW5uaW5nIGl0IHR3aWNlLgotICAgICAgICAqLwotICAgICAgIHByb2Nlc3MuYmVzdF9pZGF0X3NpemUgPSAwOwotICAgICAgIHByb2Nlc3MuYmVzdF9jb21wcl9sZXZlbCA9IGJpdHNldF9maW5kX2ZpcnN0KHByb2Nlc3MuY29tcHJfbGV2ZWxfc2V0KTsKLSAgICAgICBwcm9jZXNzLmJlc3RfbWVtX2xldmVsICAgPSBiaXRzZXRfZmluZF9maXJzdChwcm9jZXNzLm1lbV9sZXZlbF9zZXQpOwotICAgICAgIHByb2Nlc3MuYmVzdF9zdHJhdGVneSAgICA9IGJpdHNldF9maW5kX2ZpcnN0KHByb2Nlc3Muc3RyYXRlZ3lfc2V0KTsKLSAgICAgICBwcm9jZXNzLmJlc3RfZmlsdGVyICAgICAgPSBiaXRzZXRfZmluZF9maXJzdChwcm9jZXNzLmZpbHRlcl9zZXQpOwotICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBQcmVwYXJlIGZvciB0aGUgYmlnIGl0ZXJhdGlvbi4gKi8KLSAgICBjb21wcl9sZXZlbF9zZXQgPSBwcm9jZXNzLmNvbXByX2xldmVsX3NldDsKLSAgICBtZW1fbGV2ZWxfc2V0ICAgPSBwcm9jZXNzLm1lbV9sZXZlbF9zZXQ7Ci0gICAgc3RyYXRlZ3lfc2V0ICAgID0gcHJvY2Vzcy5zdHJhdGVneV9zZXQ7Ci0gICAgZmlsdGVyX3NldCAgICAgID0gcHJvY2Vzcy5maWx0ZXJfc2V0OwotICAgIHByb2Nlc3MuYmVzdF9pZGF0X3NpemUgICA9IGlkYXRfc2l6ZV9tYXggKyAxOwotICAgIHByb2Nlc3MuYmVzdF9jb21wcl9sZXZlbCA9IC0xOwotICAgIHByb2Nlc3MuYmVzdF9tZW1fbGV2ZWwgICA9IC0xOwotICAgIHByb2Nlc3MuYmVzdF9zdHJhdGVneSAgICA9IC0xOwotICAgIHByb2Nlc3MuYmVzdF9maWx0ZXIgICAgICA9IC0xOwotCi0gICAgLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSAiaHlwZXItcmVjdGFuZ2xlIiAoemMsIHptLCB6cywgZikuICovCi0gICAgdXNyX3ByaW50ZigiXG5Ucnlpbmc6XG4iKTsKLSAgICBsaW5lX3JldXNlZCA9IDA7Ci0gICAgY291bnRlciA9IDA7Ci0gICAgZm9yIChmaWx0ZXIgPSBPUE5HX0ZJTFRFUl9NSU47Ci0gICAgICAgICBmaWx0ZXIgPD0gT1BOR19GSUxURVJfTUFYOyArK2ZpbHRlcikKLSAgICB7Ci0gICAgICAgaWYgKGJpdHNldF90ZXN0KGZpbHRlcl9zZXQsIGZpbHRlcikpCi0gICAgICAgewotICAgICAgICAgIGZvciAoc3RyYXRlZ3kgPSBPUE5HX1NUUkFURUdZX01JTjsKLSAgICAgICAgICAgICAgIHN0cmF0ZWd5IDw9IE9QTkdfU1RSQVRFR1lfTUFYOyArK3N0cmF0ZWd5KQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBpZiAoYml0c2V0X3Rlc3Qoc3RyYXRlZ3lfc2V0LCBzdHJhdGVneSkpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFRoZSBjb21wcmVzc2lvbiBsZXZlbCBoYXMgbm8gc2lnbmlmaWNhbmNlIHVuZGVyCi0gICAgICAgICAgICAgICAgICogWl9IVUZGTUFOX09OTFkgb3IgWl9STEUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgc2F2ZWRfY29tcHJfbGV2ZWxfc2V0ID0gY29tcHJfbGV2ZWxfc2V0OwotICAgICAgICAgICAgICAgIGlmIChzdHJhdGVneSA9PSBaX0hVRkZNQU5fT05MWSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgY29tcHJfbGV2ZWxfc2V0ID0gQklUU0VUX0VNUFRZOwotICAgICAgICAgICAgICAgICAgIGJpdHNldF9zZXQoJmNvbXByX2xldmVsX3NldCwgMSk7ICAvKiB1c2UgZGVmbGF0ZV9mYXN0ICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmF0ZWd5ID09IFpfUkxFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBjb21wcl9sZXZlbF9zZXQgPSBCSVRTRVRfRU1QVFk7Ci0gICAgICAgICAgICAgICAgICAgYml0c2V0X3NldCgmY29tcHJfbGV2ZWxfc2V0LCA5KTsgIC8qIHVzZSBkZWZsYXRlX3Nsb3cgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChjb21wcl9sZXZlbCA9IE9QTkdfQ09NUFJfTEVWRUxfTUFYOwotICAgICAgICAgICAgICAgICAgICAgY29tcHJfbGV2ZWwgPj0gT1BOR19DT01QUl9MRVZFTF9NSU47IC0tY29tcHJfbGV2ZWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGlmIChiaXRzZXRfdGVzdChjb21wcl9sZXZlbF9zZXQsIGNvbXByX2xldmVsKSkKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgZm9yIChtZW1fbGV2ZWwgPSBPUE5HX01FTV9MRVZFTF9NQVg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1fbGV2ZWwgPj0gT1BOR19NRU1fTEVWRUxfTUlOOyAtLW1lbV9sZXZlbCkKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHNldF90ZXN0KG1lbV9sZXZlbF9zZXQsIG1lbV9sZXZlbCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzcl9wcmludGYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgemMgPSAlZCAgem0gPSAlZCAgenMgPSAlZCAgZiA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcl9sZXZlbCwgbWVtX2xldmVsLCBzdHJhdGVneSwgZmlsdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3JfcHJvZ3Jlc3MoY291bnRlciwgcHJvY2Vzcy5udW1faXRlcmF0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKytjb3VudGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wbmdfd3JpdGVfZmlsZShOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByX2xldmVsLCBtZW1fbGV2ZWwsIHN0cmF0ZWd5LCBmaWx0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLm91dF9pZGF0X3NpemUgPiBpZGF0X3NpemVfbWF4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3JfcHJpbnRmKCJcdFx0SURBVCB0b28gYmlnXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX3JldXNlZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNyX3ByaW50X2NudHJsKCdccicpOyAgLyogQ1I6IHJlc2V0IGxpbmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX3JldXNlZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3JfcHJpbnRmKCJcdFx0SURBVCBzaXplID0gJSIgT1NZU19GU0laRV9QUkl1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5vdXRfaWRhdF9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX3JldXNlZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuYmVzdF9pZGF0X3NpemUgPCBwcm9jZXNzLm91dF9pZGF0X3NpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuYmVzdF9pZGF0X3NpemUgPT0gcHJvY2Vzcy5vdXRfaWRhdF9zaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHByb2Nlc3MuYmVzdF9zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgIC8qIGl0J3MgbmVpdGhlciBzbWFsbGVyIG5vciBmYXN0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmJlc3RfY29tcHJfbGV2ZWwgPSBjb21wcl9sZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmJlc3RfbWVtX2xldmVsICAgPSBtZW1fbGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5iZXN0X3N0cmF0ZWd5ICAgID0gc3RyYXRlZ3k7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5iZXN0X2ZpbHRlciAgICAgID0gZmlsdGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuYmVzdF9pZGF0X3NpemUgICA9IHByb2Nlc3Mub3V0X2lkYXRfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLm1heF9pZGF0X3NpemUgPSBwcm9jZXNzLm91dF9pZGF0X3NpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbXByX2xldmVsX3NldCA9IHNhdmVkX2NvbXByX2xldmVsX3NldDsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGxpbmVfcmV1c2VkKQotICAgICAgICB1c3JfcHJpbnRfY250cmwoLTMxKTsgIC8qIE1pbnVzIE46IGVyYXNlIE4gY2hhcnMgZnJvbSBzdGFydCBvZiBsaW5lICovCi0KLSAgICBPUE5HX0VOU1VSRShjb3VudGVyID09IHByb2Nlc3MubnVtX2l0ZXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgIkluY29uc2lzdGVudCBpdGVyYXRpb24gY291bnRlciIpOwotICAgIHVzcl9wcm9ncmVzcyhjb3VudGVyLCBwcm9jZXNzLm51bV9pdGVyYXRpb25zKTsKLX0KLQotLyoKLSAqIEl0ZXJhdGlvbiBmaW5hbGl6YXRpb24KLSAqLwotc3RhdGljIHZvaWQKLW9wbmdfZmluaXNoX2l0ZXJhdGlvbnModm9pZCkKLXsKLSAgICBpZiAocHJvY2Vzcy5iZXN0X2lkYXRfc2l6ZSArIHByb2Nlc3Mub3V0X3BsdGVfdHJuc19zaXplIDwKLSAgICAgICAgcHJvY2Vzcy5pbl9pZGF0X3NpemUgKyBwcm9jZXNzLmluX3BsdGVfdHJuc19zaXplKQotICAgICAgICBwcm9jZXNzLnN0YXR1cyB8PSBPVVRQVVRfTkVFRFNfTkVXX0lEQVQ7Ci0gICAgaWYgKHByb2Nlc3Muc3RhdHVzICYgT1VUUFVUX05FRURTX05FV19JREFUKQotICAgIHsKLSAgICAgICAgaWYgKHByb2Nlc3MuYmVzdF9pZGF0X3NpemUgPD0gaWRhdF9zaXplX21heCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNyX3ByaW50ZigiXG5TZWxlY3RpbmcgcGFyYW1ldGVyczpcbiIpOwotICAgICAgICAgICAgdXNyX3ByaW50ZigiICB6YyA9ICVkICB6bSA9ICVkICB6cyA9ICVkICBmID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmJlc3RfY29tcHJfbGV2ZWwsIHByb2Nlc3MuYmVzdF9tZW1fbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuYmVzdF9zdHJhdGVneSwgcHJvY2Vzcy5iZXN0X2ZpbHRlcik7Ci0gICAgICAgICAgICBpZiAocHJvY2Vzcy5iZXN0X2lkYXRfc2l6ZSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogQXQgbGVhc3Qgb25lIHRyaWFsIGhhcyBiZWVuIHJ1bi4gKi8KLSAgICAgICAgICAgICAgICB1c3JfcHJpbnRmKCJcdFx0SURBVCBzaXplID0gJSIgT1NZU19GU0laRV9QUkl1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5iZXN0X2lkYXRfc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1c3JfcHJpbnRmKCJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGhlIGNvbXByZXNzZWQgaW1hZ2UgZGF0YSBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBhbGxvd2VkLiAqLwotICAgICAgICAgICAgdXNyX3ByaW50ZigiICB6YyA9ICogIHptID0gKiAgenMgPSAqICBmID0gKlx0XHRJREFUIHNpemUgPiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaWRhdF9zaXplX21heF9zdHJpbmcpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKgotICogSW1hZ2UgZmlsZSBvcHRpbWl6YXRpb24KLSAqLwotc3RhdGljIHZvaWQKLW9wbmdfb3B0aW1pemVfaW1wbChjb25zdCBjaGFyICppbmZpbGVfbmFtZSkKLXsKLSAgICBzdGF0aWMgRklMRSAqaW5maWxlLCAqb3V0ZmlsZTsgICAgICAgICAvKiBzdGF0aWMgb3Igdm9sYXRpbGUgaXMgcmVxdWlyZWQgKi8KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqaW5maWxlX25hbWVfbG9jYWw7ICAgICAgICAgICAgICAgICAgICAgIC8qIGJ5IGNleGNlcHQgKi8KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqb3V0ZmlsZV9uYW1lLCAqYmFrZmlsZV9uYW1lOwotICAgIHN0YXRpYyBpbnQgbmV3X291dGZpbGUsIGhhc19iYWNrdXA7Ci0gICAgY2hhciBuYW1lX2J1ZltGSUxFTkFNRV9NQVhdLCB0bXBfYnVmW0ZJTEVOQU1FX01BWF07Ci0gICAgY29uc3QgY2hhciAqIHZvbGF0aWxlIGVycl9tc2c7Ci0KLSAgICBtZW1zZXQoJnByb2Nlc3MsIDAsIHNpemVvZihwcm9jZXNzKSk7Ci0gICAgaWYgKG9wdGlvbnMuZm9yY2UpCi0gICAgICAgIHByb2Nlc3Muc3RhdHVzIHw9IE9VVFBVVF9ORUVEU19ORVdfSURBVDsKLQotICAgIGVycl9tc2cgPSBOVUxMOyAgLyogcHJlcGFyZSBmb3IgZXJyb3IgaGFuZGxpbmcgKi8KLQotICAgIGluZmlsZV9uYW1lX2xvY2FsID0gaW5maWxlX25hbWU7Ci0gICAgaWYgKChpbmZpbGUgPSBmb3BlbihpbmZpbGVfbmFtZV9sb2NhbCwgInJiIikpID09IE5VTEwpCi0gICAgICAgIFRocm93ICJDYW4ndCBvcGVuIHRoZSBpbnB1dCBmaWxlIjsKLSAgICBUcnkKLSAgICB7Ci0gICAgICAgIG9wbmdfcmVhZF9maWxlKGluZmlsZSk7Ci0gICAgfQotICAgIENhdGNoIChlcnJfbXNnKQotICAgIHsKLSAgICAgICAgT1BOR19FTlNVUkUoZXJyX21zZyAhPSBOVUxMLCAiTXlzdGVyaW91cyBlcnJvciBpbiBvcG5nX3JlYWRfZmlsZSIpOwotICAgIH0KLSAgICBmY2xvc2UoaW5maWxlKTsgIC8qIGZpbmFsbHkgKi8KLSAgICBpZiAoZXJyX21zZyAhPSBOVUxMKQotICAgICAgICBUaHJvdyBlcnJfbXNnOyAgLyogcmV0aHJvdyAqLwotCi0gICAgLyogQ2hlY2sgdGhlIGVycm9yIGZsYWcuIFRoaXMgbXVzdCBiZSB0aGUgZmlyc3QgY2hlY2suICovCi0gICAgaWYgKHByb2Nlc3Muc3RhdHVzICYgSU5QVVRfSEFTX0VSUk9SUykKLSAgICB7Ci0gICAgICAgIHVzcl9wcmludGYoIlJlY292ZXJhYmxlIGVycm9ycyBmb3VuZCBpbiBpbnB1dC4iKTsKLSAgICAgICAgaWYgKG9wdGlvbnMuZml4KQotICAgICAgICB7Ci0gICAgICAgICAgICB1c3JfcHJpbnRmKCIgRml4aW5nLi4uXG4iKTsKLSAgICAgICAgICAgIHByb2Nlc3Muc3RhdHVzIHw9IE9VVFBVVF9ORUVEU19ORVdfRklMRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzcl9wcmludGYoIiBSZXJ1biAiIFBST0dSQU1fTkFNRSAiIHdpdGggLWZpeCBlbmFibGVkLlxuIik7Ci0gICAgICAgICAgICBUaHJvdyAiUHJldmlvdXMgZXJyb3Iocykgbm90IGZpeGVkIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENoZWNrIHRoZSBqdW5rIGZsYWcuICovCi0gICAgaWYgKHByb2Nlc3Muc3RhdHVzICYgSU5QVVRfSEFTX0pVTkspCi0gICAgICAgIHByb2Nlc3Muc3RhdHVzIHw9IE9VVFBVVF9ORUVEU19ORVdfRklMRTsKLQotICAgIC8qIENoZWNrIHRoZSBQTkcgc2lnbmF0dXJlIGFuZCBkYXRhc3RyZWFtIGZsYWdzLiAqLwotICAgIGlmICghKHByb2Nlc3Muc3RhdHVzICYgSU5QVVRfSEFTX1BOR19TSUdOQVRVUkUpKQotICAgICAgICBwcm9jZXNzLnN0YXR1cyB8PSBPVVRQVVRfTkVFRFNfTkVXX0ZJTEU7Ci0gICAgaWYgKHByb2Nlc3Muc3RhdHVzICYgSU5QVVRfSEFTX1BOR19EQVRBU1RSRUFNKQotICAgIHsKLSAgICAgICAgaWYgKG9wdGlvbnMubnogJiYgKHByb2Nlc3Muc3RhdHVzICYgT1VUUFVUX05FRURTX05FV19JREFUKSkKLSAgICAgICAgewotICAgICAgICAgICAgdXNyX3ByaW50ZigKLSAgICAgICAgICAgICAgICAiSURBVCByZWNvZGluZyBpcyBuZWNlc3NhcnksIGJ1dCBpcyBkaXNhYmxlZCBieSB0aGUgdXNlci5cbiIpOwotICAgICAgICAgICAgVGhyb3cgIkNhbid0IGNvbnRpbnVlIjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHByb2Nlc3Muc3RhdHVzIHw9IE9VVFBVVF9ORUVEU19ORVdfSURBVDsKLQotICAgIC8qIENoZWNrIHRoZSBkaWdpdGFsIHNpZ25hdHVyZSBmbGFnLiAqLwotICAgIGlmIChwcm9jZXNzLnN0YXR1cyAmIElOUFVUX0hBU19ESUdJVEFMX1NJR05BVFVSRSkKLSAgICB7Ci0gICAgICAgIHVzcl9wcmludGYoIkRpZ2l0YWwgc2lnbmF0dXJlIGZvdW5kIGluIGlucHV0LiIpOwotICAgICAgICBpZiAob3B0aW9ucy5mb3JjZSkKLSAgICAgICAgewotICAgICAgICAgICAgdXNyX3ByaW50ZigiIEVyYXNpbmcuLi5cbiIpOwotICAgICAgICAgICAgcHJvY2Vzcy5zdGF0dXMgfD0gT1VUUFVUX05FRURTX05FV19GSUxFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdXNyX3ByaW50ZigiIFJlcnVuICIgUFJPR1JBTV9OQU1FICIgd2l0aCAtZm9yY2UgZW5hYmxlZC5cbiIpOwotICAgICAgICAgICAgVGhyb3cgIkNhbid0IG9wdGltaXplIGRpZ2l0YWxseS1zaWduZWQgZmlsZXMiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgdGhlIG11bHRpLWltYWdlIGZsYWcuICovCi0gICAgaWYgKHByb2Nlc3Muc3RhdHVzICYgSU5QVVRfSEFTX01VTFRJUExFX0lNQUdFUykKLSAgICB7Ci0gICAgICAgIGlmICghb3B0aW9ucy5zbmlwICYmICEocHJvY2Vzcy5zdGF0dXMgJiBJTlBVVF9JU19QTkdfRklMRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzcl9wcmludGYoIkNvbnZlcnNpb24gdG8gUE5HIHJlcXVpcmVzIHNuaXBwaW5nLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICJSZXJ1biAiIFBST0dSQU1fTkFNRSAiIHdpdGggLXNuaXAgZW5hYmxlZC5cbiIpOwotICAgICAgICAgICAgVGhyb3cgIkluY29tcGF0aWJsZSBpbnB1dCBmb3JtYXQiOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICgocHJvY2Vzcy5zdGF0dXMgJiBJTlBVVF9IQVNfQVBORykgJiYgb3B0aW9ucy5zbmlwKQotICAgICAgICBwcm9jZXNzLnN0YXR1cyB8PSBPVVRQVVRfTkVFRFNfTkVXX0ZJTEU7Ci0KLSAgICAvKiBDaGVjayB0aGUgc3RyaXBwZWQtZGF0YSBmbGFnLiAqLwotICAgIGlmIChwcm9jZXNzLnN0YXR1cyAmIElOUFVUX0hBU19TVFJJUFBFRF9EQVRBKQotICAgICAgICB1c3JfcHJpbnRmKCJTdHJpcHBpbmcgbWV0YWRhdGEuLi5cbiIpOwotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4gKi8KLSAgICBvdXRmaWxlX25hbWUgPSBOVUxMOwotICAgIGlmICghKHByb2Nlc3Muc3RhdHVzICYgSU5QVVRfSVNfUE5HX0ZJTEUpKQotICAgIHsKLSAgICAgICAgaWYgKG9zeXNfcGF0aF9jaGV4dChuYW1lX2J1Ziwgc2l6ZW9mKG5hbWVfYnVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZpbGVfbmFtZV9sb2NhbCwgIi5wbmciKSA9PSBOVUxMKQotICAgICAgICAgICAgVGhyb3cgIkNhbid0IGNyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgKG5hbWUgdG9vIGxvbmcpIjsKLSAgICAgICAgb3V0ZmlsZV9uYW1lID0gbmFtZV9idWY7Ci0gICAgfQotICAgIGlmIChvcHRpb25zLm91dF9uYW1lICE9IE5VTEwpCi0gICAgICAgIG91dGZpbGVfbmFtZSA9IG9wdGlvbnMub3V0X25hbWU7ICAvKiBvdmVycmlkZSB0aGUgb2xkIG5hbWUgKi8KLSAgICBpZiAob3B0aW9ucy5kaXJfbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgY29uc3QgY2hhciAqdG1wX25hbWU7Ci0gICAgICAgIGlmIChvdXRmaWxlX25hbWUgIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyY3B5KHRtcF9idWYsIG91dGZpbGVfbmFtZSk7Ci0gICAgICAgICAgICB0bXBfbmFtZSA9IHRtcF9idWY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdG1wX25hbWUgPSBpbmZpbGVfbmFtZV9sb2NhbDsKLSAgICAgICAgaWYgKG9zeXNfcGF0aF9jaGRpcihuYW1lX2J1Ziwgc2l6ZW9mKG5hbWVfYnVmKSwgdG1wX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kaXJfbmFtZSkgPT0gTlVMTCkKLSAgICAgICAgICAgIFRocm93ICJDYW4ndCBjcmVhdGUgdGhlIG91dHB1dCBmaWxlIChuYW1lIHRvbyBsb25nKSI7Ci0gICAgICAgIG91dGZpbGVfbmFtZSA9IG5hbWVfYnVmOwotICAgIH0KLSAgICBpZiAob3V0ZmlsZV9uYW1lID09IE5VTEwpCi0gICAgewotICAgICAgICBvdXRmaWxlX25hbWUgPSBpbmZpbGVfbmFtZV9sb2NhbDsKLSAgICAgICAgbmV3X291dGZpbGUgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpbnQgdGVzdF9lcSA9IG9zeXNfdGVzdF9lcShpbmZpbGVfbmFtZV9sb2NhbCwgb3V0ZmlsZV9uYW1lKTsKLSAgICAgICAgaWYgKHRlc3RfZXEgPj0gMCkKLSAgICAgICAgICAgIG5ld19vdXRmaWxlID0gKHRlc3RfZXEgPT0gMCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogV2UgZG9uJ3Qga25vdyBpZiB0aGUgdHdvIHBhdGhzIHBvaW50IHRvIHRoZSBzYW1lIGZpbGUuCi0gICAgICAgICAgICAgKiBVc2UgYSBjcnVkZSBwYXRoIG5hbWUgY29tcGFyaXNvbi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbmV3X291dGZpbGUgPSAoc3RyY21wKGluZmlsZV9uYW1lX2xvY2FsLCBvdXRmaWxlX25hbWUpICE9IDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgYmFja3VwIGZpbGUgbmFtZS4gKi8KLSAgICBiYWtmaWxlX25hbWUgPSB0bXBfYnVmOwotICAgIGlmIChuZXdfb3V0ZmlsZSkKLSAgICB7Ci0gICAgICAgIGlmIChvc3lzX3BhdGhfbWtiYWsodG1wX2J1Ziwgc2l6ZW9mKHRtcF9idWYpLAotICAgICAgICAgICAgb3V0ZmlsZV9uYW1lKSA9PSBOVUxMKQotICAgICAgICAgICAgYmFrZmlsZV9uYW1lID0gTlVMTDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKG9zeXNfcGF0aF9ta2Jhayh0bXBfYnVmLCBzaXplb2YodG1wX2J1ZiksCi0gICAgICAgICAgICBpbmZpbGVfbmFtZV9sb2NhbCkgPT0gTlVMTCkKLSAgICAgICAgICAgIGJha2ZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgfQotICAgIC8qIENoZWNrIHRoZSBuYW1lIGV2ZW4gaW4gc2ltdWxhdGlvbiBtb2RlLCB0byBlbnN1cmUgYSB1bmlmb3JtIGJlaGF2aW9yLiAqLwotICAgIGlmIChiYWtmaWxlX25hbWUgPT0gTlVMTCkKLSAgICAgICAgVGhyb3cgIkNhbid0IGNyZWF0ZSBiYWNrdXAgZmlsZSAobmFtZSB0b28gbG9uZykiOwotICAgIC8qIENoZWNrIHRoZSBiYWNrdXAgZmlsZSBiZWZvcmUgZW5nYWdpbmcgaW50byBsZW5ndGh5IHRyaWFscy4gKi8KLSAgICBpZiAoIW9wdGlvbnMuc2ltdWxhdGUgJiYgb3N5c190ZXN0KG91dGZpbGVfbmFtZSwgImUiKSA9PSAwKQotICAgIHsKLSAgICAgICAgaWYgKG5ld19vdXRmaWxlICYmICFvcHRpb25zLmJhY2t1cCAmJiAhb3B0aW9ucy5jbG9iYmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c3JfcHJpbnRmKCJUaGUgb3V0cHV0IGZpbGUgZXhpc3RzLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICJSZXJ1biAiIFBST0dSQU1fTkFNRSAiIHdpdGggLWJhY2t1cCBlbmFibGVkXG4iKTsKLSAgICAgICAgICAgIFRocm93ICJDYW4ndCBvdmVyd3JpdGUgdGhlIG91dHB1dCBmaWxlIjsKLSAgICAgICAgfQotICAgICAgICBpZiAob3N5c190ZXN0KG91dGZpbGVfbmFtZSwgImZ3IikgIT0gMCB8fAotICAgICAgICAgICAgKCFvcHRpb25zLmNsb2JiZXIgJiYgb3N5c190ZXN0KGJha2ZpbGVfbmFtZSwgImUiKSA9PSAwKSkKLSAgICAgICAgICAgIFRocm93ICJDYW4ndCBiYWNrIHVwIHRoZSBleGlzdGluZyBvdXRwdXQgZmlsZSI7Ci0gICAgfQotCi0gICAgLyogRGlzcGxheSB0aGUgaW5wdXQgSURBVC9maWxlIHNpemVzLiAqLwotICAgIGlmIChwcm9jZXNzLnN0YXR1cyAmIElOUFVUX0hBU19QTkdfREFUQVNUUkVBTSkKLSAgICAgICAgdXNyX3ByaW50ZigiSW5wdXQgSURBVCBzaXplID0gJSIgT1NZU19GU0laRV9QUkl1ICIgYnl0ZXNcbiIsCi0gICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5pbl9pZGF0X3NpemUpOwotICAgIHVzcl9wcmludGYoIklucHV0IGZpbGUgc2l6ZSA9ICUiIE9TWVNfRlNJWkVfUFJJdSAiIGJ5dGVzXG4iLAotICAgICAgICAgICAgICAgcHJvY2Vzcy5pbl9maWxlX3NpemUpOwotCi0gICAgLyogRmluZCB0aGUgYmVzdCBwYXJhbWV0ZXJzIGFuZCBzZWUgaWYgaXQncyB3b3J0aCByZWNvbXByZXNzaW5nLiAqLwotICAgIGlmICghb3B0aW9ucy5ueiB8fCAocHJvY2Vzcy5zdGF0dXMgJiBPVVRQVVRfTkVFRFNfTkVXX0lEQVQpKQotICAgIHsKLSAgICAgICAgb3BuZ19pbml0X2l0ZXJhdGlvbnMoKTsKLSAgICAgICAgb3BuZ19pdGVyYXRlKCk7Ci0gICAgICAgIG9wbmdfZmluaXNoX2l0ZXJhdGlvbnMoKTsKLSAgICB9Ci0gICAgaWYgKHByb2Nlc3Muc3RhdHVzICYgT1VUUFVUX05FRURTX05FV19JREFUKQotICAgIHsKLSAgICAgICAgcHJvY2Vzcy5zdGF0dXMgfD0gT1VUUFVUX05FRURTX05FV19GSUxFOwotICAgICAgICBvcG5nX2NoZWNrX2lkYXRfc2l6ZShwcm9jZXNzLmJlc3RfaWRhdF9zaXplKTsKLSAgICB9Ci0KLSAgICAvKiBTdG9wIGhlcmU/ICovCi0gICAgaWYgKCEocHJvY2Vzcy5zdGF0dXMgJiBPVVRQVVRfTkVFRFNfTkVXX0ZJTEUpKQotICAgIHsKLSAgICAgICAgdXNyX3ByaW50ZigiXG4lcyBpcyBhbHJlYWR5IG9wdGltaXplZC5cbiIsIGluZmlsZV9uYW1lX2xvY2FsKTsKLSAgICAgICAgaWYgKCFuZXdfb3V0ZmlsZSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG9wdGlvbnMuc2ltdWxhdGUpCi0gICAgewotICAgICAgICB1c3JfcHJpbnRmKCJcbk5vIG91dHB1dDogc2ltdWxhdGlvbiBtb2RlLlxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBNYWtlIHJvb20gZm9yIHRoZSBvdXRwdXQgZmlsZS4gKi8KLSAgICBpZiAobmV3X291dGZpbGUpCi0gICAgewotICAgICAgICB1c3JfcHJpbnRmKCJcbk91dHB1dCBmaWxlOiAlc1xuIiwgb3V0ZmlsZV9uYW1lKTsKLSAgICAgICAgaWYgKG9wdGlvbnMuZGlyX25hbWUgIT0gTlVMTCkKLSAgICAgICAgICAgIG9zeXNfY3JlYXRlX2RpcihvcHRpb25zLmRpcl9uYW1lKTsKLSAgICAgICAgaGFzX2JhY2t1cCA9IDA7Ci0gICAgICAgIGlmIChvc3lzX3Rlc3Qob3V0ZmlsZV9uYW1lLCAiZSIpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvc3lzX3JlbmFtZShvdXRmaWxlX25hbWUsIGJha2ZpbGVfbmFtZSwgb3B0aW9ucy5jbG9iYmVyKSAhPSAwKQotICAgICAgICAgICAgICAgIFRocm93ICJDYW4ndCBiYWNrIHVwIHRoZSBvdXRwdXQgZmlsZSI7Ci0gICAgICAgICAgICBoYXNfYmFja3VwID0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAob3N5c19yZW5hbWUoaW5maWxlX25hbWVfbG9jYWwsIGJha2ZpbGVfbmFtZSwgb3B0aW9ucy5jbG9iYmVyKSAhPSAwKQotICAgICAgICAgICAgVGhyb3cgIkNhbid0IGJhY2sgdXAgdGhlIGlucHV0IGZpbGUiOwotICAgICAgICBoYXNfYmFja3VwID0gMTsKLSAgICB9Ci0KLSAgICBvdXRmaWxlID0gZm9wZW4ob3V0ZmlsZV9uYW1lLCAid2IiKTsKLSAgICBUcnkKLSAgICB7Ci0gICAgICAgIGlmIChvdXRmaWxlID09IE5VTEwpCi0gICAgICAgICAgICBUaHJvdyAiQ2FuJ3Qgb3BlbiB0aGUgb3V0cHV0IGZpbGUiOwotICAgICAgICBpZiAocHJvY2Vzcy5zdGF0dXMgJiBPVVRQVVRfTkVFRFNfTkVXX0lEQVQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFdyaXRlIGEgYnJhbmQgbmV3IFBORyBkYXRhc3RyZWFtIHRvIHRoZSBvdXRwdXQuICovCi0gICAgICAgICAgICBvcG5nX3dyaXRlX2ZpbGUob3V0ZmlsZSwKLSAgICAgICAgICAgICAgICBwcm9jZXNzLmJlc3RfY29tcHJfbGV2ZWwsIHByb2Nlc3MuYmVzdF9tZW1fbGV2ZWwsCi0gICAgICAgICAgICAgICAgcHJvY2Vzcy5iZXN0X3N0cmF0ZWd5LCBwcm9jZXNzLmJlc3RfZmlsdGVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvcHkgdGhlIGlucHV0IFBORyBkYXRhc3RyZWFtIHRvIHRoZSBvdXRwdXQuICovCi0gICAgICAgICAgICBpbmZpbGUgPQotICAgICAgICAgICAgICAgIGZvcGVuKChuZXdfb3V0ZmlsZSA/IGluZmlsZV9uYW1lX2xvY2FsIDogYmFrZmlsZV9uYW1lKSwgInJiIik7Ci0gICAgICAgICAgICBpZiAoaW5maWxlID09IE5VTEwpCi0gICAgICAgICAgICAgICAgVGhyb3cgIkNhbid0IHJlb3BlbiB0aGUgaW5wdXQgZmlsZSI7Ci0gICAgICAgICAgICBUcnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5pbl9kYXRhc3RyZWFtX29mZnNldCA+IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgb3N5c19mc2Vla28oaW5maWxlLCBwcm9jZXNzLmluX2RhdGFzdHJlYW1fb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VFS19TRVQpICE9IDApCi0gICAgICAgICAgICAgICAgICAgIFRocm93ICJDYW4ndCByZXBvc2l0aW9uIHRoZSBpbnB1dCBmaWxlIjsKLSAgICAgICAgICAgICAgICBwcm9jZXNzLmJlc3RfaWRhdF9zaXplID0gcHJvY2Vzcy5pbl9pZGF0X3NpemU7Ci0gICAgICAgICAgICAgICAgb3BuZ19jb3B5X2ZpbGUoaW5maWxlLCBvdXRmaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENhdGNoIChlcnJfbXNnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9QTkdfRU5TVVJFKGVycl9tc2cgIT0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXlzdGVyaW91cyBlcnJvciBpbiBvcG5nX2NvcHlfZmlsZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmNsb3NlKGluZmlsZSk7ICAvKiBmaW5hbGx5ICovCi0gICAgICAgICAgICBpZiAoZXJyX21zZyAhPSBOVUxMKQotICAgICAgICAgICAgICAgIFRocm93IGVycl9tc2c7ICAvKiByZXRocm93ICovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgQ2F0Y2ggKGVycl9tc2cpCi0gICAgewotICAgICAgICBpZiAob3V0ZmlsZSAhPSBOVUxMKQotICAgICAgICAgICAgZmNsb3NlKG91dGZpbGUpOwotICAgICAgICAvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBpbnB1dCBmaWxlIGFuZCByZXRocm93IHRoZSBleGNlcHRpb24uICovCi0gICAgICAgIGlmIChoYXNfYmFja3VwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob3N5c19yZW5hbWUoYmFrZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXdfb3V0ZmlsZSA/IG91dGZpbGVfbmFtZSA6IGluZmlsZV9uYW1lX2xvY2FsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSAhPSAwKQotICAgICAgICAgICAgICAgIG9wbmdfcHJpbnRfd2FybmluZygKLSAgICAgICAgICAgICAgICAgICAgIkNhbid0IHJlY292ZXIgdGhlIG9yaWdpbmFsIGZpbGUgZnJvbSBiYWNrdXAiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9QTkdfRU5TVVJFKG5ld19vdXRmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIk92ZXJ3cm90ZSBpbnB1dCB3aXRoIG5vIHRlbXBvcmFyeSBiYWNrdXAiKTsKLSAgICAgICAgICAgIGlmIChvc3lzX3VubGluayhvdXRmaWxlX25hbWUpICE9IDApCi0gICAgICAgICAgICAgICAgb3BuZ19wcmludF93YXJuaW5nKCJDYW4ndCByZW1vdmUgdGhlIGJyb2tlbiBvdXRwdXQgZmlsZSIpOwotICAgICAgICB9Ci0gICAgICAgIFRocm93IGVycl9tc2c7ICAvKiByZXRocm93ICovCi0gICAgfQotICAgIC8qIGFzc2VydChlcnJfbXNnID09IE5VTEwpOyAqLwotICAgIGZjbG9zZShvdXRmaWxlKTsKLQotICAgIC8qIFByZXNlcnZlIGZpbGUgYXR0cmlidXRlcyAoZS5nLiBvd25lcnNoaXAsIGFjY2VzcyByaWdodHMsIHRpbWUgc3RhbXBzKQotICAgICAqIG9uIHJlcXVlc3QsIGlmIHBvc3NpYmxlLgotICAgICAqLwotICAgIGlmIChvcHRpb25zLnByZXNlcnZlKQotICAgICAgICBvc3lzX2NvcHlfYXR0cigobmV3X291dGZpbGUgPyBpbmZpbGVfbmFtZV9sb2NhbCA6IGJha2ZpbGVfbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGVfbmFtZSk7Ci0KLSAgICAvKiBSZW1vdmUgdGhlIGJhY2t1cCBmaWxlIGlmIGl0IGlzIG5vdCBuZWVkZWQuICovCi0gICAgaWYgKCFuZXdfb3V0ZmlsZSAmJiAhb3B0aW9ucy5iYWNrdXApCi0gICAgewotICAgICAgICBpZiAob3N5c191bmxpbmsoYmFrZmlsZV9uYW1lKSAhPSAwKQotICAgICAgICAgICAgb3BuZ19wcmludF93YXJuaW5nKCJDYW4ndCByZW1vdmUgdGhlIGJhY2t1cCBmaWxlIik7Ci0gICAgfQotCi0gICAgLyogRGlzcGxheSB0aGUgb3V0cHV0IElEQVQvZmlsZSBzaXplcy4gKi8KLSAgICB1c3JfcHJpbnRmKCJcbk91dHB1dCBJREFUIHNpemUgPSAlIiBPU1lTX0ZTSVpFX1BSSXUgIiBieXRlcyIsCi0gICAgICAgICAgICAgICBwcm9jZXNzLm91dF9pZGF0X3NpemUpOwotICAgIGlmIChwcm9jZXNzLnN0YXR1cyAmIElOUFVUX0hBU19QTkdfREFUQVNUUkVBTSkKLSAgICB7Ci0gICAgICAgIHVzcl9wcmludGYoIiAoIik7Ci0gICAgICAgIG9wbmdfcHJpbnRfZnNpemVfZGlmZmVyZW5jZShwcm9jZXNzLmluX2lkYXRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3Mub3V0X2lkYXRfc2l6ZSwgMCk7Ci0gICAgICAgIHVzcl9wcmludGYoIikiKTsKLSAgICB9Ci0gICAgdXNyX3ByaW50ZigiXG5PdXRwdXQgZmlsZSBzaXplID0gJSIgT1NZU19GU0laRV9QUkl1ICIgYnl0ZXMgKCIsCi0gICAgICAgICAgICAgICBwcm9jZXNzLm91dF9maWxlX3NpemUpOwotICAgIG9wbmdfcHJpbnRfZnNpemVfZGlmZmVyZW5jZShwcm9jZXNzLmluX2ZpbGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5vdXRfZmlsZV9zaXplLCAxKTsKLSAgICB1c3JfcHJpbnRmKCIpXG4iKTsKLX0KLQotLyoKLSAqIEVuZ2luZSBpbml0aWFsaXphdGlvbgotICovCi1pbnQKLW9wbmdfaW5pdGlhbGl6ZShjb25zdCBzdHJ1Y3Qgb3BuZ19vcHRpb25zICppbml0X29wdGlvbnMsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG9wbmdfdWkgKmluaXRfdWkpCi17Ci0gICAgLyogSW5pdGlhbGl6ZSBhbmQgY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSB1c2VyIGludGVyZmFjZS4gKi8KLSAgICB1c3JfcHJpbnRmICAgICAgPSBpbml0X3VpLT5wcmludGZfZm47Ci0gICAgdXNyX3ByaW50X2NudHJsID0gaW5pdF91aS0+cHJpbnRfY250cmxfZm47Ci0gICAgdXNyX3Byb2dyZXNzICAgID0gaW5pdF91aS0+cHJvZ3Jlc3NfZm47Ci0gICAgdXNyX3BhbmljICAgICAgID0gaW5pdF91aS0+cGFuaWNfZm47Ci0gICAgaWYgKHVzcl9wcmludGYgPT0gTlVMTCAgICAgIHx8Ci0gICAgICAgIHVzcl9wcmludF9jbnRybCA9PSBOVUxMIHx8Ci0gICAgICAgIHVzcl9wcm9ncmVzcyA9PSBOVUxMICAgIHx8Ci0gICAgICAgIHVzcl9wYW5pYyA9PSBOVUxMKQotICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIEluaXRpYWxpemUgYW5kIGFkanVzdCB0aGUgdXNlciBvcHRpb25zLiAqLwotICAgIG9wdGlvbnMgPSAqaW5pdF9vcHRpb25zOwotICAgIGlmIChvcHRpb25zLm9wdGltX2xldmVsID09IDApCi0gICAgewotICAgICAgICBvcHRpb25zLm5iID0gb3B0aW9ucy5uYyA9IG9wdGlvbnMubnAgPSAxOwotICAgICAgICBvcHRpb25zLm56ID0gMTsKLSAgICB9Ci0KLSAgICAvKiBTdGFydCB0aGUgZW5naW5lLiAqLwotICAgIG1lbXNldCgmc3VtbWFyeSwgMCwgc2l6ZW9mKHN1bW1hcnkpKTsKLSAgICBlbmdpbmUuc3RhcnRlZCA9IDE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBFbmdpbmUgZXhlY3V0aW9uCi0gKi8KLWludAotb3BuZ19vcHRpbWl6ZShjb25zdCBjaGFyICppbmZpbGVfbmFtZSkKLXsKLSAgICBjb25zdCBjaGFyICplcnJfbXNnOwotICAgIHZvbGF0aWxlIGludCByZXN1bHQ7ICAvKiB2b2xhdGlsZSBub3QgbmVlZGVkLCBidXQga2VlcHMgY29tcGlsZXJzIGhhcHB5ICovCi0KLSAgICBPUE5HX0VOU1VSRShlbmdpbmUuc3RhcnRlZCwgIlRoZSBPcHRpUE5HIGVuZ2luZSBpcyBub3QgcnVubmluZyIpOwotCi0gICAgdXNyX3ByaW50ZigiKiogUHJvY2Vzc2luZzogJXNcbiIsIGluZmlsZV9uYW1lKTsKLSAgICArK3N1bW1hcnkuZmlsZV9jb3VudDsKLSAgICBvcG5nX2NsZWFyX2ltYWdlX2luZm8oKTsKLSAgICBUcnkKLSAgICB7Ci0gICAgICAgIG9wbmdfb3B0aW1pemVfaW1wbChpbmZpbGVfbmFtZSk7Ci0gICAgICAgIGlmIChwcm9jZXNzLnN0YXR1cyAmIElOUFVUX0hBU19FUlJPUlMpCi0gICAgICAgIHsKLSAgICAgICAgICAgICsrc3VtbWFyeS5lcnJfY291bnQ7Ci0gICAgICAgICAgICArK3N1bW1hcnkuZml4X2NvdW50OwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9jZXNzLnN0YXR1cyAmIElOUFVUX0hBU19NVUxUSVBMRV9JTUFHRVMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvcHRpb25zLnNuaXApCi0gICAgICAgICAgICAgICAgKytzdW1tYXJ5LnNuaXBfY291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gMDsKLSAgICB9Ci0gICAgQ2F0Y2ggKGVycl9tc2cpCi0gICAgewotICAgICAgICArK3N1bW1hcnkuZXJyX2NvdW50OwotICAgICAgICBvcG5nX3ByaW50X2Vycm9yKGVycl9tc2cpOwotICAgICAgICByZXN1bHQgPSAtMTsKLSAgICB9Ci0gICAgb3BuZ19kZXN0cm95X2ltYWdlX2luZm8oKTsKLSAgICB1c3JfcHJpbnRmKCJcbiIpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi0gKiBFbmdpbmUgZmluYWxpemF0aW9uCi0gKi8KLWludAotb3BuZ19maW5hbGl6ZSh2b2lkKQotewotICAgIC8qIFByaW50IHRoZSBzdGF0dXMgcmVwb3J0LiAqLwotICAgIGlmIChvcHRpb25zLnZlcmJvc2UgfHwgc3VtbWFyeS5zbmlwX2NvdW50ID4gMCB8fCBzdW1tYXJ5LmVycl9jb3VudCA+IDApCi0gICAgewotICAgICAgICB1c3JfcHJpbnRmKCIqKiBTdGF0dXMgcmVwb3J0XG4iKTsKLSAgICAgICAgdXNyX3ByaW50ZigiJXUgZmlsZShzKSBoYXZlIGJlZW4gcHJvY2Vzc2VkLlxuIiwgc3VtbWFyeS5maWxlX2NvdW50KTsKLSAgICAgICAgaWYgKHN1bW1hcnkuc25pcF9jb3VudCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzcl9wcmludGYoIiV1IG11bHRpLWltYWdlIGZpbGUocykgaGF2ZSBiZWVuIHNuaXBwZWQuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5LnNuaXBfY291bnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdW1tYXJ5LmVycl9jb3VudCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzcl9wcmludGYoIiV1IGVycm9yKHMpIGhhdmUgYmVlbiBlbmNvdW50ZXJlZC5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkuZXJyX2NvdW50KTsKLSAgICAgICAgICAgIGlmIChzdW1tYXJ5LmZpeF9jb3VudCA+IDApCi0gICAgICAgICAgICAgICAgdXNyX3ByaW50ZigiJXUgZXJyb25lb3VzIGZpbGUocykgaGF2ZSBiZWVuIGZpeGVkLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkuZml4X2NvdW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFN0b3AgdGhlIGVuZ2luZS4gKi8KLSAgICBlbmdpbmUuc3RhcnRlZCA9IDA7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zcmMvb3B0aXBuZy9vcHRpcG5nLmMgYi9zcmMvb3B0aXBuZy9vcHRpcG5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YjdiZDAuLjAwMDAwMDAKLS0tIGEvc3JjL29wdGlwbmcvb3B0aXBuZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAwOSArMCwwIEBACi0vKgotICogT3B0aVBORzogQWR2YW5jZWQgUE5HIG9wdGltaXphdGlvbiBwcm9ncmFtLgotICogaHR0cDovL29wdGlwbmcuc291cmNlZm9yZ2UubmV0LwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDEyIENvc21pbiBUcnV0YSBhbmQgdGhlIENvbnRyaWJ1dGluZyBBdXRob3JzLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHpsaWIgbGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgdGhlIGF0dGFjaGVkIExJQ0VOU0UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogUE5HIG9wdGltaXphdGlvbiBpcyBkZXNjcmliZWQgaW4gZGV0YWlsIGluIHRoZSBQTkctVGVjaCBhcnRpY2xlCi0gKiAiQSBndWlkZSB0byBQTkcgb3B0aW1pemF0aW9uIgotICogaHR0cDovL29wdGlwbmcuc291cmNlZm9yZ2UubmV0L3BuZ3RlY2gvcG5nX29wdGltaXphdGlvbi5odG1sCi0gKgotICogVGhlIGlkZWEgb2YgcnVubmluZyBtdWx0aXBsZSBjb21wcmVzc2lvbiB0cmlhbHMgd2l0aCBkaWZmZXJlbnQKLSAqIFBORyBmaWx0ZXJzIGFuZCB6bGliIHBhcmFtZXRlcnMgaXMgaW5zcGlyZWQgZnJvbSB0aGUgcG5nY3J1c2gKLSAqIHByb2dyYW0gYnkgR2xlbm4gUmFuZGVycy1QZWhyc29uLgotICogVGhlIGlkZWEgb2YgcGVyZm9ybWluZyBsb3NzbGVzcyBpbWFnZSByZWR1Y3Rpb25zIGlzIGluc3BpcmVkCi0gKiBmcm9tIHRoZSBwbmdyZXdyaXRlIHByb2dyYW0gYnkgSmFzb24gU3VtbWVycy4KLSAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJvcHRpcG5nLmgiCi0jaW5jbHVkZSAicHJvZ2luZm8uaCIKLQotI2luY2x1ZGUgImNiaXRzZXQuaCIKLSNpbmNsdWRlICJvc3lzLmgiCi0jaW5jbHVkZSAicG5nLmgiCi0jaW5jbHVkZSAicG5neHV0aWwuaCIKLSNpbmNsdWRlICJ6bGliLmgiCi0KLQotc3RhdGljIGNvbnN0IGNoYXIgKm1zZ19pbnRybyA9Ci0gICAgUFJPR1JBTV9OQU1FICIgdmVyc2lvbiAiIFBST0dSQU1fVkVSU0lPTiAiXG4iCi0gICAgUFJPR1JBTV9DT1BZUklHSFQgIi5cbiI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICptc2dfbGljZW5zZSA9Ci0gICAgIlRoaXMgcHJvZ3JhbSBpcyBvcGVuLXNvdXJjZSBzb2Z0d2FyZS4gU2VlIExJQ0VOU0UgZm9yIG1vcmUgZGV0YWlscy5cbiIKLSAgICAiXG4iCi0gICAgIlBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIGluIHBhcnQgb24gdGhlIHdvcmsgb2Y6XG4iCi0gICAgIiAgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlciAoemxpYilcbiIKLSAgICAiICBHbGVubiBSYW5kZXJzLVBlaHJzb24gYW5kIHRoZSBQTkcgRGV2ZWxvcG1lbnQgR3JvdXAgKGxpYnBuZylcbiIKLSAgICAiICBNaXlhc2FrYSBNYXNhcnUgKEJNUCBzdXBwb3J0KVxuIgotICAgICIgIERhdmlkIEtvYmxhcyAoR0lGIHN1cHBvcnQpXG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciAqbXNnX2hlbHBfc3lub3BzaXMgPQotICAgICJTeW5vcHNpczpcbiIKLSAgICAiICAgIG9wdGlwbmcgW29wdGlvbnNdIGZpbGVzIC4uLlxuIgotICAgICJGaWxlczpcbiIKLSAgICAiICAgIEltYWdlIGZpbGVzIG9mIHR5cGU6IFBORywgQk1QLCBHSUYsIFBOTSBvciBUSUZGXG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciAqbXNnX2hlbHBfYmFzaWNfb3B0aW9ucyA9Ci0gICAgIkJhc2ljIG9wdGlvbnM6XG4iCi0gICAgIiAgICAtPywgLWgsIC1oZWxwXHRzaG93IHRoZSBleHRlbmRlZCBoZWxwXG4iCi0gICAgIiAgICAtbyA8bGV2ZWw+XHRcdG9wdGltaXphdGlvbiBsZXZlbCAoMC03KVx0XHRbZGVmYXVsdDogMl1cbiIKLSAgICAiICAgIC12XHRcdFx0cnVuIGluIHZlcmJvc2UgbW9kZSAvIHNob3cgY29weXJpZ2h0IGFuZCB2ZXJzaW9uIGluZm9cbiI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICptc2dfaGVscF9vcHRpb25zID0KLSAgICAiQmFzaWMgb3B0aW9uczpcbiIKLSAgICAiICAgIC0/LCAtaCwgLWhlbHBcdHNob3cgdGhpcyBoZWxwXG4iCi0gICAgIiAgICAtbyA8bGV2ZWw+XHRcdG9wdGltaXphdGlvbiBsZXZlbCAoMC03KVx0XHRbZGVmYXVsdDogMl1cbiIKLSAgICAiICAgIC12XHRcdFx0cnVuIGluIHZlcmJvc2UgbW9kZSAvIHNob3cgY29weXJpZ2h0IGFuZCB2ZXJzaW9uIGluZm9cbiIKLSAgICAiR2VuZXJhbCBvcHRpb25zOlxuIgotICAgICIgICAgLWJhY2t1cCwgLWtlZXBcdGtlZXAgYSBiYWNrdXAgb2YgdGhlIG1vZGlmaWVkIGZpbGVzXG4iCi0gICAgIiAgICAtY2xvYmJlclx0XHRvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXNcbiIKLSNpZiAwICAvKiBpbnRlcm5hbCAqLwotICAgICIgICAgLWRlYnVnXHRcdGVuYWJsZSBkZWJ1ZyBmZWF0dXJlc1xuIgotI2VuZGlmCi0gICAgIiAgICAtZml4XHRcdGVuYWJsZSBlcnJvciByZWNvdmVyeVxuIgotICAgICIgICAgLWZvcmNlXHRcdGVuZm9yY2Ugd3JpdGluZyBvZiBhIG5ldyBvdXRwdXQgZmlsZVxuIgotICAgICIgICAgLXByZXNlcnZlXHRcdHByZXNlcnZlIGZpbGUgYXR0cmlidXRlcyBpZiBwb3NzaWJsZVxuIgotICAgICIgICAgLXF1aWV0LCAtc2lsZW50XHRydW4gaW4gcXVpZXQgbW9kZVxuIgotICAgICIgICAgLXNpbXVsYXRlXHRcdHJ1biBpbiBzaW11bGF0aW9uIG1vZGVcbiIKLSAgICAiICAgIC1vdXQgPGZpbGU+XHRcdHdyaXRlIG91dHB1dCBmaWxlIHRvIDxmaWxlPlxuIgotICAgICIgICAgLWRpciA8ZGlyZWN0b3J5Plx0d3JpdGUgb3V0cHV0IGZpbGUocykgdG8gPGRpcmVjdG9yeT5cbiIKLSAgICAiICAgIC1sb2cgPGZpbGU+XHRcdGxvZyBtZXNzYWdlcyB0byA8ZmlsZT5cbiIKLSAgICAiICAgIC0tXHRcdFx0c3RvcCBvcHRpb24gc3dpdGNoIHBhcnNpbmdcbiIKLSAgICAiT3B0aW1pemF0aW9uIG9wdGlvbnM6XG4iCi0gICAgIiAgICAtZiA8ZmlsdGVycz5cdFBORyBkZWx0YSBmaWx0ZXJzICgwLTUpXHRcdFx0W2RlZmF1bHQ6IDAsNV1cbiIKLSAgICAiICAgIC1pIDx0eXBlPlx0XHRQTkcgaW50ZXJsYWNlIHR5cGUgKDAtMSlcbiIKLSAgICAiICAgIC16YyA8bGV2ZWxzPlx0emxpYiBjb21wcmVzc2lvbiBsZXZlbHMgKDEtOSlcdFx0W2RlZmF1bHQ6IDldXG4iCi0gICAgIiAgICAtem0gPGxldmVscz5cdHpsaWIgbWVtb3J5IGxldmVscyAoMS05KVx0XHRbZGVmYXVsdDogOF1cbiIKLSAgICAiICAgIC16cyA8c3RyYXRlZ2llcz5cdHpsaWIgY29tcHJlc3Npb24gc3RyYXRlZ2llcyAoMC0zKVx0W2RlZmF1bHQ6IDAtM11cbiIKLSAgICAiICAgIC16dyA8c2l6ZT5cdFx0emxpYiB3aW5kb3cgc2l6ZSAoMjU2LDUxMiwxaywyayw0ayw4aywxNmssMzJrKVxuIgotICAgICIgICAgLWZ1bGxcdFx0cHJvZHVjZSBhIGZ1bGwgcmVwb3J0IG9uIElEQVQgKG1pZ2h0IHJlZHVjZSBzcGVlZClcbiIKLSAgICAiICAgIC1uYlx0XHRcdG5vIGJpdCBkZXB0aCByZWR1Y3Rpb25cbiIKLSAgICAiICAgIC1uY1x0XHRcdG5vIGNvbG9yIHR5cGUgcmVkdWN0aW9uXG4iCi0gICAgIiAgICAtbnBcdFx0XHRubyBwYWxldHRlIHJlZHVjdGlvblxuIgotICAgICIgICAgLW54XHRcdFx0bm8gcmVkdWN0aW9uc1xuIgotICAgICIgICAgLW56XHRcdFx0bm8gSURBVCByZWNvZGluZ1xuIgotICAgICJFZGl0aW5nIG9wdGlvbnM6XG4iCi0gICAgIiAgICAtc25pcFx0XHRjdXQgb25lIGltYWdlIG91dCBvZiBtdWx0aS1pbWFnZSBvciBhbmltYXRpb24gZmlsZXNcbiIKLSAgICAiICAgIC1zdHJpcCA8b2JqZWN0cz5cdHN0cmlwIG1ldGFkYXRhIG9iamVjdHMgKGUuZy4gXCJhbGxcIilcbiIKLSAgICAiT3B0aW1pemF0aW9uIGxldmVsczpcbiIKLSAgICAiICAgIC1vMFx0XHQ8PT5cdC1vMSAtbnggLW56XHRcdFx0XHQoMCBvciAxIHRyaWFscylcbiIKLSAgICAiICAgIC1vMVx0XHQ8PT5cdC16YzkgLXptOCAtenMwIC1mMFx0XHRcdCgxIHRyaWFsKVxuIgotICAgICIgICAgXHRcdChvci4uLilcdC16YzkgLXptOCAtenMxIC1mNVx0XHRcdCgxIHRyaWFsKVxuIgotICAgICIgICAgLW8yXHRcdDw9Plx0LXpjOSAtem04IC16czAtMyAtZjAsNVx0XHRcdCg4IHRyaWFscylcbiIKLSAgICAiICAgIC1vM1x0XHQ8PT5cdC16YzkgLXptOC05IC16czAtMyAtZjAsNVx0XHQoMTYgdHJpYWxzKVxuIgotICAgICIgICAgLW80XHRcdDw9Plx0LXpjOSAtem04IC16czAtMyAtZjAtNVx0XHRcdCgyNCB0cmlhbHMpXG4iCi0gICAgIiAgICAtbzVcdFx0PD0+XHQtemM5IC16bTgtOSAtenMwLTMgLWYwLTVcdFx0KDQ4IHRyaWFscylcbiIKLSAgICAiICAgIC1vNlx0XHQ8PT5cdC16YzEtOSAtem04IC16czAtMyAtZjAtNVx0XHQoMTIwIHRyaWFscylcbiIKLSAgICAiICAgIC1vN1x0XHQ8PT5cdC16YzEtOSAtem04LTkgLXpzMC0zIC1mMC01XHRcdCgyNDAgdHJpYWxzKVxuIgotICAgICIgICAgLW83IC16bTEtOVx0PD0+XHQtemMxLTkgLXptMS05IC16czAtMyAtZjAtNVx0XHQoMTA4MCB0cmlhbHMpXG4iCi0gICAgIk5vdGVzOlxuIgotICAgICIgICAgVGhlIGNvbWJpbmF0aW9uIGZvciAtbzEgaXMgY2hvc2VuIGhldXJpc3RpY2FsbHkuXG4iCi0gICAgIiAgICBFeGhhdXN0aXZlIGNvbWJpbmF0aW9ucyBzdWNoIGFzIFwiLW83IC16bTEtOVwiIGFyZSBub3QgZ2VuZXJhbGx5IHJlY29tbWVuZGVkLlxuIjsKLQotc3RhdGljIGNvbnN0IGNoYXIgKm1zZ19oZWxwX2V4YW1wbGVzID0KLSAgICAiRXhhbXBsZXM6XG4iCi0gICAgIiAgICBvcHRpcG5nIGZpbGUucG5nXHRcdFx0XHRcdFx0KGRlZmF1bHQgc3BlZWQpXG4iCi0gICAgIiAgICBvcHRpcG5nIC1vNSBmaWxlLnBuZ1x0XHRcdFx0XHQoc2xvdylcbiIKLSAgICAiICAgIG9wdGlwbmcgLW83IGZpbGUucG5nXHRcdFx0XHRcdCh2ZXJ5IHNsb3cpXG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciAqbXNnX2hlbHBfbW9yZSA9Ci0gICAgIlR5cGUgXCJvcHRpcG5nIC1oXCIgZm9yIGV4dGVuZGVkIGhlbHAuXG4iOwotCi0KLXN0YXRpYyBlbnVtCi17Ci0gICAgT1BfUlVOLAotICAgIE9QX1NIT1dfSEVMUCwKLSAgICBPUF9TSE9XX1ZFUlNJT04KLX0gb3BlcmF0aW9uOwotCi1zdGF0aWMgc3RydWN0Ci17Ci0gICAgaW50IGhlbHA7Ci0gICAgaW50IHZlcnNpb247Ci19IGxvY2FsX29wdGlvbnM7Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3BuZ19vcHRpb25zIG9wdGlvbnM7Ci0KLXN0YXRpYyBGSUxFICpjb25fZmlsZTsKLXN0YXRpYyBGSUxFICpsb2dfZmlsZTsKLQotc3RhdGljIGludCBzdGFydF9vZl9saW5lOwotCi0KLS8qCi0gKiBFcnJvciBoYW5kbGluZwotICovCi1zdGF0aWMgdm9pZAotZXJyb3IoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcmdfcHRyOwotCi0gICAgLyogUHJpbnQgdGhlIGVycm9yIG1lc3NhZ2UgdG8gc3RkZXJyIGFuZCBleGl0LiAqLwotICAgIGZwcmludGYoc3RkZXJyLCAiKiogRXJyb3I6ICIpOwotICAgIHZhX3N0YXJ0KGFyZ19wdHIsIGZtdCk7Ci0gICAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ19wdHIpOwotICAgIHZhX2VuZChhcmdfcHRyKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCi0vKgotICogUGFuaWMgaGFuZGxpbmcKLSAqLwotc3RhdGljIHZvaWQKLXBhbmljKGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgICAvKiBQcmludCB0aGUgcGFuaWMgbWVzc2FnZSB0byBzdGRlcnIgYW5kIHRlcm1pbmF0ZSBhYm5vcm1hbGx5LiAqLwotICAgIGZwcmludGYoc3RkZXJyLCAiXG4qKiBJTlRFUk5BTCBFUlJPUjogJXNcbiIsIG1zZyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJQbGVhc2Ugc3VibWl0IGEgZGVmZWN0IHJlcG9ydC5cbiIgUFJPR1JBTV9VUkkgIlxuXG4iKTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLSAgICBpZiAob3B0aW9ucy5kZWJ1ZykKLSAgICB7Ci0gICAgICAgIC8qIFRlcm1pbmF0ZSBhYm5vcm1hbGx5LCBwb3NzaWJseSB3aXRoIGEgc3RhY2sgdHJhY2Ugb3IgYSBjb3JlIGR1bXAuICovCi0gICAgICAgIGFib3J0KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFRlcm1pbmF0ZSBhYm5vcm1hbGx5LCBjbGVhbmx5LiAqLwotICAgICAgICBvc3lzX3Rlcm1pbmF0ZSgpOwotICAgIH0KLX0KLQotLyoKLSAqIFN0cmluZyB1dGlsaXR5Ci0gKi8KLXN0YXRpYyBpbnQKLW9wbmdfc3RyY2FzZWNtcChjb25zdCBjaGFyICpzdHIxLCBjb25zdCBjaGFyICpzdHIyKQotewotICAgIGludCBjaDEsIGNoMjsKLQotICAgIC8qIFBlcmZvcm0gYSBjYXNlLWluc2Vuc2l0aXZlIHN0cmluZyBjb21wYXJpc29uLiAqLwotICAgIGZvciAoIDsgOyApCi0gICAgewotICAgICAgICBjaDEgPSB0b2xvd2VyKCpzdHIxKyspOwotICAgICAgICBjaDIgPSB0b2xvd2VyKCpzdHIyKyspOwotICAgICAgICBpZiAoY2gxICE9IGNoMikKLSAgICAgICAgICAgIHJldHVybiBjaDEgLSBjaDI7Ci0gICAgICAgIGlmIChjaDEgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAvKiBGSVhNRTogVGhpcyBmdW5jdGlvbiBpcyBub3QgTUJDUy1hd2FyZS4gKi8KLX0KLQotLyoKLSAqIFN0cmluZyB1dGlsaXR5Ci0gKi8KLXN0YXRpYyBjaGFyICoKLW9wbmdfc3RybHRyaW0oY29uc3QgY2hhciAqc3RyKQotewotICAgIC8qIFNraXAgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLiAqLwotICAgIHdoaWxlIChpc3NwYWNlKCpzdHIpKQotICAgICAgICArK3N0cjsKLSAgICByZXR1cm4gKGNoYXIgKilzdHI7Ci19Ci0KLS8qCi0gKiBTdHJpbmcgdXRpbGl0eQotICovCi1zdGF0aWMgY2hhciAqCi1vcG5nX3N0cnRhaWwoY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbnVtKQotewotICAgIHNpemVfdCBsZW47Ci0KLSAgICAvKiBSZXR1cm4gdXAgdG8gbnVtIHJpZ2h0bW9zdCBjaGFyYWN0ZXJzLiAqLwotICAgIGxlbiA9IHN0cmxlbihzdHIpOwotICAgIGlmIChsZW4gPD0gbnVtKQotICAgICAgICByZXR1cm4gKGNoYXIgKilzdHI7Ci0gICAgcmV0dXJuIChjaGFyICopc3RyICsgbGVuIC0gbnVtOwotfQotCi0vKgotICogU3RyaW5nIHV0aWxpdHkKLSAqLwotc3RhdGljIGNoYXIgKgotb3BuZ19zdHJwYnJrX2RpZ2l0KGNvbnN0IGNoYXIgKnN0cikKLXsKLSAgICBmb3IgKCA7IDsgKQotICAgIHsKLSAgICAgICAgaWYgKCpzdHIgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBpZiAoaXNkaWdpdCgqc3RyKSkKLSAgICAgICAgICAgIHJldHVybiAoY2hhciAqKXN0cjsKLSAgICAgICAgKytzdHI7Ci0gICAgfQotfQotCi0vKgotICogU3RyaW5nIGNvbnZlcnNpb24gdXRpbGl0eQotICovCi1zdGF0aWMgaW50Ci1vcG5nX3N0cjJ1bG9uZyh1bnNpZ25lZCBsb25nICpvdXRfdmFsLCBjb25zdCBjaGFyICppbl9zdHIsCi0gICAgICAgICAgICAgICBpbnQgYWxsb3dfbXVsdGlwbGllcikKLXsKLSAgICBjb25zdCBjaGFyICpiZWdpbl9wdHI7Ci0gICAgY2hhciAqZW5kX3B0cjsKLSAgICB1bnNpZ25lZCBsb25nIG11bHRpcGxpZXI7Ci0KLSAgICAvKiBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHJpbmcuICovCi0gICAgLyogRG8gbm90IGFsbG93IHRoZSBtaW51cyBzaWduLCBub3QgZXZlbiBmb3IgLTAuICovCi0gICAgYmVnaW5fcHRyID0gZW5kX3B0ciA9IG9wbmdfc3RybHRyaW0oaW5fc3RyKTsKLSAgICBpZiAoKmJlZ2luX3B0ciA+PSAnMCcgJiYgKmJlZ2luX3B0ciA8PSAnOScpCi0gICAgICAgICpvdXRfdmFsID0gc3RydG91bChiZWdpbl9wdHIsICZlbmRfcHRyLCAxMCk7Ci0gICAgaWYgKGJlZ2luX3B0ciA9PSBlbmRfcHRyKQotICAgIHsKLSAgICAgICAgZXJybm8gPSBFSU5WQUw7ICAvKiBtYXRjaGluZyBmYWlsdXJlICovCi0gICAgICAgICpvdXRfdmFsID0gMDsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmIChhbGxvd19tdWx0aXBsaWVyKQotICAgIHsKLSAgICAgICAgLyogQ2hlY2sgZm9yIHRoZSBmb2xsb3dpbmcgU0kgc3VmZml4ZXM6Ci0gICAgICAgICAqICAgJ0snIG9yICdrJzoga2liaSAoMTAyNCkKLSAgICAgICAgICogICAnTSc6ICAgICAgICBtZWJpICgxMDI0ICogMTAyNCkKLSAgICAgICAgICogICAnRyc6ICAgICAgICBnaWJpICgxMDI0ICogMTAyNCAqIDEwMjQpCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKmVuZF9wdHIgPT0gJ2snIHx8ICplbmRfcHRyID09ICdLJykKLSAgICAgICAgewotICAgICAgICAgICAgKytlbmRfcHRyOwotICAgICAgICAgICAgbXVsdGlwbGllciA9IDEwMjRVTDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgqZW5kX3B0ciA9PSAnTScpCi0gICAgICAgIHsKLSAgICAgICAgICAgICsrZW5kX3B0cjsKLSAgICAgICAgICAgIG11bHRpcGxpZXIgPSAxMDI0VUwgKiAxMDI0VUw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKmVuZF9wdHIgPT0gJ0cnKQotICAgICAgICB7Ci0gICAgICAgICAgICArK2VuZF9wdHI7Ci0gICAgICAgICAgICBtdWx0aXBsaWVyID0gMTAyNFVMICogMTAyNFVMICogMTAyNFVMOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG11bHRpcGxpZXIgPSAxOwotICAgICAgICBpZiAobXVsdGlwbGllciA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgqb3V0X3ZhbCA+IFVMT05HX01BWCAvIG11bHRpcGxpZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJybm8gPSBFUkFOR0U7ICAvKiBvdmVyZmxvdyAqLwotICAgICAgICAgICAgICAgICpvdXRfdmFsID0gVUxPTkdfTUFYOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICpvdXRfdmFsICo9IG11bHRpcGxpZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3IgdHJhaWxpbmcgZ2FyYmFnZS4gKi8KLSAgICBpZiAoKm9wbmdfc3RybHRyaW0oZW5kX3B0cikgIT0gMCkKLSAgICB7Ci0gICAgICAgIGVycm5vID0gRUlOVkFMOyAgLyogZ2FyYmFnZSBpbiBpbnB1dCAqLwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKgotICogU3RyaW5nIGNvbnZlcnNpb24gdXRpbGl0eQotICovCi1zdGF0aWMgaW50Ci1vcG5nX3Jhbmdlc2V0MmJpdHNldChiaXRzZXRfdCAqb3V0X3ZhbCwgY29uc3QgY2hhciAqaW5fc3RyKQotewotICAgIHNpemVfdCBlbmRfaWR4OwotCi0gICAgLyogRXh0cmFjdCB0aGUgYml0c2V0IHZhbHVlIGZyb20gdGhlIHJhbmdlc2V0IHN0cmluZy4gKi8KLSAgICAqb3V0X3ZhbCA9IHJhbmdlc2V0X3N0cmluZ190b19iaXRzZXQoaW5fc3RyLCAmZW5kX2lkeCk7Ci0gICAgaWYgKGVuZF9pZHggPT0gMCB8fCAqb3BuZ19zdHJsdHJpbShpbl9zdHIgKyBlbmRfaWR4KSAhPSAwKQotICAgIHsKLSAgICAgICAgZXJybm8gPSBFSU5WQUw7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDb21tYW5kIGxpbmUgdXRpbGl0eQotICovCi1zdGF0aWMgdm9pZAotZXJyX29wdGlvbl9hcmcoY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICpvcHRfYXJnKQotewotICAgIC8qIElzc3VlIGFuIGVycm9yIHJlZ2FyZGluZyB0aGUgaW5jb3JyZWN0IHZhbHVlIG9mIHRoZSBvcHRpb24gYXJndW1lbnQuICovCi0gICAgaWYgKG9wdF9hcmcgPT0gTlVMTCB8fCAqb3BuZ19zdHJsdHJpbShvcHRfYXJnKSA9PSAwKQotICAgICAgICBlcnJvcigiTWlzc2luZyBhcmd1bWVudCBmb3Igb3B0aW9uICVzIiwgb3B0KTsKLSAgICBlbHNlCi0gICAgICAgIGVycm9yKCJJbnZhbGlkIGFyZ3VtZW50IGZvciBvcHRpb24gJXM6ICVzIiwgb3B0LCBvcHRfYXJnKTsKLX0KLQotLyoKLSAqIENvbW1hbmQgbGluZSB1dGlsaXR5Ci0gKi8KLXN0YXRpYyBpbnQKLWNoZWNrX251bV9vcHRpb24oY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICpvcHRfYXJnLAotICAgICAgICAgICAgICAgICBpbnQgbG93ZXN0LCBpbnQgaGlnaGVzdCkKLXsKLSAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotCi0gICAgLyogRXh0cmFjdCB0aGUgbnVtZXJpYyB2YWx1ZSBmcm9tIHRoZSBvcHRpb24gYXJndW1lbnQuICovCi0gICAgaWYgKG9wbmdfc3RyMnVsb25nKCZ2YWx1ZSwgb3B0X2FyZywgMCkgIT0gMCB8fAotICAgICAgICAgICAgdmFsdWUgPiBJTlRfTUFYIHx8IChpbnQpdmFsdWUgPCBsb3dlc3QgfHwgKGludCl2YWx1ZSA+IGhpZ2hlc3QpCi0gICAgICAgIGVycl9vcHRpb25fYXJnKG9wdCwgb3B0X2FyZyk7Ci0gICAgcmV0dXJuIChpbnQpdmFsdWU7Ci19Ci0KLS8qCi0gKiBDb21tYW5kIGxpbmUgdXRpbGl0eQotICovCi1zdGF0aWMgaW50Ci1jaGVja19wb3dlcjJfb3B0aW9uKGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqb3B0X2FyZywKLSAgICAgICAgICAgICAgICAgICAgaW50IGxvd2VzdCwgaW50IGhpZ2hlc3QpCi17Ci0gICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgLyogRXh0cmFjdCB0aGUgZXhhY3QgbG9nMiBvZiB0aGUgbnVtZXJpYyB2YWx1ZSBmcm9tIHRoZSBvcHRpb24gYXJndW1lbnQuICovCi0gICAgLyogQWxsb3cgdGhlICdrJywgJ00nLCAnRycgc3VmZml4ZXMuICovCi0gICAgaWYgKG9wbmdfc3RyMnVsb25nKCZ2YWx1ZSwgb3B0X2FyZywgMSkgPT0gMCkKLSAgICB7Ci0gICAgICAgIGlmIChsb3dlc3QgPCAwKQotICAgICAgICAgICAgbG93ZXN0ID0gMDsKLSAgICAgICAgaWYgKGhpZ2hlc3QgPiAoaW50KShDSEFSX0JJVCAqIHNpemVvZihsb25nKSAtIDIpKQotICAgICAgICAgICAgaGlnaGVzdCA9IChpbnQpKENIQVJfQklUICogc2l6ZW9mKGxvbmcpIC0gMik7Ci0gICAgICAgIGZvciAocmVzdWx0ID0gbG93ZXN0OyByZXN1bHQgPD0gaGlnaGVzdDsgKytyZXN1bHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoMVVMIDw8IHJlc3VsdCkgPT0gdmFsdWUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlcnJfb3B0aW9uX2FyZyhvcHQsIG9wdF9hcmcpOwotICAgIHJldHVybiAtMTsKLX0KLQotLyoKLSAqIENvbW1hbmQgbGluZSB1dGlsaXR5Ci0gKi8KLXN0YXRpYyBiaXRzZXRfdAotY2hlY2tfcmFuZ2VzZXRfb3B0aW9uKGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqb3B0X2FyZywKLSAgICAgICAgICAgICAgICAgICAgICBiaXRzZXRfdCByZXN1bHRfbWFzaykKLXsKLSAgICBiaXRzZXRfdCByZXN1bHQ7Ci0KLSAgICAvKiBFeHRyYWN0IHRoZSByYW5nZXNldCBmcm9tIHRoZSBvcHRpb24gYXJndW1lbnQuICovCi0gICAgaWYgKG9wbmdfcmFuZ2VzZXQyYml0c2V0KCZyZXN1bHQsIG9wdF9hcmcpID09IDApCi0gICAgICAgIHJlc3VsdCAmPSByZXN1bHRfbWFzazsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IEJJVFNFVF9FTVBUWTsKLSAgICBpZiAocmVzdWx0ID09IEJJVFNFVF9FTVBUWSkKLSAgICAgICAgZXJyX29wdGlvbl9hcmcob3B0LCBvcHRfYXJnKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICogQ29tbWFuZCBsaW5lIHV0aWxpdHkKLSAqLwotc3RhdGljIHZvaWQKLWNoZWNrX29ial9vcHRpb24oY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICpvcHRfYXJnKQotewotICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgaWYgKHN0cmNtcCgiYWxsIiwgb3B0X2FyZykgPT0gMCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLyogSXNzdWUgYW4gZXJyb3IgYWJvdXQgdGhlIHVucmVjb2duaXplZCBvcHRpb24gYXJndW1lbnQuICovCi0gICAgLyogTWFrZSBpdCBzcGVjaWZpYyBvbiB3aGV0aGVyIHRoaXMgYXJndW1lbnQgaXMgYSBjaHVuayBuYW1lLiAqLwotICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpCi0gICAgewotICAgICAgICAvKiBEbyBub3QgdXNlIGlzYWxwaGEoKSwgYmVjYXVzZSBpdCBpcyBsb2NhbGUtZGVwZW5kZW50LiAqLwotICAgICAgICBpZiAoISgob3B0X2FyZ1tpXSA+PSAnQScgJiYgb3B0X2FyZ1tpXSA8PSAnWicpIHx8Ci0gICAgICAgICAgICAgIChvcHRfYXJnW2ldID49ICdhJyAmJiBvcHRfYXJnW2ldIDw9ICd6JykpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChpID09IDQgJiYgb3B0X2FyZ1tpXSA9PSAwKQotICAgICAgICBlcnJvcigiTWFuaXB1bGF0aW9uIG9mIGluZGl2aWR1YWwgY2h1bmtzIGlzIG5vdCBpbXBsZW1lbnRlZCIpOwotICAgIGVsc2UKLSAgICAgICAgZXJyX29wdGlvbl9hcmcob3B0LCBvcHRfYXJnKTsKLX0KLQotLyoKLSAqIENvbW1hbmQgbGluZSBwYXJzaW5nCi0gKi8KLXN0YXRpYyBpbnQKLXNjYW5fb3B0aW9uKGNvbnN0IGNoYXIgKnN0ciwKLSAgICAgICAgICAgIGNoYXIgb3B0X2J1ZltdLCBzaXplX3Qgb3B0X2J1Zl9zaXplLCBjb25zdCBjaGFyICoqb3B0X2FyZ19wdHIpCi17Ci0gICAgY29uc3QgY2hhciAqcHRyOwotICAgIHVuc2lnbmVkIGludCBvcHRfbGVuOwotCi0gICAgLyogQ2hlY2sgaWYgYXJnIGlzIGFuICItb3B0aW9uIi4gKi8KLSAgICBpZiAoc3RyWzBdICE9ICctJyB8fCBzdHJbMV0gPT0gMCkgIC8qIG5vICItb3B0aW9uIiwgb3IganVzdCAiLSIgKi8KLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBFeHRyYWN0IHRoZSBub3JtYWxpemVkIG9wdGlvbiwgYW5kIHBvc3NpYmx5IHRoZSBvcHRpb24gYXJndW1lbnQuICovCi0gICAgb3B0X2xlbiA9IDA7Ci0gICAgcHRyID0gc3RyICsgMTsKLSAgICB3aGlsZSAoKnB0ciA9PSAnLScpICAvKiAiLS1vcHRpb24iLCAiLS0tb3B0aW9uIiwgZXRjLiAqLwotICAgICAgICArK3B0cjsKLSAgICBpZiAoKnB0ciA9PSAwKSAgLyogIi0tIiAqLwotICAgICAgICAtLXB0cjsKLSAgICBmb3IgKCA7IDsgKQotICAgIHsKLSAgICAgICAgaWYgKG9wdF9sZW4gPCBvcHRfYnVmX3NpemUpICAvKiB0cnVuY2F0ZSAiLXZlcnlsb25nb3B0aW9uIiAqLwotICAgICAgICAgICAgb3B0X2J1ZltvcHRfbGVuXSA9IChjaGFyKXRvbG93ZXIoKnB0cik7Ci0gICAgICAgICsrb3B0X2xlbjsKLSAgICAgICAgKytwdHI7Ci0gICAgICAgIGlmICgqcHRyID09IDAgfHwgaXNzcGFjZSgqcHRyKSkgIC8qICItb3B0aW9uIiBvciAiLW9wdGlvbiBhcmciICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlIChpc3NwYWNlKCpwdHIpKQotICAgICAgICAgICAgICAgICsrcHRyOwotICAgICAgICAgICAgKm9wdF9hcmdfcHRyID0gKCpwdHIgIT0gMCkgPyBwdHIgOiBOVUxMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCpwdHIgPT0gJz0nKSAgLyogIi1vcHRpb249YXJnIiAqLwotICAgICAgICB7Ci0gICAgICAgICAgICArK3B0cjsKLSAgICAgICAgICAgICpvcHRfYXJnX3B0ciA9IHB0cjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogRmluYWxpemUgdGhlIG5vcm1hbGl6ZWQgb3B0aW9uLiAqLwotICAgIGlmIChvcHRfYnVmX3NpemUgPiAwKQotICAgIHsKLSAgICAgICAgaWYgKG9wdF9sZW4gPCBvcHRfYnVmX3NpemUpCi0gICAgICAgICAgICBvcHRfYnVmW29wdF9sZW5dID0gJ1wwJzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgb3B0X2J1ZltvcHRfYnVmX3NpemUgLSAxXSA9ICdcMCc7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotCi0vKgotICogQ29tbWFuZCBsaW5lIHBhcnNpbmcKLSAqLwotc3RhdGljIHZvaWQKLXBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBjaGFyICphcmc7Ci0gICAgY2hhciBvcHRbMTZdOwotICAgIHNpemVfdCBvcHRfbGVuOwotICAgIGNvbnN0IGNoYXIgKnhvcHQ7Ci0gICAgaW50IHNpbXBsZV9vcHQsIHN0b3Bfc3dpdGNoOwotICAgIGJpdHNldF90IHNldDsKLSAgICBpbnQgdmFsOwotICAgIHVuc2lnbmVkIGludCBmaWxlX2NvdW50OwotICAgIGludCBpOwotCi0gICAgLyogSW5pdGlhbGl6ZS4gKi8KLSAgICBtZW1zZXQoJm9wdGlvbnMsIDAsIHNpemVvZihvcHRpb25zKSk7Ci0gICAgb3B0aW9ucy5vcHRpbV9sZXZlbCA9IC0xOwotICAgIG9wdGlvbnMuaW50ZXJsYWNlID0gLTE7Ci0gICAgZmlsZV9jb3VudCA9IDA7Ci0KLSAgICAvKiBJdGVyYXRlIG92ZXIgYXJncy4gKi8KLSAgICBzdG9wX3N3aXRjaCA9IDA7Ci0gICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7ICsraSkKLSAgICB7Ci0gICAgICAgIGFyZyA9IGFyZ3ZbaV07Ci0gICAgICAgIGlmIChzdG9wX3N3aXRjaCB8fCBzY2FuX29wdGlvbihhcmcsIG9wdCwgc2l6ZW9mKG9wdCksICZ4b3B0KSA8IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgICsrZmlsZV9jb3VudDsKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgLyogbGVhdmUgZmlsZSBuYW1lcyBmb3IgcHJvY2Vzc19maWxlcygpICovCi0gICAgICAgIH0KLSAgICAgICAgb3B0X2xlbiA9IHN0cmxlbihvcHQpOwotCi0gICAgICAgIC8qIFByZXZlbnQgcHJvY2Vzc19maWxlcygpIGZyb20gc2VlaW5nIHRoaXMgYXJnLiAqLwotICAgICAgICBhcmd2W2ldID0gTlVMTDsKLQotICAgICAgICAvKiBOb3JtYWxpemUgdGhlIG9wdGlvbnMgdGhhdCBhbGxvdyBqdXh0YXBvc2VkIGFyZ3VtZW50cy4gKi8KLSAgICAgICAgaWYgKChzdHJjaHIoImZpbyIsIG9wdFswXSkgIT0gTlVMTCAmJiBpc2RpZ2l0KG9wdFsxXSkpIHx8Ci0gICAgICAgICAgICAob3B0WzBdID09ICd6JyAmJiBpc2FscGhhKG9wdFsxXSkgJiYgaXNkaWdpdChvcHRbMl0pKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogLWYwLTUgPD0+IC1mPTAtNTsgLWkxIDw9PiAtaT0xOyAtbzMgPD0+IC1vPTM7Ci0gICAgICAgICAgICAgKiAtemMzLTkgPD0+IC16Yz0zLTk7IGV0Yy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgb3B0X2xlbiA9IChzaXplX3QpKG9wbmdfc3RycGJya19kaWdpdChvcHQpIC0gb3B0KTsKLSAgICAgICAgICAgIG9wdFtvcHRfbGVuXSA9ICdcMCc7Ci0gICAgICAgICAgICB4b3B0ID0gb3BuZ19zdHJwYnJrX2RpZ2l0KGFyZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDaGVjayB0aGUgc2ltcGxlIG9wdGlvbnMgKHdpdGhvdXQgb3B0aW9uIGFyZ3VtZW50cykuICovCi0gICAgICAgIHNpbXBsZV9vcHQgPSAxOwotICAgICAgICBpZiAoc3RyY21wKCItIiwgb3B0KSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAtLSAqLwotICAgICAgICAgICAgc3RvcF9zd2l0Y2ggPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNtcCgiPyIsIG9wdCkgPT0gMCB8fAotICAgICAgICAgICAgICAgICBzdHJuY21wKCJoZWxwIiwgb3B0LCBvcHRfbGVuKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAtPyB8IC1oIHwgLi4uIHwgLWhlbHAgKi8KLSAgICAgICAgICAgIGxvY2FsX29wdGlvbnMuaGVscCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKHN0cm5jbXAoImJhY2t1cCIsIG9wdCwgb3B0X2xlbikgPT0gMCkgfHwKLSAgICAgICAgICAgICAgICAgKHN0cm5jbXAoImtlZXAiLCBvcHQsIG9wdF9sZW4pID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAtYiB8IC4uLiB8IC1iYWNrdXAgfCAtayB8IC4uLiB8IC1rZWVwICovCi0gICAgICAgICAgICBvcHRpb25zLmJhY2t1cCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RybmNtcCgiY2xvYmJlciIsIG9wdCwgb3B0X2xlbikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogLWMgfCAuLi4gfCAtY2xvYmJlciAqLwotICAgICAgICAgICAgb3B0aW9ucy5jbG9iYmVyID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJjbXAoImRlYnVnIiwgb3B0KSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAtZGVidWcgKi8KLSAgICAgICAgICAgIC8qIERvIG5vdCBhYmJyZXZpYXRlIHRoaXMgaW50ZXJuYWwgb3B0aW9uLiAqLwotICAgICAgICAgICAgb3B0aW9ucy5kZWJ1ZyA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RybmNtcCgiZml4Iiwgb3B0LCBvcHRfbGVuKSA9PSAwICYmIG9wdF9sZW4gPj0gMikKLSAgICAgICAgewotICAgICAgICAgICAgLyogLWZpIHwgLWZpeCAqLwotICAgICAgICAgICAgb3B0aW9ucy5maXggPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cm5jbXAoImZvcmNlIiwgb3B0LCBvcHRfbGVuKSA9PSAwICYmIG9wdF9sZW4gPj0gMikKLSAgICAgICAgewotICAgICAgICAgICAgLyogLWZvIHwgLi4uIHwgLWZvcmNlICovCi0gICAgICAgICAgICBvcHRpb25zLmZvcmNlID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJuY21wKCJmdWxsIiwgb3B0LCBvcHRfbGVuKSA9PSAwICYmIG9wdF9sZW4gPj0gMikKLSAgICAgICAgewotICAgICAgICAgICAgLyogLWZ1IHwgLi4uIHwgLWZ1bGwgKi8KLSAgICAgICAgICAgIG9wdGlvbnMuZnVsbCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RyY21wKCJuYiIsIG9wdCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogLW5iICovCi0gICAgICAgICAgICBvcHRpb25zLm5iID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJjbXAoIm5jIiwgb3B0KSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAtbmMgKi8KLSAgICAgICAgICAgIG9wdGlvbnMubmMgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNtcCgibnAiLCBvcHQpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIC1ucCAqLwotICAgICAgICAgICAgb3B0aW9ucy5ucCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RyY21wKCJueCIsIG9wdCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogLW54ICovCi0gICAgICAgICAgICBvcHRpb25zLm5iID0gb3B0aW9ucy5uYyA9IG9wdGlvbnMubnAgPSAxOwotICAgICAgICAgICAgLyogb3B0aW9ucy5ubSA9IDE7ICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RyY21wKCJueiIsIG9wdCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogLW56ICovCi0gICAgICAgICAgICBvcHRpb25zLm56ID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJuY21wKCJwcmVzZXJ2ZSIsIG9wdCwgb3B0X2xlbikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogLXAgfCAuLi4gfCAtcHJlc2VydmUgKi8KLSAgICAgICAgICAgIG9wdGlvbnMucHJlc2VydmUgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChzdHJuY21wKCJxdWlldCIsIG9wdCwgb3B0X2xlbikgPT0gMCkgfHwKLSAgICAgICAgICAgICAgICAgKHN0cm5jbXAoInNpbGVudCIsIG9wdCwgb3B0X2xlbikgPT0gMCAmJiBvcHRfbGVuID49IDMpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAtcSB8IC4uLiB8IC1xdWlldCB8IC1zaWwgfCAuLi4gfCAtc2lsZW50ICovCi0gICAgICAgICAgICBvcHRpb25zLnF1aWV0ID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJuY21wKCJzaW11bGF0ZSIsIG9wdCwgb3B0X2xlbikgPT0gMCAmJiBvcHRfbGVuID49IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIC1zaW0gfCAuLi4gfCAtc2ltdWxhdGUgKi8KLSAgICAgICAgICAgIG9wdGlvbnMuc2ltdWxhdGUgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cm5jbXAoInNuaXAiLCBvcHQsIG9wdF9sZW4pID09IDAgJiYgb3B0X2xlbiA+PSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAtc24gfCAuLi4gfCAtc25pcCAqLwotICAgICAgICAgICAgb3B0aW9ucy5zbmlwID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJjbXAoInYiLCBvcHQpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIC12ICovCi0gICAgICAgICAgICBvcHRpb25zLnZlcmJvc2UgPSAxOwotICAgICAgICAgICAgbG9jYWxfb3B0aW9ucy52ZXJzaW9uID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJuY21wKCJ2ZXJib3NlIiwgb3B0LCBvcHRfbGVuKSA9PSAwICYmIG9wdF9sZW4gPj0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogLXZlcmIgfCAuLi4gfCAtdmVyYm9zZSAqLwotICAgICAgICAgICAgb3B0aW9ucy52ZXJib3NlID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJuY21wKCJ2ZXJzaW9uIiwgb3B0LCBvcHRfbGVuKSA9PSAwICYmIG9wdF9sZW4gPj0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogLXZlcnMgfCAuLi4gfCAtdmVyc2lvbiAqLwotICAgICAgICAgICAgbG9jYWxfb3B0aW9ucy52ZXJzaW9uID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlICAvKiBwb3NzaWJseSBhbiBvcHRpb24gd2l0aCBhbiBhcmd1bWVudCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBzaW1wbGVfb3B0ID0gMDsKLSAgICAgICAgICAgIGlmICh4b3B0ID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCsraSA8IGFyZ2MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4b3B0ID0gYXJndltpXTsKLSAgICAgICAgICAgICAgICAgICAgLyogUHJldmVudCBwcm9jZXNzX2ZpbGVzKCkgZnJvbSBzZWVpbmcgdGhpcyB4b3B0LiAqLwotICAgICAgICAgICAgICAgICAgICBhcmd2W2ldID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogTGFzdCBvcHRpb24gaW4gY29tbWFuZCBsaW5lOyBhc3N1bWUgYW4gZW1wdHkgeG9wdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgeG9wdCA9ICIiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIENoZWNrIHRoZSBvcHRpb25zIHRoYXQgaGF2ZSBvcHRpb24gYXJndW1lbnRzLiAqLwotICAgICAgICBpZiAoc2ltcGxlX29wdCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHhvcHQgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBlcnJvcigiTm8gYXJndW1lbnQgYWxsb3dlZCBmb3Igb3B0aW9uOiAlcyIsIGFyZyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RyY21wKCJvIiwgb3B0KSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAtbyBOVU0gKi8KLSAgICAgICAgICAgIHZhbCA9IGNoZWNrX251bV9vcHRpb24oIi1vIiwgeG9wdCwgMCwgSU5UX01BWCk7Ci0gICAgICAgICAgICBpZiAob3B0aW9ucy5vcHRpbV9sZXZlbCA8IDApCi0gICAgICAgICAgICAgICAgb3B0aW9ucy5vcHRpbV9sZXZlbCA9IHZhbDsKLSAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMub3B0aW1fbGV2ZWwgIT0gdmFsKQotICAgICAgICAgICAgICAgIGVycm9yKCJNdWx0aXBsZSBvcHRpbWl6YXRpb24gbGV2ZWxzIGFyZSBub3QgcGVybWl0dGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RyY21wKCJpIiwgb3B0KSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAtaSBOVU0gKi8KLSAgICAgICAgICAgIHZhbCA9IGNoZWNrX251bV9vcHRpb24oIi1pIiwgeG9wdCwgMCwgMSk7Ci0gICAgICAgICAgICBpZiAob3B0aW9ucy5pbnRlcmxhY2UgPCAwKQotICAgICAgICAgICAgICAgIG9wdGlvbnMuaW50ZXJsYWNlID0gdmFsOwotICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5pbnRlcmxhY2UgIT0gdmFsKQotICAgICAgICAgICAgICAgIGVycm9yKCJNdWx0aXBsZSBpbnRlcmxhY2UgdHlwZXMgYXJlIG5vdCBwZXJtaXR0ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJjbXAoImYiLCBvcHQpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIC1mIFNFVCAqLwotICAgICAgICAgICAgc2V0ID0gY2hlY2tfcmFuZ2VzZXRfb3B0aW9uKCItZiIsIHhvcHQsIE9QTkdfRklMVEVSX1NFVF9NQVNLKTsKLSAgICAgICAgICAgIG9wdGlvbnMuZmlsdGVyX3NldCB8PSBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RyY21wKCJ6YyIsIG9wdCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogLXpjIFNFVCAqLwotICAgICAgICAgICAgc2V0ID0gY2hlY2tfcmFuZ2VzZXRfb3B0aW9uKCItemMiLCB4b3B0LCBPUE5HX0NPTVBSX0xFVkVMX1NFVF9NQVNLKTsKLSAgICAgICAgICAgIG9wdGlvbnMuY29tcHJfbGV2ZWxfc2V0IHw9IHNldDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJjbXAoInptIiwgb3B0KSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAtem0gU0VUICovCi0gICAgICAgICAgICBzZXQgPSBjaGVja19yYW5nZXNldF9vcHRpb24oIi16bSIsIHhvcHQsIE9QTkdfTUVNX0xFVkVMX1NFVF9NQVNLKTsKLSAgICAgICAgICAgIG9wdGlvbnMubWVtX2xldmVsX3NldCB8PSBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RyY21wKCJ6cyIsIG9wdCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogLXpzIFNFVCAqLwotICAgICAgICAgICAgc2V0ID0gY2hlY2tfcmFuZ2VzZXRfb3B0aW9uKCItenMiLCB4b3B0LCBPUE5HX1NUUkFURUdZX1NFVF9NQVNLKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc3RyYXRlZ3lfc2V0IHw9IHNldDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJjbXAoInp3Iiwgb3B0KSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAtencgTlVNICovCi0gICAgICAgICAgICB2YWwgPSBjaGVja19wb3dlcjJfb3B0aW9uKCItenciLCB4b3B0LCA4LCAxNSk7Ci0gICAgICAgICAgICBpZiAob3B0aW9ucy53aW5kb3dfYml0cyA9PSAwKQotICAgICAgICAgICAgICAgIG9wdGlvbnMud2luZG93X2JpdHMgPSB2YWw7Ci0gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLndpbmRvd19iaXRzICE9IHZhbCkKLSAgICAgICAgICAgICAgICBlcnJvcigiTXVsdGlwbGUgd2luZG93IHNpemVzIGFyZSBub3QgcGVybWl0dGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RybmNtcCgic3RyaXAiLCBvcHQsIG9wdF9sZW4pID09IDAgJiYgb3B0X2xlbiA+PSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAtc3QgT0JKIHwgLi4uIHwgLXN0cmlwIE9CSiAqLwotICAgICAgICAgICAgY2hlY2tfb2JqX29wdGlvbigiLXN0cmlwIiwgeG9wdCk7Ci0gICAgICAgICAgICBvcHRpb25zLnN0cmlwX2FsbCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RybmNtcCgib3V0Iiwgb3B0LCBvcHRfbGVuKSA9PSAwICYmIG9wdF9sZW4gPj0gMikKLSAgICAgICAgewotICAgICAgICAgICAgLyogLW91IFBBVEggfCAtb3V0IFBBVEggKi8KLSAgICAgICAgICAgIGlmIChvcHRpb25zLm91dF9uYW1lICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgZXJyb3IoIk11bHRpcGxlIG91dHB1dCBmaWxlIG5hbWVzIGFyZSBub3QgcGVybWl0dGVkIik7Ci0gICAgICAgICAgICBpZiAoeG9wdFswXSA9PSAwKQotICAgICAgICAgICAgICAgIGVycl9vcHRpb25fYXJnKCItb3V0IiwgTlVMTCk7Ci0gICAgICAgICAgICBvcHRpb25zLm91dF9uYW1lID0geG9wdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJuY21wKCJkaXIiLCBvcHQsIG9wdF9sZW4pID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIC1kIFBBVEggfCAuLi4gfCAtZGlyIFBBVEggKi8KLSAgICAgICAgICAgIGlmIChvcHRpb25zLmRpcl9uYW1lICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgZXJyb3IoIk11bHRpcGxlIG91dHB1dCBkaXIgbmFtZXMgYXJlIG5vdCBwZXJtaXR0ZWQiKTsKLSAgICAgICAgICAgIGlmICh4b3B0WzBdID09IDApCi0gICAgICAgICAgICAgICAgZXJyX29wdGlvbl9hcmcoIi1kaXIiLCBOVUxMKTsKLSAgICAgICAgICAgIG9wdGlvbnMuZGlyX25hbWUgPSB4b3B0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cm5jbXAoImxvZyIsIG9wdCwgb3B0X2xlbikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogLWwgUEFUSCB8IC4uLiB8IC1sb2cgUEFUSCAqLwotICAgICAgICAgICAgaWYgKG9wdGlvbnMubG9nX25hbWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBlcnJvcigiTXVsdGlwbGUgbG9nIGZpbGUgbmFtZXMgYXJlIG5vdCBwZXJtaXR0ZWQiKTsKLSAgICAgICAgICAgIGlmICh4b3B0WzBdID09IDApCi0gICAgICAgICAgICAgICAgZXJyX29wdGlvbl9hcmcoIi1sb2ciLCBOVUxMKTsKLSAgICAgICAgICAgIG9wdGlvbnMubG9nX25hbWUgPSB4b3B0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3IoIlVucmVjb2duaXplZCBvcHRpb246ICVzIiwgYXJnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEZpbmFsaXplLiAqLwotICAgIGlmIChvcHRpb25zLm91dF9uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgICBpZiAoZmlsZV9jb3VudCA+IDEpCi0gICAgICAgICAgICBlcnJvcigiVGhlIG9wdGlvbiAtb3V0IHJlcXVpcmVzIG9uZSBpbnB1dCBmaWxlIik7Ci0gICAgICAgIGlmIChvcHRpb25zLmRpcl9uYW1lICE9IE5VTEwpCi0gICAgICAgICAgICBlcnJvcigiVGhlIG9wdGlvbnMgLW91dCBhbmQgLWRpciBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIik7Ci0gICAgfQotICAgIGlmIChvcHRpb25zLmxvZ19uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgICBpZiAob3BuZ19zdHJjYXNlY21wKCIubG9nIiwgb3BuZ19zdHJ0YWlsKG9wdGlvbnMubG9nX25hbWUsIDQpKSAhPSAwKQotICAgICAgICAgICAgZXJyb3IoIlRvIHByZXZlbnQgYWNjaWRlbnRhbCBkYXRhIGNvcnJ1cHRpb24sICIKLSAgICAgICAgICAgICAgICAgICJ0aGUgbG9nIGZpbGUgbmFtZSBtdXN0IGVuZCB3aXRoIFwiLmxvZ1wiIik7Ci0gICAgfQotICAgIGlmIChsb2NhbF9vcHRpb25zLmhlbHApCi0gICAgICAgIG9wZXJhdGlvbiA9IE9QX1NIT1dfSEVMUDsKLSAgICBlbHNlIGlmIChmaWxlX2NvdW50ICE9IDApCi0gICAgICAgIG9wZXJhdGlvbiA9IE9QX1JVTjsKLSAgICBlbHNlIGlmIChsb2NhbF9vcHRpb25zLnZlcnNpb24pCi0gICAgICAgIG9wZXJhdGlvbiA9IE9QX1NIT1dfVkVSU0lPTjsKLSAgICBlbHNlCi0gICAgICAgIG9wZXJhdGlvbiA9IE9QX1NIT1dfSEVMUDsKLX0KLQotLyoKLSAqIEFwcGxpY2F0aW9uLWRlZmluZWQgcHJpbnRmIGNhbGxiYWNrCi0gKi8KLXN0YXRpYyB2b2lkCi1hcHBfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICAgIHZhX2xpc3QgYXJnX3B0cjsKLQotICAgIGlmIChmbXRbMF0gPT0gMCkKLSAgICAgICAgcmV0dXJuOwotICAgIHN0YXJ0X29mX2xpbmUgPSAoZm10W3N0cmxlbihmbXQpIC0gMV0gPT0gJ1xuJykgPyAxIDogMDsKLQotICAgIGlmIChjb25fZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgdmFfc3RhcnQoYXJnX3B0ciwgZm10KTsKLSAgICAgICAgdmZwcmludGYoY29uX2ZpbGUsIGZtdCwgYXJnX3B0cik7Ci0gICAgICAgIHZhX2VuZChhcmdfcHRyKTsKLSAgICB9Ci0gICAgaWYgKGxvZ19maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgICB2YV9zdGFydChhcmdfcHRyLCBmbXQpOwotICAgICAgICB2ZnByaW50Zihsb2dfZmlsZSwgZm10LCBhcmdfcHRyKTsKLSAgICAgICAgdmFfZW5kKGFyZ19wdHIpOwotICAgIH0KLX0KLQotLyoKLSAqIEFwcGxpY2F0aW9uLWRlZmluZWQgY29udHJvbCBwcmludCBjYWxsYmFjawotICovCi1zdGF0aWMgdm9pZAotYXBwX3ByaW50X2NudHJsKGludCBjbnRybF9jb2RlKQotewotICAgIGNvbnN0IGNoYXIgKmNvbl9zdHIsICpsb2dfc3RyOwotICAgIGludCBpOwotCi0gICAgaWYgKGNudHJsX2NvZGUgPT0gJ1xyJykKLSAgICB7Ci0gICAgICAgIC8qIENSOiByZXNldCBsaW5lIGluIGNvbnNvbGUsIG5ldyBsaW5lIGluIGxvZyBmaWxlLiAqLwotICAgICAgICBjb25fc3RyID0gIlxyIjsKLSAgICAgICAgbG9nX3N0ciA9ICJcbiI7Ci0gICAgICAgIHN0YXJ0X29mX2xpbmUgPSAxOwotICAgIH0KLSAgICBlbHNlIGlmIChjbnRybF9jb2RlID09ICdcdicpCi0gICAgewotICAgICAgICAvKiBWVDogbmV3IGxpbmUgaWYgY3VycmVudCBsaW5lIGlzIG5vdCBlbXB0eSwgbm90aGluZyBvdGhlcndpc2UuICovCi0gICAgICAgIGlmICghc3RhcnRfb2ZfbGluZSkKLSAgICAgICAgewotICAgICAgICAgICAgY29uX3N0ciA9IGxvZ19zdHIgPSAiXG4iOwotICAgICAgICAgICAgc3RhcnRfb2ZfbGluZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY29uX3N0ciA9IGxvZ19zdHIgPSAiIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY250cmxfY29kZSA8IDAgJiYgY250cmxfY29kZSA+IC04MCAmJiBzdGFydF9vZl9saW5lKQotICAgIHsKLSAgICAgICAgLyogTWludXMgTjogZXJhc2UgZmlyc3QgTiBjaGFyYWN0ZXJzIGZyb20gbGluZSwgaW4gY29uc29sZSBvbmx5LiAqLwotICAgICAgICBpZiAoY29uX2ZpbGUgIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA+IGNudHJsX2NvZGU7IC0taSkKLSAgICAgICAgICAgICAgICBmcHV0YygnICcsIGNvbl9maWxlKTsKLSAgICAgICAgfQotICAgICAgICBjb25fc3RyID0gIlxyIjsKLSAgICAgICAgbG9nX3N0ciA9ICIiOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBVbmhhbmRsZWQgY29udHJvbCBjb2RlIChkdWUgdG8gaW50ZXJuYWwgZXJyb3IpOiBzaG93IGVyciBtYXJrZXIuICovCi0gICAgICAgIGNvbl9zdHIgPSBsb2dfc3RyID0gIjw/PiI7Ci0gICAgfQotCi0gICAgaWYgKGNvbl9maWxlICE9IE5VTEwpCi0gICAgICAgIGZwdXRzKGNvbl9zdHIsIGNvbl9maWxlKTsKLSAgICBpZiAobG9nX2ZpbGUgIT0gTlVMTCkKLSAgICAgICAgZnB1dHMobG9nX3N0ciwgbG9nX2ZpbGUpOwotfQotCi0vKgotICogQXBwbGljYXRpb24tZGVmaW5lZCBwcm9ncmVzcyB1cGRhdGUgY2FsbGJhY2sKLSAqLwotc3RhdGljIHZvaWQKLWFwcF9wcm9ncmVzcyh1bnNpZ25lZCBsb25nIGN1cnJlbnRfc3RlcCwgdW5zaWduZWQgbG9uZyB0b3RhbF9zdGVwcykKLXsKLSAgICAvKiBUaGVyZSB3aWxsIGJlIGEgcG90ZW50aWFsbHkgbG9uZyB3YWl0LCBzbyBmbHVzaCB0aGUgY29uc29sZSBvdXRwdXQuICovCi0gICAgaWYgKGNvbl9maWxlICE9IE5VTEwpCi0gICAgICAgIGZmbHVzaChjb25fZmlsZSk7Ci0gICAgLyogQW4gZWFnZXIgZmx1c2ggb2YgdGhlIGxpbmUtYnVmZmVyZWQgbG9nIGZpbGUgaXMgbm90IHZlcnkgaW1wb3J0YW50LiAqLwotCi0gICAgLyogQSBHVUkgYXBwbGljYXRpb24gd291bGQgbm9ybWFsbHkgdXBkYXRlIGEgcHJvZ3Jlc3MgYmFyLiAqLwotICAgIC8qIEhlcmUgd2UgaWdub3JlIHRoZSBwcm9ncmVzcyBpbmZvLiAqLwotICAgIGlmIChjdXJyZW50X3N0ZXAgJiYgdG90YWxfc3RlcHMpCi0gICAgICAgIHJldHVybjsKLX0KLQotLyoKLSAqIEFwcGxpY2F0aW9uIGluaXRpYWxpemF0aW9uCi0gKi8KLXN0YXRpYyB2b2lkCi1hcHBfaW5pdCh2b2lkKQotewotICAgIHN0YXJ0X29mX2xpbmUgPSAxOwotCi0gICAgaWYgKG9wZXJhdGlvbiA9PSBPUF9TSE9XX0hFTFAgfHwgb3BlcmF0aW9uID09IE9QX1NIT1dfVkVSU0lPTikKLSAgICAgICAgY29uX2ZpbGUgPSBzdGRvdXQ7Ci0gICAgZWxzZSBpZiAoIW9wdGlvbnMucXVpZXQpCi0gICAgICAgIGNvbl9maWxlID0gc3RkZXJyOwotICAgIGVsc2UKLSAgICAgICAgY29uX2ZpbGUgPSBOVUxMOwotCi0gICAgaWYgKG9wdGlvbnMubG9nX25hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qIE9wZW4gdGhlIGxvZyBmaWxlLCBsaW5lLWJ1ZmZlcmVkLiAqLwotICAgICAgICBpZiAoKGxvZ19maWxlID0gZm9wZW4ob3B0aW9ucy5sb2dfbmFtZSwgImEiKSkgPT0gTlVMTCkKLSAgICAgICAgICAgIGVycm9yKCJDYW4ndCBvcGVuIGxvZyBmaWxlOiAlc1xuIiwgb3B0aW9ucy5sb2dfbmFtZSk7Ci0gICAgICAgIHNldHZidWYobG9nX2ZpbGUsIE5VTEwsIF9JT0xCRiwgQlVGU0laKTsKLSAgICAgICAgYXBwX3ByaW50ZigiKiogV2FybmluZzogJXNcblxuIiwKLSAgICAgICAgICAgICAgICAgICAiVGhlIG9wdGlvbiAtbG9nIGlzIGRlcHJlY2F0ZWQ7IHVzZSBzaGVsbCByZWRpcmVjdGlvbiIpOwotICAgIH0KLX0KLQotLyoKLSAqIEFwcGxpY2F0aW9uIGZpbmFsaXphdGlvbgotICovCi1zdGF0aWMgdm9pZAotYXBwX2ZpbmlzaCh2b2lkKQotewotICAgIGlmIChsb2dfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgLyogQ2xvc2UgdGhlIGxvZyBmaWxlLiAqLwotICAgICAgICBmY2xvc2UobG9nX2ZpbGUpOwotICAgIH0KLX0KLQotLyoKLSAqIEZpbGUgbGlzdCBwcm9jZXNzaW5nCi0gKi8KLXN0YXRpYyBpbnQKLXByb2Nlc3NfZmlsZXMoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBpbnQgcmVzdWx0OwotICAgIHN0cnVjdCBvcG5nX3VpIHVpOwotICAgIGludCBpOwotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgb3B0aW1pemF0aW9uIGVuZ2luZS4gKi8KLSAgICB1aS5wcmludGZfZm4gICAgICA9IGFwcF9wcmludGY7Ci0gICAgdWkucHJpbnRfY250cmxfZm4gPSBhcHBfcHJpbnRfY250cmw7Ci0gICAgdWkucHJvZ3Jlc3NfZm4gICAgPSBhcHBfcHJvZ3Jlc3M7Ci0gICAgdWkucGFuaWNfZm4gICAgICAgPSBwYW5pYzsKLSAgICBpZiAob3BuZ19pbml0aWFsaXplKCZvcHRpb25zLCAmdWkpICE9IDApCi0gICAgICAgIHBhbmljKCJDYW4ndCBpbml0aWFsaXplIG9wdGltaXphdGlvbiBlbmdpbmUiKTsKLQotICAgIC8qIEl0ZXJhdGUgb3ZlciBmaWxlIG5hbWVzLiAqLwotICAgIHJlc3VsdCA9IEVYSVRfU1VDQ0VTUzsKLSAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgKytpKQotICAgIHsKLSAgICAgICAgaWYgKGFyZ3ZbaV0gPT0gTlVMTCB8fCBhcmd2W2ldWzBdID09IDApCi0gICAgICAgICAgICBjb250aW51ZTsgIC8qIHRoaXMgd2FzIGFuICItb3B0aW9uIiAqLwotICAgICAgICBpZiAob3BuZ19vcHRpbWl6ZShhcmd2W2ldKSAhPSAwKQotICAgICAgICAgICAgcmVzdWx0ID0gRVhJVF9GQUlMVVJFOwotICAgIH0KLQotICAgIC8qIEZpbmFsaXplIHRoZSBvcHRpbWl6YXRpb24gZW5naW5lLiAqLwotICAgIGlmIChvcG5nX2ZpbmFsaXplKCkgIT0gMCkKLSAgICAgICAgcGFuaWMoIkNhbid0IGZpbmFsaXplIG9wdGltaXphdGlvbiBlbmdpbmUiKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi0gKiBtYWluCi0gKi8KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICAgIGludCByZXN1bHQ7Ci0KLSAgICAvKiBQYXJzZSB0aGUgdXNlciBvcHRpb25zIGFuZCBpbml0aWFsaXplIHRoZSBhcHBsaWNhdGlvbi4gKi8KLSAgICBwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpOwotICAgIGFwcF9pbml0KCk7Ci0gICAgcmVzdWx0ID0gRVhJVF9TVUNDRVNTOwotCi0gICAgaWYgKGxvY2FsX29wdGlvbnMudmVyc2lvbikKLSAgICB7Ci0gICAgICAgIC8qIFByaW50IHRoZSBjb3B5cmlnaHQgYW5kIHZlcnNpb24gaW5mby4gKi8KLSAgICAgICAgYXBwX3ByaW50ZigiJXNcbiIsIG1zZ19pbnRybyk7Ci0gICAgfQotCi0gICAgc3dpdGNoIChvcGVyYXRpb24pCi0gICAgewotICAgIGNhc2UgT1BfUlVOOgotICAgICAgICAvKiBSdW4gdGhlIGFwcGxpY2F0aW9uLiAqLwotICAgICAgICByZXN1bHQgPSBwcm9jZXNzX2ZpbGVzKGFyZ2MsIGFyZ3YpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE9QX1NIT1dfSEVMUDoKLSAgICAgICAgaWYgKGxvY2FsX29wdGlvbnMuaGVscCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogUHJpbnQgdGhlIGV4dGVuZGVkIGhlbHAgdGV4dC4gKi8KLSAgICAgICAgICAgIGFwcF9wcmludGYoIiVzJXMlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIG1zZ19oZWxwX3N5bm9wc2lzLAotICAgICAgICAgICAgICAgICAgICAgICBtc2dfaGVscF9vcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICBtc2dfaGVscF9leGFtcGxlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBQcmludCB0aGUgYmFzaWMgaGVscCB0ZXh0LiAqLwotICAgICAgICAgICAgYXBwX3ByaW50ZigiJXMlcyVzJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBtc2dfaGVscF9zeW5vcHNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgbXNnX2hlbHBfYmFzaWNfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgbXNnX2hlbHBfZXhhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIG1zZ19oZWxwX21vcmUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BfU0hPV19WRVJTSU9OOgotICAgICAgICAvKiBQcmludCB0aGUgbGljZW5zaW5nIHRlcm1zIGFuZCB0aGUgZXh0ZW5kZWQgdmVyc2lvbiBpbmZvLiAqLwotICAgICAgICBhcHBfcHJpbnRmKCIlc1xuIiwgbXNnX2xpY2Vuc2UpOwotICAgICAgICBhcHBfcHJpbnRmKCJVc2luZyBsaWJwbmcgdmVyc2lvbiAlcyBhbmQgemxpYiB2ZXJzaW9uICVzXG4iLAotICAgICAgICAgICAgICAgICAgIHBuZ19nZXRfbGlicG5nX3ZlcihOVUxMKSwgemxpYlZlcnNpb24oKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJlc3VsdCA9IC0xOwotICAgIH0KLQotICAgIC8qIEZpbmFsaXplIHRoZSBhcHBsaWNhdGlvbi4gKi8KLSAgICBhcHBfZmluaXNoKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9vcHRpcG5nL29wdGlwbmcuaCBiL3NyYy9vcHRpcG5nL29wdGlwbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdiMjczNy4uMDAwMDAwMAotLS0gYS9zcmMvb3B0aXBuZy9vcHRpcG5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIG9wdGlwbmcuaAotICogVGhlIE9wdGlQTkcgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDEyIENvc21pbiBUcnV0YSBhbmQgdGhlIENvbnRyaWJ1dGluZyBBdXRob3JzLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHpsaWIgbGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgdGhlIGF0dGFjaGVkIExJQ0VOU0UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKi8KLQotI2lmbmRlZiBPUFRJUE5HX0gKLSNkZWZpbmUgT1BUSVBOR19ICi0KLSNpbmNsdWRlICJjYml0c2V0LmgiCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLS8qCi0gKiBVc2VyIG9wdGlvbnMgKGUuZy4gZXh0cmFjdGVkIGZyb20gdGhlIGNvbW1hbmQgbGluZSkKLSAqLwotc3RydWN0IG9wbmdfb3B0aW9ucwotewotICAgIC8qIGdlbmVyYWwgb3B0aW9ucyAqLwotICAgIGludCBiYWNrdXA7Ci0gICAgaW50IGNsb2JiZXI7Ci0gICAgaW50IGRlYnVnOwotICAgIGludCBmaXg7Ci0gICAgaW50IGZvcmNlOwotICAgIGludCBmdWxsOwotICAgIGludCBwcmVzZXJ2ZTsKLSAgICBpbnQgcXVpZXQ7Ci0gICAgaW50IHNpbXVsYXRlOwotICAgIGludCB2ZXJib3NlOwotICAgIGNvbnN0IGNoYXIgKm91dF9uYW1lOwotICAgIGNvbnN0IGNoYXIgKmRpcl9uYW1lOwotICAgIGNvbnN0IGNoYXIgKmxvZ19uYW1lOwotCi0gICAgLyogb3B0aW1pemF0aW9uIG9wdGlvbnMgKi8KLSAgICBpbnQgaW50ZXJsYWNlOwotICAgIGludCBuYiwgbmMsIG5wLCBuejsKLSAgICBpbnQgb3B0aW1fbGV2ZWw7Ci0gICAgYml0c2V0X3QgY29tcHJfbGV2ZWxfc2V0OwotICAgIGJpdHNldF90IG1lbV9sZXZlbF9zZXQ7Ci0gICAgYml0c2V0X3Qgc3RyYXRlZ3lfc2V0OwotICAgIGJpdHNldF90IGZpbHRlcl9zZXQ7Ci0gICAgaW50IHdpbmRvd19iaXRzOwotCi0gICAgLyogZWRpdGluZyBvcHRpb25zICovCi0gICAgaW50IHNuaXA7Ci0gICAgaW50IHN0cmlwX2FsbDsKLX07Ci0KLQotLyoKLSAqIFVzZXIgaW50ZXJmYWNlIGNhbGxiYWNrcwotICovCi1zdHJ1Y3Qgb3BuZ191aQotewotICAgIHZvaWQgKCpwcmludGZfZm4pKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKLSAgICB2b2lkICgqcHJpbnRfY250cmxfZm4pKGludCBjbnRybF9jb2RlKTsKLSAgICB2b2lkICgqcHJvZ3Jlc3NfZm4pKHVuc2lnbmVkIGxvbmcgY3VycmVudF9zdGVwLCB1bnNpZ25lZCBsb25nIHRvdGFsX3N0ZXBzKTsKLSAgICB2b2lkICgqcGFuaWNfZm4pKGNvbnN0IGNoYXIgKm1zZyk7Ci19OwotCi0KLS8qCi0gKiBFbmdpbmUgaW5pdGlhbGl6YXRpb24KLSAqLwotaW50IG9wbmdfaW5pdGlhbGl6ZShjb25zdCBzdHJ1Y3Qgb3BuZ19vcHRpb25zICpvcHRpb25zLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3BuZ191aSAqdWkpOwotCi0vKgotICogRW5naW5lIGV4ZWN1dGlvbgotICovCi1pbnQgb3BuZ19vcHRpbWl6ZShjb25zdCBjaGFyICppbmZpbGVfbmFtZSk7Ci0KLS8qCi0gKiBFbmdpbmUgZmluYWxpemF0aW9uCi0gKi8KLWludCBvcG5nX2ZpbmFsaXplKHZvaWQpOwotCi0KLS8qCi0gKiBFbmNvZGVyIGxpbWl0cyBhbmQgZGVmYXVsdCB2YWx1ZXMKLSAqLwotI2RlZmluZSBPUE5HX09QVElNX0xFVkVMX0RFRkFVTFQgICAgMgotI2RlZmluZSBPUE5HX09QVElNX0xFVkVMX01JTiAgICAgICAgMAotI2RlZmluZSBPUE5HX09QVElNX0xFVkVMX01BWCAgICAgICAgNwotCi0jZGVmaW5lIE9QTkdfQ09NUFJfTEVWRUxfTUlOICAgICAgICAxCi0jZGVmaW5lIE9QTkdfQ09NUFJfTEVWRUxfTUFYICAgICAgICA5Ci0jZGVmaW5lIE9QTkdfQ09NUFJfTEVWRUxfU0VUX01BU0sgICAoKDEgPDwgKDkrMSkpIC0gKDEgPDwgMSkpICAvKiAweDAzZmUgKi8KLQotI2RlZmluZSBPUE5HX01FTV9MRVZFTF9NSU4gICAgICAgICAgMQotI2RlZmluZSBPUE5HX01FTV9MRVZFTF9NQVggICAgICAgICAgOQotI2RlZmluZSBPUE5HX01FTV9MRVZFTF9TRVRfTUFTSyAgICAgKCgxIDw8ICg5KzEpKSAtICgxIDw8IDEpKSAgLyogMHgwM2ZlICovCi0KLSNkZWZpbmUgT1BOR19TVFJBVEVHWV9NSU4gICAgICAgICAgIDAKLSNkZWZpbmUgT1BOR19TVFJBVEVHWV9NQVggICAgICAgICAgIDMKLSNkZWZpbmUgT1BOR19TVFJBVEVHWV9TRVRfTUFTSyAgICAgICgoMSA8PCAoMysxKSkgLSAoMSA8PCAwKSkgIC8qIDB4MDAwZiAqLwotCi0jZGVmaW5lIE9QTkdfRklMVEVSX01JTiAgICAgICAgICAgICAwCi0jZGVmaW5lIE9QTkdfRklMVEVSX01BWCAgICAgICAgICAgICA1Ci0jZGVmaW5lIE9QTkdfRklMVEVSX1NFVF9NQVNLICAgICAgICAoKDEgPDwgKDUrMSkpIC0gKDEgPDwgMCkpICAvKiAweDAwM2YgKi8KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8qIGV4dGVybiAiQyIgKi8KLSNlbmRpZgotCi0KLSNlbmRpZiAgLyogT1BUSVBOR19IICovCmRpZmYgLS1naXQgYS9zcmMvb3B0aXBuZy9vc3lzLmMgYi9zcmMvb3B0aXBuZy9vc3lzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyM2IxM2MuLjAwMDAwMDAKLS0tIGEvc3JjL29wdGlwbmcvb3N5cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzk5ICswLDAgQEAKLS8qCi0gKiBvc3lzLmMKLSAqIFN5c3RlbSBleHRlbnNpb25zLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMy0yMDEyIENvc21pbiBUcnV0YS4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB6bGliIGxpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIHRoZSBhdHRhY2hlZCBMSUNFTlNFIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICovCi0KLSNpbmNsdWRlICJvc3lzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0KLS8qCi0gKiBBdXRvLWNvbmZpZ3VyYXRpb24uCi0gKi8KLSNpZiBkZWZpbmVkIFVOSVggfHwgZGVmaW5lZCBfX1VOSVhfXyB8fCBkZWZpbmVkIF9fdW5peCB8fCBkZWZpbmVkIF9fdW5peF9fIHx8IFwKLSAgICBkZWZpbmVkIF9QT1NJWF9TT1VSQ0UgfHwgZGVmaW5lZCBfUE9TSVhfQ19TT1VSQ0UgfHwgZGVmaW5lZCBfWE9QRU5fU09VUkNFCi0jICBkZWZpbmUgT1NZU19VTklYCi0vKiBUbyBiZSBjb250aW51ZWQuICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfV0lOMzJfV0NFIHx8IFwKLSAgICBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fTlRfXwotIyAgZGVmaW5lIE9TWVNfV0lOMzIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBXSU42NCB8fCBkZWZpbmVkIF9XSU42NCB8fCBkZWZpbmVkIF9fV0lONjRfXwotIyAgZGVmaW5lIE9TWVNfV0lONjQKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBPU1lTX1dJTjMyIHx8IGRlZmluZWQgT1NZU19XSU42NAotIyAgZGVmaW5lIE9TWVNfV0lORE9XUwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIERPUyB8fCBkZWZpbmVkIF9ET1MgfHwgZGVmaW5lZCBfX0RPU19fIHx8IFwKLSAgICBkZWZpbmVkIE1TRE9TIHx8IGRlZmluZWQgX01TRE9TIHx8IGRlZmluZWQgX19NU0RPU19fCi0jICBkZWZpbmUgT1NZU19ET1MKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBPUzIgfHwgZGVmaW5lZCBPU18yIHx8IGRlZmluZWQgX19PUzJfXwotIyAgZGVmaW5lIE9TWVNfT1MyCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgT1NZU19ET1MgfHwgZGVmaW5lZCBPU1lTX09TMgotIyAgZGVmaW5lIE9TWVNfRE9TSVNICi0jZW5kaWYKLQotI2lmIGRlZmluZWQgX19BUFBMRV9fCi0jICBkZWZpbmUgT1NZU19NQUNPUwotIyAgaWYgZGVmaW5lZCBfX01BQ0hfXwotIyAgICBkZWZpbmUgT1NZU19NQUNPU1gKLSMgICAgaWZuZGVmIE9TWVNfVU5JWAotIyAgICAgIGRlZmluZSBPU1lTX1VOSVgKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgX19DWUdXSU5fXyB8fCBkZWZpbmVkIF9fREpHUFBfXyB8fCBkZWZpbmVkIF9fRU1YX18KLSMgIGRlZmluZSBPU1lTX1VOSVhJU0gKLSAgIC8qIFN0cmljdGx5IHNwZWFraW5nLCB0aGlzIGlzIG5vdCBlbnRpcmVseSBjb3JyZWN0LCBidXQgIml0IHdvcmtzIi4gKi8KLSMgIGlmbmRlZiBPU1lTX1VOSVgKLSMgICAgZGVmaW5lIE9TWVNfVU5JWAotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBPU1lTX1VOSVggfHwgKCFkZWZpbmVkIE9TWVNfV0lORE9XUyAmJiAhZGVmaW5lZCBPU1lTX0RPU0lTSCkKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyAgaWYgZGVmaW5lZCBfUE9TSVhfVkVSU0lPTiB8fCBkZWZpbmVkIF9YT1BFTl9WRVJTSU9OCi0jICAgIGlmbmRlZiBPU1lTX1VOSVgKLSMgICAgICBkZWZpbmUgT1NZU19VTklYCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIE9TWVNfVU5JWAotIyAgZGVmaW5lIF9CU0RfU09VUkNFIDEKLSMgIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBPU1lTX1VOSVggfHwgZGVmaW5lZCBPU1lTX1dJTkRPV1MgfHwgZGVmaW5lZCBPU1lTX0RPU0lTSAotIyAgaW5jbHVkZSA8ZmNudGwuaD4KLSMgIGluY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMgIGlmZGVmIF9NU0NfVkVSCi0jICAgIGluY2x1ZGUgPHN5cy91dGltZS5oPgotIyAgZWxzZQotIyAgICBpbmNsdWRlIDx1dGltZS5oPgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBPU1lTX1dJTkRPV1MgfHwgZGVmaW5lZCBPU1lTX0RPU0lTSCB8fCBkZWZpbmVkIE9TWVNfVU5JWElTSAotIyAgaW5jbHVkZSA8aW8uaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBPU1lTX1dJTkRPV1MKLSMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBPU1lTX0RPU0lTSAotIyAgaW5jbHVkZSA8cHJvY2Vzcy5oPgotI2VuZGlmCi0KLQotLyoKLSAqIE1vcmUgYXV0by1jb25maWd1cmF0aW9uLgotICovCi0jaWYgKGRlZmluZWQgT1NZU19XSU5ET1dTIHx8IGRlZmluZWQgT1NZU19ET1NJU0gpICYmICFkZWZpbmVkIE9TWVNfVU5JWElTSAotIyAgZGVmaW5lIE9TWVNfUEFUSF9QQVRIU0VQICdcXCcKLSMgIGRlZmluZSBPU1lTX1BBVEhfUEFUSFNFUF9TVFIgIlxcIgotIyAgZGVmaW5lIE9TWVNfUEFUSF9QQVRIU0VQX0FMTF9TVFIgIi9cXCIKLSNlbHNlCi0jICBkZWZpbmUgT1NZU19QQVRIX1BBVEhTRVAgJy8nCi0jICBkZWZpbmUgT1NZU19QQVRIX1BBVEhTRVBfU1RSICIvIgotIyAgaWYgZGVmaW5lZCBPU1lTX1VOSVhJU0gKLSMgICAgZGVmaW5lIE9TWVNfUEFUSF9QQVRIU0VQX0FMTF9TVFIgIi9cXCIKLSMgIGVsaWYgZGVmaW5lZCBPU1lTX01BQ09TWAotIyAgICBkZWZpbmUgT1NZU19QQVRIX1BBVEhTRVBfQUxMX1NUUiAiLzoiCi0jICBlbHNlICAvKiBPU1lTX1VOSVggYW5kIG90aGVycyAqLwotIyAgICBkZWZpbmUgT1NZU19QQVRIX1BBVEhTRVBfQUxMX1NUUiAiLyIKLSMgIGVuZGlmCi0jZW5kaWYKLSNkZWZpbmUgT1NZU19QQVRIX0VYVFNFUCAnLicKLSNkZWZpbmUgT1NZU19QQVRIX0VYVFNFUF9TVFIgIi4iCi0vKiBUT0RPOiBTdXBwb3J0IG1vcmUgc3lzdGVtcyAoZS5nLiBPU1lTX1JJU0NPUykuICovCi0KLSNpZiBkZWZpbmVkIE9TWVNfV0lORE9XUyB8fCBkZWZpbmVkIE9TWVNfRE9TSVNIIHx8IGRlZmluZWQgT1NZU19VTklYSVNICi0jICBkZWZpbmUgT1NZU19QQVRIX0RPUwotI2VuZGlmCi0KLSNpZmRlZiBSX09LCi0jICBkZWZpbmUgT1NZU19URVNUX1JFQUQgUl9PSwotI2Vsc2UKLSMgIGRlZmluZSBPU1lTX1RFU1RfUkVBRCA0Ci0jZW5kaWYKLSNpZmRlZiBXX09LCi0jICBkZWZpbmUgT1NZU19URVNUX1dSSVRFIFdfT0sKLSNlbHNlCi0jICBkZWZpbmUgT1NZU19URVNUX1dSSVRFIDIKLSNlbmRpZgotI2lmZGVmIFhfT0sKLSMgIGRlZmluZSBPU1lTX1RFU1RfRVhFQyBYX09LCi0jZWxzZQotIyAgZGVmaW5lIE9TWVNfVEVTVF9FWEVDIDEKLSNlbmRpZgotI2lmZGVmIEZfT0sKLSMgIGRlZmluZSBPU1lTX1RFU1RfRklMRSBGX09LCi0jZWxzZQotIyAgZGVmaW5lIE9TWVNfVEVTVF9GSUxFIDAKLSNlbmRpZgotCi0KLS8qCi0gKiBVdGlsaXR5IG1hY3Jvcy4KLSAqLwotI2RlZmluZSBPU1lTX1VOVVNFRCh4KSAoKHZvaWQpKHgpKQotCi0jaWZkZWYgT1NZU19QQVRIX0RPUwotIyAgZGVmaW5lIE9TWVNfUEFUSF9JU19EUklWRV9MRVRURVIoY2gpIFwKLSAgICAgICAgICAoKChjaCkgPj0gJ0EnICYmIChjaCkgPD0gJ1onKSB8fCAoKGNoKSA+PSAnYScgJiYgKGNoKSA8PSAneicpKQotI2VuZGlmCi0KLSNpZmRlZiBPU1lTX1dJTkRPV1MKLSMgIGlmIGRlZmluZWQgT1NZU19XSU42NAotIyAgICBkZWZpbmUgT1NZU19IQVZFX1NURElPX19JNjQKLSMgICAgZGVmaW5lIE9TWVNfV0lORE9XU19JU19XSU45WCgpIDAKLSMgIGVsc2UKLSMgICAgaWYgKGRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPj0gMTQwMCkgfHwgXAotICAgICAgICAoZGVmaW5lZCBfX01TVkNSVF9WRVJTSU9OX18gJiYgX19NU1ZDUlRfVkVSU0lPTl9fID49IDB4ODAwKQotIyAgICAgIGRlZmluZSBPU1lTX0hBVkVfU1RESU9fX0k2NAotIyAgICBlbmRpZgotIyAgICBkZWZpbmUgT1NZU19XSU5ET1dTX0lTX1dJTjlYKCkgKEdldFZlcnNpb24oKSA+PSAweDgwMDAwMDAwVSkKLSMgIGVuZGlmCi0jZW5kaWYKLQotCi0vKgotICogQ3JlYXRlcyBhIG5ldyBwYXRoIG5hbWUgYnkgY2hhbmdpbmcgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgb2YKLSAqIGEgc3BlY2lmaWVkIHBhdGggbmFtZS4KLSAqLwotY2hhciAqCi1vc3lzX3BhdGhfY2hkaXIoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvbGRfcGF0aCwgY29uc3QgY2hhciAqbmV3X2Rpcm5hbWUpCi17Ci0gICAgY29uc3QgY2hhciAqcGF0aCwgKnB0cjsKLSAgICBzaXplX3QgZGlybGVuOwotCi0gICAgLyogRXh0cmFjdCBmaWxlIG5hbWUgZnJvbSBvbGRfcGF0aC4gKi8KLSAgICBwYXRoID0gb2xkX3BhdGg7Ci0jaWZkZWYgT1NZU19QQVRIX0RPUwotICAgIGlmIChPU1lTX1BBVEhfSVNfRFJJVkVfTEVUVEVSKHBhdGhbMF0pICYmIHBhdGhbMV0gPT0gJzonKQotICAgICAgICBwYXRoICs9IDI7ICAvKiBza2lwIGRyaXZlIG5hbWUgKi8KLSNlbmRpZgotICAgIGZvciAoIDsgOyApCi0gICAgewotICAgICAgICBwdHIgPSBzdHJwYnJrKHBhdGgsIE9TWVNfUEFUSF9QQVRIU0VQX0FMTF9TVFIpOwotICAgICAgICBpZiAocHRyID09IE5VTEwpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgcGF0aCA9IHB0ciArIDE7Ci0gICAgfQotCi0gICAgLyogTWFrZSBzdXJlIHRoZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoLiAqLwotICAgIGRpcmxlbiA9IHN0cmxlbihuZXdfZGlybmFtZSk7Ci0gICAgaWYgKGRpcmxlbiArIHN0cmxlbihwYXRoKSArIDIgPj0gYnVmc2l6ZSkgIC8qIG92ZXJmbG93ICovCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyogQ29weSB0aGUgbmV3IGRpcmVjdG9yeSBuYW1lLiBBbHNvIGFwcGVuZCBhIHNsYXNoIGlmIG5lY2Vzc2FyeS4gKi8KLSAgICBpZiAoZGlybGVuID4gMCkKLSAgICB7Ci0gICAgICAgIHN0cmNweShidWZmZXIsIG5ld19kaXJuYW1lKTsKLSNpZmRlZiBPU1lTX1BBVEhfRE9TCi0gICAgICAgIGlmIChkaXJsZW4gPT0gMiAmJiBidWZmZXJbMV0gPT0gJzonICYmCi0gICAgICAgICAgICBPU1lTX1BBVEhfSVNfRFJJVkVfTEVUVEVSKGJ1ZmZlclswXSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNwZWNpYWwgY2FzZTogZG8gbm90IGFwcGVuZCBzbGFzaCB0byAiQzoiLiAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RyY2hyKE9TWVNfUEFUSF9QQVRIU0VQX0FMTF9TVFIsIGJ1ZmZlcltkaXJsZW4gLSAxXSkgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBidWZmZXJbZGlybGVuKytdID0gT1NZU19QQVRIX1BBVEhTRVA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBBcHBlbmQgdGhlIGZpbGUgbmFtZS4gKi8KLSAgICBzdHJjcHkoYnVmZmVyICsgZGlybGVuLCBwYXRoKTsKLSAgICByZXR1cm4gYnVmZmVyOwotfQotCi0vKgotICogQ3JlYXRlcyBhIG5ldyBwYXRoIG5hbWUgYnkgY2hhbmdpbmcgdGhlIGV4dGVuc2lvbiBjb21wb25lbnQgb2YKLSAqIGEgc3BlY2lmaWVkIHBhdGggbmFtZS4KLSAqLwotY2hhciAqCi1vc3lzX3BhdGhfY2hleHQoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvbGRfcGF0aCwgY29uc3QgY2hhciAqbmV3X2V4dG5hbWUpCi17Ci0gICAgc2l6ZV90IGksIHBvczsKLQotICAgIGlmIChuZXdfZXh0bmFtZVswXSAhPSBPU1lTX1BBVEhfRVhUU0VQKSAgLyogaW52YWxpZCBhcmd1bWVudCAqLwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBmb3IgKGkgPSAwLCBwb3MgPSAoc2l6ZV90KSgtMSk7IG9sZF9wYXRoW2ldICE9IDA7ICsraSkKLSAgICB7Ci0gICAgICAgIGlmIChpID49IGJ1ZnNpemUpICAvKiBvdmVyZmxvdyAqLwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmICgoYnVmZmVyW2ldID0gb2xkX3BhdGhbaV0pID09IE9TWVNfUEFUSF9FWFRTRVApCi0gICAgICAgICAgICBwb3MgPSBpOwotICAgIH0KLSAgICBpZiAoaSA+IHBvcykKLSAgICAgICAgaSA9IHBvczsgIC8qIGdvIGJhY2sgb25seSBpZiBvbGRfcGF0aCBoYXMgYW4gZXh0ZW5zaW9uICovCi0gICAgZm9yICggOyA7ICsraSwgKytuZXdfZXh0bmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChpID49IGJ1ZnNpemUpICAvKiBvdmVyZmxvdyAqLwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmICgoYnVmZmVyW2ldID0gKm5ld19leHRuYW1lKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKLSAgICB9Ci19Ci0KLS8qCi0gKiBDcmVhdGVzIGEgYmFja3VwIHBhdGggbmFtZS4KLSAqLwotY2hhciAqCi1vc3lzX3BhdGhfbWtiYWsoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSwgY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBiYWtfZXh0bmFtZVtdID0gT1NZU19QQVRIX0VYVFNFUF9TVFIgImJhayI7Ci0KLSAgICBpZiAoc3RybGVuKHBhdGgpICsgc2l6ZW9mKGJha19leHRuYW1lKSA+IGJ1ZnNpemUpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0jaWYgZGVmaW5lZCBPU1lTX0RPUwotCi0gICAgcmV0dXJuIG9zeXNfcGF0aF9jaGV4dChidWZmZXIsIGJ1ZnNpemUsIHBhdGgsIGJha19leHRuYW1lKTsKLQotI2Vsc2UgIC8qIE9TWVNfVU5JWCBhbmQgb3RoZXJzICovCi0KLSAgICBzdHJjcHkoYnVmZmVyLCBwYXRoKTsKLSAgICBzdHJjYXQoYnVmZmVyLCBiYWtfZXh0bmFtZSk7Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKLQotI2VuZGlmCi19Ci0KLS8qCi0gKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmaWxlIHBvc2l0aW9uIGluZGljYXRvci4KLSAqLwotb3N5c19mb2Zmc2V0X3QKLW9zeXNfZnRlbGxvKEZJTEUgKnN0cmVhbSkKLXsKLSNpZiBkZWZpbmVkIE9TWVNfSEFWRV9TVERJT19fSTY0Ci0KLSAgICByZXR1cm4gKG9zeXNfZm9mZnNldF90KV9mdGVsbGk2NChzdHJlYW0pOwotCi0jZWxpZiBkZWZpbmVkIE9TWVNfVU5JWCAmJiAoT1NZU19GT0ZGU0VUX01BWCA+IExPTkdfTUFYKQotCi0gICAgLyogV2UgZG9uJ3Qga25vdyBpZiBvZmZfdCBpcyBzdWZmaWNpZW50bHkgd2lkZSwgd2Ugb25seSBrbm93IHRoYXQKLSAgICAgKiBsb25nIGlzbid0LiBXZSBhcmUgdHJ5aW5nIGp1c3QgYSBsaXR0bGUgaGFyZGVyLCBpbiB0aGUgYWJzZW5jZQotICAgICAqIG9mIGFuIGZvcGVuNjQvZnRlbGw2NCBzb2x1dGlvbi4KLSAgICAgKi8KLSAgICByZXR1cm4gKG9zeXNfZm9mZnNldF90KWZ0ZWxsbyhzdHJlYW0pOwotCi0jZWxzZSAgLyogZ2VuZXJpYyAqLwotCi0gICAgcmV0dXJuIChvc3lzX2ZvZmZzZXRfdClmdGVsbChzdHJlYW0pOwotCi0jZW5kaWYKLX0KLQotLyoKLSAqIFNldHMgdGhlIGZpbGUgcG9zaXRpb24gaW5kaWNhdG9yIGF0IHRoZSBzcGVjaWZpZWQgZmlsZSBvZmZzZXQuCi0gKi8KLWludAotb3N5c19mc2Vla28oRklMRSAqc3RyZWFtLCBvc3lzX2ZvZmZzZXRfdCBvZmZzZXQsIGludCB3aGVuY2UpCi17Ci0jaWYgZGVmaW5lZCBPU1lTX0hBVkVfU1RESU9fX0k2NAotCi0gICAgcmV0dXJuIF9mc2Vla2k2NChzdHJlYW0sIChfX2ludDY0KW9mZnNldCwgd2hlbmNlKTsKLQotI2VsaWYgZGVmaW5lZCBPU1lTX1VOSVgKLQotI2lmIE9TWVNfRk9GRlNFVF9NQVggPiBMT05HX01BWAotICAgIC8qIFdlIGRvbid0IGtub3cgaWYgb2ZmX3QgaXMgc3VmZmljaWVudGx5IHdpZGUsIHdlIG9ubHkga25vdyB0aGF0Ci0gICAgICogbG9uZyBpc24ndC4gV2UgYXJlIHRyeWluZyBqdXN0IGEgbGl0dGxlIGhhcmRlciwgaW4gdGhlIGFic2VuY2UKLSAgICAgKiBvZiBhbiBmb3BlbjY0L2ZzZWVrNjQgc29sdXRpb24uCi0gICAgICovCi0gICAgcmV0dXJuIGZzZWVrbyhzdHJlYW0sIChvZmZfdClvZmZzZXQsIHdoZW5jZSk7Ci0jZWxzZQotICAgIHJldHVybiBmc2VlayhzdHJlYW0sIChsb25nKW9mZnNldCwgd2hlbmNlKTsKLSNlbmRpZgotCi0jZWxzZSAgLyogZ2VuZXJpYyAqLwotCi0gICAgcmV0dXJuIChmc2VlayhzdHJlYW0sIChsb25nKW9mZnNldCwgd2hlbmNlKSA9PSAwKSA/IDAgOiAtMTsKLQotI2VuZGlmCi19Ci0KLS8qCi0gKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSBzdHJlYW0uCi0gKi8KLWludAotb3N5c19mZ2V0c2l6ZShGSUxFICpzdHJlYW0sIG9zeXNfZnNpemVfdCAqc2l6ZSkKLXsKLSNpZiBkZWZpbmVkIE9TWVNfV0lORE9XUwotCi0gICAgSEFORExFIGhGaWxlOwotICAgIERXT1JEIGR3U2l6ZUxvdywgZHdTaXplSGlnaDsKLQotICAgIGhGaWxlID0gKEhBTkRMRSlfZ2V0X29zZmhhbmRsZShfZmlsZW5vKHN0cmVhbSkpOwotICAgIGR3U2l6ZUxvdyA9IEdldEZpbGVTaXplKGhGaWxlLCAmZHdTaXplSGlnaCk7Ci0gICAgaWYgKEdldExhc3RFcnJvcigpICE9IE5PX0VSUk9SKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgKnNpemUgPSAob3N5c19mc2l6ZV90KWR3U2l6ZUxvdyArICgob3N5c19mc2l6ZV90KWR3U2l6ZUhpZ2ggPDwgMzIpOwotICAgIHJldHVybiAwOwotCi0jZWxzZSAgLyogZ2VuZXJpYyAqLwotCi0gICAgb3N5c19mb2Zmc2V0X3Qgb2Zmc2V0OwotCi0gICAgaWYgKG9zeXNfZnNlZWtvKHN0cmVhbSwgMCwgU0VFS19FTkQpICE9IDApCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBvZmZzZXQgPSBvc3lzX2Z0ZWxsbyhzdHJlYW0pOwotICAgIGlmIChvZmZzZXQgPCAwKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgKnNpemUgPSAob3N5c19mc2l6ZV90KW9mZnNldDsKLSAgICByZXR1cm4gMDsKLQotI2VuZGlmCi19Ci0KLS8qCi0gKiBSZWFkcyBhIGJsb2NrIG9mIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgb2Zmc2V0LgotICovCi1zaXplX3QKLW9zeXNfZnJlYWRfYXQoRklMRSAqc3RyZWFtLCBvc3lzX2ZvZmZzZXRfdCBvZmZzZXQsIGludCB3aGVuY2UsCi0gICAgICAgICAgICAgIHZvaWQgKmJsb2NrLCBzaXplX3QgYmxvY2tzaXplKQotewotICAgIGZwb3NfdCBwb3M7Ci0gICAgc2l6ZV90IHJlc3VsdDsKLQotICAgIGlmIChmZ2V0cG9zKHN0cmVhbSwgJnBvcykgIT0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKG9zeXNfZnNlZWtvKHN0cmVhbSwgb2Zmc2V0LCB3aGVuY2UpID09IDApCi0gICAgICAgIHJlc3VsdCA9IGZyZWFkKGJsb2NrLCAxLCBibG9ja3NpemUsIHN0cmVhbSk7Ci0gICAgZWxzZQotICAgICAgICByZXN1bHQgPSAwOwotICAgIGlmIChmc2V0cG9zKHN0cmVhbSwgJnBvcykgIT0gMCkKLSAgICAgICAgcmVzdWx0ID0gMDsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICogV3JpdGVzIGEgYmxvY2sgb2YgZGF0YSBhdCB0aGUgc3BlY2lmaWVkIGZpbGUgb2Zmc2V0LgotICovCi1zaXplX3QKLW9zeXNfZndyaXRlX2F0KEZJTEUgKnN0cmVhbSwgb3N5c19mb2Zmc2V0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlLAotICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYmxvY2ssIHNpemVfdCBibG9ja3NpemUpCi17Ci0gICAgZnBvc190IHBvczsKLSAgICBzaXplX3QgcmVzdWx0OwotCi0gICAgaWYgKGZnZXRwb3Moc3RyZWFtLCAmcG9zKSAhPSAwIHx8IGZmbHVzaChzdHJlYW0pICE9IDApCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChvc3lzX2ZzZWVrbyhzdHJlYW0sIG9mZnNldCwgd2hlbmNlKSA9PSAwKQotICAgICAgICByZXN1bHQgPSBmd3JpdGUoYmxvY2ssIDEsIGJsb2Nrc2l6ZSwgc3RyZWFtKTsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgaWYgKGZmbHVzaChzdHJlYW0pICE9IDApCi0gICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgaWYgKGZzZXRwb3Moc3RyZWFtLCAmcG9zKSAhPSAwKQotICAgICAgICByZXN1bHQgPSAwOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi0gKiBDaGFuZ2VzIHRoZSBuYW1lIG9mIGEgZmlsZSBwYXRoLgotICovCi1pbnQKLW9zeXNfcmVuYW1lKGNvbnN0IGNoYXIgKnNyY19wYXRoLCBjb25zdCBjaGFyICpkZXN0X3BhdGgsIGludCBjbG9iYmVyKQotewotI2lmIGRlZmluZWQgT1NZU19XSU5ET1dTCi0KLSAgICBEV09SRCBkd0ZsYWdzOwotCi0jaWYgIWRlZmluZWQgT1NZU19XSU42NAotICAgIGlmIChPU1lTX1dJTkRPV1NfSVNfV0lOOVgoKSkKLSAgICB7Ci0gICAgICAgIC8qIE1vdmVGaWxlRXggaXMgbm90IGF2YWlsYWJsZSB1bmRlciBXaW45WDsgdXNlIE1vdmVGaWxlLiAqLwotICAgICAgICBpZiAoTW92ZUZpbGVBKHNyY19wYXRoLCBkZXN0X3BhdGgpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmICghY2xvYmJlcikKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgRGVsZXRlRmlsZUEoZGVzdF9wYXRoKTsKLSAgICAgICAgcmV0dXJuIE1vdmVGaWxlQShzcmNfcGF0aCwgZGVzdF9wYXRoKSA/IDAgOiAtMTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGR3RmxhZ3MgPSBjbG9iYmVyID8gTU9WRUZJTEVfUkVQTEFDRV9FWElTVElORyA6IDA7Ci0gICAgcmV0dXJuIE1vdmVGaWxlRXhBKHNyY19wYXRoLCBkZXN0X3BhdGgsIGR3RmxhZ3MpID8gMCA6IC0xOwotCi0jZWxpZiBkZWZpbmVkIE9TWVNfVU5JWAotCi0gICAgaWYgKCFjbG9iYmVyKQotICAgIHsKLSAgICAgICAgaWYgKGFjY2VzcyhkZXN0X3BhdGgsIE9TWVNfVEVTVF9GSUxFKSA+PSAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gcmVuYW1lKHNyY19wYXRoLCBkZXN0X3BhdGgpOwotCi0jZWxzZSAgLyogZ2VuZXJpYyAqLwotCi0gICAgaWYgKG9zeXNfdGVzdChkZXN0X3BhdGgsICJlIikgPT0gMCkKLSAgICB7Ci0gICAgICAgIGlmICghY2xvYmJlcikKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgb3N5c191bmxpbmsoZGVzdF9wYXRoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlbmFtZShzcmNfcGF0aCwgZGVzdF9wYXRoKTsKLQotI2VuZGlmCi19Ci0KLS8qCi0gKiBDb3BpZXMgdGhlIGF0dHJpYnV0ZXMgKGFjY2VzcyBtb2RlLCB0aW1lIHN0YW1wLCBldGMuKSBvZiB0aGUgc291cmNlCi0gKiBmaWxlIHBhdGggb250byB0aGUgZGVzdGluYXRpb24gZmlsZSBwYXRoLgotICovCi1pbnQKLW9zeXNfY29weV9hdHRyKGNvbnN0IGNoYXIgKnNyY19wYXRoLCBjb25zdCBjaGFyICpkZXN0X3BhdGgpCi17Ci0jaWYgZGVmaW5lZCBPU1lTX1dJTkRPV1MKLQotICAgIEhBTkRMRSBoRmlsZTsKLSAgICBGSUxFVElNRSBmdExhc3RXcml0ZTsKLSAgICBCT09MIHJlc3VsdDsKLQotICAgIGhGaWxlID0gQ3JlYXRlRmlsZUEoc3JjX3BhdGgsIEdFTkVSSUNfUkVBRCwgMCwgTlVMTCwgT1BFTl9FWElTVElORywgMCwgMCk7Ci0gICAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgcmVzdWx0ID0gR2V0RmlsZVRpbWUoaEZpbGUsIE5VTEwsIE5VTEwsICZmdExhc3RXcml0ZSk7Ci0gICAgQ2xvc2VIYW5kbGUoaEZpbGUpOwotICAgIGlmICghcmVzdWx0KQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBoRmlsZSA9IENyZWF0ZUZpbGVBKGRlc3RfcGF0aCwgR0VORVJJQ19XUklURSwgMCwgTlVMTCwgT1BFTl9FWElTVElORywKLSAgICAgICAgKE9TWVNfV0lORE9XU19JU19XSU45WCgpID8gMCA6IEZJTEVfRkxBR19CQUNLVVBfU0VNQU5USUNTKSwgMCk7Ci0gICAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgcmVzdWx0ID0gU2V0RmlsZVRpbWUoaEZpbGUsIE5VTEwsIE5VTEwsICZmdExhc3RXcml0ZSk7Ci0gICAgQ2xvc2VIYW5kbGUoaEZpbGUpOwotICAgIGlmICghcmVzdWx0KQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBUT0RPOiBDb3B5IHRoZSBhY2Nlc3MgbW9kZS4gKi8KLQotICAgIHJldHVybiAwOwotCi0jZWxpZiBkZWZpbmVkIE9TWVNfVU5JWCB8fCBkZWZpbmVkIE9TWVNfRE9TSVNICi0KLSAgICBzdHJ1Y3Qgc3RhdCBzYnVmOwotICAgIGludCAvKiBtb2RlX3QgKi8gbW9kZTsKLQotICAgIGlmIChzdGF0KHNyY19wYXRoLCAmc2J1ZikgIT0gMCkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgbW9kZSA9IChpbnQpc2J1Zi5zdF9tb2RlOwotICAgIGlmIChjaG1vZChkZXN0X3BhdGgsIG1vZGUpICE9IDApCi0gICAgICAgIHJldHVybiAtMTsKLQotI2lmZGVmIEFUX0ZEQ1dECi0gICAgewotICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZXNbMl07Ci0KLSAgICAgICAgdGltZXNbMF0gPSBzYnVmLnN0X2F0aW07Ci0gICAgICAgIHRpbWVzWzFdID0gc2J1Zi5zdF9tdGltOwotICAgICAgICBpZiAodXRpbWVuc2F0KEFUX0ZEQ1dELCBkZXN0X3BhdGgsIHRpbWVzLCAwKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSNlbHNlICAvKiBsZWdhY3kgdXRpbWUgKi8KLSAgICB7Ci0gICAgICAgIHN0cnVjdCB1dGltYnVmIHV0YnVmOwotCi0gICAgICAgIHV0YnVmLmFjdGltZSA9IHNidWYuc3RfYXRpbWU7Ci0gICAgICAgIHV0YnVmLm1vZHRpbWUgPSBzYnVmLnN0X210aW1lOwotICAgICAgICBpZiAodXRpbWUoZGVzdF9wYXRoLCAmdXRidWYpICE9IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gMDsKLQotI2Vsc2UgIC8qIGdlbmVyaWMgKi8KLQotICAgIE9TWVNfVU5VU0VEKGRlc3RfcGF0aCk7Ci0gICAgT1NZU19VTlVTRUQoc3JjX3BhdGgpOwotCi0gICAgLyogQWx3YXlzIGZhaWwuICovCi0gICAgcmV0dXJuIC0xOwotCi0jZW5kaWYKLX0KLQotLyoKLSAqIENyZWF0ZXMgYSBuZXcgZGlyZWN0b3J5LgotICovCi1pbnQKLW9zeXNfY3JlYXRlX2Rpcihjb25zdCBjaGFyICpkaXJuYW1lKQotewotICAgIHNpemVfdCBsZW47Ci0KLSAgICBsZW4gPSBzdHJsZW4oZGlybmFtZSk7Ci0gICAgaWYgKGxlbiA9PSAwKSAgLyogY3VycmVudCBkaXJlY3RvcnkgKi8KLSAgICAgICAgcmV0dXJuIDA7Ci0KLSNpZmRlZiBPU1lTX1BBVEhfRE9TCi0gICAgaWYgKGxlbiA9PSAyICYmIGRpcm5hbWVbMV0gPT0gJzonICYmIE9TWVNfUEFUSF9JU19EUklWRV9MRVRURVIoZGlybmFtZVswXSkpCi0gICAgICAgIHJldHVybiAwOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIE9TWVNfV0lORE9XUwotCi0gICAgewotICAgICAgICBjaGFyICp3aWxkbmFtZTsKLSAgICAgICAgSEFORExFIGhGaW5kOwotICAgICAgICBXSU4zMl9GSU5EX0RBVEFBIHdmZDsKLQotICAgICAgICAvKiBTZWUgaWYgZGlybmFtZSBleGlzdHM6IGZpbmQgZmlsZXMgaW4gKGRpcm5hbWUgKyAiXFwqIikuICovCi0gICAgICAgIGlmIChsZW4gKyAzIDwgbGVuKSAgLyogb3ZlcmZsb3cgKi8KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgd2lsZG5hbWUgPSAoY2hhciAqKW1hbGxvYyhsZW4gKyAzKTsKLSAgICAgICAgaWYgKHdpbGRuYW1lID09IE5VTEwpICAvKiBvdXQgb2YgbWVtb3J5ICovCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHN0cmNweSh3aWxkbmFtZSwgZGlybmFtZSk7Ci0gICAgICAgIGlmIChzdHJjaHIoT1NZU19QQVRIX1BBVEhTRVBfQUxMX1NUUiwgd2lsZG5hbWVbbGVuIC0gMV0pID09IE5VTEwpCi0gICAgICAgICAgICB3aWxkbmFtZVtsZW4rK10gPSBPU1lTX1BBVEhfUEFUSFNFUDsKLSAgICAgICAgd2lsZG5hbWVbbGVuKytdID0gJyonOwotICAgICAgICB3aWxkbmFtZVtsZW5dID0gJ1wwJzsKLSAgICAgICAgaEZpbmQgPSBGaW5kRmlyc3RGaWxlQSh3aWxkbmFtZSwgJndmZCk7Ci0gICAgICAgIGZyZWUod2lsZG5hbWUpOwotICAgICAgICBpZiAoaEZpbmQgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbmRDbG9zZShoRmluZCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFRoZXJlIGlzIG5vIGRpcmVjdG9yeSwgc28gY3JlYXRlIG9uZSBub3cuICovCi0gICAgICAgIHJldHVybiBDcmVhdGVEaXJlY3RvcnlBKGRpcm5hbWUsIE5VTEwpID8gMCA6IC0xOwotICAgIH0KLQotI2VsaWYgZGVmaW5lZCBPU1lTX1VOSVggfHwgZGVmaW5lZCBPU1lTX0RPU0lTSAotCi0gICAgewotICAgICAgICBzdHJ1Y3Qgc3RhdCBzYnVmOwotCi0gICAgICAgIGlmIChzdGF0KGRpcm5hbWUsICZzYnVmKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIChzYnVmLnN0X21vZGUgJiBTX0lGRElSKSA/IDAgOiAtMTsKLQotICAgICAgICAvKiBUaGVyZSBpcyBubyBkaXJlY3RvcnksIHNvIGNyZWF0ZSBvbmUgbm93LiAqLwotI2lmIGRlZmluZWQgT1NZU19VTklYCi0gICAgICAgIHJldHVybiBta2RpcihkaXJuYW1lLCAwNzc3KTsKLSNlbHNlCi0gICAgICAgIHJldHVybiBta2RpcihkaXJuYW1lKTsKLSNlbmRpZgotICAgIH0KLQotI2Vsc2UgIC8qIGdlbmVyaWMgKi8KLQotICAgIE9TWVNfVU5VU0VEKGRpcm5hbWUpOwotCi0gICAgLyogQWx3YXlzIGZhaWwuICovCi0gICAgcmV0dXJuIC0xOwotCi0jZW5kaWYKLX0KLQotLyoKLSAqIERldGVybWluZXMgaWYgdGhlIGFjY2Vzc2liaWxpdHkgb2YgdGhlIHNwZWNpZmllZCBwYXRoIHNhdGlzZmllcwotICogdGhlIHNwZWNpZmllZCBhY2Nlc3MgbW9kZS4KLSAqLwotaW50Ci1vc3lzX3Rlc3QoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSkKLXsKLSAgICBpbnQgZmFjY2VzcywgZnJlZzsKLQotICAgIGZhY2Nlc3MgPSBmcmVnID0gMDsKLSAgICBpZiAoc3RyY2hyKG1vZGUsICdmJykgIT0gTlVMTCkKLSAgICAgICAgZnJlZyA9IDE7Ci0gICAgaWYgKHN0cmNocihtb2RlLCAncicpICE9IE5VTEwpCi0gICAgICAgIGZhY2Nlc3MgfD0gT1NZU19URVNUX1JFQUQ7Ci0gICAgaWYgKHN0cmNocihtb2RlLCAndycpICE9IE5VTEwpCi0gICAgICAgIGZhY2Nlc3MgfD0gT1NZU19URVNUX1dSSVRFOwotICAgIGlmIChzdHJjaHIobW9kZSwgJ3gnKSAhPSBOVUxMKQotICAgICAgICBmYWNjZXNzIHw9IE9TWVNfVEVTVF9FWEVDOwotICAgIGlmIChmYWNjZXNzID09IDAgJiYgZnJlZyA9PSAwKQotICAgIHsKLSAgICAgICAgaWYgKHN0cmNocihtb2RlLCAnZScpID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkIE9TWVNfV0lORE9XUwotCi0gICAgewotICAgICAgICBEV09SRCBhdHRyOwotCi0gICAgICAgIGF0dHIgPSBHZXRGaWxlQXR0cmlidXRlc0EocGF0aCk7Ci0gICAgICAgIGlmIChhdHRyID09IDB4ZmZmZmZmZmZVKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoZnJlZyAmJiAoYXR0ciAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGlmICgoZmFjY2VzcyAmIE9TWVNfVEVTVF9XUklURSkgJiYgKGF0dHIgJiBGSUxFX0FUVFJJQlVURV9SRUFET05MWSkpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotI2VsaWYgZGVmaW5lZCBPU1lTX1VOSVggfHwgZGVmaW5lZCBPU1lTX0RPU0lTSAotCi0gICAgewotICAgICAgICBzdHJ1Y3Qgc3RhdCBzYnVmOwotCi0gICAgICAgIGlmIChzdGF0KHBhdGgsICZzYnVmKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoZnJlZyAmJiAhKHNidWYuc3RfbW9kZSAmIFNfSUZSRUcpKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoZmFjY2VzcyA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiBhY2Nlc3MocGF0aCwgZmFjY2Vzcyk7Ci0gICAgfQotCi0jZWxzZSAgLyogZ2VuZXJpYyAqLwotCi0gICAgewotICAgICAgICBGSUxFICpzdHJlYW07Ci0KLSAgICAgICAgaWYgKGZhY2Nlc3MgJiBPU1lTX1RFU1RfV1JJVEUpCi0gICAgICAgICAgICBzdHJlYW0gPSBmb3BlbihwYXRoLCAicitiIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0cmVhbSA9IGZvcGVuKHBhdGgsICJyYiIpOwotICAgICAgICBpZiAoc3RyZWFtID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGZjbG9zZShzdHJlYW0pOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSNlbmRpZgotfQotCi0vKgotICogRGV0ZXJtaW5lcyBpZiB0d28gYWNjZXNzaWJsZSBwYXRocyBhcmUgZXF1aXZhbGVudCwgaS5lLiB0aGV5Ci0gKiBwb2ludCB0byB0aGUgc2FtZSBwaHlzaWNhbCBsb2NhdGlvbi4KLSAqLwotaW50Ci1vc3lzX3Rlc3RfZXEoY29uc3QgY2hhciAqcGF0aDEsIGNvbnN0IGNoYXIgKnBhdGgyKQotewotI2lmIGRlZmluZWQgT1NZU19XSU5ET1dTCi0KLSAgICBIQU5ETEUgaEZpbGUxLCBoRmlsZTI7Ci0gICAgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gZmlsZUluZm8xLCBmaWxlSW5mbzI7Ci0gICAgaW50IHJlc3VsdDsKLQotICAgIGhGaWxlMSA9IENyZWF0ZUZpbGVBKHBhdGgxLCBHRU5FUklDX1JFQUQsIDAsIE5VTEwsIE9QRU5fRVhJU1RJTkcsIDAsIDApOwotICAgIGlmIChoRmlsZTEgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBoRmlsZTIgPSBDcmVhdGVGaWxlQShwYXRoMiwgR0VORVJJQ19SRUFELCAwLCBOVUxMLCBPUEVOX0VYSVNUSU5HLCAwLCAwKTsKLSAgICBpZiAoaEZpbGUyID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgIHsKLSAgICAgICAgQ2xvc2VIYW5kbGUoaEZpbGUxKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoIUdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKGhGaWxlMSwgJmZpbGVJbmZvMSkgfHwKLSAgICAgICAgIUdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKGhGaWxlMiwgJmZpbGVJbmZvMikpCi0gICAgewotICAgICAgICAvKiBDYW4ndCByZXRyaWV2ZSB0aGUgZmlsZSBpbmZvLiAqLwotICAgICAgICByZXN1bHQgPSAtMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIGlmIChmaWxlSW5mbzEubkZpbGVJbmRleExvdyA9PSBmaWxlSW5mbzIubkZpbGVJbmRleExvdyAmJgotICAgICAgICBmaWxlSW5mbzEubkZpbGVJbmRleEhpZ2ggPT0gZmlsZUluZm8yLm5GaWxlSW5kZXhIaWdoICYmCi0gICAgICAgIGZpbGVJbmZvMS5kd1ZvbHVtZVNlcmlhbE51bWJlciA9PSBmaWxlSW5mbzIuZHdWb2x1bWVTZXJpYWxOdW1iZXIpCi0gICAgewotICAgICAgICAvKiBUaGUgdHdvIHBhdGhzIGhhdmUgdGhlIHNhbWUgSUQgb24gdGhlIHNhbWUgdm9sdW1lLiAqLwotICAgICAgICByZXN1bHQgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBUaGUgdHdvIHBhdGhzIGhhdmUgZGlmZmVyZW50IElEcyBvciBzaXQgb24gZGlmZmVyZW50IHZvbHVtZXMuICovCi0gICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgfQotICAgIENsb3NlSGFuZGxlKGhGaWxlMSk7Ci0gICAgQ2xvc2VIYW5kbGUoaEZpbGUyKTsKLSAgICByZXR1cm4gcmVzdWx0OwotCi0jZWxpZiBkZWZpbmVkIE9TWVNfVU5JWCB8fCBkZWZpbmVkIE9TWVNfRE9TSVNICi0KLSAgICBzdHJ1Y3Qgc3RhdCBzYnVmMSwgc2J1ZjI7Ci0KLSAgICBpZiAoc3RhdChwYXRoMSwgJnNidWYxKSAhPSAwIHx8IHN0YXQocGF0aDIsICZzYnVmMikgIT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIENhbid0IHN0YXQgdGhlIHBhdGhzLiAqLwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChzYnVmMS5zdF9kZXYgPT0gc2J1ZjIuc3RfZGV2ICYmIHNidWYxLnN0X2lubyA9PSBzYnVmMi5zdF9pbm8pCi0gICAgewotICAgICAgICAvKiBUaGUgdHdvIHBhdGhzIGhhdmUgdGhlIHNhbWUgZGV2aWNlIGFuZCBpbm9kZSBudW1iZXJzLiAqLwotICAgICAgICAvKiBUaGUgaW5vZGUgbnVtYmVycyBhcmUgcmVsaWFibGUgb25seSBpZiB0aGV5J3JlIG5vdCAwLiAqLwotICAgICAgICByZXR1cm4gKHNidWYxLnN0X2lubyAhPSAwKSA/IDEgOiAtMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogVGhlIHR3byBwYXRocyBoYXZlIGRpZmZlcmVudCBkZXZpY2Ugb3IgaW5vZGUgbnVtYmVycy4gKi8KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0jZWxzZSAgLyogZ2VuZXJpYyAqLwotCi0gICAgT1NZU19VTlVTRUQocGF0aDEpOwotICAgIE9TWVNfVU5VU0VEKHBhdGgyKTsKLQotICAgIC8qIEFsd2F5cyB1bmtub3duLiAqLwotICAgIHJldHVybiAtMTsKLQotI2VuZGlmCi19Ci0KLS8qCi0gKiBSZW1vdmVzIGEgZGlyZWN0b3J5IGVudHJ5LgotICovCi1pbnQKLW9zeXNfdW5saW5rKGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0jaWYgZGVmaW5lZCBPU1lTX1dJTkRPV1MKLQotICAgIHJldHVybiBEZWxldGVGaWxlQShwYXRoKSA/IDAgOiAtMTsKLQotI2VsaWYgZGVmaW5lZCBPU1lTX09TX1VOSVggfHwgZGVmaW5lZCBPU1lTX09TX0RPU0lTSAotCi0gICAgcmV0dXJuIHVubGluayhwYXRoKTsKLQotI2Vsc2UgIC8qIGdlbmVyaWMgKi8KLQotICAgIHJldHVybiByZW1vdmUocGF0aCk7Ci0KLSNlbmRpZgotfQotCi0vKgotICogUHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UgdG8gc3RkZXJyIGFuZCB0ZXJtaW5hdGVzIHRoZSBwcm9ncmFtCi0gKiBleGVjdXRpb24gaW1tZWRpYXRlbHksIGV4aXRpbmcgd2l0aCBjb2RlIDcwIChFWF9TT0ZUV0FSRSkuCi0gKi8KLXZvaWQKLW9zeXNfdGVybWluYXRlKHZvaWQpCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKm1zZyA9Ci0gICAgICAgICJUaGUgZXhlY3V0aW9uIG9mIHRoaXMgcHJvZ3JhbSBoYXMgYmVlbiB0ZXJtaW5hdGVkIGFibm9ybWFsbHkuXG4iOwotICAgIGZwdXRzKG1zZywgc3RkZXJyKTsKLSAgICBleGl0KDcwKTsgIC8qIEVYX1NPRlRXQVJFICovCi19CmRpZmYgLS1naXQgYS9zcmMvb3B0aXBuZy9vc3lzLmggYi9zcmMvb3B0aXBuZy9vc3lzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYmE4NjkuLjAwMDAwMDAKLS0tIGEvc3JjL29wdGlwbmcvb3N5cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qCi0gKiBvc3lzLmgKLSAqIFN5c3RlbSBleHRlbnNpb25zLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMy0yMDEyIENvc21pbiBUcnV0YS4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB6bGliIGxpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIHRoZSBhdHRhY2hlZCBMSUNFTlNFIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICovCi0KLSNpZm5kZWYgT1NZU19ICi0jZGVmaW5lIE9TWVNfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotCi0vKgotICogRmlsZSBvZmZzZXQgYW5kIHNpemUgdHlwZXM6Ci0gKgotICogb3N5c19mb2Zmc2V0X3Q6IHRoZSBmaWxlIG9mZnNldCB0eXBlIChhIHNpZ25lZCBpbnRlZ2VyIHR5cGUpCi0gKiBPU1lTX0ZPRkZTRVRfTUlOOiB0aGUgbWluaW11bSB2YWx1ZSAobGVzcyB0aGFuIDApCi0gKiBPU1lTX0ZPRkZTRVRfTUFYOiB0aGUgbWF4aW11bSB2YWx1ZSAoZ3JlYXRlciB0aGFuIDApCi0gKiBPU1lTX0ZPRkZTRVRfU0NOZDogbWFjcm8gZm9yIHNjYW5mIGZvcm1hdCBzcGVjaWZpZXIgKCIlZCItbGlrZSkKLSAqIE9TWVNfRk9GRlNFVF9TQ054OiBtYWNybyBmb3Igc2NhbmYgZm9ybWF0IHNwZWNpZmllciAoIiV4Ii1saWtlKQotICogT1NZU19GT0ZGU0VUX1BSSWQ6IG1hY3JvIGZvciBwcmludGYgZm9ybWF0IHNwZWNpZmllciAoIiVkIi1saWtlKQotICogT1NZU19GT0ZGU0VUX1BSSXg6IG1hY3JvIGZvciBwcmludGYgZm9ybWF0IHNwZWNpZmllciAoIiV4Ii1saWtlKQotICogT1NZU19GT0ZGU0VUX1BSSVg6IG1hY3JvIGZvciBwcmludGYgZm9ybWF0IHNwZWNpZmllciAoIiVYIi1saWtlKQotICoKLSAqIG9zeXNfZnNpemVfdDogdGhlIGZpbGUgc2l6ZSB0eXBlIChhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUpCi0gKiBPU1lTX0ZTSVpFX01BWDogdGhlIG1heGltdW0gdmFsdWUKLSAqIE9TWVNfRlNJWkVfU0NOdTogbWFjcm8gZm9yIHNjYW5mIGZvcm1hdCBzcGVjaWZpZXIgKCIldSItbGlrZSkKLSAqIE9TWVNfRlNJWkVfU0NOeDogbWFjcm8gZm9yIHNjYW5mIGZvcm1hdCBzcGVjaWZpZXIgKCIleCItbGlrZSkKLSAqIE9TWVNfRlNJWkVfUFJJdTogbWFjcm8gZm9yIHByaW50ZiBmb3JtYXQgc3BlY2lmaWVyICgiJXUiLWxpa2UpCi0gKiBPU1lTX0ZTSVpFX1BSSXg6IG1hY3JvIGZvciBwcmludGYgZm9ybWF0IHNwZWNpZmllciAoIiV4Ii1saWtlKQotICogT1NZU19GU0laRV9QUklYOiBtYWNybyBmb3IgcHJpbnRmIGZvcm1hdCBzcGVjaWZpZXIgKCIlWCItbGlrZSkKLSAqLwotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2lmIChMT05HX01BWCA+IDB4N2ZmZmZmZmZMKSB8fCAoTE9OR19NQVggPiBJTlRfTUFYKQotCi10eXBlZGVmIGxvbmcgb3N5c19mb2Zmc2V0X3Q7Ci0jZGVmaW5lIE9TWVNfRk9GRlNFVF9NSU4gTE9OR19NSU4KLSNkZWZpbmUgT1NZU19GT0ZGU0VUX01BWCBMT05HX01BWAotI2RlZmluZSBPU1lTX0ZPRkZTRVRfU0NOZCAibGQiCi0jZGVmaW5lIE9TWVNfRk9GRlNFVF9TQ054ICJseCIKLSNkZWZpbmUgT1NZU19GT0ZGU0VUX1BSSWQgImxkIgotI2RlZmluZSBPU1lTX0ZPRkZTRVRfUFJJeCAibHgiCi0jZGVmaW5lIE9TWVNfRk9GRlNFVF9QUklYICJsWCIKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIG9zeXNfZnNpemVfdDsKLSNkZWZpbmUgT1NZU19GU0laRV9NQVggVUxPTkdfTUFYCi0jZGVmaW5lIE9TWVNfRlNJWkVfU0NOdSAibHUiCi0jZGVmaW5lIE9TWVNfRlNJWkVfU0NOeCAibHgiCi0jZGVmaW5lIE9TWVNfRlNJWkVfUFJJdSAibHUiCi0jZGVmaW5lIE9TWVNfRlNJWkVfUFJJeCAibHgiCi0jZGVmaW5lIE9TWVNfRlNJWkVfUFJJWCAibFgiCi0KLSNlbGlmIGRlZmluZWQgX0k2NF9NQVggJiYgKGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fKQotCi10eXBlZGVmIF9faW50NjQgb3N5c19mb2Zmc2V0X3Q7Ci0jZGVmaW5lIE9TWVNfRk9GRlNFVF9NSU4gX0k2NF9NSU4KLSNkZWZpbmUgT1NZU19GT0ZGU0VUX01BWCBfSTY0X01BWAotI2RlZmluZSBPU1lTX0ZPRkZTRVRfU0NOZCAiSTY0ZCIKLSNkZWZpbmUgT1NZU19GT0ZGU0VUX1NDTnggIkk2NHgiCi0jZGVmaW5lIE9TWVNfRk9GRlNFVF9QUklkICJJNjRkIgotI2RlZmluZSBPU1lTX0ZPRkZTRVRfUFJJeCAiSTY0eCIKLSNkZWZpbmUgT1NZU19GT0ZGU0VUX1BSSVggIkk2NFgiCi0KLXR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBvc3lzX2ZzaXplX3Q7Ci0jZGVmaW5lIE9TWVNfRlNJWkVfTUFYIF9VSTY0X01BWAotI2RlZmluZSBPU1lTX0ZTSVpFX1NDTnUgIkk2NHUiCi0jZGVmaW5lIE9TWVNfRlNJWkVfU0NOeCAiSTY0eCIKLSNkZWZpbmUgT1NZU19GU0laRV9QUkl1ICJJNjR1IgotI2RlZmluZSBPU1lTX0ZTSVpFX1BSSXggIkk2NHgiCi0jZGVmaW5lIE9TWVNfRlNJWkVfUFJJWCAiSTY0WCIKLQotI2Vsc2UKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi10eXBlZGVmIGludF9sZWFzdDY0X3Qgb3N5c19mb2Zmc2V0X3Q7Ci0jZGVmaW5lIE9TWVNfRk9GRlNFVF9NSU4gSU5UX0xFQVNUNjRfTUlOCi0jZGVmaW5lIE9TWVNfRk9GRlNFVF9NQVggSU5UX0xFQVNUNjRfTUFYCi0jZGVmaW5lIE9TWVNfRk9GRlNFVF9TQ05kIFNDTmRMRUFTVDY0Ci0jZGVmaW5lIE9TWVNfRk9GRlNFVF9TQ054IFNDTnhMRUFTVDY0Ci0jZGVmaW5lIE9TWVNfRk9GRlNFVF9QUklkIFBSSWRMRUFTVDY0Ci0jZGVmaW5lIE9TWVNfRk9GRlNFVF9QUkl4IFBSSXhMRUFTVDY0Ci0jZGVmaW5lIE9TWVNfRk9GRlNFVF9QUklYIFBSSVhMRUFTVDY0Ci0KLXR5cGVkZWYgdWludF9sZWFzdDY0X3Qgb3N5c19mc2l6ZV90OwotI2RlZmluZSBPU1lTX0ZTSVpFX01BWCBVSU5UX0xFQVNUNjRfTUFYCi0jZGVmaW5lIE9TWVNfRlNJWkVfU0NOdSBTQ051TEVBU1Q2NAotI2RlZmluZSBPU1lTX0ZTSVpFX1NDTnggU0NOeExFQVNUNjQKLSNkZWZpbmUgT1NZU19GU0laRV9QUkl1IFBSSXVMRUFTVDY0Ci0jZGVmaW5lIE9TWVNfRlNJWkVfUFJJeCBQUkl4TEVBU1Q2NAotI2RlZmluZSBPU1lTX0ZTSVpFX1BSSVggUFJJWExFQVNUNjQKLQotI2VuZGlmCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLS8qCi0gKiBDcmVhdGVzIGEgbmV3IHBhdGggbmFtZSBieSBjaGFuZ2luZyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCBvZgotICogYSBzcGVjaWZpZWQgcGF0aCBuYW1lLgotICogVGhlIG5ldyBkaXJlY3RvcnkgbmFtZSBjYW4gYmUgdGhlIGVtcHR5IHN0cmluZywgaW5kaWNhdGluZyB0aGF0Ci0gKiB0aGUgcmVzdWx0aW5nIHBhdGggaGFzIG5vIGRpcmVjdG9yeS4gT3RoZXJ3aXNlLCB0aGUgZGlyZWN0b3J5Ci0gKiBuYW1lIHNob3VsZCBmb2xsb3cgdGhlIGNvbnZlbnRpb25zIHNwZWNpZmljIHRvIHRoZSBob3N0IG9wZXJhdGluZwotICogc3lzdGVtLCBhbmQgbWF5IG9wdGlvbmFsbHkgYmUgZW5kZWQgd2l0aCB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvcgotICogKGUuZy4gIi8iIG9uIFVuaXgpLgotICogT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgYnVmZmVyLgotICogT24gZXJyb3IsIGl0IHJldHVybnMgTlVMTC4KLSAqLwotY2hhciAqCi1vc3lzX3BhdGhfY2hkaXIoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvbGRfcGF0aCwgY29uc3QgY2hhciAqbmV3X2Rpcm5hbWUpOwotCi0vKgotICogQ3JlYXRlcyBhIG5ldyBwYXRoIG5hbWUgYnkgY2hhbmdpbmcgdGhlIGV4dGVuc2lvbiBjb21wb25lbnQgb2YKLSAqIGEgc3BlY2lmaWVkIHBhdGggbmFtZS4KLSAqIFRoZSBuZXcgZXh0ZW5zaW9uIG5hbWUgY2FuIGJlIHRoZSBlbXB0eSBzdHJpbmcsIGluZGljYXRpbmcgdGhhdAotICogdGhlIHJlc3VsdGluZyBwYXRoIGhhcyBubyBleHRlbnNpb24uIE90aGVyd2lzZSwgdGhlIGV4dGVuc2lvbgotICogbmFtZSBtdXN0IGJlZ2luIHdpdGggdGhlIGV4dGVuc2lvbiBzZXBhcmF0b3IgKGUuZy4gIi4iIG9uIFVuaXgpLgotICogT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgYnVmZmVyLgotICogT24gZXJyb3IsIGl0IHJldHVybnMgTlVMTC4KLSAqLwotY2hhciAqCi1vc3lzX3BhdGhfY2hleHQoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvbGRfcGF0aCwgY29uc3QgY2hhciAqbmV3X2V4dG5hbWUpOwotCi0vKgotICogQ3JlYXRlcyBhIGJhY2t1cCBwYXRoIG5hbWUuCi0gKiBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBidWZmZXIuCi0gKiBPbiBlcnJvciwgaXQgcmV0dXJucyBOVUxMLgotICovCi1jaGFyICoKLW9zeXNfcGF0aF9ta2JhayhjaGFyICpidWZmZXIsIHNpemVfdCBidWZzaXplLCBjb25zdCBjaGFyICpwYXRoKTsKLQotLyoKLSAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGZpbGUgcG9zaXRpb24gaW5kaWNhdG9yLgotICogT24gZXJyb3IsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChvc3lzX2ZvZmZzZXRfdCkoLTEpLgotICovCi1vc3lzX2ZvZmZzZXRfdAotb3N5c19mdGVsbG8oRklMRSAqc3RyZWFtKTsKLQotLyoKLSAqIFNldHMgdGhlIGZpbGUgcG9zaXRpb24gaW5kaWNhdG9yIGF0IHRoZSBzcGVjaWZpZWQgZmlsZSBvZmZzZXQuCi0gKiBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAwLiBPbiBlcnJvciwgaXQgcmV0dXJucyAtMS4KLSAqLwotaW50Ci1vc3lzX2ZzZWVrbyhGSUxFICpzdHJlYW0sIG9zeXNfZm9mZnNldF90IG9mZnNldCwgaW50IHdoZW5jZSk7Ci0KLS8qCi0gKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSBzdHJlYW0uCi0gKiBUaGlzIGZ1bmN0aW9uIG1heSBjaGFuZ2UgdGhlIGZpbGUgcG9zaXRpb24gaW5kaWNhdG9yLgotICogT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgMC4gT24gZXJyb3IsIGl0IHJldHVybnMgLTEuCi0gKi8KLWludAotb3N5c19mZ2V0c2l6ZShGSUxFICpzdHJlYW0sIG9zeXNfZnNpemVfdCAqc2l6ZSk7Ci0KLS8qCi0gKiBSZWFkcyBhIGJsb2NrIG9mIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgb2Zmc2V0LgotICogVGhlIGZpbGUtcG9zaXRpb24gaW5kaWNhdG9yIGlzIHNhdmVkIGFuZCByZXN0b3JlZCBhZnRlciByZWFkaW5nLgotICogVGhlIGZpbGUgYnVmZmVyIGlzIGZsdXNoZWQgYmVmb3JlIGFuZCBhZnRlciByZWFkaW5nLgotICogT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgotICogT24gZXJyb3IsIGl0IHJldHVybnMgMC4KLSAqLwotc2l6ZV90Ci1vc3lzX2ZyZWFkX2F0KEZJTEUgKnN0cmVhbSwgb3N5c19mb2Zmc2V0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlLAotICAgICAgICAgICAgICB2b2lkICpibG9jaywgc2l6ZV90IGJsb2Nrc2l6ZSk7Ci0KLS8qCi0gKiBXcml0ZXMgYSBibG9jayBvZiBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgZmlsZSBvZmZzZXQuCi0gKiBUaGUgZmlsZS1wb3NpdGlvbiBpbmRpY2F0b3IgaXMgc2F2ZWQgYW5kIHJlc3RvcmVkIGFmdGVyIHdyaXRpbmcuCi0gKiBUaGUgZmlsZSBidWZmZXIgaXMgZmx1c2hlZCBiZWZvcmUgYW5kIGFmdGVyIHdyaXRpbmcuCi0gKiBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCi0gKiBPbiBlcnJvciwgaXQgcmV0dXJucyAwLgotICovCi1zaXplX3QKLW9zeXNfZndyaXRlX2F0KEZJTEUgKnN0cmVhbSwgb3N5c19mb2Zmc2V0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlLAotICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYmxvY2ssIHNpemVfdCBibG9ja3NpemUpOwotCi0vKgotICogQ2hhbmdlcyB0aGUgbmFtZSBvZiBhIGZpbGUgcGF0aC4KLSAqIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDAuCi0gKiBPbiBlcnJvciwgaXQgcmV0dXJucyAtMS4KLSAqLwotaW50Ci1vc3lzX3JlbmFtZShjb25zdCBjaGFyICpzcmNfcGF0aCwgY29uc3QgY2hhciAqZGVzdF9wYXRoLCBpbnQgY2xvYmJlcik7Ci0KLS8qCi0gKiBDb3BpZXMgdGhlIGF0dHJpYnV0ZXMgKGFjY2VzcyBtb2RlLCB0aW1lIHN0YW1wLCBldGMuKSBvZiB0aGUgc291cmNlCi0gKiBmaWxlIHBhdGggb250byB0aGUgZGVzdGluYXRpb24gZmlsZSBwYXRoLgotICogT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgMC4KLSAqIE9uIGVycm9yLCBpdCByZXR1cm5zIC0xLgotICovCi1pbnQKLW9zeXNfY29weV9hdHRyKGNvbnN0IGNoYXIgKnNyY19wYXRoLCBjb25zdCBjaGFyICpkZXN0X3BhdGgpOwotCi0vKgotICogQ3JlYXRlcyBhIG5ldyBkaXJlY3RvcnkuCi0gKiBJZiB0aGUgZGlyZWN0b3J5IGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCBvciBpZiBpdCBhbHJlYWR5IGV4aXN0cywKLSAqIHRoZSBmdW5jdGlvbiByZXR1cm5zIDAuCi0gKiBPdGhlcndpc2UsIGl0IHJldHVybnMgLTEuCi0gKi8KLWludAotb3N5c19jcmVhdGVfZGlyKGNvbnN0IGNoYXIgKmRpcm5hbWUpOwotCi0vKgotICogRGV0ZXJtaW5lcyBpZiB0aGUgYWNjZXNzaWJpbGl0eSBvZiB0aGUgc3BlY2lmaWVkIHBhdGggc2F0aXNmaWVzCi0gKiB0aGUgc3BlY2lmaWVkIGFjY2VzcyBtb2RlLiBUaGUgYWNjZXNzIG1vZGUgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUKLSAqIGNoYXJhY3RlcnMgdGhhdCBpbmRpY2F0ZSB0aGUgY2hlY2tzIHRvIGJlIHBlcmZvcm1lZCwgYXMgZm9sbG93czoKLSAqICAgJ2UnOiB0aGUgcGF0aCBleGlzdHM7IGl0IG5lZWRzIG5vdCBiZSBhIHJlZ3VsYXIgZmlsZS4KLSAqICAgJ2YnOiB0aGUgcGF0aCBleGlzdHMgYW5kIGlzIGEgcmVndWxhciBmaWxlLgotICogICAncic6IHRoZSBwYXRoIGV4aXN0cyBhbmQgcmVhZCBwZXJtaXNzaW9uIGlzIGdyYW50ZWQuCi0gKiAgICd3JzogdGhlIHBhdGggZXhpc3RzIGFuZCB3cml0ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQuCi0gKiAgICd4JzogdGhlIHBhdGggZXhpc3RzIGFuZCBleGVjdXRlIHBlcm1pc3Npb24gaXMgZ3JhbnRlZC4KLSAqIEZvciBleGFtcGxlLCB0byBkZXRlcm1pbmUgaWYgYSBmaWxlIGNhbiBiZSBvcGVuZWQgZm9yIHJlYWRpbmcgdXNpbmcKLSAqIGZvcGVuKCksIHVzZSAiZnIiIGluIHRoZSBhY2Nlc3MgbW9kZS4KLSAqIElmIGFsbCBjaGVja3Mgc3VjY2VlZCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgMC4KLSAqIE90aGVyd2lzZSwgaXQgcmV0dXJucyAtMS4KLSAqLwotaW50Ci1vc3lzX3Rlc3QoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSk7Ci0KLS8qCi0gKiBEZXRlcm1pbmVzIGlmIHR3byBhY2Nlc3NpYmxlIHBhdGhzIGFyZSBlcXVpdmFsZW50LCBpLmUuIHRoZXkKLSAqIHBvaW50IHRvIHRoZSBzYW1lIHBoeXNpY2FsIGxvY2F0aW9uLgotICogSWYgdGhlIHR3byBwYXRocyBhcmUgZXF1aXZhbGVudCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgMS4KLSAqIElmIHRoZSB0d28gcGF0aHMgYXJlIG5vdCBlcXVpdmFsZW50LCB0aGUgZnVuY3Rpb24gcmV0dXJucyAwLgotICogSWYgYXQgbGVhc3Qgb25lIHBhdGggaXMgbm90IGFjY2Vzc2libGUgb3IgZG9lcyBub3QgZXhpc3QsIG9yCi0gKiBpZiB0aGUgY2hlY2sgY2Fubm90IGJlIHBlcmZvcm1lZCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgLTEuCi0gKi8KLWludAotb3N5c190ZXN0X2VxKGNvbnN0IGNoYXIgKnBhdGgxLCBjb25zdCBjaGFyICpwYXRoMik7Ci0KLS8qCi0gKiBSZW1vdmVzIGEgZGlyZWN0b3J5IGVudHJ5LgotICogT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgMC4KLSAqIE9uIGVycm9yLCBpdCByZXR1cm5zIC0xLgotICovCi1pbnQKLW9zeXNfdW5saW5rKGNvbnN0IGNoYXIgKnBhdGgpOwotCi0vKgotICogUHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UgdG8gc3RkZXJyIGFuZCB0ZXJtaW5hdGVzIHRoZSBwcm9ncmFtCi0gKiBleGVjdXRpb24gaW1tZWRpYXRlbHksIGV4aXRpbmcgd2l0aCBjb2RlIDcwIChFWF9TT0ZUV0FSRSkuCi0gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJhaXNlIFNJR0FCUlQsIGFuZCBpdCBkb2VzIG5vdCBnZW5lcmF0ZQotICogb3RoZXIgZmlsZXMgKGxpa2UgY29yZSBkdW1wcywgd2hlcmUgYXBwbGljYWJsZSkuCi0gKi8KLXZvaWQKLW9zeXNfdGVybWluYXRlKHZvaWQpOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLyogZXh0ZXJuICJDIiAqLwotI2VuZGlmCi0KLQotI2VuZGlmICAvKiBPU1lTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9vcHRpcG5nL3Byb2dpbmZvLmggYi9zcmMvb3B0aXBuZy9wcm9naW5mby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTU3OWY0Li4wMDAwMDAwCi0tLSBhL3NyYy9vcHRpcG5nL3Byb2dpbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogcHJvZ2luZm8uaAotICogT3B0aVBORyBwcm9ncmFtIGluZm9ybWF0aW9uLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDEyIENvc21pbiBUcnV0YSBhbmQgdGhlIENvbnRyaWJ1dGluZyBBdXRob3JzLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHpsaWIgbGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUuCi0gKi8KLQotI2lmbmRlZiBQUk9HSU5GT19ICi0jZGVmaW5lIFBST0dJTkZPX0gKLQotI2RlZmluZSBQUk9HUkFNX05BTUUgXAotICAgICJPcHRpUE5HIgotI2RlZmluZSBQUk9HUkFNX1NVTU1BUlkgXAotICAgICJQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIG9wdGltaXplciIKLSNkZWZpbmUgUFJPR1JBTV9WRVJTSU9OIFwKLSAgICAiMC43LjQiCi0jZGVmaW5lIFBST0dSQU1fQ09QWVJJR0hUIFwKLSAgICAiQ29weXJpZ2h0IChDKSAyMDAxLTIwMTIgQ29zbWluIFRydXRhIGFuZCB0aGUgQ29udHJpYnV0aW5nIEF1dGhvcnMiCi0jZGVmaW5lIFBST0dSQU1fVVJJIFwKLSAgICAiaHR0cDovL29wdGlwbmcuc291cmNlZm9yZ2UubmV0LyIKLQotI2VuZGlmICAvKiBQUk9HSU5GT19IICovCmRpZmYgLS1naXQgYS9zcmMvb3B0aXBuZy90ZXN0L2NiaXRzZXRfdGVzdC5jIGIvc3JjL29wdGlwbmcvdGVzdC9jYml0c2V0X3Rlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiNzUzNS4uMDAwMDAwMAotLS0gYS9zcmMvb3B0aXBuZy90ZXN0L2NiaXRzZXRfdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qCi0gKiBjYml0c2V0X3Rlc3QuYwotICogVGVzdCBkcml2ZXIgZm9yIGNiaXRzZXQuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgQ29zbWluIFRydXRhLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHpsaWIgbGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgdGhlIGF0dGFjaGVkIExJQ0VOU0UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKi8KLQotCi0jaW5jbHVkZSAiY2JpdHNldC5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLQotY2hhciAqbXlfc3RycnRyaW0oY2hhciAqc3RyKQotewotICAgIGNoYXIgKnB0cjsKLSAgICBjaGFyICplbmQ7Ci0KLSAgICBlbmQgPSBzdHI7Ci0gICAgZm9yIChwdHIgPSBzdHI7ICpwdHIgIT0gMDsgKytwdHIpCi0gICAgewotICAgICAgICBpZiAoIWlzc3BhY2UoKnB0cikpCi0gICAgICAgICAgICBlbmQgPSBwdHIgKyAxOwotICAgIH0KLSAgICAqZW5kID0gKGNoYXIpMDsKLSAgICByZXR1cm4gc3RyOwotfQotCi0KLXZvaWQgY2hlY2tfYml0c2V0KGJpdHNldF90IHZhbHVlKQotewotICAgIGNoYXIgYnVmW0JJVFNJWkVPRih2YWx1ZSkgKyAxXTsKLSAgICBiaXRzZXRfdCBlbXB0eSwgZnVsbDsKLSAgICBiaXRzZXRfdCBmbGlwcGVkMSwgZmxpcHBlZDIsIGZsaXBwZWQzLCBmbGlwcGVkNDsKLSAgICBpbnQgaTsKLQotICAgIGJpdHNldF90b19zdHJpbmcoYnVmLCBzaXplb2YoYnVmKSwgdmFsdWUpOwotICAgIHByaW50ZigiY2hlY2tpbmc6ICVzXG4iLCBidWYpOwotCi0gICAgZW1wdHkgPSBmdWxsID0gZmxpcHBlZDEgPSB2YWx1ZTsKLSAgICBiaXRzZXRfcmVzZXRfcmFuZ2UoJmVtcHR5LCBCSVRTRVRfRUxUX01JTiwgQklUU0VUX0VMVF9NQVgpOwotICAgIGJpdHNldF9zZXRfcmFuZ2UoJmZ1bGwsIEJJVFNFVF9FTFRfTUlOLCBCSVRTRVRfRUxUX01BWCk7Ci0gICAgYml0c2V0X2ZsaXBfcmFuZ2UoJmZsaXBwZWQxLCBCSVRTRVRfRUxUX01JTiwgQklUU0VUX0VMVF9NQVgpOwotICAgIGFzc2VydChlbXB0eSA9PSBCSVRTRVRfRU1QVFkpOwotICAgIGFzc2VydChmdWxsID09IEJJVFNFVF9GVUxMKTsKLSAgICBhc3NlcnQoZmxpcHBlZDEgPT0gfnZhbHVlKTsKLQotICAgIGZsaXBwZWQ0ID0gZmxpcHBlZDMgPSBmbGlwcGVkMiA9IGZsaXBwZWQxOwotICAgIGZvciAoaSA9IEJJVFNFVF9FTFRfTUlOOyBpIDw9IEJJVFNFVF9FTFRfTUFYOyArK2kpCi0gICAgewotICAgICAgICBiaXRzZXRfZmxpcCgmZmxpcHBlZDEsIGkpOwotICAgICAgICBiaXRzZXRfZmxpcF9yYW5nZSgmZmxpcHBlZDIsIGksIGkpOwotICAgICAgICBpZiAoYml0c2V0X3Rlc3QoZmxpcHBlZDMsIGkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBiaXRzZXRfcmVzZXQoJmZsaXBwZWQzLCBpKTsKLSAgICAgICAgICAgIGJpdHNldF9yZXNldF9yYW5nZSgmZmxpcHBlZDQsIGksIGkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYml0c2V0X3NldCgmZmxpcHBlZDMsIGkpOwotICAgICAgICAgICAgYml0c2V0X3NldF9yYW5nZSgmZmxpcHBlZDQsIGksIGkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydChmbGlwcGVkMSA9PSBmbGlwcGVkMik7Ci0gICAgICAgIGFzc2VydChmbGlwcGVkMiA9PSBmbGlwcGVkMyk7Ci0gICAgICAgIGFzc2VydChmbGlwcGVkMyA9PSBmbGlwcGVkNCk7Ci0gICAgfQotICAgIGFzc2VydChmbGlwcGVkMSA9PSB2YWx1ZSk7Ci19Ci0KLQotdm9pZCBkdW1wX2JpdHNldChiaXRzZXRfdCB2YWx1ZSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgZm9yd2FyZF9jb3VudCwgcmV2ZXJzZV9jb3VudDsKLSAgICBpbnQgaTsKLQotICAgIHByaW50ZigiY291bnQ6ICV1XG4iLCBiaXRzZXRfY291bnQodmFsdWUpKTsKLSAgICBwcmludGYoIml0ZXJhdGlvbjoiKTsKLSAgICBmb3J3YXJkX2NvdW50ID0gMDsKLSAgICBmb3IgKGkgPSBiaXRzZXRfZmluZF9maXJzdCh2YWx1ZSk7IGkgPj0gMDsgaSA9IGJpdHNldF9maW5kX25leHQodmFsdWUsIGkpKQotICAgIHsKLSAgICAgICAgKytmb3J3YXJkX2NvdW50OwotICAgICAgICBwcmludGYoIiAlZCIsIGkpOwotICAgICAgICBhc3NlcnQoaSA+PSBCSVRTRVRfRUxUX01JTiAmJiBpIDw9IEJJVFNFVF9FTFRfTUFYKTsKLSAgICAgICAgYXNzZXJ0KGJpdHNldF90ZXN0KHZhbHVlLCBpKSk7Ci0gICAgfQotICAgIHByaW50ZigiXG5yZXZlcnNlIGl0ZXJhdGlvbjoiKTsKLSAgICByZXZlcnNlX2NvdW50ID0gMDsKLSAgICBmb3IgKGkgPSBiaXRzZXRfZmluZF9sYXN0KHZhbHVlKTsgaSA+PSAwOyBpID0gYml0c2V0X2ZpbmRfcHJldih2YWx1ZSwgaSkpCi0gICAgewotICAgICAgICArK3JldmVyc2VfY291bnQ7Ci0gICAgICAgIHByaW50ZigiICVkIiwgaSk7Ci0gICAgICAgIGFzc2VydChpID49IEJJVFNFVF9FTFRfTUlOICYmIGkgPD0gQklUU0VUX0VMVF9NQVgpOwotICAgICAgICBhc3NlcnQoYml0c2V0X3Rlc3QodmFsdWUsIGkpKTsKLSAgICB9Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIGFzc2VydChiaXRzZXRfY291bnQodmFsdWUpID09IGZvcndhcmRfY291bnQpOwotICAgIGFzc2VydChmb3J3YXJkX2NvdW50ID09IHJldmVyc2VfY291bnQpOwotfQotCi0KLXZvaWQgZHVtcF9lcnJvcihpbnQgZXJyKQotewotICAgIGlmIChlcnIgPT0gRUlOVkFMKQotICAgICAgICBwcmludGYoImVycm9yOiBFSU5WQUxcbiIpOwotICAgIGVsc2UgaWYgKGVyciA9PSBFUkFOR0UpCi0gICAgICAgIHByaW50ZigiZXJyb3I6IEVSQU5HRVxuIik7Ci0gICAgZWxzZSBpZiAoZXJyICE9IDApCi0gICAgICAgIHByaW50ZigiZXJyb3I6IGVycm5vID09ICVkXG4iLCBlcnIpOwotfQotCi0KLWludCBtYWluKCkKLXsKLSAgICBjaGFyIGJ1ZlsyNTZdOwotICAgIGNoYXIgKnB0cjsKLSAgICBzaXplX3QgZW5kX2lkeDsKLSAgICBiaXRzZXRfdCBzZXQ7Ci0gICAgaW50IHNhdmVkX2Vycm5vOwotCi0gICAgZm9yICggOyA7ICkKLSAgICB7Ci0gICAgICAgIC8qIElucHV0IHRleHQgKi8KLSAgICAgICAgaWYgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHN0ZGluKSA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG15X3N0cnJ0cmltKGJ1Zik7Ci0KLSAgICAgICAgaWYgKGJ1ZlswXSA9PSAwIHx8IGJ1ZlswXSA9PSAnIycpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNraXAgZW1wdHkgYW5kICNjb21tZW50IGxpbmVzLiAqLwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcmludGYoIiVzXG4iLCBidWYpOwotCi0gICAgICAgIGlmIChzdHJuY21wKGJ1ZiwgImJpbjoiLCA0KSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBUZXN0IHN0cmluZ190b19iaXRzZXQoKSAqLwotICAgICAgICAgICAgcHRyID0gYnVmICsgNDsKLSAgICAgICAgICAgIGVycm5vID0gMDsKLSAgICAgICAgICAgIHNldCA9IHN0cmluZ190b19iaXRzZXQocHRyLCAmZW5kX2lkeCk7Ci0gICAgICAgICAgICBzYXZlZF9lcnJubyA9IGVycm5vOwotICAgICAgICAgICAgaWYgKHB0cltlbmRfaWR4XSAhPSAwKQotICAgICAgICAgICAgICAgIHByaW50ZigiLi4uJXNcbiIsICZwdHJbZW5kX2lkeF0pOwotICAgICAgICAgICAgY2hlY2tfYml0c2V0KHNldCk7Ci0gICAgICAgICAgICBkdW1wX2JpdHNldChzZXQpOwotICAgICAgICAgICAgZHVtcF9lcnJvcihzYXZlZF9lcnJubyk7Ci0gICAgICAgICAgICBwcmludGYoIlxuIik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdHJuY21wKGJ1ZiwgInJhbmdlOiIsIDYpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRlc3QgcmFuZ2VzZXRfc3RyaW5nX3RvX2JpdHNldCgpICovCi0gICAgICAgICAgICBwdHIgPSBidWYgKyA2OwotICAgICAgICAgICAgZXJybm8gPSAwOwotICAgICAgICAgICAgc2V0ID0gcmFuZ2VzZXRfc3RyaW5nX3RvX2JpdHNldChwdHIsICZlbmRfaWR4KTsKLSAgICAgICAgICAgIHNhdmVkX2Vycm5vID0gZXJybm87Ci0gICAgICAgICAgICBpZiAocHRyW2VuZF9pZHhdICE9IDApCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIuLi4lc1xuIiwgJnB0cltlbmRfaWR4XSk7Ci0gICAgICAgICAgICBjaGVja19iaXRzZXQoc2V0KTsKLSAgICAgICAgICAgIGR1bXBfYml0c2V0KHNldCk7Ci0gICAgICAgICAgICBkdW1wX2Vycm9yKHNhdmVkX2Vycm5vKTsKLSAgICAgICAgICAgIHByaW50ZigiXG4iKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbnRmKCJpbnZhbGlkOiAlc1xuIiwgYnVmKTsKLSAgICAgICAgcHJpbnRmKCJ1c2UgYmluOjEwMTAxIG9yIHJhbmdlOjEtMTBcbiIpOwotICAgICAgICBwcmludGYoIlxuIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL29wdGlwbmcvdGVzdC9jYml0c2V0X3Rlc3QuZGF0IGIvc3JjL29wdGlwbmcvdGVzdC9jYml0c2V0X3Rlc3QuZGF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDkyZmY1Li4wMDAwMDAwCi0tLSBhL3NyYy9vcHRpcG5nL3Rlc3QvY2JpdHNldF90ZXN0LmRhdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLWJpbjoxMDEwMQotYmluOiAwMDEwMTAxICB4Ci1iaW46IDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMQotYmluOjAxMgotYmluOjEyCi1iaW46MgotYmluOiAyCi1iaW46Ci0KLXJhbmdlOiAxLTIKLXJhbmdlOjEsMgotcmFuZ2U6LDEsLDIsCi1yYW5nZTogOyAxIDsgMiA7LHgKLXJhbmdlOiAxIDIKLXJhbmdlOiAxLTItMwotcmFuZ2U6MCwzLDUtNwotcmFuZ2U6MC0zLDUsNy0KLXJhbmdlOjgtLDQKLXJhbmdlOjgtNAotcmFuZ2U6IDAtMzEKLXJhbmdlOiAwIC0gOTk5OTk5OTk5OTk5ICB4Ci1yYW5nZToKZGlmZiAtLWdpdCBhL3NyYy9vcHRpcG5nL3Rlc3QvY2JpdHNldF90ZXN0LmV4cGVjdCBiL3NyYy9vcHRpcG5nL3Rlc3QvY2JpdHNldF90ZXN0LmV4cGVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwYjcxOS4uMDAwMDAwMAotLS0gYS9zcmMvb3B0aXBuZy90ZXN0L2NiaXRzZXRfdGVzdC5leHBlY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotYmluOjEwMTAxCi1jaGVja2luZzogMTAxMDEKLWNvdW50OiAzCi1pdGVyYXRpb246IDAgMiA0Ci1yZXZlcnNlIGl0ZXJhdGlvbjogNCAyIDAKLQotYmluOiAwMDEwMTAxICB4Ci0uLi4gIHgKLWNoZWNraW5nOiAxMDEwMQotY291bnQ6IDMKLWl0ZXJhdGlvbjogMCAyIDQKLXJldmVyc2UgaXRlcmF0aW9uOiA0IDIgMAotCi1iaW46IDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMQotY2hlY2tpbmc6IDExMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxCi1jb3VudDogMTcKLWl0ZXJhdGlvbjogMCAyIDQgNiA4IDEwIDEyIDE0IDE2IDE4IDIwIDIyIDI0IDI2IDI4IDMwIDMxCi1yZXZlcnNlIGl0ZXJhdGlvbjogMzEgMzAgMjggMjYgMjQgMjIgMjAgMTggMTYgMTQgMTIgMTAgOCA2IDQgMiAwCi1lcnJvcjogRVJBTkdFCi0KLWJpbjowMTIKLS4uLjIKLWNoZWNraW5nOiAxCi1jb3VudDogMQotaXRlcmF0aW9uOiAwCi1yZXZlcnNlIGl0ZXJhdGlvbjogMAotCi1iaW46MTIKLS4uLjIKLWNoZWNraW5nOiAxCi1jb3VudDogMQotaXRlcmF0aW9uOiAwCi1yZXZlcnNlIGl0ZXJhdGlvbjogMAotCi1iaW46MgotLi4uMgotY2hlY2tpbmc6IDAKLWNvdW50OiAwCi1pdGVyYXRpb246Ci1yZXZlcnNlIGl0ZXJhdGlvbjoKLWVycm9yOiBFSU5WQUwKLQotYmluOiAyCi0uLi4gMgotY2hlY2tpbmc6IDAKLWNvdW50OiAwCi1pdGVyYXRpb246Ci1yZXZlcnNlIGl0ZXJhdGlvbjoKLWVycm9yOiBFSU5WQUwKLQotYmluOgotY2hlY2tpbmc6IDAKLWNvdW50OiAwCi1pdGVyYXRpb246Ci1yZXZlcnNlIGl0ZXJhdGlvbjoKLWVycm9yOiBFSU5WQUwKLQotcmFuZ2U6IDEtMgotY2hlY2tpbmc6IDExMAotY291bnQ6IDIKLWl0ZXJhdGlvbjogMSAyCi1yZXZlcnNlIGl0ZXJhdGlvbjogMiAxCi0KLXJhbmdlOjEsMgotY2hlY2tpbmc6IDExMAotY291bnQ6IDIKLWl0ZXJhdGlvbjogMSAyCi1yZXZlcnNlIGl0ZXJhdGlvbjogMiAxCi0KLXJhbmdlOiwxLCwyLAotY2hlY2tpbmc6IDExMAotY291bnQ6IDIKLWl0ZXJhdGlvbjogMSAyCi1yZXZlcnNlIGl0ZXJhdGlvbjogMiAxCi0KLXJhbmdlOiA7IDEgOyAyIDsseAotLi4ueAotY2hlY2tpbmc6IDExMAotY291bnQ6IDIKLWl0ZXJhdGlvbjogMSAyCi1yZXZlcnNlIGl0ZXJhdGlvbjogMiAxCi0KLXJhbmdlOiAxIDIKLS4uLjIKLWNoZWNraW5nOiAxMAotY291bnQ6IDEKLWl0ZXJhdGlvbjogMQotcmV2ZXJzZSBpdGVyYXRpb246IDEKLQotcmFuZ2U6IDEtMi0zCi0uLi4tMwotY2hlY2tpbmc6IDExMAotY291bnQ6IDIKLWl0ZXJhdGlvbjogMSAyCi1yZXZlcnNlIGl0ZXJhdGlvbjogMiAxCi0KLXJhbmdlOjAsMyw1LTcKLWNoZWNraW5nOiAxMTEwMTAwMQotY291bnQ6IDUKLWl0ZXJhdGlvbjogMCAzIDUgNiA3Ci1yZXZlcnNlIGl0ZXJhdGlvbjogNyA2IDUgMyAwCi0KLXJhbmdlOjAtMyw1LDctCi1jaGVja2luZzogMTExMTExMTExMTExMTExMTExMTExMTExMTAxMDExMTEKLWNvdW50OiAzMAotaXRlcmF0aW9uOiAwIDEgMiAzIDUgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEKLXJldmVyc2UgaXRlcmF0aW9uOiAzMSAzMCAyOSAyOCAyNyAyNiAyNSAyNCAyMyAyMiAyMSAyMCAxOSAxOCAxNyAxNiAxNSAxNCAxMyAxMiAxMSAxMCA5IDggNyA1IDMgMiAxIDAKLQotcmFuZ2U6OC0sNAotY2hlY2tpbmc6IDExMTExMTExMTExMTExMTExMTExMTExMTAwMDEwMDAwCi1jb3VudDogMjUKLWl0ZXJhdGlvbjogNCA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEKLXJldmVyc2UgaXRlcmF0aW9uOiAzMSAzMCAyOSAyOCAyNyAyNiAyNSAyNCAyMyAyMiAyMSAyMCAxOSAxOCAxNyAxNiAxNSAxNCAxMyAxMiAxMSAxMCA5IDggNAotCi1yYW5nZTo4LTQKLWNoZWNraW5nOiAwCi1jb3VudDogMAotaXRlcmF0aW9uOgotcmV2ZXJzZSBpdGVyYXRpb246Ci1lcnJvcjogRVJBTkdFCi0KLXJhbmdlOiAwLTMxCi1jaGVja2luZzogMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKLWNvdW50OiAzMgotaXRlcmF0aW9uOiAwIDEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxCi1yZXZlcnNlIGl0ZXJhdGlvbjogMzEgMzAgMjkgMjggMjcgMjYgMjUgMjQgMjMgMjIgMjEgMjAgMTkgMTggMTcgMTYgMTUgMTQgMTMgMTIgMTEgMTAgOSA4IDcgNiA1IDQgMyAyIDEgMAotCi1yYW5nZTogMCAtIDk5OTk5OTk5OTk5OSAgeAotLi4ueAotY2hlY2tpbmc6IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCi1jb3VudDogMzIKLWl0ZXJhdGlvbjogMCAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAxOCAxOSAyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNyAyOCAyOSAzMCAzMQotcmV2ZXJzZSBpdGVyYXRpb246IDMxIDMwIDI5IDI4IDI3IDI2IDI1IDI0IDIzIDIyIDIxIDIwIDE5IDE4IDE3IDE2IDE1IDE0IDEzIDEyIDExIDEwIDkgOCA3IDYgNSA0IDMgMiAxIDAKLWVycm9yOiBFUkFOR0UKLQotcmFuZ2U6Ci1jaGVja2luZzogMAotY291bnQ6IDAKLWl0ZXJhdGlvbjoKLXJldmVyc2UgaXRlcmF0aW9uOgotCmRpZmYgLS1naXQgYS9zcmMvb3B0aXBuZy90ZXN0L2V4dHJhY3RfcHJpbnRfcmF0aW8uc2ggYi9zcmMvb3B0aXBuZy90ZXN0L2V4dHJhY3RfcHJpbnRfcmF0aW8uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlMTM2ZmMuLjAwMDAwMDAKLS0tIGEvc3JjL29wdGlwbmcvdGVzdC9leHRyYWN0X3ByaW50X3JhdGlvLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIyEvYmluL3NoCi0KLXNldCAtZQotCi10ZXN0ZGlyPSQoZGlybmFtZSAiJDAiKQotc3JjZmlsZT0iJHRlc3RkaXIvLi4vb3B0aW0uYyIKLQotaGVhZGVyPScvKlwKLSAqICpwcmludF9yYXRpby5nZW5lcmF0ZWQuY1wKLSAqIEdlbmVyYXRlZCBmcm9tIG9wdGltLmNcCi0gKlwKLSAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEyIENvc21pbiBUcnV0YS5cCi0gKlwKLSAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHpsaWIgbGljZW5zZS5cCi0gKiBQbGVhc2Ugc2VlIHRoZSBhdHRhY2hlZCBMSUNFTlNFIGZvciBtb3JlIGluZm9ybWF0aW9uLlwKLSAqL1wKLVwKLSNpbmNsdWRlICJwcmludF9yYXRpby5oIlwKLSNpbmNsdWRlIDxzdGRpby5oPlwKLSNpbmNsdWRlICIuLi9vc3lzLmgiXAotJwotCi1zbnByaW50Zl9oYWNrPScjaWZkZWYgX01TQ19WRVJcCi0jZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZlwKLSNlbmRpZlwKLScKLQotZXh0cmFjdF9mcHJpbnRfcmF0aW9fc2NyaXB0PSIKLTEgaVxcCi0kaGVhZGVyCi0vcmV0dXJuLyBkCi1zL3Vzcl9wcmludGYoL3JldHVybiBmcHJpbnRmKHN0cmVhbSwgLwotL15vcG5nX3ByaW50X2ZzaXplX3JhdGlvLyBpXFwKLWludAotcy9eb3BuZ19wcmludF9mc2l6ZV9yYXRpbygvZnByaW50X2ZzaXplX3JhdGlvKEZJTEUgKnN0cmVhbSwgLwotL15mcHJpbnRfZnNpemVfcmF0aW8vLC9efS8gcAotIgotCi1leHRyYWN0X3NwcmludF9yYXRpb19zY3JpcHQ9IgotMSBpXFwKLSRoZWFkZXIKLTEgaVxcCi0kc25wcmludGZfaGFjawotL3JldHVybi8gZAotcy91c3JfcHJpbnRmKC9yZXR1cm4gc25wcmludGYoYnVmLCBidWZzaXplLCAvCi0vXm9wbmdfcHJpbnRfZnNpemVfcmF0aW8vIGlcXAotaW50Ci1zL15vcG5nX3ByaW50X2ZzaXplX3JhdGlvKC9zcHJpbnRfZnNpemVfcmF0aW8oY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSwgLwotL15zcHJpbnRfZnNpemVfcmF0aW8vLC9efS8gcAotIgotCi1zZWQgLW4gIiRleHRyYWN0X2ZwcmludF9yYXRpb19zY3JpcHQiICIkc3JjZmlsZSIgPiBmcHJpbnRfcmF0aW8uZ2VuZXJhdGVkLmMKLXNlZCAtbiAiJGV4dHJhY3Rfc3ByaW50X3JhdGlvX3NjcmlwdCIgIiRzcmNmaWxlIiA+IHNwcmludF9yYXRpby5nZW5lcmF0ZWQuYwpkaWZmIC0tZ2l0IGEvc3JjL29wdGlwbmcvdGVzdC9mcHJpbnRfcmF0aW8uZ2VuZXJhdGVkLmMgYi9zcmMvb3B0aXBuZy90ZXN0L2ZwcmludF9yYXRpby5nZW5lcmF0ZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1M2YyOC4uMDAwMDAwMAotLS0gYS9zcmMvb3B0aXBuZy90ZXN0L2ZwcmludF9yYXRpby5nZW5lcmF0ZWQuYworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiAqcHJpbnRfcmF0aW8uZ2VuZXJhdGVkLmMKLSAqIEdlbmVyYXRlZCBmcm9tIG9wdGltLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMiBDb3NtaW4gVHJ1dGEuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgemxpYiBsaWNlbnNlLgotICogUGxlYXNlIHNlZSB0aGUgYXR0YWNoZWQgTElDRU5TRSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqLwotCi0jaW5jbHVkZSAicHJpbnRfcmF0aW8uaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgIi4uL29zeXMuaCIKLQotaW50Ci1mcHJpbnRfZnNpemVfcmF0aW8oRklMRSAqc3RyZWFtLCBvc3lzX2ZzaXplX3QgbnVtLCBvc3lzX2ZzaXplX3QgZGVub20sIGludCBmb3JjZV9wZXJjZW50KQotewotICAgIC8qICgxKSBudW0vZGVub20gPSAwLzAgICAgICAgICAgICAgICAgICA9PT4gcHJpbnQgIj8/JSIKLSAgICAgKiAoMikgbnVtL2Rlbm9tID0gSU5GSU5JVFkgICAgICAgICAgICAgPT0+IHByaW50ICJJTkZUWSUiCi0gICAgICogKDMpIDAgPD0gbnVtL2Rlbm9tIDwgOTkuOTk1JSAgICAgICAgID09PiB1c2UgdGhlIHBlcmNlbnQgZm9ybWF0ICI5OS45OSUiCi0gICAgICogICAgIGlmIGZvcmNlX3BlcmNlbnQ6Ci0gICAgICogKDQpICAgIDAuOTk1IDw9IG51bS9kZW5vbSA8IElORklOSVRZID09PiB1c2UgdGhlIHBlcmNlbnQgZm9ybWF0ICI5OTklIgotICAgICAqICAgICBlbHNlOgotICAgICAqICg1KSAgICAwLjk5NSA8PSBudW0vZGVub20gPCA5OS45OTUgICA9PT4gdXNlIHRoZSBmYWN0b3IgZm9ybWF0ICI5Ljk5eCIKLSAgICAgKiAoNikgICAgOTkuNSA8PSBudW0vZGVub20gPCBJTkZJTklUWSAgPT0+IHVzZSB0aGUgZmFjdG9yIGZvcm1hdCAiOTk5eCIKLSAgICAgKiAgICAgZW5kIGlmCi0gICAgICovCi0KLSAgICBvc3lzX2ZzaXplX3QgaW50ZWdlcl9wYXJ0LCByZW1haW5kZXI7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uYWxfcGFydCwgc2NhbGU7Ci0gICAgZG91YmxlIHNjYWxlZF9yYXRpbzsKLQotICAgIC8qICgxLDIpOiBudW0vZGVub20gPSAwLzAgb3IgbnVtL2Rlbm9tID0gSU5GSU5JVFkgKi8KLSAgICBpZiAoZGVub20gPT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmcHJpbnRmKHN0cmVhbSwgbnVtID09IDAgPyAiPz8lJSIgOiAiSU5GVFklJSIpOwotICAgIH0KLQotICAgIC8qICgzKTogMCA8PSBudW0vZGVub20gPCA5OS45OTUlICovCi0gICAgLyogbnVtL2Rlbm9tIDwgOTkuOTk1JSA8PT0+IGRlbm9tLyhkZW5vbS1udW0pIDwgMjAwMDAgKi8KLSAgICBpZiAobnVtIDwgZGVub20gJiYgZGVub20gLyAoZGVub20gLSBudW0pIDwgMjAwMDApCi0gICAgewotICAgICAgICBzY2FsZSA9IDEwMDAwOwotICAgICAgICBzY2FsZWRfcmF0aW8gPSAoKGRvdWJsZSludW0gKiAoZG91YmxlKXNjYWxlKSAvIChkb3VibGUpZGVub207Ci0gICAgICAgIGZyYWN0aW9uYWxfcGFydCA9ICh1bnNpZ25lZCBpbnQpKHNjYWxlZF9yYXRpbyArIDAuNSk7Ci0gICAgICAgIC8qIEFkanVzdCB0aGUgc2NhbGVkIHJlc3VsdCBpbiB0aGUgZXZlbnQgb2YgYSByb3VuZG9mZiBlcnJvci4gKi8KLSAgICAgICAgLyogU3VjaCBlcnJvciBtYXkgb2NjdXIgb25seSBpZiB0aGUgbnVtZXJhdG9yIGlzIGV4dHJlbWVseSBsYXJnZS4gKi8KLSAgICAgICAgaWYgKGZyYWN0aW9uYWxfcGFydCA+PSBzY2FsZSkKLSAgICAgICAgICAgIGZyYWN0aW9uYWxfcGFydCA9IHNjYWxlIC0gMTsKLSAgICAgICAgcmV0dXJuIGZwcmludGYoc3RyZWFtLCAiJXUuJTAydSUlIiwgZnJhY3Rpb25hbF9wYXJ0IC8gMTAwLCBmcmFjdGlvbmFsX3BhcnQgJSAxMDApOwotICAgIH0KLQotICAgIC8qIEV4dHJhY3QgdGhlIGludGVnZXIgcGFydCBvdXQgb2YgdGhlIGZyYWN0aW9uIGZvciB0aGUgcmVtYWluaW5nIGNhc2VzLiAqLwotICAgIGludGVnZXJfcGFydCA9IG51bSAvIGRlbm9tOwotICAgIHJlbWFpbmRlciA9IG51bSAlIGRlbm9tOwotICAgIHNjYWxlID0gMTAwOwotICAgIHNjYWxlZF9yYXRpbyA9ICgoZG91YmxlKXJlbWFpbmRlciAqIChkb3VibGUpc2NhbGUpIC8gKGRvdWJsZSlkZW5vbTsKLSAgICBmcmFjdGlvbmFsX3BhcnQgPSAodW5zaWduZWQgaW50KShzY2FsZWRfcmF0aW8gKyAwLjUpOwotICAgIGlmIChmcmFjdGlvbmFsX3BhcnQgPj0gc2NhbGUpCi0gICAgewotICAgICAgICBmcmFjdGlvbmFsX3BhcnQgPSAwOwotICAgICAgICArK2ludGVnZXJfcGFydDsKLSAgICB9Ci0KLSAgICAvKiAoNCk6IDAuOTk1IDw9IG51bS9kZW5vbSA8IElORklOSVRZICovCi0gICAgaWYgKGZvcmNlX3BlcmNlbnQpCi0gICAgewotICAgICAgICByZXR1cm4gZnByaW50ZihzdHJlYW0sICIlIiBPU1lTX0ZTSVpFX1BSSXUgIiUwMnUlJSIsCi0gICAgICAgICAgICAgICAgICAgaW50ZWdlcl9wYXJ0LCBmcmFjdGlvbmFsX3BhcnQpOwotICAgIH0KLQotICAgIC8qICg1KTogMC45OTUgPD0gbnVtL2Rlbm9tIDwgOTkuOTk1ICovCi0gICAgaWYgKGludGVnZXJfcGFydCA8IDEwMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmcHJpbnRmKHN0cmVhbSwgIiUiIE9TWVNfRlNJWkVfUFJJdSAiLiUwMnV4IiwKLSAgICAgICAgICAgICAgICAgICBpbnRlZ2VyX3BhcnQsIGZyYWN0aW9uYWxfcGFydCk7Ci0gICAgfQotCi0gICAgLyogKDYpOiA5OS41IDw9IG51bS9kZW5vbSA8IElORklOSVRZICovCi0gICAgLyogUm91bmQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gKi8KLSAgICAvKiBSZWNhbGN1bGF0ZSB0aGUgaW50ZWdlciBwYXJ0LCBmb3IgY29ybmVyIGNhc2VzIGxpa2UgMTIzLjk5OS4gKi8KLSAgICBpbnRlZ2VyX3BhcnQgPSBudW0gLyBkZW5vbTsKLSAgICBpZiAocmVtYWluZGVyID4gKGRlbm9tIC0gMSkgLyAyKQotICAgICAgICArK2ludGVnZXJfcGFydDsKLSAgICByZXR1cm4gZnByaW50ZihzdHJlYW0sICIlIiBPU1lTX0ZTSVpFX1BSSXUgIngiLCBpbnRlZ2VyX3BhcnQpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL29wdGlwbmcvdGVzdC9wcmludF9yYXRpby5oIGIvc3JjL29wdGlwbmcvdGVzdC9wcmludF9yYXRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTZiZDNmLi4wMDAwMDAwCi0tLSBhL3NyYy9vcHRpcG5nL3Rlc3QvcHJpbnRfcmF0aW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBwcmludF9yYXRpby5oCi0gKiBEZWNsYXJhdGlvbnMgZm9yICpwcmludF9yYXRpbygpCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTIgQ29zbWluIFRydXRhLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHpsaWIgbGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgdGhlIGF0dGFjaGVkIExJQ0VOU0UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKi8KLQotI2lmbmRlZiBQUklOVF9SQVRJT19ICi0jZGVmaW5lIFBSSU5UX1JBVElPX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiLi4vb3N5cy5oIgotCi1pbnQKLWZwcmludF9mc2l6ZV9yYXRpbyhGSUxFICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgb3N5c19mc2l6ZV90IG51bSwgb3N5c19mc2l6ZV90IGRlbm9tLAotICAgICAgICAgICAgICAgICAgIGludCBmb3JjZV9wZXJjZW50KTsKLQotaW50Ci1zcHJpbnRfZnNpemVfcmF0aW8oY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBvc3lzX2ZzaXplX3QgbnVtLCBvc3lzX2ZzaXplX3QgZGVub20sCi0gICAgICAgICAgICAgICAgICAgaW50IGZvcmNlX3BlcmNlbnQpOwotCi0jZW5kaWYgIC8qIFBSSU5UX1JBVElPX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9vcHRpcG5nL3Rlc3QvcHJpbnRfcmF0aW9fdGVzdC5jIGIvc3JjL29wdGlwbmcvdGVzdC9wcmludF9yYXRpb190ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YjJiMjcuLjAwMDAwMDAKLS0tIGEvc3JjL29wdGlwbmcvdGVzdC9wcmludF9yYXRpb190ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIHByaW50X3JhdGlvX3Rlc3QuYwotICogVGVzdCBmb3IgcHJpbnRfZnNpemVfcmF0aW8uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTIgQ29zbWluIFRydXRhLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHpsaWIgbGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgdGhlIGF0dGFjaGVkIExJQ0VOU0UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgInByaW50X3JhdGlvLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotc3RhdGljIGludCBudW1fZXJyb3JzID0gMDsKLQotc3RhdGljIGludAotdGVzdCh1bnNpZ25lZCBsb25nIG51bSwgdW5zaWduZWQgbG9uZyBkZW5vbSwKLSAgICAgY29uc3QgY2hhciAqZXhwZWN0ZWRfcmVzdWx0LAotICAgICBjb25zdCBjaGFyICpleHBlY3RlZF9yZXN1bHRfZm9yY2VfcGVyY2VudCkKLXsKLSAgICBjaGFyIGJ1ZjFbNjRdLCBidWYyWzY0XTsKLSAgICBpbnQgcmVzdWx0ID0gMTsKLQotICAgIHNwcmludF9mc2l6ZV9yYXRpbyhidWYxLCBzaXplb2YoYnVmMSksIG51bSwgZGVub20sIDApOwotICAgIGlmIChzdHJjbXAoYnVmMSwgZXhwZWN0ZWRfcmVzdWx0KSAhPSAwKQotICAgICAgICByZXN1bHQgPSAwOwotCi0gICAgc3ByaW50X2ZzaXplX3JhdGlvKGJ1ZjIsIHNpemVvZihidWYyKSwgbnVtLCBkZW5vbSwgMSk7Ci0gICAgaWYgKHN0cmNtcChidWYyLCBleHBlY3RlZF9yZXN1bHRfZm9yY2VfcGVyY2VudCkgIT0gMCkKLSAgICAgICAgcmVzdWx0ID0gMDsKLQotICAgIGlmIChyZXN1bHQpCi0gICAgICAgIHByaW50ZigiUGFzc2VkOiAlbHUgLyAlbHVcbiIsIG51bSwgZGVub20pOwotICAgIGVsc2UKLSAgICAgICAgcHJpbnRmKCJGQUlMRUQ6ICVsdSAvICVsdSwgcmVzdWx0OiAoJXMgJXMpLCBleHBlY3RlZDogKCVzICVzKVxuIiwKLSAgICAgICAgICAgICAgIG51bSwgZGVub20sCi0gICAgICAgICAgICAgICBidWYxLCBidWYyLAotICAgICAgICAgICAgICAgZXhwZWN0ZWRfcmVzdWx0LCBleHBlY3RlZF9yZXN1bHRfZm9yY2VfcGVyY2VudCk7Ci0KLSAgICBpZiAoIXJlc3VsdCkKLSAgICAgICAgKytudW1fZXJyb3JzOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ydW5fdGVzdHMoKQotewotICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgTUFYID0gfjBVTDsKLQotICAgIC8qCi0gICAgICogKDEpIG51bS9kZW5vbSA9PSAwLzAKLSAgICAgKi8KLSAgICB0ZXN0KDAsIDAsICI/PyUiLCAiPz8lIik7Ci0KLSAgICAvKgotICAgICAqICgyKSBudW0vZGVub20gPT0gSU5GSU5JVFkKLSAgICAgKi8KLSAgICB0ZXN0KDEsIDAsICJJTkZUWSUiLCAiSU5GVFklIik7Ci0KLSAgICAvKgotICAgICAqICgzKSAwIDw9IG51bS9kZW5vbSA8IDk5Ljk5NSUgPT0+IHByZWNpc2lvbiA9IDAuMDAwMQotICAgICAqLwotICAgIHRlc3QoICAgICAwLCAgICAgIDEsICAiMC4wMCUiLCAgIjAuMDAlIik7ICAvKiA9IDAlICovCi0gICAgdGVzdCggICAgIDAsICAgIE1BWCwgICIwLjAwJSIsICAiMC4wMCUiKTsgIC8qID0gMCUgKi8KLSAgICB0ZXN0KCAgICAgMSwgICAgTUFYLCAgIjAuMDAlIiwgICIwLjAwJSIpOyAgLyogPiAwJSAqLwotICAgIHRlc3QoICAgICAxLCAgMjAwMDEsICAiMC4wMCUiLCAgIjAuMDAlIik7ICAvKiA8IDAuMDA1JSAqLwotICAgIHRlc3QoICAgICAxLCAgMjAwMDAsICAiMC4wMSUiLCAgIjAuMDElIik7ICAvKiA9IDAuMDA1JSAqLwotICAgIHRlc3QoICAgICAxLCAgMTk5OTksICAiMC4wMSUiLCAgIjAuMDElIik7ICAvKiA+IDAuMDA1JSAqLwotICAgIHRlc3QoICAgICAxLCAgMTAwMDAsICAiMC4wMSUiLCAgIjAuMDElIik7ICAvKiA9IDAuMDElICovCi0gICAgdGVzdCggICAgIDEsICAgNDAwMSwgICIwLjAyJSIsICAiMC4wMiUiKTsgIC8qIDwgMC4wMjUlICovCi0gICAgdGVzdCggICAgIDEsICAgNDAwMCwgICIwLjAzJSIsICAiMC4wMyUiKTsgIC8qID0gMC4wMjUlICovCi0gICAgdGVzdCggICAgIDEsICAgMzk5OSwgICIwLjAzJSIsICAiMC4wMyUiKTsgIC8qID4gMC4wMjUlICovCi0gICAgdGVzdCgxOTkwMDAsIDk5NTAwMCwgIjIwLjAwJSIsICIyMC4wMCUiKTsgIC8qID0gMjAlICovCi0gICAgdGVzdCggTUFYLzUsICAgIE1BWCwgIjIwLjAwJSIsICIyMC4wMCUiKTsgIC8qID0gMjAlICovCi0gICAgdGVzdCggTUFYLzksICBNQVgvMywgIjMzLjMzJSIsICIzMy4zMyUiKTsgIC8qIDwgMzMuMzMuLi4lICovCi0gICAgdGVzdCggICAgNDksICAgICA5OSwgIjQ5LjQ5JSIsICI0OS40OSUiKTsgIC8qID0gNDkuNDk0OS4uLiUgKi8KLSAgICB0ZXN0KDQ5NDk0OSwgOTk5OTk5LCAiNDkuNDklIiwgIjQ5LjQ5JSIpOyAgLyogPSA0OS40OTQ5Li4uJSAqLwotICAgIHRlc3QoIE1BWC8yLCAgICBNQVgsICI1MC4wMCUiLCAiNTAuMDAlIik7ICAvKiA8IDUwJSAqLwotICAgIHRlc3QoIE1BWC8yLCAgTUFYLTEsICI1MC4wMCUiLCAiNTAuMDAlIik7ICAvKiA9IDUwJSAqLwotICAgIHRlc3QoIDUwMDA1LCAxMDAwMDAsICI1MC4wMSUiLCAiNTAuMDElIik7ICAvKiA9IDUwLjAwNSUgKi8KLSAgICB0ZXN0KCAgICA1MCwgICAgIDk5LCAiNTAuNTElIiwgIjUwLjUxJSIpOyAgLyogPSA1MC41MDUwLi4uJSAqLwotICAgIHRlc3QoNTA1MDUwLCA5OTk5OTksICI1MC41MSUiLCAiNTAuNTElIik7ICAvKiA9IDUwLjUwNTAuLi4lICovCi0gICAgdGVzdCggOTk5OTUsIDEwMDAwMSwgIjk5Ljk5JSIsICI5OS45OSUiKTsgIC8qIDwgOTkuOTUlICovCi0KLSAgICAvKgotICAgICAqICg0KSAwLjk5NSA8PSBudW0vZGVub20gPCBJTkZJTklUWSBhbmQgZm9yY2VfcGVyY2VudAotICAgICAqICg1KSAwLjk5NSA8PSBudW0vZGVub20gPCA5OS45OTUgPT0+IHByZWNpc2lvbiA9IDAuMDEKLSAgICAgKi8KLSAgICB0ZXN0KCA5OTk5NSwgMTAwMDAwLCAgIjEuMDB4IiwgICAiMTAwJSIpOyAgLyogPSA5OS45NSUgKi8KLSAgICB0ZXN0KCBNQVgtMSwgICAgTUFYLCAgIjEuMDB4IiwgICAiMTAwJSIpOyAgLyogPCAxLjAgKi8KLSAgICB0ZXN0KCAgICAgMSwgICAgICAxLCAgIjEuMDB4IiwgICAiMTAwJSIpOyAgLyogPSAxLjAgKi8KLSAgICB0ZXN0KCAgIE1BWCwgICAgTUFYLCAgIjEuMDB4IiwgICAiMTAwJSIpOyAgLyogPSAxLjAgKi8KLSAgICB0ZXN0KCAgIE1BWCwgIE1BWC0xLCAgIjEuMDB4IiwgICAiMTAwJSIpOyAgLyogPiAxLjAgKi8KLSAgICB0ZXN0KCAxMjM1MCwgIDEwMDAxLCAgIjEuMjN4IiwgICAiMTIzJSIpOyAgLyogPCAxLjIzNSAqLwotICAgIHRlc3QoIDEyMzUwLCAgMTAwMDAsICAiMS4yNHgiLCAgICIxMjQlIik7ICAvKiA9IDEuMjM1ICovCi0gICAgdGVzdCggTUFYLCAgTUFYLzIrMSwgICIyLjAweCIsICAgIjIwMCUiKTsgIC8qIDwgMi4wICovCi0gICAgdGVzdCggTUFYLTEsICBNQVgvMiwgICIyLjAweCIsICAgIjIwMCUiKTsgIC8qID0gMi4wICovCi0gICAgdGVzdCggICBNQVgsICBNQVgvMiwgICIyLjAweCIsICAgIjIwMCUiKTsgIC8qID4gMi4wICovCi0gICAgdGVzdCggICBNQVgsICBNQVgvNiwgICI2LjAweCIsICAgIjYwMCUiKTsgIC8qID4gNi4wICovCi0gICAgdGVzdCggICBNQVgsICBNQVgvOSwgICI5LjAweCIsICAgIjkwMCUiKTsgIC8qID4gOS4wICovCi0gICAgdGVzdCggIDEyOTksICAgIDEwMCwgIjEyLjk5eCIsICAiMTI5OSUiKTsgIC8qID0gMTIuOTkgKi8KLSAgICB0ZXN0KCAxMjk5OSwgICAxMDAwLCAiMTMuMDB4IiwgICIxMzAwJSIpOyAgLyogPSAxMi45OTkgKi8KLSAgICB0ZXN0KCAgIE1BWCwgTUFYLzk5LCAiOTkuMDB4IiwgICI5OTAwJSIpOyAgLyogPiA5OS4wICovCi0gICAgdGVzdCg5OTk5NTAsICAxMDAwMSwgIjk5Ljk5eCIsICAiOTk5OSUiKTsgIC8qIDwgOTkuOTk1ICovCi0gICAgdGVzdCg5OTk5NDksICAxMDAwMCwgIjk5Ljk5eCIsICAiOTk5OSUiKTsgIC8qIDwgOTkuOTk1ICovCi0KLSAgICAvKgotICAgICAqICg0KSAwLjk5NSA8PSBudW0vZGVub20gPCBJTkZJTklUWSBhbmQgZm9yY2VfcGVyY2VudAotICAgICAqICg2KSA5OS41IDw9IG51bS9kZW5vbSA8IElORklOSVRZID09PiBwcmVjaXNpb24gPSAxLjAKLSAgICAgKi8KLSAgICB0ZXN0KDk5OTk1MCwgIDEwMDAwLCAgICIxMDB4IiwgIjEwMDAwJSIpOyAgLyogPSA5OS45OTUgKi8KLSAgICB0ZXN0KCAgIDUwMiwgICAgICA1LCAgICIxMDB4IiwgIjEwMDQwJSIpOyAgLyogPCAxMDAuNSAqLwotICAgIHRlc3QoICAxMDA0LCAgICAgMTAsICAgIjEwMHgiLCAiMTAwNDAlIik7ICAvKiA8IDEwMC41ICovCi0gICAgdGVzdCggIDEwMDUsICAgICAxMCwgICAiMTAxeCIsICIxMDA1MCUiKTsgIC8qID0gMTAwLjUgKi8KLSAgICB0ZXN0KCAgIDUwMywgICAgICA1LCAgICIxMDF4IiwgIjEwMDYwJSIpOyAgLyogPiAxMDAuNSAqLwotICAgIHRlc3QoICAxMDA2LCAgICAgMTAsICAgIjEwMXgiLCAiMTAwNjAlIik7ICAvKiA+IDEwMC41ICovCi0gICAgdGVzdCggMTIzOTksICAgIDEwMCwgICAiMTI0eCIsICIxMjM5OSUiKTsgIC8qID0gMTIzLjk5ICovCi0gICAgdGVzdCgxMjM5OTksICAgMTAwMCwgICAiMTI0eCIsICIxMjQwMCUiKTsgIC8qID0gMTIzLjk5OSAqLwotICAgIHRlc3QoTUFYLCAgIE1BWC85OTksICAgIjk5OXgiLCAiOTk5MDAlIik7ICAvKiA+IDk5OS4wICovCi0gICAgdGVzdCg5OTk0OTksICAgMTAwMCwgICAiOTk5eCIsICI5OTk1MCUiKTsgIC8qIDwgOTk5LjUgKi8KLSAgICB0ZXN0KDk5OTUwMCwgICAxMDAwLCAgIjEwMDB4IiwgIjk5OTUwJSIpOyAgLyogPSA5OTkuNSAqLwotfQotCi1pbnQKLW1haW4oKQotewotICAgIHJ1bl90ZXN0cygpOwotICAgIGlmIChudW1fZXJyb3JzICE9IDApCi0gICAgewotICAgICAgICBwcmludGYoIioqICVkIHRlc3RzIEZBSUxFRC5cbiIsIG51bV9lcnJvcnMpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcHJpbnRmKCIqKiBBbGwgdGVzdHMgcGFzc2VkLlxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9vcHRpcG5nL3Rlc3Qvc3ByaW50X3JhdGlvLmdlbmVyYXRlZC5jIGIvc3JjL29wdGlwbmcvdGVzdC9zcHJpbnRfcmF0aW8uZ2VuZXJhdGVkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MDY4MWEuLjAwMDAwMDAKLS0tIGEvc3JjL29wdGlwbmcvdGVzdC9zcHJpbnRfcmF0aW8uZ2VuZXJhdGVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogKnByaW50X3JhdGlvLmdlbmVyYXRlZC5jCi0gKiBHZW5lcmF0ZWQgZnJvbSBvcHRpbS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTIgQ29zbWluIFRydXRhLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHpsaWIgbGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgdGhlIGF0dGFjaGVkIExJQ0VOU0UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgInByaW50X3JhdGlvLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICIuLi9vc3lzLmgiCi0KLSNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKLSNlbmRpZgotCi1pbnQKLXNwcmludF9mc2l6ZV9yYXRpbyhjaGFyICpidWYsIHNpemVfdCBidWZzaXplLCBvc3lzX2ZzaXplX3QgbnVtLCBvc3lzX2ZzaXplX3QgZGVub20sIGludCBmb3JjZV9wZXJjZW50KQotewotICAgIC8qICgxKSBudW0vZGVub20gPSAwLzAgICAgICAgICAgICAgICAgICA9PT4gcHJpbnQgIj8/JSIKLSAgICAgKiAoMikgbnVtL2Rlbm9tID0gSU5GSU5JVFkgICAgICAgICAgICAgPT0+IHByaW50ICJJTkZUWSUiCi0gICAgICogKDMpIDAgPD0gbnVtL2Rlbm9tIDwgOTkuOTk1JSAgICAgICAgID09PiB1c2UgdGhlIHBlcmNlbnQgZm9ybWF0ICI5OS45OSUiCi0gICAgICogICAgIGlmIGZvcmNlX3BlcmNlbnQ6Ci0gICAgICogKDQpICAgIDAuOTk1IDw9IG51bS9kZW5vbSA8IElORklOSVRZID09PiB1c2UgdGhlIHBlcmNlbnQgZm9ybWF0ICI5OTklIgotICAgICAqICAgICBlbHNlOgotICAgICAqICg1KSAgICAwLjk5NSA8PSBudW0vZGVub20gPCA5OS45OTUgICA9PT4gdXNlIHRoZSBmYWN0b3IgZm9ybWF0ICI5Ljk5eCIKLSAgICAgKiAoNikgICAgOTkuNSA8PSBudW0vZGVub20gPCBJTkZJTklUWSAgPT0+IHVzZSB0aGUgZmFjdG9yIGZvcm1hdCAiOTk5eCIKLSAgICAgKiAgICAgZW5kIGlmCi0gICAgICovCi0KLSAgICBvc3lzX2ZzaXplX3QgaW50ZWdlcl9wYXJ0LCByZW1haW5kZXI7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uYWxfcGFydCwgc2NhbGU7Ci0gICAgZG91YmxlIHNjYWxlZF9yYXRpbzsKLQotICAgIC8qICgxLDIpOiBudW0vZGVub20gPSAwLzAgb3IgbnVtL2Rlbm9tID0gSU5GSU5JVFkgKi8KLSAgICBpZiAoZGVub20gPT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzbnByaW50ZihidWYsIGJ1ZnNpemUsIG51bSA9PSAwID8gIj8/JSUiIDogIklORlRZJSUiKTsKLSAgICB9Ci0KLSAgICAvKiAoMyk6IDAgPD0gbnVtL2Rlbm9tIDwgOTkuOTk1JSAqLwotICAgIC8qIG51bS9kZW5vbSA8IDk5Ljk5NSUgPD09PiBkZW5vbS8oZGVub20tbnVtKSA8IDIwMDAwICovCi0gICAgaWYgKG51bSA8IGRlbm9tICYmIGRlbm9tIC8gKGRlbm9tIC0gbnVtKSA8IDIwMDAwKQotICAgIHsKLSAgICAgICAgc2NhbGUgPSAxMDAwMDsKLSAgICAgICAgc2NhbGVkX3JhdGlvID0gKChkb3VibGUpbnVtICogKGRvdWJsZSlzY2FsZSkgLyAoZG91YmxlKWRlbm9tOwotICAgICAgICBmcmFjdGlvbmFsX3BhcnQgPSAodW5zaWduZWQgaW50KShzY2FsZWRfcmF0aW8gKyAwLjUpOwotICAgICAgICAvKiBBZGp1c3QgdGhlIHNjYWxlZCByZXN1bHQgaW4gdGhlIGV2ZW50IG9mIGEgcm91bmRvZmYgZXJyb3IuICovCi0gICAgICAgIC8qIFN1Y2ggZXJyb3IgbWF5IG9jY3VyIG9ubHkgaWYgdGhlIG51bWVyYXRvciBpcyBleHRyZW1lbHkgbGFyZ2UuICovCi0gICAgICAgIGlmIChmcmFjdGlvbmFsX3BhcnQgPj0gc2NhbGUpCi0gICAgICAgICAgICBmcmFjdGlvbmFsX3BhcnQgPSBzY2FsZSAtIDE7Ci0gICAgICAgIHJldHVybiBzbnByaW50ZihidWYsIGJ1ZnNpemUsICIldS4lMDJ1JSUiLCBmcmFjdGlvbmFsX3BhcnQgLyAxMDAsIGZyYWN0aW9uYWxfcGFydCAlIDEwMCk7Ci0gICAgfQotCi0gICAgLyogRXh0cmFjdCB0aGUgaW50ZWdlciBwYXJ0IG91dCBvZiB0aGUgZnJhY3Rpb24gZm9yIHRoZSByZW1haW5pbmcgY2FzZXMuICovCi0gICAgaW50ZWdlcl9wYXJ0ID0gbnVtIC8gZGVub207Ci0gICAgcmVtYWluZGVyID0gbnVtICUgZGVub207Ci0gICAgc2NhbGUgPSAxMDA7Ci0gICAgc2NhbGVkX3JhdGlvID0gKChkb3VibGUpcmVtYWluZGVyICogKGRvdWJsZSlzY2FsZSkgLyAoZG91YmxlKWRlbm9tOwotICAgIGZyYWN0aW9uYWxfcGFydCA9ICh1bnNpZ25lZCBpbnQpKHNjYWxlZF9yYXRpbyArIDAuNSk7Ci0gICAgaWYgKGZyYWN0aW9uYWxfcGFydCA+PSBzY2FsZSkKLSAgICB7Ci0gICAgICAgIGZyYWN0aW9uYWxfcGFydCA9IDA7Ci0gICAgICAgICsraW50ZWdlcl9wYXJ0OwotICAgIH0KLQotICAgIC8qICg0KTogMC45OTUgPD0gbnVtL2Rlbm9tIDwgSU5GSU5JVFkgKi8KLSAgICBpZiAoZm9yY2VfcGVyY2VudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzbnByaW50ZihidWYsIGJ1ZnNpemUsICIlIiBPU1lTX0ZTSVpFX1BSSXUgIiUwMnUlJSIsCi0gICAgICAgICAgICAgICAgICAgaW50ZWdlcl9wYXJ0LCBmcmFjdGlvbmFsX3BhcnQpOwotICAgIH0KLQotICAgIC8qICg1KTogMC45OTUgPD0gbnVtL2Rlbm9tIDwgOTkuOTk1ICovCi0gICAgaWYgKGludGVnZXJfcGFydCA8IDEwMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzbnByaW50ZihidWYsIGJ1ZnNpemUsICIlIiBPU1lTX0ZTSVpFX1BSSXUgIi4lMDJ1eCIsCi0gICAgICAgICAgICAgICAgICAgaW50ZWdlcl9wYXJ0LCBmcmFjdGlvbmFsX3BhcnQpOwotICAgIH0KLQotICAgIC8qICg2KTogOTkuNSA8PSBudW0vZGVub20gPCBJTkZJTklUWSAqLwotICAgIC8qIFJvdW5kIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuICovCi0gICAgLyogUmVjYWxjdWxhdGUgdGhlIGludGVnZXIgcGFydCwgZm9yIGNvcm5lciBjYXNlcyBsaWtlIDEyMy45OTkuICovCi0gICAgaW50ZWdlcl9wYXJ0ID0gbnVtIC8gZGVub207Ci0gICAgaWYgKHJlbWFpbmRlciA+IChkZW5vbSAtIDEpIC8gMikKLSAgICAgICAgKytpbnRlZ2VyX3BhcnQ7Ci0gICAgcmV0dXJuIHNucHJpbnRmKGJ1ZiwgYnVmc2l6ZSwgIiUiIE9TWVNfRlNJWkVfUFJJdSAieCIsIGludGVnZXJfcGFydCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvb3B0aXBuZy93aWxkYXJncy5jIGIvc3JjL29wdGlwbmcvd2lsZGFyZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg2Yzg2OC4uMDAwMDAwMAotLS0gYS9zcmMvb3B0aXBuZy93aWxkYXJncy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIHdpbGRhcmdzLmMKLSAqIEF1dG9tYXRpYyBjb21tYW5kLWxpbmUgd2lsZGNhcmQgZXhwYW5zaW9uIGZvciBlbnZpcm9ubWVudHMgdGhhdAotICogYXJlIG5vdCBiYXNlZCBvbiB0aGUgVW4qeCBzaGVsbC4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGxhY2VkIGluIHRoZSBQVUJMSUMgRE9NQUlOLgotICogVGhlIGF1dGhvciBDTEFJTVMgTk8gQ09QWVJJR0hUIGFuZCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMuCi0gKiAtLSBDb3NtaW4gVHJ1dGEKLSAqCi0gKiBSZXZpc2lvbiBoaXN0b3J5OgotICogICAgMjAxMC1NYXItMTEgIEFkZGVkIFdpbjY0IHN1cHBvcnQuCi0gKiAgICAyMDAzLU1heS0wNSAgRmlyc3QgZWRpdGlvbiwgV2luMzIgc3VwcG9ydC4KLSAqLwotCi0vKgotICogVGhlIGZvbGxvd2luZyBjb2RlIGlzIGluc3BpcmVkIGZyb20gTWluR1czMiBieSBDb2xpbiBQZXRlcnMuCi0gKi8KLSNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIChkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9XSU42NCkKLWludCBfZG93aWxkY2FyZCA9IDE7Ci0jZW5kaWYKLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBpbnNwaXJlZCBmcm9tIEJNUDJQTkcgYnkgTUlZQVNBS0EgTWFzYXJ1LgotICovCi0jaWYgZGVmaW5lZCBfX0JPUkxBTkRDX18gJiYgKGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19XSU42NF9fKQotI2luY2x1ZGUgPHdpbGRhcmdzLmg+Ci10eXBlZGVmIHZvaWQgX1JUTEVOVFJZICgqIF9SVExFTlRSWSBfYXJndl9leHBhbmRfZm4pKGNoYXIgKiwgX1BGTl9BRERBUkcpOwotdHlwZWRlZiB2b2lkIF9SVExFTlRSWSAoKiBfUlRMRU5UUlkgX3dhcmd2X2V4cGFuZF9mbikod2NoYXJfdCAqLCBfUEZOX0FEREFSRyk7Ci1fYXJndl9leHBhbmRfZm4gX2FyZ3ZfZXhwYW5kX3B0ciA9IF9leHBhbmRfd2lsZDsKLV93YXJndl9leHBhbmRfZm4gX3dhcmd2X2V4cGFuZF9wdHIgPSBfd2V4cGFuZF93aWxkOwotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvcG5neHRlcm4vTWFrZWZpbGUuaW4gYi9zcmMvcG5neHRlcm4vTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NmMwYmQuLjAwMDAwMDAKLS0tIGEvc3JjL3BuZ3h0ZXJuL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLlBIT05ZOiBhbGwgdGVzdCBjaGVjayBjbGVhbiBkaXN0Y2xlYW4KLS5QUkVDSU9VUzogTWFrZWZpbGUKLS5TVUZGSVhFUzogLmMgLm8gLmEKLQotQ0MgPSBAQ0NACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQID0gQENQUEAKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotTEQgPSBATERACi1MREZMQUdTID0gQExERkxBR1NACi1BUiA9IEBBUkAKLUFSRkxBR1MgPSBAQVJGTEFHU0AKLVJBTkxJQiA9IEBSQU5MSUJACi1STV9GID0gQFJNX0ZACi0KLUBVU0VfU1lTVEVNX1pMSUJfRkFMU0VAWkRJUiA9IC4uL3psaWIKLUBVU0VfU1lTVEVNX0xJQlBOR19GQUxTRUBQTkdESVIgPSAuLi9saWJwbmcKLUdJRkRJUiA9IC4uL2dpZnJlYWQKLVBOTURJUiA9IC4uL3BubWlvCi1USUZGRElSID0gLi4vbWluaXRpZmYKLQotUE5HWFRFUk5fTElCID0gbGlicG5neHRlcm4uYQotCi1QTkdYUkVBRF9PQkpTID0gcG5neHJlYWQubyBwbmd4cmJtcC5vIHBuZ3hyZ2lmLm8gcG5neHJqcGcubyBwbmd4cnBubS5vIHBuZ3hydGlmLm8KLVBOR1hVVElMX09CSlMgPSBwbmd4aW8ubyBwbmd4bWVtLm8gcG5neHNldC5vCi1QTkdYVEVSTl9PQkpTID0gJChQTkdYUkVBRF9PQkpTKSAkKFBOR1hVVElMX09CSlMpCi0KLUBVU0VfU1lTVEVNX1pMSUJfRkFMU0VAUE5HWFRFUk5fREVQSU5DTFVERV9aTElCID0gLUkkKFpESVIpCi1AVVNFX1NZU1RFTV9aTElCX1RSVUVAUE5HWFRFUk5fREVQSU5DTFVERV9aTElCID0KLUBVU0VfU1lTVEVNX0xJQlBOR19GQUxTRUBQTkdYVEVSTl9ERVBJTkNMVURFX0xJQlBORyA9IC1JJChQTkdESVIpCi1AVVNFX1NZU1RFTV9MSUJQTkdfVFJVRUBQTkdYVEVSTl9ERVBJTkNMVURFX0xJQlBORyA9Ci1QTkdYVEVSTl9ERVBJTkNMVURFUyA9IFwKLSAgJChQTkdYVEVSTl9ERVBJTkNMVURFX1pMSUIpIFwKLSAgJChQTkdYVEVSTl9ERVBJTkNMVURFX0xJQlBORykgXAotICAtSSQoR0lGRElSKSBcCi0gIC1JJChQTk1ESVIpIFwKLSAgLUkkKFRJRkZESVIpCi0KLWFsbDogJChQTkdYVEVSTl9MSUIpCi0KLXRlc3Q6Ci0KLWNoZWNrOiB0ZXN0Ci0KLS5jLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQoUE5HWFRFUk5fREVQSU5DTFVERVMpIC1vICRAICQ8Ci0KLSQoUE5HWFRFUk5fTElCKTogJChQTkdYVEVSTl9PQkpTKQotCSQoQVIpICQoQVJGTEFHUykgJEAgJChQTkdYVEVSTl9PQkpTKQotCSQoUkFOTElCKSAkQAotCi1wbmd4aW8ubzogcG5neGlvLmMgcG5neHV0aWwuaAotcG5neG1lbS5vOiBwbmd4bWVtLmMgcG5neHV0aWwuaAotcG5neHNldC5vOiBwbmd4c2V0LmMgcG5neHV0aWwuaAotcG5neHJlYWQubzogcG5neHJlYWQuYyBwbmd4dGVybi5oIHBuZ3h1dGlsLmgKLXBuZ3hyYm1wLm86IHBuZ3hyYm1wLmMgcG5neHRlcm4uaCBwbmd4dXRpbC5oIAotcG5neHJnaWYubzogcG5neHJnaWYuYyBwbmd4dGVybi5oIHBuZ3h1dGlsLmgKLXBuZ3hyanBnLm86IHBuZ3hyanBnLmMgcG5neHRlcm4uaCBwbmd4dXRpbC5oCi1wbmd4cnBubS5vOiBwbmd4cnBubS5jIHBuZ3h0ZXJuLmggcG5neHV0aWwuaAotcG5neHJ0aWYubzogcG5neHJ0aWYuYyBwbmd4dGVybi5oIHBuZ3h1dGlsLmgKLQotY2xlYW46Ci0JLSQoUk1fRikgJChQTkdYVEVSTl9MSUIpICQoUE5HWFRFUk5fT0JKUykKLQotZGlzdGNsZWFuOiBjbGVhbgotCS0kKFJNX0YpIE1ha2VmaWxlCmRpZmYgLS1naXQgYS9zcmMvcG5neHRlcm4vcG5neGlvLmMgYi9zcmMvcG5neHRlcm4vcG5neGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNGQ5M2YuLjAwMDAwMDAKLS0tIGEvc3JjL3BuZ3h0ZXJuL3BuZ3hpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qCi0gKiBwbmd4aW8uYyAtIGxpYnBuZyBleHRlbnNpb246IEkvTyBzdGF0ZSBxdWVyeS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMSBDb3NtaW4gVHJ1dGEuCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2luZyBhbmQgd2FycmFudHkgdGVybXMKLSAqIGFzIGxpYnBuZy4KLSAqCi0gKiBOT1RFOgotICogVGhlIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgaW4gdGhpcyBtb2R1bGUgaGFzICJncmFkdWF0ZWQiLCBhbmQgaXMgbm93Ci0gKiBwYXJ0IG9mIGxpYnBuZy4gIFRoZSBvcmlnaW5hbCBjb2RlLCByZXRyb2ZpdHRlZCBhcyBhIGJhY2stcG9ydCwgaGFzCi0gKiBsaW1pdGF0aW9uczogaXQgaXMgdGhyZWFkLXVuc2FmZSwgYW5kIGl0IG9ubHkgYWxsb3dzIG9uZSBwbmdfcHRyIG9iamVjdAotICogZm9yIHJlYWRpbmcgYW5kIG9uZSBmb3Igd3JpdGluZy4KLSAqCi0gKiBDQVVUSU9OOgotICogbGlicG5nLTEuNC41IGlzIHRoZSBlYXJsaWVzdCB2ZXJzaW9uIHdob3NlIEkvTyBzdGF0ZSBpbXBsZW1lbnRhdGlvbgotICogY2FuIGJlIHVzZWQgcmVsaWFibHkuCi0gKi8KLQotI2luY2x1ZGUgInBuZ3h1dGlsLmgiCi0KLSNkZWZpbmUgUE5HWF9JTlRFUk5BTAotI2luY2x1ZGUgInBuZ3hwcml2LmgiCi0KLQotI2lmIFBOR19MSUJQTkdfVkVSIDwgMTA0MDUKLQotCi1zdGF0aWMgcG5nX3N0cnVjdHAgX3BuZ3hpb19yZWFkX3B0cjsKLXN0YXRpYyBwbmdfc3RydWN0cCBfcG5neGlvX3dyaXRlX3B0cjsKLQotc3RhdGljIHBuZ19yd19wdHIgX3BuZ3hpb19yZWFkX2ZuOwotc3RhdGljIHBuZ19yd19wdHIgX3BuZ3hpb193cml0ZV9mbjsKLQotc3RhdGljIGludCBfcG5neGlvX3JlYWRfaW9fc3RhdGU7Ci1zdGF0aWMgaW50IF9wbmd4aW9fd3JpdGVfaW9fc3RhdGU7Ci0KLXN0YXRpYyBwbmdfYnl0ZSBfcG5neGlvX3JlYWRfY3J0X2NodW5rX2hkcls5XTsKLXN0YXRpYyBwbmdfYnl0ZSBfcG5neGlvX3dyaXRlX2NydF9jaHVua19oZHJbOV07Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX3BuZ3hpb19yZWFkX2NydF9jaHVua19oZHJfbGVuOwotc3RhdGljIHVuc2lnbmVkIGludCBfcG5neGlvX3dyaXRlX2NydF9jaHVua19oZHJfbGVuOwotCi1zdGF0aWMgcG5nX3VpbnRfMzIgX3BuZ3hpb19yZWFkX2NydF9sZW47Ci1zdGF0aWMgcG5nX3VpbnRfMzIgX3BuZ3hpb193cml0ZV9jcnRfbGVuOwotCi1zdGF0aWMgY29uc3QgY2hhciAqX3BuZ3hpb19lcnJtc2dfaW52YWxpZF9hcmd1bWVudCA9Ci0gICAiW1BOR1hJTyBpbnRlcm5hbF0gaW52YWxpZCBhcmd1bWVudCI7Ci0KLQotLyogVXBkYXRlIGlvX3N0YXRlIGFuZCBjYWxsIHRoZSB1c2VyLXN1cHBsaWVkIHJlYWQvd3JpdGUgZnVuY3Rpb25zLiAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmd4aW9fcmVhZF93cml0ZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCi17Ci0gICBwbmdfcndfcHRyIGlvX2RhdGFfZm47Ci0gICBpbnQgKmlvX3N0YXRlX3B0cjsKLSAgIGludCBpb19zdGF0ZV9vcDsKLSAgIHBuZ19ieXRlICpjcnRfY2h1bmtfaGRyOwotICAgdW5zaWduZWQgaW50ICpjcnRfY2h1bmtfaGRyX2xlbl9wdHI7Ci0gICBwbmdfdWludF8zMiAqY3J0X2xlbl9wdHI7Ci0KLSAgIGlmIChwbmdfcHRyID09IF9wbmd4aW9fcmVhZF9wdHIpCi0gICB7Ci0gICAgICBpb19kYXRhX2ZuID0gX3BuZ3hpb19yZWFkX2ZuOwotICAgICAgaW9fc3RhdGVfcHRyID0gJl9wbmd4aW9fcmVhZF9pb19zdGF0ZTsKLSAgICAgIGlvX3N0YXRlX29wID0gUE5HWF9JT19SRUFESU5HOwotICAgICAgY3J0X2NodW5rX2hkciA9IF9wbmd4aW9fcmVhZF9jcnRfY2h1bmtfaGRyOwotICAgICAgY3J0X2NodW5rX2hkcl9sZW5fcHRyID0gJl9wbmd4aW9fcmVhZF9jcnRfY2h1bmtfaGRyX2xlbjsKLSAgICAgIGNydF9sZW5fcHRyID0gJl9wbmd4aW9fcmVhZF9jcnRfbGVuOwotICAgfQotICAgZWxzZSBpZiAocG5nX3B0ciA9PSBfcG5neGlvX3dyaXRlX3B0cikKLSAgIHsKLSAgICAgIGlvX2RhdGFfZm4gPSBfcG5neGlvX3dyaXRlX2ZuOwotICAgICAgaW9fc3RhdGVfcHRyID0gJl9wbmd4aW9fd3JpdGVfaW9fc3RhdGU7Ci0gICAgICBpb19zdGF0ZV9vcCA9IFBOR1hfSU9fV1JJVElORzsKLSAgICAgIGNydF9jaHVua19oZHIgPSBfcG5neGlvX3dyaXRlX2NydF9jaHVua19oZHI7Ci0gICAgICBjcnRfY2h1bmtfaGRyX2xlbl9wdHIgPSAmX3BuZ3hpb193cml0ZV9jcnRfY2h1bmtfaGRyX2xlbjsKLSAgICAgIGNydF9sZW5fcHRyID0gJl9wbmd4aW9fd3JpdGVfY3J0X2xlbjsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBfcG5neGlvX2Vycm1zZ19pbnZhbGlkX2FyZ3VtZW50KTsKLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgc3dpdGNoICgqaW9fc3RhdGVfcHRyICYgUE5HWF9JT19NQVNLX0xPQykKLSAgIHsKLSAgIGNhc2UgUE5HWF9JT19TSUdOQVRVUkU6Ci0gICAgICAvKiBsaWJwbmcgbXVzdCBzZXJpYWxpemUgdGhlIHNpZ25hdHVyZSBpbiBhIHNpbmdsZSBJL08gc2Vzc2lvbi4gKi8KLSAgICAgIFBOR1hfQVNTRVJUKGxlbmd0aCA8PSA4KTsKLSAgICAgIGlvX2RhdGFfZm4ocG5nX3B0ciwgZGF0YSwgbGVuZ3RoKTsKLSAgICAgICppb19zdGF0ZV9wdHIgPSBpb19zdGF0ZV9vcCB8IFBOR1hfSU9fQ0hVTktfSERSOwotICAgICAgKmNydF9jaHVua19oZHJfbGVuX3B0ciA9IDA7Ci0gICAgICByZXR1cm47Ci0gICBjYXNlIFBOR1hfSU9fQ0hVTktfSERSOgotICAgICAgLyogbGlicG5nIG11c3Qgc2VyaWFsaXplIHRoZSBjaHVuayBoZWFkZXIgaW4gYSBzaW5nbGUgSS9PIHNlc3Npb24uCi0gICAgICAgKiAoVGhpcyB3YXMgZG9uZSBpbiBsaWJwbmctMS4yLjMwLCBidXQgcmVncmVzc2VkIGluIGxpYnBuZy0xLjQuMCwKLSAgICAgICAqIHNvIHdlIGNhbm5vdCByZWx5IG9uIGl0IGhlcmUuKQotICAgICAgICovCi0gICAgICBQTkdYX0FTU0VSVChsZW5ndGggPT0gNCB8fCBsZW5ndGggPT0gOCk7Ci0gICAgICBQTkdYX0FTU0VSVChsZW5ndGggKyAqY3J0X2NodW5rX2hkcl9sZW5fcHRyIDw9IDgpOwotICAgICAgaWYgKGlvX3N0YXRlX29wID09IFBOR1hfSU9fUkVBRElORykKLSAgICAgIHsKLSAgICAgICAgIGlmICgqY3J0X2NodW5rX2hkcl9sZW5fcHRyID09IDApCi0gICAgICAgICAgICBpb19kYXRhX2ZuKHBuZ19wdHIsIGNydF9jaHVua19oZHIsIDgpOwotICAgICAgICAgbWVtY3B5KGRhdGEsIGNydF9jaHVua19oZHIgKyAqY3J0X2NodW5rX2hkcl9sZW5fcHRyLCBsZW5ndGgpOwotICAgICAgICAgKmNydF9jaHVua19oZHJfbGVuX3B0ciArPSBsZW5ndGg7Ci0gICAgICAgICBpZiAoKmNydF9jaHVua19oZHJfbGVuX3B0ciA8IDgpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAqY3J0X2xlbl9wdHIgPSBwbmdfZ2V0X3VpbnRfMzIoY3J0X2NodW5rX2hkcik7Ci0gICAgICAgICAvKiBtZW1jcHkocG5nX3B0ci0+Y2h1bmtfbmFtZSwgY3J0X2NodW5rX2hkciArIDQsIDQpOyAqLwotICAgICAgfQotICAgICAgZWxzZSAgLyogaW9fc3RhdGVfb3AgPT0gUE5HWF9JT19XUklUSU5HICovCi0gICAgICB7Ci0gICAgICAgICBtZW1jcHkoY3J0X2NodW5rX2hkciArICpjcnRfY2h1bmtfaGRyX2xlbl9wdHIsIGRhdGEsIGxlbmd0aCk7Ci0gICAgICAgICAqY3J0X2NodW5rX2hkcl9sZW5fcHRyICs9IGxlbmd0aDsKLSAgICAgICAgIGlmICgqY3J0X2NodW5rX2hkcl9sZW5fcHRyIDwgOCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICpjcnRfbGVuX3B0ciA9IHBuZ19nZXRfdWludF8zMihjcnRfY2h1bmtfaGRyKTsKLSAgICAgICAgIC8qIG1lbWNweShwbmdfcHRyLT5jaHVua19uYW1lLCBjcnRfY2h1bmtfaGRyICsgNCwgNCk7ICovCi0gICAgICAgICBpb19kYXRhX2ZuKHBuZ19wdHIsIGNydF9jaHVua19oZHIsIDgpOwotICAgICAgfQotICAgICAgKmNydF9jaHVua19oZHJfbGVuX3B0ciA9IDA7Ci0gICAgICAqaW9fc3RhdGVfcHRyID0gaW9fc3RhdGVfb3AgfCBQTkdYX0lPX0NIVU5LX0RBVEE7Ci0gICAgICByZXR1cm47Ci0gICBjYXNlIFBOR1hfSU9fQ0hVTktfREFUQToKLSAgICAgIC8qIGxpYnBuZyBtYXkgc2VyaWFsaXplIHRoZSBjaHVuayBkYXRhIGluIG11bHRpcGxlIEkvTyBzZXNzaW9ucy4gKi8KLSAgICAgIGlmIChsZW5ndGggPT0gMCkKLSAgICAgICAgIHJldHVybjsKLSAgICAgIGlmICgqY3J0X2xlbl9wdHIgPiAwKQotICAgICAgewotICAgICAgICAgUE5HWF9BU1NFUlQobGVuZ3RoIDw9ICpjcnRfbGVuX3B0cik7Ci0gICAgICAgICBpb19kYXRhX2ZuKHBuZ19wdHIsIGRhdGEsIGxlbmd0aCk7Ci0gICAgICAgICAqY3J0X2xlbl9wdHIgLT0gbGVuZ3RoOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgKmlvX3N0YXRlX3B0ciA9IGlvX3N0YXRlX29wIHwgUE5HWF9JT19DSFVOS19DUkM7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgY2FzZSBQTkdYX0lPX0NIVU5LX0NSQzoKLSAgICAgIC8qIGxpYnBuZyBtdXN0IHNlcmlhbGl6ZSB0aGUgY2h1bmsgQ1JDIGluIGEgc2luZ2xlIEkvTyBzZXNzaW9uLiAqLwotICAgICAgUE5HWF9BU1NFUlQobGVuZ3RoID09IDQpOwotICAgICAgaW9fZGF0YV9mbihwbmdfcHRyLCBkYXRhLCA0KTsKLSAgICAgICppb19zdGF0ZV9wdHIgPSBpb19zdGF0ZV9vcCB8IFBOR1hfSU9fQ0hVTktfSERSOwotICAgICAgcmV0dXJuOwotICAgfQotfQotCi0vKiBHZXQgcG5nX3B0ci0+aW9fc3RhdGUuICovCi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ3hfZ2V0X2lvX3N0YXRlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfdWludF8zMiBpb19zdGF0ZTsKLQotICAgaWYgKHBuZ19wdHIgPT0gX3BuZ3hpb19yZWFkX3B0cikKLSAgICAgIGlvX3N0YXRlID0gX3BuZ3hpb19yZWFkX2lvX3N0YXRlOwotICAgZWxzZSBpZiAocG5nX3B0ciA9PSBfcG5neGlvX3dyaXRlX3B0cikKLSAgICAgIGlvX3N0YXRlID0gX3BuZ3hpb193cml0ZV9pb19zdGF0ZTsKLSAgIGVsc2UKLSAgIHsKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBfcG5neGlvX2Vycm1zZ19pbnZhbGlkX2FyZ3VtZW50KTsKLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KLSAgICAgIGlvX3N0YXRlID0gUE5HWF9JT19OT05FOwotICAgfQotCi0gICByZXR1cm4gaW9fc3RhdGU7Ci19Ci0KLS8qIEdldCBwbmdfcHRyLT5jaHVua19uYW1lLiAqLwotcG5nX2J5dGVwIFBOR0FQSQotcG5neF9nZXRfaW9fY2h1bmtfbmFtZShwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2J5dGVwIGNodW5rX25hbWU7Ci0KLSAgIGlmIChwbmdfcHRyID09IF9wbmd4aW9fcmVhZF9wdHIpCi0gICAgICBjaHVua19uYW1lID0gX3BuZ3hpb19yZWFkX2NydF9jaHVua19oZHIgKyA0OwotICAgZWxzZSBpZiAocG5nX3B0ciA9PSBfcG5neGlvX3dyaXRlX3B0cikKLSAgICAgIGNodW5rX25hbWUgPSBfcG5neGlvX3dyaXRlX2NydF9jaHVua19oZHIgKyA0OwotICAgZWxzZQotICAgewotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIF9wbmd4aW9fZXJybXNnX2ludmFsaWRfYXJndW1lbnQpOwotICAgICAgLyogTk9UUkVBQ0hFRCAqLwotICAgICAgY2h1bmtfbmFtZSA9IE5VTEw7Ci0gICB9Ci0KLSAgIHJldHVybiBjaHVua19uYW1lOwotfQotCi0vKiBXcmFwIHBuZ19zZXRfcmVhZF9mbi4gKi8KLXZvaWQgUE5HQVBJCi1wbmd4X3NldF9yZWFkX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBpb19wdHIsCi0gICBwbmdfcndfcHRyIHJlYWRfZGF0YV9mbikKLXsKLSAgIF9wbmd4aW9fcmVhZF9wdHIgPSBwbmdfcHRyOwotICAgX3BuZ3hpb193cml0ZV9wdHIgPSBOVUxMOwotICAgX3BuZ3hpb19yZWFkX2ZuID0gcmVhZF9kYXRhX2ZuOwotICAgcG5nX3NldF9yZWFkX2ZuKHBuZ19wdHIsIGlvX3B0ciwgcG5neGlvX3JlYWRfd3JpdGUpOwotICAgX3BuZ3hpb19yZWFkX2lvX3N0YXRlID0gUE5HWF9JT19SRUFESU5HIHwgUE5HWF9JT19TSUdOQVRVUkU7Ci19Ci0KLS8qIFdyYXAgcG5nX3NldF93cml0ZV9mbi4gKi8KLXZvaWQgUE5HQVBJCi1wbmd4X3NldF93cml0ZV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgaW9fcHRyLAotICAgcG5nX3J3X3B0ciB3cml0ZV9kYXRhX2ZuLCBwbmdfZmx1c2hfcHRyIG91dHB1dF9mbHVzaF9mbikKLXsKLSAgIF9wbmd4aW9fd3JpdGVfcHRyID0gcG5nX3B0cjsKLSAgIF9wbmd4aW9fcmVhZF9wdHIgPSBOVUxMOwotICAgX3BuZ3hpb193cml0ZV9mbiA9IHdyaXRlX2RhdGFfZm47Ci0gICBwbmdfc2V0X3dyaXRlX2ZuKHBuZ19wdHIsIGlvX3B0ciwgcG5neGlvX3JlYWRfd3JpdGUsIG91dHB1dF9mbHVzaF9mbik7Ci0gICBfcG5neGlvX3dyaXRlX2lvX3N0YXRlID0gUE5HWF9JT19XUklUSU5HIHwgUE5HWF9JT19TSUdOQVRVUkU7Ci19Ci0KLS8qIFdyYXAgcG5nX3dyaXRlX3NpZy4gKi8KLXZvaWQgUE5HQVBJCi1wbmd4X3dyaXRlX3NpZyhwbmdfc3RydWN0cCBwbmdfcHRyKQotewotI2lmIFBOR19MSUJQTkdfVkVSID49IDEwNDAwCi0gICBwbmdfd3JpdGVfc2lnKHBuZ19wdHIpOwotI2Vsc2UKLSAgIC8qIHBuZ193cml0ZV9zaWcgaXMgbm90IGV4cG9ydGVkIGZyb20gdGhlIGVhcmxpZXIgbGlicG5nIHZlcnNpb25zLiAqLwotICAgc3RhdGljIHBuZ19ieXRlIHBuZ19zaWduYXR1cmVbOF0gPSB7MTM3LCA4MCwgNzgsIDcxLCAxMywgMTAsIDI2LCAxMH07Ci0gICBwbmd4aW9fcmVhZF93cml0ZShwbmdfcHRyLCBwbmdfc2lnbmF0dXJlLCA4KTsKLSAgIC8qIFRPRE86IFRha2UgcG5nX3B0ci0+c2lnX2J5dGVzIGludG8gYWNjb3VudC4gKi8KLSNlbmRpZgotfQotCi0KLSNlbmRpZiAvKiBQTkdfTElCUE5HX1ZFUiA8IDEwNDA1ICovCmRpZmYgLS1naXQgYS9zcmMvcG5neHRlcm4vcG5neG1lbS5jIGIvc3JjL3BuZ3h0ZXJuL3BuZ3htZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdhNjc2MS4uMDAwMDAwMAotLS0gYS9zcmMvcG5neHRlcm4vcG5neG1lbS5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIHBuZ3htZW0uYyAtIGxpYnBuZyBleHRlbnNpb246IG1lbW9yeSBhbGxvY2F0aW9uIHV0aWxpdGllcy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMSBDb3NtaW4gVHJ1dGEuCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2luZyBhbmQgd2FycmFudHkgdGVybXMKLSAqIGFzIGxpYnBuZy4KLSAqLwotCi0jaW5jbHVkZSAicG5neHV0aWwuaCIKLQotCi0jaWZkZWYgUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVECi0KLQotcG5nX2J5dGVwcCBQTkdBUEkKLXBuZ3hfbWFsbG9jX3Jvd3MocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgZmlsbGVyKQotewotICAgcmV0dXJuIHBuZ3hfbWFsbG9jX3Jvd3NfZXh0ZW5kZWQocG5nX3B0ciwgaW5mb19wdHIsIDAsIGZpbGxlcik7Ci19Ci0KLXBuZ19ieXRlcHAgUE5HQVBJCi1wbmd4X21hbGxvY19yb3dzX2V4dGVuZGVkKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ3hfYWxsb2Nfc2l6ZV90IG1pbl9yb3dfc2l6ZSwgaW50IGZpbGxlcikKLXsKLSAgIHBuZ3hfYWxsb2Nfc2l6ZV90IHJvd19zaXplOwotICAgcG5nX2J5dGVwIHJvdzsKLSAgIHBuZ19ieXRlcHAgcm93czsKLSAgIHBuZ191aW50XzMyIGhlaWdodCwgaTsKLQotICAgLyogQ2FsY3VsYXRlIHRoZSByb3cgc2l6ZS4gKi8KLSAgIHJvd19zaXplID0gcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICBpZiAocm93X3NpemUgPT0gMCkKLSAgICAgIHJldHVybiBOVUxMOwotICAgaWYgKHJvd19zaXplIDwgbWluX3Jvd19zaXplKQotICAgICAgcm93X3NpemUgPSBtaW5fcm93X3NpemU7Ci0KLSAgIC8qIERlYWxsb2NhdGUgdGhlIGN1cnJlbnRseS1leGlzdGluZyByb3dzLiAqLwotICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfUk9XUywgMCk7Ci0KLSAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHJvdyBpbmRleC4gKi8KLSAgIGhlaWdodCA9IHBuZ19nZXRfaW1hZ2VfaGVpZ2h0KHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgIGlmIChoZWlnaHQgPiAocG5neF9hbGxvY19zaXplX3QpKC0xKSAvIHNpemVvZihwbmdfYnl0ZXApKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkltYWdlIGhlaWdodCBpcyB0b28gbGFyZ2UiKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgfQotICAgcm93cyA9IChwbmdfYnl0ZXBwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgIChwbmd4X2FsbG9jX3NpemVfdCkoaGVpZ2h0ICogc2l6ZW9mKHBuZ19ieXRlcCkpKTsKLSAgIGlmIChyb3dzID09IE5VTEwpCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBlYWNoIHJvdy4gKi8KLSAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkKLSAgIHsKLSAgICAgIHJvdyA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLCByb3dfc2l6ZSk7Ci0gICAgICBpZiAocm93ID09IE5VTEwpICAvKiBvdXQgb2YgbWVtb3J5PyAqLwotICAgICAgewotICAgICAgICAgLyogUmVsZWFzZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCB1cCB0byB0aGUgcG9pbnQgb2YgZmFpbHVyZS4gKi8KLSAgICAgICAgIHdoaWxlIChpID4gMCkKLSAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHJvd3NbLS1pXSk7Ci0gICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCByb3dzKTsKLSAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgfQotICAgICAgaWYgKGZpbGxlciA+PSAwKQotICAgICAgICAgbWVtc2V0KHJvdywgZmlsbGVyLCByb3dfc2l6ZSk7Ci0gICAgICByb3dzW2ldID0gcm93OwotICAgfQotCi0gICAvKiBTZXQgdGhlIHJvdyBwb2ludGVycy4gKi8KLSAgIHBuZ19zZXRfcm93cyhwbmdfcHRyLCBpbmZvX3B0ciwgcm93cyk7Ci0gICByZXR1cm4gcm93czsKLX0KLQotI2lmIDAgIC8qIG5vdCBuZWNlc3NhcnkgKi8KLXZvaWQgUE5HQVBJCi1wbmd4X2ZyZWVfcm93cyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9ST1dTLCAwKTsKLX0KLSNlbmRpZgotCi0KLSNlbmRpZiAvKiBQTkdfSU5GT19JTUFHRV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wbmd4dGVybi9wbmd4cHJpdi5oIGIvc3JjL3BuZ3h0ZXJuL3BuZ3hwcml2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MGRkOTkuLjAwMDAwMDAKLS0tIGEvc3JjL3BuZ3h0ZXJuL3BuZ3hwcml2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogcG5neHByaXYuaCAtIHByaXZhdGUgaGVscGVycyBmb3IgcG5neHRlcm4uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMTEgQ29zbWluIFRydXRhLgotICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNpbmcgYW5kIHdhcnJhbnR5IHRlcm1zCi0gKiBhcyBsaWJwbmcuCi0gKi8KLQotI2lmbmRlZiBQTkdYUFJJVl9ICi0jZGVmaW5lIFBOR1hQUklWX0gKLQotLyogVGhpcyBoZWFkZXIgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgb3V0c2lkZSBwbmd4dGVybi4gKi8KLSNpZmRlZiBQTkdYX0lOVEVSTkFMCi0KLSNpbmNsdWRlICJwbmcuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWYgZGVmaW5lZChQTkdYX0RFQlVHKSAmJiAoUE5HWF9ERUJVRyA+IDApCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZGVmaW5lIFBOR1hfQVNTRVJUKGNvbmQpIGFzc2VydChjb25kKQotI2Vsc2UKLSNkZWZpbmUgUE5HWF9BU1NFUlQoY29uZCkgKCh2b2lkKTApCi0jZW5kaWYKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotLyogQk1QIHN1cHBvcnQgKi8KLWludCBwbmd4X3NpZ19pc19ibXAocG5nX2J5dGVwIHNpZywgc2l6ZV90IHNpZ19zaXplLAotICAgICAgICAgICAgICAgICAgICBwbmdfY29uc3RfY2hhcnBwIGZtdF9uYW1lX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgcG5nX2NvbnN0X2NoYXJwcCBmbXRfbG9uZ19uYW1lX3B0cik7Ci1pbnQgcG5neF9yZWFkX2JtcChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIEZJTEUgKnN0cmVhbSk7Ci0KLS8qIEdJRiBzdXBwb3J0ICovCi1pbnQgcG5neF9zaWdfaXNfZ2lmKHBuZ19ieXRlcCBzaWcsIHNpemVfdCBzaWdfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgcG5nX2NvbnN0X2NoYXJwcCBmbXRfbmFtZV9wdHIsCi0gICAgICAgICAgICAgICAgICAgIHBuZ19jb25zdF9jaGFycHAgZm10X2xvbmdfbmFtZV9wdHIpOwotaW50IHBuZ3hfcmVhZF9naWYocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBGSUxFICpzdHJlYW0pOwotCi0vKiBKUEVHIHN1cHBvcnQgKHdlbGwsIG5vdCByZWFsbHkuLi4pICovCi1pbnQgcG5neF9zaWdfaXNfanBlZyhwbmdfYnl0ZXAgc2lnLCBzaXplX3Qgc2lnX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICBwbmdfY29uc3RfY2hhcnBwIGZtdF9uYW1lX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19jb25zdF9jaGFycHAgZm10X2xvbmdfbmFtZV9wdHIpOwotaW50IHBuZ3hfcmVhZF9qcGVnKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgRklMRSAqc3RyZWFtKTsKLQotLyogUE5NIHN1cHBvcnQgKi8KLWludCBwbmd4X3NpZ19pc19wbm0ocG5nX2J5dGVwIHNpZywgc2l6ZV90IHNpZ19zaXplLAotICAgICAgICAgICAgICAgICAgICBwbmdfY29uc3RfY2hhcnBwIGZtdF9uYW1lX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgcG5nX2NvbnN0X2NoYXJwcCBmbXRfbG9uZ19uYW1lX3B0cik7Ci1pbnQgcG5neF9yZWFkX3BubShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIEZJTEUgKnN0cmVhbSk7Ci0KLS8qIFRJRkYgc3VwcG9ydCAocGFydGlhbCkgKi8KLWludCBwbmd4X3NpZ19pc190aWZmKHBuZ19ieXRlcCBzaWcsIHNpemVfdCBzaWdfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19jb25zdF9jaGFycHAgZm10X25hbWVfcHRyLAotICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbnN0X2NoYXJwcCBmbXRfbG9uZ19uYW1lX3B0cik7Ci1pbnQgcG5neF9yZWFkX3RpZmYocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBGSUxFICpzdHJlYW0pOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvKiBleHRlcm4gIkMiICovCi0jZW5kaWYKLQotCi0jZW5kaWYgLyogUE5HWF9JTlRFUk5BTCAqLwotCi0jZW5kaWYgLyogUE5HWFBSSVZfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BuZ3h0ZXJuL3BuZ3hyYm1wLmMgYi9zcmMvcG5neHRlcm4vcG5neHJibXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkxZWI2NC4uMDAwMDAwMAotLS0gYS9zcmMvcG5neHRlcm4vcG5neHJibXAuYworKysgL2Rldi9udWxsCkBAIC0xLDczNiArMCwwIEBACi0vKgotICogcG5neHJibXAuYyAtIGxpYnBuZyBleHRlcm5hbCBJL086IEJNUCByZWFkZXIuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMiBDb3NtaW4gVHJ1dGEuCi0gKgotICogVGhpcyBjb2RlIHdhcyBkZXJpdmVkIGZyb20gImJtcDJwbmcuYyIgYnkgTUlZQVNBS0EgTWFzYXJ1LCBhbmQKLSAqIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGNvcHlyaWdodCBhbmQgd2FycmFudHkgdGVybXMgYXMgbGlicG5nLgotICovCi0KLSNpbmNsdWRlICJwbmd4dGVybi5oIgotI2luY2x1ZGUgInBuZ3h1dGlsLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBQTkdYX0lOVEVSTkFMCi0jaW5jbHVkZSAicG5neHByaXYuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBCTVAgZmlsZSBoZWFkZXIgbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEJNUCBmaWxlIHNpZ25hdHVyZSAqLwotI2RlZmluZSBCTVBfU0lHTkFUVVJFICAgICAgIDB4NGQ0MiAgLyogIkJNIiAqLwotI2RlZmluZSBCTVBfU0lHX0JZVEVTICAgICAgIDIKLQotLyogQklUTUFQRklMRUhFQURFUiAqLwotI2RlZmluZSBCRkhfV1RZUEUgICAgICAgICAgIDAgICAgICAgLyogV09SRCAgIGJmVHlwZTsgICAgICAgICAgICovCi0jZGVmaW5lIEJGSF9EU0laRSAgICAgICAgICAgMiAgICAgICAvKiBEV09SRCAgYmZTaXplOyAgICAgICAgICAgKi8KLSNkZWZpbmUgQkZIX1dSRVNFUlZFRDEgICAgICA2ICAgICAgIC8qIFdPUkQgICBiZlJlc2VydmVkMTsgICAgICAqLwotI2RlZmluZSBCRkhfV1JFU0VSVkVEMiAgICAgIDggICAgICAgLyogV09SRCAgIGJmUmVzZXJ2ZWQyOyAgICAgICovCi0jZGVmaW5lIEJGSF9ET0ZGQklUUyAgICAgICAgMTAgICAgICAvKiBEV09SRCAgYmZPZmZCaXRzOyAgICAgICAgKi8KLSNkZWZpbmUgQkZIX0RCSUhTSVpFICAgICAgICAxNCAgICAgIC8qIERXT1JEICBiaVNpemU7ICAgICAgICAgICAqLwotI2RlZmluZSBGSUxFSEVEX1NJWkUgICAgICAgIDE0ICAgICAgLyogc2l6ZW9mKEJJVE1BUEZJTEVIRUFERVIpICovCi0jZGVmaW5lIEJJSFNJWkVfU0laRSAgICAgICAgNCAgICAgICAvKiBzaXplb2YoYmlTaXplKSAgICAgICAgICAgKi8KLQotLyogQklUTUFQSU5GT0hFQURFUiAqLwotI2RlZmluZSBCSUhfRFNJWkUgICAgICAgICAgIDAgICAgICAgLyogRFdPUkQgIGJpU2l6ZTsgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQklIX0xXSURUSCAgICAgICAgICA0ICAgICAgIC8qIExPTkcgICBiaVdpZHRoOyAgICAgICAgICAgICovCi0jZGVmaW5lIEJJSF9MSEVJR0hUICAgICAgICAgOCAgICAgICAvKiBMT05HICAgYmlIZWlnaHQ7ICAgICAgICAgICAqLwotI2RlZmluZSBCSUhfV1BMQU5FUyAgICAgICAgIDEyICAgICAgLyogV09SRCAgIGJpUGxhbmVzOyAgICAgICAgICAgKi8KLSNkZWZpbmUgQklIX1dCSVRDT1VOVCAgICAgICAxNCAgICAgIC8qIFdPUkQgICBiaUJpdENvdW50OyAgICAgICAgICovCi0jZGVmaW5lIEJJSF9EQ09NUFJFU1NJT04gICAgMTYgICAgICAvKiBEV09SRCAgYmlDb21wcmVzc2lvbjsgICAgICAqLwotI2RlZmluZSBCSUhfRFNJWkVJTUFHRSAgICAgIDIwICAgICAgLyogRFdPUkQgIGJpU2l6ZUltYWdlOyAgICAgICAgKi8KLSNkZWZpbmUgQklIX0xYUEVMU1BFUk1FVEVSICAyNCAgICAgIC8qIExPTkcgICBiaVhQZWxzUGVyTWV0ZXI7ICAgICovCi0jZGVmaW5lIEJJSF9MWVBFTFNQRVJNRVRFUiAgMjggICAgICAvKiBMT05HICAgYmlZUGVsc1Blck1ldGVyOyAgICAqLwotI2RlZmluZSBCSUhfRENMUlVTRUQgICAgICAgIDMyICAgICAgLyogRFdPUkQgIGJpQ2xyVXNlZDsgICAgICAgICAgKi8KLSNkZWZpbmUgQklIX0RDTFJJTVBPUlRBTlQgICAzNiAgICAgIC8qIERXT1JEICBiaUNsckltcG9ydGFudDsgICAgICovCi0jZGVmaW5lIEI0SF9EUkVETUFTSyAgICAgICAgNDAgICAgICAvKiBEV09SRCAgYlY0UmVkTWFzazsgICAgICAgICAqLwotI2RlZmluZSBCNEhfREdSRUVOTUFTSyAgICAgIDQ0ICAgICAgLyogRFdPUkQgIGJWNEdyZWVuTWFzazsgICAgICAgKi8KLSNkZWZpbmUgQjRIX0RCTFVFTUFTSyAgICAgICA0OCAgICAgIC8qIERXT1JEICBiVjRCbHVlTWFzazsgICAgICAgICovCi0jZGVmaW5lIEI0SF9EQUxQSEFNQVNLICAgICAgNTIgICAgICAvKiBEV09SRCAgYlY0QWxwaGFNYXNrOyAgICAgICAqLwotI2RlZmluZSBCNEhfRENTVFlQRSAgICAgICAgIDU2ICAgICAgLyogRFdPUkQgIGJWNENTVHlwZTsgICAgICAgICAgKi8KLSNkZWZpbmUgQjRIX1hFTkRQT0lOVFMgICAgICA2MCAgICAgIC8qIENJRVhZWlRSSVBMRSBiVjRFbmRwb2ludHM7ICovCi0jZGVmaW5lIEI0SF9ER0FNTUFSRUQgICAgICAgOTYgICAgICAvKiBEV09SRCAgYlY0R2FtbWFSZWQ7ICAgICAgICAqLwotI2RlZmluZSBCNEhfREdBTU1BR1JFRU4gICAgIDEwMCAgICAgLyogRFdPUkQgIGJWNEdhbW1hR3JlZW47ICAgICAgKi8KLSNkZWZpbmUgQjRIX0RHQU1NQUJMVUUgICAgICAxMDQgICAgIC8qIERXT1JEICBiVjRHYW1tYUJsdWU7ICAgICAgICovCi0jZGVmaW5lIEI1SF9ESU5URU5UICAgICAgICAgMTA4ICAgICAvKiBEV09SRCAgYlY1SW50ZW50OyAgICAgICAgICAqLwotI2RlZmluZSBCNUhfRFBST0ZJTEVEQVRBICAgIDExMiAgICAgLyogRFdPUkQgIGJWNVByb2ZpbGVEYXRhOyAgICAgKi8KLSNkZWZpbmUgQjVIX0RQUk9GSUxFU0laRSAgICAxMTYgICAgIC8qIERXT1JEICBiVjVQcm9maWxlU2l6ZTsgICAgICovCi0jZGVmaW5lIEI1SF9EUkVTRVJWRUQgICAgICAgMTIwICAgICAvKiBEV09SRCAgYlY1UmVzZXJ2ZWQ7ICAgICAgICAqLwotI2RlZmluZSBJTkZPSEVEX1NJWkUgICAgICAgIDQwICAgICAgLyogc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICAgKi8KLSNkZWZpbmUgQk1QVjRIRURfU0laRSAgICAgICAxMDggICAgIC8qIHNpemVvZihCSVRNQVBWNEhFQURFUikgICAgICovCi0jZGVmaW5lIEJNUFY1SEVEX1NJWkUgICAgICAgMTI0ICAgICAvKiBzaXplb2YoQklUTUFQVjVIRUFERVIpICAgICAqLwotCi0vKiBCSVRNQVBDT1JFSEVBREVSICovCi0jZGVmaW5lIEJDSF9EU0laRSAgICAgICAgICAgMCAgICAgICAvKiBEV09SRCAgYmNTaXplOyAgICAgICAgICAgKi8KLSNkZWZpbmUgQkNIX1dXSURUSCAgICAgICAgICA0ICAgICAgIC8qIFdPUkQgICBiY1dpZHRoOyAgICAgICAgICAqLwotI2RlZmluZSBCQ0hfV0hFSUdIVCAgICAgICAgIDYgICAgICAgLyogV09SRCAgIGJjSGVpZ2h0OyAgICAgICAgICovCi0jZGVmaW5lIEJDSF9XUExBTkVTICAgICAgICAgOCAgICAgICAvKiBXT1JEICAgYmNQbGFuZXM7ICAgICAgICAgKi8KLSNkZWZpbmUgQkNIX1dCSVRDT1VOVCAgICAgICAxMCAgICAgIC8qIFdPUkQgICBiY0JpdENvdW50OyAgICAgICAqLwotI2RlZmluZSBDT1JFSEVEX1NJWkUgICAgICAgIDEyICAgICAgLyogc2l6ZW9mKEJJVE1BUENPUkVIRUFERVIpICovCi0KLS8qIFJHQiAqLwotI2RlZmluZSBSR0JfQkxVRSAgICAgICAgICAgIDAgICAgICAgLyogQllURSAgIHJnYkJsdWU7ICAgICAqLwotI2RlZmluZSBSR0JfR1JFRU4gICAgICAgICAgIDEgICAgICAgLyogQllURSAgIHJnYkdyZWVuOyAgICAqLwotI2RlZmluZSBSR0JfUkVEICAgICAgICAgICAgIDIgICAgICAgLyogQllURSAgIHJnYlJlZDsgICAgICAqLwotI2RlZmluZSBSR0JfUkVTRVJWRUQgICAgICAgIDMgICAgICAgLyogQllURSAgIHJnYlJlc2VydmVkOyAqLwotI2RlZmluZSBSR0JUUklQTEVfU0laRSAgICAgIDMgICAgICAgLyogc2l6ZW9mKFJHQlRSSVBMRSkgICAqLwotI2RlZmluZSBSR0JRVUFEX1NJWkUgICAgICAgIDQgICAgICAgLyogc2l6ZW9mKFJHQlFVQUQpICAgICAqLwotCi0vKiBDb25zdGFudHMgZm9yIHRoZSBiaUNvbXByZXNzaW9uIGZpZWxkICovCi0jaWZuZGVmIEJJX1JHQgotI2RlZmluZSBCSV9SR0IgICAgICAgICAgICAgIDAgICAgICAgLyogVW5jb21wcmVzc2VkIGZvcm1hdCAgICAgICAqLwotI2RlZmluZSBCSV9STEU4ICAgICAgICAgICAgIDEgICAgICAgLyogUkxFIGZvcm1hdCAoOCBiaXRzL3BpeGVsKSAqLwotI2RlZmluZSBCSV9STEU0ICAgICAgICAgICAgIDIgICAgICAgLyogUkxFIGZvcm1hdCAoNCBiaXRzL3BpeGVsKSAqLwotI2RlZmluZSBCSV9CSVRGSUVMRFMgICAgICAgIDMgICAgICAgLyogQml0ZmllbGQgZm9ybWF0ICAgICAgICAgICAqLwotI2RlZmluZSBCSV9KUEVHICAgICAgICAgICAgIDQgICAgICAgLyogSlBFRyBmb3JtYXQgICAgICAgICAgICAgICAqLwotI2RlZmluZSBCSV9QTkcgICAgICAgICAgICAgIDUgICAgICAgLyogUE5HIGZvcm1hdCAgICAgICAgICAgICAgICAqLwotI2VuZGlmCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQk1QIG1lbW9yeSB1dGlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1ibXBfZ2V0X3dvcmQocG5nX2J5dGVwIHB0cikKLXsKLSAgIHJldHVybiAodW5zaWduZWQgaW50KXB0clswXSArICgodW5zaWduZWQgaW50KXB0clsxXSA8PCA4KTsKLX0KLQotc3RhdGljIHBuZ191aW50XzMyCi1ibXBfZ2V0X2R3b3JkKHBuZ19ieXRlcCBwdHIpCi17Ci0gICByZXR1cm4gKChwbmdfdWludF8zMilwdHJbMF0pICAgICAgICsgKChwbmdfdWludF8zMilwdHJbMV0gPDwgOCkgKwotICAgICAgICAgICgocG5nX3VpbnRfMzIpcHRyWzJdIDw8IDE2KSArICgocG5nX3VpbnRfMzIpcHRyWzNdIDw8IDI0KTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBCTVAgUkxFIGhlbHBlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1ibXBfcmxlOF9tZW1zZXQocG5nX2J5dGVwIHB0ciwgc2l6ZV90IG9mZnNldCwgaW50IGNoLCBzaXplX3QgbGVuKQotewotICAgbWVtc2V0KHB0ciArIG9mZnNldCwgY2gsIGxlbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ibXBfcmxlNF9tZW1zZXQocG5nX2J5dGVwIHB0ciwgc2l6ZV90IG9mZnNldCwgaW50IGNoLCBzaXplX3QgbGVuKQotewotICAgaWYgKGxlbiA9PSAwKQotICAgICAgcmV0dXJuOwotICAgcHRyICs9IG9mZnNldCAvIDI7Ci0gICBpZiAob2Zmc2V0ICYgMSkgIC8qIHVzZSBoYWxmLWJ5dGUgb3BlcmF0aW9ucyBhdCBvZGQgb2Zmc2V0ICovCi0gICB7Ci0gICAgICAqcHRyID0gKHBuZ19ieXRlKSgoKnB0ciAmIDB4ZjApIHwgKGNoICYgMHgwZikpOwotICAgICAgY2ggPSAoKGNoICYgMHhmMCkgPj4gNCkgfCAoKGNoICYgMHgwZikgPDwgNCk7Ci0gICAgICArK3B0cjsKLSAgICAgIC0tbGVuOwotICAgfQotICAgbWVtc2V0KHB0ciwgY2gsIGxlbiAvIDIpOwotICAgaWYgKGxlbiAmIDEpCi0gICAgICBwdHJbbGVuIC8gMl0gPSAocG5nX2J5dGUpKGNoICYgMHhmMCk7Ci19Ci0KLXN0YXRpYyBzaXplX3QKLWJtcF9ybGU4X2ZyZWFkKHBuZ19ieXRlcCBwdHIsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW4sIEZJTEUgKnN0cmVhbSkKLXsKLSAgIHNpemVfdCByZXN1bHQ7Ci0KLSAgIHJlc3VsdCA9IGZyZWFkKHB0ciArIG9mZnNldCwgMSwgbGVuLCBzdHJlYW0pOwotICAgaWYgKGxlbiAmIDEpCi0gICAgICBnZXRjKHN0cmVhbSk7ICAvKiBza2lwIHBhZGRpbmcgKi8KLSAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBzaXplX3QKLWJtcF9ybGU0X2ZyZWFkKHBuZ19ieXRlcCBwdHIsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW4sIEZJTEUgKnN0cmVhbSkKLXsKLSAgIHNpemVfdCByZXN1bHQ7Ci0gICBpbnQgY2g7Ci0KLSAgIHB0ciArPSBvZmZzZXQgLyAyOwotICAgaWYgKG9mZnNldCAmIDEpICAvKiB1c2UgaGFsZi1ieXRlIG9wZXJhdGlvbnMgYXQgb2RkIG9mZnNldCAqLwotICAgewotICAgICAgZm9yIChyZXN1bHQgPSAwOyByZXN1bHQgPCBsZW47IHJlc3VsdCArPSAyKQotICAgICAgewotICAgICAgICAgY2ggPSBnZXRjKHN0cmVhbSk7Ci0gICAgICAgICBpZiAoY2ggPT0gRU9GKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAqcHRyID0gKHBuZ19ieXRlKSgoKnB0ciAmIDB4ZjApIHwgKChjaCAmIDB4ZjApID4+IDQpKTsKLSAgICAgICAgICsrcHRyOwotICAgICAgICAgKnB0ciA9IChwbmdfYnl0ZSkoKGNoICYgMHgwZikgPDwgNCk7Ci0gICAgICB9Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICByZXN1bHQgPSBmcmVhZChwdHIsIDEsIChsZW4gKyAxKSAvIDIsIHN0cmVhbSkgKiAyOwotICAgfQotICAgaWYgKGxlbiAmIDIpCi0gICAgICBnZXRjKHN0cmVhbSk7ICAvKiBza2lwIHBhZGRpbmcgKi8KLSAgIHJldHVybiAocmVzdWx0IDw9IGxlbikgPyByZXN1bHQgOiBsZW47Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQk1QIHBhY2tiaXQgKEJJVEZJRUxEUykgaGVscGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotYm1wX3Byb2Nlc3NfbWFzayhwbmdfdWludF8zMiBibXBfbWFzaywgcG5nX2J5dGVwIHNpZ19iaXQsIHBuZ19ieXRlcCBzaGlmdF9iaXQpCi17Ci0gICAqc2lnX2JpdCA9ICpzaGlmdF9iaXQgPSAocG5nX2J5dGUpMDsKLSAgIGlmIChibXBfbWFzayA9PSAwKQotICAgICAgcmV0dXJuOwotICAgd2hpbGUgKChibXBfbWFzayAmIDEpID09IDApCi0gICB7Ci0gICAgICBibXBfbWFzayA+Pj0gMTsKLSAgICAgICsrKnNoaWZ0X2JpdDsKLSAgIH0KLSAgIHdoaWxlIChibXBfbWFzayAhPSAwKQotICAgewotICAgICAgaWYgKChibXBfbWFzayAmIDEpID09IDAgfHwgKnNpZ19iaXQgPj0gOCkKLSAgICAgIHsKLSAgICAgICAgICpzaWdfYml0ID0gKHBuZ19ieXRlKTA7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBibXBfbWFzayA+Pj0gMTsKLSAgICAgICsrKnNpZ19iaXQ7Ci0gICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQk1QIEkvTyB1dGlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgc2l6ZV90Ci1ibXBfcmVhZF9yb3dzKHBuZ19ieXRlcHAgYmVnaW5fcm93LCBwbmdfYnl0ZXBwIGVuZF9yb3csIHNpemVfdCByb3dfc2l6ZSwKLSAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvbXByZXNzaW9uLCBGSUxFICpzdHJlYW0pCi17Ci0gICBzaXplX3QgcmVzdWx0OwotICAgcG5nX2J5dGVwcCBjcnRfcm93OwotICAgaW50IGluYzsKLSAgIHNpemVfdCBjcnRuLCBkY3J0biwgZW5kbjsKLSAgIHVuc2lnbmVkIGludCBsZW4sIGIxLCBiMjsKLSAgIGludCBjaDsKLSAgIHZvaWQgKCpibXBfbWVtc2V0X2ZuKShwbmdfYnl0ZXAsIHNpemVfdCwgaW50LCBzaXplX3QpOwotICAgc2l6ZV90ICgqYm1wX2ZyZWFkX2ZuKShwbmdfYnl0ZXAsIHNpemVfdCwgc2l6ZV90LCBGSUxFICopOwotCi0gICBpZiAocm93X3NpemUgPT0gMCkKLSAgICAgIHJldHVybiAwOyAgLyogdGhpcyBzaG91bGQgbm90IGhhcHBlbiAqLwotCi0gICBpbmMgPSAoYmVnaW5fcm93IDw9IGVuZF9yb3cpID8gMSA6IC0xOwotICAgY3J0biA9IDA7Ci0gICByZXN1bHQgPSAwOwotICAgaWYgKGNvbXByZXNzaW9uID09IEJJX1JMRTQpCi0gICB7Ci0gICAgICBlbmRuID0gcm93X3NpemUgKiAyOwotICAgICAgaWYgKGVuZG4gPD0gcm93X3NpemUpCi0gICAgICAgICByZXR1cm4gMDsgIC8qIG92ZXJmbG93ICovCi0gICAgICBibXBfbWVtc2V0X2ZuID0gYm1wX3JsZTRfbWVtc2V0OwotICAgICAgYm1wX2ZyZWFkX2ZuID0gYm1wX3JsZTRfZnJlYWQ7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICBlbmRuID0gcm93X3NpemU7Ci0gICAgICBibXBfbWVtc2V0X2ZuID0gYm1wX3JsZThfbWVtc2V0OwotICAgICAgYm1wX2ZyZWFkX2ZuID0gYm1wX3JsZThfZnJlYWQ7Ci0gICB9Ci0KLSAgIGlmIChjb21wcmVzc2lvbiA9PSBCSV9SR0IgfHwgY29tcHJlc3Npb24gPT0gQklfQklURklFTERTKQotICAgewotICAgICAgLyogUmVhZCB1bmNvbXByZXNzZWQgYml0bWFwLiAqLwotICAgICAgZm9yIChjcnRfcm93ID0gYmVnaW5fcm93OyBjcnRfcm93ICE9IGVuZF9yb3c7IGNydF9yb3cgKz0gaW5jKQotICAgICAgewotICAgICAgICAgY3J0biA9IGJtcF9mcmVhZF9mbigqY3J0X3JvdywgMCwgZW5kbiwgc3RyZWFtKTsKLSAgICAgICAgIGlmIChjcnRuICE9IGVuZG4pCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICsrcmVzdWx0OwotICAgICAgfQotICAgfQotICAgZWxzZSBpZiAoY29tcHJlc3Npb24gPT0gQklfUkxFOCB8fCBjb21wcmVzc2lvbiA9PSBCSV9STEU0KQotICAgewotICAgICAgLyogUmVhZCBSTEUtY29tcHJlc3NlZCBiaXRtYXAuICovCi0gICAgICBpZiAoY29tcHJlc3Npb24gPT0gQklfUkxFOCkKLSAgICAgIHsKLSAgICAgICAgIGVuZG4gPSByb3dfc2l6ZTsKLSAgICAgICAgIGJtcF9tZW1zZXRfZm4gPSBibXBfcmxlOF9tZW1zZXQ7Ci0gICAgICAgICBibXBfZnJlYWRfZm4gPSBibXBfcmxlOF9mcmVhZDsKLSAgICAgIH0KLSAgICAgIGVsc2UgLyogQklfUkxFNCAqLwotICAgICAgewotICAgICAgICAgZW5kbiA9IHJvd19zaXplICogMjsKLSAgICAgICAgIGlmIChlbmRuIDw9IHJvd19zaXplKQotICAgICAgICAgICAgcmV0dXJuIDA7ICAvKiBvdmVyZmxvdyAqLwotICAgICAgICAgYm1wX21lbXNldF9mbiA9IGJtcF9ybGU0X21lbXNldDsKLSAgICAgICAgIGJtcF9mcmVhZF9mbiA9IGJtcF9ybGU0X2ZyZWFkOwotICAgICAgfQotICAgICAgY3J0X3JvdyA9IGJlZ2luX3JvdzsKLSAgICAgIGZvciAoIDsgOyApCi0gICAgICB7Ci0gICAgICAgICBjaCA9IGdldGMoc3RyZWFtKTsgYjEgPSAodW5zaWduZWQgaW50KWNoOwotICAgICAgICAgY2ggPSBnZXRjKHN0cmVhbSk7IGIyID0gKHVuc2lnbmVkIGludCljaDsKLSAgICAgICAgIGlmIChjaCA9PSBFT0YpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGlmIChiMSA9PSAwKSAgLyogZXNjYXBlICovCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYjIgPT0gMCkgIC8qIGVuZCBvZiBsaW5lICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBibXBfbWVtc2V0X2ZuKCpjcnRfcm93LCBjcnRuLCAwLCBlbmRuIC0gY3J0bik7Ci0gICAgICAgICAgICAgICBjcnRfcm93ICs9IGluYzsKLSAgICAgICAgICAgICAgIGNydG4gPSAwOwotICAgICAgICAgICAgICAgKytyZXN1bHQ7Ci0gICAgICAgICAgICAgICBpZiAoY3J0X3JvdyA9PSBlbmRfcm93KSAgLyogYWxsIHJvd3MgYXJlIHJlYWQgKi8KLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGNoID0gZ2V0YyhzdHJlYW0pOyAgLyogY2hlY2sgZm9yIHRoZSBlbmQgb2YgYml0bWFwICovCi0gICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gRU9GICYmIGNoICE9IDApCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICB1bmdldGMoY2gsIHN0cmVhbSk7ICAvKiBmb3JnZXQgYWJvdXQgdGhlIGVuZCBvZiBiaXRtYXAgKi8KLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZ2V0YyhzdHJlYW0pOyAgLyogZXhwZWN0IDEsIGJ1dCBicmVhayB0aGUgbG9vcCBhbnl3YXkgKi8KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYjIgPT0gMSkgIC8qIGVuZCBvZiBiaXRtYXAgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGJtcF9tZW1zZXRfZm4oKmNydF9yb3csIGNydG4sIDAsIGVuZG4gLSBjcnRuKTsKLSAgICAgICAgICAgICAgIGNydF9yb3cgKz0gaW5jOwotICAgICAgICAgICAgICAgcmVzdWx0ID0gKGJlZ2luX3JvdyA8PSBlbmRfcm93KSA/Ci0gICAgICAgICAgICAgICAgICAoZW5kX3JvdyAtIGJlZ2luX3JvdykgOiAoYmVnaW5fcm93IC0gZW5kX3Jvdyk7Ci0gICAgICAgICAgICAgICBicmVhazsgIC8qIHRoZSByZXN0IGlzIHdpcGVkIG91dCBhdCB0aGUgZW5kICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChiMiA9PSAyKSAgLyogZGVsdGEgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNoID0gZ2V0YyhzdHJlYW0pOyBiMSA9ICh1bnNpZ25lZCBpbnQpY2g7ICAvKiBob3Jpei4gb2Zmc2V0ICovCi0gICAgICAgICAgICAgICBjaCA9IGdldGMoc3RyZWFtKTsgYjIgPSAodW5zaWduZWQgaW50KWNoOyAgLyogdmVydC4gb2Zmc2V0ICovCi0gICAgICAgICAgICAgICBpZiAoY2ggPT0gRU9GKQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkY3J0biA9IChiMSA8IGVuZG4gLSBjcnRuKSA/IChjcnRuICsgYjEpIDogZW5kbjsKLSAgICAgICAgICAgICAgIGlmIChiMiA+IChzaXplX3QpKChlbmRfcm93IC0gY3J0X3JvdykgKiBpbmMpKQotICAgICAgICAgICAgICAgICAgYjIgPSAodW5zaWduZWQgaW50KSgoZW5kX3JvdyAtIGNydF9yb3cpICogaW5jKTsKLSAgICAgICAgICAgICAgIGZvciAoIDsgYjIgPiAwOyAtLWIyKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYm1wX21lbXNldF9mbigqY3J0X3JvdywgY3J0biwgMCwgZW5kbiAtIGNydG4pOwotICAgICAgICAgICAgICAgICAgY3J0X3JvdyArPSBpbmM7Ci0gICAgICAgICAgICAgICAgICBjcnRuID0gMDsKLSAgICAgICAgICAgICAgICAgICsrcmVzdWx0OwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgYm1wX21lbXNldF9mbigqY3J0X3JvdywgY3J0biwgMCwgZGNydG4gLSBjcnRuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgIC8qIGIyID49IDMgYnl0ZXMgaW4gYWJzb2x1dGUgbW9kZSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgbGVuID0gKGIyIDw9IGVuZG4gLSBjcnRuKSA/IGIyIDogKHVuc2lnbmVkIGludCkoZW5kbiAtIGNydG4pOwotICAgICAgICAgICAgICAgaWYgKGJtcF9mcmVhZF9mbigqY3J0X3JvdywgY3J0biwgbGVuLCBzdHJlYW0pICE9IGxlbikKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY3J0biArPSBsZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlICAvKiBiMSA+IDAgYnl0ZXMgaW4gcnVuLWxlbmd0aCBlbmNvZGVkIG1vZGUgKi8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIGxlbiA9IChiMSA8PSBlbmRuIC0gY3J0bikgPyBiMSA6ICh1bnNpZ25lZCBpbnQpKGVuZG4gLSBjcnRuKTsKLSAgICAgICAgICAgIGJtcF9tZW1zZXRfZm4oKmNydF9yb3csIGNydG4sIChpbnQpYjIsIGxlbik7Ci0gICAgICAgICAgICBjcnRuICs9IGxlbjsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLSAgIGVsc2UKLSAgICAgIHJldHVybiAwOyAgLyogZXJyb3I6IGNvbXByZXNzaW9uIG1ldGhvZCBub3QgYXBwbGljYWJsZS4gKi8KLQotICAgLyogV2lwZSBvdXQgdGhlIHBvcnRpb24gbGVmdCB1bnJlYWQuICovCi0gICBmb3IgKCA7IGNydF9yb3cgIT0gZW5kX3JvdzsgY3J0X3JvdyArPSBpbmMpCi0gICB7Ci0gICAgICBibXBfbWVtc2V0X2ZuKCpjcnRfcm93LCBjcnRuLCAwLCBlbmRuIC0gY3J0bik7Ci0gICAgICBjcnRuID0gMDsKLSAgIH0KLQotICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBCTVAtdG8tUE5HIHNhbXBsZSBjb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1ibXBfdG9fcG5nX3Jvd3MocG5nX2J5dGVwcCByb3dfcG9pbnRlcnMsCi0gICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgd2lkdGgsIHBuZ191aW50XzMyIGhlaWdodCwgdW5zaWduZWQgaW50IHBpeGRlcHRoLAotICAgICAgICAgICAgICAgIHBuZ19ieXRlcCByZ2JhX3NpZywgcG5nX2J5dGVwIHJnYmFfc2hpZnQpCi17Ci0gICBwbmdfYnl0ZXAgc3JjX3B0ciwgZGVzdF9wdHI7Ci0gICB1bnNpZ25lZCBpbnQgcmdiYV9tYXNrWzRdOwotICAgdW5zaWduZWQgaW50IG51bV9zYW1wbGVzLCBzYW1wbGUsIG1hc2s7Ci0gICB1bnNpZ25lZCBpbnQgd3BpeDsKLSAgIHBuZ191aW50XzMyIGR3cGl4OwotICAgcG5nX3VpbnRfMzIgeCwgeTsKLSAgIHVuc2lnbmVkIGludCBpOwotCi0gICBpZiAocGl4ZGVwdGggPT0gMjQpICAvKiBCR1IgLT4gUkdCICovCi0gICB7Ci0gICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpCi0gICAgICB7Ci0gICAgICAgICBzcmNfcHRyID0gcm93X3BvaW50ZXJzW3ldOwotICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gsIHNyY19wdHIgKz0gMykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlIHRtcCA9IHNyY19wdHJbMF07Ci0gICAgICAgICAgICBzcmNfcHRyWzBdID0gc3JjX3B0clsyXTsKLSAgICAgICAgICAgIHNyY19wdHJbMl0gPSB0bXA7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIG51bV9zYW1wbGVzID0gKHJnYmFfc2lnWzNdICE9IDApID8gNCA6IDM7Ci0gICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NhbXBsZXM7ICsraSkKLSAgICAgIHJnYmFfbWFza1tpXSA9ICgxVSA8PCByZ2JhX3NpZ1tpXSkgLSAxOwotCi0gICBpZiAocGl4ZGVwdGggPT0gMTYpCi0gICB7Ci0gICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpCi0gICAgICB7Ci0gICAgICAgICBzcmNfcHRyID0gcm93X3BvaW50ZXJzW3ldICsgKHdpZHRoIC0gMSkgKiAyOwotICAgICAgICAgZGVzdF9wdHIgPSByb3dfcG9pbnRlcnNbeV0gKyAod2lkdGggLSAxKSAqIG51bV9zYW1wbGVzOwotICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gsIHNyY19wdHIgLT0gMiwgZGVzdF9wdHIgLT0gbnVtX3NhbXBsZXMpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJbmxpbmUgYm1wX2dldF93b3JkKCkgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuICovCi0gICAgICAgICAgICB3cGl4ID0gKHVuc2lnbmVkIGludClzcmNfcHRyWzBdICsgKCh1bnNpZ25lZCBpbnQpc3JjX3B0clsxXSA8PCA4KTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc2FtcGxlczsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgbWFzayA9IHJnYmFfbWFza1tpXTsKLSAgICAgICAgICAgICAgIHNhbXBsZSA9ICh3cGl4ID4+IHJnYmFfc2hpZnRbaV0pICYgbWFzazsKLSAgICAgICAgICAgICAgIGRlc3RfcHRyW2ldID0gKHBuZ19ieXRlKSgoc2FtcGxlICogMjU1ICsgbWFzayAvIDIpIC8gbWFzayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0gICBlbHNlIGlmIChwaXhkZXB0aCA9PSAzMikKLSAgIHsKLSAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkKLSAgICAgIHsKLSAgICAgICAgIHNyY19wdHIgPSBkZXN0X3B0ciA9IHJvd19wb2ludGVyc1t5XTsKLSAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4LCBzcmNfcHRyICs9IDQsIGRlc3RfcHRyICs9IG51bV9zYW1wbGVzKQotICAgICAgICAgewotICAgICAgICAgICAgLyogSW5saW5lIGJtcF9nZXRfZHdvcmQoKSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gKi8KLSAgICAgICAgICAgIGR3cGl4ID0gKHBuZ191aW50XzMyKXNyY19wdHJbMF0gKyAoKHBuZ191aW50XzMyKXNyY19wdHJbMV0gPDwgOCkgKwotICAgICAgICAgICAgKChwbmdfdWludF8zMilzcmNfcHRyWzJdIDw8IDE2KSArICgocG5nX3VpbnRfMzIpc3JjX3B0clszXSA8PCAyNCk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NhbXBsZXM7ICsraSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIG1hc2sgPSByZ2JhX21hc2tbaV07Ci0gICAgICAgICAgICAgICBzYW1wbGUgPSAoZHdwaXggPj4gcmdiYV9zaGlmdFtpXSkgJiBtYXNrOwotICAgICAgICAgICAgICAgZGVzdF9wdHJbaV0gPSAocG5nX2J5dGUpKChzYW1wbGUgKiAyNTUgKyBtYXNrIC8gMikgLyBtYXNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLSAgIC8qIGVsc2UgZG8gbm90aGluZyAqLwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEJNUCByZWFkIHN1cHBvcnQgZm9yIHBuZ3h0ZXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW50IC8qIFBSSVZBVEUgKi8KLXBuZ3hfc2lnX2lzX2JtcChwbmdfYnl0ZXAgc2lnLCBzaXplX3Qgc2lnX3NpemUsCi0gICAgICAgICAgICAgICAgcG5nX2NvbnN0X2NoYXJwcCBmbXRfbmFtZV9wdHIsCi0gICAgICAgICAgICAgICAgcG5nX2NvbnN0X2NoYXJwcCBmbXRfbG9uZ19uYW1lX3B0cikKLXsKLSAgIHN0YXRpYyBjb25zdCBjaGFyIGJtcF9mbXRfbmFtZVtdID0gIkJNUCI7Ci0gICBzdGF0aWMgY29uc3QgY2hhciBvczJibXBfZm10X2xvbmdfbmFtZVtdID0gIk9TLzIgQml0bWFwIjsKLSAgIHN0YXRpYyBjb25zdCBjaGFyIHdpbmJtcF9mbXRfbG9uZ19uYW1lW10gPSAiV2luZG93cyBCaXRtYXAiOwotICAgcG5nX3VpbnRfMzIgYmloc2l6ZTsKLQotICAgLyogUmVxdWlyZSBhdCBsZWFzdCB0aGUgYml0bWFwIGZpbGUgaGVhZGVyIGFuZCB0aGUgc3Vic2VxdWVudCA0IGJ5dGVzLiAqLwotICAgaWYgKHNpZ19zaXplIDwgRklMRUhFRF9TSVpFICsgNCkKLSAgICAgIHJldHVybiAtMTsgIC8qIGluc3VmZmljaWVudCBkYXRhICovCi0gICBpZiAoYm1wX2dldF93b3JkKHNpZykgIT0gQk1QX1NJR05BVFVSRSkKLSAgICAgIHJldHVybiAwOyAgLyogbm90IEJNUCAqLwotICAgLyogQXZvaWQgdXNpbmcgYmZoc2l6ZSBiZWNhdXNlIGl0IGlzIG5vdCByZWxpYWJsZS4gKi8KLSAgIGJpaHNpemUgPSBibXBfZ2V0X2R3b3JkKHNpZyArIEZJTEVIRURfU0laRSk7Ci0gICBpZiAoKGJpaHNpemUgPiBQTkdfVUlOVF8zMV9NQVgpIHx8Ci0gICAgICAgKGJpaHNpemUgIT0gQ09SRUhFRF9TSVpFICYmIGJpaHNpemUgPCBJTkZPSEVEX1NJWkUpKQotICAgICAgcmV0dXJuIDA7ICAvKiBnYXJiYWdlIGluIGJpaHNpemUsIHRoaXMgY2Fubm90IGJlIEJNUCAqLwotCi0gICAvKiBTdG9yZSB0aGUgZm9ybWF0IG5hbWUuICovCi0gICBpZiAoZm10X25hbWVfcHRyICE9IE5VTEwpCi0gICAgICAqZm10X25hbWVfcHRyID0gYm1wX2ZtdF9uYW1lOwotICAgaWYgKGZtdF9sb25nX25hbWVfcHRyICE9IE5VTEwpCi0gICB7Ci0gICAgICBpZiAoYmloc2l6ZSA9PSBDT1JFSEVEX1NJWkUpCi0gICAgICAgICAqZm10X2xvbmdfbmFtZV9wdHIgPSBvczJibXBfZm10X2xvbmdfbmFtZTsKLSAgICAgIGVsc2UKLSAgICAgICAgICpmbXRfbG9uZ19uYW1lX3B0ciA9IHdpbmJtcF9mbXRfbG9uZ19uYW1lOwotICAgfQotICAgcmV0dXJuIDE7ICAvKiBCTVAgKi8KLX0KLQotaW50IC8qIFBSSVZBVEUgKi8KLXBuZ3hfcmVhZF9ibXAocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBGSUxFICpzdHJlYW0pCi17Ci0gICBwbmdfYnl0ZSBiZmhbRklMRUhFRF9TSVpFICsgQk1QVjVIRURfU0laRV07Ci0gICBwbmdfYnl0ZXAgY29uc3QgYmloID0gYmZoICsgRklMRUhFRF9TSVpFOwotICAgcG5nX2J5dGUgcmdicVtSR0JRVUFEX1NJWkVdOwotICAgcG5nX3VpbnRfMzIgb2ZmYml0cywgYmloc2l6ZSwgc2tpcDsKLSAgIHBuZ191aW50XzMyIHdpZHRoLCBoZWlnaHQsIHJvd3NpemU7Ci0gICBpbnQgdG9wZG93bjsKLSAgIHVuc2lnbmVkIGludCBwaXhkZXB0aDsKLSAgIHBuZ191aW50XzMyIGNvbXByZXNzaW9uOwotICAgdW5zaWduZWQgaW50IHBhbHNpemUsIHBhbG51bTsKLSAgIHBuZ191aW50XzMyIHJnYmFfbWFza1s0XTsKLSAgIHBuZ19ieXRlIHJnYmFfc2lnWzRdLCByZ2JhX3NoaWZ0WzRdOwotICAgaW50IGJpdF9kZXB0aCwgY29sb3JfdHlwZTsKLSAgIHBuZ19jb2xvciBwYWxldHRlWzI1Nl07Ci0gICBwbmdfY29sb3JfOCBzaWdfYml0OwotICAgcG5nX2J5dGVwcCByb3dfcG9pbnRlcnMsIGJlZ2luX3JvdywgZW5kX3JvdzsKLSAgIHVuc2lnbmVkIGludCBpOwotICAgc2l6ZV90IHk7Ci0KLSAgIC8qIEZpbmQgdGhlIEJNUCBoZWFkZXIuICovCi0gICBmb3IgKGkgPSAwOyA7ICsraSkgIC8qIHNraXAgbWFjYmluYXJ5IGhlYWRlciAqLwotICAgewotICAgICAgaWYgKGZyZWFkKGJmaCwgRklMRUhFRF9TSVpFICsgQklIU0laRV9TSVpFLCAxLCBzdHJlYW0pICE9IDEpCi0gICAgICAgICArK2k7Ci0gICAgICBlbHNlIGlmIChibXBfZ2V0X3dvcmQoYmZoICsgQkZIX1dUWVBFKSA9PSBCTVBfU0lHTkFUVVJFKQotICAgICAgICAgYnJlYWs7Ci0gICAgICBpZiAoZnJlYWQoYmZoLCAxMjggLSBGSUxFSEVEX1NJWkUgLSBCSUhTSVpFX1NJWkUsIDEsIHN0cmVhbSkgIT0gMSkKLSAgICAgICAgICsraTsKLSAgICAgIGlmIChpID4gMCkKLSAgICAgICAgIHJldHVybiAwOyAgLyogbm90IGEgQk1QIGZpbGUgKi8KLSAgIH0KLQotICAgLyogUmVhZCB0aGUgQk1QIGhlYWRlci4gKi8KLSAgIG9mZmJpdHMgPSBibXBfZ2V0X2R3b3JkKGJmaCArIEJGSF9ET0ZGQklUUyk7Ci0gICBiaWhzaXplID0gYm1wX2dldF9kd29yZChiZmggKyBCRkhfREJJSFNJWkUpOwotICAgaWYgKChvZmZiaXRzID4gUE5HX1VJTlRfMzFfTUFYKSB8fCAoYmloc2l6ZSA+IFBOR19VSU5UXzMxX01BWCkgfHwKLSAgICAgICAob2ZmYml0cyA8IGJpaHNpemUgKyBGSUxFSEVEX1NJWkUpIHx8Ci0gICAgICAgKGJpaHNpemUgIT0gQ09SRUhFRF9TSVpFICYmIGJpaHNpemUgPCBJTkZPSEVEX1NJWkUpKQotICAgICAgcmV0dXJuIDA7ICAvKiBub3QgYSBCTVAgZmlsZSwganVzdCBhIGZpbGUgd2l0aCBhIG1hdGNoaW5nIHNpZ25hdHVyZSAqLwotICAgaWYgKGJpaHNpemUgPiBCTVBWNUhFRF9TSVpFKQotICAgewotICAgICAgc2tpcCA9IGJpaHNpemUgLSBCTVBWNUhFRF9TSVpFOwotICAgICAgYmloc2l6ZSA9IEJNUFY1SEVEX1NJWkU7Ci0gICB9Ci0gICBlbHNlCi0gICAgICBza2lwID0gMDsKLSAgIGlmIChmcmVhZChiaWggKyBCSUhTSVpFX1NJWkUsIGJpaHNpemUgLSBCSUhTSVpFX1NJWkUsIDEsIHN0cmVhbSkgIT0gMSkKLSAgICAgIHJldHVybiAwOwotICAgaWYgKHNraXAgPiAwKQotICAgICAgaWYgKGZzZWVrKHN0cmVhbSwgKGxvbmcpc2tpcCwgU0VFS19DVVIpICE9IDApCi0gICAgICAgICByZXR1cm4gMDsKLSAgIHNraXAgPSBvZmZiaXRzIC0gYmloc2l6ZSAtIEZJTEVIRURfU0laRTsgIC8qIG5ldyBza2lwICovCi0gICB0b3Bkb3duID0gMDsKLSAgIGlmIChiaWhzaXplIDwgSU5GT0hFRF9TSVpFKSAgLyogT1MvMiBCTVAgKi8KLSAgIHsKLSAgICAgIHdpZHRoICAgICAgID0gYm1wX2dldF93b3JkKGJpaCArIEJDSF9XV0lEVEgpOwotICAgICAgaGVpZ2h0ICAgICAgPSBibXBfZ2V0X3dvcmQoYmloICsgQkNIX1dIRUlHSFQpOwotICAgICAgcGl4ZGVwdGggICAgPSBibXBfZ2V0X3dvcmQoYmloICsgQkNIX1dCSVRDT1VOVCk7Ci0gICAgICBjb21wcmVzc2lvbiA9IEJJX1JHQjsKLSAgICAgIHBhbHNpemUgICAgID0gUkdCVFJJUExFX1NJWkU7Ci0gICB9Ci0gICBlbHNlICAvKiBXaW5kb3dzIEJNUCAqLwotICAgewotICAgICAgd2lkdGggICAgICAgPSBibXBfZ2V0X2R3b3JkKGJpaCArIEJJSF9MV0lEVEgpOwotICAgICAgaGVpZ2h0ICAgICAgPSBibXBfZ2V0X2R3b3JkKGJpaCArIEJJSF9MSEVJR0hUKTsKLSAgICAgIHBpeGRlcHRoICAgID0gYm1wX2dldF93b3JkKGJpaCArIEJJSF9XQklUQ09VTlQpOwotICAgICAgY29tcHJlc3Npb24gPSBibXBfZ2V0X2R3b3JkKGJpaCArIEJJSF9EQ09NUFJFU1NJT04pOwotICAgICAgcGFsc2l6ZSAgICAgPSBSR0JRVUFEX1NJWkU7Ci0gICAgICBpZiAoaGVpZ2h0ID4gUE5HX1VJTlRfMzFfTUFYKSAgLyogdG9wLWRvd24gQk1QICovCi0gICAgICB7Ci0gICAgICAgICBoZWlnaHQgID0gUE5HX1VJTlRfMzJfTUFYIC0gaGVpZ2h0ICsgMTsKLSAgICAgICAgIHRvcGRvd24gPSAxOwotICAgICAgfQotICAgICAgaWYgKGJpaHNpemUgPT0gSU5GT0hFRF9TSVpFICYmIGNvbXByZXNzaW9uID09IEJJX0JJVEZJRUxEUykKLSAgICAgIHsKLSAgICAgICAgIC8qIFJlYWQgdGhlIFJHQltBXSBtYXNrLiAqLwotICAgICAgICAgaSA9IChza2lwIDw9IDE2KSA/ICh1bnNpZ25lZCBpbnQpc2tpcCA6IDE2OwotICAgICAgICAgaWYgKGZyZWFkKGJpaCArIEI0SF9EUkVETUFTSywgaSwgMSwgc3RyZWFtKSAhPSAxKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICBiaWhzaXplICs9IGk7Ci0gICAgICAgICBza2lwIC09IGk7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIG1lbXNldChyZ2JhX21hc2ssIDAsIHNpemVvZihyZ2JhX21hc2spKTsKLSAgIGlmIChwaXhkZXB0aCA+IDgpCi0gICB7Ci0gICAgICBpZiAoY29tcHJlc3Npb24gPT0gQklfUkdCKQotICAgICAgewotICAgICAgICAgaWYgKHBpeGRlcHRoID09IDE2KQotICAgICAgICAgewotICAgICAgICAgICAgY29tcHJlc3Npb24gID0gQklfQklURklFTERTOwotICAgICAgICAgICAgcmdiYV9tYXNrWzBdID0gMHg3YzAwOwotICAgICAgICAgICAgcmdiYV9tYXNrWzFdID0gMHgwM2UwOwotICAgICAgICAgICAgcmdiYV9tYXNrWzJdID0gMHgwMDFmOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSAvKiBwaXhkZXB0aCA9PSAyNCB8fCBwaXhkZXB0aCA9PSAzMiAqLwotICAgICAgICAgewotICAgICAgICAgICAgcmdiYV9tYXNrWzBdID0gKHBuZ191aW50XzMyKTB4MDBmZjAwMDBMOwotICAgICAgICAgICAgcmdiYV9tYXNrWzFdID0gKHBuZ191aW50XzMyKTB4MDAwMGZmMDBMOwotICAgICAgICAgICAgcmdiYV9tYXNrWzJdID0gKHBuZ191aW50XzMyKTB4MDAwMDAwZmZMOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29tcHJlc3Npb24gPT0gQklfQklURklFTERTKQotICAgICAgewotICAgICAgICAgaWYgKGJpaHNpemUgPj0gSU5GT0hFRF9TSVpFICsgMTIpCi0gICAgICAgICB7Ci0gICAgICAgICAgICByZ2JhX21hc2tbMF0gPSBibXBfZ2V0X2R3b3JkKGJpaCArIEI0SF9EUkVETUFTSyk7Ci0gICAgICAgICAgICByZ2JhX21hc2tbMV0gPSBibXBfZ2V0X2R3b3JkKGJpaCArIEI0SF9ER1JFRU5NQVNLKTsKLSAgICAgICAgICAgIHJnYmFfbWFza1syXSA9IGJtcF9nZXRfZHdvcmQoYmloICsgQjRIX0RCTFVFTUFTSyk7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgY29sb3IgbWFzayBpbiBCTVAgZmlsZSIpOwotICAgICAgfQotICAgICAgaWYgKGJpaHNpemUgPj0gSU5GT0hFRF9TSVpFICsgMTYpCi0gICAgICAgICByZ2JhX21hc2tbM10gPSBibXBfZ2V0X2R3b3JkKGJpaCArIEI0SF9EQUxQSEFNQVNLKTsKLSAgIH0KLQotICAgc3dpdGNoIChjb21wcmVzc2lvbikKLSAgIHsKLSAgIGNhc2UgQklfUkdCOgotICAgICAgLyogQWxsb3cgcGl4ZWwgZGVwdGggdmFsdWVzIDEsIDIsIDQsIDgsIDE2LCAyNCwgMzIuCi0gICAgICAgKiAoQWx0aG91Z2ggdGhlIEJNUCBzcGVjIGRvZXMgbm90IG1lbnRpb24gcGl4ZWwgZGVwdGggPSAyLAotICAgICAgICogaXQgaXMgc3VwcG9ydGVkIGZvciByb2J1c3RuZXNzIHJlYXNvbnMsIGF0IG5vIGV4dHJhIGNvc3QuKQotICAgICAgICovCi0gICAgICBpZiAocGl4ZGVwdGggPiAwICYmIDMyICUgcGl4ZGVwdGggIT0gMCAmJiBwaXhkZXB0aCAhPSAyNCkKLSAgICAgICAgIHBpeGRlcHRoID0gMDsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBCSV9STEU4OgotICAgICAgaWYgKHBpeGRlcHRoICE9IDgpCi0gICAgICAgICBwaXhkZXB0aCA9IDA7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgQklfUkxFNDoKLSAgICAgIGlmIChwaXhkZXB0aCAhPSA0KQotICAgICAgICAgcGl4ZGVwdGggPSAwOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIEJJX0JJVEZJRUxEUzoKLSAgICAgIGlmIChwaXhkZXB0aCAhPSAxNiAmJiBwaXhkZXB0aCAhPSAzMikKLSAgICAgICAgIHBpeGRlcHRoID0gMDsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBCSV9KUEVHOgotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJKUEVHLWNvbXByZXNzZWQgQk1QIGZpbGVzIGFyZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAvKiBOT1RSRUFDSEVEICovCi0gICAgICBicmVhazsKLSAgIGNhc2UgQklfUE5HOgotICAgICAgaWYgKHVuZ2V0YyhnZXRjKHN0cmVhbSksIHN0cmVhbSkgPT0gMCkgIC8qIElIRFIgaXMgbGlrZWx5IHRvIGZvbGxvdyAqLwotICAgICAgICAgcG5nX3NldF9zaWdfYnl0ZXMocG5nX3B0ciwgOCk7Ci0gICAgICBwbmdfc2V0X3JlYWRfZm4ocG5nX3B0ciwgc3RyZWFtLCBOVUxMKTsKLSAgICAgIHBuZ19yZWFkX3BuZyhwbmdfcHRyLCBpbmZvX3B0ciwgMCwgTlVMTCk7Ci0gICAgICAvKiBUT0RPOiBDaGVjayBmb3IgbWlzbWF0Y2hlcyBiZXR3ZWVuIHRoZSBCTVAgYW5kIFBORyBpbmZvLiAqLwotICAgICAgcmV0dXJuIDE7Ci0gICBkZWZhdWx0OgotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJVbnN1cHBvcnRlZCBjb21wcmVzc2lvbiBtZXRob2QgaW4gQk1QIGZpbGUiKTsKLSAgIH0KLQotICAgLyogQ2hlY2sgdGhlIEJNUCBpbWFnZSBwYXJhbWV0ZXJzLiAqLwotICAgaWYgKHdpZHRoID09IDAgfHwgd2lkdGggPiBQTkdfVUlOVF8zMV9NQVggfHwgaGVpZ2h0ID09IDApCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgaW1hZ2UgZGltZW5zaW9ucyBpbiBCTVAgZmlsZSIpOwotICAgaWYgKHBpeGRlcHRoID09IDApCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgcGl4ZWwgZGVwdGggaW4gQk1QIGZpbGUiKTsKLQotICAgLyogQ29tcHV0ZSB0aGUgUE5HIGltYWdlIHBhcmFtZXRlcnMuICovCi0gICBpZiAocGl4ZGVwdGggPD0gOCkKLSAgIHsKLSAgICAgIHBhbG51bSA9IHNraXAgLyBwYWxzaXplOwotICAgICAgaWYgKHBhbG51bSA+IDI1NikKLSAgICAgICAgIHBhbG51bSA9IDI1NjsKLSAgICAgIHNraXAgLT0gcGFsc2l6ZSAqIHBhbG51bTsKLSAgICAgIHJvd3NpemUgPSAod2lkdGggKyAoMzIgLyBwaXhkZXB0aCkgLSAxKSAvICgzMiAvIHBpeGRlcHRoKSAqIDQ7Ci0gICAgICAvKiByb3dzaXplIGJlY29tZXMgMCBvbiBvdmVyZmxvdy4gKi8KLSAgICAgIGJpdF9kZXB0aCA9IHBpeGRlcHRoOwotICAgICAgY29sb3JfdHlwZSA9IChwYWxudW0gPiAwKSA/IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgOiBQTkdfQ09MT1JfVFlQRV9HUkFZOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgcGFsbnVtID0gMDsKLSAgICAgIGJpdF9kZXB0aCA9IDg7Ci0gICAgICBzd2l0Y2ggKHBpeGRlcHRoKQotICAgICAgewotICAgICAgY2FzZSAxNjoKLSAgICAgICAgIHJvd3NpemUgPSAod2lkdGggKiAyICsgMykgJiAofjMpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDI0OgotICAgICAgICAgcm93c2l6ZSA9ICh3aWR0aCAqIDMgKyAzKSAmICh+Myk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzI6Ci0gICAgICAgICByb3dzaXplID0gd2lkdGggKiA0OwotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiAgLyogbmV2ZXIgZ2V0IGhlcmUgKi8KLSAgICAgICAgIGJpdF9kZXB0aCA9IDA7Ci0gICAgICAgICByb3dzaXplID0gMDsKLSAgICAgIH0KLSAgICAgIGlmIChyb3dzaXplIC8gd2lkdGggPCBwaXhkZXB0aCAvIDgpCi0gICAgICAgICByb3dzaXplID0gMDsgIC8qIG92ZXJmbG93ICovCi0gICAgICBjb2xvcl90eXBlID0gKHJnYmFfbWFza1szXSAhPSAwKSA/Ci0gICAgICAgICBQTkdfQ09MT1JfVFlQRV9SR0JBIDogUE5HX0NPTE9SX1RZUEVfUkdCOwotICAgfQotICAgaWYgKHJvd3NpemUgPT0gMCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiRXhjZWVkaW5nbHkgbGFyZ2UgaW1hZ2UgZGltZW5zaW9ucyBpbiBCTVAgZmlsZSIpOwotCi0gICAvKiBTZXQgdGhlIFBORyBpbWFnZSB0eXBlLiAqLwotICAgcG5nX3NldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgd2lkdGgsIGhlaWdodCwgYml0X2RlcHRoLCBjb2xvcl90eXBlLAotICAgICAgUE5HX0lOVEVSTEFDRV9OT05FLCBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFLCBQTkdfRklMVEVSX1RZUEVfQkFTRSk7Ci0gICBpZiAocGl4ZGVwdGggPiA4KQotICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKLSAgICAgICAgIGJtcF9wcm9jZXNzX21hc2socmdiYV9tYXNrW2ldLCAmcmdiYV9zaWdbaV0sICZyZ2JhX3NoaWZ0W2ldKTsKLSAgICAgIGlmIChyZ2JhX3NpZ1swXSA9PSAwIHx8IHJnYmFfc2lnWzFdID09IDAgfHwgcmdiYV9zaWdbMl0gPT0gMCkKLSAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBjb2xvciBtYXNrIGluIEJNUCBmaWxlIik7Ci0gICAgICBpZiAocmdiYV9zaWdbMF0gIT0gOCB8fCByZ2JhX3NpZ1sxXSAhPSA4IHx8Ci0gICAgICAgICAgcmdiYV9zaWdbMl0gIT0gOCB8fCAocmdiYV9zaWdbM10gIT0gMCAmJiByZ2JhX3NpZ1szXSAhPSA4KSkKLSAgICAgIHsKLSAgICAgICAgIHNpZ19iaXQucmVkICAgPSByZ2JhX3NpZ1swXTsKLSAgICAgICAgIHNpZ19iaXQuZ3JlZW4gPSByZ2JhX3NpZ1sxXTsKLSAgICAgICAgIHNpZ19iaXQuYmx1ZSAgPSByZ2JhX3NpZ1syXTsKLSAgICAgICAgIHNpZ19iaXQuYWxwaGEgPSByZ2JhX3NpZ1szXTsKLSAgICAgICAgIHBuZ19zZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpOwotICAgICAgfQotICAgfQotCi0gICAvKiBSZWFkIHRoZSBjb2xvciBwYWxldHRlIChpZiBhcHBsaWNhYmxlKS4gKi8KLSAgIGlmIChwYWxudW0gPiAwKQotICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IHBhbG51bTsgKytpKQotICAgICAgewotICAgICAgICAgaWYgKGZyZWFkKHJnYnEsIHBhbHNpemUsIDEsIHN0cmVhbSkgIT0gMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgcGFsZXR0ZVtpXS5yZWQgICA9IHJnYnFbUkdCX1JFRF07Ci0gICAgICAgICBwYWxldHRlW2ldLmdyZWVuID0gcmdicVtSR0JfR1JFRU5dOwotICAgICAgICAgcGFsZXR0ZVtpXS5ibHVlICA9IHJnYnFbUkdCX0JMVUVdOwotICAgICAgfQotICAgICAgcG5nX3NldF9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLCBwYWxldHRlLCBpKTsKLSAgICAgIGlmIChpICE9IHBhbG51bSkKLSAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiRXJyb3IgcmVhZGluZyBjb2xvciBwYWxldHRlIGluIEJNUCBmaWxlIik7Ci0gICB9Ci0KLSAgIC8qIEFsbG9jYXRlIG1lbW9yeSBhbmQgcmVhZCB0aGUgaW1hZ2UgZGF0YS4gKi8KLSAgIHJvd19wb2ludGVycyA9IHBuZ3hfbWFsbG9jX3Jvd3NfZXh0ZW5kZWQocG5nX3B0ciwgaW5mb19wdHIsIHJvd3NpemUsIC0xKTsKLSAgIGlmICh0b3Bkb3duKQotICAgewotICAgICAgYmVnaW5fcm93ID0gcm93X3BvaW50ZXJzOwotICAgICAgZW5kX3JvdyA9IHJvd19wb2ludGVycyArIGhlaWdodDsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGJlZ2luX3JvdyA9IHJvd19wb2ludGVycyArIGhlaWdodCAtIDE7Ci0gICAgICBlbmRfcm93ID0gcm93X3BvaW50ZXJzIC0gMTsKLSAgIH0KLSAgIGlmIChza2lwID4gMCkKLSAgICAgIGZzZWVrKHN0cmVhbSwgKGxvbmcpc2tpcCwgU0VFS19DVVIpOwotICAgeSA9IGJtcF9yZWFkX3Jvd3MoYmVnaW5fcm93LCBlbmRfcm93LCByb3dzaXplLCBjb21wcmVzc2lvbiwgc3RyZWFtKTsKLQotICAgLyogUG9zdHByb2Nlc3MgdGhlIGltYWdlIGRhdGEsIGV2ZW4gaWYgaXQgaGFzIG5vdCBiZWVuIHJlYWQgZW50aXJlbHkuICovCi0gICBpZiAocGl4ZGVwdGggPiA4KQotICAgICAgYm1wX3RvX3BuZ19yb3dzKHJvd19wb2ludGVycywgd2lkdGgsIGhlaWdodCwgcGl4ZGVwdGgsCi0gICAgICAgICByZ2JhX3NpZywgcmdiYV9zaGlmdCk7Ci0KLSAgIC8qIENoZWNrIHRoZSByZXN1bHQuICovCi0gICBpZiAoeSAhPSAoc2l6ZV90KWhlaWdodCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiRXJyb3IgcmVhZGluZyBCTVAgZmlsZSIpOwotCi0gICByZXR1cm4gMTsgIC8qIG9uZSBpbWFnZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVhZCAqLwotfQpkaWZmIC0tZ2l0IGEvc3JjL3BuZ3h0ZXJuL3BuZ3hyZWFkLmMgYi9zcmMvcG5neHRlcm4vcG5neHJlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQzMzU5Yy4uMDAwMDAwMAotLS0gYS9zcmMvcG5neHRlcm4vcG5neHJlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogcG5neHJlYWQuYyAtIGxpYnBuZyBleHRlcm5hbCBJL086IHJlYWQgdXRpbGl0eSBmdW5jdGlvbnMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMSBDb3NtaW4gVHJ1dGEuCi0gKi8KLQotI2luY2x1ZGUgInBuZ3h0ZXJuLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIFBOR1hfSU5URVJOQUwKLSNpbmNsdWRlICJwbmd4cHJpdi5oIgotCi0KLXN0YXRpYyBpbnQKLXBuZ3hfc2lnX2lzX3BuZyhwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICAgICAgICAgIHBuZ19ieXRlcCBzaWcsIHNpemVfdCBzaWdfc2l6ZSwKLSAgICAgICAgICAgICAgICBwbmdfY29uc3RfY2hhcnBwIGZtdF9uYW1lX3B0ciwKLSAgICAgICAgICAgICAgICBwbmdfY29uc3RfY2hhcnBwIGZtdF9sb25nX25hbWVfcHRyKQotewotICAgLyogVGhlIHNpZ25hdHVyZSBvZiB0aGlzIGZ1bmN0aW9uIGRpZmZlcnMgZnJvbSB0aGUgb3RoZXIgcG5neF9zaWdfaXNfWCgpCi0gICAgKiBmdW5jdGlvbnMsIHRvIGFsbG93IGV4dHJhIGZ1bmN0aW9uYWxpdHkgKGUuZy4gY3VzdG9taXplZCBlcnJvciBtZXNzYWdlcykKLSAgICAqIHdpdGhvdXQgcmVxdWlyaW5nIGEgZnVsbCBwbmd4X3JlYWRfcG5nKCkuCi0gICAgKi8KLQotICAgc3RhdGljIGNvbnN0IGNoYXIgcG5neF9wbmdfc3RhbmRhbG9uZV9mbXRfbmFtZVtdID0KLSAgICAgICJQTkciOwotICAgc3RhdGljIGNvbnN0IGNoYXIgcG5neF9wbmdfZGF0YXN0cmVhbV9mbXRfbmFtZVtdID0KLSAgICAgICJQTkcgZGF0YXN0cmVhbSI7Ci0gICBzdGF0aWMgY29uc3QgY2hhciBwbmd4X3BuZ19zdGFuZGFsb25lX2ZtdF9sb25nX25hbWVbXSA9Ci0gICAgICAiUG9ydGFibGUgTmV0d29yayBHcmFwaGljcyI7Ci0gICBzdGF0aWMgY29uc3QgY2hhciBwbmd4X3BuZ19kYXRhc3RyZWFtX2ZtdF9sb25nX25hbWVbXSA9Ci0gICAgICAiUG9ydGFibGUgTmV0d29yayBHcmFwaGljcyBlbWJlZGRlZCBkYXRhc3RyZWFtIjsKLQotICAgc3RhdGljIGNvbnN0IHBuZ19ieXRlIHBuZ19maWxlX3NpZ1s4XSA9IHsxMzcsIDgwLCA3OCwgNzEsIDEzLCAxMCwgMjYsIDEwfTsKLSAgIHN0YXRpYyBjb25zdCBwbmdfYnl0ZSBtbmdfZmlsZV9zaWdbOF0gPSB7MTM4LCA3NywgNzgsIDcxLCAxMywgMTAsIDI2LCAxMH07Ci0gICBzdGF0aWMgY29uc3QgcG5nX2J5dGUgcG5nX2loZHJfc2lnWzhdID0gezAsIDAsIDAsIDEzLCA3MywgNzIsIDY4LCA4Mn07Ci0KLSAgIGludCBoYXNfcG5nX3NpZzsKLQotICAgLyogU2luY2UgcG5nX3JlYWRfcG5nKCkgZmFpbHMgcmF0aGVyIGFicnVwdGx5IHdpdGggcG5nX2Vycm9yKCksCi0gICAgKiBzcGVuZCBhIGxpdHRsZSBtb3JlIGVmZm9ydCB0byBlbnN1cmUgdGhhdCB0aGUgZm9ybWF0IGlzIGluZGVlZCBQTkcuCi0gICAgKiBBbW9uZyBvdGhlciB0aGluZ3MsIGxvb2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBJSERSLgotICAgICovCi0gICBpZiAoc2lnX3NpemUgPD0gMjUgKyAxOCkgIC8qIHNpemUgb2YgKElIRFIgKyBJREFUKSA+ICgxMisxMykgKyAoMTIrNikgKi8KLSAgICAgIHJldHVybiAtMTsKLSAgIGhhc19wbmdfc2lnID0gKG1lbWNtcChzaWcsIHBuZ19maWxlX3NpZywgOCkgPT0gMCk7Ci0gICBpZiAobWVtY21wKHNpZyArIChoYXNfcG5nX3NpZyA/IDggOiAwKSwgcG5nX2loZHJfc2lnLCA4KSAhPSAwKQotICAgewotICAgICAgLyogVGhpcyBpcyBub3QgdmFsaWQgUE5HOiBnZXQgYXMgbXVjaCBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZS4gKi8KLSAgICAgIGlmIChtZW1jbXAoc2lnLCBwbmdfZmlsZV9zaWcsIDQpID09IDAgJiYgKHNpZ1s0XSA9PSAxMCB8fCBzaWdbNF0gPT0gMTMpKQotICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsCi0gICAgICAgICAgICAiUE5HIGZpbGUgYXBwZWFycyB0byBiZSBjb3JydXB0ZWQgYnkgdGV4dCBmaWxlIGNvbnZlcnNpb25zIik7Ci0gICAgICBlbHNlIGlmIChtZW1jbXAoc2lnLCBtbmdfZmlsZV9zaWcsIDgpID09IDApCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1ORyBkZWNvZGluZyBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAvKiBKTkcgaXMgaGFuZGxlZCBieSB0aGUgcG5neHJqcGcgbW9kdWxlLiAqLwotICAgICAgcmV0dXJuIDA7ICAvKiBub3QgUE5HICovCi0gICB9Ci0KLSAgIC8qIFN0b3JlIHRoZSBmb3JtYXQgbmFtZS4gKi8KLSAgIGlmIChmbXRfbmFtZV9wdHIgIT0gTlVMTCkKLSAgIHsKLSAgICAgICpmbXRfbmFtZV9wdHIgPSBoYXNfcG5nX3NpZyA/Ci0gICAgICAgICBwbmd4X3BuZ19zdGFuZGFsb25lX2ZtdF9uYW1lIDoKLSAgICAgICAgIHBuZ3hfcG5nX2RhdGFzdHJlYW1fZm10X25hbWU7Ci0gICB9Ci0gICBpZiAoZm10X2xvbmdfbmFtZV9wdHIgIT0gTlVMTCkKLSAgIHsKLSAgICAgICpmbXRfbG9uZ19uYW1lX3B0ciA9IGhhc19wbmdfc2lnID8KLSAgICAgICAgIHBuZ3hfcG5nX3N0YW5kYWxvbmVfZm10X2xvbmdfbmFtZSA6Ci0gICAgICAgICBwbmd4X3BuZ19kYXRhc3RyZWFtX2ZtdF9sb25nX25hbWU7Ci0gICB9Ci0gICByZXR1cm4gMTsgIC8qIFBORywgcmVhbGx5ISAqLwotfQotCi1pbnQgUE5HQVBJCi1wbmd4X3JlYWRfaW1hZ2UocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgICAgICAgICAgICAgIHBuZ19jb25zdF9jaGFycHAgZm10X25hbWVfcHRyLAotICAgICAgICAgICAgICAgIHBuZ19jb25zdF9jaGFycHAgZm10X2xvbmdfbmFtZV9wdHIpCi17Ci0gICBwbmdfYnl0ZSBzaWdbMTI4XTsKLSAgIHNpemVfdCBudW07Ci0gICBpbnQgKCpyZWFkX2ZuKShwbmdfc3RydWN0cCwgcG5nX2luZm9wLCBGSUxFICopOwotICAgRklMRSAqc3RyZWFtOwotICAgZnBvc190IGZwb3M7Ci0gICBpbnQgcmVzdWx0OwotCi0gICAvKiBQcmVjb25kaXRpb24uICovCi0jaWZkZWYgUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LCi0gICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0spCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInBuZ3h0ZXJuIHJlcXVpcmVzIGEgc2FmZSBhbGxvY2F0b3IiKTsKLSNlbmRpZgotCi0gICAvKiBSZWFkIHRoZSBzaWduYXR1cmUgYnl0ZXMuICovCi0gICBzdHJlYW0gPSAoRklMRSAqKXBuZ19nZXRfaW9fcHRyKHBuZ19wdHIpOwotICAgaWYgKGZnZXRwb3Moc3RyZWFtLCAmZnBvcykgIT0gMCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiQ2FuJ3QgZnRlbGwgaW4gaW5wdXQgZmlsZSBzdHJlYW0iKTsKLSAgIG51bSA9IGZyZWFkKHNpZywgMSwgc2l6ZW9mKHNpZyksIHN0cmVhbSk7Ci0gICBpZiAoZnNldHBvcyhzdHJlYW0sICZmcG9zKSAhPSAwKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJDYW4ndCBmc2VlayBpbiBpbnB1dCBmaWxlIHN0cmVhbSIpOwotCi0gICAvKiBUcnkgdGhlIFBORyBmb3JtYXQgZmlyc3QuICovCi0gICBpZiAocG5neF9zaWdfaXNfcG5nKHBuZ19wdHIsIHNpZywgbnVtLCBmbXRfbmFtZV9wdHIsIGZtdF9sb25nX25hbWVfcHRyKSA+IDApCi0gICB7Ci0gICAgICBwbmdfcmVhZF9wbmcocG5nX3B0ciwgaW5mb19wdHIsIDAsIE5VTEwpOwotICAgICAgaWYgKGdldGMoc3RyZWFtKSAhPSBFT0YpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiRXh0cmFuZW91cyBkYXRhIGZvdW5kIGFmdGVyIElFTkQiKTsKLSAgICAgICAgIGZzZWVrKHN0cmVhbSwgMCwgU0VFS19FTkQpOwotICAgICAgfQotICAgICAgcmV0dXJuIDE7Ci0gICB9Ci0KLSAgIC8qIENoZWNrIHRoZSBzaWduYXR1cmUgYnl0ZXMgYWdhaW5zdCBvdGhlciBrbm93biBpbWFnZSBmb3JtYXRzLiAqLwotICAgaWYgKHBuZ3hfc2lnX2lzX2JtcChzaWcsIG51bSwgZm10X25hbWVfcHRyLCBmbXRfbG9uZ19uYW1lX3B0cikgPiAwKQotICAgICAgcmVhZF9mbiA9IHBuZ3hfcmVhZF9ibXA7Ci0gICBlbHNlIGlmIChwbmd4X3NpZ19pc19naWYoc2lnLCBudW0sIGZtdF9uYW1lX3B0ciwgZm10X2xvbmdfbmFtZV9wdHIpID4gMCkKLSAgICAgIHJlYWRfZm4gPSBwbmd4X3JlYWRfZ2lmOwotICAgZWxzZSBpZiAocG5neF9zaWdfaXNfanBlZyhzaWcsIG51bSwgZm10X25hbWVfcHRyLCBmbXRfbG9uZ19uYW1lX3B0cikgPiAwKQotICAgICAgcmVhZF9mbiA9IHBuZ3hfcmVhZF9qcGVnOwotICAgZWxzZSBpZiAocG5neF9zaWdfaXNfcG5tKHNpZywgbnVtLCBmbXRfbmFtZV9wdHIsIGZtdF9sb25nX25hbWVfcHRyKSA+IDApCi0gICAgICByZWFkX2ZuID0gcG5neF9yZWFkX3BubTsKLSAgIGVsc2UgaWYgKHBuZ3hfc2lnX2lzX3RpZmYoc2lnLCBudW0sIGZtdF9uYW1lX3B0ciwgZm10X2xvbmdfbmFtZV9wdHIpID4gMCkKLSAgICAgIHJlYWRfZm4gPSBwbmd4X3JlYWRfdGlmZjsKLSAgIGVsc2UKLSAgICAgIHJldHVybiAwOyAgLyogbm90IGEga25vd24gaW1hZ2UgZm9ybWF0ICovCi0KLSAgIC8qIFJlYWQgdGhlIGltYWdlLiAqLwotICAgcmVzdWx0ID0gcmVhZF9mbihwbmdfcHRyLCBpbmZvX3B0ciwgc3RyZWFtKTsKLSAgIC8qIFNpZ25hdHVyZSBjaGVja2luZyBtYXkgZ2l2ZSBmYWxzZSBwb3NpdGl2ZXM7IHJlYWRpbmcgY2FuIHN0aWxsIGZhaWwuICovCi0gICBpZiAocmVzdWx0IDw9IDApICAvKiB0aGlzIGlzbid0IHRoZSBmb3JtYXQgd2UgdGhvdWdodCBpdCB3YXMgKi8KLSAgICAgIGlmIChmc2V0cG9zKHN0cmVhbSwgJmZwb3MpICE9IDApCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkNhbid0IGZzZWVrIGluIGlucHV0IGZpbGUgc3RyZWFtIik7Ci0gICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvc3JjL3BuZ3h0ZXJuL3BuZ3hyZ2lmLmMgYi9zcmMvcG5neHRlcm4vcG5neHJnaWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmNjhkZi4uMDAwMDAwMAotLS0gYS9zcmMvcG5neHRlcm4vcG5neHJnaWYuYworKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKgotICogcG5neHJnaWYuYyAtIGxpYnBuZyBleHRlcm5hbCBJL086IEdJRiByZWFkZXIuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMiBDb3NtaW4gVHJ1dGEuCi0gKi8KLQotI2luY2x1ZGUgInBuZ3h0ZXJuLmgiCi0jaW5jbHVkZSAicG5neHV0aWwuaCIKLSNpbmNsdWRlICJnaWZyZWFkLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBQTkdYX0lOVEVSTkFMCi0jaW5jbHVkZSAicG5neHByaXYuaCIKLQotCi1zdGF0aWMgY29uc3QgY2hhciBnaWZfZm10X25hbWVbXSA9ICJHSUYiOwotc3RhdGljIGNvbnN0IGNoYXIgZ2lmX2ZtdF9sb25nX25hbWVbXSA9ICJHcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQiOwotCi1zdGF0aWMgY29uc3QgcG5nX2J5dGUgZ2lmX3NpZ19naWY4N2FbNl0gPQotICAgeyAweDQ3LCAweDQ5LCAweDQ2LCAweDM4LCAweDM3LCAweDYxIH07ICAvKiAiR0lGODdhIiAqLwotc3RhdGljIGNvbnN0IHBuZ19ieXRlIGdpZl9zaWdfZ2lmODlhWzZdID0KLSAgIHsgMHg0NywgMHg0OSwgMHg0NiwgMHgzOCwgMHgzOSwgMHg2MSB9OyAgLyogIkdJRjg5YSIgKi8KLQotCi1pbnQgLyogUFJJVkFURSAqLwotcG5neF9zaWdfaXNfZ2lmKHBuZ19ieXRlcCBzaWcsIHNpemVfdCBzaWdfc2l6ZSwKLSAgICAgICAgICAgICAgICBwbmdfY29uc3RfY2hhcnBwIGZtdF9uYW1lX3B0ciwKLSAgICAgICAgICAgICAgICBwbmdfY29uc3RfY2hhcnBwIGZtdF9sb25nX25hbWVfcHRyKQotewotICAgLyogUmVxdWlyZSBhdCBsZWFzdCB0aGUgR0lGIHNpZ25hdHVyZSBhbmQgdGhlIHNjcmVlbiBkZXNjcmlwdG9yLiAqLwotICAgaWYgKHNpZ19zaXplIDwgNiArIDcpCi0gICAgICByZXR1cm4gLTE7ICAvKiBpbnN1ZmZpY2llbnQgZGF0YSAqLwotICAgaWYgKG1lbWNtcChzaWcsIGdpZl9zaWdfZ2lmODdhLCA2KSAhPSAwICYmCi0gICAgICAgbWVtY21wKHNpZywgZ2lmX3NpZ19naWY4OWEsIDYpICE9IDApCi0gICAgICByZXR1cm4gMDsgIC8qIG5vdCBHSUYgKi8KLQotICAgLyogU3RvcmUgdGhlIGZvcm1hdCBuYW1lLiAqLwotICAgaWYgKGZtdF9uYW1lX3B0ciAhPSBOVUxMKQotICAgICAgKmZtdF9uYW1lX3B0ciA9IGdpZl9mbXRfbmFtZTsKLSAgIGlmIChmbXRfbG9uZ19uYW1lX3B0ciAhPSBOVUxMKQotICAgICAgKmZtdF9sb25nX25hbWVfcHRyID0gZ2lmX2ZtdF9sb25nX25hbWU7Ci0gICByZXR1cm4gMTsgIC8qIEdJRiAqLwotfQotCi0KLS8qIEZJWE1FOiBOb3QgdGhyZWFkLXNhZmUuICovCi1zdGF0aWMgcG5nX3N0cnVjdHAgZXJyX3BuZ19wdHI7Ci1zdGF0aWMgc3RydWN0IEdJRkltYWdlICplcnJfZ2lmX2ltYWdlX3B0cjsKLXN0YXRpYyBzdHJ1Y3QgR0lGRXh0ZW5zaW9uICplcnJfZ2lmX2V4dF9wdHI7Ci0KLXN0YXRpYyB2b2lkCi1wbmd4X2dpZl9lcnJvcihjb25zdCBjaGFyICptc2cpCi17Ci0gICBpZiAoZXJyX2dpZl9pbWFnZV9wdHIgIT0gTlVMTCkKLSAgICAgIEdJRkRlc3Ryb3lJbWFnZShlcnJfZ2lmX2ltYWdlX3B0cik7Ci0gICBpZiAoZXJyX2dpZl9leHRfcHRyICE9IE5VTEwpCi0gICAgICBHSUZEZXN0cm95RXh0ZW5zaW9uKGVycl9naWZfZXh0X3B0cik7Ci0gICBwbmdfZXJyb3IoZXJyX3BuZ19wdHIsIG1zZyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wbmd4X2dpZl93YXJuaW5nKGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgIHBuZ193YXJuaW5nKGVycl9wbmdfcHRyLCBtc2cpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1wbmd4X3NldF9naWZfcGFsZXR0ZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICB1bnNpZ25lZCBjaGFyICpjb2xvcl90YWJsZSwgdW5zaWduZWQgaW50IG51bV9jb2xvcnMpCi17Ci0gICBwbmdfY29sb3IgcGFsZXR0ZVsyNTZdOwotICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgIFBOR1hfQVNTRVJUKGNvbG9yX3RhYmxlICE9IE5VTEwpOwotICAgUE5HWF9BU1NFUlQobnVtX2NvbG9ycyA8PSAyNTYpOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbG9yczsgKytpKQotICAgewotICAgICAgcGFsZXR0ZVtpXS5yZWQgICA9IGNvbG9yX3RhYmxlWzMgKiBpXTsKLSAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSBjb2xvcl90YWJsZVszICogaSArIDFdOwotICAgICAgcGFsZXR0ZVtpXS5ibHVlICA9IGNvbG9yX3RhYmxlWzMgKiBpICsgMl07Ci0gICB9Ci0gICBwbmdfc2V0X1BMVEUocG5nX3B0ciwgaW5mb19wdHIsIHBhbGV0dGUsIChpbnQpbnVtX2NvbG9ycyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wbmd4X3NldF9naWZfdHJhbnNwYXJlbnQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgdW5zaWduZWQgaW50IHRyYW5zcGFyZW50KQotewotICAgcG5nX2J5dGUgdHJhbnNbMjU2XTsKLSAgIHVuc2lnbmVkIGludCBpOwotCi0gICBQTkdYX0FTU0VSVCh0cmFuc3BhcmVudCA8IDI1Nik7Ci0KLSAgIGZvciAoaSA9IDA7IGkgPCB0cmFuc3BhcmVudDsgKytpKQotICAgICAgdHJhbnNbaV0gPSAyNTU7Ci0gICB0cmFuc1t0cmFuc3BhcmVudF0gPSAwOwotICAgcG5nX3NldF90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLCB0cmFucywgKGludCl0cmFuc3BhcmVudCArIDEsIE5VTEwpOwotfQotCi1pbnQgLyogUFJJVkFURSAqLwotcG5neF9yZWFkX2dpZihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIEZJTEUgKnN0cmVhbSkKLXsKLSAgIC8qIEdJRi1zcGVjaWZpYyBkYXRhICovCi0gICBzdHJ1Y3QgR0lGU2NyZWVuIHNjcmVlbjsKLSAgIHN0cnVjdCBHSUZJbWFnZSBpbWFnZTsKLSAgIHN0cnVjdCBHSUZFeHRlbnNpb24gZXh0OwotICAgc3RydWN0IEdJRkdyYXBoaWNDdGxFeHQgZ3JhcGhpY0V4dDsKLSAgIGludCBibG9ja0NvZGU7Ci0gICB1bnNpZ25lZCBjaGFyICpjb2xvclRhYmxlOwotICAgdW5zaWduZWQgaW50IG51bUNvbG9yczsKLSAgIHVuc2lnbmVkIGludCB0cmFuc3BhcmVudDsKLSAgIHVuc2lnbmVkIGludCBudW1JbWFnZXM7Ci0gICAvKiBQTkctc3BlY2lmaWMgZGF0YSAqLwotICAgcG5nX3VpbnRfMzIgd2lkdGgsIGhlaWdodDsKLSAgIHBuZ19ieXRlcHAgcm93X3BvaW50ZXJzOwotCi0gICAvKiBTZXQgdXAgdGhlIGN1c3RvbSBlcnJvciBoYW5kbGluZy4gKi8KLSAgIEdJRkVycm9yID0gcG5neF9naWZfZXJyb3I7Ci0gICBHSUZXYXJuaW5nID0gcG5neF9naWZfd2FybmluZzsKLSAgIGVycl9wbmdfcHRyID0gcG5nX3B0cjsKLSAgIGVycl9naWZfaW1hZ2VfcHRyID0gTlVMTDsKLSAgIGVycl9naWZfZXh0X3B0ciA9IE5VTEw7Ci0KLSAgIC8qIFJlYWQgdGhlIEdJRiBzY3JlZW4uICovCi0gICBHSUZSZWFkU2NyZWVuKCZzY3JlZW4sIHN0cmVhbSk7Ci0gICB3aWR0aCA9IHNjcmVlbi5XaWR0aDsKLSAgIGhlaWdodCA9IHNjcmVlbi5IZWlnaHQ7Ci0KLSAgIC8qIFNldCB0aGUgUE5HIGltYWdlIHR5cGUuICovCi0gICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICB3aWR0aCwgaGVpZ2h0LCA4LCBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFLAotICAgICAgUE5HX0lOVEVSTEFDRV9OT05FLCBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFLCBQTkdfRklMVEVSX1RZUEVfQkFTRSk7Ci0KLSAgIC8qIEFsbG9jYXRlIG1lbW9yeS4gKi8KLSAgIHJvd19wb2ludGVycyA9IHBuZ3hfbWFsbG9jX3Jvd3MocG5nX3B0ciwgaW5mb19wdHIsIChpbnQpc2NyZWVuLkJhY2tncm91bmQpOwotCi0gICAvKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIEdJRiByZWFkZXIuICovCi0gICBHSUZJbml0SW1hZ2UoJmltYWdlLCAmc2NyZWVuLCByb3dfcG9pbnRlcnMpOwotICAgZXJyX2dpZl9pbWFnZV9wdHIgPSAmaW1hZ2U7Ci0gICBHSUZJbml0RXh0ZW5zaW9uKCZleHQsICZzY3JlZW4sIDI1Nik7Ci0gICBlcnJfZ2lmX2V4dF9wdHIgPSAmZXh0OwotICAgbnVtSW1hZ2VzID0gMDsKLSAgIHRyYW5zcGFyZW50ID0gKHVuc2lnbmVkIGludCkoLTEpOwotCi0gICAvKiBJdGVyYXRlIG92ZXIgdGhlIEdJRiBmaWxlLiAqLwotICAgZm9yICggOyA7ICkKLSAgIHsKLSAgICAgIGJsb2NrQ29kZSA9IEdJRlJlYWROZXh0QmxvY2soJmltYWdlLCAmZXh0LCBzdHJlYW0pOwotICAgICAgaWYgKGJsb2NrQ29kZSA9PSBHSUZfSU1BR0UpICAvKiAnLCcgKi8KLSAgICAgIHsKLSAgICAgICAgIGlmIChpbWFnZS5Sb3dzICE9IE5VTEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb21wbGV0ZSB0aGUgUE5HIGluZm8uICovCi0gICAgICAgICAgICBpZiAoaW1hZ2UuSW50ZXJsYWNlRmxhZykKLSAgICAgICAgICAgICAgIHBuZ3hfc2V0X2ludGVybGFjZV90eXBlKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9BREFNNyk7Ci0gICAgICAgICAgICBHSUZHZXRDb2xvclRhYmxlKCZjb2xvclRhYmxlLCAmbnVtQ29sb3JzLCAmaW1hZ2UpOwotICAgICAgICAgICAgcG5neF9zZXRfZ2lmX3BhbGV0dGUocG5nX3B0ciwgaW5mb19wdHIsIGNvbG9yVGFibGUsIG51bUNvbG9ycyk7Ci0gICAgICAgICAgICBpZiAodHJhbnNwYXJlbnQgPCAyNTYpCi0gICAgICAgICAgICAgICBwbmd4X3NldF9naWZfdHJhbnNwYXJlbnQocG5nX3B0ciwgaW5mb19wdHIsIHRyYW5zcGFyZW50KTsKLQotICAgICAgICAgICAgLyogSW5mb3JtIHRoZSBHSUYgcm91dGluZXMgbm90IHRvIHJlYWQgdGhlIHVwY29taW5nIGltYWdlcy4gKi8KLSAgICAgICAgICAgIGltYWdlLlJvd3MgPSBOVUxMOwotICAgICAgICAgfQotICAgICAgICAgKytudW1JbWFnZXM7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChibG9ja0NvZGUgPT0gR0lGX0VYVEVOU0lPTikgIC8qICchJyAqLwotICAgICAgewotICAgICAgICAgaWYgKGV4dC5MYWJlbCA9PSBHSUZfR1JBUEhJQ0NUTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIEdJRkdldEdyYXBoaWNDdGwoJmdyYXBoaWNFeHQsICZleHQpOwotICAgICAgICAgICAgaWYgKGltYWdlLlJvd3MgIT0gTlVMTCAmJiBncmFwaGljRXh0LlRyYW5zcGFyZW50RmxhZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmICh0cmFuc3BhcmVudCA+PSAyNTYpCi0gICAgICAgICAgICAgICAgICB0cmFuc3BhcmVudCA9IGdyYXBoaWNFeHQuVHJhbnNwYXJlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChibG9ja0NvZGUgPT0gR0lGX1RFUk1JTkFUT1IpICAvKiAnOycgKi8KLSAgICAgICAgIGJyZWFrOwotICAgfQotCi0gICBpZiAoaW1hZ2UuUm93cyAhPSBOVUxMKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJObyBpbWFnZSBpbiBHSUYgZmlsZSIpOwotCi0gICBHSUZEZXN0cm95SW1hZ2UoJmltYWdlKTsKLSAgIEdJRkRlc3Ryb3lFeHRlbnNpb24oJmV4dCk7Ci0gICByZXR1cm4gbnVtSW1hZ2VzOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3BuZ3h0ZXJuL3BuZ3hyanBnLmMgYi9zcmMvcG5neHRlcm4vcG5neHJqcGcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY4MDYzMi4uMDAwMDAwMAotLS0gYS9zcmMvcG5neHRlcm4vcG5neHJqcGcuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogcG5neHJqcGcuYyAtIGxpYnBuZyBleHRlcm5hbCBJL086IEpQRUcgcmVhZGVyIHN0dWIuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBDb3NtaW4gVHJ1dGEuCi0gKgotICogRnJvbSB0aGUgaW5mb3JtYXRpb24tdGhlb3JldGljIHBvaW50IG9mIHZpZXcsIEpQRUctdG8tUE5HIGNvbnZlcnNpb24KLSAqIGlzIG5vdCBhIHdvcnRod2hpbGUgdGFzay4gIE1vcmVvdmVyLCBhIEpQRUcgZGVjb2RlciB3b3VsZCBhZGQgYQotICogc2lnbmlmaWNhbnQgb3ZlcmhlYWQgdG8gdGhlIGFwcGxpY2F0aW9uLiAgQXMgc3VjaCwgd2UgcHJvdmlkZSBhIHN0dWIKLSAqIHRoYXQgcmVjb2duaXplcyB0aGUgSlBFRyBmb3JtYXQsIHdpdGhvdXQgYWN0dWFsbHkgcHJvY2Vzc2luZyBpdC4KLSAqLwotCi0jaW5jbHVkZSAicG5neHRlcm4uaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIFBOR1hfSU5URVJOQUwKLSNpbmNsdWRlICJwbmd4cHJpdi5oIgotCi0KLS8qCi0gKiBUaGVzZSBhcmUgdGhlIHZhcmlvdXMgSlBFRyBmb3JtYXQgc2lnbmF0dXJlcy4KLSAqCi0gKiBGRiBEOCBGRiBFMCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gSkZJRgotICogRkYgRDggRkYgRTEgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIEVYSUYKLSAqIEZGIEQ4IEZGIEY3IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBKUEVHLUxTCi0gKiBGRiA0RiBGRiA1MSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gSlBFRy0yMDAwIGNvZGVzdHJlYW0KLSAqIDAwIDAwIDAwIDBDIDZBIDUwIDIwIDIwIDBEIDBBIDg3IDBBIC4uLiBKUEVHLTIwMDAgLmpwMgotICogOEIgNEEgNEUgNDcgMEQgMEEgMUEgMEEgLi4uLi4uLi4uLi4uLi4uIEpORwotICogMDAgMDAgMDAgMTAgNEEgNDggNDQgNTIgLi4uLi4uLi4uLi4uLi4uIEpORyBkYXRhc3RyZWFtCi0gKiBldGMuCi0gKi8KLQotI2RlZmluZSBKUEVHX1NJR19KUDJfU0laRSAxMgotI2RlZmluZSBKUEVHX1NJR19KUENfU0laRSAgNAotI2RlZmluZSBKUEVHX1NJR19KTkdfU0laRSAgOAotI2RlZmluZSBKUEVHX1NJR19TSVpFX01BWCAxMgotCi1zdGF0aWMgY29uc3QgcG5nX2J5dGUganBlZ19zaWdfanAyW0pQRUdfU0lHX0pQMl9TSVpFXSA9Ci0gICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4NmEsIDB4NTAsIDB4MjAsIDB4MjAsIDB4MGQsIDB4MGEsIDB4ODcsIDB4MGEgfTsKLXN0YXRpYyBjb25zdCBwbmdfYnl0ZSBqcGVnX3NpZ19qcGNbSlBFR19TSUdfSlBDX1NJWkVdID0KLSAgIHsgMHhmZiwgMHg0ZiwgMHhmZiwgMHg1MSB9Owotc3RhdGljIGNvbnN0IHBuZ19ieXRlIGpwZWdfc2lnX2puZ1tKUEVHX1NJR19KTkdfU0laRV0gPQotICAgeyAweDhiLCAweDRhLCAweDRlLCAweDQ3LCAweDBkLCAweDBhLCAweDFhLCAweDBhIH07Ci1zdGF0aWMgY29uc3QgcG5nX2J5dGUganBlZ19zaWdfam5nX2poZHJbSlBFR19TSUdfSk5HX1NJWkVdID0KLSAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgxYSwgMHg0YSwgMHg0OCwgMHg0NCwgMHg1MiB9OwotCi0KLWludCAvKiBQUklWQVRFICovCi1wbmd4X3NpZ19pc19qcGVnKHBuZ19ieXRlcCBzaWcsIHNpemVfdCBzaWdfc2l6ZSwKLSAgICAgICAgICAgICAgICAgcG5nX2NvbnN0X2NoYXJwcCBmbXRfbmFtZV9wdHIsCi0gICAgICAgICAgICAgICAgIHBuZ19jb25zdF9jaGFycHAgZm10X2xvbmdfbmFtZV9wdHIpCi17Ci0gICBjb25zdCBjaGFyICpmbXQ7Ci0gICB1bnNpZ25lZCBpbnQgbWFya2VyOwotICAgaW50IHJlc3VsdDsKLQotICAgaWYgKHNpZ19zaXplIDwgSlBFR19TSUdfU0laRV9NQVgpCi0gICAgICByZXR1cm4gLTE7Ci0gICBpZiAoc2lnWzBdID09IDB4ZmYgJiYgc2lnWzFdID09IDB4ZDggJiYgc2lnWzJdID09IDB4ZmYpCi0gICB7Ci0gICAgICBtYXJrZXIgPSAweGZmMDBVIHwgc2lnWzNdOwotICAgICAgaWYgKChtYXJrZXIgPj0gMHhmZmMwVSAmJiBtYXJrZXIgPD0gMHhmZmNmVSkgfHwKLSAgICAgICAgICAobWFya2VyID49IDB4ZmZkYVUgJiYgbWFya2VyIDw9IDB4ZmZmZVUpKQotICAgICAgewotICAgICAgICAgZm10ID0gIkpQRUciOwotICAgICAgICAgcmVzdWx0ID0gMTsgIC8qIEpGSUYsIEVYSUYsIEpQRUctTFMsIGNvZGVzdHJlYW0sIGV0Yy4gKi8KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgIHJldHVybiAwOyAgLyogbm90IEpQRUcgKi8KLSAgIH0KLSAgIGVsc2UgaWYgKG1lbWNtcChzaWcsIGpwZWdfc2lnX2pwMiwgSlBFR19TSUdfSlAyX1NJWkUpID09IDAgfHwKLSAgICAgICAgICAgIG1lbWNtcChzaWcsIGpwZWdfc2lnX2pwYywgSlBFR19TSUdfSlBDX1NJWkUpID09IDApCi0gICB7Ci0gICAgICBmbXQgPSAiSlBFRy0yMDAwIjsKLSAgICAgIHJlc3VsdCA9IDI7ICAvKiAuanAyIG9yIEpQRUctMjAwMCBjb2Rlc3RyZWFtICovCi0gICB9Ci0gICBlbHNlIGlmIChtZW1jbXAoc2lnLCBqcGVnX3NpZ19qbmcsIEpQRUdfU0lHX0pOR19TSVpFKSA9PSAwIHx8Ci0gICAgICAgICAgICBtZW1jbXAoc2lnLCBqcGVnX3NpZ19qbmdfamhkciwgSlBFR19TSUdfSk5HX1NJWkUpID09IDApCi0gICB7Ci0gICAgICBmbXQgPSAiSk5HIjsKLSAgICAgIHJlc3VsdCA9IDM7ICAvKiBKTkcsIHN0YW5kYWxvbmUgb3IgZGF0YXN0cmVhbSAqLwotICAgfQotICAgZWxzZQotICAgICAgcmV0dXJuIDA7ICAvKiBub3QgSlBFRyAqLwotCi0gICAvKiBTdG9yZSB0aGUgZm9ybWF0IG5hbWUuICovCi0gICBpZiAoZm10X25hbWVfcHRyICE9IE5VTEwpCi0gICAgICAqZm10X25hbWVfcHRyID0gZm10OwotICAgaWYgKGZtdF9sb25nX25hbWVfcHRyICE9IE5VTEwpCi0gICAgICAqZm10X2xvbmdfbmFtZV9wdHIgPSBmbXQ7Ci0gICByZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgLyogUFJJVkFURSAqLwotcG5neF9yZWFkX2pwZWcocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBGSUxFICpzdHJlYW0pCi17Ci0gICBwbmdfYnl0ZSBidWZbSlBFR19TSUdfU0laRV9NQVhdOwotICAgaW50IHNpZ19jb2RlOwotCi0gICBpZiAoZnJlYWQoYnVmLCBKUEVHX1NJR19TSVpFX01BWCwgMSwgc3RyZWFtKSAhPSAxKQotICAgICAgcmV0dXJuIDA7ICAvKiBub3QgYSBKUEVHIGZpbGUgKi8KLSAgIHNpZ19jb2RlID0gcG5neF9zaWdfaXNfanBlZyhidWYsIEpQRUdfU0lHX1NJWkVfTUFYLCBOVUxMLCBOVUxMKTsKLSAgIC8qIFRPRE86IFVzZSB0aGUgZm9ybWF0IG5hbWVzIHBhc3NlZCBieSBwbmd4X3NpZ19pc19qcGVnLiAqLwotICAgc3dpdGNoIChzaWdfY29kZSkKLSAgIHsKLSAgIGNhc2UgMToKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSlBFRyBkZWNvZGluZyBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAvKiBOT1RSRUFDSEVEICovCi0gICAgICBicmVhazsKLSAgIGNhc2UgMjoKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSlBFRy0yMDAwIGRlY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KLSAgICAgIGJyZWFrOwotICAgY2FzZSAzOgotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJKTkcgKEpQRUcpIGRlY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KLSAgICAgIGJyZWFrOwotICAgfQotICAgaWYgKGluZm9fcHRyID09IE5VTEwpICAvKiBkdW1teSwga2VlcCBjb21waWxlcnMgaGFwcHkgKi8KLSAgICAgIHJldHVybiAwOwotICAgcmV0dXJuIDA7ICAvKiBhbHdheXMgZmFpbCAqLwotfQpkaWZmIC0tZ2l0IGEvc3JjL3BuZ3h0ZXJuL3BuZ3hycG5tLmMgYi9zcmMvcG5neHRlcm4vcG5neHJwbm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZlODgwNC4uMDAwMDAwMAotLS0gYS9zcmMvcG5neHRlcm4vcG5neHJwbm0uYworKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKgotICogcG5neHJwbm0uYyAtIGxpYnBuZyBleHRlcm5hbCBJL086IFBOTSByZWFkZXIuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMiBDb3NtaW4gVHJ1dGEuCi0gKi8KLQotI2luY2x1ZGUgInBuZ3h0ZXJuLmgiCi0jaW5jbHVkZSAicG5neHV0aWwuaCIKLSNpbmNsdWRlICJwbm1pby5oIgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgUE5HWF9JTlRFUk5BTAotI2luY2x1ZGUgInBuZ3hwcml2LmgiCi0KLQotI2lmIFVJTlRfTUFYID49IDB4N2ZmZmZmZmZVTAotI2RlZmluZSBQTkdYX1BOTV9MRU5HVEhfTUFYIDB4N2ZmZmZmZmZVCi0jZWxzZQotI2RlZmluZSBQTkdYX1BOTV9MRU5HVEhfTUFYIFVJTlRfTUFYCi0jZW5kaWYKLQotCi1zdGF0aWMgY29uc3QgY2hhciBwYm1fZm10X25hbWVbXSA9ICJQQk0iOwotc3RhdGljIGNvbnN0IGNoYXIgcGdtX2ZtdF9uYW1lW10gPSAiUEdNIjsKLXN0YXRpYyBjb25zdCBjaGFyIHBwbV9mbXRfbmFtZVtdID0gIlBQTSI7Ci1zdGF0aWMgY29uc3QgY2hhciBwYW1fZm10X25hbWVbXSA9ICJQQU0iOwotc3RhdGljIGNvbnN0IGNoYXIgcGJtX2ZtdF9sb25nX25hbWVbXSA9ICJQb3J0YWJsZSBCaXRtYXAiOwotc3RhdGljIGNvbnN0IGNoYXIgcGdtX2ZtdF9sb25nX25hbWVbXSA9ICJQb3J0YWJsZSBHcmF5bWFwIjsKLXN0YXRpYyBjb25zdCBjaGFyIHBwbV9mbXRfbG9uZ19uYW1lW10gPSAiUG9ydGFibGUgUGl4bWFwIjsKLXN0YXRpYyBjb25zdCBjaGFyIHBhbV9mbXRfbG9uZ19uYW1lW10gPSAiUG9ydGFibGUgQW55bWFwIjsKLQotCi1pbnQgLyogUFJJVkFURSAqLwotcG5neF9zaWdfaXNfcG5tKHBuZ19ieXRlcCBzaWcsIHNpemVfdCBzaWdfc2l6ZSwKLSAgICAgICAgICAgICAgICBwbmdfY29uc3RfY2hhcnBwIGZtdF9uYW1lX3B0ciwKLSAgICAgICAgICAgICAgICBwbmdfY29uc3RfY2hhcnBwIGZtdF9sb25nX25hbWVfcHRyKQotewotICAgc3RhdGljIGNvbnN0IGNoYXIgKmZtdF9uYW1lc1tdID0KLSAgIHsKLSAgICAgIHBibV9mbXRfbmFtZSwgcGdtX2ZtdF9uYW1lLCBwcG1fZm10X25hbWUsCi0gICAgICBwYm1fZm10X25hbWUsIHBnbV9mbXRfbmFtZSwgcHBtX2ZtdF9uYW1lLAotICAgICAgcGFtX2ZtdF9uYW1lCi0gICB9OwotICAgc3RhdGljIGNvbnN0IGNoYXIgKmZtdF9sb25nX25hbWVzW10gPQotICAgewotICAgICAgcGJtX2ZtdF9sb25nX25hbWUsIHBnbV9mbXRfbG9uZ19uYW1lLCBwcG1fZm10X2xvbmdfbmFtZSwKLSAgICAgIHBibV9mbXRfbG9uZ19uYW1lLCBwZ21fZm10X2xvbmdfbmFtZSwgcHBtX2ZtdF9sb25nX25hbWUsCi0gICAgICBwYW1fZm10X2xvbmdfbmFtZQotICAgfTsKLQotICAgLyogUmVxdWlyZSBhdCBsZWFzdCB0aGUgUE5NIG1hZ2ljIHNpZ25hdHVyZSBhbmQgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovCi0gICBpZiAoc2lnX3NpemUgPCA0KQotICAgICAgcmV0dXJuIC0xOyAgLyogaW5zdWZmaWNpZW50IGRhdGEgKi8KLSAgIGlmIChzaWdbMF0gIT0gJ1AnIHx8IHNpZ1sxXSA8ICcxJyB8fCBzaWdbMV0gPiAnNycpCi0gICAgICByZXR1cm4gMDsgIC8qIG5vdCBQTk0gKi8KLSAgIGlmIChzaWdbMl0gIT0gJyAnICYmIHNpZ1syXSAhPSAnXHQnICYmIHNpZ1syXSAhPSAnXG4nICYmIHNpZ1syXSAhPSAnXHInICYmCi0gICAgICAgc2lnWzJdICE9ICcjJykKLSAgICAgIHJldHVybiAwOyAgLyogbm90IFBOTSAqLwotCi0gICAvKiBTdG9yZSB0aGUgZm9ybWF0IG5hbWUuICovCi0gICBpZiAoZm10X25hbWVfcHRyICE9IE5VTEwpCi0gICAgICAqZm10X25hbWVfcHRyID0gZm10X25hbWVzW3NpZ1sxXSAtICcxJ107Ci0gICBpZiAoZm10X2xvbmdfbmFtZV9wdHIgIT0gTlVMTCkKLSAgICAgICpmbXRfbG9uZ19uYW1lX3B0ciA9IGZtdF9sb25nX25hbWVzW3NpZ1sxXSAtICcxJ107Ci0gICByZXR1cm4gMTsgIC8qIFBOTSAqLwotfQotCi1zdGF0aWMgaW50Ci1wbm1fZnBlZWtfZW9mKHBubV9zdHJ1Y3QgKnBubV9wdHIsIEZJTEUgKnN0cmVhbSkKLXsKLSAgIGludCBjaDsKLQotICAgaWYgKHBubV9wdHItPmZvcm1hdCA+PSBQTk1fUDEgJiYgcG5tX3B0ci0+Zm9ybWF0IDw9IFBOTV9QMykKLSAgIHsKLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgICBjaCA9IGdldGMoc3RyZWFtKTsKLSAgICAgICAgIGlmIChjaCA9PSAnIycpICAvKiBza2lwIGNvbW1lbnRzICovCi0gICAgICAgICB7Ci0gICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgY2ggPSBnZXRjKHN0cmVhbSk7Ci0gICAgICAgICAgICB3aGlsZSAoY2ggIT0gRU9GICYmIGNoICE9ICdcbicgJiYgY2ggIT0gJ1xyJyk7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoY2ggPT0gRU9GKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9IHdoaWxlIChjaCA9PSAnICcgfHwgY2ggPT0gJ1x0JyB8fCBjaCA9PSAnXG4nIHx8IGNoID09ICdccicpOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgY2ggPSBnZXRjKHN0cmVhbSk7Ci0gICAgICBpZiAoY2ggPT0gRU9GKQotICAgICAgICAgcmV0dXJuIDE7Ci0gICB9Ci0KLSAgIHVuZ2V0YyhjaCwgc3RyZWFtKTsKLSAgIHJldHVybiAwOwotfQotCi1pbnQgLyogUFJJVkFURSAqLwotcG5neF9yZWFkX3BubShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIEZJTEUgKnN0cmVhbSkKLXsKLSAgIHBubV9zdHJ1Y3QgcG5taW5mbzsKLSAgIHVuc2lnbmVkIGludCBmb3JtYXQsIGRlcHRoLCB3aWR0aCwgaGVpZ2h0LCBtYXh2YWw7Ci0gICB1bnNpZ25lZCBpbnQgbWF4X3dpZHRoLCBudW1fc2FtcGxlcywgc2FtcGxlX3NpemU7Ci0gICB1bnNpZ25lZCBpbnQgKnBubXJvdzsKLSAgIHNpemVfdCByb3dfc2l6ZTsKLSAgIHBuZ19ieXRlcHAgcm93X3BvaW50ZXJzOwotICAgcG5nX2NvbG9yXzggc2lnX2JpdDsKLSAgIHVuc2lnbmVkIGludCBpLCBqOwotICAgaW50IGZhaWxlZCwgb3ZlcmZsb3c7Ci0KLSAgIC8qIFJlYWQgdGhlIFBOTSBoZWFkZXIuICovCi0gICBpZiAocG5tX2ZnZXRfaGVhZGVyKCZwbm1pbmZvLCBzdHJlYW0pICE9IDEpCi0gICAgICByZXR1cm4gMDsgIC8qIG5vdCBQTk0gKi8KLSAgIGZvcm1hdCA9IHBubWluZm8uZm9ybWF0OwotICAgZGVwdGggPSBwbm1pbmZvLmRlcHRoOwotICAgd2lkdGggPSBwbm1pbmZvLndpZHRoOwotICAgaGVpZ2h0ID0gcG5taW5mby5oZWlnaHQ7Ci0gICBtYXh2YWwgPSBwbm1pbmZvLm1heHZhbDsKLSAgIGlmIChmb3JtYXQgPiBQTk1fUDYpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkNhbid0IGhhbmRsZSBQTk0gZm9ybWF0cyBuZXdlciB0aGFuIFBQTSAoXCJQNlwiKSIpOwotICAgbWF4X3dpZHRoID0KLSAgICAgIChzaXplb2Yoc2l6ZV90KSA8PSBzaXplb2YodW5zaWduZWQgaW50KSkgPwotICAgICAgICAgVUlOVF9NQVggLyBzaXplb2YodW5zaWduZWQgaW50KSAvIGRlcHRoIDogVUlOVF9NQVg7Ci0jaWYgVUlOVF9NQVggPiBQTkdYX1BOTV9MRU5HVEhfTUFYCi0gICBpZiAobWF4X3dpZHRoID4gUE5HWF9QTk1fTEVOR1RIX01BWCkKLSAgICAgIG1heF93aWR0aCA9IFBOR1hfUE5NX0xFTkdUSF9NQVg7Ci0jZW5kaWYKLSAgIGlmICh3aWR0aCA+IG1heF93aWR0aCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiQ2FuJ3QgaGFuZGxlIGV4Y2VlZGluZ2x5IGxhcmdlIFBOTSBkaW1lbnNpb25zIik7Ci0gICBzYW1wbGVfc2l6ZSA9IDE7Ci0gICByb3dfc2l6ZSA9IG51bV9zYW1wbGVzID0gZGVwdGggKiB3aWR0aDsKLSAgIGlmIChtYXh2YWwgPiA2NTUzNSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiQ2FuJ3QgaGFuZGxlIFBOTSBzYW1wbGVzIGxhcmdlciB0aGFuIDE2IGJpdHMiKTsKLSAgIGVsc2UgaWYgKG1heHZhbCA+IDI1NSkKLSAgIHsKLSAgICAgIHNhbXBsZV9zaXplID0gMjsKLSAgICAgIHJvd19zaXplICo9IDI7Ci0gICB9Ci0KLSAgIC8qIFNldCB0aGUgUE5HIGltYWdlIHR5cGUuICovCi0gICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICB3aWR0aCwgaGVpZ2h0LAotICAgICAgKG1heHZhbCA8PSAyNTUpID8gOCA6IDE2LAotICAgICAgKGRlcHRoID09IDEpID8gUE5HX0NPTE9SX1RZUEVfR1JBWSA6IFBOR19DT0xPUl9UWVBFX1JHQiwKLSAgICAgIFBOR19JTlRFUkxBQ0VfTk9ORSwgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSwgUE5HX0ZJTFRFUl9UWVBFX0JBU0UpOwotICAgZm9yIChpID0gMSwgaiA9IDI7IGogLSAxIDwgbWF4dmFsOyArK2ksIGogPDw9IDEpIHsgfQotICAgaWYgKGogLSAxICE9IG1heHZhbCkKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAiUG9zc2libHkgaW5leGFjdCBzYW1wbGUgY29udmVyc2lvbiBmcm9tIFBOTSB0byBQTkciKTsKLSAgIGVsc2UgaWYgKGkgJSA4ICE9IDAgJiYgKGRlcHRoID4gMSB8fCA4ICUgaSAhPSAwKSkKLSAgIHsKLSAgICAgIHNpZ19iaXQucmVkID0gc2lnX2JpdC5ncmVlbiA9IHNpZ19iaXQuYmx1ZSA9IHNpZ19iaXQuZ3JheSA9IChwbmdfYnl0ZSlpOwotICAgICAgc2lnX2JpdC5hbHBoYSA9IDA7Ci0gICAgICBwbmdfc2V0X3NCSVQocG5nX3B0ciwgaW5mb19wdHIsICZzaWdfYml0KTsKLSAgIH0KLQotICAgLyogQWxsb2NhdGUgbWVtb3J5LiAqLwotICAgcm93X3BvaW50ZXJzID0gcG5neF9tYWxsb2Nfcm93cyhwbmdfcHRyLCBpbmZvX3B0ciwgLTEpOwotICAgaWYgKChmb3JtYXQgPj0gUE5NX1A0KSAmJiAobWF4dmFsID09IDI1NSB8fCBtYXh2YWwgPT0gNjU1MzUpKQotICAgICAgcG5tcm93ID0gTlVMTDsgIC8qIGNhbiByZWFkIHJhdyBkYXRhIGRpcmVjdGx5IGludG8gcm93X3BvaW50ZXJzICovCi0gICBlbHNlCi0gICAgICBwbm1yb3cgPSAodW5zaWduZWQgaW50ICopCi0gICAgICAgICBwbmdfbWFsbG9jKHBuZ19wdHIsIG51bV9zYW1wbGVzICogc2l6ZW9mKHVuc2lnbmVkIGludCkpOwotCi0gICAvKiBSZWFkIHRoZSBpbWFnZSBkYXRhLiAqLwotICAgZmFpbGVkID0gMDsKLSAgIG92ZXJmbG93ID0gMDsKLSAgIGlmIChwbm1yb3cgIT0gTlVMTCkKLSAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkKLSAgICAgIHsKLSAgICAgICAgIGlmIChwbm1fZmdldF92YWx1ZXMoJnBubWluZm8sIHBubXJvdywgMSwgc3RyZWFtKSA8PSAwKQotICAgICAgICAgICAgZmFpbGVkID0gMTsKLSAgICAgICAgIC8qIFRyYW5zZmVyIHRoZSBzYW1wbGVzLCBldmVuIG9uIHBhcnRpYWwgKHVuc3VjY2Vzc2Z1bCkgcmVhZHMuICovCi0gICAgICAgICBpZiAobWF4dmFsIDw9IDI1NSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fc2FtcGxlczsgKytqKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9IHBubXJvd1tqXTsKLSAgICAgICAgICAgICAgIGlmICh2YWwgPiBtYXh2YWwpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB2YWwgPSAyNTU7Ci0gICAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IDE7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlIGlmIChtYXh2YWwgIT0gMjU1KQotICAgICAgICAgICAgICAgICAgdmFsID0gKHZhbCAqIDI1NSArIG1heHZhbC8yKSAvIG1heHZhbDsKLSAgICAgICAgICAgICAgIHJvd19wb2ludGVyc1tpXVtqXSA9IChwbmdfYnl0ZSl2YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlICAvKiBtYXh2YWwgPiAyNTUgKi8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fc2FtcGxlczsgKytqKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgdmFsID0gcG5tcm93W2pdOwotICAgICAgICAgICAgICAgaWYgKHZhbCA+IG1heHZhbCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHZhbCA9IDY1NTM1OwotICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSAxOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZSBpZiAobWF4dmFsICE9IDY1NTM1KQotICAgICAgICAgICAgICAgICAgdmFsID0gKHZhbCAqIDY1NTM1ICsgbWF4dmFsLzIpIC8gbWF4dmFsOwotICAgICAgICAgICAgICAgcm93X3BvaW50ZXJzW2ldWzIgKiBqXSA9IChwbmdfYnl0ZSkodmFsID4+IDgpOwotICAgICAgICAgICAgICAgcm93X3BvaW50ZXJzW2ldWzIgKiBqICsgMV0gPSAocG5nX2J5dGUpKHZhbCAmIDB4ZmYpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgaWYgKGZhaWxlZCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgfQotICAgZWxzZSAgLyogcmVhZCB0aGUgcmF3IGRhdGEgZGlyZWN0bHkgKi8KLSAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkKLSAgICAgIHsKLSAgICAgICAgIGlmIChwbm1fZmdldF9ieXRlcygmcG5taW5mbywKLSAgICAgICAgICAgICByb3dfcG9pbnRlcnNbaV0sIHNhbXBsZV9zaXplLCAxLCBzdHJlYW0pIDw9IDApCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmYWlsZWQgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIFdpcGUgb3V0IHRoZSBwb3J0aW9uIGxlZnQgdW5yZWFkLiAqLwotICAgZm9yICggOyBpIDwgaGVpZ2h0OyArK2kpCi0gICAgICBtZW1zZXQocm93X3BvaW50ZXJzW2ldLCAwLCByb3dfc2l6ZSk7Ci0KLSAgIC8qIERlYWxsb2NhdGUgdGhlIHRlbXBvcmFyeSByb3cgYnVmZmVyLiAqLwotICAgaWYgKHBubXJvdyAhPSBOVUxMKQotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5tcm93KTsKLQotICAgLyogQ2hlY2sgdGhlIHJlc3VsdHMuICovCi0gICBpZiAob3ZlcmZsb3cpCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3ZlcmZsb3cgaW4gUE5NIHNhbXBsZXMiKTsKLSAgIGlmIChmYWlsZWQpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkVycm9yIGluIFBOTSBpbWFnZSBmaWxlIik7Ci0gICBlbHNlIGlmICghcG5tX2ZwZWVrX2VvZigmcG5taW5mbywgc3RyZWFtKSkKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJFeHRyYW5lb3VzIGRhdGEgZm91bmQgYWZ0ZXIgUE5NIGltYWdlIik7Ci0gICAvKiBGSVhNRTogQSBQTk0gZmlsZSBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIGltYWdlLiAqLwotCi0gICByZXR1cm4gMTsgIC8qIG9uZSBpbWFnZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVhZCAqLwotfQpkaWZmIC0tZ2l0IGEvc3JjL3BuZ3h0ZXJuL3BuZ3hydGlmLmMgYi9zcmMvcG5neHRlcm4vcG5neHJ0aWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5NjhiYS4uMDAwMDAwMAotLS0gYS9zcmMvcG5neHRlcm4vcG5neHJ0aWYuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogcG5neHJ0aWYuYyAtIGxpYnBuZyBleHRlcm5hbCBJL086IFRJRkYgcmVhZGVyLgotICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTIgQ29zbWluIFRydXRhLgotICovCi0KLSNpbmNsdWRlICJwbmd4dGVybi5oIgotI2luY2x1ZGUgInBuZ3h1dGlsLmgiCi0jaW5jbHVkZSAibWluaXRpZmYuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIFBOR1hfSU5URVJOQUwKLSNpbmNsdWRlICJwbmd4cHJpdi5oIgotCi0KLS8qCi0gKiBUaGUgVElGRiBmb3JtYXQgbmFtZS4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgdGlmZl9mbXRfbmFtZVtdID0gIlRJRkYiOwotc3RhdGljIGNvbnN0IGNoYXIgdGlmZl9mbXRfbG9uZ19uYW1lW10gPSAiVGFnZ2VkIEltYWdlIEZpbGUgRm9ybWF0IjsKLQotCi1pbnQgLyogUFJJVkFURSAqLwotcG5neF9zaWdfaXNfdGlmZihwbmdfYnl0ZXAgc2lnLCBzaXplX3Qgc2lnX3NpemUsCi0gICAgICAgICAgICAgICAgIHBuZ19jb25zdF9jaGFycHAgZm10X25hbWVfcHRyLAotICAgICAgICAgICAgICAgICBwbmdfY29uc3RfY2hhcnBwIGZtdF9sb25nX25hbWVfcHRyKQotewotICAgLyogUmVxdWlyZSBhdCBsZWFzdCB0aGUgVElGRiBzaWduYXR1cmUuICovCi0gICBpZiAoc2lnX3NpemUgPCA4KQotICAgICAgcmV0dXJuIC0xOyAgLyogaW5zdWZmaWNpZW50IGRhdGEgKi8KLSAgIGlmIChtZW1jbXAoc2lnLCBtaW5pdGlmZl9zaWdfbSwgNCkgIT0gMCAmJgotICAgICAgIG1lbWNtcChzaWcsIG1pbml0aWZmX3NpZ19pLCA0KSAhPSAwKQotICAgICAgcmV0dXJuIDA7ICAvKiBub3QgVElGRiAqLwotCi0gICAvKiBTdG9yZSB0aGUgZm9ybWF0IG5hbWUuICovCi0gICBpZiAoZm10X25hbWVfcHRyICE9IE5VTEwpCi0gICAgICAqZm10X25hbWVfcHRyID0gdGlmZl9mbXRfbmFtZTsKLSAgIGlmIChmbXRfbG9uZ19uYW1lX3B0ciAhPSBOVUxMKQotICAgICAgKmZtdF9sb25nX25hbWVfcHRyID0gdGlmZl9mbXRfbG9uZ19uYW1lOwotICAgcmV0dXJuIDE7ICAvKiBUSUZGICovCi19Ci0KLQotLyogRklYTUU6IE5vdCB0aHJlYWQtc2FmZS4gKi8KLXN0YXRpYyBwbmdfc3RydWN0cCBlcnJfcG5nX3B0ciA9IE5VTEw7Ci1zdGF0aWMgdW5zaWduZWQgaW50IG51bV9leHRyYV9pbWFnZXM7Ci0KLXN0YXRpYyB2b2lkIHBuZ3hfdGlmZl9lcnJvcihjb25zdCBjaGFyICptc2cpCi17Ci0gICBwbmdfZXJyb3IoZXJyX3BuZ19wdHIsIG1zZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBuZ3hfdGlmZl93YXJuaW5nKGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgIC8qIEZJWE1FOgotICAgICogSW5zcGVjdGlvbiBvZiB3YXJuaW5nIG1lc3NhZ2VzIGlzIGZyYWdpbGUsIGJ1dCBpcwotICAgICogcmVxdWlyZWQgYnkgdGhlIGxpbWl0YXRpb25zIG9mIG1pbml0aWZmIHZlcnNpb24gMC4xLgotICAgICovCi0gICBpZiAoc3Ryc3RyKG1zZywgIm11bHRpLWltYWdlIikgIT0gTlVMTCkKLSAgICAgICsrbnVtX2V4dHJhX2ltYWdlczsKLQotI2lmIDAKLSAgIC8qIE1ldGFkYXRhIGlzIG5vdCBpbXBvcnRlZCwgc28gd2FybmluZ3MgbmVlZCBub3QgYmUgc2hvd24uICovCi0gICBwbmdfd2FybmluZyhlcnJfcG5nX3B0ciwgbXNnKTsKLSNlbmRpZgotfQotCi0KLWludCAvKiBQUklWQVRFICovCi1wbmd4X3JlYWRfdGlmZihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIEZJTEUgKnN0cmVhbSkKLXsKLSAgIHN0cnVjdCBtaW5pdGlmZl9pbmZvIHRpZmZfaW5mbzsKLSAgIHVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0LCBwaXhlbF9zaXplLCBzYW1wbGVfZGVwdGgsIHNhbXBsZV9tYXg7Ci0gICBpbnQgY29sb3JfdHlwZTsKLSAgIGludCBzYW1wbGVfb3ZlcmZsb3c7Ci0gICBwbmdfYnl0ZXBwIHJvd19wb2ludGVyczsKLSAgIHBuZ19ieXRlcCByb3c7Ci0gICB1bnNpZ25lZCBpbnQgaSwgaiwgazsKLQotICAgZXJyX3BuZ19wdHIgPSBwbmdfcHRyOwotICAgbnVtX2V4dHJhX2ltYWdlcyA9IDA7Ci0gICBtaW5pdGlmZl9pbml0X2luZm8oJnRpZmZfaW5mbyk7Ci0gICB0aWZmX2luZm8uZXJyb3JfaGFuZGxlciA9IHBuZ3hfdGlmZl9lcnJvcjsKLSAgIHRpZmZfaW5mby53YXJuaW5nX2hhbmRsZXIgPSBwbmd4X3RpZmZfd2FybmluZzsKLSAgIG1pbml0aWZmX3JlYWRfaW5mbygmdGlmZl9pbmZvLCBzdHJlYW0pOwotICAgbWluaXRpZmZfdmFsaWRhdGVfaW5mbygmdGlmZl9pbmZvKTsKLQotICAgd2lkdGggPSAodW5zaWduZWQgaW50KXRpZmZfaW5mby53aWR0aDsKLSAgIGhlaWdodCA9ICh1bnNpZ25lZCBpbnQpdGlmZl9pbmZvLmhlaWdodDsKLSAgIHBpeGVsX3NpemUgPSB0aWZmX2luZm8uc2FtcGxlc19wZXJfcGl4ZWw7Ci0gICBzYW1wbGVfZGVwdGggPSB0aWZmX2luZm8uYml0c19wZXJfc2FtcGxlOwotICAgc3dpdGNoIChwaXhlbF9zaXplKQotICAgewotICAgY2FzZSAxOgotICAgICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX0dSQVk7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgMjoKLSAgICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIDM6Ci0gICAgICBjb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIDQ6Ci0gICAgICBjb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOwotICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJVbnN1cHBvcnRlZCBUSUZGIGNvbG9yIHNwYWNlIik7Ci0gICAgICAvKiBOT1RSRUFDSEVEICovCi0gICAgICByZXR1cm4gMDsgIC8qIGF2b2lkICJ1bmluaXRpYWxpemVkIGNvbG9yX3R5cGUiIHdhcm5pbmcgKi8KLSAgIH0KLSAgIGlmIChzYW1wbGVfZGVwdGggPiAxNikKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVW5zdXBwb3J0ZWQgVElGRiBzYW1wbGUgZGVwdGgiKTsKLSAgIHNhbXBsZV9tYXggPSAoMSA8PCBzYW1wbGVfZGVwdGgpIC0gMTsKLSAgIHNhbXBsZV9vdmVyZmxvdyA9IDA7Ci0KLSAgIHBuZ19zZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgd2lkdGgsIGhlaWdodCwKLSAgICAgIChzYW1wbGVfZGVwdGggPD0gOCkgPyA4IDogMTYsCi0gICAgICBjb2xvcl90eXBlLAotICAgICAgUE5HX0lOVEVSTEFDRV9OT05FLCBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFLCBQTkdfRklMVEVSX1RZUEVfQkFTRSk7Ci0gICByb3dfcG9pbnRlcnMgPSBwbmd4X21hbGxvY19yb3dzKHBuZ19wdHIsIGluZm9fcHRyLCAwKTsKLQotICAgaWYgKHNhbXBsZV9kZXB0aCA8PSA4KQotICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgKytpKQotICAgICAgewotICAgICAgICAgcm93ID0gcm93X3BvaW50ZXJzW2ldOwotICAgICAgICAgbWluaXRpZmZfcmVhZF9yb3coJnRpZmZfaW5mbywgcm93LCBpLCBzdHJlYW0pOwotICAgICAgICAgaWYgKHNhbXBsZV9kZXB0aCA8IDgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGl4ZWxfc2l6ZSAqIHdpZHRoOyArK2opCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYiA9IHJvd1tqXTsKLSAgICAgICAgICAgICAgIGlmIChiID4gc2FtcGxlX21heCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGIgPSBzYW1wbGVfbWF4OwotICAgICAgICAgICAgICAgICAgc2FtcGxlX292ZXJmbG93ID0gMTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIHJvd1tqXSA9IChwbmdfYnl0ZSkoKGIgKiAyNTUgKyBzYW1wbGVfbWF4IC8gMikgLyBzYW1wbGVfbWF4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIGlmICh0aWZmX2luZm8ucGhvdG9tZXRyaWMgPT0gMCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwaXhlbF9zaXplICogd2lkdGg7ICsraikKLSAgICAgICAgICAgICAgIHJvd1tqXSA9IChwbmdfYnl0ZSkoMjU1IC0gcm93W2pdKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkKLSAgICAgIHsKLSAgICAgICAgIHJvdyA9IHJvd19wb2ludGVyc1tpXTsKLSAgICAgICAgIG1pbml0aWZmX3JlYWRfcm93KCZ0aWZmX2luZm8sIHJvdywgaSwgc3RyZWFtKTsKLSAgICAgICAgIGlmICh0aWZmX2luZm8uYnl0ZV9vcmRlciA9PSAnSScpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKiAiSW50ZWwiIGJ5dGUgb3JkZXIgPT4gc3dhcCByb3cgYnl0ZXMgKi8KLSAgICAgICAgICAgIGZvciAoaiA9IGsgPSAwOyBqIDwgcGl4ZWxfc2l6ZSAqIHdpZHRoOyArK2osIGsrPTIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZSBiID0gcm93W2tdOwotICAgICAgICAgICAgICAgcm93W2tdID0gcm93W2sgKyAxXTsKLSAgICAgICAgICAgICAgIHJvd1trICsgMV0gPSBiOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgaWYgKHNhbXBsZV9kZXB0aCA8IDE2KQotICAgICAgICAgewotICAgICAgICAgICAgZm9yIChqID0gayA9IDA7IGsgPCBwaXhlbF9zaXplICogd2lkdGg7ICsraiwgays9MikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBiID0gKHJvd1trXSA8PCA4KSArIHJvd1trICsgMV07Ci0gICAgICAgICAgICAgICBpZiAoYiA+IHNhbXBsZV9tYXgpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBiID0gc2FtcGxlX21heDsKLSAgICAgICAgICAgICAgICAgIHNhbXBsZV9vdmVyZmxvdyA9IDE7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBiID0gKGIgKiA2NTUzNVUgKyBzYW1wbGVfbWF4IC8gMikgLyBzYW1wbGVfbWF4OwotICAgICAgICAgICAgICAgcm93W2tdID0gKHBuZ19ieXRlKShiID4+IDgpOwotICAgICAgICAgICAgICAgcm93W2sgKyAxXSA9IChwbmdfYnl0ZSkoYiAmIDI1NSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0KLSAgIGlmIChzYW1wbGVfb3ZlcmZsb3cpCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3ZlcmZsb3cgaW4gVElGRiBzYW1wbGVzIik7Ci0KLSAgIG1pbml0aWZmX2Rlc3Ryb3lfaW5mbygmdGlmZl9pbmZvKTsKLSAgIHJldHVybiAxICsgbnVtX2V4dHJhX2ltYWdlczsKLX0KZGlmZiAtLWdpdCBhL3NyYy9wbmd4dGVybi9wbmd4c2V0LmMgYi9zcmMvcG5neHRlcm4vcG5neHNldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RmY2JjLi4wMDAwMDAwCi0tLSBhL3NyYy9wbmd4dGVybi9wbmd4c2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogcG5neHNldC5jIC0gbGlicG5nIGV4dGVuc2lvbjogYWRkaXRpb25hbCBpbWFnZSBpbmZvIHN0b3JhZ2UuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMTEgQ29zbWluIFRydXRhLgotICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNpbmcgYW5kIHdhcnJhbnR5IHRlcm1zCi0gKiBhcyBsaWJwbmcuCi0gKi8KLQotI2luY2x1ZGUgInBuZ3h1dGlsLmgiCi0KLQotLyoKLSAqIE5PVEU6Ci0gKiBUaGVyZSBpcyBhIGRpc2NyZXBhbmN5IGJldHdlZW4gdGhlIHBhcmFtZXRlciBuYW1lcyB1c2VkIGluCi0gKiB0aGlzIG1vZHVsZSB2cy4gdGhlIFBORyBzcGVjaWZpY2F0aW9uLgotICogVGhlIFBORyBzcGVjaWZpY2F0aW9uIHVzZXMgdGhlIHRlcm1zICJjb21wcmVzc2lvbiBtZXRob2QiLAotICogImZpbHRlciBtZXRob2QiIGFuZCAiaW50ZXJsYWNlIG1ldGhvZCIsIHdoaWxlIHRoaXMgbW9kdWxlCi0gKiB1c2VzIHRoZSB0ZXJtcywgcmVzcGVjdGl2ZWx5LCAiY29tcHJlc3Npb24gdHlwZSIsICJmaWx0ZXIgdHlwZSIKLSAqIGFuZCAiaW50ZXJsYWNlIHR5cGUiLCBmb2xsb3dpbmcgdGhlIGxpYnBuZyBuYW1pbmcgY29udmVudGlvbnMuCi0gKi8KLQotdm9pZCBQTkdBUEkKLXBuZ3hfc2V0X2NvbXByZXNzaW9uX3R5cGUocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcHJlc3Npb25fdHlwZSkKLXsKLSAgIHBuZ191aW50XzMyIHdpZHRoLCBoZWlnaHQ7Ci0gICBpbnQgYml0X2RlcHRoLCBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZSwgZmlsdGVyX3R5cGU7Ci0gICBpbnQgb2xkX2NvbXByZXNzaW9uX3R5cGU7Ci0KLSAgIGlmICghcG5nX2dldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCAmd2lkdGgsICZoZWlnaHQsICZiaXRfZGVwdGgsCi0gICAgICAgJmNvbG9yX3R5cGUsICZpbnRlcmxhY2VfdHlwZSwgJm9sZF9jb21wcmVzc2lvbl90eXBlLCAmZmlsdGVyX3R5cGUpKQotICAgICAgcmV0dXJuOwotICAgaWYgKGNvbXByZXNzaW9uX3R5cGUgPT0gb2xkX2NvbXByZXNzaW9uX3R5cGUpCi0gICAgICByZXR1cm47Ci0gICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwKLSAgICAgIGNvbG9yX3R5cGUsIGludGVybGFjZV90eXBlLCBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfdHlwZSk7Ci19Ci0KLXZvaWQgUE5HQVBJCi1wbmd4X3NldF9maWx0ZXJfdHlwZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgZmlsdGVyX3R5cGUpCi17Ci0gICBwbmdfdWludF8zMiB3aWR0aCwgaGVpZ2h0OwotICAgaW50IGJpdF9kZXB0aCwgY29sb3JfdHlwZSwgaW50ZXJsYWNlX3R5cGUsIGNvbXByZXNzaW9uX3R5cGU7Ci0gICBpbnQgb2xkX2ZpbHRlcl90eXBlOwotCi0gICBpZiAoIXBuZ19nZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgJndpZHRoLCAmaGVpZ2h0LCAmYml0X2RlcHRoLAotICAgICAgICZjb2xvcl90eXBlLCAmaW50ZXJsYWNlX3R5cGUsICZjb21wcmVzc2lvbl90eXBlLCAmb2xkX2ZpbHRlcl90eXBlKSkKLSAgICAgIHJldHVybjsKLSAgIGlmIChmaWx0ZXJfdHlwZSA9PSBvbGRfZmlsdGVyX3R5cGUpCi0gICAgICByZXR1cm47Ci0gICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwKLSAgICAgIGNvbG9yX3R5cGUsIGludGVybGFjZV90eXBlLCBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfdHlwZSk7Ci19Ci0KLXZvaWQgUE5HQVBJCi1wbmd4X3NldF9pbnRlcmxhY2VfdHlwZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJsYWNlX3R5cGUpCi17Ci0gICBwbmdfdWludF8zMiB3aWR0aCwgaGVpZ2h0OwotICAgaW50IGJpdF9kZXB0aCwgY29sb3JfdHlwZSwgY29tcHJlc3Npb25fdHlwZSwgZmlsdGVyX3R5cGU7Ci0gICBpbnQgb2xkX2ludGVybGFjZV90eXBlOwotCi0gICBpZiAoIXBuZ19nZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgJndpZHRoLCAmaGVpZ2h0LCAmYml0X2RlcHRoLAotICAgICAgICZjb2xvcl90eXBlLCAmb2xkX2ludGVybGFjZV90eXBlLCAmY29tcHJlc3Npb25fdHlwZSwgJmZpbHRlcl90eXBlKSkKLSAgICAgIHJldHVybjsKLSAgIGlmIChpbnRlcmxhY2VfdHlwZSA9PSBvbGRfaW50ZXJsYWNlX3R5cGUpCi0gICAgICByZXR1cm47Ci0gICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwKLSAgICAgIGNvbG9yX3R5cGUsIGludGVybGFjZV90eXBlLCBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfdHlwZSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvcG5neHRlcm4vcG5neHRlcm4uaCBiL3NyYy9wbmd4dGVybi9wbmd4dGVybi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmNiMmU3Li4wMDAwMDAwCi0tLSBhL3NyYy9wbmd4dGVybi9wbmd4dGVybi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIHBuZ3h0ZXJuLmggLSBleHRlcm5hbCBmaWxlIGZvcm1hdCBwcm9jZXNzaW5nIGZvciBsaWJwbmcuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMTEgQ29zbWluIFRydXRhLgotICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNpbmcgYW5kIHdhcnJhbnR5IHRlcm1zCi0gKiBhcyBsaWJwbmcuCi0gKi8KLQotI2lmbmRlZiBQTkdYVEVSTl9ICi0jZGVmaW5lIFBOR1hURVJOX0gKLQotI2luY2x1ZGUgInBuZy5oIgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0vKgotICogUmVhZCB0aGUgY29udGVudHMgb2YgYW4gaW1hZ2UgZmlsZSBhbmQgc3RvcmUgaXQgaW50byB0aGUgZ2l2ZW4KLSAqIGxpYnBuZyBzdHJ1Y3R1cmVzLgotICoKLSAqIFRoZSBjdXJyZW50bHkgcmVjb2duaXplZCBmaWxlIGZvcm1hdHMgYXJlOgotICogUE5HIChzdGFuZGFsb25lKSwgUE5HIChkYXRhc3RyZWFtKSwgQk1QLCBHSUYsIFBOTSBhbmQgVElGRi4KLSAqCi0gKiBUaGUgZnVuY3Rpb24gcmVhZHMgZWl0aGVyIHRoZSBmaXJzdCBvciB0aGUgbW9zdCByZWxldmFudCBpbWFnZSwKLSAqIGRlcGVuZGluZyBvbiB0aGUgZm9ybWF0LiAgRm9yIGV4YW1wbGUsIGVtYmVkZGVkIHRodW1ibmFpbHMsIGlmCi0gKiBwcmVzZW50LCBhcmUgc2tpcHBlZC4KLSAqCi0gKiBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGltYWdlcyBjb250YWluZWQKLSAqIGJ5IHRoZSBpbWFnZSBmaWxlLCB3aGljaCBjYW4gYmUgZ3JlYXRlciB0aGFuIDEgZm9yIGZvcm1hdHMgbGlrZQotICogR0lGIG9yIFRJRkYuICBJZiB0aGUgZnVuY3Rpb24gZmluZHMgbW9yZSB0aGFuIG9uZSBpbWFnZSBidXQgZG9lcwotICogbm90IHBlcmZvcm0gYSBjb21wbGV0ZSBpbWFnZSBjb3VudCwgaXQgcmV0dXJucyBhbiB1cHBlciBib3VuZC4KLSAqIFRoZSBmdW5jdGlvbiBzdG9yZXMgdGhlIHNob3J0IGFuZC9vciB0aGUgbG9uZyBmb3JtYXQgbmFtZQotICogKGUuZy4gIlBQTSIsICJQb3J0YWJsZSBQaXhtYXAiKSBpbnRvIHRoZSBnaXZlbiBuYW1lIHBvaW50ZXJzLAotICogaWYgdGhleSBhcmUgbm9uLW51bGwuCi0gKgotICogSWYgdGhlIGZ1bmN0aW9uIGZhaWxzIHRvIGRldGVjdCBhIGtub3duIGZvcm1hdCwgaXQgcmV3aW5kcyB0aGUKLSAqIEZJTEUqIHN0cmVhbSBzdG9yZWQgaW4gaW9fcHRyIGFuZCByZXR1cm5zIDAuCi0gKiBPbiBvdGhlciBlcnJvcnMgKGUuZy4gcmVhZCBlcnJvciBvciBkZWNvZGluZyBlcnJvciksIHRoZSBmdW5jdGlvbgotICogaXNzdWVzIGEgcG5nX2Vycm9yKCkuCi0gKgotICogVGhpcyBmdW5jdGlvbiByZXF1aXJlcyBpb19wdHIgdG8gYmUgYSBmc2Vlay1hYmxlIEZJTEUqLgotICogSXQgZG9lcyBub3Qgd29yayB3aXRoIGdlbmVyaWMgSS9PIHJvdXRpbmVzLgotICovCi1pbnQgUE5HQVBJIHBuZ3hfcmVhZF9pbWFnZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29uc3RfY2hhcnBwIGZtdF9uYW1lX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb25zdF9jaGFycHAgZm10X2xvbmdfbmFtZV9wdHIpOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvKiBleHRlcm4gIkMiICovCi0jZW5kaWYKLQotCi0jZW5kaWYgLyogUE5HWFRFUk5fSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BuZ3h0ZXJuL3BuZ3h1dGlsLmggYi9zcmMvcG5neHRlcm4vcG5neHV0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2ZGU3ZS4uMDAwMDAwMAotLS0gYS9zcmMvcG5neHRlcm4vcG5neHV0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogcG5neHV0aWwuaCAtIGxpYnBuZyBleHRlbnNpb24gdXRpbGl0aWVzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMy0yMDExIENvc21pbiBUcnV0YS4KLSAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zaW5nIGFuZCB3YXJyYW50eSB0ZXJtcwotICogYXMgbGlicG5nLgotICovCi0KLSNpZm5kZWYgUE5HWFVUSUxfSAotI2RlZmluZSBQTkdYVVRJTF9ICi0KLSNpbmNsdWRlICJwbmcuaCIKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotLyogU3RvcmUgZGF0YSBpbnRvIHRoZSBpbmZvIHN0cnVjdHVyZS4gKi8KLXZvaWQgUE5HQVBJIHBuZ3hfc2V0X2NvbXByZXNzaW9uX3R5cGUKLSAgIChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIGludCBjb21wcmVzc2lvbl90eXBlKTsKLXZvaWQgUE5HQVBJIHBuZ3hfc2V0X2ZpbHRlcl90eXBlCi0gICAocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgZmlsdGVyX3R5cGUpOwotdm9pZCBQTkdBUEkgcG5neF9zZXRfaW50ZXJsYWNlX3R5cGUKLSAgIChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIGludCBpbnRlcmxhY2VfdHlwZSk7Ci0KLQotI2lmIFBOR19MSUJQTkdfVkVSID49IDEwNDAwCi10eXBlZGVmIHBuZ19hbGxvY19zaXplX3QgcG5neF9hbGxvY19zaXplX3Q7Ci0jZWxzZQotLyogQ29tcGF0aWJpbGl0eSBiYWNrcG9ydCBvZiBwbmdfYWxsb2Nfc2l6ZV90ICovCi10eXBlZGVmIHBuZ191aW50XzMyIHBuZ3hfYWxsb2Nfc2l6ZV90OwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfSU5GT19JTUFHRV9TVVBQT1JURUQKLS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHJvdyBwb2ludGVycy4KLSAqIFVzZSBmaWxsZXIgdG8gaW5pdGlhbGl6ZSB0aGUgcm93cyBpZiBpdCBpcyBub24tbmVnYXRpdmUuCi0gKiBPbiBzdWNjZXNzIHJldHVybiB0aGUgbmV3bHktYWxsb2NhdGVkIHJvdyBwb2ludGVycy4KLSAqIE9uIGZhaWx1cmUgaXNzdWUgYSBwbmdfZXJyb3IoKSBvciByZXR1cm4gTlVMTCwKLSAqIGRlcGVuZGluZyBvbiB0aGUgc3RhdHVzIG9mIFBOR19GTEFHX01BTExPQ19OVUxMX01FTV9PSy4KLSAqLwotcG5nX2J5dGVwcCBQTkdBUEkgcG5neF9tYWxsb2Nfcm93cwotICAgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50IGZpbGxlcik7Ci1wbmdfYnl0ZXBwIFBOR0FQSSBwbmd4X21hbGxvY19yb3dzX2V4dGVuZGVkCi0gICAocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgIHBuZ3hfYWxsb2Nfc2l6ZV90IG1pbl9yb3dfc2l6ZSwgaW50IGZpbGxlcik7Ci0jZW5kaWYKLQotCi0vKgotICogSS9PIHN0YXRlcyB3ZXJlIGludHJvZHVjZWQgaW4gbGlicG5nLTEuNC4wLCBidXQgdGhleSBjYW4gYmUgcmVsaWFibHkgdXNlZAotICogc3RhcnRpbmcgd2l0aCBsaWJwbmctMS40LjUgb25seS4KLSAqLwotI2lmIFBOR19MSUJQTkdfVkVSID49IDEwNDA1Ci0KLSNpZm5kZWYgUE5HX0lPX1NUQVRFX1NVUFBPUlRFRAotI2Vycm9yIFRoaXMgbW9kdWxlIHJlcXVpcmVzIGxpYnBuZyB3aXRoIFBOR19JT19TVEFURV9TVVBQT1JURUQKLSNlbmRpZgotCi0jZGVmaW5lIHBuZ3hfZ2V0X2lvX3N0YXRlICAgICAgIHBuZ19nZXRfaW9fc3RhdGUKLSNkZWZpbmUgcG5neF9nZXRfaW9fY2h1bmtfbmFtZSAgcG5nX2dldF9pb19jaHVua19uYW1lCi0jZGVmaW5lIHBuZ3hfc2V0X3JlYWRfZm4gICAgICAgIHBuZ19zZXRfcmVhZF9mbgotI2RlZmluZSBwbmd4X3NldF93cml0ZV9mbiAgICAgICBwbmdfc2V0X3dyaXRlX2ZuCi0jZGVmaW5lIHBuZ3hfd3JpdGVfc2lnICAgICAgICAgIHBuZ193cml0ZV9zaWcKLQotI2RlZmluZSBQTkdYX0lPX05PTkUgICAgICAgICAgICBQTkdfSU9fTk9ORQotI2RlZmluZSBQTkdYX0lPX1JFQURJTkcgICAgICAgICBQTkdfSU9fUkVBRElORwotI2RlZmluZSBQTkdYX0lPX1dSSVRJTkcgICAgICAgICBQTkdfSU9fV1JJVElORwotI2RlZmluZSBQTkdYX0lPX1NJR05BVFVSRSAgICAgICBQTkdfSU9fU0lHTkFUVVJFCi0jZGVmaW5lIFBOR1hfSU9fQ0hVTktfSERSICAgICAgIFBOR19JT19DSFVOS19IRFIKLSNkZWZpbmUgUE5HWF9JT19DSFVOS19EQVRBICAgICAgUE5HX0lPX0NIVU5LX0RBVEEKLSNkZWZpbmUgUE5HWF9JT19DSFVOS19DUkMgICAgICAgUE5HX0lPX0NIVU5LX0NSQwotI2RlZmluZSBQTkdYX0lPX01BU0tfT1AgICAgICAgICBQTkdfSU9fTUFTS19PUAotI2RlZmluZSBQTkdYX0lPX01BU0tfTE9DICAgICAgICBQTkdfSU9fTUFTS19MT0MKLQotI2Vsc2UgLyogUE5HX0xJQlBOR19WRVIgPCAxMDQwNSAqLwotCi0vKiBDb21wYXRpYmlsaXR5IGJhY2twb3J0cyBvZiBmdW5jdGlvbnMgYWRkZWQgdG8gbGlicG5nIDEuNCAqLwotcG5nX3VpbnRfMzIgUE5HQVBJIHBuZ3hfZ2V0X2lvX3N0YXRlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpOwotcG5nX2J5dGVwIFBOR0FQSSBwbmd4X2dldF9pb19jaHVua19uYW1lKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpOwotLyogTm90ZTogYWx0aG91Z2ggdGhlc2UgYmFja3BvcnRzIGhhdmUgc2V2ZXJhbCBsaW1pdGF0aW9ucyBpbiBjb21wYXJpc29uCi0gKiB0byB0aGUgYWN0dWFsIGxpYnBuZyAxLjQgZnVuY3Rpb25zLCB0aGV5IHdvcmsgcHJvcGVybHkgaW4gT3B0aVBORywKLSAqIGFzIGxvbmcgYXMgdGhhdCB0aGV5IGFyZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHdyYXBwZXJzIGJlbG93LgotICovCi0KLS8qIENvbXBhdGliaWxpdHkgd3JhcHBlcnMgZm9yIG9sZCBsaWJwbmcgZnVuY3Rpb25zICovCi12b2lkIFBOR0FQSSBwbmd4X3NldF9yZWFkX2ZuCi0gICAocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIGlvX3B0ciwgcG5nX3J3X3B0ciByZWFkX2RhdGFfZm4pOwotdm9pZCBQTkdBUEkgcG5neF9zZXRfd3JpdGVfZm4KLSAgIChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgaW9fcHRyLCBwbmdfcndfcHRyIHdyaXRlX2RhdGFfZm4sCi0gICAgcG5nX2ZsdXNoX3B0ciBvdXRwdXRfZmx1c2hfZm4pOwotdm9pZCBQTkdBUEkgcG5neF93cml0ZV9zaWcocG5nX3N0cnVjdHAgcG5nX3B0cik7Ci0KLS8qIEZsYWdzIHJldHVybmVkIGJ5IHBuZ19nZXRfaW9fc3RhdGUoKSAqLwotI2RlZmluZSBQTkdYX0lPX05PTkUgICAgICAgIDB4MDAwMCAgLyogbm8gSS9PIGF0IHRoaXMgbW9tZW50ICovCi0jZGVmaW5lIFBOR1hfSU9fUkVBRElORyAgICAgMHgwMDAxICAvKiBjdXJyZW50bHkgcmVhZGluZyAqLwotI2RlZmluZSBQTkdYX0lPX1dSSVRJTkcgICAgIDB4MDAwMiAgLyogY3VycmVudGx5IHdyaXRpbmcgKi8KLSNkZWZpbmUgUE5HWF9JT19TSUdOQVRVUkUgICAweDAwMTAgIC8qIGN1cnJlbnRseSBhdCB0aGUgZmlsZSBzaWduYXR1cmUgKi8KLSNkZWZpbmUgUE5HWF9JT19DSFVOS19IRFIgICAweDAwMjAgIC8qIGN1cnJlbnRseSBhdCB0aGUgY2h1bmsgaGVhZGVyICovCi0jZGVmaW5lIFBOR1hfSU9fQ0hVTktfREFUQSAgMHgwMDQwICAvKiBjdXJyZW50bHkgYXQgdGhlIGNodW5rIGRhdGEgKi8KLSNkZWZpbmUgUE5HWF9JT19DSFVOS19DUkMgICAweDAwODAgIC8qIGN1cnJlbnRseSBhdCB0aGUgY2h1bmsgY3JjICovCi0jZGVmaW5lIFBOR1hfSU9fTUFTS19PUCAgICAgMHgwMDBmICAvKiBjdXJyZW50IG9wZXJhdGlvbjogcmVhZGluZy93cml0aW5nICovCi0jZGVmaW5lIFBOR1hfSU9fTUFTS19MT0MgICAgMHgwMGYwICAvKiBjdXJyZW50IGxvY2F0aW9uOiBzaWcvaGRyL2RhdGEvY3JjICovCi0KLSNlbmRpZgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvKiBleHRlcm4gIkMiICovCi0jZW5kaWYKLQotCi0jZW5kaWYgLyogUE5HWFVUSUxfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BubWlvL01ha2VmaWxlLmluIGIvc3JjL3BubWlvL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzRhNjZjLi4wMDAwMDAwCi0tLSBhL3NyYy9wbm1pby9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS5QSE9OWTogYWxsIHRlc3QgY2hlY2sgY2xlYW4gZGlzdGNsZWFuCi0uUFJFQ0lPVVM6IE1ha2VmaWxlCi0uU1VGRklYRVM6IC5jIC5vIC5hCi0KLUNDID0gQENDQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUCA9IEBDUFBACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUxEID0gQExEQAotTERGTEFHUyA9IEBMREZMQUdTQAotQVIgPSBAQVJACi1BUkZMQUdTID0gQEFSRkxBR1NACi1SQU5MSUIgPSBAUkFOTElCQAotTElCUyA9IEBMSUJTQAotUk1fRiA9IEBSTV9GQAotCi1QTk1JT19MSUIgPSBsaWJwbm1pby5hCi1QTk1JT19PQkpTID0gcG5taW4ubyBwbm1vdXQubyBwbm11dGlsLm8KLQotYWxsOiAkKFBOTUlPX0xJQikKLQotdGVzdDoKLQotY2hlY2s6IHRlc3QKLQotLmMubzoKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgLW8gJEAgJDwKLQotJChQTk1JT19MSUIpOiAkKFBOTUlPX09CSlMpCi0JJChBUikgJChBUkZMQUdTKSAkQCAkKFBOTUlPX09CSlMpCi0JJChSQU5MSUIpICRACi0KLXBubWluLm86IHBubWluLmMgcG5taW8uaAotcG5tb3V0Lm86IHBubW91dC5jIHBubWlvLmgKLXBubXV0aWwubzogcG5tdXRpbC5jIHBubWlvLmgKLQotY2xlYW46Ci0JLSQoUk1fRikgJChQTk1JT19MSUIpICQoUE5NSU9fT0JKUykKLQotZGlzdGNsZWFuOiBjbGVhbgotCS0kKFJNX0YpIE1ha2VmaWxlCmRpZmYgLS1naXQgYS9zcmMvcG5taW8vUkVBRE1FLm9wdGlwbmcudHh0IGIvc3JjL3BubWlvL1JFQURNRS5vcHRpcG5nLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZmMTk3Zi4uMDAwMDAwMAotLS0gYS9zcmMvcG5taW8vUkVBRE1FLm9wdGlwbmcudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1OYW1lOiBwbm1pbwotU3VtbWFyeTogU2ltcGxlIEkvTyBpbnRlcmZhY2UgdG8gdGhlIFBOTSBpbWFnZSBmaWxlIGZvcm1hdAotQXV0aG9yOiBDb3NtaW4gVHJ1dGEKLVZlcnNpb246IDAuMwotTGljZW5zZTogemxpYgpkaWZmIC0tZ2l0IGEvc3JjL3BubWlvL3BubWluLmMgYi9zcmMvcG5taW8vcG5taW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2YWU0Yy4uMDAwMDAwMAotLS0gYS9zcmMvcG5taW8vcG5taW4uYworKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioKLSAqIHBubWluLmMKLSAqIFBOTSBmaWxlIGlucHV0LgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA4IENvc21pbiBUcnV0YS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwbm1pbyBsaWJyYXJ5LCBkaXN0cmlidXRlZCB1bmRlciB0aGUgemxpYiBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBubWlvLmguCi0gKiovCi0KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJwbm1pby5oIgotCi0KLS8qKgotICogQ2hlY2tzIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBzcGFjZTogJyAnLCAnXHQnLCAnXG4nIG9yICdccicuCi0gKiovCi0jZGVmaW5lIHBubV9pc19zcGFjZShjaCkgXAotICAgICgoY2gpID09ICcgJyB8fCAoY2gpID09ICdcdCcgfHwgKGNoKSA9PSAnXG4nIHx8IChjaCkgPT0gJ1xyJykKLQotCi0vKioKLSAqIENoZWNrcyBpZiB0aGUgY2hhcmFjdGVyIGlzIGEgZGlnaXQ6ICcwJyAuLiAnOScuCi0gKiovCi0jZGVmaW5lIHBubV9pc19kaWdpdChjaCkgXAotICAgICgoY2gpID49ICcwJyAmJiAoY2gpIDw9ICc5JykKLQotCi0vKioKLSAqIFJlYWRzIGEgY2hhcmFjdGVyIGZyb20gYSBmaWxlIHN0cmVhbS4KLSAqIENvbW1lbnQgc2VxdWVuY2VzIHN0YXJ0aW5nIHdpdGggJyMnIGFyZSBza2lwcGVkIHVudGlsIHRoZSBlbmQgb2YgbGluZS4KLSAqIEVuZCBvZiBsaW5lIHNlcXVlbmNlcyAoTEYsIENSLCBDUitMRikgYXJlIHRyYW5zbGF0ZWQgdG8gJ1xuJy4KLSAqIFJldHVybnMgdGhlIGNoYXJhY3RlciByZWFkLCBvciBFT0Ygb24gaW5wdXQgZmFpbHVyZS4KLSAqKi8KLXN0YXRpYyBpbnQgcG5tX2ZnZXRfY2hhcihGSUxFICpzdHJlYW0pCi17Ci0gICAgaW50IGNoID0gZ2V0YyhzdHJlYW0pOwotCi0gICAgLyogc2tpcCB0aGUgY29tbWVudHMgKi8KLSAgICBpZiAoY2ggPT0gJyMnKQotICAgIHsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgY2ggPSBnZXRjKHN0cmVhbSk7Ci0gICAgICAgIH0gd2hpbGUgKGNoICE9IEVPRiAmJiBjaCAhPSAnXG4nICYmIGNoICE9ICdccicpOwotICAgIH0KLQotICAgIC8qIHRyYW5zbGF0ZSB0aGUgbGluZSBlbmRpbmdzICovCi0gICAgaWYgKGNoID09ICdccicpCi0gICAgewotICAgICAgICBjaCA9IGdldGMoc3RyZWFtKTsKLSAgICAgICAgaWYgKGNoICE9ICdcbicpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVuZ2V0YyhjaCwgc3RyZWFtKTsKLSAgICAgICAgICAgIGNoID0gJ1xuJzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBjaDsKLX0KLQotCi0vKioKLSAqIFJlYWRzIChzY2FucykgYW4gdW5zaWduZWQgaW50ZWdlciBmcm9tIGEgZmlsZSBzdHJlYW0uCi0gKiBSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvbiBtYXRjaGluZyBmYWlsdXJlLCBvciBFT0Ygb24gaW5wdXQgZmFpbHVyZS4KLSAqKi8KLXN0YXRpYyBpbnQgcG5tX2ZzY2FuX3VpbnQoRklMRSAqc3RyZWFtLCB1bnNpZ25lZCBpbnQgKnZhbHVlKQotewotICAgIGludCBjaDsKLSAgICB1bnNpZ25lZCBpbnQgdG1wOwotCi0gICAgLyogc2tpcCB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlcyAqLwotICAgIGRvCi0gICAgewotICAgICAgICBjaCA9IHBubV9mZ2V0X2NoYXIoc3RyZWFtKTsKLSAgICB9IHdoaWxlIChwbm1faXNfc3BhY2UoY2gpKTsKLSAgICBpZiAoY2ggPT0gRU9GKSAgLyogaW5wdXQgZmFpbHVyZSAqLwotICAgICAgICByZXR1cm4gRU9GOwotICAgIGlmICghcG5tX2lzX2RpZ2l0KGNoKSkgIC8qIG1hdGNoaW5nIGZhaWx1cmUgKi8KLSAgICB7Ci0gICAgICAgIHVuZ2V0YyhjaCwgc3RyZWFtKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogcmVhZCB0aGUgdmFsdWUgKi8KLSAgICAqdmFsdWUgPSAwOwotICAgIGRvCi0gICAgewotICAgICAgICB0bXAgPSAqdmFsdWUgKiAxMCArIChjaCAtICcwJyk7Ci0gICAgICAgIGlmICh0bXAgPj0gKnZhbHVlKQotICAgICAgICAgICAgKnZhbHVlID0gdG1wOwotICAgICAgICBlbHNlICAvKiBvdmVyZmxvdyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAqdmFsdWUgPSBVSU5UX01BWDsKLSAgICAgICAgICAgIGVycm5vID0gRVJBTkdFOwotICAgICAgICB9Ci0gICAgICAgIGNoID0gZ2V0YyhzdHJlYW0pOwotICAgIH0gd2hpbGUgKHBubV9pc19kaWdpdChjaCkpOwotCi0gICAgLyogcHV0IGJhY2sgdGhlIHRyYWlsaW5nIG5vbi13aGl0ZXNwYWNlLCBpZiBhbnkgKi8KLSAgICBpZiAoIXBubV9pc19zcGFjZShjaCkpCi0gICAgICAgIHVuZ2V0YyhjaCwgc3RyZWFtKTsKLQotICAgIHJldHVybiAxOwotfQotCi0KLS8qKgotICogUmVhZHMgYSBQTk0gaGVhZGVyIHN0cnVjdHVyZSBmcm9tIGEgZmlsZSBzdHJlYW0gYW5kIHZhbGlkYXRlcyBpdC4KLSAqIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG9uIHZhbGlkYXRpb24gZmFpbHVyZSwKLSAqIG9yIC0xIG9uIGlucHV0IG9yIG1hdGNoaW5nIGZhaWx1cmUuCi0gKiBSZWFkaW5nIFBBTSAoIlA3IikgaGVhZGVycyBpcyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLgotICoqLwotaW50IHBubV9mZ2V0X2hlYWRlcihwbm1fc3RydWN0ICpwbm1fcHRyLCBGSUxFICpzdHJlYW0pCi17Ci0gICAgdW5zaWduZWQgaW50IGZvcm1hdDsKLSAgICBpbnQgY2g7Ci0KLSAgICAvKiBjbGVhciB0aGUgUE5NIGluZm8gc3RydWN0dXJlICovCi0gICAgbWVtc2V0KHBubV9wdHIsIDAsIHNpemVvZihwbm1fc3RydWN0KSk7Ci0KLSAgICAvKiByZWFkIHRoZSBQTk0gZmlsZSBzaWduYXR1cmUgKi8KLSAgICBjaCA9IGdldGMoc3RyZWFtKTsKLSAgICBpZiAoY2ggPT0gRU9GKSAgLyogaW5wdXQgZmFpbHVyZSAqLwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgLyogYW55IHN1YnNlcXVlbnQgZmFpbHVyZSBpcyBhIG1hdGNoaW5nIGZhaWx1cmUgKi8KLSAgICBpZiAoY2ggIT0gJ1AnKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgY2ggPSBnZXRjKHN0cmVhbSk7Ci0gICAgaWYgKGNoIDwgJzEnIHx8IGNoID4gJzknKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgZm9ybWF0ID0gKHVuc2lnbmVkIGludCkoY2ggLSAnMCcpOwotICAgIGNoID0gcG5tX2ZnZXRfY2hhcihzdHJlYW0pOyAgLyogc3RhcnQgdXNpbmcgcG5tX2ZnZXRfY2hhcigpICovCi0gICAgaWYgKCFwbm1faXNfc3BhY2UoY2gpKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiByZWFkIHRoZSBoZWFkZXIgKi8KLSAgICBwbm1fcHRyLT5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgaWYgKGZvcm1hdCA+PSBQTk1fUDEgJiYgZm9ybWF0IDw9IFBOTV9QNikgIC8qIG9sZC1zdHlsZSBQTk0gaGVhZGVyICovCi0gICAgewotICAgICAgICBwbm1fcHRyLT5kZXB0aCA9IChmb3JtYXQgPT0gUE5NX1AzIHx8IGZvcm1hdCA9PSBQTk1fUDYpID8gMyA6IDE7Ci0gICAgICAgIGlmIChwbm1fZnNjYW5fdWludChzdHJlYW0sICZwbm1fcHRyLT53aWR0aCkgIT0gMSB8fAotICAgICAgICAgICAgICAgIHBubV9mc2Nhbl91aW50KHN0cmVhbSwgJnBubV9wdHItPmhlaWdodCkgIT0gMSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKGZvcm1hdCA9PSBQTk1fUDEgfHwgZm9ybWF0ID09IFBOTV9QNCkKLSAgICAgICAgICAgIHBubV9wdHItPm1heHZhbCA9IDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBubV9mc2Nhbl91aW50KHN0cmVhbSwgJnBubV9wdHItPm1heHZhbCkgIT0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBubV9pc192YWxpZChwbm1fcHRyKSA/IDEgOiAwOwotICAgIH0KLSAgICBlbHNlICAvKiBUT0RPOiBpZiAoZm9ybWF0ID09IFBOTV9QNykgLi4uICovCi0gICAgICAgIHJldHVybiAtMTsKLX0KLQotCi0vKioKLSAqIFJlYWRzIGFuIGFycmF5IG9mIFBOTSBzYW1wbGUgdmFsdWVzIGZyb20gYSBmaWxlIHN0cmVhbS4KLSAqIFRoZSB2YWx1ZXMgYXJlIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IHBubV9wdHItPmZvcm1hdC4KLSAqIFRoZSBhcnJheSBsZW5ndGggaXMgcG5tX3B0ci0+ZGVwdGggKiBwbm1fcHRyLT53aWR0aCAqIG51bV9yb3dzLgotICogVGhlIHZhbGlkaXR5IGNoZWNrIHBlcmZvcm1lZCBvbiB0aGUgUE5NIHN0cnVjdHVyZSBpcyBvbmx5IHBhcnRpYWwuCi0gKiBSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvbiB2YWxpZGF0aW9uIGZhaWx1cmUsCi0gKiBvciAtMSBvbiBpbnB1dCBvciBtYXRjaGluZyBmYWlsdXJlLgotICogSWYgcmVhZGluZyBpcyBpbmNvbXBsZXRlLCB0aGUgcmVtYWluaW5nIHNhbXBsZSB2YWx1ZXMgYXJlIHNldCB0byAwLgotICoqLwotaW50IHBubV9mZ2V0X3ZhbHVlcyhjb25zdCBwbm1fc3RydWN0ICpwbm1fcHRyLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnNhbXBsZV92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fcm93cywKLSAgICAgICAgICAgICAgICAgICAgRklMRSAqc3RyZWFtKQotewotICAgIHVuc2lnbmVkIGludCBmb3JtYXQgPSBwbm1fcHRyLT5mb3JtYXQ7Ci0gICAgdW5zaWduZWQgaW50IGRlcHRoICA9IHBubV9wdHItPmRlcHRoOwotICAgIHVuc2lnbmVkIGludCB3aWR0aCAgPSBwbm1fcHRyLT53aWR0aDsKLSAgICB1bnNpZ25lZCBpbnQgbWF4dmFsID0gcG5tX3B0ci0+bWF4dmFsOwotICAgIHNpemVfdCByb3dfbGVuZ3RoID0gKHNpemVfdClkZXB0aCAqIChzaXplX3Qpd2lkdGg7Ci0gICAgc2l6ZV90IG51bV9zYW1wbGVzID0gbnVtX3Jvd3MgKiByb3dfbGVuZ3RoOwotICAgIGludCBjaCwgY2g4OwotI2lmIFBOTV9VSU5UX0JJVCA+IDE2Ci0gICAgaW50IGNoMTYsIGNoMjQ7Ci0jZW5kaWYKLSAgICBpbnQgbWFzazsKLSAgICBzaXplX3QgaSwgajsKLQotICAgIC8qIHJlYWQgdGhlIHNhbXBsZSB2YWx1ZXMgKi8KLSAgICBzd2l0Y2ggKGZvcm1hdCkKLSAgICB7Ci0gICAgY2FzZSBQTk1fUDE6Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc2FtcGxlczsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoID0gcG5tX2ZnZXRfY2hhcihzdHJlYW0pOwotICAgICAgICAgICAgfSB3aGlsZSAocG5tX2lzX3NwYWNlKGNoKSk7Ci0gICAgICAgICAgICBpZiAoY2ggIT0gJzAnICYmIGNoICE9ICcxJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1bmdldGMoY2gsIHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYW1wbGVfdmFsdWVzW2ldID0gKGNoID09ICcwJykgPyAxIDogMDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBOTV9QMjoKLSAgICBjYXNlIFBOTV9QMzoKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9zYW1wbGVzOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwbm1fZnNjYW5fdWludChzdHJlYW0sICZzYW1wbGVfdmFsdWVzW2ldKSAhPSAxKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUE5NX1A0OgotICAgICAgICBmb3IgKGkgPSBqID0gMDsgaSA8IG51bV9zYW1wbGVzOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoID0gZ2V0YyhzdHJlYW0pOwotICAgICAgICAgICAgaWYgKGNoID09IEVPRikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGZvciAobWFzayA9IDB4ODA7IG1hc2sgIT0gMDsgbWFzayA+Pj0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYW1wbGVfdmFsdWVzW2krK10gPSAoY2ggJiBtYXNrKSA/IDAgOiAxOwotICAgICAgICAgICAgICAgIGlmICgrK2ogPT0gcm93X2xlbmd0aCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGogPSAwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQTk1fUDU6Ci0gICAgY2FzZSBQTk1fUDY6Ci0gICAgY2FzZSBQTk1fUDc6Ci0gICAgICAgIGlmIChtYXh2YWwgPD0gMHhmZlUpICAvKiAxIGJ5dGUgcGVyIHNhbXBsZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NhbXBsZXM7ICsraSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaCA9IGdldGMoc3RyZWFtKTsKLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gRU9GKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBzYW1wbGVfdmFsdWVzW2ldID0gKHVuc2lnbmVkIGludCljaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtYXh2YWwgPD0gMHhmZmZmVSkgIC8qIDIgYnl0ZXMgcGVyIHNhbXBsZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NhbXBsZXM7ICsraSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaDggPSBnZXRjKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgY2ggPSBnZXRjKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoID09IEVPRikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgc2FtcGxlX3ZhbHVlc1tpXSA9ICgodW5zaWduZWQgaW50KWNoOCA8PCA4KSArICh1bnNpZ25lZCBpbnQpY2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNpZiBQTk1fVUlOVF9CSVQgPiAxNgotICAgICAgICBlbHNlIGlmIChtYXh2YWwgPD0gMHhmZmZmZmZmZlUpICAvKiAzIG9yIDQgYnl0ZXMgcGVyIHNhbXBsZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBjaDI0ID0gMDsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc2FtcGxlczsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtYXh2YWwgPiAweGZmZmZmZlUpCi0gICAgICAgICAgICAgICAgICAgIGNoMjQgPSBnZXRjKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgY2gxNiA9IGdldGMoc3RyZWFtKTsKLSAgICAgICAgICAgICAgICBjaDggPSBnZXRjKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgY2ggPSBnZXRjKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoID09IEVPRikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgc2FtcGxlX3ZhbHVlc1tpXSA9Ci0gICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgaW50KWNoMjQgPDwgMjQpICsgKCh1bnNpZ25lZCBpbnQpY2gxNiA8PCAxNikgKwotICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGludCljaDggIDw8ICA4KSArICgodW5zaWduZWQgaW50KWNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGVsc2UgIC8qIG1heHZhbCA+IFBOTV9VSU5UX01BWCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGVycm5vID0gRUlOVkFMOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayB0aGUgcmVzdWx0ICovCi0gICAgaWYgKGkgPCBudW1fc2FtcGxlcykKLSAgICB7Ci0gICAgICAgIG1lbXNldChzYW1wbGVfdmFsdWVzICsgaSwgMCwgKG51bV9zYW1wbGVzIC0gaSkgKiBzaXplb2YodW5zaWduZWQgaW50KSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLQotLyoqCi0gKiBSZWFkcyBhbiBhcnJheSBvZiBzYW1wbGUgYnl0ZXMgZnJvbSBhIHJhdyBQTk0gZmlsZSBzdHJlYW0uCi0gKiBNdWx0aS1ieXRlIHNhbXBsZXMgYXJlIHN0b3JlZCBpbiBuZXR3b3JrIG9yZGVyLCBhcyBpbiB0aGUgUE5NIHN0cmVhbS4KLSAqIFRoZSBieXRlIGNvdW50IGlzIHNhbXBsZV9zaXplICogcG5tX3B0ci0+ZGVwdGggKiBwbm1fcHRyLT53aWR0aCAqIG51bV9yb3dzLgotICogVGhlIHZhbGlkaXR5IGNoZWNrIHBlcmZvcm1lZCBvbiB0aGUgUE5NIHN0cnVjdHVyZSBpcyBvbmx5IHBhcnRpYWwuCi0gKiBSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvbiB2YWxpZGF0aW9uIGZhaWx1cmUsIG9yIC0xIG9uIGlucHV0IGZhaWx1cmUuCi0gKiBJZiByZWFkaW5nIGlzIGluY29tcGxldGUsIHRoZSByZW1haW5pbmcgc2FtcGxlIGJ5dGVzIGFyZSBzZXQgdG8gMC4KLSAqKi8KLWludCBwbm1fZmdldF9ieXRlcyhjb25zdCBwbm1fc3RydWN0ICpwbm1fcHRyLAotICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNhbXBsZV9ieXRlcywKLSAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2FtcGxlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9yb3dzLAotICAgICAgICAgICAgICAgICAgIEZJTEUgKnN0cmVhbSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgZm9ybWF0ID0gcG5tX3B0ci0+Zm9ybWF0OwotICAgIHVuc2lnbmVkIGludCBkZXB0aCAgPSBwbm1fcHRyLT5kZXB0aDsKLSAgICB1bnNpZ25lZCBpbnQgd2lkdGggID0gcG5tX3B0ci0+d2lkdGg7Ci0gICAgdW5zaWduZWQgaW50IG1heHZhbCA9IHBubV9wdHItPm1heHZhbDsKLSAgICBzaXplX3Qgcm93X2xlbmd0aCA9IChzaXplX3QpZGVwdGggKiAoc2l6ZV90KXdpZHRoOwotICAgIHNpemVfdCBudW1fc2FtcGxlcyA9IG51bV9yb3dzICogcm93X2xlbmd0aDsKLSAgICBzaXplX3QgcmF3X3NhbXBsZV9zaXplOwotICAgIGludCBjaCwgbWFzazsKLSAgICBzaXplX3QgaSwgajsKLQotICAgIC8qIHZhbGlkYXRlIHRoZSBnaXZlbiBzYW1wbGUgc2l6ZSAqLwotICAgIGlmIChtYXh2YWwgPD0gMHhmZlUpCi0gICAgICAgIHJhd19zYW1wbGVfc2l6ZSA9IDE7Ci0gICAgZWxzZSBpZiAobWF4dmFsIDw9IDB4ZmZmZlUpCi0gICAgICAgIHJhd19zYW1wbGVfc2l6ZSA9IDI7Ci0jaWYgUE5NX1VJTlRfQklUID4gMTYKLSAgICBlbHNlIGlmIChtYXh2YWwgPD0gMHhmZmZmZmZVKQotICAgICAgICByYXdfc2FtcGxlX3NpemUgPSAzOwotICAgIGVsc2UgaWYgKG1heHZhbCA8PSAweGZmZmZmZmZmVSkKLSAgICAgICAgcmF3X3NhbXBsZV9zaXplID0gNDsKLSNlbmRpZgotICAgIGVsc2UgIC8qIG1heHZhbCA+IFBOTV9VSU5UX01BWCAqLwotICAgICAgICByYXdfc2FtcGxlX3NpemUgPSAhc2FtcGxlX3NpemU7Ci0gICAgaWYgKHJhd19zYW1wbGVfc2l6ZSAhPSBzYW1wbGVfc2l6ZSkKLSAgICB7Ci0gICAgICAgIGVycm5vID0gRUlOVkFMOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiByZWFkIHRoZSByYXcgc2FtcGxlIGJ5dGVzICovCi0gICAgc3dpdGNoIChmb3JtYXQpCi0gICAgewotICAgIGNhc2UgUE5NX1A0OgotICAgICAgICBmb3IgKGkgPSBqID0gMDsgaSA8IG51bV9zYW1wbGVzOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoID0gZ2V0YyhzdHJlYW0pOwotICAgICAgICAgICAgaWYgKGNoID09IEVPRikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGZvciAobWFzayA9IDB4ODA7IG1hc2sgIT0gMDsgbWFzayA+Pj0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYW1wbGVfYnl0ZXNbaSsrXSA9ICh1bnNpZ25lZCBjaGFyKSgoY2ggJiBtYXNrKSA/IDAgOiAxKTsKLSAgICAgICAgICAgICAgICBpZiAoKytqID09IHJvd19sZW5ndGgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBqID0gMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUE5NX1A1OgotICAgIGNhc2UgUE5NX1A2OgotICAgIGNhc2UgUE5NX1A3OgotICAgICAgICBpID0gZnJlYWQoc2FtcGxlX2J5dGVzLCBzYW1wbGVfc2l6ZSwgbnVtX3NhbXBsZXMsIHN0cmVhbSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGVycm5vID0gRUlOVkFMOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayB0aGUgcmVzdWx0ICovCi0gICAgaWYgKGkgPCBudW1fc2FtcGxlcykKLSAgICB7Ci0gICAgICAgIG1lbXNldChzYW1wbGVfYnl0ZXMgKyBpLCAwLCBzYW1wbGVfc2l6ZSAqIG51bV9zYW1wbGVzIC0gaSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9zcmMvcG5taW8vcG5taW8uaCBiL3NyYy9wbm1pby9wbm1pby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTQ2M2Y1Li4wMDAwMDAwCi0tLSBhL3NyYy9wbm1pby9wbm1pby5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKgotICogcG5taW8uaAotICogU2ltcGxlIEkvTyBpbnRlcmZhY2UgdG8gdGhlIFBvcnRhYmxlIEFueSBNYXAgKFBOTSkgaW1hZ2UgZmlsZSBmb3JtYXQuCi0gKiBWZXJzaW9uIDAuMywgUmVsZWFzZSAyMDA4LUp1bi0xNS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwOCBDb3NtaW4gVHJ1dGEuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9yKHMpIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLSAqCi0gKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiAgSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiovCi0KLQotI2lmbmRlZiBQTk1JT19ICi0jZGVmaW5lIFBOTUlPX0gKLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0vKioKLSAqIFBOTSBmb3JtYXQgY29kZXMKLSAqKi8KLWVudW0KLXsKLSAgICBQTk1fUDEgPSAxLCAgLyogcGxhaW4gUEJNICovCi0gICAgUE5NX1AyID0gMiwgIC8qIHBsYWluIFBHTSAqLwotICAgIFBOTV9QMyA9IDMsICAvKiBwbGFpbiBQUE0gKi8KLSAgICBQTk1fUDQgPSA0LCAgLyogcmF3IFBCTSAqLwotICAgIFBOTV9QNSA9IDUsICAvKiByYXcgUEdNICovCi0gICAgUE5NX1A2ID0gNiwgIC8qIHJhdyBQUE0gKi8KLSAgICBQTk1fUDcgPSA3ICAgLyogUEFNIChvbmx5IHBhcnRpYWxseSBpbXBsZW1lbnRlZCkgKi8KLX07Ci0KLQotLyoqCi0gKiBQTk0gaW5mbyBzdHJ1Y3R1cmUKLSAqKi8KLXR5cGVkZWYgc3RydWN0IHBubV9zdHJ1Y3QKLXsKLSAgICB1bnNpZ25lZCBpbnQgZm9ybWF0OwotICAgIHVuc2lnbmVkIGludCBkZXB0aDsKLSAgICB1bnNpZ25lZCBpbnQgd2lkdGg7Ci0gICAgdW5zaWduZWQgaW50IGhlaWdodDsKLSAgICB1bnNpZ25lZCBpbnQgbWF4dmFsOwotfSBwbm1fc3RydWN0OwotCi0KLS8qKgotICogUE5NIGlucHV0IGZ1bmN0aW9ucwotICoqLwotaW50IHBubV9mZ2V0X2hlYWRlcihwbm1fc3RydWN0ICpwbm1fcHRyLAotICAgICAgICAgICAgICAgICAgICBGSUxFICpzdHJlYW0pOwotaW50IHBubV9mZ2V0X3ZhbHVlcyhjb25zdCBwbm1fc3RydWN0ICpwbm1fcHRyLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnNhbXBsZV92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fcm93cywKLSAgICAgICAgICAgICAgICAgICAgRklMRSAqc3RyZWFtKTsKLWludCBwbm1fZmdldF9ieXRlcyhjb25zdCBwbm1fc3RydWN0ICpwbm1fcHRyLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzYW1wbGVfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBzYW1wbGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9yb3dzLAotICAgICAgICAgICAgICAgICAgICBGSUxFICpzdHJlYW0pOwotCi0KLS8qKgotICogUE5NIG91dHB1dCBmdW5jdGlvbnMKLSAqKi8KLWludCBwbm1fZnB1dF9oZWFkZXIoY29uc3QgcG5tX3N0cnVjdCAqcG5tX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgRklMRSAqc3RyZWFtKTsKLWludCBwbm1fZnB1dF92YWx1ZXMoY29uc3QgcG5tX3N0cnVjdCAqcG5tX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICpzYW1wbGVfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3Jvd3MsCi0gICAgICAgICAgICAgICAgICAgIEZJTEUgKnN0cmVhbSk7Ci1pbnQgcG5tX2ZwdXRfYnl0ZXMoY29uc3QgcG5tX3N0cnVjdCAqcG5tX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2FtcGxlX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2FtcGxlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fcm93cywKLSAgICAgICAgICAgICAgICAgICAgRklMRSAqc3RyZWFtKTsKLQotCi0vKioKLSAqIFBOTSB1dGlsaXR5IGZ1bmN0aW9ucwotICoqLwotaW50IHBubV9pc192YWxpZChjb25zdCBwbm1fc3RydWN0ICpwbm1fcHRyKTsKLXNpemVfdCBwbm1fcmF3X3NhbXBsZV9zaXplKGNvbnN0IHBubV9zdHJ1Y3QgKnBubV9wdHIpOwotc2l6ZV90IHBubV9tZW1fc2l6ZShjb25zdCBwbm1fc3RydWN0ICpwbm1fcHRyLAotICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2FtcGxlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fcm93cyk7Ci0KLQotLyoqCi0gKiBQTk0gbGltaXRzCi0gKiovCi0jZGVmaW5lIFBOTV9VQ0hBUl9CSVQgOAotI2RlZmluZSBQTk1fVUNIQVJfTUFYIDB4ZmZVCi0jaWYgVUlOVF9NQVggPCAweGZmZmZmZmZmVUwKLSNkZWZpbmUgUE5NX1VJTlRfQklUIDE2Ci0jZGVmaW5lIFBOTV9VSU5UX01BWCAweGZmZmZVCi0jZWxzZQotI2RlZmluZSBQTk1fVUlOVF9CSVQgMzIKLSNkZWZpbmUgUE5NX1VJTlRfTUFYIDB4ZmZmZmZmZmZVCi0jZW5kaWYKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8qIGV4dGVybiAiQyIgKi8KLSNlbmRpZgotCi0jZW5kaWYgIC8qIFBOTUlPX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9wbm1pby9wbm1vdXQuYyBiL3NyYy9wbm1pby9wbm1vdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhhOTViNC4uMDAwMDAwMAotLS0gYS9zcmMvcG5taW8vcG5tb3V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqCi0gKiBwbm1vdXQuYwotICogUE5NIGZpbGUgb3V0cHV0LgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA4IENvc21pbiBUcnV0YS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwbm1pbyBsaWJyYXJ5LCBkaXN0cmlidXRlZCB1bmRlciB0aGUgemxpYiBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBubWlvLmguCi0gKiovCi0KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwbm1pby5oIgotCi0KLS8qKgotICogVmFsaWRhdGVzIGEgUE5NIGhlYWRlciBzdHJ1Y3R1cmUgYW5kIHdyaXRlcyBpdCB0byBhIGZpbGUgc3RyZWFtLgotICogUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24gdmFsaWRhdGlvbiBmYWlsdXJlLCBvciAtMSBvbiBvdXRwdXQgZmFpbHVyZS4KLSAqKi8KLWludCBwbm1fZnB1dF9oZWFkZXIoY29uc3QgcG5tX3N0cnVjdCAqcG5tX3B0ciwgRklMRSAqc3RyZWFtKQotewotICAgIHVuc2lnbmVkIGludCBmb3JtYXQgPSBwbm1fcHRyLT5mb3JtYXQ7Ci0gICAgdW5zaWduZWQgaW50IGRlcHRoICA9IHBubV9wdHItPmRlcHRoOwotICAgIHVuc2lnbmVkIGludCB3aWR0aCAgPSBwbm1fcHRyLT53aWR0aDsKLSAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0ID0gcG5tX3B0ci0+aGVpZ2h0OwotICAgIHVuc2lnbmVkIGludCBtYXh2YWwgPSBwbm1fcHRyLT5tYXh2YWw7Ci0gICAgaW50IHJlc3VsdDsKLQotICAgIC8qIHZhbGlkYXRlIHRoZSBpbmZvIHN0cnVjdHVyZSAqLwotICAgIGlmICghcG5tX2lzX3ZhbGlkKHBubV9wdHIpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIHdyaXRlIHRoZSBQTk0gZmlsZSBoZWFkZXIgKi8KLSAgICBzd2l0Y2ggKGZvcm1hdCkKLSAgICB7Ci0gICAgY2FzZSBQTk1fUDE6Ci0gICAgY2FzZSBQTk1fUDQ6Ci0gICAgICAgIHJlc3VsdCA9IGZwcmludGYoc3RyZWFtLAotICAgICAgICAgICAgIlAlY1xuJXUgJXVcbiIsIGZvcm1hdCArICcwJywgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUE5NX1AyOgotICAgIGNhc2UgUE5NX1AzOgotICAgIGNhc2UgUE5NX1A1OgotICAgIGNhc2UgUE5NX1A2OgotICAgICAgICByZXN1bHQgPSBmcHJpbnRmKHN0cmVhbSwKLSAgICAgICAgICAgICJQJWNcbiV1ICV1XG4ldVxuIiwgZm9ybWF0ICsgJzAnLCB3aWR0aCwgaGVpZ2h0LCBtYXh2YWwpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBOTV9QNzoKLSAgICAgICAgcmVzdWx0ID0gZnByaW50ZihzdHJlYW0sCi0gICAgICAgICAgICAiUDdcbkRFUFRIICV1XG5XSURUSCAldVxuSEVJR0hUICV1XG5NQVhWQUwgJXVcbkVOREhEUlxuIiwKLSAgICAgICAgICAgIGRlcHRoLCB3aWR0aCwgaGVpZ2h0LCBtYXh2YWwpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBlcnJubyA9IEVJTlZBTDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgdGhlIHJlc3VsdCAqLwotICAgIHJldHVybiAocmVzdWx0ID4gMCkgPyAxIDogLTE7Ci19Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gYXJyYXkgb2YgUE5NIHNhbXBsZSB2YWx1ZXMgdG8gYSBmaWxlIHN0cmVhbS4KLSAqIFRoZSB2YWx1ZXMgYXJlIHdyaXR0ZW4gaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkgcG5tX3B0ci0+Zm9ybWF0LgotICogVGhlIGFycmF5IGxlbmd0aCBpcyBwbm1fcHRyLT5kZXB0aCAqIHBubV9wdHItPndpZHRoICogbnVtX3Jvd3MuCi0gKiBUaGUgdmFsaWRpdHkgY2hlY2sgcGVyZm9ybWVkIG9uIHRoZSBQTk0gc3RydWN0dXJlIGlzIG9ubHkgcGFydGlhbC4KLSAqIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG9uIHZhbGlkYXRpb24gZmFpbHVyZSwgb3IgLTEgb24gb3V0cHV0IGZhaWx1cmUuCi0gKiovCi1pbnQgcG5tX2ZwdXRfdmFsdWVzKGNvbnN0IHBubV9zdHJ1Y3QgKnBubV9wdHIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqc2FtcGxlX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9yb3dzLAotICAgICAgICAgICAgICAgICAgICBGSUxFICpzdHJlYW0pCi17Ci0gICAgdW5zaWduZWQgaW50IGZvcm1hdCA9IHBubV9wdHItPmZvcm1hdDsKLSAgICB1bnNpZ25lZCBpbnQgZGVwdGggID0gcG5tX3B0ci0+ZGVwdGg7Ci0gICAgdW5zaWduZWQgaW50IHdpZHRoICA9IHBubV9wdHItPndpZHRoOwotICAgIHVuc2lnbmVkIGludCBtYXh2YWwgPSBwbm1fcHRyLT5tYXh2YWw7Ci0gICAgc2l6ZV90IHJvd19sZW5ndGggPSAoc2l6ZV90KWRlcHRoICogKHNpemVfdCl3aWR0aDsKLSAgICBzaXplX3QgbnVtX3NhbXBsZXMgPSBudW1fcm93cyAqIHJvd19sZW5ndGg7Ci0gICAgaW50IGNoLCBtYXNrOwotICAgIHNpemVfdCBpLCBqOwotCi0gICAgLyogd3JpdGUgdGhlIHNhbXBsZSB2YWx1ZXMgKi8KLSAgICBzd2l0Y2ggKGZvcm1hdCkKLSAgICB7Ci0gICAgY2FzZSBQTk1fUDE6Ci0gICAgICAgIGZvciAoaSA9IGogPSAwOyBpIDwgbnVtX3NhbXBsZXM7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHB1dGMoKChzYW1wbGVfdmFsdWVzW2ldICE9IDApID8gJzAnIDogJzEnKSwgc3RyZWFtKSA9PSBFT0YpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoKytqID09IHJvd19sZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaiA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHB1dGMoJ1xuJywgc3RyZWFtKSA9PSBFT0YpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUE5NX1AyOgotICAgIGNhc2UgUE5NX1AzOgotICAgICAgICBmb3IgKGkgPSBqID0gMDsgaSA8IG51bV9zYW1wbGVzOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgrK2ogPT0gcm93X2xlbmd0aCkKLSAgICAgICAgICAgICAgICBqID0gMDsKLSAgICAgICAgICAgIGlmIChmcHJpbnRmKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgKGogPT0gMCkgPyAiJXVcbiIgOiAiJXUgIiwgc2FtcGxlX3ZhbHVlc1tpXSkgPD0gMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBOTV9QNDoKLSAgICAgICAgZm9yIChpID0gaiA9IDA7IGkgPCBudW1fc2FtcGxlczsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaCA9IDA7Ci0gICAgICAgICAgICBmb3IgKG1hc2sgPSAweDgwOyBtYXNrICE9IDA7IG1hc2sgPj49IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHNhbXBsZV92YWx1ZXNbaSsrXSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBjaCB8PSBtYXNrOwotICAgICAgICAgICAgICAgIGlmICgrK2ogPT0gcm93X2xlbmd0aCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGogPSAwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHV0YyhjaCwgc3RyZWFtKSA9PSBFT0YpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQTk1fUDU6Ci0gICAgY2FzZSBQTk1fUDY6Ci0gICAgY2FzZSBQTk1fUDc6Ci0gICAgICAgIGlmIChtYXh2YWwgPD0gMHhmZlUpICAvKiAxIGJ5dGUgcGVyIHNhbXBsZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NhbXBsZXM7ICsraSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocHV0YyhzYW1wbGVfdmFsdWVzW2ldICYgMHhmZiwgc3RyZWFtKSA9PSBFT0YpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1heHZhbCA8PSAweGZmZmZVKSAgLyogMiBieXRlcyBwZXIgc2FtcGxlICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc2FtcGxlczsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwdXRjKChzYW1wbGVfdmFsdWVzW2ldID4+IDgpICYgMHhmZiwgc3RyZWFtKSA9PSBFT0YgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1dGMoKHNhbXBsZV92YWx1ZXNbaV0pICYgMHhmZiwgc3RyZWFtKSA9PSBFT0YpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jaWYgUE5NX1VJTlRfQklUID4gMTYKLSAgICAgICAgZWxzZSBpZiAobWF4dmFsIDw9IDB4ZmZmZmZmZmZVKSAgLyogMyBvciA0IGJ5dGVzIHBlciBzYW1wbGUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9zYW1wbGVzOyArK2kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1heHZhbCA+IDB4ZmZmZmZmVSkKLSAgICAgICAgICAgICAgICAgICAgaWYgKHB1dGMoKHNhbXBsZV92YWx1ZXNbaV0gPj4gMjQpICYgMHhmZiwgc3RyZWFtKSA9PSBFT0YpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBpZiAocHV0Yygoc2FtcGxlX3ZhbHVlc1tpXSA+PiAxNikgJiAweGZmLCBzdHJlYW0pID09IEVPRiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcHV0Yygoc2FtcGxlX3ZhbHVlc1tpXSA+PiA4KSAmIDB4ZmYsIHN0cmVhbSkgPT0gRU9GIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdXRjKChzYW1wbGVfdmFsdWVzW2ldKSAmIDB4ZmYsIHN0cmVhbSkgPT0gRU9GKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGVsc2UgIC8qIG1heHZhbCA+IFBOTV9VSU5UX01BWCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGVycm5vID0gRUlOVkFMOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayB0aGUgcmVzdWx0ICovCi0gICAgcmV0dXJuIChpID09IG51bV9zYW1wbGVzKSA/IDEgOiAtMTsKLX0KLQotCi0vKioKLSAqIFdyaXRlcyBhbiBhcnJheSBvZiBzYW1wbGUgYnl0ZXMgdG8gYSByYXcgUE5NIGZpbGUgc3RyZWFtLgotICogTXVsdGktYnl0ZSBzYW1wbGVzIGFyZSBzdG9yZWQgaW4gbmV0d29yayBvcmRlciwgYXMgaW4gdGhlIFBOTSBzdHJlYW0uCi0gKiBUaGUgYnl0ZSBjb3VudCBpcyBzYW1wbGVfc2l6ZSAqIHBubV9wdHItPmRlcHRoICogcG5tX3B0ci0+d2lkdGggKiBudW1fcm93cy4KLSAqIFRoZSB2YWxpZGl0eSBjaGVjayBwZXJmb3JtZWQgb24gdGhlIFBOTSBzdHJ1Y3R1cmUgaXMgb25seSBwYXJ0aWFsLgotICogUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24gdmFsaWRhdGlvbiBmYWlsdXJlLCBvciAtMSBvbiBvdXRwdXQgZmFpbHVyZS4KLSAqKi8KLWludCBwbm1fZnB1dF9ieXRlcyhjb25zdCBwbm1fc3RydWN0ICpwbm1fcHRyLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbXBsZV9ieXRlcywKLSAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2FtcGxlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9yb3dzLAotICAgICAgICAgICAgICAgICAgIEZJTEUgKnN0cmVhbSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgZm9ybWF0ID0gcG5tX3B0ci0+Zm9ybWF0OwotICAgIHVuc2lnbmVkIGludCBkZXB0aCAgPSBwbm1fcHRyLT5kZXB0aDsKLSAgICB1bnNpZ25lZCBpbnQgd2lkdGggID0gcG5tX3B0ci0+d2lkdGg7Ci0gICAgdW5zaWduZWQgaW50IG1heHZhbCA9IHBubV9wdHItPm1heHZhbDsKLSAgICBzaXplX3Qgcm93X2xlbmd0aCA9IChzaXplX3QpZGVwdGggKiAoc2l6ZV90KXdpZHRoOwotICAgIHNpemVfdCBudW1fc2FtcGxlcyA9IG51bV9yb3dzICogcm93X2xlbmd0aDsKLSAgICBzaXplX3QgcmF3X3NhbXBsZV9zaXplOwotICAgIGludCBjaCwgbWFzazsKLSAgICBzaXplX3QgaSwgajsKLQotICAgIC8qIHZhbGlkYXRlIHRoZSBnaXZlbiBzYW1wbGUgc2l6ZSAqLwotICAgIGlmIChtYXh2YWwgPD0gMHhmZlUpCi0gICAgICAgIHJhd19zYW1wbGVfc2l6ZSA9IDE7Ci0gICAgZWxzZSBpZiAobWF4dmFsIDw9IDB4ZmZmZlUpCi0gICAgICAgIHJhd19zYW1wbGVfc2l6ZSA9IDI7Ci0jaWYgUE5NX1VJTlRfQklUID4gMTYKLSAgICBlbHNlIGlmIChtYXh2YWwgPD0gMHhmZmZmZmZVKQotICAgICAgICByYXdfc2FtcGxlX3NpemUgPSAzOwotICAgIGVsc2UgaWYgKG1heHZhbCA8PSAweGZmZmZmZmZmVSkKLSAgICAgICAgcmF3X3NhbXBsZV9zaXplID0gNDsKLSNlbmRpZgotICAgIGVsc2UgIC8qIG1heHZhbCA+IFBOTV9VSU5UX01BWCAqLwotICAgICAgICByYXdfc2FtcGxlX3NpemUgPSAhc2FtcGxlX3NpemU7Ci0gICAgaWYgKHJhd19zYW1wbGVfc2l6ZSAhPSBzYW1wbGVfc2l6ZSkKLSAgICB7Ci0gICAgICAgIGVycm5vID0gRUlOVkFMOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiB3cml0ZSB0aGUgcmF3IHNhbXBsZSBieXRlcyAqLwotICAgIHN3aXRjaCAoZm9ybWF0KQotICAgIHsKLSAgICBjYXNlIFBOTV9QNDoKLSAgICAgICAgZm9yIChpID0gaiA9IDA7IGkgPCBudW1fc2FtcGxlczsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaCA9IDA7Ci0gICAgICAgICAgICBmb3IgKG1hc2sgPSAweDgwOyBtYXNrICE9IDA7IG1hc2sgPj49IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHNhbXBsZV9ieXRlc1tpKytdID09IDApCi0gICAgICAgICAgICAgICAgICAgIGNoIHw9IG1hc2s7Ci0gICAgICAgICAgICAgICAgaWYgKCsraiA9PSByb3dfbGVuZ3RoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwdXRjKGNoLCBzdHJlYW0pID09IEVPRikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBOTV9QNToKLSAgICBjYXNlIFBOTV9QNjoKLSAgICBjYXNlIFBOTV9QNzoKLSAgICAgICAgaSA9IGZ3cml0ZShzYW1wbGVfYnl0ZXMsIHNhbXBsZV9zaXplLCBudW1fc2FtcGxlcywgc3RyZWFtKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgZXJybm8gPSBFSU5WQUw7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIGNoZWNrIHRoZSByZXN1bHQgKi8KLSAgICByZXR1cm4gKGkgPT0gbnVtX3NhbXBsZXMpID8gMSA6IC0xOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3BubWlvL3BubXV0aWwuYyBiL3NyYy9wbm1pby9wbm11dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNzgwNWEuLjAwMDAwMDAKLS0tIGEvc3JjL3BubWlvL3BubXV0aWwuYworKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioKLSAqIHBubXV0aWwuYwotICogUE5NIHV0aWxpdGllcy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwOCBDb3NtaW4gVHJ1dGEuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcG5taW8gbGlicmFyeSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHpsaWIgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbm1pby5oLgotICoqLwotCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgInBubWlvLmgiCi0KLQotLyoqCi0gKiBWYWxpZGF0ZXMgYSBQTk0gc3RydWN0dXJlLgotICogUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZS4KLSAqKi8KLWludCBwbm1faXNfdmFsaWQoY29uc3QgcG5tX3N0cnVjdCAqcG5tX3B0cikKLXsKLSAgICB1bnNpZ25lZCBpbnQgZm9ybWF0ID0gcG5tX3B0ci0+Zm9ybWF0OwotICAgIHVuc2lnbmVkIGludCBkZXB0aCAgPSBwbm1fcHRyLT5kZXB0aDsKLSAgICB1bnNpZ25lZCBpbnQgd2lkdGggID0gcG5tX3B0ci0+d2lkdGg7Ci0gICAgdW5zaWduZWQgaW50IGhlaWdodCA9IHBubV9wdHItPmhlaWdodDsKLSAgICB1bnNpZ25lZCBpbnQgbWF4dmFsID0gcG5tX3B0ci0+bWF4dmFsOwotCi0gICAgaWYgKGRlcHRoID09IDAgfHwgd2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCB8fCBtYXh2YWwgPT0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSNpZiBQTk1fVUlOVF9NQVggPCBVSU5UX01BWAotICAgIGlmIChtYXh2YWwgPiBQTk1fVUlOVF9NQVgpCi0gICAgICAgIHJldHVybiAwOwotI2VuZGlmCi0KLSAgICBzd2l0Y2ggKGZvcm1hdCkKLSAgICB7Ci0gICAgY2FzZSBQTk1fUDE6Ci0gICAgY2FzZSBQTk1fUDQ6Ci0gICAgICAgIC8qIFBCTSAqLwotICAgICAgICByZXR1cm4gKGRlcHRoID09IDEgJiYgbWF4dmFsID09IDEpID8gMSA6IDA7Ci0gICAgY2FzZSBQTk1fUDI6Ci0gICAgY2FzZSBQTk1fUDU6Ci0gICAgICAgIC8qIFBHTSAqLwotICAgICAgICByZXR1cm4gKGRlcHRoID09IDEpID8gMSA6IDA7Ci0gICAgY2FzZSBQTk1fUDM6Ci0gICAgY2FzZSBQTk1fUDY6Ci0gICAgICAgIC8qIFBQTSAqLwotICAgICAgICByZXR1cm4gKGRlcHRoID09IDMpID8gMSA6IDA7Ci0gICAgY2FzZSBQTk1fUDc6Ci0gICAgICAgIC8qIFBBTSAqLwotICAgICAgICByZXR1cm4gMTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLQotLyoqCi0gKiBDYWxjdWxhdGVzIHRoZSBzaXplIG9mIGEgcmF3IFBOTSBzYW1wbGUsIGkuZS4gdGhlIHNtYWxsZXN0IG51bWJlciBvZgotICogYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgYSBzYW1wbGUgdmFsdWUgYmV0d2VlbiAwIGFuZCBwbm1fcHRyLT5tYXh2YWwuCi0gKiBUaGUgdmFsaWRpdHkgY2hlY2sgcGVyZm9ybWVkIG9uIHRoZSBQTk0gc3RydWN0dXJlIGlzIG9ubHkgcGFydGlhbC4KLSAqIFJldHVybnMgdGhlIHJhdyBzYW1wbGUgc2l6ZSBvbiBzdWNjZXNzLCBvciAwIG9uIHZhbGlkYXRpb24gZmFpbHVyZS4KLSAqKi8KLXNpemVfdCBwbm1fcmF3X3NhbXBsZV9zaXplKGNvbnN0IHBubV9zdHJ1Y3QgKnBubV9wdHIpCi17Ci0gICAgdW5zaWduZWQgaW50IG1heHZhbCA9IHBubV9wdHItPm1heHZhbDsKLQotICAgIGlmIChtYXh2YWwgPT0gMCkKLSAgICAgICAgZXJybm8gPSBFSU5WQUw7ICAvKiBmYWxsIHRocm91Z2ggKi8KLQotICAgIGlmIChtYXh2YWwgPD0gMHhmZlUpCi0gICAgICAgIHJldHVybiAxOwotICAgIGVsc2UgaWYgKG1heHZhbCA8PSAweGZmZmZVKQotICAgICAgICByZXR1cm4gMjsKLSNpZiBQTk1fVUlOVF9CSVQgPiAxNgotICAgIGVsc2UgaWYgKG1heHZhbCA8PSAweGZmZmZmZlUpCi0gICAgICAgIHJldHVybiAzOwotICAgIGVsc2UgaWYgKG1heHZhbCA8PSAweGZmZmZmZmZmVSkKLSAgICAgICAgcmV0dXJuIDQ7Ci0jZW5kaWYKLSAgICBlbHNlICAvKiBtYXh2YWwgPiBQTk1fVUlOVF9NQVggKi8KLSAgICB7Ci0gICAgICAgIGVycm5vID0gRUlOVkFMOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLQotLyoqCi0gKiBDYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2NjdXBpZWQgYnkgYW4gYXJyYXkgb2YgUE5NIHNhbXBsZXMuCi0gKiBUaGUgYnl0ZSBjb3VudCBpcyBzYW1wbGVfc2l6ZSAqIHBubV9wdHItPmRlcHRoICogcG5tX3B0ci0+d2lkdGggKiBudW1fcm93cy4KLSAqIFRoZSB2YWxpZGl0eSBjaGVjayBwZXJmb3JtZWQgb24gdGhlIFBOTSBzdHJ1Y3R1cmUgaXMgb25seSBwYXJ0aWFsLgotICogUmV0dXJucyB0aGUgYXJyYXkgc2l6ZSBvbiBzdWNjZXNzLCBvciAwIG9uIHZhbGlkYXRpb24gZmFpbHVyZS4KLSAqKi8KLXNpemVfdCBwbm1fbWVtX3NpemUoY29uc3QgcG5tX3N0cnVjdCAqcG5tX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNhbXBsZV9zaXplLCB1bnNpZ25lZCBpbnQgbnVtX3Jvd3MpCi17Ci0gICAgdW5zaWduZWQgaW50IGRlcHRoID0gcG5tX3B0ci0+ZGVwdGg7Ci0gICAgdW5zaWduZWQgaW50IHdpZHRoID0gcG5tX3B0ci0+d2lkdGg7Ci0KLSAgICBpZiAoc2FtcGxlX3NpemUgPT0gMCB8fCBkZXB0aCA9PSAwIHx8IHdpZHRoID09IDApCi0gICAgewotICAgICAgICBlcnJubyA9IEVJTlZBTDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKG51bV9yb3dzID4gKHNpemVfdCkoLTEpIC8gc2FtcGxlX3NpemUgLyBkZXB0aCAvIHdpZHRoKQotICAgIHsKLSAgICAgICAgZXJybm8gPSBFUkFOR0U7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBzYW1wbGVfc2l6ZSAqIGRlcHRoICogd2lkdGggKiBudW1fcm93czsKLX0KZGlmZiAtLWdpdCBhL3NyYy96bGliL0NNYWtlTGlzdHMudHh0IGIvc3JjL3psaWIvQ01ha2VMaXN0cy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZTNiYzQuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvQ01ha2VMaXN0cy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuNC40KQotc2V0KENNQUtFX0FMTE9XX0xPT1NFX0xPT1BfQ09OU1RSVUNUUyBPTikKLQotcHJvamVjdCh6bGliIEMpCi0KLXNldChWRVJTSU9OICIxLjIuNyIpCi0KLXNldChJTlNUQUxMX0JJTl9ESVIgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L2JpbiIgQ0FDSEUgUEFUSCAiSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgZXhlY3V0YWJsZXMiKQotc2V0KElOU1RBTExfTElCX0RJUiAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vbGliIiBDQUNIRSBQQVRIICJJbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBsaWJyYXJpZXMiKQotc2V0KElOU1RBTExfSU5DX0RJUiAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vaW5jbHVkZSIgQ0FDSEUgUEFUSCAiSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgaGVhZGVycyIpCi1zZXQoSU5TVEFMTF9NQU5fRElSICIke0NNQUtFX0lOU1RBTExfUFJFRklYfS9zaGFyZS9tYW4iIENBQ0hFIFBBVEggIkluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIG1hbnVhbCBwYWdlcyIpCi1zZXQoSU5TVEFMTF9QS0dDT05GSUdfRElSICIke0NNQUtFX0lOU1RBTExfUFJFRklYfS9zaGFyZS9wa2djb25maWciIENBQ0hFIFBBVEggIkluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIHBrZ2NvbmZpZyAoLnBjKSBmaWxlcyIpCi0KLWluY2x1ZGUoQ2hlY2tUeXBlU2l6ZSkKLWluY2x1ZGUoQ2hlY2tGdW5jdGlvbkV4aXN0cykKLWluY2x1ZGUoQ2hlY2tJbmNsdWRlRmlsZSkKLWluY2x1ZGUoQ2hlY2tDU291cmNlQ29tcGlsZXMpCi1lbmFibGVfdGVzdGluZygpCi0KLWNoZWNrX2luY2x1ZGVfZmlsZShzeXMvdHlwZXMuaCBIQVZFX1NZU19UWVBFU19IKQotY2hlY2tfaW5jbHVkZV9maWxlKHN0ZGludC5oICAgIEhBVkVfU1RESU5UX0gpCi1jaGVja19pbmNsdWRlX2ZpbGUoc3RkZGVmLmggICAgSEFWRV9TVERERUZfSCkKLQotIwotIyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBsYXJnZSBmaWxlIHN1cHBvcnQKLSMKLXNldChDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUyAtRF9MQVJHRUZJTEU2NF9TT1VSQ0U9MSkKLSMgV2UgYWRkIHRoZXNlIG90aGVyIGRlZmluaXRpb25zIGhlcmUgYmVjYXVzZSBDaGVja1R5cGVTaXplLmNtYWtlCi0jIGluIENNYWtlIDIuNC54IGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgZG8gc28gYW5kIHdlIHdhbnQKLSMgY29tcGF0aWJpbGl0eSB3aXRoIENNYWtlIDIuNC54LgotaWYoSEFWRV9TWVNfVFlQRVNfSCkKLSAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUyAtREhBVkVfU1lTX1RZUEVTX0gpCi1lbmRpZigpCi1pZihIQVZFX1NURElOVF9IKQotICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TIC1ESEFWRV9TVERJTlRfSCkKLWVuZGlmKCkKLWlmKEhBVkVfU1REREVGX0gpCi0gICAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgLURIQVZFX1NURERFRl9IKQotZW5kaWYoKQotY2hlY2tfdHlwZV9zaXplKG9mZjY0X3QgT0ZGNjRfVCkKLWlmKEhBVkVfT0ZGNjRfVCkKLSAgIGFkZF9kZWZpbml0aW9ucygtRF9MQVJHRUZJTEU2NF9TT1VSQ0U9MSkKLWVuZGlmKCkKLXNldChDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUykgIyBjbGVhciB2YXJpYWJsZQotCi0jCi0jIENoZWNrIGZvciBmc2Vla28KLSMKLWNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhmc2Vla28gSEFWRV9GU0VFS08pCi1pZihOT1QgSEFWRV9GU0VFS08pCi0gICAgYWRkX2RlZmluaXRpb25zKC1ETk9fRlNFRUtPKQotZW5kaWYoKQotCi0jCi0jIENoZWNrIGZvciB1bmlzdGQuaAotIwotY2hlY2tfaW5jbHVkZV9maWxlKHVuaXN0ZC5oIFpfSEFWRV9VTklTVERfSCkKLQotaWYoTVNWQykKLSAgICBzZXQoQ01BS0VfREVCVUdfUE9TVEZJWCAiZCIpCi0gICAgYWRkX2RlZmluaXRpb25zKC1EX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFKQotICAgIGFkZF9kZWZpbml0aW9ucygtRF9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEUpCi0gICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCi1lbmRpZigpCi0KLWlmKE5PVCBDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVIgU1RSRVFVQUwgQ01BS0VfQ1VSUkVOVF9CSU5BUllfRElSKQotICAgICMgSWYgd2UncmUgZG9pbmcgYW4gb3V0IG9mIHNvdXJjZSBidWlsZCBhbmQgdGhlIHVzZXIgaGFzIGEgemNvbmYuaAotICAgICMgaW4gdGhlaXIgc291cmNlIHRyZWUuLi4KLSAgICBpZihFWElTVFMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3pjb25mLmgpCi0gICAgICAgIG1lc3NhZ2UoU1RBVFVTICJSZW5hbWluZyIpCi0gICAgICAgIG1lc3NhZ2UoU1RBVFVTICIgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3pjb25mLmgiKQotICAgICAgICBtZXNzYWdlKFNUQVRVUyAidG8gJ3pjb25mLmguaW5jbHVkZWQnIGJlY2F1c2UgdGhpcyBmaWxlIGlzIGluY2x1ZGVkIHdpdGggemxpYiIpCi0gICAgICAgIG1lc3NhZ2UoU1RBVFVTICJidXQgQ01ha2UgZ2VuZXJhdGVzIGl0IGF1dG9tYXRpY2FsbHkgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeS4iKQotICAgICAgICBmaWxlKFJFTkFNRSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vemNvbmYuaCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vemNvbmYuaC5pbmNsdWRlZCkKLSAgZW5kaWYoKQotZW5kaWYoKQotCi1zZXQoWkxJQl9QQyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vemxpYi5wYykKLWNvbmZpZ3VyZV9maWxlKCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vemxpYi5wYy5jbWFrZWluCi0JCSR7WkxJQl9QQ30gQE9OTFkpCi1jb25maWd1cmVfZmlsZSgJJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3pjb25mLmguY21ha2VpbgotCQkke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vemNvbmYuaCBAT05MWSkKLWluY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9ICR7Q01BS0VfU09VUkNFX0RJUn0pCi0KLQotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgemxpYgotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotc2V0KFpMSUJfUFVCTElDX0hEUlMKLSAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vemNvbmYuaAotICAgIHpsaWIuaAotKQotc2V0KFpMSUJfUFJJVkFURV9IRFJTCi0gICAgY3JjMzIuaAotICAgIGRlZmxhdGUuaAotICAgIGd6Z3V0cy5oCi0gICAgaW5mZmFzdC5oCi0gICAgaW5mZml4ZWQuaAotICAgIGluZmxhdGUuaAotICAgIGluZnRyZWVzLmgKLSAgICB0cmVlcy5oCi0gICAgenV0aWwuaAotKQotc2V0KFpMSUJfU1JDUwotICAgIGFkbGVyMzIuYwotICAgIGNvbXByZXNzLmMKLSAgICBjcmMzMi5jCi0gICAgZGVmbGF0ZS5jCi0gICAgZ3pjbG9zZS5jCi0gICAgZ3psaWIuYwotICAgIGd6cmVhZC5jCi0gICAgZ3p3cml0ZS5jCi0gICAgaW5mbGF0ZS5jCi0gICAgaW5mYmFjay5jCi0gICAgaW5mdHJlZXMuYwotICAgIGluZmZhc3QuYwotICAgIHRyZWVzLmMKLSAgICB1bmNvbXByLmMKLSAgICB6dXRpbC5jCi0pCi0KLWlmKE5PVCBNSU5HVykKLSAgICBzZXQoWkxJQl9TUkNTICR7WkxJQl9TUkNTfQotICAgICAgICB3aW4zMi96bGliMS5yYyAjIElmIHByZXNlbnQgd2lsbCBvdmVycmlkZSBjdXN0b20gYnVpbGQgcnVsZSBiZWxvdy4KLSAgICApCi1lbmRpZigpCi0KLSMgcGFyc2UgdGhlIGZ1bGwgdmVyc2lvbiBudW1iZXIgZnJvbSB6bGliLmggYW5kIGluY2x1ZGUgaW4gWkxJQl9GVUxMX1ZFUlNJT04KLWZpbGUoUkVBRCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vemxpYi5oIF96bGliX2hfY29udGVudHMpCi1zdHJpbmcoUkVHRVggUkVQTEFDRSAiLiojZGVmaW5lWyBcdF0rWkxJQl9WRVJTSU9OWyBcdF0rXCIoWy0wLTlBLVphLXouXSspXCIuKiIKLSAgICAiXFwxIiBaTElCX0ZVTExfVkVSU0lPTiAke196bGliX2hfY29udGVudHN9KQotCi1pZihNSU5HVykKLSAgICAjIFRoaXMgZ2V0cyB1cyBETEwgcmVzb3VyY2UgaW5mb3JtYXRpb24gd2hlbiBjb21waWxpbmcgb24gTWluR1cuCi0gICAgaWYoTk9UIENNQUtFX1JDX0NPTVBJTEVSKQotICAgICAgICBTRVQoQ01BS0VfUkNfQ09NUElMRVIgd2luZHJlcy5leGUpCi0gICAgZW5kaWYoKQotCi0gICAgYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vemxpYjFyYy5vYmoKLSAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX1JDX0NPTVBJTEVSfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1EIEdDQ19XSU5EUkVTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLUkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLUkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLW8gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3psaWIxcmMub2JqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLWkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3dpbjMyL3psaWIxLnJjKQotICAgIHNldChaTElCX1NSQ1MgJHtaTElCX1NSQ1N9ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS96bGliMXJjLm9iaikKLWVuZGlmKE1JTkdXKQotCi1hZGRfbGlicmFyeSh6bGliIFNIQVJFRCAke1pMSUJfU1JDU30gJHtaTElCX1BVQkxJQ19IRFJTfSAke1pMSUJfUFJJVkFURV9IRFJTfSkKLWFkZF9saWJyYXJ5KHpsaWJzdGF0aWMgU1RBVElDICR7WkxJQl9TUkNTfSAke1pMSUJfUFVCTElDX0hEUlN9ICR7WkxJQl9QUklWQVRFX0hEUlN9KQotc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHpsaWIgUFJPUEVSVElFUyBERUZJTkVfU1lNQk9MIFpMSUJfRExMKQotc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHpsaWIgUFJPUEVSVElFUyBTT1ZFUlNJT04gMSkKLQotaWYoTk9UIENZR1dJTikKLSAgICAjIFRoaXMgcHJvcGVydHkgY2F1c2VzIHNoYXJlZCBsaWJyYXJpZXMgb24gTGludXggdG8gaGF2ZSB0aGUgZnVsbCB2ZXJzaW9uCi0gICAgIyBlbmNvZGVkIGludG8gdGhlaXIgZmluYWwgZmlsZW5hbWUuICBXZSBkaXNhYmxlIHRoaXMgb24gQ3lnd2luIGJlY2F1c2UKLSAgICAjIGl0IGNhdXNlcyBjeWd6LSR7WkxJQl9GVUxMX1ZFUlNJT059LmRsbCB0byBiZSBjcmVhdGVkIHdoZW4gY3lnei5kbGwKLSAgICAjIHNlZW1zIHRvIGJlIHRoZSBkZWZhdWx0LgotICAgICMKLSAgICAjIFRoaXMgaGFzIG5vIGVmZmVjdCB3aXRoIE1TVkMsIG9uIHRoYXQgcGxhdGZvcm0gdGhlIHZlcnNpb24gaW5mbyBmb3IKLSAgICAjIHRoZSBETEwgY29tZXMgZnJvbSB0aGUgcmVzb3VyY2UgZmlsZSB3aW4zMi96bGliMS5yYwotICAgIHNldF90YXJnZXRfcHJvcGVydGllcyh6bGliIFBST1BFUlRJRVMgVkVSU0lPTiAke1pMSUJfRlVMTF9WRVJTSU9OfSkKLWVuZGlmKCkKLQotaWYoVU5JWCkKLSAgICAjIE9uIHVuaXgtbGlrZSBwbGF0Zm9ybXMgdGhlIGxpYnJhcnkgaXMgYWxtb3N0IGFsd2F5cyBjYWxsZWQgbGliegotICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHpsaWIgemxpYnN0YXRpYyBQUk9QRVJUSUVTIE9VVFBVVF9OQU1FIHopCi0gICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoemxpYiBQUk9QRVJUSUVTIExJTktfRkxBR1MgIi1XbCwtLXZlcnNpb24tc2NyaXB0LCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS96bGliLm1hcCIpCi1lbHNlaWYoQlVJTERfU0hBUkVEX0xJQlMgQU5EIFdJTjMyKQotICAgICMgQ3JlYXRlcyB6bGliMS5kbGwgd2hlbiBidWlsZGluZyBzaGFyZWQgbGlicmFyeSB2ZXJzaW9uCi0gICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHpsaWIgUFJPUEVSVElFUyBTVUZGSVggIjEuZGxsIikKLWVuZGlmKCkKLQotaWYoTk9UIFNLSVBfSU5TVEFMTF9MSUJSQVJJRVMgQU5EIE5PVCBTS0lQX0lOU1RBTExfQUxMICkKLSAgICBpbnN0YWxsKFRBUkdFVFMgemxpYiB6bGlic3RhdGljCi0gICAgICAgIFJVTlRJTUUgREVTVElOQVRJT04gIiR7SU5TVEFMTF9CSU5fRElSfSIKLSAgICAgICAgQVJDSElWRSBERVNUSU5BVElPTiAiJHtJTlNUQUxMX0xJQl9ESVJ9IgotICAgICAgICBMSUJSQVJZIERFU1RJTkFUSU9OICIke0lOU1RBTExfTElCX0RJUn0iICkKLWVuZGlmKCkKLWlmKE5PVCBTS0lQX0lOU1RBTExfSEVBREVSUyBBTkQgTk9UIFNLSVBfSU5TVEFMTF9BTEwgKQotICAgIGluc3RhbGwoRklMRVMgJHtaTElCX1BVQkxJQ19IRFJTfSBERVNUSU5BVElPTiAiJHtJTlNUQUxMX0lOQ19ESVJ9IikKLWVuZGlmKCkKLWlmKE5PVCBTS0lQX0lOU1RBTExfRklMRVMgQU5EIE5PVCBTS0lQX0lOU1RBTExfQUxMICkKLSAgICBpbnN0YWxsKEZJTEVTIHpsaWIuMyBERVNUSU5BVElPTiAiJHtJTlNUQUxMX01BTl9ESVJ9L21hbjMiKQotZW5kaWYoKQotaWYoTk9UIFNLSVBfSU5TVEFMTF9GSUxFUyBBTkQgTk9UIFNLSVBfSU5TVEFMTF9BTEwgKQotICAgIGluc3RhbGwoRklMRVMgJHtaTElCX1BDfSBERVNUSU5BVElPTiAiJHtJTlNUQUxMX1BLR0NPTkZJR19ESVJ9IikKLWVuZGlmKCkKLQotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRXhhbXBsZSBiaW5hcmllcwotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotYWRkX2V4ZWN1dGFibGUoZXhhbXBsZSB0ZXN0L2V4YW1wbGUuYykKLXRhcmdldF9saW5rX2xpYnJhcmllcyhleGFtcGxlIHpsaWIpCi1hZGRfdGVzdChleGFtcGxlIGV4YW1wbGUpCi0KLWFkZF9leGVjdXRhYmxlKG1pbmlnemlwIHRlc3QvbWluaWd6aXAuYykKLXRhcmdldF9saW5rX2xpYnJhcmllcyhtaW5pZ3ppcCB6bGliKQotCi1pZihIQVZFX09GRjY0X1QpCi0gICAgYWRkX2V4ZWN1dGFibGUoZXhhbXBsZTY0IHRlc3QvZXhhbXBsZS5jKQotICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhleGFtcGxlNjQgemxpYikKLSAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZXhhbXBsZTY0IFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLURfRklMRV9PRkZTRVRfQklUUz02NCIpCi0gICAgYWRkX3Rlc3QoZXhhbXBsZTY0IGV4YW1wbGU2NCkKLQotICAgIGFkZF9leGVjdXRhYmxlKG1pbmlnemlwNjQgdGVzdC9taW5pZ3ppcC5jKQotICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhtaW5pZ3ppcDY0IHpsaWIpCi0gICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKG1pbmlnemlwNjQgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItRF9GSUxFX09GRlNFVF9CSVRTPTY0IikKLWVuZGlmKCkKZGlmZiAtLWdpdCBhL3NyYy96bGliL0NoYW5nZUxvZyBiL3NyYy96bGliL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJjNjQzYS4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwxNDA5ICswLDAgQEAKLQotICAgICAgICAgICAgICAgIENoYW5nZUxvZyBmaWxlIGZvciB6bGliCi0KLUNoYW5nZXMgaW4gMS4yLjcgKDIgTWF5IDIwMTIpCi0tIFJlcGxhY2UgdXNlIG9mIG1lbW1vdmUoKSB3aXRoIGEgc2ltcGxlIGNvcHkgZm9yIHBvcnRhYmlsaXR5Ci0tIFRlc3QgZm9yIGV4aXN0ZW5jZSBvZiBzdHJlcnJvcgotLSBSZXN0b3JlIGd6Z2V0Y18gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCAxLjIuNgotLSBGaXggYnVpbGQgd2l0aCBub24tR05VIG1ha2Ugb24gU29sYXJpcwotLSBSZXF1aXJlIGdjYyA0LjAgb3IgbGF0ZXIgb24gTWFjIE9TIFggdG8gdXNlIHRoZSBoaWRkZW4gYXR0cmlidXRlCi0tIEluY2x1ZGUgdW5pc3RkLmggZm9yIFdhdGNvbSBDCi0tIFVzZSBfX1dBVENPTUNfXyBpbnN0ZWFkIG9mIF9fV0FUQ09NX18KLS0gRG8gbm90IHVzZSB0aGUgdmlzaWJpbGl0eSBhdHRyaWJ1dGUgaWYgTk9fVklaIGRlZmluZWQKLS0gSW1wcm92ZSB0aGUgZGV0ZWN0aW9uIG9mIG5vIGhpZGRlbiB2aXNpYmlsaXR5IGF0dHJpYnV0ZQotLSBBdm9pZCB1c2luZyBfX2ludDY0IGZvciBnY2Mgb3Igc29sbyBjb21waWxhdGlvbgotLSBDYXN0IHRvIGNoYXIgKiBpbiBnenByaW50ZiB0byBhdm9pZCB3YXJuaW5ncyBbWmluc2VyXQotLSBGaXggbWFrZV92bXMuY29tIGZvciBWQVggW1ppbnNlcl0KLS0gRG9uJ3QgdXNlIGxpYnJhcnkgb3IgYnVpbHQtaW4gYnl0ZSBzd2FwcwotLSBTaW1wbGlmeSB0ZXN0IGFuZCB1c2Ugb2YgZ2NjIGhpZGRlbiBhdHRyaWJ1dGUKLS0gRml4IGJ1ZyBpbiBnemNsb3NlX3coKSB3aGVuIGd6d3JpdGUoKSBmYWlscyB0byBhbGxvY2F0ZSBtZW1vcnkKLS0gQWRkICJ4IiAoT19FWENMKSBhbmQgImUiIChPX0NMT0VYRUMpIG1vZGVzIHN1cHBvcnQgdG8gZ3pvcGVuKCkKLS0gRml4IGJ1ZyBpbiB0ZXN0L21pbmlnemlwLmMgZm9yIGNvbmZpZ3VyZSAtLXNvbG8KLS0gRml4IGNvbnRyaWIvdnN0dWRpbyBwcm9qZWN0IGxpbmsgZXJyb3JzIFtNb2hhbmF0aGFzXQotLSBBZGQgYWJpbGl0eSB0byBjaG9vc2UgdGhlIGJ1aWxkZXIgaW4gbWFrZV92bXMuY29tIFtTY2h3ZWRhXQotLSBBZGQgREVTVERJUiBzdXBwb3J0IHRvIG1pbmd3MzIgd2luMzIvTWFrZWZpbGUuZ2NjCi0tIEZpeCBjb21tZW50cyBpbiB3aW4zMi9NYWtlZmlsZS5nY2MgZm9yIHByb3BlciB1c2FnZQotLSBBbGxvdyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IGluc3RhbGwgbG9jYXRpb25zIGZvciBjbWFrZQotLSBHZW5lcmF0ZSBhbmQgaW5zdGFsbCB0aGUgcGtnLWNvbmZpZyBmaWxlIHdpdGggY21ha2UKLS0gQnVpbGQgYm90aCBhIHN0YXRpYyBhbmQgYSBzaGFyZWQgdmVyc2lvbiBvZiB6bGliIHdpdGggY21ha2UKLS0gSW5jbHVkZSB2ZXJzaW9uIHN5bWJvbHMgZm9yIGNtYWtlIGJ1aWxkcwotLSBJZiB1c2luZyBjbWFrZSB3aXRoIE1TVkMsIGFkZCB0aGUgc291cmNlIGRpcmVjdG9yeSB0byB0aGUgaW5jbHVkZXMKLS0gUmVtb3ZlIHVubmVlZGVkIEVYVFJBX0NGTEFHUyBmcm9tIHdpbjMyL01ha2VmaWxlLmdjYyBbVHJ1dGFdCi0tIE1vdmUgb2Jzb2xldGUgZW14IG1ha2VmaWxlIHRvIG9sZCBbVHJ1dGFdCi0tIEFsbG93IHRoZSB1c2Ugb2YgLVd1bmRlZiB3aGVuIGNvbXBpbGluZyBvciB1c2luZyB6bGliCi0tIEF2b2lkIHRoZSB1c2Ugb2YgdGhlIC11IG9wdGlvbiB3aXRoIG1rdGVtcAotLSBJbXByb3ZlIGluZmxhdGUoKSBkb2N1bWVudGF0aW9uIG9uIHRoZSB1c2Ugb2YgWl9GSU5JU0gKLS0gUmVjb2duaXplIGNsYW5nIGFzIGdjYwotLSBBZGQgZ3pvcGVuX3coKSBpbiBXaW5kb3dzIGZvciB3aWRlIGNoYXJhY3RlciBwYXRoIG5hbWVzCi0tIFJlbmFtZSB6Y29uZi5oIGluIENNYWtlTGlzdHMudHh0IHRvIG1vdmUgaXQgb3V0IG9mIHRoZSB3YXkKLS0gQWRkIHNvdXJjZSBkaXJlY3RvcnkgaW4gQ01ha2VMaXN0cy50eHQgZm9yIGJ1aWxkaW5nIGV4YW1wbGVzCi0tIExvb2sgaW4gYnVpbGQgZGlyZWN0b3J5IGZvciB6bGliLnBjIGluIENNYWtlTGlzdHMudHh0Ci0tIFJlbW92ZSBnemZsYWdzIGZyb20gemxpYnZjLmRlZiBpbiB2YzkgYW5kIHZjMTAKLS0gRml4IGNvbnRyaWIvbWluaXppcCBjb21waWxhdGlvbiBpbiB0aGUgTWluR1cgZW52aXJvbm1lbnQKLS0gVXBkYXRlIC4vY29uZmlndXJlIGZvciBTb2xhcmlzLCBzdXBwb3J0IC0tNjQgW01vb25leV0KLS0gUmVtb3ZlIC1SLiBmcm9tIFNvbGFyaXMgc2hhcmVkIGJ1aWxkIChwb3NzaWJsZSBzZWN1cml0eSBpc3N1ZSkKLS0gQXZvaWQgcmFjZSBjb25kaXRpb24gZm9yIHBhcmFsbGVsIG1ha2UgKC1qKSBydW5uaW5nIGV4YW1wbGUKLS0gRml4IHR5cGUgbWlzbWF0Y2ggYmV0d2VlbiBnZXRfY3JjX3RhYmxlKCkgYW5kIGNyY190YWJsZQotLSBGaXggcGFyc2luZyBvZiB2ZXJzaW9uIHdpdGggIi0iIGluIENNYWtlTGlzdHMudHh0IFtTbmlkZXIsIFppZWdsZXJdCi0tIEZpeCB0aGUgcGF0aCB0byB6bGliLm1hcCBpbiBDTWFrZUxpc3RzLnR4dAotLSBGb3JjZSB0aGUgbmF0aXZlIGxpYnRvb2wgaW4gTWFjIE9TIFggdG8gYXZvaWQgR05VIGxpYnRvb2wgW0JlZWJlXQotLSBBZGQgaW5zdHJ1Y3Rpb25zIHRvIHdpbjMyL01ha2VmaWxlLmdjYyBmb3Igc2hhcmVkIGluc3RhbGwgW1RvcnJpXQotCi1DaGFuZ2VzIGluIDEuMi42LjEgKDEyIEZlYiAyMDEyKQotLSBBdm9pZCB0aGUgdXNlIG9mIHRoZSBPYmplY3RpdmUtQyByZXNlcnZlZCBuYW1lICJpZCIKLS0gSW5jbHVkZSBpby5oIGluIGd6Z3V0cy5oIGZvciBNaWNyb3NvZnQgY29tcGlsZXJzCi0tIEZpeCBwcm9ibGVtIHdpdGggLi9jb25maWd1cmUgLS1wcmVmaXggYW5kIGd6Z2V0YyBtYWNybwotLSBJbmNsdWRlIGd6X2hlYWRlciBkZWZpbml0aW9uIHdoZW4gY29tcGlsaW5nIHpsaWIgc29sbwotLSBQdXQgZ3pmbGFncygpIGZ1bmN0aW9uYWxpdHkgYmFjayBpbiB6dXRpbC5jCi0tIEF2b2lkIGxpYnJhcnkgaGVhZGVyIGluY2x1ZGUgaW4gY3JjMzIuYyBmb3IgWl9TT0xPCi0tIFVzZSBuYW1lIGluIEdDQ19DTEFTU0lDIGFzIEMgY29tcGlsZXIgZm9yIGNvdmVyYWdlIHRlc3RpbmcsIGlmIHNldAotLSBNaW5vciBjbGVhbnVwIGluIGNvbnRyaWIvbWluaXppcC96aXAuYyBbVm9sbGFudF0KLS0gVXBkYXRlIG1ha2Vfdm1zLmNvbSBbWmluc2VyXQotLSBSZW1vdmUgdW5uZWNlc3NhcnkgZ3pnZXRjXyBmdW5jdGlvbgotLSBVc2Ugb3B0aW1pemVkIGJ5dGUgc3dhcCBvcGVyYXRpb25zIGZvciBNaWNyb3NvZnQgYW5kIEdOVSBbU255ZGVyXQotLSBGaXggbWlub3IgdHlwbyBpbiB6bGliLmggY29tbWVudHMgW1J6ZXNuaW93aWVja2ldCi0KLUNoYW5nZXMgaW4gMS4yLjYgKDI5IEphbiAyMDEyKQotLSBVcGRhdGUgdGhlIFBhc2NhbCBpbnRlcmZhY2UgaW4gY29udHJpYi9wYXNjYWwKLS0gRml4IGZ1bmN0aW9uIG51bWJlcnMgZm9yIGd6Z2V0Y18gaW4gemxpYnZjLmRlZiBmaWxlcwotLSBGaXggY29uZmlndXJlLmFjIGZvciBjb250cmliL21pbml6aXAgW1NjaGlmZmVyXQotLSBGaXggbGFyZ2UtZW50cnkgZGV0ZWN0aW9uIGluIG1pbml6aXAgb24gNjQtYml0IHN5c3RlbXMgW1NjaGlmZmVyXQotLSBIYXZlIC4vY29uZmlndXJlIHVzZSB0aGUgY29tcGlsZXIgcmV0dXJuIGNvZGUgZm9yIGVycm9yIGluZGljYXRpb24KLS0gRml4IENNYWtlTGlzdHMudHh0IGZvciBjcm9zcyBjb21waWxhdGlvbiBbTWNDbHVyZV0KLS0gRml4IGNvbnRyaWIvbWluaXppcC96aXAuYyBmb3IgNjQtYml0IGFyY2hpdGVjdHVyZXMgW0RhbHNuZXNdCi0tIEZpeCBjb21waWxhdGlvbiBvZiBjb250cmliL21pbml6aXAgb24gRnJlZUJTRCBbTWFycXVlel0KLS0gQ29ycmVjdCBzdWdnZXN0ZWQgdXNhZ2VzIGluIHdpbjMyL01ha2VmaWxlLm1zYyBbU2hhY2hhciwgSG9ydmF0aF0KLS0gSW5jbHVkZSBpby5oIGZvciBUdXJibyBDIC8gQm9ybGFuZCBDIG9uIGFsbCBwbGF0Zm9ybXMgW1RydXRhXQotLSBNYWtlIHZlcnNpb24gZXhwbGljaXQgaW4gY29udHJpYi9taW5pemlwL2NvbmZpZ3VyZS5hYyBbQm9zbWFuc10KLS0gQXZvaWQgd2FybmluZyBmb3Igbm8gZW5jcnlwdGlvbiBpbiBjb250cmliL21pbml6aXAvemlwLmMgW1ZvbGxhbnRdCi0tIE1pbm9yIGNsZWFudXAgdXAgY29udHJpYi9taW5pemlwL3VuemlwLmMgW1ZvbGxhbnRdCi0tIEZpeCBidWcgd2hlbiBjb21waWxpbmcgbWluaXppcCB3aXRoIEMrKyBbVm9sbGFudF0KLS0gUHJvdGVjdCBmb3IgbG9uZyBuYW1lIGFuZCBleHRyYSBmaWVsZHMgaW4gY29udHJpYi9taW5pemlwIFtWb2xsYW50XQotLSBBdm9pZCBzb21lIHdhcm5pbmdzIGluIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0KLS0gQWRkIC1JLi4vLi4gLUwuLi8uLiB0byBDRkxBR1MgZm9yIG1pbml6aXAgYW5kIG1pbml1bnppcAotLSBBZGQgbWlzc2luZyBsaWJzIHRvIG1pbml6aXAgbGlua2VyIGNvbW1hbmQKLS0gQWRkIHN1cHBvcnQgZm9yIFZQQVRIIGJ1aWxkcyBpbiBjb250cmliL21pbml6aXAKLS0gQWRkIGFuIC0tZW5hYmxlLWRlbW9zIG9wdGlvbiB0byBjb250cmliL21pbml6aXAvY29uZmlndXJlCi0tIEFkZCB0aGUgZ2VuZXJhdGlvbiBvZiBjb25maWd1cmUubG9nIGJ5IC4vY29uZmlndXJlCi0tIEV4aXQgd2hlbiByZXF1aXJlZCBwYXJhbWV0ZXJzIG5vdCBwcm92aWRlZCB0byB3aW4zMi9NYWtlZmlsZS5nY2MKLS0gSGF2ZSBnenB1dGMgcmV0dXJuIHRoZSBjaGFyYWN0ZXIgd3JpdHRlbiBpbnN0ZWFkIG9mIHRoZSBhcmd1bWVudAotLSBVc2UgdGhlIC1tIG9wdGlvbiBvbiBsZGNvbmZpZyBmb3IgQlNEIHN5c3RlbXMgW1RvYmlhc10KLS0gQ29ycmVjdCBpbiB6bGliLm1hcCB3aGVuIGRlZmxhdGVSZXNldEtlZXAgd2FzIGFkZGVkCi0KLUNoYW5nZXMgaW4gMS4yLjUuMyAoMTUgSmFuIDIwMTIpCi0tIFJlc3RvcmUgZ3pnZXRjIGZ1bmN0aW9uIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eQotLSBEbyBub3QgdXNlIF9sc2Vla2k2NCB1bmRlciBCb3JsYW5kIEMrKyBbVHJ1dGFdCi0tIFVwZGF0ZSB3aW4zMi9NYWtlZmlsZS5tc2MgdG8gYnVpbGQgdGVzdC8qLmMgW1RydXRhXQotLSBSZW1vdmUgb2xkL3Zpc3VhbGM2IGdpdmVuIENNYWtlZmlsZSBhbmQgb3RoZXIgYWx0ZXJuYXRpdmVzCi0tIFVwZGF0ZSBBUzQwMCBidWlsZCBmaWxlcyBhbmQgZG9jdW1lbnRhdGlvbiBbTW9ubmVyYXRdCi0tIFVwZGF0ZSB3aW4zMi9NYWtlZmlsZS5nY2MgdG8gYnVpbGQgdGVzdC8qLmMgW1RydXRhXQotLSBQZXJtaXQgc3Ryb25nZXIgZmx1c2hlcyBhZnRlciBaX0JMT0NLIGZsdXNoZXMKLS0gQXZvaWQgZXh0cmFuZW91cyBlbXB0eSBibG9ja3Mgd2hlbiBkb2luZyBlbXB0eSBmbHVzaGVzCi0tIFBlcm1pdCBaX05VTEwgYXJndW1lbnRzIHRvIGRlZmxhdGVQZW5kaW5nCi0tIEFsbG93IGRlZmxhdGVQcmltZSgpIHRvIGluc2VydCBiaXRzIGluIHRoZSBtaWRkbGUgb2YgYSBzdHJlYW0KLS0gUmVtb3ZlIHNlY29uZCBlbXB0eSBzdGF0aWMgYmxvY2sgZm9yIFpfUEFSVElBTF9GTFVTSAotLSBXcml0ZSBvdXQgYWxsIG9mIHRoZSBhdmFpbGFibGUgYml0cyB3aGVuIHVzaW5nIFpfQkxPQ0sKLS0gSW5zZXJ0IHRoZSBmaXJzdCB0d28gc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBhZnRlciBhIGZsdXNoCi0KLUNoYW5nZXMgaW4gMS4yLjUuMiAoMTcgRGVjIDIwMTEpCi0tIGZpeCBsZCBlcnJvcjogdW5hYmxlIHRvIGZpbmQgdmVyc2lvbiBkZXBlbmRlbmN5ICdaTElCXzEuMi41JwotLSB1c2UgcmVsYXRpdmUgc3ltbGlua3MgZm9yIHNoYXJlZCBsaWJzCi0tIEF2b2lkIHNlYXJjaGluZyBwYXN0IHdpbmRvdyBmb3IgWl9STEUgc3RyYXRlZ3kKLS0gQXNzdXJlIHRoYXQgaGlnaC13YXRlciBtYXJrIGluaXRpYWxpemF0aW9uIGlzIGFsd2F5cyBhcHBsaWVkIGluIGRlZmxhdGUKLS0gQWRkIGFzc2VydGlvbnMgdG8gZmlsbF93aW5kb3coKSBpbiBkZWZsYXRlLmMgdG8gbWF0Y2ggY29tbWVudHMKLS0gVXBkYXRlIHB5dGhvbiBsaW5rIGluIFJFQURNRQotLSBDb3JyZWN0IHNwZWxsaW5nIGVycm9yIGluIGd6cmVhZC5jCi0tIEZpeCBidWcgaW4gZ3pnZXRzKCkgZm9yIGEgY29uY2F0ZW5hdGVkIGVtcHR5IGd6aXAgc3RyZWFtCi0tIENvcnJlY3QgZXJyb3IgaW4gY29tbWVudCBmb3IgZ3pfbWFrZSgpCi0tIENoYW5nZSBnenJlYWQoKSBhbmQgcmVsYXRlZCB0byBpZ25vcmUganVuayBhZnRlciBnemlwIHN0cmVhbXMKLS0gQWxsb3cgZ3pyZWFkKCkgYW5kIHJlbGF0ZWQgdG8gY29udGludWUgYWZ0ZXIgZ3pjbGVhcmVycigpCi0tIEFsbG93IGd6cmV3aW5kKCkgYW5kIGd6c2VlaygpIGFmdGVyIGEgcHJlbWF0dXJlIGVuZC1vZi1maWxlCi0tIFNpbXBsaWZ5IGd6c2VlaygpIG5vdyB0aGF0IHJhdyBhZnRlciBnemlwIGlzIGlnbm9yZWQKLS0gQ2hhbmdlIGd6Z2V0YygpIHRvIGEgbWFjcm8gZm9yIHNwZWVkICh+NDAlIHNwZWVkdXAgaW4gdGVzdGluZykKLS0gRml4IGd6Y2xvc2UoKSB0byByZXR1cm4gdGhlIGFjdHVhbCBlcnJvciBsYXN0IGVuY291bnRlcmVkCi0tIEFsd2F5cyBhZGQgbGFyZ2UgZmlsZSBzdXBwb3J0IGZvciB3aW5kb3dzCi0tIEluY2x1ZGUgemNvbmYuaCBmb3Igd2luZG93cyBsYXJnZSBmaWxlIHN1cHBvcnQKLS0gSW5jbHVkZSB6Y29uZi5oLmNtYWtlaW4gZm9yIHdpbmRvd3MgbGFyZ2UgZmlsZSBzdXBwb3J0Ci0tIFVwZGF0ZSB6Y29uZi5oLmNtYWtlaW4gb24gbWFrZSBkaXN0Y2xlYW4KLS0gTWVyZ2UgdmVzdGlnaWFsIHZzbnByaW50ZiBkZXRlcm1pbmF0aW9uIGZyb20genV0aWwuaCB0byBnemd1dHMuaAotLSBDbGFyaWZ5IGhvdyBnem9wZW4oKSBhcHBlbmRzIGluIHpsaWIuaCBjb21tZW50cwotLSBDb3JyZWN0IGRvY3VtZW50YXRpb24gb2YgZ3pkaXJlY3QoKSBzaW5jZSBqdW5rIGF0IGVuZCBub3cgaWdub3JlZAotLSBBZGQgYSB0cmFuc3BhcmVudCB3cml0ZSBtb2RlIHRvIGd6b3BlbigpIHdoZW4gJ1QnIGlzIGluIHRoZSBtb2RlCi0tIFVwZGF0ZSBweXRob24gbGluayBpbiB6bGliIG1hbiBwYWdlCi0tIEdldCBpbmZmaXhlZC5oIGFuZCBNQUtFRklYRUQgcmVzdWx0IHRvIG1hdGNoCi0tIEFkZCBhIC4vY29uZmlnIC0tc29sbyBvcHRpb24gdG8gbWFrZSB6bGliIHN1YnNldCB3aXRoIG5vIGxpYmFyeSB1c2UKLS0gQWRkIHVuZG9jdW1lbnRlZCBpbmZsYXRlUmVzZXRLZWVwKCkgZnVuY3Rpb24gZm9yIENBQiBmaWxlIGRlY29kaW5nCi0tIEFkZCAtLWNvdmVyIG9wdGlvbiB0byAuL2NvbmZpZ3VyZSBmb3IgZ2NjIGNvdmVyYWdlIHRlc3RpbmcKLS0gQWRkICNkZWZpbmUgWkxJQl9DT05TVCBvcHRpb24gdG8gdXNlIGNvbnN0IGluIHRoZSB6X3N0cmVhbSBpbnRlcmZhY2UKLS0gQWRkIGNvbW1lbnQgdG8gZ3pkb3BlbigpIGluIHpsaWIuaCB0byB1c2UgZHVwKCkgd2hlbiB1c2luZyBmaWxlbm8oKQotLSBOb3RlIGJlaGF2aW9yIG9mIHVuY29tcHJlc3MoKSB0byBwcm92aWRlIGFzIG11Y2ggZGF0YSBhcyBpdCBjYW4KLS0gQWRkIGZpbGVzIGluIGNvbnRyaWIvbWluaXppcCB0byBhaWQgaW4gYnVpbGRpbmcgbGlibWluaXppcAotLSBTcGxpdCBvZmYgQVIgb3B0aW9ucyBpbiBNYWtlZmlsZS5pbiBhbmQgY29uZmlndXJlCi0tIENoYW5nZSBPTiBtYWNybyB0byBaX0FSRyB0byBhdm9pZCBhcHBsaWNhdGlvbiBjb25mbGljdHMKLS0gRmFjaWxpdGF0ZSBjb21waWxhdGlvbiB3aXRoIEJvcmxhbmQgQysrIGZvciBwcmFnbWFzIGFuZCB2c25wcmludGYKLS0gSW5jbHVkZSBpby5oIGZvciBUdXJibyBDIC8gQm9ybGFuZCBDKysKLS0gTW92ZSBleGFtcGxlLmMgYW5kIG1pbmlnemlwLmMgdG8gdGVzdC8KLS0gU2ltcGxpZnkgaW5jb21wbGV0ZSBjb2RlIHRhYmxlIGZpbGxpbmcgaW4gaW5mbGF0ZV90YWJsZSgpCi0tIFJlbW92ZSBjb2RlIGZyb20gaW5mbGF0ZS5jIGFuZCBpbmZiYWNrLmMgdGhhdCBpcyBpbXBvc3NpYmxlIHRvIGV4ZWN1dGUKLS0gVGVzdCB0aGUgaW5mbGF0ZSBjb2RlIHdpdGggZnVsbCBjb3ZlcmFnZQotLSBBbGxvdyBkZWZsYXRlU2V0RGljdGlvbmFyeSwgaW5mbGF0ZVNldERpY3Rpb25hcnkgYXQgYW55IHRpbWUgKGluIHJhdykKLS0gQWRkIGRlZmxhdGVSZXNldEtlZXAgYW5kIGZpeCBpbmZsYXRlUmVzZXRLZWVwIHRvIHJldGFpbiBkaWN0aW9uYXJ5Ci0tIEZpeCBnendyaXRlLmMgdG8gYWNjb21tb2RhdGUgcmVkdWNlZCBtZW1vcnkgemxpYiBjb21waWxhdGlvbgotLSBIYXZlIGluZmxhdGUoKSB3aXRoIFpfRklOSVNIIGF2b2lkIHRoZSBhbGxvY2F0aW9uIG9mIGEgd2luZG93Ci0tIERvIG5vdCBzZXQgc3RybS0+YWRsZXIgd2hlbiBkb2luZyByYXcgaW5mbGF0ZQotLSBGaXggZ3plb2YoKSB0byBiZWhhdmUganVzdCBsaWtlIGZlb2YoKSB3aGVuIHJlYWQgaXMgbm90IHBhc3QgZW5kIG9mIGZpbGUKLS0gRml4IGJ1ZyBpbiBnenJlYWQuYyB3aGVuIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQKLS0gQXZvaWQgdXNlIG9mIFpfQlVGX0VSUk9SIGluIGd6KiBmdW5jdGlvbnMgZXhjZXB0IGZvciBwcmVtYXR1cmUgRU9GCi0tIERvY3VtZW50IGd6cmVhZCgpIGNhcGFiaWxpdHkgdG8gcmVhZCBjb25jdXJyZW50bHkgd3JpdHRlbiBmaWxlcwotLSBSZW1vdmUgaGFyZC1jb2Rpbmcgb2YgcmVzb3VyY2UgY29tcGlsZXIgaW4gQ01ha2VMaXN0cy50eHQgW0JsYW1tb10KLQotQ2hhbmdlcyBpbiAxLjIuNS4xICgxMCBTZXAgMjAxMSkKLS0gVXBkYXRlIEZBUSBlbnRyeSBvbiBzaGFyZWQgYnVpbGRzICgjMTMpCi0tIEF2b2lkIHN5bWJvbGljIGFyZ3VtZW50IHRvIGNobW9kIGluIE1ha2VmaWxlLmluCi0tIEZpeCBidWcgYW5kIGFkZCBjb25zdHMgaW4gY29udHJpYi9wdWZmIFtPYmVyaHVtZXJdCi0tIFVwZGF0ZSBjb250cmliL3B1ZmYvemVyb3MucmF3IHRlc3QgZmlsZSB0byBoYXZlIGFsbCBibG9jayB0eXBlcwotLSBBZGQgZnVsbCBjb3ZlcmFnZSB0ZXN0IGZvciBwdWZmIGluIGNvbnRyaWIvcHVmZi9NYWtlZmlsZQotLSBGaXggc3RhdGljLW9ubHktYnVpbGQgaW5zdGFsbCBpbiBNYWtlZmlsZS5pbgotLSBGaXggYnVnIGluIHVuekdldEN1cnJlbnRGaWxlSW5mbygpIGluIGNvbnRyaWIvbWluaXppcCBbS3Vub10KLS0gQWRkIGxpYnouYSBkZXBlbmRlbmN5IHRvIHNoYXJlZCBpbiBNYWtlZmlsZS5pbiBmb3IgcGFyYWxsZWwgYnVpbGRzCi0tIFNwZWxsIG91dCAibnVtYmVyIiAoaW5zdGVhZCBvZiAibmIiKSBpbiB6bGliLmggZm9yIHRvdGFsX2luLCB0b3RhbF9vdXQKLS0gUmVwbGFjZSAkKC4uLikgd2l0aCBgLi4uYCBpbiBjb25maWd1cmUgZm9yIG5vbi1iYXNoIHNoIFtCb3dsZXJdCi0tIEFkZCBkYXJ3aW4qIHRvIERhcndpbiogYW5kIHNvbGFyaXMqIHRvIFN1bk9TXCA1KiBpbiBjb25maWd1cmUgW0dyb2ZmZW5dCi0tIEFkZCBzb2xhcmlzKiB0byBMaW51eCogaW4gY29uZmlndXJlIHRvIGFsbG93IGdjYyB1c2UgW0dyb2ZmZW5dCi0tIEFkZCAqYnNkKiB0byBMaW51eCogY2FzZSBpbiBjb25maWd1cmUgW0Jhci1MZXZdCi0tIEFkZCBpbmZmYXN0Lm9iaiB0byBkZXBlbmRlbmNpZXMgaW4gd2luMzIvTWFrZWZpbGUubXNjCi0tIENvcnJlY3Qgc3BlbGxpbmcgZXJyb3IgaW4gZGVmbGF0ZS5oIFtLb2hsZXJdCi0tIENoYW5nZSBsaWJ6ZGxsLmEgYWdhaW4gdG8gbGliei5kbGwuYSAoISkgaW4gd2luMzIvTWFrZWZpbGUuZ2NjCi0tIEFkZCB0ZXN0IHRvIGNvbmZpZ3VyZSBmb3IgR05VIEMgbG9va2luZyBmb3IgZ2NjIGluIG91dHB1dCBvZiAkY2MgLXYKLS0gQWRkIHpsaWIucGMgZ2VuZXJhdGlvbiB0byB3aW4zMi9NYWtlZmlsZS5nY2MgW1dlaWdlbHRdCi0tIEZpeCBidWcgaW4gemxpYi5oIGZvciBfRklMRV9PRkZTRVRfQklUUyBzZXQgYW5kIF9MQVJHRUZJTEU2NF9TT1VSQ0Ugbm90Ci0tIEFkZCBjb21tZW50IGluIHpsaWIuaCB0aGF0IGFkbGVyMzJfY29tYmluZSB3aXRoIGxlbjIgPCAwIG1ha2VzIG5vIHNlbnNlCi0tIE1ha2UgTk9fRElWSURFIG9wdGlvbiBpbiBhZGxlcjMyLmMgbXVjaCBmYXN0ZXIgKHRoYW5rcyB0byBKb2huIFJlaXNlcikKLS0gTWFrZSBzdHJvbmdlciB0ZXN0IGluIHpjb25mLmggdG8gaW5jbHVkZSB1bmlzdGQuaCBmb3IgTEZTCi0tIEFwcGx5IERhcndpbiBwYXRjaGVzIGZvciA2NC1iaXQgZmlsZSBvZmZzZXRzIHRvIGNvbnRyaWIvbWluaXppcCBbU2xhY2tdCi0tIEZpeCB6bGliLmggTEZTIHN1cHBvcnQgd2hlbiBaX1BSRUZJWCB1c2VkCi0tIEFkZCB1cGRhdGVkIGFzNDAwIHN1cHBvcnQgKHJlbW92ZWQgZnJvbSBvbGQpIFtNb25uZXJhdF0KLS0gQXZvaWQgZGVmbGF0ZSBzZW5zaXRpdml0eSB0byB2b2xhdGlsZSBpbnB1dCBkYXRhCi0tIEF2b2lkIGRpdmlzaW9uIGluIGFkbGVyMzJfY29tYmluZSBmb3IgTk9fRElWSURFCi0tIENsYXJpZnkgdGhlIHVzZSBvZiBaX0ZJTklTSCB3aXRoIGRlZmxhdGVCb3VuZCgpIGFtb3VudCBvZiBzcGFjZQotLSBTZXQgYmluYXJ5IGZvciBvdXRwdXQgZmlsZSBpbiBwdWZmLmMKLS0gVXNlIHU0IHR5cGUgZm9yIGNyY190YWJsZSB0byBhdm9pZCBjb252ZXJzaW9uIHdhcm5pbmdzCi0tIEFwcGx5IGNhc3RzIGluIHpsaWIuaCB0byBhdm9pZCBjb252ZXJzaW9uIHdhcm5pbmdzCi0tIEFkZCBPRiB0byBwcm90b3R5cGVzIGZvciBhZGxlcjMyX2NvbWJpbmVfIGFuZCBjcmMzMl9jb21iaW5lXyBbTWlsbGVyXQotLSBJbXByb3ZlIGluZmxhdGVTeW5jKCkgZG9jdW1lbnRhdGlvbiB0byBub3RlIGluZGV0ZXJtaW5hbmN5Ci0tIEFkZCBkZWZsYXRlUGVuZGluZygpIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgYW1vdW50IG9mIHBlbmRpbmcgb3V0cHV0Ci0tIENvcnJlY3QgdGhlIHNwZWxsaW5nIG9mICJzcGVjaWZpY2F0aW9uIiBpbiBGQVEgW1JhbmRlcnMtUGVocnNvbl0KLS0gQWRkIGEgY2hlY2sgaW4gY29uZmlndXJlIGZvciBzdGRhcmcuaCwgdXNlIGZvciBnenByaW50ZigpCi0tIENoZWNrIHRoYXQgcG9pbnRlcnMgZml0IGluIGludHMgd2hlbiBnenByaW50KCkgY29tcGlsZWQgb2xkIHN0eWxlCi0tIEFkZCBkdW1teSBuYW1lIGJlZm9yZSAkKFNIQVJFRExJQlYpIGluIE1ha2VmaWxlIFtCYXItTGV2LCBCb3dsZXJdCi0tIERlbGV0ZSBsaW5lIGluIGNvbmZpZ3VyZSB0aGF0IGFkZHMgLUwuIGxpYnouYSB0byBMREZMQUdTIFtXZWlnZWx0XQotLSBBZGQgZGVidWcgcmVjb3JkcyBpbiBhc3NtZWJsZXIgY29kZSBbTG9uZGVyXQotLSBVcGRhdGUgUkZDIHJlZmVyZW5jZXMgdG8gdXNlIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sLy4uLiBbTGldCi0tIEFkZCAtLWFyY2hzIG9wdGlvbiwgdXNlIG9mIGxpYnRvb2wgdG8gY29uZmlndXJlIGZvciBNYWMgT1MgWCBbQm9yc3RlbF0KLQotQ2hhbmdlcyBpbiAxLjIuNSAoMTkgQXByIDIwMTApCi0tIERpc2FibGUgdmlzaWJpbGl0eSBhdHRyaWJ1dGUgaW4gd2luMzIvTWFrZWZpbGUuZ2NjIFtCYXItTGV2XQotLSBEZWZhdWx0IHRvIGxpYmRpciBhcyBzaGFyZWRsaWJkaXIgaW4gY29uZmlndXJlIFtOaWVkZXJdCi0tIFVwZGF0ZSBjb3B5cmlnaHQgZGF0ZXMgb24gbW9kaWZpZWQgc291cmNlIGZpbGVzCi0tIFVwZGF0ZSB0cmVlcy5jIHRvIGJlIGFibGUgdG8gZ2VuZXJhdGUgbW9kaWZpZWQgdHJlZXMuaAotLSBFeGl0IGNvbmZpZ3VyZSBmb3IgTWluR1csIHN1Z2dlc3Rpbmcgd2luMzIvTWFrZWZpbGUuZ2NjCi0tIENoZWNrIGZvciBOVUxMIHBhdGggaW4gZ3pfb3BlbiBbSG9tdXJsdV0KLQotQ2hhbmdlcyBpbiAxLjIuNC41ICgxOCBBcHIgMjAxMCkKLS0gU2V0IHNoYXJlZGxpYmRpciBpbiBjb25maWd1cmUgW1Rvcm9rXQotLSBTZXQgTERGTEFHUyBpbiBNYWtlZmlsZS5pbiBbQmFyLUxldl0KLS0gQXZvaWQgbWtkaXIgb2JqcyByYWNlIGNvbmRpdGlvbiBpbiBNYWtlZmlsZS5pbiBbQm93bGVyXQotLSBBZGQgWkxJQl9JTlRFUk5BTCBpbiBmcm9udCBvZiBpbnRlcm5hbCBpbnRlci1tb2R1bGUgZnVuY3Rpb25zIGFuZCBhcnJheXMKLS0gRGVmaW5lIFpMSUJfSU5URVJOQUwgdG8gaGlkZSBpbnRlcm5hbCBmdW5jdGlvbnMgYW5kIGFycmF5cyBmb3IgR05VIEMKLS0gRG9uJ3QgdXNlIGhpZGRlbiBhdHRyaWJ1dGUgd2hlbiBpdCBpcyBhIHdhcm5pbmcgZ2VuZXJhdG9yIChlLmcuIFNvbGFyaXMpCi0KLUNoYW5nZXMgaW4gMS4yLjQuNCAoMTggQXByIDIwMTApCi0tIEZpeCBDUk9TU19QUkVGSVggZXhlY3V0YWJsZSB0ZXN0aW5nLCBDSE9TVCBleHRyYWN0LCBtaW5ndyogW1Rvcm9rXQotLSBVbmRlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIGluIHpjb25mLmggaWYgaXQgaXMgemVybywgYnV0IG5vdCBpZiBlbXB0eQotLSBUcnkgdG8gdXNlIGJhc2ggb3Iga3NoIHJlZ2FyZGxlc3Mgb2YgZnVuY3Rpb25hbGl0eSBvZiAvYmluL3NoCi0tIEZpeCBjb25maWd1cmUgaW5jb21wYXRpYmlsaXR5IHdpdGggTmV0QlNEIHNoCi0tIFJlbW92ZSBhdHRlbXB0IHRvIHJ1biB1bmRlciBiYXNoIG9yIGtzaCBzaW5jZSBoYXZlIGJldHRlciBOZXRCU0QgZml4Ci0tIEZpeCB3aW4zMi9NYWtlZmlsZS5nY2MgZm9yIE1pbkdXIFtCYXItTGV2XQotLSBBZGQgZGlhZ25vc3RpYyBtZXNzYWdlcyB3aGVuIHVzaW5nIENST1NTX1BSRUZJWCBpbiBjb25maWd1cmUKLS0gQWRkZWQgLS1zaGFyZWRsaWJkaXIgb3B0aW9uIHRvIGNvbmZpZ3VyZSBbV2VpZ2VsdF0KLS0gVXNlIGhpZGRlbiB2aXNpYmlsaXR5IGF0dHJpYnV0ZSB3aGVuIGF2YWlsYWJsZSBbRnJ5c2luZ2VyXQotCi1DaGFuZ2VzIGluIDEuMi40LjMgKDEwIEFwciAyMDEwKQotLSBPbmx5IHVzZSBDUk9TU19QUkVGSVggaW4gY29uZmlndXJlIGZvciBhciBhbmQgcmFubGliIGlmIHRoZXkgZXhpc3QKLS0gVXNlIENST1NTX1BSRUZJWCBmb3Igbm0gW0Jhci1MZXZdCi0tIEFzc3VtZSBfTEFSR0VGSUxFNjRfU09VUkNFIGRlZmluZWQgaXMgZXF1aXZhbGVudCB0byB0cnVlCi0tIEF2b2lkIHVzZSBvZiB1bmRlZmluZWQgc3ltYm9scyBpbiAjaWYgd2l0aCAmJiBhbmQgfHwKLS0gTWFrZSAqNjQgcHJvdG90eXBlcyBpbiBnemd1dHMuaCBjb25zaXN0ZW50IHdpdGggZnVuY3Rpb25zCi0tIEFkZCAtc2hhcmVkIGxvYWQgb3B0aW9uIGZvciBNaW5HVyBpbiBjb25maWd1cmUgW0Jvd2xlcl0KLS0gTW92ZSB6X29mZjY0X3QgdG8gcHVibGljIGludGVyZmFjZSwgdXNlIGluc3RlYWQgb2Ygb2ZmNjRfdAotLSBSZW1vdmUgISBmcm9tIHNoZWxsIHRlc3QgaW4gY29uZmlndXJlIChub3QgcG9ydGFibGUgdG8gU29sYXJpcykKLS0gQ2hhbmdlICswIG1hY3JvIHRlc3RzIHRvIC0wIGZvciBwb3NzaWJseSBpbmNyZWFzZWQgcG9ydGFiaWxpdHkKLQotQ2hhbmdlcyBpbiAxLjIuNC4yICg5IEFwciAyMDEwKQotLSBBZGQgY29uc2lzdGVudCBjYXJyaWFnZSByZXR1cm5zIHRvIHJlYWRtZS50eHQncyBpbiBtYXNteDg2IGFuZCBtYXNteDY0Ci0tIFJlYWxseSBwcm92aWRlIHByb3RvdHlwZXMgZm9yICo2NCBmdW5jdGlvbnMgd2hlbiBidWlsZGluZyB3aXRob3V0IExGUwotLSBPbmx5IGRlZmluZSB1bmxpbmsoKSBpbiBtaW5pZ3ppcC5jIGlmIHVuaXN0ZC5oIG5vdCBpbmNsdWRlZAotLSBVcGRhdGUgUkVBRE1FIHRvIHBvaW50IHRvIGNvbnRyaWIvdnN0dWRpbyBwcm9qZWN0IGZpbGVzCi0tIE1vdmUgcHJvamVjdHMvdmM2IHRvIG9sZC8gYW5kIHJlbW92ZSBwcm9qZWN0cy8KLS0gSW5jbHVkZSBzdGRsaWIuaCBpbiBtaW5pZ3ppcC5jIGZvciBzZXRtb2RlKCkgZGVmaW5pdGlvbiB1bmRlciBXaW5DRQotLSBDbGVhbiB1cCBhc3NlbWJsZXIgYnVpbGRzIGluIHdpbjMyL01ha2VmaWxlLm1zYyBbUm93ZV0KLS0gSW5jbHVkZSBzeXMvdHlwZXMuaCBmb3IgTWljcm9zb2Z0IGZvciBvZmZfdCBkZWZpbml0aW9uCi0tIEZpeCBtZW1vcnkgbGVhayBvbiBlcnJvciBpbiBnel9vcGVuKCkKLS0gU3ltYm9saXplIG5tIGFzICROTSBpbiBjb25maWd1cmUgW1dlaWdlbHRdCi0tIFVzZSBURVNUX0xEU0hBUkVEIGluc3RlYWQgb2YgTERTSEFSRUQgdG8gbGluayB0ZXN0IHByb2dyYW1zIFtXZWlnZWx0XQotLSBBZGQgKzAgdG8gX0ZJTEVfT0ZGU0VUX0JJVFMgYW5kIF9MRlM2NF9MQVJHRUZJTEUgaW4gY2FzZSBub3QgZGVmaW5lZAotLSBGaXggYnVnIGluIGd6ZW9mKCkgdG8gdGFrZSBpbnRvIGFjY291bnQgdW51c2VkIGlucHV0IGRhdGEKLS0gQXZvaWQgaW5pdGlhbGl6YXRpb24gb2Ygc3RydWN0dXJlcyB3aXRoIHZhcmlhYmxlcyBpbiBwdWZmLmMKLS0gVXBkYXRlZCB3aW4zMi9SRUFETUUtV0lOMzIudHh0IFtSb3dlXQotCi1DaGFuZ2VzIGluIDEuMi40LjEgKDI4IE1hciAyMDEwKQotLSBSZW1vdmUgdGhlIHVzZSBvZiBbYS16XSBjb25zdHJ1Y3RzIGZvciBzZWQgaW4gY29uZmlndXJlIFtnZW50b28gMzEwMjI1XQotLSBSZW1vdmUgJChTSEFSRURMSUIpIGZyb20gTElCUyBpbiBNYWtlZmlsZS5pbiBbQ3JlZWNoXQotLSBSZXN0b3JlICJmb3IgZGVidWdnaW5nIiBjb21tZW50IG9uIHNwcmludGYoKSBpbiBnemxpYi5jCi0tIFJlbW92ZSBmZG9wZW4gZm9yIE1WUyBmcm9tIGd6Z3V0cy5oCi0tIFB1dCBuZXcgUkVBRE1FLVdJTjMyLnR4dCBpbiB3aW4zMiBbUm93ZV0KLS0gQWRkIGNoZWNrIGZvciBzaGVsbCB0byBjb25maWd1cmUgYW5kIGludm9rZSBhbm90aGVyIHNoZWxsIGlmIG5lZWRlZAotLSBGaXggYmlnIGZhdCBzdGlua2luZyBidWcgaW4gZ3pzZWVrKCkgb24gdW5jb21wcmVzc2VkIGZpbGVzCi0tIFJlbW92ZSB2ZXN0aWdpYWwgRl9PUEVONjQgZGVmaW5lIGluIHp1dGlsLmgKLS0gU2V0IGFuZCBjaGVjayB0aGUgdmFsdWUgb2YgX0xBUkdFRklMRV9TT1VSQ0UgYW5kIF9MQVJHRUZJTEU2NF9TT1VSQ0UKLS0gQXZvaWQgZXJyb3JzIG9uIG5vbi1MRlMgc3lzdGVtcyB3aGVuIGFwcGxpY2F0aW9ucyBkZWZpbmUgTEZTIG1hY3JvcwotLSBTZXQgRVhFIHRvICIuZXhlIiBpbiBjb25maWd1cmUgZm9yIE1JTkdXIFtLYWhsZV0KLS0gTWF0Y2ggY3JjMzIoKSBpbiBjcmMzMi5jIGV4YWN0bHkgdG8gdGhlIHByb3RvdHlwZSBpbiB6bGliLmggW1NoZXJyaWxsXQotLSBBZGQgcHJlZml4IGZvciBjcm9zcy1jb21waWxhdGlvbiBpbiB3aW4zMi9tYWtlZmlsZS5nY2MgW0Jhci1MZXZdCi0tIEFkZCBETEwgaW5zdGFsbCBpbiB3aW4zMi9tYWtlZmlsZS5nY2MgW0Jhci1MZXZdCi0tIEFsbG93IExpbnV4KiBvciBsaW51eCogZnJvbSB1bmFtZSBpbiBjb25maWd1cmUgW0Jhci1MZXZdCi0tIEFsbG93IGxkY29uZmlnIHRvIGJlIHJlZGVmaW5lZCBpbiBjb25maWd1cmUgYW5kIE1ha2VmaWxlLmluIFtCYXItTGV2XQotLSBBZGQgY3Jvc3MtY29tcGlsYXRpb24gcHJlZml4ZXMgdG8gY29uZmlndXJlIFtCYXItTGV2XQotLSBNYXRjaCB0eXBlIGV4YWN0bHkgaW4gZ3pfbG9hZCgpIGludm9jYXRpb24gaW4gZ3pyZWFkLmMKLS0gTWF0Y2ggdHlwZSBleGFjdGx5IG9mIHpjYWxsb2MoKSBpbiB6dXRpbC5jIHRvIHpsaWIuaCBhbGxvY19mdW5jCi0tIFByb3ZpZGUgcHJvdG90eXBlcyBmb3IgKjY0IGZ1bmN0aW9ucyB3aGVuIGJ1aWxkaW5nIHpsaWIgd2l0aG91dCBMRlMKLS0gRG9uJ3QgdXNlIC1sYyB3aGVuIGxpbmtpbmcgc2hhcmVkIGxpYnJhcnkgb24gTWluR1cKLS0gUmVtb3ZlIGVycm5vLmggY2hlY2sgaW4gY29uZmlndXJlIGFuZCB2ZXN0aWdpYWwgZXJybm8gY29kZSBpbiB6dXRpbC5oCi0KLUNoYW5nZXMgaW4gMS4yLjQgKDE0IE1hciAyMDEwKQotLSBGaXggVkVSMyBleHRyYWN0aW9uIGluIGNvbmZpZ3VyZSBmb3Igbm8gZm91cnRoIHN1YnZlcnNpb24KLS0gVXBkYXRlIHpsaWIuMywgYWRkIGRvY3MgdG8gTWFrZWZpbGUuaW4gdG8gbWFrZSAucGRmIG91dCBvZiBpdAotLSBBZGQgemxpYi4zLnBkZiB0byBkaXN0cmlidXRpb24KLS0gRG9uJ3Qgc2V0IGVycm9yIGNvZGUgaW4gZ3plcnJvcigpIGlmIHBhc3NlZCBwb2ludGVyIGlzIE5VTEwKLS0gQXBwbHkgZGVzdGluYXRpb24gZGlyZWN0b3J5IGZpeGVzIHRvIENNYWtlTGlzdHMudHh0IFtMb3dtYW5dCi0tIE1vdmUgI2NtYWtlZGVmaW5lJ3MgdG8gYSBuZXcgemNvbmYuaW4uY21ha2VpbgotLSBSZXN0b3JlIHpjb25mLmggZm9yIGJ1aWxkcyB0aGF0IGRvbid0IHVzZSBjb25maWd1cmUgb3IgY21ha2UKLS0gQWRkIGRpc3RjbGVhbiB0byBkdW1teSBNYWtlZmlsZSBmb3IgY29udmVuaWVuY2UKLS0gVXBkYXRlIGFuZCBpbXByb3ZlIElOREVYLCBSRUFETUUsIGFuZCBGQVEKLS0gVXBkYXRlIENNYWtlTGlzdHMudHh0IGZvciB0aGUgcmV0dXJuIG9mIHpjb25mLmggW0xvd21hbl0KLS0gVXBkYXRlIGNvbnRyaWIvdnN0dWRpby92YzkgYW5kIHZjMTAgW1ZvbGxhbnRdCi0tIENoYW5nZSBsaWJ6LmRsbC5hIGJhY2sgdG8gbGliemRsbC5hIGluIHdpbjMyL01ha2VmaWxlLmdjYwotLSBBcHBseSBsaWNlbnNlIGFuZCByZWFkbWUgY2hhbmdlcyB0byBjb250cmliL2FzbTY4NiBbUmFpdGVyXQotLSBDaGVjayBmaWxlIG5hbWUgbGVuZ3RocyBhbmQgYWRkIC1jIG9wdGlvbiBpbiBtaW5pZ3ppcC5jIFtMaV0KLS0gVXBkYXRlIGNvbnRyaWIvYW1kNjQgYW5kIGNvbnRyaWIvbWFzbXg4Ni8gW1ZvbGxhbnRdCi0tIEF2b2lkIHVzZSBvZiAiZW9mIiBwYXJhbWV0ZXIgaW4gdHJlZXMuYyB0byBub3Qgc2hhZG93IGxpYnJhcnkgdmFyaWFibGUKLS0gVXBkYXRlIG1ha2Vfdm1zLmNvbSBmb3IgcmVtb3ZhbCBvZiB6bGliZGVmcy5oIFtaaW5zZXJdCi0tIFVwZGF0ZSBhc3NlbWJsZXIgY29kZSBhbmQgdnN0dWRpbyBwcm9qZWN0cyBpbiBjb250cmliIFtWb2xsYW50XQotLSBSZW1vdmUgb3V0ZGF0ZWQgYXNzZW1ibGVyIGNvZGUgY29udHJpYi9tYXNtNjg2IGFuZCBjb250cmliL2FzbTU4NgotLSBSZW1vdmUgb2xkIHZjNyBhbmQgdmM4IGZyb20gY29udHJpYi92c3R1ZGlvCi0tIFVwZGF0ZSB3aW4zMi9NYWtlZmlsZS5tc2MsIGFkZCBaTElCX1ZFUl9TVUJSRVZJU0lPTiBbUm93ZV0KLS0gRml4IG1lbW9yeSBsZWFrcyBpbiBnemNsb3NlX3IoKSBhbmQgZ3pjbG9zZV93KCksIGZpbGUgbGVhayBpbiBnel9vcGVuKCkKLS0gQWRkIGNvbnRyaWIvZ2NjX2d2bWF0NjQgZm9yIGxvbmdlc3RfbWF0Y2ggYW5kIGluZmxhdGVfZmFzdCBbVm9sbGFudF0KLS0gUmVtb3ZlICo2NCBmdW5jdGlvbnMgZnJvbSB3aW4zMi96bGliLmRlZiAodGhleSdyZSBub3QgNjQtYml0IHlldCkKLS0gRml4IGJ1ZyBpbiB2b2lkLXJldHVybmluZyB2c3ByaW50ZigpIGNhc2UgaW4gZ3p3cml0ZS5jCi0tIEZpeCBuYW1lIGNoYW5nZSBmcm9tIGluZmxhdGUuaCBpbiBjb250cmliL2luZmxhdGU4Ni9pbmZmYXM4Ni5jCi0tIENoZWNrIGlmIHRlbXBvcmFyeSBmaWxlIGV4aXN0cyBiZWZvcmUgcmVtb3ZpbmcgaW4gbWFrZV92bXMuY29tIFtaaW5zZXJdCi0tIEZpeCBtYWtlIGluc3RhbGwgYW5kIHVuaW5zdGFsbCBmb3IgLS1zdGF0aWMgb3B0aW9uCi0tIEZpeCB1c2FnZSBvZiBfTVNDX1ZFUiBpbiBnemd1dHMuaCBhbmQgenV0aWwuaCBbVHJ1dGFdCi0tIFVwZGF0ZSByZWFkbWUudHh0IGluIGNvbnRyaWIvbWFzbXg2NCBhbmQgbWFzbXg4NiB0byBhc3NlbWJsZQotCi1DaGFuZ2VzIGluIDEuMi4zLjkgKDIxIEZlYiAyMDEwKQotLSBFeHB1bmdlIGd6aW8uYwotLSBNb3ZlIGFzNDAwIGJ1aWxkIGluZm9ybWF0aW9uIHRvIG9sZAotLSBGaXggdXBkYXRlcyBpbiBjb250cmliL21pbml6aXAgYW5kIGNvbnRyaWIvdnN0dWRpbwotLSBBZGQgY29uc3QgdG8gdnNucHJpbnRmIHRlc3QgaW4gY29uZmlndXJlIHRvIGF2b2lkIHdhcm5pbmdzIFtXZWlnZWx0XQotLSBEZWxldGUgemNvbmYuaCAobWFkZSBieSBjb25maWd1cmUpIFtXZWlnZWx0XQotLSBDaGFuZ2UgemNvbmYuaW4uaCB0byB6Y29uZi5oLmluIHBlciBjb252ZW50aW9uIFtXZWlnZWx0XQotLSBDaGVjayBmb3IgTlVMTCBidWYgaW4gZ3pnZXRzKCkKLS0gUmV0dXJuIGVtcHR5IHN0cmluZyBmb3IgZ3pnZXRzKCkgd2l0aCBsZW4gPT0gMSAobGlrZSBmZ2V0cygpKQotLSBGaXggZGVzY3JpcHRpb24gb2YgZ3pnZXRzKCkgaW4gemxpYi5oIGZvciBlbmQtb2YtZmlsZSwgTlVMTCByZXR1cm4KLS0gVXBkYXRlIG1pbml6aXAgdG8gMS4xIFtWb2xsYW50XQotLSBBdm9pZCBNU1ZDIGxvc3Mgb2YgZGF0YSB3YXJuaW5ncyBpbiBnenJlYWQuYywgZ3p3cml0ZS5jCi0tIE5vdGUgaW4gemxpYi5oIHRoYXQgZ3plcnJvcigpIHNob3VsZCBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGZyb20gRU9GCi0tIFJlbW92ZSB1c2Ugb2Ygc25wcmludGYoKSBmcm9tIGd6bGliLmMKLS0gRml4IGJ1ZyBpbiBnenNlZWsoKQotLSBVcGRhdGUgY29udHJpYi92c3R1ZGlvLCBhZGRpbmcgdmM5IGFuZCB2YzEwIFtLdW5vLCBWb2xsYW50XQotLSBGaXggemNvbmYuaCBnZW5lcmF0aW9uIGluIENNYWtlTGlzdHMudHh0IFtMb3dtYW5dCi0tIEltcHJvdmUgY29tbWVudHMgaW4gemNvbmYuaCB3aGVyZSBtb2RpZmllZCBieSBjb25maWd1cmUKLQotQ2hhbmdlcyBpbiAxLjIuMy44ICgxMyBGZWIgMjAxMCkKLS0gQ2xlYW4gdXAgdGV4dCBmaWxlcyAodGFicywgdHJhaWxpbmcgd2hpdGVzcGFjZSwgZXRjLikgW09iZXJodW1lcl0KLS0gVXNlIHpfb2ZmNjRfdCBpbiBnel96ZXJvKCkgYW5kIGd6X3NraXAoKSB0byBtYXRjaCBzdGF0ZS0+c2tpcAotLSBBdm9pZCBjb21wYXJpc29uIHByb2JsZW0gd2hlbiBzaXplb2YoaW50KSA9PSBzaXplb2Yoel9vZmY2NF90KQotLSBSZXZlcnQgdG8gTWFrZWZpbGUuaW4gZnJvbSAxLjIuMy42IChsaXZlIHdpdGggdGhlIGNsdXR0ZXIpCi0tIEZpeCBtaXNzaW5nIGVycm9yIHJldHVybiBpbiBnemZsdXNoKCksIGFkZCB6bGliLmggbm90ZQotLSBBZGQgKjY0IGZ1bmN0aW9ucyB0byB6bGliLm1hcCBbTGV2aW5dCi0tIEZpeCBzaWduZWQvdW5zaWduZWQgY29tcGFyaXNvbiBpbiBnel9jb21wKCkKLS0gVXNlIFNGTEFHUyB3aGVuIHRlc3Rpbmcgc2hhcmVkIGxpbmtpbmcgaW4gY29uZmlndXJlCi0tIEFkZCAtLTY0IG9wdGlvbiB0byAuL2NvbmZpZ3VyZSB0byB1c2UgLW02NCB3aXRoIGdjYwotLSBGaXggLi9jb25maWd1cmUgLS1oZWxwIHRvIGNvcnJlY3RseSBuYW1lIG9wdGlvbnMKLS0gSGF2ZSBtYWtlIGZhaWwgaWYgYSB0ZXN0IGZhaWxzIFtMZXZpbl0KLS0gQXZvaWQgYnVmZmVyIG92ZXJydW4gaW4gY29udHJpYi9tYXNteDY0L2d2bWF0NjQuYXNtIFtTaW1wc29uXQotLSBSZW1vdmUgYXNzZW1ibGVyIG9iamVjdCBmaWxlcyBmcm9tIGNvbnRyaWIKLQotQ2hhbmdlcyBpbiAxLjIuMy43ICgyNCBKYW4gMjAxMCkKLS0gQWx3YXlzIGd6b3BlbigpIHdpdGggT19MQVJHRUZJTEUgaWYgYXZhaWxhYmxlCi0tIEZpeCBnemRpcmVjdCgpIHRvIHdvcmsgaW1tZWRpYXRlbHkgYWZ0ZXIgZ3pvcGVuKCkgb3IgZ3pkb3BlbigpCi0tIE1ha2UgZ3pkaXJlY3QoKSBtb3JlIHByZWNpc2Ugd2hlbiB0aGUgc3RhdGUgY2hhbmdlcyB3aGlsZSByZWFkaW5nCi0tIEltcHJvdmUgemxpYi5oIGRvY3VtZW50YXRpb24gaW4gbWFueSBwbGFjZXMKLS0gQ2F0Y2ggbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBpbiBnel9vcGVuKCkKLS0gQ29tcGxldGUgY2xvc2Ugb3BlcmF0aW9uIGlmIHNlZWsgZm9yd2FyZCBpbiBnemNsb3NlX3coKSBmYWlscwotLSBSZXR1cm4gWl9FUlJOTyBmcm9tIGd6Y2xvc2VfcigpIGlmIGNsb3NlKCkgZmFpbHMKLS0gUmV0dXJuIFpfU1RSRUFNX0VSUk9SIGluc3RlYWQgb2YgRU9GIGZvciBnemNsb3NlKCkgYmVpbmcgcGFzc2VkIE5VTEwKLS0gUmV0dXJuIHplcm8gZm9yIGd6d3JpdGUoKSBlcnJvcnMgdG8gbWF0Y2ggemxpYi5oIGRlc2NyaXB0aW9uCi0tIFJldHVybiAtMSBvbiBnenB1dHMoKSBlcnJvciB0byBtYXRjaCB6bGliLmggZGVzY3JpcHRpb24KLS0gQWRkIHpjb25mLmluLmggdG8gYWxsb3cgcmVjb3ZlcnkgZnJvbSBjb25maWd1cmUgbW9kaWZpY2F0aW9uIFtXZWlnZWx0XQotLSBGaXggc3RhdGljIGxpYnJhcnkgcGVybWlzc2lvbnMgaW4gTWFrZWZpbGUuaW4gW1dlaWdlbHRdCi0tIEF2b2lkIHdhcm5pbmdzIGluIGNvbmZpZ3VyZSB0ZXN0cyB0aGF0IGhpZGUgZnVuY3Rpb25hbGl0eSBbV2VpZ2VsdF0KLS0gQWRkICpCU0QgYW5kIERyYWdvbkZseSB0byBMaW51eCBjYXNlIGluIGNvbmZpZ3VyZSBbZ2VudG9vIDEyMzU3MV0KLS0gQ2hhbmdlIGxpYnpkbGwuYSB0byBsaWJ6LmRsbC5hIGluIHdpbjMyL01ha2VmaWxlLmdjYyBbZ2VudG9vIDI4ODIxMl0KLS0gQXZvaWQgYWNjZXNzIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBmb3IgZmlyc3QgaW5mbGF0ZVJlc2V0MiBjYWxsIFtHb21lc10KLS0gS2VlcCBvYmplY3QgZmlsZXMgaW4gc3ViZGlyZWN0b3JpZXMgdG8gcmVkdWNlIHRoZSBjbHV0dGVyIHNvbWV3aGF0Ci0tIFJlbW92ZSBkZWZhdWx0IE1ha2VmaWxlIGFuZCB6bGliZGVmcy5oLCBhZGQgZHVtbXkgTWFrZWZpbGUKLS0gQWRkIG5ldyBleHRlcm5hbCBmdW5jdGlvbnMgdG8gWl9QUkVGSVgsIHJlbW92ZSBkdXBsaWNhdGVzLCB6X3pfIC0+IHpfCi0tIFJlbW92ZSB6bGliZGVmcy5oIGNvbXBsZXRlbHkgLS0gbW9kaWZ5IHpjb25mLmggaW5zdGVhZAotCi1DaGFuZ2VzIGluIDEuMi4zLjYgKDE3IEphbiAyMDEwKQotLSBBdm9pZCB2b2lkICogYXJpdGhtZXRpYyBpbiBnenJlYWQuYyBhbmQgZ3p3cml0ZS5jCi0tIE1ha2UgY29tcGlsZXJzIGhhcHBpZXIgd2l0aCBjb25zdCBjaGFyICogZm9yIGd6X2Vycm9yIG1lc3NhZ2UKLS0gQXZvaWQgdW51c2VkIHBhcmFtZXRlciB3YXJuaW5nIGluIGluZmxhdGUuYwotLSBBdm9pZCBzaWduZWQtdW5zaWduZWQgY29tcGFyaXNvbiB3YXJuaW5nIGluIGluZmxhdGUuYwotLSBJbmRlbnQgI3ByYWdtYSdzIGZvciB0cmFkaXRpb25hbCBDCi0tIEZpeCB1c2FnZSBvZiBzdHJ3aW5lcnJvcigpIGluIGdsaWIuYywgY2hhbmdlIHRvIGd6X3N0cndpbmVycm9yKCkKLS0gQ29ycmVjdCBlbWFpbCBhZGRyZXNzIGluIGNvbmZpZ3VyZSBmb3Igc3lzdGVtIG9wdGlvbnMKLS0gVXBkYXRlIG1ha2Vfdm1zLmNvbSBhbmQgYWRkIG1ha2Vfdm1zLmNvbSB0byBjb250cmliL21pbml6aXAgW1ppbnNlcl0KLS0gVXBkYXRlIHpsaWIubWFwIFtCcm93bl0KLS0gRml4IE1ha2VmaWxlLmluIGZvciBTb2xhcmlzIDEwIG1ha2Ugb2YgZXhhbXBsZTY0IGFuZCBtaW5pemlwNjQgW1Rvcm9rXQotLSBBcHBseSB2YXJpb3VzIGZpeGVzIHRvIENNYWtlTGlzdHMudHh0IFtMb3dtYW5dCi0tIEFkZCBjaGVja3Mgb24gbGVuIGluIGd6cmVhZCgpIGFuZCBnendyaXRlKCkKLS0gQWRkIGVycm9yIG1lc3NhZ2UgZm9yIG5vIG1vcmUgcm9vbSBmb3IgZ3p1bmdldGMoKQotLSBSZW1vdmUgemxpYiB2ZXJzaW9uIGNoZWNrIGluIGd6d3JpdGUoKQotLSBEZWZlciBjb21wcmVzc2lvbiBvZiBnenByaW50ZigpIHJlc3VsdCB1bnRpbCBuZWVkIHRvCi0tIFVzZSBzbnByaW50ZigpIGluIGd6ZG9wZW4oKSBpZiBhdmFpbGFibGUKLS0gUmVtb3ZlIFVTRV9NTUFQIGNvbmZpZ3VyYXRpb24gZGV0ZXJtaW5hdGlvbiAob25seSB1c2VkIGJ5IG1pbmlnemlwKQotLSBSZW1vdmUgZXhhbXBsZXMvcGlnei5jIChhdmFpbGFibGUgc2VwYXJhdGVseSkKLS0gVXBkYXRlIGV4YW1wbGVzL2d1bi5jIHRvIDEuNgotCi1DaGFuZ2VzIGluIDEuMi4zLjUgKDggSmFuIDIwMTApCi0tIEFkZCBzcGFjZSBhZnRlciAjaWYgaW4genV0aWwuaCBmb3Igc29tZSBjb21waWxlcnMKLS0gRml4IHJlbGF0aXZlbHkgaGFybWxlc3MgYnVnIGluIGRlZmxhdGVfZmFzdCgpIFtFeGFyZXZza3ldCi0tIEZpeCBzYW1lIHByb2JsZW0gaW4gZGVmbGF0ZV9zbG93KCkKLS0gQWRkICQoU0hBUkVETElCVikgdG8gTElCUyBpbiBNYWtlZmlsZS5pbiBbQnJvd25dCi0tIEFkZCBkZWZsYXRlX3JsZSgpIGZvciBmYXN0ZXIgWl9STEUgc3RyYXRlZ3kgcnVuLWxlbmd0aCBlbmNvZGluZwotLSBBZGQgZGVmbGF0ZV9odWZmKCkgZm9yIGZhc3RlciBaX0hVRkZNQU5fT05MWSBlbmNvZGluZwotLSBDaGFuZ2UgbmFtZSBvZiAid3JpdGUiIHZhcmlhYmxlIGluIGluZmZhc3QuYyB0byBhdm9pZCBsaWJyYXJ5IGNvbGxpc2lvbnMKLS0gRml4IHByZW1hdHVyZSBFT0YgZnJvbSBnenJlYWQoKSBpbiBnemlvLmMgW0Jyb3duXQotLSBVc2UgemxpYiBoZWFkZXIgd2luZG93IHNpemUgaWYgd2luZG93Qml0cyBpcyAwIGluIGluZmxhdGVJbml0MigpCi0tIFJlbW92ZSBjb21wcmVzc0JvdW5kKCkgY2FsbCBpbiBkZWZsYXRlLmMgdG8gYXZvaWQgbGlua2luZyBjb21wcmVzcy5vCi0tIFJlcGxhY2UgdXNlIG9mIGVycm5vIGluIGd6KiB3aXRoIGZ1bmN0aW9ucywgc3VwcG9ydCBXaW5DRSBbQWx2ZXNdCi0tIFByb3ZpZGUgYWx0ZXJuYXRpdmUgdG8gcGVycm9yKCkgaW4gbWluaWd6aXAuYyBmb3IgV2luQ0UgW0FsdmVzXQotLSBEb24ndCB1c2UgX3ZzbnByaW50ZiBvbiBsYXRlciB2ZXJzaW9ucyBvZiBNU1ZDIFtMb3dtYW5dCi0tIEFkZCBDTWFrZSBidWlsZCBzY3JpcHQgYW5kIGlucHV0IGZpbGUgW0xvd21hbl0KLS0gVXBkYXRlIGNvbnRyaWIvbWluaXppcCB0byAxLjEgW1N2ZW5zc29uLCBWb2xsYW50XQotLSBNb3ZlZCBuaW50ZW5kb2RzIGRpcmVjdG9yeSBmcm9tIGNvbnRyaWIgdG8gLgotLSBSZXBsYWNlIGd6aW8uYyB3aXRoIGEgbmV3IHNldCBvZiByb3V0aW5lcyB3aXRoIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkKLS0gQWRkIGd6YnVmZmVyKCksIGd6b2Zmc2V0KCksIGd6Y2xvc2VfcigpLCBnemNsb3NlX3coKSBhcyBwYXJ0IG9mIGFib3ZlCi0tIFVwZGF0ZSBjb250cmliL21pbml6aXAgdG8gMS4xYgotLSBDaGFuZ2UgZ3plb2YoKSB0byByZXR1cm4gMCBvbiBlcnJvciBpbnN0ZWFkIG9mIC0xIHRvIGFncmVlIHdpdGggemxpYi5oCi0KLUNoYW5nZXMgaW4gMS4yLjMuNCAoMjEgRGVjIDIwMDkpCi0tIFVzZSBvbGQgc2Nob29sIC5TVUZGSVhFUyBpbiBNYWtlZmlsZS5pbiBmb3IgRnJlZUJTRCBjb21wYXRpYmlsaXR5Ci0tIFVwZGF0ZSBjb21tZW50cyBpbiBjb25maWd1cmUgYW5kIE1ha2VmaWxlLmluIGZvciBkZWZhdWx0IC0tc2hhcmVkCi0tIEZpeCB0ZXN0IC16J3MgaW4gY29uZmlndXJlIFtNYXJxdWVzc10KLS0gQnVpbGQgZXhhbXBsZXNoIGFuZCBtaW5pZ3ppcHNoIHdoZW4gbm90IHRlc3RpbmcKLS0gQ2hhbmdlIE5VTEwncyB0byBaX05VTEwncyBpbiBkZWZsYXRlLmMgYW5kIGluIGNvbW1lbnRzIGluIHpsaWIuaAotLSBJbXBvcnQgTERGTEFHUyBmcm9tIHRoZSBlbnZpcm9ubWVudCBpbiBjb25maWd1cmUKLS0gRml4IGNvbmZpZ3VyZSB0byBwb3B1bGF0ZSBTRkxBR1Mgd2l0aCBkaXNjb3ZlcmVkIENGTEFHUyBvcHRpb25zCi0tIEFkYXB0IG1ha2Vfdm1zLmNvbSB0byB0aGUgbmV3IE1ha2VmaWxlLmluIFtaaW5zZXJdCi0tIEFkZCB6bGliMmFuc2kgc2NyaXB0IGZvciBDKysgY29tcGlsYXRpb24gW01hcnF1ZXNzXQotLSBBZGQgX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgdGVzdCB0byBtYWtlIHRlc3QgKHdoZW4gYXBwbGljYWJsZSkKLS0gQWRkIEFNRDY0IGFzc2VtYmxlciBjb2RlIGZvciBsb25nZXN0IG1hdGNoIHRvIGNvbnRyaWIgW1RldGVyaW5dCi0tIEluY2x1ZGUgb3B0aW9ucyBmcm9tICRTRkxBR1Mgd2hlbiBkb2luZyAkTERTSEFSRUQKLS0gU2ltcGxpZnkgNjQtYml0IGZpbGUgc3VwcG9ydCBieSBpbnRyb2R1Y2luZyB6X29mZjY0X3QgdHlwZQotLSBNYWtlIHNoYXJlZCBvYmplY3QgZmlsZXMgaW4gb2JqcyBkaXJlY3RvcnkgdG8gd29yayBhcm91bmQgb2xkIFN1biBjYwotLSBVc2Ugb25seSB0aHJlZS1wYXJ0IHZlcnNpb24gbnVtYmVyIGZvciBEYXJ3aW4gc2hhcmVkIGNvbXBpbGVzCi0tIEFkZCByYyBvcHRpb24gdG8gYXIgaW4gTWFrZWZpbGUuaW4gZm9yIHdoZW4gLi9jb25maWd1cmUgbm90IHJ1bgotLSBBZGQgLVdJLC1ycGF0aCwuIHRvIExERkxBR1MgZm9yIE9TRiAxIFY0KgotLSBTZXQgTERfTElCUkFSWU4zMl9QQVRIIGZvciBTR0kgSVJJWCBzaGFyZWQgY29tcGlsZQotLSBQcm90ZWN0IGFnYWluc3QgX0ZJTEVfT0ZGU0VUX0JJVFMgYmVpbmcgZGVmaW5lZCB3aGVuIGNvbXBpbGluZyB6bGliCi0tIFJlbmFtZSBNYWtlZmlsZS5pbiB0YXJnZXRzIGFsbHN0YXRpYyB0byBzdGF0aWMgYW5kIGFsbHNoYXJlZCB0byBzaGFyZWQKLS0gRml4IHN0YXRpYyBhbmQgc2hhcmVkIE1ha2VmaWxlLmluIHRhcmdldHMgdG8gYmUgaW5kZXBlbmRlbnQKLS0gQ29ycmVjdCBlcnJvciByZXR1cm4gYnVnIGluIGd6X29wZW4oKSBieSBzZXR0aW5nIHN0YXRlIFtCcm93bl0KLS0gUHV0IHNwYWNlcyBiZWZvcmUgOzsncyBpbiBjb25maWd1cmUgZm9yIGJldHRlciBzaCBjb21wYXRpYmlsaXR5Ci0tIEFkZCBwaWd6LmMgKHBhcmFsbGVsIGltcGxlbWVudGF0aW9uIG9mIGd6aXApIHRvIGV4YW1wbGVzLwotLSBDb3JyZWN0IGNvbnN0YW50IGluIGNyYzMyLmMgdG8gVUwgW0xldmVudGhhbF0KLS0gUmVqZWN0IG5lZ2F0aXZlIGxlbmd0aHMgaW4gY3JjMzJfY29tYmluZSgpCi0tIEFkZCBpbmZsYXRlUmVzZXQyKCkgZnVuY3Rpb24gdG8gd29yayBsaWtlIGluZmxhdGVFbmQoKS9pbmZsYXRlSW5pdDIoKQotLSBJbmNsdWRlIHN5cy90eXBlcy5oIGZvciBfTEFSR0VGSUxFNjRfU09VUkNFIFtCcm93bl0KLS0gQ29ycmVjdCB0eXBvIGluIGRvYy9hbGdvcml0aG0udHh0IFtKYW5pa10KLS0gRml4IGJ1ZyBpbiBhZGxlcjMyX2NvbWJpbmUoKSBbWmh1XQotLSBDYXRjaCBtaXNzaW5nLWVuZC1vZi1ibG9jay1jb2RlIGVycm9yIGluIGFsbCBpbmZsYXRlcyBhbmQgaW4gcHVmZgotICAgIEFzc3VyZXMgdGhhdCByYW5kb20gaW5wdXQgdG8gaW5mbGF0ZSBldmVudHVhbGx5IHJlc3VsdHMgaW4gYW4gZXJyb3IKLS0gQWRkZWQgZW5vdWdoLmMgKGNhbGN1bGF0aW9uIG9mIEVOT1VHSCBmb3IgaW5mdHJlZXMuaCkgdG8gZXhhbXBsZXMvCi0tIFVwZGF0ZSBFTk9VR0ggYW5kIGl0cyB1c2FnZSB0byByZWZsZWN0IGRpc2NvdmVyZWQgYm91bmRzCi0tIEZpeCBnemVycm9yKCkgZXJyb3IgcmVwb3J0IG9uIGVtcHR5IGlucHV0IGZpbGUgW0Jyb3duXQotLSBBZGQgdXNoIGNhc3RzIGluIHRyZWVzLmMgdG8gYXZvaWQgcGVkYW50aWMgcnVudGltZSBlcnJvcnMKLS0gRml4IHR5cG8gaW4gemxpYi5oIHVuY29tcHJlc3MoKSBkZXNjcmlwdGlvbiBbUmVpc3NdCi0tIENvcnJlY3QgaW5mbGF0ZSgpIGNvbW1lbnRzIHdpdGggcmVnYXJkIHRvIGF1dG9tYXRpYyBoZWFkZXIgZGV0ZWN0aW9uCi0tIFJlbW92ZSBkZXByZWNhdGlvbiBjb21tZW50IG9uIFpfUEFSVElBTF9GTFVTSCAoaXQgc3RheXMpCi0tIFB1dCBuZXcgdmVyc2lvbiBvZiBnemxvZyAoMi4wKSBpbiBleGFtcGxlcyB3aXRoIGludGVycnVwdGlvbiByZWNvdmVyeQotLSBBZGQgcHVmZiBjb21waWxlIG9wdGlvbiB0byBwZXJtaXQgaW52YWxpZCBkaXN0YW5jZS10b28tZmFyIHN0cmVhbXMKLS0gQWRkIHB1ZmYgVEVTVCBjb21tYW5kIG9wdGlvbnMsIGFiaWxpdHkgdG8gcmVhZCBwaXBlZCBpbnB1dAotLSBQcm90b3R5cGUgdGhlICo2NCBmdW5jdGlvbnMgaW4gemxpYi5oIHdoZW4gX0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQsIGJ1dAotICBfTEFSR0VGSUxFNjRfU09VUkNFIG5vdCBkZWZpbmVkCi0tIEZpeCBaX0ZVTExfRkxVU0ggdG8gdHJ1bHkgZXJhc2UgdGhlIHBhc3QgYnkgcmVzZXR0aW5nIHMtPnN0cnN0YXJ0Ci0tIEZpeCBkZWZsYXRlU2V0RGljdGlvbmFyeSgpIHRvIHVzZSBhbGwgMzJLIGZvciBvdXRwdXQgY29uc2lzdGVuY3kKLS0gUmVtb3ZlIGV4dHJhbmVvdXMgI2RlZmluZSBNSU5fTE9PS0FIRUFEIGluIGRlZmxhdGUuYyAoaW4gZGVmbGF0ZS5oKQotLSBDbGVhciBieXRlcyBhZnRlciBkZWZsYXRlIGxvb2thaGVhZCB0byBhdm9pZCB1c2Ugb2YgdW5pbml0aWFsaXplZCBkYXRhCi0tIENoYW5nZSBhIGxpbWl0IGluIGluZnRyZWVzLmMgdG8gYmUgbW9yZSB0cmFuc3BhcmVudCB0byBDb3Zlcml0eSBQcmV2ZW50Ci0tIFVwZGF0ZSB3aW4zMi96bGliLmRlZiB3aXRoIGV4cG9ydGVkIHN5bWJvbHMgZnJvbSB6bGliLmgKLS0gQ29ycmVjdCBzcGVsbGluZyBlcnJvcnMgaW4gemxpYi5oIFtXaWxsZW0sIFNvYnJhZG9dCi0tIEFsbG93IFpfQkxPQ0sgZm9yIGRlZmxhdGUoKSB0byBmb3JjZSBhIG5ldyBibG9jawotLSBBbGxvdyBuZWdhdGl2ZSBiaXRzIGluIGluZmxhdGVQcmltZSgpIHRvIGRlbGV0ZSBleGlzdGluZyBiaXQgYnVmZmVyCi0tIEFkZCBaX1RSRUVTIGZsdXNoIG9wdGlvbiB0byBpbmZsYXRlKCkgdG8gcmV0dXJuIGF0IGVuZCBvZiB0cmVlcwotLSBBZGQgaW5mbGF0ZU1hcmsoKSB0byByZXR1cm4gY3VycmVudCBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgcmFuZG9tIGFjY2VzcwotLSBBZGQgTWFrZWZpbGUgZm9yIE5pbnRlbmRvRFMgdG8gY29udHJpYiBbQ29zdGFdCi0tIEFkZCAtdyBpbiBjb25maWd1cmUgY29tcGlsZSB0ZXN0cyB0byBhdm9pZCBzcHVyaW91cyB3YXJuaW5ncyBbQmV1Y2xlcl0KLS0gRml4IHR5cG9zIGluIHpsaWIuaCBjb21tZW50cyBmb3IgZGVmbGF0ZVNldERpY3Rpb25hcnkoKQotLSBGaXggRU9GIGRldGVjdGlvbiBpbiB0cmFuc3BhcmVudCBnenJlYWQoKSBbTWFpZXJdCi0KLUNoYW5nZXMgaW4gMS4yLjMuMyAoMiBPY3RvYmVyIDIwMDYpCi0tIE1ha2UgLS1zaGFyZWQgdGhlIGRlZmF1bHQgZm9yIGNvbmZpZ3VyZSwgYWRkIGEgLS1zdGF0aWMgb3B0aW9uCi0tIEFkZCBjb21waWxlIG9wdGlvbiB0byBwZXJtaXQgaW52YWxpZCBkaXN0YW5jZS10b28tZmFyIHN0cmVhbXMKLS0gQWRkIGluZmxhdGVVbmRlcm1pbmUoKSBmdW5jdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBlbmFibGUgYWJvdmUKLS0gUmVtb3ZlIHVzZSBvZiAidGhpcyIgdmFyaWFibGUgbmFtZSBmb3IgQysrIGNvbXBhdGliaWxpdHkgW01hcnF1ZXNzXQotLSBBZGQgdGVzdGluZyBvZiBzaGFyZWQgbGlicmFyeSBpbiBtYWtlIHRlc3QsIGlmIHNoYXJlZCBsaWJyYXJ5IGJ1aWx0Ci0tIFVzZSBmdGVsbG8oKSBhbmQgZnNlZWtvKCkgaWYgYXZhaWxhYmxlIGluc3RlYWQgb2YgZnRlbGwoKSBhbmQgZnNlZWsoKQotLSBQcm92aWRlIHR3byB2ZXJzaW9ucyBvZiBhbGwgZnVuY3Rpb25zIHRoYXQgdXNlIHRoZSB6X29mZl90IHR5cGUgZm9yCi0gIGJpbmFyeSBjb21wYXRpYmlsaXR5IC0tIGEgbm9ybWFsIHZlcnNpb24gYW5kIGEgNjQtYml0IG9mZnNldCB2ZXJzaW9uLAotICBwZXIgdGhlIExhcmdlIEZpbGUgU3VwcG9ydCBFeHRlbnNpb24gd2hlbiBfTEFSR0VGSUxFNjRfU09VUkNFIGlzCi0gIGRlZmluZWQ7IHVzZSB0aGUgNjQtYml0IHZlcnNpb25zIGJ5IGRlZmF1bHQgd2hlbiBfRklMRV9PRkZTRVRfQklUUwotICBpcyBkZWZpbmVkIHRvIGJlIDY0Ci0tIEFkZCBhIC0tdW5hbWU9IG9wdGlvbiB0byBjb25maWd1cmUgdG8gcGVyaGFwcyBoZWxwIHdpdGggY3Jvc3MtY29tcGlsaW5nCi0KLUNoYW5nZXMgaW4gMS4yLjMuMiAoMyBTZXB0ZW1iZXIgMjAwNikKLS0gVHVybiBvZmYgc2lsbHkgQm9ybGFuZCB3YXJuaW5ncyBbSGF5XQotLSBVc2Ugb2ZmNjRfdCBhbmQgZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0Ugd2hlbiBwcmVzZW50Ci0tIEZpeCBtaXNzaW5nIGRlcGVuZGVuY3kgb24gaW5mZml4ZWQuaCBpbiBNYWtlZmlsZS5pbgotLSBSaWcgY29uZmlndXJlIC0tc2hhcmVkIHRvIGJ1aWxkIGJvdGggc2hhcmVkIGFuZCBzdGF0aWMgW1RlcmVkZXNhaSwgVHJ1dGFdCi0tIFJlbW92ZSB6Y29uZi5pbi5oIGFuZCBpbnN0ZWFkIGNyZWF0ZSBhIG5ldyB6bGliZGVmcy5oIGZpbGUKLS0gRml4IGNvbnRyaWIvbWluaXppcC91bnppcC5jIG5vbi1lbmNyeXB0ZWQgYWZ0ZXIgZW5jcnlwdGVkIFtWb2xsYW50XQotLSBBZGQgdHJlZWJ1aWxkLnhtbCAoc2VlIGh0dHA6Ly90cmVlYnVpbGQubWV0dXguZGUvKSBbV2VpZ2VsdF0KLQotQ2hhbmdlcyBpbiAxLjIuMy4xICgxNiBBdWd1c3QgMjAwNikKLS0gQWRkIHdhdGNvbSBkaXJlY3Rvcnkgd2l0aCBPcGVuV2F0Y29tIG1ha2UgZmlsZXMgW0RhbmllbF0KLS0gUmVtb3ZlICN1bmRlZiBvZiBGQVIgaW4gemNvbmYuaW4uaCBmb3IgTVZTIFtGZWR0a2VdCi0tIFVwZGF0ZSBtYWtlX3Ztcy5jb20gW1ppbnNlcl0KLS0gVXNlIC1mUElDIGZvciBzaGFyZWQgYnVpbGQgaW4gY29uZmlndXJlIFtUZXJlZGVzYWksIE5pY2hvbHNvbl0KLS0gVXNlIG9ubHkgbWFqb3IgdmVyc2lvbiBudW1iZXIgZm9yIGxpYnouc28gb24gSVJJWCBhbmQgT1NGMSBbUmVpbmhvbGR0c2VuXQotLSBVc2UgZmRvcGVuKCkgKG5vdCBfZmRvcGVuKCkpIGZvciBJbnRlcml4IGluIHp1dGlsLmggW0KKY2tdCi0tIEFkZCBzb21lIEZBUSBlbnRyaWVzIGFib3V0IHRoZSBjb250cmliIGRpcmVjdG9yeQotLSBVcGRhdGUgdGhlIE1WUyBxdWVzdGlvbiBpbiB0aGUgRkFRCi0tIEF2b2lkIGV4dHJhbmVvdXMgcmVhZHMgYWZ0ZXIgRU9GIGluIGd6aW8uYyBbQnJvd25dCi0tIENvcnJlY3Qgc3BlbGxpbmcgb2YgInN1Y2Nlc3NmdWxseSIgaW4gZ3ppby5jIFtSYW5kZXJzLVBlaHJzb25dCi0tIEFkZCBjb21tZW50cyB0byB6bGliLmggYWJvdXQgZ3plcnJvcigpIHVzYWdlIFtCcm93bl0KLS0gU2V0IGV4dHJhIGZsYWdzIGluIGd6aXAgaGVhZGVyIGluIGd6b3BlbigpIGxpa2UgZGVmbGF0ZSgpIGRvZXMKLS0gTWFrZSBjb25maWd1cmUgb3B0aW9ucyBtb3JlIGNvbXBhdGlibGUgd2l0aCBkb3VibGUtZGFzaCBjb252ZW50aW9ucwotICBbV2VpZ2VsdF0KLS0gQ2xlYW4gdXAgY29tcGlsYXRpb24gdW5kZXIgU29sYXJpcyBTdW5TdHVkaW8gY2MgW1Jvd2UsIFJlaW5ob2xkdHNlbl0KLS0gRml4IHVuaW5zdGFsbCB0YXJnZXQgaW4gTWFrZWZpbGUuaW4gW1RydXRhXQotLSBBZGQgcGtnY29uZmlnIHN1cHBvcnQgW1dlaWdlbHRdCi0tIFVzZSAkKERFU1RESVIpIG1hY3JvIGluIE1ha2VmaWxlLmluIFtSZWluaG9sZHRzZW4sIFdlaWdlbHRdCi0tIFJlcGxhY2Ugc2V0X2RhdGFfdHlwZSgpIHdpdGggYSBtb3JlIGFjY3VyYXRlIGRldGVjdF9kYXRhX3R5cGUoKSBpbgotICB0cmVlcy5jLCBhY2NvcmRpbmcgdG8gdGhlIHR4dHZzYmluLnR4dCBkb2N1bWVudCBbVHJ1dGFdCi0tIFN3YXAgdGhlIG9yZGVyIG9mICNpbmNsdWRlIDxzdGRpby5oPiBhbmQgI2luY2x1ZGUgInpsaWIuaCIgaW4KLSAgZ3ppby5jLCBleGFtcGxlLmMgYW5kIG1pbmlnemlwLmMgW1RydXRhXQotLSBTaHV0IHVwIGFubm95aW5nIFZTMjAwNSB3YXJuaW5ncyBhYm91dCBzdGFuZGFyZCBDIGRlcHJlY2F0aW9uIFtSb3dlLAotICBUcnV0YV0gKHdoZXJlPykKLS0gRml4IHRhcmdldCAiY2xlYW4iIGZyb20gd2luMzIvTWFrZWZpbGUuYm9yIFtUcnV0YV0KLS0gQ3JlYXRlIC5wZGIgYW5kIC5tYW5pZmVzdCBmaWxlcyBpbiB3aW4zMi9tYWtlZmlsZS5tc2MgW1ppZWdsZXIsIFJvd2VdCi0tIFVwZGF0ZSB6bGliIHd3dyBob21lIGFkZHJlc3MgaW4gd2luMzIvRExMX0ZBUS50eHQgW1RydXRhXQotLSBVcGRhdGUgY29udHJpYi9tYXNteDg2L2luZmZhczMyLmFzbSBmb3IgVlMyMDA1IFtWb2xsYW50LCBWYW4gV2Fzc2VuaG92ZV0KLS0gRW5hYmxlIGJyb3dzZSBpbmZvIGluIHRoZSAiRGVidWciIGFuZCAiQVNNIERlYnVnIiBjb25maWd1cmF0aW9ucyBpbgotICB0aGUgVmlzdWFsIEMrKyA2IHByb2plY3QsIGFuZCBzZXQgKG5vbi1BU00pICJEZWJ1ZyIgYXMgZGVmYXVsdCBbVHJ1dGFdCi0tIEFkZCBwa2djb25maWcgc3VwcG9ydCBbV2VpZ2VsdF0KLS0gQWRkIFpMSUJfVkVSX01BSk9SLCBaTElCX1ZFUl9NSU5PUiBhbmQgWkxJQl9WRVJfUkVWSVNJT04gaW4gemxpYi5oLAotICBmb3IgdXNlIGluIHdpbjMyL3psaWIxLnJjIFtQb2x1c2hpbiwgUm93ZSwgVHJ1dGFdCi0tIEFkZCBhIGRvY3VtZW50IHRoYXQgZXhwbGFpbnMgdGhlIG5ldyB0ZXh0IGRldGVjdGlvbiBzY2hlbWUgdG8KLSAgZG9jL3R4dHZzYmluLnR4dCBbVHJ1dGFdCi0tIEFkZCByZmMxOTUwLnR4dCwgcmZjMTk1MS50eHQgYW5kIHJmYzE5NTIudHh0IHRvIGRvYy8gW1RydXRhXQotLSBNb3ZlIGFsZ29yaXRobS50eHQgaW50byBkb2MvIFtUcnV0YV0KLS0gU3luY2hyb25pemUgRkFRIHdpdGggd2Vic2l0ZQotLSBGaXggY29tcHJlc3NCb3VuZCgpLCB3YXMgbG93IGZvciBzb21lIHBhdGhvbG9naWNhbCBjYXNlcyBbRmVhcm5sZXldCi0tIFRha2UgaW50byBhY2NvdW50IHdyYXBwZXIgdmFyaWF0aW9ucyBpbiBkZWZsYXRlQm91bmQoKQotLSBTZXQgZXhhbXBsZXMvenBpcGUuYyBpbnB1dCBhbmQgb3V0cHV0IHRvIGJpbmFyeSBtb2RlIGZvciBXaW5kb3dzCi0tIFVwZGF0ZSBleGFtcGxlcy96bGliX2hvdy5odG1sIHdpdGggbmV3IHpwaXBlLmMgKGFsc28gd2ViIHNpdGUpCi0tIEZpeCBzb21lIHdhcm5pbmdzIGluIGV4YW1wbGVzL2d6bG9nLmMgYW5kIGV4YW1wbGVzL3pyYW4uYyAoaXQgc2VlbXMKLSAgdGhhdCBnY2MgYmVjYW1lIHBpY2tpZXIgaW4gNC4wKQotLSBBZGQgemxpYi5tYXAgZm9yIExpbnV4OiAiQWxsIHN5bWJvbHMgZnJvbSB6bGliLTEuMS40IHJlbWFpbgotICB1bi12ZXJzaW9uZWQsIHRoZSBwYXRjaCBhZGRzIHZlcnNpb25pbmcgb25seSBmb3Igc3ltYm9scyBpbnRyb2R1Y2VkIGluCi0gIHpsaWItMS4yLjAgb3IgbGF0ZXIuICBJdCBhbHNvIGRlY2xhcmVzIGFzIGxvY2FsIHRob3NlIHN5bWJvbHMgd2hpY2ggYXJlCi0gIG5vdCBkZXNpZ25lZCB0byBiZSBleHBvcnRlZC4iIFtMZXZpbl0KLS0gVXBkYXRlIFpfUFJFRklYIGxpc3QgaW4gemNvbmYuaW4uaCwgYWRkIC0tenByZWZpeCBvcHRpb24gdG8gY29uZmlndXJlCi0tIERvIG5vdCBpbml0aWFsaXplIGdsb2JhbCBzdGF0aWMgYnkgZGVmYXVsdCBpbiB0cmVlcy5jLCBhZGQgYSByZXNwb25zZQotICBOT19JTklUX0dMT0JBTF9QT0lOVEVSUyB0byBpbml0aWFsaXplIHRoZW0gaWYgbmVlZGVkIFtNYXJxdWVzc10KLS0gRG9uJ3QgdXNlIHN0cmVycm9yKCkgaW4gZ3ppby5jIHVuZGVyIFdpbkNFIFtZYWtpbW92XQotLSBEb24ndCB1c2UgZXJybm8uaCBpbiB6dXRpbC5oIHVuZGVyIFdpbkNFIFtZYWtpbW92XQotLSBNb3ZlIGFyZ3VtZW50cyBmb3IgQVIgdG8gaXRzIHVzYWdlIHRvIGFsbG93IHJlcGxhY2luZyBhciBbTWFyb3RdCi0tIEFkZCBIQVZFX1ZJU0lCSUxJVFlfUFJBR01BIGluIHpjb25mLmluLmggZm9yIE1vemlsbGEgW1JhbmRlcnMtUGVocnNvbl0KLS0gSW1wcm92ZSBpbmZsYXRlSW5pdCgpIGFuZCBpbmZsYXRlSW5pdDIoKSBkb2N1bWVudGF0aW9uCi0tIEZpeCBzdHJ1Y3R1cmUgc2l6ZSBjb21tZW50IGluIGluZmxhdGUuaAotLSBDaGFuZ2UgY29uZmlndXJlIGhlbHAgb3B0aW9uIGZyb20gLS1oKiB0byAtLWhlbHAgW1NhbnRvc10KLQotQ2hhbmdlcyBpbiAxLjIuMyAoMTggSnVseSAyMDA1KQotLSBBcHBseSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IGZpeGVzIHRvIGNvbnRyaWIvaW5mYmFjazkgYXMgd2VsbAotLSBDbGVhbiB1cCBzb21lIHRleHQgZmlsZXMgKGNhcnJpYWdlIHJldHVybnMsIHRyYWlsaW5nIHNwYWNlKQotLSBVcGRhdGUgdGVzdHpsaWIsIHZzdHVkaW8sIG1hc214NjQsIGFuZCBtYXNteDg2IGluIGNvbnRyaWIgW1ZvbGxhbnRdCi0KLUNoYW5nZXMgaW4gMS4yLjIuNCAoMTEgSnVseSAyMDA1KQotLSBBZGQgaW5mbGF0ZVByaW1lKCkgZnVuY3Rpb24gZm9yIHN0YXJ0aW5nIGluZmxhdGlvbiBhdCBiaXQgYm91bmRhcnkKLS0gQXZvaWQgc29tZSBWaXN1YWwgQyB3YXJuaW5ncyBpbiBkZWZsYXRlLmMKLS0gQXZvaWQgbW9yZSBzaWxseSBWaXN1YWwgQyB3YXJuaW5ncyBpbiBpbmZsYXRlLmMgYW5kIGluZnRyZWVzLmMgZm9yIDY0LWJpdAotICBjb21waWxlCi0tIEZpeCBzb21lIHNwZWxsaW5nIGVycm9ycyBpbiBjb21tZW50cyBbQmV0dHNdCi0tIENvcnJlY3QgaW5mbGF0ZUluaXQyKCkgZXJyb3IgcmV0dXJuIGRvY3VtZW50YXRpb24gaW4gemxpYi5oCi0tIEFkZCB6cmFuLmMgZXhhbXBsZSBvZiBjb21wcmVzc2VkIGRhdGEgcmFuZG9tIGFjY2VzcyB0byBleGFtcGxlcwotICBkaXJlY3RvcnksIHNob3dzIHVzZSBvZiBpbmZsYXRlUHJpbWUoKQotLSBGaXggY2FzdCBmb3IgYXNzaWdubWVudHMgdG8gc3RybS0+c3RhdGUgaW4gaW5mbGF0ZS5jIGFuZCBpbmZiYWNrLmMKLS0gRml4IHpsaWJDb21waWxlRmxhZ3MoKSBpbiB6dXRpbC5jIHRvIHVzZSAxTCBmb3IgbG9uZyBzaGlmdHMgW09iZXJodW1lcl0KLS0gTW92ZSBkZWNsYXJhdGlvbnMgb2YgZ2YyIGZ1bmN0aW9ucyB0byByaWdodCBwbGFjZSBpbiBjcmMzMi5jIFtPYmVyaHVtZXJdCi0tIEFkZCBjYXN0IGluIHRyZWVzLmMgdCBhdm9pZCBhIHdhcm5pbmcgW09iZXJodW1lcl0KLS0gQXZvaWQgc29tZSB3YXJuaW5ncyBpbiBmaXRibGsuYywgZ3VuLmMsIGd6am9pbi5jIGluIGV4YW1wbGVzIFtPYmVyaHVtZXJdCi0tIFVwZGF0ZSBtYWtlX3Ztcy5jb20gW1ppbnNlcl0KLS0gSW5pdGlhbGl6ZSBzdGF0ZS0+d3JpdGUgaW4gaW5mbGF0ZVJlc2V0KCkgc2luY2UgY29waWVkIGluIGluZmxhdGVfZmFzdCgpCi0tIEJlIG1vcmUgc3RyaWN0IG9uIGluY29tcGxldGUgY29kZSBzZXRzIGluIGluZmxhdGVfdGFibGUoKSBhbmQgaW5jcmVhc2UKLSAgRU5PVUdIIGFuZCBNQVhEIC0tIHRoaXMgcmVwYWlycyBhIHBvc3NpYmxlIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkgZm9yCi0gIGludmFsaWQgaW5mbGF0ZSBpbnB1dC4gIFRoYW5rcyB0byBUYXZpcyBPcm1hbmR5IGFuZCBNYXJrdXMgT2Jlcmh1bWVyIGZvcgotICBkaXNjb3ZlcmluZyB0aGUgdnVsbmVyYWJpbGl0eSBhbmQgcHJvdmlkaW5nIHRlc3QgY2FzZXMuCi0tIEFkZCBpYTY0IHN1cHBvcnQgdG8gY29uZmlndXJlIGZvciBIUC1VWCBbU21pdGhdCi0tIEFkZCBlcnJvciByZXR1cm4gdG8gZ3pyZWFkKCkgZm9yIGZvcm1hdCBvciBpL28gZXJyb3IgW0xldmluXQotLSBVc2UgbWFsbG9jLmggZm9yIE9TLzIgW05lY2FzZWtdCi0KLUNoYW5nZXMgaW4gMS4yLjIuMyAoMjcgTWF5IDIwMDUpCi0tIFJlcGxhY2UgMVUgY29uc3RhbnRzIGluIGluZmxhdGUuYyBhbmQgaW5mdHJlZXMuYyBmb3IgNjQtYml0IGNvbXBpbGUKLS0gVHlwZWNhc3QgZnJlYWQoKSByZXR1cm4gdmFsdWVzIGluIGd6aW8uYyBbVm9sbGFudF0KLS0gUmVtb3ZlIHRyYWlsaW5nIHNwYWNlIGluIG1pbmlnemlwLmMgb3V0bW9kZSAoVkMrKyBjYW4ndCBkZWFsIHdpdGggaXQpCi0tIEZpeCBjcmMgY2hlY2sgYnVnIGluIGd6cmVhZCgpIGFmdGVyIGd6dW5nZXRjKCkgW0hlaW5lcl0KLS0gQWRkIHRoZSBkZWZsYXRlVHVuZSgpIGZ1bmN0aW9uIHRvIGFkanVzdCBpbnRlcm5hbCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzCi0tIEFkZCBhIGZhc3QgZ3ppcCBkZWNvbXByZXNzb3IsIGd1bi5jLCB0byBleGFtcGxlcyAodXNlIG9mIGluZmxhdGVCYWNrKQotLSBSZW1vdmUgYW4gaW5jb3JyZWN0IGFzc2VydGlvbiBpbiBleGFtcGxlcy96cGlwZS5jCi0tIEFkZCBDKysgd3JhcHBlciBpbiBpbmZiYWNrOS5oIFtEb25haXNdCi0tIEZpeCBidWcgaW4gaW5mbGF0ZUNvcHkoKSB3aGVuIGRlY29kaW5nIGZpeGVkIGNvZGVzCi0tIE5vdGUgaW4gemxpYi5oIGhvdyBtdWNoIGRlZmxhdGVTZXREaWN0aW9uYXJ5KCkgYWN0dWFsbHkgdXNlcwotLSBSZW1vdmUgVVNFX0RJQ1RfSEVBRCBpbiBkZWZsYXRlLmMgKHdvdWxkIG1lc3MgdXAgaW5mbGF0ZSBpZiB1c2VkKQotLSBBZGQgX1dJTjMyX1dDRSB0byBkZWZpbmUgV0lOMzIgaW4gemNvbmYuaW4uaCBbU3BlbmNlcl0KLS0gRG9uJ3QgaW5jbHVkZSBzdGRlcnIuaCBvciBlcnJuby5oIGZvciBfV0lOMzJfV0NFIGluIHp1dGlsLmggW1NwZW5jZXJdCi0tIEFkZCBnemRpcmVjdCgpIGZ1bmN0aW9uIHRvIGluZGljYXRlIHRyYW5zcGFyZW50IHJlYWRzCi0tIFVwZGF0ZSBjb250cmliL21pbml6aXAgW1ZvbGxhbnRdCi0tIEZpeCBjb21waWxhdGlvbiBvZiBkZWZsYXRlLmMgd2hlbiBib3RoIEFTTVYgYW5kIEZBU1RFU1QgW09iZXJodW1lcl0KLS0gQWRkIGNhc3RzIGluIGNyYzMyLmMgdG8gYXZvaWQgd2FybmluZ3MgW09iZXJodW1lcl0KLS0gQWRkIGNvbnRyaWIvbWFzbXg2NCBbVm9sbGFudF0KLS0gVXBkYXRlIGNvbnRyaWIvYXNtNTg2LCBhc202ODYsIG1hc214ODYsIHRlc3R6bGliLCB2c3R1ZGlvIFtWb2xsYW50XQotCi1DaGFuZ2VzIGluIDEuMi4yLjIgKDMwIERlY2VtYmVyIDIwMDQpCi0tIFJlcGxhY2Ugc3RydWN0dXJlIGFzc2lnbm1lbnRzIGluIGRlZmxhdGUuYyBhbmQgaW5mbGF0ZS5jIHdpdGggem1lbWNweSB0bwotICBhdm9pZCBpbXBsaWNpdCBtZW1jcHkgY2FsbHMgKHBvcnRhYmlsaXR5IGZvciBuby1saWJyYXJ5IGNvbXBpbGF0aW9uKQotLSBJbmNyZWFzZSBzcHJpbnRmKCkgYnVmZmVyIHNpemUgaW4gZ3pkb3BlbigpIHRvIGFsbG93IGZvciBsYXJnZSBudW1iZXJzCi0tIEFkZCBJTkZMQVRFX1NUUklDVCB0byBjaGVjayBkaXN0YW5jZXMgYWdhaW5zdCB6bGliIGhlYWRlcgotLSBJbXByb3ZlIFdpbkNFIGVycm5vIGhhbmRsaW5nIGFuZCBjb21tZW50cyBbQ2hhbmddCi0tIFJlbW92ZSBjb21tZW50IGFib3V0IG5vIGd6aXAgaGVhZGVyIHByb2Nlc3NpbmcgaW4gRkFRCi0tIEFkZCBaX0ZJWEVEIHN0cmF0ZWd5IG9wdGlvbiB0byBkZWZsYXRlSW5pdDIoKSB0byBmb3JjZSBmaXhlZCB0cmVlcwotLSBBZGQgdXBkYXRlZCBtYWtlX3Ztcy5jb20gW0NvZ2hsYW5dLCB1cGRhdGUgUkVBRE1FCi0tIENyZWF0ZSBhIG5ldyAiZXhhbXBsZXMiIGRpcmVjdG9yeSwgbW92ZSBnemFwcGVuZC5jIHRoZXJlLCBhZGQgenBpcGUuYywKLSAgZml0YmxrLmMsIGd6bG9nLltjaF0sIGd6am9pbi5jLCBhbmQgemxpYl9ob3cuaHRtbC4KLS0gQWRkIEZBUSBlbnRyeSBhbmQgY29tbWVudHMgaW4gZGVmbGF0ZS5jIG9uIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcwotLSBBZGQgU29sYXJpcyA5IG1ha2Ugb3B0aW9ucyBpbiBjb25maWd1cmUgW0dpbGJlcnRdCi0tIEFsbG93IHN0cmVycm9yKCkgdXNhZ2UgaW4gZ3ppby5jIGZvciBTVERDCi0tIEZpeCBEZWNvbXByZXNzQnVmIGluIGNvbnRyaWIvZGVscGhpL1pMaWIucGFzIFtNYW5DaGVzVGVyXQotLSBVcGRhdGUgY29udHJpYi9tYXNteDg2L2luZmZhczMyLmFzbSBhbmQgZ3ZtYXQzMi5hc20gW1ZvbGxhbnRdCi0tIFVzZSB6X29mZl90IGZvciBhZGxlcjMyX2NvbWJpbmUoKSBhbmQgY3JjMzJfY29tYmluZSgpIGxlbmd0aHMKLS0gTWFrZSBhZGxlcjMyKCkgbXVjaCBmYXN0ZXIgZm9yIHNtYWxsIGxlbgotLSBVc2UgT1NfQ09ERSBpbiBkZWZsYXRlKCkgZGVmYXVsdCBnemlwIGhlYWRlcgotCi1DaGFuZ2VzIGluIDEuMi4yLjEgKDMxIE9jdG9iZXIgMjAwNCkKLS0gQWxsb3cgaW5mbGF0ZVNldERpY3Rpb25hcnkoKSBjYWxsIGZvciByYXcgaW5mbGF0ZQotLSBGaXggaW5mbGF0ZSBoZWFkZXIgY3JjIGNoZWNrIGJ1ZyBmb3IgZmlsZSBuYW1lcyBhbmQgY29tbWVudHMKLS0gQWRkIGRlZmxhdGVTZXRIZWFkZXIoKSBhbmQgZ3pfaGVhZGVyIHN0cnVjdHVyZSBmb3IgY3VzdG9tIGd6aXAgaGVhZGVycwotLSBBZGQgaW5mbGF0ZUdldGhlYWRlcigpIHRvIHJldHJpZXZlIGd6aXAgaGVhZGVycwotLSBBZGQgY3JjMzJfY29tYmluZSgpIGFuZCBhZGxlcjMyX2NvbWJpbmUoKSBmdW5jdGlvbnMKLS0gQWRkIGFsbG9jX2Z1bmMsIGZyZWVfZnVuYywgaW5fZnVuYywgb3V0X2Z1bmMgdG8gWl9QUkVGSVggbGlzdAotLSBVc2UgenN0cmVhbXAgY29uc2lzdGVudGx5IGluIHpsaWIuaCAoaW5mbGF0ZV9iYWNrIGZ1bmN0aW9ucykKLS0gUmVtb3ZlIEdVTlpJUCBjb25kaXRpb24gZnJvbSBkZWZpbml0aW9uIG9mIGluZmxhdGVfbW9kZSBpbiBpbmZsYXRlLmgKLSAgYW5kIGluIGNvbnRyaWIvaW5mbGF0ZTg2L2luZmZhc3QuUyBbVHJ1dGEsIEFuZGVyc29uXQotLSBBZGQgc3VwcG9ydCBmb3IgQU1ENjQgaW4gY29udHJpYi9pbmZsYXRlODYvaW5mZmFzODYuYyBbQW5kZXJzb25dCi0tIFVwZGF0ZSBwcm9qZWN0cy9SRUFETUUucHJvamVjdHMgYW5kIHByb2plY3RzL3Zpc3VhbGM2IFtUcnV0YV0KLS0gVXBkYXRlIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0KLS0gQXZvaWQgd2FybmluZyB1bmRlciBOT19HWkNPTVBSRVNTIGluIGd6aW8uYzsgZml4IHR5cG8gW1RydXRhXQotLSBEZXByZWNhdGUgWl9BU0NJSTsgdXNlIFpfVEVYVCBpbnN0ZWFkIFtUcnV0YV0KLS0gVXNlIGEgbmV3IGFsZ29yaXRobSBmb3Igc2V0dGluZyBzdHJtLT5kYXRhX3R5cGUgaW4gdHJlZXMuYyBbVHJ1dGFdCi0tIERvIG5vdCBkZWZpbmUgYW4gZXhpdCgpIHByb3RvdHlwZSBpbiB6dXRpbC5jIHVubGVzcyBERUJVRyBkZWZpbmVkCi0tIFJlbW92ZSBwcm90b3R5cGUgb2YgZXhpdCgpIGZyb20genV0aWwuYywgZXhhbXBsZS5jLCBtaW5pZ3ppcC5jIFtUcnV0YV0KLS0gQWRkIGNvbW1lbnQgaW4gemxpYi5oIGZvciBaX05PX0ZMVVNIIHBhcmFtZXRlciB0byBkZWZsYXRlKCkKLS0gRml4IERhcndpbiBidWlsZCB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uIFtQZXRlcnNvbl0KLQotQ2hhbmdlcyBpbiAxLjIuMiAoMyBPY3RvYmVyIDIwMDQpCi0tIFVwZGF0ZSB6bGliLmggY29tbWVudHMgb24gZ3ppcCBpbi1tZW1vcnkgcHJvY2Vzc2luZwotLSBTZXQgYWRsZXIgdG8gMSBpbiBpbmZsYXRlUmVzZXQoKSB0byBzdXBwb3J0IEphdmEgdGVzdCBzdWl0ZSBbV2FsbGVzXQotLSBBZGQgY29udHJpYi9kb3R6bGliIFtSYXZuXQotLSBVcGRhdGUgd2luMzIvRExMX0ZBUS50eHQgW1RydXRhXQotLSBVcGRhdGUgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQotLSBNb3ZlIGNvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCB0byBvbGQvIFtUcnV0YV0KLS0gRml4IGFzc2VtYmxlciBidWlsZHMgaW4gcHJvamVjdHMvdmlzdWFsYzYvIFtUcnV0YV0KLQotQ2hhbmdlcyBpbiAxLjIuMS4yICg5IFNlcHRlbWJlciAyMDA0KQotLSBVcGRhdGUgSU5ERVggZmlsZQotLSBGaXggdHJlZXMuYyB0byB1cGRhdGUgc3RybS0+ZGF0YV90eXBlIChubyBvbmUgZXZlciBub3RpY2VkISkKLS0gRml4IGJ1ZyBpbiBlcnJvciBjYXNlIGluIGluZmxhdGUuYywgaW5mYmFjay5jLCBhbmQgaW5mYmFjazkuYyBbQnJvd25dCi0tIEFkZCAidm9sYXRpbGUiIHRvIGNyYyB0YWJsZSBmbGFnIGRlY2xhcmF0aW9uIChmb3IgRFlOQU1JQ19DUkNfVEFCTEUpCi0tIEFkZCBsaW1pdGVkIG11bHRpdGFza2luZyBwcm90ZWN0aW9uIHRvIERZTkFNSUNfQ1JDX1RBQkxFCi0tIEFkZCBOT192c25wcmludGYgZm9yIFZNUyBpbiB6dXRpbC5oIFtNb3ppbGxhXQotLSBEb24ndCBkZWNsYXJlIHN0cmVycm9yKCkgdW5kZXIgVk1TIFtNb3ppbGxhXQotLSBBZGQgY29tbWVudCB0byBEWU5BTUlDX0NSQ19UQUJMRSB0byB1c2UgZ2V0X2NyY190YWJsZSgpIHRvIGluaXRpYWxpemUKLS0gVXBkYXRlIGNvbnRyaWIvYWRhIFtBbmlzaW1rb3ZdCi0tIFVwZGF0ZSBjb250cmliL21pbml6aXAgW1ZvbGxhbnRdCi0tIEZpeCBjb25maWd1cmUgdG8gbm90IGhhcmRjb2RlIGRpcmVjdG9yaWVzIGZvciBEYXJ3aW4gW1BldGVyc29uXQotLSBGaXggZ3ppby5jIHRvIG5vdCByZXR1cm4gZXJyb3Igb24gZW1wdHkgZmlsZXMgW0Jyb3duXQotLSBGaXggaW5kZW50YXRpb247IHVwZGF0ZSB2ZXJzaW9uIGluIGNvbnRyaWIvZGVscGhpL1pMaWIucGFzIGFuZAotICBjb250cmliL3Bhc2NhbC96bGlicGFzLnBhcyBbVHJ1dGFdCi0tIFVwZGF0ZSBta2FzbS5iYXQgaW4gY29udHJpYi9tYXNteDg2IFtUcnV0YV0KLS0gVXBkYXRlIGNvbnRyaWIvdW50Z3ogW1RydXRhXQotLSBBZGQgcHJvamVjdHMvUkVBRE1FLnByb2plY3RzIFtUcnV0YV0KLS0gQWRkIHByb2plY3QgZm9yIE1TIFZpc3VhbCBDKysgNi4wIGluIHByb2plY3RzL3Zpc3VhbGM2IFtDYWRpZXV4LCBUcnV0YV0KLS0gVXBkYXRlIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0KLS0gVXBkYXRlIGxpc3Qgb2YgWl9QUkVGSVggc3ltYm9scyBpbiB6Y29uZi5oIFtSYW5kZXJzLVBlaHJzb24sIFRydXRhXQotLSBSZW1vdmUgYW4gdW5uZWNlc3NhcnkgYXNzaWdubWVudCB0byBjdXJyIGluIGluZnRyZWVzLmMgW1RydXRhXQotLSBBZGQgT1MvMiB0byBleGUgYnVpbGRzIGluIGNvbmZpZ3VyZSBbUG9sdG9yYWtdCi0tIFJlbW92ZSBlcnIgZHVtbXkgcGFyYW1ldGVyIGluIHpsaWIuaCBbS2llbnR6bGVdCi0KLUNoYW5nZXMgaW4gMS4yLjEuMSAoOSBKYW51YXJ5IDIwMDQpCi0tIFVwZGF0ZSBlbWFpbCBhZGRyZXNzIGluIFJFQURNRQotLSBTZXZlcmFsIEZBUSB1cGRhdGVzCi0tIEZpeCBhIGJpZyBmYXQgYnVnIGluIGluZnRyZWVzLmMgdGhhdCBwcmV2ZW50ZWQgZGVjb2RpbmcgdmFsaWQKLSAgZHluYW1pYyBibG9ja3Mgd2l0aCBvbmx5IGxpdGVyYWxzIGFuZCBubyBkaXN0YW5jZSBjb2RlcyAtLQotICBUaGFua3MgdG8gIkhvdCBFbXUiIGZvciB0aGUgYnVnIHJlcG9ydCBhbmQgc2FtcGxlIGZpbGUKLS0gQWRkIGEgbm90ZSB0byBwdWZmLmMgb24gbm8gZGlzdGFuY2UgY29kZXMgY2FzZS4KLQotQ2hhbmdlcyBpbiAxLjIuMSAoMTcgTm92ZW1iZXIgMjAwMykKLS0gUmVtb3ZlIGEgdGFiIGluIGNvbnRyaWIvZ3phcHBlbmQvZ3phcHBlbmQuYwotLSBVcGRhdGUgc29tZSBpbnRlcmZhY2VzIGluIGNvbnRyaWIgZm9yIG5ldyB6bGliIGZ1bmN0aW9ucwotLSBVcGRhdGUgemxpYiB2ZXJzaW9uIG51bWJlciBpbiBzb21lIGNvbnRyaWIgZW50cmllcwotLSBBZGQgV2luZG93cyBDRSBkZWZpbml0aW9uIGZvciBwdHJkaWZmX3QgaW4genV0aWwuaCBbTWFpLCBUcnV0YV0KLS0gU3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIG9uIEh1cmQgYW5kIEtGcmVlQlNEIFtCcm93bl0KLS0gRml4IGVycm9yIGluIE5PX0RJVklERSBvcHRpb24gb2YgYWRsZXIzMi5jCi0KLUNoYW5nZXMgaW4gMS4yLjAuOCAoNCBOb3ZlbWJlciAyMDAzKQotLSBVcGRhdGUgdmVyc2lvbiBpbiBjb250cmliL2RlbHBoaS9aTGliLnBhcyBhbmQgY29udHJpYi9wYXNjYWwvemxpYnBhcy5wYXMKLS0gQWRkIGV4cGVyaW1lbnRhbCBOT19ESVZJREUgI2RlZmluZSBpbiBhZGxlcjMyLmMKLSAgICAtIFBvc3NpYmx5IGZhc3RlciBvbiBzb21lIHByb2Nlc3NvcnMgKGxldCBtZSBrbm93IGlmIGl0IGlzKQotLSBDb3JyZWN0IFpfQkxPQ0sgdG8gbm90IHJldHVybiBvbiBmaXJzdCBpbmZsYXRlIGNhbGwgaWYgbm8gd3JhcAotLSBGaXggc3RybS0+ZGF0YV90eXBlIG9uIGluZmxhdGUoKSByZXR1cm4gdG8gY29ycmVjdGx5IGluZGljYXRlIEVPQgotLSBBZGQgZGVmbGF0ZVByaW1lKCkgZnVuY3Rpb24gZm9yIGFwcGVuZGluZyBpbiB0aGUgbWlkZGxlIG9mIGEgYnl0ZQotLSBBZGQgY29udHJpYi9nemFwcGVuZCBmb3IgYW4gZXhhbXBsZSBvZiBhcHBlbmRpbmcgdG8gYSBzdHJlYW0KLS0gVXBkYXRlIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0KLS0gRGVsZXRlIFR1cmJvIEMgY29tbWVudCBpbiBSRUFETUUgW1RydXRhXQotLSBJbXByb3ZlIHNvbWUgaW5kZW50YXRpb24gaW4gemNvbmYuaCBbVHJ1dGFdCi0tIEZpeCBpbmZpbml0ZSBsb29wIG9uIGJhZCBpbnB1dCBpbiBjb25maWd1cmUgc2NyaXB0IFtDaHVyY2hdCi0tIEZpeCBnemVvZigpIGZvciBjb25jYXRlbmF0ZWQgZ3ppcCBmaWxlcyBbSm9obnNvbl0KLS0gQWRkIGV4YW1wbGUgdG8gY29udHJpYi92aXN1YWwtYmFzaWMudHh0IFtNaWNoYWVsIEIuXQotLSBBZGQgLXAgdG8gbWtkaXIncyBpbiBNYWtlZmlsZS5pbiBbdmRhXQotLSBGaXggY29uZmlndXJlIHRvIHByb3Blcmx5IGRldGVjdCBwcmVzZW5jZSBvciBsYWNrIG9mIHByaW50ZiBmdW5jdGlvbnMKLS0gQWRkIEFTNDAwIHN1cHBvcnQgW01vbm5lcmF0XQotLSBBZGQgYSBsaXR0bGUgQ3lnd2luIHN1cHBvcnQgW1dpbHNvbl0KLQotQ2hhbmdlcyBpbiAxLjIuMC43ICgyMSBTZXB0ZW1iZXIgMjAwMykKLS0gQ29ycmVjdCBzb21lIGRlYnVnIGZvcm1hdHMgaW4gY29udHJpYi9pbmZiYWNrOQotLSBDYXN0IGEgdHlwZSBpbiBhIGRlYnVnIHN0YXRlbWVudCBpbiB0cmVlcy5jCi0tIENoYW5nZSBzZWFyY2ggYW5kIHJlcGxhY2UgZGVsaW1pdGVyIGluIGNvbmZpZ3VyZSBmcm9tICUgdG8gIyBbQmVlYmVdCi0tIFVwZGF0ZSBjb250cmliL3VudGd6IHRvIDAuMiB3aXRoIHZhcmlvdXMgZml4ZXMgW1RydXRhXQotLSBBZGQgYnVpbGQgc3VwcG9ydCBmb3IgQW1pZ2EgW05pa2xdCi0tIFJlbW92ZSBzb21lIGRpcmVjdG9yaWVzIGluIG9sZCB0aGF0IGhhdmUgYmVlbiB1cGRhdGVkIHRvIDEuMgotLSBBZGQgZHlsaWIgYnVpbGRpbmcgZm9yIE1hYyBPUyBYIGluIGNvbmZpZ3VyZSBhbmQgTWFrZWZpbGUuaW4KLS0gUmVtb3ZlIG9sZCBkaXN0cmlidXRpb24gc3R1ZmYgZnJvbSBNYWtlZmlsZQotLSBVcGRhdGUgUkVBRE1FIHRvIHBvaW50IHRvIERMTF9GQVEudHh0LCBhbmQgYWRkIGNvbW1lbnQgb24gTWFjIE9TIFgKLS0gVXBkYXRlIGxpbmtzIGluIFJFQURNRQotCi1DaGFuZ2VzIGluIDEuMi4wLjYgKDEzIFNlcHRlbWJlciAyMDAzKQotLSBNaW5vciBGQVEgdXBkYXRlcwotLSBVcGRhdGUgY29udHJpYi9taW5pemlwIHRvIDEuMDAgW1ZvbGxhbnRdCi0tIFJlbW92ZSB0ZXN0IG9mIGd6IGZ1bmN0aW9ucyBpbiBleGFtcGxlLmMgd2hlbiBHWl9DT01QUkVTUyBkZWZpbmVkIFtUcnV0YV0KLS0gVXBkYXRlIFBPU1RJTkMgY29tbWVudCBmb3IgNjgwNjAgW05pa2xdCi0tIEFkZCBjb250cmliL2luZmJhY2s5IHdpdGggZGVmbGF0ZTY0IGRlY29kaW5nICh1bnN1cHBvcnRlZCkKLS0gRm9yIE1WUyBkZWZpbmUgTk9fdnNucHJpbnRmIGFuZCB1bmRlZmluZSBGQVIgW3ZhbiBCdXJpa10KLS0gQWRkIHByYWdtYSBmb3IgZmRvcGVuIG9uIE1WUyBbdmFuIEJ1cmlrXQotCi1DaGFuZ2VzIGluIDEuMi4wLjUgKDggU2VwdGVtYmVyIDIwMDMpCi0tIEFkZCBPRiB0byBpbmZsYXRlQmFja0VuZCgpIGRlY2xhcmF0aW9uIGluIHpsaWIuaAotLSBSZW1lbWJlciBzdGFydCB3aGVuIHVzaW5nIGd6ZG9wZW4gaW4gdGhlIG1pZGRsZSBvZiBhIGZpbGUKLS0gVXNlIGludGVybmFsIG9mZl90IGNvdW50ZXJzIGluIGd6KiBmdW5jdGlvbnMgdG8gcHJvcGVybHkgaGFuZGxlIHNlZWtzCi0tIFBlcmZvcm0gbW9yZSByaWdvcm91cyBjaGVjayBmb3IgZGlzdGFuY2UtdG9vLWZhciBpbiBpbmZmYXN0LmMKLS0gQWRkIFpfQkxPQ0sgZmx1c2ggb3B0aW9uIHRvIHJldHVybiBmcm9tIGluZmxhdGUgYXQgYmxvY2sgYm91bmRhcnkKLS0gU2V0IHN0cm0tPmRhdGFfdHlwZSBvbiByZXR1cm4gZnJvbSBpbmZsYXRlCi0gICAgLSBJbmRpY2F0ZSBiaXRzIHVudXNlZCwgaWYgYXQgYmxvY2sgYm91bmRhcnksIGFuZCBpZiBpbiBsYXN0IGJsb2NrCi0tIFJlcGxhY2Ugc2l6ZV90IHdpdGggcHRyZGlmZl90IGluIGNyYzMyLmMsIGFuZCBjaGVjayBmb3IgY29ycmVjdCBzaXplCi0tIEFkZCBjb25kaXRpb24gc28gb2xkIE5PX0RFRkxBVEUgZGVmaW5lIHN0aWxsIHdvcmtzIGZvciBjb21wYXRpYmlsaXR5Ci0tIEZBUSB1cGRhdGUgcmVnYXJkaW5nIHRoZSBXaW5kb3dzIERMTCBbVHJ1dGFdCi0tIElOREVYIHVwZGF0ZTogYWRkIHFueCBlbnRyeSwgcmVtb3ZlIGFpeCBlbnRyeSBbVHJ1dGFdCi0tIEluc3RhbGwgemxpYi4zIGludG8gbWFuZGlyIFtXaWxzb25dCi0tIE1vdmUgY29udHJpYi96bGliX2RsbF9GQVEudHh0IHRvIHdpbjMyL0RMTF9GQVEudHh0OyB1cGRhdGUgW1RydXRhXQotLSBBZGFwdCB0aGUgemxpYiBpbnRlcmZhY2UgdG8gdGhlIG5ldyBETEwgY29udmVudGlvbiBndWlkZWxpbmVzIFtUcnV0YV0KLS0gSW50cm9kdWNlIFpMSUJfV0lOQVBJIG1hY3JvIHRvIGFsbG93IHRoZSBleHBvcnQgb2YgZnVuY3Rpb25zIHVzaW5nCi0gIHRoZSBXSU5BUEkgY2FsbGluZyBjb252ZW50aW9uLCBmb3IgVmlzdWFsIEJhc2ljIFtWb2xsYW50LCBUcnV0YV0KLS0gVXBkYXRlIG1zZG9zIGFuZCB3aW4zMiBzY3JpcHRzIGFuZCBtYWtlZmlsZXMgW1RydXRhXQotLSBFeHBvcnQgc3ltYm9scyBieSBuYW1lLCBub3QgYnkgb3JkaW5hbCwgaW4gd2luMzIvemxpYi5kZWYgW1RydXRhXQotLSBBZGQgY29udHJpYi9hZGEgW0FuaXNpbWtvdl0KLS0gTW92ZSBhc20gZmlsZXMgZnJvbSBjb250cmliL3ZzdHVkaW8vdmM3MF8zMiB0byBjb250cmliL2FzbTM4NiBbVHJ1dGFdCi0tIFJlbmFtZSBjb250cmliL2FzbTM4NiB0byBjb250cmliL21hc214ODYgW1RydXRhLCBWb2xsYW50XQotLSBBZGQgY29udHJpYi9tYXNtNjg2IFtUcnV0YV0KLS0gRml4IG9mZnNldHMgaW4gY29udHJpYi9pbmZsYXRlODYgYW5kIGNvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20KLSAgW1RydXRhLCBWb2xsYW50XQotLSBVcGRhdGUgY29udHJpYi9kZWxwaGk7IHJlbmFtZSB0byBjb250cmliL3Bhc2NhbDsgYWRkIGV4YW1wbGUgW1RydXRhXQotLSBSZW1vdmUgY29udHJpYi9kZWxwaGkyOyBhZGQgYSBuZXcgY29udHJpYi9kZWxwaGkgW1RydXRhXQotLSBBdm9pZCBpbmNsdXNpb24gb2YgdGhlIG5vbnN0YW5kYXJkIDxtZW1vcnkuaD4gaW4gY29udHJpYi9pb3N0cmVhbSwKLSAgYW5kIGZpeCBzb21lIG1ldGhvZCBwcm90b3R5cGVzIFtUcnV0YV0KLS0gRml4IHRoZSBaQ1JfU0VFRDIgY29uc3RhbnQgdG8gYXZvaWQgd2FybmluZ3MgaW4gY29udHJpYi9taW5pemlwCi0gIFtUcnV0YV0KLS0gQXZvaWQgdGhlIHVzZSBvZiBiYWNrc2xhc2ggKFwpIGluIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0KLS0gRml4IGZpbGUgdGltZSBoYW5kbGluZyBpbiBjb250cmliL3VudGd6OyB1cGRhdGUgbWFrZWZpbGVzIFtUcnV0YV0KLS0gVXBkYXRlIGNvbnRyaWIvdnN0dWRpby92YzcwXzMyIHRvIGNvbXBseSB3aXRoIHRoZSBuZXcgRExMIGd1aWRlbGluZXMKLSAgW1ZvbGxhbnRdCi0tIFJlbW92ZSBjb250cmliL3ZzdHVkaW8vdmMxNV8xNiBbVm9sbGFudF0KLS0gUmVuYW1lIGNvbnRyaWIvdnN0dWRpby92YzcwXzMyIHRvIGNvbnRyaWIvdnN0dWRpby92YzcgW1RydXRhXQotLSBVcGRhdGUgUkVBRE1FLmNvbnRyaWIgW1RydXRhXQotLSBJbnZlcnQgdGhlIGFzc2lnbm1lbnQgb3JkZXIgb2YgbWF0Y2hfaGVhZCBhbmQgcy0+cHJldlsuLi5dIGluCi0gIElOU0VSVF9TVFJJTkcgW1RydXRhXQotLSBDb21wYXJlIFRPT19GQVIgd2l0aCAzMjc2NyBpbnN0ZWFkIG9mIDMyNzY4LCB0byBhdm9pZCAxNi1iaXQgd2FybmluZ3MKLSAgW1RydXRhXQotLSBDb21wYXJlIGZ1bmN0aW9uIHBvaW50ZXJzIHdpdGggMCwgbm90IHdpdGggTlVMTCBvciBaX05VTEwgW1RydXRhXQotLSBGaXggcHJvdG90eXBlIG9mIHN5bmNzZWFyY2ggaW4gaW5mbGF0ZS5jIFtUcnV0YV0KLS0gSW50cm9kdWNlIEFTTUlORiBtYWNybyB0byBiZSBlbmFibGVkIHdoZW4gdXNpbmcgYW4gQVNNIGltcGxlbWVudGF0aW9uCi0gIG9mIGluZmxhdGVfZmFzdCBbVHJ1dGFdCi0tIENoYW5nZSBOT19ERUZMQVRFIHRvIE5PX0daQ09NUFJFU1MgW1RydXRhXQotLSBNb2RpZnkgdGVzdF9nemlvIGluIGV4YW1wbGUuYyB0byB0YWtlIGEgc2luZ2xlIGZpbGUgbmFtZSBhcyBhCi0gIHBhcmFtZXRlciBbVHJ1dGFdCi0tIEV4aXQgdGhlIGV4YW1wbGUuYyBwcm9ncmFtIGlmIGd6b3BlbiBmYWlscyBbVHJ1dGFdCi0tIEFkZCB0eXBlIGNhc3RzIGFyb3VuZCBzdHJsZW4gaW4gZXhhbXBsZS5jIFtUcnV0YV0KLS0gUmVtb3ZlIGNhc3RpbmcgdG8gc2l6ZW9mIGluIG1pbmlnemlwLmM7IGdpdmUgYSBwcm9wZXIgdHlwZQotICB0byB0aGUgdmFyaWFibGUgY29tcGFyZWQgd2l0aCBTVUZGSVhfTEVOIFtUcnV0YV0KLS0gVXBkYXRlIGRlZmluaXRpb25zIG9mIFNUREMgYW5kIFNUREM5OSBpbiB6Y29uZi5oIFtUcnV0YV0KLS0gU3luY2hyb25pemUgemNvbmYuaCB3aXRoIHRoZSBuZXcgV2luZG93cyBETEwgaW50ZXJmYWNlIFtUcnV0YV0KLS0gVXNlIFNZUzE2QklUIGluc3RlYWQgb2YgX18zMkJJVF9fIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KLSAgMTYtIGFuZCAzMi1iaXQgcGxhdGZvcm1zIFtUcnV0YV0KLS0gVXNlIGZhciBtZW1vcnkgYWxsb2NhdG9ycyBpbiBzbWFsbCAxNi1iaXQgbWVtb3J5IG1vZGVscyBmb3IKLSAgVHVyYm8gQyBbVHJ1dGFdCi0tIEFkZCBpbmZvIGFib3V0IHRoZSB1c2Ugb2YgQVNNViwgQVNNSU5GIGFuZCBaTElCX1dJTkFQSSBpbgotICB6bGliQ29tcGlsZUZsYWdzIFtUcnV0YV0KLS0gQ3lnd2luIGhhcyB2c25wcmludGYgW1dpbHNvbl0KLS0gSW4gV2luZG93czE2LCBPU19DT0RFIGlzIDAsIGFzIGluIE1TRE9TIFtUcnV0YV0KLS0gSW4gQ3lnd2luLCBPU19DT0RFIGlzIDMgKFVuaXgpLCBub3QgMTEgKFdpbmRvd3MzMikgW1dpbHNvbl0KLQotQ2hhbmdlcyBpbiAxLjIuMC40ICgxMCBBdWd1c3QgMjAwMykKLS0gTWlub3IgRkFRIHVwZGF0ZXMKLS0gQmUgbW9yZSBzdHJpY3Qgd2hlbiBjaGVja2luZyBpbmZsYXRlSW5pdDIncyB3aW5kb3dCaXRzIHBhcmFtZXRlcgotLSBDaGFuZ2UgTk9fR1VOWklQIGNvbXBpbGUgb3B0aW9uIHRvIE5PX0daSVAgdG8gY292ZXIgZGVmbGF0ZSBhcyB3ZWxsCi0tIEFkZCBnemlwIHdyYXBwZXIgb3B0aW9uIHRvIGRlZmxhdGVJbml0MiB1c2luZyB3aW5kb3dCaXRzCi0tIEFkZCB1cGRhdGVkIFFOWCBydWxlIGluIGNvbmZpZ3VyZSBhbmQgcW54IGRpcmVjdG9yeSBbQm9ubmVmb3ldCi0tIE1ha2UgaW5mbGF0ZSBkaXN0YW5jZS10b28tZmFyIGNoZWNrcyBtb3JlIHJpZ29yb3VzCi0tIENsZWFuIHVwIEZBUiB1c2FnZSBpbiBpbmZsYXRlCi0tIEFkZCBjYXN0aW5nIHRvIHNpemVvZigpIGluIGd6aW8uYyBhbmQgbWluaWd6aXAuYwotCi1DaGFuZ2VzIGluIDEuMi4wLjMgKDE5IEp1bHkgMjAwMykKLS0gRml4IHNpbGx5IGVycm9yIGluIGd6dW5nZXRjKCkgaW1wbGVtZW50YXRpb24gW1ZvbGxhbnRdCi0tIFVwZGF0ZSBjb250cmliL21pbml6aXAgYW5kIGNvbnRyaWIvdnN0dWRpbyBbVm9sbGFudF0KLS0gRml4IHByaW50ZiBmb3JtYXQgaW4gZXhhbXBsZS5jCi0tIENvcnJlY3QgY2RlY2wgc3VwcG9ydCBpbiB6Y29uZi5pbi5oIFtBbmlzaW1rb3ZdCi0tIE1pbm9yIEZBUSB1cGRhdGVzCi0KLUNoYW5nZXMgaW4gMS4yLjAuMiAoMTMgSnVseSAyMDAzKQotLSBBZGQgWkxJQl9WRVJOVU0gaW4gemxpYi5oIGZvciBudW1lcmljYWwgcHJlcHJvY2Vzc29yIGNvbXBhcmlzb25zCi0tIEF0dGVtcHQgdG8gYXZvaWQgd2FybmluZ3MgaW4gY3JjMzIuYyBmb3IgcG9pbnRlci1pbnQgY29udmVyc2lvbgotLSBBZGQgQUlYIHRvIGNvbmZpZ3VyZSwgcmVtb3ZlIGFpeCBkaXJlY3RvcnkgW0Jha2tlcl0KLS0gQWRkIHNvbWUgY2FzdHMgdG8gbWluaWd6aXAuYwotLSBJbXByb3ZlIGNoZWNraW5nIGFmdGVyIGluc2VjdXJlIHNwcmludGYoKSBvciB2c3ByaW50ZigpIGNhbGxzCi0tIFJlbW92ZSAjZWxpZidzIGZyb20gY3JjMzIuYwotLSBDaGFuZ2UgbGVhdmUgbGFiZWwgdG8gaW5mX2xlYXZlIGluIGluZmxhdGUuYyBhbmQgaW5mYmFjay5jIHRvIGF2b2lkCi0gIGxpYnJhcnkgY29uZmxpY3RzCi0tIFJlbW92ZSBpbmZsYXRlIGd6aXAgZGVjb2RpbmcgYnkgZGVmYXVsdC0tb25seSBlbmFibGUgZ3ppcCBkZWNvZGluZyBieQotICBzcGVjaWFsIHJlcXVlc3QgZm9yIHN0cmljdGVyIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLS0gQWRkIHpsaWJDb21waWxlRmxhZ3MoKSBmdW5jdGlvbiB0byByZXR1cm4gY29tcGlsYXRpb24gaW5mb3JtYXRpb24KLS0gTW9yZSB0eXBlY2FzdGluZyBpbiBkZWZsYXRlLmMgdG8gYXZvaWQgd2FybmluZ3MKLS0gUmVtb3ZlIGxlYWRpbmcgdW5kZXJzY29yZSBmcm9tIF9DYXBpdGFsICNkZWZpbmVzIFtUcnV0YV0KLS0gRml4IGNvbmZpZ3VyZSB0byBsaW5rIHNoYXJlZCBsaWJyYXJ5IHdoZW4gdGVzdGluZwotLSBBZGQgc29tZSBXaW5kb3dzIENFIHRhcmdldCBhZGp1c3RtZW50cyBbTWFpXQotLSBSZW1vdmUgI2RlZmluZSBaTElCX0RMTCBpbiB6Y29uZi5oIFtWb2xsYW50XQotLSBBZGQgemxpYi4zIFtSb2RnZXJzXQotLSBVcGRhdGUgUkZDIFVSTCBpbiBkZWZsYXRlLmMgYW5kIGFsZ29yaXRobS50eHQgW01haV0KLS0gQWRkIHpsaWJfZGxsX0ZBUS50eHQgdG8gY29udHJpYiBbVHJ1dGFdCi0tIEFkZCBVTCB0byBzb21lIGNvbnN0YW50cyBbVHJ1dGFdCi0tIFVwZGF0ZSBtaW5pemlwIGFuZCB2c3R1ZGlvIFtWb2xsYW50XQotLSBSZW1vdmUgdmVzdGlnaWFsIE5FRURfRFVNTVlfUkVUVVJOIGZyb20gemNvbmYuaW4uaAotLSBFeHBhbmQgdXNlIG9mIE5PX0RVTU1ZX0RFQ0wgdG8gYXZvaWQgYWxsIGR1bW15IHN0cnVjdHVyZXMKLS0gQWRkZWQgaW9zdHJlYW0zIHRvIGNvbnRyaWIgW1NjaHdhcmR0XQotLSBSZXBsYWNlIHJld2luZCgpIHdpdGggZnNlZWsoKSBmb3IgV2luQ0UgW1RydXRhXQotLSBJbXByb3ZlIHNldHRpbmcgb2YgemxpYiBmb3JtYXQgY29tcHJlc3Npb24gbGV2ZWwgZmxhZ3MKLSAgICAtIFJlcG9ydCAwIGZvciBodWZmbWFuIGFuZCBybGUgc3RyYXRlZ2llcyBhbmQgZm9yIGxldmVsID09IDAgb3IgMQotICAgIC0gUmVwb3J0IDIgb25seSBmb3IgbGV2ZWwgPT0gNgotLSBPbmx5IGRlYWwgd2l0aCA2NEsgbGltaXQgd2hlbiBuZWNlc3NhcnkgYXQgY29tcGlsZSB0aW1lIFtUcnV0YV0KLS0gQWxsb3cgVE9PX0ZBUiBjaGVjayB0byBiZSB0dXJuZWQgb2ZmIGF0IGNvbXBpbGUgdGltZSBbVHJ1dGFdCi0tIEFkZCBnemNsZWFyZXJyKCkgZnVuY3Rpb24gW1NvdXphXQotLSBBZGQgZ3p1bmdldGMoKSBmdW5jdGlvbgotCi1DaGFuZ2VzIGluIDEuMi4wLjEgKDE3IE1hcmNoIDIwMDMpCi0tIEFkZCBaX1JMRSBzdHJhdGVneSBmb3IgcnVuLWxlbmd0aCBlbmNvZGluZyBbVHJ1dGFdCi0gICAgLSBXaGVuIFpfUkxFIHJlcXVlc3RlZCwgcmVzdHJpY3QgbWF0Y2hlcyB0byBkaXN0YW5jZSBvbmUKLSAgICAtIFVwZGF0ZSB6bGliLmgsIG1pbmlnemlwLmMsIGd6b3BlbigpLCBnemRvcGVuKCkgZm9yIFpfUkxFCi0tIENvcnJlY3QgRkFTVEVTVCBjb21waWxhdGlvbiB0byBhbGxvdyBsZXZlbCA9PSAwCi0tIENsZWFuIHVwIHdoYXQgZ2V0cyBjb21waWxlZCBmb3IgRkFTVEVTVAotLSBJbmNvcnBvcmF0ZSBjaGFuZ2VzIHRvIHpjb25mLmluLmggW1ZvbGxhbnRdCi0gICAgLSBSZWZpbmUgZGV0ZWN0aW9uIG9mIFR1cmJvIEMgbmVlZCBmb3IgZHVtbXkgcmV0dXJucwotICAgIC0gUmVmaW5lIFpMSUJfRExMIGNvbXBpbGF0aW9uCi0gICAgLSBJbmNsdWRlIGFkZGl0aW9uYWwgaGVhZGVyIGZpbGUgb24gVk1TIGZvciBvZmZfdCB0eXBlZGVmCi0tIFRyeSB0byB1c2UgX3ZzbnByaW50ZiB3aGVyZSBpdCBzdXBwbGFudHMgdnNwcmludGYgW1ZvbGxhbnRdCi0tIEFkZCBzb21lIGNhc3RzIGluIGluZmZhc3QuYwotLSBFbmNoYW5jZSBjb21tZW50cyBpbiB6bGliLmggb24gd2hhdCBoYXBwZW5zIGlmIGd6cHJpbnRmKCkgdHJpZXMgdG8KLSAgd3JpdGUgbW9yZSB0aGFuIDQwOTUgYnl0ZXMgYmVmb3JlIGNvbXByZXNzaW9uCi0tIFJlbW92ZSB1bnVzZWQgc3RhdGUgZnJvbSBpbmZsYXRlQmFja0VuZCgpCi0tIFJlbW92ZSBleGl0KDApIGZyb20gbWluaWd6aXAuYywgZXhhbXBsZS5jCi0tIEdldCByaWQgb2YgYWxsIHRob3NlIGRhcm4gdGFicwotLSBBZGQgImNoZWNrIiB0YXJnZXQgdG8gTWFrZWZpbGUuaW4gdGhhdCBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzICJ0ZXN0IgotLSBBZGQgIm1vc3RseWNsZWFuIiBhbmQgIm1haW50YWluZXItY2xlYW4iIHRhcmdldHMgdG8gTWFrZWZpbGUuaW4KLS0gVXBkYXRlIGNvbnRyaWIvaW5mbGF0ZTg2IFtBbmRlcnNvbl0KLS0gVXBkYXRlIGNvbnRyaWIvdGVzdHpsaWIsIGNvbnRyaWIvdnN0dWRpbywgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQotLSBBZGQgbXNkb3MgYW5kIHdpbjMyIGRpcmVjdG9yaWVzIHdpdGggbWFrZWZpbGVzIFtUcnV0YV0KLS0gTW9yZSBhZGRpdGlvbnMgYW5kIGltcHJvdmVtZW50cyB0byB0aGUgRkFRCi0KLUNoYW5nZXMgaW4gMS4yLjAgKDkgTWFyY2ggMjAwMykKLS0gTmV3IGFuZCBpbXByb3ZlZCBpbmZsYXRlIGNvZGUKLSAgICAtIEFib3V0IDIwJSBmYXN0ZXIKLSAgICAtIERvZXMgbm90IGFsbG9jYXRlIDMySyB3aW5kb3cgdW5sZXNzIGFuZCB1bnRpbCBuZWVkZWQKLSAgICAtIEF1dG9tYXRpY2FsbHkgZGV0ZWN0cyBhbmQgZGVjb21wcmVzc2VzIGd6aXAgc3RyZWFtcwotICAgIC0gUmF3IGluZmxhdGUgbm8gbG9uZ2VyIG5lZWRzIGFuIGV4dHJhIGR1bW15IGJ5dGUgYXQgZW5kCi0gICAgLSBBZGRlZCBpbmZsYXRlQmFjayBmdW5jdGlvbnMgdXNpbmcgYSBjYWxsYmFjayBpbnRlcmZhY2UtLWV2ZW4gZmFzdGVyCi0gICAgICB0aGFuIGluZmxhdGUsIHVzZWZ1bCBmb3IgZmlsZSB1dGlsaXRpZXMgKGd6aXAsIHppcCkKLSAgICAtIEFkZGVkIGluZmxhdGVDb3B5KCkgZnVuY3Rpb24gdG8gcmVjb3JkIHN0YXRlIGZvciByYW5kb20gYWNjZXNzIG9uCi0gICAgICBleHRlcm5hbGx5IGdlbmVyYXRlZCBkZWZsYXRlIHN0cmVhbXMgKGUuZy4gaW4gZ3ppcCBmaWxlcykKLSAgICAtIE1vcmUgcmVhZGFibGUgY29kZSAoSSBob3BlKQotLSBOZXcgYW5kIGltcHJvdmVkIGNyYzMyKCkKLSAgICAtIEFib3V0IDUwJSBmYXN0ZXIsIHRoYW5rcyB0byBzdWdnZXN0aW9ucyBmcm9tIFJvZG5leSBCcm93bgotLSBBZGQgZGVmbGF0ZUJvdW5kKCkgYW5kIGNvbXByZXNzQm91bmQoKSBmdW5jdGlvbnMKLS0gRml4IG1lbW9yeSBsZWFrIGluIGRlZmxhdGVJbml0MigpCi0tIFBlcm1pdCBzZXR0aW5nIGRpY3Rpb25hcnkgZm9yIHJhdyBkZWZsYXRlIChmb3IgcGFyYWxsZWwgZGVmbGF0ZSkKLS0gRml4IGNvbnN0IGRlY2xhcmF0aW9uIGZvciBnendyaXRlKCkKLS0gQ2hlY2sgZm9yIHNvbWUgbWFsbG9jKCkgZmFpbHVyZXMgaW4gZ3ppby5jCi0tIEZpeCBidWcgaW4gZ3pvcGVuKCkgb24gc2luZ2xlLWJ5dGUgZmlsZSAweDFmCi0tIEZpeCBidWcgaW4gZ3pyZWFkKCkgb24gY29uY2F0ZW5hdGVkIGZpbGUgd2l0aCAweDFmIGF0IGVuZCBvZiBidWZmZXIKLSAgYW5kIG5leHQgYnVmZmVyIGRvZXNuJ3Qgc3RhcnQgd2l0aCAweDhiCi0tIEZpeCB1bmNvbXByZXNzKCkgdG8gcmV0dXJuIFpfREFUQV9FUlJPUiBvbiB0cnVuY2F0ZWQgaW5wdXQKLS0gRnJlZSBtZW1vcnkgYXQgZW5kIG9mIGV4YW1wbGUuYwotLSBSZW1vdmUgTUFYICNkZWZpbmUgaW4gdHJlZXMuYyAoY29uZmxpY3RlZCB3aXRoIHNvbWUgbGlicmFyaWVzKQotLSBGaXggc3RhdGljIGNvbnN0J3MgaW4gZGVmbGF0ZS5jLCBnemlvLmMsIGFuZCB6dXRpbC5bY2hdCi0tIERlY2xhcmUgbWFsbG9jKCkgYW5kIGZyZWUoKSBpbiBnemlvLmMgaWYgU1REQyBub3QgZGVmaW5lZAotLSBVc2UgbWFsbG9jKCkgaW5zdGVhZCBvZiBjYWxsb2MoKSBpbiB6dXRpbC5jIGlmIGludCBiaWcgZW5vdWdoCi0tIERlZmluZSBTVERDIGZvciBBSVgKLS0gQWRkIGFpeC8gd2l0aCBhcHByb2FjaCBmb3IgY29tcGlsaW5nIHNoYXJlZCBsaWJyYXJ5IG9uIEFJWAotLSBBZGQgSFAtVVggc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyBpbiBjb25maWd1cmUKLS0gQWRkIE9wZW5VTklYIHN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgaW4gY29uZmlndXJlCi0tIFVzZSAkY2MgaW5zdGVhZCBvZiBnY2MgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcnkKLS0gTWFrZSBwcmVmaXggZGlyZWN0b3J5IGlmIG5lZWRlZCB3aGVuIGluc3RhbGxpbmcKLS0gQ29ycmVjdCBNYWNpbnRvc2ggYXZvaWRhbmNlIG9mIHR5cGVkZWYgQnl0ZSBpbiB6Y29uZi5oCi0tIENvcnJlY3QgVHVyYm8gQyBtZW1vcnkgYWxsb2NhdGlvbiB3aGVuIHVuZGVyIExpbnV4Ci0tIFVzZSBsaWJ6LmEgaW5zdGVhZCBvZiAtbHogaW4gTWFrZWZpbGUgKGFzc3VyZSB1c2Ugb2YgY29tcGlsZWQgbGlicmFyeSkKLS0gVXBkYXRlIGNvbmZpZ3VyZSB0byBjaGVjayBmb3Igc25wcmludGYgb3IgdnNucHJpbnRmIGZ1bmN0aW9ucyBhbmQgdGhlaXIKLSAgcmV0dXJuIHZhbHVlLCB3YXJuIGR1cmluZyBtYWtlIGlmIHVzaW5nIGFuIGluc2VjdXJlIGZ1bmN0aW9uCi0tIEZpeCBjb25maWd1cmUgcHJvYmxlbSB3aXRoIGNvbXBpbGUtdGltZSBrbm93bGVkZ2Ugb2YgSEFWRV9VTklTVERfSCB0aGF0Ci0gIGlzIGxvc3Qgd2hlbiBsaWJyYXJ5IGlzIHVzZWQtLXJlc29sdXRpb24gaXMgdG8gYnVpbGQgbmV3IHpjb25mLmgKLS0gRG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMgKGluIHpsaWIuaCk6Ci0gICAgLSBEb2N1bWVudCByYXcgZGVmbGF0ZSBhbmQgaW5mbGF0ZQotICAgIC0gVXBkYXRlIFJGQ3MgVVJMCi0gICAgLSBQb2ludCBvdXQgdGhhdCB6bGliIGFuZCBnemlwIGZvcm1hdHMgYXJlIGRpZmZlcmVudAotICAgIC0gTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbAotICAgIC0gRG9jdW1lbnQgc3RyaW5nIGxpbWl0IGZvciBnenByaW50ZigpIGFuZCBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cKLSAgICAtIE5vdGUgcmVxdWlyZW1lbnQgb24gYXZhaWxfb3V0IHdoZW4gZmx1c2hpbmcKLSAgICAtIE5vdGUgcGVybWl0dGVkIHZhbHVlcyBvZiBmbHVzaCBwYXJhbWV0ZXIgb2YgaW5mbGF0ZSgpCi0tIEFkZCBzb21lIEZBUXMgKGFuZCBldmVuIGFuc3dlcnMpIHRvIHRoZSBGQVEKLS0gQWRkIGNvbnRyaWIvaW5mbGF0ZTg2LyBmb3IgeDg2IGZhc3RlciBpbmZsYXRlCi0tIEFkZCBjb250cmliL2JsYXN0LyBmb3IgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeSBkZWNvbXByZXNzaW9uCi0tIEFkZCBjb250cmliL3B1ZmYvIHNpbXBsZSBpbmZsYXRlIGZvciBkZWZsYXRlIGZvcm1hdCBkZXNjcmlwdGlvbgotCi1DaGFuZ2VzIGluIDEuMS40ICgxMSBNYXJjaCAyMDAyKQotLSBaRlJFRSB3YXMgcmVwZWF0ZWQgb24gc2FtZSBhbGxvY2F0aW9uIG9uIHNvbWUgZXJyb3IgY29uZGl0aW9ucy4KLSAgVGhpcyBjcmVhdGVzIGEgc2VjdXJpdHkgcHJvYmxlbSBkZXNjcmliZWQgaW4KLSAgaHR0cDovL3d3dy56bGliLm9yZy9hZHZpc29yeS0yMDAyLTAzLTExLnR4dAotLSBSZXR1cm5lZCBpbmNvcnJlY3QgZXJyb3IgKFpfTUVNX0VSUk9SKSBvbiBzb21lIGludmFsaWQgZGF0YQotLSBBdm9pZCBhY2Nlc3NlcyBiZWZvcmUgd2luZG93IGZvciBpbnZhbGlkIGRpc3RhbmNlcyB3aXRoIGluZmxhdGUgd2luZG93Ci0gIGxlc3MgdGhhbiAzMksuCi0tIGZvcmNlIHdpbmRvd0JpdHMgPiA4IHRvIGF2b2lkIGEgYnVnIGluIHRoZSBlbmNvZGVyIGZvciBhIHdpbmRvdyBzaXplCi0gIG9mIDI1NiBieXRlcy4gKEEgY29tcGxldGUgZml4IHdpbGwgYmUgYXZhaWxhYmxlIGluIDEuMS41KS4KLQotQ2hhbmdlcyBpbiAxLjEuMyAoOSBKdWx5IDE5OTgpCi0tIGZpeCAiYW4gaW5mbGF0ZSBpbnB1dCBidWZmZXIgYnVnIHRoYXQgc2hvd3MgdXAgb24gcmFyZSBidXQgcGVyc2lzdGVudAotICBvY2Nhc2lvbnMiIChNYXJrKQotLSBmaXggZ3pyZWFkIGFuZCBnenRlbGwgZm9yIGNvbmNhdGVuYXRlZCAuZ3ogZmlsZXMgKERpZGllciBMZSBCb3RsYW4pCi0tIGZpeCBnenNlZWsoLi4uLCBTRUVLX1NFVCkgaW4gd3JpdGUgbW9kZQotLSBmaXggY3JjIGNoZWNrIGFmdGVyIGEgZ3plZWsgKEZyYW5rIEZhdWJlcnQpCi0tIGZpeCBtaW5pdW56aXAgd2hlbiB0aGUgbGFzdCBlbnRyeSBpbiBhIHppcCBmaWxlIGlzIGl0c2VsZiBhIHppcCBmaWxlCi0gIChKIExpbGxnZSkKLS0gYWRkIGNvbnRyaWIvYXNtNTg2IGFuZCBjb250cmliL2FzbTY4NiAoQnJpYW4gUmFpdGVyKQotICBTZWUgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbAotLSBhZGQgc3VwcG9ydCBmb3IgRGVscGhpIDMgaW4gY29udHJpYi9kZWxwaGkgKEJvYiBEZWxsYWNhKQotLSBhZGQgc3VwcG9ydCBmb3IgQysrQnVpbGRlciAzIGFuZCBEZWxwaGkgMyBpbiBjb250cmliL2RlbHBoaTIgKERhdmlkZSBNb3JldHRpKQotLSBkbyBub3QgZXhpdCBwcmVtYXR1cmVseSBpbiB1bnRneiBpZiAwIGF0IHN0YXJ0IG9mIGJsb2NrIChNYWdudXMgSG9sbWdyZW4pCi0tIHVzZSBtYWNybyBFWFRFUk4gaW5zdGVhZCBvZiBleHRlcm4gdG8gc3VwcG9ydCBETEwgZm9yIEJlT1MgKFNhbmRlciBTdG9rcykKLS0gYWRkZWQgYSBGQVEgZmlsZQotCi0tIFN1cHBvcnQgZ3pkb3BlbiBvbiBNYWMgd2l0aCBNZXRyb3dlcmtzIChKYXNvbiBMaW5oYXJ0KQotLSBEbyBub3QgcmVkZWZpbmUgQnl0ZSBvbiBNYWMgKEJyYWQgUGV0dGl0ICYgSmFzb24gTGluaGFydCkKLS0gZGVmaW5lIFNFRUtfRU5EIHRvbyBpZiBTRUVLX1NFVCBpcyBub3QgZGVmaW5lZCAoQWxiZXJ0IENoaW4tQS1Zb3VuZykKLS0gYXZvaWQgc29tZSB3YXJuaW5ncyB3aXRoIEJvcmxhbmQgQyAoVG9tIFRhbm5lcikKLS0gZml4IGEgcHJvYmxlbSBpbiBjb250cmliL21pbml6aXAvemlwLmMgZm9yIDE2LWJpdCBNU0RPUyAoR2lsbGVzIFZvbGxhbnQpCi0tIGVtdWxhdGUgdXRpbWUoKSBmb3IgV0lOMzIgaW4gY29udHJpYi91bnRneiAgKEdpbGxlcyBWb2xsYW50KQotLSBhbGxvdyBzZXZlcmFsIGFyZ3VtZW50cyB0byBjb25maWd1cmUgKFRpbSBNb29uZXksIEZyb2RvIExvb2lqYWFyZCkKLS0gdXNlIGxpYmRpciBhbmQgaW5jbHVkZWRpciBpbiBNYWtlZmlsZS5pbiAoVGltIE1vb25leSkKLS0gc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIG9uIE9TRjEgVjQgKFRpbSBNb29uZXkpCi0tIHJlbW92ZSBzb19sb2NhdGlvbnMgaW4gIm1ha2UgY2xlYW4iICAoVGltIE1vb25leSkKLS0gZml4IG1ha2V0cmVlLmMgY29tcGlsYXRpb24gZXJyb3IgKEdsZW5uLCBNYXJrKQotLSBQeXRob24gaW50ZXJmYWNlIHRvIHpsaWIgbm93IGluIFB5dGhvbiAxLjUgKEplcmVteSBIeWx0b24pCi0tIG5ldyBNYWtlZmlsZS5yaXNjb3MgKFJpY2ggV2Fsa2VyKQotLSBpbml0aWFsaXplIHN0YXRpYyBkZXNjcmlwdG9ycyBpbiB0cmVlcy5jIGZvciBlbWJlZGRlZCB0YXJnZXRzIChOaWNrIFNtaXRoKQotLSB1c2UgImZvby1neiIgaW4gZXhhbXBsZS5jIGZvciBSSVNDT1MgYW5kIFZNUyAoTmljayBTbWl0aCkKLS0gYWRkIHRoZSBPUy8yIGZpbGVzIGluIE1ha2VmaWxlLmluIHRvbyAoQW5kcmV3IFphYm9sb3RueSkKLS0gZml4IGZkb3BlbiBhbmQgaGFsbG9jIG1hY3JvcyBmb3IgTWljcm9zb2Z0IEMgNi4wIChUb20gTGFuZSkKLS0gZml4IG1ha2V0cmVlLmMgdG8gYWxsb3cgY2xlYW4gY29tcGlsYXRpb24gb2YgaW5mZml4ZWQuaCAoTWFyaykKLS0gZml4IHBhcmFtZXRlciBjaGVjayBpbiBkZWZsYXRlQ29weSAoR3VudGhlciBOaWtsKQotLSBjbGVhbnVwIHRyZWVzLmMsIHVzZSBjb21wcmVzc2VkX2xlbiBvbmx5IGluIGRlYnVnIG1vZGUgKENocmlzdGlhbiBTcGllbGVyKQotLSBNYW55IHBvcnRhYmlsaXR5IHBhdGNoZXMgYnkgQ2hyaXN0aWFuIFNwaWVsZXI6Ci0gIC4genV0aWwuYywgenV0aWwuaDogYWRkZWQgImNvbnN0IiBmb3Igem1lbSoKLSAgLiBNYWtlX3Ztcy5jb206IGZpeGVkIHNvbWUgdHlwb3MKLSAgLiBNYWtlX3Ztcy5jb206IG1zZG9zL01ha2VmaWxlLio6IHJlbW92ZWQgenV0aWwuaCBmcm9tIHNvbWUgZGVwZW5kZW5jeSBsaXN0cwotICAuIG1zZG9zL01ha2VmaWxlLm1zYzogcmVtb3ZlICJkZWZhdWx0IHJ0bCBsaW5rIGxpYnJhcnkiIGluZm8gZnJvbSBvYmogZmlsZXMKLSAgLiBtc2Rvcy9NYWtlZmlsZS4qOiB1c2UgbW9kZWwtZGVwZW5kZW50IG5hbWUgZm9yIHRoZSBidWlsdCB6bGliIGxpYnJhcnkKLSAgLiBtc2Rvcy9NYWtlZmlsZS5lbXgsIG50L01ha2VmaWxlLmVteCwgbnQvTWFrZWZpbGUuZ2NjOgotICAgICBuZXcgbWFrZWZpbGVzLCBmb3IgZW14IChET1MvT1MyKSwgZW14JnJzeG50IGFuZCBtaW5ndzMyIChXaW5kb3dzIDl4IC8gTlQpCi0tIHVzZSBkZWZpbmUgaW5zdGVhZCBvZiB0eXBlZGVmIGZvciBCeXRlZiBhbHNvIGZvciBNU0Mgc21hbGwvbWVkaXVtIChUb20gTGFuZSkKLS0gcmVwbGFjZSBfX2ZhciB3aXRoIF9mYXIgZm9yIGJldHRlciBwb3J0YWJpbGl0eSAoQ2hyaXN0aWFuIFNwaWVsZXIsIFRvbSBMYW5lKQotLSBmaXggdGVzdCBmb3IgZXJybm8uaCBpbiBjb25maWd1cmUgKFRpbSBOZXdzaGFtKQotCi1DaGFuZ2VzIGluIDEuMS4yICgxOSBNYXJjaCA5OCkKLS0gYWRkZWQgY29udHJpYi9taW56aXAsIG1pbmkgemlwIGFuZCB1bnppcCBiYXNlZCBvbiB6bGliIChHaWxsZXMgVm9sbGFudCkKLSAgU2VlIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbAotLSBwcmVpbml0aWFsaXplIHRoZSBpbmZsYXRlIHRhYmxlcyBmb3IgZml4ZWQgY29kZXMsIHRvIG1ha2UgdGhlIGNvZGUKLSAgY29tcGxldGVseSB0aHJlYWQgc2FmZSAoTWFyaykKLS0gc29tZSBzaW1wbGlmaWNhdGlvbnMgYW5kIHNsaWdodCBzcGVlZC11cCB0byB0aGUgaW5mbGF0ZSBjb2RlIChNYXJrKQotLSBmaXggZ3plb2Ygb24gbm9uLWNvbXByZXNzZWQgZmlsZXMgKEFsbGFuIFNjaHJ1bSkKLS0gYWRkIC1zdGQxIG9wdGlvbiBpbiBjb25maWd1cmUgZm9yIE9TRjEgdG8gZml4IGd6cHJpbnRmIChNYXJ0aW4gTW9rcmVqcykKLS0gdXNlIGRlZmF1bHQgdmFsdWUgb2YgNEsgZm9yIFpfQlVGU0laRSBmb3IgMTYtYml0IE1TRE9TIChUaW0gV2VnbmVyICsgR2xlbm4pCi0tIGFkZGVkIG9zMi9NYWtlZmlsZS5kZWYgYW5kIG9zMi96bGliLmRlZiAoQW5kcmV3IFphYm9sb3RueSkKLS0gYWRkIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgVU5JWF9TVjQuMk1QIChNQVRTVVVSQSBUYWthbm9yaSkKLS0gZG8gbm90IHdyYXAgZXh0ZXJuICJDIiBhcm91bmQgc3lzdGVtIGluY2x1ZGVzIChUb20gTGFuZSkKLS0gbWVudGlvbiB6bGliIGJpbmRpbmcgZm9yIFRDTCBpbiBSRUFETUUgKEFuZHJlYXMgS3VwcmllcykKLS0gYWRkZWQgYW1pZ2EvTWFrZWZpbGUucHVwIGZvciBBbWlnYSBwb3dlclVQIFNBUy9DIFBQQyAoQW5kcmVhcyBLbGVpbmVydCkKLS0gYWxsb3cgIm1ha2UgaW5zdGFsbCBwcmVmaXg9Li4uIiBldmVuIGFmdGVyIGNvbmZpZ3VyZSAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQotLSBhbGxvdyAiY29uZmlndXJlIC0tcHJlZml4ICRIT01FIiAoVGltIE1vb25leSkKLS0gcmVtb3ZlIHdhcm5pbmdzIGluIGV4YW1wbGUuYyBhbmQgZ3ppby5jIChHbGVubiBSYW5kZXJzLVBlaHJzb24pCi0tIG1vdmUgTWFrZWZpbGUuc2FzIHRvIGFtaWdhL01ha2VmaWxlLnNhcwotCi1DaGFuZ2VzIGluIDEuMS4xICgyNyBGZWIgOTgpCi0tIGZpeCBtYWNyb3MgX3RyX3RhbGx5XyogaW4gZGVmbGF0ZS5oIGZvciBkZWJ1ZyBtb2RlICAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQotLSByZW1vdmUgYmxvY2sgdHJ1bmNhdGlvbiBoZXVyaXN0aWMgd2hpY2ggaGFkIHZlcnkgbWFyZ2luYWwgZWZmZWN0IGZvciB6bGliCi0gIChzbWFsbGVyIGxpdF9idWZzaXplIHRoYW4gaW4gZ3ppcCAxLjIuNCkgYW5kIGRlZ3JhZGVkIGEgbGl0dGxlIHRoZQotICBjb21wcmVzc2lvbiByYXRpbyBvbiBzb21lIGZpbGVzLiBUaGlzIGFsc28gYWxsb3dzIGlubGluaW5nIF90cl90YWxseSBmb3IKLSAgbWF0Y2hlcyBpbiBkZWZsYXRlX3Nsb3cuCi0tIGFkZGVkIG1zZG9zL01ha2VmaWxlLnczMiBmb3IgV0lOMzIgTWljcm9zb2Z0IFZpc3VhbCBDKysgKEJvYiBGcmF6aWVyKQotCi1DaGFuZ2VzIGluIDEuMS4wICgyNCBGZWIgOTgpCi0tIGRvIG5vdCByZXR1cm4gU1RSRUFNX0VORCBwcmVtYXR1cmVseSBpbiBpbmZsYXRlIChKb2huIEJvd2xlcikKLS0gcmV2ZXJ0IHRvIHRoZSB6bGliIDEuMC44IGluZmxhdGUgdG8gYXZvaWQgdGhlIGdjYyAyLjguMCBidWcgKEplcmVteSBCdWhsZXIpCi0tIGNvbXBpbGUgd2l0aCAtREZBU1RFU1QgdG8gZ2V0IGNvbXByZXNzaW9uIGNvZGUgb3B0aW1pemVkIGZvciBzcGVlZCBvbmx5Ci0tIGluIG1pbmlnemlwLCB0cnkgbW1hcCdpbmcgdGhlIGlucHV0IGZpbGUgZmlyc3QgKE1pZ3VlbCBBbGJyZWNodCkKLS0gaW5jcmVhc2Ugc2l6ZSBvZiBJL08gYnVmZmVycyBpbiBtaW5pZ3ppcC5jIGFuZCBnemlvLmMgKG5vdCBhIGJpZyBnYWluCi0gIG9uIFN1biBidXQgc2lnbmlmaWNhbnQgb24gSFApCi0KLS0gYWRkIGEgcG9pbnRlciB0byBleHBlcmltZW50YWwgdW56aXAgbGlicmFyeSBpbiBSRUFETUUgKEdpbGxlcyBWb2xsYW50KQotLSBpbml0aWFsaXplIHZhcmlhYmxlIGdjYyBpbiBjb25maWd1cmUgKENocmlzIEhlcmJvcnRoKQotCi1DaGFuZ2VzIGluIDEuMC45ICgxNyBGZWIgMTk5OCkKLS0gYWRkZWQgZ3pwdXRzIGFuZCBnemdldHMgZnVuY3Rpb25zCi0tIGRvIG5vdCBjbGVhciBlb2YgZmxhZyBpbiBnenNlZWsgKE1hcmsgRGlla2hhbnMpCi0tIGZpeCBnenNlZWsgZm9yIGZpbGVzIGluIHRyYW5zcGFyZW50IG1vZGUgKE1hcmsgRGlla2hhbnMpCi0tIGRvIG5vdCBhc3N1bWUgdGhhdCB2c3ByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiAoSmVucyBLcmlua2UpCi0tIHJlcGxhY2UgRVhQT1JUIHdpdGggWkVYUE9SVCB0byBhdm9pZCBjb25mbGljdCB3aXRoIG90aGVyIHByb2dyYW1zCi0tIGFkZGVkIGNvbXByZXNzMiBpbiB6Y29uZi5oLCB6bGliLmRlZiwgemxpYi5kbnQKLS0gbmV3IGFzbSBjb2RlIGZyb20gR2lsbGVzIFZvbGxhbnQgaW4gY29udHJpYi9hc20zODYKLS0gc2ltcGxpZnkgdGhlIGluZmxhdGUgY29kZSAoTWFyayk6Ci0gLiBSZXBsYWNlIFpBTExPQydzIGluIGh1ZnRfYnVpbGQoKSB3aXRoIHNpbmdsZSBaQUxMT0MgaW4gaW5mbGF0ZV9ibG9ja3NfbmV3KCkKLSAuIFpBTExPQyB0aGUgbGVuZ3RoIGxpc3QgaW4gaW5mbGF0ZV90cmVlc19maXhlZCgpIGluc3RlYWQgb2YgdXNpbmcgc3RhY2sKLSAuIFpBTExPQyB0aGUgdmFsdWUgYXJlYSBmb3IgaHVmdF9idWlsZCgpIGluc3RlYWQgb2YgdXNpbmcgc3RhY2sKLSAuIFNpbXBsaWZ5IFpfRklOSVNIIGNoZWNrIGluIGluZmxhdGUoKQotCi0tIEF2b2lkIGdjYyAyLjguMCBjb21wYXJpc29uIGJ1ZyBhIGxpdHRsZSBkaWZmZXJlbnRseSB0aGFuIHpsaWIgMS4wLjgKLS0gaW4gaW5mdHJlZXMuYywgYXZvaWQgY2MgLU8gYnVnIG9uIEhQIChGYXJzaGlkIEVsYWhpKQotLSBpbiB6Y29uZi5oIG1vdmUgdGhlIFpMSUJfRExMIHN0dWZmIGVhcmxpZXIgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aAotICB0aGUgZGVjbGFyYXRpb24gb2YgRkFSIChHaWxsZXMgVk9sbGFudCkKLS0gaW5zdGFsbCBsaWJ6LnNvKiB3aXRoIG1vZGUgNzU1IChleGVjdXRhYmxlKSBpbnN0ZWFkIG9mIDY0NCAoTWFyYyBMZWhtYW5uKQotLSByZWFkX2J1ZiBidWYgcGFyYW1ldGVyIG9mIHR5cGUgQnl0ZWYqIGluc3RlYWQgb2YgY2hhcmYqCi0tIHptZW1jcHkgcGFyYW1ldGVycyBhcmUgb2YgdHlwZSBCeXRlZiosIG5vdCBjaGFyZiogKEpvc2VwaCBTdHJvdXQpCi0tIGRvIG5vdCByZWRlY2xhcmUgdW5saW5rIGluIG1pbmlnemlwLmMgZm9yIFdJTjMyIChKb2huIEJvd2xlcikKLS0gZml4IGNoZWNrIGZvciBwcmVzZW5jZSBvZiBkaXJlY3RvcmllcyBpbiAibWFrZSBpbnN0YWxsIiAoSWFuIFdpbGxpcykKLQotQ2hhbmdlcyBpbiAxLjAuOCAoMjcgSmFuIDE5OTgpCi0tIGZpeGVkIG9mZnNldHMgaW4gY29udHJpYi9hc20zODYvZ3ZtYXQzMi5hc20gKEdpbGxlcyBWb2xsYW50KQotLSBmaXggZ3pnZXRjIGFuZCBnenB1dGMgZm9yIGJpZyBlbmRpYW4gc3lzdGVtcyAoTWFya3VzIE9iZXJodW1lcikKLS0gYWRkZWQgY29tcHJlc3MyKCkgdG8gYWxsb3cgc2V0dGluZyB0aGUgY29tcHJlc3Npb24gbGV2ZWwKLS0gaW5jbHVkZSBzeXMvdHlwZXMuaCB0byBnZXQgb2ZmX3Qgb24gc29tZSBzeXN0ZW1zIChNYXJjIExlaG1hbm4gJiBRaW5nTG9uZykKLS0gdXNlIGNvbnN0YW50IGFycmF5cyBmb3IgdGhlIHN0YXRpYyB0cmVlcyBpbiB0cmVlcy5jIGluc3RlYWQgb2YgY29tcHV0aW5nCi0gIHRoZW0gYXQgcnVuIHRpbWUgKHRoYW5rcyB0byBLZW4gUmFlYnVybiBmb3IgdGhpcyBzdWdnZXN0aW9uKS4gVG8gY3JlYXRlCi0gIHRyZWVzLmgsIGNvbXBpbGUgd2l0aCBHRU5fVFJFRVNfSCBhbmQgcnVuICJtYWtlIHRlc3QiLgotLSBjaGVjayByZXR1cm4gY29kZSBvZiBleGFtcGxlIGluICJtYWtlIHRlc3QiIGFuZCBkaXNwbGF5IHJlc3VsdAotLSBwYXNzIG1pbmlnemlwIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIGZpbGVfY29tcHJlc3MKLS0gc2ltcGxpZnlpbmcgY29kZSBvZiBpbmZsYXRlU3luYyB0byBhdm9pZCBnY2MgMi44IGJ1ZwotCi0tIHN1cHBvcnQgQ0M9ImdjYyAtV2FsbCIgaW4gY29uZmlndXJlIC1zIChRaW5nTG9uZykKLS0gYXZvaWQgYSBmbHVzaCBjYXVzZWQgYnkgZnRlbGwgaW4gZ3pvcGVuIGZvciB3cml0ZSBtb2RlIChLZW4gUmFlYnVybikKLS0gZml4IHRlc3QgZm9yIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MKLS0gemxpYi5saWIgLT4gemxpYi5kbGwgaW4gbXNkb3MvemxpYi5yYyAoR2lsbGVzIFZvbGxhbnQpCi0tIGNoZWNrIGZvciBUQVJHRVRfT1NfTUFDIGluIGFkZGl0aW9uIHRvIE1BQ09TIChCcmFkIFBldHRpdCkKLS0gZG8gbm90IHVzZSBmZG9wZW4gZm9yIE1ldHJvd2Vya3Mgb24gTWFjIChCcmFkIFBldHRpdCkpCi0tIGFkZCBjaGVja3MgZm9yIGd6cHV0YyBhbmQgZ3pwdXRjIGluIGV4YW1wbGUuYwotLSBhdm9pZCB3YXJuaW5ncyBpbiBnemlvLmMgYW5kIGRlZmxhdGUuYyAoQW5kcmVhcyBLbGVpbmVydCkKLS0gdXNlIGNvbnN0IGZvciB0aGUgQ1JDIHRhYmxlIChLZW4gUmFlYnVybikKLS0gZml4ZWQgIm1ha2UgdW5pbnN0YWxsIiBmb3Igc2hhcmVkIGxpYnJhcmllcwotLSB1c2UgVHJhY2V2IGluc3RlYWQgb2YgVHJhY2UgaW4gaW5mYmxvY2suYwotLSBpbiBleGFtcGxlLmMgdXNlIGNvcnJlY3QgY29tcHJlc3NlZCBsZW5ndGggZm9yIHRlc3Rfc3luYwotLSBzdXBwcmVzcyArdm5vY29tcGF0d2FybmluZ3MgaW4gY29uZmlndXJlIGZvciBIUFVYIChub3QgYWx3YXlzIHN1cHBvcnRlZCkKLQotQ2hhbmdlcyBpbiAxLjAuNyAoMjAgSmFuIDE5OTgpCi0tIGZpeCBnenNlZWsgd2hpY2ggd2FzIGJyb2tlbiBpbiB3cml0ZSBtb2RlCi0tIHJldHVybiBlcnJvciBmb3IgZ3pzZWVrIHRvIG5lZ2F0aXZlIGFic29sdXRlIHBvc2l0aW9uCi0tIGZpeCBjb25maWd1cmUgZm9yIExpbnV4IChDaHVuLUNodW5nIENoZW4pCi0tIGluY3JlYXNlIHN0YWNrIHNwYWNlIGZvciBNU0MgKFRpbSBXZWduZXIpCi0tIGdldF9jcmNfdGFibGUgYW5kIGluZmxhdGVTeW5jUG9pbnQgYXJlIEVYUE9SVGVkIChHaWxsZXMgVm9sbGFudCkKLS0gZGVmaW5lIEVYUE9SVFZBIGZvciBnenByaW50ZiAoR2lsbGVzIFZvbGxhbnQpCi0tIGFkZGVkIG1hbiBwYWdlIHpsaWIuMyAoUmljayBSb2RnZXJzKQotLSBmb3IgY29udHJpYi91bnRneiwgZml4IG1ha2VkaXIoKSBhbmQgaW1wcm92ZSBNYWtlZmlsZQotCi0tIGNoZWNrIGd6c2VlayBpbiB3cml0ZSBtb2RlIGluIGV4YW1wbGUuYwotLSBhbGxvY2F0ZSBleHRyYSBidWZmZXIgZm9yIHNlZWtzIG9ubHkgaWYgZ3pzZWVrIGlzIGFjdHVhbGx5IGNhbGxlZAotLSBhdm9pZCBzaWduZWQvdW5zaWduZWQgY29tcGFyaXNvbnMgKFRpbSBXZWduZXIsIEdpbGxlcyBWb2xsYW50KQotLSBhZGQgaW5mbGF0ZVN5bmNQb2ludCBpbiB6Y29uZi5oCi0tIGZpeCBsaXN0IG9mIGV4cG9ydGVkIGZ1bmN0aW9ucyBpbiBudC96bGliLmRudCBhbmQgbWRzb3MvemxpYi5kZWYKLQotQ2hhbmdlcyBpbiAxLjAuNiAoMTkgSmFuIDE5OTgpCi0tIGFkZCBmdW5jdGlvbnMgZ3pwcmludGYsIGd6cHV0YywgZ3pnZXRjLCBnenRlbGwsIGd6ZW9mLCBnenNlZWssIGd6cmV3aW5kIGFuZAotICBnenNldHBhcmFtcyAodGhhbmtzIHRvIFJvbGFuZCBHaWVyc2lnIGFuZCBLZXZpbiBSdWxhbmQgZm9yIHNvbWUgb2YgdGhpcyBjb2RlKQotLSBGaXggYSBkZWZsYXRlIGJ1ZyBvY2N1cnJpbmcgb25seSB3aXRoIGNvbXByZXNzaW9uIGxldmVsIDAgKHRoYW5rcyB0bwotICBBbmR5IEJ1Y2tsZXIgZm9yIGZpbmRpbmcgdGhpcyBvbmUpLgotLSBJbiBtaW5pZ3ppcCwgcGFzcyB0cmFuc3BhcmVudGx5IGFsc28gdGhlIGZpcnN0IGJ5dGUgZm9yIC5aIGZpbGVzLgotLSByZXR1cm4gWl9CVUZfRVJST1IgaW5zdGVhZCBvZiBaX09LIGlmIG91dHB1dCBidWZmZXIgZnVsbCBpbiB1bmNvbXByZXNzKCkKLS0gY2hlY2sgWl9GSU5JU0ggaW4gaW5mbGF0ZSAodGhhbmtzIHRvIE1hcmMgU2NobHVwZXIpCi0tIEltcGxlbWVudCBkZWZsYXRlQ29weSAodGhhbmtzIHRvIEFkYW0gQ29zdGVsbG8pCi0tIG1ha2Ugc3RhdGljIGxpYnJhcmllcyBieSBkZWZhdWx0IGluIGNvbmZpZ3VyZSwgYWRkIC0tc2hhcmVkIG9wdGlvbi4KLS0gbW92ZSBNU0RPUyBvciBXaW5kb3dzIHNwZWNpZmljIGZpbGVzIHRvIGRpcmVjdG9yeSBtc2RvcwotLSBzdXBwcmVzcyB0aGUgbm90aW9uIG9mIHBhcnRpYWwgZmx1c2ggdG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZQotICAoYnV0IHRoZSBzeW1ib2wgWl9QQVJUSUFMX0ZMVVNIIGlzIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAxLjAuNCkKLS0gc3VwcHJlc3MgaGlzdG9yeSBidWZmZXIgcHJvdmlkZWQgYnkgYXBwbGljYXRpb24gdG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZQotICAodGhpcyBmZWF0dXJlIHdhcyBub3QgaW1wbGVtZW50ZWQgYW55d2F5IGluIDEuMC40KQotLSBuZXh0X2luIGFuZCBhdmFpbF9pbiBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBjYWxsaW5nIGluZmxhdGVJbml0IG9yCi0gIGluZmxhdGVJbml0MgotLSBhZGQgRVhQT1JUIGluIGFsbCBleHBvcnRlZCBmdW5jdGlvbnMgKGZvciBXaW5kb3dzIERMTCkKLS0gYWRkZWQgTWFrZWZpbGUubnQgKHRoYW5rcyB0byBTdGVwaGVuIFdpbGxpYW1zKQotLSBhZGRlZCB0aGUgdW5zdXBwb3J0ZWQgImNvbnRyaWIiIGRpcmVjdG9yeToKLSAgIGNvbnRyaWIvYXNtMzg2LyBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+Ci0gICAgICAgIDM4NiBhc20gY29kZSByZXBsYWNpbmcgbG9uZ2VzdF9tYXRjaCgpLgotICAgY29udHJpYi9pb3N0cmVhbS8gYnkgS2V2aW4gUnVsYW5kIDxrZXZpbkByb2Rpbi53dXN0bC5lZHU+Ci0gICAgICAgIEEgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZSB0byB0aGUgemxpYiBneiogZnVuY3Rpb25zCi0gICBjb250cmliL2lvc3RyZWFtMi8gIGJ5IFR5Z2UgTPh2c2V0IDxUeWdlLkxvdnNldEBjbXIubm8+Ci0gICAgICAgIEFub3RoZXIgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZQotICAgY29udHJpYi91bnRnei8gIGJ5ICJQZWRybyBBLiBBcmFuZGEgR3V0aVxpcnJleiIgPHBhYWdAdGlkLmVzPgotICAgICAgICBBIHZlcnkgc2ltcGxlIHRhci5neiBmaWxlIGV4dHJhY3RvciB1c2luZyB6bGliCi0gICBjb250cmliL3Zpc3VhbC1iYXNpYy50eHQgYnkgQ2FybG9zIFJpb3MgPGNfcmlvc0Bzb25kYS5jbD4KLSAgICAgICAgSG93IHRvIHVzZSBjb21wcmVzcygpLCB1bmNvbXByZXNzKCkgYW5kIHRoZSBneiogZnVuY3Rpb25zIGZyb20gVkIuCi0tIHBhc3MgcGFyYW1zIC1mIChmaWx0ZXJlZCBkYXRhKSwgLWggKGh1ZmZtYW4gb25seSksIC0xIHRvIC05IChjb21wcmVzc2lvbgotICBsZXZlbCkgaW4gbWluaWd6aXAgKHRoYW5rcyB0byBUb20gTGFuZSkKLQotLSB1c2UgY29uc3QgZm9yIHJvbW1hYmxlIGNvbnN0YW50cyBpbiBkZWZsYXRlCi0tIGFkZGVkIHRlc3QgZm9yIGd6c2VlayBhbmQgZ3p0ZWxsIGluIGV4YW1wbGUuYwotLSBhZGQgdW5kb2N1bWVudGVkIGZ1bmN0aW9uIGluZmxhdGVTeW5jUG9pbnQoKSAoaGFjayBmb3IgUGF1bCBNYWNrZXJyYXMpCi0tIGFkZCB1bmRvY3VtZW50ZWQgZnVuY3Rpb24gekVycm9yIHRvIGNvbnZlcnQgZXJyb3IgY29kZSB0byBzdHJpbmcKLSAgKGZvciBUaW0gU21pdGhlcnMpCi0tIEFsbG93IGNvbXBpbGF0aW9uIG9mIGd6aW8gd2l0aCAtRE5PX0RFRkxBVEUgdG8gYXZvaWQgdGhlIGNvbXByZXNzaW9uIGNvZGUuCi0tIFVzZSBkZWZhdWx0IG1lbWNweSBmb3IgU3ltYW50ZWMgTVNET1MgY29tcGlsZXIuCi0tIEFkZCBFWFBPUlQga2V5d29yZCBmb3IgY2hlY2tfZnVuYyAobmVlZGVkIGZvciBXaW5kb3dzIERMTCkKLS0gYWRkIGN1cnJlbnQgZGlyZWN0b3J5IHRvIExEX0xJQlJBUllfUEFUSCBmb3IgIm1ha2UgdGVzdCIKLS0gY3JlYXRlIGFsc28gYSBsaW5rIGZvciBsaWJ6LnNvLjEKLS0gYWRkZWQgc3VwcG9ydCBmb3IgRlVKSVRTVSBVWFAvRFMgKHRoYW5rcyB0byBUb3NoaWFraSBOb211cmEpCi0tIHVzZSAkKFNIQVJFRExJQikgaW5zdGVhZCBvZiBsaWJ6LnNvIGluIE1ha2VmaWxlLmluIChmb3IgSFBVWCkKLS0gYWRkZWQgLXNvbmFtZSBmb3IgTGludXggaW4gY29uZmlndXJlIChDaHVuLUNodW5nIENoZW4sCi0tIGFzc2lnbiBudW1iZXJzIHRvIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgaW4gemxpYi5kZWYgKGZvciBXaW5kb3dzIERMTCkKLS0gYWRkIGFkdmljZSBpbiB6bGliLmggZm9yIGJlc3QgdXNhZ2Ugb2YgZGVmbGF0ZVNldERpY3Rpb25hcnkKLS0gd29yayBhcm91bmQgY29tcGlsZXIgYnVnIG9uIEF0YXJpIChjYXN0IFpfTlVMTCBpbiBjYWxsIG9mIHMtPmNoZWNrZm4pCi0tIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggQU5TSSBrZXl3b3JkcyBvbmx5IGVuYWJsZWQgZm9yIFR1cmJvQyBpbiBsYXJnZSBtb2RlbAotLSBhdm9pZCAidmVyc2lvblN0cmluZyJbMF0gKEJvcmxhbmQgYnVnKQotLSBhZGQgTkVFRF9EVU1NWV9SRVRVUk4gZm9yIEJvcmxhbmQKLS0gdXNlIHZhcmlhYmxlIHpfdmVyYm9zZSBmb3IgdHJhY2luZyBpbiBkZWJ1ZyBtb2RlIChMLiBQZXRlciBEZXV0c2NoKS4KLS0gYWxsb3cgY29tcGlsYXRpb24gd2l0aCBDQwotLSBkZWZpbmVkIFNUREMgZm9yIE9TLzIgKERhdmlkIENoYXJsYXApCi0tIGxpbWl0IGV4dGVybmFsIG5hbWVzIHRvIDggY2hhcnMgZm9yIE1WUyAoVGhvbWFzIEx1bmQpCi0tIGluIG1pbmlnemlwLmMsIHVzZSBzdGF0aWMgYnVmZmVycyBvbmx5IGZvciAxNi1iaXQgc3lzdGVtcwotLSBmaXggc3VmZml4IGNoZWNrIGZvciAibWluaWd6aXAgLWQgZm9vLmd6IgotLSBkbyBub3QgcmV0dXJuIGFuIGVycm9yIGZvciB0aGUgMm5kIG9mIHR3byBjb25zZWN1dGl2ZSBnemZsdXNoKCkgKEZlbGl4IExlZSkKLS0gdXNlIF9mZG9wZW4gaW5zdGVhZCBvZiBmZG9wZW4gZm9yIE1TQyA+PSA2LjAgKFRob21hcyBGYW5zbGF1KQotLSBhZGRlZCBtYWtlbGNjLmJhdCBmb3IgbGNjLXdpbjMyIChUb20gU3QgRGVuaXMpCi0tIGluIE1ha2VmaWxlLmRqMiwgdXNlIGNvcHkgYW5kIGRlbCBpbnN0ZWFkIG9mIGluc3RhbGwgYW5kIHJtIChGcmFuayBEb25haG9lKQotLSBBdm9pZCBleHBhbmRlZCAkSWQkLiBVc2UgInJjcyAta2IiIG9yICJjdnMgYWRtaW4gLWtiIiB0byBhdm9pZCBJZCBleHBhbnNpb24uCi0tIGNoZWNrIGZvciB1bmlzdGQuaCBpbiBjb25maWd1cmUgKGZvciBvZmZfdCkKLS0gcmVtb3ZlIHVzZWxlc3MgY2hlY2sgcGFyYW1ldGVyIGluIGluZmxhdGVfYmxvY2tzX2ZyZWUKLS0gYXZvaWQgdXNlbGVzcyBhc3NpZ25tZW50IG9mIHMtPmNoZWNrIHRvIGl0c2VsZiBpbiBpbmZsYXRlX2Jsb2Nrc19uZXcKLS0gZG8gbm90IGZsdXNoIHR3aWNlIGluIGd6Y2xvc2UgKHRoYW5rcyB0byBLZW4gUmFlYnVybikKLS0gcmVuYW1lIEZPUEVOIGFzIEZfT1BFTiB0byBhdm9pZCBjbGFzaCB3aXRoIC91c3IvaW5jbHVkZS9zeXMvZmlsZS5oCi0tIHVzZSBOT19FUlJOT19IIGluc3RlYWQgb2YgZW51bWVyYXRpb24gb2Ygb3BlcmF0aW5nIHN5c3RlbXMgd2l0aCBlcnJuby5oCi0tIHdvcmsgYXJvdW5kIGJ1Z2d5IGZjbG9zZSBvbiBwaXBlcyBmb3IgSFAvVVgKLS0gc3VwcG9ydCB6bGliIERMTCB3aXRoIEJPUkxBTkQgQysrIDUuMCAodGhhbmtzIHRvIEdsZW5uIFJhbmRlcnMtUGVocnNvbikKLS0gZml4IGNvbmZpZ3VyZSBpZiBDQyBpcyBhbHJlYWR5IGVxdWFsIHRvIGdjYwotCi1DaGFuZ2VzIGluIDEuMC41ICgzIEphbiA5OCkKLS0gRml4IGluZmxhdGUgdG8gdGVybWluYXRlIGdyYWNlZnVsbHkgd2hlbiBmZWQgY29ycnVwdGVkIG9yIGludmFsaWQgZGF0YQotLSBVc2UgY29uc3QgZm9yIHJvbW1hYmxlIGNvbnN0YW50cyBpbiBpbmZsYXRlCi0tIEVsaW1pbmF0ZSBtZW1vcnkgbGVha3Mgb24gZXJyb3IgY29uZGl0aW9ucyBpbiBpbmZsYXRlCi0tIFJlbW92ZWQgc29tZSB2ZXN0aWdpYWwgY29kZSBpbiBpbmZsYXRlCi0tIFVwZGF0ZSB3ZWIgYWRkcmVzcyBpbiBSRUFETUUKLQotQ2hhbmdlcyBpbiAxLjAuNCAoMjQgSnVsIDk2KQotLSBJbiB2ZXJ5IHJhcmUgY29uZGl0aW9ucywgZGVmbGF0ZShzLCBaX0ZJTklTSCkgY291bGQgZmFpbCB0byBwcm9kdWNlIGFuIEVPRgotICBiaXQsIHNvIHRoZSBkZWNvbXByZXNzb3IgY291bGQgZGVjb21wcmVzcyBhbGwgdGhlIGNvcnJlY3QgZGF0YSBidXQgd2VudAotICBvbiB0byBhdHRlbXB0IGRlY29tcHJlc3NpbmcgZXh0cmEgZ2FyYmFnZSBkYXRhLiBUaGlzIGFmZmVjdGVkIG1pbmlnemlwIHRvby4KLS0gemxpYlZlcnNpb24gYW5kIGd6ZXJyb3IgcmV0dXJuIGNvbnN0IGNoYXIqIChuZWVkZWQgZm9yIERMTCkKLS0gcG9ydCB0byBSSVNDT1MgKG5vIGZkb3Blbiwgbm8gbXVsdGlwbGUgZG90cywgbm8gdW5saW5rLCBubyBmaWxlbm8pCi0tIHVzZSB6X2Vycm9yIG9ubHkgZm9yIERFQlVHIChhdm9pZCBwcm9ibGVtIHdpdGggRExMcykKLQotQ2hhbmdlcyBpbiAxLjAuMyAoMiBKdWwgOTYpCi0tIHVzZSB6X3N0cmVhbXAgaW5zdGVhZCBvZiB6X3N0cmVhbSAqLCB3aGljaCBpcyBub3cgYSBmYXIgcG9pbnRlciBpbiBNU0RPUwotICBzbWFsbCBhbmQgbWVkaXVtIG1vZGVsczsgdGhpcyBtYWtlcyB0aGUgbGlicmFyeSBpbmNvbXBhdGlibGUgd2l0aCBwcmV2aW91cwotICB2ZXJzaW9ucyBmb3IgdGhlc2UgbW9kZWxzLiAoTm8gZWZmZWN0IGluIGxhcmdlIG1vZGVsIG9yIG9uIG90aGVyIHN5c3RlbXMuKQotLSByZXR1cm4gT0sgaW5zdGVhZCBvZiBCVUZfRVJST1IgaWYgcHJldmlvdXMgZGVmbGF0ZSBjYWxsIHJldHVybmVkIHdpdGgKLSAgYXZhaWxfb3V0IGFzIHplcm8gYnV0IHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KLS0gYWRkZWQgbWVtY21wIGZvciBub24gU1REQyBjb21waWxlcnMKLS0gZGVmaW5lIE5PX0RVTU1ZX0RFQ0wgZm9yIG1vcmUgTWFjIGNvbXBpbGVycyAoLmggZmlsZXMgbWVyZ2VkIGluY29ycmVjdGx5KQotLSBkZWZpbmUgX18zMkJJVF9fIGlmIF9fMzg2X18gb3IgaTM4NiBpcyBkZWZpbmVkIChwYi4gd2l0aCBXYXRjb20gYW5kIFNDTykKLS0gYmV0dGVyIGNoZWNrIGZvciAxNi1iaXQgbW9kZSBNU0MgKGF2b2lkcyBwcm9ibGVtIHdpdGggU3ltYW50ZWMpCi0KLUNoYW5nZXMgaW4gMS4wLjIgKDIzIE1heSA5NikKLS0gYWRkZWQgV2luZG93cyBETEwgc3VwcG9ydAotLSBhZGRlZCBhIGZ1bmN0aW9uIHpsaWJWZXJzaW9uIChmb3IgdGhlIERMTCBzdXBwb3J0KQotLSBmaXhlZCBkZWNsYXJhdGlvbnMgdXNpbmcgQnl0ZWYgaW4gaW5mdXRpbC5jIChwYiB3aXRoIE1TRE9TIG1lZGl1bSBtb2RlbCkKLS0gQnl0ZWYgaXMgZGVmaW5lJ3MgaW5zdGVhZCBvZiB0eXBlZGVmJ2Qgb25seSBmb3IgQm9ybGFuZCBDCi0tIGF2b2lkIHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgaW4gZXhhbXBsZS5jCi0tIG1lbnRpb24gaW4gUkVBRE1FIHRoYXQgdGhlIHpsaWIgZm9ybWF0IGlzIG5vdyBSRkMxOTUwCi0tIHVwZGF0ZWQgTWFrZWZpbGUuZGoyCi0tIGFkZGVkIGFsZ29yaXRobS5kb2MKLQotQ2hhbmdlcyBpbiAxLjAuMSAoMjAgTWF5IDk2KSBbMS4wIHNraXBwZWQgdG8gYXZvaWQgY29uZnVzaW9uXQotLSBmaXggYXJyYXkgb3ZlcmxheSBpbiBkZWZsYXRlLmMgd2hpY2ggc29tZXRpbWVzIGNhdXNlZCBiYWQgY29tcHJlc3NlZCBkYXRhCi0tIGZpeCBpbmZsYXRlIGJ1ZyB3aXRoIGVtcHR5IHN0b3JlZCBibG9jawotLSBmaXggTVNET1MgbWVkaXVtIG1vZGVsIHdoaWNoIHdhcyBicm9rZW4gaW4gMC45OQotLSBmaXggZGVmbGF0ZVBhcmFtcygpIHdoaWNoIGNvdWxkIGdlbmVyYXRlZCBiYWQgY29tcHJlc3NlZCBkYXRhLgotLSBCeXRlZiBpcyBkZWZpbmUnZCBpbnN0ZWFkIG9mIHR5cGVkZWYnZWQgKHdvcmsgYXJvdW5kIEJvcmxhbmQgYnVnKQotLSBhZGRlZCBhbiBJTkRFWCBmaWxlCi0tIG5ldyBtYWtlZmlsZXMgZm9yIERKR1BQIChNYWtlZmlsZS5kajIpLCAzMi1iaXQgQm9ybGFuZCAoTWFrZWZpbGUuYjMyKSwKLSAgV2F0Y29tIChNYWtlZmlsZS53YXQpLCBBbWlnYSBTQVMvQyAoTWFrZWZpbGUuc2FzKQotLSBzcGVlZCB1cCBhZGxlcjMyIGZvciBtb2Rlcm4gbWFjaGluZXMgd2l0aG91dCBhdXRvLWluY3JlbWVudAotLSBhZGRlZCAtYW5zaSBmb3IgSVJJWCBpbiBjb25maWd1cmUKLS0gc3RhdGljX2luaXRfZG9uZSBpbiB0cmVlcy5jIGlzIGFuIGludAotLSBkZWZpbmUgdW5saW5rIGFzIGRlbGV0ZSBmb3IgVk1TCi0tIGZpeCBjb25maWd1cmUgZm9yIFFOWAotLSBhZGQgY29uZmlndXJlIGJyYW5jaCBmb3IgU0NPIGFuZCBIUFVYCi0tIGF2b2lkIG1hbnkgd2FybmluZ3MgKHVudXNlZCB2YXJpYWJsZXMsIGRlYWQgYXNzaWdubWVudHMsIGV0Yy4uLikKLS0gbm8gZmRvcGVuIGZvciBCZU9TCi0tIGZpeCB0aGUgV2F0Y29tIGZpeCBmb3IgMzIgYml0IG1vZGUgKGRlZmluZSBGQVIgYXMgZW1wdHkpCi0tIHJlbW92ZWQgcmVkZWZpbml0aW9uIG9mIEJ5dGUgZm9yIE1LV0VSS1MKLS0gd29yayBhcm91bmQgYW4gTVdLRVJLUyBidWcgKGluY29ycmVjdCBtZXJnZSBvZiBhbGwgLmggZmlsZXMpCi0KLUNoYW5nZXMgaW4gMC45OSAoMjcgSmFuIDk2KQotLSBhbGxvdyBwcmVzZXQgZGljdGlvbmFyeSBzaGFyZWQgYmV0d2VlbiBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IKLS0gYWxsb3cgY29tcHJlc3Npb24gbGV2ZWwgMCAobm8gY29tcHJlc3Npb24pCi0tIGFkZCBkZWZsYXRlUGFyYW1zIGluIHpsaWIuaDogYWxsb3cgZHluYW1pYyBjaGFuZ2Ugb2YgY29tcHJlc3Npb24gbGV2ZWwKLSAgYW5kIGNvbXByZXNzaW9uIHN0cmF0ZWd5LgotLSB0ZXN0IGxhcmdlIGJ1ZmZlcnMgYW5kIGRlZmxhdGVQYXJhbXMgaW4gZXhhbXBsZS5jCi0tIGFkZCBvcHRpb25hbCAiY29uZmlndXJlIiB0byBidWlsZCB6bGliIGFzIGEgc2hhcmVkIGxpYnJhcnkKLS0gc3VwcHJlc3MgTWFrZWZpbGUucW54LCB1c2UgY29uZmlndXJlIGluc3RlYWQKLS0gZml4ZWQgZGVmbGF0ZSBmb3IgNjQtYml0IHN5c3RlbXMgKGRldGVjdGVkIG9uIENyYXkpCi0tIGZpeGVkIGluZmxhdGVfYmxvY2tzIGZvciA2NC1iaXQgc3lzdGVtcyAoZGV0ZWN0ZWQgb24gQWxwaGEpCi0tIGRlY2xhcmUgWl9ERUZMQVRFRCBpbiB6bGliLmggKHBvc3NpYmxlIHBhcmFtZXRlciBmb3IgZGVmbGF0ZUluaXQyKQotLSBhbHdheXMgcmV0dXJuIFpfQlVGX0VSUk9SIHdoZW4gZGVmbGF0ZSgpIGhhcyBub3RoaW5nIHRvIGRvCi0tIGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdCBhcmUgbm93IG1hY3JvcyB0byBhbGxvdyB2ZXJzaW9uIGNoZWNraW5nCi0tIHByZWZpeCBhbGwgZ2xvYmFsIGZ1bmN0aW9ucyBhbmQgdHlwZXMgd2l0aCB6XyB3aXRoIC1EWl9QUkVGSVgKLS0gbWFrZSBmYWxsb2MgY29tcGxldGVseSByZWVudHJhbnQgKGluZnRyZWVzLmMpCi0tIGZpeGVkIHZlcnkgdW5saWtlbHkgcmFjZSBjb25kaXRpb24gaW4gY3Rfc3RhdGljX2luaXQKLS0gZnJlZSBpbiByZXZlcnNlIG9yZGVyIG9mIGFsbG9jYXRpb24gdG8gaGVscCBtZW1vcnkgbWFuYWdlcgotLSB1c2UgemxpYi0xLjAvKiBpbnN0ZWFkIG9mIHpsaWIvKiBpbnNpZGUgdGhlIHRhci5negotLSBtYWtlIHpsaWIgd2FybmluZy1mcmVlIHdpdGggImdjYyAtTzMgLVdhbGwgLVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aAotICAtV2NvbnZlcnNpb24gLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyIKLS0gYWxsb3cgZ3pyZWFkIG9uIGNvbmNhdGVuYXRlZCAuZ3ogZmlsZXMKLS0gZGVmbGF0ZUVuZCBub3cgcmV0dXJucyBaX0RBVEFfRVJST1IgaWYgaXQgd2FzIHByZW1hdHVyZQotLSBkZWZsYXRlIGlzIGZpbmFsbHkgKD8pIGZ1bGx5IGRldGVybWluaXN0aWMgKG5vIG1hdGNoZXMgYmV5b25kIGVuZCBvZiBpbnB1dCkKLS0gRG9jdW1lbnQgWl9TWU5DX0ZMVVNICi0tIGFkZCB1bmluc3RhbGwgaW4gTWFrZWZpbGUKLS0gQ2hlY2sgZm9yIF9fY3BsdXBsdXMgaW4gemxpYi5oCi0tIEJldHRlciB0ZXN0IGluIGN0X2FsaWduIGZvciBwYXJ0aWFsIGZsdXNoCi0tIGF2b2lkIGhhcm1sZXNzIHdhcm5pbmdzIGZvciBCb3JsYW5kIEMrKwotLSBpbml0aWFsaXplIGhhc2hfaGVhZCBpbiBkZWZsYXRlLmMKLS0gYXZvaWQgd2FybmluZyBvbiBmZG9wZW4gKGd6aW8uYykgZm9yIEhQIGNjIC1BYQotLSBpbmNsdWRlIHN0ZGxpYi5oIGZvciBTVERDIGNvbXBpbGVycwotLSBpbmNsdWRlIGVycm5vLmggZm9yIENyYXkKLS0gaWdub3JlIGVycm9yIGlmIHJhbmxpYiBkb2Vzbid0IGV4aXN0Ci0tIGNhbGwgcmFubGliIHR3aWNlIGZvciBOZVhUU1RFUAotLSB1c2UgZXhlY19wcmVmaXggaW5zdGVhZCBvZiBwcmVmaXggZm9yIGxpYnouYQotLSByZW5hbWVkIGN0XyogYXMgX3RyXyogdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBhcHBsaWNhdGlvbnMKLS0gY2xlYXIgei0+bXNnIGluIGluZmxhdGVJbml0MiBiZWZvcmUgYW55IGVycm9yIHJldHVybgotLSBpbml0aWFsaXplIG9wYXF1ZSBpbiBleGFtcGxlLmMsIGd6aW8uYywgZGVmbGF0ZS5jIGFuZCBpbmZsYXRlLmMKLS0gZml4ZWQgdHlwbyBpbiB6Y29uZi5oIChfR05VQ19fID0+IF9fR05VQ19fKQotLSBjaGVjayBmb3IgV0lOMzIgaW4gemNvbmYuaCBhbmQgenV0aWwuYyAoYXZvaWQgZmFybWFsbG9jIGluIDMyLWJpdCBtb2RlKQotLSBmaXggdHlwbyBpbiBNYWtlX3Ztcy5jb20gKGYkdHJubG5tIC0+IGYkZ2V0c3lpKQotLSBpbiBmY2FsbG9jLCBub3JtYWxpemUgcG9pbnRlciBpZiBzaXplID4gNjU1MjAgYnl0ZXMKLS0gZG9uJ3QgdXNlIHNwZWNpYWwgZmNhbGxvYyBmb3IgMzIgYml0IEJvcmxhbmQgQysrCi0tIHVzZSBTVERDIGluc3RlYWQgb2YgX19HTzMyX18gdG8gYXZvaWQgcmVkZWNsYXJpbmcgZXhpdCwgY2FsbG9jLCBldGMuLi4KLS0gdXNlIFpfQklOQVJZIGluc3RlYWQgb2YgQklOQVJZCi0tIGRvY3VtZW50IHRoYXQgZ3pjbG9zZSBhZnRlciBnemRvcGVuIHdpbGwgY2xvc2UgdGhlIGZpbGUKLS0gYWxsb3cgImEiIGFzIG1vZGUgaW4gZ3pvcGVuLgotLSBmaXggZXJyb3IgY2hlY2tpbmcgaW4gZ3pyZWFkCi0tIGFsbG93IHNraXBwaW5nIC5neiBleHRyYS1maWVsZCBvbiBwaXBlcwotLSBhZGRlZCByZWZlcmVuY2UgdG8gUGVybCBpbnRlcmZhY2UgaW4gUkVBRE1FCi0tIHB1dCB0aGUgY3JjIHRhYmxlIGluIEZBUiBkYXRhIChJIGRpc2xpa2UgbW9yZSBhbmQgbW9yZSB0aGUgbWVkaXVtIG1vZGVsIDopCi0tIGFkZGVkIGdldF9jcmNfdGFibGUKLS0gYWRkZWQgYSBkaW1lbnNpb24gdG8gYWxsIGFycmF5cyAoQm9ybGFuZCBDIGNhbid0IGNvdW50KS4KLS0gd29ya2Fyb3VuZCBCb3JsYW5kIEMgYnVnIGluIGRlY2xhcmF0aW9uIG9mIGluZmxhdGVfY29kZXNfbmV3ICYgaW5mbGF0ZV9mYXN0Ci0tIGd1YXJkIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uIG9mICouaCAoZm9yIHByZWNvbXBpbGVkIGhlYWRlciBvbiBNYWMpCi0tIFdhdGNvbSBDIHByZXRlbmRzIHRvIGJlIE1pY3Jvc29mdCBDIHNtYWxsIG1vZGVsIGV2ZW4gaW4gMzIgYml0IG1vZGUuCi0tIGRvbid0IHVzZSB1bnNpemVkIGFycmF5cyB0byBhdm9pZCBzaWxseSB3YXJuaW5ncyBieSBWaXN1YWwgQysrOgotICAgICB3YXJuaW5nIEM0NzQ2OiAnaW5mbGF0ZV9tYXNrJyA6IHVuc2l6ZWQgYXJyYXkgdHJlYXRlZCBhcyAgJ19fZmFyJwotICAgICAod2hhdCdzIHdyb25nIHdpdGggZmFyIGRhdGEgaW4gZmFyIG1vZGVsPykuCi0tIGRlZmluZSBlbnVtIG91dCBvZiBpbmZsYXRlX2Jsb2Nrc19zdGF0ZSB0byBhbGxvdyBjb21waWxhdGlvbiB3aXRoIEMrKwotCi1DaGFuZ2VzIGluIDAuOTUgKDE2IEF1ZyA5NSkKLS0gZml4IE1TRE9TIHNtYWxsIGFuZCBtZWRpdW0gbW9kZWwgKG5vdyBlYXNpZXIgdG8gYWRhcHQgdG8gYW55IGNvbXBpbGVyKQotLSBpbmxpbmVkIHNlbmRfYml0cwotLSBmaXggdGhlIGZpbmFsICg6LSkgYnVnIGZvciBkZWZsYXRlIHdpdGggZmx1c2ggKG91dHB1dCB3YXMgY29ycmVjdCBidXQKLSAgbm90IGNvbXBsZXRlbHkgZmx1c2hlZCBpbiByYXJlIG9jY2FzaW9ucykuCi0tIGRlZmF1bHQgd2luZG93IHNpemUgaXMgc2FtZSBmb3IgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLSAgKGl0J3Mgbm93IHN1ZmZpY2llbnQgdG8gc2V0IE1BWF9XQklUUyBpbiB6Y29uZi5oKS4KLS0gdm9pZHAgLT4gdm9pZHBmIGFuZCB2b2lkbnAgLT4gdm9pZHAgKGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyCi0gIHR5cGVkZWZzIGFuZCBiZWNhdXNlIHZvaWRucCB3YXMgbm90IG5lYXIgaW4gbGFyZ2UgbW9kZWwpLgotCi1DaGFuZ2VzIGluIDAuOTQgKDEzIEF1ZyA5NSkKLS0gc3VwcG9ydCBNU0RPUyBtZWRpdW0gbW9kZWwKLS0gZml4IGRlZmxhdGUgd2l0aCBmbHVzaCAoY291bGQgc29tZXRpbWVzIGdlbmVyYXRlIGJhZCBvdXRwdXQpCi0tIGZpeCBkZWZsYXRlUmVzZXQgKHpsaWIgaGVhZGVyIHdhcyBpbmNvcnJlY3RseSBzdXBwcmVzc2VkKQotLSBhZGRlZCBzdXBwb3J0IGZvciBWTVMKLS0gYWxsb3cgYSBjb21wcmVzc2lvbiBsZXZlbCBpbiBnem9wZW4oKQotLSBnemZsdXNoIG5vdyBjYWxscyBmZmx1c2gKLS0gRm9yIGRlZmxhdGUgd2l0aCBmbHVzaCwgZmx1c2ggZXZlbiBpZiBubyBtb3JlIGlucHV0IGlzIHByb3ZpZGVkLgotLSByZW5hbWUgbGliZ3ouYSBhcyBsaWJ6LmEKLS0gYXZvaWQgY29tcGxleCBleHByZXNzaW9uIGluIGluZmNvZGVzLmMgdHJpZ2dlcmluZyBUdXJibyBDIGJ1ZwotLSB3b3JrIGFyb3VuZCBhIHByb2JsZW0gd2l0aCBnY2Mgb24gQWxwaGEgKGluIElOU0VSVF9TVFJJTkcpCi0tIGRvbid0IHVzZSBpbmxpbmUgZnVuY3Rpb25zIChwcm9ibGVtIHdpdGggc29tZSBnY2MgdmVyc2lvbnMpCi0tIGFsbG93IHJlbmFtaW5nIG9mIEJ5dGUsIHVJbnQsIGV0Yy4uLiB3aXRoICNkZWZpbmUuCi0tIGF2b2lkIHdhcm5pbmcgYWJvdXQgKHVudXNlZCkgcG9pbnRlciBiZWZvcmUgc3RhcnQgb2YgYXJyYXkgaW4gZGVmbGF0ZS5jCi0tIGF2b2lkIHZhcmlvdXMgd2FybmluZ3MgaW4gZ3ppby5jLCBleGFtcGxlLmMsIGluZmJsb2NrLmMsIGFkbGVyMzIuYywgenV0aWwuYwotLSBhdm9pZCByZXNlcnZlZCB3b3JkICduZXcnIGluIHRyZWVzLmMKLQotQ2hhbmdlcyBpbiAwLjkzICgyNSBKdW5lIDk1KQotLSB0ZW1wb3JhcmlseSBkaXNhYmxlIGlubGluZSBmdW5jdGlvbnMKLS0gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMKLS0gZ2l2ZSBlbm91Z2ggbG9va2FoZWFkIGZvciBQQVJUSUFMX0ZMVVNICi0tIFNldCBiaW5hcnkgbW9kZSBmb3Igc3RkaW4vc3Rkb3V0IGluIG1pbmlnemlwLmMgZm9yIE9TLzIKLS0gZG9uJ3QgZXZlbiB1c2Ugc2lnbmVkIGNoYXIgaW4gaW5mbGF0ZSAobm90IHBvcnRhYmxlIGVub3VnaCkKLS0gZml4IGluZmxhdGUgbWVtb3J5IGxlYWsgZm9yIHNlZ21lbnRlZCBhcmNoaXRlY3R1cmVzCi0KLUNoYW5nZXMgaW4gMC45MiAoMyBNYXkgOTUpCi0tIGRvbid0IGFzc3VtZSB0aGF0IGNoYXIgaXMgc2lnbmVkIChwcm9ibGVtIG9uIFNHSSkKLS0gQ2xlYXIgYml0IGJ1ZmZlciB3aGVuIHN0YXJ0aW5nIGEgc3RvcmVkIGJsb2NrCi0tIG5vIG1lbWNweSBvbiBQeXJhbWlkCi0tIHN1cHByZXNzZWQgaW5mdGVzdC5jCi0tIG9wdGltaXplZCBmaWxsX3dpbmRvdywgcHV0IGxvbmdlc3RfbWF0Y2ggaW5saW5lIGZvciBnY2MKLS0gb3B0aW1pemVkIGluZmxhdGUgb24gc3RvcmVkIGJsb2Nrcy4KLS0gdW50YWJpZnkgYWxsIHNvdXJjZXMgdG8gc2ltcGxpZnkgcGF0Y2hlcwotCi1DaGFuZ2VzIGluIDAuOTEgKDIgTWF5IDk1KQotLSBEZWZhdWx0IE1FTV9MRVZFTCBpcyA4IChub3QgOSBmb3IgVW5peCkgYXMgZG9jdW1lbnRlZCBpbiB6bGliLmgKLS0gRG9jdW1lbnQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgaW4gemNvbmYuaAotLSBhZGRlZCAibWFrZSBpbnN0YWxsIgotLSBmaXggc3luYyBzZWFyY2ggbG9naWMgaW4gaW5mbGF0ZVN5bmMKLS0gZGVmbGF0ZShaX0ZVTExfRkxVU0gpIG5vdyB3b3JrcyBldmVuIGlmIG91dHB1dCBidWZmZXIgdG9vIHNob3J0Ci0tIGFmdGVyIGluZmxhdGVTeW5jLCBkb24ndCBzY2FyZSBwZW9wbGUgd2l0aCBqdXN0ICJsbyB3b3JsZCIKLS0gYWRkZWQgc3VwcG9ydCBmb3IgREpHUFAKLQotQ2hhbmdlcyBpbiAwLjkgKDEgTWF5IDk1KQotLSBkb24ndCBhc3N1bWUgdGhhdCB6YWxsb2MgY2xlYXJzIHRoZSBhbGxvY2F0ZWQgbWVtb3J5ICh0aGUgVHVyYm9DIGJ1ZwotICB3YXMgTWFyaydzIGJ1ZyBhZnRlciBhbGwgOikKLS0gbGV0IGFnYWluIGd6cmVhZCBjb3B5IHVuY29tcHJlc3NlZCBkYXRhIHVuY2hhbmdlZCAod2FzIHdvcmtpbmcgaW4gMC43MSkKLS0gZGVmbGF0ZShaX0ZVTExfRkxVU0gpLCBpbmZsYXRlUmVzZXQgYW5kIGluZmxhdGVTeW5jIGFyZSBub3cgZnVsbHkgaW1wbGVtZW50ZWQKLS0gYWRkZWQgYSB0ZXN0IG9mIGluZmxhdGVTeW5jIGluIGV4YW1wbGUuYwotLSBtb3ZlZCBNQVhfV0JJVFMgdG8gemNvbmYuaCBiZWNhdXNlIHVzZXJzIG1pZ2h0IHdhbnQgdG8gY2hhbmdlIHRoYXQuCi0tIGRvY3VtZW50IGV4cGxpY2l0bHkgdGhhdCB6YWxsb2MoNjRLKSBvbiBNU0RPUyBtdXN0IHJldHVybiBhIG5vcm1hbGl6ZWQKLSAgcG9pbnRlciAoemVybyBvZmZzZXQpCi0tIGFkZGVkIE1ha2VmaWxlcyBmb3IgTWljcm9zb2Z0IEMsIFR1cmJvIEMsIEJvcmxhbmQgQysrCi0tIGZhc3RlciBjcmMzMigpCi0KLUNoYW5nZXMgaW4gMC44ICgyOSBBcHJpbCA5NSkKLS0gYWRkZWQgZmFzdCBpbmZsYXRlIChpbmZmYXN0LmMpCi0tIGRlZmxhdGUoWl9GSU5JU0gpIG5vdyByZXR1cm5zIFpfU1RSRUFNX0VORCB3aGVuIGRvbmUuIFdhcm5pbmc6IHRoaXMKLSAgaXMgaW5jb21wYXRpYmxlIHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YgemxpYiB3aGljaCByZXR1cm5lZCBaX09LLgotLSB3b3JrIGFyb3VuZCBhIFR1cmJvQyBjb21waWxlciBidWcgKGJhZCBjb2RlIGZvciBiIDw8IDAsIHNlZSBpbmZ1dGlsLmgpCi0gIChhY3R1YWxseSB0aGF0IHdhcyBub3QgYSBjb21waWxlciBidWcsIHNlZSAwLjgxIGFib3ZlKQotLSBnenJlYWQgbm8gbG9uZ2VyIHJlYWRzIG9uZSBleHRyYSBieXRlIGluIGNlcnRhaW4gY2FzZXMKLS0gSW4gZ3ppbyBkZXN0cm95KCksIGRvbid0IHJlZmVyZW5jZSBhIGZyZWVkIHN0cnVjdHVyZQotLSBhdm9pZCBtYW55IHdhcm5pbmdzIGZvciBNU0RPUwotLSBhdm9pZCB0aGUgRVJST1Igc3ltYm9sIHdoaWNoIGlzIHVzZWQgYnkgTVMgV2luZG93cwotCi1DaGFuZ2VzIGluIDAuNzEgKDE0IEFwcmlsIDk1KQotLSBGaXhlZCBtb3JlIE1TRE9TIGNvbXBpbGF0aW9uIHByb2JsZW1zIDooIFRoZXJlIGlzIHN0aWxsIGEgYnVnIHdpdGgKLSAgVHVyYm9DIGxhcmdlIG1vZGVsLgotCi1DaGFuZ2VzIGluIDAuNyAoMTQgQXByaWwgOTUpCi0tIEFkZGVkIGZ1bGwgaW5mbGF0ZSBzdXBwb3J0LgotLSBTaW1wbGlmaWVkIHRoZSBjcmMzMigpIGludGVyZmFjZS4gVGhlIHByZS0gYW5kIHBvc3QtY29uZGl0aW9uaW5nCi0gIChvbmUncyBjb21wbGVtZW50KSBpcyBub3cgZG9uZSBpbnNpZGUgY3JjMzIoKS4gV0FSTklORzogdGhpcyBpcwotICBpbmNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyB2ZXJzaW9uczsgc2VlIHpsaWIuaCBmb3IgdGhlIG5ldyB1c2FnZS4KLQotQ2hhbmdlcyBpbiAwLjYxICgxMiBBcHJpbCA5NSkKLS0gd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gVHVyYm9DLiBleGFtcGxlIGFuZCBtaW5pZ3ppcCBub3cgd29yayBvbiBNU0RPUy4KLQotQ2hhbmdlcyBpbiAwLjYgKDExIEFwcmlsIDk1KQotLSBhZGRlZCBtaW5pZ3ppcC5jCi0tIGFkZGVkIGd6ZG9wZW4gdG8gcmVvcGVuIGEgZmlsZSBkZXNjcmlwdG9yIGFzIGd6RmlsZQotLSBhZGRlZCB0cmFuc3BhcmVudCByZWFkaW5nIG9mIG5vbi1nemlwZWQgZmlsZXMgaW4gZ3pyZWFkLgotLSBmaXhlZCBidWcgaW4gZ3pyZWFkIChkb24ndCByZWFkIGNyYyBhcyBkYXRhKQotLSBmaXhlZCBidWcgaW4gZGVzdHJveSAoZ3ppby5jKSAoZG9uJ3QgcmV0dXJuIFpfU1RSRUFNX0VORCBmb3IgZ3pjbG9zZSkuCi0tIGRvbid0IGFsbG9jYXRlIGJpZyBhcnJheXMgaW4gdGhlIHN0YWNrIChmb3IgTVNET1MpCi0tIGZpeCBzb21lIE1TRE9TIGNvbXBpbGF0aW9uIHByb2JsZW1zCi0KLUNoYW5nZXMgaW4gMC41OgotLSBkbyByZWFsIGNvbXByZXNzaW9uIGluIGRlZmxhdGUuYy4gWl9QQVJUSUFMX0ZMVVNIIGlzIHN1cHBvcnRlZCBidXQKLSAgbm90IHlldCBaX0ZVTExfRkxVU0guCi0tIHN1cHBvcnQgZGVjb21wcmVzc2lvbiBidXQgb25seSBpbiBhIHNpbmdsZSBzdGVwIChmb3JjZWQgWl9GSU5JU0gpCi0tIGFkZGVkIG9wYXF1ZSBvYmplY3QgZm9yIHphbGxvYyBhbmQgemZyZWUuCi0tIGFkZGVkIGRlZmxhdGVSZXNldCBhbmQgaW5mbGF0ZVJlc2V0Ci0tIGFkZGVkIGEgdmFyaWFibGUgemxpYl92ZXJzaW9uIGZvciBjb25zaXN0ZW5jeSBjaGVja2luZy4KLS0gcmVuYW1lZCB0aGUgJ2ZpbHRlcicgcGFyYW1ldGVyIG9mIGRlZmxhdGVJbml0MiBhcyAnc3RyYXRlZ3knLgotICBBZGRlZCBaX0ZJTFRFUkVEIGFuZCBaX0hVRkZNQU5fT05MWSBjb25zdGFudHMuCi0KLUNoYW5nZXMgaW4gMC40OgotLSBhdm9pZCAiemlwIiBldmVyeXdoZXJlLCB1c2UgemxpYiBpbnN0ZWFkIG9mIHppcGxpYi4KLS0gc3VwcHJlc3MgWl9CTE9DS19GTFVTSCwgaW50ZXJwcmV0IFpfUEFSVElBTF9GTFVTSCBhcyBibG9jayBmbHVzaAotICBpZiBjb21wcmVzc2lvbiBtZXRob2QgPT0gOC4KLS0gYWRkZWQgYWRsZXIzMiBhbmQgY3JjMzIKLS0gcmVuYW1lZCBkZWZsYXRlT3B0aW9ucyBhcyBkZWZsYXRlSW5pdDIsIGNhbGwgb25lIG9yIHRoZSBvdGhlciBidXQgbm90IGJvdGgKLS0gYWRkZWQgdGhlIG1ldGhvZCBwYXJhbWV0ZXIgZm9yIGRlZmxhdGVJbml0Mi4KLS0gYWRkZWQgaW5mbGF0ZUluaXQyCi0tIHNpbXBsaWVkIGNvbnNpZGVyYWJseSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQgYnkgbm90IHN1cHBvcnRpbmcKLSAgdXNlci1wcm92aWRlZCBoaXN0b3J5IGJ1ZmZlci4gVGhpcyBpcyBzdXBwb3J0ZWQgb25seSBpbiBkZWZsYXRlSW5pdDIKLSAgYW5kIGluZmxhdGVJbml0Mi4KLQotQ2hhbmdlcyBpbiAwLjM6Ci0tIHByZWZpeCBhbGwgbWFjcm8gbmFtZXMgd2l0aCBaXwotLSB1c2UgWl9GSU5JU0ggaW5zdGVhZCBvZiBkZWZsYXRlRW5kIHRvIGZpbmlzaCBjb21wcmVzc2lvbi4KLS0gYWRkZWQgWl9IVUZGTUFOX09OTFkKLS0gYWRkZWQgZ3plcnJvcigpCmRpZmYgLS1naXQgYS9zcmMvemxpYi9GQVEgYi9zcmMvemxpYi9GQVEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YjdjZjkuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvRkFRCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLQotICAgICAgICAgICAgICAgIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIGFib3V0IHpsaWIKLQotCi1JZiB5b3VyIHF1ZXN0aW9uIGlzIG5vdCB0aGVyZSwgcGxlYXNlIGNoZWNrIHRoZSB6bGliIGhvbWUgcGFnZQotaHR0cDovL3psaWIubmV0LyB3aGljaCBtYXkgaGF2ZSBtb3JlIHJlY2VudCBpbmZvcm1hdGlvbi4KLVRoZSBsYXN0ZXN0IHpsaWIgRkFRIGlzIGF0IGh0dHA6Ly96bGliLm5ldC96bGliX2ZhcS5odG1sCi0KLQotIDEuIElzIHpsaWIgWTJLLWNvbXBsaWFudD8KLQotICAgIFllcy4gemxpYiBkb2Vzbid0IGhhbmRsZSBkYXRlcy4KLQotIDIuIFdoZXJlIGNhbiBJIGdldCBhIFdpbmRvd3MgRExMIHZlcnNpb24/Ci0KLSAgICBUaGUgemxpYiBzb3VyY2VzIGNhbiBiZSBjb21waWxlZCB3aXRob3V0IGNoYW5nZSB0byBwcm9kdWNlIGEgRExMLiAgU2VlIHRoZQotICAgIGZpbGUgd2luMzIvRExMX0ZBUS50eHQgaW4gdGhlIHpsaWIgZGlzdHJpYnV0aW9uLiAgUG9pbnRlcnMgdG8gdGhlCi0gICAgcHJlY29tcGlsZWQgRExMIGFyZSBmb3VuZCBpbiB0aGUgemxpYiB3ZWIgc2l0ZSBhdCBodHRwOi8vemxpYi5uZXQvIC4KLQotIDMuIFdoZXJlIGNhbiBJIGdldCBhIFZpc3VhbCBCYXNpYyBpbnRlcmZhY2UgdG8gemxpYj8KLQotICAgIFNlZQotICAgICAgICAqIGh0dHA6Ly9tYXJrbmVsc29uLnVzLzE5OTcvMDEvMDEvemxpYi1lbmdpbmUvCi0gICAgICAgICogd2luMzIvRExMX0ZBUS50eHQgaW4gdGhlIHpsaWIgZGlzdHJpYnV0aW9uCi0KLSA0LiBjb21wcmVzcygpIHJldHVybnMgWl9CVUZfRVJST1IuCi0KLSAgICBNYWtlIHN1cmUgdGhhdCBiZWZvcmUgdGhlIGNhbGwgb2YgY29tcHJlc3MoKSwgdGhlIGxlbmd0aCBvZiB0aGUgY29tcHJlc3NlZAotICAgIGJ1ZmZlciBpcyBlcXVhbCB0byB0aGUgYXZhaWxhYmxlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyIGFuZCBub3QKLSAgICB6ZXJvLiAgRm9yIFZpc3VhbCBCYXNpYywgY2hlY2sgdGhhdCB0aGlzIHBhcmFtZXRlciBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlCi0gICAgKCJhcyBhbnkiKSwgbm90IGJ5IHZhbHVlICgiYXMgbG9uZyIpLgotCi0gNS4gZGVmbGF0ZSgpIG9yIGluZmxhdGUoKSByZXR1cm5zIFpfQlVGX0VSUk9SLgotCi0gICAgQmVmb3JlIG1ha2luZyB0aGUgY2FsbCwgbWFrZSBzdXJlIHRoYXQgYXZhaWxfaW4gYW5kIGF2YWlsX291dCBhcmUgbm90IHplcm8uCi0gICAgV2hlbiBzZXR0aW5nIHRoZSBwYXJhbWV0ZXIgZmx1c2ggZXF1YWwgdG8gWl9GSU5JU0gsIGFsc28gbWFrZSBzdXJlIHRoYXQKLSAgICBhdmFpbF9vdXQgaXMgYmlnIGVub3VnaCB0byBhbGxvdyBwcm9jZXNzaW5nIGFsbCBwZW5kaW5nIGlucHV0LiAgTm90ZSB0aGF0IGEKLSAgICBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwtLWFub3RoZXIgY2FsbCB0byBkZWZsYXRlKCkgb3IgaW5mbGF0ZSgpIGNhbiBiZQotICAgIG1hZGUgd2l0aCBtb3JlIGlucHV0IG9yIG91dHB1dCBzcGFjZS4gIEEgWl9CVUZfRVJST1IgbWF5IGluIGZhY3QgYmUKLSAgICB1bmF2b2lkYWJsZSBkZXBlbmRpbmcgb24gaG93IHRoZSBmdW5jdGlvbnMgYXJlIHVzZWQsIHNpbmNlIGl0IGlzIG5vdAotICAgIHBvc3NpYmxlIHRvIHRlbGwgd2hldGhlciBvciBub3QgdGhlcmUgaXMgbW9yZSBvdXRwdXQgcGVuZGluZyB3aGVuCi0gICAgc3RybS5hdmFpbF9vdXQgcmV0dXJucyB3aXRoIHplcm8uICBTZWUgaHR0cDovL3psaWIubmV0L3psaWJfaG93Lmh0bWwgZm9yIGEKLSAgICBoZWF2aWx5IGFubm90YXRlZCBleGFtcGxlLgotCi0gNi4gV2hlcmUncyB0aGUgemxpYiBkb2N1bWVudGF0aW9uIChtYW4gcGFnZXMsIGV0Yy4pPwotCi0gICAgSXQncyBpbiB6bGliLmggLiAgRXhhbXBsZXMgb2YgemxpYiB1c2FnZSBhcmUgaW4gdGhlIGZpbGVzIHRlc3QvZXhhbXBsZS5jCi0gICAgYW5kIHRlc3QvbWluaWd6aXAuYywgd2l0aCBtb3JlIGluIGV4YW1wbGVzLyAuCi0KLSA3LiBXaHkgZG9uJ3QgeW91IHVzZSBHTlUgYXV0b2NvbmYgb3IgbGlidG9vbCBvciAuLi4/Ci0KLSAgICBCZWNhdXNlIHdlIHdvdWxkIGxpa2UgdG8ga2VlcCB6bGliIGFzIGEgdmVyeSBzbWFsbCBhbmQgc2ltcGxlIHBhY2thZ2UuCi0gICAgemxpYiBpcyByYXRoZXIgcG9ydGFibGUgYW5kIGRvZXNuJ3QgbmVlZCBtdWNoIGNvbmZpZ3VyYXRpb24uCi0KLSA4LiBJIGZvdW5kIGEgYnVnIGluIHpsaWIuCi0KLSAgICBNb3N0IG9mIHRoZSB0aW1lLCBzdWNoIHByb2JsZW1zIGFyZSBkdWUgdG8gYW4gaW5jb3JyZWN0IHVzYWdlIG9mIHpsaWIuCi0gICAgUGxlYXNlIHRyeSB0byByZXByb2R1Y2UgdGhlIHByb2JsZW0gd2l0aCBhIHNtYWxsIHByb2dyYW0gYW5kIHNlbmQgdGhlCi0gICAgY29ycmVzcG9uZGluZyBzb3VyY2UgdG8gdXMgYXQgemxpYkBnemlwLm9yZyAuICBEbyBub3Qgc2VuZCBtdWx0aS1tZWdhYnl0ZQotICAgIGRhdGEgZmlsZXMgd2l0aG91dCBwcmlvciBhZ3JlZW1lbnQuCi0KLSA5LiBXaHkgZG8gSSBnZXQgInVuZGVmaW5lZCByZWZlcmVuY2UgdG8gZ3pwdXRjIj8KLQotICAgIElmICJtYWtlIHRlc3QiIHByb2R1Y2VzIHNvbWV0aGluZyBsaWtlCi0KLSAgICAgICBleGFtcGxlLm8oLnRleHQrMHgxNTQpOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGBnenB1dGMnCi0KLSAgICBjaGVjayB0aGF0IHlvdSBkb24ndCBoYXZlIG9sZCBmaWxlcyBsaWJ6LiogaW4gL3Vzci9saWIsIC91c3IvbG9jYWwvbGliIG9yCi0gICAgL3Vzci9YMTFSNi9saWIuIFJlbW92ZSBhbnkgb2xkIHZlcnNpb25zLCB0aGVuIGRvICJtYWtlIGluc3RhbGwiLgotCi0xMC4gSSBuZWVkIGEgRGVscGhpIGludGVyZmFjZSB0byB6bGliLgotCi0gICAgU2VlIHRoZSBjb250cmliL2RlbHBoaSBkaXJlY3RvcnkgaW4gdGhlIHpsaWIgZGlzdHJpYnV0aW9uLgotCi0xMS4gQ2FuIHpsaWIgaGFuZGxlIC56aXAgYXJjaGl2ZXM/Ci0KLSAgICBOb3QgYnkgaXRzZWxmLCBuby4gIFNlZSB0aGUgZGlyZWN0b3J5IGNvbnRyaWIvbWluaXppcCBpbiB0aGUgemxpYgotICAgIGRpc3RyaWJ1dGlvbi4KLQotMTIuIENhbiB6bGliIGhhbmRsZSAuWiBmaWxlcz8KLQotICAgIE5vLCBzb3JyeS4gIFlvdSBoYXZlIHRvIHNwYXduIGFuIHVuY29tcHJlc3Mgb3IgZ3VuemlwIHN1YnByb2Nlc3MsIG9yIGFkYXB0Ci0gICAgdGhlIGNvZGUgb2YgdW5jb21wcmVzcyBvbiB5b3VyIG93bi4KLQotMTMuIEhvdyBjYW4gSSBtYWtlIGEgVW5peCBzaGFyZWQgbGlicmFyeT8KLQotICAgIEJ5IGRlZmF1bHQgYSBzaGFyZWQgKGFuZCBhIHN0YXRpYykgbGlicmFyeSBpcyBidWlsdCBmb3IgVW5peC4gIFNvOgotCi0gICAgbWFrZSBkaXN0Y2xlYW4KLSAgICAuL2NvbmZpZ3VyZQotICAgIG1ha2UKLQotMTQuIEhvdyBkbyBJIGluc3RhbGwgYSBzaGFyZWQgemxpYiBsaWJyYXJ5IG9uIFVuaXg/Ci0KLSAgICBBZnRlciB0aGUgYWJvdmUsIHRoZW46Ci0KLSAgICBtYWtlIGluc3RhbGwKLQotICAgIEhvd2V2ZXIsIG1hbnkgZmxhdm9ycyBvZiBVbml4IGNvbWUgd2l0aCBhIHNoYXJlZCB6bGliIGFscmVhZHkgaW5zdGFsbGVkLgotICAgIEJlZm9yZSBnb2luZyB0byB0aGUgdHJvdWJsZSBvZiBjb21waWxpbmcgYSBzaGFyZWQgdmVyc2lvbiBvZiB6bGliIGFuZAotICAgIHRyeWluZyB0byBpbnN0YWxsIGl0LCB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgaWYgaXQncyBhbHJlYWR5IHRoZXJlISAgSWYgeW91Ci0gICAgY2FuICNpbmNsdWRlIDx6bGliLmg+LCBpdCdzIHRoZXJlLiAgVGhlIC1seiBvcHRpb24gd2lsbCBwcm9iYWJseSBsaW5rIHRvCi0gICAgaXQuICBZb3UgY2FuIGNoZWNrIHRoZSB2ZXJzaW9uIGF0IHRoZSB0b3Agb2YgemxpYi5oIG9yIHdpdGggdGhlCi0gICAgWkxJQl9WRVJTSU9OIHN5bWJvbCBkZWZpbmVkIGluIHpsaWIuaCAuCi0KLTE1LiBJIGhhdmUgYSBxdWVzdGlvbiBhYm91dCBPdHRvUERGLgotCi0gICAgV2UgYXJlIG5vdCB0aGUgYXV0aG9ycyBvZiBPdHRvUERGLiBUaGUgcmVhbCBhdXRob3IgaXMgb24gdGhlIE90dG9QREYgd2ViCi0gICAgc2l0ZTogSm9lbCBIYWlubGV5LCBqaGFpbmxleUBteW5ka3J5bWUuY29tLgotCi0xNi4gQ2FuIHpsaWIgZGVjb2RlIEZsYXRlIGRhdGEgaW4gYW4gQWRvYmUgUERGIGZpbGU/Ci0KLSAgICBZZXMuIFNlZSBodHRwOi8vd3d3LnBkZmxpYi5jb20vIC4gVG8gbW9kaWZ5IFBERiBmb3Jtcywgc2VlCi0gICAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9hY3JvZm9ybXRvb2wvIC4KLQotMTcuIFdoeSBhbSBJIGdldHRpbmcgdGhpcyAicmVnaXN0ZXJfZnJhbWVfaW5mbyBub3QgZm91bmQiIGVycm9yIG9uIFNvbGFyaXM/Ci0KLSAgICBBZnRlciBpbnN0YWxsaW5nIHpsaWIgMS4xLjQgb24gU29sYXJpcyAyLjYsIHJ1bm5pbmcgYXBwbGljYXRpb25zIHVzaW5nIHpsaWIKLSAgICBnZW5lcmF0ZXMgYW4gZXJyb3Igc3VjaCBhczoKLQotICAgICAgICBsZC5zby4xOiBycG06IGZhdGFsOiByZWxvY2F0aW9uIGVycm9yOiBmaWxlIC91c3IvbG9jYWwvbGliL2xpYnouc286Ci0gICAgICAgIHN5bWJvbCBfX3JlZ2lzdGVyX2ZyYW1lX2luZm86IHJlZmVyZW5jZWQgc3ltYm9sIG5vdCBmb3VuZAotCi0gICAgVGhlIHN5bWJvbCBfX3JlZ2lzdGVyX2ZyYW1lX2luZm8gaXMgbm90IHBhcnQgb2YgemxpYiwgaXQgaXMgZ2VuZXJhdGVkIGJ5Ci0gICAgdGhlIEMgY29tcGlsZXIgKGNjIG9yIGdjYykuICBZb3UgbXVzdCByZWNvbXBpbGUgYXBwbGljYXRpb25zIHVzaW5nIHpsaWIKLSAgICB3aGljaCBoYXZlIHRoaXMgcHJvYmxlbS4gIFRoaXMgcHJvYmxlbSBpcyBzcGVjaWZpYyB0byBTb2xhcmlzLiAgU2VlCi0gICAgaHR0cDovL3d3dy5zdW5mcmVld2FyZS5jb20gZm9yIFNvbGFyaXMgdmVyc2lvbnMgb2YgemxpYiBhbmQgYXBwbGljYXRpb25zCi0gICAgdXNpbmcgemxpYi4KLQotMTguIFdoeSBkb2VzIGd6aXAgZ2l2ZSBhbiBlcnJvciBvbiBhIGZpbGUgSSBtYWtlIHdpdGggY29tcHJlc3MvZGVmbGF0ZT8KLQotICAgIFRoZSBjb21wcmVzcyBhbmQgZGVmbGF0ZSBmdW5jdGlvbnMgcHJvZHVjZSBkYXRhIGluIHRoZSB6bGliIGZvcm1hdCwgd2hpY2gKLSAgICBpcyBkaWZmZXJlbnQgYW5kIGluY29tcGF0aWJsZSB3aXRoIHRoZSBnemlwIGZvcm1hdC4gIFRoZSBneiogZnVuY3Rpb25zIGluCi0gICAgemxpYiBvbiB0aGUgb3RoZXIgaGFuZCB1c2UgdGhlIGd6aXAgZm9ybWF0LiAgQm90aCB0aGUgemxpYiBhbmQgZ3ppcCBmb3JtYXRzCi0gICAgdXNlIHRoZSBzYW1lIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgaW50ZXJuYWxseSwgYnV0IGhhdmUgZGlmZmVyZW50IGhlYWRlcnMKLSAgICBhbmQgdHJhaWxlcnMgYXJvdW5kIHRoZSBjb21wcmVzc2VkIGRhdGEuCi0KLTE5LiBPaywgc28gd2h5IGFyZSB0aGVyZSB0d28gZGlmZmVyZW50IGZvcm1hdHM/Ci0KLSAgICBUaGUgZ3ppcCBmb3JtYXQgd2FzIGRlc2lnbmVkIHRvIHJldGFpbiB0aGUgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGFib3V0IGEKLSAgICBzaW5nbGUgZmlsZSwgc3VjaCBhcyB0aGUgbmFtZSBhbmQgbGFzdCBtb2RpZmljYXRpb24gZGF0ZS4gIFRoZSB6bGliIGZvcm1hdAotICAgIG9uIHRoZSBvdGhlciBoYW5kIHdhcyBkZXNpZ25lZCBmb3IgaW4tbWVtb3J5IGFuZCBjb21tdW5pY2F0aW9uIGNoYW5uZWwKLSAgICBhcHBsaWNhdGlvbnMsIGFuZCBoYXMgYSBtdWNoIG1vcmUgY29tcGFjdCBoZWFkZXIgYW5kIHRyYWlsZXIgYW5kIHVzZXMgYQotICAgIGZhc3RlciBpbnRlZ3JpdHkgY2hlY2sgdGhhbiBnemlwLgotCi0yMC4gV2VsbCB0aGF0J3MgbmljZSwgYnV0IGhvdyBkbyBJIG1ha2UgYSBnemlwIGZpbGUgaW4gbWVtb3J5PwotCi0gICAgWW91IGNhbiByZXF1ZXN0IHRoYXQgZGVmbGF0ZSB3cml0ZSB0aGUgZ3ppcCBmb3JtYXQgaW5zdGVhZCBvZiB0aGUgemxpYgotICAgIGZvcm1hdCB1c2luZyBkZWZsYXRlSW5pdDIoKS4gIFlvdSBjYW4gYWxzbyByZXF1ZXN0IHRoYXQgaW5mbGF0ZSBkZWNvZGUgdGhlCi0gICAgZ3ppcCBmb3JtYXQgdXNpbmcgaW5mbGF0ZUluaXQyKCkuICBSZWFkIHpsaWIuaCBmb3IgbW9yZSBkZXRhaWxzLgotCi0yMS4gSXMgemxpYiB0aHJlYWQtc2FmZT8KLQotICAgIFllcy4gIEhvd2V2ZXIgYW55IGxpYnJhcnkgcm91dGluZXMgdGhhdCB6bGliIHVzZXMgYW5kIGFueSBhcHBsaWNhdGlvbi0KLSAgICBwcm92aWRlZCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyBtdXN0IGFsc28gYmUgdGhyZWFkLXNhZmUuICB6bGliJ3MgZ3oqCi0gICAgZnVuY3Rpb25zIHVzZSBzdGRpbyBsaWJyYXJ5IHJvdXRpbmVzLCBhbmQgbW9zdCBvZiB6bGliJ3MgZnVuY3Rpb25zIHVzZSB0aGUKLSAgICBsaWJyYXJ5IG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIGJ5IGRlZmF1bHQuICB6bGliJ3MgKkluaXQqIGZ1bmN0aW9ucwotICAgIGFsbG93IGZvciB0aGUgYXBwbGljYXRpb24gdG8gcHJvdmlkZSBjdXN0b20gbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCi0KLSAgICBPZiBjb3Vyc2UsIHlvdSBzaG91bGQgb25seSBvcGVyYXRlIG9uIGFueSBnaXZlbiB6bGliIG9yIGd6aXAgc3RyZWFtIGZyb20gYQotICAgIHNpbmdsZSB0aHJlYWQgYXQgYSB0aW1lLgotCi0yMi4gQ2FuIEkgdXNlIHpsaWIgaW4gbXkgY29tbWVyY2lhbCBhcHBsaWNhdGlvbj8KLQotICAgIFllcy4gIFBsZWFzZSByZWFkIHRoZSBsaWNlbnNlIGluIHpsaWIuaC4KLQotMjMuIElzIHpsaWIgdW5kZXIgdGhlIEdOVSBsaWNlbnNlPwotCi0gICAgTm8uICBQbGVhc2UgcmVhZCB0aGUgbGljZW5zZSBpbiB6bGliLmguCi0KLTI0LiBUaGUgbGljZW5zZSBzYXlzIHRoYXQgYWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSAicGxhaW5seSBtYXJrZWQiLiBTbwotICAgIHdoYXQgZXhhY3RseSBkbyBJIG5lZWQgdG8gZG8gdG8gbWVldCB0aGF0IHJlcXVpcmVtZW50PwotCi0gICAgWW91IG5lZWQgdG8gY2hhbmdlIHRoZSBaTElCX1ZFUlNJT04gYW5kIFpMSUJfVkVSTlVNICNkZWZpbmVzIGluIHpsaWIuaC4gIEluCi0gICAgcGFydGljdWxhciwgdGhlIGZpbmFsIHZlcnNpb24gbnVtYmVyIG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gImYiLCBhbmQgYW4KLSAgICBpZGVudGlmaWNhdGlvbiBzdHJpbmcgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIFpMSUJfVkVSU0lPTi4gIFZlcnNpb24gbnVtYmVycwotICAgIHgueC54LmYgYXJlIHJlc2VydmVkIGZvciBtb2RpZmljYXRpb25zIHRvIHpsaWIgYnkgb3RoZXJzIHRoYW4gdGhlIHpsaWIKLSAgICBtYWludGFpbmVycy4gIEZvciBleGFtcGxlLCBpZiB0aGUgdmVyc2lvbiBvZiB0aGUgYmFzZSB6bGliIHlvdSBhcmUgYWx0ZXJpbmcKLSAgICBpcyAiMS4yLjMuNCIsIHRoZW4gaW4gemxpYi5oIHlvdSBzaG91bGQgY2hhbmdlIFpMSUJfVkVSTlVNIHRvIDB4MTIzZiwgYW5kCi0gICAgWkxJQl9WRVJTSU9OIHRvIHNvbWV0aGluZyBsaWtlICIxLjIuMy5mLXphY2hhcnktbW9kcy12MyIuICBZb3UgY2FuIGFsc28KLSAgICB1cGRhdGUgdGhlIHZlcnNpb24gc3RyaW5ncyBpbiBkZWZsYXRlLmMgYW5kIGluZnRyZWVzLmMuCi0KLSAgICBGb3IgYWx0ZXJlZCBzb3VyY2UgZGlzdHJpYnV0aW9ucywgeW91IHNob3VsZCBhbHNvIG5vdGUgdGhlIG9yaWdpbiBhbmQKLSAgICBuYXR1cmUgb2YgdGhlIGNoYW5nZXMgaW4gemxpYi5oLCBhcyB3ZWxsIGFzIGluIENoYW5nZUxvZyBhbmQgUkVBRE1FLCBhbG9uZwotICAgIHdpdGggdGhlIGRhdGVzIG9mIHRoZSBhbHRlcmF0aW9ucy4gIFRoZSBvcmlnaW4gc2hvdWxkIGluY2x1ZGUgYXQgbGVhc3QgeW91cgotICAgIG5hbWUgKG9yIHlvdXIgY29tcGFueSdzIG5hbWUpLCBhbmQgYW4gZW1haWwgYWRkcmVzcyB0byBjb250YWN0IGZvciBoZWxwIG9yCi0gICAgaXNzdWVzIHdpdGggdGhlIGxpYnJhcnkuCi0KLSAgICBOb3RlIHRoYXQgZGlzdHJpYnV0aW5nIGEgY29tcGlsZWQgemxpYiBsaWJyYXJ5IGFsb25nIHdpdGggemxpYi5oIGFuZAotICAgIHpjb25mLmggaXMgYWxzbyBhIHNvdXJjZSBkaXN0cmlidXRpb24sIGFuZCBzbyB5b3Ugc2hvdWxkIGNoYW5nZQotICAgIFpMSUJfVkVSU0lPTiBhbmQgWkxJQl9WRVJOVU0gYW5kIG5vdGUgdGhlIG9yaWdpbiBhbmQgbmF0dXJlIG9mIHRoZSBjaGFuZ2VzCi0gICAgaW4gemxpYi5oIGFzIHlvdSB3b3VsZCBmb3IgYSBmdWxsIHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLTI1LiBXaWxsIHpsaWIgd29yayBvbiBhIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbiBhcmNoaXRlY3R1cmUsIGFuZCBjYW4gSQotICAgIGV4Y2hhbmdlIGNvbXByZXNzZWQgZGF0YSBiZXR3ZWVuIHRoZW0/Ci0KLSAgICBZZXMgYW5kIHllcy4KLQotMjYuIFdpbGwgemxpYiB3b3JrIG9uIGEgNjQtYml0IG1hY2hpbmU/Ci0KLSAgICBZZXMuICBJdCBoYXMgYmVlbiB0ZXN0ZWQgb24gNjQtYml0IG1hY2hpbmVzLCBhbmQgaGFzIG5vIGRlcGVuZGVuY2Ugb24gYW55Ci0gICAgZGF0YSB0eXBlcyBiZWluZyBsaW1pdGVkIHRvIDMyLWJpdHMgaW4gbGVuZ3RoLiAgSWYgeW91IGhhdmUgYW55Ci0gICAgZGlmZmljdWx0aWVzLCBwbGVhc2UgcHJvdmlkZSBhIGNvbXBsZXRlIHByb2JsZW0gcmVwb3J0IHRvIHpsaWJAZ3ppcC5vcmcKLQotMjcuIFdpbGwgemxpYiBkZWNvbXByZXNzIGRhdGEgZnJvbSB0aGUgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeT8KLQotICAgIE5vLiAgVGhlIFBLV2FyZSBEQ0wgdXNlcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgdGhhbgotICAgIGRvZXMgUEtaSVAgYW5kIHpsaWIuICBIb3dldmVyLCB5b3UgY2FuIGxvb2sgaW4gemxpYidzIGNvbnRyaWIvYmxhc3QKLSAgICBkaXJlY3RvcnkgZm9yIGEgcG9zc2libGUgc29sdXRpb24gdG8geW91ciBwcm9ibGVtLgotCi0yOC4gQ2FuIEkgYWNjZXNzIGRhdGEgcmFuZG9tbHkgaW4gYSBjb21wcmVzc2VkIHN0cmVhbT8KLQotICAgIE5vLCBub3Qgd2l0aG91dCBzb21lIHByZXBhcmF0aW9uLiAgSWYgd2hlbiBjb21wcmVzc2luZyB5b3UgcGVyaW9kaWNhbGx5IHVzZQotICAgIFpfRlVMTF9GTFVTSCwgY2FyZWZ1bGx5IHdyaXRlIGFsbCB0aGUgcGVuZGluZyBkYXRhIGF0IHRob3NlIHBvaW50cywgYW5kCi0gICAga2VlcCBhbiBpbmRleCBvZiB0aG9zZSBsb2NhdGlvbnMsIHRoZW4geW91IGNhbiBzdGFydCBkZWNvbXByZXNzaW9uIGF0IHRob3NlCi0gICAgcG9pbnRzLiAgWW91IGhhdmUgdG8gYmUgY2FyZWZ1bCB0byBub3QgdXNlIFpfRlVMTF9GTFVTSCB0b28gb2Z0ZW4sIHNpbmNlIGl0Ci0gICAgY2FuIHNpZ25pZmljYW50bHkgZGVncmFkZSBjb21wcmVzc2lvbi4gIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc2NhbiBhCi0gICAgZGVmbGF0ZSBzdHJlYW0gb25jZSB0byBnZW5lcmF0ZSBhbiBpbmRleCwgYW5kIHRoZW4gdXNlIHRoYXQgaW5kZXggZm9yCi0gICAgcmFuZG9tIGFjY2Vzcy4gIFNlZSBleGFtcGxlcy96cmFuLmMgLgotCi0yOS4gRG9lcyB6bGliIHdvcmsgb24gTVZTLCBPUy8zOTAsIENJQ1MsIGV0Yy4/Ci0KLSAgICBJdCBoYXMgaW4gdGhlIHBhc3QsIGJ1dCB3ZSBoYXZlIG5vdCBoZWFyZCBvZiBhbnkgcmVjZW50IGV2aWRlbmNlLiAgVGhlcmUKLSAgICB3ZXJlIHdvcmtpbmcgcG9ydHMgb2YgemxpYiAxLjEuNCB0byBNVlMsIGJ1dCB0aG9zZSBsaW5rcyBubyBsb25nZXIgd29yay4KLSAgICBJZiB5b3Uga25vdyBvZiByZWNlbnQsIHN1Y2Nlc3NmdWwgYXBwbGljYXRpb25zIG9mIHpsaWIgb24gdGhlc2Ugb3BlcmF0aW5nCi0gICAgc3lzdGVtcywgcGxlYXNlIGxldCB1cyBrbm93LiAgVGhhbmtzLgotCi0zMC4gSXMgdGhlcmUgc29tZSBzaW1wbGVyLCBlYXNpZXIgdG8gcmVhZCB2ZXJzaW9uIG9mIGluZmxhdGUgSSBjYW4gbG9vayBhdCB0bwotICAgIHVuZGVyc3RhbmQgdGhlIGRlZmxhdGUgZm9ybWF0PwotCi0gICAgRmlyc3Qgb2ZmLCB5b3Ugc2hvdWxkIHJlYWQgUkZDIDE5NTEuICBTZWNvbmQsIHllcy4gIExvb2sgaW4gemxpYidzCi0gICAgY29udHJpYi9wdWZmIGRpcmVjdG9yeS4KLQotMzEuIERvZXMgemxpYiBpbmZyaW5nZSBvbiBhbnkgcGF0ZW50cz8KLQotICAgIEFzIGZhciBhcyB3ZSBrbm93LCBuby4gIEluIGZhY3QsIHRoYXQgd2FzIG9yaWdpbmFsbHkgdGhlIHdob2xlIHBvaW50IGJlaGluZAotICAgIHpsaWIuICBMb29rIGhlcmUgZm9yIHNvbWUgbW9yZSBpbmZvcm1hdGlvbjoKLQotICAgIGh0dHA6Ly93d3cuZ3ppcC5vcmcvI2ZhcTExCi0KLTMyLiBDYW4gemxpYiB3b3JrIHdpdGggZ3JlYXRlciB0aGFuIDQgR0Igb2YgZGF0YT8KLQotICAgIFllcy4gIGluZmxhdGUoKSBhbmQgZGVmbGF0ZSgpIHdpbGwgcHJvY2VzcyBhbnkgYW1vdW50IG9mIGRhdGEgY29ycmVjdGx5LgotICAgIEVhY2ggY2FsbCBvZiBpbmZsYXRlKCkgb3IgZGVmbGF0ZSgpIGlzIGxpbWl0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCBjaHVua3MKLSAgICBvZiB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gdGhlIGNvbXBpbGVyJ3MgInVuc2lnbmVkIGludCIKLSAgICB0eXBlLCBidXQgdGhlcmUgaXMgbm8gbGltaXQgdG8gdGhlIG51bWJlciBvZiBjaHVua3MuICBOb3RlIGhvd2V2ZXIgdGhhdCB0aGUKLSAgICBzdHJtLnRvdGFsX2luIGFuZCBzdHJtX3RvdGFsX291dCBjb3VudGVycyBtYXkgYmUgbGltaXRlZCB0byA0IEdCLiAgVGhlc2UKLSAgICBjb3VudGVycyBhcmUgcHJvdmlkZWQgYXMgYSBjb252ZW5pZW5jZSBhbmQgYXJlIG5vdCB1c2VkIGludGVybmFsbHkgYnkKLSAgICBpbmZsYXRlKCkgb3IgZGVmbGF0ZSgpLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiBlYXNpbHkgc2V0IHVwIGl0cyBvd24gY291bnRlcnMKLSAgICB1cGRhdGVkIGFmdGVyIGVhY2ggY2FsbCBvZiBpbmZsYXRlKCkgb3IgZGVmbGF0ZSgpIHRvIGNvdW50IGJleW9uZCA0IEdCLgotICAgIGNvbXByZXNzKCkgYW5kIHVuY29tcHJlc3MoKSBtYXkgYmUgbGltaXRlZCB0byA0IEdCLCBzaW5jZSB0aGV5IG9wZXJhdGUgaW4gYQotICAgIHNpbmdsZSBjYWxsLiAgZ3pzZWVrKCkgYW5kIGd6dGVsbCgpIG1heSBiZSBsaW1pdGVkIHRvIDQgR0IgZGVwZW5kaW5nIG9uIGhvdwotICAgIHpsaWIgaXMgY29tcGlsZWQuICBTZWUgdGhlIHpsaWJDb21waWxlRmxhZ3MoKSBmdW5jdGlvbiBpbiB6bGliLmguCi0KLSAgICBUaGUgd29yZCAibWF5IiBhcHBlYXJzIHNldmVyYWwgdGltZXMgYWJvdmUgc2luY2UgdGhlcmUgaXMgYSA0IEdCIGxpbWl0IG9ubHkKLSAgICBpZiB0aGUgY29tcGlsZXIncyAibG9uZyIgdHlwZSBpcyAzMiBiaXRzLiAgSWYgdGhlIGNvbXBpbGVyJ3MgImxvbmciIHR5cGUgaXMKLSAgICA2NCBiaXRzLCB0aGVuIHRoZSBsaW1pdCBpcyAxNiBleGFieXRlcy4KLQotMzMuIERvZXMgemxpYiBoYXZlIGFueSBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXM/Ci0KLSAgICBUaGUgb25seSBvbmUgdGhhdCB3ZSBhcmUgYXdhcmUgb2YgaXMgcG90ZW50aWFsbHkgaW4gZ3pwcmludGYoKS4gIElmIHpsaWIgaXMKLSAgICBjb21waWxlZCB0byB1c2Ugc3ByaW50ZigpIG9yIHZzcHJpbnRmKCksIHRoZW4gdGhlcmUgaXMgbm8gcHJvdGVjdGlvbgotICAgIGFnYWluc3QgYSBidWZmZXIgb3ZlcmZsb3cgb2YgYW4gOEsgc3RyaW5nIHNwYWNlIChvciBvdGhlciB2YWx1ZSBhcyBzZXQgYnkKLSAgICBnemJ1ZmZlcigpKSwgb3RoZXIgdGhhbiB0aGUgY2FsbGVyIG9mIGd6cHJpbnRmKCkgYXNzdXJpbmcgdGhhdCB0aGUgb3V0cHV0Ci0gICAgd2lsbCBub3QgZXhjZWVkIDhLLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHpsaWIgaXMgY29tcGlsZWQgdG8gdXNlCi0gICAgc25wcmludGYoKSBvciB2c25wcmludGYoKSwgd2hpY2ggc2hvdWxkIG5vcm1hbGx5IGJlIHRoZSBjYXNlLCB0aGVuIHRoZXJlIGlzCi0gICAgbm8gdnVsbmVyYWJpbGl0eS4gIFRoZSAuL2NvbmZpZ3VyZSBzY3JpcHQgd2lsbCBkaXNwbGF5IHdhcm5pbmdzIGlmIGFuCi0gICAgaW5zZWN1cmUgdmFyaWF0aW9uIG9mIHNwcmludGYoKSB3aWxsIGJlIHVzZWQgYnkgZ3pwcmludGYoKS4gIEFsc28gdGhlCi0gICAgemxpYkNvbXBpbGVGbGFncygpIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGluZm9ybWF0aW9uIG9uIHdoYXQgdmFyaWFudCBvZgotICAgIHNwcmludGYoKSBpcyB1c2VkIGJ5IGd6cHJpbnRmKCkuCi0KLSAgICBJZiB5b3UgZG9uJ3QgaGF2ZSBzbnByaW50ZigpIG9yIHZzbnByaW50ZigpIGFuZCB3b3VsZCBsaWtlIG9uZSwgeW91IGNhbgotICAgIGZpbmQgYSBwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbiBoZXJlOgotCi0gICAgICAgIGh0dHA6Ly93d3cuaWpzLnNpL3NvZnR3YXJlL3NucHJpbnRmLwotCi0gICAgTm90ZSB0aGF0IHlvdSBzaG91bGQgYmUgdXNpbmcgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24gb2YgemxpYi4gIFZlcnNpb25zCi0gICAgMS4xLjMgYW5kIGJlZm9yZSB3ZXJlIHN1YmplY3QgdG8gYSBkb3VibGUtZnJlZSB2dWxuZXJhYmlsaXR5LCBhbmQgdmVyc2lvbnMKLSAgICAxLjIuMSBhbmQgMS4yLjIgd2VyZSBzdWJqZWN0IHRvIGFuIGFjY2VzcyBleGNlcHRpb24gd2hlbiBkZWNvbXByZXNzaW5nCi0gICAgaW52YWxpZCBjb21wcmVzc2VkIGRhdGEuCi0KLTM0LiBJcyB0aGVyZSBhIEphdmEgdmVyc2lvbiBvZiB6bGliPwotCi0gICAgUHJvYmFibHkgd2hhdCB5b3Ugd2FudCBpcyB0byB1c2UgemxpYiBpbiBKYXZhLiB6bGliIGlzIGFscmVhZHkgaW5jbHVkZWQKLSAgICBhcyBwYXJ0IG9mIHRoZSBKYXZhIFNESyBpbiB0aGUgamF2YS51dGlsLnppcCBwYWNrYWdlLiBJZiB5b3UgcmVhbGx5IHdhbnQKLSAgICBhIHZlcnNpb24gb2YgemxpYiB3cml0dGVuIGluIHRoZSBKYXZhIGxhbmd1YWdlLCBsb29rIG9uIHRoZSB6bGliIGhvbWUKLSAgICBwYWdlIGZvciBsaW5rczogaHR0cDovL3psaWIubmV0LyAuCi0KLTM1LiBJIGdldCB0aGlzIG9yIHRoYXQgY29tcGlsZXIgb3Igc291cmNlLWNvZGUgc2Nhbm5lciB3YXJuaW5nIHdoZW4gSSBjcmFuayBpdAotICAgIHVwIHRvIG1heGltYWxseS1wZWRhbnRpYy4gQ2FuJ3QgeW91IGd1eXMgd3JpdGUgcHJvcGVyIGNvZGU/Ci0KLSAgICBNYW55IHllYXJzIGFnbywgd2UgZ2F2ZSB1cCBhdHRlbXB0aW5nIHRvIGF2b2lkIHdhcm5pbmdzIG9uIGV2ZXJ5IGNvbXBpbGVyCi0gICAgaW4gdGhlIHVuaXZlcnNlLiAgSXQganVzdCBnb3QgdG8gYmUgYSB3YXN0ZSBvZiB0aW1lLCBhbmQgc29tZSBjb21waWxlcnMKLSAgICB3ZXJlIGRvd25yaWdodCBzaWxseSBhcyB3ZWxsIGFzIGNvbnRyYWRpY3RlZCBlYWNoIG90aGVyLiAgU28gbm93LCB3ZSBzaW1wbHkKLSAgICBtYWtlIHN1cmUgdGhhdCB0aGUgY29kZSBhbHdheXMgd29ya3MuCi0KLTM2LiBWYWxncmluZCAob3Igc29tZSBzaW1pbGFyIG1lbW9yeSBhY2Nlc3MgY2hlY2tlcikgc2F5cyB0aGF0IGRlZmxhdGUgaXMKLSAgICBwZXJmb3JtaW5nIGEgY29uZGl0aW9uYWwganVtcCB0aGF0IGRlcGVuZHMgb24gYW4gdW5pbml0aWFsaXplZCB2YWx1ZS4KLSAgICBJc24ndCB0aGF0IGEgYnVnPwotCi0gICAgTm8uICBUaGF0IGlzIGludGVudGlvbmFsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBhbmQgdGhlIG91dHB1dCBvZiBkZWZsYXRlCi0gICAgaXMgbm90IGFmZmVjdGVkLiAgVGhpcyBvbmx5IHN0YXJ0ZWQgc2hvd2luZyB1cCByZWNlbnRseSBzaW5jZSB6bGliIDEuMi54Ci0gICAgdXNlcyBtYWxsb2MoKSBieSBkZWZhdWx0IGZvciBhbGxvY2F0aW9ucywgd2hlcmVhcyBlYXJsaWVyIHZlcnNpb25zIHVzZWQKLSAgICBjYWxsb2MoKSwgd2hpY2ggemVyb3Mgb3V0IHRoZSBhbGxvY2F0ZWQgbWVtb3J5LiAgRXZlbiB0aG91Z2ggdGhlIGNvZGUgd2FzCi0gICAgY29ycmVjdCwgdmVyc2lvbnMgMS4yLjQgYW5kIGxhdGVyIHdhcyBjaGFuZ2VkIHRvIG5vdCBzdGltdWxhdGUgdGhlc2UKLSAgICBjaGVja2Vycy4KLQotMzcuIFdpbGwgemxpYiByZWFkIHRoZSAoaW5zZXJ0IGFueSBhbmNpZW50IG9yIGFyY2FuZSBmb3JtYXQgaGVyZSkgY29tcHJlc3NlZAotICAgIGRhdGEgZm9ybWF0PwotCi0gICAgUHJvYmFibHkgbm90LiBMb29rIGluIHRoZSBjb21wLmNvbXByZXNzaW9uIEZBUSBmb3IgcG9pbnRlcnMgdG8gdmFyaW91cwotICAgIGZvcm1hdHMgYW5kIGFzc29jaWF0ZWQgc29mdHdhcmUuCi0KLTM4LiBIb3cgY2FuIEkgZW5jcnlwdC9kZWNyeXB0IHppcCBmaWxlcyB3aXRoIHpsaWI/Ci0KLSAgICB6bGliIGRvZXNuJ3Qgc3VwcG9ydCBlbmNyeXB0aW9uLiAgVGhlIG9yaWdpbmFsIFBLWklQIGVuY3J5cHRpb24gaXMgdmVyeQotICAgIHdlYWsgYW5kIGNhbiBiZSBicm9rZW4gd2l0aCBmcmVlbHkgYXZhaWxhYmxlIHByb2dyYW1zLiAgVG8gZ2V0IHN0cm9uZwotICAgIGVuY3J5cHRpb24sIHVzZSBHbnVQRywgaHR0cDovL3d3dy5nbnVwZy5vcmcvICwgd2hpY2ggYWxyZWFkeSBpbmNsdWRlcyB6bGliCi0gICAgY29tcHJlc3Npb24uICBGb3IgUEtaSVAgY29tcGF0aWJsZSAiZW5jcnlwdGlvbiIsIGxvb2sgYXQKLSAgICBodHRwOi8vd3d3LmluZm8temlwLm9yZy8KLQotMzkuIFdoYXQncyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSAiZ3ppcCIgYW5kICJkZWZsYXRlIiBIVFRQIDEuMSBlbmNvZGluZ3M/Ci0KLSAgICAiZ3ppcCIgaXMgdGhlIGd6aXAgZm9ybWF0LCBhbmQgImRlZmxhdGUiIGlzIHRoZSB6bGliIGZvcm1hdC4gIFRoZXkgc2hvdWxkCi0gICAgcHJvYmFibHkgaGF2ZSBjYWxsZWQgdGhlIHNlY29uZCBvbmUgInpsaWIiIGluc3RlYWQgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGgKLSAgICB0aGUgcmF3IGRlZmxhdGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdC4gIFdoaWxlIHRoZSBIVFRQIDEuMSBSRkMgMjYxNgotICAgIGNvcnJlY3RseSBwb2ludHMgdG8gdGhlIHpsaWIgc3BlY2lmaWNhdGlvbiBpbiBSRkMgMTk1MCBmb3IgdGhlICJkZWZsYXRlIgotICAgIHRyYW5zZmVyIGVuY29kaW5nLCB0aGVyZSBoYXZlIGJlZW4gcmVwb3J0cyBvZiBzZXJ2ZXJzIGFuZCBicm93c2VycyB0aGF0Ci0gICAgaW5jb3JyZWN0bHkgcHJvZHVjZSBvciBleHBlY3QgcmF3IGRlZmxhdGUgZGF0YSBwZXIgdGhlIGRlZmxhdGUKLSAgICBzcGVjaWZpY2F0aW9uIGluIFJGQyAxOTUxLCBtb3N0IG5vdGFibHkgTWljcm9zb2Z0LiAgU28gZXZlbiB0aG91Z2ggdGhlCi0gICAgImRlZmxhdGUiIHRyYW5zZmVyIGVuY29kaW5nIHVzaW5nIHRoZSB6bGliIGZvcm1hdCB3b3VsZCBiZSB0aGUgbW9yZQotICAgIGVmZmljaWVudCBhcHByb2FjaCAoYW5kIGluIGZhY3QgZXhhY3RseSB3aGF0IHRoZSB6bGliIGZvcm1hdCB3YXMgZGVzaWduZWQKLSAgICBmb3IpLCB1c2luZyB0aGUgImd6aXAiIHRyYW5zZmVyIGVuY29kaW5nIGlzIHByb2JhYmx5IG1vcmUgcmVsaWFibGUgZHVlIHRvCi0gICAgYW4gdW5mb3J0dW5hdGUgY2hvaWNlIG9mIG5hbWUgb24gdGhlIHBhcnQgb2YgdGhlIEhUVFAgMS4xIGF1dGhvcnMuCi0KLSAgICBCb3R0b20gbGluZTogdXNlIHRoZSBnemlwIGZvcm1hdCBmb3IgSFRUUCAxLjEgZW5jb2RpbmcuCi0KLTQwLiBEb2VzIHpsaWIgc3VwcG9ydCB0aGUgbmV3ICJEZWZsYXRlNjQiIGZvcm1hdCBpbnRyb2R1Y2VkIGJ5IFBLV2FyZT8KLQotICAgIE5vLiAgUEtXYXJlIGhhcyBhcHBhcmVudGx5IGRlY2lkZWQgdG8ga2VlcCB0aGF0IGZvcm1hdCBwcm9wcmlldGFyeSwgc2luY2UKLSAgICB0aGV5IGhhdmUgbm90IGRvY3VtZW50ZWQgaXQgYXMgdGhleSBoYXZlIHByZXZpb3VzIGNvbXByZXNzaW9uIGZvcm1hdHMuICBJbgotICAgIGFueSBjYXNlLCB0aGUgY29tcHJlc3Npb24gaW1wcm92ZW1lbnRzIGFyZSBzbyBtb2Rlc3QgY29tcGFyZWQgdG8gb3RoZXIgbW9yZQotICAgIG1vZGVybiBhcHByb2FjaGVzLCB0aGF0IGl0J3Mgbm90IHdvcnRoIHRoZSBlZmZvcnQgdG8gaW1wbGVtZW50LgotCi00MS4gSSdtIGhhdmluZyBhIHByb2JsZW0gd2l0aCB0aGUgemlwIGZ1bmN0aW9ucyBpbiB6bGliLCBjYW4geW91IGhlbHA/Ci0KLSAgICBUaGVyZSBhcmUgbm8gemlwIGZ1bmN0aW9ucyBpbiB6bGliLiAgWW91IGFyZSBwcm9iYWJseSB1c2luZyBtaW5pemlwIGJ5Ci0gICAgR2lsZXMgVm9sbGFudCwgd2hpY2ggaXMgZm91bmQgaW4gdGhlIGNvbnRyaWIgZGlyZWN0b3J5IG9mIHpsaWIuICBJdCBpcyBub3QKLSAgICBwYXJ0IG9mIHpsaWIuICBJbiBmYWN0IG5vbmUgb2YgdGhlIHN0dWZmIGluIGNvbnRyaWIgaXMgcGFydCBvZiB6bGliLiAgVGhlCi0gICAgZmlsZXMgaW4gdGhlcmUgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHpsaWIgYXV0aG9ycy4gIFlvdSBuZWVkIHRvIGNvbnRhY3QKLSAgICB0aGUgYXV0aG9ycyBvZiB0aGUgcmVzcGVjdGl2ZSBjb250cmlidXRpb24gZm9yIGhlbHAuCi0KLTQyLiBUaGUgbWF0Y2guYXNtIGNvZGUgaW4gY29udHJpYiBpcyB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0gICAgU2luY2UgaXQncyBwYXJ0IG9mIHpsaWIsIGRvZXNuJ3QgdGhhdCBtZWFuIHRoYXQgYWxsIG9mIHpsaWIgZmFsbHMgdW5kZXIgdGhlCi0gICAgR05VIEdQTD8KLQotICAgIE5vLiAgVGhlIGZpbGVzIGluIGNvbnRyaWIgYXJlIG5vdCBwYXJ0IG9mIHpsaWIuICBUaGV5IHdlcmUgY29udHJpYnV0ZWQgYnkKLSAgICBvdGhlciBhdXRob3JzIGFuZCBhcmUgcHJvdmlkZWQgYXMgYSBjb252ZW5pZW5jZSB0byB0aGUgdXNlciB3aXRoaW4gdGhlIHpsaWIKLSAgICBkaXN0cmlidXRpb24uICBFYWNoIGl0ZW0gaW4gY29udHJpYiBoYXMgaXRzIG93biBsaWNlbnNlLgotCi00My4gSXMgemxpYiBzdWJqZWN0IHRvIGV4cG9ydCBjb250cm9scz8gIFdoYXQgaXMgaXRzIEVDQ04/Ci0KLSAgICB6bGliIGlzIG5vdCBzdWJqZWN0IHRvIGV4cG9ydCBjb250cm9scywgYW5kIHNvIGlzIGNsYXNzaWZpZWQgYXMgRUFSOTkuCi0KLTQ0LiBDYW4geW91IHBsZWFzZSBzaWduIHRoZXNlIGxlbmd0aHkgbGVnYWwgZG9jdW1lbnRzIGFuZCBmYXggdGhlbSBiYWNrIHRvIHVzCi0gICAgc28gdGhhdCB3ZSBjYW4gdXNlIHlvdXIgc29mdHdhcmUgaW4gb3VyIHByb2R1Y3Q/Ci0KLSAgICBOby4gR28gYXdheS4gU2hvby4KZGlmZiAtLWdpdCBhL3NyYy96bGliL0lOREVYIGIvc3JjL3psaWIvSU5ERVgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYTA2NDEuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvSU5ERVgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi1DTWFrZUxpc3RzLnR4dCAgY21ha2UgYnVpbGQgZmlsZQotQ2hhbmdlTG9nICAgICAgIGhpc3Rvcnkgb2YgY2hhbmdlcwotRkFRICAgICAgICAgICAgIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIGFib3V0IHpsaWIKLUlOREVYICAgICAgICAgICB0aGlzIGZpbGUKLU1ha2VmaWxlICAgICAgICBkdW1teSBNYWtlZmlsZSB0aGF0IHRlbGxzIHlvdSB0byAuL2NvbmZpZ3VyZQotTWFrZWZpbGUuaW4gICAgIHRlbXBsYXRlIGZvciBVbml4IE1ha2VmaWxlCi1SRUFETUUgICAgICAgICAgZ3Vlc3Mgd2hhdAotY29uZmlndXJlICAgICAgIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIFVuaXgKLW1ha2Vfdm1zLmNvbSAgICBtYWtlZmlsZSBmb3IgVk1TCi10ZXN0L2V4YW1wbGUuYyAgemxpYiB1c2FnZXMgZXhhbXBsZXMgZm9yIGJ1aWxkIHRlc3RpbmcKLXRlc3QvbWluaWd6aXAuYyBtaW5pbWFsIGd6aXAtbGlrZSBmdW5jdGlvbmFsaXR5IGZvciBidWlsZCB0ZXN0aW5nCi10ZXN0L2luZmNvdmVyLmMgaW5mKi5jIGNvZGUgY292ZXJhZ2UgZm9yIGJ1aWxkIGNvdmVyYWdlIHRlc3RpbmcKLXRyZWVidWlsZC54bWwgICBYTUwgZGVzY3JpcHRpb24gb2Ygc291cmNlIGZpbGUgZGVwZW5kZW5jaWVzCi16Y29uZi5oLmNtYWtlaW4gemNvbmYuaCB0ZW1wbGF0ZSBmb3IgY21ha2UKLXpjb25mLmguaW4gICAgICB6Y29uZi5oIHRlbXBsYXRlIGZvciBjb25maWd1cmUKLXpsaWIuMyAgICAgICAgICBNYW4gcGFnZSBmb3IgemxpYgotemxpYi4zLnBkZiAgICAgIE1hbiBwYWdlIGluIFBERiBmb3JtYXQKLXpsaWIubWFwICAgICAgICBMaW51eCBzeW1ib2wgaW5mb3JtYXRpb24KLXpsaWIucGMuaW4gICAgICBUZW1wbGF0ZSBmb3IgcGtnLWNvbmZpZyBkZXNjcmlwdG9yCi16bGliLnBjLmNtYWtlaW4gemxpYi5wYyB0ZW1wbGF0ZSBmb3IgY21ha2UKLXpsaWIyYW5zaSAgICAgICBwZXJsIHNjcmlwdCB0byBjb252ZXJ0IHNvdXJjZSBmaWxlcyBmb3IgQysrIGNvbXBpbGF0aW9uCi0KLWFtaWdhLyAgICAgICAgICBtYWtlZmlsZXMgZm9yIEFtaWdhIFNBUyBDCi1hczQwMC8gICAgICAgICAgbWFrZWZpbGVzIGZvciBBUy80MDAKLWRvYy8gICAgICAgICAgICBkb2N1bWVudGF0aW9uIGZvciBmb3JtYXRzIGFuZCBhbGdvcml0aG1zCi1tc2Rvcy8gICAgICAgICAgbWFrZWZpbGVzIGZvciBNU0RPUwotbmludGVuZG9kcy8gICAgIG1ha2VmaWxlIGZvciBOaW50ZW5kbyBEUwotb2xkLyAgICAgICAgICAgIG1ha2VmaWxlcyBmb3IgdmFyaW91cyBhcmNoaXRlY3R1cmVzIGFuZCB6bGliIGRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBmaWxlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHVwZGF0ZWQgZm9yIHpsaWIgMS4yLngKLXFueC8gICAgICAgICAgICBtYWtlZmlsZXMgZm9yIFFOWAotd2F0Y29tLyAgICAgICAgIG1ha2VmaWxlcyBmb3IgT3BlbldhdGNvbQotd2luMzIvICAgICAgICAgIG1ha2VmaWxlcyBmb3IgV2luZG93cwotCi0gICAgICAgICAgICAgICAgemxpYiBwdWJsaWMgaGVhZGVyIGZpbGVzIChyZXF1aXJlZCBmb3IgbGlicmFyeSB1c2UpOgotemNvbmYuaAotemxpYi5oCi0KLSAgICAgICAgICAgICAgICBwcml2YXRlIHNvdXJjZSBmaWxlcyB1c2VkIHRvIGJ1aWxkIHRoZSB6bGliIGxpYnJhcnk6Ci1hZGxlcjMyLmMKLWNvbXByZXNzLmMKLWNyYzMyLmMKLWNyYzMyLmgKLWRlZmxhdGUuYwotZGVmbGF0ZS5oCi1nemNsb3NlLmMKLWd6Z3V0cy5oCi1nemxpYi5jCi1nenJlYWQuYwotZ3p3cml0ZS5jCi1pbmZiYWNrLmMKLWluZmZhc3QuYwotaW5mZmFzdC5oCi1pbmZmaXhlZC5oCi1pbmZsYXRlLmMKLWluZmxhdGUuaAotaW5mdHJlZXMuYwotaW5mdHJlZXMuaAotdHJlZXMuYwotdHJlZXMuaAotdW5jb21wci5jCi16dXRpbC5jCi16dXRpbC5oCi0KLSAgICAgICAgICAgICAgICBzb3VyY2UgZmlsZXMgZm9yIHNhbXBsZSBwcm9ncmFtcwotU2VlIGV4YW1wbGVzL1JFQURNRS5leGFtcGxlcwotCi0gICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQgY29udHJpYnV0aW9ucyBieSB0aGlyZCBwYXJ0aWVzCi1TZWUgY29udHJpYi9SRUFETUUuY29udHJpYgpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvTWFrZWZpbGUgYi9zcmMvemxpYi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiYTg2Yy4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYWxsOgotCS1AZWNobyAiUGxlYXNlIHVzZSAuL2NvbmZpZ3VyZSBmaXJzdC4gIFRoYW5rIHlvdS4iCi0KLWRpc3RjbGVhbjoKLQltYWtlIC1mIE1ha2VmaWxlLmluIGRpc3RjbGVhbgpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvTWFrZWZpbGUuaW4gYi9zcmMvemxpYi9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQxZGVlZC4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0jIE1ha2VmaWxlIGZvciB6bGliCi0jIENvcHlyaWdodCAoQykgMTk5NS0yMDExIEplYW4tbG91cCBHYWlsbHkuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLQotIyBUbyBjb21waWxlIGFuZCB0ZXN0LCB0eXBlOgotIyAgICAuL2NvbmZpZ3VyZTsgbWFrZSB0ZXN0Ci0jIE5vcm1hbGx5IGNvbmZpZ3VyZSBidWlsZHMgYm90aCBhIHN0YXRpYyBhbmQgYSBzaGFyZWQgbGlicmFyeS4KLSMgSWYgeW91IHdhbnQgdG8gYnVpbGQganVzdCBhIHN0YXRpYyBsaWJyYXJ5LCB1c2U6IC4vY29uZmlndXJlIC0tc3RhdGljCi0KLSMgVG8gdXNlIHRoZSBhc20gY29kZSwgdHlwZToKLSMgICAgY3AgY29udHJpYi9hc20/ODYvbWF0Y2guUyAuL21hdGNoLlMKLSMgICAgbWFrZSBMT0M9LURBU01WIE9CSkE9bWF0Y2gubwotCi0jIFRvIGluc3RhbGwgL3Vzci9sb2NhbC9saWIvbGliei4qIGFuZCAvdXNyL2xvY2FsL2luY2x1ZGUvemxpYi5oLCB0eXBlOgotIyAgICBtYWtlIGluc3RhbGwKLSMgVG8gaW5zdGFsbCBpbiAkSE9NRSBpbnN0ZWFkIG9mIC91c3IvbG9jYWwsIHVzZToKLSMgICAgbWFrZSBpbnN0YWxsIHByZWZpeD0kSE9NRQotCi1DQz1jYwotCi1DRkxBR1M9LU8KLSNDRkxBR1M9LU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTcKLSNDRkxBR1M9LWcgLURERUJVRwotI0NGTEFHUz0tTzMgLVdhbGwgLVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV2NvbnZlcnNpb24gXAotIyAgICAgICAgICAgLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcwotCi1TRkxBR1M9LU8KLUxERkxBR1M9Ci1URVNUX0xERkxBR1M9LUwuIGxpYnouYQotTERTSEFSRUQ9JChDQykKLUNQUD0kKENDKSAtRQotCi1TVEFUSUNMSUI9bGliei5hCi1TSEFSRURMSUI9bGliei5zbwotU0hBUkVETElCVj1saWJ6LnNvLjEuMi43Ci1TSEFSRURMSUJNPWxpYnouc28uMQotTElCUz0kKFNUQVRJQ0xJQikgJChTSEFSRURMSUJWKQotCi1BUj1hcgotQVJGTEFHUz1yYwotUkFOTElCPXJhbmxpYgotTERDT05GSUc9bGRjb25maWcKLUxEU0hBUkVETElCQz0tbGMKLVRBUj10YXIKLVNIRUxMPS9iaW4vc2gKLUVYRT0KLQotcHJlZml4ID0gL3Vzci9sb2NhbAotZXhlY19wcmVmaXggPSAke3ByZWZpeH0KLWxpYmRpciA9ICR7ZXhlY19wcmVmaXh9L2xpYgotc2hhcmVkbGliZGlyID0gJHtsaWJkaXJ9Ci1pbmNsdWRlZGlyID0gJHtwcmVmaXh9L2luY2x1ZGUKLW1hbmRpciA9ICR7cHJlZml4fS9zaGFyZS9tYW4KLW1hbjNkaXIgPSAke21hbmRpcn0vbWFuMwotcGtnY29uZmlnZGlyID0gJHtsaWJkaXJ9L3BrZ2NvbmZpZwotCi1PQkpaID0gYWRsZXIzMi5vIGNyYzMyLm8gZGVmbGF0ZS5vIGluZmJhY2subyBpbmZmYXN0Lm8gaW5mbGF0ZS5vIGluZnRyZWVzLm8gdHJlZXMubyB6dXRpbC5vCi1PQkpHID0gY29tcHJlc3MubyB1bmNvbXByLm8gZ3pjbG9zZS5vIGd6bGliLm8gZ3pyZWFkLm8gZ3p3cml0ZS5vCi1PQkpDID0gJChPQkpaKSAkKE9CSkcpCi0KLVBJQ19PQkpaID0gYWRsZXIzMi5sbyBjcmMzMi5sbyBkZWZsYXRlLmxvIGluZmJhY2subG8gaW5mZmFzdC5sbyBpbmZsYXRlLmxvIGluZnRyZWVzLmxvIHRyZWVzLmxvIHp1dGlsLmxvCi1QSUNfT0JKRyA9IGNvbXByZXNzLmxvIHVuY29tcHIubG8gZ3pjbG9zZS5sbyBnemxpYi5sbyBnenJlYWQubG8gZ3p3cml0ZS5sbwotUElDX09CSkMgPSAkKFBJQ19PQkpaKSAkKFBJQ19PQkpHKQotCi0jIHRvIHVzZSB0aGUgYXNtIGNvZGU6IG1ha2UgT0JKQT1tYXRjaC5vLCBQSUNfT0JKQT1tYXRjaC5sbwotT0JKQSA9Ci1QSUNfT0JKQSA9Ci0KLU9CSlMgPSAkKE9CSkMpICQoT0JKQSkKLQotUElDX09CSlMgPSAkKFBJQ19PQkpDKSAkKFBJQ19PQkpBKQotCi1hbGw6IHN0YXRpYyBzaGFyZWQKLQotc3RhdGljOiBleGFtcGxlJChFWEUpIG1pbmlnemlwJChFWEUpCi0KLXNoYXJlZDogZXhhbXBsZXNoJChFWEUpIG1pbmlnemlwc2gkKEVYRSkKLQotYWxsNjQ6IGV4YW1wbGU2NCQoRVhFKSBtaW5pZ3ppcDY0JChFWEUpCi0KLWNoZWNrOiB0ZXN0Ci0KLXRlc3Q6IGFsbCB0ZXN0c3RhdGljIHRlc3RzaGFyZWQKLQotdGVzdHN0YXRpYzogc3RhdGljCi0JQFRNUFNUPWBta3RlbXAgZm9vWFhYWFhYYDsgXAotCWlmIGVjaG8gaGVsbG8gd29ybGQgfCAuL21pbmlnemlwIHwgLi9taW5pZ3ppcCAtZCAmJiAuL2V4YW1wbGUgJCRUTVBTVCA7IHRoZW4gXAotCSAgZWNobyAnCQkqKiogemxpYiB0ZXN0IE9LICoqKic7IFwKLQllbHNlIFwKLQkgIGVjaG8gJwkJKioqIHpsaWIgdGVzdCBGQUlMRUQgKioqJzsgZmFsc2U7IFwKLQlmaTsgXAotCXJtIC1mICQkVE1QU1QKLQotdGVzdHNoYXJlZDogc2hhcmVkCi0JQExEX0xJQlJBUllfUEFUSD1gcHdkYDokKExEX0xJQlJBUllfUEFUSCkgOyBleHBvcnQgTERfTElCUkFSWV9QQVRIOyBcCi0JTERfTElCUkFSWU4zMl9QQVRIPWBwd2RgOiQoTERfTElCUkFSWU4zMl9QQVRIKSA7IGV4cG9ydCBMRF9MSUJSQVJZTjMyX1BBVEg7IFwKLQlEWUxEX0xJQlJBUllfUEFUSD1gcHdkYDokKERZTERfTElCUkFSWV9QQVRIKSA7IGV4cG9ydCBEWUxEX0xJQlJBUllfUEFUSDsgXAotCVNITElCX1BBVEg9YHB3ZGA6JChTSExJQl9QQVRIKSA7IGV4cG9ydCBTSExJQl9QQVRIOyBcCi0JVE1QU0g9YG1rdGVtcCBmb29YWFhYWFhgOyBcCi0JaWYgZWNobyBoZWxsbyB3b3JsZCB8IC4vbWluaWd6aXBzaCB8IC4vbWluaWd6aXBzaCAtZCAmJiAuL2V4YW1wbGVzaCAkJFRNUFNIOyB0aGVuIFwKLQkgIGVjaG8gJwkJKioqIHpsaWIgc2hhcmVkIHRlc3QgT0sgKioqJzsgXAotCWVsc2UgXAotCSAgZWNobyAnCQkqKiogemxpYiBzaGFyZWQgdGVzdCBGQUlMRUQgKioqJzsgZmFsc2U7IFwKLQlmaTsgXAotCXJtIC1mICQkVE1QU0gKLQotdGVzdDY0OiBhbGw2NAotCUBUTVA2ND1gbWt0ZW1wIGZvb1hYWFhYWGA7IFwKLQlpZiBlY2hvIGhlbGxvIHdvcmxkIHwgLi9taW5pZ3ppcDY0IHwgLi9taW5pZ3ppcDY0IC1kICYmIC4vZXhhbXBsZTY0ICQkVE1QNjQ7IHRoZW4gXAotCSAgZWNobyAnCQkqKiogemxpYiA2NC1iaXQgdGVzdCBPSyAqKionOyBcCi0JZWxzZSBcCi0JICBlY2hvICcJCSoqKiB6bGliIDY0LWJpdCB0ZXN0IEZBSUxFRCAqKionOyBmYWxzZTsgXAotCWZpOyBcCi0Jcm0gLWYgJCRUTVA2NAotCi1pbmZjb3Zlci5vOiB0ZXN0L2luZmNvdmVyLmMgemxpYi5oIHpjb25mLmgKLQkkKENDKSAkKENGTEFHUykgLUkuIC1jIC1vICRAIHRlc3QvaW5mY292ZXIuYwotCi1pbmZjb3ZlcjogaW5mY292ZXIubyBsaWJ6LmEKLQkkKENDKSAkKENGTEFHUykgLW8gJEAgaW5mY292ZXIubyBsaWJ6LmEKLQotY292ZXI6IGluZmNvdmVyCi0Jcm0gLWYgKi5nY2RhCi0JLi9pbmZjb3ZlcgotCWdjb3YgaW5mKi5jCi0KLWxpYnouYTogJChPQkpTKQotCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQotCS1AICgkKFJBTkxJQikgJEAgfHwgdHJ1ZSkgPi9kZXYvbnVsbCAyPiYxCi0KLW1hdGNoLm86IG1hdGNoLlMKLQkkKENQUCkgbWF0Y2guUyA+IF9tYXRjaC5zCi0JJChDQykgLWMgX21hdGNoLnMKLQltdiBfbWF0Y2gubyBtYXRjaC5vCi0Jcm0gLWYgX21hdGNoLnMKLQotbWF0Y2gubG86IG1hdGNoLlMKLQkkKENQUCkgbWF0Y2guUyA+IF9tYXRjaC5zCi0JJChDQykgLWMgLWZQSUMgX21hdGNoLnMKLQltdiBfbWF0Y2gubyBtYXRjaC5sbwotCXJtIC1mIF9tYXRjaC5zCi0KLWV4YW1wbGUubzogdGVzdC9leGFtcGxlLmMgemxpYi5oIHpjb25mLmgKLQkkKENDKSAkKENGTEFHUykgLUkuIC1jIC1vICRAIHRlc3QvZXhhbXBsZS5jCi0KLW1pbmlnemlwLm86IHRlc3QvbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtSS4gLWMgLW8gJEAgdGVzdC9taW5pZ3ppcC5jCi0KLWV4YW1wbGU2NC5vOiB0ZXN0L2V4YW1wbGUuYyB6bGliLmggemNvbmYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtSS4gLURfRklMRV9PRkZTRVRfQklUUz02NCAtYyAtbyAkQCB0ZXN0L2V4YW1wbGUuYwotCi1taW5pZ3ppcDY0Lm86IHRlc3QvbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtSS4gLURfRklMRV9PRkZTRVRfQklUUz02NCAtYyAtbyAkQCB0ZXN0L21pbmlnemlwLmMKLQotLlNVRkZJWEVTOiAubG8KLQotLmMubG86Ci0JLUBta2RpciBvYmpzIDI+L2Rldi9udWxsIHx8IHRlc3QgLWQgb2JqcwotCSQoQ0MpICQoU0ZMQUdTKSAtRFBJQyAtYyAtbyBvYmpzLyQqLm8gJDwKLQktQG12IG9ianMvJCoubyAkQAotCi1wbGFjZWJvICQoU0hBUkVETElCVik6ICQoUElDX09CSlMpIGxpYnouYQotCSQoTERTSEFSRUQpICQoU0ZMQUdTKSAtbyAkQCAkKFBJQ19PQkpTKSAkKExEU0hBUkVETElCQykgJChMREZMQUdTKQotCXJtIC1mICQoU0hBUkVETElCKSAkKFNIQVJFRExJQk0pCi0JbG4gLXMgJEAgJChTSEFSRURMSUIpCi0JbG4gLXMgJEAgJChTSEFSRURMSUJNKQotCS1Acm1kaXIgb2JqcwotCi1leGFtcGxlJChFWEUpOiBleGFtcGxlLm8gJChTVEFUSUNMSUIpCi0JJChDQykgJChDRkxBR1MpIC1vICRAIGV4YW1wbGUubyAkKFRFU1RfTERGTEFHUykKLQotbWluaWd6aXAkKEVYRSk6IG1pbmlnemlwLm8gJChTVEFUSUNMSUIpCi0JJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwLm8gJChURVNUX0xERkxBR1MpCi0KLWV4YW1wbGVzaCQoRVhFKTogZXhhbXBsZS5vICQoU0hBUkVETElCVikKLQkkKENDKSAkKENGTEFHUykgLW8gJEAgZXhhbXBsZS5vIC1MLiAkKFNIQVJFRExJQlYpCi0KLW1pbmlnemlwc2gkKEVYRSk6IG1pbmlnemlwLm8gJChTSEFSRURMSUJWKQotCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBtaW5pZ3ppcC5vIC1MLiAkKFNIQVJFRExJQlYpCi0KLWV4YW1wbGU2NCQoRVhFKTogZXhhbXBsZTY0Lm8gJChTVEFUSUNMSUIpCi0JJChDQykgJChDRkxBR1MpIC1vICRAIGV4YW1wbGU2NC5vICQoVEVTVF9MREZMQUdTKQotCi1taW5pZ3ppcDY0JChFWEUpOiBtaW5pZ3ppcDY0Lm8gJChTVEFUSUNMSUIpCi0JJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwNjQubyAkKFRFU1RfTERGTEFHUykKLQotaW5zdGFsbC1saWJzOiAkKExJQlMpCi0JLUBpZiBbICEgLWQgJChERVNURElSKSQoZXhlY19wcmVmaXgpICBdOyB0aGVuIG1rZGlyIC1wICQoREVTVERJUikkKGV4ZWNfcHJlZml4KTsgZmkKLQktQGlmIFsgISAtZCAkKERFU1RESVIpJChsaWJkaXIpICAgICAgIF07IHRoZW4gbWtkaXIgLXAgJChERVNURElSKSQobGliZGlyKTsgZmkKLQktQGlmIFsgISAtZCAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpIF07IHRoZW4gbWtkaXIgLXAgJChERVNURElSKSQoc2hhcmVkbGliZGlyKTsgZmkKLQktQGlmIFsgISAtZCAkKERFU1RESVIpJChtYW4zZGlyKSAgICAgIF07IHRoZW4gbWtkaXIgLXAgJChERVNURElSKSQobWFuM2Rpcik7IGZpCi0JLUBpZiBbICEgLWQgJChERVNURElSKSQocGtnY29uZmlnZGlyKSBdOyB0aGVuIG1rZGlyIC1wICQoREVTVERJUikkKHBrZ2NvbmZpZ2Rpcik7IGZpCi0JY3AgJChTVEFUSUNMSUIpICQoREVTVERJUikkKGxpYmRpcikKLQljaG1vZCA2NDQgJChERVNURElSKSQobGliZGlyKS8kKFNUQVRJQ0xJQikKLQktQCgkKFJBTkxJQikgJChERVNURElSKSQobGliZGlyKS9saWJ6LmEgfHwgdHJ1ZSkgPi9kZXYvbnVsbCAyPiYxCi0JLUBpZiB0ZXN0IC1uICIkKFNIQVJFRExJQlYpIjsgdGhlbiBcCi0JICBjcCAkKFNIQVJFRExJQlYpICQoREVTVERJUikkKHNoYXJlZGxpYmRpcik7IFwKLQkgIGVjaG8gImNwICQoU0hBUkVETElCVikgJChERVNURElSKSQoc2hhcmVkbGliZGlyKSI7IFwKLQkgIGNobW9kIDc1NSAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCVik7IFwKLQkgIGVjaG8gImNobW9kIDc1NSAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCVikiOyBcCi0JICBybSAtZiAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCKSAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCTSk7IFwKLQkgIGxuIC1zICQoU0hBUkVETElCVikgJChERVNURElSKSQoc2hhcmVkbGliZGlyKS8kKFNIQVJFRExJQik7IFwKLQkgIGxuIC1zICQoU0hBUkVETElCVikgJChERVNURElSKSQoc2hhcmVkbGliZGlyKS8kKFNIQVJFRExJQk0pOyBcCi0JICAoJChMRENPTkZJRykgfHwgdHJ1ZSkgID4vZGV2L251bGwgMj4mMTsgXAotCWZpCi0JY3AgemxpYi4zICQoREVTVERJUikkKG1hbjNkaXIpCi0JY2htb2QgNjQ0ICQoREVTVERJUikkKG1hbjNkaXIpL3psaWIuMwotCWNwIHpsaWIucGMgJChERVNURElSKSQocGtnY29uZmlnZGlyKQotCWNobW9kIDY0NCAkKERFU1RESVIpJChwa2djb25maWdkaXIpL3psaWIucGMKLSMgVGhlIHJhbmxpYiBpbiBpbnN0YWxsIGlzIG5lZWRlZCBvbiBOZVhUU1RFUCB3aGljaCBjaGVja3MgZmlsZSB0aW1lcwotIyBsZGNvbmZpZyBpcyBmb3IgTGludXgKLQotaW5zdGFsbDogaW5zdGFsbC1saWJzCi0JLUBpZiBbICEgLWQgJChERVNURElSKSQoaW5jbHVkZWRpcikgICBdOyB0aGVuIG1rZGlyIC1wICQoREVTVERJUikkKGluY2x1ZGVkaXIpOyBmaQotCWNwIHpsaWIuaCB6Y29uZi5oICQoREVTVERJUikkKGluY2x1ZGVkaXIpCi0JY2htb2QgNjQ0ICQoREVTVERJUikkKGluY2x1ZGVkaXIpL3psaWIuaCAkKERFU1RESVIpJChpbmNsdWRlZGlyKS96Y29uZi5oCi0KLXVuaW5zdGFsbDoKLQljZCAkKERFU1RESVIpJChpbmNsdWRlZGlyKTsgcm0gLWYgemxpYi5oIHpjb25mLmgKLQljZCAkKERFU1RESVIpJChsaWJkaXIpOyBybSAtZiBsaWJ6LmE7IFwKLQlpZiB0ZXN0IC1uICIkKFNIQVJFRExJQlYpIiAtYSAtZiAkKFNIQVJFRExJQlYpOyB0aGVuIFwKLQkgIHJtIC1mICQoU0hBUkVETElCVikgJChTSEFSRURMSUIpICQoU0hBUkVETElCTSk7IFwKLQlmaQotCWNkICQoREVTVERJUikkKG1hbjNkaXIpOyBybSAtZiB6bGliLjMKLQljZCAkKERFU1RESVIpJChwa2djb25maWdkaXIpOyBybSAtZiB6bGliLnBjCi0KLWRvY3M6IHpsaWIuMy5wZGYKLQotemxpYi4zLnBkZjogemxpYi4zCi0JZ3JvZmYgLW1hbmRvYyAtZiBIIC1UIHBzIHpsaWIuMyB8IHBzMnBkZiAtIHpsaWIuMy5wZGYKLQotemNvbmYuaC5jbWFrZWluOiB6Y29uZi5oLmluCi0JLUAgVEVNUEZJTEU9YG1rdGVtcCBfX1hYWFhYWGA7IFwKLQllY2hvICIvI2RlZmluZSBaQ09ORl9ILyBhXFxcXFxuI2NtYWtlZGVmaW5lIFpfUFJFRklYXFxcXFxuI2NtYWtlZGVmaW5lIFpfSEFWRV9VTklTVERfSFxuIiA+PiAkJFRFTVBGSUxFICYmXAotCXNlZCAtZiAkJFRFTVBGSUxFIHpjb25mLmguaW4gPiB6Y29uZi5oLmNtYWtlaW4gJiZcCi0JdG91Y2ggLXIgemNvbmYuaC5pbiB6Y29uZi5oLmNtYWtlaW4gJiZcCi0Jcm0gJCRURU1QRklMRQotCi16Y29uZjogemNvbmYuaC5pbgotCWNwIC1wIHpjb25mLmguaW4gemNvbmYuaAotCi1tb3N0bHljbGVhbjogY2xlYW4KLWNsZWFuOgotCXJtIC1mICoubyAqLmxvICp+IFwKLQkgICBleGFtcGxlJChFWEUpIG1pbmlnemlwJChFWEUpIGV4YW1wbGVzaCQoRVhFKSBtaW5pZ3ppcHNoJChFWEUpIFwKLQkgICBleGFtcGxlNjQkKEVYRSkgbWluaWd6aXA2NCQoRVhFKSBcCi0JICAgaW5mY292ZXIgXAotCSAgIGxpYnouKiBmb28uZ3ogc29fbG9jYXRpb25zIFwKLQkgICBfbWF0Y2gucyBtYWtldHJlZSBjb250cmliL2luZmJhY2s5LyoubwotCXJtIC1yZiBvYmpzCi0Jcm0gLWYgKi5nY2RhICouZ2NubyAqLmdjb3YKLQlybSAtZiBjb250cmliL2luZmJhY2s5LyouZ2NkYSBjb250cmliL2luZmJhY2s5LyouZ2NubyBjb250cmliL2luZmJhY2s5LyouZ2NvdgotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLWRpc3RjbGVhbjogY2xlYW4gemNvbmYgemNvbmYuaC5jbWFrZWluIGRvY3MKLQlybSAtZiBNYWtlZmlsZSB6bGliLnBjIGNvbmZpZ3VyZS5sb2cKLQktQHJtIC1mIC5EU19TdG9yZQotCS1AcHJpbnRmICdhbGw6XG5cdC1AZWNobyAiUGxlYXNlIHVzZSAuL2NvbmZpZ3VyZSBmaXJzdC4gIFRoYW5rIHlvdS4iXG4nID4gTWFrZWZpbGUKLQktQHByaW50ZiAnXG5kaXN0Y2xlYW46XG5cdG1ha2UgLWYgTWFrZWZpbGUuaW4gZGlzdGNsZWFuXG4nID4+IE1ha2VmaWxlCi0JLUB0b3VjaCAtciBNYWtlZmlsZS5pbiBNYWtlZmlsZQotCi10YWdzOgotCWV0YWdzICouW2NoXQotCi1kZXBlbmQ6Ci0JbWFrZWRlcGVuZCAtLSAkKENGTEFHUykgLS0gKi5bY2hdCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotYWRsZXIzMi5vIHp1dGlsLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWd6Y2xvc2UubyBnemxpYi5vIGd6cmVhZC5vIGd6d3JpdGUubzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLWNvbXByZXNzLm8gZXhhbXBsZS5vIG1pbmlnemlwLm8gdW5jb21wci5vOiB6bGliLmggemNvbmYuaAotY3JjMzIubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBjcmMzMi5oCi1kZWZsYXRlLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1pbmZiYWNrLm8gaW5mbGF0ZS5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaCBpbmZmaXhlZC5oCi1pbmZmYXN0Lm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCi1pbmZ0cmVlcy5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKLXRyZWVzLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIHRyZWVzLmgKLQotYWRsZXIzMi5sbyB6dXRpbC5sbzogenV0aWwuaCB6bGliLmggemNvbmYuaAotZ3pjbG9zZS5sbyBnemxpYi5sbyBnenJlYWQubG8gZ3p3cml0ZS5sbzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLWNvbXByZXNzLmxvIGV4YW1wbGUubG8gbWluaWd6aXAubG8gdW5jb21wci5sbzogemxpYi5oIHpjb25mLmgKLWNyYzMyLmxvOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGNyYzMyLmgKLWRlZmxhdGUubG86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1pbmZiYWNrLmxvIGluZmxhdGUubG86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oIGluZmZpeGVkLmgKLWluZmZhc3QubG86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCi1pbmZ0cmVlcy5sbzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCi10cmVlcy5sbzogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmggdHJlZXMuaApkaWZmIC0tZ2l0IGEvc3JjL3psaWIvUkVBRE1FIGIvc3JjL3psaWIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjEyNTVmLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi1aTElCIERBVEEgQ09NUFJFU1NJT04gTElCUkFSWQotCi16bGliIDEuMi43IGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4gIEFsbCB0aGUgY29kZSBpcwotdGhyZWFkIHNhZmUuICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzCi0oUmVxdWVzdCBmb3IgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXMKLWh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5NTAgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MSAoZGVmbGF0ZSBmb3JtYXQpIGFuZAotcmZjMTk1MiAoZ3ppcCBmb3JtYXQpLgotCi1BbGwgZnVuY3Rpb25zIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlIHpsaWIuaAotKHZvbHVudGVlciB0byB3cml0ZSBtYW4gcGFnZXMgd2VsY29tZSwgY29udGFjdCB6bGliQGd6aXAub3JnKS4gIEEgdXNhZ2UgZXhhbXBsZQotb2YgdGhlIGxpYnJhcnkgaXMgZ2l2ZW4gaW4gdGhlIGZpbGUgdGVzdC9leGFtcGxlLmMgd2hpY2ggYWxzbyB0ZXN0cyB0aGF0Ci10aGUgbGlicmFyeSBpcyB3b3JraW5nIGNvcnJlY3RseS4gIEFub3RoZXIgZXhhbXBsZSBpcyBnaXZlbiBpbiB0aGUgZmlsZQotdGVzdC9taW5pZ3ppcC5jLiAgVGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgaXRzZWxmIGlzIGNvbXBvc2VkIG9mIGFsbCBzb3VyY2UKLWZpbGVzIGluIHRoZSByb290IGRpcmVjdG9yeS4KLQotVG8gY29tcGlsZSBhbGwgZmlsZXMgYW5kIHJ1biB0aGUgdGVzdCBwcm9ncmFtLCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBnaXZlbiBhdAotdGhlIHRvcCBvZiBNYWtlZmlsZS5pbi4gIEluIHNob3J0ICIuL2NvbmZpZ3VyZTsgbWFrZSB0ZXN0IiwgYW5kIGlmIHRoYXQgZ29lcwotd2VsbCwgIm1ha2UgaW5zdGFsbCIgc2hvdWxkIHdvcmsgZm9yIG1vc3QgZmxhdm9ycyBvZiBVbml4LiAgRm9yIFdpbmRvd3MsIHVzZQotb25lIG9mIHRoZSBzcGVjaWFsIG1ha2VmaWxlcyBpbiB3aW4zMi8gb3IgY29udHJpYi92c3R1ZGlvLyAuICBGb3IgVk1TLCB1c2UKLW1ha2Vfdm1zLmNvbS4KLQotUXVlc3Rpb25zIGFib3V0IHpsaWIgc2hvdWxkIGJlIHNlbnQgdG8gPHpsaWJAZ3ppcC5vcmc+LCBvciB0byBHaWxsZXMgVm9sbGFudAotPGluZm9Ad2luaW1hZ2UuY29tPiBmb3IgdGhlIFdpbmRvd3MgRExMIHZlcnNpb24uICBUaGUgemxpYiBob21lIHBhZ2UgaXMKLWh0dHA6Ly96bGliLm5ldC8gLiAgQmVmb3JlIHJlcG9ydGluZyBhIHByb2JsZW0sIHBsZWFzZSBjaGVjayB0aGlzIHNpdGUgdG8KLXZlcmlmeSB0aGF0IHlvdSBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB6bGliOyBvdGhlcndpc2UgZ2V0IHRoZSBsYXRlc3QKLXZlcnNpb24gYW5kIGNoZWNrIHdoZXRoZXIgdGhlIHByb2JsZW0gc3RpbGwgZXhpc3RzIG9yIG5vdC4KLQotUExFQVNFIHJlYWQgdGhlIHpsaWIgRkFRIGh0dHA6Ly96bGliLm5ldC96bGliX2ZhcS5odG1sIGJlZm9yZSBhc2tpbmcgZm9yIGhlbHAuCi0KLU1hcmsgTmVsc29uIDxtYXJrbkBpZWVlLm9yZz4gd3JvdGUgYW4gYXJ0aWNsZSBhYm91dCB6bGliIGZvciB0aGUgSmFuLiAgMTk5NwotaXNzdWUgb2YgRHIuICBEb2JiJ3MgSm91cm5hbDsgYSBjb3B5IG9mIHRoZSBhcnRpY2xlIGlzIGF2YWlsYWJsZSBhdAotaHR0cDovL21hcmtuZWxzb24udXMvMTk5Ny8wMS8wMS96bGliLWVuZ2luZS8gLgotCi1UaGUgY2hhbmdlcyBtYWRlIGluIHZlcnNpb24gMS4yLjcgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUgQ2hhbmdlTG9nLgotCi1VbnN1cHBvcnRlZCB0aGlyZCBwYXJ0eSBjb250cmlidXRpb25zIGFyZSBwcm92aWRlZCBpbiBkaXJlY3RvcnkgY29udHJpYi8gLgotCi16bGliIGlzIGF2YWlsYWJsZSBpbiBKYXZhIHVzaW5nIHRoZSBqYXZhLnV0aWwuemlwIHBhY2thZ2UsIGRvY3VtZW50ZWQgYXQKLWh0dHA6Ly9qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL3RlY2huaWNhbEFydGljbGVzL1Byb2dyYW1taW5nL2NvbXByZXNzaW9uLyAuCi0KLUEgUGVybCBpbnRlcmZhY2UgdG8gemxpYiB3cml0dGVuIGJ5IFBhdWwgTWFycXVlc3MgPHBtcXNAY3Bhbi5vcmc+IGlzIGF2YWlsYWJsZQotYXQgQ1BBTiAoQ29tcHJlaGVuc2l2ZSBQZXJsIEFyY2hpdmUgTmV0d29yaykgc2l0ZXMsIGluY2x1ZGluZwotaHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+cG1xcy9JTy1Db21wcmVzcy1abGliLyAuCi0KLUEgUHl0aG9uIGludGVyZmFjZSB0byB6bGliIHdyaXR0ZW4gYnkgQS5NLiBLdWNobGluZyA8YW1rQGFtay5jYT4gaXMKLWF2YWlsYWJsZSBpbiBQeXRob24gMS41IGFuZCBsYXRlciB2ZXJzaW9ucywgc2VlCi1odHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvemxpYi5odG1sIC4KLQotemxpYiBpcyBidWlsdCBpbnRvIHRjbDogaHR0cDovL3dpa2kudGNsLnRrLzQ2MTAgLgotCi1BbiBleHBlcmltZW50YWwgcGFja2FnZSB0byByZWFkIGFuZCB3cml0ZSBmaWxlcyBpbiAuemlwIGZvcm1hdCwgd3JpdHRlbiBvbiB0b3AKLW9mIHpsaWIgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPiwgaXMgYXZhaWxhYmxlIGluIHRoZQotY29udHJpYi9taW5pemlwIGRpcmVjdG9yeSBvZiB6bGliLgotCi0KLU5vdGVzIGZvciBzb21lIHRhcmdldHM6Ci0KLS0gRm9yIFdpbmRvd3MgRExMIHZlcnNpb25zLCBwbGVhc2Ugc2VlIHdpbjMyL0RMTF9GQVEudHh0Ci0KLS0gRm9yIDY0LWJpdCBJcml4LCBkZWZsYXRlLmMgbXVzdCBiZSBjb21waWxlZCB3aXRob3V0IGFueSBvcHRpbWl6YXRpb24uIFdpdGgKLSAgLU8sIG9uZSBsaWJwbmcgdGVzdCBmYWlscy4gVGhlIHRlc3Qgd29ya3MgaW4gMzIgYml0IG1vZGUgKHdpdGggdGhlIC1uMzIKLSAgY29tcGlsZXIgZmxhZykuIFRoZSBjb21waWxlciBidWcgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gU0dJLgotCi0tIHpsaWIgZG9lc24ndCB3b3JrIHdpdGggZ2NjIDIuNi4zIG9uIGEgREVDIDMwMDAvMzAwTFggdW5kZXIgT1NGLzEgMi4xIGl0IHdvcmtzCi0gIHdoZW4gY29tcGlsZWQgd2l0aCBjYy4KLQotLSBPbiBEaWdpdGFsIFVuaXggNC4wRCAoZm9ybWVseSBPU0YvMSkgb24gQWxwaGFTZXJ2ZXIsIHRoZSBjYyBvcHRpb24gLXN0ZDEgaXMKLSAgbmVjZXNzYXJ5IHRvIGdldCBnenByaW50ZiB3b3JraW5nIGNvcnJlY3RseS4gVGhpcyBpcyBkb25lIGJ5IGNvbmZpZ3VyZS4KLQotLSB6bGliIGRvZXNuJ3Qgd29yayBvbiBIUC1VWCA5LjA1IHdpdGggc29tZSB2ZXJzaW9ucyBvZiAvYmluL2NjLiBJdCB3b3JrcyB3aXRoCi0gIG90aGVyIGNvbXBpbGVycy4gVXNlICJtYWtlIHRlc3QiIHRvIGNoZWNrIHlvdXIgY29tcGlsZXIuCi0KLS0gZ3pkb3BlbiBpcyBub3Qgc3VwcG9ydGVkIG9uIFJJU0NPUyBvciBCRU9TLgotCi0tIEZvciBQYWxtT3MsIHNlZSBodHRwOi8vcGFsbXpsaWIuc291cmNlZm9yZ2UubmV0LwotCi0KLUFja25vd2xlZGdtZW50czoKLQotICBUaGUgZGVmbGF0ZSBmb3JtYXQgdXNlZCBieSB6bGliIHdhcyBkZWZpbmVkIGJ5IFBoaWwgS2F0ei4gIFRoZSBkZWZsYXRlIGFuZAotICB6bGliIHNwZWNpZmljYXRpb25zIHdlcmUgd3JpdHRlbiBieSBMLiAgUGV0ZXIgRGV1dHNjaC4gIFRoYW5rcyB0byBhbGwgdGhlCi0gIHBlb3BsZSB3aG8gcmVwb3J0ZWQgcHJvYmxlbXMgYW5kIHN1Z2dlc3RlZCB2YXJpb3VzIGltcHJvdmVtZW50cyBpbiB6bGliOyB0aGV5Ci0gIGFyZSB0b28gbnVtZXJvdXMgdG8gY2l0ZSBoZXJlLgotCi1Db3B5cmlnaHQgbm90aWNlOgotCi0gKEMpIDE5OTUtMjAxMiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCi0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0gIEplYW4tbG91cCBHYWlsbHkgICAgICAgIE1hcmsgQWRsZXIKLSAgamxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQotCi1JZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCB3ZSB3b3VsZCBhcHByZWNpYXRlICpub3QqIHJlY2VpdmluZwotbGVuZ3RoeSBsZWdhbCBkb2N1bWVudHMgdG8gc2lnbi4gIFRoZSBzb3VyY2VzIGFyZSBwcm92aWRlZCBmb3IgZnJlZSBidXQgd2l0aG91dAotd2FycmFudHkgb2YgYW55IGtpbmQuICBUaGUgbGlicmFyeSBoYXMgYmVlbiBlbnRpcmVseSB3cml0dGVuIGJ5IEplYW4tbG91cAotR2FpbGx5IGFuZCBNYXJrIEFkbGVyOyBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoaXJkLXBhcnR5IGNvZGUuCi0KLUlmIHlvdSByZWRpc3RyaWJ1dGUgbW9kaWZpZWQgc291cmNlcywgd2Ugd291bGQgYXBwcmVjaWF0ZSB0aGF0IHlvdSBpbmNsdWRlIGluCi10aGUgZmlsZSBDaGFuZ2VMb2cgaGlzdG9yeSBpbmZvcm1hdGlvbiBkb2N1bWVudGluZyB5b3VyIGNoYW5nZXMuICBQbGVhc2UgcmVhZAotdGhlIEZBUSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGlzdHJpYnV0aW9uIG9mIG1vZGlmaWVkIHNvdXJjZSB2ZXJzaW9ucy4KZGlmZiAtLWdpdCBhL3NyYy96bGliL1JFQURNRS5vcHRpcG5nLnR4dCBiL3NyYy96bGliL1JFQURNRS5vcHRpcG5nLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM4MWEzYi4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9SRUFETUUub3B0aXBuZy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1OYW1lOiB6bGliCi1TdW1tYXJ5OiBBIGdlbmVyYWwtcHVycG9zZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkKLUF1dGhvcnM6IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKLU9yaWdpbmFsIHZlcnNpb246IDEuMi43Ci1MaWNlbnNlOiB6bGliCi1VUkw6IGh0dHA6Ly96bGliLm5ldC8KLQotQWx0ZXJlZCB2ZXJzaW9uOiAxLjIuNy1vcHRpcG5nCi1DaGFuZ2VzOgotLSBEZWZpbmVkIE5PX0daQ09NUFJFU1MgYW5kIE5PX0daSVAuCi0tIFNldCBUT09fRkFSIHRvIHRoZSBsYXJnZXN0IHBvc3NpYmxlIHZhbHVlLCBpbiB0aGUgaG9wZSB0aGF0IHpsaWIKLSAgd2lsbCBwcm9kdWNlIHNsaWdodGx5IGJldHRlci1jb21wcmVzc2VkIGRlZmxhdGUgc3RyZWFtcy4KLS0gQ2hhbmdlZCBaTElCX1ZFUlNJT04gdG8gIjEuMi43LW9wdGlwbmciIGFuZCBaTElCX1ZFUk5VTSB0byAweDEyN2YuCmRpZmYgLS1naXQgYS9zcmMvemxpYi9hZGxlcjMyLmMgYi9zcmMvemxpYi9hZGxlcjMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NjhmMDcuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvYWRsZXIzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qIGFkbGVyMzIuYyAtLSBjb21wdXRlIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiBhIGRhdGEgc3RyZWFtCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMSBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogQCgjKSAkSWQkICovCi0KLSNpbmNsdWRlICJ6dXRpbC5oIgotCi0jZGVmaW5lIGxvY2FsIHN0YXRpYwotCi1sb2NhbCB1TG9uZyBhZGxlcjMyX2NvbWJpbmVfIE9GKCh1TG9uZyBhZGxlcjEsIHVMb25nIGFkbGVyMiwgel9vZmY2NF90IGxlbjIpKTsKLQotI2RlZmluZSBCQVNFIDY1NTIxICAgICAgLyogbGFyZ2VzdCBwcmltZSBzbWFsbGVyIHRoYW4gNjU1MzYgKi8KLSNkZWZpbmUgTk1BWCA1NTUyCi0vKiBOTUFYIGlzIHRoZSBsYXJnZXN0IG4gc3VjaCB0aGF0IDI1NW4obisxKS8yICsgKG4rMSkoQkFTRS0xKSA8PSAyXjMyLTEgKi8KLQotI2RlZmluZSBETzEoYnVmLGkpICB7YWRsZXIgKz0gKGJ1ZilbaV07IHN1bTIgKz0gYWRsZXI7fQotI2RlZmluZSBETzIoYnVmLGkpICBETzEoYnVmLGkpOyBETzEoYnVmLGkrMSk7Ci0jZGVmaW5lIERPNChidWYsaSkgIERPMihidWYsaSk7IERPMihidWYsaSsyKTsKLSNkZWZpbmUgRE84KGJ1ZixpKSAgRE80KGJ1ZixpKTsgRE80KGJ1ZixpKzQpOwotI2RlZmluZSBETzE2KGJ1ZikgICBETzgoYnVmLDApOyBETzgoYnVmLDgpOwotCi0vKiB1c2UgTk9fRElWSURFIGlmIHlvdXIgcHJvY2Vzc29yIGRvZXMgbm90IGRvIGRpdmlzaW9uIGluIGhhcmR3YXJlIC0tCi0gICB0cnkgaXQgYm90aCB3YXlzIHRvIHNlZSB3aGljaCBpcyBmYXN0ZXIgKi8KLSNpZmRlZiBOT19ESVZJREUKLS8qIG5vdGUgdGhhdCB0aGlzIGFzc3VtZXMgQkFTRSBpcyA2NTUyMSwgd2hlcmUgNjU1MzYgJSA2NTUyMSA9PSAxNQotICAgKHRoYW5rIHlvdSB0byBKb2huIFJlaXNlciBmb3IgcG9pbnRpbmcgdGhpcyBvdXQpICovCi0jICBkZWZpbmUgQ0hPUChhKSBcCi0gICAgZG8geyBcCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgdG1wID0gYSA+PiAxNjsgXAotICAgICAgICBhICY9IDB4ZmZmZlVMOyBcCi0gICAgICAgIGEgKz0gKHRtcCA8PCA0KSAtIHRtcDsgXAotICAgIH0gd2hpbGUgKDApCi0jICBkZWZpbmUgTU9EMjgoYSkgXAotICAgIGRvIHsgXAotICAgICAgICBDSE9QKGEpOyBcCi0gICAgICAgIGlmIChhID49IEJBU0UpIGEgLT0gQkFTRTsgXAotICAgIH0gd2hpbGUgKDApCi0jICBkZWZpbmUgTU9EKGEpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgQ0hPUChhKTsgXAotICAgICAgICBNT0QyOChhKTsgXAotICAgIH0gd2hpbGUgKDApCi0jICBkZWZpbmUgTU9ENjMoYSkgXAotICAgIGRvIHsgLyogdGhpcyBhc3N1bWVzIGEgaXMgbm90IG5lZ2F0aXZlICovIFwKLSAgICAgICAgel9vZmY2NF90IHRtcCA9IGEgPj4gMzI7IFwKLSAgICAgICAgYSAmPSAweGZmZmZmZmZmTDsgXAotICAgICAgICBhICs9ICh0bXAgPDwgOCkgLSAodG1wIDw8IDUpICsgdG1wOyBcCi0gICAgICAgIHRtcCA9IGEgPj4gMTY7IFwKLSAgICAgICAgYSAmPSAweGZmZmZMOyBcCi0gICAgICAgIGEgKz0gKHRtcCA8PCA0KSAtIHRtcDsgXAotICAgICAgICB0bXAgPSBhID4+IDE2OyBcCi0gICAgICAgIGEgJj0gMHhmZmZmTDsgXAotICAgICAgICBhICs9ICh0bXAgPDwgNCkgLSB0bXA7IFwKLSAgICAgICAgaWYgKGEgPj0gQkFTRSkgYSAtPSBCQVNFOyBcCi0gICAgfSB3aGlsZSAoMCkKLSNlbHNlCi0jICBkZWZpbmUgTU9EKGEpIGEgJT0gQkFTRQotIyAgZGVmaW5lIE1PRDI4KGEpIGEgJT0gQkFTRQotIyAgZGVmaW5lIE1PRDYzKGEpIGEgJT0gQkFTRQotI2VuZGlmCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXVMb25nIFpFWFBPUlQgYWRsZXIzMihhZGxlciwgYnVmLCBsZW4pCi0gICAgdUxvbmcgYWRsZXI7Ci0gICAgY29uc3QgQnl0ZWYgKmJ1ZjsKLSAgICB1SW50IGxlbjsKLXsKLSAgICB1bnNpZ25lZCBsb25nIHN1bTI7Ci0gICAgdW5zaWduZWQgbjsKLQotICAgIC8qIHNwbGl0IEFkbGVyLTMyIGludG8gY29tcG9uZW50IHN1bXMgKi8KLSAgICBzdW0yID0gKGFkbGVyID4+IDE2KSAmIDB4ZmZmZjsKLSAgICBhZGxlciAmPSAweGZmZmY7Ci0KLSAgICAvKiBpbiBjYXNlIHVzZXIgbGlrZXMgZG9pbmcgYSBieXRlIGF0IGEgdGltZSwga2VlcCBpdCBmYXN0ICovCi0gICAgaWYgKGxlbiA9PSAxKSB7Ci0gICAgICAgIGFkbGVyICs9IGJ1ZlswXTsKLSAgICAgICAgaWYgKGFkbGVyID49IEJBU0UpCi0gICAgICAgICAgICBhZGxlciAtPSBCQVNFOwotICAgICAgICBzdW0yICs9IGFkbGVyOwotICAgICAgICBpZiAoc3VtMiA+PSBCQVNFKQotICAgICAgICAgICAgc3VtMiAtPSBCQVNFOwotICAgICAgICByZXR1cm4gYWRsZXIgfCAoc3VtMiA8PCAxNik7Ci0gICAgfQotCi0gICAgLyogaW5pdGlhbCBBZGxlci0zMiB2YWx1ZSAoZGVmZXJyZWQgY2hlY2sgZm9yIGxlbiA9PSAxIHNwZWVkKSAqLwotICAgIGlmIChidWYgPT0gWl9OVUxMKQotICAgICAgICByZXR1cm4gMUw7Ci0KLSAgICAvKiBpbiBjYXNlIHNob3J0IGxlbmd0aHMgYXJlIHByb3ZpZGVkLCBrZWVwIGl0IHNvbWV3aGF0IGZhc3QgKi8KLSAgICBpZiAobGVuIDwgMTYpIHsKLSAgICAgICAgd2hpbGUgKGxlbi0tKSB7Ci0gICAgICAgICAgICBhZGxlciArPSAqYnVmKys7Ci0gICAgICAgICAgICBzdW0yICs9IGFkbGVyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhZGxlciA+PSBCQVNFKQotICAgICAgICAgICAgYWRsZXIgLT0gQkFTRTsKLSAgICAgICAgTU9EMjgoc3VtMik7ICAgICAgICAgICAgLyogb25seSBhZGRlZCBzbyBtYW55IEJBU0UncyAqLwotICAgICAgICByZXR1cm4gYWRsZXIgfCAoc3VtMiA8PCAxNik7Ci0gICAgfQotCi0gICAgLyogZG8gbGVuZ3RoIE5NQVggYmxvY2tzIC0tIHJlcXVpcmVzIGp1c3Qgb25lIG1vZHVsbyBvcGVyYXRpb24gKi8KLSAgICB3aGlsZSAobGVuID49IE5NQVgpIHsKLSAgICAgICAgbGVuIC09IE5NQVg7Ci0gICAgICAgIG4gPSBOTUFYIC8gMTY7ICAgICAgICAgIC8qIE5NQVggaXMgZGl2aXNpYmxlIGJ5IDE2ICovCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIERPMTYoYnVmKTsgICAgICAgICAgLyogMTYgc3VtcyB1bnJvbGxlZCAqLwotICAgICAgICAgICAgYnVmICs9IDE2OwotICAgICAgICB9IHdoaWxlICgtLW4pOwotICAgICAgICBNT0QoYWRsZXIpOwotICAgICAgICBNT0Qoc3VtMik7Ci0gICAgfQotCi0gICAgLyogZG8gcmVtYWluaW5nIGJ5dGVzIChsZXNzIHRoYW4gTk1BWCwgc3RpbGwganVzdCBvbmUgbW9kdWxvKSAqLwotICAgIGlmIChsZW4pIHsgICAgICAgICAgICAgICAgICAvKiBhdm9pZCBtb2R1bG9zIGlmIG5vbmUgcmVtYWluaW5nICovCi0gICAgICAgIHdoaWxlIChsZW4gPj0gMTYpIHsKLSAgICAgICAgICAgIGxlbiAtPSAxNjsKLSAgICAgICAgICAgIERPMTYoYnVmKTsKLSAgICAgICAgICAgIGJ1ZiArPSAxNjsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAobGVuLS0pIHsKLSAgICAgICAgICAgIGFkbGVyICs9ICpidWYrKzsKLSAgICAgICAgICAgIHN1bTIgKz0gYWRsZXI7Ci0gICAgICAgIH0KLSAgICAgICAgTU9EKGFkbGVyKTsKLSAgICAgICAgTU9EKHN1bTIpOwotICAgIH0KLQotICAgIC8qIHJldHVybiByZWNvbWJpbmVkIHN1bXMgKi8KLSAgICByZXR1cm4gYWRsZXIgfCAoc3VtMiA8PCAxNik7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWxvY2FsIHVMb25nIGFkbGVyMzJfY29tYmluZV8oYWRsZXIxLCBhZGxlcjIsIGxlbjIpCi0gICAgdUxvbmcgYWRsZXIxOwotICAgIHVMb25nIGFkbGVyMjsKLSAgICB6X29mZjY0X3QgbGVuMjsKLXsKLSAgICB1bnNpZ25lZCBsb25nIHN1bTE7Ci0gICAgdW5zaWduZWQgbG9uZyBzdW0yOwotICAgIHVuc2lnbmVkIHJlbTsKLQotICAgIC8qIGZvciBuZWdhdGl2ZSBsZW4sIHJldHVybiBpbnZhbGlkIGFkbGVyMzIgYXMgYSBjbHVlIGZvciBkZWJ1Z2dpbmcgKi8KLSAgICBpZiAobGVuMiA8IDApCi0gICAgICAgIHJldHVybiAweGZmZmZmZmZmVUw7Ci0KLSAgICAvKiB0aGUgZGVyaXZhdGlvbiBvZiB0aGlzIGZvcm11bGEgaXMgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlciAqLwotICAgIE1PRDYzKGxlbjIpOyAgICAgICAgICAgICAgICAvKiBhc3N1bWVzIGxlbjIgPj0gMCAqLwotICAgIHJlbSA9ICh1bnNpZ25lZClsZW4yOwotICAgIHN1bTEgPSBhZGxlcjEgJiAweGZmZmY7Ci0gICAgc3VtMiA9IHJlbSAqIHN1bTE7Ci0gICAgTU9EKHN1bTIpOwotICAgIHN1bTEgKz0gKGFkbGVyMiAmIDB4ZmZmZikgKyBCQVNFIC0gMTsKLSAgICBzdW0yICs9ICgoYWRsZXIxID4+IDE2KSAmIDB4ZmZmZikgKyAoKGFkbGVyMiA+PiAxNikgJiAweGZmZmYpICsgQkFTRSAtIHJlbTsKLSAgICBpZiAoc3VtMSA+PSBCQVNFKSBzdW0xIC09IEJBU0U7Ci0gICAgaWYgKHN1bTEgPj0gQkFTRSkgc3VtMSAtPSBCQVNFOwotICAgIGlmIChzdW0yID49IChCQVNFIDw8IDEpKSBzdW0yIC09IChCQVNFIDw8IDEpOwotICAgIGlmIChzdW0yID49IEJBU0UpIHN1bTIgLT0gQkFTRTsKLSAgICByZXR1cm4gc3VtMSB8IChzdW0yIDw8IDE2KTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmUoYWRsZXIxLCBhZGxlcjIsIGxlbjIpCi0gICAgdUxvbmcgYWRsZXIxOwotICAgIHVMb25nIGFkbGVyMjsKLSAgICB6X29mZl90IGxlbjI7Ci17Ci0gICAgcmV0dXJuIGFkbGVyMzJfY29tYmluZV8oYWRsZXIxLCBhZGxlcjIsIGxlbjIpOwotfQotCi11TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZTY0KGFkbGVyMSwgYWRsZXIyLCBsZW4yKQotICAgIHVMb25nIGFkbGVyMTsKLSAgICB1TG9uZyBhZGxlcjI7Ci0gICAgel9vZmY2NF90IGxlbjI7Ci17Ci0gICAgcmV0dXJuIGFkbGVyMzJfY29tYmluZV8oYWRsZXIxLCBhZGxlcjIsIGxlbjIpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvYW1pZ2EvTWFrZWZpbGUucHVwIGIvc3JjL3psaWIvYW1pZ2EvTWFrZWZpbGUucHVwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTQwYzEyLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2FtaWdhL01ha2VmaWxlLnB1cAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMgQW1pZ2EgcG93ZXJVUCAoVE0pIE1ha2VmaWxlCi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgYW5kIFNBUyBDIFY2LjU4LzcuMDAgUFBDIGNvbXBpbGVyCi0jIENvcHlyaWdodCAoQykgMTk5OCBieSBBbmRyZWFzIFIuIEtsZWluZXJ0Ci0KLUxJQk5BTUUJPSBsaWJ6aXAuYQotCi1DQwk9IHNjcHBjCi1DRkxBR1MJPSBOT1NUS0NISyBOT1NJTlQgT1BUSU1JWkUgT1BUR08gT1BUUEVFUCBPUFRJTkxPQ0FMIE9QVElOTCBcCi0JICBPUFRMT09QIE9QVFJERVA9OCBPUFRERVA9OCBPUFRDT01QPTggTk9WRVIKLUFSCT0gcHBjLWFtaWdhb3MtYXIgY3IKLVJBTkxJQgk9IHBwYy1hbWlnYW9zLXJhbmxpYgotTEQJPSBwcGMtYW1pZ2Fvcy1sZCAtcgotTERGTEFHUwk9IC1vCi1MRExJQlMJPSBMSUI6c2NwcGMuYSBMSUI6ZW5kLm8KLVJNCT0gZGVsZXRlIHF1aWV0Ci0KLU9CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6Y2xvc2UubyBnemxpYi5vIGd6cmVhZC5vIGd6d3JpdGUubyBcCi0gICAgICAgdW5jb21wci5vIGRlZmxhdGUubyB0cmVlcy5vIHp1dGlsLm8gaW5mbGF0ZS5vIGluZmJhY2subyBpbmZ0cmVlcy5vIGluZmZhc3QubwotCi1URVNUX09CSlMgPSBleGFtcGxlLm8gbWluaWd6aXAubwotCi1hbGw6IGV4YW1wbGUgbWluaWd6aXAKLQotY2hlY2s6IHRlc3QKLXRlc3Q6IGFsbAotCWV4YW1wbGUKLQllY2hvIGhlbGxvIHdvcmxkIHwgbWluaWd6aXAgfCBtaW5pZ3ppcCAtZAotCi0kKExJQk5BTUUpOiAkKE9CSlMpCi0JJChBUikgJEAgJChPQkpTKQotCS0kKFJBTkxJQikgJEAKLQotZXhhbXBsZTogZXhhbXBsZS5vICQoTElCTkFNRSkKLQkkKExEKSAkKExERkxBR1MpICRAIExJQjpjX3BwYy5vICRALm8gJChMSUJOQU1FKSAkKExETElCUykKLQotbWluaWd6aXA6IG1pbmlnemlwLm8gJChMSUJOQU1FKQotCSQoTEQpICQoTERGTEFHUykgJEAgTElCOmNfcHBjLm8gJEAubyAkKExJQk5BTUUpICQoTERMSUJTKQotCi1tb3N0bHljbGVhbjogY2xlYW4KLWNsZWFuOgotCSQoUk0pICoubyBleGFtcGxlIG1pbmlnemlwICQoTElCTkFNRSkgZm9vLmd6Ci0KLXppcDoKLQl6aXAgLXVsOSB6bGliIFJFQURNRSBDaGFuZ2VMb2cgTWFrZWZpbGUgTWFrZT8/Pz8uPz8/IE1ha2VmaWxlLj8/IFwKLQkgIGRlc2NyaXAubW1zICouW2NoXQotCi10Z3o6Ci0JY2QgLi47IHRhciBjZnogemxpYi96bGliLnRneiB6bGliL1JFQURNRSB6bGliL0NoYW5nZUxvZyB6bGliL01ha2VmaWxlIFwKLQkgIHpsaWIvTWFrZT8/Pz8uPz8/IHpsaWIvTWFrZWZpbGUuPz8gemxpYi9kZXNjcmlwLm1tcyB6bGliLyouW2NoXQotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLWFkbGVyMzIubzogemxpYi5oIHpjb25mLmgKLWNvbXByZXNzLm86IHpsaWIuaCB6Y29uZi5oCi1jcmMzMi5vOiBjcmMzMi5oIHpsaWIuaCB6Y29uZi5oCi1kZWZsYXRlLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1leGFtcGxlLm86IHpsaWIuaCB6Y29uZi5oCi1nemNsb3NlLm86IHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCi1nemxpYi5vOiB6bGliLmggemNvbmYuaCBnemd1dHMuaAotZ3pyZWFkLm86IHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCi1nendyaXRlLm86IHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCi1pbmZmYXN0Lm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCi1pbmZsYXRlLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCi1pbmZiYWNrLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCi1pbmZ0cmVlcy5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKLW1pbmlnemlwLm86IHpsaWIuaCB6Y29uZi5oCi10cmVlcy5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaCB0cmVlcy5oCi11bmNvbXByLm86IHpsaWIuaCB6Y29uZi5oCi16dXRpbC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCmRpZmYgLS1naXQgYS9zcmMvemxpYi9hbWlnYS9NYWtlZmlsZS5zYXMgYi9zcmMvemxpYi9hbWlnYS9NYWtlZmlsZS5zYXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OWUyOTEuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvYW1pZ2EvTWFrZWZpbGUuc2FzCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotIyBTTWFrZWZpbGUgZm9yIHpsaWIKLSMgTW9kaWZpZWQgZnJvbSB0aGUgc3RhbmRhcmQgVU5JWCBNYWtlZmlsZSBDb3B5cmlnaHQgSmVhbi1sb3VwIEdhaWxseQotIyBPc21hIEFodmVubGFtcGkgPE9zbWEuQWh2ZW5sYW1waUBodXQuZmk+Ci0jIEFtaWdhLCBTQVMvQyA2LjU2ICYgU21ha2UKLQotQ0M9c2MKLUNGTEFHUz1PUFQKLSNDRkxBR1M9T1BUIENQVT02ODAzMAotI0NGTEFHUz1ERUJVRz1MSU5FCi1MREZMQUdTPUxJQiB6LmxpYgotCi1TQ09QVElPTlM9T1BUU0NIRUQgT1BUSU5MSU5FIE9QVEFMSUFTIE9QVFRJTUUgT1BUSU5MT0NBTCBTVFJNRVJHRSBcCi0gICAgICAgTk9JQ09OUyBQQVJNUz1CT1RIIE5PU1RBQ0tDSEVDSyBVVElMTElCIE5PVkVSU0lPTiBFUlJPUlJFWFggXAotICAgICAgIERFRj1QT1NUSU5DCi0KLU9CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6Y2xvc2UubyBnemxpYi5vIGd6cmVhZC5vIGd6d3JpdGUubyBcCi0gICAgICAgdW5jb21wci5vIGRlZmxhdGUubyB0cmVlcy5vIHp1dGlsLm8gaW5mbGF0ZS5vIGluZmJhY2subyBpbmZ0cmVlcy5vIGluZmZhc3QubwotCi1URVNUX09CSlMgPSBleGFtcGxlLm8gbWluaWd6aXAubwotCi1hbGw6IFNDT1BUSU9OUyBleGFtcGxlIG1pbmlnemlwCi0KLWNoZWNrOiB0ZXN0Ci10ZXN0OiBhbGwKLQlleGFtcGxlCi0JZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwIHwgbWluaWd6aXAgLWQKLQotaW5zdGFsbDogei5saWIKLQljb3B5IGNsb25lIHpsaWIuaCB6Y29uZi5oIElOQ0xVREU6Ci0JY29weSBjbG9uZSB6LmxpYiBMSUI6Ci0KLXoubGliOiAkKE9CSlMpCi0Jb21sIHoubGliIHIgJChPQkpTKQotCi1leGFtcGxlOiBleGFtcGxlLm8gei5saWIKLQkkKENDKSAkKENGTEFHUykgTElOSyBUTyAkQCBleGFtcGxlLm8gJChMREZMQUdTKQotCi1taW5pZ3ppcDogbWluaWd6aXAubyB6LmxpYgotCSQoQ0MpICQoQ0ZMQUdTKSBMSU5LIFRPICRAIG1pbmlnemlwLm8gJChMREZMQUdTKQotCi1tb3N0bHljbGVhbjogY2xlYW4KLWNsZWFuOgotCS1kZWxldGUgZm9yY2UgcXVpZXQgZXhhbXBsZSBtaW5pZ3ppcCAqLm8gei5saWIgZm9vLmd6ICoubG5rIFNDT1BUSU9OUwotCi1TQ09QVElPTlM6IE1ha2VmaWxlLnNhcwotCWNvcHkgdG8gJEAgPGZyb20gPAotJChTQ09QVElPTlMpCi08Ci0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotYWRsZXIzMi5vOiB6bGliLmggemNvbmYuaAotY29tcHJlc3MubzogemxpYi5oIHpjb25mLmgKLWNyYzMyLm86IGNyYzMyLmggemxpYi5oIHpjb25mLmgKLWRlZmxhdGUubzogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWV4YW1wbGUubzogemxpYi5oIHpjb25mLmgKLWd6Y2xvc2UubzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLWd6bGliLm86IHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCi1nenJlYWQubzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLWd6d3JpdGUubzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLWluZmZhc3QubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKLWluZmxhdGUubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKLWluZmJhY2subzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKLWluZnRyZWVzLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAotbWluaWd6aXAubzogemxpYi5oIHpjb25mLmgKLXRyZWVzLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIHRyZWVzLmgKLXVuY29tcHIubzogemxpYi5oIHpjb25mLmgKLXp1dGlsLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmgKZGlmZiAtLWdpdCBhL3NyYy96bGliL2FzNDAwL2JuZHNyYyBiL3NyYy96bGliL2FzNDAwL2JuZHNyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJjYzY2MS4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9hczQwMC9ibmRzcmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotU1RSUEdNRVhQIFBHTUxWTCgqQ1VSUkVOVCkgU0lHTkFUVVJFKCdaTElCJykKLQotLypAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAqLwotLyogICBWZXJzaW9uIDEuMS4zIGVudHJ5IHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLypAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICpNT0RVTEUgICAgICBBRExFUjMyICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRVhQT1JUIFNZTUJPTCgiYWRsZXIzMiIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgKk1PRFVMRSAgICAgIENPTVBSRVNTICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBFWFBPUlQgU1lNQk9MKCJjb21wcmVzcyIpCi0gIEVYUE9SVCBTWU1CT0woImNvbXByZXNzMiIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgKk1PRFVMRSAgICAgIENSQzMyICAgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBFWFBPUlQgU1lNQk9MKCJjcmMzMiIpCi0gIEVYUE9SVCBTWU1CT0woImdldF9jcmNfdGFibGUiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICpNT0RVTEUgICAgICBERUZMQVRFICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRVhQT1JUIFNZTUJPTCgiZGVmbGF0ZSIpCi0gIEVYUE9SVCBTWU1CT0woImRlZmxhdGVFbmQiKQotICBFWFBPUlQgU1lNQk9MKCJkZWZsYXRlU2V0RGljdGlvbmFyeSIpCi0gIEVYUE9SVCBTWU1CT0woImRlZmxhdGVDb3B5IikKLSAgRVhQT1JUIFNZTUJPTCgiZGVmbGF0ZVJlc2V0IikKLSAgRVhQT1JUIFNZTUJPTCgiZGVmbGF0ZVBhcmFtcyIpCi0gIEVYUE9SVCBTWU1CT0woImRlZmxhdGVQcmltZSIpCi0gIEVYUE9SVCBTWU1CT0woImRlZmxhdGVJbml0XyIpCi0gIEVYUE9SVCBTWU1CT0woImRlZmxhdGVJbml0Ml8iKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICpNT0RVTEUgICAgICBHWklPICAgICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRVhQT1JUIFNZTUJPTCgiZ3pvcGVuIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3pkb3BlbiIpCi0gIEVYUE9SVCBTWU1CT0woImd6c2V0cGFyYW1zIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3pyZWFkIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3p3cml0ZSIpCi0gIEVYUE9SVCBTWU1CT0woImd6cHJpbnRmIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3pwdXRzIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3pnZXRzIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3pwdXRjIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3pnZXRjIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3pmbHVzaCIpCi0gIEVYUE9SVCBTWU1CT0woImd6c2VlayIpCi0gIEVYUE9SVCBTWU1CT0woImd6cmV3aW5kIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3p0ZWxsIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3plb2YiKQotICBFWFBPUlQgU1lNQk9MKCJnemNsb3NlIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3plcnJvciIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgKk1PRFVMRSAgICAgIElORkxBVEUgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlIikKLSAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZUVuZCIpCi0gIEVYUE9SVCBTWU1CT0woImluZmxhdGVTZXREaWN0aW9uYXJ5IikKLSAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZVN5bmMiKQotICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlUmVzZXQiKQotICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlSW5pdF8iKQotICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlSW5pdDJfIikKLSAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZVN5bmNQb2ludCIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgKk1PRFVMRSAgICAgIFVOQ09NUFIgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBFWFBPUlQgU1lNQk9MKCJ1bmNvbXByZXNzIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAqTU9EVUxFICAgICAgWlVUSUwgICAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEVYUE9SVCBTWU1CT0woInpsaWJWZXJzaW9uIikKLSAgRVhQT1JUIFNZTUJPTCgiekVycm9yIikKLQotLypAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAqLwotLyogICBWZXJzaW9uIDEuMi4xIGFkZGl0aW9uYWwgZW50cnkgcG9pbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLypAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICpNT0RVTEUgICAgICBDT01QUkVTUyAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRVhQT1JUIFNZTUJPTCgiY29tcHJlc3NCb3VuZCIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgKk1PRFVMRSAgICAgIERFRkxBVEUgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBFWFBPUlQgU1lNQk9MKCJkZWZsYXRlQm91bmQiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICpNT0RVTEUgICAgICBHWklPICAgICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRVhQT1JUIFNZTUJPTCgiZ3p1bmdldGMiKQotICBFWFBPUlQgU1lNQk9MKCJnemNsZWFyZXJyIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAqTU9EVUxFICAgICAgSU5GQkFDSyAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEVYUE9SVCBTWU1CT0woImluZmxhdGVCYWNrIikKLSAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZUJhY2tFbmQiKQotICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlQmFja0luaXRfIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAqTU9EVUxFICAgICAgSU5GTEFURSAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEVYUE9SVCBTWU1CT0woImluZmxhdGVDb3B5IikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAqTU9EVUxFICAgICAgWlVUSUwgICAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEVYUE9SVCBTWU1CT0woInpsaWJDb21waWxlRmxhZ3MiKQotCi0vKkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCovCi0vKiAgIFZlcnNpb24gMS4yLjUgYWRkaXRpb25hbCBlbnRyeSBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgKk1PRFVMRSAgICAgIEFETEVSMzIgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBFWFBPUlQgU1lNQk9MKCJhZGxlcjMyX2NvbWJpbmUiKQotICBFWFBPUlQgU1lNQk9MKCJhZGxlcjMyX2NvbWJpbmU2NCIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgKk1PRFVMRSAgICAgIENSQzMyICAgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBFWFBPUlQgU1lNQk9MKCJjcmMzMl9jb21iaW5lIikKLSAgRVhQT1JUIFNZTUJPTCgiY3JjMzJfY29tYmluZTY0IikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAqTU9EVUxFICAgICAgR1pMSUIgICAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEVYUE9SVCBTWU1CT0woImd6YnVmZmVyIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3pvZmZzZXQiKQotICBFWFBPUlQgU1lNQk9MKCJnem9mZnNldDY0IikKLSAgRVhQT1JUIFNZTUJPTCgiZ3pvcGVuNjQiKQotICBFWFBPUlQgU1lNQk9MKCJnenNlZWs2NCIpCi0gIEVYUE9SVCBTWU1CT0woImd6dGVsbDY0IikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAqTU9EVUxFICAgICAgR1pSRUFEICAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEVYUE9SVCBTWU1CT0woImd6Y2xvc2VfciIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgKk1PRFVMRSAgICAgIEdaV1JJVEUgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBFWFBPUlQgU1lNQk9MKCJnemNsb3NlX3ciKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICpNT0RVTEUgICAgICBJTkZMQVRFICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZU1hcmsiKQotICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlUHJpbWUiKQotICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlUmVzZXQyIikKLSAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZVVuZGVybWluZSIpCi0KLS8qQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAKi8KLS8qICAgVmVyc2lvbiAxLjIuNiBhZGRpdGlvbmFsIGVudHJ5IHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAqTU9EVUxFICAgICAgREVGTEFURSAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEVYUE9SVCBTWU1CT0woImRlZmxhdGVSZXNldEtlZXAiKQotICBFWFBPUlQgU1lNQk9MKCJkZWZsYXRlUGVuZGluZyIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgKk1PRFVMRSAgICAgIEdaV1JJVEUgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBFWFBPUlQgU1lNQk9MKCJnemdldGNfIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAqTU9EVUxFICAgICAgSU5GTEFURSAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEVYUE9SVCBTWU1CT0woImluZmxhdGVSZXNldEtlZXAiKQotCi1FTkRQR01FWFAKZGlmZiAtLWdpdCBhL3NyYy96bGliL2FzNDAwL2NvbXBpbGUuY2xwIGIvc3JjL3psaWIvYXM0MDAvY29tcGlsZS5jbHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMGM1OGYuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvYXM0MDAvY29tcGlsZS5jbHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgWkxJQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENvbXBpbGUgc291cmNlcyBpbnRvIG1vZHVsZXMgYW5kIGxpbmsgdGhlbSBpbnRvIGEgc2VydmljZSBwcm9ncmFtLiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgICAgICAgIFBHTQotCi0vKiAgICAgIENvbmZpZ3VyYXRpb24gYWRqdXN0YWJsZSBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgRENMICAgICAgICBWQVIoJlNSQ0xJQikgVFlQRSgqQ0hBUikgTEVOKDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFKCdaTElCJykgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlIGxpYnJhcnkuICovCi0gICAgICAgICAgICAgRENMICAgICAgICBWQVIoJlNSQ0ZJTEUpIFRZUEUoKkNIQVIpIExFTigxMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSgnU09VUkNFUycpICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSBtZW1iZXIgZmlsZS4gKi8KLSAgICAgICAgICAgICBEQ0wgICAgICAgIFZBUigmQ1RMRklMRSkgVFlQRSgqQ0hBUikgTEVOKDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFKCdUT09MUycpICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udHJvbCBtZW1iZXIgZmlsZS4gKi8KLQotICAgICAgICAgICAgIERDTCAgICAgICAgVkFSKCZNT0RMSUIpIFRZUEUoKkNIQVIpIExFTigxMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSgnWkxJQicpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vZHVsZSBsaWJyYXJ5LiAqLwotCi0gICAgICAgICAgICAgRENMICAgICAgICBWQVIoJlNSVkxJQikgVFlQRSgqQ0hBUikgTEVOKDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFKCdMR1BMJykgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VydmljZSBwcm9ncmFtIGxpYnJhcnkuICovCi0KLSAgICAgICAgICAgICBEQ0wgICAgICAgIFZBUigmQ0ZMQUdTKSBUWVBFKCpDSEFSKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFKCdPUFRJTUlaRSg0MCknKSAgICAgICAgICAgICAgICAgLyogQ29tcGlsZSBvcHRpb25zLiAqLwotCi0gICAgICAgICAgICAgRENMICAgICAgICBWQVIoJlRHVFJMUykgVFlQRSgqQ0hBUikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSgnVjVSM00wJykgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhcmdldCByZWxlYXNlLiAqLwotCi0KLS8qICAgICAgV29ya2luZyBzdG9yYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICBEQ0wgICAgICAgIFZBUigmQ01ETEVOKSBUWVBFKCpERUMpIExFTigxNSA1KSBWQUxVRSgzMDApICAgIC8qIENvbW1hbmQgbGVuZ3RoLiAqLwotICAgICAgICAgICAgIERDTCAgICAgICAgVkFSKCZDTUQpIFRZUEUoKkNIQVIpIExFTig1MTIpCi0gICAgICAgICAgICAgRENMICAgICAgICBWQVIoJkZJWERDTUQpIFRZUEUoKkNIQVIpIExFTig1MTIpCi0KLQotLyogICAgICBDb21waWxlIHNvdXJjZXMgaW50byBtb2R1bGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZGSVhEQ01EKSBWQUxVRSgnQ1JUQ01PRCcgKkJDQVQgJkNGTEFHUyAqQkNBVCAgICAgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICdTWVNJRkNPUFQoKklGUzY0SU8pJyAqQkNBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAnREVGSU5FKCcnX0xBUkdFRklMRTY0X1NPVVJDRScnJyAqQkNBVCAgICAgICAgICAgICAgICAgKwotICAgICAgICAgICAgICAgICAgICAgICAgJycnX0xGUzY0X0xBUkdFRklMRT0xJycpIFRHVFJMUygnICpUQ0FUICZUR1RSTFMgKlRDQVQgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICcpIFNSQ0ZJTEUoJyAqVENBVCAmU1JDTElCICpUQ0FUICcvJyAqVENBVCAgICAgICAgICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAmU1JDRklMRSAqVENBVCAnKSBNT0RVTEUoJyAqVENBVCAmTU9ETElCICpUQ0FUICcvJykKLQotCi0gICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJkZJWERDTUQgKlRDQVQgJ0FETEVSMzIpJykKLSAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKLQotICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdDT01QUkVTUyknKQotICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQotCi0gICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJkZJWERDTUQgKlRDQVQgJ0NSQzMyKScpCi0gICAgICAgICAgICAgQ0FMTCAgICAgICBQR00oUUNNREVYQykgUEFSTSgmQ01EICZDTURMRU4pCi0KLSAgICAgICAgICAgICBDSEdWQVIgICAgIFZBUigmQ01EKSBWQUxVRSgmRklYRENNRCAqVENBVCAnREVGTEFURSknKQotICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQotCi0gICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJkZJWERDTUQgKlRDQVQgJ0daQ0xPU0UpJykKLSAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKLQotICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdHWkxJQiknKQotICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQotCi0gICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJkZJWERDTUQgKlRDQVQgJ0daUkVBRCknKQotICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQotCi0gICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJkZJWERDTUQgKlRDQVQgJ0daV1JJVEUpJykKLSAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKLQotICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdJTkZCQUNLKScpCi0gICAgICAgICAgICAgQ0FMTCAgICAgICBQR00oUUNNREVYQykgUEFSTSgmQ01EICZDTURMRU4pCi0KLSAgICAgICAgICAgICBDSEdWQVIgICAgIFZBUigmQ01EKSBWQUxVRSgmRklYRENNRCAqVENBVCAnSU5GRkFTVCknKQotICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQotCi0gICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJkZJWERDTUQgKlRDQVQgJ0lORkxBVEUpJykKLSAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKLQotICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdJTkZUUkVFUyknKQotICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQotCi0gICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJkZJWERDTUQgKlRDQVQgJ1RSRUVTKScpCi0gICAgICAgICAgICAgQ0FMTCAgICAgICBQR00oUUNNREVYQykgUEFSTSgmQ01EICZDTURMRU4pCi0KLSAgICAgICAgICAgICBDSEdWQVIgICAgIFZBUigmQ01EKSBWQUxVRSgmRklYRENNRCAqVENBVCAnVU5DT01QUiknKQotICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQotCi0gICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJkZJWERDTUQgKlRDQVQgJ1pVVElMKScpCi0gICAgICAgICAgICAgQ0FMTCAgICAgICBQR00oUUNNREVYQykgUEFSTSgmQ01EICZDTURMRU4pCi0KLQotLyogICAgICBMaW5rIG1vZHVsZXMgaW50byBhIHNlcnZpY2UgcHJvZ3JhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgIENSVFNSVlBHTSAgU1JWUEdNKCZTUlZMSUIvWkxJQikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RVTEUoJk1PRExJQi9BRExFUjMyICAgICAmTU9ETElCL0NPTVBSRVNTICAgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNT0RMSUIvQ1JDMzIgICAgICAgJk1PRExJQi9ERUZMQVRFICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTU9ETElCL0daQ0xPU0UgICAgICZNT0RMSUIvR1pMSUIgICAgICAgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1PRExJQi9HWlJFQUQgICAgICAmTU9ETElCL0daV1JJVEUgICAgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNT0RMSUIvSU5GQkFDSyAgICAgJk1PRExJQi9JTkZGQVNUICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTU9ETElCL0lORkxBVEUgICAgICZNT0RMSUIvSU5GVFJFRVMgICAgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1PRExJQi9UUkVFUyAgICAgICAmTU9ETElCL1VOQ09NUFIgICAgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNT0RMSUIvWlVUSUwpICAgICAgICAgICAgICAgICAgICAgICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNSQ0ZJTEUoJlNSQ0xJQi8mQ1RMRklMRSkgU1JDTUJSKEJORFNSQykgICAgICAgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBURVhUKCdaTElCIDEuMi43JykgVEdUUkxTKCZUR1RSTFMpCi0KLSAgICAgICAgICAgICBFTkRQR00KZGlmZiAtLWdpdCBhL3NyYy96bGliL2FzNDAwL3JlYWRtZS50eHQgYi9zcmMvemxpYi9hczQwMC9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2NkMWI4Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2FzNDAwL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotICAgICAgICBaTElCIHZlcnNpb24gMS4yLjcgZm9yIEFTNDAwIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMKLQotSSkgRnJvbSBhbiBBUzQwMCAqU0FWRiBmaWxlOgotCi0xKSAgICAgIFVucGFja2luZyBhcmNoaXZlIHRvIGFuIEFTNDAwIHNhdmUgZmlsZQotCi1PbiB0aGUgQVM0MDA6Ci0KLV8gICAgICAgQ3JlYXRlIHRoZSBaTElCIEFTNDAwIGxpYnJhcnk6Ci0KLSAgICAgICAgQ1JUTElCIExJQihaTElCKSBUWVBFKCpQUk9EKSBURVhUKCdaTElCIGNvbXByZXNzaW9uIEFQSSBsaWJyYXJ5JykKLQotXyAgICAgICBDcmVhdGUgYSB3b3JrIHNhdmUgZmlsZSwgZm9yIGV4YW1wbGU6Ci0KLSAgICAgICAgICAgICAgICBDUlRTQVZGIEZJTEUoWkxJQi9aTElCU0FWRikKLQotT24gYSBQQyBjb25uZWN0ZWQgdG8gdGhlIHRhcmdldCBBUzQwMDoKLQotXyAgICAgICBVbnBhY2sgdGhlIHNhdmUgZmlsZSBpbWFnZSB0byBhIFBDIGZpbGUgIlpMSUJTQVZGIgotXyAgICAgICBVcGxvYWQgdGhpcyBmaWxlIGludG8gdGhlIHNhdmUgZmlsZSBvbiB0aGUgQVM0MDAsIGZvciBleGFtcGxlCi0gICAgICAgICAgICAgICAgdXNpbmcgZnRwIGluIEJJTkFSWSBtb2RlLgotCi0KLTIpICAgICAgUG9wdWxhdGluZyB0aGUgWkxJQiBBUzQwMCBzb3VyY2UgbGlicmFyeQotCi1PbiB0aGUgQVM0MDA6Ci0KLV8gICAgICAgRXh0cmFjdCB0aGUgc2F2ZWQgb2JqZWN0cyBpbnRvIHRoZSBaTElCIEFTNDAwIGxpYnJhcnkgdXNpbmc6Ci0KLVJTVE9CSiBPQkooKkFMTCkgU0FWTElCKFpMSUIpIERFVigqU0FWRikgU0FWRihaTElCL1pMSUJTQVZGKSBSU1RMSUIoWkxJQikKLQotCi0zKSAgICAgIEN1c3RvbWl6ZSBpbnN0YWxsYXRpb246Ci0KLV8gICAgICAgRWRpdCBDTCBtZW1iZXIgWkxJQi9UT09MUyhDT01QSUxFKSBhbmQgY2hhbmdlIHBhcmFtZXRlcnMgaWYgbmVlZGVkLAotICAgICAgICAgICAgICAgIGFjY29yZGluZyB0byB0aGUgY29tbWVudHMuCi0KLV8gICAgICAgQ29tcGlsZSB0aGlzIG1lbWJlciB3aXRoOgotCi0gICAgICAgIENSVENMUEdNIFBHTShaTElCL0NPTVBJTEUpIFNSQ0ZJTEUoWkxJQi9UT09MUykgU1JDTUJSKENPTVBJTEUpCi0KLQotNCkgICAgICBDb21waWxlIGFuZCBnZW5lcmF0ZSB0aGUgc2VydmljZSBwcm9ncmFtOgotCi1fICAgICAgIFRoaXMgY2FuIG5vdyBiZSBkb25lIGJ5IGV4ZWN1dGluZzoKLQotICAgICAgICBDQUxMIFBHTShaTElCL0NPTVBJTEUpCi0KLQotCi1JSSkgRnJvbSB0aGUgb3JpZ2luYWwgc291cmNlIGRpc3RyaWJ1dGlvbjoKLQotMSkgICAgICBPbiB0aGUgQVM0MDAsIGNyZWF0ZSB0aGUgc291cmNlIGxpYnJhcnk6Ci0KLSAgICAgICAgQ1JUTElCIExJQihaTElCKSBUWVBFKCpQUk9EKSBURVhUKCdaTElCIGNvbXByZXNzaW9uIEFQSSBsaWJyYXJ5JykKLQotMikgICAgICBDcmVhdGUgdGhlIHNvdXJjZSBmaWxlczoKLQotICAgICAgICBDUlRTUkNQRiBGSUxFKFpMSUIvU09VUkNFUykgUkNETEVOKDExMikgVEVYVCgnWkxJQiBsaWJyYXJ5IG1vZHVsZXMnKQotICAgICAgICBDUlRTUkNQRiBGSUxFKFpMSUIvSCkgICAgICAgUkNETEVOKDExMikgVEVYVCgnWkxJQiBsaWJyYXJ5IGluY2x1ZGVzJykKLSAgICAgICAgQ1JUU1JDUEYgRklMRShaTElCL1RPT0xTKSAgIFJDRExFTigxMTIpIFRFWFQoJ1pMSUIgbGlicmFyeSBjb250cm9sIHV0aWxpdGllcycpCi0KLTMpICAgICAgRnJvbSB0aGUgbWFjaGluZSBob3N0aW5nIHRoZSBkaXN0cmlidXRpb24gZmlsZXMsIHVwbG9hZCB0aGVtICh3aXRoCi0gICAgICAgICAgICAgICAgRlRQIGluIHRleHQgbW9kZSwgZm9yIGV4YW1wbGUpIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHRhYmxlOgotCi0gICAgT3JpZ2luYWwgICAgQVM0MDAgICBBUzQwMCAgICBBUzQwMCBBUzQwMAotICAgIGZpbGUgICAgICAgIGZpbGUgICAgbWVtYmVyICAgdHlwZSAgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICBTT1VSQ0VTICAgICAgICAgICAgICAgIE9yaWdpbmFsIFpMSUIgQyBzdWJwcm9ncmFtIHNvdXJjZXMKLSAgICBhZGxlcjMyLmMgICAgICAgICAgIEFETEVSMzIgIEMgICAgIFpMSUIgLSBDb21wdXRlIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiBhIGR0YSBzdHJtCi0gICAgY29tcHJlc3MuYyAgICAgICAgICBDT01QUkVTUyBDICAgICBaTElCIC0gQ29tcHJlc3MgYSBtZW1vcnkgYnVmZmVyCi0gICAgY3JjMzIuYyAgICAgICAgICAgICBDUkMzMiAgICBDICAgICBaTElCIC0gQ29tcHV0ZSB0aGUgQ1JDLTMyIG9mIGEgZGF0YSBzdHJlYW0KLSAgICBkZWZsYXRlLmMgICAgICAgICAgIERFRkxBVEUgIEMgICAgIFpMSUIgLSBDb21wcmVzcyBkYXRhIHVzaW5nIHRoZSBkZWZsYXRpb24gYWxnb3JpdGhtCi0gICAgZ3pjbG9zZS5jICAgICAgICAgICBHWkNMT1NFICBDICAgICBaTElCIC0gQ2xvc2UgLmd6IGZpbGVzCi0gICAgZ3psaWIuYyAgICAgICAgICAgICBHWkxJQiAgICBDICAgICBaTElCIC0gTWlzY2VsbGFuZW91cyAuZ3ogZmlsZXMgSU8gc3VwcG9ydAotICAgIGd6cmVhZC5jICAgICAgICAgICAgR1pSRUFEICAgQyAgICAgWkxJQiAtIFJlYWQgLmd6IGZpbGVzCi0gICAgZ3p3cml0ZS5jICAgICAgICAgICBHWldSSVRFICBDICAgICBaTElCIC0gV3JpdGUgLmd6IGZpbGVzCi0gICAgaW5mYmFjay5jICAgICAgICAgICBJTkZCQUNLICBDICAgICBaTElCIC0gSW5mbGF0ZSB1c2luZyBhIGNhbGxiYWNrIGludGVyZmFjZQotICAgIGluZmZhc3QuYyAgICAgICAgICAgSU5GRkFTVCAgQyAgICAgWkxJQiAtIEZhc3QgcHJvYy4gbGl0ZXJhbHMgJiBsZW5ndGgvZGlzdGFuY2UgcGFpcnMKLSAgICBpbmZsYXRlLmMgICAgICAgICAgIElORkxBVEUgIEMgICAgIFpMSUIgLSBJbnRlcmZhY2UgdG8gaW5mbGF0ZSBtb2R1bGVzCi0gICAgaW5mdHJlZXMuYyAgICAgICAgICBJTkZUUkVFUyBDICAgICBaTElCIC0gR2VuZXJhdGUgSHVmZm1hbiB0cmVlcyBmb3IgZWZmaWNpZW50IGRlY29kZQotICAgIHRyZWVzLmMgICAgICAgICAgICAgVFJFRVMgICAgQyAgICAgWkxJQiAtIE91dHB1dCBkZWZsYXRlZCBkYXRhIHVzaW5nIEh1ZmZtYW4gY29kaW5nCi0gICAgdW5jb21wci5jICAgICAgICAgICBVTkNPTVBSICBDICAgICBaTElCIC0gRGVjb21wcmVzcyBhIG1lbW9yeSBidWZmZXIKLSAgICB6dXRpbC5jICAgICAgICAgICAgIFpVVElMICAgIEMgICAgIFpMSUIgLSBUYXJnZXQgZGVwZW5kZW50IHV0aWxpdHkgZnVuY3Rpb25zCi0gICAgICAgICAgICAgICAgSCAgICAgICAgICAgICAgICAgICAgICBPcmlnaW5hbCBaTElCIEMgYW5kIElMRS9SUEcgaW5jbHVkZSBmaWxlcwotICAgIGNyYzMyLmggICAgICAgICAgICAgQ1JDMzIgICAgQyAgICAgWkxJQiAtIENSQzMyIHRhYmxlcwotICAgIGRlZmxhdGUuaCAgICAgICAgICAgREVGTEFURSAgQyAgICAgWkxJQiAtIEludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlCi0gICAgZ3pndXRzLmggICAgICAgICAgICBHWkdVVFMgICBDICAgICBaTElCIC0gRGVmaW5pdGlvbnMgZm9yIHRoZSBnemNsb3NlIG1vZHVsZQotICAgIGluZmZhc3QuaCAgICAgICAgICAgSU5GRkFTVCAgQyAgICAgWkxJQiAtIEhlYWRlciB0byB1c2UgaW5mZmFzdC5jCi0gICAgaW5mZml4ZWQuaCAgICAgICAgICBJTkZGSVhFRCBDICAgICBaTElCIC0gVGFibGUgZm9yIGRlY29kaW5nIGZpeGVkIGNvZGVzCi0gICAgaW5mbGF0ZS5oICAgICAgICAgICBJTkZMQVRFICBDICAgICBaTElCIC0gSW50ZXJuYWwgaW5mbGF0ZSBzdGF0ZSBkZWZpbml0aW9ucwotICAgIGluZnRyZWVzLmggICAgICAgICAgSU5GVFJFRVMgQyAgICAgWkxJQiAtIEhlYWRlciB0byB1c2UgaW5mdHJlZXMuYwotICAgIHRyZWVzLmggICAgICAgICAgICAgVFJFRVMgICAgQyAgICAgWkxJQiAtIENyZWF0ZWQgYXV0b21hdGljYWxseSB3aXRoIC1ER0VOX1RSRUVTX0gKLSAgICB6Y29uZi5oICAgICAgICAgICAgIFpDT05GICAgIEMgICAgIFpMSUIgLSBDb21wcmVzc2lvbiBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24KLSAgICB6bGliLmggICAgICAgICAgICAgIFpMSUIgICAgIEMgICAgIFpMSUIgLSBDb21wcmVzc2lvbiBsaWJyYXJ5IEMgdXNlciBpbnRlcmZhY2UKLSAgICBhczQwMC96bGliLmluYyAgICAgIFpMSUIuSU5DIFJQR0xFIFpMSUIgLSBDb21wcmVzc2lvbiBsaWJyYXJ5IElMRSBSUEcgdXNlciBpbnRlcmZhY2UKLSAgICB6dXRpbC5oICAgICAgICAgICAgIFpVVElMICAgIEMgICAgIFpMSUIgLSBJbnRlcm5hbCBpbnRlcmZhY2UgYW5kIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICBUT09MUyAgICAgICAgICAgICAgICAgIEJ1aWxkaW5nIHNvdXJjZSBzb2Z0d2FyZSAmIEFTLzQwMCBSRUFETUUKLSAgICBhczQwMC9ibmRzcmMgICAgICAgIEJORFNSQyAgICAgICAgIEVudHJ5IHBvaW50IGV4cG9ydGF0aW9uIGxpc3QKLSAgICBhczQwMC9jb21waWxlLmNscCAgIENPTVBJTEUgIENMUCAgIENvbXBpbGUgc291cmNlcyAmIGdlbmVyYXRlIHNlcnZpY2UgcHJvZ3JhbQotICAgIGFzNDAwL3JlYWRtZS50eHQgICAgUkVBRE1FICAgVFhUICAgSW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucwotCi00KSAgICAgIENvbnRpbnVlIGFzIGluIEkpMykuCi0KLQotCi0KLU5vdGVzOiAgRm9yIEFTNDAwIElMRSBSUEcgcHJvZ3JhbW1lcnMsIGEgL2NvcHkgbWVtYmVyIGRlZmluaW5nIHRoZSBaTElCCi0gICAgICAgICAgICAgICAgQVBJIHByb3RvdHlwZXMgZm9yIElMRSBSUEcgY2FuIGJlIGZvdW5kIGluIFpMSUIvSChaTElCLklOQykuCi0gICAgICAgICAgICAgICAgUGxlYXNlIHJlYWQgY29tbWVudHMgaW4gdGhpcyBtZW1iZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSAgICAgICAgUmVtZW1iZXIgdGhhdCBtb3N0IGZvcmVpZ24gdGV4dHVhbCBkYXRhIGFyZSBBU0NJSSBjb2RlZDogdGhpcwotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGhhbmRsZSBjb252ZXJzaW9uIGZyb20vdG8gQVNDSUksIHNvCi0gICAgICAgICAgICAgICAgdGV4dCBkYXRhIGNvZGUgY29udmVyc2lvbnMgbXVzdCBiZSBkb25lIGV4cGxpY2l0ZWx5LgotCi0gICAgICAgIE1haW5seSBmb3IgdGhlIHJlYXNvbiBhYm92ZSwgYWx3YXlzIG9wZW4gemlwcGVkIGZpbGVzIGluIGJpbmFyeSBtb2RlLgpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvYXM0MDAvemxpYi5pbmMgYi9zcmMvemxpYi9hczQwMC96bGliLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3YzU5OC4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9hczQwMC96bGliLmluYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0gICAgICAqICBaTElCLklOQyAtIEludGVyZmFjZSB0byB0aGUgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAgICAgICoKLSAgICAgICogIElMRSBSUEc0MDAgdmVyc2lvbiBieSBQYXRyaWNrIE1vbm5lcmF0LCBEQVRBU1BIRVJFLgotICAgICAgKiAgVmVyc2lvbiAxLjIuNwotICAgICAgKgotICAgICAgKgotICAgICAgKiAgV0FSTklORzoKLSAgICAgICogICAgIFByb2NlZHVyZXMgaW5mbGF0ZUluaXQoKSwgaW5mbGF0ZUluaXQyKCksIGRlZmxhdGVJbml0KCksCi0gICAgICAqICAgICAgICAgZGVmbGF0ZUluaXQyKCkgYW5kIGluZmxhdGVCYWNrSW5pdCgpIG5lZWQgdG8gYmUgY2FsbGVkIHdpdGgKLSAgICAgICogICAgICAgICB0d28gYWRkaXRpb25hbCBhcmd1bWVudHM6Ci0gICAgICAqICAgICAgICAgdGhlIHBhY2thZ2UgdmVyc2lvbiBzdHJpbmcgYW5kIHRoZSBzdHJlYW0gY29udHJvbCBzdHJ1Y3R1cmUuCi0gICAgICAqICAgICAgICAgc2l6ZS4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBSUEcgbGFja3Mgc29tZSBtYWNybyBmZWF0dXJlLgotICAgICAgKiAgICAgICAgIENhbGwgdGhlc2UgcHJvY2VkdXJlcyBhczoKLSAgICAgICogICAgICAgICAgICAgaW5mbGF0ZUluaXQoLi4uOiBaTElCX1ZFUlNJT046ICVzaXplKHpfc3RyZWFtKSkKLSAgICAgICoKLSAgICAgIC9pZiBub3QgZGVmaW5lZChaTElCX0hfKQotICAgICAgL2RlZmluZSBaTElCX0hfCi0gICAgICAqCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMKLSAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAqCi0gICAgICAqICBWZXJzaW9uaW5nIGluZm9ybWF0aW9uLgotICAgICAgKgotICAgICBEIFpMSUJfVkVSU0lPTiAgICBDICAgICAgICAgICAgICAgICAgICcxLjIuNycKLSAgICAgRCBaTElCX1ZFUk5VTSAgICAgQyAgICAgICAgICAgICAgICAgICBYJzEyNzAnCi0gICAgIEQgWkxJQl9WRVJfTUFKT1IgIEMgICAgICAgICAgICAgICAgICAgMQotICAgICBEIFpMSUJfVkVSX01JTk9SICBDICAgICAgICAgICAgICAgICAgIDIKLSAgICAgRCBaTElCX1ZFUl9SRVZJU0lPTi4uLgotICAgICBEICAgICAgICAgICAgICAgICBDICAgICAgICAgICAgICAgICAgIDcKLSAgICAgRCBaTElCX1ZFUl9TVUJSRVZJU0lPTi4uLgotICAgICBEICAgICAgICAgICAgICAgICBDICAgICAgICAgICAgICAgICAgIDAKLSAgICAgICoKLSAgICAgICogIE90aGVyIGVxdWF0ZXMuCi0gICAgICAqCi0gICAgIEQgWl9OT19GTFVTSCAgICAgIEMgICAgICAgICAgICAgICAgICAgMAotICAgICBEIFpfUEFSVElBTF9GTFVTSC4uLgotICAgICBEICAgICAgICAgICAgICAgICBDICAgICAgICAgICAgICAgICAgIDEKLSAgICAgRCBaX1NZTkNfRkxVU0ggICAgQyAgICAgICAgICAgICAgICAgICAyCi0gICAgIEQgWl9GVUxMX0ZMVVNIICAgIEMgICAgICAgICAgICAgICAgICAgMwotICAgICBEIFpfRklOSVNIICAgICAgICBDICAgICAgICAgICAgICAgICAgIDQKLSAgICAgRCBaX0JMT0NLICAgICAgICAgQyAgICAgICAgICAgICAgICAgICA1Ci0gICAgIEQgWl9UUkVFUyAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgNgotICAgICAgKgotICAgICBEIFpfT0sgICAgICAgICAgICBDICAgICAgICAgICAgICAgICAgIDAKLSAgICAgRCBaX1NUUkVBTV9FTkQgICAgQyAgICAgICAgICAgICAgICAgICAxCi0gICAgIEQgWl9ORUVEX0RJQ1QgICAgIEMgICAgICAgICAgICAgICAgICAgMgotICAgICBEIFpfRVJSTk8gICAgICAgICBDICAgICAgICAgICAgICAgICAgIC0xCi0gICAgIEQgWl9TVFJFQU1fRVJST1IgIEMgICAgICAgICAgICAgICAgICAgLTIKLSAgICAgRCBaX0RBVEFfRVJST1IgICAgQyAgICAgICAgICAgICAgICAgICAtMwotICAgICBEIFpfTUVNX0VSUk9SICAgICBDICAgICAgICAgICAgICAgICAgIC00Ci0gICAgIEQgWl9CVUZfRVJST1IgICAgIEMgICAgICAgICAgICAgICAgICAgLTUKLSAgICAgRFpfVkVSU0lPTl9FUlJPUiAgQyAgICAgICAgICAgICAgICAgICAtNgotICAgICAgKgotICAgICBEIFpfTk9fQ09NUFJFU1NJT04uLi4KLSAgICAgRCAgICAgICAgICAgICAgICAgQyAgICAgICAgICAgICAgICAgICAwCi0gICAgIEQgWl9CRVNUX1NQRUVEICAgIEMgICAgICAgICAgICAgICAgICAgMQotICAgICBEIFpfQkVTVF9DT01QUkVTU0lPTi4uLgotICAgICBEICAgICAgICAgICAgICAgICBDICAgICAgICAgICAgICAgICAgIDkKLSAgICAgRCBaX0RFRkFVTFRfQ09NUFJFU1NJT04uLi4KLSAgICAgRCAgICAgICAgICAgICAgICAgQyAgICAgICAgICAgICAgICAgICAtMQotICAgICAgKgotICAgICBEIFpfRklMVEVSRUQgICAgICBDICAgICAgICAgICAgICAgICAgIDEKLSAgICAgRCBaX0hVRkZNQU5fT05MWSAgQyAgICAgICAgICAgICAgICAgICAyCi0gICAgIEQgWl9STEUgICAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgMwotICAgICBEIFpfREVGQVVMVF9TVFJBVEVHWS4uLgotICAgICBEICAgICAgICAgICAgICAgICBDICAgICAgICAgICAgICAgICAgIDAKLSAgICAgICoKLSAgICAgRCBaX0JJTkFSWSAgICAgICAgQyAgICAgICAgICAgICAgICAgICAwCi0gICAgIEQgWl9BU0NJSSAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgMQotICAgICBEIFpfVU5LTk9XTiAgICAgICBDICAgICAgICAgICAgICAgICAgIDIKLSAgICAgICoKLSAgICAgRCBaX0RFRkxBVEVEICAgICAgQyAgICAgICAgICAgICAgICAgICA4Ci0gICAgICAqCi0gICAgIEQgWl9OVUxMICAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgMAotICAgICAgKgotICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlcwotICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICoKLSAgICAgRCB6X3N0cmVhbXAgICAgICAgUyAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtIHN0cnVjdCBwdHIKLSAgICAgRCBnekZpbGUgICAgICAgICAgUyAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCi0gICAgIEQgel9vZmZfdCAgICAgICAgIFMgICAgICAgICAgICAgMTBpIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbSBvZmZzZXRzCi0gICAgIEQgel9vZmY2NF90ICAgICAgIFMgICAgICAgICAgICAgMjBpIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbSBvZmZzZXRzCi0gICAgICAqCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVzCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgKgotICAgICAgKiAgVGhlIEdaSVAgZW5jb2RlL2RlY29kZSBzdHJlYW0gc3VwcG9ydCBzdHJ1Y3R1cmUuCi0gICAgICAqCi0gICAgIEQgel9zdHJlYW0gICAgICAgIERTICAgICAgICAgICAgICAgICAgYWxpZ24gYmFzZWQoel9zdHJlYW1wKQotICAgICBEICB6c19uZXh0X2luICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXh0IGlucHV0IGJ5dGUKLSAgICAgRCAgenNfYXZhaWxfaW4gICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZSBjbnQgYXQgbmV4dF9pbgotICAgICBEICB6c190b3RhbF9pbiAgICAgICAgICAgICAgICAgIDEwVSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbCBieXRlcyByZWFkCi0gICAgIEQgIHpzX25leHRfb3V0ICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dCBidWZmZXIgcHRyCi0gICAgIEQgIHpzX2F2YWlsX291dCAgICAgICAgICAgICAgICAgMTBVIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvb20gbGVmdCBAIG5leHRfb3V0Ci0gICAgIEQgIHpzX3RvdGFsX291dCAgICAgICAgICAgICAgICAgMTBVIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsIGJ5dGVzIHdyaXR0ZW4KLSAgICAgRCAgenNfbXNnICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdCBlcnJtc2cgb3IgbnVsbAotICAgICBEICB6c19zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbCBzdGF0ZQotICAgICBEICB6c196YWxsb2MgICAgICAgICAgICAgICAgICAgICAgKiAgIHByb2NwdHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQuIHN0YXRlIGFsbG9jYXRvcgotICAgICBEICB6c19mcmVlICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHByb2NwdHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQuIHN0YXRlIGRlYWxsb2MuCi0gICAgIEQgIHpzX29wYXF1ZSAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaXZhdGUgYWxsb2MuIGRhdGEKLSAgICAgRCAgenNfZGF0YV90eXBlICAgICAgICAgICAgICAgICAxMGkgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDL0JJTiBiZXN0IGd1ZXNzCi0gICAgIEQgIHpzX2FkbGVyICAgICAgICAgICAgICAgICAgICAgMTB1IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuY29tcHIuIGFkbGVyMzIgdmFsCi0gICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTBVIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkCi0gICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTBVIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0ci4gYWxpZ25tZW50Ci0gICAgICAqCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgKiAgICAgICAgICAgICAgICAgICAgIFV0aWxpdHkgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICoKLSAgICAgRCBjb21wcmVzcyAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdjb21wcmVzcycpCi0gICAgIEQgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgNjU1MzUgICAgb3B0aW9ucygqdmFyc2l6ZSkgICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uIGJ1ZmZlcgotICAgICBEICBkZXN0TGVuICAgICAgICAgICAgICAgICAgICAgIDEwVSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbiBsZW5ndGgKLSAgICAgRCAgc291cmNlICAgICAgICAgICAgICAgICAgICA2NTUzNSAgICBjb25zdCBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgU291cmNlIGJ1ZmZlcgotICAgICBEICBzb3VyY2VMZW4gICAgICAgICAgICAgICAgICAgIDEwdSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2UgbGVuZ3RoCi0gICAgICAqCi0gICAgIEQgY29tcHJlc3MyICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnY29tcHJlc3MyJykKLSAgICAgRCAgZGVzdCAgICAgICAgICAgICAgICAgICAgICA2NTUzNSAgICBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb24gYnVmZmVyCi0gICAgIEQgIGRlc3RMZW4gICAgICAgICAgICAgICAgICAgICAgMTBVIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uIGxlbmd0aAotICAgICBEICBzb3VyY2UgICAgICAgICAgICAgICAgICAgIDY1NTM1ICAgIGNvbnN0IG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICBTb3VyY2UgYnVmZmVyCi0gICAgIEQgIHNvdXJjZUxlbiAgICAgICAgICAgICAgICAgICAgMTBVIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSBsZW5ndGgKLSAgICAgRCAgbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gbGV2ZWwKLSAgICAgICoKLSAgICAgRCBjb21wcmVzc0JvdW5kICAgUFIgICAgICAgICAgICAxMFUgMCBleHRwcm9jKCdjb21wcmVzc0JvdW5kJykKLSAgICAgRCAgc291cmNlTGVuICAgICAgICAgICAgICAgICAgICAxMFUgMCB2YWx1ZQotICAgICAgKgotICAgICBEIHVuY29tcHJlc3MgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ3VuY29tcHJlc3MnKQotICAgICBEICBkZXN0ICAgICAgICAgICAgICAgICAgICAgIDY1NTM1ICAgIG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbiBidWZmZXIKLSAgICAgRCAgZGVzdExlbiAgICAgICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb24gbGVuZ3RoCi0gICAgIEQgIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgNjU1MzUgICAgY29uc3Qgb3B0aW9ucygqdmFyc2l6ZSkgICAgICAgICAgICAgIFNvdXJjZSBidWZmZXIKLSAgICAgRCAgc291cmNlTGVuICAgICAgICAgICAgICAgICAgICAxMFUgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlIGxlbmd0aAotICAgICAgKgotICAgICAgL2lmIG5vdCBkZWZpbmVkKExBUkdFX0ZJTEVTKQotICAgICBEIGd6b3BlbiAgICAgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6b3BlbicpCi0gICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZShnekZpbGUpCi0gICAgIEQgIHBhdGggICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUgb3B0aW9ucygqc3RyaW5nKSAgICAgICAgICAgICAgIEZpbGUgcGF0aG5hbWUKLSAgICAgRCAgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgT3BlbiBtb2RlCi0gICAgICAvZWxzZQotICAgICBEIGd6b3BlbiAgICAgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6b3BlbjY0JykKLSAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKGd6RmlsZSkKLSAgICAgRCAgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgRmlsZSBwYXRobmFtZQotICAgICBEICBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIG9wdGlvbnMoKnN0cmluZykgICAgICAgICAgICAgICBPcGVuIG1vZGUKLSAgICAgICoKLSAgICAgRCBnem9wZW42NCAgICAgICAgUFIgICAgICAgICAgICAgICAgICBleHRwcm9jKCdnem9wZW42NCcpCi0gICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZShnekZpbGUpCi0gICAgIEQgIHBhdGggICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUgb3B0aW9ucygqc3RyaW5nKSAgICAgICAgICAgICAgIEZpbGUgcGF0aG5hbWUKLSAgICAgRCAgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgT3BlbiBtb2RlCi0gICAgICAvZW5kaWYKLSAgICAgICoKLSAgICAgRCBnemRvcGVuICAgICAgICAgUFIgICAgICAgICAgICAgICAgICBleHRwcm9jKCdnemRvcGVuJykKLSAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKGd6RmlsZSkKLSAgICAgRCAgZmQgICAgICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBkZXNjcmlwdG9yCi0gICAgIEQgIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUgb3B0aW9ucygqc3RyaW5nKSAgICAgICAgICAgICAgIE9wZW4gbW9kZQotICAgICAgKgotICAgICBEIGd6YnVmZmVyICAgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2d6YnVmZmVyJykKLSAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCi0gICAgIEQgIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgMTBVIDAgdmFsdWUKLSAgICAgICoKLSAgICAgRCBnenNldHBhcmFtcyAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdnenNldHBhcmFtcycpCi0gICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgotICAgICBEICBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlCi0gICAgIEQgIHN0cmF0ZWd5ICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUKLSAgICAgICoKLSAgICAgRCBnenJlYWQgICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdnenJlYWQnKQotICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKLSAgICAgRCAgYnVmICAgICAgICAgICAgICAgICAgICAgICA2NTUzNSAgICBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgICAgICAgQnVmZmVyCi0gICAgIEQgIGxlbiAgICAgICAgICAgICAgICAgICAgICAgICAgMTB1IDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBsZW5ndGgKLSAgICAgICoKLSAgICAgRCBnendyaXRlICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdnendyaXRlJykKLSAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCi0gICAgIEQgIGJ1ZiAgICAgICAgICAgICAgICAgICAgICAgNjU1MzUgICAgY29uc3Qgb3B0aW9ucygqdmFyc2l6ZSkgICAgICAgICAgICAgIEJ1ZmZlcgotICAgICBEICBsZW4gICAgICAgICAgICAgICAgICAgICAgICAgIDEwdSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXIgbGVuZ3RoCi0gICAgICAqCi0gICAgIEQgZ3pwdXRzICAgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnZ3pwdXRzJykKLSAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCi0gICAgIEQgIHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUgb3B0aW9ucygqc3RyaW5nKSAgICAgICAgICAgICAgIFN0cmluZyB0byBvdXRwdXQKLSAgICAgICoKLSAgICAgRCBnemdldHMgICAgICAgICAgUFIgICAgICAgICAgICAgICogICBleHRwcm9jKCdnemdldHMnKQotICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKLSAgICAgRCAgYnVmICAgICAgICAgICAgICAgICAgICAgICA2NTUzNSAgICBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgICAgICAgUmVhZCBidWZmZXIKLSAgICAgRCAgbGVuICAgICAgICAgICAgICAgICAgICAgICAgICAxMGkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyIGxlbmd0aAotICAgICAgKgotICAgICBEIGd6cHV0YyAgICAgICAgICBQUiAgICAgICAgICAgIDEwaSAwIGV4dHByb2MoJ2d6cHV0YycpCi0gICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgotICAgICBEICBjICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIgdG8gd3JpdGUKLSAgICAgICoKLSAgICAgRCBnemdldGMgICAgICAgICAgUFIgICAgICAgICAgICAxMGkgMCBleHRwcm9jKCdnemdldGMnKQotICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKLSAgICAgICoKLSAgICAgRCBnemdldGNfICAgICAgICAgUFIgICAgICAgICAgICAxMGkgMCBleHRwcm9jKCdnemdldGNfJykKLSAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCi0gICAgICAqCi0gICAgIEQgZ3p1bmdldGMgICAgICAgIFBSICAgICAgICAgICAgMTBpIDAgZXh0cHJvYygnZ3p1bmdldGMnKQotICAgICBEICBjICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIgdG8gcHVzaAotICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKLSAgICAgICoKLSAgICAgRCBnemZsdXNoICAgICAgICAgUFIgICAgICAgICAgICAxMGkgMCBleHRwcm9jKCdnemZsdXNoJykKLSAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCi0gICAgIEQgIGZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgb2YgZmx1c2gKLSAgICAgICoKLSAgICAgIC9pZiBub3QgZGVmaW5lZChMQVJHRV9GSUxFUykKLSAgICAgRCBnenNlZWsgICAgICAgICAgUFIgICAgICAgICAgICAgICAgICBleHRwcm9jKCdnenNlZWsnKQotICAgICBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9vZmZfdCkKLSAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCi0gICAgIEQgIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZSh6X29mZl90KSAgICAgICAgICAgICAgICAgIE9mZnNldAotICAgICBEICB3aGVuY2UgICAgICAgICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcmlnaW4KLSAgICAgIC9lbHNlCi0gICAgIEQgZ3pzZWVrICAgICAgICAgIFBSICAgICAgICAgICAgICAgICAgZXh0cHJvYygnZ3pzZWVrNjQnKQotICAgICBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9vZmZfdCkKLSAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCi0gICAgIEQgIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZSh6X29mZl90KSAgICAgICAgICAgICAgICAgIE9mZnNldAotICAgICBEICB3aGVuY2UgICAgICAgICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcmlnaW4KLSAgICAgICoKLSAgICAgRCBnenNlZWs2NCAgICAgICAgUFIgICAgICAgICAgICAgICAgICBleHRwcm9jKCdnenNlZWs2NCcpCi0gICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X29mZjY0X3QpCi0gICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgotICAgICBEICBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2Uoel9vZmY2NF90KSAgICAgICAgICAgICAgICBPZmZzZXQKLSAgICAgRCAgd2hlbmNlICAgICAgICAgICAgICAgICAgICAgICAxMGkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JpZ2luCi0gICAgICAvZW5kaWYKLSAgICAgICoKLSAgICAgRCBnenJld2luZCAgICAgICAgUFIgICAgICAgICAgICAxMGkgMCBleHRwcm9jKCdnenJld2luZCcpCi0gICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgotICAgICAgKgotICAgICAgL2lmIG5vdCBkZWZpbmVkKExBUkdFX0ZJTEVTKQotICAgICBEIGd6dGVsbCAgICAgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6dGVsbCcpCi0gICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X29mZl90KQotICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKLSAgICAgIC9lbHNlCi0gICAgIEQgZ3p0ZWxsICAgICAgICAgIFBSICAgICAgICAgICAgICAgICAgZXh0cHJvYygnZ3p0ZWxsNjQnKQotICAgICBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9vZmZfdCkKLSAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCi0gICAgICAqCi0gICAgIEQgZ3p0ZWxsNjQgICAgICAgIFBSICAgICAgICAgICAgICAgICAgZXh0cHJvYygnZ3p0ZWxsNjQnKQotICAgICBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9vZmY2NF90KQotICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKLSAgICAgIC9lbmRpZgotICAgICAgKgotICAgICAgL2lmIG5vdCBkZWZpbmVkKExBUkdFX0ZJTEVTKQotICAgICBEIGd6b2Zmc2V0ICAgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6b2Zmc2V0JykKLSAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfb2ZmX3QpCi0gICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgotICAgICAgL2Vsc2UKLSAgICAgRCBnem9mZnNldCAgICAgICAgUFIgICAgICAgICAgICAgICAgICBleHRwcm9jKCdnem9mZnNldDY0JykKLSAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfb2ZmX3QpCi0gICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgotICAgICAgKgotICAgICBEIGd6b2Zmc2V0NjQgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6b2Zmc2V0NjQnKQotICAgICBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9vZmY2NF90KQotICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKLSAgICAgIC9lbmRpZgotICAgICAgKgotICAgICBEIGd6ZW9mICAgICAgICAgICBQUiAgICAgICAgICAgIDEwaSAwIGV4dHByb2MoJ2d6ZW9mJykKLSAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCi0gICAgICAqCi0gICAgIEQgZ3pjbG9zZV9yICAgICAgIFBSICAgICAgICAgICAgMTBpIDAgZXh0cHJvYygnZ3pjbG9zZV9yJykKLSAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCi0gICAgICAqCi0gICAgIEQgZ3pjbG9zZV93ICAgICAgIFBSICAgICAgICAgICAgMTBpIDAgZXh0cHJvYygnZ3pjbG9zZV93JykKLSAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCi0gICAgICAqCi0gICAgIEQgZ3pjbG9zZSAgICAgICAgIFBSICAgICAgICAgICAgMTBpIDAgZXh0cHJvYygnZ3pjbG9zZScpCi0gICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgotICAgICAgKgotICAgICBEIGd6ZXJyb3IgICAgICAgICBQUiAgICAgICAgICAgICAgKiAgIGV4dHByb2MoJ2d6ZXJyb3InKSAgICAgICAgICAgICAgICAgICBFcnJvciBzdHJpbmcKLSAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCi0gICAgIEQgIGVycm51bSAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yIGNvZGUKLSAgICAgICoKLSAgICAgRCBnemNsZWFyZXJyICAgICAgUFIgICAgICAgICAgICAgICAgICBleHRwcm9jKCdnemNsZWFyZXJyJykKLSAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCi0gICAgICAqCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAqCi0gICAgIEQgemxpYlZlcnNpb24gICAgIFBSICAgICAgICAgICAgICAqICAgZXh0cHJvYygnemxpYlZlcnNpb24nKSAgICAgICAgICAgICAgIFZlcnNpb24gc3RyaW5nCi0gICAgICAqCi0gICAgIEQgZGVmbGF0ZUluaXQgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnZGVmbGF0ZUluaXRfJykgICAgICAgICAgICAgIEluaXQuIGNvbXByZXNzaW9uCi0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIHN0cmVhbQotICAgICBEICBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBsZXZlbAotICAgICBEICB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIG9wdGlvbnMoKnN0cmluZykgICAgICAgICAgICAgICBWZXJzaW9uIHN0cmluZwotICAgICBEICBzdHJlYW1fc2l6ZSAgICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0gc3RydWN0LiBzaXplCi0gICAgICAqCi0gICAgIEQgZGVmbGF0ZSAgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnZGVmbGF0ZScpICAgICAgICAgICAgICAgICAgIENvbXByZXNzIGRhdGEKLSAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gc3RyZWFtCi0gICAgIEQgIGZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsdXNoIHR5cGUgcmVxdWlyZWQKLSAgICAgICoKLSAgICAgRCBkZWZsYXRlRW5kICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdkZWZsYXRlRW5kJykgICAgICAgICAgICAgICAgVGVybWluLiBjb21wcmVzc2lvbgotICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBzdHJlYW0KLSAgICAgICoKLSAgICAgRCBpbmZsYXRlSW5pdCAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlSW5pdF8nKSAgICAgICAgICAgICAgSW5pdC4gZXhwYW5zaW9uCi0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KLSAgICAgRCAgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgVmVyc2lvbiBzdHJpbmcKLSAgICAgRCAgc3RyZWFtX3NpemUgICAgICAgICAgICAgICAgICAxMGkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtIHN0cnVjdC4gc2l6ZQotICAgICAgKgotICAgICBEIGluZmxhdGUgICAgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGUnKSAgICAgICAgICAgICAgICAgICBFeHBhbmQgZGF0YQotICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCi0gICAgIEQgIGZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsdXNoIHR5cGUgcmVxdWlyZWQKLSAgICAgICoKLSAgICAgRCBpbmZsYXRlRW5kICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlRW5kJykgICAgICAgICAgICAgICAgVGVybWluLiBleHBhbnNpb24KLSAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQotICAgICAgKgotICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICogICAgICAgICAgICAgICAgICAgICAgICBBZHZhbmNlZCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgKgotICAgICBEIGRlZmxhdGVJbml0MiAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2RlZmxhdGVJbml0Ml8nKSAgICAgICAgICAgICBJbml0LiBjb21wcmVzc2lvbgotICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBzdHJlYW0KLSAgICAgRCAgbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gbGV2ZWwKLSAgICAgRCAgbWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gbWV0aG9kCi0gICAgIEQgIHdpbmRvd0JpdHMgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzIod2luZG93IHNpemUpCi0gICAgIEQgIG1lbUxldmVsICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbS9jbXByZXNzIHRyYWRlb2ZmCi0gICAgIEQgIHN0cmF0ZWd5ICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIHN0YXRlZ3kKLSAgICAgRCAgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgVmVyc2lvbiBzdHJpbmcKLSAgICAgRCAgc3RyZWFtX3NpemUgICAgICAgICAgICAgICAgICAxMGkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtIHN0cnVjdC4gc2l6ZQotICAgICAgKgotICAgICBEIGRlZmxhdGVTZXREaWN0aW9uYXJ5Li4uCi0gICAgIEQgICAgICAgICAgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnZGVmbGF0ZVNldERpY3Rpb25hcnknKSAgICAgIEluaXQuIGRpY3Rpb25hcnkKLSAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gc3RyZWFtCi0gICAgIEQgIGRpY3Rpb25hcnkgICAgICAgICAgICAgICAgNjU1MzUgICAgY29uc3Qgb3B0aW9ucygqdmFyc2l6ZSkgICAgICAgICAgICAgIERpY3Rpb25hcnkgYnl0ZXMKLSAgICAgRCAgZGljdExlbmd0aCAgICAgICAgICAgICAgICAgICAxMFUgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGljdGlvbmFyeSBsZW5ndGgKLSAgICAgICoKLSAgICAgRCBkZWZsYXRlQ29weSAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdkZWZsYXRlQ29weScpICAgICAgICAgICAgICAgQ29tcHJlc3Mgc3RybSAyIHN0cm0KLSAgICAgRCAgZGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb24gc3RyZWFtCi0gICAgIEQgIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSBzdHJlYW0KLSAgICAgICoKLSAgICAgRCBkZWZsYXRlUmVzZXQgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdkZWZsYXRlUmVzZXQnKSAgICAgICAgICAgICAgRW5kIGFuZCBpbml0LiBzdHJlYW0KLSAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gc3RyZWFtCi0gICAgICAqCi0gICAgIEQgZGVmbGF0ZVBhcmFtcyAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnZGVmbGF0ZVBhcmFtcycpICAgICAgICAgICAgIENoYW5nZSBsZXZlbCAmIHN0cmF0Ci0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIHN0cmVhbQotICAgICBEICBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBsZXZlbAotICAgICBEICBzdHJhdGVneSAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBzdGF0ZWd5Ci0gICAgICAqCi0gICAgIEQgZGVmbGF0ZUJvdW5kICAgIFBSICAgICAgICAgICAgMTBVIDAgZXh0cHJvYygnZGVmbGF0ZUJvdW5kJykgICAgICAgICAgICAgIENoYW5nZSBsZXZlbCAmIHN0cmF0Ci0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIHN0cmVhbQotICAgICBEICBzb3VyY2VsZW4gICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBsZXZlbAotICAgICAgKgotICAgICBEIGRlZmxhdGVQZW5kaW5nICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2RlZmxhdGVQZW5kaW5nJykgICAgICAgICAgICBDaGFuZ2UgbGV2ZWwgJiBzdHJhdAotICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBzdHJlYW0KLSAgICAgRCAgcGVuZGluZyAgICAgICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVuZGluZyBieXRlcwotICAgICBEICBiaXRzICAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZW5kaW5nIGJpdHMKLSAgICAgICoKLSAgICAgRCBkZWZsYXRlUHJpbWUgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdkZWZsYXRlUHJpbWUnKSAgICAgICAgICAgICAgQ2hhbmdlIGxldmVsICYgc3RyYXQKLSAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gc3RyZWFtCi0gICAgIEQgIGJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb2YgYml0cyB0byBpbnNlcnQKLSAgICAgRCAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0cyB0byBpbnNlcnQKLSAgICAgICoKLSAgICAgRCBpbmZsYXRlSW5pdDIgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlSW5pdDJfJykgICAgICAgICAgICAgSW5pdC4gZXhwYW5zaW9uCi0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KLSAgICAgRCAgd2luZG93Qml0cyAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nMih3aW5kb3cgc2l6ZSkKLSAgICAgRCAgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgVmVyc2lvbiBzdHJpbmcKLSAgICAgRCAgc3RyZWFtX3NpemUgICAgICAgICAgICAgICAgICAxMGkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtIHN0cnVjdC4gc2l6ZQotICAgICAgKgotICAgICBEIGluZmxhdGVTZXREaWN0aW9uYXJ5Li4uCi0gICAgIEQgICAgICAgICAgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZVNldERpY3Rpb25hcnknKSAgICAgIEluaXQuIGRpY3Rpb25hcnkKLSAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQotICAgICBEICBkaWN0aW9uYXJ5ICAgICAgICAgICAgICAgIDY1NTM1ICAgIGNvbnN0IG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICBEaWN0aW9uYXJ5IGJ5dGVzCi0gICAgIEQgIGRpY3RMZW5ndGggICAgICAgICAgICAgICAgICAgMTBVIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpY3Rpb25hcnkgbGVuZ3RoCi0gICAgICAqCi0gICAgIEQgaW5mbGF0ZVN5bmMgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZVN5bmMnKSAgICAgICAgICAgICAgIFN5bmMuIGV4cGFuc2lvbgotICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCi0gICAgICAqCi0gICAgIEQgaW5mbGF0ZUNvcHkgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZUNvcHknKQotICAgICBEICBkZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbiBzdHJlYW0KLSAgICAgRCAgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgU291cmNlIHN0cmVhbQotICAgICAgKgotICAgICBEIGluZmxhdGVSZXNldCAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVSZXNldCcpICAgICAgICAgICAgICBFbmQgYW5kIGluaXQuIHN0cmVhbQotICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCi0gICAgICAqCi0gICAgIEQgaW5mbGF0ZVJlc2V0MiAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZVJlc2V0MicpICAgICAgICAgICAgIEVuZCBhbmQgaW5pdC4gc3RyZWFtCi0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KLSAgICAgRCAgd2luZG93Qml0cyAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nMihidWZmZXIgc2l6ZSkKLSAgICAgICoKLSAgICAgRCBpbmZsYXRlUHJpbWUgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlUHJpbWUnKSAgICAgICAgICAgICAgSW5zZXJ0IGJpdHMKLSAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQotICAgICBEICBiaXRzICAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgY291bnQKLSAgICAgRCAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0cyB0byBpbnNlcnQKLSAgICAgICoKLSAgICAgRCBpbmZsYXRlTWFyayAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlTWFyaycpICAgICAgICAgICAgICAgR2V0IGluZmxhdGUgaW5mbwotICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCi0gICAgICAqCi0gICAgIEQgaW5mbGF0ZUJhY2tJbml0Li4uCi0gICAgIEQgICAgICAgICAgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZUJhY2tJbml0XycpCi0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KLSAgICAgRCAgd2luZG93Qml0cyAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nMihidWZmZXIgc2l6ZSkKLSAgICAgRCAgd2luZG93ICAgICAgICAgICAgICAgICAgICA2NTUzNSAgICBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgICAgICAgQnVmZmVyCi0gICAgIEQgIHZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUgb3B0aW9ucygqc3RyaW5nKSAgICAgICAgICAgICAgIFZlcnNpb24gc3RyaW5nCi0gICAgIEQgIHN0cmVhbV9zaXplICAgICAgICAgICAgICAgICAgMTBpIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbSBzdHJ1Y3QuIHNpemUKLSAgICAgICoKLSAgICAgRCBpbmZsYXRlQmFjayAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlQmFjaycpCi0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KLSAgICAgRCAgaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBwcm9jcHRyICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgZnVuY3Rpb24KLSAgICAgRCAgaW5fZGVzYyAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgZGVzY3JpcHRvcgotICAgICBEICBvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIHByb2NwdHIgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQgZnVuY3Rpb24KLSAgICAgRCAgb3V0X2Rlc2MgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0IGRlc2NyaXB0b3IKLSAgICAgICoKLSAgICAgRCBpbmZsYXRlQmFja0VuZCAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlQmFja0VuZCcpCi0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KLSAgICAgICoKLSAgICAgRCB6bGliQ29tcGlsZUZsYWdzLi4uCi0gICAgIEQgICAgICAgICAgICAgICAgIFBSICAgICAgICAgICAgMTBVIDAgZXh0cHJvYygnemxpYkNvbXBpbGVGbGFncycpCi0gICAgICAqCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrc3VtIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAqCi0gICAgIEQgYWRsZXIzMiAgICAgICAgIFBSICAgICAgICAgICAgMTBVIDAgZXh0cHJvYygnYWRsZXIzMicpICAgICAgICAgICAgICAgICAgIE5ldyBjaGVja3N1bQotICAgICBEICBhZGxlciAgICAgICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbGQgY2hlY2tzdW0KLSAgICAgRCAgYnVmICAgICAgICAgICAgICAgICAgICAgICA2NTUzNSAgICBjb25zdCBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgQnl0ZXMgdG8gYWNjdW11bGF0ZQotICAgICBEICBsZW4gICAgICAgICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXIgbGVuZ3RoCi0gICAgICAqCi0gICAgIEQgY3JjMzIgICAgICAgICAgIFBSICAgICAgICAgICAgMTBVIDAgZXh0cHJvYygnY3JjMzInKSAgICAgICAgICAgICAgICAgICAgIE5ldyBjaGVja3N1bQotICAgICBEICBjcmMgICAgICAgICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbGQgY2hlY2tzdW0KLSAgICAgRCAgYnVmICAgICAgICAgICAgICAgICAgICAgICA2NTUzNSAgICBjb25zdCBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgQnl0ZXMgdG8gYWNjdW11bGF0ZQotICAgICBEICBsZW4gICAgICAgICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXIgbGVuZ3RoCi0gICAgICAqCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgKiAgICAgICAgICAgICAgICAgICAgIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICoKLSAgICAgRCB6RXJyb3IgICAgICAgICAgUFIgICAgICAgICAgICAgICogICBleHRwcm9jKCd6RXJyb3InKSAgICAgICAgICAgICAgICAgICAgRXJyb3Igc3RyaW5nCi0gICAgIEQgIGVyciAgICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yIGNvZGUKLSAgICAgICoKLSAgICAgRCBpbmZsYXRlU3luY1BvaW50Li4uCi0gICAgIEQgICAgICAgICAgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZVN5bmNQb2ludCcpCi0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KLSAgICAgICoKLSAgICAgRCBnZXRfY3JjX3RhYmxlICAgUFIgICAgICAgICAgICAgICogICBleHRwcm9jKCdnZXRfY3JjX3RhYmxlJykgICAgICAgICAgICAgUHRyIHRvIHVsb25ncwotICAgICAgKgotICAgICBEIGluZmxhdGVVbmRlcm1pbmUuLi4KLSAgICAgRCAgICAgICAgICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlVW5kZXJtaW5lJykKLSAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQotICAgICBEICBhcmcgICAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciBjb2RlCi0gICAgICAqCi0gICAgIEQgaW5mbGF0ZVJlc2V0S2VlcC4uLgotICAgICBEICAgICAgICAgICAgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVSZXNldEtlZXAnKSAgICAgICAgICBFbmQgYW5kIGluaXQuIHN0cmVhbQotICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCi0gICAgICAqCi0gICAgIEQgZGVmbGF0ZVJlc2V0S2VlcC4uLgotICAgICBEICAgICAgICAgICAgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2RlZmxhdGVSZXNldEtlZXAnKSAgICAgICAgICBFbmQgYW5kIGluaXQuIHN0cmVhbQotICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCi0gICAgICAqCi0gICAgICAvZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbXByZXNzLmMgYi9zcmMvemxpYi9jb21wcmVzcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTRkZmJlLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbXByZXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKiBjb21wcmVzcy5jIC0tIGNvbXByZXNzIGEgbWVtb3J5IGJ1ZmZlcgotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotI2RlZmluZSBaTElCX0lOVEVSTkFMCi0jaW5jbHVkZSAiemxpYi5oIgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgQ29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIFRoZSBsZXZlbAotICAgcGFyYW1ldGVyIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGluIGRlZmxhdGVJbml0LiAgc291cmNlTGVuIGlzIHRoZSBieXRlCi0gICBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlCi0gICBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgMC4xJSBsYXJnZXIgdGhhbiBzb3VyY2VMZW4gcGx1cwotICAgMTIgYnl0ZXMuIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyLgotCi0gICAgIGNvbXByZXNzMiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKLSAgIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwKLSAgIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBsZXZlbCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KLSovCi1pbnQgWkVYUE9SVCBjb21wcmVzczIgKGRlc3QsIGRlc3RMZW4sIHNvdXJjZSwgc291cmNlTGVuLCBsZXZlbCkKLSAgICBCeXRlZiAqZGVzdDsKLSAgICB1TG9uZ2YgKmRlc3RMZW47Ci0gICAgY29uc3QgQnl0ZWYgKnNvdXJjZTsKLSAgICB1TG9uZyBzb3VyY2VMZW47Ci0gICAgaW50IGxldmVsOwotewotICAgIHpfc3RyZWFtIHN0cmVhbTsKLSAgICBpbnQgZXJyOwotCi0gICAgc3RyZWFtLm5leHRfaW4gPSAoQnl0ZWYqKXNvdXJjZTsKLSAgICBzdHJlYW0uYXZhaWxfaW4gPSAodUludClzb3VyY2VMZW47Ci0jaWZkZWYgTUFYU0VHXzY0SwotICAgIC8qIENoZWNrIGZvciBzb3VyY2UgPiA2NEsgb24gMTYtYml0IG1hY2hpbmU6ICovCi0gICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfaW4gIT0gc291cmNlTGVuKSByZXR1cm4gWl9CVUZfRVJST1I7Ci0jZW5kaWYKLSAgICBzdHJlYW0ubmV4dF9vdXQgPSBkZXN0OwotICAgIHN0cmVhbS5hdmFpbF9vdXQgPSAodUludCkqZGVzdExlbjsKLSAgICBpZiAoKHVMb25nKXN0cmVhbS5hdmFpbF9vdXQgIT0gKmRlc3RMZW4pIHJldHVybiBaX0JVRl9FUlJPUjsKLQotICAgIHN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOwotICAgIHN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKLSAgICBzdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwotCi0gICAgZXJyID0gZGVmbGF0ZUluaXQoJnN0cmVhbSwgbGV2ZWwpOwotICAgIGlmIChlcnIgIT0gWl9PSykgcmV0dXJuIGVycjsKLQotICAgIGVyciA9IGRlZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOwotICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKSB7Ci0gICAgICAgIGRlZmxhdGVFbmQoJnN0cmVhbSk7Ci0gICAgICAgIHJldHVybiBlcnIgPT0gWl9PSyA/IFpfQlVGX0VSUk9SIDogZXJyOwotICAgIH0KLSAgICAqZGVzdExlbiA9IHN0cmVhbS50b3RhbF9vdXQ7Ci0KLSAgICBlcnIgPSBkZWZsYXRlRW5kKCZzdHJlYW0pOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1pbnQgWkVYUE9SVCBjb21wcmVzcyAoZGVzdCwgZGVzdExlbiwgc291cmNlLCBzb3VyY2VMZW4pCi0gICAgQnl0ZWYgKmRlc3Q7Ci0gICAgdUxvbmdmICpkZXN0TGVuOwotICAgIGNvbnN0IEJ5dGVmICpzb3VyY2U7Ci0gICAgdUxvbmcgc291cmNlTGVuOwotewotICAgIHJldHVybiBjb21wcmVzczIoZGVzdCwgZGVzdExlbiwgc291cmNlLCBzb3VyY2VMZW4sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBJZiB0aGUgZGVmYXVsdCBtZW1MZXZlbCBvciB3aW5kb3dCaXRzIGZvciBkZWZsYXRlSW5pdCgpIGlzIGNoYW5nZWQsIHRoZW4KLSAgIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgdXBkYXRlZC4KLSAqLwotdUxvbmcgWkVYUE9SVCBjb21wcmVzc0JvdW5kIChzb3VyY2VMZW4pCi0gICAgdUxvbmcgc291cmNlTGVuOwotewotICAgIHJldHVybiBzb3VyY2VMZW4gKyAoc291cmNlTGVuID4+IDEyKSArIChzb3VyY2VMZW4gPj4gMTQpICsKLSAgICAgICAgICAgKHNvdXJjZUxlbiA+PiAyNSkgKyAxMzsKLX0KZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbmZpZ3VyZSBiL3NyYy96bGliL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzZjN2Q4ZS4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw4MTggKzAsMCBAQAotIyEvYmluL3NoCi0jIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIHpsaWIuCi0jCi0jIE5vcm1hbGx5IGNvbmZpZ3VyZSBidWlsZHMgYm90aCBhIHN0YXRpYyBhbmQgYSBzaGFyZWQgbGlicmFyeS4KLSMgSWYgeW91IHdhbnQgdG8gYnVpbGQganVzdCBhIHN0YXRpYyBsaWJyYXJ5LCB1c2U6IC4vY29uZmlndXJlIC0tc3RhdGljCi0jCi0jIFRvIGltcG9zZSBzcGVjaWZpYyBjb21waWxlciBvciBmbGFncyBvciBpbnN0YWxsIGRpcmVjdG9yeSwgdXNlIGZvciBleGFtcGxlOgotIyAgICBwcmVmaXg9JEhPTUUgQ0M9Y2MgQ0ZMQUdTPSItTzQiIC4vY29uZmlndXJlCi0jIG9yIGZvciBjc2gvdGNzaCB1c2VyczoKLSMgICAgKHNldGVudiBwcmVmaXggJEhPTUU7IHNldGVudiBDQyBjYzsgc2V0ZW52IENGTEFHUyAiLU80IjsgLi9jb25maWd1cmUpCi0KLSMgSW5jb3JyZWN0IHNldHRpbmdzIG9mIENDIG9yIENGTEFHUyBtYXkgcHJldmVudCBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotIyBJZiB5b3UgaGF2ZSBwcm9ibGVtcywgdHJ5IHdpdGhvdXQgZGVmaW5pbmcgQ0MgYW5kIENGTEFHUyBiZWZvcmUgcmVwb3J0aW5nCi0jIGFuIGVycm9yLgotCi0jIHN0YXJ0IG9mZiBjb25maWd1cmUubG9nCi1lY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tID4+IGNvbmZpZ3VyZS5sb2cKLWVjaG8gJDAgJCogPj4gY29uZmlndXJlLmxvZwotZGF0ZSA+PiBjb25maWd1cmUubG9nCi0KLSMgc2V0IGNvbW1hbmQgcHJlZml4IGZvciBjcm9zcy1jb21waWxhdGlvbgotaWYgWyAtbiAiJHtDSE9TVH0iIF07IHRoZW4KLSAgICB1bmFtZT0iYGVjaG8gIiR7Q0hPU1R9IiB8IHNlZCAtZSAncy9eW14tXSotXChbXi1dKlwpJC9cMS8nIC1lICdzL15bXi1dKi1bXi1dKi1cKFteLV0qXCkkL1wxLycgLWUgJ3MvXlteLV0qLVteLV0qLVwoW14tXSpcKS0uKiQvXDEvJ2AiCi0gICAgQ1JPU1NfUFJFRklYPSIke0NIT1NUfS0iCi1maQotCi0jIGRlc3RpbmF0aW9uIG5hbWUgZm9yIHN0YXRpYyBsaWJyYXJ5Ci1TVEFUSUNMSUI9bGliei5hCi0KLSMgZXh0cmFjdCB6bGliIHZlcnNpb24gbnVtYmVycyBmcm9tIHpsaWIuaAotVkVSPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKC4qXCkiLiovXDEvcCcgPCB6bGliLmhgCi1WRVIzPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKFswLTldKlxcLlswLTldKlxcLlswLTldKlwpLiovXDEvcCcgPCB6bGliLmhgCi1WRVIyPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKFswLTldKlxcLlswLTldKlwpXFwuLiovXDEvcCcgPCB6bGliLmhgCi1WRVIxPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKFswLTldKlwpXFwuLiovXDEvcCcgPCB6bGliLmhgCi0KLSMgZXN0YWJsaXNoIGNvbW1hbmRzIGZvciBsaWJyYXJ5IGJ1aWxkaW5nCi1pZiAiJHtDUk9TU19QUkVGSVh9YXIiIC0tdmVyc2lvbiA+L2Rldi9udWxsIDI+L2Rldi9udWxsIHx8IHRlc3QgJD8gLWx0IDEyNjsgdGhlbgotICAgIEFSPSR7QVItIiR7Q1JPU1NfUFJFRklYfWFyIn0KLSAgICB0ZXN0IC1uICIke0NST1NTX1BSRUZJWH0iICYmIGVjaG8gVXNpbmcgJHtBUn0gfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotZWxzZQotICAgIEFSPSR7QVItImFyIn0KLSAgICB0ZXN0IC1uICIke0NST1NTX1BSRUZJWH0iICYmIGVjaG8gVXNpbmcgJHtBUn0gfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotZmkKLUFSRkxBR1M9JHtBUkZMQUdTLSJyYyJ9Ci1pZiAiJHtDUk9TU19QUkVGSVh9cmFubGliIiAtLXZlcnNpb24gPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8fCB0ZXN0ICQ/IC1sdCAxMjY7IHRoZW4KLSAgICBSQU5MSUI9JHtSQU5MSUItIiR7Q1JPU1NfUFJFRklYfXJhbmxpYiJ9Ci0gICAgdGVzdCAtbiAiJHtDUk9TU19QUkVGSVh9IiAmJiBlY2hvIFVzaW5nICR7UkFOTElCfSB8IHRlZSAtYSBjb25maWd1cmUubG9nCi1lbHNlCi0gICAgUkFOTElCPSR7UkFOTElCLSJyYW5saWIifQotZmkKLWlmICIke0NST1NTX1BSRUZJWH1ubSIgLS12ZXJzaW9uID4vZGV2L251bGwgMj4vZGV2L251bGwgfHwgdGVzdCAkPyAtbHQgMTI2OyB0aGVuCi0gICAgTk09JHtOTS0iJHtDUk9TU19QUkVGSVh9bm0ifQotICAgIHRlc3QgLW4gIiR7Q1JPU1NfUFJFRklYfSIgJiYgZWNobyBVc2luZyAke05NfSB8IHRlZSAtYSBjb25maWd1cmUubG9nCi1lbHNlCi0gICAgTk09JHtOTS0ibm0ifQotZmkKLQotIyBzZXQgZGVmYXVsdHMgYmVmb3JlIHByb2Nlc3NpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMKLUxEQ09ORklHPSR7TERDT05GSUctImxkY29uZmlnIn0KLUxEU0hBUkVETElCQz0iJHtMRFNIQVJFRExJQkMtLWxjfSIKLUFSQ0hTPQotcHJlZml4PSR7cHJlZml4LS91c3IvbG9jYWx9Ci1leGVjX3ByZWZpeD0ke2V4ZWNfcHJlZml4LScke3ByZWZpeH0nfQotbGliZGlyPSR7bGliZGlyLScke2V4ZWNfcHJlZml4fS9saWInfQotc2hhcmVkbGliZGlyPSR7c2hhcmVkbGliZGlyLScke2xpYmRpcn0nfQotaW5jbHVkZWRpcj0ke2luY2x1ZGVkaXItJyR7cHJlZml4fS9pbmNsdWRlJ30KLW1hbmRpcj0ke21hbmRpci0nJHtwcmVmaXh9L3NoYXJlL21hbid9Ci1zaGFyZWRfZXh0PScuc28nCi1zaGFyZWQ9MQotc29sbz0wCi1jb3Zlcj0wCi16cHJlZml4PTAKLWJ1aWxkNjQ9MAotZ2NjPTAKLW9sZF9jYz0iJENDIgotb2xkX2NmbGFncz0iJENGTEFHUyIKLU9CSkM9JyQoT0JKWikgJChPQkpHKScKLVBJQ19PQkpDPSckKFBJQ19PQkpaKSAkKFBJQ19PQkpHKScKLQotIyBwcm9jZXNzIGNvbW1hbmQgbGluZSBvcHRpb25zCi13aGlsZSB0ZXN0ICQjIC1nZSAxCi1kbwotY2FzZSAiJDEiIGluCi0gICAgLWgqIHwgLS1oZWxwKQotICAgICAgZWNobyAndXNhZ2U6JyB8IHRlZSAtYSBjb25maWd1cmUubG9nCi0gICAgICBlY2hvICcgIGNvbmZpZ3VyZSBbLS16cHJlZml4XSBbLS1wcmVmaXg9UFJFRklYXSAgWy0tZXByZWZpeD1FWFBSRUZJWF0nIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLSAgICAgIGVjaG8gJyAgICBbLS1zdGF0aWNdIFstLTY0XSBbLS1saWJkaXI9TElCRElSXSBbLS1zaGFyZWRsaWJkaXI9TElCRElSXScgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotICAgICAgZWNobyAnICAgIFstLWluY2x1ZGVkaXI9SU5DTFVERURJUl0gWy0tYXJjaHM9Ii1hcmNoIGkzODYgLWFyY2ggeDg2XzY0Il0nIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgLXAqPSogfCAtLXByZWZpeD0qKSBwcmVmaXg9YGVjaG8gJDEgfCBzZWQgJ3MvLio9Ly8nYDsgc2hpZnQgOzsKLSAgICAtZSo9KiB8IC0tZXByZWZpeD0qKSBleGVjX3ByZWZpeD1gZWNobyAkMSB8IHNlZCAncy8uKj0vLydgOyBzaGlmdCA7OwotICAgIC1sKj0qIHwgLS1saWJkaXI9KikgbGliZGlyPWBlY2hvICQxIHwgc2VkICdzLy4qPS8vJ2A7IHNoaWZ0IDs7Ci0gICAgLS1zaGFyZWRsaWJkaXI9Kikgc2hhcmVkbGliZGlyPWBlY2hvICQxIHwgc2VkICdzLy4qPS8vJ2A7IHNoaWZ0IDs7Ci0gICAgLWkqPSogfCAtLWluY2x1ZGVkaXI9KikgaW5jbHVkZWRpcj1gZWNobyAkMSB8IHNlZCAncy8uKj0vLydgO3NoaWZ0IDs7Ci0gICAgLXUqPSogfCAtLXVuYW1lPSopIHVuYW1lPWBlY2hvICQxIHwgc2VkICdzLy4qPS8vJ2A7c2hpZnQgOzsKLSAgICAtcCogfCAtLXByZWZpeCkgcHJlZml4PSIkMiI7IHNoaWZ0OyBzaGlmdCA7OwotICAgIC1lKiB8IC0tZXByZWZpeCkgZXhlY19wcmVmaXg9IiQyIjsgc2hpZnQ7IHNoaWZ0IDs7Ci0gICAgLWwqIHwgLS1saWJkaXIpIGxpYmRpcj0iJDIiOyBzaGlmdDsgc2hpZnQgOzsKLSAgICAtaSogfCAtLWluY2x1ZGVkaXIpIGluY2x1ZGVkaXI9IiQyIjsgc2hpZnQ7IHNoaWZ0IDs7Ci0gICAgLXMqIHwgLS1zaGFyZWQgfCAtLWVuYWJsZS1zaGFyZWQpIHNoYXJlZD0xOyBzaGlmdCA7OwotICAgIC10IHwgLS1zdGF0aWMpIHNoYXJlZD0wOyBzaGlmdCA7OwotICAgIC0tc29sbykgc29sbz0xOyBzaGlmdCA7OwotICAgIC0tY292ZXIpIGNvdmVyPTE7IHNoaWZ0IDs7Ci0gICAgLXoqIHwgLS16cHJlZml4KSB6cHJlZml4PTE7IHNoaWZ0IDs7Ci0gICAgLTYqIHwgLS02NCkgYnVpbGQ2ND0xOyBzaGlmdCA7OwotICAgIC1hKj0qIHwgLS1hcmNocz0qKSBBUkNIUz1gZWNobyAkMSB8IHNlZCAncy8uKj0vLydgOyBzaGlmdCA7OwotICAgIC0tc3lzY29uZmRpcj0qKSBlY2hvICJpZ25vcmVkIG9wdGlvbjogLS1zeXNjb25mZGlyIiB8IHRlZSAtYSBjb25maWd1cmUubG9nOyBzaGlmdCA7OwotICAgIC0tbG9jYWxzdGF0ZWRpcj0qKSBlY2hvICJpZ25vcmVkIG9wdGlvbjogLS1sb2NhbHN0YXRlZGlyIiB8IHRlZSAtYSBjb25maWd1cmUubG9nOyBzaGlmdCA7OwotICAgICopIGVjaG8gInVua25vd24gb3B0aW9uOiAkMSI7IGVjaG8gIiQwIC0taGVscCBmb3IgaGVscCIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZzsgZXhpdCAxIDs7Ci0gICAgZXNhYwotZG9uZQotCi0jIGRlZmluZSBmdW5jdGlvbnMgZm9yIHRlc3RpbmcgY29tcGlsZXIgYW5kIGxpYnJhcnkgY2hhcmFjdGVyaXN0aWNzIGFuZCBsb2dnaW5nIHRoZSByZXN1bHRzCi10ZXN0PXp0ZXN0JCQKLQotc2hvdygpCi17Ci0gIGNhc2UgIiQqIiBpbgotICAgICokdGVzdC5jKikKLSAgICAgIGVjaG8gPT09ICR0ZXN0LmMgPT09ID4+IGNvbmZpZ3VyZS5sb2cKLSAgICAgIGNhdCAkdGVzdC5jID4+IGNvbmZpZ3VyZS5sb2cKLSAgICAgIGVjaG8gPT09ID4+IGNvbmZpZ3VyZS5sb2c7OwotICBlc2FjCi0gIGVjaG8gJCogPj4gY29uZmlndXJlLmxvZwotfQotCi1jYXQgPiAkdGVzdC5jIDw8RU9GCi0jZXJyb3IgZXJyb3IKLUVPRgotaWYgKCRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmMpIDI+L2Rldi9udWxsOyB0aGVuCi0gIHRyeSgpCi0gIHsKLSAgICBzaG93ICQqCi0gICAgdGVzdCAiYCggJCogKSAyPiYxIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2dgIiA9ICIiCi0gIH0KLSAgZWNobyAtIHVzaW5nIGFueSBvdXRwdXQgZnJvbSBjb21waWxlciB0byBpbmRpY2F0ZSBhbiBlcnJvciA+PiBjb25maWd1cmUubG9nCi1lbHNlCi0gIHRyeSgpCi0gIHsKLSAgICBzaG93ICQqCi0gICAgKCAkKiApID4+IGNvbmZpZ3VyZS5sb2cgMj4mMQotICAgIHJldD0kPwotICAgIGlmIHRlc3QgJHJldCAtbmUgMDsgdGhlbgotICAgICAgZWNobyAiKGV4aXQgY29kZSAiJHJldCIpIiA+PiBjb25maWd1cmUubG9nCi0gICAgZmkKLSAgICByZXR1cm4gJHJldAotICB9Ci1maQotCi10cnlib3RoKCkKLXsKLSAgc2hvdyAkKgotICBnb3Q9YCggJCogKSAyPiYxYAotICByZXQ9JD8KLSAgcHJpbnRmICVzICIkZ290IiA+PiBjb25maWd1cmUubG9nCi0gIGlmIHRlc3QgJHJldCAtbmUgMDsgdGhlbgotICAgIHJldHVybiAkcmV0Ci0gIGZpCi0gIHRlc3QgIiRnb3QiID0gIiIKLX0KLQotZWNobyA+PiBjb25maWd1cmUubG9nCi0KLSMgY2hlY2sgZm9yIGdjYyB2cy4gY2MgYW5kIHNldCBjb21waWxlIGFuZCBsaW5rIGZsYWdzIGJhc2VkIG9uIHRoZSBzeXN0ZW0gaWRlbnRpZmllZCBieSB1bmFtZQotY2F0ID4gJHRlc3QuYyA8PEVPRgotZXh0ZXJuIGludCBnZXRjaGFyKCk7Ci1pbnQgaGVsbG8oKSB7cmV0dXJuIGdldGNoYXIoKTt9Ci1FT0YKLQotdGVzdCAteiAiJENDIiAmJiBlY2hvIENoZWNraW5nIGZvciAke0NST1NTX1BSRUZJWH1nY2MuLi4gfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotY2M9JHtDQy0ke0NST1NTX1BSRUZJWH1nY2N9Ci1jZmxhZ3M9JHtDRkxBR1MtIi1PMyJ9Ci0jIHRvIGZvcmNlIHRoZSBhc20gdmVyc2lvbiB1c2U6IENGTEFHUz0iLU8zIC1EQVNNViIgLi9jb25maWd1cmUKLWNhc2UgIiRjYyIgaW4KLSAgKmdjYyopIGdjYz0xIDs7Ci0gICpjbGFuZyopIGdjYz0xIDs7Ci1lc2FjCi1jYXNlIGAkY2MgLXYgMj4mMWAgaW4KLSAgKmdjYyopIGdjYz0xIDs7Ci1lc2FjCi0KLXNob3cgJGNjIC1jICRjZmxhZ3MgJHRlc3QuYwotaWYgdGVzdCAiJGdjYyIgLWVxIDEgJiYgKCRjYyAtYyAkY2ZsYWdzICR0ZXN0LmMpID4+IGNvbmZpZ3VyZS5sb2cgMj4mMTsgdGhlbgotICBlY2hvIC4uLiB1c2luZyBnY2MgPj4gY29uZmlndXJlLmxvZwotICBDQz0iJGNjIgotICBDRkxBR1M9IiR7Q0ZMQUdTLS1PM30gJHtBUkNIU30iCi0gIFNGTEFHUz0iJHtDRkxBR1MtLU8zfSAtZlBJQyIKLSAgTERGTEFHUz0iJHtMREZMQUdTfSAke0FSQ0hTfSIKLSAgaWYgdGVzdCAkYnVpbGQ2NCAtZXEgMTsgdGhlbgotICAgIENGTEFHUz0iJHtDRkxBR1N9IC1tNjQiCi0gICAgU0ZMQUdTPSIke1NGTEFHU30gLW02NCIKLSAgZmkKLSAgaWYgdGVzdCAiJHtaTElCR0NDV0FSTn0iID0gIllFUyI7IHRoZW4KLSAgICBDRkxBR1M9IiR7Q0ZMQUdTfSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyIKLSAgZmkKLSAgaWYgdGVzdCAteiAiJHVuYW1lIjsgdGhlbgotICAgIHVuYW1lPWAodW5hbWUgLXMgfHwgZWNobyB1bmtub3duKSAyPi9kZXYvbnVsbGAKLSAgZmkKLSAgY2FzZSAiJHVuYW1lIiBpbgotICBMaW51eCogfCBsaW51eCogfCBHTlUgfCBHTlUvKiB8IHNvbGFyaXMqKQotICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLXNoYXJlZCAtV2wsLXNvbmFtZSxsaWJ6LnNvLjEsLS12ZXJzaW9uLXNjcmlwdCx6bGliLm1hcCJ9IDs7Ci0gICpCU0QgfCAqYnNkKiB8IERyYWdvbkZseSkKLSAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iJGNjIC1zaGFyZWQgLVdsLC1zb25hbWUsbGliei5zby4xLC0tdmVyc2lvbi1zY3JpcHQsemxpYi5tYXAifQotICAgICAgICBMRENPTkZJRz0ibGRjb25maWcgLW0iIDs7Ci0gIENZR1dJTiogfCBDeWd3aW4qIHwgY3lnd2luKiB8IE9TLzIqKQotICAgICAgICBFWEU9Jy5leGUnIDs7Ci0gIE1JTkdXKiB8IG1pbmd3KikKLSMgdGVtcG9yYXJ5IGJ5cGFzcwotICAgICAgICBybSAtZiAkdGVzdC5bY29dICR0ZXN0ICR0ZXN0JHNoYXJlZF9leHQKLSAgICAgICAgZWNobyAiUGxlYXNlIHVzZSB3aW4zMi9NYWtlZmlsZS5nY2MgaW5zdGVhZC4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLSAgICAgICAgZXhpdCAxCi0gICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtIiRjYyAtc2hhcmVkIn0KLSAgICAgICAgTERTSEFSRURMSUJDPSIiCi0gICAgICAgIEVYRT0nLmV4ZScgOzsKLSAgUU5YKikgICMgVGhpcyBpcyBmb3IgUU5YNi4gSSBzdXBwb3NlIHRoYXQgdGhlIFFOWCBydWxlIGJlbG93IGlzIGZvciBRTlgyLFFOWDQKLSAgICAgICAgICMgKGFsYWluLmJvbm5lZm95QGljYnQuY29tKQotICAgICAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLXNoYXJlZCAtV2wsLWhsaWJ6LnNvLjEifSA7OwotICBIUC1VWCopCi0gICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLXNoYXJlZCAkU0ZMQUdTIn0KLSAgICAgICAgIGNhc2UgYCh1bmFtZSAtbSB8fCBlY2hvIHVua25vd24pIDI+L2Rldi9udWxsYCBpbgotICAgICAgICAgaWE2NCkKLSAgICAgICAgICAgICAgICAgc2hhcmVkX2V4dD0nLnNvJwotICAgICAgICAgICAgICAgICBTSEFSRURMSUI9J2xpYnouc28nIDs7Ci0gICAgICAgICAqKQotICAgICAgICAgICAgICAgICBzaGFyZWRfZXh0PScuc2wnCi0gICAgICAgICAgICAgICAgIFNIQVJFRExJQj0nbGliei5zbCcgOzsKLSAgICAgICAgIGVzYWMgOzsKLSAgRGFyd2luKiB8IGRhcndpbiopCi0gICAgICAgICAgICAgc2hhcmVkX2V4dD0nLmR5bGliJwotICAgICAgICAgICAgIFNIQVJFRExJQj1saWJ6JHNoYXJlZF9leHQKLSAgICAgICAgICAgICBTSEFSRURMSUJWPWxpYnouJFZFUiRzaGFyZWRfZXh0Ci0gICAgICAgICAgICAgU0hBUkVETElCTT1saWJ6LiRWRVIxJHNoYXJlZF9leHQKLSAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLWR5bmFtaWNsaWIgLWluc3RhbGxfbmFtZSAkbGliZGlyLyRTSEFSRURMSUJNIC1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJFZFUjEgLWN1cnJlbnRfdmVyc2lvbiAkVkVSMyJ9Ci0gICAgICAgICAgICAgQVI9Ii91c3IvYmluL2xpYnRvb2wiCi0gICAgICAgICAgICAgQVJGTEFHUz0iLW8iIDs7Ci0gICopICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtIiRjYyAtc2hhcmVkIn0gOzsKLSAgZXNhYwotZWxzZQotICAjIGZpbmQgc3lzdGVtIG5hbWUgYW5kIGNvcnJlc3BvbmRpbmcgY2Mgb3B0aW9ucwotICBDQz0ke0NDLWNjfQotICBnY2M9MAotICBlY2hvIC4uLiB1c2luZyAkQ0MgPj4gY29uZmlndXJlLmxvZwotICBpZiB0ZXN0IC16ICIkdW5hbWUiOyB0aGVuCi0gICAgdW5hbWU9YCh1bmFtZSAtc3IgfHwgZWNobyB1bmtub3duKSAyPi9kZXYvbnVsbGAKLSAgZmkKLSAgY2FzZSAiJHVuYW1lIiBpbgotICBIUC1VWCopICAgIFNGTEFHUz0ke0NGTEFHUy0iLU8gK3oifQotICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8ifQotIyAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImxkIC1iICt2bm9jb21wYXR3YXJuaW5ncyJ9Ci0gICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0ibGQgLWIifQotICAgICAgICAgY2FzZSBgKHVuYW1lIC1tIHx8IGVjaG8gdW5rbm93bikgMj4vZGV2L251bGxgIGluCi0gICAgICAgICBpYTY0KQotICAgICAgICAgICAgIHNoYXJlZF9leHQ9Jy5zbycKLSAgICAgICAgICAgICBTSEFSRURMSUI9J2xpYnouc28nIDs7Ci0gICAgICAgICAqKQotICAgICAgICAgICAgIHNoYXJlZF9leHQ9Jy5zbCcKLSAgICAgICAgICAgICBTSEFSRURMSUI9J2xpYnouc2wnIDs7Ci0gICAgICAgICBlc2FjIDs7Ci0gIElSSVgqKSAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItYW5zaSAtTzIgLXJwYXRoIC4ifQotICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLWFuc2kgLU8yIn0KLSAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtc2hhcmVkIC1XbCwtc29uYW1lLGxpYnouc28uMSJ9IDs7Ci0gIE9TRjFcIFY0KikgU0ZMQUdTPSR7Q0ZMQUdTLSItTyAtc3RkMSJ9Ci0gICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyAtc3RkMSJ9Ci0gICAgICAgICAgICAgTERGTEFHUz0iJHtMREZMQUdTfSAtV2wsLXJwYXRoLC4iCi0gICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLXNoYXJlZCAgLVdsLC1zb25hbWUsbGliei5zbyAtV2wsLW1zeW0gLVdsLC1ycGF0aCwkKGxpYmRpcikgLVdsLC1zZXRfdmVyc2lvbiwke1ZFUn06MS4wIn0gOzsKLSAgT1NGMSopICAgICBTRkxBR1M9JHtDRkxBR1MtIi1PIC1zdGQxIn0KLSAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIC1zdGQxIn0KLSAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtc2hhcmVkIC1XbCwtc29uYW1lLGxpYnouc28uMSJ9IDs7Ci0gIFFOWCopICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItNCAtTyJ9Ci0gICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItNCAtTyJ9Ci0gICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MifQotICAgICAgICAgICAgIFJBTkxJQj0ke1JBTkxJQi0idHJ1ZSJ9Ci0gICAgICAgICAgICAgQVI9ImNjIgotICAgICAgICAgICAgIEFSRkxBR1M9Ii1BIiA7OwotICBTQ09fU1ZcIDMuMiopIFNGTEFHUz0ke0NGTEFHUy0iLU8zIC1keSAtS1BJQyAifQotICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8zIn0KLSAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtZHkgLUtQSUMgLUcifSA7OwotICBTdW5PU1wgNSogfCBzb2xhcmlzKikKLSAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1HIC1oIGxpYnokc2hhcmVkX2V4dC4kVkVSMSJ9Ci0gICAgICAgICBTRkxBR1M9JHtDRkxBR1MtIi1mYXN0IC1LUElDIn0KLSAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLWZhc3QifQotICAgICAgICAgaWYgdGVzdCAkYnVpbGQ2NCAtZXEgMTsgdGhlbgotICAgICAgICAgICAgICMgb2xkIHZlcnNpb25zIG9mIFN1blBSTy9Xb3Jrc2hvcC9TdHVkaW8gZG9uJ3Qgc3VwcG9ydCAtbTY0LAotICAgICAgICAgICAgICMgYnV0IG5ld2VyIG9uZXMgZG8uICBDaGVjayBmb3IgaXQuCi0gICAgICAgICAgICAgZmxhZzY0PWAkQ0MgLWZsYWdzIHwgZWdyZXAgLS0gJ14tbTY0J2AKLSAgICAgICAgICAgICBpZiB0ZXN0IHgiJGZsYWc2NCIgIT0geCIiIDsgdGhlbgotICAgICAgICAgICAgICAgICBDRkxBR1M9IiR7Q0ZMQUdTfSAtbTY0IgotICAgICAgICAgICAgICAgICBTRkxBR1M9IiR7U0ZMQUdTfSAtbTY0IgotICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgY2FzZSBgKHVuYW1lIC1tIHx8IGVjaG8gdW5rbm93bikgMj4vZGV2L251bGxgIGluCi0gICAgICAgICAgICAgICAgICAgaTg2KikKLSAgICAgICAgICAgICAgICAgICAgIFNGTEFHUz0iJFNGTEFHUyAteGFyY2g9YW1kNjQiCi0gICAgICAgICAgICAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLXhhcmNoPWFtZDY0IiA7OwotICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICBTRkxBR1M9IiRTRkxBR1MgLXhhcmNoPXY5IgotICAgICAgICAgICAgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC14YXJjaD12OSIgOzsKLSAgICAgICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgIGZpCi0gICAgICAgICBmaQotICAgICAgICAgOzsKLSAgU3VuT1NcIDQqKSBTRkxBR1M9JHtDRkxBR1MtIi1PMiAtUElDIn0KLSAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PMiJ9Ci0gICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0ibGQifSA7OwotICBTdW5TdHVkaW9cIDkqKSBTRkxBR1M9JHtDRkxBR1MtIi1mYXN0IC14Y29kZT1waWMzMiAteHRhcmdldD11bHRyYTMgLXhhcmNoPXY5YiJ9Ci0gICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItZmFzdCAteHRhcmdldD11bHRyYTMgLXhhcmNoPXY5YiJ9Ci0gICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLXhhcmNoPXY5YiJ9IDs7Ci0gIFVOSVhfU3lzdGVtX1ZcIDQuMi4wKQotICAgICAgICAgICAgIFNGTEFHUz0ke0NGTEFHUy0iLUtQSUMgLU8ifQotICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8ifQotICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1HIn0gOzsKLSAgVU5JWF9TVlwgNC4yTVApCi0gICAgICAgICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItS2NvbmZvcm1fcGljIC1PIn0KLSAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIn0KLSAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtRyJ9IDs7Ci0gIE9wZW5VTklYXCA1KQotICAgICAgICAgICAgIFNGTEFHUz0ke0NGTEFHUy0iLUtQSUMgLU8ifQotICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8ifQotICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1HIn0gOzsKLSAgQUlYKikgICMgQ291cnRlc3kgb2YgZGJha2tlckBhcnJheWFzb2x1dGlvbnMuY29tCi0gICAgICAgICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItTyAtcW1heG1lbT04MTkyIn0KLSAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIC1xbWF4bWVtPTgxOTIifQotICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtInhsYyAtRyJ9IDs7Ci0gICMgc2VuZCB3b3JraW5nIG9wdGlvbnMgZm9yIG90aGVyIHN5c3RlbXMgdG8gemxpYkBnemlwLm9yZwotICAqKSAgICAgICAgIFNGTEFHUz0ke0NGTEFHUy0iLU8ifQotICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8ifQotICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1zaGFyZWQifSA7OwotICBlc2FjCi1maQotCi0jIGRlc3RpbmF0aW9uIG5hbWVzIGZvciBzaGFyZWQgbGlicmFyeSBpZiBub3QgZGVmaW5lZCBhYm92ZQotU0hBUkVETElCPSR7U0hBUkVETElCLSJsaWJ6JHNoYXJlZF9leHQifQotU0hBUkVETElCVj0ke1NIQVJFRExJQlYtImxpYnokc2hhcmVkX2V4dC4kVkVSIn0KLVNIQVJFRExJQk09JHtTSEFSRURMSUJNLSJsaWJ6JHNoYXJlZF9leHQuJFZFUjEifQotCi1lY2hvID4+IGNvbmZpZ3VyZS5sb2cKLQotIyBzZWUgaWYgc2hhcmVkIGxpYnJhcnkgYnVpbGQgc3VwcG9ydGVkCi1pZiB0ZXN0ICRzaGFyZWQgLWVxIDE7IHRoZW4KLSAgZWNobyBDaGVja2luZyBmb3Igc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4uLiB8IHRlZSAtYSBjb25maWd1cmUubG9nCi0gICMgd2UgbXVzdCB0ZXN0IGluIHR3byBzdGVwcyAoY2MgdGhlbiBsZCksIHJlcXVpcmVkIGF0IGxlYXN0IG9uIFN1bk9TIDQueAotICBpZiB0cnkgJENDIC13IC1jICRTRkxBR1MgJHRlc3QuYyAmJgotICAgICB0cnkgJExEU0hBUkVEICRTRkxBR1MgLW8gJHRlc3Qkc2hhcmVkX2V4dCAkdGVzdC5vOyB0aGVuCi0gICAgZWNobyBCdWlsZGluZyBzaGFyZWQgbGlicmFyeSAkU0hBUkVETElCViB3aXRoICRDQy4gfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotICBlbGlmIHRlc3QgLXogIiRvbGRfY2MiIC1hIC16ICIkb2xkX2NmbGFncyI7IHRoZW4KLSAgICBlY2hvIE5vIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLSAgICBzaGFyZWQ9MDsKLSAgZWxzZQotICAgIGVjaG8gJ05vIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQ7IHRyeSB3aXRob3V0IGRlZmluaW5nIENDIGFuZCBDRkxBR1MnIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLSAgICBzaGFyZWQ9MDsKLSAgZmkKLWZpCi1pZiB0ZXN0ICRzaGFyZWQgLWVxIDA7IHRoZW4KLSAgTERTSEFSRUQ9IiRDQyIKLSAgQUxMPSJzdGF0aWMiCi0gIFRFU1Q9ImFsbCB0ZXN0c3RhdGljIgotICBTSEFSRURMSUI9IiIKLSAgU0hBUkVETElCVj0iIgotICBTSEFSRURMSUJNPSIiCi0gIGVjaG8gQnVpbGRpbmcgc3RhdGljIGxpYnJhcnkgJFNUQVRJQ0xJQiB2ZXJzaW9uICRWRVIgd2l0aCAkQ0MuIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLWVsc2UKLSAgQUxMPSJzdGF0aWMgc2hhcmVkIgotICBURVNUPSJhbGwgdGVzdHN0YXRpYyB0ZXN0c2hhcmVkIgotZmkKLQotZWNobyA+PiBjb25maWd1cmUubG9nCi0KLSMgY2hlY2sgZm9yIHVuZGVyc2NvcmVzIGluIGV4dGVybmFsIG5hbWVzIGZvciB1c2UgYnkgYXNzZW1ibGVyIGNvZGUKLUNQUD0ke0NQUC0iJENDIC1FIn0KLWNhc2UgJENGTEFHUyBpbgotICAqQVNNViopCi0gICAgZWNobyA+PiBjb25maWd1cmUubG9nCi0gICAgc2hvdyAiJE5NICR0ZXN0Lm8gfCBncmVwIF9oZWxsbyIKLSAgICBpZiB0ZXN0ICJgJE5NICR0ZXN0Lm8gfCBncmVwIF9oZWxsbyB8IHRlZSAtYSBjb25maWd1cmUubG9nYCIgPSAiIjsgdGhlbgotICAgICAgQ1BQPSIkQ1BQIC1ETk9fVU5ERVJMSU5FIgotICAgICAgZWNobyBDaGVja2luZyBmb3IgdW5kZXJsaW5lIGluIGV4dGVybmFsIG5hbWVzLi4uIE5vLiB8IHRlZSAtYSBjb25maWd1cmUubG9nCi0gICAgZWxzZQotICAgICAgZWNobyBDaGVja2luZyBmb3IgdW5kZXJsaW5lIGluIGV4dGVybmFsIG5hbWVzLi4uIFllcy4gfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotICAgIGZpIDs7Ci1lc2FjCi0KLWVjaG8gPj4gY29uZmlndXJlLmxvZwotCi0jIGNoZWNrIGZvciBsYXJnZSBmaWxlIHN1cHBvcnQsIGFuZCBpZiBub25lLCBjaGVjayBmb3IgZnNlZWtvKCkKLWNhdCA+ICR0ZXN0LmMgPDxFT0YKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLW9mZjY0X3QgZHVtbXkgPSAwOwotRU9GCi1pZiB0cnkgJENDIC1jICRDRkxBR1MgLURfTEFSR0VGSUxFNjRfU09VUkNFPTEgJHRlc3QuYzsgdGhlbgotICBDRkxBR1M9IiR7Q0ZMQUdTfSAtRF9MQVJHRUZJTEU2NF9TT1VSQ0U9MSIKLSAgU0ZMQUdTPSIke1NGTEFHU30gLURfTEFSR0VGSUxFNjRfU09VUkNFPTEiCi0gIEFMTD0iJHtBTEx9IGFsbDY0IgotICBURVNUPSIke1RFU1R9IHRlc3Q2NCIKLSAgZWNobyAiQ2hlY2tpbmcgZm9yIG9mZjY0X3QuLi4gWWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotICBlY2hvICJDaGVja2luZyBmb3IgZnNlZWtvLi4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLWVsc2UKLSAgZWNobyAiQ2hlY2tpbmcgZm9yIG9mZjY0X3QuLi4gTm8uIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCi0gIGVjaG8gPj4gY29uZmlndXJlLmxvZwotICBjYXQgPiAkdGVzdC5jIDw8RU9GCi0jaW5jbHVkZSA8c3RkaW8uaD4KLWludCBtYWluKHZvaWQpIHsKLSAgZnNlZWtvKE5VTEwsIDAsIDApOwotICByZXR1cm4gMDsKLX0KLUVPRgotICBpZiB0cnkgJENDICRDRkxBR1MgLW8gJHRlc3QgJHRlc3QuYzsgdGhlbgotICAgIGVjaG8gIkNoZWNraW5nIGZvciBmc2Vla28uLi4gWWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotICBlbHNlCi0gICAgQ0ZMQUdTPSIke0NGTEFHU30gLUROT19GU0VFS08iCi0gICAgU0ZMQUdTPSIke1NGTEFHU30gLUROT19GU0VFS08iCi0gICAgZWNobyAiQ2hlY2tpbmcgZm9yIGZzZWVrby4uLiBOby4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLSAgZmkKLWZpCi0KLWVjaG8gPj4gY29uZmlndXJlLmxvZwotCi0jIGNoZWNrIGZvciBzdHJlcnJvcigpIGZvciB1c2UgYnkgZ3oqIGZ1bmN0aW9ucwotY2F0ID4gJHRlc3QuYyA8PEVPRgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci1pbnQgbWFpbigpIHsgcmV0dXJuIHN0cmxlbihzdHJlcnJvcihlcnJubykpOyB9Ci1FT0YKLWlmIHRyeSAkQ0MgJENGTEFHUyAtbyAkdGVzdCAkdGVzdC5jOyB0aGVuCi0gIGVjaG8gIkNoZWNraW5nIGZvciBzdHJlcnJvci4uLiBZZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCi1lbHNlCi0gIENGTEFHUz0iJHtDRkxBR1N9IC1ETk9fU1RSRVJST1IiCi0gIFNGTEFHUz0iJHtTRkxBR1N9IC1ETk9fU1RSRVJST1IiCi0gIGVjaG8gIkNoZWNraW5nIGZvciBzdHJlcnJvci4uLiBOby4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLWZpCi0KLSMgY29weSBjbGVhbiB6Y29uZi5oIGZvciBzdWJzZXF1ZW50IGVkaXRzCi1jcCAtcCB6Y29uZi5oLmluIHpjb25mLmgKLQotZWNobyA+PiBjb25maWd1cmUubG9nCi0KLSMgY2hlY2sgZm9yIHVuaXN0ZC5oIGFuZCBzYXZlIHJlc3VsdCBpbiB6Y29uZi5oCi1jYXQgPiAkdGVzdC5jIDw8RU9GCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci1pbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KLUVPRgotaWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KLSAgc2VkIDwgemNvbmYuaCAiL14jaWZkZWYgSEFWRV9VTklTVERfSC4qIG1heSBiZS9zL2RlZiBIQVZFX1VOSVNURF9IXCguKlwpIG1heSBiZS8gMVwxIHdhcy8iID4gemNvbmYudGVtcC5oCi0gIG12IHpjb25mLnRlbXAuaCB6Y29uZi5oCi0gIGVjaG8gIkNoZWNraW5nIGZvciB1bmlzdGQuaC4uLiBZZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCi1lbHNlCi0gIGVjaG8gIkNoZWNraW5nIGZvciB1bmlzdGQuaC4uLiBOby4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLWZpCi0KLWVjaG8gPj4gY29uZmlndXJlLmxvZwotCi0jIGNoZWNrIGZvciBzdGRhcmcuaCBhbmQgc2F2ZSByZXN1bHQgaW4gemNvbmYuaAotY2F0ID4gJHRlc3QuYyA8PEVPRgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotaW50IG1haW4oKSB7IHJldHVybiAwOyB9Ci1FT0YKLWlmIHRyeSAkQ0MgLWMgJENGTEFHUyAkdGVzdC5jOyB0aGVuCi0gIHNlZCA8IHpjb25mLmggIi9eI2lmZGVmIEhBVkVfU1REQVJHX0guKiBtYXkgYmUvcy9kZWYgSEFWRV9TVERBUkdfSFwoLipcKSBtYXkgYmUvIDFcMSB3YXMvIiA+IHpjb25mLnRlbXAuaAotICBtdiB6Y29uZi50ZW1wLmggemNvbmYuaAotICBlY2hvICJDaGVja2luZyBmb3Igc3RkYXJnLmguLi4gWWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotZWxzZQotICBlY2hvICJDaGVja2luZyBmb3Igc3RkYXJnLmguLi4gTm8uIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCi1maQotCi0jIGlmIHRoZSB6XyBwcmVmaXggd2FzIHJlcXVlc3RlZCwgc2F2ZSB0aGF0IGluIHpjb25mLmgKLWlmIHRlc3QgJHpwcmVmaXggLWVxIDE7IHRoZW4KLSAgc2VkIDwgemNvbmYuaCAiLyNpZmRlZiBaX1BSRUZJWC4qIG1heSBiZS9zL2RlZiBaX1BSRUZJWFwoLipcKSBtYXkgYmUvIDFcMSB3YXMvIiA+IHpjb25mLnRlbXAuaAotICBtdiB6Y29uZi50ZW1wLmggemNvbmYuaAotICBlY2hvID4+IGNvbmZpZ3VyZS5sb2cKLSAgZWNobyAiVXNpbmcgel8gcHJlZml4IG9uIGFsbCBzeW1ib2xzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotZmkKLQotIyBpZiAtLXNvbG8gY29tcGlsYXRpb24gd2FzIHJlcXVlc3RlZCwgc2F2ZSB0aGF0IGluIHpjb25mLmggYW5kIHJlbW92ZSBneiBzdHVmZiBmcm9tIG9iamVjdCBsaXN0cwotaWYgdGVzdCAkc29sbyAtZXEgMTsgdGhlbgotICBzZWQgJy8jZGVmaW5lIFpDT05GX0gvYVwKLSNkZWZpbmUgWl9TT0xPCi0KLScgPCB6Y29uZi5oID4gemNvbmYudGVtcC5oCi0gIG12IHpjb25mLnRlbXAuaCB6Y29uZi5oCi1PQkpDPSckKE9CSlopJwotUElDX09CSkM9JyQoUElDX09CSlopJwotZmkKLQotIyBpZiBjb2RlIGNvdmVyYWdlIHRlc3Rpbmcgd2FzIHJlcXVlc3RlZCwgdXNlIG9sZGVyIGdjYyBpZiBkZWZpbmVkLCBlLmcuICJnY2MtNC4yIiBvbiBNYWMgT1MgWAotaWYgdGVzdCAkY292ZXIgLWVxIDE7IHRoZW4KLSAgQ0ZMQUdTPSIke0NGTEFHU30gLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlIgotICBpZiB0ZXN0IC1uICIkR0NDX0NMQVNTSUMiOyB0aGVuCi0gICAgQ0M9JEdDQ19DTEFTU0lDCi0gIGZpCi1maQotCi1lY2hvID4+IGNvbmZpZ3VyZS5sb2cKLQotIyBjb25kdWN0IGEgc2VyaWVzIG9mIHRlc3RzIHRvIHJlc29sdmUgZWlnaHQgcG9zc2libGUgY2FzZXMgb2YgdXNpbmcgInZzIiBvciAicyIgcHJpbnRmIGZ1bmN0aW9ucwotIyAodXNpbmcgc3RkYXJnIG9yIG5vdCksIHdpdGggb3Igd2l0aG91dCAibiIgKHByb3Zpbmcgc2l6ZSBvZiBidWZmZXIpLCBhbmQgd2l0aCBvciB3aXRob3V0IGEKLSMgcmV0dXJuIHZhbHVlLiAgVGhlIG1vc3Qgc2VjdXJlIHJlc3VsdCBpcyB2c25wcmludGYoKSB3aXRoIGEgcmV0dXJuIHZhbHVlLiAgc25wcmludGYoKSB3aXRoIGEKLSMgcmV0dXJuIHZhbHVlIGlzIHNlY3VyZSBhcyB3ZWxsLCBidXQgdGhlbiBnenByaW50ZigpIHdpbGwgYmUgbGltaXRlZCB0byAyMCBhcmd1bWVudHMuCi1jYXQgPiAkdGVzdC5jIDw8RU9GCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlICJ6Y29uZi5oIgotaW50IG1haW4oKQotewotI2lmbmRlZiBTVERDCi0gIGNob2tlIG1lCi0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci1FT0YKLWlmIHRyeSAkQ0MgLWMgJENGTEFHUyAkdGVzdC5jOyB0aGVuCi0gIGVjaG8gIkNoZWNraW5nIHdoZXRoZXIgdG8gdXNlIHZzW25dcHJpbnRmKCkgb3Igc1tuXXByaW50ZigpLi4uIHVzaW5nIHZzW25dcHJpbnRmKCkuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCi0KLSAgZWNobyA+PiBjb25maWd1cmUubG9nCi0gIGNhdCA+ICR0ZXN0LmMgPDxFT0YKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotaW50IG15dGVzdChjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgY2hhciBidWZbMjBdOwotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgZm10KTsKLSAgdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXApOwotICB2YV9lbmQoYXApOwotICByZXR1cm4gMDsKLX0KLWludCBtYWluKCkKLXsKLSAgcmV0dXJuIChteXRlc3QoIkhlbGxvJWRcbiIsIDEpKTsKLX0KLUVPRgotICBpZiB0cnkgJENDICRDRkxBR1MgLW8gJHRlc3QgJHRlc3QuYzsgdGhlbgotICAgIGVjaG8gIkNoZWNraW5nIGZvciB2c25wcmludGYoKSBpbiBzdGRpby5oLi4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLQotICAgIGVjaG8gPj4gY29uZmlndXJlLmxvZwotICAgIGNhdCA+JHRlc3QuYyA8PEVPRgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci1pbnQgbXl0ZXN0KGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICBpbnQgbjsKLSAgY2hhciBidWZbMjBdOwotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgZm10KTsKLSAgbiA9IHZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFwKTsKLSAgdmFfZW5kKGFwKTsKLSAgcmV0dXJuIG47Ci19Ci1pbnQgbWFpbigpCi17Ci0gIHJldHVybiAobXl0ZXN0KCJIZWxsbyVkXG4iLCAxKSk7Ci19Ci1FT0YKLQotICAgIGlmIHRyeSAkQ0MgLWMgJENGTEFHUyAkdGVzdC5jOyB0aGVuCi0gICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHZzbnByaW50ZigpLi4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLSAgICBlbHNlCi0gICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVNfdnNucHJpbnRmX3ZvaWQiCi0gICAgICBTRkxBR1M9IiRTRkxBR1MgLURIQVNfdnNucHJpbnRmX3ZvaWQiCi0gICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHZzbnByaW50ZigpLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotICAgICAgZWNobyAiICBXQVJOSU5HOiBhcHBhcmVudGx5IHZzbnByaW50ZigpIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLiB6bGliIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCi0gICAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIHN0cmluZy1mb3JtYXQgc2VjdXJpdHkiIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLSAgICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotICAgIGZpCi0gIGVsc2UKLSAgICBDRkxBR1M9IiRDRkxBR1MgLUROT192c25wcmludGYiCi0gICAgU0ZMQUdTPSIkU0ZMQUdTIC1ETk9fdnNucHJpbnRmIgotICAgIGVjaG8gIkNoZWNraW5nIGZvciB2c25wcmludGYoKSBpbiBzdGRpby5oLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotICAgIGVjaG8gIiAgV0FSTklORzogdnNucHJpbnRmKCkgbm90IGZvdW5kLCBmYWxsaW5nIGJhY2sgdG8gdnNwcmludGYoKS4gemxpYiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotICAgIGVjaG8gIiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJlIG9wZW4gdG8gcG9zc2libGUgYnVmZmVyLW92ZXJmbG93IHNlY3VyaXR5IiB8IHRlZSAtYSBjb25maWd1cmUubG9nCi0gICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCi0KLSAgICBlY2hvID4+IGNvbmZpZ3VyZS5sb2cKLSAgICBjYXQgPiR0ZXN0LmMgPDxFT0YKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotaW50IG15dGVzdChjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgaW50IG47Ci0gIGNoYXIgYnVmWzIwXTsKLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gIG4gPSB2c3ByaW50ZihidWYsIGZtdCwgYXApOwotICB2YV9lbmQoYXApOwotICByZXR1cm4gbjsKLX0KLWludCBtYWluKCkKLXsKLSAgcmV0dXJuIChteXRlc3QoIkhlbGxvJWRcbiIsIDEpKTsKLX0KLUVPRgotCi0gICAgaWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KLSAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2YgdnNwcmludGYoKS4uLiBZZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCi0gICAgZWxzZQotICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ESEFTX3ZzcHJpbnRmX3ZvaWQiCi0gICAgICBTRkxBR1M9IiRTRkxBR1MgLURIQVNfdnNwcmludGZfdm9pZCIKLSAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2YgdnNwcmludGYoKS4uLiBOby4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLSAgICAgIGVjaG8gIiAgV0FSTklORzogYXBwYXJlbnRseSB2c3ByaW50ZigpIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLiB6bGliIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCi0gICAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIHN0cmluZy1mb3JtYXQgc2VjdXJpdHkiIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLSAgICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotICAgIGZpCi0gIGZpCi1lbHNlCi0gIGVjaG8gIkNoZWNraW5nIHdoZXRoZXIgdG8gdXNlIHZzW25dcHJpbnRmKCkgb3Igc1tuXXByaW50ZigpLi4uIHVzaW5nIHNbbl1wcmludGYoKS4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLQotICBlY2hvID4+IGNvbmZpZ3VyZS5sb2cKLSAgY2F0ID4kdGVzdC5jIDw8RU9GCi0jaW5jbHVkZSA8c3RkaW8uaD4KLWludCBteXRlc3QoKQotewotICBjaGFyIGJ1ZlsyMF07Ci0gIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyIsICJmb28iKTsKLSAgcmV0dXJuIDA7Ci19Ci1pbnQgbWFpbigpCi17Ci0gIHJldHVybiAobXl0ZXN0KCkpOwotfQotRU9GCi0KLSAgaWYgdHJ5ICRDQyAkQ0ZMQUdTIC1vICR0ZXN0ICR0ZXN0LmM7IHRoZW4KLSAgICBlY2hvICJDaGVja2luZyBmb3Igc25wcmludGYoKSBpbiBzdGRpby5oLi4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLQotICAgIGVjaG8gPj4gY29uZmlndXJlLmxvZwotICAgIGNhdCA+JHRlc3QuYyA8PEVPRgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci1pbnQgbXl0ZXN0KCkKLXsKLSAgY2hhciBidWZbMjBdOwotICByZXR1cm4gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzIiwgImZvbyIpOwotfQotaW50IG1haW4oKQotewotICByZXR1cm4gKG15dGVzdCgpKTsKLX0KLUVPRgotCi0gICAgaWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KLSAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc25wcmludGYoKS4uLiBZZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCi0gICAgZWxzZQotICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ESEFTX3NucHJpbnRmX3ZvaWQiCi0gICAgICBTRkxBR1M9IiRTRkxBR1MgLURIQVNfc25wcmludGZfdm9pZCIKLSAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc25wcmludGYoKS4uLiBOby4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLSAgICAgIGVjaG8gIiAgV0FSTklORzogYXBwYXJlbnRseSBzbnByaW50ZigpIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLiB6bGliIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCi0gICAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIHN0cmluZy1mb3JtYXQgc2VjdXJpdHkiIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLSAgICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotICAgIGZpCi0gIGVsc2UKLSAgICBDRkxBR1M9IiRDRkxBR1MgLUROT19zbnByaW50ZiIKLSAgICBTRkxBR1M9IiRTRkxBR1MgLUROT19zbnByaW50ZiIKLSAgICBlY2hvICJDaGVja2luZyBmb3Igc25wcmludGYoKSBpbiBzdGRpby5oLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotICAgIGVjaG8gIiAgV0FSTklORzogc25wcmludGYoKSBub3QgZm91bmQsIGZhbGxpbmcgYmFjayB0byBzcHJpbnRmKCkuIHpsaWIiIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLSAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIGJ1ZmZlci1vdmVyZmxvdyBzZWN1cml0eSIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotCi0gICAgZWNobyA+PiBjb25maWd1cmUubG9nCi0gICAgY2F0ID4kdGVzdC5jIDw8RU9GCi0jaW5jbHVkZSA8c3RkaW8uaD4KLWludCBteXRlc3QoKQotewotICBjaGFyIGJ1ZlsyMF07Ci0gIHJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzIiwgImZvbyIpOwotfQotaW50IG1haW4oKQotewotICByZXR1cm4gKG15dGVzdCgpKTsKLX0KLUVPRgotCi0gICAgaWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KLSAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc3ByaW50ZigpLi4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLSAgICBlbHNlCi0gICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVNfc3ByaW50Zl92b2lkIgotICAgICAgU0ZMQUdTPSIkU0ZMQUdTIC1ESEFTX3NwcmludGZfdm9pZCIKLSAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc3ByaW50ZigpLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotICAgICAgZWNobyAiICBXQVJOSU5HOiBhcHBhcmVudGx5IHNwcmludGYoKSBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4gemxpYiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotICAgICAgZWNobyAiICBjYW4gYnVpbGQgYnV0IHdpbGwgYmUgb3BlbiB0byBwb3NzaWJsZSBzdHJpbmctZm9ybWF0IHNlY3VyaXR5IiB8IHRlZSAtYSBjb25maWd1cmUubG9nCi0gICAgICBlY2hvICIgIHZ1bG5lcmFiaWxpdGllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKLSAgICBmaQotICBmaQotZmkKLQotIyBzZWUgaWYgd2UgY2FuIGhpZGUgemxpYiBpbnRlcm5hbCBzeW1ib2xzIHRoYXQgYXJlIGxpbmtlZCBiZXR3ZWVuIHNlcGFyYXRlIHNvdXJjZSBmaWxlcwotaWYgdGVzdCAiJGdjYyIgLWVxIDE7IHRoZW4KLSAgZWNobyA+PiBjb25maWd1cmUubG9nCi0gIGNhdCA+ICR0ZXN0LmMgPDxFT0YKLSNkZWZpbmUgWkxJQl9JTlRFUk5BTCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKQotaW50IFpMSUJfSU5URVJOQUwgZm9vOwotaW50IG1haW4oKQotewotICByZXR1cm4gMDsKLX0KLUVPRgotICBpZiB0cnlib3RoICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KLSAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVZFX0hJRERFTiIKLSAgICBTRkxBR1M9IiRTRkxBR1MgLURIQVZFX0hJRERFTiIKLSAgICBlY2hvICJDaGVja2luZyBmb3IgYXR0cmlidXRlKHZpc2liaWxpdHkpIHN1cHBvcnQuLi4gWWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotICBlbHNlCi0gICAgZWNobyAiQ2hlY2tpbmcgZm9yIGF0dHJpYnV0ZSh2aXNpYmlsaXR5KSBzdXBwb3J0Li4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotICBmaQotZmkKLQotZWNobyA+PiBjb25maWd1cmUubG9nCi0KLSMgZmluZCBhIGZvdXItYnl0ZSB1bnNpZ2VkIGludGVnZXIgdHlwZSBmb3IgY3JjIGNhbGN1bGF0aW9ucwotY2F0ID4gJHRlc3QuYyA8PEVPRgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZGVmaW5lIGlzMzIobix0KSBmb3Iobj0xLGs9MDtuO248PD0xLGsrKyk7aWYoaz09MzIpe3B1dHModCk7cmV0dXJuIDA7fQotaW50IG1haW4oKSB7Ci0gICAgaW50IGs7Ci0gICAgdW5zaWduZWQgaTsKLSAgICB1bnNpZ25lZCBsb25nIGw7Ci0gICAgdW5zaWduZWQgc2hvcnQgczsKLSAgICBpczMyKGksICJ1bnNpZ25lZCIpCi0gICAgaXMzMihsLCAidW5zaWduZWQgbG9uZyIpCi0gICAgaXMzMihzLCAidW5zaWduZWQgc2hvcnQiKQotICAgIHJldHVybiAxOwotfQotRU9GCi1aX1U0PSIiCi1pZiB0cnkgJENDICRDRkxBR1MgJHRlc3QuYyAtbyAkdGVzdCAmJiBaX1U0PWAuLyR0ZXN0YCAmJiB0ZXN0IC1uICIkWl9VNCI7IHRoZW4KLSAgc2VkIDwgemNvbmYuaCAiLyNkZWZpbmUgWl9VNC9zL1wvXCogXC5cL2NvbmZpZ3VyZSBtYXkvI2RlZmluZSBaX1U0ICRaX1U0ICAgXC8qIC5cL2NvbmZpZ3VyZSBwdXQgdGhlLyIgPiB6Y29uZi50ZW1wLmgKLSAgbXYgemNvbmYudGVtcC5oIHpjb25mLmgKLSAgZWNobyAiTG9va2luZyBmb3IgYSBmb3VyLWJ5dGUgaW50ZWdlciB0eXBlLi4uIEZvdW5kLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotZWxzZQotICBlY2hvICJMb29raW5nIGZvciBhIGZvdXItYnl0ZSBpbnRlZ2VyIHR5cGUuLi4gTm90IGZvdW5kLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwotZmkKLQotIyBjbGVhbiB1cCBmaWxlcyBwcm9kdWNlZCBieSBydW5uaW5nIHRoZSBjb21waWxlciBhbmQgbGlua2VyCi1ybSAtZiAkdGVzdC5bY29dICR0ZXN0ICR0ZXN0JHNoYXJlZF9leHQgJHRlc3QuZ2NubwotCi0jIHNob3cgdGhlIHJlc3VsdHMgaW4gdGhlIGxvZwotZWNobyA+PiBjb25maWd1cmUubG9nCi1lY2hvIEFMTCA9ICRBTEwgPj4gY29uZmlndXJlLmxvZwotZWNobyBBUiA9ICRBUiA+PiBjb25maWd1cmUubG9nCi1lY2hvIEFSRkxBR1MgPSAkQVJGTEFHUyA+PiBjb25maWd1cmUubG9nCi1lY2hvIENDID0gJENDID4+IGNvbmZpZ3VyZS5sb2cKLWVjaG8gQ0ZMQUdTID0gJENGTEFHUyA+PiBjb25maWd1cmUubG9nCi1lY2hvIENQUCA9ICRDUFAgPj4gY29uZmlndXJlLmxvZwotZWNobyBFWEUgPSAkRVhFID4+IGNvbmZpZ3VyZS5sb2cKLWVjaG8gTERDT05GSUcgPSAkTERDT05GSUcgPj4gY29uZmlndXJlLmxvZwotZWNobyBMREZMQUdTID0gJExERkxBR1MgPj4gY29uZmlndXJlLmxvZwotZWNobyBMRFNIQVJFRCA9ICRMRFNIQVJFRCA+PiBjb25maWd1cmUubG9nCi1lY2hvIExEU0hBUkVETElCQyA9ICRMRFNIQVJFRExJQkMgPj4gY29uZmlndXJlLmxvZwotZWNobyBPQkpDID0gJE9CSkMgPj4gY29uZmlndXJlLmxvZwotZWNobyBQSUNfT0JKQyA9ICRQSUNfT0JKQyA+PiBjb25maWd1cmUubG9nCi1lY2hvIFJBTkxJQiA9ICRSQU5MSUIgPj4gY29uZmlndXJlLmxvZwotZWNobyBTRkxBR1MgPSAkU0ZMQUdTID4+IGNvbmZpZ3VyZS5sb2cKLWVjaG8gU0hBUkVETElCID0gJFNIQVJFRExJQiA+PiBjb25maWd1cmUubG9nCi1lY2hvIFNIQVJFRExJQk0gPSAkU0hBUkVETElCTSA+PiBjb25maWd1cmUubG9nCi1lY2hvIFNIQVJFRExJQlYgPSAkU0hBUkVETElCViA+PiBjb25maWd1cmUubG9nCi1lY2hvIFNUQVRJQ0xJQiA9ICRTVEFUSUNMSUIgPj4gY29uZmlndXJlLmxvZwotZWNobyBURVNUID0gJFRFU1QgPj4gY29uZmlndXJlLmxvZwotZWNobyBWRVIgPSAkVkVSID4+IGNvbmZpZ3VyZS5sb2cKLWVjaG8gWl9VNCA9ICRaX1U0ID4+IGNvbmZpZ3VyZS5sb2cKLWVjaG8gZXhlY19wcmVmaXggPSAkZXhlY19wcmVmaXggPj4gY29uZmlndXJlLmxvZwotZWNobyBpbmNsdWRlZGlyID0gJGluY2x1ZGVkaXIgPj4gY29uZmlndXJlLmxvZwotZWNobyBsaWJkaXIgPSAkbGliZGlyID4+IGNvbmZpZ3VyZS5sb2cKLWVjaG8gbWFuZGlyID0gJG1hbmRpciA+PiBjb25maWd1cmUubG9nCi1lY2hvIHByZWZpeCA9ICRwcmVmaXggPj4gY29uZmlndXJlLmxvZwotZWNobyBzaGFyZWRsaWJkaXIgPSAkc2hhcmVkbGliZGlyID4+IGNvbmZpZ3VyZS5sb2cKLWVjaG8gdW5hbWUgPSAkdW5hbWUgPj4gY29uZmlndXJlLmxvZwotZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLSA+PiBjb25maWd1cmUubG9nCi1lY2hvID4+IGNvbmZpZ3VyZS5sb2cKLWVjaG8gPj4gY29uZmlndXJlLmxvZwotCi0jIHVkcGF0ZSBNYWtlZmlsZSB3aXRoIHRoZSBjb25maWd1cmUgcmVzdWx0cwotc2VkIDwgTWFrZWZpbGUuaW4gIgotL15DQyAqPS9zIz0uKiM9JENDIwotL15DRkxBR1MgKj0vcyM9LiojPSRDRkxBR1MjCi0vXlNGTEFHUyAqPS9zIz0uKiM9JFNGTEFHUyMKLS9eTERGTEFHUyAqPS9zIz0uKiM9JExERkxBR1MjCi0vXkxEU0hBUkVEICo9L3MjPS4qIz0kTERTSEFSRUQjCi0vXkNQUCAqPS9zIz0uKiM9JENQUCMKLS9eU1RBVElDTElCICo9L3MjPS4qIz0kU1RBVElDTElCIwotL15TSEFSRURMSUIgKj0vcyM9LiojPSRTSEFSRURMSUIjCi0vXlNIQVJFRExJQlYgKj0vcyM9LiojPSRTSEFSRURMSUJWIwotL15TSEFSRURMSUJNICo9L3MjPS4qIz0kU0hBUkVETElCTSMKLS9eQVIgKj0vcyM9LiojPSRBUiMKLS9eQVJGTEFHUyAqPS9zIz0uKiM9JEFSRkxBR1MjCi0vXlJBTkxJQiAqPS9zIz0uKiM9JFJBTkxJQiMKLS9eTERDT05GSUcgKj0vcyM9LiojPSRMRENPTkZJRyMKLS9eTERTSEFSRURMSUJDICo9L3MjPS4qIz0kTERTSEFSRURMSUJDIwotL15FWEUgKj0vcyM9LiojPSRFWEUjCi0vXnByZWZpeCAqPS9zIz0uKiM9JHByZWZpeCMKLS9eZXhlY19wcmVmaXggKj0vcyM9LiojPSRleGVjX3ByZWZpeCMKLS9ebGliZGlyICo9L3MjPS4qIz0kbGliZGlyIwotL15zaGFyZWRsaWJkaXIgKj0vcyM9LiojPSRzaGFyZWRsaWJkaXIjCi0vXmluY2x1ZGVkaXIgKj0vcyM9LiojPSRpbmNsdWRlZGlyIwotL15tYW5kaXIgKj0vcyM9LiojPSRtYW5kaXIjCi0vXk9CSkMgKj0vcyM9LiojPSAkT0JKQyMKLS9eUElDX09CSkMgKj0vcyM9LiojPSAkUElDX09CSkMjCi0vXmFsbDogKi9zIzouKiM6ICRBTEwjCi0vXnRlc3Q6ICovcyM6LiojOiAkVEVTVCMKLSIgPiBNYWtlZmlsZQotCi0jIGNyZWF0ZSB6bGliLnBjIHdpdGggdGhlIGNvbmZpZ3VyZSByZXN1bHRzCi1zZWQgPCB6bGliLnBjLmluICIKLS9eQ0MgKj0vcyM9LiojPSRDQyMKLS9eQ0ZMQUdTICo9L3MjPS4qIz0kQ0ZMQUdTIwotL15DUFAgKj0vcyM9LiojPSRDUFAjCi0vXkxEU0hBUkVEICo9L3MjPS4qIz0kTERTSEFSRUQjCi0vXlNUQVRJQ0xJQiAqPS9zIz0uKiM9JFNUQVRJQ0xJQiMKLS9eU0hBUkVETElCICo9L3MjPS4qIz0kU0hBUkVETElCIwotL15TSEFSRURMSUJWICo9L3MjPS4qIz0kU0hBUkVETElCViMKLS9eU0hBUkVETElCTSAqPS9zIz0uKiM9JFNIQVJFRExJQk0jCi0vXkFSICo9L3MjPS4qIz0kQVIjCi0vXkFSRkxBR1MgKj0vcyM9LiojPSRBUkZMQUdTIwotL15SQU5MSUIgKj0vcyM9LiojPSRSQU5MSUIjCi0vXkVYRSAqPS9zIz0uKiM9JEVYRSMKLS9ecHJlZml4ICo9L3MjPS4qIz0kcHJlZml4IwotL15leGVjX3ByZWZpeCAqPS9zIz0uKiM9JGV4ZWNfcHJlZml4IwotL15saWJkaXIgKj0vcyM9LiojPSRsaWJkaXIjCi0vXnNoYXJlZGxpYmRpciAqPS9zIz0uKiM9JHNoYXJlZGxpYmRpciMKLS9eaW5jbHVkZWRpciAqPS9zIz0uKiM9JGluY2x1ZGVkaXIjCi0vXm1hbmRpciAqPS9zIz0uKiM9JG1hbmRpciMKLS9eTERGTEFHUyAqPS9zIz0uKiM9JExERkxBR1MjCi0iIHwgc2VkIC1lICIKLXMvXEBWRVJTSU9OXEAvJFZFUi9nOwotIiA+IHpsaWIucGMKZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvUkVBRE1FLmNvbnRyaWIgYi9zcmMvemxpYi9jb250cmliL1JFQURNRS5jb250cmliCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDIyODVkLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvUkVBRE1FLmNvbnRyaWIKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi1BbGwgZmlsZXMgdW5kZXIgdGhpcyBjb250cmliIGRpcmVjdG9yeSBhcmUgVU5TVVBQT1JURUQuIFRoZXJlIHdlcmUKLXByb3ZpZGVkIGJ5IHVzZXJzIG9mIHpsaWIgYW5kIHdlcmUgbm90IHRlc3RlZCBieSB0aGUgYXV0aG9ycyBvZiB6bGliLgotVXNlIGF0IHlvdXIgb3duIHJpc2suIFBsZWFzZSBjb250YWN0IHRoZSBhdXRob3JzIG9mIHRoZSBjb250cmlidXRpb25zCi1mb3IgaGVscCBhYm91dCB0aGVzZSwgbm90IHRoZSB6bGliIGF1dGhvcnMuIFRoYW5rcy4KLQotCi1hZGEvICAgICAgICBieSBEbWl0cml5IEFuaXNpbWtvdiA8YW5pc2lta292QHlhaG9vLmNvbT4KLSAgICAgICAgU3VwcG9ydCBmb3IgQWRhCi0gICAgICAgIFNlZSBodHRwOi8vemxpYi1hZGEuc291cmNlZm9yZ2UubmV0LwotCi1hbWQ2NC8gICAgICBieSBNaWtoYWlsIFRldGVyaW4gPG1pQEFMREFOLmFsZ2VicmEuY29tPgotICAgICAgICBhc20gY29kZSBmb3IgQU1ENjQKLSAgICAgICAgU2VlIHBhdGNoIGF0IGh0dHA6Ly93d3cuZnJlZWJzZC5vcmcvY2dpL3F1ZXJ5LXByLmNnaT9wcj1iaW4vOTYzOTMKLQotYXNtNjg2LyAgICAgYnkgQnJpYW4gUmFpdGVyIDxicmVhZGJveEBtdXBwZXRsYWJzLmNvbT4KLSAgICAgICAgYXNtIGNvZGUgZm9yIFBlbnRpdW0gYW5kIFBQcm8vUElJLCB1c2luZyB0aGUgQVQmVCAoR05VIGFzKSBzeW50YXgKLSAgICAgICAgU2VlIGh0dHA6Ly93d3cubXVwcGV0bGFicy5jb20vfmJyZWFkYm94L3NvZnR3YXJlL2Fzc2VtYmx5Lmh0bWwKLQotYmxhc3QvICAgICAgYnkgTWFyayBBZGxlciA8bWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdT4KLSAgICAgICAgRGVjb21wcmVzc29yIGZvciBvdXRwdXQgb2YgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeSAoRENMKQotCi1kZWxwaGkvICAgICBieSBDb3NtaW4gVHJ1dGEgPGNvc21pbnRAY3MudWJiY2x1ai5ybz4KLSAgICAgICAgU3VwcG9ydCBmb3IgRGVscGhpIGFuZCBDKysgQnVpbGRlcgotCi1kb3R6bGliLyAgICBieSBIZW5yaWsgUmF2biA8aGVucmlrQHJhdm4uY29tPgotICAgICAgICBTdXBwb3J0IGZvciBNaWNyb3NvZnQgLk5ldCBhbmQgVmlzdWFsIEMrKyAuTmV0Ci0KLWdjY19ndm1hdDY0L2J5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4KLSAgICAgICAgR0NDIFZlcnNpb24gb2YgeDg2IDY0LWJpdCAoQU1ENjQgYW5kIEludGVsIEVNNjR0KSBjb2RlIGZvciB4NjQKLSAgICAgICAgYXNzZW1ibGVyIHRvIHJlcGxhY2UgbG9uZ2VzdF9tYXRjaCgpIGFuZCBpbmZsYXRlX2Zhc3QoKQotCi1pbmZiYWNrOS8gICBieSBNYXJrIEFkbGVyIDxtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PgotICAgICAgICBVbnN1cHBvcnRlZCBkaWZmcyB0byBpbmZiYWNrIHRvIGRlY29kZSB0aGUgZGVmbGF0ZTY0IGZvcm1hdAotCi1pbmZsYXRlODYvICBieSBDaHJpcyBBbmRlcnNvbiA8Y2hyaXN0b3BAY2hhcm0ubmV0PgotICAgICAgICBUdW5lZCB4ODYgZ2NjIGFzbSBjb2RlIHRvIHJlcGxhY2UgaW5mbGF0ZV9mYXN0KCkKLQotaW9zdHJlYW0vICAgYnkgS2V2aW4gUnVsYW5kIDxrZXZpbkByb2Rpbi53dXN0bC5lZHU+Ci0gICAgICAgIEEgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZSB0byB0aGUgemxpYiBneiogZnVuY3Rpb25zCi0KLWlvc3RyZWFtMi8gIGJ5IFR5Z2UgTPh2c2V0IDxUeWdlLkxvdnNldEBjbXIubm8+Ci0gICAgICAgIEFub3RoZXIgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZQotCi1pb3N0cmVhbTMvICBieSBMdWR3aWcgU2Nod2FyZHQgPHNjaHdhcmR0QHN1bi5hYy56YT4KLSAgICAgICAgICAgIGFuZCBLZXZpbiBSdWxhbmQgPGtldmluQHJvZGluLnd1c3RsLmVkdT4KLSAgICAgICAgWWV0IGFub3RoZXIgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZQotCi1tYXNteDY0LyAgICBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+Ci0gICAgICAgIHg4NiA2NC1iaXQgKEFNRDY0IGFuZCBJbnRlbCBFTTY0dCkgY29kZSBmb3IgeDY0IGFzc2VtYmxlciB0bwotICAgICAgICByZXBsYWNlIGxvbmdlc3RfbWF0Y2goKSBhbmQgaW5mbGF0ZV9mYXN0KCksICBhbHNvIG1hc20geDg2Ci0gICAgICAgIDY0LWJpdHMgdHJhbnNsYXRpb24gb2YgQ2hyaXMgQW5kZXJzb24gaW5mbGF0ZV9mYXN0KCkKLQotbWFzbXg4Ni8gICAgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgotICAgICAgICB4ODYgYXNtIGNvZGUgdG8gcmVwbGFjZSBsb25nZXN0X21hdGNoKCkgYW5kIGluZmxhdGVfZmFzdCgpLAotICAgICAgICBmb3IgVmlzdWFsIEMrKyBhbmQgTUFTTSAoMzIgYml0cykuCi0gICAgICAgIEJhc2VkIG9uIEJyaWFuIFJhaXRlciAoYXNtNjg2KSBhbmQgQ2hyaXMgQW5kZXJzb24gKGluZmxhdGU4NikKLQotbWluaXppcC8gICAgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgotICAgICAgICBNaW5pIHppcCBhbmQgdW56aXAgYmFzZWQgb24gemxpYgotICAgICAgICBJbmNsdWRlcyBaaXA2NCBzdXBwb3J0IGJ5IE1hdGhpYXMgU3ZlbnNzb24gPG1hdGhpYXNAcmVzdWx0NDIuY29tPgotICAgICAgICBTZWUgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC91bnppcC5odG1sCi0KLXBhc2NhbC8gICAgIGJ5IEJvYiBEZWxsYWNhIDxib2JkbEB4dHJhLmNvLm56PiBldCBhbC4KLSAgICAgICAgU3VwcG9ydCBmb3IgUGFzY2FsCi0KLXB1ZmYvICAgICAgIGJ5IE1hcmsgQWRsZXIgPG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHU+Ci0gICAgICAgIFNtYWxsLCBsb3cgbWVtb3J5IHVzYWdlIGluZmxhdGUuICBBbHNvIHNlcnZlcyB0byBwcm92aWRlIGFuCi0gICAgICAgIHVuYW1iaWd1b3VzIGRlc2NyaXB0aW9uIG9mIHRoZSBkZWZsYXRlIGZvcm1hdC4KLQotdGVzdHpsaWIvICAgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgotICAgICAgICBFeGFtcGxlIG9mIHRoZSB1c2Ugb2YgemxpYgotCi11bnRnei8gICAgICBieSBQZWRybyBBLiBBcmFuZGEgR3V0aWVycmV6IDxwYWFnQHRpZC5lcz4KLSAgICAgICAgQSB2ZXJ5IHNpbXBsZSB0YXIuZ3ogZmlsZSBleHRyYWN0b3IgdXNpbmcgemxpYgotCi12c3R1ZGlvLyAgICBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+Ci0gICAgICAgIEJ1aWxkaW5nIGEgbWluaXppcC1lbmhhbmNlZCB6bGliIHdpdGggTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8KZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvYWRhL2J1ZmZlcl9kZW1vLmFkYiBiL3NyYy96bGliL2NvbnRyaWIvYWRhL2J1ZmZlcl9kZW1vLmFkYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZiODYzOC4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL2FkYS9idWZmZXJfZGVtby5hZGIKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLS0gIFpMaWIgZm9yIEFkYSB0aGljayBiaW5kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IERtaXRyaXkgQW5pc2lta292ICAgICAgICAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gIE9wZW4gc291cmNlIGxpY2Vuc2UgaW5mb3JtYXRpb24gaXMgaW4gdGhlIHpsaWIuYWRzIGZpbGUuICAtLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLS0KLS0tICAkSWQ6IGJ1ZmZlcl9kZW1vLmFkYix2IDEuMyAyMDA0LzA5LzA2IDA2OjU1OjM1IHZhZ3VsIEV4cCAkCi0KLS0tICBUaGlzIGRlbW8gcHJvZ3JhbSBwcm92aWRlZCBieSBEciBTdGV2ZSBTYW5nd2luZSA8c2pzQGVzc2V4LmFjLnVrPgotLS0KLS0tICBEZW1vbnN0cmF0aW9uIG9mIGEgcHJvYmxlbSB3aXRoIFpsaWItQWRhIChhbHJlYWR5IGZpeGVkKSB3aGVuIGEgYnVmZmVyCi0tLSAgb2YgZXhhY3RseSB0aGUgY29ycmVjdCBzaXplIGlzIHVzZWQgZm9yIGRlY29tcHJlc3NlZCBkYXRhLCBhbmQgdGhlIGxhc3QKLS0tICBmZXcgYnl0ZXMgcGFzc2VkIGluIHRvIFpsaWIgYXJlIGNoZWNrc3VtIGJ5dGVzLgotCi0tLSAgVGhpcyBwcm9ncmFtIGNvbXByZXNzZXMgYSBzdHJpbmcgb2YgdGV4dCwgYW5kIHRoZW4gZGVjb21wcmVzc2VzIHRoZQotLS0gIGNvbXByZXNzZWQgdGV4dCBpbnRvIGEgYnVmZmVyIG9mIHRoZSBzYW1lIHNpemUgYXMgdGhlIG9yaWdpbmFsIHRleHQuCi0KLXdpdGggQWRhLlN0cmVhbXM7IHVzZSBBZGEuU3RyZWFtczsKLXdpdGggQWRhLlRleHRfSU87Ci0KLXdpdGggWkxpYjsgdXNlIFpMaWI7Ci0KLXByb2NlZHVyZSBCdWZmZXJfRGVtbyBpcwotICAgRU9MICA6IENoYXJhY3RlciByZW5hbWVzIEFTQ0lJLkxGOwotICAgVGV4dCA6IGNvbnN0YW50IFN0cmluZwotICAgICA6PSAiRm91ciBzY29yZSBhbmQgc2V2ZW4geWVhcnMgYWdvIG91ciBmYXRoZXJzIGJyb3VnaHQgZm9ydGgsIiAmIEVPTCAmCi0gICAgICAgICJ1cG9uIHRoaXMgY29udGluZW50LCBhIG5ldyBuYXRpb24sIGNvbmNlaXZlZCBpbiBsaWJlcnR5LCIgJiBFT0wgJgotICAgICAgICAiYW5kIGRlZGljYXRlZCB0byB0aGUgcHJvcG9zaXRpb24gdGhhdCBgYWxsIG1lbiBhcmUgY3JlYXRlZCBlcXVhbCcuIjsKLQotICAgU291cmNlIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gVGV4dCdMZW5ndGgpOwotICAgZm9yIFNvdXJjZSdBZGRyZXNzIHVzZSBUZXh0J0FkZHJlc3M7Ci0KLWJlZ2luCi0gICBBZGEuVGV4dF9JTy5QdXQgKFRleHQpOwotICAgQWRhLlRleHRfSU8uTmV3X0xpbmU7Ci0gICBBZGEuVGV4dF9JTy5QdXRfTGluZQotICAgICAoIlVuY29tcHJlc3NlZCBzaXplIDogIiAmIFBvc2l0aXZlJ0ltYWdlIChUZXh0J0xlbmd0aCkgJiAiIGJ5dGVzIik7Ci0KLSAgIGRlY2xhcmUKLSAgICAgIENvbXByZXNzZWRfRGF0YSA6IFN0cmVhbV9FbGVtZW50X0FycmF5ICgxIC4uIFRleHQnTGVuZ3RoKTsKLSAgICAgIEwgICAgICAgICAgICAgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgIGJlZ2luCi0gICAgICBDb21wcmVzcyA6IGRlY2xhcmUKLSAgICAgICAgIENvbXByZXNzb3IgOiBGaWx0ZXJfVHlwZTsKLSAgICAgICAgIEkgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBiZWdpbgotICAgICAgICAgRGVmbGF0ZV9Jbml0IChDb21wcmVzc29yKTsKLQotICAgICAgICAgLS0gIENvbXByZXNzIHRoZSB3aG9sZSBvZiBUIGF0IG9uY2UuCi0KLSAgICAgICAgIFRyYW5zbGF0ZSAoQ29tcHJlc3NvciwgU291cmNlLCBJLCBDb21wcmVzc2VkX0RhdGEsIEwsIEZpbmlzaCk7Ci0gICAgICAgICBwcmFnbWEgQXNzZXJ0IChJID0gU291cmNlJ0xhc3QpOwotCi0gICAgICAgICBDbG9zZSAoQ29tcHJlc3Nvcik7Ci0KLSAgICAgICAgIEFkYS5UZXh0X0lPLlB1dF9MaW5lCi0gICAgICAgICAgICgiQ29tcHJlc3NlZCBzaXplIDogICAiCi0gICAgICAgICAgICAmIFN0cmVhbV9FbGVtZW50X09mZnNldCdJbWFnZSAoTCkgJiAiIGJ5dGVzIik7Ci0gICAgICBlbmQgQ29tcHJlc3M7Ci0KLSAgICAgIC0tICBOb3cgd2UgZGVjb21wcmVzcyB0aGUgZGF0YSwgcGFzc2luZyBzaG9ydCBibG9ja3Mgb2YgZGF0YSB0byBabGliCi0gICAgICAtLSAgKGJlY2F1c2UgdGhpcyBkZW1vbnN0cmF0ZXMgdGhlIHByb2JsZW0gLSB0aGUgbGFzdCBibG9jayBwYXNzZWQgd2lsbAotICAgICAgLS0gIGNvbnRhaW4gY2hlY2tzdW0gaW5mb3JtYXRpb24gYW5kIHRoZXJlIHdpbGwgYmUgbm8gb3V0cHV0LCBvbmx5IGEKLSAgICAgIC0tICBjaGVjayBpbnNpZGUgWmxpYiB0aGF0IHRoZSBjaGVja3N1bSBpcyBjb3JyZWN0KS4KLQotICAgICAgRGVjb21wcmVzcyA6IGRlY2xhcmUKLSAgICAgICAgIERlY29tcHJlc3NvciA6IEZpbHRlcl9UeXBlOwotCi0gICAgICAgICBVbmNvbXByZXNzZWRfRGF0YSA6IFN0cmVhbV9FbGVtZW50X0FycmF5ICgxIC4uIFRleHQnTGVuZ3RoKTsKLQotICAgICAgICAgQmxvY2tfU2l6ZSA6IGNvbnN0YW50IDo9IDQ7Ci0gICAgICAgICAtLSAgVGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIGxhc3QgYmxvY2sgY29udGFpbnMKLSAgICAgICAgIC0tICBvbmx5IEFkbGVyIGNoZWNrc3VtIGRhdGEuCi0KLSAgICAgICAgIFAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQgOj0gQ29tcHJlc3NlZF9EYXRhJ0ZpcnN0IC0gMTsKLSAgICAgICAgIE8gOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBiZWdpbgotICAgICAgICAgSW5mbGF0ZV9Jbml0IChEZWNvbXByZXNzb3IpOwotCi0gICAgICAgICBsb29wCi0gICAgICAgICAgICBUcmFuc2xhdGUKLSAgICAgICAgICAgICAgKERlY29tcHJlc3NvciwKLSAgICAgICAgICAgICAgIENvbXByZXNzZWRfRGF0YQotICAgICAgICAgICAgICAgICAoUCArIDEgLi4gU3RyZWFtX0VsZW1lbnRfT2Zmc2V0J01pbiAoUCArIEJsb2NrX1NpemUsIEwpKSwKLSAgICAgICAgICAgICAgIFAsCi0gICAgICAgICAgICAgICBVbmNvbXByZXNzZWRfRGF0YQotICAgICAgICAgICAgICAgICAoVG90YWxfT3V0IChEZWNvbXByZXNzb3IpICsgMSAuLiBVbmNvbXByZXNzZWRfRGF0YSdMYXN0KSwKLSAgICAgICAgICAgICAgIE8sCi0gICAgICAgICAgICAgICBOb19GbHVzaCk7Ci0KLSAgICAgICAgICAgICAgIEFkYS5UZXh0X0lPLlB1dF9MaW5lCi0gICAgICAgICAgICAgICAgICgiVG90YWwgaW4gOiAiICYgQ291bnQnSW1hZ2UgKFRvdGFsX0luIChEZWNvbXByZXNzb3IpKSAmCi0gICAgICAgICAgICAgICAgICAiLCBvdXQgOiAiICYgQ291bnQnSW1hZ2UgKFRvdGFsX091dCAoRGVjb21wcmVzc29yKSkpOwotCi0gICAgICAgICAgICAgICBleGl0IHdoZW4gUCA9IEw7Ci0gICAgICAgICBlbmQgbG9vcDsKLQotICAgICAgICAgQWRhLlRleHRfSU8uTmV3X0xpbmU7Ci0gICAgICAgICBBZGEuVGV4dF9JTy5QdXRfTGluZQotICAgICAgICAgICAoIkRlY29tcHJlc3NlZCB0ZXh0IG1hdGNoZXMgb3JpZ2luYWwgdGV4dCA6ICIKLSAgICAgICAgICAgICAmIEJvb2xlYW4nSW1hZ2UgKFVuY29tcHJlc3NlZF9EYXRhID0gU291cmNlKSk7Ci0gICAgICBlbmQgRGVjb21wcmVzczsKLSAgIGVuZDsKLWVuZCBCdWZmZXJfRGVtbzsKZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvYWRhL210ZXN0LmFkYiBiL3NyYy96bGliL2NvbnRyaWIvYWRhL210ZXN0LmFkYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkZmQwOC4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL2FkYS9tdGVzdC5hZGIKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLS0gIFpMaWIgZm9yIEFkYSB0aGljayBiaW5kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIERtaXRyaXkgQW5pc2lta292ICAgICAgICAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gIE9wZW4gc291cmNlIGxpY2Vuc2UgaW5mb3JtYXRpb24gaXMgaW4gdGhlIHpsaWIuYWRzIGZpbGUuICAtLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLS0gIENvbnRpbnVvdXMgdGVzdCBmb3IgWkxpYiBtdWx0aXRocmVhZGluZy4gSWYgdGhlIHRlc3Qgd291bGQgZmFpbAotLS0gIHdlIHNob3VsZCBwcm92aWRlIHRocmVhZCBzYWZlIGFsbG9jYXRpb24gcm91dGluZXMgZm9yIHRoZSBaX1N0cmVhbS4KLS0tCi0tLSAgJElkOiBtdGVzdC5hZGIsdiAxLjQgMjAwNC8wNy8yMyAwNzo0OTo1NCB2YWd1bCBFeHAgJAotCi13aXRoIFpMaWI7Ci13aXRoIEFkYS5TdHJlYW1zOwotd2l0aCBBZGEuTnVtZXJpY3MuRGlzY3JldGVfUmFuZG9tOwotd2l0aCBBZGEuVGV4dF9JTzsKLXdpdGggQWRhLkV4Y2VwdGlvbnM7Ci13aXRoIEFkYS5UYXNrX0lkZW50aWZpY2F0aW9uOwotCi1wcm9jZWR1cmUgTVRlc3QgaXMKLSAgIHVzZSBBZGEuU3RyZWFtczsKLSAgIHVzZSBaTGliOwotCi0gICBTdG9wIDogQm9vbGVhbiA6PSBGYWxzZTsKLQotICAgcHJhZ21hIEF0b21pYyAoU3RvcCk7Ci0KLSAgIHN1YnR5cGUgVmlzaWJsZV9TeW1ib2xzIGlzIFN0cmVhbV9FbGVtZW50IHJhbmdlIDE2IzIwIyAuLiAxNiM3RSM7Ci0KLSAgIHBhY2thZ2UgUmFuZG9tX0VsZW1lbnRzIGlzCi0gICAgICBuZXcgQWRhLk51bWVyaWNzLkRpc2NyZXRlX1JhbmRvbSAoVmlzaWJsZV9TeW1ib2xzKTsKLQotICAgdGFzayB0eXBlIFRlc3RfVGFzazsKLQotICAgdGFzayBib2R5IFRlc3RfVGFzayBpcwotICAgICAgQnVmZmVyIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gMTAwXzAwMCk7Ci0gICAgICBHZW4gOiBSYW5kb21fRWxlbWVudHMuR2VuZXJhdG9yOwotCi0gICAgICBCdWZmZXJfRmlyc3QgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgQ29tcGFyZV9GaXJzdCA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLQotICAgICAgRGVmbGF0ZSA6IEZpbHRlcl9UeXBlOwotICAgICAgSW5mbGF0ZSA6IEZpbHRlcl9UeXBlOwotCi0gICAgICBwcm9jZWR1cmUgRnVydGhlciAoSXRlbSA6IGluIFN0cmVhbV9FbGVtZW50X0FycmF5KTsKLQotICAgICAgcHJvY2VkdXJlIFJlYWRfQnVmZmVyCi0gICAgICAgIChJdGVtIDogb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgICAgTGFzdCA6IG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQpOwotCi0gICAgICAtLS0tLS0tLS0tLS0tCi0gICAgICAtLSBGdXJ0aGVyIC0tCi0gICAgICAtLS0tLS0tLS0tLS0tCi0KLSAgICAgIHByb2NlZHVyZSBGdXJ0aGVyIChJdGVtIDogaW4gU3RyZWFtX0VsZW1lbnRfQXJyYXkpIGlzCi0KLSAgICAgICAgIHByb2NlZHVyZSBDb21wYXJlIChJdGVtIDogaW4gU3RyZWFtX0VsZW1lbnRfQXJyYXkpOwotCi0gICAgICAgICAtLS0tLS0tLS0tLS0tCi0gICAgICAgICAtLSBDb21wYXJlIC0tCi0gICAgICAgICAtLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgIHByb2NlZHVyZSBDb21wYXJlIChJdGVtIDogaW4gU3RyZWFtX0VsZW1lbnRfQXJyYXkpIGlzCi0gICAgICAgICAgICBOZXh0X0ZpcnN0IDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IDo9IENvbXBhcmVfRmlyc3QgKyBJdGVtJ0xlbmd0aDsKLSAgICAgICAgIGJlZ2luCi0gICAgICAgICAgICBpZiBCdWZmZXIgKENvbXBhcmVfRmlyc3QgLi4gTmV4dF9GaXJzdCAtIDEpIC89IEl0ZW0gdGhlbgotICAgICAgICAgICAgICAgcmFpc2UgUHJvZ3JhbV9FcnJvcjsKLSAgICAgICAgICAgIGVuZCBpZjsKLQotICAgICAgICAgICAgQ29tcGFyZV9GaXJzdCA6PSBOZXh0X0ZpcnN0OwotICAgICAgICAgZW5kIENvbXBhcmU7Ci0KLSAgICAgICAgIHByb2NlZHVyZSBDb21wYXJlX1dyaXRlIGlzIG5ldyBaTGliLldyaXRlIChXcml0ZSA9PiBDb21wYXJlKTsKLSAgICAgIGJlZ2luCi0gICAgICAgICBDb21wYXJlX1dyaXRlIChJbmZsYXRlLCBJdGVtLCBOb19GbHVzaCk7Ci0gICAgICBlbmQgRnVydGhlcjsKLQotICAgICAgLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC0tIFJlYWRfQnVmZmVyIC0tCi0gICAgICAtLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBwcm9jZWR1cmUgUmVhZF9CdWZmZXIKLSAgICAgICAgKEl0ZW0gOiBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICAgICBMYXN0IDogb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldCkKLSAgICAgIGlzCi0gICAgICAgICBCdWZmX0RpZmYgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldCA6PSBCdWZmZXInTGFzdCAtIEJ1ZmZlcl9GaXJzdDsKLSAgICAgICAgIE5leHRfRmlyc3QgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBiZWdpbgotICAgICAgICAgaWYgSXRlbSdMZW5ndGggPD0gQnVmZl9EaWZmIHRoZW4KLSAgICAgICAgICAgIExhc3QgOj0gSXRlbSdMYXN0OwotCi0gICAgICAgICAgICBOZXh0X0ZpcnN0IDo9IEJ1ZmZlcl9GaXJzdCArIEl0ZW0nTGVuZ3RoOwotCi0gICAgICAgICAgICBJdGVtIDo9IEJ1ZmZlciAoQnVmZmVyX0ZpcnN0IC4uIE5leHRfRmlyc3QgLSAxKTsKLQotICAgICAgICAgICAgQnVmZmVyX0ZpcnN0IDo9IE5leHRfRmlyc3Q7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBMYXN0IDo9IEl0ZW0nRmlyc3QgKyBCdWZmX0RpZmY7Ci0gICAgICAgICAgICBJdGVtIChJdGVtJ0ZpcnN0IC4uIExhc3QpIDo9IEJ1ZmZlciAoQnVmZmVyX0ZpcnN0IC4uIEJ1ZmZlcidMYXN0KTsKLSAgICAgICAgICAgIEJ1ZmZlcl9GaXJzdCA6PSBCdWZmZXInTGFzdCArIDE7Ci0gICAgICAgICBlbmQgaWY7Ci0gICAgICBlbmQgUmVhZF9CdWZmZXI7Ci0KLSAgICAgIHByb2NlZHVyZSBUcmFuc2xhdGUgaXMgbmV3IEdlbmVyaWNfVHJhbnNsYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEYXRhX0luICA9PiBSZWFkX0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFfT3V0ID0+IEZ1cnRoZXIpOwotCi0gICBiZWdpbgotICAgICAgUmFuZG9tX0VsZW1lbnRzLlJlc2V0IChHZW4pOwotCi0gICAgICBCdWZmZXIgOj0gKG90aGVycyA9PiAyMCk7Ci0KLSAgICAgIE1haW4gOiBsb29wCi0gICAgICAgICBmb3IgSiBpbiBCdWZmZXInUmFuZ2UgbG9vcAotICAgICAgICAgICAgQnVmZmVyIChKKSA6PSBSYW5kb21fRWxlbWVudHMuUmFuZG9tIChHZW4pOwotCi0gICAgICAgICAgICBEZWZsYXRlX0luaXQgKERlZmxhdGUpOwotICAgICAgICAgICAgSW5mbGF0ZV9Jbml0IChJbmZsYXRlKTsKLQotICAgICAgICAgICAgQnVmZmVyX0ZpcnN0ICA6PSBCdWZmZXInRmlyc3Q7Ci0gICAgICAgICAgICBDb21wYXJlX0ZpcnN0IDo9IEJ1ZmZlcidGaXJzdDsKLQotICAgICAgICAgICAgVHJhbnNsYXRlIChEZWZsYXRlKTsKLQotICAgICAgICAgICAgaWYgQ29tcGFyZV9GaXJzdCAvPSBCdWZmZXInTGFzdCArIDEgdGhlbgotICAgICAgICAgICAgICAgcmFpc2UgUHJvZ3JhbV9FcnJvcjsKLSAgICAgICAgICAgIGVuZCBpZjsKLQotICAgICAgICAgICAgQWRhLlRleHRfSU8uUHV0X0xpbmUKLSAgICAgICAgICAgICAgKEFkYS5UYXNrX0lkZW50aWZpY2F0aW9uLkltYWdlCi0gICAgICAgICAgICAgICAgIChBZGEuVGFza19JZGVudGlmaWNhdGlvbi5DdXJyZW50X1Rhc2spCi0gICAgICAgICAgICAgICAmIFN0cmVhbV9FbGVtZW50X09mZnNldCdJbWFnZSAoSikKLSAgICAgICAgICAgICAgICYgWkxpYi5Db3VudCdJbWFnZSAoVG90YWxfT3V0IChEZWZsYXRlKSkpOwotCi0gICAgICAgICAgICBDbG9zZSAoRGVmbGF0ZSk7Ci0gICAgICAgICAgICBDbG9zZSAoSW5mbGF0ZSk7Ci0KLSAgICAgICAgICAgIGV4aXQgTWFpbiB3aGVuIFN0b3A7Ci0gICAgICAgICBlbmQgbG9vcDsKLSAgICAgIGVuZCBsb29wIE1haW47Ci0gICBleGNlcHRpb24KLSAgICAgIHdoZW4gRSA6IG90aGVycyA9PgotICAgICAgICAgQWRhLlRleHRfSU8uUHV0X0xpbmUgKEFkYS5FeGNlcHRpb25zLkV4Y2VwdGlvbl9JbmZvcm1hdGlvbiAoRSkpOwotICAgICAgICAgU3RvcCA6PSBUcnVlOwotICAgZW5kIFRlc3RfVGFzazsKLQotICAgVGVzdCA6IGFycmF5ICgxIC4uIDQpIG9mIFRlc3RfVGFzazsKLQotICAgcHJhZ21hIFVucmVmZXJlbmNlZCAoVGVzdCk7Ci0KLSAgIER1bW15IDogQ2hhcmFjdGVyOwotCi1iZWdpbgotICAgQWRhLlRleHRfSU8uR2V0X0ltbWVkaWF0ZSAoRHVtbXkpOwotICAgU3RvcCA6PSBUcnVlOwotZW5kIE1UZXN0OwpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9hZGEvcmVhZC5hZGIgYi9zcmMvemxpYi9jb250cmliL2FkYS9yZWFkLmFkYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyZWZiZi4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL2FkYS9yZWFkLmFkYgorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tLSAgWkxpYiBmb3IgQWRhIHRoaWNrIGJpbmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRG1pdHJpeSBBbmlzaW1rb3YgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgT3BlbiBzb3VyY2UgbGljZW5zZSBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgemxpYi5hZHMgZmlsZS4gIC0tCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tICAkSWQ6IHJlYWQuYWRiLHYgMS44IDIwMDQvMDUvMzEgMTA6NTM6NDAgdmFndWwgRXhwICQKLQotLS0gIFRlc3QvZGVtbyBwcm9ncmFtIGZvciB0aGUgZ2VuZXJpYyByZWFkIGludGVyZmFjZS4KLQotd2l0aCBBZGEuTnVtZXJpY3MuRGlzY3JldGVfUmFuZG9tOwotd2l0aCBBZGEuU3RyZWFtczsKLXdpdGggQWRhLlRleHRfSU87Ci0KLXdpdGggWkxpYjsKLQotcHJvY2VkdXJlIFJlYWQgaXMKLQotICAgdXNlIEFkYS5TdHJlYW1zOwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tICBUZXN0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIEZpbGVfU2l6ZSAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IDo9IDEwMF8wMDA7Ci0KLSAgIENvbnRpbnVvdXMgIDogY29uc3RhbnQgQm9vbGVhbiAgICAgICAgICA6PSBGYWxzZTsKLSAgIC0tICBJZiB0aGlzIGNvbnN0YW50IGlzIFRydWUsIHRoZSB0ZXN0IHdvdWxkIGJlIHJlcGVhdGVkIGFnYWluIGFuZCBhZ2FpbiwKLSAgIC0tICB3aXRoIGluY3JlbWVudCBGaWxlX1NpemUgZm9yIGV2ZXJ5IGl0ZXJhdGlvbi4KLQotICAgSGVhZGVyICAgICAgOiBjb25zdGFudCBaTGliLkhlYWRlcl9UeXBlIDo9IFpMaWIuRGVmYXVsdDsKLSAgIC0tICBEbyBub3QgdXNlIEhlYWRlciBvdGhlciB0aGFuIERlZmF1bHQgaW4gWkxpYiB2ZXJzaW9ucyAxLjEuNCBhbmQgb2xkZXIuCi0KLSAgIEluaXRfUmFuZG9tIDogY29uc3RhbnQgOj0gODsKLSAgIC0tICBXZSBhcmUgdXNpbmcgdGhlIHNhbWUgcmFuZG9tIHNlcXVlbmNlLCBpbiBjYXNlIG9mIHdlIGNhdGNoIGJ1ZywKLSAgIC0tICBzbyB3ZSB3b3VsZCBiZSBhYmxlIHRvIHJlcHJvZHVjZSBpdC4KLQotICAgLS0gRW5kIC0tCi0KLSAgIFBhY2tfU2l6ZSA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgIE9mZnNldCAgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLQotICAgRmlsdGVyICAgICA6IFpMaWIuRmlsdGVyX1R5cGU7Ci0KLSAgIHN1YnR5cGUgVmlzaWJsZV9TeW1ib2xzCi0gICAgICBpcyBTdHJlYW1fRWxlbWVudCByYW5nZSAxNiMyMCMgLi4gMTYjN0UjOwotCi0gICBwYWNrYWdlIFJhbmRvbV9FbGVtZW50cyBpcyBuZXcKLSAgICAgIEFkYS5OdW1lcmljcy5EaXNjcmV0ZV9SYW5kb20gKFZpc2libGVfU3ltYm9scyk7Ci0KLSAgIEdlbiA6IFJhbmRvbV9FbGVtZW50cy5HZW5lcmF0b3I7Ci0gICBQZXJpb2QgIDogY29uc3RhbnQgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IDo9IDIwMDsKLSAgIC0tICBQZXJpb2QgY29uc3RhbnQgdmFyaWFibGUgZm9yIHJhbmRvbSBnZW5lcmF0b3Igbm90IHRvIGJlIHZlcnkgcmFuZG9tLgotICAgLS0gIEJpZ2dlciBwZXJpb2QsIGhhcmRlciByYW5kb20uCi0KLSAgIFJlYWRfQnVmZmVyIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gMjA0OCk7Ci0gICBSZWFkX0ZpcnN0ICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgIFJlYWRfTGFzdCAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotCi0gICBwcm9jZWR1cmUgUmVzZXQ7Ci0KLSAgIHByb2NlZHVyZSBSZWFkCi0gICAgIChJdGVtIDogb3V0IFN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgTGFzdCA6IG91dCBTdHJlYW1fRWxlbWVudF9PZmZzZXQpOwotICAgLS0gIHRoaXMgcHJvY2VkdXJlIGlzIGZvciBnZW5lcmljIGluc3RhbnRpYXRpb24gb2YKLSAgIC0tICBaTGliLlJlYWQKLSAgIC0tICByZWFkaW5nIGRhdGEgZnJvbSB0aGUgRmlsZV9Jbi4KLQotICAgcHJvY2VkdXJlIFJlYWQgaXMgbmV3IFpMaWIuUmVhZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZF9CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdF9GaXJzdCA9PiBSZWFkX0ZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3RfTGFzdCAgPT4gUmVhZF9MYXN0KTsKLQotICAgLS0tLS0tLS0tLQotICAgLS0gUmVhZCAtLQotICAgLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgUmVhZAotICAgICAoSXRlbSA6IG91dCBTdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIExhc3QgOiBvdXQgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0KSBpcwotICAgYmVnaW4KLSAgICAgIExhc3QgOj0gU3RyZWFtX0VsZW1lbnRfT2Zmc2V0J01pbgotICAgICAgICAgICAgICAgKEl0ZW0nTGFzdCwKLSAgICAgICAgICAgICAgICBJdGVtJ0ZpcnN0ICsgRmlsZV9TaXplIC0gT2Zmc2V0KTsKLQotICAgICAgZm9yIEogaW4gSXRlbSdGaXJzdCAuLiBMYXN0IGxvb3AKLSAgICAgICAgIGlmIEogPCBJdGVtJ0ZpcnN0ICsgUGVyaW9kIHRoZW4KLSAgICAgICAgICAgIEl0ZW0gKEopIDo9IFJhbmRvbV9FbGVtZW50cy5SYW5kb20gKEdlbik7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBJdGVtIChKKSA6PSBJdGVtIChKIC0gUGVyaW9kKTsKLSAgICAgICAgIGVuZCBpZjsKLQotICAgICAgICAgT2Zmc2V0ICAgOj0gT2Zmc2V0ICsgMTsKLSAgICAgIGVuZCBsb29wOwotICAgZW5kIFJlYWQ7Ci0KLSAgIC0tLS0tLS0tLS0tCi0gICAtLSBSZXNldCAtLQotICAgLS0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIFJlc2V0IGlzCi0gICBiZWdpbgotICAgICAgUmFuZG9tX0VsZW1lbnRzLlJlc2V0IChHZW4sIEluaXRfUmFuZG9tKTsKLSAgICAgIFBhY2tfU2l6ZSA6PSAwOwotICAgICAgT2Zmc2V0IDo9IDE7Ci0gICAgICBSZWFkX0ZpcnN0IDo9IFJlYWRfQnVmZmVyJ0xhc3QgKyAxOwotICAgICAgUmVhZF9MYXN0ICA6PSBSZWFkX0J1ZmZlcidMYXN0OwotICAgZW5kIFJlc2V0OwotCi1iZWdpbgotICAgQWRhLlRleHRfSU8uUHV0X0xpbmUgKCJaTGliICIgJiBaTGliLlZlcnNpb24pOwotCi0gICBsb29wCi0gICAgICBmb3IgTGV2ZWwgaW4gWkxpYi5Db21wcmVzc2lvbl9MZXZlbCdSYW5nZSBsb29wCi0KLSAgICAgICAgIEFkYS5UZXh0X0lPLlB1dCAoIkxldmVsID0iCi0gICAgICAgICAgICAmIFpMaWIuQ29tcHJlc3Npb25fTGV2ZWwnSW1hZ2UgKExldmVsKSk7Ci0KLSAgICAgICAgIC0tICBEZWZsYXRlIHVzaW5nIGdlbmVyaWMgaW5zdGFudGlhdGlvbi4KLQotICAgICAgICAgWkxpYi5EZWZsYXRlX0luaXQKLSAgICAgICAgICAgICAgIChGaWx0ZXIsCi0gICAgICAgICAgICAgICAgTGV2ZWwsCi0gICAgICAgICAgICAgICAgSGVhZGVyID0+IEhlYWRlcik7Ci0KLSAgICAgICAgIFJlc2V0OwotCi0gICAgICAgICBBZGEuVGV4dF9JTy5QdXQKLSAgICAgICAgICAgKFN0cmVhbV9FbGVtZW50X09mZnNldCdJbWFnZSAoRmlsZV9TaXplKSAmICIgLT4iKTsKLQotICAgICAgICAgbG9vcAotICAgICAgICAgICAgZGVjbGFyZQotICAgICAgICAgICAgICAgQnVmZmVyIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gMTAyNCk7Ci0gICAgICAgICAgICAgICBMYXN0ICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICAgICAgICBiZWdpbgotICAgICAgICAgICAgICAgUmVhZCAoRmlsdGVyLCBCdWZmZXIsIExhc3QpOwotCi0gICAgICAgICAgICAgICBQYWNrX1NpemUgOj0gUGFja19TaXplICsgTGFzdCAtIEJ1ZmZlcidGaXJzdCArIDE7Ci0KLSAgICAgICAgICAgICAgIGV4aXQgd2hlbiBMYXN0IDwgQnVmZmVyJ0xhc3Q7Ci0gICAgICAgICAgICBlbmQ7Ci0gICAgICAgICBlbmQgbG9vcDsKLQotICAgICAgICAgQWRhLlRleHRfSU8uUHV0X0xpbmUgKFN0cmVhbV9FbGVtZW50X09mZnNldCdJbWFnZSAoUGFja19TaXplKSk7Ci0KLSAgICAgICAgIFpMaWIuQ2xvc2UgKEZpbHRlcik7Ci0gICAgICBlbmQgbG9vcDsKLQotICAgICAgZXhpdCB3aGVuIG5vdCBDb250aW51b3VzOwotCi0gICAgICBGaWxlX1NpemUgOj0gRmlsZV9TaXplICsgMTsKLSAgIGVuZCBsb29wOwotZW5kIFJlYWQ7CmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2FkYS9yZWFkbWUudHh0IGIvc3JjL3psaWIvY29udHJpYi9hZGEvcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U0ZDJjYS4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL2FkYS9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgWkxpYiBmb3IgQWRhIHRoaWNrIGJpbmRpbmcgKFpMaWIuQWRhKQotICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZSAxLjMKLQotWkxpYi5BZGEgaXMgYSB0aGljayBiaW5kaW5nIGludGVyZmFjZSB0byB0aGUgcG9wdWxhciBaTGliIGRhdGEKLWNvbXByZXNzaW9uIGxpYnJhcnksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvLgotSXQgcHJvdmlkZXMgQWRhLXN0eWxlIGFjY2VzcyB0byB0aGUgWkxpYiBDIGxpYnJhcnkuCi0KLQotICAgICAgICBIZXJlIGFyZSB0aGUgbWFpbiBjaGFuZ2VzIHNpbmNlIFpMaWIuQWRhIDEuMjoKLQotLSBBdHRlbnNpb246IFpMaWIuUmVhZCBnZW5lcmljIHJvdXRpbmUgaGF2ZSBhIGluaXRpYWxpemF0aW9uIHJlcXVpcmVtZW50Ci0gIGZvciBSZWFkX0xhc3QgcGFyYW1ldGVyIG5vdy4gSXQgaXMgYSBiaXQgaW5jb21wYXJ0aWJsZSB3aXRoIHByZXZpb3VzIHZlcnNpb24sCi0gIGJ1dCBleHRlbmRzIGZ1bmN0aW9uYWxpdHksIHdlIGNvdWxkIHVzZSBuZXcgcGFyYW1ldGVycyBBbGxvd19SZWFkX1NvbWUgYW5kCi0gIEZsdXNoIG5vdy4KLQotLSBBZGRlZCBJc19PcGVuIHJvdXRpbmVzIHRvIFpMaWIgYW5kIFpMaWIuU3RyZWFtcyBwYWNrYWdlcy4KLQotLSBBZGQgcHJhZ21hIEFzc2VydCB0byBjaGVjayBTdHJlYW1fRWxlbWVudCBpcyA4IGJpdC4KLQotLSBGaXggZXh0cmFjdGlvbiB0byBidWZmZXIgd2l0aCBleGFjdCBrbm93biBkZWNvbXByZXNzZWQgc2l6ZS4gRXJyb3IgcmVwb3J0ZWQgYnkKLSAgU3RldmUgU2FuZ3dpbmUuCi0KLS0gRml4IGRlZmluaXRpb24gb2YgVUxvbmcgKGNoYW5nZWQgdG8gdW5zaWduZWRfbG9uZyksIGZpeCByZWdyZXNzaW9uIG9uIDY0IGJpdHMKLSAgY29tcHV0ZXJzLiBQYXRjaCBwcm92aWRlZCBieSBQYXNjYWwgT2JyeS4KLQotLSBBZGQgU3RhdHVzX0Vycm9yIGV4Y2VwdGlvbiBkZWZpbml0aW9uLgotCi0tIEFkZCBwcmFnbWEgQXNzZXJ0aW9uIHRoYXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnQgc2l6ZSBpcyA4IGJpdC4KLQotCi0gICAgICAgIEhvdyB0byBidWlsZCBaTGliLkFkYSB1bmRlciBHTkFUCi0KLVlvdSBzaG91bGQgaGF2ZSB0aGUgWkxpYiBsaWJyYXJ5IGFscmVhZHkgYnVpbGQgb24geW91ciBjb21wdXRlciwgYmVmb3JlCi1idWlsZGluZyBaTGliLkFkYS4gTWFrZSB0aGUgZGlyZWN0b3J5IG9mIFpMaWIuQWRhIHNvdXJjZXMgY3VycmVudCBhbmQKLWlzc3VlIHRoZSBjb21tYW5kOgotCi0gIGduYXRtYWtlIHRlc3QgLWxhcmdzIC1MPGRpcmVjdG9yeSB3aGVyZSBsaWJ6LmEgaXM+IC1segotCi1PciB1c2UgdGhlIEdOQVQgcHJvamVjdCBmaWxlIGJ1aWxkIGZvciBHTkFUIDMuMTUgb3IgbGF0ZXI6Ci0KLSAgZ25hdG1ha2UgLVB6bGliLmdwciAtTDxkaXJlY3Rvcnkgd2hlcmUgbGliei5hIGlzPgotCi0KLSAgICAgICAgSG93IHRvIGJ1aWxkIFpMaWIuQWRhIHVuZGVyIEFvbml4IE9iamVjdEFkYSBmb3IgV2luMzIgNy4yLjIKLQotMS4gTWFrZSBhIHByb2plY3Qgd2l0aCBhbGwgKi5hZHMgYW5kICouYWRiIGZpbGVzIGZyb20gdGhlIGRpc3RyaWJ1dGlvbi4KLTIuIEJ1aWxkIHRoZSBsaWJ6LmEgbGlicmFyeSBmcm9tIHRoZSBaTGliIEMgc291cmNlcy4KLTMuIFJlbmFtZSBsaWJ6LmEgdG8gei5saWIuCi00LiBBZGQgdGhlIGxpYnJhcnkgei5saWIgdG8gdGhlIHByb2plY3QuCi01LiBBZGQgdGhlIGxpYmMubGliIGxpYnJhcnkgZnJvbSB0aGUgT2JqZWN0QWRhIGRpc3RyaWJ1dGlvbiB0byB0aGUgcHJvamVjdC4KLTYuIEJ1aWxkIHRoZSBleGVjdXRhYmxlIHVzaW5nIHRlc3QuYWRiIGFzIGEgbWFpbiBwcm9jZWR1cmUuCi0KLQotICAgICAgICBIb3cgdG8gdXNlIFpMaWIuQWRhCi0KLVRoZSBzb3VyY2UgZmlsZXMgdGVzdC5hZGIgYW5kIHJlYWQuYWRiIGFyZSBzbWFsbCBkZW1vIHByb2dyYW1zIHRoYXQgc2hvdwotdGhlIG1haW4gZnVuY3Rpb25hbGl0eSBvZiBaTGliLkFkYS4KLQotVGhlIHJvdXRpbmVzIGZyb20gdGhlIHBhY2thZ2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGNvbW1lbnRlZC4KLQotCi1Ib21lcGFnZTogaHR0cDovL3psaWItYWRhLnNvdXJjZWZvcmdlLm5ldC8KLUF1dGhvcjogRG1pdHJpeSBBbmlzaW1rb3YgPGFuaXNpbWtvdkB5YWhvby5jb20+Ci0KLUNvbnRyaWJ1dG9yczogUGFzY2FsIE9icnkgPHBhc2NhbEBvYnJ5Lm9yZz4sIFN0ZXZlIFNhbmd3aW5lIDxzanNAZXNzZXguYWMudWs+CmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2FkYS90ZXN0LmFkYiBiL3NyYy96bGliL2NvbnRyaWIvYWRhL3Rlc3QuYWRiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDc3M2FjLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvYWRhL3Rlc3QuYWRiCisrKyAvZGV2L251bGwKQEAgLTEsNDYzICswLDAgQEAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0tICBaTGliIGZvciBBZGEgdGhpY2sgYmluZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBEbWl0cml5IEFuaXNpbWtvdiAgICAgICAgICAgICAgICAgLS0KLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICBPcGVuIHNvdXJjZSBsaWNlbnNlIGluZm9ybWF0aW9uIGlzIGluIHRoZSB6bGliLmFkcyBmaWxlLiAgLS0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0gICRJZDogdGVzdC5hZGIsdiAxLjE3IDIwMDMvMDgvMTIgMTI6MTM6MzAgdmFndWwgRXhwICQKLQotLS0gIFRoZSBwcm9ncmFtIGhhcyBhIGZldyBhaW1zLgotLS0gIDEuIFRlc3QgWkxpYi5BZGE5NSB0aGljayBiaW5kaW5nIGZ1bmN0aW9uYWxpdHkuCi0tLSAgMi4gU2hvdyB0aGUgZXhhbXBsZSBvZiB1c2UgbWFpbiBmdW5jdGlvbmFsaXR5IG9mIHRoZSBaTGliLkFkYTk1IGJpbmRpbmcuCi0tLSAgMy4gQnVpbGQgdGhpcyBwcm9ncmFtIGF1dG9tYXRpY2FsbHkgY29tcGlsZSBhbGwgWkxpYi5BZGE5NSBwYWNrYWdlcyB1bmRlcgotLS0gICAgIEdOQVQgQWRhOTUgY29tcGlsZXIuCi0KLXdpdGggWkxpYi5TdHJlYW1zOwotd2l0aCBBZGEuU3RyZWFtcy5TdHJlYW1fSU87Ci13aXRoIEFkYS5OdW1lcmljcy5EaXNjcmV0ZV9SYW5kb207Ci0KLXdpdGggQWRhLlRleHRfSU87Ci0KLXdpdGggQWRhLkNhbGVuZGFyOwotCi1wcm9jZWR1cmUgVGVzdCBpcwotCi0gICB1c2UgQWRhLlN0cmVhbXM7Ci0gICB1c2UgU3RyZWFtX0lPOwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tICBUZXN0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIEZpbGVfU2l6ZSAgIDogQ291bnQgICA6PSAxMDBfMDAwOwotICAgQ29udGludW91cyAgOiBjb25zdGFudCBCb29sZWFuIDo9IEZhbHNlOwotCi0gICBIZWFkZXIgICAgICA6IGNvbnN0YW50IFpMaWIuSGVhZGVyX1R5cGUgOj0gWkxpYi5EZWZhdWx0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBaTGliLk5vbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIFpMaWIuQXV0bzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgWkxpYi5HWmlwOwotICAgLS0gIERvIG5vdCB1c2UgSGVhZGVyIG90aGVyIHRoZW4gRGVmYXVsdCBpbiBaTGliIHZlcnNpb25zIDEuMS40Ci0gICAtLSAgYW5kIG9sZGVyLgotCi0gICBTdHJhdGVneSAgICA6IGNvbnN0YW50IFpMaWIuU3RyYXRlZ3lfVHlwZSA6PSBaTGliLkRlZmF1bHRfU3RyYXRlZ3k7Ci0gICBJbml0X1JhbmRvbSA6IGNvbnN0YW50IDo9IDEwOwotCi0gICAtLSBFbmQgLS0KLQotICAgSW5fRmlsZV9OYW1lICA6IGNvbnN0YW50IFN0cmluZyA6PSAidGVzdHpsaWIuaW4iOwotICAgLS0gIE5hbWUgb2YgdGhlIGlucHV0IGZpbGUKLQotICAgWl9GaWxlX05hbWUgICA6IGNvbnN0YW50IFN0cmluZyA6PSAidGVzdHpsaWIuemxiIjsKLSAgIC0tICBOYW1lIG9mIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0KLSAgIE91dF9GaWxlX05hbWUgOiBjb25zdGFudCBTdHJpbmcgOj0gInRlc3R6bGliLm91dCI7Ci0gICAtLSAgTmFtZSBvZiB0aGUgZGVjb21wcmVzc2VkIGZpbGUuCi0KLSAgIEZpbGVfSW4gICA6IEZpbGVfVHlwZTsKLSAgIEZpbGVfT3V0ICA6IEZpbGVfVHlwZTsKLSAgIEZpbGVfQmFjayA6IEZpbGVfVHlwZTsKLSAgIEZpbGVfWiAgICA6IFpMaWIuU3RyZWFtcy5TdHJlYW1fVHlwZTsKLQotICAgRmlsdGVyIDogWkxpYi5GaWx0ZXJfVHlwZTsKLQotICAgVGltZV9TdGFtcCA6IEFkYS5DYWxlbmRhci5UaW1lOwotCi0gICBwcm9jZWR1cmUgR2VuZXJhdGVfRmlsZTsKLSAgIC0tICBHZW5lcmF0ZSBmaWxlIG9mIHNwZXRzaWZpZWQgc2l6ZSB3aXRoIHNvbWUgcmFuZG9tIGRhdGEuCi0gICAtLSAgVGhlIHJhbmRvbSBkYXRhIGlzIHJlcGVhdGFibGUsIGZvciB0aGUgZ29vZCBjb21wcmVzc2lvbi4KLQotICAgcHJvY2VkdXJlIENvbXBhcmVfU3RyZWFtcwotICAgICAoTGVmdCwgUmlnaHQgOiBpbiBvdXQgUm9vdF9TdHJlYW1fVHlwZSdDbGFzcyk7Ci0gICAtLSAgVGhlIHByb2NlZHVyZSBjb21wZWFyaW5nIGRhdGEgaW4gMiBzdHJlYW1zLgotICAgLS0gIEl0IGlzIGZvciBjb21wYXJlIGRhdGEgYmVmb3JlIGFuZCBhZnRlciBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLgotCi0gICBwcm9jZWR1cmUgQ29tcGFyZV9GaWxlcyAoTGVmdCwgUmlnaHQgOiBTdHJpbmcpOwotICAgLS0gIENvbXBhcmUgZmlsZXMuIEJhc2VkIG9uIHRoZSBDb21wYXJlX1N0cmVhbXMuCi0KLSAgIHByb2NlZHVyZSBDb3B5X1N0cmVhbXMKLSAgICAgKFNvdXJjZSwgVGFyZ2V0IDogaW4gb3V0IFJvb3RfU3RyZWFtX1R5cGUnQ2xhc3M7Ci0gICAgICBCdWZmZXJfU2l6ZSAgICA6IGluICAgICBTdHJlYW1fRWxlbWVudF9PZmZzZXQgOj0gMTAyNCk7Ci0gICAtLSAgQ29weWluZyBkYXRhIGZyb20gb25lIHN0cmVhbSB0byBhbm90aGVyLiBJdCBpcyBmb3IgdGVzdCBzdHJlYW0KLSAgIC0tICBpbnRlcmZhY2Ugb2YgdGhlIGxpYnJhcnkuCi0KLSAgIHByb2NlZHVyZSBEYXRhX0luCi0gICAgIChJdGVtIDogb3V0IFN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgTGFzdCA6IG91dCBTdHJlYW1fRWxlbWVudF9PZmZzZXQpOwotICAgLS0gIHRoaXMgcHJvY2VkdXJlIGlzIGZvciBnZW5lcmljIGluc3RhbnRpYXRpb24gb2YKLSAgIC0tICBaTGliLkdlbmVyaWNfVHJhbnNsYXRlLgotICAgLS0gIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBGaWxlX0luLgotCi0gICBwcm9jZWR1cmUgRGF0YV9PdXQgKEl0ZW0gOiBpbiBTdHJlYW1fRWxlbWVudF9BcnJheSk7Ci0gICAtLSAgdGhpcyBwcm9jZWR1cmUgaXMgZm9yIGdlbmVyaWMgaW5zdGFudGlhdGlvbiBvZgotICAgLS0gIFpMaWIuR2VuZXJpY19UcmFuc2xhdGUuCi0gICAtLSAgd3JpdGluZyBkYXRhIHRvIHRoZSBGaWxlX091dC4KLQotICAgcHJvY2VkdXJlIFN0YW1wOwotICAgLS0gIFN0b3JlIHRoZSB0aW1lc3RhbXAgdG8gdGhlIGxvY2FsIHZhcmlhYmxlLgotCi0gICBwcm9jZWR1cmUgUHJpbnRfU3RhdGlzdGljIChNc2cgOiBTdHJpbmc7IERhdGFfU2l6ZSA6IFpMaWIuQ291bnQpOwotICAgLS0gIFByaW50IHRoZSB0aW1lIHN0YXRpc3RpYyB3aXRoIHRoZSBtZXNzYWdlLgotCi0gICBwcm9jZWR1cmUgVHJhbnNsYXRlIGlzIG5ldyBaTGliLkdlbmVyaWNfVHJhbnNsYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEYXRhX0luICA9PiBEYXRhX0luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YV9PdXQgPT4gRGF0YV9PdXQpOwotICAgLS0gIFRoaXMgcHJvY2VkdXJlIGlzIG1vdmluZyBkYXRhIGZyb20gRmlsZV9JbiB0byBGaWxlX091dAotICAgLS0gIHdpdGggY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiwgZGVwZW5kIG9uIGluaXRpYWxpemF0aW9uIG9mCi0gICAtLSAgRmlsdGVyIHBhcmFtZXRlci4KLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLS0gQ29tcGFyZV9GaWxlcyAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgQ29tcGFyZV9GaWxlcyAoTGVmdCwgUmlnaHQgOiBTdHJpbmcpIGlzCi0gICAgICBMZWZ0X0ZpbGUsIFJpZ2h0X0ZpbGUgOiBGaWxlX1R5cGU7Ci0gICBiZWdpbgotICAgICAgT3BlbiAoTGVmdF9GaWxlLCBJbl9GaWxlLCBMZWZ0KTsKLSAgICAgIE9wZW4gKFJpZ2h0X0ZpbGUsIEluX0ZpbGUsIFJpZ2h0KTsKLSAgICAgIENvbXBhcmVfU3RyZWFtcyAoU3RyZWFtIChMZWZ0X0ZpbGUpLmFsbCwgU3RyZWFtIChSaWdodF9GaWxlKS5hbGwpOwotICAgICAgQ2xvc2UgKExlZnRfRmlsZSk7Ci0gICAgICBDbG9zZSAoUmlnaHRfRmlsZSk7Ci0gICBlbmQgQ29tcGFyZV9GaWxlczsKLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBDb21wYXJlX1N0cmVhbXMgLS0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgQ29tcGFyZV9TdHJlYW1zCi0gICAgIChMZWZ0LCBSaWdodCA6IGluIG91dCBBZGEuU3RyZWFtcy5Sb290X1N0cmVhbV9UeXBlJ0NsYXNzKQotICAgaXMKLSAgICAgIExlZnRfQnVmZmVyLCBSaWdodF9CdWZmZXIgOiBTdHJlYW1fRWxlbWVudF9BcnJheSAoMCAuLiAxNiNGRkYjKTsKLSAgICAgIExlZnRfTGFzdCwgUmlnaHRfTGFzdCA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgIGJlZ2luCi0gICAgICBsb29wCi0gICAgICAgICBSZWFkIChMZWZ0LCBMZWZ0X0J1ZmZlciwgTGVmdF9MYXN0KTsKLSAgICAgICAgIFJlYWQgKFJpZ2h0LCBSaWdodF9CdWZmZXIsIFJpZ2h0X0xhc3QpOwotCi0gICAgICAgICBpZiBMZWZ0X0xhc3QgLz0gUmlnaHRfTGFzdCB0aGVuCi0gICAgICAgICAgICBBZGEuVGV4dF9JTy5QdXRfTGluZSAoIkNvbXBhcmUgZXJyb3IgOiIKLSAgICAgICAgICAgICAgJiBTdHJlYW1fRWxlbWVudF9PZmZzZXQnSW1hZ2UgKExlZnRfTGFzdCkKLSAgICAgICAgICAgICAgJiAiIC89ICIKLSAgICAgICAgICAgICAgJiBTdHJlYW1fRWxlbWVudF9PZmZzZXQnSW1hZ2UgKFJpZ2h0X0xhc3QpKTsKLQotICAgICAgICAgICAgcmFpc2UgQ29uc3RyYWludF9FcnJvcjsKLQotICAgICAgICAgZWxzaWYgTGVmdF9CdWZmZXIgKDAgLi4gTGVmdF9MYXN0KQotICAgICAgICAgICAgICAgLz0gUmlnaHRfQnVmZmVyICgwIC4uIFJpZ2h0X0xhc3QpCi0gICAgICAgICB0aGVuCi0gICAgICAgICAgICBBZGEuVGV4dF9JTy5QdXRfTGluZSAoIkVSUk9SOiBJTiBhbmQgT1VUIGZpbGVzIGlzIG5vdCBlcXVhbC4iKTsKLSAgICAgICAgICAgIHJhaXNlIENvbnN0cmFpbnRfRXJyb3I7Ci0KLSAgICAgICAgIGVuZCBpZjsKLQotICAgICAgICAgZXhpdCB3aGVuIExlZnRfTGFzdCA8IExlZnRfQnVmZmVyJ0xhc3Q7Ci0gICAgICBlbmQgbG9vcDsKLSAgIGVuZCBDb21wYXJlX1N0cmVhbXM7Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICAgLS0gQ29weV9TdHJlYW1zIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIENvcHlfU3RyZWFtcwotICAgICAoU291cmNlLCBUYXJnZXQgOiBpbiBvdXQgQWRhLlN0cmVhbXMuUm9vdF9TdHJlYW1fVHlwZSdDbGFzczsKLSAgICAgIEJ1ZmZlcl9TaXplICAgIDogaW4gICAgIFN0cmVhbV9FbGVtZW50X09mZnNldCA6PSAxMDI0KQotICAgaXMKLSAgICAgIEJ1ZmZlciA6IFN0cmVhbV9FbGVtZW50X0FycmF5ICgxIC4uIEJ1ZmZlcl9TaXplKTsKLSAgICAgIExhc3QgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgIGJlZ2luCi0gICAgICBsb29wCi0gICAgICAgICBSZWFkICAoU291cmNlLCBCdWZmZXIsIExhc3QpOwotICAgICAgICAgV3JpdGUgKFRhcmdldCwgQnVmZmVyICgxIC4uIExhc3QpKTsKLQotICAgICAgICAgZXhpdCB3aGVuIExhc3QgPCBCdWZmZXInTGFzdDsKLSAgICAgIGVuZCBsb29wOwotICAgZW5kIENvcHlfU3RyZWFtczsKLQotICAgLS0tLS0tLS0tLS0tLQotICAgLS0gRGF0YV9JbiAtLQotICAgLS0tLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgRGF0YV9JbgotICAgICAoSXRlbSA6IG91dCBTdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIExhc3QgOiBvdXQgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0KSBpcwotICAgYmVnaW4KLSAgICAgIFJlYWQgKEZpbGVfSW4sIEl0ZW0sIExhc3QpOwotICAgZW5kIERhdGFfSW47Ci0KLSAgIC0tLS0tLS0tLS0tLS0tCi0gICAtLSBEYXRhX091dCAtLQotICAgLS0tLS0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIERhdGFfT3V0IChJdGVtIDogaW4gU3RyZWFtX0VsZW1lbnRfQXJyYXkpIGlzCi0gICBiZWdpbgotICAgICAgV3JpdGUgKEZpbGVfT3V0LCBJdGVtKTsKLSAgIGVuZCBEYXRhX091dDsKLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLS0gR2VuZXJhdGVfRmlsZSAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgR2VuZXJhdGVfRmlsZSBpcwotICAgICAgc3VidHlwZSBWaXNpYmxlX1N5bWJvbHMgaXMgU3RyZWFtX0VsZW1lbnQgcmFuZ2UgMTYjMjAjIC4uIDE2IzdFIzsKLQotICAgICAgcGFja2FnZSBSYW5kb21fRWxlbWVudHMgaXMKLSAgICAgICAgIG5ldyBBZGEuTnVtZXJpY3MuRGlzY3JldGVfUmFuZG9tIChWaXNpYmxlX1N5bWJvbHMpOwotCi0gICAgICBHZW4gICAgOiBSYW5kb21fRWxlbWVudHMuR2VuZXJhdG9yOwotICAgICAgQnVmZmVyIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgOj0gKDEgLi4gNzcgPT4gMTYjMjAjKSAmIDEwOwotCi0gICAgICBCdWZmZXJfQ291bnQgOiBjb25zdGFudCBDb3VudCA6PSBGaWxlX1NpemUgLyBCdWZmZXInTGVuZ3RoOwotICAgICAgLS0gIE51bWJlciBvZiBzYW1lIGJ1ZmZlcnMgaW4gdGhlIHBhY2tldC4KLQotICAgICAgRGVuc2l0eSA6IGNvbnN0YW50IENvdW50IDo9IDMwOyAtLSAgZnJvbSAwIHRvIEJ1ZmZlcidMZW5ndGggLSAyOwotCi0gICAgICBwcm9jZWR1cmUgRmlsbF9CdWZmZXIgKEosIEQgOiBpbiBDb3VudCk7Ci0gICAgICAtLSAgQ2hhbmdlIHRoZSBwYXJ0IG9mIHRoZSBidWZmZXIuCi0KLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAtLSBGaWxsX0J1ZmZlciAtLQotICAgICAgLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgcHJvY2VkdXJlIEZpbGxfQnVmZmVyIChKLCBEIDogaW4gQ291bnQpIGlzCi0gICAgICBiZWdpbgotICAgICAgICAgZm9yIEsgaW4gMCAuLiBEIGxvb3AKLSAgICAgICAgICAgIEJ1ZmZlcgotICAgICAgICAgICAgICAoU3RyZWFtX0VsZW1lbnRfT2Zmc2V0ICgoSiArIEspIG1vZCAoQnVmZmVyJ0xlbmd0aCAtIDEpICsgMSkpCi0gICAgICAgICAgICAgOj0gUmFuZG9tX0VsZW1lbnRzLlJhbmRvbSAoR2VuKTsKLQotICAgICAgICAgZW5kIGxvb3A7Ci0gICAgICBlbmQgRmlsbF9CdWZmZXI7Ci0KLSAgIGJlZ2luCi0gICAgICBSYW5kb21fRWxlbWVudHMuUmVzZXQgKEdlbiwgSW5pdF9SYW5kb20pOwotCi0gICAgICBDcmVhdGUgKEZpbGVfSW4sIE91dF9GaWxlLCBJbl9GaWxlX05hbWUpOwotCi0gICAgICBGaWxsX0J1ZmZlciAoMSwgQnVmZmVyJ0xlbmd0aCAtIDIpOwotCi0gICAgICBmb3IgSiBpbiAxIC4uIEJ1ZmZlcl9Db3VudCBsb29wCi0gICAgICAgICBXcml0ZSAoRmlsZV9JbiwgQnVmZmVyKTsKLQotICAgICAgICAgRmlsbF9CdWZmZXIgKEosIERlbnNpdHkpOwotICAgICAgZW5kIGxvb3A7Ci0KLSAgICAgIC0tICBmaWxsIHJlbWFpbiBzaXplLgotCi0gICAgICBXcml0ZQotICAgICAgICAoRmlsZV9JbiwKLSAgICAgICAgIEJ1ZmZlcgotICAgICAgICAgICAoMSAuLiBTdHJlYW1fRWxlbWVudF9PZmZzZXQKLSAgICAgICAgICAgICAgICAgICAoRmlsZV9TaXplIC0gQnVmZmVyJ0xlbmd0aCAqIEJ1ZmZlcl9Db3VudCkpKTsKLQotICAgICAgRmx1c2ggKEZpbGVfSW4pOwotICAgICAgQ2xvc2UgKEZpbGVfSW4pOwotICAgZW5kIEdlbmVyYXRlX0ZpbGU7Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLS0gUHJpbnRfU3RhdGlzdGljIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIFByaW50X1N0YXRpc3RpYyAoTXNnIDogU3RyaW5nOyBEYXRhX1NpemUgOiBaTGliLkNvdW50KSBpcwotICAgICAgdXNlIEFkYS5DYWxlbmRhcjsKLSAgICAgIHVzZSBBZGEuVGV4dF9JTzsKLQotICAgICAgcGFja2FnZSBDb3VudF9JTyBpcyBuZXcgSW50ZWdlcl9JTyAoWkxpYi5Db3VudCk7Ci0KLSAgICAgIEN1cnJfRHVyIDogRHVyYXRpb24gOj0gQ2xvY2sgLSBUaW1lX1N0YW1wOwotICAgYmVnaW4KLSAgICAgIFB1dCAoTXNnKTsKLQotICAgICAgU2V0X0NvbCAoMjApOwotICAgICAgQWRhLlRleHRfSU8uUHV0ICgic2l6ZSA9Iik7Ci0KLSAgICAgIENvdW50X0lPLlB1dAotICAgICAgICAoRGF0YV9TaXplLAotICAgICAgICAgV2lkdGggPT4gU3RyZWFtX0lPLkNvdW50J0ltYWdlIChGaWxlX1NpemUpJ0xlbmd0aCk7Ci0KLSAgICAgIFB1dF9MaW5lICgiIGR1cmF0aW9uID0iICYgRHVyYXRpb24nSW1hZ2UgKEN1cnJfRHVyKSk7Ci0gICBlbmQgUHJpbnRfU3RhdGlzdGljOwotCi0gICAtLS0tLS0tLS0tLQotICAgLS0gU3RhbXAgLS0KLSAgIC0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBTdGFtcCBpcwotICAgYmVnaW4KLSAgICAgIFRpbWVfU3RhbXAgOj0gQWRhLkNhbGVuZGFyLkNsb2NrOwotICAgZW5kIFN0YW1wOwotCi1iZWdpbgotICAgQWRhLlRleHRfSU8uUHV0X0xpbmUgKCJaTGliICIgJiBaTGliLlZlcnNpb24pOwotCi0gICBsb29wCi0gICAgICBHZW5lcmF0ZV9GaWxlOwotCi0gICAgICBmb3IgTGV2ZWwgaW4gWkxpYi5Db21wcmVzc2lvbl9MZXZlbCdSYW5nZSBsb29wCi0KLSAgICAgICAgIEFkYS5UZXh0X0lPLlB1dF9MaW5lICgiTGV2ZWwgPSIKLSAgICAgICAgICAgICYgWkxpYi5Db21wcmVzc2lvbl9MZXZlbCdJbWFnZSAoTGV2ZWwpKTsKLQotICAgICAgICAgLS0gIFRlc3QgZ2VuZXJpYyBpbnRlcmZhY2UuCi0gICAgICAgICBPcGVuICAgKEZpbGVfSW4sIEluX0ZpbGUsIEluX0ZpbGVfTmFtZSk7Ci0gICAgICAgICBDcmVhdGUgKEZpbGVfT3V0LCBPdXRfRmlsZSwgWl9GaWxlX05hbWUpOwotCi0gICAgICAgICBTdGFtcDsKLQotICAgICAgICAgLS0gIERlZmxhdGUgdXNpbmcgZ2VuZXJpYyBpbnN0YW50aWF0aW9uLgotCi0gICAgICAgICBaTGliLkRlZmxhdGVfSW5pdAotICAgICAgICAgICAgICAgKEZpbHRlciAgID0+IEZpbHRlciwKLSAgICAgICAgICAgICAgICBMZXZlbCAgICA9PiBMZXZlbCwKLSAgICAgICAgICAgICAgICBTdHJhdGVneSA9PiBTdHJhdGVneSwKLSAgICAgICAgICAgICAgICBIZWFkZXIgICA9PiBIZWFkZXIpOwotCi0gICAgICAgICBUcmFuc2xhdGUgKEZpbHRlcik7Ci0gICAgICAgICBQcmludF9TdGF0aXN0aWMgKCJHZW5lcmljIGNvbXByZXNzIiwgWkxpYi5Ub3RhbF9PdXQgKEZpbHRlcikpOwotICAgICAgICAgWkxpYi5DbG9zZSAoRmlsdGVyKTsKLQotICAgICAgICAgQ2xvc2UgKEZpbGVfSW4pOwotICAgICAgICAgQ2xvc2UgKEZpbGVfT3V0KTsKLQotICAgICAgICAgT3BlbiAgIChGaWxlX0luLCBJbl9GaWxlLCBaX0ZpbGVfTmFtZSk7Ci0gICAgICAgICBDcmVhdGUgKEZpbGVfT3V0LCBPdXRfRmlsZSwgT3V0X0ZpbGVfTmFtZSk7Ci0KLSAgICAgICAgIFN0YW1wOwotCi0gICAgICAgICAtLSAgSW5mbGF0ZSB1c2luZyBnZW5lcmljIGluc3RhbnRpYXRpb24uCi0KLSAgICAgICAgIFpMaWIuSW5mbGF0ZV9Jbml0IChGaWx0ZXIsIEhlYWRlciA9PiBIZWFkZXIpOwotCi0gICAgICAgICBUcmFuc2xhdGUgKEZpbHRlcik7Ci0gICAgICAgICBQcmludF9TdGF0aXN0aWMgKCJHZW5lcmljIGRlY29tcHJlc3MiLCBaTGliLlRvdGFsX091dCAoRmlsdGVyKSk7Ci0KLSAgICAgICAgIFpMaWIuQ2xvc2UgKEZpbHRlcik7Ci0KLSAgICAgICAgIENsb3NlIChGaWxlX0luKTsKLSAgICAgICAgIENsb3NlIChGaWxlX091dCk7Ci0KLSAgICAgICAgIENvbXBhcmVfRmlsZXMgKEluX0ZpbGVfTmFtZSwgT3V0X0ZpbGVfTmFtZSk7Ci0KLSAgICAgICAgIC0tICBUZXN0IHN0cmVhbSBpbnRlcmZhY2UuCi0KLSAgICAgICAgIC0tICBDb21wcmVzcyB0byB0aGUgYmFjayBzdHJlYW0uCi0KLSAgICAgICAgIE9wZW4gICAoRmlsZV9JbiwgSW5fRmlsZSwgSW5fRmlsZV9OYW1lKTsKLSAgICAgICAgIENyZWF0ZSAoRmlsZV9CYWNrLCBPdXRfRmlsZSwgWl9GaWxlX05hbWUpOwotCi0gICAgICAgICBTdGFtcDsKLQotICAgICAgICAgWkxpYi5TdHJlYW1zLkNyZWF0ZQotICAgICAgICAgICAoU3RyZWFtICAgICAgICAgID0+IEZpbGVfWiwKLSAgICAgICAgICAgIE1vZGUgICAgICAgICAgICA9PiBaTGliLlN0cmVhbXMuT3V0X1N0cmVhbSwKLSAgICAgICAgICAgIEJhY2sgICAgICAgICAgICA9PiBaTGliLlN0cmVhbXMuU3RyZWFtX0FjY2VzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmVhbSAoRmlsZV9CYWNrKSksCi0gICAgICAgICAgICBCYWNrX0NvbXByZXNzZWQgPT4gVHJ1ZSwKLSAgICAgICAgICAgIExldmVsICAgICAgICAgICA9PiBMZXZlbCwKLSAgICAgICAgICAgIFN0cmF0ZWd5ICAgICAgICA9PiBTdHJhdGVneSwKLSAgICAgICAgICAgIEhlYWRlciAgICAgICAgICA9PiBIZWFkZXIpOwotCi0gICAgICAgICBDb3B5X1N0cmVhbXMKLSAgICAgICAgICAgKFNvdXJjZSA9PiBTdHJlYW0gKEZpbGVfSW4pLmFsbCwKLSAgICAgICAgICAgIFRhcmdldCA9PiBGaWxlX1opOwotCi0gICAgICAgICAtLSAgRmx1c2hpbmcgaW50ZXJuYWwgYnVmZmVycyB0byB0aGUgYmFjayBzdHJlYW0uCi0KLSAgICAgICAgIFpMaWIuU3RyZWFtcy5GbHVzaCAoRmlsZV9aLCBaTGliLkZpbmlzaCk7Ci0KLSAgICAgICAgIFByaW50X1N0YXRpc3RpYyAoIldyaXRlIGNvbXByZXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWkxpYi5TdHJlYW1zLldyaXRlX1RvdGFsX091dCAoRmlsZV9aKSk7Ci0KLSAgICAgICAgIFpMaWIuU3RyZWFtcy5DbG9zZSAoRmlsZV9aKTsKLQotICAgICAgICAgQ2xvc2UgKEZpbGVfSW4pOwotICAgICAgICAgQ2xvc2UgKEZpbGVfQmFjayk7Ci0KLSAgICAgICAgIC0tICBDb21wYXJlIHJlYWRpbmcgZnJvbSBvcmlnaW5hbCBmaWxlIGFuZCBmcm9tCi0gICAgICAgICAtLSAgZGVjb21wcmVzc2lvbiBzdHJlYW0uCi0KLSAgICAgICAgIE9wZW4gKEZpbGVfSW4sICAgSW5fRmlsZSwgSW5fRmlsZV9OYW1lKTsKLSAgICAgICAgIE9wZW4gKEZpbGVfQmFjaywgSW5fRmlsZSwgWl9GaWxlX05hbWUpOwotCi0gICAgICAgICBaTGliLlN0cmVhbXMuQ3JlYXRlCi0gICAgICAgICAgIChTdHJlYW0gICAgICAgICAgPT4gRmlsZV9aLAotICAgICAgICAgICAgTW9kZSAgICAgICAgICAgID0+IFpMaWIuU3RyZWFtcy5Jbl9TdHJlYW0sCi0gICAgICAgICAgICBCYWNrICAgICAgICAgICAgPT4gWkxpYi5TdHJlYW1zLlN0cmVhbV9BY2Nlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJlYW0gKEZpbGVfQmFjaykpLAotICAgICAgICAgICAgQmFja19Db21wcmVzc2VkID0+IFRydWUsCi0gICAgICAgICAgICBIZWFkZXIgICAgICAgICAgPT4gSGVhZGVyKTsKLQotICAgICAgICAgU3RhbXA7Ci0gICAgICAgICBDb21wYXJlX1N0cmVhbXMgKFN0cmVhbSAoRmlsZV9JbikuYWxsLCBGaWxlX1opOwotCi0gICAgICAgICBQcmludF9TdGF0aXN0aWMgKCJSZWFkIGRlY29tcHJlc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBaTGliLlN0cmVhbXMuUmVhZF9Ub3RhbF9PdXQgKEZpbGVfWikpOwotCi0gICAgICAgICBaTGliLlN0cmVhbXMuQ2xvc2UgKEZpbGVfWik7Ci0gICAgICAgICBDbG9zZSAoRmlsZV9Jbik7Ci0gICAgICAgICBDbG9zZSAoRmlsZV9CYWNrKTsKLQotICAgICAgICAgLS0gIENvbXByZXNzIGJ5IHJlYWRpbmcgZnJvbSBjb21wcmVzc2lvbiBzdHJlYW0uCi0KLSAgICAgICAgIE9wZW4gKEZpbGVfQmFjaywgSW5fRmlsZSwgSW5fRmlsZV9OYW1lKTsKLSAgICAgICAgIENyZWF0ZSAoRmlsZV9PdXQsIE91dF9GaWxlLCBaX0ZpbGVfTmFtZSk7Ci0KLSAgICAgICAgIFpMaWIuU3RyZWFtcy5DcmVhdGUKLSAgICAgICAgICAgKFN0cmVhbSAgICAgICAgICA9PiBGaWxlX1osCi0gICAgICAgICAgICBNb2RlICAgICAgICAgICAgPT4gWkxpYi5TdHJlYW1zLkluX1N0cmVhbSwKLSAgICAgICAgICAgIEJhY2sgICAgICAgICAgICA9PiBaTGliLlN0cmVhbXMuU3RyZWFtX0FjY2VzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmVhbSAoRmlsZV9CYWNrKSksCi0gICAgICAgICAgICBCYWNrX0NvbXByZXNzZWQgPT4gRmFsc2UsCi0gICAgICAgICAgICBMZXZlbCAgICAgICAgICAgPT4gTGV2ZWwsCi0gICAgICAgICAgICBTdHJhdGVneSAgICAgICAgPT4gU3RyYXRlZ3ksCi0gICAgICAgICAgICBIZWFkZXIgICAgICAgICAgPT4gSGVhZGVyKTsKLQotICAgICAgICAgU3RhbXA7Ci0gICAgICAgICBDb3B5X1N0cmVhbXMKLSAgICAgICAgICAgKFNvdXJjZSA9PiBGaWxlX1osCi0gICAgICAgICAgICBUYXJnZXQgPT4gU3RyZWFtIChGaWxlX091dCkuYWxsKTsKLQotICAgICAgICAgUHJpbnRfU3RhdGlzdGljICgiUmVhZCBjb21wcmVzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFpMaWIuU3RyZWFtcy5SZWFkX1RvdGFsX091dCAoRmlsZV9aKSk7Ci0KLSAgICAgICAgIFpMaWIuU3RyZWFtcy5DbG9zZSAoRmlsZV9aKTsKLQotICAgICAgICAgQ2xvc2UgKEZpbGVfT3V0KTsKLSAgICAgICAgIENsb3NlIChGaWxlX0JhY2spOwotCi0gICAgICAgICAtLSAgRGVjb21wcmVzcyB0byBkZWNvbXByZXNzaW9uIHN0cmVhbS4KLQotICAgICAgICAgT3BlbiAgIChGaWxlX0luLCAgIEluX0ZpbGUsIFpfRmlsZV9OYW1lKTsKLSAgICAgICAgIENyZWF0ZSAoRmlsZV9CYWNrLCBPdXRfRmlsZSwgT3V0X0ZpbGVfTmFtZSk7Ci0KLSAgICAgICAgIFpMaWIuU3RyZWFtcy5DcmVhdGUKLSAgICAgICAgICAgKFN0cmVhbSAgICAgICAgICA9PiBGaWxlX1osCi0gICAgICAgICAgICBNb2RlICAgICAgICAgICAgPT4gWkxpYi5TdHJlYW1zLk91dF9TdHJlYW0sCi0gICAgICAgICAgICBCYWNrICAgICAgICAgICAgPT4gWkxpYi5TdHJlYW1zLlN0cmVhbV9BY2Nlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJlYW0gKEZpbGVfQmFjaykpLAotICAgICAgICAgICAgQmFja19Db21wcmVzc2VkID0+IEZhbHNlLAotICAgICAgICAgICAgSGVhZGVyICAgICAgICAgID0+IEhlYWRlcik7Ci0KLSAgICAgICAgIFN0YW1wOwotCi0gICAgICAgICBDb3B5X1N0cmVhbXMKLSAgICAgICAgICAgKFNvdXJjZSA9PiBTdHJlYW0gKEZpbGVfSW4pLmFsbCwKLSAgICAgICAgICAgIFRhcmdldCA9PiBGaWxlX1opOwotCi0gICAgICAgICBQcmludF9TdGF0aXN0aWMgKCJXcml0ZSBkZWNvbXByZXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWkxpYi5TdHJlYW1zLldyaXRlX1RvdGFsX091dCAoRmlsZV9aKSk7Ci0KLSAgICAgICAgIFpMaWIuU3RyZWFtcy5DbG9zZSAoRmlsZV9aKTsKLSAgICAgICAgIENsb3NlIChGaWxlX0luKTsKLSAgICAgICAgIENsb3NlIChGaWxlX0JhY2spOwotCi0gICAgICAgICBDb21wYXJlX0ZpbGVzIChJbl9GaWxlX05hbWUsIE91dF9GaWxlX05hbWUpOwotICAgICAgZW5kIGxvb3A7Ci0KLSAgICAgIEFkYS5UZXh0X0lPLlB1dF9MaW5lIChDb3VudCdJbWFnZSAoRmlsZV9TaXplKSAmICIgT2suIik7Ci0KLSAgICAgIGV4aXQgd2hlbiBub3QgQ29udGludW91czsKLQotICAgICAgRmlsZV9TaXplIDo9IEZpbGVfU2l6ZSArIDE7Ci0gICBlbmQgbG9vcDsKLWVuZCBUZXN0OwpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9hZGEvemxpYi1zdHJlYW1zLmFkYiBiL3NyYy96bGliL2NvbnRyaWIvYWRhL3psaWItc3RyZWFtcy5hZGIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NDk3YmEuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9hZGEvemxpYi1zdHJlYW1zLmFkYgorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tLSAgWkxpYiBmb3IgQWRhIHRoaWNrIGJpbmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRG1pdHJpeSBBbmlzaW1rb3YgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgT3BlbiBzb3VyY2UgbGljZW5zZSBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgemxpYi5hZHMgZmlsZS4gIC0tCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tICAkSWQ6IHpsaWItc3RyZWFtcy5hZGIsdiAxLjEwIDIwMDQvMDUvMzEgMTA6NTM6NDAgdmFndWwgRXhwICQKLQotd2l0aCBBZGEuVW5jaGVja2VkX0RlYWxsb2NhdGlvbjsKLQotcGFja2FnZSBib2R5IFpMaWIuU3RyZWFtcyBpcwotCi0gICAtLS0tLS0tLS0tLQotICAgLS0gQ2xvc2UgLS0KLSAgIC0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBDbG9zZSAoU3RyZWFtIDogaW4gb3V0IFN0cmVhbV9UeXBlKSBpcwotICAgICAgcHJvY2VkdXJlIEZyZWUgaXMgbmV3IEFkYS5VbmNoZWNrZWRfRGVhbGxvY2F0aW9uCi0gICAgICAgICAoU3RyZWFtX0VsZW1lbnRfQXJyYXksIEJ1ZmZlcl9BY2Nlc3MpOwotICAgYmVnaW4KLSAgICAgIGlmIFN0cmVhbS5Nb2RlID0gT3V0X1N0cmVhbSBvciBTdHJlYW0uTW9kZSA9IER1cGxleCB0aGVuCi0gICAgICAgICAtLSAgV2Ugc2hvdWxkIGZsdXNoIHRoZSBkYXRhIHdyaXR0ZW4gYnkgdGhlIHdyaXRlci4KLQotICAgICAgICAgRmx1c2ggKFN0cmVhbSwgRmluaXNoKTsKLQotICAgICAgICAgQ2xvc2UgKFN0cmVhbS5Xcml0ZXIpOwotICAgICAgZW5kIGlmOwotCi0gICAgICBpZiBTdHJlYW0uTW9kZSA9IEluX1N0cmVhbSBvciBTdHJlYW0uTW9kZSA9IER1cGxleCB0aGVuCi0gICAgICAgICBDbG9zZSAoU3RyZWFtLlJlYWRlcik7Ci0gICAgICAgICBGcmVlIChTdHJlYW0uQnVmZmVyKTsKLSAgICAgIGVuZCBpZjsKLSAgIGVuZCBDbG9zZTsKLQotICAgLS0tLS0tLS0tLS0tCi0gICAtLSBDcmVhdGUgLS0KLSAgIC0tLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgQ3JlYXRlCi0gICAgIChTdHJlYW0gICAgICAgICAgICA6ICAgIG91dCBTdHJlYW1fVHlwZTsKLSAgICAgIE1vZGUgICAgICAgICAgICAgIDogaW4gICAgIFN0cmVhbV9Nb2RlOwotICAgICAgQmFjayAgICAgICAgICAgICAgOiBpbiAgICAgU3RyZWFtX0FjY2VzczsKLSAgICAgIEJhY2tfQ29tcHJlc3NlZCAgIDogaW4gICAgIEJvb2xlYW47Ci0gICAgICBMZXZlbCAgICAgICAgICAgICA6IGluICAgICBDb21wcmVzc2lvbl9MZXZlbCA6PSBEZWZhdWx0X0NvbXByZXNzaW9uOwotICAgICAgU3RyYXRlZ3kgICAgICAgICAgOiBpbiAgICAgU3RyYXRlZ3lfVHlwZSAgICAgOj0gRGVmYXVsdF9TdHJhdGVneTsKLSAgICAgIEhlYWRlciAgICAgICAgICAgIDogaW4gICAgIEhlYWRlcl9UeXBlICAgICAgIDo9IERlZmF1bHQ7Ci0gICAgICBSZWFkX0J1ZmZlcl9TaXplICA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo9IERlZmF1bHRfQnVmZmVyX1NpemU7Ci0gICAgICBXcml0ZV9CdWZmZXJfU2l6ZSA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo9IERlZmF1bHRfQnVmZmVyX1NpemUpCi0gICBpcwotCi0gICAgICBzdWJ0eXBlIEJ1ZmZlcl9TdWJ0eXBlIGlzIFN0cmVhbV9FbGVtZW50X0FycmF5ICgxIC4uIFJlYWRfQnVmZmVyX1NpemUpOwotCi0gICAgICBwcm9jZWR1cmUgSW5pdF9GaWx0ZXIKLSAgICAgICAgIChGaWx0ZXIgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKLSAgICAgICAgICBDb21wcmVzcyA6IGluICAgICBCb29sZWFuKTsKLQotICAgICAgLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC0tIEluaXRfRmlsdGVyIC0tCi0gICAgICAtLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBwcm9jZWR1cmUgSW5pdF9GaWx0ZXIKLSAgICAgICAgIChGaWx0ZXIgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKLSAgICAgICAgICBDb21wcmVzcyA6IGluICAgICBCb29sZWFuKSBpcwotICAgICAgYmVnaW4KLSAgICAgICAgIGlmIENvbXByZXNzIHRoZW4KLSAgICAgICAgICAgIERlZmxhdGVfSW5pdAotICAgICAgICAgICAgICAoRmlsdGVyLCBMZXZlbCwgU3RyYXRlZ3ksIEhlYWRlciA9PiBIZWFkZXIpOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgSW5mbGF0ZV9Jbml0IChGaWx0ZXIsIEhlYWRlciA9PiBIZWFkZXIpOwotICAgICAgICAgZW5kIGlmOwotICAgICAgZW5kIEluaXRfRmlsdGVyOwotCi0gICBiZWdpbgotICAgICAgU3RyZWFtLkJhY2sgOj0gQmFjazsKLSAgICAgIFN0cmVhbS5Nb2RlIDo9IE1vZGU7Ci0KLSAgICAgIGlmIE1vZGUgPSBPdXRfU3RyZWFtIG9yIE1vZGUgPSBEdXBsZXggdGhlbgotICAgICAgICAgSW5pdF9GaWx0ZXIgKFN0cmVhbS5Xcml0ZXIsIEJhY2tfQ29tcHJlc3NlZCk7Ci0gICAgICAgICBTdHJlYW0uQnVmZmVyX1NpemUgOj0gV3JpdGVfQnVmZmVyX1NpemU7Ci0gICAgICBlbHNlCi0gICAgICAgICBTdHJlYW0uQnVmZmVyX1NpemUgOj0gMDsKLSAgICAgIGVuZCBpZjsKLQotICAgICAgaWYgTW9kZSA9IEluX1N0cmVhbSBvciBNb2RlID0gRHVwbGV4IHRoZW4KLSAgICAgICAgIEluaXRfRmlsdGVyIChTdHJlYW0uUmVhZGVyLCBub3QgQmFja19Db21wcmVzc2VkKTsKLQotICAgICAgICAgU3RyZWFtLkJ1ZmZlciAgICAgOj0gbmV3IEJ1ZmZlcl9TdWJ0eXBlOwotICAgICAgICAgU3RyZWFtLlJlc3RfRmlyc3QgOj0gU3RyZWFtLkJ1ZmZlcidMYXN0ICsgMTsKLSAgICAgICAgIFN0cmVhbS5SZXN0X0xhc3QgIDo9IFN0cmVhbS5CdWZmZXInTGFzdDsKLSAgICAgIGVuZCBpZjsKLSAgIGVuZCBDcmVhdGU7Ci0KLSAgIC0tLS0tLS0tLS0tCi0gICAtLSBGbHVzaCAtLQotICAgLS0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIEZsdXNoCi0gICAgIChTdHJlYW0gOiBpbiBvdXQgU3RyZWFtX1R5cGU7Ci0gICAgICBNb2RlICAgOiBpbiAgICAgRmx1c2hfTW9kZSA6PSBTeW5jX0ZsdXNoKQotICAgaXMKLSAgICAgIEJ1ZmZlciA6IFN0cmVhbV9FbGVtZW50X0FycmF5ICgxIC4uIFN0cmVhbS5CdWZmZXJfU2l6ZSk7Ci0gICAgICBMYXN0ICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICBiZWdpbgotICAgICAgbG9vcAotICAgICAgICAgRmx1c2ggKFN0cmVhbS5Xcml0ZXIsIEJ1ZmZlciwgTGFzdCwgTW9kZSk7Ci0KLSAgICAgICAgIEFkYS5TdHJlYW1zLldyaXRlIChTdHJlYW0uQmFjay5hbGwsIEJ1ZmZlciAoMSAuLiBMYXN0KSk7Ci0KLSAgICAgICAgIGV4aXQgd2hlbiBMYXN0IDwgQnVmZmVyJ0xhc3Q7Ci0gICAgICBlbmQgbG9vcDsKLSAgIGVuZCBGbHVzaDsKLQotICAgLS0tLS0tLS0tLS0tLQotICAgLS0gSXNfT3BlbiAtLQotICAgLS0tLS0tLS0tLS0tLQotCi0gICBmdW5jdGlvbiBJc19PcGVuIChTdHJlYW0gOiBTdHJlYW1fVHlwZSkgcmV0dXJuIEJvb2xlYW4gaXMKLSAgIGJlZ2luCi0gICAgICByZXR1cm4gSXNfT3BlbiAoU3RyZWFtLlJlYWRlcikgb3IgZWxzZSBJc19PcGVuIChTdHJlYW0uV3JpdGVyKTsKLSAgIGVuZCBJc19PcGVuOwotCi0gICAtLS0tLS0tLS0tCi0gICAtLSBSZWFkIC0tCi0gICAtLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBSZWFkCi0gICAgIChTdHJlYW0gOiBpbiBvdXQgU3RyZWFtX1R5cGU7Ci0gICAgICBJdGVtICAgOiAgICBvdXQgU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICBMYXN0ICAgOiAgICBvdXQgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0KQotICAgaXMKLQotICAgICAgcHJvY2VkdXJlIFJlYWQKLSAgICAgICAgKEl0ZW0gOiBvdXQgU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICAgICBMYXN0IDogb3V0IFN0cmVhbV9FbGVtZW50X09mZnNldCk7Ci0KLSAgICAgIC0tLS0tLS0tLS0KLSAgICAgIC0tIFJlYWQgLS0KLSAgICAgIC0tLS0tLS0tLS0KLQotICAgICAgcHJvY2VkdXJlIFJlYWQKLSAgICAgICAgKEl0ZW0gOiBvdXQgU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICAgICBMYXN0IDogb3V0IFN0cmVhbV9FbGVtZW50X09mZnNldCkgaXMKLSAgICAgIGJlZ2luCi0gICAgICAgICBBZGEuU3RyZWFtcy5SZWFkIChTdHJlYW0uQmFjay5hbGwsIEl0ZW0sIExhc3QpOwotICAgICAgZW5kIFJlYWQ7Ci0KLSAgICAgIHByb2NlZHVyZSBSZWFkIGlzIG5ldyBaTGliLlJlYWQKLSAgICAgICAgIChSZWFkICAgICAgID0+IFJlYWQsCi0gICAgICAgICAgQnVmZmVyICAgICA9PiBTdHJlYW0uQnVmZmVyLmFsbCwKLSAgICAgICAgICBSZXN0X0ZpcnN0ID0+IFN0cmVhbS5SZXN0X0ZpcnN0LAotICAgICAgICAgIFJlc3RfTGFzdCAgPT4gU3RyZWFtLlJlc3RfTGFzdCk7Ci0KLSAgIGJlZ2luCi0gICAgICBSZWFkIChTdHJlYW0uUmVhZGVyLCBJdGVtLCBMYXN0KTsKLSAgIGVuZCBSZWFkOwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBSZWFkX1RvdGFsX0luIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIGZ1bmN0aW9uIFJlYWRfVG90YWxfSW4gKFN0cmVhbSA6IGluIFN0cmVhbV9UeXBlKSByZXR1cm4gQ291bnQgaXMKLSAgIGJlZ2luCi0gICAgICByZXR1cm4gVG90YWxfSW4gKFN0cmVhbS5SZWFkZXIpOwotICAgZW5kIFJlYWRfVG90YWxfSW47Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBSZWFkX1RvdGFsX091dCAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgZnVuY3Rpb24gUmVhZF9Ub3RhbF9PdXQgKFN0cmVhbSA6IGluIFN0cmVhbV9UeXBlKSByZXR1cm4gQ291bnQgaXMKLSAgIGJlZ2luCi0gICAgICByZXR1cm4gVG90YWxfT3V0IChTdHJlYW0uUmVhZGVyKTsKLSAgIGVuZCBSZWFkX1RvdGFsX091dDsKLQotICAgLS0tLS0tLS0tLS0KLSAgIC0tIFdyaXRlIC0tCi0gICAtLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgV3JpdGUKLSAgICAgKFN0cmVhbSA6IGluIG91dCBTdHJlYW1fVHlwZTsKLSAgICAgIEl0ZW0gICA6IGluICAgICBTdHJlYW1fRWxlbWVudF9BcnJheSkKLSAgIGlzCi0KLSAgICAgIHByb2NlZHVyZSBXcml0ZSAoSXRlbSA6IGluIFN0cmVhbV9FbGVtZW50X0FycmF5KTsKLQotICAgICAgLS0tLS0tLS0tLS0KLSAgICAgIC0tIFdyaXRlIC0tCi0gICAgICAtLS0tLS0tLS0tLQotCi0gICAgICBwcm9jZWR1cmUgV3JpdGUgKEl0ZW0gOiBpbiBTdHJlYW1fRWxlbWVudF9BcnJheSkgaXMKLSAgICAgIGJlZ2luCi0gICAgICAgICBBZGEuU3RyZWFtcy5Xcml0ZSAoU3RyZWFtLkJhY2suYWxsLCBJdGVtKTsKLSAgICAgIGVuZCBXcml0ZTsKLQotICAgICAgcHJvY2VkdXJlIFdyaXRlIGlzIG5ldyBaTGliLldyaXRlCi0gICAgICAgICAoV3JpdGUgICAgICAgPT4gV3JpdGUsCi0gICAgICAgICAgQnVmZmVyX1NpemUgPT4gU3RyZWFtLkJ1ZmZlcl9TaXplKTsKLQotICAgYmVnaW4KLSAgICAgIFdyaXRlIChTdHJlYW0uV3JpdGVyLCBJdGVtLCBOb19GbHVzaCk7Ci0gICBlbmQgV3JpdGU7Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBXcml0ZV9Ub3RhbF9JbiAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgZnVuY3Rpb24gV3JpdGVfVG90YWxfSW4gKFN0cmVhbSA6IGluIFN0cmVhbV9UeXBlKSByZXR1cm4gQ291bnQgaXMKLSAgIGJlZ2luCi0gICAgICByZXR1cm4gVG90YWxfSW4gKFN0cmVhbS5Xcml0ZXIpOwotICAgZW5kIFdyaXRlX1RvdGFsX0luOwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tIFdyaXRlX1RvdGFsX091dCAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIGZ1bmN0aW9uIFdyaXRlX1RvdGFsX091dCAoU3RyZWFtIDogaW4gU3RyZWFtX1R5cGUpIHJldHVybiBDb3VudCBpcwotICAgYmVnaW4KLSAgICAgIHJldHVybiBUb3RhbF9PdXQgKFN0cmVhbS5Xcml0ZXIpOwotICAgZW5kIFdyaXRlX1RvdGFsX091dDsKLQotZW5kIFpMaWIuU3RyZWFtczsKZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvYWRhL3psaWItc3RyZWFtcy5hZHMgYi9zcmMvemxpYi9jb250cmliL2FkYS96bGliLXN0cmVhbXMuYWRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDE5M2M2Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvYWRhL3psaWItc3RyZWFtcy5hZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLS0gIFpMaWIgZm9yIEFkYSB0aGljayBiaW5kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIERtaXRyaXkgQW5pc2lta292ICAgICAgICAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gIE9wZW4gc291cmNlIGxpY2Vuc2UgaW5mb3JtYXRpb24gaXMgaW4gdGhlIHpsaWIuYWRzIGZpbGUuICAtLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLSAgJElkOiB6bGliLXN0cmVhbXMuYWRzLHYgMS4xMiAyMDA0LzA1LzMxIDEwOjUzOjQwIHZhZ3VsIEV4cCAkCi0KLXBhY2thZ2UgWkxpYi5TdHJlYW1zIGlzCi0KLSAgIHR5cGUgU3RyZWFtX01vZGUgaXMgKEluX1N0cmVhbSwgT3V0X1N0cmVhbSwgRHVwbGV4KTsKLQotICAgdHlwZSBTdHJlYW1fQWNjZXNzIGlzIGFjY2VzcyBhbGwgQWRhLlN0cmVhbXMuUm9vdF9TdHJlYW1fVHlwZSdDbGFzczsKLQotICAgdHlwZSBTdHJlYW1fVHlwZSBpcwotICAgICAgbmV3IEFkYS5TdHJlYW1zLlJvb3RfU3RyZWFtX1R5cGUgd2l0aCBwcml2YXRlOwotCi0gICBwcm9jZWR1cmUgUmVhZAotICAgICAoU3RyZWFtIDogaW4gb3V0IFN0cmVhbV9UeXBlOwotICAgICAgSXRlbSAgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgTGFzdCAgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldCk7Ci0KLSAgIHByb2NlZHVyZSBXcml0ZQotICAgICAoU3RyZWFtIDogaW4gb3V0IFN0cmVhbV9UeXBlOwotICAgICAgSXRlbSAgIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5KTsKLQotICAgcHJvY2VkdXJlIEZsdXNoCi0gICAgIChTdHJlYW0gOiBpbiBvdXQgU3RyZWFtX1R5cGU7Ci0gICAgICBNb2RlICAgOiBpbiAgICAgRmx1c2hfTW9kZSA6PSBTeW5jX0ZsdXNoKTsKLSAgIC0tICBGbHVzaCB0aGUgd3JpdHRlbiBkYXRhIHRvIHRoZSBiYWNrIHN0cmVhbSwKLSAgIC0tICBhbGwgZGF0YSBwbGFjZWQgdG8gdGhlIGNvbXByZXNzb3IgaXMgZmx1c2hpbmcgdG8gdGhlIEJhY2sgc3RyZWFtLgotICAgLS0gIFNob3VsZCBub3QgYmUgdXNlZCB1bnRpbGwgbmVjZXNzYXJ5LCBiZWNvdXNlIGl0IGlzIGRlY3JlYXNpbmcKLSAgIC0tICBjb21wcmVzc2lvbi4KLQotICAgZnVuY3Rpb24gUmVhZF9Ub3RhbF9JbiAoU3RyZWFtIDogaW4gU3RyZWFtX1R5cGUpIHJldHVybiBDb3VudDsKLSAgIHByYWdtYSBJbmxpbmUgKFJlYWRfVG90YWxfSW4pOwotICAgLS0gIFJldHVybiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIGJhY2sgc3RyZWFtIHNvIGZhci4KLQotICAgZnVuY3Rpb24gUmVhZF9Ub3RhbF9PdXQgKFN0cmVhbSA6IGluIFN0cmVhbV9UeXBlKSByZXR1cm4gQ291bnQ7Ci0gICBwcmFnbWEgSW5saW5lIChSZWFkX1RvdGFsX091dCk7Ci0gICAtLSAgUmV0dXJuIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkIHNvIGZhci4KLQotICAgZnVuY3Rpb24gV3JpdGVfVG90YWxfSW4gKFN0cmVhbSA6IGluIFN0cmVhbV9UeXBlKSByZXR1cm4gQ291bnQ7Ci0gICBwcmFnbWEgSW5saW5lIChXcml0ZV9Ub3RhbF9Jbik7Ci0gICAtLSAgUmV0dXJuIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHNvIGZhci4KLQotICAgZnVuY3Rpb24gV3JpdGVfVG90YWxfT3V0IChTdHJlYW0gOiBpbiBTdHJlYW1fVHlwZSkgcmV0dXJuIENvdW50OwotICAgcHJhZ21hIElubGluZSAoV3JpdGVfVG90YWxfT3V0KTsKLSAgIC0tICBSZXR1cm4gdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIGJhY2sgc3RyZWFtLgotCi0gICBwcm9jZWR1cmUgQ3JlYXRlCi0gICAgIChTdHJlYW0gICAgICAgICAgICA6ICAgIG91dCBTdHJlYW1fVHlwZTsKLSAgICAgIE1vZGUgICAgICAgICAgICAgIDogaW4gICAgIFN0cmVhbV9Nb2RlOwotICAgICAgQmFjayAgICAgICAgICAgICAgOiBpbiAgICAgU3RyZWFtX0FjY2VzczsKLSAgICAgIEJhY2tfQ29tcHJlc3NlZCAgIDogaW4gICAgIEJvb2xlYW47Ci0gICAgICBMZXZlbCAgICAgICAgICAgICA6IGluICAgICBDb21wcmVzc2lvbl9MZXZlbCA6PSBEZWZhdWx0X0NvbXByZXNzaW9uOwotICAgICAgU3RyYXRlZ3kgICAgICAgICAgOiBpbiAgICAgU3RyYXRlZ3lfVHlwZSAgICAgOj0gRGVmYXVsdF9TdHJhdGVneTsKLSAgICAgIEhlYWRlciAgICAgICAgICAgIDogaW4gICAgIEhlYWRlcl9UeXBlICAgICAgIDo9IERlZmF1bHQ7Ci0gICAgICBSZWFkX0J1ZmZlcl9TaXplICA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo9IERlZmF1bHRfQnVmZmVyX1NpemU7Ci0gICAgICBXcml0ZV9CdWZmZXJfU2l6ZSA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo9IERlZmF1bHRfQnVmZmVyX1NpemUpOwotICAgLS0gIENyZWF0ZSB0aGUgQ29tcmVzc2lvbi9EZWNvbXByZXNzaW9uIHN0cmVhbS4KLSAgIC0tICBJZiBtb2RlIGlzIEluX1N0cmVhbSB0aGVuIFdyaXRlIG9wZXJhdGlvbiBpcyBkaXNhYmxlZC4KLSAgIC0tICBJZiBtb2RlIGlzIE91dF9TdHJlYW0gdGhlbiBSZWFkIG9wZXJhdGlvbiBpcyBkaXNhYmxlZC4KLQotICAgLS0gIElmIEJhY2tfQ29tcHJlc3NlZCBpcyB0cnVlIHRoZW4KLSAgIC0tICBEYXRhIHdyaXR0ZW4gdG8gdGhlIFN0cmVhbSBpcyBjb21wcmVzc2luZyB0byB0aGUgQmFjayBzdHJlYW0KLSAgIC0tICBhbmQgZGF0YSByZWFkIGZyb20gdGhlIFN0cmVhbSBpcyBkZWNvbXByZXNzZWQgZGF0YSBmcm9tIHRoZSBCYWNrIHN0cmVhbS4KLQotICAgLS0gIElmIEJhY2tfQ29tcHJlc3NlZCBpcyBmYWxzZSB0aGVuCi0gICAtLSAgRGF0YSB3cml0dGVuIHRvIHRoZSBTdHJlYW0gaXMgZGVjb21wcmVzc2luZyB0byB0aGUgQmFjayBzdHJlYW0KLSAgIC0tICBhbmQgZGF0YSByZWFkIGZyb20gdGhlIFN0cmVhbSBpcyBjb21wcmVzc2VkIGRhdGEgZnJvbSB0aGUgQmFjayBzdHJlYW0uCi0KLSAgIC0tICAhISEgV2hlbiB0aGUgTmVlZF9IZWFkZXIgaXMgRmFsc2UgWkxpYi1BZGEgaXMgdXNpbmcgdW5kb2N1bWVudGVkCi0gICAtLSAgWkxpYiAxLjEuNCBmdW5jdGlvbmFsaXR5IHRvIGRvIG5vdCBjcmVhdGUvd2FpdCBmb3IgWkxpYiBoZWFkZXJzLgotCi0gICBmdW5jdGlvbiBJc19PcGVuIChTdHJlYW0gOiBTdHJlYW1fVHlwZSkgcmV0dXJuIEJvb2xlYW47Ci0KLSAgIHByb2NlZHVyZSBDbG9zZSAoU3RyZWFtIDogaW4gb3V0IFN0cmVhbV9UeXBlKTsKLQotcHJpdmF0ZQotCi0gICB1c2UgQWRhLlN0cmVhbXM7Ci0KLSAgIHR5cGUgQnVmZmVyX0FjY2VzcyBpcyBhY2Nlc3MgYWxsIFN0cmVhbV9FbGVtZW50X0FycmF5OwotCi0gICB0eXBlIFN0cmVhbV9UeXBlCi0gICAgIGlzIG5ldyBSb290X1N0cmVhbV9UeXBlIHdpdGgKLSAgIHJlY29yZAotICAgICAgTW9kZSAgICAgICA6IFN0cmVhbV9Nb2RlOwotCi0gICAgICBCdWZmZXIgICAgIDogQnVmZmVyX0FjY2VzczsKLSAgICAgIFJlc3RfRmlyc3QgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBSZXN0X0xhc3QgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgLS0gIEJ1ZmZlciBmb3IgUmVhZCBvcGVyYXRpb24uCi0gICAgICAtLSAgV2UgbmVlZCB0byBoYXZlIHRoaXMgYnVmZmVyIGluIHRoZSByZWNvcmQKLSAgICAgIC0tICBiZWNvdXNlIG5vdCBhbGwgcmVhZCBkYXRhIGZyb20gYmFjayBzdHJlYW0KLSAgICAgIC0tICBjb3VsZCBiZSBwcm9jZXNzZWQgZHVyaW5nIHRoZSByZWFkIG9wZXJhdGlvbi4KLQotICAgICAgQnVmZmVyX1NpemUgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICAtLSAgQnVmZmVyIHNpemUgZm9yIHdyaXRlIG9wZXJhdGlvbi4KLSAgICAgIC0tICBXZSBkbyBub3QgbmVlZCB0byBoYXZlIHRoaXMgYnVmZmVyCi0gICAgICAtLSAgaW4gdGhlIHJlY29yZCBiZWNvdXNlIGFsbCBkYXRhIGNvdWxkIGJlCi0gICAgICAtLSAgcHJvY2Vzc2VkIGluIHRoZSB3cml0ZSBvcGVyYXRpb24uCi0KLSAgICAgIEJhY2sgICAgICAgOiBTdHJlYW1fQWNjZXNzOwotICAgICAgUmVhZGVyICAgICA6IEZpbHRlcl9UeXBlOwotICAgICAgV3JpdGVyICAgICA6IEZpbHRlcl9UeXBlOwotICAgZW5kIHJlY29yZDsKLQotZW5kIFpMaWIuU3RyZWFtczsKZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvYWRhL3psaWItdGhpbi5hZGIgYi9zcmMvemxpYi9jb250cmliL2FkYS96bGliLXRoaW4uYWRiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2E0YTcxLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvYWRhL3psaWItdGhpbi5hZGIKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLS0gIFpMaWIgZm9yIEFkYSB0aGljayBiaW5kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIERtaXRyaXkgQW5pc2lta292ICAgICAgICAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gIE9wZW4gc291cmNlIGxpY2Vuc2UgaW5mb3JtYXRpb24gaXMgaW4gdGhlIHpsaWIuYWRzIGZpbGUuICAtLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLSAgJElkOiB6bGliLXRoaW4uYWRiLHYgMS44IDIwMDMvMTIvMTQgMTg6Mjc6MzEgdmFndWwgRXhwICQKLQotcGFja2FnZSBib2R5IFpMaWIuVGhpbiBpcwotCi0gICBaTElCX1ZFUlNJT04gIDogY29uc3RhbnQgQ2hhcnNfUHRyIDo9IHpsaWJWZXJzaW9uOwotCi0gICBaX1N0cmVhbV9TaXplIDogY29uc3RhbnQgSW50IDo9IFpfU3RyZWFtJ1NpemUgLyBTeXN0ZW0uU3RvcmFnZV9Vbml0OwotCi0gICAtLS0tLS0tLS0tLS0tLQotICAgLS0gQXZhaWxfSW4gLS0KLSAgIC0tLS0tLS0tLS0tLS0tCi0KLSAgIGZ1bmN0aW9uIEF2YWlsX0luIChTdHJtIDogaW4gWl9TdHJlYW0pIHJldHVybiBVSW50IGlzCi0gICBiZWdpbgotICAgICAgcmV0dXJuIFN0cm0uQXZhaWxfSW47Ci0gICBlbmQgQXZhaWxfSW47Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLQotICAgLS0gQXZhaWxfT3V0IC0tCi0gICAtLS0tLS0tLS0tLS0tLS0KLQotICAgZnVuY3Rpb24gQXZhaWxfT3V0IChTdHJtIDogaW4gWl9TdHJlYW0pIHJldHVybiBVSW50IGlzCi0gICBiZWdpbgotICAgICAgcmV0dXJuIFN0cm0uQXZhaWxfT3V0OwotICAgZW5kIEF2YWlsX091dDsKLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBEZWZsYXRlX0luaXQgLS0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBmdW5jdGlvbiBEZWZsYXRlX0luaXQKLSAgICAgKHN0cm0gICAgICAgOiBaX1N0cmVhbXA7Ci0gICAgICBsZXZlbCAgICAgIDogSW50OwotICAgICAgbWV0aG9kICAgICA6IEludDsKLSAgICAgIHdpbmRvd0JpdHMgOiBJbnQ7Ci0gICAgICBtZW1MZXZlbCAgIDogSW50OwotICAgICAgc3RyYXRlZ3kgICA6IEludCkKLSAgICAgIHJldHVybiAgICAgICBJbnQgaXMKLSAgIGJlZ2luCi0gICAgICByZXR1cm4gZGVmbGF0ZUluaXQyCi0gICAgICAgICAgICAgICAoc3RybSwKLSAgICAgICAgICAgICAgICBsZXZlbCwKLSAgICAgICAgICAgICAgICBtZXRob2QsCi0gICAgICAgICAgICAgICAgd2luZG93Qml0cywKLSAgICAgICAgICAgICAgICBtZW1MZXZlbCwKLSAgICAgICAgICAgICAgICBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICBaTElCX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgWl9TdHJlYW1fU2l6ZSk7Ci0gICBlbmQgRGVmbGF0ZV9Jbml0OwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tIEluZmxhdGVfSW5pdCAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIGZ1bmN0aW9uIEluZmxhdGVfSW5pdCAoc3RybSA6IFpfU3RyZWFtcDsgd2luZG93Qml0cyA6IEludCkgcmV0dXJuIEludCBpcwotICAgYmVnaW4KLSAgICAgIHJldHVybiBpbmZsYXRlSW5pdDIgKHN0cm0sIHdpbmRvd0JpdHMsIFpMSUJfVkVSU0lPTiwgWl9TdHJlYW1fU2l6ZSk7Ci0gICBlbmQgSW5mbGF0ZV9Jbml0OwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tIExhc3RfRXJyb3JfTWVzc2FnZSAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIGZ1bmN0aW9uIExhc3RfRXJyb3JfTWVzc2FnZSAoU3RybSA6IGluIFpfU3RyZWFtKSByZXR1cm4gU3RyaW5nIGlzCi0gICAgICB1c2UgSW50ZXJmYWNlcy5DLlN0cmluZ3M7Ci0gICBiZWdpbgotICAgICAgaWYgU3RybS5tc2cgPSBOdWxsX1B0ciB0aGVuCi0gICAgICAgICByZXR1cm4gIiI7Ci0gICAgICBlbHNlCi0gICAgICAgICByZXR1cm4gVmFsdWUgKFN0cm0ubXNnKTsKLSAgICAgIGVuZCBpZjsKLSAgIGVuZCBMYXN0X0Vycm9yX01lc3NhZ2U7Ci0KLSAgIC0tLS0tLS0tLS0tLQotICAgLS0gU2V0X0luIC0tCi0gICAtLS0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIFNldF9JbgotICAgICAoU3RybSAgIDogaW4gb3V0IFpfU3RyZWFtOwotICAgICAgQnVmZmVyIDogaW4gICAgIFZvaWRwOwotICAgICAgU2l6ZSAgIDogaW4gICAgIFVJbnQpIGlzCi0gICBiZWdpbgotICAgICAgU3RybS5OZXh0X0luICA6PSBCdWZmZXI7Ci0gICAgICBTdHJtLkF2YWlsX0luIDo9IFNpemU7Ci0gICBlbmQgU2V0X0luOwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tIFNldF9NZW1fRnVuYyAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBTZXRfTWVtX0Z1bmMKLSAgICAgKFN0cm0gICA6IGluIG91dCBaX1N0cmVhbTsKLSAgICAgIE9wYXF1ZSA6IGluICAgICBWb2lkcDsKLSAgICAgIEFsbG9jICA6IGluICAgICBhbGxvY19mdW5jOwotICAgICAgRnJlZSAgIDogaW4gICAgIGZyZWVfZnVuYykgaXMKLSAgIGJlZ2luCi0gICAgICBTdHJtLm9wYXF1ZSA6PSBPcGFxdWU7Ci0gICAgICBTdHJtLnphbGxvYyA6PSBBbGxvYzsKLSAgICAgIFN0cm0uemZyZWUgIDo9IEZyZWU7Ci0gICBlbmQgU2V0X01lbV9GdW5jOwotCi0gICAtLS0tLS0tLS0tLS0tCi0gICAtLSBTZXRfT3V0IC0tCi0gICAtLS0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBTZXRfT3V0Ci0gICAgIChTdHJtICAgOiBpbiBvdXQgWl9TdHJlYW07Ci0gICAgICBCdWZmZXIgOiBpbiAgICAgVm9pZHA7Ci0gICAgICBTaXplICAgOiBpbiAgICAgVUludCkgaXMKLSAgIGJlZ2luCi0gICAgICBTdHJtLk5leHRfT3V0ICA6PSBCdWZmZXI7Ci0gICAgICBTdHJtLkF2YWlsX091dCA6PSBTaXplOwotICAgZW5kIFNldF9PdXQ7Ci0KLSAgIC0tLS0tLS0tLS0tLS0tCi0gICAtLSBUb3RhbF9JbiAtLQotICAgLS0tLS0tLS0tLS0tLS0KLQotICAgZnVuY3Rpb24gVG90YWxfSW4gKFN0cm0gOiBpbiBaX1N0cmVhbSkgcmV0dXJuIFVMb25nIGlzCi0gICBiZWdpbgotICAgICAgcmV0dXJuIFN0cm0uVG90YWxfSW47Ci0gICBlbmQgVG90YWxfSW47Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLQotICAgLS0gVG90YWxfT3V0IC0tCi0gICAtLS0tLS0tLS0tLS0tLS0KLQotICAgZnVuY3Rpb24gVG90YWxfT3V0IChTdHJtIDogaW4gWl9TdHJlYW0pIHJldHVybiBVTG9uZyBpcwotICAgYmVnaW4KLSAgICAgIHJldHVybiBTdHJtLlRvdGFsX091dDsKLSAgIGVuZCBUb3RhbF9PdXQ7Ci0KLWVuZCBaTGliLlRoaW47CmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2FkYS96bGliLXRoaW4uYWRzIGIvc3JjL3psaWIvY29udHJpYi9hZGEvemxpYi10aGluLmFkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0MDdlYi4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL2FkYS96bGliLXRoaW4uYWRzCisrKyAvZGV2L251bGwKQEAgLTEsNDUwICswLDAgQEAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0tICBaTGliIGZvciBBZGEgdGhpY2sgYmluZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBEbWl0cml5IEFuaXNpbWtvdiAgICAgICAgICAgICAgICAgLS0KLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICBPcGVuIHNvdXJjZSBsaWNlbnNlIGluZm9ybWF0aW9uIGlzIGluIHRoZSB6bGliLmFkcyBmaWxlLiAgLS0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0gICRJZDogemxpYi10aGluLmFkcyx2IDEuMTEgMjAwNC8wNy8yMyAwNjozMzoxMSB2YWd1bCBFeHAgJAotCi13aXRoIEludGVyZmFjZXMuQy5TdHJpbmdzOwotCi13aXRoIFN5c3RlbTsKLQotcHJpdmF0ZSBwYWNrYWdlIFpMaWIuVGhpbiBpcwotCi0gICAtLSAgRnJvbSB6Y29uZi5oCi0KLSAgIE1BWF9NRU1fTEVWRUwgOiBjb25zdGFudCA6PSA5OyAgICAgICAgIC0tICB6Y29uZi5oOjEwNQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpjb25mLmg6MTA1Ci0gICBNQVhfV0JJVFMgOiBjb25zdGFudCA6PSAxNTsgICAgICAtLSAgemNvbmYuaDoxMTUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICAzMksgTFo3NyB3aW5kb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6Y29uZi5oOjExNQotICAgU0VFS19TRVQgOiBjb25zdGFudCA6PSA4IzAwMDAjOyAgLS0gIHpjb25mLmg6MjQ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpjb25mLmg6MjQ0Ci0gICBTRUVLX0NVUiA6IGNvbnN0YW50IDo9IDE7ICAgICAgICAtLSAgemNvbmYuaDoyNDUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6Y29uZi5oOjI0NQotICAgU0VFS19FTkQgOiBjb25zdGFudCA6PSAyOyAgICAgICAgLS0gIHpjb25mLmg6MjQ2Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgU2V0IGZpbGUgcG9pbnRlciB0byBFT0YgcGx1cyAib2Zmc2V0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpjb25mLmg6MjQ2Ci0KLSAgIHR5cGUgQnl0ZSBpcyBuZXcgSW50ZXJmYWNlcy5DLnVuc2lnbmVkX2NoYXI7IC0tICA4IGJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6Y29uZi5oOjIxNAotICAgdHlwZSBVSW50IGlzIG5ldyBJbnRlcmZhY2VzLkMudW5zaWduZWQ7ICAgICAgLS0gIDE2IGJpdHMgb3IgbW9yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpjb25mLmg6MjE2Ci0gICB0eXBlIEludCBpcyBuZXcgSW50ZXJmYWNlcy5DLmludDsKLQotICAgdHlwZSBVTG9uZyBpcyBuZXcgSW50ZXJmYWNlcy5DLnVuc2lnbmVkX2xvbmc7ICAgICAtLSAgMzIgYml0cyBvciBtb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6Y29uZi5oOjIxNwotICAgc3VidHlwZSBDaGFyc19QdHIgaXMgSW50ZXJmYWNlcy5DLlN0cmluZ3MuY2hhcnNfcHRyOwotCi0gICB0eXBlIFVMb25nX0FjY2VzcyBpcyBhY2Nlc3MgVUxvbmc7Ci0gICB0eXBlIEludF9BY2Nlc3MgaXMgYWNjZXNzIEludDsKLQotICAgc3VidHlwZSBWb2lkcCBpcyBTeXN0ZW0uQWRkcmVzczsgICAgICAgICAgICAtLSAgemNvbmYuaDoyMzIKLQotICAgc3VidHlwZSBCeXRlX0FjY2VzcyBpcyBWb2lkcDsKLQotICAgTnVsIDogY29uc3RhbnQgVm9pZHAgOj0gU3lzdGVtLk51bGxfQWRkcmVzczsKLSAgIC0tICBlbmQgZnJvbSB6Y29uZgotCi0gICBaX05PX0ZMVVNIIDogY29uc3RhbnQgOj0gOCMwMDAwIzsgICAtLSAgemxpYi5oOjEyNQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMjUKLSAgIFpfUEFSVElBTF9GTFVTSCA6IGNvbnN0YW50IDo9IDE7ICAgICAgIC0tICB6bGliLmg6MTI2Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgd2lsbCBiZSByZW1vdmVkLCB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBaX1NZTkNfRkxVU0ggaW5zdGVhZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMjYKLSAgIFpfU1lOQ19GTFVTSCA6IGNvbnN0YW50IDo9IDI7ICAgICAgIC0tICB6bGliLmg6MTI3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEyNwotICAgWl9GVUxMX0ZMVVNIIDogY29uc3RhbnQgOj0gMzsgICAgICAgLS0gIHpsaWIuaDoxMjgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTI4Ci0gICBaX0ZJTklTSCA6IGNvbnN0YW50IDo9IDQ7ICAgICAgICAtLSAgemxpYi5oOjEyOQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMjkKLSAgIFpfT0sgOiBjb25zdGFudCA6PSA4IzAwMDAjOyAgIC0tICB6bGliLmg6MTMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEzMgotICAgWl9TVFJFQU1fRU5EIDogY29uc3RhbnQgOj0gMTsgICAgICAgLS0gIHpsaWIuaDoxMzMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTMzCi0gICBaX05FRURfRElDVCA6IGNvbnN0YW50IDo9IDI7ICAgICAgICAtLSAgemxpYi5oOjEzNAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMzQKLSAgIFpfRVJSTk8gOiBjb25zdGFudCA6PSAtMTsgICAgICAgIC0tICB6bGliLmg6MTM1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEzNQotICAgWl9TVFJFQU1fRVJST1IgOiBjb25zdGFudCA6PSAtMjsgICAgICAgLS0gIHpsaWIuaDoxMzYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTM2Ci0gICBaX0RBVEFfRVJST1IgOiBjb25zdGFudCA6PSAtMzsgICAgICAtLSAgemxpYi5oOjEzNwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMzcKLSAgIFpfTUVNX0VSUk9SIDogY29uc3RhbnQgOj0gLTQ7ICAgICAgIC0tICB6bGliLmg6MTM4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEzOAotICAgWl9CVUZfRVJST1IgOiBjb25zdGFudCA6PSAtNTsgICAgICAgLS0gIHpsaWIuaDoxMzkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTM5Ci0gICBaX1ZFUlNJT05fRVJST1IgOiBjb25zdGFudCA6PSAtNjsgICAgICAtLSAgemxpYi5oOjE0MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxNDAKLSAgIFpfTk9fQ09NUFJFU1NJT04gOiBjb25zdGFudCA6PSA4IzAwMDAjOyAgIC0tICB6bGliLmg6MTQ1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE0NQotICAgWl9CRVNUX1NQRUVEIDogY29uc3RhbnQgOj0gMTsgICAgICAgLS0gIHpsaWIuaDoxNDYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTQ2Ci0gICBaX0JFU1RfQ09NUFJFU1NJT04gOiBjb25zdGFudCA6PSA5OyAgICAgICAtLSAgemxpYi5oOjE0NwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxNDcKLSAgIFpfREVGQVVMVF9DT01QUkVTU0lPTiA6IGNvbnN0YW50IDo9IC0xOyAgICAgIC0tICB6bGliLmg6MTQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE0OAotICAgWl9GSUxURVJFRCA6IGNvbnN0YW50IDo9IDE7ICAgICAgLS0gIHpsaWIuaDoxNTEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTUxCi0gICBaX0hVRkZNQU5fT05MWSA6IGNvbnN0YW50IDo9IDI7ICAgICAgICAtLSAgemxpYi5oOjE1MgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxNTIKLSAgIFpfREVGQVVMVF9TVFJBVEVHWSA6IGNvbnN0YW50IDo9IDgjMDAwMCM7IC0tICB6bGliLmg6MTUzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE1MwotICAgWl9CSU5BUlkgOiBjb25zdGFudCA6PSA4IzAwMDAjOyAgLS0gIHpsaWIuaDoxNTYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTU2Ci0gICBaX0FTQ0lJIDogY29uc3RhbnQgOj0gMTsgICAgICAtLSAgemxpYi5oOjE1NwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxNTcKLSAgIFpfVU5LTk9XTiA6IGNvbnN0YW50IDo9IDI7ICAgICAgIC0tICB6bGliLmg6MTU4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE1OAotICAgWl9ERUZMQVRFRCA6IGNvbnN0YW50IDo9IDg7ICAgICAgLS0gIHpsaWIuaDoxNjEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTYxCi0gICBaX05VTEwgOiBjb25zdGFudCA6PSA4IzAwMDAjOyAtLSAgemxpYi5oOjE2NAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIGZvciBpbml0aWFsaXppbmcgemFsbG9jLCB6ZnJlZSwgb3BhcXVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE2NAotICAgdHlwZSBnekZpbGUgaXMgbmV3IFZvaWRwOyAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6NjQ2Ci0KLSAgIHR5cGUgWl9TdHJlYW0gaXMgcHJpdmF0ZTsKLQotICAgdHlwZSBaX1N0cmVhbXAgaXMgYWNjZXNzIGFsbCBaX1N0cmVhbTsgICAgIC0tICB6bGliLmg6ODkKLQotICAgdHlwZSBhbGxvY19mdW5jIGlzIGFjY2VzcyBmdW5jdGlvbgotICAgICAoT3BhcXVlIDogVm9pZHA7Ci0gICAgICBJdGVtcyAgOiBVSW50OwotICAgICAgU2l6ZSAgIDogVUludCkKLSAgICAgIHJldHVybiBWb2lkcDsgLS0gIHpsaWIuaDo2MwotCi0gICB0eXBlIGZyZWVfZnVuYyBpcyBhY2Nlc3MgcHJvY2VkdXJlIChvcGFxdWUgOiBWb2lkcDsgYWRkcmVzcyA6IFZvaWRwKTsKLQotICAgZnVuY3Rpb24gemxpYlZlcnNpb24gcmV0dXJuIENoYXJzX1B0cjsKLQotICAgZnVuY3Rpb24gRGVmbGF0ZSAoc3RybSA6IFpfU3RyZWFtcDsgZmx1c2ggOiBJbnQpIHJldHVybiBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIERlZmxhdGVFbmQgKHN0cm0gOiBaX1N0cmVhbXApIHJldHVybiBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIEluZmxhdGUgKHN0cm0gOiBaX1N0cmVhbXA7IGZsdXNoIDogSW50KSByZXR1cm4gSW50OwotCi0gICBmdW5jdGlvbiBJbmZsYXRlRW5kIChzdHJtIDogWl9TdHJlYW1wKSByZXR1cm4gSW50OwotCi0gICBmdW5jdGlvbiBkZWZsYXRlU2V0RGljdGlvbmFyeQotICAgICAoc3RybSAgICAgICA6IFpfU3RyZWFtcDsKLSAgICAgIGRpY3Rpb25hcnkgOiBCeXRlX0FjY2VzczsKLSAgICAgIGRpY3RMZW5ndGggOiBVSW50KQotICAgICAgcmV0dXJuICAgICAgIEludDsKLQotICAgZnVuY3Rpb24gZGVmbGF0ZUNvcHkgKGRlc3QgOiBaX1N0cmVhbXA7IHNvdXJjZSA6IFpfU3RyZWFtcCkgcmV0dXJuIEludDsKLSAgIC0tICB6bGliLmg6NDc4Ci0KLSAgIGZ1bmN0aW9uIGRlZmxhdGVSZXNldCAoc3RybSA6IFpfU3RyZWFtcCkgcmV0dXJuIEludDsgLS0gemxpYi5oOjQ5NQotCi0gICBmdW5jdGlvbiBkZWZsYXRlUGFyYW1zCi0gICAgIChzdHJtICAgICA6IFpfU3RyZWFtcDsKLSAgICAgIGxldmVsICAgIDogSW50OwotICAgICAgc3RyYXRlZ3kgOiBJbnQpCi0gICAgICByZXR1cm4gICAgIEludDsgICAgICAgLS0gemxpYi5oOjUwNgotCi0gICBmdW5jdGlvbiBpbmZsYXRlU2V0RGljdGlvbmFyeQotICAgICAoc3RybSAgICAgICA6IFpfU3RyZWFtcDsKLSAgICAgIGRpY3Rpb25hcnkgOiBCeXRlX0FjY2VzczsKLSAgICAgIGRpY3RMZW5ndGggOiBVSW50KQotICAgICAgcmV0dXJuICAgICAgIEludDsgLS0gIHpsaWIuaDo1NDgKLQotICAgZnVuY3Rpb24gaW5mbGF0ZVN5bmMgKHN0cm0gOiBaX1N0cmVhbXApIHJldHVybiBJbnQ7ICAtLSAgemxpYi5oOjU2NQotCi0gICBmdW5jdGlvbiBpbmZsYXRlUmVzZXQgKHN0cm0gOiBaX1N0cmVhbXApIHJldHVybiBJbnQ7IC0tICB6bGliLmg6NTgwCi0KLSAgIGZ1bmN0aW9uIGNvbXByZXNzCi0gICAgIChkZXN0ICAgICAgOiBCeXRlX0FjY2VzczsKLSAgICAgIGRlc3RMZW4gICA6IFVMb25nX0FjY2VzczsKLSAgICAgIHNvdXJjZSAgICA6IEJ5dGVfQWNjZXNzOwotICAgICAgc291cmNlTGVuIDogVUxvbmcpCi0gICAgICByZXR1cm4gICAgICBJbnQ7ICAgICAgICAgICAtLSB6bGliLmg6NjAxCi0KLSAgIGZ1bmN0aW9uIGNvbXByZXNzMgotICAgICAoZGVzdCAgICAgIDogQnl0ZV9BY2Nlc3M7Ci0gICAgICBkZXN0TGVuICAgOiBVTG9uZ19BY2Nlc3M7Ci0gICAgICBzb3VyY2UgICAgOiBCeXRlX0FjY2VzczsKLSAgICAgIHNvdXJjZUxlbiA6IFVMb25nOwotICAgICAgbGV2ZWwgICAgIDogSW50KQotICAgICAgcmV0dXJuICAgICAgSW50OyAgICAgICAgICAtLSB6bGliLmg6NjE1Ci0KLSAgIGZ1bmN0aW9uIHVuY29tcHJlc3MKLSAgICAgKGRlc3QgICAgICA6IEJ5dGVfQWNjZXNzOwotICAgICAgZGVzdExlbiAgIDogVUxvbmdfQWNjZXNzOwotICAgICAgc291cmNlICAgIDogQnl0ZV9BY2Nlc3M7Ci0gICAgICBzb3VyY2VMZW4gOiBVTG9uZykKLSAgICAgIHJldHVybiAgICAgIEludDsKLQotICAgZnVuY3Rpb24gZ3pvcGVuIChwYXRoIDogQ2hhcnNfUHRyOyBtb2RlIDogQ2hhcnNfUHRyKSByZXR1cm4gZ3pGaWxlOwotCi0gICBmdW5jdGlvbiBnemRvcGVuIChmZCA6IEludDsgbW9kZSA6IENoYXJzX1B0cikgcmV0dXJuIGd6RmlsZTsKLQotICAgZnVuY3Rpb24gZ3pzZXRwYXJhbXMKLSAgICAgKGZpbGUgICAgIDogZ3pGaWxlOwotICAgICAgbGV2ZWwgICAgOiBJbnQ7Ci0gICAgICBzdHJhdGVneSA6IEludCkKLSAgICAgIHJldHVybiAgICAgSW50OwotCi0gICBmdW5jdGlvbiBnenJlYWQKLSAgICAgKGZpbGUgOiBnekZpbGU7Ci0gICAgICBidWYgIDogVm9pZHA7Ci0gICAgICBsZW4gIDogVUludCkKLSAgICAgIHJldHVybiBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIGd6d3JpdGUKLSAgICAgKGZpbGUgOiBpbiBnekZpbGU7Ci0gICAgICBidWYgIDogaW4gVm9pZHA7Ci0gICAgICBsZW4gIDogaW4gVUludCkKLSAgICAgIHJldHVybiBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIGd6cHJpbnRmIChmaWxlIDogaW4gZ3pGaWxlOyBmb3JtYXQgOiBpbiBDaGFyc19QdHIpIHJldHVybiBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIGd6cHV0cyAoZmlsZSA6IGluIGd6RmlsZTsgcyA6IGluIENoYXJzX1B0cikgcmV0dXJuIEludDsKLQotICAgZnVuY3Rpb24gZ3pnZXRzCi0gICAgIChmaWxlIDogZ3pGaWxlOwotICAgICAgYnVmICA6IENoYXJzX1B0cjsKLSAgICAgIGxlbiAgOiBJbnQpCi0gICAgICByZXR1cm4gQ2hhcnNfUHRyOwotCi0gICBmdW5jdGlvbiBnenB1dGMgKGZpbGUgOiBnekZpbGU7IGNoYXIgOiBJbnQpIHJldHVybiBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIGd6Z2V0YyAoZmlsZSA6IGd6RmlsZSkgcmV0dXJuIEludDsKLQotICAgZnVuY3Rpb24gZ3pmbHVzaCAoZmlsZSA6IGd6RmlsZTsgZmx1c2ggOiBJbnQpIHJldHVybiBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIGd6c2VlawotICAgICAoZmlsZSAgIDogZ3pGaWxlOwotICAgICAgb2Zmc2V0IDogSW50OwotICAgICAgd2hlbmNlIDogSW50KQotICAgICAgcmV0dXJuICAgSW50OwotCi0gICBmdW5jdGlvbiBnenJld2luZCAoZmlsZSA6IGd6RmlsZSkgcmV0dXJuIEludDsKLQotICAgZnVuY3Rpb24gZ3p0ZWxsIChmaWxlIDogZ3pGaWxlKSByZXR1cm4gSW50OwotCi0gICBmdW5jdGlvbiBnemVvZiAoZmlsZSA6IGd6RmlsZSkgcmV0dXJuIEludDsKLQotICAgZnVuY3Rpb24gZ3pjbG9zZSAoZmlsZSA6IGd6RmlsZSkgcmV0dXJuIEludDsKLQotICAgZnVuY3Rpb24gZ3plcnJvciAoZmlsZSA6IGd6RmlsZTsgZXJybnVtIDogSW50X0FjY2VzcykgcmV0dXJuIENoYXJzX1B0cjsKLQotICAgZnVuY3Rpb24gYWRsZXIzMgotICAgICAoYWRsZXIgOiBVTG9uZzsKLSAgICAgIGJ1ZiAgIDogQnl0ZV9BY2Nlc3M7Ci0gICAgICBsZW4gICA6IFVJbnQpCi0gICAgICByZXR1cm4gIFVMb25nOwotCi0gICBmdW5jdGlvbiBjcmMzMgotICAgICAoY3JjICA6IFVMb25nOwotICAgICAgYnVmICA6IEJ5dGVfQWNjZXNzOwotICAgICAgbGVuICA6IFVJbnQpCi0gICAgICByZXR1cm4gVUxvbmc7Ci0KLSAgIGZ1bmN0aW9uIGRlZmxhdGVJbml0Ci0gICAgIChzdHJtICAgICAgICA6IFpfU3RyZWFtcDsKLSAgICAgIGxldmVsICAgICAgIDogSW50OwotICAgICAgdmVyc2lvbiAgICAgOiBDaGFyc19QdHI7Ci0gICAgICBzdHJlYW1fc2l6ZSA6IEludCkKLSAgICAgIHJldHVybiAgICAgICAgSW50OwotCi0gICBmdW5jdGlvbiBkZWZsYXRlSW5pdDIKLSAgICAgKHN0cm0gICAgICAgIDogWl9TdHJlYW1wOwotICAgICAgbGV2ZWwgICAgICAgOiBJbnQ7Ci0gICAgICBtZXRob2QgICAgICA6IEludDsKLSAgICAgIHdpbmRvd0JpdHMgIDogSW50OwotICAgICAgbWVtTGV2ZWwgICAgOiBJbnQ7Ci0gICAgICBzdHJhdGVneSAgICA6IEludDsKLSAgICAgIHZlcnNpb24gICAgIDogQ2hhcnNfUHRyOwotICAgICAgc3RyZWFtX3NpemUgOiBJbnQpCi0gICAgICByZXR1cm4gICAgICAgIEludDsKLQotICAgZnVuY3Rpb24gRGVmbGF0ZV9Jbml0Ci0gICAgIChzdHJtICAgICAgIDogWl9TdHJlYW1wOwotICAgICAgbGV2ZWwgICAgICA6IEludDsKLSAgICAgIG1ldGhvZCAgICAgOiBJbnQ7Ci0gICAgICB3aW5kb3dCaXRzIDogSW50OwotICAgICAgbWVtTGV2ZWwgICA6IEludDsKLSAgICAgIHN0cmF0ZWd5ICAgOiBJbnQpCi0gICAgICByZXR1cm4gICAgICAgSW50OwotICAgcHJhZ21hIElubGluZSAoRGVmbGF0ZV9Jbml0KTsKLQotICAgZnVuY3Rpb24gaW5mbGF0ZUluaXQKLSAgICAgKHN0cm0gICAgICAgIDogWl9TdHJlYW1wOwotICAgICAgdmVyc2lvbiAgICAgOiBDaGFyc19QdHI7Ci0gICAgICBzdHJlYW1fc2l6ZSA6IEludCkKLSAgICAgIHJldHVybiAgICAgICAgSW50OwotCi0gICBmdW5jdGlvbiBpbmZsYXRlSW5pdDIKLSAgICAgKHN0cm0gICAgICAgIDogaW4gWl9TdHJlYW1wOwotICAgICAgd2luZG93Qml0cyAgOiBpbiBJbnQ7Ci0gICAgICB2ZXJzaW9uICAgICA6IGluIENoYXJzX1B0cjsKLSAgICAgIHN0cmVhbV9zaXplIDogaW4gSW50KQotICAgICAgcmV0dXJuICAgICAgSW50OwotCi0gICBmdW5jdGlvbiBpbmZsYXRlQmFja0luaXQKLSAgICAgKHN0cm0gICAgICAgIDogaW4gWl9TdHJlYW1wOwotICAgICAgd2luZG93Qml0cyAgOiBpbiBJbnQ7Ci0gICAgICB3aW5kb3cgICAgICA6IGluIEJ5dGVfQWNjZXNzOwotICAgICAgdmVyc2lvbiAgICAgOiBpbiBDaGFyc19QdHI7Ci0gICAgICBzdHJlYW1fc2l6ZSA6IGluIEludCkKLSAgICAgIHJldHVybiAgICAgIEludDsKLSAgIC0tICBTaXplIG9mIHdpbmRvdyBoYXZlIHRvIGJlIDIqKndpbmRvd0JpdHMuCi0KLSAgIGZ1bmN0aW9uIEluZmxhdGVfSW5pdCAoc3RybSA6IFpfU3RyZWFtcDsgd2luZG93Qml0cyA6IEludCkgcmV0dXJuIEludDsKLSAgIHByYWdtYSBJbmxpbmUgKEluZmxhdGVfSW5pdCk7Ci0KLSAgIGZ1bmN0aW9uIHpFcnJvciAoZXJyIDogSW50KSByZXR1cm4gQ2hhcnNfUHRyOwotCi0gICBmdW5jdGlvbiBpbmZsYXRlU3luY1BvaW50ICh6IDogWl9TdHJlYW1wKSByZXR1cm4gSW50OwotCi0gICBmdW5jdGlvbiBnZXRfY3JjX3RhYmxlIHJldHVybiBVTG9uZ19BY2Nlc3M7Ci0KLSAgIC0tICBJbnRlcmZhY2UgdG8gdGhlIGF2YWlsYWJsZSBmaWVsZHMgb2YgdGhlIHpfc3RyZWFtIHN0cnVjdHVyZS4KLSAgIC0tICBUaGUgYXBwbGljYXRpb24gbXVzdCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4gd2hlbiBhdmFpbF9pbiBoYXMKLSAgIC0tICBkcm9wcGVkIHRvIHplcm8uIEl0IG11c3QgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgd2hlbiBhdmFpbF9vdXQKLSAgIC0tICBoYXMgZHJvcHBlZCB0byB6ZXJvLiBUaGUgYXBwbGljYXRpb24gbXVzdCBpbml0aWFsaXplIHphbGxvYywgemZyZWUgYW5kCi0gICAtLSAgb3BhcXVlIGJlZm9yZSBjYWxsaW5nIHRoZSBpbml0IGZ1bmN0aW9uLgotCi0gICBwcm9jZWR1cmUgU2V0X0luCi0gICAgIChTdHJtICAgOiBpbiBvdXQgWl9TdHJlYW07Ci0gICAgICBCdWZmZXIgOiBpbiBWb2lkcDsKLSAgICAgIFNpemUgICA6IGluIFVJbnQpOwotICAgcHJhZ21hIElubGluZSAoU2V0X0luKTsKLQotICAgcHJvY2VkdXJlIFNldF9PdXQKLSAgICAgKFN0cm0gICA6IGluIG91dCBaX1N0cmVhbTsKLSAgICAgIEJ1ZmZlciA6IGluIFZvaWRwOwotICAgICAgU2l6ZSAgIDogaW4gVUludCk7Ci0gICBwcmFnbWEgSW5saW5lIChTZXRfT3V0KTsKLQotICAgcHJvY2VkdXJlIFNldF9NZW1fRnVuYwotICAgICAoU3RybSAgIDogaW4gb3V0IFpfU3RyZWFtOwotICAgICAgT3BhcXVlIDogaW4gVm9pZHA7Ci0gICAgICBBbGxvYyAgOiBpbiBhbGxvY19mdW5jOwotICAgICAgRnJlZSAgIDogaW4gZnJlZV9mdW5jKTsKLSAgIHByYWdtYSBJbmxpbmUgKFNldF9NZW1fRnVuYyk7Ci0KLSAgIGZ1bmN0aW9uIExhc3RfRXJyb3JfTWVzc2FnZSAoU3RybSA6IGluIFpfU3RyZWFtKSByZXR1cm4gU3RyaW5nOwotICAgcHJhZ21hIElubGluZSAoTGFzdF9FcnJvcl9NZXNzYWdlKTsKLQotICAgZnVuY3Rpb24gQXZhaWxfT3V0IChTdHJtIDogaW4gWl9TdHJlYW0pIHJldHVybiBVSW50OwotICAgcHJhZ21hIElubGluZSAoQXZhaWxfT3V0KTsKLQotICAgZnVuY3Rpb24gQXZhaWxfSW4gKFN0cm0gOiBpbiBaX1N0cmVhbSkgcmV0dXJuIFVJbnQ7Ci0gICBwcmFnbWEgSW5saW5lIChBdmFpbF9Jbik7Ci0KLSAgIGZ1bmN0aW9uIFRvdGFsX0luIChTdHJtIDogaW4gWl9TdHJlYW0pIHJldHVybiBVTG9uZzsKLSAgIHByYWdtYSBJbmxpbmUgKFRvdGFsX0luKTsKLQotICAgZnVuY3Rpb24gVG90YWxfT3V0IChTdHJtIDogaW4gWl9TdHJlYW0pIHJldHVybiBVTG9uZzsKLSAgIHByYWdtYSBJbmxpbmUgKFRvdGFsX091dCk7Ci0KLSAgIGZ1bmN0aW9uIGluZmxhdGVDb3B5Ci0gICAgIChkZXN0ICAgOiBpbiBaX1N0cmVhbXA7Ci0gICAgICBTb3VyY2UgOiBpbiBaX1N0cmVhbXApCi0gICAgICByZXR1cm4gSW50OwotCi0gICBmdW5jdGlvbiBjb21wcmVzc0JvdW5kIChTb3VyY2VfTGVuIDogaW4gVUxvbmcpIHJldHVybiBVTG9uZzsKLQotICAgZnVuY3Rpb24gZGVmbGF0ZUJvdW5kCi0gICAgIChTdHJtICAgICAgIDogaW4gWl9TdHJlYW1wOwotICAgICAgU291cmNlX0xlbiA6IGluIFVMb25nKQotICAgICAgcmV0dXJuICAgICBVTG9uZzsKLQotICAgZnVuY3Rpb24gZ3p1bmdldGMgKEMgOiBpbiBJbnQ7IEZpbGUgOiBpbiAgZ3pGaWxlKSByZXR1cm4gSW50OwotCi0gICBmdW5jdGlvbiB6bGliQ29tcGlsZUZsYWdzIHJldHVybiBVTG9uZzsKLQotcHJpdmF0ZQotCi0gICB0eXBlIFpfU3RyZWFtIGlzIHJlY29yZCAgICAgICAgICAgIC0tIHpsaWIuaDo2OAotICAgICAgTmV4dF9JbiAgIDogVm9pZHAgICAgICA6PSBOdWw7ICAtLSBuZXh0IGlucHV0IGJ5dGUKLSAgICAgIEF2YWlsX0luICA6IFVJbnQgICAgICAgOj0gMDsgICAgLS0gbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCBuZXh0X2luCi0gICAgICBUb3RhbF9JbiAgOiBVTG9uZyAgICAgIDo9IDA7ICAgIC0tIHRvdGFsIG5iIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyCi0gICAgICBOZXh0X091dCAgOiBWb2lkcCAgICAgIDo9IE51bDsgIC0tIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZQotICAgICAgQXZhaWxfT3V0IDogVUludCAgICAgICA6PSAwOyAgICAtLSByZW1haW5pbmcgZnJlZSBzcGFjZSBhdCBuZXh0X291dAotICAgICAgVG90YWxfT3V0IDogVUxvbmcgICAgICA6PSAwOyAgICAtLSB0b3RhbCBuYiBvZiBieXRlcyBvdXRwdXQgc28gZmFyCi0gICAgICBtc2cgICAgICAgOiBDaGFyc19QdHI7ICAgICAgICAgIC0tIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvcgotICAgICAgc3RhdGUgICAgIDogVm9pZHA7ICAgICAgICAgICAgICAtLSBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMKLSAgICAgIHphbGxvYyAgICA6IGFsbG9jX2Z1bmMgOj0gbnVsbDsgLS0gdXNlZCB0byBhbGxvY2F0ZSB0aGUgaW50ZXJuYWwgc3RhdGUKLSAgICAgIHpmcmVlICAgICA6IGZyZWVfZnVuYyAgOj0gbnVsbDsgLS0gdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCBzdGF0ZQotICAgICAgb3BhcXVlICAgIDogVm9pZHA7ICAgICAgICAgICAgICAtLSBwcml2YXRlIGRhdGEgb2JqZWN0IHBhc3NlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemFsbG9jIGFuZCB6ZnJlZQotICAgICAgZGF0YV90eXBlIDogSW50OyAgICAgICAgICAgICAgICAtLSBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBhc2NpaSBvciBiaW5hcnkKLSAgICAgIGFkbGVyICAgICA6IFVMb25nOyAgICAgICAgICAgICAgLS0gYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBkYXRhCi0gICAgICByZXNlcnZlZCAgOiBVTG9uZzsgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICBlbmQgcmVjb3JkOwotCi0gICBwcmFnbWEgQ29udmVudGlvbiAoQywgWl9TdHJlYW0pOwotCi0gICBwcmFnbWEgSW1wb3J0IChDLCB6bGliVmVyc2lvbiwgInpsaWJWZXJzaW9uIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBEZWZsYXRlLCAiZGVmbGF0ZSIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgRGVmbGF0ZUVuZCwgImRlZmxhdGVFbmQiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIEluZmxhdGUsICJpbmZsYXRlIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBJbmZsYXRlRW5kLCAiaW5mbGF0ZUVuZCIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgZGVmbGF0ZVNldERpY3Rpb25hcnksICJkZWZsYXRlU2V0RGljdGlvbmFyeSIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgZGVmbGF0ZUNvcHksICJkZWZsYXRlQ29weSIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgZGVmbGF0ZVJlc2V0LCAiZGVmbGF0ZVJlc2V0Iik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBkZWZsYXRlUGFyYW1zLCAiZGVmbGF0ZVBhcmFtcyIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZVNldERpY3Rpb25hcnksICJpbmZsYXRlU2V0RGljdGlvbmFyeSIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZVN5bmMsICJpbmZsYXRlU3luYyIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZVJlc2V0LCAiaW5mbGF0ZVJlc2V0Iik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBjb21wcmVzcywgImNvbXByZXNzIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBjb21wcmVzczIsICJjb21wcmVzczIiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIHVuY29tcHJlc3MsICJ1bmNvbXByZXNzIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBnem9wZW4sICJnem9wZW4iKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGd6ZG9wZW4sICJnemRvcGVuIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBnenNldHBhcmFtcywgImd6c2V0cGFyYW1zIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBnenJlYWQsICJnenJlYWQiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGd6d3JpdGUsICJnendyaXRlIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBnenByaW50ZiwgImd6cHJpbnRmIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBnenB1dHMsICJnenB1dHMiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGd6Z2V0cywgImd6Z2V0cyIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgZ3pwdXRjLCAiZ3pwdXRjIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBnemdldGMsICJnemdldGMiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGd6Zmx1c2gsICJnemZsdXNoIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBnenNlZWssICJnenNlZWsiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGd6cmV3aW5kLCAiZ3pyZXdpbmQiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGd6dGVsbCwgImd6dGVsbCIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgZ3plb2YsICJnemVvZiIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgZ3pjbG9zZSwgImd6Y2xvc2UiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGd6ZXJyb3IsICJnemVycm9yIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBhZGxlcjMyLCAiYWRsZXIzMiIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgY3JjMzIsICJjcmMzMiIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgZGVmbGF0ZUluaXQsICJkZWZsYXRlSW5pdF8iKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGluZmxhdGVJbml0LCAiaW5mbGF0ZUluaXRfIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBkZWZsYXRlSW5pdDIsICJkZWZsYXRlSW5pdDJfIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBpbmZsYXRlSW5pdDIsICJpbmZsYXRlSW5pdDJfIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCB6RXJyb3IsICJ6RXJyb3IiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGluZmxhdGVTeW5jUG9pbnQsICJpbmZsYXRlU3luY1BvaW50Iik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBnZXRfY3JjX3RhYmxlLCAiZ2V0X2NyY190YWJsZSIpOwotCi0gICAtLSAgc2luY2UgemxpYiAxLjIuMDoKLQotICAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZUNvcHksICJpbmZsYXRlQ29weSIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgY29tcHJlc3NCb3VuZCwgImNvbXByZXNzQm91bmQiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGRlZmxhdGVCb3VuZCwgImRlZmxhdGVCb3VuZCIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgZ3p1bmdldGMsICJnenVuZ2V0YyIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgemxpYkNvbXBpbGVGbGFncywgInpsaWJDb21waWxlRmxhZ3MiKTsKLQotICAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZUJhY2tJbml0LCAiaW5mbGF0ZUJhY2tJbml0XyIpOwotCi0gICAtLSAgSSBzdG9wcGVkIGJpbmRpbmcgdGhlIGluZmxhdGVCYWNrIHJvdXRpbmVzLCBiZWNvdXNlIHJlYWxpemUgdGhhdAotICAgLS0gIGl0IGRvZXMgbm90IHN1cHBvcnQgemxpYiBhbmQgZ3ppcCBoZWFkZXJzIGZvciBub3csIGFuZCBoYXZlIG5vCi0gICAtLSAgc3ltbWV0cmljIGRlZmxhdGVCYWNrIHJvdXRpbmVzLgotICAgLS0gIFpMaWItQWRhIGlzIHN5bW1ldHJpYyByZWdhcmRpbmcgZGVmbGF0ZS9pbmZsYXRlIGRhdGEgdHJhbnNmb3JtYXRpb24KLSAgIC0tICBhbmQgaGFzIGEgc2ltaWxhciBnZW5lcmljIGNhbGxiYWNrIGludGVyZmFjZSBmb3IgdGhlCi0gICAtLSAgZGVmbGF0ZS9pbmZsYXRlIHRyYW5zZm9ybWF0aW9uIGJhc2VkIG9uIHRoZSByZWd1bGFyIERlZmxhdGUvSW5mbGF0ZQotICAgLS0gIHJvdXRpbmVzLgotCi0gICAtLSAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZUJhY2ssICJpbmZsYXRlQmFjayIpOwotICAgLS0gIHByYWdtYSBJbXBvcnQgKEMsIGluZmxhdGVCYWNrRW5kLCAiaW5mbGF0ZUJhY2tFbmQiKTsKLQotZW5kIFpMaWIuVGhpbjsKZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvYWRhL3psaWIuYWRiIGIvc3JjL3psaWIvY29udHJpYi9hZGEvemxpYi5hZGIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNmZkNjguLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9hZGEvemxpYi5hZGIKKysrIC9kZXYvbnVsbApAQCAtMSw3MDEgKzAsMCBAQAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLS0gIFpMaWIgZm9yIEFkYSB0aGljayBiaW5kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IERtaXRyaXkgQW5pc2lta292ICAgICAgICAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gIE9wZW4gc291cmNlIGxpY2Vuc2UgaW5mb3JtYXRpb24gaXMgaW4gdGhlIHpsaWIuYWRzIGZpbGUuICAtLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLSAgJElkOiB6bGliLmFkYix2IDEuMzEgMjAwNC8wOS8wNiAwNjo1MzoxOSB2YWd1bCBFeHAgJAotCi13aXRoIEFkYS5FeGNlcHRpb25zOwotd2l0aCBBZGEuVW5jaGVja2VkX0NvbnZlcnNpb247Ci13aXRoIEFkYS5VbmNoZWNrZWRfRGVhbGxvY2F0aW9uOwotCi13aXRoIEludGVyZmFjZXMuQy5TdHJpbmdzOwotCi13aXRoIFpMaWIuVGhpbjsKLQotcGFja2FnZSBib2R5IFpMaWIgaXMKLQotICAgdXNlIHR5cGUgVGhpbi5JbnQ7Ci0KLSAgIHR5cGUgWl9TdHJlYW0gaXMgbmV3IFRoaW4uWl9TdHJlYW07Ci0KLSAgIHR5cGUgUmV0dXJuX0NvZGVfRW51bSBpcwotICAgICAgKE9LLAotICAgICAgIFNUUkVBTV9FTkQsCi0gICAgICAgTkVFRF9ESUNULAotICAgICAgIEVSUk5PLAotICAgICAgIFNUUkVBTV9FUlJPUiwKLSAgICAgICBEQVRBX0VSUk9SLAotICAgICAgIE1FTV9FUlJPUiwKLSAgICAgICBCVUZfRVJST1IsCi0gICAgICAgVkVSU0lPTl9FUlJPUik7Ci0KLSAgIHR5cGUgRmxhdGVfU3RlcF9GdW5jdGlvbiBpcyBhY2Nlc3MKLSAgICAgZnVuY3Rpb24gKFN0cm0gOiBpbiBUaGluLlpfU3RyZWFtcDsgRmx1c2ggOiBpbiBUaGluLkludCkgcmV0dXJuIFRoaW4uSW50OwotICAgcHJhZ21hIENvbnZlbnRpb24gKEMsIEZsYXRlX1N0ZXBfRnVuY3Rpb24pOwotCi0gICB0eXBlIEZsYXRlX0VuZF9GdW5jdGlvbiBpcyBhY2Nlc3MKLSAgICAgIGZ1bmN0aW9uIChDdHJtIDogaW4gVGhpbi5aX1N0cmVhbXApIHJldHVybiBUaGluLkludDsKLSAgIHByYWdtYSBDb252ZW50aW9uIChDLCBGbGF0ZV9FbmRfRnVuY3Rpb24pOwotCi0gICB0eXBlIEZsYXRlX1R5cGUgaXMgcmVjb3JkCi0gICAgICBTdGVwIDogRmxhdGVfU3RlcF9GdW5jdGlvbjsKLSAgICAgIERvbmUgOiBGbGF0ZV9FbmRfRnVuY3Rpb247Ci0gICBlbmQgcmVjb3JkOwotCi0gICBzdWJ0eXBlIEZvb3Rlcl9BcnJheSBpcyBTdHJlYW1fRWxlbWVudF9BcnJheSAoMSAuLiA4KTsKLQotICAgU2ltcGxlX0daaXBfSGVhZGVyIDogY29uc3RhbnQgU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gMTApCi0gICAgIDo9ICgxNiMxZiMsIDE2IzhiIywgICAgICAgICAgICAgICAgIC0tICBNYWdpYyBoZWFkZXIKLSAgICAgICAgIDE2IzA4IywgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIFpfREVGTEFURUQKLSAgICAgICAgIDE2IzAwIywgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIEZsYWdzCi0gICAgICAgICAxNiMwMCMsIDE2IzAwIywgMTYjMDAjLCAxNiMwMCMsIC0tICBUaW1lCi0gICAgICAgICAxNiMwMCMsICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBYRmxhZ3MKLSAgICAgICAgIDE2IzAzIyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIE9TIGNvZGUKLSAgICAgICAgKTsKLSAgIC0tICBUaGUgc2ltcGxlc3QgZ3ppcCBoZWFkZXIgaXMgbm90IGZvciBpbmZvcm1hdGlvbmFsLCBidXQganVzdCBmb3IKLSAgIC0tICBnemlwIGZvcm1hdCBjb21wYXRpYmlsaXR5LgotICAgLS0gIE5vdGUgdGhhdCBzb21lIGNvZGUgYmVsb3cgaXMgdXNpbmcgYXNzdW1wdGlvbgotICAgLS0gIFNpbXBsZV9HWmlwX0hlYWRlcidMYXN0ID4gRm9vdGVyX0FycmF5J0xhc3QsIHNvIGRvIG5vdCBtYWtlCi0gICAtLSAgU2ltcGxlX0daaXBfSGVhZGVyJ0xhc3QgPD0gRm9vdGVyX0FycmF5J0xhc3QuCi0KLSAgIFJldHVybl9Db2RlIDogY29uc3RhbnQgYXJyYXkgKFRoaW4uSW50IHJhbmdlIDw+KSBvZiBSZXR1cm5fQ29kZV9FbnVtCi0gICAgIDo9ICgwID0+IE9LLAotICAgICAgICAgMSA9PiBTVFJFQU1fRU5ELAotICAgICAgICAgMiA9PiBORUVEX0RJQ1QsCi0gICAgICAgIC0xID0+IEVSUk5PLAotICAgICAgICAtMiA9PiBTVFJFQU1fRVJST1IsCi0gICAgICAgIC0zID0+IERBVEFfRVJST1IsCi0gICAgICAgIC00ID0+IE1FTV9FUlJPUiwKLSAgICAgICAgLTUgPT4gQlVGX0VSUk9SLAotICAgICAgICAtNiA9PiBWRVJTSU9OX0VSUk9SKTsKLQotICAgRmxhdGUgOiBjb25zdGFudCBhcnJheSAoQm9vbGVhbikgb2YgRmxhdGVfVHlwZQotICAgICA6PSAoVHJ1ZSAgPT4gKFN0ZXAgPT4gVGhpbi5EZWZsYXRlJ0FjY2VzcywKLSAgICAgICAgICAgICAgICAgICBEb25lID0+IFRoaW4uRGVmbGF0ZUVuZCdBY2Nlc3MpLAotICAgICAgICAgRmFsc2UgPT4gKFN0ZXAgPT4gVGhpbi5JbmZsYXRlJ0FjY2VzcywKLSAgICAgICAgICAgICAgICAgICBEb25lID0+IFRoaW4uSW5mbGF0ZUVuZCdBY2Nlc3MpKTsKLQotICAgRmx1c2hfRmluaXNoIDogY29uc3RhbnQgYXJyYXkgKEJvb2xlYW4pIG9mIEZsdXNoX01vZGUKLSAgICAgOj0gKFRydWUgPT4gRmluaXNoLCBGYWxzZSA9PiBOb19GbHVzaCk7Ci0KLSAgIHByb2NlZHVyZSBSYWlzZV9FcnJvciAoU3RyZWFtIDogaW4gWl9TdHJlYW0pOwotICAgcHJhZ21hIElubGluZSAoUmFpc2VfRXJyb3IpOwotCi0gICBwcm9jZWR1cmUgUmFpc2VfRXJyb3IgKE1lc3NhZ2UgOiBpbiBTdHJpbmcpOwotICAgcHJhZ21hIElubGluZSAoUmFpc2VfRXJyb3IpOwotCi0gICBwcm9jZWR1cmUgQ2hlY2tfRXJyb3IgKFN0cmVhbSA6IGluIFpfU3RyZWFtOyBDb2RlIDogaW4gVGhpbi5JbnQpOwotCi0gICBwcm9jZWR1cmUgRnJlZSBpcyBuZXcgQWRhLlVuY2hlY2tlZF9EZWFsbG9jYXRpb24KLSAgICAgIChaX1N0cmVhbSwgWl9TdHJlYW1fQWNjZXNzKTsKLQotICAgZnVuY3Rpb24gVG9fVGhpbl9BY2Nlc3MgaXMgbmV3IEFkYS5VbmNoZWNrZWRfQ29udmVyc2lvbgotICAgICAoWl9TdHJlYW1fQWNjZXNzLCBUaGluLlpfU3RyZWFtcCk7Ci0KLSAgIHByb2NlZHVyZSBUcmFuc2xhdGVfR1ppcAotICAgICAoRmlsdGVyICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOwotICAgICAgSW5fRGF0YSAgIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgSW5fTGFzdCAgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIE91dF9EYXRhICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIE91dF9MYXN0ICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBGbHVzaCAgICAgOiBpbiAgICAgRmx1c2hfTW9kZSk7Ci0gICAtLSAgU2VwYXJhdGUgdHJhbnNsYXRlIHJvdXRpbmUgZm9yIG1ha2UgZ3ppcCBoZWFkZXIuCi0KLSAgIHByb2NlZHVyZSBUcmFuc2xhdGVfQXV0bwotICAgICAoRmlsdGVyICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOwotICAgICAgSW5fRGF0YSAgIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgSW5fTGFzdCAgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIE91dF9EYXRhICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIE91dF9MYXN0ICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBGbHVzaCAgICAgOiBpbiAgICAgRmx1c2hfTW9kZSk7Ci0gICAtLSAgdHJhbnNsYXRlIHJvdXRpbmUgd2l0aG91dCBhZGRpdGlvbmFsIGhlYWRlcnMuCi0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBDaGVja19FcnJvciAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIENoZWNrX0Vycm9yIChTdHJlYW0gOiBpbiBaX1N0cmVhbTsgQ29kZSA6IGluIFRoaW4uSW50KSBpcwotICAgICAgdXNlIHR5cGUgVGhpbi5JbnQ7Ci0gICBiZWdpbgotICAgICAgaWYgQ29kZSAvPSBUaGluLlpfT0sgdGhlbgotICAgICAgICAgUmFpc2VfRXJyb3IKLSAgICAgICAgICAgIChSZXR1cm5fQ29kZV9FbnVtJ0ltYWdlIChSZXR1cm5fQ29kZSAoQ29kZSkpCi0gICAgICAgICAgICAgICYgIjogIiAmIExhc3RfRXJyb3JfTWVzc2FnZSAoU3RyZWFtKSk7Ci0gICAgICBlbmQgaWY7Ci0gICBlbmQgQ2hlY2tfRXJyb3I7Ci0KLSAgIC0tLS0tLS0tLS0tCi0gICAtLSBDbG9zZSAtLQotICAgLS0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIENsb3NlCi0gICAgIChGaWx0ZXIgICAgICAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7Ci0gICAgICBJZ25vcmVfRXJyb3IgOiBpbiAgICAgQm9vbGVhbiA6PSBGYWxzZSkKLSAgIGlzCi0gICAgICBDb2RlIDogVGhpbi5JbnQ7Ci0gICBiZWdpbgotICAgICAgaWYgbm90IElnbm9yZV9FcnJvciBhbmQgdGhlbiBub3QgSXNfT3BlbiAoRmlsdGVyKSB0aGVuCi0gICAgICAgICByYWlzZSBTdGF0dXNfRXJyb3I7Ci0gICAgICBlbmQgaWY7Ci0KLSAgICAgIENvZGUgOj0gRmxhdGUgKEZpbHRlci5Db21wcmVzc2lvbikuRG9uZSAoVG9fVGhpbl9BY2Nlc3MgKEZpbHRlci5TdHJtKSk7Ci0KLSAgICAgIGlmIElnbm9yZV9FcnJvciBvciBlbHNlIENvZGUgPSBUaGluLlpfT0sgdGhlbgotICAgICAgICAgRnJlZSAoRmlsdGVyLlN0cm0pOwotICAgICAgZWxzZQotICAgICAgICAgZGVjbGFyZQotICAgICAgICAgICAgRXJyb3JfTWVzc2FnZSA6IGNvbnN0YW50IFN0cmluZwotICAgICAgICAgICAgICA6PSBMYXN0X0Vycm9yX01lc3NhZ2UgKEZpbHRlci5TdHJtLmFsbCk7Ci0gICAgICAgICBiZWdpbgotICAgICAgICAgICAgRnJlZSAoRmlsdGVyLlN0cm0pOwotICAgICAgICAgICAgQWRhLkV4Y2VwdGlvbnMuUmFpc2VfRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAoWkxpYl9FcnJvcidJZGVudGl0eSwKLSAgICAgICAgICAgICAgICBSZXR1cm5fQ29kZV9FbnVtJ0ltYWdlIChSZXR1cm5fQ29kZSAoQ29kZSkpCi0gICAgICAgICAgICAgICAgICAmICI6ICIgJiBFcnJvcl9NZXNzYWdlKTsKLSAgICAgICAgIGVuZDsKLSAgICAgIGVuZCBpZjsKLSAgIGVuZCBDbG9zZTsKLQotICAgLS0tLS0tLS0tLS0KLSAgIC0tIENSQzMyIC0tCi0gICAtLS0tLS0tLS0tLQotCi0gICBmdW5jdGlvbiBDUkMzMgotICAgICAoQ1JDICA6IGluIFVuc2lnbmVkXzMyOwotICAgICAgRGF0YSA6IGluIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5KQotICAgICAgcmV0dXJuIFVuc2lnbmVkXzMyCi0gICBpcwotICAgICAgdXNlIFRoaW47Ci0gICBiZWdpbgotICAgICAgcmV0dXJuIFVuc2lnbmVkXzMyIChjcmMzMiAoVUxvbmcgKENSQyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhJ0FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhJ0xlbmd0aCkpOwotICAgZW5kIENSQzMyOwotCi0gICBwcm9jZWR1cmUgQ1JDMzIKLSAgICAgKENSQyAgOiBpbiBvdXQgVW5zaWduZWRfMzI7Ci0gICAgICBEYXRhIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5KSBpcwotICAgYmVnaW4KLSAgICAgIENSQyA6PSBDUkMzMiAoQ1JDLCBEYXRhKTsKLSAgIGVuZCBDUkMzMjsKLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBEZWZsYXRlX0luaXQgLS0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgRGVmbGF0ZV9Jbml0Ci0gICAgIChGaWx0ZXIgICAgICAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7Ci0gICAgICBMZXZlbCAgICAgICAgOiBpbiAgICAgQ29tcHJlc3Npb25fTGV2ZWwgIDo9IERlZmF1bHRfQ29tcHJlc3Npb247Ci0gICAgICBTdHJhdGVneSAgICAgOiBpbiAgICAgU3RyYXRlZ3lfVHlwZSAgICAgIDo9IERlZmF1bHRfU3RyYXRlZ3k7Ci0gICAgICBNZXRob2QgICAgICAgOiBpbiAgICAgQ29tcHJlc3Npb25fTWV0aG9kIDo9IERlZmxhdGVkOwotICAgICAgV2luZG93X0JpdHMgIDogaW4gICAgIFdpbmRvd19CaXRzX1R5cGUgICA6PSBEZWZhdWx0X1dpbmRvd19CaXRzOwotICAgICAgTWVtb3J5X0xldmVsIDogaW4gICAgIE1lbW9yeV9MZXZlbF9UeXBlICA6PSBEZWZhdWx0X01lbW9yeV9MZXZlbDsKLSAgICAgIEhlYWRlciAgICAgICA6IGluICAgICBIZWFkZXJfVHlwZSAgICAgICAgOj0gRGVmYXVsdCkKLSAgIGlzCi0gICAgICB1c2UgdHlwZSBUaGluLkludDsKLSAgICAgIFdpbl9CaXRzIDogVGhpbi5JbnQgOj0gVGhpbi5JbnQgKFdpbmRvd19CaXRzKTsKLSAgIGJlZ2luCi0gICAgICBpZiBJc19PcGVuIChGaWx0ZXIpIHRoZW4KLSAgICAgICAgIHJhaXNlIFN0YXR1c19FcnJvcjsKLSAgICAgIGVuZCBpZjsKLQotICAgICAgLS0gIFdlIGFsbG93IFpMaWIgdG8gbWFrZSBoZWFkZXIgb25seSBpbiBjYXNlIG9mIGRlZmF1bHQgaGVhZGVyIHR5cGUuCi0gICAgICAtLSAgT3RoZXJ3aXNlIHdlIHdvdWxkIGVpdGhlciBkbyBoZWFkZXIgYnkgb3Vyc2VsZnMsIG9yIGRvIG5vdCBkbwotICAgICAgLS0gIGhlYWRlciBhdCBhbGwuCi0KLSAgICAgIGlmIEhlYWRlciA9IE5vbmUgb3IgZWxzZSBIZWFkZXIgPSBHWmlwIHRoZW4KLSAgICAgICAgIFdpbl9CaXRzIDo9IC1XaW5fQml0czsKLSAgICAgIGVuZCBpZjsKLQotICAgICAgLS0gIEZvciB0aGUgR1ppcCBDUkMgY2FsY3VsYXRpb24gYW5kIG1ha2UgaGVhZGVycy4KLQotICAgICAgaWYgSGVhZGVyID0gR1ppcCB0aGVuCi0gICAgICAgICBGaWx0ZXIuQ1JDICAgIDo9IDA7Ci0gICAgICAgICBGaWx0ZXIuT2Zmc2V0IDo9IFNpbXBsZV9HWmlwX0hlYWRlcidGaXJzdDsKLSAgICAgIGVsc2UKLSAgICAgICAgIEZpbHRlci5PZmZzZXQgOj0gU2ltcGxlX0daaXBfSGVhZGVyJ0xhc3QgKyAxOwotICAgICAgZW5kIGlmOwotCi0gICAgICBGaWx0ZXIuU3RybSAgICAgICAgOj0gbmV3IFpfU3RyZWFtOwotICAgICAgRmlsdGVyLkNvbXByZXNzaW9uIDo9IFRydWU7Ci0gICAgICBGaWx0ZXIuU3RyZWFtX0VuZCAgOj0gRmFsc2U7Ci0gICAgICBGaWx0ZXIuSGVhZGVyICAgICAgOj0gSGVhZGVyOwotCi0gICAgICBpZiBUaGluLkRlZmxhdGVfSW5pdAotICAgICAgICAgICAoVG9fVGhpbl9BY2Nlc3MgKEZpbHRlci5TdHJtKSwKLSAgICAgICAgICAgIExldmVsICAgICAgPT4gVGhpbi5JbnQgKExldmVsKSwKLSAgICAgICAgICAgIG1ldGhvZCAgICAgPT4gVGhpbi5JbnQgKE1ldGhvZCksCi0gICAgICAgICAgICB3aW5kb3dCaXRzID0+IFdpbl9CaXRzLAotICAgICAgICAgICAgbWVtTGV2ZWwgICA9PiBUaGluLkludCAoTWVtb3J5X0xldmVsKSwKLSAgICAgICAgICAgIHN0cmF0ZWd5ICAgPT4gVGhpbi5JbnQgKFN0cmF0ZWd5KSkgLz0gVGhpbi5aX09LCi0gICAgICB0aGVuCi0gICAgICAgICBSYWlzZV9FcnJvciAoRmlsdGVyLlN0cm0uYWxsKTsKLSAgICAgIGVuZCBpZjsKLSAgIGVuZCBEZWZsYXRlX0luaXQ7Ci0KLSAgIC0tLS0tLS0tLS0tCi0gICAtLSBGbHVzaCAtLQotICAgLS0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIEZsdXNoCi0gICAgIChGaWx0ZXIgICAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7Ci0gICAgICBPdXRfRGF0YSAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICBPdXRfTGFzdCAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgRmx1c2ggICAgIDogaW4gICAgIEZsdXNoX01vZGUpCi0gICBpcwotICAgICAgTm9fRGF0YSA6IFN0cmVhbV9FbGVtZW50X0FycmF5IDo9ICgxIC4uIDAgPT4gMCk7Ci0gICAgICBMYXN0ICAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgYmVnaW4KLSAgICAgIFRyYW5zbGF0ZSAoRmlsdGVyLCBOb19EYXRhLCBMYXN0LCBPdXRfRGF0YSwgT3V0X0xhc3QsIEZsdXNoKTsKLSAgIGVuZCBGbHVzaDsKLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tIEdlbmVyaWNfVHJhbnNsYXRlIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgR2VuZXJpY19UcmFuc2xhdGUKLSAgICAgKEZpbHRlciAgICAgICAgICA6IGluIG91dCBaTGliLkZpbHRlcl9UeXBlOwotICAgICAgSW5fQnVmZmVyX1NpemUgIDogaW4gICAgIEludGVnZXIgOj0gRGVmYXVsdF9CdWZmZXJfU2l6ZTsKLSAgICAgIE91dF9CdWZmZXJfU2l6ZSA6IGluICAgICBJbnRlZ2VyIDo9IERlZmF1bHRfQnVmZmVyX1NpemUpCi0gICBpcwotICAgICAgSW5fQnVmZmVyICA6IFN0cmVhbV9FbGVtZW50X0FycmF5Ci0gICAgICAgICAgICAgICAgICAgICAoMSAuLiBTdHJlYW1fRWxlbWVudF9PZmZzZXQgKEluX0J1ZmZlcl9TaXplKSk7Ci0gICAgICBPdXRfQnVmZmVyIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkKLSAgICAgICAgICAgICAgICAgICAgICgxIC4uIFN0cmVhbV9FbGVtZW50X09mZnNldCAoT3V0X0J1ZmZlcl9TaXplKSk7Ci0gICAgICBMYXN0ICAgICAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgSW5fTGFzdCAgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIEluX0ZpcnN0ICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBPdXRfTGFzdCAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgYmVnaW4KLSAgICAgIE1haW4gOiBsb29wCi0gICAgICAgICBEYXRhX0luIChJbl9CdWZmZXIsIExhc3QpOwotCi0gICAgICAgICBJbl9GaXJzdCA6PSBJbl9CdWZmZXInRmlyc3Q7Ci0KLSAgICAgICAgIGxvb3AKLSAgICAgICAgICAgIFRyYW5zbGF0ZQotICAgICAgICAgICAgICAoRmlsdGVyICAgPT4gRmlsdGVyLAotICAgICAgICAgICAgICAgSW5fRGF0YSAgPT4gSW5fQnVmZmVyIChJbl9GaXJzdCAuLiBMYXN0KSwKLSAgICAgICAgICAgICAgIEluX0xhc3QgID0+IEluX0xhc3QsCi0gICAgICAgICAgICAgICBPdXRfRGF0YSA9PiBPdXRfQnVmZmVyLAotICAgICAgICAgICAgICAgT3V0X0xhc3QgPT4gT3V0X0xhc3QsCi0gICAgICAgICAgICAgICBGbHVzaCAgICA9PiBGbHVzaF9GaW5pc2ggKExhc3QgPCBJbl9CdWZmZXInRmlyc3QpKTsKLQotICAgICAgICAgICAgaWYgT3V0X0J1ZmZlcidGaXJzdCA8PSBPdXRfTGFzdCB0aGVuCi0gICAgICAgICAgICAgICBEYXRhX091dCAoT3V0X0J1ZmZlciAoT3V0X0J1ZmZlcidGaXJzdCAuLiBPdXRfTGFzdCkpOwotICAgICAgICAgICAgZW5kIGlmOwotCi0gICAgICAgICAgICBleGl0IE1haW4gd2hlbiBTdHJlYW1fRW5kIChGaWx0ZXIpOwotCi0gICAgICAgICAgICAtLSAgVGhlIGVuZCBvZiBpbiBidWZmZXIuCi0KLSAgICAgICAgICAgIGV4aXQgd2hlbiBJbl9MYXN0ID0gTGFzdDsKLQotICAgICAgICAgICAgSW5fRmlyc3QgOj0gSW5fTGFzdCArIDE7Ci0gICAgICAgICBlbmQgbG9vcDsKLSAgICAgIGVuZCBsb29wIE1haW47Ci0KLSAgIGVuZCBHZW5lcmljX1RyYW5zbGF0ZTsKLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBJbmZsYXRlX0luaXQgLS0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgSW5mbGF0ZV9Jbml0Ci0gICAgIChGaWx0ZXIgICAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKLSAgICAgIFdpbmRvd19CaXRzIDogaW4gICAgIFdpbmRvd19CaXRzX1R5cGUgOj0gRGVmYXVsdF9XaW5kb3dfQml0czsKLSAgICAgIEhlYWRlciAgICAgIDogaW4gICAgIEhlYWRlcl9UeXBlICAgICAgOj0gRGVmYXVsdCkKLSAgIGlzCi0gICAgICB1c2UgdHlwZSBUaGluLkludDsKLSAgICAgIFdpbl9CaXRzIDogVGhpbi5JbnQgOj0gVGhpbi5JbnQgKFdpbmRvd19CaXRzKTsKLQotICAgICAgcHJvY2VkdXJlIENoZWNrX1ZlcnNpb247Ci0gICAgICAtLSAgQ2hlY2sgdGhlIGxhdGVzdCBoZWFkZXIgdHlwZXMgY29tcGF0aWJpbGl0eS4KLQotICAgICAgcHJvY2VkdXJlIENoZWNrX1ZlcnNpb24gaXMKLSAgICAgIGJlZ2luCi0gICAgICAgICBpZiBWZXJzaW9uIDw9ICIxLjEuNCIgdGhlbgotICAgICAgICAgICAgUmFpc2VfRXJyb3IKLSAgICAgICAgICAgICAgKCJJbmZsYXRlIGhlYWRlciB0eXBlICIgJiBIZWFkZXJfVHlwZSdJbWFnZSAoSGVhZGVyKQotICAgICAgICAgICAgICAgJiAiIGluY29tcGF0aWJsZSB3aXRoIFpMaWIgdmVyc2lvbiAiICYgVmVyc2lvbik7Ci0gICAgICAgICBlbmQgaWY7Ci0gICAgICBlbmQgQ2hlY2tfVmVyc2lvbjsKLQotICAgYmVnaW4KLSAgICAgIGlmIElzX09wZW4gKEZpbHRlcikgdGhlbgotICAgICAgICAgcmFpc2UgU3RhdHVzX0Vycm9yOwotICAgICAgZW5kIGlmOwotCi0gICAgICBjYXNlIEhlYWRlciBpcwotICAgICAgICAgd2hlbiBOb25lID0+Ci0gICAgICAgICAgICBDaGVja19WZXJzaW9uOwotCi0gICAgICAgICAgICAtLSAgSW5mbGF0ZSBkYXRhIHdpdGhvdXQgaGVhZGVycyBkZXRlcm1pbmVkCi0gICAgICAgICAgICAtLSAgYnkgbmVnYXRpdmUgV2luX0JpdHMuCi0KLSAgICAgICAgICAgIFdpbl9CaXRzIDo9IC1XaW5fQml0czsKLSAgICAgICAgIHdoZW4gR1ppcCA9PgotICAgICAgICAgICAgQ2hlY2tfVmVyc2lvbjsKLQotICAgICAgICAgICAgLS0gIEluZmxhdGUgZ3ppcCBkYXRhIGRlZmluZWQgYnkgZmxhZyAxNi4KLQotICAgICAgICAgICAgV2luX0JpdHMgOj0gV2luX0JpdHMgKyAxNjsKLSAgICAgICAgIHdoZW4gQXV0byA9PgotICAgICAgICAgICAgQ2hlY2tfVmVyc2lvbjsKLQotICAgICAgICAgICAgLS0gIEluZmxhdGUgd2l0aCBhdXRvbWF0aWMgZGV0ZWN0aW9uCi0gICAgICAgICAgICAtLSAgb2YgZ3ppcCBvciBuYXRpdmUgaGVhZGVyIGRlZmluZWQgYnkgZmxhZyAzMi4KLQotICAgICAgICAgICAgV2luX0JpdHMgOj0gV2luX0JpdHMgKyAzMjsKLSAgICAgICAgIHdoZW4gRGVmYXVsdCA9PiBudWxsOwotICAgICAgZW5kIGNhc2U7Ci0KLSAgICAgIEZpbHRlci5TdHJtICAgICAgICA6PSBuZXcgWl9TdHJlYW07Ci0gICAgICBGaWx0ZXIuQ29tcHJlc3Npb24gOj0gRmFsc2U7Ci0gICAgICBGaWx0ZXIuU3RyZWFtX0VuZCAgOj0gRmFsc2U7Ci0gICAgICBGaWx0ZXIuSGVhZGVyICAgICAgOj0gSGVhZGVyOwotCi0gICAgICBpZiBUaGluLkluZmxhdGVfSW5pdAotICAgICAgICAgKFRvX1RoaW5fQWNjZXNzIChGaWx0ZXIuU3RybSksIFdpbl9CaXRzKSAvPSBUaGluLlpfT0sKLSAgICAgIHRoZW4KLSAgICAgICAgIFJhaXNlX0Vycm9yIChGaWx0ZXIuU3RybS5hbGwpOwotICAgICAgZW5kIGlmOwotICAgZW5kIEluZmxhdGVfSW5pdDsKLQotICAgLS0tLS0tLS0tLS0tLQotICAgLS0gSXNfT3BlbiAtLQotICAgLS0tLS0tLS0tLS0tLQotCi0gICBmdW5jdGlvbiBJc19PcGVuIChGaWx0ZXIgOiBpbiBGaWx0ZXJfVHlwZSkgcmV0dXJuIEJvb2xlYW4gaXMKLSAgIGJlZ2luCi0gICAgICByZXR1cm4gRmlsdGVyLlN0cm0gLz0gbnVsbDsKLSAgIGVuZCBJc19PcGVuOwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLQotICAgLS0gUmFpc2VfRXJyb3IgLS0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBSYWlzZV9FcnJvciAoTWVzc2FnZSA6IGluIFN0cmluZykgaXMKLSAgIGJlZ2luCi0gICAgICBBZGEuRXhjZXB0aW9ucy5SYWlzZV9FeGNlcHRpb24gKFpMaWJfRXJyb3InSWRlbnRpdHksIE1lc3NhZ2UpOwotICAgZW5kIFJhaXNlX0Vycm9yOwotCi0gICBwcm9jZWR1cmUgUmFpc2VfRXJyb3IgKFN0cmVhbSA6IGluIFpfU3RyZWFtKSBpcwotICAgYmVnaW4KLSAgICAgIFJhaXNlX0Vycm9yIChMYXN0X0Vycm9yX01lc3NhZ2UgKFN0cmVhbSkpOwotICAgZW5kIFJhaXNlX0Vycm9yOwotCi0gICAtLS0tLS0tLS0tCi0gICAtLSBSZWFkIC0tCi0gICAtLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBSZWFkCi0gICAgIChGaWx0ZXIgOiBpbiBvdXQgRmlsdGVyX1R5cGU7Ci0gICAgICBJdGVtICAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICBMYXN0ICAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgRmx1c2ggIDogaW4gICAgIEZsdXNoX01vZGUgOj0gTm9fRmx1c2gpCi0gICBpcwotICAgICAgSW5fTGFzdCAgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIEl0ZW1fRmlyc3QgOiBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQgOj0gSXRlbSdGaXJzdDsKLSAgICAgIFZfRmx1c2ggICAgOiBGbHVzaF9Nb2RlIDo9IEZsdXNoOwotCi0gICBiZWdpbgotICAgICAgcHJhZ21hIEFzc2VydCAoUmVzdF9GaXJzdCBpbiBCdWZmZXInRmlyc3QgLi4gQnVmZmVyJ0xhc3QgKyAxKTsKLSAgICAgIHByYWdtYSBBc3NlcnQgKFJlc3RfTGFzdCBpbiBCdWZmZXInRmlyc3QgLSAxIC4uIEJ1ZmZlcidMYXN0KTsKLQotICAgICAgbG9vcAotICAgICAgICAgaWYgUmVzdF9MYXN0ID0gQnVmZmVyJ0ZpcnN0IC0gMSB0aGVuCi0gICAgICAgICAgICBWX0ZsdXNoIDo9IEZpbmlzaDsKLQotICAgICAgICAgZWxzaWYgUmVzdF9GaXJzdCA+IFJlc3RfTGFzdCB0aGVuCi0gICAgICAgICAgICBSZWFkIChCdWZmZXIsIFJlc3RfTGFzdCk7Ci0gICAgICAgICAgICBSZXN0X0ZpcnN0IDo9IEJ1ZmZlcidGaXJzdDsKLQotICAgICAgICAgICAgaWYgUmVzdF9MYXN0IDwgQnVmZmVyJ0ZpcnN0IHRoZW4KLSAgICAgICAgICAgICAgIFZfRmx1c2ggOj0gRmluaXNoOwotICAgICAgICAgICAgZW5kIGlmOwotICAgICAgICAgZW5kIGlmOwotCi0gICAgICAgICBUcmFuc2xhdGUKLSAgICAgICAgICAgKEZpbHRlciAgID0+IEZpbHRlciwKLSAgICAgICAgICAgIEluX0RhdGEgID0+IEJ1ZmZlciAoUmVzdF9GaXJzdCAuLiBSZXN0X0xhc3QpLAotICAgICAgICAgICAgSW5fTGFzdCAgPT4gSW5fTGFzdCwKLSAgICAgICAgICAgIE91dF9EYXRhID0+IEl0ZW0gKEl0ZW1fRmlyc3QgLi4gSXRlbSdMYXN0KSwKLSAgICAgICAgICAgIE91dF9MYXN0ID0+IExhc3QsCi0gICAgICAgICAgICBGbHVzaCAgICA9PiBWX0ZsdXNoKTsKLQotICAgICAgICAgUmVzdF9GaXJzdCA6PSBJbl9MYXN0ICsgMTsKLQotICAgICAgICAgZXhpdCB3aGVuIFN0cmVhbV9FbmQgKEZpbHRlcikKLSAgICAgICAgICAgb3IgZWxzZSBMYXN0ID0gSXRlbSdMYXN0Ci0gICAgICAgICAgIG9yIGVsc2UgKExhc3QgPj0gSXRlbSdGaXJzdCBhbmQgdGhlbiBBbGxvd19SZWFkX1NvbWUpOwotCi0gICAgICAgICBJdGVtX0ZpcnN0IDo9IExhc3QgKyAxOwotICAgICAgZW5kIGxvb3A7Ci0gICBlbmQgUmVhZDsKLQotICAgLS0tLS0tLS0tLS0tLS0tLQotICAgLS0gU3RyZWFtX0VuZCAtLQotICAgLS0tLS0tLS0tLS0tLS0tLQotCi0gICBmdW5jdGlvbiBTdHJlYW1fRW5kIChGaWx0ZXIgOiBpbiBGaWx0ZXJfVHlwZSkgcmV0dXJuIEJvb2xlYW4gaXMKLSAgIGJlZ2luCi0gICAgICBpZiBGaWx0ZXIuSGVhZGVyID0gR1ppcCBhbmQgRmlsdGVyLkNvbXByZXNzaW9uIHRoZW4KLSAgICAgICAgIHJldHVybiBGaWx0ZXIuU3RyZWFtX0VuZAotICAgICAgICAgICAgYW5kIHRoZW4gRmlsdGVyLk9mZnNldCA9IEZvb3Rlcl9BcnJheSdMYXN0ICsgMTsKLSAgICAgIGVsc2UKLSAgICAgICAgIHJldHVybiBGaWx0ZXIuU3RyZWFtX0VuZDsKLSAgICAgIGVuZCBpZjsKLSAgIGVuZCBTdHJlYW1fRW5kOwotCi0gICAtLS0tLS0tLS0tLS0tLQotICAgLS0gVG90YWxfSW4gLS0KLSAgIC0tLS0tLS0tLS0tLS0tCi0KLSAgIGZ1bmN0aW9uIFRvdGFsX0luIChGaWx0ZXIgOiBpbiBGaWx0ZXJfVHlwZSkgcmV0dXJuIENvdW50IGlzCi0gICBiZWdpbgotICAgICAgcmV0dXJuIENvdW50IChUaGluLlRvdGFsX0luIChUb19UaGluX0FjY2VzcyAoRmlsdGVyLlN0cm0pLmFsbCkpOwotICAgZW5kIFRvdGFsX0luOwotCi0gICAtLS0tLS0tLS0tLS0tLS0KLSAgIC0tIFRvdGFsX091dCAtLQotICAgLS0tLS0tLS0tLS0tLS0tCi0KLSAgIGZ1bmN0aW9uIFRvdGFsX091dCAoRmlsdGVyIDogaW4gRmlsdGVyX1R5cGUpIHJldHVybiBDb3VudCBpcwotICAgYmVnaW4KLSAgICAgIHJldHVybiBDb3VudCAoVGhpbi5Ub3RhbF9PdXQgKFRvX1RoaW5fQWNjZXNzIChGaWx0ZXIuU3RybSkuYWxsKSk7Ci0gICBlbmQgVG90YWxfT3V0OwotCi0gICAtLS0tLS0tLS0tLS0tLS0KLSAgIC0tIFRyYW5zbGF0ZSAtLQotICAgLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBUcmFuc2xhdGUKLSAgICAgKEZpbHRlciAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKLSAgICAgIEluX0RhdGEgICA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIEluX0xhc3QgICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBPdXRfRGF0YSAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICBPdXRfTGFzdCAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgRmx1c2ggICAgIDogaW4gICAgIEZsdXNoX01vZGUpIGlzCi0gICBiZWdpbgotICAgICAgaWYgRmlsdGVyLkhlYWRlciA9IEdaaXAgYW5kIHRoZW4gRmlsdGVyLkNvbXByZXNzaW9uIHRoZW4KLSAgICAgICAgIFRyYW5zbGF0ZV9HWmlwCi0gICAgICAgICAgIChGaWx0ZXIgICA9PiBGaWx0ZXIsCi0gICAgICAgICAgICBJbl9EYXRhICA9PiBJbl9EYXRhLAotICAgICAgICAgICAgSW5fTGFzdCAgPT4gSW5fTGFzdCwKLSAgICAgICAgICAgIE91dF9EYXRhID0+IE91dF9EYXRhLAotICAgICAgICAgICAgT3V0X0xhc3QgPT4gT3V0X0xhc3QsCi0gICAgICAgICAgICBGbHVzaCAgICA9PiBGbHVzaCk7Ci0gICAgICBlbHNlCi0gICAgICAgICBUcmFuc2xhdGVfQXV0bwotICAgICAgICAgICAoRmlsdGVyICAgPT4gRmlsdGVyLAotICAgICAgICAgICAgSW5fRGF0YSAgPT4gSW5fRGF0YSwKLSAgICAgICAgICAgIEluX0xhc3QgID0+IEluX0xhc3QsCi0gICAgICAgICAgICBPdXRfRGF0YSA9PiBPdXRfRGF0YSwKLSAgICAgICAgICAgIE91dF9MYXN0ID0+IE91dF9MYXN0LAotICAgICAgICAgICAgRmx1c2ggICAgPT4gRmx1c2gpOwotICAgICAgZW5kIGlmOwotICAgZW5kIFRyYW5zbGF0ZTsKLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tIFRyYW5zbGF0ZV9BdXRvIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgVHJhbnNsYXRlX0F1dG8KLSAgICAgKEZpbHRlciAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKLSAgICAgIEluX0RhdGEgICA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIEluX0xhc3QgICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBPdXRfRGF0YSAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICBPdXRfTGFzdCAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgRmx1c2ggICAgIDogaW4gICAgIEZsdXNoX01vZGUpCi0gICBpcwotICAgICAgdXNlIHR5cGUgVGhpbi5JbnQ7Ci0gICAgICBDb2RlIDogVGhpbi5JbnQ7Ci0KLSAgIGJlZ2luCi0gICAgICBpZiBub3QgSXNfT3BlbiAoRmlsdGVyKSB0aGVuCi0gICAgICAgICByYWlzZSBTdGF0dXNfRXJyb3I7Ci0gICAgICBlbmQgaWY7Ci0KLSAgICAgIGlmIE91dF9EYXRhJ0xlbmd0aCA9IDAgYW5kIHRoZW4gSW5fRGF0YSdMZW5ndGggPSAwIHRoZW4KLSAgICAgICAgIHJhaXNlIENvbnN0cmFpbnRfRXJyb3I7Ci0gICAgICBlbmQgaWY7Ci0KLSAgICAgIFNldF9PdXQgKEZpbHRlci5TdHJtLmFsbCwgT3V0X0RhdGEnQWRkcmVzcywgT3V0X0RhdGEnTGVuZ3RoKTsKLSAgICAgIFNldF9JbiAgKEZpbHRlci5TdHJtLmFsbCwgSW5fRGF0YSdBZGRyZXNzLCBJbl9EYXRhJ0xlbmd0aCk7Ci0KLSAgICAgIENvZGUgOj0gRmxhdGUgKEZpbHRlci5Db21wcmVzc2lvbikuU3RlcAotICAgICAgICAoVG9fVGhpbl9BY2Nlc3MgKEZpbHRlci5TdHJtKSwKLSAgICAgICAgIFRoaW4uSW50IChGbHVzaCkpOwotCi0gICAgICBpZiBDb2RlID0gVGhpbi5aX1NUUkVBTV9FTkQgdGhlbgotICAgICAgICAgRmlsdGVyLlN0cmVhbV9FbmQgOj0gVHJ1ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgIENoZWNrX0Vycm9yIChGaWx0ZXIuU3RybS5hbGwsIENvZGUpOwotICAgICAgZW5kIGlmOwotCi0gICAgICBJbl9MYXN0ICA6PSBJbl9EYXRhJ0xhc3QKLSAgICAgICAgIC0gU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IChBdmFpbF9JbiAoRmlsdGVyLlN0cm0uYWxsKSk7Ci0gICAgICBPdXRfTGFzdCA6PSBPdXRfRGF0YSdMYXN0Ci0gICAgICAgICAtIFN0cmVhbV9FbGVtZW50X09mZnNldCAoQXZhaWxfT3V0IChGaWx0ZXIuU3RybS5hbGwpKTsKLSAgIGVuZCBUcmFuc2xhdGVfQXV0bzsKLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tIFRyYW5zbGF0ZV9HWmlwIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgVHJhbnNsYXRlX0daaXAKLSAgICAgKEZpbHRlciAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKLSAgICAgIEluX0RhdGEgICA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIEluX0xhc3QgICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBPdXRfRGF0YSAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICBPdXRfTGFzdCAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgRmx1c2ggICAgIDogaW4gICAgIEZsdXNoX01vZGUpCi0gICBpcwotICAgICAgT3V0X0ZpcnN0IDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotCi0gICAgICBwcm9jZWR1cmUgQWRkX0RhdGEgKERhdGEgOiBpbiBTdHJlYW1fRWxlbWVudF9BcnJheSk7Ci0gICAgICAtLSAgQWRkIGRhdGEgdG8gc3RyZWFtIGZyb20gdGhlIEZpbHRlci5PZmZzZXQgdGlsbCBuZWNlc3NhcnksCi0gICAgICAtLSAgdXNlZCBmb3IgYWRkIGd6aXAgaGVhZHIvZm9vdGVyLgotCi0gICAgICBwcm9jZWR1cmUgUHV0XzMyCi0gICAgICAgIChJdGVtIDogaW4gb3V0IFN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgICAgRGF0YSA6IGluICAgICBVbnNpZ25lZF8zMik7Ci0gICAgICBwcmFnbWEgSW5saW5lIChQdXRfMzIpOwotCi0gICAgICAtLS0tLS0tLS0tLS0tLQotICAgICAgLS0gQWRkX0RhdGEgLS0KLSAgICAgIC0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIHByb2NlZHVyZSBBZGRfRGF0YSAoRGF0YSA6IGluIFN0cmVhbV9FbGVtZW50X0FycmF5KSBpcwotICAgICAgICAgRGF0YV9GaXJzdCA6IFN0cmVhbV9FbGVtZW50X09mZnNldCByZW5hbWVzIEZpbHRlci5PZmZzZXQ7Ci0gICAgICAgICBEYXRhX0xhc3QgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgICAgRGF0YV9MZW4gICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsgLS0gIC0xCi0gICAgICAgICBPdXRfTGVuICAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OyAtLSAgLTEKLSAgICAgIGJlZ2luCi0gICAgICAgICBPdXRfRmlyc3QgOj0gT3V0X0xhc3QgKyAxOwotCi0gICAgICAgICBpZiBEYXRhX0ZpcnN0ID4gRGF0YSdMYXN0IHRoZW4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgIGVuZCBpZjsKLQotICAgICAgICAgRGF0YV9MZW4gIDo9IERhdGEnTGFzdCAgICAgLSBEYXRhX0ZpcnN0OwotICAgICAgICAgT3V0X0xlbiAgIDo9IE91dF9EYXRhJ0xhc3QgLSBPdXRfRmlyc3Q7Ci0KLSAgICAgICAgIGlmIERhdGFfTGVuIDw9IE91dF9MZW4gdGhlbgotICAgICAgICAgICAgT3V0X0xhc3QgIDo9IE91dF9GaXJzdCAgKyBEYXRhX0xlbjsKLSAgICAgICAgICAgIERhdGFfTGFzdCA6PSBEYXRhJ0xhc3Q7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBPdXRfTGFzdCAgOj0gT3V0X0RhdGEnTGFzdDsKLSAgICAgICAgICAgIERhdGFfTGFzdCA6PSBEYXRhX0ZpcnN0ICsgT3V0X0xlbjsKLSAgICAgICAgIGVuZCBpZjsKLQotICAgICAgICAgT3V0X0RhdGEgKE91dF9GaXJzdCAuLiBPdXRfTGFzdCkgOj0gRGF0YSAoRGF0YV9GaXJzdCAuLiBEYXRhX0xhc3QpOwotCi0gICAgICAgICBEYXRhX0ZpcnN0IDo9IERhdGFfTGFzdCArIDE7Ci0gICAgICAgICBPdXRfRmlyc3QgIDo9IE91dF9MYXN0ICsgMTsKLSAgICAgIGVuZCBBZGRfRGF0YTsKLQotICAgICAgLS0tLS0tLS0tLS0tCi0gICAgICAtLSBQdXRfMzIgLS0KLSAgICAgIC0tLS0tLS0tLS0tLQotCi0gICAgICBwcm9jZWR1cmUgUHV0XzMyCi0gICAgICAgIChJdGVtIDogaW4gb3V0IFN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgICAgRGF0YSA6IGluICAgICBVbnNpZ25lZF8zMikKLSAgICAgIGlzCi0gICAgICAgICBEIDogVW5zaWduZWRfMzIgOj0gRGF0YTsKLSAgICAgIGJlZ2luCi0gICAgICAgICBmb3IgSiBpbiBJdGVtJ0ZpcnN0IC4uIEl0ZW0nRmlyc3QgKyAzIGxvb3AKLSAgICAgICAgICAgIEl0ZW0gKEopIDo9IFN0cmVhbV9FbGVtZW50IChEIGFuZCAxNiNGRiMpOwotICAgICAgICAgICAgRCA6PSBTaGlmdF9SaWdodCAoRCwgOCk7Ci0gICAgICAgICBlbmQgbG9vcDsKLSAgICAgIGVuZCBQdXRfMzI7Ci0KLSAgIGJlZ2luCi0gICAgICBPdXRfTGFzdCA6PSBPdXRfRGF0YSdGaXJzdCAtIDE7Ci0KLSAgICAgIGlmIG5vdCBGaWx0ZXIuU3RyZWFtX0VuZCB0aGVuCi0gICAgICAgICBBZGRfRGF0YSAoU2ltcGxlX0daaXBfSGVhZGVyKTsKLQotICAgICAgICAgVHJhbnNsYXRlX0F1dG8KLSAgICAgICAgICAgKEZpbHRlciAgID0+IEZpbHRlciwKLSAgICAgICAgICAgIEluX0RhdGEgID0+IEluX0RhdGEsCi0gICAgICAgICAgICBJbl9MYXN0ICA9PiBJbl9MYXN0LAotICAgICAgICAgICAgT3V0X0RhdGEgPT4gT3V0X0RhdGEgKE91dF9GaXJzdCAuLiBPdXRfRGF0YSdMYXN0KSwKLSAgICAgICAgICAgIE91dF9MYXN0ID0+IE91dF9MYXN0LAotICAgICAgICAgICAgRmx1c2ggICAgPT4gRmx1c2gpOwotCi0gICAgICAgICBDUkMzMiAoRmlsdGVyLkNSQywgSW5fRGF0YSAoSW5fRGF0YSdGaXJzdCAuLiBJbl9MYXN0KSk7Ci0gICAgICBlbmQgaWY7Ci0KLSAgICAgIGlmIEZpbHRlci5TdHJlYW1fRW5kIGFuZCB0aGVuIE91dF9MYXN0IDw9IE91dF9EYXRhJ0xhc3QgdGhlbgotICAgICAgICAgLS0gIFRoaXMgZGV0ZWN0aW9uIG1ldGhvZCB3b3VsZCB3b3JrIG9ubHkgd2hlbgotICAgICAgICAgLS0gIFNpbXBsZV9HWmlwX0hlYWRlcidMYXN0ID4gRm9vdGVyX0FycmF5J0xhc3QKLQotICAgICAgICAgaWYgRmlsdGVyLk9mZnNldCA9IFNpbXBsZV9HWmlwX0hlYWRlcidMYXN0ICsgMSB0aGVuCi0gICAgICAgICAgICBGaWx0ZXIuT2Zmc2V0IDo9IEZvb3Rlcl9BcnJheSdGaXJzdDsKLSAgICAgICAgIGVuZCBpZjsKLQotICAgICAgICAgZGVjbGFyZQotICAgICAgICAgICAgRm9vdGVyIDogRm9vdGVyX0FycmF5OwotICAgICAgICAgYmVnaW4KLSAgICAgICAgICAgIFB1dF8zMiAoRm9vdGVyLCBGaWx0ZXIuQ1JDKTsKLSAgICAgICAgICAgIFB1dF8zMiAoRm9vdGVyIChGb290ZXInRmlyc3QgKyA0IC4uIEZvb3RlcidMYXN0KSwKLSAgICAgICAgICAgICAgICAgICAgVW5zaWduZWRfMzIgKFRvdGFsX0luIChGaWx0ZXIpKSk7Ci0gICAgICAgICAgICBBZGRfRGF0YSAoRm9vdGVyKTsKLSAgICAgICAgIGVuZDsKLSAgICAgIGVuZCBpZjsKLSAgIGVuZCBUcmFuc2xhdGVfR1ppcDsKLQotICAgLS0tLS0tLS0tLS0tLQotICAgLS0gVmVyc2lvbiAtLQotICAgLS0tLS0tLS0tLS0tLQotCi0gICBmdW5jdGlvbiBWZXJzaW9uIHJldHVybiBTdHJpbmcgaXMKLSAgIGJlZ2luCi0gICAgICByZXR1cm4gSW50ZXJmYWNlcy5DLlN0cmluZ3MuVmFsdWUgKFRoaW4uemxpYlZlcnNpb24pOwotICAgZW5kIFZlcnNpb247Ci0KLSAgIC0tLS0tLS0tLS0tCi0gICAtLSBXcml0ZSAtLQotICAgLS0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIFdyaXRlCi0gICAgIChGaWx0ZXIgOiBpbiBvdXQgRmlsdGVyX1R5cGU7Ci0gICAgICBJdGVtICAgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICBGbHVzaCAgOiBpbiAgICAgRmx1c2hfTW9kZSA6PSBOb19GbHVzaCkKLSAgIGlzCi0gICAgICBCdWZmZXIgICA6IFN0cmVhbV9FbGVtZW50X0FycmF5ICgxIC4uIEJ1ZmZlcl9TaXplKTsKLSAgICAgIEluX0xhc3QgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgT3V0X0xhc3QgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBJbl9GaXJzdCA6IFN0cmVhbV9FbGVtZW50X09mZnNldCA6PSBJdGVtJ0ZpcnN0OwotICAgYmVnaW4KLSAgICAgIGlmIEl0ZW0nTGVuZ3RoID0gMCBhbmQgRmx1c2ggPSBOb19GbHVzaCB0aGVuCi0gICAgICAgICByZXR1cm47Ci0gICAgICBlbmQgaWY7Ci0KLSAgICAgIGxvb3AKLSAgICAgICAgIFRyYW5zbGF0ZQotICAgICAgICAgICAoRmlsdGVyICAgPT4gRmlsdGVyLAotICAgICAgICAgICAgSW5fRGF0YSAgPT4gSXRlbSAoSW5fRmlyc3QgLi4gSXRlbSdMYXN0KSwKLSAgICAgICAgICAgIEluX0xhc3QgID0+IEluX0xhc3QsCi0gICAgICAgICAgICBPdXRfRGF0YSA9PiBCdWZmZXIsCi0gICAgICAgICAgICBPdXRfTGFzdCA9PiBPdXRfTGFzdCwKLSAgICAgICAgICAgIEZsdXNoICAgID0+IEZsdXNoKTsKLQotICAgICAgICAgaWYgT3V0X0xhc3QgPj0gQnVmZmVyJ0ZpcnN0IHRoZW4KLSAgICAgICAgICAgIFdyaXRlIChCdWZmZXIgKDEgLi4gT3V0X0xhc3QpKTsKLSAgICAgICAgIGVuZCBpZjsKLQotICAgICAgICAgZXhpdCB3aGVuIEluX0xhc3QgPSBJdGVtJ0xhc3Qgb3IgU3RyZWFtX0VuZCAoRmlsdGVyKTsKLQotICAgICAgICAgSW5fRmlyc3QgOj0gSW5fTGFzdCArIDE7Ci0gICAgICBlbmQgbG9vcDsKLSAgIGVuZCBXcml0ZTsKLQotZW5kIFpMaWI7CmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2FkYS96bGliLmFkcyBiL3NyYy96bGliL2NvbnRyaWIvYWRhL3psaWIuYWRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWZmYzQwLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvYWRhL3psaWIuYWRzCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLS0gICAgICAgICAgICAgICAgICAgICAgWkxpYiBmb3IgQWRhIHRoaWNrIGJpbmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBEbWl0cml5IEFuaXNpbWtvdiAgICAgICAgICAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgLS0KLS0tICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAtLQotLS0gIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCAgIC0tCi0tLSAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgICAgIC0tCi0tLSAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgICAgLS0KLS0tICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSAgICAgICAtLQotLS0gIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAtLQotLS0gIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIC0tCi0tLSAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgLS0KLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIGlmIG90aGVyIGZpbGVzIGluc3RhbnRpYXRlIGdlbmVyaWNzIGZyb20gdGhpcyAgIC0tCi0tLSAgdW5pdCwgb3IgeW91IGxpbmsgdGhpcyB1bml0IHdpdGggb3RoZXIgZmlsZXMgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCAgLS0KLS0tICB0aGlzICB1bml0ICBkb2VzIG5vdCAgYnkgaXRzZWxmIGNhdXNlICB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdG8gYmUgICAtLQotLS0gIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCAgICAgIC0tCi0tLSAgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeSB0aGUgZXhlY3V0YWJsZSBmaWxlICBtaWdodCBiZSAgLS0KLS0tICBjb3ZlcmVkIGJ5IHRoZSAgR05VIFB1YmxpYyBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tICAkSWQ6IHpsaWIuYWRzLHYgMS4yNiAyMDA0LzA5LzA2IDA2OjUzOjE5IHZhZ3VsIEV4cCAkCi0KLXdpdGggQWRhLlN0cmVhbXM7Ci0KLXdpdGggSW50ZXJmYWNlczsKLQotcGFja2FnZSBaTGliIGlzCi0KLSAgIFpMaWJfRXJyb3IgICA6IGV4Y2VwdGlvbjsKLSAgIFN0YXR1c19FcnJvciA6IGV4Y2VwdGlvbjsKLQotICAgdHlwZSBDb21wcmVzc2lvbl9MZXZlbCBpcyBuZXcgSW50ZWdlciByYW5nZSAtMSAuLiA5OwotCi0gICB0eXBlIEZsdXNoX01vZGUgaXMgcHJpdmF0ZTsKLQotICAgdHlwZSBDb21wcmVzc2lvbl9NZXRob2QgaXMgcHJpdmF0ZTsKLQotICAgdHlwZSBXaW5kb3dfQml0c19UeXBlIGlzIG5ldyBJbnRlZ2VyIHJhbmdlIDggLi4gMTU7Ci0KLSAgIHR5cGUgTWVtb3J5X0xldmVsX1R5cGUgaXMgbmV3IEludGVnZXIgcmFuZ2UgMSAuLiA5OwotCi0gICB0eXBlIFVuc2lnbmVkXzMyIGlzIG5ldyBJbnRlcmZhY2VzLlVuc2lnbmVkXzMyOwotCi0gICB0eXBlIFN0cmF0ZWd5X1R5cGUgaXMgcHJpdmF0ZTsKLQotICAgdHlwZSBIZWFkZXJfVHlwZSBpcyAoTm9uZSwgQXV0bywgRGVmYXVsdCwgR1ppcCk7Ci0gICAtLSAgSGVhZGVyIHR5cGUgdXNhZ2UgaGF2ZSBhIHNvbWUgbGltaXRhdGlvbiBmb3IgaW5mbGF0ZS4KLSAgIC0tICBTZWUgY29tbWVudCBmb3IgSW5mbGF0ZV9Jbml0LgotCi0gICBzdWJ0eXBlIENvdW50IGlzIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0NvdW50OwotCi0gICBEZWZhdWx0X01lbW9yeV9MZXZlbCA6IGNvbnN0YW50IE1lbW9yeV9MZXZlbF9UeXBlIDo9IDg7Ci0gICBEZWZhdWx0X1dpbmRvd19CaXRzICA6IGNvbnN0YW50IFdpbmRvd19CaXRzX1R5cGUgIDo9IDE1OwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBDb21wcmVzc2lvbiBtZXRob2QgY29uc3RhbnRzIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIERlZmxhdGVkIDogY29uc3RhbnQgQ29tcHJlc3Npb25fTWV0aG9kOwotICAgLS0gIE9ubHkgb25lIG1ldGhvZCBhbGxvd2VkIGluIHRoaXMgWkxpYiB2ZXJzaW9uCi0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLS0gQ29tcHJlc3Npb24gbGV2ZWwgY29uc3RhbnRzIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgTm9fQ29tcHJlc3Npb24gICAgICA6IGNvbnN0YW50IENvbXByZXNzaW9uX0xldmVsIDo9IDA7Ci0gICBCZXN0X1NwZWVkICAgICAgICAgIDogY29uc3RhbnQgQ29tcHJlc3Npb25fTGV2ZWwgOj0gMTsKLSAgIEJlc3RfQ29tcHJlc3Npb24gICAgOiBjb25zdGFudCBDb21wcmVzc2lvbl9MZXZlbCA6PSA5OwotICAgRGVmYXVsdF9Db21wcmVzc2lvbiA6IGNvbnN0YW50IENvbXByZXNzaW9uX0xldmVsIDo9IC0xOwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLS0gRmx1c2ggbW9kZSBjb25zdGFudHMgLS0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIE5vX0ZsdXNoICAgICAgOiBjb25zdGFudCBGbHVzaF9Nb2RlOwotICAgLS0gIFJlZ3VsYXIgd2F5IGZvciBjb21wcmVzc2lvbiwgbm8gZmx1c2gKLQotICAgUGFydGlhbF9GbHVzaCA6IGNvbnN0YW50IEZsdXNoX01vZGU7Ci0gICAtLSAgV2lsbCBiZSByZW1vdmVkLCB1c2UgWl9TWU5DX0ZMVVNIIGluc3RlYWQKLQotICAgU3luY19GbHVzaCAgICA6IGNvbnN0YW50IEZsdXNoX01vZGU7Ci0gICAtLSAgQWxsIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQgdG8gdGhlIG91dHB1dCBidWZmZXIgYW5kIHRoZSBvdXRwdXQKLSAgIC0tICBpcyBhbGlnbmVkIG9uIGEgYnl0ZSBib3VuZGFyeSwgc28gdGhhdCB0aGUgZGVjb21wcmVzc29yIGNhbiBnZXQgYWxsCi0gICAtLSAgaW5wdXQgZGF0YSBhdmFpbGFibGUgc28gZmFyLiAoSW4gcGFydGljdWxhciBhdmFpbF9pbiBpcyB6ZXJvIGFmdGVyIHRoZQotICAgLS0gIGNhbGwgaWYgZW5vdWdoIG91dHB1dCBzcGFjZSBoYXMgYmVlbiBwcm92aWRlZCAgYmVmb3JlIHRoZSBjYWxsLikKLSAgIC0tICBGbHVzaGluZyBtYXkgZGVncmFkZSBjb21wcmVzc2lvbiBmb3Igc29tZSBjb21wcmVzc2lvbiBhbGdvcml0aG1zIGFuZCBzbwotICAgLS0gIGl0IHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBuZWNlc3NhcnkuCi0KLSAgIEJsb2NrX0ZsdXNoICAgOiBjb25zdGFudCBGbHVzaF9Nb2RlOwotICAgLS0gIFpfQkxPQ0sgcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkgc3RvcAotICAgLS0gIGlmIGFuZCB3aGVuIGl0IGdldCB0byB0aGUgbmV4dCBkZWZsYXRlIGJsb2NrIGJvdW5kYXJ5LiBXaGVuIGRlY29kaW5nIHRoZQotICAgLS0gIHpsaWIgb3IgZ3ppcCBmb3JtYXQsIHRoaXMgd2lsbCBjYXVzZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5Ci0gICAtLSAgYWZ0ZXIgdGhlIGhlYWRlciBhbmQgYmVmb3JlIHRoZSBmaXJzdCBibG9jay4gV2hlbiBkb2luZyBhIHJhdyBpbmZsYXRlLAotICAgLS0gIGluZmxhdGUoKSB3aWxsIGdvIGFoZWFkIGFuZCBwcm9jZXNzIHRoZSBmaXJzdCBibG9jaywgYW5kIHdpbGwgcmV0dXJuCi0gICAtLSAgd2hlbiBpdCBnZXRzIHRvIHRoZSBlbmQgb2YgdGhhdCBibG9jaywgb3Igd2hlbiBpdCBydW5zIG91dCBvZiBkYXRhLgotCi0gICBGdWxsX0ZsdXNoICAgIDogY29uc3RhbnQgRmx1c2hfTW9kZTsKLSAgIC0tICBBbGwgb3V0cHV0IGlzIGZsdXNoZWQgYXMgd2l0aCBTWU5DX0ZMVVNILCBhbmQgdGhlIGNvbXByZXNzaW9uIHN0YXRlCi0gICAtLSAgaXMgcmVzZXQgc28gdGhhdCBkZWNvbXByZXNzaW9uIGNhbiByZXN0YXJ0IGZyb20gdGhpcyBwb2ludCBpZiBwcmV2aW91cwotICAgLS0gIGNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiBkYW1hZ2VkIG9yIGlmIHJhbmRvbSBhY2Nlc3MgaXMgZGVzaXJlZC4gVXNpbmcKLSAgIC0tICBGdWxsX0ZsdXNoIHRvbyBvZnRlbiBjYW4gc2VyaW91c2x5IGRlZ3JhZGUgdGhlIGNvbXByZXNzaW9uLgotCi0gICBGaW5pc2ggICAgICAgIDogY29uc3RhbnQgRmx1c2hfTW9kZTsKLSAgIC0tICBKdXN0IGZvciB0ZWxsIHRoZSBjb21wcmVzc29yIHRoYXQgaW5wdXQgZGF0YSBpcyBjb21wbGV0ZS4KLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBDb21wcmVzc2lvbiBzdHJhdGVneSBjb25zdGFudHMgLS0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAtLSAgUkxFIHN0YXRlZ3kgY291bGQgYmUgdXNlZCBvbmx5IGluIHZlcnNpb24gMS4yLjAgYW5kIGxhdGVyLgotCi0gICBGaWx0ZXJlZCAgICAgICAgIDogY29uc3RhbnQgU3RyYXRlZ3lfVHlwZTsKLSAgIEh1ZmZtYW5fT25seSAgICAgOiBjb25zdGFudCBTdHJhdGVneV9UeXBlOwotICAgUkxFICAgICAgICAgICAgICA6IGNvbnN0YW50IFN0cmF0ZWd5X1R5cGU7Ci0gICBEZWZhdWx0X1N0cmF0ZWd5IDogY29uc3RhbnQgU3RyYXRlZ3lfVHlwZTsKLQotICAgRGVmYXVsdF9CdWZmZXJfU2l6ZSA6IGNvbnN0YW50IDo9IDQwOTY7Ci0KLSAgIHR5cGUgRmlsdGVyX1R5cGUgaXMgdGFnZ2VkIGxpbWl0ZWQgcHJpdmF0ZTsKLSAgIC0tICBUaGUgZmlsdGVyIGlzIGZvciBjb21wcmVzc2lvbiBhbmQgZm9yIGRlY29tcHJlc3Npb24uCi0gICAtLSAgVGhlIHVzYWdlIG9mIHRoZSB0eXBlIGlzIGRlcGVuZCBvZiBpdHMgaW5pdGlhbGl6YXRpb24uCi0KLSAgIGZ1bmN0aW9uIFZlcnNpb24gcmV0dXJuIFN0cmluZzsKLSAgIHByYWdtYSBJbmxpbmUgKFZlcnNpb24pOwotICAgLS0gIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFpMaWIgdmVyc2lvbi4KLQotICAgcHJvY2VkdXJlIERlZmxhdGVfSW5pdAotICAgICAoRmlsdGVyICAgICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOwotICAgICAgTGV2ZWwgICAgICAgIDogaW4gICAgIENvbXByZXNzaW9uX0xldmVsICA6PSBEZWZhdWx0X0NvbXByZXNzaW9uOwotICAgICAgU3RyYXRlZ3kgICAgIDogaW4gICAgIFN0cmF0ZWd5X1R5cGUgICAgICA6PSBEZWZhdWx0X1N0cmF0ZWd5OwotICAgICAgTWV0aG9kICAgICAgIDogaW4gICAgIENvbXByZXNzaW9uX01ldGhvZCA6PSBEZWZsYXRlZDsKLSAgICAgIFdpbmRvd19CaXRzICA6IGluICAgICBXaW5kb3dfQml0c19UeXBlICAgOj0gRGVmYXVsdF9XaW5kb3dfQml0czsKLSAgICAgIE1lbW9yeV9MZXZlbCA6IGluICAgICBNZW1vcnlfTGV2ZWxfVHlwZSAgOj0gRGVmYXVsdF9NZW1vcnlfTGV2ZWw7Ci0gICAgICBIZWFkZXIgICAgICAgOiBpbiAgICAgSGVhZGVyX1R5cGUgICAgICAgIDo9IERlZmF1bHQpOwotICAgLS0gIENvbXByZXNzb3IgaW5pdGlhbGl6YXRpb24uCi0gICAtLSAgV2hlbiBIZWFkZXIgcGFyYW1ldGVyIGlzIEF1dG8gb3IgRGVmYXVsdCwgdGhlbiBkZWZhdWx0IHpsaWIgaGVhZGVyCi0gICAtLSAgd291bGQgYmUgcHJvdmlkZWQgZm9yIGNvbXByZXNzZWQgZGF0YS4KLSAgIC0tICBXaGVuIEhlYWRlciBpcyBHWmlwLCB0aGVuIGd6aXAgaGVhZGVyIHdvdWxkIGJlIHNldCBpbnN0ZWFkIG9mCi0gICAtLSAgZGVmYXVsdCBoZWFkZXIuCi0gICAtLSAgV2hlbiBIZWFkZXIgaXMgTm9uZSwgbm8gaGVhZGVyIHdvdWxkIGJlIHNldCBmb3IgY29tcHJlc3NlZCBkYXRhLgotCi0gICBwcm9jZWR1cmUgSW5mbGF0ZV9Jbml0Ci0gICAgIChGaWx0ZXIgICAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKLSAgICAgIFdpbmRvd19CaXRzIDogaW4gICAgIFdpbmRvd19CaXRzX1R5cGUgOj0gRGVmYXVsdF9XaW5kb3dfQml0czsKLSAgICAgIEhlYWRlciAgICAgIDogaW4gICAgIEhlYWRlcl9UeXBlICAgICAgOj0gRGVmYXVsdCk7Ci0gICAtLSAgRGVjb21wcmVzc29yIGluaXRpYWxpemF0aW9uLgotICAgLS0gIERlZmF1bHQgaGVhZGVyIHR5cGUgbWVhbiB0aGF0IFpMaWIgZGVmYXVsdCBoZWFkZXIgaXMgZXhwZWN0aW5nIGluIHRoZQotICAgLS0gIGlucHV0IGNvbXByZXNzZWQgc3RyZWFtLgotICAgLS0gIEhlYWRlciB0eXBlIE5vbmUgbWVhbiB0aGF0IG5vIGhlYWRlciBpcyBleHBlY3RpbmcgaW4gdGhlIGlucHV0IHN0cmVhbS4KLSAgIC0tICBHWmlwIGhlYWRlciB0eXBlIG1lYW4gdGhhdCBHWmlwIGhlYWRlciBpcyBleHBlY3RpbmcgaW4gdGhlCi0gICAtLSAgaW5wdXQgY29tcHJlc3NlZCBzdHJlYW0uCi0gICAtLSAgQXV0byBoZWFkZXIgdHlwZSBtZWFuIHRoYXQgaGVhZGVyIHR5cGUgKEdaaXAgb3IgTmF0aXZlKSB3b3VsZCBiZQotICAgLS0gIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkgaW4gdGhlIGlucHV0IHN0cmVhbS4KLSAgIC0tICBOb3RlIHRoYXQgaGVhZGVyIHR5cGVzIHBhcmFtZXRlciB2YWx1ZXMgTm9uZSwgR1ppcCBhbmQgQXV0byBhcmUKLSAgIC0tICBzdXBwb3J0ZWQgZm9yIGluZmxhdGUgcm91dGluZSBvbmx5IGluIFpMaWIgdmVyc2lvbnMgMS4yLjAuMiBhbmQgbGF0ZXIuCi0gICAtLSAgRGVmbGF0ZV9Jbml0IGlzIHN1cHBvcnRpbmcgYWxsIGhlYWRlciB0eXBlcy4KLQotICAgZnVuY3Rpb24gSXNfT3BlbiAoRmlsdGVyIDogaW4gRmlsdGVyX1R5cGUpIHJldHVybiBCb29sZWFuOwotICAgcHJhZ21hIElubGluZSAoSXNfT3Blbik7Ci0gICAtLSAgSXMgdGhlIGZpbHRlciBvcGVuZWQgZm9yIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24uCi0KLSAgIHByb2NlZHVyZSBDbG9zZQotICAgICAoRmlsdGVyICAgICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOwotICAgICAgSWdub3JlX0Vycm9yIDogaW4gICAgIEJvb2xlYW4gOj0gRmFsc2UpOwotICAgLS0gIENsb3NpbmcgdGhlIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Nvci4KLSAgIC0tICBJZiBzdHJlYW0gaXMgY2xvc2luZyBiZWZvcmUgdGhlIGNvbXBsZXRlIGFuZCBJZ25vcmVfRXJyb3IgaXMgRmFsc2UsCi0gICAtLSAgVGhlIGV4Y2VwdGlvbiB3b3VsZCBiZSByYWlzZWQuCi0KLSAgIGdlbmVyaWMKLSAgICAgIHdpdGggcHJvY2VkdXJlIERhdGFfSW4KLSAgICAgICAgKEl0ZW0gOiBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICAgICBMYXN0IDogb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldCk7Ci0gICAgICB3aXRoIHByb2NlZHVyZSBEYXRhX091dAotICAgICAgICAoSXRlbSA6IGluIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5KTsKLSAgIHByb2NlZHVyZSBHZW5lcmljX1RyYW5zbGF0ZQotICAgICAoRmlsdGVyICAgICAgICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOwotICAgICAgSW5fQnVmZmVyX1NpemUgIDogaW4gICAgIEludGVnZXIgOj0gRGVmYXVsdF9CdWZmZXJfU2l6ZTsKLSAgICAgIE91dF9CdWZmZXJfU2l6ZSA6IGluICAgICBJbnRlZ2VyIDo9IERlZmF1bHRfQnVmZmVyX1NpemUpOwotICAgLS0gIENvbXByZXNzL2RlY29tcHJlc3MgZGF0YSBmZXRjaCBmcm9tIERhdGFfSW4gcm91dGluZSBhbmQgcGFzcyB0aGUgcmVzdWx0Ci0gICAtLSAgdG8gdGhlIERhdGFfT3V0IHJvdXRpbmUuIFVzZXIgc2hvdWxkIHByb3ZpZGUgRGF0YV9JbiBhbmQgRGF0YV9PdXQKLSAgIC0tICBmb3IgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBkYXRhIGZsb3cuCi0gICAtLSAgQ29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBkZXBlbmQgb24gRmlsdGVyIGluaXRpYWxpemF0aW9uLgotCi0gICBmdW5jdGlvbiBUb3RhbF9JbiAoRmlsdGVyIDogaW4gRmlsdGVyX1R5cGUpIHJldHVybiBDb3VudDsKLSAgIHByYWdtYSBJbmxpbmUgKFRvdGFsX0luKTsKLSAgIC0tICBSZXR1cm5zIHRvdGFsIG51bWJlciBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhcgotCi0gICBmdW5jdGlvbiBUb3RhbF9PdXQgKEZpbHRlciA6IGluIEZpbHRlcl9UeXBlKSByZXR1cm4gQ291bnQ7Ci0gICBwcmFnbWEgSW5saW5lIChUb3RhbF9PdXQpOwotICAgLS0gIFJldHVybnMgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIKLQotICAgZnVuY3Rpb24gQ1JDMzIKLSAgICAgKENSQyAgICA6IGluIFVuc2lnbmVkXzMyOwotICAgICAgRGF0YSAgIDogaW4gQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXkpCi0gICAgICByZXR1cm4gVW5zaWduZWRfMzI7Ci0gICBwcmFnbWEgSW5saW5lIChDUkMzMik7Ci0gICAtLSAgQ29tcHV0ZSBDUkMzMiwgaXQgY291bGQgYmUgbmVjZXNzYXJ5IGZvciBtYWtlIGd6aXAgZm9ybWF0Ci0KLSAgIHByb2NlZHVyZSBDUkMzMgotICAgICAoQ1JDICA6IGluIG91dCBVbnNpZ25lZF8zMjsKLSAgICAgIERhdGEgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXkpOwotICAgcHJhZ21hIElubGluZSAoQ1JDMzIpOwotICAgLS0gIENvbXB1dGUgQ1JDMzIsIGl0IGNvdWxkIGJlIG5lY2Vzc2FyeSBmb3IgbWFrZSBnemlwIGZvcm1hdAotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSAgQmVsb3cgaXMgbW9yZSBjb21wbGV4IGxvdyBsZXZlbCByb3V0aW5lcy4gIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBUcmFuc2xhdGUKLSAgICAgKEZpbHRlciAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKLSAgICAgIEluX0RhdGEgICA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIEluX0xhc3QgICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBPdXRfRGF0YSAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICBPdXRfTGFzdCAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgRmx1c2ggICAgIDogaW4gICAgIEZsdXNoX01vZGUpOwotICAgLS0gIENvbXByZXNzL2RlY29tcHJlc3MgdGhlIEluX0RhdGEgYnVmZmVyIGFuZCBwbGFjZSB0aGUgcmVzdWx0IGludG8KLSAgIC0tICBPdXRfRGF0YS4gSW5fTGFzdCBpcyB0aGUgaW5kZXggb2YgbGFzdCBlbGVtZW50IGZyb20gSW5fRGF0YSBhY2NlcHRlZCBieQotICAgLS0gIHRoZSBGaWx0ZXIuIE91dF9MYXN0IGlzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHJlY2VpdmVkIGRhdGEgZnJvbQotICAgLS0gIEZpbHRlci4gVG8gdGVsbCB0aGUgZmlsdGVyIHRoYXQgaW5jb21pbmcgZGF0YSBhcmUgY29tcGxldGUgcHV0IHRoZQotICAgLS0gIEZsdXNoIHBhcmFtZXRlciB0byBGaW5pc2guCi0KLSAgIGZ1bmN0aW9uIFN0cmVhbV9FbmQgKEZpbHRlciA6IGluIEZpbHRlcl9UeXBlKSByZXR1cm4gQm9vbGVhbjsKLSAgIHByYWdtYSBJbmxpbmUgKFN0cmVhbV9FbmQpOwotICAgLS0gIFJldHVybiB0aGUgdHJ1ZSB3aGVuIHRoZSBzdHJlYW0gaXMgY29tcGxldGUuCi0KLSAgIHByb2NlZHVyZSBGbHVzaAotICAgICAoRmlsdGVyICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOwotICAgICAgT3V0X0RhdGEgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgT3V0X0xhc3QgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIEZsdXNoICAgICA6IGluICAgICBGbHVzaF9Nb2RlKTsKLSAgIHByYWdtYSBJbmxpbmUgKEZsdXNoKTsKLSAgIC0tICBGbHVzaGluZyB0aGUgZGF0YSBmcm9tIHRoZSBjb21wcmVzc29yLgotCi0gICBnZW5lcmljCi0gICAgICB3aXRoIHByb2NlZHVyZSBXcml0ZQotICAgICAgICAoSXRlbSA6IGluIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5KTsKLSAgICAgIC0tICBVc2VyIHNob3VsZCBwcm92aWRlIHRoaXMgcm91dGluZSBmb3IgYWNjZXB0Ci0gICAgICAtLSAgY29tcHJlc3NlZC9kZWNvbXByZXNzZWQgZGF0YS4KLQotICAgICAgQnVmZmVyX1NpemUgOiBpbiBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQKLSAgICAgICAgIDo9IERlZmF1bHRfQnVmZmVyX1NpemU7Ci0gICAgICAtLSAgQnVmZmVyIHNpemUgZm9yIFdyaXRlIHVzZXIgcm91dGluZS4KLQotICAgcHJvY2VkdXJlIFdyaXRlCi0gICAgIChGaWx0ZXIgIDogaW4gb3V0IEZpbHRlcl9UeXBlOwotICAgICAgSXRlbSAgICA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIEZsdXNoICAgOiBpbiAgICAgRmx1c2hfTW9kZSA6PSBOb19GbHVzaCk7Ci0gICAtLSAgQ29tcHJlc3MvRGVjb21wcmVzcyBkYXRhIGZyb20gSXRlbSB0byB0aGUgZ2VuZXJpYyBwYXJhbWV0ZXIgcHJvY2VkdXJlCi0gICAtLSAgV3JpdGUuIE91dHB1dCBidWZmZXIgc2l6ZSBjb3VsZCBiZSBzZXQgaW4gQnVmZmVyX1NpemUgZ2VuZXJpYyBwYXJhbWV0ZXIuCi0KLSAgIGdlbmVyaWMKLSAgICAgIHdpdGggcHJvY2VkdXJlIFJlYWQKLSAgICAgICAgKEl0ZW0gOiBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICAgICBMYXN0IDogb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldCk7Ci0gICAgICAtLSAgVXNlciBzaG91bGQgcHJvdmlkZSBkYXRhIGZvciBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uCi0gICAgICAtLSAgdGhydSB0aGlzIHJvdXRpbmUuCi0KLSAgICAgIEJ1ZmZlciA6IGluIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIC0tICBCdWZmZXIgZm9yIGtlZXAgcmVtYWluaW5nIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMKLSAgICAgIC0tICBiYWNrIHJlYWQuCi0KLSAgICAgIFJlc3RfRmlyc3QsIFJlc3RfTGFzdCA6IGluIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICAtLSAgUmVzdF9GaXJzdCBoYXZlIHRvIGJlIGluaXRpYWxpemVkIHRvIEJ1ZmZlcidMYXN0ICsgMQotICAgICAgLS0gIFJlc3RfTGFzdCBoYXZlIHRvIGJlIGluaXRpYWxpemVkIHRvIEJ1ZmZlcidMYXN0Ci0gICAgICAtLSAgYmVmb3JlIHVzYWdlLgotCi0gICAgICBBbGxvd19SZWFkX1NvbWUgOiBpbiBCb29sZWFuIDo9IEZhbHNlOwotICAgICAgLS0gIElzIGl0IGFsbG93ZWQgdG8gcmV0dXJuIExhc3QgPCBJdGVtJ0xhc3QgYmVmb3JlIGVuZCBvZiBkYXRhLgotCi0gICBwcm9jZWR1cmUgUmVhZAotICAgICAoRmlsdGVyIDogaW4gb3V0IEZpbHRlcl9UeXBlOwotICAgICAgSXRlbSAgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgTGFzdCAgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIEZsdXNoICA6IGluICAgICBGbHVzaF9Nb2RlIDo9IE5vX0ZsdXNoKTsKLSAgIC0tICBDb21wcmVzcy9EZWNvbXByZXNzIGRhdGEgZnJvbSBnZW5lcmljIHBhcmFtZXRlciBwcm9jZWR1cmUgUmVhZCB0byB0aGUKLSAgIC0tICBJdGVtLiBVc2VyIHNob3VsZCBwcm92aWRlIEJ1ZmZlciBhbmQgaW5pdGlhbGl6ZWQgUmVzdF9GaXJzdCwgUmVzdF9MYXN0Ci0gICAtLSAgaW5kaWNhdG9ycy4gSWYgQWxsb3dfUmVhZF9Tb21lIGlzIFRydWUsIFJlYWQgcm91dGluZXMgY291bGQgcmV0dXJuCi0gICAtLSAgTGFzdCA8IEl0ZW0nTGFzdCBvbmx5IGF0IGVuZCBvZiBzdHJlYW0uCi0KLXByaXZhdGUKLQotICAgdXNlIEFkYS5TdHJlYW1zOwotCi0gICBwcmFnbWEgQXNzZXJ0IChBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudCdTaXplICAgID0gICAgOCk7Ci0gICBwcmFnbWEgQXNzZXJ0IChBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudCdNb2R1bHVzID0gMioqOCk7Ci0KLSAgIHR5cGUgRmx1c2hfTW9kZSBpcyBuZXcgSW50ZWdlciByYW5nZSAwIC4uIDU7Ci0KLSAgIHR5cGUgQ29tcHJlc3Npb25fTWV0aG9kIGlzIG5ldyBJbnRlZ2VyIHJhbmdlIDggLi4gODsKLQotICAgdHlwZSBTdHJhdGVneV9UeXBlIGlzIG5ldyBJbnRlZ2VyIHJhbmdlIDAgLi4gMzsKLQotICAgTm9fRmx1c2ggICAgICA6IGNvbnN0YW50IEZsdXNoX01vZGUgOj0gMDsKLSAgIFBhcnRpYWxfRmx1c2ggOiBjb25zdGFudCBGbHVzaF9Nb2RlIDo9IDE7Ci0gICBTeW5jX0ZsdXNoICAgIDogY29uc3RhbnQgRmx1c2hfTW9kZSA6PSAyOwotICAgRnVsbF9GbHVzaCAgICA6IGNvbnN0YW50IEZsdXNoX01vZGUgOj0gMzsKLSAgIEZpbmlzaCAgICAgICAgOiBjb25zdGFudCBGbHVzaF9Nb2RlIDo9IDQ7Ci0gICBCbG9ja19GbHVzaCAgIDogY29uc3RhbnQgRmx1c2hfTW9kZSA6PSA1OwotCi0gICBGaWx0ZXJlZCAgICAgICAgIDogY29uc3RhbnQgU3RyYXRlZ3lfVHlwZSA6PSAxOwotICAgSHVmZm1hbl9Pbmx5ICAgICA6IGNvbnN0YW50IFN0cmF0ZWd5X1R5cGUgOj0gMjsKLSAgIFJMRSAgICAgICAgICAgICAgOiBjb25zdGFudCBTdHJhdGVneV9UeXBlIDo9IDM7Ci0gICBEZWZhdWx0X1N0cmF0ZWd5IDogY29uc3RhbnQgU3RyYXRlZ3lfVHlwZSA6PSAwOwotCi0gICBEZWZsYXRlZCA6IGNvbnN0YW50IENvbXByZXNzaW9uX01ldGhvZCA6PSA4OwotCi0gICB0eXBlIFpfU3RyZWFtOwotCi0gICB0eXBlIFpfU3RyZWFtX0FjY2VzcyBpcyBhY2Nlc3MgYWxsIFpfU3RyZWFtOwotCi0gICB0eXBlIEZpbHRlcl9UeXBlIGlzIHRhZ2dlZCBsaW1pdGVkIHJlY29yZAotICAgICAgU3RybSAgICAgICAgOiBaX1N0cmVhbV9BY2Nlc3M7Ci0gICAgICBDb21wcmVzc2lvbiA6IEJvb2xlYW47Ci0gICAgICBTdHJlYW1fRW5kICA6IEJvb2xlYW47Ci0gICAgICBIZWFkZXIgICAgICA6IEhlYWRlcl9UeXBlOwotICAgICAgQ1JDICAgICAgICAgOiBVbnNpZ25lZF8zMjsKLSAgICAgIE9mZnNldCAgICAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgLS0gIE9mZnNldCBmb3IgZ3ppcCBoZWFkZXIvZm9vdGVyIG91dHB1dC4KLSAgIGVuZCByZWNvcmQ7Ci0KLWVuZCBaTGliOwpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9hZGEvemxpYi5ncHIgYi9zcmMvemxpYi9jb250cmliL2FkYS96bGliLmdwcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2YjIyYS4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL2FkYS96bGliLmdwcgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLXByb2plY3QgWmxpYiBpcwotCi0gICBmb3IgTGFuZ3VhZ2VzIHVzZSAoIkFkYSIpOwotICAgZm9yIFNvdXJjZV9EaXJzIHVzZSAoIi4iKTsKLSAgIGZvciBPYmplY3RfRGlyIHVzZSAiLiI7Ci0gICBmb3IgTWFpbiB1c2UgKCJ0ZXN0LmFkYiIsICJtdGVzdC5hZGIiLCAicmVhZC5hZGIiLCAiYnVmZmVyX2RlbW8iKTsKLQotICAgcGFja2FnZSBDb21waWxlciBpcwotICAgICAgZm9yIERlZmF1bHRfU3dpdGNoZXMgKCJhZGEiKSB1c2UgKCItZ25hdHdjZmlsb3BydSIsICItZ25hdFZjZGZpbW9yc3QiLCAiLWduYXR5YWJjZWZoaWtsbW5vcHJzdCIpOwotICAgZW5kIENvbXBpbGVyOwotCi0gICBwYWNrYWdlIExpbmtlciBpcwotICAgICAgZm9yIERlZmF1bHRfU3dpdGNoZXMgKCJhZGEiKSB1c2UgKCItbHoiKTsKLSAgIGVuZCBMaW5rZXI7Ci0KLSAgIHBhY2thZ2UgQnVpbGRlciBpcwotICAgICAgZm9yIERlZmF1bHRfU3dpdGNoZXMgKCJhZGEiKSB1c2UgKCItcyIsICItZ25hdFEiKTsKLSAgIGVuZCBCdWlsZGVyOwotCi1lbmQgWmxpYjsKZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvYW1kNjQvYW1kNjQtbWF0Y2guUyBiL3NyYy96bGliL2NvbnRyaWIvYW1kNjQvYW1kNjQtbWF0Y2guUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkNGExYy4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL2FtZDY0L2FtZDY0LW1hdGNoLlMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotLyoKLSAqIG1hdGNoLlMgLS0gb3B0aW1pemVkIHZlcnNpb24gb2YgbG9uZ2VzdF9tYXRjaCgpCi0gKiBiYXNlZCBvbiB0aGUgc2ltaWxhciB3b3JrIGJ5IEdpbGxlcyBWb2xsYW50LCBhbmQgQnJpYW4gUmFpdGVyLCB3cml0dGVuIDE5OTgKLSAqCi0gKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIExpY2Vuc2UuIFVzZSBieSBvd25lcnMgb2YgQ2hlIEd1ZXZhcnJhCi0gKiBwYXJhZmVybmFsaWEgaXMgcHJvaGliaXRlZCwgd2hlcmUgcG9zc2libGUsIGFuZCBoaWdobHkgZGlzY291cmFnZWQKLSAqIGVsc2V3aGVyZS4KLSAqLwotCi0jaWZuZGVmIE5PX1VOREVSTElORQotIwlkZWZpbmUJbWF0Y2hfaW5pdAlfbWF0Y2hfaW5pdAotIwlkZWZpbmUJbG9uZ2VzdF9tYXRjaAlfbG9uZ2VzdF9tYXRjaAotI2VuZGlmCi0KLSNkZWZpbmUJc2NhbmVuZAkJZWJ4Ci0jZGVmaW5lCXNjYW5lbmR3CWJ4Ci0jZGVmaW5lCWNoYWlubGVud21hc2sJZWR4IC8qIGhpZ2ggd29yZDogY3VycmVudCBjaGFpbiBsZW4gbG93IHdvcmQ6IHMtPndtYXNrICovCi0jZGVmaW5lCWN1cm1hdGNoCXJzaQotI2RlZmluZQljdXJtYXRjaGQJZXNpCi0jZGVmaW5lCXdpbmRvd2Jlc3RsZW4JcjgKLSNkZWZpbmUJc2NhbmFsaWduCXI5Ci0jZGVmaW5lCXNjYW5hbGlnbmQJcjlkCi0jZGVmaW5lCXdpbmRvdwkJcjEwCi0jZGVmaW5lCWJlc3RsZW4JCXIxMQotI2RlZmluZQliZXN0bGVuZAlyMTFkCi0jZGVmaW5lCXNjYW5zdGFydAlyMTJkCi0jZGVmaW5lCXNjYW5zdGFydHcJcjEydwotI2RlZmluZSBzY2FuCQlyMTMKLSNkZWZpbmUgbmljZW1hdGNoCXIxNGQKLSNkZWZpbmUJbGltaXQJCXIxNQotI2RlZmluZQlsaW1pdGQJCXIxNWQKLSNkZWZpbmUgcHJldgkJcmN4Ci0KLS8qCi0gKiBUaGUgMjU4IGlzIGEgIm1hZ2ljIG51bWJlciwgbm90IGEgcGFyYW1ldGVyIC0tIGNoYW5naW5nIGl0Ci0gKiBicmVha3MgdGhlIGhlbGwgbG9vc2UKLSAqLwotI2RlZmluZQlNQVhfTUFUQ0gJKDI1OCkKLSNkZWZpbmUJTUlOX01BVENICSgzKQotI2RlZmluZQlNSU5fTE9PS0FIRUFECShNQVhfTUFUQ0ggKyBNSU5fTUFUQ0ggKyAxKQotI2RlZmluZQlNQVhfTUFUQ0hfOAkoKE1BWF9NQVRDSCArIDcpICYgfjcpCi0KLS8qIHN0YWNrIGZyYW1lIG9mZnNldHMgKi8KLSNkZWZpbmUJTG9jYWxWYXJzU2l6ZQkoMTEyKQotI2RlZmluZSBfY2hhaW5sZW53bWFzawkoIDgtTG9jYWxWYXJzU2l6ZSkoJXJzcCkKLSNkZWZpbmUgX3dpbmRvd2Jlc3RsZW4JKDE2LUxvY2FsVmFyc1NpemUpKCVyc3ApCi0jZGVmaW5lIHNhdmVfcjE0ICAgICAgICAoMjQtTG9jYWxWYXJzU2l6ZSkoJXJzcCkKLSNkZWZpbmUgc2F2ZV9yc2kgICAgICAgICgzMi1Mb2NhbFZhcnNTaXplKSglcnNwKQotI2RlZmluZSBzYXZlX3JieCAgICAgICAgKDQwLUxvY2FsVmFyc1NpemUpKCVyc3ApCi0jZGVmaW5lIHNhdmVfcjEyICAgICAgICAoNTYtTG9jYWxWYXJzU2l6ZSkoJXJzcCkKLSNkZWZpbmUgc2F2ZV9yMTMgICAgICAgICg2NC1Mb2NhbFZhcnNTaXplKSglcnNwKQotI2RlZmluZSBzYXZlX3IxNSAgICAgICAgKDgwLUxvY2FsVmFyc1NpemUpKCVyc3ApCi0KLQotLmdsb2JsCW1hdGNoX2luaXQsIGxvbmdlc3RfbWF0Y2gKLQotLyoKLSAqIE9uIEFNRDY0IHRoZSBmaXJzdCBhcmd1bWVudCBvZiBhIGZ1bmN0aW9uIChpbiBvdXIgY2FzZSAtLSB0aGUgcG9pbnRlciB0bwotICogZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUpIGlzIHBhc3NlZCBpbiAlcmRpLCBoZW5jZSBvdXIgb2Zmc2V0cyBiZWxvdyBhcmUKLSAqIGFsbCBvZmYgb2YgdGhhdC4KLSAqLwotCi0vKiB5b3UgY2FuIGNoZWNrIHRoZSBzdHJ1Y3R1cmUgb2Zmc2V0IGJ5IHJ1bm5pbmcKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZGVmbGF0ZS5oIgotCi12b2lkIHByaW50X2RlcGwoKQotewotZGVmbGF0ZV9zdGF0ZSBkczsKLWRlZmxhdGVfc3RhdGUgKnM9JmRzOwotcHJpbnRmKCJzaXplIHBvaW50ZXI9JXVcbiIsKGludClzaXplb2Yodm9pZCopKTsKLQotcHJpbnRmKCIjZGVmaW5lIGRzV1NpemUgICAgICAgICAoJTN1KSglJXJkaSlcbiIsKGludCkoKChjaGFyKikmKHMtPndfc2l6ZSkpLSgoY2hhciopcykpKTsKLXByaW50ZigiI2RlZmluZSBkc1dNYXNrICAgICAgICAgKCUzdSkoJSVyZGkpXG4iLChpbnQpKCgoY2hhciopJihzLT53X21hc2spKS0oKGNoYXIqKXMpKSk7Ci1wcmludGYoIiNkZWZpbmUgZHNXaW5kb3cgICAgICAgICglM3UpKCUlcmRpKVxuIiwoaW50KSgoKGNoYXIqKSYocy0+d2luZG93KSktKChjaGFyKilzKSkpOwotcHJpbnRmKCIjZGVmaW5lIGRzUHJldiAgICAgICAgICAoJTN1KSglJXJkaSlcbiIsKGludCkoKChjaGFyKikmKHMtPnByZXYpKS0oKGNoYXIqKXMpKSk7Ci1wcmludGYoIiNkZWZpbmUgZHNNYXRjaExlbiAgICAgICglM3UpKCUlcmRpKVxuIiwoaW50KSgoKGNoYXIqKSYocy0+bWF0Y2hfbGVuZ3RoKSktKChjaGFyKilzKSkpOwotcHJpbnRmKCIjZGVmaW5lIGRzUHJldk1hdGNoICAgICAoJTN1KSglJXJkaSlcbiIsKGludCkoKChjaGFyKikmKHMtPnByZXZfbWF0Y2gpKS0oKGNoYXIqKXMpKSk7Ci1wcmludGYoIiNkZWZpbmUgZHNTdHJTdGFydCAgICAgICglM3UpKCUlcmRpKVxuIiwoaW50KSgoKGNoYXIqKSYocy0+c3Ryc3RhcnQpKS0oKGNoYXIqKXMpKSk7Ci1wcmludGYoIiNkZWZpbmUgZHNNYXRjaFN0YXJ0ICAgICglM3UpKCUlcmRpKVxuIiwoaW50KSgoKGNoYXIqKSYocy0+bWF0Y2hfc3RhcnQpKS0oKGNoYXIqKXMpKSk7Ci1wcmludGYoIiNkZWZpbmUgZHNMb29rYWhlYWQgICAgICglM3UpKCUlcmRpKVxuIiwoaW50KSgoKGNoYXIqKSYocy0+bG9va2FoZWFkKSktKChjaGFyKilzKSkpOwotcHJpbnRmKCIjZGVmaW5lIGRzUHJldkxlbiAgICAgICAoJTN1KSglJXJkaSlcbiIsKGludCkoKChjaGFyKikmKHMtPnByZXZfbGVuZ3RoKSktKChjaGFyKilzKSkpOwotcHJpbnRmKCIjZGVmaW5lIGRzTWF4Q2hhaW5MZW4gICAoJTN1KSglJXJkaSlcbiIsKGludCkoKChjaGFyKikmKHMtPm1heF9jaGFpbl9sZW5ndGgpKS0oKGNoYXIqKXMpKSk7Ci1wcmludGYoIiNkZWZpbmUgZHNHb29kTWF0Y2ggICAgICglM3UpKCUlcmRpKVxuIiwoaW50KSgoKGNoYXIqKSYocy0+Z29vZF9tYXRjaCkpLSgoY2hhciopcykpKTsKLXByaW50ZigiI2RlZmluZSBkc05pY2VNYXRjaCAgICAgKCUzdSkoJSVyZGkpXG4iLChpbnQpKCgoY2hhciopJihzLT5uaWNlX21hdGNoKSktKChjaGFyKilzKSkpOwotfQotCi0qLwotCi0KLS8qCi0gIHRvIGNvbXBpbGUgZm9yIFhDb2RlIDMuMiBvbiBNYWNPU1ggeDg2XzY0Ci0gIC0gcnVuICJnY2MgLWcgLWMgLURYQ09ERV9NQUNfWDY0X1NUUlVDVFVSRSBhbWQ2NC1tYXRjaC5TIgotICovCi0KLQotI2lmbmRlZiBDVVJSRU5UX0xJTlhfWENPREVfTUFDX1g2NF9TVFJVQ1RVUkUKLSNkZWZpbmUgZHNXU2l6ZQkJKCA2OCkoJXJkaSkKLSNkZWZpbmUgZHNXTWFzawkJKCA3NikoJXJkaSkKLSNkZWZpbmUgZHNXaW5kb3cJKCA4MCkoJXJkaSkKLSNkZWZpbmUgZHNQcmV2CQkoIDk2KSglcmRpKQotI2RlZmluZSBkc01hdGNoTGVuCSgxNDQpKCVyZGkpCi0jZGVmaW5lIGRzUHJldk1hdGNoCSgxNDgpKCVyZGkpCi0jZGVmaW5lIGRzU3RyU3RhcnQJKDE1NikoJXJkaSkKLSNkZWZpbmUgZHNNYXRjaFN0YXJ0CSgxNjApKCVyZGkpCi0jZGVmaW5lIGRzTG9va2FoZWFkCSgxNjQpKCVyZGkpCi0jZGVmaW5lIGRzUHJldkxlbgkoMTY4KSglcmRpKQotI2RlZmluZSBkc01heENoYWluTGVuCSgxNzIpKCVyZGkpCi0jZGVmaW5lIGRzR29vZE1hdGNoCSgxODgpKCVyZGkpCi0jZGVmaW5lIGRzTmljZU1hdGNoCSgxOTIpKCVyZGkpCi0KLSNlbHNlIAotCi0jaWZuZGVmIFNUUlVDVF9PRkZTRVQKLSMJZGVmaW5lIFNUUlVDVF9PRkZTRVQJKDApCi0jZW5kaWYKLQotCi0jZGVmaW5lIGRzV1NpemUJCSggNTYgKyBTVFJVQ1RfT0ZGU0VUKSglcmRpKQotI2RlZmluZSBkc1dNYXNrCQkoIDY0ICsgU1RSVUNUX09GRlNFVCkoJXJkaSkKLSNkZWZpbmUgZHNXaW5kb3cJKCA3MiArIFNUUlVDVF9PRkZTRVQpKCVyZGkpCi0jZGVmaW5lIGRzUHJldgkJKCA4OCArIFNUUlVDVF9PRkZTRVQpKCVyZGkpCi0jZGVmaW5lIGRzTWF0Y2hMZW4JKDEzNiArIFNUUlVDVF9PRkZTRVQpKCVyZGkpCi0jZGVmaW5lIGRzUHJldk1hdGNoCSgxNDAgKyBTVFJVQ1RfT0ZGU0VUKSglcmRpKQotI2RlZmluZSBkc1N0clN0YXJ0CSgxNDggKyBTVFJVQ1RfT0ZGU0VUKSglcmRpKQotI2RlZmluZSBkc01hdGNoU3RhcnQJKDE1MiArIFNUUlVDVF9PRkZTRVQpKCVyZGkpCi0jZGVmaW5lIGRzTG9va2FoZWFkCSgxNTYgKyBTVFJVQ1RfT0ZGU0VUKSglcmRpKQotI2RlZmluZSBkc1ByZXZMZW4JKDE2MCArIFNUUlVDVF9PRkZTRVQpKCVyZGkpCi0jZGVmaW5lIGRzTWF4Q2hhaW5MZW4JKDE2NCArIFNUUlVDVF9PRkZTRVQpKCVyZGkpCi0jZGVmaW5lIGRzR29vZE1hdGNoCSgxODAgKyBTVFJVQ1RfT0ZGU0VUKSglcmRpKQotI2RlZmluZSBkc05pY2VNYXRjaAkoMTg0ICsgU1RSVUNUX09GRlNFVCkoJXJkaSkKLQotI2VuZGlmCi0KLQotCi0KLS50ZXh0Ci0KLS8qIHVJbnQgbG9uZ2VzdF9tYXRjaChkZWZsYXRlX3N0YXRlICpkZWZsYXRlc3RhdGUsIElQb3MgY3VybWF0Y2gpICovCi0KLWxvbmdlc3RfbWF0Y2g6Ci0vKgotICogUmV0cmlldmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gJWN1cm1hdGNoIHdpbGwgaG9sZCBjdXJfbWF0Y2gKLSAqIHRocm91Z2hvdXQgdGhlIGVudGlyZSBmdW5jdGlvbiAocGFzc2VkIHZpYSByc2kgb24gYW1kNjQpLgotICogcmRpIHdpbGwgaG9sZCB0aGUgcG9pbnRlciB0byB0aGUgZGVmbGF0ZV9zdGF0ZSAoZmlyc3QgYXJnIG9uIGFtZDY0KQotICovCi0JCW1vdiAgICAgJXJzaSwgc2F2ZV9yc2kKLQkJbW92ICAgICAlcmJ4LCBzYXZlX3JieAotCQltb3YJJXIxMiwgc2F2ZV9yMTIKLQkJbW92ICAgICAlcjEzLCBzYXZlX3IxMwotCQltb3YgICAgICVyMTQsIHNhdmVfcjE0Ci0JCW1vdiAgICAgJXIxNSwgc2F2ZV9yMTUKLQotLyogdUludCB3bWFzayA9IHMtPndfbWFzazsJCQkJCQkqLwotLyogdW5zaWduZWQgY2hhaW5fbGVuZ3RoID0gcy0+bWF4X2NoYWluX2xlbmd0aDsJCQkJKi8KLS8qIGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7CQkJCSovCi0vKiAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOwkJCQkJCSovCi0vKiB9CQkJCQkJCQkJKi8KLQotCQltb3ZsCWRzUHJldkxlbiwgJWVheAotCQltb3ZsCWRzR29vZE1hdGNoLCAlZWJ4Ci0JCWNtcGwJJWVieCwgJWVheAotCQltb3ZsCWRzV01hc2ssICVlYXgKLQkJbW92bAlkc01heENoYWluTGVuLCAlY2hhaW5sZW53bWFzawotCQlqbAlMYXN0TWF0Y2hHb29kCi0JCXNocmwJJDIsICVjaGFpbmxlbndtYXNrCi1MYXN0TWF0Y2hHb29kOgotCi0vKiBjaGFpbmxlbiBpcyBkZWNyZW1lbnRlZCBvbmNlIGJlZm9yZWhhbmQgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuCSovCi0vKiB1c2UgdGhlIHNpZ24gZmxhZyBpbnN0ZWFkIG9mIHRoZSB6ZXJvIGZsYWcgZm9yIHRoZSBleGl0IHRlc3QuCSovCi0vKiBJdCBpcyB0aGVuIHNoaWZ0ZWQgaW50byB0aGUgaGlnaCB3b3JkLCB0byBtYWtlIHJvb20gZm9yIHRoZSB3bWFzawkqLwotLyogdmFsdWUsIHdoaWNoIGl0IHdpbGwgYWx3YXlzIGFjY29tcGFueS4JCQkJKi8KLQotCQlkZWNsCSVjaGFpbmxlbndtYXNrCi0JCXNobGwJJDE2LCAlY2hhaW5sZW53bWFzawotCQlvcmwJJWVheCwgJWNoYWlubGVud21hc2sKLQotLyogaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7CSovCi0KLQkJbW92bAlkc05pY2VNYXRjaCwgJWVheAotCQltb3ZsCWRzTG9va2FoZWFkLCAlZWJ4Ci0JCWNtcGwJJWVheCwgJWVieAotCQlqbAlMb29rYWhlYWRMZXNzCi0JCW1vdmwJJWVheCwgJWVieAotTG9va2FoZWFkTGVzczoJbW92bAklZWJ4LCAlbmljZW1hdGNoCi0KLS8qIHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7CQkJKi8KLQotCQltb3YJZHNXaW5kb3csICV3aW5kb3cKLQkJbW92bAlkc1N0clN0YXJ0LCAlbGltaXRkCi0JCWxlYQkoJWxpbWl0LCAld2luZG93KSwgJXNjYW4KLQotLyogRGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHRoZSBzY2FuIHB0ciBpcyBvZmYgZnJvbSBiZWluZwkJKi8KLS8qIGR3b3JkLWFsaWduZWQuCQkJCQkJCSovCi0KLQkJbW92CSVzY2FuLCAlc2NhbmFsaWduCi0JCW5lZ2wJJXNjYW5hbGlnbmQKLQkJYW5kbAkkMywgJXNjYW5hbGlnbmQKLQotLyogSVBvcyBsaW1pdCA9IHMtPnN0cnN0YXJ0ID4gKElQb3MpTUFYX0RJU1QocykgPwkJCSovCi0vKiAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsJCQkJKi8KLQotCQltb3ZsCWRzV1NpemUsICVlYXgKLQkJc3VibAkkTUlOX0xPT0tBSEVBRCwgJWVheAotCQl4b3JsCSVlY3gsICVlY3gKLQkJc3VibAklZWF4LCAlbGltaXRkCi0JCWNtb3ZuZwklZWN4LCAlbGltaXRkCi0KLS8qIGludCBiZXN0X2xlbiA9IHMtPnByZXZfbGVuZ3RoOwkJCQkJKi8KLQotCQltb3ZsCWRzUHJldkxlbiwgJWJlc3RsZW5kCi0KLS8qIFN0b3JlIHRoZSBzdW0gb2Ygcy0+d2luZG93ICsgYmVzdF9sZW4gaW4gJXdpbmRvd2Jlc3RsZW4gbG9jYWxseSwgYW5kIGluIG1lbW9yeS4JKi8KLQotCQlsZWEJKCV3aW5kb3csICViZXN0bGVuKSwgJXdpbmRvd2Jlc3RsZW4KLQkJbW92CSV3aW5kb3diZXN0bGVuLCBfd2luZG93YmVzdGxlbgotCi0vKiByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsJCQkJKi8KLS8qIHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsJCQkqLwotLyogUG9zZiAqcHJldiA9IHMtPnByZXY7CQkJCQkJKi8KLQotCQltb3Z6d2wJKCVzY2FuKSwgJXNjYW5zdGFydAotCQltb3Z6d2wJLTEoJXNjYW4sICViZXN0bGVuKSwgJXNjYW5lbmQKLQkJbW92CWRzUHJldiwgJXByZXYKLQotLyogSnVtcCBpbnRvIHRoZSBtYWluIGxvb3AuCQkJCQkJKi8KLQotCQltb3ZsCSVjaGFpbmxlbndtYXNrLCBfY2hhaW5sZW53bWFzawotCQlqbXAJTG9vcEVudHJ5Ci0KLS5iYWxpZ24gMTYKLQotLyogZG8gewotICogICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOwotICogICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fAotICogICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOwotICogICAgIFsuLi5dCi0gKiB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQKLSAqICAgICAgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOwotICoKLSAqIEhlcmUgaXMgdGhlIGlubmVyIGxvb3Agb2YgdGhlIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBzcGVuZCB0aGUKLSAqIG1ham9yaXR5IG9mIGl0cyB0aW1lIGluIHRoaXMgbG9vcCwgYW5kIG1ham9yaXR5IG9mIHRoYXQgdGltZSB3aWxsCi0gKiBiZSBzcGVudCBpbiB0aGUgZmlyc3QgdGVuIGluc3RydWN0aW9ucy4KLSAqLwotTG9va3VwTG9vcDoKLQkJYW5kbAklY2hhaW5sZW53bWFzaywgJWN1cm1hdGNoZAotCQltb3Z6d2wJKCVwcmV2LCAlY3VybWF0Y2gsIDIpLCAlY3VybWF0Y2hkCi0JCWNtcGwJJWxpbWl0ZCwgJWN1cm1hdGNoZAotCQlqYmUJTGVhdmVOb3cKLQkJc3VibAkkMHgwMDAxMDAwMCwgJWNoYWlubGVud21hc2sKLQkJanMJTGVhdmVOb3cKLUxvb3BFbnRyeToJY21wdwktMSgld2luZG93YmVzdGxlbiwgJWN1cm1hdGNoKSwgJXNjYW5lbmR3Ci0JCWpuZQlMb29rdXBMb29wCi0JCWNtcHcJJXNjYW5zdGFydHcsICgld2luZG93LCAlY3VybWF0Y2gpCi0JCWpuZQlMb29rdXBMb29wCi0KLS8qIFN0b3JlIHRoZSBjdXJyZW50IHZhbHVlIG9mIGNoYWlubGVuLgkJCQkJKi8KLQkJbW92bAklY2hhaW5sZW53bWFzaywgX2NoYWlubGVud21hc2sKLQotLyogJXNjYW4gaXMgdGhlIHN0cmluZyB1bmRlciBzY3J1dGlueSwgYW5kICVwcmV2IHRvIHRoZSBzdHJpbmcgd2UJKi8KLS8qIGFyZSBob3BpbmcgdG8gbWF0Y2ggaXQgdXAgd2l0aC4gSW4gYWN0dWFsaXR5LCAlZXNpIGFuZCAlZWRpIGFyZQkqLwotLyogYm90aCBwb2ludGVkIChNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikgYnl0ZXMgYWhlYWQsIGFuZCAlZWR4IGlzCSovCi0vKiBpbml0aWFsaXplZCB0byAtKE1BWF9NQVRDSF84IC0gc2NhbmFsaWduKS4JCQkJKi8KLQotCQltb3YJJCgtTUFYX01BVENIXzgpLCAlcmR4Ci0JCWxlYQkoJWN1cm1hdGNoLCAld2luZG93KSwgJXdpbmRvd2Jlc3RsZW4KLQkJbGVhCU1BWF9NQVRDSF84KCV3aW5kb3diZXN0bGVuLCAlc2NhbmFsaWduKSwgJXdpbmRvd2Jlc3RsZW4KLQkJbGVhCU1BWF9NQVRDSF84KCVzY2FuLCAlc2NhbmFsaWduKSwgJXByZXYKLQotLyogdGhlIHByZWZldGNoaW5nIGJlbG93IG1ha2VzIHZlcnkgbGl0dGxlIGRpZmZlcmVuY2UuLi4gKi8KLQkJcHJlZmV0Y2h0MQkoJXdpbmRvd2Jlc3RsZW4sICVyZHgpCi0JCXByZWZldGNodDEJKCVwcmV2LCAlcmR4KQotCi0vKgotICogVGVzdCB0aGUgc3RyaW5ncyBmb3IgZXF1YWxpdHksIDggYnl0ZXMgYXQgYSB0aW1lLiBBdCB0aGUgZW5kLAotICogYWRqdXN0ICVyZHggc28gdGhhdCBpdCBpcyBvZmZzZXQgdG8gdGhlIGV4YWN0IGJ5dGUgdGhhdCBtaXNtYXRjaGVkLgotICoKLSAqIEl0IHNob3VsZCBiZSBjb25mZXNzZWQgdGhhdCB0aGlzIGxvb3AgdXN1YWxseSBkb2VzIG5vdCByZXByZXNlbnQKLSAqIG11Y2ggb2YgdGhlIHRvdGFsIHJ1bm5pbmcgdGltZS4gUmVwbGFjaW5nIGl0IHdpdGggYSBtb3JlCi0gKiBzdHJhaWdodGZvcndhcmQgInJlcCBjbXBzYiIgd291bGQgbm90IGRyYXN0aWNhbGx5IGRlZ3JhZGUKLSAqIHBlcmZvcm1hbmNlIC0tIHVucm9sbGluZyBpdCwgZm9yIGV4YW1wbGUsIG1ha2VzIG5vIGRpZmZlcmVuY2UuCi0gKi8KLQotI3VuZGVmIFVTRV9TU0UJLyogd29ya3MsIGJ1dCBpcyA2LTclIHNsb3dlciwgdGhhbiBub24tU1NFLi4uICovCi0KLUxvb3BDbXBzOgotI2lmZGVmIFVTRV9TU0UKLQkJLyogUHJlbG9hZCB0aGUgU1NFIHJlZ2lzdGVycyAqLwotCQltb3ZkcXUJICAoJXdpbmRvd2Jlc3RsZW4sICVyZHgpLCAleG1tMQotCQltb3ZkcXUJICAoJXByZXYsICVyZHgpLCAleG1tMgotCQlwY21wZXFiCSV4bW0yLCAleG1tMQotCQltb3ZkcXUJMTYoJXdpbmRvd2Jlc3RsZW4sICVyZHgpLCAleG1tMwotCQltb3ZkcXUJMTYoJXByZXYsICVyZHgpLCAleG1tNAotCQlwY21wZXFiCSV4bW00LCAleG1tMwotCQltb3ZkcXUJMzIoJXdpbmRvd2Jlc3RsZW4sICVyZHgpLCAleG1tNQotCQltb3ZkcXUJMzIoJXByZXYsICVyZHgpLCAleG1tNgotCQlwY21wZXFiCSV4bW02LCAleG1tNQotCQltb3ZkcXUJNDgoJXdpbmRvd2Jlc3RsZW4sICVyZHgpLCAleG1tNwotCQltb3ZkcXUJNDgoJXByZXYsICVyZHgpLCAleG1tOAotCQlwY21wZXFiCSV4bW04LCAleG1tNwotCi0JCS8qIENoZWNrIHRoZSBjb21wYXJpc2lvbnMnIHJlc3VsdHMgKi8KLQkJcG1vdm1za2IgJXhtbTEsICVyYXgKLQkJbm90dwklYXgKLQkJYnNmdwklYXgsICVheAotCQlqbnoJTGVhdmVMb29wQ21wcwotCQkKLQkJLyogdGhpcyBpcyB0aGUgb25seSBpdGVyYXRpb24gb2YgdGhlIGxvb3Agd2l0aCBhIHBvc3NpYmlsaXR5IG9mIGhhdmluZwotCQkgICBpbmNyZW1lbnRlZCByZHggYnkgMHgxMDggKGVhY2ggbG9vcCBpdGVyYXRpb24gYWRkIDE2KjQgPSAweDQwIAotCQkgICBhbmQgKDB4NDAqNCkrOD0weDEwOCAqLwotCQlhZGQJJDgsICVyZHgKLQkJanogTGVuTWF4aW11bQotCQlhZGQJJDgsICVyZHgKLQotCQkKLQkJcG1vdm1za2IgJXhtbTMsICVyYXgKLQkJbm90dwklYXgKLQkJYnNmdwklYXgsICVheAotCQlqbnoJTGVhdmVMb29wQ21wcwotCQkKLQkJCi0JCWFkZAkkMTYsICVyZHgKLQotCi0JCXBtb3Ztc2tiICV4bW01LCAlcmF4Ci0JCW5vdHcJJWF4Ci0JCWJzZncJJWF4LCAlYXgKLQkJam56CUxlYXZlTG9vcENtcHMKLQkJCi0JCWFkZAkkMTYsICVyZHgKLQotCi0JCXBtb3Ztc2tiICV4bW03LCAlcmF4Ci0JCW5vdHcJJWF4Ci0JCWJzZncJJWF4LCAlYXgKLQkJam56CUxlYXZlTG9vcENtcHMKLQkJCi0JCWFkZAkkMTYsICVyZHgKLQkJCi0JCWptcAlMb29wQ21wcwotTGVhdmVMb29wQ21wczoJYWRkCSVyYXgsICVyZHgKLSNlbHNlCi0JCW1vdgkoJXdpbmRvd2Jlc3RsZW4sICVyZHgpLCAlcmF4Ci0JCXhvcgkoJXByZXYsICVyZHgpLCAlcmF4Ci0JCWpueglMZWF2ZUxvb3BDbXBzCi0JCQotCQltb3YJOCgld2luZG93YmVzdGxlbiwgJXJkeCksICVyYXgKLQkJeG9yCTgoJXByZXYsICVyZHgpLCAlcmF4Ci0JCWpueglMZWF2ZUxvb3BDbXBzOAotCi0JCW1vdgkxNigld2luZG93YmVzdGxlbiwgJXJkeCksICVyYXgKLQkJeG9yCTE2KCVwcmV2LCAlcmR4KSwgJXJheAotCQlqbnoJTGVhdmVMb29wQ21wczE2Ci0JCQkJCi0JCWFkZAkkMjQsICVyZHgKLQkJam56CUxvb3BDbXBzCi0JCWptcAlMZW5NYXhpbXVtCi0jCWlmIDAKLS8qCi0gKiBUaGlzIHRocmVlLWxpbmVyIGlzIHRhbnRhbGl6aW5nbHkgc2ltcGxlLCBidXQgYnNmIGlzIGEgc2xvdyBpbnN0cnVjdGlvbiwKLSAqIGFuZCB0aGUgY29tcGxpY2F0ZWQgYWx0ZXJuYXRpdmUgZG93biBiZWxvdyBpcyBxdWl0ZSBhIGJpdCBmYXN0ZXIuIFNhZC4uLgotICovCi0KLUxlYXZlTG9vcENtcHM6CWJzZgklcmF4LCAlcmF4IC8qIGZpbmQgdGhlIGZpcnN0IG5vbi16ZXJvIGJpdCAqLwotCQlzaHJsCSQzLCAlZWF4IC8qIGRpdmlkZSBieSA4IHRvIGdldCB0aGUgYnl0ZSAqLwotCQlhZGQJJXJheCwgJXJkeAotIwllbHNlCi1MZWF2ZUxvb3BDbXBzMTY6Ci0JCWFkZAkkOCwgJXJkeAotTGVhdmVMb29wQ21wczg6Ci0JCWFkZAkkOCwgJXJkeAotTGVhdmVMb29wQ21wczoJdGVzdGwgICAkMHhGRkZGRkZGRiwgJWVheCAvKiBDaGVjayB0aGUgZmlyc3QgNCBieXRlcyAqLwotCQlqbnogICAgIENoZWNrMTYKLQkJYWRkICAgICAkNCwgJXJkeAotCQlzaHIgICAgICQzMiwgJXJheAotQ2hlY2sxNjogICAgICAgIHRlc3R3ICAgJDB4RkZGRiwgJWF4Ci0JCWpueiAgICAgTGVuTG93ZXIKLQkJYWRkCSQyLCAlcmR4Ci0JCXNocmwJJDE2LCAlZWF4Ci1MZW5Mb3dlcjoJc3ViYgkkMSwgJWFsCi0JCWFkYwkkMCwgJXJkeAotIwllbmRpZgotI2VuZGlmCi0KLS8qIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaC4gSWYgaXQgaXMgbG9uZ2VyIHRoYW4gTUFYX01BVENILAkqLwotLyogdGhlbiBhdXRvbWF0aWNhbGx5IGFjY2VwdCBpdCBhcyB0aGUgYmVzdCBwb3NzaWJsZSBtYXRjaCBhbmQgbGVhdmUuCSovCi0KLQkJbGVhCSglcHJldiwgJXJkeCksICVyYXgKLQkJc3ViCSVzY2FuLCAlcmF4Ci0JCWNtcGwJJE1BWF9NQVRDSCwgJWVheAotCQlqZ2UJTGVuTWF4aW11bQotCi0vKiBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBub3QgbG9uZ2VyIHRoYW4gdGhlIGJlc3QgbWF0Y2ggd2UJKi8KLS8qIGhhdmUgc28gZmFyLCB0aGVuIGZvcmdldCBpdCBhbmQgcmV0dXJuIHRvIHRoZSBsb29rdXAgbG9vcC4JCSovCi0KLQkJY21wbAklYmVzdGxlbmQsICVlYXgKLQkJamcJTG9uZ2VyTWF0Y2gKLQkJbW92CV93aW5kb3diZXN0bGVuLCAld2luZG93YmVzdGxlbgotCQltb3YJZHNQcmV2LCAlcHJldgotCQltb3ZsCV9jaGFpbmxlbndtYXNrLCAlZWR4Ci0JCWptcAlMb29rdXBMb29wCi0KLS8qICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7CQkJCQkqLwotLyogICAgICAgICBiZXN0X2xlbiA9IGxlbjsJCQkJCQkqLwotLyogICAgICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIGJyZWFrOwkJCQkqLwotLyogICAgICAgICBzY2FuX2VuZCA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7CQkJKi8KLQotTG9uZ2VyTWF0Y2g6Ci0JCW1vdmwJJWVheCwgJWJlc3RsZW5kCi0JCW1vdmwJJWN1cm1hdGNoZCwgZHNNYXRjaFN0YXJ0Ci0JCWNtcGwJJW5pY2VtYXRjaCwgJWVheAotCQlqZ2UJTGVhdmVOb3cKLQotCQlsZWEJKCV3aW5kb3csICViZXN0bGVuKSwgJXdpbmRvd2Jlc3RsZW4KLQkJbW92CSV3aW5kb3diZXN0bGVuLCBfd2luZG93YmVzdGxlbgotCi0JCW1vdnp3bAktMSglc2NhbiwgJXJheCksICVzY2FuZW5kCi0JCW1vdglkc1ByZXYsICVwcmV2Ci0JCW1vdmwJX2NoYWlubGVud21hc2ssICVjaGFpbmxlbndtYXNrCi0JCWptcAlMb29rdXBMb29wCi0KLS8qIEFjY2VwdCB0aGUgY3VycmVudCBzdHJpbmcsIHdpdGggdGhlIG1heGltdW0gcG9zc2libGUgbGVuZ3RoLgkJKi8KLQotTGVuTWF4aW11bToKLQkJbW92bAkkTUFYX01BVENILCAlYmVzdGxlbmQKLQkJbW92bAklY3VybWF0Y2hkLCBkc01hdGNoU3RhcnQKLQotLyogaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuICh1SW50KWJlc3RfbGVuOwkJKi8KLS8qIHJldHVybiBzLT5sb29rYWhlYWQ7CQkJCQkJCSovCi0KLUxlYXZlTm93OgotCQltb3ZsCWRzTG9va2FoZWFkLCAlZWF4Ci0JCWNtcGwJJWVheCwgJWJlc3RsZW5kCi0JCWNtb3ZuZ2wJJWJlc3RsZW5kLCAlZWF4Ci1Mb29rYWhlYWRSZXQ6Ci0KLS8qIFJlc3RvcmUgdGhlIHJlZ2lzdGVycyBhbmQgcmV0dXJuIGZyb20gd2hlbmNlIHdlIGNhbWUuCQkJKi8KLQotCW1vdglzYXZlX3JzaSwgJXJzaQotCW1vdglzYXZlX3JieCwgJXJieAotCW1vdglzYXZlX3IxMiwgJXIxMgotCW1vdglzYXZlX3IxMywgJXIxMwotCW1vdglzYXZlX3IxNCwgJXIxNAotCW1vdglzYXZlX3IxNSwgJXIxNQotCi0JcmV0Ci0KLW1hdGNoX2luaXQ6CXJldApkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9hc202ODYvUkVBRE1FLjY4NiBiL3NyYy96bGliL2NvbnRyaWIvYXNtNjg2L1JFQURNRS42ODYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYmYzYmUuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9hc202ODYvUkVBRE1FLjY4NgorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLVRoaXMgaXMgYSBwYXRjaGVkIHZlcnNpb24gb2YgemxpYiwgbW9kaWZpZWQgdG8gdXNlCi1QZW50aXVtLVByby1vcHRpbWl6ZWQgYXNzZW1ibHkgY29kZSBpbiB0aGUgZGVmbGF0aW9uIGFsZ29yaXRobS4gVGhlCi1maWxlcyBjaGFuZ2VkL2FkZGVkIGJ5IHRoaXMgcGF0Y2ggYXJlOgotCi1SRUFETUUuNjg2Ci1tYXRjaC5TCi0KLVRoZSBzcGVlZHVwIHRoYXQgdGhpcyBwYXRjaCBwcm92aWRlcyB2YXJpZXMsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZQotY29tcGlsZXIgdXNlZCB0byBidWlsZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB6bGliIGZhbGxzIGFmb3VsIG9mIHRoZQotUFBybydzIHNwZWVkIHRyYXBzLiBNeSBvd24gdGVzdHMgc2hvdyBhIHNwZWVkdXAgb2YgYXJvdW5kIDEwLTIwJSBhdAotdGhlIGRlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwsIGFuZCAyMC0zMCUgdXNpbmcgLTksIGFnYWluc3QgYSB2ZXJzaW9uCi1jb21waWxlZCB1c2luZyBnY2MgMi43LjIuMy4gWW91ciBtaWxlYWdlIG1heSB2YXJ5LgotCi1Ob3RlIHRoYXQgdGhpcyBjb2RlIGhhcyBiZWVuIHRhaWxvcmVkIGZvciB0aGUgUFByby9QSUkgaW4gcGFydGljdWxhciwKLWFuZCB3aWxsIG5vdCBwZXJmb3JtIHBhcnRpY3Vhcmx5IHdlbGwgb24gYSBQZW50aXVtLgotCi1JZiB5b3UgYXJlIHVzaW5nIGFuIGFzc2VtYmxlciBvdGhlciB0aGFuIEdOVSBhcywgeW91IHdpbGwgaGF2ZSB0bwotdHJhbnNsYXRlIG1hdGNoLlMgdG8gdXNlIHlvdXIgYXNzZW1ibGVyJ3Mgc3ludGF4LiAoSGF2ZSBmdW4uKQotCi1CcmlhbiBSYWl0ZXIKLWJyZWFkYm94QG11cHBldGxhYnMuY29tCi1BcHJpbCwgMTk5OAotCi0KLUFkZGVkIGZvciB6bGliIDEuMS4zOgotCi1UaGUgcGF0Y2hlcyBjb21lIGZyb20KLWh0dHA6Ly93d3cubXVwcGV0bGFicy5jb20vfmJyZWFkYm94L3NvZnR3YXJlL2Fzc2VtYmx5Lmh0bWwKLQotVG8gY29tcGlsZSB6bGliIHdpdGggdGhpcyBhc20gZmlsZSwgY29weSBtYXRjaC5TIHRvIHRoZSB6bGliIGRpcmVjdG9yeQotdGhlbiBkbzoKLQotQ0ZMQUdTPSItTzMgLURBU01WIiAuL2NvbmZpZ3VyZQotbWFrZSBPQkpBPW1hdGNoLm8KLQotCi1VcGRhdGU6Ci0KLUkndmUgYmVlbiBpZ25vcmluZyB0aGVzZSBhc3NlbWJseSByb3V0aW5lcyBmb3IgeWVhcnMsIGJlbGlldmluZyB0aGF0Ci1nY2MncyBnZW5lcmF0ZWQgY29kZSBoYWQgY2F1Z2h0IHVwIHdpdGggaXQgc29tZXRpbWUgYXJvdW5kIGdjYyAyLjk1Ci1hbmQgdGhlIG1ham9yIHJlYXJjaGl0ZWN0aW5nIG9mIHRoZSBQZW50aXVtIDQuIEhvd2V2ZXIsIEkgcmVjZW50bHkKLWxlYXJuZWQgdGhhdCwgZGVzcGl0ZSB3aGF0IEkgYmVsaWV2ZWQsIHRoaXMgY29kZSBzdGlsbCBoYXMgc29tZSBsaWZlCi1pbiBpdC4gT24gdGhlIFBlbnRpdW0gNCBhbmQgQU1ENjQgY2hpcHMsIGl0IGNvbnRpbnVlcyB0byBydW4gYWJvdXQgOCUKLWZhc3RlciB0aGFuIHRoZSBjb2RlIHByb2R1Y2VkIGJ5IGdjYyA0LjEuCi0KLUluIGFja25vd2xlZGdlbWVudCBvZiBpdHMgY29udGludWluZyB1c2VmdWxuZXNzLCBJJ3ZlIGFsdGVyZWQgdGhlCi1saWNlbnNlIHRvIG1hdGNoIHRoYXQgb2YgdGhlIHJlc3Qgb2YgemxpYi4gU2hhcmUgYW5kIEVuam95IQotCi1CcmlhbiBSYWl0ZXIKLWJyZWFkYm94QG11cHBldGxhYnMuY29tCi1BcHJpbCwgMjAwNwpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9hc202ODYvbWF0Y2guUyBiL3NyYy96bGliL2NvbnRyaWIvYXNtNjg2L21hdGNoLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNDIxMDkuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9hc202ODYvbWF0Y2guUworKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKiBtYXRjaC5TIC0tIHg4NiBhc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSB6bGliIGxvbmdlc3RfbWF0Y2goKSBmdW5jdGlvbi4KLSAqIE9wdGltaXplZCBmb3IgdGhlIEludGVsIDY4NiBjaGlwcyAoUFBybyBhbmQgbGF0ZXIpLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCwgMjAwNyBCcmlhbiBSYWl0ZXIgPGJyZWFkYm94QG11cHBldGxhYnMuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvciBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0gKgotICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0gKgotICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KLSAqLwotCi0jaWZuZGVmIE5PX1VOREVSTElORQotI2RlZmluZQltYXRjaF9pbml0CV9tYXRjaF9pbml0Ci0jZGVmaW5lCWxvbmdlc3RfbWF0Y2gJX2xvbmdlc3RfbWF0Y2gKLSNlbmRpZgotCi0jZGVmaW5lCU1BWF9NQVRDSAkoMjU4KQotI2RlZmluZQlNSU5fTUFUQ0gJKDMpCi0jZGVmaW5lCU1JTl9MT09LQUhFQUQJKE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDEpCi0jZGVmaW5lCU1BWF9NQVRDSF84CSgoTUFYX01BVENIICsgNykgJiB+NykKLQotLyogc3RhY2sgZnJhbWUgb2Zmc2V0cyAqLwotCi0jZGVmaW5lCWNoYWlubGVud21hc2sJCTAJLyogaGlnaCB3b3JkOiBjdXJyZW50IGNoYWluIGxlbgkqLwotCQkJCQkvKiBsb3cgd29yZDogcy0+d21hc2sJCSovCi0jZGVmaW5lCXdpbmRvdwkJCTQJLyogbG9jYWwgY29weSBvZiBzLT53aW5kb3cJKi8KLSNkZWZpbmUJd2luZG93YmVzdGxlbgkJOAkvKiBzLT53aW5kb3cgKyBiZXN0bGVuCQkqLwotI2RlZmluZQlzY2Fuc3RhcnQJCTE2CS8qIGZpcnN0IHR3byBieXRlcyBvZiBzdHJpbmcJKi8KLSNkZWZpbmUJc2NhbmVuZAkJCTEyCS8qIGxhc3QgdHdvIGJ5dGVzIG9mIHN0cmluZwkqLwotI2RlZmluZQlzY2FuYWxpZ24JCTIwCS8qIGR3b3JkLW1pc2FsaWdubWVudCBvZiBzdHJpbmcJKi8KLSNkZWZpbmUJbmljZW1hdGNoCQkyNAkvKiBhIGdvb2QgZW5vdWdoIG1hdGNoIHNpemUJKi8KLSNkZWZpbmUJYmVzdGxlbgkJCTI4CS8qIHNpemUgb2YgYmVzdCBtYXRjaCBzbyBmYXIJKi8KLSNkZWZpbmUJc2NhbgkJCTMyCS8qIHB0ciB0byBzdHJpbmcgd2FudGluZyBtYXRjaAkqLwotCi0jZGVmaW5lCUxvY2FsVmFyc1NpemUJCSgzNikKLS8qCXNhdmVkIGVieAkJMzYgKi8KLS8qCXNhdmVkIGVkaQkJNDAgKi8KLS8qCXNhdmVkIGVzaQkJNDQgKi8KLS8qCXNhdmVkIGVicAkJNDggKi8KLS8qCXJldHVybiBhZGRyZXNzCQk1MiAqLwotI2RlZmluZQlkZWZsYXRlc3RhdGUJCTU2CS8qIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMJKi8KLSNkZWZpbmUJY3VybWF0Y2gJCTYwCi0KLS8qIEFsbCB0aGUgK3psaWIxMjIyYWRkIG9mZnNldHMgYXJlIGR1ZSB0byB0aGUgYWRkaXRpb24gb2YgZmllbGRzCi0gKiAgaW4gemxpYiBpbiB0aGUgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgc2luY2UgdGhlIGFzbSBjb2RlIHdhcyBmaXJzdCB3cml0dGVuCi0gKiAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMC40IG9yIG9sZGVyLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAoLTQpIikuCi0gKiAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIGJldHdlZW4gMS4wLjUgYW5kIDEuMi4yLjEsIHVzZSAiemxpYjEyMjJhZGQgZXF1IDAiKS4KLSAqIGlmIHlvdSBjb21waWxlIHdpdGggemxpYiAxLjIuMi4yIG9yIGxhdGVyICwgdXNlICJ6bGliMTIyMmFkZCBlcXUgOCIpLgotICovCi0KLSNkZWZpbmUgemxpYjEyMjJhZGQJCSg4KQotCi0jZGVmaW5lCWRzV1NpemUJCQkoMzYremxpYjEyMjJhZGQpCi0jZGVmaW5lCWRzV01hc2sJCQkoNDQremxpYjEyMjJhZGQpCi0jZGVmaW5lCWRzV2luZG93CQkoNDgremxpYjEyMjJhZGQpCi0jZGVmaW5lCWRzUHJldgkJCSg1Nit6bGliMTIyMmFkZCkKLSNkZWZpbmUJZHNNYXRjaExlbgkJKDg4K3psaWIxMjIyYWRkKQotI2RlZmluZQlkc1ByZXZNYXRjaAkJKDkyK3psaWIxMjIyYWRkKQotI2RlZmluZQlkc1N0clN0YXJ0CQkoMTAwK3psaWIxMjIyYWRkKQotI2RlZmluZQlkc01hdGNoU3RhcnQJCSgxMDQremxpYjEyMjJhZGQpCi0jZGVmaW5lCWRzTG9va2FoZWFkCQkoMTA4K3psaWIxMjIyYWRkKQotI2RlZmluZQlkc1ByZXZMZW4JCSgxMTIremxpYjEyMjJhZGQpCi0jZGVmaW5lCWRzTWF4Q2hhaW5MZW4JCSgxMTYremxpYjEyMjJhZGQpCi0jZGVmaW5lCWRzR29vZE1hdGNoCQkoMTMyK3psaWIxMjIyYWRkKQotI2RlZmluZQlkc05pY2VNYXRjaAkJKDEzNit6bGliMTIyMmFkZCkKLQotCi0uZmlsZSAibWF0Y2guUyIKLQotLmdsb2JsCW1hdGNoX2luaXQsIGxvbmdlc3RfbWF0Y2gKLQotLnRleHQKLQotLyogdUludCBsb25nZXN0X21hdGNoKGRlZmxhdGVfc3RhdGUgKmRlZmxhdGVzdGF0ZSwgSVBvcyBjdXJtYXRjaCkgKi8KLS5jZmlfc2VjdGlvbnMJLmRlYnVnX2ZyYW1lCi0KLWxvbmdlc3RfbWF0Y2g6Ci0KLS5jZmlfc3RhcnRwcm9jCi0vKiBTYXZlIHJlZ2lzdGVycyB0aGF0IHRoZSBjb21waWxlciBtYXkgYmUgdXNpbmcsIGFuZCBhZGp1c3QgJWVzcCB0bwkqLwotLyogbWFrZSByb29tIGZvciBvdXIgc3RhY2sgZnJhbWUuCQkJCQkqLwotCi0JCXB1c2hsCSVlYnAKLQkJLmNmaV9kZWZfY2ZhX29mZnNldCA4Ci0JCS5jZmlfb2Zmc2V0IGVicCwgLTgKLQkJcHVzaGwJJWVkaQotCQkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDEyCi0JCXB1c2hsCSVlc2kKLQkJLmNmaV9kZWZfY2ZhX29mZnNldCAxNgotCQlwdXNobAklZWJ4Ci0JCS5jZmlfZGVmX2NmYV9vZmZzZXQgMjAKLQkJc3VibAkkTG9jYWxWYXJzU2l6ZSwgJWVzcAotCQkuY2ZpX2RlZl9jZmFfb2Zmc2V0IExvY2FsVmFyc1NpemUrMjAKLQotLyogUmV0cmlldmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gJWVjeCB3aWxsIGhvbGQgY3VyX21hdGNoCQkqLwotLyogdGhyb3VnaG91dCB0aGUgZW50aXJlIGZ1bmN0aW9uLiAlZWR4IHdpbGwgaG9sZCB0aGUgcG9pbnRlciB0byB0aGUJKi8KLS8qIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIGR1cmluZyB0aGUgZnVuY3Rpb24ncyBzZXR1cCAoYmVmb3JlCQkqLwotLyogZW50ZXJpbmcgdGhlIG1haW4gbG9vcCkuCQkJCQkJKi8KLQotCQltb3ZsCWRlZmxhdGVzdGF0ZSglZXNwKSwgJWVkeAotCQltb3ZsCWN1cm1hdGNoKCVlc3ApLCAlZWN4Ci0KLS8qIHVJbnQgd21hc2sgPSBzLT53X21hc2s7CQkJCQkJKi8KLS8qIHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7CQkJCSovCi0vKiBpZiAocy0+cHJldl9sZW5ndGggPj0gcy0+Z29vZF9tYXRjaCkgewkJCQkqLwotLyogICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsJCQkJCQkqLwotLyogfQkJCQkJCQkJCSovCi0gCi0JCW1vdmwJZHNQcmV2TGVuKCVlZHgpLCAlZWF4Ci0JCW1vdmwJZHNHb29kTWF0Y2goJWVkeCksICVlYngKLQkJY21wbAklZWJ4LCAlZWF4Ci0JCW1vdmwJZHNXTWFzayglZWR4KSwgJWVheAotCQltb3ZsCWRzTWF4Q2hhaW5MZW4oJWVkeCksICVlYngKLQkJamwJTGFzdE1hdGNoR29vZAotCQlzaHJsCSQyLCAlZWJ4Ci1MYXN0TWF0Y2hHb29kOgotCi0vKiBjaGFpbmxlbiBpcyBkZWNyZW1lbnRlZCBvbmNlIGJlZm9yZWhhbmQgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuCSovCi0vKiB1c2UgdGhlIHNpZ24gZmxhZyBpbnN0ZWFkIG9mIHRoZSB6ZXJvIGZsYWcgZm9yIHRoZSBleGl0IHRlc3QuCSovCi0vKiBJdCBpcyB0aGVuIHNoaWZ0ZWQgaW50byB0aGUgaGlnaCB3b3JkLCB0byBtYWtlIHJvb20gZm9yIHRoZSB3bWFzawkqLwotLyogdmFsdWUsIHdoaWNoIGl0IHdpbGwgYWx3YXlzIGFjY29tcGFueS4JCQkJKi8KLQotCQlkZWNsCSVlYngKLQkJc2hsbAkkMTYsICVlYngKLQkJb3JsCSVlYXgsICVlYngKLQkJbW92bAklZWJ4LCBjaGFpbmxlbndtYXNrKCVlc3ApCi0KLS8qIGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOwkqLwotCi0JCW1vdmwJZHNOaWNlTWF0Y2goJWVkeCksICVlYXgKLQkJbW92bAlkc0xvb2thaGVhZCglZWR4KSwgJWVieAotCQljbXBsCSVlYXgsICVlYngKLQkJamwJTG9va2FoZWFkTGVzcwotCQltb3ZsCSVlYXgsICVlYngKLUxvb2thaGVhZExlc3M6CW1vdmwJJWVieCwgbmljZW1hdGNoKCVlc3ApCi0KLS8qIHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7CQkJKi8KLQotCQltb3ZsCWRzV2luZG93KCVlZHgpLCAlZXNpCi0JCW1vdmwJJWVzaSwgd2luZG93KCVlc3ApCi0JCW1vdmwJZHNTdHJTdGFydCglZWR4KSwgJWVicAotCQlsZWEJKCVlc2ksJWVicCksICVlZGkKLQkJbW92bAklZWRpLCBzY2FuKCVlc3ApCi0KLS8qIERldGVybWluZSBob3cgbWFueSBieXRlcyB0aGUgc2NhbiBwdHIgaXMgb2ZmIGZyb20gYmVpbmcJCSovCi0vKiBkd29yZC1hbGlnbmVkLgkJCQkJCQkqLwotCi0JCW1vdmwJJWVkaSwgJWVheAotCQluZWdsCSVlYXgKLQkJYW5kbAkkMywgJWVheAotCQltb3ZsCSVlYXgsIHNjYW5hbGlnbiglZXNwKQotCi0vKiBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/CQkJKi8KLS8qICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOwkJCQkqLwotCi0JCW1vdmwJZHNXU2l6ZSglZWR4KSwgJWVheAotCQlzdWJsCSRNSU5fTE9PS0FIRUFELCAlZWF4Ci0JCXN1YmwJJWVheCwgJWVicAotCQlqZwlMaW1pdFBvc2l0aXZlCi0JCXhvcmwJJWVicCwgJWVicAotTGltaXRQb3NpdGl2ZToKLQotLyogaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7CQkJCQkqLwotCi0JCW1vdmwJZHNQcmV2TGVuKCVlZHgpLCAlZWF4Ci0JCW1vdmwJJWVheCwgYmVzdGxlbiglZXNwKQotCi0vKiBTdG9yZSB0aGUgc3VtIG9mIHMtPndpbmRvdyArIGJlc3RfbGVuIGluICVlc2kgbG9jYWxseSwgYW5kIGluICVlc2kuCSovCi0KLQkJYWRkbAklZWF4LCAlZXNpCi0JCW1vdmwJJWVzaSwgd2luZG93YmVzdGxlbiglZXNwKQotCi0vKiByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsJCQkJKi8KLS8qIHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsJCQkqLwotLyogUG9zZiAqcHJldiA9IHMtPnByZXY7CQkJCQkJKi8KLQotCQltb3Z6d2wJKCVlZGkpLCAlZWJ4Ci0JCW1vdmwJJWVieCwgc2NhbnN0YXJ0KCVlc3ApCi0JCW1vdnp3bAktMSglZWRpLCVlYXgpLCAlZWJ4Ci0JCW1vdmwJJWVieCwgc2NhbmVuZCglZXNwKQotCQltb3ZsCWRzUHJldiglZWR4KSwgJWVkaQotCi0vKiBKdW1wIGludG8gdGhlIG1haW4gbG9vcC4JCQkJCQkqLwotCi0JCW1vdmwJY2hhaW5sZW53bWFzayglZXNwKSwgJWVkeAotCQlqbXAJTG9vcEVudHJ5Ci0KLS5iYWxpZ24gMTYKLQotLyogZG8gewotICogICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOwotICogICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fAotICogICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOwotICogICAgIFsuLi5dCi0gKiB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQKLSAqICAgICAgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOwotICoKLSAqIEhlcmUgaXMgdGhlIGlubmVyIGxvb3Agb2YgdGhlIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBzcGVuZCB0aGUKLSAqIG1ham9yaXR5IG9mIGl0cyB0aW1lIGluIHRoaXMgbG9vcCwgYW5kIG1ham9yaXR5IG9mIHRoYXQgdGltZSB3aWxsCi0gKiBiZSBzcGVudCBpbiB0aGUgZmlyc3QgdGVuIGluc3RydWN0aW9ucy4KLSAqCi0gKiBXaXRoaW4gdGhpcyBsb29wOgotICogJWVieCA9IHNjYW5lbmQKLSAqICVlY3ggPSBjdXJtYXRjaAotICogJWVkeCA9IGNoYWlubGVud21hc2sgLSBpLmUuLCAoKGNoYWlubGVuIDw8IDE2KSB8IHdtYXNrKQotICogJWVzaSA9IHdpbmRvd2Jlc3RsZW4gLSBpLmUuLCAod2luZG93ICsgYmVzdGxlbikKLSAqICVlZGkgPSBwcmV2Ci0gKiAlZWJwID0gbGltaXQKLSAqLwotTG9va3VwTG9vcDoKLQkJYW5kbAklZWR4LCAlZWN4Ci0JCW1vdnp3bAkoJWVkaSwlZWN4LDIpLCAlZWN4Ci0JCWNtcGwJJWVicCwgJWVjeAotCQlqYmUJTGVhdmVOb3cKLQkJc3VibAkkMHgwMDAxMDAwMCwgJWVkeAotCQlqcwlMZWF2ZU5vdwotTG9vcEVudHJ5Ogltb3Z6d2wJLTEoJWVzaSwlZWN4KSwgJWVheAotCQljbXBsCSVlYngsICVlYXgKLQkJam56CUxvb2t1cExvb3AKLQkJbW92bAl3aW5kb3coJWVzcCksICVlYXgKLQkJbW92endsCSglZWF4LCVlY3gpLCAlZWF4Ci0JCWNtcGwJc2NhbnN0YXJ0KCVlc3ApLCAlZWF4Ci0JCWpueglMb29rdXBMb29wCi0KLS8qIFN0b3JlIHRoZSBjdXJyZW50IHZhbHVlIG9mIGNoYWlubGVuLgkJCQkJKi8KLQotCQltb3ZsCSVlZHgsIGNoYWlubGVud21hc2soJWVzcCkKLQotLyogUG9pbnQgJWVkaSB0byB0aGUgc3RyaW5nIHVuZGVyIHNjcnV0aW55LCBhbmQgJWVzaSB0byB0aGUgc3RyaW5nIHdlCSovCi0vKiBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgJWVzaSBhbmQgJWVkaSBhcmUJKi8KLS8qIGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgJWVkeCBpcwkqLwotLyogaW5pdGlhbGl6ZWQgdG8gLShNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikuCQkJCSovCi0KLQkJbW92bAl3aW5kb3coJWVzcCksICVlc2kKLQkJbW92bAlzY2FuKCVlc3ApLCAlZWRpCi0JCWFkZGwJJWVjeCwgJWVzaQotCQltb3ZsCXNjYW5hbGlnbiglZXNwKSwgJWVheAotCQltb3ZsCSQoLU1BWF9NQVRDSF84KSwgJWVkeAotCQlsZWEJTUFYX01BVENIXzgoJWVkaSwlZWF4KSwgJWVkaQotCQlsZWEJTUFYX01BVENIXzgoJWVzaSwlZWF4KSwgJWVzaQotCi0vKiBUZXN0IHRoZSBzdHJpbmdzIGZvciBlcXVhbGl0eSwgOCBieXRlcyBhdCBhIHRpbWUuIEF0IHRoZSBlbmQsCi0gKiBhZGp1c3QgJWVkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuCi0gKgotICogV2UgYWxyZWFkeSBrbm93IGF0IHRoaXMgcG9pbnQgdGhhdCB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMgb2YgdGhlCi0gKiBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlCi0gKiBzdGFydGluZyB0aGUgY29tcGFyZSBsb29wLiBTbyB3aGF0IHRoaXMgY29kZSBkb2VzIGlzIHNraXAgb3ZlciAwLTMKLSAqIGJ5dGVzLCBhcyBtdWNoIGFzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBkd29yZC1hbGlnbiB0aGUgJWVkaQotICogcG9pbnRlci4gKCVlc2kgd2lsbCBzdGlsbCBiZSBtaXNhbGlnbmVkIHRocmVlIHRpbWVzIG91dCBvZiBmb3VyLikKLSAqCi0gKiBJdCBzaG91bGQgYmUgY29uZmVzc2VkIHRoYXQgdGhpcyBsb29wIHVzdWFsbHkgZG9lcyBub3QgcmVwcmVzZW50Ci0gKiBtdWNoIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUuIFJlcGxhY2luZyBpdCB3aXRoIGEgbW9yZQotICogc3RyYWlnaHRmb3J3YXJkICJyZXAgY21wc2IiIHdvdWxkIG5vdCBkcmFzdGljYWxseSBkZWdyYWRlCi0gKiBwZXJmb3JtYW5jZS4KLSAqLwotTG9vcENtcHM6Ci0JCW1vdmwJKCVlc2ksJWVkeCksICVlYXgKLQkJeG9ybAkoJWVkaSwlZWR4KSwgJWVheAotCQlqbnoJTGVhdmVMb29wQ21wcwotCQltb3ZsCTQoJWVzaSwlZWR4KSwgJWVheAotCQl4b3JsCTQoJWVkaSwlZWR4KSwgJWVheAotCQlqbnoJTGVhdmVMb29wQ21wczQKLQkJYWRkbAkkOCwgJWVkeAotCQlqbnoJTG9vcENtcHMKLQkJam1wCUxlbk1heGltdW0KLUxlYXZlTG9vcENtcHM0OglhZGRsCSQ0LCAlZWR4Ci1MZWF2ZUxvb3BDbXBzOgl0ZXN0bAkkMHgwMDAwRkZGRiwgJWVheAotCQlqbnoJTGVuTG93ZXIKLQkJYWRkbAkkMiwgJWVkeAotCQlzaHJsCSQxNiwgJWVheAotTGVuTG93ZXI6CXN1YmIJJDEsICVhbAotCQlhZGNsCSQwLCAlZWR4Ci0KLS8qIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaC4gSWYgaXQgaXMgbG9uZ2VyIHRoYW4gTUFYX01BVENILAkqLwotLyogdGhlbiBhdXRvbWF0aWNhbGx5IGFjY2VwdCBpdCBhcyB0aGUgYmVzdCBwb3NzaWJsZSBtYXRjaCBhbmQgbGVhdmUuCSovCi0KLQkJbGVhCSglZWRpLCVlZHgpLCAlZWF4Ci0JCW1vdmwJc2NhbiglZXNwKSwgJWVkaQotCQlzdWJsCSVlZGksICVlYXgKLQkJY21wbAkkTUFYX01BVENILCAlZWF4Ci0JCWpnZQlMZW5NYXhpbXVtCi0KLS8qIElmIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIG5vdCBsb25nZXIgdGhhbiB0aGUgYmVzdCBtYXRjaCB3ZQkqLwotLyogaGF2ZSBzbyBmYXIsIHRoZW4gZm9yZ2V0IGl0IGFuZCByZXR1cm4gdG8gdGhlIGxvb2t1cCBsb29wLgkJKi8KLQotCQltb3ZsCWRlZmxhdGVzdGF0ZSglZXNwKSwgJWVkeAotCQltb3ZsCWJlc3RsZW4oJWVzcCksICVlYngKLQkJY21wbAklZWJ4LCAlZWF4Ci0JCWpnCUxvbmdlck1hdGNoCi0JCW1vdmwJd2luZG93YmVzdGxlbiglZXNwKSwgJWVzaQotCQltb3ZsCWRzUHJldiglZWR4KSwgJWVkaQotCQltb3ZsCXNjYW5lbmQoJWVzcCksICVlYngKLQkJbW92bAljaGFpbmxlbndtYXNrKCVlc3ApLCAlZWR4Ci0JCWptcAlMb29rdXBMb29wCi0KLS8qICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7CQkJCQkqLwotLyogICAgICAgICBiZXN0X2xlbiA9IGxlbjsJCQkJCQkqLwotLyogICAgICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIGJyZWFrOwkJCQkqLwotLyogICAgICAgICBzY2FuX2VuZCA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7CQkJKi8KLQotTG9uZ2VyTWF0Y2g6CW1vdmwJbmljZW1hdGNoKCVlc3ApLCAlZWJ4Ci0JCW1vdmwJJWVheCwgYmVzdGxlbiglZXNwKQotCQltb3ZsCSVlY3gsIGRzTWF0Y2hTdGFydCglZWR4KQotCQljbXBsCSVlYngsICVlYXgKLQkJamdlCUxlYXZlTm93Ci0JCW1vdmwJd2luZG93KCVlc3ApLCAlZXNpCi0JCWFkZGwJJWVheCwgJWVzaQotCQltb3ZsCSVlc2ksIHdpbmRvd2Jlc3RsZW4oJWVzcCkKLQkJbW92endsCS0xKCVlZGksJWVheCksICVlYngKLQkJbW92bAlkc1ByZXYoJWVkeCksICVlZGkKLQkJbW92bAklZWJ4LCBzY2FuZW5kKCVlc3ApCi0JCW1vdmwJY2hhaW5sZW53bWFzayglZXNwKSwgJWVkeAotCQlqbXAJTG9va3VwTG9vcAotCi0vKiBBY2NlcHQgdGhlIGN1cnJlbnQgc3RyaW5nLCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aC4JCSovCi0KLUxlbk1heGltdW06CW1vdmwJZGVmbGF0ZXN0YXRlKCVlc3ApLCAlZWR4Ci0JCW1vdmwJJE1BWF9NQVRDSCwgYmVzdGxlbiglZXNwKQotCQltb3ZsCSVlY3gsIGRzTWF0Y2hTdGFydCglZWR4KQotCi0vKiBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47CQkqLwotLyogcmV0dXJuIHMtPmxvb2thaGVhZDsJCQkJCQkJKi8KLQotTGVhdmVOb3c6Ci0JCW1vdmwJZGVmbGF0ZXN0YXRlKCVlc3ApLCAlZWR4Ci0JCW1vdmwJYmVzdGxlbiglZXNwKSwgJWVieAotCQltb3ZsCWRzTG9va2FoZWFkKCVlZHgpLCAlZWF4Ci0JCWNtcGwJJWVheCwgJWVieAotCQlqZwlMb29rYWhlYWRSZXQKLQkJbW92bAklZWJ4LCAlZWF4Ci1Mb29rYWhlYWRSZXQ6Ci0KLS8qIFJlc3RvcmUgdGhlIHN0YWNrIGFuZCByZXR1cm4gZnJvbSB3aGVuY2Ugd2UgY2FtZS4JCQkqLwotCi0JCWFkZGwJJExvY2FsVmFyc1NpemUsICVlc3AKLQkJLmNmaV9kZWZfY2ZhX29mZnNldCAyMAotCQlwb3BsCSVlYngKLQkJLmNmaV9kZWZfY2ZhX29mZnNldCAxNgotCQlwb3BsCSVlc2kKLQkJLmNmaV9kZWZfY2ZhX29mZnNldCAxMgotCQlwb3BsCSVlZGkKLQkJLmNmaV9kZWZfY2ZhX29mZnNldCA4Ci0JCXBvcGwJJWVicAotCQkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDQKLS5jZmlfZW5kcHJvYwotbWF0Y2hfaW5pdDoJcmV0CmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2JsYXN0L01ha2VmaWxlIGIvc3JjL3psaWIvY29udHJpYi9ibGFzdC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJlODBiYS4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL2JsYXN0L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1ibGFzdDogYmxhc3QuYyBibGFzdC5oCi0JY2MgLURURVNUIC1vIGJsYXN0IGJsYXN0LmMKLQotdGVzdDogYmxhc3QKLQlibGFzdCA8IHRlc3QucGsgfCBjbXAgLSB0ZXN0LnR4dAotCi1jbGVhbjoKLQlybSAtZiBibGFzdCBibGFzdC5vCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2JsYXN0L1JFQURNRSBiL3NyYy96bGliL2NvbnRyaWIvYmxhc3QvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2E2MGIzLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvYmxhc3QvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1SZWFkIGJsYXN0LmggZm9yIHB1cnBvc2UgYW5kIHVzYWdlLgotCi1NYXJrIEFkbGVyCi1tYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2JsYXN0L2JsYXN0LmMgYi9zcmMvemxpYi9jb250cmliL2JsYXN0L2JsYXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZTY5N2EuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9ibGFzdC9ibGFzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ0ICswLDAgQEAKLS8qIGJsYXN0LmMKLSAqIENvcHlyaWdodCAoQykgMjAwMyBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gYmxhc3QuaAotICogdmVyc2lvbiAxLjEsIDE2IEZlYiAyMDAzCi0gKgotICogYmxhc3QuYyBkZWNvbXByZXNzZXMgZGF0YSBjb21wcmVzc2VkIGJ5IHRoZSBQS1dhcmUgQ29tcHJlc3Npb24gTGlicmFyeS4KLSAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBzaW1pbGFyIHRvIHRoZSBleHBsb2RlKCkgZnVuY3Rpb24gb2YKLSAqIHRoZSBQS1dhcmUgbGlicmFyeSwgaGVuY2UgdGhlIG5hbWUgImJsYXN0Ii4KLSAqCi0gKiBUaGlzIGRlY29tcHJlc3NvciBpcyBiYXNlZCBvbiB0aGUgZXhjZWxsZW50IGZvcm1hdCBkZXNjcmlwdGlvbiBwcm92aWRlZCBieQotICogQmVuIFJ1ZGlhay1Hb3VsZCBpbiBjb21wLmNvbXByZXNzaW9uIG9uIEF1Z3VzdCAxMywgMjAwMS4gIEludGVyZXN0aW5nbHksIHRoZQotICogZXhhbXBsZSBCZW4gcHJvdmlkZWQgaW4gdGhlIHBvc3QgaXMgaW5jb3JyZWN0LiAgVGhlIGRpc3RhbmNlIDExMDAwMSBzaG91bGQKLSAqIGluc3RlYWQgYmUgMTExMDAwLiAgV2hlbiBjb3JyZWN0ZWQsIHRoZSBleGFtcGxlIGJ5dGUgc3RyZWFtIGJlY29tZXM6Ci0gKgotICogICAgMDAgMDQgODIgMjQgMjUgOGYgODAgN2YKLSAqCi0gKiB3aGljaCBkZWNvbXByZXNzZXMgdG8gIkFJQUlBSUFJQUlBSUEiICh3aXRob3V0IHRoZSBxdW90ZXMpLgotICovCi0KLS8qCi0gKiBDaGFuZ2UgaGlzdG9yeToKLSAqCi0gKiAxLjAgIDEyIEZlYiAyMDAzICAgICAtIEZpcnN0IHZlcnNpb24KLSAqIDEuMSAgMTYgRmViIDIwMDMgICAgIC0gRml4ZWQgZGlzdGFuY2UgY2hlY2sgZm9yID4gNCBHQiB1bmNvbXByZXNzZWQgZGF0YQotICovCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4gICAgICAgICAgICAgLyogZm9yIHNldGptcCgpLCBsb25nam1wKCksIGFuZCBqbXBfYnVmICovCi0jaW5jbHVkZSAiYmxhc3QuaCIgICAgICAgICAgICAgIC8qIHByb3RvdHlwZSBmb3IgYmxhc3QoKSAqLwotCi0jZGVmaW5lIGxvY2FsIHN0YXRpYyAgICAgICAgICAgIC8qIGZvciBsb2NhbCBmdW5jdGlvbiBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBNQVhCSVRTIDEzICAgICAgICAgICAgICAvKiBtYXhpbXVtIGNvZGUgbGVuZ3RoICovCi0jZGVmaW5lIE1BWFdJTiA0MDk2ICAgICAgICAgICAgIC8qIG1heGltdW0gd2luZG93IHNpemUgKi8KLQotLyogaW5wdXQgYW5kIG91dHB1dCBzdGF0ZSAqLwotc3RydWN0IHN0YXRlIHsKLSAgICAvKiBpbnB1dCBzdGF0ZSAqLwotICAgIGJsYXN0X2luIGluZnVuOyAgICAgICAgICAgICAvKiBpbnB1dCBmdW5jdGlvbiBwcm92aWRlZCBieSB1c2VyICovCi0gICAgdm9pZCAqaW5ob3c7ICAgICAgICAgICAgICAgIC8qIG9wYXF1ZSBpbmZvcm1hdGlvbiBwYXNzZWQgdG8gaW5mdW4oKSAqLwotICAgIHVuc2lnbmVkIGNoYXIgKmluOyAgICAgICAgICAvKiBuZXh0IGlucHV0IGxvY2F0aW9uICovCi0gICAgdW5zaWduZWQgbGVmdDsgICAgICAgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCBhdCBpbiAqLwotICAgIGludCBiaXRidWY7ICAgICAgICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCi0gICAgaW50IGJpdGNudDsgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGJpdCBidWZmZXIgKi8KLQotICAgIC8qIGlucHV0IGxpbWl0IGVycm9yIHJldHVybiBzdGF0ZSBmb3IgYml0cygpIGFuZCBkZWNvZGUoKSAqLwotICAgIGptcF9idWYgZW52OwotCi0gICAgLyogb3V0cHV0IHN0YXRlICovCi0gICAgYmxhc3Rfb3V0IG91dGZ1bjsgICAgICAgICAgIC8qIG91dHB1dCBmdW5jdGlvbiBwcm92aWRlZCBieSB1c2VyICovCi0gICAgdm9pZCAqb3V0aG93OyAgICAgICAgICAgICAgIC8qIG9wYXF1ZSBpbmZvcm1hdGlvbiBwYXNzZWQgdG8gb3V0ZnVuKCkgKi8KLSAgICB1bnNpZ25lZCBuZXh0OyAgICAgICAgICAgICAgLyogaW5kZXggb2YgbmV4dCB3cml0ZSBsb2NhdGlvbiBpbiBvdXRbXSAqLwotICAgIGludCBmaXJzdDsgICAgICAgICAgICAgICAgICAvKiB0cnVlIHRvIGNoZWNrIGRpc3RhbmNlcyAoZm9yIGZpcnN0IDRLKSAqLwotICAgIHVuc2lnbmVkIGNoYXIgb3V0W01BWFdJTl07ICAvKiBvdXRwdXQgYnVmZmVyIGFuZCBzbGlkaW5nIHdpbmRvdyAqLwotfTsKLQotLyoKLSAqIFJldHVybiBuZWVkIGJpdHMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAgVGhpcyBhbHdheXMgbGVhdmVzIGxlc3MgdGhhbgotICogZWlnaHQgYml0cyBpbiB0aGUgYnVmZmVyLiAgYml0cygpIHdvcmtzIHByb3Blcmx5IGZvciBuZWVkID09IDAuCi0gKgotICogRm9ybWF0IG5vdGVzOgotICoKLSAqIC0gQml0cyBhcmUgc3RvcmVkIGluIGJ5dGVzIGZyb20gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgbW9zdAotICogICBzaWduaWZpY2FudCBiaXQuICBUaGVyZWZvcmUgYml0cyBhcmUgZHJvcHBlZCBmcm9tIHRoZSBib3R0b20gb2YgdGhlIGJpdAotICogICBidWZmZXIsIHVzaW5nIHNoaWZ0IHJpZ2h0LCBhbmQgbmV3IGJ5dGVzIGFyZSBhcHBlbmRlZCB0byB0aGUgdG9wIG9mIHRoZQotICogICBiaXQgYnVmZmVyLCB1c2luZyBzaGlmdCBsZWZ0LgotICovCi1sb2NhbCBpbnQgYml0cyhzdHJ1Y3Qgc3RhdGUgKnMsIGludCBuZWVkKQotewotICAgIGludCB2YWw7ICAgICAgICAgICAgLyogYml0IGFjY3VtdWxhdG9yICovCi0KLSAgICAvKiBsb2FkIGF0IGxlYXN0IG5lZWQgYml0cyBpbnRvIHZhbCAqLwotICAgIHZhbCA9IHMtPmJpdGJ1ZjsKLSAgICB3aGlsZSAocy0+Yml0Y250IDwgbmVlZCkgewotICAgICAgICBpZiAocy0+bGVmdCA9PSAwKSB7Ci0gICAgICAgICAgICBzLT5sZWZ0ID0gcy0+aW5mdW4ocy0+aW5ob3csICYocy0+aW4pKTsKLSAgICAgICAgICAgIGlmIChzLT5sZWZ0ID09IDApIGxvbmdqbXAocy0+ZW52LCAxKTsgICAgICAgLyogb3V0IG9mIGlucHV0ICovCi0gICAgICAgIH0KLSAgICAgICAgdmFsIHw9IChpbnQpKCoocy0+aW4pKyspIDw8IHMtPmJpdGNudDsgICAgICAgICAgLyogbG9hZCBlaWdodCBiaXRzICovCi0gICAgICAgIHMtPmxlZnQtLTsKLSAgICAgICAgcy0+Yml0Y250ICs9IDg7Ci0gICAgfQotCi0gICAgLyogZHJvcCBuZWVkIGJpdHMgYW5kIHVwZGF0ZSBidWZmZXIsIGFsd2F5cyB6ZXJvIHRvIHNldmVuIGJpdHMgbGVmdCAqLwotICAgIHMtPmJpdGJ1ZiA9IHZhbCA+PiBuZWVkOwotICAgIHMtPmJpdGNudCAtPSBuZWVkOwotCi0gICAgLyogcmV0dXJuIG5lZWQgYml0cywgemVyb2luZyB0aGUgYml0cyBhYm92ZSB0aGF0ICovCi0gICAgcmV0dXJuIHZhbCAmICgoMSA8PCBuZWVkKSAtIDEpOwotfQotCi0vKgotICogSHVmZm1hbiBjb2RlIGRlY29kaW5nIHRhYmxlcy4gIGNvdW50WzEuLk1BWEJJVFNdIGlzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBvZgotICogZWFjaCBsZW5ndGgsIHdoaWNoIGZvciBhIGNhbm9uaWNhbCBjb2RlIGFyZSBzdGVwcGVkIHRocm91Z2ggaW4gb3JkZXIuCi0gKiBzeW1ib2xbXSBhcmUgdGhlIHN5bWJvbCB2YWx1ZXMgaW4gY2Fub25pY2FsIG9yZGVyLCB3aGVyZSB0aGUgbnVtYmVyIG9mCi0gKiBlbnRyaWVzIGlzIHRoZSBzdW0gb2YgdGhlIGNvdW50cyBpbiBjb3VudFtdLiAgVGhlIGRlY29kaW5nIHByb2Nlc3MgY2FuIGJlCi0gKiBzZWVuIGluIHRoZSBmdW5jdGlvbiBkZWNvZGUoKSBiZWxvdy4KLSAqLwotc3RydWN0IGh1ZmZtYW4gewotICAgIHNob3J0ICpjb3VudDsgICAgICAgLyogbnVtYmVyIG9mIHN5bWJvbHMgb2YgZWFjaCBsZW5ndGggKi8KLSAgICBzaG9ydCAqc3ltYm9sOyAgICAgIC8qIGNhbm9uaWNhbGx5IG9yZGVyZWQgc3ltYm9scyAqLwotfTsKLQotLyoKLSAqIERlY29kZSBhIGNvZGUgZnJvbSB0aGUgc3RyZWFtIHMgdXNpbmcgaHVmZm1hbiB0YWJsZSBoLiAgUmV0dXJuIHRoZSBzeW1ib2wgb3IKLSAqIGEgbmVnYXRpdmUgdmFsdWUgaWYgdGhlcmUgaXMgYW4gZXJyb3IuICBJZiBhbGwgb2YgdGhlIGxlbmd0aHMgYXJlIHplcm8sIGkuZS4KLSAqIGFuIGVtcHR5IGNvZGUsIG9yIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUgYW5kIGFuIGludmFsaWQgY29kZSBpcyByZWNlaXZlZCwKLSAqIHRoZW4gLTkgaXMgcmV0dXJuZWQgYWZ0ZXIgcmVhZGluZyBNQVhCSVRTIGJpdHMuCi0gKgotICogRm9ybWF0IG5vdGVzOgotICoKLSAqIC0gVGhlIGNvZGVzIGFzIHN0b3JlZCBpbiB0aGUgY29tcHJlc3NlZCBkYXRhIGFyZSBiaXQtcmV2ZXJzZWQgcmVsYXRpdmUgdG8KLSAqICAgYSBzaW1wbGUgaW50ZWdlciBvcmRlcmluZyBvZiBjb2RlcyBvZiB0aGUgc2FtZSBsZW5ndGhzLiAgSGVuY2UgYmVsb3cgdGhlCi0gKiAgIGJpdHMgYXJlIHB1bGxlZCBmcm9tIHRoZSBjb21wcmVzc2VkIGRhdGEgb25lIGF0IGEgdGltZSBhbmQgdXNlZCB0bwotICogICBidWlsZCB0aGUgY29kZSB2YWx1ZSByZXZlcnNlZCBmcm9tIHdoYXQgaXMgaW4gdGhlIHN0cmVhbSBpbiBvcmRlciB0bwotICogICBwZXJtaXQgc2ltcGxlIGludGVnZXIgY29tcGFyaXNvbnMgZm9yIGRlY29kaW5nLgotICoKLSAqIC0gVGhlIGZpcnN0IGNvZGUgZm9yIHRoZSBzaG9ydGVzdCBsZW5ndGggaXMgYWxsIG9uZXMuICBTdWJzZXF1ZW50IGNvZGVzIG9mCi0gKiAgIHRoZSBzYW1lIGxlbmd0aCBhcmUgc2ltcGx5IGludGVnZXIgZGVjcmVtZW50cyBvZiB0aGUgcHJldmlvdXMgY29kZS4gIFdoZW4KLSAqICAgbW92aW5nIHVwIGEgbGVuZ3RoLCBhIG9uZSBiaXQgaXMgYXBwZW5kZWQgdG8gdGhlIGNvZGUuICBGb3IgYSBjb21wbGV0ZQotICogICBjb2RlLCB0aGUgbGFzdCBjb2RlIG9mIHRoZSBsb25nZXN0IGxlbmd0aCB3aWxsIGJlIGFsbCB6ZXJvcy4gIFRvIHN1cHBvcnQKLSAqICAgdGhpcyBvcmRlcmluZywgdGhlIGJpdHMgcHVsbGVkIGR1cmluZyBkZWNvZGluZyBhcmUgaW52ZXJ0ZWQgdG8gYXBwbHkgdGhlCi0gKiAgIG1vcmUgIm5hdHVyYWwiIG9yZGVyaW5nIHN0YXJ0aW5nIHdpdGggYWxsIHplcm9zIGFuZCBpbmNyZW1lbnRpbmcuCi0gKi8KLWxvY2FsIGludCBkZWNvZGUoc3RydWN0IHN0YXRlICpzLCBzdHJ1Y3QgaHVmZm1hbiAqaCkKLXsKLSAgICBpbnQgbGVuOyAgICAgICAgICAgIC8qIGN1cnJlbnQgbnVtYmVyIG9mIGJpdHMgaW4gY29kZSAqLwotICAgIGludCBjb2RlOyAgICAgICAgICAgLyogbGVuIGJpdHMgYmVpbmcgZGVjb2RlZCAqLwotICAgIGludCBmaXJzdDsgICAgICAgICAgLyogZmlyc3QgY29kZSBvZiBsZW5ndGggbGVuICovCi0gICAgaW50IGNvdW50OyAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgbGVuZ3RoIGxlbiAqLwotICAgIGludCBpbmRleDsgICAgICAgICAgLyogaW5kZXggb2YgZmlyc3QgY29kZSBvZiBsZW5ndGggbGVuIGluIHN5bWJvbCB0YWJsZSAqLwotICAgIGludCBiaXRidWY7ICAgICAgICAgLyogYml0cyBmcm9tIHN0cmVhbSAqLwotICAgIGludCBsZWZ0OyAgICAgICAgICAgLyogYml0cyBsZWZ0IGluIG5leHQgb3IgbGVmdCB0byBwcm9jZXNzICovCi0gICAgc2hvcnQgKm5leHQ7ICAgICAgICAvKiBuZXh0IG51bWJlciBvZiBjb2RlcyAqLwotCi0gICAgYml0YnVmID0gcy0+Yml0YnVmOwotICAgIGxlZnQgPSBzLT5iaXRjbnQ7Ci0gICAgY29kZSA9IGZpcnN0ID0gaW5kZXggPSAwOwotICAgIGxlbiA9IDE7Ci0gICAgbmV4dCA9IGgtPmNvdW50ICsgMTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICB3aGlsZSAobGVmdC0tKSB7Ci0gICAgICAgICAgICBjb2RlIHw9IChiaXRidWYgJiAxKSBeIDE7ICAgLyogaW52ZXJ0IGNvZGUgKi8KLSAgICAgICAgICAgIGJpdGJ1ZiA+Pj0gMTsKLSAgICAgICAgICAgIGNvdW50ID0gKm5leHQrKzsKLSAgICAgICAgICAgIGlmIChjb2RlIDwgZmlyc3QgKyBjb3VudCkgeyAvKiBpZiBsZW5ndGggbGVuLCByZXR1cm4gc3ltYm9sICovCi0gICAgICAgICAgICAgICAgcy0+Yml0YnVmID0gYml0YnVmOwotICAgICAgICAgICAgICAgIHMtPmJpdGNudCA9IChzLT5iaXRjbnQgLSBsZW4pICYgNzsKLSAgICAgICAgICAgICAgICByZXR1cm4gaC0+c3ltYm9sW2luZGV4ICsgKGNvZGUgLSBmaXJzdCldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5kZXggKz0gY291bnQ7ICAgICAgICAgICAgIC8qIGVsc2UgdXBkYXRlIGZvciBuZXh0IGxlbmd0aCAqLwotICAgICAgICAgICAgZmlyc3QgKz0gY291bnQ7Ci0gICAgICAgICAgICBmaXJzdCA8PD0gMTsKLSAgICAgICAgICAgIGNvZGUgPDw9IDE7Ci0gICAgICAgICAgICBsZW4rKzsKLSAgICAgICAgfQotICAgICAgICBsZWZ0ID0gKE1BWEJJVFMrMSkgLSBsZW47Ci0gICAgICAgIGlmIChsZWZ0ID09IDApIGJyZWFrOwotICAgICAgICBpZiAocy0+bGVmdCA9PSAwKSB7Ci0gICAgICAgICAgICBzLT5sZWZ0ID0gcy0+aW5mdW4ocy0+aW5ob3csICYocy0+aW4pKTsKLSAgICAgICAgICAgIGlmIChzLT5sZWZ0ID09IDApIGxvbmdqbXAocy0+ZW52LCAxKTsgICAgICAgLyogb3V0IG9mIGlucHV0ICovCi0gICAgICAgIH0KLSAgICAgICAgYml0YnVmID0gKihzLT5pbikrKzsKLSAgICAgICAgcy0+bGVmdC0tOwotICAgICAgICBpZiAobGVmdCA+IDgpIGxlZnQgPSA4OwotICAgIH0KLSAgICByZXR1cm4gLTk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByYW4gb3V0IG9mIGNvZGVzICovCi19Ci0KLS8qCi0gKiBHaXZlbiBhIGxpc3Qgb2YgcmVwZWF0ZWQgY29kZSBsZW5ndGhzIHJlcFswLi5uLTFdLCB3aGVyZSBlYWNoIGJ5dGUgaXMgYQotICogY291bnQgKGhpZ2ggZm91ciBiaXRzICsgMSkgYW5kIGEgY29kZSBsZW5ndGggKGxvdyBmb3VyIGJpdHMpLCBnZW5lcmF0ZSB0aGUKLSAqIGxpc3Qgb2YgY29kZSBsZW5ndGhzLiAgVGhpcyBjb21wYWN0aW9uIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIG9iamVjdCBjb2RlLgotICogVGhlbiBnaXZlbiB0aGUgbGlzdCBvZiBjb2RlIGxlbmd0aHMgbGVuZ3RoWzAuLm4tMV0gcmVwcmVzZW50aW5nIGEgY2Fub25pY2FsCi0gKiBIdWZmbWFuIGNvZGUgZm9yIG4gc3ltYm9scywgY29uc3RydWN0IHRoZSB0YWJsZXMgcmVxdWlyZWQgdG8gZGVjb2RlIHRob3NlCi0gKiBjb2Rlcy4gIFRob3NlIHRhYmxlcyBhcmUgdGhlIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCwgYW5kIHRoZSBzeW1ib2xzCi0gKiBzb3J0ZWQgYnkgbGVuZ3RoLCByZXRhaW5pbmcgdGhlaXIgb3JpZ2luYWwgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoLiAgVGhlCi0gKiByZXR1cm4gdmFsdWUgaXMgemVybyBmb3IgYSBjb21wbGV0ZSBjb2RlIHNldCwgbmVnYXRpdmUgZm9yIGFuIG92ZXItCi0gKiBzdWJzY3JpYmVkIGNvZGUgc2V0LCBhbmQgcG9zaXRpdmUgZm9yIGFuIGluY29tcGxldGUgY29kZSBzZXQuICBUaGUgdGFibGVzCi0gKiBjYW4gYmUgdXNlZCBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHplcm8gb3IgcG9zaXRpdmUsIGJ1dCB0aGV5IGNhbm5vdCBiZSB1c2VkCi0gKiBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5lZ2F0aXZlLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvLCBpdCBpcyBub3QKLSAqIHBvc3NpYmxlIGZvciBkZWNvZGUoKSB1c2luZyB0aGF0IHRhYmxlIHRvIHJldHVybiBhbiBlcnJvci0tYW55IHN0cmVhbSBvZgotICogZW5vdWdoIGJpdHMgd2lsbCByZXNvbHZlIHRvIGEgc3ltYm9sLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBwb3NpdGl2ZSwgdGhlbgotICogaXQgaXMgcG9zc2libGUgZm9yIGRlY29kZSgpIHVzaW5nIHRoYXQgdGFibGUgdG8gcmV0dXJuIGFuIGVycm9yIGZvciByZWNlaXZlZAotICogY29kZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBpbmNvbXBsZXRlIGxlbmd0aHMuCi0gKi8KLWxvY2FsIGludCBjb25zdHJ1Y3Qoc3RydWN0IGh1ZmZtYW4gKmgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlcCwgaW50IG4pCi17Ci0gICAgaW50IHN5bWJvbDsgICAgICAgICAvKiBjdXJyZW50IHN5bWJvbCB3aGVuIHN0ZXBwaW5nIHRocm91Z2ggbGVuZ3RoW10gKi8KLSAgICBpbnQgbGVuOyAgICAgICAgICAgIC8qIGN1cnJlbnQgbGVuZ3RoIHdoZW4gc3RlcHBpbmcgdGhyb3VnaCBoLT5jb3VudFtdICovCi0gICAgaW50IGxlZnQ7ICAgICAgICAgICAvKiBudW1iZXIgb2YgcG9zc2libGUgY29kZXMgbGVmdCBvZiBjdXJyZW50IGxlbmd0aCAqLwotICAgIHNob3J0IG9mZnNbTUFYQklUUysxXTsgICAgICAvKiBvZmZzZXRzIGluIHN5bWJvbCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi8KLSAgICBzaG9ydCBsZW5ndGhbMjU2XTsgIC8qIGNvZGUgbGVuZ3RocyAqLwotCi0gICAgLyogY29udmVydCBjb21wYWN0IHJlcGVhdCBjb3VudHMgaW50byBzeW1ib2wgYml0IGxlbmd0aCBsaXN0ICovCi0gICAgc3ltYm9sID0gMDsKLSAgICBkbyB7Ci0gICAgICAgIGxlbiA9ICpyZXArKzsKLSAgICAgICAgbGVmdCA9IChsZW4gPj4gNCkgKyAxOwotICAgICAgICBsZW4gJj0gMTU7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGxlbmd0aFtzeW1ib2wrK10gPSBsZW47Ci0gICAgICAgIH0gd2hpbGUgKC0tbGVmdCk7Ci0gICAgfSB3aGlsZSAoLS1uKTsKLSAgICBuID0gc3ltYm9sOwotCi0gICAgLyogY291bnQgbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovCi0gICAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspCi0gICAgICAgIGgtPmNvdW50W2xlbl0gPSAwOwotICAgIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgbjsgc3ltYm9sKyspCi0gICAgICAgIChoLT5jb3VudFtsZW5ndGhbc3ltYm9sXV0pKys7ICAgLyogYXNzdW1lcyBsZW5ndGhzIGFyZSB3aXRoaW4gYm91bmRzICovCi0gICAgaWYgKGgtPmNvdW50WzBdID09IG4pICAgICAgICAgICAgICAgLyogbm8gY29kZXMhICovCi0gICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogY29tcGxldGUsIGJ1dCBkZWNvZGUoKSB3aWxsIGZhaWwgKi8KLQotICAgIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqLwotICAgIGxlZnQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uZSBwb3NzaWJsZSBjb2RlIG9mIHplcm8gbGVuZ3RoICovCi0gICAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHsKLSAgICAgICAgbGVmdCA8PD0gMTsgICAgICAgICAgICAgICAgICAgICAvKiBvbmUgbW9yZSBiaXQsIGRvdWJsZSBjb2RlcyBsZWZ0ICovCi0gICAgICAgIGxlZnQgLT0gaC0+Y291bnRbbGVuXTsgICAgICAgICAgLyogZGVkdWN0IGNvdW50IGZyb20gcG9zc2libGUgY29kZXMgKi8KLSAgICAgICAgaWYgKGxlZnQgPCAwKSByZXR1cm4gbGVmdDsgICAgICAvKiBvdmVyLXN1YnNjcmliZWQtLXJldHVybiBuZWdhdGl2ZSAqLwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlZnQgPiAwIG1lYW5zIGluY29tcGxldGUgKi8KLQotICAgIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoIGZvciBzb3J0aW5nICovCi0gICAgb2Zmc1sxXSA9IDA7Ci0gICAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykKLSAgICAgICAgb2Zmc1tsZW4gKyAxXSA9IG9mZnNbbGVuXSArIGgtPmNvdW50W2xlbl07Ci0KLSAgICAvKgotICAgICAqIHB1dCBzeW1ib2xzIGluIHRhYmxlIHNvcnRlZCBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaAotICAgICAqIGxlbmd0aAotICAgICAqLwotICAgIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgbjsgc3ltYm9sKyspCi0gICAgICAgIGlmIChsZW5ndGhbc3ltYm9sXSAhPSAwKQotICAgICAgICAgICAgaC0+c3ltYm9sW29mZnNbbGVuZ3RoW3N5bWJvbF1dKytdID0gc3ltYm9sOwotCi0gICAgLyogcmV0dXJuIHplcm8gZm9yIGNvbXBsZXRlIHNldCwgcG9zaXRpdmUgZm9yIGluY29tcGxldGUgc2V0ICovCi0gICAgcmV0dXJuIGxlZnQ7Ci19Ci0KLS8qCi0gKiBEZWNvZGUgUEtXYXJlIENvbXByZXNzaW9uIExpYnJhcnkgc3RyZWFtLgotICoKLSAqIEZvcm1hdCBub3RlczoKLSAqCi0gKiAtIEZpcnN0IGJ5dGUgaXMgMCBpZiBsaXRlcmFscyBhcmUgdW5jb2RlZCBvciAxIGlmIHRoZXkgYXJlIGNvZGVkLiAgU2Vjb25kCi0gKiAgIGJ5dGUgaXMgNCwgNSwgb3IgNiBmb3IgdGhlIG51bWJlciBvZiBleHRyYSBiaXRzIGluIHRoZSBkaXN0YW5jZSBjb2RlLgotICogICBUaGlzIGlzIHRoZSBiYXNlLTIgbG9nYXJpdGhtIG9mIHRoZSBkaWN0aW9uYXJ5IHNpemUgbWludXMgc2l4LgotICoKLSAqIC0gQ29tcHJlc3NlZCBkYXRhIGlzIGEgY29tYmluYXRpb24gb2YgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZSBwYWlycwotICogICB0ZXJtaW5hdGVkIGJ5IGFuIGVuZCBjb2RlLiAgTGl0ZXJhbHMgYXJlIGVpdGhlciBIdWZmbWFuIGNvZGVkIG9yCi0gKiAgIHVuY29kZWQgYnl0ZXMuICBBIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIGEgY29kZWQgbGVuZ3RoIGZvbGxvd2VkIGJ5IGEKLSAqICAgY29kZWQgZGlzdGFuY2UgdG8gcmVwcmVzZW50IGEgc3RyaW5nIHRoYXQgb2NjdXJzIGVhcmxpZXIgaW4gdGhlCi0gKiAgIHVuY29tcHJlc3NlZCBkYXRhIHRoYXQgb2NjdXJzIGFnYWluIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uLgotICoKLSAqIC0gQSBiaXQgcHJlY2VkaW5nIGEgbGl0ZXJhbCBvciBsZW5ndGgvZGlzdGFuY2UgcGFpciBpbmRpY2F0ZXMgd2hpY2ggY29tZXMKLSAqICAgbmV4dCwgMCBmb3IgbGl0ZXJhbHMsIDEgZm9yIGxlbmd0aC9kaXN0YW5jZS4KLSAqCi0gKiAtIElmIGxpdGVyYWxzIGFyZSB1bmNvZGVkLCB0aGVuIHRoZSBuZXh0IGVpZ2h0IGJpdHMgYXJlIHRoZSBsaXRlcmFsLCBpbiB0aGUKLSAqICAgbm9ybWFsIGJpdCBvcmRlciBpbiB0aCBzdHJlYW0sIGkuZS4gbm8gYml0LXJldmVyc2FsIGlzIG5lZWRlZC4gU2ltaWxhcmx5LAotICogICBubyBiaXQgcmV2ZXJzYWwgaXMgbmVlZGVkIGZvciBlaXRoZXIgdGhlIGxlbmd0aCBleHRyYSBiaXRzIG9yIHRoZSBkaXN0YW5jZQotICogICBleHRyYSBiaXRzLgotICoKLSAqIC0gTGl0ZXJhbCBieXRlcyBhcmUgc2ltcGx5IHdyaXR0ZW4gdG8gdGhlIG91dHB1dC4gIEEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMKLSAqICAgYW4gaW5zdHJ1Y3Rpb24gdG8gY29weSBwcmV2aW91c2x5IHVuY29tcHJlc3NlZCBieXRlcyB0byB0aGUgb3V0cHV0LiAgVGhlCi0gKiAgIGNvcHkgaXMgZnJvbSBkaXN0YW5jZSBieXRlcyBiYWNrIGluIHRoZSBvdXRwdXQgc3RyZWFtLCBjb3B5aW5nIGZvciBsZW5ndGgKLSAqICAgYnl0ZXMuCi0gKgotICogLSBEaXN0YW5jZXMgcG9pbnRpbmcgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBkYXRhIGFyZSBub3QKLSAqICAgcGVybWl0dGVkLgotICoKLSAqIC0gT3ZlcmxhcHBlZCBjb3BpZXMsIHdoZXJlIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBkaXN0YW5jZSwgYXJlCi0gKiAgIGFsbG93ZWQgYW5kIGNvbW1vbi4gIEZvciBleGFtcGxlLCBhIGRpc3RhbmNlIG9mIG9uZSBhbmQgYSBsZW5ndGggb2YgNTE4Ci0gKiAgIHNpbXBseSBjb3BpZXMgdGhlIGxhc3QgYnl0ZSA1MTggdGltZXMuICBBIGRpc3RhbmNlIG9mIGZvdXIgYW5kIGEgbGVuZ3RoIG9mCi0gKiAgIHR3ZWx2ZSBjb3BpZXMgdGhlIGxhc3QgZm91ciBieXRlcyB0aHJlZSB0aW1lcy4gIEEgc2ltcGxlIGZvcndhcmQgY29weQotICogICBpZ25vcmluZyB3aGV0aGVyIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBkaXN0YW5jZSBvciBub3QgaW1wbGVtZW50cwotICogICB0aGlzIGNvcnJlY3RseS4KLSAqLwotbG9jYWwgaW50IGRlY29tcChzdHJ1Y3Qgc3RhdGUgKnMpCi17Ci0gICAgaW50IGxpdDsgICAgICAgICAgICAvKiB0cnVlIGlmIGxpdGVyYWxzIGFyZSBjb2RlZCAqLwotICAgIGludCBkaWN0OyAgICAgICAgICAgLyogbG9nMihkaWN0aW9uYXJ5IHNpemUpIC0gNiAqLwotICAgIGludCBzeW1ib2w7ICAgICAgICAgLyogZGVjb2RlZCBzeW1ib2wsIGV4dHJhIGJpdHMgZm9yIGRpc3RhbmNlICovCi0gICAgaW50IGxlbjsgICAgICAgICAgICAvKiBsZW5ndGggZm9yIGNvcHkgKi8KLSAgICBpbnQgZGlzdDsgICAgICAgICAgIC8qIGRpc3RhbmNlIGZvciBjb3B5ICovCi0gICAgaW50IGNvcHk7ICAgICAgICAgICAvKiBjb3B5IGNvdW50ZXIgKi8KLSAgICB1bnNpZ25lZCBjaGFyICpmcm9tLCAqdG87ICAgLyogY29weSBwb2ludGVycyAqLwotICAgIHN0YXRpYyBpbnQgdmlyZ2luID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZCB0YWJsZXMgb25jZSAqLwotICAgIHN0YXRpYyBzaG9ydCBsaXRjbnRbTUFYQklUUysxXSwgbGl0c3ltWzI1Nl07ICAgICAgICAvKiBsaXRjb2RlIG1lbW9yeSAqLwotICAgIHN0YXRpYyBzaG9ydCBsZW5jbnRbTUFYQklUUysxXSwgbGVuc3ltWzE2XTsgICAgICAgICAvKiBsZW5jb2RlIG1lbW9yeSAqLwotICAgIHN0YXRpYyBzaG9ydCBkaXN0Y250W01BWEJJVFMrMV0sIGRpc3RzeW1bNjRdOyAgICAgICAvKiBkaXN0Y29kZSBtZW1vcnkgKi8KLSAgICBzdGF0aWMgc3RydWN0IGh1ZmZtYW4gbGl0Y29kZSA9IHtsaXRjbnQsIGxpdHN5bX07ICAgLyogbGVuZ3RoIGNvZGUgKi8KLSAgICBzdGF0aWMgc3RydWN0IGh1ZmZtYW4gbGVuY29kZSA9IHtsZW5jbnQsIGxlbnN5bX07ICAgLyogbGVuZ3RoIGNvZGUgKi8KLSAgICBzdGF0aWMgc3RydWN0IGh1ZmZtYW4gZGlzdGNvZGUgPSB7ZGlzdGNudCwgZGlzdHN5bX07LyogZGlzdGFuY2UgY29kZSAqLwotICAgICAgICAvKiBiaXQgbGVuZ3RocyBvZiBsaXRlcmFsIGNvZGVzICovCi0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbGl0bGVuW10gPSB7Ci0gICAgICAgIDExLCAxMjQsIDgsIDcsIDI4LCA3LCAxODgsIDEzLCA3NiwgNCwgMTAsIDgsIDEyLCAxMCwgMTIsIDEwLCA4LCAyMywgOCwKLSAgICAgICAgOSwgNywgNiwgNywgOCwgNywgNiwgNTUsIDgsIDIzLCAyNCwgMTIsIDExLCA3LCA5LCAxMSwgMTIsIDYsIDcsIDIyLCA1LAotICAgICAgICA3LCAyNCwgNiwgMTEsIDksIDYsIDcsIDIyLCA3LCAxMSwgMzgsIDcsIDksIDgsIDI1LCAxMSwgOCwgMTEsIDksIDEyLAotICAgICAgICA4LCAxMiwgNSwgMzgsIDUsIDM4LCA1LCAxMSwgNywgNSwgNiwgMjEsIDYsIDEwLCA1MywgOCwgNywgMjQsIDEwLCAyNywKLSAgICAgICAgNDQsIDI1MywgMjUzLCAyNTMsIDI1MiwgMjUyLCAyNTIsIDEzLCAxMiwgNDUsIDEyLCA0NSwgMTIsIDYxLCAxMiwgNDUsCi0gICAgICAgIDQ0LCAxNzN9OwotICAgICAgICAvKiBiaXQgbGVuZ3RocyBvZiBsZW5ndGggY29kZXMgMC4uMTUgKi8KLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBsZW5sZW5bXSA9IHsyLCAzNSwgMzYsIDUzLCAzOCwgMjN9OwotICAgICAgICAvKiBiaXQgbGVuZ3RocyBvZiBkaXN0YW5jZSBjb2RlcyAwLi42MyAqLwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRpc3RsZW5bXSA9IHsyLCAyMCwgNTMsIDIzMCwgMjQ3LCAxNTEsIDI0OH07Ci0gICAgc3RhdGljIGNvbnN0IHNob3J0IGJhc2VbMTZdID0geyAgICAgLyogYmFzZSBmb3IgbGVuZ3RoIGNvZGVzICovCi0gICAgICAgIDMsIDIsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMiwgMTYsIDI0LCA0MCwgNzIsIDEzNiwgMjY0fTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBleHRyYVsxNl0gPSB7ICAgICAvKiBleHRyYSBiaXRzIGZvciBsZW5ndGggY29kZXMgKi8KLSAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOH07Ci0KLSAgICAvKiBzZXQgdXAgZGVjb2RpbmcgdGFibGVzIChvbmNlLS1taWdodCBub3QgYmUgdGhyZWFkLXNhZmUpICovCi0gICAgaWYgKHZpcmdpbikgewotICAgICAgICBjb25zdHJ1Y3QoJmxpdGNvZGUsIGxpdGxlbiwgc2l6ZW9mKGxpdGxlbikpOwotICAgICAgICBjb25zdHJ1Y3QoJmxlbmNvZGUsIGxlbmxlbiwgc2l6ZW9mKGxlbmxlbikpOwotICAgICAgICBjb25zdHJ1Y3QoJmRpc3Rjb2RlLCBkaXN0bGVuLCBzaXplb2YoZGlzdGxlbikpOwotICAgICAgICB2aXJnaW4gPSAwOwotICAgIH0KLQotICAgIC8qIHJlYWQgaGVhZGVyICovCi0gICAgbGl0ID0gYml0cyhzLCA4KTsKLSAgICBpZiAobGl0ID4gMSkgcmV0dXJuIC0xOwotICAgIGRpY3QgPSBiaXRzKHMsIDgpOwotICAgIGlmIChkaWN0IDwgNCB8fCBkaWN0ID4gNikgcmV0dXJuIC0yOwotCi0gICAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2UgcGFpcnMgKi8KLSAgICBkbyB7Ci0gICAgICAgIGlmIChiaXRzKHMsIDEpKSB7Ci0gICAgICAgICAgICAvKiBnZXQgbGVuZ3RoICovCi0gICAgICAgICAgICBzeW1ib2wgPSBkZWNvZGUocywgJmxlbmNvZGUpOwotICAgICAgICAgICAgbGVuID0gYmFzZVtzeW1ib2xdICsgYml0cyhzLCBleHRyYVtzeW1ib2xdKTsKLSAgICAgICAgICAgIGlmIChsZW4gPT0gNTE5KSBicmVhazsgICAgICAgICAgICAgIC8qIGVuZCBjb2RlICovCi0KLSAgICAgICAgICAgIC8qIGdldCBkaXN0YW5jZSAqLwotICAgICAgICAgICAgc3ltYm9sID0gbGVuID09IDIgPyAyIDogZGljdDsKLSAgICAgICAgICAgIGRpc3QgPSBkZWNvZGUocywgJmRpc3Rjb2RlKSA8PCBzeW1ib2w7Ci0gICAgICAgICAgICBkaXN0ICs9IGJpdHMocywgc3ltYm9sKTsKLSAgICAgICAgICAgIGRpc3QrKzsKLSAgICAgICAgICAgIGlmIChzLT5maXJzdCAmJiBkaXN0ID4gcy0+bmV4dCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTM7ICAgICAgICAgICAgICAvKiBkaXN0YW5jZSB0b28gZmFyIGJhY2sgKi8KLQotICAgICAgICAgICAgLyogY29weSBsZW5ndGggYnl0ZXMgZnJvbSBkaXN0YW5jZSBieXRlcyBiYWNrICovCi0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgdG8gPSBzLT5vdXQgKyBzLT5uZXh0OwotICAgICAgICAgICAgICAgIGZyb20gPSB0byAtIGRpc3Q7Ci0gICAgICAgICAgICAgICAgY29weSA9IE1BWFdJTjsKLSAgICAgICAgICAgICAgICBpZiAocy0+bmV4dCA8IGRpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJvbSArPSBjb3B5OwotICAgICAgICAgICAgICAgICAgICBjb3B5ID0gZGlzdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29weSAtPSBzLT5uZXh0OwotICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gbGVuKSBjb3B5ID0gbGVuOwotICAgICAgICAgICAgICAgIGxlbiAtPSBjb3B5OwotICAgICAgICAgICAgICAgIHMtPm5leHQgKz0gY29weTsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICp0bysrID0gKmZyb20rKzsKLSAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpOwotICAgICAgICAgICAgICAgIGlmIChzLT5uZXh0ID09IE1BWFdJTikgewotICAgICAgICAgICAgICAgICAgICBpZiAocy0+b3V0ZnVuKHMtPm91dGhvdywgcy0+b3V0LCBzLT5uZXh0KSkgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgICAgIHMtPm5leHQgPSAwOwotICAgICAgICAgICAgICAgICAgICBzLT5maXJzdCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAobGVuICE9IDApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyogZ2V0IGxpdGVyYWwgYW5kIHdyaXRlIGl0ICovCi0gICAgICAgICAgICBzeW1ib2wgPSBsaXQgPyBkZWNvZGUocywgJmxpdGNvZGUpIDogYml0cyhzLCA4KTsKLSAgICAgICAgICAgIHMtPm91dFtzLT5uZXh0KytdID0gc3ltYm9sOwotICAgICAgICAgICAgaWYgKHMtPm5leHQgPT0gTUFYV0lOKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHMtPm91dGZ1bihzLT5vdXRob3csIHMtPm91dCwgcy0+bmV4dCkpIHJldHVybiAxOwotICAgICAgICAgICAgICAgIHMtPm5leHQgPSAwOwotICAgICAgICAgICAgICAgIHMtPmZpcnN0ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gd2hpbGUgKDEpOwotICAgIHJldHVybiAwOwotfQotCi0vKiBTZWUgY29tbWVudHMgaW4gYmxhc3QuaCAqLwotaW50IGJsYXN0KGJsYXN0X2luIGluZnVuLCB2b2lkICppbmhvdywgYmxhc3Rfb3V0IG91dGZ1biwgdm9pZCAqb3V0aG93KQotewotICAgIHN0cnVjdCBzdGF0ZSBzOyAgICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgc3RhdGUgKi8KLSAgICBpbnQgZXJyOyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHZhbHVlICovCi0KLSAgICAvKiBpbml0aWFsaXplIGlucHV0IHN0YXRlICovCi0gICAgcy5pbmZ1biA9IGluZnVuOwotICAgIHMuaW5ob3cgPSBpbmhvdzsKLSAgICBzLmxlZnQgPSAwOwotICAgIHMuYml0YnVmID0gMDsKLSAgICBzLmJpdGNudCA9IDA7Ci0KLSAgICAvKiBpbml0aWFsaXplIG91dHB1dCBzdGF0ZSAqLwotICAgIHMub3V0ZnVuID0gb3V0ZnVuOwotICAgIHMub3V0aG93ID0gb3V0aG93OwotICAgIHMubmV4dCA9IDA7Ci0gICAgcy5maXJzdCA9IDE7Ci0KLSAgICAvKiByZXR1cm4gaWYgYml0cygpIG9yIGRlY29kZSgpIHRyaWVzIHRvIHJlYWQgcGFzdCBhdmFpbGFibGUgaW5wdXQgKi8KLSAgICBpZiAoc2V0am1wKHMuZW52KSAhPSAwKSAgICAgICAgICAgICAvKiBpZiBjYW1lIGJhY2sgaGVyZSB2aWEgbG9uZ2ptcCgpLCAqLwotICAgICAgICBlcnIgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICB0aGVuIHNraXAgZGVjb21wKCksIHJldHVybiBlcnJvciAqLwotICAgIGVsc2UKLSAgICAgICAgZXJyID0gZGVjb21wKCZzKTsgICAgICAgICAgICAgICAvKiBkZWNvbXByZXNzICovCi0KLSAgICAvKiB3cml0ZSBhbnkgbGVmdG92ZXIgb3V0cHV0IGFuZCB1cGRhdGUgdGhlIGVycm9yIGNvZGUgaWYgbmVlZGVkICovCi0gICAgaWYgKGVyciAhPSAxICYmIHMubmV4dCAmJiBzLm91dGZ1bihzLm91dGhvdywgcy5vdXQsIHMubmV4dCkgJiYgZXJyID09IDApCi0gICAgICAgIGVyciA9IDE7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotI2lmZGVmIFRFU1QKLS8qIEV4YW1wbGUgb2YgaG93IHRvIHVzZSBibGFzdCgpICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2RlZmluZSBDSFVOSyAxNjM4NAotCi1sb2NhbCB1bnNpZ25lZCBpbmYodm9pZCAqaG93LCB1bnNpZ25lZCBjaGFyICoqYnVmKQotewotICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGhvbGRbQ0hVTktdOwotCi0gICAgKmJ1ZiA9IGhvbGQ7Ci0gICAgcmV0dXJuIGZyZWFkKGhvbGQsIDEsIENIVU5LLCAoRklMRSAqKWhvdyk7Ci19Ci0KLWxvY2FsIGludCBvdXRmKHZvaWQgKmhvdywgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4pCi17Ci0gICAgcmV0dXJuIGZ3cml0ZShidWYsIDEsIGxlbiwgKEZJTEUgKilob3cpICE9IGxlbjsKLX0KLQotLyogRGVjb21wcmVzcyBhIFBLV2FyZSBDb21wcmVzc2lvbiBMaWJyYXJ5IHN0cmVhbSBmcm9tIHN0ZGluIHRvIHN0ZG91dCAqLwotaW50IG1haW4odm9pZCkKLXsKLSAgICBpbnQgcmV0LCBuOwotCi0gICAgLyogZGVjb21wcmVzcyB0byBzdGRvdXQgKi8KLSAgICByZXQgPSBibGFzdChpbmYsIHN0ZGluLCBvdXRmLCBzdGRvdXQpOwotICAgIGlmIChyZXQgIT0gMCkgZnByaW50ZihzdGRlcnIsICJibGFzdCBlcnJvcjogJWRcbiIsIHJldCk7Ci0KLSAgICAvKiBzZWUgaWYgdGhlcmUgYXJlIGFueSBsZWZ0b3ZlciBieXRlcyAqLwotICAgIG4gPSAwOwotICAgIHdoaWxlIChnZXRjaGFyKCkgIT0gRU9GKSBuKys7Ci0gICAgaWYgKG4pIGZwcmludGYoc3RkZXJyLCAiYmxhc3Qgd2FybmluZzogJWQgdW51c2VkIGJ5dGVzIG9mIGlucHV0XG4iLCBuKTsKLQotICAgIC8qIHJldHVybiBibGFzdCgpIGVycm9yIGNvZGUgKi8KLSAgICByZXR1cm4gcmV0OwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2JsYXN0L2JsYXN0LmggYi9zcmMvemxpYi9jb250cmliL2JsYXN0L2JsYXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOWU1NDEuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9ibGFzdC9ibGFzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogYmxhc3QuaCAtLSBpbnRlcmZhY2UgZm9yIGJsYXN0LmMKLSAgQ29weXJpZ2h0IChDKSAyMDAzIE1hcmsgQWRsZXIKLSAgdmVyc2lvbiAxLjEsIDE2IEZlYiAyMDAzCi0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3IgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTWFyayBBZGxlciAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ci0gKi8KLQotCi0vKgotICogYmxhc3QoKSBkZWNvbXByZXNzZXMgdGhlIFBLV2FyZSBEYXRhIENvbXByZXNzaW9uIExpYnJhcnkgKERDTCkgY29tcHJlc3NlZAotICogZm9ybWF0LiAgSXQgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyB0aGUgZXhwbG9kZSgpIGZ1bmN0aW9uIGluCi0gKiB0aGF0IGxpYnJhcnkuICAoTm90ZTogUEtXYXJlIG92ZXJ1c2VkIHRoZSAiaW1wbG9kZSIgdmVyYiwgYW5kIHRoZSBmb3JtYXQKLSAqIHVzZWQgYnkgdGhlaXIgbGlicmFyeSBpbXBsb2RlKCkgZnVuY3Rpb24gaXMgY29tcGxldGVseSBkaWZmZXJlbnQgYW5kCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgaW1wbG9kZSBjb21wcmVzc2lvbiBtZXRob2Qgc3VwcG9ydGVkIGJ5IFBLWklQLikKLSAqLwotCi0KLXR5cGVkZWYgdW5zaWduZWQgKCpibGFzdF9pbikodm9pZCAqaG93LCB1bnNpZ25lZCBjaGFyICoqYnVmKTsKLXR5cGVkZWYgaW50ICgqYmxhc3Rfb3V0KSh2b2lkICpob3csIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuKTsKLS8qIERlZmluaXRpb25zIGZvciBpbnB1dC9vdXRwdXQgZnVuY3Rpb25zIHBhc3NlZCB0byBibGFzdCgpLiAgU2VlIGJlbG93IGZvcgotICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb25zIG5lZWQgdG8gZG8uCi0gKi8KLQotCi1pbnQgYmxhc3QoYmxhc3RfaW4gaW5mdW4sIHZvaWQgKmluaG93LCBibGFzdF9vdXQgb3V0ZnVuLCB2b2lkICpvdXRob3cpOwotLyogRGVjb21wcmVzcyBpbnB1dCB0byBvdXRwdXQgdXNpbmcgdGhlIHByb3ZpZGVkIGluZnVuKCkgYW5kIG91dGZ1bigpIGNhbGxzLgotICogT24gc3VjY2VzcywgdGhlIHJldHVybiB2YWx1ZSBvZiBibGFzdCgpIGlzIHplcm8uICBJZiB0aGVyZSBpcyBhbiBlcnJvciBpbgotICogdGhlIHNvdXJjZSBkYXRhLCBpLmUuIGl0IGlzIG5vdCBpbiB0aGUgcHJvcGVyIGZvcm1hdCwgdGhlbiBhIG5lZ2F0aXZlIHZhbHVlCi0gKiBpcyByZXR1cm5lZC4gIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggaW5wdXQgYXZhaWxhYmxlIG9yIHRoZXJlIGlzIG5vdCBlbm91Z2gKLSAqIG91dHB1dCBzcGFjZSwgdGhlbiBhIHBvc2l0aXZlIGVycm9yIGlzIHJldHVybmVkLgotICoKLSAqIFRoZSBpbnB1dCBmdW5jdGlvbiBpcyBpbnZva2VkOiBsZW4gPSBpbmZ1bihob3csICZidWYpLCB3aGVyZSBidWYgaXMgc2V0IGJ5Ci0gKiBpbmZ1bigpIHRvIHBvaW50IHRvIHRoZSBpbnB1dCBidWZmZXIsIGFuZCBpbmZ1bigpIHJldHVybnMgdGhlIG51bWJlciBvZgotICogYXZhaWxhYmxlIGJ5dGVzIHRoZXJlLiAgSWYgaW5mdW4oKSByZXR1cm5zIHplcm8sIHRoZW4gYmxhc3QoKSByZXR1cm5zIHdpdGgKLSAqIGFuIGlucHV0IGVycm9yLiAgKGJsYXN0KCkgb25seSBhc2tzIGZvciBpbnB1dCBpZiBpdCBuZWVkcyBpdC4pICBpbmhvdyBpcyBmb3IKLSAqIHVzZSBieSB0aGUgYXBwbGljYXRpb24gdG8gcGFzcyBhbiBpbnB1dCBkZXNjcmlwdG9yIHRvIGluZnVuKCksIGlmIGRlc2lyZWQuCi0gKgotICogVGhlIG91dHB1dCBmdW5jdGlvbiBpcyBpbnZva2VkOiBlcnIgPSBvdXRmdW4oaG93LCBidWYsIGxlbiksIHdoZXJlIHRoZSBieXRlcwotICogdG8gYmUgd3JpdHRlbiBhcmUgYnVmWzAuLmxlbi0xXS4gIElmIGVyciBpcyBub3QgemVybywgdGhlbiBibGFzdCgpIHJldHVybnMKLSAqIHdpdGggYW4gb3V0cHV0IGVycm9yLiAgb3V0ZnVuKCkgaXMgYWx3YXlzIGNhbGxlZCB3aXRoIGxlbiA8PSA0MDk2LiAgb3V0aG93Ci0gKiBpcyBmb3IgdXNlIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBwYXNzIGFuIG91dHB1dCBkZXNjcmlwdG9yIHRvIG91dGZ1bigpLCBpZgotICogZGVzaXJlZC4KLSAqCi0gKiBUaGUgcmV0dXJuIGNvZGVzIGFyZToKLSAqCi0gKiAgIDI6ICByYW4gb3V0IG9mIGlucHV0IGJlZm9yZSBjb21wbGV0aW5nIGRlY29tcHJlc3Npb24KLSAqICAgMTogIG91dHB1dCBlcnJvciBiZWZvcmUgY29tcGxldGluZyBkZWNvbXByZXNzaW9uCi0gKiAgIDA6ICBzdWNjZXNzZnVsIGRlY29tcHJlc3Npb24KLSAqICAtMTogIGxpdGVyYWwgZmxhZyBub3QgemVybyBvciBvbmUKLSAqICAtMjogIGRpY3Rpb25hcnkgc2l6ZSBub3QgaW4gNC4uNgotICogIC0zOiAgZGlzdGFuY2UgaXMgdG9vIGZhciBiYWNrCi0gKgotICogQXQgdGhlIGJvdHRvbSBvZiBibGFzdC5jIGlzIGFuIGV4YW1wbGUgcHJvZ3JhbSB0aGF0IHVzZXMgYmxhc3QoKSB0aGF0IGNhbiBiZQotICogY29tcGlsZWQgdG8gcHJvZHVjZSBhIGNvbW1hbmQtbGluZSBkZWNvbXByZXNzaW9uIGZpbHRlciBieSBkZWZpbmluZyBURVNULgotICovCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2JsYXN0L3Rlc3QucGsgYi9zcmMvemxpYi9jb250cmliL2JsYXN0L3Rlc3QucGsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMTBiMmIuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9ibGFzdC90ZXN0LnBrCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9ibGFzdC90ZXN0LnR4dCBiL3NyYy96bGliL2NvbnRyaWIvYmxhc3QvdGVzdC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGYxYzUuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9ibGFzdC90ZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUFJQUlBSUFJQUlBSUEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2RlbHBoaS9aTGliLnBhcyBiL3NyYy96bGliL2NvbnRyaWIvZGVscGhpL1pMaWIucGFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjRiYjNlLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvZGVscGhpL1pMaWIucGFzCisrKyAvZGV2L251bGwKQEAgLTEsNTU3ICswLDAgQEAKLXsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqfQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci17ICAgICAgIEJvcmxhbmQgRGVscGhpIFN1cHBsZW1lbnRhbCBDb21wb25lbnRzICAgICAgICAgIH0KLXsgICAgICAgWkxJQiBEYXRhIENvbXByZXNzaW9uIEludGVyZmFjZSBVbml0ICAgICAgICAgICAgfQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci17ICAgICAgIENvcHlyaWdodCAoYykgMTk5Nyw5OSBCb3JsYW5kIENvcnBvcmF0aW9uICAgICAgIH0KLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoteyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKip9Ci0KLXsgVXBkYXRlZCBmb3IgemxpYiAxLjIueCBieSBDb3NtaW4gVHJ1dGEgPGNvc21pbnRAY3MudWJiY2x1ai5ybz4gfQotCi11bml0IFpMaWI7Ci0KLWludGVyZmFjZQotCi11c2VzIFN5c1V0aWxzLCBDbGFzc2VzOwotCi10eXBlCi0gIFRBbGxvYyA9IGZ1bmN0aW9uIChBcHBEYXRhOiBQb2ludGVyOyBJdGVtcywgU2l6ZTogSW50ZWdlcik6IFBvaW50ZXI7IGNkZWNsOwotICBURnJlZSA9IHByb2NlZHVyZSAoQXBwRGF0YSwgQmxvY2s6IFBvaW50ZXIpOyBjZGVjbDsKLQotICAvLyBJbnRlcm5hbCBzdHJ1Y3R1cmUuICBJZ25vcmUuCi0gIFRaU3RyZWFtUmVjID0gcGFja2VkIHJlY29yZAotICAgIG5leHRfaW46IFBDaGFyOyAgICAgICAvLyBuZXh0IGlucHV0IGJ5dGUKLSAgICBhdmFpbF9pbjogSW50ZWdlcjsgICAgLy8gbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCBuZXh0X2luCi0gICAgdG90YWxfaW46IExvbmdpbnQ7ICAgIC8vIHRvdGFsIG5iIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyCi0KLSAgICBuZXh0X291dDogUENoYXI7ICAgICAgLy8gbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IGhlcmUKLSAgICBhdmFpbF9vdXQ6IEludGVnZXI7ICAgLy8gcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgbmV4dF9vdXQKLSAgICB0b3RhbF9vdXQ6IExvbmdpbnQ7ICAgLy8gdG90YWwgbmIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhcgotCi0gICAgbXNnOiBQQ2hhcjsgICAgICAgICAgIC8vIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvcgotICAgIGludGVybmFsOiBQb2ludGVyOyAgICAvLyBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMKLQotICAgIHphbGxvYzogVEFsbG9jOyAgICAgICAvLyB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZQotICAgIHpmcmVlOiBURnJlZTsgICAgICAgICAvLyB1c2VkIHRvIGZyZWUgdGhlIGludGVybmFsIHN0YXRlCi0gICAgQXBwRGF0YTogUG9pbnRlcjsgICAgIC8vIHByaXZhdGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvIHphbGxvYyBhbmQgemZyZWUKLQotICAgIGRhdGFfdHlwZTogSW50ZWdlcjsgICAvLyBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6IGFzY2lpIG9yIGJpbmFyeQotICAgIGFkbGVyOiBMb25naW50OyAgICAgICAvLyBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YQotICAgIHJlc2VydmVkOiBMb25naW50OyAgICAvLyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotICBlbmQ7Ci0KLSAgLy8gQWJzdHJhY3QgYW5jZXN0b3IgY2xhc3MKLSAgVEN1c3RvbVpsaWJTdHJlYW0gPSBjbGFzcyhUU3RyZWFtKQotICBwcml2YXRlCi0gICAgRlN0cm06IFRTdHJlYW07Ci0gICAgRlN0cm1Qb3M6IEludGVnZXI7Ci0gICAgRk9uUHJvZ3Jlc3M6IFROb3RpZnlFdmVudDsKLSAgICBGWlJlYzogVFpTdHJlYW1SZWM7Ci0gICAgRkJ1ZmZlcjogYXJyYXkgW1dvcmRdIG9mIENoYXI7Ci0gIHByb3RlY3RlZAotICAgIHByb2NlZHVyZSBQcm9ncmVzcyhTZW5kZXI6IFRPYmplY3QpOyBkeW5hbWljOwotICAgIHByb3BlcnR5IE9uUHJvZ3Jlc3M6IFROb3RpZnlFdmVudCByZWFkIEZPblByb2dyZXNzIHdyaXRlIEZPblByb2dyZXNzOwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZShTdHJtOiBUU3RyZWFtKTsKLSAgZW5kOwotCi17IFRDb21wcmVzc2lvblN0cmVhbSBjb21wcmVzc2VzIGRhdGEgb24gdGhlIGZseSBhcyBkYXRhIGlzIHdyaXR0ZW4gdG8gaXQsIGFuZAotICBzdG9yZXMgdGhlIGNvbXByZXNzZWQgZGF0YSB0byBhbm90aGVyIHN0cmVhbS4KLQotICBUQ29tcHJlc3Npb25TdHJlYW0gaXMgd3JpdGUtb25seSBhbmQgc3RyaWN0bHkgc2VxdWVudGlhbC4gUmVhZGluZyBmcm9tIHRoZQotICBzdHJlYW0gd2lsbCByYWlzZSBhbiBleGNlcHRpb24uIFVzaW5nIFNlZWsgdG8gbW92ZSB0aGUgc3RyZWFtIHBvaW50ZXIKLSAgd2lsbCByYWlzZSBhbiBleGNlcHRpb24uCi0KLSAgT3V0cHV0IGRhdGEgaXMgY2FjaGVkIGludGVybmFsbHksIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0gb25seSB3aGVuCi0gIHRoZSBpbnRlcm5hbCBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwuICBBbGwgcGVuZGluZyBvdXRwdXQgZGF0YSBpcyBmbHVzaGVkCi0gIHdoZW4gdGhlIHN0cmVhbSBpcyBkZXN0cm95ZWQuCi0KLSAgVGhlIFBvc2l0aW9uIHByb3BlcnR5IHJldHVybnMgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgb2YKLSAgZGF0YSB0aGF0IGhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSBzdHJlYW0gc28gZmFyLgotCi0gIENvbXByZXNzaW9uUmF0ZSByZXR1cm5zIHRoZSBvbi10aGUtZmx5IHBlcmNlbnRhZ2UgYnkgd2hpY2ggdGhlIG9yaWdpbmFsCi0gIGRhdGEgaGFzIGJlZW4gY29tcHJlc3NlZDogICgxIC0gKENvbXByZXNzZWRCeXRlcyAvIFVuY29tcHJlc3NlZEJ5dGVzKSkgKiAxMDAKLSAgSWYgcmF3IGRhdGEgc2l6ZSA9IDEwMCBhbmQgY29tcHJlc3NlZCBkYXRhIHNpemUgPSAyNSwgdGhlIENvbXByZXNzaW9uUmF0ZQotICBpcyA3NSUKLQotICBUaGUgT25Qcm9ncmVzcyBldmVudCBpcyBjYWxsZWQgZWFjaCB0aW1lIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZpbGxlZCBhbmQKLSAgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbS4gIFRoaXMgaXMgdXNlZnVsIGZvciB1cGRhdGluZyBhIHByb2dyZXNzCi0gIGluZGljYXRvciB3aGVuIHlvdSBhcmUgd3JpdGluZyBhIGxhcmdlIGNodW5rIG9mIGRhdGEgdG8gdGhlIGNvbXByZXNzaW9uCi0gIHN0cmVhbSBpbiBhIHNpbmdsZSBjYWxsLn0KLQotCi0gIFRDb21wcmVzc2lvbkxldmVsID0gKGNsTm9uZSwgY2xGYXN0ZXN0LCBjbERlZmF1bHQsIGNsTWF4KTsKLQotICBUQ29tcHJlc3Npb25TdHJlYW0gPSBjbGFzcyhUQ3VzdG9tWmxpYlN0cmVhbSkKLSAgcHJpdmF0ZQotICAgIGZ1bmN0aW9uIEdldENvbXByZXNzaW9uUmF0ZTogU2luZ2xlOwotICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQ29tcHJlc3Npb25MZXZlbDogVENvbXByZXNzaW9uTGV2ZWw7IERlc3Q6IFRTdHJlYW0pOwotICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZCh2YXIgQnVmZmVyOyBDb3VudDogTG9uZ2ludCk6IExvbmdpbnQ7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFdyaXRlKGNvbnN0IEJ1ZmZlcjsgQ291bnQ6IExvbmdpbnQpOiBMb25naW50OyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBTZWVrKE9mZnNldDogTG9uZ2ludDsgT3JpZ2luOiBXb3JkKTogTG9uZ2ludDsgb3ZlcnJpZGU7Ci0gICAgcHJvcGVydHkgQ29tcHJlc3Npb25SYXRlOiBTaW5nbGUgcmVhZCBHZXRDb21wcmVzc2lvblJhdGU7Ci0gICAgcHJvcGVydHkgT25Qcm9ncmVzczsKLSAgZW5kOwotCi17IFREZWNvbXByZXNzaW9uU3RyZWFtIGRlY29tcHJlc3NlcyBkYXRhIG9uIHRoZSBmbHkgYXMgZGF0YSBpcyByZWFkIGZyb20gaXQuCi0KLSAgQ29tcHJlc3NlZCBkYXRhIGNvbWVzIGZyb20gYSBzZXBhcmF0ZSBzb3VyY2Ugc3RyZWFtLiAgVERlY29tcHJlc3Npb25TdHJlYW0KLSAgaXMgcmVhZC1vbmx5IGFuZCB1bmlkaXJlY3Rpb25hbDsgeW91IGNhbiBzZWVrIGZvcndhcmQgaW4gdGhlIHN0cmVhbSwgYnV0IG5vdAotICBiYWNrd2FyZHMuICBUaGUgc3BlY2lhbCBjYXNlIG9mIHNldHRpbmcgdGhlIHN0cmVhbSBwb3NpdGlvbiB0byB6ZXJvIGlzCi0gIGFsbG93ZWQuICBTZWVraW5nIGZvcndhcmQgZGVjb21wcmVzc2VzIGRhdGEgdW50aWwgdGhlIHJlcXVlc3RlZCBwb3NpdGlvbiBpbgotICB0aGUgdW5jb21wcmVzc2VkIGRhdGEgaGFzIGJlZW4gcmVhY2hlZC4gIFNlZWtpbmcgYmFja3dhcmRzLCBzZWVraW5nIHJlbGF0aXZlCi0gIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgcmVxdWVzdGluZyB0aGUgc2l6ZSBvZiB0aGUgc3RyZWFtLCBhbmQgd3JpdGluZyB0bwotICB0aGUgc3RyZWFtIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uLgotCi0gIFRoZSBQb3NpdGlvbiBwcm9wZXJ0eSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgdW5jb21wcmVzc2VkIGRhdGEgdGhhdAotICBoYXZlIGJlZW4gcmVhZCBmcm9tIHRoZSBzdHJlYW0gc28gZmFyLgotCi0gIFRoZSBPblByb2dyZXNzIGV2ZW50IGlzIGNhbGxlZCBlYWNoIHRpbWUgdGhlIGludGVybmFsIGlucHV0IGJ1ZmZlciBvZgotICBjb21wcmVzc2VkIGRhdGEgaXMgZXhoYXVzdGVkIGFuZCB0aGUgbmV4dCBibG9jayBpcyByZWFkIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KLSAgVGhpcyBpcyB1c2VmdWwgZm9yIHVwZGF0aW5nIGEgcHJvZ3Jlc3MgaW5kaWNhdG9yIHdoZW4geW91IGFyZSByZWFkaW5nIGEKLSAgbGFyZ2UgY2h1bmsgb2YgZGF0YSBmcm9tIHRoZSBkZWNvbXByZXNzaW9uIHN0cmVhbSBpbiBhIHNpbmdsZSBjYWxsLn0KLQotICBURGVjb21wcmVzc2lvblN0cmVhbSA9IGNsYXNzKFRDdXN0b21abGliU3RyZWFtKQotICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoU291cmNlOiBUU3RyZWFtKTsKLSAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWQodmFyIEJ1ZmZlcjsgQ291bnQ6IExvbmdpbnQpOiBMb25naW50OyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBXcml0ZShjb25zdCBCdWZmZXI7IENvdW50OiBMb25naW50KTogTG9uZ2ludDsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gU2VlayhPZmZzZXQ6IExvbmdpbnQ7IE9yaWdpbjogV29yZCk6IExvbmdpbnQ7IG92ZXJyaWRlOwotICAgIHByb3BlcnR5IE9uUHJvZ3Jlc3M7Ci0gIGVuZDsKLQotCi0KLXsgQ29tcHJlc3NCdWYgY29tcHJlc3NlcyBkYXRhLCBidWZmZXIgdG8gYnVmZmVyLCBpbiBvbmUgY2FsbC4KLSAgIEluOiBJbkJ1ZiA9IHB0ciB0byBjb21wcmVzc2VkIGRhdGEKLSAgICAgICBJbkJ5dGVzID0gbnVtYmVyIG9mIGJ5dGVzIGluIEluQnVmCi0gIE91dDogT3V0QnVmID0gcHRyIHRvIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgY29udGFpbmluZyBkZWNvbXByZXNzZWQgZGF0YQotICAgICAgIE91dEJ5dGVzID0gbnVtYmVyIG9mIGJ5dGVzIGluIE91dEJ1ZiAgIH0KLXByb2NlZHVyZSBDb21wcmVzc0J1Zihjb25zdCBJbkJ1ZjogUG9pbnRlcjsgSW5CeXRlczogSW50ZWdlcjsKLSAgICAgICAgICAgICAgICAgICAgICBvdXQgT3V0QnVmOiBQb2ludGVyOyBvdXQgT3V0Qnl0ZXM6IEludGVnZXIpOwotCi0KLXsgRGVjb21wcmVzc0J1ZiBkZWNvbXByZXNzZXMgZGF0YSwgYnVmZmVyIHRvIGJ1ZmZlciwgaW4gb25lIGNhbGwuCi0gICBJbjogSW5CdWYgPSBwdHIgdG8gY29tcHJlc3NlZCBkYXRhCi0gICAgICAgSW5CeXRlcyA9IG51bWJlciBvZiBieXRlcyBpbiBJbkJ1ZgotICAgICAgIE91dEVzdGltYXRlID0gemVybywgb3IgZXN0LiBzaXplIG9mIHRoZSBkZWNvbXByZXNzZWQgZGF0YQotICBPdXQ6IE91dEJ1ZiA9IHB0ciB0byBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIGNvbnRhaW5pbmcgZGVjb21wcmVzc2VkIGRhdGEKLSAgICAgICBPdXRCeXRlcyA9IG51bWJlciBvZiBieXRlcyBpbiBPdXRCdWYgICB9Ci1wcm9jZWR1cmUgRGVjb21wcmVzc0J1Zihjb25zdCBJbkJ1ZjogUG9pbnRlcjsgSW5CeXRlczogSW50ZWdlcjsKLSBPdXRFc3RpbWF0ZTogSW50ZWdlcjsgb3V0IE91dEJ1ZjogUG9pbnRlcjsgb3V0IE91dEJ5dGVzOiBJbnRlZ2VyKTsKLQoteyBEZWNvbXByZXNzVG9Vc2VyQnVmIGRlY29tcHJlc3NlcyBkYXRhLCBidWZmZXIgdG8gYnVmZmVyLCBpbiBvbmUgY2FsbC4KLSAgIEluOiBJbkJ1ZiA9IHB0ciB0byBjb21wcmVzc2VkIGRhdGEKLSAgICAgICBJbkJ5dGVzID0gbnVtYmVyIG9mIGJ5dGVzIGluIEluQnVmCi0gIE91dDogT3V0QnVmID0gcHRyIHRvIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciB0byBjb250YWluIGRlY29tcHJlc3NlZCBkYXRhCi0gICAgICAgQnVmU2l6ZSA9IG51bWJlciBvZiBieXRlcyBpbiBPdXRCdWYgICB9Ci1wcm9jZWR1cmUgRGVjb21wcmVzc1RvVXNlckJ1Zihjb25zdCBJbkJ1ZjogUG9pbnRlcjsgSW5CeXRlczogSW50ZWdlcjsKLSAgY29uc3QgT3V0QnVmOiBQb2ludGVyOyBCdWZTaXplOiBJbnRlZ2VyKTsKLQotY29uc3QKLSAgemxpYl92ZXJzaW9uID0gJzEuMi43JzsKLQotdHlwZQotICBFWmxpYkVycm9yID0gY2xhc3MoRXhjZXB0aW9uKTsKLSAgRUNvbXByZXNzaW9uRXJyb3IgPSBjbGFzcyhFWmxpYkVycm9yKTsKLSAgRURlY29tcHJlc3Npb25FcnJvciA9IGNsYXNzKEVabGliRXJyb3IpOwotCi1pbXBsZW1lbnRhdGlvbgotCi11c2VzIFpMaWJDb25zdDsKLQotY29uc3QKLSAgWl9OT19GTFVTSCAgICAgID0gMDsKLSAgWl9QQVJUSUFMX0ZMVVNIID0gMTsKLSAgWl9TWU5DX0ZMVVNIICAgID0gMjsKLSAgWl9GVUxMX0ZMVVNIICAgID0gMzsKLSAgWl9GSU5JU0ggICAgICAgID0gNDsKLQotICBaX09LICAgICAgICAgICAgPSAwOwotICBaX1NUUkVBTV9FTkQgICAgPSAxOwotICBaX05FRURfRElDVCAgICAgPSAyOwotICBaX0VSUk5PICAgICAgICAgPSAoLTEpOwotICBaX1NUUkVBTV9FUlJPUiAgPSAoLTIpOwotICBaX0RBVEFfRVJST1IgICAgPSAoLTMpOwotICBaX01FTV9FUlJPUiAgICAgPSAoLTQpOwotICBaX0JVRl9FUlJPUiAgICAgPSAoLTUpOwotICBaX1ZFUlNJT05fRVJST1IgPSAoLTYpOwotCi0gIFpfTk9fQ09NUFJFU1NJT04gICAgICAgPSAgIDA7Ci0gIFpfQkVTVF9TUEVFRCAgICAgICAgICAgPSAgIDE7Ci0gIFpfQkVTVF9DT01QUkVTU0lPTiAgICAgPSAgIDk7Ci0gIFpfREVGQVVMVF9DT01QUkVTU0lPTiAgPSAoLTEpOwotCi0gIFpfRklMVEVSRUQgICAgICAgICAgICA9IDE7Ci0gIFpfSFVGRk1BTl9PTkxZICAgICAgICA9IDI7Ci0gIFpfUkxFICAgICAgICAgICAgICAgICA9IDM7Ci0gIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7Ci0KLSAgWl9CSU5BUlkgICA9IDA7Ci0gIFpfQVNDSUkgICAgPSAxOwotICBaX1VOS05PV04gID0gMjsKLQotICBaX0RFRkxBVEVEID0gODsKLQotCi17JEwgYWRsZXIzMi5vYmp9Ci17JEwgY29tcHJlc3Mub2JqfQoteyRMIGNyYzMyLm9ian0KLXskTCBkZWZsYXRlLm9ian0KLXskTCBpbmZiYWNrLm9ian0KLXskTCBpbmZmYXN0Lm9ian0KLXskTCBpbmZsYXRlLm9ian0KLXskTCBpbmZ0cmVlcy5vYmp9Ci17JEwgdHJlZXMub2JqfQoteyRMIHVuY29tcHIub2JqfQoteyRMIHp1dGlsLm9ian0KLQotcHJvY2VkdXJlIGFkbGVyMzI7IGV4dGVybmFsOwotcHJvY2VkdXJlIGNvbXByZXNzQm91bmQ7IGV4dGVybmFsOwotcHJvY2VkdXJlIGNyYzMyOyBleHRlcm5hbDsKLXByb2NlZHVyZSBkZWZsYXRlSW5pdDJfOyBleHRlcm5hbDsKLXByb2NlZHVyZSBkZWZsYXRlUGFyYW1zOyBleHRlcm5hbDsKLQotZnVuY3Rpb24gX21hbGxvYyhTaXplOiBJbnRlZ2VyKTogUG9pbnRlcjsgY2RlY2w7Ci1iZWdpbgotICBSZXN1bHQgOj0gQWxsb2NNZW0oU2l6ZSk7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBfZnJlZShCbG9jazogUG9pbnRlcik7IGNkZWNsOwotYmVnaW4KLSAgRnJlZU1lbShCbG9jayk7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBfbWVtc2V0KFA6IFBvaW50ZXI7IEI6IEJ5dGU7IGNvdW50OiBJbnRlZ2VyKTsgY2RlY2w7Ci1iZWdpbgotICBGaWxsQ2hhcihQXiwgY291bnQsIEIpOwotZW5kOwotCi1wcm9jZWR1cmUgX21lbWNweShkZXN0LCBzb3VyY2U6IFBvaW50ZXI7IGNvdW50OiBJbnRlZ2VyKTsgY2RlY2w7Ci1iZWdpbgotICBNb3ZlKHNvdXJjZV4sIGRlc3ReLCBjb3VudCk7Ci1lbmQ7Ci0KLQotCi0vLyBkZWZsYXRlIGNvbXByZXNzZXMgZGF0YQotZnVuY3Rpb24gZGVmbGF0ZUluaXRfKHZhciBzdHJtOiBUWlN0cmVhbVJlYzsgbGV2ZWw6IEludGVnZXI7IHZlcnNpb246IFBDaGFyOwotICByZWNzaXplOiBJbnRlZ2VyKTogSW50ZWdlcjsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBkZWZsYXRlKHZhciBzdHJtOiBUWlN0cmVhbVJlYzsgZmx1c2g6IEludGVnZXIpOiBJbnRlZ2VyOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGRlZmxhdGVFbmQodmFyIHN0cm06IFRaU3RyZWFtUmVjKTogSW50ZWdlcjsgZXh0ZXJuYWw7Ci0KLS8vIGluZmxhdGUgZGVjb21wcmVzc2VzIGRhdGEKLWZ1bmN0aW9uIGluZmxhdGVJbml0Xyh2YXIgc3RybTogVFpTdHJlYW1SZWM7IHZlcnNpb246IFBDaGFyOwotICByZWNzaXplOiBJbnRlZ2VyKTogSW50ZWdlcjsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBpbmZsYXRlKHZhciBzdHJtOiBUWlN0cmVhbVJlYzsgZmx1c2g6IEludGVnZXIpOiBJbnRlZ2VyOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGluZmxhdGVFbmQodmFyIHN0cm06IFRaU3RyZWFtUmVjKTogSW50ZWdlcjsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBpbmZsYXRlUmVzZXQodmFyIHN0cm06IFRaU3RyZWFtUmVjKTogSW50ZWdlcjsgZXh0ZXJuYWw7Ci0KLQotZnVuY3Rpb24gemxpYkFsbG9jTWVtKEFwcERhdGE6IFBvaW50ZXI7IEl0ZW1zLCBTaXplOiBJbnRlZ2VyKTogUG9pbnRlcjsgY2RlY2w7Ci1iZWdpbgotLy8gIEdldE1lbShSZXN1bHQsIEl0ZW1zKlNpemUpOwotICBSZXN1bHQgOj0gQWxsb2NNZW0oSXRlbXMgKiBTaXplKTsKLWVuZDsKLQotcHJvY2VkdXJlIHpsaWJGcmVlTWVtKEFwcERhdGEsIEJsb2NrOiBQb2ludGVyKTsgY2RlY2w7Ci1iZWdpbgotICBGcmVlTWVtKEJsb2NrKTsKLWVuZDsKLQote2Z1bmN0aW9uIHpsaWJDaGVjayhjb2RlOiBJbnRlZ2VyKTogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBjb2RlOwotICBpZiBjb2RlIDwgMCB0aGVuCi0gICAgcmFpc2UgRVpsaWJFcnJvci5DcmVhdGUoJ2Vycm9yJyk7ICAgIC8vISEKLWVuZDt9Ci0KLWZ1bmN0aW9uIENDaGVjayhjb2RlOiBJbnRlZ2VyKTogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBjb2RlOwotICBpZiBjb2RlIDwgMCB0aGVuCi0gICAgcmFpc2UgRUNvbXByZXNzaW9uRXJyb3IuQ3JlYXRlKCdlcnJvcicpOyAvLyEhCi1lbmQ7Ci0KLWZ1bmN0aW9uIERDaGVjayhjb2RlOiBJbnRlZ2VyKTogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBjb2RlOwotICBpZiBjb2RlIDwgMCB0aGVuCi0gICAgcmFpc2UgRURlY29tcHJlc3Npb25FcnJvci5DcmVhdGUoJ2Vycm9yJyk7ICAvLyEhCi1lbmQ7Ci0KLXByb2NlZHVyZSBDb21wcmVzc0J1Zihjb25zdCBJbkJ1ZjogUG9pbnRlcjsgSW5CeXRlczogSW50ZWdlcjsKLSAgICAgICAgICAgICAgICAgICAgICBvdXQgT3V0QnVmOiBQb2ludGVyOyBvdXQgT3V0Qnl0ZXM6IEludGVnZXIpOwotdmFyCi0gIHN0cm06IFRaU3RyZWFtUmVjOwotICBQOiBQb2ludGVyOwotYmVnaW4KLSAgRmlsbENoYXIoc3RybSwgc2l6ZW9mKHN0cm0pLCAwKTsKLSAgc3RybS56YWxsb2MgOj0gemxpYkFsbG9jTWVtOwotICBzdHJtLnpmcmVlIDo9IHpsaWJGcmVlTWVtOwotICBPdXRCeXRlcyA6PSAoKEluQnl0ZXMgKyAoSW5CeXRlcyBkaXYgMTApICsgMTIpICsgMjU1KSBhbmQgbm90IDI1NTsKLSAgR2V0TWVtKE91dEJ1ZiwgT3V0Qnl0ZXMpOwotICB0cnkKLSAgICBzdHJtLm5leHRfaW4gOj0gSW5CdWY7Ci0gICAgc3RybS5hdmFpbF9pbiA6PSBJbkJ5dGVzOwotICAgIHN0cm0ubmV4dF9vdXQgOj0gT3V0QnVmOwotICAgIHN0cm0uYXZhaWxfb3V0IDo9IE91dEJ5dGVzOwotICAgIENDaGVjayhkZWZsYXRlSW5pdF8oc3RybSwgWl9CRVNUX0NPTVBSRVNTSU9OLCB6bGliX3ZlcnNpb24sIHNpemVvZihzdHJtKSkpOwotICAgIHRyeQotICAgICAgd2hpbGUgQ0NoZWNrKGRlZmxhdGUoc3RybSwgWl9GSU5JU0gpKSA8PiBaX1NUUkVBTV9FTkQgZG8KLSAgICAgIGJlZ2luCi0gICAgICAgIFAgOj0gT3V0QnVmOwotICAgICAgICBJbmMoT3V0Qnl0ZXMsIDI1Nik7Ci0gICAgICAgIFJlYWxsb2NNZW0oT3V0QnVmLCBPdXRCeXRlcyk7Ci0gICAgICAgIHN0cm0ubmV4dF9vdXQgOj0gUENoYXIoSW50ZWdlcihPdXRCdWYpICsgKEludGVnZXIoc3RybS5uZXh0X291dCkgLSBJbnRlZ2VyKFApKSk7Ci0gICAgICAgIHN0cm0uYXZhaWxfb3V0IDo9IDI1NjsKLSAgICAgIGVuZDsKLSAgICBmaW5hbGx5Ci0gICAgICBDQ2hlY2soZGVmbGF0ZUVuZChzdHJtKSk7Ci0gICAgZW5kOwotICAgIFJlYWxsb2NNZW0oT3V0QnVmLCBzdHJtLnRvdGFsX291dCk7Ci0gICAgT3V0Qnl0ZXMgOj0gc3RybS50b3RhbF9vdXQ7Ci0gIGV4Y2VwdAotICAgIEZyZWVNZW0oT3V0QnVmKTsKLSAgICByYWlzZQotICBlbmQ7Ci1lbmQ7Ci0KLQotcHJvY2VkdXJlIERlY29tcHJlc3NCdWYoY29uc3QgSW5CdWY6IFBvaW50ZXI7IEluQnl0ZXM6IEludGVnZXI7Ci0gIE91dEVzdGltYXRlOiBJbnRlZ2VyOyBvdXQgT3V0QnVmOiBQb2ludGVyOyBvdXQgT3V0Qnl0ZXM6IEludGVnZXIpOwotdmFyCi0gIHN0cm06IFRaU3RyZWFtUmVjOwotICBQOiBQb2ludGVyOwotICBCdWZJbmM6IEludGVnZXI7Ci1iZWdpbgotICBGaWxsQ2hhcihzdHJtLCBzaXplb2Yoc3RybSksIDApOwotICBzdHJtLnphbGxvYyA6PSB6bGliQWxsb2NNZW07Ci0gIHN0cm0uemZyZWUgOj0gemxpYkZyZWVNZW07Ci0gIEJ1ZkluYyA6PSAoSW5CeXRlcyArIDI1NSkgYW5kIG5vdCAyNTU7Ci0gIGlmIE91dEVzdGltYXRlID0gMCB0aGVuCi0gICAgT3V0Qnl0ZXMgOj0gQnVmSW5jCi0gIGVsc2UKLSAgICBPdXRCeXRlcyA6PSBPdXRFc3RpbWF0ZTsKLSAgR2V0TWVtKE91dEJ1ZiwgT3V0Qnl0ZXMpOwotICB0cnkKLSAgICBzdHJtLm5leHRfaW4gOj0gSW5CdWY7Ci0gICAgc3RybS5hdmFpbF9pbiA6PSBJbkJ5dGVzOwotICAgIHN0cm0ubmV4dF9vdXQgOj0gT3V0QnVmOwotICAgIHN0cm0uYXZhaWxfb3V0IDo9IE91dEJ5dGVzOwotICAgIERDaGVjayhpbmZsYXRlSW5pdF8oc3RybSwgemxpYl92ZXJzaW9uLCBzaXplb2Yoc3RybSkpKTsKLSAgICB0cnkKLSAgICAgIHdoaWxlIERDaGVjayhpbmZsYXRlKHN0cm0sIFpfTk9fRkxVU0gpKSA8PiBaX1NUUkVBTV9FTkQgZG8KLSAgICAgIGJlZ2luCi0gICAgICAgIFAgOj0gT3V0QnVmOwotICAgICAgICBJbmMoT3V0Qnl0ZXMsIEJ1ZkluYyk7Ci0gICAgICAgIFJlYWxsb2NNZW0oT3V0QnVmLCBPdXRCeXRlcyk7Ci0gICAgICAgIHN0cm0ubmV4dF9vdXQgOj0gUENoYXIoSW50ZWdlcihPdXRCdWYpICsgKEludGVnZXIoc3RybS5uZXh0X291dCkgLSBJbnRlZ2VyKFApKSk7Ci0gICAgICAgIHN0cm0uYXZhaWxfb3V0IDo9IEJ1ZkluYzsKLSAgICAgIGVuZDsKLSAgICBmaW5hbGx5Ci0gICAgICBEQ2hlY2soaW5mbGF0ZUVuZChzdHJtKSk7Ci0gICAgZW5kOwotICAgIFJlYWxsb2NNZW0oT3V0QnVmLCBzdHJtLnRvdGFsX291dCk7Ci0gICAgT3V0Qnl0ZXMgOj0gc3RybS50b3RhbF9vdXQ7Ci0gIGV4Y2VwdAotICAgIEZyZWVNZW0oT3V0QnVmKTsKLSAgICByYWlzZQotICBlbmQ7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBEZWNvbXByZXNzVG9Vc2VyQnVmKGNvbnN0IEluQnVmOiBQb2ludGVyOyBJbkJ5dGVzOiBJbnRlZ2VyOwotICBjb25zdCBPdXRCdWY6IFBvaW50ZXI7IEJ1ZlNpemU6IEludGVnZXIpOwotdmFyCi0gIHN0cm06IFRaU3RyZWFtUmVjOwotYmVnaW4KLSAgRmlsbENoYXIoc3RybSwgc2l6ZW9mKHN0cm0pLCAwKTsKLSAgc3RybS56YWxsb2MgOj0gemxpYkFsbG9jTWVtOwotICBzdHJtLnpmcmVlIDo9IHpsaWJGcmVlTWVtOwotICBzdHJtLm5leHRfaW4gOj0gSW5CdWY7Ci0gIHN0cm0uYXZhaWxfaW4gOj0gSW5CeXRlczsKLSAgc3RybS5uZXh0X291dCA6PSBPdXRCdWY7Ci0gIHN0cm0uYXZhaWxfb3V0IDo9IEJ1ZlNpemU7Ci0gIERDaGVjayhpbmZsYXRlSW5pdF8oc3RybSwgemxpYl92ZXJzaW9uLCBzaXplb2Yoc3RybSkpKTsKLSAgdHJ5Ci0gICAgaWYgRENoZWNrKGluZmxhdGUoc3RybSwgWl9GSU5JU0gpKSA8PiBaX1NUUkVBTV9FTkQgdGhlbgotICAgICAgcmFpc2UgRVpsaWJFcnJvci5DcmVhdGVSZXMoQHNUYXJnZXRCdWZmZXJUb29TbWFsbCk7Ci0gIGZpbmFsbHkKLSAgICBEQ2hlY2soaW5mbGF0ZUVuZChzdHJtKSk7Ci0gIGVuZDsKLWVuZDsKLQotLy8gVEN1c3RvbVpsaWJTdHJlYW0KLQotY29uc3RydWN0b3IgVEN1c3RvbVpMaWJTdHJlYW0uQ3JlYXRlKFN0cm06IFRTdHJlYW0pOwotYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZTsKLSAgRlN0cm0gOj0gU3RybTsKLSAgRlN0cm1Qb3MgOj0gU3RybS5Qb3NpdGlvbjsKLSAgRlpSZWMuemFsbG9jIDo9IHpsaWJBbGxvY01lbTsKLSAgRlpSZWMuemZyZWUgOj0gemxpYkZyZWVNZW07Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUQ3VzdG9tWkxpYlN0cmVhbS5Qcm9ncmVzcyhTZW5kZXI6IFRPYmplY3QpOwotYmVnaW4KLSAgaWYgQXNzaWduZWQoRk9uUHJvZ3Jlc3MpIHRoZW4gRk9uUHJvZ3Jlc3MoU2VuZGVyKTsKLWVuZDsKLQotCi0vLyBUQ29tcHJlc3Npb25TdHJlYW0KLQotY29uc3RydWN0b3IgVENvbXByZXNzaW9uU3RyZWFtLkNyZWF0ZShDb21wcmVzc2lvbkxldmVsOiBUQ29tcHJlc3Npb25MZXZlbDsKLSAgRGVzdDogVFN0cmVhbSk7Ci1jb25zdAotICBMZXZlbHM6IGFycmF5IFtUQ29tcHJlc3Npb25MZXZlbF0gb2YgU2hvcnRJbnQgPQotICAgIChaX05PX0NPTVBSRVNTSU9OLCBaX0JFU1RfU1BFRUQsIFpfREVGQVVMVF9DT01QUkVTU0lPTiwgWl9CRVNUX0NPTVBSRVNTSU9OKTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGUoRGVzdCk7Ci0gIEZaUmVjLm5leHRfb3V0IDo9IEZCdWZmZXI7Ci0gIEZaUmVjLmF2YWlsX291dCA6PSBzaXplb2YoRkJ1ZmZlcik7Ci0gIENDaGVjayhkZWZsYXRlSW5pdF8oRlpSZWMsIExldmVsc1tDb21wcmVzc2lvbkxldmVsXSwgemxpYl92ZXJzaW9uLCBzaXplb2YoRlpSZWMpKSk7Ci1lbmQ7Ci0KLWRlc3RydWN0b3IgVENvbXByZXNzaW9uU3RyZWFtLkRlc3Ryb3k7Ci1iZWdpbgotICBGWlJlYy5uZXh0X2luIDo9IG5pbDsKLSAgRlpSZWMuYXZhaWxfaW4gOj0gMDsKLSAgdHJ5Ci0gICAgaWYgRlN0cm0uUG9zaXRpb24gPD4gRlN0cm1Qb3MgdGhlbiBGU3RybS5Qb3NpdGlvbiA6PSBGU3RybVBvczsKLSAgICB3aGlsZSAoQ0NoZWNrKGRlZmxhdGUoRlpSZWMsIFpfRklOSVNIKSkgPD4gWl9TVFJFQU1fRU5EKQotICAgICAgYW5kIChGWlJlYy5hdmFpbF9vdXQgPSAwKSBkbwotICAgIGJlZ2luCi0gICAgICBGU3RybS5Xcml0ZUJ1ZmZlcihGQnVmZmVyLCBzaXplb2YoRkJ1ZmZlcikpOwotICAgICAgRlpSZWMubmV4dF9vdXQgOj0gRkJ1ZmZlcjsKLSAgICAgIEZaUmVjLmF2YWlsX291dCA6PSBzaXplb2YoRkJ1ZmZlcik7Ci0gICAgZW5kOwotICAgIGlmIEZaUmVjLmF2YWlsX291dCA8IHNpemVvZihGQnVmZmVyKSB0aGVuCi0gICAgICBGU3RybS5Xcml0ZUJ1ZmZlcihGQnVmZmVyLCBzaXplb2YoRkJ1ZmZlcikgLSBGWlJlYy5hdmFpbF9vdXQpOwotICBmaW5hbGx5Ci0gICAgZGVmbGF0ZUVuZChGWlJlYyk7Ci0gIGVuZDsKLSAgaW5oZXJpdGVkIERlc3Ryb3k7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRDb21wcmVzc2lvblN0cmVhbS5SZWFkKHZhciBCdWZmZXI7IENvdW50OiBMb25naW50KTogTG9uZ2ludDsKLWJlZ2luCi0gIHJhaXNlIEVDb21wcmVzc2lvbkVycm9yLkNyZWF0ZVJlcyhAc0ludmFsaWRTdHJlYW1PcCk7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRDb21wcmVzc2lvblN0cmVhbS5Xcml0ZShjb25zdCBCdWZmZXI7IENvdW50OiBMb25naW50KTogTG9uZ2ludDsKLWJlZ2luCi0gIEZaUmVjLm5leHRfaW4gOj0gQEJ1ZmZlcjsKLSAgRlpSZWMuYXZhaWxfaW4gOj0gQ291bnQ7Ci0gIGlmIEZTdHJtLlBvc2l0aW9uIDw+IEZTdHJtUG9zIHRoZW4gRlN0cm0uUG9zaXRpb24gOj0gRlN0cm1Qb3M7Ci0gIHdoaWxlIChGWlJlYy5hdmFpbF9pbiA+IDApIGRvCi0gIGJlZ2luCi0gICAgQ0NoZWNrKGRlZmxhdGUoRlpSZWMsIDApKTsKLSAgICBpZiBGWlJlYy5hdmFpbF9vdXQgPSAwIHRoZW4KLSAgICBiZWdpbgotICAgICAgRlN0cm0uV3JpdGVCdWZmZXIoRkJ1ZmZlciwgc2l6ZW9mKEZCdWZmZXIpKTsKLSAgICAgIEZaUmVjLm5leHRfb3V0IDo9IEZCdWZmZXI7Ci0gICAgICBGWlJlYy5hdmFpbF9vdXQgOj0gc2l6ZW9mKEZCdWZmZXIpOwotICAgICAgRlN0cm1Qb3MgOj0gRlN0cm0uUG9zaXRpb247Ci0gICAgICBQcm9ncmVzcyhTZWxmKTsKLSAgICBlbmQ7Ci0gIGVuZDsKLSAgUmVzdWx0IDo9IENvdW50OwotZW5kOwotCi1mdW5jdGlvbiBUQ29tcHJlc3Npb25TdHJlYW0uU2VlayhPZmZzZXQ6IExvbmdpbnQ7IE9yaWdpbjogV29yZCk6IExvbmdpbnQ7Ci1iZWdpbgotICBpZiAoT2Zmc2V0ID0gMCkgYW5kIChPcmlnaW4gPSBzb0Zyb21DdXJyZW50KSB0aGVuCi0gICAgUmVzdWx0IDo9IEZaUmVjLnRvdGFsX2luCi0gIGVsc2UKLSAgICByYWlzZSBFQ29tcHJlc3Npb25FcnJvci5DcmVhdGVSZXMoQHNJbnZhbGlkU3RyZWFtT3ApOwotZW5kOwotCi1mdW5jdGlvbiBUQ29tcHJlc3Npb25TdHJlYW0uR2V0Q29tcHJlc3Npb25SYXRlOiBTaW5nbGU7Ci1iZWdpbgotICBpZiBGWlJlYy50b3RhbF9pbiA9IDAgdGhlbgotICAgIFJlc3VsdCA6PSAwCi0gIGVsc2UKLSAgICBSZXN1bHQgOj0gKDEuMCAtIChGWlJlYy50b3RhbF9vdXQgLyBGWlJlYy50b3RhbF9pbikpICogMTAwLjA7Ci1lbmQ7Ci0KLQotLy8gVERlY29tcHJlc3Npb25TdHJlYW0KLQotY29uc3RydWN0b3IgVERlY29tcHJlc3Npb25TdHJlYW0uQ3JlYXRlKFNvdXJjZTogVFN0cmVhbSk7Ci1iZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKFNvdXJjZSk7Ci0gIEZaUmVjLm5leHRfaW4gOj0gRkJ1ZmZlcjsKLSAgRlpSZWMuYXZhaWxfaW4gOj0gMDsKLSAgRENoZWNrKGluZmxhdGVJbml0XyhGWlJlYywgemxpYl92ZXJzaW9uLCBzaXplb2YoRlpSZWMpKSk7Ci1lbmQ7Ci0KLWRlc3RydWN0b3IgVERlY29tcHJlc3Npb25TdHJlYW0uRGVzdHJveTsKLWJlZ2luCi0gIEZTdHJtLlNlZWsoLUZaUmVjLmF2YWlsX2luLCAxKTsKLSAgaW5mbGF0ZUVuZChGWlJlYyk7Ci0gIGluaGVyaXRlZCBEZXN0cm95OwotZW5kOwotCi1mdW5jdGlvbiBURGVjb21wcmVzc2lvblN0cmVhbS5SZWFkKHZhciBCdWZmZXI7IENvdW50OiBMb25naW50KTogTG9uZ2ludDsKLWJlZ2luCi0gIEZaUmVjLm5leHRfb3V0IDo9IEBCdWZmZXI7Ci0gIEZaUmVjLmF2YWlsX291dCA6PSBDb3VudDsKLSAgaWYgRlN0cm0uUG9zaXRpb24gPD4gRlN0cm1Qb3MgdGhlbiBGU3RybS5Qb3NpdGlvbiA6PSBGU3RybVBvczsKLSAgd2hpbGUgKEZaUmVjLmF2YWlsX291dCA+IDApIGRvCi0gIGJlZ2luCi0gICAgaWYgRlpSZWMuYXZhaWxfaW4gPSAwIHRoZW4KLSAgICBiZWdpbgotICAgICAgRlpSZWMuYXZhaWxfaW4gOj0gRlN0cm0uUmVhZChGQnVmZmVyLCBzaXplb2YoRkJ1ZmZlcikpOwotICAgICAgaWYgRlpSZWMuYXZhaWxfaW4gPSAwIHRoZW4KLSAgICAgIGJlZ2luCi0gICAgICAgIFJlc3VsdCA6PSBDb3VudCAtIEZaUmVjLmF2YWlsX291dDsKLSAgICAgICAgRXhpdDsKLSAgICAgIGVuZDsKLSAgICAgIEZaUmVjLm5leHRfaW4gOj0gRkJ1ZmZlcjsKLSAgICAgIEZTdHJtUG9zIDo9IEZTdHJtLlBvc2l0aW9uOwotICAgICAgUHJvZ3Jlc3MoU2VsZik7Ci0gICAgZW5kOwotICAgIENDaGVjayhpbmZsYXRlKEZaUmVjLCAwKSk7Ci0gIGVuZDsKLSAgUmVzdWx0IDo9IENvdW50OwotZW5kOwotCi1mdW5jdGlvbiBURGVjb21wcmVzc2lvblN0cmVhbS5Xcml0ZShjb25zdCBCdWZmZXI7IENvdW50OiBMb25naW50KTogTG9uZ2ludDsKLWJlZ2luCi0gIHJhaXNlIEVEZWNvbXByZXNzaW9uRXJyb3IuQ3JlYXRlUmVzKEBzSW52YWxpZFN0cmVhbU9wKTsKLWVuZDsKLQotZnVuY3Rpb24gVERlY29tcHJlc3Npb25TdHJlYW0uU2VlayhPZmZzZXQ6IExvbmdpbnQ7IE9yaWdpbjogV29yZCk6IExvbmdpbnQ7Ci12YXIKLSAgSTogSW50ZWdlcjsKLSAgQnVmOiBhcnJheSBbMC4uNDA5NV0gb2YgQ2hhcjsKLWJlZ2luCi0gIGlmIChPZmZzZXQgPSAwKSBhbmQgKE9yaWdpbiA9IHNvRnJvbUJlZ2lubmluZykgdGhlbgotICBiZWdpbgotICAgIERDaGVjayhpbmZsYXRlUmVzZXQoRlpSZWMpKTsKLSAgICBGWlJlYy5uZXh0X2luIDo9IEZCdWZmZXI7Ci0gICAgRlpSZWMuYXZhaWxfaW4gOj0gMDsKLSAgICBGU3RybS5Qb3NpdGlvbiA6PSAwOwotICAgIEZTdHJtUG9zIDo9IDA7Ci0gIGVuZAotICBlbHNlIGlmICggKE9mZnNldCA+PSAwKSBhbmQgKE9yaWdpbiA9IHNvRnJvbUN1cnJlbnQpKSBvcgotICAgICAgICAgICggKChPZmZzZXQgLSBGWlJlYy50b3RhbF9vdXQpID4gMCkgYW5kIChPcmlnaW4gPSBzb0Zyb21CZWdpbm5pbmcpKSB0aGVuCi0gIGJlZ2luCi0gICAgaWYgT3JpZ2luID0gc29Gcm9tQmVnaW5uaW5nIHRoZW4gRGVjKE9mZnNldCwgRlpSZWMudG90YWxfb3V0KTsKLSAgICBpZiBPZmZzZXQgPiAwIHRoZW4KLSAgICBiZWdpbgotICAgICAgZm9yIEkgOj0gMSB0byBPZmZzZXQgZGl2IHNpemVvZihCdWYpIGRvCi0gICAgICAgIFJlYWRCdWZmZXIoQnVmLCBzaXplb2YoQnVmKSk7Ci0gICAgICBSZWFkQnVmZmVyKEJ1ZiwgT2Zmc2V0IG1vZCBzaXplb2YoQnVmKSk7Ci0gICAgZW5kOwotICBlbmQKLSAgZWxzZQotICAgIHJhaXNlIEVEZWNvbXByZXNzaW9uRXJyb3IuQ3JlYXRlUmVzKEBzSW52YWxpZFN0cmVhbU9wKTsKLSAgUmVzdWx0IDo9IEZaUmVjLnRvdGFsX291dDsKLWVuZDsKLQotCi1lbmQuCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2RlbHBoaS9aTGliQ29uc3QucGFzIGIvc3JjL3psaWIvY29udHJpYi9kZWxwaGkvWkxpYkNvbnN0LnBhcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmZTEzNi4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL2RlbHBoaS9aTGliQ29uc3QucGFzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotdW5pdCBaTGliQ29uc3Q7Ci0KLWludGVyZmFjZQotCi1yZXNvdXJjZXN0cmluZwotICBzVGFyZ2V0QnVmZmVyVG9vU21hbGwgPSAnWkxpYiBlcnJvcjogdGFyZ2V0IGJ1ZmZlciBtYXkgYmUgdG9vIHNtYWxsJzsKLSAgc0ludmFsaWRTdHJlYW1PcCA9ICdJbnZhbGlkIHN0cmVhbSBvcGVyYXRpb24nOwotCi1pbXBsZW1lbnRhdGlvbgotCi1lbmQuCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2RlbHBoaS9yZWFkbWUudHh0IGIvc3JjL3psaWIvY29udHJpYi9kZWxwaGkvcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRjOWE4Yi4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL2RlbHBoaS9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotCi1PdmVydmlldwotPT09PT09PT0KLQotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYW4gdXBkYXRlIHRvIHRoZSBaTGliIGludGVyZmFjZSB1bml0LAotZGlzdHJpYnV0ZWQgYnkgQm9ybGFuZCBhcyBhIERlbHBoaSBzdXBwbGVtZW50YWwgY29tcG9uZW50LgotCi1UaGUgb3JpZ2luYWwgWkxpYiB1bml0IGlzIENvcHlyaWdodCAoYykgMTk5Nyw5OSBCb3JsYW5kIENvcnAuLAotYW5kIGlzIGJhc2VkIG9uIHpsaWIgdmVyc2lvbiAxLjAuNC4gIFRoZXJlIGFyZSBhIHNlcmllcyBvZiBidWdzCi1hbmQgc2VjdXJpdHkgcHJvYmxlbXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgb2xkIHpsaWIgdmVyc2lvbiwgYW5kCi13ZSByZWNvbW1lbmQgdGhlIHVzZXJzIHRvIHVwZGF0ZSB0aGVpciBaTGliIHVuaXQuCi0KLQotU3VtbWFyeSBvZiBtb2RpZmljYXRpb25zCi09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLSBJbXByb3ZlZCBtYWtlZmlsZSwgYWRhcHRlZCB0byB6bGliIHZlcnNpb24gMS4yLjEuCi0KLS0gU29tZSBmaWVsZCB0eXBlcyBmcm9tIFRaU3RyZWFtUmVjIGFyZSBjaGFuZ2VkIGZyb20gSW50ZWdlciB0bwotICBMb25naW50LCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgemxpYi5oIGhlYWRlciwgYW5kIGZvciA2NC1iaXQKLSAgcmVhZGluZXNzLgotCi0tIFRoZSB6bGliX3ZlcnNpb24gY29uc3RhbnQgaXMgdXBkYXRlZC4KLQotLSBUaGUgbmV3IFpfUkxFIHN0cmF0ZWd5IGhhcyBpdHMgY29ycmVzcG9uZGluZyBzeW1ib2xpYyBjb25zdGFudC4KLQotLSBUaGUgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIGZ1bmN0aW9ucyBhbmQgZnVuY3Rpb24gdHlwZXMKLSAgKFRBbGxvYywgVEZyZWUsIHpsaWJBbGxvY01lbSBhbmQgemxpYkZyZWVNZW0pIGFyZSBub3cgY2RlY2wsCi0gIGFuZCBfbWFsbG9jIGFuZCBfZnJlZSBhcmUgYWRkZWQgYXMgQyBSVEwgc3R1YnMuICBBcyBhIHJlc3VsdCwKLSAgdGhlIG9yaWdpbmFsIEMgc291cmNlcyBvZiB6bGliIGNhbiBiZSBjb21waWxlZCBvdXQgb2YgdGhlIGJveCwKLSAgYW5kIGxpbmtlZCB0byB0aGUgWkxpYiB1bml0LgotCi0KLVN1Z2dlc3Rpb25zIGZvciBpbXByb3ZlbWVudHMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ3VycmVudGx5LCB0aGUgWkxpYiB1bml0IHByb3ZpZGVzIG9ubHkgYSBsaW1pdGVkIHdyYXBwZXIgYXJvdW5kCi10aGUgemxpYiBsaWJyYXJ5LCBhbmQgbXVjaCBvZiB0aGUgb3JpZ2luYWwgemxpYiBmdW5jdGlvbmFsaXR5IGlzCi1taXNzaW5nLiAgSGFuZGxpbmcgY29tcHJlc3NlZCBmaWxlIGZvcm1hdHMgbGlrZSBaSVAvR1pJUCBvciBQTkcKLWNhbm5vdCBiZSBpbXBsZW1lbnRlZCB3aXRob3V0IGhhdmluZyB0aGlzIGZ1bmN0aW9uYWxpdHkuCi1BcHBsaWNhdGlvbnMgdGhhdCBoYW5kbGUgdGhlc2UgZm9ybWF0cyBhcmUgZWl0aGVyIHVzaW5nIHRoZWlyIG93biwKLWR1cGxpY2F0ZWQgY29kZSwgb3Igbm90IHVzaW5nIHRoZSBaTGliIHVuaXQgYXQgYWxsLgotCi1IZXJlIGFyZSBhIGZldyBzdWdnZXN0aW9uczoKLQotLSBDaGVja3N1bSBjbGFzcyB3cmFwcGVycyBhcm91bmQgYWRsZXIzMigpIGFuZCBjcmMzMigpLCBzaW1pbGFyCi0gIHRvIHRoZSBKYXZhIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhlIGphdmEudXRpbC56aXAuQ2hlY2tzdW0KLSAgaW50ZXJmYWNlLgotCi0tIFRoZSBhYmlsaXR5IHRvIHJlYWQgYW5kIHdyaXRlIHJhdyBkZWZsYXRlIHN0cmVhbXMsIHdpdGhvdXQgdGhlCi0gIHpsaWIgc3RyZWFtIGhlYWRlciBhbmQgdHJhaWxlci4gIFJhdyBkZWZsYXRlIHN0cmVhbXMgYXJlIHVzZWQKLSAgaW4gdGhlIFpJUCBmaWxlIGZvcm1hdC4KLQotLSBUaGUgYWJpbGl0eSB0byByZWFkIGFuZCB3cml0ZSBnemlwIHN0cmVhbXMsIHVzZWQgaW4gdGhlIEdaSVAKLSAgZmlsZSBmb3JtYXQsIGFuZCBub3JtYWxseSBwcm9kdWNlZCBieSB0aGUgZ3ppcCBwcm9ncmFtLgotCi0tIFRoZSBhYmlsaXR5IHRvIHNlbGVjdCBhIGRpZmZlcmVudCBjb21wcmVzc2lvbiBzdHJhdGVneSwgdXNlZnVsCi0gIHRvIFBORyBhbmQgTU5HIGltYWdlIGNvbXByZXNzaW9uLCBhbmQgdG8gbXVsdGltZWRpYSBjb21wcmVzc2lvbgotICBpbiBnZW5lcmFsLiAgQmVzaWRlcyB0aGUgY29tcHJlc3Npb24gbGV2ZWwKLQotICAgIFRDb21wcmVzc2lvbkxldmVsID0gKGNsTm9uZSwgY2xGYXN0ZXN0LCBjbERlZmF1bHQsIGNsTWF4KTsKLQotICB3aGljaCwgaW4gZmFjdCwgY291bGQgaGF2ZSB1c2VkIHRoZSAneicgcHJlZml4IGFuZCBhdm9pZGVkCi0gIFRDb2xvci1saWtlIHN5bWJvbHMKLQotICAgIFRDb21wcmVzc2lvbkxldmVsID0gKHpjTm9uZSwgemNGYXN0ZXN0LCB6Y0RlZmF1bHQsIHpjTWF4KTsKLQotICB0aGVyZSBjb3VsZCBiZSBhIGNvbXByZXNzaW9uIHN0cmF0ZWd5Ci0KLSAgICBUQ29tcHJlc3Npb25TdHJhdGVneSA9ICh6c0RlZmF1bHQsIHpzRmlsdGVyZWQsIHpzSHVmZm1hbk9ubHksIHpzUmxlKTsKLQotLSBaSVAgYW5kIEdaSVAgc3RyZWFtIGhhbmRsaW5nIHZpYSBUU3RyZWFtcy4KLQotCi0tLQotQ29zbWluIFRydXRhIDxjb3NtaW50QGNzLnViYmNsdWoucm8+CmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2RlbHBoaS96bGliZDMyLm1hayBiL3NyYy96bGliL2NvbnRyaWIvZGVscGhpL3psaWJkMzIubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmIwMGI3Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvZGVscGhpL3psaWJkMzIubWFrCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgemxpYgotIyBGb3IgdXNlIHdpdGggRGVscGhpIGFuZCBDKysgQnVpbGRlciB1bmRlciBXaW4zMgotIyBVcGRhdGVkIGZvciB6bGliIDEuMi54IGJ5IENvc21pbiBUcnV0YQotCi0jIC0tLS0tLS0tLS0tLSBCb3JsYW5kIEMrKyAtLS0tLS0tLS0tLS0KLQotIyBUaGlzIHByb2plY3QgdXNlcyB0aGUgRGVscGhpIChmYXN0Y2FsbC9yZWdpc3RlcikgY2FsbGluZyBjb252ZW50aW9uOgotTE9DID0gLURaRVhQT1JUPV9fZmFzdGNhbGwgLURaRVhQT1JUVkE9X19jZGVjbAotCi1DQyA9IGJjYzMyCi1MRCA9IGJjYzMyCi1BUiA9IHRsaWIKLSMgZG8gbm90IHVzZSAiLXByIiBpbiBDRkxBR1MKLUNGTEFHUyA9IC1hIC1kIC1rLSAtTzIgJChMT0MpCi1MREZMQUdTID0KLQotCi0jIHZhcmlhYmxlcwotWkxJQl9MSUIgPSB6bGliLmxpYgotCi1PQkoxID0gYWRsZXIzMi5vYmogY29tcHJlc3Mub2JqIGNyYzMyLm9iaiBkZWZsYXRlLm9iaiBnemNsb3NlLm9iaiBnemxpYi5vYmogZ3pyZWFkLm9iagotT0JKMiA9IGd6d3JpdGUub2JqIGluZmJhY2sub2JqIGluZmZhc3Qub2JqIGluZmxhdGUub2JqIGluZnRyZWVzLm9iaiB0cmVlcy5vYmogdW5jb21wci5vYmogenV0aWwub2JqCi1PQkpQMSA9ICthZGxlcjMyLm9iaitjb21wcmVzcy5vYmorY3JjMzIub2JqK2RlZmxhdGUub2JqK2d6Y2xvc2Uub2JqK2d6bGliLm9iaitnenJlYWQub2JqCi1PQkpQMiA9ICtnendyaXRlLm9iaitpbmZiYWNrLm9iaitpbmZmYXN0Lm9iaitpbmZsYXRlLm9iaitpbmZ0cmVlcy5vYmordHJlZXMub2JqK3VuY29tcHIub2JqK3p1dGlsLm9iagotCi0KLSMgdGFyZ2V0cwotYWxsOiAkKFpMSUJfTElCKSBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKLQotLmMub2JqOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLWFkbGVyMzIub2JqOiBhZGxlcjMyLmMgemxpYi5oIHpjb25mLmgKLQotY29tcHJlc3Mub2JqOiBjb21wcmVzcy5jIHpsaWIuaCB6Y29uZi5oCi0KLWNyYzMyLm9iajogY3JjMzIuYyB6bGliLmggemNvbmYuaCBjcmMzMi5oCi0KLWRlZmxhdGUub2JqOiBkZWZsYXRlLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLQotZ3pjbG9zZS5vYmo6IGd6Y2xvc2UuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAotCi1nemxpYi5vYmo6IGd6bGliLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLQotZ3pyZWFkLm9iajogZ3pyZWFkLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLQotZ3p3cml0ZS5vYmo6IGd6d3JpdGUuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAotCi1pbmZiYWNrLm9iajogaW5mYmFjay5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAotIGluZmZhc3QuaCBpbmZmaXhlZC5oCi0KLWluZmZhc3Qub2JqOiBpbmZmYXN0LmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCi0gaW5mZmFzdC5oCi0KLWluZmxhdGUub2JqOiBpbmZsYXRlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCi0gaW5mZmFzdC5oIGluZmZpeGVkLmgKLQotaW5mdHJlZXMub2JqOiBpbmZ0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAotCi10cmVlcy5vYmo6IHRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBkZWZsYXRlLmggdHJlZXMuaAotCi11bmNvbXByLm9iajogdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oCi0KLXp1dGlsLm9iajogenV0aWwuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0KLWV4YW1wbGUub2JqOiB0ZXN0L2V4YW1wbGUuYyB6bGliLmggemNvbmYuaAotCi1taW5pZ3ppcC5vYmo6IHRlc3QvbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAotCi0KLSMgRm9yIHRoZSBzYWtlIG9mIHRoZSBvbGQgQm9ybGFuZCBtYWtlLAotIyB0aGUgY29tbWFuZCBsaW5lIGlzIGN1dCB0byBmaXQgaW4gdGhlIE1TLURPUyAxMjggYnl0ZSBsaW1pdDoKLSQoWkxJQl9MSUIpOiAkKE9CSjEpICQoT0JKMikKLQktZGVsICQoWkxJQl9MSUIpCi0JJChBUikgJChaTElCX0xJQikgJChPQkpQMSkKLQkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlAyKQotCi0KLSMgdGVzdGluZwotdGVzdDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCi0JZXhhbXBsZQotCWVjaG8gaGVsbG8gd29ybGQgfCBtaW5pZ3ppcCB8IG1pbmlnemlwIC1kCi0KLWV4YW1wbGUuZXhlOiBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQotCSQoTEQpICQoTERGTEFHUykgZXhhbXBsZS5vYmogJChaTElCX0xJQikKLQotbWluaWd6aXAuZXhlOiBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKLQkkKExEKSAkKExERkxBR1MpIG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQotCi0KLSMgY2xlYW51cAotY2xlYW46Ci0JLWRlbCAqLm9iagotCS1kZWwgKi5leGUKLQktZGVsICoubGliCi0JLWRlbCAqLnRkcwotCS1kZWwgemxpYi5iYWsKLQktZGVsIGZvby5negotCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi5idWlsZCBiL3NyYy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLmJ1aWxkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjkwZDZiLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLmJ1aWxkCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+DQotPHByb2plY3QgbmFtZT0iRG90WkxpYiIgZGVmYXVsdD0iYnVpbGQiIGJhc2VkaXI9Ii4vRG90WkxpYiI+DQotCTxkZXNjcmlwdGlvbj5BIC5OZXQgd3JhcHBlciBsaWJyYXJ5IGFyb3VuZCBaTGliMS5kbGw8L2Rlc2NyaXB0aW9uPg0KLQ0KLQk8cHJvcGVydHkgbmFtZT0ibnVuaXQubG9jYXRpb24iIHZhbHVlPSJjOi9wcm9ncmFtIGZpbGVzL05Vbml0IFYyLjEvYmluIiAvPg0KLQk8cHJvcGVydHkgbmFtZT0iYnVpbGQucm9vdCIgdmFsdWU9ImJpbiIgLz4NCi0NCi0JPHByb3BlcnR5IG5hbWU9ImRlYnVnIiB2YWx1ZT0idHJ1ZSIgLz4NCi0JPHByb3BlcnR5IG5hbWU9Im51bml0IiB2YWx1ZT0idHJ1ZSIgLz4NCi0NCi0JPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmZvbGRlciIgdmFsdWU9IiR7YnVpbGQucm9vdH0vZGVidWcvIiBpZj0iJHtkZWJ1Z30iIC8+DQotCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5mb2xkZXIiIHZhbHVlPSIke2J1aWxkLnJvb3R9L3JlbGVhc2UvIiB1bmxlc3M9IiR7ZGVidWd9IiAvPg0KLQ0KLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0iUmVtb3ZlIGFsbCBnZW5lcmF0ZWQgZmlsZXMiPg0KLQkJPGRlbGV0ZSBkaXI9IiR7YnVpbGQucm9vdH0iIGZhaWxvbmVycm9yPSJmYWxzZSIgLz4NCi0JPC90YXJnZXQ+DQotDQotCTx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlc2NyaXB0aW9uPSJjb21waWxlcyB0aGUgc291cmNlIGNvZGUiPg0KLQ0KLQkJPG1rZGlyIGRpcj0iJHtidWlsZC5mb2xkZXJ9IiAvPg0KLQkJPGNzYyB0YXJnZXQ9ImxpYnJhcnkiIG91dHB1dD0iJHtidWlsZC5mb2xkZXJ9RG90WkxpYi5kbGwiIGRlYnVnPSIke2RlYnVnfSI+DQotCQkJPHJlZmVyZW5jZXMgYmFzZWRpcj0iJHtudW5pdC5sb2NhdGlvbn0iPg0KLQkJCQk8aW5jbHVkZXMgaWY9IiR7bnVuaXR9IiBuYW1lPSJudW5pdC5mcmFtZXdvcmsuZGxsIiAvPg0KLQkJCTwvcmVmZXJlbmNlcz4NCi0JCQk8c291cmNlcz4NCi0JCQkJPGluY2x1ZGVzIG5hbWU9IiouY3MiIC8+DQotCQkJCTxleGNsdWRlcyBuYW1lPSJVbml0VGVzdHMuY3MiIHVubGVzcz0iJHtudW5pdH0iIC8+DQotCQkJPC9zb3VyY2VzPg0KLQkJCTxhcmcgdmFsdWU9Ii9kOm51bml0IiBpZj0iJHtudW5pdH0iIC8+DQotCQk8L2NzYz4NCi0JPC90YXJnZXQ+DQotDQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLmNobSBiL3NyYy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLmNobQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxNGE0NC4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi5jaG0KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9Bc3NlbWJseUluZm8uY3MgYi9zcmMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9Bc3NlbWJseUluZm8uY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OTFiZmMuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQXNzZW1ibHlJbmZvLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247DQotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsNCi0NCi0vLw0KLS8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcNCi0vLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbg0KLS8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4NCi0vLw0KLVthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiRG90WkxpYiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiLk5ldCBiaW5kaW5ncyBmb3IgWkxpYiBjb21wcmVzc2lvbiBkbGwgMS4yLngiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIkhlbnJpayBSYXZuIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIihjKSAyMDA0IGJ5IEhlbnJpayBSYXZuIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQ0KLQ0KLS8vDQotLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoNCi0vLw0KLS8vICAgICAgTWFqb3IgVmVyc2lvbg0KLS8vICAgICAgTWlub3IgVmVyc2lvbg0KLS8vICAgICAgQnVpbGQgTnVtYmVyDQotLy8gICAgICBSZXZpc2lvbg0KLS8vDQotLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgUmV2aXNpb24gYW5kIEJ1aWxkIE51bWJlcnMNCi0vLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93Og0KLQ0KLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQ0KLQ0KLS8vDQotLy8gSW4gb3JkZXIgdG8gc2lnbiB5b3VyIGFzc2VtYmx5IHlvdSBtdXN0IHNwZWNpZnkgYSBrZXkgdG8gdXNlLiBSZWZlciB0byB0aGUNCi0vLyBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBhc3NlbWJseSBzaWduaW5nLg0KLS8vDQotLy8gVXNlIHRoZSBhdHRyaWJ1dGVzIGJlbG93IHRvIGNvbnRyb2wgd2hpY2gga2V5IGlzIHVzZWQgZm9yIHNpZ25pbmcuDQotLy8NCi0vLyBOb3RlczoNCi0vLyAgICgqKSBJZiBubyBrZXkgaXMgc3BlY2lmaWVkLCB0aGUgYXNzZW1ibHkgaXMgbm90IHNpZ25lZC4NCi0vLyAgICgqKSBLZXlOYW1lIHJlZmVycyB0byBhIGtleSB0aGF0IGhhcyBiZWVuIGluc3RhbGxlZCBpbiB0aGUgQ3J5cHRvIFNlcnZpY2UNCi0vLyAgICAgICBQcm92aWRlciAoQ1NQKSBvbiB5b3VyIG1hY2hpbmUuIEtleUZpbGUgcmVmZXJzIHRvIGEgZmlsZSB3aGljaCBjb250YWlucw0KLS8vICAgICAgIGEga2V5Lg0KLS8vICAgKCopIElmIHRoZSBLZXlGaWxlIGFuZCB0aGUgS2V5TmFtZSB2YWx1ZXMgYXJlIGJvdGggc3BlY2lmaWVkLCB0aGUNCi0vLyAgICAgICBmb2xsb3dpbmcgcHJvY2Vzc2luZyBvY2N1cnM6DQotLy8gICAgICAgKDEpIElmIHRoZSBLZXlOYW1lIGNhbiBiZSBmb3VuZCBpbiB0aGUgQ1NQLCB0aGF0IGtleSBpcyB1c2VkLg0KLS8vICAgICAgICgyKSBJZiB0aGUgS2V5TmFtZSBkb2VzIG5vdCBleGlzdCBhbmQgdGhlIEtleUZpbGUgZG9lcyBleGlzdCwgdGhlIGtleQ0KLS8vICAgICAgICAgICBpbiB0aGUgS2V5RmlsZSBpcyBpbnN0YWxsZWQgaW50byB0aGUgQ1NQIGFuZCB1c2VkLg0KLS8vICAgKCopIEluIG9yZGVyIHRvIGNyZWF0ZSBhIEtleUZpbGUsIHlvdSBjYW4gdXNlIHRoZSBzbi5leGUgKFN0cm9uZyBOYW1lKSB1dGlsaXR5Lg0KLS8vICAgICAgIFdoZW4gc3BlY2lmeWluZyB0aGUgS2V5RmlsZSwgdGhlIGxvY2F0aW9uIG9mIHRoZSBLZXlGaWxlIHNob3VsZCBiZQ0KLS8vICAgICAgIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IG91dHB1dCBkaXJlY3Rvcnkgd2hpY2ggaXMNCi0vLyAgICAgICAlUHJvamVjdCBEaXJlY3RvcnklXG9ialw8Y29uZmlndXJhdGlvbj4uIEZvciBleGFtcGxlLCBpZiB5b3VyIEtleUZpbGUgaXMNCi0vLyAgICAgICBsb2NhdGVkIGluIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSwgeW91IHdvdWxkIHNwZWNpZnkgdGhlIEFzc2VtYmx5S2V5RmlsZQ0KLS8vICAgICAgIGF0dHJpYnV0ZSBhcyBbYXNzZW1ibHk6IEFzc2VtYmx5S2V5RmlsZSgiLi5cXC4uXFxteWtleS5zbmsiKV0NCi0vLyAgICgqKSBEZWxheSBTaWduaW5nIGlzIGFuIGFkdmFuY2VkIG9wdGlvbiAtIHNlZSB0aGUgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrDQotLy8gICAgICAgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzLg0KLS8vDQotW2Fzc2VtYmx5OiBBc3NlbWJseURlbGF5U2lnbihmYWxzZSldDQotW2Fzc2VtYmx5OiBBc3NlbWJseUtleUZpbGUoIiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlLZXlOYW1lKCIiKV0NCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9DaGVja3N1bUltcGwuY3MgYi9zcmMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9DaGVja3N1bUltcGwuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OGIyZmMuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQ2hlY2tzdW1JbXBsLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8vDQotLy8gqSBDb3B5cmlnaHQgSGVucmlrIFJhdm4gMjAwNA0KLS8vDQotLy8gVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBhcmUgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuDQotLy8gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpDQotLy8NCi0NCi11c2luZyBTeXN0ZW07DQotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOw0KLXVzaW5nIFN5c3RlbS5UZXh0Ow0KLQ0KLQ0KLW5hbWVzcGFjZSBEb3RaTGliDQotew0KLSAgICAjcmVnaW9uIENoZWNrc3VtR2VuZXJhdG9yQmFzZQ0KLSAgICAvLy8gPHN1bW1hcnk+DQotICAgIC8vLyBJbXBsZW1lbnRzIHRoZSBjb21tb24gZnVuY3Rpb25hbGl0eSBuZWVkZWQgZm9yIGFsbCA8c2VlIGNyZWY9IkNoZWNrc3VtR2VuZXJhdG9yIi8+cw0KLSAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAvLy8gPGV4YW1wbGU+PC9leGFtcGxlPg0KLSAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2hlY2tzdW1HZW5lcmF0b3JCYXNlIDogQ2hlY2tzdW1HZW5lcmF0b3INCi0gICAgew0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIFRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBjaGVja3N1bQ0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHByb3RlY3RlZCB1aW50IF9jdXJyZW50Ow0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjaGVja3N1bSBnZW5lcmF0b3IgYmFzZSAtIHRoZSBjdXJyZW50IGNoZWNrc3VtIGlzDQotICAgICAgICAvLy8gc2V0IHRvIHplcm8NCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICBwdWJsaWMgQ2hlY2tzdW1HZW5lcmF0b3JCYXNlKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBfY3VycmVudCA9IDA7DQotICAgICAgICB9DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNoZWNrc3VtIGdlbmVyYXRvciBiYXNld2l0aCBhIHNwZWNpZmllZCB2YWx1ZQ0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5pdGlhbFZhbHVlIj5UaGUgdmFsdWUgdG8gc2V0IHRoZSBjdXJyZW50IGNoZWNrc3VtIHRvPC9wYXJhbT4NCi0gICAgICAgIHB1YmxpYyBDaGVja3N1bUdlbmVyYXRvckJhc2UodWludCBpbml0aWFsVmFsdWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgX2N1cnJlbnQgPSBpbml0aWFsVmFsdWU7DQotICAgICAgICB9DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gUmVzZXRzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHRvIHplcm8NCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICBwdWJsaWMgdm9pZCBSZXNldCgpIHsgX2N1cnJlbnQgPSAwOyB9DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gR2V0cyB0aGUgY3VycmVudCBjaGVja3N1bSB2YWx1ZQ0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHB1YmxpYyB1aW50IFZhbHVlIHsgZ2V0IHsgcmV0dXJuIF9jdXJyZW50OyB9IH0NCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggcGFydCBvZiBhbiBhcnJheSBvZiBieXRlcw0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5XaGVyZSBpbiA8Yz5kYXRhPC9jPiB0byBzdGFydCB1cGRhdGluZzwvcGFyYW0+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gPGM+ZGF0YTwvYz4gdG8gdXNlPC9wYXJhbT4NCi0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj5UaGUgc3VtIG9mIG9mZnNldCBhbmQgY291bnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiA8Yz5kYXRhPC9jPjwvZXhjZXB0aW9uPg0KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiI+PGM+ZGF0YTwvYz4gaXMgYSBudWxsIHJlZmVyZW5jZTwvZXhjZXB0aW9uPg0KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj5PZmZzZXQgb3IgY291bnQgaXMgbmVnYXRpdmUuPC9leGNlcHRpb24+DQotICAgICAgICAvLy8gPHJlbWFya3M+QWxsIHRoZSBvdGhlciA8Yz5VcGRhdGU8L2M+IG1ldGhvZHMgYXJlIGltcGxtZW5ldGVkIGluIHRlcm1zIG9mIHRoaXMgb25lLg0KLSAgICAgICAgLy8vIFRoaXMgaXMgdGhlcmVmb3JlIHRoZSBvbmx5IG1ldGhvZCBhIGRlcml2ZWQgY2xhc3MgaGFzIHRvIGltcGxlbWVudDwvcmVtYXJrcz4NCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFVwZGF0ZShieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KTsNCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggYW4gYXJyYXkgb2YgYnl0ZXMuDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgZGF0YSB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPg0KLSAgICAgICAgcHVibGljIHZvaWQgVXBkYXRlKGJ5dGVbXSBkYXRhKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFVwZGF0ZShkYXRhLCAwLCBkYXRhLkxlbmd0aCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIHRoZSBkYXRhIGZyb20gYSBzdHJpbmcNCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBzdHJpbmcgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4NCi0gICAgICAgIC8vLyA8cmVtYXJrcz5UaGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBjb252ZXJ0ZWQgYnkgdGhlIFVURi04IGVuY29kaW5nPC9yZW1hcmtzPg0KLSAgICAgICAgcHVibGljIHZvaWQgVXBkYXRlKHN0cmluZyBkYXRhKQ0KLSAgICAgICAgew0KLQkJCVVwZGF0ZShFbmNvZGluZy5VVEY4LkdldEJ5dGVzKGRhdGEpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggdGhlIGRhdGEgZnJvbSBhIHN0cmluZywgdXNpbmcgYSBzcGVjaWZpYyBlbmNvZGluZw0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIHN0cmluZyB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlbmNvZGluZyI+VGhlIGVuY29kaW5nIHRvIHVzZTwvcGFyYW0+DQotICAgICAgICBwdWJsaWMgdm9pZCBVcGRhdGUoc3RyaW5nIGRhdGEsIEVuY29kaW5nIGVuY29kaW5nKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFVwZGF0ZShlbmNvZGluZy5HZXRCeXRlcyhkYXRhKSk7DQotICAgICAgICB9DQotDQotICAgIH0NCi0gICAgI2VuZHJlZ2lvbg0KLQ0KLSAgICAjcmVnaW9uIENSQzMyDQotICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgLy8vIEltcGxlbWVudHMgYSBDUkMzMiBjaGVja3N1bSBnZW5lcmF0b3INCi0gICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBDUkMzMkNoZWNrc3VtIDogQ2hlY2tzdW1HZW5lcmF0b3JCYXNlDQotICAgIHsNCi0gICAgICAgICNyZWdpb24gRExMIGltcG9ydHMNCi0NCi0gICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiB1aW50IGNyYzMyKHVpbnQgY3JjLCBpbnQgZGF0YSwgdWludCBsZW5ndGgpOw0KLQ0KLSAgICAgICAgI2VuZHJlZ2lvbg0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBDUkMzMiBjaGVja3N1bSBnZW5lcmF0b3INCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICBwdWJsaWMgQ1JDMzJDaGVja3N1bSgpIDogYmFzZSgpIHt9DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIENSQzMyIGNoZWNrc3VtIGdlbmVyYXRvciB3aXRoIGEgc3BlY2lmaWVkIHZhbHVlDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbml0aWFsVmFsdWUiPlRoZSB2YWx1ZSB0byBzZXQgdGhlIGN1cnJlbnQgY2hlY2tzdW0gdG88L3BhcmFtPg0KLSAgICAgICAgcHVibGljIENSQzMyQ2hlY2tzdW0odWludCBpbml0aWFsVmFsdWUpIDogYmFzZShpbml0aWFsVmFsdWUpIHt9DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIHBhcnQgb2YgYW4gYXJyYXkgb2YgYnl0ZXMNCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBkYXRhIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aDwvcGFyYW0+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+V2hlcmUgaW4gPGM+ZGF0YTwvYz4gdG8gc3RhcnQgdXBkYXRpbmc8L3BhcmFtPg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyBmcm9tIDxjPmRhdGE8L2M+IHRvIHVzZTwvcGFyYW0+DQotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudEV4Y2VwdGlvbiI+VGhlIHN1bSBvZiBvZmZzZXQgYW5kIGNvdW50IGlzIGxhcmdlciB0aGFuIHRoZSBsZW5ndGggb2YgPGM+ZGF0YTwvYz48L2V4Y2VwdGlvbj4NCi0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik51bGxSZWZlcmVuY2VFeGNlcHRpb24iPjxjPmRhdGE8L2M+IGlzIGEgbnVsbCByZWZlcmVuY2U8L2V4Y2VwdGlvbj4NCi0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiI+T2Zmc2V0IG9yIGNvdW50IGlzIG5lZ2F0aXZlLjwvZXhjZXB0aW9uPg0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgVXBkYXRlKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgY291bnQgPCAwKSB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgaWYgKChvZmZzZXQrY291bnQpID4gZGF0YS5MZW5ndGgpIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOw0KLSAgICAgICAgICAgIEdDSGFuZGxlIGhEYXRhID0gR0NIYW5kbGUuQWxsb2MoZGF0YSwgR0NIYW5kbGVUeXBlLlBpbm5lZCk7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBfY3VycmVudCA9IGNyYzMyKF9jdXJyZW50LCBoRGF0YS5BZGRyT2ZQaW5uZWRPYmplY3QoKS5Ub0ludDMyKCkrb2Zmc2V0LCAodWludCljb3VudCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGhEYXRhLkZyZWUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgIH0NCi0gICAgI2VuZHJlZ2lvbg0KLQ0KLSAgICAjcmVnaW9uIEFkbGVyDQotICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgLy8vIEltcGxlbWVudHMgYSBjaGVja3N1bSBnZW5lcmF0b3IgdGhhdCBjb21wdXRlcyB0aGUgQWRsZXIgY2hlY2tzdW0gb24gZGF0YQ0KLSAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEFkbGVyQ2hlY2tzdW0gOiBDaGVja3N1bUdlbmVyYXRvckJhc2UNCi0gICAgew0KLSAgICAgICAgI3JlZ2lvbiBETEwgaW1wb3J0cw0KLQ0KLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHVpbnQgYWRsZXIzMih1aW50IGFkbGVyLCBpbnQgZGF0YSwgdWludCBsZW5ndGgpOw0KLQ0KLSAgICAgICAgI2VuZHJlZ2lvbg0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBBZGxlciBjaGVja3N1bSBnZW5lcmF0b3INCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICBwdWJsaWMgQWRsZXJDaGVja3N1bSgpIDogYmFzZSgpIHt9DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEFkbGVyIGNoZWNrc3VtIGdlbmVyYXRvciB3aXRoIGEgc3BlY2lmaWVkIHZhbHVlDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbml0aWFsVmFsdWUiPlRoZSB2YWx1ZSB0byBzZXQgdGhlIGN1cnJlbnQgY2hlY2tzdW0gdG88L3BhcmFtPg0KLSAgICAgICAgcHVibGljIEFkbGVyQ2hlY2tzdW0odWludCBpbml0aWFsVmFsdWUpIDogYmFzZShpbml0aWFsVmFsdWUpIHt9DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIHBhcnQgb2YgYW4gYXJyYXkgb2YgYnl0ZXMNCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBkYXRhIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aDwvcGFyYW0+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+V2hlcmUgaW4gPGM+ZGF0YTwvYz4gdG8gc3RhcnQgdXBkYXRpbmc8L3BhcmFtPg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyBmcm9tIDxjPmRhdGE8L2M+IHRvIHVzZTwvcGFyYW0+DQotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudEV4Y2VwdGlvbiI+VGhlIHN1bSBvZiBvZmZzZXQgYW5kIGNvdW50IGlzIGxhcmdlciB0aGFuIHRoZSBsZW5ndGggb2YgPGM+ZGF0YTwvYz48L2V4Y2VwdGlvbj4NCi0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik51bGxSZWZlcmVuY2VFeGNlcHRpb24iPjxjPmRhdGE8L2M+IGlzIGEgbnVsbCByZWZlcmVuY2U8L2V4Y2VwdGlvbj4NCi0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiI+T2Zmc2V0IG9yIGNvdW50IGlzIG5lZ2F0aXZlLjwvZXhjZXB0aW9uPg0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgVXBkYXRlKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgY291bnQgPCAwKSB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgaWYgKChvZmZzZXQrY291bnQpID4gZGF0YS5MZW5ndGgpIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOw0KLSAgICAgICAgICAgIEdDSGFuZGxlIGhEYXRhID0gR0NIYW5kbGUuQWxsb2MoZGF0YSwgR0NIYW5kbGVUeXBlLlBpbm5lZCk7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBfY3VycmVudCA9IGFkbGVyMzIoX2N1cnJlbnQsIGhEYXRhLkFkZHJPZlBpbm5lZE9iamVjdCgpLlRvSW50MzIoKStvZmZzZXQsICh1aW50KWNvdW50KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaERhdGEuRnJlZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLSAgICAjZW5kcmVnaW9uDQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0NpcmN1bGFyQnVmZmVyLmNzIGIvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQ2lyY3VsYXJCdWZmZXIuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxY2FiM2EuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQ2lyY3VsYXJCdWZmZXIuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLw0KLS8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCi0vLw0KLS8vIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLg0KLS8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQ0KLS8vDQotDQotdXNpbmcgU3lzdGVtOw0KLXVzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsNCi0NCi1uYW1lc3BhY2UgRG90WkxpYg0KLXsNCi0NCi0JLy8vIDxzdW1tYXJ5Pg0KLQkvLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgY2lyY3VsYXIgYnVmZmVyDQotCS8vLyA8L3N1bW1hcnk+DQotCWludGVybmFsIGNsYXNzIENpcmN1bGFyQnVmZmVyDQotCXsNCi0gICAgICAgICNyZWdpb24gUHJpdmF0ZSBkYXRhDQotICAgICAgICBwcml2YXRlIGludCBfY2FwYWNpdHk7DQotICAgICAgICBwcml2YXRlIGludCBfaGVhZDsNCi0gICAgICAgIHByaXZhdGUgaW50IF90YWlsOw0KLSAgICAgICAgcHJpdmF0ZSBpbnQgX3NpemU7DQotICAgICAgICBwcml2YXRlIGJ5dGVbXSBfYnVmZmVyOw0KLSAgICAgICAgI2VuZHJlZ2lvbg0KLQ0KLSAgICAgICAgcHVibGljIENpcmN1bGFyQnVmZmVyKGludCBjYXBhY2l0eSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQoIGNhcGFjaXR5ID4gMCApOw0KLSAgICAgICAgICAgIF9idWZmZXIgPSBuZXcgYnl0ZVtjYXBhY2l0eV07DQotICAgICAgICAgICAgX2NhcGFjaXR5ID0gY2FwYWNpdHk7DQotICAgICAgICAgICAgX2hlYWQgPSAwOw0KLSAgICAgICAgICAgIF90YWlsID0gMDsNCi0gICAgICAgICAgICBfc2l6ZSA9IDA7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgaW50IFNpemUgeyBnZXQgeyByZXR1cm4gX3NpemU7IH0gfQ0KLQ0KLSAgICAgICAgcHVibGljIGludCBQdXQoYnl0ZVtdIHNvdXJjZSwgaW50IG9mZnNldCwgaW50IGNvdW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIERlYnVnLkFzc2VydCggY291bnQgPiAwICk7DQotICAgICAgICAgICAgaW50IHRydWVDb3VudCA9IE1hdGguTWluKGNvdW50LCBfY2FwYWNpdHkgLSBTaXplKTsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRydWVDb3VudDsgKytpKQ0KLSAgICAgICAgICAgICAgICBfYnVmZmVyWyhfdGFpbCtpKSAlIF9jYXBhY2l0eV0gPSBzb3VyY2Vbb2Zmc2V0K2ldOw0KLSAgICAgICAgICAgIF90YWlsICs9IHRydWVDb3VudDsNCi0gICAgICAgICAgICBfdGFpbCAlPSBfY2FwYWNpdHk7DQotICAgICAgICAgICAgX3NpemUgKz0gdHJ1ZUNvdW50Ow0KLSAgICAgICAgICAgIHJldHVybiB0cnVlQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgYm9vbCBQdXQoYnl0ZSBiKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChTaXplID09IF9jYXBhY2l0eSkgLy8gbm8gcm9vbQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgX2J1ZmZlcltfdGFpbCsrXSA9IGI7DQotICAgICAgICAgICAgX3RhaWwgJT0gX2NhcGFjaXR5Ow0KLSAgICAgICAgICAgICsrX3NpemU7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgaW50IEdldChieXRlW10gZGVzdGluYXRpb24sIGludCBvZmZzZXQsIGludCBjb3VudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbnQgdHJ1ZUNvdW50ID0gTWF0aC5NaW4oY291bnQsU2l6ZSk7DQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cnVlQ291bnQ7ICsraSkNCi0gICAgICAgICAgICAgICAgZGVzdGluYXRpb25bb2Zmc2V0ICsgaV0gPSBfYnVmZmVyWyhfaGVhZCtpKSAlIF9jYXBhY2l0eV07DQotICAgICAgICAgICAgX2hlYWQgKz0gdHJ1ZUNvdW50Ow0KLSAgICAgICAgICAgIF9oZWFkICU9IF9jYXBhY2l0eTsNCi0gICAgICAgICAgICBfc2l6ZSAtPSB0cnVlQ291bnQ7DQotICAgICAgICAgICAgcmV0dXJuIHRydWVDb3VudDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBpbnQgR2V0KCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoU2l6ZSA9PSAwKQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7DQotDQotICAgICAgICAgICAgaW50IHJlc3VsdCA9IChpbnQpX2J1ZmZlcltfaGVhZCsrICUgX2NhcGFjaXR5XTsNCi0gICAgICAgICAgICAtLV9zaXplOw0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQ29kZWNCYXNlLmNzIGIvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQ29kZWNCYXNlLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmU2ZGEzLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0NvZGVjQmFzZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vLw0KLS8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCi0vLw0KLS8vIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLg0KLS8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQ0KLS8vDQotDQotdXNpbmcgU3lzdGVtOw0KLXVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCi0NCi1uYW1lc3BhY2UgRG90WkxpYg0KLXsNCi0JLy8vIDxzdW1tYXJ5Pg0KLQkvLy8gSW1wbGVtZW50cyB0aGUgY29tbW9uIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIGZvciBhbGwgPHNlZSBjcmVmPSJDb2RlYyIvPnMNCi0JLy8vIDwvc3VtbWFyeT4NCi0JcHVibGljIGFic3RyYWN0IGNsYXNzIENvZGVjQmFzZSA6IENvZGVjLCBJRGlzcG9zYWJsZQ0KLQl7DQotDQotICAgICAgICAjcmVnaW9uIERhdGEgbWVtYmVycw0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIEluc3RhbmNlIG9mIHRoZSBpbnRlcm5hbCB6bGliIGJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCBpcw0KLSAgICAgICAgLy8vIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zIGluIHRoZSB6bGliIGRsbA0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIGludGVybmFsIFpTdHJlYW0gX3p0cmVhbSA9IG5ldyBaU3RyZWFtKCk7DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gVHJ1ZSBpZiB0aGUgb2JqZWN0IGluc3RhbmNlIGhhcyBiZWVuIGRpc3Bvc2VkLCBmYWxzZSBvdGhlcndpc2UNCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICBwcm90ZWN0ZWQgYm9vbCBfaXNEaXNwb3NlZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIFRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBidWZmZXJzDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgcHJvdGVjdGVkIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDE2Mzg0Ow0KLQ0KLSAgICAgICAgcHJpdmF0ZSBieXRlW10gX291dEJ1ZmZlciA9IG5ldyBieXRlW2tCdWZmZXJTaXplXTsNCi0gICAgICAgIHByaXZhdGUgYnl0ZVtdIF9pbkJ1ZmZlciA9IG5ldyBieXRlW2tCdWZmZXJTaXplXTsNCi0NCi0gICAgICAgIHByaXZhdGUgR0NIYW5kbGUgX2hJbnB1dDsNCi0gICAgICAgIHByaXZhdGUgR0NIYW5kbGUgX2hPdXRwdXQ7DQotDQotICAgICAgICBwcml2YXRlIHVpbnQgX2NoZWNrc3VtID0gMDsNCi0NCi0gICAgICAgICNlbmRyZWdpb24NCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPGM+Q29kZUJhc2U8L2M+IGNsYXNzLg0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0JCXB1YmxpYyBDb2RlY0Jhc2UoKQ0KLQkJew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgX2hJbnB1dCA9IEdDSGFuZGxlLkFsbG9jKF9pbkJ1ZmZlciwgR0NIYW5kbGVUeXBlLlBpbm5lZCk7DQotICAgICAgICAgICAgICAgIF9oT3V0cHV0ID0gR0NIYW5kbGUuQWxsb2MoX291dEJ1ZmZlciwgR0NIYW5kbGVUeXBlLlBpbm5lZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBDbGVhblVwKGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgdGhyb3c7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLQ0KLSAgICAgICAgI3JlZ2lvbiBDb2RlYyBNZW1iZXJzDQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gT2NjdXJzIHdoZW4gbW9yZSBwcm9jZXNzZWQgZGF0YSBhcmUgYXZhaWxhYmxlLg0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHB1YmxpYyBldmVudCBEYXRhQXZhaWxhYmxlSGFuZGxlciBEYXRhQXZhaWxhYmxlOw0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIEZpcmVzIHRoZSA8c2VlIGNyZWY9IkRhdGFBdmFpbGFibGUiLz4gZXZlbnQNCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBPbkRhdGFBdmFpbGFibGUoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChfenRyZWFtLnRvdGFsX291dCA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoRGF0YUF2YWlsYWJsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgRGF0YUF2YWlsYWJsZSggX291dEJ1ZmZlciwgMCwgKGludClfenRyZWFtLnRvdGFsX291dCk7DQotICAgICAgICAgICAgICAgIHJlc2V0T3V0cHV0KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIEFkZHMgbW9yZSBkYXRhIHRvIHRoZSBjb2RlYyB0byBiZSBwcm9jZXNzZWQuDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5CeXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgYWRkZWQgdG8gdGhlIGNvZGVjPC9wYXJhbT4NCi0gICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4NCi0gICAgICAgIHB1YmxpYyB2b2lkIEFkZChieXRlW10gZGF0YSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBBZGQoZGF0YSwwLGRhdGEuTGVuZ3RoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBBZGRzIG1vcmUgZGF0YSB0byB0aGUgY29kZWMgdG8gYmUgcHJvY2Vzc2VkLg0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+Qnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2RlYzwvcGFyYW0+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIHRvIGFkZCBmcm9tIDxjPmRhdGE8L2M+PC9wYXJhbT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPlRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWRkPC9wYXJhbT4NCi0gICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4NCi0gICAgICAgIC8vLyA8cmVtYXJrcz5UaGlzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYSBkZXJpdmVkIGNsYXNzPC9yZW1hcmtzPg0KLSAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgQWRkKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpOw0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIEZpbmlzaGVzIHVwIGFueSBwZW5kaW5nIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYW5kIGhhbmRsZWQuDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgLy8vIDxyZW1hcmtzPlRoaXMgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIGRlcml2ZWQgY2xhc3M8L3JlbWFya3M+DQotICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBGaW5pc2goKTsNCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBHZXRzIHRoZSBjaGVja3N1bSBvZiB0aGUgZGF0YSB0aGF0IGhhcyBiZWVuIGFkZGVkIHNvIGZhcg0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHB1YmxpYyB1aW50IENoZWNrc3VtIHsgZ2V0IHsgcmV0dXJuIF9jaGVja3N1bTsgfSB9DQotDQotICAgICAgICAjZW5kcmVnaW9uDQotDQotICAgICAgICAjcmVnaW9uIERlc3RydWN0b3IgJiBJRGlzcG9zYWJsZSBzdHVmZg0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIERlc3Ryb3lzIHRoaXMgaW5zdGFuY2UNCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICB+Q29kZWNCYXNlKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDbGVhblVwKGZhbHNlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBSZWxlYXNlcyBhbnkgdW5tYW5hZ2VkIHJlc291cmNlcyBhbmQgY2FsbHMgdGhlIDxzZWUgY3JlZj0iQ2xlYW5VcCgpIi8+IG1ldGhvZCBvZiB0aGUgZGVyaXZlZCBjbGFzcw0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENsZWFuVXAodHJ1ZSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gUGVyZm9ybXMgYW55IGNvZGVjIHNwZWNpZmljIGNsZWFudXANCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICAvLy8gPHJlbWFya3M+VGhpcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgZGVyaXZlZCBjbGFzczwvcmVtYXJrcz4NCi0gICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIENsZWFuVXAoKTsNCi0NCi0gICAgICAgIC8vIHBlcmZvcm1zIHRoZSByZWxlYXNlIG9mIHRoZSBoYW5kbGVzIGFuZCBjYWxscyB0aGUgZGVyZWl2ZWQgQ2xlYW5VcCgpDQotICAgICAgICBwcml2YXRlIHZvaWQgQ2xlYW5VcChib29sIGlzRGlzcG9zaW5nKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBDbGVhblVwKCk7DQotICAgICAgICAgICAgICAgIGlmIChfaElucHV0LklzQWxsb2NhdGVkKQ0KLSAgICAgICAgICAgICAgICAgICAgX2hJbnB1dC5GcmVlKCk7DQotICAgICAgICAgICAgICAgIGlmIChfaE91dHB1dC5Jc0FsbG9jYXRlZCkNCi0gICAgICAgICAgICAgICAgICAgIF9oT3V0cHV0LkZyZWUoKTsNCi0NCi0gICAgICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0NCi0gICAgICAgICNlbmRyZWdpb24NCi0NCi0gICAgICAgICNyZWdpb24gSGVscGVyIG1ldGhvZHMNCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBDb3BpZXMgYSBudW1iZXIgb2YgYnl0ZXMgdG8gdGhlIGludGVybmFsIGNvZGVjIGJ1ZmZlciAtIHJlYWR5IGZvciBwcm9jY2VzaW5nDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgYnl0ZSBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIHRvIGNvcHk8L3BhcmFtPg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdGFydEluZGV4Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgdG8gY29weTwvcGFyYW0+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgZnJvbSA8Yz5kYXRhPC9jPjwvcGFyYW0+DQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5SW5wdXQoYnl0ZVtdIGRhdGEsIGludCBzdGFydEluZGV4LCBpbnQgY291bnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgQXJyYXkuQ29weShkYXRhLCBzdGFydEluZGV4LCBfaW5CdWZmZXIsMCwgY291bnQpOw0KLSAgICAgICAgICAgIF96dHJlYW0ubmV4dF9pbiA9IF9oSW5wdXQuQWRkck9mUGlubmVkT2JqZWN0KCk7DQotICAgICAgICAgICAgX3p0cmVhbS50b3RhbF9pbiA9IDA7DQotICAgICAgICAgICAgX3p0cmVhbS5hdmFpbF9pbiA9ICh1aW50KWNvdW50Ow0KLQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIFJlc2V0cyB0aGUgaW50ZXJuYWwgb3V0cHV0IGJ1ZmZlcnMgdG8gYSBrbm93biBzdGF0ZSAtIHJlYWR5IGZvciBwcm9jZXNzaW5nDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcmVzZXRPdXRwdXQoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIF96dHJlYW0udG90YWxfb3V0ID0gMDsNCi0gICAgICAgICAgICBfenRyZWFtLmF2YWlsX291dCA9IGtCdWZmZXJTaXplOw0KLSAgICAgICAgICAgIF96dHJlYW0ubmV4dF9vdXQgPSBfaE91dHB1dC5BZGRyT2ZQaW5uZWRPYmplY3QoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBVcGRhdGVzIHRoZSBydW5uaW5nIGNoZWNrc3VtIHByb3BlcnR5DQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuZXdTdW0iPlRoZSBuZXcgY2hlY2tzdW0gdmFsdWU8L3BhcmFtPg0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q2hlY2tzdW0odWludCBuZXdTdW0pDQotICAgICAgICB7DQotICAgICAgICAgICAgX2NoZWNrc3VtID0gbmV3U3VtOw0KLSAgICAgICAgfQ0KLSAgICAgICAgI2VuZHJlZ2lvbg0KLQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0RlZmxhdGVyLmNzIGIvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvRGVmbGF0ZXIuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNDc3OTIuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvRGVmbGF0ZXIuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8NCi0vLyCpIENvcHlyaWdodCBIZW5yaWsgUmF2biAyMDA0DQotLy8NCi0vLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4NCi0vLyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkNCi0vLw0KLQ0KLXVzaW5nIFN5c3RlbTsNCi11c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7DQotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOw0KLQ0KLW5hbWVzcGFjZSBEb3RaTGliDQotew0KLQ0KLSAgICAvLy8gPHN1bW1hcnk+DQotICAgIC8vLyBJbXBsZW1lbnRzIGEgZGF0YSBjb21wcmVzc29yLCB1c2luZyB0aGUgZGVmbGF0ZSBhbGdvcml0aG0gaW4gdGhlIFpMaWIgZGxsDQotICAgIC8vLyA8L3N1bW1hcnk+DQotCXB1YmxpYyBzZWFsZWQgY2xhc3MgRGVmbGF0ZXIgOiBDb2RlY0Jhc2UNCi0Jew0KLSAgICAgICAgI3JlZ2lvbiBEbGwgaW1wb3J0cw0KLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wsIENoYXJTZXQ9Q2hhclNldC5BbnNpKV0NCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZGVmbGF0ZUluaXRfKHJlZiBaU3RyZWFtIHN6LCBpbnQgbGV2ZWwsIHN0cmluZyB2cywgaW50IHNpemUpOw0KLQ0KLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBkZWZsYXRlKHJlZiBaU3RyZWFtIHN6LCBpbnQgZmx1c2gpOw0KLQ0KLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBkZWZsYXRlUmVzZXQocmVmIFpTdHJlYW0gc3opOw0KLQ0KLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBkZWZsYXRlRW5kKHJlZiBaU3RyZWFtIHN6KTsNCi0gICAgICAgICNlbmRyZWdpb24NCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBDb25zdHJ1Y3RzIGFuIG5ldyBpbnN0YW5jZSBvZiB0aGUgPGM+RGVmbGF0ZXI8L2M+DQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZXZlbCI+VGhlIGNvbXByZXNzaW9uIGxldmVsIHRvIHVzZSBmb3IgdGhpcyA8Yz5EZWZsYXRlcjwvYz48L3BhcmFtPg0KLQkJcHVibGljIERlZmxhdGVyKENvbXByZXNzTGV2ZWwgbGV2ZWwpIDogYmFzZSgpDQotCQl7DQotICAgICAgICAgICAgaW50IHJldHZhbCA9IGRlZmxhdGVJbml0XyhyZWYgX3p0cmVhbSwgKGludClsZXZlbCwgSW5mby5WZXJzaW9uLCBNYXJzaGFsLlNpemVPZihfenRyZWFtKSk7DQotICAgICAgICAgICAgaWYgKHJldHZhbCAhPSAwKQ0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWkxpYkV4Y2VwdGlvbihyZXR2YWwsICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBkZWZsYXRlciIpOw0KLQ0KLSAgICAgICAgICAgIHJlc2V0T3V0cHV0KCk7DQotCQl9DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gQWRkcyBtb3JlIGRhdGEgdG8gdGhlIGNvZGVjIHRvIGJlIHByb2Nlc3NlZC4NCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPkJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBhZGRlZCB0byB0aGUgY29kZWM8L3BhcmFtPg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPlRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSB0byBhZGQgZnJvbSA8Yz5kYXRhPC9jPjwvcGFyYW0+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZDwvcGFyYW0+DQotICAgICAgICAvLy8gPHJlbWFya3M+QWRkaW5nIGRhdGEgbWF5LCBvciBtYXkgbm90LCByYWlzZSB0aGUgPGM+RGF0YUF2YWlsYWJsZTwvYz4gZXZlbnQ8L3JlbWFya3M+DQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBBZGQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBjb3VudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgY291bnQgPCAwKSB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgaWYgKChvZmZzZXQrY291bnQpID4gZGF0YS5MZW5ndGgpIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOw0KLQ0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IGNvdW50Ow0KLSAgICAgICAgICAgIGludCBpbnB1dEluZGV4ID0gb2Zmc2V0Ow0KLSAgICAgICAgICAgIGludCBlcnIgPSAwOw0KLQ0KLSAgICAgICAgICAgIHdoaWxlIChlcnIgPj0gMCAmJiBpbnB1dEluZGV4IDwgdG90YWwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb3B5SW5wdXQoZGF0YSwgaW5wdXRJbmRleCwgTWF0aC5NaW4odG90YWwgLSBpbnB1dEluZGV4LCBrQnVmZmVyU2l6ZSkpOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAoZXJyID49IDAgJiYgX3p0cmVhbS5hdmFpbF9pbiA+IDApDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IGRlZmxhdGUocmVmIF96dHJlYW0sIChpbnQpRmx1c2hUeXBlcy5Ob25lKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gMCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoX3p0cmVhbS5hdmFpbF9vdXQgPT0gMCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uRGF0YUF2YWlsYWJsZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBkZWZsYXRlKHJlZiBfenRyZWFtLCAoaW50KUZsdXNoVHlwZXMuTm9uZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCArPSAoaW50KV96dHJlYW0udG90YWxfaW47DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgc2V0Q2hlY2tzdW0oIF96dHJlYW0uYWRsZXIgKTsNCi0gICAgICAgIH0NCi0NCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBGaW5pc2hlcyB1cCBhbnkgcGVuZGluZyBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgcHJvY2Vzc2VkIGFuZCBoYW5kbGVkLg0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZpbmlzaCgpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW50IGVycjsNCi0gICAgICAgICAgICBkbw0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZXJyID0gZGVmbGF0ZShyZWYgX3p0cmVhbSwgKGludClGbHVzaFR5cGVzLkZpbmlzaCk7DQotICAgICAgICAgICAgICAgIE9uRGF0YUF2YWlsYWJsZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3aGlsZSAoZXJyID09IDApOw0KLSAgICAgICAgICAgIHNldENoZWNrc3VtKCBfenRyZWFtLmFkbGVyICk7DQotICAgICAgICAgICAgZGVmbGF0ZVJlc2V0KHJlZiBfenRyZWFtKTsNCi0gICAgICAgICAgICByZXNldE91dHB1dCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIENsb3NlcyB0aGUgaW50ZXJuYWwgemxpYiBkZWZsYXRlIHN0cmVhbQ0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIENsZWFuVXAoKSB7IGRlZmxhdGVFbmQocmVmIF96dHJlYW0pOyB9DQotDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvRG90WkxpYi5jcyBiL3NyYy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0RvdFpMaWIuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMTg0YjQuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvRG90WkxpYi5jcworKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vLw0KLS8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCi0vLw0KLS8vIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLg0KLS8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQ0KLS8vDQotDQotdXNpbmcgU3lzdGVtOw0KLXVzaW5nIFN5c3RlbS5JTzsNCi11c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQotdXNpbmcgU3lzdGVtLlRleHQ7DQotDQotDQotbmFtZXNwYWNlIERvdFpMaWINCi17DQotDQotICAgICNyZWdpb24gSW50ZXJuYWwgdHlwZXMNCi0NCi0gICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAvLy8gRGVmaW5lcyBjb25zdGFudHMgZm9yIHRoZSB2YXJpb3VzIGZsdXNoIHR5cGVzIHVzZWQgd2l0aCB6bGliDQotICAgIC8vLyA8L3N1bW1hcnk+DQotICAgIGludGVybmFsIGVudW0gRmx1c2hUeXBlcw0KLSAgICB7DQotICAgICAgICBOb25lLCAgUGFydGlhbCwgIFN5bmMsICBGdWxsLCAgRmluaXNoLCAgQmxvY2sNCi0gICAgfQ0KLQ0KLSAgICAjcmVnaW9uIFpTdHJlYW0gc3RydWN0dXJlDQotICAgIC8vIGludGVybmFsIG1hcHBpbmcgb2YgdGhlIHpsaWIgenN0cmVhbSBzdHJ1Y3R1cmUgZm9yIG1hcnNoYWxsaW5nDQotICAgIFtTdHJ1Y3RMYXlvdXRBdHRyaWJ1dGUoTGF5b3V0S2luZC5TZXF1ZW50aWFsLCBQYWNrPTQsIFNpemU9MCwgQ2hhclNldD1DaGFyU2V0LkFuc2kpXQ0KLSAgICBpbnRlcm5hbCBzdHJ1Y3QgWlN0cmVhbQ0KLSAgICB7DQotICAgICAgICBwdWJsaWMgSW50UHRyIG5leHRfaW47DQotICAgICAgICBwdWJsaWMgdWludCBhdmFpbF9pbjsNCi0gICAgICAgIHB1YmxpYyB1aW50IHRvdGFsX2luOw0KLQ0KLSAgICAgICAgcHVibGljIEludFB0ciBuZXh0X291dDsNCi0gICAgICAgIHB1YmxpYyB1aW50IGF2YWlsX291dDsNCi0gICAgICAgIHB1YmxpYyB1aW50IHRvdGFsX291dDsNCi0NCi0gICAgICAgIFtNYXJzaGFsQXMoVW5tYW5hZ2VkVHlwZS5MUFN0cildDQotICAgICAgICBzdHJpbmcgbXNnOw0KLSAgICAgICAgdWludCBzdGF0ZTsNCi0NCi0gICAgICAgIHVpbnQgemFsbG9jOw0KLSAgICAgICAgdWludCB6ZnJlZTsNCi0gICAgICAgIHVpbnQgb3BhcXVlOw0KLQ0KLSAgICAgICAgaW50IGRhdGFfdHlwZTsNCi0gICAgICAgIHB1YmxpYyB1aW50IGFkbGVyOw0KLSAgICAgICAgdWludCByZXNlcnZlZDsNCi0gICAgfQ0KLQ0KLSAgICAjZW5kcmVnaW9uDQotDQotICAgICNlbmRyZWdpb24NCi0NCi0gICAgI3JlZ2lvbiBQdWJsaWMgZW51bXMNCi0gICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAvLy8gRGVmaW5lcyBjb25zdGFudHMgZm9yIHRoZSBhdmFpbGFibGUgY29tcHJlc3Npb24gbGV2ZWxzIGluIHpsaWINCi0gICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgcHVibGljIGVudW0gQ29tcHJlc3NMZXZlbCA6IGludA0KLSAgICB7DQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gVGhlIGRlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwgd2l0aCBhIHJlYXNvbmFibGUgY29tcHJvbWlzZSBiZXR3ZWVuIGNvbXByZXNzaW9uIGFuZCBzcGVlZA0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIERlZmF1bHQgPSAtMSwNCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBObyBjb21wcmVzc2lvbiBhdCBhbGwuIFRoZSBkYXRhIGFyZSBwYXNzZWQgc3RyYWlnaHQgdGhyb3VnaC4NCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICBOb25lID0gMCwNCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBUaGUgbWF4aW11bSBjb21wcmVzc2lvbiByYXRlIGF2YWlsYWJsZS4NCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICBCZXN0ID0gOSwNCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBUaGUgZmFzdGVzdCBhdmFpbGFibGUgY29tcHJlc3Npb24gbGV2ZWwuDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgRmFzdGVzdCA9IDENCi0gICAgfQ0KLSAgICAjZW5kcmVnaW9uDQotDQotICAgICNyZWdpb24gRXhjZXB0aW9uIGNsYXNzZXMNCi0gICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAvLy8gVGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIGFuIGVycm9yIG9jY3VycyBvbiB0aGUgemxpYiBkbGwNCi0gICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgcHVibGljIGNsYXNzIFpMaWJFeGNlcHRpb24gOiBBcHBsaWNhdGlvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iWkxpYkV4Y2VwdGlvbiIvPiBjbGFzcyB3aXRoIGEgc3BlY2lmaWVkDQotICAgICAgICAvLy8gZXJyb3IgbWVzc2FnZSBhbmQgZXJyb3IgY29kZQ0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZXJyb3JDb2RlIj5UaGUgemxpYiBlcnJvciBjb2RlIHRoYXQgY2F1c2VkIHRoZSBleGNlcHRpb248L3BhcmFtPg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtc2ciPkEgbWVzc2FnZSB0aGF0IChob3BlZnVsbHkpIGRlc2NyaWJlcyB0aGUgZXJyb3I8L3BhcmFtPg0KLSAgICAgICAgcHVibGljIFpMaWJFeGNlcHRpb24oaW50IGVycm9yQ29kZSwgc3RyaW5nIG1zZykgOiBiYXNlKFN0cmluZy5Gb3JtYXQoIlpMaWIgZXJyb3IgezB9IHsxfSIsIGVycm9yQ29kZSwgbXNnKSkNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJaTGliRXhjZXB0aW9uIi8+IGNsYXNzIHdpdGggYSBzcGVjaWZpZWQNCi0gICAgICAgIC8vLyBlcnJvciBjb2RlDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlcnJvckNvZGUiPlRoZSB6bGliIGVycm9yIGNvZGUgdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbjwvcGFyYW0+DQotICAgICAgICBwdWJsaWMgWkxpYkV4Y2VwdGlvbihpbnQgZXJyb3JDb2RlKSA6IGJhc2UoU3RyaW5nLkZvcm1hdCgiWkxpYiBlcnJvciB7MH0iLCBlcnJvckNvZGUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgICNlbmRyZWdpb24NCi0NCi0gICAgI3JlZ2lvbiBJbnRlcmZhY2VzDQotDQotICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgLy8vIERlY2xhcmVzIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgdGhhdCBlbmFibGVzIGEgcnVubmluZyBjaGVja3N1bSB0byBiZSBjYWxjdWxhdGVkDQotICAgIC8vLyA8L3N1bW1hcnk+DQotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2hlY2tzdW1HZW5lcmF0b3INCi0gICAgew0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNoZWNrc3VtDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgdWludCBWYWx1ZSB7IGdldDsgfQ0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIENsZWFycyB0aGUgY3VycmVudCBjaGVja3N1bSB0byAwDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgdm9pZCBSZXNldCgpOw0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCBhbiBhcnJheSBvZiBieXRlcw0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4NCi0gICAgICAgIHZvaWQgVXBkYXRlKGJ5dGVbXSBkYXRhKTsNCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggcGFydCBvZiBhbiBhcnJheSBvZiBieXRlcw0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5XaGVyZSBpbiA8Yz5kYXRhPC9jPiB0byBzdGFydCB1cGRhdGluZzwvcGFyYW0+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gPGM+ZGF0YTwvYz4gdG8gdXNlPC9wYXJhbT4NCi0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj5UaGUgc3VtIG9mIG9mZnNldCBhbmQgY291bnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiA8Yz5kYXRhPC9jPjwvZXhjZXB0aW9uPg0KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnROdWxsRXhjZXB0aW9uIj48Yz5kYXRhPC9jPiBpcyBhIG51bGwgcmVmZXJlbmNlPC9leGNlcHRpb24+DQotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24iPk9mZnNldCBvciBjb3VudCBpcyBuZWdhdGl2ZS48L2V4Y2VwdGlvbj4NCi0gICAgICAgIHZvaWQgVXBkYXRlKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpOw0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCB0aGUgZGF0YSBmcm9tIGEgc3RyaW5nDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgc3RyaW5nIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aDwvcGFyYW0+DQotICAgICAgICAvLy8gPHJlbWFya3M+VGhlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgY29udmVydGVkIGJ5IHRoZSBVVEYtOCBlbmNvZGluZzwvcmVtYXJrcz4NCi0gICAgICAgIHZvaWQgVXBkYXRlKHN0cmluZyBkYXRhKTsNCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggdGhlIGRhdGEgZnJvbSBhIHN0cmluZywgdXNpbmcgYSBzcGVjaWZpYyBlbmNvZGluZw0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIHN0cmluZyB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlbmNvZGluZyI+VGhlIGVuY29kaW5nIHRvIHVzZTwvcGFyYW0+DQotICAgICAgICB2b2lkIFVwZGF0ZShzdHJpbmcgZGF0YSwgRW5jb2RpbmcgZW5jb2RpbmcpOw0KLSAgICB9DQotDQotDQotICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgLy8vIFJlcHJlc2VudHMgdGhlIG1ldGhvZCB0aGF0IHdpbGwgYmUgY2FsbGVkIGZyb20gYSBjb2RlYyB3aGVuIG5ldyBkYXRhDQotICAgIC8vLyBhcmUgYXZhaWxhYmxlLg0KLSAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAvLy8gPHBhcmFtcmVmIG5hbWU9ImRhdGEiPlRoZSBieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIHByb2Nlc3NlZCBkYXRhPC9wYXJhbXJlZj4NCi0gICAgLy8vIDxwYXJhbXJlZiBuYW1lPSJzdGFydEluZGV4Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IHByb2Nlc3NlZCBieXRlIGluIDxjPmRhdGE8L2M+PC9wYXJhbXJlZj4NCi0gICAgLy8vIDxwYXJhbXJlZiBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBwcm9jZXNzZWQgYnl0ZXMgYXZhaWxhYmxlPC9wYXJhbXJlZj4NCi0gICAgLy8vIDxyZW1hcmtzPk9uIHJldHVybiBmcm9tIHRoaXMgbWV0aG9kLCB0aGUgZGF0YSBtYXkgYmUgb3ZlcndyaXR0ZW4sIHNvIGdyYWIgaXQgd2hpbGUgeW91IGNhbi4NCi0gICAgLy8vIFlvdSBjYW5ub3QgYXNzdW1lIHRoYXQgc3RhcnRJbmRleCB3aWxsIGJlIHplcm8uDQotICAgIC8vLyA8L3JlbWFya3M+DQotICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIERhdGFBdmFpbGFibGVIYW5kbGVyKGJ5dGVbXSBkYXRhLCBpbnQgc3RhcnRJbmRleCwgaW50IGNvdW50KTsNCi0NCi0gICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAvLy8gRGVjbGFyZXMgbWV0aG9kcyBhbmQgZXZlbnRzIGZvciBpbXBsZW1lbnRpbmcgY29tcHJlc3NvcnMvZGVjb21wcmVzc29ycw0KLSAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIENvZGVjDQotICAgIHsNCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBPY2N1cnMgd2hlbiBtb3JlIHByb2Nlc3NlZCBkYXRhIGFyZSBhdmFpbGFibGUuDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgZXZlbnQgRGF0YUF2YWlsYWJsZUhhbmRsZXIgRGF0YUF2YWlsYWJsZTsNCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBBZGRzIG1vcmUgZGF0YSB0byB0aGUgY29kZWMgdG8gYmUgcHJvY2Vzc2VkLg0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+Qnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2RlYzwvcGFyYW0+DQotICAgICAgICAvLy8gPHJlbWFya3M+QWRkaW5nIGRhdGEgbWF5LCBvciBtYXkgbm90LCByYWlzZSB0aGUgPGM+RGF0YUF2YWlsYWJsZTwvYz4gZXZlbnQ8L3JlbWFya3M+DQotICAgICAgICB2b2lkIEFkZChieXRlW10gZGF0YSk7DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gQWRkcyBtb3JlIGRhdGEgdG8gdGhlIGNvZGVjIHRvIGJlIHByb2Nlc3NlZC4NCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPkJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBhZGRlZCB0byB0aGUgY29kZWM8L3BhcmFtPg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPlRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSB0byBhZGQgZnJvbSA8Yz5kYXRhPC9jPjwvcGFyYW0+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZDwvcGFyYW0+DQotICAgICAgICAvLy8gPHJlbWFya3M+QWRkaW5nIGRhdGEgbWF5LCBvciBtYXkgbm90LCByYWlzZSB0aGUgPGM+RGF0YUF2YWlsYWJsZTwvYz4gZXZlbnQ8L3JlbWFya3M+DQotICAgICAgICB2b2lkIEFkZChieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KTsNCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBGaW5pc2hlcyB1cCBhbnkgcGVuZGluZyBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgcHJvY2Vzc2VkIGFuZCBoYW5kbGVkLg0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHZvaWQgRmluaXNoKCk7DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gR2V0cyB0aGUgY2hlY2tzdW0gb2YgdGhlIGRhdGEgdGhhdCBoYXMgYmVlbiBhZGRlZCBzbyBmYXINCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICB1aW50IENoZWNrc3VtIHsgZ2V0OyB9DQotDQotDQotICAgIH0NCi0NCi0gICAgI2VuZHJlZ2lvbg0KLQ0KLSAgICAjcmVnaW9uIENsYXNzZXMNCi0gICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAvLy8gRW5jYXBzdWxhdGVzIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFpMaWIgbGlicmFyeQ0KLSAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICBwdWJsaWMgY2xhc3MgSW5mbw0KLSAgICB7DQotICAgICAgICAjcmVnaW9uIERMTCBpbXBvcnRzDQotICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQotICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gdWludCB6bGliQ29tcGlsZUZsYWdzKCk7DQotDQotICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQotICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gc3RyaW5nIHpsaWJWZXJzaW9uKCk7DQotICAgICAgICAjZW5kcmVnaW9uDQotDQotICAgICAgICAjcmVnaW9uIFByaXZhdGUgc3R1ZmYNCi0gICAgICAgIHByaXZhdGUgdWludCBfZmxhZ3M7DQotDQotICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24gdGhhdCB1bnBhY2tzIGEgYml0c2l6ZSBtYXNrDQotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgYml0U2l6ZSh1aW50IGJpdHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChiaXRzKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gMTY7DQotICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIDMyOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiA2NDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICAgICAgfQ0KLSAgICAgICAgI2VuZHJlZ2lvbg0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgdGhlIDxjPkluZm88L2M+IGNsYXNzLg0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHB1YmxpYyBJbmZvKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBfZmxhZ3MgPSB6bGliQ29tcGlsZUZsYWdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gVHJ1ZSBpZiB0aGUgbGlicmFyeSBpcyBjb21waWxlZCB3aXRoIGRlYnVnIGluZm8NCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICBwdWJsaWMgYm9vbCBIYXNEZWJ1Z0luZm8geyBnZXQgeyByZXR1cm4gMCAhPSAoX2ZsYWdzICYgMHgxMDApOyB9IH0NCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBUcnVlIGlmIHRoZSBsaWJyYXJ5IGlzIGNvbXBpbGVkIHdpdGggYXNzZW1ibHkgb3B0aW1pemF0aW9ucw0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHB1YmxpYyBib29sIFVzZXNBc3NlbWJseUNvZGUgeyBnZXQgeyByZXR1cm4gMCAhPSAoX2ZsYWdzICYgMHgyMDApOyB9IH0NCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBHZXRzIHRoZSBzaXplIG9mIHRoZSB1bnNpZ25lZCBpbnQgdGhhdCB3YXMgY29tcGlsZWQgaW50byBabGliDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgcHVibGljIGludCBTaXplT2ZVSW50IHsgZ2V0IHsgcmV0dXJuIGJpdFNpemUoX2ZsYWdzICYgMyk7IH0gfQ0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIEdldHMgdGhlIHNpemUgb2YgdGhlIHVuc2lnbmVkIGxvbmcgdGhhdCB3YXMgY29tcGlsZWQgaW50byBabGliDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgcHVibGljIGludCBTaXplT2ZVTG9uZyB7IGdldCB7IHJldHVybiBiaXRTaXplKChfZmxhZ3MgPj4gMikgJiAzKTsgfSB9DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gR2V0cyB0aGUgc2l6ZSBvZiB0aGUgcG9pbnRlcnMgdGhhdCB3ZXJlIGNvbXBpbGVkIGludG8gWmxpYg0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHB1YmxpYyBpbnQgU2l6ZU9mUG9pbnRlciB7IGdldCB7IHJldHVybiBiaXRTaXplKChfZmxhZ3MgPj4gNCkgJiAzKTsgfSB9DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gR2V0cyB0aGUgc2l6ZSBvZiB0aGUgel9vZmZfdCB0eXBlIHRoYXQgd2FzIGNvbXBpbGVkIGludG8gWmxpYg0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHB1YmxpYyBpbnQgU2l6ZU9mT2Zmc2V0IHsgZ2V0IHsgcmV0dXJuIGJpdFNpemUoKF9mbGFncyA+PiA2KSAmIDMpOyB9IH0NCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBHZXRzIHRoZSB2ZXJzaW9uIG9mIFpMaWIgYXMgYSBzdHJpbmcsIGUuZy4gIjEuMi4xIg0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFZlcnNpb24geyBnZXQgeyByZXR1cm4gemxpYlZlcnNpb24oKTsgfSB9DQotICAgIH0NCi0NCi0gICAgI2VuZHJlZ2lvbg0KLQ0KLX0NCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9Eb3RaTGliLmNzcHJvaiBiL3NyYy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0RvdFpMaWIuY3Nwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWVlYjg1Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0RvdFpMaWIuY3Nwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTxWaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KLSAgICA8Q1NIQVJQDQotICAgICAgICBQcm9qZWN0VHlwZSA9ICJMb2NhbCINCi0gICAgICAgIFByb2R1Y3RWZXJzaW9uID0gIjcuMTAuMzA3NyINCi0gICAgICAgIFNjaGVtYVZlcnNpb24gPSAiMi4wIg0KLSAgICAgICAgUHJvamVjdEd1aWQgPSAie0JCMUVFMEIxLTE4MDgtNDZDQi1CNzg2LTk0OUQ5MTExN0ZDNX0iDQotICAgID4NCi0gICAgICAgIDxCdWlsZD4NCi0gICAgICAgICAgICA8U2V0dGluZ3MNCi0gICAgICAgICAgICAgICAgQXBwbGljYXRpb25JY29uID0gIiINCi0gICAgICAgICAgICAgICAgQXNzZW1ibHlLZXlDb250YWluZXJOYW1lID0gIiINCi0gICAgICAgICAgICAgICAgQXNzZW1ibHlOYW1lID0gIkRvdFpMaWIiDQotICAgICAgICAgICAgICAgIEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGUgPSAiIg0KLSAgICAgICAgICAgICAgICBEZWZhdWx0Q2xpZW50U2NyaXB0ID0gIkpTY3JpcHQiDQotICAgICAgICAgICAgICAgIERlZmF1bHRIVE1MUGFnZUxheW91dCA9ICJHcmlkIg0KLSAgICAgICAgICAgICAgICBEZWZhdWx0VGFyZ2V0U2NoZW1hID0gIklFNTAiDQotICAgICAgICAgICAgICAgIERlbGF5U2lnbiA9ICJmYWxzZSINCi0gICAgICAgICAgICAgICAgT3V0cHV0VHlwZSA9ICJMaWJyYXJ5Ig0KLSAgICAgICAgICAgICAgICBQcmVCdWlsZEV2ZW50ID0gIiINCi0gICAgICAgICAgICAgICAgUG9zdEJ1aWxkRXZlbnQgPSAiIg0KLSAgICAgICAgICAgICAgICBSb290TmFtZXNwYWNlID0gIkRvdFpMaWIiDQotICAgICAgICAgICAgICAgIFJ1blBvc3RCdWlsZEV2ZW50ID0gIk9uQnVpbGRTdWNjZXNzIg0KLSAgICAgICAgICAgICAgICBTdGFydHVwT2JqZWN0ID0gIiINCi0gICAgICAgICAgICA+DQotICAgICAgICAgICAgICAgIDxDb25maWcNCi0gICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiRGVidWciDQotICAgICAgICAgICAgICAgICAgICBBbGxvd1Vuc2FmZUJsb2NrcyA9ICJmYWxzZSINCi0gICAgICAgICAgICAgICAgICAgIEJhc2VBZGRyZXNzID0gIjI4NTIxMjY3MiINCi0gICAgICAgICAgICAgICAgICAgIENoZWNrRm9yT3ZlcmZsb3dVbmRlcmZsb3cgPSAiZmFsc2UiDQotICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uT3ZlcnJpZGVGaWxlID0gIiINCi0gICAgICAgICAgICAgICAgICAgIERlZmluZUNvbnN0YW50cyA9ICJERUJVRztUUkFDRSINCi0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50YXRpb25GaWxlID0gImRvY3NcRG90WkxpYi54bWwiDQotICAgICAgICAgICAgICAgICAgICBEZWJ1Z1N5bWJvbHMgPSAidHJ1ZSINCi0gICAgICAgICAgICAgICAgICAgIEZpbGVBbGlnbm1lbnQgPSAiNDA5NiINCi0gICAgICAgICAgICAgICAgICAgIEluY3JlbWVudGFsQnVpbGQgPSAiZmFsc2UiDQotICAgICAgICAgICAgICAgICAgICBOb1N0ZExpYiA9ICJmYWxzZSINCi0gICAgICAgICAgICAgICAgICAgIE5vV2FybiA9ICIxNTkxIg0KLSAgICAgICAgICAgICAgICAgICAgT3B0aW1pemUgPSAiZmFsc2UiDQotICAgICAgICAgICAgICAgICAgICBPdXRwdXRQYXRoID0gImJpblxEZWJ1Z1wiDQotICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckZvckNvbUludGVyb3AgPSAiZmFsc2UiDQotICAgICAgICAgICAgICAgICAgICBSZW1vdmVJbnRlZ2VyQ2hlY2tzID0gImZhbHNlIg0KLSAgICAgICAgICAgICAgICAgICAgVHJlYXRXYXJuaW5nc0FzRXJyb3JzID0gImZhbHNlIg0KLSAgICAgICAgICAgICAgICAgICAgV2FybmluZ0xldmVsID0gIjQiDQotICAgICAgICAgICAgICAgIC8+DQotICAgICAgICAgICAgICAgIDxDb25maWcNCi0gICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiUmVsZWFzZSINCi0gICAgICAgICAgICAgICAgICAgIEFsbG93VW5zYWZlQmxvY2tzID0gImZhbHNlIg0KLSAgICAgICAgICAgICAgICAgICAgQmFzZUFkZHJlc3MgPSAiMjg1MjEyNjcyIg0KLSAgICAgICAgICAgICAgICAgICAgQ2hlY2tGb3JPdmVyZmxvd1VuZGVyZmxvdyA9ICJmYWxzZSINCi0gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25PdmVycmlkZUZpbGUgPSAiIg0KLSAgICAgICAgICAgICAgICAgICAgRGVmaW5lQ29uc3RhbnRzID0gIlRSQUNFIg0KLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbkZpbGUgPSAiZG9jc1xEb3RaTGliLnhtbCINCi0gICAgICAgICAgICAgICAgICAgIERlYnVnU3ltYm9scyA9ICJmYWxzZSINCi0gICAgICAgICAgICAgICAgICAgIEZpbGVBbGlnbm1lbnQgPSAiNDA5NiINCi0gICAgICAgICAgICAgICAgICAgIEluY3JlbWVudGFsQnVpbGQgPSAiZmFsc2UiDQotICAgICAgICAgICAgICAgICAgICBOb1N0ZExpYiA9ICJmYWxzZSINCi0gICAgICAgICAgICAgICAgICAgIE5vV2FybiA9ICIiDQotICAgICAgICAgICAgICAgICAgICBPcHRpbWl6ZSA9ICJ0cnVlIg0KLSAgICAgICAgICAgICAgICAgICAgT3V0cHV0UGF0aCA9ICJiaW5cUmVsZWFzZVwiDQotICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckZvckNvbUludGVyb3AgPSAiZmFsc2UiDQotICAgICAgICAgICAgICAgICAgICBSZW1vdmVJbnRlZ2VyQ2hlY2tzID0gImZhbHNlIg0KLSAgICAgICAgICAgICAgICAgICAgVHJlYXRXYXJuaW5nc0FzRXJyb3JzID0gImZhbHNlIg0KLSAgICAgICAgICAgICAgICAgICAgV2FybmluZ0xldmVsID0gIjQiDQotICAgICAgICAgICAgICAgIC8+DQotICAgICAgICAgICAgPC9TZXR0aW5ncz4NCi0gICAgICAgICAgICA8UmVmZXJlbmNlcz4NCi0gICAgICAgICAgICAgICAgPFJlZmVyZW5jZQ0KLSAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJTeXN0ZW0iDQotICAgICAgICAgICAgICAgICAgICBBc3NlbWJseU5hbWUgPSAiU3lzdGVtIg0KLSAgICAgICAgICAgICAgICAgICAgSGludFBhdGggPSAiQzpcV0lOTlRcTWljcm9zb2Z0Lk5FVFxGcmFtZXdvcmtcdjEuMS40MzIyXFN5c3RlbS5kbGwiDQotICAgICAgICAgICAgICAgIC8+DQotICAgICAgICAgICAgICAgIDxSZWZlcmVuY2UNCi0gICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiU3lzdGVtLkRhdGEiDQotICAgICAgICAgICAgICAgICAgICBBc3NlbWJseU5hbWUgPSAiU3lzdGVtLkRhdGEiDQotICAgICAgICAgICAgICAgICAgICBIaW50UGF0aCA9ICJDOlxXSU5OVFxNaWNyb3NvZnQuTkVUXEZyYW1ld29ya1x2MS4xLjQzMjJcU3lzdGVtLkRhdGEuZGxsIg0KLSAgICAgICAgICAgICAgICAvPg0KLSAgICAgICAgICAgICAgICA8UmVmZXJlbmNlDQotICAgICAgICAgICAgICAgICAgICBOYW1lID0gIlN5c3RlbS5YTUwiDQotICAgICAgICAgICAgICAgICAgICBBc3NlbWJseU5hbWUgPSAiU3lzdGVtLlhtbCINCi0gICAgICAgICAgICAgICAgICAgIEhpbnRQYXRoID0gIkM6XFdJTk5UXE1pY3Jvc29mdC5ORVRcRnJhbWV3b3JrXHYxLjEuNDMyMlxTeXN0ZW0uWE1MLmRsbCINCi0gICAgICAgICAgICAgICAgLz4NCi0gICAgICAgICAgICAgICAgPFJlZmVyZW5jZQ0KLSAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJudW5pdC5mcmFtZXdvcmsiDQotICAgICAgICAgICAgICAgICAgICBBc3NlbWJseU5hbWUgPSAibnVuaXQuZnJhbWV3b3JrIg0KLSAgICAgICAgICAgICAgICAgICAgSGludFBhdGggPSAiRTpcYXBwc1xOVW5pdCBWMi4xXFxiaW5cbnVuaXQuZnJhbWV3b3JrLmRsbCINCi0gICAgICAgICAgICAgICAgICAgIEFzc2VtYmx5Rm9sZGVyS2V5ID0gImhrbG1cZG5cbnVuaXQuZnJhbWV3b3JrIg0KLSAgICAgICAgICAgICAgICAvPg0KLSAgICAgICAgICAgIDwvUmVmZXJlbmNlcz4NCi0gICAgICAgIDwvQnVpbGQ+DQotICAgICAgICA8RmlsZXM+DQotICAgICAgICAgICAgPEluY2x1ZGU+DQotICAgICAgICAgICAgICAgIDxGaWxlDQotICAgICAgICAgICAgICAgICAgICBSZWxQYXRoID0gIkFzc2VtYmx5SW5mby5jcyINCi0gICAgICAgICAgICAgICAgICAgIFN1YlR5cGUgPSAiQ29kZSINCi0gICAgICAgICAgICAgICAgICAgIEJ1aWxkQWN0aW9uID0gIkNvbXBpbGUiDQotICAgICAgICAgICAgICAgIC8+DQotICAgICAgICAgICAgICAgIDxGaWxlDQotICAgICAgICAgICAgICAgICAgICBSZWxQYXRoID0gIkNoZWNrc3VtSW1wbC5jcyINCi0gICAgICAgICAgICAgICAgICAgIFN1YlR5cGUgPSAiQ29kZSINCi0gICAgICAgICAgICAgICAgICAgIEJ1aWxkQWN0aW9uID0gIkNvbXBpbGUiDQotICAgICAgICAgICAgICAgIC8+DQotICAgICAgICAgICAgICAgIDxGaWxlDQotICAgICAgICAgICAgICAgICAgICBSZWxQYXRoID0gIkNpcmN1bGFyQnVmZmVyLmNzIg0KLSAgICAgICAgICAgICAgICAgICAgU3ViVHlwZSA9ICJDb2RlIg0KLSAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSINCi0gICAgICAgICAgICAgICAgLz4NCi0gICAgICAgICAgICAgICAgPEZpbGUNCi0gICAgICAgICAgICAgICAgICAgIFJlbFBhdGggPSAiQ29kZWNCYXNlLmNzIg0KLSAgICAgICAgICAgICAgICAgICAgU3ViVHlwZSA9ICJDb2RlIg0KLSAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSINCi0gICAgICAgICAgICAgICAgLz4NCi0gICAgICAgICAgICAgICAgPEZpbGUNCi0gICAgICAgICAgICAgICAgICAgIFJlbFBhdGggPSAiRGVmbGF0ZXIuY3MiDQotICAgICAgICAgICAgICAgICAgICBTdWJUeXBlID0gIkNvZGUiDQotICAgICAgICAgICAgICAgICAgICBCdWlsZEFjdGlvbiA9ICJDb21waWxlIg0KLSAgICAgICAgICAgICAgICAvPg0KLSAgICAgICAgICAgICAgICA8RmlsZQ0KLSAgICAgICAgICAgICAgICAgICAgUmVsUGF0aCA9ICJEb3RaTGliLmNzIg0KLSAgICAgICAgICAgICAgICAgICAgU3ViVHlwZSA9ICJDb2RlIg0KLSAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSINCi0gICAgICAgICAgICAgICAgLz4NCi0gICAgICAgICAgICAgICAgPEZpbGUNCi0gICAgICAgICAgICAgICAgICAgIFJlbFBhdGggPSAiR1ppcFN0cmVhbS5jcyINCi0gICAgICAgICAgICAgICAgICAgIFN1YlR5cGUgPSAiQ29kZSINCi0gICAgICAgICAgICAgICAgICAgIEJ1aWxkQWN0aW9uID0gIkNvbXBpbGUiDQotICAgICAgICAgICAgICAgIC8+DQotICAgICAgICAgICAgICAgIDxGaWxlDQotICAgICAgICAgICAgICAgICAgICBSZWxQYXRoID0gIkluZmxhdGVyLmNzIg0KLSAgICAgICAgICAgICAgICAgICAgU3ViVHlwZSA9ICJDb2RlIg0KLSAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSINCi0gICAgICAgICAgICAgICAgLz4NCi0gICAgICAgICAgICAgICAgPEZpbGUNCi0gICAgICAgICAgICAgICAgICAgIFJlbFBhdGggPSAiVW5pdFRlc3RzLmNzIg0KLSAgICAgICAgICAgICAgICAgICAgU3ViVHlwZSA9ICJDb2RlIg0KLSAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSINCi0gICAgICAgICAgICAgICAgLz4NCi0gICAgICAgICAgICA8L0luY2x1ZGU+DQotICAgICAgICA8L0ZpbGVzPg0KLSAgICA8L0NTSEFSUD4NCi08L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQotDQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvR1ppcFN0cmVhbS5jcyBiL3NyYy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0daaXBTdHJlYW0uY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNjEzMDAuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvR1ppcFN0cmVhbS5jcworKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vLw0KLS8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCi0vLw0KLS8vIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLg0KLS8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQ0KLS8vDQotDQotdXNpbmcgU3lzdGVtOw0KLXVzaW5nIFN5c3RlbS5JTzsNCi11c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQotDQotbmFtZXNwYWNlIERvdFpMaWINCi17DQotCS8vLyA8c3VtbWFyeT4NCi0JLy8vIEltcGxlbWVudHMgYSBjb21wcmVzc2VkIDxzZWUgY3JlZj0iU3RyZWFtIi8+LCBpbiBHWmlwICguZ3opIGZvcm1hdC4NCi0JLy8vIDwvc3VtbWFyeT4NCi0JcHVibGljIGNsYXNzIEdaaXBTdHJlYW0gOiBTdHJlYW0sIElEaXNwb3NhYmxlDQotCXsNCi0gICAgICAgICNyZWdpb24gRGxsIEltcG9ydHMNCi0gICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsLCBDaGFyU2V0PUNoYXJTZXQuQW5zaSldDQotICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gSW50UHRyIGd6b3BlbihzdHJpbmcgbmFtZSwgc3RyaW5nIG1vZGUpOw0KLQ0KLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBnemNsb3NlKEludFB0ciBnekZpbGUpOw0KLQ0KLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBnendyaXRlKEludFB0ciBnekZpbGUsIGludCBkYXRhLCBpbnQgbGVuZ3RoKTsNCi0NCi0gICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZ3pyZWFkKEludFB0ciBnekZpbGUsIGludCBkYXRhLCBpbnQgbGVuZ3RoKTsNCi0NCi0gICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZ3pnZXRjKEludFB0ciBnekZpbGUpOw0KLQ0KLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBnenB1dGMoSW50UHRyIGd6RmlsZSwgaW50IGMpOw0KLQ0KLSAgICAgICAgI2VuZHJlZ2lvbg0KLQ0KLSAgICAgICAgI3JlZ2lvbiBQcml2YXRlIGRhdGENCi0gICAgICAgIHByaXZhdGUgSW50UHRyIF9nekZpbGU7DQotICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQgPSBmYWxzZTsNCi0gICAgICAgIHByaXZhdGUgYm9vbCBfaXNXcml0aW5nOw0KLSAgICAgICAgI2VuZHJlZ2lvbg0KLQ0KLSAgICAgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMNCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBDcmVhdGVzIGEgbmV3IGZpbGUgYXMgYSB3cml0ZWFibGUgR1ppcFN0cmVhbQ0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlsZU5hbWUiPlRoZSBuYW1lIG9mIHRoZSBjb21wcmVzc2VkIGZpbGUgdG8gY3JlYXRlPC9wYXJhbT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGV2ZWwiPlRoZSBjb21wcmVzc2lvbiBsZXZlbCB0byB1c2Ugd2hlbiBhZGRpbmcgZGF0YTwvcGFyYW0+DQotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJaTGliRXhjZXB0aW9uIj5JZiBhbiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgaW50ZXJuYWwgemxpYiBmdW5jdGlvbjwvZXhjZXB0aW9uPg0KLQkJcHVibGljIEdaaXBTdHJlYW0oc3RyaW5nIGZpbGVOYW1lLCBDb21wcmVzc0xldmVsIGxldmVsKQ0KLQkJew0KLSAgICAgICAgICAgIF9pc1dyaXRpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIF9nekZpbGUgPSBnem9wZW4oZmlsZU5hbWUsIFN0cmluZy5Gb3JtYXQoIndiezB9IiwgKGludClsZXZlbCkpOw0KLSAgICAgICAgICAgIGlmIChfZ3pGaWxlID09IEludFB0ci5aZXJvKQ0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWkxpYkV4Y2VwdGlvbigtMSwgIkNvdWxkIG5vdCBvcGVuICIgKyBmaWxlTmFtZSk7DQotCQl9DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gT3BlbnMgYW4gZXhpc3RpbmcgZmlsZSBhcyBhIHJlYWRhYmxlIEdaaXBTdHJlYW0NCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGVOYW1lIj5UaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBvcGVuPC9wYXJhbT4NCi0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IlpMaWJFeGNlcHRpb24iPklmIGFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBpbnRlcm5hbCB6bGliIGZ1bmN0aW9uPC9leGNlcHRpb24+DQotICAgICAgICBwdWJsaWMgR1ppcFN0cmVhbShzdHJpbmcgZmlsZU5hbWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgX2lzV3JpdGluZyA9IGZhbHNlOw0KLSAgICAgICAgICAgIF9nekZpbGUgPSBnem9wZW4oZmlsZU5hbWUsICJyYiIpOw0KLSAgICAgICAgICAgIGlmIChfZ3pGaWxlID09IEludFB0ci5aZXJvKQ0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWkxpYkV4Y2VwdGlvbigtMSwgIkNvdWxkIG5vdCBvcGVuICIgKyBmaWxlTmFtZSk7DQotDQotICAgICAgICB9DQotICAgICAgICAjZW5kcmVnaW9uDQotDQotICAgICAgICAjcmVnaW9uIEFjY2VzcyBwcm9wZXJ0aWVzDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gUmV0dXJucyB0cnVlIG9mIHRoaXMgc3RyZWFtIGNhbiBiZSByZWFkIGZyb20sIGZhbHNlIG90aGVyd2lzZQ0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhblJlYWQNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBnZXQNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiAhX2lzV3JpdGluZzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gUmV0dXJucyBmYWxzZS4NCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5TZWVrDQotICAgICAgICB7DQotICAgICAgICAgICAgZ2V0DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRzcmVhbSBpcyB3cml0ZWFibGUsIGZhbHNlIG90aGVyd2lzZQ0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhbldyaXRlDQotICAgICAgICB7DQotICAgICAgICAgICAgZ2V0DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2lzV3JpdGluZzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICAjZW5kcmVnaW9uDQotDQotICAgICAgICAjcmVnaW9uIERlc3RydWN0b3IgJiBJRGlzcG9zZSBzdHVmZg0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIERlc3Ryb3lzIHRoaXMgaW5zdGFuY2UNCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICB+R1ppcFN0cmVhbSgpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2xlYW5VcChmYWxzZSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gQ2xvc2VzIHRoZSBleHRlcm5hbCBmaWxlIGhhbmRsZQ0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNsZWFuVXAodHJ1ZSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBEb2VzIHRoZSBhY3R1YWwgY2xvc2luZyBvZiB0aGUgZmlsZSBoYW5kbGUuDQotICAgICAgICBwcml2YXRlIHZvaWQgY2xlYW5VcChib29sIGlzRGlzcG9zaW5nKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBnemNsb3NlKF9nekZpbGUpOw0KLSAgICAgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgI2VuZHJlZ2lvbg0KLQ0KLSAgICAgICAgI3JlZ2lvbiBCYXNpYyByZWFkaW5nIGFuZCB3cml0aW5nDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gQXR0ZW1wdHMgdG8gcmVhZCBhIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdHJlYW0uDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWZmZXIiPlRoZSBkZXN0aW5hdGlvbiBkYXRhIGJ1ZmZlcjwvcGFyYW0+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkZXN0aW5hdGlvbiBieXRlIGluIDxjPmJ1ZmZlcjwvYz48L3BhcmFtPg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyByZXF1ZXN0ZWQ8L3BhcmFtPg0KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZDwvcmV0dXJucz4NCi0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+SWYgPGM+YnVmZmVyPC9jPiBpcyBudWxsPC9leGNlcHRpb24+DQotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24iPklmIDxjPmNvdW50PC9jPiBvciA8Yz5vZmZzZXQ8L2M+IGFyZSBuZWdhdGl2ZTwvZXhjZXB0aW9uPg0KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPklmIDxjPm9mZnNldDwvYz4gICsgPGM+Y291bnQ8L2M+IGlzICZndDsgYnVmZmVyLkxlbmd0aDwvZXhjZXB0aW9uPg0KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBpcyBub3QgcmVhZGFibGUuPC9leGNlcHRpb24+DQotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJPYmplY3REaXNwb3NlZEV4Y2VwdGlvbiI+SWYgdGhpcyBzdHJlYW0gaGFzIGJlZW4gZGlzcG9zZWQuPC9leGNlcHRpb24+DQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghQ2FuUmVhZCkgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOw0KLSAgICAgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigpOw0KLSAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IGNvdW50IDwgMCkgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigpOw0KLSAgICAgICAgICAgIGlmICgob2Zmc2V0K2NvdW50KSA+IGJ1ZmZlci5MZW5ndGgpIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOw0KLSAgICAgICAgICAgIGlmIChfaXNEaXNwb3NlZCkgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJHWmlwU3RyZWFtIik7DQotDQotICAgICAgICAgICAgR0NIYW5kbGUgaCA9IEdDSGFuZGxlLkFsbG9jKGJ1ZmZlciwgR0NIYW5kbGVUeXBlLlBpbm5lZCk7DQotICAgICAgICAgICAgaW50IHJlc3VsdDsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGd6cmVhZChfZ3pGaWxlLCBoLkFkZHJPZlBpbm5lZE9iamVjdCgpLlRvSW50MzIoKSArIG9mZnNldCwgY291bnQpOw0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmaW5hbGx5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBoLkZyZWUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBBdHRlbXB0cyB0byByZWFkIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGUgc3RyZWFtLg0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgYnl0ZSB0aGF0IHdhcyByZWFkLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yIG9yIEVuZC1PZi1GaWxlPC9yZXR1cm5zPg0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkQnl0ZSgpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCFDYW5SZWFkKSB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkdaaXBTdHJlYW0iKTsNCi0gICAgICAgICAgICByZXR1cm4gZ3pnZXRjKF9nekZpbGUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIFdyaXRlcyBhIG51bWJlciBvZiBieXRlcyB0byB0aGUgc3RyZWFtDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWZmZXIiPjwvcGFyYW0+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+PC9wYXJhbT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPjwvcGFyYW0+DQotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE51bGxFeGNlcHRpb24iPklmIDxjPmJ1ZmZlcjwvYz4gaXMgbnVsbDwvZXhjZXB0aW9uPg0KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj5JZiA8Yz5jb3VudDwvYz4gb3IgPGM+b2Zmc2V0PC9jPiBhcmUgbmVnYXRpdmU8L2V4Y2VwdGlvbj4NCi0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj5JZiA8Yz5vZmZzZXQ8L2M+ICArIDxjPmNvdW50PC9jPiBpcyAmZ3Q7IGJ1ZmZlci5MZW5ndGg8L2V4Y2VwdGlvbj4NCi0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik5vdFN1cHBvcnRlZEV4Y2VwdGlvbiI+SWYgdGhpcyBzdHJlYW0gaXMgbm90IHdyaXRlYWJsZS48L2V4Y2VwdGlvbj4NCi0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik9iamVjdERpc3Bvc2VkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBoYXMgYmVlbiBkaXNwb3NlZC48L2V4Y2VwdGlvbj4NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIUNhbldyaXRlKSB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgY291bnQgPCAwKSB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgaWYgKChvZmZzZXQrY291bnQpID4gYnVmZmVyLkxlbmd0aCkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkdaaXBTdHJlYW0iKTsNCi0NCi0gICAgICAgICAgICBHQ0hhbmRsZSBoID0gR0NIYW5kbGUuQWxsb2MoYnVmZmVyLCBHQ0hhbmRsZVR5cGUuUGlubmVkKTsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBnendyaXRlKF9nekZpbGUsIGguQWRkck9mUGlubmVkT2JqZWN0KCkuVG9JbnQzMigpICsgb2Zmc2V0LCBjb3VudCk7DQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQ0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGguRnJlZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBXcml0ZXMgYSBzaW5nbGUgYnl0ZSB0byB0aGUgc3RyZWFtDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIGJ5dGUgdG8gYWRkIHRvIHRoZSBzdHJlYW0uPC9wYXJhbT4NCi0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik5vdFN1cHBvcnRlZEV4Y2VwdGlvbiI+SWYgdGhpcyBzdHJlYW0gaXMgbm90IHdyaXRlYWJsZS48L2V4Y2VwdGlvbj4NCi0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik9iamVjdERpc3Bvc2VkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBoYXMgYmVlbiBkaXNwb3NlZC48L2V4Y2VwdGlvbj4NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShieXRlIHZhbHVlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghQ2FuV3JpdGUpIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsNCi0gICAgICAgICAgICBpZiAoX2lzRGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiR1ppcFN0cmVhbSIpOw0KLQ0KLSAgICAgICAgICAgIGludCByZXN1bHQgPSBnenB1dGMoX2d6RmlsZSwgKGludCl2YWx1ZSk7DQotICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApDQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgI2VuZHJlZ2lvbg0KLQ0KLSAgICAgICAgI3JlZ2lvbiBQb3NpdGlvbiAmIGxlbmd0aCBzdHVmZg0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIE5vdCBzdXBwb3J0ZWQuDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4NCi0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik5vdFN1cHBvcnRlZEV4Y2VwdGlvbiI+QWx3YXlzIHRocm93bjwvZXhjZXB0aW9uPg0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2V0TGVuZ3RoKGxvbmcgdmFsdWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vICBOb3Qgc3VwcHBvcnRlZC4NCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+PC9wYXJhbT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3JpZ2luIj48L3BhcmFtPg0KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4NCi0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik5vdFN1cHBvcnRlZEV4Y2VwdGlvbiI+QWx3YXlzIHRocm93bjwvZXhjZXB0aW9uPg0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgU2Vlayhsb25nIG9mZnNldCwgU2Vla09yaWdpbiBvcmlnaW4pDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIEZsdXNoZXMgdGhlIDxjPkdaaXBTdHJlYW08L2M+Lg0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIC8vLyA8cmVtYXJrcz5JbiB0aGlzIGltcGxlbWVudGF0aW9uLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuIFRoaXMgaXMgYmVjYXVzZSBleGNlc3NpdmUNCi0gICAgICAgIC8vLyBmbHVzaGluZyBtYXkgZGVncmFkZSB0aGUgYWNoaWV2YWJsZSBjb21wcmVzc2lvbiByYXRlcy48L3JlbWFya3M+DQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gbGVmdCBlbXB0eSBvbiBwdXJwb3NlDQotICAgICAgICB9DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gR2V0cy9zZXRzIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSA8Yz5HWmlwU3RyZWFtPC9jPi4gTm90IHN1cHBwb3J0ZWQuDQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgLy8vIDxyZW1hcmtzPkluIHRoaXMgaW1wbGVtZW50YXRpb24gdGhpcyBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkPC9yZW1hcmtzPg0KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5BbHdheXMgdGhyb3duPC9leGNlcHRpb24+DQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBQb3NpdGlvbg0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdldA0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBzZXQNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLy8gPHN1bW1hcnk+DQotICAgICAgICAvLy8gR2V0cyB0aGUgc2l6ZSBvZiB0aGUgc3RyZWFtLiBOb3Qgc3VwcHBvcnRlZC4NCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+DQotICAgICAgICAvLy8gPHJlbWFya3M+SW4gdGhpcyBpbXBsZW1lbnRhdGlvbiB0aGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQ8L3JlbWFya3M+DQotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iPkFsd2F5cyB0aHJvd248L2V4Y2VwdGlvbj4NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIExlbmd0aA0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdldA0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgICNlbmRyZWdpb24NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9JbmZsYXRlci5jcyBiL3NyYy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0luZmxhdGVyLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWQ1NDUxLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0luZmxhdGVyLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vDQotLy8gqSBDb3B5cmlnaHQgSGVucmlrIFJhdm4gMjAwNA0KLS8vDQotLy8gVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBhcmUgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuDQotLy8gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpDQotLy8NCi0NCi11c2luZyBTeXN0ZW07DQotdXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOw0KLXVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCi0NCi1uYW1lc3BhY2UgRG90WkxpYg0KLXsNCi0NCi0gICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAvLy8gSW1wbGVtZW50cyBhIGRhdGEgZGVjb21wcmVzc29yLCB1c2luZyB0aGUgaW5mbGF0ZSBhbGdvcml0aG0gaW4gdGhlIFpMaWIgZGxsDQotICAgIC8vLyA8L3N1bW1hcnk+DQotICAgIHB1YmxpYyBjbGFzcyBJbmZsYXRlciA6IENvZGVjQmFzZQ0KLQl7DQotICAgICAgICAjcmVnaW9uIERsbCBpbXBvcnRzDQotICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCwgQ2hhclNldD1DaGFyU2V0LkFuc2kpXQ0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBpbmZsYXRlSW5pdF8ocmVmIFpTdHJlYW0gc3osIHN0cmluZyB2cywgaW50IHNpemUpOw0KLQ0KLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBpbmZsYXRlKHJlZiBaU3RyZWFtIHN6LCBpbnQgZmx1c2gpOw0KLQ0KLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBpbmZsYXRlUmVzZXQocmVmIFpTdHJlYW0gc3opOw0KLQ0KLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBpbmZsYXRlRW5kKHJlZiBaU3RyZWFtIHN6KTsNCi0gICAgICAgICNlbmRyZWdpb24NCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBDb25zdHJ1Y3RzIGFuIG5ldyBpbnN0YW5jZSBvZiB0aGUgPGM+SW5mbGF0ZXI8L2M+DQotICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KLSAgICAgICAgcHVibGljIEluZmxhdGVyKCkgOiBiYXNlKCkNCi0JCXsNCi0gICAgICAgICAgICBpbnQgcmV0dmFsID0gaW5mbGF0ZUluaXRfKHJlZiBfenRyZWFtLCBJbmZvLlZlcnNpb24sIE1hcnNoYWwuU2l6ZU9mKF96dHJlYW0pKTsNCi0gICAgICAgICAgICBpZiAocmV0dmFsICE9IDApDQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBaTGliRXhjZXB0aW9uKHJldHZhbCwgIkNvdWxkIG5vdCBpbml0aWFsaXplIGluZmxhdGVyIik7DQotDQotICAgICAgICAgICAgcmVzZXRPdXRwdXQoKTsNCi0gICAgICAgIH0NCi0NCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBBZGRzIG1vcmUgZGF0YSB0byB0aGUgY29kZWMgdG8gYmUgcHJvY2Vzc2VkLg0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+Qnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2RlYzwvcGFyYW0+DQotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIHRvIGFkZCBmcm9tIDxjPmRhdGE8L2M+PC9wYXJhbT4NCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPlRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWRkPC9wYXJhbT4NCi0gICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEFkZChieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oKTsNCi0gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsNCi0gICAgICAgICAgICBpZiAoKG9mZnNldCtjb3VudCkgPiBkYXRhLkxlbmd0aCkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7DQotDQotICAgICAgICAgICAgaW50IHRvdGFsID0gY291bnQ7DQotICAgICAgICAgICAgaW50IGlucHV0SW5kZXggPSBvZmZzZXQ7DQotICAgICAgICAgICAgaW50IGVyciA9IDA7DQotDQotICAgICAgICAgICAgd2hpbGUgKGVyciA+PSAwICYmIGlucHV0SW5kZXggPCB0b3RhbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvcHlJbnB1dChkYXRhLCBpbnB1dEluZGV4LCBNYXRoLk1pbih0b3RhbCAtIGlucHV0SW5kZXgsIGtCdWZmZXJTaXplKSk7DQotICAgICAgICAgICAgICAgIGVyciA9IGluZmxhdGUocmVmIF96dHJlYW0sIChpbnQpRmx1c2hUeXBlcy5Ob25lKTsNCi0gICAgICAgICAgICAgICAgaWYgKGVyciA9PSAwKQ0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKF96dHJlYW0uYXZhaWxfb3V0ID09IDApDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgT25EYXRhQXZhaWxhYmxlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gaW5mbGF0ZShyZWYgX3p0cmVhbSwgKGludClGbHVzaFR5cGVzLk5vbmUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpbnB1dEluZGV4ICs9IChpbnQpX3p0cmVhbS50b3RhbF9pbjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgc2V0Q2hlY2tzdW0oIF96dHJlYW0uYWRsZXIgKTsNCi0gICAgICAgIH0NCi0NCi0NCi0gICAgICAgIC8vLyA8c3VtbWFyeT4NCi0gICAgICAgIC8vLyBGaW5pc2hlcyB1cCBhbnkgcGVuZGluZyBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgcHJvY2Vzc2VkIGFuZCBoYW5kbGVkLg0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZpbmlzaCgpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW50IGVycjsNCi0gICAgICAgICAgICBkbw0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZXJyID0gaW5mbGF0ZShyZWYgX3p0cmVhbSwgKGludClGbHVzaFR5cGVzLkZpbmlzaCk7DQotICAgICAgICAgICAgICAgIE9uRGF0YUF2YWlsYWJsZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3aGlsZSAoZXJyID09IDApOw0KLSAgICAgICAgICAgIHNldENoZWNrc3VtKCBfenRyZWFtLmFkbGVyICk7DQotICAgICAgICAgICAgaW5mbGF0ZVJlc2V0KHJlZiBfenRyZWFtKTsNCi0gICAgICAgICAgICByZXNldE91dHB1dCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KLSAgICAgICAgLy8vIENsb3NlcyB0aGUgaW50ZXJuYWwgemxpYiBpbmZsYXRlIHN0cmVhbQ0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4NCi0gICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIENsZWFuVXAoKSB7IGluZmxhdGVFbmQocmVmIF96dHJlYW0pOyB9DQotDQotDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvVW5pdFRlc3RzLmNzIGIvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvVW5pdFRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDkwMjg4Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL1VuaXRUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vLw0KLS8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCi0vLw0KLS8vIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLg0KLS8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQ0KLS8vDQotDQotdXNpbmcgU3lzdGVtOw0KLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsNCi11c2luZyBTeXN0ZW0uSU87DQotDQotLy8gdW5jb21tZW50IHRoZSBkZWZpbmUgYmVsb3cgdG8gaW5jbHVkZSB1bml0IHRlc3RzDQotLy8jZGVmaW5lIG51bml0DQotI2lmIG51bml0DQotdXNpbmcgTlVuaXQuRnJhbWV3b3JrOw0KLQ0KLS8vIFVuaXQgdGVzdHMgZm9yIHRoZSBEb3RaTGliIGNsYXNzIGxpYnJhcnkNCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8NCi0vLyBVc2UgdGhpcyB3aXRoIE5Vbml0IDIgZnJvbSBodHRwOi8vd3d3Lm51bml0Lm9yZw0KLS8vDQotDQotbmFtZXNwYWNlIERvdFpMaWJUZXN0cw0KLXsNCi0gICAgdXNpbmcgRG90WkxpYjsNCi0NCi0gICAgLy8gaGVscGVyIG1ldGhvZHMNCi0gICAgaW50ZXJuYWwgY2xhc3MgVXRpbHMNCi0gICAgew0KLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sIGJ5dGVBcnJFcXVhbCggYnl0ZVtdIGxocywgYnl0ZVtdIHJocyApDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGxocy5MZW5ndGggIT0gcmhzLkxlbmd0aCkNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBsaHMuTGVuZ3RoLTE7IGkgPj0gMDsgLS1pKQ0KLSAgICAgICAgICAgICAgICBpZiAobGhzW2ldICE9IHJoc1tpXSkNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLQ0KLQ0KLSAgICBbVGVzdEZpeHR1cmVdDQotICAgIHB1YmxpYyBjbGFzcyBDaXJjQnVmZmVyVGVzdHMNCi0gICAgew0KLSAgICAgICAgI3JlZ2lvbiBDaXJjdWxhciBidWZmZXIgdGVzdHMNCi0gICAgICAgIFtUZXN0XQ0KLSAgICAgICAgcHVibGljIHZvaWQgU2luZ2xlUHV0R2V0KCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDaXJjdWxhckJ1ZmZlciBidWYgPSBuZXcgQ2lyY3VsYXJCdWZmZXIoMTApOw0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMCwgYnVmLlNpemUgKTsNCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIC0xLCBidWYuR2V0KCkgKTsNCi0NCi0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGJ1Zi5QdXQoIDEgKSk7DQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCBidWYuU2l6ZSApOw0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMSwgYnVmLkdldCgpICk7DQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAwLCBidWYuU2l6ZSApOw0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggLTEsIGJ1Zi5HZXQoKSApOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgW1Rlc3RdDQotICAgICAgICBwdWJsaWMgdm9pZCBCbG9ja1B1dEdldCgpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ2lyY3VsYXJCdWZmZXIgYnVmID0gbmV3IENpcmN1bGFyQnVmZmVyKDEwKTsNCi0gICAgICAgICAgICBieXRlW10gYXJyID0gezEsMiwzLDQsNSw2LDcsOCw5LDEwfTsNCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDEwLCBidWYuUHV0KGFyciwwLDEwKSApOw0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMTAsIGJ1Zi5TaXplICk7DQotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoIGJ1Zi5QdXQoMTEpICk7DQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCBidWYuR2V0KCkgKTsNCi0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCBidWYuUHV0KDExKSApOw0KLQ0KLSAgICAgICAgICAgIGJ5dGVbXSBhcnIyID0gKGJ5dGVbXSlhcnIuQ2xvbmUoKTsNCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDksIGJ1Zi5HZXQoYXJyMiwxLDkpICk7DQotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggVXRpbHMuYnl0ZUFyckVxdWFsKGFycixhcnIyKSApOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgI2VuZHJlZ2lvbg0KLSAgICB9DQotDQotICAgIFtUZXN0Rml4dHVyZV0NCi0gICAgcHVibGljIGNsYXNzIENoZWNrc3VtVGVzdHMNCi0gICAgew0KLSAgICAgICAgI3JlZ2lvbiBDUkMzMiBUZXN0cw0KLSAgICAgICAgW1Rlc3RdDQotICAgICAgICBwdWJsaWMgdm9pZCBDUkMzMl9OdWxsKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDUkMzMkNoZWNrc3VtIGNyYzMyID0gbmV3IENSQzMyQ2hlY2tzdW0oKTsNCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDAsIGNyYzMyLlZhbHVlICk7DQotDQotICAgICAgICAgICAgY3JjMzIgPSBuZXcgQ1JDMzJDaGVja3N1bSgxKTsNCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDEsIGNyYzMyLlZhbHVlICk7DQotDQotICAgICAgICAgICAgY3JjMzIgPSBuZXcgQ1JDMzJDaGVja3N1bSg1NTYpOw0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggNTU2LCBjcmMzMi5WYWx1ZSApOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgW1Rlc3RdDQotICAgICAgICBwdWJsaWMgdm9pZCBDUkMzMl9EYXRhKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDUkMzMkNoZWNrc3VtIGNyYzMyID0gbmV3IENSQzMyQ2hlY2tzdW0oKTsNCi0gICAgICAgICAgICBieXRlW10gZGF0YSA9IHsgMSwyLDMsNCw1LDYsNyB9Ow0KLSAgICAgICAgICAgIGNyYzMyLlVwZGF0ZShkYXRhKTsNCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDB4NzBlNDY4ODgsIGNyYzMyLlZhbHVlICApOw0KLQ0KLSAgICAgICAgICAgIGNyYzMyID0gbmV3IENSQzMyQ2hlY2tzdW0oKTsNCi0gICAgICAgICAgICBjcmMzMi5VcGRhdGUoInBlbmd1aW4iKTsNCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDB4MGU1YzFhMTIwLCBjcmMzMi5WYWx1ZSApOw0KLQ0KLSAgICAgICAgICAgIGNyYzMyID0gbmV3IENSQzMyQ2hlY2tzdW0oMSk7DQotICAgICAgICAgICAgY3JjMzIuVXBkYXRlKCJwZW5ndWluIik7DQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4NDNiNmFhOTQsIGNyYzMyLlZhbHVlKTsNCi0NCi0gICAgICAgIH0NCi0gICAgICAgICNlbmRyZWdpb24NCi0NCi0gICAgICAgICNyZWdpb24gQWRsZXIgdGVzdHMNCi0NCi0gICAgICAgIFtUZXN0XQ0KLSAgICAgICAgcHVibGljIHZvaWQgQWRsZXJfTnVsbCgpDQotICAgICAgICB7DQotICAgICAgICAgICAgQWRsZXJDaGVja3N1bSBhZGxlciA9IG5ldyBBZGxlckNoZWNrc3VtKCk7DQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIGFkbGVyLlZhbHVlKTsNCi0NCi0gICAgICAgICAgICBhZGxlciA9IG5ldyBBZGxlckNoZWNrc3VtKDEpOw0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMSwgYWRsZXIuVmFsdWUgKTsNCi0NCi0gICAgICAgICAgICBhZGxlciA9IG5ldyBBZGxlckNoZWNrc3VtKDU1Nik7DQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCA1NTYsIGFkbGVyLlZhbHVlICk7DQotICAgICAgICB9DQotDQotICAgICAgICBbVGVzdF0NCi0gICAgICAgIHB1YmxpYyB2b2lkIEFkbGVyX0RhdGEoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEFkbGVyQ2hlY2tzdW0gYWRsZXIgPSBuZXcgQWRsZXJDaGVja3N1bSgxKTsNCi0gICAgICAgICAgICBieXRlW10gZGF0YSA9IHsgMSwyLDMsNCw1LDYsNyB9Ow0KLSAgICAgICAgICAgIGFkbGVyLlVwZGF0ZShkYXRhKTsNCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDB4NWIwMDFkLCBhZGxlci5WYWx1ZSAgKTsNCi0NCi0gICAgICAgICAgICBhZGxlciA9IG5ldyBBZGxlckNoZWNrc3VtKCk7DQotICAgICAgICAgICAgYWRsZXIuVXBkYXRlKCJwZW5ndWluIik7DQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4MGJjZjAyZjYsIGFkbGVyLlZhbHVlICk7DQotDQotICAgICAgICAgICAgYWRsZXIgPSBuZXcgQWRsZXJDaGVja3N1bSgxKTsNCi0gICAgICAgICAgICBhZGxlci5VcGRhdGUoInBlbmd1aW4iKTsNCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHgwYmQ2MDJmNywgYWRsZXIuVmFsdWUpOw0KLQ0KLSAgICAgICAgfQ0KLSAgICAgICAgI2VuZHJlZ2lvbg0KLSAgICB9DQotDQotICAgIFtUZXN0Rml4dHVyZV0NCi0gICAgcHVibGljIGNsYXNzIEluZm9UZXN0cw0KLSAgICB7DQotICAgICAgICAjcmVnaW9uIEluZm8gdGVzdHMNCi0gICAgICAgIFtUZXN0XQ0KLSAgICAgICAgcHVibGljIHZvaWQgSW5mb19WZXJzaW9uKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBJbmZvIGluZm8gPSBuZXcgSW5mbygpOw0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMS4yLjciLCBJbmZvLlZlcnNpb24pOw0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMiwgaW5mby5TaXplT2ZVSW50KTsNCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzIsIGluZm8uU2l6ZU9mVUxvbmcpOw0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMiwgaW5mby5TaXplT2ZQb2ludGVyKTsNCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzIsIGluZm8uU2l6ZU9mT2Zmc2V0KTsNCi0gICAgICAgIH0NCi0gICAgICAgICNlbmRyZWdpb24NCi0gICAgfQ0KLQ0KLSAgICBbVGVzdEZpeHR1cmVdDQotICAgIHB1YmxpYyBjbGFzcyBEZWZsYXRlSW5mbGF0ZVRlc3RzDQotICAgIHsNCi0gICAgICAgICNyZWdpb24gRGVmbGF0ZSB0ZXN0cw0KLSAgICAgICAgW1Rlc3RdDQotICAgICAgICBwdWJsaWMgdm9pZCBEZWZsYXRlX0luaXQoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHVzaW5nIChEZWZsYXRlciBkZWYgPSBuZXcgRGVmbGF0ZXIoQ29tcHJlc3NMZXZlbC5EZWZhdWx0KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3QgY29tcHJlc3NlZERhdGEgPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgICAgICBwcml2YXRlIHVpbnQgYWRsZXIxOw0KLQ0KLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3QgdW5jb21wcmVzc2VkRGF0YSA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgICAgIHByaXZhdGUgdWludCBhZGxlcjI7DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBDRGF0YUF2YWlsKGJ5dGVbXSBkYXRhLCBpbnQgc3RhcnRJbmRleCwgaW50IGNvdW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkNCi0gICAgICAgICAgICAgICAgY29tcHJlc3NlZERhdGEuQWRkKGRhdGFbaStzdGFydEluZGV4XSk7DQotICAgICAgICB9DQotDQotICAgICAgICBbVGVzdF0NCi0gICAgICAgIHB1YmxpYyB2b2lkIERlZmxhdGVfQ29tcHJlc3MoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNvbXByZXNzZWREYXRhLkNsZWFyKCk7DQotDQotICAgICAgICAgICAgYnl0ZVtdIHRlc3REYXRhID0gbmV3IGJ5dGVbMzUwMDBdOw0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdERhdGEuTGVuZ3RoOyArK2kpDQotICAgICAgICAgICAgICAgIHRlc3REYXRhW2ldID0gNTsNCi0NCi0gICAgICAgICAgICB1c2luZyAoRGVmbGF0ZXIgZGVmID0gbmV3IERlZmxhdGVyKChDb21wcmVzc0xldmVsKTUpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZGVmLkRhdGFBdmFpbGFibGUgKz0gbmV3IERhdGFBdmFpbGFibGVIYW5kbGVyKENEYXRhQXZhaWwpOw0KLSAgICAgICAgICAgICAgICBkZWYuQWRkKHRlc3REYXRhKTsNCi0gICAgICAgICAgICAgICAgZGVmLkZpbmlzaCgpOw0KLSAgICAgICAgICAgICAgICBhZGxlcjEgPSBkZWYuQ2hlY2tzdW07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgI2VuZHJlZ2lvbg0KLQ0KLSAgICAgICAgI3JlZ2lvbiBJbmZsYXRlIHRlc3RzDQotICAgICAgICBbVGVzdF0NCi0gICAgICAgIHB1YmxpYyB2b2lkIEluZmxhdGVfSW5pdCgpDQotICAgICAgICB7DQotICAgICAgICAgICAgdXNpbmcgKEluZmxhdGVyIGluZiA9IG5ldyBJbmZsYXRlcigpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBwcml2YXRlIHZvaWQgRERhdGFBdmFpbChieXRlW10gZGF0YSwgaW50IHN0YXJ0SW5kZXgsIGludCBjb3VudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpDQotICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZERhdGEuQWRkKGRhdGFbaStzdGFydEluZGV4XSk7DQotICAgICAgICB9DQotDQotICAgICAgICBbVGVzdF0NCi0gICAgICAgIHB1YmxpYyB2b2lkIEluZmxhdGVfRXhwYW5kKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB1bmNvbXByZXNzZWREYXRhLkNsZWFyKCk7DQotDQotICAgICAgICAgICAgdXNpbmcgKEluZmxhdGVyIGluZiA9IG5ldyBJbmZsYXRlcigpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaW5mLkRhdGFBdmFpbGFibGUgKz0gbmV3IERhdGFBdmFpbGFibGVIYW5kbGVyKEREYXRhQXZhaWwpOw0KLSAgICAgICAgICAgICAgICBpbmYuQWRkKChieXRlW10pY29tcHJlc3NlZERhdGEuVG9BcnJheSh0eXBlb2YoYnl0ZSkpKTsNCi0gICAgICAgICAgICAgICAgaW5mLkZpbmlzaCgpOw0KLSAgICAgICAgICAgICAgICBhZGxlcjIgPSBpbmYuQ2hlY2tzdW07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggYWRsZXIxLCBhZGxlcjIgKTsNCi0gICAgICAgIH0NCi0gICAgICAgICNlbmRyZWdpb24NCi0gICAgfQ0KLQ0KLSAgICBbVGVzdEZpeHR1cmVdDQotICAgIHB1YmxpYyBjbGFzcyBHWmlwU3RyZWFtVGVzdHMNCi0gICAgew0KLSAgICAgICAgI3JlZ2lvbiBHWmlwU3RyZWFtIHRlc3QNCi0gICAgICAgIFtUZXN0XQ0KLSAgICAgICAgcHVibGljIHZvaWQgR1ppcFN0cmVhbV9Xcml0ZVJlYWQoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHVzaW5nIChHWmlwU3RyZWFtIGd6T3V0ID0gbmV3IEdaaXBTdHJlYW0oImd6c3RyZWFtLmd6IiwgQ29tcHJlc3NMZXZlbC5CZXN0KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEJpbmFyeVdyaXRlciB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKGd6T3V0KTsNCi0gICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKCJoaSB0aGVyZSIpOw0KLSAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoTWF0aC5QSSk7DQotICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSg0Mik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHVzaW5nIChHWmlwU3RyZWFtIGd6SW4gPSBuZXcgR1ppcFN0cmVhbSgiZ3pzdHJlYW0uZ3oiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEJpbmFyeVJlYWRlciByZWFkZXIgPSBuZXcgQmluYXJ5UmVhZGVyKGd6SW4pOw0KLSAgICAgICAgICAgICAgICBzdHJpbmcgcyA9IHJlYWRlci5SZWFkU3RyaW5nKCk7DQotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiaGkgdGhlcmUiLHMpOw0KLSAgICAgICAgICAgICAgICBkb3VibGUgZCA9IHJlYWRlci5SZWFkRG91YmxlKCk7DQotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChNYXRoLlBJLCBkKTsNCi0gICAgICAgICAgICAgICAgaW50IGkgPSByZWFkZXIuUmVhZEludDMyKCk7DQotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MixpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9DQotICAgICAgICAjZW5kcmVnaW9uDQotCX0NCi19DQotDQotI2VuZGlmDQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL0xJQ0VOU0VfMV8wLnR4dCBiL3NyYy96bGliL2NvbnRyaWIvZG90emxpYi9MSUNFTlNFXzFfMC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyN2E1YmMuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL0xJQ0VOU0VfMV8wLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLUJvb3N0IFNvZnR3YXJlIExpY2Vuc2UgLSBWZXJzaW9uIDEuMCAtIEF1Z3VzdCAxN3RoLCAyMDAzCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9yIG9yZ2FuaXphdGlvbgotb2J0YWluaW5nIGEgY29weSBvZiB0aGUgc29mdHdhcmUgYW5kIGFjY29tcGFueWluZyBkb2N1bWVudGF0aW9uIGNvdmVyZWQgYnkKLXRoaXMgbGljZW5zZSAodGhlICJTb2Z0d2FyZSIpIHRvIHVzZSwgcmVwcm9kdWNlLCBkaXNwbGF5LCBkaXN0cmlidXRlLAotZXhlY3V0ZSwgYW5kIHRyYW5zbWl0IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUKLVNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHRoaXJkLXBhcnRpZXMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvCi1kbyBzbywgYWxsIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZzoKLQotVGhlIGNvcHlyaWdodCBub3RpY2VzIGluIHRoZSBTb2Z0d2FyZSBhbmQgdGhpcyBlbnRpcmUgc3RhdGVtZW50LCBpbmNsdWRpbmcKLXRoZSBhYm92ZSBsaWNlbnNlIGdyYW50LCB0aGlzIHJlc3RyaWN0aW9uIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi1tdXN0IGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCBhbmQKLWFsbCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTb2Z0d2FyZSwgdW5sZXNzIHN1Y2ggY29waWVzIG9yIGRlcml2YXRpdmUKLXdvcmtzIGFyZSBzb2xlbHkgaW4gdGhlIGZvcm0gb2YgbWFjaGluZS1leGVjdXRhYmxlIG9iamVjdCBjb2RlIGdlbmVyYXRlZCBieQotYSBzb3VyY2UgbGFuZ3VhZ2UgcHJvY2Vzc29yLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UCi1TSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQU5ZT05FIERJU1RSSUJVVElORyBUSEUgU09GVFdBUkUgQkUgTElBQkxFCi1GT1IgQU5ZIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKLUFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgotREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvZG90emxpYi9yZWFkbWUudHh0IGIvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOGMyZGQuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9kb3R6bGliL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyBhIC5OZXQgd3JhcHBlciBjbGFzcyBsaWJyYXJ5IGZvciB0aGUgWkxpYjEuZGxsCi0KLVRoZSB3cmFwcGVyIGluY2x1ZGVzIHN1cHBvcnQgZm9yIGluZmxhdGluZy9kZWZsYXRpbmcgbWVtb3J5IGJ1ZmZlcnMsCi0uTmV0IHN0cmVhbWluZyB3cmFwcGVycyBmb3IgdGhlIGd6IHN0cmVhbXMgcGFydCBvZiB6bGliLCBhbmQgd3JhcHBlcnMKLWZvciB0aGUgY2hlY2tzdW0gcGFydHMgb2YgemxpYi4gU2VlIERvdFpMaWIvVW5pdFRlc3RzLmNzIGZvciBleGFtcGxlcy4KLQotRGlyZWN0b3J5IHN0cnVjdHVyZToKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxJQ0VOU0VfMV8wLnR4dCAgICAgICAtIExpY2Vuc2UgZmlsZS4KLXJlYWRtZS50eHQgICAgICAgICAgICAtIFRoaXMgZmlsZS4KLURvdFpMaWIuY2htICAgICAgICAgICAtIENsYXNzIGxpYnJhcnkgZG9jdW1lbnRhdGlvbgotRG90WkxpYi5idWlsZCAgICAgICAgIC0gTkFudCBidWlsZCBmaWxlCi1Eb3RaTGliLnNsbiAgICAgICAgICAgLSBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAyMDAzIHNvbHV0aW9uIGZpbGUKLQotRG90WkxpYlwqLmNzICAgICAgICAgIC0gU291cmNlIGZpbGVzIGZvciB0aGUgY2xhc3MgbGlicmFyeQotCi1Vbml0IHRlc3RzOgotLS0tLS0tLS0tLS0KLVRoZSBmaWxlIERvdFpMaWIvVW5pdFRlc3RzLmNzIGNvbnRhaW5zIHVuaXQgdGVzdHMgZm9yIHVzZSB3aXRoIE5Vbml0IDIuMSBvciBoaWdoZXIuCi1UbyBpbmNsdWRlIHVuaXQgdGVzdHMgaW4gdGhlIGJ1aWxkLCBkZWZpbmUgbnVuaXQgYmVmb3JlIGJ1aWxkaW5nLgotCi0KLUJ1aWxkIGluc3RydWN0aW9uczoKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotMS4gVXNpbmcgVmlzdWFsIFN0dWRpby5OZXQgMjAwMzoKLSAgIE9wZW4gRG90WkxpYi5zbG4gaW4gVlMuTmV0IGFuZCBidWlsZCBmcm9tIHRoZXJlLiBPdXRwdXQgZmlsZSAoRG90WkxpYi5kbGwpCi0gICB3aWxsIGJlIGZvdW5kIC4vRG90WkxpYi9iaW4vcmVsZWFzZSBvciAuL0RvdFpMaWIvYmluL2RlYnVnLCBkZXBlbmRpbmcgb24KLSAgIHlvdSBhcmUgYnVpbGRpbmcgdGhlIHJlbGVhc2Ugb3IgZGVidWcgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gQ2hlY2sKLSAgIERvdFpMaWIvVW5pdFRlc3RzLmNzIGZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGluY2x1ZGUgdW5pdCB0ZXN0cyBpbiB0aGUKLSAgIGJ1aWxkLgotCi0yLiBVc2luZyBOQW50OgotICAgT3BlbiBhIGNvbW1hbmQgcHJvbXB0IHdpdGggYWNjZXNzIHRvIHRoZSBidWlsZCBlbnZpcm9ubWVudCBhbmQgcnVuIG5hbnQKLSAgIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgRG90WkxpYi5idWlsZCBmaWxlLgotICAgWW91IGNhbiBkZWZpbmUgMiBwcm9wZXJ0aWVzIG9uIHRoZSBuYW50IGNvbW1hbmQtbGluZSB0byBjb250cm9sIHRoZSBidWlsZDoKLSAgIGRlYnVnPXt0cnVlfGZhbHNlfSB0byB0b2dnbGUgYmV0d2VlbiByZWxlYXNlL2RlYnVnIGJ1aWxkcyAoZGVmYXVsdD10cnVlKS4KLSAgIG51bml0PXt0cnVlfGZhbHNlfSB0byBpbmNsdWRlIG9yIGVzY2x1ZGUgdW5pdCB0ZXN0cyAoZGVmYXVsdD10cnVlKS4KLSAgIEFsc28gdGhlIHRhcmdldCBjbGVhbiB3aWxsIHJlbW92ZSBiaW5hcmllcy4KLSAgIE91dHB1dCBmaWxlIChEb3RaTGliLmRsbCkgd2lsbCBiZSBmb3VuZCBpbiBlaXRoZXIgLi9Eb3RaTGliL2Jpbi9yZWxlYXNlCi0gICBvciAuL0RvdFpMaWIvYmluL2RlYnVnLCBkZXBlbmRpbmcgb24gd2hldGhlciB5b3UgYXJlIGJ1aWxkaW5nIHRoZSByZWxlYXNlCi0gICBvciBkZWJ1ZyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gICBFeGFtcGxlczoKLSAgICAgbmFudCAtRDpkZWJ1Zz1mYWxzZSAtRDpudW5pdD1mYWxzZQotICAgICAgIHdpbGwgYnVpbGQgYSByZWxlYXNlIG1vZGUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSB3aXRob3V0IHVuaXQgdGVzdHMuCi0gICAgIG5hbnQKLSAgICAgICB3aWxsIGJ1aWxkIGEgZGVidWcgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSB3aXRoIHVuaXQgdGVzdHMKLSAgICAgbmFudCBjbGVhbgotICAgICAgIHdpbGwgcmVtb3ZlIGFsbCBwcmV2aW91c2x5IGJ1aWx0IGZpbGVzLgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSBIZW5yaWsgUmF2biAyMDA0Ci0KLVVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgotKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2djY19ndm1hdDY0L2d2bWF0NjQuUyBiL3NyYy96bGliL2NvbnRyaWIvZ2NjX2d2bWF0NjQvZ3ZtYXQ2NC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDg1OGRkLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvZ2NjX2d2bWF0NjQvZ3ZtYXQ2NC5TCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLS8qDQotO3VJbnQgbG9uZ2VzdF9tYXRjaF94NjQoDQotOyAgICBkZWZsYXRlX3N0YXRlICpzLA0KLTsgICAgSVBvcyBjdXJfbWF0Y2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBtYXRjaCANCi0NCi07IGd2bWF0NjQuUyAtLSBBc20gcG9ydGlvbiBvZiB0aGUgb3B0aW1pemVkIGxvbmdlc3RfbWF0Y2ggZm9yIDMyIGJpdHMgeDg2XzY0DQotOyAgKEFNRDY0IG9uIEF0aGxvbiA2NCwgT3B0ZXJvbiwgUGhlbm9tDQotOyAgICAgYW5kIEludGVsIEVNNjRUIG9uIFBlbnRpdW0gNCB3aXRoIEVNNjRULCBQZW50aXVtIEQsIENvcmUgMiBEdW8sIENvcmUgSTUvSTcpDQotOyB0aGlzIGZpbGUgaXMgdHJhbnNsYXRpb24gZnJvbSBndm1hdDY0LmFzbSB0byBHQ0MgNC54IChmb3IgTGludXgsIE1hYyBYQ29kZSkNCi07IENvcHlyaWdodCAoQykgMTk5NS0yMDEwIEplYW4tbG91cCBHYWlsbHksIEJyaWFuIFJhaXRlciBhbmQgR2lsbGVzIFZvbGxhbnQuDQotOw0KLTsgRmlsZSB3cml0dGVuIGJ5IEdpbGxlcyBWb2xsYW50LCBieSBjb252ZXJ0aW5nIHRvIGFzc2VtYmx5IHRoZSBsb25nZXN0X21hdGNoDQotOyAgZnJvbSBKZWFuLWxvdXAgR2FpbGx5IGluIGRlZmxhdGUuYyBvZiB6TGliIGFuZCBpbmZvWmlwIHppcC4NCi07ICBhbmQgYnkgdGFraW5nIGluc3BpcmF0aW9uIG9uIGFzbTY4NiB3aXRoIG1hc20sIG9wdGltaXNlZCBhc3NlbWJseSBjb2RlDQotOyAgICAgICAgZnJvbSBCcmlhbiBSYWl0ZXIsIHdyaXR0ZW4gMTk5OA0KLTsNCi07ICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZA0KLTsgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMNCi07ICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLg0KLTsNCi07ICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwNCi07ICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0DQotOyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOg0KLTsNCi07ICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdA0KLTsgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlDQotOyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlDQotOyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4NCi07ICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQ0KLTsgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZQ0KLTsgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uDQotOw0KLTsgICAgICAgICBodHRwOi8vd3d3LnpsaWIubmV0DQotOyAgICAgICAgIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwNCi07ICAgICAgICAgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbA0KLTsNCi07IHRvIGNvbXBpbGUgdGhpcyBmaWxlIGZvciB6TGliLCBJIHVzZSBvcHRpb246DQotOyAgIGdjYyAtYyAtYXJjaCB4ODZfNjQgZ3ZtYXQ2NC5TDQotDQotDQotO3VJbnQgbG9uZ2VzdF9tYXRjaChzLCBjdXJfbWF0Y2gpDQotOyAgICBkZWZsYXRlX3N0YXRlICpzOw0KLTsgICAgSVBvcyBjdXJfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IG1hdGNoIC8NCi07DQotOyB3aXRoIFhDb2RlIGZvciBNYWMsIEkgaGFkIHN0cmFuZ2UgZXJyb3Igd2l0aCBzb21lIGp1bXAgb24gaW50ZWwgc3ludGF4DQotOyB0aGlzIGlzIHdoeSBCRUZPUkVfSk1QIGFuZCBBRlRFUl9KTVAgYXJlIHVzZWQNCi0gKi8NCi0NCi0NCi0jZGVmaW5lIEJFRk9SRV9KTVAgLmF0dF9zeW50YXgNCi0jZGVmaW5lIEFGVEVSX0pNUCAuaW50ZWxfc3ludGF4IG5vcHJlZml4DQotDQotI2lmbmRlZiBOT19VTkRFUkxJTkUNCi0jCWRlZmluZQltYXRjaF9pbml0CV9tYXRjaF9pbml0DQotIwlkZWZpbmUJbG9uZ2VzdF9tYXRjaAlfbG9uZ2VzdF9tYXRjaA0KLSNlbmRpZg0KLQ0KLS5pbnRlbF9zeW50YXggbm9wcmVmaXgNCi0NCi0uZ2xvYmwJbWF0Y2hfaW5pdCwgbG9uZ2VzdF9tYXRjaA0KLS50ZXh0DQotbG9uZ2VzdF9tYXRjaDoNCi0NCi0NCi0NCi0jZGVmaW5lIExvY2FsVmFyc1NpemUgOTYNCi0vKg0KLTsgcmVnaXN0ZXIgdXNlZCA6IHJheCxyYngscmN4LHJkeCxyc2kscmRpLHI4LHI5LHIxMCxyMTEscjEyDQotOyBmcmVlIHJlZ2lzdGVyIDogIHIxNCxyMTUNCi07IHJlZ2lzdGVyIGNhbiBiZSBzYXZlZCA6IHJzcA0KLSovDQotDQotI2RlZmluZSBjaGFpbmxlbndtYXNrICAgICAocnNwICsgOCAtIExvY2FsVmFyc1NpemUpDQotI2RlZmluZSBuaWNlbWF0Y2ggICAgICAgICAocnNwICsgMTYgLSBMb2NhbFZhcnNTaXplKQ0KLQ0KLSNkZWZpbmUgc2F2ZV9yZGkgICAgICAgIChyc3AgKyAyNCAtIExvY2FsVmFyc1NpemUpDQotI2RlZmluZSBzYXZlX3JzaSAgICAgICAgKHJzcCArIDMyIC0gTG9jYWxWYXJzU2l6ZSkNCi0jZGVmaW5lIHNhdmVfcmJ4ICAgICAgICAocnNwICsgNDAgLSBMb2NhbFZhcnNTaXplKQ0KLSNkZWZpbmUgc2F2ZV9yYnAgICAgICAgIChyc3AgKyA0OCAtIExvY2FsVmFyc1NpemUpDQotI2RlZmluZSBzYXZlX3IxMiAgICAgICAgKHJzcCArIDU2IC0gTG9jYWxWYXJzU2l6ZSkNCi0jZGVmaW5lIHNhdmVfcjEzICAgICAgICAocnNwICsgNjQgLSBMb2NhbFZhcnNTaXplKQ0KLSNkZWZpbmUgc2F2ZV9yMTQgICAgICAgIChyc3AgKyA3MiAtIExvY2FsVmFyc1NpemUpDQotI2RlZmluZSBzYXZlX3IxNSAgICAgICAgKHJzcCArIDgwIC0gTG9jYWxWYXJzU2l6ZSkNCi0NCi0NCi0vKg0KLTsgIGFsbCB0aGUgKzQgb2Zmc2V0cyBhcmUgZHVlIHRvIHRoZSBhZGRpdGlvbiBvZiBwZW5kaW5nX2J1Zl9zaXplIChpbiB6bGliDQotOyAgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIHNpbmNlIHRoZSBhc20gY29kZSB3YXMgZmlyc3Qgd3JpdHRlbg0KLTsgIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgMS4wLjQgb3Igb2xkZXIsIHJlbW92ZSB0aGUgKzQpLg0KLTsgIE5vdGUgOiB0aGVzZSB2YWx1ZSBhcmUgZ29vZCB3aXRoIGEgOCBieXRlcyBib3VuZGFyeSBwYWNrIHN0cnVjdHVyZQ0KLSovDQotDQotI2RlZmluZSAgICBNQVhfTUFUQ0ggICAgICAgICAgICAgIDI1OA0KLSNkZWZpbmUgICAgTUlOX01BVENIICAgICAgICAgICAgICAzDQotI2RlZmluZSAgICBNSU5fTE9PS0FIRUFEICAgICAgICAgIChNQVhfTUFUQ0grTUlOX01BVENIKzEpDQotDQotLyoNCi07OzsgT2Zmc2V0cyBmb3IgZmllbGRzIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZS4gVGhlc2UgbnVtYmVycw0KLTs7OyBhcmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBkZWZpbml0aW9uIG9mIGRlZmxhdGVfc3RhdGUsIHdpdGggdGhlDQotOzs7IGFzc3VtcHRpb24gdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBkd29yZC1hbGlnbiB0aGUgZmllbGRzLiAoVGh1cywNCi07OzsgY2hhbmdpbmcgdGhlIGRlZmluaXRpb24gb2YgZGVmbGF0ZV9zdGF0ZSBjb3VsZCBlYXNpbHkgY2F1c2UgdGhpcw0KLTs7OyBwcm9ncmFtIHRvIGNyYXNoIGhvcnJpYmx5LCB3aXRob3V0IHNvIG11Y2ggYXMgYSB3YXJuaW5nIGF0DQotOzs7IGNvbXBpbGUgdGltZS4gU2lnaC4pDQotDQotOyAgYWxsIHRoZSAremxpYjEyMjJhZGQgb2Zmc2V0cyBhcmUgZHVlIHRvIHRoZSBhZGRpdGlvbiBvZiBmaWVsZHMNCi07ICBpbiB6bGliIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4NCi07ICAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMC40IG9yIG9sZGVyLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAoLTQpIikuDQotOyAgKGlmIHlvdSBjb21waWxlIHdpdGggemxpYiBiZXR3ZWVuIDEuMC41IGFuZCAxLjIuMi4xLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAwIikuDQotOyAgaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMi4yLjIgb3IgbGF0ZXIgLCB1c2UgInpsaWIxMjIyYWRkIGVxdSA4IikuDQotKi8NCi0NCi0NCi0NCi0vKiB5b3UgY2FuIGNoZWNrIHRoZSBzdHJ1Y3R1cmUgb2Zmc2V0IGJ5IHJ1bm5pbmcNCi0NCi0jaW5jbHVkZSA8c3RkbGliLmg+DQotI2luY2x1ZGUgPHN0ZGlvLmg+DQotI2luY2x1ZGUgImRlZmxhdGUuaCINCi0NCi12b2lkIHByaW50X2RlcGwoKQ0KLXsNCi1kZWZsYXRlX3N0YXRlIGRzOw0KLWRlZmxhdGVfc3RhdGUgKnM9JmRzOw0KLXByaW50Zigic2l6ZSBwb2ludGVyPSV1XG4iLChpbnQpc2l6ZW9mKHZvaWQqKSk7DQotDQotcHJpbnRmKCIjZGVmaW5lIGRzV1NpemUgICAgICAgICAldVxuIiwoaW50KSgoKGNoYXIqKSYocy0+d19zaXplKSktKChjaGFyKilzKSkpOw0KLXByaW50ZigiI2RlZmluZSBkc1dNYXNrICAgICAgICAgJXVcbiIsKGludCkoKChjaGFyKikmKHMtPndfbWFzaykpLSgoY2hhciopcykpKTsNCi1wcmludGYoIiNkZWZpbmUgZHNXaW5kb3cgICAgICAgICV1XG4iLChpbnQpKCgoY2hhciopJihzLT53aW5kb3cpKS0oKGNoYXIqKXMpKSk7DQotcHJpbnRmKCIjZGVmaW5lIGRzUHJldiAgICAgICAgICAldVxuIiwoaW50KSgoKGNoYXIqKSYocy0+cHJldikpLSgoY2hhciopcykpKTsNCi1wcmludGYoIiNkZWZpbmUgZHNNYXRjaExlbiAgICAgICV1XG4iLChpbnQpKCgoY2hhciopJihzLT5tYXRjaF9sZW5ndGgpKS0oKGNoYXIqKXMpKSk7DQotcHJpbnRmKCIjZGVmaW5lIGRzUHJldk1hdGNoICAgICAldVxuIiwoaW50KSgoKGNoYXIqKSYocy0+cHJldl9tYXRjaCkpLSgoY2hhciopcykpKTsNCi1wcmludGYoIiNkZWZpbmUgZHNTdHJTdGFydCAgICAgICV1XG4iLChpbnQpKCgoY2hhciopJihzLT5zdHJzdGFydCkpLSgoY2hhciopcykpKTsNCi1wcmludGYoIiNkZWZpbmUgZHNNYXRjaFN0YXJ0ICAgICV1XG4iLChpbnQpKCgoY2hhciopJihzLT5tYXRjaF9zdGFydCkpLSgoY2hhciopcykpKTsNCi1wcmludGYoIiNkZWZpbmUgZHNMb29rYWhlYWQgICAgICV1XG4iLChpbnQpKCgoY2hhciopJihzLT5sb29rYWhlYWQpKS0oKGNoYXIqKXMpKSk7DQotcHJpbnRmKCIjZGVmaW5lIGRzUHJldkxlbiAgICAgICAldVxuIiwoaW50KSgoKGNoYXIqKSYocy0+cHJldl9sZW5ndGgpKS0oKGNoYXIqKXMpKSk7DQotcHJpbnRmKCIjZGVmaW5lIGRzTWF4Q2hhaW5MZW4gICAldVxuIiwoaW50KSgoKGNoYXIqKSYocy0+bWF4X2NoYWluX2xlbmd0aCkpLSgoY2hhciopcykpKTsNCi1wcmludGYoIiNkZWZpbmUgZHNHb29kTWF0Y2ggICAgICV1XG4iLChpbnQpKCgoY2hhciopJihzLT5nb29kX21hdGNoKSktKChjaGFyKilzKSkpOw0KLXByaW50ZigiI2RlZmluZSBkc05pY2VNYXRjaCAgICAgJXVcbiIsKGludCkoKChjaGFyKikmKHMtPm5pY2VfbWF0Y2gpKS0oKGNoYXIqKXMpKSk7DQotfQ0KLSovDQotDQotI2RlZmluZSBkc1dTaXplICAgICAgICAgIDY4DQotI2RlZmluZSBkc1dNYXNrICAgICAgICAgIDc2DQotI2RlZmluZSBkc1dpbmRvdyAgICAgICAgIDgwDQotI2RlZmluZSBkc1ByZXYgICAgICAgICAgIDk2DQotI2RlZmluZSBkc01hdGNoTGVuICAgICAgIDE0NA0KLSNkZWZpbmUgZHNQcmV2TWF0Y2ggICAgICAxNDgNCi0jZGVmaW5lIGRzU3RyU3RhcnQgICAgICAgMTU2DQotI2RlZmluZSBkc01hdGNoU3RhcnQgICAgIDE2MA0KLSNkZWZpbmUgZHNMb29rYWhlYWQgICAgICAxNjQNCi0jZGVmaW5lIGRzUHJldkxlbiAgICAgICAgMTY4DQotI2RlZmluZSBkc01heENoYWluTGVuICAgIDE3Mg0KLSNkZWZpbmUgZHNHb29kTWF0Y2ggICAgICAxODgNCi0jZGVmaW5lIGRzTmljZU1hdGNoICAgICAgMTkyDQotDQotI2RlZmluZSB3aW5kb3dfc2l6ZSAgICAgIFsgcmN4ICsgZHNXU2l6ZV0NCi0jZGVmaW5lIFdNYXNrICAgICAgICAgICAgWyByY3ggKyBkc1dNYXNrXQ0KLSNkZWZpbmUgd2luZG93X2FkICAgICAgICBbIHJjeCArIGRzV2luZG93XQ0KLSNkZWZpbmUgcHJldl9hZCAgICAgICAgICBbIHJjeCArIGRzUHJldl0NCi0jZGVmaW5lIHN0cnN0YXJ0ICAgICAgICAgWyByY3ggKyBkc1N0clN0YXJ0XQ0KLSNkZWZpbmUgbWF0Y2hfc3RhcnQgICAgICBbIHJjeCArIGRzTWF0Y2hTdGFydF0NCi0jZGVmaW5lIExvb2thaGVhZCAgICAgICAgWyByY3ggKyBkc0xvb2thaGVhZF0gLy87IDBmZmZmZmZmZmggb24gaW5mb3ppcA0KLSNkZWZpbmUgcHJldl9sZW5ndGggICAgICBbIHJjeCArIGRzUHJldkxlbl0NCi0jZGVmaW5lIG1heF9jaGFpbl9sZW5ndGggWyByY3ggKyBkc01heENoYWluTGVuXQ0KLSNkZWZpbmUgZ29vZF9tYXRjaCAgICAgICBbIHJjeCArIGRzR29vZE1hdGNoXQ0KLSNkZWZpbmUgbmljZV9tYXRjaCAgICAgICBbIHJjeCArIGRzTmljZU1hdGNoXQ0KLQ0KLS8qDQotOyB3aW5kb3dzOg0KLTsgcGFyYW1ldGVyIDEgaW4gcmN4KGRlZmxhdGUgc3RhdGUgcyksIHBhcmFtIDIgaW4gcmR4IChjdXIgbWF0Y2gpDQotDQotOyBzZWUgaHR0cDovL3dlYmxvZ3MuYXNwLm5ldC9vbGRuZXd0aGluZy9hcmNoaXZlLzIwMDQvMDEvMTQvNTg1NzkuYXNweCBhbmQNCi07IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9rbWFyY2gvaGgva21hcmNoLzY0Yml0QU1EXzhlOTUxZGQyLWVlNzctNDcyOC04NzAyLTU1Y2U0YjVkZDI0YS54bWwuYXNwDQotOw0KLTsgQWxsIHJlZ2lzdGVycyBtdXN0IGJlIHByZXNlcnZlZCBhY3Jvc3MgdGhlIGNhbGwsIGV4Y2VwdCBmb3INCi07ICAgcmF4LCByY3gsIHJkeCwgcjgsIHI5LCByMTAsIGFuZCByMTEsIHdoaWNoIGFyZSBzY3JhdGNoLg0KLQ0KLTsNCi07IGdjYyBvbiBtYWNvc3gtbGludXg6DQotOyBzZWUgaHR0cDovL3d3dy54ODYtNjQub3JnL2RvY3VtZW50YXRpb24vYWJpLTAuOTkucGRmDQotOyBwYXJhbSAxIGluIHJkaSwgcGFyYW0gMiBpbiByc2kNCi07IHJieCwgcnNwLCByYnAsIHIxMiB0byByMTUgbXVzdCBiZSBwcmVzZXJ2ZWQNCi0NCi07OzsgU2F2ZSByZWdpc3RlcnMgdGhhdCB0aGUgY29tcGlsZXIgbWF5IGJlIHVzaW5nLCBhbmQgYWRqdXN0IGVzcCB0bw0KLTs7OyBtYWtlIHJvb20gZm9yIG91ciBzdGFjayBmcmFtZS4NCi0NCi0NCi07OzsgUmV0cmlldmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gcjhkIHdpbGwgaG9sZCBjdXJfbWF0Y2gNCi07OzsgdGhyb3VnaG91dCB0aGUgZW50aXJlIGZ1bmN0aW9uLiBlZHggd2lsbCBob2xkIHRoZSBwb2ludGVyIHRvIHRoZQ0KLTs7OyBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBkdXJpbmcgdGhlIGZ1bmN0aW9uJ3Mgc2V0dXAgKGJlZm9yZQ0KLTs7OyBlbnRlcmluZyB0aGUgbWFpbiBsb29wLg0KLQ0KLTsgbXM6IHBhcmFtZXRlciAxIGluIHJjeCAoZGVmbGF0ZV9zdGF0ZSogcyksIHBhcmFtIDIgaW4gZWR4IC0+IHI4IChjdXIgbWF0Y2gpDQotOyBtYWM6IHBhcmFtIDEgaW4gcmRpLCBwYXJhbSAyIHJzaQ0KLTsgdGhpcyBjbGVhciBoaWdoIDMyIGJpdHMgb2YgcjgsIHdoaWNoIGNhbiBiZSBnYXJiYWdlIGluIGJvdGggcjggYW5kIHJkeA0KLSovDQotICAgICAgICBtb3YgW3NhdmVfcmJ4XSxyYngNCi0gICAgICAgIG1vdiBbc2F2ZV9yYnBdLHJicA0KLQ0KLQ0KLSAgICAgICAgbW92IHJjeCxyZGkNCi0NCi0gICAgICAgIG1vdiByOGQsZXNpDQotDQotDQotICAgICAgICBtb3YgW3NhdmVfcjEyXSxyMTINCi0gICAgICAgIG1vdiBbc2F2ZV9yMTNdLHIxMw0KLSAgICAgICAgbW92IFtzYXZlX3IxNF0scjE0DQotICAgICAgICBtb3YgW3NhdmVfcjE1XSxyMTUNCi0NCi0NCi0vLzs7OyB1SW50IHdtYXNrID0gcy0+d19tYXNrOw0KLS8vOzs7IHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7DQotLy87OzsgaWYgKHMtPnByZXZfbGVuZ3RoID49IHMtPmdvb2RfbWF0Y2gpIHsNCi0vLzs7OyAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOw0KLS8vOzs7IH0NCi0NCi0NCi0gICAgICAgIG1vdiBlZGksIHByZXZfbGVuZ3RoDQotICAgICAgICBtb3YgZXNpLCBnb29kX21hdGNoDQotICAgICAgICBtb3YgZWF4LCBXTWFzaw0KLSAgICAgICAgbW92IGVieCwgbWF4X2NoYWluX2xlbmd0aA0KLSAgICAgICAgY21wIGVkaSwgZXNpDQotICAgICAgICBqbCAgTGFzdE1hdGNoR29vZA0KLSAgICAgICAgc2hyIGVieCwgMg0KLUxhc3RNYXRjaEdvb2Q6DQotDQotLy87OzsgY2hhaW5sZW4gaXMgZGVjcmVtZW50ZWQgb25jZSBiZWZvcmVoYW5kIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbg0KLS8vOzs7IHVzZSB0aGUgc2lnbiBmbGFnIGluc3RlYWQgb2YgdGhlIHplcm8gZmxhZyBmb3IgdGhlIGV4aXQgdGVzdC4NCi0vLzs7OyBJdCBpcyB0aGVuIHNoaWZ0ZWQgaW50byB0aGUgaGlnaCB3b3JkLCB0byBtYWtlIHJvb20gZm9yIHRoZSB3bWFzaw0KLS8vOzs7IHZhbHVlLCB3aGljaCBpdCB3aWxsIGFsd2F5cyBhY2NvbXBhbnkuDQotDQotICAgICAgICBkZWMgZWJ4DQotICAgICAgICBzaGwgZWJ4LCAxNg0KLSAgICAgICAgb3IgIGVieCwgZWF4DQotDQotLy87Ozsgb24gemxpYiBvbmx5DQotLy87OzsgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7DQotDQotDQotDQotICAgICAgICBtb3YgZWF4LCBuaWNlX21hdGNoDQotICAgICAgICBtb3YgW2NoYWlubGVud21hc2tdLCBlYngNCi0gICAgICAgIG1vdiByMTBkLCBMb29rYWhlYWQNCi0gICAgICAgIGNtcCByMTBkLCBlYXgNCi0gICAgICAgIGNtb3ZubCByMTBkLCBlYXgNCi0gICAgICAgIG1vdiBbbmljZW1hdGNoXSxyMTBkDQotDQotDQotDQotLy87OzsgcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsNCi0gICAgICAgIG1vdiByMTAsIHdpbmRvd19hZA0KLSAgICAgICAgbW92IGVicCwgc3Ryc3RhcnQNCi0gICAgICAgIGxlYSByMTMsIFtyMTAgKyByYnBdDQotDQotLy87OzsgRGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHRoZSBzY2FuIHB0ciBpcyBvZmYgZnJvbSBiZWluZw0KLS8vOzs7IGR3b3JkLWFsaWduZWQuDQotDQotICAgICAgICAgbW92IHI5LHIxMw0KLSAgICAgICAgIG5lZyByMTMNCi0gICAgICAgICBhbmQgcjEzLDMNCi0NCi0vLzs7OyBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/DQotLy87OzsgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7DQotDQotDQotICAgICAgICBtb3YgZWF4LCB3aW5kb3dfc2l6ZQ0KLSAgICAgICAgc3ViIGVheCwgTUlOX0xPT0tBSEVBRA0KLQ0KLQ0KLSAgICAgICAgeG9yIGVkaSxlZGkNCi0gICAgICAgIHN1YiBlYnAsIGVheA0KLQ0KLSAgICAgICAgbW92IHIxMWQsIHByZXZfbGVuZ3RoDQotDQotICAgICAgICBjbW92bmcgZWJwLGVkaQ0KLQ0KLS8vOzs7IGludCBiZXN0X2xlbiA9IHMtPnByZXZfbGVuZ3RoOw0KLQ0KLQ0KLS8vOzs7IFN0b3JlIHRoZSBzdW0gb2Ygcy0+d2luZG93ICsgYmVzdF9sZW4gaW4gZXNpIGxvY2FsbHksIGFuZCBpbiBlc2kuDQotDQotICAgICAgIGxlYSAgcnNpLFtyMTArcjExXQ0KLQ0KLS8vOzs7IHJlZ2lzdGVyIHVzaCBzY2FuX3N0YXJ0ID0gKih1c2hmKilzY2FuOw0KLS8vOzs7IHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsNCi0vLzs7OyBQb3NmICpwcmV2ID0gcy0+cHJldjsNCi0NCi0gICAgICAgIG1vdnp4IHIxMmQsd29yZCBwdHIgW3I5XQ0KLSAgICAgICAgbW92enggZWJ4LCB3b3JkIHB0ciBbcjkgKyByMTEgLSAxXQ0KLQ0KLSAgICAgICAgbW92IHJkaSwgcHJldl9hZA0KLQ0KLS8vOzs7IEp1bXAgaW50byB0aGUgbWFpbiBsb29wLg0KLQ0KLSAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQotDQotICAgICAgICBjbXAgYngsd29yZCBwdHIgW3JzaSArIHI4IC0gMV0NCi0gICAgICAgIGp6ICBMb29rdXBMb29wSXNaZXJvDQotCQkJCQ0KLQkJCQkJCQ0KLQkJCQkJCQ0KLUxvb2t1cExvb3AxOg0KLSAgICAgICAgYW5kIHI4ZCwgZWR4DQotDQotICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdDQotICAgICAgICBjbXAgcjhkLCBlYnANCi0gICAgICAgIGpiZSBMZWF2ZU5vdw0KLQkJDQotCQkNCi0JCQ0KLSAgICAgICAgc3ViIGVkeCwgMHgwMDAxMDAwMA0KLQkJQkVGT1JFX0pNUA0KLSAgICAgICAganMgIExlYXZlTm93DQotCQlBRlRFUl9KTVANCi0NCi1Mb29wRW50cnkxOg0KLSAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQotCQlCRUZPUkVfSk1QDQotICAgICAgICBqeiAgTG9va3VwTG9vcElzWmVybw0KLQkJQUZURVJfSk1QDQotDQotTG9va3VwTG9vcDI6DQotICAgICAgICBhbmQgcjhkLCBlZHgNCi0NCi0gICAgICAgIG1vdnp4ICAgcjhkLCB3b3JkIHB0ciBbcmRpICsgcjgqMl0NCi0gICAgICAgIGNtcCByOGQsIGVicA0KLQkJQkVGT1JFX0pNUA0KLSAgICAgICAgamJlIExlYXZlTm93DQotCQlBRlRFUl9KTVANCi0gICAgICAgIHN1YiBlZHgsIDB4MDAwMTAwMDANCi0JCUJFRk9SRV9KTVANCi0gICAgICAgIGpzICBMZWF2ZU5vdw0KLQkJQUZURVJfSk1QDQotDQotTG9vcEVudHJ5MjoNCi0gICAgICAgIGNtcCBieCx3b3JkIHB0ciBbcnNpICsgcjggLSAxXQ0KLQkJQkVGT1JFX0pNUA0KLSAgICAgICAganogIExvb2t1cExvb3BJc1plcm8NCi0JCUFGVEVSX0pNUA0KLQ0KLUxvb2t1cExvb3A0Og0KLSAgICAgICAgYW5kIHI4ZCwgZWR4DQotDQotICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdDQotICAgICAgICBjbXAgcjhkLCBlYnANCi0JCUJFRk9SRV9KTVANCi0gICAgICAgIGpiZSBMZWF2ZU5vdw0KLQkJQUZURVJfSk1QDQotICAgICAgICBzdWIgZWR4LCAweDAwMDEwMDAwDQotCQlCRUZPUkVfSk1QDQotICAgICAgICBqcyAgTGVhdmVOb3cNCi0JCUFGVEVSX0pNUA0KLQ0KLUxvb3BFbnRyeTQ6DQotDQotICAgICAgICBjbXAgYngsd29yZCBwdHIgW3JzaSArIHI4IC0gMV0NCi0JCUJFRk9SRV9KTVANCi0gICAgICAgIGpueiBMb29rdXBMb29wMQ0KLSAgICAgICAgam1wIExvb2t1cExvb3BJc1plcm8NCi0JCUFGVEVSX0pNUA0KLS8qDQotOzs7IGRvIHsNCi07OzsgICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOw0KLTs7OyAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8DQotOzs7ICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsNCi07OzsgICAgIFsuLi5dDQotOzs7IH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdA0KLTs7OyAgICAgICAgICAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsNCi07OzsNCi07OzsgSGVyZSBpcyB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiB3aWxsIHNwZW5kIHRoZQ0KLTs7OyBtYWpvcml0eSBvZiBpdHMgdGltZSBpbiB0aGlzIGxvb3AsIGFuZCBtYWpvcml0eSBvZiB0aGF0IHRpbWUgd2lsbA0KLTs7OyBiZSBzcGVudCBpbiB0aGUgZmlyc3QgdGVuIGluc3RydWN0aW9ucy4NCi07OzsNCi07OzsgV2l0aGluIHRoaXMgbG9vcDoNCi07OzsgZWJ4ID0gc2NhbmVuZA0KLTs7OyByOGQgPSBjdXJtYXRjaA0KLTs7OyBlZHggPSBjaGFpbmxlbndtYXNrIC0gaS5lLiwgKChjaGFpbmxlbiA8PCAxNikgfCB3bWFzaykNCi07OzsgZXNpID0gd2luZG93YmVzdGxlbiAtIGkuZS4sICh3aW5kb3cgKyBiZXN0bGVuKQ0KLTs7OyBlZGkgPSBwcmV2DQotOzs7IGVicCA9IGxpbWl0DQotKi8NCi0uYmFsaWduIDE2DQotTG9va3VwTG9vcDoNCi0gICAgICAgIGFuZCByOGQsIGVkeA0KLQ0KLSAgICAgICAgbW92enggICByOGQsIHdvcmQgcHRyIFtyZGkgKyByOCoyXQ0KLSAgICAgICAgY21wIHI4ZCwgZWJwDQotCQlCRUZPUkVfSk1QDQotICAgICAgICBqYmUgTGVhdmVOb3cNCi0JCUFGVEVSX0pNUA0KLSAgICAgICAgc3ViIGVkeCwgMHgwMDAxMDAwMA0KLQkJQkVGT1JFX0pNUA0KLSAgICAgICAganMgIExlYXZlTm93DQotCQlBRlRFUl9KTVANCi0NCi1Mb29wRW50cnk6DQotDQotICAgICAgICBjbXAgYngsd29yZCBwdHIgW3JzaSArIHI4IC0gMV0NCi0JCUJFRk9SRV9KTVANCi0gICAgICAgIGpueiBMb29rdXBMb29wMQ0KLQkJQUZURVJfSk1QDQotTG9va3VwTG9vcElzWmVybzoNCi0gICAgICAgIGNtcCAgICAgcjEydywgd29yZCBwdHIgW3IxMCArIHI4XQ0KLQkJQkVGT1JFX0pNUA0KLSAgICAgICAgam56IExvb2t1cExvb3AxDQotCQlBRlRFUl9KTVANCi0NCi0NCi0vLzs7OyBTdG9yZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBjaGFpbmxlbi4NCi0gICAgICAgIG1vdiBbY2hhaW5sZW53bWFza10sIGVkeA0KLS8qDQotOzs7IFBvaW50IGVkaSB0byB0aGUgc3RyaW5nIHVuZGVyIHNjcnV0aW55LCBhbmQgZXNpIHRvIHRoZSBzdHJpbmcgd2UNCi07OzsgYXJlIGhvcGluZyB0byBtYXRjaCBpdCB1cCB3aXRoLiBJbiBhY3R1YWxpdHksIGVzaSBhbmQgZWRpIGFyZQ0KLTs7OyBib3RoIHBvaW50ZWQgKE1BWF9NQVRDSF84IC0gc2NhbmFsaWduKSBieXRlcyBhaGVhZCwgYW5kIGVkeCBpcw0KLTs7OyBpbml0aWFsaXplZCB0byAtKE1BWF9NQVRDSF84IC0gc2NhbmFsaWduKS4NCi0qLw0KLSAgICAgICAgbGVhIHJzaSxbcjgrcjEwXQ0KLSAgICAgICAgbW92IHJkeCwgMHhmZmZmZmZmZmZmZmZmZWY4IC8vOyAtKE1BWF9NQVRDSF84KQ0KLSAgICAgICAgbGVhIHJzaSwgW3JzaSArIHIxMyArIDB4MDEwOF0gLy87TUFYX01BVENIXzhdDQotICAgICAgICBsZWEgcmRpLCBbcjkgKyByMTMgKyAweDAxMDhdIC8vO01BWF9NQVRDSF84XQ0KLQ0KLSAgICAgICAgcHJlZmV0Y2h0MSBbcnNpK3JkeF0NCi0gICAgICAgIHByZWZldGNodDEgW3JkaStyZHhdDQotDQotLyoNCi07OzsgVGVzdCB0aGUgc3RyaW5ncyBmb3IgZXF1YWxpdHksIDggYnl0ZXMgYXQgYSB0aW1lLiBBdCB0aGUgZW5kLA0KLTs7OyBhZGp1c3QgcmR4IHNvIHRoYXQgaXQgaXMgb2Zmc2V0IHRvIHRoZSBleGFjdCBieXRlIHRoYXQgbWlzbWF0Y2hlZC4NCi07OzsNCi07OzsgV2UgYWxyZWFkeSBrbm93IGF0IHRoaXMgcG9pbnQgdGhhdCB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMgb2YgdGhlDQotOzs7IHN0cmluZ3MgbWF0Y2ggZWFjaCBvdGhlciwgYW5kIHRoZXkgY2FuIGJlIHNhZmVseSBwYXNzZWQgb3ZlciBiZWZvcmUNCi07Ozsgc3RhcnRpbmcgdGhlIGNvbXBhcmUgbG9vcC4gU28gd2hhdCB0aGlzIGNvZGUgZG9lcyBpcyBza2lwIG92ZXIgMC0zDQotOzs7IGJ5dGVzLCBhcyBtdWNoIGFzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBkd29yZC1hbGlnbiB0aGUgZWRpDQotOzs7IHBvaW50ZXIuIChyc2kgd2lsbCBzdGlsbCBiZSBtaXNhbGlnbmVkIHRocmVlIHRpbWVzIG91dCBvZiBmb3VyLikNCi07OzsNCi07OzsgSXQgc2hvdWxkIGJlIGNvbmZlc3NlZCB0aGF0IHRoaXMgbG9vcCB1c3VhbGx5IGRvZXMgbm90IHJlcHJlc2VudA0KLTs7OyBtdWNoIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUuIFJlcGxhY2luZyBpdCB3aXRoIGEgbW9yZQ0KLTs7OyBzdHJhaWdodGZvcndhcmQgInJlcCBjbXBzYiIgd291bGQgbm90IGRyYXN0aWNhbGx5IGRlZ3JhZGUNCi07OzsgcGVyZm9ybWFuY2UuDQotKi8NCi0NCi1Mb29wQ21wczoNCi0gICAgICAgIG1vdiByYXgsIFtyc2kgKyByZHhdDQotICAgICAgICB4b3IgcmF4LCBbcmRpICsgcmR4XQ0KLSAgICAgICAgam56IExlYXZlTG9vcENtcHMNCi0NCi0gICAgICAgIG1vdiByYXgsIFtyc2kgKyByZHggKyA4XQ0KLSAgICAgICAgeG9yIHJheCwgW3JkaSArIHJkeCArIDhdDQotICAgICAgICBqbnogTGVhdmVMb29wQ21wczgNCi0NCi0NCi0gICAgICAgIG1vdiByYXgsIFtyc2kgKyByZHggKyA4KzhdDQotICAgICAgICB4b3IgcmF4LCBbcmRpICsgcmR4ICsgOCs4XQ0KLSAgICAgICAgam56IExlYXZlTG9vcENtcHMxNg0KLQ0KLSAgICAgICAgYWRkIHJkeCw4KzgrOA0KLQ0KLQkJQkVGT1JFX0pNUA0KLSAgICAgICAgam56ICBMb29wQ21wcw0KLSAgICAgICAgam1wICBMZW5NYXhpbXVtDQotCQlBRlRFUl9KTVANCi0JCQ0KLUxlYXZlTG9vcENtcHMxNjogYWRkIHJkeCw4DQotTGVhdmVMb29wQ21wczg6IGFkZCByZHgsOA0KLUxlYXZlTG9vcENtcHM6DQotDQotICAgICAgICB0ZXN0ICAgIGVheCwgMHgwMDAwRkZGRg0KLSAgICAgICAgam56IExlbkxvd2VyDQotDQotICAgICAgICB0ZXN0IGVheCwweGZmZmZmZmZmDQotDQotICAgICAgICBqbnogTGVuTG93ZXIzMg0KLQ0KLSAgICAgICAgYWRkIHJkeCw0DQotICAgICAgICBzaHIgcmF4LDMyDQotICAgICAgICBvciBheCxheA0KLQkJQkVGT1JFX0pNUA0KLSAgICAgICAgam56IExlbkxvd2VyDQotCQlBRlRFUl9KTVANCi0NCi1MZW5Mb3dlcjMyOg0KLSAgICAgICAgc2hyIGVheCwxNg0KLSAgICAgICAgYWRkIHJkeCwyDQotCQkNCi1MZW5Mb3dlcjoJCQ0KLSAgICAgICAgc3ViIGFsLCAxDQotICAgICAgICBhZGMgcmR4LCAwDQotLy87OzsgQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsDQotLy87OzsgdGhlbiBhdXRvbWF0aWNhbGx5IGFjY2VwdCBpdCBhcyB0aGUgYmVzdCBwb3NzaWJsZSBtYXRjaCBhbmQgbGVhdmUuDQotDQotICAgICAgICBsZWEgcmF4LCBbcmRpICsgcmR4XQ0KLSAgICAgICAgc3ViIHJheCwgcjkNCi0gICAgICAgIGNtcCBlYXgsIE1BWF9NQVRDSA0KLQkJQkVGT1JFX0pNUA0KLSAgICAgICAgamdlIExlbk1heGltdW0NCi0JCUFGVEVSX0pNUA0KLS8qDQotOzs7IElmIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIG5vdCBsb25nZXIgdGhhbiB0aGUgYmVzdCBtYXRjaCB3ZQ0KLTs7OyBoYXZlIHNvIGZhciwgdGhlbiBmb3JnZXQgaXQgYW5kIHJldHVybiB0byB0aGUgbG9va3VwIGxvb3AuDQotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotKi8NCi0gICAgICAgIGNtcCBlYXgsIHIxMWQNCi0gICAgICAgIGpnICBMb25nZXJNYXRjaA0KLQ0KLSAgICAgICAgbGVhIHJzaSxbcjEwK3IxMV0NCi0NCi0gICAgICAgIG1vdiByZGksIHByZXZfYWQNCi0gICAgICAgIG1vdiBlZHgsIFtjaGFpbmxlbndtYXNrXQ0KLQkJQkVGT1JFX0pNUA0KLSAgICAgICAgam1wIExvb2t1cExvb3ANCi0JCUFGVEVSX0pNUA0KLS8qDQotOzs7ICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7DQotOzs7ICAgICAgICAgYmVzdF9sZW4gPSBsZW47DQotOzs7ICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsNCi07OzsgICAgICAgICBzY2FuX2VuZCA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7DQotKi8NCi1Mb25nZXJNYXRjaDoNCi0gICAgICAgIG1vdiByMTFkLCBlYXgNCi0gICAgICAgIG1vdiBtYXRjaF9zdGFydCwgcjhkDQotICAgICAgICBjbXAgZWF4LCBbbmljZW1hdGNoXQ0KLQkJQkVGT1JFX0pNUA0KLSAgICAgICAgamdlIExlYXZlTm93DQotCQlBRlRFUl9KTVANCi0NCi0gICAgICAgIGxlYSByc2ksW3IxMCtyYXhdDQotDQotICAgICAgICBtb3Z6eCAgIGVieCwgd29yZCBwdHIgW3I5ICsgcmF4IC0gMV0NCi0gICAgICAgIG1vdiByZGksIHByZXZfYWQNCi0gICAgICAgIG1vdiBlZHgsIFtjaGFpbmxlbndtYXNrXQ0KLQkJQkVGT1JFX0pNUA0KLSAgICAgICAgam1wIExvb2t1cExvb3ANCi0JCUFGVEVSX0pNUA0KLQ0KLS8vOzs7IEFjY2VwdCB0aGUgY3VycmVudCBzdHJpbmcsIHdpdGggdGhlIG1heGltdW0gcG9zc2libGUgbGVuZ3RoLg0KLQ0KLUxlbk1heGltdW06DQotICAgICAgICBtb3YgcjExZCxNQVhfTUFUQ0gNCi0gICAgICAgIG1vdiBtYXRjaF9zdGFydCwgcjhkDQotDQotLy87OzsgaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuICh1SW50KWJlc3RfbGVuOw0KLS8vOzs7IHJldHVybiBzLT5sb29rYWhlYWQ7DQotDQotTGVhdmVOb3c6DQotICAgICAgICBtb3YgZWF4LCBMb29rYWhlYWQNCi0gICAgICAgIGNtcCByMTFkLCBlYXgNCi0gICAgICAgIGNtb3ZuZyBlYXgsIHIxMWQNCi0NCi0NCi0NCi0vLzs7OyBSZXN0b3JlIHRoZSBzdGFjayBhbmQgcmV0dXJuIGZyb20gd2hlbmNlIHdlIGNhbWUuDQotDQotDQotLy8gICAgICAgIG1vdiByc2ksW3NhdmVfcnNpXQ0KLS8vICAgICAgICBtb3YgcmRpLFtzYXZlX3JkaV0NCi0gICAgICAgIG1vdiByYngsW3NhdmVfcmJ4XQ0KLSAgICAgICAgbW92IHJicCxbc2F2ZV9yYnBdDQotICAgICAgICBtb3YgcjEyLFtzYXZlX3IxMl0NCi0gICAgICAgIG1vdiByMTMsW3NhdmVfcjEzXQ0KLSAgICAgICAgbW92IHIxNCxbc2F2ZV9yMTRdDQotICAgICAgICBtb3YgcjE1LFtzYXZlX3IxNV0NCi0NCi0NCi0gICAgICAgIHJldCAwDQotLy87IHBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBzdHJpbmcgIQ0KLS8vOyBZb3VyIGNhbiBmcmVlbHkgdXNlIGd2bWF0NjQgaW4gYW55IGZyZWUgb3IgY29tbWVyY2lhbCBhcHANCi0vLzsgYnV0IGl0IGlzIGZhciBiZXR0ZXIgZG9uJ3QgcmVtb3ZlIHRoZSBzdHJpbmcgaW4gdGhlIGJpbmFyeSENCi0gLy8gICBkYiAgICAgMGRoLDBhaCwiYXNtNjg2IHdpdGggbWFzbSwgb3B0aW1pc2VkIGFzc2VtYmx5IGNvZGUgZnJvbSBCcmlhbiBSYWl0ZXIsIHdyaXR0ZW4gMTk5OCwgY29udmVydGVkIHRvIGFtZCA2NCBieSBHaWxsZXMgVm9sbGFudCAyMDA1IiwwZGgsMGFoLDANCi0NCi0NCi1tYXRjaF9pbml0Og0KLSAgcmV0IDANCi0NCi0NCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2luZmJhY2s5L1JFQURNRSBiL3NyYy96bGliL2NvbnRyaWIvaW5mYmFjazkvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVlZDEzLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvaW5mYmFjazkvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotU2VlIGluZmJhY2s5LmggZm9yIHdoYXQgdGhpcyBpcyBhbmQgaG93IHRvIHVzZSBpdC4KZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvaW5mYmFjazkvaW5mYmFjazkuYyBiL3NyYy96bGliL2NvbnRyaWIvaW5mYmFjazkvaW5mYmFjazkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JiZTkwYy4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL2luZmJhY2s5L2luZmJhY2s5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTcgKzAsMCBAQAotLyogaW5mYmFjazkuYyAtLSBpbmZsYXRlIGRlZmxhdGU2NCBkYXRhIHVzaW5nIGEgY2FsbC1iYWNrIGludGVyZmFjZQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDggTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLSNpbmNsdWRlICJ6dXRpbC5oIgotI2luY2x1ZGUgImluZmJhY2s5LmgiCi0jaW5jbHVkZSAiaW5mdHJlZTkuaCIKLSNpbmNsdWRlICJpbmZsYXRlOS5oIgotCi0jZGVmaW5lIFdTSVpFIDY1NTM2VUwKLQotLyoKLSAgIHN0cm0gcHJvdmlkZXMgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGluIHphbGxvYyBhbmQgemZyZWUsIG9yCi0gICBaX05VTEwgdG8gdXNlIHRoZSBsaWJyYXJ5IG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KLQotICAgd2luZG93IGlzIGEgdXNlci1zdXBwbGllZCB3aW5kb3cgYW5kIG91dHB1dCBidWZmZXIgdGhhdCBpcyA2NEsgYnl0ZXMuCi0gKi8KLWludCBaRVhQT1JUIGluZmxhdGVCYWNrOUluaXRfKHN0cm0sIHdpbmRvdywgdmVyc2lvbiwgc3RyZWFtX3NpemUpCi16X3N0cmVhbSBGQVIgKnN0cm07Ci11bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OwotY29uc3QgY2hhciAqdmVyc2lvbjsKLWludCBzdHJlYW1fc2l6ZTsKLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotCi0gICAgaWYgKHZlcnNpb24gPT0gWl9OVUxMIHx8IHZlcnNpb25bMF0gIT0gWkxJQl9WRVJTSU9OWzBdIHx8Ci0gICAgICAgIHN0cmVhbV9zaXplICE9IChpbnQpKHNpemVvZih6X3N0cmVhbSkpKQotICAgICAgICByZXR1cm4gWl9WRVJTSU9OX0VSUk9SOwotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCB3aW5kb3cgPT0gWl9OVUxMKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RybS0+bXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi8KLSAgICBpZiAoc3RybS0+emFsbG9jID09IChhbGxvY19mdW5jKTApIHsKLSAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKLSAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOwotICAgIH0KLSAgICBpZiAoc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKSBzdHJtLT56ZnJlZSA9IHpjZnJlZTsKLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilaQUxMT0Moc3RybSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7Ci0gICAgaWYgKHN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOwotICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogYWxsb2NhdGVkXG4iKSk7Ci0gICAgc3RybS0+c3RhdGUgPSAodm9pZHBmKXN0YXRlOwotICAgIHN0YXRlLT53aW5kb3cgPSB3aW5kb3c7Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLS8qCi0gICBCdWlsZCBhbmQgb3V0cHV0IGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGZvciBmaXhlZCBjb2RlCi0gICBkZWNvZGluZy4KLSAqLwotI2lmZGVmIE1BS0VGSVhFRAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLXZvaWQgbWFrZWZpeGVkOSh2b2lkKQotewotICAgIHVuc2lnbmVkIHN5bSwgYml0cywgbG93LCBzaXplOwotICAgIGNvZGUgKm5leHQsICpsZW5maXgsICpkaXN0Zml4OwotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIHN0YXRlOwotICAgIGNvZGUgZml4ZWRbNTQ0XTsKLQotICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovCi0gICAgc3ltID0gMDsKLSAgICB3aGlsZSAoc3ltIDwgMTQ0KSBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7Ci0gICAgd2hpbGUgKHN5bSA8IDI1Nikgc3RhdGUubGVuc1tzeW0rK10gPSA5OwotICAgIHdoaWxlIChzeW0gPCAyODApIHN0YXRlLmxlbnNbc3ltKytdID0gNzsKLSAgICB3aGlsZSAoc3ltIDwgMjg4KSBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7Ci0gICAgbmV4dCA9IGZpeGVkOwotICAgIGxlbmZpeCA9IG5leHQ7Ci0gICAgYml0cyA9IDk7Ci0gICAgaW5mbGF0ZV90YWJsZTkoTEVOUywgc3RhdGUubGVucywgMjg4LCAmKG5leHQpLCAmKGJpdHMpLCBzdGF0ZS53b3JrKTsKLQotICAgIC8qIGRpc3RhbmNlIHRhYmxlICovCi0gICAgc3ltID0gMDsKLSAgICB3aGlsZSAoc3ltIDwgMzIpIHN0YXRlLmxlbnNbc3ltKytdID0gNTsKLSAgICBkaXN0Zml4ID0gbmV4dDsKLSAgICBiaXRzID0gNTsKLSAgICBpbmZsYXRlX3RhYmxlOShESVNUUywgc3RhdGUubGVucywgMzIsICYobmV4dCksICYoYml0cyksIHN0YXRlLndvcmspOwotCi0gICAgLyogd3JpdGUgdGFibGVzICovCi0gICAgcHV0cygiICAgIC8qIGluZmZpeDkuaCAtLSB0YWJsZSBmb3IgZGVjb2RpbmcgZGVmbGF0ZTY0IGZpeGVkIGNvZGVzIik7Ci0gICAgcHV0cygiICAgICAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IG1ha2VmaXhlZDkoKS4iKTsKLSAgICBwdXRzKCIgICAgICovIik7Ci0gICAgcHV0cygiIik7Ci0gICAgcHV0cygiICAgIC8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIik7Ci0gICAgcHV0cygiICAgICAgIEl0IGlzIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbGlicmFyeSBhbmQgaXMiKTsKLSAgICBwdXRzKCIgICAgICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLiIpOwotICAgIHB1dHMoIiAgICAgKi8iKTsKLSAgICBwdXRzKCIiKTsKLSAgICBzaXplID0gMVUgPDwgOTsKLSAgICBwcmludGYoIiAgICBzdGF0aWMgY29uc3QgY29kZSBsZW5maXhbJXVdID0geyIsIHNpemUpOwotICAgIGxvdyA9IDA7Ci0gICAgZm9yICg7OykgewotICAgICAgICBpZiAoKGxvdyAlIDYpID09IDApIHByaW50ZigiXG4gICAgICAgICIpOwotICAgICAgICBwcmludGYoInsldSwldSwlZH0iLCBsZW5maXhbbG93XS5vcCwgbGVuZml4W2xvd10uYml0cywKLSAgICAgICAgICAgICAgIGxlbmZpeFtsb3ddLnZhbCk7Ci0gICAgICAgIGlmICgrK2xvdyA9PSBzaXplKSBicmVhazsKLSAgICAgICAgcHV0Y2hhcignLCcpOwotICAgIH0KLSAgICBwdXRzKCJcbiAgICB9OyIpOwotICAgIHNpemUgPSAxVSA8PCA1OwotICAgIHByaW50ZigiXG4gICAgc3RhdGljIGNvbnN0IGNvZGUgZGlzdGZpeFsldV0gPSB7Iiwgc2l6ZSk7Ci0gICAgbG93ID0gMDsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmICgobG93ICUgNSkgPT0gMCkgcHJpbnRmKCJcbiAgICAgICAgIik7Ci0gICAgICAgIHByaW50ZigieyV1LCV1LCVkfSIsIGRpc3RmaXhbbG93XS5vcCwgZGlzdGZpeFtsb3ddLmJpdHMsCi0gICAgICAgICAgICAgICBkaXN0Zml4W2xvd10udmFsKTsKLSAgICAgICAgaWYgKCsrbG93ID09IHNpemUpIGJyZWFrOwotICAgICAgICBwdXRjaGFyKCcsJyk7Ci0gICAgfQotICAgIHB1dHMoIlxuICAgIH07Iik7Ci19Ci0jZW5kaWYgLyogTUFLRUZJWEVEICovCi0KLS8qIE1hY3JvcyBmb3IgaW5mbGF0ZUJhY2soKTogKi8KLQotLyogQ2xlYXIgdGhlIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqLwotI2RlZmluZSBJTklUQklUUygpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgaG9sZCA9IDA7IFwKLSAgICAgICAgYml0cyA9IDA7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBBc3N1cmUgdGhhdCBzb21lIGlucHV0IGlzIGF2YWlsYWJsZS4gIElmIGlucHV0IGlzIHJlcXVlc3RlZCwgYnV0IGRlbmllZCwKLSAgIHRoZW4gcmV0dXJuIGEgWl9CVUZfRVJST1IgZnJvbSBpbmZsYXRlQmFjaygpLiAqLwotI2RlZmluZSBQVUxMKCkgXAotICAgIGRvIHsgXAotICAgICAgICBpZiAoaGF2ZSA9PSAwKSB7IFwKLSAgICAgICAgICAgIGhhdmUgPSBpbihpbl9kZXNjLCAmbmV4dCk7IFwKLSAgICAgICAgICAgIGlmIChoYXZlID09IDApIHsgXAotICAgICAgICAgICAgICAgIG5leHQgPSBaX05VTEw7IFwKLSAgICAgICAgICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsgXAotICAgICAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOyBcCi0gICAgICAgICAgICB9IFwKLSAgICAgICAgfSBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogR2V0IGEgYnl0ZSBvZiBpbnB1dCBpbnRvIHRoZSBiaXQgYWNjdW11bGF0b3IsIG9yIHJldHVybiBmcm9tIGluZmxhdGVCYWNrKCkKLSAgIHdpdGggYW4gZXJyb3IgaWYgdGhlcmUgaXMgbm8gaW5wdXQgYXZhaWxhYmxlLiAqLwotI2RlZmluZSBQVUxMQllURSgpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgUFVMTCgpOyBcCi0gICAgICAgIGhhdmUtLTsgXAotICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKSgqbmV4dCsrKSA8PCBiaXRzOyBcCi0gICAgICAgIGJpdHMgKz0gODsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8qIEFzc3VyZSB0aGF0IHRoZXJlIGFyZSBhdCBsZWFzdCBuIGJpdHMgaW4gdGhlIGJpdCBhY2N1bXVsYXRvci4gIElmIHRoZXJlIGlzCi0gICBub3QgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dCB0byBkbyB0aGF0LCB0aGVuIHJldHVybiBmcm9tIGluZmxhdGVCYWNrKCkgd2l0aAotICAgYW4gZXJyb3IuICovCi0jZGVmaW5lIE5FRURCSVRTKG4pIFwKLSAgICBkbyB7IFwKLSAgICAgICAgd2hpbGUgKGJpdHMgPCAodW5zaWduZWQpKG4pKSBcCi0gICAgICAgICAgICBQVUxMQllURSgpOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogUmV0dXJuIHRoZSBsb3cgbiBiaXRzIG9mIHRoZSBiaXQgYWNjdW11bGF0b3IgKG4gPD0gMTYpICovCi0jZGVmaW5lIEJJVFMobikgXAotICAgICgodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgKG4pKSAtIDEpKQotCi0vKiBSZW1vdmUgbiBiaXRzIGZyb20gdGhlIGJpdCBhY2N1bXVsYXRvciAqLwotI2RlZmluZSBEUk9QQklUUyhuKSBcCi0gICAgZG8geyBcCi0gICAgICAgIGhvbGQgPj49IChuKTsgXAotICAgICAgICBiaXRzIC09ICh1bnNpZ25lZCkobik7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBSZW1vdmUgemVybyB0byBzZXZlbiBiaXRzIGFzIG5lZWRlZCB0byBnbyB0byBhIGJ5dGUgYm91bmRhcnkgKi8KLSNkZWZpbmUgQllURUJJVFMoKSBcCi0gICAgZG8geyBcCi0gICAgICAgIGhvbGQgPj49IGJpdHMgJiA3OyBcCi0gICAgICAgIGJpdHMgLT0gYml0cyAmIDc7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBBc3N1cmUgdGhhdCBzb21lIG91dHB1dCBzcGFjZSBpcyBhdmFpbGFibGUsIGJ5IHdyaXRpbmcgb3V0IHRoZSB3aW5kb3cKLSAgIGlmIGl0J3MgZnVsbC4gIElmIHRoZSB3cml0ZSBmYWlscywgcmV0dXJuIGZyb20gaW5mbGF0ZUJhY2soKSB3aXRoIGEKLSAgIFpfQlVGX0VSUk9SLiAqLwotI2RlZmluZSBST09NKCkgXAotICAgIGRvIHsgXAotICAgICAgICBpZiAobGVmdCA9PSAwKSB7IFwKLSAgICAgICAgICAgIHB1dCA9IHdpbmRvdzsgXAotICAgICAgICAgICAgbGVmdCA9IFdTSVpFOyBcCi0gICAgICAgICAgICB3cmFwID0gMTsgXAotICAgICAgICAgICAgaWYgKG91dChvdXRfZGVzYywgcHV0LCAodW5zaWduZWQpbGVmdCkpIHsgXAotICAgICAgICAgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOyBcCi0gICAgICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7IFwKLSAgICAgICAgICAgIH0gXAotICAgICAgICB9IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKgotICAgc3RybSBwcm92aWRlcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGFuZCB3aW5kb3cgYnVmZmVyIG9uIGlucHV0LAotICAgYW5kIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSB1bnVzZWQgaW5wdXQgb24gcmV0dXJuLiAgRm9yIFpfREFUQV9FUlJPUgotICAgcmV0dXJucywgc3RybSB3aWxsIGFsc28gcHJvdmlkZSBhbiBlcnJvciBtZXNzYWdlLgotCi0gICBpbigpIGFuZCBvdXQoKSBhcmUgdGhlIGNhbGwtYmFjayBpbnB1dCBhbmQgb3V0cHV0IGZ1bmN0aW9ucy4gIFdoZW4KLSAgIGluZmxhdGVCYWNrKCkgbmVlZHMgbW9yZSBpbnB1dCwgaXQgY2FsbHMgaW4oKS4gIFdoZW4gaW5mbGF0ZUJhY2soKSBoYXMKLSAgIGZpbGxlZCB0aGUgd2luZG93IHdpdGggb3V0cHV0LCBvciB3aGVuIGl0IGNvbXBsZXRlcyB3aXRoIGRhdGEgaW4gdGhlCi0gICB3aW5kb3csIGl0IGNhbGxzIG91dCgpIHRvIHdyaXRlIG91dCB0aGUgZGF0YS4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IG5vdAotICAgY2hhbmdlIHRoZSBwcm92aWRlZCBpbnB1dCB1bnRpbCBpbigpIGlzIGNhbGxlZCBhZ2FpbiBvciBpbmZsYXRlQmFjaygpCi0gICByZXR1cm5zLiAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IGNoYW5nZSB0aGUgd2luZG93L291dHB1dCBidWZmZXIgdW50aWwKLSAgIGluZmxhdGVCYWNrKCkgcmV0dXJucy4KLQotICAgaW4oKSBhbmQgb3V0KCkgYXJlIGNhbGxlZCB3aXRoIGEgZGVzY3JpcHRvciBwYXJhbWV0ZXIgcHJvdmlkZWQgaW4gdGhlCi0gICBpbmZsYXRlQmFjaygpIGNhbGwuICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBzdHJ1Y3R1cmUgdGhhdCBwcm92aWRlcyB0aGUKLSAgIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGRvIHRoZSByZWFkIG9yIHdyaXRlLCBhcyB3ZWxsIGFzIGFjY3VtdWxhdGVkCi0gICBpbmZvcm1hdGlvbiBvbiB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdWNoIGFzIHRvdGFscyBhbmQgY2hlY2sgdmFsdWVzLgotCi0gICBpbigpIHNob3VsZCByZXR1cm4gemVybyBvbiBmYWlsdXJlLiAgb3V0KCkgc2hvdWxkIHJldHVybiBub24temVybyBvbgotICAgZmFpbHVyZS4gIElmIGVpdGhlciBpbigpIG9yIG91dCgpIGZhaWxzLCB0aGFuIGluZmxhdGVCYWNrKCkgcmV0dXJucyBhCi0gICBaX0JVRl9FUlJPUi4gIHN0cm0tPm5leHRfaW4gY2FuIGJlIGNoZWNrZWQgZm9yIFpfTlVMTCB0byBzZWUgd2hldGhlciBpdAotICAgd2FzIGluKCkgb3Igb3V0KCkgdGhhdCBjYXVzZWQgaW4gdGhlIGVycm9yLiAgT3RoZXJ3aXNlLCAgaW5mbGF0ZUJhY2soKQotICAgcmV0dXJucyBaX1NUUkVBTV9FTkQgb24gc3VjY2VzcywgWl9EQVRBX0VSUk9SIGZvciBhbiBkZWZsYXRlIGZvcm1hdAotICAgZXJyb3IsIG9yIFpfTUVNX0VSUk9SIGlmIGl0IGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzdGF0ZS4KLSAgIGluZmxhdGVCYWNrKCkgY2FuIGFsc28gcmV0dXJuIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCi0gICBhcmUgbm90IGNvcnJlY3QsIGkuZS4gc3RybSBpcyBaX05VTEwgb3IgdGhlIHN0YXRlIHdhcyBub3QgaW5pdGlhbGl6ZWQuCi0gKi8KLWludCBaRVhQT1JUIGluZmxhdGVCYWNrOShzdHJtLCBpbiwgaW5fZGVzYywgb3V0LCBvdXRfZGVzYykKLXpfc3RyZWFtIEZBUiAqc3RybTsKLWluX2Z1bmMgaW47Ci12b2lkIEZBUiAqaW5fZGVzYzsKLW91dF9mdW5jIG91dDsKLXZvaWQgRkFSICpvdXRfZGVzYzsKLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICpuZXh0OyAgICAvKiBuZXh0IGlucHV0ICovCi0gICAgdW5zaWduZWQgY2hhciBGQVIgKnB1dDsgICAgIC8qIG5leHQgb3V0cHV0ICovCi0gICAgdW5zaWduZWQgaGF2ZTsgICAgICAgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCAqLwotICAgIHVuc2lnbmVkIGxvbmcgbGVmdDsgICAgICAgICAvKiBhdmFpbGFibGUgb3V0cHV0ICovCi0gICAgaW5mbGF0ZV9tb2RlIG1vZGU7ICAgICAgICAgIC8qIGN1cnJlbnQgaW5mbGF0ZSBtb2RlICovCi0gICAgaW50IGxhc3RibG9jazsgICAgICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovCi0gICAgaW50IHdyYXA7ICAgICAgICAgICAgICAgICAgIC8qIHRydWUgaWYgdGhlIHdpbmRvdyBoYXMgd3JhcHBlZCAqLwotICAgIHVuc2lnbmVkIGxvbmcgd3JpdGU7ICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi8KLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OyAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi8KLSAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogYml0IGJ1ZmZlciAqLwotICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KLSAgICB1bnNpZ25lZCBleHRyYTsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi8KLSAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsgICAgICAgLyogbGl0ZXJhbCBvciBsZW5ndGggb2YgZGF0YSB0byBjb3B5ICovCi0gICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7ICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqLwotICAgIHVuc2lnbmVkIGxvbmcgY29weTsgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi8KLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZnJvbTsgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBieXRlcyBmcm9tICovCi0gICAgY29kZSBjb25zdCBGQVIgKmxlbmNvZGU7ICAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAqLwotICAgIGNvZGUgY29uc3QgRkFSICpkaXN0Y29kZTsgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKi8KLSAgICB1bnNpZ25lZCBsZW5iaXRzOyAgICAgICAgICAgLyogaW5kZXggYml0cyBmb3IgbGVuY29kZSAqLwotICAgIHVuc2lnbmVkIGRpc3RiaXRzOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqLwotICAgIGNvZGUgaGVyZTsgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovCi0gICAgY29kZSBsYXN0OyAgICAgICAgICAgICAgICAgIC8qIHBhcmVudCB0YWJsZSBlbnRyeSAqLwotICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovCi0gICAgaW50IHJldDsgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlICovCi0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG9yZGVyWzE5XSA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqLwotICAgICAgICB7MTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNX07Ci0jaW5jbHVkZSAiaW5mZml4OS5oIgotCi0gICAgLyogQ2hlY2sgdGhhdCB0aGUgc3RybSBleGlzdHMgYW5kIHRoYXQgdGhlIHN0YXRlIHdhcyBpbml0aWFsaXplZCAqLwotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKLQotICAgIC8qIFJlc2V0IHRoZSBzdGF0ZSAqLwotICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsKLSAgICBtb2RlID0gVFlQRTsKLSAgICBsYXN0YmxvY2sgPSAwOwotICAgIHdyaXRlID0gMDsKLSAgICB3cmFwID0gMDsKLSAgICB3aW5kb3cgPSBzdGF0ZS0+d2luZG93OwotICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOwotICAgIGhhdmUgPSBuZXh0ICE9IFpfTlVMTCA/IHN0cm0tPmF2YWlsX2luIDogMDsKLSAgICBob2xkID0gMDsKLSAgICBiaXRzID0gMDsKLSAgICBwdXQgPSB3aW5kb3c7Ci0gICAgbGVmdCA9IFdTSVpFOwotICAgIGxlbmNvZGUgPSBaX05VTEw7Ci0gICAgZGlzdGNvZGUgPSBaX05VTEw7Ci0KLSAgICAvKiBJbmZsYXRlIHVudGlsIGVuZCBvZiBibG9jayBtYXJrZWQgYXMgbGFzdCAqLwotICAgIGZvciAoOzspCi0gICAgICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICBjYXNlIFRZUEU6Ci0gICAgICAgICAgICAvKiBkZXRlcm1pbmUgYW5kIGRpc3BhdGNoIGJsb2NrIHR5cGUgKi8KLSAgICAgICAgICAgIGlmIChsYXN0YmxvY2spIHsKLSAgICAgICAgICAgICAgICBCWVRFQklUUygpOwotICAgICAgICAgICAgICAgIG1vZGUgPSBET05FOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTkVFREJJVFMoMyk7Ci0gICAgICAgICAgICBsYXN0YmxvY2sgPSBCSVRTKDEpOwotICAgICAgICAgICAgRFJPUEJJVFMoMSk7Ci0gICAgICAgICAgICBzd2l0Y2ggKEJJVFMoMikpIHsKLSAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqLwotICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdGJsb2NrID8gIiAobGFzdCkiIDogIiIpKTsKLSAgICAgICAgICAgICAgICBtb2RlID0gU1RPUkVEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICBsZW5jb2RlID0gbGVuZml4OwotICAgICAgICAgICAgICAgIGxlbmJpdHMgPSA5OwotICAgICAgICAgICAgICAgIGRpc3Rjb2RlID0gZGlzdGZpeDsKLSAgICAgICAgICAgICAgICBkaXN0Yml0cyA9IDU7Ci0gICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RibG9jayA/ICIgKGxhc3QpIiA6ICIiKSk7Ci0gICAgICAgICAgICAgICAgbW9kZSA9IExFTjsgICAgICAgICAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBkeW5hbWljIGNvZGVzIGJsb2NrJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0YmxvY2sgPyAiIChsYXN0KSIgOiAiIikpOwotICAgICAgICAgICAgICAgIG1vZGUgPSBUQUJMRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJsb2NrIHR5cGUiOwotICAgICAgICAgICAgICAgIG1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEUk9QQklUUygyKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1RPUkVEOgotICAgICAgICAgICAgLyogZ2V0IGFuZCB2ZXJpZnkgc3RvcmVkIGJsb2NrIGxlbmd0aCAqLwotICAgICAgICAgICAgQllURUJJVFMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqLwotICAgICAgICAgICAgTkVFREJJVFMoMzIpOwotICAgICAgICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPSAoKGhvbGQgPj4gMTYpIF4gMHhmZmZmKSkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiOwotICAgICAgICAgICAgICAgIG1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsZW5ndGggPSAodW5zaWduZWQpaG9sZCAmIDB4ZmZmZjsKLSAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAlbHVcbiIsCi0gICAgICAgICAgICAgICAgICAgIGxlbmd0aCkpOwotICAgICAgICAgICAgSU5JVEJJVFMoKTsKLQotICAgICAgICAgICAgLyogY29weSBzdG9yZWQgYmxvY2sgZnJvbSBpbnB1dCB0byBvdXRwdXQgKi8KLSAgICAgICAgICAgIHdoaWxlIChsZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgIGNvcHkgPSBsZW5ndGg7Ci0gICAgICAgICAgICAgICAgUFVMTCgpOwotICAgICAgICAgICAgICAgIFJPT00oKTsKLSAgICAgICAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIGNvcHkgPSBoYXZlOwotICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgY29weSA9IGxlZnQ7Ci0gICAgICAgICAgICAgICAgem1lbWNweShwdXQsIG5leHQsIGNvcHkpOwotICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKLSAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7Ci0gICAgICAgICAgICAgICAgbGVmdCAtPSBjb3B5OwotICAgICAgICAgICAgICAgIHB1dCArPSBjb3B5OwotICAgICAgICAgICAgICAgIGxlbmd0aCAtPSBjb3B5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBzdG9yZWQgZW5kXG4iKSk7Ci0gICAgICAgICAgICBtb2RlID0gVFlQRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVEFCTEU6Ci0gICAgICAgICAgICAvKiBnZXQgZHluYW1pYyB0YWJsZSBlbnRyaWVzIGRlc2NyaXB0b3IgKi8KLSAgICAgICAgICAgIE5FRURCSVRTKDE0KTsKLSAgICAgICAgICAgIHN0YXRlLT5ubGVuID0gQklUUyg1KSArIDI1NzsKLSAgICAgICAgICAgIERST1BCSVRTKDUpOwotICAgICAgICAgICAgc3RhdGUtPm5kaXN0ID0gQklUUyg1KSArIDE7Ci0gICAgICAgICAgICBEUk9QQklUUyg1KTsKLSAgICAgICAgICAgIHN0YXRlLT5uY29kZSA9IEJJVFMoNCkgKyA0OwotICAgICAgICAgICAgRFJPUEJJVFMoNCk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPm5sZW4gPiAyODYpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ0b28gbWFueSBsZW5ndGggc3ltYm9scyI7Ci0gICAgICAgICAgICAgICAgbW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcbiIpKTsKLQotICAgICAgICAgICAgLyogZ2V0IGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAobm90IGEgdHlwbykgKi8KLSAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5uY29kZSkgewotICAgICAgICAgICAgICAgIE5FRURCSVRTKDMpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW29yZGVyW3N0YXRlLT5oYXZlKytdXSA9ICh1bnNpZ25lZCBzaG9ydClCSVRTKDMpOwotICAgICAgICAgICAgICAgIERST1BCSVRTKDMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgMTkpCi0gICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbb3JkZXJbc3RhdGUtPmhhdmUrK11dID0gMDsKLSAgICAgICAgICAgIHN0YXRlLT5uZXh0ID0gc3RhdGUtPmNvZGVzOwotICAgICAgICAgICAgbGVuY29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7Ci0gICAgICAgICAgICBsZW5iaXRzID0gNzsKLSAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGU5KENPREVTLCBzdGF0ZS0+bGVucywgMTksICYoc3RhdGUtPm5leHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGxlbmJpdHMpLCBzdGF0ZS0+d29yayk7Ci0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IjsKLSAgICAgICAgICAgICAgICBtb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcbiIpKTsKLQotICAgICAgICAgICAgLyogZ2V0IGxlbmd0aCBhbmQgZGlzdGFuY2UgY29kZSBjb2RlIGxlbmd0aHMgKi8KLSAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7Ci0gICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICBoZXJlID0gbGVuY29kZVtCSVRTKGxlbmJpdHMpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGhlcmUudmFsIDwgMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgTkVFREJJVFMoaGVyZS5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbc3RhdGUtPmhhdmUrK10gPSBoZXJlLnZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoZXJlLnZhbCA9PSAxNikgewotICAgICAgICAgICAgICAgICAgICAgICAgTkVFREJJVFMoaGVyZS5iaXRzICsgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gQkFEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gKHVuc2lnbmVkKShzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSAtIDFdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAzICsgQklUUygyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhlcmUudmFsID09IDE3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyhoZXJlLmJpdHMgKyAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyhoZXJlLmJpdHMgKyA3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDExICsgQklUUyg3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSArIGNvcHkgPiBzdGF0ZS0+bmxlbiArIHN0YXRlLT5uZGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gQkFEOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gKHVuc2lnbmVkIHNob3J0KWxlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi8KLSAgICAgICAgICAgIGlmIChtb2RlID09IEJBRCkgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAoYmV0dGVyIGhhdmUgb25lKSAqLwotICAgICAgICAgICAgaWYgKHN0YXRlLT5sZW5zWzI1Nl0gPT0gMCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayI7Ci0gICAgICAgICAgICAgICAgbW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0cwotICAgICAgICAgICAgICAgdmFsdWVzIGhlcmUgKDkgYW5kIDYpIHdpdGhvdXQgcmVhZGluZyB0aGUgY29tbWVudHMgaW4gaW5mdHJlZTkuaAotICAgICAgICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqLwotICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7Ci0gICAgICAgICAgICBsZW5jb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKLSAgICAgICAgICAgIGxlbmJpdHMgPSA5OwotICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZTkoTEVOUywgc3RhdGUtPmxlbnMsIHN0YXRlLT5ubGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPm5leHQpLCAmKGxlbmJpdHMpLCBzdGF0ZS0+d29yayk7Ci0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0IjsKLSAgICAgICAgICAgICAgICBtb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGlzdGNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOwotICAgICAgICAgICAgZGlzdGJpdHMgPSA2OwotICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZTkoRElTVFMsIHN0YXRlLT5sZW5zICsgc3RhdGUtPm5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm5kaXN0LCAmKHN0YXRlLT5uZXh0KSwgJihkaXN0Yml0cyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPndvcmspOwotICAgICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2VzIHNldCI7Ci0gICAgICAgICAgICAgICAgbW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZXMgb2tcbiIpKTsKLSAgICAgICAgICAgIG1vZGUgPSBMRU47Ci0KLSAgICAgICAgY2FzZSBMRU46Ci0gICAgICAgICAgICAvKiBnZXQgYSBsaXRlcmFsLCBsZW5ndGgsIG9yIGVuZC1vZi1ibG9jayBjb2RlICovCi0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgaGVyZSA9IGxlbmNvZGVbQklUUyhsZW5iaXRzKV07Ci0gICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKLSAgICAgICAgICAgICAgICBQVUxMQllURSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGhlcmUub3AgJiYgKGhlcmUub3AgJiAweGYwKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGFzdCA9IGhlcmU7Ci0gICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICBoZXJlID0gbGVuY29kZVtsYXN0LnZhbCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOwotICAgICAgICAgICAgbGVuZ3RoID0gKHVuc2lnbmVkKWhlcmUudmFsOwotCi0gICAgICAgICAgICAvKiBwcm9jZXNzIGxpdGVyYWwgKi8KLSAgICAgICAgICAgIGlmIChoZXJlLm9wID09IDApIHsKLSAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID8KLSAgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xuIiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxuIiwgaGVyZS52YWwpKTsKLSAgICAgICAgICAgICAgICBST09NKCk7Ci0gICAgICAgICAgICAgICAgKnB1dCsrID0gKHVuc2lnbmVkIGNoYXIpKGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbGVmdC0tOwotICAgICAgICAgICAgICAgIG1vZGUgPSBMRU47Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIHByb2Nlc3MgZW5kIG9mIGJsb2NrICovCi0gICAgICAgICAgICBpZiAoaGVyZS5vcCAmIDMyKSB7Ci0gICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcbiIpKTsKLSAgICAgICAgICAgICAgICBtb2RlID0gVFlQRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlICovCi0gICAgICAgICAgICBpZiAoaGVyZS5vcCAmIDY0KSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKLSAgICAgICAgICAgICAgICBtb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBsZW5ndGggY29kZSAtLSBnZXQgZXh0cmEgYml0cywgaWYgYW55ICovCi0gICAgICAgICAgICBleHRyYSA9ICh1bnNpZ25lZCkoaGVyZS5vcCkgJiAzMTsKLSAgICAgICAgICAgIGlmIChleHRyYSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgTkVFREJJVFMoZXh0cmEpOwotICAgICAgICAgICAgICAgIGxlbmd0aCArPSBCSVRTKGV4dHJhKTsKLSAgICAgICAgICAgICAgICBEUk9QQklUUyhleHRyYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAlbHVcbiIsIGxlbmd0aCkpOwotCi0gICAgICAgICAgICAvKiBnZXQgZGlzdGFuY2UgY29kZSAqLwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIGhlcmUgPSBkaXN0Y29kZVtCSVRTKGRpc3RiaXRzKV07Ci0gICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKLSAgICAgICAgICAgICAgICBQVUxMQllURSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChoZXJlLm9wICYgMHhmMCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGxhc3QgPSBoZXJlOwotICAgICAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGRpc3Rjb2RlW2xhc3QudmFsICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7Ci0gICAgICAgICAgICBpZiAoaGVyZS5vcCAmIDY0KSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKLSAgICAgICAgICAgICAgICBtb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2Zmc2V0ID0gKHVuc2lnbmVkKWhlcmUudmFsOwotCi0gICAgICAgICAgICAvKiBnZXQgZGlzdGFuY2UgZXh0cmEgYml0cywgaWYgYW55ICovCi0gICAgICAgICAgICBleHRyYSA9ICh1bnNpZ25lZCkoaGVyZS5vcCkgJiAxNTsKLSAgICAgICAgICAgIGlmIChleHRyYSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgTkVFREJJVFMoZXh0cmEpOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSBCSVRTKGV4dHJhKTsKLSAgICAgICAgICAgICAgICBEUk9QQklUUyhleHRyYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ID4gV1NJWkUgLSAod3JhcCA/IDA6IGxlZnQpKSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOwotICAgICAgICAgICAgICAgIG1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICVsdVxuIiwgb2Zmc2V0KSk7Ci0KLSAgICAgICAgICAgIC8qIGNvcHkgbWF0Y2ggZnJvbSB3aW5kb3cgdG8gb3V0cHV0ICovCi0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgUk9PTSgpOwotICAgICAgICAgICAgICAgIGNvcHkgPSBXU0laRSAtIG9mZnNldDsKLSAgICAgICAgICAgICAgICBpZiAoY29weSA8IGxlZnQpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHB1dCArIGNvcHk7Ci0gICAgICAgICAgICAgICAgICAgIGNvcHkgPSBsZWZ0IC0gY29weTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyb20gPSBwdXQgLSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvcHkgPSBsZWZ0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29weSA+IGxlbmd0aCkgY29weSA9IGxlbmd0aDsKLSAgICAgICAgICAgICAgICBsZW5ndGggLT0gY29weTsKLSAgICAgICAgICAgICAgICBsZWZ0IC09IGNvcHk7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAqcHV0KysgPSAqZnJvbSsrOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tY29weSk7Ci0gICAgICAgICAgICB9IHdoaWxlIChsZW5ndGggIT0gMCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIERPTkU6Ci0gICAgICAgICAgICAvKiBpbmZsYXRlIHN0cmVhbSB0ZXJtaW5hdGVkIHByb3Blcmx5IC0tIHdyaXRlIGxlZnRvdmVyIG91dHB1dCAqLwotICAgICAgICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EOwotICAgICAgICAgICAgaWYgKGxlZnQgPCBXU0laRSkgewotICAgICAgICAgICAgICAgIGlmIChvdXQob3V0X2Rlc2MsIHdpbmRvdywgKHVuc2lnbmVkKShXU0laRSAtIGxlZnQpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKLQotICAgICAgICBjYXNlIEJBRDoKLSAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOwotCi0gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIC8qIGNhbid0IGhhcHBlbiwgYnV0IG1ha2VzIGNvbXBpbGVycyBoYXBweSAqLwotICAgICAgICAgICAgcmV0ID0gWl9TVFJFQU1fRVJST1I7Ci0gICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKLSAgICAgICAgfQotCi0gICAgLyogUmV0dXJuIHVudXNlZCBpbnB1dCAqLwotICBpbmZfbGVhdmU6Ci0gICAgc3RybS0+bmV4dF9pbiA9IG5leHQ7Ci0gICAgc3RybS0+YXZhaWxfaW4gPSBoYXZlOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVCYWNrOUVuZChzdHJtKQotel9zdHJlYW0gRkFSICpzdHJtOwotewotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgWkZSRUUoc3RybSwgc3RybS0+c3RhdGUpOwotICAgIHN0cm0tPnN0YXRlID0gWl9OVUxMOwotICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogZW5kXG4iKSk7Ci0gICAgcmV0dXJuIFpfT0s7Ci19CmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2luZmJhY2s5L2luZmJhY2s5LmggYi9zcmMvemxpYi9jb250cmliL2luZmJhY2s5L2luZmJhY2s5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNzNjMGEuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9pbmZiYWNrOS9pbmZiYWNrOS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyogaW5mYmFjazkuaCAtLSBoZWFkZXIgZm9yIHVzaW5nIGluZmxhdGVCYWNrOSBmdW5jdGlvbnMKLSAqIENvcHlyaWdodCAoQykgMjAwMyBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyoKLSAqIFRoaXMgaGVhZGVyIGZpbGUgYW5kIGFzc29jaWF0ZWQgcGF0Y2hlcyBwcm92aWRlIGEgZGVjb2RlciBmb3IgUEtXYXJlJ3MKLSAqIHVuZG9jdW1lbnRlZCBkZWZsYXRlNjQgY29tcHJlc3Npb24gbWV0aG9kIChtZXRob2QgOSkuICBVc2Ugd2l0aCBpbmZiYWNrOS5jLAotICogaW5mdHJlZTkuaCwgaW5mdHJlZTkuYywgYW5kIGluZmZpeDkuaC4gIFRoZXNlIHBhdGNoZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gKiBUaGlzIHNob3VsZCBiZSBjb21waWxlZCB3aXRoIHpsaWIsIHNpbmNlIGl0IHVzZXMgenV0aWwuaCBhbmQgenV0aWwuby4KLSAqIFRoaXMgY29kZSBoYXMgbm90IHlldCBiZWVuIHRlc3RlZCBvbiAxNi1iaXQgYXJjaGl0ZWN0dXJlcy4gIFNlZSB0aGUKLSAqIGNvbW1lbnRzIGluIHpsaWIuaCBmb3IgaW5mbGF0ZUJhY2soKSB1c2FnZS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZAotICogaWRlbnRpY2FsbHksIGV4Y2VwdCB0aGF0IHRoZXJlIGlzIG5vIHdpbmRvd0JpdHMgcGFyYW1ldGVyLCBhbmQgYSA2NEsKLSAqIHdpbmRvdyBtdXN0IGJlIHByb3ZpZGVkLiAgQWxzbyBpZiBpbnQncyBhcmUgMTYgYml0cywgdGhlbiBhIHplcm8gZm9yCi0gKiB0aGUgdGhpcmQgcGFyYW1ldGVyIG9mIHRoZSAib3V0IiBmdW5jdGlvbiBhY3R1YWxseSBtZWFucyA2NTUzNlVMLgotICogemxpYi5oIG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlIHRoaXMgaGVhZGVyIGZpbGUuCi0gKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrOSBPRigoel9zdHJlYW0gRkFSICpzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fZnVuYyBpbiwgdm9pZCBGQVIgKmluX2Rlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfZnVuYyBvdXQsIHZvaWQgRkFSICpvdXRfZGVzYykpOwotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFjazlFbmQgT0YoKHpfc3RyZWFtIEZBUiAqc3RybSkpOwotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFjazlJbml0XyBPRigoel9zdHJlYW0gRkFSICpzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX3NpemUpKTsKLSNkZWZpbmUgaW5mbGF0ZUJhY2s5SW5pdChzdHJtLCB3aW5kb3cpIFwKLSAgICAgICAgaW5mbGF0ZUJhY2s5SW5pdF8oKHN0cm0pLCAod2luZG93KSwgXAotICAgICAgICBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2luZmJhY2s5L2luZmZpeDkuaCBiL3NyYy96bGliL2NvbnRyaWIvaW5mYmFjazkvaW5mZml4OS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTU2NzFkLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvaW5mYmFjazkvaW5mZml4OS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLSAgICAvKiBpbmZmaXg5LmggLS0gdGFibGUgZm9yIGRlY29kaW5nIGRlZmxhdGU2NCBmaXhlZCBjb2RlcwotICAgICAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IG1ha2VmaXhlZDkoKS4KLSAgICAgKi8KLQotICAgIC8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuCi0gICAgICAgSXQgaXMgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBsaWJyYXJ5IGFuZCBpcwotICAgICAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KLSAgICAgKi8KLQotICAgIHN0YXRpYyBjb25zdCBjb2RlIGxlbmZpeFs1MTJdID0gewotICAgICAgICB7OTYsNywwfSx7MCw4LDgwfSx7MCw4LDE2fSx7MTMyLDgsMTE1fSx7MTMwLDcsMzF9LHswLDgsMTEyfSwKLSAgICAgICAgezAsOCw0OH0sezAsOSwxOTJ9LHsxMjgsNywxMH0sezAsOCw5Nn0sezAsOCwzMn0sezAsOSwxNjB9LAotICAgICAgICB7MCw4LDB9LHswLDgsMTI4fSx7MCw4LDY0fSx7MCw5LDIyNH0sezEyOCw3LDZ9LHswLDgsODh9LAotICAgICAgICB7MCw4LDI0fSx7MCw5LDE0NH0sezEzMSw3LDU5fSx7MCw4LDEyMH0sezAsOCw1Nn0sezAsOSwyMDh9LAotICAgICAgICB7MTI5LDcsMTd9LHswLDgsMTA0fSx7MCw4LDQwfSx7MCw5LDE3Nn0sezAsOCw4fSx7MCw4LDEzNn0sCi0gICAgICAgIHswLDgsNzJ9LHswLDksMjQwfSx7MTI4LDcsNH0sezAsOCw4NH0sezAsOCwyMH0sezEzMyw4LDIyN30sCi0gICAgICAgIHsxMzEsNyw0M30sezAsOCwxMTZ9LHswLDgsNTJ9LHswLDksMjAwfSx7MTI5LDcsMTN9LHswLDgsMTAwfSwKLSAgICAgICAgezAsOCwzNn0sezAsOSwxNjh9LHswLDgsNH0sezAsOCwxMzJ9LHswLDgsNjh9LHswLDksMjMyfSwKLSAgICAgICAgezEyOCw3LDh9LHswLDgsOTJ9LHswLDgsMjh9LHswLDksMTUyfSx7MTMyLDcsODN9LHswLDgsMTI0fSwKLSAgICAgICAgezAsOCw2MH0sezAsOSwyMTZ9LHsxMzAsNywyM30sezAsOCwxMDh9LHswLDgsNDR9LHswLDksMTg0fSwKLSAgICAgICAgezAsOCwxMn0sezAsOCwxNDB9LHswLDgsNzZ9LHswLDksMjQ4fSx7MTI4LDcsM30sezAsOCw4Mn0sCi0gICAgICAgIHswLDgsMTh9LHsxMzMsOCwxNjN9LHsxMzEsNywzNX0sezAsOCwxMTR9LHswLDgsNTB9LHswLDksMTk2fSwKLSAgICAgICAgezEyOSw3LDExfSx7MCw4LDk4fSx7MCw4LDM0fSx7MCw5LDE2NH0sezAsOCwyfSx7MCw4LDEzMH0sCi0gICAgICAgIHswLDgsNjZ9LHswLDksMjI4fSx7MTI4LDcsN30sezAsOCw5MH0sezAsOCwyNn0sezAsOSwxNDh9LAotICAgICAgICB7MTMyLDcsNjd9LHswLDgsMTIyfSx7MCw4LDU4fSx7MCw5LDIxMn0sezEzMCw3LDE5fSx7MCw4LDEwNn0sCi0gICAgICAgIHswLDgsNDJ9LHswLDksMTgwfSx7MCw4LDEwfSx7MCw4LDEzOH0sezAsOCw3NH0sezAsOSwyNDR9LAotICAgICAgICB7MTI4LDcsNX0sezAsOCw4Nn0sezAsOCwyMn0sezY1LDgsMH0sezEzMSw3LDUxfSx7MCw4LDExOH0sCi0gICAgICAgIHswLDgsNTR9LHswLDksMjA0fSx7MTI5LDcsMTV9LHswLDgsMTAyfSx7MCw4LDM4fSx7MCw5LDE3Mn0sCi0gICAgICAgIHswLDgsNn0sezAsOCwxMzR9LHswLDgsNzB9LHswLDksMjM2fSx7MTI4LDcsOX0sezAsOCw5NH0sCi0gICAgICAgIHswLDgsMzB9LHswLDksMTU2fSx7MTMyLDcsOTl9LHswLDgsMTI2fSx7MCw4LDYyfSx7MCw5LDIyMH0sCi0gICAgICAgIHsxMzAsNywyN30sezAsOCwxMTB9LHswLDgsNDZ9LHswLDksMTg4fSx7MCw4LDE0fSx7MCw4LDE0Mn0sCi0gICAgICAgIHswLDgsNzh9LHswLDksMjUyfSx7OTYsNywwfSx7MCw4LDgxfSx7MCw4LDE3fSx7MTMzLDgsMTMxfSwKLSAgICAgICAgezEzMCw3LDMxfSx7MCw4LDExM30sezAsOCw0OX0sezAsOSwxOTR9LHsxMjgsNywxMH0sezAsOCw5N30sCi0gICAgICAgIHswLDgsMzN9LHswLDksMTYyfSx7MCw4LDF9LHswLDgsMTI5fSx7MCw4LDY1fSx7MCw5LDIyNn0sCi0gICAgICAgIHsxMjgsNyw2fSx7MCw4LDg5fSx7MCw4LDI1fSx7MCw5LDE0Nn0sezEzMSw3LDU5fSx7MCw4LDEyMX0sCi0gICAgICAgIHswLDgsNTd9LHswLDksMjEwfSx7MTI5LDcsMTd9LHswLDgsMTA1fSx7MCw4LDQxfSx7MCw5LDE3OH0sCi0gICAgICAgIHswLDgsOX0sezAsOCwxMzd9LHswLDgsNzN9LHswLDksMjQyfSx7MTI4LDcsNH0sezAsOCw4NX0sCi0gICAgICAgIHswLDgsMjF9LHsxNDQsOCwzfSx7MTMxLDcsNDN9LHswLDgsMTE3fSx7MCw4LDUzfSx7MCw5LDIwMn0sCi0gICAgICAgIHsxMjksNywxM30sezAsOCwxMDF9LHswLDgsMzd9LHswLDksMTcwfSx7MCw4LDV9LHswLDgsMTMzfSwKLSAgICAgICAgezAsOCw2OX0sezAsOSwyMzR9LHsxMjgsNyw4fSx7MCw4LDkzfSx7MCw4LDI5fSx7MCw5LDE1NH0sCi0gICAgICAgIHsxMzIsNyw4M30sezAsOCwxMjV9LHswLDgsNjF9LHswLDksMjE4fSx7MTMwLDcsMjN9LHswLDgsMTA5fSwKLSAgICAgICAgezAsOCw0NX0sezAsOSwxODZ9LHswLDgsMTN9LHswLDgsMTQxfSx7MCw4LDc3fSx7MCw5LDI1MH0sCi0gICAgICAgIHsxMjgsNywzfSx7MCw4LDgzfSx7MCw4LDE5fSx7MTMzLDgsMTk1fSx7MTMxLDcsMzV9LHswLDgsMTE1fSwKLSAgICAgICAgezAsOCw1MX0sezAsOSwxOTh9LHsxMjksNywxMX0sezAsOCw5OX0sezAsOCwzNX0sezAsOSwxNjZ9LAotICAgICAgICB7MCw4LDN9LHswLDgsMTMxfSx7MCw4LDY3fSx7MCw5LDIzMH0sezEyOCw3LDd9LHswLDgsOTF9LAotICAgICAgICB7MCw4LDI3fSx7MCw5LDE1MH0sezEzMiw3LDY3fSx7MCw4LDEyM30sezAsOCw1OX0sezAsOSwyMTR9LAotICAgICAgICB7MTMwLDcsMTl9LHswLDgsMTA3fSx7MCw4LDQzfSx7MCw5LDE4Mn0sezAsOCwxMX0sezAsOCwxMzl9LAotICAgICAgICB7MCw4LDc1fSx7MCw5LDI0Nn0sezEyOCw3LDV9LHswLDgsODd9LHswLDgsMjN9LHs3Nyw4LDB9LAotICAgICAgICB7MTMxLDcsNTF9LHswLDgsMTE5fSx7MCw4LDU1fSx7MCw5LDIwNn0sezEyOSw3LDE1fSx7MCw4LDEwM30sCi0gICAgICAgIHswLDgsMzl9LHswLDksMTc0fSx7MCw4LDd9LHswLDgsMTM1fSx7MCw4LDcxfSx7MCw5LDIzOH0sCi0gICAgICAgIHsxMjgsNyw5fSx7MCw4LDk1fSx7MCw4LDMxfSx7MCw5LDE1OH0sezEzMiw3LDk5fSx7MCw4LDEyN30sCi0gICAgICAgIHswLDgsNjN9LHswLDksMjIyfSx7MTMwLDcsMjd9LHswLDgsMTExfSx7MCw4LDQ3fSx7MCw5LDE5MH0sCi0gICAgICAgIHswLDgsMTV9LHswLDgsMTQzfSx7MCw4LDc5fSx7MCw5LDI1NH0sezk2LDcsMH0sezAsOCw4MH0sCi0gICAgICAgIHswLDgsMTZ9LHsxMzIsOCwxMTV9LHsxMzAsNywzMX0sezAsOCwxMTJ9LHswLDgsNDh9LHswLDksMTkzfSwKLSAgICAgICAgezEyOCw3LDEwfSx7MCw4LDk2fSx7MCw4LDMyfSx7MCw5LDE2MX0sezAsOCwwfSx7MCw4LDEyOH0sCi0gICAgICAgIHswLDgsNjR9LHswLDksMjI1fSx7MTI4LDcsNn0sezAsOCw4OH0sezAsOCwyNH0sezAsOSwxNDV9LAotICAgICAgICB7MTMxLDcsNTl9LHswLDgsMTIwfSx7MCw4LDU2fSx7MCw5LDIwOX0sezEyOSw3LDE3fSx7MCw4LDEwNH0sCi0gICAgICAgIHswLDgsNDB9LHswLDksMTc3fSx7MCw4LDh9LHswLDgsMTM2fSx7MCw4LDcyfSx7MCw5LDI0MX0sCi0gICAgICAgIHsxMjgsNyw0fSx7MCw4LDg0fSx7MCw4LDIwfSx7MTMzLDgsMjI3fSx7MTMxLDcsNDN9LHswLDgsMTE2fSwKLSAgICAgICAgezAsOCw1Mn0sezAsOSwyMDF9LHsxMjksNywxM30sezAsOCwxMDB9LHswLDgsMzZ9LHswLDksMTY5fSwKLSAgICAgICAgezAsOCw0fSx7MCw4LDEzMn0sezAsOCw2OH0sezAsOSwyMzN9LHsxMjgsNyw4fSx7MCw4LDkyfSwKLSAgICAgICAgezAsOCwyOH0sezAsOSwxNTN9LHsxMzIsNyw4M30sezAsOCwxMjR9LHswLDgsNjB9LHswLDksMjE3fSwKLSAgICAgICAgezEzMCw3LDIzfSx7MCw4LDEwOH0sezAsOCw0NH0sezAsOSwxODV9LHswLDgsMTJ9LHswLDgsMTQwfSwKLSAgICAgICAgezAsOCw3Nn0sezAsOSwyNDl9LHsxMjgsNywzfSx7MCw4LDgyfSx7MCw4LDE4fSx7MTMzLDgsMTYzfSwKLSAgICAgICAgezEzMSw3LDM1fSx7MCw4LDExNH0sezAsOCw1MH0sezAsOSwxOTd9LHsxMjksNywxMX0sezAsOCw5OH0sCi0gICAgICAgIHswLDgsMzR9LHswLDksMTY1fSx7MCw4LDJ9LHswLDgsMTMwfSx7MCw4LDY2fSx7MCw5LDIyOX0sCi0gICAgICAgIHsxMjgsNyw3fSx7MCw4LDkwfSx7MCw4LDI2fSx7MCw5LDE0OX0sezEzMiw3LDY3fSx7MCw4LDEyMn0sCi0gICAgICAgIHswLDgsNTh9LHswLDksMjEzfSx7MTMwLDcsMTl9LHswLDgsMTA2fSx7MCw4LDQyfSx7MCw5LDE4MX0sCi0gICAgICAgIHswLDgsMTB9LHswLDgsMTM4fSx7MCw4LDc0fSx7MCw5LDI0NX0sezEyOCw3LDV9LHswLDgsODZ9LAotICAgICAgICB7MCw4LDIyfSx7NjUsOCwwfSx7MTMxLDcsNTF9LHswLDgsMTE4fSx7MCw4LDU0fSx7MCw5LDIwNX0sCi0gICAgICAgIHsxMjksNywxNX0sezAsOCwxMDJ9LHswLDgsMzh9LHswLDksMTczfSx7MCw4LDZ9LHswLDgsMTM0fSwKLSAgICAgICAgezAsOCw3MH0sezAsOSwyMzd9LHsxMjgsNyw5fSx7MCw4LDk0fSx7MCw4LDMwfSx7MCw5LDE1N30sCi0gICAgICAgIHsxMzIsNyw5OX0sezAsOCwxMjZ9LHswLDgsNjJ9LHswLDksMjIxfSx7MTMwLDcsMjd9LHswLDgsMTEwfSwKLSAgICAgICAgezAsOCw0Nn0sezAsOSwxODl9LHswLDgsMTR9LHswLDgsMTQyfSx7MCw4LDc4fSx7MCw5LDI1M30sCi0gICAgICAgIHs5Niw3LDB9LHswLDgsODF9LHswLDgsMTd9LHsxMzMsOCwxMzF9LHsxMzAsNywzMX0sezAsOCwxMTN9LAotICAgICAgICB7MCw4LDQ5fSx7MCw5LDE5NX0sezEyOCw3LDEwfSx7MCw4LDk3fSx7MCw4LDMzfSx7MCw5LDE2M30sCi0gICAgICAgIHswLDgsMX0sezAsOCwxMjl9LHswLDgsNjV9LHswLDksMjI3fSx7MTI4LDcsNn0sezAsOCw4OX0sCi0gICAgICAgIHswLDgsMjV9LHswLDksMTQ3fSx7MTMxLDcsNTl9LHswLDgsMTIxfSx7MCw4LDU3fSx7MCw5LDIxMX0sCi0gICAgICAgIHsxMjksNywxN30sezAsOCwxMDV9LHswLDgsNDF9LHswLDksMTc5fSx7MCw4LDl9LHswLDgsMTM3fSwKLSAgICAgICAgezAsOCw3M30sezAsOSwyNDN9LHsxMjgsNyw0fSx7MCw4LDg1fSx7MCw4LDIxfSx7MTQ0LDgsM30sCi0gICAgICAgIHsxMzEsNyw0M30sezAsOCwxMTd9LHswLDgsNTN9LHswLDksMjAzfSx7MTI5LDcsMTN9LHswLDgsMTAxfSwKLSAgICAgICAgezAsOCwzN30sezAsOSwxNzF9LHswLDgsNX0sezAsOCwxMzN9LHswLDgsNjl9LHswLDksMjM1fSwKLSAgICAgICAgezEyOCw3LDh9LHswLDgsOTN9LHswLDgsMjl9LHswLDksMTU1fSx7MTMyLDcsODN9LHswLDgsMTI1fSwKLSAgICAgICAgezAsOCw2MX0sezAsOSwyMTl9LHsxMzAsNywyM30sezAsOCwxMDl9LHswLDgsNDV9LHswLDksMTg3fSwKLSAgICAgICAgezAsOCwxM30sezAsOCwxNDF9LHswLDgsNzd9LHswLDksMjUxfSx7MTI4LDcsM30sezAsOCw4M30sCi0gICAgICAgIHswLDgsMTl9LHsxMzMsOCwxOTV9LHsxMzEsNywzNX0sezAsOCwxMTV9LHswLDgsNTF9LHswLDksMTk5fSwKLSAgICAgICAgezEyOSw3LDExfSx7MCw4LDk5fSx7MCw4LDM1fSx7MCw5LDE2N30sezAsOCwzfSx7MCw4LDEzMX0sCi0gICAgICAgIHswLDgsNjd9LHswLDksMjMxfSx7MTI4LDcsN30sezAsOCw5MX0sezAsOCwyN30sezAsOSwxNTF9LAotICAgICAgICB7MTMyLDcsNjd9LHswLDgsMTIzfSx7MCw4LDU5fSx7MCw5LDIxNX0sezEzMCw3LDE5fSx7MCw4LDEwN30sCi0gICAgICAgIHswLDgsNDN9LHswLDksMTgzfSx7MCw4LDExfSx7MCw4LDEzOX0sezAsOCw3NX0sezAsOSwyNDd9LAotICAgICAgICB7MTI4LDcsNX0sezAsOCw4N30sezAsOCwyM30sezc3LDgsMH0sezEzMSw3LDUxfSx7MCw4LDExOX0sCi0gICAgICAgIHswLDgsNTV9LHswLDksMjA3fSx7MTI5LDcsMTV9LHswLDgsMTAzfSx7MCw4LDM5fSx7MCw5LDE3NX0sCi0gICAgICAgIHswLDgsN30sezAsOCwxMzV9LHswLDgsNzF9LHswLDksMjM5fSx7MTI4LDcsOX0sezAsOCw5NX0sCi0gICAgICAgIHswLDgsMzF9LHswLDksMTU5fSx7MTMyLDcsOTl9LHswLDgsMTI3fSx7MCw4LDYzfSx7MCw5LDIyM30sCi0gICAgICAgIHsxMzAsNywyN30sezAsOCwxMTF9LHswLDgsNDd9LHswLDksMTkxfSx7MCw4LDE1fSx7MCw4LDE0M30sCi0gICAgICAgIHswLDgsNzl9LHswLDksMjU1fQotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgY29kZSBkaXN0Zml4WzMyXSA9IHsKLSAgICAgICAgezEyOCw1LDF9LHsxMzUsNSwyNTd9LHsxMzEsNSwxN30sezEzOSw1LDQwOTd9LHsxMjksNSw1fSwKLSAgICAgICAgezEzNyw1LDEwMjV9LHsxMzMsNSw2NX0sezE0MSw1LDE2Mzg1fSx7MTI4LDUsM30sezEzNiw1LDUxM30sCi0gICAgICAgIHsxMzIsNSwzM30sezE0MCw1LDgxOTN9LHsxMzAsNSw5fSx7MTM4LDUsMjA0OX0sezEzNCw1LDEyOX0sCi0gICAgICAgIHsxNDIsNSwzMjc2OX0sezEyOCw1LDJ9LHsxMzUsNSwzODV9LHsxMzEsNSwyNX0sezEzOSw1LDYxNDV9LAotICAgICAgICB7MTI5LDUsN30sezEzNyw1LDE1Mzd9LHsxMzMsNSw5N30sezE0MSw1LDI0NTc3fSx7MTI4LDUsNH0sCi0gICAgICAgIHsxMzYsNSw3Njl9LHsxMzIsNSw0OX0sezE0MCw1LDEyMjg5fSx7MTMwLDUsMTN9LHsxMzgsNSwzMDczfSwKLSAgICAgICAgezEzNCw1LDE5M30sezE0Miw1LDQ5MTUzfQotICAgIH07CmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2luZmJhY2s5L2luZmxhdGU5LmggYi9zcmMvemxpYi9jb250cmliL2luZmJhY2s5L2luZmxhdGU5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlOWE3OTMuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9pbmZiYWNrOS9pbmZsYXRlOS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyogaW5mbGF0ZTkuaCAtLSBpbnRlcm5hbCBpbmZsYXRlIHN0YXRlIGRlZmluaXRpb24KLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcwotICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCi0gICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCi0gKi8KLQotLyogUG9zc2libGUgaW5mbGF0ZSBtb2RlcyBiZXR3ZWVuIGluZmxhdGUoKSBjYWxscyAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgVFlQRSwgICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqLwotICAgICAgICBTVE9SRUQsICAgICAvKiBpOiB3YWl0aW5nIGZvciBzdG9yZWQgc2l6ZSAobGVuZ3RoIGFuZCBjb21wbGVtZW50KSAqLwotICAgICAgICBUQUJMRSwgICAgICAvKiBpOiB3YWl0aW5nIGZvciBkeW5hbWljIGJsb2NrIHRhYmxlIGxlbmd0aHMgKi8KLSAgICAgICAgICAgIExFTiwgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgY29kZSAqLwotICAgIERPTkUsICAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCi0gICAgQkFEICAgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqLwotfSBpbmZsYXRlX21vZGU7Ci0KLS8qCi0gICAgU3RhdGUgdHJhbnNpdGlvbnMgYmV0d2VlbiBhYm92ZSBtb2RlcyAtCi0KLSAgICAobW9zdCBtb2RlcyBjYW4gZ28gdG8gdGhlIEJBRCBtb2RlIC0tIG5vdCBzaG93biBmb3IgY2xhcml0eSkKLQotICAgIFJlYWQgZGVmbGF0ZSBibG9ja3M6Ci0gICAgICAgICAgICBUWVBFIC0+IFNUT1JFRCBvciBUQUJMRSBvciBMRU4gb3IgRE9ORQotICAgICAgICAgICAgU1RPUkVEIC0+IFRZUEUKLSAgICAgICAgICAgIFRBQkxFIC0+IExFTkxFTlMgLT4gQ09ERUxFTlMgLT4gTEVOCi0gICAgUmVhZCBkZWZsYXRlIGNvZGVzOgotICAgICAgICAgICAgICAgIExFTiAtPiBMRU4gb3IgVFlQRQotICovCi0KLS8qIHN0YXRlIG1haW50YWluZWQgYmV0d2VlbiBpbmZsYXRlKCkgY2FsbHMuICBBcHByb3hpbWF0ZWx5IDdLIGJ5dGVzLiAqLwotc3RydWN0IGluZmxhdGVfc3RhdGUgewotICAgICAgICAvKiBzbGlkaW5nIHdpbmRvdyAqLwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7ICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIG5lZWRlZCAqLwotICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGJ1aWxkaW5nICovCi0gICAgdW5zaWduZWQgbmNvZGU7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KLSAgICB1bnNpZ25lZCBubGVuOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KLSAgICB1bnNpZ25lZCBuZGlzdDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqLwotICAgIHVuc2lnbmVkIGhhdmU7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqLwotICAgIGNvZGUgRkFSICpuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiBjb2Rlc1tdICovCi0gICAgdW5zaWduZWQgc2hvcnQgbGVuc1szMjBdOyAgIC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb2RlIGxlbmd0aHMgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB3b3JrWzI4OF07ICAgLyogd29yayBhcmVhIGZvciBjb2RlIHRhYmxlIGJ1aWxkaW5nICovCi0gICAgY29kZSBjb2Rlc1tFTk9VR0hdOyAgICAgICAgIC8qIHNwYWNlIGZvciBjb2RlIHRhYmxlcyAqLwotfTsKZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvaW5mYmFjazkvaW5mdHJlZTkuYyBiL3NyYy96bGliL2NvbnRyaWIvaW5mYmFjazkvaW5mdHJlZTkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwYjMyOC4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL2luZmJhY2s5L2luZnRyZWU5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyogaW5mdHJlZTkuYyAtLSBnZW5lcmF0ZSBIdWZmbWFuIHRyZWVzIGZvciBlZmZpY2llbnQgZGVjb2RpbmcKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEyIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0jaW5jbHVkZSAienV0aWwuaCIKLSNpbmNsdWRlICJpbmZ0cmVlOS5oIgotCi0jZGVmaW5lIE1BWEJJVFMgMTUKLQotY29uc3QgY2hhciBpbmZsYXRlOV9jb3B5cmlnaHRbXSA9Ci0gICAiIGluZmxhdGU5IDEuMi43IENvcHlyaWdodCAxOTk1LTIwMTIgTWFyayBBZGxlciAiOwotLyoKLSAgSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaXMgd2VsY29tZQotICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIHByb2R1Y3QuIElmIGZvciBzb21lIHJlYXNvbiB5b3UgY2Fubm90Ci0gIGluY2x1ZGUgc3VjaCBhbiBhY2tub3dsZWRnbWVudCwgSSB3b3VsZCBhcHByZWNpYXRlIHRoYXQgeW91IGtlZXAgdGhpcwotICBjb3B5cmlnaHQgc3RyaW5nIGluIHRoZSBleGVjdXRhYmxlIG9mIHlvdXIgcHJvZHVjdC4KLSAqLwotCi0vKgotICAgQnVpbGQgYSBzZXQgb2YgdGFibGVzIHRvIGRlY29kZSB0aGUgcHJvdmlkZWQgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4KLSAgIFRoZSBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBUaGUgcmVzdWx0IHN0YXJ0cyBhdCAqdGFibGUsCi0gICB3aG9zZSBpbmRpY2VzIGFyZSAwLi4yXmJpdHMtMS4gIHdvcmsgaXMgYSB3cml0YWJsZSBhcnJheSBvZiBhdCBsZWFzdAotICAgbGVucyBzaG9ydHMsIHdoaWNoIGlzIHVzZWQgYXMgYSB3b3JrIGFyZWEuICB0eXBlIGlzIHRoZSB0eXBlIG9mIGNvZGUKLSAgIHRvIGJlIGdlbmVyYXRlZCwgQ09ERVMsIExFTlMsIG9yIERJU1RTLiAgT24gcmV0dXJuLCB6ZXJvIGlzIHN1Y2Nlc3MsCi0gICAtMSBpcyBhbiBpbnZhbGlkIGNvZGUsIGFuZCArMSBtZWFucyB0aGF0IEVOT1VHSCBpc24ndCBlbm91Z2guICB0YWJsZQotICAgb24gcmV0dXJuIHBvaW50cyB0byB0aGUgbmV4dCBhdmFpbGFibGUgZW50cnkncyBhZGRyZXNzLiAgYml0cyBpcyB0aGUKLSAgIHJlcXVlc3RlZCByb290IHRhYmxlIGluZGV4IGJpdHMsIGFuZCBvbiByZXR1cm4gaXQgaXMgdGhlIGFjdHVhbCByb290Ci0gICB0YWJsZSBpbmRleCBiaXRzLiAgSXQgd2lsbCBkaWZmZXIgaWYgdGhlIHJlcXVlc3QgaXMgZ3JlYXRlciB0aGFuIHRoZQotICAgbG9uZ2VzdCBjb2RlIG9yIGlmIGl0IGlzIGxlc3MgdGhhbiB0aGUgc2hvcnRlc3QgY29kZS4KLSAqLwotaW50IGluZmxhdGVfdGFibGU5KHR5cGUsIGxlbnMsIGNvZGVzLCB0YWJsZSwgYml0cywgd29yaykKLWNvZGV0eXBlIHR5cGU7Ci11bnNpZ25lZCBzaG9ydCBGQVIgKmxlbnM7Ci11bnNpZ25lZCBjb2RlczsKLWNvZGUgRkFSICogRkFSICp0YWJsZTsKLXVuc2lnbmVkIEZBUiAqYml0czsKLXVuc2lnbmVkIHNob3J0IEZBUiAqd29yazsKLXsKLSAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogYSBjb2RlJ3MgbGVuZ3RoIGluIGJpdHMgKi8KLSAgICB1bnNpZ25lZCBzeW07ICAgICAgICAgICAgICAgLyogaW5kZXggb2YgY29kZSBzeW1ib2xzICovCi0gICAgdW5zaWduZWQgbWluLCBtYXg7ICAgICAgICAgIC8qIG1pbmltdW0gYW5kIG1heGltdW0gY29kZSBsZW5ndGhzICovCi0gICAgdW5zaWduZWQgcm9vdDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciByb290IHRhYmxlICovCi0gICAgdW5zaWduZWQgY3VycjsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciBjdXJyZW50IHRhYmxlICovCi0gICAgdW5zaWduZWQgZHJvcDsgICAgICAgICAgICAgIC8qIGNvZGUgYml0cyB0byBkcm9wIGZvciBzdWItdGFibGUgKi8KLSAgICBpbnQgbGVmdDsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHByZWZpeCBjb2RlcyBhdmFpbGFibGUgKi8KLSAgICB1bnNpZ25lZCB1c2VkOyAgICAgICAgICAgICAgLyogY29kZSBlbnRyaWVzIGluIHRhYmxlIHVzZWQgKi8KLSAgICB1bnNpZ25lZCBodWZmOyAgICAgICAgICAgICAgLyogSHVmZm1hbiBjb2RlICovCi0gICAgdW5zaWduZWQgaW5jcjsgICAgICAgICAgICAgIC8qIGZvciBpbmNyZW1lbnRpbmcgY29kZSwgaW5kZXggKi8KLSAgICB1bnNpZ25lZCBmaWxsOyAgICAgICAgICAgICAgLyogaW5kZXggZm9yIHJlcGxpY2F0aW5nIGVudHJpZXMgKi8KLSAgICB1bnNpZ25lZCBsb3c7ICAgICAgICAgICAgICAgLyogbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeSAqLwotICAgIHVuc2lnbmVkIG1hc2s7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsb3cgcm9vdCBiaXRzICovCi0gICAgY29kZSB0aGlzOyAgICAgICAgICAgICAgICAgIC8qIHRhYmxlIGVudHJ5IGZvciBkdXBsaWNhdGlvbiAqLwotICAgIGNvZGUgRkFSICpuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiB0YWJsZSAqLwotICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IEZBUiAqYmFzZTsgICAgIC8qIGJhc2UgdmFsdWUgdGFibGUgdG8gdXNlICovCi0gICAgY29uc3QgdW5zaWduZWQgc2hvcnQgRkFSICpleHRyYTsgICAgLyogZXh0cmEgYml0cyB0YWJsZSB0byB1c2UgKi8KLSAgICBpbnQgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGJhc2UgYW5kIGV4dHJhIGZvciBzeW1ib2wgPiBlbmQgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCBjb3VudFtNQVhCSVRTKzFdOyAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi8KLSAgICB1bnNpZ25lZCBzaG9ydCBvZmZzW01BWEJJVFMrMV07ICAgICAvKiBvZmZzZXRzIGluIHRhYmxlIGZvciBlYWNoIGxlbmd0aCAqLwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBsYmFzZVszMV0gPSB7IC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBiYXNlICovCi0gICAgICAgIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywKLSAgICAgICAgMTksIDIzLCAyNywgMzEsIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsCi0gICAgICAgIDEzMSwgMTYzLCAxOTUsIDIyNywgMywgMCwgMH07Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGxleHRbMzFdID0geyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgZXh0cmEgKi8KLSAgICAgICAgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOSwgMTI5LCAxMjksIDEyOSwKLSAgICAgICAgMTMwLCAxMzAsIDEzMCwgMTMwLCAxMzEsIDEzMSwgMTMxLCAxMzEsIDEzMiwgMTMyLCAxMzIsIDEzMiwKLSAgICAgICAgMTMzLCAxMzMsIDEzMywgMTMzLCAxNDQsIDc4LCA2OH07Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRiYXNlWzMyXSA9IHsgLyogRGlzdGFuY2UgY29kZXMgMC4uMzEgYmFzZSAqLwotICAgICAgICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksCi0gICAgICAgIDY1LCA5NywgMTI5LCAxOTMsIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywKLSAgICAgICAgNDA5NywgNjE0NSwgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3NywgMzI3NjksIDQ5MTUzfTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgZGV4dFszMl0gPSB7IC8qIERpc3RhbmNlIGNvZGVzIDAuLjMxIGV4dHJhICovCi0gICAgICAgIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI5LCAxMjksIDEzMCwgMTMwLCAxMzEsIDEzMSwgMTMyLCAxMzIsCi0gICAgICAgIDEzMywgMTMzLCAxMzQsIDEzNCwgMTM1LCAxMzUsIDEzNiwgMTM2LCAxMzcsIDEzNywgMTM4LCAxMzgsCi0gICAgICAgIDEzOSwgMTM5LCAxNDAsIDE0MCwgMTQxLCAxNDEsIDE0MiwgMTQyfTsKLQotICAgIC8qCi0gICAgICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZQotICAgICAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZQotICAgICAgIHN5bWJvbHMgMC4uY29kZXMtMS4gIFRoZSBIdWZmbWFuIGNvZGUgaXMgZ2VuZXJhdGVkIGJ5IGZpcnN0IHNvcnRpbmcgdGhlCi0gICAgICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXIKLSAgICAgICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzCi0gICAgICAgZm9yIHRoZSBmaXJzdCBjb2RlIG9mIHRoZSBzaG9ydGVzdCBsZW5ndGgsIGFuZCB0aGUgY29kZXMgYXJlIGludGVnZXIKLSAgICAgICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aAotICAgICAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHMKLSAgICAgICBmcm9tIHRoZWlyIG1vcmUgbmF0dXJhbCBpbnRlZ2VyIGluY3JlbWVudCBvcmRlcmluZywgYW5kIHNvIHdoZW4gdGhlCi0gICAgICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXMKLSAgICAgICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLgotCi0gICAgICAgVGhpcyByb3V0aW5lIGFzc3VtZXMsIGJ1dCBkb2VzIG5vdCBjaGVjaywgdGhhdCBhbGwgb2YgdGhlIGVudHJpZXMgaW4KLSAgICAgICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLgotICAgICAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0Ci0gICAgICAgc3ltYm9sIGRvZXMgbm90IG9jY3VyIGluIHRoaXMgY29kZS4KLQotICAgICAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCwKLSAgICAgICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGUKLSAgICAgICBzb3J0ZWQgdGFibGUsIGFuZCB0aGVuIGVudGVyaW5nIHRoZSBzeW1ib2xzIGluIG9yZGVyIGluIHRoZSBzb3J0ZWQKLSAgICAgICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnkKLSAgICAgICB0aGUgY2FsbGVyLgotCi0gICAgICAgVGhlIGxlbmd0aCBjb3VudHMgYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzIGFzIHdlbGwsIGkuZS4gZmluZGluZwotICAgICAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueQotICAgICAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkCi0gICAgICAgYXQgbGVuZ3RoIGNvdW50cyB0byBkZXRlcm1pbmUgc3ViLXRhYmxlIHNpemVzIHdoZW4gYnVpbGRpbmcgdGhlCi0gICAgICAgZGVjb2RpbmcgdGFibGVzLgotICAgICAqLwotCi0gICAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovCi0gICAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspCi0gICAgICAgIGNvdW50W2xlbl0gPSAwOwotICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKQotICAgICAgICBjb3VudFtsZW5zW3N5bV1dKys7Ci0KLSAgICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqLwotICAgIHJvb3QgPSAqYml0czsKLSAgICBmb3IgKG1heCA9IE1BWEJJVFM7IG1heCA+PSAxOyBtYXgtLSkKLSAgICAgICAgaWYgKGNvdW50W21heF0gIT0gMCkgYnJlYWs7Ci0gICAgaWYgKHJvb3QgPiBtYXgpIHJvb3QgPSBtYXg7Ci0gICAgaWYgKG1heCA9PSAwKSByZXR1cm4gLTE7ICAgICAgICAgICAgLyogbm8gY29kZXMhICovCi0gICAgZm9yIChtaW4gPSAxOyBtaW4gPD0gTUFYQklUUzsgbWluKyspCi0gICAgICAgIGlmIChjb3VudFttaW5dICE9IDApIGJyZWFrOwotICAgIGlmIChyb290IDwgbWluKSByb290ID0gbWluOwotCi0gICAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovCi0gICAgbGVmdCA9IDE7Ci0gICAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHsKLSAgICAgICAgbGVmdCA8PD0gMTsKLSAgICAgICAgbGVmdCAtPSBjb3VudFtsZW5dOwotICAgICAgICBpZiAobGVmdCA8IDApIHJldHVybiAtMTsgICAgICAgIC8qIG92ZXItc3Vic2NyaWJlZCAqLwotICAgIH0KLSAgICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT0gQ09ERVMgfHwgbWF4ICE9IDEpKQotICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovCi0KLSAgICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqLwotICAgIG9mZnNbMV0gPSAwOwotICAgIGZvciAobGVuID0gMTsgbGVuIDwgTUFYQklUUzsgbGVuKyspCi0gICAgICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dOwotCi0gICAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqLwotICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKQotICAgICAgICBpZiAobGVuc1tzeW1dICE9IDApIHdvcmtbb2Zmc1tsZW5zW3N5bV1dKytdID0gKHVuc2lnbmVkIHNob3J0KXN5bTsKLQotICAgIC8qCi0gICAgICAgQ3JlYXRlIGFuZCBmaWxsIGluIGRlY29kaW5nIHRhYmxlcy4gIEluIHRoaXMgbG9vcCwgdGhlIHRhYmxlIGJlaW5nCi0gICAgICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmYKLSAgICAgICB3aXRoIGxlbmd0aCBsZW4uICBUaGF0IGNvZGUgaXMgY29udmVydGVkIHRvIGFuIGluZGV4IGJ5IGRyb3BwaW5nIGRyb3AKLSAgICAgICBiaXRzIG9mZiBvZiB0aGUgYm90dG9tLiAgRm9yIGNvZGVzIHdoZXJlIGxlbiBpcyBsZXNzIHRoYW4gZHJvcCArIGN1cnIsCi0gICAgICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0bwotICAgICAgIGZpbGwgdGhlIHRhYmxlIHdpdGggcmVwbGljYXRlZCBlbnRyaWVzLgotCi0gICAgICAgcm9vdCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHRoZSByb290IHRhYmxlLiAgV2hlbiBsZW4gZXhjZWVkcwotICAgICAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4Ci0gICAgICAgb2YgdGhlIGxvdyByb290IGJpdHMgb2YgaHVmZi4gIFRoaXMgaXMgc2F2ZWQgaW4gbG93IHRvIGNoZWNrIGZvciB3aGVuIGEKLSAgICAgICBuZXcgc3ViLXRhYmxlIHNob3VsZCBiZSBzdGFydGVkLiAgZHJvcCBpcyB6ZXJvIHdoZW4gdGhlIHJvb3QgdGFibGUgaXMKLSAgICAgICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuCi0KLSAgICAgICBXaGVuIGEgbmV3IHN1Yi10YWJsZSBpcyBuZWVkZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byBsb29rIGFoZWFkIGluIHRoZQotICAgICAgIGNvZGUgbGVuZ3RocyB0byBkZXRlcm1pbmUgd2hhdCBzaXplIHN1Yi10YWJsZSBpcyBuZWVkZWQuICBUaGUgbGVuZ3RoCi0gICAgICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmUKLSAgICAgICBlbnRlcmVkIGluIHRoZSB0YWJsZXMuCi0KLSAgICAgICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZQotICAgICAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3QKLSAgICAgICB0aGUgY29uc3RhbnRzIEVOT1VHSF9MRU5TIGFuZCBFTk9VR0hfRElTVFMgdG8gZ3VhcmQgYWdhaW5zdCBjaGFuZ2VzIGluCi0gICAgICAgdGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplIGNvbnN0YW50cy4gIFNlZSB0aGUgY29tbWVudHMgaW4gaW5mdHJlZTkuaAotICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0gICAgICAgc3ltIGluY3JlbWVudHMgdGhyb3VnaCBhbGwgc3ltYm9scywgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMgd2hlbgotICAgICAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXMKLSAgICAgICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzCi0gICAgICAgaW4gdGhlIHJlc3Qgb2YgdGhlIGRlY29kaW5nIHRhYmxlcyB3aXRoIGludmFsaWQgY29kZSBtYXJrZXJzLgotICAgICAqLwotCi0gICAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi8KLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIENPREVTOgotICAgICAgICBiYXNlID0gZXh0cmEgPSB3b3JrOyAgICAvKiBkdW1teSB2YWx1ZS0tbm90IHVzZWQgKi8KLSAgICAgICAgZW5kID0gMTk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTEVOUzoKLSAgICAgICAgYmFzZSA9IGxiYXNlOwotICAgICAgICBiYXNlIC09IDI1NzsKLSAgICAgICAgZXh0cmEgPSBsZXh0OwotICAgICAgICBleHRyYSAtPSAyNTc7Ci0gICAgICAgIGVuZCA9IDI1NjsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogICAgICAgICAgICAvKiBESVNUUyAqLwotICAgICAgICBiYXNlID0gZGJhc2U7Ci0gICAgICAgIGV4dHJhID0gZGV4dDsKLSAgICAgICAgZW5kID0gLTE7Ci0gICAgfQotCi0gICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSBmb3IgbG9vcCAqLwotICAgIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovCi0gICAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovCi0gICAgbGVuID0gbWluOyAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgbGVuZ3RoICovCi0gICAgbmV4dCA9ICp0YWJsZTsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgdG8gZmlsbCBpbiAqLwotICAgIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi8KLSAgICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqLwotICAgIGxvdyA9ICh1bnNpZ25lZCkoLTEpOyAgICAgICAvKiB0cmlnZ2VyIG5ldyBzdWItdGFibGUgd2hlbiBsZW4gPiByb290ICovCi0gICAgdXNlZCA9IDFVIDw8IHJvb3Q7ICAgICAgICAgIC8qIHVzZSByb290IHRhYmxlIGVudHJpZXMgKi8KLSAgICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqLwotCi0gICAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovCi0gICAgaWYgKCh0eXBlID09IExFTlMgJiYgdXNlZCA+PSBFTk9VR0hfTEVOUykgfHwKLSAgICAgICAgKHR5cGUgPT0gRElTVFMgJiYgdXNlZCA+PSBFTk9VR0hfRElTVFMpKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIC8qIHByb2Nlc3MgYWxsIGNvZGVzIGFuZCBtYWtlIHRhYmxlIGVudHJpZXMgKi8KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIC8qIGNyZWF0ZSB0YWJsZSBlbnRyeSAqLwotICAgICAgICB0aGlzLmJpdHMgPSAodW5zaWduZWQgY2hhcikobGVuIC0gZHJvcCk7Ci0gICAgICAgIGlmICgoaW50KSh3b3JrW3N5bV0pIDwgZW5kKSB7Ci0gICAgICAgICAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpMDsKLSAgICAgICAgICAgIHRoaXMudmFsID0gd29ya1tzeW1dOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChpbnQpKHdvcmtbc3ltXSkgPiBlbmQpIHsKLSAgICAgICAgICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcikoZXh0cmFbd29ya1tzeW1dXSk7Ci0gICAgICAgICAgICB0aGlzLnZhbCA9IGJhc2Vbd29ya1tzeW1dXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcikoMzIgKyA2NCk7ICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovCi0gICAgICAgICAgICB0aGlzLnZhbCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiByZXBsaWNhdGUgZm9yIHRob3NlIGluZGljZXMgd2l0aCBsb3cgbGVuIGJpdHMgZXF1YWwgdG8gaHVmZiAqLwotICAgICAgICBpbmNyID0gMVUgPDwgKGxlbiAtIGRyb3ApOwotICAgICAgICBmaWxsID0gMVUgPDwgY3VycjsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgZmlsbCAtPSBpbmNyOwotICAgICAgICAgICAgbmV4dFsoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gdGhpczsKLSAgICAgICAgfSB3aGlsZSAoZmlsbCAhPSAwKTsKLQotICAgICAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqLwotICAgICAgICBpbmNyID0gMVUgPDwgKGxlbiAtIDEpOwotICAgICAgICB3aGlsZSAoaHVmZiAmIGluY3IpCi0gICAgICAgICAgICBpbmNyID4+PSAxOwotICAgICAgICBpZiAoaW5jciAhPSAwKSB7Ci0gICAgICAgICAgICBodWZmICY9IGluY3IgLSAxOwotICAgICAgICAgICAgaHVmZiArPSBpbmNyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGh1ZmYgPSAwOwotCi0gICAgICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqLwotICAgICAgICBzeW0rKzsKLSAgICAgICAgaWYgKC0tKGNvdW50W2xlbl0pID09IDApIHsKLSAgICAgICAgICAgIGlmIChsZW4gPT0gbWF4KSBicmVhazsKLSAgICAgICAgICAgIGxlbiA9IGxlbnNbd29ya1tzeW1dXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqLwotICAgICAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9IGxvdykgewotICAgICAgICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovCi0gICAgICAgICAgICBpZiAoZHJvcCA9PSAwKQotICAgICAgICAgICAgICAgIGRyb3AgPSByb290OwotCi0gICAgICAgICAgICAvKiBpbmNyZW1lbnQgcGFzdCBsYXN0IHRhYmxlICovCi0gICAgICAgICAgICBuZXh0ICs9IDFVIDw8IGN1cnI7Ci0KLSAgICAgICAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqLwotICAgICAgICAgICAgY3VyciA9IGxlbiAtIGRyb3A7Ci0gICAgICAgICAgICBsZWZ0ID0gKGludCkoMSA8PCBjdXJyKTsKLSAgICAgICAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkgewotICAgICAgICAgICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdOwotICAgICAgICAgICAgICAgIGlmIChsZWZ0IDw9IDApIGJyZWFrOwotICAgICAgICAgICAgICAgIGN1cnIrKzsKLSAgICAgICAgICAgICAgICBsZWZ0IDw8PSAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBjaGVjayBmb3IgZW5vdWdoIHNwYWNlICovCi0gICAgICAgICAgICB1c2VkICs9IDFVIDw8IGN1cnI7Ci0gICAgICAgICAgICBpZiAoKHR5cGUgPT0gTEVOUyAmJiB1c2VkID49IEVOT1VHSF9MRU5TKSB8fAotICAgICAgICAgICAgICAgICh0eXBlID09IERJU1RTICYmIHVzZWQgPj0gRU5PVUdIX0RJU1RTKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgICAgICAgLyogcG9pbnQgZW50cnkgaW4gcm9vdCB0YWJsZSB0byBzdWItdGFibGUgKi8KLSAgICAgICAgICAgIGxvdyA9IGh1ZmYgJiBtYXNrOwotICAgICAgICAgICAgKCp0YWJsZSlbbG93XS5vcCA9ICh1bnNpZ25lZCBjaGFyKWN1cnI7Ci0gICAgICAgICAgICAoKnRhYmxlKVtsb3ddLmJpdHMgPSAodW5zaWduZWQgY2hhcilyb290OwotICAgICAgICAgICAgKCp0YWJsZSlbbG93XS52YWwgPSAodW5zaWduZWQgc2hvcnQpKG5leHQgLSAqdGFibGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgICBGaWxsIGluIHJlc3Qgb2YgdGFibGUgZm9yIGluY29tcGxldGUgY29kZXMuICBUaGlzIGxvb3AgaXMgc2ltaWxhciB0byB0aGUKLSAgICAgICBsb29wIGFib3ZlIGluIGluY3JlbWVudGluZyBodWZmIGZvciB0YWJsZSBpbmRpY2VzLiAgSXQgaXMgYXNzdW1lZCB0aGF0Ci0gICAgICAgbGVuIGlzIGVxdWFsIHRvIGN1cnIgKyBkcm9wLCBzbyB0aGVyZSBpcyBubyBsb29wIG5lZWRlZCB0byBpbmNyZW1lbnQKLSAgICAgICB0aHJvdWdoIGhpZ2ggaW5kZXggYml0cy4gIFdoZW4gdGhlIGN1cnJlbnQgc3ViLXRhYmxlIGlzIGZpbGxlZCwgdGhlIGxvb3AKLSAgICAgICBkcm9wcyBiYWNrIHRvIHRoZSByb290IHRhYmxlIHRvIGZpbGwgaW4gYW55IHJlbWFpbmluZyBlbnRyaWVzIHRoZXJlLgotICAgICAqLwotICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcik2NDsgICAgICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqLwotICAgIHRoaXMuYml0cyA9ICh1bnNpZ25lZCBjaGFyKShsZW4gLSBkcm9wKTsKLSAgICB0aGlzLnZhbCA9ICh1bnNpZ25lZCBzaG9ydCkwOwotICAgIHdoaWxlIChodWZmICE9IDApIHsKLSAgICAgICAgLyogd2hlbiBkb25lIHdpdGggc3ViLXRhYmxlLCBkcm9wIGJhY2sgdG8gcm9vdCB0YWJsZSAqLwotICAgICAgICBpZiAoZHJvcCAhPSAwICYmIChodWZmICYgbWFzaykgIT0gbG93KSB7Ci0gICAgICAgICAgICBkcm9wID0gMDsKLSAgICAgICAgICAgIGxlbiA9IHJvb3Q7Ci0gICAgICAgICAgICBuZXh0ID0gKnRhYmxlOwotICAgICAgICAgICAgY3VyciA9IHJvb3Q7Ci0gICAgICAgICAgICB0aGlzLmJpdHMgPSAodW5zaWduZWQgY2hhcilsZW47Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBwdXQgaW52YWxpZCBjb2RlIG1hcmtlciBpbiB0YWJsZSAqLwotICAgICAgICBuZXh0W2h1ZmYgPj4gZHJvcF0gPSB0aGlzOwotCi0gICAgICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovCi0gICAgICAgIGluY3IgPSAxVSA8PCAobGVuIC0gMSk7Ci0gICAgICAgIHdoaWxlIChodWZmICYgaW5jcikKLSAgICAgICAgICAgIGluY3IgPj49IDE7Ci0gICAgICAgIGlmIChpbmNyICE9IDApIHsKLSAgICAgICAgICAgIGh1ZmYgJj0gaW5jciAtIDE7Ci0gICAgICAgICAgICBodWZmICs9IGluY3I7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaHVmZiA9IDA7Ci0gICAgfQotCi0gICAgLyogc2V0IHJldHVybiBwYXJhbWV0ZXJzICovCi0gICAgKnRhYmxlICs9IHVzZWQ7Ci0gICAgKmJpdHMgPSByb290OwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9pbmZiYWNrOS9pbmZ0cmVlOS5oIGIvc3JjL3psaWIvY29udHJpYi9pbmZiYWNrOS9pbmZ0cmVlOS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWIyMWYwLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvaW5mYmFjazkvaW5mdHJlZTkuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qIGluZnRyZWU5LmggLS0gaGVhZGVyIHRvIHVzZSBpbmZ0cmVlOS5jCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwOCBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKLSAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcwotICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgotICovCi0KLS8qIFN0cnVjdHVyZSBmb3IgZGVjb2RpbmcgdGFibGVzLiAgRWFjaCBlbnRyeSBwcm92aWRlcyBlaXRoZXIgdGhlCi0gICBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZG8gdGhlIG9wZXJhdGlvbiByZXF1ZXN0ZWQgYnkgdGhlIGNvZGUgdGhhdAotICAgaW5kZXhlZCB0aGF0IHRhYmxlIGVudHJ5LCBvciBpdCBwcm92aWRlcyBhIHBvaW50ZXIgdG8gYW5vdGhlcgotICAgdGFibGUgdGhhdCBpbmRleGVzIG1vcmUgYml0cyBvZiB0aGUgY29kZS4gIG9wIGluZGljYXRlcyB3aGV0aGVyCi0gICB0aGUgZW50cnkgaXMgYSBwb2ludGVyIHRvIGFub3RoZXIgdGFibGUsIGEgbGl0ZXJhbCwgYSBsZW5ndGggb3IKLSAgIGRpc3RhbmNlLCBhbiBlbmQtb2YtYmxvY2ssIG9yIGFuIGludmFsaWQgY29kZS4gIEZvciBhIHRhYmxlCi0gICBwb2ludGVyLCB0aGUgbG93IGZvdXIgYml0cyBvZiBvcCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgb2YKLSAgIHRoYXQgdGFibGUuICBGb3IgYSBsZW5ndGggb3IgZGlzdGFuY2UsIHRoZSBsb3cgZm91ciBiaXRzIG9mIG9wCi0gICBpcyB0aGUgbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gZ2V0IGFmdGVyIHRoZSBjb2RlLiAgYml0cyBpcwotICAgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoaXMgY29kZSBvciBwYXJ0IG9mIHRoZSBjb2RlIHRvIGRyb3Agb2ZmCi0gICBvZiB0aGUgYml0IGJ1ZmZlci4gIHZhbCBpcyB0aGUgYWN0dWFsIGJ5dGUgdG8gb3V0cHV0IGluIHRoZSBjYXNlCi0gICBvZiBhIGxpdGVyYWwsIHRoZSBiYXNlIGxlbmd0aCBvciBkaXN0YW5jZSwgb3IgdGhlIG9mZnNldCBmcm9tCi0gICB0aGUgY3VycmVudCB0YWJsZSB0byB0aGUgbmV4dCB0YWJsZS4gIEVhY2ggZW50cnkgaXMgZm91ciBieXRlcy4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBjaGFyIG9wOyAgICAgICAgICAgLyogb3BlcmF0aW9uLCBleHRyYSBiaXRzLCB0YWJsZSBiaXRzICovCi0gICAgdW5zaWduZWQgY2hhciBiaXRzOyAgICAgICAgIC8qIGJpdHMgaW4gdGhpcyBwYXJ0IG9mIHRoZSBjb2RlICovCi0gICAgdW5zaWduZWQgc2hvcnQgdmFsOyAgICAgICAgIC8qIG9mZnNldCBpbiB0YWJsZSBvciBjb2RlIHZhbHVlICovCi19IGNvZGU7Ci0KLS8qIG9wIHZhbHVlcyBhcyBzZXQgYnkgaW5mbGF0ZV90YWJsZSgpOgotICAgIDAwMDAwMDAwIC0gbGl0ZXJhbAotICAgIDAwMDB0dHR0IC0gdGFibGUgbGluaywgdHR0dCAhPSAwIGlzIHRoZSBudW1iZXIgb2YgdGFibGUgaW5kZXggYml0cwotICAgIDEwMGVlZWVlIC0gbGVuZ3RoIG9yIGRpc3RhbmNlLCBlZWVlIGlzIHRoZSBudW1iZXIgb2YgZXh0cmEgYml0cwotICAgIDAxMTAwMDAwIC0gZW5kIG9mIGJsb2NrCi0gICAgMDEwMDAwMDAgLSBpbnZhbGlkIGNvZGUKLSAqLwotCi0vKiBNYXhpbXVtIHNpemUgb2YgdGhlIGR5bmFtaWMgdGFibGUuICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29kZSBzdHJ1Y3R1cmVzIGlzCi0gICAxNDQ2LCB3aGljaCBpcyB0aGUgc3VtIG9mIDg1MiBmb3IgbGl0ZXJhbC9sZW5ndGggY29kZXMgYW5kIDU5NCBmb3IgZGlzdGFuY2UKLSAgIGNvZGVzLiAgVGhlc2UgdmFsdWVzIHdlcmUgZm91bmQgYnkgZXhoYXVzdGl2ZSBzZWFyY2hlcyB1c2luZyB0aGUgcHJvZ3JhbQotICAgZXhhbXBsZXMvZW5vdWdoLmMgZm91bmQgaW4gdGhlIHpsaWIgZGlzdHJpYnR1dGlvbi4gIFRoZSBhcmd1bWVudHMgdG8gdGhhdAotICAgcHJvZ3JhbSBhcmUgdGhlIG51bWJlciBvZiBzeW1ib2xzLCB0aGUgaW5pdGlhbCByb290IHRhYmxlIHNpemUsIGFuZCB0aGUKLSAgIG1heGltdW0gYml0IGxlbmd0aCBvZiBhIGNvZGUuICAiZW5vdWdoIDI4NiA5IDE1IiBmb3IgbGl0ZXJhbC9sZW5ndGggY29kZXMKLSAgIHJldHVybnMgcmV0dXJucyA4NTIsIGFuZCAiZW5vdWdoIDMyIDYgMTUiIGZvciBkaXN0YW5jZSBjb2RlcyByZXR1cm5zIDU5NC4KLSAgIFRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSAoOSBvciA2KSBpcyBmb3VuZCBpbiB0aGUgZmlmdGggYXJndW1lbnQgb2YgdGhlCi0gICBpbmZsYXRlX3RhYmxlKCkgY2FsbHMgaW4gaW5mYmFjazkuYy4gIElmIHRoZSByb290IHRhYmxlIHNpemUgaXMgY2hhbmdlZCwKLSAgIHRoZW4gdGhlc2UgbWF4aW11bSBzaXplcyB3b3VsZCBiZSBuZWVkIHRvIGJlIHJlY2FsY3VsYXRlZCBhbmQgdXBkYXRlZC4gKi8KLSNkZWZpbmUgRU5PVUdIX0xFTlMgODUyCi0jZGVmaW5lIEVOT1VHSF9ESVNUUyA1OTQKLSNkZWZpbmUgRU5PVUdIIChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpCi0KLS8qIFR5cGUgb2YgY29kZSB0byBidWlsZCBmb3IgaW5mbGF0ZV90YWJsZTkoKSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBDT0RFUywKLSAgICBMRU5TLAotICAgIERJU1RTCi19IGNvZGV0eXBlOwotCi1leHRlcm4gaW50IGluZmxhdGVfdGFibGU5IE9GKChjb2RldHlwZSB0eXBlLCB1bnNpZ25lZCBzaG9ydCBGQVIgKmxlbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvZGVzLCBjb2RlIEZBUiAqIEZBUiAqdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZBUiAqYml0cywgdW5zaWduZWQgc2hvcnQgRkFSICp3b3JrKSk7CmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2luZmxhdGU4Ni9pbmZmYXM4Ni5jIGIvc3JjL3psaWIvY29udHJpYi9pbmZsYXRlODYvaW5mZmFzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5MmY2Ny4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL2luZmxhdGU4Ni9pbmZmYXM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE1NyArMCwwIEBACi0vKiBpbmZmYXM4Ni5jIGlzIGEgaGFuZCB0dW5lZCBhc3NlbWJsZXIgdmVyc2lvbiBvZgotICoKLSAqIGluZmZhc3QuYyAtLSBmYXN0IGRlY29kaW5nCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAzIENocmlzIEFuZGVyc29uIDxjaHJpc3RvcEBjaGFybS5uZXQ+Ci0gKiBQbGVhc2UgdXNlIHRoZSBjb3B5cmlnaHQgY29uZGl0aW9ucyBhYm92ZS4KLSAqCi0gKiBEZWMtMjktMjAwMyAtLSBJIGFkZGVkIEFNRDY0IGluZmxhdGUgYXNtIHN1cHBvcnQuICBUaGlzIHZlcnNpb24gaXMgYWxzbwotICogc2xpZ2h0bHkgcXVpY2tlciBvbiB4ODYgc3lzdGVtcyBiZWNhdXNlLCBpbnN0ZWFkIG9mIHVzaW5nIHJlcCBtb3ZzYiB0byBjb3B5Ci0gKiBkYXRhLCBpdCB1c2VzIHJlcCBtb3Zzdywgd2hpY2ggbW92ZXMgZGF0YSBpbiAyLWJ5dGUgY2h1bmtzIGluc3RlYWQgb2Ygc2luZ2xlCi0gKiBieXRlcy4gIEkndmUgdGVzdGVkIHRoZSBBTUQ2NCBjb2RlIG9uIGEgRmVkb3JhIENvcmUgMSArIHRoZSB4ODZfNjQgdXBkYXRlcwotICogZnJvbSBodHRwOi8vZmVkb3JhLmxpbnV4LmR1a2UuZWR1L2ZjMV94ODZfNjQKLSAqIHdoaWNoIGlzIHJ1bm5pbmcgb24gYW4gQXRobG9uIDY0IDMwMDArIC8gR2lnYWJ5dGUgR0EtSzhWVDgwME0gc3lzdGVtIHdpdGgKLSAqIDFHQiByYW0uICBUaGUgNjQtYml0IHZlcnNpb24gaXMgYWJvdXQgNCUgZmFzdGVyIHRoYW4gdGhlIDMyLWJpdCB2ZXJzaW9uLAotICogd2hlbiBkZWNvbXByZXNzaW5nIG1vemlsbGEtc291cmNlLTEuMy50YXIuZ3ouCi0gKgotICogTWFyLTEzLTIwMDMgLS0gTW9zdCBvZiB0aGlzIGlzIGRlcml2ZWQgZnJvbSBpbmZmYXN0LlMgd2hpY2ggaXMgZGVyaXZlZCBmcm9tCi0gKiB0aGUgZ2NjIC1TIG91dHB1dCBvZiB6bGliLTEuMi4wL2luZmZhc3QuYy4gIFpsaWItMS4yLjAgaXMgaW4gYmV0YSByZWxlYXNlIGF0Ci0gKiB0aGUgbW9tZW50LiAgSSBoYXZlIHN1Y2Nlc3NmdWxseSBjb21waWxlZCBhbmQgdGVzdGVkIHRoaXMgY29kZSB3aXRoIGdjYzIuOTYsCi0gKiBnY2MzLjIsIGljYzUuMCwgbXN2YzYuMC4gIEl0IGlzIHZlcnkgY2xvc2UgdG8gdGhlIHNwZWVkIG9mIGluZmZhc3QuUwotICogY29tcGlsZWQgd2l0aCBnY2MgLUROT19NTVgsIGJ1dCBpbmZmYXN0LlMgaXMgc3RpbGwgZmFzdGVyIG9uIHRoZSBQMyB3aXRoIE1NWAotICogZW5hYmxlZC4gIEkgd2lsbCBhdHRlbXB0IHRvIG1lcmdlIHRoZSBNTVggY29kZSBpbnRvIHRoaXMgdmVyc2lvbi4gIE5ld2VyCi0gKiB2ZXJzaW9ucyBvZiB0aGlzIGFuZCBpbmZmYXN0LlMgY2FuIGJlIGZvdW5kIGF0Ci0gKiBodHRwOi8vd3d3LmVldGJlZXRlZS5jb20vemxpYi8gYW5kIGh0dHA6Ly93d3cuY2hhcm0ubmV0L35jaHJpc3RvcC96bGliLwotICovCi0KLSNpbmNsdWRlICJ6dXRpbC5oIgotI2luY2x1ZGUgImluZnRyZWVzLmgiCi0jaW5jbHVkZSAiaW5mbGF0ZS5oIgotI2luY2x1ZGUgImluZmZhc3QuaCIKLQotLyogTWFyayBBZGxlcidzIGNvbW1lbnRzIGZyb20gaW5mZmFzdC5jOiAqLwotCi0vKgotICAgRGVjb2RlIGxpdGVyYWwsIGxlbmd0aCwgYW5kIGRpc3RhbmNlIGNvZGVzIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdGluZwotICAgbGl0ZXJhbCBhbmQgbWF0Y2ggYnl0ZXMgdW50aWwgZWl0aGVyIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0IGlzCi0gICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLgotICAgV2hlbiBsYXJnZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBzdXBwbGllZCB0byBpbmZsYXRlKCksIGZvcgotICAgZXhhbXBsZSwgYSAxNksgaW5wdXQgYnVmZmVyIGFuZCBhIDY0SyBvdXRwdXQgYnVmZmVyLCBtb3JlIHRoYW4gOTUlIG9mIHRoZQotICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuCi0KLSAgIEVudHJ5IGFzc3VtcHRpb25zOgotCi0gICAgICAgIHN0YXRlLT5tb2RlID09IExFTgotICAgICAgICBzdHJtLT5hdmFpbF9pbiA+PSA2Ci0gICAgICAgIHN0cm0tPmF2YWlsX291dCA+PSAyNTgKLSAgICAgICAgc3RhcnQgPj0gc3RybS0+YXZhaWxfb3V0Ci0gICAgICAgIHN0YXRlLT5iaXRzIDwgOAotCi0gICBPbiByZXR1cm4sIHN0YXRlLT5tb2RlIGlzIG9uZSBvZjoKLQotICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXQKLSAgICAgICAgVFlQRSAtLSByZWFjaGVkIGVuZCBvZiBibG9jayBjb2RlLCBpbmZsYXRlKCkgdG8gaW50ZXJwcmV0IG5leHQgYmxvY2sKLSAgICAgICAgQkFEIC0tIGVycm9yIGluIGJsb2NrIGRhdGEKLQotICAgTm90ZXM6Ci0KLSAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZQotICAgICAgbGVuZ3RoIGNvZGUsIDUgYml0cyBmb3IgdGhlIGxlbmd0aCBleHRyYSwgMTUgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGNvZGUsCi0gICAgICBhbmQgMTMgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGV4dHJhLiAgVGhpcyB0b3RhbHMgNDggYml0cywgb3Igc2l4IGJ5dGVzLgotICAgICAgVGhlcmVmb3JlIGlmIHN0cm0tPmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkCi0gICAgICBjaGVja2luZyBmb3IgYXZhaWxhYmxlIGlucHV0IHdoaWxlIGRlY29kaW5nLgotCi0gICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4Ci0gICAgICBieXRlcywgd2hpY2ggaXMgdGhlIG1heGltdW0gbGVuZ3RoIHRoYXQgY2FuIGJlIGNvZGVkLiAgaW5mbGF0ZV9mYXN0KCkKLSAgICAgIHJlcXVpcmVzIHN0cm0tPmF2YWlsX291dCA+PSAyNTggZm9yIGVhY2ggbG9vcCB0byBhdm9pZCBjaGVja2luZyBmb3IKLSAgICAgIG91dHB1dCBzcGFjZS4KLSAqLwotdm9pZCBpbmZsYXRlX2Zhc3Qoc3RybSwgc3RhcnQpCi16X3N0cmVhbXAgc3RybTsKLXVuc2lnbmVkIHN0YXJ0OyAgICAgICAgIC8qIGluZmxhdGUoKSdzIHN0YXJ0aW5nIHZhbHVlIGZvciBzdHJtLT5hdmFpbF9vdXQgKi8KLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotICAgIHN0cnVjdCBpbmZmYXN0X2FyIHsKLS8qIDY0ICAgMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2ICB4ODZfNjQgKi8KLS8qIGFyIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyICovCi0vKiAgMCAgICAwICovIHZvaWQgKmVzcDsgICAgICAgICAgICAgICAgLyogZXNwIHNhdmUgKi8KLS8qICA4ICAgIDQgKi8gdm9pZCAqZWJwOyAgICAgICAgICAgICAgICAvKiBlYnAgc2F2ZSAqLwotLyogMTYgICAgOCAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqaW47ICAgIC8qIGVzaSByc2kgIGxvY2FsIHN0cm0tPm5leHRfaW4gKi8KLS8qIDI0ICAgMTIgKi8gdW5zaWduZWQgY2hhciBGQVIgKmxhc3Q7ICAvKiAgICAgcjkgICB3aGlsZSBpbiA8IGxhc3QgKi8KLS8qIDMyICAgMTYgKi8gdW5zaWduZWQgY2hhciBGQVIgKm91dDsgICAvKiBlZGkgcmRpICBsb2NhbCBzdHJtLT5uZXh0X291dCAqLwotLyogNDAgICAyMCAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqYmVnOyAgIC8qICAgICAgICAgIGluZmxhdGUoKSdzIGluaXQgbmV4dF9vdXQgKi8KLS8qIDQ4ICAgMjQgKi8gdW5zaWduZWQgY2hhciBGQVIgKmVuZDsgICAvKiAgICAgcjEwICB3aGlsZSBvdXQgPCBlbmQgKi8KLS8qIDU2ICAgMjggKi8gdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdzsvKiAgICAgICAgICBzaXplIG9mIHdpbmRvdywgd3NpemUhPTAgKi8KLS8qIDY0ICAgMzIgKi8gY29kZSBjb25zdCBGQVIgKmxjb2RlOyAgICAvKiBlYnAgcmJwICBsb2NhbCBzdHJtLT5sZW5jb2RlICovCi0vKiA3MiAgIDM2ICovIGNvZGUgY29uc3QgRkFSICpkY29kZTsgICAgLyogICAgIHIxMSAgbG9jYWwgc3RybS0+ZGlzdGNvZGUgKi8KLS8qIDgwICAgNDAgKi8gdW5zaWduZWQgbG9uZyBob2xkOyAgICAgICAvKiBlZHggcmR4ICBsb2NhbCBzdHJtLT5ob2xkICovCi0vKiA4OCAgIDQ0ICovIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgLyogZWJ4IHJieCAgbG9jYWwgc3RybS0+Yml0cyAqLwotLyogOTIgICA0OCAqLyB1bnNpZ25lZCB3c2l6ZTsgICAgICAgICAgIC8qICAgICAgICAgIHdpbmRvdyBzaXplICovCi0vKiA5NiAgIDUyICovIHVuc2lnbmVkIHdyaXRlOyAgICAgICAgICAgLyogICAgICAgICAgd2luZG93IHdyaXRlIGluZGV4ICovCi0vKjEwMCAgIDU2ICovIHVuc2lnbmVkIGxtYXNrOyAgICAgICAgICAgLyogICAgIHIxMiAgbWFzayBmb3IgbGNvZGUgKi8KLS8qMTA0ICAgNjAgKi8gdW5zaWduZWQgZG1hc2s7ICAgICAgICAgICAvKiAgICAgcjEzICBtYXNrIGZvciBkY29kZSAqLwotLyoxMDggICA2NCAqLyB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgIC8qICAgICByMTQgIG1hdGNoIGxlbmd0aCAqLwotLyoxMTIgICA2OCAqLyB1bnNpZ25lZCBkaXN0OyAgICAgICAgICAgIC8qICAgICByMTUgIG1hdGNoIGRpc3RhbmNlICovCi0vKjExNiAgIDcyICovIHVuc2lnbmVkIHN0YXR1czsgICAgICAgICAgLyogICAgICAgICAgc2V0IHdoZW4gc3RhdGUgY2huZyovCi0gICAgfSBhcjsKLQotI2lmIGRlZmluZWQoIF9fR05VQ19fICkgJiYgZGVmaW5lZCggX19hbWQ2NF9fICkgJiYgISBkZWZpbmVkKCBfX2kzODYgKQotI2RlZmluZSBQQURfQVZBSUxfSU4gNgotI2RlZmluZSBQQURfQVZBSUxfT1VUIDI1OAotI2Vsc2UKLSNkZWZpbmUgUEFEX0FWQUlMX0lOIDUKLSNkZWZpbmUgUEFEX0FWQUlMX09VVCAyNTcKLSNlbmRpZgotCi0gICAgLyogY29weSBzdGF0ZSB0byBsb2NhbCB2YXJpYWJsZXMgKi8KLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKLSAgICBhci5pbiA9IHN0cm0tPm5leHRfaW47Ci0gICAgYXIubGFzdCA9IGFyLmluICsgKHN0cm0tPmF2YWlsX2luIC0gUEFEX0FWQUlMX0lOKTsKLSAgICBhci5vdXQgPSBzdHJtLT5uZXh0X291dDsKLSAgICBhci5iZWcgPSBhci5vdXQgLSAoc3RhcnQgLSBzdHJtLT5hdmFpbF9vdXQpOwotICAgIGFyLmVuZCA9IGFyLm91dCArIChzdHJtLT5hdmFpbF9vdXQgLSBQQURfQVZBSUxfT1VUKTsKLSAgICBhci53c2l6ZSA9IHN0YXRlLT53c2l6ZTsKLSAgICBhci53cml0ZSA9IHN0YXRlLT53bmV4dDsKLSAgICBhci53aW5kb3cgPSBzdGF0ZS0+d2luZG93OwotICAgIGFyLmhvbGQgPSBzdGF0ZS0+aG9sZDsKLSAgICBhci5iaXRzID0gc3RhdGUtPmJpdHM7Ci0gICAgYXIubGNvZGUgPSBzdGF0ZS0+bGVuY29kZTsKLSAgICBhci5kY29kZSA9IHN0YXRlLT5kaXN0Y29kZTsKLSAgICBhci5sbWFzayA9ICgxVSA8PCBzdGF0ZS0+bGVuYml0cykgLSAxOwotICAgIGFyLmRtYXNrID0gKDFVIDw8IHN0YXRlLT5kaXN0Yml0cykgLSAxOwotCi0gICAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2VzIHVudGlsIGVuZC1vZi1ibG9jayBvciBub3QgZW5vdWdoCi0gICAgICAgaW5wdXQgZGF0YSBvciBvdXRwdXQgc3BhY2UgKi8KLQotICAgIC8qIGFsaWduIGluIG9uIDEvMiBob2xkIHNpemUgYm91bmRhcnkgKi8KLSAgICB3aGlsZSAoKCh1bnNpZ25lZCBsb25nKSh2b2lkICopYXIuaW4gJiAoc2l6ZW9mKGFyLmhvbGQpIC8gMiAtIDEpKSAhPSAwKSB7Ci0gICAgICAgIGFyLmhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKmFyLmluKysgPDwgYXIuYml0czsKLSAgICAgICAgYXIuYml0cyArPSA4OwotICAgIH0KLQotI2lmIGRlZmluZWQoIF9fR05VQ19fICkgJiYgZGVmaW5lZCggX19hbWQ2NF9fICkgJiYgISBkZWZpbmVkKCBfX2kzODYgKQotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSIgICAgICAgIGxlYXEgICAgJTAsICUlcmF4XG4iCi0iICAgICAgICBtb3ZxICAgICUlcmJwLCA4KCUlcmF4KVxuIiAgICAgICAvKiBzYXZlIHJlZ3MgcmJwIGFuZCByc3AgKi8KLSIgICAgICAgIG1vdnEgICAgJSVyc3AsICglJXJheClcbiIKLSIgICAgICAgIG1vdnEgICAgJSVyYXgsICUlcnNwXG4iICAgICAgICAgIC8qIG1ha2UgcnNwIHBvaW50IHRvICZhciAqLwotIiAgICAgICAgbW92cSAgICAxNiglJXJzcCksICUlcnNpXG4iICAgICAgLyogcnNpICA9IGluICovCi0iICAgICAgICBtb3ZxICAgIDMyKCUlcnNwKSwgJSVyZGlcbiIgICAgICAvKiByZGkgID0gb3V0ICovCi0iICAgICAgICBtb3ZxICAgIDI0KCUlcnNwKSwgJSVyOVxuIiAgICAgICAvKiByOSAgID0gbGFzdCAqLwotIiAgICAgICAgbW92cSAgICA0OCglJXJzcCksICUlcjEwXG4iICAgICAgLyogcjEwICA9IGVuZCAqLwotIiAgICAgICAgbW92cSAgICA2NCglJXJzcCksICUlcmJwXG4iICAgICAgLyogcmJwICA9IGxjb2RlICovCi0iICAgICAgICBtb3ZxICAgIDcyKCUlcnNwKSwgJSVyMTFcbiIgICAgICAvKiByMTEgID0gZGNvZGUgKi8KLSIgICAgICAgIG1vdnEgICAgODAoJSVyc3ApLCAlJXJkeFxuIiAgICAgIC8qIHJkeCAgPSBob2xkICovCi0iICAgICAgICBtb3ZsICAgIDg4KCUlcnNwKSwgJSVlYnhcbiIgICAgICAvKiBlYnggID0gYml0cyAqLwotIiAgICAgICAgbW92bCAgICAxMDAoJSVyc3ApLCAlJXIxMmRcbiIgICAgLyogcjEyZCA9IGxtYXNrICovCi0iICAgICAgICBtb3ZsICAgIDEwNCglJXJzcCksICUlcjEzZFxuIiAgICAvKiByMTNkID0gZG1hc2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHIxNGQgPSBsZW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHIxNWQgPSBkaXN0ICovCi0iICAgICAgICBjbGRcbiIKLSIgICAgICAgIGNtcHEgICAgJSVyZGksICUlcjEwXG4iCi0iICAgICAgICBqZSAgICAgIC5MX29uZV90aW1lXG4iICAgICAgICAgICAvKiBpZiBvbmx5IG9uZSBkZWNvZGUgbGVmdCAqLwotIiAgICAgICAgY21wcSAgICAlJXJzaSwgJSVyOVxuIgotIiAgICAgICAgamUgICAgICAuTF9vbmVfdGltZVxuIgotIiAgICAgICAgam1wICAgICAuTF9kb19sb29wXG4iCi0KLSIuTF9vbmVfdGltZTpcbiIKLSIgICAgICAgIG1vdnEgICAgJSVyMTIsICUlcjhcbiIgICAgICAgICAgIC8qIHI4ID0gbG1hc2sgKi8KLSIgICAgICAgIGNtcGIgICAgJDMyLCAlJWJsXG4iCi0iICAgICAgICBqYSAgICAgIC5MX2dldF9sZW5ndGhfY29kZV9vbmVfdGltZVxuIgotCi0iICAgICAgICBsb2RzbFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlYXggPSAqKHVpbnQgKilpbisrICovCi0iICAgICAgICBtb3ZiICAgICUlYmwsICUlY2xcbiIgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLwotIiAgICAgICAgYWRkYiAgICAkMzIsICUlYmxcbiIgICAgICAgICAgICAgLyogYml0cyArPSAzMiAqLwotIiAgICAgICAgc2hscSAgICAlJWNsLCAlJXJheFxuIgotIiAgICAgICAgb3JxICAgICAlJXJheCwgJSVyZHhcbiIgICAgICAgICAgLyogaG9sZCB8PSAqKCh1aW50ICopaW4pKysgPDwgYml0cyAqLwotIiAgICAgICAgam1wICAgICAuTF9nZXRfbGVuZ3RoX2NvZGVfb25lX3RpbWVcbiIKLQotIi5hbGlnbiAzMiwweDkwXG4iCi0iLkxfd2hpbGVfdGVzdDpcbiIKLSIgICAgICAgIGNtcHEgICAgJSVyZGksICUlcjEwXG4iCi0iICAgICAgICBqYmUgICAgIC5MX2JyZWFrX2xvb3BcbiIKLSIgICAgICAgIGNtcHEgICAgJSVyc2ksICUlcjlcbiIKLSIgICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcFxuIgotCi0iLkxfZG9fbG9vcDpcbiIKLSIgICAgICAgIG1vdnEgICAgJSVyMTIsICUlcjhcbiIgICAgICAgICAgIC8qIHI4ID0gbG1hc2sgKi8KLSIgICAgICAgIGNtcGIgICAgJDMyLCAlJWJsXG4iCi0iICAgICAgICBqYSAgICAgIC5MX2dldF9sZW5ndGhfY29kZVxuIiAgICAvKiBpZiAoMzIgPCBiaXRzKSAqLwotCi0iICAgICAgICBsb2RzbFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlYXggPSAqKHVpbnQgKilpbisrICovCi0iICAgICAgICBtb3ZiICAgICUlYmwsICUlY2xcbiIgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLwotIiAgICAgICAgYWRkYiAgICAkMzIsICUlYmxcbiIgICAgICAgICAgICAgLyogYml0cyArPSAzMiAqLwotIiAgICAgICAgc2hscSAgICAlJWNsLCAlJXJheFxuIgotIiAgICAgICAgb3JxICAgICAlJXJheCwgJSVyZHhcbiIgICAgICAgICAgLyogaG9sZCB8PSAqKCh1aW50ICopaW4pKysgPDwgYml0cyAqLwotCi0iLkxfZ2V0X2xlbmd0aF9jb2RlOlxuIgotIiAgICAgICAgYW5kcSAgICAlJXJkeCwgJSVyOFxuIiAgICAgICAgICAgIC8qIHI4ICY9IGhvbGQgKi8KLSIgICAgICAgIG1vdmwgICAgKCUlcmJwLCUlcjgsNCksICUlZWF4XG4iICAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCi0KLSIgICAgICAgIG1vdmIgICAgJSVhaCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gdGhpcy5iaXRzICovCi0iICAgICAgICBzdWJiICAgICUlYWgsICUlYmxcbiIgICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLwotIiAgICAgICAgc2hycSAgICAlJWNsLCAlJXJkeFxuIiAgICAgICAgICAgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovCi0KLSIgICAgICAgIHRlc3RiICAgJSVhbCwgJSVhbFxuIgotIiAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZVxuIiAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8KLQotIiAgICAgICAgbW92cSAgICAlJXIxMiwgJSVyOFxuIiAgICAgICAgICAgIC8qIHI4ID0gbG1hc2sgKi8KLSIgICAgICAgIHNocmwgICAgJDE2LCAlJWVheFxuIiAgICAgICAgICAgIC8qIG91dHB1dCB0aGlzLnZhbCBjaGFyICovCi0iICAgICAgICBzdG9zYlxuIgotCi0iLkxfZ2V0X2xlbmd0aF9jb2RlX29uZV90aW1lOlxuIgotIiAgICAgICAgYW5kcSAgICAlJXJkeCwgJSVyOFxuIiAgICAgICAgICAgIC8qIHI4ICY9IGhvbGQgKi8KLSIgICAgICAgIG1vdmwgICAgKCUlcmJwLCUlcjgsNCksICUlZWF4XG4iIC8qIGVheCA9IGxjb2RlW2hvbGQgJiBsbWFza10gKi8KLQotIi5MX2RvbGVuOlxuIgotIiAgICAgICAgbW92YiAgICAlJWFoLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSB0aGlzLmJpdHMgKi8KLSIgICAgICAgIHN1YmIgICAgJSVhaCwgJSVibFxuIiAgICAgICAgICAgIC8qIGJpdHMgLT0gdGhpcy5iaXRzICovCi0iICAgICAgICBzaHJxICAgICUlY2wsICUlcmR4XG4iICAgICAgICAgICAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8KLQotIiAgICAgICAgdGVzdGIgICAlJWFsLCAlJWFsXG4iCi0iICAgICAgICBqbnogICAgIC5MX3Rlc3RfZm9yX2xlbmd0aF9iYXNlXG4iIC8qIGlmIChvcCAhPSAwKSA0NS43JSAqLwotCi0iICAgICAgICBzaHJsICAgICQxNiwgJSVlYXhcbiIgICAgICAgICAgICAvKiBvdXRwdXQgdGhpcy52YWwgY2hhciAqLwotIiAgICAgICAgc3Rvc2JcbiIKLSIgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdFxuIgotCi0iLmFsaWduIDMyLDB4OTBcbiIKLSIuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZTpcbiIKLSIgICAgICAgIG1vdmwgICAgJSVlYXgsICUlcjE0ZFxuIiAgICAgICAgIC8qIGxlbiA9IHRoaXMgKi8KLSIgICAgICAgIHNocmwgICAgJDE2LCAlJXIxNGRcbiIgICAgICAgICAgIC8qIGxlbiA9IHRoaXMudmFsICovCi0iICAgICAgICBtb3ZiICAgICUlYWwsICUlY2xcbiIKLQotIiAgICAgICAgdGVzdGIgICAkMTYsICUlYWxcbiIKLSIgICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aFxuIiAvKiBpZiAoKG9wICYgMTYpID09IDApIDglICovCi0iICAgICAgICBhbmRiICAgICQxNSwgJSVjbFxuIiAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLwotIiAgICAgICAganogICAgICAuTF9kZWNvZGVfZGlzdGFuY2VcbiIgICAgLyogaWYgKCFvcCkgKi8KLQotIi5MX2FkZF9iaXRzX3RvX2xlbjpcbiIKLSIgICAgICAgIHN1YmIgICAgJSVjbCwgJSVibFxuIgotIiAgICAgICAgeG9ybCAgICAlJWVheCwgJSVlYXhcbiIKLSIgICAgICAgIGluY2wgICAgJSVlYXhcbiIKLSIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKLSIgICAgICAgIGRlY2wgICAgJSVlYXhcbiIKLSIgICAgICAgIGFuZGwgICAgJSVlZHgsICUlZWF4XG4iICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCi0iICAgICAgICBzaHJxICAgICUlY2wsICUlcmR4XG4iCi0iICAgICAgICBhZGRsICAgICUlZWF4LCAlJXIxNGRcbiIgICAgICAgICAvKiBsZW4gKz0gaG9sZCAmIG1hc2tbb3BdICovCi0KLSIuTF9kZWNvZGVfZGlzdGFuY2U6XG4iCi0iICAgICAgICBtb3ZxICAgICUlcjEzLCAlJXI4XG4iICAgICAgICAgICAvKiByOCA9IGRtYXNrICovCi0iICAgICAgICBjbXBiICAgICQzMiwgJSVibFxuIgotIiAgICAgICAgamEgICAgICAuTF9nZXRfZGlzdGFuY2VfY29kZVxuIiAgLyogaWYgKDMyIDwgYml0cykgKi8KLQotIiAgICAgICAgbG9kc2xcbiIgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWF4ID0gKih1aW50ICopaW4rKyAqLwotIiAgICAgICAgbW92YiAgICAlJWJsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KLSIgICAgICAgIGFkZGIgICAgJDMyLCAlJWJsXG4iICAgICAgICAgICAgIC8qIGJpdHMgKz0gMzIgKi8KLSIgICAgICAgIHNobHEgICAgJSVjbCwgJSVyYXhcbiIKLSIgICAgICAgIG9ycSAgICAgJSVyYXgsICUlcmR4XG4iICAgICAgICAgIC8qIGhvbGQgfD0gKigodWludCAqKWluKSsrIDw8IGJpdHMgKi8KLQotIi5MX2dldF9kaXN0YW5jZV9jb2RlOlxuIgotIiAgICAgICAgYW5kcSAgICAlJXJkeCwgJSVyOFxuIiAgICAgICAgICAgLyogcjggJj0gaG9sZCAqLwotIiAgICAgICAgbW92bCAgICAoJSVyMTEsJSVyOCw0KSwgJSVlYXhcbiIgLyogZWF4ID0gZGNvZGVbaG9sZCAmIGRtYXNrXSAqLwotCi0iLkxfZG9kaXN0OlxuIgotIiAgICAgICAgbW92bCAgICAlJWVheCwgJSVyMTVkXG4iICAgICAgICAgLyogZGlzdCA9IHRoaXMgKi8KLSIgICAgICAgIHNocmwgICAgJDE2LCAlJXIxNWRcbiIgICAgICAgICAgIC8qIGRpc3QgPSB0aGlzLnZhbCAqLwotIiAgICAgICAgbW92YiAgICAlJWFoLCAlJWNsXG4iCi0iICAgICAgICBzdWJiICAgICUlYWgsICUlYmxcbiIgICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLwotIiAgICAgICAgc2hycSAgICAlJWNsLCAlJXJkeFxuIiAgICAgICAgICAgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovCi0iICAgICAgICBtb3ZiICAgICUlYWwsICUlY2xcbiIgICAgICAgICAgICAvKiBjbCA9IHRoaXMub3AgKi8KLQotIiAgICAgICAgdGVzdGIgICAkMTYsICUlYWxcbiIgICAgICAgICAgICAgLyogaWYgKChvcCAmIDE2KSA9PSAwKSAqLwotIiAgICAgICAganogICAgICAuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdFxuIgotIiAgICAgICAgYW5kYiAgICAkMTUsICUlY2xcbiIgICAgICAgICAgICAgLyogb3AgJj0gMTUgKi8KLSIgICAgICAgIGp6ICAgICAgLkxfY2hlY2tfZGlzdF9vbmVcbiIKLQotIi5MX2FkZF9iaXRzX3RvX2Rpc3Q6XG4iCi0iICAgICAgICBzdWJiICAgICUlY2wsICUlYmxcbiIKLSIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCi0iICAgICAgICBpbmNsICAgICUlZWF4XG4iCi0iICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCi0iICAgICAgICBkZWNsICAgICUlZWF4XG4iICAgICAgICAgICAgICAgICAvKiAoMSA8PCBvcCkgLSAxICovCi0iICAgICAgICBhbmRsICAgICUlZWR4LCAlJWVheFxuIiAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLwotIiAgICAgICAgc2hycSAgICAlJWNsLCAlJXJkeFxuIgotIiAgICAgICAgYWRkbCAgICAlJWVheCwgJSVyMTVkXG4iICAgICAgICAgLyogZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpICovCi0KLSIuTF9jaGVja193aW5kb3c6XG4iCi0iICAgICAgICBtb3ZxICAgICUlcnNpLCAlJXI4XG4iICAgICAgICAgICAvKiBzYXZlIGluIHNvIGZyb20gY2FuIHVzZSBpdCdzIHJlZyAqLwotIiAgICAgICAgbW92cSAgICAlJXJkaSwgJSVyYXhcbiIKLSIgICAgICAgIHN1YnEgICAgNDAoJSVyc3ApLCAlJXJheFxuIiAgICAgIC8qIG5ieXRlcyA9IG91dCAtIGJlZyAqLwotCi0iICAgICAgICBjbXBsICAgICUlcjE1ZCwgJSVlYXhcbiIKLSIgICAgICAgIGpiICAgICAgLkxfY2xpcF93aW5kb3dcbiIgICAgICAgIC8qIGlmIChkaXN0ID4gbmJ5dGVzKSA0LjIlICovCi0KLSIgICAgICAgIG1vdmwgICAgJSVyMTRkLCAlJWVjeFxuIiAgICAgICAgIC8qIGVjeCA9IGxlbiAqLwotIiAgICAgICAgbW92cSAgICAlJXJkaSwgJSVyc2lcbiIKLSIgICAgICAgIHN1YnEgICAgJSVyMTUsICUlcnNpXG4iICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0KLSIgICAgICAgIHNhcmwgICAgJSVlY3hcbiIKLSIgICAgICAgIGpuYyAgICAgLkxfY29weV90d29cbiIgICAgICAgICAgIC8qIGlmIGxlbiAlIDIgPT0gMCAqLwotCi0iICAgICAgICByZXAgICAgIG1vdnN3XG4iCi0iICAgICAgICBtb3ZiICAgICglJXJzaSksICUlYWxcbiIKLSIgICAgICAgIG1vdmIgICAgJSVhbCwgKCUlcmRpKVxuIgotIiAgICAgICAgaW5jcSAgICAlJXJkaVxuIgotCi0iICAgICAgICBtb3ZxICAgICUlcjgsICUlcnNpXG4iICAgICAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJXJzaSwgdG9zcyBmcm9tICovCi0iICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RcbiIKLQotIi5MX2NvcHlfdHdvOlxuIgotIiAgICAgICAgcmVwICAgICBtb3Zzd1xuIgotIiAgICAgICAgbW92cSAgICAlJXI4LCAlJXJzaVxuIiAgICAgICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVyc2ksIHRvc3MgZnJvbSAqLwotIiAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0XG4iCi0KLSIuYWxpZ24gMzIsMHg5MFxuIgotIi5MX2NoZWNrX2Rpc3Rfb25lOlxuIgotIiAgICAgICAgY21wbCAgICAkMSwgJSVyMTVkXG4iICAgICAgICAgICAgLyogaWYgZGlzdCAxLCBpcyBhIG1lbXNldCAqLwotIiAgICAgICAgam5lICAgICAuTF9jaGVja193aW5kb3dcbiIKLSIgICAgICAgIGNtcHEgICAgJSVyZGksIDQwKCUlcnNwKVxuIiAgICAgIC8qIGlmIG91dCA9PSBiZWcsIG91dHNpZGUgd2luZG93ICovCi0iICAgICAgICBqZSAgICAgIC5MX2NoZWNrX3dpbmRvd1xuIgotCi0iICAgICAgICBtb3ZsICAgICUlcjE0ZCwgJSVlY3hcbiIgICAgICAgICAvKiBlY3ggPSBsZW4gKi8KLSIgICAgICAgIG1vdmIgICAgLTEoJSVyZGkpLCAlJWFsXG4iCi0iICAgICAgICBtb3ZiICAgICUlYWwsICUlYWhcbiIKLQotIiAgICAgICAgc2FybCAgICAlJWVjeFxuIgotIiAgICAgICAgam5jICAgICAuTF9zZXRfdHdvXG4iCi0iICAgICAgICBtb3ZiICAgICUlYWwsICglJXJkaSlcbiIKLSIgICAgICAgIGluY3EgICAgJSVyZGlcbiIKLQotIi5MX3NldF90d286XG4iCi0iICAgICAgICByZXAgICAgIHN0b3N3XG4iCi0iICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RcbiIKLQotIi5hbGlnbiAzMiwweDkwXG4iCi0iLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aDpcbiIKLSIgICAgICAgIHRlc3RiICAgJDY0LCAlJWFsXG4iCi0iICAgICAgICBqbnogICAgIC5MX3Rlc3RfZm9yX2VuZF9vZl9ibG9ja1xuIiAvKiBpZiAoKG9wICYgNjQpICE9IDApICovCi0KLSIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCi0iICAgICAgICBpbmNsICAgICUlZWF4XG4iCi0iICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCi0iICAgICAgICBkZWNsICAgICUlZWF4XG4iCi0iICAgICAgICBhbmRsICAgICUlZWR4LCAlJWVheFxuIiAgICAgICAgIC8qIGVheCAmPSBob2xkICovCi0iICAgICAgICBhZGRsICAgICUlcjE0ZCwgJSVlYXhcbiIgICAgICAgIC8qIGVheCArPSBsZW4gKi8KLSIgICAgICAgIG1vdmwgICAgKCUlcmJwLCUlcmF4LDQpLCAlJWVheFxuIiAvKiBlYXggPSBsY29kZVt2YWwrKGhvbGQmbWFza1tvcF0pXSovCi0iICAgICAgICBqbXAgICAgIC5MX2RvbGVuXG4iCi0KLSIuYWxpZ24gMzIsMHg5MFxuIgotIi5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0OlxuIgotIiAgICAgICAgdGVzdGIgICAkNjQsICUlYWxcbiIKLSIgICAgICAgIGpueiAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlXG4iIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KLQotIiAgICAgICAgeG9ybCAgICAlJWVheCwgJSVlYXhcbiIKLSIgICAgICAgIGluY2wgICAgJSVlYXhcbiIKLSIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKLSIgICAgICAgIGRlY2wgICAgJSVlYXhcbiIKLSIgICAgICAgIGFuZGwgICAgJSVlZHgsICUlZWF4XG4iICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KLSIgICAgICAgIGFkZGwgICAgJSVyMTVkLCAlJWVheFxuIiAgICAgICAgLyogZWF4ICs9IGRpc3QgKi8KLSIgICAgICAgIG1vdmwgICAgKCUlcjExLCUlcmF4LDQpLCAlJWVheFxuIiAvKiBlYXggPSBkY29kZVt2YWwrKGhvbGQmbWFza1tvcF0pXSovCi0iICAgICAgICBqbXAgICAgIC5MX2RvZGlzdFxuIgotCi0iLmFsaWduIDMyLDB4OTBcbiIKLSIuTF9jbGlwX3dpbmRvdzpcbiIKLSIgICAgICAgIG1vdmwgICAgJSVlYXgsICUlZWN4XG4iICAgICAgICAgLyogZWN4ID0gbmJ5dGVzICovCi0iICAgICAgICBtb3ZsICAgIDkyKCUlcnNwKSwgJSVlYXhcbiIgICAgIC8qIGVheCA9IHdzaXplLCBwcmVwYXJlIGZvciBkaXN0IGNtcCAqLwotIiAgICAgICAgbmVnbCAgICAlJWVjeFxuIiAgICAgICAgICAgICAgICAvKiBuYnl0ZXMgPSAtbmJ5dGVzICovCi0KLSIgICAgICAgIGNtcGwgICAgJSVyMTVkLCAlJWVheFxuIgotIiAgICAgICAgamIgICAgICAuTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXJcbiIgLyogaWYgKGRpc3QgPiB3c2l6ZSkgKi8KLQotIiAgICAgICAgYWRkbCAgICAlJXIxNWQsICUlZWN4XG4iICAgICAgICAgLyogbmJ5dGVzID0gZGlzdCAtIG5ieXRlcyAqLwotIiAgICAgICAgY21wbCAgICAkMCwgOTYoJSVyc3ApXG4iCi0iICAgICAgICBqbmUgICAgIC5MX3dyYXBfYXJvdW5kX3dpbmRvd1xuIiAvKiBpZiAod3JpdGUgIT0gMCkgKi8KLQotIiAgICAgICAgbW92cSAgICA1NiglJXJzcCksICUlcnNpXG4iICAgICAvKiBmcm9tICA9IHdpbmRvdyAqLwotIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlYXhcbiIgICAgICAgICAvKiBlYXggIC09IG5ieXRlcyAqLwotIiAgICAgICAgYWRkcSAgICAlJXJheCwgJSVyc2lcbiIgICAgICAgICAvKiBmcm9tICs9IHdzaXplIC0gbmJ5dGVzICovCi0KLSIgICAgICAgIG1vdmwgICAgJSVyMTRkLCAlJWVheFxuIiAgICAgICAgLyogZWF4ID0gbGVuICovCi0iICAgICAgICBjbXBsICAgICUlZWN4LCAlJXIxNGRcbiIKLSIgICAgICAgIGpiZSAgICAgLkxfZG9fY29weVxuIiAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCi0KLSIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iICAgICAgICAgLyogZWF4IC09IG5ieXRlcyAqLwotIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgotIiAgICAgICAgbW92cSAgICAlJXJkaSwgJSVyc2lcbiIKLSIgICAgICAgIHN1YnEgICAgJSVyMTUsICUlcnNpXG4iICAgICAgICAgLyogZnJvbSA9ICZvdXRbIC1kaXN0IF0gKi8KLSIgICAgICAgIGptcCAgICAgLkxfZG9fY29weVxuIgotCi0iLmFsaWduIDMyLDB4OTBcbiIKLSIuTF93cmFwX2Fyb3VuZF93aW5kb3c6XG4iCi0iICAgICAgICBtb3ZsICAgIDk2KCUlcnNwKSwgJSVlYXhcbiIgICAgIC8qIGVheCA9IHdyaXRlICovCi0iICAgICAgICBjbXBsICAgICUlZWF4LCAlJWVjeFxuIgotIiAgICAgICAgamJlICAgICAuTF9jb250aWd1b3VzX2luX3dpbmRvd1xuIiAvKiBpZiAod3JpdGUgPj0gbmJ5dGVzKSAqLwotCi0iICAgICAgICBtb3ZsICAgIDkyKCUlcnNwKSwgJSVlc2lcbiIgICAgIC8qIGZyb20gID0gd3NpemUgKi8KLSIgICAgICAgIGFkZHEgICAgNTYoJSVyc3ApLCAlJXJzaVxuIiAgICAgLyogZnJvbSArPSB3aW5kb3cgKi8KLSIgICAgICAgIGFkZHEgICAgJSVyYXgsICUlcnNpXG4iICAgICAgICAgLyogZnJvbSArPSB3cml0ZSAqLwotIiAgICAgICAgc3VicSAgICAlJXJjeCwgJSVyc2lcbiIgICAgICAgICAvKiBmcm9tIC09IG5ieXRlcyAqLwotIiAgICAgICAgc3VibCAgICAlJWVheCwgJSVlY3hcbiIgICAgICAgICAvKiBuYnl0ZXMgLT0gd3JpdGUgKi8KLQotIiAgICAgICAgbW92bCAgICAlJXIxNGQsICUlZWF4XG4iICAgICAgICAvKiBlYXggPSBsZW4gKi8KLSIgICAgICAgIGNtcGwgICAgJSVlY3gsICUlZWF4XG4iCi0iICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHlcbiIgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0iICAgICAgICBzdWJsICAgICUlZWN4LCAlJWVheFxuIiAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KLSIgICAgICAgIHJlcCAgICAgbW92c2JcbiIKLSIgICAgICAgIG1vdnEgICAgNTYoJSVyc3ApLCAlJXJzaVxuIiAgICAgLyogZnJvbSA9IHdpbmRvdyAqLwotIiAgICAgICAgbW92bCAgICA5NiglJXJzcCksICUlZWN4XG4iICAgICAvKiBuYnl0ZXMgPSB3cml0ZSAqLwotIiAgICAgICAgY21wbCAgICAlJWVjeCwgJSVlYXhcbiIKLSIgICAgICAgIGpiZSAgICAgLkxfZG9fY29weVxuIiAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCi0KLSIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLwotIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgotIiAgICAgICAgbW92cSAgICAlJXJkaSwgJSVyc2lcbiIKLSIgICAgICAgIHN1YnEgICAgJSVyMTUsICUlcnNpXG4iICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KLSIgICAgICAgIGptcCAgICAgLkxfZG9fY29weVxuIgotCi0iLmFsaWduIDMyLDB4OTBcbiIKLSIuTF9jb250aWd1b3VzX2luX3dpbmRvdzpcbiIKLSIgICAgICAgIG1vdnEgICAgNTYoJSVyc3ApLCAlJXJzaVxuIiAgICAgLyogcnNpID0gd2luZG93ICovCi0iICAgICAgICBhZGRxICAgICUlcmF4LCAlJXJzaVxuIgotIiAgICAgICAgc3VicSAgICAlJXJjeCwgJSVyc2lcbiIgICAgICAgICAvKiBmcm9tICs9IHdyaXRlIC0gbmJ5dGVzICovCi0KLSIgICAgICAgIG1vdmwgICAgJSVyMTRkLCAlJWVheFxuIiAgICAgICAgLyogZWF4ID0gbGVuICovCi0iICAgICAgICBjbXBsICAgICUlZWN4LCAlJWVheFxuIgotIiAgICAgICAgamJlICAgICAuTF9kb19jb3B5XG4iICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KLQotIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlYXhcbiIgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCi0iICAgICAgICByZXAgICAgIG1vdnNiXG4iCi0iICAgICAgICBtb3ZxICAgICUlcmRpLCAlJXJzaVxuIgotIiAgICAgICAgc3VicSAgICAlJXIxNSwgJSVyc2lcbiIgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLwotIiAgICAgICAgam1wICAgICAuTF9kb19jb3B5XG4iICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KLQotIi5hbGlnbiAzMiwweDkwXG4iCi0iLkxfZG9fY29weTpcbiIKLSIgICAgICAgIG1vdmwgICAgJSVlYXgsICUlZWN4XG4iICAgICAgICAgLyogZWN4ID0gbGVuICovCi0iICAgICAgICByZXAgICAgIG1vdnNiXG4iCi0KLSIgICAgICAgIG1vdnEgICAgJSVyOCwgJSVyc2lcbiIgICAgICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLwotIiAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0XG4iCi0KLSIuTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2s6XG4iCi0iICAgICAgICB0ZXN0YiAgICQzMiwgJSVhbFxuIgotIiAgICAgICAganogICAgICAuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVcbiIKLSIgICAgICAgIG1vdmwgICAgJDEsIDExNiglJXJzcClcbiIKLSIgICAgICAgIGptcCAgICAgLkxfYnJlYWtfbG9vcF93aXRoX3N0YXR1c1xuIgotCi0iLkxfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlOlxuIgotIiAgICAgICAgbW92bCAgICAkMiwgMTE2KCUlcnNwKVxuIgotIiAgICAgICAgam1wICAgICAuTF9icmVha19sb29wX3dpdGhfc3RhdHVzXG4iCi0KLSIuTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGU6XG4iCi0iICAgICAgICBtb3ZsICAgICQzLCAxMTYoJSVyc3ApXG4iCi0iICAgICAgICBqbXAgICAgIC5MX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXNcbiIKLQotIi5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhcjpcbiIKLSIgICAgICAgIG1vdmwgICAgJDQsIDExNiglJXJzcClcbiIKLSIgICAgICAgIGptcCAgICAgLkxfYnJlYWtfbG9vcF93aXRoX3N0YXR1c1xuIgotCi0iLkxfYnJlYWtfbG9vcDpcbiIKLSIgICAgICAgIG1vdmwgICAgJDAsIDExNiglJXJzcClcbiIKLQotIi5MX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXM6XG4iCi0vKiBwdXQgaW4sIG91dCwgYml0cywgYW5kIGhvbGQgYmFjayBpbnRvIGFyIGFuZCBwb3AgZXNwICovCi0iICAgICAgICBtb3ZxICAgICUlcnNpLCAxNiglJXJzcClcbiIgICAgIC8qIGluICovCi0iICAgICAgICBtb3ZxICAgICUlcmRpLCAzMiglJXJzcClcbiIgICAgIC8qIG91dCAqLwotIiAgICAgICAgbW92bCAgICAlJWVieCwgODgoJSVyc3ApXG4iICAgICAvKiBiaXRzICovCi0iICAgICAgICBtb3ZxICAgICUlcmR4LCA4MCglJXJzcClcbiIgICAgIC8qIGhvbGQgKi8KLSIgICAgICAgIG1vdnEgICAgKCUlcnNwKSwgJSVyYXhcbiIgICAgICAgLyogcmVzdG9yZSByYnAgYW5kIHJzcCAqLwotIiAgICAgICAgbW92cSAgICA4KCUlcnNwKSwgJSVyYnBcbiIKLSIgICAgICAgIG1vdnEgICAgJSVyYXgsICUlcnNwXG4iCi0gICAgICAgICAgOgotICAgICAgICAgIDogIm0iIChhcikKLSAgICAgICAgICA6ICJtZW1vcnkiLCAiJXJheCIsICIlcmJ4IiwgIiVyY3giLCAiJXJkeCIsICIlcnNpIiwgIiVyZGkiLAotICAgICAgICAgICAgIiVyOCIsICIlcjkiLCAiJXIxMCIsICIlcjExIiwgIiVyMTIiLCAiJXIxMyIsICIlcjE0IiwgIiVyMTUiCi0gICAgKTsKLSNlbGlmICggZGVmaW5lZCggX19HTlVDX18gKSB8fCBkZWZpbmVkKCBfX0lDQyApICkgJiYgZGVmaW5lZCggX19pMzg2ICkKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0iICAgICAgICBsZWFsICAgICUwLCAlJWVheFxuIgotIiAgICAgICAgbW92bCAgICAlJWVzcCwgKCUlZWF4KVxuIiAgICAgICAgLyogc2F2ZSBlc3AsIGVicCAqLwotIiAgICAgICAgbW92bCAgICAlJWVicCwgNCglJWVheClcbiIKLSIgICAgICAgIG1vdmwgICAgJSVlYXgsICUlZXNwXG4iCi0iICAgICAgICBtb3ZsICAgIDgoJSVlc3ApLCAlJWVzaVxuIiAgICAgICAvKiBlc2kgPSBpbiAqLwotIiAgICAgICAgbW92bCAgICAxNiglJWVzcCksICUlZWRpXG4iICAgICAgLyogZWRpID0gb3V0ICovCi0iICAgICAgICBtb3ZsICAgIDQwKCUlZXNwKSwgJSVlZHhcbiIgICAgICAvKiBlZHggPSBob2xkICovCi0iICAgICAgICBtb3ZsICAgIDQ0KCUlZXNwKSwgJSVlYnhcbiIgICAgICAvKiBlYnggPSBiaXRzICovCi0iICAgICAgICBtb3ZsICAgIDMyKCUlZXNwKSwgJSVlYnBcbiIgICAgICAvKiBlYnAgPSBsY29kZSAqLwotCi0iICAgICAgICBjbGRcbiIKLSIgICAgICAgIGptcCAgICAgLkxfZG9fbG9vcFxuIgotCi0iLmFsaWduIDMyLDB4OTBcbiIKLSIuTF93aGlsZV90ZXN0OlxuIgotIiAgICAgICAgY21wbCAgICAlJWVkaSwgMjQoJSVlc3ApXG4iICAgICAgLyogb3V0IDwgZW5kICovCi0iICAgICAgICBqYmUgICAgIC5MX2JyZWFrX2xvb3BcbiIKLSIgICAgICAgIGNtcGwgICAgJSVlc2ksIDEyKCUlZXNwKVxuIiAgICAgIC8qIGluIDwgbGFzdCAqLwotIiAgICAgICAgamJlICAgICAuTF9icmVha19sb29wXG4iCi0KLSIuTF9kb19sb29wOlxuIgotIiAgICAgICAgY21wYiAgICAkMTUsICUlYmxcbiIKLSIgICAgICAgIGphICAgICAgLkxfZ2V0X2xlbmd0aF9jb2RlXG4iICAgIC8qIGlmICgxNSA8IGJpdHMpICovCi0KLSIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCi0iICAgICAgICBsb2Rzd1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLwotIiAgICAgICAgbW92YiAgICAlJWJsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KLSIgICAgICAgIGFkZGIgICAgJDE2LCAlJWJsXG4iICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KLSIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKLSIgICAgICAgIG9ybCAgICAgJSVlYXgsICUlZWR4XG4iICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8KLQotIi5MX2dldF9sZW5ndGhfY29kZTpcbiIKLSIgICAgICAgIG1vdmwgICAgNTYoJSVlc3ApLCAlJWVheFxuIiAgICAgIC8qIGVheCA9IGxtYXNrICovCi0iICAgICAgICBhbmRsICAgICUlZWR4LCAlJWVheFxuIiAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLwotIiAgICAgICAgbW92bCAgICAoJSVlYnAsJSVlYXgsNCksICUlZWF4XG4iIC8qIGVheCA9IGxjb2RlW2hvbGQgJiBsbWFza10gKi8KLQotIi5MX2RvbGVuOlxuIgotIiAgICAgICAgbW92YiAgICAlJWFoLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSB0aGlzLmJpdHMgKi8KLSIgICAgICAgIHN1YmIgICAgJSVhaCwgJSVibFxuIiAgICAgICAgICAgIC8qIGJpdHMgLT0gdGhpcy5iaXRzICovCi0iICAgICAgICBzaHJsICAgICUlY2wsICUlZWR4XG4iICAgICAgICAgICAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8KLQotIiAgICAgICAgdGVzdGIgICAlJWFsLCAlJWFsXG4iCi0iICAgICAgICBqbnogICAgIC5MX3Rlc3RfZm9yX2xlbmd0aF9iYXNlXG4iIC8qIGlmIChvcCAhPSAwKSA0NS43JSAqLwotCi0iICAgICAgICBzaHJsICAgICQxNiwgJSVlYXhcbiIgICAgICAgICAgICAvKiBvdXRwdXQgdGhpcy52YWwgY2hhciAqLwotIiAgICAgICAgc3Rvc2JcbiIKLSIgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdFxuIgotCi0iLmFsaWduIDMyLDB4OTBcbiIKLSIuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZTpcbiIKLSIgICAgICAgIG1vdmwgICAgJSVlYXgsICUlZWN4XG4iICAgICAgICAgIC8qIGxlbiA9IHRoaXMgKi8KLSIgICAgICAgIHNocmwgICAgJDE2LCAlJWVjeFxuIiAgICAgICAgICAgIC8qIGxlbiA9IHRoaXMudmFsICovCi0iICAgICAgICBtb3ZsICAgICUlZWN4LCA2NCglJWVzcClcbiIgICAgICAvKiBzYXZlIGxlbiAqLwotIiAgICAgICAgbW92YiAgICAlJWFsLCAlJWNsXG4iCi0KLSIgICAgICAgIHRlc3RiICAgJDE2LCAlJWFsXG4iCi0iICAgICAgICBqeiAgICAgIC5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGhcbiIgLyogaWYgKChvcCAmIDE2KSA9PSAwKSA4JSAqLwotIiAgICAgICAgYW5kYiAgICAkMTUsICUlY2xcbiIgICAgICAgICAgICAgLyogb3AgJj0gMTUgKi8KLSIgICAgICAgIGp6ICAgICAgLkxfZGVjb2RlX2Rpc3RhbmNlXG4iICAgIC8qIGlmICghb3ApICovCi0iICAgICAgICBjbXBiICAgICUlY2wsICUlYmxcbiIKLSIgICAgICAgIGphZSAgICAgLkxfYWRkX2JpdHNfdG9fbGVuXG4iICAgIC8qIGlmIChvcCA8PSBiaXRzKSAqLwotCi0iICAgICAgICBtb3ZiICAgICUlY2wsICUlY2hcbiIgICAgICAgICAgICAvKiBzdGFzaCBvcCBpbiBjaCwgZnJlZWluZyBjbCAqLwotIiAgICAgICAgeG9ybCAgICAlJWVheCwgJSVlYXhcbiIKLSIgICAgICAgIGxvZHN3XG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCi0iICAgICAgICBtb3ZiICAgICUlYmwsICUlY2xcbiIgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLwotIiAgICAgICAgYWRkYiAgICAkMTYsICUlYmxcbiIgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLwotIiAgICAgICAgc2hsbCAgICAlJWNsLCAlJWVheFxuIgotIiAgICAgICAgb3JsICAgICAlJWVheCwgJSVlZHhcbiIgICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8KLSIgICAgICAgIG1vdmIgICAgJSVjaCwgJSVjbFxuIiAgICAgICAgICAgIC8qIG1vdmUgb3AgYmFjayB0byBlY3ggKi8KLQotIi5MX2FkZF9iaXRzX3RvX2xlbjpcbiIKLSIgICAgICAgIHN1YmIgICAgJSVjbCwgJSVibFxuIgotIiAgICAgICAgeG9ybCAgICAlJWVheCwgJSVlYXhcbiIKLSIgICAgICAgIGluY2wgICAgJSVlYXhcbiIKLSIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKLSIgICAgICAgIGRlY2wgICAgJSVlYXhcbiIKLSIgICAgICAgIGFuZGwgICAgJSVlZHgsICUlZWF4XG4iICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCi0iICAgICAgICBzaHJsICAgICUlY2wsICUlZWR4XG4iCi0iICAgICAgICBhZGRsICAgICUlZWF4LCA2NCglJWVzcClcbiIgICAgICAvKiBsZW4gKz0gaG9sZCAmIG1hc2tbb3BdICovCi0KLSIuTF9kZWNvZGVfZGlzdGFuY2U6XG4iCi0iICAgICAgICBjbXBiICAgICQxNSwgJSVibFxuIgotIiAgICAgICAgamEgICAgICAuTF9nZXRfZGlzdGFuY2VfY29kZVxuIiAgLyogaWYgKDE1IDwgYml0cykgKi8KLQotIiAgICAgICAgeG9ybCAgICAlJWVheCwgJSVlYXhcbiIKLSIgICAgICAgIGxvZHN3XG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCi0iICAgICAgICBtb3ZiICAgICUlYmwsICUlY2xcbiIgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLwotIiAgICAgICAgYWRkYiAgICAkMTYsICUlYmxcbiIgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLwotIiAgICAgICAgc2hsbCAgICAlJWNsLCAlJWVheFxuIgotIiAgICAgICAgb3JsICAgICAlJWVheCwgJSVlZHhcbiIgICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8KLQotIi5MX2dldF9kaXN0YW5jZV9jb2RlOlxuIgotIiAgICAgICAgbW92bCAgICA2MCglJWVzcCksICUlZWF4XG4iICAgICAgLyogZWF4ID0gZG1hc2sgKi8KLSIgICAgICAgIG1vdmwgICAgMzYoJSVlc3ApLCAlJWVjeFxuIiAgICAgIC8qIGVjeCA9IGRjb2RlICovCi0iICAgICAgICBhbmRsICAgICUlZWR4LCAlJWVheFxuIiAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLwotIiAgICAgICAgbW92bCAgICAoJSVlY3gsJSVlYXgsNCksICUlZWF4XG4iLyogZWF4ID0gZGNvZGVbaG9sZCAmIGRtYXNrXSAqLwotCi0iLkxfZG9kaXN0OlxuIgotIiAgICAgICAgbW92bCAgICAlJWVheCwgJSVlYnBcbiIgICAgICAgICAgLyogZGlzdCA9IHRoaXMgKi8KLSIgICAgICAgIHNocmwgICAgJDE2LCAlJWVicFxuIiAgICAgICAgICAgIC8qIGRpc3QgPSB0aGlzLnZhbCAqLwotIiAgICAgICAgbW92YiAgICAlJWFoLCAlJWNsXG4iCi0iICAgICAgICBzdWJiICAgICUlYWgsICUlYmxcbiIgICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLwotIiAgICAgICAgc2hybCAgICAlJWNsLCAlJWVkeFxuIiAgICAgICAgICAgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovCi0iICAgICAgICBtb3ZiICAgICUlYWwsICUlY2xcbiIgICAgICAgICAgICAvKiBjbCA9IHRoaXMub3AgKi8KLQotIiAgICAgICAgdGVzdGIgICAkMTYsICUlYWxcbiIgICAgICAgICAgICAgLyogaWYgKChvcCAmIDE2KSA9PSAwKSAqLwotIiAgICAgICAganogICAgICAuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdFxuIgotIiAgICAgICAgYW5kYiAgICAkMTUsICUlY2xcbiIgICAgICAgICAgICAgLyogb3AgJj0gMTUgKi8KLSIgICAgICAgIGp6ICAgICAgLkxfY2hlY2tfZGlzdF9vbmVcbiIKLSIgICAgICAgIGNtcGIgICAgJSVjbCwgJSVibFxuIgotIiAgICAgICAgamFlICAgICAuTF9hZGRfYml0c190b19kaXN0XG4iICAgLyogaWYgKG9wIDw9IGJpdHMpIDk3LjYlICovCi0KLSIgICAgICAgIG1vdmIgICAgJSVjbCwgJSVjaFxuIiAgICAgICAgICAgIC8qIHN0YXNoIG9wIGluIGNoLCBmcmVlaW5nIGNsICovCi0iICAgICAgICB4b3JsICAgICUlZWF4LCAlJWVheFxuIgotIiAgICAgICAgbG9kc3dcbiIgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWwgPSAqKHVzaG9ydCAqKWluKysgKi8KLSIgICAgICAgIG1vdmIgICAgJSVibCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCi0iICAgICAgICBhZGRiICAgICQxNiwgJSVibFxuIiAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCi0iICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCi0iICAgICAgICBvcmwgICAgICUlZWF4LCAlJWVkeFxuIiAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCi0iICAgICAgICBtb3ZiICAgICUlY2gsICUlY2xcbiIgICAgICAgICAgICAvKiBtb3ZlIG9wIGJhY2sgdG8gZWN4ICovCi0KLSIuTF9hZGRfYml0c190b19kaXN0OlxuIgotIiAgICAgICAgc3ViYiAgICAlJWNsLCAlJWJsXG4iCi0iICAgICAgICB4b3JsICAgICUlZWF4LCAlJWVheFxuIgotIiAgICAgICAgaW5jbCAgICAlJWVheFxuIgotIiAgICAgICAgc2hsbCAgICAlJWNsLCAlJWVheFxuIgotIiAgICAgICAgZGVjbCAgICAlJWVheFxuIiAgICAgICAgICAgICAgICAgLyogKDEgPDwgb3ApIC0gMSAqLwotIiAgICAgICAgYW5kbCAgICAlJWVkeCwgJSVlYXhcbiIgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KLSIgICAgICAgIHNocmwgICAgJSVjbCwgJSVlZHhcbiIKLSIgICAgICAgIGFkZGwgICAgJSVlYXgsICUlZWJwXG4iICAgICAgICAgIC8qIGRpc3QgKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKSAqLwotCi0iLkxfY2hlY2tfd2luZG93OlxuIgotIiAgICAgICAgbW92bCAgICAlJWVzaSwgOCglJWVzcClcbiIgICAgICAgLyogc2F2ZSBpbiBzbyBmcm9tIGNhbiB1c2UgaXQncyByZWcgKi8KLSIgICAgICAgIG1vdmwgICAgJSVlZGksICUlZWF4XG4iCi0iICAgICAgICBzdWJsICAgIDIwKCUlZXNwKSwgJSVlYXhcbiIgICAgICAvKiBuYnl0ZXMgPSBvdXQgLSBiZWcgKi8KLQotIiAgICAgICAgY21wbCAgICAlJWVicCwgJSVlYXhcbiIKLSIgICAgICAgIGpiICAgICAgLkxfY2xpcF93aW5kb3dcbiIgICAgICAgIC8qIGlmIChkaXN0ID4gbmJ5dGVzKSA0LjIlICovCi0KLSIgICAgICAgIG1vdmwgICAgNjQoJSVlc3ApLCAlJWVjeFxuIiAgICAgIC8qIGVjeCA9IGxlbiAqLwotIiAgICAgICAgbW92bCAgICAlJWVkaSwgJSVlc2lcbiIKLSIgICAgICAgIHN1YmwgICAgJSVlYnAsICUlZXNpXG4iICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0KLSIgICAgICAgIHNhcmwgICAgJSVlY3hcbiIKLSIgICAgICAgIGpuYyAgICAgLkxfY29weV90d29cbiIgICAgICAgICAgIC8qIGlmIGxlbiAlIDIgPT0gMCAqLwotCi0iICAgICAgICByZXAgICAgIG1vdnN3XG4iCi0iICAgICAgICBtb3ZiICAgICglJWVzaSksICUlYWxcbiIKLSIgICAgICAgIG1vdmIgICAgJSVhbCwgKCUlZWRpKVxuIgotIiAgICAgICAgaW5jbCAgICAlJWVkaVxuIgotCi0iICAgICAgICBtb3ZsICAgIDgoJSVlc3ApLCAlJWVzaVxuIiAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCi0iICAgICAgICBtb3ZsICAgIDMyKCUlZXNwKSwgJSVlYnBcbiIgICAgICAvKiBlYnAgPSBsY29kZSAqLwotIiAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0XG4iCi0KLSIuTF9jb3B5X3R3bzpcbiIKLSIgICAgICAgIHJlcCAgICAgbW92c3dcbiIKLSIgICAgICAgIG1vdmwgICAgOCglJWVzcCksICUlZXNpXG4iICAgICAgIC8qIG1vdmUgaW4gYmFjayB0byAlZXNpLCB0b3NzIGZyb20gKi8KLSIgICAgICAgIG1vdmwgICAgMzIoJSVlc3ApLCAlJWVicFxuIiAgICAgIC8qIGVicCA9IGxjb2RlICovCi0iICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RcbiIKLQotIi5hbGlnbiAzMiwweDkwXG4iCi0iLkxfY2hlY2tfZGlzdF9vbmU6XG4iCi0iICAgICAgICBjbXBsICAgICQxLCAlJWVicFxuIiAgICAgICAgICAgIC8qIGlmIGRpc3QgMSwgaXMgYSBtZW1zZXQgKi8KLSIgICAgICAgIGpuZSAgICAgLkxfY2hlY2tfd2luZG93XG4iCi0iICAgICAgICBjbXBsICAgICUlZWRpLCAyMCglJWVzcClcbiIKLSIgICAgICAgIGplICAgICAgLkxfY2hlY2tfd2luZG93XG4iICAgICAgLyogb3V0ID09IGJlZywgaWYgb3V0c2lkZSB3aW5kb3cgKi8KLQotIiAgICAgICAgbW92bCAgICA2NCglJWVzcCksICUlZWN4XG4iICAgICAgLyogZWN4ID0gbGVuICovCi0iICAgICAgICBtb3ZiICAgIC0xKCUlZWRpKSwgJSVhbFxuIgotIiAgICAgICAgbW92YiAgICAlJWFsLCAlJWFoXG4iCi0KLSIgICAgICAgIHNhcmwgICAgJSVlY3hcbiIKLSIgICAgICAgIGpuYyAgICAgLkxfc2V0X3R3b1xuIgotIiAgICAgICAgbW92YiAgICAlJWFsLCAoJSVlZGkpXG4iCi0iICAgICAgICBpbmNsICAgICUlZWRpXG4iCi0KLSIuTF9zZXRfdHdvOlxuIgotIiAgICAgICAgcmVwICAgICBzdG9zd1xuIgotIiAgICAgICAgbW92bCAgICAzMiglJWVzcCksICUlZWJwXG4iICAgICAgLyogZWJwID0gbGNvZGUgKi8KLSIgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdFxuIgotCi0iLmFsaWduIDMyLDB4OTBcbiIKLSIuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoOlxuIgotIiAgICAgICAgdGVzdGIgICAkNjQsICUlYWxcbiIKLSIgICAgICAgIGpueiAgICAgLkxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrXG4iIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KLQotIiAgICAgICAgeG9ybCAgICAlJWVheCwgJSVlYXhcbiIKLSIgICAgICAgIGluY2wgICAgJSVlYXhcbiIKLSIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKLSIgICAgICAgIGRlY2wgICAgJSVlYXhcbiIKLSIgICAgICAgIGFuZGwgICAgJSVlZHgsICUlZWF4XG4iICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KLSIgICAgICAgIGFkZGwgICAgNjQoJSVlc3ApLCAlJWVheFxuIiAgICAgLyogZWF4ICs9IGxlbiAqLwotIiAgICAgICAgbW92bCAgICAoJSVlYnAsJSVlYXgsNCksICUlZWF4XG4iIC8qIGVheCA9IGxjb2RlW3ZhbCsoaG9sZCZtYXNrW29wXSldKi8KLSIgICAgICAgIGptcCAgICAgLkxfZG9sZW5cbiIKLQotIi5hbGlnbiAzMiwweDkwXG4iCi0iLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3Q6XG4iCi0iICAgICAgICB0ZXN0YiAgICQ2NCwgJSVhbFxuIgotIiAgICAgICAgam56ICAgICAuTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGVcbiIgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLwotCi0iICAgICAgICB4b3JsICAgICUlZWF4LCAlJWVheFxuIgotIiAgICAgICAgaW5jbCAgICAlJWVheFxuIgotIiAgICAgICAgc2hsbCAgICAlJWNsLCAlJWVheFxuIgotIiAgICAgICAgZGVjbCAgICAlJWVheFxuIgotIiAgICAgICAgYW5kbCAgICAlJWVkeCwgJSVlYXhcbiIgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLwotIiAgICAgICAgYWRkbCAgICAlJWVicCwgJSVlYXhcbiIgICAgICAgICAvKiBlYXggKz0gZGlzdCAqLwotIiAgICAgICAgbW92bCAgICAzNiglJWVzcCksICUlZWN4XG4iICAgICAvKiBlY3ggPSBkY29kZSAqLwotIiAgICAgICAgbW92bCAgICAoJSVlY3gsJSVlYXgsNCksICUlZWF4XG4iIC8qIGVheCA9IGRjb2RlW3ZhbCsoaG9sZCZtYXNrW29wXSldKi8KLSIgICAgICAgIGptcCAgICAgLkxfZG9kaXN0XG4iCi0KLSIuYWxpZ24gMzIsMHg5MFxuIgotIi5MX2NsaXBfd2luZG93OlxuIgotIiAgICAgICAgbW92bCAgICAlJWVheCwgJSVlY3hcbiIKLSIgICAgICAgIG1vdmwgICAgNDgoJSVlc3ApLCAlJWVheFxuIiAgICAgLyogZWF4ID0gd3NpemUgKi8KLSIgICAgICAgIG5lZ2wgICAgJSVlY3hcbiIgICAgICAgICAgICAgICAgLyogbmJ5dGVzID0gLW5ieXRlcyAqLwotIiAgICAgICAgbW92bCAgICAyOCglJWVzcCksICUlZXNpXG4iICAgICAvKiBmcm9tID0gd2luZG93ICovCi0KLSIgICAgICAgIGNtcGwgICAgJSVlYnAsICUlZWF4XG4iCi0iICAgICAgICBqYiAgICAgIC5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhclxuIiAvKiBpZiAoZGlzdCA+IHdzaXplKSAqLwotCi0iICAgICAgICBhZGRsICAgICUlZWJwLCAlJWVjeFxuIiAgICAgICAgIC8qIG5ieXRlcyA9IGRpc3QgLSBuYnl0ZXMgKi8KLSIgICAgICAgIGNtcGwgICAgJDAsIDUyKCUlZXNwKVxuIgotIiAgICAgICAgam5lICAgICAuTF93cmFwX2Fyb3VuZF93aW5kb3dcbiIgLyogaWYgKHdyaXRlICE9IDApICovCi0KLSIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iCi0iICAgICAgICBhZGRsICAgICUlZWF4LCAlJWVzaVxuIiAgICAgICAgIC8qIGZyb20gKz0gd3NpemUgLSBuYnl0ZXMgKi8KLQotIiAgICAgICAgbW92bCAgICA2NCglJWVzcCksICUlZWF4XG4iICAgICAvKiBlYXggPSBsZW4gKi8KLSIgICAgICAgIGNtcGwgICAgJSVlY3gsICUlZWF4XG4iCi0iICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHlcbiIgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0iICAgICAgICBzdWJsICAgICUlZWN4LCAlJWVheFxuIiAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KLSIgICAgICAgIHJlcCAgICAgbW92c2JcbiIKLSIgICAgICAgIG1vdmwgICAgJSVlZGksICUlZXNpXG4iCi0iICAgICAgICBzdWJsICAgICUlZWJwLCAlJWVzaVxuIiAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0iICAgICAgICBqbXAgICAgIC5MX2RvX2NvcHlcbiIKLQotIi5hbGlnbiAzMiwweDkwXG4iCi0iLkxfd3JhcF9hcm91bmRfd2luZG93OlxuIgotIiAgICAgICAgbW92bCAgICA1MiglJWVzcCksICUlZWF4XG4iICAgICAvKiBlYXggPSB3cml0ZSAqLwotIiAgICAgICAgY21wbCAgICAlJWVheCwgJSVlY3hcbiIKLSIgICAgICAgIGpiZSAgICAgLkxfY29udGlndW91c19pbl93aW5kb3dcbiIgLyogaWYgKHdyaXRlID49IG5ieXRlcykgKi8KLQotIiAgICAgICAgYWRkbCAgICA0OCglJWVzcCksICUlZXNpXG4iICAgICAvKiBmcm9tICs9IHdzaXplICovCi0iICAgICAgICBhZGRsICAgICUlZWF4LCAlJWVzaVxuIiAgICAgICAgIC8qIGZyb20gKz0gd3JpdGUgKi8KLSIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZXNpXG4iICAgICAgICAgLyogZnJvbSAtPSBuYnl0ZXMgKi8KLSIgICAgICAgIHN1YmwgICAgJSVlYXgsICUlZWN4XG4iICAgICAgICAgLyogbmJ5dGVzIC09IHdyaXRlICovCi0KLSIgICAgICAgIG1vdmwgICAgNjQoJSVlc3ApLCAlJWVheFxuIiAgICAgLyogZWF4ID0gbGVuICovCi0iICAgICAgICBjbXBsICAgICUlZWN4LCAlJWVheFxuIgotIiAgICAgICAgamJlICAgICAuTF9kb19jb3B5XG4iICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KLQotIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlYXhcbiIgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCi0iICAgICAgICByZXAgICAgIG1vdnNiXG4iCi0iICAgICAgICBtb3ZsICAgIDI4KCUlZXNwKSwgJSVlc2lcbiIgICAgIC8qIGZyb20gPSB3aW5kb3cgKi8KLSIgICAgICAgIG1vdmwgICAgNTIoJSVlc3ApLCAlJWVjeFxuIiAgICAgLyogbmJ5dGVzID0gd3JpdGUgKi8KLSIgICAgICAgIGNtcGwgICAgJSVlY3gsICUlZWF4XG4iCi0iICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHlcbiIgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0iICAgICAgICBzdWJsICAgICUlZWN4LCAlJWVheFxuIiAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KLSIgICAgICAgIHJlcCAgICAgbW92c2JcbiIKLSIgICAgICAgIG1vdmwgICAgJSVlZGksICUlZXNpXG4iCi0iICAgICAgICBzdWJsICAgICUlZWJwLCAlJWVzaVxuIiAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0iICAgICAgICBqbXAgICAgIC5MX2RvX2NvcHlcbiIKLQotIi5hbGlnbiAzMiwweDkwXG4iCi0iLkxfY29udGlndW91c19pbl93aW5kb3c6XG4iCi0iICAgICAgICBhZGRsICAgICUlZWF4LCAlJWVzaVxuIgotIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlc2lcbiIgICAgICAgICAvKiBmcm9tICs9IHdyaXRlIC0gbmJ5dGVzICovCi0KLSIgICAgICAgIG1vdmwgICAgNjQoJSVlc3ApLCAlJWVheFxuIiAgICAgLyogZWF4ID0gbGVuICovCi0iICAgICAgICBjbXBsICAgICUlZWN4LCAlJWVheFxuIgotIiAgICAgICAgamJlICAgICAuTF9kb19jb3B5XG4iICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KLQotIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlYXhcbiIgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCi0iICAgICAgICByZXAgICAgIG1vdnNiXG4iCi0iICAgICAgICBtb3ZsICAgICUlZWRpLCAlJWVzaVxuIgotIiAgICAgICAgc3VibCAgICAlJWVicCwgJSVlc2lcbiIgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLwotIiAgICAgICAgam1wICAgICAuTF9kb19jb3B5XG4iICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KLQotIi5hbGlnbiAzMiwweDkwXG4iCi0iLkxfZG9fY29weTpcbiIKLSIgICAgICAgIG1vdmwgICAgJSVlYXgsICUlZWN4XG4iCi0iICAgICAgICByZXAgICAgIG1vdnNiXG4iCi0KLSIgICAgICAgIG1vdmwgICAgOCglJWVzcCksICUlZXNpXG4iICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLwotIiAgICAgICAgbW92bCAgICAzMiglJWVzcCksICUlZWJwXG4iICAgICAvKiBlYnAgPSBsY29kZSAqLwotIiAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0XG4iCi0KLSIuTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2s6XG4iCi0iICAgICAgICB0ZXN0YiAgICQzMiwgJSVhbFxuIgotIiAgICAgICAganogICAgICAuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVcbiIKLSIgICAgICAgIG1vdmwgICAgJDEsIDcyKCUlZXNwKVxuIgotIiAgICAgICAgam1wICAgICAuTF9icmVha19sb29wX3dpdGhfc3RhdHVzXG4iCi0KLSIuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGU6XG4iCi0iICAgICAgICBtb3ZsICAgICQyLCA3MiglJWVzcClcbiIKLSIgICAgICAgIGptcCAgICAgLkxfYnJlYWtfbG9vcF93aXRoX3N0YXR1c1xuIgotCi0iLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlOlxuIgotIiAgICAgICAgbW92bCAgICAkMywgNzIoJSVlc3ApXG4iCi0iICAgICAgICBqbXAgICAgIC5MX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXNcbiIKLQotIi5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhcjpcbiIKLSIgICAgICAgIG1vdmwgICAgOCglJWVzcCksICUlZXNpXG4iCi0iICAgICAgICBtb3ZsICAgICQ0LCA3MiglJWVzcClcbiIKLSIgICAgICAgIGptcCAgICAgLkxfYnJlYWtfbG9vcF93aXRoX3N0YXR1c1xuIgotCi0iLkxfYnJlYWtfbG9vcDpcbiIKLSIgICAgICAgIG1vdmwgICAgJDAsIDcyKCUlZXNwKVxuIgotCi0iLkxfYnJlYWtfbG9vcF93aXRoX3N0YXR1czpcbiIKLS8qIHB1dCBpbiwgb3V0LCBiaXRzLCBhbmQgaG9sZCBiYWNrIGludG8gYXIgYW5kIHBvcCBlc3AgKi8KLSIgICAgICAgIG1vdmwgICAgJSVlc2ksIDgoJSVlc3ApXG4iICAgICAgLyogc2F2ZSBpbiAqLwotIiAgICAgICAgbW92bCAgICAlJWVkaSwgMTYoJSVlc3ApXG4iICAgICAvKiBzYXZlIG91dCAqLwotIiAgICAgICAgbW92bCAgICAlJWVieCwgNDQoJSVlc3ApXG4iICAgICAvKiBzYXZlIGJpdHMgKi8KLSIgICAgICAgIG1vdmwgICAgJSVlZHgsIDQwKCUlZXNwKVxuIiAgICAgLyogc2F2ZSBob2xkICovCi0iICAgICAgICBtb3ZsICAgIDQoJSVlc3ApLCAlJWVicFxuIiAgICAgIC8qIHJlc3RvcmUgZXNwLCBlYnAgKi8KLSIgICAgICAgIG1vdmwgICAgKCUlZXNwKSwgJSVlc3BcbiIKLSAgICAgICAgICA6Ci0gICAgICAgICAgOiAibSIgKGFyKQotICAgICAgICAgIDogIm1lbW9yeSIsICIlZWF4IiwgIiVlYngiLCAiJWVjeCIsICIlZWR4IiwgIiVlc2kiLCAiJWVkaSIKLSAgICApOwotI2VsaWYgZGVmaW5lZCggX01TQ19WRVIgKSAmJiAhIGRlZmluZWQoIF9NX0FNRDY0ICkKLSAgICBfX2FzbSB7Ci0JbGVhCWVheCwgYXIKLQltb3YJW2VheF0sIGVzcCAgICAgICAgIC8qIHNhdmUgZXNwLCBlYnAgKi8KLQltb3YJW2VheCs0XSwgZWJwCi0JbW92CWVzcCwgZWF4Ci0JbW92CWVzaSwgW2VzcCs4XSAgICAgICAvKiBlc2kgPSBpbiAqLwotCW1vdgllZGksIFtlc3ArMTZdICAgICAgLyogZWRpID0gb3V0ICovCi0JbW92CWVkeCwgW2VzcCs0MF0gICAgICAvKiBlZHggPSBob2xkICovCi0JbW92CWVieCwgW2VzcCs0NF0gICAgICAvKiBlYnggPSBiaXRzICovCi0JbW92CWVicCwgW2VzcCszMl0gICAgICAvKiBlYnAgPSBsY29kZSAqLwotCi0JY2xkCi0Jam1wCUxfZG9fbG9vcAotCi1BTElHTiA0Ci1MX3doaWxlX3Rlc3Q6Ci0JY21wCVtlc3ArMjRdLCBlZGkKLQlqYmUJTF9icmVha19sb29wCi0JY21wCVtlc3ArMTJdLCBlc2kKLQlqYmUJTF9icmVha19sb29wCi0KLUxfZG9fbG9vcDoKLQljbXAJYmwsIDE1Ci0JamEJTF9nZXRfbGVuZ3RoX2NvZGUgICAgLyogaWYgKDE1IDwgYml0cykgKi8KLQotCXhvcgllYXgsIGVheAotCWxvZHN3ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCi0JbW92CWNsLCBibCAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCi0JYWRkCWJsLCAxNiAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCi0Jc2hsCWVheCwgY2wKLQlvcgllZHgsIGVheCAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCi0KLUxfZ2V0X2xlbmd0aF9jb2RlOgotCW1vdgllYXgsIFtlc3ArNTZdICAgICAgLyogZWF4ID0gbG1hc2sgKi8KLQlhbmQJZWF4LCBlZHggICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KLQltb3YJZWF4LCBbZWJwK2VheCo0XSAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCi0KLUxfZG9sZW46Ci0JbW92CWNsLCBhaCAgICAgICAgICAgIC8qIGNsID0gdGhpcy5iaXRzICovCi0Jc3ViCWJsLCBhaCAgICAgICAgICAgIC8qIGJpdHMgLT0gdGhpcy5iaXRzICovCi0Jc2hyCWVkeCwgY2wgICAgICAgICAgIC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLwotCi0JdGVzdAlhbCwgYWwKLQlqbnoJTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZSAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8KLQotCXNocgllYXgsIDE2ICAgICAgICAgICAgLyogb3V0cHV0IHRoaXMudmFsIGNoYXIgKi8KLQlzdG9zYgotCWptcAlMX3doaWxlX3Rlc3QKLQotQUxJR04gNAotTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZToKLQltb3YJZWN4LCBlYXggICAgICAgICAgLyogbGVuID0gdGhpcyAqLwotCXNocgllY3gsIDE2ICAgICAgICAgICAgLyogbGVuID0gdGhpcy52YWwgKi8KLQltb3YJW2VzcCs2NF0sIGVjeCAgICAgIC8qIHNhdmUgbGVuICovCi0JbW92CWNsLCBhbAotCi0JdGVzdAlhbCwgMTYKLQlqeglMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGggLyogaWYgKChvcCAmIDE2KSA9PSAwKSA4JSAqLwotCWFuZAljbCwgMTUgICAgICAgICAgICAgLyogb3AgJj0gMTUgKi8KLQlqeglMX2RlY29kZV9kaXN0YW5jZSAgICAvKiBpZiAoIW9wKSAqLwotCWNtcAlibCwgY2wKLQlqYWUJTF9hZGRfYml0c190b19sZW4gICAgLyogaWYgKG9wIDw9IGJpdHMpICovCi0KLQltb3YJY2gsIGNsICAgICAgICAgICAgLyogc3Rhc2ggb3AgaW4gY2gsIGZyZWVpbmcgY2wgKi8KLQl4b3IJZWF4LCBlYXgKLQlsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLwotCW1vdgljbCwgYmwgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLwotCWFkZAlibCwgMTYgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLwotCXNobAllYXgsIGNsCi0Jb3IJZWR4LCBlYXggICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8KLQltb3YJY2wsIGNoICAgICAgICAgICAgLyogbW92ZSBvcCBiYWNrIHRvIGVjeCAqLwotCi1MX2FkZF9iaXRzX3RvX2xlbjoKLQlzdWIJYmwsIGNsCi0JeG9yCWVheCwgZWF4Ci0JaW5jCWVheAotCXNobAllYXgsIGNsCi0JZGVjCWVheAotCWFuZAllYXgsIGVkeCAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLwotCXNocgllZHgsIGNsCi0JYWRkCVtlc3ArNjRdLCBlYXggICAgICAvKiBsZW4gKz0gaG9sZCAmIG1hc2tbb3BdICovCi0KLUxfZGVjb2RlX2Rpc3RhbmNlOgotCWNtcAlibCwgMTUKLQlqYQlMX2dldF9kaXN0YW5jZV9jb2RlICAvKiBpZiAoMTUgPCBiaXRzKSAqLwotCi0JeG9yCWVheCwgZWF4Ci0JbG9kc3cgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWwgPSAqKHVzaG9ydCAqKWluKysgKi8KLQltb3YJY2wsIGJsICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KLQlhZGQJYmwsIDE2ICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KLQlzaGwJZWF4LCBjbAotCW9yCWVkeCwgZWF4ICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCi0KLUxfZ2V0X2Rpc3RhbmNlX2NvZGU6Ci0JbW92CWVheCwgW2VzcCs2MF0gICAgICAvKiBlYXggPSBkbWFzayAqLwotCW1vdgllY3gsIFtlc3ArMzZdICAgICAgLyogZWN4ID0gZGNvZGUgKi8KLQlhbmQJZWF4LCBlZHggICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KLQltb3YJZWF4LCBbZWN4K2VheCo0XS8qIGVheCA9IGRjb2RlW2hvbGQgJiBkbWFza10gKi8KLQotTF9kb2Rpc3Q6Ci0JbW92CWVicCwgZWF4ICAgICAgICAgIC8qIGRpc3QgPSB0aGlzICovCi0Jc2hyCWVicCwgMTYgICAgICAgICAgICAvKiBkaXN0ID0gdGhpcy52YWwgKi8KLQltb3YJY2wsIGFoCi0Jc3ViCWJsLCBhaCAgICAgICAgICAgIC8qIGJpdHMgLT0gdGhpcy5iaXRzICovCi0Jc2hyCWVkeCwgY2wgICAgICAgICAgIC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLwotCW1vdgljbCwgYWwgICAgICAgICAgICAvKiBjbCA9IHRoaXMub3AgKi8KLQotCXRlc3QJYWwsIDE2ICAgICAgICAgICAgIC8qIGlmICgob3AgJiAxNikgPT0gMCkgKi8KLQlqeglMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0Ci0JYW5kCWNsLCAxNSAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLwotCWp6CUxfY2hlY2tfZGlzdF9vbmUKLQljbXAJYmwsIGNsCi0JamFlCUxfYWRkX2JpdHNfdG9fZGlzdCAgIC8qIGlmIChvcCA8PSBiaXRzKSA5Ny42JSAqLwotCi0JbW92CWNoLCBjbCAgICAgICAgICAgIC8qIHN0YXNoIG9wIGluIGNoLCBmcmVlaW5nIGNsICovCi0JeG9yCWVheCwgZWF4Ci0JbG9kc3cgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWwgPSAqKHVzaG9ydCAqKWluKysgKi8KLQltb3YJY2wsIGJsICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KLQlhZGQJYmwsIDE2ICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KLQlzaGwJZWF4LCBjbAotCW9yCWVkeCwgZWF4ICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8KLQltb3YJY2wsIGNoICAgICAgICAgICAgLyogbW92ZSBvcCBiYWNrIHRvIGVjeCAqLwotCi1MX2FkZF9iaXRzX3RvX2Rpc3Q6Ci0Jc3ViCWJsLCBjbAotCXhvcgllYXgsIGVheAotCWluYwllYXgKLQlzaGwJZWF4LCBjbAotCWRlYwllYXggICAgICAgICAgICAgICAgIC8qICgxIDw8IG9wKSAtIDEgKi8KLQlhbmQJZWF4LCBlZHggICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KLQlzaHIJZWR4LCBjbAotCWFkZAllYnAsIGVheCAgICAgICAgICAvKiBkaXN0ICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkgKi8KLQotTF9jaGVja193aW5kb3c6Ci0JbW92CVtlc3ArOF0sIGVzaSAgICAgICAvKiBzYXZlIGluIHNvIGZyb20gY2FuIHVzZSBpdCdzIHJlZyAqLwotCW1vdgllYXgsIGVkaQotCXN1YgllYXgsIFtlc3ArMjBdICAgICAgLyogbmJ5dGVzID0gb3V0IC0gYmVnICovCi0KLQljbXAJZWF4LCBlYnAKLQlqYglMX2NsaXBfd2luZG93ICAgICAgICAvKiBpZiAoZGlzdCA+IG5ieXRlcykgNC4yJSAqLwotCi0JbW92CWVjeCwgW2VzcCs2NF0gICAgICAvKiBlY3ggPSBsZW4gKi8KLQltb3YJZXNpLCBlZGkKLQlzdWIJZXNpLCBlYnAgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KLQotCXNhcgllY3gsIDEKLQlqbmMJTF9jb3B5X3R3bwotCi0JcmVwICAgICBtb3ZzdwotCW1vdglhbCwgW2VzaV0KLQltb3YJW2VkaV0sIGFsCi0JaW5jCWVkaQotCi0JbW92CWVzaSwgW2VzcCs4XSAgICAgIC8qIG1vdmUgaW4gYmFjayB0byAlZXNpLCB0b3NzIGZyb20gKi8KLQltb3YJZWJwLCBbZXNwKzMyXSAgICAgLyogZWJwID0gbGNvZGUgKi8KLQlqbXAJTF93aGlsZV90ZXN0Ci0KLUxfY29weV90d286Ci0JcmVwICAgICBtb3ZzdwotCW1vdgllc2ksIFtlc3ArOF0gICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCi0JbW92CWVicCwgW2VzcCszMl0gICAgIC8qIGVicCA9IGxjb2RlICovCi0Jam1wCUxfd2hpbGVfdGVzdAotCi1BTElHTiA0Ci1MX2NoZWNrX2Rpc3Rfb25lOgotCWNtcAllYnAsIDEgICAgICAgICAgICAvKiBpZiBkaXN0IDEsIGlzIGEgbWVtc2V0ICovCi0Jam5lCUxfY2hlY2tfd2luZG93Ci0JY21wCVtlc3ArMjBdLCBlZGkKLQlqZQlMX2NoZWNrX3dpbmRvdyAgICAvKiBvdXQgPT0gYmVnLCBpZiBvdXRzaWRlIHdpbmRvdyAqLwotCi0JbW92CWVjeCwgW2VzcCs2NF0gICAgIC8qIGVjeCA9IGxlbiAqLwotCW1vdglhbCwgW2VkaS0xXQotCW1vdglhaCwgYWwKLQotCXNhcgllY3gsIDEKLQlqbmMJTF9zZXRfdHdvCi0JbW92CVtlZGldLCBhbCAgICAgICAgIC8qIG1lbXNldCBvdXQgd2l0aCBmcm9tWy0xXSAqLwotCWluYwllZGkKLQotTF9zZXRfdHdvOgotCXJlcCAgICAgc3Rvc3cKLQltb3YJZWJwLCBbZXNwKzMyXSAgICAgLyogZWJwID0gbGNvZGUgKi8KLQlqbXAJTF93aGlsZV90ZXN0Ci0KLUFMSUdOIDQKLUxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aDoKLQl0ZXN0CWFsLCA2NAotCWpueglMX3Rlc3RfZm9yX2VuZF9vZl9ibG9jayAvKiBpZiAoKG9wICYgNjQpICE9IDApICovCi0KLQl4b3IJZWF4LCBlYXgKLQlpbmMJZWF4Ci0Jc2hsCWVheCwgY2wKLQlkZWMJZWF4Ci0JYW5kCWVheCwgZWR4ICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KLQlhZGQJZWF4LCBbZXNwKzY0XSAgICAgLyogZWF4ICs9IGxlbiAqLwotCW1vdgllYXgsIFtlYnArZWF4KjRdIC8qIGVheCA9IGxjb2RlW3ZhbCsoaG9sZCZtYXNrW29wXSldKi8KLQlqbXAJTF9kb2xlbgotCi1BTElHTiA0Ci1MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0OgotCXRlc3QJYWwsIDY0Ci0Jam56CUxfaW52YWxpZF9kaXN0YW5jZV9jb2RlIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KLQotCXhvcgllYXgsIGVheAotCWluYwllYXgKLQlzaGwJZWF4LCBjbAotCWRlYwllYXgKLQlhbmQJZWF4LCBlZHggICAgICAgICAvKiBlYXggJj0gaG9sZCAqLwotCWFkZAllYXgsIGVicCAgICAgICAgIC8qIGVheCArPSBkaXN0ICovCi0JbW92CWVjeCwgW2VzcCszNl0gICAgIC8qIGVjeCA9IGRjb2RlICovCi0JbW92CWVheCwgW2VjeCtlYXgqNF0gLyogZWF4ID0gZGNvZGVbdmFsKyhob2xkJm1hc2tbb3BdKV0qLwotCWptcAlMX2RvZGlzdAotCi1BTElHTiA0Ci1MX2NsaXBfd2luZG93OgotCW1vdgllY3gsIGVheAotCW1vdgllYXgsIFtlc3ArNDhdICAgICAvKiBlYXggPSB3c2l6ZSAqLwotCW5lZwllY3ggICAgICAgICAgICAgICAgLyogbmJ5dGVzID0gLW5ieXRlcyAqLwotCW1vdgllc2ksIFtlc3ArMjhdICAgICAvKiBmcm9tID0gd2luZG93ICovCi0KLQljbXAJZWF4LCBlYnAKLQlqYglMX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhciAvKiBpZiAoZGlzdCA+IHdzaXplKSAqLwotCi0JYWRkCWVjeCwgZWJwICAgICAgICAgLyogbmJ5dGVzID0gZGlzdCAtIG5ieXRlcyAqLwotCWNtcAlkd29yZCBwdHIgW2VzcCs1Ml0sIDAKLQlqbmUJTF93cmFwX2Fyb3VuZF93aW5kb3cgLyogaWYgKHdyaXRlICE9IDApICovCi0KLQlzdWIJZWF4LCBlY3gKLQlhZGQJZXNpLCBlYXggICAgICAgICAvKiBmcm9tICs9IHdzaXplIC0gbmJ5dGVzICovCi0KLQltb3YJZWF4LCBbZXNwKzY0XSAgICAvKiBlYXggPSBsZW4gKi8KLQljbXAJZWF4LCBlY3gKLQlqYmUJTF9kb19jb3B5ICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0Jc3ViCWVheCwgZWN4ICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLwotCXJlcCAgICAgbW92c2IKLQltb3YJZXNpLCBlZGkKLQlzdWIJZXNpLCBlYnAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLwotCWptcAlMX2RvX2NvcHkKLQotQUxJR04gNAotTF93cmFwX2Fyb3VuZF93aW5kb3c6Ci0JbW92CWVheCwgW2VzcCs1Ml0gICAgLyogZWF4ID0gd3JpdGUgKi8KLQljbXAJZWN4LCBlYXgKLQlqYmUJTF9jb250aWd1b3VzX2luX3dpbmRvdyAvKiBpZiAod3JpdGUgPj0gbmJ5dGVzKSAqLwotCi0JYWRkCWVzaSwgW2VzcCs0OF0gICAgLyogZnJvbSArPSB3c2l6ZSAqLwotCWFkZAllc2ksIGVheCAgICAgICAgIC8qIGZyb20gKz0gd3JpdGUgKi8KLQlzdWIJZXNpLCBlY3ggICAgICAgICAvKiBmcm9tIC09IG5ieXRlcyAqLwotCXN1YgllY3gsIGVheCAgICAgICAgIC8qIG5ieXRlcyAtPSB3cml0ZSAqLwotCi0JbW92CWVheCwgW2VzcCs2NF0gICAgLyogZWF4ID0gbGVuICovCi0JY21wCWVheCwgZWN4Ci0JamJlCUxfZG9fY29weSAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KLQotCXN1YgllYXgsIGVjeCAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KLQlyZXAgICAgIG1vdnNiCi0JbW92CWVzaSwgW2VzcCsyOF0gICAgIC8qIGZyb20gPSB3aW5kb3cgKi8KLQltb3YJZWN4LCBbZXNwKzUyXSAgICAgLyogbmJ5dGVzID0gd3JpdGUgKi8KLQljbXAJZWF4LCBlY3gKLQlqYmUJTF9kb19jb3B5ICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0Jc3ViCWVheCwgZWN4ICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLwotCXJlcCAgICAgbW92c2IKLQltb3YJZXNpLCBlZGkKLQlzdWIJZXNpLCBlYnAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLwotCWptcAlMX2RvX2NvcHkKLQotQUxJR04gNAotTF9jb250aWd1b3VzX2luX3dpbmRvdzoKLQlhZGQJZXNpLCBlYXgKLQlzdWIJZXNpLCBlY3ggICAgICAgICAvKiBmcm9tICs9IHdyaXRlIC0gbmJ5dGVzICovCi0KLQltb3YJZWF4LCBbZXNwKzY0XSAgICAvKiBlYXggPSBsZW4gKi8KLQljbXAJZWF4LCBlY3gKLQlqYmUJTF9kb19jb3B5ICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0Jc3ViCWVheCwgZWN4ICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLwotCXJlcCAgICAgbW92c2IKLQltb3YJZXNpLCBlZGkKLQlzdWIJZXNpLCBlYnAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLwotCWptcAlMX2RvX2NvcHkKLQotQUxJR04gNAotTF9kb19jb3B5OgotCW1vdgllY3gsIGVheAotCXJlcCAgICAgbW92c2IKLQotCW1vdgllc2ksIFtlc3ArOF0gICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCi0JbW92CWVicCwgW2VzcCszMl0gICAgIC8qIGVicCA9IGxjb2RlICovCi0Jam1wCUxfd2hpbGVfdGVzdAotCi1MX3Rlc3RfZm9yX2VuZF9vZl9ibG9jazoKLQl0ZXN0CWFsLCAzMgotCWp6CUxfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlCi0JbW92CWR3b3JkIHB0ciBbZXNwKzcyXSwgMQotCWptcAlMX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXMKLQotTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGU6Ci0JbW92CWR3b3JkIHB0ciBbZXNwKzcyXSwgMgotCWptcAlMX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXMKLQotTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGU6Ci0JbW92CWR3b3JkIHB0ciBbZXNwKzcyXSwgMwotCWptcAlMX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXMKLQotTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXI6Ci0JbW92CWVzaSwgW2VzcCs0XQotCW1vdglkd29yZCBwdHIgW2VzcCs3Ml0sIDQKLQlqbXAJTF9icmVha19sb29wX3dpdGhfc3RhdHVzCi0KLUxfYnJlYWtfbG9vcDoKLQltb3YJZHdvcmQgcHRyIFtlc3ArNzJdLCAwCi0KLUxfYnJlYWtfbG9vcF93aXRoX3N0YXR1czoKLS8qIHB1dCBpbiwgb3V0LCBiaXRzLCBhbmQgaG9sZCBiYWNrIGludG8gYXIgYW5kIHBvcCBlc3AgKi8KLQltb3YJW2VzcCs4XSwgZXNpICAgICAvKiBzYXZlIGluICovCi0JbW92CVtlc3ArMTZdLCBlZGkgICAgLyogc2F2ZSBvdXQgKi8KLQltb3YJW2VzcCs0NF0sIGVieCAgICAvKiBzYXZlIGJpdHMgKi8KLQltb3YJW2VzcCs0MF0sIGVkeCAgICAvKiBzYXZlIGhvbGQgKi8KLQltb3YJZWJwLCBbZXNwKzRdICAgICAvKiByZXN0b3JlIGVzcCwgZWJwICovCi0JbW92CWVzcCwgW2VzcF0KLSAgICB9Ci0jZWxzZQotI2Vycm9yICJ4ODYgYXJjaGl0ZWN0dXJlIG5vdCBkZWZpbmVkIgotI2VuZGlmCi0KLSAgICBpZiAoYXIuc3RhdHVzID4gMSkgewotICAgICAgICBpZiAoYXIuc3RhdHVzID09IDIpCi0gICAgICAgICAgICBzdHJtLT5tc2cgPSAiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKLSAgICAgICAgZWxzZSBpZiAoYXIuc3RhdHVzID09IDMpCi0gICAgICAgICAgICBzdHJtLT5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RybS0+bXNnID0gImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKLSAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBhci5zdGF0dXMgPT0gMSApIHsKLSAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOwotICAgIH0KLQotICAgIC8qIHJldHVybiB1bnVzZWQgYnl0ZXMgKG9uIGVudHJ5LCBiaXRzIDwgOCwgc28gaW4gd29uJ3QgZ28gdG9vIGZhciBiYWNrKSAqLwotICAgIGFyLmxlbiA9IGFyLmJpdHMgPj4gMzsKLSAgICBhci5pbiAtPSBhci5sZW47Ci0gICAgYXIuYml0cyAtPSBhci5sZW4gPDwgMzsKLSAgICBhci5ob2xkICY9ICgxVSA8PCBhci5iaXRzKSAtIDE7Ci0KLSAgICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJldHVybiAqLwotICAgIHN0cm0tPm5leHRfaW4gPSBhci5pbjsKLSAgICBzdHJtLT5uZXh0X291dCA9IGFyLm91dDsKLSAgICBzdHJtLT5hdmFpbF9pbiA9ICh1bnNpZ25lZCkoYXIuaW4gPCBhci5sYXN0ID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFEX0FWQUlMX0lOICsgKGFyLmxhc3QgLSBhci5pbikgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQURfQVZBSUxfSU4gLSAoYXIuaW4gLSBhci5sYXN0KSk7Ci0gICAgc3RybS0+YXZhaWxfb3V0ID0gKHVuc2lnbmVkKShhci5vdXQgPCBhci5lbmQgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFEX0FWQUlMX09VVCArIChhci5lbmQgLSBhci5vdXQpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBRF9BVkFJTF9PVVQgLSAoYXIub3V0IC0gYXIuZW5kKSk7Ci0gICAgc3RhdGUtPmhvbGQgPSBhci5ob2xkOwotICAgIHN0YXRlLT5iaXRzID0gYXIuYml0czsKLSAgICByZXR1cm47Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvaW5mbGF0ZTg2L2luZmZhc3QuUyBiL3NyYy96bGliL2NvbnRyaWIvaW5mbGF0ZTg2L2luZmZhc3QuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0NWEyOS4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL2luZmxhdGU4Ni9pbmZmYXN0LlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzY4ICswLDAgQEAKLS8qCi0gKiBpbmZmYXN0LlMgaXMgYSBoYW5kIHR1bmVkIGFzc2VtYmxlciB2ZXJzaW9uIG9mOgotICoKLSAqIGluZmZhc3QuYyAtLSBmYXN0IGRlY29kaW5nCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAzIENocmlzIEFuZGVyc29uIDxjaHJpc3RvcEBjaGFybS5uZXQ+Ci0gKiBQbGVhc2UgdXNlIHRoZSBjb3B5cmlnaHQgY29uZGl0aW9ucyBhYm92ZS4KLSAqCi0gKiBUaGlzIHZlcnNpb24gKEphbi0yMy0yMDAzKSBvZiBpbmZsYXRlX2Zhc3Qgd2FzIGNvZGVkIGFuZCB0ZXN0ZWQgdW5kZXIKLSAqIEdOVS9MaW51eCBvbiBhIHBlbnRpdW0gMywgdXNpbmcgdGhlIGdjYy0zLjIgY29tcGlsZXIgZGlzdHJpYnV0aW9uLiAgT24gdGhhdAotICogbWFjaGluZSwgSSBmb3VuZCB0aGF0IGd6aXAgc3R5bGUgYXJjaGl2ZXMgZGVjb21wcmVzc2VkIGFib3V0IDIwJSBmYXN0ZXIgdGhhbgotICogdGhlIGdjYy0zLjIgLU8zIC1mb21pdC1mcmFtZS1wb2ludGVyIGNvbXBpbGVkIHZlcnNpb24uICBZb3VyIHJlc3VsdHMgd2lsbAotICogZGVwZW5kIG9uIGhvdyBsYXJnZSBvZiBhIGJ1ZmZlciBpcyB1c2VkIGZvciB6X3N0cmVhbS5uZXh0X2luICYgbmV4dF9vdXQKLSAqICg4Sy0zMksgd29ya2VkIGJlc3QgZm9yIG15IDI1NksgY3B1IGNhY2hlKSBhbmQgaG93IG11Y2ggb3ZlcmhlYWQgdGhlcmUgaXMgaW4KLSAqIHN0cmVhbSBwcm9jZXNzaW5nIEkvTyBhbmQgY3JjMzIvYWRkbGVyMzIuICBJbiBteSBjYXNlLCB0aGlzIHJvdXRpbmUgdXNlZAotICogNzAlIG9mIHRoZSBjcHUgdGltZSBhbmQgY3JjMzIgdXNlZCAyMCUuCi0gKgotICogSSBhbSBjb25maWRlbnQgdGhhdCB0aGlzIHZlcnNpb24gd2lsbCB3b3JrIGluIHRoZSBnZW5lcmFsIGNhc2UsIGJ1dCBJIGhhdmUKLSAqIG5vdCB0ZXN0ZWQgYSB3aWRlIHZhcmlldHkgb2YgZGF0YXNldHMgb3IgYSB3aWRlIHZhcmlldHkgb2YgcGxhdGZvcm1zLgotICoKLSAqIEphbi0yNC0yMDAzIC0tIEFkZGVkIC1EVVNFX01NWCBkZWZpbmUgZm9yIHNsaWdodGx5IGZhc3RlciBpbmZsYXRpbmcuCi0gKiBJdCBzaG91bGQgYmUgYSBydW50aW1lIGZsYWcgaW5zdGVhZCBvZiBjb21waWxlIHRpbWUgZmxhZy4uLgotICoKLSAqIEphbi0yNi0yMDAzIC0tIEFkZGVkIHJ1bnRpbWUgY2hlY2sgZm9yIE1NWCBzdXBwb3J0IHdpdGggY3B1aWQgaW5zdHJ1Y3Rpb24uCi0gKiBXaXRoIC1EVVNFX01NWCwgb25seSBNTVggY29kZSBpcyBjb21waWxlZC4gIFdpdGggLUROT19NTVgsIG9ubHkgbm9uLU1NWCBjb2RlCi0gKiBpcyBjb21waWxlZC4gIFdpdGhvdXQgZWl0aGVyIG9wdGlvbiwgcnVudGltZSBkZXRlY3Rpb24gaXMgZW5hYmxlZC4gIFJ1bnRpbWUKLSAqIGRldGVjdGlvbiBzaG91bGQgd29yayBvbiBhbGwgbW9kZXJuIGNwdXMgYW5kIHRoZSByZWNvbWVuZGVkIGFsZ29yaXRobSAoZmxpcAotICogSUQgYml0IG9uIGVmbGFncyBhbmQgdGhlbiB1c2UgdGhlIGNwdWlkIGluc3RydWN0aW9uKSBpcyB1c2VkIGluIG1hbnkKLSAqIG11bHRpbWVkaWEgYXBwbGljYXRpb25zLiAgVGVzdGVkIHVuZGVyIHdpbjJrIHdpdGggZ2NjLTIuOTUgYW5kIGdhcy0yLjEyCi0gKiBkaXN0cmlidXRlZCB3aXRoIGN5Z3dpbjMuICBDb21waWxpbmcgd2l0aCBnY2MtMi45NSAtYyBpbmZmYXN0LlMgLW8KLSAqIGluZmZhc3Qub2JqIGdlbmVyYXRlcyBhIENPRkYgb2JqZWN0IHdoaWNoIGNhbiB0aGVuIGJlIGxpbmtlZCB3aXRoIE1TVkMrKwotICogY29tcGlsZWQgY29kZS4gIFRlc3RlZCB1bmRlciBGcmVlQlNEIDQuNyB3aXRoIGdjYy0yLjk1LgotICoKLSAqIEphbi0yOC0yMDAzIC0tIFRlc3RlZCBBdGhsb24gWFAuLi4gTU1YIG1vZGUgaXMgc2xvd2VyIHRoYW4gbm8gTU1YIChhbmQKLSAqIHNsb3dlciB0aGFuIGNvbXBpbGVyIGdlbmVyYXRlZCBjb2RlKS4gIEFkanVzdGVkIGNwdWlkIGNoZWNrIHRvIHVzZSB0aGUgTU1YCi0gKiBjb2RlIG9ubHkgZm9yIFBlbnRpdW1zIDwgUDQgdW50aWwgSSBoYXZlIG1vcmUgZGF0YSBvbiB0aGUgUDQuICBTcGVlZAotICogaW1wcm92bWVudCBpcyBvbmx5IGFib3V0IDE1JSBvbiB0aGUgQXRobG9uIHdoZW4gY29tcGFyZWQgd2l0aCBjb2RlIGdlbmVyYXRlZAotICogd2l0aCBNU1ZDKysuICBOb3Qgc3VyZSB5ZXQsIGJ1dCBJIHRoaW5rIHRoZSBQNCB3aWxsIGFsc28gYmUgc2xvd2VyIHVzaW5nIHRoZQotICogTU1YIG1vZGUgYmVjYXVzZSBtYW55IG9mIGl0J3MgeDg2IEFMVSBpbnN0cnVjdGlvbnMgZXhlY3V0ZSBpbiAuNSBjeWNsZXMgYW5kCi0gKiBoYXZlIGxlc3MgbGF0ZW5jeSB0aGFuIE1NWCBvcHMuICBBZGRlZCBjb2RlIHRvIGJ1ZmZlciB0aGUgbGFzdCAxMSBieXRlcyBvZgotICogdGhlIGlucHV0IHN0cmVhbSBzaW5jZSB0aGUgTU1YIGNvZGUgZ3JhYnMgYml0cyBpbiBjaHVua3Mgb2YgMzIsIHdoaWNoCi0gKiBkaWZmZXJzIGZyb20gdGhlIGluZmZhc3QuYyBhbGdvcml0aG0uICBJIGRvbid0IHRoaW5rIHRoZXJlIHdvdWxkIGhhdmUgYmVlbgotICogcmVhZCBvdmVycnVucyB3aGVyZSBhIHBhZ2UgYm91bmRhcnkgd2FzIGNyb3NzZWQgKGEgc2VnZmF1bHQpLCBidXQgdGhlcmUKLSAqIGNvdWxkIGhhdmUgYmVlbiBvdmVycnVucyB3aGVuIG5leHRfaW4gZW5kcyBvbiB1bmFsaWduZWQgbWVtb3J5ICh1bmludGlhbGl6ZWQKLSAqIG1lbW9yeSByZWFkKS4KLSAqCi0gKiBNYXItMTMtMjAwMyAtLSBQNCBNTVggaXMgc2xpZ2h0bHkgc2xvd2VyIHRoYW4gUDQgTk9fTU1YLiAgSSBjcmVhdGVkIGEgQwotICogdmVyc2lvbiBvZiB0aGUgbm9uLU1NWCBjb2RlIHNvIHRoYXQgaXQgZG9lc24ndCBkZXBlbmQgb24genN0cm0gYW5kIHpzdGF0ZQotICogc3RydWN0dXJlIG9mZnNldHMgd2hpY2ggYXJlIGhhcmQgY29kZWQgaW4gdGhpcyBmaWxlLiAgVGhpcyB3YXMgbGFzdCB0ZXN0ZWQKLSAqIHdpdGggemxpYi0xLjIuMCB3aGljaCBpcyBjdXJyZW50bHkgaW4gYmV0YSB0ZXN0aW5nLCBuZXdlciB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBhbmQgaW5mZmFzODYuYyBjYW4gYmUgZm91bmQgYXQgaHR0cDovL3d3dy5lZXRiZWV0ZWUuY29tL3psaWIvIGFuZAotICogaHR0cDovL3d3dy5jaGFybS5uZXQvfmNocmlzdG9wL3psaWIvCi0gKi8KLQotCi0vKgotICogaWYgeW91IGhhdmUgdW5kZXJzY29yZSBsaW5raW5nIHByb2JsZW1zIChfaW5mbGF0ZV9mYXN0IHVuZGVmaW5lZCksIHRyeQotICogdXNpbmcgLURHQVNfQ09GRgotICovCi0jaWYgISBkZWZpbmVkKCBHQVNfQ09GRiApICYmICEgZGVmaW5lZCggR0FTX0VMRiApCi0KLSNpZiBkZWZpbmVkKCBXSU4zMiApIHx8IGRlZmluZWQoIF9fQ1lHV0lOX18gKQotI2RlZmluZSBHQVNfQ09GRiAvKiB3aW5kb3dzIG9iamVjdCBmb3JtYXQgKi8KLSNlbHNlCi0jZGVmaW5lIEdBU19FTEYKLSNlbmRpZgotCi0jZW5kaWYgLyogISBHQVNfQ09GRiAmJiAhIEdBU19FTEYgKi8KLQotCi0jaWYgZGVmaW5lZCggR0FTX0NPRkYgKQotCi0vKiBjb2ZmIGV4dGVybmFscyBoYXZlIHVuZGVyc2NvcmVzICovCi0jZGVmaW5lIGluZmxhdGVfZmFzdCBfaW5mbGF0ZV9mYXN0Ci0jZGVmaW5lIGluZmxhdGVfZmFzdF91c2VfbW14IF9pbmZsYXRlX2Zhc3RfdXNlX21teAotCi0jZW5kaWYgLyogR0FTX0NPRkYgKi8KLQotCi0uZmlsZSAiaW5mZmFzdC5TIgotCi0uZ2xvYmwgaW5mbGF0ZV9mYXN0Ci0KLS50ZXh0Ci0uYWxpZ24gNCwwCi0uTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVfbXNnOgotLnN0cmluZyAiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIgotCi0uYWxpZ24gNCwwCi0uTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGVfbXNnOgotLnN0cmluZyAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIgotCi0uYWxpZ24gNCwwCi0uTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXJfbXNnOgotLnN0cmluZyAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siCi0KLSNpZiAhIGRlZmluZWQoIE5PX01NWCApCi0uYWxpZ24gNCwwCi0uTF9tYXNrOiAvKiBtYXNrW05dID0gKCAxIDw8IE4gKSAtIDEgKi8KLS5sb25nIDAKLS5sb25nIDEKLS5sb25nIDMKLS5sb25nIDcKLS5sb25nIDE1Ci0ubG9uZyAzMQotLmxvbmcgNjMKLS5sb25nIDEyNwotLmxvbmcgMjU1Ci0ubG9uZyA1MTEKLS5sb25nIDEwMjMKLS5sb25nIDIwNDcKLS5sb25nIDQwOTUKLS5sb25nIDgxOTEKLS5sb25nIDE2MzgzCi0ubG9uZyAzMjc2NwotLmxvbmcgNjU1MzUKLS5sb25nIDEzMTA3MQotLmxvbmcgMjYyMTQzCi0ubG9uZyA1MjQyODcKLS5sb25nIDEwNDg1NzUKLS5sb25nIDIwOTcxNTEKLS5sb25nIDQxOTQzMDMKLS5sb25nIDgzODg2MDcKLS5sb25nIDE2Nzc3MjE1Ci0ubG9uZyAzMzU1NDQzMQotLmxvbmcgNjcxMDg4NjMKLS5sb25nIDEzNDIxNzcyNwotLmxvbmcgMjY4NDM1NDU1Ci0ubG9uZyA1MzY4NzA5MTEKLS5sb25nIDEwNzM3NDE4MjMKLS5sb25nIDIxNDc0ODM2NDcKLS5sb25nIDQyOTQ5NjcyOTUKLSNlbmRpZiAvKiBOT19NTVggKi8KLQotLnRleHQKLQotLyoKLSAqIHN0cnVjdCB6X3N0cmVhbSBvZmZzZXRzLCBpbiB6bGliLmgKLSAqLwotI2RlZmluZSBuZXh0X2luX3N0cm0gICAwICAgLyogc3RybS0+bmV4dF9pbiAqLwotI2RlZmluZSBhdmFpbF9pbl9zdHJtICA0ICAgLyogc3RybS0+YXZhaWxfaW4gKi8KLSNkZWZpbmUgbmV4dF9vdXRfc3RybSAgMTIgIC8qIHN0cm0tPm5leHRfb3V0ICovCi0jZGVmaW5lIGF2YWlsX291dF9zdHJtIDE2ICAvKiBzdHJtLT5hdmFpbF9vdXQgKi8KLSNkZWZpbmUgbXNnX3N0cm0gICAgICAgMjQgIC8qIHN0cm0tPm1zZyAqLwotI2RlZmluZSBzdGF0ZV9zdHJtICAgICAyOCAgLyogc3RybS0+c3RhdGUgKi8KLQotLyoKLSAqIHN0cnVjdCBpbmZsYXRlX3N0YXRlIG9mZnNldHMsIGluIGluZmxhdGUuaAotICovCi0jZGVmaW5lIG1vZGVfc3RhdGUgICAgIDAgICAvKiBzdGF0ZS0+bW9kZSAqLwotI2RlZmluZSB3c2l6ZV9zdGF0ZSAgICAzMiAgLyogc3RhdGUtPndzaXplICovCi0jZGVmaW5lIHdyaXRlX3N0YXRlICAgIDQwICAvKiBzdGF0ZS0+d3JpdGUgKi8KLSNkZWZpbmUgd2luZG93X3N0YXRlICAgNDQgIC8qIHN0YXRlLT53aW5kb3cgKi8KLSNkZWZpbmUgaG9sZF9zdGF0ZSAgICAgNDggIC8qIHN0YXRlLT5ob2xkICovCi0jZGVmaW5lIGJpdHNfc3RhdGUgICAgIDUyICAvKiBzdGF0ZS0+Yml0cyAqLwotI2RlZmluZSBsZW5jb2RlX3N0YXRlICA2OCAgLyogc3RhdGUtPmxlbmNvZGUgKi8KLSNkZWZpbmUgZGlzdGNvZGVfc3RhdGUgNzIgIC8qIHN0YXRlLT5kaXN0Y29kZSAqLwotI2RlZmluZSBsZW5iaXRzX3N0YXRlICA3NiAgLyogc3RhdGUtPmxlbmJpdHMgKi8KLSNkZWZpbmUgZGlzdGJpdHNfc3RhdGUgODAgIC8qIHN0YXRlLT5kaXN0Yml0cyAqLwotCi0vKgotICogaW5mbGF0ZV9mYXN0J3MgYWN0aXZhdGlvbiByZWNvcmQKLSAqLwotI2RlZmluZSBsb2NhbF92YXJfc2l6ZSA2NCAvKiBob3cgbXVjaCBsb2NhbCBzcGFjZSBmb3IgdmFycyAqLwotI2RlZmluZSBzdHJtX3NwICAgICAgICA4OCAvKiBmaXJzdCBhcmc6IHpfc3RyZWFtICogKGxvY2FsX3Zhcl9zaXplICsgMjQpICovCi0jZGVmaW5lIHN0YXJ0X3NwICAgICAgIDkyIC8qIHNlY29uZCBhcmc6IHVuc2lnbmVkIGludCAobG9jYWxfdmFyX3NpemUgKyAyOCkgKi8KLQotLyoKLSAqIG9mZnNldHMgZm9yIGxvY2FsIHZhcnMgb24gc3RhY2sKLSAqLwotI2RlZmluZSBvdXQgICAgICAgICAgICA2MCAgLyogdW5zaWduZWQgY2hhciogKi8KLSNkZWZpbmUgd2luZG93ICAgICAgICAgNTYgIC8qIHVuc2lnbmVkIGNoYXIqICovCi0jZGVmaW5lIHdzaXplICAgICAgICAgIDUyICAvKiB1bnNpZ25lZCBpbnQgKi8KLSNkZWZpbmUgd3JpdGUgICAgICAgICAgNDggIC8qIHVuc2lnbmVkIGludCAqLwotI2RlZmluZSBpbiAgICAgICAgICAgICA0NCAgLyogdW5zaWduZWQgY2hhciogKi8KLSNkZWZpbmUgYmVnICAgICAgICAgICAgNDAgIC8qIHVuc2lnbmVkIGNoYXIqICovCi0jZGVmaW5lIGJ1ZiAgICAgICAgICAgIDI4ICAvKiBjaGFyWyAxMiBdICovCi0jZGVmaW5lIGxlbiAgICAgICAgICAgIDI0ICAvKiB1bnNpZ25lZCBpbnQgKi8KLSNkZWZpbmUgbGFzdCAgICAgICAgICAgMjAgIC8qIHVuc2lnbmVkIGNoYXIqICovCi0jZGVmaW5lIGVuZCAgICAgICAgICAgIDE2ICAvKiB1bnNpZ25lZCBjaGFyKiAqLwotI2RlZmluZSBkY29kZSAgICAgICAgICAxMiAgLyogY29kZSogKi8KLSNkZWZpbmUgbGNvZGUgICAgICAgICAgIDggIC8qIGNvZGUqICovCi0jZGVmaW5lIGRtYXNrICAgICAgICAgICA0ICAvKiB1bnNpZ25lZCBpbnQgKi8KLSNkZWZpbmUgbG1hc2sgICAgICAgICAgIDAgIC8qIHVuc2lnbmVkIGludCAqLwotCi0vKgotICogdHlwZWRlZiBlbnVtIGluZmxhdGVfbW9kZSBjb25zdHMsIGluIGluZmxhdGUuaAotICovCi0jZGVmaW5lIElORkxBVEVfTU9ERV9UWVBFIDExICAvKiBzdGF0ZS0+bW9kZSBmbGFncyBlbnVtLWVkIGluIGluZmxhdGUuaCAqLwotI2RlZmluZSBJTkZMQVRFX01PREVfQkFEICAyNgotCi0KLSNpZiAhIGRlZmluZWQoIFVTRV9NTVggKSAmJiAhIGRlZmluZWQoIE5PX01NWCApCi0KLSNkZWZpbmUgUlVOX1RJTUVfTU1YCi0KLSNkZWZpbmUgQ0hFQ0tfTU1YICAgIDEKLSNkZWZpbmUgRE9fVVNFX01NWCAgIDIKLSNkZWZpbmUgRE9OVF9VU0VfTU1YIDMKLQotLmdsb2JsIGluZmxhdGVfZmFzdF91c2VfbW14Ci0KLS5kYXRhCi0KLS5hbGlnbiA0LDAKLWluZmxhdGVfZmFzdF91c2VfbW14OiAvKiBpbnRlZ2VyIGZsYWcgZm9yIHJ1biB0aW1lIGNvbnRyb2wgMT1jaGVjaywyPW1teCwzPW5vICovCi0ubG9uZyBDSEVDS19NTVgKLQotI2lmIGRlZmluZWQoIEdBU19FTEYgKQotLyogZWxmIGluZm8gKi8KLS50eXBlICAgaW5mbGF0ZV9mYXN0X3VzZV9tbXgsQG9iamVjdAotLnNpemUgICBpbmZsYXRlX2Zhc3RfdXNlX21teCw0Ci0jZW5kaWYKLQotI2VuZGlmIC8qIFJVTl9USU1FX01NWCAqLwotCi0jaWYgZGVmaW5lZCggR0FTX0NPRkYgKQotLyogY29mZiBpbmZvOiBzY2wgMiA9IGV4dGVybiwgdHlwZSAzMiA9IGZ1bmN0aW9uICovCi0uZGVmIGluZmxhdGVfZmFzdDsgLnNjbCAyOyAudHlwZSAzMjsgLmVuZGVmCi0jZW5kaWYKLQotLnRleHQKLQotLmFsaWduIDMyLDB4OTAKLWluZmxhdGVfZmFzdDoKLSAgICAgICAgcHVzaGwgICAlZWRpCi0gICAgICAgIHB1c2hsICAgJWVzaQotICAgICAgICBwdXNobCAgICVlYnAKLSAgICAgICAgcHVzaGwgICAlZWJ4Ci0gICAgICAgIHB1c2hmICAgLyogc2F2ZSBlZmxhZ3MgKHN0cm1fc3AsIHN0YXRlX3NwIGFzc3VtZXMgdGhpcyBpcyAzMiBiaXRzKSAqLwotICAgICAgICBzdWJsICAgICRsb2NhbF92YXJfc2l6ZSwgJWVzcAotICAgICAgICBjbGQKLQotI2RlZmluZSBzdHJtX3IgICVlc2kKLSNkZWZpbmUgc3RhdGVfciAlZWRpCi0KLSAgICAgICAgbW92bCAgICBzdHJtX3NwKCVlc3ApLCBzdHJtX3IKLSAgICAgICAgbW92bCAgICBzdGF0ZV9zdHJtKHN0cm1fciksIHN0YXRlX3IKLQotICAgICAgICAvKiBpbiA9IHN0cm0tPm5leHRfaW47Ci0gICAgICAgICAqIG91dCA9IHN0cm0tPm5leHRfb3V0OwotICAgICAgICAgKiBsYXN0ID0gaW4gKyBzdHJtLT5hdmFpbF9pbiAtIDExOwotICAgICAgICAgKiBiZWcgPSBvdXQgLSAoc3RhcnQgLSBzdHJtLT5hdmFpbF9vdXQpOwotICAgICAgICAgKiBlbmQgPSBvdXQgKyAoc3RybS0+YXZhaWxfb3V0IC0gMjU3KTsKLSAgICAgICAgICovCi0gICAgICAgIG1vdmwgICAgYXZhaWxfaW5fc3RybShzdHJtX3IpLCAlZWR4Ci0gICAgICAgIG1vdmwgICAgbmV4dF9pbl9zdHJtKHN0cm1fciksICVlYXgKLQotICAgICAgICBhZGRsICAgICVlYXgsICVlZHggICAgICAvKiBhdmFpbF9pbiArPSBuZXh0X2luICovCi0gICAgICAgIHN1YmwgICAgJDExLCAlZWR4ICAgICAgIC8qIGF2YWlsX2luIC09IDExICovCi0KLSAgICAgICAgbW92bCAgICAlZWF4LCBpbiglZXNwKQotICAgICAgICBtb3ZsICAgICVlZHgsIGxhc3QoJWVzcCkKLQotICAgICAgICBtb3ZsICAgIHN0YXJ0X3NwKCVlc3ApLCAlZWJwCi0gICAgICAgIG1vdmwgICAgYXZhaWxfb3V0X3N0cm0oc3RybV9yKSwgJWVjeAotICAgICAgICBtb3ZsICAgIG5leHRfb3V0X3N0cm0oc3RybV9yKSwgJWVieAotCi0gICAgICAgIHN1YmwgICAgJWVjeCwgJWVicCAgICAgIC8qIHN0YXJ0IC09IGF2YWlsX291dCAqLwotICAgICAgICBuZWdsICAgICVlYnAgICAgICAgICAgICAvKiBzdGFydCA9IC1zdGFydCAqLwotICAgICAgICBhZGRsICAgICVlYngsICVlYnAgICAgICAvKiBzdGFydCArPSBuZXh0X291dCAqLwotCi0gICAgICAgIHN1YmwgICAgJDI1NywgJWVjeCAgICAgIC8qIGF2YWlsX291dCAtPSAyNTcgKi8KLSAgICAgICAgYWRkbCAgICAlZWJ4LCAlZWN4ICAgICAgLyogYXZhaWxfb3V0ICs9IG91dCAqLwotCi0gICAgICAgIG1vdmwgICAgJWVieCwgb3V0KCVlc3ApCi0gICAgICAgIG1vdmwgICAgJWVicCwgYmVnKCVlc3ApCi0gICAgICAgIG1vdmwgICAgJWVjeCwgZW5kKCVlc3ApCi0KLSAgICAgICAgLyogd3NpemUgPSBzdGF0ZS0+d3NpemU7Ci0gICAgICAgICAqIHdyaXRlID0gc3RhdGUtPndyaXRlOwotICAgICAgICAgKiB3aW5kb3cgPSBzdGF0ZS0+d2luZG93OwotICAgICAgICAgKiBob2xkID0gc3RhdGUtPmhvbGQ7Ci0gICAgICAgICAqIGJpdHMgPSBzdGF0ZS0+Yml0czsKLSAgICAgICAgICogbGNvZGUgPSBzdGF0ZS0+bGVuY29kZTsKLSAgICAgICAgICogZGNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGU7Ci0gICAgICAgICAqIGxtYXNrID0gKCAxIDw8IHN0YXRlLT5sZW5iaXRzICkgLSAxOwotICAgICAgICAgKiBkbWFzayA9ICggMSA8PCBzdGF0ZS0+ZGlzdGJpdHMgKSAtIDE7Ci0gICAgICAgICAqLwotCi0gICAgICAgIG1vdmwgICAgbGVuY29kZV9zdGF0ZShzdGF0ZV9yKSwgJWVheAotICAgICAgICBtb3ZsICAgIGRpc3Rjb2RlX3N0YXRlKHN0YXRlX3IpLCAlZWN4Ci0KLSAgICAgICAgbW92bCAgICAlZWF4LCBsY29kZSglZXNwKQotICAgICAgICBtb3ZsICAgICVlY3gsIGRjb2RlKCVlc3ApCi0KLSAgICAgICAgbW92bCAgICAkMSwgJWVheAotICAgICAgICBtb3ZsICAgIGxlbmJpdHNfc3RhdGUoc3RhdGVfciksICVlY3gKLSAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKLSAgICAgICAgZGVjbCAgICAlZWF4Ci0gICAgICAgIG1vdmwgICAgJWVheCwgbG1hc2soJWVzcCkKLQotICAgICAgICBtb3ZsICAgICQxLCAlZWF4Ci0gICAgICAgIG1vdmwgICAgZGlzdGJpdHNfc3RhdGUoc3RhdGVfciksICVlY3gKLSAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKLSAgICAgICAgZGVjbCAgICAlZWF4Ci0gICAgICAgIG1vdmwgICAgJWVheCwgZG1hc2soJWVzcCkKLQotICAgICAgICBtb3ZsICAgIHdzaXplX3N0YXRlKHN0YXRlX3IpLCAlZWF4Ci0gICAgICAgIG1vdmwgICAgd3JpdGVfc3RhdGUoc3RhdGVfciksICVlY3gKLSAgICAgICAgbW92bCAgICB3aW5kb3dfc3RhdGUoc3RhdGVfciksICVlZHgKLQotICAgICAgICBtb3ZsICAgICVlYXgsIHdzaXplKCVlc3ApCi0gICAgICAgIG1vdmwgICAgJWVjeCwgd3JpdGUoJWVzcCkKLSAgICAgICAgbW92bCAgICAlZWR4LCB3aW5kb3coJWVzcCkKLQotICAgICAgICBtb3ZsICAgIGhvbGRfc3RhdGUoc3RhdGVfciksICVlYnAKLSAgICAgICAgbW92bCAgICBiaXRzX3N0YXRlKHN0YXRlX3IpLCAlZWJ4Ci0KLSN1bmRlZiBzdHJtX3IKLSN1bmRlZiBzdGF0ZV9yCi0KLSNkZWZpbmUgaW5fciAgICAgICAlZXNpCi0jZGVmaW5lIGZyb21fciAgICAgJWVzaQotI2RlZmluZSBvdXRfciAgICAgICVlZGkKLQotICAgICAgICBtb3ZsICAgIGluKCVlc3ApLCBpbl9yCi0gICAgICAgIG1vdmwgICAgbGFzdCglZXNwKSwgJWVjeAotICAgICAgICBjbXBsICAgIGluX3IsICVlY3gKLSAgICAgICAgamEgICAgICAuTF9hbGlnbl9sb25nICAgICAgICAgICAvKiBpZiBpbiA8IGxhc3QgKi8KLQotICAgICAgICBhZGRsICAgICQxMSwgJWVjeCAgICAgICAgICAgICAgIC8qIGVjeCA9ICZpblsgYXZhaWxfaW4gXSAqLwotICAgICAgICBzdWJsICAgIGluX3IsICVlY3ggICAgICAgICAgICAgIC8qIGVjeCA9IGF2YWlsX2luICovCi0gICAgICAgIG1vdmwgICAgJDEyLCAlZWF4Ci0gICAgICAgIHN1YmwgICAgJWVjeCwgJWVheCAgICAgICAgICAgICAgLyogZWF4ID0gMTIgLSBhdmFpbF9pbiAqLwotICAgICAgICBsZWFsICAgIGJ1ZiglZXNwKSwgJWVkaQotICAgICAgICByZXAgICAgIG1vdnNiICAgICAgICAgICAgICAgICAgIC8qIG1lbWNweSggYnVmLCBpbiwgYXZhaWxfaW4gKSAqLwotICAgICAgICBtb3ZsICAgICVlYXgsICVlY3gKLSAgICAgICAgeG9ybCAgICAlZWF4LCAlZWF4Ci0gICAgICAgIHJlcCAgICAgc3Rvc2IgICAgICAgICAvKiBtZW1zZXQoICZidWZbIGF2YWlsX2luIF0sIDAsIDEyIC0gYXZhaWxfaW4gKSAqLwotICAgICAgICBsZWFsICAgIGJ1ZiglZXNwKSwgaW5fciAgICAgICAgIC8qIGluID0gYnVmICovCi0gICAgICAgIG1vdmwgICAgaW5fciwgbGFzdCglZXNwKSAgICAgICAgLyogbGFzdCA9IGluLCBkbyBqdXN0IG9uZSBpdGVyYXRpb24gKi8KLSAgICAgICAgam1wICAgICAuTF9pc19hbGlnbmVkCi0KLSAgICAgICAgLyogYWxpZ24gaW5fciBvbiBsb25nIGJvdW5kYXJ5ICovCi0uTF9hbGlnbl9sb25nOgotICAgICAgICB0ZXN0bCAgICQzLCBpbl9yCi0gICAgICAgIGp6ICAgICAgLkxfaXNfYWxpZ25lZAotICAgICAgICB4b3JsICAgICVlYXgsICVlYXgKLSAgICAgICAgbW92YiAgICAoaW5fciksICVhbAotICAgICAgICBpbmNsICAgIGluX3IKLSAgICAgICAgbW92bCAgICAlZWJ4LCAlZWN4Ci0gICAgICAgIGFkZGwgICAgJDgsICVlYngKLSAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKLSAgICAgICAgb3JsICAgICAlZWF4LCAlZWJwCi0gICAgICAgIGptcCAgICAgLkxfYWxpZ25fbG9uZwotCi0uTF9pc19hbGlnbmVkOgotICAgICAgICBtb3ZsICAgIG91dCglZXNwKSwgb3V0X3IKLQotI2lmIGRlZmluZWQoIE5PX01NWCApCi0gICAgICAgIGptcCAgICAgLkxfZG9fbG9vcAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKCBVU0VfTU1YICkKLSAgICAgICAgam1wICAgICAuTF9pbml0X21teAotI2VuZGlmCi0KLS8qKiogUnVudGltZSBNTVggY2hlY2sgKioqLwotCi0jaWYgZGVmaW5lZCggUlVOX1RJTUVfTU1YICkKLS5MX2NoZWNrX21teDoKLSAgICAgICAgY21wbCAgICAkRE9fVVNFX01NWCwgaW5mbGF0ZV9mYXN0X3VzZV9tbXgKLSAgICAgICAgamUgICAgICAuTF9pbml0X21teAotICAgICAgICBqYSAgICAgIC5MX2RvX2xvb3AgLyogPiAyICovCi0KLSAgICAgICAgcHVzaGwgICAlZWF4Ci0gICAgICAgIHB1c2hsICAgJWVieAotICAgICAgICBwdXNobCAgICVlY3gKLSAgICAgICAgcHVzaGwgICAlZWR4Ci0gICAgICAgIHB1c2hmCi0gICAgICAgIG1vdmwgICAgKCVlc3ApLCAlZWF4ICAgICAgLyogY29weSBlZmxhZ3MgdG8gZWF4ICovCi0gICAgICAgIHhvcmwgICAgJDB4MjAwMDAwLCAoJWVzcCkgLyogdHJ5IHRvZ2dsaW5nIElEIGJpdCBvZiBlZmxhZ3MgKGJpdCAyMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0byBzZWUgaWYgY3B1IHN1cHBvcnRzIGNwdWlkLi4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSUQgYml0IG1ldGhvZCBub3Qgc3VwcG9ydGVkIGJ5IE5leEdlbiBidXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiaW9zIG1heSBsb2FkIGEgY3B1aWQgaW5zdHJ1Y3Rpb24gYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY3B1aWQgbWF5IGJlIGRpc2FibGVkIG9uIEN5cml4IDUtNng4NiAqLwotICAgICAgICBwb3BmCi0gICAgICAgIHB1c2hmCi0gICAgICAgIHBvcGwgICAgJWVkeCAgICAgICAgICAgICAgLyogY29weSBuZXcgZWZsYWdzIHRvIGVkeCAqLwotICAgICAgICB4b3JsICAgICVlYXgsICVlZHggICAgICAgIC8qIHRlc3QgaWYgSUQgYml0IGlzIGZsaXBwZWQgKi8KLSAgICAgICAganogICAgICAuTF9kb250X3VzZV9tbXggICAvKiBub3QgZmxpcHBlZCBpZiB6ZXJvICovCi0gICAgICAgIHhvcmwgICAgJWVheCwgJWVheAotICAgICAgICBjcHVpZAotICAgICAgICBjbXBsICAgICQweDc1NmU2NTQ3LCAlZWJ4IC8qIGNoZWNrIGZvciBHZW51aW5lSW50ZWwgaW4gZWJ4LGVjeCxlZHggKi8KLSAgICAgICAgam5lICAgICAuTF9kb250X3VzZV9tbXgKLSAgICAgICAgY21wbCAgICAkMHg2YzY1NzQ2ZSwgJWVjeAotICAgICAgICBqbmUgICAgIC5MX2RvbnRfdXNlX21teAotICAgICAgICBjbXBsICAgICQweDQ5NjU2ZTY5LCAlZWR4Ci0gICAgICAgIGpuZSAgICAgLkxfZG9udF91c2VfbW14Ci0gICAgICAgIG1vdmwgICAgJDEsICVlYXgKLSAgICAgICAgY3B1aWQgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgY3B1IGZlYXR1cmVzICovCi0gICAgICAgIHNocmwgICAgJDgsICVlYXgKLSAgICAgICAgYW5kbCAgICAkMTUsICVlYXgKLSAgICAgICAgY21wbCAgICAkNiwgJWVheCAgICAgICAgICAvKiBjaGVjayBmb3IgUGVudGl1bSBmYW1pbHksIGlzIDB4ZiBmb3IgUDQgKi8KLSAgICAgICAgam5lICAgICAuTF9kb250X3VzZV9tbXgKLSAgICAgICAgdGVzdGwgICAkMHg4MDAwMDAsICVlZHggICAvKiB0ZXN0IGlmIE1NWCBmZWF0dXJlIGlzIHNldCAoYml0IDIzKSAqLwotICAgICAgICBqbnogICAgIC5MX3VzZV9tbXgKLSAgICAgICAgam1wICAgICAuTF9kb250X3VzZV9tbXgKLS5MX3VzZV9tbXg6Ci0gICAgICAgIG1vdmwgICAgJERPX1VTRV9NTVgsIGluZmxhdGVfZmFzdF91c2VfbW14Ci0gICAgICAgIGptcCAgICAgLkxfY2hlY2tfbW14X3BvcAotLkxfZG9udF91c2VfbW14OgotICAgICAgICBtb3ZsICAgICRET05UX1VTRV9NTVgsIGluZmxhdGVfZmFzdF91c2VfbW14Ci0uTF9jaGVja19tbXhfcG9wOgotICAgICAgICBwb3BsICAgICVlZHgKLSAgICAgICAgcG9wbCAgICAlZWN4Ci0gICAgICAgIHBvcGwgICAgJWVieAotICAgICAgICBwb3BsICAgICVlYXgKLSAgICAgICAgam1wICAgICAuTF9jaGVja19tbXgKLSNlbmRpZgotCi0KLS8qKiogTm9uLU1NWCBjb2RlICoqKi8KLQotI2lmIGRlZmluZWQgKCBOT19NTVggKSB8fCBkZWZpbmVkKCBSVU5fVElNRV9NTVggKQotCi0jZGVmaW5lIGhvbGRfciAgICAgJWVicAotI2RlZmluZSBiaXRzX3IgICAgICVibAotI2RlZmluZSBiaXRzbG9uZ19yICVlYngKLQotLmFsaWduIDMyLDB4OTAKLS5MX3doaWxlX3Rlc3Q6Ci0gICAgICAgIC8qIHdoaWxlIChpbiA8IGxhc3QgJiYgb3V0IDwgZW5kKQotICAgICAgICAgKi8KLSAgICAgICAgY21wbCAgICBvdXRfciwgZW5kKCVlc3ApCi0gICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcCAgICAgICAgICAgLyogaWYgKG91dCA+PSBlbmQpICovCi0KLSAgICAgICAgY21wbCAgICBpbl9yLCBsYXN0KCVlc3ApCi0gICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcAotCi0uTF9kb19sb29wOgotICAgICAgICAvKiByZWdzOiAlZXNpID0gaW4sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0Ci0gICAgICAgICAqCi0gICAgICAgICAqIGRvIHsKLSAgICAgICAgICogICBpZiAoYml0cyA8IDE1KSB7Ci0gICAgICAgICAqICAgICBob2xkIHw9ICooKHVuc2lnbmVkIHNob3J0ICopaW4pKysgPDwgYml0czsKLSAgICAgICAgICogICAgIGJpdHMgKz0gMTYKLSAgICAgICAgICogICB9Ci0gICAgICAgICAqICAgdGhpcyA9IGxjb2RlW2hvbGQgJiBsbWFza10KLSAgICAgICAgICovCi0gICAgICAgIGNtcGIgICAgJDE1LCBiaXRzX3IKLSAgICAgICAgamEgICAgICAuTF9nZXRfbGVuZ3RoX2NvZGUgICAgICAvKiBpZiAoMTUgPCBiaXRzKSAqLwotCi0gICAgICAgIHhvcmwgICAgJWVheCwgJWVheAotICAgICAgICBsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCi0gICAgICAgIG1vdmIgICAgYml0c19yLCAlY2wgICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KLSAgICAgICAgYWRkYiAgICAkMTYsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCi0gICAgICAgIHNobGwgICAgJWNsLCAlZWF4Ci0gICAgICAgIG9ybCAgICAgJWVheCwgaG9sZF9yICAgICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCi0KLS5MX2dldF9sZW5ndGhfY29kZToKLSAgICAgICAgbW92bCAgICBsbWFzayglZXNwKSwgJWVkeCAgICAgICAvKiBlZHggPSBsbWFzayAqLwotICAgICAgICBtb3ZsICAgIGxjb2RlKCVlc3ApLCAlZWN4ICAgICAgIC8qIGVjeCA9IGxjb2RlICovCi0gICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWR4ICAgICAgICAgICAgLyogZWR4ICY9IGhvbGQgKi8KLSAgICAgICAgbW92bCAgICAoJWVjeCwlZWR4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCi0KLS5MX2RvbGVuOgotICAgICAgICAvKiByZWdzOiAlZXNpID0gaW4sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0Ci0gICAgICAgICAqCi0gICAgICAgICAqIGRvbGVuOgotICAgICAgICAgKiAgICBiaXRzIC09IHRoaXMuYml0czsKLSAgICAgICAgICogICAgaG9sZCA+Pj0gdGhpcy5iaXRzCi0gICAgICAgICAqLwotICAgICAgICBtb3ZiICAgICVhaCwgJWNsICAgICAgICAgICAgICAgIC8qIGNsID0gdGhpcy5iaXRzICovCi0gICAgICAgIHN1YmIgICAgJWFoLCBiaXRzX3IgICAgICAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KLSAgICAgICAgc2hybCAgICAlY2wsIGhvbGRfciAgICAgICAgICAgICAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8KLQotICAgICAgICAvKiBjaGVjayBpZiBvcCBpcyBhIGxpdGVyYWwKLSAgICAgICAgICogaWYgKG9wID09IDApIHsKLSAgICAgICAgICogICAgUFVQKG91dCkgPSB0aGlzLnZhbDsKLSAgICAgICAgICogIH0KLSAgICAgICAgICovCi0gICAgICAgIHRlc3RiICAgJWFsLCAlYWwKLSAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZSAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8KLQotICAgICAgICBzaHJsICAgICQxNiwgJWVheCAgICAgICAgICAgICAgIC8qIG91dHB1dCB0aGlzLnZhbCBjaGFyICovCi0gICAgICAgIHN0b3NiCi0gICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdAotCi0uTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZToKLSAgICAgICAgLyogcmVnczogJWVzaSA9IGluLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGxlbgotICAgICAgICAgKgotICAgICAgICAgKiBlbHNlIGlmIChvcCAmIDE2KSB7Ci0gICAgICAgICAqICAgbGVuID0gdGhpcy52YWwKLSAgICAgICAgICogICBvcCAmPSAxNQotICAgICAgICAgKiAgIGlmIChvcCkgewotICAgICAgICAgKiAgICAgaWYgKG9wID4gYml0cykgewotICAgICAgICAgKiAgICAgICBob2xkIHw9ICooKHVuc2lnbmVkIHNob3J0ICopaW4pKysgPDwgYml0czsKLSAgICAgICAgICogICAgICAgYml0cyArPSAxNgotICAgICAgICAgKiAgICAgfQotICAgICAgICAgKiAgICAgbGVuICs9IGhvbGQgJiBtYXNrW29wXTsKLSAgICAgICAgICogICAgIGJpdHMgLT0gb3A7Ci0gICAgICAgICAqICAgICBob2xkID4+PSBvcDsKLSAgICAgICAgICogICB9Ci0gICAgICAgICAqLwotI2RlZmluZSBsZW5fciAlZWR4Ci0gICAgICAgIG1vdmwgICAgJWVheCwgbGVuX3IgICAgICAgICAgICAgLyogbGVuID0gdGhpcyAqLwotICAgICAgICBzaHJsICAgICQxNiwgbGVuX3IgICAgICAgICAgICAgIC8qIGxlbiA9IHRoaXMudmFsICovCi0gICAgICAgIG1vdmIgICAgJWFsLCAlY2wKLQotICAgICAgICB0ZXN0YiAgICQxNiwgJWFsCi0gICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aCAvKiBpZiAoKG9wICYgMTYpID09IDApIDglICovCi0gICAgICAgIGFuZGIgICAgJDE1LCAlY2wgICAgICAgICAgICAgICAgLyogb3AgJj0gMTUgKi8KLSAgICAgICAganogICAgICAuTF9zYXZlX2xlbiAgICAgICAgICAgICAvKiBpZiAoIW9wKSAqLwotICAgICAgICBjbXBiICAgICVjbCwgYml0c19yCi0gICAgICAgIGphZSAgICAgLkxfYWRkX2JpdHNfdG9fbGVuICAgICAgLyogaWYgKG9wIDw9IGJpdHMpICovCi0KLSAgICAgICAgbW92YiAgICAlY2wsICVjaCAgICAgICAgICAgICAgICAvKiBzdGFzaCBvcCBpbiBjaCwgZnJlZWluZyBjbCAqLwotICAgICAgICB4b3JsICAgICVlYXgsICVlYXgKLSAgICAgICAgbG9kc3cgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLwotICAgICAgICBtb3ZiICAgIGJpdHNfciwgJWNsICAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCi0gICAgICAgIGFkZGIgICAgJDE2LCBiaXRzX3IgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLwotICAgICAgICBzaGxsICAgICVjbCwgJWVheAotICAgICAgICBvcmwgICAgICVlYXgsIGhvbGRfciAgICAgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLwotICAgICAgICBtb3ZiICAgICVjaCwgJWNsICAgICAgICAgICAgICAgIC8qIG1vdmUgb3AgYmFjayB0byBlY3ggKi8KLQotLkxfYWRkX2JpdHNfdG9fbGVuOgotICAgICAgICBtb3ZsICAgICQxLCAlZWF4Ci0gICAgICAgIHNobGwgICAgJWNsLCAlZWF4Ci0gICAgICAgIGRlY2wgICAgJWVheAotICAgICAgICBzdWJiICAgICVjbCwgYml0c19yCi0gICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWF4ICAgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KLSAgICAgICAgc2hybCAgICAlY2wsIGhvbGRfcgotICAgICAgICBhZGRsICAgICVlYXgsIGxlbl9yICAgICAgICAgICAgIC8qIGxlbiArPSBob2xkICYgbWFza1tvcF0gKi8KLQotLkxfc2F2ZV9sZW46Ci0gICAgICAgIG1vdmwgICAgbGVuX3IsIGxlbiglZXNwKSAgICAgICAgLyogc2F2ZSBsZW4gKi8KLSN1bmRlZiAgbGVuX3IKLQotLkxfZGVjb2RlX2Rpc3RhbmNlOgotICAgICAgICAvKiByZWdzOiAlZXNpID0gaW4sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0LCAlZWR4ID0gZGlzdAotICAgICAgICAgKgotICAgICAgICAgKiAgIGlmIChiaXRzIDwgMTUpIHsKLSAgICAgICAgICogICAgIGhvbGQgfD0gKigodW5zaWduZWQgc2hvcnQgKilpbikrKyA8PCBiaXRzOwotICAgICAgICAgKiAgICAgYml0cyArPSAxNgotICAgICAgICAgKiAgIH0KLSAgICAgICAgICogICB0aGlzID0gZGNvZGVbaG9sZCAmIGRtYXNrXTsKLSAgICAgICAgICogZG9kaXN0OgotICAgICAgICAgKiAgIGJpdHMgLT0gdGhpcy5iaXRzOwotICAgICAgICAgKiAgIGhvbGQgPj49IHRoaXMuYml0czsKLSAgICAgICAgICogICBvcCA9IHRoaXMub3A7Ci0gICAgICAgICAqLwotCi0gICAgICAgIGNtcGIgICAgJDE1LCBiaXRzX3IKLSAgICAgICAgamEgICAgICAuTF9nZXRfZGlzdGFuY2VfY29kZSAgICAvKiBpZiAoMTUgPCBiaXRzKSAqLwotCi0gICAgICAgIHhvcmwgICAgJWVheCwgJWVheAotICAgICAgICBsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCi0gICAgICAgIG1vdmIgICAgYml0c19yLCAlY2wgICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KLSAgICAgICAgYWRkYiAgICAkMTYsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCi0gICAgICAgIHNobGwgICAgJWNsLCAlZWF4Ci0gICAgICAgIG9ybCAgICAgJWVheCwgaG9sZF9yICAgICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCi0KLS5MX2dldF9kaXN0YW5jZV9jb2RlOgotICAgICAgICBtb3ZsICAgIGRtYXNrKCVlc3ApLCAlZWR4ICAgICAgIC8qIGVkeCA9IGRtYXNrICovCi0gICAgICAgIG1vdmwgICAgZGNvZGUoJWVzcCksICVlY3ggICAgICAgLyogZWN4ID0gZGNvZGUgKi8KLSAgICAgICAgYW5kbCAgICBob2xkX3IsICVlZHggICAgICAgICAgICAvKiBlZHggJj0gaG9sZCAqLwotICAgICAgICBtb3ZsICAgICglZWN4LCVlZHgsNCksICVlYXggICAgIC8qIGVheCA9IGRjb2RlW2hvbGQgJiBkbWFza10gKi8KLQotI2RlZmluZSBkaXN0X3IgJWVkeAotLkxfZG9kaXN0OgotICAgICAgICBtb3ZsICAgICVlYXgsIGRpc3RfciAgICAgICAgICAgIC8qIGRpc3QgPSB0aGlzICovCi0gICAgICAgIHNocmwgICAgJDE2LCBkaXN0X3IgICAgICAgICAgICAgLyogZGlzdCA9IHRoaXMudmFsICovCi0gICAgICAgIG1vdmIgICAgJWFoLCAlY2wKLSAgICAgICAgc3ViYiAgICAlYWgsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLwotICAgICAgICBzaHJsICAgICVjbCwgaG9sZF9yICAgICAgICAgICAgIC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLwotCi0gICAgICAgIC8qIGlmIChvcCAmIDE2KSB7Ci0gICAgICAgICAqICAgZGlzdCA9IHRoaXMudmFsCi0gICAgICAgICAqICAgb3AgJj0gMTUKLSAgICAgICAgICogICBpZiAob3AgPiBiaXRzKSB7Ci0gICAgICAgICAqICAgICBob2xkIHw9ICooKHVuc2lnbmVkIHNob3J0ICopaW4pKysgPDwgYml0czsKLSAgICAgICAgICogICAgIGJpdHMgKz0gMTYKLSAgICAgICAgICogICB9Ci0gICAgICAgICAqICAgZGlzdCArPSBob2xkICYgbWFza1tvcF07Ci0gICAgICAgICAqICAgYml0cyAtPSBvcDsKLSAgICAgICAgICogICBob2xkID4+PSBvcDsKLSAgICAgICAgICovCi0gICAgICAgIG1vdmIgICAgJWFsLCAlY2wgICAgICAgICAgICAgICAgLyogY2wgPSB0aGlzLm9wICovCi0KLSAgICAgICAgdGVzdGIgICAkMTYsICVhbCAgICAgICAgICAgICAgICAvKiBpZiAoKG9wICYgMTYpID09IDApICovCi0gICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3QKLSAgICAgICAgYW5kYiAgICAkMTUsICVjbCAgICAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLwotICAgICAgICBqeiAgICAgIC5MX2NoZWNrX2Rpc3Rfb25lCi0gICAgICAgIGNtcGIgICAgJWNsLCBiaXRzX3IKLSAgICAgICAgamFlICAgICAuTF9hZGRfYml0c190b19kaXN0ICAgICAvKiBpZiAob3AgPD0gYml0cykgOTcuNiUgKi8KLQotICAgICAgICBtb3ZiICAgICVjbCwgJWNoICAgICAgICAgICAgICAgIC8qIHN0YXNoIG9wIGluIGNoLCBmcmVlaW5nIGNsICovCi0gICAgICAgIHhvcmwgICAgJWVheCwgJWVheAotICAgICAgICBsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCi0gICAgICAgIG1vdmIgICAgYml0c19yLCAlY2wgICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KLSAgICAgICAgYWRkYiAgICAkMTYsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCi0gICAgICAgIHNobGwgICAgJWNsLCAlZWF4Ci0gICAgICAgIG9ybCAgICAgJWVheCwgaG9sZF9yICAgICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCi0gICAgICAgIG1vdmIgICAgJWNoLCAlY2wgICAgICAgICAgICAgICAgLyogbW92ZSBvcCBiYWNrIHRvIGVjeCAqLwotCi0uTF9hZGRfYml0c190b19kaXN0OgotICAgICAgICBtb3ZsICAgICQxLCAlZWF4Ci0gICAgICAgIHNobGwgICAgJWNsLCAlZWF4Ci0gICAgICAgIGRlY2wgICAgJWVheCAgICAgICAgICAgICAgICAgICAgLyogKDEgPDwgb3ApIC0gMSAqLwotICAgICAgICBzdWJiICAgICVjbCwgYml0c19yCi0gICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWF4ICAgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KLSAgICAgICAgc2hybCAgICAlY2wsIGhvbGRfcgotICAgICAgICBhZGRsICAgICVlYXgsIGRpc3RfciAgICAgICAgICAgIC8qIGRpc3QgKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKSAqLwotICAgICAgICBqbXAgICAgIC5MX2NoZWNrX3dpbmRvdwotCi0uTF9jaGVja193aW5kb3c6Ci0gICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBmcm9tLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGRpc3QKLSAgICAgICAgICogICAgICAgJWVjeCA9IG5ieXRlcwotICAgICAgICAgKgotICAgICAgICAgKiBuYnl0ZXMgPSBvdXQgLSBiZWc7Ci0gICAgICAgICAqIGlmIChkaXN0IDw9IG5ieXRlcykgewotICAgICAgICAgKiAgIGZyb20gPSBvdXQgLSBkaXN0OwotICAgICAgICAgKiAgIGRvIHsKLSAgICAgICAgICogICAgIFBVUChvdXQpID0gUFVQKGZyb20pOwotICAgICAgICAgKiAgIH0gd2hpbGUgKC0tbGVuID4gMCkgewotICAgICAgICAgKiB9Ci0gICAgICAgICAqLwotCi0gICAgICAgIG1vdmwgICAgaW5fciwgaW4oJWVzcCkgICAgICAgICAgLyogc2F2ZSBpbiBzbyBmcm9tIGNhbiB1c2UgaXQncyByZWcgKi8KLSAgICAgICAgbW92bCAgICBvdXRfciwgJWVheAotICAgICAgICBzdWJsICAgIGJlZyglZXNwKSwgJWVheCAgICAgICAgIC8qIG5ieXRlcyA9IG91dCAtIGJlZyAqLwotCi0gICAgICAgIGNtcGwgICAgZGlzdF9yLCAlZWF4Ci0gICAgICAgIGpiICAgICAgLkxfY2xpcF93aW5kb3cgICAgICAgICAgLyogaWYgKGRpc3QgPiBuYnl0ZXMpIDQuMiUgKi8KLQotICAgICAgICBtb3ZsICAgIGxlbiglZXNwKSwgJWVjeAotICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3IKLSAgICAgICAgc3VibCAgICBkaXN0X3IsIGZyb21fciAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLwotCi0gICAgICAgIHN1YmwgICAgJDMsICVlY3gKLSAgICAgICAgbW92YiAgICAoZnJvbV9yKSwgJWFsCi0gICAgICAgIG1vdmIgICAgJWFsLCAob3V0X3IpCi0gICAgICAgIG1vdmIgICAgMShmcm9tX3IpLCAlYWwKLSAgICAgICAgbW92YiAgICAyKGZyb21fciksICVkbAotICAgICAgICBhZGRsICAgICQzLCBmcm9tX3IKLSAgICAgICAgbW92YiAgICAlYWwsIDEob3V0X3IpCi0gICAgICAgIG1vdmIgICAgJWRsLCAyKG91dF9yKQotICAgICAgICBhZGRsICAgICQzLCBvdXRfcgotICAgICAgICByZXAgICAgIG1vdnNiCi0KLSAgICAgICAgbW92bCAgICBpbiglZXNwKSwgaW5fciAgICAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCi0gICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdAotCi0uYWxpZ24gMTYsMHg5MAotLkxfY2hlY2tfZGlzdF9vbmU6Ci0gICAgICAgIGNtcGwgICAgJDEsIGRpc3RfcgotICAgICAgICBqbmUgICAgIC5MX2NoZWNrX3dpbmRvdwotICAgICAgICBjbXBsICAgIG91dF9yLCBiZWcoJWVzcCkKLSAgICAgICAgamUgICAgICAuTF9jaGVja193aW5kb3cKLQotICAgICAgICBkZWNsICAgIG91dF9yCi0gICAgICAgIG1vdmwgICAgbGVuKCVlc3ApLCAlZWN4Ci0gICAgICAgIG1vdmIgICAgKG91dF9yKSwgJWFsCi0gICAgICAgIHN1YmwgICAgJDMsICVlY3gKLQotICAgICAgICBtb3ZiICAgICVhbCwgMShvdXRfcikKLSAgICAgICAgbW92YiAgICAlYWwsIDIob3V0X3IpCi0gICAgICAgIG1vdmIgICAgJWFsLCAzKG91dF9yKQotICAgICAgICBhZGRsICAgICQ0LCBvdXRfcgotICAgICAgICByZXAgICAgIHN0b3NiCi0KLSAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0Ci0KLS5hbGlnbiAxNiwweDkwCi0uTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoOgotICAgICAgICAvKiBlbHNlIGlmICgob3AgJiA2NCkgPT0gMCkgewotICAgICAgICAgKiAgIHRoaXMgPSBsY29kZVt0aGlzLnZhbCArIChob2xkICYgbWFza1tvcF0pXTsKLSAgICAgICAgICogfQotICAgICAgICAgKi8KLSAgICAgICAgdGVzdGIgICAkNjQsICVhbAotICAgICAgICBqbnogICAgIC5MX3Rlc3RfZm9yX2VuZF9vZl9ibG9jayAgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLwotCi0gICAgICAgIG1vdmwgICAgJDEsICVlYXgKLSAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKLSAgICAgICAgZGVjbCAgICAlZWF4Ci0gICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWF4ICAgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KLSAgICAgICAgYWRkbCAgICAlZWR4LCAlZWF4ICAgICAgICAgICAgICAvKiBlYXggKz0gdGhpcy52YWwgKi8KLSAgICAgICAgbW92bCAgICBsY29kZSglZXNwKSwgJWVkeCAgICAgICAvKiBlZHggPSBsY29kZSAqLwotICAgICAgICBtb3ZsICAgICglZWR4LCVlYXgsNCksICVlYXggICAgIC8qIGVheCA9IGxjb2RlW3ZhbCArIChob2xkJm1hc2tbb3BdKV0gKi8KLSAgICAgICAgam1wICAgICAuTF9kb2xlbgotCi0uYWxpZ24gMTYsMHg5MAotLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3Q6Ci0gICAgICAgIC8qIGVsc2UgaWYgKChvcCAmIDY0KSA9PSAwKSB7Ci0gICAgICAgICAqICAgdGhpcyA9IGRjb2RlW3RoaXMudmFsICsgKGhvbGQgJiBtYXNrW29wXSldOwotICAgICAgICAgKiB9Ci0gICAgICAgICAqLwotICAgICAgICB0ZXN0YiAgICQ2NCwgJWFsCi0gICAgICAgIGpueiAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlICAvKiBpZiAoKG9wICYgNjQpICE9IDApICovCi0KLSAgICAgICAgbW92bCAgICAkMSwgJWVheAotICAgICAgICBzaGxsICAgICVjbCwgJWVheAotICAgICAgICBkZWNsICAgICVlYXgKLSAgICAgICAgYW5kbCAgICBob2xkX3IsICVlYXggICAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLwotICAgICAgICBhZGRsICAgICVlZHgsICVlYXggICAgICAgICAgICAgIC8qIGVheCArPSB0aGlzLnZhbCAqLwotICAgICAgICBtb3ZsICAgIGRjb2RlKCVlc3ApLCAlZWR4ICAgICAgIC8qIGVkeCA9IGRjb2RlICovCi0gICAgICAgIG1vdmwgICAgKCVlZHgsJWVheCw0KSwgJWVheCAgICAgLyogZWF4ID0gZGNvZGVbdmFsICsgKGhvbGQmbWFza1tvcF0pXSAqLwotICAgICAgICBqbXAgICAgIC5MX2RvZGlzdAotCi0uYWxpZ24gMTYsMHg5MAotLkxfY2xpcF93aW5kb3c6Ci0gICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBmcm9tLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGRpc3QKLSAgICAgICAgICogICAgICAgJWVjeCA9IG5ieXRlcwotICAgICAgICAgKgotICAgICAgICAgKiBlbHNlIHsKLSAgICAgICAgICogICBpZiAoZGlzdCA+IHdzaXplKSB7Ci0gICAgICAgICAqICAgICBpbnZhbGlkIGRpc3RhbmNlCi0gICAgICAgICAqICAgfQotICAgICAgICAgKiAgIGZyb20gPSB3aW5kb3c7Ci0gICAgICAgICAqICAgbmJ5dGVzID0gZGlzdCAtIG5ieXRlczsKLSAgICAgICAgICogICBpZiAod3JpdGUgPT0gMCkgewotICAgICAgICAgKiAgICAgZnJvbSArPSB3c2l6ZSAtIG5ieXRlczsKLSAgICAgICAgICovCi0jZGVmaW5lIG5ieXRlc19yICVlY3gKLSAgICAgICAgbW92bCAgICAlZWF4LCBuYnl0ZXNfcgotICAgICAgICBtb3ZsICAgIHdzaXplKCVlc3ApLCAlZWF4ICAgICAgIC8qIHByZXBhcmUgZm9yIGRpc3QgY29tcGFyZSAqLwotICAgICAgICBuZWdsICAgIG5ieXRlc19yICAgICAgICAgICAgICAgIC8qIG5ieXRlcyA9IC1uYnl0ZXMgKi8KLSAgICAgICAgbW92bCAgICB3aW5kb3coJWVzcCksIGZyb21fciAgICAvKiBmcm9tID0gd2luZG93ICovCi0KLSAgICAgICAgY21wbCAgICBkaXN0X3IsICVlYXgKLSAgICAgICAgamIgICAgICAuTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXIgLyogaWYgKGRpc3QgPiB3c2l6ZSkgKi8KLQotICAgICAgICBhZGRsICAgIGRpc3RfciwgbmJ5dGVzX3IgICAgICAgIC8qIG5ieXRlcyA9IGRpc3QgLSBuYnl0ZXMgKi8KLSAgICAgICAgY21wbCAgICAkMCwgd3JpdGUoJWVzcCkKLSAgICAgICAgam5lICAgICAuTF93cmFwX2Fyb3VuZF93aW5kb3cgICAvKiBpZiAod3JpdGUgIT0gMCkgKi8KLQotICAgICAgICBzdWJsICAgIG5ieXRlc19yLCAlZWF4Ci0gICAgICAgIGFkZGwgICAgJWVheCwgZnJvbV9yICAgICAgICAgICAgLyogZnJvbSArPSB3c2l6ZSAtIG5ieXRlcyAqLwotCi0gICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBmcm9tLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGRpc3QKLSAgICAgICAgICogICAgICAgJWVjeCA9IG5ieXRlcywgJWVheCA9IGxlbgotICAgICAgICAgKgotICAgICAgICAgKiAgICAgaWYgKG5ieXRlcyA8IGxlbikgewotICAgICAgICAgKiAgICAgICBsZW4gLT0gbmJ5dGVzOwotICAgICAgICAgKiAgICAgICBkbyB7Ci0gICAgICAgICAqICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAqICAgICAgIH0gd2hpbGUgKC0tbmJ5dGVzKTsKLSAgICAgICAgICogICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7Ci0gICAgICAgICAqICAgICB9Ci0gICAgICAgICAqICAgfQotICAgICAgICAgKi8KLSNkZWZpbmUgbGVuX3IgJWVheAotICAgICAgICBtb3ZsICAgIGxlbiglZXNwKSwgbGVuX3IKLSAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3IKLSAgICAgICAgamJlICAgICAuTF9kb19jb3B5MSAgICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KLQotICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KLSAgICAgICAgcmVwICAgICBtb3ZzYgotICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3IKLSAgICAgICAgc3VibCAgICBkaXN0X3IsIGZyb21fciAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLwotICAgICAgICBqbXAgICAgIC5MX2RvX2NvcHkxCi0KLSAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3IKLSAgICAgICAgamJlICAgICAuTF9kb19jb3B5MSAgICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KLQotICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KLSAgICAgICAgcmVwICAgICBtb3ZzYgotICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3IKLSAgICAgICAgc3VibCAgICBkaXN0X3IsIGZyb21fciAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLwotICAgICAgICBqbXAgICAgIC5MX2RvX2NvcHkxCi0KLS5MX3dyYXBfYXJvdW5kX3dpbmRvdzoKLSAgICAgICAgLyogcmVnczogJWVzaSA9IGZyb20sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0LCAlZWR4ID0gZGlzdAotICAgICAgICAgKiAgICAgICAlZWN4ID0gbmJ5dGVzLCAlZWF4ID0gd3JpdGUsICVlYXggPSBsZW4KLSAgICAgICAgICoKLSAgICAgICAgICogICBlbHNlIGlmICh3cml0ZSA8IG5ieXRlcykgewotICAgICAgICAgKiAgICAgZnJvbSArPSB3c2l6ZSArIHdyaXRlIC0gbmJ5dGVzOwotICAgICAgICAgKiAgICAgbmJ5dGVzIC09IHdyaXRlOwotICAgICAgICAgKiAgICAgaWYgKG5ieXRlcyA8IGxlbikgewotICAgICAgICAgKiAgICAgICBsZW4gLT0gbmJ5dGVzOwotICAgICAgICAgKiAgICAgICBkbyB7Ci0gICAgICAgICAqICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAqICAgICAgIH0gd2hpbGUgKC0tbmJ5dGVzKTsKLSAgICAgICAgICogICAgICAgZnJvbSA9IHdpbmRvdzsKLSAgICAgICAgICogICAgICAgbmJ5dGVzID0gd3JpdGU7Ci0gICAgICAgICAqICAgICAgIGlmIChuYnl0ZXMgPCBsZW4pIHsKLSAgICAgICAgICogICAgICAgICBsZW4gLT0gbmJ5dGVzOwotICAgICAgICAgKiAgICAgICAgIGRvIHsKLSAgICAgICAgICogICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOwotICAgICAgICAgKiAgICAgICAgIH0gd2hpbGUoLS1uYnl0ZXMpOwotICAgICAgICAgKiAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OwotICAgICAgICAgKiAgICAgICB9Ci0gICAgICAgICAqICAgICB9Ci0gICAgICAgICAqICAgfQotICAgICAgICAgKi8KLSNkZWZpbmUgd3JpdGVfciAlZWF4Ci0gICAgICAgIG1vdmwgICAgd3JpdGUoJWVzcCksIHdyaXRlX3IKLSAgICAgICAgY21wbCAgICB3cml0ZV9yLCBuYnl0ZXNfcgotICAgICAgICBqYmUgICAgIC5MX2NvbnRpZ3VvdXNfaW5fd2luZG93IC8qIGlmICh3cml0ZSA+PSBuYnl0ZXMpICovCi0KLSAgICAgICAgYWRkbCAgICB3c2l6ZSglZXNwKSwgZnJvbV9yCi0gICAgICAgIGFkZGwgICAgd3JpdGVfciwgZnJvbV9yCi0gICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGZyb21fciAgICAgICAgLyogZnJvbSArPSB3c2l6ZSArIHdyaXRlIC0gbmJ5dGVzICovCi0gICAgICAgIHN1YmwgICAgd3JpdGVfciwgbmJ5dGVzX3IgICAgICAgLyogbmJ5dGVzIC09IHdyaXRlICovCi0jdW5kZWYgd3JpdGVfcgotCi0gICAgICAgIG1vdmwgICAgbGVuKCVlc3ApLCBsZW5fcgotICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgotICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxICAgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0gICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLwotICAgICAgICByZXAgICAgIG1vdnNiCi0gICAgICAgIG1vdmwgICAgd2luZG93KCVlc3ApLCBmcm9tX3IgICAgLyogZnJvbSA9IHdpbmRvdyAqLwotICAgICAgICBtb3ZsICAgIHdyaXRlKCVlc3ApLCBuYnl0ZXNfciAgIC8qIG5ieXRlcyA9IHdyaXRlICovCi0gICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yCi0gICAgICAgIGpiZSAgICAgLkxfZG9fY29weTEgICAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCi0KLSAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCi0gICAgICAgIHJlcCAgICAgbW92c2IKLSAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yCi0gICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KLSAgICAgICAgam1wICAgICAuTF9kb19jb3B5MQotCi0uTF9jb250aWd1b3VzX2luX3dpbmRvdzoKLSAgICAgICAgLyogcmVnczogJWVzaSA9IGZyb20sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0LCAlZWR4ID0gZGlzdAotICAgICAgICAgKiAgICAgICAlZWN4ID0gbmJ5dGVzLCAlZWF4ID0gd3JpdGUsICVlYXggPSBsZW4KLSAgICAgICAgICoKLSAgICAgICAgICogICBlbHNlIHsKLSAgICAgICAgICogICAgIGZyb20gKz0gd3JpdGUgLSBuYnl0ZXM7Ci0gICAgICAgICAqICAgICBpZiAobmJ5dGVzIDwgbGVuKSB7Ci0gICAgICAgICAqICAgICAgIGxlbiAtPSBuYnl0ZXM7Ci0gICAgICAgICAqICAgICAgIGRvIHsKLSAgICAgICAgICogICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKLSAgICAgICAgICogICAgICAgfSB3aGlsZSAoLS1uYnl0ZXMpOwotICAgICAgICAgKiAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsKLSAgICAgICAgICogICAgIH0KLSAgICAgICAgICogICB9Ci0gICAgICAgICAqLwotI2RlZmluZSB3cml0ZV9yICVlYXgKLSAgICAgICAgYWRkbCAgICB3cml0ZV9yLCBmcm9tX3IKLSAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgZnJvbV9yICAgICAgICAvKiBmcm9tICs9IHdyaXRlIC0gbmJ5dGVzICovCi0jdW5kZWYgd3JpdGVfcgotCi0gICAgICAgIG1vdmwgICAgbGVuKCVlc3ApLCBsZW5fcgotICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgotICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxICAgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0gICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLwotICAgICAgICByZXAgICAgIG1vdnNiCi0gICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgotICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0KLS5MX2RvX2NvcHkxOgotICAgICAgICAvKiByZWdzOiAlZXNpID0gZnJvbSwgJWVzaSA9IGluLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dAotICAgICAgICAgKiAgICAgICAlZWF4ID0gbGVuCi0gICAgICAgICAqCi0gICAgICAgICAqICAgICB3aGlsZSAobGVuID4gMCkgewotICAgICAgICAgKiAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKLSAgICAgICAgICogICAgICAgbGVuLS07Ci0gICAgICAgICAqICAgICB9Ci0gICAgICAgICAqICAgfQotICAgICAgICAgKiB9IHdoaWxlIChpbiA8IGxhc3QgJiYgb3V0IDwgZW5kKTsKLSAgICAgICAgICovCi0jdW5kZWYgbmJ5dGVzX3IKLSNkZWZpbmUgaW5fciAlZXNpCi0gICAgICAgIG1vdmwgICAgbGVuX3IsICVlY3gKLSAgICAgICAgcmVwICAgICBtb3ZzYgotCi0gICAgICAgIG1vdmwgICAgaW4oJWVzcCksIGluX3IgICAgICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLwotICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3QKLQotI3VuZGVmIGxlbl9yCi0jdW5kZWYgZGlzdF9yCi0KLSNlbmRpZiAvKiBOT19NTVggfHwgUlVOX1RJTUVfTU1YICovCi0KLQotLyoqKiBNTVggY29kZSAqKiovCi0KLSNpZiBkZWZpbmVkKCBVU0VfTU1YICkgfHwgZGVmaW5lZCggUlVOX1RJTUVfTU1YICkKLQotLmFsaWduIDMyLDB4OTAKLS5MX2luaXRfbW14OgotICAgICAgICBlbW1zCi0KLSN1bmRlZiAgYml0c19yCi0jdW5kZWYgIGJpdHNsb25nX3IKLSNkZWZpbmUgYml0c2xvbmdfciAlZWJwCi0jZGVmaW5lIGhvbGRfbW0gICAgJW1tMAotICAgICAgICBtb3ZkICAgICVlYnAsIGhvbGRfbW0KLSAgICAgICAgbW92bCAgICAlZWJ4LCBiaXRzbG9uZ19yCi0KLSNkZWZpbmUgdXNlZF9tbSAgICVtbTEKLSNkZWZpbmUgZG1hc2syX21tICVtbTIKLSNkZWZpbmUgbG1hc2syX21tICVtbTMKLSNkZWZpbmUgbG1hc2tfbW0gICVtbTQKLSNkZWZpbmUgZG1hc2tfbW0gICVtbTUKLSNkZWZpbmUgdG1wX21tICAgICVtbTYKLQotICAgICAgICBtb3ZkICAgIGxtYXNrKCVlc3ApLCBsbWFza19tbQotICAgICAgICBtb3ZxICAgIGxtYXNrX21tLCBsbWFzazJfbW0KLSAgICAgICAgbW92ZCAgICBkbWFzayglZXNwKSwgZG1hc2tfbW0KLSAgICAgICAgbW92cSAgICBkbWFza19tbSwgZG1hc2syX21tCi0gICAgICAgIHB4b3IgICAgdXNlZF9tbSwgdXNlZF9tbQotICAgICAgICBtb3ZsICAgIGxjb2RlKCVlc3ApLCAlZWJ4ICAgICAgIC8qIGVieCA9IGxjb2RlICovCi0gICAgICAgIGptcCAgICAgLkxfZG9fbG9vcF9tbXgKLQotLmFsaWduIDMyLDB4OTAKLS5MX3doaWxlX3Rlc3RfbW14OgotICAgICAgICAvKiB3aGlsZSAoaW4gPCBsYXN0ICYmIG91dCA8IGVuZCkKLSAgICAgICAgICovCi0gICAgICAgIGNtcGwgICAgb3V0X3IsIGVuZCglZXNwKQotICAgICAgICBqYmUgICAgIC5MX2JyZWFrX2xvb3AgICAgICAgICAgIC8qIGlmIChvdXQgPj0gZW5kKSAqLwotCi0gICAgICAgIGNtcGwgICAgaW5fciwgbGFzdCglZXNwKQotICAgICAgICBqYmUgICAgIC5MX2JyZWFrX2xvb3AKLQotLkxfZG9fbG9vcF9tbXg6Ci0gICAgICAgIHBzcmxxICAgdXNlZF9tbSwgaG9sZF9tbSAgICAgICAgLyogaG9sZF9tbSA+Pj0gbGFzdCBiaXQgbGVuZ3RoICovCi0KLSAgICAgICAgY21wbCAgICAkMzIsIGJpdHNsb25nX3IKLSAgICAgICAgamEgICAgICAuTF9nZXRfbGVuZ3RoX2NvZGVfbW14ICAvKiBpZiAoMzIgPCBiaXRzKSAqLwotCi0gICAgICAgIG1vdmQgICAgYml0c2xvbmdfciwgdG1wX21tCi0gICAgICAgIG1vdmQgICAgKGluX3IpLCAlbW03Ci0gICAgICAgIGFkZGwgICAgJDQsIGluX3IKLSAgICAgICAgcHNsbHEgICB0bXBfbW0sICVtbTcKLSAgICAgICAgYWRkbCAgICAkMzIsIGJpdHNsb25nX3IKLSAgICAgICAgcG9yICAgICAlbW03LCBob2xkX21tICAgICAgICAgICAvKiBob2xkX21tIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovCi0KLS5MX2dldF9sZW5ndGhfY29kZV9tbXg6Ci0gICAgICAgIHBhbmQgICAgaG9sZF9tbSwgbG1hc2tfbW0KLSAgICAgICAgbW92ZCAgICBsbWFza19tbSwgJWVheAotICAgICAgICBtb3ZxICAgIGxtYXNrMl9tbSwgbG1hc2tfbW0KLSAgICAgICAgbW92bCAgICAoJWVieCwlZWF4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCi0KLS5MX2RvbGVuX21teDoKLSAgICAgICAgbW92emJsICAlYWgsICVlY3ggICAgICAgICAgICAgICAvKiBlY3ggPSB0aGlzLmJpdHMgKi8KLSAgICAgICAgbW92ZCAgICAlZWN4LCB1c2VkX21tCi0gICAgICAgIHN1YmwgICAgJWVjeCwgYml0c2xvbmdfciAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KLQotICAgICAgICB0ZXN0YiAgICVhbCwgJWFsCi0gICAgICAgIGpueiAgICAgLkxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2VfbW14IC8qIGlmIChvcCAhPSAwKSA0NS43JSAqLwotCi0gICAgICAgIHNocmwgICAgJDE2LCAlZWF4ICAgICAgICAgICAgICAgLyogb3V0cHV0IHRoaXMudmFsIGNoYXIgKi8KLSAgICAgICAgc3Rvc2IKLSAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0X21teAotCi0uTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZV9tbXg6Ci0jZGVmaW5lIGxlbl9yICAlZWR4Ci0gICAgICAgIG1vdmwgICAgJWVheCwgbGVuX3IgICAgICAgICAgICAgLyogbGVuID0gdGhpcyAqLwotICAgICAgICBzaHJsICAgICQxNiwgbGVuX3IgICAgICAgICAgICAgIC8qIGxlbiA9IHRoaXMudmFsICovCi0KLSAgICAgICAgdGVzdGIgICAkMTYsICVhbAotICAgICAgICBqeiAgICAgIC5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGhfbW14IC8qIGlmICgob3AgJiAxNikgPT0gMCkgOCUgKi8KLSAgICAgICAgYW5kbCAgICAkMTUsICVlYXggICAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLwotICAgICAgICBqeiAgICAgIC5MX2RlY29kZV9kaXN0YW5jZV9tbXggIC8qIGlmICghb3ApICovCi0KLSAgICAgICAgcHNybHEgICB1c2VkX21tLCBob2xkX21tICAgICAgICAvKiBob2xkX21tID4+PSBsYXN0IGJpdCBsZW5ndGggKi8KLSAgICAgICAgbW92ZCAgICAlZWF4LCB1c2VkX21tCi0gICAgICAgIG1vdmQgICAgaG9sZF9tbSwgJWVjeAotICAgICAgICBzdWJsICAgICVlYXgsIGJpdHNsb25nX3IKLSAgICAgICAgYW5kbCAgICAuTF9tYXNrKCwlZWF4LDQpLCAlZWN4Ci0gICAgICAgIGFkZGwgICAgJWVjeCwgbGVuX3IgICAgICAgICAgICAgLyogbGVuICs9IGhvbGQgJiBtYXNrW29wXSAqLwotCi0uTF9kZWNvZGVfZGlzdGFuY2VfbW14OgotICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLwotCi0gICAgICAgIGNtcGwgICAgJDMyLCBiaXRzbG9uZ19yCi0gICAgICAgIGphICAgICAgLkxfZ2V0X2Rpc3RfY29kZV9tbXggICAgLyogaWYgKDMyIDwgYml0cykgKi8KLQotICAgICAgICBtb3ZkICAgIGJpdHNsb25nX3IsIHRtcF9tbQotICAgICAgICBtb3ZkICAgIChpbl9yKSwgJW1tNwotICAgICAgICBhZGRsICAgICQ0LCBpbl9yCi0gICAgICAgIHBzbGxxICAgdG1wX21tLCAlbW03Ci0gICAgICAgIGFkZGwgICAgJDMyLCBiaXRzbG9uZ19yCi0gICAgICAgIHBvciAgICAgJW1tNywgaG9sZF9tbSAgICAgICAgICAgLyogaG9sZF9tbSB8PSAqKCh1aW50ICopaW4pKysgPDwgYml0cyAqLwotCi0uTF9nZXRfZGlzdF9jb2RlX21teDoKLSAgICAgICAgbW92bCAgICBkY29kZSglZXNwKSwgJWVieCAgICAgICAvKiBlYnggPSBkY29kZSAqLwotICAgICAgICBwYW5kICAgIGhvbGRfbW0sIGRtYXNrX21tCi0gICAgICAgIG1vdmQgICAgZG1hc2tfbW0sICVlYXgKLSAgICAgICAgbW92cSAgICBkbWFzazJfbW0sIGRtYXNrX21tCi0gICAgICAgIG1vdmwgICAgKCVlYngsJWVheCw0KSwgJWVheCAgICAgLyogZWF4ID0gZGNvZGVbaG9sZCAmIGxtYXNrXSAqLwotCi0uTF9kb2Rpc3RfbW14OgotI2RlZmluZSBkaXN0X3IgJWVieAotICAgICAgICBtb3Z6YmwgICVhaCwgJWVjeCAgICAgICAgICAgICAgIC8qIGVjeCA9IHRoaXMuYml0cyAqLwotICAgICAgICBtb3ZsICAgICVlYXgsIGRpc3RfcgotICAgICAgICBzaHJsICAgICQxNiwgZGlzdF9yICAgICAgICAgICAgIC8qIGRpc3QgID0gdGhpcy52YWwgKi8KLSAgICAgICAgc3VibCAgICAlZWN4LCBiaXRzbG9uZ19yICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLwotICAgICAgICBtb3ZkICAgICVlY3gsIHVzZWRfbW0KLQotICAgICAgICB0ZXN0YiAgICQxNiwgJWFsICAgICAgICAgICAgICAgIC8qIGlmICgob3AgJiAxNikgPT0gMCkgKi8KLSAgICAgICAganogICAgICAuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdF9tbXgKLSAgICAgICAgYW5kbCAgICAkMTUsICVlYXggICAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLwotICAgICAgICBqeiAgICAgIC5MX2NoZWNrX2Rpc3Rfb25lX21teAotCi0uTF9hZGRfYml0c190b19kaXN0X21teDoKLSAgICAgICAgcHNybHEgICB1c2VkX21tLCBob2xkX21tICAgICAgICAvKiBob2xkX21tID4+PSBsYXN0IGJpdCBsZW5ndGggKi8KLSAgICAgICAgbW92ZCAgICAlZWF4LCB1c2VkX21tICAgICAgICAgICAvKiBzYXZlIGJpdCBsZW5ndGggb2YgY3VycmVudCBvcCAqLwotICAgICAgICBtb3ZkICAgIGhvbGRfbW0sICVlY3ggICAgICAgICAgIC8qIGdldCB0aGUgbmV4dCBiaXRzIG9uIGlucHV0IHN0cmVhbSAqLwotICAgICAgICBzdWJsICAgICVlYXgsIGJpdHNsb25nX3IgICAgICAgIC8qIGJpdHMgLT0gb3AgYml0cyAqLwotICAgICAgICBhbmRsICAgIC5MX21hc2soLCVlYXgsNCksICVlY3ggIC8qIGVjeCAgID0gaG9sZCAmIG1hc2tbb3BdICovCi0gICAgICAgIGFkZGwgICAgJWVjeCwgZGlzdF9yICAgICAgICAgICAgLyogZGlzdCArPSBob2xkICYgbWFza1tvcF0gKi8KLQotLkxfY2hlY2tfd2luZG93X21teDoKLSAgICAgICAgbW92bCAgICBpbl9yLCBpbiglZXNwKSAgICAgICAgICAvKiBzYXZlIGluIHNvIGZyb20gY2FuIHVzZSBpdCdzIHJlZyAqLwotICAgICAgICBtb3ZsICAgIG91dF9yLCAlZWF4Ci0gICAgICAgIHN1YmwgICAgYmVnKCVlc3ApLCAlZWF4ICAgICAgICAgLyogbmJ5dGVzID0gb3V0IC0gYmVnICovCi0KLSAgICAgICAgY21wbCAgICBkaXN0X3IsICVlYXgKLSAgICAgICAgamIgICAgICAuTF9jbGlwX3dpbmRvd19tbXggICAgICAvKiBpZiAoZGlzdCA+IG5ieXRlcykgNC4yJSAqLwotCi0gICAgICAgIG1vdmwgICAgbGVuX3IsICVlY3gKLSAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yCi0gICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KLQotICAgICAgICBzdWJsICAgICQzLCAlZWN4Ci0gICAgICAgIG1vdmIgICAgKGZyb21fciksICVhbAotICAgICAgICBtb3ZiICAgICVhbCwgKG91dF9yKQotICAgICAgICBtb3ZiICAgIDEoZnJvbV9yKSwgJWFsCi0gICAgICAgIG1vdmIgICAgMihmcm9tX3IpLCAlZGwKLSAgICAgICAgYWRkbCAgICAkMywgZnJvbV9yCi0gICAgICAgIG1vdmIgICAgJWFsLCAxKG91dF9yKQotICAgICAgICBtb3ZiICAgICVkbCwgMihvdXRfcikKLSAgICAgICAgYWRkbCAgICAkMywgb3V0X3IKLSAgICAgICAgcmVwICAgICBtb3ZzYgotCi0gICAgICAgIG1vdmwgICAgaW4oJWVzcCksIGluX3IgICAgICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLwotICAgICAgICBtb3ZsICAgIGxjb2RlKCVlc3ApLCAlZWJ4ICAgICAgIC8qIG1vdmUgbGNvZGUgYmFjayB0byAlZWJ4LCB0b3NzIGRpc3QgKi8KLSAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0X21teAotCi0uYWxpZ24gMTYsMHg5MAotLkxfY2hlY2tfZGlzdF9vbmVfbW14OgotICAgICAgICBjbXBsICAgICQxLCBkaXN0X3IKLSAgICAgICAgam5lICAgICAuTF9jaGVja193aW5kb3dfbW14Ci0gICAgICAgIGNtcGwgICAgb3V0X3IsIGJlZyglZXNwKQotICAgICAgICBqZSAgICAgIC5MX2NoZWNrX3dpbmRvd19tbXgKLQotICAgICAgICBkZWNsICAgIG91dF9yCi0gICAgICAgIG1vdmwgICAgbGVuX3IsICVlY3gKLSAgICAgICAgbW92YiAgICAob3V0X3IpLCAlYWwKLSAgICAgICAgc3VibCAgICAkMywgJWVjeAotCi0gICAgICAgIG1vdmIgICAgJWFsLCAxKG91dF9yKQotICAgICAgICBtb3ZiICAgICVhbCwgMihvdXRfcikKLSAgICAgICAgbW92YiAgICAlYWwsIDMob3V0X3IpCi0gICAgICAgIGFkZGwgICAgJDQsIG91dF9yCi0gICAgICAgIHJlcCAgICAgc3Rvc2IKLQotICAgICAgICBtb3ZsICAgIGxjb2RlKCVlc3ApLCAlZWJ4ICAgICAgIC8qIG1vdmUgbGNvZGUgYmFjayB0byAlZWJ4LCB0b3NzIGRpc3QgKi8KLSAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0X21teAotCi0uYWxpZ24gMTYsMHg5MAotLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aF9tbXg6Ci0gICAgICAgIHRlc3RiICAgJDY0LCAlYWwKLSAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2sgIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KLQotICAgICAgICBhbmRsICAgICQxNSwgJWVheAotICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLwotICAgICAgICBtb3ZkICAgIGhvbGRfbW0sICVlY3gKLSAgICAgICAgYW5kbCAgICAuTF9tYXNrKCwlZWF4LDQpLCAlZWN4Ci0gICAgICAgIGFkZGwgICAgbGVuX3IsICVlY3gKLSAgICAgICAgbW92bCAgICAoJWVieCwlZWN4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCi0gICAgICAgIGptcCAgICAgLkxfZG9sZW5fbW14Ci0KLS5hbGlnbiAxNiwweDkwCi0uTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdF9tbXg6Ci0gICAgICAgIHRlc3RiICAgJDY0LCAlYWwKLSAgICAgICAgam56ICAgICAuTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGUgIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KLQotICAgICAgICBhbmRsICAgICQxNSwgJWVheAotICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLwotICAgICAgICBtb3ZkICAgIGhvbGRfbW0sICVlY3gKLSAgICAgICAgYW5kbCAgICAuTF9tYXNrKCwlZWF4LDQpLCAlZWN4Ci0gICAgICAgIG1vdmwgICAgZGNvZGUoJWVzcCksICVlYXggICAgICAgLyogZWN4ID0gZGNvZGUgKi8KLSAgICAgICAgYWRkbCAgICBkaXN0X3IsICVlY3gKLSAgICAgICAgbW92bCAgICAoJWVheCwlZWN4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCi0gICAgICAgIGptcCAgICAgLkxfZG9kaXN0X21teAotCi0uYWxpZ24gMTYsMHg5MAotLkxfY2xpcF93aW5kb3dfbW14OgotI2RlZmluZSBuYnl0ZXNfciAlZWN4Ci0gICAgICAgIG1vdmwgICAgJWVheCwgbmJ5dGVzX3IKLSAgICAgICAgbW92bCAgICB3c2l6ZSglZXNwKSwgJWVheCAgICAgICAvKiBwcmVwYXJlIGZvciBkaXN0IGNvbXBhcmUgKi8KLSAgICAgICAgbmVnbCAgICBuYnl0ZXNfciAgICAgICAgICAgICAgICAvKiBuYnl0ZXMgPSAtbmJ5dGVzICovCi0gICAgICAgIG1vdmwgICAgd2luZG93KCVlc3ApLCBmcm9tX3IgICAgLyogZnJvbSA9IHdpbmRvdyAqLwotCi0gICAgICAgIGNtcGwgICAgZGlzdF9yLCAlZWF4Ci0gICAgICAgIGpiICAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyIC8qIGlmIChkaXN0ID4gd3NpemUpICovCi0KLSAgICAgICAgYWRkbCAgICBkaXN0X3IsIG5ieXRlc19yICAgICAgICAvKiBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzICovCi0gICAgICAgIGNtcGwgICAgJDAsIHdyaXRlKCVlc3ApCi0gICAgICAgIGpuZSAgICAgLkxfd3JhcF9hcm91bmRfd2luZG93X21teCAvKiBpZiAod3JpdGUgIT0gMCkgKi8KLQotICAgICAgICBzdWJsICAgIG5ieXRlc19yLCAlZWF4Ci0gICAgICAgIGFkZGwgICAgJWVheCwgZnJvbV9yICAgICAgICAgICAgLyogZnJvbSArPSB3c2l6ZSAtIG5ieXRlcyAqLwotCi0gICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yCi0gICAgICAgIGpiZSAgICAgLkxfZG9fY29weTFfbW14ICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCi0KLSAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCi0gICAgICAgIHJlcCAgICAgbW92c2IKLSAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yCi0gICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KLSAgICAgICAgam1wICAgICAuTF9kb19jb3B5MV9tbXgKLQotICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgotICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxX21teCAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0gICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLwotICAgICAgICByZXAgICAgIG1vdnNiCi0gICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgotICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0gICAgICAgIGptcCAgICAgLkxfZG9fY29weTFfbW14Ci0KLS5MX3dyYXBfYXJvdW5kX3dpbmRvd19tbXg6Ci0jZGVmaW5lIHdyaXRlX3IgJWVheAotICAgICAgICBtb3ZsICAgIHdyaXRlKCVlc3ApLCB3cml0ZV9yCi0gICAgICAgIGNtcGwgICAgd3JpdGVfciwgbmJ5dGVzX3IKLSAgICAgICAgamJlICAgICAuTF9jb250aWd1b3VzX2luX3dpbmRvd19tbXggLyogaWYgKHdyaXRlID49IG5ieXRlcykgKi8KLQotICAgICAgICBhZGRsICAgIHdzaXplKCVlc3ApLCBmcm9tX3IKLSAgICAgICAgYWRkbCAgICB3cml0ZV9yLCBmcm9tX3IKLSAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgZnJvbV9yICAgICAgICAvKiBmcm9tICs9IHdzaXplICsgd3JpdGUgLSBuYnl0ZXMgKi8KLSAgICAgICAgc3VibCAgICB3cml0ZV9yLCBuYnl0ZXNfciAgICAgICAvKiBuYnl0ZXMgLT0gd3JpdGUgKi8KLSN1bmRlZiB3cml0ZV9yCi0KLSAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3IKLSAgICAgICAgamJlICAgICAuTF9kb19jb3B5MV9tbXggICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KLQotICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KLSAgICAgICAgcmVwICAgICBtb3ZzYgotICAgICAgICBtb3ZsICAgIHdpbmRvdyglZXNwKSwgZnJvbV9yICAgIC8qIGZyb20gPSB3aW5kb3cgKi8KLSAgICAgICAgbW92bCAgICB3cml0ZSglZXNwKSwgbmJ5dGVzX3IgICAvKiBuYnl0ZXMgPSB3cml0ZSAqLwotICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgotICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxX21teCAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0gICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLwotICAgICAgICByZXAgICAgIG1vdnNiCi0gICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgotICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0gICAgICAgIGptcCAgICAgLkxfZG9fY29weTFfbW14Ci0KLS5MX2NvbnRpZ3VvdXNfaW5fd2luZG93X21teDoKLSNkZWZpbmUgd3JpdGVfciAlZWF4Ci0gICAgICAgIGFkZGwgICAgd3JpdGVfciwgZnJvbV9yCi0gICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGZyb21fciAgICAgICAgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLwotI3VuZGVmIHdyaXRlX3IKLQotICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgotICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxX21teCAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0gICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLwotICAgICAgICByZXAgICAgIG1vdnNiCi0gICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgotICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0KLS5MX2RvX2NvcHkxX21teDoKLSN1bmRlZiBuYnl0ZXNfcgotI2RlZmluZSBpbl9yICVlc2kKLSAgICAgICAgbW92bCAgICBsZW5fciwgJWVjeAotICAgICAgICByZXAgICAgIG1vdnNiCi0KLSAgICAgICAgbW92bCAgICBpbiglZXNwKSwgaW5fciAgICAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCi0gICAgICAgIG1vdmwgICAgbGNvZGUoJWVzcCksICVlYnggICAgICAgLyogbW92ZSBsY29kZSBiYWNrIHRvICVlYngsIHRvc3MgZGlzdCAqLwotICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RfbW14Ci0KLSN1bmRlZiBob2xkX3IKLSN1bmRlZiBiaXRzbG9uZ19yCi0KLSNlbmRpZiAvKiBVU0VfTU1YIHx8IFJVTl9USU1FX01NWCAqLwotCi0KLS8qKiogVVNFX01NWCwgTk9fTU1YLCBhbmQgUlVOVElNRV9NTVggZnJvbSBoZXJlIG9uICoqKi8KLQotLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlOgotICAgICAgICAvKiBlbHNlIHsKLSAgICAgICAgICogICBzdHJtLT5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKLSAgICAgICAgICogICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICogfQotICAgICAgICAgKi8KLSAgICAgICAgbW92bCAgICAkLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlX21zZywgJWVjeAotICAgICAgICBtb3ZsICAgICRJTkZMQVRFX01PREVfQkFELCAlZWR4Ci0gICAgICAgIGptcCAgICAgLkxfdXBkYXRlX3N0cmVhbV9zdGF0ZQotCi0uTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2s6Ci0gICAgICAgIC8qIGVsc2UgaWYgKG9wICYgMzIpIHsKLSAgICAgICAgICogICBzdGF0ZS0+bW9kZSA9IFRZUEU7Ci0gICAgICAgICAqICAgYnJlYWs7Ci0gICAgICAgICAqIH0KLSAgICAgICAgICovCi0gICAgICAgIHRlc3RiICAgJDMyLCAlYWwKLSAgICAgICAganogICAgICAuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGUgIC8qIGlmICgob3AgJiAzMikgPT0gMCkgKi8KLQotICAgICAgICBtb3ZsICAgICQwLCAlZWN4Ci0gICAgICAgIG1vdmwgICAgJElORkxBVEVfTU9ERV9UWVBFLCAlZWR4Ci0gICAgICAgIGptcCAgICAgLkxfdXBkYXRlX3N0cmVhbV9zdGF0ZQotCi0uTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGU6Ci0gICAgICAgIC8qIGVsc2UgewotICAgICAgICAgKiAgIHN0cm0tPm1zZyA9ICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOwotICAgICAgICAgKiAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgKiB9Ci0gICAgICAgICAqLwotICAgICAgICBtb3ZsICAgICQuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVfbXNnLCAlZWN4Ci0gICAgICAgIG1vdmwgICAgJElORkxBVEVfTU9ERV9CQUQsICVlZHgKLSAgICAgICAgam1wICAgICAuTF91cGRhdGVfc3RyZWFtX3N0YXRlCi0KLS5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhcjoKLSAgICAgICAgLyogc3RybS0+bXNnID0gImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKLSAgICAgICAgICogc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAqLwotICAgICAgICBtb3ZsICAgIGluKCVlc3ApLCBpbl9yICAgICAgICAgIC8qIGZyb21fciBoYXMgaW4ncyByZWcsIHB1dCBpbiBiYWNrICovCi0gICAgICAgIG1vdmwgICAgJC5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2Zhcl9tc2csICVlY3gKLSAgICAgICAgbW92bCAgICAkSU5GTEFURV9NT0RFX0JBRCwgJWVkeAotICAgICAgICBqbXAgICAgIC5MX3VwZGF0ZV9zdHJlYW1fc3RhdGUKLQotLkxfdXBkYXRlX3N0cmVhbV9zdGF0ZToKLSAgICAgICAgLyogc2V0IHN0cm0tPm1zZyA9ICVlY3gsIHN0cm0tPnN0YXRlLT5tb2RlID0gJWVkeCAqLwotICAgICAgICBtb3ZsICAgIHN0cm1fc3AoJWVzcCksICVlYXgKLSAgICAgICAgdGVzdGwgICAlZWN4LCAlZWN4ICAgICAgICAgICAgICAvKiBpZiAobXNnICE9IE5VTEwpICovCi0gICAgICAgIGp6ICAgICAgLkxfc2tpcF9tc2cKLSAgICAgICAgbW92bCAgICAlZWN4LCBtc2dfc3RybSglZWF4KSAgICAvKiBzdHJtLT5tc2cgPSBtc2cgKi8KLS5MX3NraXBfbXNnOgotICAgICAgICBtb3ZsICAgIHN0YXRlX3N0cm0oJWVheCksICVlYXggIC8qIHN0YXRlID0gc3RybS0+c3RhdGUgKi8KLSAgICAgICAgbW92bCAgICAlZWR4LCBtb2RlX3N0YXRlKCVlYXgpICAvKiBzdGF0ZS0+bW9kZSA9IGVkeCAoQkFEIHwgVFlQRSkgKi8KLSAgICAgICAgam1wICAgICAuTF9icmVha19sb29wCi0KLS5hbGlnbiAzMiwweDkwCi0uTF9icmVha19sb29wOgotCi0vKgotICogUmVnczoKLSAqCi0gKiBiaXRzID0gJWVicCB3aGVuIG1teCwgYW5kIGluICVlYnggd2hlbiBub24tbW14Ci0gKiBob2xkID0gJWhvbGRfbW0gd2hlbiBtbXgsIGFuZCBpbiAlZWJwIHdoZW4gbm9uLW1teAotICogaW4gICA9ICVlc2kKLSAqIG91dCAgPSAlZWRpCi0gKi8KLQotI2lmIGRlZmluZWQoIFVTRV9NTVggKSB8fCBkZWZpbmVkKCBSVU5fVElNRV9NTVggKQotCi0jaWYgZGVmaW5lZCggUlVOX1RJTUVfTU1YICkKLQotICAgICAgICBjbXBsICAgICRET19VU0VfTU1YLCBpbmZsYXRlX2Zhc3RfdXNlX21teAotICAgICAgICBqbmUgICAgIC5MX3VwZGF0ZV9uZXh0X2luCi0KLSNlbmRpZiAvKiBSVU5fVElNRV9NTVggKi8KLQotICAgICAgICBtb3ZsICAgICVlYnAsICVlYngKLQotLkxfdXBkYXRlX25leHRfaW46Ci0KLSNlbmRpZgotCi0jZGVmaW5lIHN0cm1fciAgJWVheAotI2RlZmluZSBzdGF0ZV9yICVlZHgKLQotICAgICAgICAvKiBsZW4gPSBiaXRzID4+IDM7Ci0gICAgICAgICAqIGluIC09IGxlbjsKLSAgICAgICAgICogYml0cyAtPSBsZW4gPDwgMzsKLSAgICAgICAgICogaG9sZCAmPSAoMVUgPDwgYml0cykgLSAxOwotICAgICAgICAgKiBzdGF0ZS0+aG9sZCA9IGhvbGQ7Ci0gICAgICAgICAqIHN0YXRlLT5iaXRzID0gYml0czsKLSAgICAgICAgICogc3RybS0+bmV4dF9pbiA9IGluOwotICAgICAgICAgKiBzdHJtLT5uZXh0X291dCA9IG91dDsKLSAgICAgICAgICovCi0gICAgICAgIG1vdmwgICAgc3RybV9zcCglZXNwKSwgc3RybV9yCi0gICAgICAgIG1vdmwgICAgJWVieCwgJWVjeAotICAgICAgICBtb3ZsICAgIHN0YXRlX3N0cm0oc3RybV9yKSwgc3RhdGVfcgotICAgICAgICBzaHJsICAgICQzLCAlZWN4Ci0gICAgICAgIHN1YmwgICAgJWVjeCwgaW5fcgotICAgICAgICBzaGxsICAgICQzLCAlZWN4Ci0gICAgICAgIHN1YmwgICAgJWVjeCwgJWVieAotICAgICAgICBtb3ZsICAgIG91dF9yLCBuZXh0X291dF9zdHJtKHN0cm1fcikKLSAgICAgICAgbW92bCAgICAlZWJ4LCBiaXRzX3N0YXRlKHN0YXRlX3IpCi0gICAgICAgIG1vdmwgICAgJWVieCwgJWVjeAotCi0gICAgICAgIGxlYWwgICAgYnVmKCVlc3ApLCAlZWJ4Ci0gICAgICAgIGNtcGwgICAgJWVieCwgbGFzdCglZXNwKQotICAgICAgICBqbmUgICAgIC5MX2J1Zl9ub3RfdXNlZCAgICAgICAgIC8qIGlmIGJ1ZiAhPSBsYXN0ICovCi0KLSAgICAgICAgc3VibCAgICAlZWJ4LCBpbl9yICAgICAgICAgICAgICAvKiBpbiAtPSBidWYgKi8KLSAgICAgICAgbW92bCAgICBuZXh0X2luX3N0cm0oc3RybV9yKSwgJWVieAotICAgICAgICBtb3ZsICAgICVlYngsIGxhc3QoJWVzcCkgICAgICAgIC8qIGxhc3QgPSBzdHJtLT5uZXh0X2luICovCi0gICAgICAgIGFkZGwgICAgJWVieCwgaW5fciAgICAgICAgICAgICAgLyogaW4gKz0gc3RybS0+bmV4dF9pbiAqLwotICAgICAgICBtb3ZsICAgIGF2YWlsX2luX3N0cm0oc3RybV9yKSwgJWVieAotICAgICAgICBzdWJsICAgICQxMSwgJWVieAotICAgICAgICBhZGRsICAgICVlYngsIGxhc3QoJWVzcCkgICAgLyogbGFzdCA9ICZzdHJtLT5uZXh0X2luWyBhdmFpbF9pbiAtIDExIF0gKi8KLQotLkxfYnVmX25vdF91c2VkOgotICAgICAgICBtb3ZsICAgIGluX3IsIG5leHRfaW5fc3RybShzdHJtX3IpCi0KLSAgICAgICAgbW92bCAgICAkMSwgJWVieAotICAgICAgICBzaGxsICAgICVjbCwgJWVieAotICAgICAgICBkZWNsICAgICVlYngKLQotI2lmIGRlZmluZWQoIFVTRV9NTVggKSB8fCBkZWZpbmVkKCBSVU5fVElNRV9NTVggKQotCi0jaWYgZGVmaW5lZCggUlVOX1RJTUVfTU1YICkKLQotICAgICAgICBjbXBsICAgICRET19VU0VfTU1YLCBpbmZsYXRlX2Zhc3RfdXNlX21teAotICAgICAgICBqbmUgICAgIC5MX3VwZGF0ZV9ob2xkCi0KLSNlbmRpZiAvKiBSVU5fVElNRV9NTVggKi8KLQotICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLwotICAgICAgICBtb3ZkICAgIGhvbGRfbW0sICVlYnAKLQotICAgICAgICBlbW1zCi0KLS5MX3VwZGF0ZV9ob2xkOgotCi0jZW5kaWYgLyogVVNFX01NWCB8fCBSVU5fVElNRV9NTVggKi8KLQotICAgICAgICBhbmRsICAgICVlYngsICVlYnAKLSAgICAgICAgbW92bCAgICAlZWJwLCBob2xkX3N0YXRlKHN0YXRlX3IpCi0KLSNkZWZpbmUgbGFzdF9yICVlYngKLQotICAgICAgICAvKiBzdHJtLT5hdmFpbF9pbiA9IGluIDwgbGFzdCA/IDExICsgKGxhc3QgLSBpbikgOiAxMSAtIChpbiAtIGxhc3QpICovCi0gICAgICAgIG1vdmwgICAgbGFzdCglZXNwKSwgbGFzdF9yCi0gICAgICAgIGNtcGwgICAgaW5fciwgbGFzdF9yCi0gICAgICAgIGpiZSAgICAgLkxfbGFzdF9pc19zbWFsbGVyICAgICAvKiBpZiAoaW4gPj0gbGFzdCkgKi8KLQotICAgICAgICBzdWJsICAgIGluX3IsIGxhc3RfciAgICAgICAgICAgLyogbGFzdCAtPSBpbiAqLwotICAgICAgICBhZGRsICAgICQxMSwgbGFzdF9yICAgICAgICAgICAgLyogbGFzdCArPSAxMSAqLwotICAgICAgICBtb3ZsICAgIGxhc3RfciwgYXZhaWxfaW5fc3RybShzdHJtX3IpCi0gICAgICAgIGptcCAgICAgLkxfZml4dXBfb3V0Ci0uTF9sYXN0X2lzX3NtYWxsZXI6Ci0gICAgICAgIHN1YmwgICAgbGFzdF9yLCBpbl9yICAgICAgICAgICAvKiBpbiAtPSBsYXN0ICovCi0gICAgICAgIG5lZ2wgICAgaW5fciAgICAgICAgICAgICAgICAgICAvKiBpbiA9IC1pbiAqLwotICAgICAgICBhZGRsICAgICQxMSwgaW5fciAgICAgICAgICAgICAgLyogaW4gKz0gMTEgKi8KLSAgICAgICAgbW92bCAgICBpbl9yLCBhdmFpbF9pbl9zdHJtKHN0cm1fcikKLQotI3VuZGVmIGxhc3RfcgotI2RlZmluZSBlbmRfciAlZWJ4Ci0KLS5MX2ZpeHVwX291dDoKLSAgICAgICAgLyogc3RybS0+YXZhaWxfb3V0ID0gb3V0IDwgZW5kID8gMjU3ICsgKGVuZCAtIG91dCkgOiAyNTcgLSAob3V0IC0gZW5kKSovCi0gICAgICAgIG1vdmwgICAgZW5kKCVlc3ApLCBlbmRfcgotICAgICAgICBjbXBsICAgIG91dF9yLCBlbmRfcgotICAgICAgICBqYmUgICAgIC5MX2VuZF9pc19zbWFsbGVyICAgICAgLyogaWYgKG91dCA+PSBlbmQpICovCi0KLSAgICAgICAgc3VibCAgICBvdXRfciwgZW5kX3IgICAgICAgICAgIC8qIGVuZCAtPSBvdXQgKi8KLSAgICAgICAgYWRkbCAgICAkMjU3LCBlbmRfciAgICAgICAgICAgIC8qIGVuZCArPSAyNTcgKi8KLSAgICAgICAgbW92bCAgICBlbmRfciwgYXZhaWxfb3V0X3N0cm0oc3RybV9yKQotICAgICAgICBqbXAgICAgIC5MX2RvbmUKLS5MX2VuZF9pc19zbWFsbGVyOgotICAgICAgICBzdWJsICAgIGVuZF9yLCBvdXRfciAgICAgICAgICAgLyogb3V0IC09IGVuZCAqLwotICAgICAgICBuZWdsICAgIG91dF9yICAgICAgICAgICAgICAgICAgLyogb3V0ID0gLW91dCAqLwotICAgICAgICBhZGRsICAgICQyNTcsIG91dF9yICAgICAgICAgICAgLyogb3V0ICs9IDI1NyAqLwotICAgICAgICBtb3ZsICAgIG91dF9yLCBhdmFpbF9vdXRfc3RybShzdHJtX3IpCi0KLSN1bmRlZiBlbmRfcgotI3VuZGVmIHN0cm1fcgotI3VuZGVmIHN0YXRlX3IKLQotLkxfZG9uZToKLSAgICAgICAgYWRkbCAgICAkbG9jYWxfdmFyX3NpemUsICVlc3AKLSAgICAgICAgcG9wZgotICAgICAgICBwb3BsICAgICVlYngKLSAgICAgICAgcG9wbCAgICAlZWJwCi0gICAgICAgIHBvcGwgICAgJWVzaQotICAgICAgICBwb3BsICAgICVlZGkKLSAgICAgICAgcmV0Ci0KLSNpZiBkZWZpbmVkKCBHQVNfRUxGICkKLS8qIGVsZiBpbmZvICovCi0udHlwZSBpbmZsYXRlX2Zhc3QsQGZ1bmN0aW9uCi0uc2l6ZSBpbmZsYXRlX2Zhc3QsLi1pbmZsYXRlX2Zhc3QKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9pb3N0cmVhbS90ZXN0LmNwcCBiL3NyYy96bGliL2NvbnRyaWIvaW9zdHJlYW0vdGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMjY1YjMuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9pb3N0cmVhbS90ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLQotI2luY2x1ZGUgInpmc3RyZWFtLmgiCi0KLWludCBtYWluKCkgewotCi0gIC8vIENvbnN0cnVjdCBhIHN0cmVhbSBvYmplY3Qgd2l0aCB0aGlzIGZpbGVidWZmZXIuICBBbnl0aGluZyBzZW50Ci0gIC8vIHRvIHRoaXMgc3RyZWFtIHdpbGwgZ28gdG8gc3RhbmRhcmQgb3V0LgotICBnem9mc3RyZWFtIG9zKCAxLCBpb3M6Om91dCApOwotCi0gIC8vIFRoaXMgdGV4dCBpcyBnZXR0aW5nIGNvbXByZXNzZWQgYW5kIHNlbnQgdG8gc3Rkb3V0LgotICAvLyBUbyBwcm92ZSB0aGlzLCBydW4gJ3Rlc3QgfCB6Y2F0Jy4KLSAgb3MgPDwgIkhlbGxvLCBNb21teSIgPDwgZW5kbDsKLQotICBvcyA8PCBzZXRjb21wcmVzc2lvbmxldmVsKCBaX05PX0NPTVBSRVNTSU9OICk7Ci0gIG9zIDw8ICJoZWxsbywgaGVsbG8sIGhpLCBobyEiIDw8IGVuZGw7Ci0KLSAgc2V0Y29tcHJlc3Npb25sZXZlbCggb3MsIFpfREVGQVVMVF9DT01QUkVTU0lPTiApCi0gICAgPDwgIkknbSBjb21wcmVzc2luZyBhZ2FpbiIgPDwgZW5kbDsKLQotICBvcy5jbG9zZSgpOwotCi0gIHJldHVybiAwOwotCi19CmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2lvc3RyZWFtL3pmc3RyZWFtLmNwcCBiL3NyYy96bGliL2NvbnRyaWIvaW9zdHJlYW0vemZzdHJlYW0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGNkODVmLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvaW9zdHJlYW0vemZzdHJlYW0uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLQotI2luY2x1ZGUgInpmc3RyZWFtLmgiCi0KLWd6ZmlsZWJ1Zjo6Z3pmaWxlYnVmKCkgOgotICBmaWxlKE5VTEwpLAotICBtb2RlKDApLAotICBvd25fZmlsZV9kZXNjcmlwdG9yKDApCi17IH0KLQotZ3pmaWxlYnVmOjp+Z3pmaWxlYnVmKCkgewotCi0gIHN5bmMoKTsKLSAgaWYgKCBvd25fZmlsZV9kZXNjcmlwdG9yICkKLSAgICBjbG9zZSgpOwotCi19Ci0KLWd6ZmlsZWJ1ZiAqZ3pmaWxlYnVmOjpvcGVuKCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpb19tb2RlICkgewotCi0gIGlmICggaXNfb3BlbigpICkKLSAgICByZXR1cm4gTlVMTDsKLQotICBjaGFyIGNoYXJfbW9kZVsxMF07Ci0gIGNoYXIgKnAgPSBjaGFyX21vZGU7Ci0KLSAgaWYgKCBpb19tb2RlICYgaW9zOjppbiApIHsKLSAgICBtb2RlID0gaW9zOjppbjsKLSAgICAqcCsrID0gJ3InOwotICB9IGVsc2UgaWYgKCBpb19tb2RlICYgaW9zOjphcHAgKSB7Ci0gICAgbW9kZSA9IGlvczo6YXBwOwotICAgICpwKysgPSAnYSc7Ci0gIH0gZWxzZSB7Ci0gICAgbW9kZSA9IGlvczo6b3V0OwotICAgICpwKysgPSAndyc7Ci0gIH0KLQotICBpZiAoIGlvX21vZGUgJiBpb3M6OmJpbmFyeSApIHsKLSAgICBtb2RlIHw9IGlvczo6YmluYXJ5OwotICAgICpwKysgPSAnYic7Ci0gIH0KLQotICAvLyBIYXJkIGNvZGUgdGhlIGNvbXByZXNzaW9uIGxldmVsCi0gIGlmICggaW9fbW9kZSAmIChpb3M6Om91dHxpb3M6OmFwcCApKSB7Ci0gICAgKnArKyA9ICc5JzsKLSAgfQotCi0gIC8vIFB1dCB0aGUgZW5kLW9mLXN0cmluZyBpbmRpY2F0b3IKLSAgKnAgPSAnXDAnOwotCi0gIGlmICggKGZpbGUgPSBnem9wZW4obmFtZSwgY2hhcl9tb2RlKSkgPT0gTlVMTCApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgb3duX2ZpbGVfZGVzY3JpcHRvciA9IDE7Ci0KLSAgcmV0dXJuIHRoaXM7Ci0KLX0KLQotZ3pmaWxlYnVmICpnemZpbGVidWY6OmF0dGFjaCggaW50IGZpbGVfZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpb19tb2RlICkgewotCi0gIGlmICggaXNfb3BlbigpICkKLSAgICByZXR1cm4gTlVMTDsKLQotICBjaGFyIGNoYXJfbW9kZVsxMF07Ci0gIGNoYXIgKnAgPSBjaGFyX21vZGU7Ci0KLSAgaWYgKCBpb19tb2RlICYgaW9zOjppbiApIHsKLSAgICBtb2RlID0gaW9zOjppbjsKLSAgICAqcCsrID0gJ3InOwotICB9IGVsc2UgaWYgKCBpb19tb2RlICYgaW9zOjphcHAgKSB7Ci0gICAgbW9kZSA9IGlvczo6YXBwOwotICAgICpwKysgPSAnYSc7Ci0gIH0gZWxzZSB7Ci0gICAgbW9kZSA9IGlvczo6b3V0OwotICAgICpwKysgPSAndyc7Ci0gIH0KLQotICBpZiAoIGlvX21vZGUgJiBpb3M6OmJpbmFyeSApIHsKLSAgICBtb2RlIHw9IGlvczo6YmluYXJ5OwotICAgICpwKysgPSAnYic7Ci0gIH0KLQotICAvLyBIYXJkIGNvZGUgdGhlIGNvbXByZXNzaW9uIGxldmVsCi0gIGlmICggaW9fbW9kZSAmIChpb3M6Om91dHxpb3M6OmFwcCApKSB7Ci0gICAgKnArKyA9ICc5JzsKLSAgfQotCi0gIC8vIFB1dCB0aGUgZW5kLW9mLXN0cmluZyBpbmRpY2F0b3IKLSAgKnAgPSAnXDAnOwotCi0gIGlmICggKGZpbGUgPSBnemRvcGVuKGZpbGVfZGVzY3JpcHRvciwgY2hhcl9tb2RlKSkgPT0gTlVMTCApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgb3duX2ZpbGVfZGVzY3JpcHRvciA9IDA7Ci0KLSAgcmV0dXJuIHRoaXM7Ci0KLX0KLQotZ3pmaWxlYnVmICpnemZpbGVidWY6OmNsb3NlKCkgewotCi0gIGlmICggaXNfb3BlbigpICkgewotCi0gICAgc3luYygpOwotICAgIGd6Y2xvc2UoIGZpbGUgKTsKLSAgICBmaWxlID0gTlVMTDsKLQotICB9Ci0KLSAgcmV0dXJuIHRoaXM7Ci0KLX0KLQotaW50IGd6ZmlsZWJ1Zjo6c2V0Y29tcHJlc3Npb25sZXZlbCggaW50IGNvbXBfbGV2ZWwgKSB7Ci0KLSAgcmV0dXJuIGd6c2V0cGFyYW1zKGZpbGUsIGNvbXBfbGV2ZWwsIC0yKTsKLQotfQotCi1pbnQgZ3pmaWxlYnVmOjpzZXRjb21wcmVzc2lvbnN0cmF0ZWd5KCBpbnQgY29tcF9zdHJhdGVneSApIHsKLQotICByZXR1cm4gZ3pzZXRwYXJhbXMoZmlsZSwgLTIsIGNvbXBfc3RyYXRlZ3kpOwotCi19Ci0KLQotc3RyZWFtcG9zIGd6ZmlsZWJ1Zjo6c2Vla29mZiggc3RyZWFtb2ZmIG9mZiwgaW9zOjpzZWVrX2RpciBkaXIsIGludCB3aGljaCApIHsKLQotICByZXR1cm4gc3RyZWFtcG9zKEVPRik7Ci0KLX0KLQotaW50IGd6ZmlsZWJ1Zjo6dW5kZXJmbG93KCkgewotCi0gIC8vIElmIHRoZSBmaWxlIGhhc24ndCBiZWVuIG9wZW5lZCBmb3IgcmVhZGluZywgZXJyb3IuCi0gIGlmICggIWlzX29wZW4oKSB8fCAhKG1vZGUgJiBpb3M6OmluKSApCi0gICAgcmV0dXJuIEVPRjsKLQotICAvLyBpZiBhIGJ1ZmZlciBkb2Vzbid0IGV4aXN0cywgYWxsb2NhdGUgb25lLgotICBpZiAoICFiYXNlKCkgKSB7Ci0KLSAgICBpZiAoIChhbGxvY2F0ZSgpKSA9PSBFT0YgKQotICAgICAgcmV0dXJuIEVPRjsKLSAgICBzZXRwKDAsMCk7Ci0KLSAgfSBlbHNlIHsKLQotICAgIGlmICggaW5fYXZhaWwoKSApCi0gICAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpICpncHRyKCk7Ci0KLSAgICBpZiAoIG91dF93YWl0aW5nKCkgKSB7Ci0gICAgICBpZiAoIGZsdXNoYnVmKCkgPT0gRU9GICkKLSAgICAgICAgcmV0dXJuIEVPRjsKLSAgICB9Ci0KLSAgfQotCi0gIC8vIEF0dGVtcHQgdG8gZmlsbCB0aGUgYnVmZmVyLgotCi0gIGludCByZXN1bHQgPSBmaWxsYnVmKCk7Ci0gIGlmICggcmVzdWx0ID09IEVPRiApIHsKLSAgICAvLyBkaXNhYmxlIGdldCBhcmVhCi0gICAgc2V0ZygwLDAsMCk7Ci0gICAgcmV0dXJuIEVPRjsKLSAgfQotCi0gIHJldHVybiAodW5zaWduZWQgY2hhcikgKmdwdHIoKTsKLQotfQotCi1pbnQgZ3pmaWxlYnVmOjpvdmVyZmxvdyggaW50IGMgKSB7Ci0KLSAgaWYgKCAhaXNfb3BlbigpIHx8ICEobW9kZSAmIGlvczo6b3V0KSApCi0gICAgcmV0dXJuIEVPRjsKLQotICBpZiAoICFiYXNlKCkgKSB7Ci0gICAgaWYgKCBhbGxvY2F0ZSgpID09IEVPRiApCi0gICAgICByZXR1cm4gRU9GOwotICAgIHNldGcoMCwwLDApOwotICB9IGVsc2UgewotICAgIGlmIChpbl9hdmFpbCgpKSB7Ci0gICAgICAgIHJldHVybiBFT0Y7Ci0gICAgfQotICAgIGlmIChvdXRfd2FpdGluZygpKSB7Ci0gICAgICBpZiAoZmx1c2hidWYoKSA9PSBFT0YpCi0gICAgICAgIHJldHVybiBFT0Y7Ci0gICAgfQotICB9Ci0KLSAgaW50IGJsID0gYmxlbigpOwotICBzZXRwKCBiYXNlKCksIGJhc2UoKSArIGJsKTsKLQotICBpZiAoIGMgIT0gRU9GICkgewotCi0gICAgKnBwdHIoKSA9IGM7Ci0gICAgcGJ1bXAoMSk7Ci0KLSAgfQotCi0gIHJldHVybiAwOwotCi19Ci0KLWludCBnemZpbGVidWY6OnN5bmMoKSB7Ci0KLSAgaWYgKCAhaXNfb3BlbigpICkKLSAgICByZXR1cm4gRU9GOwotCi0gIGlmICggb3V0X3dhaXRpbmcoKSApCi0gICAgcmV0dXJuIGZsdXNoYnVmKCk7Ci0KLSAgcmV0dXJuIDA7Ci0KLX0KLQotaW50IGd6ZmlsZWJ1Zjo6Zmx1c2hidWYoKSB7Ci0KLSAgaW50IG47Ci0gIGNoYXIgKnE7Ci0KLSAgcSA9IHBiYXNlKCk7Ci0gIG4gPSBwcHRyKCkgLSBxOwotCi0gIGlmICggZ3p3cml0ZSggZmlsZSwgcSwgbikgPCBuICkKLSAgICByZXR1cm4gRU9GOwotCi0gIHNldHAoMCwwKTsKLQotICByZXR1cm4gMDsKLQotfQotCi1pbnQgZ3pmaWxlYnVmOjpmaWxsYnVmKCkgewotCi0gIGludCByZXF1aXJlZDsKLSAgY2hhciAqcDsKLQotICBwID0gYmFzZSgpOwotCi0gIHJlcXVpcmVkID0gYmxlbigpOwotCi0gIGludCB0ID0gZ3pyZWFkKCBmaWxlLCBwLCByZXF1aXJlZCApOwotCi0gIGlmICggdCA8PSAwKSByZXR1cm4gRU9GOwotCi0gIHNldGcoIGJhc2UoKSwgYmFzZSgpLCBiYXNlKCkrdCk7Ci0KLSAgcmV0dXJuIHQ7Ci0KLX0KLQotZ3pmaWxlc3RyZWFtX2NvbW1vbjo6Z3pmaWxlc3RyZWFtX2NvbW1vbigpIDoKLSAgaW9zKCBnemZpbGVzdHJlYW1fY29tbW9uOjpyZGJ1ZigpICkKLXsgfQotCi1nemZpbGVzdHJlYW1fY29tbW9uOjp+Z3pmaWxlc3RyZWFtX2NvbW1vbigpCi17IH0KLQotdm9pZCBnemZpbGVzdHJlYW1fY29tbW9uOjphdHRhY2goIGludCBmZCwgaW50IGlvX21vZGUgKSB7Ci0KLSAgaWYgKCAhYnVmZmVyLmF0dGFjaCggZmQsIGlvX21vZGUpICkKLSAgICBjbGVhciggaW9zOjpmYWlsYml0IHwgaW9zOjpiYWRiaXQgKTsKLSAgZWxzZQotICAgIGNsZWFyKCk7Ci0KLX0KLQotdm9pZCBnemZpbGVzdHJlYW1fY29tbW9uOjpvcGVuKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW9fbW9kZSApIHsKLQotICBpZiAoICFidWZmZXIub3BlbiggbmFtZSwgaW9fbW9kZSApICkKLSAgICBjbGVhciggaW9zOjpmYWlsYml0IHwgaW9zOjpiYWRiaXQgKTsKLSAgZWxzZQotICAgIGNsZWFyKCk7Ci0KLX0KLQotdm9pZCBnemZpbGVzdHJlYW1fY29tbW9uOjpjbG9zZSgpIHsKLQotICBpZiAoICFidWZmZXIuY2xvc2UoKSApCi0gICAgY2xlYXIoIGlvczo6ZmFpbGJpdCB8IGlvczo6YmFkYml0ICk7Ci0KLX0KLQotZ3pmaWxlYnVmICpnemZpbGVzdHJlYW1fY29tbW9uOjpyZGJ1ZigpCi17Ci0gIHJldHVybiAmYnVmZmVyOwotfQotCi1nemlmc3RyZWFtOjpnemlmc3RyZWFtKCkgOgotICBpb3MoIGd6ZmlsZXN0cmVhbV9jb21tb246OnJkYnVmKCkgKQotewotICBjbGVhciggaW9zOjpiYWRiaXQgKTsKLX0KLQotZ3ppZnN0cmVhbTo6Z3ppZnN0cmVhbSggY29uc3QgY2hhciAqbmFtZSwgaW50IGlvX21vZGUgKSA6Ci0gIGlvcyggZ3pmaWxlc3RyZWFtX2NvbW1vbjo6cmRidWYoKSApCi17Ci0gIGd6ZmlsZXN0cmVhbV9jb21tb246Om9wZW4oIG5hbWUsIGlvX21vZGUgKTsKLX0KLQotZ3ppZnN0cmVhbTo6Z3ppZnN0cmVhbSggaW50IGZkLCBpbnQgaW9fbW9kZSApIDoKLSAgaW9zKCBnemZpbGVzdHJlYW1fY29tbW9uOjpyZGJ1ZigpICkKLXsKLSAgZ3pmaWxlc3RyZWFtX2NvbW1vbjo6YXR0YWNoKCBmZCwgaW9fbW9kZSApOwotfQotCi1nemlmc3RyZWFtOjp+Z3ppZnN0cmVhbSgpIHsgfQotCi1nem9mc3RyZWFtOjpnem9mc3RyZWFtKCkgOgotICBpb3MoIGd6ZmlsZXN0cmVhbV9jb21tb246OnJkYnVmKCkgKQotewotICBjbGVhciggaW9zOjpiYWRiaXQgKTsKLX0KLQotZ3pvZnN0cmVhbTo6Z3pvZnN0cmVhbSggY29uc3QgY2hhciAqbmFtZSwgaW50IGlvX21vZGUgKSA6Ci0gIGlvcyggZ3pmaWxlc3RyZWFtX2NvbW1vbjo6cmRidWYoKSApCi17Ci0gIGd6ZmlsZXN0cmVhbV9jb21tb246Om9wZW4oIG5hbWUsIGlvX21vZGUgKTsKLX0KLQotZ3pvZnN0cmVhbTo6Z3pvZnN0cmVhbSggaW50IGZkLCBpbnQgaW9fbW9kZSApIDoKLSAgaW9zKCBnemZpbGVzdHJlYW1fY29tbW9uOjpyZGJ1ZigpICkKLXsKLSAgZ3pmaWxlc3RyZWFtX2NvbW1vbjo6YXR0YWNoKCBmZCwgaW9fbW9kZSApOwotfQotCi1nem9mc3RyZWFtOjp+Z3pvZnN0cmVhbSgpIHsgfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9pb3N0cmVhbS96ZnN0cmVhbS5oIGIvc3JjL3psaWIvY29udHJpYi9pb3N0cmVhbS96ZnN0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDc5MDk4Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvaW9zdHJlYW0vemZzdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0KLSNpZm5kZWYgemZzdHJlYW1faAotI2RlZmluZSB6ZnN0cmVhbV9oCi0KLSNpbmNsdWRlIDxmc3RyZWFtLmg+Ci0jaW5jbHVkZSAiemxpYi5oIgotCi1jbGFzcyBnemZpbGVidWYgOiBwdWJsaWMgc3RyZWFtYnVmIHsKLQotcHVibGljOgotCi0gIGd6ZmlsZWJ1ZiggKTsKLSAgdmlydHVhbCB+Z3pmaWxlYnVmKCk7Ci0KLSAgZ3pmaWxlYnVmICpvcGVuKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW9fbW9kZSApOwotICBnemZpbGVidWYgKmF0dGFjaCggaW50IGZpbGVfZGVzY3JpcHRvciwgaW50IGlvX21vZGUgKTsKLSAgZ3pmaWxlYnVmICpjbG9zZSgpOwotCi0gIGludCBzZXRjb21wcmVzc2lvbmxldmVsKCBpbnQgY29tcF9sZXZlbCApOwotICBpbnQgc2V0Y29tcHJlc3Npb25zdHJhdGVneSggaW50IGNvbXBfc3RyYXRlZ3kgKTsKLQotICBpbmxpbmUgaW50IGlzX29wZW4oKSBjb25zdCB7IHJldHVybiAoZmlsZSAhPU5VTEwpOyB9Ci0KLSAgdmlydHVhbCBzdHJlYW1wb3Mgc2Vla29mZiggc3RyZWFtb2ZmLCBpb3M6OnNlZWtfZGlyLCBpbnQgKTsKLQotICB2aXJ0dWFsIGludCBzeW5jKCk7Ci0KLXByb3RlY3RlZDoKLQotICB2aXJ0dWFsIGludCB1bmRlcmZsb3coKTsKLSAgdmlydHVhbCBpbnQgb3ZlcmZsb3coIGludCA9IEVPRiApOwotCi1wcml2YXRlOgotCi0gIGd6RmlsZSBmaWxlOwotICBzaG9ydCBtb2RlOwotICBzaG9ydCBvd25fZmlsZV9kZXNjcmlwdG9yOwotCi0gIGludCBmbHVzaGJ1ZigpOwotICBpbnQgZmlsbGJ1ZigpOwotCi19OwotCi1jbGFzcyBnemZpbGVzdHJlYW1fY29tbW9uIDogdmlydHVhbCBwdWJsaWMgaW9zIHsKLQotICBmcmllbmQgY2xhc3MgZ3ppZnN0cmVhbTsKLSAgZnJpZW5kIGNsYXNzIGd6b2ZzdHJlYW07Ci0gIGZyaWVuZCBnem9mc3RyZWFtICZzZXRjb21wcmVzc2lvbmxldmVsKCBnem9mc3RyZWFtICYsIGludCApOwotICBmcmllbmQgZ3pvZnN0cmVhbSAmc2V0Y29tcHJlc3Npb25zdHJhdGVneSggZ3pvZnN0cmVhbSAmLCBpbnQgKTsKLQotcHVibGljOgotICB2aXJ0dWFsIH5nemZpbGVzdHJlYW1fY29tbW9uKCk7Ci0KLSAgdm9pZCBhdHRhY2goIGludCBmZCwgaW50IGlvX21vZGUgKTsKLSAgdm9pZCBvcGVuKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW9fbW9kZSApOwotICB2b2lkIGNsb3NlKCk7Ci0KLXByb3RlY3RlZDoKLSAgZ3pmaWxlc3RyZWFtX2NvbW1vbigpOwotCi1wcml2YXRlOgotICBnemZpbGVidWYgKnJkYnVmKCk7Ci0KLSAgZ3pmaWxlYnVmIGJ1ZmZlcjsKLQotfTsKLQotY2xhc3MgZ3ppZnN0cmVhbSA6IHB1YmxpYyBnemZpbGVzdHJlYW1fY29tbW9uLCBwdWJsaWMgaXN0cmVhbSB7Ci0KLXB1YmxpYzoKLQotICBnemlmc3RyZWFtKCk7Ci0gIGd6aWZzdHJlYW0oIGNvbnN0IGNoYXIgKm5hbWUsIGludCBpb19tb2RlID0gaW9zOjppbiApOwotICBnemlmc3RyZWFtKCBpbnQgZmQsIGludCBpb19tb2RlID0gaW9zOjppbiApOwotCi0gIHZpcnR1YWwgfmd6aWZzdHJlYW0oKTsKLQotfTsKLQotY2xhc3MgZ3pvZnN0cmVhbSA6IHB1YmxpYyBnemZpbGVzdHJlYW1fY29tbW9uLCBwdWJsaWMgb3N0cmVhbSB7Ci0KLXB1YmxpYzoKLQotICBnem9mc3RyZWFtKCk7Ci0gIGd6b2ZzdHJlYW0oIGNvbnN0IGNoYXIgKm5hbWUsIGludCBpb19tb2RlID0gaW9zOjpvdXQgKTsKLSAgZ3pvZnN0cmVhbSggaW50IGZkLCBpbnQgaW9fbW9kZSA9IGlvczo6b3V0ICk7Ci0KLSAgdmlydHVhbCB+Z3pvZnN0cmVhbSgpOwotCi19OwotCi10ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBnem9tYW5pcCB7Ci0gIGZyaWVuZCBnem9mc3RyZWFtICZvcGVyYXRvcjw8KGd6b2ZzdHJlYW0gJiwgY29uc3QgZ3pvbWFuaXA8VD4gJik7Ci1wdWJsaWM6Ci0gIGd6b21hbmlwKGd6b2ZzdHJlYW0gJigqZikoZ3pvZnN0cmVhbSAmLCBUKSwgVCB2KSA6IGZ1bmMoZiksIHZhbCh2KSB7IH0KLXByaXZhdGU6Ci0gIGd6b2ZzdHJlYW0gJigqZnVuYykoZ3pvZnN0cmVhbSAmLCBUKTsKLSAgVCB2YWw7Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBUPiBnem9mc3RyZWFtICZvcGVyYXRvcjw8KGd6b2ZzdHJlYW0gJnMsIGNvbnN0IGd6b21hbmlwPFQ+ICZtKQotewotICByZXR1cm4gKCptLmZ1bmMpKHMsIG0udmFsKTsKLX0KLQotaW5saW5lIGd6b2ZzdHJlYW0gJnNldGNvbXByZXNzaW9ubGV2ZWwoIGd6b2ZzdHJlYW0gJnMsIGludCBsICkKLXsKLSAgKHMucmRidWYoKSktPnNldGNvbXByZXNzaW9ubGV2ZWwobCk7Ci0gIHJldHVybiBzOwotfQotCi1pbmxpbmUgZ3pvZnN0cmVhbSAmc2V0Y29tcHJlc3Npb25zdHJhdGVneSggZ3pvZnN0cmVhbSAmcywgaW50IGwgKQotewotICAocy5yZGJ1ZigpKS0+c2V0Y29tcHJlc3Npb25zdHJhdGVneShsKTsKLSAgcmV0dXJuIHM7Ci19Ci0KLWlubGluZSBnem9tYW5pcDxpbnQ+IHNldGNvbXByZXNzaW9ubGV2ZWwoaW50IGwpCi17Ci0gIHJldHVybiBnem9tYW5pcDxpbnQ+KCZzZXRjb21wcmVzc2lvbmxldmVsLGwpOwotfQotCi1pbmxpbmUgZ3pvbWFuaXA8aW50PiBzZXRjb21wcmVzc2lvbnN0cmF0ZWd5KGludCBsKQotewotICByZXR1cm4gZ3pvbWFuaXA8aW50Pigmc2V0Y29tcHJlc3Npb25zdHJhdGVneSxsKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2lvc3RyZWFtMi96c3RyZWFtLmggYi9zcmMvemxpYi9jb250cmliL2lvc3RyZWFtMi96c3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZDIzMzIuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9pb3N0cmVhbTIvenN0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKiBDaHJpc3RpYW4gTWljaGVsc2VuIFJlc2VhcmNoIEFTCi0gKiBBZHZhbmNlZCBDb21wdXRpbmcKLSAqIEZhbnRvZnR2ZWdlbiAzOCwgNTAzNiBCRVJHRU4sIE5vcndheQotICogaHR0cDovL3d3dy5jbXIubm8KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKLSAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0gKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAotICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKLSAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIENocmlzdGlhbiBNaWNoZWxzZW4gUmVzZWFyY2ggQVMgbWFrZXMgbm8KLSAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKi8KLQotI2lmbmRlZiBaU1RSRUFNX19ICi0jZGVmaW5lIFpTVFJFQU1fX0gKLQotLyoKLSAqIHpzdHJlYW0uaCAtIEMrKyBpbnRlcmZhY2UgdG8gdGhlICd6bGliJyBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeQotICogJElkOiB6c3RyZWFtLmggMS4xIDE5OTctMDYtMjUgMTI6MDA6NTYrMDIgdHlnZSBFeHAgdHlnZSAkCi0gKi8KLQotI2luY2x1ZGUgPHN0cnN0cmVhbS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiemxpYi5oIgotCi0jaWYgZGVmaW5lZChfV0lOMzIpCi0jICAgaW5jbHVkZSA8ZmNudGwuaD4KLSMgICBpbmNsdWRlIDxpby5oPgotIyAgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkgc2V0bW9kZShmaWxlbm8oZmlsZSksIE9fQklOQVJZKQotI2Vsc2UKLSMgICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZpbGUpCi0jZW5kaWYKLQotY2xhc3MgenN0cmluZ2xlbiB7Ci1wdWJsaWM6Ci0gICAgenN0cmluZ2xlbihjbGFzcyBpenN0cmVhbSYpOwotICAgIHpzdHJpbmdsZW4oY2xhc3Mgb3pzdHJlYW0mLCBjb25zdCBjaGFyKik7Ci0gICAgc2l6ZV90IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsLndvcmQ7IH0KLXByaXZhdGU6Ci0gICAgc3RydWN0IFZhbCB7IHVuc2lnbmVkIGNoYXIgYnl0ZTsgc2l6ZV90IHdvcmQ7IH0gdmFsOwotfTsKLQotLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGl6c3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIGl6c3RyZWFtCi17Ci0gICAgcHVibGljOgotICAgICAgICBpenN0cmVhbSgpIDogbV9mcCgwKSB7fQotICAgICAgICBpenN0cmVhbShGSUxFKiBmcCkgOiBtX2ZwKDApIHsgb3BlbihmcCk7IH0KLSAgICAgICAgaXpzdHJlYW0oY29uc3QgY2hhciogbmFtZSkgOiBtX2ZwKDApIHsgb3BlbihuYW1lKTsgfQotICAgICAgICB+aXpzdHJlYW0oKSB7IGNsb3NlKCk7IH0KLQotICAgICAgICAvKiBPcGVucyBhIGd6aXAgKC5neikgZmlsZSBmb3IgcmVhZGluZy4KLSAgICAgICAgICogb3BlbigpIGNhbiBiZSB1c2VkIHRvIHJlYWQgYSBmaWxlIHdoaWNoIGlzIG5vdCBpbiBnemlwIGZvcm1hdDsKLSAgICAgICAgICogaW4gdGhpcyBjYXNlIHJlYWQoKSB3aWxsIGRpcmVjdGx5IHJlYWQgZnJvbSB0aGUgZmlsZSB3aXRob3V0Ci0gICAgICAgICAqIGRlY29tcHJlc3Npb24uIGVycm5vIGNhbiBiZSBjaGVja2VkIHRvIGRpc3Rpbmd1aXNoIHR3byBlcnJvcgotICAgICAgICAgKiBjYXNlcyAoaWYgZXJybm8gaXMgemVybywgdGhlIHpsaWIgZXJyb3IgaXMgWl9NRU1fRVJST1IpLgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBvcGVuKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICAgICAgICAgIGlmIChtX2ZwKSBjbG9zZSgpOwotICAgICAgICAgICAgbV9mcCA9IDo6Z3pvcGVuKG5hbWUsICJyYiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBvcGVuKEZJTEUqIGZwKSB7Ci0gICAgICAgICAgICBTRVRfQklOQVJZX01PREUoZnApOwotICAgICAgICAgICAgaWYgKG1fZnApIGNsb3NlKCk7Ci0gICAgICAgICAgICBtX2ZwID0gOjpnemRvcGVuKGZpbGVubyhmcCksICJyYiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRmx1c2hlcyBhbGwgcGVuZGluZyBpbnB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlCi0gICAgICAgICAqIGFuZCBkZWFsbG9jYXRlcyBhbGwgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4gVGhlIHJldHVybiB2YWx1ZSBpcwotICAgICAgICAgKiB0aGUgemxpYiBlcnJvciBudW1iZXIgKHNlZSBmdW5jdGlvbiBlcnJvcigpIGJlbG93KS4KLSAgICAgICAgICovCi0gICAgICAgIGludCBjbG9zZSgpIHsKLSAgICAgICAgICAgIGludCByID0gOjpnemNsb3NlKG1fZnApOwotICAgICAgICAgICAgbV9mcCA9IDA7IHJldHVybiByOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQmluYXJ5IHJlYWQgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0gICAgICAgICAqLwotICAgICAgICBpbnQgcmVhZCh2b2lkKiBidWYsIHNpemVfdCBsZW4pIHsKLSAgICAgICAgICAgIHJldHVybiA6Omd6cmVhZChtX2ZwLCBidWYsIGxlbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cnJlZCBvbiB0aGUKLSAgICAgICAgICogZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBlcnJudW0gaXMgc2V0IHRvIHpsaWIgZXJyb3IgbnVtYmVyLiBJZiBhbgotICAgICAgICAgKiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIG5vdCBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwKLSAgICAgICAgICogZXJybnVtIGlzIHNldCB0byBaX0VSUk5PIGFuZCB0aGUgYXBwbGljYXRpb24gbWF5IGNvbnN1bHQgZXJybm8KLSAgICAgICAgICogdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBjb2RlLgotICAgICAgICAgKi8KLSAgICAgICAgY29uc3QgY2hhciogZXJyb3IoaW50KiBlcnJudW0pIHsKLSAgICAgICAgICAgIHJldHVybiA6Omd6ZXJyb3IobV9mcCwgZXJybnVtKTsKLSAgICAgICAgfQotCi0gICAgICAgIGd6RmlsZSBmcCgpIHsgcmV0dXJuIG1fZnA7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGd6RmlsZSBtX2ZwOwotfTsKLQotLyoKLSAqIEJpbmFyeSByZWFkIHRoZSBnaXZlbiAoYXJyYXkgb2YpIG9iamVjdChzKSBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0gKiBJZiB0aGUgaW5wdXQgZmlsZSB3YXMgbm90IGluIGd6aXAgZm9ybWF0LCByZWFkKCkgY29waWVzIHRoZSBvYmplY3RzIG51bWJlcgotICogb2YgYnl0ZXMgaW50byB0aGUgYnVmZmVyLgotICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSByZWFkCi0gKiAoMCBmb3IgZW5kIG9mIGZpbGUsIC0xIGZvciBlcnJvcikuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBJdGVtcz4KLWlubGluZSBpbnQgcmVhZChpenN0cmVhbSYgenMsIFQqIHgsIEl0ZW1zIGl0ZW1zKSB7Ci0gICAgcmV0dXJuIDo6Z3pyZWFkKHpzLmZwKCksIHgsIGl0ZW1zKnNpemVvZihUKSk7Ci19Ci0KLS8qCi0gKiBCaW5hcnkgaW5wdXQgd2l0aCB0aGUgJz4nIG9wZXJhdG9yLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWlubGluZSBpenN0cmVhbSYgb3BlcmF0b3I+KGl6c3RyZWFtJiB6cywgVCYgeCkgewotICAgIDo6Z3pyZWFkKHpzLmZwKCksICZ4LCBzaXplb2YoVCkpOwotICAgIHJldHVybiB6czsKLX0KLQotCi1pbmxpbmUgenN0cmluZ2xlbjo6enN0cmluZ2xlbihpenN0cmVhbSYgenMpIHsKLSAgICB6cyA+IHZhbC5ieXRlOwotICAgIGlmICh2YWwuYnl0ZSA9PSAyNTUpIHpzID4gdmFsLndvcmQ7Ci0gICAgZWxzZSB2YWwud29yZCA9IHZhbC5ieXRlOwotfQotCi0vKgotICogUmVhZCBsZW5ndGggb2Ygc3RyaW5nICsgdGhlIHN0cmluZyB3aXRoIHRoZSAnPicgb3BlcmF0b3IuCi0gKi8KLWlubGluZSBpenN0cmVhbSYgb3BlcmF0b3I+KGl6c3RyZWFtJiB6cywgY2hhciogeCkgewotICAgIHpzdHJpbmdsZW4gbGVuKHpzKTsKLSAgICA6Omd6cmVhZCh6cy5mcCgpLCB4LCBsZW4udmFsdWUoKSk7Ci0gICAgeFtsZW4udmFsdWUoKV0gPSAnXDAnOwotICAgIHJldHVybiB6czsKLX0KLQotaW5saW5lIGNoYXIqIHJlYWRfc3RyaW5nKGl6c3RyZWFtJiB6cykgewotICAgIHpzdHJpbmdsZW4gbGVuKHpzKTsKLSAgICBjaGFyKiB4ID0gbmV3IGNoYXJbbGVuLnZhbHVlKCkrMV07Ci0gICAgOjpnenJlYWQoenMuZnAoKSwgeCwgbGVuLnZhbHVlKCkpOwotICAgIHhbbGVuLnZhbHVlKCldID0gJ1wwJzsKLSAgICByZXR1cm4geDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gb3pzdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3Mgb3pzdHJlYW0KLXsKLSAgICBwdWJsaWM6Ci0gICAgICAgIG96c3RyZWFtKCkgOiBtX2ZwKDApLCBtX29zKDApIHsKLSAgICAgICAgfQotICAgICAgICBvenN0cmVhbShGSUxFKiBmcCwgaW50IGxldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKQotICAgICAgICAgICAgOiBtX2ZwKDApLCBtX29zKDApIHsKLSAgICAgICAgICAgIG9wZW4oZnAsIGxldmVsKTsKLSAgICAgICAgfQotICAgICAgICBvenN0cmVhbShjb25zdCBjaGFyKiBuYW1lLCBpbnQgbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pCi0gICAgICAgICAgICA6IG1fZnAoMCksIG1fb3MoMCkgewotICAgICAgICAgICAgb3BlbihuYW1lLCBsZXZlbCk7Ci0gICAgICAgIH0KLSAgICAgICAgfm96c3RyZWFtKCkgewotICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciB3cml0aW5nLgotICAgICAgICAgKiBUaGUgY29tcHJlc3Npb24gbGV2ZWwgcGFyYW1ldGVyIHNob3VsZCBiZSBpbiAwLi45Ci0gICAgICAgICAqIGVycm5vIGNhbiBiZSBjaGVja2VkIHRvIGRpc3Rpbmd1aXNoIHR3byBlcnJvciBjYXNlcwotICAgICAgICAgKiAoaWYgZXJybm8gaXMgemVybywgdGhlIHpsaWIgZXJyb3IgaXMgWl9NRU1fRVJST1IpLgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBvcGVuKGNvbnN0IGNoYXIqIG5hbWUsIGludCBsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTikgewotICAgICAgICAgICAgY2hhciBtb2RlWzRdID0gIndiXDAiOwotICAgICAgICAgICAgaWYgKGxldmVsICE9IFpfREVGQVVMVF9DT01QUkVTU0lPTikgbW9kZVsyXSA9ICcwJytsZXZlbDsKLSAgICAgICAgICAgIGlmIChtX2ZwKSBjbG9zZSgpOwotICAgICAgICAgICAgbV9mcCA9IDo6Z3pvcGVuKG5hbWUsIG1vZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogb3BlbiBmcm9tIGEgRklMRSBwb2ludGVyLgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBvcGVuKEZJTEUqIGZwLCBpbnQgbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIHsKLSAgICAgICAgICAgIFNFVF9CSU5BUllfTU9ERShmcCk7Ci0gICAgICAgICAgICBjaGFyIG1vZGVbNF0gPSAid2JcMCI7Ci0gICAgICAgICAgICBpZiAobGV2ZWwgIT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSBtb2RlWzJdID0gJzAnK2xldmVsOwotICAgICAgICAgICAgaWYgKG1fZnApIGNsb3NlKCk7Ci0gICAgICAgICAgICBtX2ZwID0gOjpnemRvcGVuKGZpbGVubyhmcCksIG1vZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaWYgbmVjZXNzYXJ5LCBjbG9zZXMgdGhlIGNvbXByZXNzZWQgZmlsZQotICAgICAgICAgKiBhbmQgZGVhbGxvY2F0ZXMgYWxsIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGUuIFRoZSByZXR1cm4gdmFsdWUgaXMKLSAgICAgICAgICogdGhlIHpsaWIgZXJyb3IgbnVtYmVyIChzZWUgZnVuY3Rpb24gZXJyb3IoKSBiZWxvdykuCi0gICAgICAgICAqLwotICAgICAgICBpbnQgY2xvc2UoKSB7Ci0gICAgICAgICAgICBpZiAobV9vcykgewotICAgICAgICAgICAgICAgIDo6Z3p3cml0ZShtX2ZwLCBtX29zLT5zdHIoKSwgbV9vcy0+cGNvdW50KCkpOwotICAgICAgICAgICAgICAgIGRlbGV0ZVtdIG1fb3MtPnN0cigpOyBkZWxldGUgbV9vczsgbV9vcyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgciA9IDo6Z3pjbG9zZShtX2ZwKTsgbV9mcCA9IDA7IHJldHVybiByOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQmluYXJ5IHdyaXRlIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgotICAgICAgICAgKi8KLSAgICAgICAgaW50IHdyaXRlKGNvbnN0IHZvaWQqIGJ1Ziwgc2l6ZV90IGxlbikgewotICAgICAgICAgICAgcmV0dXJuIDo6Z3p3cml0ZShtX2ZwLCAodm9pZHApIGJ1ZiwgbGVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4gVGhlIHBhcmFtZXRlcgotICAgICAgICAgKiBfZmx1c2ggaXMgYXMgaW4gdGhlIGRlZmxhdGUoKSBmdW5jdGlvbi4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgemxpYgotICAgICAgICAgKiBlcnJvciBudW1iZXIgKHNlZSBmdW5jdGlvbiBnemVycm9yIGJlbG93KS4gZmx1c2goKSByZXR1cm5zIFpfT0sgaWYKLSAgICAgICAgICogdGhlIGZsdXNoXyBwYXJhbWV0ZXIgaXMgWl9GSU5JU0ggYW5kIGFsbCBvdXRwdXQgY291bGQgYmUgZmx1c2hlZC4KLSAgICAgICAgICogZmx1c2goKSBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBzdHJpY3RseSBuZWNlc3NhcnkgYmVjYXVzZSBpdCBjYW4KLSAgICAgICAgICogZGVncmFkZSBjb21wcmVzc2lvbi4KLSAgICAgICAgICovCi0gICAgICAgIGludCBmbHVzaChpbnQgX2ZsdXNoKSB7Ci0gICAgICAgICAgICBvc19mbHVzaCgpOwotICAgICAgICAgICAgcmV0dXJuIDo6Z3pmbHVzaChtX2ZwLCBfZmx1c2gpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGxhc3QgZXJyb3Igd2hpY2ggb2NjdXJyZWQgb24gdGhlCi0gICAgICAgICAqIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gZXJybnVtIGlzIHNldCB0byB6bGliIGVycm9yIG51bWJlci4gSWYgYW4KLSAgICAgICAgICogZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBub3QgaW4gdGhlIGNvbXByZXNzaW9uIGxpYnJhcnksCi0gICAgICAgICAqIGVycm51bSBpcyBzZXQgdG8gWl9FUlJOTyBhbmQgdGhlIGFwcGxpY2F0aW9uIG1heSBjb25zdWx0IGVycm5vCi0gICAgICAgICAqIHRvIGdldCB0aGUgZXhhY3QgZXJyb3IgY29kZS4KLSAgICAgICAgICovCi0gICAgICAgIGNvbnN0IGNoYXIqIGVycm9yKGludCogZXJybnVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gOjpnemVycm9yKG1fZnAsIGVycm51bSk7Ci0gICAgICAgIH0KLQotICAgICAgICBnekZpbGUgZnAoKSB7IHJldHVybiBtX2ZwOyB9Ci0KLSAgICAgICAgb3N0cmVhbSYgb3MoKSB7Ci0gICAgICAgICAgICBpZiAobV9vcyA9PSAwKSBtX29zID0gbmV3IG9zdHJzdHJlYW07Ci0gICAgICAgICAgICByZXR1cm4gKm1fb3M7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIG9zX2ZsdXNoKCkgewotICAgICAgICAgICAgaWYgKG1fb3MgJiYgbV9vcy0+cGNvdW50KCk+MCkgewotICAgICAgICAgICAgICAgIG9zdHJzdHJlYW0qIG9zcyA9IG5ldyBvc3Ryc3RyZWFtOwotICAgICAgICAgICAgICAgIG9zcy0+ZmlsbChtX29zLT5maWxsKCkpOwotICAgICAgICAgICAgICAgIG9zcy0+ZmxhZ3MobV9vcy0+ZmxhZ3MoKSk7Ci0gICAgICAgICAgICAgICAgb3NzLT5wcmVjaXNpb24obV9vcy0+cHJlY2lzaW9uKCkpOwotICAgICAgICAgICAgICAgIG9zcy0+d2lkdGgobV9vcy0+d2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgOjpnendyaXRlKG1fZnAsIG1fb3MtPnN0cigpLCBtX29zLT5wY291bnQoKSk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlW10gbV9vcy0+c3RyKCk7IGRlbGV0ZSBtX29zOyBtX29zID0gb3NzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBnekZpbGUgbV9mcDsKLSAgICAgICAgb3N0cnN0cmVhbSogbV9vczsKLX07Ci0KLS8qCi0gKiBCaW5hcnkgd3JpdGUgdGhlIGdpdmVuIChhcnJheSBvZikgb2JqZWN0KHMpIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KLSAqIHJldHVybnMgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbgotICogKDAgaW4gY2FzZSBvZiBlcnJvcikuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBJdGVtcz4KLWlubGluZSBpbnQgd3JpdGUob3pzdHJlYW0mIHpzLCBjb25zdCBUKiB4LCBJdGVtcyBpdGVtcykgewotICAgIHJldHVybiA6Omd6d3JpdGUoenMuZnAoKSwgKHZvaWRwKSB4LCBpdGVtcypzaXplb2YoVCkpOwotfQotCi0vKgotICogQmluYXJ5IG91dHB1dCB3aXRoIHRoZSAnPCcgb3BlcmF0b3IuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUPgotaW5saW5lIG96c3RyZWFtJiBvcGVyYXRvcjwob3pzdHJlYW0mIHpzLCBjb25zdCBUJiB4KSB7Ci0gICAgOjpnendyaXRlKHpzLmZwKCksICh2b2lkcCkgJngsIHNpemVvZihUKSk7Ci0gICAgcmV0dXJuIHpzOwotfQotCi1pbmxpbmUgenN0cmluZ2xlbjo6enN0cmluZ2xlbihvenN0cmVhbSYgenMsIGNvbnN0IGNoYXIqIHgpIHsKLSAgICB2YWwuYnl0ZSA9IDI1NTsgIHZhbC53b3JkID0gOjpzdHJsZW4oeCk7Ci0gICAgaWYgKHZhbC53b3JkIDwgMjU1KSB6cyA8ICh2YWwuYnl0ZSA9IHZhbC53b3JkKTsKLSAgICBlbHNlIHpzIDwgdmFsOwotfQotCi0vKgotICogV3JpdGUgbGVuZ3RoIG9mIHN0cmluZyArIHRoZSBzdHJpbmcgd2l0aCB0aGUgJzwnIG9wZXJhdG9yLgotICovCi1pbmxpbmUgb3pzdHJlYW0mIG9wZXJhdG9yPChvenN0cmVhbSYgenMsIGNvbnN0IGNoYXIqIHgpIHsKLSAgICB6c3RyaW5nbGVuIGxlbih6cywgeCk7Ci0gICAgOjpnendyaXRlKHpzLmZwKCksICh2b2lkcCkgeCwgbGVuLnZhbHVlKCkpOwotICAgIHJldHVybiB6czsKLX0KLQotI2lmZGVmIF9NU0NfVkVSCi1pbmxpbmUgb3pzdHJlYW0mIG9wZXJhdG9yPChvenN0cmVhbSYgenMsIGNoYXIqIGNvbnN0JiB4KSB7Ci0gICAgcmV0dXJuIHpzIDwgKGNvbnN0IGNoYXIqKSB4OwotfQotI2VuZGlmCi0KLS8qCi0gKiBBc2NpaSB3cml0ZSB3aXRoIHRoZSA8PCBvcGVyYXRvcjsKLSAqLwotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1pbmxpbmUgb3N0cmVhbSYgb3BlcmF0b3I8PChvenN0cmVhbSYgenMsIGNvbnN0IFQmIHgpIHsKLSAgICB6cy5vc19mbHVzaCgpOwotICAgIHJldHVybiB6cy5vcygpIDw8IHg7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9pb3N0cmVhbTIvenN0cmVhbV90ZXN0LmNwcCBiL3NyYy96bGliL2NvbnRyaWIvaW9zdHJlYW0yL3pzdHJlYW1fdGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNzNmNjIuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9pb3N0cmVhbTIvenN0cmVhbV90ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNpbmNsdWRlICJ6c3RyZWFtLmgiCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGlvbWFuaXAuaD4KLQotdm9pZCBtYWluKCkgewotICAgIGNoYXIgaFsyNTZdID0gIkhlbGxvIjsKLSAgICBjaGFyKiBnID0gIkdvb2RieWUiOwotICAgIG96c3RyZWFtIG91dCgidGVtcC5neiIpOwotICAgIG91dCA8ICJUaGlzIHdvcmtzIHdlbGwiIDwgaCA8IGc7Ci0gICAgb3V0LmNsb3NlKCk7Ci0KLSAgICBpenN0cmVhbSBpbigidGVtcC5neiIpOyAvLyByZWFkIGl0IGJhY2sKLSAgICBjaGFyICp4ID0gcmVhZF9zdHJpbmcoaW4pLCAqeSA9IG5ldyBjaGFyWzI1Nl0sIHpbMjU2XTsKLSAgICBpbiA+IHkgPiB6OwotICAgIGluLmNsb3NlKCk7Ci0gICAgY291dCA8PCB4IDw8IGVuZGwgPDwgeSA8PCBlbmRsIDw8IHogPDwgZW5kbDsKLQotICAgIG91dC5vcGVuKCJ0ZW1wLmd6Iik7IC8vIHRyeSBhc2NpaSBvdXRwdXQ7IHpjYXQgdGVtcC5neiB0byBzZWUgdGhlIHJlc3VsdHMKLSAgICBvdXQgPDwgc2V0dyg1MCkgPDwgc2V0ZmlsbCgnIycpIDw8IHNldHByZWNpc2lvbigyMCkgPDwgeCA8PCBlbmRsIDw8IHkgPDwgZW5kbCA8PCB6IDw8IGVuZGw7Ci0gICAgb3V0IDw8IHogPDwgZW5kbCA8PCB5IDw8IGVuZGwgPDwgeCA8PCBlbmRsOwotICAgIG91dCA8PCAxLjEyMzQ1Njc4OTAxMjM0NTY3ODkgPDwgZW5kbDsKLQotICAgIGRlbGV0ZVtdIHg7IGRlbGV0ZVtdIHk7Ci19CmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2lvc3RyZWFtMy9SRUFETUUgYi9zcmMvemxpYi9jb250cmliL2lvc3RyZWFtMy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YjMxOWEuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9pb3N0cmVhbTMvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotVGhlc2UgY2xhc3NlcyBwcm92aWRlIGEgQysrIHN0cmVhbSBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgbGlicmFyeS4gSXQgYWxsb3dzIHlvdQotdG8gZG8gdGhpbmdzIGxpa2U6Ci0KLSAgZ3pvZnN0cmVhbSBvdXRmKCJibGFoLmd6Iik7Ci0gIG91dGYgPDwgIlRoZXNlIGdvIGludG8gdGhlIGd6aXAgZmlsZSAiIDw8IDEyMyA8PCBlbmRsOwotCi1JdCBkb2VzIHRoaXMgYnkgZGVyaXZpbmcgYSBzcGVjaWFsaXplZCBzdHJlYW0gYnVmZmVyIGZvciBnemlwcGVkIGZpbGVzLCB3aGljaCBpcwotdGhlIHdheSBTdHJvdXN0cnVwIHdvdWxkIGhhdmUgZG9uZSBpdC4gOi0+Ci0KLVRoZSBnemlmc3RyZWFtIGFuZCBnem9mc3RyZWFtIGNsYXNzZXMgd2VyZSBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgS2V2aW4gUnVsYW5kCi1hbmQgbWFkZSBhdmFpbGFibGUgaW4gdGhlIHpsaWIgY29udHJpYi9pb3N0cmVhbSBkaXJlY3RvcnkuIFRoZSBvbGRlciB2ZXJzaW9uIHN0aWxsCi1jb21waWxlcyB1bmRlciBnY2MgMi54eCwgYnV0IG5vdCB1bmRlciBnY2MgMy54eCwgd2hpY2ggc3BhcmtlZCB0aGUgZGV2ZWxvcG1lbnQgb2YKLXRoaXMgdmVyc2lvbi4KLQotVGhlIG5ldyBjbGFzc2VzIGFyZSBhcyBzdGFuZGFyZC1jb21wbGlhbnQgYXMgcG9zc2libGUsIGNsb3NlbHkgZm9sbG93aW5nIHRoZQotYXBwcm9hY2ggb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkncyBmc3RyZWFtIGNsYXNzZXMuIEl0IGNvbXBpbGVzIHVuZGVyIGdjYyB2ZXJzaW9ucwotMy4yIGFuZCAzLjMsIGJ1dCBub3QgdW5kZXIgZ2NjIDIueHguIFRoaXMgaXMgbWFpbmx5IGR1ZSB0byBjaGFuZ2VzIGluIHRoZSBzdGFuZGFyZAotbGlicmFyeSBuYW1pbmcgc2NoZW1lLiBUaGUgbmV3IHZlcnNpb24gb2YgZ3ppZnN0cmVhbS9nem9mc3RyZWFtL2d6ZmlsZWJ1ZiBkaWZmZXJzCi1mcm9tIHRoZSBwcmV2aW91cyBvbmUgaW4gdGhlIGZvbGxvd2luZyByZXNwZWN0czoKLS0gYWRkZWQgc2hvd21hbnljCi0tIGFkZGVkIHNldGJ1Ziwgd2l0aCBzdXBwb3J0IGZvciB1bmJ1ZmZlcmVkIG91dHB1dCB2aWEgc2V0YnVmKDAsMCkKLS0gYSBmZXcgYnVnIGZpeGVzIG9mIHN0cmVhbSBiZWhhdmlvcgotLSBnemlwcGVkIG91dHB1dCBmaWxlIG9wZW5lZCB3aXRoIGRlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwgaW5zdGVhZCBvZiBtYXhpbXVtIGxldmVsCi0tIHNldGNvbXByZXNzaW9ubGV2ZWwoKS9zdHJhdGVneSgpIG1lbWJlcnMgcmVwbGFjZWQgYnkgc2luZ2xlIHNldGNvbXByZXNzaW9uKCkKLQotVGhlIGNvZGUgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCB0aGUgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZQotYW5kIHNlbGwgaXQgZm9yIGFueSBwdXJwb3NlIHdpdGhvdXQgZmVlLgotCi1MdWR3aWcgU2Nod2FyZHQKLTxzY2h3YXJkdEBzdW4uYWMuemE+Ci0KLURTUCBMYWIKLUVsZWN0cmljYWwgJiBFbGVjdHJvbmljIEVuZ2luZWVyaW5nIERlcGFydG1lbnQKLVVuaXZlcnNpdHkgb2YgU3RlbGxlbmJvc2NoCi1Tb3V0aCBBZnJpY2EKZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvaW9zdHJlYW0zL1RPRE8gYi9zcmMvemxpYi9jb250cmliL2lvc3RyZWFtMy9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDMyZjk3Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvaW9zdHJlYW0zL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1Qb3NzaWJsZSB1cGdyYWRlcyB0byBnemZpbGVidWY6Ci0KLS0gVGhlIGFiaWxpdHkgdG8gZG8gcHV0YmFjayAoZS5nLiBwdXRiYWNrZmFpbCkKLQotLSBUaGUgYWJpbGl0eSB0byBzZWVrICh6bGliIHN1cHBvcnRzIHRoaXMsIGJ1dCBjb3VsZCBiZSBzbG93L3RyaWNreSkKLQotLSBTaW11bHRhbmVvdXMgcmVhZC93cml0ZSBhY2Nlc3MgKGRvZXMgaXQgbWFrZSBzZW5zZT8pCi0KLS0gU3VwcG9ydCBmb3IgaW9zX2Jhc2U6OmF0ZSBvcGVuIG1vZGUKLQotLSBMb2NhbGUgc3VwcG9ydD8KLQotLSBDaGVjayBwdWJsaWMgaW50ZXJmYWNlIHRvIHNlZSB3aGljaCBjYWxscyBnaXZlIHByb2JsZW1zCi0gIChkdWUgdG8gZGVwZW5kZW5jZSBvbiBsaWJyYXJ5IGludGVybmFscykKLQotLSBPdmVycmlkZSBvcGVyYXRvcjw8KG9zdHJlYW0mLCBnemZpbGVidWYqKSB0byBhbGxvdyBkaXJlY3QgY29weWluZwotICBvZiBzdHJlYW0gYnVmZmVyIHRvIHN0cmVhbSAoIGkuZS4gb3MgPDwgaXMucmRidWYoKTsgKQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9pb3N0cmVhbTMvdGVzdC5jYyBiL3NyYy96bGliL2NvbnRyaWIvaW9zdHJlYW0zL3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MjM1MzMuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9pb3N0cmVhbTMvdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBUZXN0IHByb2dyYW0gZm9yIGd6aWZzdHJlYW0gYW5kIGd6b2ZzdHJlYW0KLSAqCi0gKiBieSBMdWR3aWcgU2Nod2FyZHQgPHNjaHdhcmR0QHN1bi5hYy56YT4KLSAqIG9yaWdpbmFsIHZlcnNpb24gYnkgS2V2aW4gUnVsYW5kIDxrZXZpbkByb2Rpbi53dXN0bC5lZHU+Ci0gKi8KLQotI2luY2x1ZGUgInpmc3RyZWFtLmgiCi0jaW5jbHVkZSA8aW9zdHJlYW0+ICAgICAgLy8gZm9yIGNvdXQKLQotaW50IG1haW4oKSB7Ci0KLSAgZ3pvZnN0cmVhbSBvdXRmOwotICBnemlmc3RyZWFtIGluZjsKLSAgY2hhciBidWZbODBdOwotCi0gIG91dGYub3BlbigidGVzdDEudHh0Lmd6Iik7Ci0gIG91dGYgPDwgIlRoZSBxdWljayBicm93biBmb3ggc2lkZXN0ZXBwZWQgdGhlIGxhenkgY2FuaW5lXG4iCi0gICAgICAgPDwgMS4zIDw8ICJcblBsYW4gIiA8PCA5IDw8IHN0ZDo6ZW5kbDsKLSAgb3V0Zi5jbG9zZSgpOwotICBzdGQ6OmNvdXQgPDwgIldyb3RlIHRoZSBmb2xsb3dpbmcgbWVzc2FnZSB0byAndGVzdDEudHh0Lmd6JyAoY2hlY2sgd2l0aCB6Y2F0IG9yIHpsZXNzKTpcbiIKLSAgICAgICAgICAgIDw8ICJUaGUgcXVpY2sgYnJvd24gZm94IHNpZGVzdGVwcGVkIHRoZSBsYXp5IGNhbmluZVxuIgotICAgICAgICAgICAgPDwgMS4zIDw8ICJcblBsYW4gIiA8PCA5IDw8IHN0ZDo6ZW5kbDsKLQotICBzdGQ6OmNvdXQgPDwgIlxuUmVhZGluZyAndGVzdDEudHh0Lmd6JyAoYnVmZmVyZWQpIHByb2R1Y2VzOlxuIjsKLSAgaW5mLm9wZW4oInRlc3QxLnR4dC5neiIpOwotICB3aGlsZSAoaW5mLmdldGxpbmUoYnVmLDgwLCdcbicpKSB7Ci0gICAgc3RkOjpjb3V0IDw8IGJ1ZiA8PCAiXHQoIiA8PCBpbmYucmRidWYoKS0+aW5fYXZhaWwoKSA8PCAiIGNoYXJzIGxlZnQgaW4gYnVmZmVyKVxuIjsKLSAgfQotICBpbmYuY2xvc2UoKTsKLQotICBvdXRmLnJkYnVmKCktPnB1YnNldGJ1ZigwLDApOwotICBvdXRmLm9wZW4oInRlc3QyLnR4dC5neiIpOwotICBvdXRmIDw8IHNldGNvbXByZXNzaW9uKFpfTk9fQ09NUFJFU1NJT04pCi0gICAgICAgPDwgIlRoZSBxdWljayBicm93biBmb3ggc2lkZXN0ZXBwZWQgdGhlIGxhenkgY2FuaW5lXG4iCi0gICAgICAgPDwgMS4zIDw8ICJcblBsYW4gIiA8PCA5IDw8IHN0ZDo6ZW5kbDsKLSAgb3V0Zi5jbG9zZSgpOwotICBzdGQ6OmNvdXQgPDwgIlxuV3JvdGUgdGhlIHNhbWUgbWVzc2FnZSB0byAndGVzdDIudHh0Lmd6JyBpbiB1bmNvbXByZXNzZWQgZm9ybSI7Ci0KLSAgc3RkOjpjb3V0IDw8ICJcblJlYWRpbmcgJ3Rlc3QyLnR4dC5neicgKHVuYnVmZmVyZWQpIHByb2R1Y2VzOlxuIjsKLSAgaW5mLnJkYnVmKCktPnB1YnNldGJ1ZigwLDApOwotICBpbmYub3BlbigidGVzdDIudHh0Lmd6Iik7Ci0gIHdoaWxlIChpbmYuZ2V0bGluZShidWYsODAsJ1xuJykpIHsKLSAgICBzdGQ6OmNvdXQgPDwgYnVmIDw8ICJcdCgiIDw8IGluZi5yZGJ1ZigpLT5pbl9hdmFpbCgpIDw8ICIgY2hhcnMgbGVmdCBpbiBidWZmZXIpXG4iOwotICB9Ci0gIGluZi5jbG9zZSgpOwotCi0gIHJldHVybiAwOwotCi19CmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL2lvc3RyZWFtMy96ZnN0cmVhbS5jYyBiL3NyYy96bGliL2NvbnRyaWIvaW9zdHJlYW0zL3pmc3RyZWFtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGViOTMzLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvaW9zdHJlYW0zL3pmc3RyZWFtLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDc5ICswLDAgQEAKLS8qCi0gKiBBIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgZ3oqIGZ1bmN0aW9ucwotICoKLSAqIGJ5IEx1ZHdpZyBTY2h3YXJkdCA8c2Nod2FyZHRAc3VuLmFjLnphPgotICogb3JpZ2luYWwgdmVyc2lvbiBieSBLZXZpbiBSdWxhbmQgPGtldmluQHJvZGluLnd1c3RsLmVkdT4KLSAqCi0gKiBUaGlzIHZlcnNpb24gaXMgc3RhbmRhcmQtY29tcGxpYW50IGFuZCBjb21wYXRpYmxlIHdpdGggZ2NjIDMueC4KLSAqLwotCi0jaW5jbHVkZSAiemZzdHJlYW0uaCIKLSNpbmNsdWRlIDxjc3RyaW5nPiAgICAgICAgICAvLyBmb3Igc3RyY3B5LCBzdHJjYXQsIHN0cmxlbiAobW9kZSBzdHJpbmdzKQotI2luY2x1ZGUgPGNzdGRpbz4gICAgICAgICAgIC8vIGZvciBCVUZTSVoKLQotLy8gSW50ZXJuYWwgYnVmZmVyIHNpemVzIChkZWZhdWx0IGFuZCAidW5idWZmZXJlZCIgdmVyc2lvbnMpCi0jZGVmaW5lIEJJR0JVRlNJWkUgQlVGU0laCi0jZGVmaW5lIFNNQUxMQlVGU0laRSAxCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotZ3pmaWxlYnVmOjpnemZpbGVidWYoKQotOiBmaWxlKE5VTEwpLCBpb19tb2RlKHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlKDApKSwgb3duX2ZkKGZhbHNlKSwKLSAgYnVmZmVyKE5VTEwpLCBidWZmZXJfc2l6ZShCSUdCVUZTSVpFKSwgb3duX2J1ZmZlcih0cnVlKQotewotICAvLyBObyBidWZmZXJzIHRvIHN0YXJ0IHdpdGgKLSAgdGhpcy0+ZGlzYWJsZV9idWZmZXIoKTsKLX0KLQotLy8gRGVzdHJ1Y3RvcgotZ3pmaWxlYnVmOjp+Z3pmaWxlYnVmKCkKLXsKLSAgLy8gU3luYyBvdXRwdXQgYnVmZmVyIGFuZCBjbG9zZSBvbmx5IGlmIHJlc3BvbnNpYmxlIGZvciBmaWxlCi0gIC8vIChpLmUuIGF0dGFjaGVkIHN0cmVhbXMgc2hvdWxkIGJlIGxlZnQgb3BlbiBhdCB0aGlzIHN0YWdlKQotICB0aGlzLT5zeW5jKCk7Ci0gIGlmIChvd25fZmQpCi0gICAgdGhpcy0+Y2xvc2UoKTsKLSAgLy8gTWFrZSBzdXJlIGludGVybmFsIGJ1ZmZlciBpcyBkZWFsbG9jYXRlZAotICB0aGlzLT5kaXNhYmxlX2J1ZmZlcigpOwotfQotCi0vLyBTZXQgY29tcHJlc3Npb24gbGV2ZWwgYW5kIHN0cmF0ZWd5Ci1pbnQKLWd6ZmlsZWJ1Zjo6c2V0Y29tcHJlc3Npb24oaW50IGNvbXBfbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wX3N0cmF0ZWd5KQotewotICByZXR1cm4gZ3pzZXRwYXJhbXMoZmlsZSwgY29tcF9sZXZlbCwgY29tcF9zdHJhdGVneSk7Ci19Ci0KLS8vIE9wZW4gZ3ppcHBlZCBmaWxlCi1nemZpbGVidWYqCi1nemZpbGVidWY6Om9wZW4oY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQotewotICAvLyBGYWlsIGlmIGZpbGUgYWxyZWFkeSBvcGVuCi0gIGlmICh0aGlzLT5pc19vcGVuKCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIC8vIERvbid0IHN1cHBvcnQgc2ltdWx0YW5lb3VzIHJlYWQvd3JpdGUgYWNjZXNzICh5ZXQpCi0gIGlmICgobW9kZSAmIHN0ZDo6aW9zX2Jhc2U6OmluKSAmJiAobW9kZSAmIHN0ZDo6aW9zX2Jhc2U6Om91dCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLy8gQnVpbGQgbW9kZSBzdHJpbmcgZm9yIGd6b3BlbiBhbmQgY2hlY2sgaXQgWzI3LjguMS4zLjJdCi0gIGNoYXIgY2hhcl9tb2RlWzZdID0gIlwwXDBcMFwwXDAiOwotICBpZiAoIXRoaXMtPm9wZW5fbW9kZShtb2RlLCBjaGFyX21vZGUpKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8vIEF0dGVtcHQgdG8gb3BlbiBmaWxlCi0gIGlmICgoZmlsZSA9IGd6b3BlbihuYW1lLCBjaGFyX21vZGUpKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8vIE9uIHN1Y2Nlc3MsIGFsbG9jYXRlIGludGVybmFsIGJ1ZmZlciBhbmQgc2V0IGZsYWdzCi0gIHRoaXMtPmVuYWJsZV9idWZmZXIoKTsKLSAgaW9fbW9kZSA9IG1vZGU7Ci0gIG93bl9mZCA9IHRydWU7Ci0gIHJldHVybiB0aGlzOwotfQotCi0vLyBBdHRhY2ggdG8gZ3ppcHBlZCBmaWxlCi1nemZpbGVidWYqCi1nemZpbGVidWY6OmF0dGFjaChpbnQgZmQsCi0gICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQotewotICAvLyBGYWlsIGlmIGZpbGUgYWxyZWFkeSBvcGVuCi0gIGlmICh0aGlzLT5pc19vcGVuKCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIC8vIERvbid0IHN1cHBvcnQgc2ltdWx0YW5lb3VzIHJlYWQvd3JpdGUgYWNjZXNzICh5ZXQpCi0gIGlmICgobW9kZSAmIHN0ZDo6aW9zX2Jhc2U6OmluKSAmJiAobW9kZSAmIHN0ZDo6aW9zX2Jhc2U6Om91dCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLy8gQnVpbGQgbW9kZSBzdHJpbmcgZm9yIGd6ZG9wZW4gYW5kIGNoZWNrIGl0IFsyNy44LjEuMy4yXQotICBjaGFyIGNoYXJfbW9kZVs2XSA9ICJcMFwwXDBcMFwwIjsKLSAgaWYgKCF0aGlzLT5vcGVuX21vZGUobW9kZSwgY2hhcl9tb2RlKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvLyBBdHRlbXB0IHRvIGF0dGFjaCB0byBmaWxlCi0gIGlmICgoZmlsZSA9IGd6ZG9wZW4oZmQsIGNoYXJfbW9kZSkpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLy8gT24gc3VjY2VzcywgYWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVyIGFuZCBzZXQgZmxhZ3MKLSAgdGhpcy0+ZW5hYmxlX2J1ZmZlcigpOwotICBpb19tb2RlID0gbW9kZTsKLSAgb3duX2ZkID0gZmFsc2U7Ci0gIHJldHVybiB0aGlzOwotfQotCi0vLyBDbG9zZSBnemlwcGVkIGZpbGUKLWd6ZmlsZWJ1ZioKLWd6ZmlsZWJ1Zjo6Y2xvc2UoKQotewotICAvLyBGYWlsIGltbWVkaWF0ZWx5IGlmIG5vIGZpbGUgaXMgb3BlbgotICBpZiAoIXRoaXMtPmlzX29wZW4oKSkKLSAgICByZXR1cm4gTlVMTDsKLSAgLy8gQXNzdW1lIHN1Y2Nlc3MKLSAgZ3pmaWxlYnVmKiByZXR2YWwgPSB0aGlzOwotICAvLyBBdHRlbXB0IHRvIHN5bmMgYW5kIGNsb3NlIGd6aXBwZWQgZmlsZQotICBpZiAodGhpcy0+c3luYygpID09IC0xKQotICAgIHJldHZhbCA9IE5VTEw7Ci0gIGlmIChnemNsb3NlKGZpbGUpIDwgMCkKLSAgICByZXR2YWwgPSBOVUxMOwotICAvLyBGaWxlIGlzIG5vdyBnb25lIGFueXdheSAocG9zdGNvbmRpdGlvbiBbMjcuOC4xLjMuOF0pCi0gIGZpbGUgPSBOVUxMOwotICBvd25fZmQgPSBmYWxzZTsKLSAgLy8gRGVzdHJveSBpbnRlcm5hbCBidWZmZXIgaWYgaXQgZXhpc3RzCi0gIHRoaXMtPmRpc2FibGVfYnVmZmVyKCk7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KLQotLy8gQ29udmVydCBpbnQgb3BlbiBtb2RlIHRvIG1vZGUgc3RyaW5nCi1ib29sCi1nemZpbGVidWY6Om9wZW5fbW9kZShzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgY2hhciogY19tb2RlKSBjb25zdAotewotICBib29sIHRlc3RiID0gbW9kZSAmIHN0ZDo6aW9zX2Jhc2U6OmJpbmFyeTsKLSAgYm9vbCB0ZXN0aSA9IG1vZGUgJiBzdGQ6Omlvc19iYXNlOjppbjsKLSAgYm9vbCB0ZXN0byA9IG1vZGUgJiBzdGQ6Omlvc19iYXNlOjpvdXQ7Ci0gIGJvb2wgdGVzdHQgPSBtb2RlICYgc3RkOjppb3NfYmFzZTo6dHJ1bmM7Ci0gIGJvb2wgdGVzdGEgPSBtb2RlICYgc3RkOjppb3NfYmFzZTo6YXBwOwotCi0gIC8vIENoZWNrIGZvciB2YWxpZCBmbGFnIGNvbWJpbmF0aW9ucyAtIHNlZSBbMjcuOC4xLjMuMl0gKFRhYmxlIDkyKQotICAvLyBPcmlnaW5hbCB6ZnN0cmVhbSBoYXJkY29kZWQgdGhlIGNvbXByZXNzaW9uIGxldmVsIHRvIG1heGltdW0gaGVyZS4uLgotICAvLyBEb3VibGUgdGhlIHRpbWUgZm9yIGxlc3MgdGhhbiAxJSBzaXplIGltcHJvdmVtZW50IHNlZW1zCi0gIC8vIGV4Y2Vzc2l2ZSB0aG91Z2ggLSBrZWVwaW5nIGl0IGF0IHRoZSBkZWZhdWx0IGxldmVsCi0gIC8vIFRvIGNoYW5nZSBiYWNrLCBqdXN0IGFwcGVuZCAiOSIgdG8gdGhlIG5leHQgdGhyZWUgbW9kZSBzdHJpbmdzCi0gIGlmICghdGVzdGkgJiYgdGVzdG8gJiYgIXRlc3R0ICYmICF0ZXN0YSkKLSAgICBzdHJjcHkoY19tb2RlLCAidyIpOwotICBpZiAoIXRlc3RpICYmIHRlc3RvICYmICF0ZXN0dCAmJiB0ZXN0YSkKLSAgICBzdHJjcHkoY19tb2RlLCAiYSIpOwotICBpZiAoIXRlc3RpICYmIHRlc3RvICYmIHRlc3R0ICYmICF0ZXN0YSkKLSAgICBzdHJjcHkoY19tb2RlLCAidyIpOwotICBpZiAodGVzdGkgJiYgIXRlc3RvICYmICF0ZXN0dCAmJiAhdGVzdGEpCi0gICAgc3RyY3B5KGNfbW9kZSwgInIiKTsKLSAgLy8gTm8gcmVhZC93cml0ZSBtb2RlIHlldAotLy8gIGlmICh0ZXN0aSAmJiB0ZXN0byAmJiAhdGVzdHQgJiYgIXRlc3RhKQotLy8gICAgc3RyY3B5KGNfbW9kZSwgInIrIik7Ci0vLyAgaWYgKHRlc3RpICYmIHRlc3RvICYmIHRlc3R0ICYmICF0ZXN0YSkKLS8vICAgIHN0cmNweShjX21vZGUsICJ3KyIpOwotCi0gIC8vIE1vZGUgc3RyaW5nIHNob3VsZCBiZSBlbXB0eSBmb3IgaW52YWxpZCBjb21iaW5hdGlvbiBvZiBmbGFncwotICBpZiAoc3RybGVuKGNfbW9kZSkgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICh0ZXN0YikKLSAgICBzdHJjYXQoY19tb2RlLCAiYiIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gRGV0ZXJtaW5lIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGludGVybmFsIGdldCBidWZmZXIKLXN0ZDo6c3RyZWFtc2l6ZQotZ3pmaWxlYnVmOjpzaG93bWFueWMoKQotewotICAvLyBDYWxscyB0byB1bmRlcmZsb3cgd2lsbCBmYWlsIGlmIGZpbGUgbm90IG9wZW5lZCBmb3IgcmVhZGluZwotICBpZiAoIXRoaXMtPmlzX29wZW4oKSB8fCAhKGlvX21vZGUgJiBzdGQ6Omlvc19iYXNlOjppbikpCi0gICAgcmV0dXJuIC0xOwotICAvLyBNYWtlIHN1cmUgZ2V0IGFyZWEgaXMgaW4gdXNlCi0gIGlmICh0aGlzLT5ncHRyKCkgJiYgKHRoaXMtPmdwdHIoKSA8IHRoaXMtPmVncHRyKCkpKQotICAgIHJldHVybiBzdGQ6OnN0cmVhbXNpemUodGhpcy0+ZWdwdHIoKSAtIHRoaXMtPmdwdHIoKSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLy8gRmlsbCBnZXQgYXJlYSBmcm9tIGd6aXBwZWQgZmlsZQotZ3pmaWxlYnVmOjppbnRfdHlwZQotZ3pmaWxlYnVmOjp1bmRlcmZsb3coKQotewotICAvLyBJZiBzb21ldGhpbmcgaXMgbGVmdCBpbiB0aGUgZ2V0IGFyZWEgYnkgY2hhbmNlLCByZXR1cm4gaXQKLSAgLy8gKHRoaXMgc2hvdWxkbid0IG5vcm1hbGx5IGhhcHBlbiwgYXMgdW5kZXJmbG93IGlzIG9ubHkgc3VwcG9zZWQKLSAgLy8gdG8gYmUgY2FsbGVkIHdoZW4gZ3B0ciA+PSBlZ3B0ciwgYnV0IGl0IHNlcnZlcyBhcyBlcnJvciBjaGVjaykKLSAgaWYgKHRoaXMtPmdwdHIoKSAmJiAodGhpcy0+Z3B0cigpIDwgdGhpcy0+ZWdwdHIoKSkpCi0gICAgcmV0dXJuIHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqKHRoaXMtPmdwdHIoKSkpOwotCi0gIC8vIElmIHRoZSBmaWxlIGhhc24ndCBiZWVuIG9wZW5lZCBmb3IgcmVhZGluZywgcHJvZHVjZSBlcnJvcgotICBpZiAoIXRoaXMtPmlzX29wZW4oKSB8fCAhKGlvX21vZGUgJiBzdGQ6Omlvc19iYXNlOjppbikpCi0gICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKLQotICAvLyBBdHRlbXB0IHRvIGZpbGwgaW50ZXJuYWwgYnVmZmVyIGZyb20gZ3ppcHBlZCBmaWxlCi0gIC8vIChidWZmZXIgbXVzdCBiZSBndWFyYW50ZWVkIHRvIGV4aXN0Li4uKQotICBpbnQgYnl0ZXNfcmVhZCA9IGd6cmVhZChmaWxlLCBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKLSAgLy8gSW5kaWNhdGVzIGVycm9yIG9yIEVPRgotICBpZiAoYnl0ZXNfcmVhZCA8PSAwKQotICB7Ci0gICAgLy8gUmVzZXQgZ2V0IGFyZWEKLSAgICB0aGlzLT5zZXRnKGJ1ZmZlciwgYnVmZmVyLCBidWZmZXIpOwotICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7Ci0gIH0KLSAgLy8gTWFrZSBhbGwgYnl0ZXMgcmVhZCBmcm9tIGZpbGUgYXZhaWxhYmxlIGFzIGdldCBhcmVhCi0gIHRoaXMtPnNldGcoYnVmZmVyLCBidWZmZXIsIGJ1ZmZlciArIGJ5dGVzX3JlYWQpOwotCi0gIC8vIFJldHVybiBuZXh0IGNoYXJhY3RlciBpbiBnZXQgYXJlYQotICByZXR1cm4gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCoodGhpcy0+Z3B0cigpKSk7Ci19Ci0KLS8vIFdyaXRlIHB1dCBhcmVhIHRvIGd6aXBwZWQgZmlsZQotZ3pmaWxlYnVmOjppbnRfdHlwZQotZ3pmaWxlYnVmOjpvdmVyZmxvdyhpbnRfdHlwZSBjKQotewotICAvLyBEZXRlcm1pbmUgd2hldGhlciBwdXQgYXJlYSBpcyBpbiB1c2UKLSAgaWYgKHRoaXMtPnBiYXNlKCkpCi0gIHsKLSAgICAvLyBEb3VibGUtY2hlY2sgcG9pbnRlciByYW5nZQotICAgIGlmICh0aGlzLT5wcHRyKCkgPiB0aGlzLT5lcHB0cigpIHx8IHRoaXMtPnBwdHIoKSA8IHRoaXMtPnBiYXNlKCkpCi0gICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOwotICAgIC8vIEFkZCBleHRyYSBjaGFyYWN0ZXIgdG8gYnVmZmVyIGlmIG5vdCBFT0YKLSAgICBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShjLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQotICAgIHsKLSAgICAgICoodGhpcy0+cHB0cigpKSA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoYyk7Ci0gICAgICB0aGlzLT5wYnVtcCgxKTsKLSAgICB9Ci0gICAgLy8gTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gd3JpdGUgdG8gZmlsZQotICAgIGludCBieXRlc190b193cml0ZSA9IHRoaXMtPnBwdHIoKSAtIHRoaXMtPnBiYXNlKCk7Ci0gICAgLy8gT3ZlcmZsb3cgZG9lc24ndCBmYWlsIGlmIG5vdGhpbmcgaXMgdG8gYmUgd3JpdHRlbgotICAgIGlmIChieXRlc190b193cml0ZSA+IDApCi0gICAgewotICAgICAgLy8gSWYgdGhlIGZpbGUgaGFzbid0IGJlZW4gb3BlbmVkIGZvciB3cml0aW5nLCBwcm9kdWNlIGVycm9yCi0gICAgICBpZiAoIXRoaXMtPmlzX29wZW4oKSB8fCAhKGlvX21vZGUgJiBzdGQ6Omlvc19iYXNlOjpvdXQpKQotICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOwotICAgICAgLy8gSWYgZ3ppcHBlZCBmaWxlIHdvbid0IGFjY2VwdCBhbGwgYnl0ZXMgd3JpdHRlbiB0byBpdCwgZmFpbAotICAgICAgaWYgKGd6d3JpdGUoZmlsZSwgdGhpcy0+cGJhc2UoKSwgYnl0ZXNfdG9fd3JpdGUpICE9IGJ5dGVzX3RvX3dyaXRlKQotICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOwotICAgICAgLy8gUmVzZXQgbmV4dCBwb2ludGVyIHRvIHBvaW50IHRvIHBiYXNlIG9uIHN1Y2Nlc3MKLSAgICAgIHRoaXMtPnBidW1wKC1ieXRlc190b193cml0ZSk7Ci0gICAgfQotICB9Ci0gIC8vIFdyaXRlIGV4dHJhIGNoYXJhY3RlciB0byBmaWxlIGlmIG5vdCBFT0YKLSAgZWxzZSBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShjLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQotICB7Ci0gICAgLy8gSWYgdGhlIGZpbGUgaGFzbid0IGJlZW4gb3BlbmVkIGZvciB3cml0aW5nLCBwcm9kdWNlIGVycm9yCi0gICAgaWYgKCF0aGlzLT5pc19vcGVuKCkgfHwgIShpb19tb2RlICYgc3RkOjppb3NfYmFzZTo6b3V0KSkKLSAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7Ci0gICAgLy8gSW1wcm9tcHR1IGNoYXIgYnVmZmVyIChhbGxvd3MgInVuYnVmZmVyZWQiIG91dHB1dCkKLSAgICBjaGFyX3R5cGUgbGFzdF9jaGFyID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShjKTsKLSAgICAvLyBJZiBnemlwcGVkIGZpbGUgd29uJ3QgYWNjZXB0IHRoaXMgY2hhcmFjdGVyLCBmYWlsCi0gICAgaWYgKGd6d3JpdGUoZmlsZSwgJmxhc3RfY2hhciwgMSkgIT0gMSkKLSAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7Ci0gIH0KLQotICAvLyBJZiB5b3UgZ290IGhlcmUsIHlvdSBoYXZlIHN1Y2NlZWRlZCAoZXZlbiBpZiBjIHdhcyBFT0YpCi0gIC8vIFRoZSByZXR1cm4gdmFsdWUgc2hvdWxkIHRoZXJlZm9yZSBiZSBub24tRU9GCi0gIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoYywgdHJhaXRzX3R5cGU6OmVvZigpKSkKLSAgICByZXR1cm4gdHJhaXRzX3R5cGU6Om5vdF9lb2YoYyk7Ci0gIGVsc2UKLSAgICByZXR1cm4gYzsKLX0KLQotLy8gQXNzaWduIG5ldyBidWZmZXIKLXN0ZDo6c3RyZWFtYnVmKgotZ3pmaWxlYnVmOjpzZXRidWYoY2hhcl90eXBlKiBwLAotICAgICAgICAgICAgICAgICAgc3RkOjpzdHJlYW1zaXplIG4pCi17Ci0gIC8vIEZpcnN0IG1ha2Ugc3VyZSBzdHVmZiBpcyBzeW5jJ2VkLCBmb3Igc2FmZXR5Ci0gIGlmICh0aGlzLT5zeW5jKCkgPT0gLTEpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIC8vIElmIGJ1ZmZlcmluZyBpcyB0dXJuZWQgb2ZmIG9uIHB1cnBvc2UgdmlhIHNldGJ1ZigwLDApLCBzdGlsbCBhbGxvY2F0ZSBvbmUuLi4KLSAgLy8gIlVuYnVmZmVyZWQiIG9ubHkgcmVhbGx5IHJlZmVycyB0byBwdXQgWzI3LjguMS40LjEwXSwgd2hpbGUgZ2V0IG5lZWRzIGF0Ci0gIC8vIGxlYXN0IGEgYnVmZmVyIG9mIHNpemUgMSAodmVyeSBpbmVmZmljaWVudCB0aG91Z2gsIHRoZXJlZm9yZSBtYWtlIGl0IGJpZ2dlcj8pCi0gIC8vIFRoaXMgZm9sbG93cyBmcm9tIFsyNy41LjIuNC4zXS8xMiAoZ3B0ciBuZWVkcyB0byBwb2ludCBhdCBzb21ldGhpbmcsIGl0IHNlZW1zKQotICBpZiAoIXAgfHwgIW4pCi0gIHsKLSAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIGJ1ZmZlciAoaWYgYW55KSB3aXRoIHNtYWxsIGludGVybmFsIGJ1ZmZlcgotICAgIHRoaXMtPmRpc2FibGVfYnVmZmVyKCk7Ci0gICAgYnVmZmVyID0gTlVMTDsKLSAgICBidWZmZXJfc2l6ZSA9IDA7Ci0gICAgb3duX2J1ZmZlciA9IHRydWU7Ci0gICAgdGhpcy0+ZW5hYmxlX2J1ZmZlcigpOwotICB9Ci0gIGVsc2UKLSAgewotICAgIC8vIFJlcGxhY2UgZXhpc3RpbmcgYnVmZmVyIChpZiBhbnkpIHdpdGggZXh0ZXJuYWwgYnVmZmVyCi0gICAgdGhpcy0+ZGlzYWJsZV9idWZmZXIoKTsKLSAgICBidWZmZXIgPSBwOwotICAgIGJ1ZmZlcl9zaXplID0gbjsKLSAgICBvd25fYnVmZmVyID0gZmFsc2U7Ci0gICAgdGhpcy0+ZW5hYmxlX2J1ZmZlcigpOwotICB9Ci0gIHJldHVybiB0aGlzOwotfQotCi0vLyBXcml0ZSBwdXQgYXJlYSB0byBnemlwcGVkIGZpbGUgKGkuZS4gZW5zdXJlcyB0aGF0IHB1dCBhcmVhIGlzIGVtcHR5KQotaW50Ci1nemZpbGVidWY6OnN5bmMoKQotewotICByZXR1cm4gdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKHRoaXMtPm92ZXJmbG93KCksIHRyYWl0c190eXBlOjplb2YoKSkgPyAtMSA6IDA7Ci19Ci0KLS8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KLQotLy8gQWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVyCi12b2lkCi1nemZpbGVidWY6OmVuYWJsZV9idWZmZXIoKQotewotICAvLyBJZiBpbnRlcm5hbCBidWZmZXIgcmVxdWlyZWQsIGFsbG9jYXRlIG9uZQotICBpZiAob3duX2J1ZmZlciAmJiAhYnVmZmVyKQotICB7Ci0gICAgLy8gQ2hlY2sgZm9yIGJ1ZmZlcmVkIHZzLiAidW5idWZmZXJlZCIKLSAgICBpZiAoYnVmZmVyX3NpemUgPiAwKQotICAgIHsKLSAgICAgIC8vIEFsbG9jYXRlIGludGVybmFsIGJ1ZmZlcgotICAgICAgYnVmZmVyID0gbmV3IGNoYXJfdHlwZVtidWZmZXJfc2l6ZV07Ci0gICAgICAvLyBHZXQgYXJlYSBzdGFydHMgZW1wdHkgYW5kIHdpbGwgYmUgZXhwYW5kZWQgYnkgdW5kZXJmbG93IGFzIG5lZWQgYXJpc2VzCi0gICAgICB0aGlzLT5zZXRnKGJ1ZmZlciwgYnVmZmVyLCBidWZmZXIpOwotICAgICAgLy8gU2V0dXAgZW50aXJlIGludGVybmFsIGJ1ZmZlciBhcyBwdXQgYXJlYS4KLSAgICAgIC8vIFRoZSBvbmUtcGFzdC1lbmQgcG9pbnRlciBhY3R1YWxseSBwb2ludHMgdG8gdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgYnVmZmVyLAotICAgICAgLy8gc28gdGhhdCBvdmVyZmxvdyhjKSBjYW4gc2FmZWx5IGFkZCB0aGUgZXh0cmEgY2hhcmFjdGVyIGMgdG8gdGhlIHNlcXVlbmNlLgotICAgICAgLy8gVGhlc2UgcG9pbnRlcnMgcmVtYWluIGluIHBsYWNlIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGJ1ZmZlcgotICAgICAgdGhpcy0+c2V0cChidWZmZXIsIGJ1ZmZlciArIGJ1ZmZlcl9zaXplIC0gMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBFdmVuIGluICJ1bmJ1ZmZlcmVkIiBjYXNlLCAoc21hbGw/KSBnZXQgYnVmZmVyIGlzIHN0aWxsIHJlcXVpcmVkCi0gICAgICBidWZmZXJfc2l6ZSA9IFNNQUxMQlVGU0laRTsKLSAgICAgIGJ1ZmZlciA9IG5ldyBjaGFyX3R5cGVbYnVmZmVyX3NpemVdOwotICAgICAgdGhpcy0+c2V0ZyhidWZmZXIsIGJ1ZmZlciwgYnVmZmVyKTsKLSAgICAgIC8vICJVbmJ1ZmZlcmVkIiBtZWFucyBubyBwdXQgYnVmZmVyCi0gICAgICB0aGlzLT5zZXRwKDAsIDApOwotICAgIH0KLSAgfQotICBlbHNlCi0gIHsKLSAgICAvLyBJZiBidWZmZXIgYWxyZWFkeSBhbGxvY2F0ZWQsIHJlc2V0IGJ1ZmZlciBwb2ludGVycyBqdXN0IHRvIG1ha2Ugc3VyZSBubwotICAgIC8vIHN0YWxlIGNoYXJzIGFyZSBseWluZyBhcm91bmQKLSAgICB0aGlzLT5zZXRnKGJ1ZmZlciwgYnVmZmVyLCBidWZmZXIpOwotICAgIHRoaXMtPnNldHAoYnVmZmVyLCBidWZmZXIgKyBidWZmZXJfc2l6ZSAtIDEpOwotICB9Ci19Ci0KLS8vIERlc3Ryb3kgaW50ZXJuYWwgYnVmZmVyCi12b2lkCi1nemZpbGVidWY6OmRpc2FibGVfYnVmZmVyKCkKLXsKLSAgLy8gSWYgaW50ZXJuYWwgYnVmZmVyIGV4aXN0cywgZGVhbGxvY2F0ZSBpdAotICBpZiAob3duX2J1ZmZlciAmJiBidWZmZXIpCi0gIHsKLSAgICAvLyBQcmVzZXJ2ZSB1bmJ1ZmZlcmVkIHN0YXR1cyBieSB6ZXJvaW5nIHNpemUKLSAgICBpZiAoIXRoaXMtPnBiYXNlKCkpCi0gICAgICBidWZmZXJfc2l6ZSA9IDA7Ci0gICAgZGVsZXRlW10gYnVmZmVyOwotICAgIGJ1ZmZlciA9IE5VTEw7Ci0gICAgdGhpcy0+c2V0ZygwLCAwLCAwKTsKLSAgICB0aGlzLT5zZXRwKDAsIDApOwotICB9Ci0gIGVsc2UKLSAgewotICAgIC8vIFJlc2V0IGJ1ZmZlciBwb2ludGVycyB0byBpbml0aWFsIHN0YXRlIGlmIGV4dGVybmFsIGJ1ZmZlciBleGlzdHMKLSAgICB0aGlzLT5zZXRnKGJ1ZmZlciwgYnVmZmVyLCBidWZmZXIpOwotICAgIGlmIChidWZmZXIpCi0gICAgICB0aGlzLT5zZXRwKGJ1ZmZlciwgYnVmZmVyICsgYnVmZmVyX3NpemUgLSAxKTsKLSAgICBlbHNlCi0gICAgICB0aGlzLT5zZXRwKDAsIDApOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyBzdHJlYW0gYnVmZmVyCi1nemlmc3RyZWFtOjpnemlmc3RyZWFtKCkKLTogc3RkOjppc3RyZWFtKE5VTEwpLCBzYigpCi17IHRoaXMtPmluaXQoJnNiKTsgfQotCi0vLyBJbml0aWFsaXplIHN0cmVhbSBidWZmZXIgYW5kIG9wZW4gZmlsZQotZ3ppZnN0cmVhbTo6Z3ppZnN0cmVhbShjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQotOiBzdGQ6OmlzdHJlYW0oTlVMTCksIHNiKCkKLXsKLSAgdGhpcy0+aW5pdCgmc2IpOwotICB0aGlzLT5vcGVuKG5hbWUsIG1vZGUpOwotfQotCi0vLyBJbml0aWFsaXplIHN0cmVhbSBidWZmZXIgYW5kIGF0dGFjaCB0byBmaWxlCi1nemlmc3RyZWFtOjpnemlmc3RyZWFtKGludCBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSkKLTogc3RkOjppc3RyZWFtKE5VTEwpLCBzYigpCi17Ci0gIHRoaXMtPmluaXQoJnNiKTsKLSAgdGhpcy0+YXR0YWNoKGZkLCBtb2RlKTsKLX0KLQotLy8gT3BlbiBmaWxlIGFuZCBnbyBpbnRvIGZhaWwoKSBzdGF0ZSBpZiB1bnN1Y2Nlc3NmdWwKLXZvaWQKLWd6aWZzdHJlYW06Om9wZW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSkKLXsKLSAgaWYgKCFzYi5vcGVuKG5hbWUsIG1vZGUgfCBzdGQ6Omlvc19iYXNlOjppbikpCi0gICAgdGhpcy0+c2V0c3RhdGUoc3RkOjppb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gIGVsc2UKLSAgICB0aGlzLT5jbGVhcigpOwotfQotCi0vLyBBdHRhY2ggdG8gZmlsZSBhbmQgZ28gaW50byBmYWlsKCkgc3RhdGUgaWYgdW5zdWNjZXNzZnVsCi12b2lkCi1nemlmc3RyZWFtOjphdHRhY2goaW50IGZkLAotICAgICAgICAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUpCi17Ci0gIGlmICghc2IuYXR0YWNoKGZkLCBtb2RlIHwgc3RkOjppb3NfYmFzZTo6aW4pKQotICAgIHRoaXMtPnNldHN0YXRlKHN0ZDo6aW9zX2Jhc2U6OmZhaWxiaXQpOwotICBlbHNlCi0gICAgdGhpcy0+Y2xlYXIoKTsKLX0KLQotLy8gQ2xvc2UgZmlsZQotdm9pZAotZ3ppZnN0cmVhbTo6Y2xvc2UoKQotewotICBpZiAoIXNiLmNsb3NlKCkpCi0gICAgdGhpcy0+c2V0c3RhdGUoc3RkOjppb3NfYmFzZTo6ZmFpbGJpdCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyBzdHJlYW0gYnVmZmVyCi1nem9mc3RyZWFtOjpnem9mc3RyZWFtKCkKLTogc3RkOjpvc3RyZWFtKE5VTEwpLCBzYigpCi17IHRoaXMtPmluaXQoJnNiKTsgfQotCi0vLyBJbml0aWFsaXplIHN0cmVhbSBidWZmZXIgYW5kIG9wZW4gZmlsZQotZ3pvZnN0cmVhbTo6Z3pvZnN0cmVhbShjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQotOiBzdGQ6Om9zdHJlYW0oTlVMTCksIHNiKCkKLXsKLSAgdGhpcy0+aW5pdCgmc2IpOwotICB0aGlzLT5vcGVuKG5hbWUsIG1vZGUpOwotfQotCi0vLyBJbml0aWFsaXplIHN0cmVhbSBidWZmZXIgYW5kIGF0dGFjaCB0byBmaWxlCi1nem9mc3RyZWFtOjpnem9mc3RyZWFtKGludCBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSkKLTogc3RkOjpvc3RyZWFtKE5VTEwpLCBzYigpCi17Ci0gIHRoaXMtPmluaXQoJnNiKTsKLSAgdGhpcy0+YXR0YWNoKGZkLCBtb2RlKTsKLX0KLQotLy8gT3BlbiBmaWxlIGFuZCBnbyBpbnRvIGZhaWwoKSBzdGF0ZSBpZiB1bnN1Y2Nlc3NmdWwKLXZvaWQKLWd6b2ZzdHJlYW06Om9wZW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSkKLXsKLSAgaWYgKCFzYi5vcGVuKG5hbWUsIG1vZGUgfCBzdGQ6Omlvc19iYXNlOjpvdXQpKQotICAgIHRoaXMtPnNldHN0YXRlKHN0ZDo6aW9zX2Jhc2U6OmZhaWxiaXQpOwotICBlbHNlCi0gICAgdGhpcy0+Y2xlYXIoKTsKLX0KLQotLy8gQXR0YWNoIHRvIGZpbGUgYW5kIGdvIGludG8gZmFpbCgpIHN0YXRlIGlmIHVuc3VjY2Vzc2Z1bAotdm9pZAotZ3pvZnN0cmVhbTo6YXR0YWNoKGludCBmZCwKLSAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQotewotICBpZiAoIXNiLmF0dGFjaChmZCwgbW9kZSB8IHN0ZDo6aW9zX2Jhc2U6Om91dCkpCi0gICAgdGhpcy0+c2V0c3RhdGUoc3RkOjppb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gIGVsc2UKLSAgICB0aGlzLT5jbGVhcigpOwotfQotCi0vLyBDbG9zZSBmaWxlCi12b2lkCi1nem9mc3RyZWFtOjpjbG9zZSgpCi17Ci0gIGlmICghc2IuY2xvc2UoKSkKLSAgICB0aGlzLT5zZXRzdGF0ZShzdGQ6Omlvc19iYXNlOjpmYWlsYml0KTsKLX0KZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvaW9zdHJlYW0zL3pmc3RyZWFtLmggYi9zcmMvemxpYi9jb250cmliL2lvc3RyZWFtMy96ZnN0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTc0NDc5Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvaW9zdHJlYW0zL3pmc3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NjYgKzAsMCBAQAotLyoKLSAqIEEgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZSB0byB0aGUgemxpYiBneiogZnVuY3Rpb25zCi0gKgotICogYnkgTHVkd2lnIFNjaHdhcmR0IDxzY2h3YXJkdEBzdW4uYWMuemE+Ci0gKiBvcmlnaW5hbCB2ZXJzaW9uIGJ5IEtldmluIFJ1bGFuZCA8a2V2aW5Acm9kaW4ud3VzdGwuZWR1PgotICoKLSAqIFRoaXMgdmVyc2lvbiBpcyBzdGFuZGFyZC1jb21wbGlhbnQgYW5kIGNvbXBhdGlibGUgd2l0aCBnY2MgMy54LgotICovCi0KLSNpZm5kZWYgWkZTVFJFQU1fSAotI2RlZmluZSBaRlNUUkVBTV9ICi0KLSNpbmNsdWRlIDxpc3RyZWFtPiAgLy8gbm90IGlvc3RyZWFtLCBzaW5jZSB3ZSBkb24ndCBuZWVkIGNpbi9jb3V0Ci0jaW5jbHVkZSA8b3N0cmVhbT4KLSNpbmNsdWRlICJ6bGliLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiAgQGJyaWVmICBHemlwcGVkIGZpbGUgc3RyZWFtIGJ1ZmZlciBjbGFzcy4KLSAqCi0gKiAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGJhc2ljX2ZpbGVidWYgZm9yIGd6aXBwZWQgZmlsZXMuIEl0IGRvZXNuJ3QgeWV0IHN1cHBvcnQKLSAqICBzZWVraW5nIChhbGxvd2VkIGJ5IHpsaWIgYnV0IHNsb3cvbGltaXRlZCksIHB1dGJhY2sgYW5kIHJlYWQvd3JpdGUgYWNjZXNzCi0gKiAgKHRyaWNreSkuIE90aGVyd2lzZSwgaXQgYXR0ZW1wdHMgdG8gYmUgYSBkcm9wLWluIHJlcGxhY2VtZW50IGZvciB0aGUgc3RhbmRhcmQKLSAqICBmaWxlIHN0cmVhbWJ1Zi4KLSovCi1jbGFzcyBnemZpbGVidWYgOiBwdWJsaWMgc3RkOjpzdHJlYW1idWYKLXsKLXB1YmxpYzoKLSAgLy8gIERlZmF1bHQgY29uc3RydWN0b3IuCi0gIGd6ZmlsZWJ1ZigpOwotCi0gIC8vICBEZXN0cnVjdG9yLgotICB2aXJ0dWFsCi0gIH5nemZpbGVidWYoKTsKLQotICAvKioKLSAgICogIEBicmllZiAgU2V0IGNvbXByZXNzaW9uIGxldmVsIGFuZCBzdHJhdGVneSBvbiB0aGUgZmx5LgotICAgKiAgQHBhcmFtICBjb21wX2xldmVsICBDb21wcmVzc2lvbiBsZXZlbCAoc2VlIHpsaWIuaCBmb3IgYWxsb3dlZCB2YWx1ZXMpCi0gICAqICBAcGFyYW0gIGNvbXBfc3RyYXRlZ3kgIENvbXByZXNzaW9uIHN0cmF0ZWd5IChzZWUgemxpYi5oIGZvciBhbGxvd2VkIHZhbHVlcykKLSAgICogIEByZXR1cm4gIFpfT0sgb24gc3VjY2VzcywgWl9TVFJFQU1fRVJST1Igb3RoZXJ3aXNlLgotICAgKgotICAgKiAgVW5mb3J0dW5hdGVseSwgdGhlc2UgcGFyYW1ldGVycyBjYW5ub3QgYmUgbW9kaWZpZWQgc2VwYXJhdGVseSwgYXMgdGhlCi0gICAqICBwcmV2aW91cyB6ZnN0cmVhbSB2ZXJzaW9uIGFzc3VtZWQuIFNpbmNlIHRoZSBzdHJhdGVneSBpcyBzZWxkb20gY2hhbmdlZCwKLSAgICogIGl0IGNhbiBkZWZhdWx0IGFuZCBzZXRjb21wcmVzc2lvbihsZXZlbCkgdGhlbiBiZWNvbWVzIGxpa2UgdGhlIG9sZAotICAgKiAgc2V0Y29tcHJlc3Npb25sZXZlbChsZXZlbCkuCi0gICovCi0gIGludAotICBzZXRjb21wcmVzc2lvbihpbnQgY29tcF9sZXZlbCwKLSAgICAgICAgICAgICAgICAgaW50IGNvbXBfc3RyYXRlZ3kgPSBaX0RFRkFVTFRfU1RSQVRFR1kpOwotCi0gIC8qKgotICAgKiAgQGJyaWVmICBDaGVjayBpZiBmaWxlIGlzIG9wZW4uCi0gICAqICBAcmV0dXJuICBUcnVlIGlmIGZpbGUgaXMgb3Blbi4KLSAgKi8KLSAgYm9vbAotICBpc19vcGVuKCkgY29uc3QgeyByZXR1cm4gKGZpbGUgIT0gTlVMTCk7IH0KLQotICAvKioKLSAgICogIEBicmllZiAgT3BlbiBnemlwcGVkIGZpbGUuCi0gICAqICBAcGFyYW0gIG5hbWUgIEZpbGUgbmFtZS4KLSAgICogIEBwYXJhbSAgbW9kZSAgT3BlbiBtb2RlIGZsYWdzLgotICAgKiAgQHJldHVybiAgQGMgdGhpcyBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCi0gICovCi0gIGd6ZmlsZWJ1ZioKLSAgb3Blbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUpOwotCi0gIC8qKgotICAgKiAgQGJyaWVmICBBdHRhY2ggdG8gYWxyZWFkeSBvcGVuIGd6aXBwZWQgZmlsZS4KLSAgICogIEBwYXJhbSAgZmQgIEZpbGUgZGVzY3JpcHRvci4KLSAgICogIEBwYXJhbSAgbW9kZSAgT3BlbiBtb2RlIGZsYWdzLgotICAgKiAgQHJldHVybiAgQGMgdGhpcyBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCi0gICovCi0gIGd6ZmlsZWJ1ZioKLSAgYXR0YWNoKGludCBmZCwKLSAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUpOwotCi0gIC8qKgotICAgKiAgQGJyaWVmICBDbG9zZSBnemlwcGVkIGZpbGUuCi0gICAqICBAcmV0dXJuICBAYyB0aGlzIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4KLSAgKi8KLSAgZ3pmaWxlYnVmKgotICBjbG9zZSgpOwotCi1wcm90ZWN0ZWQ6Ci0gIC8qKgotICAgKiAgQGJyaWVmICBDb252ZXJ0IGlvcyBvcGVuIG1vZGUgaW50IHRvIG1vZGUgc3RyaW5nIHVzZWQgYnkgemxpYi4KLSAgICogIEByZXR1cm4gIFRydWUgaWYgdmFsaWQgbW9kZSBmbGFnIGNvbWJpbmF0aW9uLgotICAqLwotICBib29sCi0gIG9wZW5fbW9kZShzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlLAotICAgICAgICAgICAgY2hhciogY19tb2RlKSBjb25zdDsKLQotICAvKioKLSAgICogIEBicmllZiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgYXZhaWxhYmxlIGluIHN0cmVhbSBidWZmZXIuCi0gICAqICBAcmV0dXJuICBOdW1iZXIgb2YgY2hhcmFjdGVycy4KLSAgICoKLSAgICogIFRoaXMgaW5kaWNhdGVzIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGdldCBhcmVhIG9mIHN0cmVhbSBidWZmZXIuCi0gICAqICBUaGVzZSBjaGFyYWN0ZXJzIGNhbiBiZSByZWFkIHdpdGhvdXQgYWNjZXNzaW5nIHRoZSBnemlwcGVkIGZpbGUuCi0gICovCi0gIHZpcnR1YWwgc3RkOjpzdHJlYW1zaXplCi0gIHNob3dtYW55YygpOwotCi0gIC8qKgotICAgKiAgQGJyaWVmICBGaWxsIGdldCBhcmVhIGZyb20gZ3ppcHBlZCBmaWxlLgotICAgKiAgQHJldHVybiAgRmlyc3QgY2hhcmFjdGVyIGluIGdldCBhcmVhIG9uIHN1Y2Nlc3MsIEVPRiBvbiBlcnJvci4KLSAgICoKLSAgICogIFRoaXMgYWN0dWFsbHkgcmVhZHMgY2hhcmFjdGVycyBmcm9tIGd6aXBwZWQgZmlsZSB0byBzdHJlYW0KLSAgICogIGJ1ZmZlci4gQWx3YXlzIGJ1ZmZlcmVkLgotICAqLwotICB2aXJ0dWFsIGludF90eXBlCi0gIHVuZGVyZmxvdygpOwotCi0gIC8qKgotICAgKiAgQGJyaWVmICBXcml0ZSBwdXQgYXJlYSB0byBnemlwcGVkIGZpbGUuCi0gICAqICBAcGFyYW0gIGMgIEV4dHJhIGNoYXJhY3RlciB0byBhZGQgdG8gYnVmZmVyIGNvbnRlbnRzLgotICAgKiAgQHJldHVybiAgTm9uLUVPRiBvbiBzdWNjZXNzLCBFT0Ygb24gZXJyb3IuCi0gICAqCi0gICAqICBUaGlzIGFjdHVhbGx5IHdyaXRlcyBjaGFyYWN0ZXJzIGluIHN0cmVhbSBidWZmZXIgdG8KLSAgICogIGd6aXBwZWQgZmlsZS4gV2l0aCB1bmJ1ZmZlcmVkIG91dHB1dCB0aGlzIGlzIGRvbmUgb25lCi0gICAqICBjaGFyYWN0ZXIgYXQgYSB0aW1lLgotICAqLwotICB2aXJ0dWFsIGludF90eXBlCi0gIG92ZXJmbG93KGludF90eXBlIGMgPSB0cmFpdHNfdHlwZTo6ZW9mKCkpOwotCi0gIC8qKgotICAgKiAgQGJyaWVmICBJbnN0YWxscyBleHRlcm5hbCBzdHJlYW0gYnVmZmVyLgotICAgKiAgQHBhcmFtICBwICBQb2ludGVyIHRvIGNoYXIgYnVmZmVyLgotICAgKiAgQHBhcmFtICBuICBTaXplIG9mIGV4dGVybmFsIGJ1ZmZlci4KLSAgICogIEByZXR1cm4gIEBjIHRoaXMgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgotICAgKgotICAgKiAgQ2FsbCBzZXRidWYoMCwwKSB0byBlbmFibGUgdW5idWZmZXJlZCBvdXRwdXQuCi0gICovCi0gIHZpcnR1YWwgc3RkOjpzdHJlYW1idWYqCi0gIHNldGJ1ZihjaGFyX3R5cGUqIHAsCi0gICAgICAgICBzdGQ6OnN0cmVhbXNpemUgbik7Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIEZsdXNoIHN0cmVhbSBidWZmZXIgdG8gZmlsZS4KLSAgICogIEByZXR1cm4gIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IuCi0gICAqCi0gICAqICBUaGlzIGNhbGxzIHVuZGVyZmxvdyhFT0YpIHRvIGRvIHRoZSBqb2IuCi0gICovCi0gIHZpcnR1YWwgaW50Ci0gIHN5bmMoKTsKLQotLy8KLS8vIFNvbWUgZnV0dXJlIGVuaGFuY2VtZW50cwotLy8KLS8vICB2aXJ0dWFsIGludF90eXBlIHVmbG93KCk7Ci0vLyAgdmlydHVhbCBpbnRfdHlwZSBwYmFja2ZhaWwoaW50X3R5cGUgYyA9IHRyYWl0c190eXBlOjplb2YoKSk7Ci0vLyAgdmlydHVhbCBwb3NfdHlwZQotLy8gIHNlZWtvZmYob2ZmX3R5cGUgb2ZmLAotLy8gICAgICAgICAgc3RkOjppb3NfYmFzZTo6c2Vla2RpciB3YXksCi0vLyAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gc3RkOjppb3NfYmFzZTo6aW58c3RkOjppb3NfYmFzZTo6b3V0KTsKLS8vICB2aXJ0dWFsIHBvc190eXBlCi0vLyAgc2Vla3Bvcyhwb3NfdHlwZSBzcCwKLS8vICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBzdGQ6Omlvc19iYXNlOjppbnxzdGQ6Omlvc19iYXNlOjpvdXQpOwotCi1wcml2YXRlOgotICAvKioKLSAgICogIEBicmllZiAgQWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVyLgotICAgKgotICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBzYWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMuIEl0IHdpbGwgZW5zdXJlCi0gICAqICB0aGF0IGEgcHJvcGVyIGludGVybmFsIGJ1ZmZlciBleGlzdHMgaWYgaXQgaXMgcmVxdWlyZWQuIElmIHRoZQotICAgKiAgYnVmZmVyIGFscmVhZHkgZXhpc3RzIG9yIGlzIGV4dGVybmFsLCB0aGUgYnVmZmVyIHBvaW50ZXJzIHdpbGwgYmUKLSAgICogIHJlc2V0IHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlLgotICAqLwotICB2b2lkCi0gIGVuYWJsZV9idWZmZXIoKTsKLQotICAvKioKLSAgICogIEBicmllZiAgRGVzdHJveSBpbnRlcm5hbCBidWZmZXIuCi0gICAqCi0gICAqICBUaGlzIGZ1bmN0aW9uIGlzIHNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gSXQgd2lsbCBlbnN1cmUKLSAgICogIHRoYXQgdGhlIGludGVybmFsIGJ1ZmZlciBpcyBkZWFsbG9jYXRlZCBpZiBpdCBleGlzdHMuIEluIGFueQotICAgKiAgY2FzZSwgaXQgd2lsbCBhbHNvIHJlc2V0IHRoZSBidWZmZXIgcG9pbnRlcnMuCi0gICovCi0gIHZvaWQKLSAgZGlzYWJsZV9idWZmZXIoKTsKLQotICAvKioKLSAgICogIFVuZGVybHlpbmcgZmlsZSBwb2ludGVyLgotICAqLwotICBnekZpbGUgZmlsZTsKLQotICAvKioKLSAgICogIE1vZGUgaW4gd2hpY2ggZmlsZSB3YXMgb3BlbmVkLgotICAqLwotICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBpb19tb2RlOwotCi0gIC8qKgotICAgKiAgQGJyaWVmICBUcnVlIGlmIHRoaXMgb2JqZWN0IG93bnMgZmlsZSBkZXNjcmlwdG9yLgotICAgKgotICAgKiAgVGhpcyBtYWtlcyB0aGUgY2xhc3MgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgdGhlIGZpbGUKLSAgICogIHVwb24gZGVzdHJ1Y3Rpb24uCi0gICovCi0gIGJvb2wgb3duX2ZkOwotCi0gIC8qKgotICAgKiAgQGJyaWVmICBTdHJlYW0gYnVmZmVyLgotICAgKgotICAgKiAgRm9yIHNpbXBsaWNpdHkgdGhpcyByZW1haW5zIGFsbG9jYXRlZCBvbiB0aGUgZnJlZSBzdG9yZSBmb3IgdGhlCi0gICAqICBlbnRpcmUgbGlmZSBzcGFuIG9mIHRoZSBnemZpbGVidWYgb2JqZWN0LCB1bmxlc3MgcmVwbGFjZWQgYnkgc2V0YnVmLgotICAqLwotICBjaGFyX3R5cGUqIGJ1ZmZlcjsKLQotICAvKioKLSAgICogIEBicmllZiAgU3RyZWFtIGJ1ZmZlciBzaXplLgotICAgKgotICAgKiAgRGVmYXVsdHMgdG8gc3lzdGVtIGRlZmF1bHQgYnVmZmVyIHNpemUgKHR5cGljYWxseSA4MTkyIGJ5dGVzKS4KLSAgICogIE1vZGlmaWVkIGJ5IHNldGJ1Zi4KLSAgKi8KLSAgc3RkOjpzdHJlYW1zaXplIGJ1ZmZlcl9zaXplOwotCi0gIC8qKgotICAgKiAgQGJyaWVmICBUcnVlIGlmIHRoaXMgb2JqZWN0IG93bnMgc3RyZWFtIGJ1ZmZlci4KLSAgICoKLSAgICogIFRoaXMgbWFrZXMgdGhlIGNsYXNzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgYnVmZmVyCi0gICAqICB1cG9uIGRlc3RydWN0aW9uLgotICAqLwotICBib29sIG93bl9idWZmZXI7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogIEBicmllZiAgR3ppcHBlZCBmaWxlIGlucHV0IHN0cmVhbSBjbGFzcy4KLSAqCi0gKiAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGlmc3RyZWFtIGZvciBnemlwcGVkIGZpbGVzLiBTZWVraW5nIGFuZCBwdXRiYWNrCi0gKiAgaXMgbm90IHN1cHBvcnRlZCB5ZXQuCi0qLwotY2xhc3MgZ3ppZnN0cmVhbSA6IHB1YmxpYyBzdGQ6OmlzdHJlYW0KLXsKLXB1YmxpYzoKLSAgLy8gIERlZmF1bHQgY29uc3RydWN0b3IKLSAgZ3ppZnN0cmVhbSgpOwotCi0gIC8qKgotICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyZWFtIG9uIGd6aXBwZWQgZmlsZSB0byBiZSBvcGVuZWQuCi0gICAqICBAcGFyYW0gIG5hbWUgIEZpbGUgbmFtZS4KLSAgICogIEBwYXJhbSAgbW9kZSAgT3BlbiBtb2RlIGZsYWdzIChmb3JjZWQgdG8gY29udGFpbiBpb3M6OmluKS4KLSAgKi8KLSAgZXhwbGljaXQKLSAgZ3ppZnN0cmVhbShjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBzdGQ6Omlvc19iYXNlOjppbik7Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJlYW0gb24gYWxyZWFkeSBvcGVuIGd6aXBwZWQgZmlsZS4KLSAgICogIEBwYXJhbSAgZmQgICAgRmlsZSBkZXNjcmlwdG9yLgotICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MgKGZvcmNlZCB0byBjb250YWluIGlvczo6aW4pLgotICAqLwotICBleHBsaWNpdAotICBnemlmc3RyZWFtKGludCBmZCwKLSAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gc3RkOjppb3NfYmFzZTo6aW4pOwotCi0gIC8qKgotICAgKiAgT2J0YWluIHVuZGVybHlpbmcgc3RyZWFtIGJ1ZmZlci4KLSAgKi8KLSAgZ3pmaWxlYnVmKgotICByZGJ1ZigpIGNvbnN0Ci0gIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8Z3pmaWxlYnVmKj4oJnNiKTsgfQotCi0gIC8qKgotICAgKiAgQGJyaWVmICBDaGVjayBpZiBmaWxlIGlzIG9wZW4uCi0gICAqICBAcmV0dXJuICBUcnVlIGlmIGZpbGUgaXMgb3Blbi4KLSAgKi8KLSAgYm9vbAotICBpc19vcGVuKCkgeyByZXR1cm4gc2IuaXNfb3BlbigpOyB9Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIE9wZW4gZ3ppcHBlZCBmaWxlLgotICAgKiAgQHBhcmFtICBuYW1lICBGaWxlIG5hbWUuCi0gICAqICBAcGFyYW0gIG1vZGUgIE9wZW4gbW9kZSBmbGFncyAoZm9yY2VkIHRvIGNvbnRhaW4gaW9zOjppbikuCi0gICAqCi0gICAqICBTdHJlYW0gd2lsbCBiZSBpbiBzdGF0ZSBnb29kKCkgaWYgZmlsZSBvcGVucyBzdWNjZXNzZnVsbHk7Ci0gICAqICBvdGhlcndpc2UgaW4gc3RhdGUgZmFpbCgpLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgYmVoYXZpb3Igb2YKLSAgICogIGlmc3RyZWFtLCB3aGljaCBuZXZlciBzZXRzIHRoZSBzdGF0ZSB0byBnb29kKCkgYW5kIHRoZXJlZm9yZQotICAgKiAgd29uJ3QgYWxsb3cgeW91IHRvIHJldXNlIHRoZSBzdHJlYW0gZm9yIGEgc2Vjb25kIGZpbGUgdW5sZXNzCi0gICAqICB5b3UgbWFudWFsbHkgY2xlYXIoKSB0aGUgc3RhdGUuIFRoZSBjaG9pY2UgaXMgYSBtYXR0ZXIgb2YKLSAgICogIGNvbnZlbmllbmNlLgotICAqLwotICB2b2lkCi0gIG9wZW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gc3RkOjppb3NfYmFzZTo6aW4pOwotCi0gIC8qKgotICAgKiAgQGJyaWVmICBBdHRhY2ggdG8gYWxyZWFkeSBvcGVuIGd6aXBwZWQgZmlsZS4KLSAgICogIEBwYXJhbSAgZmQgIEZpbGUgZGVzY3JpcHRvci4KLSAgICogIEBwYXJhbSAgbW9kZSAgT3BlbiBtb2RlIGZsYWdzIChmb3JjZWQgdG8gY29udGFpbiBpb3M6OmluKS4KLSAgICoKLSAgICogIFN0cmVhbSB3aWxsIGJlIGluIHN0YXRlIGdvb2QoKSBpZiBhdHRhY2ggc3VjY2VlZGVkOyBvdGhlcndpc2UKLSAgICogIGluIHN0YXRlIGZhaWwoKS4KLSAgKi8KLSAgdm9pZAotICBhdHRhY2goaW50IGZkLAotICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IHN0ZDo6aW9zX2Jhc2U6OmluKTsKLQotICAvKioKLSAgICogIEBicmllZiAgQ2xvc2UgZ3ppcHBlZCBmaWxlLgotICAgKgotICAgKiAgU3RyZWFtIHdpbGwgYmUgaW4gc3RhdGUgZmFpbCgpIGlmIGNsb3NlIGZhaWxlZC4KLSAgKi8KLSAgdm9pZAotICBjbG9zZSgpOwotCi1wcml2YXRlOgotICAvKioKLSAgICogIFVuZGVybHlpbmcgc3RyZWFtIGJ1ZmZlci4KLSAgKi8KLSAgZ3pmaWxlYnVmIHNiOwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqICBAYnJpZWYgIEd6aXBwZWQgZmlsZSBvdXRwdXQgc3RyZWFtIGNsYXNzLgotICoKLSAqICBUaGlzIGNsYXNzIGltcGxlbWVudHMgb2ZzdHJlYW0gZm9yIGd6aXBwZWQgZmlsZXMuIFNlZWtpbmcgYW5kIHB1dGJhY2sKLSAqICBpcyBub3Qgc3VwcG9ydGVkIHlldC4KLSovCi1jbGFzcyBnem9mc3RyZWFtIDogcHVibGljIHN0ZDo6b3N0cmVhbQotewotcHVibGljOgotICAvLyAgRGVmYXVsdCBjb25zdHJ1Y3RvcgotICBnem9mc3RyZWFtKCk7Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJlYW0gb24gZ3ppcHBlZCBmaWxlIHRvIGJlIG9wZW5lZC4KLSAgICogIEBwYXJhbSAgbmFtZSAgRmlsZSBuYW1lLgotICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MgKGZvcmNlZCB0byBjb250YWluIGlvczo6b3V0KS4KLSAgKi8KLSAgZXhwbGljaXQKLSAgZ3pvZnN0cmVhbShjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBzdGQ6Omlvc19iYXNlOjpvdXQpOwotCi0gIC8qKgotICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyZWFtIG9uIGFscmVhZHkgb3BlbiBnemlwcGVkIGZpbGUuCi0gICAqICBAcGFyYW0gIGZkICAgIEZpbGUgZGVzY3JpcHRvci4KLSAgICogIEBwYXJhbSAgbW9kZSAgT3BlbiBtb2RlIGZsYWdzIChmb3JjZWQgdG8gY29udGFpbiBpb3M6Om91dCkuCi0gICovCi0gIGV4cGxpY2l0Ci0gIGd6b2ZzdHJlYW0oaW50IGZkLAotICAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBzdGQ6Omlvc19iYXNlOjpvdXQpOwotCi0gIC8qKgotICAgKiAgT2J0YWluIHVuZGVybHlpbmcgc3RyZWFtIGJ1ZmZlci4KLSAgKi8KLSAgZ3pmaWxlYnVmKgotICByZGJ1ZigpIGNvbnN0Ci0gIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8Z3pmaWxlYnVmKj4oJnNiKTsgfQotCi0gIC8qKgotICAgKiAgQGJyaWVmICBDaGVjayBpZiBmaWxlIGlzIG9wZW4uCi0gICAqICBAcmV0dXJuICBUcnVlIGlmIGZpbGUgaXMgb3Blbi4KLSAgKi8KLSAgYm9vbAotICBpc19vcGVuKCkgeyByZXR1cm4gc2IuaXNfb3BlbigpOyB9Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIE9wZW4gZ3ppcHBlZCBmaWxlLgotICAgKiAgQHBhcmFtICBuYW1lICBGaWxlIG5hbWUuCi0gICAqICBAcGFyYW0gIG1vZGUgIE9wZW4gbW9kZSBmbGFncyAoZm9yY2VkIHRvIGNvbnRhaW4gaW9zOjpvdXQpLgotICAgKgotICAgKiAgU3RyZWFtIHdpbGwgYmUgaW4gc3RhdGUgZ29vZCgpIGlmIGZpbGUgb3BlbnMgc3VjY2Vzc2Z1bGx5OwotICAgKiAgb3RoZXJ3aXNlIGluIHN0YXRlIGZhaWwoKS4gVGhpcyBkaWZmZXJzIGZyb20gdGhlIGJlaGF2aW9yIG9mCi0gICAqICBvZnN0cmVhbSwgd2hpY2ggbmV2ZXIgc2V0cyB0aGUgc3RhdGUgdG8gZ29vZCgpIGFuZCB0aGVyZWZvcmUKLSAgICogIHdvbid0IGFsbG93IHlvdSB0byByZXVzZSB0aGUgc3RyZWFtIGZvciBhIHNlY29uZCBmaWxlIHVubGVzcwotICAgKiAgeW91IG1hbnVhbGx5IGNsZWFyKCkgdGhlIHN0YXRlLiBUaGUgY2hvaWNlIGlzIGEgbWF0dGVyIG9mCi0gICAqICBjb252ZW5pZW5jZS4KLSAgKi8KLSAgdm9pZAotICBvcGVuKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IHN0ZDo6aW9zX2Jhc2U6Om91dCk7Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIEF0dGFjaCB0byBhbHJlYWR5IG9wZW4gZ3ppcHBlZCBmaWxlLgotICAgKiAgQHBhcmFtICBmZCAgRmlsZSBkZXNjcmlwdG9yLgotICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MgKGZvcmNlZCB0byBjb250YWluIGlvczo6b3V0KS4KLSAgICoKLSAgICogIFN0cmVhbSB3aWxsIGJlIGluIHN0YXRlIGdvb2QoKSBpZiBhdHRhY2ggc3VjY2VlZGVkOyBvdGhlcndpc2UKLSAgICogIGluIHN0YXRlIGZhaWwoKS4KLSAgKi8KLSAgdm9pZAotICBhdHRhY2goaW50IGZkLAotICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IHN0ZDo6aW9zX2Jhc2U6Om91dCk7Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIENsb3NlIGd6aXBwZWQgZmlsZS4KLSAgICoKLSAgICogIFN0cmVhbSB3aWxsIGJlIGluIHN0YXRlIGZhaWwoKSBpZiBjbG9zZSBmYWlsZWQuCi0gICovCi0gIHZvaWQKLSAgY2xvc2UoKTsKLQotcHJpdmF0ZToKLSAgLyoqCi0gICAqICBVbmRlcmx5aW5nIHN0cmVhbSBidWZmZXIuCi0gICovCi0gIGd6ZmlsZWJ1ZiBzYjsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiAgQGJyaWVmICBHemlwcGVkIGZpbGUgb3V0cHV0IHN0cmVhbSBtYW5pcHVsYXRvciBjbGFzcy4KLSAqCi0gKiAgVGhpcyBjbGFzcyBkZWZpbmVzIGEgdHdvLWFyZ3VtZW50IG1hbmlwdWxhdG9yIGZvciBnem9mc3RyZWFtLiBJdCBpcyB1c2VkCi0gKiAgYXMgYmFzZSBmb3IgdGhlIHNldGNvbXByZXNzaW9uKGludCxpbnQpIG1hbmlwdWxhdG9yLgotKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLSAgY2xhc3MgZ3pvbWFuaXAyCi0gIHsKLSAgcHVibGljOgotICAgIC8vIEFsbG93cyBpbnNlcnRvciB0byBwZWVrIGF0IGludGVybmFscwotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUYSwgdHlwZW5hbWUgVGI+Ci0gICAgICBmcmllbmQgZ3pvZnN0cmVhbSYKLSAgICAgIG9wZXJhdG9yPDwoZ3pvZnN0cmVhbSYsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGd6b21hbmlwMjxUYSxUYj4mKTsKLQotICAgIC8vIENvbnN0cnVjdG9yCi0gICAgZ3pvbWFuaXAyKGd6b2ZzdHJlYW0mICgqZikoZ3pvZnN0cmVhbSYsIFQxLCBUMiksCi0gICAgICAgICAgICAgIFQxIHYxLAotICAgICAgICAgICAgICBUMiB2Mik7Ci0gIHByaXZhdGU6Ci0gICAgLy8gVW5kZXJseWluZyBtYW5pcHVsYXRvciBmdW5jdGlvbgotICAgIGd6b2ZzdHJlYW0mCi0gICAgKCpmdW5jKShnem9mc3RyZWFtJiwgVDEsIFQyKTsKLQotICAgIC8vIEFyZ3VtZW50cyBmb3IgbWFuaXB1bGF0b3IgZnVuY3Rpb24KLSAgICBUMSB2YWwxOwotICAgIFQyIHZhbDI7Ci0gIH07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLy8gTWFuaXB1bGF0b3IgZnVuY3Rpb24gdGh1bmtzIHRocm91Z2ggdG8gc3RyZWFtIGJ1ZmZlcgotaW5saW5lIGd6b2ZzdHJlYW0mCi1zZXRjb21wcmVzc2lvbihnem9mc3RyZWFtICZnenMsIGludCBsLCBpbnQgcyA9IFpfREVGQVVMVF9TVFJBVEVHWSkKLXsKLSAgKGd6cy5yZGJ1ZigpKS0+c2V0Y29tcHJlc3Npb24obCwgcyk7Ci0gIHJldHVybiBnenM7Ci19Ci0KLS8vIE1hbmlwdWxhdG9yIGNvbnN0cnVjdG9yIHN0b3JlcyBhcmd1bWVudHMKLXRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLSAgaW5saW5lCi0gIGd6b21hbmlwMjxUMSxUMj46Omd6b21hbmlwMihnem9mc3RyZWFtICYoKmYpKGd6b2ZzdHJlYW0gJiwgVDEsIFQyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxIHYxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDIgdjIpCi0gIDogZnVuYyhmKSwgdmFsMSh2MSksIHZhbDIodjIpCi0gIHsgfQotCi0vLyBJbnNlcnRvciBhcHBsaWVzIHVuZGVybHlpbmcgbWFuaXB1bGF0b3IgZnVuY3Rpb24gdG8gc3RyZWFtCi10ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci0gIGlubGluZSBnem9mc3RyZWFtJgotICBvcGVyYXRvcjw8KGd6b2ZzdHJlYW0mIHMsIGNvbnN0IGd6b21hbmlwMjxUMSxUMj4mIG0pCi0gIHsgcmV0dXJuICgqbS5mdW5jKShzLCBtLnZhbDEsIG0udmFsMik7IH0KLQotLy8gSW5zZXJ0IHRoaXMgb250byBzdHJlYW0gdG8gc2ltcGxpZnkgc2V0dGluZyBvZiBjb21wcmVzc2lvbiBsZXZlbAotaW5saW5lIGd6b21hbmlwMjxpbnQsaW50Pgotc2V0Y29tcHJlc3Npb24oaW50IGwsIGludCBzID0gWl9ERUZBVUxUX1NUUkFURUdZKQoteyByZXR1cm4gZ3pvbWFuaXAyPGludCxpbnQ+KCZzZXRjb21wcmVzc2lvbiwgbCwgcyk7IH0KLQotI2VuZGlmIC8vIFpGU1RSRUFNX0gKZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvbWFzbXg2NC9ibGRfbWw2NC5iYXQgYi9zcmMvemxpYi9jb250cmliL21hc214NjQvYmxkX21sNjQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjkzNDNkLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvbWFzbXg2NC9ibGRfbWw2NC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLW1sNjQuZXhlIC9GbGluZmZhc3g2NCAvYyAvWmkgaW5mZmFzeDY0LmFzbQ0KLW1sNjQuZXhlIC9GbGd2bWF0NjQgICAvYyAvWmkgZ3ZtYXQ2NC5hc20NCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL21hc214NjQvZ3ZtYXQ2NC5hc20gYi9zcmMvemxpYi9jb250cmliL21hc214NjQvZ3ZtYXQ2NC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NzljMjguLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9tYXNteDY0L2d2bWF0NjQuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNTUzICswLDAgQEAKLTt1SW50IGxvbmdlc3RfbWF0Y2hfeDY0KA0KLTsgICAgZGVmbGF0ZV9zdGF0ZSAqcywNCi07ICAgIElQb3MgY3VyX21hdGNoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8NCi0NCi07IGd2bWF0NjQuYXNtIC0tIEFzbSBwb3J0aW9uIG9mIHRoZSBvcHRpbWl6ZWQgbG9uZ2VzdF9tYXRjaCBmb3IgMzIgYml0cyB4ODZfNjQNCi07ICAoQU1ENjQgb24gQXRobG9uIDY0LCBPcHRlcm9uLCBQaGVub20NCi07ICAgICBhbmQgSW50ZWwgRU02NFQgb24gUGVudGl1bSA0IHdpdGggRU02NFQsIFBlbnRpdW0gRCwgQ29yZSAyIER1bywgQ29yZSBJNS9JNykNCi07IENvcHlyaWdodCAoQykgMTk5NS0yMDEwIEplYW4tbG91cCBHYWlsbHksIEJyaWFuIFJhaXRlciBhbmQgR2lsbGVzIFZvbGxhbnQuDQotOw0KLTsgRmlsZSB3cml0dGVuIGJ5IEdpbGxlcyBWb2xsYW50LCBieSBjb252ZXJ0aW5nIHRvIGFzc2VtYmx5IHRoZSBsb25nZXN0X21hdGNoDQotOyAgZnJvbSBKZWFuLWxvdXAgR2FpbGx5IGluIGRlZmxhdGUuYyBvZiB6TGliIGFuZCBpbmZvWmlwIHppcC4NCi07DQotOyAgYW5kIGJ5IHRha2luZyBpbnNwaXJhdGlvbiBvbiBhc202ODYgd2l0aCBtYXNtLCBvcHRpbWlzZWQgYXNzZW1ibHkgY29kZQ0KLTsgICAgICAgIGZyb20gQnJpYW4gUmFpdGVyLCB3cml0dGVuIDE5OTgNCi07DQotOyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQNCi07ICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzDQotOyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4NCi07DQotOyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsDQotOyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdA0KLTsgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoNCi07DQotOyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QNCi07ICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQ0KLTsgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQ0KLTsgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuDQotOyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUNCi07ICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUNCi07ICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLg0KLTsNCi07DQotOw0KLTsgICAgICAgICBodHRwOi8vd3d3LnpsaWIubmV0DQotOyAgICAgICAgIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwNCi07ICAgICAgICAgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbA0KLTsNCi07IHRvIGNvbXBpbGUgdGhpcyBmaWxlIGZvciBpbmZvemlwIFppcCwgSSB1c2Ugb3B0aW9uOg0KLTsgICBtbDY0LmV4ZSAvRmxndm1hdDY0IC9jIC9aaSAvRElORk9aSVAgZ3ZtYXQ2NC5hc20NCi07DQotOyB0byBjb21waWxlIHRoaXMgZmlsZSBmb3IgekxpYiwgSSB1c2Ugb3B0aW9uOg0KLTsgICBtbDY0LmV4ZSAvRmxndm1hdDY0IC9jIC9aaSBndm1hdDY0LmFzbQ0KLTsgQmUgY2FycmVmdWxsIHRvIGFkYXB0IHpsaWIxMjIyYWRkIGJlbG93IHRvIHlvdXIgdmVyc2lvbiBvZiB6TGliDQotOyAgIChpZiB5b3UgdXNlIGEgdmVyc2lvbiBvZiB6TGliIGJlZm9yZSAxLjAuNCBvciBhZnRlciAxLjIuMi4yLCBjaGFuZ2UNCi07ICAgIHZhbHVlIG9mIHpsaWIxMjIyYWRkIGxhdGVyKQ0KLTsNCi07IFRoaXMgZmlsZSBjb21waWxlIHdpdGggTWljcm9zb2Z0IE1hY3JvIEFzc2VtYmxlciAoeDY0KSBmb3IgQU1ENjQNCi07DQotOyAgIG1sNjQuZXhlIGlzIGdpdmVuIHdpdGggVmlzdWFsIFN0dWRpbyAyMDA1LzIwMDgvMjAxMCBhbmQgV2luZG93cyBXREsNCi07DQotOyAgICh5b3UgY2FuIGdldCBXaW5kb3dzIFdESyB3aXRoIG1sNjQgZm9yIEFNRDY0IGZyb20NCi07ICAgICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3doZGMvRGV2dG9vbHMvd2RrL2RlZmF1bHQubXNweCBmb3IgbG93IHByaWNlKQ0KLTsNCi0NCi0NCi07dUludCBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkNCi07ICAgIGRlZmxhdGVfc3RhdGUgKnM7DQotOyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8NCi0uY29kZQ0KLWxvbmdlc3RfbWF0Y2ggUFJPQw0KLQ0KLQ0KLTtMb2NhbFZhcnNTaXplICAgZXF1IDg4DQotIExvY2FsVmFyc1NpemUgICBlcXUgNzINCi0NCi07IHJlZ2lzdGVyIHVzZWQgOiByYXgscmJ4LHJjeCxyZHgscnNpLHJkaSxyOCxyOSxyMTAscjExLHIxMg0KLTsgZnJlZSByZWdpc3RlciA6ICByMTQscjE1DQotOyByZWdpc3RlciBjYW4gYmUgc2F2ZWQgOiByc3ANCi0NCi0gY2hhaW5sZW53bWFzayAgIGVxdSAgcnNwICsgOCAtIExvY2FsVmFyc1NpemUgICAgOyBoaWdoIHdvcmQ6IGN1cnJlbnQgY2hhaW4gbGVuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbG93IHdvcmQ6IHMtPndtYXNrDQotO3dpbmRvdyAgICAgICAgICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgbG9jYWwgY29weSBvZiBzLT53aW5kb3cgOyBzdG9yZWQgaW4gcjEwDQotO3dpbmRvd2Jlc3RsZW4gICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgcy0+d2luZG93ICsgYmVzdGxlbiAsIHVzZSByMTArcjExDQotO3NjYW5zdGFydCAgICAgICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgZmlyc3QgdHdvIGJ5dGVzIG9mIHN0cmluZyA7IHN0b3JlZCBpbiByMTJ3DQotO3NjYW5lbmQgICAgICAgICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgbGFzdCB0d28gYnl0ZXMgb2Ygc3RyaW5nIHVzZSBlYngNCi07c2NhbmFsaWduICAgICAgIGVxdSAgcnNwICsgeHggLSBMb2NhbFZhcnNTaXplICAgOyBkd29yZC1taXNhbGlnbm1lbnQgb2Ygc3RyaW5nIHIxMw0KLTtiZXN0bGVuICAgICAgICAgZXF1ICByc3AgKyB4eCAtIExvY2FsVmFyc1NpemUgICA7IHNpemUgb2YgYmVzdCBtYXRjaCBzbyBmYXIgLT4gcjExZA0KLTtzY2FuICAgICAgICAgICAgZXF1ICByc3AgKyB4eCAtIExvY2FsVmFyc1NpemUgICA7IHB0ciB0byBzdHJpbmcgd2FudGluZyBtYXRjaCAtPiByOQ0KLUlGREVGIElORk9aSVANCi1FTFNFDQotIG5pY2VtYXRjaCAgICAgICBlcXUgIChyc3AgKyAxNiAtIExvY2FsVmFyc1NpemUpIDsgYSBnb29kIGVub3VnaCBtYXRjaCBzaXplDQotRU5ESUYNCi0NCi1zYXZlX3JkaSAgICAgICAgZXF1ICByc3AgKyAyNCAtIExvY2FsVmFyc1NpemUNCi1zYXZlX3JzaSAgICAgICAgZXF1ICByc3AgKyAzMiAtIExvY2FsVmFyc1NpemUNCi1zYXZlX3JieCAgICAgICAgZXF1ICByc3AgKyA0MCAtIExvY2FsVmFyc1NpemUNCi1zYXZlX3JicCAgICAgICAgZXF1ICByc3AgKyA0OCAtIExvY2FsVmFyc1NpemUNCi1zYXZlX3IxMiAgICAgICAgZXF1ICByc3AgKyA1NiAtIExvY2FsVmFyc1NpemUNCi1zYXZlX3IxMyAgICAgICAgZXF1ICByc3AgKyA2NCAtIExvY2FsVmFyc1NpemUNCi07c2F2ZV9yMTQgICAgICAgIGVxdSAgcnNwICsgNzIgLSBMb2NhbFZhcnNTaXplDQotO3NhdmVfcjE1ICAgICAgICBlcXUgIHJzcCArIDgwIC0gTG9jYWxWYXJzU2l6ZQ0KLQ0KLQ0KLTsgc3VtbWFyeSBvZiByZWdpc3RlciB1c2FnZQ0KLTsgc2NhbmVuZCAgICAgZWJ4DQotOyBzY2FuZW5kdyAgICBieA0KLTsgY2hhaW5sZW53bWFzayAgIGVkeA0KLTsgY3VybWF0Y2ggICAgcnNpDQotOyBjdXJtYXRjaGQgICBlc2kNCi07IHdpbmRvd2Jlc3RsZW4gICByOA0KLTsgc2NhbmFsaWduICAgcjkNCi07IHNjYW5hbGlnbmQgIHI5ZA0KLTsgd2luZG93ICAgICAgcjEwDQotOyBiZXN0bGVuICAgICByMTENCi07IGJlc3RsZW5kICAgIHIxMWQNCi07IHNjYW5zdGFydCAgIHIxMmQNCi07IHNjYW5zdGFydHcgIHIxMncNCi07IHNjYW4gICAgICAgIHIxMw0KLTsgbmljZW1hdGNoICAgcjE0ZA0KLTsgbGltaXQgICAgICAgcjE1DQotOyBsaW1pdGQgICAgICByMTVkDQotOyBwcmV2ICAgICAgICByY3gNCi0NCi07ICBhbGwgdGhlICs0IG9mZnNldHMgYXJlIGR1ZSB0byB0aGUgYWRkaXRpb24gb2YgcGVuZGluZ19idWZfc2l6ZSAoaW4gemxpYg0KLTsgIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4NCi07ICAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMC40IG9yIG9sZGVyLCByZW1vdmUgdGhlICs0KS4NCi07ICBOb3RlIDogdGhlc2UgdmFsdWUgYXJlIGdvb2Qgd2l0aCBhIDggYnl0ZXMgYm91bmRhcnkgcGFjayBzdHJ1Y3R1cmUNCi0NCi0NCi0gICAgTUFYX01BVENIICAgICAgICAgICBlcXUgICAgIDI1OA0KLSAgICBNSU5fTUFUQ0ggICAgICAgICAgIGVxdSAgICAgMw0KLSAgICBNSU5fTE9PS0FIRUFEICAgICAgIGVxdSAgICAgKE1BWF9NQVRDSCtNSU5fTUFUQ0grMSkNCi0NCi0NCi07OzsgT2Zmc2V0cyBmb3IgZmllbGRzIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZS4gVGhlc2UgbnVtYmVycw0KLTs7OyBhcmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBkZWZpbml0aW9uIG9mIGRlZmxhdGVfc3RhdGUsIHdpdGggdGhlDQotOzs7IGFzc3VtcHRpb24gdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBkd29yZC1hbGlnbiB0aGUgZmllbGRzLiAoVGh1cywNCi07OzsgY2hhbmdpbmcgdGhlIGRlZmluaXRpb24gb2YgZGVmbGF0ZV9zdGF0ZSBjb3VsZCBlYXNpbHkgY2F1c2UgdGhpcw0KLTs7OyBwcm9ncmFtIHRvIGNyYXNoIGhvcnJpYmx5LCB3aXRob3V0IHNvIG11Y2ggYXMgYSB3YXJuaW5nIGF0DQotOzs7IGNvbXBpbGUgdGltZS4gU2lnaC4pDQotDQotOyAgYWxsIHRoZSAremxpYjEyMjJhZGQgb2Zmc2V0cyBhcmUgZHVlIHRvIHRoZSBhZGRpdGlvbiBvZiBmaWVsZHMNCi07ICBpbiB6bGliIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4NCi07ICAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMC40IG9yIG9sZGVyLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAoLTQpIikuDQotOyAgKGlmIHlvdSBjb21waWxlIHdpdGggemxpYiBiZXR3ZWVuIDEuMC41IGFuZCAxLjIuMi4xLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAwIikuDQotOyAgaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMi4yLjIgb3IgbGF0ZXIgLCB1c2UgInpsaWIxMjIyYWRkIGVxdSA4IikuDQotDQotDQotSUZERUYgSU5GT1pJUA0KLQ0KLV9EQVRBICAgU0VHTUVOVA0KLUNPTU0gICAgd2luZG93X3NpemU6RFdPUkQNCi07IFdNYXNrIDsgN2ZmZg0KLUNPTU0gICAgd2luZG93OkJZVEU6MDEwMDQwSA0KLUNPTU0gICAgcHJldjpXT1JEOjA4MDAwSA0KLTsgTWF0Y2hMZW4gOiB1bnVzZWQNCi07IFByZXZNYXRjaCA6IHVudXNlZA0KLUNPTU0gICAgc3Ryc3RhcnQ6RFdPUkQNCi1DT01NICAgIG1hdGNoX3N0YXJ0OkRXT1JEDQotOyBMb29rYWhlYWQgOiBpZ25vcmUNCi1DT01NICAgIHByZXZfbGVuZ3RoOkRXT1JEIDsgUHJldkxlbg0KLUNPTU0gICAgbWF4X2NoYWluX2xlbmd0aDpEV09SRA0KLUNPTU0gICAgZ29vZF9tYXRjaDpEV09SRA0KLUNPTU0gICAgbmljZV9tYXRjaDpEV09SRA0KLXByZXZfYWQgZXF1IE9GRlNFVCBwcmV2DQotd2luZG93X2FkIGVxdSBPRkZTRVQgd2luZG93DQotbmljZW1hdGNoIGVxdSBuaWNlX21hdGNoDQotX0RBVEEgRU5EUw0KLVdNYXNrIGVxdSAwN2ZmZmgNCi0NCi1FTFNFDQotDQotICBJRk5ERUYgemxpYjEyMjJhZGQNCi0gICAgemxpYjEyMjJhZGQgZXF1IDgNCi0gIEVORElGDQotZHNXU2l6ZSAgICAgICAgIGVxdSA1Nit6bGliMTIyMmFkZCsoemxpYjEyMjJhZGQvMikNCi1kc1dNYXNrICAgICAgICAgZXF1IDY0K3psaWIxMjIyYWRkKyh6bGliMTIyMmFkZC8yKQ0KLWRzV2luZG93ICAgICAgICBlcXUgNzIremxpYjEyMjJhZGQNCi1kc1ByZXYgICAgICAgICAgZXF1IDg4K3psaWIxMjIyYWRkDQotZHNNYXRjaExlbiAgICAgIGVxdSAxMjgremxpYjEyMjJhZGQNCi1kc1ByZXZNYXRjaCAgICAgZXF1IDEzMit6bGliMTIyMmFkZA0KLWRzU3RyU3RhcnQgICAgICBlcXUgMTQwK3psaWIxMjIyYWRkDQotZHNNYXRjaFN0YXJ0ICAgIGVxdSAxNDQremxpYjEyMjJhZGQNCi1kc0xvb2thaGVhZCAgICAgZXF1IDE0OCt6bGliMTIyMmFkZA0KLWRzUHJldkxlbiAgICAgICBlcXUgMTUyK3psaWIxMjIyYWRkDQotZHNNYXhDaGFpbkxlbiAgIGVxdSAxNTYremxpYjEyMjJhZGQNCi1kc0dvb2RNYXRjaCAgICAgZXF1IDE3Mit6bGliMTIyMmFkZA0KLWRzTmljZU1hdGNoICAgICBlcXUgMTc2K3psaWIxMjIyYWRkDQotDQotd2luZG93X3NpemUgICAgIGVxdSBbIHJjeCArIGRzV1NpemVdDQotV01hc2sgICAgICAgICAgIGVxdSBbIHJjeCArIGRzV01hc2tdDQotd2luZG93X2FkICAgICAgIGVxdSBbIHJjeCArIGRzV2luZG93XQ0KLXByZXZfYWQgICAgICAgICBlcXUgWyByY3ggKyBkc1ByZXZdDQotc3Ryc3RhcnQgICAgICAgIGVxdSBbIHJjeCArIGRzU3RyU3RhcnRdDQotbWF0Y2hfc3RhcnQgICAgIGVxdSBbIHJjeCArIGRzTWF0Y2hTdGFydF0NCi1Mb29rYWhlYWQgICAgICAgZXF1IFsgcmN4ICsgZHNMb29rYWhlYWRdIDsgMGZmZmZmZmZmaCBvbiBpbmZvemlwDQotcHJldl9sZW5ndGggICAgIGVxdSBbIHJjeCArIGRzUHJldkxlbl0NCi1tYXhfY2hhaW5fbGVuZ3RoIGVxdSBbIHJjeCArIGRzTWF4Q2hhaW5MZW5dDQotZ29vZF9tYXRjaCAgICAgIGVxdSBbIHJjeCArIGRzR29vZE1hdGNoXQ0KLW5pY2VfbWF0Y2ggICAgICBlcXUgWyByY3ggKyBkc05pY2VNYXRjaF0NCi1FTkRJRg0KLQ0KLTsgcGFyYW1ldGVyIDEgaW4gcjgoZGVmbGF0ZSBzdGF0ZSBzKSwgcGFyYW0gMiBpbiByZHggKGN1ciBtYXRjaCkNCi0NCi07IHNlZSBodHRwOi8vd2VibG9ncy5hc3AubmV0L29sZG5ld3RoaW5nL2FyY2hpdmUvMjAwNC8wMS8xNC81ODU3OS5hc3B4IGFuZA0KLTsgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL2ttYXJjaC9oaC9rbWFyY2gvNjRiaXRBTURfOGU5NTFkZDItZWU3Ny00NzI4LTg3MDItNTVjZTRiNWRkMjRhLnhtbC5hc3ANCi07DQotOyBBbGwgcmVnaXN0ZXJzIG11c3QgYmUgcHJlc2VydmVkIGFjcm9zcyB0aGUgY2FsbCwgZXhjZXB0IGZvcg0KLTsgICByYXgsIHJjeCwgcmR4LCByOCwgcjksIHIxMCwgYW5kIHIxMSwgd2hpY2ggYXJlIHNjcmF0Y2guDQotDQotDQotDQotOzs7IFNhdmUgcmVnaXN0ZXJzIHRoYXQgdGhlIGNvbXBpbGVyIG1heSBiZSB1c2luZywgYW5kIGFkanVzdCBlc3AgdG8NCi07OzsgbWFrZSByb29tIGZvciBvdXIgc3RhY2sgZnJhbWUuDQotDQotDQotOzs7IFJldHJpZXZlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMuIHI4ZCB3aWxsIGhvbGQgY3VyX21hdGNoDQotOzs7IHRocm91Z2hvdXQgdGhlIGVudGlyZSBmdW5jdGlvbi4gZWR4IHdpbGwgaG9sZCB0aGUgcG9pbnRlciB0byB0aGUNCi07OzsgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgZHVyaW5nIHRoZSBmdW5jdGlvbidzIHNldHVwIChiZWZvcmUNCi07OzsgZW50ZXJpbmcgdGhlIG1haW4gbG9vcC4NCi0NCi07IHBhcmFtZXRlciAxIGluIHJjeCAoZGVmbGF0ZV9zdGF0ZSogcyksIHBhcmFtIDIgaW4gZWR4IC0+IHI4IChjdXIgbWF0Y2gpDQotDQotOyB0aGlzIGNsZWFyIGhpZ2ggMzIgYml0cyBvZiByOCwgd2hpY2ggY2FuIGJlIGdhcmJhZ2UgaW4gYm90aCByOCBhbmQgcmR4DQotDQotICAgICAgICBtb3YgW3NhdmVfcmRpXSxyZGkNCi0gICAgICAgIG1vdiBbc2F2ZV9yc2ldLHJzaQ0KLSAgICAgICAgbW92IFtzYXZlX3JieF0scmJ4DQotICAgICAgICBtb3YgW3NhdmVfcmJwXSxyYnANCi1JRkRFRiBJTkZPWklQDQotICAgICAgICBtb3YgcjhkLGVjeA0KLUVMU0UNCi0gICAgICAgIG1vdiByOGQsZWR4DQotRU5ESUYNCi0gICAgICAgIG1vdiBbc2F2ZV9yMTJdLHIxMg0KLSAgICAgICAgbW92IFtzYXZlX3IxM10scjEzDQotOyAgICAgICAgbW92IFtzYXZlX3IxNF0scjE0DQotOyAgICAgICAgbW92IFtzYXZlX3IxNV0scjE1DQotDQotDQotOzs7IHVJbnQgd21hc2sgPSBzLT53X21hc2s7DQotOzs7IHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7DQotOzs7IGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7DQotOzs7ICAgICBjaGFpbl9sZW5ndGggPj49IDI7DQotOzs7IH0NCi0NCi0gICAgICAgIG1vdiBlZGksIHByZXZfbGVuZ3RoDQotICAgICAgICBtb3YgZXNpLCBnb29kX21hdGNoDQotICAgICAgICBtb3YgZWF4LCBXTWFzaw0KLSAgICAgICAgbW92IGVieCwgbWF4X2NoYWluX2xlbmd0aA0KLSAgICAgICAgY21wIGVkaSwgZXNpDQotICAgICAgICBqbCAgTGFzdE1hdGNoR29vZA0KLSAgICAgICAgc2hyIGVieCwgMg0KLUxhc3RNYXRjaEdvb2Q6DQotDQotOzs7IGNoYWlubGVuIGlzIGRlY3JlbWVudGVkIG9uY2UgYmVmb3JlaGFuZCBzbyB0aGF0IHRoZSBmdW5jdGlvbiBjYW4NCi07OzsgdXNlIHRoZSBzaWduIGZsYWcgaW5zdGVhZCBvZiB0aGUgemVybyBmbGFnIGZvciB0aGUgZXhpdCB0ZXN0Lg0KLTs7OyBJdCBpcyB0aGVuIHNoaWZ0ZWQgaW50byB0aGUgaGlnaCB3b3JkLCB0byBtYWtlIHJvb20gZm9yIHRoZSB3bWFzaw0KLTs7OyB2YWx1ZSwgd2hpY2ggaXQgd2lsbCBhbHdheXMgYWNjb21wYW55Lg0KLQ0KLSAgICAgICAgZGVjIGVieA0KLSAgICAgICAgc2hsIGVieCwgMTYNCi0gICAgICAgIG9yICBlYngsIGVheA0KLQ0KLTs7OyBvbiB6bGliIG9ubHkNCi07OzsgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7DQotDQotSUZERUYgSU5GT1pJUA0KLSAgICAgICAgbW92IFtjaGFpbmxlbndtYXNrXSwgZWJ4DQotOyBvbiBpbmZvemlwIG5pY2VfbWF0Y2ggPSBbbmljZV9tYXRjaF0NCi1FTFNFDQotICAgICAgICBtb3YgZWF4LCBuaWNlX21hdGNoDQotICAgICAgICBtb3YgW2NoYWlubGVud21hc2tdLCBlYngNCi0gICAgICAgIG1vdiByMTBkLCBMb29rYWhlYWQNCi0gICAgICAgIGNtcCByMTBkLCBlYXgNCi0gICAgICAgIGNtb3ZubCByMTBkLCBlYXgNCi0gICAgICAgIG1vdiBbbmljZW1hdGNoXSxyMTBkDQotRU5ESUYNCi0NCi07OzsgcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsNCi0gICAgICAgIG1vdiByMTAsIHdpbmRvd19hZA0KLSAgICAgICAgbW92IGVicCwgc3Ryc3RhcnQNCi0gICAgICAgIGxlYSByMTMsIFtyMTAgKyByYnBdDQotDQotOzs7IERldGVybWluZSBob3cgbWFueSBieXRlcyB0aGUgc2NhbiBwdHIgaXMgb2ZmIGZyb20gYmVpbmcNCi07OzsgZHdvcmQtYWxpZ25lZC4NCi0NCi0gICAgICAgICBtb3YgcjkscjEzDQotICAgICAgICAgbmVnIHIxMw0KLSAgICAgICAgIGFuZCByMTMsMw0KLQ0KLTs7OyBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/DQotOzs7ICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOw0KLUlGREVGIElORk9aSVANCi0gICAgICAgIG1vdiBlYXgsMDdlZmFoIDsgTUFYX0RJU1QgPSAoV1NJWkUtTUlOX0xPT0tBSEVBRCkgKDB4ODAwMC0oMys4KzEpKQ0KLUVMU0UNCi0gICAgICAgIG1vdiBlYXgsIHdpbmRvd19zaXplDQotICAgICAgICBzdWIgZWF4LCBNSU5fTE9PS0FIRUFEDQotRU5ESUYNCi0gICAgICAgIHhvciBlZGksZWRpDQotICAgICAgICBzdWIgZWJwLCBlYXgNCi0NCi0gICAgICAgIG1vdiByMTFkLCBwcmV2X2xlbmd0aA0KLQ0KLSAgICAgICAgY21vdm5nIGVicCxlZGkNCi0NCi07OzsgaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7DQotDQotDQotOzs7IFN0b3JlIHRoZSBzdW0gb2Ygcy0+d2luZG93ICsgYmVzdF9sZW4gaW4gZXNpIGxvY2FsbHksIGFuZCBpbiBlc2kuDQotDQotICAgICAgIGxlYSAgcnNpLFtyMTArcjExXQ0KLQ0KLTs7OyByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsNCi07OzsgcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOw0KLTs7OyBQb3NmICpwcmV2ID0gcy0+cHJldjsNCi0NCi0gICAgICAgIG1vdnp4IHIxMmQsd29yZCBwdHIgW3I5XQ0KLSAgICAgICAgbW92enggZWJ4LCB3b3JkIHB0ciBbcjkgKyByMTEgLSAxXQ0KLQ0KLSAgICAgICAgbW92IHJkaSwgcHJldl9hZA0KLQ0KLTs7OyBKdW1wIGludG8gdGhlIG1haW4gbG9vcC4NCi0NCi0gICAgICAgIG1vdiBlZHgsIFtjaGFpbmxlbndtYXNrXQ0KLQ0KLSAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQotICAgICAgICBqeiAgTG9va3VwTG9vcElzWmVybw0KLQ0KLUxvb2t1cExvb3AxOg0KLSAgICAgICAgYW5kIHI4ZCwgZWR4DQotDQotICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdDQotICAgICAgICBjbXAgcjhkLCBlYnANCi0gICAgICAgIGpiZSBMZWF2ZU5vdw0KLSAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoDQotICAgICAgICBqcyAgTGVhdmVOb3cNCi0NCi1Mb29wRW50cnkxOg0KLSAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQotICAgICAgICBqeiAgTG9va3VwTG9vcElzWmVybw0KLQ0KLUxvb2t1cExvb3AyOg0KLSAgICAgICAgYW5kIHI4ZCwgZWR4DQotDQotICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdDQotICAgICAgICBjbXAgcjhkLCBlYnANCi0gICAgICAgIGpiZSBMZWF2ZU5vdw0KLSAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoDQotICAgICAgICBqcyAgTGVhdmVOb3cNCi0NCi1Mb29wRW50cnkyOg0KLSAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQotICAgICAgICBqeiAgTG9va3VwTG9vcElzWmVybw0KLQ0KLUxvb2t1cExvb3A0Og0KLSAgICAgICAgYW5kIHI4ZCwgZWR4DQotDQotICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdDQotICAgICAgICBjbXAgcjhkLCBlYnANCi0gICAgICAgIGpiZSBMZWF2ZU5vdw0KLSAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoDQotICAgICAgICBqcyAgTGVhdmVOb3cNCi0NCi1Mb29wRW50cnk0Og0KLQ0KLSAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQotICAgICAgICBqbnogTG9va3VwTG9vcDENCi0gICAgICAgIGptcCBMb29rdXBMb29wSXNaZXJvDQotDQotDQotOzs7IGRvIHsNCi07OzsgICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOw0KLTs7OyAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8DQotOzs7ICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsNCi07OzsgICAgIFsuLi5dDQotOzs7IH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdA0KLTs7OyAgICAgICAgICAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsNCi07OzsNCi07OzsgSGVyZSBpcyB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiB3aWxsIHNwZW5kIHRoZQ0KLTs7OyBtYWpvcml0eSBvZiBpdHMgdGltZSBpbiB0aGlzIGxvb3AsIGFuZCBtYWpvcml0eSBvZiB0aGF0IHRpbWUgd2lsbA0KLTs7OyBiZSBzcGVudCBpbiB0aGUgZmlyc3QgdGVuIGluc3RydWN0aW9ucy4NCi07OzsNCi07OzsgV2l0aGluIHRoaXMgbG9vcDoNCi07OzsgZWJ4ID0gc2NhbmVuZA0KLTs7OyByOGQgPSBjdXJtYXRjaA0KLTs7OyBlZHggPSBjaGFpbmxlbndtYXNrIC0gaS5lLiwgKChjaGFpbmxlbiA8PCAxNikgfCB3bWFzaykNCi07OzsgZXNpID0gd2luZG93YmVzdGxlbiAtIGkuZS4sICh3aW5kb3cgKyBiZXN0bGVuKQ0KLTs7OyBlZGkgPSBwcmV2DQotOzs7IGVicCA9IGxpbWl0DQotDQotTG9va3VwTG9vcDoNCi0gICAgICAgIGFuZCByOGQsIGVkeA0KLQ0KLSAgICAgICAgbW92enggICByOGQsIHdvcmQgcHRyIFtyZGkgKyByOCoyXQ0KLSAgICAgICAgY21wIHI4ZCwgZWJwDQotICAgICAgICBqYmUgTGVhdmVOb3cNCi0gICAgICAgIHN1YiBlZHgsIDAwMDEwMDAwaA0KLSAgICAgICAganMgIExlYXZlTm93DQotDQotTG9vcEVudHJ5Og0KLQ0KLSAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQotICAgICAgICBqbnogTG9va3VwTG9vcDENCi1Mb29rdXBMb29wSXNaZXJvOg0KLSAgICAgICAgY21wICAgICByMTJ3LCB3b3JkIHB0ciBbcjEwICsgcjhdDQotICAgICAgICBqbnogTG9va3VwTG9vcDENCi0NCi0NCi07OzsgU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgY2hhaW5sZW4uDQotICAgICAgICBtb3YgW2NoYWlubGVud21hc2tdLCBlZHgNCi0NCi07OzsgUG9pbnQgZWRpIHRvIHRoZSBzdHJpbmcgdW5kZXIgc2NydXRpbnksIGFuZCBlc2kgdG8gdGhlIHN0cmluZyB3ZQ0KLTs7OyBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgZXNpIGFuZCBlZGkgYXJlDQotOzs7IGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgZWR4IGlzDQotOzs7IGluaXRpYWxpemVkIHRvIC0oTUFYX01BVENIXzggLSBzY2FuYWxpZ24pLg0KLQ0KLSAgICAgICAgbGVhIHJzaSxbcjgrcjEwXQ0KLSAgICAgICAgbW92IHJkeCwgMGZmZmZmZmZmZmZmZmZlZjhoOyAtKE1BWF9NQVRDSF84KQ0KLSAgICAgICAgbGVhIHJzaSwgW3JzaSArIHIxMyArIDAxMDhoXSA7TUFYX01BVENIXzhdDQotICAgICAgICBsZWEgcmRpLCBbcjkgKyByMTMgKyAwMTA4aF0gO01BWF9NQVRDSF84XQ0KLQ0KLSAgICAgICAgcHJlZmV0Y2h0MSBbcnNpK3JkeF0NCi0gICAgICAgIHByZWZldGNodDEgW3JkaStyZHhdDQotDQotDQotOzs7IFRlc3QgdGhlIHN0cmluZ3MgZm9yIGVxdWFsaXR5LCA4IGJ5dGVzIGF0IGEgdGltZS4gQXQgdGhlIGVuZCwNCi07OzsgYWRqdXN0IHJkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuDQotOzs7DQotOzs7IFdlIGFscmVhZHkga25vdyBhdCB0aGlzIHBvaW50IHRoYXQgdGhlIGZpcnN0IHRocmVlIGJ5dGVzIG9mIHRoZQ0KLTs7OyBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlDQotOzs7IHN0YXJ0aW5nIHRoZSBjb21wYXJlIGxvb3AuIFNvIHdoYXQgdGhpcyBjb2RlIGRvZXMgaXMgc2tpcCBvdmVyIDAtMw0KLTs7OyBieXRlcywgYXMgbXVjaCBhcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gZHdvcmQtYWxpZ24gdGhlIGVkaQ0KLTs7OyBwb2ludGVyLiAocnNpIHdpbGwgc3RpbGwgYmUgbWlzYWxpZ25lZCB0aHJlZSB0aW1lcyBvdXQgb2YgZm91ci4pDQotOzs7DQotOzs7IEl0IHNob3VsZCBiZSBjb25mZXNzZWQgdGhhdCB0aGlzIGxvb3AgdXN1YWxseSBkb2VzIG5vdCByZXByZXNlbnQNCi07OzsgbXVjaCBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lLiBSZXBsYWNpbmcgaXQgd2l0aCBhIG1vcmUNCi07Ozsgc3RyYWlnaHRmb3J3YXJkICJyZXAgY21wc2IiIHdvdWxkIG5vdCBkcmFzdGljYWxseSBkZWdyYWRlDQotOzs7IHBlcmZvcm1hbmNlLg0KLQ0KLQ0KLUxvb3BDbXBzOg0KLSAgICAgICAgbW92IHJheCwgW3JzaSArIHJkeF0NCi0gICAgICAgIHhvciByYXgsIFtyZGkgKyByZHhdDQotICAgICAgICBqbnogTGVhdmVMb29wQ21wcw0KLQ0KLSAgICAgICAgbW92IHJheCwgW3JzaSArIHJkeCArIDhdDQotICAgICAgICB4b3IgcmF4LCBbcmRpICsgcmR4ICsgOF0NCi0gICAgICAgIGpueiBMZWF2ZUxvb3BDbXBzOA0KLQ0KLQ0KLSAgICAgICAgbW92IHJheCwgW3JzaSArIHJkeCArIDgrOF0NCi0gICAgICAgIHhvciByYXgsIFtyZGkgKyByZHggKyA4KzhdDQotICAgICAgICBqbnogTGVhdmVMb29wQ21wczE2DQotDQotICAgICAgICBhZGQgcmR4LDgrOCs4DQotDQotICAgICAgICBqbnogc2hvcnQgTG9vcENtcHMNCi0gICAgICAgIGptcCBzaG9ydCBMZW5NYXhpbXVtDQotTGVhdmVMb29wQ21wczE2OiBhZGQgcmR4LDgNCi1MZWF2ZUxvb3BDbXBzODogYWRkIHJkeCw4DQotTGVhdmVMb29wQ21wczoNCi0NCi0gICAgICAgIHRlc3QgICAgZWF4LCAwMDAwRkZGRmgNCi0gICAgICAgIGpueiBMZW5Mb3dlcg0KLQ0KLSAgICAgICAgdGVzdCBlYXgsMGZmZmZmZmZmaA0KLQ0KLSAgICAgICAgam56IExlbkxvd2VyMzINCi0NCi0gICAgICAgIGFkZCByZHgsNA0KLSAgICAgICAgc2hyIHJheCwzMg0KLSAgICAgICAgb3IgYXgsYXgNCi0gICAgICAgIGpueiBMZW5Mb3dlcg0KLQ0KLUxlbkxvd2VyMzI6DQotICAgICAgICBzaHIgZWF4LDE2DQotICAgICAgICBhZGQgcmR4LDINCi1MZW5Mb3dlcjogICBzdWIgYWwsIDENCi0gICAgICAgIGFkYyByZHgsIDANCi07OzsgQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsDQotOzs7IHRoZW4gYXV0b21hdGljYWxseSBhY2NlcHQgaXQgYXMgdGhlIGJlc3QgcG9zc2libGUgbWF0Y2ggYW5kIGxlYXZlLg0KLQ0KLSAgICAgICAgbGVhIHJheCwgW3JkaSArIHJkeF0NCi0gICAgICAgIHN1YiByYXgsIHI5DQotICAgICAgICBjbXAgZWF4LCBNQVhfTUFUQ0gNCi0gICAgICAgIGpnZSBMZW5NYXhpbXVtDQotDQotOzs7IElmIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIG5vdCBsb25nZXIgdGhhbiB0aGUgYmVzdCBtYXRjaCB3ZQ0KLTs7OyBoYXZlIHNvIGZhciwgdGhlbiBmb3JnZXQgaXQgYW5kIHJldHVybiB0byB0aGUgbG9va3VwIGxvb3AuDQotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotDQotICAgICAgICBjbXAgZWF4LCByMTFkDQotICAgICAgICBqZyAgTG9uZ2VyTWF0Y2gNCi0NCi0gICAgICAgIGxlYSByc2ksW3IxMCtyMTFdDQotDQotICAgICAgICBtb3YgcmRpLCBwcmV2X2FkDQotICAgICAgICBtb3YgZWR4LCBbY2hhaW5sZW53bWFza10NCi0gICAgICAgIGptcCBMb29rdXBMb29wDQotDQotOzs7ICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7DQotOzs7ICAgICAgICAgYmVzdF9sZW4gPSBsZW47DQotOzs7ICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsNCi07OzsgICAgICAgICBzY2FuX2VuZCA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7DQotDQotTG9uZ2VyTWF0Y2g6DQotICAgICAgICBtb3YgcjExZCwgZWF4DQotICAgICAgICBtb3YgbWF0Y2hfc3RhcnQsIHI4ZA0KLSAgICAgICAgY21wIGVheCwgW25pY2VtYXRjaF0NCi0gICAgICAgIGpnZSBMZWF2ZU5vdw0KLQ0KLSAgICAgICAgbGVhIHJzaSxbcjEwK3JheF0NCi0NCi0gICAgICAgIG1vdnp4ICAgZWJ4LCB3b3JkIHB0ciBbcjkgKyByYXggLSAxXQ0KLSAgICAgICAgbW92IHJkaSwgcHJldl9hZA0KLSAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQotICAgICAgICBqbXAgTG9va3VwTG9vcA0KLQ0KLTs7OyBBY2NlcHQgdGhlIGN1cnJlbnQgc3RyaW5nLCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aC4NCi0NCi1MZW5NYXhpbXVtOg0KLSAgICAgICAgbW92IHIxMWQsTUFYX01BVENIDQotICAgICAgICBtb3YgbWF0Y2hfc3RhcnQsIHI4ZA0KLQ0KLTs7OyBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47DQotOzs7IHJldHVybiBzLT5sb29rYWhlYWQ7DQotDQotTGVhdmVOb3c6DQotSUZERUYgSU5GT1pJUA0KLSAgICAgICAgbW92IGVheCxyMTFkDQotRUxTRQ0KLSAgICAgICAgbW92IGVheCwgTG9va2FoZWFkDQotICAgICAgICBjbXAgcjExZCwgZWF4DQotICAgICAgICBjbW92bmcgZWF4LCByMTFkDQotRU5ESUYNCi0NCi07OzsgUmVzdG9yZSB0aGUgc3RhY2sgYW5kIHJldHVybiBmcm9tIHdoZW5jZSB3ZSBjYW1lLg0KLQ0KLQ0KLSAgICAgICAgbW92IHJzaSxbc2F2ZV9yc2ldDQotICAgICAgICBtb3YgcmRpLFtzYXZlX3JkaV0NCi0gICAgICAgIG1vdiByYngsW3NhdmVfcmJ4XQ0KLSAgICAgICAgbW92IHJicCxbc2F2ZV9yYnBdDQotICAgICAgICBtb3YgcjEyLFtzYXZlX3IxMl0NCi0gICAgICAgIG1vdiByMTMsW3NhdmVfcjEzXQ0KLTsgICAgICAgIG1vdiByMTQsW3NhdmVfcjE0XQ0KLTsgICAgICAgIG1vdiByMTUsW3NhdmVfcjE1XQ0KLQ0KLQ0KLSAgICAgICAgcmV0IDANCi07IHBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBzdHJpbmcgIQ0KLTsgWW91ciBjYW4gZnJlZWx5IHVzZSBndm1hdDY0IGluIGFueSBmcmVlIG9yIGNvbW1lcmNpYWwgYXBwDQotOyBidXQgaXQgaXMgZmFyIGJldHRlciBkb24ndCByZW1vdmUgdGhlIHN0cmluZyBpbiB0aGUgYmluYXJ5IQ0KLSAgICBkYiAgICAgMGRoLDBhaCwiYXNtNjg2IHdpdGggbWFzbSwgb3B0aW1pc2VkIGFzc2VtYmx5IGNvZGUgZnJvbSBCcmlhbiBSYWl0ZXIsIHdyaXR0ZW4gMTk5OCwgY29udmVydGVkIHRvIGFtZCA2NCBieSBHaWxsZXMgVm9sbGFudCAyMDA1IiwwZGgsMGFoLDANCi1sb25nZXN0X21hdGNoICAgRU5EUA0KLQ0KLW1hdGNoX2luaXQgUFJPQw0KLSAgcmV0IDANCi1tYXRjaF9pbml0IEVORFANCi0NCi0NCi1FTkQNCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL21hc214NjQvaW5mZmFzODY2NC5jIGIvc3JjL3psaWIvY29udHJpYi9tYXNteDY0L2luZmZhczg2NjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4NjFhMy4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL21hc214NjQvaW5mZmFzODY2NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qIGluZmZhczg2NjQuYyBpcyBhIGhhbmQgdHVuZWQgYXNzZW1ibGVyIHZlcnNpb24gb2YgaW5mZmFzdC5jIC0gZmFzdCBkZWNvZGluZwotICogdmVyc2lvbiBmb3IgQU1ENjQgb24gV2luZG93cyB1c2luZyBNaWNyb3NvZnQgQyBjb21waWxlcgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ2hyaXMgQW5kZXJzb24gPGNocmlzdG9wQGNoYXJtLm5ldD4KLSAqIFBsZWFzZSB1c2UgdGhlIGNvcHlyaWdodCBjb25kaXRpb25zIGFib3ZlLgotICoKLSAqIDIwMDUgLSBBZGFwdGF0aW9uIHRvIE1pY3Jvc29mdCBDIENvbXBpbGVyIGZvciBBTUQ2NCBieSBHaWxsZXMgVm9sbGFudAotICoKLSAqIGluZmZhczg2NjQuYyBjYWxsIGZ1bmN0aW9uIGluZmZhczg2NjRmbmMgaW4gaW5mZmFzeDY0LmFzbQotICogIGluZmZhc3g2NC5hc20gaXMgYXV0b21hdGljYWxseSBjb252ZXJ0IGZyb20gQU1ENjQgcG9ydGlvbiBvZiBpbmZmYXM4Ni5jCi0gKgotICogRGVjLTI5LTIwMDMgLS0gSSBhZGRlZCBBTUQ2NCBpbmZsYXRlIGFzbSBzdXBwb3J0LiAgVGhpcyB2ZXJzaW9uIGlzIGFsc28KLSAqIHNsaWdodGx5IHF1aWNrZXIgb24geDg2IHN5c3RlbXMgYmVjYXVzZSwgaW5zdGVhZCBvZiB1c2luZyByZXAgbW92c2IgdG8gY29weQotICogZGF0YSwgaXQgdXNlcyByZXAgbW92c3csIHdoaWNoIG1vdmVzIGRhdGEgaW4gMi1ieXRlIGNodW5rcyBpbnN0ZWFkIG9mIHNpbmdsZQotICogYnl0ZXMuICBJJ3ZlIHRlc3RlZCB0aGUgQU1ENjQgY29kZSBvbiBhIEZlZG9yYSBDb3JlIDEgKyB0aGUgeDg2XzY0IHVwZGF0ZXMKLSAqIGZyb20gaHR0cDovL2ZlZG9yYS5saW51eC5kdWtlLmVkdS9mYzFfeDg2XzY0Ci0gKiB3aGljaCBpcyBydW5uaW5nIG9uIGFuIEF0aGxvbiA2NCAzMDAwKyAvIEdpZ2FieXRlIEdBLUs4VlQ4MDBNIHN5c3RlbSB3aXRoCi0gKiAxR0IgcmFtLiAgVGhlIDY0LWJpdCB2ZXJzaW9uIGlzIGFib3V0IDQlIGZhc3RlciB0aGFuIHRoZSAzMi1iaXQgdmVyc2lvbiwKLSAqIHdoZW4gZGVjb21wcmVzc2luZyBtb3ppbGxhLXNvdXJjZS0xLjMudGFyLmd6LgotICoKLSAqIE1hci0xMy0yMDAzIC0tIE1vc3Qgb2YgdGhpcyBpcyBkZXJpdmVkIGZyb20gaW5mZmFzdC5TIHdoaWNoIGlzIGRlcml2ZWQgZnJvbQotICogdGhlIGdjYyAtUyBvdXRwdXQgb2YgemxpYi0xLjIuMC9pbmZmYXN0LmMuICBabGliLTEuMi4wIGlzIGluIGJldGEgcmVsZWFzZSBhdAotICogdGhlIG1vbWVudC4gIEkgaGF2ZSBzdWNjZXNzZnVsbHkgY29tcGlsZWQgYW5kIHRlc3RlZCB0aGlzIGNvZGUgd2l0aCBnY2MyLjk2LAotICogZ2NjMy4yLCBpY2M1LjAsIG1zdmM2LjAuICBJdCBpcyB2ZXJ5IGNsb3NlIHRvIHRoZSBzcGVlZCBvZiBpbmZmYXN0LlMKLSAqIGNvbXBpbGVkIHdpdGggZ2NjIC1ETk9fTU1YLCBidXQgaW5mZmFzdC5TIGlzIHN0aWxsIGZhc3RlciBvbiB0aGUgUDMgd2l0aCBNTVgKLSAqIGVuYWJsZWQuICBJIHdpbGwgYXR0ZW1wdCB0byBtZXJnZSB0aGUgTU1YIGNvZGUgaW50byB0aGlzIHZlcnNpb24uICBOZXdlcgotICogdmVyc2lvbnMgb2YgdGhpcyBhbmQgaW5mZmFzdC5TIGNhbiBiZSBmb3VuZCBhdAotICogaHR0cDovL3d3dy5lZXRiZWV0ZWUuY29tL3psaWIvIGFuZCBodHRwOi8vd3d3LmNoYXJtLm5ldC9+Y2hyaXN0b3AvemxpYi8KLSAqCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAienV0aWwuaCIKLSNpbmNsdWRlICJpbmZ0cmVlcy5oIgotI2luY2x1ZGUgImluZmxhdGUuaCIKLSNpbmNsdWRlICJpbmZmYXN0LmgiCi0KLS8qIE1hcmsgQWRsZXIncyBjb21tZW50cyBmcm9tIGluZmZhc3QuYzogKi8KLQotLyoKLSAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmcKLSAgIGxpdGVyYWwgYW5kIG1hdGNoIGJ5dGVzIHVudGlsIGVpdGhlciBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBpcwotICAgYXZhaWxhYmxlLCBhbiBlbmQtb2YtYmxvY2sgaXMgZW5jb3VudGVyZWQsIG9yIGEgZGF0YSBlcnJvciBpcyBlbmNvdW50ZXJlZC4KLSAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3IKLSAgIGV4YW1wbGUsIGEgMTZLIGlucHV0IGJ1ZmZlciBhbmQgYSA2NEsgb3V0cHV0IGJ1ZmZlciwgbW9yZSB0aGFuIDk1JSBvZiB0aGUKLSAgIGluZmxhdGUgZXhlY3V0aW9uIHRpbWUgaXMgc3BlbnQgaW4gdGhpcyByb3V0aW5lLgotCi0gICBFbnRyeSBhc3N1bXB0aW9uczoKLQotICAgICAgICBzdGF0ZS0+bW9kZSA9PSBMRU4KLSAgICAgICAgc3RybS0+YXZhaWxfaW4gPj0gNgotICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPj0gMjU4Ci0gICAgICAgIHN0YXJ0ID49IHN0cm0tPmF2YWlsX291dAotICAgICAgICBzdGF0ZS0+Yml0cyA8IDgKLQotICAgT24gcmV0dXJuLCBzdGF0ZS0+bW9kZSBpcyBvbmUgb2Y6Ci0KLSAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0Ci0gICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrCi0gICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhCi0KLSAgIE5vdGVzOgotCi0gICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGUKLSAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLAotICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy4KLSAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLT5hdmFpbF9pbiA+PSA2LCB0aGVuIHRoZXJlIGlzIGVub3VnaCBpbnB1dCB0byBhdm9pZAotICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy4KLQotICAgIC0gVGhlIG1heGltdW0gYnl0ZXMgdGhhdCBhIHNpbmdsZSBsZW5ndGgvZGlzdGFuY2UgcGFpciBjYW4gb3V0cHV0IGlzIDI1OAotICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpCi0gICAgICByZXF1aXJlcyBzdHJtLT5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yCi0gICAgICBvdXRwdXQgc3BhY2UuCi0gKi8KLQotCi0KLSAgICB0eXBlZGVmIHN0cnVjdCBpbmZmYXN0X2FyIHsKLS8qIDY0ICAgMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2ICB4ODZfNjQgKi8KLS8qIGFyIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyICovCi0vKiAgMCAgICAwICovIHZvaWQgKmVzcDsgICAgICAgICAgICAgICAgLyogZXNwIHNhdmUgKi8KLS8qICA4ICAgIDQgKi8gdm9pZCAqZWJwOyAgICAgICAgICAgICAgICAvKiBlYnAgc2F2ZSAqLwotLyogMTYgICAgOCAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqaW47ICAgIC8qIGVzaSByc2kgIGxvY2FsIHN0cm0tPm5leHRfaW4gKi8KLS8qIDI0ICAgMTIgKi8gdW5zaWduZWQgY2hhciBGQVIgKmxhc3Q7ICAvKiAgICAgcjkgICB3aGlsZSBpbiA8IGxhc3QgKi8KLS8qIDMyICAgMTYgKi8gdW5zaWduZWQgY2hhciBGQVIgKm91dDsgICAvKiBlZGkgcmRpICBsb2NhbCBzdHJtLT5uZXh0X291dCAqLwotLyogNDAgICAyMCAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqYmVnOyAgIC8qICAgICAgICAgIGluZmxhdGUoKSdzIGluaXQgbmV4dF9vdXQgKi8KLS8qIDQ4ICAgMjQgKi8gdW5zaWduZWQgY2hhciBGQVIgKmVuZDsgICAvKiAgICAgcjEwICB3aGlsZSBvdXQgPCBlbmQgKi8KLS8qIDU2ICAgMjggKi8gdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdzsvKiAgICAgICAgICBzaXplIG9mIHdpbmRvdywgd3NpemUhPTAgKi8KLS8qIDY0ICAgMzIgKi8gY29kZSBjb25zdCBGQVIgKmxjb2RlOyAgICAvKiBlYnAgcmJwICBsb2NhbCBzdHJtLT5sZW5jb2RlICovCi0vKiA3MiAgIDM2ICovIGNvZGUgY29uc3QgRkFSICpkY29kZTsgICAgLyogICAgIHIxMSAgbG9jYWwgc3RybS0+ZGlzdGNvZGUgKi8KLS8qIDgwICAgNDAgKi8gc2l6ZV90IC8qdW5zaWduZWQgbG9uZyAqL2hvbGQ7ICAgICAgIC8qIGVkeCByZHggIGxvY2FsIHN0cm0tPmhvbGQgKi8KLS8qIDg4ICAgNDQgKi8gdW5zaWduZWQgYml0czsgICAgICAgICAgICAvKiBlYnggcmJ4ICBsb2NhbCBzdHJtLT5iaXRzICovCi0vKiA5MiAgIDQ4ICovIHVuc2lnbmVkIHdzaXplOyAgICAgICAgICAgLyogICAgICAgICAgd2luZG93IHNpemUgKi8KLS8qIDk2ICAgNTIgKi8gdW5zaWduZWQgd3JpdGU7ICAgICAgICAgICAvKiAgICAgICAgICB3aW5kb3cgd3JpdGUgaW5kZXggKi8KLS8qMTAwICAgNTYgKi8gdW5zaWduZWQgbG1hc2s7ICAgICAgICAgICAvKiAgICAgcjEyICBtYXNrIGZvciBsY29kZSAqLwotLyoxMDQgICA2MCAqLyB1bnNpZ25lZCBkbWFzazsgICAgICAgICAgIC8qICAgICByMTMgIG1hc2sgZm9yIGRjb2RlICovCi0vKjEwOCAgIDY0ICovIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgLyogICAgIHIxNCAgbWF0Y2ggbGVuZ3RoICovCi0vKjExMiAgIDY4ICovIHVuc2lnbmVkIGRpc3Q7ICAgICAgICAgICAgLyogICAgIHIxNSAgbWF0Y2ggZGlzdGFuY2UgKi8KLS8qMTE2ICAgNzIgKi8gdW5zaWduZWQgc3RhdHVzOyAgICAgICAgICAvKiAgICAgICAgICBzZXQgd2hlbiBzdGF0ZSBjaG5nKi8KLSAgICB9IHR5cGVfYXI7Ci0jaWZkZWYgQVNNSU5GCi0KLXZvaWQgaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KQotel9zdHJlYW1wIHN0cm07Ci11bnNpZ25lZCBzdGFydDsgICAgICAgICAvKiBpbmZsYXRlKCkncyBzdGFydGluZyB2YWx1ZSBmb3Igc3RybS0+YXZhaWxfb3V0ICovCi17Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLSAgICB0eXBlX2FyIGFyOwotICAgIHZvaWQgaW5mZmFzODY2NGZuYyhzdHJ1Y3QgaW5mZmFzdF9hciAqIHBhcik7Ci0KLQotCi0jaWYgKGRlZmluZWQoIF9fR05VQ19fICkgJiYgZGVmaW5lZCggX19hbWQ2NF9fICkgJiYgISBkZWZpbmVkKCBfX2kzODYgKSkgfHwgKGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX01fQU1ENjQpKQotI2RlZmluZSBQQURfQVZBSUxfSU4gNgotI2RlZmluZSBQQURfQVZBSUxfT1VUIDI1OAotI2Vsc2UKLSNkZWZpbmUgUEFEX0FWQUlMX0lOIDUKLSNkZWZpbmUgUEFEX0FWQUlMX09VVCAyNTcKLSNlbmRpZgotCi0gICAgLyogY29weSBzdGF0ZSB0byBsb2NhbCB2YXJpYWJsZXMgKi8KLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKLQotICAgIGFyLmluID0gc3RybS0+bmV4dF9pbjsKLSAgICBhci5sYXN0ID0gYXIuaW4gKyAoc3RybS0+YXZhaWxfaW4gLSBQQURfQVZBSUxfSU4pOwotICAgIGFyLm91dCA9IHN0cm0tPm5leHRfb3V0OwotICAgIGFyLmJlZyA9IGFyLm91dCAtIChzdGFydCAtIHN0cm0tPmF2YWlsX291dCk7Ci0gICAgYXIuZW5kID0gYXIub3V0ICsgKHN0cm0tPmF2YWlsX291dCAtIFBBRF9BVkFJTF9PVVQpOwotICAgIGFyLndzaXplID0gc3RhdGUtPndzaXplOwotICAgIGFyLndyaXRlID0gc3RhdGUtPnduZXh0OwotICAgIGFyLndpbmRvdyA9IHN0YXRlLT53aW5kb3c7Ci0gICAgYXIuaG9sZCA9IHN0YXRlLT5ob2xkOwotICAgIGFyLmJpdHMgPSBzdGF0ZS0+Yml0czsKLSAgICBhci5sY29kZSA9IHN0YXRlLT5sZW5jb2RlOwotICAgIGFyLmRjb2RlID0gc3RhdGUtPmRpc3Rjb2RlOwotICAgIGFyLmxtYXNrID0gKDFVIDw8IHN0YXRlLT5sZW5iaXRzKSAtIDE7Ci0gICAgYXIuZG1hc2sgPSAoMVUgPDwgc3RhdGUtPmRpc3RiaXRzKSAtIDE7Ci0KLSAgICAvKiBkZWNvZGUgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZXMgdW50aWwgZW5kLW9mLWJsb2NrIG9yIG5vdCBlbm91Z2gKLSAgICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqLwotCi0gICAgLyogYWxpZ24gaW4gb24gMS8yIGhvbGQgc2l6ZSBib3VuZGFyeSAqLwotICAgIHdoaWxlICgoKHNpemVfdCkodm9pZCAqKWFyLmluICYgKHNpemVvZihhci5ob2xkKSAvIDIgLSAxKSkgIT0gMCkgewotICAgICAgICBhci5ob2xkICs9ICh1bnNpZ25lZCBsb25nKSphci5pbisrIDw8IGFyLmJpdHM7Ci0gICAgICAgIGFyLmJpdHMgKz0gODsKLSAgICB9Ci0KLSAgICBpbmZmYXM4NjY0Zm5jKCZhcik7Ci0KLSAgICBpZiAoYXIuc3RhdHVzID4gMSkgewotICAgICAgICBpZiAoYXIuc3RhdHVzID09IDIpCi0gICAgICAgICAgICBzdHJtLT5tc2cgPSAiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKLSAgICAgICAgZWxzZSBpZiAoYXIuc3RhdHVzID09IDMpCi0gICAgICAgICAgICBzdHJtLT5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RybS0+bXNnID0gImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKLSAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBhci5zdGF0dXMgPT0gMSApIHsKLSAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOwotICAgIH0KLQotICAgIC8qIHJldHVybiB1bnVzZWQgYnl0ZXMgKG9uIGVudHJ5LCBiaXRzIDwgOCwgc28gaW4gd29uJ3QgZ28gdG9vIGZhciBiYWNrKSAqLwotICAgIGFyLmxlbiA9IGFyLmJpdHMgPj4gMzsKLSAgICBhci5pbiAtPSBhci5sZW47Ci0gICAgYXIuYml0cyAtPSBhci5sZW4gPDwgMzsKLSAgICBhci5ob2xkICY9ICgxVSA8PCBhci5iaXRzKSAtIDE7Ci0KLSAgICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJldHVybiAqLwotICAgIHN0cm0tPm5leHRfaW4gPSBhci5pbjsKLSAgICBzdHJtLT5uZXh0X291dCA9IGFyLm91dDsKLSAgICBzdHJtLT5hdmFpbF9pbiA9ICh1bnNpZ25lZCkoYXIuaW4gPCBhci5sYXN0ID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFEX0FWQUlMX0lOICsgKGFyLmxhc3QgLSBhci5pbikgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQURfQVZBSUxfSU4gLSAoYXIuaW4gLSBhci5sYXN0KSk7Ci0gICAgc3RybS0+YXZhaWxfb3V0ID0gKHVuc2lnbmVkKShhci5vdXQgPCBhci5lbmQgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFEX0FWQUlMX09VVCArIChhci5lbmQgLSBhci5vdXQpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBRF9BVkFJTF9PVVQgLSAoYXIub3V0IC0gYXIuZW5kKSk7Ci0gICAgc3RhdGUtPmhvbGQgPSAodW5zaWduZWQgbG9uZylhci5ob2xkOwotICAgIHN0YXRlLT5iaXRzID0gYXIuYml0czsKLSAgICByZXR1cm47Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9tYXNteDY0L2luZmZhc3g2NC5hc20gYi9zcmMvemxpYi9jb250cmliL21hc214NjQvaW5mZmFzeDY0LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBhOGQ4OS4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL21hc214NjQvaW5mZmFzeDY0LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi07IGluZmZhc3g2NC5hc20gaXMgYSBoYW5kIHR1bmVkIGFzc2VtYmxlciB2ZXJzaW9uIG9mIGluZmZhc3QuYyAtIGZhc3QgZGVjb2RpbmcNCi07IHZlcnNpb24gZm9yIEFNRDY0IG9uIFdpbmRvd3MgdXNpbmcgTWljcm9zb2Z0IEMgY29tcGlsZXINCi07DQotOyBpbmZmYXN4NjQuYXNtIGlzIGF1dG9tYXRpY2FsbHkgY29udmVydCBmcm9tIEFNRDY0IHBvcnRpb24gb2YgaW5mZmFzODYuYw0KLTsgaW5mZmFzeDY0LmFzbSBpcyBjYWxsZWQgYnkgaW5mZmFzODY2NC5jLCB3aGljaCBjb250YWluIG1vcmUgaW5mby4NCi0NCi0NCi07IHRvIGNvbXBpbGUgdGhpcyBmaWxlLCBJIHVzZSBvcHRpb24NCi07ICAgbWw2NC5leGUgL0ZsaW5mZmFzeDY0IC9jIC9aaSBpbmZmYXN4NjQuYXNtDQotOyAgIHdpdGggTWljcm9zb2Z0IE1hY3JvIEFzc2VtYmxlciAoeDY0KSBmb3IgQU1ENjQNCi07DQotDQotOyBUaGlzIGZpbGUgY29tcGlsZSB3aXRoIE1pY3Jvc29mdCBNYWNybyBBc3NlbWJsZXIgKHg2NCkgZm9yIEFNRDY0DQotOw0KLTsgICBtbDY0LmV4ZSBpcyBnaXZlbiB3aXRoIFZpc3VhbCBTdHVkaW8gMjAwNS8yMDA4LzIwMTAgYW5kIFdpbmRvd3MgV0RLDQotOw0KLTsgICAoeW91IGNhbiBnZXQgV2luZG93cyBXREsgd2l0aCBtbDY0IGZvciBBTUQ2NCBmcm9tDQotOyAgICAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93aGRjL0RldnRvb2xzL3dkay9kZWZhdWx0Lm1zcHggZm9yIGxvdyBwcmljZSkNCi07DQotDQotDQotLmNvZGUNCi1pbmZmYXM4NjY0Zm5jIFBST0MNCi0NCi07IHNlZSBodHRwOi8vd2VibG9ncy5hc3AubmV0L29sZG5ld3RoaW5nL2FyY2hpdmUvMjAwNC8wMS8xNC81ODU3OS5hc3B4IGFuZA0KLTsgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL2ttYXJjaC9oaC9rbWFyY2gvNjRiaXRBTURfOGU5NTFkZDItZWU3Ny00NzI4LTg3MDItNTVjZTRiNWRkMjRhLnhtbC5hc3ANCi07DQotOyBBbGwgcmVnaXN0ZXJzIG11c3QgYmUgcHJlc2VydmVkIGFjcm9zcyB0aGUgY2FsbCwgZXhjZXB0IGZvcg0KLTsgICByYXgsIHJjeCwgcmR4LCByOCwgci05LCByMTAsIGFuZCByMTEsIHdoaWNoIGFyZSBzY3JhdGNoLg0KLQ0KLQ0KLQltb3YgW3JzcC04XSxyc2kNCi0JbW92IFtyc3AtMTZdLHJkaQ0KLQltb3YgW3JzcC0yNF0scjEyDQotCW1vdiBbcnNwLTMyXSxyMTMNCi0JbW92IFtyc3AtNDBdLHIxNA0KLQltb3YgW3JzcC00OF0scjE1DQotCW1vdiBbcnNwLTU2XSxyYngNCi0NCi0JbW92IHJheCxyY3gNCi0NCi0JbW92CVtyYXgrOF0sIHJicCAgICAgICA7IC8qIHNhdmUgcmVncyByYnAgYW5kIHJzcCAqLw0KLQltb3YJW3JheF0sIHJzcA0KLQ0KLQltb3YJcnNwLCByYXggICAgICAgICAgOyAvKiBtYWtlIHJzcCBwb2ludCB0byAmYXIgKi8NCi0NCi0JbW92CXJzaSwgW3JzcCsxNl0gICAgICA7IC8qIHJzaSAgPSBpbiAqLw0KLQltb3YJcmRpLCBbcnNwKzMyXSAgICAgIDsgLyogcmRpICA9IG91dCAqLw0KLQltb3YJcjksIFtyc3ArMjRdICAgICAgIDsgLyogcjkgICA9IGxhc3QgKi8NCi0JbW92CXIxMCwgW3JzcCs0OF0gICAgICA7IC8qIHIxMCAgPSBlbmQgKi8NCi0JbW92CXJicCwgW3JzcCs2NF0gICAgICA7IC8qIHJicCAgPSBsY29kZSAqLw0KLQltb3YJcjExLCBbcnNwKzcyXSAgICAgIDsgLyogcjExICA9IGRjb2RlICovDQotCW1vdglyZHgsIFtyc3ArODBdICAgICAgOyAvKiByZHggID0gaG9sZCAqLw0KLQltb3YJZWJ4LCBbcnNwKzg4XSAgICAgIDsgLyogZWJ4ICA9IGJpdHMgKi8NCi0JbW92CXIxMmQsIFtyc3ArMTAwXSAgICA7IC8qIHIxMmQgPSBsbWFzayAqLw0KLQltb3YJcjEzZCwgW3JzcCsxMDRdICAgIDsgLyogcjEzZCA9IGRtYXNrICovDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAvKiByMTRkID0gbGVuICovDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAvKiByMTVkID0gZGlzdCAqLw0KLQ0KLQ0KLQljbGQNCi0JY21wCXIxMCwgcmRpDQotCWplCUxfb25lX3RpbWUgICAgICAgICAgIDsgLyogaWYgb25seSBvbmUgZGVjb2RlIGxlZnQgKi8NCi0JY21wCXI5LCByc2kNCi0NCi0gICAgam5lIExfZG9fbG9vcA0KLQ0KLQ0KLUxfb25lX3RpbWU6DQotCW1vdglyOCwgcjEyICAgICAgICAgICA7IC8qIHI4ID0gbG1hc2sgKi8NCi0JY21wCWJsLCAzMg0KLQlqYQlMX2dldF9sZW5ndGhfY29kZV9vbmVfdGltZQ0KLQ0KLQlsb2RzZCAgICAgICAgICAgICAgICAgICAgICAgICA7IC8qIGVheCA9ICoodWludCAqKWluKysgKi8NCi0JbW92CWNsLCBibCAgICAgICAgICAgIDsgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8NCi0JYWRkCWJsLCAzMiAgICAgICAgICAgICA7IC8qIGJpdHMgKz0gMzIgKi8NCi0Jc2hsCXJheCwgY2wNCi0Jb3IJcmR4LCByYXggICAgICAgICAgOyAvKiBob2xkIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovDQotCWptcAlMX2dldF9sZW5ndGhfY29kZV9vbmVfdGltZQ0KLQ0KLUFMSUdOIDQNCi1MX3doaWxlX3Rlc3Q6DQotCWNtcAlyMTAsIHJkaQ0KLQlqYmUJTF9icmVha19sb29wDQotCWNtcAlyOSwgcnNpDQotCWpiZQlMX2JyZWFrX2xvb3ANCi0NCi1MX2RvX2xvb3A6DQotCW1vdglyOCwgcjEyICAgICAgICAgICA7IC8qIHI4ID0gbG1hc2sgKi8NCi0JY21wCWJsLCAzMg0KLQlqYQlMX2dldF9sZW5ndGhfY29kZSAgICA7IC8qIGlmICgzMiA8IGJpdHMpICovDQotDQotCWxvZHNkICAgICAgICAgICAgICAgICAgICAgICAgIDsgLyogZWF4ID0gKih1aW50ICopaW4rKyAqLw0KLQltb3YJY2wsIGJsICAgICAgICAgICAgOyAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLw0KLQlhZGQJYmwsIDMyICAgICAgICAgICAgIDsgLyogYml0cyArPSAzMiAqLw0KLQlzaGwJcmF4LCBjbA0KLQlvcglyZHgsIHJheCAgICAgICAgICA7IC8qIGhvbGQgfD0gKigodWludCAqKWluKSsrIDw8IGJpdHMgKi8NCi0NCi1MX2dldF9sZW5ndGhfY29kZToNCi0JYW5kCXI4LCByZHggICAgICAgICAgICA7IC8qIHI4ICY9IGhvbGQgKi8NCi0JbW92CWVheCwgW3JicCtyOCo0XSAgOyAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovDQotDQotCW1vdgljbCwgYWggICAgICAgICAgICA7IC8qIGNsID0gdGhpcy5iaXRzICovDQotCXN1YglibCwgYWggICAgICAgICAgICA7IC8qIGJpdHMgLT0gdGhpcy5iaXRzICovDQotCXNocglyZHgsIGNsICAgICAgICAgICA7IC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLw0KLQ0KLQl0ZXN0CWFsLCBhbA0KLQlqbnoJTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZSA7IC8qIGlmIChvcCAhPSAwKSA0NS43JSAqLw0KLQ0KLQltb3YJcjgsIHIxMiAgICAgICAgICAgIDsgLyogcjggPSBsbWFzayAqLw0KLQlzaHIJZWF4LCAxNiAgICAgICAgICAgIDsgLyogb3V0cHV0IHRoaXMudmFsIGNoYXIgKi8NCi0Jc3Rvc2INCi0NCi1MX2dldF9sZW5ndGhfY29kZV9vbmVfdGltZToNCi0JYW5kCXI4LCByZHggICAgICAgICAgICA7IC8qIHI4ICY9IGhvbGQgKi8NCi0JbW92CWVheCwgW3JicCtyOCo0XSA7IC8qIGVheCA9IGxjb2RlW2hvbGQgJiBsbWFza10gKi8NCi0NCi1MX2RvbGVuOg0KLQltb3YJY2wsIGFoICAgICAgICAgICAgOyAvKiBjbCA9IHRoaXMuYml0cyAqLw0KLQlzdWIJYmwsIGFoICAgICAgICAgICAgOyAvKiBiaXRzIC09IHRoaXMuYml0cyAqLw0KLQlzaHIJcmR4LCBjbCAgICAgICAgICAgOyAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8NCi0NCi0JdGVzdAlhbCwgYWwNCi0Jam56CUxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2UgOyAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8NCi0NCi0Jc2hyCWVheCwgMTYgICAgICAgICAgICA7IC8qIG91dHB1dCB0aGlzLnZhbCBjaGFyICovDQotCXN0b3NiDQotCWptcAlMX3doaWxlX3Rlc3QNCi0NCi1BTElHTiA0DQotTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZToNCi0JbW92CXIxNGQsIGVheCAgICAgICAgIDsgLyogbGVuID0gdGhpcyAqLw0KLQlzaHIJcjE0ZCwgMTYgICAgICAgICAgIDsgLyogbGVuID0gdGhpcy52YWwgKi8NCi0JbW92CWNsLCBhbA0KLQ0KLQl0ZXN0CWFsLCAxNg0KLQlqeglMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGggOyAvKiBpZiAoKG9wICYgMTYpID09IDApIDglICovDQotCWFuZAljbCwgMTUgICAgICAgICAgICAgOyAvKiBvcCAmPSAxNSAqLw0KLQlqeglMX2RlY29kZV9kaXN0YW5jZSAgICA7IC8qIGlmICghb3ApICovDQotDQotTF9hZGRfYml0c190b19sZW46DQotCXN1YglibCwgY2wNCi0JeG9yCWVheCwgZWF4DQotCWluYwllYXgNCi0Jc2hsCWVheCwgY2wNCi0JZGVjCWVheA0KLQlhbmQJZWF4LCBlZHggICAgICAgICAgOyAvKiBlYXggJj0gaG9sZCAqLw0KLQlzaHIJcmR4LCBjbA0KLQlhZGQJcjE0ZCwgZWF4ICAgICAgICAgOyAvKiBsZW4gKz0gaG9sZCAmIG1hc2tbb3BdICovDQotDQotTF9kZWNvZGVfZGlzdGFuY2U6DQotCW1vdglyOCwgcjEzICAgICAgICAgICA7IC8qIHI4ID0gZG1hc2sgKi8NCi0JY21wCWJsLCAzMg0KLQlqYQlMX2dldF9kaXN0YW5jZV9jb2RlICA7IC8qIGlmICgzMiA8IGJpdHMpICovDQotDQotCWxvZHNkICAgICAgICAgICAgICAgICAgICAgICAgIDsgLyogZWF4ID0gKih1aW50ICopaW4rKyAqLw0KLQltb3YJY2wsIGJsICAgICAgICAgICAgOyAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLw0KLQlhZGQJYmwsIDMyICAgICAgICAgICAgIDsgLyogYml0cyArPSAzMiAqLw0KLQlzaGwJcmF4LCBjbA0KLQlvcglyZHgsIHJheCAgICAgICAgICA7IC8qIGhvbGQgfD0gKigodWludCAqKWluKSsrIDw8IGJpdHMgKi8NCi0NCi1MX2dldF9kaXN0YW5jZV9jb2RlOg0KLQlhbmQJcjgsIHJkeCAgICAgICAgICAgOyAvKiByOCAmPSBob2xkICovDQotCW1vdgllYXgsIFtyMTErcjgqNF0gOyAvKiBlYXggPSBkY29kZVtob2xkICYgZG1hc2tdICovDQotDQotTF9kb2Rpc3Q6DQotCW1vdglyMTVkLCBlYXggICAgICAgICA7IC8qIGRpc3QgPSB0aGlzICovDQotCXNocglyMTVkLCAxNiAgICAgICAgICAgOyAvKiBkaXN0ID0gdGhpcy52YWwgKi8NCi0JbW92CWNsLCBhaA0KLQlzdWIJYmwsIGFoICAgICAgICAgICAgOyAvKiBiaXRzIC09IHRoaXMuYml0cyAqLw0KLQlzaHIJcmR4LCBjbCAgICAgICAgICAgOyAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8NCi0JbW92CWNsLCBhbCAgICAgICAgICAgIDsgLyogY2wgPSB0aGlzLm9wICovDQotDQotCXRlc3QJYWwsIDE2ICAgICAgICAgICAgIDsgLyogaWYgKChvcCAmIDE2KSA9PSAwKSAqLw0KLQlqeglMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0DQotCWFuZAljbCwgMTUgICAgICAgICAgICAgOyAvKiBvcCAmPSAxNSAqLw0KLQlqeglMX2NoZWNrX2Rpc3Rfb25lDQotDQotTF9hZGRfYml0c190b19kaXN0Og0KLQlzdWIJYmwsIGNsDQotCXhvcgllYXgsIGVheA0KLQlpbmMJZWF4DQotCXNobAllYXgsIGNsDQotCWRlYwllYXggICAgICAgICAgICAgICAgIDsgLyogKDEgPDwgb3ApIC0gMSAqLw0KLQlhbmQJZWF4LCBlZHggICAgICAgICAgOyAvKiBlYXggJj0gaG9sZCAqLw0KLQlzaHIJcmR4LCBjbA0KLQlhZGQJcjE1ZCwgZWF4ICAgICAgICAgOyAvKiBkaXN0ICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkgKi8NCi0NCi1MX2NoZWNrX3dpbmRvdzoNCi0JbW92CXI4LCByc2kgICAgICAgICAgIDsgLyogc2F2ZSBpbiBzbyBmcm9tIGNhbiB1c2UgaXQncyByZWcgKi8NCi0JbW92CXJheCwgcmRpDQotCXN1YglyYXgsIFtyc3ArNDBdICAgICAgOyAvKiBuYnl0ZXMgPSBvdXQgLSBiZWcgKi8NCi0NCi0JY21wCWVheCwgcjE1ZA0KLQlqYglMX2NsaXBfd2luZG93ICAgICAgICA7IC8qIGlmIChkaXN0ID4gbmJ5dGVzKSA0LjIlICovDQotDQotCW1vdgllY3gsIHIxNGQgICAgICAgICA7IC8qIGVjeCA9IGxlbiAqLw0KLQltb3YJcnNpLCByZGkNCi0Jc3ViCXJzaSwgcjE1ICAgICAgICAgIDsgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8NCi0NCi0Jc2FyCWVjeCwgMQ0KLQlqbmMJTF9jb3B5X3R3byAgICAgICAgICAgOyAvKiBpZiBsZW4gJSAyID09IDAgKi8NCi0NCi0JcmVwICAgICBtb3Zzdw0KLQltb3YJYWwsIFtyc2ldDQotCW1vdglbcmRpXSwgYWwNCi0JaW5jCXJkaQ0KLQ0KLQltb3YJcnNpLCByOCAgICAgICAgICAgOyAvKiBtb3ZlIGluIGJhY2sgdG8gJXJzaSwgdG9zcyBmcm9tICovDQotCWptcAlMX3doaWxlX3Rlc3QNCi0NCi1MX2NvcHlfdHdvOg0KLQlyZXAgICAgIG1vdnN3DQotCW1vdglyc2ksIHI4ICAgICAgICAgICA7IC8qIG1vdmUgaW4gYmFjayB0byAlcnNpLCB0b3NzIGZyb20gKi8NCi0Jam1wCUxfd2hpbGVfdGVzdA0KLQ0KLUFMSUdOIDQNCi1MX2NoZWNrX2Rpc3Rfb25lOg0KLQljbXAJcjE1ZCwgMSAgICAgICAgICAgIDsgLyogaWYgZGlzdCAxLCBpcyBhIG1lbXNldCAqLw0KLQlqbmUJTF9jaGVja193aW5kb3cNCi0JY21wCVtyc3ArNDBdLCByZGkgICAgICA7IC8qIGlmIG91dCA9PSBiZWcsIG91dHNpZGUgd2luZG93ICovDQotCWplCUxfY2hlY2tfd2luZG93DQotDQotCW1vdgllY3gsIHIxNGQgICAgICAgICA7IC8qIGVjeCA9IGxlbiAqLw0KLQltb3YJYWwsIFtyZGktMV0NCi0JbW92CWFoLCBhbA0KLQ0KLQlzYXIJZWN4LCAxDQotCWpuYwlMX3NldF90d28NCi0JbW92CVtyZGldLCBhbA0KLQlpbmMJcmRpDQotDQotTF9zZXRfdHdvOg0KLQlyZXAgICAgIHN0b3N3DQotCWptcAlMX3doaWxlX3Rlc3QNCi0NCi1BTElHTiA0DQotTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoOg0KLQl0ZXN0CWFsLCA2NA0KLQlqbnoJTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2sgOyAvKiBpZiAoKG9wICYgNjQpICE9IDApICovDQotDQotCXhvcgllYXgsIGVheA0KLQlpbmMJZWF4DQotCXNobAllYXgsIGNsDQotCWRlYwllYXgNCi0JYW5kCWVheCwgZWR4ICAgICAgICAgOyAvKiBlYXggJj0gaG9sZCAqLw0KLQlhZGQJZWF4LCByMTRkICAgICAgICA7IC8qIGVheCArPSBsZW4gKi8NCi0JbW92CWVheCwgW3JicCtyYXgqNF0gOyAvKiBlYXggPSBsY29kZVt2YWwrKGhvbGQmbWFza1tvcF0pXSovDQotCWptcAlMX2RvbGVuDQotDQotQUxJR04gNA0KLUxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3Q6DQotCXRlc3QJYWwsIDY0DQotCWpueglMX2ludmFsaWRfZGlzdGFuY2VfY29kZSA7IC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8NCi0NCi0JeG9yCWVheCwgZWF4DQotCWluYwllYXgNCi0Jc2hsCWVheCwgY2wNCi0JZGVjCWVheA0KLQlhbmQJZWF4LCBlZHggICAgICAgICA7IC8qIGVheCAmPSBob2xkICovDQotCWFkZAllYXgsIHIxNWQgICAgICAgIDsgLyogZWF4ICs9IGRpc3QgKi8NCi0JbW92CWVheCwgW3IxMStyYXgqNF0gOyAvKiBlYXggPSBkY29kZVt2YWwrKGhvbGQmbWFza1tvcF0pXSovDQotCWptcAlMX2RvZGlzdA0KLQ0KLUFMSUdOIDQNCi1MX2NsaXBfd2luZG93Og0KLQltb3YJZWN4LCBlYXggICAgICAgICA7IC8qIGVjeCA9IG5ieXRlcyAqLw0KLQltb3YJZWF4LCBbcnNwKzkyXSAgICAgOyAvKiBlYXggPSB3c2l6ZSwgcHJlcGFyZSBmb3IgZGlzdCBjbXAgKi8NCi0JbmVnCWVjeCAgICAgICAgICAgICAgICA7IC8qIG5ieXRlcyA9IC1uYnl0ZXMgKi8NCi0NCi0JY21wCWVheCwgcjE1ZA0KLQlqYglMX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhciA7IC8qIGlmIChkaXN0ID4gd3NpemUpICovDQotDQotCWFkZAllY3gsIHIxNWQgICAgICAgICA7IC8qIG5ieXRlcyA9IGRpc3QgLSBuYnl0ZXMgKi8NCi0JY21wCWR3b3JkIHB0ciBbcnNwKzk2XSwgMA0KLQlqbmUJTF93cmFwX2Fyb3VuZF93aW5kb3cgOyAvKiBpZiAod3JpdGUgIT0gMCkgKi8NCi0NCi0JbW92CXJzaSwgW3JzcCs1Nl0gICAgIDsgLyogZnJvbSAgPSB3aW5kb3cgKi8NCi0Jc3ViCWVheCwgZWN4ICAgICAgICAgOyAvKiBlYXggIC09IG5ieXRlcyAqLw0KLQlhZGQJcnNpLCByYXggICAgICAgICA7IC8qIGZyb20gKz0gd3NpemUgLSBuYnl0ZXMgKi8NCi0NCi0JbW92CWVheCwgcjE0ZCAgICAgICAgOyAvKiBlYXggPSBsZW4gKi8NCi0JY21wCXIxNGQsIGVjeA0KLQlqYmUJTF9kb19jb3B5ICAgICAgICAgICA7IC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLw0KLQ0KLQlzdWIJZWF4LCBlY3ggICAgICAgICA7IC8qIGVheCAtPSBuYnl0ZXMgKi8NCi0JcmVwICAgICBtb3ZzYg0KLQltb3YJcnNpLCByZGkNCi0Jc3ViCXJzaSwgcjE1ICAgICAgICAgOyAvKiBmcm9tID0gJm91dFsgLWRpc3QgXSAqLw0KLQlqbXAJTF9kb19jb3B5DQotDQotQUxJR04gNA0KLUxfd3JhcF9hcm91bmRfd2luZG93Og0KLQltb3YJZWF4LCBbcnNwKzk2XSAgICAgOyAvKiBlYXggPSB3cml0ZSAqLw0KLQljbXAJZWN4LCBlYXgNCi0JamJlCUxfY29udGlndW91c19pbl93aW5kb3cgOyAvKiBpZiAod3JpdGUgPj0gbmJ5dGVzKSAqLw0KLQ0KLQltb3YJZXNpLCBbcnNwKzkyXSAgICAgOyAvKiBmcm9tICA9IHdzaXplICovDQotCWFkZAlyc2ksIFtyc3ArNTZdICAgICA7IC8qIGZyb20gKz0gd2luZG93ICovDQotCWFkZAlyc2ksIHJheCAgICAgICAgIDsgLyogZnJvbSArPSB3cml0ZSAqLw0KLQlzdWIJcnNpLCByY3ggICAgICAgICA7IC8qIGZyb20gLT0gbmJ5dGVzICovDQotCXN1YgllY3gsIGVheCAgICAgICAgIDsgLyogbmJ5dGVzIC09IHdyaXRlICovDQotDQotCW1vdgllYXgsIHIxNGQgICAgICAgIDsgLyogZWF4ID0gbGVuICovDQotCWNtcAllYXgsIGVjeA0KLQlqYmUJTF9kb19jb3B5ICAgICAgICAgICA7IC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLw0KLQ0KLQlzdWIJZWF4LCBlY3ggICAgICAgICA7IC8qIGxlbiAtPSBuYnl0ZXMgKi8NCi0JcmVwICAgICBtb3ZzYg0KLQltb3YJcnNpLCBbcnNwKzU2XSAgICAgOyAvKiBmcm9tID0gd2luZG93ICovDQotCW1vdgllY3gsIFtyc3ArOTZdICAgICA7IC8qIG5ieXRlcyA9IHdyaXRlICovDQotCWNtcAllYXgsIGVjeA0KLQlqYmUJTF9kb19jb3B5ICAgICAgICAgICA7IC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLw0KLQ0KLQlzdWIJZWF4LCBlY3ggICAgICAgICA7IC8qIGxlbiAtPSBuYnl0ZXMgKi8NCi0JcmVwICAgICBtb3ZzYg0KLQltb3YJcnNpLCByZGkNCi0Jc3ViCXJzaSwgcjE1ICAgICAgICAgOyAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLw0KLQlqbXAJTF9kb19jb3B5DQotDQotQUxJR04gNA0KLUxfY29udGlndW91c19pbl93aW5kb3c6DQotCW1vdglyc2ksIFtyc3ArNTZdICAgICA7IC8qIHJzaSA9IHdpbmRvdyAqLw0KLQlhZGQJcnNpLCByYXgNCi0Jc3ViCXJzaSwgcmN4ICAgICAgICAgOyAvKiBmcm9tICs9IHdyaXRlIC0gbmJ5dGVzICovDQotDQotCW1vdgllYXgsIHIxNGQgICAgICAgIDsgLyogZWF4ID0gbGVuICovDQotCWNtcAllYXgsIGVjeA0KLQlqYmUJTF9kb19jb3B5ICAgICAgICAgICA7IC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLw0KLQ0KLQlzdWIJZWF4LCBlY3ggICAgICAgICA7IC8qIGxlbiAtPSBuYnl0ZXMgKi8NCi0JcmVwICAgICBtb3ZzYg0KLQltb3YJcnNpLCByZGkNCi0Jc3ViCXJzaSwgcjE1ICAgICAgICAgOyAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLw0KLQlqbXAJTF9kb19jb3B5ICAgICAgICAgICA7IC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLw0KLQ0KLUFMSUdOIDQNCi1MX2RvX2NvcHk6DQotCW1vdgllY3gsIGVheCAgICAgICAgIDsgLyogZWN4ID0gbGVuICovDQotCXJlcCAgICAgbW92c2INCi0NCi0JbW92CXJzaSwgcjggICAgICAgICAgOyAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovDQotCWptcAlMX3doaWxlX3Rlc3QNCi0NCi1MX3Rlc3RfZm9yX2VuZF9vZl9ibG9jazoNCi0JdGVzdAlhbCwgMzINCi0JanoJTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGUNCi0JbW92CWR3b3JkIHB0ciBbcnNwKzExNl0sIDENCi0Jam1wCUxfYnJlYWtfbG9vcF93aXRoX3N0YXR1cw0KLQ0KLUxfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlOg0KLQltb3YJZHdvcmQgcHRyIFtyc3ArMTE2XSwgMg0KLQlqbXAJTF9icmVha19sb29wX3dpdGhfc3RhdHVzDQotDQotTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGU6DQotCW1vdglkd29yZCBwdHIgW3JzcCsxMTZdLCAzDQotCWptcAlMX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXMNCi0NCi1MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhcjoNCi0JbW92CWR3b3JkIHB0ciBbcnNwKzExNl0sIDQNCi0Jam1wCUxfYnJlYWtfbG9vcF93aXRoX3N0YXR1cw0KLQ0KLUxfYnJlYWtfbG9vcDoNCi0JbW92CWR3b3JkIHB0ciBbcnNwKzExNl0sIDANCi0NCi1MX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXM6DQotOyAvKiBwdXQgaW4sIG91dCwgYml0cywgYW5kIGhvbGQgYmFjayBpbnRvIGFyIGFuZCBwb3AgZXNwICovDQotCW1vdglbcnNwKzE2XSwgcnNpICAgICA7IC8qIGluICovDQotCW1vdglbcnNwKzMyXSwgcmRpICAgICA7IC8qIG91dCAqLw0KLQltb3YJW3JzcCs4OF0sIGVieCAgICAgOyAvKiBiaXRzICovDQotCW1vdglbcnNwKzgwXSwgcmR4ICAgICA7IC8qIGhvbGQgKi8NCi0NCi0JbW92CXJheCwgW3JzcF0gICAgICAgOyAvKiByZXN0b3JlIHJicCBhbmQgcnNwICovDQotCW1vdglyYnAsIFtyc3ArOF0NCi0JbW92CXJzcCwgcmF4DQotDQotDQotDQotCW1vdiByc2ksW3JzcC04XQ0KLQltb3YgcmRpLFtyc3AtMTZdDQotCW1vdiByMTIsW3JzcC0yNF0NCi0JbW92IHIxMyxbcnNwLTMyXQ0KLQltb3YgcjE0LFtyc3AtNDBdDQotCW1vdiByMTUsW3JzcC00OF0NCi0JbW92IHJieCxbcnNwLTU2XQ0KLQ0KLSAgICByZXQgMA0KLTsgICAgICAgICAgOg0KLTsgICAgICAgICAgOiAibSIgKGFyKQ0KLTsgICAgICAgICAgOiAibWVtb3J5IiwgIiVyYXgiLCAiJXJieCIsICIlcmN4IiwgIiVyZHgiLCAiJXJzaSIsICIlcmRpIiwNCi07ICAgICAgICAgICAgIiVyOCIsICIlcjkiLCAiJXIxMCIsICIlcjExIiwgIiVyMTIiLCAiJXIxMyIsICIlcjE0IiwgIiVyMTUiDQotOyAgICApOw0KLQ0KLWluZmZhczg2NjRmbmMgCUVORFANCi07X1RFWFQJRU5EUw0KLUVORA0KZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvbWFzbXg2NC9yZWFkbWUudHh0IGIvc3JjL3psaWIvY29udHJpYi9tYXNteDY0L3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MjU3MWMuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9tYXNteDY0L3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1TdW1tYXJ5Ci0tLS0tLS0tCi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyBBU00gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBmdW5jdGlvbnMKLWxvbmdlc3RfbWF0Y2goKSBhbmQgaW5mbGF0ZV9mYXN0KCksIGZvciA2NCBiaXRzIHg4NiAoYm90aCBBTUQ2NCBhbmQgSW50ZWwgRU02NHQpLAotZm9yIHVzZSB3aXRoIE1pY3Jvc29mdCBNYWNybyBBc3NlbWJsZXIgKHg2NCkgZm9yIEFNRDY0IGFuZCBNaWNyb3NvZnQgQysrIDY0IGJpdHMuCi0KLWd2bWF0NjQuYXNtIGlzIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQgKDIwMDUpLCBieSB1c2luZyBCcmlhbiBSYWl0ZXIgNjg2LzMyIGJpdHMKLSAgIGFzc2VtYmx5IG9wdGltaXplZCB2ZXJzaW9uIGZyb20gSmVhbi1sb3VwIEdhaWxseSBvcmlnaW5hbCBsb25nZXN0X21hdGNoIGZ1bmN0aW9uCi0KLWluZmZhc3g2NC5hc20gYW5kIGluZmZhczg2NjQuYyB3ZXJlIHdyaXR0ZW4gYnkgQ2hyaXMgQW5kZXJzb24sIGJ5IG9wdGltaXppbmcKLSAgIG9yaWdpbmFsIGZ1bmN0aW9uIGZyb20gTWFyayBBZGxlcgotCi1Vc2UgaW5zdHJ1Y3Rpb25zCi0tLS0tLS0tLS0tLS0tLS0tCi1Bc3NlbWJsZSB0aGUgLmFzbSBmaWxlcyB1c2luZyBNQVNNIGFuZCBwdXQgdGhlIG9iamVjdCBmaWxlcyBpbnRvIHRoZSB6bGliIHNvdXJjZQotZGlyZWN0b3J5LiAgWW91IGNhbiBhbHNvIGdldCBvYmplY3QgZmlsZXMgaGVyZToKLQotICAgICBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3psaWIxMjRfbWFzbV9vYmouemlwCi0KLWRlZmluZSBBU01WIGFuZCBBU01JTkYgaW4geW91ciBwcm9qZWN0LiBJbmNsdWRlIGluZmZhczg2NjQuYyBpbiB5b3VyIHNvdXJjZSB0cmVlLAotYW5kIGluZmZhc3g2NC5vYmogYW5kIGd2bWF0NjQub2JqIGFzIG9iamVjdCB0byBsaW5rLgotCi0KLUJ1aWxkIGluc3RydWN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tCi1ydW4gYmxkXzY0LmJhdCB3aXRoIE1pY3Jvc29mdCBNYWNybyBBc3NlbWJsZXIgKHg2NCkgZm9yIEFNRDY0IChtbDY0LmV4ZSkKLQotbWw2NC5leGUgaXMgZ2l2ZW4gd2l0aCBWaXN1YWwgU3R1ZGlvIDIwMDUsIFdpbmRvd3MgMjAwMyBzZXJ2ZXIgRERLCi0KLVlvdSBjYW4gZ2V0IFdpbmRvd3MgMjAwMyBzZXJ2ZXIgRERLIHdpdGggbWw2NCBhbmQgY2wgZm9yIEFNRDY0IGZyb20KLSAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3doZGMvZGV2dG9vbHMvZGRrL2RlZmF1bHQubXNweCBmb3IgbG93IHByaWNlKQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9tYXNteDg2L2JsZF9tbDMyLmJhdCBiL3NyYy96bGliL2NvbnRyaWIvbWFzbXg4Ni9ibGRfbWwzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxYjg2YmYuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9tYXNteDg2L2JsZF9tbDMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotbWwgL2NvZmYgL1ppIC9jIC9GbG1hdGNoNjg2LmxzdCBtYXRjaDY4Ni5hc20NCi1tbCAvY29mZiAvWmkgL2MgL0ZsaW5mZmFzMzIubHN0IGluZmZhczMyLmFzbQ0KZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20gYi9zcmMvemxpYi9jb250cmliL21hc214ODYvaW5mZmFzMzIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2QyMGY4Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMDgwICswLDAgQEAKLTsvKiBpbmZmYXMzMi5hc20gaXMgYSBoYW5kIHR1bmVkIGFzc2VtYmxlciB2ZXJzaW9uIG9mIGluZmZhc3QuYyAtLSBmYXN0IGRlY29kaW5nDQotOyAqDQotOyAqIGluZmZhczMyLmFzbSBpcyBkZXJpdmF0ZWQgZnJvbSBpbmZmYXM4Ni5jLCB3aXRoIHRyYW5zbGF0aW9uIG9mIGFzc2VtYmx5IGNvZGUNCi07ICoNCi07ICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgTWFyayBBZGxlcg0KLTsgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oDQotOyAqDQotOyAqIENvcHlyaWdodCAoQykgMjAwMyBDaHJpcyBBbmRlcnNvbiA8Y2hyaXN0b3BAY2hhcm0ubmV0Pg0KLTsgKiBQbGVhc2UgdXNlIHRoZSBjb3B5cmlnaHQgY29uZGl0aW9ucyBhYm92ZS4NCi07ICoNCi07ICogTWFyLTEzLTIwMDMgLS0gTW9zdCBvZiB0aGlzIGlzIGRlcml2ZWQgZnJvbSBpbmZmYXN0LlMgd2hpY2ggaXMgZGVyaXZlZCBmcm9tDQotOyAqIHRoZSBnY2MgLVMgb3V0cHV0IG9mIHpsaWItMS4yLjAvaW5mZmFzdC5jLiAgWmxpYi0xLjIuMCBpcyBpbiBiZXRhIHJlbGVhc2UgYXQNCi07ICogdGhlIG1vbWVudC4gIEkgaGF2ZSBzdWNjZXNzZnVsbHkgY29tcGlsZWQgYW5kIHRlc3RlZCB0aGlzIGNvZGUgd2l0aCBnY2MyLjk2LA0KLTsgKiBnY2MzLjIsIGljYzUuMCwgbXN2YzYuMC4gIEl0IGlzIHZlcnkgY2xvc2UgdG8gdGhlIHNwZWVkIG9mIGluZmZhc3QuUw0KLTsgKiBjb21waWxlZCB3aXRoIGdjYyAtRE5PX01NWCwgYnV0IGluZmZhc3QuUyBpcyBzdGlsbCBmYXN0ZXIgb24gdGhlIFAzIHdpdGggTU1YDQotOyAqIGVuYWJsZWQuICBJIHdpbGwgYXR0ZW1wdCB0byBtZXJnZSB0aGUgTU1YIGNvZGUgaW50byB0aGlzIHZlcnNpb24uICBOZXdlcg0KLTsgKiB2ZXJzaW9ucyBvZiB0aGlzIGFuZCBpbmZmYXN0LlMgY2FuIGJlIGZvdW5kIGF0DQotOyAqIGh0dHA6Ly93d3cuZWV0YmVldGVlLmNvbS96bGliLyBhbmQgaHR0cDovL3d3dy5jaGFybS5uZXQvfmNocmlzdG9wL3psaWIvDQotOyAqDQotOyAqIDIwMDUgOiBtb2RpZmljYXRpb24gYnkgR2lsbGVzIFZvbGxhbnQNCi07ICovDQotOyBGb3IgVmlzdWFsIEMrKyA0LnggYW5kIGhpZ2hlciBhbmQgTUwgNi54IGFuZCBoaWdoZXINCi07ICAgbWwuZXhlIGlzIGluIGRpcmVjdG9yeSBcTUFTTTYxMUMgb2YgV2luOTUgRERLDQotOyAgIG1sLmV4ZSBpcyBhbHNvIGRpc3RyaWJ1dGVkIGluIGh0dHA6Ly93d3cubWFzbTMyLmNvbS9tYXNtZGwuaHRtDQotOyAgICBhbmQgaW4gVkMrKzIwMDMgdG9vbGtpdCBhdCBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL3Zpc3VhbGMvdmN0b29sa2l0MjAwMy8NCi07DQotOw0KLTsgICBjb21waWxlIHdpdGggY29tbWFuZCBsaW5lIG9wdGlvbg0KLTsgICBtbCAgL2NvZmYgL1ppIC9jIC9GbGluZmZhczMyLmxzdCBpbmZmYXMzMi5hc20NCi0NCi07ICAgaWYgeW91IGRlZmluZSBOT19HWklQIChzZWUgaW5mbGF0ZS5oKSwgY29tcGlsZSB3aXRoDQotOyAgIG1sICAvY29mZiAvWmkgL2MgL0ZsaW5mZmFzMzIubHN0IC9ETk9fR1VOWklQIGluZmZhczMyLmFzbQ0KLQ0KLQ0KLTsgemxpYjEyMnN1cCBpcyAwIGZvcnQgemxpYiAxLjIuMi4xIGFuZCBsb3dlcg0KLTsgemxpYjEyMnN1cCBpcyA4IGZvcnQgemxpYiAxLjIuMi4yIGFuZCBtb3JlICh3aXRoIGFkZGl0aW9uIG9mIGRtYXggYW5kIGhlYWQNCi07ICAgICAgICBpbiBpbmZsYXRlX3N0YXRlIGluIGluZmxhdGUuaCkNCi16bGliMTIyMnN1cCAgICAgIGVxdSAgICA4DQotDQotDQotSUZERUYgR1VOWklQDQotICBJTkZMQVRFX01PREVfVFlQRSAgICBlcXUgMTENCi0gIElORkxBVEVfTU9ERV9CQUQgICAgIGVxdSAyNg0KLUVMU0UNCi0gIElGTkRFRiBOT19HVU5aSVANCi0gICAgSU5GTEFURV9NT0RFX1RZUEUgICAgZXF1IDExDQotICAgIElORkxBVEVfTU9ERV9CQUQgICAgIGVxdSAyNg0KLSAgRUxTRQ0KLSAgICBJTkZMQVRFX01PREVfVFlQRSAgICBlcXUgMw0KLSAgICBJTkZMQVRFX01PREVfQkFEICAgICBlcXUgMTcNCi0gIEVORElGDQotRU5ESUYNCi0NCi0NCi07IDc1ICJpbmZmYXN0LlMiDQotO0ZJTEUgImluZmZhc3QuUyINCi0NCi07OztHTE9CQUwgX2luZmxhdGVfZmFzdA0KLQ0KLTs7O1NFQ1RJT04gLnRleHQNCi0NCi0NCi0NCi0JLjU4NnANCi0JLm1teA0KLQ0KLQluYW1lCWluZmxhdGVfZmFzdF94ODYNCi0JLk1PREVMCUZMQVQNCi0NCi1fREFUQQkJCXNlZ21lbnQNCi1pbmZsYXRlX2Zhc3RfdXNlX21teDoNCi0JZGQJMQ0KLQ0KLQ0KLV9URVhUCQkJc2VnbWVudA0KLQ0KLQ0KLQ0KLUFMSUdOIDQNCi0JZGIJJ0Zhc3QgZGVjb2RpbmcgQ29kZSBmcm9tIENocmlzIEFuZGVyc29uJw0KLQlkYgkwDQotDQotQUxJR04gNA0KLWludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZV9tc2c6DQotCWRiCSdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnDQotCWRiCTANCi0NCi1BTElHTiA0DQotaW52YWxpZF9kaXN0YW5jZV9jb2RlX21zZzoNCi0JZGIJJ2ludmFsaWQgZGlzdGFuY2UgY29kZScNCi0JZGIJMA0KLQ0KLUFMSUdOIDQNCi1pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXJfbXNnOg0KLQlkYgknaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snDQotCWRiCTANCi0NCi0NCi1BTElHTiA0DQotaW5mbGF0ZV9mYXN0X21hc2s6DQotZGQJMA0KLWRkCTENCi1kZAkzDQotZGQJNw0KLWRkCTE1DQotZGQJMzENCi1kZAk2Mw0KLWRkCTEyNw0KLWRkCTI1NQ0KLWRkCTUxMQ0KLWRkCTEwMjMNCi1kZAkyMDQ3DQotZGQJNDA5NQ0KLWRkCTgxOTENCi1kZAkxNjM4Mw0KLWRkCTMyNzY3DQotZGQJNjU1MzUNCi1kZAkxMzEwNzENCi1kZAkyNjIxNDMNCi1kZAk1MjQyODcNCi1kZAkxMDQ4NTc1DQotZGQJMjA5NzE1MQ0KLWRkCTQxOTQzMDMNCi1kZAk4Mzg4NjA3DQotZGQJMTY3NzcyMTUNCi1kZAkzMzU1NDQzMQ0KLWRkCTY3MTA4ODYzDQotZGQJMTM0MjE3NzI3DQotZGQJMjY4NDM1NDU1DQotZGQJNTM2ODcwOTExDQotZGQJMTA3Mzc0MTgyMw0KLWRkCTIxNDc0ODM2NDcNCi1kZAk0Mjk0OTY3Mjk1DQotDQotDQotbW9kZV9zdGF0ZQkgZXF1CTAJOy8qIHN0YXRlLT5tb2RlCSovDQotd3NpemVfc3RhdGUJIGVxdQkoMzIremxpYjEyMjJzdXApCTsvKiBzdGF0ZS0+d3NpemUgKi8NCi13cml0ZV9zdGF0ZQkgZXF1CSgzNis0K3psaWIxMjIyc3VwKQk7Lyogc3RhdGUtPndyaXRlICovDQotd2luZG93X3N0YXRlCSBlcXUJKDQwKzQremxpYjEyMjJzdXApCTsvKiBzdGF0ZS0+d2luZG93ICovDQotaG9sZF9zdGF0ZQkgZXF1CSg0NCs0K3psaWIxMjIyc3VwKQk7Lyogc3RhdGUtPmhvbGQJKi8NCi1iaXRzX3N0YXRlCSBlcXUJKDQ4KzQremxpYjEyMjJzdXApCTsvKiBzdGF0ZS0+Yml0cwkqLw0KLWxlbmNvZGVfc3RhdGUJIGVxdQkoNjQrNCt6bGliMTIyMnN1cCkJOy8qIHN0YXRlLT5sZW5jb2RlICovDQotZGlzdGNvZGVfc3RhdGUJIGVxdQkoNjgrNCt6bGliMTIyMnN1cCkJOy8qIHN0YXRlLT5kaXN0Y29kZSAqLw0KLWxlbmJpdHNfc3RhdGUJIGVxdQkoNzIrNCt6bGliMTIyMnN1cCkJOy8qIHN0YXRlLT5sZW5iaXRzICovDQotZGlzdGJpdHNfc3RhdGUJIGVxdQkoNzYrNCt6bGliMTIyMnN1cCkJOy8qIHN0YXRlLT5kaXN0Yml0cyAqLw0KLQ0KLQ0KLTs7U0VDVElPTiAudGV4dA0KLTsgMjA1ICJpbmZmYXN0LlMiDQotO0dMT0JBTAlpbmZsYXRlX2Zhc3RfdXNlX21teA0KLQ0KLTtTRUNUSU9OIC5kYXRhDQotDQotDQotOyBHTE9CQUwgaW5mbGF0ZV9mYXN0X3VzZV9tbXg6b2JqZWN0DQotOy5zaXplIGluZmxhdGVfZmFzdF91c2VfbW14LCA0DQotOyAyMjYgImluZmZhc3QuUyINCi07U0VDVElPTiAudGV4dA0KLQ0KLUFMSUdOIDQNCi1faW5mbGF0ZV9mYXN0IHByb2MgbmVhcg0KLS5GUE8gKDE2LCA0LCAwLCAwLCAxLCAwKQ0KLQlwdXNoICBlZGkNCi0JcHVzaCAgZXNpDQotCXB1c2ggIGVicA0KLQlwdXNoICBlYngNCi0JcHVzaGZkDQotCXN1YiAgZXNwLDY0DQotCWNsZA0KLQ0KLQ0KLQ0KLQ0KLQltb3YgIGVzaSwgW2VzcCs4OF0NCi0JbW92ICBlZGksIFtlc2krMjhdDQotDQotDQotDQotDQotDQotDQotDQotCW1vdiAgZWR4LCBbZXNpKzRdDQotCW1vdiAgZWF4LCBbZXNpKzBdDQotDQotCWFkZCAgZWR4LGVheA0KLQlzdWIgIGVkeCwxMQ0KLQ0KLQltb3YgIFtlc3ArNDRdLGVheA0KLQltb3YgIFtlc3ArMjBdLGVkeA0KLQ0KLQltb3YgIGVicCwgW2VzcCs5Ml0NCi0JbW92ICBlY3gsIFtlc2krMTZdDQotCW1vdiAgZWJ4LCBbZXNpKzEyXQ0KLQ0KLQlzdWIgIGVicCxlY3gNCi0JbmVnICBlYnANCi0JYWRkICBlYnAsZWJ4DQotDQotCXN1YiAgZWN4LDI1Nw0KLQlhZGQgIGVjeCxlYngNCi0NCi0JbW92ICBbZXNwKzYwXSxlYngNCi0JbW92ICBbZXNwKzQwXSxlYnANCi0JbW92ICBbZXNwKzE2XSxlY3gNCi07IDI4NSAiaW5mZmFzdC5TIg0KLQltb3YgIGVheCwgW2VkaStsZW5jb2RlX3N0YXRlXQ0KLQltb3YgIGVjeCwgW2VkaStkaXN0Y29kZV9zdGF0ZV0NCi0NCi0JbW92ICBbZXNwKzhdLGVheA0KLQltb3YgIFtlc3ArMTJdLGVjeA0KLQ0KLQltb3YgIGVheCwxDQotCW1vdiAgZWN4LCBbZWRpK2xlbmJpdHNfc3RhdGVdDQotCXNobCAgZWF4LGNsDQotCWRlYyAgZWF4DQotCW1vdiAgW2VzcCswXSxlYXgNCi0NCi0JbW92ICBlYXgsMQ0KLQltb3YgIGVjeCwgW2VkaStkaXN0Yml0c19zdGF0ZV0NCi0Jc2hsICBlYXgsY2wNCi0JZGVjICBlYXgNCi0JbW92ICBbZXNwKzRdLGVheA0KLQ0KLQltb3YgIGVheCwgW2VkaSt3c2l6ZV9zdGF0ZV0NCi0JbW92ICBlY3gsIFtlZGkrd3JpdGVfc3RhdGVdDQotCW1vdiAgZWR4LCBbZWRpK3dpbmRvd19zdGF0ZV0NCi0NCi0JbW92ICBbZXNwKzUyXSxlYXgNCi0JbW92ICBbZXNwKzQ4XSxlY3gNCi0JbW92ICBbZXNwKzU2XSxlZHgNCi0NCi0JbW92ICBlYnAsIFtlZGkraG9sZF9zdGF0ZV0NCi0JbW92ICBlYngsIFtlZGkrYml0c19zdGF0ZV0NCi07IDMyMSAiaW5mZmFzdC5TIg0KLQltb3YgIGVzaSwgW2VzcCs0NF0NCi0JbW92ICBlY3gsIFtlc3ArMjBdDQotCWNtcCAgZWN4LGVzaQ0KLQlqYSAgIExfYWxpZ25fbG9uZw0KLQ0KLQlhZGQgIGVjeCwxMQ0KLQlzdWIgIGVjeCxlc2kNCi0JbW92ICBlYXgsMTINCi0Jc3ViICBlYXgsZWN4DQotCWxlYSAgZWRpLCBbZXNwKzI4XQ0KLQlyZXAgbW92c2INCi0JbW92ICBlY3gsZWF4DQotCXhvciAgZWF4LGVheA0KLQlyZXAgc3Rvc2INCi0JbGVhICBlc2ksIFtlc3ArMjhdDQotCW1vdiAgW2VzcCsyMF0sZXNpDQotCWptcCAgTF9pc19hbGlnbmVkDQotDQotDQotTF9hbGlnbl9sb25nOg0KLQl0ZXN0ICBlc2ksMw0KLQlqeiAgIExfaXNfYWxpZ25lZA0KLQl4b3IgIGVheCxlYXgNCi0JbW92ICBhbCwgW2VzaV0NCi0JaW5jICBlc2kNCi0JbW92ICBlY3gsZWJ4DQotCWFkZCAgZWJ4LDgNCi0Jc2hsICBlYXgsY2wNCi0Jb3IgIGVicCxlYXgNCi0Jam1wIExfYWxpZ25fbG9uZw0KLQ0KLUxfaXNfYWxpZ25lZDoNCi0JbW92ICBlZGksIFtlc3ArNjBdDQotOyAzNjYgImluZmZhc3QuUyINCi1MX2NoZWNrX21teDoNCi0JY21wICBkd29yZCBwdHIgW2luZmxhdGVfZmFzdF91c2VfbW14XSwyDQotCWplICAgTF9pbml0X21teA0KLQlqYSAgIExfZG9fbG9vcA0KLQ0KLQlwdXNoICBlYXgNCi0JcHVzaCAgZWJ4DQotCXB1c2ggIGVjeA0KLQlwdXNoICBlZHgNCi0JcHVzaGZkDQotCW1vdiAgZWF4LCBbZXNwXQ0KLQl4b3IgIGR3b3JkIHB0ciBbZXNwXSwwMjAwMDAwaA0KLQ0KLQ0KLQ0KLQ0KLQlwb3BmZA0KLQlwdXNoZmQNCi0JcG9wICBlZHgNCi0JeG9yICBlZHgsZWF4DQotCWp6ICAgTF9kb250X3VzZV9tbXgNCi0JeG9yICBlYXgsZWF4DQotCWNwdWlkDQotCWNtcCAgZWJ4LDA3NTZlNjU0N2gNCi0Jam5lICBMX2RvbnRfdXNlX21teA0KLQljbXAgIGVjeCwwNmM2NTc0NmVoDQotCWpuZSAgTF9kb250X3VzZV9tbXgNCi0JY21wICBlZHgsMDQ5NjU2ZTY5aA0KLQlqbmUgIExfZG9udF91c2VfbW14DQotCW1vdiAgZWF4LDENCi0JY3B1aWQNCi0Jc2hyICBlYXgsOA0KLQlhbmQgIGVheCwxNQ0KLQljbXAgIGVheCw2DQotCWpuZSAgTF9kb250X3VzZV9tbXgNCi0JdGVzdCAgZWR4LDA4MDAwMDBoDQotCWpueiAgTF91c2VfbW14DQotCWptcCAgTF9kb250X3VzZV9tbXgNCi1MX3VzZV9tbXg6DQotCW1vdiAgZHdvcmQgcHRyIFtpbmZsYXRlX2Zhc3RfdXNlX21teF0sMg0KLQlqbXAgIExfY2hlY2tfbW14X3BvcA0KLUxfZG9udF91c2VfbW14Og0KLQltb3YgIGR3b3JkIHB0ciBbaW5mbGF0ZV9mYXN0X3VzZV9tbXhdLDMNCi1MX2NoZWNrX21teF9wb3A6DQotCXBvcCAgZWR4DQotCXBvcCAgZWN4DQotCXBvcCAgZWJ4DQotCXBvcCAgZWF4DQotCWptcCAgTF9jaGVja19tbXgNCi07IDQyNiAiaW5mZmFzdC5TIg0KLUFMSUdOIDQNCi1MX2RvX2xvb3A6DQotOyA0MzcgImluZmZhc3QuUyINCi0JY21wICBibCwxNQ0KLQlqYSAgIExfZ2V0X2xlbmd0aF9jb2RlDQotDQotCXhvciAgZWF4LGVheA0KLQlsb2Rzdw0KLQltb3YgIGNsLGJsDQotCWFkZCAgYmwsMTYNCi0Jc2hsICBlYXgsY2wNCi0Jb3IgIGVicCxlYXgNCi0NCi1MX2dldF9sZW5ndGhfY29kZToNCi0JbW92ICBlZHgsIFtlc3ArMF0NCi0JbW92ICBlY3gsIFtlc3ArOF0NCi0JYW5kICBlZHgsZWJwDQotCW1vdiAgZWF4LCBbZWN4K2VkeCo0XQ0KLQ0KLUxfZG9sZW46DQotDQotDQotDQotDQotDQotDQotCW1vdiAgY2wsYWgNCi0Jc3ViICBibCxhaA0KLQlzaHIgIGVicCxjbA0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQl0ZXN0ICBhbCxhbA0KLQlqbnogICBMX3Rlc3RfZm9yX2xlbmd0aF9iYXNlDQotDQotCXNociAgZWF4LDE2DQotCXN0b3NiDQotDQotTF93aGlsZV90ZXN0Og0KLQ0KLQ0KLQljbXAgIFtlc3ArMTZdLGVkaQ0KLQlqYmUgIExfYnJlYWtfbG9vcA0KLQ0KLQljbXAgIFtlc3ArMjBdLGVzaQ0KLQlqYSAgIExfZG9fbG9vcA0KLQlqbXAgIExfYnJlYWtfbG9vcA0KLQ0KLUxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2U6DQotOyA1MDIgImluZmZhc3QuUyINCi0JbW92ICBlZHgsZWF4DQotCXNociAgZWR4LDE2DQotCW1vdiAgY2wsYWwNCi0NCi0JdGVzdCAgYWwsMTYNCi0JanogICBMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGgNCi0JYW5kICBjbCwxNQ0KLQlqeiAgIExfc2F2ZV9sZW4NCi0JY21wICBibCxjbA0KLQlqYWUgIExfYWRkX2JpdHNfdG9fbGVuDQotDQotCW1vdiAgY2gsY2wNCi0JeG9yICBlYXgsZWF4DQotCWxvZHN3DQotCW1vdiAgY2wsYmwNCi0JYWRkICBibCwxNg0KLQlzaGwgIGVheCxjbA0KLQlvciAgZWJwLGVheA0KLQltb3YgIGNsLGNoDQotDQotTF9hZGRfYml0c190b19sZW46DQotCW1vdiAgZWF4LDENCi0Jc2hsICBlYXgsY2wNCi0JZGVjICBlYXgNCi0Jc3ViICBibCxjbA0KLQlhbmQgIGVheCxlYnANCi0Jc2hyICBlYnAsY2wNCi0JYWRkICBlZHgsZWF4DQotDQotTF9zYXZlX2xlbjoNCi0JbW92ICBbZXNwKzI0XSxlZHgNCi0NCi0NCi1MX2RlY29kZV9kaXN0YW5jZToNCi07IDU0OSAiaW5mZmFzdC5TIg0KLQljbXAgIGJsLDE1DQotCWphICAgTF9nZXRfZGlzdGFuY2VfY29kZQ0KLQ0KLQl4b3IgIGVheCxlYXgNCi0JbG9kc3cNCi0JbW92ICBjbCxibA0KLQlhZGQgIGJsLDE2DQotCXNobCAgZWF4LGNsDQotCW9yICBlYnAsZWF4DQotDQotTF9nZXRfZGlzdGFuY2VfY29kZToNCi0JbW92ICBlZHgsIFtlc3ArNF0NCi0JbW92ICBlY3gsIFtlc3ArMTJdDQotCWFuZCAgZWR4LGVicA0KLQltb3YgIGVheCwgW2VjeCtlZHgqNF0NCi0NCi0NCi1MX2RvZGlzdDoNCi0JbW92ICBlZHgsZWF4DQotCXNociAgZWR4LDE2DQotCW1vdiAgY2wsYWgNCi0Jc3ViICBibCxhaA0KLQlzaHIgIGVicCxjbA0KLTsgNTg0ICJpbmZmYXN0LlMiDQotCW1vdiAgY2wsYWwNCi0NCi0JdGVzdCAgYWwsMTYNCi0JanogIExfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3QNCi0JYW5kICBjbCwxNQ0KLQlqeiAgTF9jaGVja19kaXN0X29uZQ0KLQljbXAgIGJsLGNsDQotCWphZSAgTF9hZGRfYml0c190b19kaXN0DQotDQotCW1vdiAgY2gsY2wNCi0JeG9yICBlYXgsZWF4DQotCWxvZHN3DQotCW1vdiAgY2wsYmwNCi0JYWRkICBibCwxNg0KLQlzaGwgIGVheCxjbA0KLQlvciAgZWJwLGVheA0KLQltb3YgIGNsLGNoDQotDQotTF9hZGRfYml0c190b19kaXN0Og0KLQltb3YgIGVheCwxDQotCXNobCAgZWF4LGNsDQotCWRlYyAgZWF4DQotCXN1YiAgYmwsY2wNCi0JYW5kICBlYXgsZWJwDQotCXNociAgZWJwLGNsDQotCWFkZCAgZWR4LGVheA0KLQlqbXAgIExfY2hlY2tfd2luZG93DQotDQotTF9jaGVja193aW5kb3c6DQotOyA2MjUgImluZmZhc3QuUyINCi0JbW92ICBbZXNwKzQ0XSxlc2kNCi0JbW92ICBlYXgsZWRpDQotCXN1YiAgZWF4LCBbZXNwKzQwXQ0KLQ0KLQljbXAgIGVheCxlZHgNCi0JamIgICBMX2NsaXBfd2luZG93DQotDQotCW1vdiAgZWN4LCBbZXNwKzI0XQ0KLQltb3YgIGVzaSxlZGkNCi0Jc3ViICBlc2ksZWR4DQotDQotCXN1YiAgZWN4LDMNCi0JbW92ICBhbCwgW2VzaV0NCi0JbW92ICBbZWRpXSxhbA0KLQltb3YgIGFsLCBbZXNpKzFdDQotCW1vdiAgZGwsIFtlc2krMl0NCi0JYWRkICBlc2ksMw0KLQltb3YgIFtlZGkrMV0sYWwNCi0JbW92ICBbZWRpKzJdLGRsDQotCWFkZCAgZWRpLDMNCi0JcmVwIG1vdnNiDQotDQotCW1vdiAgZXNpLCBbZXNwKzQ0XQ0KLQlqbXAgIExfd2hpbGVfdGVzdA0KLQ0KLUFMSUdOIDQNCi1MX2NoZWNrX2Rpc3Rfb25lOg0KLQljbXAgIGVkeCwxDQotCWpuZSAgTF9jaGVja193aW5kb3cNCi0JY21wICBbZXNwKzQwXSxlZGkNCi0JamUgIExfY2hlY2tfd2luZG93DQotDQotCWRlYyAgZWRpDQotCW1vdiAgZWN4LCBbZXNwKzI0XQ0KLQltb3YgIGFsLCBbZWRpXQ0KLQlzdWIgIGVjeCwzDQotDQotCW1vdiAgW2VkaSsxXSxhbA0KLQltb3YgIFtlZGkrMl0sYWwNCi0JbW92ICBbZWRpKzNdLGFsDQotCWFkZCAgZWRpLDQNCi0JcmVwIHN0b3NiDQotDQotCWptcCAgTF93aGlsZV90ZXN0DQotDQotQUxJR04gNA0KLUxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aDoNCi0NCi0NCi0NCi0NCi0JdGVzdCAgYWwsNjQNCi0Jam56ICAgTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2sNCi0NCi0JbW92ICBlYXgsMQ0KLQlzaGwgIGVheCxjbA0KLQlkZWMgIGVheA0KLQlhbmQgIGVheCxlYnANCi0JYWRkICBlYXgsZWR4DQotCW1vdiAgZWR4LCBbZXNwKzhdDQotCW1vdiAgZWF4LCBbZWR4K2VheCo0XQ0KLQlqbXAgIExfZG9sZW4NCi0NCi1BTElHTiA0DQotTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdDoNCi0NCi0NCi0NCi0NCi0JdGVzdCAgYWwsNjQNCi0Jam56ICAgTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGUNCi0NCi0JbW92ICBlYXgsMQ0KLQlzaGwgIGVheCxjbA0KLQlkZWMgIGVheA0KLQlhbmQgIGVheCxlYnANCi0JYWRkICBlYXgsZWR4DQotCW1vdiAgZWR4LCBbZXNwKzEyXQ0KLQltb3YgIGVheCwgW2VkeCtlYXgqNF0NCi0Jam1wICBMX2RvZGlzdA0KLQ0KLUFMSUdOIDQNCi1MX2NsaXBfd2luZG93Og0KLTsgNzIxICJpbmZmYXN0LlMiDQotCW1vdiAgZWN4LGVheA0KLQltb3YgIGVheCwgW2VzcCs1Ml0NCi0JbmVnICBlY3gNCi0JbW92ICBlc2ksIFtlc3ArNTZdDQotDQotCWNtcCAgZWF4LGVkeA0KLQlqYiAgIExfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyDQotDQotCWFkZCAgZWN4LGVkeA0KLQljbXAgIGR3b3JkIHB0ciBbZXNwKzQ4XSwwDQotCWpuZSAgTF93cmFwX2Fyb3VuZF93aW5kb3cNCi0NCi0Jc3ViICBlYXgsZWN4DQotCWFkZCAgZXNpLGVheA0KLTsgNzQ5ICJpbmZmYXN0LlMiDQotCW1vdiAgZWF4LCBbZXNwKzI0XQ0KLQljbXAgIGVheCxlY3gNCi0JamJlICBMX2RvX2NvcHkxDQotDQotCXN1YiAgZWF4LGVjeA0KLQlyZXAgbW92c2INCi0JbW92ICBlc2ksZWRpDQotCXN1YiAgZXNpLGVkeA0KLQlqbXAgIExfZG9fY29weTENCi0NCi0JY21wICBlYXgsZWN4DQotCWpiZSAgTF9kb19jb3B5MQ0KLQ0KLQlzdWIgIGVheCxlY3gNCi0JcmVwIG1vdnNiDQotCW1vdiAgZXNpLGVkaQ0KLQlzdWIgIGVzaSxlZHgNCi0Jam1wICBMX2RvX2NvcHkxDQotDQotTF93cmFwX2Fyb3VuZF93aW5kb3c6DQotOyA3OTMgImluZmZhc3QuUyINCi0JbW92ICBlYXgsIFtlc3ArNDhdDQotCWNtcCAgZWN4LGVheA0KLQlqYmUgIExfY29udGlndW91c19pbl93aW5kb3cNCi0NCi0JYWRkICBlc2ksIFtlc3ArNTJdDQotCWFkZCAgZXNpLGVheA0KLQlzdWIgIGVzaSxlY3gNCi0Jc3ViICBlY3gsZWF4DQotDQotDQotCW1vdiAgZWF4LCBbZXNwKzI0XQ0KLQljbXAgIGVheCxlY3gNCi0JamJlICBMX2RvX2NvcHkxDQotDQotCXN1YiAgZWF4LGVjeA0KLQlyZXAgbW92c2INCi0JbW92ICBlc2ksIFtlc3ArNTZdDQotCW1vdiAgZWN4LCBbZXNwKzQ4XQ0KLQljbXAgIGVheCxlY3gNCi0JamJlICBMX2RvX2NvcHkxDQotDQotCXN1YiAgZWF4LGVjeA0KLQlyZXAgbW92c2INCi0JbW92ICBlc2ksZWRpDQotCXN1YiAgZXNpLGVkeA0KLQlqbXAgIExfZG9fY29weTENCi0NCi1MX2NvbnRpZ3VvdXNfaW5fd2luZG93Og0KLTsgODM2ICJpbmZmYXN0LlMiDQotCWFkZCAgZXNpLGVheA0KLQlzdWIgIGVzaSxlY3gNCi0NCi0NCi0JbW92ICBlYXgsIFtlc3ArMjRdDQotCWNtcCAgZWF4LGVjeA0KLQlqYmUgIExfZG9fY29weTENCi0NCi0Jc3ViICBlYXgsZWN4DQotCXJlcCBtb3ZzYg0KLQltb3YgIGVzaSxlZGkNCi0Jc3ViICBlc2ksZWR4DQotDQotTF9kb19jb3B5MToNCi07IDg2MiAiaW5mZmFzdC5TIg0KLQltb3YgIGVjeCxlYXgNCi0JcmVwIG1vdnNiDQotDQotCW1vdiAgZXNpLCBbZXNwKzQ0XQ0KLQlqbXAgIExfd2hpbGVfdGVzdA0KLTsgODc4ICJpbmZmYXN0LlMiDQotQUxJR04gNA0KLUxfaW5pdF9tbXg6DQotCWVtbXMNCi0NCi0NCi0NCi0NCi0NCi0JbW92ZCBtbTAsZWJwDQotCW1vdiAgZWJwLGVieA0KLTsgODk2ICJpbmZmYXN0LlMiDQotCW1vdmQgbW00LGR3b3JkIHB0ciBbZXNwKzBdDQotCW1vdnEgbW0zLG1tNA0KLQltb3ZkIG1tNSxkd29yZCBwdHIgW2VzcCs0XQ0KLQltb3ZxIG1tMixtbTUNCi0JcHhvciBtbTEsbW0xDQotCW1vdiAgZWJ4LCBbZXNwKzhdDQotCWptcCAgTF9kb19sb29wX21teA0KLQ0KLUFMSUdOIDQNCi1MX2RvX2xvb3BfbW14Og0KLQlwc3JscSBtbTAsbW0xDQotDQotCWNtcCAgZWJwLDMyDQotCWphICBMX2dldF9sZW5ndGhfY29kZV9tbXgNCi0NCi0JbW92ZCBtbTYsZWJwDQotCW1vdmQgbW03LGR3b3JkIHB0ciBbZXNpXQ0KLQlhZGQgIGVzaSw0DQotCXBzbGxxIG1tNyxtbTYNCi0JYWRkICBlYnAsMzINCi0JcG9yIG1tMCxtbTcNCi0NCi1MX2dldF9sZW5ndGhfY29kZV9tbXg6DQotCXBhbmQgbW00LG1tMA0KLQltb3ZkIGVheCxtbTQNCi0JbW92cSBtbTQsbW0zDQotCW1vdiAgZWF4LCBbZWJ4K2VheCo0XQ0KLQ0KLUxfZG9sZW5fbW14Og0KLQltb3Z6eCAgZWN4LGFoDQotCW1vdmQgbW0xLGVjeA0KLQlzdWIgIGVicCxlY3gNCi0NCi0JdGVzdCAgYWwsYWwNCi0Jam56IExfdGVzdF9mb3JfbGVuZ3RoX2Jhc2VfbW14DQotDQotCXNociAgZWF4LDE2DQotCXN0b3NiDQotDQotTF93aGlsZV90ZXN0X21teDoNCi0NCi0NCi0JY21wICBbZXNwKzE2XSxlZGkNCi0JamJlIExfYnJlYWtfbG9vcA0KLQ0KLQljbXAgIFtlc3ArMjBdLGVzaQ0KLQlqYSBMX2RvX2xvb3BfbW14DQotCWptcCBMX2JyZWFrX2xvb3ANCi0NCi1MX3Rlc3RfZm9yX2xlbmd0aF9iYXNlX21teDoNCi0NCi0JbW92ICBlZHgsZWF4DQotCXNociAgZWR4LDE2DQotDQotCXRlc3QgIGFsLDE2DQotCWp6ICBMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGhfbW14DQotCWFuZCAgZWF4LDE1DQotCWp6IExfZGVjb2RlX2Rpc3RhbmNlX21teA0KLQ0KLQlwc3JscSBtbTAsbW0xDQotCW1vdmQgbW0xLGVheA0KLQltb3ZkIGVjeCxtbTANCi0Jc3ViICBlYnAsZWF4DQotCWFuZCAgZWN4LCBbaW5mbGF0ZV9mYXN0X21hc2srZWF4KjRdDQotCWFkZCAgZWR4LGVjeA0KLQ0KLUxfZGVjb2RlX2Rpc3RhbmNlX21teDoNCi0JcHNybHEgbW0wLG1tMQ0KLQ0KLQljbXAgIGVicCwzMg0KLQlqYSBMX2dldF9kaXN0X2NvZGVfbW14DQotDQotCW1vdmQgbW02LGVicA0KLQltb3ZkIG1tNyxkd29yZCBwdHIgW2VzaV0NCi0JYWRkICBlc2ksNA0KLQlwc2xscSBtbTcsbW02DQotCWFkZCAgZWJwLDMyDQotCXBvciBtbTAsbW03DQotDQotTF9nZXRfZGlzdF9jb2RlX21teDoNCi0JbW92ICBlYngsIFtlc3ArMTJdDQotCXBhbmQgbW01LG1tMA0KLQltb3ZkIGVheCxtbTUNCi0JbW92cSBtbTUsbW0yDQotCW1vdiAgZWF4LCBbZWJ4K2VheCo0XQ0KLQ0KLUxfZG9kaXN0X21teDoNCi0NCi0JbW92enggIGVjeCxhaA0KLQltb3YgIGVieCxlYXgNCi0Jc2hyICBlYngsMTYNCi0Jc3ViICBlYnAsZWN4DQotCW1vdmQgbW0xLGVjeA0KLQ0KLQl0ZXN0ICBhbCwxNg0KLQlqeiBMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0X21teA0KLQlhbmQgIGVheCwxNQ0KLQlqeiBMX2NoZWNrX2Rpc3Rfb25lX21teA0KLQ0KLUxfYWRkX2JpdHNfdG9fZGlzdF9tbXg6DQotCXBzcmxxIG1tMCxtbTENCi0JbW92ZCBtbTEsZWF4DQotCW1vdmQgZWN4LG1tMA0KLQlzdWIgIGVicCxlYXgNCi0JYW5kICBlY3gsIFtpbmZsYXRlX2Zhc3RfbWFzaytlYXgqNF0NCi0JYWRkICBlYngsZWN4DQotDQotTF9jaGVja193aW5kb3dfbW14Og0KLQltb3YgIFtlc3ArNDRdLGVzaQ0KLQltb3YgIGVheCxlZGkNCi0Jc3ViICBlYXgsIFtlc3ArNDBdDQotDQotCWNtcCAgZWF4LGVieA0KLQlqYiBMX2NsaXBfd2luZG93X21teA0KLQ0KLQltb3YgIGVjeCxlZHgNCi0JbW92ICBlc2ksZWRpDQotCXN1YiAgZXNpLGVieA0KLQ0KLQlzdWIgIGVjeCwzDQotCW1vdiAgYWwsIFtlc2ldDQotCW1vdiAgW2VkaV0sYWwNCi0JbW92ICBhbCwgW2VzaSsxXQ0KLQltb3YgIGRsLCBbZXNpKzJdDQotCWFkZCAgZXNpLDMNCi0JbW92ICBbZWRpKzFdLGFsDQotCW1vdiAgW2VkaSsyXSxkbA0KLQlhZGQgIGVkaSwzDQotCXJlcCBtb3ZzYg0KLQ0KLQltb3YgIGVzaSwgW2VzcCs0NF0NCi0JbW92ICBlYngsIFtlc3ArOF0NCi0Jam1wICBMX3doaWxlX3Rlc3RfbW14DQotDQotQUxJR04gNA0KLUxfY2hlY2tfZGlzdF9vbmVfbW14Og0KLQljbXAgIGVieCwxDQotCWpuZSAgTF9jaGVja193aW5kb3dfbW14DQotCWNtcCAgW2VzcCs0MF0sZWRpDQotCWplICAgTF9jaGVja193aW5kb3dfbW14DQotDQotCWRlYyAgZWRpDQotCW1vdiAgZWN4LGVkeA0KLQltb3YgIGFsLCBbZWRpXQ0KLQlzdWIgIGVjeCwzDQotDQotCW1vdiAgW2VkaSsxXSxhbA0KLQltb3YgIFtlZGkrMl0sYWwNCi0JbW92ICBbZWRpKzNdLGFsDQotCWFkZCAgZWRpLDQNCi0JcmVwIHN0b3NiDQotDQotCW1vdiAgZWJ4LCBbZXNwKzhdDQotCWptcCAgTF93aGlsZV90ZXN0X21teA0KLQ0KLUFMSUdOIDQNCi1MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGhfbW14Og0KLQl0ZXN0ICBhbCw2NA0KLQlqbnogTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2sNCi0NCi0JYW5kICBlYXgsMTUNCi0JcHNybHEgbW0wLG1tMQ0KLQltb3ZkIGVjeCxtbTANCi0JYW5kICBlY3gsIFtpbmZsYXRlX2Zhc3RfbWFzaytlYXgqNF0NCi0JYWRkICBlY3gsZWR4DQotCW1vdiAgZWF4LCBbZWJ4K2VjeCo0XQ0KLQlqbXAgTF9kb2xlbl9tbXgNCi0NCi1BTElHTiA0DQotTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdF9tbXg6DQotCXRlc3QgIGFsLDY0DQotCWpueiBMX2ludmFsaWRfZGlzdGFuY2VfY29kZQ0KLQ0KLQlhbmQgIGVheCwxNQ0KLQlwc3JscSBtbTAsbW0xDQotCW1vdmQgZWN4LG1tMA0KLQlhbmQgIGVjeCwgW2luZmxhdGVfZmFzdF9tYXNrK2VheCo0XQ0KLQltb3YgIGVheCwgW2VzcCsxMl0NCi0JYWRkICBlY3gsZWJ4DQotCW1vdiAgZWF4LCBbZWF4K2VjeCo0XQ0KLQlqbXAgIExfZG9kaXN0X21teA0KLQ0KLUFMSUdOIDQNCi1MX2NsaXBfd2luZG93X21teDoNCi0NCi0JbW92ICBlY3gsZWF4DQotCW1vdiAgZWF4LCBbZXNwKzUyXQ0KLQluZWcgIGVjeA0KLQltb3YgIGVzaSwgW2VzcCs1Nl0NCi0NCi0JY21wICBlYXgsZWJ4DQotCWpiICBMX2ludmFsaWRfZGlzdGFuY2VfdG9vX2Zhcg0KLQ0KLQlhZGQgIGVjeCxlYngNCi0JY21wICBkd29yZCBwdHIgW2VzcCs0OF0sMA0KLQlqbmUgIExfd3JhcF9hcm91bmRfd2luZG93X21teA0KLQ0KLQlzdWIgIGVheCxlY3gNCi0JYWRkICBlc2ksZWF4DQotDQotCWNtcCAgZWR4LGVjeA0KLQlqYmUgIExfZG9fY29weTFfbW14DQotDQotCXN1YiAgZWR4LGVjeA0KLQlyZXAgbW92c2INCi0JbW92ICBlc2ksZWRpDQotCXN1YiAgZXNpLGVieA0KLQlqbXAgIExfZG9fY29weTFfbW14DQotDQotCWNtcCAgZWR4LGVjeA0KLQlqYmUgIExfZG9fY29weTFfbW14DQotDQotCXN1YiAgZWR4LGVjeA0KLQlyZXAgbW92c2INCi0JbW92ICBlc2ksZWRpDQotCXN1YiAgZXNpLGVieA0KLQlqbXAgIExfZG9fY29weTFfbW14DQotDQotTF93cmFwX2Fyb3VuZF93aW5kb3dfbW14Og0KLQ0KLQltb3YgIGVheCwgW2VzcCs0OF0NCi0JY21wICBlY3gsZWF4DQotCWpiZSAgTF9jb250aWd1b3VzX2luX3dpbmRvd19tbXgNCi0NCi0JYWRkICBlc2ksIFtlc3ArNTJdDQotCWFkZCAgZXNpLGVheA0KLQlzdWIgIGVzaSxlY3gNCi0Jc3ViICBlY3gsZWF4DQotDQotDQotCWNtcCAgZWR4LGVjeA0KLQlqYmUgIExfZG9fY29weTFfbW14DQotDQotCXN1YiAgZWR4LGVjeA0KLQlyZXAgbW92c2INCi0JbW92ICBlc2ksIFtlc3ArNTZdDQotCW1vdiAgZWN4LCBbZXNwKzQ4XQ0KLQljbXAgIGVkeCxlY3gNCi0JamJlICBMX2RvX2NvcHkxX21teA0KLQ0KLQlzdWIgIGVkeCxlY3gNCi0JcmVwIG1vdnNiDQotCW1vdiAgZXNpLGVkaQ0KLQlzdWIgIGVzaSxlYngNCi0Jam1wICBMX2RvX2NvcHkxX21teA0KLQ0KLUxfY29udGlndW91c19pbl93aW5kb3dfbW14Og0KLQ0KLQlhZGQgIGVzaSxlYXgNCi0Jc3ViICBlc2ksZWN4DQotDQotDQotCWNtcCAgZWR4LGVjeA0KLQlqYmUgIExfZG9fY29weTFfbW14DQotDQotCXN1YiAgZWR4LGVjeA0KLQlyZXAgbW92c2INCi0JbW92ICBlc2ksZWRpDQotCXN1YiAgZXNpLGVieA0KLQ0KLUxfZG9fY29weTFfbW14Og0KLQ0KLQ0KLQltb3YgIGVjeCxlZHgNCi0JcmVwIG1vdnNiDQotDQotCW1vdiAgZXNpLCBbZXNwKzQ0XQ0KLQltb3YgIGVieCwgW2VzcCs4XQ0KLQlqbXAgIExfd2hpbGVfdGVzdF9tbXgNCi07IDExNzQgImluZmZhc3QuUyINCi1MX2ludmFsaWRfZGlzdGFuY2VfY29kZToNCi0NCi0NCi0NCi0NCi0NCi0JbW92ICBlY3gsIGludmFsaWRfZGlzdGFuY2VfY29kZV9tc2cNCi0JbW92ICBlZHgsSU5GTEFURV9NT0RFX0JBRA0KLQlqbXAgIExfdXBkYXRlX3N0cmVhbV9zdGF0ZQ0KLQ0KLUxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrOg0KLQ0KLQ0KLQ0KLQ0KLQ0KLQl0ZXN0ICBhbCwzMg0KLQlqeiAgTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGUNCi0NCi0JbW92ICBlY3gsMA0KLQltb3YgIGVkeCxJTkZMQVRFX01PREVfVFlQRQ0KLQlqbXAgIExfdXBkYXRlX3N0cmVhbV9zdGF0ZQ0KLQ0KLUxfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlOg0KLQ0KLQ0KLQ0KLQ0KLQ0KLQltb3YgIGVjeCwgaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlX21zZw0KLQltb3YgIGVkeCxJTkZMQVRFX01PREVfQkFEDQotCWptcCAgTF91cGRhdGVfc3RyZWFtX3N0YXRlDQotDQotTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXI6DQotDQotDQotDQotCW1vdiAgZXNpLCBbZXNwKzQ0XQ0KLQltb3YgIGVjeCwgaW52YWxpZF9kaXN0YW5jZV90b29fZmFyX21zZw0KLQltb3YgIGVkeCxJTkZMQVRFX01PREVfQkFEDQotCWptcCAgTF91cGRhdGVfc3RyZWFtX3N0YXRlDQotDQotTF91cGRhdGVfc3RyZWFtX3N0YXRlOg0KLQ0KLQltb3YgIGVheCwgW2VzcCs4OF0NCi0JdGVzdCAgZWN4LGVjeA0KLQlqeiAgTF9za2lwX21zZw0KLQltb3YgIFtlYXgrMjRdLGVjeA0KLUxfc2tpcF9tc2c6DQotCW1vdiAgZWF4LCBbZWF4KzI4XQ0KLQltb3YgIFtlYXgrbW9kZV9zdGF0ZV0sZWR4DQotCWptcCAgTF9icmVha19sb29wDQotDQotQUxJR04gNA0KLUxfYnJlYWtfbG9vcDoNCi07IDEyNDMgImluZmZhc3QuUyINCi0JY21wICBkd29yZCBwdHIgW2luZmxhdGVfZmFzdF91c2VfbW14XSwyDQotCWpuZSAgTF91cGRhdGVfbmV4dF9pbg0KLQ0KLQ0KLQ0KLQltb3YgIGVieCxlYnANCi0NCi1MX3VwZGF0ZV9uZXh0X2luOg0KLTsgMTI2NiAiaW5mZmFzdC5TIg0KLQltb3YgIGVheCwgW2VzcCs4OF0NCi0JbW92ICBlY3gsZWJ4DQotCW1vdiAgZWR4LCBbZWF4KzI4XQ0KLQlzaHIgIGVjeCwzDQotCXN1YiAgZXNpLGVjeA0KLQlzaGwgIGVjeCwzDQotCXN1YiAgZWJ4LGVjeA0KLQltb3YgIFtlYXgrMTJdLGVkaQ0KLQltb3YgIFtlZHgrYml0c19zdGF0ZV0sZWJ4DQotCW1vdiAgZWN4LGVieA0KLQ0KLQlsZWEgIGVieCwgW2VzcCsyOF0NCi0JY21wICBbZXNwKzIwXSxlYngNCi0Jam5lICBMX2J1Zl9ub3RfdXNlZA0KLQ0KLQlzdWIgIGVzaSxlYngNCi0JbW92ICBlYngsIFtlYXgrMF0NCi0JbW92ICBbZXNwKzIwXSxlYngNCi0JYWRkICBlc2ksZWJ4DQotCW1vdiAgZWJ4LCBbZWF4KzRdDQotCXN1YiAgZWJ4LDExDQotCWFkZCAgW2VzcCsyMF0sZWJ4DQotDQotTF9idWZfbm90X3VzZWQ6DQotCW1vdiAgW2VheCswXSxlc2kNCi0NCi0JbW92ICBlYngsMQ0KLQlzaGwgIGVieCxjbA0KLQlkZWMgIGVieA0KLQ0KLQ0KLQ0KLQ0KLQ0KLQljbXAgIGR3b3JkIHB0ciBbaW5mbGF0ZV9mYXN0X3VzZV9tbXhdLDINCi0Jam5lICBMX3VwZGF0ZV9ob2xkDQotDQotDQotDQotCXBzcmxxIG1tMCxtbTENCi0JbW92ZCBlYnAsbW0wDQotDQotCWVtbXMNCi0NCi1MX3VwZGF0ZV9ob2xkOg0KLQ0KLQ0KLQ0KLQlhbmQgIGVicCxlYngNCi0JbW92ICBbZWR4K2hvbGRfc3RhdGVdLGVicA0KLQ0KLQ0KLQ0KLQ0KLQltb3YgIGVieCwgW2VzcCsyMF0NCi0JY21wICBlYngsZXNpDQotCWpiZSAgTF9sYXN0X2lzX3NtYWxsZXINCi0NCi0Jc3ViICBlYngsZXNpDQotCWFkZCAgZWJ4LDExDQotCW1vdiAgW2VheCs0XSxlYngNCi0Jam1wICBMX2ZpeHVwX291dA0KLUxfbGFzdF9pc19zbWFsbGVyOg0KLQlzdWIgIGVzaSxlYngNCi0JbmVnICBlc2kNCi0JYWRkICBlc2ksMTENCi0JbW92ICBbZWF4KzRdLGVzaQ0KLQ0KLQ0KLQ0KLQ0KLUxfZml4dXBfb3V0Og0KLQ0KLQltb3YgIGVieCwgW2VzcCsxNl0NCi0JY21wICBlYngsZWRpDQotCWpiZSAgTF9lbmRfaXNfc21hbGxlcg0KLQ0KLQlzdWIgIGVieCxlZGkNCi0JYWRkICBlYngsMjU3DQotCW1vdiAgW2VheCsxNl0sZWJ4DQotCWptcCAgTF9kb25lDQotTF9lbmRfaXNfc21hbGxlcjoNCi0Jc3ViICBlZGksZWJ4DQotCW5lZyAgZWRpDQotCWFkZCAgZWRpLDI1Nw0KLQltb3YgIFtlYXgrMTZdLGVkaQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLUxfZG9uZToNCi0JYWRkICBlc3AsNjQNCi0JcG9wZmQNCi0JcG9wICBlYngNCi0JcG9wICBlYnANCi0JcG9wICBlc2kNCi0JcG9wICBlZGkNCi0JcmV0DQotX2luZmxhdGVfZmFzdCBlbmRwDQotDQotX1RFWFQJZW5kcw0KLWVuZA0KZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvbWFzbXg4Ni9tYXRjaDY4Ni5hc20gYi9zcmMvemxpYi9jb250cmliL21hc214ODYvbWF0Y2g2ODYuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjA5MjEyLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvbWFzbXg4Ni9tYXRjaDY4Ni5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw0NzkgKzAsMCBAQAotOyBtYXRjaDY4Ni5hc20gLS0gQXNtIHBvcnRpb24gb2YgdGhlIG9wdGltaXplZCBsb25nZXN0X21hdGNoIGZvciAzMiBiaXRzIHg4Ng0KLTsgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgSmVhbi1sb3VwIEdhaWxseSwgQnJpYW4gUmFpdGVyIGFuZCBHaWxsZXMgVm9sbGFudC4NCi07IEZpbGUgd3JpdHRlbiBieSBHaWxsZXMgVm9sbGFudCwgYnkgY29udmVydGluZyBtYXRjaDY4Ni5TIGZyb20gQnJpYW4gUmFpdGVyDQotOyBmb3IgTUFTTS4gVGhpcyBpcyBhcyBhc3NlbWJseSB2ZXJzaW9uIG9mIGxvbmdlc3RfbWF0Y2gNCi07ICBmcm9tIEplYW4tbG91cCBHYWlsbHkgaW4gZGVmbGF0ZS5jDQotOw0KLTsgICAgICAgICBodHRwOi8vd3d3LnpsaWIubmV0DQotOyAgICAgICAgIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwNCi07ICAgICAgICAgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbA0KLTsNCi07IEZvciBWaXN1YWwgQysrIDQueCBhbmQgaGlnaGVyIGFuZCBNTCA2LnggYW5kIGhpZ2hlcg0KLTsgICBtbC5leGUgaXMgZGlzdHJpYnV0ZWQgaW4NCi07ICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZG93bmxvYWRzL2RldGFpbHMuYXNweD9GYW1pbHlJRD03YTFjOWRhMC0wNTEwLTQ0YTItYjA0Mi03ZWYzNzA1MzBjNjQNCi07DQotOyB0aGlzIGZpbGUgY29udGFpbiB0d28gaW1wbGVtZW50YXRpb24gb2YgbG9uZ2VzdF9tYXRjaA0KLTsNCi07ICB0aGlzIGxvbmdlc3RfbWF0Y2ggd2FzIHdyaXR0ZW4gYnkgQnJpYW4gcmFpdGVyICgxOTk4KSwgb3B0aW1pemVkIGZvciBQZW50aXVtIFBybw0KLTsgICAoYW5kIHRoZSBmYXN0ZXIga25vd24gdmVyc2lvbiBvZiBtYXRjaF9pbml0IG9uIG1vZGVybiBDb3JlIDIgRHVvIGFuZCBBTUQgUGhlbm9tKQ0KLTsNCi07ICBmb3IgdXNpbmcgYW4gYXNzZW1ibHkgdmVyc2lvbiBvZiBsb25nZXN0X21hdGNoLCB5b3UgbmVlZCBkZWZpbmUgQVNNViBpbiBwcm9qZWN0DQotOw0KLTsgICAgY29tcGlsZSB0aGUgYXNtIGZpbGUgcnVubmluZw0KLTsgICAgICAgICAgIG1sIC9jb2ZmIC9aaSAvYyAvRmxtYXRjaDY4Ni5sc3QgbWF0Y2g2ODYuYXNtDQotOyAgICBhbmQgZG8gbm90IGluY2x1ZGUgbWF0Y2g2ODYub2JqIGluIHlvdXIgcHJvamVjdA0KLTsNCi07IG5vdGU6IGNvbnRyaWIgb2YgekxpYiAxLjIuMyBhbmQgZWFybGllciBjb250YWluZWQgYm90aCBhIGRlcHJlY2F0ZWQgdmVyc2lvbiBmb3INCi07ICBQZW50aXVtIChwcmlvciBQZW50aXVtIFBybykgYW5kIHRoaXMgdmVyc2lvbiBmb3IgUGVudGl1bSBQcm8gYW5kIG1vZGVybiBwcm9jZXNzb3INCi07ICB3aXRoIGF1dG9zZWxlY3QgKHdpdGggY3B1IGRldGVjdGlvbiBjb2RlKQ0KLTsgIGlmIHlvdSB3YW50IHN1cHBvcnQgdGhlIG9sZCBwZW50aXVtIG9wdGltaXphdGlvbiwgeW91IGNhbiBzdGlsbCB1c2UgdGhlc2UgdmVyc2lvbg0KLTsNCi07IHRoaXMgZmlsZSBpcyBub3Qgb3B0aW1pemVkIGZvciBvbGQgcGVudGl1bSwgYnV0IGl0IGNvbXBhdGlibGUgd2l0aCBhbGwgeDg2IDMyIGJpdHMNCi07IHByb2Nlc3NvciAoc3RhcnRpbmcgODAzODYpDQotOw0KLTsNCi07IHNlZSBiZWxvdyA6IHpsaWIxMjIyYWRkIG11c3QgYmUgYWRqdXN0ZXIgaWYgeW91IHVzZSBhIHpsaWIgdmVyc2lvbiA8IDEuMi4yLjINCi0NCi07dUludCBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkNCi07ICAgIGRlZmxhdGVfc3RhdGUgKnM7DQotOyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8NCi0NCi0gICAgTmJTdGFjayAgICAgICAgIGVxdSAgICAgNzYNCi0gICAgY3VyX21hdGNoICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTBdDQotICAgIHN0cl9zICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay00XQ0KLTsgNSBkd29yZCBvbiB0b3AgKHJldCxlYnAsZXNpLGVkaSxlYngpDQotICAgIGFkcnJldCAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay04XQ0KLSAgICBwdXNoZWJwICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stMTJdDQotICAgIHB1c2hlZGkgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0xNl0NCi0gICAgcHVzaGVzaSAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTIwXQ0KLSAgICBwdXNoZWJ4ICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stMjRdDQotDQotICAgIGNoYWluX2xlbmd0aCAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMjhdDQotICAgIGxpbWl0ICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMzJdDQotICAgIGJlc3RfbGVuICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMzZdDQotICAgIHdpbmRvdyAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNDBdDQotICAgIHByZXYgICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNDRdDQotICAgIHNjYW5fc3RhcnQgICAgICBlcXUgICAgICB3b3JkIHB0ciBbZXNwK05iU3RhY2stNDhdDQotICAgIHdtYXNrICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNTJdDQotICAgIG1hdGNoX3N0YXJ0X3B0ciBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNTZdDQotICAgIG5pY2VfbWF0Y2ggICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjBdDQotICAgIHNjYW4gICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjRdDQotDQotICAgIHdpbmRvd2xlbiAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjhdDQotICAgIG1hdGNoX3N0YXJ0ICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNzJdDQotICAgIHN0cmVuZCAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNzZdDQotICAgIE5iU3RhY2tBZGQgICAgICBlcXUgICAgIChOYlN0YWNrLTI0KQ0KLQ0KLSAgICAuMzg2cA0KLQ0KLSAgICBuYW1lICAgIGd2bWF0Y2gNCi0gICAgLk1PREVMICBGTEFUDQotDQotDQotDQotOyAgYWxsIHRoZSAremxpYjEyMjJhZGQgb2Zmc2V0cyBhcmUgZHVlIHRvIHRoZSBhZGRpdGlvbiBvZiBmaWVsZHMNCi07ICBpbiB6bGliIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4NCi07ICAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMC40IG9yIG9sZGVyLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAoLTQpIikuDQotOyAgKGlmIHlvdSBjb21waWxlIHdpdGggemxpYiBiZXR3ZWVuIDEuMC41IGFuZCAxLjIuMi4xLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAwIikuDQotOyAgaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMi4yLjIgb3IgbGF0ZXIgLCB1c2UgInpsaWIxMjIyYWRkIGVxdSA4IikuDQotDQotICAgIHpsaWIxMjIyYWRkICAgICAgICAgZXF1ICAgICA4DQotDQotOyAgTm90ZSA6IHRoZXNlIHZhbHVlIGFyZSBnb29kIHdpdGggYSA4IGJ5dGVzIGJvdW5kYXJ5IHBhY2sgc3RydWN0dXJlDQotICAgIGRlcF9jaGFpbl9sZW5ndGggICAgZXF1ICAgICA3NGgremxpYjEyMjJhZGQNCi0gICAgZGVwX3dpbmRvdyAgICAgICAgICBlcXUgICAgIDMwaCt6bGliMTIyMmFkZA0KLSAgICBkZXBfc3Ryc3RhcnQgICAgICAgIGVxdSAgICAgNjRoK3psaWIxMjIyYWRkDQotICAgIGRlcF9wcmV2X2xlbmd0aCAgICAgZXF1ICAgICA3MGgremxpYjEyMjJhZGQNCi0gICAgZGVwX25pY2VfbWF0Y2ggICAgICBlcXUgICAgIDg4aCt6bGliMTIyMmFkZA0KLSAgICBkZXBfd19zaXplICAgICAgICAgIGVxdSAgICAgMjRoK3psaWIxMjIyYWRkDQotICAgIGRlcF9wcmV2ICAgICAgICAgICAgZXF1ICAgICAzOGgremxpYjEyMjJhZGQNCi0gICAgZGVwX3dfbWFzayAgICAgICAgICBlcXUgICAgIDJjaCt6bGliMTIyMmFkZA0KLSAgICBkZXBfZ29vZF9tYXRjaCAgICAgIGVxdSAgICAgODRoK3psaWIxMjIyYWRkDQotICAgIGRlcF9tYXRjaF9zdGFydCAgICAgZXF1ICAgICA2OGgremxpYjEyMjJhZGQNCi0gICAgZGVwX2xvb2thaGVhZCAgICAgICBlcXUgICAgIDZjaCt6bGliMTIyMmFkZA0KLQ0KLQ0KLV9URVhUICAgICAgICAgICAgICAgICAgIHNlZ21lbnQNCi0NCi1JRkRFRiBOT1VOREVSTElORQ0KLSAgICAgICAgICAgIHB1YmxpYyAgbG9uZ2VzdF9tYXRjaA0KLSAgICAgICAgICAgIHB1YmxpYyAgbWF0Y2hfaW5pdA0KLUVMU0UNCi0gICAgICAgICAgICBwdWJsaWMgIF9sb25nZXN0X21hdGNoDQotICAgICAgICAgICAgcHVibGljICBfbWF0Y2hfaW5pdA0KLUVORElGDQotDQotICAgIE1BWF9NQVRDSCAgICAgICAgICAgZXF1ICAgICAyNTgNCi0gICAgTUlOX01BVENIICAgICAgICAgICBlcXUgICAgIDMNCi0gICAgTUlOX0xPT0tBSEVBRCAgICAgICBlcXUgICAgIChNQVhfTUFUQ0grTUlOX01BVENIKzEpDQotDQotDQotDQotTUFYX01BVENIICAgICAgIGVxdSAgICAgMjU4DQotTUlOX01BVENIICAgICAgIGVxdSAgICAgMw0KLU1JTl9MT09LQUhFQUQgICBlcXUgICAgIChNQVhfTUFUQ0ggKyBNSU5fTUFUQ0ggKyAxKQ0KLU1BWF9NQVRDSF84XyAgICAgZXF1ICAgICAoKE1BWF9NQVRDSCArIDcpIEFORCAwRkZGMGgpDQotDQotDQotOzs7IHN0YWNrIGZyYW1lIG9mZnNldHMNCi0NCi1jaGFpbmxlbndtYXNrICAgZXF1ICBlc3AgKyAwICAgIDsgaGlnaCB3b3JkOiBjdXJyZW50IGNoYWluIGxlbg0KLSAgICAgICAgICAgICAgICAgICAgOyBsb3cgd29yZDogcy0+d21hc2sNCi13aW5kb3cgICAgICBlcXUgIGVzcCArIDQgICAgOyBsb2NhbCBjb3B5IG9mIHMtPndpbmRvdw0KLXdpbmRvd2Jlc3RsZW4gICBlcXUgIGVzcCArIDggICAgOyBzLT53aW5kb3cgKyBiZXN0bGVuDQotc2NhbnN0YXJ0ICAgZXF1ICBlc3AgKyAxNiAgIDsgZmlyc3QgdHdvIGJ5dGVzIG9mIHN0cmluZw0KLXNjYW5lbmQgICAgIGVxdSAgZXNwICsgMTIgICA7IGxhc3QgdHdvIGJ5dGVzIG9mIHN0cmluZw0KLXNjYW5hbGlnbiAgIGVxdSAgZXNwICsgMjAgICA7IGR3b3JkLW1pc2FsaWdubWVudCBvZiBzdHJpbmcNCi1uaWNlbWF0Y2ggICBlcXUgIGVzcCArIDI0ICAgOyBhIGdvb2QgZW5vdWdoIG1hdGNoIHNpemUNCi1iZXN0bGVuICAgICBlcXUgIGVzcCArIDI4ICAgOyBzaXplIG9mIGJlc3QgbWF0Y2ggc28gZmFyDQotc2NhbiAgICAgICAgZXF1ICBlc3AgKyAzMiAgIDsgcHRyIHRvIHN0cmluZyB3YW50aW5nIG1hdGNoDQotDQotTG9jYWxWYXJzU2l6ZSAgIGVxdSAzNg0KLTsgICBzYXZlZCBlYnggICBieXRlIGVzcCArIDM2DQotOyAgIHNhdmVkIGVkaSAgIGJ5dGUgZXNwICsgNDANCi07ICAgc2F2ZWQgZXNpICAgYnl0ZSBlc3AgKyA0NA0KLTsgICBzYXZlZCBlYnAgICBieXRlIGVzcCArIDQ4DQotOyAgIHJldHVybiBhZGRyZXNzICBieXRlIGVzcCArIDUyDQotZGVmbGF0ZXN0YXRlICAgIGVxdSAgZXNwICsgNTYgICA7IHRoZSBmdW5jdGlvbiBhcmd1bWVudHMNCi1jdXJtYXRjaCAgICBlcXUgIGVzcCArIDYwDQotDQotOzs7IE9mZnNldHMgZm9yIGZpZWxkcyBpbiB0aGUgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUuIFRoZXNlIG51bWJlcnMNCi07OzsgYXJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgZGVmaW5pdGlvbiBvZiBkZWZsYXRlX3N0YXRlLCB3aXRoIHRoZQ0KLTs7OyBhc3N1bXB0aW9uIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgZHdvcmQtYWxpZ24gdGhlIGZpZWxkcy4gKFRodXMsDQotOzs7IGNoYW5naW5nIHRoZSBkZWZpbml0aW9uIG9mIGRlZmxhdGVfc3RhdGUgY291bGQgZWFzaWx5IGNhdXNlIHRoaXMNCi07OzsgcHJvZ3JhbSB0byBjcmFzaCBob3JyaWJseSwgd2l0aG91dCBzbyBtdWNoIGFzIGEgd2FybmluZyBhdA0KLTs7OyBjb21waWxlIHRpbWUuIFNpZ2guKQ0KLQ0KLWRzV1NpemUgICAgIGVxdSAzNit6bGliMTIyMmFkZA0KLWRzV01hc2sgICAgIGVxdSA0NCt6bGliMTIyMmFkZA0KLWRzV2luZG93ICAgIGVxdSA0OCt6bGliMTIyMmFkZA0KLWRzUHJldiAgICAgIGVxdSA1Nit6bGliMTIyMmFkZA0KLWRzTWF0Y2hMZW4gIGVxdSA4OCt6bGliMTIyMmFkZA0KLWRzUHJldk1hdGNoIGVxdSA5Mit6bGliMTIyMmFkZA0KLWRzU3RyU3RhcnQgIGVxdSAxMDAremxpYjEyMjJhZGQNCi1kc01hdGNoU3RhcnQgICAgZXF1IDEwNCt6bGliMTIyMmFkZA0KLWRzTG9va2FoZWFkIGVxdSAxMDgremxpYjEyMjJhZGQNCi1kc1ByZXZMZW4gICBlcXUgMTEyK3psaWIxMjIyYWRkDQotZHNNYXhDaGFpbkxlbiAgIGVxdSAxMTYremxpYjEyMjJhZGQNCi1kc0dvb2RNYXRjaCBlcXUgMTMyK3psaWIxMjIyYWRkDQotZHNOaWNlTWF0Y2ggZXF1IDEzNit6bGliMTIyMmFkZA0KLQ0KLQ0KLTs7OyBtYXRjaDY4Ni5hc20gLS0gUGVudGl1bS1Qcm8tb3B0aW1pemVkIHZlcnNpb24gb2YgbG9uZ2VzdF9tYXRjaCgpDQotOzs7IFdyaXR0ZW4gZm9yIHpsaWIgMS4xLjINCi07OzsgQ29weXJpZ2h0IChDKSAxOTk4IEJyaWFuIFJhaXRlciA8YnJlYWRib3hAbXVwcGV0bGFicy5jb20+DQotOzs7IFlvdSBjYW4gbG9vayBhdCBodHRwOi8vd3d3Lm11cHBldGxhYnMuY29tL35icmVhZGJveC9zb2Z0d2FyZS9hc3NlbWJseS5odG1sDQotOzs7DQotOzsNCi07OyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQNCi07OyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcw0KLTs7ICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLg0KLTs7DQotOzsgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLA0KLTs7ICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0DQotOzsgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoNCi07Ow0KLTs7ICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdA0KLTs7ICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQ0KLTs7ICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUNCi07OyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4NCi07OyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUNCi07OyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlDQotOzsgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uDQotOzsNCi0NCi07R0xPQkFMIF9sb25nZXN0X21hdGNoLCBfbWF0Y2hfaW5pdA0KLQ0KLQ0KLTtTRUNUSU9OICAgIC50ZXh0DQotDQotOzs7IHVJbnQgbG9uZ2VzdF9tYXRjaChkZWZsYXRlX3N0YXRlICpkZWZsYXRlc3RhdGUsIElQb3MgY3VybWF0Y2gpDQotDQotO19sb25nZXN0X21hdGNoOg0KLSAgICBJRkRFRiBOT1VOREVSTElORQ0KLSAgICBsb25nZXN0X21hdGNoICAgICAgIHByb2MgbmVhcg0KLSAgICBFTFNFDQotICAgIF9sb25nZXN0X21hdGNoICAgICAgcHJvYyBuZWFyDQotICAgIEVORElGDQotLkZQTyAoOSwgNCwgMCwgMCwgMSwgMCkNCi0NCi07OzsgU2F2ZSByZWdpc3RlcnMgdGhhdCB0aGUgY29tcGlsZXIgbWF5IGJlIHVzaW5nLCBhbmQgYWRqdXN0IGVzcCB0bw0KLTs7OyBtYWtlIHJvb20gZm9yIG91ciBzdGFjayBmcmFtZS4NCi0NCi0gICAgICAgIHB1c2ggICAgZWJwDQotICAgICAgICBwdXNoICAgIGVkaQ0KLSAgICAgICAgcHVzaCAgICBlc2kNCi0gICAgICAgIHB1c2ggICAgZWJ4DQotICAgICAgICBzdWIgZXNwLCBMb2NhbFZhcnNTaXplDQotDQotOzs7IFJldHJpZXZlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMuIGVjeCB3aWxsIGhvbGQgY3VyX21hdGNoDQotOzs7IHRocm91Z2hvdXQgdGhlIGVudGlyZSBmdW5jdGlvbi4gZWR4IHdpbGwgaG9sZCB0aGUgcG9pbnRlciB0byB0aGUNCi07OzsgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgZHVyaW5nIHRoZSBmdW5jdGlvbidzIHNldHVwIChiZWZvcmUNCi07OzsgZW50ZXJpbmcgdGhlIG1haW4gbG9vcC4NCi0NCi0gICAgICAgIG1vdiBlZHgsIFtkZWZsYXRlc3RhdGVdDQotICAgICAgICBtb3YgZWN4LCBbY3VybWF0Y2hdDQotDQotOzs7IHVJbnQgd21hc2sgPSBzLT53X21hc2s7DQotOzs7IHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7DQotOzs7IGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7DQotOzs7ICAgICBjaGFpbl9sZW5ndGggPj49IDI7DQotOzs7IH0NCi0NCi0gICAgICAgIG1vdiBlYXgsIFtlZHggKyBkc1ByZXZMZW5dDQotICAgICAgICBtb3YgZWJ4LCBbZWR4ICsgZHNHb29kTWF0Y2hdDQotICAgICAgICBjbXAgZWF4LCBlYngNCi0gICAgICAgIG1vdiBlYXgsIFtlZHggKyBkc1dNYXNrXQ0KLSAgICAgICAgbW92IGVieCwgW2VkeCArIGRzTWF4Q2hhaW5MZW5dDQotICAgICAgICBqbCAgTGFzdE1hdGNoR29vZA0KLSAgICAgICAgc2hyIGVieCwgMg0KLUxhc3RNYXRjaEdvb2Q6DQotDQotOzs7IGNoYWlubGVuIGlzIGRlY3JlbWVudGVkIG9uY2UgYmVmb3JlaGFuZCBzbyB0aGF0IHRoZSBmdW5jdGlvbiBjYW4NCi07OzsgdXNlIHRoZSBzaWduIGZsYWcgaW5zdGVhZCBvZiB0aGUgemVybyBmbGFnIGZvciB0aGUgZXhpdCB0ZXN0Lg0KLTs7OyBJdCBpcyB0aGVuIHNoaWZ0ZWQgaW50byB0aGUgaGlnaCB3b3JkLCB0byBtYWtlIHJvb20gZm9yIHRoZSB3bWFzaw0KLTs7OyB2YWx1ZSwgd2hpY2ggaXQgd2lsbCBhbHdheXMgYWNjb21wYW55Lg0KLQ0KLSAgICAgICAgZGVjIGVieA0KLSAgICAgICAgc2hsIGVieCwgMTYNCi0gICAgICAgIG9yICBlYngsIGVheA0KLSAgICAgICAgbW92IFtjaGFpbmxlbndtYXNrXSwgZWJ4DQotDQotOzs7IGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOw0KLQ0KLSAgICAgICAgbW92IGVheCwgW2VkeCArIGRzTmljZU1hdGNoXQ0KLSAgICAgICAgbW92IGVieCwgW2VkeCArIGRzTG9va2FoZWFkXQ0KLSAgICAgICAgY21wIGVieCwgZWF4DQotICAgICAgICBqbCAgTG9va2FoZWFkTGVzcw0KLSAgICAgICAgbW92IGVieCwgZWF4DQotTG9va2FoZWFkTGVzczogIG1vdiBbbmljZW1hdGNoXSwgZWJ4DQotDQotOzs7IHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7DQotDQotICAgICAgICBtb3YgZXNpLCBbZWR4ICsgZHNXaW5kb3ddDQotICAgICAgICBtb3YgW3dpbmRvd10sIGVzaQ0KLSAgICAgICAgbW92IGVicCwgW2VkeCArIGRzU3RyU3RhcnRdDQotICAgICAgICBsZWEgZWRpLCBbZXNpICsgZWJwXQ0KLSAgICAgICAgbW92IFtzY2FuXSwgZWRpDQotDQotOzs7IERldGVybWluZSBob3cgbWFueSBieXRlcyB0aGUgc2NhbiBwdHIgaXMgb2ZmIGZyb20gYmVpbmcNCi07OzsgZHdvcmQtYWxpZ25lZC4NCi0NCi0gICAgICAgIG1vdiBlYXgsIGVkaQ0KLSAgICAgICAgbmVnIGVheA0KLSAgICAgICAgYW5kIGVheCwgMw0KLSAgICAgICAgbW92IFtzY2FuYWxpZ25dLCBlYXgNCi0NCi07OzsgSVBvcyBsaW1pdCA9IHMtPnN0cnN0YXJ0ID4gKElQb3MpTUFYX0RJU1QocykgPw0KLTs7OyAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsNCi0NCi0gICAgICAgIG1vdiBlYXgsIFtlZHggKyBkc1dTaXplXQ0KLSAgICAgICAgc3ViIGVheCwgTUlOX0xPT0tBSEVBRA0KLSAgICAgICAgc3ViIGVicCwgZWF4DQotICAgICAgICBqZyAgTGltaXRQb3NpdGl2ZQ0KLSAgICAgICAgeG9yIGVicCwgZWJwDQotTGltaXRQb3NpdGl2ZToNCi0NCi07OzsgaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7DQotDQotICAgICAgICBtb3YgZWF4LCBbZWR4ICsgZHNQcmV2TGVuXQ0KLSAgICAgICAgbW92IFtiZXN0bGVuXSwgZWF4DQotDQotOzs7IFN0b3JlIHRoZSBzdW0gb2Ygcy0+d2luZG93ICsgYmVzdF9sZW4gaW4gZXNpIGxvY2FsbHksIGFuZCBpbiBlc2kuDQotDQotICAgICAgICBhZGQgZXNpLCBlYXgNCi0gICAgICAgIG1vdiBbd2luZG93YmVzdGxlbl0sIGVzaQ0KLQ0KLTs7OyByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsNCi07OzsgcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOw0KLTs7OyBQb3NmICpwcmV2ID0gcy0+cHJldjsNCi0NCi0gICAgICAgIG1vdnp4ICAgZWJ4LCB3b3JkIHB0ciBbZWRpXQ0KLSAgICAgICAgbW92IFtzY2Fuc3RhcnRdLCBlYngNCi0gICAgICAgIG1vdnp4ICAgZWJ4LCB3b3JkIHB0ciBbZWRpICsgZWF4IC0gMV0NCi0gICAgICAgIG1vdiBbc2NhbmVuZF0sIGVieA0KLSAgICAgICAgbW92IGVkaSwgW2VkeCArIGRzUHJldl0NCi0NCi07OzsgSnVtcCBpbnRvIHRoZSBtYWluIGxvb3AuDQotDQotICAgICAgICBtb3YgZWR4LCBbY2hhaW5sZW53bWFza10NCi0gICAgICAgIGptcCBzaG9ydCBMb29wRW50cnkNCi0NCi1hbGlnbiA0DQotDQotOzs7IGRvIHsNCi07OzsgICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOw0KLTs7OyAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8DQotOzs7ICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsNCi07OzsgICAgIFsuLi5dDQotOzs7IH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdA0KLTs7OyAgICAgICAgICAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsNCi07OzsNCi07OzsgSGVyZSBpcyB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiB3aWxsIHNwZW5kIHRoZQ0KLTs7OyBtYWpvcml0eSBvZiBpdHMgdGltZSBpbiB0aGlzIGxvb3AsIGFuZCBtYWpvcml0eSBvZiB0aGF0IHRpbWUgd2lsbA0KLTs7OyBiZSBzcGVudCBpbiB0aGUgZmlyc3QgdGVuIGluc3RydWN0aW9ucy4NCi07OzsNCi07OzsgV2l0aGluIHRoaXMgbG9vcDoNCi07OzsgZWJ4ID0gc2NhbmVuZA0KLTs7OyBlY3ggPSBjdXJtYXRjaA0KLTs7OyBlZHggPSBjaGFpbmxlbndtYXNrIC0gaS5lLiwgKChjaGFpbmxlbiA8PCAxNikgfCB3bWFzaykNCi07OzsgZXNpID0gd2luZG93YmVzdGxlbiAtIGkuZS4sICh3aW5kb3cgKyBiZXN0bGVuKQ0KLTs7OyBlZGkgPSBwcmV2DQotOzs7IGVicCA9IGxpbWl0DQotDQotTG9va3VwTG9vcDoNCi0gICAgICAgIGFuZCBlY3gsIGVkeA0KLSAgICAgICAgbW92enggICBlY3gsIHdvcmQgcHRyIFtlZGkgKyBlY3gqMl0NCi0gICAgICAgIGNtcCBlY3gsIGVicA0KLSAgICAgICAgamJlIExlYXZlTm93DQotICAgICAgICBzdWIgZWR4LCAwMDAxMDAwMGgNCi0gICAgICAgIGpzICBMZWF2ZU5vdw0KLUxvb3BFbnRyeTogIG1vdnp4ICAgZWF4LCB3b3JkIHB0ciBbZXNpICsgZWN4IC0gMV0NCi0gICAgICAgIGNtcCBlYXgsIGVieA0KLSAgICAgICAgam56IExvb2t1cExvb3ANCi0gICAgICAgIG1vdiBlYXgsIFt3aW5kb3ddDQotICAgICAgICBtb3Z6eCAgIGVheCwgd29yZCBwdHIgW2VheCArIGVjeF0NCi0gICAgICAgIGNtcCBlYXgsIFtzY2Fuc3RhcnRdDQotICAgICAgICBqbnogTG9va3VwTG9vcA0KLQ0KLTs7OyBTdG9yZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBjaGFpbmxlbi4NCi0NCi0gICAgICAgIG1vdiBbY2hhaW5sZW53bWFza10sIGVkeA0KLQ0KLTs7OyBQb2ludCBlZGkgdG8gdGhlIHN0cmluZyB1bmRlciBzY3J1dGlueSwgYW5kIGVzaSB0byB0aGUgc3RyaW5nIHdlDQotOzs7IGFyZSBob3BpbmcgdG8gbWF0Y2ggaXQgdXAgd2l0aC4gSW4gYWN0dWFsaXR5LCBlc2kgYW5kIGVkaSBhcmUNCi07OzsgYm90aCBwb2ludGVkIChNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikgYnl0ZXMgYWhlYWQsIGFuZCBlZHggaXMNCi07OzsgaW5pdGlhbGl6ZWQgdG8gLShNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikuDQotDQotICAgICAgICBtb3YgZXNpLCBbd2luZG93XQ0KLSAgICAgICAgbW92IGVkaSwgW3NjYW5dDQotICAgICAgICBhZGQgZXNpLCBlY3gNCi0gICAgICAgIG1vdiBlYXgsIFtzY2FuYWxpZ25dDQotICAgICAgICBtb3YgZWR4LCAwZmZmZmZlZjhoOyAtKE1BWF9NQVRDSF84KQ0KLSAgICAgICAgbGVhIGVkaSwgW2VkaSArIGVheCArIDAxMDhoXSA7TUFYX01BVENIXzhdDQotICAgICAgICBsZWEgZXNpLCBbZXNpICsgZWF4ICsgMDEwOGhdIDtNQVhfTUFUQ0hfOF0NCi0NCi07OzsgVGVzdCB0aGUgc3RyaW5ncyBmb3IgZXF1YWxpdHksIDggYnl0ZXMgYXQgYSB0aW1lLiBBdCB0aGUgZW5kLA0KLTs7OyBhZGp1c3QgZWR4IHNvIHRoYXQgaXQgaXMgb2Zmc2V0IHRvIHRoZSBleGFjdCBieXRlIHRoYXQgbWlzbWF0Y2hlZC4NCi07OzsNCi07OzsgV2UgYWxyZWFkeSBrbm93IGF0IHRoaXMgcG9pbnQgdGhhdCB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMgb2YgdGhlDQotOzs7IHN0cmluZ3MgbWF0Y2ggZWFjaCBvdGhlciwgYW5kIHRoZXkgY2FuIGJlIHNhZmVseSBwYXNzZWQgb3ZlciBiZWZvcmUNCi07Ozsgc3RhcnRpbmcgdGhlIGNvbXBhcmUgbG9vcC4gU28gd2hhdCB0aGlzIGNvZGUgZG9lcyBpcyBza2lwIG92ZXIgMC0zDQotOzs7IGJ5dGVzLCBhcyBtdWNoIGFzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBkd29yZC1hbGlnbiB0aGUgZWRpDQotOzs7IHBvaW50ZXIuIChlc2kgd2lsbCBzdGlsbCBiZSBtaXNhbGlnbmVkIHRocmVlIHRpbWVzIG91dCBvZiBmb3VyLikNCi07OzsNCi07OzsgSXQgc2hvdWxkIGJlIGNvbmZlc3NlZCB0aGF0IHRoaXMgbG9vcCB1c3VhbGx5IGRvZXMgbm90IHJlcHJlc2VudA0KLTs7OyBtdWNoIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUuIFJlcGxhY2luZyBpdCB3aXRoIGEgbW9yZQ0KLTs7OyBzdHJhaWdodGZvcndhcmQgInJlcCBjbXBzYiIgd291bGQgbm90IGRyYXN0aWNhbGx5IGRlZ3JhZGUNCi07OzsgcGVyZm9ybWFuY2UuDQotDQotTG9vcENtcHM6DQotICAgICAgICBtb3YgZWF4LCBbZXNpICsgZWR4XQ0KLSAgICAgICAgeG9yIGVheCwgW2VkaSArIGVkeF0NCi0gICAgICAgIGpueiBMZWF2ZUxvb3BDbXBzDQotICAgICAgICBtb3YgZWF4LCBbZXNpICsgZWR4ICsgNF0NCi0gICAgICAgIHhvciBlYXgsIFtlZGkgKyBlZHggKyA0XQ0KLSAgICAgICAgam56IExlYXZlTG9vcENtcHM0DQotICAgICAgICBhZGQgZWR4LCA4DQotICAgICAgICBqbnogTG9vcENtcHMNCi0gICAgICAgIGptcCBzaG9ydCBMZW5NYXhpbXVtDQotTGVhdmVMb29wQ21wczQ6IGFkZCBlZHgsIDQNCi1MZWF2ZUxvb3BDbXBzOiAgdGVzdCAgICBlYXgsIDAwMDBGRkZGaA0KLSAgICAgICAgam56IExlbkxvd2VyDQotICAgICAgICBhZGQgZWR4LCAgMg0KLSAgICAgICAgc2hyIGVheCwgMTYNCi1MZW5Mb3dlcjogICBzdWIgYWwsIDENCi0gICAgICAgIGFkYyBlZHgsIDANCi0NCi07OzsgQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsDQotOzs7IHRoZW4gYXV0b21hdGljYWxseSBhY2NlcHQgaXQgYXMgdGhlIGJlc3QgcG9zc2libGUgbWF0Y2ggYW5kIGxlYXZlLg0KLQ0KLSAgICAgICAgbGVhIGVheCwgW2VkaSArIGVkeF0NCi0gICAgICAgIG1vdiBlZGksIFtzY2FuXQ0KLSAgICAgICAgc3ViIGVheCwgZWRpDQotICAgICAgICBjbXAgZWF4LCBNQVhfTUFUQ0gNCi0gICAgICAgIGpnZSBMZW5NYXhpbXVtDQotDQotOzs7IElmIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIG5vdCBsb25nZXIgdGhhbiB0aGUgYmVzdCBtYXRjaCB3ZQ0KLTs7OyBoYXZlIHNvIGZhciwgdGhlbiBmb3JnZXQgaXQgYW5kIHJldHVybiB0byB0aGUgbG9va3VwIGxvb3AuDQotDQotICAgICAgICBtb3YgZWR4LCBbZGVmbGF0ZXN0YXRlXQ0KLSAgICAgICAgbW92IGVieCwgW2Jlc3RsZW5dDQotICAgICAgICBjbXAgZWF4LCBlYngNCi0gICAgICAgIGpnICBMb25nZXJNYXRjaA0KLSAgICAgICAgbW92IGVzaSwgW3dpbmRvd2Jlc3RsZW5dDQotICAgICAgICBtb3YgZWRpLCBbZWR4ICsgZHNQcmV2XQ0KLSAgICAgICAgbW92IGVieCwgW3NjYW5lbmRdDQotICAgICAgICBtb3YgZWR4LCBbY2hhaW5sZW53bWFza10NCi0gICAgICAgIGptcCBMb29rdXBMb29wDQotDQotOzs7ICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7DQotOzs7ICAgICAgICAgYmVzdF9sZW4gPSBsZW47DQotOzs7ICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsNCi07OzsgICAgICAgICBzY2FuX2VuZCA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7DQotDQotTG9uZ2VyTWF0Y2g6ICAgIG1vdiBlYngsIFtuaWNlbWF0Y2hdDQotICAgICAgICBtb3YgW2Jlc3RsZW5dLCBlYXgNCi0gICAgICAgIG1vdiBbZWR4ICsgZHNNYXRjaFN0YXJ0XSwgZWN4DQotICAgICAgICBjbXAgZWF4LCBlYngNCi0gICAgICAgIGpnZSBMZWF2ZU5vdw0KLSAgICAgICAgbW92IGVzaSwgW3dpbmRvd10NCi0gICAgICAgIGFkZCBlc2ksIGVheA0KLSAgICAgICAgbW92IFt3aW5kb3diZXN0bGVuXSwgZXNpDQotICAgICAgICBtb3Z6eCAgIGVieCwgd29yZCBwdHIgW2VkaSArIGVheCAtIDFdDQotICAgICAgICBtb3YgZWRpLCBbZWR4ICsgZHNQcmV2XQ0KLSAgICAgICAgbW92IFtzY2FuZW5kXSwgZWJ4DQotICAgICAgICBtb3YgZWR4LCBbY2hhaW5sZW53bWFza10NCi0gICAgICAgIGptcCBMb29rdXBMb29wDQotDQotOzs7IEFjY2VwdCB0aGUgY3VycmVudCBzdHJpbmcsIHdpdGggdGhlIG1heGltdW0gcG9zc2libGUgbGVuZ3RoLg0KLQ0KLUxlbk1heGltdW06IG1vdiBlZHgsIFtkZWZsYXRlc3RhdGVdDQotICAgICAgICBtb3YgZHdvcmQgcHRyIFtiZXN0bGVuXSwgTUFYX01BVENIDQotICAgICAgICBtb3YgW2VkeCArIGRzTWF0Y2hTdGFydF0sIGVjeA0KLQ0KLTs7OyBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47DQotOzs7IHJldHVybiBzLT5sb29rYWhlYWQ7DQotDQotTGVhdmVOb3c6DQotICAgICAgICBtb3YgZWR4LCBbZGVmbGF0ZXN0YXRlXQ0KLSAgICAgICAgbW92IGVieCwgW2Jlc3RsZW5dDQotICAgICAgICBtb3YgZWF4LCBbZWR4ICsgZHNMb29rYWhlYWRdDQotICAgICAgICBjbXAgZWJ4LCBlYXgNCi0gICAgICAgIGpnICBMb29rYWhlYWRSZXQNCi0gICAgICAgIG1vdiBlYXgsIGVieA0KLUxvb2thaGVhZFJldDoNCi0NCi07OzsgUmVzdG9yZSB0aGUgc3RhY2sgYW5kIHJldHVybiBmcm9tIHdoZW5jZSB3ZSBjYW1lLg0KLQ0KLSAgICAgICAgYWRkIGVzcCwgTG9jYWxWYXJzU2l6ZQ0KLSAgICAgICAgcG9wIGVieA0KLSAgICAgICAgcG9wIGVzaQ0KLSAgICAgICAgcG9wIGVkaQ0KLSAgICAgICAgcG9wIGVicA0KLQ0KLSAgICAgICAgcmV0DQotOyBwbGVhc2UgZG9uJ3QgcmVtb3ZlIHRoaXMgc3RyaW5nICENCi07IFlvdXIgY2FuIGZyZWVseSB1c2UgbWF0Y2g2ODYgaW4gYW55IGZyZWUgb3IgY29tbWVyY2lhbCBhcHAgaWYgeW91IGRvbid0IHJlbW92ZSB0aGUgc3RyaW5nIGluIHRoZSBiaW5hcnkhDQotICAgIGRiICAgICAwZGgsMGFoLCJhc202ODYgd2l0aCBtYXNtLCBvcHRpbWlzZWQgYXNzZW1ibHkgY29kZSBmcm9tIEJyaWFuIFJhaXRlciwgd3JpdHRlbiAxOTk4IiwwZGgsMGFoDQotDQotDQotICAgIElGREVGIE5PVU5ERVJMSU5FDQotICAgIGxvbmdlc3RfbWF0Y2ggICAgICAgZW5kcA0KLSAgICBFTFNFDQotICAgIF9sb25nZXN0X21hdGNoICAgICAgZW5kcA0KLSAgICBFTkRJRg0KLQ0KLSAgICBJRkRFRiBOT1VOREVSTElORQ0KLSAgICBtYXRjaF9pbml0ICAgICAgcHJvYyBuZWFyDQotICAgICAgICAgICAgICAgICAgICByZXQNCi0gICAgbWF0Y2hfaW5pdCAgICAgIGVuZHANCi0gICAgRUxTRQ0KLSAgICBfbWF0Y2hfaW5pdCAgICAgcHJvYyBuZWFyDQotICAgICAgICAgICAgICAgICAgICByZXQNCi0gICAgX21hdGNoX2luaXQgICAgIGVuZHANCi0gICAgRU5ESUYNCi0NCi0NCi1fVEVYVCAgIGVuZHMNCi1lbmQNCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL21hc214ODYvcmVhZG1lLnR4dCBiL3NyYy96bGliL2NvbnRyaWIvbWFzbXg4Ni9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjg4ODg2Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvbWFzbXg4Ni9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotCi1TdW1tYXJ5Ci0tLS0tLS0tCi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyBBU00gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBmdW5jdGlvbnMKLWxvbmdlc3RfbWF0Y2goKSBhbmQgaW5mbGF0ZV9mYXN0KCkuCi0KLQotVXNlIGluc3RydWN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLQotQXNzZW1ibGUgdXNpbmcgTUFTTSwgYW5kIGNvcHkgdGhlIG9iamVjdCBmaWxlcyBpbnRvIHRoZSB6bGliIHNvdXJjZQotZGlyZWN0b3J5LCB0aGVuIHJ1biB0aGUgYXBwcm9wcmlhdGUgbWFrZWZpbGUsIGFzIHN1Z2dlc3RlZCBiZWxvdy4gIFlvdSBjYW4KLWRvbndsb2FkIE1BU00gZnJvbSBoZXJlOgotCi0gICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2Rvd25sb2Fkcy9kZXRhaWxzLmFzcHg/ZGlzcGxheWxhbmc9ZW4mRmFtaWx5SUQ9N2ExYzlkYTAtMDUxMC00NGEyLWIwNDItN2VmMzcwNTMwYzY0Ci0KLVlvdSBjYW4gYWxzbyBnZXQgb2JqZWN0cyBmaWxlcyBoZXJlOgotCi0gICAgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC96bGliMTI0X21hc21fb2JqLnppcAotCi1CdWlsZCBpbnN0cnVjdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBXaXRoIE1pY3Jvc29mdCBDIGFuZCBNQVNNOgotbm1ha2UgLWYgd2luMzIvTWFrZWZpbGUubXNjIExPQz0iLURBU01WIC1EQVNNSU5GIiBPQkpBPSJtYXRjaDY4Ni5vYmogaW5mZmFzMzIub2JqIgotCi0qIFdpdGggQm9ybGFuZCBDIGFuZCBUQVNNOgotbWFrZSAtZiB3aW4zMi9NYWtlZmlsZS5ib3IgTE9DQUxfWkxJQj0iLURBU01WIC1EQVNNSU5GIiBPQkpBPSJtYXRjaDY4Ni5vYmogaW5mZmFzMzIub2JqIiBPQkpQQT0iK21hdGNoNjg2Yy5vYmorbWF0Y2g2ODYub2JqK2luZmZhczMyLm9iaiIKLQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9taW5pemlwL01ha2VmaWxlIGIvc3JjL3psaWIvY29udHJpYi9taW5pemlwL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGVhYWQyLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLUNDPWNjCi1DRkxBR1M9LU8gLUkuLi8uLgotCi1VTlpfT0JKUyA9IG1pbml1bnoubyB1bnppcC5vIGlvYXBpLm8gLi4vLi4vbGliei5hCi1aSVBfT0JKUyA9IG1pbml6aXAubyB6aXAubyAgIGlvYXBpLm8gLi4vLi4vbGliei5hCi0KLS5jLm86Ci0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotYWxsOiBtaW5pdW56IG1pbml6aXAKLQotbWluaXVuejogICQoVU5aX09CSlMpCi0JJChDQykgJChDRkxBR1MpIC1vICRAICQoVU5aX09CSlMpCi0KLW1pbml6aXA6ICAkKFpJUF9PQkpTKQotCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCAkKFpJUF9PQkpTKQotCi10ZXN0OgltaW5pdW56IG1pbml6aXAKLQkuL21pbml6aXAgdGVzdCByZWFkbWUudHh0Ci0JLi9taW5pdW56IC1sIHRlc3QuemlwCi0JbXYgcmVhZG1lLnR4dCByZWFkbWUub2xkCi0JLi9taW5pdW56IHRlc3QuemlwCi0KLWNsZWFuOgotCS9iaW4vcm0gLWYgKi5vICp+IG1pbml6aXAgbWluaXVuegpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9taW5pemlwL01ha2VmaWxlLmFtIGIvc3JjL3psaWIvY29udHJpYi9taW5pemlwL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQzMDExLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLWxpYl9MVExJQlJBUklFUyA9IGxpYm1pbml6aXAubGEKLQotaWYgQ09ORF9ERU1PUwotYmluX1BST0dSQU1TID0gbWluaXVuemlwIG1pbml6aXAKLWVuZGlmCi0KLXpsaWJfdG9wX3NyY2RpciA9ICQodG9wX3NyY2RpcikvLi4vLi4KLXpsaWJfdG9wX2J1aWxkZGlyID0gJCh0b3BfYnVpbGRkaXIpLy4uLy4uCi0KLUFNX0NQUEZMQUdTID0gLUkkKHpsaWJfdG9wX3NyY2RpcikKLUFNX0xERkxBR1MgPSAtTCQoemxpYl90b3BfYnVpbGRkaXIpCi0KLWlmIFdJTjMyCi1pb3dpbjMyX3NyYyA9IGlvd2luMzIuYwotaW93aW4zMl9oID0gaW93aW4zMi5oCi1lbmRpZgotCi1saWJtaW5pemlwX2xhX1NPVVJDRVMgPSBcCi0JaW9hcGkuYyBcCi0JbXp0b29scy5jIFwKLQl1bnppcC5jIFwKLQl6aXAuYyBcCi0JJHtpb3dpbjMyX3NyY30KLQotbGlibWluaXppcF9sYV9MREZMQUdTID0gJChBTV9MREZMQUdTKSAtdmVyc2lvbi1pbmZvIDE6MDowIC1segotCi1taW5pemlwX2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL21pbml6aXAKLW1pbml6aXBfaW5jbHVkZV9IRUFERVJTID0gXAotCWNyeXB0LmggXAotCWlvYXBpLmggXAotCW16dG9vbHMuaCBcCi0JdW56aXAuaCBcCi0JemlwLmggXAotCSR7aW93aW4zMl9ofQotCi1wa2djb25maWdkaXIgPSAkKGxpYmRpcikvcGtnY29uZmlnCi1wa2djb25maWdfREFUQSA9IG1pbml6aXAucGMKLQotRVhUUkFfUFJPR1JBTVMgPSBtaW5pdW56aXAgbWluaXppcAotCi1taW5pdW56aXBfU09VUkNFUyA9IG1pbml1bnouYwotbWluaXVuemlwX0xEQUREID0gbGlibWluaXppcC5sYQotCi1taW5pemlwX1NPVVJDRVMgPSBtaW5pemlwLmMKLW1pbml6aXBfTERBREQgPSBsaWJtaW5pemlwLmxhIC1segpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9taW5pemlwL01pbmlaaXA2NF9DaGFuZ2VzLnR4dCBiL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9NaW5pWmlwNjRfQ2hhbmdlcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYTFiZDkuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9taW5pemlwL01pbmlaaXA2NF9DaGFuZ2VzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotCi1NaW5pWmlwIDEuMSB3YXMgZGVycml2ZWQgZnJvbSBNaW5pWmlwIGF0IHZlcnNpb24gMS4wMWYKLQotQ2hhbmdlIGluIDEuMCAoT2t0IDIwMDkpCi0gLSAqKlRPRE8gLSBBZGQgaGlzdG9yeSoqCi0KZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9NaW5pWmlwNjRfaW5mby50eHQgYi9zcmMvemxpYi9jb250cmliL21pbml6aXAvTWluaVppcDY0X2luZm8udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Q3MTUyLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9NaW5pWmlwNjRfaW5mby50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi1NaW5pWmlwIC0gQ29weXJpZ2h0IChjKSAxOTk4LTIwMTAgLSBieSBHaWxsZXMgVm9sbGFudCAtIHZlcnNpb24gMS4xIDY0IGJpdHMgZnJvbSBNYXRoaWFzIFN2ZW5zc29uCi0KLUludHJvZHVjdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NaW5pWmlwIDEuMSBpcyBidWlsdCBmcm9tIE1pbmlaaXAgMS4wIGJ5IEdpbGxlcyBWb2xsYW50ICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQotCi1XaGVuIGFkZGluZyBaSVA2NCBzdXBwb3J0IGludG8gbWluaXppcCBpdCB3b3VsZCByZXN1bHQgaW50byByaXNrIG9mIGJyZWFraW5nIGNvbXBhdGliaWxpdHkgd2l0aCBtaW5pemlwIDEuMC4KLUFsbCBwb3NzaWJsZSB3b3JrIHdhcyBkb25lIGZvciBjb21wYXRpYmlsaXR5LgotCi0KLUJhY2tncm91bmQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotV2hlbiBhZGRpbmcgWklQNjQgc3VwcG9ydCBNYXRoaWFzIFN2ZW5zc29uIGZvdW5kIHRoYXQgRXZlbiBSb3VhdWx0IGhhdmUgYWRkZWQgWklQNjQgCi1zdXBwb3J0IGZvciB1bnppcC5jIGludG8gbWluaXppcCBmb3IgYSBvcGVuIHNvdXJjZSBwcm9qZWN0IGNhbGxlZCBnZGFsICggaHR0cDovL3d3dy5nZGFsLm9yZy8gKQotCi1UaGF0IHdhcyB1c2VkIGFzIGEgc3RhcnRpbmcgcG9pbnQuIEFuZCBhZnRlciB0aGF0IFpJUDY0IHN1cHBvcnQgd2FzIGFkZGVkIHRvIHppcC5jCi1zb21lIHJlZmFjdG9yaW5nIGFuZCBjb2RlIGNsZWFudXAgd2FzIGFsc28gZG9uZS4KLQotCi1DaGFuZ2VkIGZyb20gTWluaVppcCAxLjAgdG8gTWluaVppcCAxLjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBBZGRlZCBaSVA2NCBzdXBwb3J0IGZvciB1bnppcCAoIGJ5IEV2ZW4gUm91YXVsdCApCi0qIEFkZGVkIFpJUDY0IHN1cHBvcnQgZm9yIHppcCAoIGJ5IE1hdGhpYXMgU3ZlbnNzb24gKQotKiBSZXZlcnRlZCBzb21lIGNoYW5nZWQgdGhhdCBFdmVuIFJvdWF1bHQgZGlkLgotKiBCdW5jaCBvZiBwYXRjaGVzIHJlY2VpdmVkIGZyb20gR3VsbGVzIFZvbGxhbnQgdGhhdCBoZSByZWNlaXZlZCBmb3IgTWluaVppcCBmcm9tIHZhcmlvdXMgdXNlcnMuCi0qIEFkZGVkIHVuemlwIHBhdGNoIGZvciBCWklQIENvbXByZXNzaW9uIG1ldGhvZCAocGF0Y2ggY3JlYXRlIGJ5IERhbmllbCBCb3JjYSkKLSogQWRkZWQgQlpJUCBDb21wcmVzcyBtZXRob2QgZm9yIHppcAotKiBEaWQgc29tZSByZWZhY3RvcmluZyBhbmQgY29kZSBjbGVhbnVwCi0KLQotQ3JlZGl0cwotCi0gR2lsbGVzIFZvbGxhbnQgICAgLSBPcmlnaW5hbCBNaW5pWmlwIGF1dGhvcgotIEV2ZW4gUm91YXVsdCAgICAgIC0gWklQNjQgdW56aXAgU3VwcG9ydAotIERhbmllbCBCb3JjYSAgICAgIC0gQlppcCBDb21wcmVzc2lvbiBtZXRob2Qgc3VwcG9ydCBpbiB1bnppcAotIE1hdGhpYXMgU3ZlbnNzb24gIC0gWklQNjQgemlwIHN1cHBvcnQKLSBNYXRoaWFzIFN2ZW5zc29uICAtIEJaaXAgQ29tcHJlc3Npb24gbWV0aG9kIHN1cHBvcnQgaW4gemlwCi0KLSBSZXNvdXJjZXMKLQotIFppcExheW91dCAgIGh0dHA6Ly9yZXN1bHQ0Mi5jb20vcHJvamVjdHMvWmlwRmlsZUxheW91dAotICAgICAgICAgICAgIENvbW1hbmQgbGluZSB0b29sIGZvciBXaW5kb3dzIHRoYXQgc2hvd3MgdGhlIGxheW91dCBhbmQgaW5mb3JtYXRpb24gb2YgdGhlIGhlYWRlcnMgaW4gYSB6aXAgYXJjaGl2ZS4KLSAgICAgICAgICAgICBVc2VkIHdoZW4gZGVidWdnaW5nIGFuZCB2YWxpZGF0aW5nIHRoZSBjcmVhdGlvbiBvZiB6aXAgZmlsZXMgdXNpbmcgTWluaVppcDY0Ci0KLQotIFpJUCBBcHAgTm90ZSAgaHR0cDovL3d3dy5wa3dhcmUuY29tL2RvY3VtZW50cy9jYXNlc3R1ZGllcy9BUFBOT1RFLlRYVAotICAgICAgICAgICAgICAgWmlwIEZpbGUgc3BlY2lmaWNhdGlvbgotCi0KLU5vdGVzLgotICogVG8gYmUgYWJsZSB0byB1c2UgQlppcCBjb21wcmVzc2lvbiBtZXRob2QgaW4gemlwNjQuYyBvciB1bnppcDY0LmMgdGhlIEJaSVAyIGxpYiBpcyBuZWVkZWQgYW5kIEhBVkVfQlpJUDIgbmVlZCB0byBiZSBkZWZpbmVkLgotCi1MaWNlbnNlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBDb25kaXRpb24gb2YgdXNlIGFuZCBkaXN0cmlidXRpb24gYXJlIHRoZSBzYW1lIHRoYW4gemxpYiA6Ci0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9jb25maWd1cmUuYWMgYi9zcmMvemxpYi9jb250cmliL21pbml6aXAvY29uZmlndXJlLmFjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTlhZjIxLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9jb25maWd1cmUuYWMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0jIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLUFDX0lOSVQoW21pbml6aXBdLCBbMS4yLjddLCBbYnVnemlsbGEucmVkaGF0LmNvbV0pCi1BQ19DT05GSUdfU1JDRElSKFttaW5pemlwLmNdKQotQU1fSU5JVF9BVVRPTUFLRShbZm9yZWlnbl0pCi1MVF9JTklUCi0KLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBleGFtcGxlIHByb2dyYW1zXSkKLUFDX0FSR19FTkFCTEUoW2RlbW9zXSwgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWRlbW9zXSwgW2J1aWxkIGV4YW1wbGUgcHJvZ3JhbXNdKSkKLUFNX0NPTkRJVElPTkFMKFtDT05EX0RFTU9TXSwgW3Rlc3QgIiRlbmFibGVfZGVtb3MiID0geWVzXSkKLWlmIHRlc3QgIiRlbmFibGVfZGVtb3MiID0geWVzCi10aGVuCi0JQUNfTVNHX1JFU1VMVChbeWVzXSkKLWVsc2UKLQlBQ19NU0dfUkVTVUxUKFtub10pCi1maQotCi1jYXNlICIke2hvc3R9IiBpbgotCSotbWluZ3cqIHwgbWluZ3cqKQotCQlXSU4zMj0ieWVzIgotCQk7OwotCSopCi0JCTs7Ci1lc2FjCi1BTV9DT05ESVRJT05BTChbV0lOMzJdLCBbdGVzdCAiJHtXSU4zMn0iID0gInllcyJdKQotCi0KLUFDX1NVQlNUKFtIQVZFX1VOSVNURF9IXSwgWzBdKQotQUNfQ0hFQ0tfSEVBREVSKFt1bmlzdGQuaF0sIFtIQVZFX1VOSVNURF9IPTFdLCBbXSkKLUFDX0NPTkZJR19GSUxFUyhbTWFrZWZpbGUgbWluaXppcC5wY10pCi1BQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9jcnlwdC5oIGIvc3JjL3psaWIvY29udHJpYi9taW5pemlwL2NyeXB0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMWQwOGQuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9taW5pemlwL2NyeXB0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyogY3J5cHQuaCAtLSBiYXNlIGNvZGUgZm9yIGNyeXB0L3VuY3J5cHQgWklQZmlsZQotCi0KLSAgIFZlcnNpb24gMS4wMWUsIEZlYnJ1YXJ5IDEydGgsIDIwMDUKLQotICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDUgR2lsbGVzIFZvbGxhbnQKLQotICAgVGhpcyBjb2RlIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBjcnlwdGluZyBjb2RlIGluIEluZm96aXAgZGlzdHJpYnV0aW9uCi0KLSAgIFRoZSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcGFydHMgb2YgdGhpcyBzb3VyY2UgY29kZSAoYXMgb3Bwb3NlZCB0byB0aGUKLSAgIG5vbi1lY2hvaW5nIHBhc3N3b3JkIHBhcnRzKSB3ZXJlIG9yaWdpbmFsbHkgd3JpdHRlbiBpbiBFdXJvcGUuICBUaGUKLSAgIHdob2xlIHNvdXJjZSBwYWNrYWdlIGNhbiBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQsIGluY2x1ZGluZyBmcm9tIHRoZSBVU0EuCi0gICAoUHJpb3IgdG8gSmFudWFyeSAyMDAwLCByZS1leHBvcnQgZnJvbSB0aGUgVVMgd2FzIGEgdmlvbGF0aW9uIG9mIFVTIGxhdy4pCi0KLSAgIFRoaXMgZW5jcnlwdGlvbiBjb2RlIGlzIGEgZGlyZWN0IHRyYW5zY3JpcHRpb24gb2YgdGhlIGFsZ29yaXRobSBmcm9tCi0gICBSb2dlciBTY2hsYWZseSwgZGVzY3JpYmVkIGJ5IFBoaWwgS2F0eiBpbiB0aGUgZmlsZSBhcHBub3RlLnR4dC4gIFRoaXMKLSAgIGZpbGUgKGFwcG5vdGUudHh0KSBpcyBkaXN0cmlidXRlZCB3aXRoIHRoZSBQS1pJUCBwcm9ncmFtIChldmVuIGluIHRoZQotICAgdmVyc2lvbiB3aXRob3V0IGVuY3J5cHRpb24gY2FwYWJpbGl0aWVzKS4KLQotICAgSWYgeW91IGRvbid0IG5lZWQgY3J5cHRpbmcgaW4geW91ciBhcHBsaWNhdGlvbiwganVzdCBkZWZpbmUgc3ltYm9scwotICAgTk9DUllQVCBhbmQgTk9VTkNSWVBULgotCi0gICBUaGlzIGNvZGUgc3VwcG9ydCB0aGUgIlRyYWRpdGlvbmFsIFBLV0FSRSBFbmNyeXB0aW9uIi4KLQotICAgVGhlIG5ldyBBRVMgZW5jcnlwdGlvbiBhZGRlZCBvbiBaaXAgZm9ybWF0IGJ5IFdpbnppcCAoc2VlIHRoZSBwYWdlCi0gICBodHRwOi8vd3d3LndpbnppcC5jb20vYWVzX2luZm8uaHRtICkgYW5kIFBLV2FyZSBQS1ppcCA1LnggU3Ryb25nCi0gICBFbmNyeXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0qLwotCi0jZGVmaW5lIENSQzMyKGMsIGIpICgoKihwY3JjXzMyX3RhYisoKChpbnQpKGMpIF4gKGIpKSAmIDB4ZmYpKSkgXiAoKGMpID4+IDgpKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJldHVybiB0aGUgbmV4dCBieXRlIGluIHRoZSBwc2V1ZG8tcmFuZG9tIHNlcXVlbmNlCi0gKi8KLXN0YXRpYyBpbnQgZGVjcnlwdF9ieXRlKHVuc2lnbmVkIGxvbmcqIHBrZXlzLCBjb25zdCB1bnNpZ25lZCBsb25nKiBwY3JjXzMyX3RhYikKLXsKLSAgICB1bnNpZ25lZCB0ZW1wOyAgLyogUE9URU5USUFMIEJVRzogIHRlbXAqKHRlbXBeMSkgbWF5IG92ZXJmbG93IGluIGFuCi0gICAgICAgICAgICAgICAgICAgICAqIHVucHJlZGljdGFibGUgbWFubmVyIG9uIDE2LWJpdCBzeXN0ZW1zOyBub3QgYSBwcm9ibGVtCi0gICAgICAgICAgICAgICAgICAgICAqIHdpdGggYW55IGtub3duIGNvbXBpbGVyIHNvIGZhciwgdGhvdWdoICovCi0KLSAgICB0ZW1wID0gKCh1bnNpZ25lZCkoKihwa2V5cysyKSkgJiAweGZmZmYpIHwgMjsKLSAgICByZXR1cm4gKGludCkoKCh0ZW1wICogKHRlbXAgXiAxKSkgPj4gOCkgJiAweGZmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBVcGRhdGUgdGhlIGVuY3J5cHRpb24ga2V5cyB3aXRoIHRoZSBuZXh0IGJ5dGUgb2YgcGxhaW4gdGV4dAotICovCi1zdGF0aWMgaW50IHVwZGF0ZV9rZXlzKHVuc2lnbmVkIGxvbmcqIHBrZXlzLGNvbnN0IHVuc2lnbmVkIGxvbmcqIHBjcmNfMzJfdGFiLGludCBjKQotewotICAgICgqKHBrZXlzKzApKSA9IENSQzMyKCgqKHBrZXlzKzApKSwgYyk7Ci0gICAgKCoocGtleXMrMSkpICs9ICgqKHBrZXlzKzApKSAmIDB4ZmY7Ci0gICAgKCoocGtleXMrMSkpID0gKCoocGtleXMrMSkpICogMTM0Nzc1ODEzTCArIDE7Ci0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IGtleXNoaWZ0ID0gKGludCkoKCoocGtleXMrMSkpID4+IDI0KTsKLSAgICAgICgqKHBrZXlzKzIpKSA9IENSQzMyKCgqKHBrZXlzKzIpKSwga2V5c2hpZnQpOwotICAgIH0KLSAgICByZXR1cm4gYzsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEluaXRpYWxpemUgdGhlIGVuY3J5cHRpb24ga2V5cyBhbmQgdGhlIHJhbmRvbSBoZWFkZXIgYWNjb3JkaW5nIHRvCi0gKiB0aGUgZ2l2ZW4gcGFzc3dvcmQuCi0gKi8KLXN0YXRpYyB2b2lkIGluaXRfa2V5cyhjb25zdCBjaGFyKiBwYXNzd2QsdW5zaWduZWQgbG9uZyogcGtleXMsY29uc3QgdW5zaWduZWQgbG9uZyogcGNyY18zMl90YWIpCi17Ci0gICAgKihwa2V5cyswKSA9IDMwNTQxOTg5Nkw7Ci0gICAgKihwa2V5cysxKSA9IDU5MTc1MTA0OUw7Ci0gICAgKihwa2V5cysyKSA9IDg3ODA4MjE5Mkw7Ci0gICAgd2hpbGUgKCpwYXNzd2QgIT0gJ1wwJykgewotICAgICAgICB1cGRhdGVfa2V5cyhwa2V5cyxwY3JjXzMyX3RhYiwoaW50KSpwYXNzd2QpOwotICAgICAgICBwYXNzd2QrKzsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgemRlY29kZShwa2V5cyxwY3JjXzMyX3RhYixjKSBcCi0gICAgKHVwZGF0ZV9rZXlzKHBrZXlzLHBjcmNfMzJfdGFiLGMgXj0gZGVjcnlwdF9ieXRlKHBrZXlzLHBjcmNfMzJfdGFiKSkpCi0KLSNkZWZpbmUgemVuY29kZShwa2V5cyxwY3JjXzMyX3RhYixjLHQpIFwKLSAgICAodD1kZWNyeXB0X2J5dGUocGtleXMscGNyY18zMl90YWIpLCB1cGRhdGVfa2V5cyhwa2V5cyxwY3JjXzMyX3RhYixjKSwgdF4oYykpCi0KLSNpZmRlZiBJTkNMVURFQ1JZUFRJTkdDT0RFX0lGQ1JZUFRBTExPV0VECi0KLSNkZWZpbmUgUkFORF9IRUFEX0xFTiAgMTIKLSAgIC8qICJsYXN0IHJlc29ydCIgc291cmNlIGZvciBzZWNvbmQgcGFydCBvZiBjcnlwdCBzZWVkIHBhdHRlcm4gKi8KLSMgIGlmbmRlZiBaQ1JfU0VFRDIKLSMgICAgZGVmaW5lIFpDUl9TRUVEMiAzMTQxNTkyNjU0VUwgICAgIC8qIHVzZSBQSSBhcyBkZWZhdWx0IHBhdHRlcm4gKi8KLSMgIGVuZGlmCi0KLXN0YXRpYyBpbnQgY3J5cHRoZWFkKGNvbnN0IGNoYXIqIHBhc3N3ZCwgICAgICAvKiBwYXNzd29yZCBzdHJpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZiwgICAgICAvKiB3aGVyZSB0byB3cml0ZSBoZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgIGludCBidWZTaXplLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyogcGtleXMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nKiBwY3JjXzMyX3RhYiwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY3JjRm9yQ3J5cHRpbmcpCi17Ci0gICAgaW50IG47ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiByYW5kb20gaGVhZGVyICovCi0gICAgaW50IHQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3JhcnkgKi8KLSAgICBpbnQgYzsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJhbmRvbSBieXRlICovCi0gICAgdW5zaWduZWQgY2hhciBoZWFkZXJbUkFORF9IRUFEX0xFTi0yXTsgLyogcmFuZG9tIGhlYWRlciAqLwotICAgIHN0YXRpYyB1bnNpZ25lZCBjYWxscyA9IDA7ICAgLyogZW5zdXJlIGRpZmZlcmVudCByYW5kb20gaGVhZGVyIGVhY2ggdGltZSAqLwotCi0gICAgaWYgKGJ1ZlNpemU8UkFORF9IRUFEX0xFTikKLSAgICAgIHJldHVybiAwOwotCi0gICAgLyogRmlyc3QgZ2VuZXJhdGUgUkFORF9IRUFEX0xFTi0yIHJhbmRvbSBieXRlcy4gV2UgZW5jcnlwdCB0aGUKLSAgICAgKiBvdXRwdXQgb2YgcmFuZCgpIHRvIGdldCBsZXNzIHByZWRpY3RhYmlsaXR5LCBzaW5jZSByYW5kKCkgaXMKLSAgICAgKiBvZnRlbiBwb29ybHkgaW1wbGVtZW50ZWQuCi0gICAgICovCi0gICAgaWYgKCsrY2FsbHMgPT0gMSkKLSAgICB7Ci0gICAgICAgIHNyYW5kKCh1bnNpZ25lZCkodGltZShOVUxMKSBeIFpDUl9TRUVEMikpOwotICAgIH0KLSAgICBpbml0X2tleXMocGFzc3dkLCBwa2V5cywgcGNyY18zMl90YWIpOwotICAgIGZvciAobiA9IDA7IG4gPCBSQU5EX0hFQURfTEVOLTI7IG4rKykKLSAgICB7Ci0gICAgICAgIGMgPSAocmFuZCgpID4+IDcpICYgMHhmZjsKLSAgICAgICAgaGVhZGVyW25dID0gKHVuc2lnbmVkIGNoYXIpemVuY29kZShwa2V5cywgcGNyY18zMl90YWIsIGMsIHQpOwotICAgIH0KLSAgICAvKiBFbmNyeXB0IHJhbmRvbSBoZWFkZXIgKGxhc3QgdHdvIGJ5dGVzIGlzIGhpZ2ggd29yZCBvZiBjcmMpICovCi0gICAgaW5pdF9rZXlzKHBhc3N3ZCwgcGtleXMsIHBjcmNfMzJfdGFiKTsKLSAgICBmb3IgKG4gPSAwOyBuIDwgUkFORF9IRUFEX0xFTi0yOyBuKyspCi0gICAgewotICAgICAgICBidWZbbl0gPSAodW5zaWduZWQgY2hhcil6ZW5jb2RlKHBrZXlzLCBwY3JjXzMyX3RhYiwgaGVhZGVyW25dLCB0KTsKLSAgICB9Ci0gICAgYnVmW24rK10gPSAodW5zaWduZWQgY2hhcil6ZW5jb2RlKHBrZXlzLCBwY3JjXzMyX3RhYiwgKGludCkoY3JjRm9yQ3J5cHRpbmcgPj4gMTYpICYgMHhmZiwgdCk7Ci0gICAgYnVmW24rK10gPSAodW5zaWduZWQgY2hhcil6ZW5jb2RlKHBrZXlzLCBwY3JjXzMyX3RhYiwgKGludCkoY3JjRm9yQ3J5cHRpbmcgPj4gMjQpICYgMHhmZiwgdCk7Ci0gICAgcmV0dXJuIG47Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9taW5pemlwL2lvYXBpLmMgYi9zcmMvemxpYi9jb250cmliL21pbml6aXAvaW9hcGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y1YzE5MS4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL21pbml6aXAvaW9hcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKiBpb2FwaS5oIC0tIElPIGJhc2UgZnVuY3Rpb24gaGVhZGVyIGZvciBjb21wcmVzcy91bmNvbXByZXNzIC56aXAKLSAgIHBhcnQgb2YgdGhlIE1pbmlaaXAgcHJvamVjdCAtICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQotCi0gICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxMCBHaWxsZXMgVm9sbGFudCAobWluaXppcCkgKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCi0KLSAgICAgICAgIE1vZGlmaWNhdGlvbnMgZm9yIFppcDY0IHN1cHBvcnQKLSAgICAgICAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1hdGhpYXMgU3ZlbnNzb24gKCBodHRwOi8vcmVzdWx0NDIuY29tICkKLQotICAgICAgICAgRm9yIG1vcmUgaW5mbyByZWFkIE1pbmlaaXBfaW5mby50eHQKLQotKi8KLQotI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAoIShkZWZpbmVkKF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTKSkpCi0gICAgICAgICNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoSU9BUElfTk9fNjQpCi0vLyBJbiBkYXJ3aW4gYW5kIHBlcmhhcHMgb3RoZXIgQlNEIHZhcmlhbnRzIG9mZl90IGlzIGEgNjQgYml0IHZhbHVlLCBoZW5jZSBubyBuZWVkIGZvciBzcGVjaWZpYyA2NCBiaXQgZnVuY3Rpb25zCi0jZGVmaW5lIEZPUEVOX0ZVTkMoZmlsZW5hbWUsIG1vZGUpIGZvcGVuKGZpbGVuYW1lLCBtb2RlKQotI2RlZmluZSBGVEVMTE9fRlVOQyhzdHJlYW0pIGZ0ZWxsbyhzdHJlYW0pCi0jZGVmaW5lIEZTRUVLT19GVU5DKHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pIGZzZWVrbyhzdHJlYW0sIG9mZnNldCwgb3JpZ2luKQotI2Vsc2UKLSNkZWZpbmUgRk9QRU5fRlVOQyhmaWxlbmFtZSwgbW9kZSkgZm9wZW42NChmaWxlbmFtZSwgbW9kZSkKLSNkZWZpbmUgRlRFTExPX0ZVTkMoc3RyZWFtKSBmdGVsbG82NChzdHJlYW0pCi0jZGVmaW5lIEZTRUVLT19GVU5DKHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pIGZzZWVrbzY0KHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pCi0jZW5kaWYKLQotCi0jaW5jbHVkZSAiaW9hcGkuaCIKLQotdm9pZHBmIGNhbGxfem9wZW42NCAoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcGZpbGVmdW5jLGNvbnN0IHZvaWQqZmlsZW5hbWUsaW50IG1vZGUpCi17Ci0gICAgaWYgKHBmaWxlZnVuYy0+emZpbGVfZnVuYzY0LnpvcGVuNjRfZmlsZSAhPSBOVUxMKQotICAgICAgICByZXR1cm4gKCoocGZpbGVmdW5jLT56ZmlsZV9mdW5jNjQuem9wZW42NF9maWxlKSkgKHBmaWxlZnVuYy0+emZpbGVfZnVuYzY0Lm9wYXF1ZSxmaWxlbmFtZSxtb2RlKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKCoocGZpbGVmdW5jLT56b3BlbjMyX2ZpbGUpKShwZmlsZWZ1bmMtPnpmaWxlX2Z1bmM2NC5vcGFxdWUsKGNvbnN0IGNoYXIqKWZpbGVuYW1lLG1vZGUpOwotICAgIH0KLX0KLQotbG9uZyBjYWxsX3pzZWVrNjQgKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHBmaWxlZnVuYyx2b2lkcGYgZmlsZXN0cmVhbSwgWlBPUzY0X1Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQotewotICAgIGlmIChwZmlsZWZ1bmMtPnpmaWxlX2Z1bmM2NC56c2VlazY0X2ZpbGUgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuICgqKHBmaWxlZnVuYy0+emZpbGVfZnVuYzY0LnpzZWVrNjRfZmlsZSkpIChwZmlsZWZ1bmMtPnpmaWxlX2Z1bmM2NC5vcGFxdWUsZmlsZXN0cmVhbSxvZmZzZXQsb3JpZ2luKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICB1TG9uZyBvZmZzZXRUcnVuY2F0ZWQgPSAodUxvbmcpb2Zmc2V0OwotICAgICAgICBpZiAob2Zmc2V0VHJ1bmNhdGVkICE9IG9mZnNldCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuICgqKHBmaWxlZnVuYy0+enNlZWszMl9maWxlKSkocGZpbGVmdW5jLT56ZmlsZV9mdW5jNjQub3BhcXVlLGZpbGVzdHJlYW0sb2Zmc2V0VHJ1bmNhdGVkLG9yaWdpbik7Ci0gICAgfQotfQotCi1aUE9TNjRfVCBjYWxsX3p0ZWxsNjQgKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHBmaWxlZnVuYyx2b2lkcGYgZmlsZXN0cmVhbSkKLXsKLSAgICBpZiAocGZpbGVmdW5jLT56ZmlsZV9mdW5jNjQuenNlZWs2NF9maWxlICE9IE5VTEwpCi0gICAgICAgIHJldHVybiAoKihwZmlsZWZ1bmMtPnpmaWxlX2Z1bmM2NC56dGVsbDY0X2ZpbGUpKSAocGZpbGVmdW5jLT56ZmlsZV9mdW5jNjQub3BhcXVlLGZpbGVzdHJlYW0pOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHVMb25nIHRlbGxfdUxvbmcgPSAoKihwZmlsZWZ1bmMtPnp0ZWxsMzJfZmlsZSkpKHBmaWxlZnVuYy0+emZpbGVfZnVuYzY0Lm9wYXF1ZSxmaWxlc3RyZWFtKTsKLSAgICAgICAgaWYgKCh0ZWxsX3VMb25nKSA9PSBNQVhVMzIpCi0gICAgICAgICAgICByZXR1cm4gKFpQT1M2NF9UKS0xOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gdGVsbF91TG9uZzsKLSAgICB9Ci19Ci0KLXZvaWQgZmlsbF96bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2Zyb21fZmlsZWZ1bmMzMih6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwX2ZpbGVmdW5jNjRfMzIsY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHBfZmlsZWZ1bmMzMikKLXsKLSAgICBwX2ZpbGVmdW5jNjRfMzItPnpmaWxlX2Z1bmM2NC56b3BlbjY0X2ZpbGUgPSBOVUxMOwotICAgIHBfZmlsZWZ1bmM2NF8zMi0+em9wZW4zMl9maWxlID0gcF9maWxlZnVuYzMyLT56b3Blbl9maWxlOwotICAgIHBfZmlsZWZ1bmM2NF8zMi0+emZpbGVfZnVuYzY0LnplcnJvcl9maWxlID0gcF9maWxlZnVuYzMyLT56ZXJyb3JfZmlsZTsKLSAgICBwX2ZpbGVmdW5jNjRfMzItPnpmaWxlX2Z1bmM2NC56cmVhZF9maWxlID0gcF9maWxlZnVuYzMyLT56cmVhZF9maWxlOwotICAgIHBfZmlsZWZ1bmM2NF8zMi0+emZpbGVfZnVuYzY0Lnp3cml0ZV9maWxlID0gcF9maWxlZnVuYzMyLT56d3JpdGVfZmlsZTsKLSAgICBwX2ZpbGVmdW5jNjRfMzItPnpmaWxlX2Z1bmM2NC56dGVsbDY0X2ZpbGUgPSBOVUxMOwotICAgIHBfZmlsZWZ1bmM2NF8zMi0+emZpbGVfZnVuYzY0LnpzZWVrNjRfZmlsZSA9IE5VTEw7Ci0gICAgcF9maWxlZnVuYzY0XzMyLT56ZmlsZV9mdW5jNjQuemNsb3NlX2ZpbGUgPSBwX2ZpbGVmdW5jMzItPnpjbG9zZV9maWxlOwotICAgIHBfZmlsZWZ1bmM2NF8zMi0+emZpbGVfZnVuYzY0LnplcnJvcl9maWxlID0gcF9maWxlZnVuYzMyLT56ZXJyb3JfZmlsZTsKLSAgICBwX2ZpbGVmdW5jNjRfMzItPnpmaWxlX2Z1bmM2NC5vcGFxdWUgPSBwX2ZpbGVmdW5jMzItPm9wYXF1ZTsKLSAgICBwX2ZpbGVmdW5jNjRfMzItPnpzZWVrMzJfZmlsZSA9IHBfZmlsZWZ1bmMzMi0+enNlZWtfZmlsZTsKLSAgICBwX2ZpbGVmdW5jNjRfMzItPnp0ZWxsMzJfZmlsZSA9IHBfZmlsZWZ1bmMzMi0+enRlbGxfZmlsZTsKLX0KLQotCi0KLXN0YXRpYyB2b2lkcGYgIFpDQUxMQkFDSyBmb3Blbl9maWxlX2Z1bmMgT0YoKHZvaWRwZiBvcGFxdWUsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbW9kZSkpOwotc3RhdGljIHVMb25nICAgWkNBTExCQUNLIGZyZWFkX2ZpbGVfZnVuYyBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgdm9pZCogYnVmLCB1TG9uZyBzaXplKSk7Ci1zdGF0aWMgdUxvbmcgICBaQ0FMTEJBQ0sgZndyaXRlX2ZpbGVfZnVuYyBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgY29uc3Qgdm9pZCogYnVmLHVMb25nIHNpemUpKTsKLXN0YXRpYyBaUE9TNjRfVCBaQ0FMTEJBQ0sgZnRlbGw2NF9maWxlX2Z1bmMgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pKTsKLXN0YXRpYyBsb25nICAgIFpDQUxMQkFDSyBmc2VlazY0X2ZpbGVfZnVuYyBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgWlBPUzY0X1Qgb2Zmc2V0LCBpbnQgb3JpZ2luKSk7Ci1zdGF0aWMgaW50ICAgICBaQ0FMTEJBQ0sgZmNsb3NlX2ZpbGVfZnVuYyBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOwotc3RhdGljIGludCAgICAgWkNBTExCQUNLIGZlcnJvcl9maWxlX2Z1bmMgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pKTsKLQotc3RhdGljIHZvaWRwZiBaQ0FMTEJBQ0sgZm9wZW5fZmlsZV9mdW5jICh2b2lkcGYgb3BhcXVlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IG1vZGUpCi17Ci0gICAgRklMRSogZmlsZSA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciogbW9kZV9mb3BlbiA9IE5VTEw7Ci0gICAgaWYgKChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX1JFQURXUklURUZJTFRFUik9PVpMSUJfRklMRUZVTkNfTU9ERV9SRUFEKQotICAgICAgICBtb2RlX2ZvcGVuID0gInJiIjsKLSAgICBlbHNlCi0gICAgaWYgKG1vZGUgJiBaTElCX0ZJTEVGVU5DX01PREVfRVhJU1RJTkcpCi0gICAgICAgIG1vZGVfZm9wZW4gPSAicitiIjsKLSAgICBlbHNlCi0gICAgaWYgKG1vZGUgJiBaTElCX0ZJTEVGVU5DX01PREVfQ1JFQVRFKQotICAgICAgICBtb2RlX2ZvcGVuID0gIndiIjsKLQotICAgIGlmICgoZmlsZW5hbWUhPU5VTEwpICYmIChtb2RlX2ZvcGVuICE9IE5VTEwpKQotICAgICAgICBmaWxlID0gZm9wZW4oZmlsZW5hbWUsIG1vZGVfZm9wZW4pOwotICAgIHJldHVybiBmaWxlOwotfQotCi1zdGF0aWMgdm9pZHBmIFpDQUxMQkFDSyBmb3BlbjY0X2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSwgY29uc3Qgdm9pZCogZmlsZW5hbWUsIGludCBtb2RlKQotewotICAgIEZJTEUqIGZpbGUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIqIG1vZGVfZm9wZW4gPSBOVUxMOwotICAgIGlmICgobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9SRUFEV1JJVEVGSUxURVIpPT1aTElCX0ZJTEVGVU5DX01PREVfUkVBRCkKLSAgICAgICAgbW9kZV9mb3BlbiA9ICJyYiI7Ci0gICAgZWxzZQotICAgIGlmIChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX0VYSVNUSU5HKQotICAgICAgICBtb2RlX2ZvcGVuID0gInIrYiI7Ci0gICAgZWxzZQotICAgIGlmIChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX0NSRUFURSkKLSAgICAgICAgbW9kZV9mb3BlbiA9ICJ3YiI7Ci0KLSAgICBpZiAoKGZpbGVuYW1lIT1OVUxMKSAmJiAobW9kZV9mb3BlbiAhPSBOVUxMKSkKLSAgICAgICAgZmlsZSA9IEZPUEVOX0ZVTkMoKGNvbnN0IGNoYXIqKWZpbGVuYW1lLCBtb2RlX2ZvcGVuKTsKLSAgICByZXR1cm4gZmlsZTsKLX0KLQotCi1zdGF0aWMgdUxvbmcgWkNBTExCQUNLIGZyZWFkX2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgdm9pZCogYnVmLCB1TG9uZyBzaXplKQotewotICAgIHVMb25nIHJldDsKLSAgICByZXQgPSAodUxvbmcpZnJlYWQoYnVmLCAxLCAoc2l6ZV90KXNpemUsIChGSUxFICopc3RyZWFtKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdUxvbmcgWkNBTExCQUNLIGZ3cml0ZV9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0sIGNvbnN0IHZvaWQqIGJ1ZiwgdUxvbmcgc2l6ZSkKLXsKLSAgICB1TG9uZyByZXQ7Ci0gICAgcmV0ID0gKHVMb25nKWZ3cml0ZShidWYsIDEsIChzaXplX3Qpc2l6ZSwgKEZJTEUgKilzdHJlYW0pOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBsb25nIFpDQUxMQkFDSyBmdGVsbF9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pCi17Ci0gICAgbG9uZyByZXQ7Ci0gICAgcmV0ID0gZnRlbGwoKEZJTEUgKilzdHJlYW0pOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIFpQT1M2NF9UIFpDQUxMQkFDSyBmdGVsbDY0X2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkKLXsKLSAgICBaUE9TNjRfVCByZXQ7Ci0gICAgcmV0ID0gRlRFTExPX0ZVTkMoKEZJTEUgKilzdHJlYW0pOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBsb25nIFpDQUxMQkFDSyBmc2Vla19maWxlX2Z1bmMgKHZvaWRwZiAgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCB1TG9uZyBvZmZzZXQsIGludCBvcmlnaW4pCi17Ci0gICAgaW50IGZzZWVrX29yaWdpbj0wOwotICAgIGxvbmcgcmV0OwotICAgIHN3aXRjaCAob3JpZ2luKQotICAgIHsKLSAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19DVVIgOgotICAgICAgICBmc2Vla19vcmlnaW4gPSBTRUVLX0NVUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBaTElCX0ZJTEVGVU5DX1NFRUtfRU5EIDoKLSAgICAgICAgZnNlZWtfb3JpZ2luID0gU0VFS19FTkQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCA6Ci0gICAgICAgIGZzZWVrX29yaWdpbiA9IFNFRUtfU0VUOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OiByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldCA9IDA7Ci0gICAgaWYgKGZzZWVrKChGSUxFICopc3RyZWFtLCBvZmZzZXQsIGZzZWVrX29yaWdpbikgIT0gMCkKLSAgICAgICAgcmV0ID0gLTE7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGxvbmcgWkNBTExCQUNLIGZzZWVrNjRfZmlsZV9mdW5jICh2b2lkcGYgIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgWlBPUzY0X1Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQotewotICAgIGludCBmc2Vla19vcmlnaW49MDsKLSAgICBsb25nIHJldDsKLSAgICBzd2l0Y2ggKG9yaWdpbikKLSAgICB7Ci0gICAgY2FzZSBaTElCX0ZJTEVGVU5DX1NFRUtfQ1VSIDoKLSAgICAgICAgZnNlZWtfb3JpZ2luID0gU0VFS19DVVI7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX0VORCA6Ci0gICAgICAgIGZzZWVrX29yaWdpbiA9IFNFRUtfRU5EOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19TRVQgOgotICAgICAgICBmc2Vla19vcmlnaW4gPSBTRUVLX1NFVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXQgPSAwOwotCi0gICAgaWYoRlNFRUtPX0ZVTkMoKEZJTEUgKilzdHJlYW0sIG9mZnNldCwgZnNlZWtfb3JpZ2luKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLTE7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgWkNBTExCQUNLIGZjbG9zZV9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pCi17Ci0gICAgaW50IHJldDsKLSAgICByZXQgPSBmY2xvc2UoKEZJTEUgKilzdHJlYW0pOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgWkNBTExCQUNLIGZlcnJvcl9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pCi17Ci0gICAgaW50IHJldDsKLSAgICByZXQgPSBmZXJyb3IoKEZJTEUgKilzdHJlYW0pOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgZmlsbF9mb3Blbl9maWxlZnVuYyAocHpsaWJfZmlsZWZ1bmNfZGVmKQotICB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmOwotewotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+em9wZW5fZmlsZSA9IGZvcGVuX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnpyZWFkX2ZpbGUgPSBmcmVhZF9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56d3JpdGVfZmlsZSA9IGZ3cml0ZV9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56dGVsbF9maWxlID0gZnRlbGxfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enNlZWtfZmlsZSA9IGZzZWVrX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnpjbG9zZV9maWxlID0gZmNsb3NlX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnplcnJvcl9maWxlID0gZmVycm9yX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPm9wYXF1ZSA9IE5VTEw7Ci19Ci0KLXZvaWQgZmlsbF9mb3BlbjY0X2ZpbGVmdW5jICh6bGliX2ZpbGVmdW5jNjRfZGVmKiAgcHpsaWJfZmlsZWZ1bmNfZGVmKQotewotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+em9wZW42NF9maWxlID0gZm9wZW42NF9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56cmVhZF9maWxlID0gZnJlYWRfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+endyaXRlX2ZpbGUgPSBmd3JpdGVfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enRlbGw2NF9maWxlID0gZnRlbGw2NF9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56c2VlazY0X2ZpbGUgPSBmc2VlazY0X2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnpjbG9zZV9maWxlID0gZmNsb3NlX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnplcnJvcl9maWxlID0gZmVycm9yX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPm9wYXF1ZSA9IE5VTEw7Ci19CmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL21pbml6aXAvaW9hcGkuaCBiL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9pb2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGNiZGIwLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9pb2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qIGlvYXBpLmggLS0gSU8gYmFzZSBmdW5jdGlvbiBoZWFkZXIgZm9yIGNvbXByZXNzL3VuY29tcHJlc3MgLnppcAotICAgcGFydCBvZiB0aGUgTWluaVppcCBwcm9qZWN0IC0gKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCi0KLSAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDEwIEdpbGxlcyBWb2xsYW50IChtaW5pemlwKSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKLQotICAgICAgICAgTW9kaWZpY2F0aW9ucyBmb3IgWmlwNjQgc3VwcG9ydAotICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTWF0aGlhcyBTdmVuc3NvbiAoIGh0dHA6Ly9yZXN1bHQ0Mi5jb20gKQotCi0gICAgICAgICBGb3IgbW9yZSBpbmZvIHJlYWQgTWluaVppcF9pbmZvLnR4dAotCi0gICAgICAgICBDaGFuZ2VzCi0KLSAgICBPY3QtMjAwOSAtIERlZmluZWQgWlBPUzY0X1QgdG8gZnBvc190IG9uIHdpbmRvd3MgYW5kIHVfaW50NjRfdCBvbiBsaW51eC4gKG1pZ2h0IG5lZWQgdG8gZmluZCBhIGJldHRlciB3aHkgZm9yIHRoaXMpCi0gICAgT2N0LTIwMDkgLSBDaGFuZ2UgdG8gZnNlZWtvNjQsIGZ0ZWxsbzY0IGFuZCBmb3BlbjY0IHNvIGxhcmdlIGZpbGVzIHdvdWxkIHdvcmsgb24gbGludXguCi0gICAgICAgICAgICAgICBNb3JlIGlmL2RlZiBzZWN0aW9uIG1heSBiZSBuZWVkZWQgdG8gc3VwcG9ydCBvdGhlciBwbGF0Zm9ybXMKLSAgICBPY3QtMjAwOSAtIERlZmluZWQgZnh4eHg2NCBjYWxscyB0byBub3JtYWwgZm9wZW4vZnRlbGwvZnNlZWsgc28gdGhleSB3b3VsZCBjb21waWxlIG9uIHdpbmRvd3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChidXQgeW91IHNob3VsZCB1c2UgaW93aW4zMi5jIGZvciB3aW5kb3dzIGluc3RlYWQpCi0KLSovCi0KLSNpZm5kZWYgX1pMSUJJT0FQSTY0X0gKLSNkZWZpbmUgX1pMSUJJT0FQSTY0X0gKLQotI2lmICghZGVmaW5lZChfV0lOMzIpKSAmJiAoIWRlZmluZWQoV0lOMzIpKSAmJiAoIWRlZmluZWQoX19BUFBMRV9fKSkKLQotICAvLyBMaW51eCBuZWVkcyB0aGlzIHRvIHN1cHBvcnQgZmlsZSBvcGVyYXRpb24gb24gZmlsZXMgbGFyZ2VyIHRoZW4gNCtHQgotICAvLyBCdXQgbWlnaHQgbmVlZCBiZXR0ZXIgaWYvZGVmIHRvIHNlbGVjdCBqdXN0IHRoZSBwbGF0Zm9ybXMgdGhhdCBuZWVkcyB0aGVtLgotCi0gICAgICAgICNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAotICAgICAgICAgICAgICAgICNkZWZpbmUgX19VU0VfRklMRV9PRkZTRVQ2NAotICAgICAgICAjZW5kaWYKLSAgICAgICAgI2lmbmRlZiBfX1VTRV9MQVJHRUZJTEU2NAotICAgICAgICAgICAgICAgICNkZWZpbmUgX19VU0VfTEFSR0VGSUxFNjQKLSAgICAgICAgI2VuZGlmCi0gICAgICAgICNpZm5kZWYgX0xBUkdFRklMRTY0X1NPVVJDRQotICAgICAgICAgICAgICAgICNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRQotICAgICAgICAjZW5kaWYKLSAgICAgICAgI2lmbmRlZiBfRklMRV9PRkZTRVRfQklUCi0gICAgICAgICAgICAgICAgI2RlZmluZSBfRklMRV9PRkZTRVRfQklUIDY0Ci0gICAgICAgICNlbmRpZgotCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAiemxpYi5oIgotCi0jaWYgZGVmaW5lZChVU0VfRklMRTMyQVBJKQotI2RlZmluZSBmb3BlbjY0IGZvcGVuCi0jZGVmaW5lIGZ0ZWxsbzY0IGZ0ZWxsCi0jZGVmaW5lIGZzZWVrbzY0IGZzZWVrCi0jZWxzZQotI2lmZGVmIF9fRnJlZUJTRF9fCi0jZGVmaW5lIGZvcGVuNjQgZm9wZW4KLSNkZWZpbmUgZnRlbGxvNjQgZnRlbGxvCi0jZGVmaW5lIGZzZWVrbzY0IGZzZWVrbwotI2VuZGlmCi0jaWZkZWYgX01TQ19WRVIKLSAjZGVmaW5lIGZvcGVuNjQgZm9wZW4KLSAjaWYgKF9NU0NfVkVSID49IDE0MDApICYmICghKGRlZmluZWQoTk9fTVNDVkVSX0ZJTEU2NF9GVU5DKSkpCi0gICNkZWZpbmUgZnRlbGxvNjQgX2Z0ZWxsaTY0Ci0gICNkZWZpbmUgZnNlZWtvNjQgX2ZzZWVraTY0Ci0gI2Vsc2UgLy8gb2xkIE1TQwotICAjZGVmaW5lIGZ0ZWxsbzY0IGZ0ZWxsCi0gICNkZWZpbmUgZnNlZWtvNjQgZnNlZWsKLSAjZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLS8qCi0jaWZuZGVmIFpQT1M2NF9UCi0gICNpZmRlZiBfV0lOMzIKLSAgICAgICAgICAgICAgICAjZGVmaW5lIFpQT1M2NF9UIGZwb3NfdAotICAjZWxzZQotICAgICNpbmNsdWRlIDxzdGRpbnQuaD4KLSAgICAjZGVmaW5lIFpQT1M2NF9UIHVpbnQ2NF90Ci0gICNlbmRpZgotI2VuZGlmCi0qLwotCi0jaWZkZWYgSEFWRV9NSU5JWklQNjRfQ09ORl9ICi0jaW5jbHVkZSAibXo2NGNvbmYuaCIKLSNlbmRpZgotCi0vKiBhIHR5cGUgY2hvb3NlbiBieSBERUZJTkUgKi8KLSNpZmRlZiBIQVZFXzY0QklUX0lOVF9DVVNUT00KLXR5cGVkZWYgIDY0QklUX0lOVF9DVVNUT01fVFlQRSBaUE9TNjRfVDsKLSNlbHNlCi0jaWZkZWYgSEFTX1NURElOVF9ICi0jaW5jbHVkZSAic3RkaW50LmgiCi10eXBlZGVmIHVpbnQ2NF90IFpQT1M2NF9UOwotI2Vsc2UKLQotLyogTWF4aW11bSB1bnNpZ25lZCAzMi1iaXQgdmFsdWUgdXNlZCBhcyBwbGFjZWhvbGRlciBmb3IgemlwNjQgKi8KLSNkZWZpbmUgTUFYVTMyIDB4ZmZmZmZmZmYKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IFpQT1M2NF9UOwotI2Vsc2UKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCBaUE9TNjRfVDsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0jZGVmaW5lIFpMSUJfRklMRUZVTkNfU0VFS19DVVIgKDEpCi0jZGVmaW5lIFpMSUJfRklMRUZVTkNfU0VFS19FTkQgKDIpCi0jZGVmaW5lIFpMSUJfRklMRUZVTkNfU0VFS19TRVQgKDApCi0KLSNkZWZpbmUgWkxJQl9GSUxFRlVOQ19NT0RFX1JFQUQgICAgICAoMSkKLSNkZWZpbmUgWkxJQl9GSUxFRlVOQ19NT0RFX1dSSVRFICAgICAoMikKLSNkZWZpbmUgWkxJQl9GSUxFRlVOQ19NT0RFX1JFQURXUklURUZJTFRFUiAoMykKLQotI2RlZmluZSBaTElCX0ZJTEVGVU5DX01PREVfRVhJU1RJTkcgKDQpCi0jZGVmaW5lIFpMSUJfRklMRUZVTkNfTU9ERV9DUkVBVEUgICAoOCkKLQotCi0jaWZuZGVmIFpDQUxMQkFDSwotICNpZiAoZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQgKFdJTkRPV1MpIHx8IGRlZmluZWQgKF9XSU5ET1dTKSkgJiYgZGVmaW5lZChDQUxMQkFDSykgJiYgZGVmaW5lZCAoVVNFV0lORE9XU19DQUxMQkFDSykKLSAgICNkZWZpbmUgWkNBTExCQUNLIENBTExCQUNLCi0gI2Vsc2UKLSAgICNkZWZpbmUgWkNBTExCQUNLCi0gI2VuZGlmCi0jZW5kaWYKLQotCi0KLQotdHlwZWRlZiB2b2lkcGYgICAoWkNBTExCQUNLICpvcGVuX2ZpbGVfZnVuYykgICAgICBPRigodm9pZHBmIG9wYXF1ZSwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBtb2RlKSk7Ci10eXBlZGVmIHVMb25nICAgIChaQ0FMTEJBQ0sgKnJlYWRfZmlsZV9mdW5jKSAgICAgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCB2b2lkKiBidWYsIHVMb25nIHNpemUpKTsKLXR5cGVkZWYgdUxvbmcgICAgKFpDQUxMQkFDSyAqd3JpdGVfZmlsZV9mdW5jKSAgICAgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0sIGNvbnN0IHZvaWQqIGJ1ZiwgdUxvbmcgc2l6ZSkpOwotdHlwZWRlZiBpbnQgICAgICAoWkNBTExCQUNLICpjbG9zZV9maWxlX2Z1bmMpICAgICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOwotdHlwZWRlZiBpbnQgICAgICAoWkNBTExCQUNLICp0ZXN0ZXJyb3JfZmlsZV9mdW5jKSBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOwotCi10eXBlZGVmIGxvbmcgICAgIChaQ0FMTEJBQ0sgKnRlbGxfZmlsZV9mdW5jKSAgICAgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtKSk7Ci10eXBlZGVmIGxvbmcgICAgIChaQ0FMTEJBQ0sgKnNlZWtfZmlsZV9mdW5jKSAgICAgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCB1TG9uZyBvZmZzZXQsIGludCBvcmlnaW4pKTsKLQotCi0vKiBoZXJlIGlzIHRoZSAib2xkIiAzMiBiaXRzIHN0cnVjdHVyZSBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IHpsaWJfZmlsZWZ1bmNfZGVmX3MKLXsKLSAgICBvcGVuX2ZpbGVfZnVuYyAgICAgIHpvcGVuX2ZpbGU7Ci0gICAgcmVhZF9maWxlX2Z1bmMgICAgICB6cmVhZF9maWxlOwotICAgIHdyaXRlX2ZpbGVfZnVuYyAgICAgendyaXRlX2ZpbGU7Ci0gICAgdGVsbF9maWxlX2Z1bmMgICAgICB6dGVsbF9maWxlOwotICAgIHNlZWtfZmlsZV9mdW5jICAgICAgenNlZWtfZmlsZTsKLSAgICBjbG9zZV9maWxlX2Z1bmMgICAgIHpjbG9zZV9maWxlOwotICAgIHRlc3RlcnJvcl9maWxlX2Z1bmMgemVycm9yX2ZpbGU7Ci0gICAgdm9pZHBmICAgICAgICAgICAgICBvcGFxdWU7Ci19IHpsaWJfZmlsZWZ1bmNfZGVmOwotCi10eXBlZGVmIFpQT1M2NF9UIChaQ0FMTEJBQ0sgKnRlbGw2NF9maWxlX2Z1bmMpICAgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtKSk7Ci10eXBlZGVmIGxvbmcgICAgIChaQ0FMTEJBQ0sgKnNlZWs2NF9maWxlX2Z1bmMpICAgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCBaUE9TNjRfVCBvZmZzZXQsIGludCBvcmlnaW4pKTsKLXR5cGVkZWYgdm9pZHBmICAgKFpDQUxMQkFDSyAqb3BlbjY0X2ZpbGVfZnVuYykgICAgT0YoKHZvaWRwZiBvcGFxdWUsIGNvbnN0IHZvaWQqIGZpbGVuYW1lLCBpbnQgbW9kZSkpOwotCi10eXBlZGVmIHN0cnVjdCB6bGliX2ZpbGVmdW5jNjRfZGVmX3MKLXsKLSAgICBvcGVuNjRfZmlsZV9mdW5jICAgIHpvcGVuNjRfZmlsZTsKLSAgICByZWFkX2ZpbGVfZnVuYyAgICAgIHpyZWFkX2ZpbGU7Ci0gICAgd3JpdGVfZmlsZV9mdW5jICAgICB6d3JpdGVfZmlsZTsKLSAgICB0ZWxsNjRfZmlsZV9mdW5jICAgIHp0ZWxsNjRfZmlsZTsKLSAgICBzZWVrNjRfZmlsZV9mdW5jICAgIHpzZWVrNjRfZmlsZTsKLSAgICBjbG9zZV9maWxlX2Z1bmMgICAgIHpjbG9zZV9maWxlOwotICAgIHRlc3RlcnJvcl9maWxlX2Z1bmMgemVycm9yX2ZpbGU7Ci0gICAgdm9pZHBmICAgICAgICAgICAgICBvcGFxdWU7Ci19IHpsaWJfZmlsZWZ1bmM2NF9kZWY7Ci0KLXZvaWQgZmlsbF9mb3BlbjY0X2ZpbGVmdW5jIE9GKCh6bGliX2ZpbGVmdW5jNjRfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsKLXZvaWQgZmlsbF9mb3Blbl9maWxlZnVuYyBPRigoemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikpOwotCi0vKiBub3cgaW50ZXJuYWwgZGVmaW5pdGlvbiwgb25seSBmb3IgemlwLmMgYW5kIHVuemlwLmggKi8KLXR5cGVkZWYgc3RydWN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWZfcwotewotICAgIHpsaWJfZmlsZWZ1bmM2NF9kZWYgemZpbGVfZnVuYzY0OwotICAgIG9wZW5fZmlsZV9mdW5jICAgICAgem9wZW4zMl9maWxlOwotICAgIHRlbGxfZmlsZV9mdW5jICAgICAgenRlbGwzMl9maWxlOwotICAgIHNlZWtfZmlsZV9mdW5jICAgICAgenNlZWszMl9maWxlOwotfSB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmOwotCi0KLSNkZWZpbmUgWlJFQUQ2NChmaWxlZnVuYyxmaWxlc3RyZWFtLGJ1ZixzaXplKSAgICAgKCgqKChmaWxlZnVuYykuemZpbGVfZnVuYzY0LnpyZWFkX2ZpbGUpKSAgICgoZmlsZWZ1bmMpLnpmaWxlX2Z1bmM2NC5vcGFxdWUsZmlsZXN0cmVhbSxidWYsc2l6ZSkpCi0jZGVmaW5lIFpXUklURTY0KGZpbGVmdW5jLGZpbGVzdHJlYW0sYnVmLHNpemUpICAgICgoKigoZmlsZWZ1bmMpLnpmaWxlX2Z1bmM2NC56d3JpdGVfZmlsZSkpICAoKGZpbGVmdW5jKS56ZmlsZV9mdW5jNjQub3BhcXVlLGZpbGVzdHJlYW0sYnVmLHNpemUpKQotLy8jZGVmaW5lIFpURUxMNjQoZmlsZWZ1bmMsZmlsZXN0cmVhbSkgICAgICAgICAgICAoKCooKGZpbGVmdW5jKS56dGVsbDY0X2ZpbGUpKSAoKGZpbGVmdW5jKS5vcGFxdWUsZmlsZXN0cmVhbSkpCi0vLyNkZWZpbmUgWlNFRUs2NChmaWxlZnVuYyxmaWxlc3RyZWFtLHBvcyxtb2RlKSAgICgoKigoZmlsZWZ1bmMpLnpzZWVrNjRfZmlsZSkpICgoZmlsZWZ1bmMpLm9wYXF1ZSxmaWxlc3RyZWFtLHBvcyxtb2RlKSkKLSNkZWZpbmUgWkNMT1NFNjQoZmlsZWZ1bmMsZmlsZXN0cmVhbSkgICAgICAgICAgICAgKCgqKChmaWxlZnVuYykuemZpbGVfZnVuYzY0LnpjbG9zZV9maWxlKSkgICgoZmlsZWZ1bmMpLnpmaWxlX2Z1bmM2NC5vcGFxdWUsZmlsZXN0cmVhbSkpCi0jZGVmaW5lIFpFUlJPUjY0KGZpbGVmdW5jLGZpbGVzdHJlYW0pICAgICAgICAgICAgICgoKigoZmlsZWZ1bmMpLnpmaWxlX2Z1bmM2NC56ZXJyb3JfZmlsZSkpICAoKGZpbGVmdW5jKS56ZmlsZV9mdW5jNjQub3BhcXVlLGZpbGVzdHJlYW0pKQotCi12b2lkcGYgY2FsbF96b3BlbjY0IE9GKChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwZmlsZWZ1bmMsY29uc3Qgdm9pZCpmaWxlbmFtZSxpbnQgbW9kZSkpOwotbG9uZyAgICBjYWxsX3pzZWVrNjQgT0YoKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHBmaWxlZnVuYyx2b2lkcGYgZmlsZXN0cmVhbSwgWlBPUzY0X1Qgb2Zmc2V0LCBpbnQgb3JpZ2luKSk7Ci1aUE9TNjRfVCBjYWxsX3p0ZWxsNjQgT0YoKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHBmaWxlZnVuYyx2b2lkcGYgZmlsZXN0cmVhbSkpOwotCi12b2lkICAgIGZpbGxfemxpYl9maWxlZnVuYzY0XzMyX2RlZl9mcm9tX2ZpbGVmdW5jMzIoemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcF9maWxlZnVuYzY0XzMyLGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwX2ZpbGVmdW5jMzIpOwotCi0jZGVmaW5lIFpPUEVONjQoZmlsZWZ1bmMsZmlsZW5hbWUsbW9kZSkgICAgICAgICAoY2FsbF96b3BlbjY0KCgmKGZpbGVmdW5jKSksKGZpbGVuYW1lKSwobW9kZSkpKQotI2RlZmluZSBaVEVMTDY0KGZpbGVmdW5jLGZpbGVzdHJlYW0pICAgICAgICAgICAgKGNhbGxfenRlbGw2NCgoJihmaWxlZnVuYykpLChmaWxlc3RyZWFtKSkpCi0jZGVmaW5lIFpTRUVLNjQoZmlsZWZ1bmMsZmlsZXN0cmVhbSxwb3MsbW9kZSkgICAoY2FsbF96c2VlazY0KCgmKGZpbGVmdW5jKSksKGZpbGVzdHJlYW0pLChwb3MpLChtb2RlKSkpCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9taW5pemlwL2lvd2luMzIuYyBiL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9pb3dpbjMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMmE4ODMuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9taW5pemlwL2lvd2luMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKiBpb3dpbjMyLmMgLS0gSU8gYmFzZSBmdW5jdGlvbiBoZWFkZXIgZm9yIGNvbXByZXNzL3VuY29tcHJlc3MgLnppcAotICAgICBWZXJzaW9uIDEuMSwgRmVicnVhcnkgMTRoLCAyMDEwCi0gICAgIHBhcnQgb2YgdGhlIE1pbmlaaXAgcHJvamVjdCAtICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQotCi0gICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxMCBHaWxsZXMgVm9sbGFudCAobWluaXppcCkgKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCi0KLSAgICAgICAgIE1vZGlmaWNhdGlvbnMgZm9yIFppcDY0IHN1cHBvcnQKLSAgICAgICAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1hdGhpYXMgU3ZlbnNzb24gKCBodHRwOi8vcmVzdWx0NDIuY29tICkKLQotICAgICBGb3IgbW9yZSBpbmZvIHJlYWQgTWluaVppcF9pbmZvLnR4dAotCi0qLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJ6bGliLmgiCi0jaW5jbHVkZSAiaW9hcGkuaCIKLSNpbmNsdWRlICJpb3dpbjMyLmgiCi0KLSNpZm5kZWYgSU5WQUxJRF9IQU5ETEVfVkFMVUUKLSNkZWZpbmUgSU5WQUxJRF9IQU5ETEVfVkFMVUUgKDB4RkZGRkZGRkYpCi0jZW5kaWYKLQotI2lmbmRlZiBJTlZBTElEX1NFVF9GSUxFX1BPSU5URVIKLSNkZWZpbmUgSU5WQUxJRF9TRVRfRklMRV9QT0lOVEVSICgoRFdPUkQpLTEpCi0jZW5kaWYKLQotdm9pZHBmICBaQ0FMTEJBQ0sgd2luMzJfb3Blbl9maWxlX2Z1bmMgIE9GKCh2b2lkcGYgb3BhcXVlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IG1vZGUpKTsKLXVMb25nICAgWkNBTExCQUNLIHdpbjMyX3JlYWRfZmlsZV9mdW5jICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgdm9pZCogYnVmLCB1TG9uZyBzaXplKSk7Ci11TG9uZyAgIFpDQUxMQkFDSyB3aW4zMl93cml0ZV9maWxlX2Z1bmMgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0sIGNvbnN0IHZvaWQqIGJ1ZiwgdUxvbmcgc2l6ZSkpOwotWlBPUzY0X1QgWkNBTExCQUNLIHdpbjMyX3RlbGw2NF9maWxlX2Z1bmMgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtKSk7Ci1sb25nICAgIFpDQUxMQkFDSyB3aW4zMl9zZWVrNjRfZmlsZV9mdW5jICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgWlBPUzY0X1Qgb2Zmc2V0LCBpbnQgb3JpZ2luKSk7Ci1pbnQgICAgIFpDQUxMQkFDSyB3aW4zMl9jbG9zZV9maWxlX2Z1bmMgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pKTsKLWludCAgICAgWkNBTExCQUNLIHdpbjMyX2Vycm9yX2ZpbGVfZnVuYyBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIEhBTkRMRSBoZjsKLSAgICBpbnQgZXJyb3I7Ci19IFdJTjMyRklMRV9JT1dJTjsKLQotCi1zdGF0aWMgdm9pZCB3aW4zMl90cmFuc2xhdGVfb3Blbl9tb2RlKGludCBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCogbHBkd0Rlc2lyZWRBY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEKiBscGR3Q3JlYXRpb25EaXNwb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQqIGxwZHdTaGFyZU1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEKiBscGR3RmxhZ3NBbmRBdHRyaWJ1dGVzKQotewotICAgICpscGR3RGVzaXJlZEFjY2VzcyA9ICpscGR3U2hhcmVNb2RlID0gKmxwZHdGbGFnc0FuZEF0dHJpYnV0ZXMgPSAqbHBkd0NyZWF0aW9uRGlzcG9zaXRpb24gPSAwOwotCi0gICAgaWYgKChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX1JFQURXUklURUZJTFRFUik9PVpMSUJfRklMRUZVTkNfTU9ERV9SRUFEKQotICAgIHsKLSAgICAgICAgKmxwZHdEZXNpcmVkQWNjZXNzID0gR0VORVJJQ19SRUFEOwotICAgICAgICAqbHBkd0NyZWF0aW9uRGlzcG9zaXRpb24gPSBPUEVOX0VYSVNUSU5HOwotICAgICAgICAqbHBkd1NoYXJlTW9kZSA9IEZJTEVfU0hBUkVfUkVBRDsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9FWElTVElORykKLSAgICB7Ci0gICAgICAgICpscGR3RGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfV1JJVEUgfCBHRU5FUklDX1JFQUQ7Ci0gICAgICAgICpscGR3Q3JlYXRpb25EaXNwb3NpdGlvbiA9IE9QRU5fRVhJU1RJTkc7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGUgJiBaTElCX0ZJTEVGVU5DX01PREVfQ1JFQVRFKQotICAgIHsKLSAgICAgICAgKmxwZHdEZXNpcmVkQWNjZXNzID0gR0VORVJJQ19XUklURSB8IEdFTkVSSUNfUkVBRDsKLSAgICAgICAgKmxwZHdDcmVhdGlvbkRpc3Bvc2l0aW9uID0gQ1JFQVRFX0FMV0FZUzsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkcGYgd2luMzJfYnVpbGRfaW93aW4oSEFORExFIGhGaWxlKQotewotICAgIHZvaWRwZiByZXQ9TlVMTDsKLQotICAgIGlmICgoaEZpbGUgIT0gTlVMTCkgJiYgKGhGaWxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSkKLSAgICB7Ci0gICAgICAgIFdJTjMyRklMRV9JT1dJTiB3MzJmaW93OwotICAgICAgICB3MzJmaW93LmhmID0gaEZpbGU7Ci0gICAgICAgIHczMmZpb3cuZXJyb3IgPSAwOwotICAgICAgICByZXQgPSBtYWxsb2Moc2l6ZW9mKFdJTjMyRklMRV9JT1dJTikpOwotCi0gICAgICAgIGlmIChyZXQ9PU5VTEwpCi0gICAgICAgICAgICBDbG9zZUhhbmRsZShoRmlsZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICooKFdJTjMyRklMRV9JT1dJTiopcmV0KSA9IHczMmZpb3c7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXZvaWRwZiBaQ0FMTEJBQ0sgd2luMzJfb3BlbjY0X2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSxjb25zdCB2b2lkKiBmaWxlbmFtZSxpbnQgbW9kZSkKLXsKLSAgICBjb25zdCBjaGFyKiBtb2RlX2ZvcGVuID0gTlVMTDsKLSAgICBEV09SRCBkd0Rlc2lyZWRBY2Nlc3MsZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLGR3U2hhcmVNb2RlLGR3RmxhZ3NBbmRBdHRyaWJ1dGVzIDsKLSAgICBIQU5ETEUgaEZpbGUgPSBOVUxMOwotCi0gICAgd2luMzJfdHJhbnNsYXRlX29wZW5fbW9kZShtb2RlLCZkd0Rlc2lyZWRBY2Nlc3MsJmR3Q3JlYXRpb25EaXNwb3NpdGlvbiwmZHdTaGFyZU1vZGUsJmR3RmxhZ3NBbmRBdHRyaWJ1dGVzKTsKLQotICAgIGlmICgoZmlsZW5hbWUhPU5VTEwpICYmIChkd0Rlc2lyZWRBY2Nlc3MgIT0gMCkpCi0gICAgICAgIGhGaWxlID0gQ3JlYXRlRmlsZSgoTFBDVFNUUilmaWxlbmFtZSwgZHdEZXNpcmVkQWNjZXNzLCBkd1NoYXJlTW9kZSwgTlVMTCwgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLCBkd0ZsYWdzQW5kQXR0cmlidXRlcywgTlVMTCk7Ci0KLSAgICByZXR1cm4gd2luMzJfYnVpbGRfaW93aW4oaEZpbGUpOwotfQotCi0KLXZvaWRwZiBaQ0FMTEJBQ0sgd2luMzJfb3BlbjY0X2ZpbGVfZnVuY0EgKHZvaWRwZiBvcGFxdWUsY29uc3Qgdm9pZCogZmlsZW5hbWUsaW50IG1vZGUpCi17Ci0gICAgY29uc3QgY2hhciogbW9kZV9mb3BlbiA9IE5VTEw7Ci0gICAgRFdPUkQgZHdEZXNpcmVkQWNjZXNzLGR3Q3JlYXRpb25EaXNwb3NpdGlvbixkd1NoYXJlTW9kZSxkd0ZsYWdzQW5kQXR0cmlidXRlcyA7Ci0gICAgSEFORExFIGhGaWxlID0gTlVMTDsKLQotICAgIHdpbjMyX3RyYW5zbGF0ZV9vcGVuX21vZGUobW9kZSwmZHdEZXNpcmVkQWNjZXNzLCZkd0NyZWF0aW9uRGlzcG9zaXRpb24sJmR3U2hhcmVNb2RlLCZkd0ZsYWdzQW5kQXR0cmlidXRlcyk7Ci0KLSAgICBpZiAoKGZpbGVuYW1lIT1OVUxMKSAmJiAoZHdEZXNpcmVkQWNjZXNzICE9IDApKQotICAgICAgICBoRmlsZSA9IENyZWF0ZUZpbGVBKChMUENTVFIpZmlsZW5hbWUsIGR3RGVzaXJlZEFjY2VzcywgZHdTaGFyZU1vZGUsIE5VTEwsIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiwgZHdGbGFnc0FuZEF0dHJpYnV0ZXMsIE5VTEwpOwotCi0gICAgcmV0dXJuIHdpbjMyX2J1aWxkX2lvd2luKGhGaWxlKTsKLX0KLQotCi12b2lkcGYgWkNBTExCQUNLIHdpbjMyX29wZW42NF9maWxlX2Z1bmNXICh2b2lkcGYgb3BhcXVlLGNvbnN0IHZvaWQqIGZpbGVuYW1lLGludCBtb2RlKQotewotICAgIGNvbnN0IGNoYXIqIG1vZGVfZm9wZW4gPSBOVUxMOwotICAgIERXT1JEIGR3RGVzaXJlZEFjY2Vzcyxkd0NyZWF0aW9uRGlzcG9zaXRpb24sZHdTaGFyZU1vZGUsZHdGbGFnc0FuZEF0dHJpYnV0ZXMgOwotICAgIEhBTkRMRSBoRmlsZSA9IE5VTEw7Ci0KLSAgICB3aW4zMl90cmFuc2xhdGVfb3Blbl9tb2RlKG1vZGUsJmR3RGVzaXJlZEFjY2VzcywmZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLCZkd1NoYXJlTW9kZSwmZHdGbGFnc0FuZEF0dHJpYnV0ZXMpOwotCi0gICAgaWYgKChmaWxlbmFtZSE9TlVMTCkgJiYgKGR3RGVzaXJlZEFjY2VzcyAhPSAwKSkKLSAgICAgICAgaEZpbGUgPSBDcmVhdGVGaWxlVygoTFBDV1NUUilmaWxlbmFtZSwgZHdEZXNpcmVkQWNjZXNzLCBkd1NoYXJlTW9kZSwgTlVMTCwgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLCBkd0ZsYWdzQW5kQXR0cmlidXRlcywgTlVMTCk7Ci0KLSAgICByZXR1cm4gd2luMzJfYnVpbGRfaW93aW4oaEZpbGUpOwotfQotCi0KLXZvaWRwZiBaQ0FMTEJBQ0sgd2luMzJfb3Blbl9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsY29uc3QgY2hhciogZmlsZW5hbWUsaW50IG1vZGUpCi17Ci0gICAgY29uc3QgY2hhciogbW9kZV9mb3BlbiA9IE5VTEw7Ci0gICAgRFdPUkQgZHdEZXNpcmVkQWNjZXNzLGR3Q3JlYXRpb25EaXNwb3NpdGlvbixkd1NoYXJlTW9kZSxkd0ZsYWdzQW5kQXR0cmlidXRlcyA7Ci0gICAgSEFORExFIGhGaWxlID0gTlVMTDsKLQotICAgIHdpbjMyX3RyYW5zbGF0ZV9vcGVuX21vZGUobW9kZSwmZHdEZXNpcmVkQWNjZXNzLCZkd0NyZWF0aW9uRGlzcG9zaXRpb24sJmR3U2hhcmVNb2RlLCZkd0ZsYWdzQW5kQXR0cmlidXRlcyk7Ci0KLSAgICBpZiAoKGZpbGVuYW1lIT1OVUxMKSAmJiAoZHdEZXNpcmVkQWNjZXNzICE9IDApKQotICAgICAgICBoRmlsZSA9IENyZWF0ZUZpbGUoKExQQ1RTVFIpZmlsZW5hbWUsIGR3RGVzaXJlZEFjY2VzcywgZHdTaGFyZU1vZGUsIE5VTEwsIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiwgZHdGbGFnc0FuZEF0dHJpYnV0ZXMsIE5VTEwpOwotCi0gICAgcmV0dXJuIHdpbjMyX2J1aWxkX2lvd2luKGhGaWxlKTsKLX0KLQotCi11TG9uZyBaQ0FMTEJBQ0sgd2luMzJfcmVhZF9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0sIHZvaWQqIGJ1Zix1TG9uZyBzaXplKQotewotICAgIHVMb25nIHJldD0wOwotICAgIEhBTkRMRSBoRmlsZSA9IE5VTEw7Ci0gICAgaWYgKHN0cmVhbSE9TlVMTCkKLSAgICAgICAgaEZpbGUgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBoZjsKLQotICAgIGlmIChoRmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgaWYgKCFSZWFkRmlsZShoRmlsZSwgYnVmLCBzaXplLCAmcmV0LCBOVUxMKSkKLSAgICAgICAgewotICAgICAgICAgICAgRFdPUkQgZHdFcnIgPSBHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgICAgIGlmIChkd0VyciA9PSBFUlJPUl9IQU5ETEVfRU9GKQotICAgICAgICAgICAgICAgIGR3RXJyID0gMDsKLSAgICAgICAgICAgICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGVycm9yPShpbnQpZHdFcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi0KLXVMb25nIFpDQUxMQkFDSyB3aW4zMl93cml0ZV9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsdm9pZHBmIHN0cmVhbSxjb25zdCB2b2lkKiBidWYsdUxvbmcgc2l6ZSkKLXsKLSAgICB1TG9uZyByZXQ9MDsKLSAgICBIQU5ETEUgaEZpbGUgPSBOVUxMOwotICAgIGlmIChzdHJlYW0hPU5VTEwpCi0gICAgICAgIGhGaWxlID0gKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gaGY7Ci0KLSAgICBpZiAoaEZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGlmICghV3JpdGVGaWxlKGhGaWxlLCBidWYsIHNpemUsICZyZXQsIE5VTEwpKQotICAgICAgICB7Ci0gICAgICAgICAgICBEV09SRCBkd0VyciA9IEdldExhc3RFcnJvcigpOwotICAgICAgICAgICAgaWYgKGR3RXJyID09IEVSUk9SX0hBTkRMRV9FT0YpCi0gICAgICAgICAgICAgICAgZHdFcnIgPSAwOwotICAgICAgICAgICAgKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gZXJyb3I9KGludClkd0VycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWxvbmcgWkNBTExCQUNLIHdpbjMyX3RlbGxfZmlsZV9mdW5jICh2b2lkcGYgb3BhcXVlLHZvaWRwZiBzdHJlYW0pCi17Ci0gICAgbG9uZyByZXQ9LTE7Ci0gICAgSEFORExFIGhGaWxlID0gTlVMTDsKLSAgICBpZiAoc3RyZWFtIT1OVUxMKQotICAgICAgICBoRmlsZSA9ICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGhmOwotICAgIGlmIChoRmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgRFdPUkQgZHdTZXQgPSBTZXRGaWxlUG9pbnRlcihoRmlsZSwgMCwgTlVMTCwgRklMRV9DVVJSRU5UKTsKLSAgICAgICAgaWYgKGR3U2V0ID09IElOVkFMSURfU0VUX0ZJTEVfUE9JTlRFUikKLSAgICAgICAgewotICAgICAgICAgICAgRFdPUkQgZHdFcnIgPSBHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgICAgICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGVycm9yPShpbnQpZHdFcnI7Ci0gICAgICAgICAgICByZXQgPSAtMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXQ9KGxvbmcpZHdTZXQ7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLVpQT1M2NF9UIFpDQUxMQkFDSyB3aW4zMl90ZWxsNjRfZmlsZV9mdW5jICh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtKQotewotICAgIFpQT1M2NF9UIHJldD0gKFpQT1M2NF9UKS0xOwotICAgIEhBTkRMRSBoRmlsZSA9IE5VTEw7Ci0gICAgaWYgKHN0cmVhbSE9TlVMTCkKLSAgICAgICAgaEZpbGUgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKS0+aGY7Ci0KLSAgICBpZiAoaEZpbGUpCi0gICAgewotICAgICAgICBMQVJHRV9JTlRFR0VSIGxpOwotICAgICAgICBsaS5RdWFkUGFydCA9IDA7Ci0gICAgICAgIGxpLnUuTG93UGFydCA9IFNldEZpbGVQb2ludGVyKGhGaWxlLCBsaS51Lkxvd1BhcnQsICZsaS51LkhpZ2hQYXJ0LCBGSUxFX0NVUlJFTlQpOwotICAgICAgICBpZiAoIChsaS5Mb3dQYXJ0ID09IDB4RkZGRkZGRkYpICYmIChHZXRMYXN0RXJyb3IoKSAhPSBOT19FUlJPUikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERXT1JEIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7Ci0gICAgICAgICAgICAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBlcnJvcj0oaW50KWR3RXJyOwotICAgICAgICAgICAgcmV0ID0gKFpQT1M2NF9UKS0xOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldD1saS5RdWFkUGFydDsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotCi1sb25nIFpDQUxMQkFDSyB3aW4zMl9zZWVrX2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSx2b2lkcGYgc3RyZWFtLHVMb25nIG9mZnNldCxpbnQgb3JpZ2luKQotewotICAgIERXT1JEIGR3TW92ZU1ldGhvZD0weEZGRkZGRkZGOwotICAgIEhBTkRMRSBoRmlsZSA9IE5VTEw7Ci0KLSAgICBsb25nIHJldD0tMTsKLSAgICBpZiAoc3RyZWFtIT1OVUxMKQotICAgICAgICBoRmlsZSA9ICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGhmOwotICAgIHN3aXRjaCAob3JpZ2luKQotICAgIHsKLSAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19DVVIgOgotICAgICAgICBkd01vdmVNZXRob2QgPSBGSUxFX0NVUlJFTlQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX0VORCA6Ci0gICAgICAgIGR3TW92ZU1ldGhvZCA9IEZJTEVfRU5EOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19TRVQgOgotICAgICAgICBkd01vdmVNZXRob2QgPSBGSUxFX0JFR0lOOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OiByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKGhGaWxlICE9IE5VTEwpCi0gICAgewotICAgICAgICBEV09SRCBkd1NldCA9IFNldEZpbGVQb2ludGVyKGhGaWxlLCBvZmZzZXQsIE5VTEwsIGR3TW92ZU1ldGhvZCk7Ci0gICAgICAgIGlmIChkd1NldCA9PSBJTlZBTElEX1NFVF9GSUxFX1BPSU5URVIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERXT1JEIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7Ci0gICAgICAgICAgICAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBlcnJvcj0oaW50KWR3RXJyOwotICAgICAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0PTA7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWxvbmcgWkNBTExCQUNLIHdpbjMyX3NlZWs2NF9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0sWlBPUzY0X1Qgb2Zmc2V0LGludCBvcmlnaW4pCi17Ci0gICAgRFdPUkQgZHdNb3ZlTWV0aG9kPTB4RkZGRkZGRkY7Ci0gICAgSEFORExFIGhGaWxlID0gTlVMTDsKLSAgICBsb25nIHJldD0tMTsKLQotICAgIGlmIChzdHJlYW0hPU5VTEwpCi0gICAgICAgIGhGaWxlID0gKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSktPmhmOwotCi0gICAgc3dpdGNoIChvcmlnaW4pCi0gICAgewotICAgICAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19DVVIgOgotICAgICAgICAgICAgZHdNb3ZlTWV0aG9kID0gRklMRV9DVVJSRU5UOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX0VORCA6Ci0gICAgICAgICAgICBkd01vdmVNZXRob2QgPSBGSUxFX0VORDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19TRVQgOgotICAgICAgICAgICAgZHdNb3ZlTWV0aG9kID0gRklMRV9CRUdJTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKGhGaWxlKQotICAgIHsKLSAgICAgICAgTEFSR0VfSU5URUdFUiogbGkgPSAoTEFSR0VfSU5URUdFUiopJm9mZnNldDsKLSAgICAgICAgRFdPUkQgZHdTZXQgPSBTZXRGaWxlUG9pbnRlcihoRmlsZSwgbGktPnUuTG93UGFydCwgJmxpLT51LkhpZ2hQYXJ0LCBkd01vdmVNZXRob2QpOwotICAgICAgICBpZiAoZHdTZXQgPT0gSU5WQUxJRF9TRVRfRklMRV9QT0lOVEVSKQotICAgICAgICB7Ci0gICAgICAgICAgICBEV09SRCBkd0VyciA9IEdldExhc3RFcnJvcigpOwotICAgICAgICAgICAgKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gZXJyb3I9KGludClkd0VycjsKLSAgICAgICAgICAgIHJldCA9IC0xOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldD0wOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgWkNBTExCQUNLIHdpbjMyX2Nsb3NlX2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkKLXsKLSAgICBpbnQgcmV0PS0xOwotCi0gICAgaWYgKHN0cmVhbSE9TlVMTCkKLSAgICB7Ci0gICAgICAgIEhBTkRMRSBoRmlsZTsKLSAgICAgICAgaEZpbGUgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBoZjsKLSAgICAgICAgaWYgKGhGaWxlICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENsb3NlSGFuZGxlKGhGaWxlKTsKLSAgICAgICAgICAgIHJldD0wOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUoc3RyZWFtKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50IFpDQUxMQkFDSyB3aW4zMl9lcnJvcl9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsdm9pZHBmIHN0cmVhbSkKLXsKLSAgICBpbnQgcmV0PS0xOwotICAgIGlmIChzdHJlYW0hPU5VTEwpCi0gICAgewotICAgICAgICByZXQgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBlcnJvcjsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBmaWxsX3dpbjMyX2ZpbGVmdW5jICh6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKQotewotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+em9wZW5fZmlsZSA9IHdpbjMyX29wZW5fZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enJlYWRfZmlsZSA9IHdpbjMyX3JlYWRfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+endyaXRlX2ZpbGUgPSB3aW4zMl93cml0ZV9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56dGVsbF9maWxlID0gd2luMzJfdGVsbF9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56c2Vla19maWxlID0gd2luMzJfc2Vla19maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56Y2xvc2VfZmlsZSA9IHdpbjMyX2Nsb3NlX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnplcnJvcl9maWxlID0gd2luMzJfZXJyb3JfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+b3BhcXVlID0gTlVMTDsKLX0KLQotdm9pZCBmaWxsX3dpbjMyX2ZpbGVmdW5jNjQoemxpYl9maWxlZnVuYzY0X2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKQotewotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+em9wZW42NF9maWxlID0gd2luMzJfb3BlbjY0X2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnpyZWFkX2ZpbGUgPSB3aW4zMl9yZWFkX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnp3cml0ZV9maWxlID0gd2luMzJfd3JpdGVfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enRlbGw2NF9maWxlID0gd2luMzJfdGVsbDY0X2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnpzZWVrNjRfZmlsZSA9IHdpbjMyX3NlZWs2NF9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56Y2xvc2VfZmlsZSA9IHdpbjMyX2Nsb3NlX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnplcnJvcl9maWxlID0gd2luMzJfZXJyb3JfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+b3BhcXVlID0gTlVMTDsKLX0KLQotCi12b2lkIGZpbGxfd2luMzJfZmlsZWZ1bmM2NEEoemxpYl9maWxlZnVuYzY0X2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKQotewotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+em9wZW42NF9maWxlID0gd2luMzJfb3BlbjY0X2ZpbGVfZnVuY0E7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56cmVhZF9maWxlID0gd2luMzJfcmVhZF9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56d3JpdGVfZmlsZSA9IHdpbjMyX3dyaXRlX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnp0ZWxsNjRfZmlsZSA9IHdpbjMyX3RlbGw2NF9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56c2VlazY0X2ZpbGUgPSB3aW4zMl9zZWVrNjRfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emNsb3NlX2ZpbGUgPSB3aW4zMl9jbG9zZV9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56ZXJyb3JfZmlsZSA9IHdpbjMyX2Vycm9yX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPm9wYXF1ZSA9IE5VTEw7Ci19Ci0KLQotdm9pZCBmaWxsX3dpbjMyX2ZpbGVmdW5jNjRXKHpsaWJfZmlsZWZ1bmM2NF9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikKLXsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnpvcGVuNjRfZmlsZSA9IHdpbjMyX29wZW42NF9maWxlX2Z1bmNXOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enJlYWRfZmlsZSA9IHdpbjMyX3JlYWRfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+endyaXRlX2ZpbGUgPSB3aW4zMl93cml0ZV9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56dGVsbDY0X2ZpbGUgPSB3aW4zMl90ZWxsNjRfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enNlZWs2NF9maWxlID0gd2luMzJfc2VlazY0X2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnpjbG9zZV9maWxlID0gd2luMzJfY2xvc2VfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emVycm9yX2ZpbGUgPSB3aW4zMl9lcnJvcl9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT5vcGFxdWUgPSBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9taW5pemlwL2lvd2luMzIuaCBiL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9pb3dpbjMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYTA5NjkuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9taW5pemlwL2lvd2luMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qIGlvd2luMzIuaCAtLSBJTyBiYXNlIGZ1bmN0aW9uIGhlYWRlciBmb3IgY29tcHJlc3MvdW5jb21wcmVzcyAuemlwCi0gICAgIFZlcnNpb24gMS4xLCBGZWJydWFyeSAxNGgsIDIwMTAKLSAgICAgcGFydCBvZiB0aGUgTWluaVppcCBwcm9qZWN0IC0gKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCi0KLSAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDEwIEdpbGxlcyBWb2xsYW50IChtaW5pemlwKSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKLQotICAgICAgICAgTW9kaWZpY2F0aW9ucyBmb3IgWmlwNjQgc3VwcG9ydAotICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTWF0aGlhcyBTdmVuc3NvbiAoIGh0dHA6Ly9yZXN1bHQ0Mi5jb20gKQotCi0gICAgICAgICBGb3IgbW9yZSBpbmZvIHJlYWQgTWluaVppcF9pbmZvLnR4dAotCi0qLwotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdm9pZCBmaWxsX3dpbjMyX2ZpbGVmdW5jIE9GKCh6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKSk7Ci12b2lkIGZpbGxfd2luMzJfZmlsZWZ1bmM2NCBPRigoemxpYl9maWxlZnVuYzY0X2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKSk7Ci12b2lkIGZpbGxfd2luMzJfZmlsZWZ1bmM2NEEgT0YoKHpsaWJfZmlsZWZ1bmM2NF9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikpOwotdm9pZCBmaWxsX3dpbjMyX2ZpbGVmdW5jNjRXIE9GKCh6bGliX2ZpbGVmdW5jNjRfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9tYWtlX3Ztcy5jb20gYi9zcmMvemxpYi9jb250cmliL21pbml6aXAvbWFrZV92bXMuY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YWMxM2E5Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9tYWtlX3Ztcy5jb20KKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0kIGlmIGYkc2VhcmNoKCJpb2FwaS5oX29yaWciKSAuZXFzLiAiIiB0aGVuIGNvcHkgaW9hcGkuaCBpb2FwaS5oX29yaWcKLSQgb3Blbi93cml0ZSB6ZGVmIHZtc2RlZnMuaAotJCBjb3B5IHN5cyRpbnB1dDogemRlZgotJCBkZWNrCi0jZGVmaW5lIHVuaXgKLSNkZWZpbmUgZmlsbF96bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2Zyb21fZmlsZWZ1bmMzMiBmaWxsemZmdW5jNjRmcm9tCi0jZGVmaW5lIFdyaXRlX1ppcDY0RW5kT2ZDZW50cmFsRGlyZWN0b3J5TG9jYXRvciBXcml0ZV9aaXA2NEVvRExvY2F0b3IKLSNkZWZpbmUgV3JpdGVfWmlwNjRFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQgV3JpdGVfWmlwNjRFb0RSZWNvcmQKLSNkZWZpbmUgV3JpdGVfRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkIFdyaXRlX0VvRFJlY29yZAotJCBlb2QKLSQgY2xvc2UgemRlZgotJCBjb3B5IHZtc2RlZnMuaCxpb2FwaS5oX29yaWcgaW9hcGkuaAotJCBjYy9pbmNsdWRlPVstLV0vcHJlZml4PWFsbCBpb2FwaS5jCi0kIGNjL2luY2x1ZGU9Wy0tXS9wcmVmaXg9YWxsIG1pbml1bnouYwotJCBjYy9pbmNsdWRlPVstLV0vcHJlZml4PWFsbCB1bnppcC5jCi0kIGNjL2luY2x1ZGU9Wy0tXS9wcmVmaXg9YWxsIG1pbml6aXAuYwotJCBjYy9pbmNsdWRlPVstLV0vcHJlZml4PWFsbCB6aXAuYwotJCBsaW5rIG1pbml1bnosdW56aXAsaW9hcGksWy0tXWxpYnoub2xiL2xpYgotJCBsaW5rIG1pbml6aXAsemlwLGlvYXBpLFstLV1saWJ6Lm9sYi9saWIKLSQgbWNyIFtdbWluaXppcCB0ZXN0IG1pbml6aXBfaW5mby50eHQKLSQgbWNyIFtdbWluaXVueiAtbCB0ZXN0LnppcAotJCByZW5hbWUgbWluaXppcF9pbmZvLnR4dDsgbWluaXppcF9pbmZvLnR4dF9vbGQKLSQgbWNyIFtdbWluaXVueiB0ZXN0LnppcAotJCBkZWxldGUgdGVzdC56aXA7KgotJGV4aXQKZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9taW5pdW56LmMgYi9zcmMvemxpYi9jb250cmliL21pbml6aXAvbWluaXVuei5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDY1NDAxLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9taW5pdW56LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NjAgKzAsMCBAQAotLyoKLSAgIG1pbml1bnouYwotICAgVmVyc2lvbiAxLjEsIEZlYnJ1YXJ5IDE0aCwgMjAxMAotICAgc2FtcGxlIHBhcnQgb2YgdGhlIE1pbmlaaXAgcHJvamVjdCAtICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQotCi0gICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxMCBHaWxsZXMgVm9sbGFudCAobWluaXppcCkgKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCi0KLSAgICAgICAgIE1vZGlmaWNhdGlvbnMgb2YgVW56aXAgZm9yIFppcDY0Ci0gICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBFdmVuIFJvdWF1bHQKLQotICAgICAgICAgTW9kaWZpY2F0aW9ucyBmb3IgWmlwNjQgc3VwcG9ydCBvbiBib3RoIHppcCBhbmQgdW56aXAKLSAgICAgICAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1hdGhpYXMgU3ZlbnNzb24gKCBodHRwOi8vcmVzdWx0NDIuY29tICkKLSovCi0KLSNpZiAoIWRlZmluZWQoX1dJTjMyKSkgJiYgKCFkZWZpbmVkKFdJTjMyKSkgJiYgKCFkZWZpbmVkKF9fQVBQTEVfXykpCi0gICAgICAgICNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAotICAgICAgICAgICAgICAgICNkZWZpbmUgX19VU0VfRklMRV9PRkZTRVQ2NAotICAgICAgICAjZW5kaWYKLSAgICAgICAgI2lmbmRlZiBfX1VTRV9MQVJHRUZJTEU2NAotICAgICAgICAgICAgICAgICNkZWZpbmUgX19VU0VfTEFSR0VGSUxFNjQKLSAgICAgICAgI2VuZGlmCi0gICAgICAgICNpZm5kZWYgX0xBUkdFRklMRTY0X1NPVVJDRQotICAgICAgICAgICAgICAgICNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRQotICAgICAgICAjZW5kaWYKLSAgICAgICAgI2lmbmRlZiBfRklMRV9PRkZTRVRfQklUCi0gICAgICAgICAgICAgICAgI2RlZmluZSBfRklMRV9PRkZTRVRfQklUIDY0Ci0gICAgICAgICNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfX0FQUExFX18KLS8vIEluIGRhcndpbiBhbmQgcGVyaGFwcyBvdGhlciBCU0QgdmFyaWFudHMgb2ZmX3QgaXMgYSA2NCBiaXQgdmFsdWUsIGhlbmNlIG5vIG5lZWQgZm9yIHNwZWNpZmljIDY0IGJpdCBmdW5jdGlvbnMKLSNkZWZpbmUgRk9QRU5fRlVOQyhmaWxlbmFtZSwgbW9kZSkgZm9wZW4oZmlsZW5hbWUsIG1vZGUpCi0jZGVmaW5lIEZURUxMT19GVU5DKHN0cmVhbSkgZnRlbGxvKHN0cmVhbSkKLSNkZWZpbmUgRlNFRUtPX0ZVTkMoc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikgZnNlZWtvKHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pCi0jZWxzZQotI2RlZmluZSBGT1BFTl9GVU5DKGZpbGVuYW1lLCBtb2RlKSBmb3BlbjY0KGZpbGVuYW1lLCBtb2RlKQotI2RlZmluZSBGVEVMTE9fRlVOQyhzdHJlYW0pIGZ0ZWxsbzY0KHN0cmVhbSkKLSNkZWZpbmUgRlNFRUtPX0ZVTkMoc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikgZnNlZWtvNjQoc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikKLSNlbmRpZgotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLSNpZmRlZiBfV0lOMzIKLSMgaW5jbHVkZSA8ZGlyZWN0Lmg+Ci0jIGluY2x1ZGUgPGlvLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgaW5jbHVkZSA8dXRpbWUuaD4KLSNlbmRpZgotCi0KLSNpbmNsdWRlICJ1bnppcC5oIgotCi0jZGVmaW5lIENBU0VTRU5TSVRJVklUWSAoMCkKLSNkZWZpbmUgV1JJVEVCVUZGRVJTSVpFICg4MTkyKQotI2RlZmluZSBNQVhGSUxFTkFNRSAoMjU2KQotCi0jaWZkZWYgX1dJTjMyCi0jZGVmaW5lIFVTRVdJTjMySU9BUEkKLSNpbmNsdWRlICJpb3dpbjMyLmgiCi0jZW5kaWYKLS8qCi0gIG1pbmkgdW56aXAsIGRlbW8gb2YgdW56aXAgcGFja2FnZQotCi0gIHVzYWdlIDoKLSAgVXNhZ2UgOiBtaW5pdW56IFstZXh2bG9dIGZpbGUuemlwIFtmaWxlX3RvX2V4dHJhY3RdIFstZCBleHRyYWN0ZGlyXQotCi0gIGxpc3QgdGhlIGZpbGUgaW4gdGhlIHppcGZpbGUsIGFuZCBwcmludCB0aGUgY29udGVudCBvZiBGSUxFX0lELlpJUCBvciBSRUFETUUuVFhUCi0gICAgaWYgaXQgZXhpc3RzCi0qLwotCi0KLS8qIGNoYW5nZV9maWxlX2RhdGUgOiBjaGFuZ2UgdGhlIGRhdGUvdGltZSBvZiBhIGZpbGUKLSAgICBmaWxlbmFtZSA6IHRoZSBmaWxlbmFtZSBvZiB0aGUgZmlsZSB3aGVyZSBkYXRlL3RpbWUgbXVzdCBiZSBtb2RpZmllZAotICAgIGRvc2RhdGUgOiB0aGUgbmV3IGRhdGUgYXQgdGhlIE1TRG9zIGZvcm1hdCAoNCBieXRlcykKLSAgICB0bXVfZGF0ZSA6IHRoZSBTQU1FIG5ldyBkYXRlIGF0IHRoZSB0bV91bnogZm9ybWF0ICovCi12b2lkIGNoYW5nZV9maWxlX2RhdGUoZmlsZW5hbWUsZG9zZGF0ZSx0bXVfZGF0ZSkKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICB1TG9uZyBkb3NkYXRlOwotICAgIHRtX3VueiB0bXVfZGF0ZTsKLXsKLSNpZmRlZiBfV0lOMzIKLSAgSEFORExFIGhGaWxlOwotICBGSUxFVElNRSBmdG0sZnRMb2NhbCxmdENyZWF0ZSxmdExhc3RBY2MsZnRMYXN0V3JpdGU7Ci0KLSAgaEZpbGUgPSBDcmVhdGVGaWxlQShmaWxlbmFtZSxHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFLAotICAgICAgICAgICAgICAgICAgICAgIDAsTlVMTCxPUEVOX0VYSVNUSU5HLDAsTlVMTCk7Ci0gIEdldEZpbGVUaW1lKGhGaWxlLCZmdENyZWF0ZSwmZnRMYXN0QWNjLCZmdExhc3RXcml0ZSk7Ci0gIERvc0RhdGVUaW1lVG9GaWxlVGltZSgoV09SRCkoZG9zZGF0ZT4+MTYpLChXT1JEKWRvc2RhdGUsJmZ0TG9jYWwpOwotICBMb2NhbEZpbGVUaW1lVG9GaWxlVGltZSgmZnRMb2NhbCwmZnRtKTsKLSAgU2V0RmlsZVRpbWUoaEZpbGUsJmZ0bSwmZnRMYXN0QWNjLCZmdG0pOwotICBDbG9zZUhhbmRsZShoRmlsZSk7Ci0jZWxzZQotI2lmZGVmIHVuaXggfHwgX19BUFBMRV9fCi0gIHN0cnVjdCB1dGltYnVmIHV0OwotICBzdHJ1Y3QgdG0gbmV3ZGF0ZTsKLSAgbmV3ZGF0ZS50bV9zZWMgPSB0bXVfZGF0ZS50bV9zZWM7Ci0gIG5ld2RhdGUudG1fbWluPXRtdV9kYXRlLnRtX21pbjsKLSAgbmV3ZGF0ZS50bV9ob3VyPXRtdV9kYXRlLnRtX2hvdXI7Ci0gIG5ld2RhdGUudG1fbWRheT10bXVfZGF0ZS50bV9tZGF5OwotICBuZXdkYXRlLnRtX21vbj10bXVfZGF0ZS50bV9tb247Ci0gIGlmICh0bXVfZGF0ZS50bV95ZWFyID4gMTkwMCkKLSAgICAgIG5ld2RhdGUudG1feWVhcj10bXVfZGF0ZS50bV95ZWFyIC0gMTkwMDsKLSAgZWxzZQotICAgICAgbmV3ZGF0ZS50bV95ZWFyPXRtdV9kYXRlLnRtX3llYXIgOwotICBuZXdkYXRlLnRtX2lzZHN0PS0xOwotCi0gIHV0LmFjdGltZT11dC5tb2R0aW1lPW1rdGltZSgmbmV3ZGF0ZSk7Ci0gIHV0aW1lKGZpbGVuYW1lLCZ1dCk7Ci0jZW5kaWYKLSNlbmRpZgotfQotCi0KLS8qIG15bWtkaXIgYW5kIGNoYW5nZV9maWxlX2RhdGUgYXJlIG5vdCAxMDAgJSBwb3J0YWJsZQotICAgQXMgSSBkb24ndCBrbm93IHdlbGwgVW5peCwgSSB3YWl0IGZlZWRiYWNrIGZvciB0aGUgdW5peCBwb3J0aW9uICovCi0KLWludCBteW1rZGlyKGRpcm5hbWUpCi0gICAgY29uc3QgY2hhciogZGlybmFtZTsKLXsKLSAgICBpbnQgcmV0PTA7Ci0jaWZkZWYgX1dJTjMyCi0gICAgcmV0ID0gX21rZGlyKGRpcm5hbWUpOwotI2VsaWYgdW5peAotICAgIHJldCA9IG1rZGlyIChkaXJuYW1lLDA3NzUpOwotI2VsaWYgX19BUFBMRV9fCi0gICAgcmV0ID0gbWtkaXIgKGRpcm5hbWUsMDc3NSk7Ci0jZW5kaWYKLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgbWFrZWRpciAobmV3ZGlyKQotICAgIGNoYXIgKm5ld2RpcjsKLXsKLSAgY2hhciAqYnVmZmVyIDsKLSAgY2hhciAqcDsKLSAgaW50ICBsZW4gPSAoaW50KXN0cmxlbihuZXdkaXIpOwotCi0gIGlmIChsZW4gPD0gMCkKLSAgICByZXR1cm4gMDsKLQotICBidWZmZXIgPSAoY2hhciopbWFsbG9jKGxlbisxKTsKLSAgICAgICAgaWYgKGJ1ZmZlcj09TlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50ZigiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnlcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBVTlpfSU5URVJOQUxFUlJPUjsKLSAgICAgICAgfQotICBzdHJjcHkoYnVmZmVyLG5ld2Rpcik7Ci0KLSAgaWYgKGJ1ZmZlcltsZW4tMV0gPT0gJy8nKSB7Ci0gICAgYnVmZmVyW2xlbi0xXSA9ICdcMCc7Ci0gIH0KLSAgaWYgKG15bWtkaXIoYnVmZmVyKSA9PSAwKQotICAgIHsKLSAgICAgIGZyZWUoYnVmZmVyKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBwID0gYnVmZmVyKzE7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGNoYXIgaG9sZDsKLQotICAgICAgd2hpbGUoKnAgJiYgKnAgIT0gJ1xcJyAmJiAqcCAhPSAnLycpCi0gICAgICAgIHArKzsKLSAgICAgIGhvbGQgPSAqcDsKLSAgICAgICpwID0gMDsKLSAgICAgIGlmICgobXlta2RpcihidWZmZXIpID09IC0xKSAmJiAoZXJybm8gPT0gRU5PRU5UKSkKLSAgICAgICAgewotICAgICAgICAgIHByaW50ZigiY291bGRuJ3QgY3JlYXRlIGRpcmVjdG9yeSAlc1xuIixidWZmZXIpOwotICAgICAgICAgIGZyZWUoYnVmZmVyKTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgaWYgKGhvbGQgPT0gMCkKLSAgICAgICAgYnJlYWs7Ci0gICAgICAqcCsrID0gaG9sZDsKLSAgICB9Ci0gIGZyZWUoYnVmZmVyKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgZG9fYmFubmVyKCkKLXsKLSAgICBwcmludGYoIk1pbmlVbnogMS4wMWIsIGRlbW8gb2YgekxpYiArIFVueiBwYWNrYWdlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnRcbiIpOwotICAgIHByaW50ZigibW9yZSBpbmZvIGF0IGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbFxuXG4iKTsKLX0KLQotdm9pZCBkb19oZWxwKCkKLXsKLSAgICBwcmludGYoIlVzYWdlIDogbWluaXVueiBbLWVdIFsteF0gWy12XSBbLWxdIFstb10gWy1wIHBhc3N3b3JkXSBmaWxlLnppcCBbZmlsZV90b19leHRyLl0gWy1kIGV4dHJhY3RkaXJdXG5cbiIgXAotICAgICAgICAgICAiICAtZSAgRXh0cmFjdCB3aXRob3V0IHBhdGhuYW1lIChqdW5rIHBhdGhzKVxuIiBcCi0gICAgICAgICAgICIgIC14ICBFeHRyYWN0IHdpdGggcGF0aG5hbWVcbiIgXAotICAgICAgICAgICAiICAtdiAgbGlzdCBmaWxlc1xuIiBcCi0gICAgICAgICAgICIgIC1sICBsaXN0IGZpbGVzXG4iIFwKLSAgICAgICAgICAgIiAgLWQgIGRpcmVjdG9yeSB0byBleHRyYWN0IGludG9cbiIgXAotICAgICAgICAgICAiICAtbyAgb3ZlcndyaXRlIGZpbGVzIHdpdGhvdXQgcHJvbXB0aW5nXG4iIFwKLSAgICAgICAgICAgIiAgLXAgIGV4dHJhY3QgY3J5cHRlZCBmaWxlIHVzaW5nIHBhc3N3b3JkXG5cbiIpOwotfQotCi12b2lkIERpc3BsYXk2NEJpdHNTaXplKFpQT1M2NF9UIG4sIGludCBzaXplX2NoYXIpCi17Ci0gIC8qIHRvIGF2b2lkIGNvbXBhdGliaWxpdHkgcHJvYmxlbSAsIHdlIGRvIGhlcmUgdGhlIGNvbnZlcnNpb24gKi8KLSAgY2hhciBudW1iZXJbMjFdOwotICBpbnQgb2Zmc2V0PTE5OwotICBpbnQgcG9zX3N0cmluZyA9IDE5OwotICBudW1iZXJbMjBdPTA7Ci0gIGZvciAoOzspIHsKLSAgICAgIG51bWJlcltvZmZzZXRdPShjaGFyKSgobiUxMCkrJzAnKTsKLSAgICAgIGlmIChudW1iZXJbb2Zmc2V0XSAhPSAnMCcpCi0gICAgICAgICAgcG9zX3N0cmluZz1vZmZzZXQ7Ci0gICAgICBuLz0xMDsKLSAgICAgIGlmIChvZmZzZXQ9PTApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICBvZmZzZXQtLTsKLSAgfQotICB7Ci0gICAgICBpbnQgc2l6ZV9kaXNwbGF5X3N0cmluZyA9IDE5LXBvc19zdHJpbmc7Ci0gICAgICB3aGlsZSAoc2l6ZV9jaGFyID4gc2l6ZV9kaXNwbGF5X3N0cmluZykKLSAgICAgIHsKLSAgICAgICAgICBzaXplX2NoYXItLTsKLSAgICAgICAgICBwcmludGYoIiAiKTsKLSAgICAgIH0KLSAgfQotCi0gIHByaW50ZigiJXMiLCZudW1iZXJbcG9zX3N0cmluZ10pOwotfQotCi1pbnQgZG9fbGlzdCh1ZikKLSAgICB1bnpGaWxlIHVmOwotewotICAgIHVMb25nIGk7Ci0gICAgdW56X2dsb2JhbF9pbmZvNjQgZ2k7Ci0gICAgaW50IGVycjsKLQotICAgIGVyciA9IHVuekdldEdsb2JhbEluZm82NCh1ZiwmZ2kpOwotICAgIGlmIChlcnIhPVVOWl9PSykKLSAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56R2V0R2xvYmFsSW5mbyBcbiIsZXJyKTsKLSAgICBwcmludGYoIiAgTGVuZ3RoICBNZXRob2QgICAgIFNpemUgUmF0aW8gICBEYXRlICAgIFRpbWUgICBDUkMtMzIgICAgIE5hbWVcbiIpOwotICAgIHByaW50ZigiICAtLS0tLS0gIC0tLS0tLSAgICAgLS0tLSAtLS0tLSAgIC0tLS0gICAgLS0tLSAgIC0tLS0tLSAgICAgLS0tLVxuIik7Ci0gICAgZm9yIChpPTA7aTxnaS5udW1iZXJfZW50cnk7aSsrKQotICAgIHsKLSAgICAgICAgY2hhciBmaWxlbmFtZV9pbnppcFsyNTZdOwotICAgICAgICB1bnpfZmlsZV9pbmZvNjQgZmlsZV9pbmZvOwotICAgICAgICB1TG9uZyByYXRpbz0wOwotICAgICAgICBjb25zdCBjaGFyICpzdHJpbmdfbWV0aG9kOwotICAgICAgICBjaGFyIGNoYXJDcnlwdD0nICc7Ci0gICAgICAgIGVyciA9IHVuekdldEN1cnJlbnRGaWxlSW5mbzY0KHVmLCZmaWxlX2luZm8sZmlsZW5hbWVfaW56aXAsc2l6ZW9mKGZpbGVuYW1lX2luemlwKSxOVUxMLDAsTlVMTCwwKTsKLSAgICAgICAgaWYgKGVyciE9VU5aX09LKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHZXRDdXJyZW50RmlsZUluZm9cbiIsZXJyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWxlX2luZm8udW5jb21wcmVzc2VkX3NpemU+MCkKLSAgICAgICAgICAgIHJhdGlvID0gKHVMb25nKSgoZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSoxMDApL2ZpbGVfaW5mby51bmNvbXByZXNzZWRfc2l6ZSk7Ci0KLSAgICAgICAgLyogZGlzcGxheSBhICcqJyBpZiB0aGUgZmlsZSBpcyBjcnlwdGVkICovCi0gICAgICAgIGlmICgoZmlsZV9pbmZvLmZsYWcgJiAxKSAhPSAwKQotICAgICAgICAgICAgY2hhckNyeXB0PScqJzsKLQotICAgICAgICBpZiAoZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZD09MCkKLSAgICAgICAgICAgIHN0cmluZ19tZXRob2Q9IlN0b3JlZCI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgaWYgKGZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2Q9PVpfREVGTEFURUQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVJbnQgaUxldmVsPSh1SW50KSgoZmlsZV9pbmZvLmZsYWcgJiAweDYpLzIpOwotICAgICAgICAgICAgaWYgKGlMZXZlbD09MCkKLSAgICAgICAgICAgICAgc3RyaW5nX21ldGhvZD0iRGVmbDpOIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKGlMZXZlbD09MSkKLSAgICAgICAgICAgICAgc3RyaW5nX21ldGhvZD0iRGVmbDpYIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKChpTGV2ZWw9PTIpIHx8IChpTGV2ZWw9PTMpKQotICAgICAgICAgICAgICBzdHJpbmdfbWV0aG9kPSJEZWZsOkYiOyAvKiAyOmZhc3QgLCAzIDogZXh0cmEgZmFzdCovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICBpZiAoZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZD09Wl9CWklQMkVEKQotICAgICAgICB7Ci0gICAgICAgICAgICAgIHN0cmluZ19tZXRob2Q9IkJaaXAyICI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RyaW5nX21ldGhvZD0iVW5rbi4gIjsKLQotICAgICAgICBEaXNwbGF5NjRCaXRzU2l6ZShmaWxlX2luZm8udW5jb21wcmVzc2VkX3NpemUsNyk7Ci0gICAgICAgIHByaW50ZigiICAlNnMlYyIsc3RyaW5nX21ldGhvZCxjaGFyQ3J5cHQpOwotICAgICAgICBEaXNwbGF5NjRCaXRzU2l6ZShmaWxlX2luZm8uY29tcHJlc3NlZF9zaXplLDcpOwotICAgICAgICBwcmludGYoIiAlM2x1JSUgICUyLjJsdS0lMi4ybHUtJTIuMmx1ICAlMi4ybHU6JTIuMmx1ICAlOC44bHggICAlc1xuIiwKLSAgICAgICAgICAgICAgICByYXRpbywKLSAgICAgICAgICAgICAgICAodUxvbmcpZmlsZV9pbmZvLnRtdV9kYXRlLnRtX21vbiArIDEsCi0gICAgICAgICAgICAgICAgKHVMb25nKWZpbGVfaW5mby50bXVfZGF0ZS50bV9tZGF5LAotICAgICAgICAgICAgICAgICh1TG9uZylmaWxlX2luZm8udG11X2RhdGUudG1feWVhciAlIDEwMCwKLSAgICAgICAgICAgICAgICAodUxvbmcpZmlsZV9pbmZvLnRtdV9kYXRlLnRtX2hvdXIsKHVMb25nKWZpbGVfaW5mby50bXVfZGF0ZS50bV9taW4sCi0gICAgICAgICAgICAgICAgKHVMb25nKWZpbGVfaW5mby5jcmMsZmlsZW5hbWVfaW56aXApOwotICAgICAgICBpZiAoKGkrMSk8Z2kubnVtYmVyX2VudHJ5KQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSB1bnpHb1RvTmV4dEZpbGUodWYpOwotICAgICAgICAgICAgaWYgKGVyciE9VU5aX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekdvVG9OZXh0RmlsZVxuIixlcnIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGRvX2V4dHJhY3RfY3VycmVudGZpbGUodWYscG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCxwb3B0X292ZXJ3cml0ZSxwYXNzd29yZCkKLSAgICB1bnpGaWxlIHVmOwotICAgIGNvbnN0IGludCogcG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aDsKLSAgICBpbnQqIHBvcHRfb3ZlcndyaXRlOwotICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkOwotewotICAgIGNoYXIgZmlsZW5hbWVfaW56aXBbMjU2XTsKLSAgICBjaGFyKiBmaWxlbmFtZV93aXRob3V0cGF0aDsKLSAgICBjaGFyKiBwOwotICAgIGludCBlcnI9VU5aX09LOwotICAgIEZJTEUgKmZvdXQ9TlVMTDsKLSAgICB2b2lkKiBidWY7Ci0gICAgdUludCBzaXplX2J1ZjsKLQotICAgIHVuel9maWxlX2luZm82NCBmaWxlX2luZm87Ci0gICAgdUxvbmcgcmF0aW89MDsKLSAgICBlcnIgPSB1bnpHZXRDdXJyZW50RmlsZUluZm82NCh1ZiwmZmlsZV9pbmZvLGZpbGVuYW1lX2luemlwLHNpemVvZihmaWxlbmFtZV9pbnppcCksTlVMTCwwLE5VTEwsMCk7Ci0KLSAgICBpZiAoZXJyIT1VTlpfT0spCi0gICAgewotICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHZXRDdXJyZW50RmlsZUluZm9cbiIsZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBzaXplX2J1ZiA9IFdSSVRFQlVGRkVSU0laRTsKLSAgICBidWYgPSAodm9pZCopbWFsbG9jKHNpemVfYnVmKTsKLSAgICBpZiAoYnVmPT1OVUxMKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeVxuIik7Ci0gICAgICAgIHJldHVybiBVTlpfSU5URVJOQUxFUlJPUjsKLSAgICB9Ci0KLSAgICBwID0gZmlsZW5hbWVfd2l0aG91dHBhdGggPSBmaWxlbmFtZV9pbnppcDsKLSAgICB3aGlsZSAoKCpwKSAhPSAnXDAnKQotICAgIHsKLSAgICAgICAgaWYgKCgoKnApPT0nLycpIHx8ICgoKnApPT0nXFwnKSkKLSAgICAgICAgICAgIGZpbGVuYW1lX3dpdGhvdXRwYXRoID0gcCsxOwotICAgICAgICBwKys7Ci0gICAgfQotCi0gICAgaWYgKCgqZmlsZW5hbWVfd2l0aG91dHBhdGgpPT0nXDAnKQotICAgIHsKLSAgICAgICAgaWYgKCgqcG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCk9PTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ZigiY3JlYXRpbmcgZGlyZWN0b3J5OiAlc1xuIixmaWxlbmFtZV9pbnppcCk7Ci0gICAgICAgICAgICBteW1rZGlyKGZpbGVuYW1lX2luemlwKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBjb25zdCBjaGFyKiB3cml0ZV9maWxlbmFtZTsKLSAgICAgICAgaW50IHNraXA9MDsKLQotICAgICAgICBpZiAoKCpwb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoKT09MCkKLSAgICAgICAgICAgIHdyaXRlX2ZpbGVuYW1lID0gZmlsZW5hbWVfaW56aXA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHdyaXRlX2ZpbGVuYW1lID0gZmlsZW5hbWVfd2l0aG91dHBhdGg7Ci0KLSAgICAgICAgZXJyID0gdW56T3BlbkN1cnJlbnRGaWxlUGFzc3dvcmQodWYscGFzc3dvcmQpOwotICAgICAgICBpZiAoZXJyIT1VTlpfT0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuek9wZW5DdXJyZW50RmlsZVBhc3N3b3JkXG4iLGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKCgqcG9wdF9vdmVyd3JpdGUpPT0wKSAmJiAoZXJyPT1VTlpfT0spKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIHJlcD0wOwotICAgICAgICAgICAgRklMRSogZnRlc3RleGlzdDsKLSAgICAgICAgICAgIGZ0ZXN0ZXhpc3QgPSBGT1BFTl9GVU5DKHdyaXRlX2ZpbGVuYW1lLCJyYiIpOwotICAgICAgICAgICAgaWYgKGZ0ZXN0ZXhpc3QhPU5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmNsb3NlKGZ0ZXN0ZXhpc3QpOwotICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGFyIGFuc3dlclsxMjhdOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0OwotCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiVGhlIGZpbGUgJXMgZXhpc3RzLiBPdmVyd3JpdGUgPyBbeV1lcywgW25dbywgW0FdbGw6ICIsd3JpdGVfZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICByZXQgPSBzY2FuZigiJTFzIixhbnN3ZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IDEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJlcCA9IGFuc3dlclswXSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgocmVwPj0nYScpICYmIChyZXA8PSd6JykpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXAgLT0gMHgyMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChyZXAhPSdZJykgJiYgKHJlcCE9J04nKSAmJiAocmVwIT0nQScpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlcCA9PSAnTicpCi0gICAgICAgICAgICAgICAgc2tpcCA9IDE7Ci0KLSAgICAgICAgICAgIGlmIChyZXAgPT0gJ0EnKQotICAgICAgICAgICAgICAgICpwb3B0X292ZXJ3cml0ZT0xOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChza2lwPT0wKSAmJiAoZXJyPT1VTlpfT0spKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3V0PUZPUEVOX0ZVTkMod3JpdGVfZmlsZW5hbWUsIndiIik7Ci0gICAgICAgICAgICAvKiBzb21lIHppcGZpbGUgZG9uJ3QgY29udGFpbiBkaXJlY3RvcnkgYWxvbmUgYmVmb3JlIGZpbGUgKi8KLSAgICAgICAgICAgIGlmICgoZm91dD09TlVMTCkgJiYgKCgqcG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCk9PTApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlbmFtZV93aXRob3V0cGF0aCE9KGNoYXIqKWZpbGVuYW1lX2luemlwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFyIGM9KihmaWxlbmFtZV93aXRob3V0cGF0aC0xKTsKLSAgICAgICAgICAgICAgICAqKGZpbGVuYW1lX3dpdGhvdXRwYXRoLTEpPSdcMCc7Ci0gICAgICAgICAgICAgICAgbWFrZWRpcih3cml0ZV9maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgKihmaWxlbmFtZV93aXRob3V0cGF0aC0xKT1jOwotICAgICAgICAgICAgICAgIGZvdXQ9Rk9QRU5fRlVOQyh3cml0ZV9maWxlbmFtZSwid2IiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZvdXQ9PU5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBvcGVuaW5nICVzXG4iLHdyaXRlX2ZpbGVuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmb3V0IT1OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGYoIiBleHRyYWN0aW5nOiAlc1xuIix3cml0ZV9maWxlbmFtZSk7Ci0KLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gdW56UmVhZEN1cnJlbnRGaWxlKHVmLGJ1ZixzaXplX2J1Zik7Ci0gICAgICAgICAgICAgICAgaWYgKGVycjwwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56UmVhZEN1cnJlbnRGaWxlXG4iLGVycik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZXJyPjApCi0gICAgICAgICAgICAgICAgICAgIGlmIChmd3JpdGUoYnVmLGVyciwxLGZvdXQpIT0xKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIGluIHdyaXRpbmcgZXh0cmFjdGVkIGZpbGVcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoZXJyPjApOwotICAgICAgICAgICAgaWYgKGZvdXQpCi0gICAgICAgICAgICAgICAgICAgIGZjbG9zZShmb3V0KTsKLQotICAgICAgICAgICAgaWYgKGVycj09MCkKLSAgICAgICAgICAgICAgICBjaGFuZ2VfZmlsZV9kYXRlKHdyaXRlX2ZpbGVuYW1lLGZpbGVfaW5mby5kb3NEYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9pbmZvLnRtdV9kYXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnI9PVVOWl9PSykKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gdW56Q2xvc2VDdXJyZW50RmlsZSAodWYpOwotICAgICAgICAgICAgaWYgKGVyciE9VU5aX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekNsb3NlQ3VycmVudEZpbGVcbiIsZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1bnpDbG9zZUN1cnJlbnRGaWxlKHVmKTsgLyogZG9uJ3QgbG9zZSB0aGUgZXJyb3IgKi8KLSAgICB9Ci0KLSAgICBmcmVlKGJ1Zik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi1pbnQgZG9fZXh0cmFjdCh1ZixvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgsb3B0X292ZXJ3cml0ZSxwYXNzd29yZCkKLSAgICB1bnpGaWxlIHVmOwotICAgIGludCBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGg7Ci0gICAgaW50IG9wdF9vdmVyd3JpdGU7Ci0gICAgY29uc3QgY2hhciogcGFzc3dvcmQ7Ci17Ci0gICAgdUxvbmcgaTsKLSAgICB1bnpfZ2xvYmFsX2luZm82NCBnaTsKLSAgICBpbnQgZXJyOwotICAgIEZJTEUqIGZvdXQ9TlVMTDsKLQotICAgIGVyciA9IHVuekdldEdsb2JhbEluZm82NCh1ZiwmZ2kpOwotICAgIGlmIChlcnIhPVVOWl9PSykKLSAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56R2V0R2xvYmFsSW5mbyBcbiIsZXJyKTsKLQotICAgIGZvciAoaT0wO2k8Z2kubnVtYmVyX2VudHJ5O2krKykKLSAgICB7Ci0gICAgICAgIGlmIChkb19leHRyYWN0X2N1cnJlbnRmaWxlKHVmLCZvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHRfb3ZlcndyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCkgIT0gVU5aX09LKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKChpKzEpPGdpLm51bWJlcl9lbnRyeSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gdW56R29Ub05leHRGaWxlKHVmKTsKLSAgICAgICAgICAgIGlmIChlcnIhPVVOWl9PSykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHb1RvTmV4dEZpbGVcbiIsZXJyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1pbnQgZG9fZXh0cmFjdF9vbmVmaWxlKHVmLGZpbGVuYW1lLG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCxvcHRfb3ZlcndyaXRlLHBhc3N3b3JkKQotICAgIHVuekZpbGUgdWY7Ci0gICAgY29uc3QgY2hhciogZmlsZW5hbWU7Ci0gICAgaW50IG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aDsKLSAgICBpbnQgb3B0X292ZXJ3cml0ZTsKLSAgICBjb25zdCBjaGFyKiBwYXNzd29yZDsKLXsKLSAgICBpbnQgZXJyID0gVU5aX09LOwotICAgIGlmICh1bnpMb2NhdGVGaWxlKHVmLGZpbGVuYW1lLENBU0VTRU5TSVRJVklUWSkhPVVOWl9PSykKLSAgICB7Ci0gICAgICAgIHByaW50ZigiZmlsZSAlcyBub3QgZm91bmQgaW4gdGhlIHppcGZpbGVcbiIsZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLSAgICBpZiAoZG9fZXh0cmFjdF9jdXJyZW50ZmlsZSh1Ziwmb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0X292ZXJ3cml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQpID09IFVOWl9PSykKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMTsKLX0KLQotCi1pbnQgbWFpbihhcmdjLGFyZ3YpCi0gICAgaW50IGFyZ2M7Ci0gICAgY2hhciAqYXJndltdOwotewotICAgIGNvbnN0IGNoYXIgKnppcGZpbGVuYW1lPU5VTEw7Ci0gICAgY29uc3QgY2hhciAqZmlsZW5hbWVfdG9fZXh0cmFjdD1OVUxMOwotICAgIGNvbnN0IGNoYXIgKnBhc3N3b3JkPU5VTEw7Ci0gICAgY2hhciBmaWxlbmFtZV90cnlbTUFYRklMRU5BTUUrMTZdID0gIiI7Ci0gICAgaW50IGk7Ci0gICAgaW50IHJldF92YWx1ZT0wOwotICAgIGludCBvcHRfZG9fbGlzdD0wOwotICAgIGludCBvcHRfZG9fZXh0cmFjdD0xOwotICAgIGludCBvcHRfZG9fZXh0cmFjdF93aXRob3V0cGF0aD0wOwotICAgIGludCBvcHRfb3ZlcndyaXRlPTA7Ci0gICAgaW50IG9wdF9leHRyYWN0ZGlyPTA7Ci0gICAgY29uc3QgY2hhciAqZGlybmFtZT1OVUxMOwotICAgIHVuekZpbGUgdWY9TlVMTDsKLQotICAgIGRvX2Jhbm5lcigpOwotICAgIGlmIChhcmdjPT0xKQotICAgIHsKLSAgICAgICAgZG9faGVscCgpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpPTE7aTxhcmdjO2krKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCgqYXJndltpXSk9PSctJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwPWFyZ3ZbaV0rMTsKLQotICAgICAgICAgICAgICAgIHdoaWxlICgoKnApIT0nXDAnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjPSoocCsrKTs7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoYz09J2wnKSB8fCAoYz09J0wnKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9kb19saXN0ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjPT0ndicpIHx8IChjPT0nVicpKQotICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2RvX2xpc3QgPSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSd4JykgfHwgKGM9PSdYJykpCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRfZG9fZXh0cmFjdCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoYz09J2UnKSB8fCAoYz09J0UnKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9kb19leHRyYWN0ID0gb3B0X2RvX2V4dHJhY3Rfd2l0aG91dHBhdGggPSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdvJykgfHwgKGM9PSdPJykpCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRfb3ZlcndyaXRlPTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoYz09J2QnKSB8fCAoYz09J0QnKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2V4dHJhY3RkaXI9MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpcm5hbWU9YXJndltpKzFdOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCgoYz09J3AnKSB8fCAoYz09J1AnKSkgJiYgKGkrMTxhcmdjKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ9YXJndltpKzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh6aXBmaWxlbmFtZSA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICB6aXBmaWxlbmFtZSA9IGFyZ3ZbaV07Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoKGZpbGVuYW1lX3RvX2V4dHJhY3Q9PU5VTEwpICYmICghb3B0X2V4dHJhY3RkaXIpKQotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfdG9fZXh0cmFjdCA9IGFyZ3ZbaV0gOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHppcGZpbGVuYW1lIT1OVUxMKQotICAgIHsKLQotIyAgICAgICAgaWZkZWYgVVNFV0lOMzJJT0FQSQotICAgICAgICB6bGliX2ZpbGVmdW5jNjRfZGVmIGZmdW5jOwotIyAgICAgICAgZW5kaWYKLQotICAgICAgICBzdHJuY3B5KGZpbGVuYW1lX3RyeSwgemlwZmlsZW5hbWUsTUFYRklMRU5BTUUtMSk7Ci0gICAgICAgIC8qIHN0cm5jcHkgZG9lc250IGFwcGVuZCB0aGUgdHJhaWxpbmcgTlVMTCwgb2YgdGhlIHN0cmluZyBpcyB0b28gbG9uZy4gKi8KLSAgICAgICAgZmlsZW5hbWVfdHJ5WyBNQVhGSUxFTkFNRSBdID0gJ1wwJzsKLQotIyAgICAgICAgaWZkZWYgVVNFV0lOMzJJT0FQSQotICAgICAgICBmaWxsX3dpbjMyX2ZpbGVmdW5jNjRBKCZmZnVuYyk7Ci0gICAgICAgIHVmID0gdW56T3BlbjJfNjQoemlwZmlsZW5hbWUsJmZmdW5jKTsKLSMgICAgICAgIGVsc2UKLSAgICAgICAgdWYgPSB1bnpPcGVuNjQoemlwZmlsZW5hbWUpOwotIyAgICAgICAgZW5kaWYKLSAgICAgICAgaWYgKHVmPT1OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJjYXQoZmlsZW5hbWVfdHJ5LCIuemlwIik7Ci0jICAgICAgICAgICAgaWZkZWYgVVNFV0lOMzJJT0FQSQotICAgICAgICAgICAgdWYgPSB1bnpPcGVuMl82NChmaWxlbmFtZV90cnksJmZmdW5jKTsKLSMgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB1ZiA9IHVuek9wZW42NChmaWxlbmFtZV90cnkpOwotIyAgICAgICAgICAgIGVuZGlmCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodWY9PU5VTEwpCi0gICAgewotICAgICAgICBwcmludGYoIkNhbm5vdCBvcGVuICVzIG9yICVzLnppcFxuIix6aXBmaWxlbmFtZSx6aXBmaWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBwcmludGYoIiVzIG9wZW5lZFxuIixmaWxlbmFtZV90cnkpOwotCi0gICAgaWYgKG9wdF9kb19saXN0PT0xKQotICAgICAgICByZXRfdmFsdWUgPSBkb19saXN0KHVmKTsKLSAgICBlbHNlIGlmIChvcHRfZG9fZXh0cmFjdD09MSkKLSAgICB7Ci0jaWZkZWYgX1dJTjMyCi0gICAgICAgIGlmIChvcHRfZXh0cmFjdGRpciAmJiBfY2hkaXIoZGlybmFtZSkpCi0jZWxzZQotICAgICAgICBpZiAob3B0X2V4dHJhY3RkaXIgJiYgY2hkaXIoZGlybmFtZSkpCi0jZW5kaWYKLSAgICAgICAgewotICAgICAgICAgIHByaW50ZigiRXJyb3IgY2hhbmdpbmcgaW50byAlcywgYWJvcnRpbmdcbiIsIGRpcm5hbWUpOwotICAgICAgICAgIGV4aXQoLTEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZpbGVuYW1lX3RvX2V4dHJhY3QgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldF92YWx1ZSA9IGRvX2V4dHJhY3QodWYsIG9wdF9kb19leHRyYWN0X3dpdGhvdXRwYXRoLCBvcHRfb3ZlcndyaXRlLCBwYXNzd29yZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldF92YWx1ZSA9IGRvX2V4dHJhY3Rfb25lZmlsZSh1ZiwgZmlsZW5hbWVfdG9fZXh0cmFjdCwgb3B0X2RvX2V4dHJhY3Rfd2l0aG91dHBhdGgsIG9wdF9vdmVyd3JpdGUsIHBhc3N3b3JkKTsKLSAgICB9Ci0KLSAgICB1bnpDbG9zZSh1Zik7Ci0KLSAgICByZXR1cm4gcmV0X3ZhbHVlOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9taW5pemlwL21pbml6aXAuYyBiL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9taW5pemlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyODg5NjIuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9taW5pemlwL21pbml6aXAuYworKysgL2Rldi9udWxsCkBAIC0xLDUyMCArMCwwIEBACi0vKgotICAgbWluaXppcC5jCi0gICBWZXJzaW9uIDEuMSwgRmVicnVhcnkgMTRoLCAyMDEwCi0gICBzYW1wbGUgcGFydCBvZiB0aGUgTWluaVppcCBwcm9qZWN0IC0gKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCi0KLSAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDEwIEdpbGxlcyBWb2xsYW50IChtaW5pemlwKSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKLQotICAgICAgICAgTW9kaWZpY2F0aW9ucyBvZiBVbnppcCBmb3IgWmlwNjQKLSAgICAgICAgIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEV2ZW4gUm91YXVsdAotCi0gICAgICAgICBNb2RpZmljYXRpb25zIGZvciBaaXA2NCBzdXBwb3J0IG9uIGJvdGggemlwIGFuZCB1bnppcAotICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTWF0aGlhcyBTdmVuc3NvbiAoIGh0dHA6Ly9yZXN1bHQ0Mi5jb20gKQotKi8KLQotCi0jaWYgKCFkZWZpbmVkKF9XSU4zMikpICYmICghZGVmaW5lZChXSU4zMikpICYmICghZGVmaW5lZChfX0FQUExFX18pKQotICAgICAgICAjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKLSAgICAgICAgICAgICAgICAjZGVmaW5lIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKLSAgICAgICAgI2VuZGlmCi0gICAgICAgICNpZm5kZWYgX19VU0VfTEFSR0VGSUxFNjQKLSAgICAgICAgICAgICAgICAjZGVmaW5lIF9fVVNFX0xBUkdFRklMRTY0Ci0gICAgICAgICNlbmRpZgotICAgICAgICAjaWZuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKLSAgICAgICAgICAgICAgICAjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UKLSAgICAgICAgI2VuZGlmCi0gICAgICAgICNpZm5kZWYgX0ZJTEVfT0ZGU0VUX0JJVAotICAgICAgICAgICAgICAgICNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVCA2NAotICAgICAgICAjZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX19BUFBMRV9fCi0vLyBJbiBkYXJ3aW4gYW5kIHBlcmhhcHMgb3RoZXIgQlNEIHZhcmlhbnRzIG9mZl90IGlzIGEgNjQgYml0IHZhbHVlLCBoZW5jZSBubyBuZWVkIGZvciBzcGVjaWZpYyA2NCBiaXQgZnVuY3Rpb25zCi0jZGVmaW5lIEZPUEVOX0ZVTkMoZmlsZW5hbWUsIG1vZGUpIGZvcGVuKGZpbGVuYW1lLCBtb2RlKQotI2RlZmluZSBGVEVMTE9fRlVOQyhzdHJlYW0pIGZ0ZWxsbyhzdHJlYW0pCi0jZGVmaW5lIEZTRUVLT19GVU5DKHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pIGZzZWVrbyhzdHJlYW0sIG9mZnNldCwgb3JpZ2luKQotI2Vsc2UKLSNkZWZpbmUgRk9QRU5fRlVOQyhmaWxlbmFtZSwgbW9kZSkgZm9wZW42NChmaWxlbmFtZSwgbW9kZSkKLSNkZWZpbmUgRlRFTExPX0ZVTkMoc3RyZWFtKSBmdGVsbG82NChzdHJlYW0pCi0jZGVmaW5lIEZTRUVLT19GVU5DKHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pIGZzZWVrbzY0KHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pCi0jZW5kaWYKLQotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLSNpZmRlZiBfV0lOMzIKLSMgaW5jbHVkZSA8ZGlyZWN0Lmg+Ci0jIGluY2x1ZGUgPGlvLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgaW5jbHVkZSA8dXRpbWUuaD4KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jIGluY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgInppcC5oIgotCi0jaWZkZWYgX1dJTjMyCi0gICAgICAgICNkZWZpbmUgVVNFV0lOMzJJT0FQSQotICAgICAgICAjaW5jbHVkZSAiaW93aW4zMi5oIgotI2VuZGlmCi0KLQotCi0jZGVmaW5lIFdSSVRFQlVGRkVSU0laRSAoMTYzODQpCi0jZGVmaW5lIE1BWEZJTEVOQU1FICgyNTYpCi0KLSNpZmRlZiBfV0lOMzIKLXVMb25nIGZpbGV0aW1lKGYsIHRtemlwLCBkdCkKLSAgICBjaGFyICpmOyAgICAgICAgICAgICAgICAvKiBuYW1lIG9mIGZpbGUgdG8gZ2V0IGluZm8gb24gKi8KLSAgICB0bV96aXAgKnRtemlwOyAgICAgICAgICAgICAvKiByZXR1cm4gdmFsdWU6IGFjY2VzcywgbW9kaWZpYy4gYW5kIGNyZWF0aW9uIHRpbWVzICovCi0gICAgdUxvbmcgKmR0OyAgICAgICAgICAgICAvKiBkb3N0aW1lICovCi17Ci0gIGludCByZXQgPSAwOwotICB7Ci0gICAgICBGSUxFVElNRSBmdExvY2FsOwotICAgICAgSEFORExFIGhGaW5kOwotICAgICAgV0lOMzJfRklORF9EQVRBQSBmZjMyOwotCi0gICAgICBoRmluZCA9IEZpbmRGaXJzdEZpbGVBKGYsJmZmMzIpOwotICAgICAgaWYgKGhGaW5kICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgICAgewotICAgICAgICBGaWxlVGltZVRvTG9jYWxGaWxlVGltZSgmKGZmMzIuZnRMYXN0V3JpdGVUaW1lKSwmZnRMb2NhbCk7Ci0gICAgICAgIEZpbGVUaW1lVG9Eb3NEYXRlVGltZSgmZnRMb2NhbCwoKExQV09SRClkdCkrMSwoKExQV09SRClkdCkrMCk7Ci0gICAgICAgIEZpbmRDbG9zZShoRmluZCk7Ci0gICAgICAgIHJldCA9IDE7Ci0gICAgICB9Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLSNlbHNlCi0jaWZkZWYgdW5peCB8fCBfX0FQUExFX18KLXVMb25nIGZpbGV0aW1lKGYsIHRtemlwLCBkdCkKLSAgICBjaGFyICpmOyAgICAgICAgICAgICAgIC8qIG5hbWUgb2YgZmlsZSB0byBnZXQgaW5mbyBvbiAqLwotICAgIHRtX3ppcCAqdG16aXA7ICAgICAgICAgLyogcmV0dXJuIHZhbHVlOiBhY2Nlc3MsIG1vZGlmaWMuIGFuZCBjcmVhdGlvbiB0aW1lcyAqLwotICAgIHVMb25nICpkdDsgICAgICAgICAgICAgLyogZG9zdGltZSAqLwotewotICBpbnQgcmV0PTA7Ci0gIHN0cnVjdCBzdGF0IHM7ICAgICAgICAvKiByZXN1bHRzIG9mIHN0YXQoKSAqLwotICBzdHJ1Y3QgdG0qIGZpbGVkYXRlOwotICB0aW1lX3QgdG1fdD0wOwotCi0gIGlmIChzdHJjbXAoZiwiLSIpIT0wKQotICB7Ci0gICAgY2hhciBuYW1lW01BWEZJTEVOQU1FKzFdOwotICAgIGludCBsZW4gPSBzdHJsZW4oZik7Ci0gICAgaWYgKGxlbiA+IE1BWEZJTEVOQU1FKQotICAgICAgbGVuID0gTUFYRklMRU5BTUU7Ci0KLSAgICBzdHJuY3B5KG5hbWUsIGYsTUFYRklMRU5BTUUtMSk7Ci0gICAgLyogc3RybmNweSBkb2VzbnQgYXBwZW5kIHRoZSB0cmFpbGluZyBOVUxMLCBvZiB0aGUgc3RyaW5nIGlzIHRvbyBsb25nLiAqLwotICAgIG5hbWVbIE1BWEZJTEVOQU1FIF0gPSAnXDAnOwotCi0gICAgaWYgKG5hbWVbbGVuIC0gMV0gPT0gJy8nKQotICAgICAgbmFtZVtsZW4gLSAxXSA9ICdcMCc7Ci0gICAgLyogbm90IGFsbCBzeXN0ZW1zIGFsbG93IHN0YXQnaW5nIGEgZmlsZSB3aXRoIC8gYXBwZW5kZWQgKi8KLSAgICBpZiAoc3RhdChuYW1lLCZzKT09MCkKLSAgICB7Ci0gICAgICB0bV90ID0gcy5zdF9tdGltZTsKLSAgICAgIHJldCA9IDE7Ci0gICAgfQotICB9Ci0gIGZpbGVkYXRlID0gbG9jYWx0aW1lKCZ0bV90KTsKLQotICB0bXppcC0+dG1fc2VjICA9IGZpbGVkYXRlLT50bV9zZWM7Ci0gIHRtemlwLT50bV9taW4gID0gZmlsZWRhdGUtPnRtX21pbjsKLSAgdG16aXAtPnRtX2hvdXIgPSBmaWxlZGF0ZS0+dG1faG91cjsKLSAgdG16aXAtPnRtX21kYXkgPSBmaWxlZGF0ZS0+dG1fbWRheTsKLSAgdG16aXAtPnRtX21vbiAgPSBmaWxlZGF0ZS0+dG1fbW9uIDsKLSAgdG16aXAtPnRtX3llYXIgPSBmaWxlZGF0ZS0+dG1feWVhcjsKLQotICByZXR1cm4gcmV0OwotfQotI2Vsc2UKLXVMb25nIGZpbGV0aW1lKGYsIHRtemlwLCBkdCkKLSAgICBjaGFyICpmOyAgICAgICAgICAgICAgICAvKiBuYW1lIG9mIGZpbGUgdG8gZ2V0IGluZm8gb24gKi8KLSAgICB0bV96aXAgKnRtemlwOyAgICAgICAgICAgICAvKiByZXR1cm4gdmFsdWU6IGFjY2VzcywgbW9kaWZpYy4gYW5kIGNyZWF0aW9uIHRpbWVzICovCi0gICAgdUxvbmcgKmR0OyAgICAgICAgICAgICAvKiBkb3N0aW1lICovCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLSNlbmRpZgotCi0KLQotCi1pbnQgY2hlY2tfZXhpc3RfZmlsZShmaWxlbmFtZSkKLSAgICBjb25zdCBjaGFyKiBmaWxlbmFtZTsKLXsKLSAgICBGSUxFKiBmdGVzdGV4aXN0OwotICAgIGludCByZXQgPSAxOwotICAgIGZ0ZXN0ZXhpc3QgPSBGT1BFTl9GVU5DKGZpbGVuYW1lLCJyYiIpOwotICAgIGlmIChmdGVzdGV4aXN0PT1OVUxMKQotICAgICAgICByZXQgPSAwOwotICAgIGVsc2UKLSAgICAgICAgZmNsb3NlKGZ0ZXN0ZXhpc3QpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgZG9fYmFubmVyKCkKLXsKLSAgICBwcmludGYoIk1pbmlaaXAgMS4xLCBkZW1vIG9mIHpMaWIgKyBNaW5pWmlwNjQgcGFja2FnZSwgd3JpdHRlbiBieSBHaWxsZXMgVm9sbGFudFxuIik7Ci0gICAgcHJpbnRmKCJtb3JlIGluZm8gb24gTWluaVppcCBhdCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbFxuXG4iKTsKLX0KLQotdm9pZCBkb19oZWxwKCkKLXsKLSAgICBwcmludGYoIlVzYWdlIDogbWluaXppcCBbLW9dIFstYV0gWy0wIHRvIC05XSBbLXAgcGFzc3dvcmRdIFstal0gZmlsZS56aXAgW2ZpbGVzX3RvX2FkZF1cblxuIiBcCi0gICAgICAgICAgICIgIC1vICBPdmVyd3JpdGUgZXhpc3RpbmcgZmlsZS56aXBcbiIgXAotICAgICAgICAgICAiICAtYSAgQXBwZW5kIHRvIGV4aXN0aW5nIGZpbGUuemlwXG4iIFwKLSAgICAgICAgICAgIiAgLTAgIFN0b3JlIG9ubHlcbiIgXAotICAgICAgICAgICAiICAtMSAgQ29tcHJlc3MgZmFzdGVyXG4iIFwKLSAgICAgICAgICAgIiAgLTkgIENvbXByZXNzIGJldHRlclxuXG4iIFwKLSAgICAgICAgICAgIiAgLWogIGV4Y2x1ZGUgcGF0aC4gc3RvcmUgb25seSB0aGUgZmlsZSBuYW1lLlxuXG4iKTsKLX0KLQotLyogY2FsY3VsYXRlIHRoZSBDUkMzMiBvZiBhIGZpbGUsCi0gICBiZWNhdXNlIHRvIGVuY3J5cHQgYSBmaWxlLCB3ZSBuZWVkIGtub3duIHRoZSBDUkMzMiBvZiB0aGUgZmlsZSBiZWZvcmUgKi8KLWludCBnZXRGaWxlQ3JjKGNvbnN0IGNoYXIqIGZpbGVuYW1laW56aXAsdm9pZCpidWYsdW5zaWduZWQgbG9uZyBzaXplX2J1Zix1bnNpZ25lZCBsb25nKiByZXN1bHRfY3JjKQotewotICAgdW5zaWduZWQgbG9uZyBjYWxjdWxhdGVfY3JjPTA7Ci0gICBpbnQgZXJyPVpJUF9PSzsKLSAgIEZJTEUgKiBmaW4gPSBGT1BFTl9GVU5DKGZpbGVuYW1laW56aXAsInJiIik7Ci0KLSAgIHVuc2lnbmVkIGxvbmcgc2l6ZV9yZWFkID0gMDsKLSAgIHVuc2lnbmVkIGxvbmcgdG90YWxfcmVhZCA9IDA7Ci0gICBpZiAoZmluPT1OVUxMKQotICAgewotICAgICAgIGVyciA9IFpJUF9FUlJOTzsKLSAgIH0KLQotICAgIGlmIChlcnIgPT0gWklQX09LKQotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBaSVBfT0s7Ci0gICAgICAgICAgICBzaXplX3JlYWQgPSAoaW50KWZyZWFkKGJ1ZiwxLHNpemVfYnVmLGZpbik7Ci0gICAgICAgICAgICBpZiAoc2l6ZV9yZWFkIDwgc2l6ZV9idWYpCi0gICAgICAgICAgICAgICAgaWYgKGZlb2YoZmluKT09MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIGluIHJlYWRpbmcgJXNcbiIsZmlsZW5hbWVpbnppcCk7Ci0gICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2l6ZV9yZWFkPjApCi0gICAgICAgICAgICAgICAgY2FsY3VsYXRlX2NyYyA9IGNyYzMyKGNhbGN1bGF0ZV9jcmMsYnVmLHNpemVfcmVhZCk7Ci0gICAgICAgICAgICB0b3RhbF9yZWFkICs9IHNpemVfcmVhZDsKLQotICAgICAgICB9IHdoaWxlICgoZXJyID09IFpJUF9PSykgJiYgKHNpemVfcmVhZD4wKSk7Ci0KLSAgICBpZiAoZmluKQotICAgICAgICBmY2xvc2UoZmluKTsKLQotICAgICpyZXN1bHRfY3JjPWNhbGN1bGF0ZV9jcmM7Ci0gICAgcHJpbnRmKCJmaWxlICVzIGNyYyAlbHhcbiIsIGZpbGVuYW1laW56aXAsIGNhbGN1bGF0ZV9jcmMpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLWludCBpc0xhcmdlRmlsZShjb25zdCBjaGFyKiBmaWxlbmFtZSkKLXsKLSAgaW50IGxhcmdlRmlsZSA9IDA7Ci0gIFpQT1M2NF9UIHBvcyA9IDA7Ci0gIEZJTEUqIHBGaWxlID0gRk9QRU5fRlVOQyhmaWxlbmFtZSwgInJiIik7Ci0KLSAgaWYocEZpbGUgIT0gTlVMTCkKLSAgewotICAgIGludCBuID0gRlNFRUtPX0ZVTkMocEZpbGUsIDAsIFNFRUtfRU5EKTsKLSAgICBwb3MgPSBGVEVMTE9fRlVOQyhwRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICBwcmludGYoIkZpbGUgOiAlcyBpcyAlbGxkIGJ5dGVzXG4iLCBmaWxlbmFtZSwgcG9zKTsKLQotICAgIGlmKHBvcyA+PSAweGZmZmZmZmZmKQotICAgICBsYXJnZUZpbGUgPSAxOwotCi0gICAgICAgICAgICAgICAgZmNsb3NlKHBGaWxlKTsKLSAgfQotCi0gcmV0dXJuIGxhcmdlRmlsZTsKLX0KLQotaW50IG1haW4oYXJnYyxhcmd2KQotICAgIGludCBhcmdjOwotICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgb3B0X292ZXJ3cml0ZT0wOwotICAgIGludCBvcHRfY29tcHJlc3NfbGV2ZWw9Wl9ERUZBVUxUX0NPTVBSRVNTSU9OOwotICAgIGludCBvcHRfZXhjbHVkZV9wYXRoPTA7Ci0gICAgaW50IHppcGZpbGVuYW1lYXJnID0gMDsKLSAgICBjaGFyIGZpbGVuYW1lX3RyeVtNQVhGSUxFTkFNRSsxNl07Ci0gICAgaW50IHppcG9rOwotICAgIGludCBlcnI9MDsKLSAgICBpbnQgc2l6ZV9idWY9MDsKLSAgICB2b2lkKiBidWY9TlVMTDsKLSAgICBjb25zdCBjaGFyKiBwYXNzd29yZD1OVUxMOwotCi0KLSAgICBkb19iYW5uZXIoKTsKLSAgICBpZiAoYXJnYz09MSkKLSAgICB7Ci0gICAgICAgIGRvX2hlbHAoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaT0xO2k8YXJnYztpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoKmFyZ3ZbaV0pPT0nLScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcD1hcmd2W2ldKzE7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoKCpwKSE9J1wwJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgYz0qKHArKyk7OwotICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdvJykgfHwgKGM9PSdPJykpCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRfb3ZlcndyaXRlID0gMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjPT0nYScpIHx8IChjPT0nQScpKQotICAgICAgICAgICAgICAgICAgICAgICAgb3B0X292ZXJ3cml0ZSA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoYz49JzAnKSAmJiAoYzw9JzknKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9jb21wcmVzc19sZXZlbCA9IGMtJzAnOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdqJykgfHwgKGM9PSdKJykpCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRfZXhjbHVkZV9wYXRoID0gMTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKChjPT0ncCcpIHx8IChjPT0nUCcpKSAmJiAoaSsxPGFyZ2MpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZD1hcmd2W2krMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHppcGZpbGVuYW1lYXJnID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB6aXBmaWxlbmFtZWFyZyA9IGkgOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHNpemVfYnVmID0gV1JJVEVCVUZGRVJTSVpFOwotICAgIGJ1ZiA9ICh2b2lkKiltYWxsb2Moc2l6ZV9idWYpOwotICAgIGlmIChidWY9PU5VTEwpCi0gICAgewotICAgICAgICBwcmludGYoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKLSAgICAgICAgcmV0dXJuIFpJUF9JTlRFUk5BTEVSUk9SOwotICAgIH0KLQotICAgIGlmICh6aXBmaWxlbmFtZWFyZz09MCkKLSAgICB7Ci0gICAgICAgIHppcG9rPTA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGludCBpLGxlbjsKLSAgICAgICAgaW50IGRvdF9mb3VuZD0wOwotCi0gICAgICAgIHppcG9rID0gMSA7Ci0gICAgICAgIHN0cm5jcHkoZmlsZW5hbWVfdHJ5LCBhcmd2W3ppcGZpbGVuYW1lYXJnXSxNQVhGSUxFTkFNRS0xKTsKLSAgICAgICAgLyogc3RybmNweSBkb2VzbnQgYXBwZW5kIHRoZSB0cmFpbGluZyBOVUxMLCBvZiB0aGUgc3RyaW5nIGlzIHRvbyBsb25nLiAqLwotICAgICAgICBmaWxlbmFtZV90cnlbIE1BWEZJTEVOQU1FIF0gPSAnXDAnOwotCi0gICAgICAgIGxlbj0oaW50KXN0cmxlbihmaWxlbmFtZV90cnkpOwotICAgICAgICBmb3IgKGk9MDtpPGxlbjtpKyspCi0gICAgICAgICAgICBpZiAoZmlsZW5hbWVfdHJ5W2ldPT0nLicpCi0gICAgICAgICAgICAgICAgZG90X2ZvdW5kPTE7Ci0KLSAgICAgICAgaWYgKGRvdF9mb3VuZD09MCkKLSAgICAgICAgICAgIHN0cmNhdChmaWxlbmFtZV90cnksIi56aXAiKTsKLQotICAgICAgICBpZiAob3B0X292ZXJ3cml0ZT09MikKLSAgICAgICAgewotICAgICAgICAgICAgLyogaWYgdGhlIGZpbGUgZG9uJ3QgZXhpc3QsIHdlIG5vdCBhcHBlbmQgZmlsZSAqLwotICAgICAgICAgICAgaWYgKGNoZWNrX2V4aXN0X2ZpbGUoZmlsZW5hbWVfdHJ5KT09MCkKLSAgICAgICAgICAgICAgICBvcHRfb3ZlcndyaXRlPTE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICBpZiAob3B0X292ZXJ3cml0ZT09MCkKLSAgICAgICAgICAgIGlmIChjaGVja19leGlzdF9maWxlKGZpbGVuYW1lX3RyeSkhPTApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciByZXA9MDsKLSAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBhbnN3ZXJbMTI4XTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldDsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJUaGUgZmlsZSAlcyBleGlzdHMuIE92ZXJ3cml0ZSA/IFt5XWVzLCBbbl1vLCBbYV1wcGVuZCA6ICIsZmlsZW5hbWVfdHJ5KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2NhbmYoIiUxcyIsYW5zd2VyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSAxKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXAgPSBhbnN3ZXJbMF0gOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHJlcD49J2EnKSAmJiAocmVwPD0neicpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVwIC09IDB4MjA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlICgocmVwIT0nWScpICYmIChyZXAhPSdOJykgJiYgKHJlcCE9J0EnKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcD09J04nKQotICAgICAgICAgICAgICAgICAgICB6aXBvayA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcD09J0EnKQotICAgICAgICAgICAgICAgICAgICBvcHRfb3ZlcndyaXRlID0gMjsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoemlwb2s9PTEpCi0gICAgewotICAgICAgICB6aXBGaWxlIHpmOwotICAgICAgICBpbnQgZXJyY2xvc2U7Ci0jICAgICAgICBpZmRlZiBVU0VXSU4zMklPQVBJCi0gICAgICAgIHpsaWJfZmlsZWZ1bmM2NF9kZWYgZmZ1bmM7Ci0gICAgICAgIGZpbGxfd2luMzJfZmlsZWZ1bmM2NEEoJmZmdW5jKTsKLSAgICAgICAgemYgPSB6aXBPcGVuMl82NChmaWxlbmFtZV90cnksKG9wdF9vdmVyd3JpdGU9PTIpID8gMiA6IDAsTlVMTCwmZmZ1bmMpOwotIyAgICAgICAgZWxzZQotICAgICAgICB6ZiA9IHppcE9wZW42NChmaWxlbmFtZV90cnksKG9wdF9vdmVyd3JpdGU9PTIpID8gMiA6IDApOwotIyAgICAgICAgZW5kaWYKLQotICAgICAgICBpZiAoemYgPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBvcGVuaW5nICVzXG4iLGZpbGVuYW1lX3RyeSk7Ci0gICAgICAgICAgICBlcnI9IFpJUF9FUlJOTzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcmludGYoImNyZWF0aW5nICVzXG4iLGZpbGVuYW1lX3RyeSk7Ci0KLSAgICAgICAgZm9yIChpPXppcGZpbGVuYW1lYXJnKzE7KGk8YXJnYykgJiYgKGVycj09WklQX09LKTtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghKCgoKCooYXJndltpXSkpPT0nLScpIHx8ICgoKihhcmd2W2ldKSk9PScvJykpICYmCi0gICAgICAgICAgICAgICAgICAoKGFyZ3ZbaV1bMV09PSdvJykgfHwgKGFyZ3ZbaV1bMV09PSdPJykgfHwKLSAgICAgICAgICAgICAgICAgICAoYXJndltpXVsxXT09J2EnKSB8fCAoYXJndltpXVsxXT09J0EnKSB8fAotICAgICAgICAgICAgICAgICAgIChhcmd2W2ldWzFdPT0ncCcpIHx8IChhcmd2W2ldWzFdPT0nUCcpIHx8Ci0gICAgICAgICAgICAgICAgICAgKChhcmd2W2ldWzFdPj0nMCcpIHx8IChhcmd2W2ldWzFdPD0nOScpKSkgJiYKLSAgICAgICAgICAgICAgICAgIChzdHJsZW4oYXJndltpXSkgPT0gMikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZJTEUgKiBmaW47Ci0gICAgICAgICAgICAgICAgaW50IHNpemVfcmVhZDsKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZWluemlwID0gYXJndltpXTsKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzYXZlZmlsZW5hbWVpbnppcDsKLSAgICAgICAgICAgICAgICB6aXBfZmlsZWluZm8gemk7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjcmNGaWxlPTA7Ci0gICAgICAgICAgICAgICAgaW50IHppcDY0ID0gMDsKLQotICAgICAgICAgICAgICAgIHppLnRtel9kYXRlLnRtX3NlYyA9IHppLnRtel9kYXRlLnRtX21pbiA9IHppLnRtel9kYXRlLnRtX2hvdXIgPQotICAgICAgICAgICAgICAgIHppLnRtel9kYXRlLnRtX21kYXkgPSB6aS50bXpfZGF0ZS50bV9tb24gPSB6aS50bXpfZGF0ZS50bV95ZWFyID0gMDsKLSAgICAgICAgICAgICAgICB6aS5kb3NEYXRlID0gMDsKLSAgICAgICAgICAgICAgICB6aS5pbnRlcm5hbF9mYSA9IDA7Ci0gICAgICAgICAgICAgICAgemkuZXh0ZXJuYWxfZmEgPSAwOwotICAgICAgICAgICAgICAgIGZpbGV0aW1lKGZpbGVuYW1laW56aXAsJnppLnRtel9kYXRlLCZ6aS5kb3NEYXRlKTsKLQotLyoKLSAgICAgICAgICAgICAgICBlcnIgPSB6aXBPcGVuTmV3RmlsZUluWmlwKHpmLGZpbGVuYW1laW56aXAsJnppLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwwLE5VTEwsMCxOVUxMIC8gKiBjb21tZW50ICogLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRfY29tcHJlc3NfbGV2ZWwgIT0gMCkgPyBaX0RFRkxBVEVEIDogMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9jb21wcmVzc19sZXZlbCk7Ci0qLwotICAgICAgICAgICAgICAgIGlmICgocGFzc3dvcmQgIT0gTlVMTCkgJiYgKGVycj09WklQX09LKSkKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gZ2V0RmlsZUNyYyhmaWxlbmFtZWluemlwLGJ1ZixzaXplX2J1ZiwmY3JjRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICB6aXA2NCA9IGlzTGFyZ2VGaWxlKGZpbGVuYW1laW56aXApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgcGF0aCBuYW1lIHNhdmVkLCBzaG91bGQgbm90IGluY2x1ZGUgYSBsZWFkaW5nIHNsYXNoLiAqLwotICAgICAgICAgICAgICAgLyppZiBpdCBkaWQsIHdpbmRvd3MveHAgYW5kIGR5bmF6aXAgY291bGRuJ3QgcmVhZCB0aGUgemlwIGZpbGUuICovCi0gICAgICAgICAgICAgICAgIHNhdmVmaWxlbmFtZWluemlwID0gZmlsZW5hbWVpbnppcDsKLSAgICAgICAgICAgICAgICAgd2hpbGUoIHNhdmVmaWxlbmFtZWluemlwWzBdID09ICdcXCcgfHwgc2F2ZWZpbGVuYW1laW56aXBbMF0gPT0gJy8nICkKLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgc2F2ZWZpbGVuYW1laW56aXArKzsKLSAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgIC8qc2hvdWxkIHRoZSB6aXAgZmlsZSBjb250YWluIGFueSBwYXRoIGF0IGFsbD8qLwotICAgICAgICAgICAgICAgICBpZiggb3B0X2V4Y2x1ZGVfcGF0aCApCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRtcHB0cjsKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhc3RzbGFzaCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICBmb3IoIHRtcHB0ciA9IHNhdmVmaWxlbmFtZWluemlwOyAqdG1wcHRyOyB0bXBwdHIrKykKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnRtcHB0ciA9PSAnXFwnIHx8ICp0bXBwdHIgPT0gJy8nKQotICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdHNsYXNoID0gdG1wcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGlmKCBsYXN0c2xhc2ggIT0gTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWZpbGVuYW1laW56aXAgPSBsYXN0c2xhc2grMTsgLy8gYmFzZSBmaWxlbmFtZSBmb2xsb3dzIGxhc3Qgc2xhc2guCi0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgZXJyID0gemlwT3Blbk5ld0ZpbGVJblppcDNfNjQoemYsc2F2ZWZpbGVuYW1laW56aXAsJnppLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwwLE5VTEwsMCxOVUxMIC8qIGNvbW1lbnQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRfY29tcHJlc3NfbGV2ZWwgIT0gMCkgPyBaX0RFRkxBVEVEIDogMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9jb21wcmVzc19sZXZlbCwwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLU1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZLCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLU1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQsY3JjRmlsZSwgemlwNjQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBaSVBfT0spCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gb3BlbmluZyAlcyBpbiB6aXBmaWxlXG4iLGZpbGVuYW1laW56aXApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbiA9IEZPUEVOX0ZVTkMoZmlsZW5hbWVpbnppcCwicmIiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbj09TlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gb3BlbmluZyAlcyBmb3IgcmVhZGluZ1xuIixmaWxlbmFtZWluemlwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gWklQX09LKQotICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBaSVBfT0s7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3JlYWQgPSAoaW50KWZyZWFkKGJ1ZiwxLHNpemVfYnVmLGZpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZV9yZWFkIDwgc2l6ZV9idWYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZlb2YoZmluKT09MCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIGluIHJlYWRpbmcgJXNcbiIsZmlsZW5hbWVpbnppcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZV9yZWFkPjApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gemlwV3JpdGVJbkZpbGVJblppcCAoemYsYnVmLHNpemVfcmVhZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycjwwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBpbiB3cml0aW5nICVzIGluIHRoZSB6aXBmaWxlXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1laW56aXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgoZXJyID09IFpJUF9PSykgJiYgKHNpemVfcmVhZD4wKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZmluKQotICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZmluKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnI8MCkKLSAgICAgICAgICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSB6aXBDbG9zZUZpbGVJblppcCh6Zik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIhPVpJUF9PSykKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gY2xvc2luZyAlcyBpbiB0aGUgemlwZmlsZVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1laW56aXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlcnJjbG9zZSA9IHppcENsb3NlKHpmLE5VTEwpOwotICAgICAgICBpZiAoZXJyY2xvc2UgIT0gWklQX09LKQotICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBpbiBjbG9zaW5nICVzXG4iLGZpbGVuYW1lX3RyeSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgZG9faGVscCgpOwotICAgIH0KLQotICAgIGZyZWUoYnVmKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9taW5pemlwLnBjLmluIGIvc3JjL3psaWIvY29udHJpYi9taW5pemlwL21pbml6aXAucGMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YjViN2YuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9taW5pemlwL21pbml6aXAucGMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wcmVmaXg9QHByZWZpeEAKLWV4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKLWxpYmRpcj1AbGliZGlyQAotaW5jbHVkZWRpcj1AaW5jbHVkZWRpckAvbWluaXppcAotCi1OYW1lOiBtaW5pemlwCi1EZXNjcmlwdGlvbjogTWluaXppcCB6aXAgZmlsZSBtYW5pcHVsYXRpb24gbGlicmFyeQotUmVxdWlyZXM6Ci1WZXJzaW9uOiBAUEFDS0FHRV9WRVJTSU9OQAotTGliczogLUwke2xpYmRpcn0gLWxtaW5pemlwCi1MaWJzLnByaXZhdGU6IC1segotQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9tenRvb2xzLmMgYi9zcmMvemxpYi9jb250cmliL21pbml6aXAvbXp0b29scy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Njg5MWMyLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9tenRvb2xzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoKLSAgQWRkaXRpb25hbCB0b29scyBmb3IgTWluaXppcAotICBDb2RlOiBYYXZpZXIgUm9jaGUgJzIwMDQKLSAgTGljZW5zZTogU2FtZSBhcyBaTElCICh3d3cuZ3ppcC5vcmcpCi0qLwotCi0vKiBDb2RlICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJ6bGliLmgiCi0jaW5jbHVkZSAidW56aXAuaCIKLQotI2RlZmluZSBSRUFEXzgoYWRyKSAgKCh1bnNpZ25lZCBjaGFyKSooYWRyKSkKLSNkZWZpbmUgUkVBRF8xNihhZHIpICggUkVBRF84KGFkcikgfCAoUkVBRF84KGFkcisxKSA8PCA4KSApCi0jZGVmaW5lIFJFQURfMzIoYWRyKSAoIFJFQURfMTYoYWRyKSB8IChSRUFEXzE2KChhZHIpKzIpIDw8IDE2KSApCi0KLSNkZWZpbmUgV1JJVEVfOChidWZmLCBuKSBkbyB7IFwKLSAgKigodW5zaWduZWQgY2hhciopKGJ1ZmYpKSA9ICh1bnNpZ25lZCBjaGFyKSAoKG4pICYgMHhmZik7IFwKLX0gd2hpbGUoMCkKLSNkZWZpbmUgV1JJVEVfMTYoYnVmZiwgbikgZG8geyBcCi0gIFdSSVRFXzgoKHVuc2lnbmVkIGNoYXIqKShidWZmKSwgbik7IFwKLSAgV1JJVEVfOCgoKHVuc2lnbmVkIGNoYXIqKShidWZmKSkgKyAxLCAobikgPj4gOCk7IFwKLX0gd2hpbGUoMCkKLSNkZWZpbmUgV1JJVEVfMzIoYnVmZiwgbikgZG8geyBcCi0gIFdSSVRFXzE2KCh1bnNpZ25lZCBjaGFyKikoYnVmZiksIChuKSAmIDB4ZmZmZik7IFwKLSAgV1JJVEVfMTYoKHVuc2lnbmVkIGNoYXIqKShidWZmKSArIDIsIChuKSA+PiAxNik7IFwKLX0gd2hpbGUoMCkKLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuelJlcGFpcihmaWxlLCBmaWxlT3V0LCBmaWxlT3V0VG1wLCBuUmVjb3ZlcmVkLCBieXRlc1JlY292ZXJlZCkKLWNvbnN0IGNoYXIqIGZpbGU7Ci1jb25zdCBjaGFyKiBmaWxlT3V0OwotY29uc3QgY2hhciogZmlsZU91dFRtcDsKLXVMb25nKiBuUmVjb3ZlcmVkOwotdUxvbmcqIGJ5dGVzUmVjb3ZlcmVkOwotewotICBpbnQgZXJyID0gWl9PSzsKLSAgRklMRSogZnBaaXAgPSBmb3BlbihmaWxlLCAicmIiKTsKLSAgRklMRSogZnBPdXQgPSBmb3BlbihmaWxlT3V0LCAid2IiKTsKLSAgRklMRSogZnBPdXRDRCA9IGZvcGVuKGZpbGVPdXRUbXAsICJ3YiIpOwotICBpZiAoZnBaaXAgIT0gTlVMTCAmJiAgZnBPdXQgIT0gTlVMTCkgewotICAgIGludCBlbnRyaWVzID0gMDsKLSAgICB1TG9uZyB0b3RhbEJ5dGVzID0gMDsKLSAgICBjaGFyIGhlYWRlclszMF07Ci0gICAgY2hhciBmaWxlbmFtZVsxMDI0XTsKLSAgICBjaGFyIGV4dHJhWzEwMjRdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIGludCBvZmZzZXRDRCA9IDA7Ci0gICAgd2hpbGUgKCBmcmVhZChoZWFkZXIsIDEsIDMwLCBmcFppcCkgPT0gMzAgKSB7Ci0gICAgICBpbnQgY3VycmVudE9mZnNldCA9IG9mZnNldDsKLQotICAgICAgLyogRmlsZSBlbnRyeSAqLwotICAgICAgaWYgKFJFQURfMzIoaGVhZGVyKSA9PSAweDA0MDM0YjUwKSB7Ci0gICAgICAgIHVuc2lnbmVkIGludCB2ZXJzaW9uID0gUkVBRF8xNihoZWFkZXIgKyA0KTsKLSAgICAgICAgdW5zaWduZWQgaW50IGdwZmxhZyA9IFJFQURfMTYoaGVhZGVyICsgNik7Ci0gICAgICAgIHVuc2lnbmVkIGludCBtZXRob2QgPSBSRUFEXzE2KGhlYWRlciArIDgpOwotICAgICAgICB1bnNpZ25lZCBpbnQgZmlsZXRpbWUgPSBSRUFEXzE2KGhlYWRlciArIDEwKTsKLSAgICAgICAgdW5zaWduZWQgaW50IGZpbGVkYXRlID0gUkVBRF8xNihoZWFkZXIgKyAxMik7Ci0gICAgICAgIHVuc2lnbmVkIGludCBjcmMgPSBSRUFEXzMyKGhlYWRlciArIDE0KTsgLyogY3JjICovCi0gICAgICAgIHVuc2lnbmVkIGludCBjcHNpemUgPSBSRUFEXzMyKGhlYWRlciArIDE4KTsgLyogY29tcHJlc3NlZCBzaXplICovCi0gICAgICAgIHVuc2lnbmVkIGludCB1bmNwc2l6ZSA9IFJFQURfMzIoaGVhZGVyICsgMjIpOyAvKiB1bmNvbXByZXNzZWQgc3ogKi8KLSAgICAgICAgdW5zaWduZWQgaW50IGZuc2l6ZSA9IFJFQURfMTYoaGVhZGVyICsgMjYpOyAvKiBmaWxlIG5hbWUgbGVuZ3RoICovCi0gICAgICAgIHVuc2lnbmVkIGludCBleHRzaXplID0gUkVBRF8xNihoZWFkZXIgKyAyOCk7IC8qIGV4dHJhIGZpZWxkIGxlbmd0aCAqLwotICAgICAgICBmaWxlbmFtZVswXSA9IGV4dHJhWzBdID0gJ1wwJzsKLQotICAgICAgICAvKiBIZWFkZXIgKi8KLSAgICAgICAgaWYgKGZ3cml0ZShoZWFkZXIsIDEsIDMwLCBmcE91dCkgPT0gMzApIHsKLSAgICAgICAgICBvZmZzZXQgKz0gMzA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZXJyID0gWl9FUlJOTzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbGVuYW1lICovCi0gICAgICAgIGlmIChmbnNpemUgPiAwKSB7Ci0gICAgICAgICAgaWYgKGZuc2l6ZSA8IHNpemVvZihmaWxlbmFtZSkpIHsKLSAgICAgICAgICAgIGlmIChmcmVhZChmaWxlbmFtZSwgMSwgZm5zaXplLCBmcFppcCkgPT0gZm5zaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZ3cml0ZShmaWxlbmFtZSwgMSwgZm5zaXplLCBmcE91dCkgPT0gZm5zaXplKSB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGZuc2l6ZTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBaX0VSUk5POwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBlcnIgPSBaX0VSUk5POwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBlcnIgPSBaX1NUUkVBTV9FUlJPUjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEV4dHJhIGZpZWxkICovCi0gICAgICAgIGlmIChleHRzaXplID4gMCkgewotICAgICAgICAgIGlmIChleHRzaXplIDwgc2l6ZW9mKGV4dHJhKSkgewotICAgICAgICAgICAgaWYgKGZyZWFkKGV4dHJhLCAxLCBleHRzaXplLCBmcFppcCkgPT0gZXh0c2l6ZSkgewotICAgICAgICAgICAgICBpZiAoZndyaXRlKGV4dHJhLCAxLCBleHRzaXplLCBmcE91dCkgPT0gZXh0c2l6ZSkgewotICAgICAgICAgICAgICAgIG9mZnNldCArPSBleHRzaXplOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVyciA9IFpfRVJSTk87Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBEYXRhICovCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgZGF0YVNpemUgPSBjcHNpemU7Ci0gICAgICAgICAgaWYgKGRhdGFTaXplID09IDApIHsKLSAgICAgICAgICAgIGRhdGFTaXplID0gdW5jcHNpemU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChkYXRhU2l6ZSA+IDApIHsKLSAgICAgICAgICAgIGNoYXIqIGRhdGEgPSBtYWxsb2MoZGF0YVNpemUpOwotICAgICAgICAgICAgaWYgKGRhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgICBpZiAoKGludClmcmVhZChkYXRhLCAxLCBkYXRhU2l6ZSwgZnBaaXApID09IGRhdGFTaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChpbnQpZndyaXRlKGRhdGEsIDEsIGRhdGFTaXplLCBmcE91dCkgPT0gZGF0YVNpemUpIHsKLSAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBkYXRhU2l6ZTsKLSAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gZGF0YVNpemU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIGVyciA9IFpfRVJSTk87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVyciA9IFpfRVJSTk87Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZnJlZShkYXRhKTsKLSAgICAgICAgICAgICAgaWYgKGVyciAhPSBaX09LKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGVyciA9IFpfTUVNX0VSUk9SOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDZW50cmFsIGRpcmVjdG9yeSBlbnRyeSAqLwotICAgICAgICB7Ci0gICAgICAgICAgY2hhciBoZWFkZXJbNDZdOwotICAgICAgICAgIGNoYXIqIGNvbW1lbnQgPSAiIjsKLSAgICAgICAgICBpbnQgY29tc2l6ZSA9IChpbnQpIHN0cmxlbihjb21tZW50KTsKLSAgICAgICAgICBXUklURV8zMihoZWFkZXIsIDB4MDIwMTRiNTApOwotICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDQsIHZlcnNpb24pOwotICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDYsIHZlcnNpb24pOwotICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDgsIGdwZmxhZyk7Ci0gICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMTAsIG1ldGhvZCk7Ci0gICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMTIsIGZpbGV0aW1lKTsKLSAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyAxNCwgZmlsZWRhdGUpOwotICAgICAgICAgIFdSSVRFXzMyKGhlYWRlciArIDE2LCBjcmMpOwotICAgICAgICAgIFdSSVRFXzMyKGhlYWRlciArIDIwLCBjcHNpemUpOwotICAgICAgICAgIFdSSVRFXzMyKGhlYWRlciArIDI0LCB1bmNwc2l6ZSk7Ci0gICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMjgsIGZuc2l6ZSk7Ci0gICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMzAsIGV4dHNpemUpOwotICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDMyLCBjb21zaXplKTsKLSAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyAzNCwgMCk7ICAgICAvKiBkaXNrICMgKi8KLSAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyAzNiwgMCk7ICAgICAvKiBpbnQgYXR0cmIgKi8KLSAgICAgICAgICBXUklURV8zMihoZWFkZXIgKyAzOCwgMCk7ICAgICAvKiBleHQgYXR0cmIgKi8KLSAgICAgICAgICBXUklURV8zMihoZWFkZXIgKyA0MiwgY3VycmVudE9mZnNldCk7Ci0gICAgICAgICAgLyogSGVhZGVyICovCi0gICAgICAgICAgaWYgKGZ3cml0ZShoZWFkZXIsIDEsIDQ2LCBmcE91dENEKSA9PSA0NikgewotICAgICAgICAgICAgb2Zmc2V0Q0QgKz0gNDY7Ci0KLSAgICAgICAgICAgIC8qIEZpbGVuYW1lICovCi0gICAgICAgICAgICBpZiAoZm5zaXplID4gMCkgewotICAgICAgICAgICAgICBpZiAoZndyaXRlKGZpbGVuYW1lLCAxLCBmbnNpemUsIGZwT3V0Q0QpID09IGZuc2l6ZSkgewotICAgICAgICAgICAgICAgIG9mZnNldENEICs9IGZuc2l6ZTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBaX0VSUk5POwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBlcnIgPSBaX1NUUkVBTV9FUlJPUjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEV4dHJhIGZpZWxkICovCi0gICAgICAgICAgICBpZiAoZXh0c2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgaWYgKGZ3cml0ZShleHRyYSwgMSwgZXh0c2l6ZSwgZnBPdXRDRCkgPT0gZXh0c2l6ZSkgewotICAgICAgICAgICAgICAgIG9mZnNldENEICs9IGV4dHNpemU7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBDb21tZW50IGZpZWxkICovCi0gICAgICAgICAgICBpZiAoY29tc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgaWYgKChpbnQpZndyaXRlKGNvbW1lbnQsIDEsIGNvbXNpemUsIGZwT3V0Q0QpID09IGNvbXNpemUpIHsKLSAgICAgICAgICAgICAgICBvZmZzZXRDRCArPSBjb21zaXplOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVyciA9IFpfRVJSTk87Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVyciA9IFpfRVJSTk87Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBTdWNjZXNzICovCi0gICAgICAgIGVudHJpZXMrKzsKLQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogRmluYWwgY2VudHJhbCBkaXJlY3RvcnkgICovCi0gICAgewotICAgICAgaW50IGVudHJpZXNaaXAgPSBlbnRyaWVzOwotICAgICAgY2hhciBoZWFkZXJbMjJdOwotICAgICAgY2hhciogY29tbWVudCA9ICIiOyAvLyAiWklQIEZpbGUgcmVjb3ZlcmVkIGJ5IHpsaWIvbWluaXppcC9tenRvb2xzIjsKLSAgICAgIGludCBjb21zaXplID0gKGludCkgc3RybGVuKGNvbW1lbnQpOwotICAgICAgaWYgKGVudHJpZXNaaXAgPiAweGZmZmYpIHsKLSAgICAgICAgZW50cmllc1ppcCA9IDB4ZmZmZjsKLSAgICAgIH0KLSAgICAgIFdSSVRFXzMyKGhlYWRlciwgMHgwNjA1NGI1MCk7Ci0gICAgICBXUklURV8xNihoZWFkZXIgKyA0LCAwKTsgICAgLyogZGlzayAjICovCi0gICAgICBXUklURV8xNihoZWFkZXIgKyA2LCAwKTsgICAgLyogZGlzayAjICovCi0gICAgICBXUklURV8xNihoZWFkZXIgKyA4LCBlbnRyaWVzWmlwKTsgICAvKiBoYWNrICovCi0gICAgICBXUklURV8xNihoZWFkZXIgKyAxMCwgZW50cmllc1ppcCk7ICAvKiBoYWNrICovCi0gICAgICBXUklURV8zMihoZWFkZXIgKyAxMiwgb2Zmc2V0Q0QpOyAgICAvKiBzaXplIG9mIENEICovCi0gICAgICBXUklURV8zMihoZWFkZXIgKyAxNiwgb2Zmc2V0KTsgICAgICAvKiBvZmZzZXQgdG8gQ0QgKi8KLSAgICAgIFdSSVRFXzE2KGhlYWRlciArIDIwLCBjb21zaXplKTsgICAgIC8qIGNvbW1lbnQgKi8KLQotICAgICAgLyogSGVhZGVyICovCi0gICAgICBpZiAoZndyaXRlKGhlYWRlciwgMSwgMjIsIGZwT3V0Q0QpID09IDIyKSB7Ci0KLSAgICAgICAgLyogQ29tbWVudCBmaWVsZCAqLwotICAgICAgICBpZiAoY29tc2l6ZSA+IDApIHsKLSAgICAgICAgICBpZiAoKGludClmd3JpdGUoY29tbWVudCwgMSwgY29tc2l6ZSwgZnBPdXRDRCkgIT0gY29tc2l6ZSkgewotICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gWl9FUlJOTzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBGaW5hbCBtZXJnZSAoZmlsZSArIGNlbnRyYWwgZGlyZWN0b3J5KSAqLwotICAgIGZjbG9zZShmcE91dENEKTsKLSAgICBpZiAoZXJyID09IFpfT0spIHsKLSAgICAgIGZwT3V0Q0QgPSBmb3BlbihmaWxlT3V0VG1wLCAicmIiKTsKLSAgICAgIGlmIChmcE91dENEICE9IE5VTEwpIHsKLSAgICAgICAgaW50IG5SZWFkOwotICAgICAgICBjaGFyIGJ1ZmZlcls4MTkyXTsKLSAgICAgICAgd2hpbGUgKCAoblJlYWQgPSAoaW50KWZyZWFkKGJ1ZmZlciwgMSwgc2l6ZW9mKGJ1ZmZlciksIGZwT3V0Q0QpKSA+IDApIHsKLSAgICAgICAgICBpZiAoKGludClmd3JpdGUoYnVmZmVyLCAxLCBuUmVhZCwgZnBPdXQpICE9IG5SZWFkKSB7Ci0gICAgICAgICAgICBlcnIgPSBaX0VSUk5POwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZjbG9zZShmcE91dENEKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDbG9zZSAqLwotICAgIGZjbG9zZShmcFppcCk7Ci0gICAgZmNsb3NlKGZwT3V0KTsKLQotICAgIC8qIFdpcGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAodm9pZClyZW1vdmUoZmlsZU91dFRtcCk7Ci0KLSAgICAvKiBOdW1iZXIgb2YgcmVjb3ZlcmVkIGVudHJpZXMgKi8KLSAgICBpZiAoZXJyID09IFpfT0spIHsKLSAgICAgIGlmIChuUmVjb3ZlcmVkICE9IE5VTEwpIHsKLSAgICAgICAgKm5SZWNvdmVyZWQgPSBlbnRyaWVzOwotICAgICAgfQotICAgICAgaWYgKGJ5dGVzUmVjb3ZlcmVkICE9IE5VTEwpIHsKLSAgICAgICAgKmJ5dGVzUmVjb3ZlcmVkID0gdG90YWxCeXRlczsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZXJyID0gWl9TVFJFQU1fRVJST1I7Ci0gIH0KLSAgcmV0dXJuIGVycjsKLX0KZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9tenRvb2xzLmggYi9zcmMvemxpYi9jb250cmliL21pbml6aXAvbXp0b29scy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDlhNDI2Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC9tenRvb2xzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICBBZGRpdGlvbmFsIHRvb2xzIGZvciBNaW5pemlwCi0gIENvZGU6IFhhdmllciBSb2NoZSAnMjAwNAotICBMaWNlbnNlOiBTYW1lIGFzIFpMSUIgKHd3dy5nemlwLm9yZykKLSovCi0KLSNpZm5kZWYgX3ppcF90b29sc19ICi0jZGVmaW5lIF96aXBfdG9vbHNfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZm5kZWYgX1pMSUJfSAotI2luY2x1ZGUgInpsaWIuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSAidW56aXAuaCIKLQotLyogUmVwYWlyIGEgWklQIGZpbGUgKG1pc3NpbmcgY2VudHJhbCBkaXJlY3RvcnkpCi0gICBmaWxlOiBmaWxlIHRvIHJlY292ZXIKLSAgIGZpbGVPdXQ6IG91dHB1dCBmaWxlIGFmdGVyIHJlY292ZXJ5Ci0gICBmaWxlT3V0VG1wOiB0ZW1wb3JhcnkgZmlsZSBuYW1lIHVzZWQgZm9yIHJlY292ZXJ5Ci0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuelJlcGFpcihjb25zdCBjaGFyKiBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlT3V0VG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyogblJlY292ZXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcqIGJ5dGVzUmVjb3ZlcmVkKTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9taW5pemlwL3VuemlwLmMgYi9zcmMvemxpYi9jb250cmliL21pbml6aXAvdW56aXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZmYWQ0Yi4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL21pbml6aXAvdW56aXAuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMjUgKzAsMCBAQAotLyogdW56aXAuYyAtLSBJTyBmb3IgdW5jb21wcmVzcyAuemlwIGZpbGVzIHVzaW5nIHpsaWIKLSAgIFZlcnNpb24gMS4xLCBGZWJydWFyeSAxNGgsIDIwMTAKLSAgIHBhcnQgb2YgdGhlIE1pbmlaaXAgcHJvamVjdCAtICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQotCi0gICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxMCBHaWxsZXMgVm9sbGFudCAobWluaXppcCkgKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCi0KLSAgICAgICAgIE1vZGlmaWNhdGlvbnMgb2YgVW56aXAgZm9yIFppcDY0Ci0gICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBFdmVuIFJvdWF1bHQKLQotICAgICAgICAgTW9kaWZpY2F0aW9ucyBmb3IgWmlwNjQgc3VwcG9ydCBvbiBib3RoIHppcCBhbmQgdW56aXAKLSAgICAgICAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1hdGhpYXMgU3ZlbnNzb24gKCBodHRwOi8vcmVzdWx0NDIuY29tICkKLQotICAgICAgICAgRm9yIG1vcmUgaW5mbyByZWFkIE1pbmlaaXBfaW5mby50eHQKLQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBEZWNyeXB0aW9uIGNvZGUgY29tZXMgZnJvbSBjcnlwdC5jIGJ5IEluZm8tWklQIGJ1dCBoYXMgYmVlbiBncmVhdGx5IHJlZHVjZWQgaW4gdGVybXMgb2YKLSAgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHNvZnR3YXJlLiBUaGUgZm9sbG93aW5nIGlzIGZyb20gdGhlIG9yaWdpbmFsIGNyeXB0LmMuCi0gIENvZGUgd292ZW4gaW4gYnkgVGVycnkgVGhvcnNlbiAxLzIwMDMuCi0KLSAgQ29weXJpZ2h0IChjKSAxOTkwLTIwMDAgSW5mby1aSVAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gIFNlZSB0aGUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRSwgdmVyc2lvbiAyMDAwLUFwci0wOSBvciBsYXRlcgotICAodGhlIGNvbnRlbnRzIG9mIHdoaWNoIGFyZSBhbHNvIGluY2x1ZGVkIGluIHppcC5oKSBmb3IgdGVybXMgb2YgdXNlLgotICBJZiwgZm9yIHNvbWUgcmVhc29uLCBhbGwgdGhlc2UgZmlsZXMgYXJlIG1pc3NpbmcsIHRoZSBJbmZvLVpJUCBsaWNlbnNlCi0gIGFsc28gbWF5IGJlIGZvdW5kIGF0OiAgZnRwOi8vZnRwLmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC9saWNlbnNlLmh0bWwKLQotICAgICAgICBjcnlwdC5jIChmdWxsIHZlcnNpb24pIGJ5IEluZm8tWklQLiAgICAgIExhc3QgcmV2aXNlZDogIFtzZWUgY3J5cHQuaF0KLQotICBUaGUgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIHBhcnRzIG9mIHRoaXMgc291cmNlIGNvZGUgKGFzIG9wcG9zZWQgdG8gdGhlCi0gIG5vbi1lY2hvaW5nIHBhc3N3b3JkIHBhcnRzKSB3ZXJlIG9yaWdpbmFsbHkgd3JpdHRlbiBpbiBFdXJvcGUuICBUaGUKLSAgd2hvbGUgc291cmNlIHBhY2thZ2UgY2FuIGJlIGZyZWVseSBkaXN0cmlidXRlZCwgaW5jbHVkaW5nIGZyb20gdGhlIFVTQS4KLSAgKFByaW9yIHRvIEphbnVhcnkgMjAwMCwgcmUtZXhwb3J0IGZyb20gdGhlIFVTIHdhcyBhIHZpb2xhdGlvbiBvZiBVUyBsYXcuKQotCi0gICAgICAgIFRoaXMgZW5jcnlwdGlvbiBjb2RlIGlzIGEgZGlyZWN0IHRyYW5zY3JpcHRpb24gb2YgdGhlIGFsZ29yaXRobSBmcm9tCi0gIFJvZ2VyIFNjaGxhZmx5LCBkZXNjcmliZWQgYnkgUGhpbCBLYXR6IGluIHRoZSBmaWxlIGFwcG5vdGUudHh0LiAgVGhpcwotICBmaWxlIChhcHBub3RlLnR4dCkgaXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGUgUEtaSVAgcHJvZ3JhbSAoZXZlbiBpbiB0aGUKLSAgdmVyc2lvbiB3aXRob3V0IGVuY3J5cHRpb24gY2FwYWJpbGl0aWVzKS4KLQotICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBDaGFuZ2VzIGluIHVuemlwLmMKLQotICAgICAgICAyMDA3LTIwMDggLSBFdmVuIFJvdWF1bHQgLSBBZGRpdGlvbiBvZiBjcGxfdW56R2V0Q3VycmVudEZpbGVaU3RyZWFtUG9zCi0gIDIwMDctMjAwOCAtIEV2ZW4gUm91YXVsdCAtIERlY29yYXRpb24gb2Ygc3ltYm9sIG5hbWVzIHVueiogLT4gY3BsX3VueioKLSAgMjAwNy0yMDA4IC0gRXZlbiBSb3VhdWx0IC0gUmVtb3ZlIG9sZCBDIHN0eWxlIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgMjAwNy0yMDA4IC0gRXZlbiBSb3VhdWx0IC0gQWRkIHVuemlwIHN1cHBvcnQgZm9yIFpJUDY0Ci0KLSAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggRXZlbiBSb3VhdWx0Ci0KLQotICAgICAgICBPY3QtMjAwOSAtIE1hdGhpYXMgU3ZlbnNzb24gLSBSZW1vdmVkIGNwbF8qIGZyb20gc3ltYm9sIG5hbWVzIChFdmVuIFJvdWF1bHQgYWRkZWQgdGhlbSBidXQgc2luY2UgdGhpcyBpcyBub3cgbW92ZWQgdG8gYSBuZXcgcHJvamVjdCAobWluaXppcDY0KSBJIHJlbmFtZWQgdGhlbSBhZ2FpbikuCi0gIE9jdC0yMDA5IC0gTWF0aGlhcyBTdmVuc3NvbiAtIEZpeGVkIHByb2JsZW0gaWYgdW5jb21wcmVzc2VkIHNpemUgd2FzID4gNEcgYW5kIGNvbXByZXNzZWQgc2l6ZSB3YXMgPDRHCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBvbmx5IHJlYWQgdGhlIGNvbXByZXNzZWQvdW5jb21wcmVzc2VkIHNpemUgZnJvbSB0aGUgWmlwNjQgZm9ybWF0IGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzaXplIGZyb20gbm9ybWFsIGhlYWRlciB3YXMgMHhGRkZGRkZGRgotICBPY3QtMjAwOSAtIE1hdGhpYXMgU3ZlbnNzb24gLSBBcHBsaWVkIHNvbWUgYnVnIGZpeGVzIGZyb20gcGFjaGVzIHJlY2l2ZWQgZnJvbSBHaWxsZXMgVm9sbGFudAotICAgICAgICBPY3QtMjAwOSAtIE1hdGhpYXMgU3ZlbnNzb24gLSBBcHBsaWVkIHN1cHBvcnQgdG8gdW56aXAgZmlsZXMgd2l0aCBjb21wcmVzc2lvbiBtYXRob2QgQlpJUDIgKGJ6aXAyIGxpYiBpcyByZXF1aXJlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0Y2ggY3JlYXRlZCBieSBEYW5pZWwgQm9yY2EKLQotICBKYW4tMjAxMCAtIGJhY2sgdG8gdW56aXAgYW5kIG1pbml6aXAgMS4wIG5hbWUgc2NoZW1lLCB3aXRoIGNvbXBhdGliaWxpdHkgbGF5ZXIKLQotICBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDEwIEdpbGxlcyBWb2xsYW50LCBFdmVuIFJvdWF1bHQsIE1hdGhpYXMgU3ZlbnNzb24KLQotKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmbmRlZiBOT1VOQ1JZUFQKLSAgICAgICAgI2RlZmluZSBOT1VOQ1JZUFQKLSNlbmRpZgotCi0jaW5jbHVkZSAiemxpYi5oIgotI2luY2x1ZGUgInVuemlwLmgiCi0KLSNpZmRlZiBTVERDCi0jICBpbmNsdWRlIDxzdGRkZWYuaD4KLSMgIGluY2x1ZGUgPHN0cmluZy5oPgotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBOT19FUlJOT19ICi0gICAgZXh0ZXJuIGludCBlcnJubzsKLSNlbHNlCi0jICAgaW5jbHVkZSA8ZXJybm8uaD4KLSNlbmRpZgotCi0KLSNpZm5kZWYgbG9jYWwKLSMgIGRlZmluZSBsb2NhbCBzdGF0aWMKLSNlbmRpZgotLyogY29tcGlsZSB3aXRoIC1EbG9jYWwgaWYgeW91ciBkZWJ1Z2dlciBjYW4ndCBmaW5kIHN0YXRpYyBzeW1ib2xzICovCi0KLQotI2lmbmRlZiBDQVNFU0VOU0lUSVZJVFlERUZBVUxUX05PCi0jICBpZiAhZGVmaW5lZCh1bml4KSAmJiAhZGVmaW5lZChDQVNFU0VOU0lUSVZJVFlERUZBVUxUX1lFUykKLSMgICAgZGVmaW5lIENBU0VTRU5TSVRJVklUWURFRkFVTFRfTk8KLSMgIGVuZGlmCi0jZW5kaWYKLQotCi0jaWZuZGVmIFVOWl9CVUZTSVpFCi0jZGVmaW5lIFVOWl9CVUZTSVpFICgxNjM4NCkKLSNlbmRpZgotCi0jaWZuZGVmIFVOWl9NQVhGSUxFTkFNRUlOWklQCi0jZGVmaW5lIFVOWl9NQVhGSUxFTkFNRUlOWklQICgyNTYpCi0jZW5kaWYKLQotI2lmbmRlZiBBTExPQwotIyBkZWZpbmUgQUxMT0Moc2l6ZSkgKG1hbGxvYyhzaXplKSkKLSNlbmRpZgotI2lmbmRlZiBUUllGUkVFCi0jIGRlZmluZSBUUllGUkVFKHApIHtpZiAocCkgZnJlZShwKTt9Ci0jZW5kaWYKLQotI2RlZmluZSBTSVpFQ0VOVFJBTERJUklURU0gKDB4MmUpCi0jZGVmaW5lIFNJWkVaSVBMT0NBTEhFQURFUiAoMHgxZSkKLQotCi1jb25zdCBjaGFyIHVuel9jb3B5cmlnaHRbXSA9Ci0gICAiIHVuemlwIDEuMDEgQ29weXJpZ2h0IDE5OTgtMjAwNCBHaWxsZXMgVm9sbGFudCAtIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwiOwotCi0vKiB1bnpfZmlsZV9pbmZvX2ludGVybnRhbCBjb250YWluIGludGVybmFsIGluZm8gYWJvdXQgYSBmaWxlIGluIHppcGZpbGUqLwotdHlwZWRlZiBzdHJ1Y3QgdW56X2ZpbGVfaW5mbzY0X2ludGVybmFsX3MKLXsKLSAgICBaUE9TNjRfVCBvZmZzZXRfY3VyZmlsZTsvKiByZWxhdGl2ZSBvZmZzZXQgb2YgbG9jYWwgaGVhZGVyIDggYnl0ZXMgKi8KLX0gdW56X2ZpbGVfaW5mbzY0X2ludGVybmFsOwotCi0KLS8qIGZpbGVfaW5femlwX3JlYWRfaW5mb19zIGNvbnRhaW4gaW50ZXJuYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlIGluIHppcGZpbGUsCi0gICAgd2hlbiByZWFkaW5nIGFuZCBkZWNvbXByZXNzIGl0ICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIGNoYXIgICpyZWFkX2J1ZmZlcjsgICAgICAgICAvKiBpbnRlcm5hbCBidWZmZXIgZm9yIGNvbXByZXNzZWQgZGF0YSAqLwotICAgIHpfc3RyZWFtIHN0cmVhbTsgICAgICAgICAgICAvKiB6TGliIHN0cmVhbSBzdHJ1Y3R1cmUgZm9yIGluZmxhdGUgKi8KLQotI2lmZGVmIEhBVkVfQlpJUDIKLSAgICBiel9zdHJlYW0gYnN0cmVhbTsgICAgICAgICAgLyogYnpMaWIgc3RyZWFtIHN0cnVjdHVyZSBmb3IgYnppcGVkICovCi0jZW5kaWYKLQotICAgIFpQT1M2NF9UIHBvc19pbl96aXBmaWxlOyAgICAgICAvKiBwb3NpdGlvbiBpbiBieXRlIG9uIHRoZSB6aXBmaWxlLCBmb3IgZnNlZWsqLwotICAgIHVMb25nIHN0cmVhbV9pbml0aWFsaXNlZDsgICAvKiBmbGFnIHNldCBpZiBzdHJlYW0gc3RydWN0dXJlIGlzIGluaXRpYWxpc2VkKi8KLQotICAgIFpQT1M2NF9UIG9mZnNldF9sb2NhbF9leHRyYWZpZWxkOy8qIG9mZnNldCBvZiB0aGUgbG9jYWwgZXh0cmEgZmllbGQgKi8KLSAgICB1SW50ICBzaXplX2xvY2FsX2V4dHJhZmllbGQ7Lyogc2l6ZSBvZiB0aGUgbG9jYWwgZXh0cmEgZmllbGQgKi8KLSAgICBaUE9TNjRfVCBwb3NfbG9jYWxfZXh0cmFmaWVsZDsgICAvKiBwb3NpdGlvbiBpbiB0aGUgbG9jYWwgZXh0cmEgZmllbGQgaW4gcmVhZCovCi0gICAgWlBPUzY0X1QgdG90YWxfb3V0XzY0OwotCi0gICAgdUxvbmcgY3JjMzI7ICAgICAgICAgICAgICAgIC8qIGNyYzMyIG9mIGFsbCBkYXRhIHVuY29tcHJlc3NlZCAqLwotICAgIHVMb25nIGNyYzMyX3dhaXQ7ICAgICAgICAgICAvKiBjcmMzMiB3ZSBtdXN0IG9idGFpbiBhZnRlciBkZWNvbXByZXNzIGFsbCAqLwotICAgIFpQT1M2NF9UIHJlc3RfcmVhZF9jb21wcmVzc2VkOyAvKiBudW1iZXIgb2YgYnl0ZSB0byBiZSBkZWNvbXByZXNzZWQgKi8KLSAgICBaUE9TNjRfVCByZXN0X3JlYWRfdW5jb21wcmVzc2VkOy8qbnVtYmVyIG9mIGJ5dGUgdG8gYmUgb2J0YWluZWQgYWZ0ZXIgZGVjb21wKi8KLSAgICB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmIHpfZmlsZWZ1bmM7Ci0gICAgdm9pZHBmIGZpbGVzdHJlYW07ICAgICAgICAvKiBpbyBzdHJ1Y3RvcmUgb2YgdGhlIHppcGZpbGUgKi8KLSAgICB1TG9uZyBjb21wcmVzc2lvbl9tZXRob2Q7ICAgLyogY29tcHJlc3Npb24gbWV0aG9kICgwPT1zdG9yZSkgKi8KLSAgICBaUE9TNjRfVCBieXRlX2JlZm9yZV90aGVfemlwZmlsZTsvKiBieXRlIGJlZm9yZSB0aGUgemlwZmlsZSwgKD4wIGZvciBzZngpKi8KLSAgICBpbnQgICByYXc7Ci19IGZpbGVfaW5femlwNjRfcmVhZF9pbmZvX3M7Ci0KLQotLyogdW56NjRfcyBjb250YWluIGludGVybmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB6aXBmaWxlCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmIHpfZmlsZWZ1bmM7Ci0gICAgaW50IGlzNjRiaXRPcGVuRnVuY3Rpb247Ci0gICAgdm9pZHBmIGZpbGVzdHJlYW07ICAgICAgICAvKiBpbyBzdHJ1Y3RvcmUgb2YgdGhlIHppcGZpbGUgKi8KLSAgICB1bnpfZ2xvYmFsX2luZm82NCBnaTsgICAgICAgLyogcHVibGljIGdsb2JhbCBpbmZvcm1hdGlvbiAqLwotICAgIFpQT1M2NF9UIGJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlOy8qIGJ5dGUgYmVmb3JlIHRoZSB6aXBmaWxlLCAoPjAgZm9yIHNmeCkqLwotICAgIFpQT1M2NF9UIG51bV9maWxlOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZSovCi0gICAgWlBPUzY0X1QgcG9zX2luX2NlbnRyYWxfZGlyOyAgIC8qIHBvcyBvZiB0aGUgY3VycmVudCBmaWxlIGluIHRoZSBjZW50cmFsIGRpciovCi0gICAgWlBPUzY0X1QgY3VycmVudF9maWxlX29rOyAgICAgIC8qIGZsYWcgYWJvdXQgdGhlIHVzYWJpbGl0eSBvZiB0aGUgY3VycmVudCBmaWxlKi8KLSAgICBaUE9TNjRfVCBjZW50cmFsX3BvczsgICAgICAgICAgLyogcG9zaXRpb24gb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2VudHJhbCBkaXIqLwotCi0gICAgWlBPUzY0X1Qgc2l6ZV9jZW50cmFsX2RpcjsgICAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICAqLwotICAgIFpQT1M2NF9UIG9mZnNldF9jZW50cmFsX2RpcjsgICAvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwZWN0IHRvIHRoZSBzdGFydGluZyBkaXNrIG51bWJlciAqLwotCi0gICAgdW56X2ZpbGVfaW5mbzY0IGN1cl9maWxlX2luZm87IC8qIHB1YmxpYyBpbmZvIGFib3V0IHRoZSBjdXJyZW50IGZpbGUgaW4gemlwKi8KLSAgICB1bnpfZmlsZV9pbmZvNjRfaW50ZXJuYWwgY3VyX2ZpbGVfaW5mb19pbnRlcm5hbDsgLyogcHJpdmF0ZSBpbmZvIGFib3V0IGl0Ki8KLSAgICBmaWxlX2luX3ppcDY0X3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZDsgLyogc3RydWN0dXJlIGFib3V0IHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBpZiB3ZSBhcmUgZGVjb21wcmVzc2luZyBpdCAqLwotICAgIGludCBlbmNyeXB0ZWQ7Ci0KLSAgICBpbnQgaXNaaXA2NDsKLQotIyAgICBpZm5kZWYgTk9VTkNSWVBUCi0gICAgdW5zaWduZWQgbG9uZyBrZXlzWzNdOyAgICAgLyoga2V5cyBkZWZpbmluZyB0aGUgcHNldWRvLXJhbmRvbSBzZXF1ZW5jZSAqLwotICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcqIHBjcmNfMzJfdGFiOwotIyAgICBlbmRpZgotfSB1bno2NF9zOwotCi0KLSNpZm5kZWYgTk9VTkNSWVBUCi0jaW5jbHVkZSAiY3J5cHQuaCIKLSNlbmRpZgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgUmVhZCBhIGJ5dGUgZnJvbSBhIGd6X3N0cmVhbTsgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luLiBSZXR1cm4gRU9GCi0gICBmb3IgZW5kIG9mIGZpbGUuCi0gICBJTiBhc3NlcnRpb246IHRoZSBzdHJlYW0gcyBoYXMgYmVlbiBzdWNlc3NmdWxseSBvcGVuZWQgZm9yIHJlYWRpbmcuCi0qLwotCi0KLWxvY2FsIGludCB1bno2NGxvY2FsX2dldEJ5dGUgT0YoKAotICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKLSAgICB2b2lkcGYgZmlsZXN0cmVhbSwKLSAgICBpbnQgKnBpKSk7Ci0KLWxvY2FsIGludCB1bno2NGxvY2FsX2dldEJ5dGUoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLCB2b2lkcGYgZmlsZXN0cmVhbSwgaW50ICpwaSkKLXsKLSAgICB1bnNpZ25lZCBjaGFyIGM7Ci0gICAgaW50IGVyciA9IChpbnQpWlJFQUQ2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmMsMSk7Ci0gICAgaWYgKGVycj09MSkKLSAgICB7Ci0gICAgICAgICpwaSA9IChpbnQpYzsKLSAgICAgICAgcmV0dXJuIFVOWl9PSzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKFpFUlJPUjY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSkpCi0gICAgICAgICAgICByZXR1cm4gVU5aX0VSUk5POwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gVU5aX0VPRjsKLSAgICB9Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBSZWFkcyBhIGxvbmcgaW4gTFNCIG9yZGVyIGZyb20gdGhlIGdpdmVuIGd6X3N0cmVhbS4gU2V0cwotKi8KLWxvY2FsIGludCB1bno2NGxvY2FsX2dldFNob3J0IE9GKCgKLSAgICBjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCi0gICAgdm9pZHBmIGZpbGVzdHJlYW0sCi0gICAgdUxvbmcgKnBYKSk7Ci0KLWxvY2FsIGludCB1bno2NGxvY2FsX2dldFNob3J0IChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwZiBmaWxlc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyAqcFgpCi17Ci0gICAgdUxvbmcgeCA7Ci0gICAgaW50IGkgPSAwOwotICAgIGludCBlcnI7Ci0KLSAgICBlcnIgPSB1bno2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICAgIHggPSAodUxvbmcpaTsKLQotICAgIGlmIChlcnI9PVVOWl9PSykKLSAgICAgICAgZXJyID0gdW56NjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKLSAgICB4IHw9ICgodUxvbmcpaSk8PDg7Ci0KLSAgICBpZiAoZXJyPT1VTlpfT0spCi0gICAgICAgICpwWCA9IHg7Ci0gICAgZWxzZQotICAgICAgICAqcFggPSAwOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLWxvY2FsIGludCB1bno2NGxvY2FsX2dldExvbmcgT0YoKAotICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKLSAgICB2b2lkcGYgZmlsZXN0cmVhbSwKLSAgICB1TG9uZyAqcFgpKTsKLQotbG9jYWwgaW50IHVuejY0bG9jYWxfZ2V0TG9uZyAoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwZiBmaWxlc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nICpwWCkKLXsKLSAgICB1TG9uZyB4IDsKLSAgICBpbnQgaSA9IDA7Ci0gICAgaW50IGVycjsKLQotICAgIGVyciA9IHVuejY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7Ci0gICAgeCA9ICh1TG9uZylpOwotCi0gICAgaWYgKGVycj09VU5aX09LKQotICAgICAgICBlcnIgPSB1bno2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICAgIHggfD0gKCh1TG9uZylpKTw8ODsKLQotICAgIGlmIChlcnI9PVVOWl9PSykKLSAgICAgICAgZXJyID0gdW56NjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKLSAgICB4IHw9ICgodUxvbmcpaSk8PDE2OwotCi0gICAgaWYgKGVycj09VU5aX09LKQotICAgICAgICBlcnIgPSB1bno2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICAgIHggKz0gKCh1TG9uZylpKTw8MjQ7Ci0KLSAgICBpZiAoZXJyPT1VTlpfT0spCi0gICAgICAgICpwWCA9IHg7Ci0gICAgZWxzZQotICAgICAgICAqcFggPSAwOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLWxvY2FsIGludCB1bno2NGxvY2FsX2dldExvbmc2NCBPRigoCi0gICAgY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLAotICAgIHZvaWRwZiBmaWxlc3RyZWFtLAotICAgIFpQT1M2NF9UICpwWCkpOwotCi0KLWxvY2FsIGludCB1bno2NGxvY2FsX2dldExvbmc2NCAoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwZiBmaWxlc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpQT1M2NF9UICpwWCkKLXsKLSAgICBaUE9TNjRfVCB4IDsKLSAgICBpbnQgaSA9IDA7Ci0gICAgaW50IGVycjsKLQotICAgIGVyciA9IHVuejY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7Ci0gICAgeCA9IChaUE9TNjRfVClpOwotCi0gICAgaWYgKGVycj09VU5aX09LKQotICAgICAgICBlcnIgPSB1bno2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICAgIHggfD0gKChaUE9TNjRfVClpKTw8ODsKLQotICAgIGlmIChlcnI9PVVOWl9PSykKLSAgICAgICAgZXJyID0gdW56NjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKLSAgICB4IHw9ICgoWlBPUzY0X1QpaSk8PDE2OwotCi0gICAgaWYgKGVycj09VU5aX09LKQotICAgICAgICBlcnIgPSB1bno2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICAgIHggfD0gKChaUE9TNjRfVClpKTw8MjQ7Ci0KLSAgICBpZiAoZXJyPT1VTlpfT0spCi0gICAgICAgIGVyciA9IHVuejY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7Ci0gICAgeCB8PSAoKFpQT1M2NF9UKWkpPDwzMjsKLQotICAgIGlmIChlcnI9PVVOWl9PSykKLSAgICAgICAgZXJyID0gdW56NjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKLSAgICB4IHw9ICgoWlBPUzY0X1QpaSk8PDQwOwotCi0gICAgaWYgKGVycj09VU5aX09LKQotICAgICAgICBlcnIgPSB1bno2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICAgIHggfD0gKChaUE9TNjRfVClpKTw8NDg7Ci0KLSAgICBpZiAoZXJyPT1VTlpfT0spCi0gICAgICAgIGVyciA9IHVuejY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7Ci0gICAgeCB8PSAoKFpQT1M2NF9UKWkpPDw1NjsKLQotICAgIGlmIChlcnI9PVVOWl9PSykKLSAgICAgICAgKnBYID0geDsKLSAgICBlbHNlCi0gICAgICAgICpwWCA9IDA7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyogTXkgb3duIHN0cmNtcGkgLyBzdHJjYXNlY21wICovCi1sb2NhbCBpbnQgc3RyY21wY2FzZW5vc2Vuc2l0aXZlX2ludGVybmFsIChjb25zdCBjaGFyKiBmaWxlTmFtZTEsIGNvbnN0IGNoYXIqIGZpbGVOYW1lMikKLXsKLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgICAgY2hhciBjMT0qKGZpbGVOYW1lMSsrKTsKLSAgICAgICAgY2hhciBjMj0qKGZpbGVOYW1lMisrKTsKLSAgICAgICAgaWYgKChjMT49J2EnKSAmJiAoYzE8PSd6JykpCi0gICAgICAgICAgICBjMSAtPSAweDIwOwotICAgICAgICBpZiAoKGMyPj0nYScpICYmIChjMjw9J3onKSkKLSAgICAgICAgICAgIGMyIC09IDB4MjA7Ci0gICAgICAgIGlmIChjMT09J1wwJykKLSAgICAgICAgICAgIHJldHVybiAoKGMyPT0nXDAnKSA/IDAgOiAtMSk7Ci0gICAgICAgIGlmIChjMj09J1wwJykKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICBpZiAoYzE8YzIpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGlmIChjMT5jMikKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgIH0KLX0KLQotCi0jaWZkZWYgIENBU0VTRU5TSVRJVklUWURFRkFVTFRfTk8KLSNkZWZpbmUgQ0FTRVNFTlNJVElWSVRZREVGQVVMVFZBTFVFIDIKLSNlbHNlCi0jZGVmaW5lIENBU0VTRU5TSVRJVklUWURFRkFVTFRWQUxVRSAxCi0jZW5kaWYKLQotI2lmbmRlZiBTVFJDTVBDQVNFTk9TRU5USVZFRlVOQ1RJT04KLSNkZWZpbmUgU1RSQ01QQ0FTRU5PU0VOVElWRUZVTkNUSU9OIHN0cmNtcGNhc2Vub3NlbnNpdGl2ZV9pbnRlcm5hbAotI2VuZGlmCi0KLS8qCi0gICBDb21wYXJlIHR3byBmaWxlbmFtZSAoZmlsZU5hbWUxLGZpbGVOYW1lMikuCi0gICBJZiBpQ2FzZVNlbmlzaXZpdHkgPSAxLCBjb21wYXJpc2lvbiBpcyBjYXNlIHNlbnNpdGl2aXR5IChsaWtlIHN0cmNtcCkKLSAgIElmIGlDYXNlU2VuaXNpdml0eSA9IDIsIGNvbXBhcmlzaW9uIGlzIG5vdCBjYXNlIHNlbnNpdGl2aXR5IChsaWtlIHN0cmNtcGkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBzdHJjYXNlY21wKQotICAgSWYgaUNhc2VTZW5pc2l2aXR5ID0gMCwgY2FzZSBzZW5zaXRpdml0eSBpcyBkZWZhdXQgb2YgeW91ciBvcGVyYXRpbmcgc3lzdGVtCi0gICAgICAgIChsaWtlIDEgb24gVW5peCwgMiBvbiBXaW5kb3dzKQotCi0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuelN0cmluZ0ZpbGVOYW1lQ29tcGFyZSAoY29uc3QgY2hhciogIGZpbGVOYW1lMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgZmlsZU5hbWUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpQ2FzZVNlbnNpdGl2aXR5KQotCi17Ci0gICAgaWYgKGlDYXNlU2Vuc2l0aXZpdHk9PTApCi0gICAgICAgIGlDYXNlU2Vuc2l0aXZpdHk9Q0FTRVNFTlNJVElWSVRZREVGQVVMVFZBTFVFOwotCi0gICAgaWYgKGlDYXNlU2Vuc2l0aXZpdHk9PTEpCi0gICAgICAgIHJldHVybiBzdHJjbXAoZmlsZU5hbWUxLGZpbGVOYW1lMik7Ci0KLSAgICByZXR1cm4gU1RSQ01QQ0FTRU5PU0VOVElWRUZVTkNUSU9OKGZpbGVOYW1lMSxmaWxlTmFtZTIpOwotfQotCi0jaWZuZGVmIEJVRlJFQURDT01NRU5UCi0jZGVmaW5lIEJVRlJFQURDT01NRU5UICgweDQwMCkKLSNlbmRpZgotCi0vKgotICBMb2NhdGUgdGhlIENlbnRyYWwgZGlyZWN0b3J5IG9mIGEgemlwZmlsZSAoYXQgdGhlIGVuZCwganVzdCBiZWZvcmUKLSAgICB0aGUgZ2xvYmFsIGNvbW1lbnQpCi0qLwotbG9jYWwgWlBPUzY0X1QgdW56NjRsb2NhbF9TZWFyY2hDZW50cmFsRGlyIE9GKChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsIHZvaWRwZiBmaWxlc3RyZWFtKSk7Ci1sb2NhbCBaUE9TNjRfVCB1bno2NGxvY2FsX1NlYXJjaENlbnRyYWxEaXIoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLCB2b2lkcGYgZmlsZXN0cmVhbSkKLXsKLSAgICB1bnNpZ25lZCBjaGFyKiBidWY7Ci0gICAgWlBPUzY0X1QgdVNpemVGaWxlOwotICAgIFpQT1M2NF9UIHVCYWNrUmVhZDsKLSAgICBaUE9TNjRfVCB1TWF4QmFjaz0weGZmZmY7IC8qIG1heGltdW0gc2l6ZSBvZiBnbG9iYWwgY29tbWVudCAqLwotICAgIFpQT1M2NF9UIHVQb3NGb3VuZD0wOwotCi0gICAgaWYgKFpTRUVLNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLDAsWkxJQl9GSUxFRlVOQ19TRUVLX0VORCkgIT0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLQotICAgIHVTaXplRmlsZSA9IFpURUxMNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKTsKLQotICAgIGlmICh1TWF4QmFjaz51U2l6ZUZpbGUpCi0gICAgICAgIHVNYXhCYWNrID0gdVNpemVGaWxlOwotCi0gICAgYnVmID0gKHVuc2lnbmVkIGNoYXIqKUFMTE9DKEJVRlJFQURDT01NRU5UKzQpOwotICAgIGlmIChidWY9PU5VTEwpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgdUJhY2tSZWFkID0gNDsKLSAgICB3aGlsZSAodUJhY2tSZWFkPHVNYXhCYWNrKQotICAgIHsKLSAgICAgICAgdUxvbmcgdVJlYWRTaXplOwotICAgICAgICBaUE9TNjRfVCB1UmVhZFBvcyA7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpZiAodUJhY2tSZWFkK0JVRlJFQURDT01NRU5UPnVNYXhCYWNrKQotICAgICAgICAgICAgdUJhY2tSZWFkID0gdU1heEJhY2s7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHVCYWNrUmVhZCs9QlVGUkVBRENPTU1FTlQ7Ci0gICAgICAgIHVSZWFkUG9zID0gdVNpemVGaWxlLXVCYWNrUmVhZCA7Ci0KLSAgICAgICAgdVJlYWRTaXplID0gKChCVUZSRUFEQ09NTUVOVCs0KSA8ICh1U2l6ZUZpbGUtdVJlYWRQb3MpKSA/Ci0gICAgICAgICAgICAgICAgICAgICAoQlVGUkVBRENPTU1FTlQrNCkgOiAodUxvbmcpKHVTaXplRmlsZS11UmVhZFBvcyk7Ci0gICAgICAgIGlmIChaU0VFSzY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSx1UmVhZFBvcyxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmIChaUkVBRDY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSxidWYsdVJlYWRTaXplKSE9dVJlYWRTaXplKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZm9yIChpPShpbnQpdVJlYWRTaXplLTM7IChpLS0pPjA7KQotICAgICAgICAgICAgaWYgKCgoKihidWYraSkpPT0weDUwKSAmJiAoKCooYnVmK2krMSkpPT0weDRiKSAmJgotICAgICAgICAgICAgICAgICgoKihidWYraSsyKSk9PTB4MDUpICYmICgoKihidWYraSszKSk9PTB4MDYpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVQb3NGb3VuZCA9IHVSZWFkUG9zK2k7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHVQb3NGb3VuZCE9MCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBUUllGUkVFKGJ1Zik7Ci0gICAgcmV0dXJuIHVQb3NGb3VuZDsKLX0KLQotCi0vKgotICBMb2NhdGUgdGhlIENlbnRyYWwgZGlyZWN0b3J5IDY0IG9mIGEgemlwZmlsZSAoYXQgdGhlIGVuZCwganVzdCBiZWZvcmUKLSAgICB0aGUgZ2xvYmFsIGNvbW1lbnQpCi0qLwotbG9jYWwgWlBPUzY0X1QgdW56NjRsb2NhbF9TZWFyY2hDZW50cmFsRGlyNjQgT0YoKAotICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKLSAgICB2b2lkcGYgZmlsZXN0cmVhbSkpOwotCi1sb2NhbCBaUE9TNjRfVCB1bno2NGxvY2FsX1NlYXJjaENlbnRyYWxEaXI2NChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwZiBmaWxlc3RyZWFtKQotewotICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZjsKLSAgICBaUE9TNjRfVCB1U2l6ZUZpbGU7Ci0gICAgWlBPUzY0X1QgdUJhY2tSZWFkOwotICAgIFpQT1M2NF9UIHVNYXhCYWNrPTB4ZmZmZjsgLyogbWF4aW11bSBzaXplIG9mIGdsb2JhbCBjb21tZW50ICovCi0gICAgWlBPUzY0X1QgdVBvc0ZvdW5kPTA7Ci0gICAgdUxvbmcgdUw7Ci0gICAgICAgICAgICAgICAgWlBPUzY0X1QgcmVsYXRpdmVPZmZzZXQ7Ci0KLSAgICBpZiAoWlNFRUs2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sMCxaTElCX0ZJTEVGVU5DX1NFRUtfRU5EKSAhPSAwKQotICAgICAgICByZXR1cm4gMDsKLQotCi0gICAgdVNpemVGaWxlID0gWlRFTEw2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0pOwotCi0gICAgaWYgKHVNYXhCYWNrPnVTaXplRmlsZSkKLSAgICAgICAgdU1heEJhY2sgPSB1U2l6ZUZpbGU7Ci0KLSAgICBidWYgPSAodW5zaWduZWQgY2hhciopQUxMT0MoQlVGUkVBRENPTU1FTlQrNCk7Ci0gICAgaWYgKGJ1Zj09TlVMTCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICB1QmFja1JlYWQgPSA0OwotICAgIHdoaWxlICh1QmFja1JlYWQ8dU1heEJhY2spCi0gICAgewotICAgICAgICB1TG9uZyB1UmVhZFNpemU7Ci0gICAgICAgIFpQT1M2NF9UIHVSZWFkUG9zOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgaWYgKHVCYWNrUmVhZCtCVUZSRUFEQ09NTUVOVD51TWF4QmFjaykKLSAgICAgICAgICAgIHVCYWNrUmVhZCA9IHVNYXhCYWNrOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1QmFja1JlYWQrPUJVRlJFQURDT01NRU5UOwotICAgICAgICB1UmVhZFBvcyA9IHVTaXplRmlsZS11QmFja1JlYWQgOwotCi0gICAgICAgIHVSZWFkU2l6ZSA9ICgoQlVGUkVBRENPTU1FTlQrNCkgPCAodVNpemVGaWxlLXVSZWFkUG9zKSkgPwotICAgICAgICAgICAgICAgICAgICAgKEJVRlJFQURDT01NRU5UKzQpIDogKHVMb25nKSh1U2l6ZUZpbGUtdVJlYWRQb3MpOwotICAgICAgICBpZiAoWlNFRUs2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sdVJlYWRQb3MsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoWlJFQUQ2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sYnVmLHVSZWFkU2l6ZSkhPXVSZWFkU2l6ZSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGZvciAoaT0oaW50KXVSZWFkU2l6ZS0zOyAoaS0tKT4wOykKLSAgICAgICAgICAgIGlmICgoKCooYnVmK2kpKT09MHg1MCkgJiYgKCgqKGJ1ZitpKzEpKT09MHg0YikgJiYKLSAgICAgICAgICAgICAgICAoKCooYnVmK2krMikpPT0weDA2KSAmJiAoKCooYnVmK2krMykpPT0weDA3KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1UG9zRm91bmQgPSB1UmVhZFBvcytpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgIGlmICh1UG9zRm91bmQhPTApCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgVFJZRlJFRShidWYpOwotICAgIGlmICh1UG9zRm91bmQgPT0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBaaXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciAqLwotICAgIGlmIChaU0VFSzY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwgdVBvc0ZvdW5kLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIHRoZSBzaWduYXR1cmUsIGFscmVhZHkgY2hlY2tlZCAqLwotICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJnVMKSE9VU5aX09LKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgemlwNjQgZW5kIG9mICBjZW50cmFsIGRpcmVjdG9yeSAqLwotICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJnVMKSE9VU5aX09LKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAodUwgIT0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiByZWxhdGl2ZSBvZmZzZXQgb2YgdGhlIHppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgKi8KLSAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nNjQocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJnJlbGF0aXZlT2Zmc2V0KSE9VU5aX09LKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIHRvdGFsIG51bWJlciBvZiBkaXNrcyAqLwotICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJnVMKSE9VU5aX09LKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAodUwgIT0gMSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBHb3RvIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgKi8KLSAgICBpZiAoWlNFRUs2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sIHJlbGF0aXZlT2Zmc2V0LFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQotICAgICAgICByZXR1cm4gMDsKLQotICAgICAvKiB0aGUgc2lnbmF0dXJlICovCi0gICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZyhwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmdUwpIT1VTlpfT0spCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKHVMICE9IDB4MDYwNjRiNTApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIHJlbGF0aXZlT2Zmc2V0OwotfQotCi0vKgotICBPcGVuIGEgWmlwIGZpbGUuIHBhdGggY29udGFpbiB0aGUgZnVsbCBwYXRobmFtZSAoYnkgZXhhbXBsZSwKLSAgICAgb24gYSBXaW5kb3dzIE5UIGNvbXB1dGVyICJjOlxcdGVzdFxcemxpYjExNC56aXAiIG9yIG9uIGFuIFVuaXggY29tcHV0ZXIKLSAgICAgInpsaWIvemxpYjExNC56aXAiLgotICAgICBJZiB0aGUgemlwZmlsZSBjYW5ub3QgYmUgb3BlbmVkIChmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgaW4gbm90IHZhbGlkKSwgdGhlCi0gICAgICAgcmV0dXJuIHZhbHVlIGlzIE5VTEwuCi0gICAgIEVsc2UsIHRoZSByZXR1cm4gdmFsdWUgaXMgYSB1bnpGaWxlIEhhbmRsZSwgdXNhYmxlIHdpdGggb3RoZXIgZnVuY3Rpb24KLSAgICAgICBvZiB0aGlzIHVuemlwIHBhY2thZ2UuCi0qLwotbG9jYWwgdW56RmlsZSB1bnpPcGVuSW50ZXJuYWwgKGNvbnN0IHZvaWQgKnBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzNjRiaXRPcGVuRnVuY3Rpb24pCi17Ci0gICAgdW56NjRfcyB1czsKLSAgICB1bno2NF9zICpzOwotICAgIFpQT1M2NF9UIGNlbnRyYWxfcG9zOwotICAgIHVMb25nICAgdUw7Ci0KLSAgICB1TG9uZyBudW1iZXJfZGlzazsgICAgICAgICAgLyogbnVtYmVyIG9mIHRoZSBjdXJyZW50IGRpc3QsIHVzZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5pbmcgWklQLCB1bnN1cHBvcnRlZCwgYWx3YXlzIDAqLwotICAgIHVMb25nIG51bWJlcl9kaXNrX3dpdGhfQ0Q7ICAvKiBudW1iZXIgdGhlIHRoZSBkaXNrIHdpdGggY2VudHJhbCBkaXIsIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNwYW5pbmcgWklQLCB1bnN1cHBvcnRlZCwgYWx3YXlzIDAqLwotICAgIFpQT1M2NF9UIG51bWJlcl9lbnRyeV9DRDsgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2VudHJhbCBkaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNhbWUgdGhhbiBudW1iZXJfZW50cnkgb24gbm9zcGFuKSAqLwotCi0gICAgaW50IGVycj1VTlpfT0s7Ci0KLSAgICBpZiAodW56X2NvcHlyaWdodFswXSE9JyAnKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHVzLnpfZmlsZWZ1bmMuenNlZWszMl9maWxlID0gTlVMTDsKLSAgICB1cy56X2ZpbGVmdW5jLnp0ZWxsMzJfZmlsZSA9IE5VTEw7Ci0gICAgaWYgKHB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmPT1OVUxMKQotICAgICAgICBmaWxsX2ZvcGVuNjRfZmlsZWZ1bmMoJnVzLnpfZmlsZWZ1bmMuemZpbGVfZnVuYzY0KTsKLSAgICBlbHNlCi0gICAgICAgIHVzLnpfZmlsZWZ1bmMgPSAqcHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWY7Ci0gICAgdXMuaXM2NGJpdE9wZW5GdW5jdGlvbiA9IGlzNjRiaXRPcGVuRnVuY3Rpb247Ci0KLQotCi0gICAgdXMuZmlsZXN0cmVhbSA9IFpPUEVONjQodXMuel9maWxlZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpMSUJfRklMRUZVTkNfTU9ERV9SRUFEIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTElCX0ZJTEVGVU5DX01PREVfRVhJU1RJTkcpOwotICAgIGlmICh1cy5maWxlc3RyZWFtPT1OVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGNlbnRyYWxfcG9zID0gdW56NjRsb2NhbF9TZWFyY2hDZW50cmFsRGlyNjQoJnVzLnpfZmlsZWZ1bmMsdXMuZmlsZXN0cmVhbSk7Ci0gICAgaWYgKGNlbnRyYWxfcG9zKQotICAgIHsKLSAgICAgICAgdUxvbmcgdVM7Ci0gICAgICAgIFpQT1M2NF9UIHVMNjQ7Ci0KLSAgICAgICAgdXMuaXNaaXA2NCA9IDE7Ci0KLSAgICAgICAgaWYgKFpTRUVLNjQodXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudHJhbF9wb3MsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICAgICAgLyogdGhlIHNpZ25hdHVyZSwgYWxyZWFkeSBjaGVja2VkICovCi0gICAgICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVMKSE9VU5aX09LKQotICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgICAgICAvKiBzaXplIG9mIHppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgKi8KLSAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZzY0KCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1TDY0KSE9VU5aX09LKQotICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgICAgICAvKiB2ZXJzaW9uIG1hZGUgYnkgKi8KLSAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVTKSE9VU5aX09LKQotICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgICAgICAvKiB2ZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0ICovCi0gICAgICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1UykhPVVOWl9PSykKLSAgICAgICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICAgICAgLyogbnVtYmVyIG9mIHRoaXMgZGlzayAqLwotICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZudW1iZXJfZGlzaykhPVVOWl9PSykKLSAgICAgICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICAgICAgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLwotICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZudW1iZXJfZGlza193aXRoX0NEKSE9VU5aX09LKQotICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXJlY3Rvcnkgb24gdGhpcyBkaXNrICovCi0gICAgICAgIGlmICh1bno2NGxvY2FsX2dldExvbmc2NCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdXMuZ2kubnVtYmVyX2VudHJ5KSE9VU5aX09LKQotICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KLSAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZzY0KCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZudW1iZXJfZW50cnlfQ0QpIT1VTlpfT0spCi0gICAgICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgICAgIGlmICgobnVtYmVyX2VudHJ5X0NEIT11cy5naS5udW1iZXJfZW50cnkpIHx8Ci0gICAgICAgICAgICAobnVtYmVyX2Rpc2tfd2l0aF9DRCE9MCkgfHwKLSAgICAgICAgICAgIChudW1iZXJfZGlzayE9MCkpCi0gICAgICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7Ci0KLSAgICAgICAgLyogc2l6ZSBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KLSAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZzY0KCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1cy5zaXplX2NlbnRyYWxfZGlyKSE9VU5aX09LKQotICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgICAgICAvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHRoZQotICAgICAgICAgIHN0YXJ0aW5nIGRpc2sgbnVtYmVyICovCi0gICAgICAgIGlmICh1bno2NGxvY2FsX2dldExvbmc2NCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdXMub2Zmc2V0X2NlbnRyYWxfZGlyKSE9VU5aX09LKQotICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgICAgICB1cy5naS5zaXplX2NvbW1lbnQgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBjZW50cmFsX3BvcyA9IHVuejY0bG9jYWxfU2VhcmNoQ2VudHJhbERpcigmdXMuel9maWxlZnVuYyx1cy5maWxlc3RyZWFtKTsKLSAgICAgICAgaWYgKGNlbnRyYWxfcG9zPT0wKQotICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgICAgICB1cy5pc1ppcDY0ID0gMDsKLQotICAgICAgICBpZiAoWlNFRUs2NCh1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRyYWxfcG9zLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQotICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgICAgICAvKiB0aGUgc2lnbmF0dXJlLCBhbHJlYWR5IGNoZWNrZWQgKi8KLSAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZygmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdUwpIT1VTlpfT0spCi0gICAgICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgICAgIC8qIG51bWJlciBvZiB0aGlzIGRpc2sgKi8KLSAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJm51bWJlcl9kaXNrKSE9VU5aX09LKQotICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgICAgICAvKiBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCi0gICAgICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZudW1iZXJfZGlza193aXRoX0NEKSE9VU5aX09LKQotICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgb24gdGhpcyBkaXNrICovCi0gICAgICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1TCkhPVVOWl9PSykKLSAgICAgICAgICAgIGVycj1VTlpfRVJSTk87Ci0gICAgICAgIHVzLmdpLm51bWJlcl9lbnRyeSA9IHVMOwotCi0gICAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpciAqLwotICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdUwpIT1VTlpfT0spCi0gICAgICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgICAgICBudW1iZXJfZW50cnlfQ0QgPSB1TDsKLQotICAgICAgICBpZiAoKG51bWJlcl9lbnRyeV9DRCE9dXMuZ2kubnVtYmVyX2VudHJ5KSB8fAotICAgICAgICAgICAgKG51bWJlcl9kaXNrX3dpdGhfQ0QhPTApIHx8Ci0gICAgICAgICAgICAobnVtYmVyX2Rpc2shPTApKQotICAgICAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOwotCi0gICAgICAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCi0gICAgICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVMKSE9VU5aX09LKQotICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICAgICAgdXMuc2l6ZV9jZW50cmFsX2RpciA9IHVMOwotCi0gICAgICAgIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gdGhlCi0gICAgICAgICAgICBzdGFydGluZyBkaXNrIG51bWJlciAqLwotICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1TCkhPVVOWl9PSykKLSAgICAgICAgICAgIGVycj1VTlpfRVJSTk87Ci0gICAgICAgIHVzLm9mZnNldF9jZW50cmFsX2RpciA9IHVMOwotCi0gICAgICAgIC8qIHppcGZpbGUgY29tbWVudCBsZW5ndGggKi8KLSAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVzLmdpLnNpemVfY29tbWVudCkhPVVOWl9PSykKLSAgICAgICAgICAgIGVycj1VTlpfRVJSTk87Ci0gICAgfQotCi0gICAgaWYgKChjZW50cmFsX3Bvczx1cy5vZmZzZXRfY2VudHJhbF9kaXIrdXMuc2l6ZV9jZW50cmFsX2RpcikgJiYKLSAgICAgICAgKGVycj09VU5aX09LKSkKLSAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOwotCi0gICAgaWYgKGVyciE9VU5aX09LKQotICAgIHsKLSAgICAgICAgWkNMT1NFNjQodXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHVzLmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlID0gY2VudHJhbF9wb3MgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1cy5vZmZzZXRfY2VudHJhbF9kaXIrdXMuc2l6ZV9jZW50cmFsX2Rpcik7Ci0gICAgdXMuY2VudHJhbF9wb3MgPSBjZW50cmFsX3BvczsKLSAgICB1cy5wZmlsZV9pbl96aXBfcmVhZCA9IE5VTEw7Ci0gICAgdXMuZW5jcnlwdGVkID0gMDsKLQotCi0gICAgcz0odW56NjRfcyopQUxMT0Moc2l6ZW9mKHVuejY0X3MpKTsKLSAgICBpZiggcyAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgKnM9dXM7Ci0gICAgICAgIHVuekdvVG9GaXJzdEZpbGUoKHVuekZpbGUpcyk7Ci0gICAgfQotICAgIHJldHVybiAodW56RmlsZSlzOwotfQotCi0KLWV4dGVybiB1bnpGaWxlIFpFWFBPUlQgdW56T3BlbjIgKGNvbnN0IGNoYXIgKnBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jMzJfZGVmKQotewotICAgIGlmIChwemxpYl9maWxlZnVuYzMyX2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgemxpYl9maWxlZnVuYzY0XzMyX2RlZiB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2ZpbGw7Ci0gICAgICAgIGZpbGxfemxpYl9maWxlZnVuYzY0XzMyX2RlZl9mcm9tX2ZpbGVmdW5jMzIoJnpsaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZmlsbCxwemxpYl9maWxlZnVuYzMyX2RlZik7Ci0gICAgICAgIHJldHVybiB1bnpPcGVuSW50ZXJuYWwocGF0aCwgJnpsaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZmlsbCwgMCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIHVuek9wZW5JbnRlcm5hbChwYXRoLCBOVUxMLCAwKTsKLX0KLQotZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuMl82NCAoY29uc3Qgdm9pZCAqcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bGliX2ZpbGVmdW5jNjRfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpCi17Ci0gICAgaWYgKHB6bGliX2ZpbGVmdW5jX2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgemxpYl9maWxlZnVuYzY0XzMyX2RlZiB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2ZpbGw7Ci0gICAgICAgIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZmlsbC56ZmlsZV9mdW5jNjQgPSAqcHpsaWJfZmlsZWZ1bmNfZGVmOwotICAgICAgICB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2ZpbGwuenRlbGwzMl9maWxlID0gTlVMTDsKLSAgICAgICAgemxpYl9maWxlZnVuYzY0XzMyX2RlZl9maWxsLnpzZWVrMzJfZmlsZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiB1bnpPcGVuSW50ZXJuYWwocGF0aCwgJnpsaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZmlsbCwgMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIHVuek9wZW5JbnRlcm5hbChwYXRoLCBOVUxMLCAxKTsKLX0KLQotZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuIChjb25zdCBjaGFyICpwYXRoKQotewotICAgIHJldHVybiB1bnpPcGVuSW50ZXJuYWwocGF0aCwgTlVMTCwgMCk7Ci19Ci0KLWV4dGVybiB1bnpGaWxlIFpFWFBPUlQgdW56T3BlbjY0IChjb25zdCB2b2lkICpwYXRoKQotewotICAgIHJldHVybiB1bnpPcGVuSW50ZXJuYWwocGF0aCwgTlVMTCwgMSk7Ci19Ci0KLS8qCi0gIENsb3NlIGEgWmlwRmlsZSBvcGVuZWQgd2l0aCB1bnppcE9wZW4uCi0gIElmIHRoZXJlIGlzIGZpbGVzIGluc2lkZSB0aGUgLlppcCBvcGVuZWQgd2l0aCB1bnppcE9wZW5DdXJyZW50RmlsZSAoc2VlIGxhdGVyKSwKLSAgICB0aGVzZSBmaWxlcyBNVVNUIGJlIGNsb3NlZCB3aXRoIHVuemlwQ2xvc2VDdXJyZW50RmlsZSBiZWZvcmUgY2FsbCB1bnppcENsb3NlLgotICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0uICovCi1leHRlcm4gaW50IFpFWFBPUlQgdW56Q2xvc2UgKHVuekZpbGUgZmlsZSkKLXsKLSAgICB1bno2NF9zKiBzOwotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0gICAgcz0odW56NjRfcyopZmlsZTsKLQotICAgIGlmIChzLT5wZmlsZV9pbl96aXBfcmVhZCE9TlVMTCkKLSAgICAgICAgdW56Q2xvc2VDdXJyZW50RmlsZShmaWxlKTsKLQotICAgIFpDTE9TRTY0KHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0pOwotICAgIFRSWUZSRUUocyk7Ci0gICAgcmV0dXJuIFVOWl9PSzsKLX0KLQotCi0vKgotICBXcml0ZSBpbmZvIGFib3V0IHRoZSBaaXBGaWxlIGluIHRoZSAqcGdsb2JhbF9pbmZvIHN0cnVjdHVyZS4KLSAgTm8gcHJlcGFyYXRpb24gb2YgdGhlIHN0cnVjdHVyZSBpcyBuZWVkZWQKLSAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtLiAqLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEdsb2JhbEluZm82NCAodW56RmlsZSBmaWxlLCB1bnpfZ2xvYmFsX2luZm82NCogcGdsb2JhbF9pbmZvKQotewotICAgIHVuejY0X3MqIHM7Ci0gICAgaWYgKGZpbGU9PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLSAgICBzPSh1bno2NF9zKilmaWxlOwotICAgICpwZ2xvYmFsX2luZm89cy0+Z2k7Ci0gICAgcmV0dXJuIFVOWl9PSzsKLX0KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEdsb2JhbEluZm8gKHVuekZpbGUgZmlsZSwgdW56X2dsb2JhbF9pbmZvKiBwZ2xvYmFsX2luZm8zMikKLXsKLSAgICB1bno2NF9zKiBzOwotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0gICAgcz0odW56NjRfcyopZmlsZTsKLSAgICAvKiB0byBkbyA6IGNoZWNrIGlmIG51bWJlcl9lbnRyeSBpcyBub3QgdHJ1bmNhdGVkICovCi0gICAgcGdsb2JhbF9pbmZvMzItPm51bWJlcl9lbnRyeSA9ICh1TG9uZylzLT5naS5udW1iZXJfZW50cnk7Ci0gICAgcGdsb2JhbF9pbmZvMzItPnNpemVfY29tbWVudCA9IHMtPmdpLnNpemVfY29tbWVudDsKLSAgICByZXR1cm4gVU5aX09LOwotfQotLyoKLSAgIFRyYW5zbGF0ZSBkYXRlL3RpbWUgZnJvbSBEb3MgZm9ybWF0IHRvIHRtX3VueiAocmVhZGFibGUgbW9yZSBlYXNpbHR5KQotKi8KLWxvY2FsIHZvaWQgdW56NjRsb2NhbF9Eb3NEYXRlVG9UbXVEYXRlIChaUE9TNjRfVCB1bERvc0RhdGUsIHRtX3VueiogcHRtKQotewotICAgIFpQT1M2NF9UIHVEYXRlOwotICAgIHVEYXRlID0gKFpQT1M2NF9UKSh1bERvc0RhdGU+PjE2KTsKLSAgICBwdG0tPnRtX21kYXkgPSAodUludCkodURhdGUmMHgxZikgOwotICAgIHB0bS0+dG1fbW9uID0gICh1SW50KSgoKCh1RGF0ZSkmMHgxRTApLzB4MjApLTEpIDsKLSAgICBwdG0tPnRtX3llYXIgPSAodUludCkoKCh1RGF0ZSYweDBGRTAwKS8weDAyMDApKzE5ODApIDsKLQotICAgIHB0bS0+dG1faG91ciA9ICh1SW50KSAoKHVsRG9zRGF0ZSAmMHhGODAwKS8weDgwMCk7Ci0gICAgcHRtLT50bV9taW4gPSAgKHVJbnQpICgodWxEb3NEYXRlJjB4N0UwKS8weDIwKSA7Ci0gICAgcHRtLT50bV9zZWMgPSAgKHVJbnQpICgyKih1bERvc0RhdGUmMHgxZikpIDsKLX0KLQotLyoKLSAgR2V0IEluZm8gYWJvdXQgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZSwgd2l0aCBpbnRlcm5hbCBvbmx5IGluZm8KLSovCi1sb2NhbCBpbnQgdW56NjRsb2NhbF9HZXRDdXJyZW50RmlsZUluZm9JbnRlcm5hbCBPRigodW56RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZmlsZV9pbmZvNjQgKnBmaWxlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuel9maWxlX2luZm82NF9pbnRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGZpbGVfaW5mb19pbnRlcm5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pGaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZmlsZU5hbWVCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRyYUZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBleHRyYUZpZWxkQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pDb21tZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjb21tZW50QnVmZmVyU2l6ZSkpOwotCi1sb2NhbCBpbnQgdW56NjRsb2NhbF9HZXRDdXJyZW50RmlsZUluZm9JbnRlcm5hbCAodW56RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZmlsZV9pbmZvNjQgKnBmaWxlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuel9maWxlX2luZm82NF9pbnRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGZpbGVfaW5mb19pbnRlcm5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pGaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZmlsZU5hbWVCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRyYUZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBleHRyYUZpZWxkQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pDb21tZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjb21tZW50QnVmZmVyU2l6ZSkKLXsKLSAgICB1bno2NF9zKiBzOwotICAgIHVuel9maWxlX2luZm82NCBmaWxlX2luZm87Ci0gICAgdW56X2ZpbGVfaW5mbzY0X2ludGVybmFsIGZpbGVfaW5mb19pbnRlcm5hbDsKLSAgICBpbnQgZXJyPVVOWl9PSzsKLSAgICB1TG9uZyB1TWFnaWM7Ci0gICAgbG9uZyBsU2Vlaz0wOwotICAgIHVMb25nIHVMOwotCi0gICAgaWYgKGZpbGU9PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLSAgICBzPSh1bno2NF9zKilmaWxlOwotICAgIGlmIChaU0VFSzY0KHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sCi0gICAgICAgICAgICAgIHMtPnBvc19pbl9jZW50cmFsX2RpcitzLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZSwKLSAgICAgICAgICAgICAgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLQotICAgIC8qIHdlIGNoZWNrIHRoZSBtYWdpYyAqLwotICAgIGlmIChlcnI9PVVOWl9PSykKLSAgICB7Ci0gICAgICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVNYWdpYykgIT0gVU5aX09LKQotICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICAgICAgZWxzZSBpZiAodU1hZ2ljIT0weDAyMDE0YjUwKQotICAgICAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOwotICAgIH0KLQotICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8udmVyc2lvbikgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby52ZXJzaW9uX25lZWRlZCkgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5mbGFnKSAhPSBVTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCkgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLmRvc0RhdGUpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIHVuejY0bG9jYWxfRG9zRGF0ZVRvVG11RGF0ZShmaWxlX2luZm8uZG9zRGF0ZSwmZmlsZV9pbmZvLnRtdV9kYXRlKTsKLQotICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5jcmMpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVMKSAhPSBVTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0gICAgZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSA9IHVMOwotCi0gICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdUwpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICBmaWxlX2luZm8udW5jb21wcmVzc2VkX3NpemUgPSB1TDsKLQotICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uc2l6ZV9maWxlbmFtZSkgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmEpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uc2l6ZV9maWxlX2NvbW1lbnQpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uZGlza19udW1fc3RhcnQpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uaW50ZXJuYWxfZmEpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5leHRlcm5hbF9mYSkgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgICAgICAgICAgICAgLy8gcmVsYXRpdmUgb2Zmc2V0IG9mIGxvY2FsIGhlYWRlcgotICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVMKSAhPSBVTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0gICAgZmlsZV9pbmZvX2ludGVybmFsLm9mZnNldF9jdXJmaWxlID0gdUw7Ci0KLSAgICBsU2Vlays9ZmlsZV9pbmZvLnNpemVfZmlsZW5hbWU7Ci0gICAgaWYgKChlcnI9PVVOWl9PSykgJiYgKHN6RmlsZU5hbWUhPU5VTEwpKQotICAgIHsKLSAgICAgICAgdUxvbmcgdVNpemVSZWFkIDsKLSAgICAgICAgaWYgKGZpbGVfaW5mby5zaXplX2ZpbGVuYW1lPGZpbGVOYW1lQnVmZmVyU2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgKihzekZpbGVOYW1lK2ZpbGVfaW5mby5zaXplX2ZpbGVuYW1lKT0nXDAnOwotICAgICAgICAgICAgdVNpemVSZWFkID0gZmlsZV9pbmZvLnNpemVfZmlsZW5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdVNpemVSZWFkID0gZmlsZU5hbWVCdWZmZXJTaXplOwotCi0gICAgICAgIGlmICgoZmlsZV9pbmZvLnNpemVfZmlsZW5hbWU+MCkgJiYgKGZpbGVOYW1lQnVmZmVyU2l6ZT4wKSkKLSAgICAgICAgICAgIGlmIChaUkVBRDY0KHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sc3pGaWxlTmFtZSx1U2l6ZVJlYWQpIT11U2l6ZVJlYWQpCi0gICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICAgICAgbFNlZWsgLT0gdVNpemVSZWFkOwotICAgIH0KLQotICAgIC8vIFJlYWQgZXh0cmFmaWVsZAotICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChleHRyYUZpZWxkIT1OVUxMKSkKLSAgICB7Ci0gICAgICAgIFpQT1M2NF9UIHVTaXplUmVhZCA7Ci0gICAgICAgIGlmIChmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhPGV4dHJhRmllbGRCdWZmZXJTaXplKQotICAgICAgICAgICAgdVNpemVSZWFkID0gZmlsZV9pbmZvLnNpemVfZmlsZV9leHRyYTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdVNpemVSZWFkID0gZXh0cmFGaWVsZEJ1ZmZlclNpemU7Ci0KLSAgICAgICAgaWYgKGxTZWVrIT0wKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoWlNFRUs2NChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLGxTZWVrLFpMSUJfRklMRUZVTkNfU0VFS19DVVIpPT0wKQotICAgICAgICAgICAgICAgIGxTZWVrPTA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoZmlsZV9pbmZvLnNpemVfZmlsZV9leHRyYT4wKSAmJiAoZXh0cmFGaWVsZEJ1ZmZlclNpemU+MCkpCi0gICAgICAgICAgICBpZiAoWlJFQUQ2NChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLGV4dHJhRmllbGQsKHVMb25nKXVTaXplUmVhZCkhPXVTaXplUmVhZCkKLSAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgICAgIGxTZWVrICs9IGZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmEgLSAodUxvbmcpdVNpemVSZWFkOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGxTZWVrICs9IGZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmE7Ci0KLQotICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhICE9IDApKQotICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgYWNjID0gMDsKLQotICAgICAgICAvLyBzaW5jZSBsU2VlayBub3cgcG9pbnRzIHRvIGFmdGVyIHRoZSBleHRyYSBmaWVsZCB3ZSBuZWVkIHRvIG1vdmUgYmFjawotICAgICAgICBsU2VlayAtPSBmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhOwotCi0gICAgICAgIGlmIChsU2VlayE9MCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFpTRUVLNjQocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxsU2VlayxaTElCX0ZJTEVGVU5DX1NFRUtfQ1VSKT09MCkKLSAgICAgICAgICAgICAgICBsU2Vlaz0wOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZShhY2MgPCBmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhKQotICAgICAgICB7Ci0gICAgICAgICAgICB1TG9uZyBoZWFkZXJJZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGRhdGFTaXplOwotCi0gICAgICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmaGVhZGVySWQpICE9IFVOWl9PSykKLSAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZGF0YVNpemUpICE9IFVOWl9PSykKLSAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgICAgICAgICAvKiBaSVA2NCBleHRyYSBmaWVsZHMgKi8KLSAgICAgICAgICAgIGlmIChoZWFkZXJJZCA9PSAweDAwMDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHVMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplID09IE1BWFUzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nNjQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby51bmNvbXByZXNzZWRfc2l6ZSkgIT0gVU5aX09LKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSA9PSBNQVhVMzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZzY0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uY29tcHJlc3NlZF9zaXplKSAhPSBVTlpfT0spCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmaWxlX2luZm9faW50ZXJuYWwub2Zmc2V0X2N1cmZpbGUgPT0gTUFYVTMyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbGF0aXZlIEhlYWRlciBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bno2NGxvY2FsX2dldExvbmc2NCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvX2ludGVybmFsLm9mZnNldF9jdXJmaWxlKSAhPSBVTlpfT0spCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZmlsZV9pbmZvLmRpc2tfbnVtX3N0YXJ0ID09IE1BWFUzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNrIFN0YXJ0IE51bWJlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdUwpICE9IFVOWl9PSykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoWlNFRUs2NChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLGRhdGFTaXplLFpMSUJfRklMRUZVTkNfU0VFS19DVVIpIT0wKQotICAgICAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhY2MgKz0gMiArIDIgKyBkYXRhU2l6ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChzekNvbW1lbnQhPU5VTEwpKQotICAgIHsKLSAgICAgICAgdUxvbmcgdVNpemVSZWFkIDsKLSAgICAgICAgaWYgKGZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudDxjb21tZW50QnVmZmVyU2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgKihzekNvbW1lbnQrZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50KT0nXDAnOwotICAgICAgICAgICAgdVNpemVSZWFkID0gZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHVTaXplUmVhZCA9IGNvbW1lbnRCdWZmZXJTaXplOwotCi0gICAgICAgIGlmIChsU2VlayE9MCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFpTRUVLNjQocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxsU2VlayxaTElCX0ZJTEVGVU5DX1NFRUtfQ1VSKT09MCkKLSAgICAgICAgICAgICAgICBsU2Vlaz0wOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudD4wKSAmJiAoY29tbWVudEJ1ZmZlclNpemU+MCkpCi0gICAgICAgICAgICBpZiAoWlJFQUQ2NChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLHN6Q29tbWVudCx1U2l6ZVJlYWQpIT11U2l6ZVJlYWQpCi0gICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICAgICAgbFNlZWsrPWZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudCAtIHVTaXplUmVhZDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBsU2Vlays9ZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50OwotCi0KLSAgICBpZiAoKGVycj09VU5aX09LKSAmJiAocGZpbGVfaW5mbyE9TlVMTCkpCi0gICAgICAgICpwZmlsZV9pbmZvPWZpbGVfaW5mbzsKLQotICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChwZmlsZV9pbmZvX2ludGVybmFsIT1OVUxMKSkKLSAgICAgICAgKnBmaWxlX2luZm9faW50ZXJuYWw9ZmlsZV9pbmZvX2ludGVybmFsOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0KLS8qCi0gIFdyaXRlIGluZm8gYWJvdXQgdGhlIFppcEZpbGUgaW4gdGhlICpwZ2xvYmFsX2luZm8gc3RydWN0dXJlLgotICBObyBwcmVwYXJhdGlvbiBvZiB0aGUgc3RydWN0dXJlIGlzIG5lZWRlZAotICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0uCi0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEN1cnJlbnRGaWxlSW5mbzY0ICh1bnpGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZmlsZV9pbmZvNjQgKiBwZmlsZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHN6RmlsZU5hbWUsIHVMb25nIGZpbGVOYW1lQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmV4dHJhRmllbGQsIHVMb25nIGV4dHJhRmllbGRCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogc3pDb21tZW50LCAgdUxvbmcgY29tbWVudEJ1ZmZlclNpemUpCi17Ci0gICAgcmV0dXJuIHVuejY0bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwoZmlsZSxwZmlsZV9pbmZvLE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekZpbGVOYW1lLGZpbGVOYW1lQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhRmllbGQsZXh0cmFGaWVsZEJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekNvbW1lbnQsY29tbWVudEJ1ZmZlclNpemUpOwotfQotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R2V0Q3VycmVudEZpbGVJbmZvICh1bnpGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZmlsZV9pbmZvICogcGZpbGVfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBzekZpbGVOYW1lLCB1TG9uZyBmaWxlTmFtZUJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRyYUZpZWxkLCB1TG9uZyBleHRyYUZpZWxkQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHN6Q29tbWVudCwgIHVMb25nIGNvbW1lbnRCdWZmZXJTaXplKQotewotICAgIGludCBlcnI7Ci0gICAgdW56X2ZpbGVfaW5mbzY0IGZpbGVfaW5mbzY0OwotICAgIGVyciA9IHVuejY0bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwoZmlsZSwmZmlsZV9pbmZvNjQsTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6RmlsZU5hbWUsZmlsZU5hbWVCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFGaWVsZCxleHRyYUZpZWxkQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6Q29tbWVudCxjb21tZW50QnVmZmVyU2l6ZSk7Ci0gICAgaWYgKChlcnI9PVVOWl9PSykgJiYgKHBmaWxlX2luZm8gIT0gTlVMTCkpCi0gICAgewotICAgICAgICBwZmlsZV9pbmZvLT52ZXJzaW9uID0gZmlsZV9pbmZvNjQudmVyc2lvbjsKLSAgICAgICAgcGZpbGVfaW5mby0+dmVyc2lvbl9uZWVkZWQgPSBmaWxlX2luZm82NC52ZXJzaW9uX25lZWRlZDsKLSAgICAgICAgcGZpbGVfaW5mby0+ZmxhZyA9IGZpbGVfaW5mbzY0LmZsYWc7Ci0gICAgICAgIHBmaWxlX2luZm8tPmNvbXByZXNzaW9uX21ldGhvZCA9IGZpbGVfaW5mbzY0LmNvbXByZXNzaW9uX21ldGhvZDsKLSAgICAgICAgcGZpbGVfaW5mby0+ZG9zRGF0ZSA9IGZpbGVfaW5mbzY0LmRvc0RhdGU7Ci0gICAgICAgIHBmaWxlX2luZm8tPmNyYyA9IGZpbGVfaW5mbzY0LmNyYzsKLQotICAgICAgICBwZmlsZV9pbmZvLT5zaXplX2ZpbGVuYW1lID0gZmlsZV9pbmZvNjQuc2l6ZV9maWxlbmFtZTsKLSAgICAgICAgcGZpbGVfaW5mby0+c2l6ZV9maWxlX2V4dHJhID0gZmlsZV9pbmZvNjQuc2l6ZV9maWxlX2V4dHJhOwotICAgICAgICBwZmlsZV9pbmZvLT5zaXplX2ZpbGVfY29tbWVudCA9IGZpbGVfaW5mbzY0LnNpemVfZmlsZV9jb21tZW50OwotCi0gICAgICAgIHBmaWxlX2luZm8tPmRpc2tfbnVtX3N0YXJ0ID0gZmlsZV9pbmZvNjQuZGlza19udW1fc3RhcnQ7Ci0gICAgICAgIHBmaWxlX2luZm8tPmludGVybmFsX2ZhID0gZmlsZV9pbmZvNjQuaW50ZXJuYWxfZmE7Ci0gICAgICAgIHBmaWxlX2luZm8tPmV4dGVybmFsX2ZhID0gZmlsZV9pbmZvNjQuZXh0ZXJuYWxfZmE7Ci0KLSAgICAgICAgcGZpbGVfaW5mby0+dG11X2RhdGUgPSBmaWxlX2luZm82NC50bXVfZGF0ZSwKLQotCi0gICAgICAgIHBmaWxlX2luZm8tPmNvbXByZXNzZWRfc2l6ZSA9ICh1TG9uZylmaWxlX2luZm82NC5jb21wcmVzc2VkX3NpemU7Ci0gICAgICAgIHBmaWxlX2luZm8tPnVuY29tcHJlc3NlZF9zaXplID0gKHVMb25nKWZpbGVfaW5mbzY0LnVuY29tcHJlc3NlZF9zaXplOwotCi0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0vKgotICBTZXQgdGhlIGN1cnJlbnQgZmlsZSBvZiB0aGUgemlwZmlsZSB0byB0aGUgZmlyc3QgZmlsZS4KLSAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtCi0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9GaXJzdEZpbGUgKHVuekZpbGUgZmlsZSkKLXsKLSAgICBpbnQgZXJyPVVOWl9PSzsKLSAgICB1bno2NF9zKiBzOwotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0gICAgcz0odW56NjRfcyopZmlsZTsKLSAgICBzLT5wb3NfaW5fY2VudHJhbF9kaXI9cy0+b2Zmc2V0X2NlbnRyYWxfZGlyOwotICAgIHMtPm51bV9maWxlPTA7Ci0gICAgZXJyPXVuejY0bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwoZmlsZSwmcy0+Y3VyX2ZpbGVfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwwLE5VTEwsMCxOVUxMLDApOwotICAgIHMtPmN1cnJlbnRfZmlsZV9vayA9IChlcnIgPT0gVU5aX09LKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKgotICBTZXQgdGhlIGN1cnJlbnQgZmlsZSBvZiB0aGUgemlwZmlsZSB0byB0aGUgbmV4dCBmaWxlLgotICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0KLSAgcmV0dXJuIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFIGlmIHRoZSBhY3R1YWwgZmlsZSB3YXMgdGhlIGxhdGVzdC4KLSovCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R29Ub05leHRGaWxlICh1bnpGaWxlICBmaWxlKQotewotICAgIHVuejY0X3MqIHM7Ci0gICAgaW50IGVycjsKLQotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0gICAgcz0odW56NjRfcyopZmlsZTsKLSAgICBpZiAoIXMtPmN1cnJlbnRfZmlsZV9vaykKLSAgICAgICAgcmV0dXJuIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFOwotICAgIGlmIChzLT5naS5udW1iZXJfZW50cnkgIT0gMHhmZmZmKSAgICAvKiAyXjE2IGZpbGVzIG92ZXJmbG93IGhhY2sgKi8KLSAgICAgIGlmIChzLT5udW1fZmlsZSsxPT1zLT5naS5udW1iZXJfZW50cnkpCi0gICAgICAgIHJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRTsKLQotICAgIHMtPnBvc19pbl9jZW50cmFsX2RpciArPSBTSVpFQ0VOVFJBTERJUklURU0gKyBzLT5jdXJfZmlsZV9pbmZvLnNpemVfZmlsZW5hbWUgKwotICAgICAgICAgICAgcy0+Y3VyX2ZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmEgKyBzLT5jdXJfZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50IDsKLSAgICBzLT5udW1fZmlsZSsrOwotICAgIGVyciA9IHVuejY0bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwoZmlsZSwmcy0+Y3VyX2ZpbGVfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsMCxOVUxMLDAsTlVMTCwwKTsKLSAgICBzLT5jdXJyZW50X2ZpbGVfb2sgPSAoZXJyID09IFVOWl9PSyk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKgotICBUcnkgbG9jYXRlIHRoZSBmaWxlIHN6RmlsZU5hbWUgaW4gdGhlIHppcGZpbGUuCi0gIEZvciB0aGUgaUNhc2VTZW5zaXRpdml0eSBzaWduaWZpY2F0aW9uLCBzZWUgdW56aXBTdHJpbmdGaWxlTmFtZUNvbXBhcmUKLQotICByZXR1cm4gdmFsdWUgOgotICBVTlpfT0sgaWYgdGhlIGZpbGUgaXMgZm91bmQuIEl0IGJlY29tZXMgdGhlIGN1cnJlbnQgZmlsZS4KLSAgVU5aX0VORF9PRl9MSVNUX09GX0ZJTEUgaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kCi0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuekxvY2F0ZUZpbGUgKHVuekZpbGUgZmlsZSwgY29uc3QgY2hhciAqc3pGaWxlTmFtZSwgaW50IGlDYXNlU2Vuc2l0aXZpdHkpCi17Ci0gICAgdW56NjRfcyogczsKLSAgICBpbnQgZXJyOwotCi0gICAgLyogV2UgcmVtZW1iZXIgdGhlICdjdXJyZW50JyBwb3NpdGlvbiBpbiB0aGUgZmlsZSBzbyB0aGF0IHdlIGNhbiBqdW1wCi0gICAgICogYmFjayB0aGVyZSBpZiB3ZSBmYWlsLgotICAgICAqLwotICAgIHVuel9maWxlX2luZm82NCBjdXJfZmlsZV9pbmZvU2F2ZWQ7Ci0gICAgdW56X2ZpbGVfaW5mbzY0X2ludGVybmFsIGN1cl9maWxlX2luZm9faW50ZXJuYWxTYXZlZDsKLSAgICBaUE9TNjRfVCBudW1fZmlsZVNhdmVkOwotICAgIFpQT1M2NF9UIHBvc19pbl9jZW50cmFsX2RpclNhdmVkOwotCi0KLSAgICBpZiAoZmlsZT09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotCi0gICAgaWYgKHN0cmxlbihzekZpbGVOYW1lKT49VU5aX01BWEZJTEVOQU1FSU5aSVApCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLQotICAgIHM9KHVuejY0X3MqKWZpbGU7Ci0gICAgaWYgKCFzLT5jdXJyZW50X2ZpbGVfb2spCi0gICAgICAgIHJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRTsKLQotICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgc3RhdGUgKi8KLSAgICBudW1fZmlsZVNhdmVkID0gcy0+bnVtX2ZpbGU7Ci0gICAgcG9zX2luX2NlbnRyYWxfZGlyU2F2ZWQgPSBzLT5wb3NfaW5fY2VudHJhbF9kaXI7Ci0gICAgY3VyX2ZpbGVfaW5mb1NhdmVkID0gcy0+Y3VyX2ZpbGVfaW5mbzsKLSAgICBjdXJfZmlsZV9pbmZvX2ludGVybmFsU2F2ZWQgPSBzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsOwotCi0gICAgZXJyID0gdW56R29Ub0ZpcnN0RmlsZShmaWxlKTsKLQotICAgIHdoaWxlIChlcnIgPT0gVU5aX09LKQotICAgIHsKLSAgICAgICAgY2hhciBzekN1cnJlbnRGaWxlTmFtZVtVTlpfTUFYRklMRU5BTUVJTlpJUCsxXTsKLSAgICAgICAgZXJyID0gdW56R2V0Q3VycmVudEZpbGVJbmZvNjQoZmlsZSxOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pDdXJyZW50RmlsZU5hbWUsc2l6ZW9mKHN6Q3VycmVudEZpbGVOYW1lKS0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwwLE5VTEwsMCk7Ci0gICAgICAgIGlmIChlcnIgPT0gVU5aX09LKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodW56U3RyaW5nRmlsZU5hbWVDb21wYXJlKHN6Q3VycmVudEZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekZpbGVOYW1lLGlDYXNlU2Vuc2l0aXZpdHkpPT0wKQotICAgICAgICAgICAgICAgIHJldHVybiBVTlpfT0s7Ci0gICAgICAgICAgICBlcnIgPSB1bnpHb1RvTmV4dEZpbGUoZmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBXZSBmYWlsZWQsIHNvIHJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSAnY3VycmVudCBmaWxlJyB0byB3aGVyZSB3ZQotICAgICAqIHdlcmUuCi0gICAgICovCi0gICAgcy0+bnVtX2ZpbGUgPSBudW1fZmlsZVNhdmVkIDsKLSAgICBzLT5wb3NfaW5fY2VudHJhbF9kaXIgPSBwb3NfaW5fY2VudHJhbF9kaXJTYXZlZCA7Ci0gICAgcy0+Y3VyX2ZpbGVfaW5mbyA9IGN1cl9maWxlX2luZm9TYXZlZDsKLSAgICBzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsID0gY3VyX2ZpbGVfaW5mb19pbnRlcm5hbFNhdmVkOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENvbnRyaWJ1dGVkIGJ5IFJ5YW4gSGFrc2kgKG1haWx0bzovL2NyeW9nZW5AaW5mb3NlcnZlLm5ldCkKLS8vIEkgbmVlZCByYW5kb20gYWNjZXNzCi0vLwotLy8gRnVydGhlciBvcHRpbWl6YXRpb24gY291bGQgYmUgcmVhbGl6ZWQgYnkgYWRkaW5nIGFuIGFiaWxpdHkKLS8vIHRvIGNhY2hlIHRoZSBkaXJlY3RvcnkgaW4gbWVtb3J5LiBUaGUgZ29hbCBiZWluZyBhIHNpbmdsZQotLy8gY29tcHJlaGVuc2l2ZSBmaWxlIHJlYWQgdG8gcHV0IHRoZSBmaWxlIEkgbmVlZCBpbiBhIG1lbW9yeS4KLSovCi0KLS8qCi10eXBlZGVmIHN0cnVjdCB1bnpfZmlsZV9wb3NfcwotewotICAgIFpQT1M2NF9UIHBvc19pbl96aXBfZGlyZWN0b3J5OyAgIC8vIG9mZnNldCBpbiBmaWxlCi0gICAgWlBPUzY0X1QgbnVtX29mX2ZpbGU7ICAgICAgICAgICAgLy8gIyBvZiBmaWxlCi19IHVuel9maWxlX3BvczsKLSovCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRGaWxlUG9zNjQodW56RmlsZSBmaWxlLCB1bno2NF9maWxlX3BvcyogIGZpbGVfcG9zKQotewotICAgIHVuejY0X3MqIHM7Ci0KLSAgICBpZiAoZmlsZT09TlVMTCB8fCBmaWxlX3Bvcz09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotICAgIHM9KHVuejY0X3MqKWZpbGU7Ci0gICAgaWYgKCFzLT5jdXJyZW50X2ZpbGVfb2spCi0gICAgICAgIHJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRTsKLQotICAgIGZpbGVfcG9zLT5wb3NfaW5femlwX2RpcmVjdG9yeSAgPSBzLT5wb3NfaW5fY2VudHJhbF9kaXI7Ci0gICAgZmlsZV9wb3MtPm51bV9vZl9maWxlICAgICAgICAgICA9IHMtPm51bV9maWxlOwotCi0gICAgcmV0dXJuIFVOWl9PSzsKLX0KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEZpbGVQb3MoCi0gICAgdW56RmlsZSBmaWxlLAotICAgIHVuel9maWxlX3BvcyogZmlsZV9wb3MpCi17Ci0gICAgdW56NjRfZmlsZV9wb3MgZmlsZV9wb3M2NDsKLSAgICBpbnQgZXJyID0gdW56R2V0RmlsZVBvczY0KGZpbGUsJmZpbGVfcG9zNjQpOwotICAgIGlmIChlcnI9PVVOWl9PSykKLSAgICB7Ci0gICAgICAgIGZpbGVfcG9zLT5wb3NfaW5femlwX2RpcmVjdG9yeSA9ICh1TG9uZylmaWxlX3BvczY0LnBvc19pbl96aXBfZGlyZWN0b3J5OwotICAgICAgICBmaWxlX3Bvcy0+bnVtX29mX2ZpbGUgPSAodUxvbmcpZmlsZV9wb3M2NC5udW1fb2ZfZmlsZTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9GaWxlUG9zNjQodW56RmlsZSBmaWxlLCBjb25zdCB1bno2NF9maWxlX3BvcyogZmlsZV9wb3MpCi17Ci0gICAgdW56NjRfcyogczsKLSAgICBpbnQgZXJyOwotCi0gICAgaWYgKGZpbGU9PU5VTEwgfHwgZmlsZV9wb3M9PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLSAgICBzPSh1bno2NF9zKilmaWxlOwotCi0gICAgLyoganVtcCB0byB0aGUgcmlnaHQgc3BvdCAqLwotICAgIHMtPnBvc19pbl9jZW50cmFsX2RpciA9IGZpbGVfcG9zLT5wb3NfaW5femlwX2RpcmVjdG9yeTsKLSAgICBzLT5udW1fZmlsZSAgICAgICAgICAgPSBmaWxlX3Bvcy0+bnVtX29mX2ZpbGU7Ci0KLSAgICAvKiBzZXQgdGhlIGN1cnJlbnQgZmlsZSAqLwotICAgIGVyciA9IHVuejY0bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwoZmlsZSwmcy0+Y3VyX2ZpbGVfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsMCxOVUxMLDAsTlVMTCwwKTsKLSAgICAvKiByZXR1cm4gcmVzdWx0cyAqLwotICAgIHMtPmN1cnJlbnRfZmlsZV9vayA9IChlcnIgPT0gVU5aX09LKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R29Ub0ZpbGVQb3MoCi0gICAgdW56RmlsZSBmaWxlLAotICAgIHVuel9maWxlX3BvcyogZmlsZV9wb3MpCi17Ci0gICAgdW56NjRfZmlsZV9wb3MgZmlsZV9wb3M2NDsKLSAgICBpZiAoZmlsZV9wb3MgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotCi0gICAgZmlsZV9wb3M2NC5wb3NfaW5femlwX2RpcmVjdG9yeSA9IGZpbGVfcG9zLT5wb3NfaW5femlwX2RpcmVjdG9yeTsKLSAgICBmaWxlX3BvczY0Lm51bV9vZl9maWxlID0gZmlsZV9wb3MtPm51bV9vZl9maWxlOwotICAgIHJldHVybiB1bnpHb1RvRmlsZVBvczY0KGZpbGUsJmZpbGVfcG9zNjQpOwotfQotCi0vKgotLy8gVW56aXAgSGVscGVyIEZ1bmN0aW9ucyAtIHNob3VsZCBiZSBoZXJlPwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotKi8KLQotLyoKLSAgUmVhZCB0aGUgbG9jYWwgaGVhZGVyIG9mIHRoZSBjdXJyZW50IHppcGZpbGUKLSAgQ2hlY2sgdGhlIGNvaGVyZW5jeSBvZiB0aGUgbG9jYWwgaGVhZGVyIGFuZCBpbmZvIGluIHRoZSBlbmQgb2YgY2VudHJhbAotICAgICAgICBkaXJlY3RvcnkgYWJvdXQgdGhpcyBmaWxlCi0gIHN0b3JlIGluICpwaVNpemVWYXIgdGhlIHNpemUgb2YgZXh0cmEgaW5mbyBpbiBsb2NhbCBoZWFkZXIKLSAgICAgICAgKGZpbGVuYW1lIGFuZCBzaXplIG9mIGV4dHJhIGZpZWxkIGRhdGEpCi0qLwotbG9jYWwgaW50IHVuejY0bG9jYWxfQ2hlY2tDdXJyZW50RmlsZUNvaGVyZW5jeUhlYWRlciAodW56NjRfcyogcywgdUludCogcGlTaXplVmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpQT1M2NF9UICogcG9mZnNldF9sb2NhbF9leHRyYWZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgICogcHNpemVfbG9jYWxfZXh0cmFmaWVsZCkKLXsKLSAgICB1TG9uZyB1TWFnaWMsdURhdGEsdUZsYWdzOwotICAgIHVMb25nIHNpemVfZmlsZW5hbWU7Ci0gICAgdUxvbmcgc2l6ZV9leHRyYV9maWVsZDsKLSAgICBpbnQgZXJyPVVOWl9PSzsKLQotICAgICpwaVNpemVWYXIgPSAwOwotICAgICpwb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQgPSAwOwotICAgICpwc2l6ZV9sb2NhbF9leHRyYWZpZWxkID0gMDsKLQotICAgIGlmIChaU0VFSzY0KHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0scy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbC5vZmZzZXRfY3VyZmlsZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQotICAgICAgICByZXR1cm4gVU5aX0VSUk5POwotCi0KLSAgICBpZiAoZXJyPT1VTlpfT0spCi0gICAgewotICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1TWFnaWMpICE9IFVOWl9PSykKLSAgICAgICAgICAgIGVycj1VTlpfRVJSTk87Ci0gICAgICAgIGVsc2UgaWYgKHVNYWdpYyE9MHgwNDAzNGI1MCkKLSAgICAgICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKLSAgICB9Ci0KLSAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdURhdGEpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLS8qCi0gICAgZWxzZSBpZiAoKGVycj09VU5aX09LKSAmJiAodURhdGEhPXMtPmN1cl9maWxlX2luZm8ud1ZlcnNpb24pKQotICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7Ci0qLwotICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1RmxhZ3MpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1RGF0YSkgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgIGVsc2UgaWYgKChlcnI9PVVOWl9PSykgJiYgKHVEYXRhIT1zLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCkpCi0gICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKLQotICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCE9MCkgJiYKLS8qICNpZmRlZiBIQVZFX0JaSVAyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kIT1aX0JaSVAyRUQpICYmCi0vKiAjZW5kaWYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAocy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QhPVpfREVGTEFURUQpKQotICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7Ci0KLSAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1RGF0YSkgIT0gVU5aX09LKSAvKiBkYXRlL3RpbWUgKi8KLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVEYXRhKSAhPSBVTlpfT0spIC8qIGNyYyAqLwotICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgIGVsc2UgaWYgKChlcnI9PVVOWl9PSykgJiYgKHVEYXRhIT1zLT5jdXJfZmlsZV9pbmZvLmNyYykgJiYgKCh1RmxhZ3MgJiA4KT09MCkpCi0gICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKLQotICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVEYXRhKSAhPSBVTlpfT0spIC8qIHNpemUgY29tcHIgKi8KLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICBlbHNlIGlmICh1RGF0YSAhPSAweEZGRkZGRkZGICYmIChlcnI9PVVOWl9PSykgJiYgKHVEYXRhIT1zLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSkgJiYgKCh1RmxhZ3MgJiA4KT09MCkpCi0gICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKLQotICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVEYXRhKSAhPSBVTlpfT0spIC8qIHNpemUgdW5jb21wciAqLwotICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgIGVsc2UgaWYgKHVEYXRhICE9IDB4RkZGRkZGRkYgJiYgKGVycj09VU5aX09LKSAmJiAodURhdGEhPXMtPmN1cl9maWxlX2luZm8udW5jb21wcmVzc2VkX3NpemUpICYmICgodUZsYWdzICYgOCk9PTApKQotICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7Ci0KLSAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmc2l6ZV9maWxlbmFtZSkgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgIGVsc2UgaWYgKChlcnI9PVVOWl9PSykgJiYgKHNpemVfZmlsZW5hbWUhPXMtPmN1cl9maWxlX2luZm8uc2l6ZV9maWxlbmFtZSkpCi0gICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKLQotICAgICpwaVNpemVWYXIgKz0gKHVJbnQpc2l6ZV9maWxlbmFtZTsKLQotICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZzaXplX2V4dHJhX2ZpZWxkKSAhPSBVTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0gICAgKnBvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZD0gcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbC5vZmZzZXRfY3VyZmlsZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFWklQTE9DQUxIRUFERVIgKyBzaXplX2ZpbGVuYW1lOwotICAgICpwc2l6ZV9sb2NhbF9leHRyYWZpZWxkID0gKHVJbnQpc2l6ZV9leHRyYV9maWVsZDsKLQotICAgICpwaVNpemVWYXIgKz0gKHVJbnQpc2l6ZV9leHRyYV9maWVsZDsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qCi0gIE9wZW4gZm9yIHJlYWRpbmcgZGF0YSB0aGUgY3VycmVudCBmaWxlIGluIHRoZSB6aXBmaWxlLgotICBJZiB0aGVyZSBpcyBubyBlcnJvciBhbmQgdGhlIGZpbGUgaXMgb3BlbmVkLCB0aGUgcmV0dXJuIHZhbHVlIGlzIFVOWl9PSy4KLSovCi1leHRlcm4gaW50IFpFWFBPUlQgdW56T3BlbkN1cnJlbnRGaWxlMyAodW56RmlsZSBmaWxlLCBpbnQqIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBsZXZlbCwgaW50IHJhdywgY29uc3QgY2hhciogcGFzc3dvcmQpCi17Ci0gICAgaW50IGVycj1VTlpfT0s7Ci0gICAgdUludCBpU2l6ZVZhcjsKLSAgICB1bno2NF9zKiBzOwotICAgIGZpbGVfaW5femlwNjRfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87Ci0gICAgWlBPUzY0X1Qgb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQ7ICAvKiBvZmZzZXQgb2YgdGhlIGxvY2FsIGV4dHJhIGZpZWxkICovCi0gICAgdUludCAgc2l6ZV9sb2NhbF9leHRyYWZpZWxkOyAgICAvKiBzaXplIG9mIHRoZSBsb2NhbCBleHRyYSBmaWVsZCAqLwotIyAgICBpZm5kZWYgTk9VTkNSWVBUCi0gICAgY2hhciBzb3VyY2VbMTJdOwotIyAgICBlbHNlCi0gICAgaWYgKHBhc3N3b3JkICE9IE5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLSMgICAgZW5kaWYKLQotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0gICAgcz0odW56NjRfcyopZmlsZTsKLSAgICBpZiAoIXMtPmN1cnJlbnRfZmlsZV9vaykKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotCi0gICAgaWYgKHMtPnBmaWxlX2luX3ppcF9yZWFkICE9IE5VTEwpCi0gICAgICAgIHVuekNsb3NlQ3VycmVudEZpbGUoZmlsZSk7Ci0KLSAgICBpZiAodW56NjRsb2NhbF9DaGVja0N1cnJlbnRGaWxlQ29oZXJlbmN5SGVhZGVyKHMsJmlTaXplVmFyLCAmb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQsJnNpemVfbG9jYWxfZXh0cmFmaWVsZCkhPVVOWl9PSykKLSAgICAgICAgcmV0dXJuIFVOWl9CQURaSVBGSUxFOwotCi0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mbyA9IChmaWxlX2luX3ppcDY0X3JlYWRfaW5mb19zKilBTExPQyhzaXplb2YoZmlsZV9pbl96aXA2NF9yZWFkX2luZm9fcykpOwotICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX0lOVEVSTkFMRVJST1I7Ci0KLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlcj0oY2hhciopQUxMT0MoVU5aX0JVRlNJWkUpOwotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPm9mZnNldF9sb2NhbF9leHRyYWZpZWxkID0gb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQ7Ci0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c2l6ZV9sb2NhbF9leHRyYWZpZWxkID0gc2l6ZV9sb2NhbF9leHRyYWZpZWxkOwotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnBvc19sb2NhbF9leHRyYWZpZWxkPTA7Ci0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmF3PXJhdzsKLQotICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlcj09TlVMTCkKLSAgICB7Ci0gICAgICAgIFRSWUZSRUUocGZpbGVfaW5femlwX3JlYWRfaW5mbyk7Ci0gICAgICAgIHJldHVybiBVTlpfSU5URVJOQUxFUlJPUjsKLSAgICB9Ci0KLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW1faW5pdGlhbGlzZWQ9MDsKLQotICAgIGlmIChtZXRob2QhPU5VTEwpCi0gICAgICAgICptZXRob2QgPSAoaW50KXMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kOwotCi0gICAgaWYgKGxldmVsIT1OVUxMKQotICAgIHsKLSAgICAgICAgKmxldmVsID0gNjsKLSAgICAgICAgc3dpdGNoIChzLT5jdXJfZmlsZV9pbmZvLmZsYWcgJiAweDA2KQotICAgICAgICB7Ci0gICAgICAgICAgY2FzZSA2IDogKmxldmVsID0gMTsgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA0IDogKmxldmVsID0gMjsgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAyIDogKmxldmVsID0gOTsgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoKHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kIT0wKSAmJgotLyogI2lmZGVmIEhBVkVfQlpJUDIgKi8KLSAgICAgICAgKHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kIT1aX0JaSVAyRUQpICYmCi0vKiAjZW5kaWYgKi8KLSAgICAgICAgKHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kIT1aX0RFRkxBVEVEKSkKLQotICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7Ci0KLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMl93YWl0PXMtPmN1cl9maWxlX2luZm8uY3JjOwotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyPTA7Ci0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+dG90YWxfb3V0XzY0PTA7Ci0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y29tcHJlc3Npb25fbWV0aG9kID0gcy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2Q7Ci0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+ZmlsZXN0cmVhbT1zLT5maWxlc3RyZWFtOwotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnpfZmlsZWZ1bmM9cy0+el9maWxlZnVuYzsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZT1zLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZTsKLQotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS50b3RhbF9vdXQgPSAwOwotCi0gICAgaWYgKChzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZD09Wl9CWklQMkVEKSAmJiAoIXJhdykpCi0gICAgewotI2lmZGVmIEhBVkVfQlpJUDIKLSAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0uYnphbGxvYyA9ICh2b2lkICooKikgKHZvaWQgKiwgaW50LCBpbnQpKTA7Ci0gICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLmJ6ZnJlZSA9IChmcmVlX2Z1bmMpMDsKLSAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwotICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS5zdGF0ZSA9ICh2b2lkcGYpMDsKLQotICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7Ci0gICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7Ci0gICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwotICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfaW4gPSAodm9pZHBmKTA7Ci0gICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW4gPSAwOwotCi0gICAgICBlcnI9QloyX2J6RGVjb21wcmVzc0luaXQoJnBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0sIDAsIDApOwotICAgICAgaWYgKGVyciA9PSBaX09LKQotICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW1faW5pdGlhbGlzZWQ9Wl9CWklQMkVEOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBUUllGUkVFKHBmaWxlX2luX3ppcF9yZWFkX2luZm8pOwotICAgICAgICByZXR1cm4gZXJyOwotICAgICAgfQotI2Vsc2UKLSAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJhdz0xOwotI2VuZGlmCi0gICAgfQotICAgIGVsc2UgaWYgKChzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZD09Wl9ERUZMQVRFRCkgJiYgKCFyYXcpKQotICAgIHsKLSAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOwotICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOwotICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKLSAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X2luID0gMDsKLSAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiA9IDA7Ci0KLSAgICAgIGVycj1pbmZsYXRlSW5pdDIoJnBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbSwgLU1BWF9XQklUUyk7Ci0gICAgICBpZiAoZXJyID09IFpfT0spCi0gICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbV9pbml0aWFsaXNlZD1aX0RFRkxBVEVEOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBUUllGUkVFKHBmaWxlX2luX3ppcF9yZWFkX2luZm8pOwotICAgICAgICByZXR1cm4gZXJyOwotICAgICAgfQotICAgICAgICAvKiB3aW5kb3dCaXRzIGlzIHBhc3NlZCA8IDAgdG8gdGVsbCB0aGF0IHRoZXJlIGlzIG5vIHpsaWIgaGVhZGVyLgotICAgICAgICAgKiBOb3RlIHRoYXQgaW4gdGhpcyBjYXNlIGluZmxhdGUgKnJlcXVpcmVzKiBhbiBleHRyYSAiZHVtbXkiIGJ5dGUKLSAgICAgICAgICogYWZ0ZXIgdGhlIGNvbXByZXNzZWQgc3RyZWFtIGluIG9yZGVyIHRvIGNvbXBsZXRlIGRlY29tcHJlc3Npb24gYW5kCi0gICAgICAgICAqIHJldHVybiBaX1NUUkVBTV9FTkQuCi0gICAgICAgICAqIEluIHVuemlwLCBpIGRvbid0IHdhaXQgYWJzb2x1dGVseSBaX1NUUkVBTV9FTkQgYmVjYXVzZSBJIGtub3duIHRoZQotICAgICAgICAgKiBzaXplIG9mIGJvdGggY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIGRhdGEKLSAgICAgICAgICovCi0gICAgfQotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkID0KLSAgICAgICAgICAgIHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3NlZF9zaXplIDsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfdW5jb21wcmVzc2VkID0KLSAgICAgICAgICAgIHMtPmN1cl9maWxlX2luZm8udW5jb21wcmVzc2VkX3NpemUgOwotCi0KLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfaW5femlwZmlsZSA9Ci0gICAgICAgICAgICBzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLm9mZnNldF9jdXJmaWxlICsgU0laRVpJUExPQ0FMSEVBREVSICsKLSAgICAgICAgICAgICAgaVNpemVWYXI7Ci0KLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW4gPSAodUludCkwOwotCi0gICAgcy0+cGZpbGVfaW5femlwX3JlYWQgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOwotICAgICAgICAgICAgICAgIHMtPmVuY3J5cHRlZCA9IDA7Ci0KLSMgICAgaWZuZGVmIE5PVU5DUllQVAotICAgIGlmIChwYXNzd29yZCAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIHMtPnBjcmNfMzJfdGFiID0gZ2V0X2NyY190YWJsZSgpOwotICAgICAgICBpbml0X2tleXMocGFzc3dvcmQscy0+a2V5cyxzLT5wY3JjXzMyX3RhYik7Ci0gICAgICAgIGlmIChaU0VFSzY0KHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBzLT5wZmlsZV9pbl96aXBfcmVhZC0+cG9zX2luX3ppcGZpbGUgKwotICAgICAgICAgICAgICAgICAgICAgcy0+cGZpbGVfaW5femlwX3JlYWQtPmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlLAotICAgICAgICAgICAgICAgICAgU0VFS19TRVQpIT0wKQotICAgICAgICAgICAgcmV0dXJuIFVOWl9JTlRFUk5BTEVSUk9SOwotICAgICAgICBpZihaUkVBRDY0KHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sc291cmNlLCAxMik8MTIpCi0gICAgICAgICAgICByZXR1cm4gVU5aX0lOVEVSTkFMRVJST1I7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaTwxMjsgaSsrKQotICAgICAgICAgICAgemRlY29kZShzLT5rZXlzLHMtPnBjcmNfMzJfdGFiLHNvdXJjZVtpXSk7Ci0KLSAgICAgICAgcy0+cGZpbGVfaW5femlwX3JlYWQtPnBvc19pbl96aXBmaWxlKz0xMjsKLSAgICAgICAgcy0+ZW5jcnlwdGVkPTE7Ci0gICAgfQotIyAgICBlbmRpZgotCi0KLSAgICByZXR1cm4gVU5aX09LOwotfQotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56T3BlbkN1cnJlbnRGaWxlICh1bnpGaWxlIGZpbGUpCi17Ci0gICAgcmV0dXJuIHVuek9wZW5DdXJyZW50RmlsZTMoZmlsZSwgTlVMTCwgTlVMTCwgMCwgTlVMTCk7Ci19Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpPcGVuQ3VycmVudEZpbGVQYXNzd29yZCAodW56RmlsZSBmaWxlLCBjb25zdCBjaGFyKiAgcGFzc3dvcmQpCi17Ci0gICAgcmV0dXJuIHVuek9wZW5DdXJyZW50RmlsZTMoZmlsZSwgTlVMTCwgTlVMTCwgMCwgcGFzc3dvcmQpOwotfQotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56T3BlbkN1cnJlbnRGaWxlMiAodW56RmlsZSBmaWxlLCBpbnQqIG1ldGhvZCwgaW50KiBsZXZlbCwgaW50IHJhdykKLXsKLSAgICByZXR1cm4gdW56T3BlbkN1cnJlbnRGaWxlMyhmaWxlLCBtZXRob2QsIGxldmVsLCByYXcsIE5VTEwpOwotfQotCi0vKiogQWRkaXRpb24gZm9yIEdEQUwgOiBTVEFSVCAqLwotCi1leHRlcm4gWlBPUzY0X1QgWkVYUE9SVCB1bnpHZXRDdXJyZW50RmlsZVpTdHJlYW1Qb3M2NCggdW56RmlsZSBmaWxlKQotewotICAgIHVuejY0X3MqIHM7Ci0gICAgZmlsZV9pbl96aXA2NF9yZWFkX2luZm9fcyogcGZpbGVfaW5femlwX3JlYWRfaW5mbzsKLSAgICBzPSh1bno2NF9zKilmaWxlOwotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gMDsgLy9VTlpfUEFSQU1FUlJPUjsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvPXMtPnBmaWxlX2luX3ppcF9yZWFkOwotICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQotICAgICAgICByZXR1cm4gMDsgLy9VTlpfUEFSQU1FUlJPUjsKLSAgICByZXR1cm4gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2luX3ppcGZpbGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlOwotfQotCi0vKiogQWRkaXRpb24gZm9yIEdEQUwgOiBFTkQgKi8KLQotLyoKLSAgUmVhZCBieXRlcyBmcm9tIHRoZSBjdXJyZW50IGZpbGUuCi0gIGJ1ZiBjb250YWluIGJ1ZmZlciB3aGVyZSBkYXRhIG11c3QgYmUgY29waWVkCi0gIGxlbiB0aGUgc2l6ZSBvZiBidWYuCi0KLSAgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZSBjb3BpZWQgaWYgc29tZXMgYnl0ZXMgYXJlIGNvcGllZAotICByZXR1cm4gMCBpZiB0aGUgZW5kIG9mIGZpbGUgd2FzIHJlYWNoZWQKLSAgcmV0dXJuIDwwIHdpdGggZXJyb3IgY29kZSBpZiB0aGVyZSBpcyBhbiBlcnJvcgotICAgIChVTlpfRVJSTk8gZm9yIElPIGVycm9yLCBvciB6TGliIGVycm9yIGZvciB1bmNvbXByZXNzIGVycm9yKQotKi8KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpSZWFkQ3VycmVudEZpbGUgICh1bnpGaWxlIGZpbGUsIHZvaWRwIGJ1ZiwgdW5zaWduZWQgbGVuKQotewotICAgIGludCBlcnI9VU5aX09LOwotICAgIHVJbnQgaVJlYWQgPSAwOwotICAgIHVuejY0X3MqIHM7Ci0gICAgZmlsZV9pbl96aXA2NF9yZWFkX2luZm9fcyogcGZpbGVfaW5femlwX3JlYWRfaW5mbzsKLSAgICBpZiAoZmlsZT09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotICAgIHM9KHVuejY0X3MqKWZpbGU7Ci0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mbz1zLT5wZmlsZV9pbl96aXBfcmVhZDsKLQotICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0KLQotICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlciA9PSBOVUxMKQotICAgICAgICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEU7Ci0gICAgaWYgKGxlbj09MCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZWYqKWJ1ZjsKLQotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQgPSAodUludClsZW47Ci0KLSAgICBpZiAoKGxlbj5wZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfdW5jb21wcmVzc2VkKSAmJgotICAgICAgICAoIShwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yYXcpKSkKLSAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCA9Ci0gICAgICAgICAgICAodUludClwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfdW5jb21wcmVzc2VkOwotCi0gICAgaWYgKChsZW4+cGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQrCi0gICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbikgJiYKLSAgICAgICAgIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yYXcpKQotICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0ID0KLSAgICAgICAgICAgICh1SW50KXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkKwotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luOwotCi0gICAgd2hpbGUgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQ+MCkKLSAgICB7Ci0gICAgICAgIGlmICgocGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luPT0wKSAmJgotICAgICAgICAgICAgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkPjApKQotICAgICAgICB7Ci0gICAgICAgICAgICB1SW50IHVSZWFkVGhpcyA9IFVOWl9CVUZTSVpFOwotICAgICAgICAgICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkPHVSZWFkVGhpcykKLSAgICAgICAgICAgICAgICB1UmVhZFRoaXMgPSAodUludClwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZDsKLSAgICAgICAgICAgIGlmICh1UmVhZFRoaXMgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gVU5aX0VPRjsKLSAgICAgICAgICAgIGlmIChaU0VFSzY0KHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnpfZmlsZWZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+ZmlsZXN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfaW5femlwZmlsZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Ynl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCi0gICAgICAgICAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsKLSAgICAgICAgICAgIGlmIChaUkVBRDY0KHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnpfZmlsZWZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+ZmlsZXN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICB1UmVhZFRoaXMpIT11UmVhZFRoaXMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsKLQotCi0jICAgICAgICAgICAgaWZuZGVmIE5PVU5DUllQVAotICAgICAgICAgICAgaWYocy0+ZW5jcnlwdGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVJbnQgaTsKLSAgICAgICAgICAgICAgICBmb3IoaT0wO2k8dVJlYWRUaGlzO2krKykKLSAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlYWRfYnVmZmVyW2ldID0KLSAgICAgICAgICAgICAgICAgICAgICB6ZGVjb2RlKHMtPmtleXMscy0+cGNyY18zMl90YWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlcltpXSk7Ci0gICAgICAgICAgICB9Ci0jICAgICAgICAgICAgZW5kaWYKLQotCi0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfaW5femlwZmlsZSArPSB1UmVhZFRoaXM7Ci0KLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkLT11UmVhZFRoaXM7Ci0KLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X2luID0KLSAgICAgICAgICAgICAgICAoQnl0ZWYqKXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlYWRfYnVmZmVyOwotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpdVJlYWRUaGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jb21wcmVzc2lvbl9tZXRob2Q9PTApIHx8IChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yYXcpKQotICAgICAgICB7Ci0gICAgICAgICAgICB1SW50IHVEb0NvcHksaSA7Ci0KLSAgICAgICAgICAgIGlmICgocGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luID09IDApICYmCi0gICAgICAgICAgICAgICAgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkID09IDApKQotICAgICAgICAgICAgICAgIHJldHVybiAoaVJlYWQ9PTApID8gVU5aX0VPRiA6IGlSZWFkOwotCi0gICAgICAgICAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCA8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luKQotICAgICAgICAgICAgICAgIHVEb0NvcHkgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0IDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1RG9Db3B5ID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luIDsKLQotICAgICAgICAgICAgZm9yIChpPTA7aTx1RG9Db3B5O2krKykKLSAgICAgICAgICAgICAgICAqKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X291dCtpKSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X2luK2kpOwotCi0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT50b3RhbF9vdXRfNjQgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT50b3RhbF9vdXRfNjQgKyB1RG9Db3B5OwotCi0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMiA9IGNyYzMyKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVEb0NvcHkpOwotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZC09dURvQ29weTsKLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiAtPSB1RG9Db3B5OwotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCAtPSB1RG9Db3B5OwotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0ICs9IHVEb0NvcHk7Ci0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9pbiArPSB1RG9Db3B5OwotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX291dCArPSB1RG9Db3B5OwotICAgICAgICAgICAgaVJlYWQgKz0gdURvQ29weTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jb21wcmVzc2lvbl9tZXRob2Q9PVpfQlpJUDJFRCkKLSAgICAgICAgewotI2lmZGVmIEhBVkVfQlpJUDIKLSAgICAgICAgICAgIHVMb25nIHVUb3RhbE91dEJlZm9yZSx1VG90YWxPdXRBZnRlcjsKLSAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpidWZCZWZvcmU7Ci0gICAgICAgICAgICB1TG9uZyB1T3V0VGhpczsKLQotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS5uZXh0X2luICAgICAgICA9IChjaGFyKilwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9pbjsKLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0uYXZhaWxfaW4gICAgICAgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW47Ci0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLnRvdGFsX2luX2xvMzIgID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX2luOwotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS50b3RhbF9pbl9oaTMyICA9IDA7Ci0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLm5leHRfb3V0ICAgICAgID0gKGNoYXIqKXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X291dDsKLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0uYXZhaWxfb3V0ICAgICAgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0OwotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS50b3RhbF9vdXRfbG8zMiA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS50b3RhbF9vdXQ7Ci0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLnRvdGFsX291dF9oaTMyID0gMDsKLQotICAgICAgICAgICAgdVRvdGFsT3V0QmVmb3JlID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS50b3RhbF9vdXRfbG8zMjsKLSAgICAgICAgICAgIGJ1ZkJlZm9yZSA9IChjb25zdCBCeXRlZiAqKXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0ubmV4dF9vdXQ7Ci0KLSAgICAgICAgICAgIGVycj1CWjJfYnpEZWNvbXByZXNzKCZwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtKTsKLQotICAgICAgICAgICAgdVRvdGFsT3V0QWZ0ZXIgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLnRvdGFsX291dF9sbzMyOwotICAgICAgICAgICAgdU91dFRoaXMgPSB1VG90YWxPdXRBZnRlci11VG90YWxPdXRCZWZvcmU7Ci0KLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnRvdGFsX291dF82NCA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnRvdGFsX291dF82NCArIHVPdXRUaGlzOwotCi0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMiA9IGNyYzMyKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyLGJ1ZkJlZm9yZSwgKHVJbnQpKHVPdXRUaGlzKSk7Ci0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfdW5jb21wcmVzc2VkIC09IHVPdXRUaGlzOwotICAgICAgICAgICAgaVJlYWQgKz0gKHVJbnQpKHVUb3RhbE91dEFmdGVyIC0gdVRvdGFsT3V0QmVmb3JlKTsKLQotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfaW4gICA9IChCeXRlZiopcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS5uZXh0X2luOwotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luICA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0uYXZhaWxfaW47Ci0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0udG90YWxfaW4gID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS50b3RhbF9pbl9sbzMyOwotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0ICA9IChCeXRlZiopcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS5uZXh0X291dDsKLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLmF2YWlsX291dDsKLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS50b3RhbF9vdXQgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLnRvdGFsX291dF9sbzMyOwotCi0gICAgICAgICAgICBpZiAoZXJyPT1CWl9TVFJFQU1fRU5EKQotICAgICAgICAgICAgICByZXR1cm4gKGlSZWFkPT0wKSA/IFVOWl9FT0YgOiBpUmVhZDsKLSAgICAgICAgICAgIGlmIChlcnIhPUJaX09LKQotICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICB9IC8vIGVuZCBaX0JaSVAyRUQKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBaUE9TNjRfVCB1VG90YWxPdXRCZWZvcmUsdVRvdGFsT3V0QWZ0ZXI7Ci0gICAgICAgICAgICBjb25zdCBCeXRlZiAqYnVmQmVmb3JlOwotICAgICAgICAgICAgWlBPUzY0X1QgdU91dFRoaXM7Ci0gICAgICAgICAgICBpbnQgZmx1c2g9Wl9TWU5DX0ZMVVNIOwotCi0gICAgICAgICAgICB1VG90YWxPdXRCZWZvcmUgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0udG90YWxfb3V0OwotICAgICAgICAgICAgYnVmQmVmb3JlID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0OwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgaWYgKChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfdW5jb21wcmVzc2VkID09Ci0gICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0KSAmJgotICAgICAgICAgICAgICAgIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZCA9PSAwKSkKLSAgICAgICAgICAgICAgICBmbHVzaCA9IFpfRklOSVNIOwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGVycj1pbmZsYXRlKCZwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0sZmx1c2gpOwotCi0gICAgICAgICAgICBpZiAoKGVycj49MCkgJiYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5tc2chPU5VTEwpKQotICAgICAgICAgICAgICBlcnIgPSBaX0RBVEFfRVJST1I7Ci0KLSAgICAgICAgICAgIHVUb3RhbE91dEFmdGVyID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX291dDsKLSAgICAgICAgICAgIHVPdXRUaGlzID0gdVRvdGFsT3V0QWZ0ZXItdVRvdGFsT3V0QmVmb3JlOwotCi0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT50b3RhbF9vdXRfNjQgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT50b3RhbF9vdXRfNjQgKyB1T3V0VGhpczsKLQotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzIgPQotICAgICAgICAgICAgICAgIGNyYzMyKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyLGJ1ZkJlZm9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh1SW50KSh1T3V0VGhpcykpOwotCi0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfdW5jb21wcmVzc2VkIC09Ci0gICAgICAgICAgICAgICAgdU91dFRoaXM7Ci0KLSAgICAgICAgICAgIGlSZWFkICs9ICh1SW50KSh1VG90YWxPdXRBZnRlciAtIHVUb3RhbE91dEJlZm9yZSk7Ci0KLSAgICAgICAgICAgIGlmIChlcnI9PVpfU1RSRUFNX0VORCkKLSAgICAgICAgICAgICAgICByZXR1cm4gKGlSZWFkPT0wKSA/IFVOWl9FT0YgOiBpUmVhZDsKLSAgICAgICAgICAgIGlmIChlcnIhPVpfT0spCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZXJyPT1aX09LKQotICAgICAgICByZXR1cm4gaVJlYWQ7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKgotICBHaXZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHVuY29tcHJlc3NlZCBkYXRhCi0qLwotZXh0ZXJuIHpfb2ZmX3QgWkVYUE9SVCB1bnp0ZWxsICh1bnpGaWxlIGZpbGUpCi17Ci0gICAgdW56NjRfcyogczsKLSAgICBmaWxlX2luX3ppcDY0X3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOwotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0gICAgcz0odW56NjRfcyopZmlsZTsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvPXMtPnBmaWxlX2luX3ppcF9yZWFkOwotCi0gICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm89PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLQotICAgIHJldHVybiAoel9vZmZfdClwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0udG90YWxfb3V0OwotfQotCi1leHRlcm4gWlBPUzY0X1QgWkVYUE9SVCB1bnp0ZWxsNjQgKHVuekZpbGUgZmlsZSkKLXsKLQotICAgIHVuejY0X3MqIHM7Ci0gICAgZmlsZV9pbl96aXA2NF9yZWFkX2luZm9fcyogcGZpbGVfaW5femlwX3JlYWRfaW5mbzsKLSAgICBpZiAoZmlsZT09TlVMTCkKLSAgICAgICAgcmV0dXJuIChaUE9TNjRfVCktMTsKLSAgICBzPSh1bno2NF9zKilmaWxlOwotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm89cy0+cGZpbGVfaW5femlwX3JlYWQ7Ci0KLSAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKLSAgICAgICAgcmV0dXJuIChaUE9TNjRfVCktMTsKLQotICAgIHJldHVybiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT50b3RhbF9vdXRfNjQ7Ci19Ci0KLQotLyoKLSAgcmV0dXJuIDEgaWYgdGhlIGVuZCBvZiBmaWxlIHdhcyByZWFjaGVkLCAwIGVsc2V3aGVyZQotKi8KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnplb2YgKHVuekZpbGUgZmlsZSkKLXsKLSAgICB1bno2NF9zKiBzOwotICAgIGZpbGVfaW5femlwNjRfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87Ci0gICAgaWYgKGZpbGU9PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLSAgICBzPSh1bno2NF9zKilmaWxlOwotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm89cy0+cGZpbGVfaW5femlwX3JlYWQ7Ci0KLSAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotCi0gICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQgPT0gMCkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLQotCi0KLS8qCi1SZWFkIGV4dHJhIGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgZmlsZSAob3BlbmVkIGJ5IHVuek9wZW5DdXJyZW50RmlsZSkKLVRoaXMgaXMgdGhlIGxvY2FsLWhlYWRlciB2ZXJzaW9uIG9mIHRoZSBleHRyYSBmaWVsZCAoc29tZXRpbWVzLCB0aGVyZSBpcwotbW9yZSBpbmZvIGluIHRoZSBsb2NhbC1oZWFkZXIgdmVyc2lvbiB0aGFuIGluIHRoZSBjZW50cmFsLWhlYWRlcikKLQotICBpZiBidWY9PU5VTEwsIGl0IHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbG9jYWwgZXh0cmEgZmllbGQgdGhhdCBjYW4gYmUgcmVhZAotCi0gIGlmIGJ1ZiE9TlVMTCwgbGVuIGlzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIsIHRoZSBleHRyYSBoZWFkZXIgaXMgY29waWVkIGluCi0gICAgYnVmLgotICB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGluIGJ1Ziwgb3IgKGlmIDwwKQotICAgIHRoZSBlcnJvciBjb2RlCi0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldExvY2FsRXh0cmFmaWVsZCAodW56RmlsZSBmaWxlLCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbikKLXsKLSAgICB1bno2NF9zKiBzOwotICAgIGZpbGVfaW5femlwNjRfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87Ci0gICAgdUludCByZWFkX25vdzsKLSAgICBaUE9TNjRfVCBzaXplX3RvX3JlYWQ7Ci0KLSAgICBpZiAoZmlsZT09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotICAgIHM9KHVuejY0X3MqKWZpbGU7Ci0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mbz1zLT5wZmlsZV9pbl96aXBfcmVhZDsKLQotICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0KLSAgICBzaXplX3RvX3JlYWQgPSAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+c2l6ZV9sb2NhbF9leHRyYWZpZWxkIC0KLSAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfbG9jYWxfZXh0cmFmaWVsZCk7Ci0KLSAgICBpZiAoYnVmPT1OVUxMKQotICAgICAgICByZXR1cm4gKGludClzaXplX3RvX3JlYWQ7Ci0KLSAgICBpZiAobGVuPnNpemVfdG9fcmVhZCkKLSAgICAgICAgcmVhZF9ub3cgPSAodUludClzaXplX3RvX3JlYWQ7Ci0gICAgZWxzZQotICAgICAgICByZWFkX25vdyA9ICh1SW50KWxlbiA7Ci0KLSAgICBpZiAocmVhZF9ub3c9PTApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKFpTRUVLNjQocGZpbGVfaW5femlwX3JlYWRfaW5mby0+el9maWxlZnVuYywKLSAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+ZmlsZXN0cmVhbSwKLSAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+b2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQgKwotICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfbG9jYWxfZXh0cmFmaWVsZCwKLSAgICAgICAgICAgICAgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCi0gICAgICAgIHJldHVybiBVTlpfRVJSTk87Ci0KLSAgICBpZiAoWlJFQUQ2NChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT56X2ZpbGVmdW5jLAotICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5maWxlc3RyZWFtLAotICAgICAgICAgICAgICBidWYscmVhZF9ub3cpIT1yZWFkX25vdykKLSAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsKLQotICAgIHJldHVybiAoaW50KXJlYWRfbm93OwotfQotCi0vKgotICBDbG9zZSB0aGUgZmlsZSBpbiB6aXAgb3BlbmVkIHdpdGggdW56aXBPcGVuQ3VycmVudEZpbGUKLSAgUmV0dXJuIFVOWl9DUkNFUlJPUiBpZiBhbGwgdGhlIGZpbGUgd2FzIHJlYWQgYnV0IHRoZSBDUkMgaXMgbm90IGdvb2QKLSovCi1leHRlcm4gaW50IFpFWFBPUlQgdW56Q2xvc2VDdXJyZW50RmlsZSAodW56RmlsZSBmaWxlKQotewotICAgIGludCBlcnI9VU5aX09LOwotCi0gICAgdW56NjRfcyogczsKLSAgICBmaWxlX2luX3ppcDY0X3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOwotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0gICAgcz0odW56NjRfcyopZmlsZTsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvPXMtPnBmaWxlX2luX3ppcF9yZWFkOwotCi0gICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm89PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLQotCi0gICAgaWYgKChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfdW5jb21wcmVzc2VkID09IDApICYmCi0gICAgICAgICghcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmF3KSkKLSAgICB7Ci0gICAgICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMiAhPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMl93YWl0KQotICAgICAgICAgICAgZXJyPVVOWl9DUkNFUlJPUjsKLSAgICB9Ci0KLQotICAgIFRSWUZSRUUocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXIpOwotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlYWRfYnVmZmVyID0gTlVMTDsKLSAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtX2luaXRpYWxpc2VkID09IFpfREVGTEFURUQpCi0gICAgICAgIGluZmxhdGVFbmQoJnBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbSk7Ci0jaWZkZWYgSEFWRV9CWklQMgotICAgIGVsc2UgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbV9pbml0aWFsaXNlZCA9PSBaX0JaSVAyRUQpCi0gICAgICAgIEJaMl9iekRlY29tcHJlc3NFbmQoJnBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0pOwotI2VuZGlmCi0KLQotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbV9pbml0aWFsaXNlZCA9IDA7Ci0gICAgVFJZRlJFRShwZmlsZV9pbl96aXBfcmVhZF9pbmZvKTsKLQotICAgIHMtPnBmaWxlX2luX3ppcF9yZWFkPU5VTEw7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qCi0gIEdldCB0aGUgZ2xvYmFsIGNvbW1lbnQgc3RyaW5nIG9mIHRoZSBaaXBGaWxlLCBpbiB0aGUgc3pDb21tZW50IGJ1ZmZlci4KLSAgdVNpemVCdWYgaXMgdGhlIHNpemUgb2YgdGhlIHN6Q29tbWVudCBidWZmZXIuCi0gIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGUgY29waWVkIG9yIGFuIGVycm9yIGNvZGUgPDAKLSovCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R2V0R2xvYmFsQ29tbWVudCAodW56RmlsZSBmaWxlLCBjaGFyICogc3pDb21tZW50LCB1TG9uZyB1U2l6ZUJ1ZikKLXsKLSAgICB1bno2NF9zKiBzOwotICAgIHVMb25nIHVSZWFkVGhpcyA7Ci0gICAgaWYgKGZpbGU9PU5VTEwpCi0gICAgICAgIHJldHVybiAoaW50KVVOWl9QQVJBTUVSUk9SOwotICAgIHM9KHVuejY0X3MqKWZpbGU7Ci0KLSAgICB1UmVhZFRoaXMgPSB1U2l6ZUJ1ZjsKLSAgICBpZiAodVJlYWRUaGlzPnMtPmdpLnNpemVfY29tbWVudCkKLSAgICAgICAgdVJlYWRUaGlzID0gcy0+Z2kuc2l6ZV9jb21tZW50OwotCi0gICAgaWYgKFpTRUVLNjQocy0+el9maWxlZnVuYyxzLT5maWxlc3RyZWFtLHMtPmNlbnRyYWxfcG9zKzIyLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQotICAgICAgICByZXR1cm4gVU5aX0VSUk5POwotCi0gICAgaWYgKHVSZWFkVGhpcz4wKQotICAgIHsKLSAgICAgICpzekNvbW1lbnQ9J1wwJzsKLSAgICAgIGlmIChaUkVBRDY0KHMtPnpfZmlsZWZ1bmMscy0+ZmlsZXN0cmVhbSxzekNvbW1lbnQsdVJlYWRUaGlzKSE9dVJlYWRUaGlzKQotICAgICAgICByZXR1cm4gVU5aX0VSUk5POwotICAgIH0KLQotICAgIGlmICgoc3pDb21tZW50ICE9IE5VTEwpICYmICh1U2l6ZUJ1ZiA+IHMtPmdpLnNpemVfY29tbWVudCkpCi0gICAgICAgICooc3pDb21tZW50K3MtPmdpLnNpemVfY29tbWVudCk9J1wwJzsKLSAgICByZXR1cm4gKGludCl1UmVhZFRoaXM7Ci19Ci0KLS8qIEFkZGl0aW9ucyBieSBSWCAnMjAwNCAqLwotZXh0ZXJuIFpQT1M2NF9UIFpFWFBPUlQgdW56R2V0T2Zmc2V0NjQodW56RmlsZSBmaWxlKQotewotICAgIHVuejY0X3MqIHM7Ci0KLSAgICBpZiAoZmlsZT09TlVMTCkKLSAgICAgICAgICByZXR1cm4gMDsgLy9VTlpfUEFSQU1FUlJPUjsKLSAgICBzPSh1bno2NF9zKilmaWxlOwotICAgIGlmICghcy0+Y3VycmVudF9maWxlX29rKQotICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKHMtPmdpLm51bWJlcl9lbnRyeSAhPSAwICYmIHMtPmdpLm51bWJlcl9lbnRyeSAhPSAweGZmZmYpCi0gICAgICBpZiAocy0+bnVtX2ZpbGU9PXMtPmdpLm51bWJlcl9lbnRyeSkKLSAgICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBzLT5wb3NfaW5fY2VudHJhbF9kaXI7Ci19Ci0KLWV4dGVybiB1TG9uZyBaRVhQT1JUIHVuekdldE9mZnNldCAodW56RmlsZSBmaWxlKQotewotICAgIFpQT1M2NF9UIG9mZnNldDY0OwotCi0gICAgaWYgKGZpbGU9PU5VTEwpCi0gICAgICAgICAgcmV0dXJuIDA7IC8vVU5aX1BBUkFNRVJST1I7Ci0gICAgb2Zmc2V0NjQgPSB1bnpHZXRPZmZzZXQ2NChmaWxlKTsKLSAgICByZXR1cm4gKHVMb25nKW9mZnNldDY0OwotfQotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56U2V0T2Zmc2V0NjQodW56RmlsZSBmaWxlLCBaUE9TNjRfVCBwb3MpCi17Ci0gICAgdW56NjRfcyogczsKLSAgICBpbnQgZXJyOwotCi0gICAgaWYgKGZpbGU9PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLSAgICBzPSh1bno2NF9zKilmaWxlOwotCi0gICAgcy0+cG9zX2luX2NlbnRyYWxfZGlyID0gcG9zOwotICAgIHMtPm51bV9maWxlID0gcy0+Z2kubnVtYmVyX2VudHJ5OyAgICAgIC8qIGhhY2sgKi8KLSAgICBlcnIgPSB1bno2NGxvY2FsX0dldEN1cnJlbnRGaWxlSW5mb0ludGVybmFsKGZpbGUsJnMtPmN1cl9maWxlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwwLE5VTEwsMCxOVUxMLDApOwotICAgIHMtPmN1cnJlbnRfZmlsZV9vayA9IChlcnIgPT0gVU5aX09LKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56U2V0T2Zmc2V0ICh1bnpGaWxlIGZpbGUsIHVMb25nIHBvcykKLXsKLSAgICByZXR1cm4gdW56U2V0T2Zmc2V0NjQoZmlsZSxwb3MpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9taW5pemlwL3VuemlwLmggYi9zcmMvemxpYi9jb250cmliL21pbml6aXAvdW56aXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4Mzk2OC4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL21pbml6aXAvdW56aXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzNyArMCwwIEBACi0vKiB1bnppcC5oIC0tIElPIGZvciB1bmNvbXByZXNzIC56aXAgZmlsZXMgdXNpbmcgemxpYgotICAgVmVyc2lvbiAxLjEsIEZlYnJ1YXJ5IDE0aCwgMjAxMAotICAgcGFydCBvZiB0aGUgTWluaVppcCBwcm9qZWN0IC0gKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCi0KLSAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDEwIEdpbGxlcyBWb2xsYW50IChtaW5pemlwKSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKLQotICAgICAgICAgTW9kaWZpY2F0aW9ucyBvZiBVbnppcCBmb3IgWmlwNjQKLSAgICAgICAgIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEV2ZW4gUm91YXVsdAotCi0gICAgICAgICBNb2RpZmljYXRpb25zIGZvciBaaXA2NCBzdXBwb3J0IG9uIGJvdGggemlwIGFuZCB1bnppcAotICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTWF0aGlhcyBTdmVuc3NvbiAoIGh0dHA6Ly9yZXN1bHQ0Mi5jb20gKQotCi0gICAgICAgICBGb3IgbW9yZSBpbmZvIHJlYWQgTWluaVppcF9pbmZvLnR4dAotCi0gICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBDb25kaXRpb24gb2YgdXNlIGFuZCBkaXN0cmlidXRpb24gYXJlIHRoZSBzYW1lIHRoYW4gemxpYiA6Ci0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIENoYW5nZXMKLQotICAgICAgICBTZWUgaGVhZGVyIG9mIHVuemlwNjQuYwotCi0qLwotCi0jaWZuZGVmIF91bno2NF9ICi0jZGVmaW5lIF91bno2NF9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmbmRlZiBfWkxJQl9ICi0jaW5jbHVkZSAiemxpYi5oIgotI2VuZGlmCi0KLSNpZm5kZWYgIF9aTElCSU9BUElfSAotI2luY2x1ZGUgImlvYXBpLmgiCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQlpJUDIKLSNpbmNsdWRlICJiemxpYi5oIgotI2VuZGlmCi0KLSNkZWZpbmUgWl9CWklQMkVEIDEyCi0KLSNpZiBkZWZpbmVkKFNUUklDVFVOWklQKSB8fCBkZWZpbmVkKFNUUklDVFpJUFVOWklQKQotLyogbGlrZSB0aGUgU1RSSUNUIG9mIFdJTjMyLCB3ZSBkZWZpbmUgYSBwb2ludGVyIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZAotICAgIGZyb20gKHZvaWQqKSB3aXRob3V0IGNhc3QgKi8KLXR5cGVkZWYgc3RydWN0IFRhZ3VuekZpbGVfXyB7IGludCB1bnVzZWQ7IH0gdW56RmlsZV9fOwotdHlwZWRlZiB1bnpGaWxlX18gKnVuekZpbGU7Ci0jZWxzZQotdHlwZWRlZiB2b2lkcCB1bnpGaWxlOwotI2VuZGlmCi0KLQotI2RlZmluZSBVTlpfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICgwKQotI2RlZmluZSBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRSAgICAgICAgICgtMTAwKQotI2RlZmluZSBVTlpfRVJSTk8gICAgICAgICAgICAgICAgICAgICAgIChaX0VSUk5PKQotI2RlZmluZSBVTlpfRU9GICAgICAgICAgICAgICAgICAgICAgICAgICgwKQotI2RlZmluZSBVTlpfUEFSQU1FUlJPUiAgICAgICAgICAgICAgICAgICgtMTAyKQotI2RlZmluZSBVTlpfQkFEWklQRklMRSAgICAgICAgICAgICAgICAgICgtMTAzKQotI2RlZmluZSBVTlpfSU5URVJOQUxFUlJPUiAgICAgICAgICAgICAgICgtMTA0KQotI2RlZmluZSBVTlpfQ1JDRVJST1IgICAgICAgICAgICAgICAgICAgICgtMTA1KQotCi0vKiB0bV91bnogY29udGFpbiBkYXRlL3RpbWUgaW5mbyAqLwotdHlwZWRlZiBzdHJ1Y3QgdG1fdW56X3MKLXsKLSAgICB1SW50IHRtX3NlYzsgICAgICAgICAgICAvKiBzZWNvbmRzIGFmdGVyIHRoZSBtaW51dGUgLSBbMCw1OV0gKi8KLSAgICB1SW50IHRtX21pbjsgICAgICAgICAgICAvKiBtaW51dGVzIGFmdGVyIHRoZSBob3VyIC0gWzAsNTldICovCi0gICAgdUludCB0bV9ob3VyOyAgICAgICAgICAgLyogaG91cnMgc2luY2UgbWlkbmlnaHQgLSBbMCwyM10gKi8KLSAgICB1SW50IHRtX21kYXk7ICAgICAgICAgICAvKiBkYXkgb2YgdGhlIG1vbnRoIC0gWzEsMzFdICovCi0gICAgdUludCB0bV9tb247ICAgICAgICAgICAgLyogbW9udGhzIHNpbmNlIEphbnVhcnkgLSBbMCwxMV0gKi8KLSAgICB1SW50IHRtX3llYXI7ICAgICAgICAgICAvKiB5ZWFycyAtIFsxOTgwLi4yMDQ0XSAqLwotfSB0bV91bno7Ci0KLS8qIHVuel9nbG9iYWxfaW5mbyBzdHJ1Y3R1cmUgY29udGFpbiBnbG9iYWwgZGF0YSBhYm91dCB0aGUgWklQZmlsZQotICAgVGhlc2UgZGF0YSBjb21lcyBmcm9tIHRoZSBlbmQgb2YgY2VudHJhbCBkaXIgKi8KLXR5cGVkZWYgc3RydWN0IHVuel9nbG9iYWxfaW5mbzY0X3MKLXsKLSAgICBaUE9TNjRfVCBudW1iZXJfZW50cnk7ICAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2VudHJhbCBkaXIgb24gdGhpcyBkaXNrICovCi0gICAgdUxvbmcgc2l6ZV9jb21tZW50OyAgICAgICAgIC8qIHNpemUgb2YgdGhlIGdsb2JhbCBjb21tZW50IG9mIHRoZSB6aXBmaWxlICovCi19IHVuel9nbG9iYWxfaW5mbzY0OwotCi10eXBlZGVmIHN0cnVjdCB1bnpfZ2xvYmFsX2luZm9fcwotewotICAgIHVMb25nIG51bWJlcl9lbnRyeTsgICAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjZW50cmFsIGRpciBvbiB0aGlzIGRpc2sgKi8KLSAgICB1TG9uZyBzaXplX2NvbW1lbnQ7ICAgICAgICAgLyogc2l6ZSBvZiB0aGUgZ2xvYmFsIGNvbW1lbnQgb2YgdGhlIHppcGZpbGUgKi8KLX0gdW56X2dsb2JhbF9pbmZvOwotCi0vKiB1bnpfZmlsZV9pbmZvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlIGluIHRoZSB6aXBmaWxlICovCi10eXBlZGVmIHN0cnVjdCB1bnpfZmlsZV9pbmZvNjRfcwotewotICAgIHVMb25nIHZlcnNpb247ICAgICAgICAgICAgICAvKiB2ZXJzaW9uIG1hZGUgYnkgICAgICAgICAgICAgICAgIDIgYnl0ZXMgKi8KLSAgICB1TG9uZyB2ZXJzaW9uX25lZWRlZDsgICAgICAgLyogdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCAgICAgICAyIGJ5dGVzICovCi0gICAgdUxvbmcgZmxhZzsgICAgICAgICAgICAgICAgIC8qIGdlbmVyYWwgcHVycG9zZSBiaXQgZmxhZyAgICAgICAgMiBieXRlcyAqLwotICAgIHVMb25nIGNvbXByZXNzaW9uX21ldGhvZDsgICAvKiBjb21wcmVzc2lvbiBtZXRob2QgICAgICAgICAgICAgIDIgYnl0ZXMgKi8KLSAgICB1TG9uZyBkb3NEYXRlOyAgICAgICAgICAgICAgLyogbGFzdCBtb2QgZmlsZSBkYXRlIGluIERvcyBmbXQgICA0IGJ5dGVzICovCi0gICAgdUxvbmcgY3JjOyAgICAgICAgICAgICAgICAgIC8qIGNyYy0zMiAgICAgICAgICAgICAgICAgICAgICAgICAgNCBieXRlcyAqLwotICAgIFpQT1M2NF9UIGNvbXByZXNzZWRfc2l6ZTsgICAvKiBjb21wcmVzc2VkIHNpemUgICAgICAgICAgICAgICAgIDggYnl0ZXMgKi8KLSAgICBaUE9TNjRfVCB1bmNvbXByZXNzZWRfc2l6ZTsgLyogdW5jb21wcmVzc2VkIHNpemUgICAgICAgICAgICAgICA4IGJ5dGVzICovCi0gICAgdUxvbmcgc2l6ZV9maWxlbmFtZTsgICAgICAgIC8qIGZpbGVuYW1lIGxlbmd0aCAgICAgICAgICAgICAgICAgMiBieXRlcyAqLwotICAgIHVMb25nIHNpemVfZmlsZV9leHRyYTsgICAgICAvKiBleHRyYSBmaWVsZCBsZW5ndGggICAgICAgICAgICAgIDIgYnl0ZXMgKi8KLSAgICB1TG9uZyBzaXplX2ZpbGVfY29tbWVudDsgICAgLyogZmlsZSBjb21tZW50IGxlbmd0aCAgICAgICAgICAgICAyIGJ5dGVzICovCi0KLSAgICB1TG9uZyBkaXNrX251bV9zdGFydDsgICAgICAgLyogZGlzayBudW1iZXIgc3RhcnQgICAgICAgICAgICAgICAyIGJ5dGVzICovCi0gICAgdUxvbmcgaW50ZXJuYWxfZmE7ICAgICAgICAgIC8qIGludGVybmFsIGZpbGUgYXR0cmlidXRlcyAgICAgICAgMiBieXRlcyAqLwotICAgIHVMb25nIGV4dGVybmFsX2ZhOyAgICAgICAgICAvKiBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgICAgICAgIDQgYnl0ZXMgKi8KLQotICAgIHRtX3VueiB0bXVfZGF0ZTsKLX0gdW56X2ZpbGVfaW5mbzY0OwotCi10eXBlZGVmIHN0cnVjdCB1bnpfZmlsZV9pbmZvX3MKLXsKLSAgICB1TG9uZyB2ZXJzaW9uOyAgICAgICAgICAgICAgLyogdmVyc2lvbiBtYWRlIGJ5ICAgICAgICAgICAgICAgICAyIGJ5dGVzICovCi0gICAgdUxvbmcgdmVyc2lvbl9uZWVkZWQ7ICAgICAgIC8qIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgICAgICAgMiBieXRlcyAqLwotICAgIHVMb25nIGZsYWc7ICAgICAgICAgICAgICAgICAvKiBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWcgICAgICAgIDIgYnl0ZXMgKi8KLSAgICB1TG9uZyBjb21wcmVzc2lvbl9tZXRob2Q7ICAgLyogY29tcHJlc3Npb24gbWV0aG9kICAgICAgICAgICAgICAyIGJ5dGVzICovCi0gICAgdUxvbmcgZG9zRGF0ZTsgICAgICAgICAgICAgIC8qIGxhc3QgbW9kIGZpbGUgZGF0ZSBpbiBEb3MgZm10ICAgNCBieXRlcyAqLwotICAgIHVMb25nIGNyYzsgICAgICAgICAgICAgICAgICAvKiBjcmMtMzIgICAgICAgICAgICAgICAgICAgICAgICAgIDQgYnl0ZXMgKi8KLSAgICB1TG9uZyBjb21wcmVzc2VkX3NpemU7ICAgICAgLyogY29tcHJlc3NlZCBzaXplICAgICAgICAgICAgICAgICA0IGJ5dGVzICovCi0gICAgdUxvbmcgdW5jb21wcmVzc2VkX3NpemU7ICAgIC8qIHVuY29tcHJlc3NlZCBzaXplICAgICAgICAgICAgICAgNCBieXRlcyAqLwotICAgIHVMb25nIHNpemVfZmlsZW5hbWU7ICAgICAgICAvKiBmaWxlbmFtZSBsZW5ndGggICAgICAgICAgICAgICAgIDIgYnl0ZXMgKi8KLSAgICB1TG9uZyBzaXplX2ZpbGVfZXh0cmE7ICAgICAgLyogZXh0cmEgZmllbGQgbGVuZ3RoICAgICAgICAgICAgICAyIGJ5dGVzICovCi0gICAgdUxvbmcgc2l6ZV9maWxlX2NvbW1lbnQ7ICAgIC8qIGZpbGUgY29tbWVudCBsZW5ndGggICAgICAgICAgICAgMiBieXRlcyAqLwotCi0gICAgdUxvbmcgZGlza19udW1fc3RhcnQ7ICAgICAgIC8qIGRpc2sgbnVtYmVyIHN0YXJ0ICAgICAgICAgICAgICAgMiBieXRlcyAqLwotICAgIHVMb25nIGludGVybmFsX2ZhOyAgICAgICAgICAvKiBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgICAgICAgIDIgYnl0ZXMgKi8KLSAgICB1TG9uZyBleHRlcm5hbF9mYTsgICAgICAgICAgLyogZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzICAgICAgICA0IGJ5dGVzICovCi0KLSAgICB0bV91bnogdG11X2RhdGU7Ci19IHVuel9maWxlX2luZm87Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpTdHJpbmdGaWxlTmFtZUNvbXBhcmUgT0YgKChjb25zdCBjaGFyKiBmaWxlTmFtZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZU5hbWUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpQ2FzZVNlbnNpdGl2aXR5KSk7Ci0vKgotICAgQ29tcGFyZSB0d28gZmlsZW5hbWUgKGZpbGVOYW1lMSxmaWxlTmFtZTIpLgotICAgSWYgaUNhc2VTZW5pc2l2aXR5ID0gMSwgY29tcGFyaXNpb24gaXMgY2FzZSBzZW5zaXRpdml0eSAobGlrZSBzdHJjbXApCi0gICBJZiBpQ2FzZVNlbmlzaXZpdHkgPSAyLCBjb21wYXJpc2lvbiBpcyBub3QgY2FzZSBzZW5zaXRpdml0eSAobGlrZSBzdHJjbXBpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHN0cmNhc2VjbXApCi0gICBJZiBpQ2FzZVNlbmlzaXZpdHkgPSAwLCBjYXNlIHNlbnNpdGl2aXR5IGlzIGRlZmF1dCBvZiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0KLSAgICAobGlrZSAxIG9uIFVuaXgsIDIgb24gV2luZG93cykKLSovCi0KLQotZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuIE9GKChjb25zdCBjaGFyICpwYXRoKSk7Ci1leHRlcm4gdW56RmlsZSBaRVhQT1JUIHVuek9wZW42NCBPRigoY29uc3Qgdm9pZCAqcGF0aCkpOwotLyoKLSAgT3BlbiBhIFppcCBmaWxlLiBwYXRoIGNvbnRhaW4gdGhlIGZ1bGwgcGF0aG5hbWUgKGJ5IGV4YW1wbGUsCi0gICAgIG9uIGEgV2luZG93cyBYUCBjb21wdXRlciAiYzpcXHpsaWJcXHpsaWIxMTMuemlwIiBvciBvbiBhbiBVbml4IGNvbXB1dGVyCi0gICAgICJ6bGliL3psaWIxMTMuemlwIi4KLSAgICAgSWYgdGhlIHppcGZpbGUgY2Fubm90IGJlIG9wZW5lZCAoZmlsZSBkb24ndCBleGlzdCBvciBpbiBub3QgdmFsaWQpLCB0aGUKLSAgICAgICByZXR1cm4gdmFsdWUgaXMgTlVMTC4KLSAgICAgRWxzZSwgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHVuekZpbGUgSGFuZGxlLCB1c2FibGUgd2l0aCBvdGhlciBmdW5jdGlvbgotICAgICAgIG9mIHRoaXMgdW56aXAgcGFja2FnZS4KLSAgICAgdGhlICI2NCIgZnVuY3Rpb24gdGFrZSBhIGNvbnN0IHZvaWQqIHBvaW50ZXIsIGJlY2F1c2UgdGhlIHBhdGggaXMganVzdCB0aGUKLSAgICAgICB2YWx1ZSBwYXNzZWQgdG8gdGhlIG9wZW42NF9maWxlX2Z1bmMgY2FsbGJhY2suCi0gICAgIFVuZGVyIFdpbmRvd3MsIGlmIFVOSUNPREUgaXMgZGVmaW5lZCwgdXNpbmcgZmlsbF9mb3BlbjY0X2ZpbGVmdW5jLCB0aGUgcGF0aAotICAgICAgIGlzIGEgcG9pbnRlciB0byBhIHdpZGUgdW5pY29kZSBzdHJpbmcgKExQQ1RTVFIgaXMgTFBDV1NUUiksIHNvIGNvbnN0IGNoYXIqCi0gICAgICAgZG9lcyBub3QgZGVzY3JpYmUgdGhlIHJlYWxpdHkKLSovCi0KLQotZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuMiBPRigoY29uc3QgY2hhciAqcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsKLS8qCi0gICBPcGVuIGEgWmlwIGZpbGUsIGxpa2UgdW56T3BlbiwgYnV0IHByb3ZpZGUgYSBzZXQgb2YgZmlsZSBsb3cgbGV2ZWwgQVBJCi0gICAgICBmb3IgcmVhZC93cml0ZSB0aGUgemlwIGZpbGUgKHNlZSBpb2FwaS5oKQotKi8KLQotZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuMl82NCBPRigoY29uc3Qgdm9pZCAqcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpsaWJfZmlsZWZ1bmM2NF9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikpOwotLyoKLSAgIE9wZW4gYSBaaXAgZmlsZSwgbGlrZSB1bno2NE9wZW4sIGJ1dCBwcm92aWRlIGEgc2V0IG9mIGZpbGUgbG93IGxldmVsIEFQSQotICAgICAgZm9yIHJlYWQvd3JpdGUgdGhlIHppcCBmaWxlIChzZWUgaW9hcGkuaCkKLSovCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpDbG9zZSBPRigodW56RmlsZSBmaWxlKSk7Ci0vKgotICBDbG9zZSBhIFppcEZpbGUgb3BlbmVkIHdpdGggdW56aXBPcGVuLgotICBJZiB0aGVyZSBpcyBmaWxlcyBpbnNpZGUgdGhlIC5aaXAgb3BlbmVkIHdpdGggdW56T3BlbkN1cnJlbnRGaWxlIChzZWUgbGF0ZXIpLAotICAgIHRoZXNlIGZpbGVzIE1VU1QgYmUgY2xvc2VkIHdpdGggdW56aXBDbG9zZUN1cnJlbnRGaWxlIGJlZm9yZSBjYWxsIHVuemlwQ2xvc2UuCi0gIHJldHVybiBVTlpfT0sgaWYgdGhlcmUgaXMgbm8gcHJvYmxlbS4gKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEdsb2JhbEluZm8gT0YoKHVuekZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZ2xvYmFsX2luZm8gKnBnbG9iYWxfaW5mbykpOwotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R2V0R2xvYmFsSW5mbzY0IE9GKCh1bnpGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW56X2dsb2JhbF9pbmZvNjQgKnBnbG9iYWxfaW5mbykpOwotLyoKLSAgV3JpdGUgaW5mbyBhYm91dCB0aGUgWmlwRmlsZSBpbiB0aGUgKnBnbG9iYWxfaW5mbyBzdHJ1Y3R1cmUuCi0gIE5vIHByZXBhcmF0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgaXMgbmVlZGVkCi0gIHJldHVybiBVTlpfT0sgaWYgdGhlcmUgaXMgbm8gcHJvYmxlbS4gKi8KLQotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R2V0R2xvYmFsQ29tbWVudCBPRigodW56RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN6Q29tbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyB1U2l6ZUJ1ZikpOwotLyoKLSAgR2V0IHRoZSBnbG9iYWwgY29tbWVudCBzdHJpbmcgb2YgdGhlIFppcEZpbGUsIGluIHRoZSBzekNvbW1lbnQgYnVmZmVyLgotICB1U2l6ZUJ1ZiBpcyB0aGUgc2l6ZSBvZiB0aGUgc3pDb21tZW50IGJ1ZmZlci4KLSAgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZSBjb3BpZWQgb3IgYW4gZXJyb3IgY29kZSA8MAotKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVW56aXAgcGFja2FnZSBhbGxvdyB5b3UgYnJvd3NlIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIHppcGZpbGUgKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9GaXJzdEZpbGUgT0YoKHVuekZpbGUgZmlsZSkpOwotLyoKLSAgU2V0IHRoZSBjdXJyZW50IGZpbGUgb2YgdGhlIHppcGZpbGUgdG8gdGhlIGZpcnN0IGZpbGUuCi0gIHJldHVybiBVTlpfT0sgaWYgdGhlcmUgaXMgbm8gcHJvYmxlbQotKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9OZXh0RmlsZSBPRigodW56RmlsZSBmaWxlKSk7Ci0vKgotICBTZXQgdGhlIGN1cnJlbnQgZmlsZSBvZiB0aGUgemlwZmlsZSB0byB0aGUgbmV4dCBmaWxlLgotICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0KLSAgcmV0dXJuIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFIGlmIHRoZSBhY3R1YWwgZmlsZSB3YXMgdGhlIGxhdGVzdC4KLSovCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpMb2NhdGVGaWxlIE9GKCh1bnpGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzekZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgaW50IGlDYXNlU2Vuc2l0aXZpdHkpKTsKLS8qCi0gIFRyeSBsb2NhdGUgdGhlIGZpbGUgc3pGaWxlTmFtZSBpbiB0aGUgemlwZmlsZS4KLSAgRm9yIHRoZSBpQ2FzZVNlbnNpdGl2aXR5IHNpZ25pZmljYXRpb24sIHNlZSB1bnpTdHJpbmdGaWxlTmFtZUNvbXBhcmUKLQotICByZXR1cm4gdmFsdWUgOgotICBVTlpfT0sgaWYgdGhlIGZpbGUgaXMgZm91bmQuIEl0IGJlY29tZXMgdGhlIGN1cnJlbnQgZmlsZS4KLSAgVU5aX0VORF9PRl9MSVNUX09GX0ZJTEUgaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kCi0qLwotCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogUnlhbiBzdXBwbGllZCBmdW5jdGlvbnMgKi8KLS8qIHVuel9maWxlX2luZm8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBhIGZpbGUgaW4gdGhlIHppcGZpbGUgKi8KLXR5cGVkZWYgc3RydWN0IHVuel9maWxlX3Bvc19zCi17Ci0gICAgdUxvbmcgcG9zX2luX3ppcF9kaXJlY3Rvcnk7ICAgLyogb2Zmc2V0IGluIHppcCBmaWxlIGRpcmVjdG9yeSAqLwotICAgIHVMb25nIG51bV9vZl9maWxlOyAgICAgICAgICAgIC8qICMgb2YgZmlsZSAqLwotfSB1bnpfZmlsZV9wb3M7Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRGaWxlUG9zKAotICAgIHVuekZpbGUgZmlsZSwKLSAgICB1bnpfZmlsZV9wb3MqIGZpbGVfcG9zKTsKLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9GaWxlUG9zKAotICAgIHVuekZpbGUgZmlsZSwKLSAgICB1bnpfZmlsZV9wb3MqIGZpbGVfcG9zKTsKLQotdHlwZWRlZiBzdHJ1Y3QgdW56NjRfZmlsZV9wb3NfcwotewotICAgIFpQT1M2NF9UIHBvc19pbl96aXBfZGlyZWN0b3J5OyAgIC8qIG9mZnNldCBpbiB6aXAgZmlsZSBkaXJlY3RvcnkgKi8KLSAgICBaUE9TNjRfVCBudW1fb2ZfZmlsZTsgICAgICAgICAgICAvKiAjIG9mIGZpbGUgKi8KLX0gdW56NjRfZmlsZV9wb3M7Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRGaWxlUG9zNjQoCi0gICAgdW56RmlsZSBmaWxlLAotICAgIHVuejY0X2ZpbGVfcG9zKiBmaWxlX3Bvcyk7Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpHb1RvRmlsZVBvczY0KAotICAgIHVuekZpbGUgZmlsZSwKLSAgICBjb25zdCB1bno2NF9maWxlX3BvcyogZmlsZV9wb3MpOwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEN1cnJlbnRGaWxlSW5mbzY0IE9GKCh1bnpGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW56X2ZpbGVfaW5mbzY0ICpwZmlsZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN6RmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZmlsZU5hbWVCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmV4dHJhRmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZXh0cmFGaWVsZEJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pDb21tZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGNvbW1lbnRCdWZmZXJTaXplKSk7Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRDdXJyZW50RmlsZUluZm8gT0YoKHVuekZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZmlsZV9pbmZvICpwZmlsZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN6RmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZmlsZU5hbWVCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmV4dHJhRmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZXh0cmFGaWVsZEJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pDb21tZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGNvbW1lbnRCdWZmZXJTaXplKSk7Ci0vKgotICBHZXQgSW5mbyBhYm91dCB0aGUgY3VycmVudCBmaWxlCi0gIGlmIHBmaWxlX2luZm8hPU5VTEwsIHRoZSAqcGZpbGVfaW5mbyBzdHJ1Y3R1cmUgd2lsbCBjb250YWluIHNvbWVzIGluZm8gYWJvdXQKLSAgICAgICAgdGhlIGN1cnJlbnQgZmlsZQotICBpZiBzekZpbGVOYW1lIT1OVUxMLCB0aGUgZmlsZW1hbmUgc3RyaW5nIHdpbGwgYmUgY29waWVkIGluIHN6RmlsZU5hbWUKLSAgICAgICAgICAgIChmaWxlTmFtZUJ1ZmZlclNpemUgaXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcikKLSAgaWYgZXh0cmFGaWVsZCE9TlVMTCwgdGhlIGV4dHJhIGZpZWxkIGluZm9ybWF0aW9uIHdpbGwgYmUgY29waWVkIGluIGV4dHJhRmllbGQKLSAgICAgICAgICAgIChleHRyYUZpZWxkQnVmZmVyU2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyKS4KLSAgICAgICAgICAgIFRoaXMgaXMgdGhlIENlbnRyYWwtaGVhZGVyIHZlcnNpb24gb2YgdGhlIGV4dHJhIGZpZWxkCi0gIGlmIHN6Q29tbWVudCE9TlVMTCwgdGhlIGNvbW1lbnQgc3RyaW5nIG9mIHRoZSBmaWxlIHdpbGwgYmUgY29waWVkIGluIHN6Q29tbWVudAotICAgICAgICAgICAgKGNvbW1lbnRCdWZmZXJTaXplIGlzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIpCi0qLwotCi0KLS8qKiBBZGRpdGlvbiBmb3IgR0RBTCA6IFNUQVJUICovCi0KLWV4dGVybiBaUE9TNjRfVCBaRVhQT1JUIHVuekdldEN1cnJlbnRGaWxlWlN0cmVhbVBvczY0IE9GKCh1bnpGaWxlIGZpbGUpKTsKLQotLyoqIEFkZGl0aW9uIGZvciBHREFMIDogRU5EICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGZvciByZWFkaW5nIHRoZSBjb250ZW50IG9mIHRoZSBjdXJyZW50IHppcGZpbGUsIHlvdSBjYW4gb3BlbiBpdCwgcmVhZCBkYXRhCi0gICBmcm9tIGl0LCBhbmQgY2xvc2UgaXQgKHlvdSBjYW4gY2xvc2UgaXQgYmVmb3JlIHJlYWRpbmcgYWxsIHRoZSBmaWxlKQotICAgKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZSBPRigodW56RmlsZSBmaWxlKSk7Ci0vKgotICBPcGVuIGZvciByZWFkaW5nIGRhdGEgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZS4KLSAgSWYgdGhlcmUgaXMgbm8gZXJyb3IsIHRoZSByZXR1cm4gdmFsdWUgaXMgVU5aX09LLgotKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZVBhc3N3b3JkIE9GKCh1bnpGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkKSk7Ci0vKgotICBPcGVuIGZvciByZWFkaW5nIGRhdGEgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZS4KLSAgcGFzc3dvcmQgaXMgYSBjcnlwdGluZyBwYXNzd29yZAotICBJZiB0aGVyZSBpcyBubyBlcnJvciwgdGhlIHJldHVybiB2YWx1ZSBpcyBVTlpfT0suCi0qLwotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56T3BlbkN1cnJlbnRGaWxlMiBPRigodW56RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdykpOwotLyoKLSAgU2FtZSB0aGFuIHVuek9wZW5DdXJyZW50RmlsZSwgYnV0IG9wZW4gZm9yIHJlYWQgcmF3IHRoZSBmaWxlIChub3QgdW5jb21wcmVzcykKLSAgICBpZiByYXc9PTEKLSAgKm1ldGhvZCB3aWxsIHJlY2VpdmUgbWV0aG9kIG9mIGNvbXByZXNzaW9uLCAqbGV2ZWwgd2lsbCByZWNlaXZlIGxldmVsIG9mCi0gICAgIGNvbXByZXNzaW9uCi0gIG5vdGUgOiB5b3UgY2FuIHNldCBsZXZlbCBwYXJhbWV0ZXIgYXMgTlVMTCAoaWYgeW91IGRpZCBub3Qgd2FudCBrbm93biBsZXZlbCwKLSAgICAgICAgIGJ1dCB5b3UgQ0FOTk9UIHNldCBtZXRob2QgcGFyYW1ldGVyIGFzIE5VTEwKLSovCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpPcGVuQ3VycmVudEZpbGUzIE9GKCh1bnpGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkKSk7Ci0vKgotICBTYW1lIHRoYW4gdW56T3BlbkN1cnJlbnRGaWxlLCBidXQgb3BlbiBmb3IgcmVhZCByYXcgdGhlIGZpbGUgKG5vdCB1bmNvbXByZXNzKQotICAgIGlmIHJhdz09MQotICAqbWV0aG9kIHdpbGwgcmVjZWl2ZSBtZXRob2Qgb2YgY29tcHJlc3Npb24sICpsZXZlbCB3aWxsIHJlY2VpdmUgbGV2ZWwgb2YKLSAgICAgY29tcHJlc3Npb24KLSAgbm90ZSA6IHlvdSBjYW4gc2V0IGxldmVsIHBhcmFtZXRlciBhcyBOVUxMIChpZiB5b3UgZGlkIG5vdCB3YW50IGtub3duIGxldmVsLAotICAgICAgICAgYnV0IHlvdSBDQU5OT1Qgc2V0IG1ldGhvZCBwYXJhbWV0ZXIgYXMgTlVMTAotKi8KLQotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56Q2xvc2VDdXJyZW50RmlsZSBPRigodW56RmlsZSBmaWxlKSk7Ci0vKgotICBDbG9zZSB0aGUgZmlsZSBpbiB6aXAgb3BlbmVkIHdpdGggdW56T3BlbkN1cnJlbnRGaWxlCi0gIFJldHVybiBVTlpfQ1JDRVJST1IgaWYgYWxsIHRoZSBmaWxlIHdhcyByZWFkIGJ1dCB0aGUgQ1JDIGlzIG5vdCBnb29kCi0qLwotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56UmVhZEN1cnJlbnRGaWxlIE9GKCh1bnpGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgdm9pZHAgYnVmLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbikpOwotLyoKLSAgUmVhZCBieXRlcyBmcm9tIHRoZSBjdXJyZW50IGZpbGUgKG9wZW5lZCBieSB1bnpPcGVuQ3VycmVudEZpbGUpCi0gIGJ1ZiBjb250YWluIGJ1ZmZlciB3aGVyZSBkYXRhIG11c3QgYmUgY29waWVkCi0gIGxlbiB0aGUgc2l6ZSBvZiBidWYuCi0KLSAgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZSBjb3BpZWQgaWYgc29tZXMgYnl0ZXMgYXJlIGNvcGllZAotICByZXR1cm4gMCBpZiB0aGUgZW5kIG9mIGZpbGUgd2FzIHJlYWNoZWQKLSAgcmV0dXJuIDwwIHdpdGggZXJyb3IgY29kZSBpZiB0aGVyZSBpcyBhbiBlcnJvcgotICAgIChVTlpfRVJSTk8gZm9yIElPIGVycm9yLCBvciB6TGliIGVycm9yIGZvciB1bmNvbXByZXNzIGVycm9yKQotKi8KLQotZXh0ZXJuIHpfb2ZmX3QgWkVYUE9SVCB1bnp0ZWxsIE9GKCh1bnpGaWxlIGZpbGUpKTsKLQotZXh0ZXJuIFpQT1M2NF9UIFpFWFBPUlQgdW56dGVsbDY0IE9GKCh1bnpGaWxlIGZpbGUpKTsKLS8qCi0gIEdpdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdW5jb21wcmVzc2VkIGRhdGEKLSovCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnplb2YgT0YoKHVuekZpbGUgZmlsZSkpOwotLyoKLSAgcmV0dXJuIDEgaWYgdGhlIGVuZCBvZiBmaWxlIHdhcyByZWFjaGVkLCAwIGVsc2V3aGVyZQotKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldExvY2FsRXh0cmFmaWVsZCBPRigodW56RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZHAgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuKSk7Ci0vKgotICBSZWFkIGV4dHJhIGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgZmlsZSAob3BlbmVkIGJ5IHVuek9wZW5DdXJyZW50RmlsZSkKLSAgVGhpcyBpcyB0aGUgbG9jYWwtaGVhZGVyIHZlcnNpb24gb2YgdGhlIGV4dHJhIGZpZWxkIChzb21ldGltZXMsIHRoZXJlIGlzCi0gICAgbW9yZSBpbmZvIGluIHRoZSBsb2NhbC1oZWFkZXIgdmVyc2lvbiB0aGFuIGluIHRoZSBjZW50cmFsLWhlYWRlcikKLQotICBpZiBidWY9PU5VTEwsIGl0IHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbG9jYWwgZXh0cmEgZmllbGQKLQotICBpZiBidWYhPU5VTEwsIGxlbiBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLCB0aGUgZXh0cmEgaGVhZGVyIGlzIGNvcGllZCBpbgotICAgIGJ1Zi4KLSAgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbiBidWYsIG9yIChpZiA8MCkKLSAgICB0aGUgZXJyb3IgY29kZQotKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogR2V0IHRoZSBjdXJyZW50IGZpbGUgb2Zmc2V0ICovCi1leHRlcm4gWlBPUzY0X1QgWkVYUE9SVCB1bnpHZXRPZmZzZXQ2NCAodW56RmlsZSBmaWxlKTsKLWV4dGVybiB1TG9uZyBaRVhQT1JUIHVuekdldE9mZnNldCAodW56RmlsZSBmaWxlKTsKLQotLyogU2V0IHRoZSBjdXJyZW50IGZpbGUgb2Zmc2V0ICovCi1leHRlcm4gaW50IFpFWFBPUlQgdW56U2V0T2Zmc2V0NjQgKHVuekZpbGUgZmlsZSwgWlBPUzY0X1QgcG9zKTsKLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpTZXRPZmZzZXQgKHVuekZpbGUgZmlsZSwgdUxvbmcgcG9zKTsKLQotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfdW56NjRfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9taW5pemlwL3ppcC5jIGIvc3JjL3psaWIvY29udHJpYi9taW5pemlwL3ppcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDc5MzRjLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC96aXAuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMDcgKzAsMCBAQAotLyogemlwLmMgLS0gSU8gb24gLnppcCBmaWxlcyB1c2luZyB6bGliCi0gICBWZXJzaW9uIDEuMSwgRmVicnVhcnkgMTRoLCAyMDEwCi0gICBwYXJ0IG9mIHRoZSBNaW5pWmlwIHByb2plY3QgLSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKLQotICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMTAgR2lsbGVzIFZvbGxhbnQgKG1pbml6aXApICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQotCi0gICAgICAgICBNb2RpZmljYXRpb25zIGZvciBaaXA2NCBzdXBwb3J0Ci0gICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBNYXRoaWFzIFN2ZW5zc29uICggaHR0cDovL3Jlc3VsdDQyLmNvbSApCi0KLSAgICAgICAgIEZvciBtb3JlIGluZm8gcmVhZCBNaW5pWmlwX2luZm8udHh0Ci0KLSAgICAgICAgIENoYW5nZXMKLSAgIE9jdC0yMDA5IC0gTWF0aGlhcyBTdmVuc3NvbiAtIFJlbW92ZSBvbGQgQyBzdHlsZSBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICBPY3QtMjAwOSAtIE1hdGhpYXMgU3ZlbnNzb24gLSBBZGRlZCBaaXA2NCBTdXBwb3J0IHdoZW4gY3JlYXRpbmcgbmV3IGZpbGUgYXJjaGl2ZXMKLSAgIE9jdC0yMDA5IC0gTWF0aGlhcyBTdmVuc3NvbiAtIERpZCBzb21lIGNvZGUgY2xlYW51cCBhbmQgcmVmYWN0b3JpbmcgdG8gZ2V0IGJldHRlciBvdmVydmlldyBvZiBzb21lIGZ1bmN0aW9ucy4KLSAgIE9jdC0yMDA5IC0gTWF0aGlhcyBTdmVuc3NvbiAtIEFkZGVkIHppcFJlbW92ZUV4dHJhSW5mb0Jsb2NrIHRvIHN0cmlwIGV4dHJhIGZpZWxkIGRhdGEgZnJvbSBpdHMgWklQNjQgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgdXNlZCB3aGVuIHJlY3JldGluZyB6aXAgYXJjaGl2ZSB3aXRoIFJBVyB3aGVuIGRlbGV0aW5nIGl0ZW1zIGZyb20gYSB6aXAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaSVA2NCBkYXRhIGlzIGF1dG9tYXRpY2x5IGFkZGVkIHRvIGl0ZW1zIHRoYXQgbmVlZHMgaXQsIGFuZCBleGlzdGluZyBaSVA2NCBkYXRhIG5lZWQgdG8gYmUgcmVtb3ZlZC4KLSAgIE9jdC0yMDA5IC0gTWF0aGlhcyBTdmVuc3NvbiAtIEFkZGVkIHN1cHBvcnQgZm9yIEJaSVAyIGFzIGNvbXByZXNzaW9uIG1vZGUgKGJ6aXAyIGxpYiBpcyByZXF1aXJlZCkKLSAgIEphbi0yMDEwIC0gYmFjayB0byB1bnppcCBhbmQgbWluaXppcCAxLjAgbmFtZSBzY2hlbWUsIHdpdGggY29tcGF0aWJpbGl0eSBsYXllcgotCi0qLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlICJ6bGliLmgiCi0jaW5jbHVkZSAiemlwLmgiCi0KLSNpZmRlZiBTVERDCi0jICBpbmNsdWRlIDxzdGRkZWYuaD4KLSMgIGluY2x1ZGUgPHN0cmluZy5oPgotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBOT19FUlJOT19ICi0gICAgZXh0ZXJuIGludCBlcnJubzsKLSNlbHNlCi0jICAgaW5jbHVkZSA8ZXJybm8uaD4KLSNlbmRpZgotCi0KLSNpZm5kZWYgbG9jYWwKLSMgIGRlZmluZSBsb2NhbCBzdGF0aWMKLSNlbmRpZgotLyogY29tcGlsZSB3aXRoIC1EbG9jYWwgaWYgeW91ciBkZWJ1Z2dlciBjYW4ndCBmaW5kIHN0YXRpYyBzeW1ib2xzICovCi0KLSNpZm5kZWYgVkVSU0lPTk1BREVCWQotIyBkZWZpbmUgVkVSU0lPTk1BREVCWSAgICgweDApIC8qIHBsYXRmb3JtIGRlcGVkZW50ICovCi0jZW5kaWYKLQotI2lmbmRlZiBaX0JVRlNJWkUKLSNkZWZpbmUgWl9CVUZTSVpFICg2NCoxMDI0KSAvLygxNjM4NCkKLSNlbmRpZgotCi0jaWZuZGVmIFpfTUFYRklMRU5BTUVJTlpJUAotI2RlZmluZSBaX01BWEZJTEVOQU1FSU5aSVAgKDI1NikKLSNlbmRpZgotCi0jaWZuZGVmIEFMTE9DCi0jIGRlZmluZSBBTExPQyhzaXplKSAobWFsbG9jKHNpemUpKQotI2VuZGlmCi0jaWZuZGVmIFRSWUZSRUUKLSMgZGVmaW5lIFRSWUZSRUUocCkge2lmIChwKSBmcmVlKHApO30KLSNlbmRpZgotCi0vKgotI2RlZmluZSBTSVpFQ0VOVFJBTERJUklURU0gKDB4MmUpCi0jZGVmaW5lIFNJWkVaSVBMT0NBTEhFQURFUiAoMHgxZSkKLSovCi0KLS8qIEkndmUgZm91bmQgYW4gb2xkIFVuaXggKGEgU3VuT1MgNC4xLjNfVTEpIHdpdGhvdXQgYWxsIFNFRUtfKiBkZWZpbmVkLi4uLiAqLwotCi0KLS8vIE5PVCBzdXJlIHRoYXQgdGhpcyB3b3JrIG9uIEFMTCBwbGF0Zm9ybQotI2RlZmluZSBNQUtFVUxPTkc2NChhLCBiKSAoKFpQT1M2NF9UKSgoKHVuc2lnbmVkIGxvbmcpKGEpKSB8ICgoWlBPUzY0X1QpKCh1bnNpZ25lZCBsb25nKShiKSkpIDw8IDMyKSkKLQotI2lmbmRlZiBTRUVLX0NVUgotI2RlZmluZSBTRUVLX0NVUiAgICAxCi0jZW5kaWYKLQotI2lmbmRlZiBTRUVLX0VORAotI2RlZmluZSBTRUVLX0VORCAgICAyCi0jZW5kaWYKLQotI2lmbmRlZiBTRUVLX1NFVAotI2RlZmluZSBTRUVLX1NFVCAgICAwCi0jZW5kaWYKLQotI2lmbmRlZiBERUZfTUVNX0xFVkVMCi0jaWYgTUFYX01FTV9MRVZFTCA+PSA4Ci0jICBkZWZpbmUgREVGX01FTV9MRVZFTCA4Ci0jZWxzZQotIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgIE1BWF9NRU1fTEVWRUwKLSNlbmRpZgotI2VuZGlmCi1jb25zdCBjaGFyIHppcF9jb3B5cmlnaHRbXSA9IiB6aXAgMS4wMSBDb3B5cmlnaHQgMTk5OC0yMDA0IEdpbGxlcyBWb2xsYW50IC0gaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbCI7Ci0KLQotI2RlZmluZSBTSVpFREFUQV9JTkRBVEFCTE9DSyAoNDA5Ni0oNCo0KSkKLQotI2RlZmluZSBMT0NBTEhFQURFUk1BR0lDICAgICgweDA0MDM0YjUwKQotI2RlZmluZSBDRU5UUkFMSEVBREVSTUFHSUMgICgweDAyMDE0YjUwKQotI2RlZmluZSBFTkRIRUFERVJNQUdJQyAgICAgICgweDA2MDU0YjUwKQotI2RlZmluZSBaSVA2NEVOREhFQURFUk1BR0lDICAgICAgKDB4NjA2NGI1MCkKLSNkZWZpbmUgWklQNjRFTkRMT0NIRUFERVJNQUdJQyAgICgweDcwNjRiNTApCi0KLSNkZWZpbmUgRkxBR19MT0NBTEhFQURFUl9PRkZTRVQgKDB4MDYpCi0jZGVmaW5lIENSQ19MT0NBTEhFQURFUl9PRkZTRVQgICgweDBlKQotCi0jZGVmaW5lIFNJWkVDRU5UUkFMSEVBREVSICgweDJlKSAvKiA0NiAqLwotCi10eXBlZGVmIHN0cnVjdCBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbF9zCi17Ci0gIHN0cnVjdCBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbF9zKiBuZXh0X2RhdGFibG9jazsKLSAgdUxvbmcgIGF2YWlsX2luX3RoaXNfYmxvY2s7Ci0gIHVMb25nICBmaWxsZWRfaW5fdGhpc19ibG9jazsKLSAgdUxvbmcgIHVudXNlZDsgLyogZm9yIGZ1dHVyZSB1c2UgYW5kIGFsaWduZW1lbnQgKi8KLSAgdW5zaWduZWQgY2hhciBkYXRhW1NJWkVEQVRBX0lOREFUQUJMT0NLXTsKLX0gbGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWw7Ci0KLXR5cGVkZWYgc3RydWN0IGxpbmtlZGxpc3RfZGF0YV9zCi17Ci0gICAgbGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWwqIGZpcnN0X2Jsb2NrOwotICAgIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBsYXN0X2Jsb2NrOwotfSBsaW5rZWRsaXN0X2RhdGE7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB6X3N0cmVhbSBzdHJlYW07ICAgICAgICAgICAgLyogekxpYiBzdHJlYW0gc3RydWN0dXJlIGZvciBpbmZsYXRlICovCi0jaWZkZWYgSEFWRV9CWklQMgotICAgIGJ6X3N0cmVhbSBic3RyZWFtOyAgICAgICAgICAvKiBiekxpYiBzdHJlYW0gc3RydWN0dXJlIGZvciBiemlwZWQgKi8KLSNlbmRpZgotCi0gICAgaW50ICBzdHJlYW1faW5pdGlhbGlzZWQ7ICAgIC8qIDEgaXMgc3RyZWFtIGlzIGluaXRpYWxpc2VkICovCi0gICAgdUludCBwb3NfaW5fYnVmZmVyZWRfZGF0YTsgIC8qIGxhc3Qgd3JpdHRlbiBieXRlIGluIGJ1ZmZlcmVkX2RhdGEgKi8KLQotICAgIFpQT1M2NF9UIHBvc19sb2NhbF9oZWFkZXI7ICAgICAvKiBvZmZzZXQgb2YgdGhlIGxvY2FsIGhlYWRlciBvZiB0aGUgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnR5IHdyaXRpbmcgKi8KLSAgICBjaGFyKiBjZW50cmFsX2hlYWRlcjsgICAgICAgLyogY2VudHJhbCBoZWFkZXIgZGF0YSBmb3IgdGhlIGN1cnJlbnQgZmlsZSAqLwotICAgIHVMb25nIHNpemVfY2VudHJhbEV4dHJhOwotICAgIHVMb25nIHNpemVfY2VudHJhbGhlYWRlcjsgICAvKiBzaXplIG9mIHRoZSBjZW50cmFsIGhlYWRlciBmb3IgY3VyIGZpbGUgKi8KLSAgICB1TG9uZyBzaXplX2NlbnRyYWxFeHRyYUZyZWU7IC8qIEV4dHJhIGJ5dGVzIGFsbG9jYXRlZCB0byB0aGUgY2VudHJhbGhlYWRlciBidXQgdGhhdCBhcmUgbm90IHVzZWQgKi8KLSAgICB1TG9uZyBmbGFnOyAgICAgICAgICAgICAgICAgLyogZmxhZyBvZiB0aGUgZmlsZSBjdXJyZW50bHkgd3JpdGluZyAqLwotCi0gICAgaW50ICBtZXRob2Q7ICAgICAgICAgICAgICAgIC8qIGNvbXByZXNzaW9uIG1ldGhvZCBvZiBmaWxlIGN1cnJlbnR5IHdyLiovCi0gICAgaW50ICByYXc7ICAgICAgICAgICAgICAgICAgIC8qIDEgZm9yIGRpcmVjdGx5IHdyaXRpbmcgcmF3IGRhdGEgKi8KLSAgICBCeXRlIGJ1ZmZlcmVkX2RhdGFbWl9CVUZTSVpFXTsvKiBidWZmZXIgY29udGFpbiBjb21wcmVzc2VkIGRhdGEgdG8gYmUgd3JpdCovCi0gICAgdUxvbmcgZG9zRGF0ZTsKLSAgICB1TG9uZyBjcmMzMjsKLSAgICBpbnQgIGVuY3J5cHQ7Ci0gICAgaW50ICB6aXA2NDsgICAgICAgICAgICAgICAvKiBBZGQgWklQNjQgZXh0ZW5lZCBpbmZvcm1hdGlvbiBpbiB0aGUgZXh0cmEgZmllbGQgKi8KLSAgICBaUE9TNjRfVCBwb3NfemlwNjRleHRyYWluZm87Ci0gICAgWlBPUzY0X1QgdG90YWxDb21wcmVzc2VkRGF0YTsKLSAgICBaUE9TNjRfVCB0b3RhbFVuY29tcHJlc3NlZERhdGE7Ci0jaWZuZGVmIE5PQ1JZUFQKLSAgICB1bnNpZ25lZCBsb25nIGtleXNbM107ICAgICAvKiBrZXlzIGRlZmluaW5nIHRoZSBwc2V1ZG8tcmFuZG9tIHNlcXVlbmNlICovCi0gICAgY29uc3QgdW5zaWduZWQgbG9uZyogcGNyY18zMl90YWI7Ci0gICAgaW50IGNyeXB0X2hlYWRlcl9zaXplOwotI2VuZGlmCi19IGN1cmZpbGU2NF9pbmZvOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYgel9maWxlZnVuYzsKLSAgICB2b2lkcGYgZmlsZXN0cmVhbTsgICAgICAgIC8qIGlvIHN0cnVjdG9yZSBvZiB0aGUgemlwZmlsZSAqLwotICAgIGxpbmtlZGxpc3RfZGF0YSBjZW50cmFsX2RpcjsvKiBkYXRhYmxvY2sgd2l0aCBjZW50cmFsIGRpciBpbiBjb25zdHJ1Y3Rpb24qLwotICAgIGludCAgaW5fb3BlbmVkX2ZpbGVfaW56aXA7ICAvKiAxIGlmIGEgZmlsZSBpbiB0aGUgemlwIGlzIGN1cnJlbnRseSB3cml0LiovCi0gICAgY3VyZmlsZTY0X2luZm8gY2k7ICAgICAgICAgICAgLyogaW5mbyBvbiB0aGUgZmlsZSBjdXJyZXRseSB3cml0aW5nICovCi0KLSAgICBaUE9TNjRfVCBiZWdpbl9wb3M7ICAgICAgICAgICAgLyogcG9zaXRpb24gb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgemlwZmlsZSAqLwotICAgIFpQT1M2NF9UIGFkZF9wb3NpdGlvbl93aGVuX3dyaXR0aW5nX29mZnNldDsKLSAgICBaUE9TNjRfVCBudW1iZXJfZW50cnk7Ci0KLSNpZm5kZWYgTk9fQURERklMRUlORVhJU1RJTkdaSVAKLSAgICBjaGFyICpnbG9iYWxjb21tZW50OwotI2VuZGlmCi0KLX0gemlwNjRfaW50ZXJuYWw7Ci0KLQotI2lmbmRlZiBOT0NSWVBUCi0jZGVmaW5lIElOQ0xVREVDUllQVElOR0NPREVfSUZDUllQVEFMTE9XRUQKLSNpbmNsdWRlICJjcnlwdC5oIgotI2VuZGlmCi0KLWxvY2FsIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBhbGxvY2F0ZV9uZXdfZGF0YWJsb2NrKCkKLXsKLSAgICBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCogbGRpOwotICAgIGxkaSA9IChsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCopCi0gICAgICAgICAgICAgICAgIEFMTE9DKHNpemVvZihsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCkpOwotICAgIGlmIChsZGkhPU5VTEwpCi0gICAgewotICAgICAgICBsZGktPm5leHRfZGF0YWJsb2NrID0gTlVMTCA7Ci0gICAgICAgIGxkaS0+ZmlsbGVkX2luX3RoaXNfYmxvY2sgPSAwIDsKLSAgICAgICAgbGRpLT5hdmFpbF9pbl90aGlzX2Jsb2NrID0gU0laRURBVEFfSU5EQVRBQkxPQ0sgOwotICAgIH0KLSAgICByZXR1cm4gbGRpOwotfQotCi1sb2NhbCB2b2lkIGZyZWVfZGF0YWJsb2NrKGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBsZGkpCi17Ci0gICAgd2hpbGUgKGxkaSE9TlVMTCkKLSAgICB7Ci0gICAgICAgIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBsZGluZXh0ID0gbGRpLT5uZXh0X2RhdGFibG9jazsKLSAgICAgICAgVFJZRlJFRShsZGkpOwotICAgICAgICBsZGkgPSBsZGluZXh0OwotICAgIH0KLX0KLQotbG9jYWwgdm9pZCBpbml0X2xpbmtlZGxpc3QobGlua2VkbGlzdF9kYXRhKiBsbCkKLXsKLSAgICBsbC0+Zmlyc3RfYmxvY2sgPSBsbC0+bGFzdF9ibG9jayA9IE5VTEw7Ci19Ci0KLWxvY2FsIHZvaWQgZnJlZV9saW5rZWRsaXN0KGxpbmtlZGxpc3RfZGF0YSogbGwpCi17Ci0gICAgZnJlZV9kYXRhYmxvY2sobGwtPmZpcnN0X2Jsb2NrKTsKLSAgICBsbC0+Zmlyc3RfYmxvY2sgPSBsbC0+bGFzdF9ibG9jayA9IE5VTEw7Ci19Ci0KLQotbG9jYWwgaW50IGFkZF9kYXRhX2luX2RhdGFibG9jayhsaW5rZWRsaXN0X2RhdGEqIGxsLCBjb25zdCB2b2lkKiBidWYsIHVMb25nIGxlbikKLXsKLSAgICBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCogbGRpOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGZyb21fY29weTsKLQotICAgIGlmIChsbD09TlVMTCkKLSAgICAgICAgcmV0dXJuIFpJUF9JTlRFUk5BTEVSUk9SOwotCi0gICAgaWYgKGxsLT5sYXN0X2Jsb2NrID09IE5VTEwpCi0gICAgewotICAgICAgICBsbC0+Zmlyc3RfYmxvY2sgPSBsbC0+bGFzdF9ibG9jayA9IGFsbG9jYXRlX25ld19kYXRhYmxvY2soKTsKLSAgICAgICAgaWYgKGxsLT5maXJzdF9ibG9jayA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIFpJUF9JTlRFUk5BTEVSUk9SOwotICAgIH0KLQotICAgIGxkaSA9IGxsLT5sYXN0X2Jsb2NrOwotICAgIGZyb21fY29weSA9ICh1bnNpZ25lZCBjaGFyKilidWY7Ci0KLSAgICB3aGlsZSAobGVuPjApCi0gICAgewotICAgICAgICB1SW50IGNvcHlfdGhpczsKLSAgICAgICAgdUludCBpOwotICAgICAgICB1bnNpZ25lZCBjaGFyKiB0b19jb3B5OwotCi0gICAgICAgIGlmIChsZGktPmF2YWlsX2luX3RoaXNfYmxvY2s9PTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxkaS0+bmV4dF9kYXRhYmxvY2sgPSBhbGxvY2F0ZV9uZXdfZGF0YWJsb2NrKCk7Ci0gICAgICAgICAgICBpZiAobGRpLT5uZXh0X2RhdGFibG9jayA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBaSVBfSU5URVJOQUxFUlJPUjsKLSAgICAgICAgICAgIGxkaSA9IGxkaS0+bmV4dF9kYXRhYmxvY2sgOwotICAgICAgICAgICAgbGwtPmxhc3RfYmxvY2sgPSBsZGk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGRpLT5hdmFpbF9pbl90aGlzX2Jsb2NrIDwgbGVuKQotICAgICAgICAgICAgY29weV90aGlzID0gKHVJbnQpbGRpLT5hdmFpbF9pbl90aGlzX2Jsb2NrOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb3B5X3RoaXMgPSAodUludClsZW47Ci0KLSAgICAgICAgdG9fY29weSA9ICYobGRpLT5kYXRhW2xkaS0+ZmlsbGVkX2luX3RoaXNfYmxvY2tdKTsKLQotICAgICAgICBmb3IgKGk9MDtpPGNvcHlfdGhpcztpKyspCi0gICAgICAgICAgICAqKHRvX2NvcHkraSk9Kihmcm9tX2NvcHkraSk7Ci0KLSAgICAgICAgbGRpLT5maWxsZWRfaW5fdGhpc19ibG9jayArPSBjb3B5X3RoaXM7Ci0gICAgICAgIGxkaS0+YXZhaWxfaW5fdGhpc19ibG9jayAtPSBjb3B5X3RoaXM7Ci0gICAgICAgIGZyb21fY29weSArPSBjb3B5X3RoaXMgOwotICAgICAgICBsZW4gLT0gY29weV90aGlzOwotICAgIH0KLSAgICByZXR1cm4gWklQX09LOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgTk9fQURERklMRUlORVhJU1RJTkdaSVAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgSW5wdXRzIGEgbG9uZyBpbiBMU0Igb3JkZXIgdG8gdGhlIGdpdmVuIGZpbGUKLSAgIG5iQnl0ZSA9PSAxLCAyICw0IG9yIDggKGJ5dGUsIHNob3J0IG9yIGxvbmcsIFpQT1M2NF9UKQotKi8KLQotbG9jYWwgaW50IHppcDY0bG9jYWxfcHV0VmFsdWUgT0YoKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwgdm9pZHBmIGZpbGVzdHJlYW0sIFpQT1M2NF9UIHgsIGludCBuYkJ5dGUpKTsKLWxvY2FsIGludCB6aXA2NGxvY2FsX3B1dFZhbHVlIChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsIHZvaWRwZiBmaWxlc3RyZWFtLCBaUE9TNjRfVCB4LCBpbnQgbmJCeXRlKQotewotICAgIHVuc2lnbmVkIGNoYXIgYnVmWzhdOwotICAgIGludCBuOwotICAgIGZvciAobiA9IDA7IG4gPCBuYkJ5dGU7IG4rKykKLSAgICB7Ci0gICAgICAgIGJ1ZltuXSA9ICh1bnNpZ25lZCBjaGFyKSh4ICYgMHhmZik7Ci0gICAgICAgIHggPj49IDg7Ci0gICAgfQotICAgIGlmICh4ICE9IDApCi0gICAgICB7ICAgICAvKiBkYXRhIG92ZXJmbG93IC0gaGFjayBmb3IgWklQNjQgKFggUm9jaGUpICovCi0gICAgICBmb3IgKG4gPSAwOyBuIDwgbmJCeXRlOyBuKyspCi0gICAgICAgIHsKLSAgICAgICAgICBidWZbbl0gPSAweGZmOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICBpZiAoWldSSVRFNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLGJ1ZixuYkJ5dGUpIT0odUxvbmcpbmJCeXRlKQotICAgICAgICByZXR1cm4gWklQX0VSUk5POwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFpJUF9PSzsKLX0KLQotbG9jYWwgdm9pZCB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5IE9GKCh2b2lkKiBkZXN0LCBaUE9TNjRfVCB4LCBpbnQgbmJCeXRlKSk7Ci1sb2NhbCB2b2lkIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkgKHZvaWQqIGRlc3QsIFpQT1M2NF9UIHgsIGludCBuYkJ5dGUpCi17Ci0gICAgdW5zaWduZWQgY2hhciogYnVmPSh1bnNpZ25lZCBjaGFyKilkZXN0OwotICAgIGludCBuOwotICAgIGZvciAobiA9IDA7IG4gPCBuYkJ5dGU7IG4rKykgewotICAgICAgICBidWZbbl0gPSAodW5zaWduZWQgY2hhcikoeCAmIDB4ZmYpOwotICAgICAgICB4ID4+PSA4OwotICAgIH0KLQotICAgIGlmICh4ICE9IDApCi0gICAgeyAgICAgLyogZGF0YSBvdmVyZmxvdyAtIGhhY2sgZm9yIFpJUDY0ICovCi0gICAgICAgZm9yIChuID0gMDsgbiA8IG5iQnl0ZTsgbisrKQotICAgICAgIHsKLSAgICAgICAgICBidWZbbl0gPSAweGZmOwotICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLWxvY2FsIHVMb25nIHppcDY0bG9jYWxfVG16RGF0ZVRvRG9zRGF0ZShjb25zdCB0bV96aXAqIHB0bSkKLXsKLSAgICB1TG9uZyB5ZWFyID0gKHVMb25nKXB0bS0+dG1feWVhcjsKLSAgICBpZiAoeWVhcj49MTk4MCkKLSAgICAgICAgeWVhci09MTk4MDsKLSAgICBlbHNlIGlmICh5ZWFyPj04MCkKLSAgICAgICAgeWVhci09ODA7Ci0gICAgcmV0dXJuCi0gICAgICAodUxvbmcpICgoKHB0bS0+dG1fbWRheSkgKyAoMzIgKiAocHRtLT50bV9tb24rMSkpICsgKDUxMiAqIHllYXIpKSA8PCAxNikgfAotICAgICAgICAoKHB0bS0+dG1fc2VjLzIpICsgKDMyKiBwdG0tPnRtX21pbikgKyAoMjA0OCAqICh1TG9uZylwdG0tPnRtX2hvdXIpKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotbG9jYWwgaW50IHppcDY0bG9jYWxfZ2V0Qnl0ZSBPRigoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLCB2b2lkcGYgZmlsZXN0cmVhbSwgaW50ICpwaSkpOwotCi1sb2NhbCBpbnQgemlwNjRsb2NhbF9nZXRCeXRlKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZix2b2lkcGYgZmlsZXN0cmVhbSxpbnQqIHBpKQotewotICAgIHVuc2lnbmVkIGNoYXIgYzsKLSAgICBpbnQgZXJyID0gKGludClaUkVBRDY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmYywxKTsKLSAgICBpZiAoZXJyPT0xKQotICAgIHsKLSAgICAgICAgKnBpID0gKGludCljOwotICAgICAgICByZXR1cm4gWklQX09LOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoWkVSUk9SNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKSkKLSAgICAgICAgICAgIHJldHVybiBaSVBfRVJSTk87Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBaSVBfRU9GOwotICAgIH0KLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIFJlYWRzIGEgbG9uZyBpbiBMU0Igb3JkZXIgZnJvbSB0aGUgZ2l2ZW4gZ3pfc3RyZWFtLiBTZXRzCi0qLwotbG9jYWwgaW50IHppcDY0bG9jYWxfZ2V0U2hvcnQgT0YoKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwgdm9pZHBmIGZpbGVzdHJlYW0sIHVMb25nICpwWCkpOwotCi1sb2NhbCBpbnQgemlwNjRsb2NhbF9nZXRTaG9ydCAoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLCB2b2lkcGYgZmlsZXN0cmVhbSwgdUxvbmcqIHBYKQotewotICAgIHVMb25nIHggOwotICAgIGludCBpID0gMDsKLSAgICBpbnQgZXJyOwotCi0gICAgZXJyID0gemlwNjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKLSAgICB4ID0gKHVMb25nKWk7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgIGVyciA9IHppcDY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7Ci0gICAgeCArPSAoKHVMb25nKWkpPDw4OwotCi0gICAgaWYgKGVycj09WklQX09LKQotICAgICAgICAqcFggPSB4OwotICAgIGVsc2UKLSAgICAgICAgKnBYID0gMDsKLSAgICByZXR1cm4gZXJyOwotfQotCi1sb2NhbCBpbnQgemlwNjRsb2NhbF9nZXRMb25nIE9GKChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsIHZvaWRwZiBmaWxlc3RyZWFtLCB1TG9uZyAqcFgpKTsKLQotbG9jYWwgaW50IHppcDY0bG9jYWxfZ2V0TG9uZyAoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLCB2b2lkcGYgZmlsZXN0cmVhbSwgdUxvbmcqIHBYKQotewotICAgIHVMb25nIHggOwotICAgIGludCBpID0gMDsKLSAgICBpbnQgZXJyOwotCi0gICAgZXJyID0gemlwNjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKLSAgICB4ID0gKHVMb25nKWk7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgIGVyciA9IHppcDY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7Ci0gICAgeCArPSAoKHVMb25nKWkpPDw4OwotCi0gICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSB6aXA2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICAgIHggKz0gKCh1TG9uZylpKTw8MTY7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgIGVyciA9IHppcDY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7Ci0gICAgeCArPSAoKHVMb25nKWkpPDwyNDsKLQotICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICAgICAgKnBYID0geDsKLSAgICBlbHNlCi0gICAgICAgICpwWCA9IDA7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotbG9jYWwgaW50IHppcDY0bG9jYWxfZ2V0TG9uZzY0IE9GKChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsIHZvaWRwZiBmaWxlc3RyZWFtLCBaUE9TNjRfVCAqcFgpKTsKLQotCi1sb2NhbCBpbnQgemlwNjRsb2NhbF9nZXRMb25nNjQgKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwgdm9pZHBmIGZpbGVzdHJlYW0sIFpQT1M2NF9UICpwWCkKLXsKLSAgWlBPUzY0X1QgeDsKLSAgaW50IGkgPSAwOwotICBpbnQgZXJyOwotCi0gIGVyciA9IHppcDY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7Ci0gIHggPSAoWlBPUzY0X1QpaTsKLQotICBpZiAoZXJyPT1aSVBfT0spCi0gICAgZXJyID0gemlwNjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKLSAgeCArPSAoKFpQT1M2NF9UKWkpPDw4OwotCi0gIGlmIChlcnI9PVpJUF9PSykKLSAgICBlcnIgPSB6aXA2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICB4ICs9ICgoWlBPUzY0X1QpaSk8PDE2OwotCi0gIGlmIChlcnI9PVpJUF9PSykKLSAgICBlcnIgPSB6aXA2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICB4ICs9ICgoWlBPUzY0X1QpaSk8PDI0OwotCi0gIGlmIChlcnI9PVpJUF9PSykKLSAgICBlcnIgPSB6aXA2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICB4ICs9ICgoWlBPUzY0X1QpaSk8PDMyOwotCi0gIGlmIChlcnI9PVpJUF9PSykKLSAgICBlcnIgPSB6aXA2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICB4ICs9ICgoWlBPUzY0X1QpaSk8PDQwOwotCi0gIGlmIChlcnI9PVpJUF9PSykKLSAgICBlcnIgPSB6aXA2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICB4ICs9ICgoWlBPUzY0X1QpaSk8PDQ4OwotCi0gIGlmIChlcnI9PVpJUF9PSykKLSAgICBlcnIgPSB6aXA2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICB4ICs9ICgoWlBPUzY0X1QpaSk8PDU2OwotCi0gIGlmIChlcnI9PVpJUF9PSykKLSAgICAqcFggPSB4OwotICBlbHNlCi0gICAgKnBYID0gMDsKLQotICByZXR1cm4gZXJyOwotfQotCi0jaWZuZGVmIEJVRlJFQURDT01NRU5UCi0jZGVmaW5lIEJVRlJFQURDT01NRU5UICgweDQwMCkKLSNlbmRpZgotLyoKLSAgTG9jYXRlIHRoZSBDZW50cmFsIGRpcmVjdG9yeSBvZiBhIHppcGZpbGUgKGF0IHRoZSBlbmQsIGp1c3QgYmVmb3JlCi0gICAgdGhlIGdsb2JhbCBjb21tZW50KQotKi8KLWxvY2FsIFpQT1M2NF9UIHppcDY0bG9jYWxfU2VhcmNoQ2VudHJhbERpciBPRigoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLCB2b2lkcGYgZmlsZXN0cmVhbSkpOwotCi1sb2NhbCBaUE9TNjRfVCB6aXA2NGxvY2FsX1NlYXJjaENlbnRyYWxEaXIoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLCB2b2lkcGYgZmlsZXN0cmVhbSkKLXsKLSAgdW5zaWduZWQgY2hhciogYnVmOwotICBaUE9TNjRfVCB1U2l6ZUZpbGU7Ci0gIFpQT1M2NF9UIHVCYWNrUmVhZDsKLSAgWlBPUzY0X1QgdU1heEJhY2s9MHhmZmZmOyAvKiBtYXhpbXVtIHNpemUgb2YgZ2xvYmFsIGNvbW1lbnQgKi8KLSAgWlBPUzY0X1QgdVBvc0ZvdW5kPTA7Ci0KLSAgaWYgKFpTRUVLNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLDAsWkxJQl9GSUxFRlVOQ19TRUVLX0VORCkgIT0gMCkKLSAgICByZXR1cm4gMDsKLQotCi0gIHVTaXplRmlsZSA9IFpURUxMNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKTsKLQotICBpZiAodU1heEJhY2s+dVNpemVGaWxlKQotICAgIHVNYXhCYWNrID0gdVNpemVGaWxlOwotCi0gIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyKilBTExPQyhCVUZSRUFEQ09NTUVOVCs0KTsKLSAgaWYgKGJ1Zj09TlVMTCkKLSAgICByZXR1cm4gMDsKLQotICB1QmFja1JlYWQgPSA0OwotICB3aGlsZSAodUJhY2tSZWFkPHVNYXhCYWNrKQotICB7Ci0gICAgdUxvbmcgdVJlYWRTaXplOwotICAgIFpQT1M2NF9UIHVSZWFkUG9zIDsKLSAgICBpbnQgaTsKLSAgICBpZiAodUJhY2tSZWFkK0JVRlJFQURDT01NRU5UPnVNYXhCYWNrKQotICAgICAgdUJhY2tSZWFkID0gdU1heEJhY2s7Ci0gICAgZWxzZQotICAgICAgdUJhY2tSZWFkKz1CVUZSRUFEQ09NTUVOVDsKLSAgICB1UmVhZFBvcyA9IHVTaXplRmlsZS11QmFja1JlYWQgOwotCi0gICAgdVJlYWRTaXplID0gKChCVUZSRUFEQ09NTUVOVCs0KSA8ICh1U2l6ZUZpbGUtdVJlYWRQb3MpKSA/Ci0gICAgICAoQlVGUkVBRENPTU1FTlQrNCkgOiAodUxvbmcpKHVTaXplRmlsZS11UmVhZFBvcyk7Ci0gICAgaWYgKFpTRUVLNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLHVSZWFkUG9zLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQotICAgICAgYnJlYWs7Ci0KLSAgICBpZiAoWlJFQUQ2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sYnVmLHVSZWFkU2l6ZSkhPXVSZWFkU2l6ZSkKLSAgICAgIGJyZWFrOwotCi0gICAgZm9yIChpPShpbnQpdVJlYWRTaXplLTM7IChpLS0pPjA7KQotICAgICAgaWYgKCgoKihidWYraSkpPT0weDUwKSAmJiAoKCooYnVmK2krMSkpPT0weDRiKSAmJgotICAgICAgICAoKCooYnVmK2krMikpPT0weDA1KSAmJiAoKCooYnVmK2krMykpPT0weDA2KSkKLSAgICAgIHsKLSAgICAgICAgdVBvc0ZvdW5kID0gdVJlYWRQb3MraTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh1UG9zRm91bmQhPTApCi0gICAgICAgIGJyZWFrOwotICB9Ci0gIFRSWUZSRUUoYnVmKTsKLSAgcmV0dXJuIHVQb3NGb3VuZDsKLX0KLQotLyoKLUxvY2F0ZSB0aGUgRW5kIG9mIFppcDY0IENlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3IgYW5kIGZyb20gdGhlcmUgZmluZCB0aGUgQ0Qgb2YgYSB6aXBmaWxlIChhdCB0aGUgZW5kLCBqdXN0IGJlZm9yZQotdGhlIGdsb2JhbCBjb21tZW50KQotKi8KLWxvY2FsIFpQT1M2NF9UIHppcDY0bG9jYWxfU2VhcmNoQ2VudHJhbERpcjY0IE9GKChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsIHZvaWRwZiBmaWxlc3RyZWFtKSk7Ci0KLWxvY2FsIFpQT1M2NF9UIHppcDY0bG9jYWxfU2VhcmNoQ2VudHJhbERpcjY0KGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwgdm9pZHBmIGZpbGVzdHJlYW0pCi17Ci0gIHVuc2lnbmVkIGNoYXIqIGJ1ZjsKLSAgWlBPUzY0X1QgdVNpemVGaWxlOwotICBaUE9TNjRfVCB1QmFja1JlYWQ7Ci0gIFpQT1M2NF9UIHVNYXhCYWNrPTB4ZmZmZjsgLyogbWF4aW11bSBzaXplIG9mIGdsb2JhbCBjb21tZW50ICovCi0gIFpQT1M2NF9UIHVQb3NGb3VuZD0wOwotICB1TG9uZyB1TDsKLSAgWlBPUzY0X1QgcmVsYXRpdmVPZmZzZXQ7Ci0KLSAgaWYgKFpTRUVLNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLDAsWkxJQl9GSUxFRlVOQ19TRUVLX0VORCkgIT0gMCkKLSAgICByZXR1cm4gMDsKLQotICB1U2l6ZUZpbGUgPSBaVEVMTDY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSk7Ci0KLSAgaWYgKHVNYXhCYWNrPnVTaXplRmlsZSkKLSAgICB1TWF4QmFjayA9IHVTaXplRmlsZTsKLQotICBidWYgPSAodW5zaWduZWQgY2hhciopQUxMT0MoQlVGUkVBRENPTU1FTlQrNCk7Ci0gIGlmIChidWY9PU5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgdUJhY2tSZWFkID0gNDsKLSAgd2hpbGUgKHVCYWNrUmVhZDx1TWF4QmFjaykKLSAgewotICAgIHVMb25nIHVSZWFkU2l6ZTsKLSAgICBaUE9TNjRfVCB1UmVhZFBvczsKLSAgICBpbnQgaTsKLSAgICBpZiAodUJhY2tSZWFkK0JVRlJFQURDT01NRU5UPnVNYXhCYWNrKQotICAgICAgdUJhY2tSZWFkID0gdU1heEJhY2s7Ci0gICAgZWxzZQotICAgICAgdUJhY2tSZWFkKz1CVUZSRUFEQ09NTUVOVDsKLSAgICB1UmVhZFBvcyA9IHVTaXplRmlsZS11QmFja1JlYWQgOwotCi0gICAgdVJlYWRTaXplID0gKChCVUZSRUFEQ09NTUVOVCs0KSA8ICh1U2l6ZUZpbGUtdVJlYWRQb3MpKSA/Ci0gICAgICAoQlVGUkVBRENPTU1FTlQrNCkgOiAodUxvbmcpKHVTaXplRmlsZS11UmVhZFBvcyk7Ci0gICAgaWYgKFpTRUVLNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLHVSZWFkUG9zLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQotICAgICAgYnJlYWs7Ci0KLSAgICBpZiAoWlJFQUQ2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sYnVmLHVSZWFkU2l6ZSkhPXVSZWFkU2l6ZSkKLSAgICAgIGJyZWFrOwotCi0gICAgZm9yIChpPShpbnQpdVJlYWRTaXplLTM7IChpLS0pPjA7KQotICAgIHsKLSAgICAgIC8vIFNpZ25hdHVyZSAiMHgwNzA2NGI1MCIgWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0ZXIKLSAgICAgIGlmICgoKCooYnVmK2kpKT09MHg1MCkgJiYgKCgqKGJ1ZitpKzEpKT09MHg0YikgJiYgKCgqKGJ1ZitpKzIpKT09MHgwNikgJiYgKCgqKGJ1ZitpKzMpKT09MHgwNykpCi0gICAgICB7Ci0gICAgICAgIHVQb3NGb3VuZCA9IHVSZWFkUG9zK2k7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgICAgaWYgKHVQb3NGb3VuZCE9MCkKLSAgICAgICAgYnJlYWs7Ci0gIH0KLQotICBUUllGUkVFKGJ1Zik7Ci0gIGlmICh1UG9zRm91bmQgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICAvKiBaaXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciAqLwotICBpZiAoWlNFRUs2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sIHVQb3NGb3VuZCxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKLSAgICByZXR1cm4gMDsKLQotICAvKiB0aGUgc2lnbmF0dXJlLCBhbHJlYWR5IGNoZWNrZWQgKi8KLSAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZyhwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmdUwpIT1aSVBfT0spCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSB6aXA2NCBlbmQgb2YgIGNlbnRyYWwgZGlyZWN0b3J5ICovCi0gIGlmICh6aXA2NGxvY2FsX2dldExvbmcocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJnVMKSE9WklQX09LKQotICAgIHJldHVybiAwOwotICBpZiAodUwgIT0gMCkKLSAgICByZXR1cm4gMDsKLQotICAvKiByZWxhdGl2ZSBvZmZzZXQgb2YgdGhlIHppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgKi8KLSAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZzY0KHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZyZWxhdGl2ZU9mZnNldCkhPVpJUF9PSykKLSAgICByZXR1cm4gMDsKLQotICAvKiB0b3RhbCBudW1iZXIgb2YgZGlza3MgKi8KLSAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZyhwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmdUwpIT1aSVBfT0spCi0gICAgcmV0dXJuIDA7Ci0gIGlmICh1TCAhPSAxKQotICAgIHJldHVybiAwOwotCi0gIC8qIEdvdG8gWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCAqLwotICBpZiAoWlNFRUs2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sIHJlbGF0aXZlT2Zmc2V0LFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQotICAgIHJldHVybiAwOwotCi0gIC8qIHRoZSBzaWduYXR1cmUgKi8KLSAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZyhwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmdUwpIT1aSVBfT0spCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKHVMICE9IDB4MDYwNjRiNTApIC8vIHNpZ25hdHVyZSBvZiAnWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5JwotICAgIHJldHVybiAwOwotCi0gIHJldHVybiByZWxhdGl2ZU9mZnNldDsKLX0KLQotaW50IExvYWRDZW50cmFsRGlyZWN0b3J5UmVjb3JkKHppcDY0X2ludGVybmFsKiBwemlpbml0KQotewotICBpbnQgZXJyPVpJUF9PSzsKLSAgWlBPUzY0X1QgYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU7LyogYnl0ZSBiZWZvcmUgdGhlIHppcGZpbGUsICg+MCBmb3Igc2Z4KSovCi0KLSAgWlBPUzY0X1Qgc2l6ZV9jZW50cmFsX2RpcjsgICAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICAqLwotICBaUE9TNjRfVCBvZmZzZXRfY2VudHJhbF9kaXI7ICAgLyogb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5ICovCi0gIFpQT1M2NF9UIGNlbnRyYWxfcG9zOwotICB1TG9uZyB1TDsKLQotICB1TG9uZyBudW1iZXJfZGlzazsgICAgICAgICAgLyogbnVtYmVyIG9mIHRoZSBjdXJyZW50IGRpc3QsIHVzZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuaW5nIFpJUCwgdW5zdXBwb3J0ZWQsIGFsd2F5cyAwKi8KLSAgdUxvbmcgbnVtYmVyX2Rpc2tfd2l0aF9DRDsgIC8qIG51bWJlciB0aGUgdGhlIGRpc2sgd2l0aCBjZW50cmFsIGRpciwgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNwYW5pbmcgWklQLCB1bnN1cHBvcnRlZCwgYWx3YXlzIDAqLwotICBaUE9TNjRfVCBudW1iZXJfZW50cnk7Ci0gIFpQT1M2NF9UIG51bWJlcl9lbnRyeV9DRDsgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2VudHJhbCBkaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNhbWUgdGhhbiBudW1iZXJfZW50cnkgb24gbm9zcGFuKSAqLwotICB1TG9uZyBWZXJzaW9uTWFkZUJ5OwotICB1TG9uZyBWZXJzaW9uTmVlZGVkOwotICB1TG9uZyBzaXplX2NvbW1lbnQ7Ci0KLSAgaW50IGhhc1pJUDY0UmVjb3JkID0gMDsKLQotICAvLyBjaGVjayBmaXJzdCBpZiB3ZSBmaW5kIGEgWklQNjQgcmVjb3JkCi0gIGNlbnRyYWxfcG9zID0gemlwNjRsb2NhbF9TZWFyY2hDZW50cmFsRGlyNjQoJnB6aWluaXQtPnpfZmlsZWZ1bmMscHppaW5pdC0+ZmlsZXN0cmVhbSk7Ci0gIGlmKGNlbnRyYWxfcG9zID4gMCkKLSAgewotICAgIGhhc1pJUDY0UmVjb3JkID0gMTsKLSAgfQotICBlbHNlIGlmKGNlbnRyYWxfcG9zID09IDApCi0gIHsKLSAgICBjZW50cmFsX3BvcyA9IHppcDY0bG9jYWxfU2VhcmNoQ2VudHJhbERpcigmcHppaW5pdC0+el9maWxlZnVuYyxwemlpbml0LT5maWxlc3RyZWFtKTsKLSAgfQotCi0vKiBkaXNhYmxlIHRvIGFsbG93IGFwcGVuZGluZyB0byBlbXB0eSBaSVAgYXJjaGl2ZQotICAgICAgICBpZiAoY2VudHJhbF9wb3M9PTApCi0gICAgICAgICAgICBlcnI9WklQX0VSUk5POwotKi8KLQotICBpZihoYXNaSVA2NFJlY29yZCkKLSAgewotICAgIFpQT1M2NF9UIHNpemVFbmRPZkNlbnRyYWxEaXJlY3Rvcnk7Ci0gICAgaWYgKFpTRUVLNjQocHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwgY2VudHJhbF9wb3MsIFpMSUJfRklMRUZVTkNfU0VFS19TRVQpICE9IDApCi0gICAgICBlcnI9WklQX0VSUk5POwotCi0gICAgLyogdGhlIHNpZ25hdHVyZSwgYWxyZWFkeSBjaGVja2VkICovCi0gICAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZygmcHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwmdUwpIT1aSVBfT0spCi0gICAgICBlcnI9WklQX0VSUk5POwotCi0gICAgLyogc2l6ZSBvZiB6aXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkICovCi0gICAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZzY0KCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCAmc2l6ZUVuZE9mQ2VudHJhbERpcmVjdG9yeSkhPVpJUF9PSykKLSAgICAgIGVycj1aSVBfRVJSTk87Ci0KLSAgICAvKiB2ZXJzaW9uIG1hZGUgYnkgKi8KLSAgICBpZiAoemlwNjRsb2NhbF9nZXRTaG9ydCgmcHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwgJlZlcnNpb25NYWRlQnkpIT1aSVBfT0spCi0gICAgICBlcnI9WklQX0VSUk5POwotCi0gICAgLyogdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCAqLwotICAgIGlmICh6aXA2NGxvY2FsX2dldFNob3J0KCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCAmVmVyc2lvbk5lZWRlZCkhPVpJUF9PSykKLSAgICAgIGVycj1aSVBfRVJSTk87Ci0KLSAgICAvKiBudW1iZXIgb2YgdGhpcyBkaXNrICovCi0gICAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZygmcHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwmbnVtYmVyX2Rpc2spIT1aSVBfT0spCi0gICAgICBlcnI9WklQX0VSUk5POwotCi0gICAgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLwotICAgIGlmICh6aXA2NGxvY2FsX2dldExvbmcoJnB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sJm51bWJlcl9kaXNrX3dpdGhfQ0QpIT1aSVBfT0spCi0gICAgICBlcnI9WklQX0VSUk5POwotCi0gICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyZWN0b3J5IG9uIHRoaXMgZGlzayAqLwotICAgIGlmICh6aXA2NGxvY2FsX2dldExvbmc2NCgmcHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwgJm51bWJlcl9lbnRyeSkhPVpJUF9PSykKLSAgICAgIGVycj1aSVBfRVJSTk87Ci0KLSAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KLSAgICBpZiAoemlwNjRsb2NhbF9nZXRMb25nNjQoJnB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sJm51bWJlcl9lbnRyeV9DRCkhPVpJUF9PSykKLSAgICAgIGVycj1aSVBfRVJSTk87Ci0KLSAgICBpZiAoKG51bWJlcl9lbnRyeV9DRCE9bnVtYmVyX2VudHJ5KSB8fCAobnVtYmVyX2Rpc2tfd2l0aF9DRCE9MCkgfHwgKG51bWJlcl9kaXNrIT0wKSkKLSAgICAgIGVycj1aSVBfQkFEWklQRklMRTsKLQotICAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCi0gICAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZzY0KCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCZzaXplX2NlbnRyYWxfZGlyKSE9WklQX09LKQotICAgICAgZXJyPVpJUF9FUlJOTzsKLQotICAgIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gdGhlCi0gICAgc3RhcnRpbmcgZGlzayBudW1iZXIgKi8KLSAgICBpZiAoemlwNjRsb2NhbF9nZXRMb25nNjQoJnB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sJm9mZnNldF9jZW50cmFsX2RpcikhPVpJUF9PSykKLSAgICAgIGVycj1aSVBfRVJSTk87Ci0KLSAgICAvLyBUT0RPLi4KLSAgICAvLyByZWFkIHRoZSBjb21tZW50IGZyb20gdGhlIHN0YW5kYXJkIGNlbnRyYWwgaGVhZGVyLgotICAgIHNpemVfY29tbWVudCA9IDA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgLy8gUmVhZCBFbmQgb2YgY2VudHJhbCBEaXJlY3RvcnkgaW5mbwotICAgIGlmIChaU0VFSzY0KHB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sIGNlbnRyYWxfcG9zLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQotICAgICAgZXJyPVpJUF9FUlJOTzsKLQotICAgIC8qIHRoZSBzaWduYXR1cmUsIGFscmVhZHkgY2hlY2tlZCAqLwotICAgIGlmICh6aXA2NGxvY2FsX2dldExvbmcoJnB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sJnVMKSE9WklQX09LKQotICAgICAgZXJyPVpJUF9FUlJOTzsKLQotICAgIC8qIG51bWJlciBvZiB0aGlzIGRpc2sgKi8KLSAgICBpZiAoemlwNjRsb2NhbF9nZXRTaG9ydCgmcHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwmbnVtYmVyX2Rpc2spIT1aSVBfT0spCi0gICAgICBlcnI9WklQX0VSUk5POwotCi0gICAgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLwotICAgIGlmICh6aXA2NGxvY2FsX2dldFNob3J0KCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCZudW1iZXJfZGlza193aXRoX0NEKSE9WklQX09LKQotICAgICAgZXJyPVpJUF9FUlJOTzsKLQotICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpciBvbiB0aGlzIGRpc2sgKi8KLSAgICBudW1iZXJfZW50cnkgPSAwOwotICAgIGlmICh6aXA2NGxvY2FsX2dldFNob3J0KCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCAmdUwpIT1aSVBfT0spCi0gICAgICBlcnI9WklQX0VSUk5POwotICAgIGVsc2UKLSAgICAgIG51bWJlcl9lbnRyeSA9IHVMOwotCi0gICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyICovCi0gICAgbnVtYmVyX2VudHJ5X0NEID0gMDsKLSAgICBpZiAoemlwNjRsb2NhbF9nZXRTaG9ydCgmcHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwgJnVMKSE9WklQX09LKQotICAgICAgZXJyPVpJUF9FUlJOTzsKLSAgICBlbHNlCi0gICAgICBudW1iZXJfZW50cnlfQ0QgPSB1TDsKLQotICAgIGlmICgobnVtYmVyX2VudHJ5X0NEIT1udW1iZXJfZW50cnkpIHx8IChudW1iZXJfZGlza193aXRoX0NEIT0wKSB8fCAobnVtYmVyX2Rpc2shPTApKQotICAgICAgZXJyPVpJUF9CQURaSVBGSUxFOwotCi0gICAgLyogc2l6ZSBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KLSAgICBzaXplX2NlbnRyYWxfZGlyID0gMDsKLSAgICBpZiAoemlwNjRsb2NhbF9nZXRMb25nKCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCAmdUwpIT1aSVBfT0spCi0gICAgICBlcnI9WklQX0VSUk5POwotICAgIGVsc2UKLSAgICAgIHNpemVfY2VudHJhbF9kaXIgPSB1TDsKLQotICAgIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gdGhlIHN0YXJ0aW5nIGRpc2sgbnVtYmVyICovCi0gICAgb2Zmc2V0X2NlbnRyYWxfZGlyID0gMDsKLSAgICBpZiAoemlwNjRsb2NhbF9nZXRMb25nKCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCAmdUwpIT1aSVBfT0spCi0gICAgICBlcnI9WklQX0VSUk5POwotICAgIGVsc2UKLSAgICAgIG9mZnNldF9jZW50cmFsX2RpciA9IHVMOwotCi0KLSAgICAvKiB6aXBmaWxlIGdsb2JhbCBjb21tZW50IGxlbmd0aCAqLwotICAgIGlmICh6aXA2NGxvY2FsX2dldFNob3J0KCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCAmc2l6ZV9jb21tZW50KSE9WklQX09LKQotICAgICAgZXJyPVpJUF9FUlJOTzsKLSAgfQotCi0gIGlmICgoY2VudHJhbF9wb3M8b2Zmc2V0X2NlbnRyYWxfZGlyK3NpemVfY2VudHJhbF9kaXIpICYmCi0gICAgKGVycj09WklQX09LKSkKLSAgICBlcnI9WklQX0JBRFpJUEZJTEU7Ci0KLSAgaWYgKGVyciE9WklQX09LKQotICB7Ci0gICAgWkNMT1NFNjQocHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSk7Ci0gICAgcmV0dXJuIFpJUF9FUlJOTzsKLSAgfQotCi0gIGlmIChzaXplX2NvbW1lbnQ+MCkKLSAgewotICAgIHB6aWluaXQtPmdsb2JhbGNvbW1lbnQgPSAoY2hhciopQUxMT0Moc2l6ZV9jb21tZW50KzEpOwotICAgIGlmIChwemlpbml0LT5nbG9iYWxjb21tZW50KQotICAgIHsKLSAgICAgIHNpemVfY29tbWVudCA9IFpSRUFENjQocHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwgcHppaW5pdC0+Z2xvYmFsY29tbWVudCxzaXplX2NvbW1lbnQpOwotICAgICAgcHppaW5pdC0+Z2xvYmFsY29tbWVudFtzaXplX2NvbW1lbnRdPTA7Ci0gICAgfQotICB9Ci0KLSAgYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUgPSBjZW50cmFsX3BvcyAtIChvZmZzZXRfY2VudHJhbF9kaXIrc2l6ZV9jZW50cmFsX2Rpcik7Ci0gIHB6aWluaXQtPmFkZF9wb3NpdGlvbl93aGVuX3dyaXR0aW5nX29mZnNldCA9IGJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlOwotCi0gIHsKLSAgICBaUE9TNjRfVCBzaXplX2NlbnRyYWxfZGlyX3RvX3JlYWQgPSBzaXplX2NlbnRyYWxfZGlyOwotICAgIHNpemVfdCBidWZfc2l6ZSA9IFNJWkVEQVRBX0lOREFUQUJMT0NLOwotICAgIHZvaWQqIGJ1Zl9yZWFkID0gKHZvaWQqKUFMTE9DKGJ1Zl9zaXplKTsKLSAgICBpZiAoWlNFRUs2NChwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCBvZmZzZXRfY2VudHJhbF9kaXIgKyBieXRlX2JlZm9yZV90aGVfemlwZmlsZSwgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkgIT0gMCkKLSAgICAgIGVycj1aSVBfRVJSTk87Ci0KLSAgICB3aGlsZSAoKHNpemVfY2VudHJhbF9kaXJfdG9fcmVhZD4wKSAmJiAoZXJyPT1aSVBfT0spKQotICAgIHsKLSAgICAgIFpQT1M2NF9UIHJlYWRfdGhpcyA9IFNJWkVEQVRBX0lOREFUQUJMT0NLOwotICAgICAgaWYgKHJlYWRfdGhpcyA+IHNpemVfY2VudHJhbF9kaXJfdG9fcmVhZCkKLSAgICAgICAgcmVhZF90aGlzID0gc2l6ZV9jZW50cmFsX2Rpcl90b19yZWFkOwotCi0gICAgICBpZiAoWlJFQUQ2NChwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLGJ1Zl9yZWFkLCh1TG9uZylyZWFkX3RoaXMpICE9IHJlYWRfdGhpcykKLSAgICAgICAgZXJyPVpJUF9FUlJOTzsKLQotICAgICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSBhZGRfZGF0YV9pbl9kYXRhYmxvY2soJnB6aWluaXQtPmNlbnRyYWxfZGlyLGJ1Zl9yZWFkLCAodUxvbmcpcmVhZF90aGlzKTsKLQotICAgICAgc2l6ZV9jZW50cmFsX2Rpcl90b19yZWFkLT1yZWFkX3RoaXM7Ci0gICAgfQotICAgIFRSWUZSRUUoYnVmX3JlYWQpOwotICB9Ci0gIHB6aWluaXQtPmJlZ2luX3BvcyA9IGJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlOwotICBwemlpbml0LT5udW1iZXJfZW50cnkgPSBudW1iZXJfZW50cnlfQ0Q7Ci0KLSAgaWYgKFpTRUVLNjQocHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwgb2Zmc2V0X2NlbnRyYWxfZGlyK2J5dGVfYmVmb3JlX3RoZV96aXBmaWxlLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpICE9IDApCi0gICAgZXJyPVpJUF9FUlJOTzsKLQotICByZXR1cm4gZXJyOwotfQotCi0KLSNlbmRpZiAvKiAhTk9fQURERklMRUlORVhJU1RJTkdaSVAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gemlwRmlsZSBaRVhQT1JUIHppcE9wZW4zIChjb25zdCB2b2lkICpwYXRobmFtZSwgaW50IGFwcGVuZCwgemlwY2hhcnBjKiBnbG9iYWxjb21tZW50LCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuYzY0XzMyX2RlZikKLXsKLSAgICB6aXA2NF9pbnRlcm5hbCB6aWluaXQ7Ci0gICAgemlwNjRfaW50ZXJuYWwqIHppOwotICAgIGludCBlcnI9WklQX09LOwotCi0gICAgemlpbml0LnpfZmlsZWZ1bmMuenNlZWszMl9maWxlID0gTlVMTDsKLSAgICB6aWluaXQuel9maWxlZnVuYy56dGVsbDMyX2ZpbGUgPSBOVUxMOwotICAgIGlmIChwemxpYl9maWxlZnVuYzY0XzMyX2RlZj09TlVMTCkKLSAgICAgICAgZmlsbF9mb3BlbjY0X2ZpbGVmdW5jKCZ6aWluaXQuel9maWxlZnVuYy56ZmlsZV9mdW5jNjQpOwotICAgIGVsc2UKLSAgICAgICAgemlpbml0LnpfZmlsZWZ1bmMgPSAqcHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWY7Ci0KLSAgICB6aWluaXQuZmlsZXN0cmVhbSA9IFpPUEVONjQoemlpbml0LnpfZmlsZWZ1bmMsCi0gICAgICAgICAgICAgICAgICBwYXRobmFtZSwKLSAgICAgICAgICAgICAgICAgIChhcHBlbmQgPT0gQVBQRU5EX1NUQVRVU19DUkVBVEUpID8KLSAgICAgICAgICAgICAgICAgIChaTElCX0ZJTEVGVU5DX01PREVfUkVBRCB8IFpMSUJfRklMRUZVTkNfTU9ERV9XUklURSB8IFpMSUJfRklMRUZVTkNfTU9ERV9DUkVBVEUpIDoKLSAgICAgICAgICAgICAgICAgICAgKFpMSUJfRklMRUZVTkNfTU9ERV9SRUFEIHwgWkxJQl9GSUxFRlVOQ19NT0RFX1dSSVRFIHwgWkxJQl9GSUxFRlVOQ19NT0RFX0VYSVNUSU5HKSk7Ci0KLSAgICBpZiAoemlpbml0LmZpbGVzdHJlYW0gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoYXBwZW5kID09IEFQUEVORF9TVEFUVVNfQ1JFQVRFQUZURVIpCi0gICAgICAgIFpTRUVLNjQoemlpbml0LnpfZmlsZWZ1bmMsemlpbml0LmZpbGVzdHJlYW0sMCxTRUVLX0VORCk7Ci0KLSAgICB6aWluaXQuYmVnaW5fcG9zID0gWlRFTEw2NCh6aWluaXQuel9maWxlZnVuYyx6aWluaXQuZmlsZXN0cmVhbSk7Ci0gICAgemlpbml0LmluX29wZW5lZF9maWxlX2luemlwID0gMDsKLSAgICB6aWluaXQuY2kuc3RyZWFtX2luaXRpYWxpc2VkID0gMDsKLSAgICB6aWluaXQubnVtYmVyX2VudHJ5ID0gMDsKLSAgICB6aWluaXQuYWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0ID0gMDsKLSAgICBpbml0X2xpbmtlZGxpc3QoJih6aWluaXQuY2VudHJhbF9kaXIpKTsKLQotCi0KLSAgICB6aSA9ICh6aXA2NF9pbnRlcm5hbCopQUxMT0Moc2l6ZW9mKHppcDY0X2ludGVybmFsKSk7Ci0gICAgaWYgKHppPT1OVUxMKQotICAgIHsKLSAgICAgICAgWkNMT1NFNjQoemlpbml0LnpfZmlsZWZ1bmMsemlpbml0LmZpbGVzdHJlYW0pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBub3cgd2UgYWRkIGZpbGUgaW4gYSB6aXBmaWxlICovCi0jICAgIGlmbmRlZiBOT19BRERGSUxFSU5FWElTVElOR1pJUAotICAgIHppaW5pdC5nbG9iYWxjb21tZW50ID0gTlVMTDsKLSAgICBpZiAoYXBwZW5kID09IEFQUEVORF9TVEFUVVNfQURESU5aSVApCi0gICAgewotICAgICAgLy8gUmVhZCBhbmQgQ2FjaGUgQ2VudHJhbCBEaXJlY3RvcnkgUmVjb3JkcwotICAgICAgZXJyID0gTG9hZENlbnRyYWxEaXJlY3RvcnlSZWNvcmQoJnppaW5pdCk7Ci0gICAgfQotCi0gICAgaWYgKGdsb2JhbGNvbW1lbnQpCi0gICAgewotICAgICAgKmdsb2JhbGNvbW1lbnQgPSB6aWluaXQuZ2xvYmFsY29tbWVudDsKLSAgICB9Ci0jICAgIGVuZGlmIC8qICFOT19BRERGSUxFSU5FWElTVElOR1pJUCovCi0KLSAgICBpZiAoZXJyICE9IFpJUF9PSykKLSAgICB7Ci0jICAgIGlmbmRlZiBOT19BRERGSUxFSU5FWElTVElOR1pJUAotICAgICAgICBUUllGUkVFKHppaW5pdC5nbG9iYWxjb21tZW50KTsKLSMgICAgZW5kaWYgLyogIU5PX0FEREZJTEVJTkVYSVNUSU5HWklQKi8KLSAgICAgICAgVFJZRlJFRSh6aSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqemkgPSB6aWluaXQ7Ci0gICAgICAgIHJldHVybiAoemlwRmlsZSl6aTsKLSAgICB9Ci19Ci0KLWV4dGVybiB6aXBGaWxlIFpFWFBPUlQgemlwT3BlbjIgKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgYXBwZW5kLCB6aXBjaGFycGMqIGdsb2JhbGNvbW1lbnQsIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuYzMyX2RlZikKLXsKLSAgICBpZiAocHpsaWJfZmlsZWZ1bmMzMl9kZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYgemxpYl9maWxlZnVuYzY0XzMyX2RlZl9maWxsOwotICAgICAgICBmaWxsX3psaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZnJvbV9maWxlZnVuYzMyKCZ6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2ZpbGwscHpsaWJfZmlsZWZ1bmMzMl9kZWYpOwotICAgICAgICByZXR1cm4gemlwT3BlbjMocGF0aG5hbWUsIGFwcGVuZCwgZ2xvYmFsY29tbWVudCwgJnpsaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZmlsbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIHppcE9wZW4zKHBhdGhuYW1lLCBhcHBlbmQsIGdsb2JhbGNvbW1lbnQsIE5VTEwpOwotfQotCi1leHRlcm4gemlwRmlsZSBaRVhQT1JUIHppcE9wZW4yXzY0IChjb25zdCB2b2lkICpwYXRobmFtZSwgaW50IGFwcGVuZCwgemlwY2hhcnBjKiBnbG9iYWxjb21tZW50LCB6bGliX2ZpbGVmdW5jNjRfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpCi17Ci0gICAgaWYgKHB6bGliX2ZpbGVmdW5jX2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgemxpYl9maWxlZnVuYzY0XzMyX2RlZiB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2ZpbGw7Ci0gICAgICAgIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZmlsbC56ZmlsZV9mdW5jNjQgPSAqcHpsaWJfZmlsZWZ1bmNfZGVmOwotICAgICAgICB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2ZpbGwuenRlbGwzMl9maWxlID0gTlVMTDsKLSAgICAgICAgemxpYl9maWxlZnVuYzY0XzMyX2RlZl9maWxsLnpzZWVrMzJfZmlsZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiB6aXBPcGVuMyhwYXRobmFtZSwgYXBwZW5kLCBnbG9iYWxjb21tZW50LCAmemxpYl9maWxlZnVuYzY0XzMyX2RlZl9maWxsKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gemlwT3BlbjMocGF0aG5hbWUsIGFwcGVuZCwgZ2xvYmFsY29tbWVudCwgTlVMTCk7Ci19Ci0KLQotCi1leHRlcm4gemlwRmlsZSBaRVhQT1JUIHppcE9wZW4gKGNvbnN0IGNoYXIqIHBhdGhuYW1lLCBpbnQgYXBwZW5kKQotewotICAgIHJldHVybiB6aXBPcGVuMygoY29uc3Qgdm9pZCopcGF0aG5hbWUsYXBwZW5kLE5VTEwsTlVMTCk7Ci19Ci0KLWV4dGVybiB6aXBGaWxlIFpFWFBPUlQgemlwT3BlbjY0IChjb25zdCB2b2lkKiBwYXRobmFtZSwgaW50IGFwcGVuZCkKLXsKLSAgICByZXR1cm4gemlwT3BlbjMocGF0aG5hbWUsYXBwZW5kLE5VTEwsTlVMTCk7Ci19Ci0KLWludCBXcml0ZV9Mb2NhbEZpbGVIZWFkZXIoemlwNjRfaW50ZXJuYWwqIHppLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfbG9jYWwpCi17Ci0gIC8qIHdyaXRlIHRoZSBsb2NhbCBoZWFkZXIgKi8KLSAgaW50IGVycjsKLSAgdUludCBzaXplX2ZpbGVuYW1lID0gKHVJbnQpc3RybGVuKGZpbGVuYW1lKTsKLSAgdUludCBzaXplX2V4dHJhZmllbGQgPSBzaXplX2V4dHJhZmllbGRfbG9jYWw7Ci0KLSAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKUxPQ0FMSEVBREVSTUFHSUMsIDQpOwotCi0gIGlmIChlcnI9PVpJUF9PSykKLSAgewotICAgIGlmKHppLT5jaS56aXA2NCkKLSAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZyk0NSwyKTsvKiB2ZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0ICovCi0gICAgZWxzZQotICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTIwLDIpOy8qIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgKi8KLSAgfQotCi0gIGlmIChlcnI9PVpJUF9PSykKLSAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpemktPmNpLmZsYWcsMik7Ci0KLSAgaWYgKGVycj09WklQX09LKQotICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZyl6aS0+Y2kubWV0aG9kLDIpOwotCi0gIGlmIChlcnI9PVpJUF9PSykKLSAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpemktPmNpLmRvc0RhdGUsNCk7Ci0KLSAgLy8gQ1JDIC8gQ29tcHJlc3NlZCBzaXplIC8gVW5jb21wcmVzc2VkIHNpemUgd2lsbCBiZSBmaWxsZWQgaW4gbGF0ZXIgYW5kIHJld3JpdHRlbiBsYXRlcgotICBpZiAoZXJyPT1aSVBfT0spCi0gICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTAsNCk7IC8qIGNyYyAzMiwgdW5rbm93biAqLwotICBpZiAoZXJyPT1aSVBfT0spCi0gIHsKLSAgICBpZih6aS0+Y2kuemlwNjQpCi0gICAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMHhGRkZGRkZGRiw0KTsgLyogY29tcHJlc3NlZCBzaXplLCB1bmtub3duICovCi0gICAgZWxzZQotICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTAsNCk7IC8qIGNvbXByZXNzZWQgc2l6ZSwgdW5rbm93biAqLwotICB9Ci0gIGlmIChlcnI9PVpJUF9PSykKLSAgewotICAgIGlmKHppLT5jaS56aXA2NCkKLSAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykweEZGRkZGRkZGLDQpOyAvKiB1bmNvbXByZXNzZWQgc2l6ZSwgdW5rbm93biAqLwotICAgIGVsc2UKLSAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDQpOyAvKiB1bmNvbXByZXNzZWQgc2l6ZSwgdW5rbm93biAqLwotICB9Ci0KLSAgaWYgKGVycj09WklQX09LKQotICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylzaXplX2ZpbGVuYW1lLDIpOwotCi0gIGlmKHppLT5jaS56aXA2NCkKLSAgewotICAgIHNpemVfZXh0cmFmaWVsZCArPSAyMDsKLSAgfQotCi0gIGlmIChlcnI9PVpJUF9PSykKLSAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpc2l6ZV9leHRyYWZpZWxkLDIpOwotCi0gIGlmICgoZXJyPT1aSVBfT0spICYmIChzaXplX2ZpbGVuYW1lID4gMCkpCi0gIHsKLSAgICBpZiAoWldSSVRFNjQoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sZmlsZW5hbWUsc2l6ZV9maWxlbmFtZSkhPXNpemVfZmlsZW5hbWUpCi0gICAgICBlcnIgPSBaSVBfRVJSTk87Ci0gIH0KLQotICBpZiAoKGVycj09WklQX09LKSAmJiAoc2l6ZV9leHRyYWZpZWxkX2xvY2FsID4gMCkpCi0gIHsKLSAgICBpZiAoWldSSVRFNjQoemktPnpfZmlsZWZ1bmMsIHppLT5maWxlc3RyZWFtLCBleHRyYWZpZWxkX2xvY2FsLCBzaXplX2V4dHJhZmllbGRfbG9jYWwpICE9IHNpemVfZXh0cmFmaWVsZF9sb2NhbCkKLSAgICAgIGVyciA9IFpJUF9FUlJOTzsKLSAgfQotCi0KLSAgaWYgKChlcnI9PVpJUF9PSykgJiYgKHppLT5jaS56aXA2NCkpCi0gIHsKLSAgICAgIC8vIHdyaXRlIHRoZSBaaXA2NCBleHRlbmRlZCBpbmZvCi0gICAgICBzaG9ydCBIZWFkZXJJRCA9IDE7Ci0gICAgICBzaG9ydCBEYXRhU2l6ZSA9IDE2OwotICAgICAgWlBPUzY0X1QgQ29tcHJlc3NlZFNpemUgPSAwOwotICAgICAgWlBPUzY0X1QgVW5jb21wcmVzc2VkU2l6ZSA9IDA7Ci0KLSAgICAgIC8vIFJlbWVtYmVyIHBvc2l0aW9uIG9mIFppcDY0IGV4dGVuZGVkIGluZm8gZm9yIHRoZSBsb2NhbCBmaWxlIGhlYWRlci4gKG5lZWRlZCB3aGVuIHdlIHVwZGF0ZSBzaXplIGFmdGVyIGRvbmUgd2l0aCBmaWxlKQotICAgICAgemktPmNpLnBvc196aXA2NGV4dHJhaW5mbyA9IFpURUxMNjQoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0pOwotCi0gICAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYywgemktPmZpbGVzdHJlYW0sIChzaG9ydClIZWFkZXJJRCwyKTsKLSAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLCB6aS0+ZmlsZXN0cmVhbSwgKHNob3J0KURhdGFTaXplLDIpOwotCi0gICAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYywgemktPmZpbGVzdHJlYW0sIChaUE9TNjRfVClVbmNvbXByZXNzZWRTaXplLDgpOwotICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsIHppLT5maWxlc3RyZWFtLCAoWlBPUzY0X1QpQ29tcHJlc3NlZFNpemUsOCk7Ci0gIH0KLQotICByZXR1cm4gZXJyOwotfQotCi0vKgotIE5PVEUuCi0gV2hlbiB3cml0aW5nIFJBVyB0aGUgWklQNjQgZXh0ZW5kZWQgaW5mb3JtYXRpb24gaW4gZXh0cmFmaWVsZF9sb2NhbCBhbmQgZXh0cmFmaWVsZF9nbG9iYWwgbmVlZHMgdG8gYmUgc3RyaXBwZWQKLSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGl0IGNhbiBiZSBkb25lIHdpdGggemlwUmVtb3ZlRXh0cmFJbmZvQmxvY2sKLQotIEl0IGlzIG5vdCBkb25lIGhlcmUgYmVjYXVzZSB0aGVuIHdlIG5lZWQgdG8gcmVhbGxvYyBhIG5ldyBidWZmZXIgc2luY2UgcGFyYW1ldGVycyBhcmUgJ2NvbnN0JyBhbmQgSSB3YW50IHRvIG1pbmltaXplCi0gdW5uZWNlc3NhcnkgYWxsb2NhdGlvbnMuCi0gKi8KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoemlwRmlsZSBmaWxlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsIGludCBtZXRob2QsIGludCBsZXZlbCwgaW50IHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMsaW50IG1lbUxldmVsLCBpbnQgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkLCB1TG9uZyBjcmNGb3JDcnlwdGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgdmVyc2lvbk1hZGVCeSwgdUxvbmcgZmxhZ0Jhc2UsIGludCB6aXA2NCkKLXsKLSAgICB6aXA2NF9pbnRlcm5hbCogemk7Ci0gICAgdUludCBzaXplX2ZpbGVuYW1lOwotICAgIHVJbnQgc2l6ZV9jb21tZW50OwotICAgIHVJbnQgaTsKLSAgICBpbnQgZXJyID0gWklQX09LOwotCi0jICAgIGlmZGVmIE5PQ1JZUFQKLSAgICAoY3JjRm9yQ3J5cHRpbmcpOwotICAgIGlmIChwYXNzd29yZCAhPSBOVUxMKQotICAgICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7Ci0jICAgIGVuZGlmCi0KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7Ci0KLSNpZmRlZiBIQVZFX0JaSVAyCi0gICAgaWYgKChtZXRob2QhPTApICYmIChtZXRob2QhPVpfREVGTEFURUQpICYmIChtZXRob2QhPVpfQlpJUDJFRCkpCi0gICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7Ci0jZWxzZQotICAgIGlmICgobWV0aG9kIT0wKSAmJiAobWV0aG9kIT1aX0RFRkxBVEVEKSkKLSAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsKLSNlbmRpZgotCi0gICAgemkgPSAoemlwNjRfaW50ZXJuYWwqKWZpbGU7Ci0KLSAgICBpZiAoemktPmluX29wZW5lZF9maWxlX2luemlwID09IDEpCi0gICAgewotICAgICAgICBlcnIgPSB6aXBDbG9zZUZpbGVJblppcCAoZmlsZSk7Ci0gICAgICAgIGlmIChlcnIgIT0gWklQX09LKQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoZmlsZW5hbWU9PU5VTEwpCi0gICAgICAgIGZpbGVuYW1lPSItIjsKLQotICAgIGlmIChjb21tZW50PT1OVUxMKQotICAgICAgICBzaXplX2NvbW1lbnQgPSAwOwotICAgIGVsc2UKLSAgICAgICAgc2l6ZV9jb21tZW50ID0gKHVJbnQpc3RybGVuKGNvbW1lbnQpOwotCi0gICAgc2l6ZV9maWxlbmFtZSA9ICh1SW50KXN0cmxlbihmaWxlbmFtZSk7Ci0KLSAgICBpZiAoemlwZmkgPT0gTlVMTCkKLSAgICAgICAgemktPmNpLmRvc0RhdGUgPSAwOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICh6aXBmaS0+ZG9zRGF0ZSAhPSAwKQotICAgICAgICAgICAgemktPmNpLmRvc0RhdGUgPSB6aXBmaS0+ZG9zRGF0ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHppLT5jaS5kb3NEYXRlID0gemlwNjRsb2NhbF9UbXpEYXRlVG9Eb3NEYXRlKCZ6aXBmaS0+dG16X2RhdGUpOwotICAgIH0KLQotICAgIHppLT5jaS5mbGFnID0gZmxhZ0Jhc2U7Ci0gICAgaWYgKChsZXZlbD09OCkgfHwgKGxldmVsPT05KSkKLSAgICAgIHppLT5jaS5mbGFnIHw9IDI7Ci0gICAgaWYgKGxldmVsPT0yKQotICAgICAgemktPmNpLmZsYWcgfD0gNDsKLSAgICBpZiAobGV2ZWw9PTEpCi0gICAgICB6aS0+Y2kuZmxhZyB8PSA2OwotICAgIGlmIChwYXNzd29yZCAhPSBOVUxMKQotICAgICAgemktPmNpLmZsYWcgfD0gMTsKLQotICAgIHppLT5jaS5jcmMzMiA9IDA7Ci0gICAgemktPmNpLm1ldGhvZCA9IG1ldGhvZDsKLSAgICB6aS0+Y2kuZW5jcnlwdCA9IDA7Ci0gICAgemktPmNpLnN0cmVhbV9pbml0aWFsaXNlZCA9IDA7Ci0gICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhID0gMDsKLSAgICB6aS0+Y2kucmF3ID0gcmF3OwotICAgIHppLT5jaS5wb3NfbG9jYWxfaGVhZGVyID0gWlRFTEw2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSk7Ci0KLSAgICB6aS0+Y2kuc2l6ZV9jZW50cmFsaGVhZGVyID0gU0laRUNFTlRSQUxIRUFERVIgKyBzaXplX2ZpbGVuYW1lICsgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCArIHNpemVfY29tbWVudDsKLSAgICB6aS0+Y2kuc2l6ZV9jZW50cmFsRXh0cmFGcmVlID0gMzI7IC8vIEV4dHJhIHNwYWNlIHdlIGhhdmUgcmVzZXJ2ZWQgaW4gY2FzZSB3ZSBuZWVkIHRvIGFkZCBaSVA2NCBleHRyYSBpbmZvIGRhdGEKLQotICAgIHppLT5jaS5jZW50cmFsX2hlYWRlciA9IChjaGFyKilBTExPQygodUludCl6aS0+Y2kuc2l6ZV9jZW50cmFsaGVhZGVyICsgemktPmNpLnNpemVfY2VudHJhbEV4dHJhRnJlZSk7Ci0KLSAgICB6aS0+Y2kuc2l6ZV9jZW50cmFsRXh0cmEgPSBzaXplX2V4dHJhZmllbGRfZ2xvYmFsOwotICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyLCh1TG9uZylDRU5UUkFMSEVBREVSTUFHSUMsNCk7Ci0gICAgLyogdmVyc2lvbiBpbmZvICovCi0gICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrNCwodUxvbmcpdmVyc2lvbk1hZGVCeSwyKTsKLSAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcis2LCh1TG9uZykyMCwyKTsKLSAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcis4LCh1TG9uZyl6aS0+Y2kuZmxhZywyKTsKLSAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisxMCwodUxvbmcpemktPmNpLm1ldGhvZCwyKTsKLSAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisxMiwodUxvbmcpemktPmNpLmRvc0RhdGUsNCk7Ci0gICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMTYsKHVMb25nKTAsNCk7IC8qY3JjKi8KLSAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyMCwodUxvbmcpMCw0KTsgLypjb21wciBzaXplKi8KLSAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyNCwodUxvbmcpMCw0KTsgLyp1bmNvbXByIHNpemUqLwotICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzI4LCh1TG9uZylzaXplX2ZpbGVuYW1lLDIpOwotICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzMwLCh1TG9uZylzaXplX2V4dHJhZmllbGRfZ2xvYmFsLDIpOwotICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzMyLCh1TG9uZylzaXplX2NvbW1lbnQsMik7Ci0gICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzQsKHVMb25nKTAsMik7IC8qZGlzayBubSBzdGFydCovCi0KLSAgICBpZiAoemlwZmk9PU5VTEwpCi0gICAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzM2LCh1TG9uZykwLDIpOwotICAgIGVsc2UKLSAgICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzYsKHVMb25nKXppcGZpLT5pbnRlcm5hbF9mYSwyKTsKLQotICAgIGlmICh6aXBmaT09TlVMTCkKLSAgICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzgsKHVMb25nKTAsNCk7Ci0gICAgZWxzZQotICAgICAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlciszOCwodUxvbmcpemlwZmktPmV4dGVybmFsX2ZhLDQpOwotCi0gICAgaWYoemktPmNpLnBvc19sb2NhbF9oZWFkZXIgPj0gMHhmZmZmZmZmZikKLSAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzQyLCh1TG9uZykweGZmZmZmZmZmLDQpOwotICAgIGVsc2UKLSAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzQyLCh1TG9uZyl6aS0+Y2kucG9zX2xvY2FsX2hlYWRlciAtIHppLT5hZGRfcG9zaXRpb25fd2hlbl93cml0dGluZ19vZmZzZXQsNCk7Ci0KLSAgICBmb3IgKGk9MDtpPHNpemVfZmlsZW5hbWU7aSsrKQotICAgICAgICAqKHppLT5jaS5jZW50cmFsX2hlYWRlcitTSVpFQ0VOVFJBTEhFQURFUitpKSA9ICooZmlsZW5hbWUraSk7Ci0KLSAgICBmb3IgKGk9MDtpPHNpemVfZXh0cmFmaWVsZF9nbG9iYWw7aSsrKQotICAgICAgICAqKHppLT5jaS5jZW50cmFsX2hlYWRlcitTSVpFQ0VOVFJBTEhFQURFUitzaXplX2ZpbGVuYW1lK2kpID0KLSAgICAgICAgICAgICAgKigoKGNvbnN0IGNoYXIqKWV4dHJhZmllbGRfZ2xvYmFsKStpKTsKLQotICAgIGZvciAoaT0wO2k8c2l6ZV9jb21tZW50O2krKykKLSAgICAgICAgKih6aS0+Y2kuY2VudHJhbF9oZWFkZXIrU0laRUNFTlRSQUxIRUFERVIrc2l6ZV9maWxlbmFtZSsKLSAgICAgICAgICAgICAgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCtpKSA9ICooY29tbWVudCtpKTsKLSAgICBpZiAoemktPmNpLmNlbnRyYWxfaGVhZGVyID09IE5VTEwpCi0gICAgICAgIHJldHVybiBaSVBfSU5URVJOQUxFUlJPUjsKLQotICAgIHppLT5jaS56aXA2NCA9IHppcDY0OwotICAgIHppLT5jaS50b3RhbENvbXByZXNzZWREYXRhID0gMDsKLSAgICB6aS0+Y2kudG90YWxVbmNvbXByZXNzZWREYXRhID0gMDsKLSAgICB6aS0+Y2kucG9zX3ppcDY0ZXh0cmFpbmZvID0gMDsKLQotICAgIGVyciA9IFdyaXRlX0xvY2FsRmlsZUhlYWRlcih6aSwgZmlsZW5hbWUsIHNpemVfZXh0cmFmaWVsZF9sb2NhbCwgZXh0cmFmaWVsZF9sb2NhbCk7Ci0KLSNpZmRlZiBIQVZFX0JaSVAyCi0gICAgemktPmNpLmJzdHJlYW0uYXZhaWxfaW4gPSAodUludCkwOwotICAgIHppLT5jaS5ic3RyZWFtLmF2YWlsX291dCA9ICh1SW50KVpfQlVGU0laRTsKLSAgICB6aS0+Y2kuYnN0cmVhbS5uZXh0X291dCA9IChjaGFyKil6aS0+Y2kuYnVmZmVyZWRfZGF0YTsKLSAgICB6aS0+Y2kuYnN0cmVhbS50b3RhbF9pbl9oaTMyID0gMDsKLSAgICB6aS0+Y2kuYnN0cmVhbS50b3RhbF9pbl9sbzMyID0gMDsKLSAgICB6aS0+Y2kuYnN0cmVhbS50b3RhbF9vdXRfaGkzMiA9IDA7Ci0gICAgemktPmNpLmJzdHJlYW0udG90YWxfb3V0X2xvMzIgPSAwOwotI2VuZGlmCi0KLSAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpMDsKLSAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KVpfQlVGU0laRTsKLSAgICB6aS0+Y2kuc3RyZWFtLm5leHRfb3V0ID0gemktPmNpLmJ1ZmZlcmVkX2RhdGE7Ci0gICAgemktPmNpLnN0cmVhbS50b3RhbF9pbiA9IDA7Ci0gICAgemktPmNpLnN0cmVhbS50b3RhbF9vdXQgPSAwOwotICAgIHppLT5jaS5zdHJlYW0uZGF0YV90eXBlID0gWl9CSU5BUlk7Ci0KLSNpZmRlZiBIQVZFX0JaSVAyCi0gICAgaWYgKChlcnI9PVpJUF9PSykgJiYgKHppLT5jaS5tZXRob2QgPT0gWl9ERUZMQVRFRCB8fCB6aS0+Y2kubWV0aG9kID09IFpfQlpJUDJFRCkgJiYgKCF6aS0+Y2kucmF3KSkKLSNlbHNlCi0gICAgaWYgKChlcnI9PVpJUF9PSykgJiYgKHppLT5jaS5tZXRob2QgPT0gWl9ERUZMQVRFRCkgJiYgKCF6aS0+Y2kucmF3KSkKLSNlbmRpZgotICAgIHsKLSAgICAgICAgaWYoemktPmNpLm1ldGhvZCA9PSBaX0RFRkxBVEVEKQotICAgICAgICB7Ci0gICAgICAgICAgemktPmNpLnN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOwotICAgICAgICAgIHppLT5jaS5zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7Ci0gICAgICAgICAgemktPmNpLnN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7Ci0KLSAgICAgICAgICBpZiAod2luZG93Qml0cz4wKQotICAgICAgICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7Ci0KLSAgICAgICAgICBlcnIgPSBkZWZsYXRlSW5pdDIoJnppLT5jaS5zdHJlYW0sIGxldmVsLCBaX0RFRkxBVEVELCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3kpOwotCi0gICAgICAgICAgaWYgKGVycj09Wl9PSykKLSAgICAgICAgICAgICAgemktPmNpLnN0cmVhbV9pbml0aWFsaXNlZCA9IFpfREVGTEFURUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih6aS0+Y2kubWV0aG9kID09IFpfQlpJUDJFRCkKLSAgICAgICAgewotI2lmZGVmIEhBVkVfQlpJUDIKLSAgICAgICAgICAgIC8vIEluaXQgQlppcCBzdHVmZiBoZXJlCi0gICAgICAgICAgemktPmNpLmJzdHJlYW0uYnphbGxvYyA9IDA7Ci0gICAgICAgICAgemktPmNpLmJzdHJlYW0uYnpmcmVlID0gMDsKLSAgICAgICAgICB6aS0+Y2kuYnN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7Ci0KLSAgICAgICAgICBlcnIgPSBCWjJfYnpDb21wcmVzc0luaXQoJnppLT5jaS5ic3RyZWFtLCBsZXZlbCwgMCwzNSk7Ci0gICAgICAgICAgaWYoZXJyID09IEJaX09LKQotICAgICAgICAgICAgemktPmNpLnN0cmVhbV9pbml0aWFsaXNlZCA9IFpfQlpJUDJFRDsKLSNlbmRpZgotICAgICAgICB9Ci0KLSAgICB9Ci0KLSMgICAgaWZuZGVmIE5PQ1JZUFQKLSAgICB6aS0+Y2kuY3J5cHRfaGVhZGVyX3NpemUgPSAwOwotICAgIGlmICgoZXJyPT1aX09LKSAmJiAocGFzc3dvcmQgIT0gTlVMTCkpCi0gICAgewotICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZkhlYWRbUkFORF9IRUFEX0xFTl07Ci0gICAgICAgIHVuc2lnbmVkIGludCBzaXplSGVhZDsKLSAgICAgICAgemktPmNpLmVuY3J5cHQgPSAxOwotICAgICAgICB6aS0+Y2kucGNyY18zMl90YWIgPSBnZXRfY3JjX3RhYmxlKCk7Ci0gICAgICAgIC8qaW5pdF9rZXlzKHBhc3N3b3JkLHppLT5jaS5rZXlzLHppLT5jaS5wY3JjXzMyX3RhYik7Ki8KLQotICAgICAgICBzaXplSGVhZD1jcnlwdGhlYWQocGFzc3dvcmQsYnVmSGVhZCxSQU5EX0hFQURfTEVOLHppLT5jaS5rZXlzLHppLT5jaS5wY3JjXzMyX3RhYixjcmNGb3JDcnlwdGluZyk7Ci0gICAgICAgIHppLT5jaS5jcnlwdF9oZWFkZXJfc2l6ZSA9IHNpemVIZWFkOwotCi0gICAgICAgIGlmIChaV1JJVEU2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSxidWZIZWFkLHNpemVIZWFkKSAhPSBzaXplSGVhZCkKLSAgICAgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87Ci0gICAgfQotIyAgICBlbmRpZgotCi0gICAgaWYgKGVycj09Wl9PSykKLSAgICAgICAgemktPmluX29wZW5lZF9maWxlX2luemlwID0gMTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1leHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcDQgKHppcEZpbGUgZmlsZSwgY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfbG9jYWwsIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2dsb2JhbCwgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tZW50LCBpbnQgbWV0aG9kLCBpbnQgbGV2ZWwsIGludCByYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dCaXRzLGludCBtZW1MZXZlbCwgaW50IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCwgdUxvbmcgY3JjRm9yQ3J5cHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHZlcnNpb25NYWRlQnksIHVMb25nIGZsYWdCYXNlKQotewotICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCByYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCwgY3JjRm9yQ3J5cHRpbmcsIHZlcnNpb25NYWRlQnksIGZsYWdCYXNlLCAwKTsKLX0KLQotZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAzICh6aXBGaWxlIGZpbGUsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwgaW50IG1ldGhvZCwgaW50IGxldmVsLCBpbnQgcmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cyxpbnQgbWVtTGV2ZWwsIGludCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFzc3dvcmQsIHVMb25nIGNyY0ZvckNyeXB0aW5nKQotewotICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCByYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCwgY3JjRm9yQ3J5cHRpbmcsIFZFUlNJT05NQURFQlksIDAsIDApOwotfQotCi1leHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcDNfNjQoemlwRmlsZSBmaWxlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsIGludCBtZXRob2QsIGludCBsZXZlbCwgaW50IHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMsaW50IG1lbUxldmVsLCBpbnQgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkLCB1TG9uZyBjcmNGb3JDcnlwdGluZywgaW50IHppcDY0KQotewotICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCByYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCwgY3JjRm9yQ3J5cHRpbmcsIFZFUlNJT05NQURFQlksIDAsIHppcDY0KTsKLX0KLQotZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAyKHppcEZpbGUgZmlsZSwgY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tZW50LCBpbnQgbWV0aG9kLCBpbnQgbGV2ZWwsIGludCByYXcpCi17Ci0gICAgcmV0dXJuIHppcE9wZW5OZXdGaWxlSW5aaXA0XzY0IChmaWxlLCBmaWxlbmFtZSwgemlwZmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2xvY2FsLCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2dsb2JhbCwgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQsIG1ldGhvZCwgbGV2ZWwsIHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1NQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIFZFUlNJT05NQURFQlksIDAsIDApOwotfQotCi1leHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcDJfNjQoemlwRmlsZSBmaWxlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2dsb2JhbCwgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsIGludCBtZXRob2QsIGludCBsZXZlbCwgaW50IHJhdywgaW50IHppcDY0KQotewotICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCByYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBWRVJTSU9OTUFERUJZLCAwLCB6aXA2NCk7Ci19Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwNjQgKHppcEZpbGUgZmlsZSwgY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCpleHRyYWZpZWxkX2dsb2JhbCwgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsIGludCBtZXRob2QsIGludCBsZXZlbCwgaW50IHppcDY0KQotewotICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLU1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgVkVSU0lPTk1BREVCWSwgMCwgemlwNjQpOwotfQotCi1leHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcCAoemlwRmlsZSBmaWxlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKmV4dHJhZmllbGRfZ2xvYmFsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwgaW50IG1ldGhvZCwgaW50IGxldmVsKQotewotICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLU1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgVkVSU0lPTk1BREVCWSwgMCwgMCk7Ci19Ci0KLWxvY2FsIGludCB6aXA2NEZsdXNoV3JpdGVCdWZmZXIoemlwNjRfaW50ZXJuYWwqIHppKQotewotICAgIGludCBlcnI9WklQX09LOwotCi0gICAgaWYgKHppLT5jaS5lbmNyeXB0ICE9IDApCi0gICAgewotI2lmbmRlZiBOT0NSWVBUCi0gICAgICAgIHVJbnQgaTsKLSAgICAgICAgaW50IHQ7Ci0gICAgICAgIGZvciAoaT0wO2k8emktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhO2krKykKLSAgICAgICAgICAgIHppLT5jaS5idWZmZXJlZF9kYXRhW2ldID0gemVuY29kZSh6aS0+Y2kua2V5cywgemktPmNpLnBjcmNfMzJfdGFiLCB6aS0+Y2kuYnVmZmVyZWRfZGF0YVtpXSx0KTsKLSNlbmRpZgotICAgIH0KLQotICAgIGlmIChaV1JJVEU2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSx6aS0+Y2kuYnVmZmVyZWRfZGF0YSx6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGEpICE9IHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSkKLSAgICAgIGVyciA9IFpJUF9FUlJOTzsKLQotICAgIHppLT5jaS50b3RhbENvbXByZXNzZWREYXRhICs9IHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YTsKLQotI2lmZGVmIEhBVkVfQlpJUDIKLSAgICBpZih6aS0+Y2kubWV0aG9kID09IFpfQlpJUDJFRCkKLSAgICB7Ci0gICAgICB6aS0+Y2kudG90YWxVbmNvbXByZXNzZWREYXRhICs9IHppLT5jaS5ic3RyZWFtLnRvdGFsX2luX2xvMzI7Ci0gICAgICB6aS0+Y2kuYnN0cmVhbS50b3RhbF9pbl9sbzMyID0gMDsKLSAgICAgIHppLT5jaS5ic3RyZWFtLnRvdGFsX2luX2hpMzIgPSAwOwotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYKLSAgICB7Ci0gICAgICB6aS0+Y2kudG90YWxVbmNvbXByZXNzZWREYXRhICs9IHppLT5jaS5zdHJlYW0udG90YWxfaW47Ci0gICAgICB6aS0+Y2kuc3RyZWFtLnRvdGFsX2luID0gMDsKLSAgICB9Ci0KLQotICAgIHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSA9IDA7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1leHRlcm4gaW50IFpFWFBPUlQgemlwV3JpdGVJbkZpbGVJblppcCAoemlwRmlsZSBmaWxlLGNvbnN0IHZvaWQqIGJ1Zix1bnNpZ25lZCBpbnQgbGVuKQotewotICAgIHppcDY0X2ludGVybmFsKiB6aTsKLSAgICBpbnQgZXJyPVpJUF9PSzsKLQotICAgIGlmIChmaWxlID09IE5VTEwpCi0gICAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsKLSAgICB6aSA9ICh6aXA2NF9pbnRlcm5hbCopZmlsZTsKLQotICAgIGlmICh6aS0+aW5fb3BlbmVkX2ZpbGVfaW56aXAgPT0gMCkKLSAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOwotCi0gICAgemktPmNpLmNyYzMyID0gY3JjMzIoemktPmNpLmNyYzMyLGJ1ZiwodUludClsZW4pOwotCi0jaWZkZWYgSEFWRV9CWklQMgotICAgIGlmKHppLT5jaS5tZXRob2QgPT0gWl9CWklQMkVEICYmICghemktPmNpLnJhdykpCi0gICAgewotICAgICAgemktPmNpLmJzdHJlYW0ubmV4dF9pbiA9ICh2b2lkKilidWY7Ci0gICAgICB6aS0+Y2kuYnN0cmVhbS5hdmFpbF9pbiA9IGxlbjsKLSAgICAgIGVyciA9IEJaX1JVTl9PSzsKLQotICAgICAgd2hpbGUgKChlcnI9PUJaX1JVTl9PSykgJiYgKHppLT5jaS5ic3RyZWFtLmF2YWlsX2luPjApKQotICAgICAgewotICAgICAgICBpZiAoemktPmNpLmJzdHJlYW0uYXZhaWxfb3V0ID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoemlwNjRGbHVzaFdyaXRlQnVmZmVyKHppKSA9PSBaSVBfRVJSTk8pCi0gICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87Ci0gICAgICAgICAgemktPmNpLmJzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpWl9CVUZTSVpFOwotICAgICAgICAgIHppLT5jaS5ic3RyZWFtLm5leHRfb3V0ID0gKGNoYXIqKXppLT5jaS5idWZmZXJlZF9kYXRhOwotICAgICAgICB9Ci0KLQotICAgICAgICBpZihlcnIgIT0gQlpfUlVOX09LKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmICgoemktPmNpLm1ldGhvZCA9PSBaX0JaSVAyRUQpICYmICghemktPmNpLnJhdykpCi0gICAgICAgIHsKLSAgICAgICAgICB1TG9uZyB1VG90YWxPdXRCZWZvcmVfbG8gPSB6aS0+Y2kuYnN0cmVhbS50b3RhbF9vdXRfbG8zMjsKLS8vICAgICAgICAgIHVMb25nIHVUb3RhbE91dEJlZm9yZV9oaSA9IHppLT5jaS5ic3RyZWFtLnRvdGFsX291dF9oaTMyOwotICAgICAgICAgIGVycj1CWjJfYnpDb21wcmVzcygmemktPmNpLmJzdHJlYW0sICBCWl9SVU4pOwotCi0gICAgICAgICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhICs9ICh1SW50KSh6aS0+Y2kuYnN0cmVhbS50b3RhbF9vdXRfbG8zMiAtIHVUb3RhbE91dEJlZm9yZV9sbykgOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmKGVyciA9PSBCWl9SVU5fT0spCi0gICAgICAgIGVyciA9IFpJUF9PSzsKLSAgICB9Ci0gICAgZWxzZQotI2VuZGlmCi0gICAgewotICAgICAgemktPmNpLnN0cmVhbS5uZXh0X2luID0gKEJ5dGVmKilidWY7Ci0gICAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX2luID0gbGVuOwotCi0gICAgICB3aGlsZSAoKGVycj09WklQX09LKSAmJiAoemktPmNpLnN0cmVhbS5hdmFpbF9pbj4wKSkKLSAgICAgIHsKLSAgICAgICAgICBpZiAoemktPmNpLnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICh6aXA2NEZsdXNoV3JpdGVCdWZmZXIoemkpID09IFpJUF9FUlJOTykKLSAgICAgICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKLSAgICAgICAgICAgICAgemktPmNpLnN0cmVhbS5hdmFpbF9vdXQgPSAodUludClaX0JVRlNJWkU7Ci0gICAgICAgICAgICAgIHppLT5jaS5zdHJlYW0ubmV4dF9vdXQgPSB6aS0+Y2kuYnVmZmVyZWRfZGF0YTsKLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgIGlmKGVyciAhPSBaSVBfT0spCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgaWYgKCh6aS0+Y2kubWV0aG9kID09IFpfREVGTEFURUQpICYmICghemktPmNpLnJhdykpCi0gICAgICAgICAgewotICAgICAgICAgICAgICB1TG9uZyB1VG90YWxPdXRCZWZvcmUgPSB6aS0+Y2kuc3RyZWFtLnRvdGFsX291dDsKLSAgICAgICAgICAgICAgZXJyPWRlZmxhdGUoJnppLT5jaS5zdHJlYW0sICBaX05PX0ZMVVNIKTsKLSAgICAgICAgICAgICAgaWYodVRvdGFsT3V0QmVmb3JlID4gemktPmNpLnN0cmVhbS50b3RhbF9vdXQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgYkJyZWFrID0gMDsKLSAgICAgICAgICAgICAgICBiQnJlYWsrKzsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSArPSAodUludCkoemktPmNpLnN0cmVhbS50b3RhbF9vdXQgLSB1VG90YWxPdXRCZWZvcmUpIDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdUludCBjb3B5X3RoaXMsaTsKLSAgICAgICAgICAgICAgaWYgKHppLT5jaS5zdHJlYW0uYXZhaWxfaW4gPCB6aS0+Y2kuc3RyZWFtLmF2YWlsX291dCkKLSAgICAgICAgICAgICAgICAgIGNvcHlfdGhpcyA9IHppLT5jaS5zdHJlYW0uYXZhaWxfaW47Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIGNvcHlfdGhpcyA9IHppLT5jaS5zdHJlYW0uYXZhaWxfb3V0OwotCi0gICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3B5X3RoaXM7IGkrKykKLSAgICAgICAgICAgICAgICAgICooKChjaGFyKil6aS0+Y2kuc3RyZWFtLm5leHRfb3V0KStpKSA9Ci0gICAgICAgICAgICAgICAgICAgICAgKigoKGNvbnN0IGNoYXIqKXppLT5jaS5zdHJlYW0ubmV4dF9pbikraSk7Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHppLT5jaS5zdHJlYW0uYXZhaWxfaW4gLT0gY29weV90aGlzOwotICAgICAgICAgICAgICAgICAgemktPmNpLnN0cmVhbS5hdmFpbF9vdXQtPSBjb3B5X3RoaXM7Ci0gICAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLm5leHRfaW4rPSBjb3B5X3RoaXM7Ci0gICAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLm5leHRfb3V0Kz0gY29weV90aGlzOwotICAgICAgICAgICAgICAgICAgemktPmNpLnN0cmVhbS50b3RhbF9pbis9IGNvcHlfdGhpczsKLSAgICAgICAgICAgICAgICAgIHppLT5jaS5zdHJlYW0udG90YWxfb3V0Kz0gY29weV90aGlzOwotICAgICAgICAgICAgICAgICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhICs9IGNvcHlfdGhpczsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgIH0vLyB3aGlsZSguLi4pCi0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlRmlsZUluWmlwUmF3ICh6aXBGaWxlIGZpbGUsIHVMb25nIHVuY29tcHJlc3NlZF9zaXplLCB1TG9uZyBjcmMzMikKLXsKLSAgICByZXR1cm4gemlwQ2xvc2VGaWxlSW5aaXBSYXc2NCAoZmlsZSwgdW5jb21wcmVzc2VkX3NpemUsIGNyYzMyKTsKLX0KLQotZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlRmlsZUluWmlwUmF3NjQgKHppcEZpbGUgZmlsZSwgWlBPUzY0X1QgdW5jb21wcmVzc2VkX3NpemUsIHVMb25nIGNyYzMyKQotewotICAgIHppcDY0X2ludGVybmFsKiB6aTsKLSAgICBaUE9TNjRfVCBjb21wcmVzc2VkX3NpemU7Ci0gICAgdUxvbmcgaW52YWxpZFZhbHVlID0gMHhmZmZmZmZmZjsKLSAgICBzaG9ydCBkYXRhc2l6ZSA9IDA7Ci0gICAgaW50IGVycj1aSVBfT0s7Ci0KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7Ci0gICAgemkgPSAoemlwNjRfaW50ZXJuYWwqKWZpbGU7Ci0KLSAgICBpZiAoemktPmluX29wZW5lZF9maWxlX2luemlwID09IDApCi0gICAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsKLSAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX2luID0gMDsKLQotICAgIGlmICgoemktPmNpLm1ldGhvZCA9PSBaX0RFRkxBVEVEKSAmJiAoIXppLT5jaS5yYXcpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlcnI9PVpJUF9PSykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgdVRvdGFsT3V0QmVmb3JlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoemktPmNpLnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6aXA2NEZsdXNoV3JpdGVCdWZmZXIoemkpID09IFpJUF9FUlJOTykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KVpfQlVGU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLm5leHRfb3V0ID0gemktPmNpLmJ1ZmZlcmVkX2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdVRvdGFsT3V0QmVmb3JlID0gemktPmNpLnN0cmVhbS50b3RhbF9vdXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycj1kZWZsYXRlKCZ6aS0+Y2kuc3RyZWFtLCAgWl9GSU5JU0gpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGEgKz0gKHVJbnQpKHppLT5jaS5zdHJlYW0udG90YWxfb3V0IC0gdVRvdGFsT3V0QmVmb3JlKSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgIGVsc2UgaWYgKCh6aS0+Y2kubWV0aG9kID09IFpfQlpJUDJFRCkgJiYgKCF6aS0+Y2kucmF3KSkKLSAgICB7Ci0jaWZkZWYgSEFWRV9CWklQMgotICAgICAgZXJyID0gQlpfRklOSVNIX09LOwotICAgICAgd2hpbGUgKGVycj09QlpfRklOSVNIX09LKQotICAgICAgewotICAgICAgICB1TG9uZyB1VG90YWxPdXRCZWZvcmU7Ci0gICAgICAgIGlmICh6aS0+Y2kuYnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIGlmICh6aXA2NEZsdXNoV3JpdGVCdWZmZXIoemkpID09IFpJUF9FUlJOTykKLSAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKLSAgICAgICAgICB6aS0+Y2kuYnN0cmVhbS5hdmFpbF9vdXQgPSAodUludClaX0JVRlNJWkU7Ci0gICAgICAgICAgemktPmNpLmJzdHJlYW0ubmV4dF9vdXQgPSAoY2hhciopemktPmNpLmJ1ZmZlcmVkX2RhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgdVRvdGFsT3V0QmVmb3JlID0gemktPmNpLmJzdHJlYW0udG90YWxfb3V0X2xvMzI7Ci0gICAgICAgIGVycj1CWjJfYnpDb21wcmVzcygmemktPmNpLmJzdHJlYW0sICBCWl9GSU5JU0gpOwotICAgICAgICBpZihlcnIgPT0gQlpfU1RSRUFNX0VORCkKLSAgICAgICAgICBlcnIgPSBaX1NUUkVBTV9FTkQ7Ci0KLSAgICAgICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhICs9ICh1SW50KSh6aS0+Y2kuYnN0cmVhbS50b3RhbF9vdXRfbG8zMiAtIHVUb3RhbE91dEJlZm9yZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmKGVyciA9PSBCWl9GSU5JU0hfT0spCi0gICAgICAgIGVyciA9IFpJUF9PSzsKLSNlbmRpZgotICAgIH0KLQotICAgIGlmIChlcnI9PVpfU1RSRUFNX0VORCkKLSAgICAgICAgZXJyPVpJUF9PSzsgLyogdGhpcyBpcyBub3JtYWwgKi8KLQotICAgIGlmICgoemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhPjApICYmIChlcnI9PVpJUF9PSykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICBpZiAoemlwNjRGbHVzaFdyaXRlQnVmZmVyKHppKT09WklQX0VSUk5PKQotICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotICAgICAgICAgICAgICAgIH0KLQotICAgIGlmICgoemktPmNpLm1ldGhvZCA9PSBaX0RFRkxBVEVEKSAmJiAoIXppLT5jaS5yYXcpKQotICAgIHsKLSAgICAgICAgaW50IHRtcF9lcnIgPSBkZWZsYXRlRW5kKCZ6aS0+Y2kuc3RyZWFtKTsKLSAgICAgICAgaWYgKGVyciA9PSBaSVBfT0spCi0gICAgICAgICAgICBlcnIgPSB0bXBfZXJyOwotICAgICAgICB6aS0+Y2kuc3RyZWFtX2luaXRpYWxpc2VkID0gMDsKLSAgICB9Ci0jaWZkZWYgSEFWRV9CWklQMgotICAgIGVsc2UgaWYoKHppLT5jaS5tZXRob2QgPT0gWl9CWklQMkVEKSAmJiAoIXppLT5jaS5yYXcpKQotICAgIHsKLSAgICAgIGludCB0bXBlcnIgPSBCWjJfYnpDb21wcmVzc0VuZCgmemktPmNpLmJzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycj09WklQX09LKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB0bXBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtX2luaXRpYWxpc2VkID0gMDsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmICghemktPmNpLnJhdykKLSAgICB7Ci0gICAgICAgIGNyYzMyID0gKHVMb25nKXppLT5jaS5jcmMzMjsKLSAgICAgICAgdW5jb21wcmVzc2VkX3NpemUgPSB6aS0+Y2kudG90YWxVbmNvbXByZXNzZWREYXRhOwotICAgIH0KLSAgICBjb21wcmVzc2VkX3NpemUgPSB6aS0+Y2kudG90YWxDb21wcmVzc2VkRGF0YTsKLQotIyAgICBpZm5kZWYgTk9DUllQVAotICAgIGNvbXByZXNzZWRfc2l6ZSArPSB6aS0+Y2kuY3J5cHRfaGVhZGVyX3NpemU7Ci0jICAgIGVuZGlmCi0KLSAgICAvLyB1cGRhdGUgQ3VycmVudCBJdGVtIGNyYyBhbmQgc2l6ZXMsCi0gICAgaWYoY29tcHJlc3NlZF9zaXplID49IDB4ZmZmZmZmZmYgfHwgdW5jb21wcmVzc2VkX3NpemUgPj0gMHhmZmZmZmZmZiB8fCB6aS0+Y2kucG9zX2xvY2FsX2hlYWRlciA+PSAweGZmZmZmZmZmKQotICAgIHsKLSAgICAgIC8qdmVyc2lvbiBNYWRlIGJ5Ki8KLSAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzQsKHVMb25nKTQ1LDIpOwotICAgICAgLyp2ZXJzaW9uIG5lZWRlZCovCi0gICAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcis2LCh1TG9uZyk0NSwyKTsKLQotICAgIH0KLQotICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzE2LGNyYzMyLDQpOyAvKmNyYyovCi0KLQotICAgIGlmKGNvbXByZXNzZWRfc2l6ZSA+PSAweGZmZmZmZmZmKQotICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMjAsIGludmFsaWRWYWx1ZSw0KTsgLypjb21wciBzaXplKi8KLSAgICBlbHNlCi0gICAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyMCwgY29tcHJlc3NlZF9zaXplLDQpOyAvKmNvbXByIHNpemUqLwotCi0gICAgLy8vIHNldCBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgZmllbGQKLSAgICBpZiAoemktPmNpLnN0cmVhbS5kYXRhX3R5cGUgPT0gWl9BU0NJSSkKLSAgICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzYsKHVMb25nKVpfQVNDSUksMik7Ci0KLSAgICBpZih1bmNvbXByZXNzZWRfc2l6ZSA+PSAweGZmZmZmZmZmKQotICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMjQsIGludmFsaWRWYWx1ZSw0KTsgLyp1bmNvbXByIHNpemUqLwotICAgIGVsc2UKLSAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzI0LCB1bmNvbXByZXNzZWRfc2l6ZSw0KTsgLyp1bmNvbXByIHNpemUqLwotCi0gICAgLy8gQWRkIFpJUDY0IGV4dHJhIGluZm8gZmllbGQgZm9yIHVuY29tcHJlc3NlZCBzaXplCi0gICAgaWYodW5jb21wcmVzc2VkX3NpemUgPj0gMHhmZmZmZmZmZikKLSAgICAgIGRhdGFzaXplICs9IDg7Ci0KLSAgICAvLyBBZGQgWklQNjQgZXh0cmEgaW5mbyBmaWVsZCBmb3IgY29tcHJlc3NlZCBzaXplCi0gICAgaWYoY29tcHJlc3NlZF9zaXplID49IDB4ZmZmZmZmZmYpCi0gICAgICBkYXRhc2l6ZSArPSA4OwotCi0gICAgLy8gQWRkIFpJUDY0IGV4dHJhIGluZm8gZmllbGQgZm9yIHJlbGF0aXZlIG9mZnNldCB0byBsb2NhbCBmaWxlIGhlYWRlciBvZiBjdXJyZW50IGZpbGUKLSAgICBpZih6aS0+Y2kucG9zX2xvY2FsX2hlYWRlciA+PSAweGZmZmZmZmZmKQotICAgICAgZGF0YXNpemUgKz0gODsKLQotICAgIGlmKGRhdGFzaXplID4gMCkKLSAgICB7Ci0gICAgICBjaGFyKiBwID0gTlVMTDsKLQotICAgICAgaWYoKHVMb25nKShkYXRhc2l6ZSArIDQpID4gemktPmNpLnNpemVfY2VudHJhbEV4dHJhRnJlZSkKLSAgICAgIHsKLSAgICAgICAgLy8gd2UgY2FuIG5vdCB3cml0ZSBtb3JlIGRhdGEgdG8gdGhlIGJ1ZmZlciB0aGF0IHdlIGhhdmUgcm9vbSBmb3IuCi0gICAgICAgIHJldHVybiBaSVBfQkFEWklQRklMRTsKLSAgICAgIH0KLQotICAgICAgcCA9IHppLT5jaS5jZW50cmFsX2hlYWRlciArIHppLT5jaS5zaXplX2NlbnRyYWxoZWFkZXI7Ci0KLSAgICAgIC8vIEFkZCBFeHRyYSBJbmZvcm1hdGlvbiBIZWFkZXIgZm9yICdaSVA2NCBpbmZvcm1hdGlvbicKLSAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkocCwgMHgwMDAxLCAyKTsgLy8gSGVhZGVySUQKLSAgICAgIHAgKz0gMjsKLSAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkocCwgZGF0YXNpemUsIDIpOyAvLyBEYXRhU2l6ZQotICAgICAgcCArPSAyOwotCi0gICAgICBpZih1bmNvbXByZXNzZWRfc2l6ZSA+PSAweGZmZmZmZmZmKQotICAgICAgewotICAgICAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHAsIHVuY29tcHJlc3NlZF9zaXplLCA4KTsKLSAgICAgICAgcCArPSA4OwotICAgICAgfQotCi0gICAgICBpZihjb21wcmVzc2VkX3NpemUgPj0gMHhmZmZmZmZmZikKLSAgICAgIHsKLSAgICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeShwLCBjb21wcmVzc2VkX3NpemUsIDgpOwotICAgICAgICBwICs9IDg7Ci0gICAgICB9Ci0KLSAgICAgIGlmKHppLT5jaS5wb3NfbG9jYWxfaGVhZGVyID49IDB4ZmZmZmZmZmYpCi0gICAgICB7Ci0gICAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkocCwgemktPmNpLnBvc19sb2NhbF9oZWFkZXIsIDgpOwotICAgICAgICBwICs9IDg7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFVwZGF0ZSBob3cgbXVjaCBleHRyYSBmcmVlIHNwYWNlIHdlIGdvdCBpbiB0aGUgbWVtb3J5IGJ1ZmZlcgotICAgICAgLy8gYW5kIGluY3JlYXNlIHRoZSBjZW50cmFsaGVhZGVyIHNpemUgc28gdGhlIG5ldyBaSVA2NCBmaWVsZHMgYXJlIGluY2x1ZGVkCi0gICAgICAvLyAoIDQgYmVsb3cgaXMgdGhlIHNpemUgb2YgSGVhZGVySUQgYW5kIERhdGFTaXplIGZpZWxkICkKLSAgICAgIHppLT5jaS5zaXplX2NlbnRyYWxFeHRyYUZyZWUgLT0gZGF0YXNpemUgKyA0OwotICAgICAgemktPmNpLnNpemVfY2VudHJhbGhlYWRlciArPSBkYXRhc2l6ZSArIDQ7Ci0KLSAgICAgIC8vIFVwZGF0ZSB0aGUgZXh0cmEgaW5mbyBzaXplIGZpZWxkCi0gICAgICB6aS0+Y2kuc2l6ZV9jZW50cmFsRXh0cmEgKz0gZGF0YXNpemUgKyA0OwotICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzAsKHVMb25nKXppLT5jaS5zaXplX2NlbnRyYWxFeHRyYSwyKTsKLSAgICB9Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgIGVyciA9IGFkZF9kYXRhX2luX2RhdGFibG9jaygmemktPmNlbnRyYWxfZGlyLCB6aS0+Y2kuY2VudHJhbF9oZWFkZXIsICh1TG9uZyl6aS0+Y2kuc2l6ZV9jZW50cmFsaGVhZGVyKTsKLQotICAgIGZyZWUoemktPmNpLmNlbnRyYWxfaGVhZGVyKTsKLQotICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICB7Ci0gICAgICAgIC8vIFVwZGF0ZSB0aGUgTG9jYWxGaWxlSGVhZGVyIHdpdGggdGhlIG5ldyB2YWx1ZXMuCi0KLSAgICAgICAgWlBPUzY0X1QgY3VyX3Bvc19pbnppcCA9IFpURUxMNjQoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0pOwotCi0gICAgICAgIGlmIChaU0VFSzY0KHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCB6aS0+Y2kucG9zX2xvY2FsX2hlYWRlciArIDE0LFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQotICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotCi0gICAgICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICAgICAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLGNyYzMyLDQpOyAvKiBjcmMgMzIsIHVua25vd24gKi8KLQotICAgICAgICBpZih1bmNvbXByZXNzZWRfc2l6ZSA+PSAweGZmZmZmZmZmIHx8IGNvbXByZXNzZWRfc2l6ZSA+PSAweGZmZmZmZmZmICkKLSAgICAgICAgewotICAgICAgICAgIGlmKHppLT5jaS5wb3NfemlwNjRleHRyYWluZm8gPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2l6ZSBpbiB0aGUgWklQNjQgZXh0ZW5kZWQgZmllbGQuCi0gICAgICAgICAgICBpZiAoWlNFRUs2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwgemktPmNpLnBvc196aXA2NGV4dHJhaW5mbyArIDQsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCi0gICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKLQotICAgICAgICAgICAgaWYgKGVycj09WklQX09LKSAvKiBjb21wcmVzc2VkIHNpemUsIHVua25vd24gKi8KLSAgICAgICAgICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsIHppLT5maWxlc3RyZWFtLCB1bmNvbXByZXNzZWRfc2l6ZSwgOCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnI9PVpJUF9PSykgLyogdW5jb21wcmVzc2VkIHNpemUsIHVua25vd24gKi8KLSAgICAgICAgICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsIHppLT5maWxlc3RyZWFtLCBjb21wcmVzc2VkX3NpemUsIDgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGVyciA9IFpJUF9CQURaSVBGSUxFOyAvLyBDYWxsZXIgcGFzc2VkIHppcDY0ID0gMCwgc28gbm8gcm9vbSBmb3IgemlwNjQgaW5mbyAtPiBmYXRhbAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmIChlcnI9PVpJUF9PSykgLyogY29tcHJlc3NlZCBzaXplLCB1bmtub3duICovCi0gICAgICAgICAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLGNvbXByZXNzZWRfc2l6ZSw0KTsKLQotICAgICAgICAgIGlmIChlcnI9PVpJUF9PSykgLyogdW5jb21wcmVzc2VkIHNpemUsIHVua25vd24gKi8KLSAgICAgICAgICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sdW5jb21wcmVzc2VkX3NpemUsNCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoWlNFRUs2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwgY3VyX3Bvc19pbnppcCxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKLSAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKLSAgICB9Ci0KLSAgICB6aS0+bnVtYmVyX2VudHJ5ICsrOwotICAgIHppLT5pbl9vcGVuZWRfZmlsZV9pbnppcCA9IDA7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1leHRlcm4gaW50IFpFWFBPUlQgemlwQ2xvc2VGaWxlSW5aaXAgKHppcEZpbGUgZmlsZSkKLXsKLSAgICByZXR1cm4gemlwQ2xvc2VGaWxlSW5aaXBSYXcgKGZpbGUsMCwwKTsKLX0KLQotaW50IFdyaXRlX1ppcDY0RW5kT2ZDZW50cmFsRGlyZWN0b3J5TG9jYXRvcih6aXA2NF9pbnRlcm5hbCogemksIFpQT1M2NF9UIHppcDY0ZW9jZF9wb3NfaW56aXApCi17Ci0gIGludCBlcnIgPSBaSVBfT0s7Ci0gIFpQT1M2NF9UIHBvcyA9IHppcDY0ZW9jZF9wb3NfaW56aXAgLSB6aS0+YWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0OwotCi0gIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylaSVA2NEVORExPQ0hFQURFUk1BR0lDLDQpOwotCi0gIC8qbnVtIGRpc2tzKi8KLSAgICBpZiAoZXJyPT1aSVBfT0spIC8qIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KLSAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDQpOwotCi0gIC8qcmVsYXRpdmUgb2Zmc2V0Ki8KLSAgICBpZiAoZXJyPT1aSVBfT0spIC8qIFJlbGF0aXZlIG9mZnNldCB0byB0aGUgWmlwNjRFbmRPZkNlbnRyYWxEaXJlY3RvcnkgKi8KLSAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCBwb3MsOCk7Ci0KLSAgLyp0b3RhbCBkaXNrcyovIC8qIERvIG5vdCBzdXBwb3J0IHNwYXduaW5nIG9mIGRpc2sgc28gYWx3YXlzIHNheSAxIGhlcmUqLwotICAgIGlmIChlcnI9PVpJUF9PSykgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLwotICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTEsNCk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQgV3JpdGVfWmlwNjRFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoemlwNjRfaW50ZXJuYWwqIHppLCB1TG9uZyBzaXplX2NlbnRyYWxkaXIsIFpQT1M2NF9UIGNlbnRyYWxkaXJfcG9zX2luemlwKQotewotICBpbnQgZXJyID0gWklQX09LOwotCi0gIHVMb25nIFppcDY0RGF0YVNpemUgPSA0NDsKLQotICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpWklQNjRFTkRIRUFERVJNQUdJQyw0KTsKLQotICBpZiAoZXJyPT1aSVBfT0spIC8qIHNpemUgb2YgdGhpcyAnemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5JyAqLwotICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLChaUE9TNjRfVClaaXA2NERhdGFTaXplLDgpOyAvLyB3aHkgWlBPUzY0X1Qgb2YgdGhpcyA/Ci0KLSAgaWYgKGVycj09WklQX09LKSAvKiB2ZXJzaW9uIG1hZGUgYnkgKi8KLSAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpNDUsMik7Ci0KLSAgaWYgKGVycj09WklQX09LKSAvKiB2ZXJzaW9uIG5lZWRlZCAqLwotICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZyk0NSwyKTsKLQotICBpZiAoZXJyPT1aSVBfT0spIC8qIG51bWJlciBvZiB0aGlzIGRpc2sgKi8KLSAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMCw0KTsKLQotICBpZiAoZXJyPT1aSVBfT0spIC8qIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KLSAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMCw0KTsKLQotICBpZiAoZXJyPT1aSVBfT0spIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpciBvbiB0aGlzIGRpc2sgKi8KLSAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYywgemktPmZpbGVzdHJlYW0sIHppLT5udW1iZXJfZW50cnksIDgpOwotCi0gIGlmIChlcnI9PVpJUF9PSykgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyICovCi0gICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsIHppLT5maWxlc3RyZWFtLCB6aS0+bnVtYmVyX2VudHJ5LCA4KTsKLQotICBpZiAoZXJyPT1aSVBfT0spIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCi0gICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKFpQT1M2NF9UKXNpemVfY2VudHJhbGRpciw4KTsKLQotICBpZiAoZXJyPT1aSVBfT0spIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gdGhlIHN0YXJ0aW5nIGRpc2sgbnVtYmVyICovCi0gIHsKLSAgICBaUE9TNjRfVCBwb3MgPSBjZW50cmFsZGlyX3Bvc19pbnppcCAtIHppLT5hZGRfcG9zaXRpb25fd2hlbl93cml0dGluZ19vZmZzZXQ7Ci0gICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sIChaUE9TNjRfVClwb3MsOCk7Ci0gIH0KLSAgcmV0dXJuIGVycjsKLX0KLWludCBXcml0ZV9FbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoemlwNjRfaW50ZXJuYWwqIHppLCB1TG9uZyBzaXplX2NlbnRyYWxkaXIsIFpQT1M2NF9UIGNlbnRyYWxkaXJfcG9zX2luemlwKQotewotICBpbnQgZXJyID0gWklQX09LOwotCi0gIC8qc2lnbmF0dXJlKi8KLSAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKUVOREhFQURFUk1BR0lDLDQpOwotCi0gIGlmIChlcnI9PVpJUF9PSykgLyogbnVtYmVyIG9mIHRoaXMgZGlzayAqLwotICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDIpOwotCi0gIGlmIChlcnI9PVpJUF9PSykgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLwotICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDIpOwotCi0gIGlmIChlcnI9PVpJUF9PSykgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyIG9uIHRoaXMgZGlzayAqLwotICB7Ci0gICAgewotICAgICAgaWYoemktPm51bWJlcl9lbnRyeSA+PSAweEZGRkYpCi0gICAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykweGZmZmYsMik7IC8vIHVzZSB2YWx1ZSBpbiBaSVA2NCByZWNvcmQKLSAgICAgIGVsc2UKLSAgICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXppLT5udW1iZXJfZW50cnksMik7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGVycj09WklQX09LKSAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgKi8KLSAgewotICAgIGlmKHppLT5udW1iZXJfZW50cnkgPj0gMHhGRkZGKQotICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTB4ZmZmZiwyKTsgLy8gdXNlIHZhbHVlIGluIFpJUDY0IHJlY29yZAotICAgIGVsc2UKLSAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZyl6aS0+bnVtYmVyX2VudHJ5LDIpOwotICB9Ci0KLSAgaWYgKGVycj09WklQX09LKSAvKiBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLwotICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylzaXplX2NlbnRyYWxkaXIsNCk7Ci0KLSAgaWYgKGVycj09WklQX09LKSAvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHRoZSBzdGFydGluZyBkaXNrIG51bWJlciAqLwotICB7Ci0gICAgWlBPUzY0X1QgcG9zID0gY2VudHJhbGRpcl9wb3NfaW56aXAgLSB6aS0+YWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0OwotICAgIGlmKHBvcyA+PSAweGZmZmZmZmZmKQotICAgIHsKLSAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCAodUxvbmcpMHhmZmZmZmZmZiw0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sICh1TG9uZykoY2VudHJhbGRpcl9wb3NfaW56aXAgLSB6aS0+YWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0KSw0KTsKLSAgfQotCi0gICByZXR1cm4gZXJyOwotfQotCi1pbnQgV3JpdGVfR2xvYmFsQ29tbWVudCh6aXA2NF9pbnRlcm5hbCogemksIGNvbnN0IGNoYXIqIGdsb2JhbF9jb21tZW50KQotewotICBpbnQgZXJyID0gWklQX09LOwotICB1SW50IHNpemVfZ2xvYmFsX2NvbW1lbnQgPSAwOwotCi0gIGlmKGdsb2JhbF9jb21tZW50ICE9IE5VTEwpCi0gICAgc2l6ZV9nbG9iYWxfY29tbWVudCA9ICh1SW50KXN0cmxlbihnbG9iYWxfY29tbWVudCk7Ci0KLSAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXNpemVfZ2xvYmFsX2NvbW1lbnQsMik7Ci0KLSAgaWYgKGVyciA9PSBaSVBfT0sgJiYgc2l6ZV9nbG9iYWxfY29tbWVudCA+IDApCi0gIHsKLSAgICBpZiAoWldSSVRFNjQoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sIGdsb2JhbF9jb21tZW50LCBzaXplX2dsb2JhbF9jb21tZW50KSAhPSBzaXplX2dsb2JhbF9jb21tZW50KQotICAgICAgZXJyID0gWklQX0VSUk5POwotICB9Ci0gIHJldHVybiBlcnI7Ci19Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBDbG9zZSAoemlwRmlsZSBmaWxlLCBjb25zdCBjaGFyKiBnbG9iYWxfY29tbWVudCkKLXsKLSAgICB6aXA2NF9pbnRlcm5hbCogemk7Ci0gICAgaW50IGVyciA9IDA7Ci0gICAgdUxvbmcgc2l6ZV9jZW50cmFsZGlyID0gMDsKLSAgICBaUE9TNjRfVCBjZW50cmFsZGlyX3Bvc19pbnppcDsKLSAgICBaUE9TNjRfVCBwb3M7Ci0KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7Ci0KLSAgICB6aSA9ICh6aXA2NF9pbnRlcm5hbCopZmlsZTsKLQotICAgIGlmICh6aS0+aW5fb3BlbmVkX2ZpbGVfaW56aXAgPT0gMSkKLSAgICB7Ci0gICAgICAgIGVyciA9IHppcENsb3NlRmlsZUluWmlwIChmaWxlKTsKLSAgICB9Ci0KLSNpZm5kZWYgTk9fQURERklMRUlORVhJU1RJTkdaSVAKLSAgICBpZiAoZ2xvYmFsX2NvbW1lbnQ9PU5VTEwpCi0gICAgICAgIGdsb2JhbF9jb21tZW50ID0gemktPmdsb2JhbGNvbW1lbnQ7Ci0jZW5kaWYKLQotICAgIGNlbnRyYWxkaXJfcG9zX2luemlwID0gWlRFTEw2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSk7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgewotICAgICAgICBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCogbGRpID0gemktPmNlbnRyYWxfZGlyLmZpcnN0X2Jsb2NrOwotICAgICAgICB3aGlsZSAobGRpIT1OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGVycj09WklQX09LKSAmJiAobGRpLT5maWxsZWRfaW5fdGhpc19ibG9jaz4wKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoWldSSVRFNjQoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sIGxkaS0+ZGF0YSwgbGRpLT5maWxsZWRfaW5fdGhpc19ibG9jaykgIT0gbGRpLT5maWxsZWRfaW5fdGhpc19ibG9jaykKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzaXplX2NlbnRyYWxkaXIgKz0gbGRpLT5maWxsZWRfaW5fdGhpc19ibG9jazsKLSAgICAgICAgICAgIGxkaSA9IGxkaS0+bmV4dF9kYXRhYmxvY2s7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZnJlZV9saW5rZWRsaXN0KCYoemktPmNlbnRyYWxfZGlyKSk7Ci0KLSAgICBwb3MgPSBjZW50cmFsZGlyX3Bvc19pbnppcCAtIHppLT5hZGRfcG9zaXRpb25fd2hlbl93cml0dGluZ19vZmZzZXQ7Ci0gICAgaWYocG9zID49IDB4ZmZmZmZmZmYgfHwgemktPm51bWJlcl9lbnRyeSA+IDB4RkZGRikKLSAgICB7Ci0gICAgICBaUE9TNjRfVCBaaXA2NEVPQ0Rwb3MgPSBaVEVMTDY0KHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtKTsKLSAgICAgIFdyaXRlX1ppcDY0RW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKHppLCBzaXplX2NlbnRyYWxkaXIsIGNlbnRyYWxkaXJfcG9zX2luemlwKTsKLQotICAgICAgV3JpdGVfWmlwNjRFbmRPZkNlbnRyYWxEaXJlY3RvcnlMb2NhdG9yKHppLCBaaXA2NEVPQ0Rwb3MpOwotICAgIH0KLQotICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICAgIGVyciA9IFdyaXRlX0VuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZCh6aSwgc2l6ZV9jZW50cmFsZGlyLCBjZW50cmFsZGlyX3Bvc19pbnppcCk7Ci0KLSAgICBpZihlcnIgPT0gWklQX09LKQotICAgICAgZXJyID0gV3JpdGVfR2xvYmFsQ29tbWVudCh6aSwgZ2xvYmFsX2NvbW1lbnQpOwotCi0gICAgaWYgKFpDTE9TRTY0KHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtKSAhPSAwKQotICAgICAgICBpZiAoZXJyID09IFpJUF9PSykKLSAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKLQotI2lmbmRlZiBOT19BRERGSUxFSU5FWElTVElOR1pJUAotICAgIFRSWUZSRUUoemktPmdsb2JhbGNvbW1lbnQpOwotI2VuZGlmCi0gICAgVFJZRlJFRSh6aSk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1leHRlcm4gaW50IFpFWFBPUlQgemlwUmVtb3ZlRXh0cmFJbmZvQmxvY2sgKGNoYXIqIHBEYXRhLCBpbnQqIGRhdGFMZW4sIHNob3J0IHNIZWFkZXIpCi17Ci0gIGNoYXIqIHAgPSBwRGF0YTsKLSAgaW50IHNpemUgPSAwOwotICBjaGFyKiBwTmV3SGVhZGVyOwotICBjaGFyKiBwVG1wOwotICBzaG9ydCBoZWFkZXI7Ci0gIHNob3J0IGRhdGFTaXplOwotCi0gIGludCByZXRWYWwgPSBaSVBfT0s7Ci0KLSAgaWYocERhdGEgPT0gTlVMTCB8fCAqZGF0YUxlbiA8IDQpCi0gICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOwotCi0gIHBOZXdIZWFkZXIgPSAoY2hhciopQUxMT0MoKmRhdGFMZW4pOwotICBwVG1wID0gcE5ld0hlYWRlcjsKLQotICB3aGlsZShwIDwgKHBEYXRhICsgKmRhdGFMZW4pKQotICB7Ci0gICAgaGVhZGVyID0gKihzaG9ydCopcDsKLSAgICBkYXRhU2l6ZSA9ICooKChzaG9ydCopcCkrMSk7Ci0KLSAgICBpZiggaGVhZGVyID09IHNIZWFkZXIgKSAvLyBIZWFkZXIgZm91bmQuCi0gICAgewotICAgICAgcCArPSBkYXRhU2l6ZSArIDQ7IC8vIHNraXAgaXQuIGRvIG5vdCBjb3B5IHRvIHRlbXAgYnVmZmVyCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBFeHRyYSBJbmZvIGJsb2NrIHNob3VsZCBub3QgYmUgcmVtb3ZlZCwgU28gY29weSBpdCB0byB0aGUgdGVtcCBidWZmZXIuCi0gICAgICBtZW1jcHkocFRtcCwgcCwgZGF0YVNpemUgKyA0KTsKLSAgICAgIHAgKz0gZGF0YVNpemUgKyA0OwotICAgICAgc2l6ZSArPSBkYXRhU2l6ZSArIDQ7Ci0gICAgfQotCi0gIH0KLQotICBpZihzaXplIDwgKmRhdGFMZW4pCi0gIHsKLSAgICAvLyBjbGVhbiBvbGQgZXh0cmEgaW5mbyBibG9jay4KLSAgICBtZW1zZXQocERhdGEsMCwgKmRhdGFMZW4pOwotCi0gICAgLy8gY29weSB0aGUgbmV3IGV4dHJhIGluZm8gYmxvY2sgb3ZlciB0aGUgb2xkCi0gICAgaWYoc2l6ZSA+IDApCi0gICAgICBtZW1jcHkocERhdGEsIHBOZXdIZWFkZXIsIHNpemUpOwotCi0gICAgLy8gc2V0IHRoZSBuZXcgZXh0cmEgaW5mbyBzaXplCi0gICAgKmRhdGFMZW4gPSBzaXplOwotCi0gICAgcmV0VmFsID0gWklQX09LOwotICB9Ci0gIGVsc2UKLSAgICByZXRWYWwgPSBaSVBfRVJSTk87Ci0KLSAgVFJZRlJFRShwTmV3SGVhZGVyKTsKLQotICByZXR1cm4gcmV0VmFsOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9taW5pemlwL3ppcC5oIGIvc3JjL3psaWIvY29udHJpYi9taW5pemlwL3ppcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWFlYmI2Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvbWluaXppcC96aXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKiB6aXAuaCAtLSBJTyBvbiAuemlwIGZpbGVzIHVzaW5nIHpsaWIKLSAgIFZlcnNpb24gMS4xLCBGZWJydWFyeSAxNGgsIDIwMTAKLSAgIHBhcnQgb2YgdGhlIE1pbmlaaXAgcHJvamVjdCAtICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQotCi0gICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxMCBHaWxsZXMgVm9sbGFudCAobWluaXppcCkgKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCi0KLSAgICAgICAgIE1vZGlmaWNhdGlvbnMgZm9yIFppcDY0IHN1cHBvcnQKLSAgICAgICAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1hdGhpYXMgU3ZlbnNzb24gKCBodHRwOi8vcmVzdWx0NDIuY29tICkKLQotICAgICAgICAgRm9yIG1vcmUgaW5mbyByZWFkIE1pbmlaaXBfaW5mby50eHQKLQotICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIENvbmRpdGlvbiBvZiB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBhcmUgdGhlIHNhbWUgdGhhbiB6bGliIDoKLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgQ2hhbmdlcwotCi0gICAgICAgIFNlZSBoZWFkZXIgb2YgemlwLmgKLQotKi8KLQotI2lmbmRlZiBfemlwMTJfSAotI2RlZmluZSBfemlwMTJfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vI2RlZmluZSBIQVZFX0JaSVAyCi0KLSNpZm5kZWYgX1pMSUJfSAotI2luY2x1ZGUgInpsaWIuaCIKLSNlbmRpZgotCi0jaWZuZGVmIF9aTElCSU9BUElfSAotI2luY2x1ZGUgImlvYXBpLmgiCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQlpJUDIKLSNpbmNsdWRlICJiemxpYi5oIgotI2VuZGlmCi0KLSNkZWZpbmUgWl9CWklQMkVEIDEyCi0KLSNpZiBkZWZpbmVkKFNUUklDVFpJUCkgfHwgZGVmaW5lZChTVFJJQ1RaSVBVTlpJUCkKLS8qIGxpa2UgdGhlIFNUUklDVCBvZiBXSU4zMiwgd2UgZGVmaW5lIGEgcG9pbnRlciB0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWQKLSAgICBmcm9tICh2b2lkKikgd2l0aG91dCBjYXN0ICovCi10eXBlZGVmIHN0cnVjdCBUYWd6aXBGaWxlX18geyBpbnQgdW51c2VkOyB9IHppcEZpbGVfXzsKLXR5cGVkZWYgemlwRmlsZV9fICp6aXBGaWxlOwotI2Vsc2UKLXR5cGVkZWYgdm9pZHAgemlwRmlsZTsKLSNlbmRpZgotCi0jZGVmaW5lIFpJUF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCi0jZGVmaW5lIFpJUF9FT0YgICAgICAgICAgICAgICAgICAgICAgICAgKDApCi0jZGVmaW5lIFpJUF9FUlJOTyAgICAgICAgICAgICAgICAgICAgICAgKFpfRVJSTk8pCi0jZGVmaW5lIFpJUF9QQVJBTUVSUk9SICAgICAgICAgICAgICAgICAgKC0xMDIpCi0jZGVmaW5lIFpJUF9CQURaSVBGSUxFICAgICAgICAgICAgICAgICAgKC0xMDMpCi0jZGVmaW5lIFpJUF9JTlRFUk5BTEVSUk9SICAgICAgICAgICAgICAgKC0xMDQpCi0KLSNpZm5kZWYgREVGX01FTV9MRVZFTAotIyAgaWYgTUFYX01FTV9MRVZFTCA+PSA4Ci0jICAgIGRlZmluZSBERUZfTUVNX0xFVkVMIDgKLSMgIGVsc2UKLSMgICAgZGVmaW5lIERFRl9NRU1fTEVWRUwgIE1BWF9NRU1fTEVWRUwKLSMgIGVuZGlmCi0jZW5kaWYKLS8qIGRlZmF1bHQgbWVtTGV2ZWwgKi8KLQotLyogdG1femlwIGNvbnRhaW4gZGF0ZS90aW1lIGluZm8gKi8KLXR5cGVkZWYgc3RydWN0IHRtX3ppcF9zCi17Ci0gICAgdUludCB0bV9zZWM7ICAgICAgICAgICAgLyogc2Vjb25kcyBhZnRlciB0aGUgbWludXRlIC0gWzAsNTldICovCi0gICAgdUludCB0bV9taW47ICAgICAgICAgICAgLyogbWludXRlcyBhZnRlciB0aGUgaG91ciAtIFswLDU5XSAqLwotICAgIHVJbnQgdG1faG91cjsgICAgICAgICAgIC8qIGhvdXJzIHNpbmNlIG1pZG5pZ2h0IC0gWzAsMjNdICovCi0gICAgdUludCB0bV9tZGF5OyAgICAgICAgICAgLyogZGF5IG9mIHRoZSBtb250aCAtIFsxLDMxXSAqLwotICAgIHVJbnQgdG1fbW9uOyAgICAgICAgICAgIC8qIG1vbnRocyBzaW5jZSBKYW51YXJ5IC0gWzAsMTFdICovCi0gICAgdUludCB0bV95ZWFyOyAgICAgICAgICAgLyogeWVhcnMgLSBbMTk4MC4uMjA0NF0gKi8KLX0gdG1femlwOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHRtX3ppcCAgICAgIHRtel9kYXRlOyAgICAgICAvKiBkYXRlIGluIHVuZGVyc3RhbmRhYmxlIGZvcm1hdCAgICAgICAgICAgKi8KLSAgICB1TG9uZyAgICAgICBkb3NEYXRlOyAgICAgICAvKiBpZiBkb3NfZGF0ZSA9PSAwLCB0bXVfZGF0ZSBpcyB1c2VkICAgICAgKi8KLS8qICAgIHVMb25nICAgICAgIGZsYWc7ICAgICAgICAqLyAgIC8qIGdlbmVyYWwgcHVycG9zZSBiaXQgZmxhZyAgICAgICAgMiBieXRlcyAqLwotCi0gICAgdUxvbmcgICAgICAgaW50ZXJuYWxfZmE7ICAgIC8qIGludGVybmFsIGZpbGUgYXR0cmlidXRlcyAgICAgICAgMiBieXRlcyAqLwotICAgIHVMb25nICAgICAgIGV4dGVybmFsX2ZhOyAgICAvKiBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgICAgICAgIDQgYnl0ZXMgKi8KLX0gemlwX2ZpbGVpbmZvOwotCi10eXBlZGVmIGNvbnN0IGNoYXIqIHppcGNoYXJwYzsKLQotCi0jZGVmaW5lIEFQUEVORF9TVEFUVVNfQ1JFQVRFICAgICAgICAoMCkKLSNkZWZpbmUgQVBQRU5EX1NUQVRVU19DUkVBVEVBRlRFUiAgICgxKQotI2RlZmluZSBBUFBFTkRfU1RBVFVTX0FERElOWklQICAgICAgKDIpCi0KLWV4dGVybiB6aXBGaWxlIFpFWFBPUlQgemlwT3BlbiBPRigoY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBhcHBlbmQpKTsKLWV4dGVybiB6aXBGaWxlIFpFWFBPUlQgemlwT3BlbjY0IE9GKChjb25zdCB2b2lkICpwYXRobmFtZSwgaW50IGFwcGVuZCkpOwotLyoKLSAgQ3JlYXRlIGEgemlwZmlsZS4KLSAgICAgcGF0aG5hbWUgY29udGFpbiBvbiBXaW5kb3dzIFhQIGEgZmlsZW5hbWUgbGlrZSAiYzpcXHpsaWJcXHpsaWIxMTMuemlwIiBvciBvbgotICAgICAgIGFuIFVuaXggY29tcHV0ZXIgInpsaWIvemxpYjExMy56aXAiLgotICAgICBpZiB0aGUgZmlsZSBwYXRobmFtZSBleGlzdCBhbmQgYXBwZW5kPT1BUFBFTkRfU1RBVFVTX0NSRUFURUFGVEVSLCB0aGUgemlwCi0gICAgICAgd2lsbCBiZSBjcmVhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0gICAgICAgICAodXNlZnVsIGlmIHRoZSBmaWxlIGNvbnRhaW4gYSBzZWxmIGV4dHJhY3RvciBjb2RlKQotICAgICBpZiB0aGUgZmlsZSBwYXRobmFtZSBleGlzdCBhbmQgYXBwZW5kPT1BUFBFTkRfU1RBVFVTX0FERElOWklQLCB3ZSB3aWxsCi0gICAgICAgYWRkIGZpbGVzIGluIGV4aXN0aW5nIHppcCAoYmUgc3VyZSB5b3UgZG9uJ3QgYWRkIGZpbGUgdGhhdCBkb2Vzbid0IGV4aXN0KQotICAgICBJZiB0aGUgemlwZmlsZSBjYW5ub3QgYmUgb3BlbmVkLCB0aGUgcmV0dXJuIHZhbHVlIGlzIE5VTEwuCi0gICAgIEVsc2UsIHRoZSByZXR1cm4gdmFsdWUgaXMgYSB6aXBGaWxlIEhhbmRsZSwgdXNhYmxlIHdpdGggb3RoZXIgZnVuY3Rpb24KLSAgICAgICBvZiB0aGlzIHppcCBwYWNrYWdlLgotKi8KLQotLyogTm90ZSA6IHRoZXJlIGlzIG5vIGRlbGV0ZSBmdW5jdGlvbiBpbnRvIGEgemlwZmlsZS4KLSAgIElmIHlvdSB3YW50IGRlbGV0ZSBmaWxlIGludG8gYSB6aXBmaWxlLCB5b3UgbXVzdCBvcGVuIGEgemlwZmlsZSwgYW5kIGNyZWF0ZSBhbm90aGVyCi0gICBPZiBjb3VzZSwgeW91IGNhbiB1c2UgUkFXIHJlYWRpbmcgYW5kIHdyaXRpbmcgdG8gY29weSB0aGUgZmlsZSB5b3UgZGlkIG5vdCB3YW50IGRlbHRlCi0qLwotCi1leHRlcm4gemlwRmlsZSBaRVhQT1JUIHppcE9wZW4yIE9GKChjb25zdCBjaGFyICpwYXRobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwcGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwY2hhcnBjKiBnbG9iYWxjb21tZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKSk7Ci0KLWV4dGVybiB6aXBGaWxlIFpFWFBPUlQgemlwT3BlbjJfNjQgT0YoKGNvbnN0IHZvaWQgKnBhdGhuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXBwZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBjaGFycGMqIGdsb2JhbGNvbW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpsaWJfZmlsZWZ1bmM2NF9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikpOwotCi1leHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcCBPRigoemlwRmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCkpOwotCi1leHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcDY0IE9GKCh6aXBGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgemlwNjQpKTsKLQotLyoKLSAgT3BlbiBhIGZpbGUgaW4gdGhlIFpJUCBmb3Igd3JpdGluZy4KLSAgZmlsZW5hbWUgOiB0aGUgZmlsZW5hbWUgaW4gemlwIChpZiBOVUxMLCAnLScgd2l0aG91dCBxdW90ZSB3aWxsIGJlIHVzZWQKLSAgKnppcGZpIGNvbnRhaW4gc3VwcGxlbWVudGFsIGluZm9ybWF0aW9uCi0gIGlmIGV4dHJhZmllbGRfbG9jYWwhPU5VTEwgYW5kIHNpemVfZXh0cmFmaWVsZF9sb2NhbD4wLCBleHRyYWZpZWxkX2xvY2FsCi0gICAgY29udGFpbnMgdGhlIGV4dHJhZmllbGQgZGF0YSB0aGUgdGhlIGxvY2FsIGhlYWRlcgotICBpZiBleHRyYWZpZWxkX2dsb2JhbCE9TlVMTCBhbmQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbD4wLCBleHRyYWZpZWxkX2dsb2JhbAotICAgIGNvbnRhaW5zIHRoZSBleHRyYWZpZWxkIGRhdGEgdGhlIHRoZSBsb2NhbCBoZWFkZXIKLSAgaWYgY29tbWVudCAhPSBOVUxMLCBjb21tZW50IGNvbnRhaW4gdGhlIGNvbW1lbnQgc3RyaW5nCi0gIG1ldGhvZCBjb250YWluIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgKDAgZm9yIHN0b3JlLCBaX0RFRkxBVEVEIGZvciBkZWZsYXRlKQotICBsZXZlbCBjb250YWluIHRoZSBsZXZlbCBvZiBjb21wcmVzc2lvbiAoY2FuIGJlIFpfREVGQVVMVF9DT01QUkVTU0lPTikKLSAgemlwNjQgaXMgc2V0IHRvIDEgaWYgYSB6aXA2NCBleHRlbmRlZCBpbmZvcm1hdGlvbiBibG9jayBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGxvY2FsIGZpbGUgaGVhZGVyLgotICAgICAgICAgICAgICAgICAgICB0aGlzIE1VU1QgYmUgJzEnIGlmIHRoZSB1bmNvbXByZXNzZWQgc2l6ZSBpcyA+PSAweGZmZmZmZmZmLgotCi0qLwotCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwMiBPRigoemlwRmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdykpOwotCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwMl82NCBPRigoemlwRmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHppcDY0KSk7Ci0vKgotICBTYW1lIHRoYW4gemlwT3Blbk5ld0ZpbGVJblppcCwgZXhjZXB0IGlmIHJhdz0xLCB3ZSB3cml0ZSByYXcgZmlsZQotICovCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwMyBPRigoemlwRmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZW1MZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY3JjRm9yQ3J5cHRpbmcpKTsKLQotZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAzXzY0IE9GKCh6aXBGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lbUxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjcmNGb3JDcnlwdGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHppcDY0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpOwotCi0vKgotICBTYW1lIHRoYW4gemlwT3Blbk5ld0ZpbGVJblppcDIsIGV4Y2VwdAotICAgIHdpbmRvd0JpdHMsbWVtTGV2ZWwsLHN0cmF0ZWd5IDogc2VlIHBhcmFtZXRlciBzdHJhdGVneSBpbiBkZWZsYXRlSW5pdDIKLSAgICBwYXNzd29yZCA6IGNyeXB0aW5nIHBhc3N3b3JkIChOVUxMIGZvciBubyBjcnlwdGluZykKLSAgICBjcmNGb3JDcnlwdGluZyA6IGNyYyBvZiBmaWxlIHRvIGNvbXByZXNzIChuZWVkZWQgZm9yIGNyeXB0aW5nKQotICovCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwNCBPRigoemlwRmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZW1MZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY3JjRm9yQ3J5cHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHZlcnNpb25NYWRlQnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGZsYWdCYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpOwotCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCBPRigoemlwRmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZW1MZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY3JjRm9yQ3J5cHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHZlcnNpb25NYWRlQnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGZsYWdCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgemlwNjQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7Ci0vKgotICBTYW1lIHRoYW4gemlwT3Blbk5ld0ZpbGVJblppcDQsIGV4Y2VwdAotICAgIHZlcnNpb25NYWRlQnkgOiB2YWx1ZSBmb3IgVmVyc2lvbiBtYWRlIGJ5IGZpZWxkCi0gICAgZmxhZyA6IHZhbHVlIGZvciBmbGFnIGZpZWxkIChjb21wcmVzc2lvbiBsZXZlbCBpbmZvIHdpbGwgYmUgYWRkZWQpCi0gKi8KLQotCi1leHRlcm4gaW50IFpFWFBPUlQgemlwV3JpdGVJbkZpbGVJblppcCBPRigoemlwRmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbikpOwotLyoKLSAgV3JpdGUgZGF0YSBpbiB0aGUgemlwZmlsZQotKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlRmlsZUluWmlwIE9GKCh6aXBGaWxlIGZpbGUpKTsKLS8qCi0gIENsb3NlIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUKLSovCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBDbG9zZUZpbGVJblppcFJhdyBPRigoemlwRmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyB1bmNvbXByZXNzZWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY3JjMzIpKTsKLQotZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlRmlsZUluWmlwUmF3NjQgT0YoKHppcEZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlBPUzY0X1QgdW5jb21wcmVzc2VkX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGNyYzMyKSk7Ci0KLS8qCi0gIENsb3NlIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUsIGZvciBmaWxlIG9wZW5lZCB3aXRoCi0gICAgcGFyYW1ldGVyIHJhdz0xIGluIHppcE9wZW5OZXdGaWxlSW5aaXAyCi0gIHVuY29tcHJlc3NlZF9zaXplIGFuZCBjcmMzMiBhcmUgdmFsdWUgZm9yIHRoZSB1bmNvbXByZXNzZWQgc2l6ZQotKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlIE9GKCh6aXBGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciogZ2xvYmFsX2NvbW1lbnQpKTsKLS8qCi0gIENsb3NlIHRoZSB6aXBmaWxlCi0qLwotCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBSZW1vdmVFeHRyYUluZm9CbG9jayBPRigoY2hhciogcERhdGEsIGludCogZGF0YUxlbiwgc2hvcnQgc0hlYWRlcikpOwotLyoKLSAgemlwUmVtb3ZlRXh0cmFJbmZvQmxvY2sgLSAgQWRkZWQgYnkgTWF0aGlhcyBTdmVuc3NvbgotCi0gIFJlbW92ZSBleHRyYSBpbmZvcm1hdGlvbiBibG9jayBmcm9tIGEgZXh0cmEgaW5mb3JtYXRpb24gZGF0YSBmb3IgdGhlIGxvY2FsIGZpbGUgaGVhZGVyIG9yIGNlbnRyYWwgZGlyZWN0b3J5IGhlYWRlcgotCi0gIEl0IGlzIG5lZWRlZCB0byByZW1vdmUgWklQNjQgZXh0cmEgaW5mb3JtYXRpb24gYmxvY2tzIHdoZW4gYmVmb3JlIGRhdGEgaXMgd3JpdHRlbiBpZiB1c2luZyBSQVcgbW9kZS4KLQotICAweDAwMDEgaXMgdGhlIHNpZ25hdHVyZSBoZWFkZXIgZm9yIHRoZSBaSVA2NCBleHRyYSBpbmZvcm1hdGlvbiBibG9ja3MKLQotICB1c2FnZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZSBaSVA2NCBFeHRyYSBpbmZvcm1hdGlvbiBmcm9tIGEgY2VudHJhbCBkaXJlY3RvciBleHRyYSBmaWVsZCBkYXRhCi0gICAgICAgICAgICAgIHppcFJlbW92ZUV4dHJhSW5mb0Jsb2NrKHBDZW5EaXJFeHRyYUZpZWxkRGF0YSwgJm5DZW5EaXJFeHRyYUZpZWxkRGF0YUxlbiwgMHgwMDAxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIFpJUDY0IEV4dHJhIGluZm9ybWF0aW9uIGZyb20gYSBMb2NhbCBGaWxlIEhlYWRlciBleHRyYSBmaWVsZCBkYXRhCi0gICAgICAgIHppcFJlbW92ZUV4dHJhSW5mb0Jsb2NrKHBMb2NhbEhlYWRlckV4dHJhRmllbGREYXRhLCAmbkxvY2FsSGVhZGVyRXh0cmFGaWVsZERhdGFMZW4sIDB4MDAwMSk7Ci0qLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX3ppcDY0X0ggKi8KZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvcGFzY2FsL2V4YW1wbGUucGFzIGIvc3JjL3psaWIvY29udHJpYi9wYXNjYWwvZXhhbXBsZS5wYXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MThiMzYuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9wYXNjYWwvZXhhbXBsZS5wYXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTkgKzAsMCBAQAotKCogZXhhbXBsZS5jIC0tIHVzYWdlIGV4YW1wbGUgb2YgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqCi0gKiBQYXNjYWwgdHJhbnNsYXRpb24KLSAqIENvcHlyaWdodCAoQykgMTk5OCBieSBKYWNxdWVzIE5vbXNzaSBOemFsaS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiByZWFkbWUudHh0Ci0gKgotICogQWRhcHRhdGlvbiB0byB0aGUgemxpYnBhcyBpbnRlcmZhY2UKLSAqIENvcHlyaWdodCAoQykgMjAwMyBieSBDb3NtaW4gVHJ1dGEuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcmVhZG1lLnR4dAotICopCi0KLXByb2dyYW0gZXhhbXBsZTsKLQoteyRERUZJTkUgVEVTVF9DT01QUkVTU30KLXtETyBOT1QgJERFRklORSBURVNUX0daSU99Ci17JERFRklORSBURVNUX0RFRkxBVEV9Ci17JERFRklORSBURVNUX0lORkxBVEV9Ci17JERFRklORSBURVNUX0ZMVVNIfQoteyRERUZJTkUgVEVTVF9TWU5DfQoteyRERUZJTkUgVEVTVF9ESUNUfQotCi11c2VzIFN5c1V0aWxzLCB6bGlicGFzOwotCi1jb25zdCBURVNURklMRSA9ICdmb28uZ3onOwotCi0oKiAiaGVsbG8gd29ybGQiIHdvdWxkIGJlIG1vcmUgc3RhbmRhcmQsIGJ1dCB0aGUgcmVwZWF0ZWQgImhlbGxvIgotICogc3RyZXNzZXMgdGhlIGNvbXByZXNzaW9uIGNvZGUgYmV0dGVyLCBzb3JyeS4uLgotICopCi1jb25zdCBoZWxsbzogUENoYXIgPSAnaGVsbG8sIGhlbGxvISc7Ci0KLWNvbnN0IGRpY3Rpb25hcnk6IFBDaGFyID0gJ2hlbGxvJzsKLQotdmFyIGRpY3RJZDogTG9uZ0ludDsgKCogQWRsZXIzMiB2YWx1ZSBvZiB0aGUgZGljdGlvbmFyeSAqKQotCi1wcm9jZWR1cmUgQ0hFQ0tfRVJSKGVycjogSW50ZWdlcjsgbXNnOiBTdHJpbmcpOwotYmVnaW4KLSAgaWYgZXJyIDw+IFpfT0sgdGhlbgotICBiZWdpbgotICAgIFdyaXRlTG4obXNnLCAnIGVycm9yOiAnLCBlcnIpOwotICAgIEhhbHQoMSk7Ci0gIGVuZDsKLWVuZDsKLQotcHJvY2VkdXJlIEVYSVRfRVJSKGNvbnN0IG1zZzogU3RyaW5nKTsKLWJlZ2luCi0gIFdyaXRlTG4oJ0Vycm9yOiAnLCBtc2cpOwotICBIYWx0KDEpOwotZW5kOwotCi0oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRlc3QgY29tcHJlc3MgYW5kIHVuY29tcHJlc3MKLSAqKQoteyRJRkRFRiBURVNUX0NPTVBSRVNTfQotcHJvY2VkdXJlIHRlc3RfY29tcHJlc3MoY29tcHI6IFBvaW50ZXI7IGNvbXByTGVuOiBMb25nSW50OwotICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcjogUG9pbnRlcjsgdW5jb21wckxlbjogTG9uZ0ludCk7Ci12YXIgZXJyOiBJbnRlZ2VyOwotICAgIGxlbjogTG9uZ0ludDsKLWJlZ2luCi0gIGxlbiA6PSBTdHJMZW4oaGVsbG8pKzE7Ci0KLSAgZXJyIDo9IGNvbXByZXNzKGNvbXByLCBjb21wckxlbiwgaGVsbG8sIGxlbik7Ci0gIENIRUNLX0VSUihlcnIsICdjb21wcmVzcycpOwotCi0gIFN0ckNvcHkoUENoYXIodW5jb21wciksICdnYXJiYWdlJyk7Ci0KLSAgZXJyIDo9IHVuY29tcHJlc3ModW5jb21wciwgdW5jb21wckxlbiwgY29tcHIsIGNvbXByTGVuKTsKLSAgQ0hFQ0tfRVJSKGVyciwgJ3VuY29tcHJlc3MnKTsKLQotICBpZiBTdHJDb21wKFBDaGFyKHVuY29tcHIpLCBoZWxsbykgPD4gMCB0aGVuCi0gICAgRVhJVF9FUlIoJ2JhZCB1bmNvbXByZXNzJykKLSAgZWxzZQotICAgIFdyaXRlTG4oJ3VuY29tcHJlc3MoKTogJywgUENoYXIodW5jb21wcikpOwotZW5kOwoteyRFTkRJRn0KLQotKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IHJlYWQvd3JpdGUgb2YgLmd6IGZpbGVzCi0gKikKLXskSUZERUYgVEVTVF9HWklPfQotcHJvY2VkdXJlIHRlc3RfZ3ppbyhjb25zdCBmbmFtZTogUENoYXI7ICgqIGNvbXByZXNzZWQgZmlsZSBuYW1lICopCi0gICAgICAgICAgICAgICAgICAgIHVuY29tcHI6IFBvaW50ZXI7Ci0gICAgICAgICAgICAgICAgICAgIHVuY29tcHJMZW46IExvbmdJbnQpOwotdmFyIGVycjogSW50ZWdlcjsKLSAgICBsZW46IEludGVnZXI7Ci0gICAgemZpbGU6IGd6RmlsZTsKLSAgICBwb3M6IExvbmdJbnQ7Ci1iZWdpbgotICBsZW4gOj0gU3RyTGVuKGhlbGxvKSsxOwotCi0gIHpmaWxlIDo9IGd6b3BlbihmbmFtZSwgJ3diJyk7Ci0gIGlmIHpmaWxlID0gTklMIHRoZW4KLSAgYmVnaW4KLSAgICBXcml0ZUxuKCdnem9wZW4gZXJyb3InKTsKLSAgICBIYWx0KDEpOwotICBlbmQ7Ci0gIGd6cHV0Yyh6ZmlsZSwgJ2gnKTsKLSAgaWYgZ3pwdXRzKHpmaWxlLCAnZWxsbycpIDw+IDQgdGhlbgotICBiZWdpbgotICAgIFdyaXRlTG4oJ2d6cHV0cyBlcnI6ICcsIGd6ZXJyb3IoemZpbGUsIGVycikpOwotICAgIEhhbHQoMSk7Ci0gIGVuZDsKLSAgeyRJRkRFRiBHWl9GT1JNQVRfU1RSSU5HfQotICBpZiBnenByaW50Zih6ZmlsZSwgJywgJXMhJywgJ2hlbGxvJykgPD4gOCB0aGVuCi0gIGJlZ2luCi0gICAgV3JpdGVMbignZ3pwcmludGYgZXJyOiAnLCBnemVycm9yKHpmaWxlLCBlcnIpKTsKLSAgICBIYWx0KDEpOwotICBlbmQ7Ci0gIHskRUxTRX0KLSAgaWYgZ3pwdXRzKHpmaWxlLCAnLCBoZWxsbyEnKSA8PiA4IHRoZW4KLSAgYmVnaW4KLSAgICBXcml0ZUxuKCdnenB1dHMgZXJyOiAnLCBnemVycm9yKHpmaWxlLCBlcnIpKTsKLSAgICBIYWx0KDEpOwotICBlbmQ7Ci0gIHskRU5ESUZ9Ci0gIGd6c2Vlayh6ZmlsZSwgMSwgU0VFS19DVVIpOyAoKiBhZGQgb25lIHplcm8gYnl0ZSAqKQotICBnemNsb3NlKHpmaWxlKTsKLQotICB6ZmlsZSA6PSBnem9wZW4oZm5hbWUsICdyYicpOwotICBpZiB6ZmlsZSA9IE5JTCB0aGVuCi0gIGJlZ2luCi0gICAgV3JpdGVMbignZ3pvcGVuIGVycm9yJyk7Ci0gICAgSGFsdCgxKTsKLSAgZW5kOwotCi0gIFN0ckNvcHkoUENoYXIodW5jb21wciksICdnYXJiYWdlJyk7Ci0KLSAgaWYgZ3pyZWFkKHpmaWxlLCB1bmNvbXByLCB1bmNvbXByTGVuKSA8PiBsZW4gdGhlbgotICBiZWdpbgotICAgIFdyaXRlTG4oJ2d6cmVhZCBlcnI6ICcsIGd6ZXJyb3IoemZpbGUsIGVycikpOwotICAgIEhhbHQoMSk7Ci0gIGVuZDsKLSAgaWYgU3RyQ29tcChQQ2hhcih1bmNvbXByKSwgaGVsbG8pIDw+IDAgdGhlbgotICBiZWdpbgotICAgIFdyaXRlTG4oJ2JhZCBnenJlYWQ6ICcsIFBDaGFyKHVuY29tcHIpKTsKLSAgICBIYWx0KDEpOwotICBlbmQKLSAgZWxzZQotICAgIFdyaXRlTG4oJ2d6cmVhZCgpOiAnLCBQQ2hhcih1bmNvbXByKSk7Ci0KLSAgcG9zIDo9IGd6c2Vlayh6ZmlsZSwgLTgsIFNFRUtfQ1VSKTsKLSAgaWYgKHBvcyA8PiA2KSBvciAoZ3p0ZWxsKHpmaWxlKSA8PiBwb3MpIHRoZW4KLSAgYmVnaW4KLSAgICBXcml0ZUxuKCdnenNlZWsgZXJyb3IsIHBvcz0nLCBwb3MsICcsIGd6dGVsbD0nLCBnenRlbGwoemZpbGUpKTsKLSAgICBIYWx0KDEpOwotICBlbmQ7Ci0KLSAgaWYgZ3pnZXRjKHpmaWxlKSA8PiAnICcgdGhlbgotICBiZWdpbgotICAgIFdyaXRlTG4oJ2d6Z2V0YyBlcnJvcicpOwotICAgIEhhbHQoMSk7Ci0gIGVuZDsKLQotICBpZiBnenVuZ2V0YygnICcsIHpmaWxlKSA8PiAnICcgdGhlbgotICBiZWdpbgotICAgIFdyaXRlTG4oJ2d6dW5nZXRjIGVycm9yJyk7Ci0gICAgSGFsdCgxKTsKLSAgZW5kOwotCi0gIGd6Z2V0cyh6ZmlsZSwgUENoYXIodW5jb21wciksIHVuY29tcHJMZW4pOwotICB1bmNvbXByTGVuIDo9IFN0ckxlbihQQ2hhcih1bmNvbXByKSk7Ci0gIGlmIHVuY29tcHJMZW4gPD4gNyB0aGVuICgqICIgaGVsbG8hIiAqKQotICBiZWdpbgotICAgIFdyaXRlTG4oJ2d6Z2V0cyBlcnIgYWZ0ZXIgZ3pzZWVrOiAnLCBnemVycm9yKHpmaWxlLCBlcnIpKTsKLSAgICBIYWx0KDEpOwotICBlbmQ7Ci0gIGlmIFN0ckNvbXAoUENoYXIodW5jb21wciksIGhlbGxvICsgNikgPD4gMCB0aGVuCi0gIGJlZ2luCi0gICAgV3JpdGVMbignYmFkIGd6Z2V0cyBhZnRlciBnenNlZWsnKTsKLSAgICBIYWx0KDEpOwotICBlbmQKLSAgZWxzZQotICAgIFdyaXRlTG4oJ2d6Z2V0cygpIGFmdGVyIGd6c2VlazogJywgUENoYXIodW5jb21wcikpOwotCi0gIGd6Y2xvc2UoemZpbGUpOwotZW5kOwoteyRFTkRJRn0KLQotKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGRlZmxhdGUgd2l0aCBzbWFsbCBidWZmZXJzCi0gKikKLXskSUZERUYgVEVTVF9ERUZMQVRFfQotcHJvY2VkdXJlIHRlc3RfZGVmbGF0ZShjb21wcjogUG9pbnRlcjsgY29tcHJMZW46IExvbmdJbnQpOwotdmFyIGNfc3RyZWFtOiB6X3N0cmVhbTsgKCogY29tcHJlc3Npb24gc3RyZWFtICopCi0gICAgZXJyOiBJbnRlZ2VyOwotICAgIGxlbjogTG9uZ0ludDsKLWJlZ2luCi0gIGxlbiA6PSBTdHJMZW4oaGVsbG8pKzE7Ci0KLSAgY19zdHJlYW0uemFsbG9jIDo9IE5JTDsKLSAgY19zdHJlYW0uemZyZWUgOj0gTklMOwotICBjX3N0cmVhbS5vcGFxdWUgOj0gTklMOwotCi0gIGVyciA6PSBkZWZsYXRlSW5pdChjX3N0cmVhbSwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKLSAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGVJbml0Jyk7Ci0KLSAgY19zdHJlYW0ubmV4dF9pbiA6PSBoZWxsbzsKLSAgY19zdHJlYW0ubmV4dF9vdXQgOj0gY29tcHI7Ci0KLSAgd2hpbGUgKGNfc3RyZWFtLnRvdGFsX2luIDw+IGxlbikgYW5kCi0gICAgICAgIChjX3N0cmVhbS50b3RhbF9vdXQgPCBjb21wckxlbikgZG8KLSAgYmVnaW4KLSAgICBjX3N0cmVhbS5hdmFpbF9vdXQgOj0gMTsgeyBmb3JjZSBzbWFsbCBidWZmZXJzIH0KLSAgICBjX3N0cmVhbS5hdmFpbF9pbiA6PSAxOwotICAgIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKLSAgICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZScpOwotICBlbmQ7Ci0KLSAgKCogRmluaXNoIHRoZSBzdHJlYW0sIHN0aWxsIGZvcmNpbmcgc21hbGwgYnVmZmVyczogKikKLSAgd2hpbGUgVFJVRSBkbwotICBiZWdpbgotICAgIGNfc3RyZWFtLmF2YWlsX291dCA6PSAxOwotICAgIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX0ZJTklTSCk7Ci0gICAgaWYgZXJyID0gWl9TVFJFQU1fRU5EIHRoZW4KLSAgICAgIGJyZWFrOwotICAgIENIRUNLX0VSUihlcnIsICdkZWZsYXRlJyk7Ci0gIGVuZDsKLQotICBlcnIgOj0gZGVmbGF0ZUVuZChjX3N0cmVhbSk7Ci0gIENIRUNLX0VSUihlcnIsICdkZWZsYXRlRW5kJyk7Ci1lbmQ7Ci17JEVORElGfQotCi0oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRlc3QgaW5mbGF0ZSB3aXRoIHNtYWxsIGJ1ZmZlcnMKLSAqKQoteyRJRkRFRiBURVNUX0lORkxBVEV9Ci1wcm9jZWR1cmUgdGVzdF9pbmZsYXRlKGNvbXByOiBQb2ludGVyOyBjb21wckxlbiA6IExvbmdJbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHI6IFBvaW50ZXI7IHVuY29tcHJMZW4gOiBMb25nSW50KTsKLXZhciBlcnI6IEludGVnZXI7Ci0gICAgZF9zdHJlYW06IHpfc3RyZWFtOyAoKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqKQotYmVnaW4KLSAgU3RyQ29weShQQ2hhcih1bmNvbXByKSwgJ2dhcmJhZ2UnKTsKLQotICBkX3N0cmVhbS56YWxsb2MgOj0gTklMOwotICBkX3N0cmVhbS56ZnJlZSA6PSBOSUw7Ci0gIGRfc3RyZWFtLm9wYXF1ZSA6PSBOSUw7Ci0KLSAgZF9zdHJlYW0ubmV4dF9pbiA6PSBjb21wcjsKLSAgZF9zdHJlYW0uYXZhaWxfaW4gOj0gMDsKLSAgZF9zdHJlYW0ubmV4dF9vdXQgOj0gdW5jb21wcjsKLQotICBlcnIgOj0gaW5mbGF0ZUluaXQoZF9zdHJlYW0pOwotICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZUluaXQnKTsKLQotICB3aGlsZSAoZF9zdHJlYW0udG90YWxfb3V0IDwgdW5jb21wckxlbikgYW5kCi0gICAgICAgIChkX3N0cmVhbS50b3RhbF9pbiA8IGNvbXByTGVuKSBkbwotICBiZWdpbgotICAgIGRfc3RyZWFtLmF2YWlsX291dCA6PSAxOyAoKiBmb3JjZSBzbWFsbCBidWZmZXJzICopCi0gICAgZF9zdHJlYW0uYXZhaWxfaW4gOj0gMTsKLSAgICBlcnIgOj0gaW5mbGF0ZShkX3N0cmVhbSwgWl9OT19GTFVTSCk7Ci0gICAgaWYgZXJyID0gWl9TVFJFQU1fRU5EIHRoZW4KLSAgICAgIGJyZWFrOwotICAgIENIRUNLX0VSUihlcnIsICdpbmZsYXRlJyk7Ci0gIGVuZDsKLQotICBlcnIgOj0gaW5mbGF0ZUVuZChkX3N0cmVhbSk7Ci0gIENIRUNLX0VSUihlcnIsICdpbmZsYXRlRW5kJyk7Ci0KLSAgaWYgU3RyQ29tcChQQ2hhcih1bmNvbXByKSwgaGVsbG8pIDw+IDAgdGhlbgotICAgIEVYSVRfRVJSKCdiYWQgaW5mbGF0ZScpCi0gIGVsc2UKLSAgICBXcml0ZUxuKCdpbmZsYXRlKCk6ICcsIFBDaGFyKHVuY29tcHIpKTsKLWVuZDsKLXskRU5ESUZ9Ci0KLSgqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGVzdCBkZWZsYXRlIHdpdGggbGFyZ2UgYnVmZmVycyBhbmQgZHluYW1pYyBjaGFuZ2Ugb2YgY29tcHJlc3Npb24gbGV2ZWwKLSAqKQoteyRJRkRFRiBURVNUX0RFRkxBVEV9Ci1wcm9jZWR1cmUgdGVzdF9sYXJnZV9kZWZsYXRlKGNvbXByOiBQb2ludGVyOyBjb21wckxlbjogTG9uZ0ludDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcjogUG9pbnRlcjsgdW5jb21wckxlbjogTG9uZ0ludCk7Ci12YXIgY19zdHJlYW06IHpfc3RyZWFtOyAoKiBjb21wcmVzc2lvbiBzdHJlYW0gKikKLSAgICBlcnI6IEludGVnZXI7Ci1iZWdpbgotICBjX3N0cmVhbS56YWxsb2MgOj0gTklMOwotICBjX3N0cmVhbS56ZnJlZSA6PSBOSUw7Ci0gIGNfc3RyZWFtLm9wYXF1ZSA6PSBOSUw7Ci0KLSAgZXJyIDo9IGRlZmxhdGVJbml0KGNfc3RyZWFtLCBaX0JFU1RfU1BFRUQpOwotICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZUluaXQnKTsKLQotICBjX3N0cmVhbS5uZXh0X291dCA6PSBjb21wcjsKLSAgY19zdHJlYW0uYXZhaWxfb3V0IDo9IEludGVnZXIoY29tcHJMZW4pOwotCi0gICgqIEF0IHRoaXMgcG9pbnQsIHVuY29tcHIgaXMgc3RpbGwgbW9zdGx5IHplcm9lcywgc28gaXQgc2hvdWxkIGNvbXByZXNzCi0gICAqIHZlcnkgd2VsbDoKLSAgICopCi0gIGNfc3RyZWFtLm5leHRfaW4gOj0gdW5jb21wcjsKLSAgY19zdHJlYW0uYXZhaWxfaW4gOj0gSW50ZWdlcih1bmNvbXByTGVuKTsKLSAgZXJyIDo9IGRlZmxhdGUoY19zdHJlYW0sIFpfTk9fRkxVU0gpOwotICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZScpOwotICBpZiBjX3N0cmVhbS5hdmFpbF9pbiA8PiAwIHRoZW4KLSAgICBFWElUX0VSUignZGVmbGF0ZSBub3QgZ3JlZWR5Jyk7Ci0KLSAgKCogRmVlZCBpbiBhbHJlYWR5IGNvbXByZXNzZWQgZGF0YSBhbmQgc3dpdGNoIHRvIG5vIGNvbXByZXNzaW9uOiAqKQotICBkZWZsYXRlUGFyYW1zKGNfc3RyZWFtLCBaX05PX0NPTVBSRVNTSU9OLCBaX0RFRkFVTFRfU1RSQVRFR1kpOwotICBjX3N0cmVhbS5uZXh0X2luIDo9IGNvbXByOwotICBjX3N0cmVhbS5hdmFpbF9pbiA6PSBJbnRlZ2VyKGNvbXByTGVuIGRpdiAyKTsKLSAgZXJyIDo9IGRlZmxhdGUoY19zdHJlYW0sIFpfTk9fRkxVU0gpOwotICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZScpOwotCi0gICgqIFN3aXRjaCBiYWNrIHRvIGNvbXByZXNzaW5nIG1vZGU6ICopCi0gIGRlZmxhdGVQYXJhbXMoY19zdHJlYW0sIFpfQkVTVF9DT01QUkVTU0lPTiwgWl9GSUxURVJFRCk7Ci0gIGNfc3RyZWFtLm5leHRfaW4gOj0gdW5jb21wcjsKLSAgY19zdHJlYW0uYXZhaWxfaW4gOj0gSW50ZWdlcih1bmNvbXByTGVuKTsKLSAgZXJyIDo9IGRlZmxhdGUoY19zdHJlYW0sIFpfTk9fRkxVU0gpOwotICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZScpOwotCi0gIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX0ZJTklTSCk7Ci0gIGlmIGVyciA8PiBaX1NUUkVBTV9FTkQgdGhlbgotICAgIEVYSVRfRVJSKCdkZWZsYXRlIHNob3VsZCByZXBvcnQgWl9TVFJFQU1fRU5EJyk7Ci0KLSAgZXJyIDo9IGRlZmxhdGVFbmQoY19zdHJlYW0pOwotICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZUVuZCcpOwotZW5kOwoteyRFTkRJRn0KLQotKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGluZmxhdGUgd2l0aCBsYXJnZSBidWZmZXJzCi0gKikKLXskSUZERUYgVEVTVF9JTkZMQVRFfQotcHJvY2VkdXJlIHRlc3RfbGFyZ2VfaW5mbGF0ZShjb21wcjogUG9pbnRlcjsgY29tcHJMZW46IExvbmdJbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHI6IFBvaW50ZXI7IHVuY29tcHJMZW46IExvbmdJbnQpOwotdmFyIGVycjogSW50ZWdlcjsKLSAgICBkX3N0cmVhbTogel9zdHJlYW07ICgqIGRlY29tcHJlc3Npb24gc3RyZWFtICopCi1iZWdpbgotICBTdHJDb3B5KFBDaGFyKHVuY29tcHIpLCAnZ2FyYmFnZScpOwotCi0gIGRfc3RyZWFtLnphbGxvYyA6PSBOSUw7Ci0gIGRfc3RyZWFtLnpmcmVlIDo9IE5JTDsKLSAgZF9zdHJlYW0ub3BhcXVlIDo9IE5JTDsKLQotICBkX3N0cmVhbS5uZXh0X2luIDo9IGNvbXByOwotICBkX3N0cmVhbS5hdmFpbF9pbiA6PSBJbnRlZ2VyKGNvbXByTGVuKTsKLQotICBlcnIgOj0gaW5mbGF0ZUluaXQoZF9zdHJlYW0pOwotICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZUluaXQnKTsKLQotICB3aGlsZSBUUlVFIGRvCi0gIGJlZ2luCi0gICAgZF9zdHJlYW0ubmV4dF9vdXQgOj0gdW5jb21wcjsgICAgICAgICAgICAoKiBkaXNjYXJkIHRoZSBvdXRwdXQgKikKLSAgICBkX3N0cmVhbS5hdmFpbF9vdXQgOj0gSW50ZWdlcih1bmNvbXByTGVuKTsKLSAgICBlcnIgOj0gaW5mbGF0ZShkX3N0cmVhbSwgWl9OT19GTFVTSCk7Ci0gICAgaWYgZXJyID0gWl9TVFJFQU1fRU5EIHRoZW4KLSAgICAgIGJyZWFrOwotICAgIENIRUNLX0VSUihlcnIsICdsYXJnZSBpbmZsYXRlJyk7Ci0gIGVuZDsKLQotICBlcnIgOj0gaW5mbGF0ZUVuZChkX3N0cmVhbSk7Ci0gIENIRUNLX0VSUihlcnIsICdpbmZsYXRlRW5kJyk7Ci0KLSAgaWYgZF9zdHJlYW0udG90YWxfb3V0IDw+IDIgKiB1bmNvbXByTGVuICsgY29tcHJMZW4gZGl2IDIgdGhlbgotICBiZWdpbgotICAgIFdyaXRlTG4oJ2JhZCBsYXJnZSBpbmZsYXRlOiAnLCBkX3N0cmVhbS50b3RhbF9vdXQpOwotICAgIEhhbHQoMSk7Ci0gIGVuZAotICBlbHNlCi0gICAgV3JpdGVMbignbGFyZ2VfaW5mbGF0ZSgpOiBPSycpOwotZW5kOwoteyRFTkRJRn0KLQotKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGRlZmxhdGUgd2l0aCBmdWxsIGZsdXNoCi0gKikKLXskSUZERUYgVEVTVF9GTFVTSH0KLXByb2NlZHVyZSB0ZXN0X2ZsdXNoKGNvbXByOiBQb2ludGVyOyB2YXIgY29tcHJMZW4gOiBMb25nSW50KTsKLXZhciBjX3N0cmVhbTogel9zdHJlYW07ICgqIGNvbXByZXNzaW9uIHN0cmVhbSAqKQotICAgIGVycjogSW50ZWdlcjsKLSAgICBsZW46IEludGVnZXI7Ci1iZWdpbgotICBsZW4gOj0gU3RyTGVuKGhlbGxvKSsxOwotCi0gIGNfc3RyZWFtLnphbGxvYyA6PSBOSUw7Ci0gIGNfc3RyZWFtLnpmcmVlIDo9IE5JTDsKLSAgY19zdHJlYW0ub3BhcXVlIDo9IE5JTDsKLQotICBlcnIgOj0gZGVmbGF0ZUluaXQoY19zdHJlYW0sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7Ci0gIENIRUNLX0VSUihlcnIsICdkZWZsYXRlSW5pdCcpOwotCi0gIGNfc3RyZWFtLm5leHRfaW4gOj0gaGVsbG87Ci0gIGNfc3RyZWFtLm5leHRfb3V0IDo9IGNvbXByOwotICBjX3N0cmVhbS5hdmFpbF9pbiA6PSAzOwotICBjX3N0cmVhbS5hdmFpbF9vdXQgOj0gSW50ZWdlcihjb21wckxlbik7Ci0gIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX0ZVTExfRkxVU0gpOwotICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZScpOwotCi0gIEluYyhQQnl0ZUFycmF5KGNvbXByKV5bM10pOyAoKiBmb3JjZSBhbiBlcnJvciBpbiBmaXJzdCBjb21wcmVzc2VkIGJsb2NrICopCi0gIGNfc3RyZWFtLmF2YWlsX2luIDo9IGxlbiAtIDM7Ci0KLSAgZXJyIDo9IGRlZmxhdGUoY19zdHJlYW0sIFpfRklOSVNIKTsKLSAgaWYgZXJyIDw+IFpfU1RSRUFNX0VORCB0aGVuCi0gICAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGUnKTsKLQotICBlcnIgOj0gZGVmbGF0ZUVuZChjX3N0cmVhbSk7Ci0gIENIRUNLX0VSUihlcnIsICdkZWZsYXRlRW5kJyk7Ci0KLSAgY29tcHJMZW4gOj0gY19zdHJlYW0udG90YWxfb3V0OwotZW5kOwoteyRFTkRJRn0KLQotKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGluZmxhdGVTeW5jKCkKLSAqKQoteyRJRkRFRiBURVNUX1NZTkN9Ci1wcm9jZWR1cmUgdGVzdF9zeW5jKGNvbXByOiBQb2ludGVyOyBjb21wckxlbjogTG9uZ0ludDsKLSAgICAgICAgICAgICAgICAgICAgdW5jb21wcjogUG9pbnRlcjsgdW5jb21wckxlbiA6IExvbmdJbnQpOwotdmFyIGVycjogSW50ZWdlcjsKLSAgICBkX3N0cmVhbTogel9zdHJlYW07ICgqIGRlY29tcHJlc3Npb24gc3RyZWFtICopCi1iZWdpbgotICBTdHJDb3B5KFBDaGFyKHVuY29tcHIpLCAnZ2FyYmFnZScpOwotCi0gIGRfc3RyZWFtLnphbGxvYyA6PSBOSUw7Ci0gIGRfc3RyZWFtLnpmcmVlIDo9IE5JTDsKLSAgZF9zdHJlYW0ub3BhcXVlIDo9IE5JTDsKLQotICBkX3N0cmVhbS5uZXh0X2luIDo9IGNvbXByOwotICBkX3N0cmVhbS5hdmFpbF9pbiA6PSAyOyAoKiBqdXN0IHJlYWQgdGhlIHpsaWIgaGVhZGVyICopCi0KLSAgZXJyIDo9IGluZmxhdGVJbml0KGRfc3RyZWFtKTsKLSAgQ0hFQ0tfRVJSKGVyciwgJ2luZmxhdGVJbml0Jyk7Ci0KLSAgZF9zdHJlYW0ubmV4dF9vdXQgOj0gdW5jb21wcjsKLSAgZF9zdHJlYW0uYXZhaWxfb3V0IDo9IEludGVnZXIodW5jb21wckxlbik7Ci0KLSAgaW5mbGF0ZShkX3N0cmVhbSwgWl9OT19GTFVTSCk7Ci0gIENIRUNLX0VSUihlcnIsICdpbmZsYXRlJyk7Ci0KLSAgZF9zdHJlYW0uYXZhaWxfaW4gOj0gSW50ZWdlcihjb21wckxlbi0yKTsgICAoKiByZWFkIGFsbCBjb21wcmVzc2VkIGRhdGEgKikKLSAgZXJyIDo9IGluZmxhdGVTeW5jKGRfc3RyZWFtKTsgICAgICAgICAgICAgICAoKiBidXQgc2tpcCB0aGUgZGFtYWdlZCBwYXJ0ICopCi0gIENIRUNLX0VSUihlcnIsICdpbmZsYXRlU3luYycpOwotCi0gIGVyciA6PSBpbmZsYXRlKGRfc3RyZWFtLCBaX0ZJTklTSCk7Ci0gIGlmIGVyciA8PiBaX0RBVEFfRVJST1IgdGhlbgotICAgIEVYSVRfRVJSKCdpbmZsYXRlIHNob3VsZCByZXBvcnQgREFUQV9FUlJPUicpOwotICAgICgqIEJlY2F1c2Ugb2YgaW5jb3JyZWN0IGFkbGVyMzIgKikKLQotICBlcnIgOj0gaW5mbGF0ZUVuZChkX3N0cmVhbSk7Ci0gIENIRUNLX0VSUihlcnIsICdpbmZsYXRlRW5kJyk7Ci0KLSAgV3JpdGVMbignYWZ0ZXIgaW5mbGF0ZVN5bmMoKTogaGVsJywgUENoYXIodW5jb21wcikpOwotZW5kOwoteyRFTkRJRn0KLQotKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGRlZmxhdGUgd2l0aCBwcmVzZXQgZGljdGlvbmFyeQotICopCi17JElGREVGIFRFU1RfRElDVH0KLXByb2NlZHVyZSB0ZXN0X2RpY3RfZGVmbGF0ZShjb21wcjogUG9pbnRlcjsgY29tcHJMZW46IExvbmdJbnQpOwotdmFyIGNfc3RyZWFtOiB6X3N0cmVhbTsgKCogY29tcHJlc3Npb24gc3RyZWFtICopCi0gICAgZXJyOiBJbnRlZ2VyOwotYmVnaW4KLSAgY19zdHJlYW0uemFsbG9jIDo9IE5JTDsKLSAgY19zdHJlYW0uemZyZWUgOj0gTklMOwotICBjX3N0cmVhbS5vcGFxdWUgOj0gTklMOwotCi0gIGVyciA6PSBkZWZsYXRlSW5pdChjX3N0cmVhbSwgWl9CRVNUX0NPTVBSRVNTSU9OKTsKLSAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGVJbml0Jyk7Ci0KLSAgZXJyIDo9IGRlZmxhdGVTZXREaWN0aW9uYXJ5KGNfc3RyZWFtLCBkaWN0aW9uYXJ5LCBTdHJMZW4oZGljdGlvbmFyeSkpOwotICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZVNldERpY3Rpb25hcnknKTsKLQotICBkaWN0SWQgOj0gY19zdHJlYW0uYWRsZXI7Ci0gIGNfc3RyZWFtLm5leHRfb3V0IDo9IGNvbXByOwotICBjX3N0cmVhbS5hdmFpbF9vdXQgOj0gSW50ZWdlcihjb21wckxlbik7Ci0KLSAgY19zdHJlYW0ubmV4dF9pbiA6PSBoZWxsbzsKLSAgY19zdHJlYW0uYXZhaWxfaW4gOj0gU3RyTGVuKGhlbGxvKSsxOwotCi0gIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX0ZJTklTSCk7Ci0gIGlmIGVyciA8PiBaX1NUUkVBTV9FTkQgdGhlbgotICAgIEVYSVRfRVJSKCdkZWZsYXRlIHNob3VsZCByZXBvcnQgWl9TVFJFQU1fRU5EJyk7Ci0KLSAgZXJyIDo9IGRlZmxhdGVFbmQoY19zdHJlYW0pOwotICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZUVuZCcpOwotZW5kOwoteyRFTkRJRn0KLQotKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGluZmxhdGUgd2l0aCBhIHByZXNldCBkaWN0aW9uYXJ5Ci0gKikKLXskSUZERUYgVEVTVF9ESUNUfQotcHJvY2VkdXJlIHRlc3RfZGljdF9pbmZsYXRlKGNvbXByOiBQb2ludGVyOyBjb21wckxlbjogTG9uZ0ludDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByOiBQb2ludGVyOyB1bmNvbXByTGVuOiBMb25nSW50KTsKLXZhciBlcnI6IEludGVnZXI7Ci0gICAgZF9zdHJlYW06IHpfc3RyZWFtOyAoKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqKQotYmVnaW4KLSAgU3RyQ29weShQQ2hhcih1bmNvbXByKSwgJ2dhcmJhZ2UnKTsKLQotICBkX3N0cmVhbS56YWxsb2MgOj0gTklMOwotICBkX3N0cmVhbS56ZnJlZSA6PSBOSUw7Ci0gIGRfc3RyZWFtLm9wYXF1ZSA6PSBOSUw7Ci0KLSAgZF9zdHJlYW0ubmV4dF9pbiA6PSBjb21wcjsKLSAgZF9zdHJlYW0uYXZhaWxfaW4gOj0gSW50ZWdlcihjb21wckxlbik7Ci0KLSAgZXJyIDo9IGluZmxhdGVJbml0KGRfc3RyZWFtKTsKLSAgQ0hFQ0tfRVJSKGVyciwgJ2luZmxhdGVJbml0Jyk7Ci0KLSAgZF9zdHJlYW0ubmV4dF9vdXQgOj0gdW5jb21wcjsKLSAgZF9zdHJlYW0uYXZhaWxfb3V0IDo9IEludGVnZXIodW5jb21wckxlbik7Ci0KLSAgd2hpbGUgVFJVRSBkbwotICBiZWdpbgotICAgIGVyciA6PSBpbmZsYXRlKGRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKLSAgICBpZiBlcnIgPSBaX1NUUkVBTV9FTkQgdGhlbgotICAgICAgYnJlYWs7Ci0gICAgaWYgZXJyID0gWl9ORUVEX0RJQ1QgdGhlbgotICAgIGJlZ2luCi0gICAgICBpZiBkX3N0cmVhbS5hZGxlciA8PiBkaWN0SWQgdGhlbgotICAgICAgICBFWElUX0VSUigndW5leHBlY3RlZCBkaWN0aW9uYXJ5Jyk7Ci0gICAgICBlcnIgOj0gaW5mbGF0ZVNldERpY3Rpb25hcnkoZF9zdHJlYW0sIGRpY3Rpb25hcnksIFN0ckxlbihkaWN0aW9uYXJ5KSk7Ci0gICAgZW5kOwotICAgIENIRUNLX0VSUihlcnIsICdpbmZsYXRlIHdpdGggZGljdCcpOwotICBlbmQ7Ci0KLSAgZXJyIDo9IGluZmxhdGVFbmQoZF9zdHJlYW0pOwotICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZUVuZCcpOwotCi0gIGlmIFN0ckNvbXAoUENoYXIodW5jb21wciksIGhlbGxvKSA8PiAwIHRoZW4KLSAgICBFWElUX0VSUignYmFkIGluZmxhdGUgd2l0aCBkaWN0JykKLSAgZWxzZQotICAgIFdyaXRlTG4oJ2luZmxhdGUgd2l0aCBkaWN0aW9uYXJ5OiAnLCBQQ2hhcih1bmNvbXByKSk7Ci1lbmQ7Ci17JEVORElGfQotCi12YXIgY29tcHIsIHVuY29tcHI6IFBvaW50ZXI7Ci0gICAgY29tcHJMZW4sIHVuY29tcHJMZW46IExvbmdJbnQ7Ci0KLWJlZ2luCi0gIGlmIHpsaWJWZXJzaW9uXiA8PiBaTElCX1ZFUlNJT05bMV0gdGhlbgotICAgIEVYSVRfRVJSKCdJbmNvbXBhdGlibGUgemxpYiB2ZXJzaW9uJyk7Ci0KLSAgV3JpdGVMbignemxpYiB2ZXJzaW9uOiAnLCB6bGliVmVyc2lvbik7Ci0gIFdyaXRlTG4oJ3psaWIgY29tcGlsZSBmbGFnczogJywgRm9ybWF0KCcweCV4JywgW3psaWJDb21waWxlRmxhZ3NdKSk7Ci0KLSAgY29tcHJMZW4gOj0gMTAwMDAgKiBTaXplT2YoSW50ZWdlcik7ICgqIGRvbid0IG92ZXJmbG93IG9uIE1TRE9TICopCi0gIHVuY29tcHJMZW4gOj0gY29tcHJMZW47Ci0gIEdldE1lbShjb21wciwgY29tcHJMZW4pOwotICBHZXRNZW0odW5jb21wciwgdW5jb21wckxlbik7Ci0gIGlmIChjb21wciA9IE5JTCkgb3IgKHVuY29tcHIgPSBOSUwpIHRoZW4KLSAgICBFWElUX0VSUignT3V0IG9mIG1lbW9yeScpOwotICAoKiBjb21wciBhbmQgdW5jb21wciBhcmUgY2xlYXJlZCB0byBhdm9pZCByZWFkaW5nIHVuaW5pdGlhbGl6ZWQKLSAgICogZGF0YSBhbmQgdG8gZW5zdXJlIHRoYXQgdW5jb21wciBjb21wcmVzc2VzIHdlbGwuCi0gICAqKQotICBGaWxsQ2hhcihjb21wcl4sIGNvbXByTGVuLCAwKTsKLSAgRmlsbENoYXIodW5jb21wcl4sIHVuY29tcHJMZW4sIDApOwotCi0gIHskSUZERUYgVEVTVF9DT01QUkVTU30KLSAgV3JpdGVMbignKiogVGVzdGluZyBjb21wcmVzcycpOwotICB0ZXN0X2NvbXByZXNzKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7Ci0gIHskRU5ESUZ9Ci0KLSAgeyRJRkRFRiBURVNUX0daSU99Ci0gIFdyaXRlTG4oJyoqIFRlc3RpbmcgZ3ppbycpOwotICBpZiBQYXJhbUNvdW50ID49IDEgdGhlbgotICAgIHRlc3RfZ3ppbyhQYXJhbVN0cigxKSwgdW5jb21wciwgdW5jb21wckxlbikKLSAgZWxzZQotICAgIHRlc3RfZ3ppbyhURVNURklMRSwgdW5jb21wciwgdW5jb21wckxlbik7Ci0gIHskRU5ESUZ9Ci0KLSAgeyRJRkRFRiBURVNUX0RFRkxBVEV9Ci0gIFdyaXRlTG4oJyoqIFRlc3RpbmcgZGVmbGF0ZSB3aXRoIHNtYWxsIGJ1ZmZlcnMnKTsKLSAgdGVzdF9kZWZsYXRlKGNvbXByLCBjb21wckxlbik7Ci0gIHskRU5ESUZ9Ci0gIHskSUZERUYgVEVTVF9JTkZMQVRFfQotICBXcml0ZUxuKCcqKiBUZXN0aW5nIGluZmxhdGUgd2l0aCBzbWFsbCBidWZmZXJzJyk7Ci0gIHRlc3RfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOwotICB7JEVORElGfQotCi0gIHskSUZERUYgVEVTVF9ERUZMQVRFfQotICBXcml0ZUxuKCcqKiBUZXN0aW5nIGRlZmxhdGUgd2l0aCBsYXJnZSBidWZmZXJzJyk7Ci0gIHRlc3RfbGFyZ2VfZGVmbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOwotICB7JEVORElGfQotICB7JElGREVGIFRFU1RfSU5GTEFURX0KLSAgV3JpdGVMbignKiogVGVzdGluZyBpbmZsYXRlIHdpdGggbGFyZ2UgYnVmZmVycycpOwotICB0ZXN0X2xhcmdlX2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKLSAgeyRFTkRJRn0KLQotICB7JElGREVGIFRFU1RfRkxVU0h9Ci0gIFdyaXRlTG4oJyoqIFRlc3RpbmcgZGVmbGF0ZSB3aXRoIGZ1bGwgZmx1c2gnKTsKLSAgdGVzdF9mbHVzaChjb21wciwgY29tcHJMZW4pOwotICB7JEVORElGfQotICB7JElGREVGIFRFU1RfU1lOQ30KLSAgV3JpdGVMbignKiogVGVzdGluZyBpbmZsYXRlU3luYycpOwotICB0ZXN0X3N5bmMoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKLSAgeyRFTkRJRn0KLSAgY29tcHJMZW4gOj0gdW5jb21wckxlbjsKLQotICB7JElGREVGIFRFU1RfRElDVH0KLSAgV3JpdGVMbignKiogVGVzdGluZyBkZWZsYXRlIGFuZCBpbmZsYXRlIHdpdGggcHJlc2V0IGRpY3Rpb25hcnknKTsKLSAgdGVzdF9kaWN0X2RlZmxhdGUoY29tcHIsIGNvbXByTGVuKTsKLSAgdGVzdF9kaWN0X2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKLSAgeyRFTkRJRn0KLQotICBGcmVlTWVtKGNvbXByLCBjb21wckxlbik7Ci0gIEZyZWVNZW0odW5jb21wciwgdW5jb21wckxlbik7Ci1lbmQuCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL3Bhc2NhbC9yZWFkbWUudHh0IGIvc3JjL3psaWIvY29udHJpYi9wYXNjYWwvcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlODdjOC4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL3Bhc2NhbC9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotCi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyBhIFBhc2NhbCAoRGVscGhpLCBLeWxpeCkgaW50ZXJmYWNlIHRvIHRoZQotemxpYiBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCi0KLQotRGlyZWN0b3J5IGxpc3RpbmcKLT09PT09PT09PT09PT09PT09Ci0KLXpsaWJkMzIubWFrICAgICBtYWtlZmlsZSBmb3IgQm9ybGFuZCBDKysKLWV4YW1wbGUucGFzICAgICB1c2FnZSBleGFtcGxlIG9mIHpsaWIKLXpsaWJwYXMucGFzICAgICB0aGUgUGFzY2FsIGludGVyZmFjZSB0byB6bGliCi1yZWFkbWUudHh0ICAgICAgdGhpcyBmaWxlCi0KLQotQ29tcGF0aWJpbGl0eSBub3RlcwotPT09PT09PT09PT09PT09PT09PQotCi0tIEFsdGhvdWdoIHRoZSBuYW1lICJ6bGliIiB3b3VsZCBoYXZlIGJlZW4gbW9yZSBub3JtYWwgZm9yIHRoZQotICB6bGlicGFzIHVuaXQsIHRoaXMgbmFtZSBpcyBhbHJlYWR5IHRha2VuIGJ5IEJvcmxhbmQncyBaTGliIHVuaXQuCi0gIFRoaXMgaXMgc29tZWhvdyB1bmZvcnR1bmF0ZSwgYmVjYXVzZSB0aGF0IHVuaXQgaXMgbm90IGEgZ2VudWluZQotICBpbnRlcmZhY2UgdG8gdGhlIGZ1bGwtZmxlZGdlZCB6bGliIGZ1bmN0aW9uYWxpdHksIGJ1dCBhIHN1aXRlIG9mCi0gIGNsYXNzIHdyYXBwZXJzIGFyb3VuZCB6bGliIHN0cmVhbXMuICBPdGhlciBlc3NlbnRpYWwgZmVhdHVyZXMsCi0gIHN1Y2ggYXMgY2hlY2tzdW1zLCBhcmUgbWlzc2luZy4KLSAgSXQgd291bGQgaGF2ZSBiZWVuIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoYXQgdW5pdCB0byBoYXZlIGEgbmFtZQotICBsaWtlICJaU3RyZWFtcyIsIG9yIHNvbWV0aGluZyBzaW1pbGFyLgotCi0tIFRoZSBDIGFuZCB6bGliLXN1cHBsaWVkIHR5cGVzIGludCwgdUludCwgbG9uZywgdUxvbmcsIGV0Yy4gYXJlCi0gIHRyYW5zbGF0ZWQgZGlyZWN0bHkgaW50byBQYXNjYWwgdHlwZXMgb2Ygc2ltaWxhciBzaXplcyAoSW50ZWdlciwKLSAgTG9uZ0ludCwgZXRjLiksIHRvIGF2b2lkIG5hbWVzcGFjZSBwb2xsdXRpb24uICBJbiBwYXJ0aWN1bGFyLAotICB0aGVyZSBpcyBubyBjb252ZXJzaW9uIG9mIHVuc2lnbmVkIGludCBpbnRvIGEgUGFzY2FsIHVuc2lnbmVkCi0gIGludGVnZXIuICBUaGUgV29yZCB0eXBlIGlzIG5vbi1wb3J0YWJsZSBhbmQgaGFzIHRoZSBzYW1lIHNpemUKLSAgKDE2IGJpdHMpIGJvdGggaW4gYSAxNi1iaXQgYW5kIGluIGEgMzItYml0IGVudmlyb25tZW50LCB1bmxpa2UKLSAgSW50ZWdlci4gIEV2ZW4gaWYgdGhlcmUgaXMgYSAzMi1iaXQgQ2FyZGluYWwgdHlwZSwgdGhlcmUgaXMgbm8KLSAgcmVhbCBuZWVkIGZvciB1bnNpZ25lZCBpbnQgaW4gemxpYiB1bmRlciBhIDMyLWJpdCBlbnZpcm9ubWVudC4KLQotLSBFeGNlcHQgZm9yIHRoZSBjYWxsYmFja3MsIHRoZSB6bGliIGZ1bmN0aW9uIGludGVyZmFjZXMgYXJlCi0gIGFzc3VtaW5nIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gbm9ybWFsbHkgdXNlZCBpbiBQYXNjYWwKLSAgKF9fcGFzY2FsIGZvciBET1MgYW5kIFdpbmRvd3MxNiwgX19mYXN0Y2FsbCBmb3IgV2luZG93czMyKS4KLSAgU2luY2UgdGhlIGNkZWNsIGtleXdvcmQgaXMgdXNlZCwgdGhlIG9sZCBUdXJibyBQYXNjYWwgZG9lcwotICBub3Qgd29yayB3aXRoIHRoaXMgaW50ZXJmYWNlLgotCi0tIFRoZSBneiogZnVuY3Rpb24gaW50ZXJmYWNlcyBhcmUgbm90IHRyYW5zbGF0ZWQsIHRvIGF2b2lkCi0gIGludGVyZmFjaW5nIHByb2JsZW1zIHdpdGggdGhlIEMgcnVudGltZSBsaWJyYXJ5LiAgQmVzaWRlcywKLSAgICBnenByaW50ZihnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0gIGNhbm5vdCBiZSB0cmFuc2xhdGVkIGludG8gUGFzY2FsLgotCi0KLUxlZ2FsIGlzc3VlcwotPT09PT09PT09PT09Ci0KLVRoZSB6bGlicGFzIGludGVyZmFjZSBpczoKLSAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlci4KLSAgQ29weXJpZ2h0IChDKSAxOTk4IGJ5IEJvYiBEZWxsYWNhLgotICBDb3B5cmlnaHQgKEMpIDIwMDMgYnkgQ29zbWluIFRydXRhLgotCi1UaGUgZXhhbXBsZSBwcm9ncmFtIGlzOgotICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBieSBKZWFuLWxvdXAgR2FpbGx5LgotICBDb3B5cmlnaHQgKEMpIDE5OTgsMTk5OSwyMDAwIGJ5IEphY3F1ZXMgTm9tc3NpIE56YWxpLgotICBDb3B5cmlnaHQgKEMpIDIwMDMgYnkgQ29zbWluIFRydXRhLgotCi0gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9yIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL3Bhc2NhbC96bGliZDMyLm1hayBiL3NyYy96bGliL2NvbnRyaWIvcGFzY2FsL3psaWJkMzIubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmIwMGI3Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvcGFzY2FsL3psaWJkMzIubWFrCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgemxpYgotIyBGb3IgdXNlIHdpdGggRGVscGhpIGFuZCBDKysgQnVpbGRlciB1bmRlciBXaW4zMgotIyBVcGRhdGVkIGZvciB6bGliIDEuMi54IGJ5IENvc21pbiBUcnV0YQotCi0jIC0tLS0tLS0tLS0tLSBCb3JsYW5kIEMrKyAtLS0tLS0tLS0tLS0KLQotIyBUaGlzIHByb2plY3QgdXNlcyB0aGUgRGVscGhpIChmYXN0Y2FsbC9yZWdpc3RlcikgY2FsbGluZyBjb252ZW50aW9uOgotTE9DID0gLURaRVhQT1JUPV9fZmFzdGNhbGwgLURaRVhQT1JUVkE9X19jZGVjbAotCi1DQyA9IGJjYzMyCi1MRCA9IGJjYzMyCi1BUiA9IHRsaWIKLSMgZG8gbm90IHVzZSAiLXByIiBpbiBDRkxBR1MKLUNGTEFHUyA9IC1hIC1kIC1rLSAtTzIgJChMT0MpCi1MREZMQUdTID0KLQotCi0jIHZhcmlhYmxlcwotWkxJQl9MSUIgPSB6bGliLmxpYgotCi1PQkoxID0gYWRsZXIzMi5vYmogY29tcHJlc3Mub2JqIGNyYzMyLm9iaiBkZWZsYXRlLm9iaiBnemNsb3NlLm9iaiBnemxpYi5vYmogZ3pyZWFkLm9iagotT0JKMiA9IGd6d3JpdGUub2JqIGluZmJhY2sub2JqIGluZmZhc3Qub2JqIGluZmxhdGUub2JqIGluZnRyZWVzLm9iaiB0cmVlcy5vYmogdW5jb21wci5vYmogenV0aWwub2JqCi1PQkpQMSA9ICthZGxlcjMyLm9iaitjb21wcmVzcy5vYmorY3JjMzIub2JqK2RlZmxhdGUub2JqK2d6Y2xvc2Uub2JqK2d6bGliLm9iaitnenJlYWQub2JqCi1PQkpQMiA9ICtnendyaXRlLm9iaitpbmZiYWNrLm9iaitpbmZmYXN0Lm9iaitpbmZsYXRlLm9iaitpbmZ0cmVlcy5vYmordHJlZXMub2JqK3VuY29tcHIub2JqK3p1dGlsLm9iagotCi0KLSMgdGFyZ2V0cwotYWxsOiAkKFpMSUJfTElCKSBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKLQotLmMub2JqOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLWFkbGVyMzIub2JqOiBhZGxlcjMyLmMgemxpYi5oIHpjb25mLmgKLQotY29tcHJlc3Mub2JqOiBjb21wcmVzcy5jIHpsaWIuaCB6Y29uZi5oCi0KLWNyYzMyLm9iajogY3JjMzIuYyB6bGliLmggemNvbmYuaCBjcmMzMi5oCi0KLWRlZmxhdGUub2JqOiBkZWZsYXRlLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLQotZ3pjbG9zZS5vYmo6IGd6Y2xvc2UuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAotCi1nemxpYi5vYmo6IGd6bGliLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLQotZ3pyZWFkLm9iajogZ3pyZWFkLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLQotZ3p3cml0ZS5vYmo6IGd6d3JpdGUuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAotCi1pbmZiYWNrLm9iajogaW5mYmFjay5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAotIGluZmZhc3QuaCBpbmZmaXhlZC5oCi0KLWluZmZhc3Qub2JqOiBpbmZmYXN0LmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCi0gaW5mZmFzdC5oCi0KLWluZmxhdGUub2JqOiBpbmZsYXRlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCi0gaW5mZmFzdC5oIGluZmZpeGVkLmgKLQotaW5mdHJlZXMub2JqOiBpbmZ0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAotCi10cmVlcy5vYmo6IHRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBkZWZsYXRlLmggdHJlZXMuaAotCi11bmNvbXByLm9iajogdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oCi0KLXp1dGlsLm9iajogenV0aWwuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0KLWV4YW1wbGUub2JqOiB0ZXN0L2V4YW1wbGUuYyB6bGliLmggemNvbmYuaAotCi1taW5pZ3ppcC5vYmo6IHRlc3QvbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAotCi0KLSMgRm9yIHRoZSBzYWtlIG9mIHRoZSBvbGQgQm9ybGFuZCBtYWtlLAotIyB0aGUgY29tbWFuZCBsaW5lIGlzIGN1dCB0byBmaXQgaW4gdGhlIE1TLURPUyAxMjggYnl0ZSBsaW1pdDoKLSQoWkxJQl9MSUIpOiAkKE9CSjEpICQoT0JKMikKLQktZGVsICQoWkxJQl9MSUIpCi0JJChBUikgJChaTElCX0xJQikgJChPQkpQMSkKLQkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlAyKQotCi0KLSMgdGVzdGluZwotdGVzdDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCi0JZXhhbXBsZQotCWVjaG8gaGVsbG8gd29ybGQgfCBtaW5pZ3ppcCB8IG1pbmlnemlwIC1kCi0KLWV4YW1wbGUuZXhlOiBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQotCSQoTEQpICQoTERGTEFHUykgZXhhbXBsZS5vYmogJChaTElCX0xJQikKLQotbWluaWd6aXAuZXhlOiBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKLQkkKExEKSAkKExERkxBR1MpIG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQotCi0KLSMgY2xlYW51cAotY2xlYW46Ci0JLWRlbCAqLm9iagotCS1kZWwgKi5leGUKLQktZGVsICoubGliCi0JLWRlbCAqLnRkcwotCS1kZWwgemxpYi5iYWsKLQktZGVsIGZvby5negotCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL3Bhc2NhbC96bGlicGFzLnBhcyBiL3NyYy96bGliL2NvbnRyaWIvcGFzY2FsL3psaWJwYXMucGFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWJkODYyLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvcGFzY2FsL3psaWJwYXMucGFzCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLSgqIHpsaWJwYXMgLS0gUGFzY2FsIGludGVyZmFjZSB0byB0aGUgemxpYiBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29zbWluIFRydXRhLgotICogRGVyaXZlZCBmcm9tIG9yaWdpbmFsIHNvdXJjZXMgYnkgQm9iIERlbGxhY2EuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcmVhZG1lLnR4dAotICopCi0KLXVuaXQgemxpYnBhczsKLQotaW50ZXJmYWNlCi0KLWNvbnN0Ci0gIFpMSUJfVkVSU0lPTiA9ICcxLjIuNyc7Ci0gIFpMSUJfVkVSTlVNICA9ICQxMjcwOwotCi10eXBlCi0gIGFsbG9jX2Z1bmMgPSBmdW5jdGlvbihvcGFxdWU6IFBvaW50ZXI7IGl0ZW1zLCBzaXplOiBJbnRlZ2VyKTogUG9pbnRlcjsKLSAgICAgICAgICAgICAgICAgY2RlY2w7Ci0gIGZyZWVfZnVuYyAgPSBwcm9jZWR1cmUob3BhcXVlLCBhZGRyZXNzOiBQb2ludGVyKTsKLSAgICAgICAgICAgICAgICAgY2RlY2w7Ci0KLSAgaW5fZnVuYyAgICA9IGZ1bmN0aW9uKG9wYXF1ZTogUG9pbnRlcjsgdmFyIGJ1ZjogUEJ5dGUpOiBJbnRlZ2VyOwotICAgICAgICAgICAgICAgICBjZGVjbDsKLSAgb3V0X2Z1bmMgICA9IGZ1bmN0aW9uKG9wYXF1ZTogUG9pbnRlcjsgYnVmOiBQQnl0ZTsgc2l6ZTogSW50ZWdlcik6IEludGVnZXI7Ci0gICAgICAgICAgICAgICAgIGNkZWNsOwotCi0gIHpfc3RyZWFtcCA9IF56X3N0cmVhbTsKLSAgel9zdHJlYW0gPSBwYWNrZWQgcmVjb3JkCi0gICAgbmV4dF9pbjogUENoYXI7ICAgICAgICgqIG5leHQgaW5wdXQgYnl0ZSAqKQotICAgIGF2YWlsX2luOiBJbnRlZ2VyOyAgICAoKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IG5leHRfaW4gKikKLSAgICB0b3RhbF9pbjogTG9uZ0ludDsgICAgKCogdG90YWwgbmIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKikKLQotICAgIG5leHRfb3V0OiBQQ2hhcjsgICAgICAoKiBuZXh0IG91dHB1dCBieXRlIHNob3VsZCBiZSBwdXQgdGhlcmUgKikKLSAgICBhdmFpbF9vdXQ6IEludGVnZXI7ICAgKCogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgbmV4dF9vdXQgKikKLSAgICB0b3RhbF9vdXQ6IExvbmdJbnQ7ICAgKCogdG90YWwgbmIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhciAqKQotCi0gICAgbXNnOiBQQ2hhcjsgICAgICAgICAgICgqIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvciAqKQotICAgIHN0YXRlOiBQb2ludGVyOyAgICAgICAoKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKikKLQotICAgIHphbGxvYzogYWxsb2NfZnVuYzsgICAoKiB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqKQotICAgIHpmcmVlOiBmcmVlX2Z1bmM7ICAgICAoKiB1c2VkIHRvIGZyZWUgdGhlIGludGVybmFsIHN0YXRlICopCi0gICAgb3BhcXVlOiBQb2ludGVyOyAgICAgICgqIHByaXZhdGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvIHphbGxvYyBhbmQgemZyZWUgKikKLQotICAgIGRhdGFfdHlwZTogSW50ZWdlcjsgICAoKiBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6IGFzY2lpIG9yIGJpbmFyeSAqKQotICAgIGFkbGVyOiBMb25nSW50OyAgICAgICAoKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqKQotICAgIHJlc2VydmVkOiBMb25nSW50OyAgICAoKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqKQotICBlbmQ7Ci0KLSAgZ3pfaGVhZGVycCA9IF5nel9oZWFkZXI7Ci0gIGd6X2hlYWRlciA9IHBhY2tlZCByZWNvcmQKLSAgICB0ZXh0OiBJbnRlZ2VyOyAgICAgICAgKCogdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dCAqKQotICAgIHRpbWU6IExvbmdJbnQ7ICAgICAgICAoKiBtb2RpZmljYXRpb24gdGltZSAqKQotICAgIHhmbGFnczogSW50ZWdlcjsgICAgICAoKiBleHRyYSBmbGFncyAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqKQotICAgIG9zOiBJbnRlZ2VyOyAgICAgICAgICAoKiBvcGVyYXRpbmcgc3lzdGVtICopCi0gICAgZXh0cmE6IFBDaGFyOyAgICAgICAgICgqIHBvaW50ZXIgdG8gZXh0cmEgZmllbGQgb3IgWl9OVUxMIGlmIG5vbmUgKikKLSAgICBleHRyYV9sZW46IEludGVnZXI7ICAgKCogZXh0cmEgZmllbGQgbGVuZ3RoICh2YWxpZCBpZiBleHRyYSAhPSBaX05VTEwpICopCi0gICAgZXh0cmFfbWF4OiBJbnRlZ2VyOyAgICgqIHNwYWNlIGF0IGV4dHJhIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICopCi0gICAgbmFtZTogUENoYXI7ICAgICAgICAgICgqIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKikKLSAgICBuYW1lX21heDogSW50ZWdlcjsgICAgKCogc3BhY2UgYXQgbmFtZSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqKQotICAgIGNvbW1lbnQ6IFBDaGFyOyAgICAgICAoKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBjb21tZW50IG9yIFpfTlVMTCAqKQotICAgIGNvbW1fbWF4OiBJbnRlZ2VyOyAgICAoKiBzcGFjZSBhdCBjb21tZW50IChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICopCi0gICAgaGNyYzogSW50ZWdlcjsgICAgICAgICgqIHRydWUgaWYgdGhlcmUgd2FzIG9yIHdpbGwgYmUgYSBoZWFkZXIgY3JjICopCi0gICAgZG9uZTogSW50ZWdlcjsgICAgICAgICgqIHRydWUgd2hlbiBkb25lIHJlYWRpbmcgZ3ppcCBoZWFkZXIgKikKLSAgZW5kOwotCi0oKiBjb25zdGFudHMgKikKLWNvbnN0Ci0gIFpfTk9fRkxVU0ggICAgICA9IDA7Ci0gIFpfUEFSVElBTF9GTFVTSCA9IDE7Ci0gIFpfU1lOQ19GTFVTSCAgICA9IDI7Ci0gIFpfRlVMTF9GTFVTSCAgICA9IDM7Ci0gIFpfRklOSVNIICAgICAgICA9IDQ7Ci0gIFpfQkxPQ0sgICAgICAgICA9IDU7Ci0gIFpfVFJFRVMgICAgICAgICA9IDY7Ci0KLSAgWl9PSyAgICAgICAgICAgID0gIDA7Ci0gIFpfU1RSRUFNX0VORCAgICA9ICAxOwotICBaX05FRURfRElDVCAgICAgPSAgMjsKLSAgWl9FUlJOTyAgICAgICAgID0gLTE7Ci0gIFpfU1RSRUFNX0VSUk9SICA9IC0yOwotICBaX0RBVEFfRVJST1IgICAgPSAtMzsKLSAgWl9NRU1fRVJST1IgICAgID0gLTQ7Ci0gIFpfQlVGX0VSUk9SICAgICA9IC01OwotICBaX1ZFUlNJT05fRVJST1IgPSAtNjsKLQotICBaX05PX0NPTVBSRVNTSU9OICAgICAgID0gIDA7Ci0gIFpfQkVTVF9TUEVFRCAgICAgICAgICAgPSAgMTsKLSAgWl9CRVNUX0NPTVBSRVNTSU9OICAgICA9ICA5OwotICBaX0RFRkFVTFRfQ09NUFJFU1NJT04gID0gLTE7Ci0KLSAgWl9GSUxURVJFRCAgICAgICAgICAgID0gMTsKLSAgWl9IVUZGTUFOX09OTFkgICAgICAgID0gMjsKLSAgWl9STEUgICAgICAgICAgICAgICAgID0gMzsKLSAgWl9GSVhFRCAgICAgICAgICAgICAgID0gNDsKLSAgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDsKLQotICBaX0JJTkFSWSAgID0gMDsKLSAgWl9URVhUICAgICA9IDE7Ci0gIFpfQVNDSUkgICAgPSAxOwotICBaX1VOS05PV04gID0gMjsKLQotICBaX0RFRkxBVEVEID0gODsKLQotKCogYmFzaWMgZnVuY3Rpb25zICopCi1mdW5jdGlvbiB6bGliVmVyc2lvbjogUENoYXI7Ci1mdW5jdGlvbiBkZWZsYXRlSW5pdCh2YXIgc3RybTogel9zdHJlYW07IGxldmVsOiBJbnRlZ2VyKTogSW50ZWdlcjsKLWZ1bmN0aW9uIGRlZmxhdGUodmFyIHN0cm06IHpfc3RyZWFtOyBmbHVzaDogSW50ZWdlcik6IEludGVnZXI7Ci1mdW5jdGlvbiBkZWZsYXRlRW5kKHZhciBzdHJtOiB6X3N0cmVhbSk6IEludGVnZXI7Ci1mdW5jdGlvbiBpbmZsYXRlSW5pdCh2YXIgc3RybTogel9zdHJlYW0pOiBJbnRlZ2VyOwotZnVuY3Rpb24gaW5mbGF0ZSh2YXIgc3RybTogel9zdHJlYW07IGZsdXNoOiBJbnRlZ2VyKTogSW50ZWdlcjsKLWZ1bmN0aW9uIGluZmxhdGVFbmQodmFyIHN0cm06IHpfc3RyZWFtKTogSW50ZWdlcjsKLQotKCogYWR2YW5jZWQgZnVuY3Rpb25zICopCi1mdW5jdGlvbiBkZWZsYXRlSW5pdDIodmFyIHN0cm06IHpfc3RyZWFtOyBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLAotICAgICAgICAgICAgICAgICAgICAgIG1lbUxldmVsLCBzdHJhdGVneTogSW50ZWdlcik6IEludGVnZXI7Ci1mdW5jdGlvbiBkZWZsYXRlU2V0RGljdGlvbmFyeSh2YXIgc3RybTogel9zdHJlYW07IGNvbnN0IGRpY3Rpb25hcnk6IFBDaGFyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdExlbmd0aDogSW50ZWdlcik6IEludGVnZXI7Ci1mdW5jdGlvbiBkZWZsYXRlQ29weSh2YXIgZGVzdCwgc291cmNlOiB6X3N0cmVhbSk6IEludGVnZXI7Ci1mdW5jdGlvbiBkZWZsYXRlUmVzZXQodmFyIHN0cm06IHpfc3RyZWFtKTogSW50ZWdlcjsKLWZ1bmN0aW9uIGRlZmxhdGVQYXJhbXModmFyIHN0cm06IHpfc3RyZWFtOyBsZXZlbCwgc3RyYXRlZ3k6IEludGVnZXIpOiBJbnRlZ2VyOwotZnVuY3Rpb24gZGVmbGF0ZVR1bmUodmFyIHN0cm06IHpfc3RyZWFtOyBnb29kX2xlbmd0aCwgbWF4X2xhenksIG5pY2VfbGVuZ3RoLCBtYXhfY2hhaW46IEludGVnZXIpOiBJbnRlZ2VyOwotZnVuY3Rpb24gZGVmbGF0ZUJvdW5kKHZhciBzdHJtOiB6X3N0cmVhbTsgc291cmNlTGVuOiBMb25nSW50KTogTG9uZ0ludDsKLWZ1bmN0aW9uIGRlZmxhdGVQZW5kaW5nKHZhciBzdHJtOiB6X3N0cmVhbTsgdmFyIHBlbmRpbmc6IEludGVnZXI7IHZhciBiaXRzOiBJbnRlZ2VyKTogSW50ZWdlcjsKLWZ1bmN0aW9uIGRlZmxhdGVQcmltZSh2YXIgc3RybTogel9zdHJlYW07IGJpdHMsIHZhbHVlOiBJbnRlZ2VyKTogSW50ZWdlcjsKLWZ1bmN0aW9uIGRlZmxhdGVTZXRIZWFkZXIodmFyIHN0cm06IHpfc3RyZWFtOyBoZWFkOiBnel9oZWFkZXIpOiBJbnRlZ2VyOwotZnVuY3Rpb24gaW5mbGF0ZUluaXQyKHZhciBzdHJtOiB6X3N0cmVhbTsgd2luZG93Qml0czogSW50ZWdlcik6IEludGVnZXI7Ci1mdW5jdGlvbiBpbmZsYXRlU2V0RGljdGlvbmFyeSh2YXIgc3RybTogel9zdHJlYW07IGNvbnN0IGRpY3Rpb25hcnk6IFBDaGFyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdExlbmd0aDogSW50ZWdlcik6IEludGVnZXI7Ci1mdW5jdGlvbiBpbmZsYXRlU3luYyh2YXIgc3RybTogel9zdHJlYW0pOiBJbnRlZ2VyOwotZnVuY3Rpb24gaW5mbGF0ZUNvcHkodmFyIGRlc3QsIHNvdXJjZTogel9zdHJlYW0pOiBJbnRlZ2VyOwotZnVuY3Rpb24gaW5mbGF0ZVJlc2V0KHZhciBzdHJtOiB6X3N0cmVhbSk6IEludGVnZXI7Ci1mdW5jdGlvbiBpbmZsYXRlUmVzZXQyKHZhciBzdHJtOiB6X3N0cmVhbTsgd2luZG93Qml0czogSW50ZWdlcik6IEludGVnZXI7Ci1mdW5jdGlvbiBpbmZsYXRlUHJpbWUodmFyIHN0cm06IHpfc3RyZWFtOyBiaXRzLCB2YWx1ZTogSW50ZWdlcik6IEludGVnZXI7Ci1mdW5jdGlvbiBpbmZsYXRlTWFyayh2YXIgc3RybTogel9zdHJlYW0pOiBMb25nSW50OwotZnVuY3Rpb24gaW5mbGF0ZUdldEhlYWRlcih2YXIgc3RybTogel9zdHJlYW07IHZhciBoZWFkOiBnel9oZWFkZXIpOiBJbnRlZ2VyOwotZnVuY3Rpb24gaW5mbGF0ZUJhY2tJbml0KHZhciBzdHJtOiB6X3N0cmVhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dCaXRzOiBJbnRlZ2VyOyB3aW5kb3c6IFBDaGFyKTogSW50ZWdlcjsKLWZ1bmN0aW9uIGluZmxhdGVCYWNrKHZhciBzdHJtOiB6X3N0cmVhbTsgaW5fZm46IGluX2Z1bmM7IGluX2Rlc2M6IFBvaW50ZXI7Ci0gICAgICAgICAgICAgICAgICAgICBvdXRfZm46IG91dF9mdW5jOyBvdXRfZGVzYzogUG9pbnRlcik6IEludGVnZXI7Ci1mdW5jdGlvbiBpbmZsYXRlQmFja0VuZCh2YXIgc3RybTogel9zdHJlYW0pOiBJbnRlZ2VyOwotZnVuY3Rpb24gemxpYkNvbXBpbGVGbGFnczogTG9uZ0ludDsKLQotKCogdXRpbGl0eSBmdW5jdGlvbnMgKikKLWZ1bmN0aW9uIGNvbXByZXNzKGRlc3Q6IFBDaGFyOyB2YXIgZGVzdExlbjogTG9uZ0ludDsKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZTogUENoYXI7IHNvdXJjZUxlbjogTG9uZ0ludCk6IEludGVnZXI7Ci1mdW5jdGlvbiBjb21wcmVzczIoZGVzdDogUENoYXI7IHZhciBkZXN0TGVuOiBMb25nSW50OwotICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlOiBQQ2hhcjsgc291cmNlTGVuOiBMb25nSW50OwotICAgICAgICAgICAgICAgICAgbGV2ZWw6IEludGVnZXIpOiBJbnRlZ2VyOwotZnVuY3Rpb24gY29tcHJlc3NCb3VuZChzb3VyY2VMZW46IExvbmdJbnQpOiBMb25nSW50OwotZnVuY3Rpb24gdW5jb21wcmVzcyhkZXN0OiBQQ2hhcjsgdmFyIGRlc3RMZW46IExvbmdJbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZTogUENoYXI7IHNvdXJjZUxlbjogTG9uZ0ludCk6IEludGVnZXI7Ci0KLSgqIGNoZWNrc3VtIGZ1bmN0aW9ucyAqKQotZnVuY3Rpb24gYWRsZXIzMihhZGxlcjogTG9uZ0ludDsgY29uc3QgYnVmOiBQQ2hhcjsgbGVuOiBJbnRlZ2VyKTogTG9uZ0ludDsKLWZ1bmN0aW9uIGFkbGVyMzJfY29tYmluZShhZGxlcjEsIGFkbGVyMiwgbGVuMjogTG9uZ0ludCk6IExvbmdJbnQ7Ci1mdW5jdGlvbiBjcmMzMihjcmM6IExvbmdJbnQ7IGNvbnN0IGJ1ZjogUENoYXI7IGxlbjogSW50ZWdlcik6IExvbmdJbnQ7Ci1mdW5jdGlvbiBjcmMzMl9jb21iaW5lKGNyYzEsIGNyYzIsIGxlbjI6IExvbmdJbnQpOiBMb25nSW50OwotCi0oKiB2YXJpb3VzIGhhY2tzLCBkb24ndCBsb29rIDopICopCi1mdW5jdGlvbiBkZWZsYXRlSW5pdF8odmFyIHN0cm06IHpfc3RyZWFtOyBsZXZlbDogSW50ZWdlcjsKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uOiBQQ2hhcjsgc3RyZWFtX3NpemU6IEludGVnZXIpOiBJbnRlZ2VyOwotZnVuY3Rpb24gaW5mbGF0ZUluaXRfKHZhciBzdHJtOiB6X3N0cmVhbTsgY29uc3QgdmVyc2lvbjogUENoYXI7Ci0gICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3NpemU6IEludGVnZXIpOiBJbnRlZ2VyOwotZnVuY3Rpb24gZGVmbGF0ZUluaXQyXyh2YXIgc3RybTogel9zdHJlYW07Ci0gICAgICAgICAgICAgICAgICAgICAgIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneTogSW50ZWdlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbjogUENoYXI7IHN0cmVhbV9zaXplOiBJbnRlZ2VyKTogSW50ZWdlcjsKLWZ1bmN0aW9uIGluZmxhdGVJbml0Ml8odmFyIHN0cm06IHpfc3RyZWFtOyB3aW5kb3dCaXRzOiBJbnRlZ2VyOwotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uOiBQQ2hhcjsgc3RyZWFtX3NpemU6IEludGVnZXIpOiBJbnRlZ2VyOwotZnVuY3Rpb24gaW5mbGF0ZUJhY2tJbml0Xyh2YXIgc3RybTogel9zdHJlYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd0JpdHM6IEludGVnZXI7IHdpbmRvdzogUENoYXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb246IFBDaGFyOyBzdHJlYW1fc2l6ZTogSW50ZWdlcik6IEludGVnZXI7Ci0KLQotaW1wbGVtZW50YXRpb24KLQoteyRMIGFkbGVyMzIub2JqfQoteyRMIGNvbXByZXNzLm9ian0KLXskTCBjcmMzMi5vYmp9Ci17JEwgZGVmbGF0ZS5vYmp9Ci17JEwgaW5mYmFjay5vYmp9Ci17JEwgaW5mZmFzdC5vYmp9Ci17JEwgaW5mbGF0ZS5vYmp9Ci17JEwgaW5mdHJlZXMub2JqfQoteyRMIHRyZWVzLm9ian0KLXskTCB1bmNvbXByLm9ian0KLXskTCB6dXRpbC5vYmp9Ci0KLWZ1bmN0aW9uIGFkbGVyMzI7IGV4dGVybmFsOwotZnVuY3Rpb24gYWRsZXIzMl9jb21iaW5lOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGNvbXByZXNzOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGNvbXByZXNzMjsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBjb21wcmVzc0JvdW5kOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGNyYzMyOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGNyYzMyX2NvbWJpbmU7IGV4dGVybmFsOwotZnVuY3Rpb24gZGVmbGF0ZTsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBkZWZsYXRlQm91bmQ7IGV4dGVybmFsOwotZnVuY3Rpb24gZGVmbGF0ZUNvcHk7IGV4dGVybmFsOwotZnVuY3Rpb24gZGVmbGF0ZUVuZDsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBkZWZsYXRlSW5pdF87IGV4dGVybmFsOwotZnVuY3Rpb24gZGVmbGF0ZUluaXQyXzsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBkZWZsYXRlUGFyYW1zOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGRlZmxhdGVQZW5kaW5nOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGRlZmxhdGVQcmltZTsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBkZWZsYXRlUmVzZXQ7IGV4dGVybmFsOwotZnVuY3Rpb24gZGVmbGF0ZVNldERpY3Rpb25hcnk7IGV4dGVybmFsOwotZnVuY3Rpb24gZGVmbGF0ZVNldEhlYWRlcjsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBkZWZsYXRlVHVuZTsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBpbmZsYXRlOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGluZmxhdGVCYWNrOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGluZmxhdGVCYWNrRW5kOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGluZmxhdGVCYWNrSW5pdF87IGV4dGVybmFsOwotZnVuY3Rpb24gaW5mbGF0ZUNvcHk7IGV4dGVybmFsOwotZnVuY3Rpb24gaW5mbGF0ZUVuZDsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBpbmZsYXRlR2V0SGVhZGVyOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGluZmxhdGVJbml0XzsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBpbmZsYXRlSW5pdDJfOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGluZmxhdGVNYXJrOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGluZmxhdGVQcmltZTsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBpbmZsYXRlUmVzZXQ7IGV4dGVybmFsOwotZnVuY3Rpb24gaW5mbGF0ZVJlc2V0MjsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBpbmZsYXRlU2V0RGljdGlvbmFyeTsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBpbmZsYXRlU3luYzsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiB1bmNvbXByZXNzOyBleHRlcm5hbDsKLWZ1bmN0aW9uIHpsaWJDb21waWxlRmxhZ3M7IGV4dGVybmFsOwotZnVuY3Rpb24gemxpYlZlcnNpb247IGV4dGVybmFsOwotCi1mdW5jdGlvbiBkZWZsYXRlSW5pdCh2YXIgc3RybTogel9zdHJlYW07IGxldmVsOiBJbnRlZ2VyKTogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBkZWZsYXRlSW5pdF8oc3RybSwgbGV2ZWwsIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSk7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIGRlZmxhdGVJbml0Mih2YXIgc3RybTogel9zdHJlYW07IGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLAotICAgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5OiBJbnRlZ2VyKTogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBkZWZsYXRlSW5pdDJfKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKTsKLWVuZDsKLQotZnVuY3Rpb24gaW5mbGF0ZUluaXQodmFyIHN0cm06IHpfc3RyZWFtKTogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBpbmZsYXRlSW5pdF8oc3RybSwgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKTsKLWVuZDsKLQotZnVuY3Rpb24gaW5mbGF0ZUluaXQyKHZhciBzdHJtOiB6X3N0cmVhbTsgd2luZG93Qml0czogSW50ZWdlcik6IEludGVnZXI7Ci1iZWdpbgotICBSZXN1bHQgOj0gaW5mbGF0ZUluaXQyXyhzdHJtLCB3aW5kb3dCaXRzLCBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpOwotZW5kOwotCi1mdW5jdGlvbiBpbmZsYXRlQmFja0luaXQodmFyIHN0cm06IHpfc3RyZWFtOwotICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd0JpdHM6IEludGVnZXI7IHdpbmRvdzogUENoYXIpOiBJbnRlZ2VyOwotYmVnaW4KLSAgUmVzdWx0IDo9IGluZmxhdGVCYWNrSW5pdF8oc3RybSwgd2luZG93Qml0cywgd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpOwotZW5kOwotCi1mdW5jdGlvbiBfbWFsbG9jKFNpemU6IEludGVnZXIpOiBQb2ludGVyOyBjZGVjbDsKLWJlZ2luCi0gIEdldE1lbShSZXN1bHQsIFNpemUpOwotZW5kOwotCi1wcm9jZWR1cmUgX2ZyZWUoQmxvY2s6IFBvaW50ZXIpOyBjZGVjbDsKLWJlZ2luCi0gIEZyZWVNZW0oQmxvY2spOwotZW5kOwotCi1wcm9jZWR1cmUgX21lbXNldChQOiBQb2ludGVyOyBCOiBCeXRlOyBjb3VudDogSW50ZWdlcik7IGNkZWNsOwotYmVnaW4KLSAgRmlsbENoYXIoUF4sIGNvdW50LCBCKTsKLWVuZDsKLQotcHJvY2VkdXJlIF9tZW1jcHkoZGVzdCwgc291cmNlOiBQb2ludGVyOyBjb3VudDogSW50ZWdlcik7IGNkZWNsOwotYmVnaW4KLSAgTW92ZShzb3VyY2VeLCBkZXN0XiwgY291bnQpOwotZW5kOwotCi1lbmQuCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL3B1ZmYvTWFrZWZpbGUgYi9zcmMvemxpYi9jb250cmliL3B1ZmYvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMjU5NGMuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9wdWZmL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotQ0ZMQUdTPS1PCi0KLXB1ZmY6IHB1ZmYubyBwdWZmdGVzdC5vCi0KLXB1ZmYubzogcHVmZi5oCi0KLXB1ZmZ0ZXN0Lm86IHB1ZmYuaAotCi10ZXN0OiBwdWZmCi0JcHVmZiB6ZXJvcy5yYXcKLQotcHVmdDogcHVmZi5jIHB1ZmYuaCBwdWZmdGVzdC5vCi0JY2MgLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlIC1vIHB1ZnQgcHVmZi5jIHB1ZmZ0ZXN0Lm8KLQotIyBwdWZmIGZ1bGwgY292ZXJhZ2UgdGVzdCAoc2hvdWxkIHNheSAxMDAlKQotY292OiBwdWZ0Ci0JQHJtIC1mICouZ2NvdiAqLmdjZGEKLQlAcHVmdCAtdyB6ZXJvcy5yYXcgMj4mMSB8IGNhdCA+IC9kZXYvbnVsbAotCUBlY2hvICcwNCcgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMgotCUBlY2hvICcwMCcgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMgotCUBlY2hvICcwMCAwMCAwMCAwMCAwMCcgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMjU0Ci0JQGVjaG8gJzAwIDAxIDAwIGZlIGZmJyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyCi0JQGVjaG8gJzAxIDAxIDAwIGZlIGZmIDBhJyB8IHh4ZCAtciAtcCB8IHB1ZnQgLWYgMj4mMSB8IGNhdCA+IC9kZXYvbnVsbAotCUBlY2hvICcwMiA3ZSBmZiBmZicgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMjQ2Ci0JQGVjaG8gJzAyJyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyCi0JQGVjaG8gJzA0IDgwIDQ5IDkyIDI0IDQ5IDkyIDI0IDBmIGI0IGZmIGZmIGMzIDA0JyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyCi0JQGVjaG8gJzA0IDgwIDQ5IDkyIDI0IDQ5IDkyIDI0IDcxIGZmIGZmIDkzIDExIDAwJyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyNDkKLQlAZWNobyAnMDQgYzAgODEgMDggMDAgMDAgMDAgMDAgMjAgN2YgZWIgMGIgMDAgMDAnIHwgeHhkIC1yIC1wIHwgcHVmdCAyPiAvZGV2L251bGwgfHwgdGVzdCAkJD8gLWVxIDI0NgotCUBlY2hvICcwYiAwMCAwMCcgfCB4eGQgLXIgLXAgfCBwdWZ0IC1mIDI+JjEgfCBjYXQgPiAvZGV2L251bGwKLQlAZWNobyAnMWEgMDcnIHwgeHhkIC1yIC1wIHwgcHVmdCAyPiAvZGV2L251bGwgfHwgdGVzdCAkJD8gLWVxIDI0NgotCUBlY2hvICcwYyBjMCA4MSAwMCAwMCAwMCAwMCAwMCA5MCBmZiA2YiAwNCcgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMjQ1Ci0JQHB1ZnQgLWYgemVyb3MucmF3IDI+JjEgfCBjYXQgPiAvZGV2L251bGwKLQlAZWNobyAnZmMgMDAgMDAnIHwgeHhkIC1yIC1wIHwgcHVmdCAyPiAvZGV2L251bGwgfHwgdGVzdCAkJD8gLWVxIDI1MwotCUBlY2hvICcwNCAwMCBmZSBmZicgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMjUyCi0JQGVjaG8gJzA0IDAwIDI0IDQ5JyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyNTEKLQlAZWNobyAnMDQgODAgNDkgOTIgMjQgNDkgOTIgMjQgMGYgYjQgZmYgZmYgYzMgODQnIHwgeHhkIC1yIC1wIHwgcHVmdCAyPiAvZGV2L251bGwgfHwgdGVzdCAkJD8gLWVxIDI0OAotCUBlY2hvICcwNCAwMCAyNCBlOSBmZiBmZicgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMjUwCi0JQGVjaG8gJzA0IDAwIDI0IGU5IGZmIDZkJyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyNDcKLQlAZ2NvdiAtbiBwdWZmLmMKLQotY2xlYW46Ci0Jcm0gLWYgcHVmZiBwdWZ0ICoubyAqLmdjKgpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9wdWZmL1JFQURNRSBiL3NyYy96bGliL2NvbnRyaWIvcHVmZi9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYzRjYjUuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi9wdWZmL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLVB1ZmYgLS0gQSBTaW1wbGUgSW5mbGF0ZQotMyBNYXIgMjAwMwotTWFyayBBZGxlcgotbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQotCi1XaGF0IHRoaXMgaXMgLS0KLQotcHVmZi5jIHByb3ZpZGVzIHRoZSByb3V0aW5lIHB1ZmYoKSB0byBkZWNvbXByZXNzIHRoZSBkZWZsYXRlIGRhdGEgZm9ybWF0LiAgSXQKLWRvZXMgc28gbW9yZSBzbG93bHkgdGhhbiB6bGliLCBidXQgdGhlIGNvZGUgaXMgYWJvdXQgb25lLWZpZnRoIHRoZSBzaXplIG9mIHRoZQotaW5mbGF0ZSBjb2RlIGluIHpsaWIsIGFuZCB3cml0dGVuIHRvIGJlIHZlcnkgZWFzeSB0byByZWFkLgotCi1XaHkgSSB3cm90ZSB0aGlzIC0tCi0KLXB1ZmYuYyB3YXMgd3JpdHRlbiB0byBkb2N1bWVudCB0aGUgZGVmbGF0ZSBmb3JtYXQgdW5hbWJpZ3VvdXNseSwgYnkgdmlydHVlIG9mCi1iZWluZyB3b3JraW5nIEMgY29kZS4gIEl0IGlzIG1lYW50IHRvIHN1cHBsZW1lbnQgUkZDIDE5NTEsIHdoaWNoIGZvcm1hbGx5Ci1kZXNjcmliZXMgdGhlIGRlZmxhdGUgZm9ybWF0LiAgSSBoYXZlIHJlY2VpdmVkIG1hbnkgcXVlc3Rpb25zIG9uIGRldGFpbHMgb2YgdGhlCi1kZWZsYXRlIGZvcm1hdCwgYW5kIEkgaG9wZSB0aGF0IHJlYWRpbmcgdGhpcyBjb2RlIHdpbGwgYW5zd2VyIHRob3NlIHF1ZXN0aW9ucy4KLXB1ZmYuYyBpcyBoZWF2aWx5IGNvbW1lbnRlZCB3aXRoIGRldGFpbHMgb2YgdGhlIGRlZmxhdGUgZm9ybWF0LCBlc3BlY2lhbGx5Ci10aG9zZSBsaXR0bGUgbm9va3MgYW5kIGNyYW5pZXMgb2YgdGhlIGZvcm1hdCB0aGF0IG1pZ2h0IG5vdCBiZSBvYnZpb3VzIGZyb20gYQotc3BlY2lmaWNhdGlvbi4KLQotcHVmZi5jIG1heSBhbHNvIGJlIHVzZWZ1bCBpbiBhcHBsaWNhdGlvbnMgd2hlcmUgY29kZSBzaXplIG9yIG1lbW9yeSB1c2FnZSBpcyBhCi12ZXJ5IGxpbWl0ZWQgcmVzb3VyY2UsIGFuZCBzcGVlZCBpcyBub3QgYXMgaW1wb3J0YW50LgotCi1Ib3cgdG8gdXNlIGl0IC0tCi0KLVdlbGwsIG1vc3QgbGlrZWx5IHlvdSBzaG91bGQganVzdCBiZSByZWFkaW5nIHB1ZmYuYyBhbmQgdXNpbmcgemxpYiBmb3IgYWN0dWFsCi1hcHBsaWNhdGlvbnMsIGJ1dCBpZiB5b3UgbXVzdCAuLi4KLQotSW5jbHVkZSBwdWZmLmggaW4geW91ciBjb2RlLCB3aGljaCBwcm92aWRlcyB0aGlzIHByb3RvdHlwZToKLQotaW50IHB1ZmYodW5zaWduZWQgY2hhciAqZGVzdCwgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcG9pbnRlciAqLwotICAgICAgICAgdW5zaWduZWQgbG9uZyAqZGVzdGxlbiwgICAgICAgIC8qIGFtb3VudCBvZiBvdXRwdXQgc3BhY2UgKi8KLSAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgICAgICAgICAvKiBwb2ludGVyIHRvIHNvdXJjZSBkYXRhIHBvaW50ZXIgKi8KLSAgICAgICAgIHVuc2lnbmVkIGxvbmcgKnNvdXJjZWxlbik7ICAgICAvKiBhbW91bnQgb2YgaW5wdXQgYXZhaWxhYmxlICovCi0KLVRoZW4geW91IGNhbiBjYWxsIHB1ZmYoKSB0byBkZWNvbXByZXNzIGEgZGVmbGF0ZSBzdHJlYW0gdGhhdCBpcyBpbiBtZW1vcnkgaW4KLWl0cyBlbnRpcmV0eSBhdCBzb3VyY2UsIHRvIGEgc3VmZmljaWVudGx5IHNpemVkIGJsb2NrIG9mIG1lbW9yeSBmb3IgdGhlCi1kZWNvbXByZXNzZWQgZGF0YSBhdCBkZXN0LiAgcHVmZigpIGlzIHRoZSBvbmx5IGV4dGVybmFsIHN5bWJvbCBpbiBwdWZmLmMgIFRoZQotb25seSBDIGxpYnJhcnkgZnVuY3Rpb25zIHRoYXQgcHVmZi5jIG5lZWRzIGFyZSBzZXRqbXAoKSBhbmQgbG9uZ2ptcCgpLCB3aGljaAotYXJlIHVzZWQgdG8gc2ltcGxpZnkgZXJyb3IgY2hlY2tpbmcgaW4gdGhlIGNvZGUgdG8gaW1wcm92ZSByZWFkYWJpbHR5LiAgcHVmZi5jCi1kb2VzIG5vIG1lbW9yeSBhbGxvY2F0aW9uLCBhbmQgdXNlcyBsZXNzIHRoYW4gMksgYnl0ZXMgb2ZmIG9mIHRoZSBzdGFjay4KLQotSWYgZGVzdGxlbiBpcyBub3QgZW5vdWdoIHNwYWNlIGZvciB0aGUgdW5jb21wcmVzc2VkIGRhdGEsIHRoZW4gaW5mbGF0ZSB3aWxsCi1yZXR1cm4gYW4gZXJyb3Igd2l0aG91dCB3cml0aW5nIG1vcmUgdGhhbiBkZXN0bGVuIGJ5dGVzLiAgTm90ZSB0aGF0IHRoaXMgbWVhbnMKLXRoYXQgaW4gb3JkZXIgdG8gZGVjb21wcmVzcyB0aGUgZGVmbGF0ZSBkYXRhIHN1Y2Nlc3NmdWxseSwgeW91IG5lZWQgdG8ga25vdwotdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFoZWFkIG9mIHRpbWUuCi0KLUlmIG5lZWRlZCwgcHVmZigpIGNhbiBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIHdpdGggbm8KLW91dHB1dCBzcGFjZS4gIFRoaXMgaXMgZG9uZSBieSBwYXNzaW5nIGRlc3QgZXF1YWwgdG8gKHVuc2lnbmVkIGNoYXIgKikwLiAgVGhlbgotdGhlIGluaXRpYWwgdmFsdWUgb2YgKmRlc3RsZW4gaXMgaWdub3JlZCBhbmQgKmRlc3RsZW4gaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YKLXRoZSB1bmNvbXByZXNzZWQgZGF0YS4gIFNvIGlmIHRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBpcyBub3Qga25vd24sCi10aGVuIHR3byBwYXNzZXMgb2YgcHVmZigpIGNhbiBiZSB1c2VkLS1maXJzdCB0byBkZXRlcm1pbmUgdGhlIHNpemUsIGFuZCBzZWNvbmQKLXRvIGRvIHRoZSBhY3R1YWwgaW5mbGF0aW9uIGFmdGVyIGFsbG9jYXRpbmcgdGhlIGFwcHJvcHJpYXRlIG1lbW9yeS4gIE5vdAotcHJldHR5LCBidXQgaXQgd29ya3MuICAoVGhpcyBpcyBvbmUgb2YgdGhlIHJlYXNvbnMgeW91IHNob3VsZCBiZSB1c2luZyB6bGliLikKLQotVGhlIGRlZmxhdGUgZm9ybWF0IGlzIHNlbGYtdGVybWluYXRpbmcuICBJZiB0aGUgZGVmbGF0ZSBzdHJlYW0gZG9lcyBub3QgZW5kCi1pbiAqc291cmNlbGVuIGJ5dGVzLCBwdWZmKCkgd2lsbCByZXR1cm4gYW4gZXJyb3Igd2l0aG91dCByZWFkaW5nIGF0IG9yIHBhc3QKLWVuZHNvdXJjZS4KLQotT24gcmV0dXJuLCAqc291cmNlbGVuIGlzIHVwZGF0ZWQgdG8gdGhlIGFtb3VudCBvZiBpbnB1dCBkYXRhIGNvbnN1bWVkLCBhbmQKLSpkZXN0bGVuIGlzIHVwZGF0ZWQgdG8gdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhLiAgU2VlIHRoZSBjb21tZW50cwotaW4gcHVmZi5jIGZvciB0aGUgcG9zc2libGUgcmV0dXJuIGNvZGVzIGZvciBwdWZmKCkuCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL3B1ZmYvcHVmZi5jIGIvc3JjL3psaWIvY29udHJpYi9wdWZmL3B1ZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4NDcwYy4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL3B1ZmYvcHVmZi5jCisrKyAvZGV2L251bGwKQEAgLTEsODM3ICswLDAgQEAKLS8qCi0gKiBwdWZmLmMKLSAqIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwdWZmLmgKLSAqIHZlcnNpb24gMi4yLCAyNSBBcHIgMjAxMAotICoKLSAqIHB1ZmYuYyBpcyBhIHNpbXBsZSBpbmZsYXRlIHdyaXR0ZW4gdG8gYmUgYW4gdW5hbWJpZ3VvdXMgd2F5IHRvIHNwZWNpZnkgdGhlCi0gKiBkZWZsYXRlIGZvcm1hdC4gIEl0IGlzIG5vdCB3cml0dGVuIGZvciBzcGVlZCBidXQgcmF0aGVyIHNpbXBsaWNpdHkuICBBcyBhCi0gKiBzaWRlIGJlbmVmaXQsIHRoaXMgY29kZSBtaWdodCBhY3R1YWxseSBiZSB1c2VmdWwgd2hlbiBzbWFsbCBjb2RlIGlzIG1vcmUKLSAqIGltcG9ydGFudCB0aGFuIHNwZWVkLCBzdWNoIGFzIGJvb3RzdHJhcCBhcHBsaWNhdGlvbnMuICBGb3IgdHlwaWNhbCBkZWZsYXRlCi0gKiBkYXRhLCB6bGliJ3MgaW5mbGF0ZSgpIGlzIGFib3V0IGZvdXIgdGltZXMgYXMgZmFzdCBhcyBwdWZmKCkuICB6bGliJ3MKLSAqIGluZmxhdGUgY29tcGlsZXMgdG8gYXJvdW5kIDIwSyBvbiBteSBtYWNoaW5lLCB3aGVyZWFzIHB1ZmYuYyBjb21waWxlcyB0bwotICogYXJvdW5kIDRLIG9uIG15IG1hY2hpbmUgKGEgUG93ZXJQQyB1c2luZyBHTlUgY2MpLiAgSWYgdGhlIGZhc3RlciBkZWNvZGUoKQotICogZnVuY3Rpb24gaGVyZSBpcyB1c2VkLCB0aGVuIHB1ZmYoKSBpcyBvbmx5IHR3aWNlIGFzIHNsb3cgYXMgemxpYidzCi0gKiBpbmZsYXRlKCkuCi0gKgotICogQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBtZW1vcnkgY29tZXMgZnJvbSB0aGUgc3RhY2suICBUaGUgc3RhY2sgcmVxdWlyZWQKLSAqIGlzIGxlc3MgdGhhbiAySyBieXRlcy4gIFRoaXMgY29kZSBpcyBjb21wYXRpYmxlIHdpdGggMTYtYml0IGludCdzIGFuZAotICogYXNzdW1lcyB0aGF0IGxvbmcncyBhcmUgYXQgbGVhc3QgMzIgYml0cy4gIHB1ZmYuYyB1c2VzIHRoZSBzaG9ydCBkYXRhIHR5cGUsCi0gKiBhc3N1bWVkIHRvIGJlIDE2IGJpdHMsIGZvciBhcnJheXMgaW4gb3JkZXIgdG8gdG8gY29uc2VydmUgbWVtb3J5LiAgVGhlIGNvZGUKLSAqIHdvcmtzIHdoZXRoZXIgaW50ZWdlcnMgYXJlIHN0b3JlZCBiaWcgZW5kaWFuIG9yIGxpdHRsZSBlbmRpYW4uCi0gKgotICogSW4gdGhlIGNvbW1lbnRzIGJlbG93IGFyZSAiRm9ybWF0IG5vdGVzIiB0aGF0IGRlc2NyaWJlIHRoZSBpbmZsYXRlIHByb2Nlc3MKLSAqIGFuZCBkb2N1bWVudCBzb21lIG9mIHRoZSBsZXNzIG9idmlvdXMgYXNwZWN0cyBvZiB0aGUgZm9ybWF0LiAgVGhpcyBzb3VyY2UKLSAqIGNvZGUgaXMgbWVhbnQgdG8gc3VwcGxlbWVudCBSRkMgMTk1MSwgd2hpY2ggZm9ybWFsbHkgZGVzY3JpYmVzIHRoZSBkZWZsYXRlCi0gKiBmb3JtYXQ6Ci0gKgotICogICAgaHR0cDovL3d3dy56bGliLm9yZy9yZmMtZGVmbGF0ZS5odG1sCi0gKi8KLQotLyoKLSAqIENoYW5nZSBoaXN0b3J5OgotICoKLSAqIDEuMCAgMTAgRmViIDIwMDIgICAgIC0gRmlyc3QgdmVyc2lvbgotICogMS4xICAxNyBGZWIgMjAwMiAgICAgLSBDbGFyaWZpY2F0aW9ucyBvZiBzb21lIGNvbW1lbnRzIGFuZCBub3RlcwotICogICAgICAgICAgICAgICAgICAgICAgLSBVcGRhdGUgcHVmZigpIGRlc3QgYW5kIHNvdXJjZSBwb2ludGVycyBvbiBuZWdhdGl2ZQotICogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMgdG8gZmFjaWxpdGF0ZSBkZWJ1Z2dpbmcgZGVmbGF0b3JzCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIFJlbW92ZSBsb25nZXN0IGZyb20gc3RydWN0IGh1ZmZtYW4gLS0gbm90IG5lZWRlZAotICogICAgICAgICAgICAgICAgICAgICAgLSBTaW1wbGlmeSBvZmZzW10gaW5kZXggaW4gY29uc3RydWN0KCkKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gQWRkIGlucHV0IHNpemUgYW5kIGNoZWNraW5nLCB1c2luZyBsb25nam1wKCkgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnRhaW4gZWFzeSByZWFkYWJpbGl0eQotICogICAgICAgICAgICAgICAgICAgICAgLSBVc2Ugc2hvcnQgZGF0YSB0eXBlIGZvciBsYXJnZSBhcnJheXMKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gVXNlIHBvaW50ZXJzIGluc3RlYWQgb2YgbG9uZyB0byBzcGVjaWZ5IHNvdXJjZSBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gc2l6ZXMgdG8gYXZvaWQgYXJiaXRyYXJ5IDQgR0IgbGltaXRzCi0gKiAxLjIgIDE3IE1hciAyMDAyICAgICAtIEFkZCBmYXN0ZXIgdmVyc2lvbiBvZiBkZWNvZGUoKSwgZG91YmxlcyBzcGVlZCAoISksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBsZWF2ZSBzaW1wbGUgdmVyc2lvbiBmb3IgcmVhZGFiaWx0eQotICogICAgICAgICAgICAgICAgICAgICAgLSBNYWtlIHN1cmUgaW52YWxpZCBkaXN0YW5jZXMgZGV0ZWN0ZWQgaWYgcG9pbnRlcnMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJlIDE2IGJpdHMKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gRml4IGZpeGVkIGNvZGVzIHRhYmxlIGVycm9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIFByb3ZpZGUgYSBzY2FubmluZyBtb2RlIGZvciBkZXRlcm1pbmluZyBzaXplIG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZCBkYXRhCi0gKiAxLjMgIDIwIE1hciAyMDAyICAgICAtIEdvIGJhY2sgdG8gbGVuZ3RocyBmb3IgcHVmZigpIHBhcmFtZXRlcnMgW0dhaWxseV0KLSAqICAgICAgICAgICAgICAgICAgICAgIC0gQWRkIGEgcHVmZi5oIGZpbGUgZm9yIHRoZSBpbnRlcmZhY2UKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gQWRkIGJyYWNlcyBpbiBwdWZmKCkgZm9yIGVsc2UgZG8gW0dhaWxseV0KLSAqICAgICAgICAgICAgICAgICAgICAgIC0gVXNlIGluZGV4ZXMgaW5zdGVhZCBvZiBwb2ludGVycyBmb3IgcmVhZGFiaWxpdHkKLSAqIDEuNCAgMzEgTWFyIDIwMDIgICAgIC0gU2ltcGxpZnkgY29uc3RydWN0KCkgY29kZSBzZXQgY2hlY2sKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gRml4IHNvbWUgY29tbWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gQWRkIEZJWExDT0RFUyAjZGVmaW5lCi0gKiAxLjUgICA2IEFwciAyMDAyICAgICAtIE1pbm9yIGNvbW1lbnQgZml4ZXMKLSAqIDEuNiAgIDcgQXVnIDIwMDIgICAgIC0gTWlub3IgZm9ybWF0IGNoYW5nZXMKLSAqIDEuNyAgIDMgTWFyIDIwMDMgICAgIC0gQWRkZWQgdGVzdCBjb2RlIGZvciBkaXN0cmlidXRpb24KLSAqICAgICAgICAgICAgICAgICAgICAgIC0gQWRkZWQgemxpYi1saWtlIGxpY2Vuc2UKLSAqIDEuOCAgIDkgSmFuIDIwMDQgICAgIC0gQWRkZWQgc29tZSBjb21tZW50cyBvbiBubyBkaXN0YW5jZSBjb2RlcyBjYXNlCi0gKiAxLjkgIDIxIEZlYiAyMDA4ICAgICAtIEZpeCBidWcgb24gMTYtYml0IGludGVnZXIgYXJjaGl0ZWN0dXJlcyBbUG9obGFuZF0KLSAqICAgICAgICAgICAgICAgICAgICAgIC0gQ2F0Y2ggbWlzc2luZyBlbmQtb2YtYmxvY2sgc3ltYm9sIGVycm9yCi0gKiAyLjAgIDI1IEp1bCAyMDA4ICAgICAtIEFkZCAjZGVmaW5lIHRvIHBlcm1pdCBkaXN0YW5jZSB0b28gZmFyIGJhY2sKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gQWRkIG9wdGlvbiBpbiBURVNUIGNvZGUgZm9yIHB1ZmYgdG8gd3JpdGUgdGhlIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gQWRkIG9wdGlvbiBpbiBURVNUIGNvZGUgdG8gc2tpcCBpbnB1dCBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgLSBBbGxvdyBURVNUIGNvZGUgdG8gcmVhZCBmcm9tIHBpcGVkIHN0ZGluCi0gKiAyLjEgICA0IEFwciAyMDEwICAgICAtIEF2b2lkIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIGZvciBoYXBwaWVyIGNvbXBpbGVycwotICogICAgICAgICAgICAgICAgICAgICAgLSBBdm9pZCB1bnNpZ25lZCBjb21wYXJpc29ucyBmb3IgZXZlbiBoYXBwaWVyIGNvbXBpbGVycwotICogMi4yICAyNSBBcHIgMjAxMCAgICAgLSBGaXggYnVnIGluIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucyBbT2Jlcmh1bWVyXQotICogICAgICAgICAgICAgICAgICAgICAgLSBBZGQgY29uc3Qgd2hlcmUgYXBwcm9wcmlhdGUgW09iZXJodW1lcl0KLSAqICAgICAgICAgICAgICAgICAgICAgIC0gU3BsaXQgaWYncyBhbmQgPydzIGZvciBjb3ZlcmFnZSB0ZXN0aW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIEJyZWFrIG91dCB0ZXN0IGNvZGUgdG8gc2VwYXJhdGUgZmlsZQotICogICAgICAgICAgICAgICAgICAgICAgLSBNb3ZlIE5JTCB0byBwdWZmLmgKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gQWxsb3cgaW5jb21wbGV0ZSBjb2RlIG9ubHkgaWYgc2luZ2xlIGNvZGUgbGVuZ3RoIGlzIDEKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gQWRkIGZ1bGwgY29kZSBjb3ZlcmFnZSB0ZXN0IHRvIE1ha2VmaWxlCi0gKi8KLQotI2luY2x1ZGUgPHNldGptcC5oPiAgICAgICAgICAgICAvKiBmb3Igc2V0am1wKCksIGxvbmdqbXAoKSwgYW5kIGptcF9idWYgKi8KLSNpbmNsdWRlICJwdWZmLmgiICAgICAgICAgICAgICAgLyogcHJvdG90eXBlIGZvciBwdWZmKCkgKi8KLQotI2RlZmluZSBsb2NhbCBzdGF0aWMgICAgICAgICAgICAvKiBmb3IgbG9jYWwgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKi8KLQotLyoKLSAqIE1heGltdW1zIGZvciBhbGxvY2F0aW9ucyBhbmQgbG9vcHMuICBJdCBpcyBub3QgdXNlZnVsIHRvIGNoYW5nZSB0aGVzZSAtLQotICogdGhleSBhcmUgZml4ZWQgYnkgdGhlIGRlZmxhdGUgZm9ybWF0LgotICovCi0jZGVmaW5lIE1BWEJJVFMgMTUgICAgICAgICAgICAgIC8qIG1heGltdW0gYml0cyBpbiBhIGNvZGUgKi8KLSNkZWZpbmUgTUFYTENPREVTIDI4NiAgICAgICAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgbGl0ZXJhbC9sZW5ndGggY29kZXMgKi8KLSNkZWZpbmUgTUFYRENPREVTIDMwICAgICAgICAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KLSNkZWZpbmUgTUFYQ09ERVMgKE1BWExDT0RFUytNQVhEQ09ERVMpICAvKiBtYXhpbXVtIGNvZGVzIGxlbmd0aHMgdG8gcmVhZCAqLwotI2RlZmluZSBGSVhMQ09ERVMgMjg4ICAgICAgICAgICAvKiBudW1iZXIgb2YgZml4ZWQgbGl0ZXJhbC9sZW5ndGggY29kZXMgKi8KLQotLyogaW5wdXQgYW5kIG91dHB1dCBzdGF0ZSAqLwotc3RydWN0IHN0YXRlIHsKLSAgICAvKiBvdXRwdXQgc3RhdGUgKi8KLSAgICB1bnNpZ25lZCBjaGFyICpvdXQ7ICAgICAgICAgLyogb3V0cHV0IGJ1ZmZlciAqLwotICAgIHVuc2lnbmVkIGxvbmcgb3V0bGVuOyAgICAgICAvKiBhdmFpbGFibGUgc3BhY2UgYXQgb3V0ICovCi0gICAgdW5zaWduZWQgbG9uZyBvdXRjbnQ7ICAgICAgIC8qIGJ5dGVzIHdyaXR0ZW4gdG8gb3V0IHNvIGZhciAqLwotCi0gICAgLyogaW5wdXQgc3RhdGUgKi8KLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbjsgICAgLyogaW5wdXQgYnVmZmVyICovCi0gICAgdW5zaWduZWQgbG9uZyBpbmxlbjsgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCBhdCBpbiAqLwotICAgIHVuc2lnbmVkIGxvbmcgaW5jbnQ7ICAgICAgICAvKiBieXRlcyByZWFkIHNvIGZhciAqLwotICAgIGludCBiaXRidWY7ICAgICAgICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCi0gICAgaW50IGJpdGNudDsgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGJpdCBidWZmZXIgKi8KLQotICAgIC8qIGlucHV0IGxpbWl0IGVycm9yIHJldHVybiBzdGF0ZSBmb3IgYml0cygpIGFuZCBkZWNvZGUoKSAqLwotICAgIGptcF9idWYgZW52OwotfTsKLQotLyoKLSAqIFJldHVybiBuZWVkIGJpdHMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAgVGhpcyBhbHdheXMgbGVhdmVzIGxlc3MgdGhhbgotICogZWlnaHQgYml0cyBpbiB0aGUgYnVmZmVyLiAgYml0cygpIHdvcmtzIHByb3Blcmx5IGZvciBuZWVkID09IDAuCi0gKgotICogRm9ybWF0IG5vdGVzOgotICoKLSAqIC0gQml0cyBhcmUgc3RvcmVkIGluIGJ5dGVzIGZyb20gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgbW9zdAotICogICBzaWduaWZpY2FudCBiaXQuICBUaGVyZWZvcmUgYml0cyBhcmUgZHJvcHBlZCBmcm9tIHRoZSBib3R0b20gb2YgdGhlIGJpdAotICogICBidWZmZXIsIHVzaW5nIHNoaWZ0IHJpZ2h0LCBhbmQgbmV3IGJ5dGVzIGFyZSBhcHBlbmRlZCB0byB0aGUgdG9wIG9mIHRoZQotICogICBiaXQgYnVmZmVyLCB1c2luZyBzaGlmdCBsZWZ0LgotICovCi1sb2NhbCBpbnQgYml0cyhzdHJ1Y3Qgc3RhdGUgKnMsIGludCBuZWVkKQotewotICAgIGxvbmcgdmFsOyAgICAgICAgICAgLyogYml0IGFjY3VtdWxhdG9yIChjYW4gdXNlIHVwIHRvIDIwIGJpdHMpICovCi0KLSAgICAvKiBsb2FkIGF0IGxlYXN0IG5lZWQgYml0cyBpbnRvIHZhbCAqLwotICAgIHZhbCA9IHMtPmJpdGJ1ZjsKLSAgICB3aGlsZSAocy0+Yml0Y250IDwgbmVlZCkgewotICAgICAgICBpZiAocy0+aW5jbnQgPT0gcy0+aW5sZW4pCi0gICAgICAgICAgICBsb25nam1wKHMtPmVudiwgMSk7ICAgICAgICAgLyogb3V0IG9mIGlucHV0ICovCi0gICAgICAgIHZhbCB8PSAobG9uZykocy0+aW5bcy0+aW5jbnQrK10pIDw8IHMtPmJpdGNudDsgIC8qIGxvYWQgZWlnaHQgYml0cyAqLwotICAgICAgICBzLT5iaXRjbnQgKz0gODsKLSAgICB9Ci0KLSAgICAvKiBkcm9wIG5lZWQgYml0cyBhbmQgdXBkYXRlIGJ1ZmZlciwgYWx3YXlzIHplcm8gdG8gc2V2ZW4gYml0cyBsZWZ0ICovCi0gICAgcy0+Yml0YnVmID0gKGludCkodmFsID4+IG5lZWQpOwotICAgIHMtPmJpdGNudCAtPSBuZWVkOwotCi0gICAgLyogcmV0dXJuIG5lZWQgYml0cywgemVyb2luZyB0aGUgYml0cyBhYm92ZSB0aGF0ICovCi0gICAgcmV0dXJuIChpbnQpKHZhbCAmICgoMUwgPDwgbmVlZCkgLSAxKSk7Ci19Ci0KLS8qCi0gKiBQcm9jZXNzIGEgc3RvcmVkIGJsb2NrLgotICoKLSAqIEZvcm1hdCBub3RlczoKLSAqCi0gKiAtIEFmdGVyIHRoZSB0d28tYml0IHN0b3JlZCBibG9jayB0eXBlICgwMCksIHRoZSBzdG9yZWQgYmxvY2sgbGVuZ3RoIGFuZAotICogICBzdG9yZWQgYnl0ZXMgYXJlIGJ5dGUtYWxpZ25lZCBmb3IgZmFzdCBjb3B5aW5nLiAgVGhlcmVmb3JlIGFueSBsZWZ0b3ZlcgotICogICBiaXRzIGluIHRoZSBieXRlIHRoYXQgaGFzIHRoZSBsYXN0IGJpdCBvZiB0aGUgdHlwZSwgYXMgbWFueSBhcyBzZXZlbiwgYXJlCi0gKiAgIGRpc2NhcmRlZC4gIFRoZSB2YWx1ZSBvZiB0aGUgZGlzY2FyZGVkIGJpdHMgYXJlIG5vdCBkZWZpbmVkIGFuZCBzaG91bGQgbm90Ci0gKiAgIGJlIGNoZWNrZWQgYWdhaW5zdCBhbnkgZXhwZWN0YXRpb24uCi0gKgotICogLSBUaGUgc2Vjb25kIGludmVydGVkIGNvcHkgb2YgdGhlIHN0b3JlZCBibG9jayBsZW5ndGggZG9lcyBub3QgaGF2ZSB0byBiZQotICogICBjaGVja2VkLCBidXQgaXQncyBwcm9iYWJseSBhIGdvb2QgaWRlYSB0byBkbyBzbyBhbnl3YXkuCi0gKgotICogLSBBIHN0b3JlZCBibG9jayBjYW4gaGF2ZSB6ZXJvIGxlbmd0aC4gIFRoaXMgaXMgc29tZXRpbWVzIHVzZWQgdG8gYnl0ZS1hbGlnbgotICogICBzdWJzZXRzIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgZm9yIHJhbmRvbSBhY2Nlc3Mgb3IgcGFydGlhbCByZWNvdmVyeS4KLSAqLwotbG9jYWwgaW50IHN0b3JlZChzdHJ1Y3Qgc3RhdGUgKnMpCi17Ci0gICAgdW5zaWduZWQgbGVuOyAgICAgICAvKiBsZW5ndGggb2Ygc3RvcmVkIGJsb2NrICovCi0KLSAgICAvKiBkaXNjYXJkIGxlZnRvdmVyIGJpdHMgZnJvbSBjdXJyZW50IGJ5dGUgKGFzc3VtZXMgcy0+Yml0Y250IDwgOCkgKi8KLSAgICBzLT5iaXRidWYgPSAwOwotICAgIHMtPmJpdGNudCA9IDA7Ci0KLSAgICAvKiBnZXQgbGVuZ3RoIGFuZCBjaGVjayBhZ2FpbnN0IGl0cyBvbmUncyBjb21wbGVtZW50ICovCi0gICAgaWYgKHMtPmluY250ICsgNCA+IHMtPmlubGVuKQotICAgICAgICByZXR1cm4gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IGVub3VnaCBpbnB1dCAqLwotICAgIGxlbiA9IHMtPmluW3MtPmluY250KytdOwotICAgIGxlbiB8PSBzLT5pbltzLT5pbmNudCsrXSA8PCA4OwotICAgIGlmIChzLT5pbltzLT5pbmNudCsrXSAhPSAofmxlbiAmIDB4ZmYpIHx8Ci0gICAgICAgIHMtPmluW3MtPmluY250KytdICE9ICgofmxlbiA+PiA4KSAmIDB4ZmYpKQotICAgICAgICByZXR1cm4gLTI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlkbid0IG1hdGNoIGNvbXBsZW1lbnQhICovCi0KLSAgICAvKiBjb3B5IGxlbiBieXRlcyBmcm9tIGluIHRvIG91dCAqLwotICAgIGlmIChzLT5pbmNudCArIGxlbiA+IHMtPmlubGVuKQotICAgICAgICByZXR1cm4gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IGVub3VnaCBpbnB1dCAqLwotICAgIGlmIChzLT5vdXQgIT0gTklMKSB7Ci0gICAgICAgIGlmIChzLT5vdXRjbnQgKyBsZW4gPiBzLT5vdXRsZW4pCi0gICAgICAgICAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgZW5vdWdoIG91dHB1dCBzcGFjZSAqLwotICAgICAgICB3aGlsZSAobGVuLS0pCi0gICAgICAgICAgICBzLT5vdXRbcy0+b3V0Y250KytdID0gcy0+aW5bcy0+aW5jbnQrK107Ci0gICAgfQotICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoganVzdCBzY2FubmluZyAqLwotICAgICAgICBzLT5vdXRjbnQgKz0gbGVuOwotICAgICAgICBzLT5pbmNudCArPSBsZW47Ci0gICAgfQotCi0gICAgLyogZG9uZSB3aXRoIGEgdmFsaWQgc3RvcmVkIGJsb2NrICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBIdWZmbWFuIGNvZGUgZGVjb2RpbmcgdGFibGVzLiAgY291bnRbMS4uTUFYQklUU10gaXMgdGhlIG51bWJlciBvZiBzeW1ib2xzIG9mCi0gKiBlYWNoIGxlbmd0aCwgd2hpY2ggZm9yIGEgY2Fub25pY2FsIGNvZGUgYXJlIHN0ZXBwZWQgdGhyb3VnaCBpbiBvcmRlci4KLSAqIHN5bWJvbFtdIGFyZSB0aGUgc3ltYm9sIHZhbHVlcyBpbiBjYW5vbmljYWwgb3JkZXIsIHdoZXJlIHRoZSBudW1iZXIgb2YKLSAqIGVudHJpZXMgaXMgdGhlIHN1bSBvZiB0aGUgY291bnRzIGluIGNvdW50W10uICBUaGUgZGVjb2RpbmcgcHJvY2VzcyBjYW4gYmUKLSAqIHNlZW4gaW4gdGhlIGZ1bmN0aW9uIGRlY29kZSgpIGJlbG93LgotICovCi1zdHJ1Y3QgaHVmZm1hbiB7Ci0gICAgc2hvcnQgKmNvdW50OyAgICAgICAvKiBudW1iZXIgb2Ygc3ltYm9scyBvZiBlYWNoIGxlbmd0aCAqLwotICAgIHNob3J0ICpzeW1ib2w7ICAgICAgLyogY2Fub25pY2FsbHkgb3JkZXJlZCBzeW1ib2xzICovCi19OwotCi0vKgotICogRGVjb2RlIGEgY29kZSBmcm9tIHRoZSBzdHJlYW0gcyB1c2luZyBodWZmbWFuIHRhYmxlIGguICBSZXR1cm4gdGhlIHN5bWJvbCBvcgotICogYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGVyZSBpcyBhbiBlcnJvci4gIElmIGFsbCBvZiB0aGUgbGVuZ3RocyBhcmUgemVybywgaS5lLgotICogYW4gZW1wdHkgY29kZSwgb3IgaWYgdGhlIGNvZGUgaXMgaW5jb21wbGV0ZSBhbmQgYW4gaW52YWxpZCBjb2RlIGlzIHJlY2VpdmVkLAotICogdGhlbiAtMTAgaXMgcmV0dXJuZWQgYWZ0ZXIgcmVhZGluZyBNQVhCSVRTIGJpdHMuCi0gKgotICogRm9ybWF0IG5vdGVzOgotICoKLSAqIC0gVGhlIGNvZGVzIGFzIHN0b3JlZCBpbiB0aGUgY29tcHJlc3NlZCBkYXRhIGFyZSBiaXQtcmV2ZXJzZWQgcmVsYXRpdmUgdG8KLSAqICAgYSBzaW1wbGUgaW50ZWdlciBvcmRlcmluZyBvZiBjb2RlcyBvZiB0aGUgc2FtZSBsZW5ndGhzLiAgSGVuY2UgYmVsb3cgdGhlCi0gKiAgIGJpdHMgYXJlIHB1bGxlZCBmcm9tIHRoZSBjb21wcmVzc2VkIGRhdGEgb25lIGF0IGEgdGltZSBhbmQgdXNlZCB0bwotICogICBidWlsZCB0aGUgY29kZSB2YWx1ZSByZXZlcnNlZCBmcm9tIHdoYXQgaXMgaW4gdGhlIHN0cmVhbSBpbiBvcmRlciB0bwotICogICBwZXJtaXQgc2ltcGxlIGludGVnZXIgY29tcGFyaXNvbnMgZm9yIGRlY29kaW5nLiAgQSB0YWJsZS1iYXNlZCBkZWNvZGluZwotICogICBzY2hlbWUgKGFzIHVzZWQgaW4gemxpYikgZG9lcyBub3QgbmVlZCB0byBkbyB0aGlzIHJldmVyc2FsLgotICoKLSAqIC0gVGhlIGZpcnN0IGNvZGUgZm9yIHRoZSBzaG9ydGVzdCBsZW5ndGggaXMgYWxsIHplcm9zLiAgU3Vic2VxdWVudCBjb2RlcyBvZgotICogICB0aGUgc2FtZSBsZW5ndGggYXJlIHNpbXBseSBpbnRlZ2VyIGluY3JlbWVudHMgb2YgdGhlIHByZXZpb3VzIGNvZGUuICBXaGVuCi0gKiAgIG1vdmluZyB1cCBhIGxlbmd0aCwgYSB6ZXJvIGJpdCBpcyBhcHBlbmRlZCB0byB0aGUgY29kZS4gIEZvciBhIGNvbXBsZXRlCi0gKiAgIGNvZGUsIHRoZSBsYXN0IGNvZGUgb2YgdGhlIGxvbmdlc3QgbGVuZ3RoIHdpbGwgYmUgYWxsIG9uZXMuCi0gKgotICogLSBJbmNvbXBsZXRlIGNvZGVzIGFyZSBoYW5kbGVkIGJ5IHRoaXMgZGVjb2Rlciwgc2luY2UgdGhleSBhcmUgcGVybWl0dGVkCi0gKiAgIGluIHRoZSBkZWZsYXRlIGZvcm1hdC4gIFNlZSB0aGUgZm9ybWF0IG5vdGVzIGZvciBmaXhlZCgpIGFuZCBkeW5hbWljKCkuCi0gKi8KLSNpZmRlZiBTTE9XCi1sb2NhbCBpbnQgZGVjb2RlKHN0cnVjdCBzdGF0ZSAqcywgY29uc3Qgc3RydWN0IGh1ZmZtYW4gKmgpCi17Ci0gICAgaW50IGxlbjsgICAgICAgICAgICAvKiBjdXJyZW50IG51bWJlciBvZiBiaXRzIGluIGNvZGUgKi8KLSAgICBpbnQgY29kZTsgICAgICAgICAgIC8qIGxlbiBiaXRzIGJlaW5nIGRlY29kZWQgKi8KLSAgICBpbnQgZmlyc3Q7ICAgICAgICAgIC8qIGZpcnN0IGNvZGUgb2YgbGVuZ3RoIGxlbiAqLwotICAgIGludCBjb3VudDsgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGxlbmd0aCBsZW4gKi8KLSAgICBpbnQgaW5kZXg7ICAgICAgICAgIC8qIGluZGV4IG9mIGZpcnN0IGNvZGUgb2YgbGVuZ3RoIGxlbiBpbiBzeW1ib2wgdGFibGUgKi8KLQotICAgIGNvZGUgPSBmaXJzdCA9IGluZGV4ID0gMDsKLSAgICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykgewotICAgICAgICBjb2RlIHw9IGJpdHMocywgMSk7ICAgICAgICAgICAgIC8qIGdldCBuZXh0IGJpdCAqLwotICAgICAgICBjb3VudCA9IGgtPmNvdW50W2xlbl07Ci0gICAgICAgIGlmIChjb2RlIC0gY291bnQgPCBmaXJzdCkgICAgICAgLyogaWYgbGVuZ3RoIGxlbiwgcmV0dXJuIHN5bWJvbCAqLwotICAgICAgICAgICAgcmV0dXJuIGgtPnN5bWJvbFtpbmRleCArIChjb2RlIC0gZmlyc3QpXTsKLSAgICAgICAgaW5kZXggKz0gY291bnQ7ICAgICAgICAgICAgICAgICAvKiBlbHNlIHVwZGF0ZSBmb3IgbmV4dCBsZW5ndGggKi8KLSAgICAgICAgZmlyc3QgKz0gY291bnQ7Ci0gICAgICAgIGZpcnN0IDw8PSAxOwotICAgICAgICBjb2RlIDw8PSAxOwotICAgIH0KLSAgICByZXR1cm4gLTEwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiByYW4gb3V0IG9mIGNvZGVzICovCi19Ci0KLS8qCi0gKiBBIGZhc3RlciB2ZXJzaW9uIG9mIGRlY29kZSgpIGZvciByZWFsIGFwcGxpY2F0aW9ucyBvZiB0aGlzIGNvZGUuICAgSXQncyBub3QKLSAqIGFzIHJlYWRhYmxlLCBidXQgaXQgbWFrZXMgcHVmZigpIHR3aWNlIGFzIGZhc3QuICBBbmQgaXQgb25seSBtYWtlcyB0aGUgY29kZQotICogYSBmZXcgcGVyY2VudCBsYXJnZXIuCi0gKi8KLSNlbHNlIC8qICFTTE9XICovCi1sb2NhbCBpbnQgZGVjb2RlKHN0cnVjdCBzdGF0ZSAqcywgY29uc3Qgc3RydWN0IGh1ZmZtYW4gKmgpCi17Ci0gICAgaW50IGxlbjsgICAgICAgICAgICAvKiBjdXJyZW50IG51bWJlciBvZiBiaXRzIGluIGNvZGUgKi8KLSAgICBpbnQgY29kZTsgICAgICAgICAgIC8qIGxlbiBiaXRzIGJlaW5nIGRlY29kZWQgKi8KLSAgICBpbnQgZmlyc3Q7ICAgICAgICAgIC8qIGZpcnN0IGNvZGUgb2YgbGVuZ3RoIGxlbiAqLwotICAgIGludCBjb3VudDsgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGxlbmd0aCBsZW4gKi8KLSAgICBpbnQgaW5kZXg7ICAgICAgICAgIC8qIGluZGV4IG9mIGZpcnN0IGNvZGUgb2YgbGVuZ3RoIGxlbiBpbiBzeW1ib2wgdGFibGUgKi8KLSAgICBpbnQgYml0YnVmOyAgICAgICAgIC8qIGJpdHMgZnJvbSBzdHJlYW0gKi8KLSAgICBpbnQgbGVmdDsgICAgICAgICAgIC8qIGJpdHMgbGVmdCBpbiBuZXh0IG9yIGxlZnQgdG8gcHJvY2VzcyAqLwotICAgIHNob3J0ICpuZXh0OyAgICAgICAgLyogbmV4dCBudW1iZXIgb2YgY29kZXMgKi8KLQotICAgIGJpdGJ1ZiA9IHMtPmJpdGJ1ZjsKLSAgICBsZWZ0ID0gcy0+Yml0Y250OwotICAgIGNvZGUgPSBmaXJzdCA9IGluZGV4ID0gMDsKLSAgICBsZW4gPSAxOwotICAgIG5leHQgPSBoLT5jb3VudCArIDE7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgd2hpbGUgKGxlZnQtLSkgewotICAgICAgICAgICAgY29kZSB8PSBiaXRidWYgJiAxOwotICAgICAgICAgICAgYml0YnVmID4+PSAxOwotICAgICAgICAgICAgY291bnQgPSAqbmV4dCsrOwotICAgICAgICAgICAgaWYgKGNvZGUgLSBjb3VudCA8IGZpcnN0KSB7IC8qIGlmIGxlbmd0aCBsZW4sIHJldHVybiBzeW1ib2wgKi8KLSAgICAgICAgICAgICAgICBzLT5iaXRidWYgPSBiaXRidWY7Ci0gICAgICAgICAgICAgICAgcy0+Yml0Y250ID0gKHMtPmJpdGNudCAtIGxlbikgJiA3OwotICAgICAgICAgICAgICAgIHJldHVybiBoLT5zeW1ib2xbaW5kZXggKyAoY29kZSAtIGZpcnN0KV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbmRleCArPSBjb3VudDsgICAgICAgICAgICAgLyogZWxzZSB1cGRhdGUgZm9yIG5leHQgbGVuZ3RoICovCi0gICAgICAgICAgICBmaXJzdCArPSBjb3VudDsKLSAgICAgICAgICAgIGZpcnN0IDw8PSAxOwotICAgICAgICAgICAgY29kZSA8PD0gMTsKLSAgICAgICAgICAgIGxlbisrOwotICAgICAgICB9Ci0gICAgICAgIGxlZnQgPSAoTUFYQklUUysxKSAtIGxlbjsKLSAgICAgICAgaWYgKGxlZnQgPT0gMCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAocy0+aW5jbnQgPT0gcy0+aW5sZW4pCi0gICAgICAgICAgICBsb25nam1wKHMtPmVudiwgMSk7ICAgICAgICAgLyogb3V0IG9mIGlucHV0ICovCi0gICAgICAgIGJpdGJ1ZiA9IHMtPmluW3MtPmluY250KytdOwotICAgICAgICBpZiAobGVmdCA+IDgpCi0gICAgICAgICAgICBsZWZ0ID0gODsKLSAgICB9Ci0gICAgcmV0dXJuIC0xMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmFuIG91dCBvZiBjb2RlcyAqLwotfQotI2VuZGlmIC8qIFNMT1cgKi8KLQotLyoKLSAqIEdpdmVuIHRoZSBsaXN0IG9mIGNvZGUgbGVuZ3RocyBsZW5ndGhbMC4ubi0xXSByZXByZXNlbnRpbmcgYSBjYW5vbmljYWwKLSAqIEh1ZmZtYW4gY29kZSBmb3IgbiBzeW1ib2xzLCBjb25zdHJ1Y3QgdGhlIHRhYmxlcyByZXF1aXJlZCB0byBkZWNvZGUgdGhvc2UKLSAqIGNvZGVzLiAgVGhvc2UgdGFibGVzIGFyZSB0aGUgbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoLCBhbmQgdGhlIHN5bWJvbHMKLSAqIHNvcnRlZCBieSBsZW5ndGgsIHJldGFpbmluZyB0aGVpciBvcmlnaW5hbCBvcmRlciB3aXRoaW4gZWFjaCBsZW5ndGguICBUaGUKLSAqIHJldHVybiB2YWx1ZSBpcyB6ZXJvIGZvciBhIGNvbXBsZXRlIGNvZGUgc2V0LCBuZWdhdGl2ZSBmb3IgYW4gb3Zlci0KLSAqIHN1YnNjcmliZWQgY29kZSBzZXQsIGFuZCBwb3NpdGl2ZSBmb3IgYW4gaW5jb21wbGV0ZSBjb2RlIHNldC4gIFRoZSB0YWJsZXMKLSAqIGNhbiBiZSB1c2VkIGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgemVybyBvciBwb3NpdGl2ZSwgYnV0IHRoZXkgY2Fubm90IGJlIHVzZWQKLSAqIGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgbmVnYXRpdmUuICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHplcm8sIGl0IGlzIG5vdAotICogcG9zc2libGUgZm9yIGRlY29kZSgpIHVzaW5nIHRoYXQgdGFibGUgdG8gcmV0dXJuIGFuIGVycm9yLS1hbnkgc3RyZWFtIG9mCi0gKiBlbm91Z2ggYml0cyB3aWxsIHJlc29sdmUgdG8gYSBzeW1ib2wuICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHBvc2l0aXZlLCB0aGVuCi0gKiBpdCBpcyBwb3NzaWJsZSBmb3IgZGVjb2RlKCkgdXNpbmcgdGhhdCB0YWJsZSB0byByZXR1cm4gYW4gZXJyb3IgZm9yIHJlY2VpdmVkCi0gKiBjb2RlcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGluY29tcGxldGUgbGVuZ3Rocy4KLSAqCi0gKiBOb3QgdXNlZCBieSBkZWNvZGUoKSwgYnV0IHVzZWQgZm9yIGVycm9yIGNoZWNraW5nLCBoLT5jb3VudFswXSBpcyB0aGUgbnVtYmVyCi0gKiBvZiB0aGUgbiBzeW1ib2xzIG5vdCBpbiB0aGUgY29kZS4gIFNvIG4gLSBoLT5jb3VudFswXSBpcyB0aGUgbnVtYmVyIG9mCi0gKiBjb2Rlcy4gIFRoaXMgaXMgdXNlZnVsIGZvciBjaGVja2luZyBmb3IgaW5jb21wbGV0ZSBjb2RlcyB0aGF0IGhhdmUgbW9yZSB0aGFuCi0gKiBvbmUgc3ltYm9sLCB3aGljaCBpcyBhbiBlcnJvciBpbiBhIGR5bmFtaWMgYmxvY2suCi0gKgotICogQXNzdW1wdGlvbjogZm9yIGFsbCBpIGluIDAuLm4tMSwgMCA8PSBsZW5ndGhbaV0gPD0gTUFYQklUUwotICogVGhpcyBpcyBhc3N1cmVkIGJ5IHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIGxlbmd0aCBhcnJheXMgaW4gZHluYW1pYygpIGFuZAotICogZml4ZWQoKSBhbmQgaXMgbm90IHZlcmlmaWVkIGJ5IGNvbnN0cnVjdCgpLgotICoKLSAqIEZvcm1hdCBub3RlczoKLSAqCi0gKiAtIFBlcm1pdHRlZCBhbmQgZXhwZWN0ZWQgZXhhbXBsZXMgb2YgaW5jb21wbGV0ZSBjb2RlcyBhcmUgb25lIG9mIHRoZSBmaXhlZAotICogICBjb2RlcyBhbmQgYW55IGNvZGUgd2l0aCBhIHNpbmdsZSBzeW1ib2wgd2hpY2ggaW4gZGVmbGF0ZSBpcyBjb2RlZCBhcyBvbmUKLSAqICAgYml0IGluc3RlYWQgb2YgemVybyBiaXRzLiAgU2VlIHRoZSBmb3JtYXQgbm90ZXMgZm9yIGZpeGVkKCkgYW5kIGR5bmFtaWMoKS4KLSAqCi0gKiAtIFdpdGhpbiBhIGdpdmVuIGNvZGUgbGVuZ3RoLCB0aGUgc3ltYm9scyBhcmUga2VwdCBpbiBhc2NlbmRpbmcgb3JkZXIgZm9yCi0gKiAgIHRoZSBjb2RlIGJpdHMgZGVmaW5pdGlvbi4KLSAqLwotbG9jYWwgaW50IGNvbnN0cnVjdChzdHJ1Y3QgaHVmZm1hbiAqaCwgY29uc3Qgc2hvcnQgKmxlbmd0aCwgaW50IG4pCi17Ci0gICAgaW50IHN5bWJvbDsgICAgICAgICAvKiBjdXJyZW50IHN5bWJvbCB3aGVuIHN0ZXBwaW5nIHRocm91Z2ggbGVuZ3RoW10gKi8KLSAgICBpbnQgbGVuOyAgICAgICAgICAgIC8qIGN1cnJlbnQgbGVuZ3RoIHdoZW4gc3RlcHBpbmcgdGhyb3VnaCBoLT5jb3VudFtdICovCi0gICAgaW50IGxlZnQ7ICAgICAgICAgICAvKiBudW1iZXIgb2YgcG9zc2libGUgY29kZXMgbGVmdCBvZiBjdXJyZW50IGxlbmd0aCAqLwotICAgIHNob3J0IG9mZnNbTUFYQklUUysxXTsgICAgICAvKiBvZmZzZXRzIGluIHN5bWJvbCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi8KLQotICAgIC8qIGNvdW50IG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCAqLwotICAgIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKQotICAgICAgICBoLT5jb3VudFtsZW5dID0gMDsKLSAgICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IG47IHN5bWJvbCsrKQotICAgICAgICAoaC0+Y291bnRbbGVuZ3RoW3N5bWJvbF1dKSsrOyAgIC8qIGFzc3VtZXMgbGVuZ3RocyBhcmUgd2l0aGluIGJvdW5kcyAqLwotICAgIGlmIChoLT5jb3VudFswXSA9PSBuKSAgICAgICAgICAgICAgIC8qIG5vIGNvZGVzISAqLwotICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXBsZXRlLCBidXQgZGVjb2RlKCkgd2lsbCBmYWlsICovCi0KLSAgICAvKiBjaGVjayBmb3IgYW4gb3Zlci1zdWJzY3JpYmVkIG9yIGluY29tcGxldGUgc2V0IG9mIGxlbmd0aHMgKi8KLSAgICBsZWZ0ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbmUgcG9zc2libGUgY29kZSBvZiB6ZXJvIGxlbmd0aCAqLwotICAgIGZvciAobGVuID0gMTsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7Ci0gICAgICAgIGxlZnQgPDw9IDE7ICAgICAgICAgICAgICAgICAgICAgLyogb25lIG1vcmUgYml0LCBkb3VibGUgY29kZXMgbGVmdCAqLwotICAgICAgICBsZWZ0IC09IGgtPmNvdW50W2xlbl07ICAgICAgICAgIC8qIGRlZHVjdCBjb3VudCBmcm9tIHBvc3NpYmxlIGNvZGVzICovCi0gICAgICAgIGlmIChsZWZ0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiBsZWZ0OyAgICAgICAgICAgICAgICAvKiBvdmVyLXN1YnNjcmliZWQtLXJldHVybiBuZWdhdGl2ZSAqLwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlZnQgPiAwIG1lYW5zIGluY29tcGxldGUgKi8KLQotICAgIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoIGZvciBzb3J0aW5nICovCi0gICAgb2Zmc1sxXSA9IDA7Ci0gICAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykKLSAgICAgICAgb2Zmc1tsZW4gKyAxXSA9IG9mZnNbbGVuXSArIGgtPmNvdW50W2xlbl07Ci0KLSAgICAvKgotICAgICAqIHB1dCBzeW1ib2xzIGluIHRhYmxlIHNvcnRlZCBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaAotICAgICAqIGxlbmd0aAotICAgICAqLwotICAgIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgbjsgc3ltYm9sKyspCi0gICAgICAgIGlmIChsZW5ndGhbc3ltYm9sXSAhPSAwKQotICAgICAgICAgICAgaC0+c3ltYm9sW29mZnNbbGVuZ3RoW3N5bWJvbF1dKytdID0gc3ltYm9sOwotCi0gICAgLyogcmV0dXJuIHplcm8gZm9yIGNvbXBsZXRlIHNldCwgcG9zaXRpdmUgZm9yIGluY29tcGxldGUgc2V0ICovCi0gICAgcmV0dXJuIGxlZnQ7Ci19Ci0KLS8qCi0gKiBEZWNvZGUgbGl0ZXJhbC9sZW5ndGggYW5kIGRpc3RhbmNlIGNvZGVzIHVudGlsIGFuIGVuZC1vZi1ibG9jayBjb2RlLgotICoKLSAqIEZvcm1hdCBub3RlczoKLSAqCi0gKiAtIENvbXByZXNzZWQgZGF0YSB0aGF0IGlzIGFmdGVyIHRoZSBibG9jayB0eXBlIGlmIGZpeGVkIG9yIGFmdGVyIHRoZSBjb2RlCi0gKiAgIGRlc2NyaXB0aW9uIGlmIGR5bmFtaWMgaXMgYSBjb21iaW5hdGlvbiBvZiBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlCi0gKiAgIHBhaXJzIHRlcm1pbmF0ZWQgYnkgYW5kIGVuZC1vZi1ibG9jayBjb2RlLiAgTGl0ZXJhbHMgYXJlIHNpbXBseSBIdWZmbWFuCi0gKiAgIGNvZGVkIGJ5dGVzLiAgQSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyBhIGNvZGVkIGxlbmd0aCBmb2xsb3dlZCBieSBhCi0gKiAgIGNvZGVkIGRpc3RhbmNlIHRvIHJlcHJlc2VudCBhIHN0cmluZyB0aGF0IG9jY3VycyBlYXJsaWVyIGluIHRoZQotICogICB1bmNvbXByZXNzZWQgZGF0YSB0aGF0IG9jY3VycyBhZ2FpbiBhdCB0aGUgY3VycmVudCBsb2NhdGlvbi4KLSAqCi0gKiAtIExpdGVyYWxzLCBsZW5ndGhzLCBhbmQgdGhlIGVuZC1vZi1ibG9jayBjb2RlIGFyZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlCi0gKiAgIGNvZGUgb2YgdXAgdG8gMjg2IHN5bWJvbHMuICBUaGV5IGFyZSAyNTYgbGl0ZXJhbHMgKDAuLjI1NSksIDI5IGxlbmd0aAotICogICBzeW1ib2xzICgyNTcuLjI4NSksIGFuZCB0aGUgZW5kLW9mLWJsb2NrIHN5bWJvbCAoMjU2KS4KLSAqCi0gKiAtIFRoZXJlIGFyZSAyNTYgcG9zc2libGUgbGVuZ3RocyAoMy4uMjU4KSwgYW5kIHNvIDI5IHN5bWJvbHMgYXJlIG5vdCBlbm91Z2gKLSAqICAgdG8gcmVwcmVzZW50IGFsbCBvZiB0aG9zZS4gIExlbmd0aHMgMy4uMTAgYW5kIDI1OCBhcmUgaW4gZmFjdCByZXByZXNlbnRlZAotICogICBieSBqdXN0IGEgbGVuZ3RoIHN5bWJvbC4gIExlbmd0aHMgMTEuLjI1NyBhcmUgcmVwcmVzZW50ZWQgYXMgYSBzeW1ib2wgYW5kCi0gKiAgIHNvbWUgbnVtYmVyIG9mIGV4dHJhIGJpdHMgdGhhdCBhcmUgYWRkZWQgYXMgYW4gaW50ZWdlciB0byB0aGUgYmFzZSBsZW5ndGgKLSAqICAgb2YgdGhlIGxlbmd0aCBzeW1ib2wuICBUaGUgbnVtYmVyIG9mIGV4dHJhIGJpdHMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYmFzZQotICogICBsZW5ndGggc3ltYm9sLiAgVGhlc2UgYXJlIGluIHRoZSBzdGF0aWMgYXJyYXlzIGJlbG93LCBsZW5zW10gZm9yIHRoZSBiYXNlCi0gKiAgIGxlbmd0aHMgYW5kIGxleHRbXSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIGV4dHJhIGJpdHMuCi0gKgotICogLSBUaGUgcmVhc29uIHRoYXQgMjU4IGdldHMgaXRzIG93biBzeW1ib2wgaXMgdGhhdCB0aGUgbG9uZ2VzdCBsZW5ndGggaXMgdXNlZAotICogICBvZnRlbiBpbiBoaWdobHkgcmVkdW5kYW50IGZpbGVzLiAgTm90ZSB0aGF0IDI1OCBjYW4gYWxzbyBiZSBjb2RlZCBhcyB0aGUKLSAqICAgYmFzZSB2YWx1ZSAyMjcgcGx1cyB0aGUgbWF4aW11bSBleHRyYSB2YWx1ZSBvZiAzMS4gIFdoaWxlIGEgZ29vZCBkZWZsYXRlCi0gKiAgIHNob3VsZCBuZXZlciBkbyB0aGlzLCBpdCBpcyBub3QgYW4gZXJyb3IsIGFuZCBzaG91bGQgYmUgZGVjb2RlZCBwcm9wZXJseS4KLSAqCi0gKiAtIElmIGEgbGVuZ3RoIGlzIGRlY29kZWQsIGluY2x1ZGluZyBpdHMgZXh0cmEgYml0cyBpZiBhbnksIHRoZW4gaXQgaXMKLSAqICAgZm9sbG93ZWQgYSBkaXN0YW5jZSBjb2RlLiAgVGhlcmUgYXJlIHVwIHRvIDMwIGRpc3RhbmNlIHN5bWJvbHMuICBBZ2FpbgotICogICB0aGVyZSBhcmUgbWFueSBtb3JlIHBvc3NpYmxlIGRpc3RhbmNlcyAoMS4uMzI3NjgpLCBzbyBleHRyYSBiaXRzIGFyZSBhZGRlZAotICogICB0byBhIGJhc2UgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIHN5bWJvbC4gIFRoZSBkaXN0YW5jZXMgMS4uNCBnZXQgdGhlaXIKLSAqICAgb3duIHN5bWJvbCwgYnV0IHRoZSByZXN0IHJlcXVpcmUgZXh0cmEgYml0cy4gIFRoZSBiYXNlIGRpc3RhbmNlcyBhbmQKLSAqICAgY29ycmVzcG9uZGluZyBudW1iZXIgb2YgZXh0cmEgYml0cyBhcmUgYmVsb3cgaW4gdGhlIHN0YXRpYyBhcnJheXMgZGlzdFtdCi0gKiAgIGFuZCBkZXh0W10uCi0gKgotICogLSBMaXRlcmFsIGJ5dGVzIGFyZSBzaW1wbHkgd3JpdHRlbiB0byB0aGUgb3V0cHV0LiAgQSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcwotICogICBhbiBpbnN0cnVjdGlvbiB0byBjb3B5IHByZXZpb3VzbHkgdW5jb21wcmVzc2VkIGJ5dGVzIHRvIHRoZSBvdXRwdXQuICBUaGUKLSAqICAgY29weSBpcyBmcm9tIGRpc3RhbmNlIGJ5dGVzIGJhY2sgaW4gdGhlIG91dHB1dCBzdHJlYW0sIGNvcHlpbmcgZm9yIGxlbmd0aAotICogICBieXRlcy4KLSAqCi0gKiAtIERpc3RhbmNlcyBwb2ludGluZyBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGRhdGEgYXJlIG5vdAotICogICBwZXJtaXR0ZWQuCi0gKgotICogLSBPdmVybGFwcGVkIGNvcGllcywgd2hlcmUgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhlIGRpc3RhbmNlLCBhcmUKLSAqICAgYWxsb3dlZCBhbmQgY29tbW9uLiAgRm9yIGV4YW1wbGUsIGEgZGlzdGFuY2Ugb2Ygb25lIGFuZCBhIGxlbmd0aCBvZiAyNTgKLSAqICAgc2ltcGx5IGNvcGllcyB0aGUgbGFzdCBieXRlIDI1OCB0aW1lcy4gIEEgZGlzdGFuY2Ugb2YgZm91ciBhbmQgYSBsZW5ndGggb2YKLSAqICAgdHdlbHZlIGNvcGllcyB0aGUgbGFzdCBmb3VyIGJ5dGVzIHRocmVlIHRpbWVzLiAgQSBzaW1wbGUgZm9yd2FyZCBjb3B5Ci0gKiAgIGlnbm9yaW5nIHdoZXRoZXIgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhlIGRpc3RhbmNlIG9yIG5vdCBpbXBsZW1lbnRzCi0gKiAgIHRoaXMgY29ycmVjdGx5LiAgWW91IHNob3VsZCBub3QgdXNlIG1lbWNweSgpIHNpbmNlIGl0cyBiZWhhdmlvciBpcyBub3QKLSAqICAgZGVmaW5lZCBmb3Igb3ZlcmxhcHBlZCBhcnJheXMuICBZb3Ugc2hvdWxkIG5vdCB1c2UgbWVtbW92ZSgpIG9yIGJjb3B5KCkKLSAqICAgc2luY2UgdGhvdWdoIHRoZWlyIGJlaGF2aW9yIC1pcy0gZGVmaW5lZCBmb3Igb3ZlcmxhcHBpbmcgYXJyYXlzLCBpdCBpcwotICogICBkZWZpbmVkIHRvIGRvIHRoZSB3cm9uZyB0aGluZyBpbiB0aGlzIGNhc2UuCi0gKi8KLWxvY2FsIGludCBjb2RlcyhzdHJ1Y3Qgc3RhdGUgKnMsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGh1ZmZtYW4gKmxlbmNvZGUsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGh1ZmZtYW4gKmRpc3Rjb2RlKQotewotICAgIGludCBzeW1ib2w7ICAgICAgICAgLyogZGVjb2RlZCBzeW1ib2wgKi8KLSAgICBpbnQgbGVuOyAgICAgICAgICAgIC8qIGxlbmd0aCBmb3IgY29weSAqLwotICAgIHVuc2lnbmVkIGRpc3Q7ICAgICAgLyogZGlzdGFuY2UgZm9yIGNvcHkgKi8KLSAgICBzdGF0aWMgY29uc3Qgc2hvcnQgbGVuc1syOV0gPSB7IC8qIFNpemUgYmFzZSBmb3IgbGVuZ3RoIGNvZGVzIDI1Ny4uMjg1ICovCi0gICAgICAgIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsCi0gICAgICAgIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4fTsKLSAgICBzdGF0aWMgY29uc3Qgc2hvcnQgbGV4dFsyOV0gPSB7IC8qIEV4dHJhIGJpdHMgZm9yIGxlbmd0aCBjb2RlcyAyNTcuLjI4NSAqLwotICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLAotICAgICAgICAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCAwfTsKLSAgICBzdGF0aWMgY29uc3Qgc2hvcnQgZGlzdHNbMzBdID0geyAvKiBPZmZzZXQgYmFzZSBmb3IgZGlzdGFuY2UgY29kZXMgMC4uMjkgKi8KLSAgICAgICAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLAotICAgICAgICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsCi0gICAgICAgIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1Nzd9OwotICAgIHN0YXRpYyBjb25zdCBzaG9ydCBkZXh0WzMwXSA9IHsgLyogRXh0cmEgYml0cyBmb3IgZGlzdGFuY2UgY29kZXMgMC4uMjkgKi8KLSAgICAgICAgMCwgMCwgMCwgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwKLSAgICAgICAgNywgNywgOCwgOCwgOSwgOSwgMTAsIDEwLCAxMSwgMTEsCi0gICAgICAgIDEyLCAxMiwgMTMsIDEzfTsKLQotICAgIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlIHBhaXJzICovCi0gICAgZG8gewotICAgICAgICBzeW1ib2wgPSBkZWNvZGUocywgbGVuY29kZSk7Ci0gICAgICAgIGlmIChzeW1ib2wgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHN5bWJvbDsgICAgICAgICAgICAgIC8qIGludmFsaWQgc3ltYm9sICovCi0gICAgICAgIGlmIChzeW1ib2wgPCAyNTYpIHsgICAgICAgICAgICAgLyogbGl0ZXJhbDogc3ltYm9sIGlzIHRoZSBieXRlICovCi0gICAgICAgICAgICAvKiB3cml0ZSBvdXQgdGhlIGxpdGVyYWwgKi8KLSAgICAgICAgICAgIGlmIChzLT5vdXQgIT0gTklMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHMtPm91dGNudCA9PSBzLT5vdXRsZW4pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgIHMtPm91dFtzLT5vdXRjbnRdID0gc3ltYm9sOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcy0+b3V0Y250Kys7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3ltYm9sID4gMjU2KSB7ICAgICAgICAvKiBsZW5ndGggKi8KLSAgICAgICAgICAgIC8qIGdldCBhbmQgY29tcHV0ZSBsZW5ndGggKi8KLSAgICAgICAgICAgIHN5bWJvbCAtPSAyNTc7Ci0gICAgICAgICAgICBpZiAoc3ltYm9sID49IDI5KQotICAgICAgICAgICAgICAgIHJldHVybiAtMTA7ICAgICAgICAgICAgIC8qIGludmFsaWQgZml4ZWQgY29kZSAqLwotICAgICAgICAgICAgbGVuID0gbGVuc1tzeW1ib2xdICsgYml0cyhzLCBsZXh0W3N5bWJvbF0pOwotCi0gICAgICAgICAgICAvKiBnZXQgYW5kIGNoZWNrIGRpc3RhbmNlICovCi0gICAgICAgICAgICBzeW1ib2wgPSBkZWNvZGUocywgZGlzdGNvZGUpOwotICAgICAgICAgICAgaWYgKHN5bWJvbCA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbDsgICAgICAgICAgLyogaW52YWxpZCBzeW1ib2wgKi8KLSAgICAgICAgICAgIGRpc3QgPSBkaXN0c1tzeW1ib2xdICsgYml0cyhzLCBkZXh0W3N5bWJvbF0pOwotI2lmbmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlIKLSAgICAgICAgICAgIGlmIChkaXN0ID4gcy0+b3V0Y250KQotICAgICAgICAgICAgICAgIHJldHVybiAtMTE7ICAgICAvKiBkaXN0YW5jZSB0b28gZmFyIGJhY2sgKi8KLSNlbmRpZgotCi0gICAgICAgICAgICAvKiBjb3B5IGxlbmd0aCBieXRlcyBmcm9tIGRpc3RhbmNlIGJ5dGVzIGJhY2sgKi8KLSAgICAgICAgICAgIGlmIChzLT5vdXQgIT0gTklMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHMtPm91dGNudCArIGxlbiA+IHMtPm91dGxlbikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGxlbi0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPm91dFtzLT5vdXRjbnRdID0KLSNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgPiBzLT5vdXRjbnQgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOgotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+b3V0W3MtPm91dGNudCAtIGRpc3RdOwotICAgICAgICAgICAgICAgICAgICBzLT5vdXRjbnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcy0+b3V0Y250ICs9IGxlbjsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKHN5bWJvbCAhPSAyNTYpOyAgICAgICAgICAgIC8qIGVuZCBvZiBibG9jayBzeW1ib2wgKi8KLQotICAgIC8qIGRvbmUgd2l0aCBhIHZhbGlkIGZpeGVkIG9yIGR5bmFtaWMgYmxvY2sgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIFByb2Nlc3MgYSBmaXhlZCBjb2RlcyBibG9jay4KLSAqCi0gKiBGb3JtYXQgbm90ZXM6Ci0gKgotICogLSBUaGlzIGJsb2NrIHR5cGUgY2FuIGJlIHVzZWZ1bCBmb3IgY29tcHJlc3Npbmcgc21hbGwgYW1vdW50cyBvZiBkYXRhIGZvcgotICogICB3aGljaCB0aGUgc2l6ZSBvZiB0aGUgY29kZSBkZXNjcmlwdGlvbnMgaW4gYSBkeW5hbWljIGJsb2NrIGV4Y2VlZHMgdGhlCi0gKiAgIGJlbmVmaXQgb2YgY3VzdG9tIGNvZGVzIGZvciB0aGF0IGJsb2NrLiAgRm9yIGZpeGVkIGNvZGVzLCBubyBiaXRzIGFyZQotICogICBzcGVudCBvbiBjb2RlIGRlc2NyaXB0aW9ucy4gIEluc3RlYWQgdGhlIGNvZGUgbGVuZ3RocyBmb3IgbGl0ZXJhbC9sZW5ndGgKLSAqICAgY29kZXMgYW5kIGRpc3RhbmNlIGNvZGVzIGFyZSBmaXhlZC4gIFRoZSBzcGVjaWZpYyBsZW5ndGhzIGZvciBlYWNoIHN5bWJvbAotICogICBjYW4gYmUgc2VlbiBpbiB0aGUgImZvciIgbG9vcHMgYmVsb3cuCi0gKgotICogLSBUaGUgbGl0ZXJhbC9sZW5ndGggY29kZSBpcyBjb21wbGV0ZSwgYnV0IGhhcyB0d28gc3ltYm9scyB0aGF0IGFyZSBpbnZhbGlkCi0gKiAgIGFuZCBzaG91bGQgcmVzdWx0IGluIGFuIGVycm9yIGlmIHJlY2VpdmVkLiAgVGhpcyBjYW5ub3QgYmUgaW1wbGVtZW50ZWQKLSAqICAgc2ltcGx5IGFzIGFuIGluY29tcGxldGUgY29kZSBzaW5jZSB0aG9zZSB0d28gc3ltYm9scyBhcmUgaW4gdGhlICJtaWRkbGUiCi0gKiAgIG9mIHRoZSBjb2RlLiAgVGhleSBhcmUgZWlnaHQgYml0cyBsb25nIGFuZCB0aGUgbG9uZ2VzdCBsaXRlcmFsL2xlbmd0aFwKLSAqICAgY29kZSBpcyBuaW5lIGJpdHMuICBUaGVyZWZvcmUgdGhlIGNvZGUgbXVzdCBiZSBjb25zdHJ1Y3RlZCB3aXRoIHRob3NlCi0gKiAgIHN5bWJvbHMsIGFuZCB0aGUgaW52YWxpZCBzeW1ib2xzIG11c3QgYmUgZGV0ZWN0ZWQgYWZ0ZXIgZGVjb2RpbmcuCi0gKgotICogLSBUaGUgZml4ZWQgZGlzdGFuY2UgY29kZXMgYWxzbyBoYXZlIHR3byBpbnZhbGlkIHN5bWJvbHMgdGhhdCBzaG91bGQgcmVzdWx0Ci0gKiAgIGluIGFuIGVycm9yIGlmIHJlY2VpdmVkLiAgU2luY2UgYWxsIG9mIHRoZSBkaXN0YW5jZSBjb2RlcyBhcmUgdGhlIHNhbWUKLSAqICAgbGVuZ3RoLCB0aGlzIGNhbiBiZSBpbXBsZW1lbnRlZCBhcyBhbiBpbmNvbXBsZXRlIGNvZGUuICBUaGVuIHRoZSBpbnZhbGlkCi0gKiAgIGNvZGVzIGFyZSBkZXRlY3RlZCB3aGlsZSBkZWNvZGluZy4KLSAqLwotbG9jYWwgaW50IGZpeGVkKHN0cnVjdCBzdGF0ZSAqcykKLXsKLSAgICBzdGF0aWMgaW50IHZpcmdpbiA9IDE7Ci0gICAgc3RhdGljIHNob3J0IGxlbmNudFtNQVhCSVRTKzFdLCBsZW5zeW1bRklYTENPREVTXTsKLSAgICBzdGF0aWMgc2hvcnQgZGlzdGNudFtNQVhCSVRTKzFdLCBkaXN0c3ltW01BWERDT0RFU107Ci0gICAgc3RhdGljIHN0cnVjdCBodWZmbWFuIGxlbmNvZGUsIGRpc3Rjb2RlOwotCi0gICAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi8KLSAgICBpZiAodmlyZ2luKSB7Ci0gICAgICAgIGludCBzeW1ib2w7Ci0gICAgICAgIHNob3J0IGxlbmd0aHNbRklYTENPREVTXTsKLQotICAgICAgICAvKiBjb25zdHJ1Y3QgbGVuY29kZSBhbmQgZGlzdGNvZGUgKi8KLSAgICAgICAgbGVuY29kZS5jb3VudCA9IGxlbmNudDsKLSAgICAgICAgbGVuY29kZS5zeW1ib2wgPSBsZW5zeW07Ci0gICAgICAgIGRpc3Rjb2RlLmNvdW50ID0gZGlzdGNudDsKLSAgICAgICAgZGlzdGNvZGUuc3ltYm9sID0gZGlzdHN5bTsKLQotICAgICAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqLwotICAgICAgICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IDE0NDsgc3ltYm9sKyspCi0gICAgICAgICAgICBsZW5ndGhzW3N5bWJvbF0gPSA4OwotICAgICAgICBmb3IgKDsgc3ltYm9sIDwgMjU2OyBzeW1ib2wrKykKLSAgICAgICAgICAgIGxlbmd0aHNbc3ltYm9sXSA9IDk7Ci0gICAgICAgIGZvciAoOyBzeW1ib2wgPCAyODA7IHN5bWJvbCsrKQotICAgICAgICAgICAgbGVuZ3Roc1tzeW1ib2xdID0gNzsKLSAgICAgICAgZm9yICg7IHN5bWJvbCA8IEZJWExDT0RFUzsgc3ltYm9sKyspCi0gICAgICAgICAgICBsZW5ndGhzW3N5bWJvbF0gPSA4OwotICAgICAgICBjb25zdHJ1Y3QoJmxlbmNvZGUsIGxlbmd0aHMsIEZJWExDT0RFUyk7Ci0KLSAgICAgICAgLyogZGlzdGFuY2UgdGFibGUgKi8KLSAgICAgICAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCBNQVhEQ09ERVM7IHN5bWJvbCsrKQotICAgICAgICAgICAgbGVuZ3Roc1tzeW1ib2xdID0gNTsKLSAgICAgICAgY29uc3RydWN0KCZkaXN0Y29kZSwgbGVuZ3RocywgTUFYRENPREVTKTsKLQotICAgICAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqLwotICAgICAgICB2aXJnaW4gPSAwOwotICAgIH0KLQotICAgIC8qIGRlY29kZSBkYXRhIHVudGlsIGVuZC1vZi1ibG9jayBjb2RlICovCi0gICAgcmV0dXJuIGNvZGVzKHMsICZsZW5jb2RlLCAmZGlzdGNvZGUpOwotfQotCi0vKgotICogUHJvY2VzcyBhIGR5bmFtaWMgY29kZXMgYmxvY2suCi0gKgotICogRm9ybWF0IG5vdGVzOgotICoKLSAqIC0gQSBkeW5hbWljIGJsb2NrIHN0YXJ0cyB3aXRoIGEgZGVzY3JpcHRpb24gb2YgdGhlIGxpdGVyYWwvbGVuZ3RoIGFuZAotICogICBkaXN0YW5jZSBjb2RlcyBmb3IgdGhhdCBibG9jay4gIE5ldyBkeW5hbWljIGJsb2NrcyBhbGxvdyB0aGUgY29tcHJlc3NvciB0bwotICogICByYXBpZGx5IGFkYXB0IHRvIGNoYW5naW5nIGRhdGEgd2l0aCBuZXcgY29kZXMgb3B0aW1pemVkIGZvciB0aGF0IGRhdGEuCi0gKgotICogLSBUaGUgY29kZXMgdXNlZCBieSB0aGUgZGVmbGF0ZSBmb3JtYXQgYXJlICJjYW5vbmljYWwiLCB3aGljaCBtZWFucyB0aGF0Ci0gKiAgIHRoZSBhY3R1YWwgYml0cyBvZiB0aGUgY29kZXMgYXJlIGdlbmVyYXRlZCBpbiBhbiB1bmFtYmlndW91cyB3YXkgc2ltcGx5Ci0gKiAgIGZyb20gdGhlIG51bWJlciBvZiBiaXRzIGluIGVhY2ggY29kZS4gIFRoZXJlZm9yZSB0aGUgY29kZSBkZXNjcmlwdGlvbnMKLSAqICAgYXJlIHNpbXBseSBhIGxpc3Qgb2YgY29kZSBsZW5ndGhzIGZvciBlYWNoIHN5bWJvbC4KLSAqCi0gKiAtIFRoZSBjb2RlIGxlbmd0aHMgYXJlIHN0b3JlZCBpbiBvcmRlciBmb3IgdGhlIHN5bWJvbHMsIHNvIGxlbmd0aHMgYXJlCi0gKiAgIHByb3ZpZGVkIGZvciBlYWNoIG9mIHRoZSBsaXRlcmFsL2xlbmd0aCBzeW1ib2xzLCBhbmQgZm9yIGVhY2ggb2YgdGhlCi0gKiAgIGRpc3RhbmNlIHN5bWJvbHMuCi0gKgotICogLSBJZiBhIHN5bWJvbCBpcyBub3QgdXNlZCBpbiB0aGUgYmxvY2ssIHRoaXMgaXMgcmVwcmVzZW50ZWQgYnkgYSB6ZXJvIGFzCi0gKiAgIGFzIHRoZSBjb2RlIGxlbmd0aC4gIFRoaXMgZG9lcyBub3QgbWVhbiBhIHplcm8tbGVuZ3RoIGNvZGUsIGJ1dCByYXRoZXIKLSAqICAgdGhhdCBubyBjb2RlIHNob3VsZCBiZSBjcmVhdGVkIGZvciB0aGlzIHN5bWJvbC4gIFRoZXJlIGlzIG5vIHdheSBpbiB0aGUKLSAqICAgZGVmbGF0ZSBmb3JtYXQgdG8gcmVwcmVzZW50IGEgemVyby1sZW5ndGggY29kZS4KLSAqCi0gKiAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBiaXRzIGluIGEgY29kZSBpcyAxNSwgc28gdGhlIHBvc3NpYmxlIGxlbmd0aHMgZm9yCi0gKiAgIGFueSBjb2RlIGFyZSAxLi4xNS4KLSAqCi0gKiAtIFRoZSBmYWN0IHRoYXQgYSBsZW5ndGggb2YgemVybyBpcyBub3QgcGVybWl0dGVkIGZvciBhIGNvZGUgaGFzIGFuCi0gKiAgIGludGVyZXN0aW5nIGNvbnNlcXVlbmNlLiAgTm9ybWFsbHkgaWYgb25seSBvbmUgc3ltYm9sIGlzIHVzZWQgZm9yIGEgZ2l2ZW4KLSAqICAgY29kZSwgdGhlbiBpbiBmYWN0IHRoYXQgY29kZSBjb3VsZCBiZSByZXByZXNlbnRlZCB3aXRoIHplcm8gYml0cy4gIEhvd2V2ZXIKLSAqICAgaW4gZGVmbGF0ZSwgdGhhdCBjb2RlIGhhcyB0byBiZSBhdCBsZWFzdCBvbmUgYml0LiAgU28gZm9yIGV4YW1wbGUsIGlmCi0gKiAgIG9ubHkgYSBzaW5nbGUgZGlzdGFuY2UgYmFzZSBzeW1ib2wgYXBwZWFycyBpbiBhIGJsb2NrLCB0aGVuIGl0IHdpbGwgYmUKLSAqICAgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgY29kZSBvZiBsZW5ndGggb25lLCBpbiBwYXJ0aWN1bGFyIG9uZSAwIGJpdC4gIFRoaXMKLSAqICAgaXMgYW4gaW5jb21wbGV0ZSBjb2RlLCBzaW5jZSBpZiBhIDEgYml0IGlzIHJlY2VpdmVkLCBpdCBoYXMgbm8gbWVhbmluZywKLSAqICAgYW5kIHNob3VsZCByZXN1bHQgaW4gYW4gZXJyb3IuICBTbyBpbmNvbXBsZXRlIGRpc3RhbmNlIGNvZGVzIG9mIG9uZSBzeW1ib2wKLSAqICAgc2hvdWxkIGJlIHBlcm1pdHRlZCwgYW5kIHRoZSByZWNlaXB0IG9mIGludmFsaWQgY29kZXMgc2hvdWxkIGJlIGhhbmRsZWQuCi0gKgotICogLSBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGhhdmUgYSBzaW5nbGUgbGl0ZXJhbC9sZW5ndGggY29kZSwgYnV0IHRoYXQgY29kZQotICogICBtdXN0IGJlIHRoZSBlbmQtb2YtYmxvY2sgY29kZSwgc2luY2UgZXZlcnkgZHluYW1pYyBibG9jayBoYXMgb25lLiAgVGhpcwotICogICBpcyBub3QgdGhlIG1vc3QgZWZmaWNpZW50IHdheSB0byBjcmVhdGUgYW4gZW1wdHkgYmxvY2sgKGFuIGVtcHR5IGZpeGVkCi0gKiAgIGJsb2NrIGlzIGZld2VyIGJpdHMpLCBidXQgaXQgaXMgYWxsb3dlZCBieSB0aGUgZm9ybWF0LiAgU28gaW5jb21wbGV0ZQotICogICBsaXRlcmFsL2xlbmd0aCBjb2RlcyBvZiBvbmUgc3ltYm9sIHNob3VsZCBhbHNvIGJlIHBlcm1pdHRlZC4KLSAqCi0gKiAtIElmIHRoZXJlIGFyZSBvbmx5IGxpdGVyYWwgY29kZXMgYW5kIG5vIGxlbmd0aHMsIHRoZW4gdGhlcmUgYXJlIG5vIGRpc3RhbmNlCi0gKiAgIGNvZGVzLiAgVGhpcyBpcyByZXByZXNlbnRlZCBieSBvbmUgZGlzdGFuY2UgY29kZSB3aXRoIHplcm8gYml0cy4KLSAqCi0gKiAtIFRoZSBsaXN0IG9mIHVwIHRvIDI4NiBsZW5ndGgvbGl0ZXJhbCBsZW5ndGhzIGFuZCB1cCB0byAzMCBkaXN0YW5jZSBsZW5ndGhzCi0gKiAgIGFyZSB0aGVtc2VsdmVzIGNvbXByZXNzZWQgdXNpbmcgSHVmZm1hbiBjb2RlcyBhbmQgcnVuLWxlbmd0aCBlbmNvZGluZy4gIEluCi0gKiAgIHRoZSBsaXN0IG9mIGNvZGUgbGVuZ3RocywgYSAwIHN5bWJvbCBtZWFucyBubyBjb2RlLCBhIDEuLjE1IHN5bWJvbCBtZWFucwotICogICB0aGF0IGxlbmd0aCwgYW5kIHRoZSBzeW1ib2xzIDE2LCAxNywgYW5kIDE4IGFyZSBydW4tbGVuZ3RoIGluc3RydWN0aW9ucy4KLSAqICAgRWFjaCBvZiAxNiwgMTcsIGFuZCAxOCBhcmUgZm9sbHdlZCBieSBleHRyYSBiaXRzIHRvIGRlZmluZSB0aGUgbGVuZ3RoIG9mCi0gKiAgIHRoZSBydW4uICAxNiBjb3BpZXMgdGhlIGxhc3QgbGVuZ3RoIDMgdG8gNiB0aW1lcy4gIDE3IHJlcHJlc2VudHMgMyB0byAxMAotICogICB6ZXJvIGxlbmd0aHMsIGFuZCAxOCByZXByZXNlbnRzIDExIHRvIDEzOCB6ZXJvIGxlbmd0aHMuICBVbnVzZWQgc3ltYm9scwotICogICBhcmUgY29tbW9uLCBoZW5jZSB0aGUgc3BlY2lhbCBjb2RpbmcgZm9yIHplcm8gbGVuZ3Rocy4KLSAqCi0gKiAtIFRoZSBzeW1ib2xzIGZvciAwLi4xOCBhcmUgSHVmZm1hbiBjb2RlZCwgYW5kIHNvIHRoYXQgY29kZSBtdXN0IGJlCi0gKiAgIGRlc2NyaWJlZCBmaXJzdC4gIFRoaXMgaXMgc2ltcGx5IGEgc2VxdWVuY2Ugb2YgdXAgdG8gMTkgdGhyZWUtYml0IHZhbHVlcwotICogICByZXByZXNlbnRpbmcgbm8gY29kZSAoMCkgb3IgdGhlIGNvZGUgbGVuZ3RoIGZvciB0aGF0IHN5bWJvbCAoMS4uNykuCi0gKgotICogLSBBIGR5bmFtaWMgYmxvY2sgc3RhcnRzIHdpdGggdGhyZWUgZml4ZWQtc2l6ZSBjb3VudHMgZnJvbSB3aGljaCBpcyBjb21wdXRlZAotICogICB0aGUgbnVtYmVyIG9mIGxpdGVyYWwvbGVuZ3RoIGNvZGUgbGVuZ3RocywgdGhlIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlCi0gKiAgIGxlbmd0aHMsIGFuZCB0aGUgbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAob2ssIHlvdSBjb21lIHVwIHdpdGgKLSAqICAgYSBiZXR0ZXIgbmFtZSEpIGluIHRoZSBjb2RlIGRlc2NyaXB0aW9ucy4gIEZvciB0aGUgbGl0ZXJhbC9sZW5ndGggYW5kCi0gKiAgIGRpc3RhbmNlIGNvZGVzLCBsZW5ndGhzIGFmdGVyIHRob3NlIHByb3ZpZGVkIGFyZSBjb25zaWRlcmVkIHplcm8sIGkuZS4gbm8KLSAqICAgY29kZS4gIFRoZSBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgYXJlIHJlY2VpdmVkIGluIGEgcGVybXV0ZWQgb3JkZXIgKHNlZQotICogICB0aGUgb3JkZXJbXSBhcnJheSBiZWxvdykgdG8gbWFrZSBhIHNob3J0IGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RoIGxpc3QgbW9yZQotICogICBsaWtlbHkuICBBcyBpdCB0dXJucyBvdXQsIHZlcnkgc2hvcnQgYW5kIHZlcnkgbG9uZyBjb2RlcyBhcmUgbGVzcyBsaWtlbHkKLSAqICAgdG8gYmUgc2VlbiBpbiBhIGR5bmFtaWMgY29kZSBkZXNjcmlwdGlvbiwgaGVuY2Ugd2hhdCBtYXkgYXBwZWFyIGluaXRpYWxseQotICogICB0byBiZSBhIHBlY3VsaWFyIG9yZGVyaW5nLgotICoKLSAqIC0gR2l2ZW4gdGhlIG51bWJlciBvZiBsaXRlcmFsL2xlbmd0aCBjb2RlIGxlbmd0aHMgKG5sZW4pIGFuZCBkaXN0YW5jZSBjb2RlCi0gKiAgIGxlbmd0aHMgKG5kaXN0KSwgdGhlbiB0aGV5IGFyZSB0cmVhdGVkIGFzIG9uZSBsb25nIGxpc3Qgb2YgbmxlbiArIG5kaXN0Ci0gKiAgIGNvZGUgbGVuZ3Rocy4gIFRoZXJlZm9yZSBydW4tbGVuZ3RoIGNvZGluZyBjYW4gYW5kIG9mdGVuIGRvZXMgY3Jvc3MgdGhlCi0gKiAgIGJvdW5kYXJ5IGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGxlbmd0aHMuCi0gKgotICogLSBTbyB0byBzdW1tYXJpemUsIHRoZSBjb2RlIGRlc2NyaXB0aW9uIGF0IHRoZSBzdGFydCBvZiBhIGR5bmFtaWMgYmxvY2sgaXMKLSAqICAgdGhyZWUgY291bnRzIGZvciB0aGUgbnVtYmVyIG9mIGNvZGUgbGVuZ3RocyBmb3IgdGhlIGxpdGVyYWwvbGVuZ3RoIGNvZGVzLAotICogICB0aGUgZGlzdGFuY2UgY29kZXMsIGFuZCB0aGUgY29kZSBsZW5ndGggY29kZXMuICBUaGlzIGlzIGZvbGxvd2VkIGJ5IHRoZQotICogICBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMsIHRocmVlIGJpdHMgZWFjaC4gIFRoaXMgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlCi0gKiAgIGNvZGUgbGVuZ3RoIGNvZGUgd2hpY2ggaXMgdXNlZCB0byByZWFkIHRoZSByZW1haW5kZXIgb2YgdGhlIGxlbmd0aHMuICBUaGVuCi0gKiAgIHRoZSBsaXRlcmFsL2xlbmd0aCBjb2RlIGxlbmd0aHMgYW5kIGRpc3RhbmNlIGxlbmd0aHMgYXJlIHJlYWQgYXMgYSBzaW5nbGUKLSAqICAgc2V0IG9mIGxlbmd0aHMgdXNpbmcgdGhlIGNvZGUgbGVuZ3RoIGNvZGVzLiAgQ29kZXMgYXJlIGNvbnN0cnVjdGVkIGZyb20KLSAqICAgdGhlIHJlc3VsdGluZyB0d28gc2V0cyBvZiBsZW5ndGhzLCBhbmQgdGhlbiBmaW5hbGx5IHlvdSBjYW4gc3RhcnQKLSAqICAgZGVjb2RpbmcgYWN0dWFsIGNvbXByZXNzZWQgZGF0YSBpbiB0aGUgYmxvY2suCi0gKgotICogLSBGb3IgcmVmZXJlbmNlLCBhICJ0eXBpY2FsIiBzaXplIGZvciB0aGUgY29kZSBkZXNjcmlwdGlvbiBpbiBhIGR5bmFtaWMKLSAqICAgYmxvY2sgaXMgYXJvdW5kIDgwIGJ5dGVzLgotICovCi1sb2NhbCBpbnQgZHluYW1pYyhzdHJ1Y3Qgc3RhdGUgKnMpCi17Ci0gICAgaW50IG5sZW4sIG5kaXN0LCBuY29kZTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aHMgaW4gZGVzY3JpcHRvciAqLwotICAgIGludCBpbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGxlbmd0aHNbXSAqLwotICAgIGludCBlcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnN0cnVjdCgpIHJldHVybiB2YWx1ZSAqLwotICAgIHNob3J0IGxlbmd0aHNbTUFYQ09ERVNdOyAgICAgICAgICAgIC8qIGRlc2NyaXB0b3IgY29kZSBsZW5ndGhzICovCi0gICAgc2hvcnQgbGVuY250W01BWEJJVFMrMV0sIGxlbnN5bVtNQVhMQ09ERVNdOyAgICAgICAgIC8qIGxlbmNvZGUgbWVtb3J5ICovCi0gICAgc2hvcnQgZGlzdGNudFtNQVhCSVRTKzFdLCBkaXN0c3ltW01BWERDT0RFU107ICAgICAgIC8qIGRpc3Rjb2RlIG1lbW9yeSAqLwotICAgIHN0cnVjdCBodWZmbWFuIGxlbmNvZGUsIGRpc3Rjb2RlOyAgIC8qIGxlbmd0aCBhbmQgZGlzdGFuY2UgY29kZXMgKi8KLSAgICBzdGF0aWMgY29uc3Qgc2hvcnQgb3JkZXJbMTldID0gICAgICAvKiBwZXJtdXRhdGlvbiBvZiBjb2RlIGxlbmd0aCBjb2RlcyAqLwotICAgICAgICB7MTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNX07Ci0KLSAgICAvKiBjb25zdHJ1Y3QgbGVuY29kZSBhbmQgZGlzdGNvZGUgKi8KLSAgICBsZW5jb2RlLmNvdW50ID0gbGVuY250OwotICAgIGxlbmNvZGUuc3ltYm9sID0gbGVuc3ltOwotICAgIGRpc3Rjb2RlLmNvdW50ID0gZGlzdGNudDsKLSAgICBkaXN0Y29kZS5zeW1ib2wgPSBkaXN0c3ltOwotCi0gICAgLyogZ2V0IG51bWJlciBvZiBsZW5ndGhzIGluIGVhY2ggdGFibGUsIGNoZWNrIGxlbmd0aHMgKi8KLSAgICBubGVuID0gYml0cyhzLCA1KSArIDI1NzsKLSAgICBuZGlzdCA9IGJpdHMocywgNSkgKyAxOwotICAgIG5jb2RlID0gYml0cyhzLCA0KSArIDQ7Ci0gICAgaWYgKG5sZW4gPiBNQVhMQ09ERVMgfHwgbmRpc3QgPiBNQVhEQ09ERVMpCi0gICAgICAgIHJldHVybiAtMzsgICAgICAgICAgICAgICAgICAgICAgLyogYmFkIGNvdW50cyAqLwotCi0gICAgLyogcmVhZCBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKHJlYWxseSksIG1pc3NpbmcgbGVuZ3RocyBhcmUgemVybyAqLwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5jb2RlOyBpbmRleCsrKQotICAgICAgICBsZW5ndGhzW29yZGVyW2luZGV4XV0gPSBiaXRzKHMsIDMpOwotICAgIGZvciAoOyBpbmRleCA8IDE5OyBpbmRleCsrKQotICAgICAgICBsZW5ndGhzW29yZGVyW2luZGV4XV0gPSAwOwotCi0gICAgLyogYnVpbGQgaHVmZm1hbiB0YWJsZSBmb3IgY29kZSBsZW5ndGhzIGNvZGVzICh1c2UgbGVuY29kZSB0ZW1wb3JhcmlseSkgKi8KLSAgICBlcnIgPSBjb25zdHJ1Y3QoJmxlbmNvZGUsIGxlbmd0aHMsIDE5KTsKLSAgICBpZiAoZXJyICE9IDApICAgICAgICAgICAgICAgLyogcmVxdWlyZSBjb21wbGV0ZSBjb2RlIHNldCBoZXJlICovCi0gICAgICAgIHJldHVybiAtNDsKLQotICAgIC8qIHJlYWQgbGVuZ3RoL2xpdGVyYWwgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RoIHRhYmxlcyAqLwotICAgIGluZGV4ID0gMDsKLSAgICB3aGlsZSAoaW5kZXggPCBubGVuICsgbmRpc3QpIHsKLSAgICAgICAgaW50IHN5bWJvbDsgICAgICAgICAgICAgLyogZGVjb2RlZCB2YWx1ZSAqLwotICAgICAgICBpbnQgbGVuOyAgICAgICAgICAgICAgICAvKiBsYXN0IGxlbmd0aCB0byByZXBlYXQgKi8KLQotICAgICAgICBzeW1ib2wgPSBkZWNvZGUocywgJmxlbmNvZGUpOwotICAgICAgICBpZiAoc3ltYm9sIDwgMTYpICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBpbiAwLi4xNSAqLwotICAgICAgICAgICAgbGVuZ3Roc1tpbmRleCsrXSA9IHN5bWJvbDsKLSAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXBlYXQgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgICAgICAgIGxlbiA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBhc3N1bWUgcmVwZWF0aW5nIHplcm9zICovCi0gICAgICAgICAgICBpZiAoc3ltYm9sID09IDE2KSB7ICAgICAgICAgLyogcmVwZWF0IGxhc3QgbGVuZ3RoIDMuLjYgdGltZXMgKi8KLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC01OyAgICAgICAgICAvKiBubyBsYXN0IGxlbmd0aCEgKi8KLSAgICAgICAgICAgICAgICBsZW4gPSBsZW5ndGhzW2luZGV4IC0gMV07ICAgICAgIC8qIGxhc3QgbGVuZ3RoICovCi0gICAgICAgICAgICAgICAgc3ltYm9sID0gMyArIGJpdHMocywgMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzeW1ib2wgPT0gMTcpICAgICAgLyogcmVwZWF0IHplcm8gMy4uMTAgdGltZXMgKi8KLSAgICAgICAgICAgICAgICBzeW1ib2wgPSAzICsgYml0cyhzLCAzKTsKLSAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAvKiA9PSAxOCwgcmVwZWF0IHplcm8gMTEuLjEzOCB0aW1lcyAqLwotICAgICAgICAgICAgICAgIHN5bWJvbCA9IDExICsgYml0cyhzLCA3KTsKLSAgICAgICAgICAgIGlmIChpbmRleCArIHN5bWJvbCA+IG5sZW4gKyBuZGlzdCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTY7ICAgICAgICAgICAgICAvKiB0b28gbWFueSBsZW5ndGhzISAqLwotICAgICAgICAgICAgd2hpbGUgKHN5bWJvbC0tKSAgICAgICAgICAgIC8qIHJlcGVhdCBsYXN0IG9yIHplcm8gc3ltYm9sIHRpbWVzICovCi0gICAgICAgICAgICAgICAgbGVuZ3Roc1tpbmRleCsrXSA9IGxlbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAtLSB0aGVyZSBiZXR0ZXIgYmUgb25lISAqLwotICAgIGlmIChsZW5ndGhzWzI1Nl0gPT0gMCkKLSAgICAgICAgcmV0dXJuIC05OwotCi0gICAgLyogYnVpbGQgaHVmZm1hbiB0YWJsZSBmb3IgbGl0ZXJhbC9sZW5ndGggY29kZXMgKi8KLSAgICBlcnIgPSBjb25zdHJ1Y3QoJmxlbmNvZGUsIGxlbmd0aHMsIG5sZW4pOwotICAgIGlmIChlcnIgJiYgKGVyciA8IDAgfHwgbmxlbiAhPSBsZW5jb2RlLmNvdW50WzBdICsgbGVuY29kZS5jb3VudFsxXSkpCi0gICAgICAgIHJldHVybiAtNzsgICAgICAvKiBpbmNvbXBsZXRlIGNvZGUgb2sgb25seSBmb3Igc2luZ2xlIGxlbmd0aCAxIGNvZGUgKi8KLQotICAgIC8qIGJ1aWxkIGh1ZmZtYW4gdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovCi0gICAgZXJyID0gY29uc3RydWN0KCZkaXN0Y29kZSwgbGVuZ3RocyArIG5sZW4sIG5kaXN0KTsKLSAgICBpZiAoZXJyICYmIChlcnIgPCAwIHx8IG5kaXN0ICE9IGRpc3Rjb2RlLmNvdW50WzBdICsgZGlzdGNvZGUuY291bnRbMV0pKQotICAgICAgICByZXR1cm4gLTg7ICAgICAgLyogaW5jb21wbGV0ZSBjb2RlIG9rIG9ubHkgZm9yIHNpbmdsZSBsZW5ndGggMSBjb2RlICovCi0KLSAgICAvKiBkZWNvZGUgZGF0YSB1bnRpbCBlbmQtb2YtYmxvY2sgY29kZSAqLwotICAgIHJldHVybiBjb2RlcyhzLCAmbGVuY29kZSwgJmRpc3Rjb2RlKTsKLX0KLQotLyoKLSAqIEluZmxhdGUgc291cmNlIHRvIGRlc3QuICBPbiByZXR1cm4sIGRlc3RsZW4gYW5kIHNvdXJjZWxlbiBhcmUgdXBkYXRlZCB0byB0aGUKLSAqIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFuZCB0aGUgc2l6ZSBvZiB0aGUgZGVmbGF0ZSBkYXRhIHJlc3BlY3RpdmVseS4KLSAqIE9uIHN1Y2Nlc3MsIHRoZSByZXR1cm4gdmFsdWUgb2YgcHVmZigpIGlzIHplcm8uICBJZiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUKLSAqIHNvdXJjZSBkYXRhLCBpLmUuIGl0IGlzIG5vdCBpbiB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZW4gYSBuZWdhdGl2ZSB2YWx1ZSBpcwotICogcmV0dXJuZWQuICBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIGlucHV0IGF2YWlsYWJsZSBvciB0aGVyZSBpcyBub3QgZW5vdWdoCi0gKiBvdXRwdXQgc3BhY2UsIHRoZW4gYSBwb3NpdGl2ZSBlcnJvciBpcyByZXR1cm5lZC4gIEluIHRoYXQgY2FzZSwgZGVzdGxlbiBhbmQKLSAqIHNvdXJjZWxlbiBhcmUgbm90IHVwZGF0ZWQgdG8gZmFjaWxpdGF0ZSByZXRyeWluZyBmcm9tIHRoZSBiZWdpbm5pbmcgd2l0aCB0aGUKLSAqIHByb3Zpc2lvbiBvZiBtb3JlIGlucHV0IGRhdGEgb3IgbW9yZSBvdXRwdXQgc3BhY2UuICBJbiB0aGUgY2FzZSBvZiBpbnZhbGlkCi0gKiBpbmZsYXRlIGRhdGEgKGEgbmVnYXRpdmUgZXJyb3IpLCB0aGUgZGVzdCBhbmQgc291cmNlIHBvaW50ZXJzIGFyZSB1cGRhdGVkIHRvCi0gKiBmYWNpbGl0YXRlIHRoZSBkZWJ1Z2dpbmcgb2YgZGVmbGF0b3JzLgotICoKLSAqIHB1ZmYoKSBhbHNvIGhhcyBhIG1vZGUgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgb3V0cHV0IHdpdGgKLSAqIG5vIG91dHB1dCB3cml0dGVuLiAgRm9yIHRoaXMgZGVzdCBtdXN0IGJlICh1bnNpZ25lZCBjaGFyICopMC4gIEluIHRoaXMgY2FzZSwKLSAqIHRoZSBpbnB1dCB2YWx1ZSBvZiAqZGVzdGxlbiBpcyBpZ25vcmVkLCBhbmQgb24gcmV0dXJuICpkZXN0bGVuIGlzIHNldCB0byB0aGUKLSAqIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQuCi0gKgotICogVGhlIHJldHVybiBjb2RlcyBhcmU6Ci0gKgotICogICAyOiAgYXZhaWxhYmxlIGluZmxhdGUgZGF0YSBkaWQgbm90IHRlcm1pbmF0ZQotICogICAxOiAgb3V0cHV0IHNwYWNlIGV4aGF1c3RlZCBiZWZvcmUgY29tcGxldGluZyBpbmZsYXRlCi0gKiAgIDA6ICBzdWNjZXNzZnVsIGluZmxhdGUKLSAqICAtMTogIGludmFsaWQgYmxvY2sgdHlwZSAodHlwZSA9PSAzKQotICogIC0yOiAgc3RvcmVkIGJsb2NrIGxlbmd0aCBkaWQgbm90IG1hdGNoIG9uZSdzIGNvbXBsZW1lbnQKLSAqICAtMzogIGR5bmFtaWMgYmxvY2sgY29kZSBkZXNjcmlwdGlvbjogdG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIGNvZGVzCi0gKiAgLTQ6ICBkeW5hbWljIGJsb2NrIGNvZGUgZGVzY3JpcHRpb246IGNvZGUgbGVuZ3RocyBjb2RlcyBpbmNvbXBsZXRlCi0gKiAgLTU6ICBkeW5hbWljIGJsb2NrIGNvZGUgZGVzY3JpcHRpb246IHJlcGVhdCBsZW5ndGhzIHdpdGggbm8gZmlyc3QgbGVuZ3RoCi0gKiAgLTY6ICBkeW5hbWljIGJsb2NrIGNvZGUgZGVzY3JpcHRpb246IHJlcGVhdCBtb3JlIHRoYW4gc3BlY2lmaWVkIGxlbmd0aHMKLSAqICAtNzogIGR5bmFtaWMgYmxvY2sgY29kZSBkZXNjcmlwdGlvbjogaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIGxlbmd0aHMKLSAqICAtODogIGR5bmFtaWMgYmxvY2sgY29kZSBkZXNjcmlwdGlvbjogaW52YWxpZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMKLSAqICAtOTogIGR5bmFtaWMgYmxvY2sgY29kZSBkZXNjcmlwdGlvbjogbWlzc2luZyBlbmQtb2YtYmxvY2sgY29kZQotICogLTEwOiAgaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBvciBkaXN0YW5jZSBjb2RlIGluIGZpeGVkIG9yIGR5bmFtaWMgYmxvY2sKLSAqIC0xMTogIGRpc3RhbmNlIGlzIHRvbyBmYXIgYmFjayBpbiBmaXhlZCBvciBkeW5hbWljIGJsb2NrCi0gKgotICogRm9ybWF0IG5vdGVzOgotICoKLSAqIC0gVGhyZWUgYml0cyBhcmUgcmVhZCBmb3IgZWFjaCBibG9jayB0byBkZXRlcm1pbmUgdGhlIGtpbmQgb2YgYmxvY2sgYW5kCi0gKiAgIHdoZXRoZXIgb3Igbm90IGl0IGlzIHRoZSBsYXN0IGJsb2NrLiAgVGhlbiB0aGUgYmxvY2sgaXMgZGVjb2RlZCBhbmQgdGhlCi0gKiAgIHByb2Nlc3MgcmVwZWF0ZWQgaWYgaXQgd2FzIG5vdCB0aGUgbGFzdCBibG9jay4KLSAqCi0gKiAtIFRoZSBsZWZ0b3ZlciBiaXRzIGluIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGRlZmxhdGUgZGF0YSBhZnRlciB0aGUgbGFzdAotICogICBibG9jayAoaWYgaXQgd2FzIGEgZml4ZWQgb3IgZHluYW1pYyBibG9jaykgYXJlIHVuZGVmaW5lZCBhbmQgaGF2ZSBubwotICogICBleHBlY3RlZCB2YWx1ZXMgdG8gY2hlY2suCi0gKi8KLWludCBwdWZmKHVuc2lnbmVkIGNoYXIgKmRlc3QsICAgICAgICAgICAvKiBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KLSAgICAgICAgIHVuc2lnbmVkIGxvbmcgKmRlc3RsZW4sICAgICAgICAvKiBhbW91bnQgb2Ygb3V0cHV0IHNwYWNlICovCi0gICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsICAgLyogcG9pbnRlciB0byBzb3VyY2UgZGF0YSBwb2ludGVyICovCi0gICAgICAgICB1bnNpZ25lZCBsb25nICpzb3VyY2VsZW4pICAgICAgLyogYW1vdW50IG9mIGlucHV0IGF2YWlsYWJsZSAqLwotewotICAgIHN0cnVjdCBzdGF0ZSBzOyAgICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgc3RhdGUgKi8KLSAgICBpbnQgbGFzdCwgdHlwZTsgICAgICAgICAgICAgLyogYmxvY2sgaW5mb3JtYXRpb24gKi8KLSAgICBpbnQgZXJyOyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHZhbHVlICovCi0KLSAgICAvKiBpbml0aWFsaXplIG91dHB1dCBzdGF0ZSAqLwotICAgIHMub3V0ID0gZGVzdDsKLSAgICBzLm91dGxlbiA9ICpkZXN0bGVuOyAgICAgICAgICAgICAgICAvKiBpZ25vcmVkIGlmIGRlc3QgaXMgTklMICovCi0gICAgcy5vdXRjbnQgPSAwOwotCi0gICAgLyogaW5pdGlhbGl6ZSBpbnB1dCBzdGF0ZSAqLwotICAgIHMuaW4gPSBzb3VyY2U7Ci0gICAgcy5pbmxlbiA9ICpzb3VyY2VsZW47Ci0gICAgcy5pbmNudCA9IDA7Ci0gICAgcy5iaXRidWYgPSAwOwotICAgIHMuYml0Y250ID0gMDsKLQotICAgIC8qIHJldHVybiBpZiBiaXRzKCkgb3IgZGVjb2RlKCkgdHJpZXMgdG8gcmVhZCBwYXN0IGF2YWlsYWJsZSBpbnB1dCAqLwotICAgIGlmIChzZXRqbXAocy5lbnYpICE9IDApICAgICAgICAgICAgIC8qIGlmIGNhbWUgYmFjayBoZXJlIHZpYSBsb25nam1wKCkgKi8KLSAgICAgICAgZXJyID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNraXAgZG8tbG9vcCwgcmV0dXJuIGVycm9yICovCi0gICAgZWxzZSB7Ci0gICAgICAgIC8qIHByb2Nlc3MgYmxvY2tzIHVudGlsIGxhc3QgYmxvY2sgb3IgZXJyb3IgKi8KLSAgICAgICAgZG8gewotICAgICAgICAgICAgbGFzdCA9IGJpdHMoJnMsIDEpOyAgICAgICAgIC8qIG9uZSBpZiBsYXN0IGJsb2NrICovCi0gICAgICAgICAgICB0eXBlID0gYml0cygmcywgMik7ICAgICAgICAgLyogYmxvY2sgdHlwZSAwLi4zICovCi0gICAgICAgICAgICBlcnIgPSB0eXBlID09IDAgPwotICAgICAgICAgICAgICAgICAgICBzdG9yZWQoJnMpIDoKLSAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXhlZCgmcykgOgotICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gMiA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYygmcykgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xKSk7ICAgICAgIC8qIHR5cGUgPT0gMywgaW52YWxpZCAqLwotICAgICAgICAgICAgaWYgKGVyciAhPSAwKQotICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIHJldHVybiB3aXRoIGVycm9yICovCi0gICAgICAgIH0gd2hpbGUgKCFsYXN0KTsKLSAgICB9Ci0KLSAgICAvKiB1cGRhdGUgdGhlIGxlbmd0aHMgYW5kIHJldHVybiAqLwotICAgIGlmIChlcnIgPD0gMCkgewotICAgICAgICAqZGVzdGxlbiA9IHMub3V0Y250OwotICAgICAgICAqc291cmNlbGVuID0gcy5pbmNudDsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvcHVmZi9wdWZmLmggYi9zcmMvemxpYi9jb250cmliL3B1ZmYvcHVmZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTAwODBhLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvcHVmZi9wdWZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiBwdWZmLmgKLSAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgTWFyayBBZGxlciwgYWxsIHJpZ2h0cyByZXNlcnZlZAotICB2ZXJzaW9uIDIuMiwgMjUgQXByIDIwMTAKLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvciBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLQotICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAotICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKLSAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi0gICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi0gICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KLQotICBNYXJrIEFkbGVyICAgIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKLSAqLwotCi0KLS8qCi0gKiBTZWUgcHVmZi5jIGZvciBwdXJwb3NlIGFuZCB1c2FnZS4KLSAqLwotI2lmbmRlZiBOSUwKLSMgIGRlZmluZSBOSUwgKCh1bnNpZ25lZCBjaGFyICopMCkgICAgICAvKiBmb3Igbm8gb3V0cHV0IG9wdGlvbiAqLwotI2VuZGlmCi0KLWludCBwdWZmKHVuc2lnbmVkIGNoYXIgKmRlc3QsICAgICAgICAgICAvKiBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KLSAgICAgICAgIHVuc2lnbmVkIGxvbmcgKmRlc3RsZW4sICAgICAgICAvKiBhbW91bnQgb2Ygb3V0cHV0IHNwYWNlICovCi0gICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsICAgLyogcG9pbnRlciB0byBzb3VyY2UgZGF0YSBwb2ludGVyICovCi0gICAgICAgICB1bnNpZ25lZCBsb25nICpzb3VyY2VsZW4pOyAgICAgLyogYW1vdW50IG9mIGlucHV0IGF2YWlsYWJsZSAqLwpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi9wdWZmL3B1ZmZ0ZXN0LmMgYi9zcmMvemxpYi9jb250cmliL3B1ZmYvcHVmZnRlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlMzVmNi4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL3B1ZmYvcHVmZnRlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogcHVmZnRlc3QuYwotICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHB1ZmYuaAotICogdmVyc2lvbiAyLjIsIDI1IEFwciAyMDEwCi0gKi8KLQotLyogRXhhbXBsZSBvZiBob3cgdG8gdXNlIHB1ZmYoKS4KLQotICAgVXNhZ2U6IHB1ZmYgWy13XSBbLWZdIFstbm5uXSBmaWxlCi0gICAgICAgICAgLi4uIHwgcHVmZiBbLXddIFstZl0gWy1ubm5dCi0KLSAgIHdoZXJlIGZpbGUgaXMgdGhlIGlucHV0IGZpbGUgd2l0aCBkZWZsYXRlIGRhdGEsIG5ubiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gICBvZiBpbnB1dCB0byBza2lwIGJlZm9yZSBpbmZsYXRpbmcgKGUuZy4gdG8gc2tpcCBhIHpsaWIgb3IgZ3ppcCBoZWFkZXIpLCBhbmQKLSAgIC13IGlzIHVzZWQgdG8gd3JpdGUgdGhlIGRlY29tcHJlc3NlZCBkYXRhIHRvIHN0ZG91dC4gIC1mIGlzIGZvciBjb3ZlcmFnZQotICAgdGVzdGluZywgYW5kIGNhdXNlcyBwdWZmdGVzdCB0byBmYWlsIHdpdGggbm90IGVub3VnaCBvdXRwdXQgc3BhY2UgKC1mIGRvZXMKLSAgIGEgd3JpdGUgbGlrZSAtdywgc28gLXcgaXMgbm90IHJlcXVpcmVkKS4gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAicHVmZi5oIgotCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSMgIGluY2x1ZGUgPGZjbnRsLmg+Ci0jICBpbmNsdWRlIDxpby5oPgotIyAgZGVmaW5lIFNFVF9CSU5BUllfTU9ERShmaWxlKSBzZXRtb2RlKGZpbGVubyhmaWxlKSwgT19CSU5BUlkpCi0jZWxzZQotIyAgZGVmaW5lIFNFVF9CSU5BUllfTU9ERShmaWxlKQotI2VuZGlmCi0KLSNkZWZpbmUgbG9jYWwgc3RhdGljCi0KLS8qIFJldHVybiBzaXplIHRpbWVzIGFwcHJveGltYXRlbHkgdGhlIGN1YmUgcm9vdCBvZiAyLCBrZWVwaW5nIHRoZSByZXN1bHQgYXMgMSwKLSAgIDMsIG9yIDUgdGltZXMgYSBwb3dlciBvZiAyIC0tIHRoZSByZXN1bHQgaXMgYWx3YXlzID4gc2l6ZSwgdW50aWwgdGhlIHJlc3VsdAotICAgaXMgdGhlIG1heGltdW0gdmFsdWUgb2YgYW4gdW5zaWduZWQgbG9uZywgd2hlcmUgaXQgcmVtYWlucy4gIFRoaXMgaXMgdXNlZnVsCi0gICB0byBrZWVwIHJlYWxsb2NhdGlvbnMgbGVzcyB0aGFuIH4zMyUgb3ZlciB0aGUgYWN0dWFsIGRhdGEuICovCi1sb2NhbCBzaXplX3QgYnl0aGlyZHMoc2l6ZV90IHNpemUpCi17Ci0gICAgaW50IG47Ci0gICAgc2l6ZV90IG07Ci0KLSAgICBtID0gc2l6ZTsKLSAgICBmb3IgKG4gPSAwOyBtOyBuKyspCi0gICAgICAgIG0gPj49IDE7Ci0gICAgaWYgKG4gPCAzKQotICAgICAgICByZXR1cm4gc2l6ZSArIDE7Ci0gICAgbiAtPSAzOwotICAgIG0gPSBzaXplID4+IG47Ci0gICAgbSArPSBtID09IDYgPyAyIDogMTsKLSAgICBtIDw8PSBuOwotICAgIHJldHVybiBtID4gc2l6ZSA/IG0gOiAoc2l6ZV90KSgtMSk7Ci19Ci0KLS8qIFJlYWQgdGhlIGlucHV0IGZpbGUgKm5hbWUsIG9yIHN0ZGluIGlmIG5hbWUgaXMgTlVMTCwgaW50byBhbGxvY2F0ZWQgbWVtb3J5LgotICAgUmVhbGxvY2F0ZSB0byBsYXJnZXIgYnVmZmVycyB1bnRpbCB0aGUgZW50aXJlIGZpbGUgaXMgcmVhZCBpbi4gIFJldHVybiBhCi0gICBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgZGF0YSwgb3IgTlVMTCBpZiB0aGVyZSB3YXMgYSBtZW1vcnkgYWxsb2NhdGlvbgotICAgZmFpbHVyZS4gICpsZW4gaXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHJlYWQgZnJvbSB0aGUgaW5wdXQgZmlsZSAoZXZlbgotICAgaWYgbG9hZCgpIHJldHVybnMgTlVMTCkuICBJZiB0aGUgaW5wdXQgZmlsZSB3YXMgZW1wdHkgb3IgY291bGQgbm90IGJlIG9wZW5lZAotICAgb3IgcmVhZCwgKmxlbiBpcyB6ZXJvLiAqLwotbG9jYWwgdm9pZCAqbG9hZChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgKmxlbikKLXsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICB2b2lkICpidWYsICpzd2FwOwotICAgIEZJTEUgKmluOwotCi0gICAgKmxlbiA9IDA7Ci0gICAgYnVmID0gbWFsbG9jKHNpemUgPSA0MDk2KTsKLSAgICBpZiAoYnVmID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGluID0gbmFtZSA9PSBOVUxMID8gc3RkaW4gOiBmb3BlbihuYW1lLCAicmIiKTsKLSAgICBpZiAoaW4gIT0gTlVMTCkgewotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAqbGVuICs9IGZyZWFkKChjaGFyICopYnVmICsgKmxlbiwgMSwgc2l6ZSAtICpsZW4sIGluKTsKLSAgICAgICAgICAgIGlmICgqbGVuIDwgc2l6ZSkgYnJlYWs7Ci0gICAgICAgICAgICBzaXplID0gYnl0aGlyZHMoc2l6ZSk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA9PSAqbGVuIHx8IChzd2FwID0gcmVhbGxvYyhidWYsIHNpemUpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICAgICAgICAgIGJ1ZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWYgPSBzd2FwOwotICAgICAgICB9Ci0gICAgICAgIGZjbG9zZShpbik7Ci0gICAgfQotICAgIHJldHVybiBidWY7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgcmV0LCBwdXQgPSAwLCBmYWlsID0gMDsKLSAgICB1bnNpZ25lZCBza2lwID0gMDsKLSAgICBjaGFyICphcmcsICpuYW1lID0gTlVMTDsKLSAgICB1bnNpZ25lZCBjaGFyICpzb3VyY2UgPSBOVUxMLCAqZGVzdDsKLSAgICBzaXplX3QgbGVuID0gMDsKLSAgICB1bnNpZ25lZCBsb25nIHNvdXJjZWxlbiwgZGVzdGxlbjsKLQotICAgIC8qIHByb2Nlc3MgYXJndW1lbnRzICovCi0gICAgd2hpbGUgKGFyZyA9ICorK2FyZ3YsIC0tYXJnYykKLSAgICAgICAgaWYgKGFyZ1swXSA9PSAnLScpIHsKLSAgICAgICAgICAgIGlmIChhcmdbMV0gPT0gJ3cnICYmIGFyZ1syXSA9PSAwKQotICAgICAgICAgICAgICAgIHB1dCA9IDE7Ci0gICAgICAgICAgICBlbHNlIGlmIChhcmdbMV0gPT0gJ2YnICYmIGFyZ1syXSA9PSAwKQotICAgICAgICAgICAgICAgIGZhaWwgPSAxLCBwdXQgPSAxOwotICAgICAgICAgICAgZWxzZSBpZiAoYXJnWzFdID49ICcwJyAmJiBhcmdbMV0gPD0gJzknKQotICAgICAgICAgICAgICAgIHNraXAgPSAodW5zaWduZWQpYXRvaShhcmcgKyAxKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBvcHRpb24gJXNcbiIsIGFyZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm9ubHkgb25lIGZpbGUgbmFtZSBhbGxvd2VkXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG5hbWUgPSBhcmc7Ci0gICAgc291cmNlID0gbG9hZChuYW1lLCAmbGVuKTsKLSAgICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKLSAgICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCByZWFkICVzLCBvciBpdCB3YXMgZW1wdHlcbiIsCi0gICAgICAgICAgICAgICAgbmFtZSA9PSBOVUxMID8gIjxzdGRpbj4iIDogbmFtZSk7Ci0gICAgICAgIGZyZWUoc291cmNlKTsKLSAgICAgICAgcmV0dXJuIDM7Ci0gICAgfQotICAgIGlmIChza2lwID49IGxlbikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNraXAgcmVxdWVzdCBvZiAlZCBsZWF2ZXMgbm8gaW5wdXRcbiIsIHNraXApOwotICAgICAgICBmcmVlKHNvdXJjZSk7Ci0gICAgICAgIHJldHVybiAzOwotICAgIH0KLQotICAgIC8qIHRlc3QgaW5mbGF0ZSBkYXRhIHdpdGggb2Zmc2V0IHNraXAgKi8KLSAgICBsZW4gLT0gc2tpcDsKLSAgICBzb3VyY2VsZW4gPSAodW5zaWduZWQgbG9uZylsZW47Ci0gICAgcmV0ID0gcHVmZihOSUwsICZkZXN0bGVuLCBzb3VyY2UgKyBza2lwLCAmc291cmNlbGVuKTsKLSAgICBpZiAocmV0KQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInB1ZmYoKSBmYWlsZWQgd2l0aCByZXR1cm4gY29kZSAlZFxuIiwgcmV0KTsKLSAgICBlbHNlIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJwdWZmKCkgc3VjY2VlZGVkIHVuY29tcHJlc3NpbmcgJWx1IGJ5dGVzXG4iLCBkZXN0bGVuKTsKLSAgICAgICAgaWYgKHNvdXJjZWxlbiA8IGxlbikgZnByaW50ZihzdGRlcnIsICIlbHUgY29tcHJlc3NlZCBieXRlcyB1bnVzZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC0gc291cmNlbGVuKTsKLSAgICB9Ci0KLSAgICAvKiBpZiByZXF1ZXN0ZWQsIGluZmxhdGUgYWdhaW4gYW5kIHdyaXRlIGRlY29tcHJlc3NkIGRhdGEgdG8gc3Rkb3V0ICovCi0gICAgaWYgKHB1dCAmJiByZXQgPT0gMCkgewotICAgICAgICBpZiAoZmFpbCkKLSAgICAgICAgICAgIGRlc3RsZW4gPj49IDE7Ci0gICAgICAgIGRlc3QgPSBtYWxsb2MoZGVzdGxlbik7Ci0gICAgICAgIGlmIChkZXN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIik7Ci0gICAgICAgICAgICBmcmVlKHNvdXJjZSk7Ci0gICAgICAgICAgICByZXR1cm4gNDsKLSAgICAgICAgfQotICAgICAgICBwdWZmKGRlc3QsICZkZXN0bGVuLCBzb3VyY2UgKyBza2lwLCAmc291cmNlbGVuKTsKLSAgICAgICAgU0VUX0JJTkFSWV9NT0RFKHN0ZG91dCk7Ci0gICAgICAgIGZ3cml0ZShkZXN0LCAxLCBkZXN0bGVuLCBzdGRvdXQpOwotICAgICAgICBmcmVlKGRlc3QpOwotICAgIH0KLQotICAgIC8qIGNsZWFuIHVwICovCi0gICAgZnJlZShzb3VyY2UpOwotICAgIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL3B1ZmYvemVyb3MucmF3IGIvc3JjL3psaWIvY29udHJpYi9wdWZmL3plcm9zLnJhdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5MGU3Ni4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL3B1ZmYvemVyb3MucmF3CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi5jIGIvc3JjL3psaWIvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTU5YTM2Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2NvbnRyaWIvdGVzdHpsaWIvdGVzdHpsaWIuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJ6bGliLmgiCi0KLQotdm9pZCBNeURvTWludXM2NChMQVJHRV9JTlRFR0VSICpSLExBUkdFX0lOVEVHRVIgQSxMQVJHRV9JTlRFR0VSIEIpCi17Ci0gICAgUi0+SGlnaFBhcnQgPSBBLkhpZ2hQYXJ0IC0gQi5IaWdoUGFydDsKLSAgICBpZiAoQS5Mb3dQYXJ0ID49IEIuTG93UGFydCkKLSAgICAgICAgUi0+TG93UGFydCA9IEEuTG93UGFydCAtIEIuTG93UGFydDsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBSLT5Mb3dQYXJ0ID0gQS5Mb3dQYXJ0IC0gQi5Mb3dQYXJ0OwotICAgICAgICBSLT5IaWdoUGFydCAtLTsKLSAgICB9Ci19Ci0KLSNpZmRlZiBfTV9YNjQKLS8vIHNlZSBodHRwOi8vbXNkbjIubWljcm9zb2Z0LmNvbS9saWJyYXJ5L3R3Y2hoZTk1KGVuLXVzLHZzLjgwKS5hc3B4IGZvciBfX3JkdHNjCi11bnNpZ25lZCBfX2ludDY0IF9fcmR0c2Modm9pZCk7Ci12b2lkIEJlZ2luQ291bnRSZHRzYyhMQVJHRV9JTlRFR0VSICogcGJlZ2luVGltZTY0KQotewotIC8vICAgcHJpbnRmKCJyZHRzYyA9ICVJNjR4XG4iLF9fcmR0c2MoKSk7Ci0gICBwYmVnaW5UaW1lNjQtPlF1YWRQYXJ0PV9fcmR0c2MoKTsKLX0KLQotTEFSR0VfSU5URUdFUiBHZXRSZXNSZHRzYyhMQVJHRV9JTlRFR0VSIGJlZ2luVGltZTY0LEJPT0wgZkNvbXB1dGVUaW1lUXVlcnlQZXJmKQotewotICAgIExBUkdFX0lOVEVHRVIgTElyZXM7Ci0gICAgdW5zaWduZWQgX2ludDY0IHJlcz1fX3JkdHNjKCktKCh1bnNpZ25lZCBfaW50NjQpKGJlZ2luVGltZTY0LlF1YWRQYXJ0KSk7Ci0gICAgTElyZXMuUXVhZFBhcnQ9cmVzOwotICAgLy8gcHJpbnRmKCJyZHRzYyA9ICVJNjR4XG4iLF9fcmR0c2MoKSk7Ci0gICAgcmV0dXJuIExJcmVzOwotfQotI2Vsc2UKLSNpZmRlZiBfTV9JWDg2Ci12b2lkIG15R2V0UkRUU0MzMihMQVJHRV9JTlRFR0VSICogcGJlZ2luVGltZTY0KQotewotICAgIERXT1JEIGR3RWR4LGR3RWF4OwotICAgIF9hc20KLSAgICB7Ci0gICAgICAgIHJkdHNjCi0gICAgICAgIG1vdiBkd0VheCxlYXgKLSAgICAgICAgbW92IGR3RWR4LGVkeAotICAgIH0KLSAgICBwYmVnaW5UaW1lNjQtPkxvd1BhcnQ9ZHdFYXg7Ci0gICAgcGJlZ2luVGltZTY0LT5IaWdoUGFydD1kd0VkeDsKLX0KLQotdm9pZCBCZWdpbkNvdW50UmR0c2MoTEFSR0VfSU5URUdFUiAqIHBiZWdpblRpbWU2NCkKLXsKLSAgICBteUdldFJEVFNDMzIocGJlZ2luVGltZTY0KTsKLX0KLQotTEFSR0VfSU5URUdFUiBHZXRSZXNSZHRzYyhMQVJHRV9JTlRFR0VSIGJlZ2luVGltZTY0LEJPT0wgZkNvbXB1dGVUaW1lUXVlcnlQZXJmKQotewotICAgIExBUkdFX0lOVEVHRVIgTElyZXMsZW5kVGltZTY0OwotICAgIG15R2V0UkRUU0MzMigmZW5kVGltZTY0KTsKLQotICAgIExJcmVzLkxvd1BhcnQ9TElyZXMuSGlnaFBhcnQ9MDsKLSAgICBNeURvTWludXM2NCgmTElyZXMsZW5kVGltZTY0LGJlZ2luVGltZTY0KTsKLSAgICByZXR1cm4gTElyZXM7Ci19Ci0jZWxzZQotdm9pZCBteUdldFJEVFNDMzIoTEFSR0VfSU5URUdFUiAqIHBiZWdpblRpbWU2NCkKLXsKLX0KLQotdm9pZCBCZWdpbkNvdW50UmR0c2MoTEFSR0VfSU5URUdFUiAqIHBiZWdpblRpbWU2NCkKLXsKLX0KLQotTEFSR0VfSU5URUdFUiBHZXRSZXNSZHRzYyhMQVJHRV9JTlRFR0VSIGJlZ2luVGltZTY0LEJPT0wgZkNvbXB1dGVUaW1lUXVlcnlQZXJmKQotewotICAgIExBUkdFX0lOVEVHRVIgbHI7Ci0gICAgbHIuUXVhZFBhcnQ9MDsKLSAgICByZXR1cm4gbHI7Ci19Ci0jZW5kaWYKLSNlbmRpZgotCi12b2lkIEJlZ2luQ291bnRQZXJmQ291bnRlcihMQVJHRV9JTlRFR0VSICogcGJlZ2luVGltZTY0LEJPT0wgZkNvbXB1dGVUaW1lUXVlcnlQZXJmKQotewotICAgIGlmICgoIWZDb21wdXRlVGltZVF1ZXJ5UGVyZikgfHwgKCFRdWVyeVBlcmZvcm1hbmNlQ291bnRlcihwYmVnaW5UaW1lNjQpKSkKLSAgICB7Ci0gICAgICAgIHBiZWdpblRpbWU2NC0+TG93UGFydCA9IEdldFRpY2tDb3VudCgpOwotICAgICAgICBwYmVnaW5UaW1lNjQtPkhpZ2hQYXJ0ID0gMDsKLSAgICB9Ci19Ci0KLURXT1JEIEdldE1zZWNTaW5jZVBlcmZDb3VudGVyKExBUkdFX0lOVEVHRVIgYmVnaW5UaW1lNjQsQk9PTCBmQ29tcHV0ZVRpbWVRdWVyeVBlcmYpCi17Ci0gICAgTEFSR0VfSU5URUdFUiBlbmRUaW1lNjQsdGlja3NQZXJTZWNvbmQsdGlja3M7Ci0gICAgRFdPUkRMT05HIHRpY2tzU2hpZnRlZCx0aWNrU2VjU2hpZnRlZDsKLSAgICBEV09SRCBkd0xvZz0xNiswOwotICAgIERXT1JEIGR3UmV0OwotICAgIGlmICgoIWZDb21wdXRlVGltZVF1ZXJ5UGVyZikgfHwgKCFRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmZW5kVGltZTY0KSkpCi0gICAgICAgIGR3UmV0ID0gKEdldFRpY2tDb3VudCgpIC0gYmVnaW5UaW1lNjQuTG93UGFydCkqMTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBNeURvTWludXM2NCgmdGlja3MsZW5kVGltZTY0LGJlZ2luVGltZTY0KTsKLSAgICAgICAgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmdGlja3NQZXJTZWNvbmQpOwotCi0KLSAgICAgICAgewotICAgICAgICAgICAgdGlja3NTaGlmdGVkID0gSW50NjRTaHJsTW9kMzIoKihEV09SRExPTkcqKSZ0aWNrcyxkd0xvZyk7Ci0gICAgICAgICAgICB0aWNrU2VjU2hpZnRlZCA9IEludDY0U2hybE1vZDMyKCooRFdPUkRMT05HKikmdGlja3NQZXJTZWNvbmQsZHdMb2cpOwotCi0gICAgICAgIH0KLQotICAgICAgICBkd1JldCA9IChEV09SRCkoKCgoRFdPUkQpdGlja3NTaGlmdGVkKSoxMDAwKS8oRFdPUkQpKHRpY2tTZWNTaGlmdGVkKSk7Ci0gICAgICAgIGR3UmV0ICo9MTsKLSAgICB9Ci0gICAgcmV0dXJuIGR3UmV0OwotfQotCi1pbnQgUmVhZEZpbGVNZW1vcnkoY29uc3QgY2hhciogZmlsZW5hbWUsbG9uZyogcGxGaWxlU2l6ZSx2b2lkKiogcEZpbGVQdHIpCi17Ci0gICAgRklMRSogc3RyZWFtOwotICAgIHZvaWQqIHB0cjsKLSAgICBpbnQgcmV0VmFsPTE7Ci0gICAgc3RyZWFtPWZvcGVuKGZpbGVuYW1lLCAicmIiKTsKLSAgICBpZiAoc3RyZWFtPT1OVUxMKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGZzZWVrKHN0cmVhbSwwLFNFRUtfRU5EKTsKLQotICAgICpwbEZpbGVTaXplPWZ0ZWxsKHN0cmVhbSk7Ci0gICAgZnNlZWsoc3RyZWFtLDAsU0VFS19TRVQpOwotICAgIHB0cj1tYWxsb2MoKCpwbEZpbGVTaXplKSsxKTsKLSAgICBpZiAocHRyPT1OVUxMKQotICAgICAgICByZXRWYWw9MDsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoZnJlYWQocHRyLCAxLCAqcGxGaWxlU2l6ZSxzdHJlYW0pICE9ICgqcGxGaWxlU2l6ZSkpCi0gICAgICAgICAgICByZXRWYWw9MDsKLSAgICB9Ci0gICAgZmNsb3NlKHN0cmVhbSk7Ci0gICAgKnBGaWxlUHRyPXB0cjsKLSAgICByZXR1cm4gcmV0VmFsOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICAgIGludCBCbG9ja1NpemVDb21wcmVzcz0weDgwMDA7Ci0gICAgaW50IEJsb2NrU2l6ZVVuY29tcHJlc3M9MHg4MDAwOwotICAgIGludCBjcHJMZXZlbD1aX0RFRkFVTFRfQ09NUFJFU1NJT04gOwotICAgIGxvbmcgbEZpbGVTaXplOwotICAgIHVuc2lnbmVkIGNoYXIqIEZpbGVQdHI7Ci0gICAgbG9uZyBsQnVmZmVyU2l6ZUNwcjsKLSAgICBsb25nIGxCdWZmZXJTaXplVW5jcHI7Ci0gICAgbG9uZyBsQ29tcHJlc3NlZFNpemU9MDsKLSAgICB1bnNpZ25lZCBjaGFyKiBDcHJQdHI7Ci0gICAgdW5zaWduZWQgY2hhciogVW5jcHJQdHI7Ci0gICAgbG9uZyBsU2l6ZUNwcixsU2l6ZVVuY3ByOwotICAgIERXT1JEIGR3R2V0VGljayxkd01zZWNRUDsKLSAgICBMQVJHRV9JTlRFR0VSIGxpX3FwLGxpX3JkdHNjLGR3UmVzUmR0c2M7Ci0KLSAgICBpZiAoYXJnYzw9MSkKLSAgICB7Ci0gICAgICAgIHByaW50ZigicnVuIFRlc3RabGliIDxGaWxlPiBbQmxvY2tTaXplQ29tcHJlc3NdIFtCbG9ja1NpemVVbmNvbXByZXNzXSBbY29tcHJlcy4gbGV2ZWxdXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKFJlYWRGaWxlTWVtb3J5KGFyZ3ZbMV0sJmxGaWxlU2l6ZSwmRmlsZVB0cik9PTApCi0gICAgewotICAgICAgICBwcmludGYoImVycm9yIHJlYWRpbmcgJXNcbiIsYXJndlsxXSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBlbHNlIHByaW50ZigiZmlsZSAlcyByZWFkLCAldSBieXRlc1xuIixhcmd2WzFdLGxGaWxlU2l6ZSk7Ci0KLSAgICBpZiAoYXJnYz49MykKLSAgICAgICAgQmxvY2tTaXplQ29tcHJlc3M9YXRvbChhcmd2WzJdKTsKLQotICAgIGlmIChhcmdjPj00KQotICAgICAgICBCbG9ja1NpemVVbmNvbXByZXNzPWF0b2woYXJndlszXSk7Ci0KLSAgICBpZiAoYXJnYz49NSkKLSAgICAgICAgY3ByTGV2ZWw9KGludClhdG9sKGFyZ3ZbNF0pOwotCi0gICAgbEJ1ZmZlclNpemVDcHIgPSBsRmlsZVNpemUgKyAobEZpbGVTaXplLzB4MTApICsgMHgyMDA7Ci0gICAgbEJ1ZmZlclNpemVVbmNwciA9IGxCdWZmZXJTaXplQ3ByOwotCi0gICAgQ3ByUHRyPSh1bnNpZ25lZCBjaGFyKiltYWxsb2MobEJ1ZmZlclNpemVDcHIgKyBCbG9ja1NpemVDb21wcmVzcyk7Ci0KLSAgICBCZWdpbkNvdW50UGVyZkNvdW50ZXIoJmxpX3FwLFRSVUUpOwotICAgIGR3R2V0VGljaz1HZXRUaWNrQ291bnQoKTsKLSAgICBCZWdpbkNvdW50UmR0c2MoJmxpX3JkdHNjKTsKLSAgICB7Ci0gICAgICAgIHpfc3RyZWFtIHpjcHI7Ci0gICAgICAgIGludCByZXQ9Wl9PSzsKLSAgICAgICAgbG9uZyBsT3JpZ1RvRG8gPSBsRmlsZVNpemU7Ci0gICAgICAgIGxvbmcgbE9yaWdEb25lID0gMDsKLSAgICAgICAgaW50IHN0ZXA9MDsKLSAgICAgICAgbWVtc2V0KCZ6Y3ByLDAsc2l6ZW9mKHpfc3RyZWFtKSk7Ci0gICAgICAgIGRlZmxhdGVJbml0KCZ6Y3ByLGNwckxldmVsKTsKLQotICAgICAgICB6Y3ByLm5leHRfaW4gPSBGaWxlUHRyOwotICAgICAgICB6Y3ByLm5leHRfb3V0ID0gQ3ByUHRyOwotCi0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgbG9uZyBhbGxfcmVhZF9iZWZvcmUgPSB6Y3ByLnRvdGFsX2luOwotICAgICAgICAgICAgemNwci5hdmFpbF9pbiA9IG1pbihsT3JpZ1RvRG8sQmxvY2tTaXplQ29tcHJlc3MpOwotICAgICAgICAgICAgemNwci5hdmFpbF9vdXQgPSBCbG9ja1NpemVDb21wcmVzczsKLSAgICAgICAgICAgIHJldD1kZWZsYXRlKCZ6Y3ByLCh6Y3ByLmF2YWlsX2luPT1sT3JpZ1RvRG8pID8gWl9GSU5JU0ggOiBaX1NZTkNfRkxVU0gpOwotICAgICAgICAgICAgbE9yaWdEb25lICs9ICh6Y3ByLnRvdGFsX2luLWFsbF9yZWFkX2JlZm9yZSk7Ci0gICAgICAgICAgICBsT3JpZ1RvRG8gLT0gKHpjcHIudG90YWxfaW4tYWxsX3JlYWRfYmVmb3JlKTsKLSAgICAgICAgICAgIHN0ZXArKzsKLSAgICAgICAgfSB3aGlsZSAocmV0PT1aX09LKTsKLQotICAgICAgICBsU2l6ZUNwcj16Y3ByLnRvdGFsX291dDsKLSAgICAgICAgZGVmbGF0ZUVuZCgmemNwcik7Ci0gICAgICAgIGR3R2V0VGljaz1HZXRUaWNrQ291bnQoKS1kd0dldFRpY2s7Ci0gICAgICAgIGR3TXNlY1FQPUdldE1zZWNTaW5jZVBlcmZDb3VudGVyKGxpX3FwLFRSVUUpOwotICAgICAgICBkd1Jlc1JkdHNjPUdldFJlc1JkdHNjKGxpX3JkdHNjLFRSVUUpOwotICAgICAgICBwcmludGYoInRvdGFsIGNvbXByZXNzIHNpemUgPSAldSwgaW4gJXUgc3RlcFxuIixsU2l6ZUNwcixzdGVwKTsKLSAgICAgICAgcHJpbnRmKCJ0aW1lID0gJXUgbXNlYyA9ICVmIHNlY1xuIixkd0dldFRpY2ssZHdHZXRUaWNrLyhkb3VibGUpMTAwMC4pOwotICAgICAgICBwcmludGYoImRlZmNwciB0aW1lIFFQID0gJXUgbXNlYyA9ICVmIHNlY1xuIixkd01zZWNRUCxkd01zZWNRUC8oZG91YmxlKTEwMDAuKTsKLSAgICAgICAgcHJpbnRmKCJkZWZjcHIgcmVzdWx0IHJkdHNjID0gJUk2NHhcblxuIixkd1Jlc1JkdHNjLlF1YWRQYXJ0KTsKLSAgICB9Ci0KLSAgICBDcHJQdHI9KHVuc2lnbmVkIGNoYXIqKXJlYWxsb2MoQ3ByUHRyLGxTaXplQ3ByKTsKLSAgICBVbmNwclB0cj0odW5zaWduZWQgY2hhciopbWFsbG9jKGxCdWZmZXJTaXplVW5jcHIgKyBCbG9ja1NpemVVbmNvbXByZXNzKTsKLQotICAgIEJlZ2luQ291bnRQZXJmQ291bnRlcigmbGlfcXAsVFJVRSk7Ci0gICAgZHdHZXRUaWNrPUdldFRpY2tDb3VudCgpOwotICAgIEJlZ2luQ291bnRSZHRzYygmbGlfcmR0c2MpOwotICAgIHsKLSAgICAgICAgel9zdHJlYW0gemNwcjsKLSAgICAgICAgaW50IHJldD1aX09LOwotICAgICAgICBsb25nIGxPcmlnVG9EbyA9IGxTaXplQ3ByOwotICAgICAgICBsb25nIGxPcmlnRG9uZSA9IDA7Ci0gICAgICAgIGludCBzdGVwPTA7Ci0gICAgICAgIG1lbXNldCgmemNwciwwLHNpemVvZih6X3N0cmVhbSkpOwotICAgICAgICBpbmZsYXRlSW5pdCgmemNwcik7Ci0KLSAgICAgICAgemNwci5uZXh0X2luID0gQ3ByUHRyOwotICAgICAgICB6Y3ByLm5leHRfb3V0ID0gVW5jcHJQdHI7Ci0KLQotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIGFsbF9yZWFkX2JlZm9yZSA9IHpjcHIudG90YWxfaW47Ci0gICAgICAgICAgICB6Y3ByLmF2YWlsX2luID0gbWluKGxPcmlnVG9EbyxCbG9ja1NpemVVbmNvbXByZXNzKTsKLSAgICAgICAgICAgIHpjcHIuYXZhaWxfb3V0ID0gQmxvY2tTaXplVW5jb21wcmVzczsKLSAgICAgICAgICAgIHJldD1pbmZsYXRlKCZ6Y3ByLFpfU1lOQ19GTFVTSCk7Ci0gICAgICAgICAgICBsT3JpZ0RvbmUgKz0gKHpjcHIudG90YWxfaW4tYWxsX3JlYWRfYmVmb3JlKTsKLSAgICAgICAgICAgIGxPcmlnVG9EbyAtPSAoemNwci50b3RhbF9pbi1hbGxfcmVhZF9iZWZvcmUpOwotICAgICAgICAgICAgc3RlcCsrOwotICAgICAgICB9IHdoaWxlIChyZXQ9PVpfT0spOwotCi0gICAgICAgIGxTaXplVW5jcHI9emNwci50b3RhbF9vdXQ7Ci0gICAgICAgIGluZmxhdGVFbmQoJnpjcHIpOwotICAgICAgICBkd0dldFRpY2s9R2V0VGlja0NvdW50KCktZHdHZXRUaWNrOwotICAgICAgICBkd01zZWNRUD1HZXRNc2VjU2luY2VQZXJmQ291bnRlcihsaV9xcCxUUlVFKTsKLSAgICAgICAgZHdSZXNSZHRzYz1HZXRSZXNSZHRzYyhsaV9yZHRzYyxUUlVFKTsKLSAgICAgICAgcHJpbnRmKCJ0b3RhbCB1bmNvbXByZXNzIHNpemUgPSAldSwgaW4gJXUgc3RlcFxuIixsU2l6ZVVuY3ByLHN0ZXApOwotICAgICAgICBwcmludGYoInRpbWUgPSAldSBtc2VjID0gJWYgc2VjXG4iLGR3R2V0VGljayxkd0dldFRpY2svKGRvdWJsZSkxMDAwLik7Ci0gICAgICAgIHByaW50ZigidW5jcHIgIHRpbWUgUVAgPSAldSBtc2VjID0gJWYgc2VjXG4iLGR3TXNlY1FQLGR3TXNlY1FQLyhkb3VibGUpMTAwMC4pOwotICAgICAgICBwcmludGYoInVuY3ByICByZXN1bHQgcmR0c2MgPSAlSTY0eFxuXG4iLGR3UmVzUmR0c2MuUXVhZFBhcnQpOwotICAgIH0KLQotICAgIGlmIChsU2l6ZVVuY3ByPT1sRmlsZVNpemUpCi0gICAgewotICAgICAgICBpZiAobWVtY21wKEZpbGVQdHIsVW5jcHJQdHIsbEZpbGVTaXplKT09MCkKLSAgICAgICAgICAgIHByaW50ZigiY29tcGFyZSBva1xuIik7Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NyYy96bGliL2NvbnRyaWIvdGVzdHpsaWIvdGVzdHpsaWIudHh0IGIvc3JjL3psaWIvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MDhiYjIuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1UbyBidWlsZCB0ZXN0ekxpYiB3aXRoIFZpc3VhbCBTdHVkaW8gMjAwNToKLQotY29weSB0byBhIGRpcmVjdG9yeSBmaWxlIGZyb20gOgotLSByb290IG9mIHpMaWIgdHJlZQotLSBjb250cmliL3Rlc3R6bGliCi0tIGNvbnRyaWIvbWFzbXg4NgotLSBjb250cmliL21hc214NjQKLS0gY29udHJpYi92c3R1ZGlvL3ZjNwotCi1hbmQgb3BlbiB0ZXN0emxpYjguc2xuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi91bnRnei9NYWtlZmlsZSBiL3NyYy96bGliL2NvbnRyaWIvdW50Z3ovTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NDI2NmYuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi91bnRnei9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLUNDPWNjCi1DRkxBR1M9LWcKLQotdW50Z3o6IHVudGd6Lm8gLi4vLi4vbGliei5hCi0JJChDQykgJChDRkxBR1MpIC1vIHVudGd6IHVudGd6Lm8gLUwuLi8uLiAtbHoKLQotdW50Z3oubzogdW50Z3ouYyAuLi8uLi96bGliLmgKLQkkKENDKSAkKENGTEFHUykgLWMgLUkuLi8uLiB1bnRnei5jCi0KLS4uLy4uL2xpYnouYToKLQljZCAuLi8uLjsgLi9jb25maWd1cmU7IG1ha2UKLQotY2xlYW46Ci0Jcm0gLWYgdW50Z3ogdW50Z3oubyAqfgpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY29udHJpYi91bnRnei9NYWtlZmlsZS5tc2MgYi9zcmMvemxpYi9jb250cmliL3VudGd6L01ha2VmaWxlLm1zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdiODYwMi4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jb250cmliL3VudGd6L01ha2VmaWxlLm1zYworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLUNDPWNsCi1DRkxBR1M9LU1ECi0KLXVudGd6LmV4ZTogdW50Z3oub2JqIC4uXC4uXHpsaWIubGliCi0JJChDQykgJChDRkxBR1MpIHVudGd6Lm9iaiAuLlwuLlx6bGliLmxpYgotCi11bnRnei5vYmo6IHVudGd6LmMgLi5cLi5cemxpYi5oCi0JJChDQykgJChDRkxBR1MpIC1jIC1JLi5cLi4gdW50Z3ouYwotCi0uLlwuLlx6bGliLmxpYjoKLQljZCAuLlwuLgotCSQoTUFLRSkgLWYgd2luMzJcbWFrZWZpbGUubXNjCi0JY2QgY29udHJpYlx1bnRnegotCi1jbGVhbjoKLQktZGVsIHVudGd6Lm9iagotCS1kZWwgdW50Z3ouZXhlCmRpZmYgLS1naXQgYS9zcmMvemxpYi9jb250cmliL3VudGd6L3VudGd6LmMgYi9zcmMvemxpYi9jb250cmliL3VudGd6L3VudGd6LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMzkxZTUuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY29udHJpYi91bnRnei91bnRnei5jCisrKyAvZGV2L251bGwKQEAgLTEsNjc0ICswLDAgQEAKLS8qCi0gKiB1bnRnei5jIC0tIERpc3BsYXkgY29udGVudHMgYW5kIGV4dHJhY3QgZmlsZXMgZnJvbSBhIGd6aXAnZCBUQVIgZmlsZQotICoKLSAqIHdyaXR0ZW4gYnkgUGVkcm8gQS4gQXJhbmRhIEd1dGllcnJleiA8cGFhZ0B0aWQuZXM+Ci0gKiBhZGFwdGF0aW9uIHRvIFVuaXggYnkgSmVhbi1sb3VwIEdhaWxseSA8amxvdXBAZ3ppcC5vcmc+Ci0gKiB2YXJpb3VzIGZpeGVzIGJ5IENvc21pbiBUcnV0YSA8Y29zbWludEBjcy51YmJjbHVqLnJvPgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaW5jbHVkZSAiemxpYi5oIgotCi0jaWZkZWYgdW5peAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZWxzZQotIyAgaW5jbHVkZSA8ZGlyZWN0Lmg+Ci0jICBpbmNsdWRlIDxpby5oPgotI2VuZGlmCi0KLSNpZmRlZiBXSU4zMgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSMgIGlmbmRlZiBGX09LCi0jICAgIGRlZmluZSBGX09LICAwCi0jICBlbmRpZgotIyAgZGVmaW5lIG1rZGlyKGRpcm5hbWUsbW9kZSkgICBfbWtkaXIoZGlybmFtZSkKLSMgIGlmZGVmIF9NU0NfVkVSCi0jICAgIGRlZmluZSBhY2Nlc3MocGF0aCxtb2RlKSAgIF9hY2Nlc3MocGF0aCxtb2RlKQotIyAgICBkZWZpbmUgY2htb2QocGF0aCxtb2RlKSAgICBfY2htb2QocGF0aCxtb2RlKQotIyAgICBkZWZpbmUgc3RyZHVwKHN0cikgICAgICAgICBfc3RyZHVwKHN0cikKLSMgIGVuZGlmCi0jZWxzZQotIyAgaW5jbHVkZSA8dXRpbWUuaD4KLSNlbmRpZgotCi0KLS8qIHZhbHVlcyB1c2VkIGluIHR5cGVmbGFnIGZpZWxkICovCi0KLSNkZWZpbmUgUkVHVFlQRSAgJzAnICAgICAgICAgICAgLyogcmVndWxhciBmaWxlICovCi0jZGVmaW5lIEFSRUdUWVBFICdcMCcgICAgICAgICAgIC8qIHJlZ3VsYXIgZmlsZSAqLwotI2RlZmluZSBMTktUWVBFICAnMScgICAgICAgICAgICAvKiBsaW5rICovCi0jZGVmaW5lIFNZTVRZUEUgICcyJyAgICAgICAgICAgIC8qIHJlc2VydmVkICovCi0jZGVmaW5lIENIUlRZUEUgICczJyAgICAgICAgICAgIC8qIGNoYXJhY3RlciBzcGVjaWFsICovCi0jZGVmaW5lIEJMS1RZUEUgICc0JyAgICAgICAgICAgIC8qIGJsb2NrIHNwZWNpYWwgKi8KLSNkZWZpbmUgRElSVFlQRSAgJzUnICAgICAgICAgICAgLyogZGlyZWN0b3J5ICovCi0jZGVmaW5lIEZJRk9UWVBFICc2JyAgICAgICAgICAgIC8qIEZJRk8gc3BlY2lhbCAqLwotI2RlZmluZSBDT05UVFlQRSAnNycgICAgICAgICAgICAvKiByZXNlcnZlZCAqLwotCi0vKiBHTlUgdGFyIGV4dGVuc2lvbnMgKi8KLQotI2RlZmluZSBHTlVUWVBFX0RVTVBESVIgICdEJyAgICAvKiBmaWxlIG5hbWVzIGZyb20gZHVtcGVkIGRpcmVjdG9yeSAqLwotI2RlZmluZSBHTlVUWVBFX0xPTkdMSU5LICdLJyAgICAvKiBsb25nIGxpbmsgbmFtZSAqLwotI2RlZmluZSBHTlVUWVBFX0xPTkdOQU1FICdMJyAgICAvKiBsb25nIGZpbGUgbmFtZSAqLwotI2RlZmluZSBHTlVUWVBFX01VTFRJVk9MICdNJyAgICAvKiBjb250aW51YXRpb24gb2YgZmlsZSBmcm9tIGFub3RoZXIgdm9sdW1lICovCi0jZGVmaW5lIEdOVVRZUEVfTkFNRVMgICAgJ04nICAgIC8qIGZpbGUgbmFtZSB0aGF0IGRvZXMgbm90IGZpdCBpbnRvIG1haW4gaGRyICovCi0jZGVmaW5lIEdOVVRZUEVfU1BBUlNFICAgJ1MnICAgIC8qIHNwYXJzZSBmaWxlICovCi0jZGVmaW5lIEdOVVRZUEVfVk9MSERSICAgJ1YnICAgIC8qIHRhcGUvdm9sdW1lIGhlYWRlciAqLwotCi0KLS8qIHRhciBoZWFkZXIgKi8KLQotI2RlZmluZSBCTE9DS1NJWkUgICAgIDUxMgotI2RlZmluZSBTSE9SVE5BTUVTSVpFIDEwMAotCi1zdHJ1Y3QgdGFyX2hlYWRlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBieXRlIG9mZnNldCAqLwotICBjaGFyIG5hbWVbMTAwXTsgICAgICAgICAgICAgICAvKiAgIDAgKi8KLSAgY2hhciBtb2RlWzhdOyAgICAgICAgICAgICAgICAgLyogMTAwICovCi0gIGNoYXIgdWlkWzhdOyAgICAgICAgICAgICAgICAgIC8qIDEwOCAqLwotICBjaGFyIGdpZFs4XTsgICAgICAgICAgICAgICAgICAvKiAxMTYgKi8KLSAgY2hhciBzaXplWzEyXTsgICAgICAgICAgICAgICAgLyogMTI0ICovCi0gIGNoYXIgbXRpbWVbMTJdOyAgICAgICAgICAgICAgIC8qIDEzNiAqLwotICBjaGFyIGNoa3N1bVs4XTsgICAgICAgICAgICAgICAvKiAxNDggKi8KLSAgY2hhciB0eXBlZmxhZzsgICAgICAgICAgICAgICAgLyogMTU2ICovCi0gIGNoYXIgbGlua25hbWVbMTAwXTsgICAgICAgICAgIC8qIDE1NyAqLwotICBjaGFyIG1hZ2ljWzZdOyAgICAgICAgICAgICAgICAvKiAyNTcgKi8KLSAgY2hhciB2ZXJzaW9uWzJdOyAgICAgICAgICAgICAgLyogMjYzICovCi0gIGNoYXIgdW5hbWVbMzJdOyAgICAgICAgICAgICAgIC8qIDI2NSAqLwotICBjaGFyIGduYW1lWzMyXTsgICAgICAgICAgICAgICAvKiAyOTcgKi8KLSAgY2hhciBkZXZtYWpvcls4XTsgICAgICAgICAgICAgLyogMzI5ICovCi0gIGNoYXIgZGV2bWlub3JbOF07ICAgICAgICAgICAgIC8qIDMzNyAqLwotICBjaGFyIHByZWZpeFsxNTVdOyAgICAgICAgICAgICAvKiAzNDUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTAwICovCi19OwotCi11bmlvbiB0YXJfYnVmZmVyCi17Ci0gIGNoYXIgICAgICAgICAgICAgICBidWZmZXJbQkxPQ0tTSVpFXTsKLSAgc3RydWN0IHRhcl9oZWFkZXIgIGhlYWRlcjsKLX07Ci0KLXN0cnVjdCBhdHRyX2l0ZW0KLXsKLSAgc3RydWN0IGF0dHJfaXRlbSAgKm5leHQ7Ci0gIGNoYXIgICAgICAgICAgICAgICpmbmFtZTsKLSAgaW50ICAgICAgICAgICAgICAgIG1vZGU7Ci0gIHRpbWVfdCAgICAgICAgICAgICB0aW1lOwotfTsKLQotZW51bSB7IFRHWl9FWFRSQUNULCBUR1pfTElTVCwgVEdaX0lOVkFMSUQgfTsKLQotY2hhciAqVEdaZm5hbWUgICAgICAgICAgT0YoKGNvbnN0IGNoYXIgKikpOwotdm9pZCBUR1pub3Rmb3VuZCAgICAgICAgT0YoKGNvbnN0IGNoYXIgKikpOwotCi1pbnQgZ2V0b2N0ICAgICAgICAgICAgICBPRigoY2hhciAqLCBpbnQpKTsKLWNoYXIgKnN0cnRpbWUgICAgICAgICAgIE9GKCh0aW1lX3QgKikpOwotaW50IHNldGZpbGV0aW1lICAgICAgICAgT0YoKGNoYXIgKiwgdGltZV90KSk7Ci12b2lkIHB1c2hfYXR0ciAgICAgICAgICBPRigoc3RydWN0IGF0dHJfaXRlbSAqKiwgY2hhciAqLCBpbnQsIHRpbWVfdCkpOwotdm9pZCByZXN0b3JlX2F0dHIgICAgICAgT0YoKHN0cnVjdCBhdHRyX2l0ZW0gKiopKTsKLQotaW50IEV4cHJNYXRjaCAgICAgICAgICAgT0YoKGNoYXIgKiwgY2hhciAqKSk7Ci0KLWludCBtYWtlZGlyICAgICAgICAgICAgIE9GKChjaGFyICopKTsKLWludCBtYXRjaG5hbWUgICAgICAgICAgIE9GKChpbnQsIGludCwgY2hhciAqKiwgY2hhciAqKSk7Ci0KLXZvaWQgZXJyb3IgICAgICAgICAgICAgIE9GKChjb25zdCBjaGFyICopKTsKLWludCB0YXIgICAgICAgICAgICAgICAgIE9GKChnekZpbGUsIGludCwgaW50LCBpbnQsIGNoYXIgKiopKTsKLQotdm9pZCBoZWxwICAgICAgICAgICAgICAgT0YoKGludCkpOwotaW50IG1haW4gICAgICAgICAgICAgICAgT0YoKGludCwgY2hhciAqKikpOwotCi1jaGFyICpwcm9nOwotCi1jb25zdCBjaGFyICpUR1pzdWZmaXhbXSA9IHsgIlwwIiwgIi50YXIiLCAiLnRhci5neiIsICIudGF6IiwgIi50Z3oiLCBOVUxMIH07Ci0KLS8qIHJldHVybiB0aGUgZmlsZSBuYW1lIG9mIHRoZSBUR1ogYXJjaGl2ZSAqLwotLyogb3IgTlVMTCBpZiBpdCBkb2VzIG5vdCBleGlzdCAqLwotCi1jaGFyICpUR1pmbmFtZSAoY29uc3QgY2hhciAqYXJjbmFtZSkKLXsKLSAgc3RhdGljIGNoYXIgYnVmZmVyWzEwMjRdOwotICBpbnQgb3JpZ2xlbixpOwotCi0gIHN0cmNweShidWZmZXIsYXJjbmFtZSk7Ci0gIG9yaWdsZW4gPSBzdHJsZW4oYnVmZmVyKTsKLQotICBmb3IgKGk9MDsgVEdac3VmZml4W2ldOyBpKyspCi0gICAgewotICAgICAgIHN0cmNweShidWZmZXIrb3JpZ2xlbixUR1pzdWZmaXhbaV0pOwotICAgICAgIGlmIChhY2Nlc3MoYnVmZmVyLEZfT0spID09IDApCi0gICAgICAgICByZXR1cm4gYnVmZmVyOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyogZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGZpbGVuYW1lICovCi0KLXZvaWQgVEdabm90Zm91bmQgKGNvbnN0IGNoYXIgKmFyY25hbWUpCi17Ci0gIGludCBpOwotCi0gIGZwcmludGYoc3RkZXJyLCIlczogQ291bGRuJ3QgZmluZCAiLHByb2cpOwotICBmb3IgKGk9MDtUR1pzdWZmaXhbaV07aSsrKQotICAgIGZwcmludGYoc3RkZXJyLChUR1pzdWZmaXhbaSsxXSkgPyAiJXMlcywgIiA6ICJvciAlcyVzXG4iLAotICAgICAgICAgICAgYXJjbmFtZSwKLSAgICAgICAgICAgIFRHWnN1ZmZpeFtpXSk7Ci0gIGV4aXQoMSk7Ci19Ci0KLQotLyogY29udmVydCBvY3RhbCBkaWdpdHMgdG8gaW50ICovCi0vKiBvbiBlcnJvciByZXR1cm4gLTEgKi8KLQotaW50IGdldG9jdCAoY2hhciAqcCxpbnQgd2lkdGgpCi17Ci0gIGludCByZXN1bHQgPSAwOwotICBjaGFyIGM7Ci0KLSAgd2hpbGUgKHdpZHRoLS0pCi0gICAgewotICAgICAgYyA9ICpwKys7Ci0gICAgICBpZiAoYyA9PSAwKQotICAgICAgICBicmVhazsKLSAgICAgIGlmIChjID09ICcgJykKLSAgICAgICAgY29udGludWU7Ci0gICAgICBpZiAoYyA8ICcwJyB8fCBjID4gJzcnKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICByZXN1bHQgPSByZXN1bHQgKiA4ICsgKGMgLSAnMCcpOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKiBjb252ZXJ0IHRpbWVfdCB0byBzdHJpbmcgKi8KLS8qIHVzZSB0aGUgIllZWVkvTU0vREQgaGg6bW06c3MiIGZvcm1hdCAqLwotCi1jaGFyICpzdHJ0aW1lICh0aW1lX3QgKnQpCi17Ci0gIHN0cnVjdCB0bSAgICpsb2NhbDsKLSAgc3RhdGljIGNoYXIgcmVzdWx0WzMyXTsKLQotICBsb2NhbCA9IGxvY2FsdGltZSh0KTsKLSAgc3ByaW50ZihyZXN1bHQsIiU0ZC8lMDJkLyUwMmQgJTAyZDolMDJkOiUwMmQiLAotICAgICAgICAgIGxvY2FsLT50bV95ZWFyKzE5MDAsIGxvY2FsLT50bV9tb24rMSwgbG9jYWwtPnRtX21kYXksCi0gICAgICAgICAgbG9jYWwtPnRtX2hvdXIsIGxvY2FsLT50bV9taW4sIGxvY2FsLT50bV9zZWMpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qIHNldCBmaWxlIHRpbWUgKi8KLQotaW50IHNldGZpbGV0aW1lIChjaGFyICpmbmFtZSx0aW1lX3QgZnRpbWUpCi17Ci0jaWZkZWYgV0lOMzIKLSAgc3RhdGljIGludCBpc1dpbk5UID0gLTE7Ci0gIFNZU1RFTVRJTUUgc3Q7Ci0gIEZJTEVUSU1FIGxvY2Z0LCBtb2RmdDsKLSAgc3RydWN0IHRtICpsb2N0bTsKLSAgSEFORExFIGhGaWxlOwotICBpbnQgcmVzdWx0OwotCi0gIGxvY3RtID0gbG9jYWx0aW1lKCZmdGltZSk7Ci0gIGlmIChsb2N0bSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBzdC53WWVhciAgICAgICAgID0gKFdPUkQpbG9jdG0tPnRtX3llYXIgKyAxOTAwOwotICBzdC53TW9udGggICAgICAgID0gKFdPUkQpbG9jdG0tPnRtX21vbiArIDE7Ci0gIHN0LndEYXlPZldlZWsgICAgPSAoV09SRClsb2N0bS0+dG1fd2RheTsKLSAgc3Qud0RheSAgICAgICAgICA9IChXT1JEKWxvY3RtLT50bV9tZGF5OwotICBzdC53SG91ciAgICAgICAgID0gKFdPUkQpbG9jdG0tPnRtX2hvdXI7Ci0gIHN0LndNaW51dGUgICAgICAgPSAoV09SRClsb2N0bS0+dG1fbWluOwotICBzdC53U2Vjb25kICAgICAgID0gKFdPUkQpbG9jdG0tPnRtX3NlYzsKLSAgc3Qud01pbGxpc2Vjb25kcyA9IDA7Ci0gIGlmICghU3lzdGVtVGltZVRvRmlsZVRpbWUoJnN0LCAmbG9jZnQpIHx8Ci0gICAgICAhTG9jYWxGaWxlVGltZVRvRmlsZVRpbWUoJmxvY2Z0LCAmbW9kZnQpKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoaXNXaW5OVCA8IDApCi0gICAgaXNXaW5OVCA9IChHZXRWZXJzaW9uKCkgPCAweDgwMDAwMDAwKSA/IDEgOiAwOwotICBoRmlsZSA9IENyZWF0ZUZpbGUoZm5hbWUsIEdFTkVSSUNfV1JJVEUsIDAsIE5VTEwsIE9QRU5fRVhJU1RJTkcsCi0gICAgICAgICAgICAgICAgICAgICAoaXNXaW5OVCA/IEZJTEVfRkxBR19CQUNLVVBfU0VNQU5USUNTIDogMCksCi0gICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgIHJldHVybiAtMTsKLSAgcmVzdWx0ID0gU2V0RmlsZVRpbWUoaEZpbGUsIE5VTEwsIE5VTEwsICZtb2RmdCkgPyAwIDogLTE7Ci0gIENsb3NlSGFuZGxlKGhGaWxlKTsKLSAgcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gIHN0cnVjdCB1dGltYnVmIHNldHRpbWU7Ci0KLSAgc2V0dGltZS5hY3RpbWUgPSBzZXR0aW1lLm1vZHRpbWUgPSBmdGltZTsKLSAgcmV0dXJuIHV0aW1lKGZuYW1lLCZzZXR0aW1lKTsKLSNlbmRpZgotfQotCi0KLS8qIHB1c2ggZmlsZSBhdHRyaWJ1dGVzICovCi0KLXZvaWQgcHVzaF9hdHRyKHN0cnVjdCBhdHRyX2l0ZW0gKipsaXN0LGNoYXIgKmZuYW1lLGludCBtb2RlLHRpbWVfdCB0aW1lKQotewotICBzdHJ1Y3QgYXR0cl9pdGVtICppdGVtOwotCi0gIGl0ZW0gPSAoc3RydWN0IGF0dHJfaXRlbSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGF0dHJfaXRlbSkpOwotICBpZiAoaXRlbSA9PSBOVUxMKQotICAgIGVycm9yKCJPdXQgb2YgbWVtb3J5Iik7Ci0gIGl0ZW0tPmZuYW1lID0gc3RyZHVwKGZuYW1lKTsKLSAgaXRlbS0+bW9kZSAgPSBtb2RlOwotICBpdGVtLT50aW1lICA9IHRpbWU7Ci0gIGl0ZW0tPm5leHQgID0gKmxpc3Q7Ci0gICpsaXN0ICAgICAgID0gaXRlbTsKLX0KLQotCi0vKiByZXN0b3JlIGZpbGUgYXR0cmlidXRlcyAqLwotCi12b2lkIHJlc3RvcmVfYXR0cihzdHJ1Y3QgYXR0cl9pdGVtICoqbGlzdCkKLXsKLSAgc3RydWN0IGF0dHJfaXRlbSAqaXRlbSwgKnByZXY7Ci0KLSAgZm9yIChpdGVtID0gKmxpc3Q7IGl0ZW0gIT0gTlVMTDsgKQotICAgIHsKLSAgICAgIHNldGZpbGV0aW1lKGl0ZW0tPmZuYW1lLGl0ZW0tPnRpbWUpOwotICAgICAgY2htb2QoaXRlbS0+Zm5hbWUsaXRlbS0+bW9kZSk7Ci0gICAgICBwcmV2ID0gaXRlbTsKLSAgICAgIGl0ZW0gPSBpdGVtLT5uZXh0OwotICAgICAgZnJlZShwcmV2KTsKLSAgICB9Ci0gICpsaXN0ID0gTlVMTDsKLX0KLQotCi0vKiBtYXRjaCByZWd1bGFyIGV4cHJlc3Npb24gKi8KLQotI2RlZmluZSBJU1NQRUNJQUwoYykgKCgoYykgPT0gJyonKSB8fCAoKGMpID09ICcvJykpCi0KLWludCBFeHByTWF0Y2ggKGNoYXIgKnN0cmluZyxjaGFyICpleHByKQotewotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAoSVNTUEVDSUFMKCpleHByKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICgqZXhwciA9PSAnLycpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICgqc3RyaW5nICE9ICdcXCcgJiYgKnN0cmluZyAhPSAnLycpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgIHN0cmluZyArKzsgZXhwcisrOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCpleHByID09ICcqJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCpleHByICsrID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgIHdoaWxlICgqKytzdHJpbmcgIT0gKmV4cHIpCi0gICAgICAgICAgICAgICAgaWYgKCpzdHJpbmcgPT0gMCkKLSAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKnN0cmluZyAhPSAqZXhwcikKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgIGlmICgqZXhwcisrID09IDApCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICBzdHJpbmcrKzsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi0vKiByZWN1cnNpdmUgbWtkaXIgKi8KLS8qIGFib3J0IG9uIEVOT0VOVDsgaWdub3JlIG90aGVyIGVycm9ycyBsaWtlICJkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMiICovCi0vKiByZXR1cm4gMSBpZiBPSyAqLwotLyogICAgICAgIDAgb24gZXJyb3IgKi8KLQotaW50IG1ha2VkaXIgKGNoYXIgKm5ld2RpcikKLXsKLSAgY2hhciAqYnVmZmVyID0gc3RyZHVwKG5ld2Rpcik7Ci0gIGNoYXIgKnA7Ci0gIGludCAgbGVuID0gc3RybGVuKGJ1ZmZlcik7Ci0KLSAgaWYgKGxlbiA8PSAwKSB7Ci0gICAgZnJlZShidWZmZXIpOwotICAgIHJldHVybiAwOwotICB9Ci0gIGlmIChidWZmZXJbbGVuLTFdID09ICcvJykgewotICAgIGJ1ZmZlcltsZW4tMV0gPSAnXDAnOwotICB9Ci0gIGlmIChta2RpcihidWZmZXIsIDA3NTUpID09IDApCi0gICAgewotICAgICAgZnJlZShidWZmZXIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIHAgPSBidWZmZXIrMTsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY2hhciBob2xkOwotCi0gICAgICB3aGlsZSgqcCAmJiAqcCAhPSAnXFwnICYmICpwICE9ICcvJykKLSAgICAgICAgcCsrOwotICAgICAgaG9sZCA9ICpwOwotICAgICAgKnAgPSAwOwotICAgICAgaWYgKChta2RpcihidWZmZXIsIDA3NTUpID09IC0xKSAmJiAoZXJybm8gPT0gRU5PRU5UKSkKLSAgICAgICAgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCIlczogQ291bGRuJ3QgY3JlYXRlIGRpcmVjdG9yeSAlc1xuIixwcm9nLGJ1ZmZlcik7Ci0gICAgICAgICAgZnJlZShidWZmZXIpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICBpZiAoaG9sZCA9PSAwKQotICAgICAgICBicmVhazsKLSAgICAgICpwKysgPSBob2xkOwotICAgIH0KLSAgZnJlZShidWZmZXIpOwotICByZXR1cm4gMTsKLX0KLQotCi1pbnQgbWF0Y2huYW1lIChpbnQgYXJnLGludCBhcmdjLGNoYXIgKiphcmd2LGNoYXIgKmZuYW1lKQotewotICBpZiAoYXJnID09IGFyZ2MpICAgICAgLyogbm8gYXJndW1lbnRzIGdpdmVuICh1bnRneiB0Z3phcmNoaXZlKSAqLwotICAgIHJldHVybiAxOwotCi0gIHdoaWxlIChhcmcgPCBhcmdjKQotICAgIGlmIChFeHByTWF0Y2goZm5hbWUsYXJndlthcmcrK10pKQotICAgICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7IC8qIGlnbm9yZSB0aGlzIGZvciB0aGUgbW9tZW50IGJlaW5nICovCi19Ci0KLQotLyogdGFyIGZpbGUgbGlzdCBvciBleHRyYWN0ICovCi0KLWludCB0YXIgKGd6RmlsZSBpbixpbnQgYWN0aW9uLGludCBhcmcsaW50IGFyZ2MsY2hhciAqKmFyZ3YpCi17Ci0gIHVuaW9uICB0YXJfYnVmZmVyIGJ1ZmZlcjsKLSAgaW50ICAgIGxlbjsKLSAgaW50ICAgIGVycjsKLSAgaW50ICAgIGdldGhlYWRlciA9IDE7Ci0gIGludCAgICByZW1haW5pbmcgPSAwOwotICBGSUxFICAgKm91dGZpbGUgPSBOVUxMOwotICBjaGFyICAgZm5hbWVbQkxPQ0tTSVpFXTsKLSAgaW50ICAgIHRhcm1vZGU7Ci0gIHRpbWVfdCB0YXJ0aW1lOwotICBzdHJ1Y3QgYXR0cl9pdGVtICphdHRyaWJ1dGVzID0gTlVMTDsKLQotICBpZiAoYWN0aW9uID09IFRHWl9MSVNUKQotICAgIHByaW50ZigiICAgIGRhdGUgICAgICB0aW1lICAgICBzaXplICAgICAgICAgICAgICAgICAgICAgICBmaWxlXG4iCi0gICAgICAgICAgICIgLS0tLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGxlbiA9IGd6cmVhZChpbiwgJmJ1ZmZlciwgQkxPQ0tTSVpFKTsKLSAgICAgIGlmIChsZW4gPCAwKQotICAgICAgICBlcnJvcihnemVycm9yKGluLCAmZXJyKSk7Ci0gICAgICAvKgotICAgICAgICogQWx3YXlzIGV4cGVjdCBjb21wbGV0ZSBibG9ja3MgdG8gcHJvY2VzcwotICAgICAgICogdGhlIHRhciBpbmZvcm1hdGlvbi4KLSAgICAgICAqLwotICAgICAgaWYgKGxlbiAhPSBCTE9DS1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICBhY3Rpb24gPSBUR1pfSU5WQUxJRDsgLyogZm9yY2UgZXJyb3IgZXhpdCAqLwotICAgICAgICAgIHJlbWFpbmluZyA9IDA7ICAgICAgICAvKiBmb3JjZSBJL08gY2xlYW51cCAqLwotICAgICAgICB9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBJZiB3ZSBoYXZlIHRvIGdldCBhIHRhciBoZWFkZXIKLSAgICAgICAqLwotICAgICAgaWYgKGdldGhlYWRlciA+PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgLyoKLSAgICAgICAgICAgKiBpZiB3ZSBtZXQgdGhlIGVuZCBvZiB0aGUgdGFyCi0gICAgICAgICAgICogb3IgdGhlIGVuZC1vZi10YXIgYmxvY2ssCi0gICAgICAgICAgICogd2UgYXJlIGRvbmUKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAobGVuID09IDAgfHwgYnVmZmVyLmhlYWRlci5uYW1lWzBdID09IDApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIHRhcm1vZGUgPSBnZXRvY3QoYnVmZmVyLmhlYWRlci5tb2RlLDgpOwotICAgICAgICAgIHRhcnRpbWUgPSAodGltZV90KWdldG9jdChidWZmZXIuaGVhZGVyLm10aW1lLDEyKTsKLSAgICAgICAgICBpZiAodGFybW9kZSA9PSAtMSB8fCB0YXJ0aW1lID09ICh0aW1lX3QpLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJ1ZmZlci5oZWFkZXIubmFtZVswXSA9IDA7Ci0gICAgICAgICAgICAgIGFjdGlvbiA9IFRHWl9JTlZBTElEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGdldGhlYWRlciA9PSAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzdHJuY3B5KGZuYW1lLGJ1ZmZlci5oZWFkZXIubmFtZSxTSE9SVE5BTUVTSVpFKTsKLSAgICAgICAgICAgICAgaWYgKGZuYW1lW1NIT1JUTkFNRVNJWkUtMV0gIT0gMCkKLSAgICAgICAgICAgICAgICAgIGZuYW1lW1NIT1JUTkFNRVNJWkVdID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAqIFRoZSBmaWxlIG5hbWUgaXMgbG9uZ2VyIHRoYW4gU0hPUlROQU1FU0laRQotICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgaWYgKHN0cm5jbXAoZm5hbWUsYnVmZmVyLmhlYWRlci5uYW1lLFNIT1JUTkFNRVNJWkUtMSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgIGVycm9yKCJiYWQgbG9uZyBuYW1lIik7Ci0gICAgICAgICAgICAgIGdldGhlYWRlciA9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKgotICAgICAgICAgICAqIEFjdCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgZmxhZwotICAgICAgICAgICAqLwotICAgICAgICAgIHN3aXRjaCAoYnVmZmVyLmhlYWRlci50eXBlZmxhZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgRElSVFlQRToKLSAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBUR1pfTElTVCkKLSAgICAgICAgICAgICAgICBwcmludGYoIiAlcyAgICAgPGRpcj4gJXNcbiIsc3RydGltZSgmdGFydGltZSksZm5hbWUpOwotICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IFRHWl9FWFRSQUNUKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG1ha2VkaXIoZm5hbWUpOwotICAgICAgICAgICAgICAgICAgcHVzaF9hdHRyKCZhdHRyaWJ1dGVzLGZuYW1lLHRhcm1vZGUsdGFydGltZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUkVHVFlQRToKLSAgICAgICAgICAgIGNhc2UgQVJFR1RZUEU6Ci0gICAgICAgICAgICAgIHJlbWFpbmluZyA9IGdldG9jdChidWZmZXIuaGVhZGVyLnNpemUsMTIpOwotICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID09IC0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IFRHWl9JTlZBTElEOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IFRHWl9MSVNUKQotICAgICAgICAgICAgICAgIHByaW50ZigiICVzICU5ZCAlc1xuIixzdHJ0aW1lKCZ0YXJ0aW1lKSxyZW1haW5pbmcsZm5hbWUpOwotICAgICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT0gVEdaX0VYVFJBQ1QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKG1hdGNobmFtZShhcmcsYXJnYyxhcmd2LGZuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGUgPSBmb3BlbihmbmFtZSwid2IiKTsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0ZmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB0cnkgY3JlYXRpbmcgZGlyZWN0b3J5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwID0gc3RycmNocihmbmFtZSwgJy8nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKnAgPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlZGlyKGZuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKnAgPSAnLyc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGUgPSBmb3BlbihmbmFtZSwid2IiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKG91dGZpbGUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRXh0cmFjdGluZyAlc1xuIixmbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogQ291bGRuJ3QgY3JlYXRlICVzIixwcm9nLGZuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBvdXRmaWxlID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGdldGhlYWRlciA9IDA7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBHTlVUWVBFX0xPTkdMSU5LOgotICAgICAgICAgICAgY2FzZSBHTlVUWVBFX0xPTkdOQU1FOgotICAgICAgICAgICAgICByZW1haW5pbmcgPSBnZXRvY3QoYnVmZmVyLmhlYWRlci5zaXplLDEyKTsKLSAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8IDAgfHwgcmVtYWluaW5nID49IEJMT0NLU0laRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBhY3Rpb24gPSBUR1pfSU5WQUxJRDsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbGVuID0gZ3pyZWFkKGluLCBmbmFtZSwgQkxPQ0tTSVpFKTsKLSAgICAgICAgICAgICAgaWYgKGxlbiA8IDApCi0gICAgICAgICAgICAgICAgZXJyb3IoZ3plcnJvcihpbiwgJmVycikpOwotICAgICAgICAgICAgICBpZiAoZm5hbWVbQkxPQ0tTSVpFLTFdICE9IDAgfHwgKGludClzdHJsZW4oZm5hbWUpID4gcmVtYWluaW5nKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IFRHWl9JTlZBTElEOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBnZXRoZWFkZXIgPSAyOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gVEdaX0xJU1QpCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIgJXMgICAgIDwtLS0+ICVzXG4iLHN0cnRpbWUoJnRhcnRpbWUpLGZuYW1lKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCBieXRlcyA9IChyZW1haW5pbmcgPiBCTE9DS1NJWkUpID8gQkxPQ0tTSVpFIDogcmVtYWluaW5nOwotCi0gICAgICAgICAgaWYgKG91dGZpbGUgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGZ3cml0ZSgmYnVmZmVyLHNpemVvZihjaGFyKSxieXRlcyxvdXRmaWxlKSAhPSBieXRlcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAgICAgIiVzOiBFcnJvciB3cml0aW5nICVzIC0tIHNraXBwaW5nXG4iLHByb2csZm5hbWUpOwotICAgICAgICAgICAgICAgICAgZmNsb3NlKG91dGZpbGUpOwotICAgICAgICAgICAgICAgICAgb3V0ZmlsZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICByZW1vdmUoZm5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICByZW1haW5pbmcgLT0gYnl0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKHJlbWFpbmluZyA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0aGVhZGVyID0gMTsKLSAgICAgICAgICBpZiAob3V0ZmlsZSAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmY2xvc2Uob3V0ZmlsZSk7Ci0gICAgICAgICAgICAgIG91dGZpbGUgPSBOVUxMOwotICAgICAgICAgICAgICBpZiAoYWN0aW9uICE9IFRHWl9JTlZBTElEKQotICAgICAgICAgICAgICAgIHB1c2hfYXR0cigmYXR0cmlidXRlcyxmbmFtZSx0YXJtb2RlLHRhcnRpbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBBYmFuZG9uIGlmIGVycm9ycyBhcmUgZm91bmQKLSAgICAgICAqLwotICAgICAgaWYgKGFjdGlvbiA9PSBUR1pfSU5WQUxJRCkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yKCJicm9rZW4gYXJjaGl2ZSIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gIC8qCi0gICAqIFJlc3RvcmUgZmlsZSBtb2RlcyBhbmQgdGltZSBzdGFtcHMKLSAgICovCi0gIHJlc3RvcmVfYXR0cigmYXR0cmlidXRlcyk7Ci0KLSAgaWYgKGd6Y2xvc2UoaW4pICE9IFpfT0spCi0gICAgZXJyb3IoImZhaWxlZCBnemNsb3NlIik7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLXZvaWQgaGVscChpbnQgZXhpdHZhbCkKLXsKLSAgcHJpbnRmKCJ1bnRneiB2ZXJzaW9uIDAuMi4xXG4iCi0gICAgICAgICAiICB1c2luZyB6bGliIHZlcnNpb24gJXNcblxuIiwKLSAgICAgICAgIHpsaWJWZXJzaW9uKCkpOwotICBwcmludGYoIlVzYWdlOiB1bnRneiBmaWxlLnRneiAgICAgICAgICAgIGV4dHJhY3QgYWxsIGZpbGVzXG4iCi0gICAgICAgICAiICAgICAgIHVudGd6IGZpbGUudGd6IGZuYW1lIC4uLiAgZXh0cmFjdCBzZWxlY3RlZCBmaWxlc1xuIgotICAgICAgICAgIiAgICAgICB1bnRneiAtbCBmaWxlLnRneiAgICAgICAgIGxpc3QgYXJjaGl2ZSBjb250ZW50c1xuIgotICAgICAgICAgIiAgICAgICB1bnRneiAtaCAgICAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwXG4iKTsKLSAgZXhpdChleGl0dmFsKTsKLX0KLQotdm9pZCBlcnJvcihjb25zdCBjaGFyICptc2cpCi17Ci0gIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCBwcm9nLCBtc2cpOwotICBleGl0KDEpOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0jaWYgZGVmaW5lZChXSU4zMikgJiYgZGVmaW5lZChfX0dOVUNfXykKLWludCBfQ1JUX2dsb2IgPSAwOyAgICAgIC8qIGRpc2FibGUgYXJndW1lbnQgZ2xvYmJpbmcgaW4gTWluR1cgKi8KLSNlbmRpZgotCi1pbnQgbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikKLXsKLSAgICBpbnQgICAgICAgICBhY3Rpb24gPSBUR1pfRVhUUkFDVDsKLSAgICBpbnQgICAgICAgICBhcmcgPSAxOwotICAgIGNoYXIgICAgICAgICpUR1pmaWxlOwotICAgIGd6RmlsZSAgICAgICpmOwotCi0gICAgcHJvZyA9IHN0cnJjaHIoYXJndlswXSwnXFwnKTsKLSAgICBpZiAocHJvZyA9PSBOVUxMKQotICAgICAgewotICAgICAgICBwcm9nID0gc3RycmNocihhcmd2WzBdLCcvJyk7Ci0gICAgICAgIGlmIChwcm9nID09IE5VTEwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJvZyA9IHN0cnJjaHIoYXJndlswXSwnOicpOwotICAgICAgICAgICAgaWYgKHByb2cgPT0gTlVMTCkKLSAgICAgICAgICAgICAgcHJvZyA9IGFyZ3ZbMF07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHByb2crKzsKLSAgICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwcm9nKys7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgcHJvZysrOwotCi0gICAgaWYgKGFyZ2MgPT0gMSkKLSAgICAgIGhlbHAoMCk7Ci0KLSAgICBpZiAoc3RyY21wKGFyZ3ZbYXJnXSwiLWwiKSA9PSAwKQotICAgICAgewotICAgICAgICBhY3Rpb24gPSBUR1pfTElTVDsKLSAgICAgICAgaWYgKGFyZ2MgPT0gKythcmcpCi0gICAgICAgICAgaGVscCgwKTsKLSAgICAgIH0KLSAgICBlbHNlIGlmIChzdHJjbXAoYXJndlthcmddLCItaCIpID09IDApCi0gICAgICB7Ci0gICAgICAgIGhlbHAoMCk7Ci0gICAgICB9Ci0KLSAgICBpZiAoKFRHWmZpbGUgPSBUR1pmbmFtZShhcmd2W2FyZ10pKSA9PSBOVUxMKQotICAgICAgVEdabm90Zm91bmQoYXJndlthcmddKTsKLQotICAgICsrYXJnOwotICAgIGlmICgoYWN0aW9uID09IFRHWl9MSVNUKSAmJiAoYXJnICE9IGFyZ2MpKQotICAgICAgaGVscCgxKTsKLQotLyoKLSAqICBQcm9jZXNzIHRoZSBUR1ogZmlsZQotICovCi0gICAgc3dpdGNoKGFjdGlvbikKLSAgICAgIHsKLSAgICAgIGNhc2UgVEdaX0xJU1Q6Ci0gICAgICBjYXNlIFRHWl9FWFRSQUNUOgotICAgICAgICBmID0gZ3pvcGVuKFRHWmZpbGUsInJiIik7Ci0gICAgICAgIGlmIChmID09IE5VTEwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiVzOiBDb3VsZG4ndCBnem9wZW4gJXNcbiIscHJvZyxUR1pmaWxlKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgIH0KLSAgICAgICAgZXhpdCh0YXIoZiwgYWN0aW9uLCBhcmcsIGFyZ2MsIGFyZ3YpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBlcnJvcigiVW5rbm93biBvcHRpb24iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0KLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvY3JjMzIuYyBiL3NyYy96bGliL2NyYzMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OWE3MTkuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvY3JjMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDQyNSArMCwwIEBACi0vKiBjcmMzMi5jIC0tIGNvbXB1dGUgdGhlIENSQy0zMiBvZiBhIGRhdGEgc3RyZWFtCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNiwgMjAxMCwgMjAxMSwgMjAxMiBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKgotICogVGhhbmtzIHRvIFJvZG5leSBCcm93biA8cmJyb3duNjRAY3NjLmNvbS5hdT4gZm9yIGhpcyBjb250cmlidXRpb24gb2YgZmFzdGVyCi0gKiBDUkMgbWV0aG9kczogZXhjbHVzaXZlLW9yaW5nIDMyIGJpdHMgb2YgZGF0YSBhdCBhIHRpbWUsIGFuZCBwcmUtY29tcHV0aW5nCi0gKiB0YWJsZXMgZm9yIHVwZGF0aW5nIHRoZSBzaGlmdCByZWdpc3RlciBpbiBvbmUgc3RlcCB3aXRoIHRocmVlIGV4Y2x1c2l2ZS1vcnMKLSAqIGluc3RlYWQgb2YgZm91ciBzdGVwcyB3aXRoIGZvdXIgZXhjbHVzaXZlLW9ycy4gIFRoaXMgcmVzdWx0cyBpbiBhYm91dCBhCi0gKiBmYWN0b3Igb2YgdHdvIGluY3JlYXNlIGluIHNwZWVkIG9uIGEgUG93ZXIgUEMgRzQgKFBQQzc0NTUpIHVzaW5nIGdjYyAtTzMuCi0gKi8KLQotLyogQCgjKSAkSWQkICovCi0KLS8qCi0gIE5vdGUgb24gdGhlIHVzZSBvZiBEWU5BTUlDX0NSQ19UQUJMRTogdGhlcmUgaXMgbm8gbXV0ZXggb3Igc2VtYXBob3JlCi0gIHByb3RlY3Rpb24gb24gdGhlIHN0YXRpYyB2YXJpYWJsZXMgdXNlZCB0byBjb250cm9sIHRoZSBmaXJzdC11c2UgZ2VuZXJhdGlvbgotICBvZiB0aGUgY3JjIHRhYmxlcy4gIFRoZXJlZm9yZSwgaWYgeW91ICNkZWZpbmUgRFlOQU1JQ19DUkNfVEFCTEUsIHlvdSBzaG91bGQKLSAgZmlyc3QgY2FsbCBnZXRfY3JjX3RhYmxlKCkgdG8gaW5pdGlhbGl6ZSB0aGUgdGFibGVzIGJlZm9yZSBhbGxvd2luZyBtb3JlIHRoYW4KLSAgb25lIHRocmVhZCB0byB1c2UgY3JjMzIoKS4KLQotICBEWU5BTUlDX0NSQ19UQUJMRSBhbmQgTUFLRUNSQ0ggY2FuIGJlICNkZWZpbmVkIHRvIHdyaXRlIG91dCBjcmMzMi5oLgotICovCi0KLSNpZmRlZiBNQUtFQ1JDSAotIyAgaW5jbHVkZSA8c3RkaW8uaD4KLSMgIGlmbmRlZiBEWU5BTUlDX0NSQ19UQUJMRQotIyAgICBkZWZpbmUgRFlOQU1JQ19DUkNfVEFCTEUKLSMgIGVuZGlmIC8qICFEWU5BTUlDX0NSQ19UQUJMRSAqLwotI2VuZGlmIC8qIE1BS0VDUkNIICovCi0KLSNpbmNsdWRlICJ6dXRpbC5oIiAgICAgIC8qIGZvciBTVERDIGFuZCBGQVIgZGVmaW5pdGlvbnMgKi8KLQotI2RlZmluZSBsb2NhbCBzdGF0aWMKLQotLyogRGVmaW5pdGlvbnMgZm9yIGRvaW5nIHRoZSBjcmMgZm91ciBkYXRhIGJ5dGVzIGF0IGEgdGltZS4gKi8KLSNpZiAhZGVmaW5lZChOT0JZRk9VUikgJiYgZGVmaW5lZChaX1U0KQotIyAgZGVmaW5lIEJZRk9VUgotI2VuZGlmCi0jaWZkZWYgQllGT1VSCi0gICBsb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2xpdHRsZSBPRigodW5zaWduZWQgbG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICosIHVuc2lnbmVkKSk7Ci0gICBsb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2JpZyBPRigodW5zaWduZWQgbG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICosIHVuc2lnbmVkKSk7Ci0jICBkZWZpbmUgVEJMUyA4Ci0jZWxzZQotIyAgZGVmaW5lIFRCTFMgMQotI2VuZGlmIC8qIEJZRk9VUiAqLwotCi0vKiBMb2NhbCBmdW5jdGlvbnMgZm9yIGNyYyBjb25jYXRlbmF0aW9uICovCi1sb2NhbCB1bnNpZ25lZCBsb25nIGdmMl9tYXRyaXhfdGltZXMgT0YoKHVuc2lnbmVkIGxvbmcgKm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB2ZWMpKTsKLWxvY2FsIHZvaWQgZ2YyX21hdHJpeF9zcXVhcmUgT0YoKHVuc2lnbmVkIGxvbmcgKnNxdWFyZSwgdW5zaWduZWQgbG9uZyAqbWF0KSk7Ci1sb2NhbCB1TG9uZyBjcmMzMl9jb21iaW5lXyBPRigodUxvbmcgY3JjMSwgdUxvbmcgY3JjMiwgel9vZmY2NF90IGxlbjIpKTsKLQotCi0jaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKLQotbG9jYWwgdm9sYXRpbGUgaW50IGNyY190YWJsZV9lbXB0eSA9IDE7Ci1sb2NhbCB6X2NyY190IEZBUiBjcmNfdGFibGVbVEJMU11bMjU2XTsKLWxvY2FsIHZvaWQgbWFrZV9jcmNfdGFibGUgT0YoKHZvaWQpKTsKLSNpZmRlZiBNQUtFQ1JDSAotICAgbG9jYWwgdm9pZCB3cml0ZV90YWJsZSBPRigoRklMRSAqLCBjb25zdCB6X2NyY190IEZBUiAqKSk7Ci0jZW5kaWYgLyogTUFLRUNSQ0ggKi8KLS8qCi0gIEdlbmVyYXRlIHRhYmxlcyBmb3IgYSBieXRlLXdpc2UgMzItYml0IENSQyBjYWxjdWxhdGlvbiBvbiB0aGUgcG9seW5vbWlhbDoKLSAgeF4zMit4XjI2K3heMjMreF4yMit4XjE2K3heMTIreF4xMSt4XjEwK3heOCt4XjcreF41K3heNCt4XjIreCsxLgotCi0gIFBvbHlub21pYWxzIG92ZXIgR0YoMikgYXJlIHJlcHJlc2VudGVkIGluIGJpbmFyeSwgb25lIGJpdCBwZXIgY29lZmZpY2llbnQsCi0gIHdpdGggdGhlIGxvd2VzdCBwb3dlcnMgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LiAgVGhlbiBhZGRpbmcgcG9seW5vbWlhbHMKLSAgaXMganVzdCBleGNsdXNpdmUtb3IsIGFuZCBtdWx0aXBseWluZyBhIHBvbHlub21pYWwgYnkgeCBpcyBhIHJpZ2h0IHNoaWZ0IGJ5Ci0gIG9uZS4gIElmIHdlIGNhbGwgdGhlIGFib3ZlIHBvbHlub21pYWwgcCwgYW5kIHJlcHJlc2VudCBhIGJ5dGUgYXMgdGhlCi0gIHBvbHlub21pYWwgcSwgYWxzbyB3aXRoIHRoZSBsb3dlc3QgcG93ZXIgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IChzbyB0aGUKLSAgYnl0ZSAweGIxIGlzIHRoZSBwb2x5bm9taWFsIHheNyt4XjMreCsxKSwgdGhlbiB0aGUgQ1JDIGlzIChxKnheMzIpIG1vZCBwLAotICB3aGVyZSBhIG1vZCBiIG1lYW5zIHRoZSByZW1haW5kZXIgYWZ0ZXIgZGl2aWRpbmcgYSBieSBiLgotCi0gIFRoaXMgY2FsY3VsYXRpb24gaXMgZG9uZSB1c2luZyB0aGUgc2hpZnQtcmVnaXN0ZXIgbWV0aG9kIG9mIG11bHRpcGx5aW5nIGFuZAotICB0YWtpbmcgdGhlIHJlbWFpbmRlci4gIFRoZSByZWdpc3RlciBpcyBpbml0aWFsaXplZCB0byB6ZXJvLCBhbmQgZm9yIGVhY2gKLSAgaW5jb21pbmcgYml0LCB4XjMyIGlzIGFkZGVkIG1vZCBwIHRvIHRoZSByZWdpc3RlciBpZiB0aGUgYml0IGlzIGEgb25lICh3aGVyZQotICB4XjMyIG1vZCBwIGlzIHAreF4zMiA9IHheMjYrLi4uKzEpLCBhbmQgdGhlIHJlZ2lzdGVyIGlzIG11bHRpcGxpZWQgbW9kIHAgYnkKLSAgeCAod2hpY2ggaXMgc2hpZnRpbmcgcmlnaHQgYnkgb25lIGFuZCBhZGRpbmcgeF4zMiBtb2QgcCBpZiB0aGUgYml0IHNoaWZ0ZWQKLSAgb3V0IGlzIGEgb25lKS4gIFdlIHN0YXJ0IHdpdGggdGhlIGhpZ2hlc3QgcG93ZXIgKGxlYXN0IHNpZ25pZmljYW50IGJpdCkgb2YKLSAgcSBhbmQgcmVwZWF0IGZvciBhbGwgZWlnaHQgYml0cyBvZiBxLgotCi0gIFRoZSBmaXJzdCB0YWJsZSBpcyBzaW1wbHkgdGhlIENSQyBvZiBhbGwgcG9zc2libGUgZWlnaHQgYml0IHZhbHVlcy4gIFRoaXMgaXMKLSAgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZ2VuZXJhdGUgQ1JDcyBvbiBkYXRhIGEgYnl0ZSBhdCBhIHRpbWUgZm9yIGFsbAotICBjb21iaW5hdGlvbnMgb2YgQ1JDIHJlZ2lzdGVyIHZhbHVlcyBhbmQgaW5jb21pbmcgYnl0ZXMuICBUaGUgcmVtYWluaW5nIHRhYmxlcwotICBhbGxvdyBmb3Igd29yZC1hdC1hLXRpbWUgQ1JDIGNhbGN1bGF0aW9uIGZvciBib3RoIGJpZy1lbmRpYW4gYW5kIGxpdHRsZS0KLSAgZW5kaWFuIG1hY2hpbmVzLCB3aGVyZSBhIHdvcmQgaXMgZm91ciBieXRlcy4KLSovCi1sb2NhbCB2b2lkIG1ha2VfY3JjX3RhYmxlKCkKLXsKLSAgICB6X2NyY190IGM7Ci0gICAgaW50IG4sIGs7Ci0gICAgel9jcmNfdCBwb2x5OyAgICAgICAgICAgICAgICAgICAgICAgLyogcG9seW5vbWlhbCBleGNsdXNpdmUtb3IgcGF0dGVybiAqLwotICAgIC8qIHRlcm1zIG9mIHBvbHlub21pYWwgZGVmaW5pbmcgdGhpcyBjcmMgKGV4Y2VwdCB4XjMyKTogKi8KLSAgICBzdGF0aWMgdm9sYXRpbGUgaW50IGZpcnN0ID0gMTsgICAgICAvKiBmbGFnIHRvIGxpbWl0IGNvbmN1cnJlbnQgbWFraW5nICovCi0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcFtdID0gezAsMSwyLDQsNSw3LDgsMTAsMTEsMTIsMTYsMjIsMjMsMjZ9OwotCi0gICAgLyogU2VlIGlmIGFub3RoZXIgdGFzayBpcyBhbHJlYWR5IGRvaW5nIHRoaXMgKG5vdCB0aHJlYWQtc2FmZSwgYnV0IGJldHRlcgotICAgICAgIHRoYW4gbm90aGluZyAtLSBzaWduaWZpY2FudGx5IHJlZHVjZXMgZHVyYXRpb24gb2YgdnVsbmVyYWJpbGl0eSBpbgotICAgICAgIGNhc2UgdGhlIGFkdmljZSBhYm91dCBEWU5BTUlDX0NSQ19UQUJMRSBpcyBpZ25vcmVkKSAqLwotICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IDA7Ci0KLSAgICAgICAgLyogbWFrZSBleGNsdXNpdmUtb3IgcGF0dGVybiBmcm9tIHBvbHlub21pYWwgKDB4ZWRiODgzMjBVTCkgKi8KLSAgICAgICAgcG9seSA9IDA7Ci0gICAgICAgIGZvciAobiA9IDA7IG4gPCAoaW50KShzaXplb2YocCkvc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsgbisrKQotICAgICAgICAgICAgcG9seSB8PSAoel9jcmNfdCkxIDw8ICgzMSAtIHBbbl0pOwotCi0gICAgICAgIC8qIGdlbmVyYXRlIGEgY3JjIGZvciBldmVyeSA4LWJpdCB2YWx1ZSAqLwotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspIHsKLSAgICAgICAgICAgIGMgPSAoel9jcmNfdCluOwotICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDg7IGsrKykKLSAgICAgICAgICAgICAgICBjID0gYyAmIDEgPyBwb2x5IF4gKGMgPj4gMSkgOiBjID4+IDE7Ci0gICAgICAgICAgICBjcmNfdGFibGVbMF1bbl0gPSBjOwotICAgICAgICB9Ci0KLSNpZmRlZiBCWUZPVVIKLSAgICAgICAgLyogZ2VuZXJhdGUgY3JjIGZvciBlYWNoIHZhbHVlIGZvbGxvd2VkIGJ5IG9uZSwgdHdvLCBhbmQgdGhyZWUgemVyb3MsCi0gICAgICAgICAgIGFuZCB0aGVuIHRoZSBieXRlIHJldmVyc2FsIG9mIHRob3NlIGFzIHdlbGwgYXMgdGhlIGZpcnN0IHRhYmxlICovCi0gICAgICAgIGZvciAobiA9IDA7IG4gPCAyNTY7IG4rKykgewotICAgICAgICAgICAgYyA9IGNyY190YWJsZVswXVtuXTsKLSAgICAgICAgICAgIGNyY190YWJsZVs0XVtuXSA9IFpTV0FQMzIoYyk7Ci0gICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDwgNDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgYyA9IGNyY190YWJsZVswXVtjICYgMHhmZl0gXiAoYyA+PiA4KTsKLSAgICAgICAgICAgICAgICBjcmNfdGFibGVba11bbl0gPSBjOwotICAgICAgICAgICAgICAgIGNyY190YWJsZVtrICsgNF1bbl0gPSBaU1dBUDMyKGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYgLyogQllGT1VSICovCi0KLSAgICAgICAgY3JjX3RhYmxlX2VtcHR5ID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7ICAgICAgLyogbm90IGZpcnN0ICovCi0gICAgICAgIC8qIHdhaXQgZm9yIHRoZSBvdGhlciBndXkgdG8gZmluaXNoIChub3QgZWZmaWNpZW50LCBidXQgcmFyZSkgKi8KLSAgICAgICAgd2hpbGUgKGNyY190YWJsZV9lbXB0eSkKLSAgICAgICAgICAgIDsKLSAgICB9Ci0KLSNpZmRlZiBNQUtFQ1JDSAotICAgIC8qIHdyaXRlIG91dCBDUkMgdGFibGVzIHRvIGNyYzMyLmggKi8KLSAgICB7Ci0gICAgICAgIEZJTEUgKm91dDsKLQotICAgICAgICBvdXQgPSBmb3BlbigiY3JjMzIuaCIsICJ3Iik7Ci0gICAgICAgIGlmIChvdXQgPT0gTlVMTCkgcmV0dXJuOwotICAgICAgICBmcHJpbnRmKG91dCwgIi8qIGNyYzMyLmggLS0gdGFibGVzIGZvciByYXBpZCBDUkMgY2FsY3VsYXRpb25cbiIpOwotICAgICAgICBmcHJpbnRmKG91dCwgIiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNyYzMyLmNcbiAqL1xuXG4iKTsKLSAgICAgICAgZnByaW50ZihvdXQsICJsb2NhbCBjb25zdCB6X2NyY190IEZBUiAiKTsKLSAgICAgICAgZnByaW50ZihvdXQsICJjcmNfdGFibGVbVEJMU11bMjU2XSA9XG57XG4gIHtcbiIpOwotICAgICAgICB3cml0ZV90YWJsZShvdXQsIGNyY190YWJsZVswXSk7Ci0jICBpZmRlZiBCWUZPVVIKLSAgICAgICAgZnByaW50ZihvdXQsICIjaWZkZWYgQllGT1VSXG4iKTsKLSAgICAgICAgZm9yIChrID0gMTsgayA8IDg7IGsrKykgewotICAgICAgICAgICAgZnByaW50ZihvdXQsICIgIH0sXG4gIHtcbiIpOwotICAgICAgICAgICAgd3JpdGVfdGFibGUob3V0LCBjcmNfdGFibGVba10pOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYob3V0LCAiI2VuZGlmXG4iKTsKLSMgIGVuZGlmIC8qIEJZRk9VUiAqLwotICAgICAgICBmcHJpbnRmKG91dCwgIiAgfVxufTtcbiIpOwotICAgICAgICBmY2xvc2Uob3V0KTsKLSAgICB9Ci0jZW5kaWYgLyogTUFLRUNSQ0ggKi8KLX0KLQotI2lmZGVmIE1BS0VDUkNICi1sb2NhbCB2b2lkIHdyaXRlX3RhYmxlKG91dCwgdGFibGUpCi0gICAgRklMRSAqb3V0OwotICAgIGNvbnN0IHpfY3JjX3QgRkFSICp0YWJsZTsKLXsKLSAgICBpbnQgbjsKLQotICAgIGZvciAobiA9IDA7IG4gPCAyNTY7IG4rKykKLSAgICAgICAgZnByaW50ZihvdXQsICIlczB4JTA4bHhVTCVzIiwgbiAlIDUgPyAiIiA6ICIgICAgIiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykodGFibGVbbl0pLAotICAgICAgICAgICAgICAgIG4gPT0gMjU1ID8gIlxuIiA6IChuICUgNSA9PSA0ID8gIixcbiIgOiAiLCAiKSk7Ci19Ci0jZW5kaWYgLyogTUFLRUNSQ0ggKi8KLQotI2Vsc2UgLyogIURZTkFNSUNfQ1JDX1RBQkxFICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRhYmxlcyBvZiBDUkMtMzJzIG9mIGFsbCBzaW5nbGUtYnl0ZSB2YWx1ZXMsIG1hZGUgYnkgbWFrZV9jcmNfdGFibGUoKS4KLSAqLwotI2luY2x1ZGUgImNyYzMyLmgiCi0jZW5kaWYgLyogRFlOQU1JQ19DUkNfVEFCTEUgKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBieSBhc20gdmVyc2lvbnMgb2YgY3JjMzIoKQotICovCi1jb25zdCB6X2NyY190IEZBUiAqIFpFWFBPUlQgZ2V0X2NyY190YWJsZSgpCi17Ci0jaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKLSAgICBpZiAoY3JjX3RhYmxlX2VtcHR5KQotICAgICAgICBtYWtlX2NyY190YWJsZSgpOwotI2VuZGlmIC8qIERZTkFNSUNfQ1JDX1RBQkxFICovCi0gICAgcmV0dXJuIChjb25zdCB6X2NyY190IEZBUiAqKWNyY190YWJsZTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBETzEgY3JjID0gY3JjX3RhYmxlWzBdWygoaW50KWNyYyBeICgqYnVmKyspKSAmIDB4ZmZdIF4gKGNyYyA+PiA4KQotI2RlZmluZSBETzggRE8xOyBETzE7IERPMTsgRE8xOyBETzE7IERPMTsgRE8xOyBETzEKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotdW5zaWduZWQgbG9uZyBaRVhQT1JUIGNyYzMyKGNyYywgYnVmLCBsZW4pCi0gICAgdW5zaWduZWQgbG9uZyBjcmM7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKmJ1ZjsKLSAgICB1SW50IGxlbjsKLXsKLSAgICBpZiAoYnVmID09IFpfTlVMTCkgcmV0dXJuIDBVTDsKLQotI2lmZGVmIERZTkFNSUNfQ1JDX1RBQkxFCi0gICAgaWYgKGNyY190YWJsZV9lbXB0eSkKLSAgICAgICAgbWFrZV9jcmNfdGFibGUoKTsKLSNlbmRpZiAvKiBEWU5BTUlDX0NSQ19UQUJMRSAqLwotCi0jaWZkZWYgQllGT1VSCi0gICAgaWYgKHNpemVvZih2b2lkICopID09IHNpemVvZihwdHJkaWZmX3QpKSB7Ci0gICAgICAgIHpfY3JjX3QgZW5kaWFuOwotCi0gICAgICAgIGVuZGlhbiA9IDE7Ci0gICAgICAgIGlmICgqKCh1bnNpZ25lZCBjaGFyICopKCZlbmRpYW4pKSkKLSAgICAgICAgICAgIHJldHVybiBjcmMzMl9saXR0bGUoY3JjLCBidWYsIGxlbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBjcmMzMl9iaWcoY3JjLCBidWYsIGxlbik7Ci0gICAgfQotI2VuZGlmIC8qIEJZRk9VUiAqLwotICAgIGNyYyA9IGNyYyBeIDB4ZmZmZmZmZmZVTDsKLSAgICB3aGlsZSAobGVuID49IDgpIHsKLSAgICAgICAgRE84OwotICAgICAgICBsZW4gLT0gODsKLSAgICB9Ci0gICAgaWYgKGxlbikgZG8gewotICAgICAgICBETzE7Ci0gICAgfSB3aGlsZSAoLS1sZW4pOwotICAgIHJldHVybiBjcmMgXiAweGZmZmZmZmZmVUw7Ci19Ci0KLSNpZmRlZiBCWUZPVVIKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBET0xJVDQgYyBePSAqYnVmNCsrOyBcCi0gICAgICAgIGMgPSBjcmNfdGFibGVbM11bYyAmIDB4ZmZdIF4gY3JjX3RhYmxlWzJdWyhjID4+IDgpICYgMHhmZl0gXiBcCi0gICAgICAgICAgICBjcmNfdGFibGVbMV1bKGMgPj4gMTYpICYgMHhmZl0gXiBjcmNfdGFibGVbMF1bYyA+PiAyNF0KLSNkZWZpbmUgRE9MSVQzMiBET0xJVDQ7IERPTElUNDsgRE9MSVQ0OyBET0xJVDQ7IERPTElUNDsgRE9MSVQ0OyBET0xJVDQ7IERPTElUNAotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1sb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2xpdHRsZShjcmMsIGJ1ZiwgbGVuKQotICAgIHVuc2lnbmVkIGxvbmcgY3JjOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpidWY7Ci0gICAgdW5zaWduZWQgbGVuOwotewotICAgIHJlZ2lzdGVyIHpfY3JjX3QgYzsKLSAgICByZWdpc3RlciBjb25zdCB6X2NyY190IEZBUiAqYnVmNDsKLQotICAgIGMgPSAoel9jcmNfdCljcmM7Ci0gICAgYyA9IH5jOwotICAgIHdoaWxlIChsZW4gJiYgKChwdHJkaWZmX3QpYnVmICYgMykpIHsKLSAgICAgICAgYyA9IGNyY190YWJsZVswXVsoYyBeICpidWYrKykgJiAweGZmXSBeIChjID4+IDgpOwotICAgICAgICBsZW4tLTsKLSAgICB9Ci0KLSAgICBidWY0ID0gKGNvbnN0IHpfY3JjX3QgRkFSICopKGNvbnN0IHZvaWQgRkFSICopYnVmOwotICAgIHdoaWxlIChsZW4gPj0gMzIpIHsKLSAgICAgICAgRE9MSVQzMjsKLSAgICAgICAgbGVuIC09IDMyOwotICAgIH0KLSAgICB3aGlsZSAobGVuID49IDQpIHsKLSAgICAgICAgRE9MSVQ0OwotICAgICAgICBsZW4gLT0gNDsKLSAgICB9Ci0gICAgYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICopYnVmNDsKLQotICAgIGlmIChsZW4pIGRvIHsKLSAgICAgICAgYyA9IGNyY190YWJsZVswXVsoYyBeICpidWYrKykgJiAweGZmXSBeIChjID4+IDgpOwotICAgIH0gd2hpbGUgKC0tbGVuKTsKLSAgICBjID0gfmM7Ci0gICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKWM7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgRE9CSUc0IGMgXj0gKisrYnVmNDsgXAotICAgICAgICBjID0gY3JjX3RhYmxlWzRdW2MgJiAweGZmXSBeIGNyY190YWJsZVs1XVsoYyA+PiA4KSAmIDB4ZmZdIF4gXAotICAgICAgICAgICAgY3JjX3RhYmxlWzZdWyhjID4+IDE2KSAmIDB4ZmZdIF4gY3JjX3RhYmxlWzddW2MgPj4gMjRdCi0jZGVmaW5lIERPQklHMzIgRE9CSUc0OyBET0JJRzQ7IERPQklHNDsgRE9CSUc0OyBET0JJRzQ7IERPQklHNDsgRE9CSUc0OyBET0JJRzQKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotbG9jYWwgdW5zaWduZWQgbG9uZyBjcmMzMl9iaWcoY3JjLCBidWYsIGxlbikKLSAgICB1bnNpZ25lZCBsb25nIGNyYzsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqYnVmOwotICAgIHVuc2lnbmVkIGxlbjsKLXsKLSAgICByZWdpc3RlciB6X2NyY190IGM7Ci0gICAgcmVnaXN0ZXIgY29uc3Qgel9jcmNfdCBGQVIgKmJ1ZjQ7Ci0KLSAgICBjID0gWlNXQVAzMigoel9jcmNfdCljcmMpOwotICAgIGMgPSB+YzsKLSAgICB3aGlsZSAobGVuICYmICgocHRyZGlmZl90KWJ1ZiAmIDMpKSB7Ci0gICAgICAgIGMgPSBjcmNfdGFibGVbNF1bKGMgPj4gMjQpIF4gKmJ1ZisrXSBeIChjIDw8IDgpOwotICAgICAgICBsZW4tLTsKLSAgICB9Ci0KLSAgICBidWY0ID0gKGNvbnN0IHpfY3JjX3QgRkFSICopKGNvbnN0IHZvaWQgRkFSICopYnVmOwotICAgIGJ1ZjQtLTsKLSAgICB3aGlsZSAobGVuID49IDMyKSB7Ci0gICAgICAgIERPQklHMzI7Ci0gICAgICAgIGxlbiAtPSAzMjsKLSAgICB9Ci0gICAgd2hpbGUgKGxlbiA+PSA0KSB7Ci0gICAgICAgIERPQklHNDsKLSAgICAgICAgbGVuIC09IDQ7Ci0gICAgfQotICAgIGJ1ZjQrKzsKLSAgICBidWYgPSAoY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKilidWY0OwotCi0gICAgaWYgKGxlbikgZG8gewotICAgICAgICBjID0gY3JjX3RhYmxlWzRdWyhjID4+IDI0KSBeICpidWYrK10gXiAoYyA8PCA4KTsKLSAgICB9IHdoaWxlICgtLWxlbik7Ci0gICAgYyA9IH5jOwotICAgIHJldHVybiAodW5zaWduZWQgbG9uZykoWlNXQVAzMihjKSk7Ci19Ci0KLSNlbmRpZiAvKiBCWUZPVVIgKi8KLQotI2RlZmluZSBHRjJfRElNIDMyICAgICAgLyogZGltZW5zaW9uIG9mIEdGKDIpIHZlY3RvcnMgKGxlbmd0aCBvZiBDUkMpICovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWxvY2FsIHVuc2lnbmVkIGxvbmcgZ2YyX21hdHJpeF90aW1lcyhtYXQsIHZlYykKLSAgICB1bnNpZ25lZCBsb25nICptYXQ7Ci0gICAgdW5zaWduZWQgbG9uZyB2ZWM7Ci17Ci0gICAgdW5zaWduZWQgbG9uZyBzdW07Ci0KLSAgICBzdW0gPSAwOwotICAgIHdoaWxlICh2ZWMpIHsKLSAgICAgICAgaWYgKHZlYyAmIDEpCi0gICAgICAgICAgICBzdW0gXj0gKm1hdDsKLSAgICAgICAgdmVjID4+PSAxOwotICAgICAgICBtYXQrKzsKLSAgICB9Ci0gICAgcmV0dXJuIHN1bTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotbG9jYWwgdm9pZCBnZjJfbWF0cml4X3NxdWFyZShzcXVhcmUsIG1hdCkKLSAgICB1bnNpZ25lZCBsb25nICpzcXVhcmU7Ci0gICAgdW5zaWduZWQgbG9uZyAqbWF0OwotewotICAgIGludCBuOwotCi0gICAgZm9yIChuID0gMDsgbiA8IEdGMl9ESU07IG4rKykKLSAgICAgICAgc3F1YXJlW25dID0gZ2YyX21hdHJpeF90aW1lcyhtYXQsIG1hdFtuXSk7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWxvY2FsIHVMb25nIGNyYzMyX2NvbWJpbmVfKGNyYzEsIGNyYzIsIGxlbjIpCi0gICAgdUxvbmcgY3JjMTsKLSAgICB1TG9uZyBjcmMyOwotICAgIHpfb2ZmNjRfdCBsZW4yOwotewotICAgIGludCBuOwotICAgIHVuc2lnbmVkIGxvbmcgcm93OwotICAgIHVuc2lnbmVkIGxvbmcgZXZlbltHRjJfRElNXTsgICAgLyogZXZlbi1wb3dlci1vZi10d28gemVyb3Mgb3BlcmF0b3IgKi8KLSAgICB1bnNpZ25lZCBsb25nIG9kZFtHRjJfRElNXTsgICAgIC8qIG9kZC1wb3dlci1vZi10d28gemVyb3Mgb3BlcmF0b3IgKi8KLQotICAgIC8qIGRlZ2VuZXJhdGUgY2FzZSAoYWxzbyBkaXNhbGxvdyBuZWdhdGl2ZSBsZW5ndGhzKSAqLwotICAgIGlmIChsZW4yIDw9IDApCi0gICAgICAgIHJldHVybiBjcmMxOwotCi0gICAgLyogcHV0IG9wZXJhdG9yIGZvciBvbmUgemVybyBiaXQgaW4gb2RkICovCi0gICAgb2RkWzBdID0gMHhlZGI4ODMyMFVMOyAgICAgICAgICAvKiBDUkMtMzIgcG9seW5vbWlhbCAqLwotICAgIHJvdyA9IDE7Ci0gICAgZm9yIChuID0gMTsgbiA8IEdGMl9ESU07IG4rKykgewotICAgICAgICBvZGRbbl0gPSByb3c7Ci0gICAgICAgIHJvdyA8PD0gMTsKLSAgICB9Ci0KLSAgICAvKiBwdXQgb3BlcmF0b3IgZm9yIHR3byB6ZXJvIGJpdHMgaW4gZXZlbiAqLwotICAgIGdmMl9tYXRyaXhfc3F1YXJlKGV2ZW4sIG9kZCk7Ci0KLSAgICAvKiBwdXQgb3BlcmF0b3IgZm9yIGZvdXIgemVybyBiaXRzIGluIG9kZCAqLwotICAgIGdmMl9tYXRyaXhfc3F1YXJlKG9kZCwgZXZlbik7Ci0KLSAgICAvKiBhcHBseSBsZW4yIHplcm9zIHRvIGNyYzEgKGZpcnN0IHNxdWFyZSB3aWxsIHB1dCB0aGUgb3BlcmF0b3IgZm9yIG9uZQotICAgICAgIHplcm8gYnl0ZSwgZWlnaHQgemVybyBiaXRzLCBpbiBldmVuKSAqLwotICAgIGRvIHsKLSAgICAgICAgLyogYXBwbHkgemVyb3Mgb3BlcmF0b3IgZm9yIHRoaXMgYml0IG9mIGxlbjIgKi8KLSAgICAgICAgZ2YyX21hdHJpeF9zcXVhcmUoZXZlbiwgb2RkKTsKLSAgICAgICAgaWYgKGxlbjIgJiAxKQotICAgICAgICAgICAgY3JjMSA9IGdmMl9tYXRyaXhfdGltZXMoZXZlbiwgY3JjMSk7Ci0gICAgICAgIGxlbjIgPj49IDE7Ci0KLSAgICAgICAgLyogaWYgbm8gbW9yZSBiaXRzIHNldCwgdGhlbiBkb25lICovCi0gICAgICAgIGlmIChsZW4yID09IDApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBhbm90aGVyIGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCB3aXRoIG9kZCBhbmQgZXZlbiBzd2FwcGVkICovCi0gICAgICAgIGdmMl9tYXRyaXhfc3F1YXJlKG9kZCwgZXZlbik7Ci0gICAgICAgIGlmIChsZW4yICYgMSkKLSAgICAgICAgICAgIGNyYzEgPSBnZjJfbWF0cml4X3RpbWVzKG9kZCwgY3JjMSk7Ci0gICAgICAgIGxlbjIgPj49IDE7Ci0KLSAgICAgICAgLyogaWYgbm8gbW9yZSBiaXRzIHNldCwgdGhlbiBkb25lICovCi0gICAgfSB3aGlsZSAobGVuMiAhPSAwKTsKLQotICAgIC8qIHJldHVybiBjb21iaW5lZCBjcmMgKi8KLSAgICBjcmMxIF49IGNyYzI7Ci0gICAgcmV0dXJuIGNyYzE7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXVMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZShjcmMxLCBjcmMyLCBsZW4yKQotICAgIHVMb25nIGNyYzE7Ci0gICAgdUxvbmcgY3JjMjsKLSAgICB6X29mZl90IGxlbjI7Ci17Ci0gICAgcmV0dXJuIGNyYzMyX2NvbWJpbmVfKGNyYzEsIGNyYzIsIGxlbjIpOwotfQotCi11TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmU2NChjcmMxLCBjcmMyLCBsZW4yKQotICAgIHVMb25nIGNyYzE7Ci0gICAgdUxvbmcgY3JjMjsKLSAgICB6X29mZjY0X3QgbGVuMjsKLXsKLSAgICByZXR1cm4gY3JjMzJfY29tYmluZV8oY3JjMSwgY3JjMiwgbGVuMik7Ci19CmRpZmYgLS1naXQgYS9zcmMvemxpYi9jcmMzMi5oIGIvc3JjL3psaWIvY3JjMzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwYzc3OC4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9jcmMzMi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qIGNyYzMyLmggLS0gdGFibGVzIGZvciByYXBpZCBDUkMgY2FsY3VsYXRpb24KLSAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNyYzMyLmMKLSAqLwotCi1sb2NhbCBjb25zdCB6X2NyY190IEZBUiBjcmNfdGFibGVbVEJMU11bMjU2XSA9Ci17Ci0gIHsKLSAgICAweDAwMDAwMDAwVUwsIDB4NzcwNzMwOTZVTCwgMHhlZTBlNjEyY1VMLCAweDk5MDk1MWJhVUwsIDB4MDc2ZGM0MTlVTCwKLSAgICAweDcwNmFmNDhmVUwsIDB4ZTk2M2E1MzVVTCwgMHg5ZTY0OTVhM1VMLCAweDBlZGI4ODMyVUwsIDB4NzlkY2I4YTRVTCwKLSAgICAweGUwZDVlOTFlVUwsIDB4OTdkMmQ5ODhVTCwgMHgwOWI2NGMyYlVMLCAweDdlYjE3Y2JkVUwsIDB4ZTdiODJkMDdVTCwKLSAgICAweDkwYmYxZDkxVUwsIDB4MWRiNzEwNjRVTCwgMHg2YWIwMjBmMlVMLCAweGYzYjk3MTQ4VUwsIDB4ODRiZTQxZGVVTCwKLSAgICAweDFhZGFkNDdkVUwsIDB4NmRkZGU0ZWJVTCwgMHhmNGQ0YjU1MVVMLCAweDgzZDM4NWM3VUwsIDB4MTM2Yzk4NTZVTCwKLSAgICAweDY0NmJhOGMwVUwsIDB4ZmQ2MmY5N2FVTCwgMHg4YTY1YzllY1VMLCAweDE0MDE1YzRmVUwsIDB4NjMwNjZjZDlVTCwKLSAgICAweGZhMGYzZDYzVUwsIDB4OGQwODBkZjVVTCwgMHgzYjZlMjBjOFVMLCAweDRjNjkxMDVlVUwsIDB4ZDU2MDQxZTRVTCwKLSAgICAweGEyNjc3MTcyVUwsIDB4M2MwM2U0ZDFVTCwgMHg0YjA0ZDQ0N1VMLCAweGQyMGQ4NWZkVUwsIDB4YTUwYWI1NmJVTCwKLSAgICAweDM1YjVhOGZhVUwsIDB4NDJiMjk4NmNVTCwgMHhkYmJiYzlkNlVMLCAweGFjYmNmOTQwVUwsIDB4MzJkODZjZTNVTCwKLSAgICAweDQ1ZGY1Yzc1VUwsIDB4ZGNkNjBkY2ZVTCwgMHhhYmQxM2Q1OVVMLCAweDI2ZDkzMGFjVUwsIDB4NTFkZTAwM2FVTCwKLSAgICAweGM4ZDc1MTgwVUwsIDB4YmZkMDYxMTZVTCwgMHgyMWI0ZjRiNVVMLCAweDU2YjNjNDIzVUwsIDB4Y2ZiYTk1OTlVTCwKLSAgICAweGI4YmRhNTBmVUwsIDB4MjgwMmI4OWVVTCwgMHg1ZjA1ODgwOFVMLCAweGM2MGNkOWIyVUwsIDB4YjEwYmU5MjRVTCwKLSAgICAweDJmNmY3Yzg3VUwsIDB4NTg2ODRjMTFVTCwgMHhjMTYxMWRhYlVMLCAweGI2NjYyZDNkVUwsIDB4NzZkYzQxOTBVTCwKLSAgICAweDAxZGI3MTA2VUwsIDB4OThkMjIwYmNVTCwgMHhlZmQ1MTAyYVVMLCAweDcxYjE4NTg5VUwsIDB4MDZiNmI1MWZVTCwKLSAgICAweDlmYmZlNGE1VUwsIDB4ZThiOGQ0MzNVTCwgMHg3ODA3YzlhMlVMLCAweDBmMDBmOTM0VUwsIDB4OTYwOWE4OGVVTCwKLSAgICAweGUxMGU5ODE4VUwsIDB4N2Y2YTBkYmJVTCwgMHgwODZkM2QyZFVMLCAweDkxNjQ2Yzk3VUwsIDB4ZTY2MzVjMDFVTCwKLSAgICAweDZiNmI1MWY0VUwsIDB4MWM2YzYxNjJVTCwgMHg4NTY1MzBkOFVMLCAweGYyNjIwMDRlVUwsIDB4NmMwNjk1ZWRVTCwKLSAgICAweDFiMDFhNTdiVUwsIDB4ODIwOGY0YzFVTCwgMHhmNTBmYzQ1N1VMLCAweDY1YjBkOWM2VUwsIDB4MTJiN2U5NTBVTCwKLSAgICAweDhiYmViOGVhVUwsIDB4ZmNiOTg4N2NVTCwgMHg2MmRkMWRkZlVMLCAweDE1ZGEyZDQ5VUwsIDB4OGNkMzdjZjNVTCwKLSAgICAweGZiZDQ0YzY1VUwsIDB4NGRiMjYxNThVTCwgMHgzYWI1NTFjZVVMLCAweGEzYmMwMDc0VUwsIDB4ZDRiYjMwZTJVTCwKLSAgICAweDRhZGZhNTQxVUwsIDB4M2RkODk1ZDdVTCwgMHhhNGQxYzQ2ZFVMLCAweGQzZDZmNGZiVUwsIDB4NDM2OWU5NmFVTCwKLSAgICAweDM0NmVkOWZjVUwsIDB4YWQ2Nzg4NDZVTCwgMHhkYTYwYjhkMFVMLCAweDQ0MDQyZDczVUwsIDB4MzMwMzFkZTVVTCwKLSAgICAweGFhMGE0YzVmVUwsIDB4ZGQwZDdjYzlVTCwgMHg1MDA1NzEzY1VMLCAweDI3MDI0MWFhVUwsIDB4YmUwYjEwMTBVTCwKLSAgICAweGM5MGMyMDg2VUwsIDB4NTc2OGI1MjVVTCwgMHgyMDZmODViM1VMLCAweGI5NjZkNDA5VUwsIDB4Y2U2MWU0OWZVTCwKLSAgICAweDVlZGVmOTBlVUwsIDB4MjlkOWM5OThVTCwgMHhiMGQwOTgyMlVMLCAweGM3ZDdhOGI0VUwsIDB4NTliMzNkMTdVTCwKLSAgICAweDJlYjQwZDgxVUwsIDB4YjdiZDVjM2JVTCwgMHhjMGJhNmNhZFVMLCAweGVkYjg4MzIwVUwsIDB4OWFiZmIzYjZVTCwKLSAgICAweDAzYjZlMjBjVUwsIDB4NzRiMWQyOWFVTCwgMHhlYWQ1NDczOVVMLCAweDlkZDI3N2FmVUwsIDB4MDRkYjI2MTVVTCwKLSAgICAweDczZGMxNjgzVUwsIDB4ZTM2MzBiMTJVTCwgMHg5NDY0M2I4NFVMLCAweDBkNmQ2YTNlVUwsIDB4N2E2YTVhYThVTCwKLSAgICAweGU0MGVjZjBiVUwsIDB4OTMwOWZmOWRVTCwgMHgwYTAwYWUyN1VMLCAweDdkMDc5ZWIxVUwsIDB4ZjAwZjkzNDRVTCwKLSAgICAweDg3MDhhM2QyVUwsIDB4MWUwMWYyNjhVTCwgMHg2OTA2YzJmZVVMLCAweGY3NjI1NzVkVUwsIDB4ODA2NTY3Y2JVTCwKLSAgICAweDE5NmMzNjcxVUwsIDB4NmU2YjA2ZTdVTCwgMHhmZWQ0MWI3NlVMLCAweDg5ZDMyYmUwVUwsIDB4MTBkYTdhNWFVTCwKLSAgICAweDY3ZGQ0YWNjVUwsIDB4ZjliOWRmNmZVTCwgMHg4ZWJlZWZmOVVMLCAweDE3YjdiZTQzVUwsIDB4NjBiMDhlZDVVTCwKLSAgICAweGQ2ZDZhM2U4VUwsIDB4YTFkMTkzN2VVTCwgMHgzOGQ4YzJjNFVMLCAweDRmZGZmMjUyVUwsIDB4ZDFiYjY3ZjFVTCwKLSAgICAweGE2YmM1NzY3VUwsIDB4M2ZiNTA2ZGRVTCwgMHg0OGIyMzY0YlVMLCAweGQ4MGQyYmRhVUwsIDB4YWYwYTFiNGNVTCwKLSAgICAweDM2MDM0YWY2VUwsIDB4NDEwNDdhNjBVTCwgMHhkZjYwZWZjM1VMLCAweGE4NjdkZjU1VUwsIDB4MzE2ZThlZWZVTCwKLSAgICAweDQ2NjliZTc5VUwsIDB4Y2I2MWIzOGNVTCwgMHhiYzY2ODMxYVVMLCAweDI1NmZkMmEwVUwsIDB4NTI2OGUyMzZVTCwKLSAgICAweGNjMGM3Nzk1VUwsIDB4YmIwYjQ3MDNVTCwgMHgyMjAyMTZiOVVMLCAweDU1MDUyNjJmVUwsIDB4YzViYTNiYmVVTCwKLSAgICAweGIyYmQwYjI4VUwsIDB4MmJiNDVhOTJVTCwgMHg1Y2IzNmEwNFVMLCAweGMyZDdmZmE3VUwsIDB4YjVkMGNmMzFVTCwKLSAgICAweDJjZDk5ZThiVUwsIDB4NWJkZWFlMWRVTCwgMHg5YjY0YzJiMFVMLCAweGVjNjNmMjI2VUwsIDB4NzU2YWEzOWNVTCwKLSAgICAweDAyNmQ5MzBhVUwsIDB4OWMwOTA2YTlVTCwgMHhlYjBlMzYzZlVMLCAweDcyMDc2Nzg1VUwsIDB4MDUwMDU3MTNVTCwKLSAgICAweDk1YmY0YTgyVUwsIDB4ZTJiODdhMTRVTCwgMHg3YmIxMmJhZVVMLCAweDBjYjYxYjM4VUwsIDB4OTJkMjhlOWJVTCwKLSAgICAweGU1ZDViZTBkVUwsIDB4N2NkY2VmYjdVTCwgMHgwYmRiZGYyMVVMLCAweDg2ZDNkMmQ0VUwsIDB4ZjFkNGUyNDJVTCwKLSAgICAweDY4ZGRiM2Y4VUwsIDB4MWZkYTgzNmVVTCwgMHg4MWJlMTZjZFVMLCAweGY2YjkyNjViVUwsIDB4NmZiMDc3ZTFVTCwKLSAgICAweDE4Yjc0Nzc3VUwsIDB4ODgwODVhZTZVTCwgMHhmZjBmNmE3MFVMLCAweDY2MDYzYmNhVUwsIDB4MTEwMTBiNWNVTCwKLSAgICAweDhmNjU5ZWZmVUwsIDB4Zjg2MmFlNjlVTCwgMHg2MTZiZmZkM1VMLCAweDE2NmNjZjQ1VUwsIDB4YTAwYWUyNzhVTCwKLSAgICAweGQ3MGRkMmVlVUwsIDB4NGUwNDgzNTRVTCwgMHgzOTAzYjNjMlVMLCAweGE3NjcyNjYxVUwsIDB4ZDA2MDE2ZjdVTCwKLSAgICAweDQ5Njk0NzRkVUwsIDB4M2U2ZTc3ZGJVTCwgMHhhZWQxNmE0YVVMLCAweGQ5ZDY1YWRjVUwsIDB4NDBkZjBiNjZVTCwKLSAgICAweDM3ZDgzYmYwVUwsIDB4YTliY2FlNTNVTCwgMHhkZWJiOWVjNVVMLCAweDQ3YjJjZjdmVUwsIDB4MzBiNWZmZTlVTCwKLSAgICAweGJkYmRmMjFjVUwsIDB4Y2FiYWMyOGFVTCwgMHg1M2IzOTMzMFVMLCAweDI0YjRhM2E2VUwsIDB4YmFkMDM2MDVVTCwKLSAgICAweGNkZDcwNjkzVUwsIDB4NTRkZTU3MjlVTCwgMHgyM2Q5NjdiZlVMLCAweGIzNjY3YTJlVUwsIDB4YzQ2MTRhYjhVTCwKLSAgICAweDVkNjgxYjAyVUwsIDB4MmE2ZjJiOTRVTCwgMHhiNDBiYmUzN1VMLCAweGMzMGM4ZWExVUwsIDB4NWEwNWRmMWJVTCwKLSAgICAweDJkMDJlZjhkVUwKLSNpZmRlZiBCWUZPVVIKLSAgfSwKLSAgewotICAgIDB4MDAwMDAwMDBVTCwgMHgxOTFiMzE0MVVMLCAweDMyMzY2MjgyVUwsIDB4MmIyZDUzYzNVTCwgMHg2NDZjYzUwNFVMLAotICAgIDB4N2Q3N2Y0NDVVTCwgMHg1NjVhYTc4NlVMLCAweDRmNDE5NmM3VUwsIDB4YzhkOThhMDhVTCwgMHhkMWMyYmI0OVVMLAotICAgIDB4ZmFlZmU4OGFVTCwgMHhlM2Y0ZDljYlVMLCAweGFjYjU0ZjBjVUwsIDB4YjVhZTdlNGRVTCwgMHg5ZTgzMmQ4ZVVMLAotICAgIDB4ODc5ODFjY2ZVTCwgMHg0YWMyMTI1MVVMLCAweDUzZDkyMzEwVUwsIDB4NzhmNDcwZDNVTCwgMHg2MWVmNDE5MlVMLAotICAgIDB4MmVhZWQ3NTVVTCwgMHgzN2I1ZTYxNFVMLCAweDFjOThiNWQ3VUwsIDB4MDU4Mzg0OTZVTCwgMHg4MjFiOTg1OVVMLAotICAgIDB4OWIwMGE5MThVTCwgMHhiMDJkZmFkYlVMLCAweGE5MzZjYjlhVUwsIDB4ZTY3NzVkNWRVTCwgMHhmZjZjNmMxY1VMLAotICAgIDB4ZDQ0MTNmZGZVTCwgMHhjZDVhMGU5ZVVMLCAweDk1ODQyNGEyVUwsIDB4OGM5ZjE1ZTNVTCwgMHhhN2IyNDYyMFVMLAotICAgIDB4YmVhOTc3NjFVTCwgMHhmMWU4ZTFhNlVMLCAweGU4ZjNkMGU3VUwsIDB4YzNkZTgzMjRVTCwgMHhkYWM1YjI2NVVMLAotICAgIDB4NWQ1ZGFlYWFVTCwgMHg0NDQ2OWZlYlVMLCAweDZmNmJjYzI4VUwsIDB4NzY3MGZkNjlVTCwgMHgzOTMxNmJhZVVMLAotICAgIDB4MjAyYTVhZWZVTCwgMHgwYjA3MDkyY1VMLCAweDEyMWMzODZkVUwsIDB4ZGY0NjM2ZjNVTCwgMHhjNjVkMDdiMlVMLAotICAgIDB4ZWQ3MDU0NzFVTCwgMHhmNDZiNjUzMFVMLCAweGJiMmFmM2Y3VUwsIDB4YTIzMWMyYjZVTCwgMHg4OTFjOTE3NVVMLAotICAgIDB4OTAwN2EwMzRVTCwgMHgxNzlmYmNmYlVMLCAweDBlODQ4ZGJhVUwsIDB4MjVhOWRlNzlVTCwgMHgzY2IyZWYzOFVMLAotICAgIDB4NzNmMzc5ZmZVTCwgMHg2YWU4NDhiZVVMLCAweDQxYzUxYjdkVUwsIDB4NThkZTJhM2NVTCwgMHhmMDc5NGYwNVVMLAotICAgIDB4ZTk2MjdlNDRVTCwgMHhjMjRmMmQ4N1VMLCAweGRiNTQxY2M2VUwsIDB4OTQxNThhMDFVTCwgMHg4ZDBlYmI0MFVMLAotICAgIDB4YTYyM2U4ODNVTCwgMHhiZjM4ZDljMlVMLCAweDM4YTBjNTBkVUwsIDB4MjFiYmY0NGNVTCwgMHgwYTk2YTc4ZlVMLAotICAgIDB4MTM4ZDk2Y2VVTCwgMHg1Y2NjMDAwOVVMLCAweDQ1ZDczMTQ4VUwsIDB4NmVmYTYyOGJVTCwgMHg3N2UxNTNjYVVMLAotICAgIDB4YmFiYjVkNTRVTCwgMHhhM2EwNmMxNVVMLCAweDg4OGQzZmQ2VUwsIDB4OTE5NjBlOTdVTCwgMHhkZWQ3OTg1MFVMLAotICAgIDB4YzdjY2E5MTFVTCwgMHhlY2UxZmFkMlVMLCAweGY1ZmFjYjkzVUwsIDB4NzI2MmQ3NWNVTCwgMHg2Yjc5ZTYxZFVMLAotICAgIDB4NDA1NGI1ZGVVTCwgMHg1OTRmODQ5ZlVMLCAweDE2MGUxMjU4VUwsIDB4MGYxNTIzMTlVTCwgMHgyNDM4NzBkYVVMLAotICAgIDB4M2QyMzQxOWJVTCwgMHg2NWZkNmJhN1VMLCAweDdjZTY1YWU2VUwsIDB4NTdjYjA5MjVVTCwgMHg0ZWQwMzg2NFVMLAotICAgIDB4MDE5MWFlYTNVTCwgMHgxODhhOWZlMlVMLCAweDMzYTdjYzIxVUwsIDB4MmFiY2ZkNjBVTCwgMHhhZDI0ZTFhZlVMLAotICAgIDB4YjQzZmQwZWVVTCwgMHg5ZjEyODMyZFVMLCAweDg2MDliMjZjVUwsIDB4Yzk0ODI0YWJVTCwgMHhkMDUzMTVlYVVMLAotICAgIDB4ZmI3ZTQ2MjlVTCwgMHhlMjY1Nzc2OFVMLCAweDJmM2Y3OWY2VUwsIDB4MzYyNDQ4YjdVTCwgMHgxZDA5MWI3NFVMLAotICAgIDB4MDQxMjJhMzVVTCwgMHg0YjUzYmNmMlVMLCAweDUyNDg4ZGIzVUwsIDB4Nzk2NWRlNzBVTCwgMHg2MDdlZWYzMVVMLAotICAgIDB4ZTdlNmYzZmVVTCwgMHhmZWZkYzJiZlVMLCAweGQ1ZDA5MTdjVUwsIDB4Y2NjYmEwM2RVTCwgMHg4MzhhMzZmYVVMLAotICAgIDB4OWE5MTA3YmJVTCwgMHhiMWJjNTQ3OFVMLCAweGE4YTc2NTM5VUwsIDB4M2I4Mzk4NGJVTCwgMHgyMjk4YTkwYVVMLAotICAgIDB4MDliNWZhYzlVTCwgMHgxMGFlY2I4OFVMLCAweDVmZWY1ZDRmVUwsIDB4NDZmNDZjMGVVTCwgMHg2ZGQ5M2ZjZFVMLAotICAgIDB4NzRjMjBlOGNVTCwgMHhmMzVhMTI0M1VMLCAweGVhNDEyMzAyVUwsIDB4YzE2YzcwYzFVTCwgMHhkODc3NDE4MFVMLAotICAgIDB4OTczNmQ3NDdVTCwgMHg4ZTJkZTYwNlVMLCAweGE1MDBiNWM1VUwsIDB4YmMxYjg0ODRVTCwgMHg3MTQxOGExYVVMLAotICAgIDB4Njg1YWJiNWJVTCwgMHg0Mzc3ZTg5OFVMLCAweDVhNmNkOWQ5VUwsIDB4MTUyZDRmMWVVTCwgMHgwYzM2N2U1ZlVMLAotICAgIDB4MjcxYjJkOWNVTCwgMHgzZTAwMWNkZFVMLCAweGI5OTgwMDEyVUwsIDB4YTA4MzMxNTNVTCwgMHg4YmFlNjI5MFVMLAotICAgIDB4OTJiNTUzZDFVTCwgMHhkZGY0YzUxNlVMLCAweGM0ZWZmNDU3VUwsIDB4ZWZjMmE3OTRVTCwgMHhmNmQ5OTZkNVVMLAotICAgIDB4YWUwN2JjZTlVTCwgMHhiNzFjOGRhOFVMLCAweDljMzFkZTZiVUwsIDB4ODUyYWVmMmFVTCwgMHhjYTZiNzllZFVMLAotICAgIDB4ZDM3MDQ4YWNVTCwgMHhmODVkMWI2ZlVMLCAweGUxNDYyYTJlVUwsIDB4NjZkZTM2ZTFVTCwgMHg3ZmM1MDdhMFVMLAotICAgIDB4NTRlODU0NjNVTCwgMHg0ZGYzNjUyMlVMLCAweDAyYjJmM2U1VUwsIDB4MWJhOWMyYTRVTCwgMHgzMDg0OTE2N1VMLAotICAgIDB4Mjk5ZmEwMjZVTCwgMHhlNGM1YWViOFVMLCAweGZkZGU5ZmY5VUwsIDB4ZDZmM2NjM2FVTCwgMHhjZmU4ZmQ3YlVMLAotICAgIDB4ODBhOTZiYmNVTCwgMHg5OWIyNWFmZFVMLCAweGIyOWYwOTNlVUwsIDB4YWI4NDM4N2ZVTCwgMHgyYzFjMjRiMFVMLAotICAgIDB4MzUwNzE1ZjFVTCwgMHgxZTJhNDYzMlVMLCAweDA3MzE3NzczVUwsIDB4NDg3MGUxYjRVTCwgMHg1MTZiZDBmNVVMLAotICAgIDB4N2E0NjgzMzZVTCwgMHg2MzVkYjI3N1VMLCAweGNiZmFkNzRlVUwsIDB4ZDJlMWU2MGZVTCwgMHhmOWNjYjVjY1VMLAotICAgIDB4ZTBkNzg0OGRVTCwgMHhhZjk2MTI0YVVMLCAweGI2OGQyMzBiVUwsIDB4OWRhMDcwYzhVTCwgMHg4NGJiNDE4OVVMLAotICAgIDB4MDMyMzVkNDZVTCwgMHgxYTM4NmMwN1VMLCAweDMxMTUzZmM0VUwsIDB4MjgwZTBlODVVTCwgMHg2NzRmOTg0MlVMLAotICAgIDB4N2U1NGE5MDNVTCwgMHg1NTc5ZmFjMFVMLCAweDRjNjJjYjgxVUwsIDB4ODEzOGM1MWZVTCwgMHg5ODIzZjQ1ZVVMLAotICAgIDB4YjMwZWE3OWRVTCwgMHhhYTE1OTZkY1VMLCAweGU1NTQwMDFiVUwsIDB4ZmM0ZjMxNWFVTCwgMHhkNzYyNjI5OVVMLAotICAgIDB4Y2U3OTUzZDhVTCwgMHg0OWUxNGYxN1VMLCAweDUwZmE3ZTU2VUwsIDB4N2JkNzJkOTVVTCwgMHg2MmNjMWNkNFVMLAotICAgIDB4MmQ4ZDhhMTNVTCwgMHgzNDk2YmI1MlVMLCAweDFmYmJlODkxVUwsIDB4MDZhMGQ5ZDBVTCwgMHg1ZTdlZjNlY1VMLAotICAgIDB4NDc2NWMyYWRVTCwgMHg2YzQ4OTE2ZVVMLCAweDc1NTNhMDJmVUwsIDB4M2ExMjM2ZThVTCwgMHgyMzA5MDdhOVVMLAotICAgIDB4MDgyNDU0NmFVTCwgMHgxMTNmNjUyYlVMLCAweDk2YTc3OWU0VUwsIDB4OGZiYzQ4YTVVTCwgMHhhNDkxMWI2NlVMLAotICAgIDB4YmQ4YTJhMjdVTCwgMHhmMmNiYmNlMFVMLCAweGViZDA4ZGExVUwsIDB4YzBmZGRlNjJVTCwgMHhkOWU2ZWYyM1VMLAotICAgIDB4MTRiY2UxYmRVTCwgMHgwZGE3ZDBmY1VMLCAweDI2OGE4MzNmVUwsIDB4M2Y5MWIyN2VVTCwgMHg3MGQwMjRiOVVMLAotICAgIDB4NjljYjE1ZjhVTCwgMHg0MmU2NDYzYlVMLCAweDViZmQ3NzdhVUwsIDB4ZGM2NTZiYjVVTCwgMHhjNTdlNWFmNFVMLAotICAgIDB4ZWU1MzA5MzdVTCwgMHhmNzQ4Mzg3NlVMLCAweGI4MDlhZWIxVUwsIDB4YTExMjlmZjBVTCwgMHg4YTNmY2MzM1VMLAotICAgIDB4OTMyNGZkNzJVTAotICB9LAotICB7Ci0gICAgMHgwMDAwMDAwMFVMLCAweDAxYzI2YTM3VUwsIDB4MDM4NGQ0NmVVTCwgMHgwMjQ2YmU1OVVMLCAweDA3MDlhOGRjVUwsCi0gICAgMHgwNmNiYzJlYlVMLCAweDA0OGQ3Y2IyVUwsIDB4MDU0ZjE2ODVVTCwgMHgwZTEzNTFiOFVMLCAweDBmZDEzYjhmVUwsCi0gICAgMHgwZDk3ODVkNlVMLCAweDBjNTVlZmUxVUwsIDB4MDkxYWY5NjRVTCwgMHgwOGQ4OTM1M1VMLCAweDBhOWUyZDBhVUwsCi0gICAgMHgwYjVjNDczZFVMLCAweDFjMjZhMzcwVUwsIDB4MWRlNGM5NDdVTCwgMHgxZmEyNzcxZVVMLCAweDFlNjAxZDI5VUwsCi0gICAgMHgxYjJmMGJhY1VMLCAweDFhZWQ2MTliVUwsIDB4MThhYmRmYzJVTCwgMHgxOTY5YjVmNVVMLCAweDEyMzVmMmM4VUwsCi0gICAgMHgxM2Y3OThmZlVMLCAweDExYjEyNmE2VUwsIDB4MTA3MzRjOTFVTCwgMHgxNTNjNWExNFVMLCAweDE0ZmUzMDIzVUwsCi0gICAgMHgxNmI4OGU3YVVMLCAweDE3N2FlNDRkVUwsIDB4Mzg0ZDQ2ZTBVTCwgMHgzOThmMmNkN1VMLCAweDNiYzk5MjhlVUwsCi0gICAgMHgzYTBiZjhiOVVMLCAweDNmNDRlZTNjVUwsIDB4M2U4Njg0MGJVTCwgMHgzY2MwM2E1MlVMLCAweDNkMDI1MDY1VUwsCi0gICAgMHgzNjVlMTc1OFVMLCAweDM3OWM3ZDZmVUwsIDB4MzVkYWMzMzZVTCwgMHgzNDE4YTkwMVVMLCAweDMxNTdiZjg0VUwsCi0gICAgMHgzMDk1ZDViM1VMLCAweDMyZDM2YmVhVUwsIDB4MzMxMTAxZGRVTCwgMHgyNDZiZTU5MFVMLCAweDI1YTk4ZmE3VUwsCi0gICAgMHgyN2VmMzFmZVVMLCAweDI2MmQ1YmM5VUwsIDB4MjM2MjRkNGNVTCwgMHgyMmEwMjc3YlVMLCAweDIwZTY5OTIyVUwsCi0gICAgMHgyMTI0ZjMxNVVMLCAweDJhNzhiNDI4VUwsIDB4MmJiYWRlMWZVTCwgMHgyOWZjNjA0NlVMLCAweDI4M2UwYTcxVUwsCi0gICAgMHgyZDcxMWNmNFVMLCAweDJjYjM3NmMzVUwsIDB4MmVmNWM4OWFVTCwgMHgyZjM3YTJhZFVMLCAweDcwOWE4ZGMwVUwsCi0gICAgMHg3MTU4ZTdmN1VMLCAweDczMWU1OWFlVUwsIDB4NzJkYzMzOTlVTCwgMHg3NzkzMjUxY1VMLCAweDc2NTE0ZjJiVUwsCi0gICAgMHg3NDE3ZjE3MlVMLCAweDc1ZDU5YjQ1VUwsIDB4N2U4OWRjNzhVTCwgMHg3ZjRiYjY0ZlVMLCAweDdkMGQwODE2VUwsCi0gICAgMHg3Y2NmNjIyMVVMLCAweDc5ODA3NGE0VUwsIDB4Nzg0MjFlOTNVTCwgMHg3YTA0YTBjYVVMLCAweDdiYzZjYWZkVUwsCi0gICAgMHg2Y2JjMmViMFVMLCAweDZkN2U0NDg3VUwsIDB4NmYzOGZhZGVVTCwgMHg2ZWZhOTBlOVVMLCAweDZiYjU4NjZjVUwsCi0gICAgMHg2YTc3ZWM1YlVMLCAweDY4MzE1MjAyVUwsIDB4NjlmMzM4MzVVTCwgMHg2MmFmN2YwOFVMLCAweDYzNmQxNTNmVUwsCi0gICAgMHg2MTJiYWI2NlVMLCAweDYwZTljMTUxVUwsIDB4NjVhNmQ3ZDRVTCwgMHg2NDY0YmRlM1VMLCAweDY2MjIwM2JhVUwsCi0gICAgMHg2N2UwNjk4ZFVMLCAweDQ4ZDdjYjIwVUwsIDB4NDkxNWExMTdVTCwgMHg0YjUzMWY0ZVVMLCAweDRhOTE3NTc5VUwsCi0gICAgMHg0ZmRlNjNmY1VMLCAweDRlMWMwOWNiVUwsIDB4NGM1YWI3OTJVTCwgMHg0ZDk4ZGRhNVVMLCAweDQ2YzQ5YTk4VUwsCi0gICAgMHg0NzA2ZjBhZlVMLCAweDQ1NDA0ZWY2VUwsIDB4NDQ4MjI0YzFVTCwgMHg0MWNkMzI0NFVMLCAweDQwMGY1ODczVUwsCi0gICAgMHg0MjQ5ZTYyYVVMLCAweDQzOGI4YzFkVUwsIDB4NTRmMTY4NTBVTCwgMHg1NTMzMDI2N1VMLCAweDU3NzViYzNlVUwsCi0gICAgMHg1NmI3ZDYwOVVMLCAweDUzZjhjMDhjVUwsIDB4NTIzYWFhYmJVTCwgMHg1MDdjMTRlMlVMLCAweDUxYmU3ZWQ1VUwsCi0gICAgMHg1YWUyMzllOFVMLCAweDViMjA1M2RmVUwsIDB4NTk2NmVkODZVTCwgMHg1OGE0ODdiMVVMLCAweDVkZWI5MTM0VUwsCi0gICAgMHg1YzI5ZmIwM1VMLCAweDVlNmY0NTVhVUwsIDB4NWZhZDJmNmRVTCwgMHhlMTM1MWI4MFVMLCAweGUwZjc3MWI3VUwsCi0gICAgMHhlMmIxY2ZlZVVMLCAweGUzNzNhNWQ5VUwsIDB4ZTYzY2IzNWNVTCwgMHhlN2ZlZDk2YlVMLCAweGU1Yjg2NzMyVUwsCi0gICAgMHhlNDdhMGQwNVVMLCAweGVmMjY0YTM4VUwsIDB4ZWVlNDIwMGZVTCwgMHhlY2EyOWU1NlVMLCAweGVkNjBmNDYxVUwsCi0gICAgMHhlODJmZTJlNFVMLCAweGU5ZWQ4OGQzVUwsIDB4ZWJhYjM2OGFVTCwgMHhlYTY5NWNiZFVMLCAweGZkMTNiOGYwVUwsCi0gICAgMHhmY2QxZDJjN1VMLCAweGZlOTc2YzllVUwsIDB4ZmY1NTA2YTlVTCwgMHhmYTFhMTAyY1VMLCAweGZiZDg3YTFiVUwsCi0gICAgMHhmOTllYzQ0MlVMLCAweGY4NWNhZTc1VUwsIDB4ZjMwMGU5NDhVTCwgMHhmMmMyODM3ZlVMLCAweGYwODQzZDI2VUwsCi0gICAgMHhmMTQ2NTcxMVVMLCAweGY0MDk0MTk0VUwsIDB4ZjVjYjJiYTNVTCwgMHhmNzhkOTVmYVVMLCAweGY2NGZmZmNkVUwsCi0gICAgMHhkOTc4NWQ2MFVMLCAweGQ4YmEzNzU3VUwsIDB4ZGFmYzg5MGVVTCwgMHhkYjNlZTMzOVVMLCAweGRlNzFmNWJjVUwsCi0gICAgMHhkZmIzOWY4YlVMLCAweGRkZjUyMWQyVUwsIDB4ZGMzNzRiZTVVTCwgMHhkNzZiMGNkOFVMLCAweGQ2YTk2NmVmVUwsCi0gICAgMHhkNGVmZDhiNlVMLCAweGQ1MmRiMjgxVUwsIDB4ZDA2MmE0MDRVTCwgMHhkMWEwY2UzM1VMLCAweGQzZTY3MDZhVUwsCi0gICAgMHhkMjI0MWE1ZFVMLCAweGM1NWVmZTEwVUwsIDB4YzQ5Yzk0MjdVTCwgMHhjNmRhMmE3ZVVMLCAweGM3MTg0MDQ5VUwsCi0gICAgMHhjMjU3NTZjY1VMLCAweGMzOTUzY2ZiVUwsIDB4YzFkMzgyYTJVTCwgMHhjMDExZTg5NVVMLCAweGNiNGRhZmE4VUwsCi0gICAgMHhjYThmYzU5ZlVMLCAweGM4Yzk3YmM2VUwsIDB4YzkwYjExZjFVTCwgMHhjYzQ0MDc3NFVMLCAweGNkODY2ZDQzVUwsCi0gICAgMHhjZmMwZDMxYVVMLCAweGNlMDJiOTJkVUwsIDB4OTFhZjk2NDBVTCwgMHg5MDZkZmM3N1VMLCAweDkyMmI0MjJlVUwsCi0gICAgMHg5M2U5MjgxOVVMLCAweDk2YTYzZTljVUwsIDB4OTc2NDU0YWJVTCwgMHg5NTIyZWFmMlVMLCAweDk0ZTA4MGM1VUwsCi0gICAgMHg5ZmJjYzdmOFVMLCAweDllN2VhZGNmVUwsIDB4OWMzODEzOTZVTCwgMHg5ZGZhNzlhMVVMLCAweDk4YjU2ZjI0VUwsCi0gICAgMHg5OTc3MDUxM1VMLCAweDliMzFiYjRhVUwsIDB4OWFmM2QxN2RVTCwgMHg4ZDg5MzUzMFVMLCAweDhjNGI1ZjA3VUwsCi0gICAgMHg4ZTBkZTE1ZVVMLCAweDhmY2Y4YjY5VUwsIDB4OGE4MDlkZWNVTCwgMHg4YjQyZjdkYlVMLCAweDg5MDQ0OTgyVUwsCi0gICAgMHg4OGM2MjNiNVVMLCAweDgzOWE2NDg4VUwsIDB4ODI1ODBlYmZVTCwgMHg4MDFlYjBlNlVMLCAweDgxZGNkYWQxVUwsCi0gICAgMHg4NDkzY2M1NFVMLCAweDg1NTFhNjYzVUwsIDB4ODcxNzE4M2FVTCwgMHg4NmQ1NzIwZFVMLCAweGE5ZTJkMGEwVUwsCi0gICAgMHhhODIwYmE5N1VMLCAweGFhNjYwNGNlVUwsIDB4YWJhNDZlZjlVTCwgMHhhZWViNzg3Y1VMLCAweGFmMjkxMjRiVUwsCi0gICAgMHhhZDZmYWMxMlVMLCAweGFjYWRjNjI1VUwsIDB4YTdmMTgxMThVTCwgMHhhNjMzZWIyZlVMLCAweGE0NzU1NTc2VUwsCi0gICAgMHhhNWI3M2Y0MVVMLCAweGEwZjgyOWM0VUwsIDB4YTEzYTQzZjNVTCwgMHhhMzdjZmRhYVVMLCAweGEyYmU5NzlkVUwsCi0gICAgMHhiNWM0NzNkMFVMLCAweGI0MDYxOWU3VUwsIDB4YjY0MGE3YmVVTCwgMHhiNzgyY2Q4OVVMLCAweGIyY2RkYjBjVUwsCi0gICAgMHhiMzBmYjEzYlVMLCAweGIxNDkwZjYyVUwsIDB4YjA4YjY1NTVVTCwgMHhiYmQ3MjI2OFVMLCAweGJhMTU0ODVmVUwsCi0gICAgMHhiODUzZjYwNlVMLCAweGI5OTE5YzMxVUwsIDB4YmNkZThhYjRVTCwgMHhiZDFjZTA4M1VMLCAweGJmNWE1ZWRhVUwsCi0gICAgMHhiZTk4MzRlZFVMCi0gIH0sCi0gIHsKLSAgICAweDAwMDAwMDAwVUwsIDB4YjhiYzY3NjVVTCwgMHhhYTA5Yzg4YlVMLCAweDEyYjVhZmVlVUwsIDB4OGY2Mjk3NTdVTCwKLSAgICAweDM3ZGVmMDMyVUwsIDB4MjU2YjVmZGNVTCwgMHg5ZGQ3MzhiOVVMLCAweGM1YjQyOGVmVUwsIDB4N2QwODRmOGFVTCwKLSAgICAweDZmYmRlMDY0VUwsIDB4ZDcwMTg3MDFVTCwgMHg0YWQ2YmZiOFVMLCAweGYyNmFkOGRkVUwsIDB4ZTBkZjc3MzNVTCwKLSAgICAweDU4NjMxMDU2VUwsIDB4NTAxOTU3OWZVTCwgMHhlOGE1MzBmYVVMLCAweGZhMTA5ZjE0VUwsIDB4NDJhY2Y4NzFVTCwKLSAgICAweGRmN2JjMGM4VUwsIDB4NjdjN2E3YWRVTCwgMHg3NTcyMDg0M1VMLCAweGNkY2U2ZjI2VUwsIDB4OTVhZDdmNzBVTCwKLSAgICAweDJkMTExODE1VUwsIDB4M2ZhNGI3ZmJVTCwgMHg4NzE4ZDA5ZVVMLCAweDFhY2ZlODI3VUwsIDB4YTI3MzhmNDJVTCwKLSAgICAweGIwYzYyMGFjVUwsIDB4MDg3YTQ3YzlVTCwgMHhhMDMyYWYzZVVMLCAweDE4OGVjODViVUwsIDB4MGEzYjY3YjVVTCwKLSAgICAweGIyODcwMGQwVUwsIDB4MmY1MDM4NjlVTCwgMHg5N2VjNWYwY1VMLCAweDg1NTlmMGUyVUwsIDB4M2RlNTk3ODdVTCwKLSAgICAweDY1ODY4N2QxVUwsIDB4ZGQzYWUwYjRVTCwgMHhjZjhmNGY1YVVMLCAweDc3MzMyODNmVUwsIDB4ZWFlNDEwODZVTCwKLSAgICAweDUyNTg3N2UzVUwsIDB4NDBlZGQ4MGRVTCwgMHhmODUxYmY2OFVMLCAweGYwMmJmOGExVUwsIDB4NDg5NzlmYzRVTCwKLSAgICAweDVhMjIzMDJhVUwsIDB4ZTI5ZTU3NGZVTCwgMHg3ZjQ5NmZmNlVMLCAweGM3ZjUwODkzVUwsIDB4ZDU0MGE3N2RVTCwKLSAgICAweDZkZmNjMDE4VUwsIDB4MzU5ZmQwNGVVTCwgMHg4ZDIzYjcyYlVMLCAweDlmOTYxOGM1VUwsIDB4MjcyYTdmYTBVTCwKLSAgICAweGJhZmQ0NzE5VUwsIDB4MDI0MTIwN2NVTCwgMHgxMGY0OGY5MlVMLCAweGE4NDhlOGY3VUwsIDB4OWIxNDU4M2RVTCwKLSAgICAweDIzYTgzZjU4VUwsIDB4MzExZDkwYjZVTCwgMHg4OWExZjdkM1VMLCAweDE0NzZjZjZhVUwsIDB4YWNjYWE4MGZVTCwKLSAgICAweGJlN2YwN2UxVUwsIDB4MDZjMzYwODRVTCwgMHg1ZWEwNzBkMlVMLCAweGU2MWMxN2I3VUwsIDB4ZjRhOWI4NTlVTCwKLSAgICAweDRjMTVkZjNjVUwsIDB4ZDFjMmU3ODVVTCwgMHg2OTdlODBlMFVMLCAweDdiY2IyZjBlVUwsIDB4YzM3NzQ4NmJVTCwKLSAgICAweGNiMGQwZmEyVUwsIDB4NzNiMTY4YzdVTCwgMHg2MTA0YzcyOVVMLCAweGQ5YjhhMDRjVUwsIDB4NDQ2Zjk4ZjVVTCwKLSAgICAweGZjZDNmZjkwVUwsIDB4ZWU2NjUwN2VVTCwgMHg1NmRhMzcxYlVMLCAweDBlYjkyNzRkVUwsIDB4YjYwNTQwMjhVTCwKLSAgICAweGE0YjBlZmM2VUwsIDB4MWMwYzg4YTNVTCwgMHg4MWRiYjAxYVVMLCAweDM5NjdkNzdmVUwsIDB4MmJkMjc4OTFVTCwKLSAgICAweDkzNmUxZmY0VUwsIDB4M2IyNmY3MDNVTCwgMHg4MzlhOTA2NlVMLCAweDkxMmYzZjg4VUwsIDB4Mjk5MzU4ZWRVTCwKLSAgICAweGI0NDQ2MDU0VUwsIDB4MGNmODA3MzFVTCwgMHgxZTRkYThkZlVMLCAweGE2ZjFjZmJhVUwsIDB4ZmU5MmRmZWNVTCwKLSAgICAweDQ2MmViODg5VUwsIDB4NTQ5YjE3NjdVTCwgMHhlYzI3NzAwMlVMLCAweDcxZjA0OGJiVUwsIDB4Yzk0YzJmZGVVTCwKLSAgICAweGRiZjk4MDMwVUwsIDB4NjM0NWU3NTVVTCwgMHg2YjNmYTA5Y1VMLCAweGQzODNjN2Y5VUwsIDB4YzEzNjY4MTdVTCwKLSAgICAweDc5OGEwZjcyVUwsIDB4ZTQ1ZDM3Y2JVTCwgMHg1Y2UxNTBhZVVMLCAweDRlNTRmZjQwVUwsIDB4ZjZlODk4MjVVTCwKLSAgICAweGFlOGI4ODczVUwsIDB4MTYzN2VmMTZVTCwgMHgwNDgyNDBmOFVMLCAweGJjM2UyNzlkVUwsIDB4MjFlOTFmMjRVTCwKLSAgICAweDk5NTU3ODQxVUwsIDB4OGJlMGQ3YWZVTCwgMHgzMzVjYjBjYVVMLCAweGVkNTliNjNiVUwsIDB4NTVlNWQxNWVVTCwKLSAgICAweDQ3NTA3ZWIwVUwsIDB4ZmZlYzE5ZDVVTCwgMHg2MjNiMjE2Y1VMLCAweGRhODc0NjA5VUwsIDB4YzgzMmU5ZTdVTCwKLSAgICAweDcwOGU4ZTgyVUwsIDB4MjhlZDllZDRVTCwgMHg5MDUxZjliMVVMLCAweDgyZTQ1NjVmVUwsIDB4M2E1ODMxM2FVTCwKLSAgICAweGE3OGYwOTgzVUwsIDB4MWYzMzZlZTZVTCwgMHgwZDg2YzEwOFVMLCAweGI1M2FhNjZkVUwsIDB4YmQ0MGUxYTRVTCwKLSAgICAweDA1ZmM4NmMxVUwsIDB4MTc0OTI5MmZVTCwgMHhhZmY1NGU0YVVMLCAweDMyMjI3NmYzVUwsIDB4OGE5ZTExOTZVTCwKLSAgICAweDk4MmJiZTc4VUwsIDB4MjA5N2Q5MWRVTCwgMHg3OGY0Yzk0YlVMLCAweGMwNDhhZTJlVUwsIDB4ZDJmZDAxYzBVTCwKLSAgICAweDZhNDE2NmE1VUwsIDB4Zjc5NjVlMWNVTCwgMHg0ZjJhMzk3OVVMLCAweDVkOWY5Njk3VUwsIDB4ZTUyM2YxZjJVTCwKLSAgICAweDRkNmIxOTA1VUwsIDB4ZjVkNzdlNjBVTCwgMHhlNzYyZDE4ZVVMLCAweDVmZGViNmViVUwsIDB4YzIwOThlNTJVTCwKLSAgICAweDdhYjVlOTM3VUwsIDB4NjgwMDQ2ZDlVTCwgMHhkMGJjMjFiY1VMLCAweDg4ZGYzMWVhVUwsIDB4MzA2MzU2OGZVTCwKLSAgICAweDIyZDZmOTYxVUwsIDB4OWE2YTllMDRVTCwgMHgwN2JkYTZiZFVMLCAweGJmMDFjMWQ4VUwsIDB4YWRiNDZlMzZVTCwKLSAgICAweDE1MDgwOTUzVUwsIDB4MWQ3MjRlOWFVTCwgMHhhNWNlMjlmZlVMLCAweGI3N2I4NjExVUwsIDB4MGZjN2UxNzRVTCwKLSAgICAweDkyMTBkOWNkVUwsIDB4MmFhY2JlYThVTCwgMHgzODE5MTE0NlVMLCAweDgwYTU3NjIzVUwsIDB4ZDhjNjY2NzVVTCwKLSAgICAweDYwN2EwMTEwVUwsIDB4NzJjZmFlZmVVTCwgMHhjYTczYzk5YlVMLCAweDU3YTRmMTIyVUwsIDB4ZWYxODk2NDdVTCwKLSAgICAweGZkYWQzOWE5VUwsIDB4NDUxMTVlY2NVTCwgMHg3NjRkZWUwNlVMLCAweGNlZjE4OTYzVUwsIDB4ZGM0NDI2OGRVTCwKLSAgICAweDY0Zjg0MWU4VUwsIDB4ZjkyZjc5NTFVTCwgMHg0MTkzMWUzNFVMLCAweDUzMjZiMWRhVUwsIDB4ZWI5YWQ2YmZVTCwKLSAgICAweGIzZjljNmU5VUwsIDB4MGI0NWExOGNVTCwgMHgxOWYwMGU2MlVMLCAweGExNGM2OTA3VUwsIDB4M2M5YjUxYmVVTCwKLSAgICAweDg0MjczNmRiVUwsIDB4OTY5Mjk5MzVVTCwgMHgyZTJlZmU1MFVMLCAweDI2NTRiOTk5VUwsIDB4OWVlOGRlZmNVTCwKLSAgICAweDhjNWQ3MTEyVUwsIDB4MzRlMTE2NzdVTCwgMHhhOTM2MmVjZVVMLCAweDExOGE0OWFiVUwsIDB4MDMzZmU2NDVVTCwKLSAgICAweGJiODM4MTIwVUwsIDB4ZTNlMDkxNzZVTCwgMHg1YjVjZjYxM1VMLCAweDQ5ZTk1OWZkVUwsIDB4ZjE1NTNlOThVTCwKLSAgICAweDZjODIwNjIxVUwsIDB4ZDQzZTYxNDRVTCwgMHhjNjhiY2VhYVVMLCAweDdlMzdhOWNmVUwsIDB4ZDY3ZjQxMzhVTCwKLSAgICAweDZlYzMyNjVkVUwsIDB4N2M3Njg5YjNVTCwgMHhjNGNhZWVkNlVMLCAweDU5MWRkNjZmVUwsIDB4ZTFhMWIxMGFVTCwKLSAgICAweGYzMTQxZWU0VUwsIDB4NGJhODc5ODFVTCwgMHgxM2NiNjlkN1VMLCAweGFiNzcwZWIyVUwsIDB4YjljMmExNWNVTCwKLSAgICAweDAxN2VjNjM5VUwsIDB4OWNhOWZlODBVTCwgMHgyNDE1OTllNVVMLCAweDM2YTAzNjBiVUwsIDB4OGUxYzUxNmVVTCwKLSAgICAweDg2NjYxNmE3VUwsIDB4M2VkYTcxYzJVTCwgMHgyYzZmZGUyY1VMLCAweDk0ZDNiOTQ5VUwsIDB4MDkwNDgxZjBVTCwKLSAgICAweGIxYjhlNjk1VUwsIDB4YTMwZDQ5N2JVTCwgMHgxYmIxMmUxZVVMLCAweDQzZDIzZTQ4VUwsIDB4ZmI2ZTU5MmRVTCwKLSAgICAweGU5ZGJmNmMzVUwsIDB4NTE2NzkxYTZVTCwgMHhjY2IwYTkxZlVMLCAweDc0MGNjZTdhVUwsIDB4NjZiOTYxOTRVTCwKLSAgICAweGRlMDUwNmYxVUwKLSAgfSwKLSAgewotICAgIDB4MDAwMDAwMDBVTCwgMHg5NjMwMDc3N1VMLCAweDJjNjEwZWVlVUwsIDB4YmE1MTA5OTlVTCwgMHgxOWM0NmQwN1VMLAotICAgIDB4OGZmNDZhNzBVTCwgMHgzNWE1NjNlOVVMLCAweGEzOTU2NDllVUwsIDB4MzI4OGRiMGVVTCwgMHhhNGI4ZGM3OVVMLAotICAgIDB4MWVlOWQ1ZTBVTCwgMHg4OGQ5ZDI5N1VMLCAweDJiNGNiNjA5VUwsIDB4YmQ3Y2IxN2VVTCwgMHgwNzJkYjhlN1VMLAotICAgIDB4OTExZGJmOTBVTCwgMHg2NDEwYjcxZFVMLCAweGYyMjBiMDZhVUwsIDB4NDg3MWI5ZjNVTCwgMHhkZTQxYmU4NFVMLAotICAgIDB4N2RkNGRhMWFVTCwgMHhlYmU0ZGQ2ZFVMLCAweDUxYjVkNGY0VUwsIDB4Yzc4NWQzODNVTCwgMHg1Njk4NmMxM1VMLAotICAgIDB4YzBhODZiNjRVTCwgMHg3YWY5NjJmZFVMLCAweGVjYzk2NThhVUwsIDB4NGY1YzAxMTRVTCwgMHhkOTZjMDY2M1VMLAotICAgIDB4NjMzZDBmZmFVTCwgMHhmNTBkMDg4ZFVMLCAweGM4MjA2ZTNiVUwsIDB4NWUxMDY5NGNVTCwgMHhlNDQxNjBkNVVMLAotICAgIDB4NzI3MTY3YTJVTCwgMHhkMWU0MDMzY1VMLCAweDQ3ZDQwNDRiVUwsIDB4ZmQ4NTBkZDJVTCwgMHg2YmI1MGFhNVVMLAotICAgIDB4ZmFhOGI1MzVVTCwgMHg2Yzk4YjI0MlVMLCAweGQ2YzliYmRiVUwsIDB4NDBmOWJjYWNVTCwgMHhlMzZjZDgzMlVMLAotICAgIDB4NzU1Y2RmNDVVTCwgMHhjZjBkZDZkY1VMLCAweDU5M2RkMWFiVUwsIDB4YWMzMGQ5MjZVTCwgMHgzYTAwZGU1MVVMLAotICAgIDB4ODA1MWQ3YzhVTCwgMHgxNjYxZDBiZlVMLCAweGI1ZjRiNDIxVUwsIDB4MjNjNGIzNTZVTCwgMHg5OTk1YmFjZlVMLAotICAgIDB4MGZhNWJkYjhVTCwgMHg5ZWI4MDIyOFVMLCAweDA4ODgwNTVmVUwsIDB4YjJkOTBjYzZVTCwgMHgyNGU5MGJiMVVMLAotICAgIDB4ODc3YzZmMmZVTCwgMHgxMTRjNjg1OFVMLCAweGFiMWQ2MWMxVUwsIDB4M2QyZDY2YjZVTCwgMHg5MDQxZGM3NlVMLAotICAgIDB4MDY3MWRiMDFVTCwgMHhiYzIwZDI5OFVMLCAweDJhMTBkNWVmVUwsIDB4ODk4NWIxNzFVTCwgMHgxZmI1YjYwNlVMLAotICAgIDB4YTVlNGJmOWZVTCwgMHgzM2Q0YjhlOFVMLCAweGEyYzkwNzc4VUwsIDB4MzRmOTAwMGZVTCwgMHg4ZWE4MDk5NlVMLAotICAgIDB4MTg5ODBlZTFVTCwgMHhiYjBkNmE3ZlVMLCAweDJkM2Q2ZDA4VUwsIDB4OTc2YzY0OTFVTCwgMHgwMTVjNjNlNlVMLAotICAgIDB4ZjQ1MTZiNmJVTCwgMHg2MjYxNmMxY1VMLCAweGQ4MzA2NTg1VUwsIDB4NGUwMDYyZjJVTCwgMHhlZDk1MDY2Y1VMLAotICAgIDB4N2JhNTAxMWJVTCwgMHhjMWY0MDg4MlVMLCAweDU3YzQwZmY1VUwsIDB4YzZkOWIwNjVVTCwgMHg1MGU5YjcxMlVMLAotICAgIDB4ZWFiOGJlOGJVTCwgMHg3Yzg4YjlmY1VMLCAweGRmMWRkZDYyVUwsIDB4NDkyZGRhMTVVTCwgMHhmMzdjZDM4Y1VMLAotICAgIDB4NjU0Y2Q0ZmJVTCwgMHg1ODYxYjI0ZFVMLCAweGNlNTFiNTNhVUwsIDB4NzQwMGJjYTNVTCwgMHhlMjMwYmJkNFVMLAotICAgIDB4NDFhNWRmNGFVTCwgMHhkNzk1ZDgzZFVMLCAweDZkYzRkMWE0VUwsIDB4ZmJmNGQ2ZDNVTCwgMHg2YWU5Njk0M1VMLAotICAgIDB4ZmNkOTZlMzRVTCwgMHg0Njg4NjdhZFVMLCAweGQwYjg2MGRhVUwsIDB4NzMyZDA0NDRVTCwgMHhlNTFkMDMzM1VMLAotICAgIDB4NWY0YzBhYWFVTCwgMHhjOTdjMGRkZFVMLCAweDNjNzEwNTUwVUwsIDB4YWE0MTAyMjdVTCwgMHgxMDEwMGJiZVVMLAotICAgIDB4ODYyMDBjYzlVTCwgMHgyNWI1Njg1N1VMLCAweGIzODU2ZjIwVUwsIDB4MDlkNDY2YjlVTCwgMHg5ZmU0NjFjZVVMLAotICAgIDB4MGVmOWRlNWVVTCwgMHg5OGM5ZDkyOVVMLCAweDIyOThkMGIwVUwsIDB4YjRhOGQ3YzdVTCwgMHgxNzNkYjM1OVVMLAotICAgIDB4ODEwZGI0MmVVTCwgMHgzYjVjYmRiN1VMLCAweGFkNmNiYWMwVUwsIDB4MjA4M2I4ZWRVTCwgMHhiNmIzYmY5YVVMLAotICAgIDB4MGNlMmI2MDNVTCwgMHg5YWQyYjE3NFVMLCAweDM5NDdkNWVhVUwsIDB4YWY3N2QyOWRVTCwgMHgxNTI2ZGIwNFVMLAotICAgIDB4ODMxNmRjNzNVTCwgMHgxMjBiNjNlM1VMLCAweDg0M2I2NDk0VUwsIDB4M2U2YTZkMGRVTCwgMHhhODVhNmE3YVVMLAotICAgIDB4MGJjZjBlZTRVTCwgMHg5ZGZmMDk5M1VMLCAweDI3YWUwMDBhVUwsIDB4YjE5ZTA3N2RVTCwgMHg0NDkzMGZmMFVMLAotICAgIDB4ZDJhMzA4ODdVTCwgMHg2OGYyMDExZVVMLCAweGZlYzIwNjY5VUwsIDB4NWQ1NzYyZjdVTCwgMHhjYjY3NjU4MFVMLAotICAgIDB4NzEzNjZjMTlVTCwgMHhlNzA2NmI2ZVVMLCAweDc2MWJkNGZlVUwsIDB4ZTAyYmQzODlVTCwgMHg1YTdhZGExMFVMLAotICAgIDB4Y2M0YWRkNjdVTCwgMHg2ZmRmYjlmOVVMLCAweGY5ZWZiZThlVUwsIDB4NDNiZWI3MTdVTCwgMHhkNThlYjA2MFVMLAotICAgIDB4ZThhM2Q2ZDZVTCwgMHg3ZTkzZDFhMVVMLCAweGM0YzJkODM4VUwsIDB4NTJmMmRmNGZVTCwgMHhmMTY3YmJkMVVMLAotICAgIDB4Njc1N2JjYTZVTCwgMHhkZDA2YjUzZlVMLCAweDRiMzZiMjQ4VUwsIDB4ZGEyYjBkZDhVTCwgMHg0YzFiMGFhZlVMLAotICAgIDB4ZjY0YTAzMzZVTCwgMHg2MDdhMDQ0MVVMLCAweGMzZWY2MGRmVUwsIDB4NTVkZjY3YThVTCwgMHhlZjhlNmUzMVVMLAotICAgIDB4NzliZTY5NDZVTCwgMHg4Y2IzNjFjYlVMLCAweDFhODM2NmJjVUwsIDB4YTBkMjZmMjVVTCwgMHgzNmUyNjg1MlVMLAotICAgIDB4OTU3NzBjY2NVTCwgMHgwMzQ3MGJiYlVMLCAweGI5MTYwMjIyVUwsIDB4MmYyNjA1NTVVTCwgMHhiZTNiYmFjNVVMLAotICAgIDB4MjgwYmJkYjJVTCwgMHg5MjVhYjQyYlVMLCAweDA0NmFiMzVjVUwsIDB4YTdmZmQ3YzJVTCwgMHgzMWNmZDBiNVVMLAotICAgIDB4OGI5ZWQ5MmNVTCwgMHgxZGFlZGU1YlVMLCAweGIwYzI2NDliVUwsIDB4MjZmMjYzZWNVTCwgMHg5Y2EzNmE3NVVMLAotICAgIDB4MGE5MzZkMDJVTCwgMHhhOTA2MDk5Y1VMLCAweDNmMzYwZWViVUwsIDB4ODU2NzA3NzJVTCwgMHgxMzU3MDAwNVVMLAotICAgIDB4ODI0YWJmOTVVTCwgMHgxNDdhYjhlMlVMLCAweGFlMmJiMTdiVUwsIDB4MzgxYmI2MGNVTCwgMHg5YjhlZDI5MlVMLAotICAgIDB4MGRiZWQ1ZTVVTCwgMHhiN2VmZGM3Y1VMLCAweDIxZGZkYjBiVUwsIDB4ZDRkMmQzODZVTCwgMHg0MmUyZDRmMVVMLAotICAgIDB4ZjhiM2RkNjhVTCwgMHg2ZTgzZGExZlVMLCAweGNkMTZiZTgxVUwsIDB4NWIyNmI5ZjZVTCwgMHhlMTc3YjA2ZlVMLAotICAgIDB4Nzc0N2I3MThVTCwgMHhlNjVhMDg4OFVMLCAweDcwNmEwZmZmVUwsIDB4Y2EzYjA2NjZVTCwgMHg1YzBiMDExMVVMLAotICAgIDB4ZmY5ZTY1OGZVTCwgMHg2OWFlNjJmOFVMLCAweGQzZmY2YjYxVUwsIDB4NDVjZjZjMTZVTCwgMHg3OGUyMGFhMFVMLAotICAgIDB4ZWVkMjBkZDdVTCwgMHg1NDgzMDQ0ZVVMLCAweGMyYjMwMzM5VUwsIDB4NjEyNjY3YTdVTCwgMHhmNzE2NjBkMFVMLAotICAgIDB4NGQ0NzY5NDlVTCwgMHhkYjc3NmUzZVVMLCAweDRhNmFkMWFlVUwsIDB4ZGM1YWQ2ZDlVTCwgMHg2NjBiZGY0MFVMLAotICAgIDB4ZjAzYmQ4MzdVTCwgMHg1M2FlYmNhOVVMLCAweGM1OWViYmRlVUwsIDB4N2ZjZmIyNDdVTCwgMHhlOWZmYjUzMFVMLAotICAgIDB4MWNmMmJkYmRVTCwgMHg4YWMyYmFjYVVMLCAweDMwOTNiMzUzVUwsIDB4YTZhM2I0MjRVTCwgMHgwNTM2ZDBiYVVMLAotICAgIDB4OTMwNmQ3Y2RVTCwgMHgyOTU3ZGU1NFVMLCAweGJmNjdkOTIzVUwsIDB4MmU3YTY2YjNVTCwgMHhiODRhNjFjNFVMLAotICAgIDB4MDIxYjY4NWRVTCwgMHg5NDJiNmYyYVVMLCAweDM3YmUwYmI0VUwsIDB4YTE4ZTBjYzNVTCwgMHgxYmRmMDU1YVVMLAotICAgIDB4OGRlZjAyMmRVTAotICB9LAotICB7Ci0gICAgMHgwMDAwMDAwMFVMLCAweDQxMzExYjE5VUwsIDB4ODI2MjM2MzJVTCwgMHhjMzUzMmQyYlVMLCAweDA0YzU2YzY0VUwsCi0gICAgMHg0NWY0Nzc3ZFVMLCAweDg2YTc1YTU2VUwsIDB4Yzc5NjQxNGZVTCwgMHgwODhhZDljOFVMLCAweDQ5YmJjMmQxVUwsCi0gICAgMHg4YWU4ZWZmYVVMLCAweGNiZDlmNGUzVUwsIDB4MGM0ZmI1YWNVTCwgMHg0ZDdlYWViNVVMLCAweDhlMmQ4MzllVUwsCi0gICAgMHhjZjFjOTg4N1VMLCAweDUxMTJjMjRhVUwsIDB4MTAyM2Q5NTNVTCwgMHhkMzcwZjQ3OFVMLCAweDkyNDFlZjYxVUwsCi0gICAgMHg1NWQ3YWUyZVVMLCAweDE0ZTZiNTM3VUwsIDB4ZDdiNTk4MWNVTCwgMHg5Njg0ODMwNVVMLCAweDU5OTgxYjgyVUwsCi0gICAgMHgxOGE5MDA5YlVMLCAweGRiZmEyZGIwVUwsIDB4OWFjYjM2YTlVTCwgMHg1ZDVkNzdlNlVMLCAweDFjNmM2Y2ZmVUwsCi0gICAgMHhkZjNmNDFkNFVMLCAweDllMGU1YWNkVUwsIDB4YTIyNDg0OTVVTCwgMHhlMzE1OWY4Y1VMLCAweDIwNDZiMmE3VUwsCi0gICAgMHg2MTc3YTliZVVMLCAweGE2ZTFlOGYxVUwsIDB4ZTdkMGYzZThVTCwgMHgyNDgzZGVjM1VMLCAweDY1YjJjNWRhVUwsCi0gICAgMHhhYWFlNWQ1ZFVMLCAweGViOWY0NjQ0VUwsIDB4MjhjYzZiNmZVTCwgMHg2OWZkNzA3NlVMLCAweGFlNmIzMTM5VUwsCi0gICAgMHhlZjVhMmEyMFVMLCAweDJjMDkwNzBiVUwsIDB4NmQzODFjMTJVTCwgMHhmMzM2NDZkZlVMLCAweGIyMDc1ZGM2VUwsCi0gICAgMHg3MTU0NzBlZFVMLCAweDMwNjU2YmY0VUwsIDB4ZjdmMzJhYmJVTCwgMHhiNmMyMzFhMlVMLCAweDc1OTExYzg5VUwsCi0gICAgMHgzNGEwMDc5MFVMLCAweGZiYmM5ZjE3VUwsIDB4YmE4ZDg0MGVVTCwgMHg3OWRlYTkyNVVMLCAweDM4ZWZiMjNjVUwsCi0gICAgMHhmZjc5ZjM3M1VMLCAweGJlNDhlODZhVUwsIDB4N2QxYmM1NDFVTCwgMHgzYzJhZGU1OFVMLCAweDA1NGY3OWYwVUwsCi0gICAgMHg0NDdlNjJlOVVMLCAweDg3MmQ0ZmMyVUwsIDB4YzYxYzU0ZGJVTCwgMHgwMThhMTU5NFVMLCAweDQwYmIwZThkVUwsCi0gICAgMHg4M2U4MjNhNlVMLCAweGMyZDkzOGJmVUwsIDB4MGRjNWEwMzhVTCwgMHg0Y2Y0YmIyMVVMLCAweDhmYTc5NjBhVUwsCi0gICAgMHhjZTk2OGQxM1VMLCAweDA5MDBjYzVjVUwsIDB4NDgzMWQ3NDVVTCwgMHg4YjYyZmE2ZVVMLCAweGNhNTNlMTc3VUwsCi0gICAgMHg1NDVkYmJiYVVMLCAweDE1NmNhMGEzVUwsIDB4ZDYzZjhkODhVTCwgMHg5NzBlOTY5MVVMLCAweDUwOThkN2RlVUwsCi0gICAgMHgxMWE5Y2NjN1VMLCAweGQyZmFlMWVjVUwsIDB4OTNjYmZhZjVVTCwgMHg1Y2Q3NjI3MlVMLCAweDFkZTY3OTZiVUwsCi0gICAgMHhkZWI1NTQ0MFVMLCAweDlmODQ0ZjU5VUwsIDB4NTgxMjBlMTZVTCwgMHgxOTIzMTUwZlVMLCAweGRhNzAzODI0VUwsCi0gICAgMHg5YjQxMjMzZFVMLCAweGE3NmJmZDY1VUwsIDB4ZTY1YWU2N2NVTCwgMHgyNTA5Y2I1N1VMLCAweDY0MzhkMDRlVUwsCi0gICAgMHhhM2FlOTEwMVVMLCAweGUyOWY4YTE4VUwsIDB4MjFjY2E3MzNVTCwgMHg2MGZkYmMyYVVMLCAweGFmZTEyNGFkVUwsCi0gICAgMHhlZWQwM2ZiNFVMLCAweDJkODMxMjlmVUwsIDB4NmNiMjA5ODZVTCwgMHhhYjI0NDhjOVVMLCAweGVhMTU1M2QwVUwsCi0gICAgMHgyOTQ2N2VmYlVMLCAweDY4Nzc2NWUyVUwsIDB4ZjY3OTNmMmZVTCwgMHhiNzQ4MjQzNlVMLCAweDc0MWIwOTFkVUwsCi0gICAgMHgzNTJhMTIwNFVMLCAweGYyYmM1MzRiVUwsIDB4YjM4ZDQ4NTJVTCwgMHg3MGRlNjU3OVVMLCAweDMxZWY3ZTYwVUwsCi0gICAgMHhmZWYzZTZlN1VMLCAweGJmYzJmZGZlVUwsIDB4N2M5MWQwZDVVTCwgMHgzZGEwY2JjY1VMLCAweGZhMzY4YTgzVUwsCi0gICAgMHhiYjA3OTE5YVVMLCAweDc4NTRiY2IxVUwsIDB4Mzk2NWE3YThVTCwgMHg0Yjk4ODMzYlVMLCAweDBhYTk5ODIyVUwsCi0gICAgMHhjOWZhYjUwOVVMLCAweDg4Y2JhZTEwVUwsIDB4NGY1ZGVmNWZVTCwgMHgwZTZjZjQ0NlVMLCAweGNkM2ZkOTZkVUwsCi0gICAgMHg4YzBlYzI3NFVMLCAweDQzMTI1YWYzVUwsIDB4MDIyMzQxZWFVTCwgMHhjMTcwNmNjMVVMLCAweDgwNDE3N2Q4VUwsCi0gICAgMHg0N2Q3MzY5N1VMLCAweDA2ZTYyZDhlVUwsIDB4YzViNTAwYTVVTCwgMHg4NDg0MWJiY1VMLCAweDFhOGE0MTcxVUwsCi0gICAgMHg1YmJiNWE2OFVMLCAweDk4ZTg3NzQzVUwsIDB4ZDlkOTZjNWFVTCwgMHgxZTRmMmQxNVVMLCAweDVmN2UzNjBjVUwsCi0gICAgMHg5YzJkMWIyN1VMLCAweGRkMWMwMDNlVUwsIDB4MTIwMDk4YjlVTCwgMHg1MzMxODNhMFVMLCAweDkwNjJhZThiVUwsCi0gICAgMHhkMTUzYjU5MlVMLCAweDE2YzVmNGRkVUwsIDB4NTdmNGVmYzRVTCwgMHg5NGE3YzJlZlVMLCAweGQ1OTZkOWY2VUwsCi0gICAgMHhlOWJjMDdhZVVMLCAweGE4OGQxY2I3VUwsIDB4NmJkZTMxOWNVTCwgMHgyYWVmMmE4NVVMLCAweGVkNzk2YmNhVUwsCi0gICAgMHhhYzQ4NzBkM1VMLCAweDZmMWI1ZGY4VUwsIDB4MmUyYTQ2ZTFVTCwgMHhlMTM2ZGU2NlVMLCAweGEwMDdjNTdmVUwsCi0gICAgMHg2MzU0ZTg1NFVMLCAweDIyNjVmMzRkVUwsIDB4ZTVmM2IyMDJVTCwgMHhhNGMyYTkxYlVMLCAweDY3OTE4NDMwVUwsCi0gICAgMHgyNmEwOWYyOVVMLCAweGI4YWVjNWU0VUwsIDB4Zjk5ZmRlZmRVTCwgMHgzYWNjZjNkNlVMLCAweDdiZmRlOGNmVUwsCi0gICAgMHhiYzZiYTk4MFVMLCAweGZkNWFiMjk5VUwsIDB4M2UwOTlmYjJVTCwgMHg3ZjM4ODRhYlVMLCAweGIwMjQxYzJjVUwsCi0gICAgMHhmMTE1MDczNVVMLCAweDMyNDYyYTFlVUwsIDB4NzM3NzMxMDdVTCwgMHhiNGUxNzA0OFVMLCAweGY1ZDA2YjUxVUwsCi0gICAgMHgzNjgzNDY3YVVMLCAweDc3YjI1ZDYzVUwsIDB4NGVkN2ZhY2JVTCwgMHgwZmU2ZTFkMlVMLCAweGNjYjVjY2Y5VUwsCi0gICAgMHg4ZDg0ZDdlMFVMLCAweDRhMTI5NmFmVUwsIDB4MGIyMzhkYjZVTCwgMHhjODcwYTA5ZFVMLCAweDg5NDFiYjg0VUwsCi0gICAgMHg0NjVkMjMwM1VMLCAweDA3NmMzODFhVUwsIDB4YzQzZjE1MzFVTCwgMHg4NTBlMGUyOFVMLCAweDQyOTg0ZjY3VUwsCi0gICAgMHgwM2E5NTQ3ZVVMLCAweGMwZmE3OTU1VUwsIDB4ODFjYjYyNGNVTCwgMHgxZmM1Mzg4MVVMLCAweDVlZjQyMzk4VUwsCi0gICAgMHg5ZGE3MGViM1VMLCAweGRjOTYxNWFhVUwsIDB4MWIwMDU0ZTVVTCwgMHg1YTMxNGZmY1VMLCAweDk5NjI2MmQ3VUwsCi0gICAgMHhkODUzNzljZVVMLCAweDE3NGZlMTQ5VUwsIDB4NTY3ZWZhNTBVTCwgMHg5NTJkZDc3YlVMLCAweGQ0MWNjYzYyVUwsCi0gICAgMHgxMzhhOGQyZFVMLCAweDUyYmI5NjM0VUwsIDB4OTFlOGJiMWZVTCwgMHhkMGQ5YTAwNlVMLCAweGVjZjM3ZTVlVUwsCi0gICAgMHhhZGMyNjU0N1VMLCAweDZlOTE0ODZjVUwsIDB4MmZhMDUzNzVVTCwgMHhlODM2MTIzYVVMLCAweGE5MDcwOTIzVUwsCi0gICAgMHg2YTU0MjQwOFVMLCAweDJiNjUzZjExVUwsIDB4ZTQ3OWE3OTZVTCwgMHhhNTQ4YmM4ZlVMLCAweDY2MWI5MWE0VUwsCi0gICAgMHgyNzJhOGFiZFVMLCAweGUwYmNjYmYyVUwsIDB4YTE4ZGQwZWJVTCwgMHg2MmRlZmRjMFVMLCAweDIzZWZlNmQ5VUwsCi0gICAgMHhiZGUxYmMxNFVMLCAweGZjZDBhNzBkVUwsIDB4M2Y4MzhhMjZVTCwgMHg3ZWIyOTEzZlVMLCAweGI5MjRkMDcwVUwsCi0gICAgMHhmODE1Y2I2OVVMLCAweDNiNDZlNjQyVUwsIDB4N2E3N2ZkNWJVTCwgMHhiNTZiNjVkY1VMLCAweGY0NWE3ZWM1VUwsCi0gICAgMHgzNzA5NTNlZVVMLCAweDc2Mzg0OGY3VUwsIDB4YjFhZTA5YjhVTCwgMHhmMDlmMTJhMVVMLCAweDMzY2MzZjhhVUwsCi0gICAgMHg3MmZkMjQ5M1VMCi0gIH0sCi0gIHsKLSAgICAweDAwMDAwMDAwVUwsIDB4Mzc2YWMyMDFVTCwgMHg2ZWQ0ODQwM1VMLCAweDU5YmU0NjAyVUwsIDB4ZGNhODA5MDdVTCwKLSAgICAweGViYzJjYjA2VUwsIDB4YjI3YzhkMDRVTCwgMHg4NTE2NGYwNVVMLCAweGI4NTExMzBlVUwsIDB4OGYzYmQxMGZVTCwKLSAgICAweGQ2ODU5NzBkVUwsIDB4ZTFlZjU1MGNVTCwgMHg2NGY5MWEwOVVMLCAweDUzOTNkODA4VUwsIDB4MGEyZDllMGFVTCwKLSAgICAweDNkNDc1YzBiVUwsIDB4NzBhMzI2MWNVTCwgMHg0N2M5ZTQxZFVMLCAweDFlNzdhMjFmVUwsIDB4MjkxZDYwMWVVTCwKLSAgICAweGFjMGIyZjFiVUwsIDB4OWI2MWVkMWFVTCwgMHhjMmRmYWIxOFVMLCAweGY1YjU2OTE5VUwsIDB4YzhmMjM1MTJVTCwKLSAgICAweGZmOThmNzEzVUwsIDB4YTYyNmIxMTFVTCwgMHg5MTRjNzMxMFVMLCAweDE0NWEzYzE1VUwsIDB4MjMzMGZlMTRVTCwKLSAgICAweDdhOGViODE2VUwsIDB4NGRlNDdhMTdVTCwgMHhlMDQ2NGQzOFVMLCAweGQ3MmM4ZjM5VUwsIDB4OGU5MmM5M2JVTCwKLSAgICAweGI5ZjgwYjNhVUwsIDB4M2NlZTQ0M2ZVTCwgMHgwYjg0ODYzZVVMLCAweDUyM2FjMDNjVUwsIDB4NjU1MDAyM2RVTCwKLSAgICAweDU4MTc1ZTM2VUwsIDB4NmY3ZDljMzdVTCwgMHgzNmMzZGEzNVVMLCAweDAxYTkxODM0VUwsIDB4ODRiZjU3MzFVTCwKLSAgICAweGIzZDU5NTMwVUwsIDB4ZWE2YmQzMzJVTCwgMHhkZDAxMTEzM1VMLCAweDkwZTU2YjI0VUwsIDB4YTc4ZmE5MjVVTCwKLSAgICAweGZlMzFlZjI3VUwsIDB4Yzk1YjJkMjZVTCwgMHg0YzRkNjIyM1VMLCAweDdiMjdhMDIyVUwsIDB4MjI5OWU2MjBVTCwKLSAgICAweDE1ZjMyNDIxVUwsIDB4MjhiNDc4MmFVTCwgMHgxZmRlYmEyYlVMLCAweDQ2NjBmYzI5VUwsIDB4NzEwYTNlMjhVTCwKLSAgICAweGY0MWM3MTJkVUwsIDB4YzM3NmIzMmNVTCwgMHg5YWM4ZjUyZVVMLCAweGFkYTIzNzJmVUwsIDB4YzA4ZDlhNzBVTCwKLSAgICAweGY3ZTc1ODcxVUwsIDB4YWU1OTFlNzNVTCwgMHg5OTMzZGM3MlVMLCAweDFjMjU5Mzc3VUwsIDB4MmI0ZjUxNzZVTCwKLSAgICAweDcyZjExNzc0VUwsIDB4NDU5YmQ1NzVVTCwgMHg3OGRjODk3ZVVMLCAweDRmYjY0YjdmVUwsIDB4MTYwODBkN2RVTCwKLSAgICAweDIxNjJjZjdjVUwsIDB4YTQ3NDgwNzlVTCwgMHg5MzFlNDI3OFVMLCAweGNhYTAwNDdhVUwsIDB4ZmRjYWM2N2JVTCwKLSAgICAweGIwMmViYzZjVUwsIDB4ODc0NDdlNmRVTCwgMHhkZWZhMzg2ZlVMLCAweGU5OTBmYTZlVUwsIDB4NmM4NmI1NmJVTCwKLSAgICAweDViZWM3NzZhVUwsIDB4MDI1MjMxNjhVTCwgMHgzNTM4ZjM2OVVMLCAweDA4N2ZhZjYyVUwsIDB4M2YxNTZkNjNVTCwKLSAgICAweDY2YWIyYjYxVUwsIDB4NTFjMWU5NjBVTCwgMHhkNGQ3YTY2NVVMLCAweGUzYmQ2NDY0VUwsIDB4YmEwMzIyNjZVTCwKLSAgICAweDhkNjllMDY3VUwsIDB4MjBjYmQ3NDhVTCwgMHgxN2ExMTU0OVVMLCAweDRlMWY1MzRiVUwsIDB4Nzk3NTkxNGFVTCwKLSAgICAweGZjNjNkZTRmVUwsIDB4Y2IwOTFjNGVVTCwgMHg5MmI3NWE0Y1VMLCAweGE1ZGQ5ODRkVUwsIDB4OTg5YWM0NDZVTCwKLSAgICAweGFmZjAwNjQ3VUwsIDB4ZjY0ZTQwNDVVTCwgMHhjMTI0ODI0NFVMLCAweDQ0MzJjZDQxVUwsIDB4NzM1ODBmNDBVTCwKLSAgICAweDJhZTY0OTQyVUwsIDB4MWQ4YzhiNDNVTCwgMHg1MDY4ZjE1NFVMLCAweDY3MDIzMzU1VUwsIDB4M2ViYzc1NTdVTCwKLSAgICAweDA5ZDZiNzU2VUwsIDB4OGNjMGY4NTNVTCwgMHhiYmFhM2E1MlVMLCAweGUyMTQ3YzUwVUwsIDB4ZDU3ZWJlNTFVTCwKLSAgICAweGU4MzllMjVhVUwsIDB4ZGY1MzIwNWJVTCwgMHg4NmVkNjY1OVVMLCAweGIxODdhNDU4VUwsIDB4MzQ5MWViNWRVTCwKLSAgICAweDAzZmIyOTVjVUwsIDB4NWE0NTZmNWVVTCwgMHg2ZDJmYWQ1ZlVMLCAweDgwMWIzNWUxVUwsIDB4Yjc3MWY3ZTBVTCwKLSAgICAweGVlY2ZiMWUyVUwsIDB4ZDlhNTczZTNVTCwgMHg1Y2IzM2NlNlVMLCAweDZiZDlmZWU3VUwsIDB4MzI2N2I4ZTVVTCwKLSAgICAweDA1MGQ3YWU0VUwsIDB4Mzg0YTI2ZWZVTCwgMHgwZjIwZTRlZVVMLCAweDU2OWVhMmVjVUwsIDB4NjFmNDYwZWRVTCwKLSAgICAweGU0ZTIyZmU4VUwsIDB4ZDM4OGVkZTlVTCwgMHg4YTM2YWJlYlVMLCAweGJkNWM2OWVhVUwsIDB4ZjBiODEzZmRVTCwKLSAgICAweGM3ZDJkMWZjVUwsIDB4OWU2Yzk3ZmVVTCwgMHhhOTA2NTVmZlVMLCAweDJjMTAxYWZhVUwsIDB4MWI3YWQ4ZmJVTCwKLSAgICAweDQyYzQ5ZWY5VUwsIDB4NzVhZTVjZjhVTCwgMHg0OGU5MDBmM1VMLCAweDdmODNjMmYyVUwsIDB4MjYzZDg0ZjBVTCwKLSAgICAweDExNTc0NmYxVUwsIDB4OTQ0MTA5ZjRVTCwgMHhhMzJiY2JmNVVMLCAweGZhOTU4ZGY3VUwsIDB4Y2RmZjRmZjZVTCwKLSAgICAweDYwNWQ3OGQ5VUwsIDB4NTczN2JhZDhVTCwgMHgwZTg5ZmNkYVVMLCAweDM5ZTMzZWRiVUwsIDB4YmNmNTcxZGVVTCwKLSAgICAweDhiOWZiM2RmVUwsIDB4ZDIyMWY1ZGRVTCwgMHhlNTRiMzdkY1VMLCAweGQ4MGM2YmQ3VUwsIDB4ZWY2NmE5ZDZVTCwKLSAgICAweGI2ZDhlZmQ0VUwsIDB4ODFiMjJkZDVVTCwgMHgwNGE0NjJkMFVMLCAweDMzY2VhMGQxVUwsIDB4NmE3MGU2ZDNVTCwKLSAgICAweDVkMWEyNGQyVUwsIDB4MTBmZTVlYzVVTCwgMHgyNzk0OWNjNFVMLCAweDdlMmFkYWM2VUwsIDB4NDk0MDE4YzdVTCwKLSAgICAweGNjNTY1N2MyVUwsIDB4ZmIzYzk1YzNVTCwgMHhhMjgyZDNjMVVMLCAweDk1ZTgxMWMwVUwsIDB4YThhZjRkY2JVTCwKLSAgICAweDlmYzU4ZmNhVUwsIDB4YzY3YmM5YzhVTCwgMHhmMTExMGJjOVVMLCAweDc0MDc0NGNjVUwsIDB4NDM2ZDg2Y2RVTCwKLSAgICAweDFhZDNjMGNmVUwsIDB4MmRiOTAyY2VVTCwgMHg0MDk2YWY5MVVMLCAweDc3ZmM2ZDkwVUwsIDB4MmU0MjJiOTJVTCwKLSAgICAweDE5MjhlOTkzVUwsIDB4OWMzZWE2OTZVTCwgMHhhYjU0NjQ5N1VMLCAweGYyZWEyMjk1VUwsIDB4YzU4MGUwOTRVTCwKLSAgICAweGY4YzdiYzlmVUwsIDB4Y2ZhZDdlOWVVTCwgMHg5NjEzMzg5Y1VMLCAweGExNzlmYTlkVUwsIDB4MjQ2ZmI1OThVTCwKLSAgICAweDEzMDU3Nzk5VUwsIDB4NGFiYjMxOWJVTCwgMHg3ZGQxZjM5YVVMLCAweDMwMzU4OThkVUwsIDB4MDc1ZjRiOGNVTCwKLSAgICAweDVlZTEwZDhlVUwsIDB4Njk4YmNmOGZVTCwgMHhlYzlkODA4YVVMLCAweGRiZjc0MjhiVUwsIDB4ODI0OTA0ODlVTCwKLSAgICAweGI1MjNjNjg4VUwsIDB4ODg2NDlhODNVTCwgMHhiZjBlNTg4MlVMLCAweGU2YjAxZTgwVUwsIDB4ZDFkYWRjODFVTCwKLSAgICAweDU0Y2M5Mzg0VUwsIDB4NjNhNjUxODVVTCwgMHgzYTE4MTc4N1VMLCAweDBkNzJkNTg2VUwsIDB4YTBkMGUyYTlVTCwKLSAgICAweDk3YmEyMGE4VUwsIDB4Y2UwNDY2YWFVTCwgMHhmOTZlYTRhYlVMLCAweDdjNzhlYmFlVUwsIDB4NGIxMjI5YWZVTCwKLSAgICAweDEyYWM2ZmFkVUwsIDB4MjVjNmFkYWNVTCwgMHgxODgxZjFhN1VMLCAweDJmZWIzM2E2VUwsIDB4NzY1NTc1YTRVTCwKLSAgICAweDQxM2ZiN2E1VUwsIDB4YzQyOWY4YTBVTCwgMHhmMzQzM2FhMVVMLCAweGFhZmQ3Y2EzVUwsIDB4OWQ5N2JlYTJVTCwKLSAgICAweGQwNzNjNGI1VUwsIDB4ZTcxOTA2YjRVTCwgMHhiZWE3NDBiNlVMLCAweDg5Y2Q4MmI3VUwsIDB4MGNkYmNkYjJVTCwKLSAgICAweDNiYjEwZmIzVUwsIDB4NjIwZjQ5YjFVTCwgMHg1NTY1OGJiMFVMLCAweDY4MjJkN2JiVUwsIDB4NWY0ODE1YmFVTCwKLSAgICAweDA2ZjY1M2I4VUwsIDB4MzE5YzkxYjlVTCwgMHhiNDhhZGViY1VMLCAweDgzZTAxY2JkVUwsIDB4ZGE1ZTVhYmZVTCwKLSAgICAweGVkMzQ5OGJlVUwKLSAgfSwKLSAgewotICAgIDB4MDAwMDAwMDBVTCwgMHg2NTY3YmNiOFVMLCAweDhiYzgwOWFhVUwsIDB4ZWVhZmI1MTJVTCwgMHg1Nzk3NjI4ZlVMLAotICAgIDB4MzJmMGRlMzdVTCwgMHhkYzVmNmIyNVVMLCAweGI5MzhkNzlkVUwsIDB4ZWYyOGI0YzVVTCwgMHg4YTRmMDg3ZFVMLAotICAgIDB4NjRlMGJkNmZVTCwgMHgwMTg3MDFkN1VMLCAweGI4YmZkNjRhVUwsIDB4ZGRkODZhZjJVTCwgMHgzMzc3ZGZlMFVMLAotICAgIDB4NTYxMDYzNThVTCwgMHg5ZjU3MTk1MFVMLCAweGZhMzBhNWU4VUwsIDB4MTQ5ZjEwZmFVTCwgMHg3MWY4YWM0MlVMLAotICAgIDB4YzhjMDdiZGZVTCwgMHhhZGE3Yzc2N1VMLCAweDQzMDg3Mjc1VUwsIDB4MjY2ZmNlY2RVTCwgMHg3MDdmYWQ5NVVMLAotICAgIDB4MTUxODExMmRVTCwgMHhmYmI3YTQzZlVMLCAweDllZDAxODg3VUwsIDB4MjdlOGNmMWFVTCwgMHg0MjhmNzNhMlVMLAotICAgIDB4YWMyMGM2YjBVTCwgMHhjOTQ3N2EwOFVMLCAweDNlYWYzMmEwVUwsIDB4NWJjODhlMThVTCwgMHhiNTY3M2IwYVVMLAotICAgIDB4ZDAwMDg3YjJVTCwgMHg2OTM4NTAyZlVMLCAweDBjNWZlYzk3VUwsIDB4ZTJmMDU5ODVVTCwgMHg4Nzk3ZTUzZFVMLAotICAgIDB4ZDE4Nzg2NjVVTCwgMHhiNGUwM2FkZFVMLCAweDVhNGY4ZmNmVUwsIDB4M2YyODMzNzdVTCwgMHg4NjEwZTRlYVVMLAotICAgIDB4ZTM3NzU4NTJVTCwgMHgwZGQ4ZWQ0MFVMLCAweDY4YmY1MWY4VUwsIDB4YTFmODJiZjBVTCwgMHhjNDlmOTc0OFVMLAotICAgIDB4MmEzMDIyNWFVTCwgMHg0ZjU3OWVlMlVMLCAweGY2NmY0OTdmVUwsIDB4OTMwOGY1YzdVTCwgMHg3ZGE3NDBkNVVMLAotICAgIDB4MThjMGZjNmRVTCwgMHg0ZWQwOWYzNVVMLCAweDJiYjcyMzhkVUwsIDB4YzUxODk2OWZVTCwgMHhhMDdmMmEyN1VMLAotICAgIDB4MTk0N2ZkYmFVTCwgMHg3YzIwNDEwMlVMLCAweDkyOGZmNDEwVUwsIDB4ZjdlODQ4YThVTCwgMHgzZDU4MTQ5YlVMLAotICAgIDB4NTgzZmE4MjNVTCwgMHhiNjkwMWQzMVVMLCAweGQzZjdhMTg5VUwsIDB4NmFjZjc2MTRVTCwgMHgwZmE4Y2FhY1VMLAotICAgIDB4ZTEwNzdmYmVVTCwgMHg4NDYwYzMwNlVMLCAweGQyNzBhMDVlVUwsIDB4YjcxNzFjZTZVTCwgMHg1OWI4YTlmNFVMLAotICAgIDB4M2NkZjE1NGNVTCwgMHg4NWU3YzJkMVVMLCAweGUwODA3ZTY5VUwsIDB4MGUyZmNiN2JVTCwgMHg2YjQ4NzdjM1VMLAotICAgIDB4YTIwZjBkY2JVTCwgMHhjNzY4YjE3M1VMLCAweDI5YzcwNDYxVUwsIDB4NGNhMGI4ZDlVTCwgMHhmNTk4NmY0NFVMLAotICAgIDB4OTBmZmQzZmNVTCwgMHg3ZTUwNjZlZVVMLCAweDFiMzdkYTU2VUwsIDB4NGQyN2I5MGVVTCwgMHgyODQwMDViNlVMLAotICAgIDB4YzZlZmIwYTRVTCwgMHhhMzg4MGMxY1VMLCAweDFhYjBkYjgxVUwsIDB4N2ZkNzY3MzlVTCwgMHg5MTc4ZDIyYlVMLAotICAgIDB4ZjQxZjZlOTNVTCwgMHgwM2Y3MjYzYlVMLCAweDY2OTA5YTgzVUwsIDB4ODgzZjJmOTFVTCwgMHhlZDU4OTMyOVVMLAotICAgIDB4NTQ2MDQ0YjRVTCwgMHgzMTA3ZjgwY1VMLCAweGRmYTg0ZDFlVUwsIDB4YmFjZmYxYTZVTCwgMHhlY2RmOTJmZVVMLAotICAgIDB4ODliODJlNDZVTCwgMHg2NzE3OWI1NFVMLCAweDAyNzAyN2VjVUwsIDB4YmI0OGYwNzFVTCwgMHhkZTJmNGNjOVVMLAotICAgIDB4MzA4MGY5ZGJVTCwgMHg1NWU3NDU2M1VMLCAweDljYTAzZjZiVUwsIDB4ZjljNzgzZDNVTCwgMHgxNzY4MzZjMVVMLAotICAgIDB4NzIwZjhhNzlVTCwgMHhjYjM3NWRlNFVMLCAweGFlNTBlMTVjVUwsIDB4NDBmZjU0NGVVTCwgMHgyNTk4ZThmNlVMLAotICAgIDB4NzM4ODhiYWVVTCwgMHgxNmVmMzcxNlVMLCAweGY4NDA4MjA0VUwsIDB4OWQyNzNlYmNVTCwgMHgyNDFmZTkyMVVMLAotICAgIDB4NDE3ODU1OTlVTCwgMHhhZmQ3ZTA4YlVMLCAweGNhYjA1YzMzVUwsIDB4M2JiNjU5ZWRVTCwgMHg1ZWQxZTU1NVVMLAotICAgIDB4YjA3ZTUwNDdVTCwgMHhkNTE5ZWNmZlVMLCAweDZjMjEzYjYyVUwsIDB4MDk0Njg3ZGFVTCwgMHhlN2U5MzJjOFVMLAotICAgIDB4ODI4ZThlNzBVTCwgMHhkNDllZWQyOFVMLCAweGIxZjk1MTkwVUwsIDB4NWY1NmU0ODJVTCwgMHgzYTMxNTgzYVVMLAotICAgIDB4ODMwOThmYTdVTCwgMHhlNjZlMzMxZlVMLCAweDA4YzE4NjBkVUwsIDB4NmRhNjNhYjVVTCwgMHhhNGUxNDBiZFVMLAotICAgIDB4YzE4NmZjMDVVTCwgMHgyZjI5NDkxN1VMLCAweDRhNGVmNWFmVUwsIDB4ZjM3NjIyMzJVTCwgMHg5NjExOWU4YVVMLAotICAgIDB4NzhiZTJiOThVTCwgMHgxZGQ5OTcyMFVMLCAweDRiYzlmNDc4VUwsIDB4MmVhZTQ4YzBVTCwgMHhjMDAxZmRkMlVMLAotICAgIDB4YTU2NjQxNmFVTCwgMHgxYzVlOTZmN1VMLCAweDc5MzkyYTRmVUwsIDB4OTc5NjlmNWRVTCwgMHhmMmYxMjNlNVVMLAotICAgIDB4MDUxOTZiNGRVTCwgMHg2MDdlZDdmNVVMLCAweDhlZDE2MmU3VUwsIDB4ZWJiNmRlNWZVTCwgMHg1MjhlMDljMlVMLAotICAgIDB4MzdlOWI1N2FVTCwgMHhkOTQ2MDA2OFVMLCAweGJjMjFiY2QwVUwsIDB4ZWEzMWRmODhVTCwgMHg4ZjU2NjMzMFVMLAotICAgIDB4NjFmOWQ2MjJVTCwgMHgwNDllNmE5YVVMLCAweGJkYTZiZDA3VUwsIDB4ZDhjMTAxYmZVTCwgMHgzNjZlYjRhZFVMLAotICAgIDB4NTMwOTA4MTVVTCwgMHg5YTRlNzIxZFVMLCAweGZmMjljZWE1VUwsIDB4MTE4NjdiYjdVTCwgMHg3NGUxYzcwZlVMLAotICAgIDB4Y2RkOTEwOTJVTCwgMHhhOGJlYWMyYVVMLCAweDQ2MTExOTM4VUwsIDB4MjM3NmE1ODBVTCwgMHg3NTY2YzZkOFVMLAotICAgIDB4MTAwMTdhNjBVTCwgMHhmZWFlY2Y3MlVMLCAweDliYzk3M2NhVUwsIDB4MjJmMWE0NTdVTCwgMHg0Nzk2MThlZlVMLAotICAgIDB4YTkzOWFkZmRVTCwgMHhjYzVlMTE0NVVMLCAweDA2ZWU0ZDc2VUwsIDB4NjM4OWYxY2VVTCwgMHg4ZDI2NDRkY1VMLAotICAgIDB4ZTg0MWY4NjRVTCwgMHg1MTc5MmZmOVVMLCAweDM0MWU5MzQxVUwsIDB4ZGFiMTI2NTNVTCwgMHhiZmQ2OWFlYlVMLAotICAgIDB4ZTljNmY5YjNVTCwgMHg4Y2ExNDUwYlVMLCAweDYyMGVmMDE5VUwsIDB4MDc2OTRjYTFVTCwgMHhiZTUxOWIzY1VMLAotICAgIDB4ZGIzNjI3ODRVTCwgMHgzNTk5OTI5NlVMLCAweDUwZmUyZTJlVUwsIDB4OTliOTU0MjZVTCwgMHhmY2RlZTg5ZVVMLAotICAgIDB4MTI3MTVkOGNVTCwgMHg3NzE2ZTEzNFVMLCAweGNlMmUzNmE5VUwsIDB4YWI0OThhMTFVTCwgMHg0NWU2M2YwM1VMLAotICAgIDB4MjA4MTgzYmJVTCwgMHg3NjkxZTBlM1VMLCAweDEzZjY1YzViVUwsIDB4ZmQ1OWU5NDlVTCwgMHg5ODNlNTVmMVVMLAotICAgIDB4MjEwNjgyNmNVTCwgMHg0NDYxM2VkNFVMLCAweGFhY2U4YmM2VUwsIDB4Y2ZhOTM3N2VVTCwgMHgzODQxN2ZkNlVMLAotICAgIDB4NWQyNmMzNmVVTCwgMHhiMzg5NzY3Y1VMLCAweGQ2ZWVjYWM0VUwsIDB4NmZkNjFkNTlVTCwgMHgwYWIxYTFlMVVMLAotICAgIDB4ZTQxZTE0ZjNVTCwgMHg4MTc5YTg0YlVMLCAweGQ3NjljYjEzVUwsIDB4YjIwZTc3YWJVTCwgMHg1Y2ExYzJiOVVMLAotICAgIDB4MzljNjdlMDFVTCwgMHg4MGZlYTk5Y1VMLCAweGU1OTkxNTI0VUwsIDB4MGIzNmEwMzZVTCwgMHg2ZTUxMWM4ZVVMLAotICAgIDB4YTcxNjY2ODZVTCwgMHhjMjcxZGEzZVVMLCAweDJjZGU2ZjJjVUwsIDB4NDliOWQzOTRVTCwgMHhmMDgxMDQwOVVMLAotICAgIDB4OTVlNmI4YjFVTCwgMHg3YjQ5MGRhM1VMLCAweDFlMmViMTFiVUwsIDB4NDgzZWQyNDNVTCwgMHgyZDU5NmVmYlVMLAotICAgIDB4YzNmNmRiZTlVTCwgMHhhNjkxNjc1MVVMLCAweDFmYTliMGNjVUwsIDB4N2FjZTBjNzRVTCwgMHg5NDYxYjk2NlVMLAotICAgIDB4ZjEwNjA1ZGVVTAotI2VuZGlmCi0gIH0KLX07CmRpZmYgLS1naXQgYS9zcmMvemxpYi9kZWZsYXRlLmMgYi9zcmMvemxpYi9kZWZsYXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNGMyY2IuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvZGVmbGF0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk2NSArMCwwIEBACi0vKiBkZWZsYXRlLmMgLS0gY29tcHJlc3MgZGF0YSB1c2luZyB0aGUgZGVmbGF0aW9uIGFsZ29yaXRobQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMTIgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qCi0gKiAgQUxHT1JJVEhNCi0gKgotICogICAgICBUaGUgImRlZmxhdGlvbiIgcHJvY2VzcyBkZXBlbmRzIG9uIGJlaW5nIGFibGUgdG8gaWRlbnRpZnkgcG9ydGlvbnMKLSAqICAgICAgb2YgdGhlIGlucHV0IHRleHQgd2hpY2ggYXJlIGlkZW50aWNhbCB0byBlYXJsaWVyIGlucHV0ICh3aXRoaW4gYQotICogICAgICBzbGlkaW5nIHdpbmRvdyB0cmFpbGluZyBiZWhpbmQgdGhlIGlucHV0IGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQpLgotICoKLSAqICAgICAgVGhlIG1vc3Qgc3RyYWlnaHRmb3J3YXJkIHRlY2huaXF1ZSB0dXJucyBvdXQgdG8gYmUgdGhlIGZhc3Rlc3QgZm9yCi0gKiAgICAgIG1vc3QgaW5wdXQgZmlsZXM6IHRyeSBhbGwgcG9zc2libGUgbWF0Y2hlcyBhbmQgc2VsZWN0IHRoZSBsb25nZXN0LgotICogICAgICBUaGUga2V5IGZlYXR1cmUgb2YgdGhpcyBhbGdvcml0aG0gaXMgdGhhdCBpbnNlcnRpb25zIGludG8gdGhlIHN0cmluZwotICogICAgICBkaWN0aW9uYXJ5IGFyZSB2ZXJ5IHNpbXBsZSBhbmQgdGh1cyBmYXN0LCBhbmQgZGVsZXRpb25zIGFyZSBhdm9pZGVkCi0gKiAgICAgIGNvbXBsZXRlbHkuIEluc2VydGlvbnMgYXJlIHBlcmZvcm1lZCBhdCBlYWNoIGlucHV0IGNoYXJhY3Rlciwgd2hlcmVhcwotICogICAgICBzdHJpbmcgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkIG9ubHkgd2hlbiB0aGUgcHJldmlvdXMgbWF0Y2ggZW5kcy4gU28gaXQKLSAqICAgICAgaXMgcHJlZmVyYWJsZSB0byBzcGVuZCBtb3JlIHRpbWUgaW4gbWF0Y2hlcyB0byBhbGxvdyB2ZXJ5IGZhc3Qgc3RyaW5nCi0gKiAgICAgIGluc2VydGlvbnMgYW5kIGF2b2lkIGRlbGV0aW9ucy4gVGhlIG1hdGNoaW5nIGFsZ29yaXRobSBmb3Igc21hbGwKLSAqICAgICAgc3RyaW5ncyBpcyBpbnNwaXJlZCBmcm9tIHRoYXQgb2YgUmFiaW4gJiBLYXJwLiBBIGJydXRlIGZvcmNlIGFwcHJvYWNoCi0gKiAgICAgIGlzIHVzZWQgdG8gZmluZCBsb25nZXIgc3RyaW5ncyB3aGVuIGEgc21hbGwgbWF0Y2ggaGFzIGJlZW4gZm91bmQuCi0gKiAgICAgIEEgc2ltaWxhciBhbGdvcml0aG0gaXMgdXNlZCBpbiBjb21pYyAoYnkgSmFuLU1hcmsgV2FtcykgYW5kIGZyZWV6ZQotICogICAgICAoYnkgTGVvbmlkIEJyb3VraGlzKS4KLSAqICAgICAgICAgQSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1c2VkIGEgbW9yZSBzb3BoaXN0aWNhdGVkIGFsZ29yaXRobQotICogICAgICAoYnkgRmlhbGEgYW5kIEdyZWVuZSkgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBydW4gaW4gbGluZWFyIGFtb3J0aXplZAotICogICAgICB0aW1lLCBidXQgaGFzIGEgbGFyZ2VyIGF2ZXJhZ2UgY29zdCwgdXNlcyBtb3JlIG1lbW9yeSBhbmQgaXMgcGF0ZW50ZWQuCi0gKiAgICAgIEhvd2V2ZXIgdGhlIEYmRyBhbGdvcml0aG0gbWF5IGJlIGZhc3RlciBmb3Igc29tZSBoaWdobHkgcmVkdW5kYW50Ci0gKiAgICAgIGZpbGVzIGlmIHRoZSBwYXJhbWV0ZXIgbWF4X2NoYWluX2xlbmd0aCAoZGVzY3JpYmVkIGJlbG93KSBpcyB0b28gbGFyZ2UuCi0gKgotICogIEFDS05PV0xFREdFTUVOVFMKLSAqCi0gKiAgICAgIFRoZSBpZGVhIG9mIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGlzIGR1ZSB0byBKYW4tTWFyayBXYW1zLCBhbmQKLSAqICAgICAgSSBmb3VuZCBpdCBpbiAnZnJlZXplJyB3cml0dGVuIGJ5IExlb25pZCBCcm91a2hpcy4KLSAqICAgICAgVGhhbmtzIHRvIG1hbnkgcGVvcGxlIGZvciBidWcgcmVwb3J0cyBhbmQgdGVzdGluZy4KLSAqCi0gKiAgUkVGRVJFTkNFUwotICoKLSAqICAgICAgRGV1dHNjaCwgTC5QLiwiREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24iLgotICogICAgICBBdmFpbGFibGUgaW4gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTk1MQotICoKLSAqICAgICAgQSBkZXNjcmlwdGlvbiBvZiB0aGUgUmFiaW4gYW5kIEthcnAgYWxnb3JpdGhtIGlzIGdpdmVuIGluIHRoZSBib29rCi0gKiAgICAgICAgICJBbGdvcml0aG1zIiBieSBSLiBTZWRnZXdpY2ssIEFkZGlzb24tV2VzbGV5LCBwMjUyLgotICoKLSAqICAgICAgRmlhbGEsRS5SLiwgYW5kIEdyZWVuZSxELkguCi0gKiAgICAgICAgIERhdGEgQ29tcHJlc3Npb24gd2l0aCBGaW5pdGUgV2luZG93cywgQ29tbS5BQ00sIDMyLDQgKDE5ODkpIDQ5MC01OTUKLSAqCi0gKi8KLQotLyogQCgjKSAkSWQkICovCi0KLSNpbmNsdWRlICJkZWZsYXRlLmgiCi0KLWNvbnN0IGNoYXIgZGVmbGF0ZV9jb3B5cmlnaHRbXSA9Ci0gICAiIGRlZmxhdGUgMS4yLjcgQ29weXJpZ2h0IDE5OTUtMjAxMiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyICI7Ci0vKgotICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCi0gIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKLSAgaW5jbHVkZSBzdWNoIGFuIGFja25vd2xlZGdtZW50LCBJIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3Uga2VlcCB0aGlzCi0gIGNvcHlyaWdodCBzdHJpbmcgaW4gdGhlIGV4ZWN1dGFibGUgb2YgeW91ciBwcm9kdWN0LgotICovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogIEZ1bmN0aW9uIHByb3RvdHlwZXMuCi0gKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgbmVlZF9tb3JlLCAgICAgIC8qIGJsb2NrIG5vdCBjb21wbGV0ZWQsIG5lZWQgbW9yZSBpbnB1dCBvciBtb3JlIG91dHB1dCAqLwotICAgIGJsb2NrX2RvbmUsICAgICAvKiBibG9jayBmbHVzaCBwZXJmb3JtZWQgKi8KLSAgICBmaW5pc2hfc3RhcnRlZCwgLyogZmluaXNoIHN0YXJ0ZWQsIG5lZWQgb25seSBtb3JlIG91dHB1dCBhdCBuZXh0IGRlZmxhdGUgKi8KLSAgICBmaW5pc2hfZG9uZSAgICAgLyogZmluaXNoIGRvbmUsIGFjY2VwdCBubyBtb3JlIGlucHV0IG9yIG91dHB1dCAqLwotfSBibG9ja19zdGF0ZTsKLQotdHlwZWRlZiBibG9ja19zdGF0ZSAoKmNvbXByZXNzX2Z1bmMpIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgZmx1c2gpKTsKLS8qIENvbXByZXNzaW9uIGZ1bmN0aW9uLiBSZXR1cm5zIHRoZSBibG9jayBzdGF0ZSBhZnRlciB0aGUgY2FsbC4gKi8KLQotbG9jYWwgdm9pZCBmaWxsX3dpbmRvdyAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOwotbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zdG9yZWQgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOwotbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9mYXN0ICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOwotI2lmbmRlZiBGQVNURVNUCi1sb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX3Nsb3cgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7Ci0jZW5kaWYKLWxvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfcmxlICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgZmx1c2gpKTsKLWxvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfaHVmZiAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgZmx1c2gpKTsKLWxvY2FsIHZvaWQgbG1faW5pdCAgICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKLWxvY2FsIHZvaWQgcHV0U2hvcnRNU0IgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHVJbnQgYikpOwotbG9jYWwgdm9pZCBmbHVzaF9wZW5kaW5nICBPRigoel9zdHJlYW1wIHN0cm0pKTsKLWxvY2FsIGludCByZWFkX2J1ZiAgICAgICAgT0YoKHpfc3RyZWFtcCBzdHJtLCBCeXRlZiAqYnVmLCB1bnNpZ25lZCBzaXplKSk7Ci0jaWZkZWYgQVNNVgotICAgICAgdm9pZCBtYXRjaF9pbml0IE9GKCh2b2lkKSk7IC8qIGFzbSBjb2RlIGluaXRpYWxpemF0aW9uICovCi0gICAgICB1SW50IGxvbmdlc3RfbWF0Y2ggIE9GKChkZWZsYXRlX3N0YXRlICpzLCBJUG9zIGN1cl9tYXRjaCkpOwotI2Vsc2UKLWxvY2FsIHVJbnQgbG9uZ2VzdF9tYXRjaCAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3MgY3VyX21hdGNoKSk7Ci0jZW5kaWYKLQotI2lmZGVmIERFQlVHCi1sb2NhbCAgdm9pZCBjaGVja19tYXRjaCBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgSVBvcyBzdGFydCwgSVBvcyBtYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSk7Ci0jZW5kaWYKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBMb2NhbCBkYXRhCi0gKi8KLQotI2RlZmluZSBOSUwgMAotLyogVGFpbCBvZiBoYXNoIGNoYWlucyAqLwotCi0jaWZuZGVmIFRPT19GQVIKLSMgIGRlZmluZSBUT09fRkFSIDQwOTYKLSNlbmRpZgotLyogTWF0Y2hlcyBvZiBsZW5ndGggMyBhcmUgZGlzY2FyZGVkIGlmIHRoZWlyIGRpc3RhbmNlIGV4Y2VlZHMgVE9PX0ZBUiAqLwotCi0vKiBWYWx1ZXMgZm9yIG1heF9sYXp5X21hdGNoLCBnb29kX21hdGNoIGFuZCBtYXhfY2hhaW5fbGVuZ3RoLCBkZXBlbmRpbmcgb24KLSAqIHRoZSBkZXNpcmVkIHBhY2sgbGV2ZWwgKDAuLjkpLiBUaGUgdmFsdWVzIGdpdmVuIGJlbG93IGhhdmUgYmVlbiB0dW5lZCB0bwotICogZXhjbHVkZSB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIGZvciBwYXRob2xvZ2ljYWwgZmlsZXMuIEJldHRlciB2YWx1ZXMgbWF5IGJlCi0gKiBmb3VuZCBmb3Igc3BlY2lmaWMgZmlsZXMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IGNvbmZpZ19zIHsKLSAgIHVzaCBnb29kX2xlbmd0aDsgLyogcmVkdWNlIGxhenkgc2VhcmNoIGFib3ZlIHRoaXMgbWF0Y2ggbGVuZ3RoICovCi0gICB1c2ggbWF4X2xhenk7ICAgIC8qIGRvIG5vdCBwZXJmb3JtIGxhenkgc2VhcmNoIGFib3ZlIHRoaXMgbWF0Y2ggbGVuZ3RoICovCi0gICB1c2ggbmljZV9sZW5ndGg7IC8qIHF1aXQgc2VhcmNoIGFib3ZlIHRoaXMgbWF0Y2ggbGVuZ3RoICovCi0gICB1c2ggbWF4X2NoYWluOwotICAgY29tcHJlc3NfZnVuYyBmdW5jOwotfSBjb25maWc7Ci0KLSNpZmRlZiBGQVNURVNUCi1sb2NhbCBjb25zdCBjb25maWcgY29uZmlndXJhdGlvbl90YWJsZVsyXSA9IHsKLS8qICAgICAgZ29vZCBsYXp5IG5pY2UgY2hhaW4gKi8KLS8qIDAgKi8gezAsICAgIDAsICAwLCAgICAwLCBkZWZsYXRlX3N0b3JlZH0sICAvKiBzdG9yZSBvbmx5ICovCi0vKiAxICovIHs0LCAgICA0LCAgOCwgICAgNCwgZGVmbGF0ZV9mYXN0fX07IC8qIG1heCBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovCi0jZWxzZQotbG9jYWwgY29uc3QgY29uZmlnIGNvbmZpZ3VyYXRpb25fdGFibGVbMTBdID0gewotLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqLwotLyogMCAqLyB7MCwgICAgMCwgIDAsICAgIDAsIGRlZmxhdGVfc3RvcmVkfSwgIC8qIHN0b3JlIG9ubHkgKi8KLS8qIDEgKi8gezQsICAgIDQsICA4LCAgICA0LCBkZWZsYXRlX2Zhc3R9LCAvKiBtYXggc3BlZWQsIG5vIGxhenkgbWF0Y2hlcyAqLwotLyogMiAqLyB7NCwgICAgNSwgMTYsICAgIDgsIGRlZmxhdGVfZmFzdH0sCi0vKiAzICovIHs0LCAgICA2LCAzMiwgICAzMiwgZGVmbGF0ZV9mYXN0fSwKLQotLyogNCAqLyB7NCwgICAgNCwgMTYsICAgMTYsIGRlZmxhdGVfc2xvd30sICAvKiBsYXp5IG1hdGNoZXMgKi8KLS8qIDUgKi8gezgsICAgMTYsIDMyLCAgIDMyLCBkZWZsYXRlX3Nsb3d9LAotLyogNiAqLyB7OCwgICAxNiwgMTI4LCAxMjgsIGRlZmxhdGVfc2xvd30sCi0vKiA3ICovIHs4LCAgIDMyLCAxMjgsIDI1NiwgZGVmbGF0ZV9zbG93fSwKLS8qIDggKi8gezMyLCAxMjgsIDI1OCwgMTAyNCwgZGVmbGF0ZV9zbG93fSwKLS8qIDkgKi8gezMyLCAyNTgsIDI1OCwgNDA5NiwgZGVmbGF0ZV9zbG93fX07IC8qIG1heCBjb21wcmVzc2lvbiAqLwotI2VuZGlmCi0KLS8qIE5vdGU6IHRoZSBkZWZsYXRlKCkgY29kZSByZXF1aXJlcyBtYXhfbGF6eSA+PSBNSU5fTUFUQ0ggYW5kIG1heF9jaGFpbiA+PSA0Ci0gKiBGb3IgZGVmbGF0ZV9mYXN0KCkgKGxldmVscyA8PSAzKSBnb29kIGlzIGlnbm9yZWQgYW5kIGxhenkgaGFzIGEgZGlmZmVyZW50Ci0gKiBtZWFuaW5nLgotICovCi0KLSNkZWZpbmUgRVFVQUwgMAotLyogcmVzdWx0IG9mIG1lbWNtcCBmb3IgZXF1YWwgc3RyaW5ncyAqLwotCi0jaWZuZGVmIE5PX0RVTU1ZX0RFQ0wKLXN0cnVjdCBzdGF0aWNfdHJlZV9kZXNjX3Mge2ludCBkdW1teTt9OyAvKiBmb3IgYnVnZ3kgY29tcGlsZXJzICovCi0jZW5kaWYKLQotLyogcmFuayBaX0JMT0NLIGJldHdlZW4gWl9OT19GTFVTSCBhbmQgWl9QQVJUSUFMX0ZMVVNIICovCi0jZGVmaW5lIFJBTksoZikgKCgoZikgPDwgMSkgLSAoKGYpID4gNCA/IDkgOiAwKSkKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBVcGRhdGUgYSBoYXNoIHZhbHVlIHdpdGggdGhlIGdpdmVuIGlucHV0IGJ5dGUKLSAqIElOICBhc3NlcnRpb246IGFsbCBjYWxscyB0byB0byBVUERBVEVfSEFTSCBhcmUgbWFkZSB3aXRoIGNvbnNlY3V0aXZlCi0gKiAgICBpbnB1dCBjaGFyYWN0ZXJzLCBzbyB0aGF0IGEgcnVubmluZyBoYXNoIGtleSBjYW4gYmUgY29tcHV0ZWQgZnJvbSB0aGUKLSAqICAgIHByZXZpb3VzIGtleSBpbnN0ZWFkIG9mIGNvbXBsZXRlIHJlY2FsY3VsYXRpb24gZWFjaCB0aW1lLgotICovCi0jZGVmaW5lIFVQREFURV9IQVNIKHMsaCxjKSAoaCA9ICgoKGgpPDxzLT5oYXNoX3NoaWZ0KSBeIChjKSkgJiBzLT5oYXNoX21hc2spCi0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBJbnNlcnQgc3RyaW5nIHN0ciBpbiB0aGUgZGljdGlvbmFyeSBhbmQgc2V0IG1hdGNoX2hlYWQgdG8gdGhlIHByZXZpb3VzIGhlYWQKLSAqIG9mIHRoZSBoYXNoIGNoYWluICh0aGUgbW9zdCByZWNlbnQgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGtleSkuIFJldHVybgotICogdGhlIHByZXZpb3VzIGxlbmd0aCBvZiB0aGUgaGFzaCBjaGFpbi4KLSAqIElmIHRoaXMgZmlsZSBpcyBjb21waWxlZCB3aXRoIC1ERkFTVEVTVCwgdGhlIGNvbXByZXNzaW9uIGxldmVsIGlzIGZvcmNlZAotICogdG8gMSwgYW5kIG5vIGhhc2ggY2hhaW5zIGFyZSBtYWludGFpbmVkLgotICogSU4gIGFzc2VydGlvbjogYWxsIGNhbGxzIHRvIHRvIElOU0VSVF9TVFJJTkcgYXJlIG1hZGUgd2l0aCBjb25zZWN1dGl2ZQotICogICAgaW5wdXQgY2hhcmFjdGVycyBhbmQgdGhlIGZpcnN0IE1JTl9NQVRDSCBieXRlcyBvZiBzdHIgYXJlIHZhbGlkCi0gKiAgICAoZXhjZXB0IGZvciB0aGUgbGFzdCBNSU5fTUFUQ0gtMSBieXRlcyBvZiB0aGUgaW5wdXQgZmlsZSkuCi0gKi8KLSNpZmRlZiBGQVNURVNUCi0jZGVmaW5lIElOU0VSVF9TVFJJTkcocywgc3RyLCBtYXRjaF9oZWFkKSBcCi0gICAoVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1soc3RyKSArIChNSU5fTUFUQ0gtMSldKSwgXAotICAgIG1hdGNoX2hlYWQgPSBzLT5oZWFkW3MtPmluc19oXSwgXAotICAgIHMtPmhlYWRbcy0+aW5zX2hdID0gKFBvcykoc3RyKSkKLSNlbHNlCi0jZGVmaW5lIElOU0VSVF9TVFJJTkcocywgc3RyLCBtYXRjaF9oZWFkKSBcCi0gICAoVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1soc3RyKSArIChNSU5fTUFUQ0gtMSldKSwgXAotICAgIG1hdGNoX2hlYWQgPSBzLT5wcmV2WyhzdHIpICYgcy0+d19tYXNrXSA9IHMtPmhlYWRbcy0+aW5zX2hdLCBcCi0gICAgcy0+aGVhZFtzLT5pbnNfaF0gPSAoUG9zKShzdHIpKQotI2VuZGlmCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogSW5pdGlhbGl6ZSB0aGUgaGFzaCB0YWJsZSAoYXZvaWRpbmcgNjRLIG92ZXJmbG93IGZvciAxNiBiaXQgc3lzdGVtcykuCi0gKiBwcmV2W10gd2lsbCBiZSBpbml0aWFsaXplZCBvbiB0aGUgZmx5LgotICovCi0jZGVmaW5lIENMRUFSX0hBU0gocykgXAotICAgIHMtPmhlYWRbcy0+aGFzaF9zaXplLTFdID0gTklMOyBcCi0gICAgem1lbXplcm8oKEJ5dGVmICopcy0+aGVhZCwgKHVuc2lnbmVkKShzLT5oYXNoX3NpemUtMSkqc2l6ZW9mKCpzLT5oZWFkKSk7Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBaRVhQT1JUIGRlZmxhdGVJbml0XyhzdHJtLCBsZXZlbCwgdmVyc2lvbiwgc3RyZWFtX3NpemUpCi0gICAgel9zdHJlYW1wIHN0cm07Ci0gICAgaW50IGxldmVsOwotICAgIGNvbnN0IGNoYXIgKnZlcnNpb247Ci0gICAgaW50IHN0cmVhbV9zaXplOwotewotICAgIHJldHVybiBkZWZsYXRlSW5pdDJfKHN0cm0sIGxldmVsLCBaX0RFRkxBVEVELCBNQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgWl9ERUZBVUxUX1NUUkFURUdZLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSk7Ci0gICAgLyogVG8gZG86IGlnbm9yZSBzdHJtLT5uZXh0X2luIGlmIHdlIHVzZSBpdCBhcyB3aW5kb3cgKi8KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQyXyhzdHJtLCBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSkKLSAgICB6X3N0cmVhbXAgc3RybTsKLSAgICBpbnQgIGxldmVsOwotICAgIGludCAgbWV0aG9kOwotICAgIGludCAgd2luZG93Qml0czsKLSAgICBpbnQgIG1lbUxldmVsOwotICAgIGludCAgc3RyYXRlZ3k7Ci0gICAgY29uc3QgY2hhciAqdmVyc2lvbjsKLSAgICBpbnQgc3RyZWFtX3NpemU7Ci17Ci0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICBpbnQgd3JhcCA9IDE7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgbXlfdmVyc2lvbltdID0gWkxJQl9WRVJTSU9OOwotCi0gICAgdXNoZiAqb3ZlcmxheTsKLSAgICAvKiBXZSBvdmVybGF5IHBlbmRpbmdfYnVmIGFuZCBkX2J1ZitsX2J1Zi4gVGhpcyB3b3JrcyBzaW5jZSB0aGUgYXZlcmFnZQotICAgICAqIG91dHB1dCBzaXplIGZvciAobGVuZ3RoLGRpc3RhbmNlKSBjb2RlcyBpcyA8PSAyNCBiaXRzLgotICAgICAqLwotCi0gICAgaWYgKHZlcnNpb24gPT0gWl9OVUxMIHx8IHZlcnNpb25bMF0gIT0gbXlfdmVyc2lvblswXSB8fAotICAgICAgICBzdHJlYW1fc2l6ZSAhPSBzaXplb2Yoel9zdHJlYW0pKSB7Ci0gICAgICAgIHJldHVybiBaX1ZFUlNJT05fRVJST1I7Ci0gICAgfQotICAgIGlmIChzdHJtID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotCi0gICAgc3RybS0+bXNnID0gWl9OVUxMOwotICAgIGlmIChzdHJtLT56YWxsb2MgPT0gKGFsbG9jX2Z1bmMpMCkgewotI2lmZGVmIFpfU09MTwotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0jZWxzZQotICAgICAgICBzdHJtLT56YWxsb2MgPSB6Y2FsbG9jOwotICAgICAgICBzdHJtLT5vcGFxdWUgPSAodm9pZHBmKTA7Ci0jZW5kaWYKLSAgICB9Ci0gICAgaWYgKHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkKLSNpZmRlZiBaX1NPTE8KLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotI2Vsc2UKLSAgICAgICAgc3RybS0+emZyZWUgPSB6Y2ZyZWU7Ci0jZW5kaWYKLQotI2lmZGVmIEZBU1RFU1QKLSAgICBpZiAobGV2ZWwgIT0gMCkgbGV2ZWwgPSAxOwotI2Vsc2UKLSAgICBpZiAobGV2ZWwgPT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSBsZXZlbCA9IDY7Ci0jZW5kaWYKLQotICAgIGlmICh3aW5kb3dCaXRzIDwgMCkgeyAvKiBzdXBwcmVzcyB6bGliIHdyYXBwZXIgKi8KLSAgICAgICAgd3JhcCA9IDA7Ci0gICAgICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0czsKLSAgICB9Ci0jaWZkZWYgR1pJUAotICAgIGVsc2UgaWYgKHdpbmRvd0JpdHMgPiAxNSkgewotICAgICAgICB3cmFwID0gMjsgICAgICAgLyogd3JpdGUgZ3ppcCB3cmFwcGVyIGluc3RlYWQgKi8KLSAgICAgICAgd2luZG93Qml0cyAtPSAxNjsKLSAgICB9Ci0jZW5kaWYKLSAgICBpZiAobWVtTGV2ZWwgPCAxIHx8IG1lbUxldmVsID4gTUFYX01FTV9MRVZFTCB8fCBtZXRob2QgIT0gWl9ERUZMQVRFRCB8fAotICAgICAgICB3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUgfHwgbGV2ZWwgPCAwIHx8IGxldmVsID4gOSB8fAotICAgICAgICBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEKSB7Ci0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICB9Ci0gICAgaWYgKHdpbmRvd0JpdHMgPT0gOCkgd2luZG93Qml0cyA9IDk7ICAvKiB1bnRpbCAyNTYtYnl0ZSB3aW5kb3cgYnVnIGZpeGVkICovCi0gICAgcyA9IChkZWZsYXRlX3N0YXRlICopIFpBTExPQyhzdHJtLCAxLCBzaXplb2YoZGVmbGF0ZV9zdGF0ZSkpOwotICAgIGlmIChzID09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOwotICAgIHN0cm0tPnN0YXRlID0gKHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKilzOwotICAgIHMtPnN0cm0gPSBzdHJtOwotCi0gICAgcy0+d3JhcCA9IHdyYXA7Ci0gICAgcy0+Z3poZWFkID0gWl9OVUxMOwotICAgIHMtPndfYml0cyA9IHdpbmRvd0JpdHM7Ci0gICAgcy0+d19zaXplID0gMSA8PCBzLT53X2JpdHM7Ci0gICAgcy0+d19tYXNrID0gcy0+d19zaXplIC0gMTsKLQotICAgIHMtPmhhc2hfYml0cyA9IG1lbUxldmVsICsgNzsKLSAgICBzLT5oYXNoX3NpemUgPSAxIDw8IHMtPmhhc2hfYml0czsKLSAgICBzLT5oYXNoX21hc2sgPSBzLT5oYXNoX3NpemUgLSAxOwotICAgIHMtPmhhc2hfc2hpZnQgPSAgKChzLT5oYXNoX2JpdHMrTUlOX01BVENILTEpL01JTl9NQVRDSCk7Ci0KLSAgICBzLT53aW5kb3cgPSAoQnl0ZWYgKikgWkFMTE9DKHN0cm0sIHMtPndfc2l6ZSwgMipzaXplb2YoQnl0ZSkpOwotICAgIHMtPnByZXYgICA9IChQb3NmICopICBaQUxMT0Moc3RybSwgcy0+d19zaXplLCBzaXplb2YoUG9zKSk7Ci0gICAgcy0+aGVhZCAgID0gKFBvc2YgKikgIFpBTExPQyhzdHJtLCBzLT5oYXNoX3NpemUsIHNpemVvZihQb3MpKTsKLQotICAgIHMtPmhpZ2hfd2F0ZXIgPSAwOyAgICAgIC8qIG5vdGhpbmcgd3JpdHRlbiB0byBzLT53aW5kb3cgeWV0ICovCi0KLSAgICBzLT5saXRfYnVmc2l6ZSA9IDEgPDwgKG1lbUxldmVsICsgNik7IC8qIDE2SyBlbGVtZW50cyBieSBkZWZhdWx0ICovCi0KLSAgICBvdmVybGF5ID0gKHVzaGYgKikgWkFMTE9DKHN0cm0sIHMtPmxpdF9idWZzaXplLCBzaXplb2YodXNoKSsyKTsKLSAgICBzLT5wZW5kaW5nX2J1ZiA9ICh1Y2hmICopIG92ZXJsYXk7Ci0gICAgcy0+cGVuZGluZ19idWZfc2l6ZSA9ICh1bGcpcy0+bGl0X2J1ZnNpemUgKiAoc2l6ZW9mKHVzaCkrMkwpOwotCi0gICAgaWYgKHMtPndpbmRvdyA9PSBaX05VTEwgfHwgcy0+cHJldiA9PSBaX05VTEwgfHwgcy0+aGVhZCA9PSBaX05VTEwgfHwKLSAgICAgICAgcy0+cGVuZGluZ19idWYgPT0gWl9OVUxMKSB7Ci0gICAgICAgIHMtPnN0YXR1cyA9IEZJTklTSF9TVEFURTsKLSAgICAgICAgc3RybS0+bXNnID0gKGNoYXIqKUVSUl9NU0coWl9NRU1fRVJST1IpOwotICAgICAgICBkZWZsYXRlRW5kIChzdHJtKTsKLSAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOwotICAgIH0KLSAgICBzLT5kX2J1ZiA9IG92ZXJsYXkgKyBzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTsKLSAgICBzLT5sX2J1ZiA9IHMtPnBlbmRpbmdfYnVmICsgKDErc2l6ZW9mKHVzaCkpKnMtPmxpdF9idWZzaXplOwotCi0gICAgcy0+bGV2ZWwgPSBsZXZlbDsKLSAgICBzLT5zdHJhdGVneSA9IHN0cmF0ZWd5OwotICAgIHMtPm1ldGhvZCA9IChCeXRlKW1ldGhvZDsKLQotICAgIHJldHVybiBkZWZsYXRlUmVzZXQoc3RybSk7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBaRVhQT1JUIGRlZmxhdGVTZXREaWN0aW9uYXJ5IChzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKQotICAgIHpfc3RyZWFtcCBzdHJtOwotICAgIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5OwotICAgIHVJbnQgIGRpY3RMZW5ndGg7Ci17Ci0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICB1SW50IHN0ciwgbjsKLSAgICBpbnQgd3JhcDsKLSAgICB1bnNpZ25lZCBhdmFpbDsKLSAgICB1bnNpZ25lZCBjaGFyICpuZXh0OwotCi0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fCBkaWN0aW9uYXJ5ID09IFpfTlVMTCkKLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIHMgPSBzdHJtLT5zdGF0ZTsKLSAgICB3cmFwID0gcy0+d3JhcDsKLSAgICBpZiAod3JhcCA9PSAyIHx8ICh3cmFwID09IDEgJiYgcy0+c3RhdHVzICE9IElOSVRfU1RBVEUpIHx8IHMtPmxvb2thaGVhZCkKLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotCi0gICAgLyogd2hlbiB1c2luZyB6bGliIHdyYXBwZXJzLCBjb21wdXRlIEFkbGVyLTMyIGZvciBwcm92aWRlZCBkaWN0aW9uYXJ5ICovCi0gICAgaWYgKHdyYXAgPT0gMSkKLSAgICAgICAgc3RybS0+YWRsZXIgPSBhZGxlcjMyKHN0cm0tPmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsKLSAgICBzLT53cmFwID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIGF2b2lkIGNvbXB1dGluZyBBZGxlci0zMiBpbiByZWFkX2J1ZiAqLwotCi0gICAgLyogaWYgZGljdGlvbmFyeSB3b3VsZCBmaWxsIHdpbmRvdywganVzdCByZXBsYWNlIHRoZSBoaXN0b3J5ICovCi0gICAgaWYgKGRpY3RMZW5ndGggPj0gcy0+d19zaXplKSB7Ci0gICAgICAgIGlmICh3cmFwID09IDApIHsgICAgICAgICAgICAvKiBhbHJlYWR5IGVtcHR5IG90aGVyd2lzZSAqLwotICAgICAgICAgICAgQ0xFQVJfSEFTSChzKTsKLSAgICAgICAgICAgIHMtPnN0cnN0YXJ0ID0gMDsKLSAgICAgICAgICAgIHMtPmJsb2NrX3N0YXJ0ID0gMEw7Ci0gICAgICAgICAgICBzLT5pbnNlcnQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGRpY3Rpb25hcnkgKz0gZGljdExlbmd0aCAtIHMtPndfc2l6ZTsgIC8qIHVzZSB0aGUgdGFpbCAqLwotICAgICAgICBkaWN0TGVuZ3RoID0gcy0+d19zaXplOwotICAgIH0KLQotICAgIC8qIGluc2VydCBkaWN0aW9uYXJ5IGludG8gd2luZG93IGFuZCBoYXNoICovCi0gICAgYXZhaWwgPSBzdHJtLT5hdmFpbF9pbjsKLSAgICBuZXh0ID0gc3RybS0+bmV4dF9pbjsKLSAgICBzdHJtLT5hdmFpbF9pbiA9IGRpY3RMZW5ndGg7Ci0gICAgc3RybS0+bmV4dF9pbiA9IChCeXRlZiAqKWRpY3Rpb25hcnk7Ci0gICAgZmlsbF93aW5kb3cocyk7Ci0gICAgd2hpbGUgKHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKLSAgICAgICAgc3RyID0gcy0+c3Ryc3RhcnQ7Ci0gICAgICAgIG4gPSBzLT5sb29rYWhlYWQgLSAoTUlOX01BVENILTEpOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIE1JTl9NQVRDSC0xXSk7Ci0jaWZuZGVmIEZBU1RFU1QKLSAgICAgICAgICAgIHMtPnByZXZbc3RyICYgcy0+d19tYXNrXSA9IHMtPmhlYWRbcy0+aW5zX2hdOwotI2VuZGlmCi0gICAgICAgICAgICBzLT5oZWFkW3MtPmluc19oXSA9IChQb3Mpc3RyOwotICAgICAgICAgICAgc3RyKys7Ci0gICAgICAgIH0gd2hpbGUgKC0tbik7Ci0gICAgICAgIHMtPnN0cnN0YXJ0ID0gc3RyOwotICAgICAgICBzLT5sb29rYWhlYWQgPSBNSU5fTUFUQ0gtMTsKLSAgICAgICAgZmlsbF93aW5kb3cocyk7Ci0gICAgfQotICAgIHMtPnN0cnN0YXJ0ICs9IHMtPmxvb2thaGVhZDsKLSAgICBzLT5ibG9ja19zdGFydCA9IChsb25nKXMtPnN0cnN0YXJ0OwotICAgIHMtPmluc2VydCA9IHMtPmxvb2thaGVhZDsKLSAgICBzLT5sb29rYWhlYWQgPSAwOwotICAgIHMtPm1hdGNoX2xlbmd0aCA9IHMtPnByZXZfbGVuZ3RoID0gTUlOX01BVENILTE7Ci0gICAgcy0+bWF0Y2hfYXZhaWxhYmxlID0gMDsKLSAgICBzdHJtLT5uZXh0X2luID0gbmV4dDsKLSAgICBzdHJtLT5hdmFpbF9pbiA9IGF2YWlsOwotICAgIHMtPndyYXAgPSB3cmFwOwotICAgIHJldHVybiBaX09LOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgWkVYUE9SVCBkZWZsYXRlUmVzZXRLZWVwIChzdHJtKQotICAgIHpfc3RyZWFtcCBzdHJtOwotewotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8Ci0gICAgICAgIHN0cm0tPnphbGxvYyA9PSAoYWxsb2NfZnVuYykwIHx8IHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkgewotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgfQotCi0gICAgc3RybS0+dG90YWxfaW4gPSBzdHJtLT50b3RhbF9vdXQgPSAwOwotICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsgLyogdXNlIHpmcmVlIGlmIHdlIGV2ZXIgYWxsb2NhdGUgbXNnIGR5bmFtaWNhbGx5ICovCi0gICAgc3RybS0+ZGF0YV90eXBlID0gWl9VTktOT1dOOwotCi0gICAgcyA9IChkZWZsYXRlX3N0YXRlICopc3RybS0+c3RhdGU7Ci0gICAgcy0+cGVuZGluZyA9IDA7Ci0gICAgcy0+cGVuZGluZ19vdXQgPSBzLT5wZW5kaW5nX2J1ZjsKLQotICAgIGlmIChzLT53cmFwIDwgMCkgewotICAgICAgICBzLT53cmFwID0gLXMtPndyYXA7IC8qIHdhcyBtYWRlIG5lZ2F0aXZlIGJ5IGRlZmxhdGUoLi4uLCBaX0ZJTklTSCk7ICovCi0gICAgfQotICAgIHMtPnN0YXR1cyA9IHMtPndyYXAgPyBJTklUX1NUQVRFIDogQlVTWV9TVEFURTsKLSAgICBzdHJtLT5hZGxlciA9Ci0jaWZkZWYgR1pJUAotICAgICAgICBzLT53cmFwID09IDIgPyBjcmMzMigwTCwgWl9OVUxMLCAwKSA6Ci0jZW5kaWYKLSAgICAgICAgYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKLSAgICBzLT5sYXN0X2ZsdXNoID0gWl9OT19GTFVTSDsKLQotICAgIF90cl9pbml0KHMpOwotCi0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBaRVhQT1JUIGRlZmxhdGVSZXNldCAoc3RybSkKLSAgICB6X3N0cmVhbXAgc3RybTsKLXsKLSAgICBpbnQgcmV0OwotCi0gICAgcmV0ID0gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKTsKLSAgICBpZiAocmV0ID09IFpfT0spCi0gICAgICAgIGxtX2luaXQoc3RybS0+c3RhdGUpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBaRVhQT1JUIGRlZmxhdGVTZXRIZWFkZXIgKHN0cm0sIGhlYWQpCi0gICAgel9zdHJlYW1wIHN0cm07Ci0gICAgZ3pfaGVhZGVycCBoZWFkOwotewotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBpZiAoc3RybS0+c3RhdGUtPndyYXAgIT0gMikgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIHN0cm0tPnN0YXRlLT5nemhlYWQgPSBoZWFkOwotICAgIHJldHVybiBaX09LOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgWkVYUE9SVCBkZWZsYXRlUGVuZGluZyAoc3RybSwgcGVuZGluZywgYml0cykKLSAgICB1bnNpZ25lZCAqcGVuZGluZzsKLSAgICBpbnQgKmJpdHM7Ci0gICAgel9zdHJlYW1wIHN0cm07Ci17Ci0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIGlmIChwZW5kaW5nICE9IFpfTlVMTCkKLSAgICAgICAgKnBlbmRpbmcgPSBzdHJtLT5zdGF0ZS0+cGVuZGluZzsKLSAgICBpZiAoYml0cyAhPSBaX05VTEwpCi0gICAgICAgICpiaXRzID0gc3RybS0+c3RhdGUtPmJpX3ZhbGlkOwotICAgIHJldHVybiBaX09LOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgWkVYUE9SVCBkZWZsYXRlUHJpbWUgKHN0cm0sIGJpdHMsIHZhbHVlKQotICAgIHpfc3RyZWFtcCBzdHJtOwotICAgIGludCBiaXRzOwotICAgIGludCB2YWx1ZTsKLXsKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIGludCBwdXQ7Ci0KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgcyA9IHN0cm0tPnN0YXRlOwotICAgIGlmICgoQnl0ZWYgKikocy0+ZF9idWYpIDwgcy0+cGVuZGluZ19vdXQgKyAoKEJ1Zl9zaXplICsgNykgPj4gMykpCi0gICAgICAgIHJldHVybiBaX0JVRl9FUlJPUjsKLSAgICBkbyB7Ci0gICAgICAgIHB1dCA9IEJ1Zl9zaXplIC0gcy0+YmlfdmFsaWQ7Ci0gICAgICAgIGlmIChwdXQgPiBiaXRzKQotICAgICAgICAgICAgcHV0ID0gYml0czsKLSAgICAgICAgcy0+YmlfYnVmIHw9ICh1c2gpKCh2YWx1ZSAmICgoMSA8PCBwdXQpIC0gMSkpIDw8IHMtPmJpX3ZhbGlkKTsKLSAgICAgICAgcy0+YmlfdmFsaWQgKz0gcHV0OwotICAgICAgICBfdHJfZmx1c2hfYml0cyhzKTsKLSAgICAgICAgdmFsdWUgPj49IHB1dDsKLSAgICAgICAgYml0cyAtPSBwdXQ7Ci0gICAgfSB3aGlsZSAoYml0cyk7Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBaRVhQT1JUIGRlZmxhdGVQYXJhbXMoc3RybSwgbGV2ZWwsIHN0cmF0ZWd5KQotICAgIHpfc3RyZWFtcCBzdHJtOwotICAgIGludCBsZXZlbDsKLSAgICBpbnQgc3RyYXRlZ3k7Ci17Ci0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICBjb21wcmVzc19mdW5jIGZ1bmM7Ci0gICAgaW50IGVyciA9IFpfT0s7Ci0KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgcyA9IHN0cm0tPnN0YXRlOwotCi0jaWZkZWYgRkFTVEVTVAotICAgIGlmIChsZXZlbCAhPSAwKSBsZXZlbCA9IDE7Ci0jZWxzZQotICAgIGlmIChsZXZlbCA9PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIGxldmVsID0gNjsKLSNlbmRpZgotICAgIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8IHN0cmF0ZWd5IDwgMCB8fCBzdHJhdGVneSA+IFpfRklYRUQpIHsKLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIH0KLSAgICBmdW5jID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZnVuYzsKLQotICAgIGlmICgoc3RyYXRlZ3kgIT0gcy0+c3RyYXRlZ3kgfHwgZnVuYyAhPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5mdW5jKSAmJgotICAgICAgICBzdHJtLT50b3RhbF9pbiAhPSAwKSB7Ci0gICAgICAgIC8qIEZsdXNoIHRoZSBsYXN0IGJ1ZmZlcjogKi8KLSAgICAgICAgZXJyID0gZGVmbGF0ZShzdHJtLCBaX0JMT0NLKTsKLSAgICB9Ci0gICAgaWYgKHMtPmxldmVsICE9IGxldmVsKSB7Ci0gICAgICAgIHMtPmxldmVsID0gbGV2ZWw7Ci0gICAgICAgIHMtPm1heF9sYXp5X21hdGNoICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5tYXhfbGF6eTsKLSAgICAgICAgcy0+Z29vZF9tYXRjaCAgICAgICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLmdvb2RfbGVuZ3RoOwotICAgICAgICBzLT5uaWNlX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtsZXZlbF0ubmljZV9sZW5ndGg7Ci0gICAgICAgIHMtPm1heF9jaGFpbl9sZW5ndGggPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5tYXhfY2hhaW47Ci0gICAgfQotICAgIHMtPnN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotaW50IFpFWFBPUlQgZGVmbGF0ZVR1bmUoc3RybSwgZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluKQotICAgIHpfc3RyZWFtcCBzdHJtOwotICAgIGludCBnb29kX2xlbmd0aDsKLSAgICBpbnQgbWF4X2xhenk7Ci0gICAgaW50IG5pY2VfbGVuZ3RoOwotICAgIGludCBtYXhfY2hhaW47Ci17Ci0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLQotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzID0gc3RybS0+c3RhdGU7Ci0gICAgcy0+Z29vZF9tYXRjaCA9IGdvb2RfbGVuZ3RoOwotICAgIHMtPm1heF9sYXp5X21hdGNoID0gbWF4X2xhenk7Ci0gICAgcy0+bmljZV9tYXRjaCA9IG5pY2VfbGVuZ3RoOwotICAgIHMtPm1heF9jaGFpbl9sZW5ndGggPSBtYXhfY2hhaW47Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEZvciB0aGUgZGVmYXVsdCB3aW5kb3dCaXRzIG9mIDE1IGFuZCBtZW1MZXZlbCBvZiA4LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKLSAqIGEgY2xvc2UgdG8gZXhhY3QsIGFzIHdlbGwgYXMgc21hbGwsIHVwcGVyIGJvdW5kIG9uIHRoZSBjb21wcmVzc2VkIHNpemUuCi0gKiBUaGV5IGFyZSBjb2RlZCBhcyBjb25zdGFudHMgaGVyZSBmb3IgYSByZWFzb24tLWlmIHRoZSAjZGVmaW5lJ3MgYXJlCi0gKiBjaGFuZ2VkLCB0aGVuIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY2hhbmdlZCBhcyB3ZWxsLiAgVGhlIHJldHVybgotICogdmFsdWUgZm9yIDE1IGFuZCA4IG9ubHkgd29ya3MgZm9yIHRob3NlIGV4YWN0IHNldHRpbmdzLgotICoKLSAqIEZvciBhbnkgc2V0dGluZyBvdGhlciB0aGFuIHRob3NlIGRlZmF1bHRzIGZvciB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbCwKLSAqIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyBhIGNvbnNlcnZhdGl2ZSB3b3JzdCBjYXNlIGZvciB0aGUgbWF4aW11bSBleHBhbnNpb24KLSAqIHJlc3VsdGluZyBmcm9tIHVzaW5nIGZpeGVkIGJsb2NrcyBpbnN0ZWFkIG9mIHN0b3JlZCBibG9ja3MsIHdoaWNoIGRlZmxhdGUKLSAqIGNhbiBlbWl0IG9uIGNvbXByZXNzZWQgZGF0YSBmb3Igc29tZSBjb21iaW5hdGlvbnMgb2YgdGhlIHBhcmFtZXRlcnMuCi0gKgotICogVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3JlIHNvcGhpc3RpY2F0ZWQgdG8gcHJvdmlkZSBjbG9zZXIgdXBwZXIgYm91bmRzIGZvcgotICogZXZlcnkgY29tYmluYXRpb24gb2Ygd2luZG93Qml0cyBhbmQgbWVtTGV2ZWwuICBCdXQgZXZlbiB0aGUgY29uc2VydmF0aXZlCi0gKiB1cHBlciBib3VuZCBvZiBhYm91dCAxNCUgZXhwYW5zaW9uIGRvZXMgbm90IHNlZW0gb25lcm91cyBmb3Igb3V0cHV0IGJ1ZmZlcgotICogYWxsb2NhdGlvbi4KLSAqLwotdUxvbmcgWkVYUE9SVCBkZWZsYXRlQm91bmQoc3RybSwgc291cmNlTGVuKQotICAgIHpfc3RyZWFtcCBzdHJtOwotICAgIHVMb25nIHNvdXJjZUxlbjsKLXsKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIHVMb25nIGNvbXBsZW4sIHdyYXBsZW47Ci0gICAgQnl0ZWYgKnN0cjsKLQotICAgIC8qIGNvbnNlcnZhdGl2ZSB1cHBlciBib3VuZCBmb3IgY29tcHJlc3NlZCBkYXRhICovCi0gICAgY29tcGxlbiA9IHNvdXJjZUxlbiArCi0gICAgICAgICAgICAgICgoc291cmNlTGVuICsgNykgPj4gMykgKyAoKHNvdXJjZUxlbiArIDYzKSA+PiA2KSArIDU7Ci0KLSAgICAvKiBpZiBjYW4ndCBnZXQgcGFyYW1ldGVycywgcmV0dXJuIGNvbnNlcnZhdGl2ZSBib3VuZCBwbHVzIHpsaWIgd3JhcHBlciAqLwotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpCi0gICAgICAgIHJldHVybiBjb21wbGVuICsgNjsKLQotICAgIC8qIGNvbXB1dGUgd3JhcHBlciBsZW5ndGggKi8KLSAgICBzID0gc3RybS0+c3RhdGU7Ci0gICAgc3dpdGNoIChzLT53cmFwKSB7Ci0gICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJhdyBkZWZsYXRlICovCi0gICAgICAgIHdyYXBsZW4gPSAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogemxpYiB3cmFwcGVyICovCi0gICAgICAgIHdyYXBsZW4gPSA2ICsgKHMtPnN0cnN0YXJ0ID8gNCA6IDApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3ppcCB3cmFwcGVyICovCi0gICAgICAgIHdyYXBsZW4gPSAxODsKLSAgICAgICAgaWYgKHMtPmd6aGVhZCAhPSBaX05VTEwpIHsgICAgICAgICAgLyogdXNlci1zdXBwbGllZCBnemlwIGhlYWRlciAqLwotICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+ZXh0cmEgIT0gWl9OVUxMKQotICAgICAgICAgICAgICAgIHdyYXBsZW4gKz0gMiArIHMtPmd6aGVhZC0+ZXh0cmFfbGVuOwotICAgICAgICAgICAgc3RyID0gcy0+Z3poZWFkLT5uYW1lOwotICAgICAgICAgICAgaWYgKHN0ciAhPSBaX05VTEwpCi0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICB3cmFwbGVuKys7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoKnN0cisrKTsKLSAgICAgICAgICAgIHN0ciA9IHMtPmd6aGVhZC0+Y29tbWVudDsKLSAgICAgICAgICAgIGlmIChzdHIgIT0gWl9OVUxMKQotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgd3JhcGxlbisrOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKCpzdHIrKyk7Ci0gICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjKQotICAgICAgICAgICAgICAgIHdyYXBsZW4gKz0gMjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIGNvbXBpbGVyIGhhcHBpbmVzcyAqLwotICAgICAgICB3cmFwbGVuID0gNjsKLSAgICB9Ci0KLSAgICAvKiBpZiBub3QgZGVmYXVsdCBwYXJhbWV0ZXJzLCByZXR1cm4gY29uc2VydmF0aXZlIGJvdW5kICovCi0gICAgaWYgKHMtPndfYml0cyAhPSAxNSB8fCBzLT5oYXNoX2JpdHMgIT0gOCArIDcpCi0gICAgICAgIHJldHVybiBjb21wbGVuICsgd3JhcGxlbjsKLQotICAgIC8qIGRlZmF1bHQgc2V0dGluZ3M6IHJldHVybiB0aWdodCBib3VuZCBmb3IgdGhhdCBjYXNlICovCi0gICAgcmV0dXJuIHNvdXJjZUxlbiArIChzb3VyY2VMZW4gPj4gMTIpICsgKHNvdXJjZUxlbiA+PiAxNCkgKwotICAgICAgICAgICAoc291cmNlTGVuID4+IDI1KSArIDEzIC0gNiArIHdyYXBsZW47Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFB1dCBhIHNob3J0IGluIHRoZSBwZW5kaW5nIGJ1ZmZlci4gVGhlIDE2LWJpdCB2YWx1ZSBpcyBwdXQgaW4gTVNCIG9yZGVyLgotICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluCi0gKiBwZW5kaW5nX2J1Zi4KLSAqLwotbG9jYWwgdm9pZCBwdXRTaG9ydE1TQiAocywgYikKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIHVJbnQgYjsKLXsKLSAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiA+PiA4KSk7Ci0gICAgcHV0X2J5dGUocywgKEJ5dGUpKGIgJiAweGZmKSk7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0IGdvZXMKLSAqIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXQKLSAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5uZXh0X291dCBidWZmZXIgYW5kIGNvcHlpbmcgaW50byBpdC4KLSAqIChTZWUgYWxzbyByZWFkX2J1ZigpKS4KLSAqLwotbG9jYWwgdm9pZCBmbHVzaF9wZW5kaW5nKHN0cm0pCi0gICAgel9zdHJlYW1wIHN0cm07Ci17Ci0gICAgdW5zaWduZWQgbGVuOwotICAgIGRlZmxhdGVfc3RhdGUgKnMgPSBzdHJtLT5zdGF0ZTsKLQotICAgIF90cl9mbHVzaF9iaXRzKHMpOwotICAgIGxlbiA9IHMtPnBlbmRpbmc7Ci0gICAgaWYgKGxlbiA+IHN0cm0tPmF2YWlsX291dCkgbGVuID0gc3RybS0+YXZhaWxfb3V0OwotICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuOwotCi0gICAgem1lbWNweShzdHJtLT5uZXh0X291dCwgcy0+cGVuZGluZ19vdXQsIGxlbik7Ci0gICAgc3RybS0+bmV4dF9vdXQgICs9IGxlbjsKLSAgICBzLT5wZW5kaW5nX291dCAgKz0gbGVuOwotICAgIHN0cm0tPnRvdGFsX291dCArPSBsZW47Ci0gICAgc3RybS0+YXZhaWxfb3V0ICAtPSBsZW47Ci0gICAgcy0+cGVuZGluZyAtPSBsZW47Ci0gICAgaWYgKHMtPnBlbmRpbmcgPT0gMCkgewotICAgICAgICBzLT5wZW5kaW5nX291dCA9IHMtPnBlbmRpbmdfYnVmOwotICAgIH0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotaW50IFpFWFBPUlQgZGVmbGF0ZSAoc3RybSwgZmx1c2gpCi0gICAgel9zdHJlYW1wIHN0cm07Ci0gICAgaW50IGZsdXNoOwotewotICAgIGludCBvbGRfZmx1c2g7IC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi8KLSAgICBkZWZsYXRlX3N0YXRlICpzOwotCi0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fAotICAgICAgICBmbHVzaCA+IFpfQkxPQ0sgfHwgZmx1c2ggPCAwKSB7Ci0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICB9Ci0gICAgcyA9IHN0cm0tPnN0YXRlOwotCi0gICAgaWYgKHN0cm0tPm5leHRfb3V0ID09IFpfTlVMTCB8fAotICAgICAgICAoc3RybS0+bmV4dF9pbiA9PSBaX05VTEwgJiYgc3RybS0+YXZhaWxfaW4gIT0gMCkgfHwKLSAgICAgICAgKHMtPnN0YXR1cyA9PSBGSU5JU0hfU1RBVEUgJiYgZmx1c2ggIT0gWl9GSU5JU0gpKSB7Ci0gICAgICAgIEVSUl9SRVRVUk4oc3RybSwgWl9TVFJFQU1fRVJST1IpOwotICAgIH0KLSAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIEVSUl9SRVRVUk4oc3RybSwgWl9CVUZfRVJST1IpOwotCi0gICAgcy0+c3RybSA9IHN0cm07IC8qIGp1c3QgaW4gY2FzZSAqLwotICAgIG9sZF9mbHVzaCA9IHMtPmxhc3RfZmx1c2g7Ci0gICAgcy0+bGFzdF9mbHVzaCA9IGZsdXNoOwotCi0gICAgLyogV3JpdGUgdGhlIGhlYWRlciAqLwotICAgIGlmIChzLT5zdGF0dXMgPT0gSU5JVF9TVEFURSkgewotI2lmZGVmIEdaSVAKLSAgICAgICAgaWYgKHMtPndyYXAgPT0gMikgewotICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKLSAgICAgICAgICAgIHB1dF9ieXRlKHMsIDMxKTsKLSAgICAgICAgICAgIHB1dF9ieXRlKHMsIDEzOSk7Ci0gICAgICAgICAgICBwdXRfYnl0ZShzLCA4KTsKLSAgICAgICAgICAgIGlmIChzLT5nemhlYWQgPT0gWl9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgMCk7Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgMCk7Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgMCk7Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgMCk7Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgMCk7Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy0+bGV2ZWwgPT0gOSA/IDIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLT5sZXZlbCA8IDIgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IDogMCkpOwotICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIE9TX0NPREUpOwotICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IEJVU1lfU1RBVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAocy0+Z3poZWFkLT50ZXh0ID8gMSA6IDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+Z3poZWFkLT5oY3JjID8gMiA6IDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+Z3poZWFkLT5leHRyYSA9PSBaX05VTEwgPyAwIDogNCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5nemhlYWQtPm5hbWUgPT0gWl9OVUxMID8gMCA6IDgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+Z3poZWFkLT5jb21tZW50ID09IFpfTlVMTCA/IDAgOiAxNikKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKHMtPmd6aGVhZC0+dGltZSAmIDB4ZmYpKTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHMtPmd6aGVhZC0+dGltZSA+PiA4KSAmIDB4ZmYpKTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHMtPmd6aGVhZC0+dGltZSA+PiAxNikgJiAweGZmKSk7Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzLT5nemhlYWQtPnRpbWUgPj4gMjQpICYgMHhmZikpOwotICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMtPmxldmVsID09IDkgPyAyIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+c3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy0+bGV2ZWwgPCAyID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLT5nemhlYWQtPm9zICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+ZXh0cmEgIT0gWl9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMtPmd6aGVhZC0+ZXh0cmFfbGVuICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChzLT5nemhlYWQtPmV4dHJhX2xlbiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjKQotICAgICAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nKTsKLSAgICAgICAgICAgICAgICBzLT5nemluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBzLT5zdGF0dXMgPSBFWFRSQV9TVEFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgewotICAgICAgICAgICAgdUludCBoZWFkZXIgPSAoWl9ERUZMQVRFRCArICgocy0+d19iaXRzLTgpPDw0KSkgPDwgODsKLSAgICAgICAgICAgIHVJbnQgbGV2ZWxfZmxhZ3M7Ci0KLSAgICAgICAgICAgIGlmIChzLT5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLT5sZXZlbCA8IDIpCi0gICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAwOwotICAgICAgICAgICAgZWxzZSBpZiAocy0+bGV2ZWwgPCA2KQotICAgICAgICAgICAgICAgIGxldmVsX2ZsYWdzID0gMTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHMtPmxldmVsID09IDYpCi0gICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAyOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGxldmVsX2ZsYWdzID0gMzsKLSAgICAgICAgICAgIGhlYWRlciB8PSAobGV2ZWxfZmxhZ3MgPDwgNik7Ci0gICAgICAgICAgICBpZiAocy0+c3Ryc3RhcnQgIT0gMCkgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOwotICAgICAgICAgICAgaGVhZGVyICs9IDMxIC0gKGhlYWRlciAlIDMxKTsKLQotICAgICAgICAgICAgcy0+c3RhdHVzID0gQlVTWV9TVEFURTsKLSAgICAgICAgICAgIHB1dFNob3J0TVNCKHMsIGhlYWRlcik7Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgdGhlIGFkbGVyMzIgb2YgdGhlIHByZXNldCBkaWN0aW9uYXJ5OiAqLwotICAgICAgICAgICAgaWYgKHMtPnN0cnN0YXJ0ICE9IDApIHsKLSAgICAgICAgICAgICAgICBwdXRTaG9ydE1TQihzLCAodUludCkoc3RybS0+YWRsZXIgPj4gMTYpKTsKLSAgICAgICAgICAgICAgICBwdXRTaG9ydE1TQihzLCAodUludCkoc3RybS0+YWRsZXIgJiAweGZmZmYpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKLSAgICAgICAgfQotICAgIH0KLSNpZmRlZiBHWklQCi0gICAgaWYgKHMtPnN0YXR1cyA9PSBFWFRSQV9TVEFURSkgewotICAgICAgICBpZiAocy0+Z3poZWFkLT5leHRyYSAhPSBaX05VTEwpIHsKLSAgICAgICAgICAgIHVJbnQgYmVnID0gcy0+cGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi8KLQotICAgICAgICAgICAgd2hpbGUgKHMtPmd6aW5kZXggPCAocy0+Z3poZWFkLT5leHRyYV9sZW4gJiAweGZmZmYpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgPT0gcy0+cGVuZGluZ19idWZfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjICYmIHMtPnBlbmRpbmcgPiBiZWcpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiArIGJlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7Ci0gICAgICAgICAgICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7Ci0gICAgICAgICAgICAgICAgICAgIGJlZyA9IHMtPnBlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nID09IHMtPnBlbmRpbmdfYnVmX3NpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy0+Z3poZWFkLT5leHRyYVtzLT5nemluZGV4XSk7Ci0gICAgICAgICAgICAgICAgcy0+Z3ppbmRleCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYyAmJiBzLT5wZW5kaW5nID4gYmVnKQotICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmICsgYmVnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7Ci0gICAgICAgICAgICBpZiAocy0+Z3ppbmRleCA9PSBzLT5nemhlYWQtPmV4dHJhX2xlbikgewotICAgICAgICAgICAgICAgIHMtPmd6aW5kZXggPSAwOwotICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IE5BTUVfU1RBVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcy0+c3RhdHVzID0gTkFNRV9TVEFURTsKLSAgICB9Ci0gICAgaWYgKHMtPnN0YXR1cyA9PSBOQU1FX1NUQVRFKSB7Ci0gICAgICAgIGlmIChzLT5nemhlYWQtPm5hbWUgIT0gWl9OVUxMKSB7Ci0gICAgICAgICAgICB1SW50IGJlZyA9IHMtPnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovCi0gICAgICAgICAgICBpbnQgdmFsOwotCi0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgPT0gcy0+cGVuZGluZ19idWZfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjICYmIHMtPnBlbmRpbmcgPiBiZWcpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiArIGJlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7Ci0gICAgICAgICAgICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7Ci0gICAgICAgICAgICAgICAgICAgIGJlZyA9IHMtPnBlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nID09IHMtPnBlbmRpbmdfYnVmX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YWwgPSBzLT5nemhlYWQtPm5hbWVbcy0+Z3ppbmRleCsrXTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCB2YWwpOwotICAgICAgICAgICAgfSB3aGlsZSAodmFsICE9IDApOwotICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYyAmJiBzLT5wZW5kaW5nID4gYmVnKQotICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmICsgYmVnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7Ci0gICAgICAgICAgICBpZiAodmFsID09IDApIHsKLSAgICAgICAgICAgICAgICBzLT5nemluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBzLT5zdGF0dXMgPSBDT01NRU5UX1NUQVRFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHMtPnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7Ci0gICAgfQotICAgIGlmIChzLT5zdGF0dXMgPT0gQ09NTUVOVF9TVEFURSkgewotICAgICAgICBpZiAocy0+Z3poZWFkLT5jb21tZW50ICE9IFpfTlVMTCkgewotICAgICAgICAgICAgdUludCBiZWcgPSBzLT5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqLwotICAgICAgICAgICAgaW50IHZhbDsKLQotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nID09IHMtPnBlbmRpbmdfYnVmX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYyAmJiBzLT5wZW5kaW5nID4gYmVnKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgcy0+cGVuZGluZ19idWYgKyBiZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcgLSBiZWcpOwotICAgICAgICAgICAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOwotICAgICAgICAgICAgICAgICAgICBiZWcgPSBzLT5wZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICBpZiAocy0+cGVuZGluZyA9PSBzLT5wZW5kaW5nX2J1Zl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFsID0gcy0+Z3poZWFkLT5jb21tZW50W3MtPmd6aW5kZXgrK107Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgdmFsKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKHZhbCAhPSAwKTsKLSAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMgJiYgcy0+cGVuZGluZyA+IGJlZykKLSAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiArIGJlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcgLSBiZWcpOwotICAgICAgICAgICAgaWYgKHZhbCA9PSAwKQotICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IEhDUkNfU1RBVEU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcy0+c3RhdHVzID0gSENSQ19TVEFURTsKLSAgICB9Ci0gICAgaWYgKHMtPnN0YXR1cyA9PSBIQ1JDX1NUQVRFKSB7Ci0gICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMpIHsKLSAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nICsgMiA+IHMtPnBlbmRpbmdfYnVmX3NpemUpCi0gICAgICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKLSAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nICsgMiA8PSBzLT5wZW5kaW5nX2J1Zl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKHN0cm0tPmFkbGVyICYgMHhmZikpOwotICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+YWRsZXIgPj4gOCkgJiAweGZmKSk7Ci0gICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKLSAgICAgICAgICAgICAgICBzLT5zdGF0dXMgPSBCVVNZX1NUQVRFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHMtPnN0YXR1cyA9IEJVU1lfU1RBVEU7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlICovCi0gICAgaWYgKHMtPnBlbmRpbmcgIT0gMCkgewotICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOwotICAgICAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIHsKLSAgICAgICAgICAgIC8qIFNpbmNlIGF2YWlsX291dCBpcyAwLCBkZWZsYXRlIHdpbGwgYmUgY2FsbGVkIGFnYWluIHdpdGgKLSAgICAgICAgICAgICAqIG1vcmUgb3V0cHV0IHNwYWNlLCBidXQgcG9zc2libHkgd2l0aCBib3RoIHBlbmRpbmcgYW5kCi0gICAgICAgICAgICAgKiBhdmFpbF9pbiBlcXVhbCB0byB6ZXJvLiBUaGVyZSB3b24ndCBiZSBhbnl0aGluZyB0byBkbywKLSAgICAgICAgICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBhbiBlcnJvciBzaXR1YXRpb24gc28gbWFrZSBzdXJlIHdlCi0gICAgICAgICAgICAgKiByZXR1cm4gT0sgaW5zdGVhZCBvZiBCVUZfRVJST1IgYXQgbmV4dCBjYWxsIG9mIGRlZmxhdGU6Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHMtPmxhc3RfZmx1c2ggPSAtMTsKLSAgICAgICAgICAgIHJldHVybiBaX09LOwotICAgICAgICB9Ci0KLSAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIGFuZCBhdm9pZCBkdXBsaWNhdGUgY29uc2VjdXRpdmUKLSAgICAgKiBmbHVzaGVzLiBGb3IgcmVwZWF0ZWQgYW5kIHVzZWxlc3MgY2FsbHMgd2l0aCBaX0ZJTklTSCwgd2Uga2VlcAotICAgICAqIHJldHVybmluZyBaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBaX0JVRl9FUlJPUi4KLSAgICAgKi8KLSAgICB9IGVsc2UgaWYgKHN0cm0tPmF2YWlsX2luID09IDAgJiYgUkFOSyhmbHVzaCkgPD0gUkFOSyhvbGRfZmx1c2gpICYmCi0gICAgICAgICAgICAgICBmbHVzaCAhPSBaX0ZJTklTSCkgewotICAgICAgICBFUlJfUkVUVVJOKHN0cm0sIFpfQlVGX0VSUk9SKTsKLSAgICB9Ci0KLSAgICAvKiBVc2VyIG11c3Qgbm90IHByb3ZpZGUgbW9yZSBpbnB1dCBhZnRlciB0aGUgZmlyc3QgRklOSVNIOiAqLwotICAgIGlmIChzLT5zdGF0dXMgPT0gRklOSVNIX1NUQVRFICYmIHN0cm0tPmF2YWlsX2luICE9IDApIHsKLSAgICAgICAgRVJSX1JFVFVSTihzdHJtLCBaX0JVRl9FUlJPUik7Ci0gICAgfQotCi0gICAgLyogU3RhcnQgYSBuZXcgYmxvY2sgb3IgY29udGludWUgdGhlIGN1cnJlbnQgb25lLgotICAgICAqLwotICAgIGlmIChzdHJtLT5hdmFpbF9pbiAhPSAwIHx8IHMtPmxvb2thaGVhZCAhPSAwIHx8Ci0gICAgICAgIChmbHVzaCAhPSBaX05PX0ZMVVNIICYmIHMtPnN0YXR1cyAhPSBGSU5JU0hfU1RBVEUpKSB7Ci0gICAgICAgIGJsb2NrX3N0YXRlIGJzdGF0ZTsKLQotICAgICAgICBic3RhdGUgPSBzLT5zdHJhdGVneSA9PSBaX0hVRkZNQU5fT05MWSA/IGRlZmxhdGVfaHVmZihzLCBmbHVzaCkgOgotICAgICAgICAgICAgICAgICAgICAocy0+c3RyYXRlZ3kgPT0gWl9STEUgPyBkZWZsYXRlX3JsZShzLCBmbHVzaCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgKCooY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZnVuYykpKHMsIGZsdXNoKSk7Ci0KLSAgICAgICAgaWYgKGJzdGF0ZSA9PSBmaW5pc2hfc3RhcnRlZCB8fCBic3RhdGUgPT0gZmluaXNoX2RvbmUpIHsKLSAgICAgICAgICAgIHMtPnN0YXR1cyA9IEZJTklTSF9TVEFURTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnN0YXRlID09IG5lZWRfbW9yZSB8fCBic3RhdGUgPT0gZmluaXNoX3N0YXJ0ZWQpIHsKLSAgICAgICAgICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCkgewotICAgICAgICAgICAgICAgIHMtPmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIG5leHQgY2FsbCwgc2VlIGFib3ZlICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gWl9PSzsKLSAgICAgICAgICAgIC8qIElmIGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgYXZhaWxfb3V0ID09IDAsIHRoZSBuZXh0IGNhbGwKLSAgICAgICAgICAgICAqIG9mIGRlZmxhdGUgc2hvdWxkIHVzZSB0aGUgc2FtZSBmbHVzaCBwYXJhbWV0ZXIgdG8gbWFrZSBzdXJlCi0gICAgICAgICAgICAgKiB0aGF0IHRoZSBmbHVzaCBpcyBjb21wbGV0ZS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBvdXRwdXQgYW4KLSAgICAgICAgICAgICAqIGVtcHR5IGJsb2NrIGhlcmUsIHRoaXMgd2lsbCBiZSBkb25lIGF0IG5leHQgY2FsbC4gVGhpcyBhbHNvCi0gICAgICAgICAgICAgKiBlbnN1cmVzIHRoYXQgZm9yIGEgdmVyeSBzbWFsbCBvdXRwdXQgYnVmZmVyLCB3ZSBlbWl0IGF0IG1vc3QKLSAgICAgICAgICAgICAqIG9uZSBlbXB0eSBibG9jay4KLSAgICAgICAgICAgICAqLwotICAgICAgICB9Ci0gICAgICAgIGlmIChic3RhdGUgPT0gYmxvY2tfZG9uZSkgewotICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfUEFSVElBTF9GTFVTSCkgewotICAgICAgICAgICAgICAgIF90cl9hbGlnbihzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZmx1c2ggIT0gWl9CTE9DSykgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi8KLSAgICAgICAgICAgICAgICBfdHJfc3RvcmVkX2Jsb2NrKHMsIChjaGFyKikwLCAwTCwgMCk7Ci0gICAgICAgICAgICAgICAgLyogRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWQKLSAgICAgICAgICAgICAgICAgKiBhcyBhIHNwZWNpYWwgbWFya2VyIGJ5IGluZmxhdGVfc3luYygpLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX0ZVTExfRkxVU0gpIHsKLSAgICAgICAgICAgICAgICAgICAgQ0xFQVJfSEFTSChzKTsgICAgICAgICAgICAgLyogZm9yZ2V0IGhpc3RvcnkgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19zdGFydCA9IDBMOwotICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW5zZXJ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7Ci0gICAgICAgICAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIHsKLSAgICAgICAgICAgICAgcy0+bGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi8KLSAgICAgICAgICAgICAgcmV0dXJuIFpfT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQXNzZXJ0KHN0cm0tPmF2YWlsX291dCA+IDAsICJidWcyIik7Ci0KLSAgICBpZiAoZmx1c2ggIT0gWl9GSU5JU0gpIHJldHVybiBaX09LOwotICAgIGlmIChzLT53cmFwIDw9IDApIHJldHVybiBaX1NUUkVBTV9FTkQ7Ci0KLSAgICAvKiBXcml0ZSB0aGUgdHJhaWxlciAqLwotI2lmZGVmIEdaSVAKLSAgICBpZiAocy0+d3JhcCA9PSAyKSB7Ci0gICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKShzdHJtLT5hZGxlciAmIDB4ZmYpKTsKLSAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT5hZGxlciA+PiA4KSAmIDB4ZmYpKTsKLSAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT5hZGxlciA+PiAxNikgJiAweGZmKSk7Ci0gICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+YWRsZXIgPj4gMjQpICYgMHhmZikpOwotICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoc3RybS0+dG90YWxfaW4gJiAweGZmKSk7Ci0gICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+dG90YWxfaW4gPj4gOCkgJiAweGZmKSk7Ci0gICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+dG90YWxfaW4gPj4gMTYpICYgMHhmZikpOwotICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHN0cm0tPnRvdGFsX2luID4+IDI0KSAmIDB4ZmYpKTsKLSAgICB9Ci0gICAgZWxzZQotI2VuZGlmCi0gICAgewotICAgICAgICBwdXRTaG9ydE1TQihzLCAodUludCkoc3RybS0+YWRsZXIgPj4gMTYpKTsKLSAgICAgICAgcHV0U2hvcnRNU0IocywgKHVJbnQpKHN0cm0tPmFkbGVyICYgMHhmZmZmKSk7Ci0gICAgfQotICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7Ci0gICAgLyogSWYgYXZhaWxfb3V0IGlzIHplcm8sIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGNhbGwgZGVmbGF0ZSBhZ2FpbgotICAgICAqIHRvIGZsdXNoIHRoZSByZXN0LgotICAgICAqLwotICAgIGlmIChzLT53cmFwID4gMCkgcy0+d3JhcCA9IC1zLT53cmFwOyAvKiB3cml0ZSB0aGUgdHJhaWxlciBvbmx5IG9uY2UhICovCi0gICAgcmV0dXJuIHMtPnBlbmRpbmcgIT0gMCA/IFpfT0sgOiBaX1NUUkVBTV9FTkQ7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBaRVhQT1JUIGRlZmxhdGVFbmQgKHN0cm0pCi0gICAgel9zdHJlYW1wIHN0cm07Ci17Ci0gICAgaW50IHN0YXR1czsKLQotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLQotICAgIHN0YXR1cyA9IHN0cm0tPnN0YXRlLT5zdGF0dXM7Ci0gICAgaWYgKHN0YXR1cyAhPSBJTklUX1NUQVRFICYmCi0gICAgICAgIHN0YXR1cyAhPSBFWFRSQV9TVEFURSAmJgotICAgICAgICBzdGF0dXMgIT0gTkFNRV9TVEFURSAmJgotICAgICAgICBzdGF0dXMgIT0gQ09NTUVOVF9TVEFURSAmJgotICAgICAgICBzdGF0dXMgIT0gSENSQ19TVEFURSAmJgotICAgICAgICBzdGF0dXMgIT0gQlVTWV9TVEFURSAmJgotICAgICAgICBzdGF0dXMgIT0gRklOSVNIX1NUQVRFKSB7Ci0gICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgfQotCi0gICAgLyogRGVhbGxvY2F0ZSBpbiByZXZlcnNlIG9yZGVyIG9mIGFsbG9jYXRpb25zOiAqLwotICAgIFRSWV9GUkVFKHN0cm0sIHN0cm0tPnN0YXRlLT5wZW5kaW5nX2J1Zik7Ci0gICAgVFJZX0ZSRUUoc3RybSwgc3RybS0+c3RhdGUtPmhlYWQpOwotICAgIFRSWV9GUkVFKHN0cm0sIHN0cm0tPnN0YXRlLT5wcmV2KTsKLSAgICBUUllfRlJFRShzdHJtLCBzdHJtLT5zdGF0ZS0+d2luZG93KTsKLQotICAgIFpGUkVFKHN0cm0sIHN0cm0tPnN0YXRlKTsKLSAgICBzdHJtLT5zdGF0ZSA9IFpfTlVMTDsKLQotICAgIHJldHVybiBzdGF0dXMgPT0gQlVTWV9TVEFURSA/IFpfREFUQV9FUlJPUiA6IFpfT0s7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHkgdGhlIHNvdXJjZSBzdGF0ZSB0byB0aGUgZGVzdGluYXRpb24gc3RhdGUuCi0gKiBUbyBzaW1wbGlmeSB0aGUgc291cmNlLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIDE2LWJpdCBNU0RPUyAod2hpY2gKLSAqIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggbWVtb3J5IGFueXdheSB0byBkdXBsaWNhdGUgY29tcHJlc3Npb24gc3RhdGVzKS4KLSAqLwotaW50IFpFWFBPUlQgZGVmbGF0ZUNvcHkgKGRlc3QsIHNvdXJjZSkKLSAgICB6X3N0cmVhbXAgZGVzdDsKLSAgICB6X3N0cmVhbXAgc291cmNlOwotewotI2lmZGVmIE1BWFNFR182NEsKLSAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0jZWxzZQotICAgIGRlZmxhdGVfc3RhdGUgKmRzOwotICAgIGRlZmxhdGVfc3RhdGUgKnNzOwotICAgIHVzaGYgKm92ZXJsYXk7Ci0KLQotICAgIGlmIChzb3VyY2UgPT0gWl9OVUxMIHx8IGRlc3QgPT0gWl9OVUxMIHx8IHNvdXJjZS0+c3RhdGUgPT0gWl9OVUxMKSB7Ci0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICB9Ci0KLSAgICBzcyA9IHNvdXJjZS0+c3RhdGU7Ci0KLSAgICB6bWVtY3B5KCh2b2lkcGYpZGVzdCwgKHZvaWRwZilzb3VyY2UsIHNpemVvZih6X3N0cmVhbSkpOwotCi0gICAgZHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKSBaQUxMT0MoZGVzdCwgMSwgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKLSAgICBpZiAoZHMgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7Ci0gICAgZGVzdC0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKSBkczsKLSAgICB6bWVtY3B5KCh2b2lkcGYpZHMsICh2b2lkcGYpc3MsIHNpemVvZihkZWZsYXRlX3N0YXRlKSk7Ci0gICAgZHMtPnN0cm0gPSBkZXN0OwotCi0gICAgZHMtPndpbmRvdyA9IChCeXRlZiAqKSBaQUxMT0MoZGVzdCwgZHMtPndfc2l6ZSwgMipzaXplb2YoQnl0ZSkpOwotICAgIGRzLT5wcmV2ICAgPSAoUG9zZiAqKSAgWkFMTE9DKGRlc3QsIGRzLT53X3NpemUsIHNpemVvZihQb3MpKTsKLSAgICBkcy0+aGVhZCAgID0gKFBvc2YgKikgIFpBTExPQyhkZXN0LCBkcy0+aGFzaF9zaXplLCBzaXplb2YoUG9zKSk7Ci0gICAgb3ZlcmxheSA9ICh1c2hmICopIFpBTExPQyhkZXN0LCBkcy0+bGl0X2J1ZnNpemUsIHNpemVvZih1c2gpKzIpOwotICAgIGRzLT5wZW5kaW5nX2J1ZiA9ICh1Y2hmICopIG92ZXJsYXk7Ci0KLSAgICBpZiAoZHMtPndpbmRvdyA9PSBaX05VTEwgfHwgZHMtPnByZXYgPT0gWl9OVUxMIHx8IGRzLT5oZWFkID09IFpfTlVMTCB8fAotICAgICAgICBkcy0+cGVuZGluZ19idWYgPT0gWl9OVUxMKSB7Ci0gICAgICAgIGRlZmxhdGVFbmQgKGRlc3QpOwotICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7Ci0gICAgfQotICAgIC8qIGZvbGxvd2luZyB6bWVtY3B5IGRvIG5vdCB3b3JrIGZvciAxNi1iaXQgTVNET1MgKi8KLSAgICB6bWVtY3B5KGRzLT53aW5kb3csIHNzLT53aW5kb3csIGRzLT53X3NpemUgKiAyICogc2l6ZW9mKEJ5dGUpKTsKLSAgICB6bWVtY3B5KCh2b2lkcGYpZHMtPnByZXYsICh2b2lkcGYpc3MtPnByZXYsIGRzLT53X3NpemUgKiBzaXplb2YoUG9zKSk7Ci0gICAgem1lbWNweSgodm9pZHBmKWRzLT5oZWFkLCAodm9pZHBmKXNzLT5oZWFkLCBkcy0+aGFzaF9zaXplICogc2l6ZW9mKFBvcykpOwotICAgIHptZW1jcHkoZHMtPnBlbmRpbmdfYnVmLCBzcy0+cGVuZGluZ19idWYsICh1SW50KWRzLT5wZW5kaW5nX2J1Zl9zaXplKTsKLQotICAgIGRzLT5wZW5kaW5nX291dCA9IGRzLT5wZW5kaW5nX2J1ZiArIChzcy0+cGVuZGluZ19vdXQgLSBzcy0+cGVuZGluZ19idWYpOwotICAgIGRzLT5kX2J1ZiA9IG92ZXJsYXkgKyBkcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7Ci0gICAgZHMtPmxfYnVmID0gZHMtPnBlbmRpbmdfYnVmICsgKDErc2l6ZW9mKHVzaCkpKmRzLT5saXRfYnVmc2l6ZTsKLQotICAgIGRzLT5sX2Rlc2MuZHluX3RyZWUgPSBkcy0+ZHluX2x0cmVlOwotICAgIGRzLT5kX2Rlc2MuZHluX3RyZWUgPSBkcy0+ZHluX2R0cmVlOwotICAgIGRzLT5ibF9kZXNjLmR5bl90cmVlID0gZHMtPmJsX3RyZWU7Ci0KLSAgICByZXR1cm4gWl9PSzsKLSNlbmRpZiAvKiBNQVhTRUdfNjRLICovCi19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMgotICogYW5kIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAgQWxsIGRlZmxhdGUoKSBpbnB1dCBnb2VzIHRocm91Z2gKLSAqIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkCi0gKiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+bmV4dF9pbiBidWZmZXIgYW5kIGNvcHlpbmcgZnJvbSBpdC4KLSAqIChTZWUgYWxzbyBmbHVzaF9wZW5kaW5nKCkpLgotICovCi1sb2NhbCBpbnQgcmVhZF9idWYoc3RybSwgYnVmLCBzaXplKQotICAgIHpfc3RyZWFtcCBzdHJtOwotICAgIEJ5dGVmICpidWY7Ci0gICAgdW5zaWduZWQgc2l6ZTsKLXsKLSAgICB1bnNpZ25lZCBsZW4gPSBzdHJtLT5hdmFpbF9pbjsKLQotICAgIGlmIChsZW4gPiBzaXplKSBsZW4gPSBzaXplOwotICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuIDA7Ci0KLSAgICBzdHJtLT5hdmFpbF9pbiAgLT0gbGVuOwotCi0gICAgem1lbWNweShidWYsIHN0cm0tPm5leHRfaW4sIGxlbik7Ci0gICAgaWYgKHN0cm0tPnN0YXRlLT53cmFwID09IDEpIHsKLSAgICAgICAgc3RybS0+YWRsZXIgPSBhZGxlcjMyKHN0cm0tPmFkbGVyLCBidWYsIGxlbik7Ci0gICAgfQotI2lmZGVmIEdaSVAKLSAgICBlbHNlIGlmIChzdHJtLT5zdGF0ZS0+d3JhcCA9PSAyKSB7Ci0gICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIGJ1ZiwgbGVuKTsKLSAgICB9Ci0jZW5kaWYKLSAgICBzdHJtLT5uZXh0X2luICArPSBsZW47Ci0gICAgc3RybS0+dG90YWxfaW4gKz0gbGVuOwotCi0gICAgcmV0dXJuIChpbnQpbGVuOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEluaXRpYWxpemUgdGhlICJsb25nZXN0IG1hdGNoIiByb3V0aW5lcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0KLSAqLwotbG9jYWwgdm9pZCBsbV9pbml0IChzKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci17Ci0gICAgcy0+d2luZG93X3NpemUgPSAodWxnKTJMKnMtPndfc2l6ZTsKLQotICAgIENMRUFSX0hBU0gocyk7Ci0KLSAgICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOgotICAgICAqLwotICAgIHMtPm1heF9sYXp5X21hdGNoICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5tYXhfbGF6eTsKLSAgICBzLT5nb29kX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZ29vZF9sZW5ndGg7Ci0gICAgcy0+bmljZV9tYXRjaCAgICAgICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLm5pY2VfbGVuZ3RoOwotICAgIHMtPm1heF9jaGFpbl9sZW5ndGggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5tYXhfY2hhaW47Ci0KLSAgICBzLT5zdHJzdGFydCA9IDA7Ci0gICAgcy0+YmxvY2tfc3RhcnQgPSAwTDsKLSAgICBzLT5sb29rYWhlYWQgPSAwOwotICAgIHMtPmluc2VydCA9IDA7Ci0gICAgcy0+bWF0Y2hfbGVuZ3RoID0gcy0+cHJldl9sZW5ndGggPSBNSU5fTUFUQ0gtMTsKLSAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAwOwotICAgIHMtPmluc19oID0gMDsKLSNpZm5kZWYgRkFTVEVTVAotI2lmZGVmIEFTTVYKLSAgICBtYXRjaF9pbml0KCk7IC8qIGluaXRpYWxpemUgdGhlIGFzbSBjb2RlICovCi0jZW5kaWYKLSNlbmRpZgotfQotCi0jaWZuZGVmIEZBU1RFU1QKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogU2V0IG1hdGNoX3N0YXJ0IHRvIHRoZSBsb25nZXN0IG1hdGNoIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBzdHJpbmcgYW5kCi0gKiByZXR1cm4gaXRzIGxlbmd0aC4gTWF0Y2hlcyBzaG9ydGVyIG9yIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFyZSBkaXNjYXJkZWQsCi0gKiBpbiB3aGljaCBjYXNlIHRoZSByZXN1bHQgaXMgZXF1YWwgdG8gcHJldl9sZW5ndGggYW5kIG1hdGNoX3N0YXJ0IGlzCi0gKiBnYXJiYWdlLgotICogSU4gYXNzZXJ0aW9uczogY3VyX21hdGNoIGlzIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluIGZvciB0aGUgY3VycmVudAotICogICBzdHJpbmcgKHN0cnN0YXJ0KSBhbmQgaXRzIGRpc3RhbmNlIGlzIDw9IE1BWF9ESVNULCBhbmQgcHJldl9sZW5ndGggPj0gMQotICogT1VUIGFzc2VydGlvbjogdGhlIG1hdGNoIGxlbmd0aCBpcyBub3QgZ3JlYXRlciB0aGFuIHMtPmxvb2thaGVhZC4KLSAqLwotI2lmbmRlZiBBU01WCi0vKiBGb3IgODB4ODYgYW5kIDY4MHgwLCBhbiBvcHRpbWl6ZWQgdmVyc2lvbiB3aWxsIGJlIHByb3ZpZGVkIGluIG1hdGNoLmFzbSBvcgotICogbWF0Y2guUy4gVGhlIGNvZGUgd2lsbCBiZSBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudC4KLSAqLwotbG9jYWwgdUludCBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIElQb3MgY3VyX21hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLwotewotICAgIHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7LyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovCi0gICAgcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi8KLSAgICByZWdpc3RlciBCeXRlZiAqbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaGVkIHN0cmluZyAqLwotICAgIHJlZ2lzdGVyIGludCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi8KLSAgICBpbnQgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqLwotICAgIGludCBuaWNlX21hdGNoID0gcy0+bmljZV9tYXRjaDsgICAgICAgICAgICAgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqLwotICAgIElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8KLSAgICAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsKLSAgICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLAotICAgICAqIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcgb2Ygd2luZG93IGluZGV4IDAuCi0gICAgICovCi0gICAgUG9zZiAqcHJldiA9IHMtPnByZXY7Ci0gICAgdUludCB3bWFzayA9IHMtPndfbWFzazsKLQotI2lmZGVmIFVOQUxJR05FRF9PSwotICAgIC8qIENvbXBhcmUgdHdvIGJ5dGVzIGF0IGEgdGltZS4gTm90ZTogdGhpcyBpcyBub3QgYWx3YXlzIGJlbmVmaWNpYWwuCi0gICAgICogVHJ5IHdpdGggYW5kIHdpdGhvdXQgLURVTkFMSUdORURfT0sgdG8gY2hlY2suCi0gICAgICovCi0gICAgcmVnaXN0ZXIgQnl0ZWYgKnN0cmVuZCA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0ICsgTUFYX01BVENIIC0gMTsKLSAgICByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsKLSAgICByZWdpc3RlciB1c2ggc2Nhbl9lbmQgICA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7Ci0jZWxzZQotICAgIHJlZ2lzdGVyIEJ5dGVmICpzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSDsKLSAgICByZWdpc3RlciBCeXRlIHNjYW5fZW5kMSAgPSBzY2FuW2Jlc3RfbGVuLTFdOwotICAgIHJlZ2lzdGVyIEJ5dGUgc2Nhbl9lbmQgICA9IHNjYW5bYmVzdF9sZW5dOwotI2VuZGlmCi0KLSAgICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi4KLSAgICAgKiBJdCBpcyBlYXN5IHRvIGdldCByaWQgb2YgdGhpcyBvcHRpbWl6YXRpb24gaWYgbmVjZXNzYXJ5LgotICAgICAqLwotICAgIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCAiQ29kZSB0b28gY2xldmVyIik7Ci0KLSAgICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqLwotICAgIGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7Ci0gICAgICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsKLSAgICB9Ci0gICAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeQotICAgICAqIHRvIG1ha2UgZGVmbGF0ZSBkZXRlcm1pbmlzdGljLgotICAgICAqLwotICAgIGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOwotCi0gICAgQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgIm5lZWQgbG9va2FoZWFkIik7Ci0KLSAgICBkbyB7Ci0gICAgICAgIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgIm5vIGZ1dHVyZSIpOwotICAgICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKLQotICAgICAgICAvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2UKLSAgICAgICAgICogb3IgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBsZXNzIHRoYW4gMi4gIE5vdGUgdGhhdCB0aGUgY2hlY2tzIGJlbG93Ci0gICAgICAgICAqIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgb2NjdXIgb2NjYXNpb25hbGx5IGZvciBwZXJmb3JtYW5jZQotICAgICAgICAgKiByZWFzb25zLiAgVGhlcmVmb3JlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdpbGwgYmUgYWNjZXNzZWQsIGFuZAotICAgICAgICAgKiBjb25kaXRpb25hbCBqdW1wcyB3aWxsIGJlIG1hZGUgdGhhdCBkZXBlbmQgb24gdGhvc2UgdmFsdWVzLgotICAgICAgICAgKiBIb3dldmVyIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIGxpbWl0ZWQgdG8gdGhlIGxvb2thaGVhZCwgc28KLSAgICAgICAgICogdGhlIG91dHB1dCBvZiBkZWZsYXRlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZXMuCi0gICAgICAgICAqLwotI2lmIChkZWZpbmVkKFVOQUxJR05FRF9PSykgJiYgTUFYX01BVENIID09IDI1OCkKLSAgICAgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSA9PSAyLiBEbyBub3QgdXNlCi0gICAgICAgICAqIFVOQUxJR05FRF9PSyBpZiB5b3VyIGNvbXBpbGVyIHVzZXMgYSBkaWZmZXJlbnQgc2l6ZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fAotICAgICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsKLQotICAgICAgICAvKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleSBhcmUKLSAgICAgICAgICogYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0IHRoZSBoYXNoIGtleXMKLSAgICAgICAgICogYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LiBDb21wYXJlIDIgYnl0ZXMgYXQgYSB0aW1lIGF0Ci0gICAgICAgICAqIHN0cnN0YXJ0KzMsICs1LCAuLi4gdXAgdG8gc3Ryc3RhcnQrMjU3LiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50Ci0gICAgICAgICAqIGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDR0aCBjb21wYXJpc29uOyB0aGUgMTI4dGggY2hlY2sgd2lsbCBiZSBtYWRlCi0gICAgICAgICAqIGF0IHN0cnN0YXJ0KzI1Ny4gSWYgTUFYX01BVENILTIgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCwgaXQgaXMKLSAgICAgICAgICogbmVjZXNzYXJ5IHRvIHB1dCBtb3JlIGd1YXJkIGJ5dGVzIGF0IHRoZSBlbmQgb2YgdGhlIHdpbmRvdywgb3IKLSAgICAgICAgICogdG8gY2hlY2sgbW9yZSBvZnRlbiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZC4KLSAgICAgICAgICovCi0gICAgICAgIEFzc2VydChzY2FuWzJdID09IG1hdGNoWzJdLCAic2NhblsyXT8iKTsKLSAgICAgICAgc2NhbisrLCBtYXRjaCsrOwotICAgICAgICBkbyB7Ci0gICAgICAgIH0gd2hpbGUgKCoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgotICAgICAgICAgICAgICAgICAqKHVzaGYqKShzY2FuKz0yKSA9PSAqKHVzaGYqKShtYXRjaCs9MikgJiYKLSAgICAgICAgICAgICAgICAgKih1c2hmKikoc2Nhbis9MikgPT0gKih1c2hmKikobWF0Y2grPTIpICYmCi0gICAgICAgICAgICAgICAgICoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgotICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKLSAgICAgICAgLyogVGhlIGZ1bm55ICJkbyB7fSIgZ2VuZXJhdGVzIGJldHRlciBjb2RlIG9uIG1vc3QgY29tcGlsZXJzICovCi0KLSAgICAgICAgLyogSGVyZSwgc2NhbiA8PSB3aW5kb3crc3Ryc3RhcnQrMjU3ICovCi0gICAgICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7Ci0gICAgICAgIGlmICgqc2NhbiA9PSAqbWF0Y2gpIHNjYW4rKzsKLQotICAgICAgICBsZW4gPSAoTUFYX01BVENIIC0gMSkgLSAoaW50KShzdHJlbmQtc2Nhbik7Ci0gICAgICAgIHNjYW4gPSBzdHJlbmQgLSAoTUFYX01BVENILTEpOwotCi0jZWxzZSAvKiBVTkFMSUdORURfT0sgKi8KLQotICAgICAgICBpZiAobWF0Y2hbYmVzdF9sZW5dICAgIT0gc2Nhbl9lbmQgIHx8Ci0gICAgICAgICAgICBtYXRjaFtiZXN0X2xlbi0xXSAhPSBzY2FuX2VuZDEgfHwKLSAgICAgICAgICAgICptYXRjaCAgICAgICAgICAgICE9ICpzY2FuICAgICB8fAotICAgICAgICAgICAgKisrbWF0Y2ggICAgICAgICAgIT0gc2NhblsxXSkgICAgICBjb250aW51ZTsKLQotICAgICAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZQotICAgICAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKQotICAgICAgICAgKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleQotICAgICAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0Ci0gICAgICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LgotICAgICAgICAgKi8KLSAgICAgICAgc2NhbiArPSAyLCBtYXRjaCsrOwotICAgICAgICBBc3NlcnQoKnNjYW4gPT0gKm1hdGNoLCAibWF0Y2hbMl0/Iik7Ci0KLSAgICAgICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjsKLSAgICAgICAgICogdGhlIDI1NnRoIGNoZWNrIHdpbGwgYmUgbWFkZSBhdCBzdHJzdGFydCsyNTguCi0gICAgICAgICAqLwotICAgICAgICBkbyB7Ci0gICAgICAgIH0gd2hpbGUgKCorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgotICAgICAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKLSAgICAgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCi0gICAgICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgotICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKLQotICAgICAgICBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgIndpbGQgc2NhbiIpOwotCi0gICAgICAgIGxlbiA9IE1BWF9NQVRDSCAtIChpbnQpKHN0cmVuZCAtIHNjYW4pOwotICAgICAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIOwotCi0jZW5kaWYgLyogVU5BTElHTkVEX09LICovCi0KLSAgICAgICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7Ci0gICAgICAgICAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsKLSAgICAgICAgICAgIGJlc3RfbGVuID0gbGVuOwotICAgICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsKLSNpZmRlZiBVTkFMSUdORURfT0sKLSAgICAgICAgICAgIHNjYW5fZW5kID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsKLSNlbHNlCi0gICAgICAgICAgICBzY2FuX2VuZDEgID0gc2NhbltiZXN0X2xlbi0xXTsKLSAgICAgICAgICAgIHNjYW5fZW5kICAgPSBzY2FuW2Jlc3RfbGVuXTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0Ci0gICAgICAgICAgICAgJiYgLS1jaGFpbl9sZW5ndGggIT0gMCk7Ci0KLSAgICBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47Ci0gICAgcmV0dXJuIHMtPmxvb2thaGVhZDsKLX0KLSNlbmRpZiAvKiBBU01WICovCi0KLSNlbHNlIC8qIEZBU1RFU1QgKi8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBPcHRpbWl6ZWQgdmVyc2lvbiBmb3IgRkFTVEVTVCBvbmx5Ci0gKi8KLWxvY2FsIHVJbnQgbG9uZ2VzdF9tYXRjaChzLCBjdXJfbWF0Y2gpCi0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KLXsKLSAgICByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0OyAvKiBjdXJyZW50IHN0cmluZyAqLwotICAgIHJlZ2lzdGVyIEJ5dGVmICptYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovCi0gICAgcmVnaXN0ZXIgaW50IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqLwotICAgIHJlZ2lzdGVyIEJ5dGVmICpzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSDsKLQotICAgIC8qIFRoZSBjb2RlIGlzIG9wdGltaXplZCBmb3IgSEFTSF9CSVRTID49IDggYW5kIE1BWF9NQVRDSC0yIG11bHRpcGxlIG9mIDE2LgotICAgICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuCi0gICAgICovCi0gICAgQXNzZXJ0KHMtPmhhc2hfYml0cyA+PSA4ICYmIE1BWF9NQVRDSCA9PSAyNTgsICJDb2RlIHRvbyBjbGV2ZXIiKTsKLQotICAgIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsICJuZWVkIGxvb2thaGVhZCIpOwotCi0gICAgQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCAibm8gZnV0dXJlIik7Ci0KLSAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKLQotICAgIC8qIFJldHVybiBmYWlsdXJlIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDI6Ci0gICAgICovCi0gICAgaWYgKG1hdGNoWzBdICE9IHNjYW5bMF0gfHwgbWF0Y2hbMV0gIT0gc2NhblsxXSkgcmV0dXJuIE1JTl9NQVRDSC0xOwotCi0gICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGUKLSAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKQotICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5Ci0gICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdAotICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LgotICAgICAqLwotICAgIHNjYW4gKz0gMiwgbWF0Y2ggKz0gMjsKLSAgICBBc3NlcnQoKnNjYW4gPT0gKm1hdGNoLCAibWF0Y2hbMl0/Iik7Ci0KLSAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uOwotICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LgotICAgICAqLwotICAgIGRvIHsKLSAgICB9IHdoaWxlICgqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKLSAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKLSAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKLSAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKLSAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKLQotICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7Ci0KLSAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoaW50KShzdHJlbmQgLSBzY2FuKTsKLQotICAgIGlmIChsZW4gPCBNSU5fTUFUQ0gpIHJldHVybiBNSU5fTUFUQ0ggLSAxOwotCi0gICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7Ci0gICAgcmV0dXJuICh1SW50KWxlbiA8PSBzLT5sb29rYWhlYWQgPyAodUludClsZW4gOiBzLT5sb29rYWhlYWQ7Ci19Ci0KLSNlbmRpZiAvKiBGQVNURVNUICovCi0KLSNpZmRlZiBERUJVRwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDaGVjayB0aGF0IHRoZSBtYXRjaCBhdCBtYXRjaF9zdGFydCBpcyBpbmRlZWQgYSBtYXRjaC4KLSAqLwotbG9jYWwgdm9pZCBjaGVja19tYXRjaChzLCBzdGFydCwgbWF0Y2gsIGxlbmd0aCkKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIElQb3Mgc3RhcnQsIG1hdGNoOwotICAgIGludCBsZW5ndGg7Ci17Ci0gICAgLyogY2hlY2sgdGhhdCB0aGUgbWF0Y2ggaXMgaW5kZWVkIGEgbWF0Y2ggKi8KLSAgICBpZiAoem1lbWNtcChzLT53aW5kb3cgKyBtYXRjaCwKLSAgICAgICAgICAgICAgICBzLT53aW5kb3cgKyBzdGFydCwgbGVuZ3RoKSAhPSBFUVVBTCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiBzdGFydCAldSwgbWF0Y2ggJXUsIGxlbmd0aCAlZFxuIiwKLSAgICAgICAgICAgICAgICBzdGFydCwgbWF0Y2gsIGxlbmd0aCk7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWMlYyIsIHMtPndpbmRvd1ttYXRjaCsrXSwgcy0+d2luZG93W3N0YXJ0KytdKTsKLSAgICAgICAgfSB3aGlsZSAoLS1sZW5ndGggIT0gMCk7Ci0gICAgICAgIHpfZXJyb3IoImludmFsaWQgbWF0Y2giKTsKLSAgICB9Ci0gICAgaWYgKHpfdmVyYm9zZSA+IDEpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIlxcWyVkLCVkXSIsIHN0YXJ0LW1hdGNoLCBsZW5ndGgpOwotICAgICAgICBkbyB7IHB1dGMocy0+d2luZG93W3N0YXJ0KytdLCBzdGRlcnIpOyB9IHdoaWxlICgtLWxlbmd0aCAhPSAwKTsKLSAgICB9Ci19Ci0jZWxzZQotIyAgZGVmaW5lIGNoZWNrX21hdGNoKHMsIHN0YXJ0LCBtYXRjaCwgbGVuZ3RoKQotI2VuZGlmIC8qIERFQlVHICovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC4KLSAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZC4KLSAqCi0gKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQKLSAqIE9VVCBhc3NlcnRpb25zOiBzdHJzdGFydCA8PSB3aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFECi0gKiAgICBBdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBhdmFpbF9pbiA9PSAwOyByZWFkcyBhcmUKLSAqICAgIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlIHppcCB0cmFuc2xhdGVfZW9sCi0gKiAgICBvcHRpb24gLS0gbm90IHN1cHBvcnRlZCBoZXJlKS4KLSAqLwotbG9jYWwgdm9pZCBmaWxsX3dpbmRvdyhzKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci17Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgbiwgbTsKLSAgICByZWdpc3RlciBQb3NmICpwOwotICAgIHVuc2lnbmVkIG1vcmU7ICAgIC8qIEFtb3VudCBvZiBmcmVlIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIHdpbmRvdy4gKi8KLSAgICB1SW50IHdzaXplID0gcy0+d19zaXplOwotCi0gICAgQXNzZXJ0KHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQsICJhbHJlYWR5IGVub3VnaCBsb29rYWhlYWQiKTsKLQotICAgIGRvIHsKLSAgICAgICAgbW9yZSA9ICh1bnNpZ25lZCkocy0+d2luZG93X3NpemUgLSh1bGcpcy0+bG9va2FoZWFkIC0odWxnKXMtPnN0cnN0YXJ0KTsKLQotICAgICAgICAvKiBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OiAqLwotICAgICAgICBpZiAoc2l6ZW9mKGludCkgPD0gMikgewotICAgICAgICAgICAgaWYgKG1vcmUgPT0gMCAmJiBzLT5zdHJzdGFydCA9PSAwICYmIHMtPmxvb2thaGVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbW9yZSA9IHdzaXplOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKG1vcmUgPT0gKHVuc2lnbmVkKSgtMSkpIHsKLSAgICAgICAgICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWYKLSAgICAgICAgICAgICAgICAgKiBzdHJzdGFydCA9PSAwICYmIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIGEgYnl0ZSBhdCB0aW1lKQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIG1vcmUtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsCi0gICAgICAgICAqIG1vdmUgdGhlIHVwcGVyIGhhbGYgdG8gdGhlIGxvd2VyIG9uZSB0byBtYWtlIHJvb20gaW4gdGhlIHVwcGVyIGhhbGYuCi0gICAgICAgICAqLwotICAgICAgICBpZiAocy0+c3Ryc3RhcnQgPj0gd3NpemUrTUFYX0RJU1QocykpIHsKLQotICAgICAgICAgICAgem1lbWNweShzLT53aW5kb3csIHMtPndpbmRvdyt3c2l6ZSwgKHVuc2lnbmVkKXdzaXplKTsKLSAgICAgICAgICAgIHMtPm1hdGNoX3N0YXJ0IC09IHdzaXplOwotICAgICAgICAgICAgcy0+c3Ryc3RhcnQgICAgLT0gd3NpemU7IC8qIHdlIG5vdyBoYXZlIHN0cnN0YXJ0ID49IE1BWF9ESVNUICovCi0gICAgICAgICAgICBzLT5ibG9ja19zdGFydCAtPSAobG9uZykgd3NpemU7Ci0KLSAgICAgICAgICAgIC8qIFNsaWRlIHRoZSBoYXNoIHRhYmxlIChjb3VsZCBiZSBhdm9pZGVkIHdpdGggMzIgYml0IHZhbHVlcwotICAgICAgICAgICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDAKLSAgICAgICAgICAgICAgIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDAKLSAgICAgICAgICAgICAgIGxhdGVyLiAoVXNpbmcgbGV2ZWwgMCBwZXJtYW5lbnRseSBpcyBub3QgYW4gb3B0aW1hbCB1c2FnZSBvZgotICAgICAgICAgICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLikKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbiA9IHMtPmhhc2hfc2l6ZTsKLSAgICAgICAgICAgIHAgPSAmcy0+aGVhZFtuXTsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBtID0gKi0tcDsKLSAgICAgICAgICAgICAgICAqcCA9IChQb3MpKG0gPj0gd3NpemUgPyBtLXdzaXplIDogTklMKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7Ci0KLSAgICAgICAgICAgIG4gPSB3c2l6ZTsKLSNpZm5kZWYgRkFTVEVTVAotICAgICAgICAgICAgcCA9ICZzLT5wcmV2W25dOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIG0gPSAqLS1wOwotICAgICAgICAgICAgICAgICpwID0gKFBvcykobSA+PSB3c2l6ZSA/IG0td3NpemUgOiBOSUwpOwotICAgICAgICAgICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0Ci0gICAgICAgICAgICAgICAgICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7Ci0jZW5kaWYKLSAgICAgICAgICAgIG1vcmUgKz0gd3NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHMtPnN0cm0tPmF2YWlsX2luID09IDApIGJyZWFrOwotCi0gICAgICAgIC8qIElmIHRoZXJlIHdhcyBubyBzbGlkaW5nOgotICAgICAgICAgKiAgICBzdHJzdGFydCA8PSBXU0laRStNQVhfRElTVC0xICYmIGxvb2thaGVhZCA8PSBNSU5fTE9PS0FIRUFEIC0gMSAmJgotICAgICAgICAgKiAgICBtb3JlID09IHdpbmRvd19zaXplIC0gbG9va2FoZWFkIC0gc3Ryc3RhcnQKLSAgICAgICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIChNSU5fTE9PS0FIRUFELTEgKyBXU0laRSArIE1BWF9ESVNULTEpCi0gICAgICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAyKldTSVpFICsgMgotICAgICAgICAgKiBJbiB0aGUgQklHX01FTSBvciBNTUFQIGNhc2UgKG5vdCB5ZXQgc3VwcG9ydGVkKSwKLSAgICAgICAgICogICB3aW5kb3dfc2l6ZSA9PSBpbnB1dF9zaXplICsgTUlOX0xPT0tBSEVBRCAgJiYKLSAgICAgICAgICogICBzdHJzdGFydCArIHMtPmxvb2thaGVhZCA8PSBpbnB1dF9zaXplID0+IG1vcmUgPj0gTUlOX0xPT0tBSEVBRC4KLSAgICAgICAgICogT3RoZXJ3aXNlLCB3aW5kb3dfc2l6ZSA9PSAyKldTSVpFIHNvIG1vcmUgPj0gMi4KLSAgICAgICAgICogSWYgdGhlcmUgd2FzIHNsaWRpbmcsIG1vcmUgPj0gV1NJWkUuIFNvIGluIGFsbCBjYXNlcywgbW9yZSA+PSAyLgotICAgICAgICAgKi8KLSAgICAgICAgQXNzZXJ0KG1vcmUgPj0gMiwgIm1vcmUgPCAyIik7Ci0KLSAgICAgICAgbiA9IHJlYWRfYnVmKHMtPnN0cm0sIHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkLCBtb3JlKTsKLSAgICAgICAgcy0+bG9va2FoZWFkICs9IG47Ci0KLSAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB2YWx1ZSBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgaW5wdXQ6ICovCi0gICAgICAgIGlmIChzLT5sb29rYWhlYWQgKyBzLT5pbnNlcnQgPj0gTUlOX01BVENIKSB7Ci0gICAgICAgICAgICB1SW50IHN0ciA9IHMtPnN0cnN0YXJ0IC0gcy0+aW5zZXJ0OwotICAgICAgICAgICAgcy0+aW5zX2ggPSBzLT53aW5kb3dbc3RyXTsKLSAgICAgICAgICAgIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgMV0pOwotI2lmIE1JTl9NQVRDSCAhPSAzCi0gICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lcwotI2VuZGlmCi0gICAgICAgICAgICB3aGlsZSAocy0+aW5zZXJ0KSB7Ci0gICAgICAgICAgICAgICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOwotI2lmbmRlZiBGQVNURVNUCi0gICAgICAgICAgICAgICAgcy0+cHJldltzdHIgJiBzLT53X21hc2tdID0gcy0+aGVhZFtzLT5pbnNfaF07Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBzLT5oZWFkW3MtPmluc19oXSA9IChQb3Mpc3RyOwotICAgICAgICAgICAgICAgIHN0cisrOwotICAgICAgICAgICAgICAgIHMtPmluc2VydC0tOwotICAgICAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgKyBzLT5pbnNlcnQgPCBNSU5fTUFUQ0gpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIElmIHRoZSB3aG9sZSBpbnB1dCBoYXMgbGVzcyB0aGFuIE1JTl9NQVRDSCBieXRlcywgaW5zX2ggaXMgZ2FyYmFnZSwKLSAgICAgICAgICogYnV0IHRoaXMgaXMgbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLgotICAgICAgICAgKi8KLQotICAgIH0gd2hpbGUgKHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgcy0+c3RybS0+YXZhaWxfaW4gIT0gMCk7Ci0KLSAgICAvKiBJZiB0aGUgV0lOX0lOSVQgYnl0ZXMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBkYXRhIGhhdmUgbmV2ZXIgYmVlbgotICAgICAqIHdyaXR0ZW4sIHRoZW4gemVybyB0aG9zZSBieXRlcyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgcmVwb3J0cyBvZgotICAgICAqIHRoZSB1c2Ugb2YgdW5pbml0aWFsaXplZCAob3IgdW5pbml0aWFsaXNlZCBhcyBKdWxpYW4gd3JpdGVzKSBieXRlcyBieQotICAgICAqIHRoZSBsb25nZXN0IG1hdGNoIHJvdXRpbmVzLiAgVXBkYXRlIHRoZSBoaWdoIHdhdGVyIG1hcmsgZm9yIHRoZSBuZXh0Ci0gICAgICogdGltZSB0aHJvdWdoIGhlcmUuICBXSU5fSU5JVCBpcyBzZXQgdG8gTUFYX01BVENIIHNpbmNlIHRoZSBsb25nZXN0IG1hdGNoCi0gICAgICogcm91dGluZXMgYWxsb3cgc2Nhbm5pbmcgdG8gc3Ryc3RhcnQgKyBNQVhfTUFUQ0gsIGlnbm9yaW5nIGxvb2thaGVhZC4KLSAgICAgKi8KLSAgICBpZiAocy0+aGlnaF93YXRlciA8IHMtPndpbmRvd19zaXplKSB7Ci0gICAgICAgIHVsZyBjdXJyID0gcy0+c3Ryc3RhcnQgKyAodWxnKShzLT5sb29rYWhlYWQpOwotICAgICAgICB1bGcgaW5pdDsKLQotICAgICAgICBpZiAocy0+aGlnaF93YXRlciA8IGN1cnIpIHsKLSAgICAgICAgICAgIC8qIFByZXZpb3VzIGhpZ2ggd2F0ZXIgbWFyayBiZWxvdyBjdXJyZW50IGRhdGEgLS0gemVybyBXSU5fSU5JVAotICAgICAgICAgICAgICogYnl0ZXMgb3IgdXAgdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGluaXQgPSBzLT53aW5kb3dfc2l6ZSAtIGN1cnI7Ci0gICAgICAgICAgICBpZiAoaW5pdCA+IFdJTl9JTklUKQotICAgICAgICAgICAgICAgIGluaXQgPSBXSU5fSU5JVDsKLSAgICAgICAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIGN1cnIsICh1bnNpZ25lZClpbml0KTsKLSAgICAgICAgICAgIHMtPmhpZ2hfd2F0ZXIgPSBjdXJyICsgaW5pdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzLT5oaWdoX3dhdGVyIDwgKHVsZyljdXJyICsgV0lOX0lOSVQpIHsKLSAgICAgICAgICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBhdCBvciBhYm92ZSBjdXJyZW50IGRhdGEsIGJ1dCBiZWxvdyBjdXJyZW50IGRhdGEKLSAgICAgICAgICAgICAqIHBsdXMgV0lOX0lOSVQgLS0gemVybyBvdXQgdG8gY3VycmVudCBkYXRhIHBsdXMgV0lOX0lOSVQsIG9yIHVwCi0gICAgICAgICAgICAgKiB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaW5pdCA9ICh1bGcpY3VyciArIFdJTl9JTklUIC0gcy0+aGlnaF93YXRlcjsKLSAgICAgICAgICAgIGlmIChpbml0ID4gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyKQotICAgICAgICAgICAgICAgIGluaXQgPSBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXI7Ci0gICAgICAgICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBzLT5oaWdoX3dhdGVyLCAodW5zaWduZWQpaW5pdCk7Ci0gICAgICAgICAgICBzLT5oaWdoX3dhdGVyICs9IGluaXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQsCi0gICAgICAgICAgICJub3QgZW5vdWdoIHJvb20gZm9yIHNlYXJjaCIpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEZsdXNoIHRoZSBjdXJyZW50IGJsb2NrLCB3aXRoIGdpdmVuIGVuZC1vZi1maWxlIGZsYWcuCi0gKiBJTiBhc3NlcnRpb246IHN0cnN0YXJ0IGlzIHNldCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IG1hdGNoLgotICovCi0jZGVmaW5lIEZMVVNIX0JMT0NLX09OTFkocywgbGFzdCkgeyBcCi0gICBfdHJfZmx1c2hfYmxvY2socywgKHMtPmJsb2NrX3N0YXJ0ID49IDBMID8gXAotICAgICAgICAgICAgICAgICAgIChjaGFyZiAqKSZzLT53aW5kb3dbKHVuc2lnbmVkKXMtPmJsb2NrX3N0YXJ0XSA6IFwKLSAgICAgICAgICAgICAgICAgICAoY2hhcmYgKilaX05VTEwpLCBcCi0gICAgICAgICAgICAgICAgKHVsZykoKGxvbmcpcy0+c3Ryc3RhcnQgLSBzLT5ibG9ja19zdGFydCksIFwKLSAgICAgICAgICAgICAgICAobGFzdCkpOyBcCi0gICBzLT5ibG9ja19zdGFydCA9IHMtPnN0cnN0YXJ0OyBcCi0gICBmbHVzaF9wZW5kaW5nKHMtPnN0cm0pOyBcCi0gICBUcmFjZXYoKHN0ZGVyciwiW0ZMVVNIXSIpKTsgXAotfQotCi0vKiBTYW1lIGJ1dCBmb3JjZSBwcmVtYXR1cmUgZXhpdCBpZiBuZWNlc3NhcnkuICovCi0jZGVmaW5lIEZMVVNIX0JMT0NLKHMsIGxhc3QpIHsgXAotICAgRkxVU0hfQkxPQ0tfT05MWShzLCBsYXN0KTsgXAotICAgaWYgKHMtPnN0cm0tPmF2YWlsX291dCA9PSAwKSByZXR1cm4gKGxhc3QpID8gZmluaXNoX3N0YXJ0ZWQgOiBuZWVkX21vcmU7IFwKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5IHdpdGhvdXQgY29tcHJlc3Npb24gYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVybgotICogdGhlIGN1cnJlbnQgYmxvY2sgc3RhdGUuCi0gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBzaW5jZQotICogdW5jb21wcmVzc2libGUgZGF0YSBpcyBwcm9iYWJseSBub3QgdXNlZnVsLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQKLSAqIG9ubHkgZm9yIHRoZSBsZXZlbD0wIGNvbXByZXNzaW9uIG9wdGlvbi4KLSAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9wdGltaXplZCB0byBhdm9pZCBleHRyYSBjb3B5aW5nIGZyb20KLSAqIHdpbmRvdyB0byBwZW5kaW5nX2J1Zi4KLSAqLwotbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zdG9yZWQocywgZmx1c2gpCi0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICBpbnQgZmx1c2g7Ci17Ci0gICAgLyogU3RvcmVkIGJsb2NrcyBhcmUgbGltaXRlZCB0byAweGZmZmYgYnl0ZXMsIHBlbmRpbmdfYnVmIGlzIGxpbWl0ZWQKLSAgICAgKiB0byBwZW5kaW5nX2J1Zl9zaXplLCBhbmQgZWFjaCBzdG9yZWQgYmxvY2sgaGFzIGEgNSBieXRlIGhlYWRlcjoKLSAgICAgKi8KLSAgICB1bGcgbWF4X2Jsb2NrX3NpemUgPSAweGZmZmY7Ci0gICAgdWxnIG1heF9zdGFydDsKLQotICAgIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHMtPnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7Ci0gICAgICAgIG1heF9ibG9ja19zaXplID0gcy0+cGVuZGluZ19idWZfc2l6ZSAtIDU7Ci0gICAgfQotCi0gICAgLyogQ29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0OiAqLwotICAgIGZvciAoOzspIHsKLSAgICAgICAgLyogRmlsbCB0aGUgd2luZG93IGFzIG11Y2ggYXMgcG9zc2libGU6ICovCi0gICAgICAgIGlmIChzLT5sb29rYWhlYWQgPD0gMSkgewotCi0gICAgICAgICAgICBBc3NlcnQocy0+c3Ryc3RhcnQgPCBzLT53X3NpemUrTUFYX0RJU1QocykgfHwKLSAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19zdGFydCA+PSAobG9uZylzLT53X3NpemUsICJzbGlkZSB0b28gbGF0ZSIpOwotCi0gICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKLSAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSByZXR1cm4gbmVlZF9tb3JlOwotCi0gICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLwotICAgICAgICB9Ci0gICAgICAgIEFzc2VydChzLT5ibG9ja19zdGFydCA+PSAwTCwgImJsb2NrIGdvbmUiKTsKLQotICAgICAgICBzLT5zdHJzdGFydCArPSBzLT5sb29rYWhlYWQ7Ci0gICAgICAgIHMtPmxvb2thaGVhZCA9IDA7Ci0KLSAgICAgICAgLyogRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nX2J1ZiB3aWxsIGJlIGZ1bGw6ICovCi0gICAgICAgIG1heF9zdGFydCA9IHMtPmJsb2NrX3N0YXJ0ICsgbWF4X2Jsb2NrX3NpemU7Ci0gICAgICAgIGlmIChzLT5zdHJzdGFydCA9PSAwIHx8ICh1bGcpcy0+c3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7Ci0gICAgICAgICAgICAvKiBzdHJzdGFydCA9PSAwIGlzIHBvc3NpYmxlIHdoZW4gd3JhcGFyb3VuZCBvbiAxNi1iaXQgbWFjaGluZSAqLwotICAgICAgICAgICAgcy0+bG9va2FoZWFkID0gKHVJbnQpKHMtPnN0cnN0YXJ0IC0gbWF4X3N0YXJ0KTsKLSAgICAgICAgICAgIHMtPnN0cnN0YXJ0ID0gKHVJbnQpbWF4X3N0YXJ0OwotICAgICAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRmx1c2ggaWYgd2UgbWF5IGhhdmUgdG8gc2xpZGUsIG90aGVyd2lzZSBibG9ja19zdGFydCBtYXkgYmVjb21lCi0gICAgICAgICAqIG5lZ2F0aXZlIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGdvbmU6Ci0gICAgICAgICAqLwotICAgICAgICBpZiAocy0+c3Ryc3RhcnQgLSAodUludClzLT5ibG9ja19zdGFydCA+PSBNQVhfRElTVChzKSkgewotICAgICAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcy0+aW5zZXJ0ID0gMDsKLSAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0gpIHsKLSAgICAgICAgRkxVU0hfQkxPQ0socywgMSk7Ci0gICAgICAgIHJldHVybiBmaW5pc2hfZG9uZTsKLSAgICB9Ci0gICAgaWYgKChsb25nKXMtPnN0cnN0YXJ0ID4gcy0+YmxvY2tfc3RhcnQpCi0gICAgICAgIEZMVVNIX0JMT0NLKHMsIDApOwotICAgIHJldHVybiBibG9ja19kb25lOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvbXByZXNzIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4gdGhlIGN1cnJlbnQKLSAqIGJsb2NrIHN0YXRlLgotICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGFuZCBpbnNlcnRzCi0gKiBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBvbmx5IGZvciB1bm1hdGNoZWQgc3RyaW5ncyBvciBmb3Igc2hvcnQKLSAqIG1hdGNoZXMuIEl0IGlzIHVzZWQgb25seSBmb3IgdGhlIGZhc3QgY29tcHJlc3Npb24gb3B0aW9ucy4KLSAqLwotbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9mYXN0KHMsIGZsdXNoKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgaW50IGZsdXNoOwotewotICAgIElQb3MgaGFzaF9oZWFkOyAgICAgICAvKiBoZWFkIG9mIHRoZSBoYXNoIGNoYWluICovCi0gICAgaW50IGJmbHVzaDsgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLwotCi0gICAgZm9yICg7OykgewotICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHQKLSAgICAgICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXMKLSAgICAgICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlCi0gICAgICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guCi0gICAgICAgICAqLwotICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkgewotICAgICAgICAgICAgZmlsbF93aW5kb3cocyk7Ci0gICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5lZWRfbW9yZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCi0gICAgICAgIH0KLQotICAgICAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlCi0gICAgICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOgotICAgICAgICAgKi8KLSAgICAgICAgaGFzaF9oZWFkID0gTklMOwotICAgICAgICBpZiAocy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCkgewotICAgICAgICAgICAgSU5TRVJUX1NUUklORyhzLCBzLT5zdHJzdGFydCwgaGFzaF9oZWFkKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguCi0gICAgICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbHdheXMgbWF0Y2hfbGVuZ3RoIDwgTUlOX01BVENICi0gICAgICAgICAqLwotICAgICAgICBpZiAoaGFzaF9oZWFkICE9IE5JTCAmJiBzLT5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSBNQVhfRElTVChzKSkgewotICAgICAgICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcKLSAgICAgICAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaAotICAgICAgICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoIChzLCBoYXNoX2hlYWQpOwotICAgICAgICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi8KLSAgICAgICAgfQotICAgICAgICBpZiAocy0+bWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkgewotICAgICAgICAgICAgY2hlY2tfbWF0Y2gocywgcy0+c3Ryc3RhcnQsIHMtPm1hdGNoX3N0YXJ0LCBzLT5tYXRjaF9sZW5ndGgpOwotCi0gICAgICAgICAgICBfdHJfdGFsbHlfZGlzdChzLCBzLT5zdHJzdGFydCAtIHMtPm1hdGNoX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOwotCi0gICAgICAgICAgICBzLT5sb29rYWhlYWQgLT0gcy0+bWF0Y2hfbGVuZ3RoOwotCi0gICAgICAgICAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoCi0gICAgICAgICAgICAgKiBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLgotICAgICAgICAgICAgICovCi0jaWZuZGVmIEZBU1RFU1QKLSAgICAgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPD0gcy0+bWF4X2luc2VydF9sZW5ndGggJiYKLSAgICAgICAgICAgICAgICBzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7Ci0gICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoLS07IC8qIHN0cmluZyBhdCBzdHJzdGFydCBhbHJlYWR5IGluIHRhYmxlICovCi0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCsrOwotICAgICAgICAgICAgICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIHMtPnN0cnN0YXJ0LCBoYXNoX2hlYWQpOwotICAgICAgICAgICAgICAgICAgICAvKiBzdHJzdGFydCBuZXZlciBleGNlZWRzIFdTSVpFLU1BWF9NQVRDSCwgc28gdGhlcmUgYXJlCi0gICAgICAgICAgICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tcy0+bWF0Y2hfbGVuZ3RoICE9IDApOwotICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7Ci0gICAgICAgICAgICB9IGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0ICs9IHMtPm1hdGNoX2xlbmd0aDsKLSAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIHMtPmluc19oID0gcy0+d2luZG93W3MtPnN0cnN0YXJ0XTsKLSAgICAgICAgICAgICAgICBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3MtPnN0cnN0YXJ0KzFdKTsKLSNpZiBNSU5fTUFUQ0ggIT0gMwotICAgICAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAvKiBJZiBsb29rYWhlYWQgPCBNSU5fTUFUQ0gsIGluc19oIGlzIGdhcmJhZ2UsIGJ1dCBpdCBkb2VzIG5vdAotICAgICAgICAgICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovCi0gICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpOwotICAgICAgICAgICAgX3RyX3RhbGx5X2xpdCAocywgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSwgYmZsdXNoKTsKLSAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOwotICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmZsdXNoKSBGTFVTSF9CTE9DSyhzLCAwKTsKLSAgICB9Ci0gICAgcy0+aW5zZXJ0ID0gcy0+c3Ryc3RhcnQgPCBNSU5fTUFUQ0gtMSA/IHMtPnN0cnN0YXJ0IDogTUlOX01BVENILTE7Ci0gICAgaWYgKGZsdXNoID09IFpfRklOSVNIKSB7Ci0gICAgICAgIEZMVVNIX0JMT0NLKHMsIDEpOwotICAgICAgICByZXR1cm4gZmluaXNoX2RvbmU7Ci0gICAgfQotICAgIGlmIChzLT5sYXN0X2xpdCkKLSAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7Ci0gICAgcmV0dXJuIGJsb2NrX2RvbmU7Ci19Ci0KLSNpZm5kZWYgRkFTVEVTVAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBTYW1lIGFzIGFib3ZlLCBidXQgYWNoaWV2ZXMgYmV0dGVyIGNvbXByZXNzaW9uLiBXZSB1c2UgYSBsYXp5Ci0gKiBldmFsdWF0aW9uIGZvciBtYXRjaGVzOiBhIG1hdGNoIGlzIGZpbmFsbHkgYWRvcHRlZCBvbmx5IGlmIHRoZXJlIGlzCi0gKiBubyBiZXR0ZXIgbWF0Y2ggYXQgdGhlIG5leHQgd2luZG93IHBvc2l0aW9uLgotICovCi1sb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX3Nsb3cocywgZmx1c2gpCi0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICBpbnQgZmx1c2g7Ci17Ci0gICAgSVBvcyBoYXNoX2hlYWQ7ICAgICAgICAgIC8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqLwotICAgIGludCBiZmx1c2g7ICAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi8KLQotICAgIC8qIFByb2Nlc3MgdGhlIGlucHV0IGJsb2NrLiAqLwotICAgIGZvciAoOzspIHsKLSAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0Ci0gICAgICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzCi0gICAgICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZQotICAgICAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHsKLSAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOwotICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT0gWl9OT19GTFVTSCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZWVkX21vcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZQotICAgICAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjoKLSAgICAgICAgICovCi0gICAgICAgIGhhc2hfaGVhZCA9IE5JTDsKLSAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKLSAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLgotICAgICAgICAgKi8KLSAgICAgICAgcy0+cHJldl9sZW5ndGggPSBzLT5tYXRjaF9sZW5ndGgsIHMtPnByZXZfbWF0Y2ggPSBzLT5tYXRjaF9zdGFydDsKLSAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gTUlOX01BVENILTE7Ci0KLSAgICAgICAgaWYgKGhhc2hfaGVhZCAhPSBOSUwgJiYgcy0+cHJldl9sZW5ndGggPCBzLT5tYXhfbGF6eV9tYXRjaCAmJgotICAgICAgICAgICAgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gTUFYX0RJU1QocykpIHsKLSAgICAgICAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nCi0gICAgICAgICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2gKLSAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaCAocywgaGFzaF9oZWFkKTsKLSAgICAgICAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovCi0KLSAgICAgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPD0gNSAmJiAocy0+c3RyYXRlZ3kgPT0gWl9GSUxURVJFRAotI2lmIFRPT19GQVIgPD0gMzI3NjcKLSAgICAgICAgICAgICAgICB8fCAocy0+bWF0Y2hfbGVuZ3RoID09IE1JTl9NQVRDSCAmJgotICAgICAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCAtIHMtPm1hdGNoX3N0YXJ0ID4gVE9PX0ZBUikKLSNlbmRpZgotICAgICAgICAgICAgICAgICkpIHsKLQotICAgICAgICAgICAgICAgIC8qIElmIHByZXZfbWF0Y2ggaXMgYWxzbyBNSU5fTUFUQ0gsIG1hdGNoX3N0YXJ0IGlzIGdhcmJhZ2UKLSAgICAgICAgICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudAotICAgICAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHMtPnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLT5tYXRjaF9sZW5ndGggPD0gcy0+cHJldl9sZW5ndGgpIHsKLSAgICAgICAgICAgIHVJbnQgbWF4X2luc2VydCA9IHMtPnN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIC0gTUlOX01BVENIOwotICAgICAgICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovCi0KLSAgICAgICAgICAgIGNoZWNrX21hdGNoKHMsIHMtPnN0cnN0YXJ0LTEsIHMtPnByZXZfbWF0Y2gsIHMtPnByZXZfbGVuZ3RoKTsKLQotICAgICAgICAgICAgX3RyX3RhbGx5X2Rpc3Qocywgcy0+c3Ryc3RhcnQgLTEgLSBzLT5wcmV2X21hdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7Ci0KLSAgICAgICAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLgotICAgICAgICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdAotICAgICAgICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpbgotICAgICAgICAgICAgICogdGhlIGhhc2ggdGFibGUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHMtPmxvb2thaGVhZCAtPSBzLT5wcmV2X2xlbmd0aC0xOwotICAgICAgICAgICAgcy0+cHJldl9sZW5ndGggLT0gMjsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpZiAoKytzLT5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAoLS1zLT5wcmV2X2xlbmd0aCAhPSAwKTsKLSAgICAgICAgICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDA7Ci0gICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0gtMTsKLSAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7Ci0KLSAgICAgICAgICAgIGlmIChiZmx1c2gpIEZMVVNIX0JMT0NLKHMsIDApOwotCi0gICAgICAgIH0gZWxzZSBpZiAocy0+bWF0Y2hfYXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYQotICAgICAgICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaAotICAgICAgICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpOwotICAgICAgICAgICAgX3RyX3RhbGx5X2xpdChzLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0sIGJmbHVzaCk7Ci0gICAgICAgICAgICBpZiAoYmZsdXNoKSB7Ci0gICAgICAgICAgICAgICAgRkxVU0hfQkxPQ0tfT05MWShzLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7Ci0gICAgICAgICAgICBzLT5sb29rYWhlYWQtLTsKLSAgICAgICAgICAgIGlmIChzLT5zdHJtLT5hdmFpbF9vdXQgPT0gMCkgcmV0dXJuIG5lZWRfbW9yZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIFRoZXJlIGlzIG5vIHByZXZpb3VzIG1hdGNoIHRvIGNvbXBhcmUgd2l0aCwgd2FpdCBmb3IKLSAgICAgICAgICAgICAqIHRoZSBuZXh0IHN0ZXAgdG8gZGVjaWRlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAxOwotICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKLSAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOwotICAgICAgICB9Ci0gICAgfQotICAgIEFzc2VydCAoZmx1c2ggIT0gWl9OT19GTFVTSCwgIm5vIGZsdXNoPyIpOwotICAgIGlmIChzLT5tYXRjaF9hdmFpbGFibGUpIHsKLSAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpOwotICAgICAgICBfdHJfdGFsbHlfbGl0KHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSwgYmZsdXNoKTsKLSAgICAgICAgcy0+bWF0Y2hfYXZhaWxhYmxlID0gMDsKLSAgICB9Ci0gICAgcy0+aW5zZXJ0ID0gcy0+c3Ryc3RhcnQgPCBNSU5fTUFUQ0gtMSA/IHMtPnN0cnN0YXJ0IDogTUlOX01BVENILTE7Ci0gICAgaWYgKGZsdXNoID09IFpfRklOSVNIKSB7Ci0gICAgICAgIEZMVVNIX0JMT0NLKHMsIDEpOwotICAgICAgICByZXR1cm4gZmluaXNoX2RvbmU7Ci0gICAgfQotICAgIGlmIChzLT5sYXN0X2xpdCkKLSAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7Ci0gICAgcmV0dXJuIGJsb2NrX2RvbmU7Ci19Ci0jZW5kaWYgLyogRkFTVEVTVCAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEZvciBaX1JMRSwgc2ltcGx5IGxvb2sgZm9yIHJ1bnMgb2YgYnl0ZXMsIGdlbmVyYXRlIG1hdGNoZXMgb25seSBvZiBkaXN0YW5jZQotICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mCi0gKiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBaX1JMRS4pCi0gKi8KLWxvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfcmxlKHMsIGZsdXNoKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgaW50IGZsdXNoOwotewotICAgIGludCBiZmx1c2g7ICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLwotICAgIHVJbnQgcHJldjsgICAgICAgICAgICAgIC8qIGJ5dGUgYXQgZGlzdGFuY2Ugb25lIHRvIG1hdGNoICovCi0gICAgQnl0ZWYgKnNjYW4sICpzdHJlbmQ7ICAgLyogc2NhbiBnb2VzIHVwIHRvIHN0cmVuZCBmb3IgbGVuZ3RoIG9mIHJ1biAqLwotCi0gICAgZm9yICg7OykgewotICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHQKLSAgICAgICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXMKLSAgICAgICAgICogZm9yIHRoZSBsb25nZXN0IHJ1biwgcGx1cyBvbmUgZm9yIHRoZSB1bnJvbGxlZCBsb29wLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8PSBNQVhfTUFUQ0gpIHsKLSAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOwotICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8PSBNQVhfTUFUQ0ggJiYgZmx1c2ggPT0gWl9OT19GTFVTSCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZWVkX21vcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyogU2VlIGhvdyBtYW55IHRpbWVzIHRoZSBwcmV2aW91cyBieXRlIHJlcGVhdHMgKi8KLSAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gMDsKLSAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0ggJiYgcy0+c3Ryc3RhcnQgPiAwKSB7Ci0gICAgICAgICAgICBzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgLSAxOwotICAgICAgICAgICAgcHJldiA9ICpzY2FuOwotICAgICAgICAgICAgaWYgKHByZXYgPT0gKisrc2NhbiAmJiBwcmV2ID09ICorK3NjYW4gJiYgcHJldiA9PSAqKytzY2FuKSB7Ci0gICAgICAgICAgICAgICAgc3RyZW5kID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgKyBNQVhfTUFUQ0g7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIH0gd2hpbGUgKHByZXYgPT0gKisrc2NhbiAmJiBwcmV2ID09ICorK3NjYW4gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID09ICorK3NjYW4gJiYgcHJldiA9PSAqKytzY2FuICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9PSAqKytzY2FuICYmIHByZXYgPT0gKisrc2NhbiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPT0gKisrc2NhbiAmJiBwcmV2ID09ICorK3NjYW4gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKLSAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBNQVhfTUFUQ0ggLSAoaW50KShzdHJlbmQgLSBzY2FuKTsKLSAgICAgICAgICAgICAgICBpZiAocy0+bWF0Y2hfbGVuZ3RoID4gcy0+bG9va2FoZWFkKQotICAgICAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBzLT5sb29rYWhlYWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVJbnQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBFbWl0IG1hdGNoIGlmIGhhdmUgcnVuIG9mIE1JTl9NQVRDSCBvciBsb25nZXIsIGVsc2UgZW1pdCBsaXRlcmFsICovCi0gICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7Ci0gICAgICAgICAgICBjaGVja19tYXRjaChzLCBzLT5zdHJzdGFydCwgcy0+c3Ryc3RhcnQgLSAxLCBzLT5tYXRjaF9sZW5ndGgpOwotCi0gICAgICAgICAgICBfdHJfdGFsbHlfZGlzdChzLCAxLCBzLT5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7Ci0KLSAgICAgICAgICAgIHMtPmxvb2thaGVhZCAtPSBzLT5tYXRjaF9sZW5ndGg7Ci0gICAgICAgICAgICBzLT5zdHJzdGFydCArPSBzLT5tYXRjaF9sZW5ndGg7Ci0gICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqLwotICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTsKLSAgICAgICAgICAgIF90cl90YWxseV9saXQgKHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0sIGJmbHVzaCk7Ci0gICAgICAgICAgICBzLT5sb29rYWhlYWQtLTsKLSAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJmbHVzaCkgRkxVU0hfQkxPQ0socywgMCk7Ci0gICAgfQotICAgIHMtPmluc2VydCA9IDA7Ci0gICAgaWYgKGZsdXNoID09IFpfRklOSVNIKSB7Ci0gICAgICAgIEZMVVNIX0JMT0NLKHMsIDEpOwotICAgICAgICByZXR1cm4gZmluaXNoX2RvbmU7Ci0gICAgfQotICAgIGlmIChzLT5sYXN0X2xpdCkKLSAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7Ci0gICAgcmV0dXJuIGJsb2NrX2RvbmU7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogRm9yIFpfSFVGRk1BTl9PTkxZLCBkbyBub3QgbG9vayBmb3IgbWF0Y2hlcy4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuCi0gKiAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBIdWZmbWFuLikKLSAqLwotbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9odWZmKHMsIGZsdXNoKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgaW50IGZsdXNoOwotewotICAgIGludCBiZmx1c2g7ICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLwotCi0gICAgZm9yICg7OykgewotICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgbGl0ZXJhbCB0byB3cml0ZS4gKi8KLSAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSB7Ci0gICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKLSAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX05PX0ZMVVNIKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmVlZF9tb3JlOwotICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgIC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBPdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi8KLSAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gMDsKLSAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTsKLSAgICAgICAgX3RyX3RhbGx5X2xpdCAocywgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSwgYmZsdXNoKTsKLSAgICAgICAgcy0+bG9va2FoZWFkLS07Ci0gICAgICAgIHMtPnN0cnN0YXJ0Kys7Ci0gICAgICAgIGlmIChiZmx1c2gpIEZMVVNIX0JMT0NLKHMsIDApOwotICAgIH0KLSAgICBzLT5pbnNlcnQgPSAwOwotICAgIGlmIChmbHVzaCA9PSBaX0ZJTklTSCkgewotICAgICAgICBGTFVTSF9CTE9DSyhzLCAxKTsKLSAgICAgICAgcmV0dXJuIGZpbmlzaF9kb25lOwotICAgIH0KLSAgICBpZiAocy0+bGFzdF9saXQpCi0gICAgICAgIEZMVVNIX0JMT0NLKHMsIDApOwotICAgIHJldHVybiBibG9ja19kb25lOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvZGVmbGF0ZS5oIGIvc3JjL3psaWIvZGVmbGF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmFjNDRkLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2RlZmxhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKiBkZWZsYXRlLmggLS0gaW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEyIEplYW4tbG91cCBHYWlsbHkKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcwotICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCi0gICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCi0gKi8KLQotLyogQCgjKSAkSWQkICovCi0KLSNpZm5kZWYgREVGTEFURV9ICi0jZGVmaW5lIERFRkxBVEVfSAotCi0jaW5jbHVkZSAienV0aWwuaCIKLQotLyogZGVmaW5lIE5PX0daSVAgd2hlbiBjb21waWxpbmcgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBnemlwIGhlYWRlciBhbmQKLSAgIHRyYWlsZXIgY3JlYXRpb24gYnkgZGVmbGF0ZSgpLiAgTk9fR1pJUCB3b3VsZCBiZSB1c2VkIHRvIGF2b2lkIGxpbmtpbmcgaW4KLSAgIHRoZSBjcmMgY29kZSB3aGVuIGl0IGlzIG5vdCBuZWVkZWQuICBGb3Igc2hhcmVkIGxpYnJhcmllcywgZ3ppcCBlbmNvZGluZwotICAgc2hvdWxkIGJlIGxlZnQgZW5hYmxlZC4gKi8KLSNpZm5kZWYgTk9fR1pJUAotIyAgZGVmaW5lIEdaSVAKLSNlbmRpZgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLgotICovCi0KLSNkZWZpbmUgTEVOR1RIX0NPREVTIDI5Ci0vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi8KLQotI2RlZmluZSBMSVRFUkFMUyAgMjU2Ci0vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi8KLQotI2RlZmluZSBMX0NPREVTIChMSVRFUkFMUysxK0xFTkdUSF9DT0RFUykKLS8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqLwotCi0jZGVmaW5lIERfQ09ERVMgICAzMAotLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCi0KLSNkZWZpbmUgQkxfQ09ERVMgIDE5Ci0vKiBudW1iZXIgb2YgY29kZXMgdXNlZCB0byB0cmFuc2ZlciB0aGUgYml0IGxlbmd0aHMgKi8KLQotI2RlZmluZSBIRUFQX1NJWkUgKDIqTF9DT0RFUysxKQotLyogbWF4aW11bSBoZWFwIHNpemUgKi8KLQotI2RlZmluZSBNQVhfQklUUyAxNQotLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovCi0KLSNkZWZpbmUgQnVmX3NpemUgMTYKLS8qIHNpemUgb2YgYml0IGJ1ZmZlciBpbiBiaV9idWYgKi8KLQotI2RlZmluZSBJTklUX1NUQVRFICAgIDQyCi0jZGVmaW5lIEVYVFJBX1NUQVRFICAgNjkKLSNkZWZpbmUgTkFNRV9TVEFURSAgICA3MwotI2RlZmluZSBDT01NRU5UX1NUQVRFIDkxCi0jZGVmaW5lIEhDUkNfU1RBVEUgICAxMDMKLSNkZWZpbmUgQlVTWV9TVEFURSAgIDExMwotI2RlZmluZSBGSU5JU0hfU1RBVEUgNjY2Ci0vKiBTdHJlYW0gc3RhdHVzICovCi0KLQotLyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNpbmdsZSB2YWx1ZSBhbmQgaXRzIGNvZGUgc3RyaW5nLiAqLwotdHlwZWRlZiBzdHJ1Y3QgY3RfZGF0YV9zIHsKLSAgICB1bmlvbiB7Ci0gICAgICAgIHVzaCAgZnJlcTsgICAgICAgLyogZnJlcXVlbmN5IGNvdW50ICovCi0gICAgICAgIHVzaCAgY29kZTsgICAgICAgLyogYml0IHN0cmluZyAqLwotICAgIH0gZmM7Ci0gICAgdW5pb24gewotICAgICAgICB1c2ggIGRhZDsgICAgICAgIC8qIGZhdGhlciBub2RlIGluIEh1ZmZtYW4gdHJlZSAqLwotICAgICAgICB1c2ggIGxlbjsgICAgICAgIC8qIGxlbmd0aCBvZiBiaXQgc3RyaW5nICovCi0gICAgfSBkbDsKLX0gRkFSIGN0X2RhdGE7Ci0KLSNkZWZpbmUgRnJlcSBmYy5mcmVxCi0jZGVmaW5lIENvZGUgZmMuY29kZQotI2RlZmluZSBEYWQgIGRsLmRhZAotI2RlZmluZSBMZW4gIGRsLmxlbgotCi10eXBlZGVmIHN0cnVjdCBzdGF0aWNfdHJlZV9kZXNjX3MgIHN0YXRpY190cmVlX2Rlc2M7Ci0KLXR5cGVkZWYgc3RydWN0IHRyZWVfZGVzY19zIHsKLSAgICBjdF9kYXRhICpkeW5fdHJlZTsgICAgICAgICAgIC8qIHRoZSBkeW5hbWljIHRyZWUgKi8KLSAgICBpbnQgICAgIG1heF9jb2RlOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLwotICAgIHN0YXRpY190cmVlX2Rlc2MgKnN0YXRfZGVzYzsgLyogdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHRyZWUgKi8KLX0gRkFSIHRyZWVfZGVzYzsKLQotdHlwZWRlZiB1c2ggUG9zOwotdHlwZWRlZiBQb3MgRkFSIFBvc2Y7Ci10eXBlZGVmIHVuc2lnbmVkIElQb3M7Ci0KLS8qIEEgUG9zIGlzIGFuIGluZGV4IGluIHRoZSBjaGFyYWN0ZXIgd2luZG93LiBXZSB1c2Ugc2hvcnQgaW5zdGVhZCBvZiBpbnQgdG8KLSAqIHNhdmUgc3BhY2UgaW4gdGhlIHZhcmlvdXMgdGFibGVzLiBJUG9zIGlzIHVzZWQgb25seSBmb3IgcGFyYW1ldGVyIHBhc3NpbmcuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgewotICAgIHpfc3RyZWFtcCBzdHJtOyAgICAgIC8qIHBvaW50ZXIgYmFjayB0byB0aGlzIHpsaWIgc3RyZWFtICovCi0gICAgaW50ICAgc3RhdHVzOyAgICAgICAgLyogYXMgdGhlIG5hbWUgaW1wbGllcyAqLwotICAgIEJ5dGVmICpwZW5kaW5nX2J1ZjsgIC8qIG91dHB1dCBzdGlsbCBwZW5kaW5nICovCi0gICAgdWxnICAgcGVuZGluZ19idWZfc2l6ZTsgLyogc2l6ZSBvZiBwZW5kaW5nX2J1ZiAqLwotICAgIEJ5dGVmICpwZW5kaW5nX291dDsgIC8qIG5leHQgcGVuZGluZyBieXRlIHRvIG91dHB1dCB0byB0aGUgc3RyZWFtICovCi0gICAgdUludCAgIHBlbmRpbmc7ICAgICAgLyogbmIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyICovCi0gICAgaW50ICAgd3JhcDsgICAgICAgICAgLyogYml0IDAgdHJ1ZSBmb3IgemxpYiwgYml0IDEgdHJ1ZSBmb3IgZ3ppcCAqLwotICAgIGd6X2hlYWRlcnAgIGd6aGVhZDsgIC8qIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHRvIHdyaXRlICovCi0gICAgdUludCAgIGd6aW5kZXg7ICAgICAgLyogd2hlcmUgaW4gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgKi8KLSAgICBCeXRlICBtZXRob2Q7ICAgICAgICAvKiBTVE9SRUQgKGZvciB6aXAgb25seSkgb3IgREVGTEFURUQgKi8KLSAgICBpbnQgICBsYXN0X2ZsdXNoOyAgICAvKiB2YWx1ZSBvZiBmbHVzaCBwYXJhbSBmb3IgcHJldmlvdXMgZGVmbGF0ZSBjYWxsICovCi0KLSAgICAgICAgICAgICAgICAvKiB1c2VkIGJ5IGRlZmxhdGUuYzogKi8KLQotICAgIHVJbnQgIHdfc2l6ZTsgICAgICAgIC8qIExaNzcgd2luZG93IHNpemUgKDMySyBieSBkZWZhdWx0KSAqLwotICAgIHVJbnQgIHdfYml0czsgICAgICAgIC8qIGxvZzIod19zaXplKSAgKDguLjE2KSAqLwotICAgIHVJbnQgIHdfbWFzazsgICAgICAgIC8qIHdfc2l6ZSAtIDEgKi8KLQotICAgIEJ5dGVmICp3aW5kb3c7Ci0gICAgLyogU2xpZGluZyB3aW5kb3cuIElucHV0IGJ5dGVzIGFyZSByZWFkIGludG8gdGhlIHNlY29uZCBoYWxmIG9mIHRoZSB3aW5kb3csCi0gICAgICogYW5kIG1vdmUgdG8gdGhlIGZpcnN0IGhhbGYgbGF0ZXIgdG8ga2VlcCBhIGRpY3Rpb25hcnkgb2YgYXQgbGVhc3Qgd1NpemUKLSAgICAgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mCi0gICAgICogd1NpemUtTUFYX01BVENIIGJ5dGVzLCBidXQgdGhpcyBlbnN1cmVzIHRoYXQgSU8gaXMgYWx3YXlzCi0gICAgICogcGVyZm9ybWVkIHdpdGggYSBsZW5ndGggbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuIEFsc28sIGl0IGxpbWl0cwotICAgICAqIHRoZSB3aW5kb3cgc2l6ZSB0byA2NEssIHdoaWNoIGlzIHF1aXRlIHVzZWZ1bCBvbiBNU0RPUy4KLSAgICAgKiBUbyBkbzogdXNlIHRoZSB1c2VyIGlucHV0IGJ1ZmZlciBhcyBzbGlkaW5nIHdpbmRvdy4KLSAgICAgKi8KLQotICAgIHVsZyB3aW5kb3dfc2l6ZTsKLSAgICAvKiBBY3R1YWwgc2l6ZSBvZiB3aW5kb3c6IDIqd1NpemUsIGV4Y2VwdCB3aGVuIHRoZSB1c2VyIGlucHV0IGJ1ZmZlcgotICAgICAqIGlzIGRpcmVjdGx5IHVzZWQgYXMgc2xpZGluZyB3aW5kb3cuCi0gICAgICovCi0KLSAgICBQb3NmICpwcmV2OwotICAgIC8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzCi0gICAgICogYXJyYXkgdG8gNjRLLCB0aGlzIGxpbmsgaXMgbWFpbnRhaW5lZCBvbmx5IGZvciB0aGUgbGFzdCAzMksgc3RyaW5ncy4KLSAgICAgKiBBbiBpbmRleCBpbiB0aGlzIGFycmF5IGlzIHRodXMgYSB3aW5kb3cgaW5kZXggbW9kdWxvIDMySy4KLSAgICAgKi8KLQotICAgIFBvc2YgKmhlYWQ7IC8qIEhlYWRzIG9mIHRoZSBoYXNoIGNoYWlucyBvciBOSUwuICovCi0KLSAgICB1SW50ICBpbnNfaDsgICAgICAgICAgLyogaGFzaCBpbmRleCBvZiBzdHJpbmcgdG8gYmUgaW5zZXJ0ZWQgKi8KLSAgICB1SW50ICBoYXNoX3NpemU7ICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi8KLSAgICB1SW50ICBoYXNoX2JpdHM7ICAgICAgLyogbG9nMihoYXNoX3NpemUpICovCi0gICAgdUludCAgaGFzaF9tYXNrOyAgICAgIC8qIGhhc2hfc2l6ZS0xICovCi0KLSAgICB1SW50ICBoYXNoX3NoaWZ0OwotICAgIC8qIE51bWJlciBvZiBiaXRzIGJ5IHdoaWNoIGluc19oIG11c3QgYmUgc2hpZnRlZCBhdCBlYWNoIGlucHV0Ci0gICAgICogc3RlcC4gSXQgbXVzdCBiZSBzdWNoIHRoYXQgYWZ0ZXIgTUlOX01BVENIIHN0ZXBzLCB0aGUgb2xkZXN0Ci0gICAgICogYnl0ZSBubyBsb25nZXIgdGFrZXMgcGFydCBpbiB0aGUgaGFzaCBrZXksIHRoYXQgaXM6Ci0gICAgICogICBoYXNoX3NoaWZ0ICogTUlOX01BVENIID49IGhhc2hfYml0cwotICAgICAqLwotCi0gICAgbG9uZyBibG9ja19zdGFydDsKLSAgICAvKiBXaW5kb3cgcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBvdXRwdXQgYmxvY2suIEdldHMKLSAgICAgKiBuZWdhdGl2ZSB3aGVuIHRoZSB3aW5kb3cgaXMgbW92ZWQgYmFja3dhcmRzLgotICAgICAqLwotCi0gICAgdUludCBtYXRjaF9sZW5ndGg7ICAgICAgICAgICAvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqLwotICAgIElQb3MgcHJldl9tYXRjaDsgICAgICAgICAgICAgLyogcHJldmlvdXMgbWF0Y2ggKi8KLSAgICBpbnQgbWF0Y2hfYXZhaWxhYmxlOyAgICAgICAgIC8qIHNldCBpZiBwcmV2aW91cyBtYXRjaCBleGlzdHMgKi8KLSAgICB1SW50IHN0cnN0YXJ0OyAgICAgICAgICAgICAgIC8qIHN0YXJ0IG9mIHN0cmluZyB0byBpbnNlcnQgKi8KLSAgICB1SW50IG1hdGNoX3N0YXJ0OyAgICAgICAgICAgIC8qIHN0YXJ0IG9mIG1hdGNoaW5nIHN0cmluZyAqLwotICAgIHVJbnQgbG9va2FoZWFkOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGFoZWFkIGluIHdpbmRvdyAqLwotCi0gICAgdUludCBwcmV2X2xlbmd0aDsKLSAgICAvKiBMZW5ndGggb2YgdGhlIGJlc3QgbWF0Y2ggYXQgcHJldmlvdXMgc3RlcC4gTWF0Y2hlcyBub3QgZ3JlYXRlciB0aGFuIHRoaXMKLSAgICAgKiBhcmUgZGlzY2FyZGVkLiBUaGlzIGlzIHVzZWQgaW4gdGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbi4KLSAgICAgKi8KLQotICAgIHVJbnQgbWF4X2NoYWluX2xlbmd0aDsKLSAgICAvKiBUbyBzcGVlZCB1cCBkZWZsYXRpb24sIGhhc2ggY2hhaW5zIGFyZSBuZXZlciBzZWFyY2hlZCBiZXlvbmQgdGhpcwotICAgICAqIGxlbmd0aC4gIEEgaGlnaGVyIGxpbWl0IGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBkZWdyYWRlcyB0aGUKLSAgICAgKiBzcGVlZC4KLSAgICAgKi8KLQotICAgIHVJbnQgbWF4X2xhenlfbWF0Y2g7Ci0gICAgLyogQXR0ZW1wdCB0byBmaW5kIGEgYmV0dGVyIG1hdGNoIG9ubHkgd2hlbiB0aGUgY3VycmVudCBtYXRjaCBpcyBzdHJpY3RseQotICAgICAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uCi0gICAgICogbGV2ZWxzID49IDQuCi0gICAgICovCi0jICAgZGVmaW5lIG1heF9pbnNlcnRfbGVuZ3RoICBtYXhfbGF6eV9tYXRjaAotICAgIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbm90Ci0gICAgICogZ3JlYXRlciB0aGFuIHRoaXMgbGVuZ3RoLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLgotICAgICAqIG1heF9pbnNlcnRfbGVuZ3RoIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb24gbGV2ZWxzIDw9IDMuCi0gICAgICovCi0KLSAgICBpbnQgbGV2ZWw7ICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICgxLi45KSAqLwotICAgIGludCBzdHJhdGVneTsgLyogZmF2b3Igb3IgZm9yY2UgSHVmZm1hbiBjb2RpbmcqLwotCi0gICAgdUludCBnb29kX21hdGNoOwotICAgIC8qIFVzZSBhIGZhc3RlciBzZWFyY2ggd2hlbiB0aGUgcHJldmlvdXMgbWF0Y2ggaXMgbG9uZ2VyIHRoYW4gdGhpcyAqLwotCi0gICAgaW50IG5pY2VfbWF0Y2g7IC8qIFN0b3Agc2VhcmNoaW5nIHdoZW4gY3VycmVudCBtYXRjaCBleGNlZWRzIHRoaXMgKi8KLQotICAgICAgICAgICAgICAgIC8qIHVzZWQgYnkgdHJlZXMuYzogKi8KLSAgICAvKiBEaWRuJ3QgdXNlIGN0X2RhdGEgdHlwZWRlZiBiZWxvdyB0byBzdXBwcmVzcyBjb21waWxlciB3YXJuaW5nICovCi0gICAgc3RydWN0IGN0X2RhdGFfcyBkeW5fbHRyZWVbSEVBUF9TSVpFXTsgICAvKiBsaXRlcmFsIGFuZCBsZW5ndGggdHJlZSAqLwotICAgIHN0cnVjdCBjdF9kYXRhX3MgZHluX2R0cmVlWzIqRF9DT0RFUysxXTsgLyogZGlzdGFuY2UgdHJlZSAqLwotICAgIHN0cnVjdCBjdF9kYXRhX3MgYmxfdHJlZVsyKkJMX0NPREVTKzFdOyAgLyogSHVmZm1hbiB0cmVlIGZvciBiaXQgbGVuZ3RocyAqLwotCi0gICAgc3RydWN0IHRyZWVfZGVzY19zIGxfZGVzYzsgICAgICAgICAgICAgICAvKiBkZXNjLiBmb3IgbGl0ZXJhbCB0cmVlICovCi0gICAgc3RydWN0IHRyZWVfZGVzY19zIGRfZGVzYzsgICAgICAgICAgICAgICAvKiBkZXNjLiBmb3IgZGlzdGFuY2UgdHJlZSAqLwotICAgIHN0cnVjdCB0cmVlX2Rlc2NfcyBibF9kZXNjOyAgICAgICAgICAgICAgLyogZGVzYy4gZm9yIGJpdCBsZW5ndGggdHJlZSAqLwotCi0gICAgdXNoIGJsX2NvdW50W01BWF9CSVRTKzFdOwotICAgIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqLwotCi0gICAgaW50IGhlYXBbMipMX0NPREVTKzFdOyAgICAgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqLwotICAgIGludCBoZWFwX2xlbjsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhlYXAgKi8KLSAgICBpbnQgaGVhcF9tYXg7ICAgICAgICAgICAgICAgLyogZWxlbWVudCBvZiBsYXJnZXN0IGZyZXF1ZW5jeSAqLwotICAgIC8qIFRoZSBzb25zIG9mIGhlYXBbbl0gYXJlIGhlYXBbMipuXSBhbmQgaGVhcFsyKm4rMV0uIGhlYXBbMF0gaXMgbm90IHVzZWQuCi0gICAgICogVGhlIHNhbWUgaGVhcCBhcnJheSBpcyB1c2VkIHRvIGJ1aWxkIGFsbCB0cmVlcy4KLSAgICAgKi8KLQotICAgIHVjaCBkZXB0aFsyKkxfQ09ERVMrMV07Ci0gICAgLyogRGVwdGggb2YgZWFjaCBzdWJ0cmVlIHVzZWQgYXMgdGllIGJyZWFrZXIgZm9yIHRyZWVzIG9mIGVxdWFsIGZyZXF1ZW5jeQotICAgICAqLwotCi0gICAgdWNoZiAqbF9idWY7ICAgICAgICAgIC8qIGJ1ZmZlciBmb3IgbGl0ZXJhbHMgb3IgbGVuZ3RocyAqLwotCi0gICAgdUludCAgbGl0X2J1ZnNpemU7Ci0gICAgLyogU2l6ZSBvZiBtYXRjaCBidWZmZXIgZm9yIGxpdGVyYWxzL2xlbmd0aHMuICBUaGVyZSBhcmUgNCByZWFzb25zIGZvcgotICAgICAqIGxpbWl0aW5nIGxpdF9idWZzaXplIHRvIDY0SzoKLSAgICAgKiAgIC0gZnJlcXVlbmNpZXMgY2FuIGJlIGtlcHQgaW4gMTYgYml0IGNvdW50ZXJzCi0gICAgICogICAtIGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciB0aGUgZmlyc3QgYmxvY2ssIGFsbCBpbnB1dAotICAgICAqICAgICBkYXRhIGlzIHN0aWxsIGluIHRoZSB3aW5kb3cgc28gd2UgY2FuIHN0aWxsIGVtaXQgYSBzdG9yZWQgYmxvY2sgZXZlbgotICAgICAqICAgICB3aGVuIGlucHV0IGNvbWVzIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBjYW4gYWxzbyBiZSBkb25lIGZvcgotICAgICAqICAgICBhbGwgYmxvY2tzIGlmIGxpdF9idWZzaXplIGlzIG5vdCBncmVhdGVyIHRoYW4gMzJLLikKLSAgICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGEgZmlsZSBzbWFsbGVyIHRoYW4gNjRLLCB3ZSBjYW4KLSAgICAgKiAgICAgZXZlbiBlbWl0IGEgc3RvcmVkIGZpbGUgaW5zdGVhZCBvZiBhIHN0b3JlZCBibG9jayAoc2F2aW5nIDUgYnl0ZXMpLgotICAgICAqICAgICBUaGlzIGlzIGFwcGxpY2FibGUgb25seSBmb3IgemlwIChub3QgZ3ppcCBvciB6bGliKS4KLSAgICAgKiAgIC0gY3JlYXRpbmcgbmV3IEh1ZmZtYW4gdHJlZXMgbGVzcyBmcmVxdWVudGx5IG1heSBub3QgcHJvdmlkZSBmYXN0Ci0gICAgICogICAgIGFkYXB0YXRpb24gdG8gY2hhbmdlcyBpbiB0aGUgaW5wdXQgZGF0YSBzdGF0aXN0aWNzLiAoVGFrZSBmb3IKLSAgICAgKiAgICAgZXhhbXBsZSBhIGJpbmFyeSBmaWxlIHdpdGggcG9vcmx5IGNvbXByZXNzaWJsZSBjb2RlIGZvbGxvd2VkIGJ5Ci0gICAgICogICAgIGEgaGlnaGx5IGNvbXByZXNzaWJsZSBzdHJpbmcgdGFibGUuKSBTbWFsbGVyIGJ1ZmZlciBzaXplcyBnaXZlCi0gICAgICogICAgIGZhc3QgYWRhcHRhdGlvbiBidXQgaGF2ZSBvZiBjb3Vyc2UgdGhlIG92ZXJoZWFkIG9mIHRyYW5zbWl0dGluZwotICAgICAqICAgICB0cmVlcyBtb3JlIGZyZXF1ZW50bHkuCi0gICAgICogICAtIEkgY2FuJ3QgY291bnQgYWJvdmUgNAotICAgICAqLwotCi0gICAgdUludCBsYXN0X2xpdDsgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovCi0KLSAgICB1c2hmICpkX2J1ZjsKLSAgICAvKiBCdWZmZXIgZm9yIGRpc3RhbmNlcy4gVG8gc2ltcGxpZnkgdGhlIGNvZGUsIGRfYnVmIGFuZCBsX2J1ZiBoYXZlCi0gICAgICogdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLiBUbyB1c2UgZGlmZmVyZW50IGxlbmd0aHMsIGFuIGV4dHJhIGZsYWcKLSAgICAgKiBhcnJheSB3b3VsZCBiZSBuZWNlc3NhcnkuCi0gICAgICovCi0KLSAgICB1bGcgb3B0X2xlbjsgICAgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIG9wdGltYWwgdHJlZXMgKi8KLSAgICB1bGcgc3RhdGljX2xlbjsgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIHN0YXRpYyB0cmVlcyAqLwotICAgIHVJbnQgbWF0Y2hlczsgICAgICAgLyogbnVtYmVyIG9mIHN0cmluZyBtYXRjaGVzIGluIGN1cnJlbnQgYmxvY2sgKi8KLSAgICB1SW50IGluc2VydDsgICAgICAgIC8qIGJ5dGVzIGF0IGVuZCBvZiB3aW5kb3cgbGVmdCB0byBpbnNlcnQgKi8KLQotI2lmZGVmIERFQlVHCi0gICAgdWxnIGNvbXByZXNzZWRfbGVuOyAvKiB0b3RhbCBiaXQgbGVuZ3RoIG9mIGNvbXByZXNzZWQgZmlsZSBtb2QgMl4zMiAqLwotICAgIHVsZyBiaXRzX3NlbnQ7ICAgICAgLyogYml0IGxlbmd0aCBvZiBjb21wcmVzc2VkIGRhdGEgc2VudCBtb2QgMl4zMiAqLwotI2VuZGlmCi0KLSAgICB1c2ggYmlfYnVmOwotICAgIC8qIE91dHB1dCBidWZmZXIuIGJpdHMgYXJlIGluc2VydGVkIHN0YXJ0aW5nIGF0IHRoZSBib3R0b20gKGxlYXN0Ci0gICAgICogc2lnbmlmaWNhbnQgYml0cykuCi0gICAgICovCi0gICAgaW50IGJpX3ZhbGlkOwotICAgIC8qIE51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJpX2J1Zi4gIEFsbCBiaXRzIGFib3ZlIHRoZSBsYXN0IHZhbGlkIGJpdAotICAgICAqIGFyZSBhbHdheXMgemVyby4KLSAgICAgKi8KLQotICAgIHVsZyBoaWdoX3dhdGVyOwotICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBvZmZzZXQgaW4gd2luZG93IGZvciBpbml0aWFsaXplZCBieXRlcyAtLSBieXRlcyBhYm92ZQotICAgICAqIHRoaXMgYXJlIHNldCB0byB6ZXJvIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayB3YXJuaW5ncyB3aGVuCi0gICAgICogbG9uZ2VzdCBtYXRjaCByb3V0aW5lcyBhY2Nlc3MgYnl0ZXMgcGFzdCB0aGUgaW5wdXQuICBUaGlzIGlzIHRoZW4KLSAgICAgKiB1cGRhdGVkIHRvIHRoZSBuZXcgaGlnaCB3YXRlciBtYXJrLgotICAgICAqLwotCi19IEZBUiBkZWZsYXRlX3N0YXRlOwotCi0vKiBPdXRwdXQgYSBieXRlIG9uIHRoZSBzdHJlYW0uCi0gKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdfYnVmLgotICovCi0jZGVmaW5lIHB1dF9ieXRlKHMsIGMpIHtzLT5wZW5kaW5nX2J1ZltzLT5wZW5kaW5nKytdID0gKGMpO30KLQotCi0jZGVmaW5lIE1JTl9MT09LQUhFQUQgKE1BWF9NQVRDSCtNSU5fTUFUQ0grMSkKLS8qIE1pbmltdW0gYW1vdW50IG9mIGxvb2thaGVhZCwgZXhjZXB0IGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuCi0gKiBTZWUgZGVmbGF0ZS5jIGZvciBjb21tZW50cyBhYm91dCB0aGUgTUlOX01BVENIKzEuCi0gKi8KLQotI2RlZmluZSBNQVhfRElTVChzKSAgKChzKS0+d19zaXplLU1JTl9MT09LQUhFQUQpCi0vKiBJbiBvcmRlciB0byBzaW1wbGlmeSB0aGUgY29kZSwgcGFydGljdWxhcmx5IG9uIDE2IGJpdCBtYWNoaW5lcywgbWF0Y2gKLSAqIGRpc3RhbmNlcyBhcmUgbGltaXRlZCB0byBNQVhfRElTVCBpbnN0ZWFkIG9mIFdTSVpFLgotICovCi0KLSNkZWZpbmUgV0lOX0lOSVQgTUFYX01BVENICi0vKiBOdW1iZXIgb2YgYnl0ZXMgYWZ0ZXIgZW5kIG9mIGRhdGEgaW4gd2luZG93IHRvIGluaXRpYWxpemUgaW4gb3JkZXIgdG8gYXZvaWQKLSAgIG1lbW9yeSBjaGVja2VyIGVycm9ycyBmcm9tIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMgKi8KLQotICAgICAgICAvKiBpbiB0cmVlcy5jICovCi12b2lkIFpMSUJfSU5URVJOQUwgX3RyX2luaXQgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKLWludCBaTElCX0lOVEVSTkFMIF90cl90YWxseSBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgdW5zaWduZWQgZGlzdCwgdW5zaWduZWQgbGMpKTsKLXZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfZmx1c2hfYmxvY2sgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGNoYXJmICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICB1bGcgc3RvcmVkX2xlbiwgaW50IGxhc3QpKTsKLXZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfZmx1c2hfYml0cyBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOwotdm9pZCBaTElCX0lOVEVSTkFMIF90cl9hbGlnbiBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOwotdm9pZCBaTElCX0lOVEVSTkFMIF90cl9zdG9yZWRfYmxvY2sgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGNoYXJmICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICB1bGcgc3RvcmVkX2xlbiwgaW50IGxhc3QpKTsKLQotI2RlZmluZSBkX2NvZGUoZGlzdCkgXAotICAgKChkaXN0KSA8IDI1NiA/IF9kaXN0X2NvZGVbZGlzdF0gOiBfZGlzdF9jb2RlWzI1NisoKGRpc3QpPj43KV0pCi0vKiBNYXBwaW5nIGZyb20gYSBkaXN0YW5jZSB0byBhIGRpc3RhbmNlIGNvZGUuIGRpc3QgaXMgdGhlIGRpc3RhbmNlIC0gMSBhbmQKLSAqIG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzLiBfZGlzdF9jb2RlWzI1Nl0gYW5kIF9kaXN0X2NvZGVbMjU3XSBhcmUgbmV2ZXIKLSAqIHVzZWQuCi0gKi8KLQotI2lmbmRlZiBERUJVRwotLyogSW5saW5lIHZlcnNpb25zIG9mIF90cl90YWxseSBmb3Igc3BlZWQ6ICovCi0KLSNpZiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKQotICBleHRlcm4gdWNoIFpMSUJfSU5URVJOQUwgX2xlbmd0aF9jb2RlW107Ci0gIGV4dGVybiB1Y2ggWkxJQl9JTlRFUk5BTCBfZGlzdF9jb2RlW107Ci0jZWxzZQotICBleHRlcm4gY29uc3QgdWNoIFpMSUJfSU5URVJOQUwgX2xlbmd0aF9jb2RlW107Ci0gIGV4dGVybiBjb25zdCB1Y2ggWkxJQl9JTlRFUk5BTCBfZGlzdF9jb2RlW107Ci0jZW5kaWYKLQotIyBkZWZpbmUgX3RyX3RhbGx5X2xpdChzLCBjLCBmbHVzaCkgXAotICB7IHVjaCBjYyA9IChjKTsgXAotICAgIHMtPmRfYnVmW3MtPmxhc3RfbGl0XSA9IDA7IFwKLSAgICBzLT5sX2J1ZltzLT5sYXN0X2xpdCsrXSA9IGNjOyBcCi0gICAgcy0+ZHluX2x0cmVlW2NjXS5GcmVxKys7IFwKLSAgICBmbHVzaCA9IChzLT5sYXN0X2xpdCA9PSBzLT5saXRfYnVmc2l6ZS0xKTsgXAotICAgfQotIyBkZWZpbmUgX3RyX3RhbGx5X2Rpc3QocywgZGlzdGFuY2UsIGxlbmd0aCwgZmx1c2gpIFwKLSAgeyB1Y2ggbGVuID0gKGxlbmd0aCk7IFwKLSAgICB1c2ggZGlzdCA9IChkaXN0YW5jZSk7IFwKLSAgICBzLT5kX2J1ZltzLT5sYXN0X2xpdF0gPSBkaXN0OyBcCi0gICAgcy0+bF9idWZbcy0+bGFzdF9saXQrK10gPSBsZW47IFwKLSAgICBkaXN0LS07IFwKLSAgICBzLT5keW5fbHRyZWVbX2xlbmd0aF9jb2RlW2xlbl0rTElURVJBTFMrMV0uRnJlcSsrOyBcCi0gICAgcy0+ZHluX2R0cmVlW2RfY29kZShkaXN0KV0uRnJlcSsrOyBcCi0gICAgZmx1c2ggPSAocy0+bGFzdF9saXQgPT0gcy0+bGl0X2J1ZnNpemUtMSk7IFwKLSAgfQotI2Vsc2UKLSMgZGVmaW5lIF90cl90YWxseV9saXQocywgYywgZmx1c2gpIGZsdXNoID0gX3RyX3RhbGx5KHMsIDAsIGMpCi0jIGRlZmluZSBfdHJfdGFsbHlfZGlzdChzLCBkaXN0YW5jZSwgbGVuZ3RoLCBmbHVzaCkgXAotICAgICAgICAgICAgICBmbHVzaCA9IF90cl90YWxseShzLCBkaXN0YW5jZSwgbGVuZ3RoKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBERUZMQVRFX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy96bGliL2RvYy9hbGdvcml0aG0udHh0IGIvc3JjL3psaWIvZG9jL2FsZ29yaXRobS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5N2Y0OTUuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvZG9jL2FsZ29yaXRobS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotMS4gQ29tcHJlc3Npb24gYWxnb3JpdGhtIChkZWZsYXRlKQotCi1UaGUgZGVmbGF0aW9uIGFsZ29yaXRobSB1c2VkIGJ5IGd6aXAgKGFsc28gemlwIGFuZCB6bGliKSBpcyBhIHZhcmlhdGlvbiBvZgotTFo3NyAoTGVtcGVsLVppdiAxOTc3LCBzZWUgcmVmZXJlbmNlIGJlbG93KS4gSXQgZmluZHMgZHVwbGljYXRlZCBzdHJpbmdzIGluCi10aGUgaW5wdXQgZGF0YS4gIFRoZSBzZWNvbmQgb2NjdXJyZW5jZSBvZiBhIHN0cmluZyBpcyByZXBsYWNlZCBieSBhCi1wb2ludGVyIHRvIHRoZSBwcmV2aW91cyBzdHJpbmcsIGluIHRoZSBmb3JtIG9mIGEgcGFpciAoZGlzdGFuY2UsCi1sZW5ndGgpLiAgRGlzdGFuY2VzIGFyZSBsaW1pdGVkIHRvIDMySyBieXRlcywgYW5kIGxlbmd0aHMgYXJlIGxpbWl0ZWQKLXRvIDI1OCBieXRlcy4gV2hlbiBhIHN0cmluZyBkb2VzIG5vdCBvY2N1ciBhbnl3aGVyZSBpbiB0aGUgcHJldmlvdXMKLTMySyBieXRlcywgaXQgaXMgZW1pdHRlZCBhcyBhIHNlcXVlbmNlIG9mIGxpdGVyYWwgYnl0ZXMuICAoSW4gdGhpcwotZGVzY3JpcHRpb24sIGBzdHJpbmcnIG11c3QgYmUgdGFrZW4gYXMgYW4gYXJiaXRyYXJ5IHNlcXVlbmNlIG9mIGJ5dGVzLAotYW5kIGlzIG5vdCByZXN0cmljdGVkIHRvIHByaW50YWJsZSBjaGFyYWN0ZXJzLikKLQotTGl0ZXJhbHMgb3IgbWF0Y2ggbGVuZ3RocyBhcmUgY29tcHJlc3NlZCB3aXRoIG9uZSBIdWZmbWFuIHRyZWUsIGFuZAotbWF0Y2ggZGlzdGFuY2VzIGFyZSBjb21wcmVzc2VkIHdpdGggYW5vdGhlciB0cmVlLiBUaGUgdHJlZXMgYXJlIHN0b3JlZAotaW4gYSBjb21wYWN0IGZvcm0gYXQgdGhlIHN0YXJ0IG9mIGVhY2ggYmxvY2suIFRoZSBibG9ja3MgY2FuIGhhdmUgYW55Ci1zaXplIChleGNlcHQgdGhhdCB0aGUgY29tcHJlc3NlZCBkYXRhIGZvciBvbmUgYmxvY2sgbXVzdCBmaXQgaW4KLWF2YWlsYWJsZSBtZW1vcnkpLiBBIGJsb2NrIGlzIHRlcm1pbmF0ZWQgd2hlbiBkZWZsYXRlKCkgZGV0ZXJtaW5lcyB0aGF0Ci1pdCB3b3VsZCBiZSB1c2VmdWwgdG8gc3RhcnQgYW5vdGhlciBibG9jayB3aXRoIGZyZXNoIHRyZWVzLiAoVGhpcyBpcwotc29tZXdoYXQgc2ltaWxhciB0byB0aGUgYmVoYXZpb3Igb2YgTFpXLWJhc2VkIF9jb21wcmVzc18uKQotCi1EdXBsaWNhdGVkIHN0cmluZ3MgYXJlIGZvdW5kIHVzaW5nIGEgaGFzaCB0YWJsZS4gQWxsIGlucHV0IHN0cmluZ3Mgb2YKLWxlbmd0aCAzIGFyZSBpbnNlcnRlZCBpbiB0aGUgaGFzaCB0YWJsZS4gQSBoYXNoIGluZGV4IGlzIGNvbXB1dGVkIGZvcgotdGhlIG5leHQgMyBieXRlcy4gSWYgdGhlIGhhc2ggY2hhaW4gZm9yIHRoaXMgaW5kZXggaXMgbm90IGVtcHR5LCBhbGwKLXN0cmluZ3MgaW4gdGhlIGNoYWluIGFyZSBjb21wYXJlZCB3aXRoIHRoZSBjdXJyZW50IGlucHV0IHN0cmluZywgYW5kCi10aGUgbG9uZ2VzdCBtYXRjaCBpcyBzZWxlY3RlZC4KLQotVGhlIGhhc2ggY2hhaW5zIGFyZSBzZWFyY2hlZCBzdGFydGluZyB3aXRoIHRoZSBtb3N0IHJlY2VudCBzdHJpbmdzLCB0bwotZmF2b3Igc21hbGwgZGlzdGFuY2VzIGFuZCB0aHVzIHRha2UgYWR2YW50YWdlIG9mIHRoZSBIdWZmbWFuIGVuY29kaW5nLgotVGhlIGhhc2ggY2hhaW5zIGFyZSBzaW5nbHkgbGlua2VkLiBUaGVyZSBhcmUgbm8gZGVsZXRpb25zIGZyb20gdGhlCi1oYXNoIGNoYWlucywgdGhlIGFsZ29yaXRobSBzaW1wbHkgZGlzY2FyZHMgbWF0Y2hlcyB0aGF0IGFyZSB0b28gb2xkLgotCi1UbyBhdm9pZCBhIHdvcnN0LWNhc2Ugc2l0dWF0aW9uLCB2ZXJ5IGxvbmcgaGFzaCBjaGFpbnMgYXJlIGFyYml0cmFyaWx5Ci10cnVuY2F0ZWQgYXQgYSBjZXJ0YWluIGxlbmd0aCwgZGV0ZXJtaW5lZCBieSBhIHJ1bnRpbWUgb3B0aW9uIChsZXZlbAotcGFyYW1ldGVyIG9mIGRlZmxhdGVJbml0KS4gU28gZGVmbGF0ZSgpIGRvZXMgbm90IGFsd2F5cyBmaW5kIHRoZSBsb25nZXN0Ci1wb3NzaWJsZSBtYXRjaCBidXQgZ2VuZXJhbGx5IGZpbmRzIGEgbWF0Y2ggd2hpY2ggaXMgbG9uZyBlbm91Z2guCi0KLWRlZmxhdGUoKSBhbHNvIGRlZmVycyB0aGUgc2VsZWN0aW9uIG9mIG1hdGNoZXMgd2l0aCBhIGxhenkgZXZhbHVhdGlvbgotbWVjaGFuaXNtLiBBZnRlciBhIG1hdGNoIG9mIGxlbmd0aCBOIGhhcyBiZWVuIGZvdW5kLCBkZWZsYXRlKCkgc2VhcmNoZXMgZm9yCi1hIGxvbmdlciBtYXRjaCBhdCB0aGUgbmV4dCBpbnB1dCBieXRlLiBJZiBhIGxvbmdlciBtYXRjaCBpcyBmb3VuZCwgdGhlCi1wcmV2aW91cyBtYXRjaCBpcyB0cnVuY2F0ZWQgdG8gYSBsZW5ndGggb2Ygb25lICh0aHVzIHByb2R1Y2luZyBhIHNpbmdsZQotbGl0ZXJhbCBieXRlKSBhbmQgdGhlIHByb2Nlc3Mgb2YgbGF6eSBldmFsdWF0aW9uIGJlZ2lucyBhZ2Fpbi4gT3RoZXJ3aXNlLAotdGhlIG9yaWdpbmFsIG1hdGNoIGlzIGtlcHQsIGFuZCB0aGUgbmV4dCBtYXRjaCBzZWFyY2ggaXMgYXR0ZW1wdGVkIG9ubHkgTgotc3RlcHMgbGF0ZXIuCi0KLVRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24gaXMgYWxzbyBzdWJqZWN0IHRvIGEgcnVudGltZSBwYXJhbWV0ZXIuIElmCi10aGUgY3VycmVudCBtYXRjaCBpcyBsb25nIGVub3VnaCwgZGVmbGF0ZSgpIHJlZHVjZXMgdGhlIHNlYXJjaCBmb3IgYSBsb25nZXIKLW1hdGNoLCB0aHVzIHNwZWVkaW5nIHVwIHRoZSB3aG9sZSBwcm9jZXNzLiBJZiBjb21wcmVzc2lvbiByYXRpbyBpcyBtb3JlCi1pbXBvcnRhbnQgdGhhbiBzcGVlZCwgZGVmbGF0ZSgpIGF0dGVtcHRzIGEgY29tcGxldGUgc2Vjb25kIHNlYXJjaCBldmVuIGlmCi10aGUgZmlyc3QgbWF0Y2ggaXMgYWxyZWFkeSBsb25nIGVub3VnaC4KLQotVGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbiBpcyBub3QgcGVyZm9ybWVkIGZvciB0aGUgZmFzdGVzdCBjb21wcmVzc2lvbgotbW9kZXMgKGxldmVsIHBhcmFtZXRlciAxIHRvIDMpLiBGb3IgdGhlc2UgZmFzdCBtb2RlcywgbmV3IHN0cmluZ3MKLWFyZSBpbnNlcnRlZCBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IHdoZW4gbm8gbWF0Y2ggd2FzIGZvdW5kLCBvcgotd2hlbiB0aGUgbWF0Y2ggaXMgbm90IHRvbyBsb25nLiBUaGlzIGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbwotYnV0IHNhdmVzIHRpbWUgc2luY2UgdGhlcmUgYXJlIGJvdGggZmV3ZXIgaW5zZXJ0aW9ucyBhbmQgZmV3ZXIgc2VhcmNoZXMuCi0KLQotMi4gRGVjb21wcmVzc2lvbiBhbGdvcml0aG0gKGluZmxhdGUpCi0KLTIuMSBJbnRyb2R1Y3Rpb24KLQotVGhlIGtleSBxdWVzdGlvbiBpcyBob3cgdG8gcmVwcmVzZW50IGEgSHVmZm1hbiBjb2RlIChvciBhbnkgcHJlZml4IGNvZGUpIHNvCi10aGF0IHlvdSBjYW4gZGVjb2RlIGZhc3QuICBUaGUgbW9zdCBpbXBvcnRhbnQgY2hhcmFjdGVyaXN0aWMgaXMgdGhhdCBzaG9ydGVyCi1jb2RlcyBhcmUgbXVjaCBtb3JlIGNvbW1vbiB0aGFuIGxvbmdlciBjb2Rlcywgc28gcGF5IGF0dGVudGlvbiB0byBkZWNvZGluZyB0aGUKLXNob3J0IGNvZGVzIGZhc3QsIGFuZCBsZXQgdGhlIGxvbmcgY29kZXMgdGFrZSBsb25nZXIgdG8gZGVjb2RlLgotCi1pbmZsYXRlKCkgc2V0cyB1cCBhIGZpcnN0IGxldmVsIHRhYmxlIHRoYXQgY292ZXJzIHNvbWUgbnVtYmVyIG9mIGJpdHMgb2YKLWlucHV0IGxlc3MgdGhhbiB0aGUgbGVuZ3RoIG9mIGxvbmdlc3QgY29kZS4gIEl0IGdldHMgdGhhdCBtYW55IGJpdHMgZnJvbSB0aGUKLXN0cmVhbSwgYW5kIGxvb2tzIGl0IHVwIGluIHRoZSB0YWJsZS4gIFRoZSB0YWJsZSB3aWxsIHRlbGwgaWYgdGhlIG5leHQKLWNvZGUgaXMgdGhhdCBtYW55IGJpdHMgb3IgbGVzcyBhbmQgaG93IG1hbnksIGFuZCBpZiBpdCBpcywgaXQgd2lsbCB0ZWxsCi10aGUgdmFsdWUsIGVsc2UgaXQgd2lsbCBwb2ludCB0byB0aGUgbmV4dCBsZXZlbCB0YWJsZSBmb3Igd2hpY2ggaW5mbGF0ZSgpCi1ncmFicyBtb3JlIGJpdHMgYW5kIHRyaWVzIHRvIGRlY29kZSBhIGxvbmdlciBjb2RlLgotCi1Ib3cgbWFueSBiaXRzIHRvIG1ha2UgdGhlIGZpcnN0IGxvb2t1cCBpcyBhIHRyYWRlb2ZmIGJldHdlZW4gdGhlIHRpbWUgaXQKLXRha2VzIHRvIGRlY29kZSBhbmQgdGhlIHRpbWUgaXQgdGFrZXMgdG8gYnVpbGQgdGhlIHRhYmxlLiAgSWYgYnVpbGRpbmcgdGhlCi10YWJsZSB0b29rIG5vIHRpbWUgKGFuZCBpZiB5b3UgaGFkIGluZmluaXRlIG1lbW9yeSksIHRoZW4gdGhlcmUgd291bGQgb25seQotYmUgYSBmaXJzdCBsZXZlbCB0YWJsZSB0byBjb3ZlciBhbGwgdGhlIHdheSB0byB0aGUgbG9uZ2VzdCBjb2RlLiAgSG93ZXZlciwKLWJ1aWxkaW5nIHRoZSB0YWJsZSBlbmRzIHVwIHRha2luZyBhIGxvdCBsb25nZXIgZm9yIG1vcmUgYml0cyBzaW5jZSBzaG9ydAotY29kZXMgYXJlIHJlcGxpY2F0ZWQgbWFueSB0aW1lcyBpbiBzdWNoIGEgdGFibGUuICBXaGF0IGluZmxhdGUoKSBkb2VzIGlzCi1zaW1wbHkgdG8gbWFrZSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGZpcnN0IHRhYmxlIGEgdmFyaWFibGUsIGFuZCAgdGhlbgotdG8gc2V0IHRoYXQgdmFyaWFibGUgZm9yIHRoZSBtYXhpbXVtIHNwZWVkLgotCi1Gb3IgaW5mbGF0ZSwgd2hpY2ggaGFzIDI4NiBwb3NzaWJsZSBjb2RlcyBmb3IgdGhlIGxpdGVyYWwvbGVuZ3RoIHRyZWUsIHRoZSBzaXplCi1vZiB0aGUgZmlyc3QgdGFibGUgaXMgbmluZSBiaXRzLiAgQWxzbyB0aGUgZGlzdGFuY2UgdHJlZXMgaGF2ZSAzMCBwb3NzaWJsZQotdmFsdWVzLCBhbmQgdGhlIHNpemUgb2YgdGhlIGZpcnN0IHRhYmxlIGlzIHNpeCBiaXRzLiAgTm90ZSB0aGF0IGZvciBlYWNoIG9mCi10aG9zZSBjYXNlcywgdGhlIHRhYmxlIGVuZGVkIHVwIG9uZSBiaXQgbG9uZ2VyIHRoYW4gdGhlIGBgYXZlcmFnZScnIGNvZGUKLWxlbmd0aCwgaS5lLiB0aGUgY29kZSBsZW5ndGggb2YgYW4gYXBwcm94aW1hdGVseSBmbGF0IGNvZGUgd2hpY2ggd291bGQgYmUgYQotbGl0dGxlIG1vcmUgdGhhbiBlaWdodCBiaXRzIGZvciAyODYgc3ltYm9scyBhbmQgYSBsaXR0bGUgbGVzcyB0aGFuIGZpdmUgYml0cwotZm9yIDMwIHN5bWJvbHMuCi0KLQotMi4yIE1vcmUgZGV0YWlscyBvbiB0aGUgaW5mbGF0ZSB0YWJsZSBsb29rdXAKLQotT2ssIHlvdSB3YW50IHRvIGtub3cgd2hhdCB0aGlzIGNsZXZlcmx5IG9iZnVzY2F0ZWQgaW5mbGF0ZSB0cmVlIGFjdHVhbGx5Ci1sb29rcyBsaWtlLiAgWW91IGFyZSBjb3JyZWN0IHRoYXQgaXQncyBub3QgYSBIdWZmbWFuIHRyZWUuICBJdCBpcyBzaW1wbHkgYQotbG9va3VwIHRhYmxlIGZvciB0aGUgZmlyc3QsIGxldCdzIHNheSwgbmluZSBiaXRzIG9mIGEgSHVmZm1hbiBzeW1ib2wuICBUaGUKLXN5bWJvbCBjb3VsZCBiZSBhcyBzaG9ydCBhcyBvbmUgYml0IG9yIGFzIGxvbmcgYXMgMTUgYml0cy4gIElmIGEgcGFydGljdWxhcgotc3ltYm9sIGlzIHNob3J0ZXIgdGhhbiBuaW5lIGJpdHMsIHRoZW4gdGhhdCBzeW1ib2wncyB0cmFuc2xhdGlvbiBpcyBkdXBsaWNhdGVkCi1pbiBhbGwgdGhvc2UgZW50cmllcyB0aGF0IHN0YXJ0IHdpdGggdGhhdCBzeW1ib2wncyBiaXRzLiAgRm9yIGV4YW1wbGUsIGlmIHRoZQotc3ltYm9sIGlzIGZvdXIgYml0cywgdGhlbiBpdCdzIGR1cGxpY2F0ZWQgMzIgdGltZXMgaW4gYSBuaW5lLWJpdCB0YWJsZS4gIElmIGEKLXN5bWJvbCBpcyBuaW5lIGJpdHMgbG9uZywgaXQgYXBwZWFycyBpbiB0aGUgdGFibGUgb25jZS4KLQotSWYgdGhlIHN5bWJvbCBpcyBsb25nZXIgdGhhbiBuaW5lIGJpdHMsIHRoZW4gdGhhdCBlbnRyeSBpbiB0aGUgdGFibGUgcG9pbnRzCi10byBhbm90aGVyIHNpbWlsYXIgdGFibGUgZm9yIHRoZSByZW1haW5pbmcgYml0cy4gIEFnYWluLCB0aGVyZSBhcmUgZHVwbGljYXRlZAotZW50cmllcyBhcyBuZWVkZWQuICBUaGUgaWRlYSBpcyB0aGF0IG1vc3Qgb2YgdGhlIHRpbWUgdGhlIHN5bWJvbCB3aWxsIGJlIHNob3J0Ci1hbmQgdGhlcmUgd2lsbCBvbmx5IGJlIG9uZSB0YWJsZSBsb29rIHVwLiAgKFRoYXQncyB3aG9sZSBpZGVhIGJlaGluZCBkYXRhCi1jb21wcmVzc2lvbiBpbiB0aGUgZmlyc3QgcGxhY2UuKSAgRm9yIHRoZSBsZXNzIGZyZXF1ZW50IGxvbmcgc3ltYm9scywgdGhlcmUKLXdpbGwgYmUgdHdvIGxvb2t1cHMuICBJZiB5b3UgaGFkIGEgY29tcHJlc3Npb24gbWV0aG9kIHdpdGggcmVhbGx5IGxvbmcKLXN5bWJvbHMsIHlvdSBjb3VsZCBoYXZlIGFzIG1hbnkgbGV2ZWxzIG9mIGxvb2t1cHMgYXMgaXMgZWZmaWNpZW50LiAgRm9yCi1pbmZsYXRlLCB0d28gaXMgZW5vdWdoLgotCi1TbyBhIHRhYmxlIGVudHJ5IGVpdGhlciBwb2ludHMgdG8gYW5vdGhlciB0YWJsZSAoaW4gd2hpY2ggY2FzZSBuaW5lIGJpdHMgaW4KLXRoZSBhYm92ZSBleGFtcGxlIGFyZSBnb2JibGVkKSwgb3IgaXQgY29udGFpbnMgdGhlIHRyYW5zbGF0aW9uIGZvciB0aGUgc3ltYm9sCi1hbmQgdGhlIG51bWJlciBvZiBiaXRzIHRvIGdvYmJsZS4gIFRoZW4geW91IHN0YXJ0IGFnYWluIHdpdGggdGhlIG5leHQKLXVuZ29iYmxlZCBiaXQuCi0KLVlvdSBtYXkgd29uZGVyOiB3aHkgbm90IGp1c3QgaGF2ZSBvbmUgbG9va3VwIHRhYmxlIGZvciBob3cgZXZlciBtYW55IGJpdHMgdGhlCi1sb25nZXN0IHN5bWJvbCBpcz8gIFRoZSByZWFzb24gaXMgdGhhdCBpZiB5b3UgZG8gdGhhdCwgeW91IGVuZCB1cCBzcGVuZGluZwotbW9yZSB0aW1lIGZpbGxpbmcgaW4gZHVwbGljYXRlIHN5bWJvbCBlbnRyaWVzIHRoYW4geW91IGRvIGFjdHVhbGx5IGRlY29kaW5nLgotQXQgbGVhc3QgZm9yIGRlZmxhdGUncyBvdXRwdXQgdGhhdCBnZW5lcmF0ZXMgbmV3IHRyZWVzIGV2ZXJ5IHNldmVyYWwgMTAncyBvZgota2J5dGVzLiAgWW91IGNhbiBpbWFnaW5lIHRoYXQgZmlsbGluZyBpbiBhIDJeMTUgZW50cnkgdGFibGUgZm9yIGEgMTUtYml0IGNvZGUKLXdvdWxkIHRha2UgdG9vIGxvbmcgaWYgeW91J3JlIG9ubHkgZGVjb2Rpbmcgc2V2ZXJhbCB0aG91c2FuZCBzeW1ib2xzLiAgQXQgdGhlCi1vdGhlciBleHRyZW1lLCB5b3UgY291bGQgbWFrZSBhIG5ldyB0YWJsZSBmb3IgZXZlcnkgYml0IGluIHRoZSBjb2RlLiAgSW4gZmFjdCwKLXRoYXQncyBlc3NlbnRpYWxseSBhIEh1ZmZtYW4gdHJlZS4gIEJ1dCB0aGVuIHlvdSBzcGVuZCB0b28gbXVjaCB0aW1lCi10cmF2ZXJzaW5nIHRoZSB0cmVlIHdoaWxlIGRlY29kaW5nLCBldmVuIGZvciBzaG9ydCBzeW1ib2xzLgotCi1TbyB0aGUgbnVtYmVyIG9mIGJpdHMgZm9yIHRoZSBmaXJzdCBsb29rdXAgdGFibGUgaXMgYSB0cmFkZSBvZiB0aGUgdGltZSB0bwotZmlsbCBvdXQgdGhlIHRhYmxlIHZzLiB0aGUgdGltZSBzcGVudCBsb29raW5nIGF0IHRoZSBzZWNvbmQgbGV2ZWwgYW5kIGFib3ZlIG9mCi10aGUgdGFibGUuCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSwgc2NhbGVkIGRvd246Ci0KLVRoZSBjb2RlIGJlaW5nIGRlY29kZWQsIHdpdGggMTAgc3ltYm9scywgZnJvbSAxIHRvIDYgYml0cyBsb25nOgotCi1BOiAwCi1COiAxMAotQzogMTEwMAotRDogMTEwMTAKLUU6IDExMDExCi1GOiAxMTEwMAotRzogMTExMDEKLUg6IDExMTEwCi1JOiAxMTExMTAKLUo6IDExMTExMQotCi1MZXQncyBtYWtlIHRoZSBmaXJzdCB0YWJsZSB0aHJlZSBiaXRzIGxvbmcgKGVpZ2h0IGVudHJpZXMpOgotCi0wMDA6IEEsMQotMDAxOiBBLDEKLTAxMDogQSwxCi0wMTE6IEEsMQotMTAwOiBCLDIKLTEwMTogQiwyCi0xMTA6IC0+IHRhYmxlIFggKGdvYmJsZSAzIGJpdHMpCi0xMTE6IC0+IHRhYmxlIFkgKGdvYmJsZSAzIGJpdHMpCi0KLUVhY2ggZW50cnkgaXMgd2hhdCB0aGUgYml0cyBkZWNvZGUgYXMgYW5kIGhvdyBtYW55IGJpdHMgdGhhdCBpcywgaS5lLiBob3cKLW1hbnkgYml0cyB0byBnb2JibGUuICBPciB0aGUgZW50cnkgcG9pbnRzIHRvIGFub3RoZXIgdGFibGUsIHdpdGggdGhlIG51bWJlciBvZgotYml0cyB0byBnb2JibGUgaW1wbGljaXQgaW4gdGhlIHNpemUgb2YgdGhlIHRhYmxlLgotCi1UYWJsZSBYIGlzIHR3byBiaXRzIGxvbmcgc2luY2UgdGhlIGxvbmdlc3QgY29kZSBzdGFydGluZyB3aXRoIDExMCBpcyBmaXZlIGJpdHMKLWxvbmc6Ci0KLTAwOiBDLDEKLTAxOiBDLDEKLTEwOiBELDIKLTExOiBFLDIKLQotVGFibGUgWSBpcyB0aHJlZSBiaXRzIGxvbmcgc2luY2UgdGhlIGxvbmdlc3QgY29kZSBzdGFydGluZyB3aXRoIDExMSBpcyBzaXgKLWJpdHMgbG9uZzoKLQotMDAwOiBGLDIKLTAwMTogRiwyCi0wMTA6IEcsMgotMDExOiBHLDIKLTEwMDogSCwyCi0xMDE6IEgsMgotMTEwOiBJLDMKLTExMTogSiwzCi0KLVNvIHdoYXQgd2UgaGF2ZSBoZXJlIGFyZSB0aHJlZSB0YWJsZXMgd2l0aCBhIHRvdGFsIG9mIDIwIGVudHJpZXMgdGhhdCBoYWQgdG8KLWJlIGNvbnN0cnVjdGVkLiAgVGhhdCdzIGNvbXBhcmVkIHRvIDY0IGVudHJpZXMgZm9yIGEgc2luZ2xlIHRhYmxlLiAgT3IKLWNvbXBhcmVkIHRvIDE2IGVudHJpZXMgZm9yIGEgSHVmZm1hbiB0cmVlIChzaXggdHdvIGVudHJ5IHRhYmxlcyBhbmQgb25lIGZvdXIKLWVudHJ5IHRhYmxlKS4gIEFzc3VtaW5nIHRoYXQgdGhlIGNvZGUgaWRlYWxseSByZXByZXNlbnRzIHRoZSBwcm9iYWJpbGl0eSBvZgotdGhlIHN5bWJvbHMsIGl0IHRha2VzIG9uIHRoZSBhdmVyYWdlIDEuMjUgbG9va3VwcyBwZXIgc3ltYm9sLiAgVGhhdCdzIGNvbXBhcmVkCi10byBvbmUgbG9va3VwIGZvciB0aGUgc2luZ2xlIHRhYmxlLCBvciAxLjY2IGxvb2t1cHMgcGVyIHN5bWJvbCBmb3IgdGhlCi1IdWZmbWFuIHRyZWUuCi0KLVRoZXJlLCBJIHRoaW5rIHRoYXQgZ2l2ZXMgeW91IGEgcGljdHVyZSBvZiB3aGF0J3MgZ29pbmcgb24uICBGb3IgaW5mbGF0ZSwgdGhlCi1tZWFuaW5nIG9mIGEgcGFydGljdWxhciBzeW1ib2wgaXMgb2Z0ZW4gbW9yZSB0aGFuIGp1c3QgYSBsZXR0ZXIuICBJdCBjYW4gYmUgYQotYnl0ZSAoYSAibGl0ZXJhbCIpLCBvciBpdCBjYW4gYmUgZWl0aGVyIGEgbGVuZ3RoIG9yIGEgZGlzdGFuY2Ugd2hpY2gKLWluZGljYXRlcyBhIGJhc2UgdmFsdWUgYW5kIGEgbnVtYmVyIG9mIGJpdHMgdG8gZmV0Y2ggYWZ0ZXIgdGhlIGNvZGUgdGhhdCBpcwotYWRkZWQgdG8gdGhlIGJhc2UgdmFsdWUuICBPciBpdCBtaWdodCBiZSB0aGUgc3BlY2lhbCBlbmQtb2YtYmxvY2sgY29kZS4gIFRoZQotZGF0YSBzdHJ1Y3R1cmVzIGNyZWF0ZWQgaW4gaW5mdHJlZXMuYyB0cnkgdG8gZW5jb2RlIGFsbCB0aGF0IGluZm9ybWF0aW9uCi1jb21wYWN0bHkgaW4gdGhlIHRhYmxlcy4KLQotCi1KZWFuLWxvdXAgR2FpbGx5ICAgICAgICBNYXJrIEFkbGVyCi1qbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ci0KLQotUmVmZXJlbmNlczoKLQotW0xaNzddIFppdiBKLiwgTGVtcGVsIEEuLCBgYEEgVW5pdmVyc2FsIEFsZ29yaXRobSBmb3IgU2VxdWVudGlhbCBEYXRhCi1Db21wcmVzc2lvbiwnJyBJRUVFIFRyYW5zYWN0aW9ucyBvbiBJbmZvcm1hdGlvbiBUaGVvcnksIFZvbC4gMjMsIE5vLiAzLAotcHAuIDMzNy0zNDMuCi0KLWBgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24nJyBhdmFpbGFibGUgaW4KLWh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5NTEKZGlmZiAtLWdpdCBhL3NyYy96bGliL2RvYy9yZmMxOTUwLnR4dCBiL3NyYy96bGliL2RvYy9yZmMxOTUwLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U2NDI4YS4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9kb2MvcmZjMTk1MC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2MTkgKzAsMCBAQAotCi0KLQotCi0KLQotTmV0d29yayBXb3JraW5nIEdyb3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQLiBEZXV0c2NoCi1SZXF1ZXN0IGZvciBDb21tZW50czogMTk1MCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsYWRkaW4gRW50ZXJwcmlzZXMKLUNhdGVnb3J5OiBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKLUwuIEdhaWxseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8tWklQCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF5IDE5OTYKLQotCi0gICAgICAgICBaTElCIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDMuMwotCi1TdGF0dXMgb2YgVGhpcyBNZW1vCi0KLSAgIFRoaXMgbWVtbyBwcm92aWRlcyBpbmZvcm1hdGlvbiBmb3IgdGhlIEludGVybmV0IGNvbW11bml0eS4gIFRoaXMgbWVtbwotICAgZG9lcyBub3Qgc3BlY2lmeSBhbiBJbnRlcm5ldCBzdGFuZGFyZCBvZiBhbnkga2luZC4gIERpc3RyaWJ1dGlvbiBvZgotICAgdGhpcyBtZW1vIGlzIHVubGltaXRlZC4KLQotSUVTRyBOb3RlOgotCi0gICBUaGUgSUVTRyB0YWtlcyBubyBwb3NpdGlvbiBvbiB0aGUgdmFsaWRpdHkgb2YgYW55IEludGVsbGVjdHVhbAotICAgUHJvcGVydHkgUmlnaHRzIHN0YXRlbWVudHMgY29udGFpbmVkIGluIHRoaXMgZG9jdW1lbnQuCi0KLU5vdGljZXMKLQotICAgQ29weXJpZ2h0IChjKSAxOTk2IEwuIFBldGVyIERldXRzY2ggYW5kIEplYW4tTG91cCBHYWlsbHkKLQotICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBkb2N1bWVudCBmb3IgYW55Ci0gICBwdXJwb3NlIGFuZCB3aXRob3V0IGNoYXJnZSwgaW5jbHVkaW5nIHRyYW5zbGF0aW9ucyBpbnRvIG90aGVyCi0gICBsYW5ndWFnZXMgYW5kIGluY29ycG9yYXRpb24gaW50byBjb21waWxhdGlvbnMsIHByb3ZpZGVkIHRoYXQgdGhlCi0gICBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLCBhbmQgdGhhdCBhbnkKLSAgIHN1YnN0YW50aXZlIGNoYW5nZXMgb3IgZGVsZXRpb25zIGZyb20gdGhlIG9yaWdpbmFsIGFyZSBjbGVhcmx5Ci0gICBtYXJrZWQuCi0KLSAgIEEgcG9pbnRlciB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uIGluCi0gICBIVE1MIGZvcm1hdCBjYW4gYmUgZm91bmQgYXQgdGhlIFVSTAotICAgPGZ0cDovL2Z0cC51dS5uZXQvZ3JhcGhpY3MvcG5nL2RvY3VtZW50cy96bGliL3pkb2MtaW5kZXguaHRtbD4uCi0KLUFic3RyYWN0Ci0KLSAgIFRoaXMgc3BlY2lmaWNhdGlvbiBkZWZpbmVzIGEgbG9zc2xlc3MgY29tcHJlc3NlZCBkYXRhIGZvcm1hdC4gIFRoZQotICAgZGF0YSBjYW4gYmUgcHJvZHVjZWQgb3IgY29uc3VtZWQsIGV2ZW4gZm9yIGFuIGFyYml0cmFyaWx5IGxvbmcKLSAgIHNlcXVlbnRpYWxseSBwcmVzZW50ZWQgaW5wdXQgZGF0YSBzdHJlYW0sIHVzaW5nIG9ubHkgYW4gYSBwcmlvcmkKLSAgIGJvdW5kZWQgYW1vdW50IG9mIGludGVybWVkaWF0ZSBzdG9yYWdlLiAgVGhlIGZvcm1hdCBwcmVzZW50bHkgdXNlcwotICAgdGhlIERFRkxBVEUgY29tcHJlc3Npb24gbWV0aG9kIGJ1dCBjYW4gYmUgZWFzaWx5IGV4dGVuZGVkIHRvIHVzZQotICAgb3RoZXIgY29tcHJlc3Npb24gbWV0aG9kcy4gIEl0IGNhbiBiZSBpbXBsZW1lbnRlZCByZWFkaWx5IGluIGEgbWFubmVyCi0gICBub3QgY292ZXJlZCBieSBwYXRlbnRzLiAgVGhpcyBzcGVjaWZpY2F0aW9uIGFsc28gZGVmaW5lcyB0aGUgQURMRVItMzIKLSAgIGNoZWNrc3VtIChhbiBleHRlbnNpb24gYW5kIGltcHJvdmVtZW50IG9mIHRoZSBGbGV0Y2hlciBjaGVja3N1bSksCi0gICB1c2VkIGZvciBkZXRlY3Rpb24gb2YgZGF0YSBjb3JydXB0aW9uLCBhbmQgcHJvdmlkZXMgYW4gYWxnb3JpdGhtIGZvcgotICAgY29tcHV0aW5nIGl0LgotCi0KLQotCi1EZXV0c2NoICYgR2FpbGx5ICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgMV0KLQwKLVJGQyAxOTUwICAgICAgIFpMSUIgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICBNYXkgMTk5NgotCi0KLVRhYmxlIG9mIENvbnRlbnRzCi0KLSAgIDEuIEludHJvZHVjdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMgotICAgICAgMS4xLiBQdXJwb3NlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAyCi0gICAgICAxLjIuIEludGVuZGVkIGF1ZGllbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDMKLSAgICAgIDEuMy4gU2NvcGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMwotICAgICAgMS40LiBDb21wbGlhbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAzCi0gICAgICAxLjUuICBEZWZpbml0aW9ucyBvZiB0ZXJtcyBhbmQgY29udmVudGlvbnMgdXNlZCAuLi4uLi4uLi4uLi4uLi4uIDMKLSAgICAgIDEuNi4gQ2hhbmdlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMwotICAgMi4gRGV0YWlsZWQgc3BlY2lmaWNhdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAzCi0gICAgICAyLjEuIE92ZXJhbGwgY29udmVudGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDMKLSAgICAgIDIuMi4gRGF0YSBmb3JtYXQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gNAotICAgICAgMi4zLiBDb21wbGlhbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA3Ci0gICAzLiBSZWZlcmVuY2VzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDcKLSAgIDQuIFNvdXJjZSBjb2RlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gOAotICAgNS4gU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA4Ci0gICA2LiBBY2tub3dsZWRnZW1lbnRzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDgKLSAgIDcuIEF1dGhvcnMnIEFkZHJlc3NlcyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gOAotICAgOC4gQXBwZW5kaXg6IFJhdGlvbmFsZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA5Ci0gICA5LiBBcHBlbmRpeDogU2FtcGxlIGNvZGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uMTAKLQotMS4gSW50cm9kdWN0aW9uCi0KLSAgIDEuMS4gUHVycG9zZQotCi0gICAgICBUaGUgcHVycG9zZSBvZiB0aGlzIHNwZWNpZmljYXRpb24gaXMgdG8gZGVmaW5lIGEgbG9zc2xlc3MKLSAgICAgIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgdGhhdDoKLQotICAgICAgICAgICogSXMgaW5kZXBlbmRlbnQgb2YgQ1BVIHR5cGUsIG9wZXJhdGluZyBzeXN0ZW0sIGZpbGUgc3lzdGVtLAotICAgICAgICAgICAgYW5kIGNoYXJhY3RlciBzZXQsIGFuZCBoZW5jZSBjYW4gYmUgdXNlZCBmb3IgaW50ZXJjaGFuZ2U7Ci0KLSAgICAgICAgICAqIENhbiBiZSBwcm9kdWNlZCBvciBjb25zdW1lZCwgZXZlbiBmb3IgYW4gYXJiaXRyYXJpbHkgbG9uZwotICAgICAgICAgICAgc2VxdWVudGlhbGx5IHByZXNlbnRlZCBpbnB1dCBkYXRhIHN0cmVhbSwgdXNpbmcgb25seSBhbiBhCi0gICAgICAgICAgICBwcmlvcmkgYm91bmRlZCBhbW91bnQgb2YgaW50ZXJtZWRpYXRlIHN0b3JhZ2UsIGFuZCBoZW5jZSBjYW4KLSAgICAgICAgICAgIGJlIHVzZWQgaW4gZGF0YSBjb21tdW5pY2F0aW9ucyBvciBzaW1pbGFyIHN0cnVjdHVyZXMgc3VjaCBhcwotICAgICAgICAgICAgVW5peCBmaWx0ZXJzOwotCi0gICAgICAgICAgKiBDYW4gdXNlIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBjb21wcmVzc2lvbiBtZXRob2RzOwotCi0gICAgICAgICAgKiBDYW4gYmUgaW1wbGVtZW50ZWQgcmVhZGlseSBpbiBhIG1hbm5lciBub3QgY292ZXJlZCBieQotICAgICAgICAgICAgcGF0ZW50cywgYW5kIGhlbmNlIGNhbiBiZSBwcmFjdGljZWQgZnJlZWx5LgotCi0gICAgICBUaGUgZGF0YSBmb3JtYXQgZGVmaW5lZCBieSB0aGlzIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYXR0ZW1wdCB0bwotICAgICAgYWxsb3cgcmFuZG9tIGFjY2VzcyB0byBjb21wcmVzc2VkIGRhdGEuCi0KLQotCi0KLQotCi0KLURldXRzY2ggJiBHYWlsbHkgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSAyXQotDAotUkZDIDE5NTAgICAgICAgWkxJQiBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICAgIE1heSAxOTk2Ci0KLQotICAgMS4yLiBJbnRlbmRlZCBhdWRpZW5jZQotCi0gICAgICBUaGlzIHNwZWNpZmljYXRpb24gaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBpbXBsZW1lbnRvcnMgb2Ygc29mdHdhcmUKLSAgICAgIHRvIGNvbXByZXNzIGRhdGEgaW50byB6bGliIGZvcm1hdCBhbmQvb3IgZGVjb21wcmVzcyBkYXRhIGZyb20gemxpYgotICAgICAgZm9ybWF0LgotCi0gICAgICBUaGUgdGV4dCBvZiB0aGUgc3BlY2lmaWNhdGlvbiBhc3N1bWVzIGEgYmFzaWMgYmFja2dyb3VuZCBpbgotICAgICAgcHJvZ3JhbW1pbmcgYXQgdGhlIGxldmVsIG9mIGJpdHMgYW5kIG90aGVyIHByaW1pdGl2ZSBkYXRhCi0gICAgICByZXByZXNlbnRhdGlvbnMuCi0KLSAgIDEuMy4gU2NvcGUKLQotICAgICAgVGhlIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCB0aGF0IGNhbiBiZQotICAgICAgdXNlZCBmb3IgaW4tbWVtb3J5IGNvbXByZXNzaW9uIG9mIGEgc2VxdWVuY2Ugb2YgYXJiaXRyYXJ5IGJ5dGVzLgotCi0gICAxLjQuIENvbXBsaWFuY2UKLQotICAgICAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIGEgY29tcGxpYW50IGRlY29tcHJlc3NvciBtdXN0IGJlCi0gICAgICBhYmxlIHRvIGFjY2VwdCBhbmQgZGVjb21wcmVzcyBhbnkgZGF0YSBzZXQgdGhhdCBjb25mb3JtcyB0byBhbGwKLSAgICAgIHRoZSBzcGVjaWZpY2F0aW9ucyBwcmVzZW50ZWQgaGVyZTsgYSBjb21wbGlhbnQgY29tcHJlc3NvciBtdXN0Ci0gICAgICBwcm9kdWNlIGRhdGEgc2V0cyB0aGF0IGNvbmZvcm0gdG8gYWxsIHRoZSBzcGVjaWZpY2F0aW9ucyBwcmVzZW50ZWQKLSAgICAgIGhlcmUuCi0KLSAgIDEuNS4gIERlZmluaXRpb25zIG9mIHRlcm1zIGFuZCBjb252ZW50aW9ucyB1c2VkCi0KLSAgICAgIGJ5dGU6IDggYml0cyBzdG9yZWQgb3IgdHJhbnNtaXR0ZWQgYXMgYSB1bml0IChzYW1lIGFzIGFuIG9jdGV0KS4KLSAgICAgIChGb3IgdGhpcyBzcGVjaWZpY2F0aW9uLCBhIGJ5dGUgaXMgZXhhY3RseSA4IGJpdHMsIGV2ZW4gb24KLSAgICAgIG1hY2hpbmVzIHdoaWNoIHN0b3JlIGEgY2hhcmFjdGVyIG9uIGEgbnVtYmVyIG9mIGJpdHMgZGlmZmVyZW50Ci0gICAgICBmcm9tIDguKSBTZWUgYmVsb3csIGZvciB0aGUgbnVtYmVyaW5nIG9mIGJpdHMgd2l0aGluIGEgYnl0ZS4KLQotICAgMS42LiBDaGFuZ2VzIGZyb20gcHJldmlvdXMgdmVyc2lvbnMKLQotICAgICAgVmVyc2lvbiAzLjEgd2FzIHRoZSBmaXJzdCBwdWJsaWMgcmVsZWFzZSBvZiB0aGlzIHNwZWNpZmljYXRpb24uCi0gICAgICBJbiB2ZXJzaW9uIDMuMiwgc29tZSB0ZXJtaW5vbG9neSB3YXMgY2hhbmdlZCBhbmQgdGhlIEFkbGVyLTMyCi0gICAgICBzYW1wbGUgY29kZSB3YXMgcmV3cml0dGVuIGZvciBjbGFyaXR5LiAgSW4gdmVyc2lvbiAzLjMsIHRoZQotICAgICAgc3VwcG9ydCBmb3IgYSBwcmVzZXQgZGljdGlvbmFyeSB3YXMgaW50cm9kdWNlZCwgYW5kIHRoZQotICAgICAgc3BlY2lmaWNhdGlvbiB3YXMgY29udmVydGVkIHRvIFJGQyBzdHlsZS4KLQotMi4gRGV0YWlsZWQgc3BlY2lmaWNhdGlvbgotCi0gICAyLjEuIE92ZXJhbGwgY29udmVudGlvbnMKLQotICAgICAgSW4gdGhlIGRpYWdyYW1zIGJlbG93LCBhIGJveCBsaWtlIHRoaXM6Ci0KLSAgICAgICAgICstLS0rCi0gICAgICAgICB8ICAgfCA8LS0gdGhlIHZlcnRpY2FsIGJhcnMgbWlnaHQgYmUgbWlzc2luZwotICAgICAgICAgKy0tLSsKLQotCi0KLQotRGV1dHNjaCAmIEdhaWxseSAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDNdCi0MCi1SRkMgMTk1MCAgICAgICBaTElCIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgTWF5IDE5OTYKLQotCi0gICAgICByZXByZXNlbnRzIG9uZSBieXRlOyBhIGJveCBsaWtlIHRoaXM6Ci0KLSAgICAgICAgICs9PT09PT09PT09PT09PSsKLSAgICAgICAgIHwgICAgICAgICAgICAgIHwKLSAgICAgICAgICs9PT09PT09PT09PT09PSsKLQotICAgICAgcmVwcmVzZW50cyBhIHZhcmlhYmxlIG51bWJlciBvZiBieXRlcy4KLQotICAgICAgQnl0ZXMgc3RvcmVkIHdpdGhpbiBhIGNvbXB1dGVyIGRvIG5vdCBoYXZlIGEgImJpdCBvcmRlciIsIHNpbmNlCi0gICAgICB0aGV5IGFyZSBhbHdheXMgdHJlYXRlZCBhcyBhIHVuaXQuICBIb3dldmVyLCBhIGJ5dGUgY29uc2lkZXJlZCBhcwotICAgICAgYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDI1NSBkb2VzIGhhdmUgYSBtb3N0LSBhbmQgbGVhc3QtCi0gICAgICBzaWduaWZpY2FudCBiaXQsIGFuZCBzaW5jZSB3ZSB3cml0ZSBudW1iZXJzIHdpdGggdGhlIG1vc3QtCi0gICAgICBzaWduaWZpY2FudCBkaWdpdCBvbiB0aGUgbGVmdCwgd2UgYWxzbyB3cml0ZSBieXRlcyB3aXRoIHRoZSBtb3N0LQotICAgICAgc2lnbmlmaWNhbnQgYml0IG9uIHRoZSBsZWZ0LiAgSW4gdGhlIGRpYWdyYW1zIGJlbG93LCB3ZSBudW1iZXIgdGhlCi0gICAgICBiaXRzIG9mIGEgYnl0ZSBzbyB0aGF0IGJpdCAwIGlzIHRoZSBsZWFzdC1zaWduaWZpY2FudCBiaXQsIGkuZS4sCi0gICAgICB0aGUgYml0cyBhcmUgbnVtYmVyZWQ6Ci0KLSAgICAgICAgICstLS0tLS0tLSsKLSAgICAgICAgIHw3NjU0MzIxMHwKLSAgICAgICAgICstLS0tLS0tLSsKLQotICAgICAgV2l0aGluIGEgY29tcHV0ZXIsIGEgbnVtYmVyIG1heSBvY2N1cHkgbXVsdGlwbGUgYnl0ZXMuICBBbGwKLSAgICAgIG11bHRpLWJ5dGUgbnVtYmVycyBpbiB0aGUgZm9ybWF0IGRlc2NyaWJlZCBoZXJlIGFyZSBzdG9yZWQgd2l0aAotICAgICAgdGhlIE1PU1Qtc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAoYXQgdGhlIGxvd2VyIG1lbW9yeSBhZGRyZXNzKS4KLSAgICAgIEZvciBleGFtcGxlLCB0aGUgZGVjaW1hbCBudW1iZXIgNTIwIGlzIHN0b3JlZCBhczoKLQotICAgICAgICAgICAgIDAgICAgIDEKLSAgICAgICAgICstLS0tLS0tLSstLS0tLS0tLSsKLSAgICAgICAgIHwwMDAwMDAxMHwwMDAwMTAwMHwKLSAgICAgICAgICstLS0tLS0tLSstLS0tLS0tLSsKLSAgICAgICAgICBeICAgICAgICBeCi0gICAgICAgICAgfCAgICAgICAgfAotICAgICAgICAgIHwgICAgICAgICsgbGVzcyBzaWduaWZpY2FudCBieXRlID0gOAotICAgICAgICAgICsgbW9yZSBzaWduaWZpY2FudCBieXRlID0gMiB4IDI1NgotCi0gICAyLjIuIERhdGEgZm9ybWF0Ci0KLSAgICAgIEEgemxpYiBzdHJlYW0gaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotCi0gICAgICAgICAgIDAgICAxCi0gICAgICAgICArLS0tKy0tLSsKLSAgICAgICAgIHxDTUZ8RkxHfCAgIChtb3JlLS0+KQotICAgICAgICAgKy0tLSstLS0rCi0KLQotCi0KLQotCi0KLQotRGV1dHNjaCAmIEdhaWxseSAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDRdCi0MCi1SRkMgMTk1MCAgICAgICBaTElCIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgTWF5IDE5OTYKLQotCi0gICAgICAoaWYgRkxHLkZESUNUIHNldCkKLQotICAgICAgICAgICAwICAgMSAgIDIgICAzCi0gICAgICAgICArLS0tKy0tLSstLS0rLS0tKwotICAgICAgICAgfCAgICAgRElDVElEICAgIHwgICAobW9yZS0tPikKLSAgICAgICAgICstLS0rLS0tKy0tLSstLS0rCi0KLSAgICAgICAgICs9PT09PT09PT09PT09PT09PT09PT0rLS0tKy0tLSstLS0rLS0tKwotICAgICAgICAgfC4uLmNvbXByZXNzZWQgZGF0YS4uLnwgICAgQURMRVIzMiAgICB8Ci0gICAgICAgICArPT09PT09PT09PT09PT09PT09PT09Ky0tLSstLS0rLS0tKy0tLSsKLQotICAgICAgQW55IGRhdGEgd2hpY2ggbWF5IGFwcGVhciBhZnRlciBBRExFUjMyIGFyZSBub3QgcGFydCBvZiB0aGUgemxpYgotICAgICAgc3RyZWFtLgotCi0gICAgICBDTUYgKENvbXByZXNzaW9uIE1ldGhvZCBhbmQgZmxhZ3MpCi0gICAgICAgICBUaGlzIGJ5dGUgaXMgZGl2aWRlZCBpbnRvIGEgNC1iaXQgY29tcHJlc3Npb24gbWV0aG9kIGFuZCBhIDQtCi0gICAgICAgICBiaXQgaW5mb3JtYXRpb24gZmllbGQgZGVwZW5kaW5nIG9uIHRoZSBjb21wcmVzc2lvbiBtZXRob2QuCi0KLSAgICAgICAgICAgIGJpdHMgMCB0byAzICBDTSAgICAgQ29tcHJlc3Npb24gbWV0aG9kCi0gICAgICAgICAgICBiaXRzIDQgdG8gNyAgQ0lORk8gIENvbXByZXNzaW9uIGluZm8KLQotICAgICAgQ00gKENvbXByZXNzaW9uIG1ldGhvZCkKLSAgICAgICAgIFRoaXMgaWRlbnRpZmllcyB0aGUgY29tcHJlc3Npb24gbWV0aG9kIHVzZWQgaW4gdGhlIGZpbGUuIENNID0gOAotICAgICAgICAgZGVub3RlcyB0aGUgImRlZmxhdGUiIGNvbXByZXNzaW9uIG1ldGhvZCB3aXRoIGEgd2luZG93IHNpemUgdXAKLSAgICAgICAgIHRvIDMySy4gIFRoaXMgaXMgdGhlIG1ldGhvZCB1c2VkIGJ5IGd6aXAgYW5kIFBORyAoc2VlCi0gICAgICAgICByZWZlcmVuY2VzIFsxXSBhbmQgWzJdIGluIENoYXB0ZXIgMywgYmVsb3csIGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICAgICBkb2N1bWVudHMpLiAgQ00gPSAxNSBpcyByZXNlcnZlZC4gIEl0IG1pZ2h0IGJlIHVzZWQgaW4gYSBmdXR1cmUKLSAgICAgICAgIHZlcnNpb24gb2YgdGhpcyBzcGVjaWZpY2F0aW9uIHRvIGluZGljYXRlIHRoZSBwcmVzZW5jZSBvZiBhbgotICAgICAgICAgZXh0cmEgZmllbGQgYmVmb3JlIHRoZSBjb21wcmVzc2VkIGRhdGEuCi0KLSAgICAgIENJTkZPIChDb21wcmVzc2lvbiBpbmZvKQotICAgICAgICAgRm9yIENNID0gOCwgQ0lORk8gaXMgdGhlIGJhc2UtMiBsb2dhcml0aG0gb2YgdGhlIExaNzcgd2luZG93Ci0gICAgICAgICBzaXplLCBtaW51cyBlaWdodCAoQ0lORk89NyBpbmRpY2F0ZXMgYSAzMksgd2luZG93IHNpemUpLiBWYWx1ZXMKLSAgICAgICAgIG9mIENJTkZPIGFib3ZlIDcgYXJlIG5vdCBhbGxvd2VkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUKLSAgICAgICAgIHNwZWNpZmljYXRpb24uICBDSU5GTyBpcyBub3QgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9yCi0gICAgICAgICBDTSBub3QgZXF1YWwgdG8gOC4KLQotICAgICAgRkxHIChGTGFHcykKLSAgICAgICAgIFRoaXMgZmxhZyBieXRlIGlzIGRpdmlkZWQgYXMgZm9sbG93czoKLQotICAgICAgICAgICAgYml0cyAwIHRvIDQgIEZDSEVDSyAgKGNoZWNrIGJpdHMgZm9yIENNRiBhbmQgRkxHKQotICAgICAgICAgICAgYml0ICA1ICAgICAgIEZESUNUICAgKHByZXNldCBkaWN0aW9uYXJ5KQotICAgICAgICAgICAgYml0cyA2IHRvIDcgIEZMRVZFTCAgKGNvbXByZXNzaW9uIGxldmVsKQotCi0gICAgICAgICBUaGUgRkNIRUNLIHZhbHVlIG11c3QgYmUgc3VjaCB0aGF0IENNRiBhbmQgRkxHLCB3aGVuIHZpZXdlZCBhcwotICAgICAgICAgYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciBzdG9yZWQgaW4gTVNCIG9yZGVyIChDTUYqMjU2ICsgRkxHKSwKLSAgICAgICAgIGlzIGEgbXVsdGlwbGUgb2YgMzEuCi0KLQotCi0KLURldXRzY2ggJiBHYWlsbHkgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA1XQotDAotUkZDIDE5NTAgICAgICAgWkxJQiBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICAgIE1heSAxOTk2Ci0KLQotICAgICAgRkRJQ1QgKFByZXNldCBkaWN0aW9uYXJ5KQotICAgICAgICAgSWYgRkRJQ1QgaXMgc2V0LCBhIERJQ1QgZGljdGlvbmFyeSBpZGVudGlmaWVyIGlzIHByZXNlbnQKLSAgICAgICAgIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBGTEcgYnl0ZS4gVGhlIGRpY3Rpb25hcnkgaXMgYSBzZXF1ZW5jZSBvZgotICAgICAgICAgYnl0ZXMgd2hpY2ggYXJlIGluaXRpYWxseSBmZWQgdG8gdGhlIGNvbXByZXNzb3Igd2l0aG91dAotICAgICAgICAgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC4gRElDVCBpcyB0aGUgQWRsZXItMzIgY2hlY2tzdW0KLSAgICAgICAgIG9mIHRoaXMgc2VxdWVuY2Ugb2YgYnl0ZXMgKHNlZSB0aGUgZGVmaW5pdGlvbiBvZiBBRExFUjMyCi0gICAgICAgICBiZWxvdykuICBUaGUgZGVjb21wcmVzc29yIGNhbiB1c2UgdGhpcyBpZGVudGlmaWVyIHRvIGRldGVybWluZQotICAgICAgICAgd2hpY2ggZGljdGlvbmFyeSBoYXMgYmVlbiB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLgotCi0gICAgICBGTEVWRUwgKENvbXByZXNzaW9uIGxldmVsKQotICAgICAgICAgVGhlc2UgZmxhZ3MgYXJlIGF2YWlsYWJsZSBmb3IgdXNlIGJ5IHNwZWNpZmljIGNvbXByZXNzaW9uCi0gICAgICAgICBtZXRob2RzLiAgVGhlICJkZWZsYXRlIiBtZXRob2QgKENNID0gOCkgc2V0cyB0aGVzZSBmbGFncyBhcwotICAgICAgICAgZm9sbG93czoKLQotICAgICAgICAgICAgMCAtIGNvbXByZXNzb3IgdXNlZCBmYXN0ZXN0IGFsZ29yaXRobQotICAgICAgICAgICAgMSAtIGNvbXByZXNzb3IgdXNlZCBmYXN0IGFsZ29yaXRobQotICAgICAgICAgICAgMiAtIGNvbXByZXNzb3IgdXNlZCBkZWZhdWx0IGFsZ29yaXRobQotICAgICAgICAgICAgMyAtIGNvbXByZXNzb3IgdXNlZCBtYXhpbXVtIGNvbXByZXNzaW9uLCBzbG93ZXN0IGFsZ29yaXRobQotCi0gICAgICAgICBUaGUgaW5mb3JtYXRpb24gaW4gRkxFVkVMIGlzIG5vdCBuZWVkZWQgZm9yIGRlY29tcHJlc3Npb247IGl0Ci0gICAgICAgICBpcyB0aGVyZSB0byBpbmRpY2F0ZSBpZiByZWNvbXByZXNzaW9uIG1pZ2h0IGJlIHdvcnRod2hpbGUuCi0KLSAgICAgIGNvbXByZXNzZWQgZGF0YQotICAgICAgICAgRm9yIGNvbXByZXNzaW9uIG1ldGhvZCA4LCB0aGUgY29tcHJlc3NlZCBkYXRhIGlzIHN0b3JlZCBpbiB0aGUKLSAgICAgICAgIGRlZmxhdGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCBhcyBkZXNjcmliZWQgaW4gdGhlIGRvY3VtZW50Ci0gICAgICAgICAiREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24iIGJ5IEwuIFBldGVyCi0gICAgICAgICBEZXV0c2NoLiAoU2VlIHJlZmVyZW5jZSBbM10gaW4gQ2hhcHRlciAzLCBiZWxvdykKLQotICAgICAgICAgT3RoZXIgY29tcHJlc3NlZCBkYXRhIGZvcm1hdHMgYXJlIG5vdCBzcGVjaWZpZWQgaW4gdGhpcyB2ZXJzaW9uCi0gICAgICAgICBvZiB0aGUgemxpYiBzcGVjaWZpY2F0aW9uLgotCi0gICAgICBBRExFUjMyIChBZGxlci0zMiBjaGVja3N1bSkKLSAgICAgICAgIFRoaXMgY29udGFpbnMgYSBjaGVja3N1bSB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEKLSAgICAgICAgIChleGNsdWRpbmcgYW55IGRpY3Rpb25hcnkgZGF0YSkgY29tcHV0ZWQgYWNjb3JkaW5nIHRvIEFkbGVyLTMyCi0gICAgICAgICBhbGdvcml0aG0uIFRoaXMgYWxnb3JpdGhtIGlzIGEgMzItYml0IGV4dGVuc2lvbiBhbmQgaW1wcm92ZW1lbnQKLSAgICAgICAgIG9mIHRoZSBGbGV0Y2hlciBhbGdvcml0aG0sIHVzZWQgaW4gdGhlIElUVS1UIFguMjI0IC8gSVNPIDgwNzMKLSAgICAgICAgIHN0YW5kYXJkLiBTZWUgcmVmZXJlbmNlcyBbNF0gYW5kIFs1XSBpbiBDaGFwdGVyIDMsIGJlbG93KQotCi0gICAgICAgICBBZGxlci0zMiBpcyBjb21wb3NlZCBvZiB0d28gc3VtcyBhY2N1bXVsYXRlZCBwZXIgYnl0ZTogczEgaXMKLSAgICAgICAgIHRoZSBzdW0gb2YgYWxsIGJ5dGVzLCBzMiBpcyB0aGUgc3VtIG9mIGFsbCBzMSB2YWx1ZXMuIEJvdGggc3VtcwotICAgICAgICAgYXJlIGRvbmUgbW9kdWxvIDY1NTIxLiBzMSBpcyBpbml0aWFsaXplZCB0byAxLCBzMiB0byB6ZXJvLiAgVGhlCi0gICAgICAgICBBZGxlci0zMiBjaGVja3N1bSBpcyBzdG9yZWQgYXMgczIqNjU1MzYgKyBzMSBpbiBtb3N0LQotICAgICAgICAgc2lnbmlmaWNhbnQtYnl0ZSBmaXJzdCAobmV0d29yaykgb3JkZXIuCi0KLQotCi0KLQotCi0KLQotRGV1dHNjaCAmIEdhaWxseSAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDZdCi0MCi1SRkMgMTk1MCAgICAgICBaTElCIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgTWF5IDE5OTYKLQotCi0gICAyLjMuIENvbXBsaWFuY2UKLQotICAgICAgQSBjb21wbGlhbnQgY29tcHJlc3NvciBtdXN0IHByb2R1Y2Ugc3RyZWFtcyB3aXRoIGNvcnJlY3QgQ01GLCBGTEcKLSAgICAgIGFuZCBBRExFUjMyLCBidXQgbmVlZCBub3Qgc3VwcG9ydCBwcmVzZXQgZGljdGlvbmFyaWVzLiAgV2hlbiB0aGUKLSAgICAgIHpsaWIgZGF0YSBmb3JtYXQgaXMgdXNlZCBhcyBwYXJ0IG9mIGFub3RoZXIgc3RhbmRhcmQgZGF0YSBmb3JtYXQsCi0gICAgICB0aGUgY29tcHJlc3NvciBtYXkgdXNlIG9ubHkgcHJlc2V0IGRpY3Rpb25hcmllcyB0aGF0IGFyZSBzcGVjaWZpZWQKLSAgICAgIGJ5IHRoaXMgb3RoZXIgZGF0YSBmb3JtYXQuICBJZiB0aGlzIG90aGVyIGZvcm1hdCBkb2VzIG5vdCB1c2UgdGhlCi0gICAgICBwcmVzZXQgZGljdGlvbmFyeSBmZWF0dXJlLCB0aGUgY29tcHJlc3NvciBtdXN0IG5vdCBzZXQgdGhlIEZESUNUCi0gICAgICBmbGFnLgotCi0gICAgICBBIGNvbXBsaWFudCBkZWNvbXByZXNzb3IgbXVzdCBjaGVjayBDTUYsIEZMRywgYW5kIEFETEVSMzIsIGFuZAotICAgICAgcHJvdmlkZSBhbiBlcnJvciBpbmRpY2F0aW9uIGlmIGFueSBvZiB0aGVzZSBoYXZlIGluY29ycmVjdCB2YWx1ZXMuCi0gICAgICBBIGNvbXBsaWFudCBkZWNvbXByZXNzb3IgbXVzdCBnaXZlIGFuIGVycm9yIGluZGljYXRpb24gaWYgQ00gaXMKLSAgICAgIG5vdCBvbmUgb2YgdGhlIHZhbHVlcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiAob25seSB0aGUKLSAgICAgIHZhbHVlIDggaXMgcGVybWl0dGVkIGluIHRoaXMgdmVyc2lvbiksIHNpbmNlIGFub3RoZXIgdmFsdWUgY291bGQKLSAgICAgIGluZGljYXRlIHRoZSBwcmVzZW5jZSBvZiBuZXcgZmVhdHVyZXMgdGhhdCB3b3VsZCBjYXVzZSBzdWJzZXF1ZW50Ci0gICAgICBkYXRhIHRvIGJlIGludGVycHJldGVkIGluY29ycmVjdGx5LiAgQSBjb21wbGlhbnQgZGVjb21wcmVzc29yIG11c3QKLSAgICAgIGdpdmUgYW4gZXJyb3IgaW5kaWNhdGlvbiBpZiBGRElDVCBpcyBzZXQgYW5kIERJQ1RJRCBpcyBub3QgdGhlCi0gICAgICBpZGVudGlmaWVyIG9mIGEga25vd24gcHJlc2V0IGRpY3Rpb25hcnkuICBBIGRlY29tcHJlc3NvciBtYXkKLSAgICAgIGlnbm9yZSBGTEVWRUwgYW5kIHN0aWxsIGJlIGNvbXBsaWFudC4gIFdoZW4gdGhlIHpsaWIgZGF0YSBmb3JtYXQKLSAgICAgIGlzIGJlaW5nIHVzZWQgYXMgYSBwYXJ0IG9mIGFub3RoZXIgc3RhbmRhcmQgZm9ybWF0LCBhIGNvbXBsaWFudAotICAgICAgZGVjb21wcmVzc29yIG11c3Qgc3VwcG9ydCBhbGwgdGhlIHByZXNldCBkaWN0aW9uYXJpZXMgc3BlY2lmaWVkIGJ5Ci0gICAgICB0aGUgb3RoZXIgZm9ybWF0LiBXaGVuIHRoZSBvdGhlciBmb3JtYXQgZG9lcyBub3QgdXNlIHRoZSBwcmVzZXQKLSAgICAgIGRpY3Rpb25hcnkgZmVhdHVyZSwgYSBjb21wbGlhbnQgZGVjb21wcmVzc29yIG11c3QgcmVqZWN0IGFueQotICAgICAgc3RyZWFtIGluIHdoaWNoIHRoZSBGRElDVCBmbGFnIGlzIHNldC4KLQotMy4gUmVmZXJlbmNlcwotCi0gICBbMV0gRGV1dHNjaCwgTC5QLiwiR1pJUCBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24iLAotICAgICAgIGF2YWlsYWJsZSBpbiBmdHA6Ly9mdHAudXUubmV0L3B1Yi9hcmNoaXZpbmcvemlwL2RvYy8KLQotICAgWzJdIFRob21hcyBCb3V0ZWxsLCAiUE5HIChQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzKSBzcGVjaWZpY2F0aW9uIiwKLSAgICAgICBhdmFpbGFibGUgaW4gZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzLwotCi0gICBbM10gRGV1dHNjaCwgTC5QLiwiREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24iLAotICAgICAgIGF2YWlsYWJsZSBpbiBmdHA6Ly9mdHAudXUubmV0L3B1Yi9hcmNoaXZpbmcvemlwL2RvYy8KLQotICAgWzRdIEZsZXRjaGVyLCBKLiBHLiwgIkFuIEFyaXRobWV0aWMgQ2hlY2tzdW0gZm9yIFNlcmlhbAotICAgICAgIFRyYW5zbWlzc2lvbnMsIiBJRUVFIFRyYW5zYWN0aW9ucyBvbiBDb21tdW5pY2F0aW9ucywgVm9sLiBDT00tMzAsCi0gICAgICAgTm8uIDEsIEphbnVhcnkgMTk4MiwgcHAuIDI0Ny0yNTIuCi0KLSAgIFs1XSBJVFUtVCBSZWNvbW1lbmRhdGlvbiBYLjIyNCwgQW5uZXggRCwgIkNoZWNrc3VtIEFsZ29yaXRobXMsIgotICAgICAgIE5vdmVtYmVyLCAxOTkzLCBwcC4gMTQ0LCAxNDUuIChBdmFpbGFibGUgZnJvbQotICAgICAgIGdvcGhlcjovL2luZm8uaXR1LmNoKS4gSVRVLVQgWC4yNDQgaXMgYWxzbyB0aGUgc2FtZSBhcyBJU08gODA3My4KLQotCi0KLQotCi0KLQotRGV1dHNjaCAmIEdhaWxseSAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDddCi0MCi1SRkMgMTk1MCAgICAgICBaTElCIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgTWF5IDE5OTYKLQotCi00LiBTb3VyY2UgY29kZQotCi0gICBTb3VyY2UgY29kZSBmb3IgYSBDIGxhbmd1YWdlIGltcGxlbWVudGF0aW9uIG9mIGEgInpsaWIiIGNvbXBsaWFudAotICAgbGlicmFyeSBpcyBhdmFpbGFibGUgYXQgZnRwOi8vZnRwLnV1Lm5ldC9wdWIvYXJjaGl2aW5nL3ppcC96bGliLy4KLQotNS4gU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMKLQotICAgQSBkZWNvZGVyIHRoYXQgZmFpbHMgdG8gY2hlY2sgdGhlIEFETEVSMzIgY2hlY2tzdW0gdmFsdWUgbWF5IGJlCi0gICBzdWJqZWN0IHRvIHVuZGV0ZWN0ZWQgZGF0YSBjb3JydXB0aW9uLgotCi02LiBBY2tub3dsZWRnZW1lbnRzCi0KLSAgIFRyYWRlbWFya3MgY2l0ZWQgaW4gdGhpcyBkb2N1bWVudCBhcmUgdGhlIHByb3BlcnR5IG9mIHRoZWlyCi0gICByZXNwZWN0aXZlIG93bmVycy4KLQotICAgSmVhbi1Mb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlciBkZXNpZ25lZCB0aGUgemxpYiBmb3JtYXQgYW5kIHdyb3RlCi0gICB0aGUgcmVsYXRlZCBzb2Z0d2FyZSBkZXNjcmliZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uLiAgR2xlbm4KLSAgIFJhbmRlcnMtUGVocnNvbiBjb252ZXJ0ZWQgdGhpcyBkb2N1bWVudCB0byBSRkMgYW5kIEhUTUwgZm9ybWF0LgotCi03LiBBdXRob3JzJyBBZGRyZXNzZXMKLQotICAgTC4gUGV0ZXIgRGV1dHNjaAotICAgQWxhZGRpbiBFbnRlcnByaXNlcwotICAgMjAzIFNhbnRhIE1hcmdhcml0YSBBdmUuCi0gICBNZW5sbyBQYXJrLCBDQSA5NDAyNQotCi0gICBQaG9uZTogKDQxNSkgMzIyLTAxMDMgKEFNIG9ubHkpCi0gICBGQVg6ICAgKDQxNSkgMzIyLTE3MzQKLSAgIEVNYWlsOiA8Z2hvc3RAYWxhZGRpbi5jb20+Ci0KLQotICAgSmVhbi1Mb3VwIEdhaWxseQotCi0gICBFTWFpbDogPGd6aXBAcHJlcC5haS5taXQuZWR1PgotCi0gICBRdWVzdGlvbnMgYWJvdXQgdGhlIHRlY2huaWNhbCBjb250ZW50IG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBjYW4gYmUKLSAgIHNlbnQgYnkgZW1haWwgdG8KLQotICAgSmVhbi1Mb3VwIEdhaWxseSA8Z3ppcEBwcmVwLmFpLm1pdC5lZHU+IGFuZAotICAgTWFyayBBZGxlciA8bWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdT4KLQotICAgRWRpdG9yaWFsIGNvbW1lbnRzIG9uIHRoaXMgc3BlY2lmaWNhdGlvbiBjYW4gYmUgc2VudCBieSBlbWFpbCB0bwotCi0gICBMLiBQZXRlciBEZXV0c2NoIDxnaG9zdEBhbGFkZGluLmNvbT4gYW5kCi0gICBHbGVubiBSYW5kZXJzLVBlaHJzb24gPHJhbmRlZ0BhbHVtbmkucnBpLmVkdT4KLQotCi0KLQotCi0KLURldXRzY2ggJiBHYWlsbHkgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA4XQotDAotUkZDIDE5NTAgICAgICAgWkxJQiBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICAgIE1heSAxOTk2Ci0KLQotOC4gQXBwZW5kaXg6IFJhdGlvbmFsZQotCi0gICA4LjEuIFByZXNldCBkaWN0aW9uYXJpZXMKLQotICAgICAgQSBwcmVzZXQgZGljdGlvbmFyeSBpcyBzcGVjaWFsbHkgdXNlZnVsIHRvIGNvbXByZXNzIHNob3J0IGlucHV0Ci0gICAgICBzZXF1ZW5jZXMuIFRoZSBjb21wcmVzc29yIGNhbiB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZGljdGlvbmFyeQotICAgICAgY29udGV4dCB0byBlbmNvZGUgdGhlIGlucHV0IGluIGEgbW9yZSBjb21wYWN0IG1hbm5lci4gVGhlCi0gICAgICBkZWNvbXByZXNzb3IgY2FuIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIGNvbnRleHQgYnkKLSAgICAgIHZpcnR1YWxseSBkZWNvbXByZXNzaW5nIGEgY29tcHJlc3NlZCB2ZXJzaW9uIG9mIHRoZSBkaWN0aW9uYXJ5Ci0gICAgICB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0LiBIb3dldmVyIGZvciBjZXJ0YWluIGNvbXByZXNzaW9uCi0gICAgICBhbGdvcml0aG1zIHN1Y2ggYXMgdGhlIGRlZmxhdGUgYWxnb3JpdGhtIHRoaXMgb3BlcmF0aW9uIGNhbiBiZQotICAgICAgYWNoaWV2ZWQgd2l0aG91dCBhY3R1YWxseSBwZXJmb3JtaW5nIGFueSBkZWNvbXByZXNzaW9uLgotCi0gICAgICBUaGUgY29tcHJlc3NvciBhbmQgdGhlIGRlY29tcHJlc3NvciBtdXN0IHVzZSBleGFjdGx5IHRoZSBzYW1lCi0gICAgICBkaWN0aW9uYXJ5LiBUaGUgZGljdGlvbmFyeSBtYXkgYmUgZml4ZWQgb3IgbWF5IGJlIGNob3NlbiBhbW9uZyBhCi0gICAgICBjZXJ0YWluIG51bWJlciBvZiBwcmVkZWZpbmVkIGRpY3Rpb25hcmllcywgYWNjb3JkaW5nIHRvIHRoZSBraW5kCi0gICAgICBvZiBpbnB1dCBkYXRhLiBUaGUgZGVjb21wcmVzc29yIGNhbiBkZXRlcm1pbmUgd2hpY2ggZGljdGlvbmFyeSBoYXMKLSAgICAgIGJlZW4gY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yIGJ5IGNoZWNraW5nIHRoZSBkaWN0aW9uYXJ5Ci0gICAgICBpZGVudGlmaWVyLiBUaGlzIGRvY3VtZW50IGRvZXMgbm90IHNwZWNpZnkgdGhlIGNvbnRlbnRzIG9mCi0gICAgICBwcmVkZWZpbmVkIGRpY3Rpb25hcmllcywgc2luY2UgdGhlIG9wdGltYWwgZGljdGlvbmFyaWVzIGFyZQotICAgICAgYXBwbGljYXRpb24gc3BlY2lmaWMuIFN0YW5kYXJkIGRhdGEgZm9ybWF0cyB1c2luZyB0aGlzIGZlYXR1cmUgb2YKLSAgICAgIHRoZSB6bGliIHNwZWNpZmljYXRpb24gbXVzdCBwcmVjaXNlbHkgZGVmaW5lIHRoZSBhbGxvd2VkCi0gICAgICBkaWN0aW9uYXJpZXMuCi0KLSAgIDguMi4gVGhlIEFkbGVyLTMyIGFsZ29yaXRobQotCi0gICAgICBUaGUgQWRsZXItMzIgYWxnb3JpdGhtIGlzIG11Y2ggZmFzdGVyIHRoYW4gdGhlIENSQzMyIGFsZ29yaXRobSB5ZXQKLSAgICAgIHN0aWxsIHByb3ZpZGVzIGFuIGV4dHJlbWVseSBsb3cgcHJvYmFiaWxpdHkgb2YgdW5kZXRlY3RlZCBlcnJvcnMuCi0KLSAgICAgIFRoZSBtb2R1bG8gb24gdW5zaWduZWQgbG9uZyBhY2N1bXVsYXRvcnMgY2FuIGJlIGRlbGF5ZWQgZm9yIDU1NTIKLSAgICAgIGJ5dGVzLCBzbyB0aGUgbW9kdWxvIG9wZXJhdGlvbiB0aW1lIGlzIG5lZ2xpZ2libGUuICBJZiB0aGUgYnl0ZXMKLSAgICAgIGFyZSBhLCBiLCBjLCB0aGUgc2Vjb25kIHN1bSBpcyAzYSArIDJiICsgYyArIDMsIGFuZCBzbyBpcyBwb3NpdGlvbgotICAgICAgYW5kIG9yZGVyIHNlbnNpdGl2ZSwgdW5saWtlIHRoZSBmaXJzdCBzdW0sIHdoaWNoIGlzIGp1c3QgYQotICAgICAgY2hlY2tzdW0uICBUaGF0IDY1NTIxIGlzIHByaW1lIGlzIGltcG9ydGFudCB0byBhdm9pZCBhIHBvc3NpYmxlCi0gICAgICBsYXJnZSBjbGFzcyBvZiB0d28tYnl0ZSBlcnJvcnMgdGhhdCBsZWF2ZSB0aGUgY2hlY2sgdW5jaGFuZ2VkLgotICAgICAgKFRoZSBGbGV0Y2hlciBjaGVja3N1bSB1c2VzIDI1NSwgd2hpY2ggaXMgbm90IHByaW1lIGFuZCB3aGljaCBhbHNvCi0gICAgICBtYWtlcyB0aGUgRmxldGNoZXIgY2hlY2sgaW5zZW5zaXRpdmUgdG8gc2luZ2xlIGJ5dGUgY2hhbmdlcyAwIDwtPgotICAgICAgMjU1LikKLQotICAgICAgVGhlIHN1bSBzMSBpcyBpbml0aWFsaXplZCB0byAxIGluc3RlYWQgb2YgemVybyB0byBtYWtlIHRoZSBsZW5ndGgKLSAgICAgIG9mIHRoZSBzZXF1ZW5jZSBwYXJ0IG9mIHMyLCBzbyB0aGF0IHRoZSBsZW5ndGggZG9lcyBub3QgaGF2ZSB0byBiZQotICAgICAgY2hlY2tlZCBzZXBhcmF0ZWx5LiAoQW55IHNlcXVlbmNlIG9mIHplcm9lcyBoYXMgYSBGbGV0Y2hlcgotICAgICAgY2hlY2tzdW0gb2YgemVyby4pCi0KLQotCi0KLQotCi0KLQotRGV1dHNjaCAmIEdhaWxseSAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDldCi0MCi1SRkMgMTk1MCAgICAgICBaTElCIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgTWF5IDE5OTYKLQotCi05LiBBcHBlbmRpeDogU2FtcGxlIGNvZGUKLQotICAgVGhlIGZvbGxvd2luZyBDIGNvZGUgY29tcHV0ZXMgdGhlIEFkbGVyLTMyIGNoZWNrc3VtIG9mIGEgZGF0YSBidWZmZXIuCi0gICBJdCBpcyB3cml0dGVuIGZvciBjbGFyaXR5LCBub3QgZm9yIHNwZWVkLiAgVGhlIHNhbXBsZSBjb2RlIGlzIGluIHRoZQotICAgQU5TSSBDIHByb2dyYW1taW5nIGxhbmd1YWdlLiBOb24gQyB1c2VycyBtYXkgZmluZCBpdCBlYXNpZXIgdG8gcmVhZAotICAgd2l0aCB0aGVzZSBoaW50czoKLQotICAgICAgJiAgICAgIEJpdHdpc2UgQU5EIG9wZXJhdG9yLgotICAgICAgPj4gICAgIEJpdHdpc2UgcmlnaHQgc2hpZnQgb3BlcmF0b3IuIFdoZW4gYXBwbGllZCB0byBhbgotICAgICAgICAgICAgIHVuc2lnbmVkIHF1YW50aXR5LCBhcyBoZXJlLCByaWdodCBzaGlmdCBpbnNlcnRzIHplcm8gYml0KHMpCi0gICAgICAgICAgICAgYXQgdGhlIGxlZnQuCi0gICAgICA8PCAgICAgQml0d2lzZSBsZWZ0IHNoaWZ0IG9wZXJhdG9yLiBMZWZ0IHNoaWZ0IGluc2VydHMgemVybwotICAgICAgICAgICAgIGJpdChzKSBhdCB0aGUgcmlnaHQuCi0gICAgICArKyAgICAgIm4rKyIgaW5jcmVtZW50cyB0aGUgdmFyaWFibGUgbi4KLSAgICAgICUgICAgICBtb2R1bG8gb3BlcmF0b3I6IGEgJSBiIGlzIHRoZSByZW1haW5kZXIgb2YgYSBkaXZpZGVkIGJ5IGIuCi0KLSAgICAgICNkZWZpbmUgQkFTRSA2NTUyMSAvKiBsYXJnZXN0IHByaW1lIHNtYWxsZXIgdGhhbiA2NTUzNiAqLwotCi0gICAgICAvKgotICAgICAgICAgVXBkYXRlIGEgcnVubmluZyBBZGxlci0zMiBjaGVja3N1bSB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdCi0gICAgICAgYW5kIHJldHVybiB0aGUgdXBkYXRlZCBjaGVja3N1bS4gVGhlIEFkbGVyLTMyIGNoZWNrc3VtIHNob3VsZCBiZQotICAgICAgIGluaXRpYWxpemVkIHRvIDEuCi0KLSAgICAgICBVc2FnZSBleGFtcGxlOgotCi0gICAgICAgICB1bnNpZ25lZCBsb25nIGFkbGVyID0gMUw7Ci0KLSAgICAgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7Ci0gICAgICAgICAgIGFkbGVyID0gdXBkYXRlX2FkbGVyMzIoYWRsZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChhZGxlciAhPSBvcmlnaW5hbF9hZGxlcikgZXJyb3IoKTsKLSAgICAgICovCi0gICAgICB1bnNpZ25lZCBsb25nIHVwZGF0ZV9hZGxlcjMyKHVuc2lnbmVkIGxvbmcgYWRsZXIsCi0gICAgICAgICB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCi0gICAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgczEgPSBhZGxlciAmIDB4ZmZmZjsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBzMiA9IChhZGxlciA+PiAxNikgJiAweGZmZmY7Ci0gICAgICAgIGludCBuOwotCi0gICAgICAgIGZvciAobiA9IDA7IG4gPCBsZW47IG4rKykgewotICAgICAgICAgIHMxID0gKHMxICsgYnVmW25dKSAlIEJBU0U7Ci0gICAgICAgICAgczIgPSAoczIgKyBzMSkgICAgICUgQkFTRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKHMyIDw8IDE2KSArIHMxOwotICAgICAgfQotCi0gICAgICAvKiBSZXR1cm4gdGhlIGFkbGVyMzIgb2YgdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gKi8KLQotCi0KLQotRGV1dHNjaCAmIEdhaWxseSAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgMTBdCi0MCi1SRkMgMTk1MCAgICAgICBaTElCIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgTWF5IDE5OTYKLQotCi0gICAgICB1bnNpZ25lZCBsb25nIGFkbGVyMzIodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQotICAgICAgewotICAgICAgICByZXR1cm4gdXBkYXRlX2FkbGVyMzIoMUwsIGJ1ZiwgbGVuKTsKLSAgICAgIH0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi1EZXV0c2NoICYgR2FpbGx5ICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxMV0KLQwKZGlmZiAtLWdpdCBhL3NyYy96bGliL2RvYy9yZmMxOTUxLnR4dCBiL3NyYy96bGliL2RvYy9yZmMxOTUxLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzYzhjNy4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9kb2MvcmZjMTk1MS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5NTUgKzAsMCBAQAotCi0KLQotCi0KLQotTmV0d29yayBXb3JraW5nIEdyb3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQLiBEZXV0c2NoCi1SZXF1ZXN0IGZvciBDb21tZW50czogMTk1MSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsYWRkaW4gRW50ZXJwcmlzZXMKLUNhdGVnb3J5OiBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXkgMTk5NgotCi0KLSAgICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjMKLQotU3RhdHVzIG9mIFRoaXMgTWVtbwotCi0gICBUaGlzIG1lbW8gcHJvdmlkZXMgaW5mb3JtYXRpb24gZm9yIHRoZSBJbnRlcm5ldCBjb21tdW5pdHkuICBUaGlzIG1lbW8KLSAgIGRvZXMgbm90IHNwZWNpZnkgYW4gSW50ZXJuZXQgc3RhbmRhcmQgb2YgYW55IGtpbmQuICBEaXN0cmlidXRpb24gb2YKLSAgIHRoaXMgbWVtbyBpcyB1bmxpbWl0ZWQuCi0KLUlFU0cgTm90ZToKLQotICAgVGhlIElFU0cgdGFrZXMgbm8gcG9zaXRpb24gb24gdGhlIHZhbGlkaXR5IG9mIGFueSBJbnRlbGxlY3R1YWwKLSAgIFByb3BlcnR5IFJpZ2h0cyBzdGF0ZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGlzIGRvY3VtZW50LgotCi1Ob3RpY2VzCi0KLSAgIENvcHlyaWdodCAoYykgMTk5NiBMLiBQZXRlciBEZXV0c2NoCi0KLSAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoaXMgZG9jdW1lbnQgZm9yIGFueQotICAgcHVycG9zZSBhbmQgd2l0aG91dCBjaGFyZ2UsIGluY2x1ZGluZyB0cmFuc2xhdGlvbnMgaW50byBvdGhlcgotICAgbGFuZ3VhZ2VzIGFuZCBpbmNvcnBvcmF0aW9uIGludG8gY29tcGlsYXRpb25zLCBwcm92aWRlZCB0aGF0IHRoZQotICAgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZCwgYW5kIHRoYXQgYW55Ci0gICBzdWJzdGFudGl2ZSBjaGFuZ2VzIG9yIGRlbGV0aW9ucyBmcm9tIHRoZSBvcmlnaW5hbCBhcmUgY2xlYXJseQotICAgbWFya2VkLgotCi0gICBBIHBvaW50ZXIgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiBpbgotICAgSFRNTCBmb3JtYXQgY2FuIGJlIGZvdW5kIGF0IHRoZSBVUkwKLSAgIDxmdHA6Ly9mdHAudXUubmV0L2dyYXBoaWNzL3BuZy9kb2N1bWVudHMvemxpYi96ZG9jLWluZGV4Lmh0bWw+LgotCi1BYnN0cmFjdAotCi0gICBUaGlzIHNwZWNpZmljYXRpb24gZGVmaW5lcyBhIGxvc3NsZXNzIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgdGhhdAotICAgY29tcHJlc3NlcyBkYXRhIHVzaW5nIGEgY29tYmluYXRpb24gb2YgdGhlIExaNzcgYWxnb3JpdGhtIGFuZCBIdWZmbWFuCi0gICBjb2RpbmcsIHdpdGggZWZmaWNpZW5jeSBjb21wYXJhYmxlIHRvIHRoZSBiZXN0IGN1cnJlbnRseSBhdmFpbGFibGUKLSAgIGdlbmVyYWwtcHVycG9zZSBjb21wcmVzc2lvbiBtZXRob2RzLiAgVGhlIGRhdGEgY2FuIGJlIHByb2R1Y2VkIG9yCi0gICBjb25zdW1lZCwgZXZlbiBmb3IgYW4gYXJiaXRyYXJpbHkgbG9uZyBzZXF1ZW50aWFsbHkgcHJlc2VudGVkIGlucHV0Ci0gICBkYXRhIHN0cmVhbSwgdXNpbmcgb25seSBhbiBhIHByaW9yaSBib3VuZGVkIGFtb3VudCBvZiBpbnRlcm1lZGlhdGUKLSAgIHN0b3JhZ2UuICBUaGUgZm9ybWF0IGNhbiBiZSBpbXBsZW1lbnRlZCByZWFkaWx5IGluIGEgbWFubmVyIG5vdAotICAgY292ZXJlZCBieSBwYXRlbnRzLgotCi0KLQotCi0KLQotCi0KLURldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxXQotDAotUkZDIDE5NTEgICAgICBERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgIE1heSAxOTk2Ci0KLQotVGFibGUgb2YgQ29udGVudHMKLQotICAgMS4gSW50cm9kdWN0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAyCi0gICAgICAxLjEuIFB1cnBvc2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDIKLSAgICAgIDEuMi4gSW50ZW5kZWQgYXVkaWVuY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMwotICAgICAgMS4zLiBTY29wZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAzCi0gICAgICAxLjQuIENvbXBsaWFuY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDMKLSAgICAgIDEuNS4gIERlZmluaXRpb25zIG9mIHRlcm1zIGFuZCBjb252ZW50aW9ucyB1c2VkIC4uLi4uLi4uLi4uLi4uLi4gMwotICAgICAgMS42LiBDaGFuZ2VzIGZyb20gcHJldmlvdXMgdmVyc2lvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA0Ci0gICAyLiBDb21wcmVzc2VkIHJlcHJlc2VudGF0aW9uIG92ZXJ2aWV3IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDQKLSAgIDMuIERldGFpbGVkIHNwZWNpZmljYXRpb24gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gNQotICAgICAgMy4xLiBPdmVyYWxsIGNvbnZlbnRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA1Ci0gICAgICAgICAgMy4xLjEuIFBhY2tpbmcgaW50byBieXRlcyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDUKLSAgICAgIDMuMi4gQ29tcHJlc3NlZCBibG9jayBmb3JtYXQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gNgotICAgICAgICAgIDMuMi4xLiBTeW5vcHNpcyBvZiBwcmVmaXggYW5kIEh1ZmZtYW4gY29kaW5nIC4uLi4uLi4uLi4uLi4uLiA2Ci0gICAgICAgICAgMy4yLjIuIFVzZSBvZiBIdWZmbWFuIGNvZGluZyBpbiB0aGUgImRlZmxhdGUiIGZvcm1hdCAuLi4uLi4uIDcKLSAgICAgICAgICAzLjIuMy4gRGV0YWlscyBvZiBibG9jayBmb3JtYXQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gOQotICAgICAgICAgIDMuMi40LiBOb24tY29tcHJlc3NlZCBibG9ja3MgKEJUWVBFPTAwKSAuLi4uLi4uLi4uLi4uLi4uLi4uIDExCi0gICAgICAgICAgMy4yLjUuIENvbXByZXNzZWQgYmxvY2tzIChsZW5ndGggYW5kIGRpc3RhbmNlIGNvZGVzKSAuLi4uLi4gMTEKLSAgICAgICAgICAzLjIuNi4gQ29tcHJlc3Npb24gd2l0aCBmaXhlZCBIdWZmbWFuIGNvZGVzIChCVFlQRT0wMSkgLi4uLiAxMgotICAgICAgICAgIDMuMi43LiBDb21wcmVzc2lvbiB3aXRoIGR5bmFtaWMgSHVmZm1hbiBjb2RlcyAoQlRZUEU9MTApIC4uIDEzCi0gICAgICAzLjMuIENvbXBsaWFuY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMTQKLSAgIDQuIENvbXByZXNzaW9uIGFsZ29yaXRobSBkZXRhaWxzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAxNAotICAgNS4gUmVmZXJlbmNlcyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDE2Ci0gICA2LiBTZWN1cml0eSBDb25zaWRlcmF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMTYKLSAgIDcuIFNvdXJjZSBjb2RlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAxNgotICAgOC4gQWNrbm93bGVkZ2VtZW50cyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDE2Ci0gICA5LiBBdXRob3IncyBBZGRyZXNzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMTcKLQotMS4gSW50cm9kdWN0aW9uCi0KLSAgIDEuMS4gUHVycG9zZQotCi0gICAgICBUaGUgcHVycG9zZSBvZiB0aGlzIHNwZWNpZmljYXRpb24gaXMgdG8gZGVmaW5lIGEgbG9zc2xlc3MKLSAgICAgIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgdGhhdDoKLSAgICAgICAgICAqIElzIGluZGVwZW5kZW50IG9mIENQVSB0eXBlLCBvcGVyYXRpbmcgc3lzdGVtLCBmaWxlIHN5c3RlbSwKLSAgICAgICAgICAgIGFuZCBjaGFyYWN0ZXIgc2V0LCBhbmQgaGVuY2UgY2FuIGJlIHVzZWQgZm9yIGludGVyY2hhbmdlOwotICAgICAgICAgICogQ2FuIGJlIHByb2R1Y2VkIG9yIGNvbnN1bWVkLCBldmVuIGZvciBhbiBhcmJpdHJhcmlseSBsb25nCi0gICAgICAgICAgICBzZXF1ZW50aWFsbHkgcHJlc2VudGVkIGlucHV0IGRhdGEgc3RyZWFtLCB1c2luZyBvbmx5IGFuIGEKLSAgICAgICAgICAgIHByaW9yaSBib3VuZGVkIGFtb3VudCBvZiBpbnRlcm1lZGlhdGUgc3RvcmFnZSwgYW5kIGhlbmNlCi0gICAgICAgICAgICBjYW4gYmUgdXNlZCBpbiBkYXRhIGNvbW11bmljYXRpb25zIG9yIHNpbWlsYXIgc3RydWN0dXJlcwotICAgICAgICAgICAgc3VjaCBhcyBVbml4IGZpbHRlcnM7Ci0gICAgICAgICAgKiBDb21wcmVzc2VzIGRhdGEgd2l0aCBlZmZpY2llbmN5IGNvbXBhcmFibGUgdG8gdGhlIGJlc3QKLSAgICAgICAgICAgIGN1cnJlbnRseSBhdmFpbGFibGUgZ2VuZXJhbC1wdXJwb3NlIGNvbXByZXNzaW9uIG1ldGhvZHMsCi0gICAgICAgICAgICBhbmQgaW4gcGFydGljdWxhciBjb25zaWRlcmFibHkgYmV0dGVyIHRoYW4gdGhlICJjb21wcmVzcyIKLSAgICAgICAgICAgIHByb2dyYW07Ci0gICAgICAgICAgKiBDYW4gYmUgaW1wbGVtZW50ZWQgcmVhZGlseSBpbiBhIG1hbm5lciBub3QgY292ZXJlZCBieQotICAgICAgICAgICAgcGF0ZW50cywgYW5kIGhlbmNlIGNhbiBiZSBwcmFjdGljZWQgZnJlZWx5OwotCi0KLQotRGV1dHNjaCAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDJdCi0MCi1SRkMgMTk1MSAgICAgIERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgTWF5IDE5OTYKLQotCi0gICAgICAgICAgKiBJcyBjb21wYXRpYmxlIHdpdGggdGhlIGZpbGUgZm9ybWF0IHByb2R1Y2VkIGJ5IHRoZSBjdXJyZW50Ci0gICAgICAgICAgICB3aWRlbHkgdXNlZCBnemlwIHV0aWxpdHksIGluIHRoYXQgY29uZm9ybWluZyBkZWNvbXByZXNzb3JzCi0gICAgICAgICAgICB3aWxsIGJlIGFibGUgdG8gcmVhZCBkYXRhIHByb2R1Y2VkIGJ5IHRoZSBleGlzdGluZyBnemlwCi0gICAgICAgICAgICBjb21wcmVzc29yLgotCi0gICAgICBUaGUgZGF0YSBmb3JtYXQgZGVmaW5lZCBieSB0aGlzIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYXR0ZW1wdCB0bzoKLQotICAgICAgICAgICogQWxsb3cgcmFuZG9tIGFjY2VzcyB0byBjb21wcmVzc2VkIGRhdGE7Ci0gICAgICAgICAgKiBDb21wcmVzcyBzcGVjaWFsaXplZCBkYXRhIChlLmcuLCByYXN0ZXIgZ3JhcGhpY3MpIGFzIHdlbGwKLSAgICAgICAgICAgIGFzIHRoZSBiZXN0IGN1cnJlbnRseSBhdmFpbGFibGUgc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcy4KLQotICAgICAgQSBzaW1wbGUgY291bnRpbmcgYXJndW1lbnQgc2hvd3MgdGhhdCBubyBsb3NzbGVzcyBjb21wcmVzc2lvbgotICAgICAgYWxnb3JpdGhtIGNhbiBjb21wcmVzcyBldmVyeSBwb3NzaWJsZSBpbnB1dCBkYXRhIHNldC4gIEZvciB0aGUKLSAgICAgIGZvcm1hdCBkZWZpbmVkIGhlcmUsIHRoZSB3b3JzdCBjYXNlIGV4cGFuc2lvbiBpcyA1IGJ5dGVzIHBlciAzMkstCi0gICAgICBieXRlIGJsb2NrLCBpLmUuLCBhIHNpemUgaW5jcmVhc2Ugb2YgMC4wMTUlIGZvciBsYXJnZSBkYXRhIHNldHMuCi0gICAgICBFbmdsaXNoIHRleHQgdXN1YWxseSBjb21wcmVzc2VzIGJ5IGEgZmFjdG9yIG9mIDIuNSB0byAzOwotICAgICAgZXhlY3V0YWJsZSBmaWxlcyB1c3VhbGx5IGNvbXByZXNzIHNvbWV3aGF0IGxlc3M7IGdyYXBoaWNhbCBkYXRhCi0gICAgICBzdWNoIGFzIHJhc3RlciBpbWFnZXMgbWF5IGNvbXByZXNzIG11Y2ggbW9yZS4KLQotICAgMS4yLiBJbnRlbmRlZCBhdWRpZW5jZQotCi0gICAgICBUaGlzIHNwZWNpZmljYXRpb24gaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBpbXBsZW1lbnRvcnMgb2Ygc29mdHdhcmUKLSAgICAgIHRvIGNvbXByZXNzIGRhdGEgaW50byAiZGVmbGF0ZSIgZm9ybWF0IGFuZC9vciBkZWNvbXByZXNzIGRhdGEgZnJvbQotICAgICAgImRlZmxhdGUiIGZvcm1hdC4KLQotICAgICAgVGhlIHRleHQgb2YgdGhlIHNwZWNpZmljYXRpb24gYXNzdW1lcyBhIGJhc2ljIGJhY2tncm91bmQgaW4KLSAgICAgIHByb2dyYW1taW5nIGF0IHRoZSBsZXZlbCBvZiBiaXRzIGFuZCBvdGhlciBwcmltaXRpdmUgZGF0YQotICAgICAgcmVwcmVzZW50YXRpb25zLiAgRmFtaWxpYXJpdHkgd2l0aCB0aGUgdGVjaG5pcXVlIG9mIEh1ZmZtYW4gY29kaW5nCi0gICAgICBpcyBoZWxwZnVsIGJ1dCBub3QgcmVxdWlyZWQuCi0KLSAgIDEuMy4gU2NvcGUKLQotICAgICAgVGhlIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgbWV0aG9kIGZvciByZXByZXNlbnRpbmcgYSBzZXF1ZW5jZQotICAgICAgb2YgYnl0ZXMgYXMgYSAodXN1YWxseSBzaG9ydGVyKSBzZXF1ZW5jZSBvZiBiaXRzLCBhbmQgYSBtZXRob2QgZm9yCi0gICAgICBwYWNraW5nIHRoZSBsYXR0ZXIgYml0IHNlcXVlbmNlIGludG8gYnl0ZXMuCi0KLSAgIDEuNC4gQ29tcGxpYW5jZQotCi0gICAgICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgYSBjb21wbGlhbnQgZGVjb21wcmVzc29yIG11c3QgYmUKLSAgICAgIGFibGUgdG8gYWNjZXB0IGFuZCBkZWNvbXByZXNzIGFueSBkYXRhIHNldCB0aGF0IGNvbmZvcm1zIHRvIGFsbAotICAgICAgdGhlIHNwZWNpZmljYXRpb25zIHByZXNlbnRlZCBoZXJlOyBhIGNvbXBsaWFudCBjb21wcmVzc29yIG11c3QKLSAgICAgIHByb2R1Y2UgZGF0YSBzZXRzIHRoYXQgY29uZm9ybSB0byBhbGwgdGhlIHNwZWNpZmljYXRpb25zIHByZXNlbnRlZAotICAgICAgaGVyZS4KLQotICAgMS41LiAgRGVmaW5pdGlvbnMgb2YgdGVybXMgYW5kIGNvbnZlbnRpb25zIHVzZWQKLQotICAgICAgQnl0ZTogOCBiaXRzIHN0b3JlZCBvciB0cmFuc21pdHRlZCBhcyBhIHVuaXQgKHNhbWUgYXMgYW4gb2N0ZXQpLgotICAgICAgRm9yIHRoaXMgc3BlY2lmaWNhdGlvbiwgYSBieXRlIGlzIGV4YWN0bHkgOCBiaXRzLCBldmVuIG9uIG1hY2hpbmVzCi0KLQotCi1EZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgM10KLQwKLVJGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgotCi0KLSAgICAgIHdoaWNoIHN0b3JlIGEgY2hhcmFjdGVyIG9uIGEgbnVtYmVyIG9mIGJpdHMgZGlmZmVyZW50IGZyb20gZWlnaHQuCi0gICAgICBTZWUgYmVsb3csIGZvciB0aGUgbnVtYmVyaW5nIG9mIGJpdHMgd2l0aGluIGEgYnl0ZS4KLQotICAgICAgU3RyaW5nOiBhIHNlcXVlbmNlIG9mIGFyYml0cmFyeSBieXRlcy4KLQotICAgMS42LiBDaGFuZ2VzIGZyb20gcHJldmlvdXMgdmVyc2lvbnMKLQotICAgICAgVGhlcmUgaGF2ZSBiZWVuIG5vIHRlY2huaWNhbCBjaGFuZ2VzIHRvIHRoZSBkZWZsYXRlIGZvcm1hdCBzaW5jZQotICAgICAgdmVyc2lvbiAxLjEgb2YgdGhpcyBzcGVjaWZpY2F0aW9uLiAgSW4gdmVyc2lvbiAxLjIsIHNvbWUKLSAgICAgIHRlcm1pbm9sb2d5IHdhcyBjaGFuZ2VkLiAgVmVyc2lvbiAxLjMgaXMgYSBjb252ZXJzaW9uIG9mIHRoZQotICAgICAgc3BlY2lmaWNhdGlvbiB0byBSRkMgc3R5bGUuCi0KLTIuIENvbXByZXNzZWQgcmVwcmVzZW50YXRpb24gb3ZlcnZpZXcKLQotICAgQSBjb21wcmVzc2VkIGRhdGEgc2V0IGNvbnNpc3RzIG9mIGEgc2VyaWVzIG9mIGJsb2NrcywgY29ycmVzcG9uZGluZwotICAgdG8gc3VjY2Vzc2l2ZSBibG9ja3Mgb2YgaW5wdXQgZGF0YS4gIFRoZSBibG9jayBzaXplcyBhcmUgYXJiaXRyYXJ5LAotICAgZXhjZXB0IHRoYXQgbm9uLWNvbXByZXNzaWJsZSBibG9ja3MgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzLgotCi0gICBFYWNoIGJsb2NrIGlzIGNvbXByZXNzZWQgdXNpbmcgYSBjb21iaW5hdGlvbiBvZiB0aGUgTFo3NyBhbGdvcml0aG0KLSAgIGFuZCBIdWZmbWFuIGNvZGluZy4gVGhlIEh1ZmZtYW4gdHJlZXMgZm9yIGVhY2ggYmxvY2sgYXJlIGluZGVwZW5kZW50Ci0gICBvZiB0aG9zZSBmb3IgcHJldmlvdXMgb3Igc3Vic2VxdWVudCBibG9ja3M7IHRoZSBMWjc3IGFsZ29yaXRobSBtYXkKLSAgIHVzZSBhIHJlZmVyZW5jZSB0byBhIGR1cGxpY2F0ZWQgc3RyaW5nIG9jY3VycmluZyBpbiBhIHByZXZpb3VzIGJsb2NrLAotICAgdXAgdG8gMzJLIGlucHV0IGJ5dGVzIGJlZm9yZS4KLQotICAgRWFjaCBibG9jayBjb25zaXN0cyBvZiB0d28gcGFydHM6IGEgcGFpciBvZiBIdWZmbWFuIGNvZGUgdHJlZXMgdGhhdAotICAgZGVzY3JpYmUgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgcGFydCwgYW5kIGEKLSAgIGNvbXByZXNzZWQgZGF0YSBwYXJ0LiAgKFRoZSBIdWZmbWFuIHRyZWVzIHRoZW1zZWx2ZXMgYXJlIGNvbXByZXNzZWQKLSAgIHVzaW5nIEh1ZmZtYW4gZW5jb2RpbmcuKSAgVGhlIGNvbXByZXNzZWQgZGF0YSBjb25zaXN0cyBvZiBhIHNlcmllcyBvZgotICAgZWxlbWVudHMgb2YgdHdvIHR5cGVzOiBsaXRlcmFsIGJ5dGVzIChvZiBzdHJpbmdzIHRoYXQgaGF2ZSBub3QgYmVlbgotICAgZGV0ZWN0ZWQgYXMgZHVwbGljYXRlZCB3aXRoaW4gdGhlIHByZXZpb3VzIDMySyBpbnB1dCBieXRlcyksIGFuZAotICAgcG9pbnRlcnMgdG8gZHVwbGljYXRlZCBzdHJpbmdzLCB3aGVyZSBhIHBvaW50ZXIgaXMgcmVwcmVzZW50ZWQgYXMgYQotICAgcGFpciA8bGVuZ3RoLCBiYWNrd2FyZCBkaXN0YW5jZT4uICBUaGUgcmVwcmVzZW50YXRpb24gdXNlZCBpbiB0aGUKLSAgICJkZWZsYXRlIiBmb3JtYXQgbGltaXRzIGRpc3RhbmNlcyB0byAzMksgYnl0ZXMgYW5kIGxlbmd0aHMgdG8gMjU4Ci0gICBieXRlcywgYnV0IGRvZXMgbm90IGxpbWl0IHRoZSBzaXplIG9mIGEgYmxvY2ssIGV4Y2VwdCBmb3IKLSAgIHVuY29tcHJlc3NpYmxlIGJsb2Nrcywgd2hpY2ggYXJlIGxpbWl0ZWQgYXMgbm90ZWQgYWJvdmUuCi0KLSAgIEVhY2ggdHlwZSBvZiB2YWx1ZSAobGl0ZXJhbHMsIGRpc3RhbmNlcywgYW5kIGxlbmd0aHMpIGluIHRoZQotICAgY29tcHJlc3NlZCBkYXRhIGlzIHJlcHJlc2VudGVkIHVzaW5nIGEgSHVmZm1hbiBjb2RlLCB1c2luZyBvbmUgY29kZQotICAgdHJlZSBmb3IgbGl0ZXJhbHMgYW5kIGxlbmd0aHMgYW5kIGEgc2VwYXJhdGUgY29kZSB0cmVlIGZvciBkaXN0YW5jZXMuCi0gICBUaGUgY29kZSB0cmVlcyBmb3IgZWFjaCBibG9jayBhcHBlYXIgaW4gYSBjb21wYWN0IGZvcm0ganVzdCBiZWZvcmUKLSAgIHRoZSBjb21wcmVzc2VkIGRhdGEgZm9yIHRoYXQgYmxvY2suCi0KLQotCi0KLQotCi0KLQotCi0KLURldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA0XQotDAotUkZDIDE5NTEgICAgICBERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgIE1heSAxOTk2Ci0KLQotMy4gRGV0YWlsZWQgc3BlY2lmaWNhdGlvbgotCi0gICAzLjEuIE92ZXJhbGwgY29udmVudGlvbnMgSW4gdGhlIGRpYWdyYW1zIGJlbG93LCBhIGJveCBsaWtlIHRoaXM6Ci0KLSAgICAgICAgICstLS0rCi0gICAgICAgICB8ICAgfCA8LS0gdGhlIHZlcnRpY2FsIGJhcnMgbWlnaHQgYmUgbWlzc2luZwotICAgICAgICAgKy0tLSsKLQotICAgICAgcmVwcmVzZW50cyBvbmUgYnl0ZTsgYSBib3ggbGlrZSB0aGlzOgotCi0gICAgICAgICArPT09PT09PT09PT09PT0rCi0gICAgICAgICB8ICAgICAgICAgICAgICB8Ci0gICAgICAgICArPT09PT09PT09PT09PT0rCi0KLSAgICAgIHJlcHJlc2VudHMgYSB2YXJpYWJsZSBudW1iZXIgb2YgYnl0ZXMuCi0KLSAgICAgIEJ5dGVzIHN0b3JlZCB3aXRoaW4gYSBjb21wdXRlciBkbyBub3QgaGF2ZSBhICJiaXQgb3JkZXIiLCBzaW5jZQotICAgICAgdGhleSBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgYSB1bml0LiAgSG93ZXZlciwgYSBieXRlIGNvbnNpZGVyZWQgYXMKLSAgICAgIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCAyNTUgZG9lcyBoYXZlIGEgbW9zdC0gYW5kIGxlYXN0LQotICAgICAgc2lnbmlmaWNhbnQgYml0LCBhbmQgc2luY2Ugd2Ugd3JpdGUgbnVtYmVycyB3aXRoIHRoZSBtb3N0LQotICAgICAgc2lnbmlmaWNhbnQgZGlnaXQgb24gdGhlIGxlZnQsIHdlIGFsc28gd3JpdGUgYnl0ZXMgd2l0aCB0aGUgbW9zdC0KLSAgICAgIHNpZ25pZmljYW50IGJpdCBvbiB0aGUgbGVmdC4gIEluIHRoZSBkaWFncmFtcyBiZWxvdywgd2UgbnVtYmVyIHRoZQotICAgICAgYml0cyBvZiBhIGJ5dGUgc28gdGhhdCBiaXQgMCBpcyB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgYml0LCBpLmUuLAotICAgICAgdGhlIGJpdHMgYXJlIG51bWJlcmVkOgotCi0gICAgICAgICArLS0tLS0tLS0rCi0gICAgICAgICB8NzY1NDMyMTB8Ci0gICAgICAgICArLS0tLS0tLS0rCi0KLSAgICAgIFdpdGhpbiBhIGNvbXB1dGVyLCBhIG51bWJlciBtYXkgb2NjdXB5IG11bHRpcGxlIGJ5dGVzLiAgQWxsCi0gICAgICBtdWx0aS1ieXRlIG51bWJlcnMgaW4gdGhlIGZvcm1hdCBkZXNjcmliZWQgaGVyZSBhcmUgc3RvcmVkIHdpdGgKLSAgICAgIHRoZSBsZWFzdC1zaWduaWZpY2FudCBieXRlIGZpcnN0IChhdCB0aGUgbG93ZXIgbWVtb3J5IGFkZHJlc3MpLgotICAgICAgRm9yIGV4YW1wbGUsIHRoZSBkZWNpbWFsIG51bWJlciA1MjAgaXMgc3RvcmVkIGFzOgotCi0gICAgICAgICAgICAgMCAgICAgICAgMQotICAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tKwotICAgICAgICAgfDAwMDAxMDAwfDAwMDAwMDEwfAotICAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tKwotICAgICAgICAgIF4gICAgICAgIF4KLSAgICAgICAgICB8ICAgICAgICB8Ci0gICAgICAgICAgfCAgICAgICAgKyBtb3JlIHNpZ25pZmljYW50IGJ5dGUgPSAyIHggMjU2Ci0gICAgICAgICAgKyBsZXNzIHNpZ25pZmljYW50IGJ5dGUgPSA4Ci0KLSAgICAgIDMuMS4xLiBQYWNraW5nIGludG8gYnl0ZXMKLQotICAgICAgICAgVGhpcyBkb2N1bWVudCBkb2VzIG5vdCBhZGRyZXNzIHRoZSBpc3N1ZSBvZiB0aGUgb3JkZXIgaW4gd2hpY2gKLSAgICAgICAgIGJpdHMgb2YgYSBieXRlIGFyZSB0cmFuc21pdHRlZCBvbiBhIGJpdC1zZXF1ZW50aWFsIG1lZGl1bSwKLSAgICAgICAgIHNpbmNlIHRoZSBmaW5hbCBkYXRhIGZvcm1hdCBkZXNjcmliZWQgaGVyZSBpcyBieXRlLSByYXRoZXIgdGhhbgotCi0KLQotRGV1dHNjaCAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDVdCi0MCi1SRkMgMTk1MSAgICAgIERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgTWF5IDE5OTYKLQotCi0gICAgICAgICBiaXQtb3JpZW50ZWQuICBIb3dldmVyLCB3ZSBkZXNjcmliZSB0aGUgY29tcHJlc3NlZCBibG9jayBmb3JtYXQKLSAgICAgICAgIGluIGJlbG93LCBhcyBhIHNlcXVlbmNlIG9mIGRhdGEgZWxlbWVudHMgb2YgdmFyaW91cyBiaXQKLSAgICAgICAgIGxlbmd0aHMsIG5vdCBhIHNlcXVlbmNlIG9mIGJ5dGVzLiAgV2UgbXVzdCB0aGVyZWZvcmUgc3BlY2lmeQotICAgICAgICAgaG93IHRvIHBhY2sgdGhlc2UgZGF0YSBlbGVtZW50cyBpbnRvIGJ5dGVzIHRvIGZvcm0gdGhlIGZpbmFsCi0gICAgICAgICBjb21wcmVzc2VkIGJ5dGUgc2VxdWVuY2U6Ci0KLSAgICAgICAgICAgICAqIERhdGEgZWxlbWVudHMgYXJlIHBhY2tlZCBpbnRvIGJ5dGVzIGluIG9yZGVyIG9mCi0gICAgICAgICAgICAgICBpbmNyZWFzaW5nIGJpdCBudW1iZXIgd2l0aGluIHRoZSBieXRlLCBpLmUuLCBzdGFydGluZwotICAgICAgICAgICAgICAgd2l0aCB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBieXRlLgotICAgICAgICAgICAgICogRGF0YSBlbGVtZW50cyBvdGhlciB0aGFuIEh1ZmZtYW4gY29kZXMgYXJlIHBhY2tlZAotICAgICAgICAgICAgICAgc3RhcnRpbmcgd2l0aCB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBkYXRhCi0gICAgICAgICAgICAgICBlbGVtZW50LgotICAgICAgICAgICAgICogSHVmZm1hbiBjb2RlcyBhcmUgcGFja2VkIHN0YXJ0aW5nIHdpdGggdGhlIG1vc3QtCi0gICAgICAgICAgICAgICBzaWduaWZpY2FudCBiaXQgb2YgdGhlIGNvZGUuCi0KLSAgICAgICAgIEluIG90aGVyIHdvcmRzLCBpZiBvbmUgd2VyZSB0byBwcmludCBvdXQgdGhlIGNvbXByZXNzZWQgZGF0YSBhcwotICAgICAgICAgYSBzZXF1ZW5jZSBvZiBieXRlcywgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QgYnl0ZSBhdCB0aGUKLSAgICAgICAgICpyaWdodCogbWFyZ2luIGFuZCBwcm9jZWVkaW5nIHRvIHRoZSAqbGVmdCosIHdpdGggdGhlIG1vc3QtCi0gICAgICAgICBzaWduaWZpY2FudCBiaXQgb2YgZWFjaCBieXRlIG9uIHRoZSBsZWZ0IGFzIHVzdWFsLCBvbmUgd291bGQgYmUKLSAgICAgICAgIGFibGUgdG8gcGFyc2UgdGhlIHJlc3VsdCBmcm9tIHJpZ2h0IHRvIGxlZnQsIHdpdGggZml4ZWQtd2lkdGgKLSAgICAgICAgIGVsZW1lbnRzIGluIHRoZSBjb3JyZWN0IE1TQi10by1MU0Igb3JkZXIgYW5kIEh1ZmZtYW4gY29kZXMgaW4KLSAgICAgICAgIGJpdC1yZXZlcnNlZCBvcmRlciAoaS5lLiwgd2l0aCB0aGUgZmlyc3QgYml0IG9mIHRoZSBjb2RlIGluIHRoZQotICAgICAgICAgcmVsYXRpdmUgTFNCIHBvc2l0aW9uKS4KLQotICAgMy4yLiBDb21wcmVzc2VkIGJsb2NrIGZvcm1hdAotCi0gICAgICAzLjIuMS4gU3lub3BzaXMgb2YgcHJlZml4IGFuZCBIdWZmbWFuIGNvZGluZwotCi0gICAgICAgICBQcmVmaXggY29kaW5nIHJlcHJlc2VudHMgc3ltYm9scyBmcm9tIGFuIGEgcHJpb3JpIGtub3duCi0gICAgICAgICBhbHBoYWJldCBieSBiaXQgc2VxdWVuY2VzIChjb2RlcyksIG9uZSBjb2RlIGZvciBlYWNoIHN5bWJvbCwgaW4KLSAgICAgICAgIGEgbWFubmVyIHN1Y2ggdGhhdCBkaWZmZXJlbnQgc3ltYm9scyBtYXkgYmUgcmVwcmVzZW50ZWQgYnkgYml0Ci0gICAgICAgICBzZXF1ZW5jZXMgb2YgZGlmZmVyZW50IGxlbmd0aHMsIGJ1dCBhIHBhcnNlciBjYW4gYWx3YXlzIHBhcnNlCi0gICAgICAgICBhbiBlbmNvZGVkIHN0cmluZyB1bmFtYmlndW91c2x5IHN5bWJvbC1ieS1zeW1ib2wuCi0KLSAgICAgICAgIFdlIGRlZmluZSBhIHByZWZpeCBjb2RlIGluIHRlcm1zIG9mIGEgYmluYXJ5IHRyZWUgaW4gd2hpY2ggdGhlCi0gICAgICAgICB0d28gZWRnZXMgZGVzY2VuZGluZyBmcm9tIGVhY2ggbm9uLWxlYWYgbm9kZSBhcmUgbGFiZWxlZCAwIGFuZAotICAgICAgICAgMSBhbmQgaW4gd2hpY2ggdGhlIGxlYWYgbm9kZXMgY29ycmVzcG9uZCBvbmUtZm9yLW9uZSB3aXRoIChhcmUKLSAgICAgICAgIGxhYmVsZWQgd2l0aCkgdGhlIHN5bWJvbHMgb2YgdGhlIGFscGhhYmV0OyB0aGVuIHRoZSBjb2RlIGZvciBhCi0gICAgICAgICBzeW1ib2wgaXMgdGhlIHNlcXVlbmNlIG9mIDAncyBhbmQgMSdzIG9uIHRoZSBlZGdlcyBsZWFkaW5nIGZyb20KLSAgICAgICAgIHRoZSByb290IHRvIHRoZSBsZWFmIGxhYmVsZWQgd2l0aCB0aGF0IHN5bWJvbC4gIEZvciBleGFtcGxlOgotCi0KLQotCi0KLQotCi0KLQotCi0KLURldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA2XQotDAotUkZDIDE5NTEgICAgICBERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgIE1heSAxOTk2Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAvXCAgICAgICAgICAgICAgU3ltYm9sICAgIENvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAwICAxICAgICAgICAgICAgIC0tLS0tLSAgICAtLS0tCi0gICAgICAgICAgICAgICAgICAgICAgICAvICAgIFwgICAgICAgICAgICAgICAgQSAgICAgIDAwCi0gICAgICAgICAgICAgICAgICAgICAgIC9cICAgICBCICAgICAgICAgICAgICAgQiAgICAgICAxCi0gICAgICAgICAgICAgICAgICAgICAgMCAgMSAgICAgICAgICAgICAgICAgICAgQyAgICAgMDExCi0gICAgICAgICAgICAgICAgICAgICAvICAgIFwgICAgICAgICAgICAgICAgICAgRCAgICAgMDEwCi0gICAgICAgICAgICAgICAgICAgIEEgICAgIC9cCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCAgMQotICAgICAgICAgICAgICAgICAgICAgICAgLyAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgIEQgICAgICBDCi0KLSAgICAgICAgIEEgcGFyc2VyIGNhbiBkZWNvZGUgdGhlIG5leHQgc3ltYm9sIGZyb20gYW4gZW5jb2RlZCBpbnB1dAotICAgICAgICAgc3RyZWFtIGJ5IHdhbGtpbmcgZG93biB0aGUgdHJlZSBmcm9tIHRoZSByb290LCBhdCBlYWNoIHN0ZXAKLSAgICAgICAgIGNob29zaW5nIHRoZSBlZGdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5leHQgaW5wdXQgYml0LgotCi0gICAgICAgICBHaXZlbiBhbiBhbHBoYWJldCB3aXRoIGtub3duIHN5bWJvbCBmcmVxdWVuY2llcywgdGhlIEh1ZmZtYW4KLSAgICAgICAgIGFsZ29yaXRobSBhbGxvd3MgdGhlIGNvbnN0cnVjdGlvbiBvZiBhbiBvcHRpbWFsIHByZWZpeCBjb2RlCi0gICAgICAgICAob25lIHdoaWNoIHJlcHJlc2VudHMgc3RyaW5ncyB3aXRoIHRob3NlIHN5bWJvbCBmcmVxdWVuY2llcwotICAgICAgICAgdXNpbmcgdGhlIGZld2VzdCBiaXRzIG9mIGFueSBwb3NzaWJsZSBwcmVmaXggY29kZXMgZm9yIHRoYXQKLSAgICAgICAgIGFscGhhYmV0KS4gIFN1Y2ggYSBjb2RlIGlzIGNhbGxlZCBhIEh1ZmZtYW4gY29kZS4gIChTZWUKLSAgICAgICAgIHJlZmVyZW5jZSBbMV0gaW4gQ2hhcHRlciA1LCByZWZlcmVuY2VzIGZvciBhZGRpdGlvbmFsCi0gICAgICAgICBpbmZvcm1hdGlvbiBvbiBIdWZmbWFuIGNvZGVzLikKLQotICAgICAgICAgTm90ZSB0aGF0IGluIHRoZSAiZGVmbGF0ZSIgZm9ybWF0LCB0aGUgSHVmZm1hbiBjb2RlcyBmb3IgdGhlCi0gICAgICAgICB2YXJpb3VzIGFscGhhYmV0cyBtdXN0IG5vdCBleGNlZWQgY2VydGFpbiBtYXhpbXVtIGNvZGUgbGVuZ3Rocy4KLSAgICAgICAgIFRoaXMgY29uc3RyYWludCBjb21wbGljYXRlcyB0aGUgYWxnb3JpdGhtIGZvciBjb21wdXRpbmcgY29kZQotICAgICAgICAgbGVuZ3RocyBmcm9tIHN5bWJvbCBmcmVxdWVuY2llcy4gIEFnYWluLCBzZWUgQ2hhcHRlciA1LAotICAgICAgICAgcmVmZXJlbmNlcyBmb3IgZGV0YWlscy4KLQotICAgICAgMy4yLjIuIFVzZSBvZiBIdWZmbWFuIGNvZGluZyBpbiB0aGUgImRlZmxhdGUiIGZvcm1hdAotCi0gICAgICAgICBUaGUgSHVmZm1hbiBjb2RlcyB1c2VkIGZvciBlYWNoIGFscGhhYmV0IGluIHRoZSAiZGVmbGF0ZSIKLSAgICAgICAgIGZvcm1hdCBoYXZlIHR3byBhZGRpdGlvbmFsIHJ1bGVzOgotCi0gICAgICAgICAgICAgKiBBbGwgY29kZXMgb2YgYSBnaXZlbiBiaXQgbGVuZ3RoIGhhdmUgbGV4aWNvZ3JhcGhpY2FsbHkKLSAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlIHZhbHVlcywgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHN5bWJvbHMKLSAgICAgICAgICAgICAgIHRoZXkgcmVwcmVzZW50OwotCi0gICAgICAgICAgICAgKiBTaG9ydGVyIGNvZGVzIGxleGljb2dyYXBoaWNhbGx5IHByZWNlZGUgbG9uZ2VyIGNvZGVzLgotCi0KLQotCi0KLQotCi0KLQotCi0KLQotRGV1dHNjaCAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDddCi0MCi1SRkMgMTk1MSAgICAgIERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgTWF5IDE5OTYKLQotCi0gICAgICAgICBXZSBjb3VsZCByZWNvZGUgdGhlIGV4YW1wbGUgYWJvdmUgdG8gZm9sbG93IHRoaXMgcnVsZSBhcwotICAgICAgICAgZm9sbG93cywgYXNzdW1pbmcgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIGFscGhhYmV0IGlzIEFCQ0Q6Ci0KLSAgICAgICAgICAgIFN5bWJvbCAgQ29kZQotICAgICAgICAgICAgLS0tLS0tICAtLS0tCi0gICAgICAgICAgICBBICAgICAgIDEwCi0gICAgICAgICAgICBCICAgICAgIDAKLSAgICAgICAgICAgIEMgICAgICAgMTEwCi0gICAgICAgICAgICBEICAgICAgIDExMQotCi0gICAgICAgICBJLmUuLCAwIHByZWNlZGVzIDEwIHdoaWNoIHByZWNlZGVzIDExeCwgYW5kIDExMCBhbmQgMTExIGFyZQotICAgICAgICAgbGV4aWNvZ3JhcGhpY2FsbHkgY29uc2VjdXRpdmUuCi0KLSAgICAgICAgIEdpdmVuIHRoaXMgcnVsZSwgd2UgY2FuIGRlZmluZSB0aGUgSHVmZm1hbiBjb2RlIGZvciBhbiBhbHBoYWJldAotICAgICAgICAganVzdCBieSBnaXZpbmcgdGhlIGJpdCBsZW5ndGhzIG9mIHRoZSBjb2RlcyBmb3IgZWFjaCBzeW1ib2wgb2YKLSAgICAgICAgIHRoZSBhbHBoYWJldCBpbiBvcmRlcjsgdGhpcyBpcyBzdWZmaWNpZW50IHRvIGRldGVybWluZSB0aGUKLSAgICAgICAgIGFjdHVhbCBjb2Rlcy4gIEluIG91ciBleGFtcGxlLCB0aGUgY29kZSBpcyBjb21wbGV0ZWx5IGRlZmluZWQKLSAgICAgICAgIGJ5IHRoZSBzZXF1ZW5jZSBvZiBiaXQgbGVuZ3RocyAoMiwgMSwgMywgMykuICBUaGUgZm9sbG93aW5nCi0gICAgICAgICBhbGdvcml0aG0gZ2VuZXJhdGVzIHRoZSBjb2RlcyBhcyBpbnRlZ2VycywgaW50ZW5kZWQgdG8gYmUgcmVhZAotICAgICAgICAgZnJvbSBtb3N0LSB0byBsZWFzdC1zaWduaWZpY2FudCBiaXQuICBUaGUgY29kZSBsZW5ndGhzIGFyZQotICAgICAgICAgaW5pdGlhbGx5IGluIHRyZWVbSV0uTGVuOyB0aGUgY29kZXMgYXJlIHByb2R1Y2VkIGluCi0gICAgICAgICB0cmVlW0ldLkNvZGUuCi0KLSAgICAgICAgIDEpICBDb3VudCB0aGUgbnVtYmVyIG9mIGNvZGVzIGZvciBlYWNoIGNvZGUgbGVuZ3RoLiAgTGV0Ci0gICAgICAgICAgICAgYmxfY291bnRbTl0gYmUgdGhlIG51bWJlciBvZiBjb2RlcyBvZiBsZW5ndGggTiwgTiA+PSAxLgotCi0gICAgICAgICAyKSAgRmluZCB0aGUgbnVtZXJpY2FsIHZhbHVlIG9mIHRoZSBzbWFsbGVzdCBjb2RlIGZvciBlYWNoCi0gICAgICAgICAgICAgY29kZSBsZW5ndGg6Ci0KLSAgICAgICAgICAgICAgICBjb2RlID0gMDsKLSAgICAgICAgICAgICAgICBibF9jb3VudFswXSA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGUgPSAoY29kZSArIGJsX2NvdW50W2JpdHMtMV0pIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRfY29kZVtiaXRzXSA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAzKSAgQXNzaWduIG51bWVyaWNhbCB2YWx1ZXMgdG8gYWxsIGNvZGVzLCB1c2luZyBjb25zZWN1dGl2ZQotICAgICAgICAgICAgIHZhbHVlcyBmb3IgYWxsIGNvZGVzIG9mIHRoZSBzYW1lIGxlbmd0aCB3aXRoIHRoZSBiYXNlCi0gICAgICAgICAgICAgdmFsdWVzIGRldGVybWluZWQgYXQgc3RlcCAyLiBDb2RlcyB0aGF0IGFyZSBuZXZlciB1c2VkCi0gICAgICAgICAgICAgKHdoaWNoIGhhdmUgYSBiaXQgbGVuZ3RoIG9mIHplcm8pIG11c3Qgbm90IGJlIGFzc2lnbmVkIGEKLSAgICAgICAgICAgICB2YWx1ZS4KLQotICAgICAgICAgICAgICAgIGZvciAobiA9IDA7ICBuIDw9IG1heF9jb2RlOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbGVuID0gdHJlZVtuXS5MZW47Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsZW4gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJlZVtuXS5Db2RlID0gbmV4dF9jb2RlW2xlbl07Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2NvZGVbbGVuXSsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotCi1EZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgOF0KLQwKLVJGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgotCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICAgIENvbnNpZGVyIHRoZSBhbHBoYWJldCBBQkNERUZHSCwgd2l0aCBiaXQgbGVuZ3RocyAoMywgMywgMywgMywKLSAgICAgICAgIDMsIDIsIDQsIDQpLiAgQWZ0ZXIgc3RlcCAxLCB3ZSBoYXZlOgotCi0gICAgICAgICAgICBOICAgICAgYmxfY291bnRbTl0KLSAgICAgICAgICAgIC0gICAgICAtLS0tLS0tLS0tLQotICAgICAgICAgICAgMiAgICAgIDEKLSAgICAgICAgICAgIDMgICAgICA1Ci0gICAgICAgICAgICA0ICAgICAgMgotCi0gICAgICAgICBTdGVwIDIgY29tcHV0ZXMgdGhlIGZvbGxvd2luZyBuZXh0X2NvZGUgdmFsdWVzOgotCi0gICAgICAgICAgICBOICAgICAgbmV4dF9jb2RlW05dCi0gICAgICAgICAgICAtICAgICAgLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAxICAgICAgMAotICAgICAgICAgICAgMiAgICAgIDAKLSAgICAgICAgICAgIDMgICAgICAyCi0gICAgICAgICAgICA0ICAgICAgMTQKLQotICAgICAgICAgU3RlcCAzIHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgY29kZSB2YWx1ZXM6Ci0KLSAgICAgICAgICAgIFN5bWJvbCBMZW5ndGggICBDb2RlCi0gICAgICAgICAgICAtLS0tLS0gLS0tLS0tICAgLS0tLQotICAgICAgICAgICAgQSAgICAgICAzICAgICAgICAwMTAKLSAgICAgICAgICAgIEIgICAgICAgMyAgICAgICAgMDExCi0gICAgICAgICAgICBDICAgICAgIDMgICAgICAgIDEwMAotICAgICAgICAgICAgRCAgICAgICAzICAgICAgICAxMDEKLSAgICAgICAgICAgIEUgICAgICAgMyAgICAgICAgMTEwCi0gICAgICAgICAgICBGICAgICAgIDIgICAgICAgICAwMAotICAgICAgICAgICAgRyAgICAgICA0ICAgICAgIDExMTAKLSAgICAgICAgICAgIEggICAgICAgNCAgICAgICAxMTExCi0KLSAgICAgIDMuMi4zLiBEZXRhaWxzIG9mIGJsb2NrIGZvcm1hdAotCi0gICAgICAgICBFYWNoIGJsb2NrIG9mIGNvbXByZXNzZWQgZGF0YSBiZWdpbnMgd2l0aCAzIGhlYWRlciBiaXRzCi0gICAgICAgICBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgZGF0YToKLQotICAgICAgICAgICAgZmlyc3QgYml0ICAgICAgIEJGSU5BTAotICAgICAgICAgICAgbmV4dCAyIGJpdHMgICAgIEJUWVBFCi0KLSAgICAgICAgIE5vdGUgdGhhdCB0aGUgaGVhZGVyIGJpdHMgZG8gbm90IG5lY2Vzc2FyaWx5IGJlZ2luIG9uIGEgYnl0ZQotICAgICAgICAgYm91bmRhcnksIHNpbmNlIGEgYmxvY2sgZG9lcyBub3QgbmVjZXNzYXJpbHkgb2NjdXB5IGFuIGludGVncmFsCi0gICAgICAgICBudW1iZXIgb2YgYnl0ZXMuCi0KLQotCi0KLQotRGV1dHNjaCAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDldCi0MCi1SRkMgMTk1MSAgICAgIERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgTWF5IDE5OTYKLQotCi0gICAgICAgICBCRklOQUwgaXMgc2V0IGlmIGFuZCBvbmx5IGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgb2YgdGhlIGRhdGEKLSAgICAgICAgIHNldC4KLQotICAgICAgICAgQlRZUEUgc3BlY2lmaWVzIGhvdyB0aGUgZGF0YSBhcmUgY29tcHJlc3NlZCwgYXMgZm9sbG93czoKLQotICAgICAgICAgICAgMDAgLSBubyBjb21wcmVzc2lvbgotICAgICAgICAgICAgMDEgLSBjb21wcmVzc2VkIHdpdGggZml4ZWQgSHVmZm1hbiBjb2RlcwotICAgICAgICAgICAgMTAgLSBjb21wcmVzc2VkIHdpdGggZHluYW1pYyBIdWZmbWFuIGNvZGVzCi0gICAgICAgICAgICAxMSAtIHJlc2VydmVkIChlcnJvcikKLQotICAgICAgICAgVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gY29tcHJlc3NlZCBjYXNlcyBpcyBob3cgdGhlCi0gICAgICAgICBIdWZmbWFuIGNvZGVzIGZvciB0aGUgbGl0ZXJhbC9sZW5ndGggYW5kIGRpc3RhbmNlIGFscGhhYmV0cyBhcmUKLSAgICAgICAgIGRlZmluZWQuCi0KLSAgICAgICAgIEluIGFsbCBjYXNlcywgdGhlIGRlY29kaW5nIGFsZ29yaXRobSBmb3IgdGhlIGFjdHVhbCBkYXRhIGlzIGFzCi0gICAgICAgICBmb2xsb3dzOgotCi0gICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgcmVhZCBibG9jayBoZWFkZXIgZnJvbSBpbnB1dCBzdHJlYW0uCi0gICAgICAgICAgICAgICBpZiBzdG9yZWQgd2l0aCBubyBjb21wcmVzc2lvbgotICAgICAgICAgICAgICAgICAgc2tpcCBhbnkgcmVtYWluaW5nIGJpdHMgaW4gY3VycmVudCBwYXJ0aWFsbHkKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCBieXRlCi0gICAgICAgICAgICAgICAgICByZWFkIExFTiBhbmQgTkxFTiAoc2VlIG5leHQgc2VjdGlvbikKLSAgICAgICAgICAgICAgICAgIGNvcHkgTEVOIGJ5dGVzIG9mIGRhdGEgdG8gb3V0cHV0Ci0gICAgICAgICAgICAgICBvdGhlcndpc2UKLSAgICAgICAgICAgICAgICAgIGlmIGNvbXByZXNzZWQgd2l0aCBkeW5hbWljIEh1ZmZtYW4gY29kZXMKLSAgICAgICAgICAgICAgICAgICAgIHJlYWQgcmVwcmVzZW50YXRpb24gb2YgY29kZSB0cmVlcyAoc2VlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdWJzZWN0aW9uIGJlbG93KQotICAgICAgICAgICAgICAgICAgbG9vcCAodW50aWwgZW5kIG9mIGJsb2NrIGNvZGUgcmVjb2duaXplZCkKLSAgICAgICAgICAgICAgICAgICAgIGRlY29kZSBsaXRlcmFsL2xlbmd0aCB2YWx1ZSBmcm9tIGlucHV0IHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWUgPCAyNTYKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgdmFsdWUgKGxpdGVyYWwgYnl0ZSkgdG8gb3V0cHV0IHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZSA9IGVuZCBvZiBibG9jayAoMjU2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgZnJvbSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgKHZhbHVlID0gMjU3Li4yODUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGUgZGlzdGFuY2UgZnJvbSBpbnB1dCBzdHJlYW0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZSBiYWNrd2FyZHMgZGlzdGFuY2UgYnl0ZXMgaW4gdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBhbmQgY29weSBsZW5ndGggYnl0ZXMgZnJvbSB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiB0byB0aGUgb3V0cHV0IHN0cmVhbS4KLSAgICAgICAgICAgICAgICAgIGVuZCBsb29wCi0gICAgICAgICAgICB3aGlsZSBub3QgbGFzdCBibG9jawotCi0gICAgICAgICBOb3RlIHRoYXQgYSBkdXBsaWNhdGVkIHN0cmluZyByZWZlcmVuY2UgbWF5IHJlZmVyIHRvIGEgc3RyaW5nCi0gICAgICAgICBpbiBhIHByZXZpb3VzIGJsb2NrOyBpLmUuLCB0aGUgYmFja3dhcmQgZGlzdGFuY2UgbWF5IGNyb3NzIG9uZQotICAgICAgICAgb3IgbW9yZSBibG9jayBib3VuZGFyaWVzLiAgSG93ZXZlciBhIGRpc3RhbmNlIGNhbm5vdCByZWZlciBwYXN0Ci0gICAgICAgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgc3RyZWFtLiAgKEFuIGFwcGxpY2F0aW9uIHVzaW5nIGEKLQotCi0KLURldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDEwXQotDAotUkZDIDE5NTEgICAgICBERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgIE1heSAxOTk2Ci0KLQotICAgICAgICAgcHJlc2V0IGRpY3Rpb25hcnkgbWlnaHQgZGlzY2FyZCBwYXJ0IG9mIHRoZSBvdXRwdXQgc3RyZWFtOyBhCi0gICAgICAgICBkaXN0YW5jZSBjYW4gcmVmZXIgdG8gdGhhdCBwYXJ0IG9mIHRoZSBvdXRwdXQgc3RyZWFtIGFueXdheSkKLSAgICAgICAgIE5vdGUgYWxzbyB0aGF0IHRoZSByZWZlcmVuY2VkIHN0cmluZyBtYXkgb3ZlcmxhcCB0aGUgY3VycmVudAotICAgICAgICAgcG9zaXRpb247IGZvciBleGFtcGxlLCBpZiB0aGUgbGFzdCAyIGJ5dGVzIGRlY29kZWQgaGF2ZSB2YWx1ZXMKLSAgICAgICAgIFggYW5kIFksIGEgc3RyaW5nIHJlZmVyZW5jZSB3aXRoIDxsZW5ndGggPSA1LCBkaXN0YW5jZSA9IDI+Ci0gICAgICAgICBhZGRzIFgsWSxYLFksWCB0byB0aGUgb3V0cHV0IHN0cmVhbS4KLQotICAgICAgICAgV2Ugbm93IHNwZWNpZnkgZWFjaCBjb21wcmVzc2lvbiBtZXRob2QgaW4gdHVybi4KLQotICAgICAgMy4yLjQuIE5vbi1jb21wcmVzc2VkIGJsb2NrcyAoQlRZUEU9MDApCi0KLSAgICAgICAgIEFueSBiaXRzIG9mIGlucHV0IHVwIHRvIHRoZSBuZXh0IGJ5dGUgYm91bmRhcnkgYXJlIGlnbm9yZWQuCi0gICAgICAgICBUaGUgcmVzdCBvZiB0aGUgYmxvY2sgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKLQotICAgICAgICAgICAgICAwICAgMSAgIDIgICAzICAgNC4uLgotICAgICAgICAgICAgKy0tLSstLS0rLS0tKy0tLSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKLSAgICAgICAgICAgIHwgIExFTiAgfCBOTEVOICB8Li4uIExFTiBieXRlcyBvZiBsaXRlcmFsIGRhdGEuLi58Ci0gICAgICAgICAgICArLS0tKy0tLSstLS0rLS0tKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KwotCi0gICAgICAgICBMRU4gaXMgdGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIGluIHRoZSBibG9jay4gIE5MRU4gaXMgdGhlCi0gICAgICAgICBvbmUncyBjb21wbGVtZW50IG9mIExFTi4KLQotICAgICAgMy4yLjUuIENvbXByZXNzZWQgYmxvY2tzIChsZW5ndGggYW5kIGRpc3RhbmNlIGNvZGVzKQotCi0gICAgICAgICBBcyBub3RlZCBhYm92ZSwgZW5jb2RlZCBkYXRhIGJsb2NrcyBpbiB0aGUgImRlZmxhdGUiIGZvcm1hdAotICAgICAgICAgY29uc2lzdCBvZiBzZXF1ZW5jZXMgb2Ygc3ltYm9scyBkcmF3biBmcm9tIHRocmVlIGNvbmNlcHR1YWxseQotICAgICAgICAgZGlzdGluY3QgYWxwaGFiZXRzOiBlaXRoZXIgbGl0ZXJhbCBieXRlcywgZnJvbSB0aGUgYWxwaGFiZXQgb2YKLSAgICAgICAgIGJ5dGUgdmFsdWVzICgwLi4yNTUpLCBvciA8bGVuZ3RoLCBiYWNrd2FyZCBkaXN0YW5jZT4gcGFpcnMsCi0gICAgICAgICB3aGVyZSB0aGUgbGVuZ3RoIGlzIGRyYXduIGZyb20gKDMuLjI1OCkgYW5kIHRoZSBkaXN0YW5jZSBpcwotICAgICAgICAgZHJhd24gZnJvbSAoMS4uMzIsNzY4KS4gIEluIGZhY3QsIHRoZSBsaXRlcmFsIGFuZCBsZW5ndGgKLSAgICAgICAgIGFscGhhYmV0cyBhcmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgYWxwaGFiZXQgKDAuLjI4NSksIHdoZXJlCi0gICAgICAgICB2YWx1ZXMgMC4uMjU1IHJlcHJlc2VudCBsaXRlcmFsIGJ5dGVzLCB0aGUgdmFsdWUgMjU2IGluZGljYXRlcwotICAgICAgICAgZW5kLW9mLWJsb2NrLCBhbmQgdmFsdWVzIDI1Ny4uMjg1IHJlcHJlc2VudCBsZW5ndGggY29kZXMKLSAgICAgICAgIChwb3NzaWJseSBpbiBjb25qdW5jdGlvbiB3aXRoIGV4dHJhIGJpdHMgZm9sbG93aW5nIHRoZSBzeW1ib2wKLSAgICAgICAgIGNvZGUpIGFzIGZvbGxvd3M6Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLURldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDExXQotDAotUkZDIDE5NTEgICAgICBERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgIE1heSAxOTk2Ci0KLQotICAgICAgICAgICAgICAgICBFeHRyYSAgICAgICAgICAgICAgIEV4dHJhICAgICAgICAgICAgICAgRXh0cmEKLSAgICAgICAgICAgIENvZGUgQml0cyBMZW5ndGgocykgQ29kZSBCaXRzIExlbmd0aHMgICBDb2RlIEJpdHMgTGVuZ3RoKHMpCi0gICAgICAgICAgICAtLS0tIC0tLS0gLS0tLS0tICAgICAtLS0tIC0tLS0gLS0tLS0tLSAgIC0tLS0gLS0tLSAtLS0tLS0tCi0gICAgICAgICAgICAgMjU3ICAgMCAgICAgMyAgICAgICAyNjcgICAxICAgMTUsMTYgICAgIDI3NyAgIDQgICA2Ny04MgotICAgICAgICAgICAgIDI1OCAgIDAgICAgIDQgICAgICAgMjY4ICAgMSAgIDE3LDE4ICAgICAyNzggICA0ICAgODMtOTgKLSAgICAgICAgICAgICAyNTkgICAwICAgICA1ICAgICAgIDI2OSAgIDIgICAxOS0yMiAgICAgMjc5ICAgNCAgIDk5LTExNAotICAgICAgICAgICAgIDI2MCAgIDAgICAgIDYgICAgICAgMjcwICAgMiAgIDIzLTI2ICAgICAyODAgICA0ICAxMTUtMTMwCi0gICAgICAgICAgICAgMjYxICAgMCAgICAgNyAgICAgICAyNzEgICAyICAgMjctMzAgICAgIDI4MSAgIDUgIDEzMS0xNjIKLSAgICAgICAgICAgICAyNjIgICAwICAgICA4ICAgICAgIDI3MiAgIDIgICAzMS0zNCAgICAgMjgyICAgNSAgMTYzLTE5NAotICAgICAgICAgICAgIDI2MyAgIDAgICAgIDkgICAgICAgMjczICAgMyAgIDM1LTQyICAgICAyODMgICA1ICAxOTUtMjI2Ci0gICAgICAgICAgICAgMjY0ICAgMCAgICAxMCAgICAgICAyNzQgICAzICAgNDMtNTAgICAgIDI4NCAgIDUgIDIyNy0yNTcKLSAgICAgICAgICAgICAyNjUgICAxICAxMSwxMiAgICAgIDI3NSAgIDMgICA1MS01OCAgICAgMjg1ICAgMCAgICAyNTgKLSAgICAgICAgICAgICAyNjYgICAxICAxMywxNCAgICAgIDI3NiAgIDMgICA1OS02NgotCi0gICAgICAgICBUaGUgZXh0cmEgYml0cyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBtYWNoaW5lIGludGVnZXIKLSAgICAgICAgIHN0b3JlZCB3aXRoIHRoZSBtb3N0LXNpZ25pZmljYW50IGJpdCBmaXJzdCwgZS5nLiwgYml0cyAxMTEwCi0gICAgICAgICByZXByZXNlbnQgdGhlIHZhbHVlIDE0LgotCi0gICAgICAgICAgICAgICAgICBFeHRyYSAgICAgICAgICAgRXh0cmEgICAgICAgICAgICAgICBFeHRyYQotICAgICAgICAgICAgIENvZGUgQml0cyBEaXN0ICBDb2RlIEJpdHMgICBEaXN0ICAgICBDb2RlIEJpdHMgRGlzdGFuY2UKLSAgICAgICAgICAgICAtLS0tIC0tLS0gLS0tLSAgLS0tLSAtLS0tICAtLS0tLS0gICAgLS0tLSAtLS0tIC0tLS0tLS0tCi0gICAgICAgICAgICAgICAwICAgMCAgICAxICAgICAxMCAgIDQgICAgIDMzLTQ4ICAgIDIwICAgIDkgICAxMDI1LTE1MzYKLSAgICAgICAgICAgICAgIDEgICAwICAgIDIgICAgIDExICAgNCAgICAgNDktNjQgICAgMjEgICAgOSAgIDE1MzctMjA0OAotICAgICAgICAgICAgICAgMiAgIDAgICAgMyAgICAgMTIgICA1ICAgICA2NS05NiAgICAyMiAgIDEwICAgMjA0OS0zMDcyCi0gICAgICAgICAgICAgICAzICAgMCAgICA0ICAgICAxMyAgIDUgICAgIDk3LTEyOCAgIDIzICAgMTAgICAzMDczLTQwOTYKLSAgICAgICAgICAgICAgIDQgICAxICAgNSw2ICAgIDE0ICAgNiAgICAxMjktMTkyICAgMjQgICAxMSAgIDQwOTctNjE0NAotICAgICAgICAgICAgICAgNSAgIDEgICA3LDggICAgMTUgICA2ICAgIDE5My0yNTYgICAyNSAgIDExICAgNjE0NS04MTkyCi0gICAgICAgICAgICAgICA2ICAgMiAgIDktMTIgICAxNiAgIDcgICAgMjU3LTM4NCAgIDI2ICAgMTIgIDgxOTMtMTIyODgKLSAgICAgICAgICAgICAgIDcgICAyICAxMy0xNiAgIDE3ICAgNyAgICAzODUtNTEyICAgMjcgICAxMiAxMjI4OS0xNjM4NAotICAgICAgICAgICAgICAgOCAgIDMgIDE3LTI0ICAgMTggICA4ICAgIDUxMy03NjggICAyOCAgIDEzIDE2Mzg1LTI0NTc2Ci0gICAgICAgICAgICAgICA5ICAgMyAgMjUtMzIgICAxOSAgIDggICA3NjktMTAyNCAgIDI5ICAgMTMgMjQ1NzctMzI3NjgKLQotICAgICAgMy4yLjYuIENvbXByZXNzaW9uIHdpdGggZml4ZWQgSHVmZm1hbiBjb2RlcyAoQlRZUEU9MDEpCi0KLSAgICAgICAgIFRoZSBIdWZmbWFuIGNvZGVzIGZvciB0aGUgdHdvIGFscGhhYmV0cyBhcmUgZml4ZWQsIGFuZCBhcmUgbm90Ci0gICAgICAgICByZXByZXNlbnRlZCBleHBsaWNpdGx5IGluIHRoZSBkYXRhLiAgVGhlIEh1ZmZtYW4gY29kZSBsZW5ndGhzCi0gICAgICAgICBmb3IgdGhlIGxpdGVyYWwvbGVuZ3RoIGFscGhhYmV0IGFyZToKLQotICAgICAgICAgICAgICAgICAgIExpdCBWYWx1ZSAgICBCaXRzICAgICAgICBDb2RlcwotICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLSAgICAtLS0tICAgICAgICAtLS0tLQotICAgICAgICAgICAgICAgICAgICAgMCAtIDE0MyAgICAgOCAgICAgICAgICAwMDExMDAwMCB0aHJvdWdoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTExMTExCi0gICAgICAgICAgICAgICAgICAgMTQ0IC0gMjU1ICAgICA5ICAgICAgICAgIDExMDAxMDAwMCB0aHJvdWdoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMTExMTExMQotICAgICAgICAgICAgICAgICAgIDI1NiAtIDI3OSAgICAgNyAgICAgICAgICAwMDAwMDAwIHRocm91Z2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDAxMDExMQotICAgICAgICAgICAgICAgICAgIDI4MCAtIDI4NyAgICAgOCAgICAgICAgICAxMTAwMDAwMCB0aHJvdWdoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDAwMTExCi0KLQotCi1EZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxMl0KLQwKLVJGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgotCi0KLSAgICAgICAgIFRoZSBjb2RlIGxlbmd0aHMgYXJlIHN1ZmZpY2llbnQgdG8gZ2VuZXJhdGUgdGhlIGFjdHVhbCBjb2RlcywKLSAgICAgICAgIGFzIGRlc2NyaWJlZCBhYm92ZTsgd2Ugc2hvdyB0aGUgY29kZXMgaW4gdGhlIHRhYmxlIGZvciBhZGRlZAotICAgICAgICAgY2xhcml0eS4gIExpdGVyYWwvbGVuZ3RoIHZhbHVlcyAyODYtMjg3IHdpbGwgbmV2ZXIgYWN0dWFsbHkKLSAgICAgICAgIG9jY3VyIGluIHRoZSBjb21wcmVzc2VkIGRhdGEsIGJ1dCBwYXJ0aWNpcGF0ZSBpbiB0aGUgY29kZQotICAgICAgICAgY29uc3RydWN0aW9uLgotCi0gICAgICAgICBEaXN0YW5jZSBjb2RlcyAwLTMxIGFyZSByZXByZXNlbnRlZCBieSAoZml4ZWQtbGVuZ3RoKSA1LWJpdAotICAgICAgICAgY29kZXMsIHdpdGggcG9zc2libGUgYWRkaXRpb25hbCBiaXRzIGFzIHNob3duIGluIHRoZSB0YWJsZQotICAgICAgICAgc2hvd24gaW4gUGFyYWdyYXBoIDMuMi41LCBhYm92ZS4gIE5vdGUgdGhhdCBkaXN0YW5jZSBjb2RlcyAzMC0KLSAgICAgICAgIDMxIHdpbGwgbmV2ZXIgYWN0dWFsbHkgb2NjdXIgaW4gdGhlIGNvbXByZXNzZWQgZGF0YS4KLQotICAgICAgMy4yLjcuIENvbXByZXNzaW9uIHdpdGggZHluYW1pYyBIdWZmbWFuIGNvZGVzIChCVFlQRT0xMCkKLQotICAgICAgICAgVGhlIEh1ZmZtYW4gY29kZXMgZm9yIHRoZSB0d28gYWxwaGFiZXRzIGFwcGVhciBpbiB0aGUgYmxvY2sKLSAgICAgICAgIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBoZWFkZXIgYml0cyBhbmQgYmVmb3JlIHRoZSBhY3R1YWwKLSAgICAgICAgIGNvbXByZXNzZWQgZGF0YSwgZmlyc3QgdGhlIGxpdGVyYWwvbGVuZ3RoIGNvZGUgYW5kIHRoZW4gdGhlCi0gICAgICAgICBkaXN0YW5jZSBjb2RlLiAgRWFjaCBjb2RlIGlzIGRlZmluZWQgYnkgYSBzZXF1ZW5jZSBvZiBjb2RlCi0gICAgICAgICBsZW5ndGhzLCBhcyBkaXNjdXNzZWQgaW4gUGFyYWdyYXBoIDMuMi4yLCBhYm92ZS4gIEZvciBldmVuCi0gICAgICAgICBncmVhdGVyIGNvbXBhY3RuZXNzLCB0aGUgY29kZSBsZW5ndGggc2VxdWVuY2VzIHRoZW1zZWx2ZXMgYXJlCi0gICAgICAgICBjb21wcmVzc2VkIHVzaW5nIGEgSHVmZm1hbiBjb2RlLiAgVGhlIGFscGhhYmV0IGZvciBjb2RlIGxlbmd0aHMKLSAgICAgICAgIGlzIGFzIGZvbGxvd3M6Ci0KLSAgICAgICAgICAgICAgIDAgLSAxNTogUmVwcmVzZW50IGNvZGUgbGVuZ3RocyBvZiAwIC0gMTUKLSAgICAgICAgICAgICAgICAgICAxNjogQ29weSB0aGUgcHJldmlvdXMgY29kZSBsZW5ndGggMyAtIDYgdGltZXMuCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSBuZXh0IDIgYml0cyBpbmRpY2F0ZSByZXBlYXQgbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwID0gMywgLi4uICwgMyA9IDYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6ICBDb2RlcyA4LCAxNiAoKzIgYml0cyAxMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiAoKzIgYml0cyAxMCkgd2lsbCBleHBhbmQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyIGNvZGUgbGVuZ3RocyBvZiA4ICgxICsgNiArIDUpCi0gICAgICAgICAgICAgICAgICAgMTc6IFJlcGVhdCBhIGNvZGUgbGVuZ3RoIG9mIDAgZm9yIDMgLSAxMCB0aW1lcy4KLSAgICAgICAgICAgICAgICAgICAgICAgKDMgYml0cyBvZiBsZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgMTg6IFJlcGVhdCBhIGNvZGUgbGVuZ3RoIG9mIDAgZm9yIDExIC0gMTM4IHRpbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICg3IGJpdHMgb2YgbGVuZ3RoKQotCi0gICAgICAgICBBIGNvZGUgbGVuZ3RoIG9mIDAgaW5kaWNhdGVzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgc3ltYm9sIGluCi0gICAgICAgICB0aGUgbGl0ZXJhbC9sZW5ndGggb3IgZGlzdGFuY2UgYWxwaGFiZXQgd2lsbCBub3Qgb2NjdXIgaW4gdGhlCi0gICAgICAgICBibG9jaywgYW5kIHNob3VsZCBub3QgcGFydGljaXBhdGUgaW4gdGhlIEh1ZmZtYW4gY29kZQotICAgICAgICAgY29uc3RydWN0aW9uIGFsZ29yaXRobSBnaXZlbiBlYXJsaWVyLiAgSWYgb25seSBvbmUgZGlzdGFuY2UKLSAgICAgICAgIGNvZGUgaXMgdXNlZCwgaXQgaXMgZW5jb2RlZCB1c2luZyBvbmUgYml0LCBub3QgemVybyBiaXRzOyBpbgotICAgICAgICAgdGhpcyBjYXNlIHRoZXJlIGlzIGEgc2luZ2xlIGNvZGUgbGVuZ3RoIG9mIG9uZSwgd2l0aCBvbmUgdW51c2VkCi0gICAgICAgICBjb2RlLiAgT25lIGRpc3RhbmNlIGNvZGUgb2YgemVybyBiaXRzIG1lYW5zIHRoYXQgdGhlcmUgYXJlIG5vCi0gICAgICAgICBkaXN0YW5jZSBjb2RlcyB1c2VkIGF0IGFsbCAodGhlIGRhdGEgaXMgYWxsIGxpdGVyYWxzKS4KLQotICAgICAgICAgV2UgY2FuIG5vdyBkZWZpbmUgdGhlIGZvcm1hdCBvZiB0aGUgYmxvY2s6Ci0KLSAgICAgICAgICAgICAgIDUgQml0czogSExJVCwgIyBvZiBMaXRlcmFsL0xlbmd0aCBjb2RlcyAtIDI1NyAoMjU3IC0gMjg2KQotICAgICAgICAgICAgICAgNSBCaXRzOiBIRElTVCwgIyBvZiBEaXN0YW5jZSBjb2RlcyAtIDEgICAgICAgICgxIC0gMzIpCi0gICAgICAgICAgICAgICA0IEJpdHM6IEhDTEVOLCAjIG9mIENvZGUgTGVuZ3RoIGNvZGVzIC0gNCAgICAgKDQgLSAxOSkKLQotCi0KLURldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDEzXQotDAotUkZDIDE5NTEgICAgICBERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgIE1heSAxOTk2Ci0KLQotICAgICAgICAgICAgICAgKEhDTEVOICsgNCkgeCAzIGJpdHM6IGNvZGUgbGVuZ3RocyBmb3IgdGhlIGNvZGUgbGVuZ3RoCi0gICAgICAgICAgICAgICAgICBhbHBoYWJldCBnaXZlbiBqdXN0IGFib3ZlLCBpbiB0aGUgb3JkZXI6IDE2LCAxNywgMTgsCi0gICAgICAgICAgICAgICAgICAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1Ci0KLSAgICAgICAgICAgICAgICAgIFRoZXNlIGNvZGUgbGVuZ3RocyBhcmUgaW50ZXJwcmV0ZWQgYXMgMy1iaXQgaW50ZWdlcnMKLSAgICAgICAgICAgICAgICAgICgwLTcpOyBhcyBhYm92ZSwgYSBjb2RlIGxlbmd0aCBvZiAwIG1lYW5zIHRoZQotICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBzeW1ib2wgKGxpdGVyYWwvbGVuZ3RoIG9yIGRpc3RhbmNlIGNvZGUKLSAgICAgICAgICAgICAgICAgIGxlbmd0aCkgaXMgbm90IHVzZWQuCi0KLSAgICAgICAgICAgICAgIEhMSVQgKyAyNTcgY29kZSBsZW5ndGhzIGZvciB0aGUgbGl0ZXJhbC9sZW5ndGggYWxwaGFiZXQsCi0gICAgICAgICAgICAgICAgICBlbmNvZGVkIHVzaW5nIHRoZSBjb2RlIGxlbmd0aCBIdWZmbWFuIGNvZGUKLQotICAgICAgICAgICAgICAgSERJU1QgKyAxIGNvZGUgbGVuZ3RocyBmb3IgdGhlIGRpc3RhbmNlIGFscGhhYmV0LAotICAgICAgICAgICAgICAgICAgZW5jb2RlZCB1c2luZyB0aGUgY29kZSBsZW5ndGggSHVmZm1hbiBjb2RlCi0KLSAgICAgICAgICAgICAgIFRoZSBhY3R1YWwgY29tcHJlc3NlZCBkYXRhIG9mIHRoZSBibG9jaywKLSAgICAgICAgICAgICAgICAgIGVuY29kZWQgdXNpbmcgdGhlIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBIdWZmbWFuCi0gICAgICAgICAgICAgICAgICBjb2RlcwotCi0gICAgICAgICAgICAgICBUaGUgbGl0ZXJhbC9sZW5ndGggc3ltYm9sIDI1NiAoZW5kIG9mIGRhdGEpLAotICAgICAgICAgICAgICAgICAgZW5jb2RlZCB1c2luZyB0aGUgbGl0ZXJhbC9sZW5ndGggSHVmZm1hbiBjb2RlCi0KLSAgICAgICAgIFRoZSBjb2RlIGxlbmd0aCByZXBlYXQgY29kZXMgY2FuIGNyb3NzIGZyb20gSExJVCArIDI1NyB0byB0aGUKLSAgICAgICAgIEhESVNUICsgMSBjb2RlIGxlbmd0aHMuICBJbiBvdGhlciB3b3JkcywgYWxsIGNvZGUgbGVuZ3RocyBmb3JtCi0gICAgICAgICBhIHNpbmdsZSBzZXF1ZW5jZSBvZiBITElUICsgSERJU1QgKyAyNTggdmFsdWVzLgotCi0gICAzLjMuIENvbXBsaWFuY2UKLQotICAgICAgQSBjb21wcmVzc29yIG1heSBsaW1pdCBmdXJ0aGVyIHRoZSByYW5nZXMgb2YgdmFsdWVzIHNwZWNpZmllZCBpbgotICAgICAgdGhlIHByZXZpb3VzIHNlY3Rpb24gYW5kIHN0aWxsIGJlIGNvbXBsaWFudDsgZm9yIGV4YW1wbGUsIGl0IG1heQotICAgICAgbGltaXQgdGhlIHJhbmdlIG9mIGJhY2t3YXJkIHBvaW50ZXJzIHRvIHNvbWUgdmFsdWUgc21hbGxlciB0aGFuCi0gICAgICAzMksuICBTaW1pbGFybHksIGEgY29tcHJlc3NvciBtYXkgbGltaXQgdGhlIHNpemUgb2YgYmxvY2tzIHNvIHRoYXQKLSAgICAgIGEgY29tcHJlc3NpYmxlIGJsb2NrIGZpdHMgaW4gbWVtb3J5LgotCi0gICAgICBBIGNvbXBsaWFudCBkZWNvbXByZXNzb3IgbXVzdCBhY2NlcHQgdGhlIGZ1bGwgcmFuZ2Ugb2YgcG9zc2libGUKLSAgICAgIHZhbHVlcyBkZWZpbmVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCBhbmQgbXVzdCBhY2NlcHQgYmxvY2tzIG9mCi0gICAgICBhcmJpdHJhcnkgc2l6ZS4KLQotNC4gQ29tcHJlc3Npb24gYWxnb3JpdGhtIGRldGFpbHMKLQotICAgV2hpbGUgaXQgaXMgdGhlIGludGVudCBvZiB0aGlzIGRvY3VtZW50IHRvIGRlZmluZSB0aGUgImRlZmxhdGUiCi0gICBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHdpdGhvdXQgcmVmZXJlbmNlIHRvIGFueSBwYXJ0aWN1bGFyCi0gICBjb21wcmVzc2lvbiBhbGdvcml0aG0sIHRoZSBmb3JtYXQgaXMgcmVsYXRlZCB0byB0aGUgY29tcHJlc3NlZAotICAgZm9ybWF0cyBwcm9kdWNlZCBieSBMWjc3IChMZW1wZWwtWml2IDE5NzcsIHNlZSByZWZlcmVuY2UgWzJdIGJlbG93KTsKLSAgIHNpbmNlIG1hbnkgdmFyaWF0aW9ucyBvZiBMWjc3IGFyZSBwYXRlbnRlZCwgaXQgaXMgc3Ryb25nbHkKLSAgIHJlY29tbWVuZGVkIHRoYXQgdGhlIGltcGxlbWVudG9yIG9mIGEgY29tcHJlc3NvciBmb2xsb3cgdGhlIGdlbmVyYWwKLSAgIGFsZ29yaXRobSBwcmVzZW50ZWQgaGVyZSwgd2hpY2ggaXMga25vd24gbm90IHRvIGJlIHBhdGVudGVkIHBlciBzZS4KLSAgIFRoZSBtYXRlcmlhbCBpbiB0aGlzIHNlY3Rpb24gaXMgbm90IHBhcnQgb2YgdGhlIGRlZmluaXRpb24gb2YgdGhlCi0KLQotCi1EZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxNF0KLQwKLVJGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgotCi0KLSAgIHNwZWNpZmljYXRpb24gcGVyIHNlLCBhbmQgYSBjb21wcmVzc29yIG5lZWQgbm90IGZvbGxvdyBpdCBpbiBvcmRlciB0bwotICAgYmUgY29tcGxpYW50LgotCi0gICBUaGUgY29tcHJlc3NvciB0ZXJtaW5hdGVzIGEgYmxvY2sgd2hlbiBpdCBkZXRlcm1pbmVzIHRoYXQgc3RhcnRpbmcgYQotICAgbmV3IGJsb2NrIHdpdGggZnJlc2ggdHJlZXMgd291bGQgYmUgdXNlZnVsLCBvciB3aGVuIHRoZSBibG9jayBzaXplCi0gICBmaWxscyB1cCB0aGUgY29tcHJlc3NvcidzIGJsb2NrIGJ1ZmZlci4KLQotICAgVGhlIGNvbXByZXNzb3IgdXNlcyBhIGNoYWluZWQgaGFzaCB0YWJsZSB0byBmaW5kIGR1cGxpY2F0ZWQgc3RyaW5ncywKLSAgIHVzaW5nIGEgaGFzaCBmdW5jdGlvbiB0aGF0IG9wZXJhdGVzIG9uIDMtYnl0ZSBzZXF1ZW5jZXMuICBBdCBhbnkKLSAgIGdpdmVuIHBvaW50IGR1cmluZyBjb21wcmVzc2lvbiwgbGV0IFhZWiBiZSB0aGUgbmV4dCAzIGlucHV0IGJ5dGVzIHRvCi0gICBiZSBleGFtaW5lZCAobm90IG5lY2Vzc2FyaWx5IGFsbCBkaWZmZXJlbnQsIG9mIGNvdXJzZSkuICBGaXJzdCwgdGhlCi0gICBjb21wcmVzc29yIGV4YW1pbmVzIHRoZSBoYXNoIGNoYWluIGZvciBYWVouICBJZiB0aGUgY2hhaW4gaXMgZW1wdHksCi0gICB0aGUgY29tcHJlc3NvciBzaW1wbHkgd3JpdGVzIG91dCBYIGFzIGEgbGl0ZXJhbCBieXRlIGFuZCBhZHZhbmNlcyBvbmUKLSAgIGJ5dGUgaW4gdGhlIGlucHV0LiAgSWYgdGhlIGhhc2ggY2hhaW4gaXMgbm90IGVtcHR5LCBpbmRpY2F0aW5nIHRoYXQKLSAgIHRoZSBzZXF1ZW5jZSBYWVogKG9yLCBpZiB3ZSBhcmUgdW5sdWNreSwgc29tZSBvdGhlciAzIGJ5dGVzIHdpdGggdGhlCi0gICBzYW1lIGhhc2ggZnVuY3Rpb24gdmFsdWUpIGhhcyBvY2N1cnJlZCByZWNlbnRseSwgdGhlIGNvbXByZXNzb3IKLSAgIGNvbXBhcmVzIGFsbCBzdHJpbmdzIG9uIHRoZSBYWVogaGFzaCBjaGFpbiB3aXRoIHRoZSBhY3R1YWwgaW5wdXQgZGF0YQotICAgc2VxdWVuY2Ugc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgcG9pbnQsIGFuZCBzZWxlY3RzIHRoZSBsb25nZXN0Ci0gICBtYXRjaC4KLQotICAgVGhlIGNvbXByZXNzb3Igc2VhcmNoZXMgdGhlIGhhc2ggY2hhaW5zIHN0YXJ0aW5nIHdpdGggdGhlIG1vc3QgcmVjZW50Ci0gICBzdHJpbmdzLCB0byBmYXZvciBzbWFsbCBkaXN0YW5jZXMgYW5kIHRodXMgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlCi0gICBIdWZmbWFuIGVuY29kaW5nLiAgVGhlIGhhc2ggY2hhaW5zIGFyZSBzaW5nbHkgbGlua2VkLiBUaGVyZSBhcmUgbm8KLSAgIGRlbGV0aW9ucyBmcm9tIHRoZSBoYXNoIGNoYWluczsgdGhlIGFsZ29yaXRobSBzaW1wbHkgZGlzY2FyZHMgbWF0Y2hlcwotICAgdGhhdCBhcmUgdG9vIG9sZC4gIFRvIGF2b2lkIGEgd29yc3QtY2FzZSBzaXR1YXRpb24sIHZlcnkgbG9uZyBoYXNoCi0gICBjaGFpbnMgYXJlIGFyYml0cmFyaWx5IHRydW5jYXRlZCBhdCBhIGNlcnRhaW4gbGVuZ3RoLCBkZXRlcm1pbmVkIGJ5IGEKLSAgIHJ1bi10aW1lIHBhcmFtZXRlci4KLQotICAgVG8gaW1wcm92ZSBvdmVyYWxsIGNvbXByZXNzaW9uLCB0aGUgY29tcHJlc3NvciBvcHRpb25hbGx5IGRlZmVycyB0aGUKLSAgIHNlbGVjdGlvbiBvZiBtYXRjaGVzICgibGF6eSBtYXRjaGluZyIpOiBhZnRlciBhIG1hdGNoIG9mIGxlbmd0aCBOIGhhcwotICAgYmVlbiBmb3VuZCwgdGhlIGNvbXByZXNzb3Igc2VhcmNoZXMgZm9yIGEgbG9uZ2VyIG1hdGNoIHN0YXJ0aW5nIGF0Ci0gICB0aGUgbmV4dCBpbnB1dCBieXRlLiAgSWYgaXQgZmluZHMgYSBsb25nZXIgbWF0Y2gsIGl0IHRydW5jYXRlcyB0aGUKLSAgIHByZXZpb3VzIG1hdGNoIHRvIGEgbGVuZ3RoIG9mIG9uZSAodGh1cyBwcm9kdWNpbmcgYSBzaW5nbGUgbGl0ZXJhbAotICAgYnl0ZSkgYW5kIHRoZW4gZW1pdHMgdGhlIGxvbmdlciBtYXRjaC4gIE90aGVyd2lzZSwgaXQgZW1pdHMgdGhlCi0gICBvcmlnaW5hbCBtYXRjaCwgYW5kLCBhcyBkZXNjcmliZWQgYWJvdmUsIGFkdmFuY2VzIE4gYnl0ZXMgYmVmb3JlCi0gICBjb250aW51aW5nLgotCi0gICBSdW4tdGltZSBwYXJhbWV0ZXJzIGFsc28gY29udHJvbCB0aGlzICJsYXp5IG1hdGNoIiBwcm9jZWR1cmUuICBJZgotICAgY29tcHJlc3Npb24gcmF0aW8gaXMgbW9zdCBpbXBvcnRhbnQsIHRoZSBjb21wcmVzc29yIGF0dGVtcHRzIGEKLSAgIGNvbXBsZXRlIHNlY29uZCBzZWFyY2ggcmVnYXJkbGVzcyBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBmaXJzdCBtYXRjaC4KLSAgIEluIHRoZSBub3JtYWwgY2FzZSwgaWYgdGhlIGN1cnJlbnQgbWF0Y2ggaXMgImxvbmcgZW5vdWdoIiwgdGhlCi0gICBjb21wcmVzc29yIHJlZHVjZXMgdGhlIHNlYXJjaCBmb3IgYSBsb25nZXIgbWF0Y2gsIHRodXMgc3BlZWRpbmcgdXAKLSAgIHRoZSBwcm9jZXNzLiAgSWYgc3BlZWQgaXMgbW9zdCBpbXBvcnRhbnQsIHRoZSBjb21wcmVzc29yIGluc2VydHMgbmV3Ci0gICBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgd2hlbiBubyBtYXRjaCB3YXMgZm91bmQsIG9yIHdoZW4gdGhlCi0gICBtYXRjaCBpcyBub3QgInRvbyBsb25nIi4gIFRoaXMgZGVncmFkZXMgdGhlIGNvbXByZXNzaW9uIHJhdGlvIGJ1dAotICAgc2F2ZXMgdGltZSBzaW5jZSB0aGVyZSBhcmUgYm90aCBmZXdlciBpbnNlcnRpb25zIGFuZCBmZXdlciBzZWFyY2hlcy4KLQotCi0KLQotCi1EZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxNV0KLQwKLVJGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgotCi0KLTUuIFJlZmVyZW5jZXMKLQotICAgWzFdIEh1ZmZtYW4sIEQuIEEuLCAiQSBNZXRob2QgZm9yIHRoZSBDb25zdHJ1Y3Rpb24gb2YgTWluaW11bQotICAgICAgIFJlZHVuZGFuY3kgQ29kZXMiLCBQcm9jZWVkaW5ncyBvZiB0aGUgSW5zdGl0dXRlIG9mIFJhZGlvCi0gICAgICAgRW5naW5lZXJzLCBTZXB0ZW1iZXIgMTk1MiwgVm9sdW1lIDQwLCBOdW1iZXIgOSwgcHAuIDEwOTgtMTEwMS4KLQotICAgWzJdIFppdiBKLiwgTGVtcGVsIEEuLCAiQSBVbml2ZXJzYWwgQWxnb3JpdGhtIGZvciBTZXF1ZW50aWFsIERhdGEKLSAgICAgICBDb21wcmVzc2lvbiIsIElFRUUgVHJhbnNhY3Rpb25zIG9uIEluZm9ybWF0aW9uIFRoZW9yeSwgVm9sLiAyMywKLSAgICAgICBOby4gMywgcHAuIDMzNy0zNDMuCi0KLSAgIFszXSBHYWlsbHksIEouLUwuLCBhbmQgQWRsZXIsIE0uLCBaTElCIGRvY3VtZW50YXRpb24gYW5kIHNvdXJjZXMsCi0gICAgICAgYXZhaWxhYmxlIGluIGZ0cDovL2Z0cC51dS5uZXQvcHViL2FyY2hpdmluZy96aXAvZG9jLwotCi0gICBbNF0gR2FpbGx5LCBKLi1MLiwgYW5kIEFkbGVyLCBNLiwgR1pJUCBkb2N1bWVudGF0aW9uIGFuZCBzb3VyY2VzLAotICAgICAgIGF2YWlsYWJsZSBhcyBnemlwLSoudGFyIGluIGZ0cDovL3ByZXAuYWkubWl0LmVkdS9wdWIvZ251LwotCi0gICBbNV0gU2Nod2FydHosIEUuIFMuLCBhbmQgS2FsbGljaywgQi4gIkdlbmVyYXRpbmcgYSBjYW5vbmljYWwgcHJlZml4Ci0gICAgICAgZW5jb2RpbmcuIiBDb21tLiBBQ00sIDcsMyAoTWFyLiAxOTY0KSwgcHAuIDE2Ni0xNjkuCi0KLSAgIFs2XSBIaXJzY2hiZXJnIGFuZCBMZWxld2VyLCAiRWZmaWNpZW50IGRlY29kaW5nIG9mIHByZWZpeCBjb2RlcywiCi0gICAgICAgQ29tbS4gQUNNLCAzMyw0LCBBcHJpbCAxOTkwLCBwcC4gNDQ5LTQ1OS4KLQotNi4gU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMKLQotICAgQW55IGRhdGEgY29tcHJlc3Npb24gbWV0aG9kIGludm9sdmVzIHRoZSByZWR1Y3Rpb24gb2YgcmVkdW5kYW5jeSBpbgotICAgdGhlIGRhdGEuICBDb25zZXF1ZW50bHksIGFueSBjb3JydXB0aW9uIG9mIHRoZSBkYXRhIGlzIGxpa2VseSB0byBoYXZlCi0gICBzZXZlcmUgZWZmZWN0cyBhbmQgYmUgZGlmZmljdWx0IHRvIGNvcnJlY3QuICBVbmNvbXByZXNzZWQgdGV4dCwgb24KLSAgIHRoZSBvdGhlciBoYW5kLCB3aWxsIHByb2JhYmx5IHN0aWxsIGJlIHJlYWRhYmxlIGRlc3BpdGUgdGhlIHByZXNlbmNlCi0gICBvZiBzb21lIGNvcnJ1cHRlZCBieXRlcy4KLQotICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBzeXN0ZW1zIHVzaW5nIHRoaXMgZGF0YSBmb3JtYXQgcHJvdmlkZSBzb21lCi0gICBtZWFucyBvZiB2YWxpZGF0aW5nIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGNvbXByZXNzZWQgZGF0YS4gIFNlZQotICAgcmVmZXJlbmNlIFszXSwgZm9yIGV4YW1wbGUuCi0KLTcuIFNvdXJjZSBjb2RlCi0KLSAgIFNvdXJjZSBjb2RlIGZvciBhIEMgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb24gb2YgYSAiZGVmbGF0ZSIgY29tcGxpYW50Ci0gICBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgaXMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgemxpYiBwYWNrYWdlIGF0Ci0gICBmdHA6Ly9mdHAudXUubmV0L3B1Yi9hcmNoaXZpbmcvemlwL3psaWIvLgotCi04LiBBY2tub3dsZWRnZW1lbnRzCi0KLSAgIFRyYWRlbWFya3MgY2l0ZWQgaW4gdGhpcyBkb2N1bWVudCBhcmUgdGhlIHByb3BlcnR5IG9mIHRoZWlyCi0gICByZXNwZWN0aXZlIG93bmVycy4KLQotICAgUGhpbCBLYXR6IGRlc2lnbmVkIHRoZSBkZWZsYXRlIGZvcm1hdC4gIEplYW4tTG91cCBHYWlsbHkgYW5kIE1hcmsKLSAgIEFkbGVyIHdyb3RlIHRoZSByZWxhdGVkIHNvZnR3YXJlIGRlc2NyaWJlZCBpbiB0aGlzIHNwZWNpZmljYXRpb24uCi0gICBHbGVubiBSYW5kZXJzLVBlaHJzb24gY29udmVydGVkIHRoaXMgZG9jdW1lbnQgdG8gUkZDIGFuZCBIVE1MIGZvcm1hdC4KLQotCi0KLURldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDE2XQotDAotUkZDIDE5NTEgICAgICBERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgIE1heSAxOTk2Ci0KLQotOS4gQXV0aG9yJ3MgQWRkcmVzcwotCi0gICBMLiBQZXRlciBEZXV0c2NoCi0gICBBbGFkZGluIEVudGVycHJpc2VzCi0gICAyMDMgU2FudGEgTWFyZ2FyaXRhIEF2ZS4KLSAgIE1lbmxvIFBhcmssIENBIDk0MDI1Ci0KLSAgIFBob25lOiAoNDE1KSAzMjItMDEwMyAoQU0gb25seSkKLSAgIEZBWDogICAoNDE1KSAzMjItMTczNAotICAgRU1haWw6IDxnaG9zdEBhbGFkZGluLmNvbT4KLQotICAgUXVlc3Rpb25zIGFib3V0IHRoZSB0ZWNobmljYWwgY29udGVudCBvZiB0aGlzIHNwZWNpZmljYXRpb24gY2FuIGJlCi0gICBzZW50IGJ5IGVtYWlsIHRvOgotCi0gICBKZWFuLUxvdXAgR2FpbGx5IDxnemlwQHByZXAuYWkubWl0LmVkdT4gYW5kCi0gICBNYXJrIEFkbGVyIDxtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PgotCi0gICBFZGl0b3JpYWwgY29tbWVudHMgb24gdGhpcyBzcGVjaWZpY2F0aW9uIGNhbiBiZSBzZW50IGJ5IGVtYWlsIHRvOgotCi0gICBMLiBQZXRlciBEZXV0c2NoIDxnaG9zdEBhbGFkZGluLmNvbT4gYW5kCi0gICBHbGVubiBSYW5kZXJzLVBlaHJzb24gPHJhbmRlZ0BhbHVtbmkucnBpLmVkdT4KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLURldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDE3XQotDApkaWZmIC0tZ2l0IGEvc3JjL3psaWIvZG9jL3JmYzE5NTIudHh0IGIvc3JjL3psaWIvZG9jL3JmYzE5NTIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGU1MWI0Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2RvYy9yZmMxOTUyLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDY3NSArMCwwIEBACi0KLQotCi0KLQotCi1OZXR3b3JrIFdvcmtpbmcgR3JvdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAuIERldXRzY2gKLVJlcXVlc3QgZm9yIENvbW1lbnRzOiAxOTUyICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxhZGRpbiBFbnRlcnByaXNlcwotQ2F0ZWdvcnk6IEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heSAxOTk2Ci0KLQotICAgICAgICAgICAgICAgR1pJUCBmaWxlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gNC4zCi0KLVN0YXR1cyBvZiBUaGlzIE1lbW8KLQotICAgVGhpcyBtZW1vIHByb3ZpZGVzIGluZm9ybWF0aW9uIGZvciB0aGUgSW50ZXJuZXQgY29tbXVuaXR5LiAgVGhpcyBtZW1vCi0gICBkb2VzIG5vdCBzcGVjaWZ5IGFuIEludGVybmV0IHN0YW5kYXJkIG9mIGFueSBraW5kLiAgRGlzdHJpYnV0aW9uIG9mCi0gICB0aGlzIG1lbW8gaXMgdW5saW1pdGVkLgotCi1JRVNHIE5vdGU6Ci0KLSAgIFRoZSBJRVNHIHRha2VzIG5vIHBvc2l0aW9uIG9uIHRoZSB2YWxpZGl0eSBvZiBhbnkgSW50ZWxsZWN0dWFsCi0gICBQcm9wZXJ0eSBSaWdodHMgc3RhdGVtZW50cyBjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudC4KLQotTm90aWNlcwotCi0gICBDb3B5cmlnaHQgKGMpIDE5OTYgTC4gUGV0ZXIgRGV1dHNjaAotCi0gICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGlzIGRvY3VtZW50IGZvciBhbnkKLSAgIHB1cnBvc2UgYW5kIHdpdGhvdXQgY2hhcmdlLCBpbmNsdWRpbmcgdHJhbnNsYXRpb25zIGludG8gb3RoZXIKLSAgIGxhbmd1YWdlcyBhbmQgaW5jb3Jwb3JhdGlvbiBpbnRvIGNvbXBpbGF0aW9ucywgcHJvdmlkZWQgdGhhdCB0aGUKLSAgIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQsIGFuZCB0aGF0IGFueQotICAgc3Vic3RhbnRpdmUgY2hhbmdlcyBvciBkZWxldGlvbnMgZnJvbSB0aGUgb3JpZ2luYWwgYXJlIGNsZWFybHkKLSAgIG1hcmtlZC4KLQotICAgQSBwb2ludGVyIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24gaW4KLSAgIEhUTUwgZm9ybWF0IGNhbiBiZSBmb3VuZCBhdCB0aGUgVVJMCi0gICA8ZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzL3psaWIvemRvYy1pbmRleC5odG1sPi4KLQotQWJzdHJhY3QKLQotICAgVGhpcyBzcGVjaWZpY2F0aW9uIGRlZmluZXMgYSBsb3NzbGVzcyBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHRoYXQgaXMKLSAgIGNvbXBhdGlibGUgd2l0aCB0aGUgd2lkZWx5IHVzZWQgR1pJUCB1dGlsaXR5LiAgVGhlIGZvcm1hdCBpbmNsdWRlcyBhCi0gICBjeWNsaWMgcmVkdW5kYW5jeSBjaGVjayB2YWx1ZSBmb3IgZGV0ZWN0aW5nIGRhdGEgY29ycnVwdGlvbi4gIFRoZQotICAgZm9ybWF0IHByZXNlbnRseSB1c2VzIHRoZSBERUZMQVRFIG1ldGhvZCBvZiBjb21wcmVzc2lvbiBidXQgY2FuIGJlCi0gICBlYXNpbHkgZXh0ZW5kZWQgdG8gdXNlIG90aGVyIGNvbXByZXNzaW9uIG1ldGhvZHMuICBUaGUgZm9ybWF0IGNhbiBiZQotICAgaW1wbGVtZW50ZWQgcmVhZGlseSBpbiBhIG1hbm5lciBub3QgY292ZXJlZCBieSBwYXRlbnRzLgotCi0KLQotCi0KLQotCi0KLQotCi1EZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgMV0KLQwKLVJGQyAxOTUyICAgICAgICAgICAgIEdaSVAgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgICAgICBNYXkgMTk5NgotCi0KLVRhYmxlIG9mIENvbnRlbnRzCi0KLSAgIDEuIEludHJvZHVjdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMgotICAgICAgMS4xLiBQdXJwb3NlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAyCi0gICAgICAxLjIuIEludGVuZGVkIGF1ZGllbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDMKLSAgICAgIDEuMy4gU2NvcGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMwotICAgICAgMS40LiBDb21wbGlhbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAzCi0gICAgICAxLjUuIERlZmluaXRpb25zIG9mIHRlcm1zIGFuZCBjb252ZW50aW9ucyB1c2VkIC4uLi4uLi4uLi4uLi4uLi4uIDMKLSAgICAgIDEuNi4gQ2hhbmdlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMwotICAgMi4gRGV0YWlsZWQgc3BlY2lmaWNhdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA0Ci0gICAgICAyLjEuIE92ZXJhbGwgY29udmVudGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDQKLSAgICAgIDIuMi4gRmlsZSBmb3JtYXQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gNQotICAgICAgMi4zLiBNZW1iZXIgZm9ybWF0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA1Ci0gICAgICAgICAgMi4zLjEuIE1lbWJlciBoZWFkZXIgYW5kIHRyYWlsZXIgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDYKLSAgICAgICAgICAgICAgMi4zLjEuMS4gRXh0cmEgZmllbGQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gOAotICAgICAgICAgICAgICAyLjMuMS4yLiBDb21wbGlhbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA5Ci0gICAgICAzLiBSZWZlcmVuY2VzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDkKLSAgICAgIDQuIFNlY3VyaXR5IENvbnNpZGVyYXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAxMAotICAgICAgNS4gQWNrbm93bGVkZ2VtZW50cyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDEwCi0gICAgICA2LiBBdXRob3IncyBBZGRyZXNzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMTAKLSAgICAgIDcuIEFwcGVuZGl4OiBKZWFuLUxvdXAgR2FpbGx5J3MgZ3ppcCB1dGlsaXR5IC4uLi4uLi4uLi4uLi4uLi4uLiAxMQotICAgICAgOC4gQXBwZW5kaXg6IFNhbXBsZSBDUkMgQ29kZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDExCi0KLTEuIEludHJvZHVjdGlvbgotCi0gICAxLjEuIFB1cnBvc2UKLQotICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGlzIHRvIGRlZmluZSBhIGxvc3NsZXNzCi0gICAgICBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHRoYXQ6Ci0KLSAgICAgICAgICAqIElzIGluZGVwZW5kZW50IG9mIENQVSB0eXBlLCBvcGVyYXRpbmcgc3lzdGVtLCBmaWxlIHN5c3RlbSwKLSAgICAgICAgICAgIGFuZCBjaGFyYWN0ZXIgc2V0LCBhbmQgaGVuY2UgY2FuIGJlIHVzZWQgZm9yIGludGVyY2hhbmdlOwotICAgICAgICAgICogQ2FuIGNvbXByZXNzIG9yIGRlY29tcHJlc3MgYSBkYXRhIHN0cmVhbSAoYXMgb3Bwb3NlZCB0byBhCi0gICAgICAgICAgICByYW5kb21seSBhY2Nlc3NpYmxlIGZpbGUpIHRvIHByb2R1Y2UgYW5vdGhlciBkYXRhIHN0cmVhbSwKLSAgICAgICAgICAgIHVzaW5nIG9ubHkgYW4gYSBwcmlvcmkgYm91bmRlZCBhbW91bnQgb2YgaW50ZXJtZWRpYXRlCi0gICAgICAgICAgICBzdG9yYWdlLCBhbmQgaGVuY2UgY2FuIGJlIHVzZWQgaW4gZGF0YSBjb21tdW5pY2F0aW9ucyBvcgotICAgICAgICAgICAgc2ltaWxhciBzdHJ1Y3R1cmVzIHN1Y2ggYXMgVW5peCBmaWx0ZXJzOwotICAgICAgICAgICogQ29tcHJlc3NlcyBkYXRhIHdpdGggZWZmaWNpZW5jeSBjb21wYXJhYmxlIHRvIHRoZSBiZXN0Ci0gICAgICAgICAgICBjdXJyZW50bHkgYXZhaWxhYmxlIGdlbmVyYWwtcHVycG9zZSBjb21wcmVzc2lvbiBtZXRob2RzLAotICAgICAgICAgICAgYW5kIGluIHBhcnRpY3VsYXIgY29uc2lkZXJhYmx5IGJldHRlciB0aGFuIHRoZSAiY29tcHJlc3MiCi0gICAgICAgICAgICBwcm9ncmFtOwotICAgICAgICAgICogQ2FuIGJlIGltcGxlbWVudGVkIHJlYWRpbHkgaW4gYSBtYW5uZXIgbm90IGNvdmVyZWQgYnkKLSAgICAgICAgICAgIHBhdGVudHMsIGFuZCBoZW5jZSBjYW4gYmUgcHJhY3RpY2VkIGZyZWVseTsKLSAgICAgICAgICAqIElzIGNvbXBhdGlibGUgd2l0aCB0aGUgZmlsZSBmb3JtYXQgcHJvZHVjZWQgYnkgdGhlIGN1cnJlbnQKLSAgICAgICAgICAgIHdpZGVseSB1c2VkIGd6aXAgdXRpbGl0eSwgaW4gdGhhdCBjb25mb3JtaW5nIGRlY29tcHJlc3NvcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWJsZSB0byByZWFkIGRhdGEgcHJvZHVjZWQgYnkgdGhlIGV4aXN0aW5nIGd6aXAKLSAgICAgICAgICAgIGNvbXByZXNzb3IuCi0KLQotCi0KLURldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSAyXQotDAotUkZDIDE5NTIgICAgICAgICAgICAgR1pJUCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICAgICAgIE1heSAxOTk2Ci0KLQotICAgICAgVGhlIGRhdGEgZm9ybWF0IGRlZmluZWQgYnkgdGhpcyBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGF0dGVtcHQgdG86Ci0KLSAgICAgICAgICAqIFByb3ZpZGUgcmFuZG9tIGFjY2VzcyB0byBjb21wcmVzc2VkIGRhdGE7Ci0gICAgICAgICAgKiBDb21wcmVzcyBzcGVjaWFsaXplZCBkYXRhIChlLmcuLCByYXN0ZXIgZ3JhcGhpY3MpIGFzIHdlbGwgYXMKLSAgICAgICAgICAgIHRoZSBiZXN0IGN1cnJlbnRseSBhdmFpbGFibGUgc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcy4KLQotICAgMS4yLiBJbnRlbmRlZCBhdWRpZW5jZQotCi0gICAgICBUaGlzIHNwZWNpZmljYXRpb24gaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBpbXBsZW1lbnRvcnMgb2Ygc29mdHdhcmUKLSAgICAgIHRvIGNvbXByZXNzIGRhdGEgaW50byBnemlwIGZvcm1hdCBhbmQvb3IgZGVjb21wcmVzcyBkYXRhIGZyb20gZ3ppcAotICAgICAgZm9ybWF0LgotCi0gICAgICBUaGUgdGV4dCBvZiB0aGUgc3BlY2lmaWNhdGlvbiBhc3N1bWVzIGEgYmFzaWMgYmFja2dyb3VuZCBpbgotICAgICAgcHJvZ3JhbW1pbmcgYXQgdGhlIGxldmVsIG9mIGJpdHMgYW5kIG90aGVyIHByaW1pdGl2ZSBkYXRhCi0gICAgICByZXByZXNlbnRhdGlvbnMuCi0KLSAgIDEuMy4gU2NvcGUKLQotICAgICAgVGhlIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgY29tcHJlc3Npb24gbWV0aG9kIGFuZCBhIGZpbGUgZm9ybWF0Ci0gICAgICAodGhlIGxhdHRlciBhc3N1bWluZyBvbmx5IHRoYXQgYSBmaWxlIGNhbiBzdG9yZSBhIHNlcXVlbmNlIG9mCi0gICAgICBhcmJpdHJhcnkgYnl0ZXMpLiAgSXQgZG9lcyBub3Qgc3BlY2lmeSBhbnkgcGFydGljdWxhciBpbnRlcmZhY2UgdG8KLSAgICAgIGEgZmlsZSBzeXN0ZW0gb3IgYW55dGhpbmcgYWJvdXQgY2hhcmFjdGVyIHNldHMgb3IgZW5jb2RpbmdzCi0gICAgICAoZXhjZXB0IGZvciBmaWxlIG5hbWVzIGFuZCBjb21tZW50cywgd2hpY2ggYXJlIG9wdGlvbmFsKS4KLQotICAgMS40LiBDb21wbGlhbmNlCi0KLSAgICAgIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCBhIGNvbXBsaWFudCBkZWNvbXByZXNzb3IgbXVzdCBiZQotICAgICAgYWJsZSB0byBhY2NlcHQgYW5kIGRlY29tcHJlc3MgYW55IGZpbGUgdGhhdCBjb25mb3JtcyB0byBhbGwgdGhlCi0gICAgICBzcGVjaWZpY2F0aW9ucyBwcmVzZW50ZWQgaGVyZTsgYSBjb21wbGlhbnQgY29tcHJlc3NvciBtdXN0IHByb2R1Y2UKLSAgICAgIGZpbGVzIHRoYXQgY29uZm9ybSB0byBhbGwgdGhlIHNwZWNpZmljYXRpb25zIHByZXNlbnRlZCBoZXJlLiAgVGhlCi0gICAgICBtYXRlcmlhbCBpbiB0aGUgYXBwZW5kaWNlcyBpcyBub3QgcGFydCBvZiB0aGUgc3BlY2lmaWNhdGlvbiBwZXIgc2UKLSAgICAgIGFuZCBpcyBub3QgcmVsZXZhbnQgdG8gY29tcGxpYW5jZS4KLQotICAgMS41LiBEZWZpbml0aW9ucyBvZiB0ZXJtcyBhbmQgY29udmVudGlvbnMgdXNlZAotCi0gICAgICBieXRlOiA4IGJpdHMgc3RvcmVkIG9yIHRyYW5zbWl0dGVkIGFzIGEgdW5pdCAoc2FtZSBhcyBhbiBvY3RldCkuCi0gICAgICAoRm9yIHRoaXMgc3BlY2lmaWNhdGlvbiwgYSBieXRlIGlzIGV4YWN0bHkgOCBiaXRzLCBldmVuIG9uCi0gICAgICBtYWNoaW5lcyB3aGljaCBzdG9yZSBhIGNoYXJhY3RlciBvbiBhIG51bWJlciBvZiBiaXRzIGRpZmZlcmVudAotICAgICAgZnJvbSA4LikgIFNlZSBiZWxvdyBmb3IgdGhlIG51bWJlcmluZyBvZiBiaXRzIHdpdGhpbiBhIGJ5dGUuCi0KLSAgIDEuNi4gQ2hhbmdlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zCi0KLSAgICAgIFRoZXJlIGhhdmUgYmVlbiBubyB0ZWNobmljYWwgY2hhbmdlcyB0byB0aGUgZ3ppcCBmb3JtYXQgc2luY2UKLSAgICAgIHZlcnNpb24gNC4xIG9mIHRoaXMgc3BlY2lmaWNhdGlvbi4gIEluIHZlcnNpb24gNC4yLCBzb21lCi0gICAgICB0ZXJtaW5vbG9neSB3YXMgY2hhbmdlZCwgYW5kIHRoZSBzYW1wbGUgQ1JDIGNvZGUgd2FzIHJld3JpdHRlbiBmb3IKLSAgICAgIGNsYXJpdHkgYW5kIHRvIGVsaW1pbmF0ZSB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoZSBjYWxsZXIgdG8gZG8gcHJlLQotICAgICAgYW5kIHBvc3QtY29uZGl0aW9uaW5nLiAgVmVyc2lvbiA0LjMgaXMgYSBjb252ZXJzaW9uIG9mIHRoZQotICAgICAgc3BlY2lmaWNhdGlvbiB0byBSRkMgc3R5bGUuCi0KLQotCi1EZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgM10KLQwKLVJGQyAxOTUyICAgICAgICAgICAgIEdaSVAgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgICAgICBNYXkgMTk5NgotCi0KLTIuIERldGFpbGVkIHNwZWNpZmljYXRpb24KLQotICAgMi4xLiBPdmVyYWxsIGNvbnZlbnRpb25zCi0KLSAgICAgIEluIHRoZSBkaWFncmFtcyBiZWxvdywgYSBib3ggbGlrZSB0aGlzOgotCi0gICAgICAgICArLS0tKwotICAgICAgICAgfCAgIHwgPC0tIHRoZSB2ZXJ0aWNhbCBiYXJzIG1pZ2h0IGJlIG1pc3NpbmcKLSAgICAgICAgICstLS0rCi0KLSAgICAgIHJlcHJlc2VudHMgb25lIGJ5dGU7IGEgYm94IGxpa2UgdGhpczoKLQotICAgICAgICAgKz09PT09PT09PT09PT09KwotICAgICAgICAgfCAgICAgICAgICAgICAgfAotICAgICAgICAgKz09PT09PT09PT09PT09KwotCi0gICAgICByZXByZXNlbnRzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGJ5dGVzLgotCi0gICAgICBCeXRlcyBzdG9yZWQgd2l0aGluIGEgY29tcHV0ZXIgZG8gbm90IGhhdmUgYSAiYml0IG9yZGVyIiwgc2luY2UKLSAgICAgIHRoZXkgYXJlIGFsd2F5cyB0cmVhdGVkIGFzIGEgdW5pdC4gIEhvd2V2ZXIsIGEgYnl0ZSBjb25zaWRlcmVkIGFzCi0gICAgICBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1IGRvZXMgaGF2ZSBhIG1vc3QtIGFuZCBsZWFzdC0KLSAgICAgIHNpZ25pZmljYW50IGJpdCwgYW5kIHNpbmNlIHdlIHdyaXRlIG51bWJlcnMgd2l0aCB0aGUgbW9zdC0KLSAgICAgIHNpZ25pZmljYW50IGRpZ2l0IG9uIHRoZSBsZWZ0LCB3ZSBhbHNvIHdyaXRlIGJ5dGVzIHdpdGggdGhlIG1vc3QtCi0gICAgICBzaWduaWZpY2FudCBiaXQgb24gdGhlIGxlZnQuICBJbiB0aGUgZGlhZ3JhbXMgYmVsb3csIHdlIG51bWJlciB0aGUKLSAgICAgIGJpdHMgb2YgYSBieXRlIHNvIHRoYXQgYml0IDAgaXMgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCwgaS5lLiwKLSAgICAgIHRoZSBiaXRzIGFyZSBudW1iZXJlZDoKLQotICAgICAgICAgKy0tLS0tLS0tKwotICAgICAgICAgfDc2NTQzMjEwfAotICAgICAgICAgKy0tLS0tLS0tKwotCi0gICAgICBUaGlzIGRvY3VtZW50IGRvZXMgbm90IGFkZHJlc3MgdGhlIGlzc3VlIG9mIHRoZSBvcmRlciBpbiB3aGljaAotICAgICAgYml0cyBvZiBhIGJ5dGUgYXJlIHRyYW5zbWl0dGVkIG9uIGEgYml0LXNlcXVlbnRpYWwgbWVkaXVtLCBzaW5jZQotICAgICAgdGhlIGRhdGEgZm9ybWF0IGRlc2NyaWJlZCBoZXJlIGlzIGJ5dGUtIHJhdGhlciB0aGFuIGJpdC1vcmllbnRlZC4KLQotICAgICAgV2l0aGluIGEgY29tcHV0ZXIsIGEgbnVtYmVyIG1heSBvY2N1cHkgbXVsdGlwbGUgYnl0ZXMuICBBbGwKLSAgICAgIG11bHRpLWJ5dGUgbnVtYmVycyBpbiB0aGUgZm9ybWF0IGRlc2NyaWJlZCBoZXJlIGFyZSBzdG9yZWQgd2l0aAotICAgICAgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKGF0IHRoZSBsb3dlciBtZW1vcnkgYWRkcmVzcykuCi0gICAgICBGb3IgZXhhbXBsZSwgdGhlIGRlY2ltYWwgbnVtYmVyIDUyMCBpcyBzdG9yZWQgYXM6Ci0KLSAgICAgICAgICAgICAwICAgICAgICAxCi0gICAgICAgICArLS0tLS0tLS0rLS0tLS0tLS0rCi0gICAgICAgICB8MDAwMDEwMDB8MDAwMDAwMTB8Ci0gICAgICAgICArLS0tLS0tLS0rLS0tLS0tLS0rCi0gICAgICAgICAgXiAgICAgICAgXgotICAgICAgICAgIHwgICAgICAgIHwKLSAgICAgICAgICB8ICAgICAgICArIG1vcmUgc2lnbmlmaWNhbnQgYnl0ZSA9IDIgeCAyNTYKLSAgICAgICAgICArIGxlc3Mgc2lnbmlmaWNhbnQgYnl0ZSA9IDgKLQotCi0KLURldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA0XQotDAotUkZDIDE5NTIgICAgICAgICAgICAgR1pJUCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICAgICAgIE1heSAxOTk2Ci0KLQotICAgMi4yLiBGaWxlIGZvcm1hdAotCi0gICAgICBBIGd6aXAgZmlsZSBjb25zaXN0cyBvZiBhIHNlcmllcyBvZiAibWVtYmVycyIgKGNvbXByZXNzZWQgZGF0YQotICAgICAgc2V0cykuICBUaGUgZm9ybWF0IG9mIGVhY2ggbWVtYmVyIGlzIHNwZWNpZmllZCBpbiB0aGUgZm9sbG93aW5nCi0gICAgICBzZWN0aW9uLiAgVGhlIG1lbWJlcnMgc2ltcGx5IGFwcGVhciBvbmUgYWZ0ZXIgYW5vdGhlciBpbiB0aGUgZmlsZSwKLSAgICAgIHdpdGggbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBiZWZvcmUsIGJldHdlZW4sIG9yIGFmdGVyIHRoZW0uCi0KLSAgIDIuMy4gTWVtYmVyIGZvcm1hdAotCi0gICAgICBFYWNoIG1lbWJlciBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6Ci0KLSAgICAgICAgICstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCi0gICAgICAgICB8SUQxfElEMnxDTSB8RkxHfCAgICAgTVRJTUUgICAgIHxYRkx8T1MgfCAobW9yZS0tPikKLSAgICAgICAgICstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCi0KLSAgICAgIChpZiBGTEcuRkVYVFJBIHNldCkKLQotICAgICAgICAgKy0tLSstLS0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KwotICAgICAgICAgfCBYTEVOICB8Li4uWExFTiBieXRlcyBvZiAiZXh0cmEgZmllbGQiLi4ufCAobW9yZS0tPikKLSAgICAgICAgICstLS0rLS0tKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKLQotICAgICAgKGlmIEZMRy5GTkFNRSBzZXQpCi0KLSAgICAgICAgICs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKLSAgICAgICAgIHwuLi5vcmlnaW5hbCBmaWxlIG5hbWUsIHplcm8tdGVybWluYXRlZC4uLnwgKG1vcmUtLT4pCi0gICAgICAgICArPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCi0KLSAgICAgIChpZiBGTEcuRkNPTU1FTlQgc2V0KQotCi0gICAgICAgICArPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCi0gICAgICAgICB8Li4uZmlsZSBjb21tZW50LCB6ZXJvLXRlcm1pbmF0ZWQuLi58IChtb3JlLS0+KQotICAgICAgICAgKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KwotCi0gICAgICAoaWYgRkxHLkZIQ1JDIHNldCkKLQotICAgICAgICAgKy0tLSstLS0rCi0gICAgICAgICB8IENSQzE2IHwKLSAgICAgICAgICstLS0rLS0tKwotCi0gICAgICAgICArPT09PT09PT09PT09PT09PT09PT09PT0rCi0gICAgICAgICB8Li4uY29tcHJlc3NlZCBibG9ja3MuLi58IChtb3JlLS0+KQotICAgICAgICAgKz09PT09PT09PT09PT09PT09PT09PT09KwotCi0gICAgICAgICAgIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3Ci0gICAgICAgICArLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKLSAgICAgICAgIHwgICAgIENSQzMyICAgICB8ICAgICBJU0laRSAgICAgfAotICAgICAgICAgKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCi0KLQotCi0KLURldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA1XQotDAotUkZDIDE5NTIgICAgICAgICAgICAgR1pJUCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICAgICAgIE1heSAxOTk2Ci0KLQotICAgICAgMi4zLjEuIE1lbWJlciBoZWFkZXIgYW5kIHRyYWlsZXIKLQotICAgICAgICAgSUQxIChJRGVudGlmaWNhdGlvbiAxKQotICAgICAgICAgSUQyIChJRGVudGlmaWNhdGlvbiAyKQotICAgICAgICAgICAgVGhlc2UgaGF2ZSB0aGUgZml4ZWQgdmFsdWVzIElEMSA9IDMxICgweDFmLCBcMDM3KSwgSUQyID0gMTM5Ci0gICAgICAgICAgICAoMHg4YiwgXDIxMyksIHRvIGlkZW50aWZ5IHRoZSBmaWxlIGFzIGJlaW5nIGluIGd6aXAgZm9ybWF0LgotCi0gICAgICAgICBDTSAoQ29tcHJlc3Npb24gTWV0aG9kKQotICAgICAgICAgICAgVGhpcyBpZGVudGlmaWVzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgdXNlZCBpbiB0aGUgZmlsZS4gIENNCi0gICAgICAgICAgICA9IDAtNyBhcmUgcmVzZXJ2ZWQuICBDTSA9IDggZGVub3RlcyB0aGUgImRlZmxhdGUiCi0gICAgICAgICAgICBjb21wcmVzc2lvbiBtZXRob2QsIHdoaWNoIGlzIHRoZSBvbmUgY3VzdG9tYXJpbHkgdXNlZCBieQotICAgICAgICAgICAgZ3ppcCBhbmQgd2hpY2ggaXMgZG9jdW1lbnRlZCBlbHNld2hlcmUuCi0KLSAgICAgICAgIEZMRyAoRkxhR3MpCi0gICAgICAgICAgICBUaGlzIGZsYWcgYnl0ZSBpcyBkaXZpZGVkIGludG8gaW5kaXZpZHVhbCBiaXRzIGFzIGZvbGxvd3M6Ci0KLSAgICAgICAgICAgICAgIGJpdCAwICAgRlRFWFQKLSAgICAgICAgICAgICAgIGJpdCAxICAgRkhDUkMKLSAgICAgICAgICAgICAgIGJpdCAyICAgRkVYVFJBCi0gICAgICAgICAgICAgICBiaXQgMyAgIEZOQU1FCi0gICAgICAgICAgICAgICBiaXQgNCAgIEZDT01NRU5UCi0gICAgICAgICAgICAgICBiaXQgNSAgIHJlc2VydmVkCi0gICAgICAgICAgICAgICBiaXQgNiAgIHJlc2VydmVkCi0gICAgICAgICAgICAgICBiaXQgNyAgIHJlc2VydmVkCi0KLSAgICAgICAgICAgIElmIEZURVhUIGlzIHNldCwgdGhlIGZpbGUgaXMgcHJvYmFibHkgQVNDSUkgdGV4dC4gIFRoaXMgaXMKLSAgICAgICAgICAgIGFuIG9wdGlvbmFsIGluZGljYXRpb24sIHdoaWNoIHRoZSBjb21wcmVzc29yIG1heSBzZXQgYnkKLSAgICAgICAgICAgIGNoZWNraW5nIGEgc21hbGwgYW1vdW50IG9mIHRoZSBpbnB1dCBkYXRhIHRvIHNlZSB3aGV0aGVyIGFueQotICAgICAgICAgICAgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgYXJlIHByZXNlbnQuICBJbiBjYXNlIG9mIGRvdWJ0LCBGVEVYVAotICAgICAgICAgICAgaXMgY2xlYXJlZCwgaW5kaWNhdGluZyBiaW5hcnkgZGF0YS4gRm9yIHN5c3RlbXMgd2hpY2ggaGF2ZQotICAgICAgICAgICAgZGlmZmVyZW50IGZpbGUgZm9ybWF0cyBmb3IgYXNjaWkgdGV4dCBhbmQgYmluYXJ5IGRhdGEsIHRoZQotICAgICAgICAgICAgZGVjb21wcmVzc29yIGNhbiB1c2UgRlRFWFQgdG8gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQuCi0gICAgICAgICAgICBXZSBkZWxpYmVyYXRlbHkgZG8gbm90IHNwZWNpZnkgdGhlIGFsZ29yaXRobSB1c2VkIHRvIHNldAotICAgICAgICAgICAgdGhpcyBiaXQsIHNpbmNlIGEgY29tcHJlc3NvciBhbHdheXMgaGFzIHRoZSBvcHRpb24gb2YKLSAgICAgICAgICAgIGxlYXZpbmcgaXQgY2xlYXJlZCBhbmQgYSBkZWNvbXByZXNzb3IgYWx3YXlzIGhhcyB0aGUgb3B0aW9uCi0gICAgICAgICAgICBvZiBpZ25vcmluZyBpdCBhbmQgbGV0dGluZyBzb21lIG90aGVyIHByb2dyYW0gaGFuZGxlIGlzc3VlcwotICAgICAgICAgICAgb2YgZGF0YSBjb252ZXJzaW9uLgotCi0gICAgICAgICAgICBJZiBGSENSQyBpcyBzZXQsIGEgQ1JDMTYgZm9yIHRoZSBnemlwIGhlYWRlciBpcyBwcmVzZW50LAotICAgICAgICAgICAgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjb21wcmVzc2VkIGRhdGEuIFRoZSBDUkMxNiBjb25zaXN0cwotICAgICAgICAgICAgb2YgdGhlIHR3byBsZWFzdCBzaWduaWZpY2FudCBieXRlcyBvZiB0aGUgQ1JDMzIgZm9yIGFsbAotICAgICAgICAgICAgYnl0ZXMgb2YgdGhlIGd6aXAgaGVhZGVyIHVwIHRvIGFuZCBub3QgaW5jbHVkaW5nIHRoZSBDUkMxNi4KLSAgICAgICAgICAgIFtUaGUgRkhDUkMgYml0IHdhcyBuZXZlciBzZXQgYnkgdmVyc2lvbnMgb2YgZ3ppcCB1cCB0bwotICAgICAgICAgICAgMS4yLjQsIGV2ZW4gdGhvdWdoIGl0IHdhcyBkb2N1bWVudGVkIHdpdGggYSBkaWZmZXJlbnQKLSAgICAgICAgICAgIG1lYW5pbmcgaW4gZ3ppcCAxLjIuNC5dCi0KLSAgICAgICAgICAgIElmIEZFWFRSQSBpcyBzZXQsIG9wdGlvbmFsIGV4dHJhIGZpZWxkcyBhcmUgcHJlc2VudCwgYXMKLSAgICAgICAgICAgIGRlc2NyaWJlZCBpbiBhIGZvbGxvd2luZyBzZWN0aW9uLgotCi0KLQotRGV1dHNjaCAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDZdCi0MCi1SRkMgMTk1MiAgICAgICAgICAgICBHWklQIEZpbGUgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICAgICAgICAgTWF5IDE5OTYKLQotCi0gICAgICAgICAgICBJZiBGTkFNRSBpcyBzZXQsIGFuIG9yaWdpbmFsIGZpbGUgbmFtZSBpcyBwcmVzZW50LAotICAgICAgICAgICAgdGVybWluYXRlZCBieSBhIHplcm8gYnl0ZS4gIFRoZSBuYW1lIG11c3QgY29uc2lzdCBvZiBJU08KLSAgICAgICAgICAgIDg4NTktMSAoTEFUSU4tMSkgY2hhcmFjdGVyczsgb24gb3BlcmF0aW5nIHN5c3RlbXMgdXNpbmcKLSAgICAgICAgICAgIEVCQ0RJQyBvciBhbnkgb3RoZXIgY2hhcmFjdGVyIHNldCBmb3IgZmlsZSBuYW1lcywgdGhlIG5hbWUKLSAgICAgICAgICAgIG11c3QgYmUgdHJhbnNsYXRlZCB0byB0aGUgSVNPIExBVElOLTEgY2hhcmFjdGVyIHNldC4gIFRoaXMKLSAgICAgICAgICAgIGlzIHRoZSBvcmlnaW5hbCBuYW1lIG9mIHRoZSBmaWxlIGJlaW5nIGNvbXByZXNzZWQsIHdpdGggYW55Ci0gICAgICAgICAgICBkaXJlY3RvcnkgY29tcG9uZW50cyByZW1vdmVkLCBhbmQsIGlmIHRoZSBmaWxlIGJlaW5nCi0gICAgICAgICAgICBjb21wcmVzc2VkIGlzIG9uIGEgZmlsZSBzeXN0ZW0gd2l0aCBjYXNlIGluc2Vuc2l0aXZlIG5hbWVzLAotICAgICAgICAgICAgZm9yY2VkIHRvIGxvd2VyIGNhc2UuIFRoZXJlIGlzIG5vIG9yaWdpbmFsIGZpbGUgbmFtZSBpZiB0aGUKLSAgICAgICAgICAgIGRhdGEgd2FzIGNvbXByZXNzZWQgZnJvbSBhIHNvdXJjZSBvdGhlciB0aGFuIGEgbmFtZWQgZmlsZTsKLSAgICAgICAgICAgIGZvciBleGFtcGxlLCBpZiB0aGUgc291cmNlIHdhcyBzdGRpbiBvbiBhIFVuaXggc3lzdGVtLCB0aGVyZQotICAgICAgICAgICAgaXMgbm8gZmlsZSBuYW1lLgotCi0gICAgICAgICAgICBJZiBGQ09NTUVOVCBpcyBzZXQsIGEgemVyby10ZXJtaW5hdGVkIGZpbGUgY29tbWVudCBpcwotICAgICAgICAgICAgcHJlc2VudC4gIFRoaXMgY29tbWVudCBpcyBub3QgaW50ZXJwcmV0ZWQ7IGl0IGlzIG9ubHkKLSAgICAgICAgICAgIGludGVuZGVkIGZvciBodW1hbiBjb25zdW1wdGlvbi4gIFRoZSBjb21tZW50IG11c3QgY29uc2lzdCBvZgotICAgICAgICAgICAgSVNPIDg4NTktMSAoTEFUSU4tMSkgY2hhcmFjdGVycy4gIExpbmUgYnJlYWtzIHNob3VsZCBiZQotICAgICAgICAgICAgZGVub3RlZCBieSBhIHNpbmdsZSBsaW5lIGZlZWQgY2hhcmFjdGVyICgxMCBkZWNpbWFsKS4KLQotICAgICAgICAgICAgUmVzZXJ2ZWQgRkxHIGJpdHMgbXVzdCBiZSB6ZXJvLgotCi0gICAgICAgICBNVElNRSAoTW9kaWZpY2F0aW9uIFRJTUUpCi0gICAgICAgICAgICBUaGlzIGdpdmVzIHRoZSBtb3N0IHJlY2VudCBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgIGZpbGUgYmVpbmcgY29tcHJlc3NlZC4gIFRoZSB0aW1lIGlzIGluIFVuaXggZm9ybWF0LCBpLmUuLAotICAgICAgICAgICAgc2Vjb25kcyBzaW5jZSAwMDowMDowMCBHTVQsIEphbi4gIDEsIDE5NzAuICAoTm90ZSB0aGF0IHRoaXMKLSAgICAgICAgICAgIG1heSBjYXVzZSBwcm9ibGVtcyBmb3IgTVMtRE9TIGFuZCBvdGhlciBzeXN0ZW1zIHRoYXQgdXNlCi0gICAgICAgICAgICBsb2NhbCByYXRoZXIgdGhhbiBVbml2ZXJzYWwgdGltZS4pICBJZiB0aGUgY29tcHJlc3NlZCBkYXRhCi0gICAgICAgICAgICBkaWQgbm90IGNvbWUgZnJvbSBhIGZpbGUsIE1USU1FIGlzIHNldCB0byB0aGUgdGltZSBhdCB3aGljaAotICAgICAgICAgICAgY29tcHJlc3Npb24gc3RhcnRlZC4gIE1USU1FID0gMCBtZWFucyBubyB0aW1lIHN0YW1wIGlzCi0gICAgICAgICAgICBhdmFpbGFibGUuCi0KLSAgICAgICAgIFhGTCAoZVh0cmEgRkxhZ3MpCi0gICAgICAgICAgICBUaGVzZSBmbGFncyBhcmUgYXZhaWxhYmxlIGZvciB1c2UgYnkgc3BlY2lmaWMgY29tcHJlc3Npb24KLSAgICAgICAgICAgIG1ldGhvZHMuICBUaGUgImRlZmxhdGUiIG1ldGhvZCAoQ00gPSA4KSBzZXRzIHRoZXNlIGZsYWdzIGFzCi0gICAgICAgICAgICBmb2xsb3dzOgotCi0gICAgICAgICAgICAgICBYRkwgPSAyIC0gY29tcHJlc3NvciB1c2VkIG1heGltdW0gY29tcHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2xvd2VzdCBhbGdvcml0aG0KLSAgICAgICAgICAgICAgIFhGTCA9IDQgLSBjb21wcmVzc29yIHVzZWQgZmFzdGVzdCBhbGdvcml0aG0KLQotICAgICAgICAgT1MgKE9wZXJhdGluZyBTeXN0ZW0pCi0gICAgICAgICAgICBUaGlzIGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgZmlsZSBzeXN0ZW0gb24gd2hpY2ggY29tcHJlc3Npb24KLSAgICAgICAgICAgIHRvb2sgcGxhY2UuICBUaGlzIG1heSBiZSB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgZW5kLW9mLWxpbmUKLSAgICAgICAgICAgIGNvbnZlbnRpb24gZm9yIHRleHQgZmlsZXMuICBUaGUgY3VycmVudGx5IGRlZmluZWQgdmFsdWVzIGFyZQotICAgICAgICAgICAgYXMgZm9sbG93czoKLQotCi0KLQotCi0KLURldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA3XQotDAotUkZDIDE5NTIgICAgICAgICAgICAgR1pJUCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICAgICAgIE1heSAxOTk2Ci0KLQotICAgICAgICAgICAgICAgICAwIC0gRkFUIGZpbGVzeXN0ZW0gKE1TLURPUywgT1MvMiwgTlQvV2luMzIpCi0gICAgICAgICAgICAgICAgIDEgLSBBbWlnYQotICAgICAgICAgICAgICAgICAyIC0gVk1TIChvciBPcGVuVk1TKQotICAgICAgICAgICAgICAgICAzIC0gVW5peAotICAgICAgICAgICAgICAgICA0IC0gVk0vQ01TCi0gICAgICAgICAgICAgICAgIDUgLSBBdGFyaSBUT1MKLSAgICAgICAgICAgICAgICAgNiAtIEhQRlMgZmlsZXN5c3RlbSAoT1MvMiwgTlQpCi0gICAgICAgICAgICAgICAgIDcgLSBNYWNpbnRvc2gKLSAgICAgICAgICAgICAgICAgOCAtIFotU3lzdGVtCi0gICAgICAgICAgICAgICAgIDkgLSBDUC9NCi0gICAgICAgICAgICAgICAgMTAgLSBUT1BTLTIwCi0gICAgICAgICAgICAgICAgMTEgLSBOVEZTIGZpbGVzeXN0ZW0gKE5UKQotICAgICAgICAgICAgICAgIDEyIC0gUURPUwotICAgICAgICAgICAgICAgIDEzIC0gQWNvcm4gUklTQ09TCi0gICAgICAgICAgICAgICAyNTUgLSB1bmtub3duCi0KLSAgICAgICAgIFhMRU4gKGVYdHJhIExFTmd0aCkKLSAgICAgICAgICAgIElmIEZMRy5GRVhUUkEgaXMgc2V0LCB0aGlzIGdpdmVzIHRoZSBsZW5ndGggb2YgdGhlIG9wdGlvbmFsCi0gICAgICAgICAgICBleHRyYSBmaWVsZC4gIFNlZSBiZWxvdyBmb3IgZGV0YWlscy4KLQotICAgICAgICAgQ1JDMzIgKENSQy0zMikKLSAgICAgICAgICAgIFRoaXMgY29udGFpbnMgYSBDeWNsaWMgUmVkdW5kYW5jeSBDaGVjayB2YWx1ZSBvZiB0aGUKLSAgICAgICAgICAgIHVuY29tcHJlc3NlZCBkYXRhIGNvbXB1dGVkIGFjY29yZGluZyB0byBDUkMtMzIgYWxnb3JpdGhtCi0gICAgICAgICAgICB1c2VkIGluIHRoZSBJU08gMzMwOSBzdGFuZGFyZCBhbmQgaW4gc2VjdGlvbiA4LjEuMS42LjIgb2YKLSAgICAgICAgICAgIElUVS1UIHJlY29tbWVuZGF0aW9uIFYuNDIuICAoU2VlIGh0dHA6Ly93d3cuaXNvLmNoIGZvcgotICAgICAgICAgICAgb3JkZXJpbmcgSVNPIGRvY3VtZW50cy4gU2VlIGdvcGhlcjovL2luZm8uaXR1LmNoIGZvciBhbgotICAgICAgICAgICAgb25saW5lIHZlcnNpb24gb2YgSVRVLVQgVi40Mi4pCi0KLSAgICAgICAgIElTSVpFIChJbnB1dCBTSVpFKQotICAgICAgICAgICAgVGhpcyBjb250YWlucyB0aGUgc2l6ZSBvZiB0aGUgb3JpZ2luYWwgKHVuY29tcHJlc3NlZCkgaW5wdXQKLSAgICAgICAgICAgIGRhdGEgbW9kdWxvIDJeMzIuCi0KLSAgICAgIDIuMy4xLjEuIEV4dHJhIGZpZWxkCi0KLSAgICAgICAgIElmIHRoZSBGTEcuRkVYVFJBIGJpdCBpcyBzZXQsIGFuICJleHRyYSBmaWVsZCIgaXMgcHJlc2VudCBpbgotICAgICAgICAgdGhlIGhlYWRlciwgd2l0aCB0b3RhbCBsZW5ndGggWExFTiBieXRlcy4gIEl0IGNvbnNpc3RzIG9mIGEKLSAgICAgICAgIHNlcmllcyBvZiBzdWJmaWVsZHMsIGVhY2ggb2YgdGhlIGZvcm06Ci0KLSAgICAgICAgICAgICstLS0rLS0tKy0tLSstLS0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKLSAgICAgICAgICAgIHxTSTF8U0kyfCAgTEVOICB8Li4uIExFTiBieXRlcyBvZiBzdWJmaWVsZCBkYXRhIC4uLnwKLSAgICAgICAgICAgICstLS0rLS0tKy0tLSstLS0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKLQotICAgICAgICAgU0kxIGFuZCBTSTIgcHJvdmlkZSBhIHN1YmZpZWxkIElELCB0eXBpY2FsbHkgdHdvIEFTQ0lJIGxldHRlcnMKLSAgICAgICAgIHdpdGggc29tZSBtbmVtb25pYyB2YWx1ZS4gIEplYW4tTG91cCBHYWlsbHkKLSAgICAgICAgIDxnemlwQHByZXAuYWkubWl0LmVkdT4gaXMgbWFpbnRhaW5pbmcgYSByZWdpc3RyeSBvZiBzdWJmaWVsZAotICAgICAgICAgSURzOyBwbGVhc2Ugc2VuZCBoaW0gYW55IHN1YmZpZWxkIElEIHlvdSB3aXNoIHRvIHVzZS4gIFN1YmZpZWxkCi0gICAgICAgICBJRHMgd2l0aCBTSTIgPSAwIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gIFRoZSBmb2xsb3dpbmcKLSAgICAgICAgIElEcyBhcmUgY3VycmVudGx5IGRlZmluZWQ6Ci0KLQotCi1EZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgOF0KLQwKLVJGQyAxOTUyICAgICAgICAgICAgIEdaSVAgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgICAgICBNYXkgMTk5NgotCi0KLSAgICAgICAgICAgIFNJMSAgICAgICAgIFNJMiAgICAgICAgIERhdGEKLSAgICAgICAgICAgIC0tLS0tLS0tLS0gIC0tLS0tLS0tLS0gIC0tLS0KLSAgICAgICAgICAgIDB4NDEgKCdBJykgIDB4NzAgKCdQJykgIEFwb2xsbyBmaWxlIHR5cGUgaW5mb3JtYXRpb24KLQotICAgICAgICAgTEVOIGdpdmVzIHRoZSBsZW5ndGggb2YgdGhlIHN1YmZpZWxkIGRhdGEsIGV4Y2x1ZGluZyB0aGUgNAotICAgICAgICAgaW5pdGlhbCBieXRlcy4KLQotICAgICAgMi4zLjEuMi4gQ29tcGxpYW5jZQotCi0gICAgICAgICBBIGNvbXBsaWFudCBjb21wcmVzc29yIG11c3QgcHJvZHVjZSBmaWxlcyB3aXRoIGNvcnJlY3QgSUQxLAotICAgICAgICAgSUQyLCBDTSwgQ1JDMzIsIGFuZCBJU0laRSwgYnV0IG1heSBzZXQgYWxsIHRoZSBvdGhlciBmaWVsZHMgaW4KLSAgICAgICAgIHRoZSBmaXhlZC1sZW5ndGggcGFydCBvZiB0aGUgaGVhZGVyIHRvIGRlZmF1bHQgdmFsdWVzICgyNTUgZm9yCi0gICAgICAgICBPUywgMCBmb3IgYWxsIG90aGVycykuICBUaGUgY29tcHJlc3NvciBtdXN0IHNldCBhbGwgcmVzZXJ2ZWQKLSAgICAgICAgIGJpdHMgdG8gemVyby4KLQotICAgICAgICAgQSBjb21wbGlhbnQgZGVjb21wcmVzc29yIG11c3QgY2hlY2sgSUQxLCBJRDIsIGFuZCBDTSwgYW5kCi0gICAgICAgICBwcm92aWRlIGFuIGVycm9yIGluZGljYXRpb24gaWYgYW55IG9mIHRoZXNlIGhhdmUgaW5jb3JyZWN0Ci0gICAgICAgICB2YWx1ZXMuICBJdCBtdXN0IGV4YW1pbmUgRkVYVFJBL1hMRU4sIEZOQU1FLCBGQ09NTUVOVCBhbmQgRkhDUkMKLSAgICAgICAgIGF0IGxlYXN0IHNvIGl0IGNhbiBza2lwIG92ZXIgdGhlIG9wdGlvbmFsIGZpZWxkcyBpZiB0aGV5IGFyZQotICAgICAgICAgcHJlc2VudC4gIEl0IG5lZWQgbm90IGV4YW1pbmUgYW55IG90aGVyIHBhcnQgb2YgdGhlIGhlYWRlciBvcgotICAgICAgICAgdHJhaWxlcjsgaW4gcGFydGljdWxhciwgYSBkZWNvbXByZXNzb3IgbWF5IGlnbm9yZSBGVEVYVCBhbmQgT1MKLSAgICAgICAgIGFuZCBhbHdheXMgcHJvZHVjZSBiaW5hcnkgb3V0cHV0LCBhbmQgc3RpbGwgYmUgY29tcGxpYW50LiAgQQotICAgICAgICAgY29tcGxpYW50IGRlY29tcHJlc3NvciBtdXN0IGdpdmUgYW4gZXJyb3IgaW5kaWNhdGlvbiBpZiBhbnkKLSAgICAgICAgIHJlc2VydmVkIGJpdCBpcyBub24temVybywgc2luY2Ugc3VjaCBhIGJpdCBjb3VsZCBpbmRpY2F0ZSB0aGUKLSAgICAgICAgIHByZXNlbmNlIG9mIGEgbmV3IGZpZWxkIHRoYXQgd291bGQgY2F1c2Ugc3Vic2VxdWVudCBkYXRhIHRvIGJlCi0gICAgICAgICBpbnRlcnByZXRlZCBpbmNvcnJlY3RseS4KLQotMy4gUmVmZXJlbmNlcwotCi0gICBbMV0gIkluZm9ybWF0aW9uIFByb2Nlc3NpbmcgLSA4LWJpdCBzaW5nbGUtYnl0ZSBjb2RlZCBncmFwaGljCi0gICAgICAgY2hhcmFjdGVyIHNldHMgLSBQYXJ0IDE6IExhdGluIGFscGhhYmV0IE5vLjEiIChJU08gODg1OS0xOjE5ODcpLgotICAgICAgIFRoZSBJU08gODg1OS0xIChMYXRpbi0xKSBjaGFyYWN0ZXIgc2V0IGlzIGEgc3VwZXJzZXQgb2YgNy1iaXQKLSAgICAgICBBU0NJSS4gRmlsZXMgZGVmaW5pbmcgdGhpcyBjaGFyYWN0ZXIgc2V0IGFyZSBhdmFpbGFibGUgYXMKLSAgICAgICBpc29fODg1OS0xLiogaW4gZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzLwotCi0gICBbMl0gSVNPIDMzMDkKLQotICAgWzNdIElUVS1UIHJlY29tbWVuZGF0aW9uIFYuNDIKLQotICAgWzRdIERldXRzY2gsIEwuUC4sIkRFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIiwKLSAgICAgICBhdmFpbGFibGUgaW4gZnRwOi8vZnRwLnV1Lm5ldC9wdWIvYXJjaGl2aW5nL3ppcC9kb2MvCi0KLSAgIFs1XSBHYWlsbHksIEouLUwuLCBHWklQIGRvY3VtZW50YXRpb24sIGF2YWlsYWJsZSBhcyBnemlwLSoudGFyIGluCi0gICAgICAgZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvCi0KLSAgIFs2XSBTYXJ3YXRlLCBELlYuLCAiQ29tcHV0YXRpb24gb2YgQ3ljbGljIFJlZHVuZGFuY3kgQ2hlY2tzIHZpYSBUYWJsZQotICAgICAgIExvb2stVXAiLCBDb21tdW5pY2F0aW9ucyBvZiB0aGUgQUNNLCAzMSg4KSwgcHAuMTAwOC0xMDEzLgotCi0KLQotCi1EZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgOV0KLQwKLVJGQyAxOTUyICAgICAgICAgICAgIEdaSVAgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgICAgICBNYXkgMTk5NgotCi0KLSAgIFs3XSBTY2h3YWRlcmVyLCBXLkQuLCAiQ1JDIENhbGN1bGF0aW9uIiwgQXByaWwgODUgUEMgVGVjaCBKb3VybmFsLAotICAgICAgIHBwLjExOC0xMzMuCi0KLSAgIFs4XSBmdHA6Ly9mdHAuYWRlbGFpZGUuZWR1LmF1L3B1Yi9yb2Nrc29mdC9wYXBlcnMvY3JjX3YzLnR4dCwKLSAgICAgICBkZXNjcmliaW5nIHRoZSBDUkMgY29uY2VwdC4KLQotNC4gU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMKLQotICAgQW55IGRhdGEgY29tcHJlc3Npb24gbWV0aG9kIGludm9sdmVzIHRoZSByZWR1Y3Rpb24gb2YgcmVkdW5kYW5jeSBpbgotICAgdGhlIGRhdGEuICBDb25zZXF1ZW50bHksIGFueSBjb3JydXB0aW9uIG9mIHRoZSBkYXRhIGlzIGxpa2VseSB0byBoYXZlCi0gICBzZXZlcmUgZWZmZWN0cyBhbmQgYmUgZGlmZmljdWx0IHRvIGNvcnJlY3QuICBVbmNvbXByZXNzZWQgdGV4dCwgb24KLSAgIHRoZSBvdGhlciBoYW5kLCB3aWxsIHByb2JhYmx5IHN0aWxsIGJlIHJlYWRhYmxlIGRlc3BpdGUgdGhlIHByZXNlbmNlCi0gICBvZiBzb21lIGNvcnJ1cHRlZCBieXRlcy4KLQotICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBzeXN0ZW1zIHVzaW5nIHRoaXMgZGF0YSBmb3JtYXQgcHJvdmlkZSBzb21lCi0gICBtZWFucyBvZiB2YWxpZGF0aW5nIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSwgc3VjaCBhcyBieQotICAgc2V0dGluZyBhbmQgY2hlY2tpbmcgdGhlIENSQy0zMiBjaGVjayB2YWx1ZS4KLQotNS4gQWNrbm93bGVkZ2VtZW50cwotCi0gICBUcmFkZW1hcmtzIGNpdGVkIGluIHRoaXMgZG9jdW1lbnQgYXJlIHRoZSBwcm9wZXJ0eSBvZiB0aGVpcgotICAgcmVzcGVjdGl2ZSBvd25lcnMuCi0KLSAgIEplYW4tTG91cCBHYWlsbHkgZGVzaWduZWQgdGhlIGd6aXAgZm9ybWF0IGFuZCB3cm90ZSwgd2l0aCBNYXJrIEFkbGVyLAotICAgdGhlIHJlbGF0ZWQgc29mdHdhcmUgZGVzY3JpYmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbi4gIEdsZW5uCi0gICBSYW5kZXJzLVBlaHJzb24gY29udmVydGVkIHRoaXMgZG9jdW1lbnQgdG8gUkZDIGFuZCBIVE1MIGZvcm1hdC4KLQotNi4gQXV0aG9yJ3MgQWRkcmVzcwotCi0gICBMLiBQZXRlciBEZXV0c2NoCi0gICBBbGFkZGluIEVudGVycHJpc2VzCi0gICAyMDMgU2FudGEgTWFyZ2FyaXRhIEF2ZS4KLSAgIE1lbmxvIFBhcmssIENBIDk0MDI1Ci0KLSAgIFBob25lOiAoNDE1KSAzMjItMDEwMyAoQU0gb25seSkKLSAgIEZBWDogICAoNDE1KSAzMjItMTczNAotICAgRU1haWw6IDxnaG9zdEBhbGFkZGluLmNvbT4KLQotICAgUXVlc3Rpb25zIGFib3V0IHRoZSB0ZWNobmljYWwgY29udGVudCBvZiB0aGlzIHNwZWNpZmljYXRpb24gY2FuIGJlCi0gICBzZW50IGJ5IGVtYWlsIHRvOgotCi0gICBKZWFuLUxvdXAgR2FpbGx5IDxnemlwQHByZXAuYWkubWl0LmVkdT4gYW5kCi0gICBNYXJrIEFkbGVyIDxtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PgotCi0gICBFZGl0b3JpYWwgY29tbWVudHMgb24gdGhpcyBzcGVjaWZpY2F0aW9uIGNhbiBiZSBzZW50IGJ5IGVtYWlsIHRvOgotCi0gICBMLiBQZXRlciBEZXV0c2NoIDxnaG9zdEBhbGFkZGluLmNvbT4gYW5kCi0gICBHbGVubiBSYW5kZXJzLVBlaHJzb24gPHJhbmRlZ0BhbHVtbmkucnBpLmVkdT4KLQotCi0KLURldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDEwXQotDAotUkZDIDE5NTIgICAgICAgICAgICAgR1pJUCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICAgICAgIE1heSAxOTk2Ci0KLQotNy4gQXBwZW5kaXg6IEplYW4tTG91cCBHYWlsbHkncyBnemlwIHV0aWxpdHkKLQotICAgVGhlIG1vc3Qgd2lkZWx5IHVzZWQgaW1wbGVtZW50YXRpb24gb2YgZ3ppcCBjb21wcmVzc2lvbiwgYW5kIHRoZQotICAgb3JpZ2luYWwgZG9jdW1lbnRhdGlvbiBvbiB3aGljaCB0aGlzIHNwZWNpZmljYXRpb24gaXMgYmFzZWQsIHdlcmUKLSAgIGNyZWF0ZWQgYnkgSmVhbi1Mb3VwIEdhaWxseSA8Z3ppcEBwcmVwLmFpLm1pdC5lZHU+LiAgU2luY2UgdGhpcwotICAgaW1wbGVtZW50YXRpb24gaXMgYSBkZSBmYWN0byBzdGFuZGFyZCwgd2UgbWVudGlvbiBzb21lIG1vcmUgb2YgaXRzCi0gICBmZWF0dXJlcyBoZXJlLiAgQWdhaW4sIHRoZSBtYXRlcmlhbCBpbiB0aGlzIHNlY3Rpb24gaXMgbm90IHBhcnQgb2YKLSAgIHRoZSBzcGVjaWZpY2F0aW9uIHBlciBzZSwgYW5kIGltcGxlbWVudGF0aW9ucyBuZWVkIG5vdCBmb2xsb3cgaXQgdG8KLSAgIGJlIGNvbXBsaWFudC4KLQotICAgV2hlbiBjb21wcmVzc2luZyBvciBkZWNvbXByZXNzaW5nIGEgZmlsZSwgZ3ppcCBwcmVzZXJ2ZXMgdGhlCi0gICBwcm90ZWN0aW9uLCBvd25lcnNoaXAsIGFuZCBtb2RpZmljYXRpb24gdGltZSBhdHRyaWJ1dGVzIG9uIHRoZSBsb2NhbAotICAgZmlsZSBzeXN0ZW0sIHNpbmNlIHRoZXJlIGlzIG5vIHByb3Zpc2lvbiBmb3IgcmVwcmVzZW50aW5nIHByb3RlY3Rpb24KLSAgIGF0dHJpYnV0ZXMgaW4gdGhlIGd6aXAgZmlsZSBmb3JtYXQgaXRzZWxmLiAgU2luY2UgdGhlIGZpbGUgZm9ybWF0Ci0gICBpbmNsdWRlcyBhIG1vZGlmaWNhdGlvbiB0aW1lLCB0aGUgZ3ppcCBkZWNvbXByZXNzb3IgcHJvdmlkZXMgYQotICAgY29tbWFuZCBsaW5lIHN3aXRjaCB0aGF0IGFzc2lnbnMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIGZyb20gdGhlIGZpbGUsCi0gICByYXRoZXIgdGhhbiB0aGUgbG9jYWwgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGNvbXByZXNzZWQgaW5wdXQsIHRvCi0gICB0aGUgZGVjb21wcmVzc2VkIG91dHB1dC4KLQotOC4gQXBwZW5kaXg6IFNhbXBsZSBDUkMgQ29kZQotCi0gICBUaGUgZm9sbG93aW5nIHNhbXBsZSBjb2RlIHJlcHJlc2VudHMgYSBwcmFjdGljYWwgaW1wbGVtZW50YXRpb24gb2YKLSAgIHRoZSBDUkMgKEN5Y2xpYyBSZWR1bmRhbmN5IENoZWNrKS4gKFNlZSBhbHNvIElTTyAzMzA5IGFuZCBJVFUtVCBWLjQyCi0gICBmb3IgYSBmb3JtYWwgc3BlY2lmaWNhdGlvbi4pCi0KLSAgIFRoZSBzYW1wbGUgY29kZSBpcyBpbiB0aGUgQU5TSSBDIHByb2dyYW1taW5nIGxhbmd1YWdlLiBOb24gQyB1c2VycwotICAgbWF5IGZpbmQgaXQgZWFzaWVyIHRvIHJlYWQgd2l0aCB0aGVzZSBoaW50czoKLQotICAgICAgJiAgICAgIEJpdHdpc2UgQU5EIG9wZXJhdG9yLgotICAgICAgXiAgICAgIEJpdHdpc2UgZXhjbHVzaXZlLU9SIG9wZXJhdG9yLgotICAgICAgPj4gICAgIEJpdHdpc2UgcmlnaHQgc2hpZnQgb3BlcmF0b3IuIFdoZW4gYXBwbGllZCB0byBhbgotICAgICAgICAgICAgIHVuc2lnbmVkIHF1YW50aXR5LCBhcyBoZXJlLCByaWdodCBzaGlmdCBpbnNlcnRzIHplcm8KLSAgICAgICAgICAgICBiaXQocykgYXQgdGhlIGxlZnQuCi0gICAgICAhICAgICAgTG9naWNhbCBOT1Qgb3BlcmF0b3IuCi0gICAgICArKyAgICAgIm4rKyIgaW5jcmVtZW50cyB0aGUgdmFyaWFibGUgbi4KLSAgICAgIDB4Tk5OICAweCBpbnRyb2R1Y2VzIGEgaGV4YWRlY2ltYWwgKGJhc2UgMTYpIGNvbnN0YW50LgotICAgICAgICAgICAgIFN1ZmZpeCBMIGluZGljYXRlcyBhIGxvbmcgdmFsdWUgKGF0IGxlYXN0IDMyIGJpdHMpLgotCi0gICAgICAvKiBUYWJsZSBvZiBDUkNzIG9mIGFsbCA4LWJpdCBtZXNzYWdlcy4gKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgY3JjX3RhYmxlWzI1Nl07Ci0KLSAgICAgIC8qIEZsYWc6IGhhcyB0aGUgdGFibGUgYmVlbiBjb21wdXRlZD8gSW5pdGlhbGx5IGZhbHNlLiAqLwotICAgICAgaW50IGNyY190YWJsZV9jb21wdXRlZCA9IDA7Ci0KLSAgICAgIC8qIE1ha2UgdGhlIHRhYmxlIGZvciBhIGZhc3QgQ1JDLiAqLwotICAgICAgdm9pZCBtYWtlX2NyY190YWJsZSh2b2lkKQotICAgICAgewotICAgICAgICB1bnNpZ25lZCBsb25nIGM7Ci0KLQotCi1EZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxMV0KLQwKLVJGQyAxOTUyICAgICAgICAgICAgIEdaSVAgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgICAgICBNYXkgMTk5NgotCi0KLSAgICAgICAgaW50IG4sIGs7Ci0gICAgICAgIGZvciAobiA9IDA7IG4gPCAyNTY7IG4rKykgewotICAgICAgICAgIGMgPSAodW5zaWduZWQgbG9uZykgbjsKLSAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgODsgaysrKSB7Ci0gICAgICAgICAgICBpZiAoYyAmIDEpIHsKLSAgICAgICAgICAgICAgYyA9IDB4ZWRiODgzMjBMIF4gKGMgPj4gMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBjID0gYyA+PiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjcmNfdGFibGVbbl0gPSBjOwotICAgICAgICB9Ci0gICAgICAgIGNyY190YWJsZV9jb21wdXRlZCA9IDE7Ci0gICAgICB9Ci0KLSAgICAgIC8qCi0gICAgICAgICBVcGRhdGUgYSBydW5uaW5nIGNyYyB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZCByZXR1cm4KLSAgICAgICB0aGUgdXBkYXRlZCBjcmMuIFRoZSBjcmMgc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIHplcm8uIFByZS0gYW5kCi0gICAgICAgcG9zdC1jb25kaXRpb25pbmcgKG9uZSdzIGNvbXBsZW1lbnQpIGlzIHBlcmZvcm1lZCB3aXRoaW4gdGhpcwotICAgICAgIGZ1bmN0aW9uIHNvIGl0IHNob3VsZG4ndCBiZSBkb25lIGJ5IHRoZSBjYWxsZXIuIFVzYWdlIGV4YW1wbGU6Ci0KLSAgICAgICAgIHVuc2lnbmVkIGxvbmcgY3JjID0gMEw7Ci0KLSAgICAgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7Ci0gICAgICAgICAgIGNyYyA9IHVwZGF0ZV9jcmMoY3JjLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoY3JjICE9IG9yaWdpbmFsX2NyYykgZXJyb3IoKTsKLSAgICAgICovCi0gICAgICB1bnNpZ25lZCBsb25nIHVwZGF0ZV9jcmModW5zaWduZWQgbG9uZyBjcmMsCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQotICAgICAgewotICAgICAgICB1bnNpZ25lZCBsb25nIGMgPSBjcmMgXiAweGZmZmZmZmZmTDsKLSAgICAgICAgaW50IG47Ci0KLSAgICAgICAgaWYgKCFjcmNfdGFibGVfY29tcHV0ZWQpCi0gICAgICAgICAgbWFrZV9jcmNfdGFibGUoKTsKLSAgICAgICAgZm9yIChuID0gMDsgbiA8IGxlbjsgbisrKSB7Ci0gICAgICAgICAgYyA9IGNyY190YWJsZVsoYyBeIGJ1ZltuXSkgJiAweGZmXSBeIChjID4+IDgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjIF4gMHhmZmZmZmZmZkw7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFJldHVybiB0aGUgQ1JDIG9mIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdLiAqLwotICAgICAgdW5zaWduZWQgbG9uZyBjcmModW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQotICAgICAgewotICAgICAgICByZXR1cm4gdXBkYXRlX2NyYygwTCwgYnVmLCBsZW4pOwotICAgICAgfQotCi0KLQotCi1EZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxMl0KLQwKZGlmZiAtLWdpdCBhL3NyYy96bGliL2RvYy90eHR2c2Jpbi50eHQgYi9zcmMvemxpYi9kb2MvdHh0dnNiaW4udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDBmMDYzLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2RvYy90eHR2c2Jpbi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotQSBGYXN0IE1ldGhvZCBmb3IgSWRlbnRpZnlpbmcgUGxhaW4gVGV4dCBGaWxlcwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLUludHJvZHVjdGlvbgotLS0tLS0tLS0tLS0tCi0KLUdpdmVuIGEgZmlsZSBjb21pbmcgZnJvbSBhbiB1bmtub3duIHNvdXJjZSwgaXQgaXMgc29tZXRpbWVzIGRlc2lyYWJsZQotdG8gZmluZCBvdXQgd2hldGhlciB0aGUgZm9ybWF0IG9mIHRoYXQgZmlsZSBpcyBwbGFpbiB0ZXh0LiAgQWx0aG91Z2gKLXRoaXMgbWF5IGFwcGVhciBsaWtlIGEgc2ltcGxlIHRhc2ssIGEgZnVsbHkgYWNjdXJhdGUgZGV0ZWN0aW9uIG9mIHRoZQotZmlsZSB0eXBlIHJlcXVpcmVzIGhlYXZ5LWR1dHkgc2VtYW50aWMgYW5hbHlzaXMgb24gdGhlIGZpbGUgY29udGVudHMuCi1JdCBpcywgaG93ZXZlciwgcG9zc2libGUgdG8gb2J0YWluIHNhdGlzZmFjdG9yeSByZXN1bHRzIGJ5IGVtcGxveWluZwotdmFyaW91cyBoZXVyaXN0aWNzLgotCi1QcmV2aW91cyB2ZXJzaW9ucyBvZiBQS1ppcCBhbmQgb3RoZXIgemlwLWNvbXBhdGlibGUgY29tcHJlc3Npb24gdG9vbHMKLXdlcmUgdXNpbmcgYSBjcnVkZSBkZXRlY3Rpb24gc2NoZW1lOiBpZiBtb3JlIHRoYW4gODAlICg0LzUpIG9mIHRoZSBieXRlcwotZm91bmQgaW4gYSBjZXJ0YWluIGJ1ZmZlciBhcmUgd2l0aGluIHRoZSByYW5nZSBbNy4uMTI3XSwgdGhlIGZpbGUgaXMKLWxhYmVsZWQgYXMgcGxhaW4gdGV4dCwgb3RoZXJ3aXNlIGl0IGlzIGxhYmVsZWQgYXMgYmluYXJ5LiAgQSBwcm9taW5lbnQKLWxpbWl0YXRpb24gb2YgdGhpcyBzY2hlbWUgaXMgdGhlIHJlc3RyaWN0aW9uIHRvIExhdGluLWJhc2VkIGFscGhhYmV0cy4KLU90aGVyIGFscGhhYmV0cywgbGlrZSBHcmVlaywgQ3lyaWxsaWMgb3IgQXNpYW4sIG1ha2UgZXh0ZW5zaXZlIHVzZSBvZgotdGhlIGJ5dGVzIHdpdGhpbiB0aGUgcmFuZ2UgWzEyOC4uMjU1XSwgYW5kIHRleHRzIHVzaW5nIHRoZXNlIGFscGhhYmV0cwotYXJlIG1vc3Qgb2Z0ZW4gbWlzaWRlbnRpZmllZCBieSB0aGlzIHNjaGVtZTsgaW4gb3RoZXIgd29yZHMsIHRoZSByYXRlCi1vZiBmYWxzZSBuZWdhdGl2ZXMgaXMgc29tZXRpbWVzIHRvbyBoaWdoLCB3aGljaCBtZWFucyB0aGF0IHRoZSByZWNhbGwKLWlzIGxvdy4gIEFub3RoZXIgd2Vha25lc3Mgb2YgdGhpcyBzY2hlbWUgaXMgYSByZWR1Y2VkIHByZWNpc2lvbiwgZHVlIHRvCi10aGUgZmFsc2UgcG9zaXRpdmVzIHRoYXQgbWF5IG9jY3VyIHdoZW4gYmluYXJ5IGZpbGVzIGNvbnRhaW5pbmcgbGFyZ2UKLWFtb3VudHMgb2YgdGV4dHVhbCBjaGFyYWN0ZXJzIGFyZSBtaXNpZGVudGlmaWVkIGFzIHBsYWluIHRleHQuCi0KLUluIHRoaXMgYXJ0aWNsZSB3ZSBwcm9wb3NlIGEgbmV3LCBzaW1wbGUgZGV0ZWN0aW9uIHNjaGVtZSB0aGF0IGZlYXR1cmVzCi1hIG11Y2ggaW5jcmVhc2VkIHByZWNpc2lvbiBhbmQgYSBuZWFyLTEwMCUgcmVjYWxsLiAgVGhpcyBzY2hlbWUgaXMKLWRlc2lnbmVkIHRvIHdvcmsgb24gQVNDSUksIFVuaWNvZGUgYW5kIG90aGVyIEFTQ0lJLWRlcml2ZWQgYWxwaGFiZXRzLAotYW5kIGl0IGhhbmRsZXMgc2luZ2xlLWJ5dGUgZW5jb2RpbmdzIChJU08tODg1OSwgTWFjUm9tYW4sIEtPSTgsIGV0Yy4pCi1hbmQgdmFyaWFibGUtc2l6ZWQgZW5jb2RpbmdzIChJU08tMjAyMiwgVVRGLTgsIGV0Yy4pLiAgV2lkZXIgZW5jb2RpbmdzCi0oVUNTLTIvVVRGLTE2IGFuZCBVQ1MtNC9VVEYtMzIpIGFyZSBub3QgaGFuZGxlZCwgaG93ZXZlci4KLQotCi1UaGUgQWxnb3JpdGhtCi0tLS0tLS0tLS0tLS0tCi0KLVRoZSBhbGdvcml0aG0gd29ya3MgYnkgZGl2aWRpbmcgdGhlIHNldCBvZiBieXRlY29kZXMgWzAuLjI1NV0gaW50byB0aHJlZQotY2F0ZWdvcmllczoKLS0gVGhlIHdoaXRlIGxpc3Qgb2YgdGV4dHVhbCBieXRlY29kZXM6Ci0gIDkgKFRBQiksIDEwIChMRiksIDEzIChDUiksIDMyIChTUEFDRSkgdG8gMjU1LgotLSBUaGUgZ3JheSBsaXN0IG9mIHRvbGVyYXRlZCBieXRlY29kZXM6Ci0gIDcgKEJFTCksIDggKEJTKSwgMTEgKFZUKSwgMTIgKEZGKSwgMjYgKFNVQiksIDI3IChFU0MpLgotLSBUaGUgYmxhY2sgbGlzdCBvZiB1bmRlc2lyZWQsIG5vbi10ZXh0dWFsIGJ5dGVjb2RlczoKLSAgMCAoTlVMKSB0byA2LCAxNCB0byAzMS4KLQotSWYgYSBmaWxlIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBieXRlIHRoYXQgYmVsb25ncyB0byB0aGUgd2hpdGUgbGlzdCBhbmQKLW5vIGJ5dGUgdGhhdCBiZWxvbmdzIHRvIHRoZSBibGFjayBsaXN0LCB0aGVuIHRoZSBmaWxlIGlzIGNhdGVnb3JpemVkIGFzCi1wbGFpbiB0ZXh0OyBvdGhlcndpc2UsIGl0IGlzIGNhdGVnb3JpemVkIGFzIGJpbmFyeS4gIChUaGUgYm91bmRhcnkgY2FzZSwKLXdoZW4gdGhlIGZpbGUgaXMgZW1wdHksIGF1dG9tYXRpY2FsbHkgZmFsbHMgaW50byB0aGUgbGF0dGVyIGNhdGVnb3J5LikKLQotCi1SYXRpb25hbGUKLS0tLS0tLS0tLQotCi1UaGUgaWRlYSBiZWhpbmQgdGhpcyBhbGdvcml0aG0gcmVsaWVzIG9uIHR3byBvYnNlcnZhdGlvbnMuCi0KLVRoZSBmaXJzdCBvYnNlcnZhdGlvbiBpcyB0aGF0LCBhbHRob3VnaCB0aGUgZnVsbCByYW5nZSBvZiA3LWJpdCBjb2RlcwotWzAuLjEyN10gaXMgcHJvcGVybHkgc3BlY2lmaWVkIGJ5IHRoZSBBU0NJSSBzdGFuZGFyZCwgbW9zdCBjb250cm9sCi1jaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbMC4uMzFdIGFyZSBub3QgdXNlZCBpbiBwcmFjdGljZS4gIFRoZSBvbmx5Ci13aWRlbHktdXNlZCwgYWxtb3N0IHVuaXZlcnNhbGx5LXBvcnRhYmxlIGNvbnRyb2wgY29kZXMgYXJlIDkgKFRBQiksCi0xMCAoTEYpIGFuZCAxMyAoQ1IpLiAgVGhlcmUgYXJlIGEgZmV3IG1vcmUgY29udHJvbCBjb2RlcyB0aGF0IGFyZQotcmVjb2duaXplZCBvbiBhIHJlZHVjZWQgcmFuZ2Ugb2YgcGxhdGZvcm1zIGFuZCB0ZXh0IHZpZXdlcnMvZWRpdG9yczoKLTcgKEJFTCksIDggKEJTKSwgMTEgKFZUKSwgMTIgKEZGKSwgMjYgKFNVQikgYW5kIDI3IChFU0MpOyBidXQgdGhlc2UKLWNvZGVzIGFyZSByYXJlbHkgKGlmIGV2ZXIpIHVzZWQgYWxvbmUsIHdpdGhvdXQgYmVpbmcgYWNjb21wYW5pZWQgYnkKLXNvbWUgcHJpbnRhYmxlIHRleHQuICBFdmVuIHRoZSBuZXdlciwgcG9ydGFibGUgdGV4dCBmb3JtYXRzIHN1Y2ggYXMKLVhNTCBhdm9pZCB1c2luZyBjb250cm9sIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGUgbGlzdCBtZW50aW9uZWQgaGVyZS4KLQotVGhlIHNlY29uZCBvYnNlcnZhdGlvbiBpcyB0aGF0IG1vc3Qgb2YgdGhlIGJpbmFyeSBmaWxlcyB0ZW5kIHRvIGNvbnRhaW4KLWNvbnRyb2wgY2hhcmFjdGVycywgZXNwZWNpYWxseSAwIChOVUwpLiAgRXZlbiB0aG91Z2ggdGhlIG9sZGVyIHRleHQKLWRldGVjdGlvbiBzY2hlbWVzIG9ic2VydmUgdGhlIHByZXNlbmNlIG9mIG5vbi1BU0NJSSBjb2RlcyBmcm9tIHRoZSByYW5nZQotWzEyOC4uMjU1XSwgdGhlIHByZWNpc2lvbiByYXJlbHkgaGFzIHRvIHN1ZmZlciBpZiB0aGlzIHVwcGVyIHJhbmdlIGlzCi1sYWJlbGVkIGFzIHRleHR1YWwsIGJlY2F1c2UgdGhlIGZpbGVzIHRoYXQgYXJlIGdlbnVpbmVseSBiaW5hcnkgdGVuZCB0bwotY29udGFpbiBib3RoIGNvbnRyb2wgY2hhcmFjdGVycyBhbmQgY29kZXMgZnJvbSB0aGUgdXBwZXIgcmFuZ2UuICBPbiB0aGUKLW90aGVyIGhhbmQsIHRoZSB1cHBlciByYW5nZSBuZWVkcyB0byBiZSBsYWJlbGVkIGFzIHRleHR1YWwsIGJlY2F1c2UgaXQKLWlzIHVzZWQgYnkgdmlydHVhbGx5IGFsbCBBU0NJSSBleHRlbnNpb25zLiAgSW4gcGFydGljdWxhciwgdGhpcyByYW5nZSBpcwotdXNlZCBmb3IgZW5jb2Rpbmcgbm9uLUxhdGluIHNjcmlwdHMuCi0KLVNpbmNlIHRoZXJlIGlzIG5vIGNvdW50aW5nIGludm9sdmVkLCBvdGhlciB0aGFuIHNpbXBseSBvYnNlcnZpbmcgdGhlCi1wcmVzZW5jZSBvciB0aGUgYWJzZW5jZSBvZiBzb21lIGJ5dGUgdmFsdWVzLCB0aGUgYWxnb3JpdGhtIHByb2R1Y2VzCi1jb25zaXN0ZW50IHJlc3VsdHMsIHJlZ2FyZGxlc3Mgd2hhdCBhbHBoYWJldCBlbmNvZGluZyBpcyBiZWluZyB1c2VkLgotKElmIGNvdW50aW5nIHdlcmUgaW52b2x2ZWQsIGl0IGNvdWxkIGJlIHBvc3NpYmxlIHRvIG9idGFpbiBkaWZmZXJlbnQKLXJlc3VsdHMgb24gYSB0ZXh0IGVuY29kZWQsIHNheSwgdXNpbmcgSVNPLTg4NTktMTYgdmVyc3VzIFVURi04LikKLQotVGhlcmUgaXMgYW4gZXh0cmEgY2F0ZWdvcnkgb2YgcGxhaW4gdGV4dCBmaWxlcyB0aGF0IGFyZSAicG9sbHV0ZWQiIHdpdGgKLW9uZSBvciBtb3JlIGJsYWNrLWxpc3RlZCBjb2RlcywgZWl0aGVyIGJ5IG1pc3Rha2Ugb3IgYnkgcGVjdWxpYXIgZGVzaWduCi1jb25zaWRlcmF0aW9ucy4gIEluIHN1Y2ggY2FzZXMsIGEgc2NoZW1lIHRoYXQgdG9sZXJhdGVzIGEgc21hbGwgZnJhY3Rpb24KLW9mIGJsYWNrLWxpc3RlZCBjb2RlcyB3b3VsZCBwcm92aWRlIGFuIGluY3JlYXNlZCByZWNhbGwgKGkuZS4gbW9yZSB0cnVlCi1wb3NpdGl2ZXMpLiAgVGhpcywgaG93ZXZlciwgaW5jdXJzIGEgcmVkdWNlZCBwcmVjaXNpb24gb3ZlcmFsbCwgc2luY2UKLWZhbHNlIHBvc2l0aXZlcyBhcmUgbW9yZSBsaWtlbHkgdG8gYXBwZWFyIGluIGJpbmFyeSBmaWxlcyB0aGF0IGNvbnRhaW4KLWxhcmdlIGNodW5rcyBvZiB0ZXh0dWFsIGRhdGEuICBGdXJ0aGVybW9yZSwgInBvbGx1dGVkIiBwbGFpbiB0ZXh0IHNob3VsZAotYmUgcmVnYXJkZWQgYXMgYmluYXJ5IGJ5IGdlbmVyYWwtcHVycG9zZSB0ZXh0IGRldGVjdGlvbiBzY2hlbWVzLCBiZWNhdXNlCi1nZW5lcmFsLXB1cnBvc2UgdGV4dCBwcm9jZXNzaW5nIGFsZ29yaXRobXMgbWlnaHQgbm90IGJlIGFwcGxpY2FibGUuCi1VbmRlciB0aGlzIHByZW1pc2UsIGl0IGlzIHNhZmUgdG8gc2F5IHRoYXQgb3VyIGRldGVjdGlvbiBtZXRob2QgcHJvdmlkZXMKLWEgbmVhci0xMDAlIHJlY2FsbC4KLQotRXhwZXJpbWVudHMgaGF2ZSBiZWVuIHJ1biBvbiBtYW55IGZpbGVzIGNvbWluZyBmcm9tIHZhcmlvdXMgcGxhdGZvcm1zCi1hbmQgYXBwbGljYXRpb25zLiAgV2UgdHJpZWQgcGxhaW4gdGV4dCBmaWxlcywgc3lzdGVtIGxvZ3MsIHNvdXJjZSBjb2RlLAotZm9ybWF0dGVkIG9mZmljZSBkb2N1bWVudHMsIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBldGMuICBUaGUgcmVzdWx0cwotY29uZmlybSB0aGUgb3B0aW1pc3RpYyBhc3N1bXB0aW9ucyBhYm91dCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoaXMKLWFsZ29yaXRobS4KLQotCi0tLQotQ29zbWluIFRydXRhCi1MYXN0IHVwZGF0ZWQ6IDIwMDYtTWF5LTI4CmRpZmYgLS1naXQgYS9zcmMvemxpYi9leGFtcGxlcy9SRUFETUUuZXhhbXBsZXMgYi9zcmMvemxpYi9leGFtcGxlcy9SRUFETUUuZXhhbXBsZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YTMxNzEuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvZXhhbXBsZXMvUkVBRE1FLmV4YW1wbGVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZXhhbXBsZXMgb2YgdGhlIHVzZSBvZiB6bGliIGFuZCBvdGhlciByZWxldmFudAotcHJvZ3JhbXMgYW5kIGRvY3VtZW50YXRpb24uCi0KLWVub3VnaC5jCi0gICAgY2FsY3VsYXRpb24gYW5kIGp1c3RpZmljYXRpb24gb2YgRU5PVUdIIHBhcmFtZXRlciBpbiBpbmZ0cmVlcy5oCi0gICAgLSBjYWxjdWxhdGVzIHRoZSBtYXhpbXVtIHRhYmxlIHNwYWNlIHVzZWQgaW4gaW5mbGF0ZSB0cmVlCi0gICAgICBjb25zdHJ1Y3Rpb24gb3ZlciBhbGwgcG9zc2libGUgSHVmZm1hbiBjb2RlcwotCi1maXRibGsuYwotICAgIGNvbXByZXNzIGp1c3QgZW5vdWdoIGlucHV0IHRvIG5lYXJseSBmaWxsIGEgcmVxdWVzdGVkIG91dHB1dCBzaXplCi0gICAgLSB6bGliIGlzbid0IGRlc2lnbmVkIHRvIGRvIHRoaXMsIGJ1dCBmaXRibGsgZG9lcyBpdCBhbnl3YXkKLQotZ3VuLmMKLSAgICB1bmNvbXByZXNzIGEgZ3ppcCBmaWxlCi0gICAgLSBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIGluZmxhdGVCYWNrKCkgZm9yIGhpZ2ggc3BlZWQgZmlsZS10by1maWxlCi0gICAgICBkZWNvbXByZXNzaW9uIHVzaW5nIGNhbGwtYmFjayBmdW5jdGlvbnMKLSAgICAtIGlzIGFwcHJveGltYXRlbHkgdHdpY2UgYXMgZmFzdCBhcyBnemlwIC1kCi0gICAgLSBhbHNvIHByb3ZpZGVzIFVuaXggdW5jb21wcmVzcyBmdW5jdGlvbmFsaXR5LCBhZ2FpbiB0d2ljZSBhcyBmYXN0Ci0KLWd6YXBwZW5kLmMKLSAgICBhcHBlbmQgdG8gYSBnemlwIGZpbGUKLSAgICAtIGlsbHVzdHJhdGVzIHRoZSB1c2Ugb2YgdGhlIFpfQkxPQ0sgZmx1c2ggcGFyYW1ldGVyIGZvciBpbmZsYXRlKCkKLSAgICAtIGlsbHVzdHJhdGVzIHRoZSB1c2Ugb2YgZGVmbGF0ZVByaW1lKCkgdG8gc3RhcnQgYXQgYW55IGJpdAotCi1nempvaW4uYwotICAgIGpvaW4gZ3ppcCBmaWxlcyB3aXRob3V0IHJlY2FsY3VsYXRpbmcgdGhlIGNyYyBvciByZWNvbXByZXNzaW5nCi0gICAgLSBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBaX0JMT0NLIGZsdXNoIHBhcmFtZXRlciBmb3IgaW5mbGF0ZSgpCi0gICAgLSBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIGNyYzMyX2NvbWJpbmUoKQotCi1nemxvZy5jCi1nemxvZy5oCi0gICAgZWZmaWNpZW50bHkgYW5kIHJvYnVzdGx5IG1haW50YWluIGEgbWVzc2FnZSBsb2cgZmlsZSBpbiBnemlwIGZvcm1hdAotICAgIC0gaWxsdXN0cmF0ZXMgdXNlIG9mIHJhdyBkZWZsYXRlLCBaX1BBUlRJQUxfRkxVU0gsIGRlZmxhdGVQcmltZSgpLAotICAgICAgYW5kIGRlZmxhdGVTZXREaWN0aW9uYXJ5KCkKLSAgICAtIGlsbHVzdHJhdGVzIHVzZSBvZiBhIGd6aXAgaGVhZGVyIGV4dHJhIGZpZWxkCi0KLXpsaWJfaG93Lmh0bWwKLSAgICBwYWluZnVsbHkgY29tcHJlaGVuc2l2ZSBkZXNjcmlwdGlvbiBvZiB6cGlwZS5jIChzZWUgYmVsb3cpCi0gICAgLSBkZXNjcmliZXMgaW4gZXhjcnVjaWF0aW5nIGRldGFpbCB0aGUgdXNlIG9mIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpCi0KLXpwaXBlLmMKLSAgICByZWFkcyBhbmQgd3JpdGVzIHpsaWIgc3RyZWFtcyBmcm9tIHN0ZGluIHRvIHN0ZG91dAotICAgIC0gaWxsdXN0cmF0ZXMgdGhlIHByb3BlciB1c2Ugb2YgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkKLSAgICAtIGRlZXBseSBjb21tZW50ZWQgaW4gemxpYl9ob3cuaHRtbCAoc2VlIGFib3ZlKQotCi16cmFuLmMKLSAgICBpbmRleCBhIHpsaWIgb3IgZ3ppcCBzdHJlYW0gYW5kIHJhbmRvbWx5IGFjY2VzcyBpdAotICAgIC0gaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiBaX0JMT0NLLCBpbmZsYXRlUHJpbWUoKSwgYW5kCi0gICAgICBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIHRvIHByb3ZpZGUgcmFuZG9tIGFjY2VzcwpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvZXhhbXBsZXMvZW5vdWdoLmMgYi9zcmMvemxpYi9leGFtcGxlcy9lbm91Z2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwNDEwYi4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9leGFtcGxlcy9lbm91Z2guYworKysgL2Rldi9udWxsCkBAIC0xLDU2OSArMCwwIEBACi0vKiBlbm91Z2guYyAtLSBkZXRlcm1pbmUgdGhlIG1heGltdW0gc2l6ZSBvZiBpbmZsYXRlJ3MgSHVmZm1hbiBjb2RlIHRhYmxlcyBvdmVyCi0gKiBhbGwgcG9zc2libGUgdmFsaWQgYW5kIGNvbXBsZXRlIEh1ZmZtYW4gY29kZXMsIHN1YmplY3QgdG8gYSBsZW5ndGggbGltaXQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggTWFyayBBZGxlcgotICogVmVyc2lvbiAxLjMgIDE3IEZlYnJ1YXJ5IDIwMDggIE1hcmsgQWRsZXIKLSAqLwotCi0vKiBWZXJzaW9uIGhpc3Rvcnk6Ci0gICAxLjAgICAzIEphbiAyMDA3ICBGaXJzdCB2ZXJzaW9uIChkZXJpdmVkIGZyb20gY29kZWNvdW50LmMgdmVyc2lvbiAxLjQpCi0gICAxLjEgICA0IEphbiAyMDA3ICBVc2UgZmFzdGVyIGluY3JlbWVudGFsIHRhYmxlIHVzYWdlIGNvbXB1dGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICBQcnVuZSBleGFtaW5lKCkgc2VhcmNoIG9uIHByZXZpb3VzbHkgdmlzaXRlZCBzdGF0ZXMKLSAgIDEuMiAgIDUgSmFuIDIwMDcgIENvbW1lbnRzIGNsZWFuIHVwCi0gICAgICAgICAgICAgICAgICAgICBBcyBpbmZsYXRlIGRvZXMsIGRlY3JlYXNlIHJvb3QgZm9yIHNob3J0IGNvZGVzCi0gICAgICAgICAgICAgICAgICAgICBSZWZ1c2UgY2FzZXMgd2hlcmUgaW5mbGF0ZSB3b3VsZCBpbmNyZWFzZSByb290Ci0gICAxLjMgIDE3IEZlYiAyMDA4ICBBZGQgYXJndW1lbnQgZm9yIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplCi0gICAgICAgICAgICAgICAgICAgICBGaXggYnVnIGZvciBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSA9PSBtYXggLSAxCi0gICAgICAgICAgICAgICAgICAgICBVc2UgYSBtYWNybyB0byBjb21wdXRlIHRoZSBoaXN0b3J5IGluZGV4Ci0gKi8KLQotLyoKLSAgIEV4YW1pbmUgYWxsIHBvc3NpYmxlIEh1ZmZtYW4gY29kZXMgZm9yIGEgZ2l2ZW4gbnVtYmVyIG9mIHN5bWJvbHMgYW5kIGEKLSAgIG1heGltdW0gY29kZSBsZW5ndGggaW4gYml0cyB0byBkZXRlcm1pbmUgdGhlIG1heGltdW0gdGFibGUgc2l6ZSBmb3IgemlsYidzCi0gICBpbmZsYXRlLiAgT25seSBjb21wbGV0ZSBIdWZmbWFuIGNvZGVzIGFyZSBjb3VudGVkLgotCi0gICBUd28gY29kZXMgYXJlIGNvbnNpZGVyZWQgZGlzdGluY3QgaWYgdGhlIHZlY3RvcnMgb2YgdGhlIG51bWJlciBvZiBjb2RlcyBwZXIKLSAgIGxlbmd0aCBhcmUgbm90IGlkZW50aWNhbC4gIFNvIHBlcm11dGF0aW9ucyBvZiB0aGUgc3ltYm9sIGFzc2lnbm1lbnRzIHJlc3VsdAotICAgaW4gdGhlIHNhbWUgY29kZSBmb3IgdGhlIGNvdW50aW5nLCBhcyBkbyBwZXJtdXRhdGlvbnMgb2YgdGhlIGFzc2lnbm1lbnRzIG9mCi0gICB0aGUgYml0IHZhbHVlcyB0byB0aGUgY29kZXMgKGkuZS4gb25seSBjYW5vbmljYWwgY29kZXMgYXJlIGNvdW50ZWQpLgotCi0gICBXZSBidWlsZCBhIGNvZGUgZnJvbSBzaG9ydGVyIHRvIGxvbmdlciBsZW5ndGhzLCBkZXRlcm1pbmluZyBob3cgbWFueSBzeW1ib2xzCi0gICBhcmUgY29kZWQgYXQgZWFjaCBsZW5ndGguICBBdCBlYWNoIHN0ZXAsIHdlIGhhdmUgaG93IG1hbnkgc3ltYm9scyByZW1haW4gdG8KLSAgIGJlIGNvZGVkLCB3aGF0IHRoZSBsYXN0IGNvZGUgbGVuZ3RoIHVzZWQgd2FzLCBhbmQgaG93IG1hbnkgYml0IHBhdHRlcm5zIG9mCi0gICB0aGF0IGxlbmd0aCByZW1haW4gdW51c2VkLiBUaGVuIHdlIGFkZCBvbmUgdG8gdGhlIGNvZGUgbGVuZ3RoIGFuZCBkb3VibGUgdGhlCi0gICBudW1iZXIgb2YgdW51c2VkIHBhdHRlcm5zIHRvIGdyYWR1YXRlIHRvIHRoZSBuZXh0IGNvZGUgbGVuZ3RoLiAgV2UgdGhlbgotICAgYXNzaWduIGFsbCBwb3J0aW9ucyBvZiB0aGUgcmVtYWluaW5nIHN5bWJvbHMgdG8gdGhhdCBjb2RlIGxlbmd0aCB0aGF0Ci0gICBwcmVzZXJ2ZSB0aGUgcHJvcGVydGllcyBvZiBhIGNvcnJlY3QgYW5kIGV2ZW50dWFsbHkgY29tcGxldGUgY29kZS4gIFRob3NlCi0gICBwcm9wZXJ0aWVzIGFyZTogd2UgY2Fubm90IHVzZSBtb3JlIGJpdCBwYXR0ZXJucyB0aGFuIGFyZSBhdmFpbGFibGU7IGFuZCB3aGVuCi0gICBhbGwgdGhlIHN5bWJvbHMgYXJlIHVzZWQsIHRoZXJlIGFyZSBleGFjdGx5IHplcm8gcG9zc2libGUgYml0IHBhdHRlcm5zCi0gICByZW1haW5pbmcuCi0KLSAgIFRoZSBpbmZsYXRlIEh1ZmZtYW4gZGVjb2RpbmcgYWxnb3JpdGhtIHVzZXMgdHdvLWxldmVsIGxvb2t1cCB0YWJsZXMgZm9yCi0gICBzcGVlZC4gIFRoZXJlIGlzIGEgc2luZ2xlIGZpcnN0LWxldmVsIHRhYmxlIHRvIGRlY29kZSBjb2RlcyB1cCB0byByb290IGJpdHMKLSAgIGluIGxlbmd0aCAocm9vdCA9PSA5IGluIHRoZSBjdXJyZW50IGluZmxhdGUgaW1wbGVtZW50YXRpb24pLiAgVGhlIHRhYmxlCi0gICBoYXMgMSA8PCByb290IGVudHJpZXMgYW5kIGlzIGluZGV4ZWQgYnkgdGhlIG5leHQgcm9vdCBiaXRzIG9mIGlucHV0LiAgQ29kZXMKLSAgIHNob3J0ZXIgdGhhbiByb290IGJpdHMgaGF2ZSByZXBsaWNhdGVkIHRhYmxlIGVudHJpZXMsIHNvIHRoYXQgdGhlIGNvcnJlY3QKLSAgIGVudHJ5IGlzIHBvaW50ZWQgdG8gcmVnYXJkbGVzcyBvZiB0aGUgYml0cyB0aGF0IGZvbGxvdyB0aGUgc2hvcnQgY29kZS4gIElmCi0gICB0aGUgY29kZSBpcyBsb25nZXIgdGhhbiByb290IGJpdHMsIHRoZW4gdGhlIHRhYmxlIGVudHJ5IHBvaW50cyB0byBhIHNlY29uZC0KLSAgIGxldmVsIHRhYmxlLiAgVGhlIHNpemUgb2YgdGhhdCB0YWJsZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsb25nZXN0IGNvZGUgd2l0aAotICAgdGhhdCByb290LWJpdCBwcmVmaXguICBJZiB0aGF0IGxvbmdlc3QgY29kZSBoYXMgbGVuZ3RoIGxlbiwgdGhlbiB0aGUgdGFibGUKLSAgIGhhcyBzaXplIDEgPDwgKGxlbiAtIHJvb3QpLCB0byBpbmRleCB0aGUgcmVtYWluaW5nIGJpdHMgaW4gdGhhdCBzZXQgb2YKLSAgIGNvZGVzLiAgRWFjaCBzdWJzZXF1ZW50IHJvb3QtYml0IHByZWZpeCB0aGVuIGhhcyBpdHMgb3duIHN1Yi10YWJsZS4gIFRoZQotICAgdG90YWwgbnVtYmVyIG9mIHRhYmxlIGVudHJpZXMgcmVxdWlyZWQgYnkgdGhlIGNvZGUgaXMgY2FsY3VsYXRlZAotICAgaW5jcmVtZW50YWxseSBhcyB0aGUgbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBpcyBwb3B1bGF0ZWQuICBXaGVuCi0gICBhbGwgb2YgdGhlIGNvZGVzIGFyZSBzaG9ydGVyIHRoYW4gcm9vdCBiaXRzLCB0aGVuIHJvb3QgaXMgcmVkdWNlZCB0byB0aGUKLSAgIGxvbmdlc3QgY29kZSBsZW5ndGgsIHJlc3VsdGluZyBpbiBhIHNpbmdsZSwgc21hbGxlciwgb25lLWxldmVsIHRhYmxlLgotCi0gICBUaGUgaW5mbGF0ZSBhbGdvcml0aG0gYWxzbyBwcm92aWRlcyBmb3Igc21hbGwgdmFsdWVzIG9mIHJvb3QgKHJlbGF0aXZlIHRvCi0gICB0aGUgbG9nMiBvZiB0aGUgbnVtYmVyIG9mIHN5bWJvbHMpLCB3aGVyZSB0aGUgc2hvcnRlc3QgY29kZSBoYXMgbW9yZSBiaXRzCi0gICB0aGFuIHJvb3QuICBJbiB0aGF0IGNhc2UsIHJvb3QgaXMgaW5jcmVhc2VkIHRvIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXN0Ci0gICBjb2RlLiAgVGhpcyBwcm9ncmFtLCBieSBkZXNpZ24sIGRvZXMgbm90IGhhbmRsZSB0aGF0IGNhc2UsIHNvIGl0IGlzIHZlcmlmaWVkCi0gICB0aGF0IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpcyBsZXNzIHRoYW4gMl4ocm9vdCArIDEpLgotCi0gICBJbiBvcmRlciB0byBzcGVlZCB1cCB0aGUgZXhhbWluYXRpb24gKGJ5IGFib3V0IHRlbiBvcmRlcnMgb2YgbWFnbml0dWRlIGZvcgotICAgdGhlIGRlZmF1bHQgYXJndW1lbnRzKSwgdGhlIGludGVybWVkaWF0ZSBzdGF0ZXMgaW4gdGhlIGJ1aWxkLXVwIG9mIGEgY29kZQotICAgYXJlIHJlbWVtYmVyZWQgYW5kIHByZXZpb3VzbHkgdmlzaXRlZCBicmFuY2hlcyBhcmUgcHJ1bmVkLiAgVGhlIG1lbW9yeQotICAgcmVxdWlyZWQgZm9yIHRoaXMgd2lsbCBpbmNyZWFzZSByYXBpZGx5IHdpdGggdGhlIHRvdGFsIG51bWJlciBvZiBzeW1ib2xzIGFuZAotICAgdGhlIG1heGltdW0gY29kZSBsZW5ndGggaW4gYml0cy4gIEhvd2V2ZXIgdGhpcyBpcyBhIHZlcnkgc21hbGwgcHJpY2UgdG8gcGF5Ci0gICBmb3IgdGhlIHZhc3Qgc3BlZWR1cC4KLQotICAgRmlyc3QsIGFsbCBvZiB0aGUgcG9zc2libGUgSHVmZm1hbiBjb2RlcyBhcmUgY291bnRlZCwgYW5kIHJlYWNoYWJsZQotICAgaW50ZXJtZWRpYXRlIHN0YXRlcyBhcmUgbm90ZWQgYnkgYSBub24temVybyBjb3VudCBpbiBhIHNhdmVkLXJlc3VsdHMgYXJyYXkuCi0gICBTZWNvbmQsIHRoZSBpbnRlcm1lZGlhdGUgc3RhdGVzIHRoYXQgbGVhZCB0byAocm9vdCArIDEpIGJpdCBvciBsb25nZXIgY29kZXMKLSAgIGFyZSB1c2VkIHRvIGxvb2sgYXQgYWxsIHN1Yi1jb2RlcyBmcm9tIHRob3NlIGp1bmN0dXJlcyBmb3IgdGhlaXIgaW5mbGF0ZQotICAgbWVtb3J5IHVzYWdlLiAgKFRoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSBudW1iZXIgb2YKLSAgIGNvZGVzIG9mIHJvb3QgYml0cyBvciBsZXNzIGluIGxlbmd0aC4pICBUaGlyZCwgdGhlIHZpc2l0ZWQgc3RhdGVzIGluIHRoZQotICAgY29uc3RydWN0aW9uIG9mIHRob3NlIHN1Yi1jb2RlcyBhbmQgdGhlIGFzc29jaWF0ZWQgY2FsY3VsYXRpb24gb2YgdGhlIHRhYmxlCi0gICBzaXplIGlzIHJlY2FsbGVkIGluIG9yZGVyIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgZnJvbSB0aGUgc2FtZSBqdW5jdHVyZS4KLSAgIEJlZ2lubmluZyB0aGUgY29kZSBleGFtaW5hdGlvbiBhdCAocm9vdCArIDEpIGJpdCBjb2Rlcywgd2hpY2ggaXMgZW5hYmxlZCBieQotICAgaWRlbnRpZnlpbmcgdGhlIHJlYWNoYWJsZSBub2RlcywgYWNjb3VudHMgZm9yIGFib3V0IHNpeCBvZiB0aGUgb3JkZXJzIG9mCi0gICBtYWduaXR1ZGUgb2YgaW1wcm92ZW1lbnQgZm9yIHRoZSBkZWZhdWx0IGFyZ3VtZW50cy4gIEFib3V0IGFub3RoZXIgZm91cgotICAgb3JkZXJzIG9mIG1hZ25pdHVkZSBjb21lIGZyb20gbm90IHJldmlzaXRpbmcgcHJldmlvdXMgc3RhdGVzLiAgT3V0IG9mCi0gICBhcHByb3hpbWF0ZWx5IDJ4MTBeMTYgcG9zc2libGUgSHVmZm1hbiBjb2Rlcywgb25seSBhYm91dCAyeDEwXjYgc3ViLWNvZGVzCi0gICBuZWVkIHRvIGJlIGV4YW1pbmVkIHRvIGNvdmVyIGFsbCBvZiB0aGUgcG9zc2libGUgdGFibGUgbWVtb3J5IHVzYWdlIGNhc2VzCi0gICBmb3IgdGhlIGRlZmF1bHQgYXJndW1lbnRzIG9mIDI4NiBzeW1ib2xzIGxpbWl0ZWQgdG8gMTUtYml0IGNvZGVzLgotCi0gICBOb3RlIHRoYXQgYW4gdW5zaWduZWQgbG9uZyBsb25nIHR5cGUgaXMgdXNlZCBmb3IgY291bnRpbmcuICBJdCBpcyBxdWl0ZSBlYXN5Ci0gICB0byBleGNlZWQgdGhlIGNhcGFjaXR5IG9mIGFuIGVpZ2h0LWJ5dGUgaW50ZWdlciB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mCi0gICBzeW1ib2xzIGFuZCBhIGxhcmdlIG1heGltdW0gY29kZSBsZW5ndGgsIHNvIG11bHRpcGxlLXByZWNpc2lvbiBhcml0aG1ldGljCi0gICB3b3VsZCBuZWVkIHRvIHJlcGxhY2UgdGhlIHVuc2lnbmVkIGxvbmcgbG9uZyBhcml0aG1ldGljIGluIHRoYXQgY2FzZS4gIFRoaXMKLSAgIHByb2dyYW0gd2lsbCBhYm9ydCBpZiBhbiBvdmVyZmxvdyBvY2N1cnMuICBUaGUgYmlnX3QgdHlwZSBpZGVudGlmaWVzIHdoZXJlCi0gICB0aGUgY291bnRpbmcgdGFrZXMgcGxhY2UuCi0KLSAgIEFuIHVuc2lnbmVkIGxvbmcgbG9uZyB0eXBlIGlzIGFsc28gdXNlZCBmb3IgY2FsY3VsYXRpbmcgdGhlIG51bWJlciBvZgotICAgcG9zc2libGUgY29kZXMgcmVtYWluaW5nIGF0IHRoZSBtYXhpbXVtIGxlbmd0aC4gIFRoaXMgbGltaXRzIHRoZSBtYXhpbXVtCi0gICBjb2RlIGxlbmd0aCB0byB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYSBsb25nIGxvbmcgbWludXMgdGhlIG51bWJlciBvZiBiaXRzCi0gICBuZWVkZWQgdG8gcmVwcmVzZW50IHRoZSBzeW1ib2xzIGluIGEgZmxhdCBjb2RlLiAgVGhlIGNvZGVfdCB0eXBlIGlkZW50aWZpZXMKLSAgIHdoZXJlIHRoZSBiaXQgcGF0dGVybiBjb3VudGluZyB0YWtlcyBwbGFjZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2RlZmluZSBsb2NhbCBzdGF0aWMKLQotLyogc3BlY2lhbCBkYXRhIHR5cGVzICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBiaWdfdDsgICAvKiB0eXBlIGZvciBjb2RlIGNvdW50aW5nICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBjb2RlX3Q7ICAvKiB0eXBlIGZvciBiaXQgcGF0dGVybiBjb3VudGluZyAqLwotc3RydWN0IHRhYiB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZSBmb3IgYmVlbiBoZXJlIGNoZWNrICovCi0gICAgc2l6ZV90IGxlbjsgICAgICAgICAvKiBsZW5ndGggb2YgYml0IHZlY3RvciBpbiBjaGFyJ3MgKi8KLSAgICBjaGFyICp2ZWM7ICAgICAgICAgIC8qIGFsbG9jYXRlZCBiaXQgdmVjdG9yICovCi19OwotCi0vKiBUaGUgYXJyYXkgZm9yIHNhdmluZyByZXN1bHRzLCBudW1bXSwgaXMgaW5kZXhlZCB3aXRoIHRoaXMgdHJpcGxldDoKLQotICAgICAgc3ltczogbnVtYmVyIG9mIHN5bWJvbHMgcmVtYWluaW5nIHRvIGNvZGUKLSAgICAgIGxlZnQ6IG51bWJlciBvZiBhdmFpbGFibGUgYml0IHBhdHRlcm5zIGF0IGxlbmd0aCBsZW4KLSAgICAgIGxlbjogbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGNvZGVzIGN1cnJlbnRseSBiZWluZyBhc3NpZ25lZAotCi0gICBUaG9zZSBpbmRpY2VzIGFyZSBjb25zdHJhaW5lZCB0aHVzbHkgd2hlbiBzYXZpbmcgcmVzdWx0czoKLQotICAgICAgc3ltczogMy4udG90c3ltICh0b3RzeW0gPT0gdG90YWwgc3ltYm9scyB0byBjb2RlKQotICAgICAgbGVmdDogMi4uc3ltcyAtIDEsIGJ1dCBvbmx5IHRoZSBldmVucyAoc28gc3ltcyA9PSA4IC0+IDIsIDQsIDYpCi0gICAgICBsZW46IDEuLm1heCAtIDEgKG1heCA9PSBtYXhpbXVtIGNvZGUgbGVuZ3RoIGluIGJpdHMpCi0KLSAgIHN5bXMgPT0gMiBpcyBub3Qgc2F2ZWQgc2luY2UgdGhhdCBpbW1lZGlhdGVseSBsZWFkcyB0byBhIHNpbmdsZSBjb2RlLiAgbGVmdAotICAgbXVzdCBiZSBldmVuLCBzaW5jZSBpdCByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGJpdCBwYXR0ZXJucyBhdAotICAgdGhlIGN1cnJlbnQgbGVuZ3RoLCB3aGljaCBpcyBkb3VibGUgdGhlIG51bWJlciBhdCB0aGUgcHJldmlvdXMgbGVuZ3RoLgotICAgbGVmdCBlbmRzIGF0IHN5bXMtMSBzaW5jZSBsZWZ0ID09IHN5bXMgaW1tZWRpYXRlbHkgcmVzdWx0cyBpbiBhIHNpbmdsZSBjb2RlLgotICAgKGxlZnQgPiBzeW0gaXMgbm90IGFsbG93ZWQgc2luY2UgdGhhdCB3b3VsZCByZXN1bHQgaW4gYW4gaW5jb21wbGV0ZSBjb2RlLikKLSAgIGxlbiBpcyBsZXNzIHRoYW4gbWF4LCBzaW5jZSB0aGUgY29kZSBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgd2hlbiBsZW4gPT0gbWF4LgotCi0gICBUaGUgb2Zmc2V0IGludG8gdGhlIGFycmF5IGlzIGNhbGN1bGF0ZWQgZm9yIHRoZSB0aHJlZSBpbmRpY2VzIHdpdGggdGhlCi0gICBmaXJzdCBvbmUgKHN5bXMpIGJlaW5nIG91dGVybW9zdCwgYW5kIHRoZSBsYXN0IG9uZSAobGVuKSBiZWluZyBpbm5lcm1vc3QuCi0gICBXZSBidWlsZCB0aGUgYXJyYXkgd2l0aCBsZW5ndGggbWF4LTEgbGlzdHMgZm9yIHRoZSBsZW4gaW5kZXgsIHdpdGggc3ltcy0zCi0gICBvZiB0aG9zZSBmb3IgZWFjaCBzeW1ib2wuICBUaGVyZSBhcmUgdG90c3ltLTIgb2YgdGhvc2UsIHdpdGggZWFjaCBvbmUKLSAgIHZhcnlpbmcgaW4gbGVuZ3RoIGFzIGEgZnVuY3Rpb24gb2Ygc3ltLiAgU2VlIHRoZSBjYWxjdWxhdGlvbiBvZiBpbmRleCBpbgotICAgY291bnQoKSBmb3IgdGhlIGluZGV4LCBhbmQgdGhlIGNhbGN1bGF0aW9uIG9mIHNpemUgaW4gbWFpbigpIGZvciB0aGUgc2l6ZQotICAgb2YgdGhlIGFycmF5LgotCi0gICBGb3IgdGhlIGRlZmxhdGUgZXhhbXBsZSBvZiAyODYgc3ltYm9scyBsaW1pdGVkIHRvIDE1LWJpdCBjb2RlcywgdGhlIGFycmF5Ci0gICBoYXMgMjg0LDI4NCBlbnRyaWVzLCB0YWtpbmcgdXAgMi4xNyBNQiBmb3IgYW4gOC1ieXRlIGJpZ190LiAgTW9yZSB0aGFuCi0gICBoYWxmIG9mIHRoZSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHNhdmVkIHJlc3VsdHMgaXMgYWN0dWFsbHkgdXNlZCAtLSBub3QgYWxsCi0gICBwb3NzaWJsZSB0cmlwbGV0cyBhcmUgcmVhY2hlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiB2YWxpZCBIdWZmbWFuIGNvZGVzLgotICovCi0KLS8qIFRoZSBhcnJheSBmb3IgdHJhY2tpbmcgdmlzaXRlZCBzdGF0ZXMsIGRvbmVbXSwgaXMgaXRzZWxmIGluZGV4ZWQgaWRlbnRpY2FsbHkKLSAgIHRvIHRoZSBudW1bXSBhcnJheSBhcyBkZXNjcmliZWQgYWJvdmUgZm9yIHRoZSAoc3ltcywgbGVmdCwgbGVuKSB0cmlwbGV0LgotICAgRWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyBmdXJ0aGVyIGluZGV4ZWQgYnkgdGhlIChtZW0sIHJlbSkgZG91YmxldCwKLSAgIHdoZXJlIG1lbSBpcyB0aGUgYW1vdW50IG9mIGluZmxhdGUgdGFibGUgc3BhY2UgdXNlZCBzbyBmYXIsIGFuZCByZW0gaXMgdGhlCi0gICByZW1haW5pbmcgdW51c2VkIGVudHJpZXMgaW4gdGhlIGN1cnJlbnQgaW5mbGF0ZSBzdWItdGFibGUuICBFYWNoIGluZGV4ZWQKLSAgIGVsZW1lbnQgaXMgc2ltcGx5IG9uZSBiaXQgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzdGF0ZSBoYXMgYmVlbiB2aXNpdGVkIG9yCi0gICBub3QuICBTaW5jZSB0aGUgcmFuZ2VzIGZvciBtZW0gYW5kIHJlbSBhcmUgbm90IGtub3duIGEgcHJpb3JpLCBlYWNoIGJpdAotICAgdmVjdG9yIGlzIG9mIGEgdmFyaWFibGUgc2l6ZSwgYW5kIGdyb3dzIGFzIG5lZWRlZCB0byBhY2NvbW1vZGF0ZSB0aGUgdmlzaXRlZAotICAgc3RhdGVzLiAgbWVtIGFuZCByZW0gYXJlIHVzZWQgdG8gY2FsY3VsYXRlIGEgc2luZ2xlIGluZGV4IGluIGEgdHJpYW5ndWxhcgotICAgYXJyYXkuICBTaW5jZSB0aGUgcmFuZ2Ugb2YgbWVtIGlzIGV4cGVjdGVkIGluIHRoZSBkZWZhdWx0IGNhc2UgdG8gYmUgYWJvdXQKLSAgIHRlbiB0aW1lcyBsYXJnZXIgdGhhbiB0aGUgcmFuZ2Ugb2YgcmVtLCB0aGUgYXJyYXkgaXMgc2tld2VkIHRvIHJlZHVjZSB0aGUKLSAgIG1lbW9yeSB1c2FnZSwgd2l0aCBlaWdodCB0aW1lcyB0aGUgcmFuZ2UgZm9yIG1lbSB0aGFuIGZvciByZW0uICBTZWUgdGhlCi0gICBjYWxjdWxhdGlvbnMgZm9yIG9mZnNldCBhbmQgYml0IGluIGJlZW5oZXJlKCkgZm9yIHRoZSBkZXRhaWxzLgotCi0gICBGb3IgdGhlIGRlZmxhdGUgZXhhbXBsZSBvZiAyODYgc3ltYm9scyBsaW1pdGVkIHRvIDE1LWJpdCBjb2RlcywgdGhlIGJpdAotICAgdmVjdG9ycyBncm93IHRvIHRvdGFsIGFwcHJveGltYXRlbHkgMjEgTUIsIGluIGFkZGl0aW9uIHRvIHRoZSA0LjMgTUIgZG9uZVtdCi0gICBhcnJheSBpdHNlbGYuCi0gKi8KLQotLyogR2xvYmFscyB0byBhdm9pZCBwcm9wYWdhdGluZyBjb25zdGFudHMgb3IgY29uc3RhbnQgcG9pbnRlcnMgcmVjdXJzaXZlbHkgKi8KLWxvY2FsIGludCBtYXg7ICAgICAgICAgIC8qIG1heGltdW0gYWxsb3dlZCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi8KLWxvY2FsIGludCByb290OyAgICAgICAgIC8qIHNpemUgb2YgYmFzZSBjb2RlIHRhYmxlIGluIGJpdHMgKi8KLWxvY2FsIGludCBsYXJnZTsgICAgICAgIC8qIGxhcmdlc3QgY29kZSB0YWJsZSBzbyBmYXIgKi8KLWxvY2FsIHNpemVfdCBzaXplOyAgICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBudW0gYW5kIGRvbmUgKi8KLWxvY2FsIGludCAqY29kZTsgICAgICAgIC8qIG51bWJlciBvZiBzeW1ib2xzIGFzc2lnbmVkIHRvIGVhY2ggYml0IGxlbmd0aCAqLwotbG9jYWwgYmlnX3QgKm51bTsgICAgICAgLyogc2F2ZWQgcmVzdWx0cyBhcnJheSBmb3IgY29kZSBjb3VudGluZyAqLwotbG9jYWwgc3RydWN0IHRhYiAqZG9uZTsgLyogc3RhdGVzIGFscmVhZHkgZXZhbHVhdGVkIGFycmF5ICovCi0KLS8qIEluZGV4IGZ1bmN0aW9uIGZvciBudW1bXSBhbmQgZG9uZVtdICovCi0jZGVmaW5lIElOREVYKGksaixrKSAoKChzaXplX3QpKChpLTEpPj4xKSooKGktMik+PjEpKyhqPj4xKS0xKSoobWF4LTEpK2stMSkKLQotLyogRnJlZSBhbGxvY2F0ZWQgc3BhY2UuICBVc2VzIGdsb2JhbHMgY29kZSwgbnVtLCBhbmQgZG9uZS4gKi8KLWxvY2FsIHZvaWQgY2xlYW51cCh2b2lkKQotewotICAgIHNpemVfdCBuOwotCi0gICAgaWYgKGRvbmUgIT0gTlVMTCkgewotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgc2l6ZTsgbisrKQotICAgICAgICAgICAgaWYgKGRvbmVbbl0ubGVuKQotICAgICAgICAgICAgICAgIGZyZWUoZG9uZVtuXS52ZWMpOwotICAgICAgICBmcmVlKGRvbmUpOwotICAgIH0KLSAgICBpZiAobnVtICE9IE5VTEwpCi0gICAgICAgIGZyZWUobnVtKTsKLSAgICBpZiAoY29kZSAhPSBOVUxMKQotICAgICAgICBmcmVlKGNvZGUpOwotfQotCi0vKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwb3NzaWJsZSBIdWZmbWFuIGNvZGVzIHVzaW5nIGJpdCBwYXR0ZXJucyBvZiBsZW5ndGhzCi0gICBsZW4gdGhyb3VnaCBtYXggaW5jbHVzaXZlLCBjb2Rpbmcgc3ltcyBzeW1ib2xzLCB3aXRoIGxlZnQgYml0IHBhdHRlcm5zIG9mCi0gICBsZW5ndGggbGVuIHVudXNlZCAtLSByZXR1cm4gLTEgaWYgdGhlcmUgaXMgYW4gb3ZlcmZsb3cgaW4gdGhlIGNvdW50aW5nLgotICAgS2VlcCBhIHJlY29yZCBvZiBwcmV2aW91cyByZXN1bHRzIGluIG51bSB0byBwcmV2ZW50IHJlcGVhdGluZyB0aGUgc2FtZQotICAgY2FsY3VsYXRpb24uICBVc2VzIHRoZSBnbG9iYWxzIG1heCBhbmQgbnVtLiAqLwotbG9jYWwgYmlnX3QgY291bnQoaW50IHN5bXMsIGludCBsZW4sIGludCBsZWZ0KQotewotICAgIGJpZ190IHN1bTsgICAgICAgICAgLyogbnVtYmVyIG9mIHBvc3NpYmxlIGNvZGVzIGZyb20gdGhpcyBqdW5jdHVyZSAqLwotICAgIGJpZ190IGdvdDsgICAgICAgICAgLyogdmFsdWUgcmV0dXJuZWQgZnJvbSBjb3VudCgpICovCi0gICAgaW50IGxlYXN0OyAgICAgICAgICAvKiBsZWFzdCBudW1iZXIgb2Ygc3ltcyB0byB1c2UgYXQgdGhpcyBqdW5jdHVyZSAqLwotICAgIGludCBtb3N0OyAgICAgICAgICAgLyogbW9zdCBudW1iZXIgb2Ygc3ltcyB0byB1c2UgYXQgdGhpcyBqdW5jdHVyZSAqLwotICAgIGludCB1c2U7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdCBwYXR0ZXJucyB0byB1c2UgaW4gbmV4dCBjYWxsICovCi0gICAgc2l6ZV90IGluZGV4OyAgICAgICAvKiBpbmRleCBvZiB0aGlzIGNhc2UgaW4gKm51bSAqLwotCi0gICAgLyogc2VlIGlmIG9ubHkgb25lIHBvc3NpYmxlIGNvZGUgKi8KLSAgICBpZiAoc3ltcyA9PSBsZWZ0KQotICAgICAgICByZXR1cm4gMTsKLQotICAgIC8qIG5vdGUgYW5kIHZlcmlmeSB0aGUgZXhwZWN0ZWQgc3RhdGUgKi8KLSAgICBhc3NlcnQoc3ltcyA+IGxlZnQgJiYgbGVmdCA+IDAgJiYgbGVuIDwgbWF4KTsKLQotICAgIC8qIHNlZSBpZiB3ZSd2ZSBkb25lIHRoaXMgb25lIGFscmVhZHkgKi8KLSAgICBpbmRleCA9IElOREVYKHN5bXMsIGxlZnQsIGxlbik7Ci0gICAgZ290ID0gbnVtW2luZGV4XTsKLSAgICBpZiAoZ290KQotICAgICAgICByZXR1cm4gZ290OyAgICAgICAgIC8qIHdlIGhhdmUgLS0gcmV0dXJuIHRoZSBzYXZlZCByZXN1bHQgKi8KLQotICAgIC8qIHdlIG5lZWQgdG8gdXNlIGF0IGxlYXN0IHRoaXMgbWFueSBiaXQgcGF0dGVybnMgc28gdGhhdCB0aGUgY29kZSB3b24ndCBiZQotICAgICAgIGluY29tcGxldGUgYXQgdGhlIG5leHQgbGVuZ3RoIChtb3JlIGJpdCBwYXR0ZXJucyB0aGFuIHN5bWJvbHMpICovCi0gICAgbGVhc3QgPSAobGVmdCA8PCAxKSAtIHN5bXM7Ci0gICAgaWYgKGxlYXN0IDwgMCkKLSAgICAgICAgbGVhc3QgPSAwOwotCi0gICAgLyogd2UgY2FuIHVzZSBhdCBtb3N0IHRoaXMgbWFueSBiaXQgcGF0dGVybnMsIGxlc3QgdGhlcmUgbm90IGJlIGVub3VnaAotICAgICAgIGF2YWlsYWJsZSBmb3IgdGhlIHJlbWFpbmluZyBzeW1ib2xzIGF0IHRoZSBtYXhpbXVtIGxlbmd0aCAoaWYgdGhlcmUgd2VyZQotICAgICAgIG5vIGxpbWl0IHRvIHRoZSBjb2RlIGxlbmd0aCwgdGhpcyB3b3VsZCBiZWNvbWU6IG1vc3QgPSBsZWZ0IC0gMSkgKi8KLSAgICBtb3N0ID0gKCgoY29kZV90KWxlZnQgPDwgKG1heCAtIGxlbikpIC0gc3ltcykgLwotICAgICAgICAgICAgKCgoY29kZV90KTEgPDwgKG1heCAtIGxlbikpIC0gMSk7Ci0KLSAgICAvKiBjb3VudCBhbGwgcG9zc2libGUgY29kZXMgZnJvbSB0aGlzIGp1bmN0dXJlIGFuZCBhZGQgdGhlbSB1cCAqLwotICAgIHN1bSA9IDA7Ci0gICAgZm9yICh1c2UgPSBsZWFzdDsgdXNlIDw9IG1vc3Q7IHVzZSsrKSB7Ci0gICAgICAgIGdvdCA9IGNvdW50KHN5bXMgLSB1c2UsIGxlbiArIDEsIChsZWZ0IC0gdXNlKSA8PCAxKTsKLSAgICAgICAgc3VtICs9IGdvdDsKLSAgICAgICAgaWYgKGdvdCA9PSAtMSB8fCBzdW0gPCBnb3QpICAgICAgICAgLyogb3ZlcmZsb3cgKi8KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiB2ZXJpZnkgdGhhdCBhbGwgcmVjdXJzaXZlIGNhbGxzIGFyZSBwcm9kdWN0aXZlICovCi0gICAgYXNzZXJ0KHN1bSAhPSAwKTsKLQotICAgIC8qIHNhdmUgdGhlIHJlc3VsdCBhbmQgcmV0dXJuIGl0ICovCi0gICAgbnVtW2luZGV4XSA9IHN1bTsKLSAgICByZXR1cm4gc3VtOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB3ZSd2ZSBiZWVuIGhlcmUgYmVmb3JlLCBzZXQgdG8gdHJ1ZSBpZiBub3QuICBTZXQgYSBiaXQgaW4gYQotICAgYml0IHZlY3RvciB0byBpbmRpY2F0ZSB2aXNpdGluZyB0aGlzIHN0YXRlLiAgRWFjaCAoc3ltcyxsZW4sbGVmdCkgc3RhdGUKLSAgIGhhcyBhIHZhcmlhYmxlIHNpemUgYml0IHZlY3RvciBpbmRleGVkIGJ5IChtZW0scmVtKS4gIFRoZSBiaXQgdmVjdG9yIGlzCi0gICBsZW5ndGhlbmVkIGlmIG5lZWRlZCB0byBhbGxvdyBzZXR0aW5nIHRoZSAobWVtLHJlbSkgYml0LiAqLwotbG9jYWwgaW50IGJlZW5oZXJlKGludCBzeW1zLCBpbnQgbGVuLCBpbnQgbGVmdCwgaW50IG1lbSwgaW50IHJlbSkKLXsKLSAgICBzaXplX3QgaW5kZXg7ICAgICAgIC8qIGluZGV4IGZvciB0aGlzIHN0YXRlJ3MgYml0IHZlY3RvciAqLwotICAgIHNpemVfdCBvZmZzZXQ7ICAgICAgLyogb2Zmc2V0IGluIHRoaXMgc3RhdGUncyBiaXQgdmVjdG9yICovCi0gICAgaW50IGJpdDsgICAgICAgICAgICAvKiBtYXNrIGZvciB0aGlzIHN0YXRlJ3MgYml0ICovCi0gICAgc2l6ZV90IGxlbmd0aDsgICAgICAvKiBsZW5ndGggb2YgdGhlIGJpdCB2ZWN0b3IgaW4gYnl0ZXMgKi8KLSAgICBjaGFyICp2ZWN0b3I7ICAgICAgIC8qIG5ldyBvciBlbmxhcmdlZCBiaXQgdmVjdG9yICovCi0KLSAgICAvKiBwb2ludCB0byB2ZWN0b3IgZm9yIChzeW1zLGxlZnQsbGVuKSwgYml0IGluIHZlY3RvciBmb3IgKG1lbSxyZW0pICovCi0gICAgaW5kZXggPSBJTkRFWChzeW1zLCBsZWZ0LCBsZW4pOwotICAgIG1lbSAtPSAxIDw8IHJvb3Q7Ci0gICAgb2Zmc2V0ID0gKG1lbSA+PiAzKSArIHJlbTsKLSAgICBvZmZzZXQgPSAoKG9mZnNldCAqIChvZmZzZXQgKyAxKSkgPj4gMSkgKyByZW07Ci0gICAgYml0ID0gMSA8PCAobWVtICYgNyk7Ci0KLSAgICAvKiBzZWUgaWYgd2UndmUgYmVlbiBoZXJlICovCi0gICAgbGVuZ3RoID0gZG9uZVtpbmRleF0ubGVuOwotICAgIGlmIChvZmZzZXQgPCBsZW5ndGggJiYgKGRvbmVbaW5kZXhdLnZlY1tvZmZzZXRdICYgYml0KSAhPSAwKQotICAgICAgICByZXR1cm4gMTsgICAgICAgLyogZG9uZSB0aGlzISAqLwotCi0gICAgLyogd2UgaGF2ZW4ndCBiZWVuIGhlcmUgYmVmb3JlIC0tIHNldCB0aGUgYml0IHRvIHNob3cgd2UgaGF2ZSBub3cgKi8KLQotICAgIC8qIHNlZSBpZiB3ZSBuZWVkIHRvIGxlbmd0aGVuIHRoZSB2ZWN0b3IgaW4gb3JkZXIgdG8gc2V0IHRoZSBiaXQgKi8KLSAgICBpZiAobGVuZ3RoIDw9IG9mZnNldCkgewotICAgICAgICAvKiBpZiB3ZSBoYXZlIG9uZSBhbHJlYWR5LCBlbmxhcmdlIGl0LCB6ZXJvIG91dCB0aGUgYXBwZW5kZWQgc3BhY2UgKi8KLSAgICAgICAgaWYgKGxlbmd0aCkgewotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGxlbmd0aCA8PD0gMTsKLSAgICAgICAgICAgIH0gd2hpbGUgKGxlbmd0aCA8PSBvZmZzZXQpOwotICAgICAgICAgICAgdmVjdG9yID0gcmVhbGxvYyhkb25lW2luZGV4XS52ZWMsIGxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAodmVjdG9yICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgbWVtc2V0KHZlY3RvciArIGRvbmVbaW5kZXhdLmxlbiwgMCwgbGVuZ3RoIC0gZG9uZVtpbmRleF0ubGVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG90aGVyd2lzZSB3ZSBuZWVkIHRvIG1ha2UgYSBuZXcgdmVjdG9yIGFuZCB6ZXJvIGl0IG91dCAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGxlbmd0aCA9IDEgPDwgKGxlbiAtIHJvb3QpOwotICAgICAgICAgICAgd2hpbGUgKGxlbmd0aCA8PSBvZmZzZXQpCi0gICAgICAgICAgICAgICAgbGVuZ3RoIDw8PSAxOwotICAgICAgICAgICAgdmVjdG9yID0gY2FsbG9jKGxlbmd0aCwgc2l6ZW9mKGNoYXIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGluIGVpdGhlciBjYXNlLCBiYWlsIGlmIHdlIGNhbid0IGdldCB0aGUgbWVtb3J5ICovCi0gICAgICAgIGlmICh2ZWN0b3IgPT0gTlVMTCkgewotICAgICAgICAgICAgZnB1dHMoImFib3J0OiB1bmFibGUgdG8gYWxsb2NhdGUgZW5vdWdoIG1lbW9yeVxuIiwgc3RkZXJyKTsKLSAgICAgICAgICAgIGNsZWFudXAoKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBpbnN0YWxsIHRoZSBuZXcgdmVjdG9yICovCi0gICAgICAgIGRvbmVbaW5kZXhdLmxlbiA9IGxlbmd0aDsKLSAgICAgICAgZG9uZVtpbmRleF0udmVjID0gdmVjdG9yOwotICAgIH0KLQotICAgIC8qIHNldCB0aGUgYml0ICovCi0gICAgZG9uZVtpbmRleF0udmVjW29mZnNldF0gfD0gYml0OwotICAgIHJldHVybiAwOwotfQotCi0vKiBFeGFtaW5lIGFsbCBwb3NzaWJsZSBjb2RlcyBmcm9tIHRoZSBnaXZlbiBub2RlIChzeW1zLCBsZW4sIGxlZnQpLiAgQ29tcHV0ZQotICAgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gYnVpbGQgaW5mbGF0ZSdzIGRlY29kaW5nIHRhYmxlcywgd2hlcmUgdGhlCi0gICBudW1iZXIgb2YgY29kZSBzdHJ1Y3R1cmVzIHVzZWQgc28gZmFyIGlzIG1lbSwgYW5kIHRoZSBudW1iZXIgcmVtYWluaW5nIGluCi0gICB0aGUgY3VycmVudCBzdWItdGFibGUgaXMgcmVtLiAgVXNlcyB0aGUgZ2xvYmFscyBtYXgsIGNvZGUsIHJvb3QsIGxhcmdlLCBhbmQKLSAgIGRvbmUuICovCi1sb2NhbCB2b2lkIGV4YW1pbmUoaW50IHN5bXMsIGludCBsZW4sIGludCBsZWZ0LCBpbnQgbWVtLCBpbnQgcmVtKQotewotICAgIGludCBsZWFzdDsgICAgICAgICAgLyogbGVhc3QgbnVtYmVyIG9mIHN5bXMgdG8gdXNlIGF0IHRoaXMganVuY3R1cmUgKi8KLSAgICBpbnQgbW9zdDsgICAgICAgICAgIC8qIG1vc3QgbnVtYmVyIG9mIHN5bXMgdG8gdXNlIGF0IHRoaXMganVuY3R1cmUgKi8KLSAgICBpbnQgdXNlOyAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXQgcGF0dGVybnMgdG8gdXNlIGluIG5leHQgY2FsbCAqLwotCi0gICAgLyogc2VlIGlmIHdlIGhhdmUgYSBjb21wbGV0ZSBjb2RlICovCi0gICAgaWYgKHN5bXMgPT0gbGVmdCkgewotICAgICAgICAvKiBzZXQgdGhlIGxhc3QgY29kZSBlbnRyeSAqLwotICAgICAgICBjb2RlW2xlbl0gPSBsZWZ0OwotCi0gICAgICAgIC8qIGNvbXBsZXRlIGNvbXB1dGF0aW9uIG9mIG1lbW9yeSB1c2VkIGJ5IHRoaXMgY29kZSAqLwotICAgICAgICB3aGlsZSAocmVtIDwgbGVmdCkgewotICAgICAgICAgICAgbGVmdCAtPSByZW07Ci0gICAgICAgICAgICByZW0gPSAxIDw8IChsZW4gLSByb290KTsKLSAgICAgICAgICAgIG1lbSArPSByZW07Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0KHJlbSA9PSBsZWZ0KTsKLQotICAgICAgICAvKiBpZiB0aGlzIGlzIGEgbmV3IG1heGltdW0sIHNob3cgdGhlIGVudHJpZXMgdXNlZCBhbmQgdGhlIHN1Yi1jb2RlICovCi0gICAgICAgIGlmIChtZW0gPiBsYXJnZSkgewotICAgICAgICAgICAgbGFyZ2UgPSBtZW07Ci0gICAgICAgICAgICBwcmludGYoIm1heCAlZDogIiwgbWVtKTsKLSAgICAgICAgICAgIGZvciAodXNlID0gcm9vdCArIDE7IHVzZSA8PSBtYXg7IHVzZSsrKQotICAgICAgICAgICAgICAgIGlmIChjb2RlW3VzZV0pCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiJWRbJWRdICIsIGNvZGVbdXNlXSwgdXNlKTsKLSAgICAgICAgICAgIHB1dGNoYXIoJ1xuJyk7Ci0gICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHJlbW92ZSBlbnRyaWVzIGFzIHdlIGRyb3AgYmFjayBkb3duIGluIHRoZSByZWN1cnNpb24gKi8KLSAgICAgICAgY29kZVtsZW5dID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIHBydW5lIHRoZSB0cmVlIGlmIHdlIGNhbiAqLwotICAgIGlmIChiZWVuaGVyZShzeW1zLCBsZW4sIGxlZnQsIG1lbSwgcmVtKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLyogd2UgbmVlZCB0byB1c2UgYXQgbGVhc3QgdGhpcyBtYW55IGJpdCBwYXR0ZXJucyBzbyB0aGF0IHRoZSBjb2RlIHdvbid0IGJlCi0gICAgICAgaW5jb21wbGV0ZSBhdCB0aGUgbmV4dCBsZW5ndGggKG1vcmUgYml0IHBhdHRlcm5zIHRoYW4gc3ltYm9scykgKi8KLSAgICBsZWFzdCA9IChsZWZ0IDw8IDEpIC0gc3ltczsKLSAgICBpZiAobGVhc3QgPCAwKQotICAgICAgICBsZWFzdCA9IDA7Ci0KLSAgICAvKiB3ZSBjYW4gdXNlIGF0IG1vc3QgdGhpcyBtYW55IGJpdCBwYXR0ZXJucywgbGVzdCB0aGVyZSBub3QgYmUgZW5vdWdoCi0gICAgICAgYXZhaWxhYmxlIGZvciB0aGUgcmVtYWluaW5nIHN5bWJvbHMgYXQgdGhlIG1heGltdW0gbGVuZ3RoIChpZiB0aGVyZSB3ZXJlCi0gICAgICAgbm8gbGltaXQgdG8gdGhlIGNvZGUgbGVuZ3RoLCB0aGlzIHdvdWxkIGJlY29tZTogbW9zdCA9IGxlZnQgLSAxKSAqLwotICAgIG1vc3QgPSAoKChjb2RlX3QpbGVmdCA8PCAobWF4IC0gbGVuKSkgLSBzeW1zKSAvCi0gICAgICAgICAgICAoKChjb2RlX3QpMSA8PCAobWF4IC0gbGVuKSkgLSAxKTsKLQotICAgIC8qIG9jY3VweSBsZWFzdCB0YWJsZSBzcGFjZXMsIGNyZWF0aW5nIG5ldyBzdWItdGFibGVzIGFzIG5lZWRlZCAqLwotICAgIHVzZSA9IGxlYXN0OwotICAgIHdoaWxlIChyZW0gPCB1c2UpIHsKLSAgICAgICAgdXNlIC09IHJlbTsKLSAgICAgICAgcmVtID0gMSA8PCAobGVuIC0gcm9vdCk7Ci0gICAgICAgIG1lbSArPSByZW07Ci0gICAgfQotICAgIHJlbSAtPSB1c2U7Ci0KLSAgICAvKiBleGFtaW5lIGNvZGVzIGZyb20gaGVyZSwgdXBkYXRpbmcgdGFibGUgc3BhY2UgYXMgd2UgZ28gKi8KLSAgICBmb3IgKHVzZSA9IGxlYXN0OyB1c2UgPD0gbW9zdDsgdXNlKyspIHsKLSAgICAgICAgY29kZVtsZW5dID0gdXNlOwotICAgICAgICBleGFtaW5lKHN5bXMgLSB1c2UsIGxlbiArIDEsIChsZWZ0IC0gdXNlKSA8PCAxLAotICAgICAgICAgICAgICAgIG1lbSArIChyZW0gPyAxIDw8IChsZW4gLSByb290KSA6IDApLCByZW0gPDwgMSk7Ci0gICAgICAgIGlmIChyZW0gPT0gMCkgewotICAgICAgICAgICAgcmVtID0gMSA8PCAobGVuIC0gcm9vdCk7Ci0gICAgICAgICAgICBtZW0gKz0gcmVtOwotICAgICAgICB9Ci0gICAgICAgIHJlbS0tOwotICAgIH0KLQotICAgIC8qIHJlbW92ZSBlbnRyaWVzIGFzIHdlIGRyb3AgYmFjayBkb3duIGluIHRoZSByZWN1cnNpb24gKi8KLSAgICBjb2RlW2xlbl0gPSAwOwotfQotCi0vKiBMb29rIGF0IGFsbCBzdWItY29kZXMgc3RhcnRpbmcgd2l0aCByb290ICsgMSBiaXRzLiAgTG9vayBhdCBvbmx5IHRoZSB2YWxpZAotICAgaW50ZXJtZWRpYXRlIGNvZGUgc3RhdGVzIChzeW1zLCBsZWZ0LCBsZW4pLiAgRm9yIGVhY2ggY29tcGxldGVkIGNvZGUsCi0gICBjYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgYnkgaW5mbGF0ZSB0byBidWlsZCB0aGUgZGVjb2RpbmcKLSAgIHRhYmxlcy4gRmluZCB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIGFuZCBzaG93IHRoZSBjb2RlIHRoYXQKLSAgIHJlcXVpcmVzIHRoYXQgbWF4aW11bS4gIFVzZXMgdGhlIGdsb2JhbHMgbWF4LCByb290LCBhbmQgbnVtLiAqLwotbG9jYWwgdm9pZCBlbm91Z2goaW50IHN5bXMpCi17Ci0gICAgaW50IG47ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcmVtYWluZyBzeW1ib2xzIGZvciB0aGlzIG5vZGUgKi8KLSAgICBpbnQgbGVmdDsgICAgICAgICAgIC8qIG51bWJlciBvZiB1bnVzZWQgYml0IHBhdHRlcm5zIGF0IHRoaXMgbGVuZ3RoICovCi0gICAgc2l6ZV90IGluZGV4OyAgICAgICAvKiBpbmRleCBvZiB0aGlzIGNhc2UgaW4gKm51bSAqLwotCi0gICAgLyogY2xlYXIgY29kZSAqLwotICAgIGZvciAobiA9IDA7IG4gPD0gbWF4OyBuKyspCi0gICAgICAgIGNvZGVbbl0gPSAwOwotCi0gICAgLyogbG9vayBhdCBhbGwgKHJvb3QgKyAxKSBiaXQgYW5kIGxvbmdlciBjb2RlcyAqLwotICAgIGxhcmdlID0gMSA8PCByb290OyAgICAgICAgICAgICAgLyogYmFzZSB0YWJsZSAqLwotICAgIGlmIChyb290IDwgbWF4KSAgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlLCB0aGVyZSdzIG9ubHkgYSBiYXNlIHRhYmxlICovCi0gICAgICAgIGZvciAobiA9IDM7IG4gPD0gc3ltczsgbisrKQotICAgICAgICAgICAgZm9yIChsZWZ0ID0gMjsgbGVmdCA8IG47IGxlZnQgKz0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBsb29rIGF0IGFsbCByZWFjaGFibGUgKHJvb3QgKyAxKSBiaXQgbm9kZXMsIGFuZCB0aGUKLSAgICAgICAgICAgICAgICAgICByZXN1bHRpbmcgY29kZXMgKGNvbXBsZXRlIGF0IHJvb3QgKyAyIG9yIG1vcmUpICovCi0gICAgICAgICAgICAgICAgaW5kZXggPSBJTkRFWChuLCBsZWZ0LCByb290ICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvb3QgKyAxIDwgbWF4ICYmIG51bVtpbmRleF0pICAgICAgIC8qIHJlYWNoYWJsZSBub2RlICovCi0gICAgICAgICAgICAgICAgICAgIGV4YW1pbmUobiwgcm9vdCArIDEsIGxlZnQsIDEgPDwgcm9vdCwgMCk7Ci0KLSAgICAgICAgICAgICAgICAvKiBhbHNvIGxvb2sgYXQgcm9vdCBiaXQgY29kZXMgd2l0aCBjb21wbGV0aW9ucyBhdCByb290ICsgMQotICAgICAgICAgICAgICAgICAgIGJpdHMgKG5vdCBzYXZlZCBpbiBudW0sIHNpbmNlIGNvbXBsZXRlKSwganVzdCBpbiBjYXNlICovCi0gICAgICAgICAgICAgICAgaWYgKG51bVtpbmRleCAtIDFdICYmIG4gPD0gbGVmdCA8PCAxKQotICAgICAgICAgICAgICAgICAgICBleGFtaW5lKChuIC0gbGVmdCkgPDwgMSwgcm9vdCArIDEsIChuIC0gbGVmdCkgPDwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIDw8IHJvb3QsIDApOwotICAgICAgICAgICAgfQotCi0gICAgLyogZG9uZSAqLwotICAgIHByaW50ZigiZG9uZTogbWF4aW11bSBvZiAlZCB0YWJsZSBlbnRyaWVzXG4iLCBsYXJnZSk7Ci19Ci0KLS8qCi0gICBFeGFtaW5lIGFuZCBzaG93IHRoZSB0b3RhbCBudW1iZXIgb2YgcG9zc2libGUgSHVmZm1hbiBjb2RlcyBmb3IgYSBnaXZlbgotICAgbWF4aW11bSBudW1iZXIgb2Ygc3ltYm9scywgaW5pdGlhbCByb290IHRhYmxlIHNpemUsIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RoCi0gICBpbiBiaXRzIC0tIHRob3NlIGFyZSB0aGUgY29tbWFuZCBhcmd1bWVudHMgaW4gdGhhdCBvcmRlci4gIFRoZSBkZWZhdWx0Ci0gICB2YWx1ZXMgYXJlIDI4NiwgOSwgYW5kIDE1IHJlc3BlY3RpdmVseSwgZm9yIHRoZSBkZWZsYXRlIGxpdGVyYWwvbGVuZ3RoIGNvZGUuCi0gICBUaGUgcG9zc2libGUgY29kZXMgYXJlIGNvdW50ZWQgZm9yIGVhY2ggbnVtYmVyIG9mIGNvZGVkIHN5bWJvbHMgZnJvbSB0d28gdG8KLSAgIHRoZSBtYXhpbXVtLiAgVGhlIGNvdW50cyBmb3IgZWFjaCBvZiB0aG9zZSBhbmQgdGhlIHRvdGFsIG51bWJlciBvZiBjb2RlcyBhcmUKLSAgIHNob3duLiAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGluZmxhdGUgdGFibGUgZW50aXJlcyBpcyB0aGVuIGNhbGN1bGF0ZWQKLSAgIGFjcm9zcyBhbGwgcG9zc2libGUgY29kZXMuICBFYWNoIG5ldyBtYXhpbXVtIG51bWJlciBvZiB0YWJsZSBlbnRyaWVzIGFuZCB0aGUKLSAgIGFzc29jaWF0ZWQgc3ViLWNvZGUgKHN0YXJ0aW5nIGF0IHJvb3QgKyAxID09IDEwIGJpdHMpIGlzIHNob3duLgotCi0gICBUbyBjb3VudCBhbmQgZXhhbWluZSBIdWZmbWFuIGNvZGVzIHRoYXQgYXJlIG5vdCBsZW5ndGgtbGltaXRlZCwgcHJvdmlkZSBhCi0gICBtYXhpbXVtIGxlbmd0aCBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgbWludXMgb25lLgotCi0gICBGb3IgdGhlIGRlZmxhdGUgbGl0ZXJhbC9sZW5ndGggY29kZSwgdXNlICJlbm91Z2giLiAgRm9yIHRoZSBkZWZsYXRlIGRpc3RhbmNlCi0gICBjb2RlLCB1c2UgImVub3VnaCAzMCA2Ii4KLQotICAgVGhpcyB1c2VzIHRoZSAlbGx1IHByaW50ZiBmb3JtYXQgdG8gcHJpbnQgYmlnX3QgbnVtYmVycywgd2hpY2ggYXNzdW1lcyB0aGF0Ci0gICBiaWdfdCBpcyBhbiB1bnNpZ25lZCBsb25nIGxvbmcuICBJZiB0aGUgYmlnX3QgdHlwZSBpcyBjaGFuZ2VkIChmb3IgZXhhbXBsZQotICAgdG8gYSBtdWx0aXBsZSBwcmVjaXNpb24gdHlwZSksIHRoZSBtZXRob2Qgb2YgcHJpbnRpbmcgd2lsbCBhbHNvIG5lZWQgdG8gYmUKLSAgIHVwZGF0ZWQuCi0gKi8KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgc3ltczsgICAgICAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBzeW1ib2xzIHRvIGNvZGUgKi8KLSAgICBpbnQgbjsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzeW1ib2xzIHRvIGNvZGUgZm9yIHRoaXMgcnVuICovCi0gICAgYmlnX3QgZ290OyAgICAgICAgICAvKiByZXR1cm4gdmFsdWUgb2YgY291bnQoKSAqLwotICAgIGJpZ190IHN1bTsgICAgICAgICAgLyogYWNjdW11bGF0ZWQgbnVtYmVyIG9mIGNvZGVzIG92ZXIgbiAqLwotCi0gICAgLyogc2V0IHVwIGdsb2JhbHMgZm9yIGNsZWFudXAoKSAqLwotICAgIGNvZGUgPSBOVUxMOwotICAgIG51bSA9IE5VTEw7Ci0gICAgZG9uZSA9IE5VTEw7Ci0KLSAgICAvKiBnZXQgYXJndW1lbnRzIC0tIGRlZmF1bHQgdG8gdGhlIGRlZmxhdGUgbGl0ZXJhbC9sZW5ndGggY29kZSAqLwotICAgIHN5bXMgPSAyODY7Ci0gICAgICAgIHJvb3QgPSA5OwotICAgIG1heCA9IDE1OwotICAgIGlmIChhcmdjID4gMSkgewotICAgICAgICBzeW1zID0gYXRvaShhcmd2WzFdKTsKLSAgICAgICAgaWYgKGFyZ2MgPiAyKSB7Ci0gICAgICAgICAgICByb290ID0gYXRvaShhcmd2WzJdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdjID4gMykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gYXRvaShhcmd2WzNdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgfQotICAgIGlmIChhcmdjID4gNCB8fCBzeW1zIDwgMiB8fCByb290IDwgMSB8fCBtYXggPCAxKSB7Ci0gICAgICAgIGZwdXRzKCJpbnZhbGlkIGFyZ3VtZW50cywgbmVlZDogW3N5bSA+PSAyIFtyb290ID49IDEgW21heCA+PSAxXV1dXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBpZiBub3QgcmVzdHJpY3RpbmcgdGhlIGNvZGUgbGVuZ3RoLCB0aGUgbG9uZ2VzdCBpcyBzeW1zIC0gMSAqLwotICAgIGlmIChtYXggPiBzeW1zIC0gMSkKLSAgICAgICAgbWF4ID0gc3ltcyAtIDE7Ci0KLSAgICAvKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBiaXRzIGluIGEgY29kZV90ICovCi0gICAgbiA9IDA7Ci0gICAgd2hpbGUgKCgoY29kZV90KTEgPDwgbikgIT0gMCkKLSAgICAgICAgbisrOwotCi0gICAgLyogbWFrZSBzdXJlIHRoYXQgdGhlIGNhbGN1bGF0aW9uIG9mIG1vc3Qgd2lsbCBub3Qgb3ZlcmZsb3cgKi8KLSAgICBpZiAobWF4ID4gbiB8fCBzeW1zIC0gMiA+PSAoKChjb2RlX3QpMCAtIDEpID4+IChtYXggLSAxKSkpIHsKLSAgICAgICAgZnB1dHMoImFib3J0OiBjb2RlIGxlbmd0aCB0b28gbG9uZyBmb3IgaW50ZXJuYWwgdHlwZXNcbiIsIHN0ZGVycik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIC8qIHJlamVjdCBpbXBvc3NpYmxlIGNvZGUgcmVxdWVzdHMgKi8KLSAgICBpZiAoc3ltcyAtIDEgPiAoKGNvZGVfdCkxIDw8IG1heCkgLSAxKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWQgc3ltYm9scyBjYW5ub3QgYmUgY29kZWQgaW4gJWQgYml0c1xuIiwKLSAgICAgICAgICAgICAgICBzeW1zLCBtYXgpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBhbGxvY2F0ZSBjb2RlIHZlY3RvciAqLwotICAgIGNvZGUgPSBjYWxsb2MobWF4ICsgMSwgc2l6ZW9mKGludCkpOwotICAgIGlmIChjb2RlID09IE5VTEwpIHsKLSAgICAgICAgZnB1dHMoImFib3J0OiB1bmFibGUgdG8gYWxsb2NhdGUgZW5vdWdoIG1lbW9yeVxuIiwgc3RkZXJyKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyogZGV0ZXJtaW5lIHNpemUgb2Ygc2F2ZWQgcmVzdWx0cyBhcnJheSwgY2hlY2tpbmcgZm9yIG92ZXJmbG93cywKLSAgICAgICBhbGxvY2F0ZSBhbmQgY2xlYXIgdGhlIGFycmF5IChzZXQgYWxsIHRvIHplcm8gd2l0aCBjYWxsb2MoKSkgKi8KLSAgICBpZiAoc3ltcyA9PSAyKSAgICAgICAgICAgICAgLyogaWZmIG1heCA9PSAxICovCi0gICAgICAgIG51bSA9IE5VTEw7ICAgICAgICAgICAgIC8qIHdvbid0IGJlIHNhdmluZyBhbnkgcmVzdWx0cyAqLwotICAgIGVsc2UgewotICAgICAgICBzaXplID0gc3ltcyA+PiAxOwotICAgICAgICBpZiAoc2l6ZSA+ICgoc2l6ZV90KTAgLSAxKSAvIChuID0gKHN5bXMgLSAxKSA+PiAxKSB8fAotICAgICAgICAgICAgICAgIChzaXplICo9IG4sIHNpemUgPiAoKHNpemVfdCkwIC0gMSkgLyAobiA9IG1heCAtIDEpKSB8fAotICAgICAgICAgICAgICAgIChzaXplICo9IG4sIHNpemUgPiAoKHNpemVfdCkwIC0gMSkgLyBzaXplb2YoYmlnX3QpKSB8fAotICAgICAgICAgICAgICAgIChudW0gPSBjYWxsb2Moc2l6ZSwgc2l6ZW9mKGJpZ190KSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIGZwdXRzKCJhYm9ydDogdW5hYmxlIHRvIGFsbG9jYXRlIGVub3VnaCBtZW1vcnlcbiIsIHN0ZGVycik7Ci0gICAgICAgICAgICBjbGVhbnVwKCk7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGNvdW50IHBvc3NpYmxlIGNvZGVzIGZvciBhbGwgbnVtYmVycyBvZiBzeW1ib2xzLCBhZGQgdXAgY291bnRzICovCi0gICAgc3VtID0gMDsKLSAgICBmb3IgKG4gPSAyOyBuIDw9IHN5bXM7IG4rKykgewotICAgICAgICBnb3QgPSBjb3VudChuLCAxLCAyKTsKLSAgICAgICAgc3VtICs9IGdvdDsKLSAgICAgICAgaWYgKGdvdCA9PSAtMSB8fCBzdW0gPCBnb3QpIHsgICAgICAgLyogb3ZlcmZsb3cgKi8KLSAgICAgICAgICAgIGZwdXRzKCJhYm9ydDogY2FuJ3QgY291bnQgdGhhdCBoaWdoIVxuIiwgc3RkZXJyKTsKLSAgICAgICAgICAgIGNsZWFudXAoKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIHByaW50ZigiJWxsdSAlZC1jb2Rlc1xuIiwgZ290LCBuKTsKLSAgICB9Ci0gICAgcHJpbnRmKCIlbGx1IHRvdGFsIGNvZGVzIGZvciAyIHRvICVkIHN5bWJvbHMiLCBzdW0sIHN5bXMpOwotICAgIGlmIChtYXggPCBzeW1zIC0gMSkKLSAgICAgICAgcHJpbnRmKCIgKCVkLWJpdCBsZW5ndGggbGltaXQpXG4iLCBtYXgpOwotICAgIGVsc2UKLSAgICAgICAgcHV0cygiIChubyBsZW5ndGggbGltaXQpIik7Ci0KLSAgICAvKiBhbGxvY2F0ZSBhbmQgY2xlYXIgZG9uZSBhcnJheSBmb3IgYmVlbmhlcmUoKSAqLwotICAgIGlmIChzeW1zID09IDIpCi0gICAgICAgIGRvbmUgPSBOVUxMOwotICAgIGVsc2UgaWYgKHNpemUgPiAoKHNpemVfdCkwIC0gMSkgLyBzaXplb2Yoc3RydWN0IHRhYikgfHwKLSAgICAgICAgICAgICAoZG9uZSA9IGNhbGxvYyhzaXplLCBzaXplb2Yoc3RydWN0IHRhYikpKSA9PSBOVUxMKSB7Ci0gICAgICAgIGZwdXRzKCJhYm9ydDogdW5hYmxlIHRvIGFsbG9jYXRlIGVub3VnaCBtZW1vcnlcbiIsIHN0ZGVycik7Ci0gICAgICAgIGNsZWFudXAoKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyogZmluZCBhbmQgc2hvdyBtYXhpbXVtIGluZmxhdGUgdGFibGUgdXNhZ2UgKi8KLSAgICAgICAgaWYgKHJvb3QgPiBtYXgpICAgICAgICAgICAgICAgICAvKiByZWR1Y2Ugcm9vdCB0byBtYXggbGVuZ3RoICovCi0gICAgICAgICAgICAgICAgcm9vdCA9IG1heDsKLSAgICBpZiAoc3ltcyA8ICgoY29kZV90KTEgPDwgKHJvb3QgKyAxKSkpCi0gICAgICAgIGVub3VnaChzeW1zKTsKLSAgICBlbHNlCi0gICAgICAgIHB1dHMoImNhbm5vdCBoYW5kbGUgbWluaW11bSBjb2RlIGxlbmd0aHMgPiByb290Iik7Ci0KLSAgICAvKiBkb25lICovCi0gICAgY2xlYW51cCgpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvZXhhbXBsZXMvZml0YmxrLmMgYi9zcmMvemxpYi9leGFtcGxlcy9maXRibGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxZGU1Yy4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9leGFtcGxlcy9maXRibGsuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKiBmaXRibGsuYzogZXhhbXBsZSBvZiBmaXR0aW5nIGNvbXByZXNzZWQgb3V0cHV0IHRvIGEgc3BlY2lmaWVkIHNpemUKLSAgIE5vdCBjb3B5cmlnaHRlZCAtLSBwcm92aWRlZCB0byB0aGUgcHVibGljIGRvbWFpbgotICAgVmVyc2lvbiAxLjEgIDI1IE5vdmVtYmVyIDIwMDQgIE1hcmsgQWRsZXIgKi8KLQotLyogVmVyc2lvbiBoaXN0b3J5OgotICAgMS4wICAyNCBOb3YgMjAwNCAgRmlyc3QgdmVyc2lvbgotICAgMS4xICAyNSBOb3YgMjAwNCAgQ2hhbmdlIGRlZmxhdGVJbml0MigpIHRvIGRlZmxhdGVJbml0KCkKLSAgICAgICAgICAgICAgICAgICAgIFVzZSBmaXhlZC1zaXplLCBzdGFjay1hbGxvY2F0ZWQgcmF3IGJ1ZmZlcnMKLSAgICAgICAgICAgICAgICAgICAgIFNpbXBsaWZ5IGNvZGUgbW92aW5nIGNvbXByZXNzaW9uIHRvIHN1YnJvdXRpbmVzCi0gICAgICAgICAgICAgICAgICAgICBVc2UgYXNzZXJ0KCkgZm9yIGludGVybmFsIGVycm9ycwotICAgICAgICAgICAgICAgICAgICAgQWRkIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFwcHJvYWNoCi0gKi8KLQotLyogQXBwcm9hY2ggdG8ganVzdCBmaXR0aW5nIGEgcmVxdWVzdGVkIGNvbXByZXNzZWQgc2l6ZToKLQotICAgZml0YmxrIHBlcmZvcm1zIHRocmVlIGNvbXByZXNzaW9uIHBhc3NlcyBvbiBhIHBvcnRpb24gb2YgdGhlIGlucHV0Ci0gICBkYXRhIGluIG9yZGVyIHRvIGRldGVybWluZSBob3cgbXVjaCBvZiB0aGF0IGlucHV0IHdpbGwgY29tcHJlc3MgdG8KLSAgIG5lYXJseSB0aGUgcmVxdWVzdGVkIG91dHB1dCBibG9jayBzaXplLiAgVGhlIGZpcnN0IHBhc3MgZ2VuZXJhdGVzCi0gICBlbm91Z2ggZGVmbGF0ZSBibG9ja3MgdG8gcHJvZHVjZSBvdXRwdXQgdG8gZmlsbCB0aGUgcmVxdWVzdGVkCi0gICBvdXRwdXQgc2l6ZSBwbHVzIGEgc3BlY2ZpZWQgZXhjZXNzIGFtb3VudCAoc2VlIHRoZSBFWENFU1MgZGVmaW5lCi0gICBiZWxvdykuICBUaGUgbGFzdCBkZWZsYXRlIGJsb2NrIG1heSBnbyBxdWl0ZSBhIGJpdCBwYXN0IHRoYXQsIGJ1dAotICAgaXMgZGlzY2FyZGVkLiAgVGhlIHNlY29uZCBwYXNzIGRlY29tcHJlc3NlcyBhbmQgcmVjb21wcmVzc2VzIGp1c3QKLSAgIHRoZSBjb21wcmVzc2VkIGRhdGEgdGhhdCBmaXQgaW4gdGhlIHJlcXVlc3RlZCBwbHVzIGV4Y2VzcyBzaXplZAotICAgYnVmZmVyLiAgVGhlIGRlZmxhdGUgcHJvY2VzcyBpcyB0ZXJtaW5hdGVkIGFmdGVyIHRoYXQgYW1vdW50IG9mCi0gICBpbnB1dCwgd2hpY2ggaXMgbGVzcyB0aGFuIHRoZSBhbW91bnQgY29uc3VtZWQgb24gdGhlIGZpcnN0IHBhc3MuCi0gICBUaGUgbGFzdCBkZWZsYXRlIGJsb2NrIG9mIHRoZSByZXN1bHQgd2lsbCBiZSBvZiBhIGNvbXBhcmFibGUgc2l6ZQotICAgdG8gdGhlIGZpbmFsIHByb2R1Y3QsIHNvIHRoYXQgdGhlIGhlYWRlciBmb3IgdGhhdCBkZWZsYXRlIGJsb2NrIGFuZAotICAgdGhlIGNvbXByZXNzaW9uIHJhdGlvIGZvciB0aGF0IGJsb2NrIHdpbGwgYmUgYWJvdXQgdGhlIHNhbWUgYXMgaW4KLSAgIHRoZSBmaW5hbCBwcm9kdWN0LiAgVGhlIHRoaXJkIGNvbXByZXNzaW9uIHBhc3MgZGVjb21wcmVzc2VzIHRoZQotICAgcmVzdWx0IG9mIHRoZSBzZWNvbmQgc3RlcCwgYnV0IG9ubHkgdGhlIGNvbXByZXNzZWQgZGF0YSB1cCB0byB0aGUKLSAgIHJlcXVlc3RlZCBzaXplIG1pbnVzIGFuIGFtb3VudCB0byBhbGxvdyB0aGUgY29tcHJlc3NlZCBzdHJlYW0gdG8KLSAgIGNvbXBsZXRlIChzZWUgdGhlIE1BUkdJTiBkZWZpbmUgYmVsb3cpLiAgVGhhdCB3aWxsIHJlc3VsdCBpbiBhCi0gICBmaW5hbCBjb21wcmVzc2VkIHN0cmVhbSB3aG9zZSBsZW5ndGggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZQotICAgcmVxdWVzdGVkIHNpemUuICBBc3N1bWluZyBzdWZmaWNpZW50IGlucHV0IGFuZCBhIHJlcXVlc3RlZCBzaXplCi0gICBncmVhdGVyIHRoYW4gYSBmZXcgaHVuZHJlZCBieXRlcywgdGhlIHNob3J0ZmFsbCB3aWxsIHR5cGljYWxseSBiZQotICAgbGVzcyB0aGFuIHRlbiBieXRlcy4KLQotICAgSWYgdGhlIGlucHV0IGlzIHNob3J0IGVub3VnaCB0aGF0IHRoZSBmaXJzdCBjb21wcmVzc2lvbiBjb21wbGV0ZXMKLSAgIGJlZm9yZSBmaWxsaW5nIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IHNpemUsIHRoZW4gdGhhdCBjb21wcmVzc2VkCi0gICBzdHJlYW0gaXMgcmV0dXJuIHdpdGggbm8gcmVjb21wcmVzc2lvbi4KLQotICAgRVhDRVNTIGlzIGNob3NlbiB0byBiZSBqdXN0IGdyZWF0ZXIgdGhhbiB0aGUgc2hvcnRmYWxsIHNlZW4gaW4gYQotICAgdHdvIHBhc3MgYXBwcm9hY2ggc2ltaWxhciB0byB0aGUgYWJvdmUuICBUaGF0IHNob3J0ZmFsbCBpcyBkdWUgdG8KLSAgIHRoZSBsYXN0IGRlZmxhdGUgYmxvY2sgY29tcHJlc3NpbmcgbW9yZSBlZmZpY2llbnRseSB3aXRoIGEgc21hbGxlcgotICAgaGVhZGVyIG9uIHRoZSBzZWNvbmQgcGFzcy4gIEVYQ0VTUyBpcyBzZXQgdG8gYmUgbGFyZ2UgZW5vdWdoIHNvCi0gICB0aGF0IHRoZXJlIGlzIGVub3VnaCB1bmNvbXByZXNzZWQgZGF0YSBmb3IgdGhlIHNlY29uZCBwYXNzIHRvIGZpbGwKLSAgIG91dCB0aGUgcmVxdWVzdGVkIHNpemUsIGFuZCBzbWFsbCBlbm91Z2ggc28gdGhhdCB0aGUgZmluYWwgZGVmbGF0ZQotICAgYmxvY2sgb2YgdGhlIHNlY29uZCBwYXNzIHdpbGwgYmUgY2xvc2UgaW4gc2l6ZSB0byB0aGUgZmluYWwgZGVmbGF0ZQotICAgYmxvY2sgb2YgdGhlIHRoaXJkIGFuZCBmaW5hbCBwYXNzLiAgTUFSR0lOIGlzIGNob3NlbiB0byBiZSBqdXN0Ci0gICBsYXJnZSBlbm91Z2ggdG8gYXNzdXJlIHRoYXQgdGhlIGZpbmFsIGNvbXByZXNzaW9uIGhhcyBlbm91Z2ggcm9vbQotICAgdG8gY29tcGxldGUgaW4gYWxsIGNhc2VzLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgInpsaWIuaCIKLQotI2RlZmluZSBsb2NhbCBzdGF0aWMKLQotLyogcHJpbnQgbmFzdHlncmFtIGFuZCBsZWF2ZSAqLwotbG9jYWwgdm9pZCBxdWl0KGNoYXIgKndoeSkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImZpdGJsayBhYm9ydDogJXNcbiIsIHdoeSk7Ci0gICAgZXhpdCgxKTsKLX0KLQotI2RlZmluZSBSQVdMRU4gNDA5NiAgICAvKiBpbnRlcm1lZGlhdGUgdW5jb21wcmVzc2VkIGJ1ZmZlciBzaXplICovCi0KLS8qIGNvbXByZXNzIGZyb20gZmlsZSB0byBkZWYgdW50aWwgcHJvdmlkZWQgYnVmZmVyIGlzIGZ1bGwgb3IgZW5kIG9mCi0gICBpbnB1dCByZWFjaGVkOyByZXR1cm4gbGFzdCBkZWZsYXRlKCkgcmV0dXJuIHZhbHVlLCBvciBaX0VSUk5PIGlmCi0gICB0aGVyZSB3YXMgcmVhZCBlcnJvciBvbiB0aGUgZmlsZSAqLwotbG9jYWwgaW50IHBhcnRjb21wcmVzcyhGSUxFICppbiwgel9zdHJlYW1wIGRlZikKLXsKLSAgICBpbnQgcmV0LCBmbHVzaDsKLSAgICB1bnNpZ25lZCBjaGFyIHJhd1tSQVdMRU5dOwotCi0gICAgZmx1c2ggPSBaX05PX0ZMVVNIOwotICAgIGRvIHsKLSAgICAgICAgZGVmLT5hdmFpbF9pbiA9IGZyZWFkKHJhdywgMSwgUkFXTEVOLCBpbik7Ci0gICAgICAgIGlmIChmZXJyb3IoaW4pKQotICAgICAgICAgICAgcmV0dXJuIFpfRVJSTk87Ci0gICAgICAgIGRlZi0+bmV4dF9pbiA9IHJhdzsKLSAgICAgICAgaWYgKGZlb2YoaW4pKQotICAgICAgICAgICAgZmx1c2ggPSBaX0ZJTklTSDsKLSAgICAgICAgcmV0ID0gZGVmbGF0ZShkZWYsIGZsdXNoKTsKLSAgICAgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7Ci0gICAgfSB3aGlsZSAoZGVmLT5hdmFpbF9vdXQgIT0gMCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi0vKiByZWNvbXByZXNzIGZyb20gaW5mJ3MgaW5wdXQgdG8gZGVmJ3Mgb3V0cHV0OyB0aGUgaW5wdXQgZm9yIGluZiBhbmQKLSAgIHRoZSBvdXRwdXQgZm9yIGRlZiBhcmUgc2V0IGluIHRob3NlIHN0cnVjdHVyZXMgYmVmb3JlIGNhbGxpbmc7Ci0gICByZXR1cm4gbGFzdCBkZWZsYXRlKCkgcmV0dXJuIHZhbHVlLCBvciBaX01FTV9FUlJPUiBpZiBpbmZsYXRlKCkKLSAgIHdhcyBub3QgYWJsZSB0byBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IHdoZW4gaXQgbmVlZGVkIHRvICovCi1sb2NhbCBpbnQgcmVjb21wcmVzcyh6X3N0cmVhbXAgaW5mLCB6X3N0cmVhbXAgZGVmKQotewotICAgIGludCByZXQsIGZsdXNoOwotICAgIHVuc2lnbmVkIGNoYXIgcmF3W1JBV0xFTl07Ci0KLSAgICBmbHVzaCA9IFpfTk9fRkxVU0g7Ci0gICAgZG8gewotICAgICAgICAvKiBkZWNvbXByZXNzICovCi0gICAgICAgIGluZi0+YXZhaWxfb3V0ID0gUkFXTEVOOwotICAgICAgICBpbmYtPm5leHRfb3V0ID0gcmF3OwotICAgICAgICByZXQgPSBpbmZsYXRlKGluZiwgWl9OT19GTFVTSCk7Ci0gICAgICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IgJiYgcmV0ICE9IFpfREFUQV9FUlJPUiAmJgotICAgICAgICAgICAgICAgcmV0ICE9IFpfTkVFRF9ESUNUKTsKLSAgICAgICAgaWYgKHJldCA9PSBaX01FTV9FUlJPUikKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAgICAgLyogY29tcHJlc3Mgd2hhdCB3YXMgZGVjb21wcmVzZWQgdW50aWwgZG9uZSBvciBubyByb29tICovCi0gICAgICAgIGRlZi0+YXZhaWxfaW4gPSBSQVdMRU4gLSBpbmYtPmF2YWlsX291dDsKLSAgICAgICAgZGVmLT5uZXh0X2luID0gcmF3OwotICAgICAgICBpZiAoaW5mLT5hdmFpbF9vdXQgIT0gMCkKLSAgICAgICAgICAgIGZsdXNoID0gWl9GSU5JU0g7Ci0gICAgICAgIHJldCA9IGRlZmxhdGUoZGVmLCBmbHVzaCk7Ci0gICAgICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOwotICAgIH0gd2hpbGUgKHJldCAhPSBaX1NUUkVBTV9FTkQgJiYgZGVmLT5hdmFpbF9vdXQgIT0gMCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotI2RlZmluZSBFWENFU1MgMjU2ICAgICAgLyogZW1waXJpY2FsbHkgZGV0ZXJtaW5lZCBzdHJlYW0gb3ZlcmFnZSAqLwotI2RlZmluZSBNQVJHSU4gOCAgICAgICAgLyogYW1vdW50IHRvIGJhY2sgb2ZmIGZvciBjb21wbGV0aW9uICovCi0KLS8qIGNvbXByZXNzIGZyb20gc3RkaW4gdG8gZml4ZWQtc2l6ZSBibG9jayBvbiBzdGRvdXQgKi8KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqLwotICAgIHVuc2lnbmVkIHNpemU7ICAgICAgICAgIC8qIHJlcXVlc3RlZCBmaXhlZCBvdXRwdXQgYmxvY2sgc2l6ZSAqLwotICAgIHVuc2lnbmVkIGhhdmU7ICAgICAgICAgIC8qIGJ5dGVzIHdyaXR0ZW4gYnkgZGVmbGF0ZSgpIGNhbGwgKi8KLSAgICB1bnNpZ25lZCBjaGFyICpibGs7ICAgICAvKiBpbnRlcm1lZGlhdGUgYW5kIGZpbmFsIHN0cmVhbSAqLwotICAgIHVuc2lnbmVkIGNoYXIgKnRtcDsgICAgIC8qIGNsb3NlIHRvIGRlc2lyZWQgc2l6ZSBzdHJlYW0gKi8KLSAgICB6X3N0cmVhbSBkZWYsIGluZjsgICAgICAvKiB6bGliIGRlZmxhdGUgYW5kIGluZmxhdGUgc3RhdGVzICovCi0KLSAgICAvKiBnZXQgcmVxdWVzdGVkIG91dHB1dCBzaXplICovCi0gICAgaWYgKGFyZ2MgIT0gMikKLSAgICAgICAgcXVpdCgibmVlZCBvbmUgYXJndW1lbnQ6IHNpemUgb2Ygb3V0cHV0IGJsb2NrIik7Ci0gICAgcmV0ID0gc3RydG9sKGFyZ3ZbMV0sIGFyZ3YgKyAxLCAxMCk7Ci0gICAgaWYgKGFyZ3ZbMV1bMF0gIT0gMCkKLSAgICAgICAgcXVpdCgiYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpOwotICAgIGlmIChyZXQgPCA4KSAgICAgICAgICAgIC8qIDggaXMgbWluaW11bSB6bGliIHN0cmVhbSBzaXplICovCi0gICAgICAgIHF1aXQoIm5lZWQgcG9zaXRpdmUgc2l6ZSBvZiA4IG9yIGdyZWF0ZXIiKTsKLSAgICBzaXplID0gKHVuc2lnbmVkKXJldDsKLQotICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgYnVmZmVycyBhbmQgY29tcHJlc3Npb24gZW5naW5lICovCi0gICAgYmxrID0gbWFsbG9jKHNpemUgKyBFWENFU1MpOwotICAgIGRlZi56YWxsb2MgPSBaX05VTEw7Ci0gICAgZGVmLnpmcmVlID0gWl9OVUxMOwotICAgIGRlZi5vcGFxdWUgPSBaX05VTEw7Ci0gICAgcmV0ID0gZGVmbGF0ZUluaXQoJmRlZiwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKLSAgICBpZiAocmV0ICE9IFpfT0sgfHwgYmxrID09IE5VTEwpCi0gICAgICAgIHF1aXQoIm91dCBvZiBtZW1vcnkiKTsKLQotICAgIC8qIGNvbXByZXNzIGZyb20gc3RkaW4gdW50aWwgb3V0cHV0IGZ1bGwsIG9yIG5vIG1vcmUgaW5wdXQgKi8KLSAgICBkZWYuYXZhaWxfb3V0ID0gc2l6ZSArIEVYQ0VTUzsKLSAgICBkZWYubmV4dF9vdXQgPSBibGs7Ci0gICAgcmV0ID0gcGFydGNvbXByZXNzKHN0ZGluLCAmZGVmKTsKLSAgICBpZiAocmV0ID09IFpfRVJSTk8pCi0gICAgICAgIHF1aXQoImVycm9yIHJlYWRpbmcgaW5wdXQiKTsKLQotICAgIC8qIGlmIGl0IGFsbCBmaXQsIHRoZW4gc2l6ZSB3YXMgdW5kZXJzdWJzY3JpYmVkIC0tIGRvbmUhICovCi0gICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQgJiYgZGVmLmF2YWlsX291dCA+PSBFWENFU1MpIHsKLSAgICAgICAgLyogd3JpdGUgYmxvY2sgdG8gc3Rkb3V0ICovCi0gICAgICAgIGhhdmUgPSBzaXplICsgRVhDRVNTIC0gZGVmLmF2YWlsX291dDsKLSAgICAgICAgaWYgKGZ3cml0ZShibGssIDEsIGhhdmUsIHN0ZG91dCkgIT0gaGF2ZSB8fCBmZXJyb3Ioc3Rkb3V0KSkKLSAgICAgICAgICAgIHF1aXQoImVycm9yIHdyaXRpbmcgb3V0cHV0Iik7Ci0KLSAgICAgICAgLyogY2xlYW4gdXAgYW5kIHByaW50IHJlc3VsdHMgdG8gc3RkZXJyICovCi0gICAgICAgIHJldCA9IGRlZmxhdGVFbmQoJmRlZik7Ci0gICAgICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOwotICAgICAgICBmcmVlKGJsayk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgICAgICIldSBieXRlcyB1bnVzZWQgb3V0IG9mICV1IHJlcXVlc3RlZCAoYWxsIGlucHV0KVxuIiwKLSAgICAgICAgICAgICAgICBzaXplIC0gaGF2ZSwgc2l6ZSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIGl0IGRpZG4ndCBhbGwgZml0IC0tIHNldCB1cCBmb3IgcmVjb21wcmVzc2lvbiAqLwotICAgIGluZi56YWxsb2MgPSBaX05VTEw7Ci0gICAgaW5mLnpmcmVlID0gWl9OVUxMOwotICAgIGluZi5vcGFxdWUgPSBaX05VTEw7Ci0gICAgaW5mLmF2YWlsX2luID0gMDsKLSAgICBpbmYubmV4dF9pbiA9IFpfTlVMTDsKLSAgICByZXQgPSBpbmZsYXRlSW5pdCgmaW5mKTsKLSAgICB0bXAgPSBtYWxsb2Moc2l6ZSArIEVYQ0VTUyk7Ci0gICAgaWYgKHJldCAhPSBaX09LIHx8IHRtcCA9PSBOVUxMKQotICAgICAgICBxdWl0KCJvdXQgb2YgbWVtb3J5Iik7Ci0gICAgcmV0ID0gZGVmbGF0ZVJlc2V0KCZkZWYpOwotICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOwotCi0gICAgLyogZG8gZmlyc3QgcmVjb21wcmVzc2lvbiBjbG9zZSB0byB0aGUgcmlnaHQgYW1vdW50ICovCi0gICAgaW5mLmF2YWlsX2luID0gc2l6ZSArIEVYQ0VTUzsKLSAgICBpbmYubmV4dF9pbiA9IGJsazsKLSAgICBkZWYuYXZhaWxfb3V0ID0gc2l6ZSArIEVYQ0VTUzsKLSAgICBkZWYubmV4dF9vdXQgPSB0bXA7Ci0gICAgcmV0ID0gcmVjb21wcmVzcygmaW5mLCAmZGVmKTsKLSAgICBpZiAocmV0ID09IFpfTUVNX0VSUk9SKQotICAgICAgICBxdWl0KCJvdXQgb2YgbWVtb3J5Iik7Ci0KLSAgICAvKiBzZXQgdXAgZm9yIG5leHQgcmVvY21wcmVzc2lvbiAqLwotICAgIHJldCA9IGluZmxhdGVSZXNldCgmaW5mKTsKLSAgICBhc3NlcnQocmV0ICE9IFpfU1RSRUFNX0VSUk9SKTsKLSAgICByZXQgPSBkZWZsYXRlUmVzZXQoJmRlZik7Ci0gICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7Ci0KLSAgICAvKiBkbyBzZWNvbmQgYW5kIGZpbmFsIHJlY29tcHJlc3Npb24gKHRoaXJkIGNvbXByZXNzaW9uKSAqLwotICAgIGluZi5hdmFpbF9pbiA9IHNpemUgLSBNQVJHSU47ICAgLyogYXNzdXJlIHN0cmVhbSB3aWxsIGNvbXBsZXRlICovCi0gICAgaW5mLm5leHRfaW4gPSB0bXA7Ci0gICAgZGVmLmF2YWlsX291dCA9IHNpemU7Ci0gICAgZGVmLm5leHRfb3V0ID0gYmxrOwotICAgIHJldCA9IHJlY29tcHJlc3MoJmluZiwgJmRlZik7Ci0gICAgaWYgKHJldCA9PSBaX01FTV9FUlJPUikKLSAgICAgICAgcXVpdCgib3V0IG9mIG1lbW9yeSIpOwotICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRU5EKTsgICAgLyogb3RoZXJ3aXNlIE1BUkdJTiB0b28gc21hbGwgKi8KLQotICAgIC8qIGRvbmUgLS0gd3JpdGUgYmxvY2sgdG8gc3Rkb3V0ICovCi0gICAgaGF2ZSA9IHNpemUgLSBkZWYuYXZhaWxfb3V0OwotICAgIGlmIChmd3JpdGUoYmxrLCAxLCBoYXZlLCBzdGRvdXQpICE9IGhhdmUgfHwgZmVycm9yKHN0ZG91dCkpCi0gICAgICAgIHF1aXQoImVycm9yIHdyaXRpbmcgb3V0cHV0Iik7Ci0KLSAgICAvKiBjbGVhbiB1cCBhbmQgcHJpbnQgcmVzdWx0cyB0byBzdGRlcnIgKi8KLSAgICBmcmVlKHRtcCk7Ci0gICAgcmV0ID0gaW5mbGF0ZUVuZCgmaW5mKTsKLSAgICBhc3NlcnQocmV0ICE9IFpfU1RSRUFNX0VSUk9SKTsKLSAgICByZXQgPSBkZWZsYXRlRW5kKCZkZWYpOwotICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOwotICAgIGZyZWUoYmxrKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICIldSBieXRlcyB1bnVzZWQgb3V0IG9mICV1IHJlcXVlc3RlZCAoJWx1IGlucHV0KVxuIiwKLSAgICAgICAgICAgIHNpemUgLSBoYXZlLCBzaXplLCBkZWYudG90YWxfaW4pOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvZXhhbXBsZXMvZ3VuLmMgYi9zcmMvemxpYi9leGFtcGxlcy9ndW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiMDg4Mi4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9leGFtcGxlcy9ndW4uYworKysgL2Rldi9udWxsCkBAIC0xLDcwMSArMCwwIEBACi0vKiBndW4uYyAtLSBzaW1wbGUgZ3VuemlwIHRvIGdpdmUgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIGluZmxhdGVCYWNrKCkKLSAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSwgMjAwOCwgMjAxMCBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gICBWZXJzaW9uIDEuNiAgMTcgSmFudWFyeSAyMDEwICBNYXJrIEFkbGVyICovCi0KLS8qIFZlcnNpb24gaGlzdG9yeToKLSAgIDEuMCAgMTYgRmViIDIwMDMgIEZpcnN0IHZlcnNpb24gZm9yIHRlc3Rpbmcgb2YgaW5mbGF0ZUJhY2soKQotICAgMS4xICAyMSBGZWIgMjAwNSAgRGVjb21wcmVzcyBjb25jYXRlbmF0ZWQgZ3ppcCBzdHJlYW1zCi0gICAgICAgICAgICAgICAgICAgICBSZW1vdmUgdXNlIG9mICJ0aGlzIiB2YXJpYWJsZSAoQysrIGtleXdvcmQpCi0gICAgICAgICAgICAgICAgICAgICBGaXggcmV0dXJuIHZhbHVlIGZvciBpbigpCi0gICAgICAgICAgICAgICAgICAgICBJbXByb3ZlIGFsbG9jYXRpb24gZmFpbHVyZSBjaGVja2luZwotICAgICAgICAgICAgICAgICAgICAgQWRkIHR5cGVjYXN0aW5nIGZvciB2b2lkICogc3RydWN0dXJlcwotICAgICAgICAgICAgICAgICAgICAgQWRkIC1oIG9wdGlvbiBmb3IgY29tbWFuZCB2ZXJzaW9uIGFuZCB1c2FnZQotICAgICAgICAgICAgICAgICAgICAgQWRkIGEgYnVuY2ggb2YgY29tbWVudHMKLSAgIDEuMiAgMjAgTWFyIDIwMDUgIEFkZCBVbml4IGNvbXByZXNzIChMWlcpIGRlY29tcHJlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgIENvcHkgZmlsZSBhdHRyaWJ1dGVzIGZyb20gaW5wdXQgZmlsZSB0byBvdXRwdXQgZmlsZQotICAgMS4zICAxMiBKdW4gMjAwNSAgQWRkIGNhc3RzIGZvciBlcnJvciBtZXNzYWdlcyBbT2Jlcmh1bWVyXQotICAgMS40ICAgOCBEZWMgMjAwNiAgTFpXIGRlY29tcHJlc3Npb24gc3BlZWQgaW1wcm92ZW1lbnRzCi0gICAxLjUgICA5IEZlYiAyMDA4ICBBdm9pZCB3YXJuaW5nIGluIGxhdGVzdCB2ZXJzaW9uIG9mIGdjYwotICAgMS42ICAxNyBKYW4gMjAxMCAgQXZvaWQgc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb24gd2FybmluZ3MKLSAqLwotCi0vKgotICAgZ3VuIFsgLXQgXSBbIG5hbWUgLi4uIF0KLQotICAgZGVjb21wcmVzc2VzIHRoZSBkYXRhIGluIHRoZSBuYW1lZCBnemlwIGZpbGVzLiAgSWYgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiwKLSAgIGd1biB3aWxsIGRlY29tcHJlc3MgZnJvbSBzdGRpbiB0byBzdGRvdXQuICBUaGUgbmFtZXMgbXVzdCBlbmQgaW4gLmd6LCAtZ3osCi0gICAueiwgLXosIF96LCBvciAuWi4gIFRoZSB1bmNvbXByZXNzZWQgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gdG8gYSBmaWxlIG5hbWUKLSAgIHdpdGggdGhlIHN1ZmZpeCBzdHJpcHBlZC4gIE9uIHN1Y2Nlc3MsIHRoZSBvcmlnaW5hbCBmaWxlIGlzIGRlbGV0ZWQuICBPbgotICAgZmFpbHVyZSwgdGhlIG91dHB1dCBmaWxlIGlzIGRlbGV0ZWQuICBGb3IgbW9zdCBmYWlsdXJlcywgdGhlIGNvbW1hbmQgd2lsbAotICAgY29udGludWUgdG8gcHJvY2VzcyB0aGUgcmVtYWluaW5nIG5hbWVzIG9uIHRoZSBjb21tYW5kIGxpbmUuICBBIG1lbW9yeQotICAgYWxsb2NhdGlvbiBmYWlsdXJlIHdpbGwgYWJvcnQgdGhlIGNvbW1hbmQuICBJZiAtdCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlCi0gICBsaXN0ZWQgZmlsZXMgb3Igc3RkaW4gd2lsbCBiZSB0ZXN0ZWQgYXMgZ3ppcCBmaWxlcyBmb3IgaW50ZWdyaXR5ICh3aXRob3V0Ci0gICBjaGVja2luZyBmb3IgYSBwcm9wZXIgc3VmZml4KSwgbm8gb3V0cHV0IHdpbGwgYmUgd3JpdHRlbiwgYW5kIG5vIGZpbGVzCi0gICB3aWxsIGJlIGRlbGV0ZWQuCi0KLSAgIExpa2UgZ3ppcCwgZ3VuIGFsbG93cyBjb25jYXRlbmF0ZWQgZ3ppcCBzdHJlYW1zIGFuZCB3aWxsIGRlY29tcHJlc3MgdGhlbSwKLSAgIHdyaXRpbmcgYWxsIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSB0byB0aGUgb3V0cHV0LiAgVW5saWtlIGd6aXAsIGd1biBhbGxvd3MKLSAgIGFuIGVtcHR5IGZpbGUgb24gaW5wdXQsIGFuZCB3aWxsIHByb2R1Y2Ugbm8gZXJyb3Igd3JpdGluZyBhbiBlbXB0eSBvdXRwdXQKLSAgIGZpbGUuCi0KLSAgIGd1biB3aWxsIGFsc28gZGVjb21wcmVzcyBmaWxlcyBtYWRlIGJ5IFVuaXggY29tcHJlc3MsIHdoaWNoIHVzZXMgTFpXCi0gICBjb21wcmVzc2lvbi4gIFRoZXNlIGZpbGVzIGFyZSBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIGJ5IHZpcnR1ZSBvZiB0aGVpcgotICAgbWFnaWMgaGVhZGVyIGJ5dGVzLiAgU2luY2UgdGhlIGVuZCBvZiBVbml4IGNvbXByZXNzIHN0cmVhbSBpcyBtYXJrZWQgYnkgdGhlCi0gICBlbmQtb2YtZmlsZSwgdGhleSBjYW5ub3QgYmUgY29uY2FudGVuYXRlZC4gIElmIGEgVW5peCBjb21wcmVzcyBzdHJlYW0gaXMKLSAgIGVuY291bnRlcmVkIGluIGFuIGlucHV0IGZpbGUsIGl0IGlzIHRoZSBsYXN0IHN0cmVhbSBpbiB0aGF0IGZpbGUuCi0KLSAgIExpa2UgZ3VuemlwIGFuZCB1bmNvbXByZXNzLCB0aGUgZmlsZSBhdHRyaWJ1dGVzIG9mIHRoZSBvcmlnbmFsIGNvbXByZXNzZWQKLSAgIGZpbGUgYXJlIG1haW50YWluZWQgaW4gdGhlIGZpbmFsIHVuY29tcHJlc3NlZCBmaWxlLCB0byB0aGUgZXh0ZW50IHRoYXQgdGhlCi0gICB1c2VyIHBlcm1pc3Npb25zIGFsbG93IGl0LgotCi0gICBPbiBteSBNYWMgT1MgWCBQb3dlclBDIEc0LCBndW4gaXMgYWxtb3N0IHR3aWNlIGFzIGZhc3QgYXMgZ3VuemlwICh2ZXJzaW9uCi0gICAxLjIuNCkgaXMgb24gdGhlIHNhbWUgZmlsZSwgd2hlbiBndW4gaXMgbGlua2VkIHdpdGggemxpYiAxLjIuMi4gIEFsc28gdGhlCi0gICBMWlcgZGVjb21wcmVzc2lvbiBwcm92aWRlZCBieSBndW4gaXMgYWJvdXQgdHdpY2UgYXMgZmFzdCBhcyB0aGUgc3RhbmRhcmQKLSAgIFVuaXggdW5jb21wcmVzcyBjb21tYW5kLgotICovCi0KLS8qIGV4dGVybmFsIGZ1bmN0aW9ucyBhbmQgcmVsYXRlZCB0eXBlcyBhbmQgY29uc3RhbnRzICovCi0jaW5jbHVkZSA8c3RkaW8uaD4gICAgICAgICAgLyogZnByaW50ZigpICovCi0jaW5jbHVkZSA8c3RkbGliLmg+ICAgICAgICAgLyogbWFsbG9jKCksIGZyZWUoKSAqLwotI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgICAgIC8qIHN0cmVycm9yKCksIHN0cmNtcCgpLCBzdHJsZW4oKSwgbWVtY3B5KCkgKi8KLSNpbmNsdWRlIDxlcnJuby5oPiAgICAgICAgICAvKiBlcnJubyAqLwotI2luY2x1ZGUgPGZjbnRsLmg+ICAgICAgICAgIC8qIG9wZW4oKSAqLwotI2luY2x1ZGUgPHVuaXN0ZC5oPiAgICAgICAgIC8qIHJlYWQoKSwgd3JpdGUoKSwgY2xvc2UoKSwgY2hvd24oKSwgdW5saW5rKCkgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPiAgICAgICAvKiBzdGF0KCksIGNobW9kKCkgKi8KLSNpbmNsdWRlIDx1dGltZS5oPiAgICAgICAgICAvKiB1dGltZSgpICovCi0jaW5jbHVkZSAiemxpYi5oIiAgICAgICAgICAgLyogaW5mbGF0ZUJhY2tJbml0KCksIGluZmxhdGVCYWNrKCksICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5mbGF0ZUJhY2tFbmQoKSwgY3JjMzIoKSAqLwotCi0vKiBmdW5jdGlvbiBkZWNsYXJhdGlvbiAqLwotI2RlZmluZSBsb2NhbCBzdGF0aWMKLQotLyogYnVmZmVyIGNvbnN0YW50cyAqLwotI2RlZmluZSBTSVpFIDMyNzY4VSAgICAgICAgIC8qIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyIHNpemVzICovCi0jZGVmaW5lIFBJRUNFIDE2Mzg0ICAgICAgICAgLyogbGltaXRzIGkvbyBjaHVua3MgZm9yIDE2LWJpdCBpbnQgY2FzZSAqLwotCi0vKiBzdHJ1Y3R1cmUgZm9yIGluZmJhY2soKSB0byBwYXNzIHRvIGlucHV0IGZ1bmN0aW9uIGluKCkgLS0gaXQgbWFpbnRhaW5zIHRoZQotICAgaW5wdXQgZmlsZSBhbmQgYSBidWZmZXIgb2Ygc2l6ZSBTSVpFICovCi1zdHJ1Y3QgaW5kIHsKLSAgICBpbnQgaW5maWxlOwotICAgIHVuc2lnbmVkIGNoYXIgKmluYnVmOwotfTsKLQotLyogTG9hZCBpbnB1dCBidWZmZXIsIGFzc3VtZWQgdG8gYmUgZW1wdHksIGFuZCByZXR1cm4gYnl0ZXMgbG9hZGVkIGFuZCBhCi0gICBwb2ludGVyIHRvIHRoZW0uICByZWFkKCkgaXMgY2FsbGVkIHVudGlsIHRoZSBidWZmZXIgaXMgZnVsbCwgb3IgdW50aWwgaXQKLSAgIHJldHVybnMgZW5kLW9mLWZpbGUgb3IgZXJyb3IuICBSZXR1cm4gMCBvbiBlcnJvci4gKi8KLWxvY2FsIHVuc2lnbmVkIGluKHZvaWQgKmluX2Rlc2MsIHVuc2lnbmVkIGNoYXIgKipidWYpCi17Ci0gICAgaW50IHJldDsKLSAgICB1bnNpZ25lZCBsZW47Ci0gICAgdW5zaWduZWQgY2hhciAqbmV4dDsKLSAgICBzdHJ1Y3QgaW5kICptZSA9IChzdHJ1Y3QgaW5kICopaW5fZGVzYzsKLQotICAgIG5leHQgPSBtZS0+aW5idWY7Ci0gICAgKmJ1ZiA9IG5leHQ7Ci0gICAgbGVuID0gMDsKLSAgICBkbyB7Ci0gICAgICAgIHJldCA9IFBJRUNFOwotICAgICAgICBpZiAoKHVuc2lnbmVkKXJldCA+IFNJWkUgLSBsZW4pCi0gICAgICAgICAgICByZXQgPSAoaW50KShTSVpFIC0gbGVuKTsKLSAgICAgICAgcmV0ID0gKGludClyZWFkKG1lLT5pbmZpbGUsIG5leHQsIHJldCk7Ci0gICAgICAgIGlmIChyZXQgPT0gLTEpIHsKLSAgICAgICAgICAgIGxlbiA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBuZXh0ICs9IHJldDsKLSAgICAgICAgbGVuICs9IHJldDsKLSAgICB9IHdoaWxlIChyZXQgIT0gMCAmJiBsZW4gPCBTSVpFKTsKLSAgICByZXR1cm4gbGVuOwotfQotCi0vKiBzdHJ1Y3R1cmUgZm9yIGluZmJhY2soKSB0byBwYXNzIHRvIG91dHB1dCBmdW5jdGlvbiBvdXQoKSAtLSBpdCBtYWludGFpbnMgdGhlCi0gICBvdXRwdXQgZmlsZSwgYSBydW5uaW5nIENSQy0zMiBjaGVjayBvbiB0aGUgb3V0cHV0IGFuZCB0aGUgdG90YWwgbnVtYmVyIG9mCi0gICBieXRlcyBvdXRwdXQsIGJvdGggZm9yIGNoZWNraW5nIGFnYWluc3QgdGhlIGd6aXAgdHJhaWxlci4gIChUaGUgbGVuZ3RoIGluCi0gICB0aGUgZ3ppcCB0cmFpbGVyIGlzIHN0b3JlZCBtb2R1bG8gMl4zMiwgc28gaXQncyBvayBpZiBhIGxvbmcgaXMgMzIgYml0cyBhbmQKLSAgIHRoZSBvdXRwdXQgaXMgZ3JlYXRlciB0aGFuIDQgR0IuKSAqLwotc3RydWN0IG91dGQgewotICAgIGludCBvdXRmaWxlOwotICAgIGludCBjaGVjazsgICAgICAgICAgICAgICAgICAvKiB0cnVlIGlmIGNoZWNraW5nIGNyYyBhbmQgdG90YWwgKi8KLSAgICB1bnNpZ25lZCBsb25nIGNyYzsKLSAgICB1bnNpZ25lZCBsb25nIHRvdGFsOwotfTsKLQotLyogV3JpdGUgb3V0cHV0IGJ1ZmZlciBhbmQgdXBkYXRlIHRoZSBDUkMtMzIgYW5kIHRvdGFsIGJ5dGVzIHdyaXR0ZW4uICB3cml0ZSgpCi0gICBpcyBjYWxsZWQgdW50aWwgYWxsIG9mIHRoZSBvdXRwdXQgaXMgd3JpdHRlbiBvciBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZC4KLSAgIE9uIHN1Y2Nlc3Mgb3V0KCkgcmV0dXJucyAwLiAgRm9yIGEgd3JpdGUgZmFpbHVyZSwgb3V0KCkgcmV0dXJucyAxLiAgSWYgdGhlCi0gICBvdXRwdXQgZmlsZSBkZXNjcmlwdG9yIGlzIC0xLCB0aGVuIG5vdGhpbmcgaXMgd3JpdHRlbi4KLSAqLwotbG9jYWwgaW50IG91dCh2b2lkICpvdXRfZGVzYywgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4pCi17Ci0gICAgaW50IHJldDsKLSAgICBzdHJ1Y3Qgb3V0ZCAqbWUgPSAoc3RydWN0IG91dGQgKilvdXRfZGVzYzsKLQotICAgIGlmIChtZS0+Y2hlY2spIHsKLSAgICAgICAgbWUtPmNyYyA9IGNyYzMyKG1lLT5jcmMsIGJ1ZiwgbGVuKTsKLSAgICAgICAgbWUtPnRvdGFsICs9IGxlbjsKLSAgICB9Ci0gICAgaWYgKG1lLT5vdXRmaWxlICE9IC0xKQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICByZXQgPSBQSUVDRTsKLSAgICAgICAgICAgIGlmICgodW5zaWduZWQpcmV0ID4gbGVuKQotICAgICAgICAgICAgICAgIHJldCA9IChpbnQpbGVuOwotICAgICAgICAgICAgcmV0ID0gKGludCl3cml0ZShtZS0+b3V0ZmlsZSwgYnVmLCByZXQpOwotICAgICAgICAgICAgaWYgKHJldCA9PSAtMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIGJ1ZiArPSByZXQ7Ci0gICAgICAgICAgICBsZW4gLT0gcmV0OwotICAgICAgICB9IHdoaWxlIChsZW4gIT0gMCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIG5leHQgaW5wdXQgYnl0ZSBtYWNybyBmb3IgdXNlIGluc2lkZSBsdW5waXBlKCkgYW5kIGd1bnBpcGUoKSAqLwotI2RlZmluZSBORVhUKCkgKGhhdmUgPyAwIDogKGhhdmUgPSBpbihpbmRwLCAmbmV4dCkpLCBcCi0gICAgICAgICAgICAgICAgbGFzdCA9IGhhdmUgPyAoaGF2ZS0tLCAoaW50KSgqbmV4dCsrKSkgOiAtMSkKLQotLyogbWVtb3J5IGZvciBndW5waXBlKCkgYW5kIGx1bnBpcGUoKSAtLQotICAgdGhlIGZpcnN0IDI1NiBlbnRyaWVzIG9mIHByZWZpeFtdIGFuZCBzdWZmaXhbXSBhcmUgbmV2ZXIgdXNlZCwgY291bGQKLSAgIGhhdmUgb2Zmc2V0IHRoZSBpbmRleCwgYnV0IGl0J3MgZmFzdGVyIHRvIHdhc3RlIHRoZSBtZW1vcnkgKi8KLXVuc2lnbmVkIGNoYXIgaW5idWZbU0laRV07ICAgICAgICAgICAgICAvKiBpbnB1dCBidWZmZXIgKi8KLXVuc2lnbmVkIGNoYXIgb3V0YnVmW1NJWkVdOyAgICAgICAgICAgICAvKiBvdXRwdXQgYnVmZmVyICovCi11bnNpZ25lZCBzaG9ydCBwcmVmaXhbNjU1MzZdOyAgICAgICAgICAgLyogaW5kZXggdG8gTFpXIHByZWZpeCBzdHJpbmcgKi8KLXVuc2lnbmVkIGNoYXIgc3VmZml4WzY1NTM2XTsgICAgICAgICAgICAvKiBvbmUtY2hhcmFjdGVyIExaVyBzdWZmaXggKi8KLXVuc2lnbmVkIGNoYXIgbWF0Y2hbNjUyODAgKyAyXTsgICAgICAgICAvKiBidWZmZXIgZm9yIHJldmVyc2VkIG1hdGNoIG9yIGd6aXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMksgc2xpZGluZyB3aW5kb3cgKi8KLQotLyogdGhyb3cgb3V0IHdoYXQncyBsZWZ0IGluIHRoZSBjdXJyZW50IGJpdHMgYnl0ZSBidWZmZXIgKHRoaXMgaXMgYSB2ZXN0aWdpYWwKLSAgIGFzcGVjdCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCBkZXJpdmVkIGZyb20gYW4gaW1wbGVtZW50YXRpb24gdGhhdAotICAgbWFkZSB1c2Ugb2YgYSBzcGVjaWFsIFZBWCBtYWNoaW5lIGluc3RydWN0aW9uISkgKi8KLSNkZWZpbmUgRkxVU0hDT0RFKCkgXAotICAgIGRvIHsgXAotICAgICAgICBsZWZ0ID0gMDsgXAotICAgICAgICByZW0gPSAwOyBcCi0gICAgICAgIGlmIChjaHVuayA+IGhhdmUpIHsgXAotICAgICAgICAgICAgY2h1bmsgLT0gaGF2ZTsgXAotICAgICAgICAgICAgaGF2ZSA9IDA7IFwKLSAgICAgICAgICAgIGlmIChORVhUKCkgPT0gLTEpIFwKLSAgICAgICAgICAgICAgICBicmVhazsgXAotICAgICAgICAgICAgY2h1bmstLTsgXAotICAgICAgICAgICAgaWYgKGNodW5rID4gaGF2ZSkgeyBcCi0gICAgICAgICAgICAgICAgY2h1bmsgPSBoYXZlID0gMDsgXAotICAgICAgICAgICAgICAgIGJyZWFrOyBcCi0gICAgICAgICAgICB9IFwKLSAgICAgICAgfSBcCi0gICAgICAgIGhhdmUgLT0gY2h1bms7IFwKLSAgICAgICAgbmV4dCArPSBjaHVuazsgXAotICAgICAgICBjaHVuayA9IDA7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBEZWNvbXByZXNzIGEgY29tcHJlc3MgKExaVykgZmlsZSBmcm9tIGluZHAgdG8gb3V0ZmlsZS4gIFRoZSBjb21wcmVzcyBtYWdpYwotICAgaGVhZGVyICh0d28gYnl0ZXMpIGhhcyBhbHJlYWR5IGJlZW4gcmVhZCBhbmQgdmVyaWZpZWQuICBUaGVyZSBhcmUgaGF2ZSBieXRlcwotICAgb2YgYnVmZmVyZWQgaW5wdXQgYXQgbmV4dC4gIHN0cm0gaXMgdXNlZCBmb3IgcGFzc2luZyBlcnJvciBpbmZvcm1hdGlvbiBiYWNrCi0gICB0byBndW5waXBlKCkuCi0KLSAgIGx1bnBpcGUoKSB3aWxsIHJldHVybiBaX09LIG9uIHN1Y2Nlc3MsIFpfQlVGX0VSUk9SIGZvciBhbiB1bmV4cGVjdGVkIGVuZCBvZgotICAgZmlsZSwgcmVhZCBlcnJvciwgb3Igd3JpdGUgZXJyb3IgKGEgd3JpdGUgZXJyb3IgaW5kaWNhdGVkIGJ5IHN0cm0tPm5leHRfaW4KLSAgIG5vdCBlcXVhbCB0byBaX05VTEwpLCBvciBaX0RBVEFfRVJST1IgZm9yIGludmFsaWQgaW5wdXQuCi0gKi8KLWxvY2FsIGludCBsdW5waXBlKHVuc2lnbmVkIGhhdmUsIHVuc2lnbmVkIGNoYXIgKm5leHQsIHN0cnVjdCBpbmQgKmluZHAsCi0gICAgICAgICAgICAgICAgICBpbnQgb3V0ZmlsZSwgel9zdHJlYW0gKnN0cm0pCi17Ci0gICAgaW50IGxhc3Q7ICAgICAgICAgICAgICAgICAgIC8qIGxhc3QgYnl0ZSByZWFkIGJ5IE5FWFQoKSwgb3IgLTEgaWYgRU9GICovCi0gICAgdW5zaWduZWQgY2h1bms7ICAgICAgICAgICAgIC8qIGJ5dGVzIGxlZnQgaW4gY3VycmVudCBjaHVuayAqLwotICAgIGludCBsZWZ0OyAgICAgICAgICAgICAgICAgICAvKiBiaXRzIGxlZnQgaW4gcmVtICovCi0gICAgdW5zaWduZWQgcmVtOyAgICAgICAgICAgICAgIC8qIHVudXNlZCBiaXRzIGZyb20gaW5wdXQgKi8KLSAgICBpbnQgYml0czsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHBlciBjb2RlICovCi0gICAgdW5zaWduZWQgY29kZTsgICAgICAgICAgICAgIC8qIGNvZGUsIHRhYmxlIHRyYXZlcnNhbCBpbmRleCAqLwotICAgIHVuc2lnbmVkIG1hc2s7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBjdXJyZW50IGJpdHMgY29kZXMgKi8KLSAgICBpbnQgbWF4OyAgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSBiaXRzIHBlciBjb2RlIGZvciB0aGlzIHN0cmVhbSAqLwotICAgIHVuc2lnbmVkIGZsYWdzOyAgICAgICAgICAgICAvKiBjb21wcmVzcyBmbGFncywgdGhlbiBibG9jayBjb21wcmVzcyBmbGFnICovCi0gICAgdW5zaWduZWQgZW5kOyAgICAgICAgICAgICAgIC8qIGxhc3QgdmFsaWQgZW50cnkgaW4gcHJlZml4L3N1ZmZpeCB0YWJsZXMgKi8KLSAgICB1bnNpZ25lZCB0ZW1wOyAgICAgICAgICAgICAgLyogY3VycmVudCBjb2RlICovCi0gICAgdW5zaWduZWQgcHJldjsgICAgICAgICAgICAgIC8qIHByZXZpb3VzIGNvZGUgKi8KLSAgICB1bnNpZ25lZCBmaW5hbDsgICAgICAgICAgICAgLyogbGFzdCBjaGFyYWN0ZXIgd3JpdHRlbiBmb3IgcHJldmlvdXMgY29kZSAqLwotICAgIHVuc2lnbmVkIHN0YWNrOyAgICAgICAgICAgICAvKiBuZXh0IHBvc2l0aW9uIGZvciByZXZlcnNlZCBzdHJpbmcgKi8KLSAgICB1bnNpZ25lZCBvdXRjbnQ7ICAgICAgICAgICAgLyogYnl0ZXMgaW4gb3V0cHV0IGJ1ZmZlciAqLwotICAgIHN0cnVjdCBvdXRkIG91dGQ7ICAgICAgICAgICAvKiBvdXRwdXQgc3RydWN0dXJlICovCi0gICAgdW5zaWduZWQgY2hhciAqcDsKLQotICAgIC8qIHNldCB1cCBvdXRwdXQgKi8KLSAgICBvdXRkLm91dGZpbGUgPSBvdXRmaWxlOwotICAgIG91dGQuY2hlY2sgPSAwOwotCi0gICAgLyogcHJvY2VzcyByZW1haW5kZXIgb2YgY29tcHJlc3MgaGVhZGVyIC0tIGEgZmxhZ3MgYnl0ZSAqLwotICAgIGZsYWdzID0gTkVYVCgpOwotICAgIGlmIChsYXN0ID09IC0xKQotICAgICAgICByZXR1cm4gWl9CVUZfRVJST1I7Ci0gICAgaWYgKGZsYWdzICYgMHg2MCkgewotICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ1bmtub3duIGx6dyBmbGFncyBzZXQiOwotICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOwotICAgIH0KLSAgICBtYXggPSBmbGFncyAmIDB4MWY7Ci0gICAgaWYgKG1heCA8IDkgfHwgbWF4ID4gMTYpIHsKLSAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikibHp3IGJpdHMgb3V0IG9mIHJhbmdlIjsKLSAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKLSAgICB9Ci0gICAgaWYgKG1heCA9PSA5KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDkgZG9lc24ndCByZWFsbHkgbWVhbiA5ICovCi0gICAgICAgIG1heCA9IDEwOwotICAgIGZsYWdzICY9IDB4ODA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cnVlIGlmIGJsb2NrIGNvbXByZXNzICovCi0KLSAgICAvKiBjbGVhciB0YWJsZSAqLwotICAgIGJpdHMgPSA5OwotICAgIG1hc2sgPSAweDFmZjsKLSAgICBlbmQgPSBmbGFncyA/IDI1NiA6IDI1NTsKLQotICAgIC8qIHNldCB1cDogZ2V0IGZpcnN0IDktYml0IGNvZGUsIHdoaWNoIGlzIHRoZSBmaXJzdCBkZWNvbXByZXNzZWQgYnl0ZSwgYnV0Ci0gICAgICAgZG9uJ3QgY3JlYXRlIGEgdGFibGUgZW50cnkgdW50aWwgdGhlIG5leHQgY29kZSAqLwotICAgIGlmIChORVhUKCkgPT0gLTEpICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBjb21wcmVzc2VkIGRhdGEgaXMgb2sgKi8KLSAgICAgICAgcmV0dXJuIFpfT0s7Ci0gICAgZmluYWwgPSBwcmV2ID0gKHVuc2lnbmVkKWxhc3Q7ICAgICAgICAgIC8qIGxvdyA4IGJpdHMgb2YgY29kZSAqLwotICAgIGlmIChORVhUKCkgPT0gLTEpICAgICAgICAgICAgICAgICAgICAgICAvKiBtaXNzaW5nIGEgYml0ICovCi0gICAgICAgIHJldHVybiBaX0JVRl9FUlJPUjsKLSAgICBpZiAobGFzdCAmIDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBtdXN0IGJlIDwgMjU2ICovCi0gICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbHp3IGNvZGUiOwotICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOwotICAgIH0KLSAgICByZW0gPSAodW5zaWduZWQpbGFzdCA+PiAxOyAgICAgICAgICAgICAgLyogcmVtYWluaW5nIDcgYml0cyAqLwotICAgIGxlZnQgPSA3OwotICAgIGNodW5rID0gYml0cyAtIDI7ICAgICAgICAgICAgICAgICAgICAgICAvKiA3IGJ5dGVzIGxlZnQgaW4gdGhpcyBjaHVuayAqLwotICAgIG91dGJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKWZpbmFsOyAgICAgICAvKiB3cml0ZSBmaXJzdCBkZWNvbXByZXNzZWQgYnl0ZSAqLwotICAgIG91dGNudCA9IDE7Ci0KLSAgICAvKiBkZWNvZGUgY29kZXMgKi8KLSAgICBzdGFjayA9IDA7Ci0gICAgZm9yICg7OykgewotICAgICAgICAvKiBpZiB0aGUgdGFibGUgd2lsbCBiZSBmdWxsIGFmdGVyIHRoaXMsIGluY3JlbWVudCB0aGUgY29kZSBzaXplICovCi0gICAgICAgIGlmIChlbmQgPj0gbWFzayAmJiBiaXRzIDwgbWF4KSB7Ci0gICAgICAgICAgICBGTFVTSENPREUoKTsKLSAgICAgICAgICAgIGJpdHMrKzsKLSAgICAgICAgICAgIG1hc2sgPDw9IDE7Ci0gICAgICAgICAgICBtYXNrKys7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBnZXQgYSBjb2RlIG9mIGxlbmd0aCBiaXRzICovCi0gICAgICAgIGlmIChjaHVuayA9PSAwKSAgICAgICAgICAgICAgICAgICAgIC8qIGRlY3JlbWVudCBjaHVuayBtb2R1bG8gYml0cyAqLwotICAgICAgICAgICAgY2h1bmsgPSBiaXRzOwotICAgICAgICBjb2RlID0gcmVtOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb3cgYml0cyBvZiBjb2RlICovCi0gICAgICAgIGlmIChORVhUKCkgPT0gLTEpIHsgICAgICAgICAgICAgICAgIC8qIEVPRiBpcyBlbmQgb2YgY29tcHJlc3NlZCBkYXRhICovCi0gICAgICAgICAgICAvKiB3cml0ZSByZW1haW5pbmcgYnVmZmVyZWQgb3V0cHV0ICovCi0gICAgICAgICAgICBpZiAob3V0Y250ICYmIG91dCgmb3V0ZCwgb3V0YnVmLCBvdXRjbnQpKSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bmV4dF9pbiA9IG91dGJ1ZjsgICAgIC8qIHNpZ25hbCB3cml0ZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIHJldHVybiBaX0JVRl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBaX09LOwotICAgICAgICB9Ci0gICAgICAgIGNvZGUgKz0gKHVuc2lnbmVkKWxhc3QgPDwgbGVmdDsgICAgIC8qIG1pZGRsZSAob3IgaGlnaCkgYml0cyBvZiBjb2RlICovCi0gICAgICAgIGxlZnQgKz0gODsKLSAgICAgICAgY2h1bmstLTsKLSAgICAgICAgaWYgKGJpdHMgPiBsZWZ0KSB7ICAgICAgICAgICAgICAgICAgLyogbmVlZCBtb3JlIGJpdHMgKi8KLSAgICAgICAgICAgIGlmIChORVhUKCkgPT0gLTEpICAgICAgICAgICAgICAgLyogY2FuJ3QgZW5kIGluIG1pZGRsZSBvZiBjb2RlICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIFpfQlVGX0VSUk9SOwotICAgICAgICAgICAgY29kZSArPSAodW5zaWduZWQpbGFzdCA8PCBsZWZ0OyAvKiBoaWdoIGJpdHMgb2YgY29kZSAqLwotICAgICAgICAgICAgbGVmdCArPSA4OwotICAgICAgICAgICAgY2h1bmstLTsKLSAgICAgICAgfQotICAgICAgICBjb2RlICY9IG1hc2s7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXNrIHRvIGN1cnJlbnQgY29kZSBsZW5ndGggKi8KLSAgICAgICAgbGVmdCAtPSBiaXRzOyAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHVudXNlZCBiaXRzICovCi0gICAgICAgIHJlbSA9ICh1bnNpZ25lZClsYXN0ID4+ICg4IC0gbGVmdCk7IC8qIHVudXNlZCBiaXRzIGZyb20gbGFzdCBieXRlICovCi0KLSAgICAgICAgLyogcHJvY2VzcyBjbGVhciBjb2RlICgyNTYpICovCi0gICAgICAgIGlmIChjb2RlID09IDI1NiAmJiBmbGFncykgewotICAgICAgICAgICAgRkxVU0hDT0RFKCk7Ci0gICAgICAgICAgICBiaXRzID0gOTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgYml0cyBhbmQgbWFzayAqLwotICAgICAgICAgICAgbWFzayA9IDB4MWZmOwotICAgICAgICAgICAgZW5kID0gMjU1OyAgICAgICAgICAgICAgICAgICAgICAvKiBlbXB0eSB0YWJsZSAqLwotICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgbmV4dCBjb2RlICovCi0gICAgICAgIH0KLQotICAgICAgICAvKiBzcGVjaWFsIGNvZGUgdG8gcmV1c2UgbGFzdCBtYXRjaCAqLwotICAgICAgICB0ZW1wID0gY29kZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHRoZSBjdXJyZW50IGNvZGUgKi8KLSAgICAgICAgaWYgKGNvZGUgPiBlbmQpIHsKLSAgICAgICAgICAgIC8qIEJlIHBpY2t5IG9uIHRoZSBhbGxvd2VkIGNvZGUgaGVyZSwgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb2RlCi0gICAgICAgICAgICAgICB3ZSBkcm9wIHRocm91Z2ggKHByZXYpIHdpbGwgYmUgYSB2YWxpZCBpbmRleCBzbyB0aGF0IHJhbmRvbQotICAgICAgICAgICAgICAgaW5wdXQgZG9lcyBub3QgY2F1c2UgYW4gZXhjZXB0aW9uLiAgVGhlIGNvZGUgIT0gZW5kICsgMSBjaGVjayBpcwotICAgICAgICAgICAgICAgZW1waXJpY2FsbHkgZGVyaXZlZCwgYW5kIG5vdCBjaGVja2VkIGluIHRoZSBvcmlnaW5hbCB1bmNvbXByZXNzCi0gICAgICAgICAgICAgICBjb2RlLiAgSWYgdGhpcyBldmVyIGNhdXNlcyBhIHByb2JsZW0sIHRoYXQgY2hlY2sgY291bGQgYmUgc2FmZWx5Ci0gICAgICAgICAgICAgICByZW1vdmVkLiAgTGVhdmluZyB0aGlzIGNoZWNrIGluIGdyZWF0bHkgaW1wcm92ZXMgZ3VuJ3MgYWJpbGl0eQotICAgICAgICAgICAgICAgdG8gZGV0ZWN0IHJhbmRvbSBvciBjb3JydXB0ZWQgaW5wdXQgYWZ0ZXIgYSBjb21wcmVzcyBoZWFkZXIuCi0gICAgICAgICAgICAgICBJbiBhbnkgY2FzZSwgdGhlIHByZXYgPiBlbmQgY2hlY2sgbXVzdCBiZSByZXRhaW5lZC4gKi8KLSAgICAgICAgICAgIGlmIChjb2RlICE9IGVuZCArIDEgfHwgcHJldiA+IGVuZCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbHp3IGNvZGUiOwotICAgICAgICAgICAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaFtzdGFjaysrXSA9ICh1bnNpZ25lZCBjaGFyKWZpbmFsOwotICAgICAgICAgICAgY29kZSA9IHByZXY7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB3YWxrIHRocm91Z2ggbGlua2VkIGxpc3QgdG8gZ2VuZXJhdGUgb3V0cHV0IGluIHJldmVyc2Ugb3JkZXIgKi8KLSAgICAgICAgcCA9IG1hdGNoICsgc3RhY2s7Ci0gICAgICAgIHdoaWxlIChjb2RlID49IDI1NikgewotICAgICAgICAgICAgKnArKyA9IHN1ZmZpeFtjb2RlXTsKLSAgICAgICAgICAgIGNvZGUgPSBwcmVmaXhbY29kZV07Ci0gICAgICAgIH0KLSAgICAgICAgc3RhY2sgPSBwIC0gbWF0Y2g7Ci0gICAgICAgIG1hdGNoW3N0YWNrKytdID0gKHVuc2lnbmVkIGNoYXIpY29kZTsKLSAgICAgICAgZmluYWwgPSBjb2RlOwotCi0gICAgICAgIC8qIGxpbmsgbmV3IHRhYmxlIGVudHJ5ICovCi0gICAgICAgIGlmIChlbmQgPCBtYXNrKSB7Ci0gICAgICAgICAgICBlbmQrKzsKLSAgICAgICAgICAgIHByZWZpeFtlbmRdID0gKHVuc2lnbmVkIHNob3J0KXByZXY7Ci0gICAgICAgICAgICBzdWZmaXhbZW5kXSA9ICh1bnNpZ25lZCBjaGFyKWZpbmFsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogc2V0IHByZXZpb3VzIGNvZGUgZm9yIG5leHQgaXRlcmF0aW9uICovCi0gICAgICAgIHByZXYgPSB0ZW1wOwotCi0gICAgICAgIC8qIHdyaXRlIG91dHB1dCBpbiBmb3J3YXJkIG9yZGVyICovCi0gICAgICAgIHdoaWxlIChzdGFjayA+IFNJWkUgLSBvdXRjbnQpIHsKLSAgICAgICAgICAgIHdoaWxlIChvdXRjbnQgPCBTSVpFKQotICAgICAgICAgICAgICAgIG91dGJ1ZltvdXRjbnQrK10gPSBtYXRjaFstLXN0YWNrXTsKLSAgICAgICAgICAgIGlmIChvdXQoJm91dGQsIG91dGJ1Ziwgb3V0Y250KSkgewotICAgICAgICAgICAgICAgIHN0cm0tPm5leHRfaW4gPSBvdXRidWY7IC8qIHNpZ25hbCB3cml0ZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIHJldHVybiBaX0JVRl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dGNudCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcCA9IG1hdGNoICsgc3RhY2s7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIG91dGJ1ZltvdXRjbnQrK10gPSAqLS1wOwotICAgICAgICB9IHdoaWxlIChwID4gbWF0Y2gpOwotICAgICAgICBzdGFjayA9IDA7Ci0KLSAgICAgICAgLyogbG9vcCBmb3IgbmV4dCBjb2RlIHdpdGggZmluYWwgYW5kIHByZXYgYXMgdGhlIGxhc3QgbWF0Y2gsIHJlbSBhbmQKLSAgICAgICAgICAgbGVmdCBwcm92aWRlIHRoZSBmaXJzdCAwLi43IGJpdHMgb2YgdGhlIG5leHQgY29kZSwgZW5kIGlzIHRoZSBsYXN0Ci0gICAgICAgICAgIHZhbGlkIHRhYmxlIGVudHJ5ICovCi0gICAgfQotfQotCi0vKiBEZWNvbXByZXNzIGEgZ3ppcCBmaWxlIGZyb20gaW5maWxlIHRvIG91dGZpbGUuICBzdHJtIGlzIGFzc3VtZWQgdG8gaGF2ZSBiZWVuCi0gICBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgd2l0aCBpbmZsYXRlQmFja0luaXQoKS4gIFRoZSBpbnB1dCBmaWxlIG1heSBjb25zaXN0Ci0gICBvZiBhIHNlcmllcyBvZiBnemlwIHN0cmVhbXMsIGluIHdoaWNoIGNhc2UgYWxsIG9mIHRoZW0gd2lsbCBiZSBkZWNvbXByZXNzZWQKLSAgIHRvIHRoZSBvdXRwdXQgZmlsZS4gIElmIG91dGZpbGUgaXMgLTEsIHRoZW4gdGhlIGd6aXAgc3RyZWFtKHMpIGludGVncml0eSBpcwotICAgY2hlY2tlZCBhbmQgbm90aGluZyBpcyB3cml0dGVuLgotCi0gICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgemxpYiBlcnJvciBjb2RlOiBaX01FTV9FUlJPUiBpZiBvdXQgb2YgbWVtb3J5LAotICAgWl9EQVRBX0VSUk9SIGlmIHRoZSBoZWFkZXIgb3IgdGhlIGNvbXByZXNzZWQgZGF0YSBpcyBpbnZhbGlkLCBvciBpZiB0aGUKLSAgIHRyYWlsZXIgQ1JDLTMyIGNoZWNrIG9yIGxlbmd0aCBkb2Vzbid0IG1hdGNoLCBaX0JVRl9FUlJPUiBpZiB0aGUgaW5wdXQgZW5kcwotICAgcHJlbWF0dXJlbHkgb3IgYSB3cml0ZSBlcnJvciBvY2N1cnMsIG9yIFpfRVJSTk8gaWYganVuayAobm90IGEgYW5vdGhlciBnemlwCi0gICBzdHJlYW0pIGZvbGxvd3MgYSB2YWxpZCBnemlwIHN0cmVhbS4KLSAqLwotbG9jYWwgaW50IGd1bnBpcGUoel9zdHJlYW0gKnN0cm0sIGludCBpbmZpbGUsIGludCBvdXRmaWxlKQotewotICAgIGludCByZXQsIGZpcnN0LCBsYXN0OwotICAgIHVuc2lnbmVkIGhhdmUsIGZsYWdzLCBsZW47Ci0gICAgdW5zaWduZWQgY2hhciAqbmV4dCA9IE5VTEw7Ci0gICAgc3RydWN0IGluZCBpbmQsICppbmRwOwotICAgIHN0cnVjdCBvdXRkIG91dGQ7Ci0KLSAgICAvKiBzZXR1cCBpbnB1dCBidWZmZXIgKi8KLSAgICBpbmQuaW5maWxlID0gaW5maWxlOwotICAgIGluZC5pbmJ1ZiA9IGluYnVmOwotICAgIGluZHAgPSAmaW5kOwotCi0gICAgLyogZGVjb21wcmVzcyBjb25jYXRlbmF0ZWQgZ3ppcCBzdHJlYW1zICovCi0gICAgaGF2ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGlucHV0IGRhdGEgcmVhZCBpbiB5ZXQgKi8KLSAgICBmaXJzdCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9va2luZyBmb3IgZmlyc3QgZ3ppcCBoZWFkZXIgKi8KLSAgICBzdHJtLT5uZXh0X2luID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogc28gWl9CVUZfRVJST1IgbWVhbnMgRU9GICovCi0gICAgZm9yICg7OykgewotICAgICAgICAvKiBsb29rIGZvciB0aGUgdHdvIG1hZ2ljIGhlYWRlciBieXRlcyBmb3IgYSBnemlwIHN0cmVhbSAqLwotICAgICAgICBpZiAoTkVYVCgpID09IC0xKSB7Ci0gICAgICAgICAgICByZXQgPSBaX09LOwotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbXB0eSBnemlwIHN0cmVhbSBpcyBvayAqLwotICAgICAgICB9Ci0gICAgICAgIGlmIChsYXN0ICE9IDMxIHx8IChORVhUKCkgIT0gMTM5ICYmIGxhc3QgIT0gMTU3KSkgewotICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW5jb3JyZWN0IGhlYWRlciBjaGVjayI7Ci0gICAgICAgICAgICByZXQgPSBmaXJzdCA/IFpfREFUQV9FUlJPUiA6IFpfRVJSTk87Ci0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBhIGd6aXAgb3IgY29tcHJlc3MgaGVhZGVyICovCi0gICAgICAgIH0KLSAgICAgICAgZmlyc3QgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBub24taGVhZGVyIGlzIGp1bmsgKi8KLQotICAgICAgICAvKiBwcm9jZXNzIGEgY29tcHJlc3MgKExaVykgZmlsZSAtLSBjYW4ndCBiZSBjb25jYXRlbmF0ZWQgYWZ0ZXIgdGhpcyAqLwotICAgICAgICBpZiAobGFzdCA9PSAxNTcpIHsKLSAgICAgICAgICAgIHJldCA9IGx1bnBpcGUoaGF2ZSwgbmV4dCwgaW5kcCwgb3V0ZmlsZSwgc3RybSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHByb2Nlc3MgcmVtYWluZGVyIG9mIGd6aXAgaGVhZGVyICovCi0gICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOwotICAgICAgICBpZiAoTkVYVCgpICE9IDgpIHsgICAgICAgICAgICAgICAgICAvKiBvbmx5IGRlZmxhdGUgbWV0aG9kIGFsbG93ZWQgKi8KLSAgICAgICAgICAgIGlmIChsYXN0ID09IC0xKSBicmVhazsKLSAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIjsKLSAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGZsYWdzID0gTkVYVCgpOyAgICAgICAgICAgICAgICAgICAgIC8qIGhlYWRlciBmbGFncyAqLwotICAgICAgICBORVhUKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjYXJkIG1vZCB0aW1lLCB4Zmxncywgb3MgKi8KLSAgICAgICAgTkVYVCgpOwotICAgICAgICBORVhUKCk7Ci0gICAgICAgIE5FWFQoKTsKLSAgICAgICAgTkVYVCgpOwotICAgICAgICBORVhUKCk7Ci0gICAgICAgIGlmIChsYXN0ID09IC0xKSBicmVhazsKLSAgICAgICAgaWYgKGZsYWdzICYgMHhlMCkgewotICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikidW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0IjsKLSAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmbGFncyAmIDQpIHsgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhIGZpZWxkICovCi0gICAgICAgICAgICBsZW4gPSBORVhUKCk7Ci0gICAgICAgICAgICBsZW4gKz0gKHVuc2lnbmVkKShORVhUKCkpIDw8IDg7Ci0gICAgICAgICAgICBpZiAobGFzdCA9PSAtMSkgYnJlYWs7Ci0gICAgICAgICAgICB3aGlsZSAobGVuID4gaGF2ZSkgewotICAgICAgICAgICAgICAgIGxlbiAtPSBoYXZlOwotICAgICAgICAgICAgICAgIGhhdmUgPSAwOwotICAgICAgICAgICAgICAgIGlmIChORVhUKCkgPT0gLTEpIGJyZWFrOwotICAgICAgICAgICAgICAgIGxlbi0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxhc3QgPT0gLTEpIGJyZWFrOwotICAgICAgICAgICAgaGF2ZSAtPSBsZW47Ci0gICAgICAgICAgICBuZXh0ICs9IGxlbjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmxhZ3MgJiA4KSAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxlIG5hbWUgKi8KLSAgICAgICAgICAgIHdoaWxlIChORVhUKCkgIT0gMCAmJiBsYXN0ICE9IC0xKQotICAgICAgICAgICAgICAgIDsKLSAgICAgICAgaWYgKGZsYWdzICYgMTYpICAgICAgICAgICAgICAgICAgICAgLyogY29tbWVudCAqLwotICAgICAgICAgICAgd2hpbGUgKE5FWFQoKSAhPSAwICYmIGxhc3QgIT0gLTEpCi0gICAgICAgICAgICAgICAgOwotICAgICAgICBpZiAoZmxhZ3MgJiAyKSB7ICAgICAgICAgICAgICAgICAgICAvKiBoZWFkZXIgY3JjICovCi0gICAgICAgICAgICBORVhUKCk7Ci0gICAgICAgICAgICBORVhUKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxhc3QgPT0gLTEpIGJyZWFrOwotCi0gICAgICAgIC8qIHNldCB1cCBvdXRwdXQgKi8KLSAgICAgICAgb3V0ZC5vdXRmaWxlID0gb3V0ZmlsZTsKLSAgICAgICAgb3V0ZC5jaGVjayA9IDE7Ci0gICAgICAgIG91dGQuY3JjID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7Ci0gICAgICAgIG91dGQudG90YWwgPSAwOwotCi0gICAgICAgIC8qIGRlY29tcHJlc3MgZGF0YSB0byBvdXRwdXQgKi8KLSAgICAgICAgc3RybS0+bmV4dF9pbiA9IG5leHQ7Ci0gICAgICAgIHN0cm0tPmF2YWlsX2luID0gaGF2ZTsKLSAgICAgICAgcmV0ID0gaW5mbGF0ZUJhY2soc3RybSwgaW4sIGluZHAsIG91dCwgJm91dGQpOwotICAgICAgICBpZiAocmV0ICE9IFpfU1RSRUFNX0VORCkgYnJlYWs7Ci0gICAgICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOwotICAgICAgICBoYXZlID0gc3RybS0+YXZhaWxfaW47Ci0gICAgICAgIHN0cm0tPm5leHRfaW4gPSBaX05VTEw7ICAgICAgICAgICAgIC8qIHNvIFpfQlVGX0VSUk9SIG1lYW5zIEVPRiAqLwotCi0gICAgICAgIC8qIGNoZWNrIHRyYWlsZXIgKi8KLSAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7Ci0gICAgICAgIGlmIChORVhUKCkgIT0gKGludCkob3V0ZC5jcmMgJiAweGZmKSB8fAotICAgICAgICAgICAgTkVYVCgpICE9IChpbnQpKChvdXRkLmNyYyA+PiA4KSAmIDB4ZmYpIHx8Ci0gICAgICAgICAgICBORVhUKCkgIT0gKGludCkoKG91dGQuY3JjID4+IDE2KSAmIDB4ZmYpIHx8Ci0gICAgICAgICAgICBORVhUKCkgIT0gKGludCkoKG91dGQuY3JjID4+IDI0KSAmIDB4ZmYpKSB7Ci0gICAgICAgICAgICAvKiBjcmMgZXJyb3IgKi8KLSAgICAgICAgICAgIGlmIChsYXN0ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW5jb3JyZWN0IGRhdGEgY2hlY2siOwotICAgICAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChORVhUKCkgIT0gKGludCkob3V0ZC50b3RhbCAmIDB4ZmYpIHx8Ci0gICAgICAgICAgICBORVhUKCkgIT0gKGludCkoKG91dGQudG90YWwgPj4gOCkgJiAweGZmKSB8fAotICAgICAgICAgICAgTkVYVCgpICE9IChpbnQpKChvdXRkLnRvdGFsID4+IDE2KSAmIDB4ZmYpIHx8Ci0gICAgICAgICAgICBORVhUKCkgIT0gKGludCkoKG91dGQudG90YWwgPj4gMjQpICYgMHhmZikpIHsKLSAgICAgICAgICAgIC8qIGxlbmd0aCBlcnJvciAqLwotICAgICAgICAgICAgaWYgKGxhc3QgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrIjsKLSAgICAgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGdvIGJhY2sgYW5kIGxvb2sgZm9yIGFub3RoZXIgZ3ppcCBzdHJlYW0gKi8KLSAgICB9Ci0KLSAgICAvKiBjbGVhbiB1cCBhbmQgcmV0dXJuICovCi0gICAgcmV0dXJuIHJldDsKLX0KLQotLyogQ29weSBmaWxlIGF0dHJpYnV0ZXMsIGZyb20gLT4gdG8sIGFzIGJlc3Qgd2UgY2FuLiAgVGhpcyBpcyBiZXN0IGVmZm9ydCwgc28KLSAgIG5vIGVycm9ycyBhcmUgcmVwb3J0ZWQuICBUaGUgbW9kZSBiaXRzLCBpbmNsdWRpbmcgc3VpZCwgc2dpZCwgYW5kIHRoZSBzdGlja3kKLSAgIGJpdCBhcmUgY29waWVkIChpZiBhbGxvd2VkKSwgdGhlIG93bmVyJ3MgdXNlciBpZCBhbmQgZ3JvdXAgaWQgYXJlIGNvcGllZAotICAgKGFnYWluIGlmIGFsbG93ZWQpLCBhbmQgdGhlIGFjY2VzcyBhbmQgbW9kaWZ5IHRpbWVzIGFyZSBjb3BpZWQuICovCi1sb2NhbCB2b2lkIGNvcHltZXRhKGNoYXIgKmZyb20sIGNoYXIgKnRvKQotewotICAgIHN0cnVjdCBzdGF0IHdhczsKLSAgICBzdHJ1Y3QgdXRpbWJ1ZiB3aGVuOwotCi0gICAgLyogZ2V0IGFsbCBvZiBmcm9tJ3MgVW5peCBtZXRhIGRhdGEsIHJldHVybiBpZiBub3QgYSByZWd1bGFyIGZpbGUgKi8KLSAgICBpZiAoc3RhdChmcm9tLCAmd2FzKSAhPSAwIHx8ICh3YXMuc3RfbW9kZSAmIFNfSUZNVCkgIT0gU19JRlJFRykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLyogc2V0IHRvJ3MgbW9kZSBiaXRzLCBpZ25vcmUgZXJyb3JzICovCi0gICAgKHZvaWQpY2htb2QodG8sIHdhcy5zdF9tb2RlICYgMDc3NzcpOwotCi0gICAgLyogY29weSBvd25lcidzIHVzZXIgYW5kIGdyb3VwLCBpZ25vcmUgZXJyb3JzICovCi0gICAgKHZvaWQpY2hvd24odG8sIHdhcy5zdF91aWQsIHdhcy5zdF9naWQpOwotCi0gICAgLyogY29weSBhY2Nlc3MgYW5kIG1vZGlmeSB0aW1lcywgaWdub3JlIGVycm9ycyAqLwotICAgIHdoZW4uYWN0aW1lID0gd2FzLnN0X2F0aW1lOwotICAgIHdoZW4ubW9kdGltZSA9IHdhcy5zdF9tdGltZTsKLSAgICAodm9pZCl1dGltZSh0bywgJndoZW4pOwotfQotCi0vKiBEZWNvbXByZXNzIHRoZSBmaWxlIGlubmFtZSB0byB0aGUgZmlsZSBvdXRubmFtZSwgb2YgaWYgdGVzdCBpcyB0cnVlLCBqdXN0Ci0gICBkZWNvbXByZXNzIHdpdGhvdXQgd3JpdGluZyBhbmQgY2hlY2sgdGhlIGd6aXAgdHJhaWxlciBmb3IgaW50ZWdyaXR5LiAgSWYKLSAgIGlubmFtZSBpcyBOVUxMIG9yIGFuIGVtcHR5IHN0cmluZywgcmVhZCBmcm9tIHN0ZGluLiAgSWYgb3V0bmFtZSBpcyBOVUxMIG9yCi0gICBhbiBlbXB0eSBzdHJpbmcsIHdyaXRlIHRvIHN0ZG91dC4gIHN0cm0gaXMgYSBwcmUtaW5pdGlhbGl6ZWQgaW5mbGF0ZUJhY2sKLSAgIHN0cnVjdHVyZS4gIFdoZW4gYXBwcm9wcmlhdGUsIGNvcHkgdGhlIGZpbGUgYXR0cmlidXRlcyBmcm9tIGlubmFtZSB0bwotICAgb3V0bmFtZS4KLQotICAgZ3VuemlwKCkgcmV0dXJucyAxIGlmIHRoZXJlIGlzIGFuIG91dC1vZi1tZW1vcnkgZXJyb3Igb3IgYW4gdW5leHBlY3RlZAotICAgcmV0dXJuIGNvZGUgZnJvbSBndW5waXBlKCkuICBPdGhlcndpc2UgaXQgcmV0dXJucyAwLgotICovCi1sb2NhbCBpbnQgZ3VuemlwKHpfc3RyZWFtICpzdHJtLCBjaGFyICppbm5hbWUsIGNoYXIgKm91dG5hbWUsIGludCB0ZXN0KQotewotICAgIGludCByZXQ7Ci0gICAgaW50IGluZmlsZSwgb3V0ZmlsZTsKLQotICAgIC8qIG9wZW4gZmlsZXMgKi8KLSAgICBpZiAoaW5uYW1lID09IE5VTEwgfHwgKmlubmFtZSA9PSAwKSB7Ci0gICAgICAgIGlubmFtZSA9ICItIjsKLSAgICAgICAgaW5maWxlID0gMDsgICAgIC8qIHN0ZGluICovCi0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpbmZpbGUgPSBvcGVuKGlubmFtZSwgT19SRE9OTFksIDApOwotICAgICAgICBpZiAoaW5maWxlID09IC0xKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biBjYW5ub3Qgb3BlbiAlc1xuIiwgaW5uYW1lKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICh0ZXN0KQotICAgICAgICBvdXRmaWxlID0gLTE7Ci0gICAgZWxzZSBpZiAob3V0bmFtZSA9PSBOVUxMIHx8ICpvdXRuYW1lID09IDApIHsKLSAgICAgICAgb3V0bmFtZSA9ICItIjsKLSAgICAgICAgb3V0ZmlsZSA9IDE7ICAgIC8qIHN0ZG91dCAqLwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgb3V0ZmlsZSA9IG9wZW4ob3V0bmFtZSwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX1dST05MWSwgMDY2Nik7Ci0gICAgICAgIGlmIChvdXRmaWxlID09IC0xKSB7Ci0gICAgICAgICAgICBjbG9zZShpbmZpbGUpOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gY2Fubm90IGNyZWF0ZSAlc1xuIiwgb3V0bmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlcnJubyA9IDA7Ci0KLSAgICAvKiBkZWNvbXByZXNzICovCi0gICAgcmV0ID0gZ3VucGlwZShzdHJtLCBpbmZpbGUsIG91dGZpbGUpOwotICAgIGlmIChvdXRmaWxlID4gMikgY2xvc2Uob3V0ZmlsZSk7Ci0gICAgaWYgKGluZmlsZSA+IDIpIGNsb3NlKGluZmlsZSk7Ci0KLSAgICAvKiBpbnRlcnByZXQgcmVzdWx0ICovCi0gICAgc3dpdGNoIChyZXQpIHsKLSAgICBjYXNlIFpfT0s6Ci0gICAgY2FzZSBaX0VSUk5POgotICAgICAgICBpZiAoaW5maWxlID4gMiAmJiBvdXRmaWxlID4gMikgewotICAgICAgICAgICAgY29weW1ldGEoaW5uYW1lLCBvdXRuYW1lKTsgICAgICAgICAgLyogY29weSBhdHRyaWJ1dGVzICovCi0gICAgICAgICAgICB1bmxpbmsoaW5uYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0ID09IFpfRVJSTk8pCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biB3YXJuaW5nOiB0cmFpbGluZyBnYXJiYWdlIGlnbm9yZWQgaW4gJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgIGlubmFtZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgWl9EQVRBX0VSUk9SOgotICAgICAgICBpZiAob3V0ZmlsZSA+IDIpIHVubGluayhvdXRuYW1lKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gZGF0YSBlcnJvciBvbiAlczogJXNcbiIsIGlubmFtZSwgc3RybS0+bXNnKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBaX01FTV9FUlJPUjoKLSAgICAgICAgaWYgKG91dGZpbGUgPiAyKSB1bmxpbmsob3V0bmFtZSk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIG91dCBvZiBtZW1vcnkgZXJyb3ItLWFib3J0aW5nXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBaX0JVRl9FUlJPUjoKLSAgICAgICAgaWYgKG91dGZpbGUgPiAyKSB1bmxpbmsob3V0bmFtZSk7Ci0gICAgICAgIGlmIChzdHJtLT5uZXh0X2luICE9IFpfTlVMTCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gd3JpdGUgZXJyb3Igb24gJXM6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICBvdXRuYW1lLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGVycm5vKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biByZWFkIGVycm9yIG9uICVzOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgaW5uYW1lLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gdW5leHBlY3RlZCBlbmQgb2YgZmlsZSBvbiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgaW5uYW1lKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBpZiAob3V0ZmlsZSA+IDIpIHVubGluayhvdXRuYW1lKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gaW50ZXJuYWwgZXJyb3ItLWFib3J0aW5nXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKiBQcm9jZXNzIHRoZSBndW4gY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gIFNlZSB0aGUgY29tbWFuZCBzeW50YXggbmVhciB0aGUKLSAgIGJlZ2lubmluZyBvZiB0aGlzIHNvdXJjZSBmaWxlLiAqLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGludCByZXQsIGxlbiwgdGVzdDsKLSAgICBjaGFyICpvdXRuYW1lOwotICAgIHVuc2lnbmVkIGNoYXIgKndpbmRvdzsKLSAgICB6X3N0cmVhbSBzdHJtOwotCi0gICAgLyogaW5pdGlhbGl6ZSBpbmZsYXRlQmFjayBzdGF0ZSBmb3IgcmVwZWF0ZWQgdXNlICovCi0gICAgd2luZG93ID0gbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldXNlIExaVyBtYXRjaCBidWZmZXIgKi8KLSAgICBzdHJtLnphbGxvYyA9IFpfTlVMTDsKLSAgICBzdHJtLnpmcmVlID0gWl9OVUxMOwotICAgIHN0cm0ub3BhcXVlID0gWl9OVUxMOwotICAgIHJldCA9IGluZmxhdGVCYWNrSW5pdCgmc3RybSwgMTUsIHdpbmRvdyk7Ci0gICAgaWYgKHJldCAhPSBaX09LKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIG91dCBvZiBtZW1vcnkgZXJyb3ItLWFib3J0aW5nXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyogZGVjb21wcmVzcyBlYWNoIGZpbGUgdG8gdGhlIHNhbWUgbmFtZSB3aXRoIHRoZSBzdWZmaXggcmVtb3ZlZCAqLwotICAgIGFyZ2MtLTsKLSAgICBhcmd2Kys7Ci0gICAgdGVzdCA9IDA7Ci0gICAgaWYgKGFyZ2MgJiYgc3RyY21wKCphcmd2LCAiLWgiKSA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIDEuNiAoMTcgSmFuIDIwMTApXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBNYXJrIEFkbGVyXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogZ3VuIFstdF0gW2ZpbGUxLmd6IFtmaWxlMi5aIC4uLl1dXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChhcmdjICYmIHN0cmNtcCgqYXJndiwgIi10IikgPT0gMCkgewotICAgICAgICB0ZXN0ID0gMTsKLSAgICAgICAgYXJnYy0tOwotICAgICAgICBhcmd2Kys7Ci0gICAgfQotICAgIGlmIChhcmdjKQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBpZiAodGVzdCkKLSAgICAgICAgICAgICAgICBvdXRuYW1lID0gTlVMTDsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGxlbiA9IChpbnQpc3RybGVuKCphcmd2KTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKCphcmd2ICsgbGVuIC0gMywgIi5neiIpID09IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgc3RyY21wKCphcmd2ICsgbGVuIC0gMywgIi1neiIpID09IDApCi0gICAgICAgICAgICAgICAgICAgIGxlbiAtPSAzOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiArIGxlbiAtIDIsICIueiIpID09IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgc3RyY21wKCphcmd2ICsgbGVuIC0gMiwgIi16IikgPT0gMCB8fAotICAgICAgICAgICAgICAgICAgICBzdHJjbXAoKmFyZ3YgKyBsZW4gLSAyLCAiX3oiKSA9PSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIHN0cmNtcCgqYXJndiArIGxlbiAtIDIsICIuWiIpID09IDApCi0gICAgICAgICAgICAgICAgICAgIGxlbiAtPSAyOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biBlcnJvcjogbm8gZ3ogdHlwZSBvbiAlcy0tc2tpcHBpbmdcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFyZ3YpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0bmFtZSA9IG1hbGxvYyhsZW4gKyAxKTsKLSAgICAgICAgICAgICAgICBpZiAob3V0bmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIG91dCBvZiBtZW1vcnkgZXJyb3ItLWFib3J0aW5nXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweShvdXRuYW1lLCAqYXJndiwgbGVuKTsKLSAgICAgICAgICAgICAgICBvdXRuYW1lW2xlbl0gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0ID0gZ3VuemlwKCZzdHJtLCAqYXJndiwgb3V0bmFtZSwgdGVzdCk7Ci0gICAgICAgICAgICBpZiAob3V0bmFtZSAhPSBOVUxMKSBmcmVlKG91dG5hbWUpOwotICAgICAgICAgICAgaWYgKHJldCkgYnJlYWs7Ci0gICAgICAgIH0gd2hpbGUgKGFyZ3YrKywgLS1hcmdjKTsKLSAgICBlbHNlCi0gICAgICAgIHJldCA9IGd1bnppcCgmc3RybSwgTlVMTCwgTlVMTCwgdGVzdCk7Ci0KLSAgICAvKiBjbGVhbiB1cCAqLwotICAgIGluZmxhdGVCYWNrRW5kKCZzdHJtKTsKLSAgICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvZXhhbXBsZXMvZ3phcHBlbmQuYyBiL3NyYy96bGliL2V4YW1wbGVzL2d6YXBwZW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZTg3OGUuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvZXhhbXBsZXMvZ3phcHBlbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDUwMCArMCwwIEBACi0vKiBnemFwcGVuZCAtLSBjb21tYW5kIHRvIGFwcGVuZCB0byBhIGd6aXAgZmlsZQotCi0gIENvcHlyaWdodCAoQykgMjAwMyBNYXJrIEFkbGVyLCBhbGwgcmlnaHRzIHJlc2VydmVkCi0gIHZlcnNpb24gMS4xLCA0IE5vdiAyMDAzCi0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3IgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTWFyayBBZGxlciAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ci0gKi8KLQotLyoKLSAqIENoYW5nZSBoaXN0b3J5OgotICoKLSAqIDEuMCAgMTkgT2N0IDIwMDMgICAgIC0gRmlyc3QgdmVyc2lvbgotICogMS4xICAgNCBOb3YgMjAwMyAgICAgLSBFeHBhbmQgYW5kIGNsYXJpZnkgc29tZSBjb21tZW50cyBhbmQgbm90ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gQWRkIHZlcnNpb24gYW5kIGNvcHlyaWdodCB0byBoZWxwCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIFNlbmQgaGVscCB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gQWRkIHNvbWUgcHJlZW1wdGl2ZSB0eXBlY2FzdHMKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gQWRkIEwgdG8gY29uc3RhbnRzIGluIGxzZWVrKCkgY2FsbHMKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gUmVtb3ZlIHNvbWUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGluIGVycm9yIG1lc3NhZ2VzCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIFVzZSBuZXcgZGF0YV90eXBlIGRlZmluaXRpb24gZm9yIHpsaWIgMS4yLjEKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gU2ltcGxmeSBhbmQgdW5pZnkgZmlsZSBvcGVyYXRpb25zCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIEZpbmlzaCBvZmYgZ3ppcCBmaWxlIGluIGd6dGFjaygpCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIFVzZSBkZWZsYXRlUHJpbWUoKSBpbnN0ZWFkIG9mIGFkZGluZyBlbXB0eSBibG9ja3MKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gS2VlcCBnemlwIGZpbGUgY2xlYW4gb24gYXBwZW5kZWQgZmlsZSByZWFkIGVycm9ycwotICogICAgICAgICAgICAgICAgICAgICAgLSBVc2UgaW4tcGxhY2Ugcm90YXRlIGluc3RlYWQgb2YgYXV4aWxpYXJ5IGJ1ZmZlcgotICogICAgICAgICAgICAgICAgICAgICAgICAoV2h5IHlvdSBhc2s/ICBCZWNhdXNlIGl0IHdhcyBmdW4gdG8gd3JpdGUhKQotICovCi0KLS8qCi0gICBnemFwcGVuZCB0YWtlcyBhIGd6aXAgZmlsZSBhbmQgYXBwZW5kcyB0byBpdCwgY29tcHJlc3NpbmcgZmlsZXMgZnJvbSB0aGUKLSAgIGNvbW1hbmQgbGluZSBvciBkYXRhIGZyb20gc3RkaW4uICBUaGUgZ3ppcCBmaWxlIGlzIHdyaXR0ZW4gdG8gZGlyZWN0bHksIHRvCi0gICBhdm9pZCBjb3B5aW5nIHRoYXQgZmlsZSwgaW4gY2FzZSBpdCdzIGxhcmdlLiAgTm90ZSB0aGF0IHRoaXMgcmVzdWx0cyBpbiB0aGUKLSAgIHVuZnJpZW5kbHkgYmVoYXZpb3IgdGhhdCBpZiBnemFwcGVuZCBmYWlscywgdGhlIGd6aXAgZmlsZSBpcyBjb3JydXB0ZWQuCi0KLSAgIFRoaXMgcHJvZ3JhbSB3YXMgd3JpdHRlbiB0byBpbGx1c3RyYXRlIHRoZSB1c2Ugb2YgdGhlIG5ldyBaX0JMT0NLIG9wdGlvbiBvZgotICAgemxpYiAxLjIueCdzIGluZmxhdGUoKSBmdW5jdGlvbi4gIFRoaXMgb3B0aW9uIHJldHVybnMgZnJvbSBpbmZsYXRlKCkgYXQgZWFjaAotICAgYmxvY2sgYm91bmRhcnkgdG8gZmFjaWxpdGF0ZSBsb2NhdGluZyBhbmQgbW9kaWZ5aW5nIHRoZSBsYXN0IGJsb2NrIGJpdCBhdAotICAgdGhlIHN0YXJ0IG9mIHRoZSBmaW5hbCBkZWZsYXRlIGJsb2NrLiAgQWxzbyB3aGV0aGVyIHVzaW5nIFpfQkxPQ0sgb3Igbm90LAotICAgYW5vdGhlciByZXF1aXJlZCBmZWF0dXJlIG9mIHpsaWIgMS4yLnggaXMgdGhhdCBpbmZsYXRlKCkgbm93IHByb3ZpZGVzIHRoZQotICAgbnVtYmVyIG9mIHVudXN1ZWQgYml0cyBpbiB0aGUgbGFzdCBpbnB1dCBieXRlIHVzZWQuICBnemFwcGVuZCB3aWxsIG5vdCB3b3JrCi0gICB3aXRoIHZlcnNpb25zIG9mIHpsaWIgZWFybGllciB0aGFuIDEuMi4xLgotCi0gICBnemFwcGVuZCBmaXJzdCBkZWNvbXByZXNzZXMgdGhlIGd6aXAgZmlsZSBpbnRlcm5hbGx5LCBkaXNjYXJkaW5nIGFsbCBidXQKLSAgIHRoZSBsYXN0IDMySyBvZiB1bmNvbXByZXNzZWQgZGF0YSwgYW5kIG5vdGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgYmxvY2sKLSAgIGJpdCBhbmQgdGhlIG51bWJlciBvZiB1bnVzZWQgYml0cyBpbiB0aGUgbGFzdCBieXRlIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEuCi0gICBUaGUgZ3ppcCB0cmFpbGVyIGNvbnRhaW5pbmcgdGhlIENSQy0zMiBhbmQgbGVuZ3RoIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YQotICAgaXMgdmVyaWZpZWQuICBUaGlzIHRyYWlsZXIgd2lsbCBiZSBsYXRlciBvdmVyd3JpdHRlbi4KLQotICAgVGhlbiB0aGUgbGFzdCBibG9jayBiaXQgaXMgY2xlYXJlZCBieSBzZWVraW5nIGJhY2sgaW4gdGhlIGZpbGUgYW5kIHJld3JpdGluZwotICAgdGhlIGJ5dGUgdGhhdCBjb250YWlucyBpdC4gIFNlZWtpbmcgZm9yd2FyZCwgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgY29tcHJlc3NlZAotICAgZGF0YSBpcyBzYXZlZCBhbG9uZyB3aXRoIHRoZSBudW1iZXIgb2YgdW51c2VkIGJpdHMgdG8gaW5pdGlhbGl6ZSBkZWZsYXRlLgotCi0gICBBIGRlZmxhdGUgcHJvY2VzcyBpcyBpbml0aWFsaXplZCwgdXNpbmcgdGhlIGxhc3QgMzJLIG9mIHRoZSB1bmNvbXByZXNzZWQKLSAgIGRhdGEgZnJvbSB0aGUgZ3ppcCBmaWxlIHRvIGluaXRpYWxpemUgdGhlIGRpY3Rpb25hcnkuICBJZiB0aGUgdG90YWwKLSAgIHVuY29tcHJlc3NlZCBkYXRhIHdhcyBsZXNzIHRoYW4gMzJLLCB0aGVuIGFsbCBvZiBpdCBpcyB1c2VkIHRvIGluaXRpYWxpemUKLSAgIHRoZSBkaWN0aW9uYXJ5LiAgVGhlIGRlZmxhdGUgb3V0cHV0IGJpdCBidWZmZXIgaXMgYWxzbyBpbml0aWFsaXplZCB3aXRoIHRoZQotICAgbGFzdCBiaXRzIGZyb20gdGhlIG9yaWdpbmFsIGRlZmxhdGUgc3RyZWFtLiAgRnJvbSBoZXJlIG9uLCB0aGUgZGF0YSB0bwotICAgYXBwZW5kIGlzIHNpbXBseSBjb21wcmVzc2VkIHVzaW5nIGRlZmxhdGUsIGFuZCB3cml0dGVuIHRvIHRoZSBnemlwIGZpbGUuCi0gICBXaGVuIHRoYXQgaXMgY29tcGxldGUsIHRoZSBuZXcgQ1JDLTMyIGFuZCB1bmNvbXByZXNzZWQgbGVuZ3RoIGFyZSB3cml0dGVuCi0gICBhcyB0aGUgdHJhaWxlciBvZiB0aGUgZ3ppcCBmaWxlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSAiemxpYi5oIgotCi0jZGVmaW5lIGxvY2FsIHN0YXRpYwotI2RlZmluZSBMR0NIVU5LIDE0Ci0jZGVmaW5lIENIVU5LICgxVSA8PCBMR0NIVU5LKQotI2RlZmluZSBEU0laRSAzMjc2OFUKLQotLyogcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgdGVybWluYXRlIHdpdGggZXh0cmVtZSBwcmVqdWRpY2UgKi8KLWxvY2FsIHZvaWQgYnllKGNoYXIgKm1zZzEsIGNoYXIgKm1zZzIpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICJnemFwcGVuZCBlcnJvcjogJXMlc1xuIiwgbXNnMSwgbXNnMik7Ci0gICAgZXhpdCgxKTsKLX0KLQotLyogcmV0dXJuIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiBhIGFuZCBiIHVzaW5nIEV1Y2xpZCdzIGFsZ29yaXRobSwKLSAgIG1vZGlmaWVkIHRvIGJlIGZhc3Qgd2hlbiBvbmUgYXJndW1lbnQgbXVjaCBncmVhdGVyIHRoYW4gdGhlIG90aGVyLCBhbmQKLSAgIGNvZGVkIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHN3YXBwaW5nICovCi1sb2NhbCB1bnNpZ25lZCBnY2QodW5zaWduZWQgYSwgdW5zaWduZWQgYikKLXsKLSAgICB1bnNpZ25lZCBjOwotCi0gICAgd2hpbGUgKGEgJiYgYikKLSAgICAgICAgaWYgKGEgPiBiKSB7Ci0gICAgICAgICAgICBjID0gYjsKLSAgICAgICAgICAgIHdoaWxlIChhIC0gYyA+PSBjKQotICAgICAgICAgICAgICAgIGMgPDw9IDE7Ci0gICAgICAgICAgICBhIC09IGM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjID0gYTsKLSAgICAgICAgICAgIHdoaWxlIChiIC0gYyA+PSBjKQotICAgICAgICAgICAgICAgIGMgPDw9IDE7Ci0gICAgICAgICAgICBiIC09IGM7Ci0gICAgICAgIH0KLSAgICByZXR1cm4gYSArIGI7Ci19Ci0KLS8qIHJvdGF0ZSBsaXN0WzAuLmxlbi0xXSBsZWZ0IGJ5IHJvdCBwb3NpdGlvbnMsIGluIHBsYWNlICovCi1sb2NhbCB2b2lkIHJvdGF0ZSh1bnNpZ25lZCBjaGFyICpsaXN0LCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIHJvdCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyIHRtcDsKLSAgICB1bnNpZ25lZCBjeWNsZXM7Ci0gICAgdW5zaWduZWQgY2hhciAqc3RhcnQsICpsYXN0LCAqdG8sICpmcm9tOwotCi0gICAgLyogbm9ybWFsaXplIHJvdCBhbmQgaGFuZGxlIGRlZ2VuZXJhdGUgY2FzZXMgKi8KLSAgICBpZiAobGVuIDwgMikgcmV0dXJuOwotICAgIGlmIChyb3QgPj0gbGVuKSByb3QgJT0gbGVuOwotICAgIGlmIChyb3QgPT0gMCkgcmV0dXJuOwotCi0gICAgLyogcG9pbnRlciB0byBsYXN0IGVudHJ5IGluIGxpc3QgKi8KLSAgICBsYXN0ID0gbGlzdCArIChsZW4gLSAxKTsKLQotICAgIC8qIGRvIHNpbXBsZSBsZWZ0IHNoaWZ0IGJ5IG9uZSAqLwotICAgIGlmIChyb3QgPT0gMSkgewotICAgICAgICB0bXAgPSAqbGlzdDsKLSAgICAgICAgbWVtY3B5KGxpc3QsIGxpc3QgKyAxLCBsZW4gLSAxKTsKLSAgICAgICAgKmxhc3QgPSB0bXA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBkbyBzaW1wbGUgcmlnaHQgc2hpZnQgYnkgb25lICovCi0gICAgaWYgKHJvdCA9PSBsZW4gLSAxKSB7Ci0gICAgICAgIHRtcCA9ICpsYXN0OwotICAgICAgICBtZW1tb3ZlKGxpc3QgKyAxLCBsaXN0LCBsZW4gLSAxKTsKLSAgICAgICAgKmxpc3QgPSB0bXA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBvdGhlcndpc2UgZG8gcm90YXRlIGFzIGEgc2V0IG9mIGN5Y2xlcyBpbiBwbGFjZSAqLwotICAgIGN5Y2xlcyA9IGdjZChsZW4sIHJvdCk7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjeWNsZXMgKi8KLSAgICBkbyB7Ci0gICAgICAgIHN0YXJ0ID0gZnJvbSA9IGxpc3QgKyBjeWNsZXM7ICAgLyogc3RhcnQgaW5kZXggaXMgYXJiaXRyYXJ5ICovCi0gICAgICAgIHRtcCA9ICpmcm9tOyAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSBlbnRyeSB0byBiZSBvdmVyd3JpdHRlbiAqLwotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICB0byA9IGZyb207ICAgICAgICAgICAgICAgICAgLyogbmV4dCBzdGVwIGluIGN5Y2xlICovCi0gICAgICAgICAgICBmcm9tICs9IHJvdDsgICAgICAgICAgICAgICAgLyogZ28gcmlnaHQgcm90IHBvc2l0aW9ucyAqLwotICAgICAgICAgICAgaWYgKGZyb20gPiBsYXN0KSBmcm9tIC09IGxlbjsgICAvKiAocG9pbnRlciBiZXR0ZXIgbm90IHdyYXApICovCi0gICAgICAgICAgICBpZiAoZnJvbSA9PSBzdGFydCkgYnJlYWs7ICAgLyogYWxsIGJ1dCBvbmUgc2hpZnRlZCAqLwotICAgICAgICAgICAgKnRvID0gKmZyb207ICAgICAgICAgICAgICAgIC8qIHNoaWZ0IGxlZnQgKi8KLSAgICAgICAgfQotICAgICAgICAqdG8gPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXBsZXRlIHRoZSBjaXJjbGUgKi8KLSAgICB9IHdoaWxlICgtLWN5Y2xlcyk7Ci19Ci0KLS8qIHN0cnVjdHVyZSBmb3IgZ3ppcCBmaWxlIHJlYWQgb3BlcmF0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCBmZDsgICAgICAgICAgICAgICAgICAgICAvKiBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICBpbnQgc2l6ZTsgICAgICAgICAgICAgICAgICAgLyogMSA8PCBzaXplIGlzIGJ5dGVzIGluIGJ1ZiAqLwotICAgIHVuc2lnbmVkIGxlZnQ7ICAgICAgICAgICAgICAvKiBieXRlcyBhdmFpbGFibGUgYXQgbmV4dCAqLwotICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsgICAgICAgICAvKiBidWZmZXIgKi8KLSAgICB1bnNpZ25lZCBjaGFyICpuZXh0OyAgICAgICAgLyogbmV4dCBieXRlIGluIGJ1ZmZlciAqLwotICAgIGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAvKiBmaWxlIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCi19IGZpbGU7Ci0KLS8qIHJlbG9hZCBidWZmZXIgKi8KLWxvY2FsIGludCByZWFkaW4oZmlsZSAqaW4pCi17Ci0gICAgaW50IGxlbjsKLQotICAgIGxlbiA9IHJlYWQoaW4tPmZkLCBpbi0+YnVmLCAxIDw8IGluLT5zaXplKTsKLSAgICBpZiAobGVuID09IC0xKSBieWUoImVycm9yIHJlYWRpbmcgIiwgaW4tPm5hbWUpOwotICAgIGluLT5sZWZ0ID0gKHVuc2lnbmVkKWxlbjsKLSAgICBpbi0+bmV4dCA9IGluLT5idWY7Ci0gICAgcmV0dXJuIGxlbjsKLX0KLQotLyogcmVhZCBmcm9tIGZpbGUgaW4sIGV4aXQgaWYgZW5kLW9mLWZpbGUgKi8KLWxvY2FsIGludCByZWFkbW9yZShmaWxlICppbikKLXsKLSAgICBpZiAocmVhZGluKGluKSA9PSAwKSBieWUoInVuZXhwZWN0ZWQgZW5kIG9mICIsIGluLT5uYW1lKTsKLSAgICByZXR1cm4gMDsKLX0KLQotI2RlZmluZSByZWFkMShpbikgKGluLT5sZWZ0ID09IDAgPyByZWFkbW9yZShpbikgOiAwLCBcCi0gICAgICAgICAgICAgICAgICAgaW4tPmxlZnQtLSwgKihpbi0+bmV4dCkrKykKLQotLyogc2tpcCBvdmVyIG4gYnl0ZXMgb2YgaW4gKi8KLWxvY2FsIHZvaWQgc2tpcChmaWxlICppbiwgdW5zaWduZWQgbikKLXsKLSAgICB1bnNpZ25lZCBieXBhc3M7Ci0KLSAgICBpZiAobiA+IGluLT5sZWZ0KSB7Ci0gICAgICAgIG4gLT0gaW4tPmxlZnQ7Ci0gICAgICAgIGJ5cGFzcyA9IG4gJiB+KCgxVSA8PCBpbi0+c2l6ZSkgLSAxKTsKLSAgICAgICAgaWYgKGJ5cGFzcykgewotICAgICAgICAgICAgaWYgKGxzZWVrKGluLT5mZCwgKG9mZl90KWJ5cGFzcywgU0VFS19DVVIpID09IC0xKQotICAgICAgICAgICAgICAgIGJ5ZSgic2Vla2luZyAiLCBpbi0+bmFtZSk7Ci0gICAgICAgICAgICBuIC09IGJ5cGFzczsKLSAgICAgICAgfQotICAgICAgICByZWFkbW9yZShpbik7Ci0gICAgICAgIGlmIChuID4gaW4tPmxlZnQpCi0gICAgICAgICAgICBieWUoInVuZXhwZWN0ZWQgZW5kIG9mICIsIGluLT5uYW1lKTsKLSAgICB9Ci0gICAgaW4tPmxlZnQgLT0gbjsKLSAgICBpbi0+bmV4dCArPSBuOwotfQotCi0vKiByZWFkIGEgZm91ci1ieXRlIHVuc2lnbmVkIGludGVnZXIsIGxpdHRsZS1lbmRpYW4sIGZyb20gaW4gKi8KLXVuc2lnbmVkIGxvbmcgcmVhZDQoZmlsZSAqaW4pCi17Ci0gICAgdW5zaWduZWQgbG9uZyB2YWw7Ci0KLSAgICB2YWwgPSByZWFkMShpbik7Ci0gICAgdmFsICs9ICh1bnNpZ25lZClyZWFkMShpbikgPDwgODsKLSAgICB2YWwgKz0gKHVuc2lnbmVkIGxvbmcpcmVhZDEoaW4pIDw8IDE2OwotICAgIHZhbCArPSAodW5zaWduZWQgbG9uZylyZWFkMShpbikgPDwgMjQ7Ci0gICAgcmV0dXJuIHZhbDsKLX0KLQotLyogc2tpcCBvdmVyIGd6aXAgaGVhZGVyICovCi1sb2NhbCB2b2lkIGd6aGVhZGVyKGZpbGUgKmluKQotewotICAgIGludCBmbGFnczsKLSAgICB1bnNpZ25lZCBuOwotCi0gICAgaWYgKHJlYWQxKGluKSAhPSAzMSB8fCByZWFkMShpbikgIT0gMTM5KSBieWUoaW4tPm5hbWUsICIgbm90IGEgZ3ppcCBmaWxlIik7Ci0gICAgaWYgKHJlYWQxKGluKSAhPSA4KSBieWUoInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIGluIiwgaW4tPm5hbWUpOwotICAgIGZsYWdzID0gcmVhZDEoaW4pOwotICAgIGlmIChmbGFncyAmIDB4ZTApIGJ5ZSgidW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0IGluIiwgaW4tPm5hbWUpOwotICAgIHNraXAoaW4sIDYpOwotICAgIGlmIChmbGFncyAmIDQpIHsKLSAgICAgICAgbiA9IHJlYWQxKGluKTsKLSAgICAgICAgbiArPSAodW5zaWduZWQpKHJlYWQxKGluKSkgPDwgODsKLSAgICAgICAgc2tpcChpbiwgbik7Ci0gICAgfQotICAgIGlmIChmbGFncyAmIDgpIHdoaWxlIChyZWFkMShpbikgIT0gMCkgOwotICAgIGlmIChmbGFncyAmIDE2KSB3aGlsZSAocmVhZDEoaW4pICE9IDApIDsKLSAgICBpZiAoZmxhZ3MgJiAyKSBza2lwKGluLCAyKTsKLX0KLQotLyogZGVjb21wcmVzcyBnemlwIGZpbGUgIm5hbWUiLCByZXR1cm4gc3RybSB3aXRoIGEgZGVmbGF0ZSBzdHJlYW0gcmVhZHkgdG8KLSAgIGNvbnRpbnVlIGNvbXByZXNzaW9uIG9mIHRoZSBkYXRhIGluIHRoZSBnemlwIGZpbGUsIGFuZCByZXR1cm4gYSBmaWxlCi0gICBkZXNjcmlwdG9yIHBvaW50aW5nIHRvIHdoZXJlIHRvIHdyaXRlIHRoZSBjb21wcmVzc2VkIGRhdGEgLS0gdGhlIGRlZmxhdGUKLSAgIHN0cmVhbSBpcyBpbml0aWFsaXplZCB0byBjb21wcmVzcyB1c2luZyBsZXZlbCAibGV2ZWwiICovCi1sb2NhbCBpbnQgZ3pzY2FuKGNoYXIgKm5hbWUsIHpfc3RyZWFtICpzdHJtLCBpbnQgbGV2ZWwpCi17Ci0gICAgaW50IHJldCwgbGFzdGJpdCwgbGVmdCwgZnVsbDsKLSAgICB1bnNpZ25lZCBoYXZlOwotICAgIHVuc2lnbmVkIGxvbmcgY3JjLCB0b3Q7Ci0gICAgdW5zaWduZWQgY2hhciAqd2luZG93OwotICAgIG9mZl90IGxhc3RvZmYsIGVuZDsKLSAgICBmaWxlIGd6OwotCi0gICAgLyogb3BlbiBnemlwIGZpbGUgKi8KLSAgICBnei5uYW1lID0gbmFtZTsKLSAgICBnei5mZCA9IG9wZW4obmFtZSwgT19SRFdSLCAwKTsKLSAgICBpZiAoZ3ouZmQgPT0gLTEpIGJ5ZSgiY2Fubm90IG9wZW4gIiwgbmFtZSk7Ci0gICAgZ3ouYnVmID0gbWFsbG9jKENIVU5LKTsKLSAgICBpZiAoZ3ouYnVmID09IE5VTEwpIGJ5ZSgib3V0IG9mIG1lbW9yeSIsICIiKTsKLSAgICBnei5zaXplID0gTEdDSFVOSzsKLSAgICBnei5sZWZ0ID0gMDsKLQotICAgIC8qIHNraXAgZ3ppcCBoZWFkZXIgKi8KLSAgICBnemhlYWRlcigmZ3opOwotCi0gICAgLyogcHJlcGFyZSB0byBkZWNvbXByZXNzICovCi0gICAgd2luZG93ID0gbWFsbG9jKERTSVpFKTsKLSAgICBpZiAod2luZG93ID09IE5VTEwpIGJ5ZSgib3V0IG9mIG1lbW9yeSIsICIiKTsKLSAgICBzdHJtLT56YWxsb2MgPSBaX05VTEw7Ci0gICAgc3RybS0+emZyZWUgPSBaX05VTEw7Ci0gICAgc3RybS0+b3BhcXVlID0gWl9OVUxMOwotICAgIHJldCA9IGluZmxhdGVJbml0MihzdHJtLCAtMTUpOwotICAgIGlmIChyZXQgIT0gWl9PSykgYnllKCJvdXQgb2YgbWVtb3J5IiwgIiBvciBsaWJyYXJ5IG1pc21hdGNoIik7Ci0KLSAgICAvKiBkZWNvbXByZXNzIHRoZSBkZWZsYXRlIHN0cmVhbSwgc2F2aW5nIGFwcGVuZCBpbmZvcm1hdGlvbiAqLwotICAgIGxhc3RiaXQgPSAwOwotICAgIGxhc3RvZmYgPSBsc2Vlayhnei5mZCwgMEwsIFNFRUtfQ1VSKSAtIGd6LmxlZnQ7Ci0gICAgbGVmdCA9IDA7Ci0gICAgc3RybS0+YXZhaWxfaW4gPSBnei5sZWZ0OwotICAgIHN0cm0tPm5leHRfaW4gPSBnei5uZXh0OwotICAgIGNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOwotICAgIGhhdmUgPSBmdWxsID0gMDsKLSAgICBkbyB7Ci0gICAgICAgIC8qIGlmIG5lZWRlZCwgZ2V0IG1vcmUgaW5wdXQgKi8KLSAgICAgICAgaWYgKHN0cm0tPmF2YWlsX2luID09IDApIHsKLSAgICAgICAgICAgIHJlYWRtb3JlKCZneik7Ci0gICAgICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IGd6LmxlZnQ7Ci0gICAgICAgICAgICBzdHJtLT5uZXh0X2luID0gZ3oubmV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHNldCB1cCBvdXRwdXQgdG8gbmV4dCBhdmFpbGFibGUgc2VjdGlvbiBvZiBzbGlkaW5nIHdpbmRvdyAqLwotICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBEU0laRSAtIGhhdmU7Ci0gICAgICAgIHN0cm0tPm5leHRfb3V0ID0gd2luZG93ICsgaGF2ZTsKLQotICAgICAgICAvKiBpbmZsYXRlIGFuZCBjaGVjayBmb3IgZXJyb3JzICovCi0gICAgICAgIHJldCA9IGluZmxhdGUoc3RybSwgWl9CTE9DSyk7Ci0gICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRVJST1IpIGJ5ZSgiaW50ZXJuYWwgc3RyZWFtIGVycm9yISIsICIiKTsKLSAgICAgICAgaWYgKHJldCA9PSBaX01FTV9FUlJPUikgYnllKCJvdXQgb2YgbWVtb3J5IiwgIiIpOwotICAgICAgICBpZiAocmV0ID09IFpfREFUQV9FUlJPUikKLSAgICAgICAgICAgIGJ5ZSgiaW52YWxpZCBjb21wcmVzc2VkIGRhdGEtLWZvcm1hdCB2aW9sYXRlZCBpbiIsIG5hbWUpOwotCi0gICAgICAgIC8qIHVwZGF0ZSBjcmMgYW5kIHNsaWRpbmcgd2luZG93IHBvaW50ZXIgKi8KLSAgICAgICAgY3JjID0gY3JjMzIoY3JjLCB3aW5kb3cgKyBoYXZlLCBEU0laRSAtIGhhdmUgLSBzdHJtLT5hdmFpbF9vdXQpOwotICAgICAgICBpZiAoc3RybS0+YXZhaWxfb3V0KQotICAgICAgICAgICAgaGF2ZSA9IERTSVpFIC0gc3RybS0+YXZhaWxfb3V0OwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGhhdmUgPSAwOwotICAgICAgICAgICAgZnVsbCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBwcm9jZXNzIGVuZCBvZiBibG9jayAqLwotICAgICAgICBpZiAoc3RybS0+ZGF0YV90eXBlICYgMTI4KSB7Ci0gICAgICAgICAgICBpZiAoc3RybS0+ZGF0YV90eXBlICYgNjQpCi0gICAgICAgICAgICAgICAgbGVmdCA9IHN0cm0tPmRhdGFfdHlwZSAmIDB4MWY7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsYXN0Yml0ID0gc3RybS0+ZGF0YV90eXBlICYgMHgxZjsKLSAgICAgICAgICAgICAgICBsYXN0b2ZmID0gbHNlZWsoZ3ouZmQsIDBMLCBTRUVLX0NVUikgLSBzdHJtLT5hdmFpbF9pbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gd2hpbGUgKHJldCAhPSBaX1NUUkVBTV9FTkQpOwotICAgIGluZmxhdGVFbmQoc3RybSk7Ci0gICAgZ3oubGVmdCA9IHN0cm0tPmF2YWlsX2luOwotICAgIGd6Lm5leHQgPSBzdHJtLT5uZXh0X2luOwotCi0gICAgLyogc2F2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhICovCi0gICAgZW5kID0gbHNlZWsoZ3ouZmQsIDBMLCBTRUVLX0NVUikgLSBnei5sZWZ0OwotCi0gICAgLyogY2hlY2sgZ3ppcCB0cmFpbGVyIGFuZCBzYXZlIHRvdGFsIGZvciBkZWZsYXRlICovCi0gICAgaWYgKGNyYyAhPSByZWFkNCgmZ3opKQotICAgICAgICBieWUoImludmFsaWQgY29tcHJlc3NlZCBkYXRhLS1jcmMgbWlzbWF0Y2ggaW4gIiwgbmFtZSk7Ci0gICAgdG90ID0gc3RybS0+dG90YWxfb3V0OwotICAgIGlmICgodG90ICYgMHhmZmZmZmZmZlVMKSAhPSByZWFkNCgmZ3opKQotICAgICAgICBieWUoImludmFsaWQgY29tcHJlc3NlZCBkYXRhLS1sZW5ndGggbWlzbWF0Y2ggaW4iLCBuYW1lKTsKLQotICAgIC8qIGlmIG5vdCBhdCBlbmQgb2YgZmlsZSwgd2FybiAqLwotICAgIGlmIChnei5sZWZ0IHx8IHJlYWRpbigmZ3opKQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICJnemFwcGVuZCB3YXJuaW5nOiBqdW5rIGF0IGVuZCBvZiBnemlwIGZpbGUgb3ZlcndyaXR0ZW5cbiIpOwotCi0gICAgLyogY2xlYXIgbGFzdCBibG9jayBiaXQgKi8KLSAgICBsc2Vlayhnei5mZCwgbGFzdG9mZiAtIChsYXN0Yml0ICE9IDApLCBTRUVLX1NFVCk7Ci0gICAgaWYgKHJlYWQoZ3ouZmQsIGd6LmJ1ZiwgMSkgIT0gMSkgYnllKCJyZWFkaW5nIGFmdGVyIHNlZWsgb24gIiwgbmFtZSk7Ci0gICAgKmd6LmJ1ZiA9ICh1bnNpZ25lZCBjaGFyKSgqZ3ouYnVmIF4gKDEgPDwgKCg4IC0gbGFzdGJpdCkgJiA3KSkpOwotICAgIGxzZWVrKGd6LmZkLCAtMUwsIFNFRUtfQ1VSKTsKLSAgICBpZiAod3JpdGUoZ3ouZmQsIGd6LmJ1ZiwgMSkgIT0gMSkgYnllKCJ3cml0aW5nIGFmdGVyIHNlZWsgdG8gIiwgbmFtZSk7Ci0KLSAgICAvKiBpZiB3aW5kb3cgd3JhcHBlZCwgYnVpbGQgZGljdGlvbmFyeSBmcm9tIHdpbmRvdyBieSByb3RhdGluZyAqLwotICAgIGlmIChmdWxsKSB7Ci0gICAgICAgIHJvdGF0ZSh3aW5kb3csIERTSVpFLCBoYXZlKTsKLSAgICAgICAgaGF2ZSA9IERTSVpFOwotICAgIH0KLQotICAgIC8qIHNldCB1cCBkZWZsYXRlIHN0cmVhbSB3aXRoIHdpbmRvdywgY3JjLCB0b3RhbF9pbiwgYW5kIGxlZnRvdmVyIGJpdHMgKi8KLSAgICByZXQgPSBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIFpfREVGTEFURUQsIC0xNSwgOCwgWl9ERUZBVUxUX1NUUkFURUdZKTsKLSAgICBpZiAocmV0ICE9IFpfT0spIGJ5ZSgib3V0IG9mIG1lbW9yeSIsICIiKTsKLSAgICBkZWZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCB3aW5kb3csIGhhdmUpOwotICAgIHN0cm0tPmFkbGVyID0gY3JjOwotICAgIHN0cm0tPnRvdGFsX2luID0gdG90OwotICAgIGlmIChsZWZ0KSB7Ci0gICAgICAgIGxzZWVrKGd6LmZkLCAtLWVuZCwgU0VFS19TRVQpOwotICAgICAgICBpZiAocmVhZChnei5mZCwgZ3ouYnVmLCAxKSAhPSAxKSBieWUoInJlYWRpbmcgYWZ0ZXIgc2VlayBvbiAiLCBuYW1lKTsKLSAgICAgICAgZGVmbGF0ZVByaW1lKHN0cm0sIDggLSBsZWZ0LCAqZ3ouYnVmKTsKLSAgICB9Ci0gICAgbHNlZWsoZ3ouZmQsIGVuZCwgU0VFS19TRVQpOwotCi0gICAgLyogY2xlYW4gdXAgYW5kIHJldHVybiAqLwotICAgIGZyZWUod2luZG93KTsKLSAgICBmcmVlKGd6LmJ1Zik7Ci0gICAgcmV0dXJuIGd6LmZkOwotfQotCi0vKiBhcHBlbmQgZmlsZSAibmFtZSIgdG8gZ3ppcCBmaWxlIGdkIHVzaW5nIGRlZmxhdGUgc3RyZWFtIHN0cm0gLS0gaWYgbGFzdAotICAgaXMgdHJ1ZSwgdGhlbiBmaW5pc2ggb2ZmIHRoZSBkZWZsYXRlIHN0cmVhbSBhdCB0aGUgZW5kICovCi1sb2NhbCB2b2lkIGd6dGFjayhjaGFyICpuYW1lLCBpbnQgZ2QsIHpfc3RyZWFtICpzdHJtLCBpbnQgbGFzdCkKLXsKLSAgICBpbnQgZmQsIGxlbiwgcmV0OwotICAgIHVuc2lnbmVkIGxlZnQ7Ci0gICAgdW5zaWduZWQgY2hhciAqaW4sICpvdXQ7Ci0KLSAgICAvKiBvcGVuIGZpbGUgdG8gY29tcHJlc3MgYW5kIGFwcGVuZCAqLwotICAgIGZkID0gMDsKLSAgICBpZiAobmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgIGZkID0gb3BlbihuYW1lLCBPX1JET05MWSwgMCk7Ci0gICAgICAgIGlmIChmZCA9PSAtMSkKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3phcHBlbmQgd2FybmluZzogJXMgbm90IGZvdW5kLCBza2lwcGluZyAuLi5cbiIsCi0gICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgIH0KLQotICAgIC8qIGFsbG9jYXRlIGJ1ZmZlcnMgKi8KLSAgICBpbiA9IGZkID09IC0xID8gTlVMTCA6IG1hbGxvYyhDSFVOSyk7Ci0gICAgb3V0ID0gbWFsbG9jKENIVU5LKTsKLSAgICBpZiAob3V0ID09IE5VTEwpIGJ5ZSgib3V0IG9mIG1lbW9yeSIsICIiKTsKLQotICAgIC8qIGNvbXByZXNzIGlucHV0IGZpbGUgYW5kIGFwcGVuZCB0byBnemlwIGZpbGUgKi8KLSAgICBkbyB7Ci0gICAgICAgIC8qIGdldCBtb3JlIGlucHV0ICovCi0gICAgICAgIGxlbiA9IGZkID09IC0xID8gMCA6IHJlYWQoZmQsIGluLCBDSFVOSyk7Ci0gICAgICAgIGlmIChsZW4gPT0gLTEpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgICAgICAgICAiZ3phcHBlbmQgd2FybmluZzogZXJyb3IgcmVhZGluZyAlcywgc2tpcHBpbmcgcmVzdCAuLi5cbiIsCi0gICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgICAgICAgbGVuID0gMDsKLSAgICAgICAgfQotICAgICAgICBzdHJtLT5hdmFpbF9pbiA9ICh1bnNpZ25lZClsZW47Ci0gICAgICAgIHN0cm0tPm5leHRfaW4gPSBpbjsKLSAgICAgICAgaWYgKGxlbikgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgaW4sICh1bnNpZ25lZClsZW4pOwotCi0gICAgICAgIC8qIGNvbXByZXNzIGFuZCB3cml0ZSBhbGwgYXZhaWxhYmxlIG91dHB1dCAqLwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBDSFVOSzsKLSAgICAgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gb3V0OwotICAgICAgICAgICAgcmV0ID0gZGVmbGF0ZShzdHJtLCBsYXN0ICYmIGxlbiA9PSAwID8gWl9GSU5JU0ggOiBaX05PX0ZMVVNIKTsKLSAgICAgICAgICAgIGxlZnQgPSBDSFVOSyAtIHN0cm0tPmF2YWlsX291dDsKLSAgICAgICAgICAgIHdoaWxlIChsZWZ0KSB7Ci0gICAgICAgICAgICAgICAgbGVuID0gd3JpdGUoZ2QsIG91dCArIENIVU5LIC0gc3RybS0+YXZhaWxfb3V0IC0gbGVmdCwgbGVmdCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAtMSkgYnllKCJ3cml0aW5nIGd6aXAgZmlsZSIsICIiKTsKLSAgICAgICAgICAgICAgICBsZWZ0IC09ICh1bnNpZ25lZClsZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKHN0cm0tPmF2YWlsX291dCA9PSAwICYmIHJldCAhPSBaX1NUUkVBTV9FTkQpOwotICAgIH0gd2hpbGUgKGxlbiAhPSAwKTsKLQotICAgIC8qIHdyaXRlIHRyYWlsZXIgYWZ0ZXIgbGFzdCBlbnRyeSAqLwotICAgIGlmIChsYXN0KSB7Ci0gICAgICAgIGRlZmxhdGVFbmQoc3RybSk7Ci0gICAgICAgIG91dFswXSA9ICh1bnNpZ25lZCBjaGFyKShzdHJtLT5hZGxlcik7Ci0gICAgICAgIG91dFsxXSA9ICh1bnNpZ25lZCBjaGFyKShzdHJtLT5hZGxlciA+PiA4KTsKLSAgICAgICAgb3V0WzJdID0gKHVuc2lnbmVkIGNoYXIpKHN0cm0tPmFkbGVyID4+IDE2KTsKLSAgICAgICAgb3V0WzNdID0gKHVuc2lnbmVkIGNoYXIpKHN0cm0tPmFkbGVyID4+IDI0KTsKLSAgICAgICAgb3V0WzRdID0gKHVuc2lnbmVkIGNoYXIpKHN0cm0tPnRvdGFsX2luKTsKLSAgICAgICAgb3V0WzVdID0gKHVuc2lnbmVkIGNoYXIpKHN0cm0tPnRvdGFsX2luID4+IDgpOwotICAgICAgICBvdXRbNl0gPSAodW5zaWduZWQgY2hhcikoc3RybS0+dG90YWxfaW4gPj4gMTYpOwotICAgICAgICBvdXRbN10gPSAodW5zaWduZWQgY2hhcikoc3RybS0+dG90YWxfaW4gPj4gMjQpOwotICAgICAgICBsZW4gPSA4OwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICByZXQgPSB3cml0ZShnZCwgb3V0ICsgOCAtIGxlbiwgbGVuKTsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gLTEpIGJ5ZSgid3JpdGluZyBnemlwIGZpbGUiLCAiIik7Ci0gICAgICAgICAgICBsZW4gLT0gcmV0OwotICAgICAgICB9IHdoaWxlIChsZW4pOwotICAgICAgICBjbG9zZShnZCk7Ci0gICAgfQotCi0gICAgLyogY2xlYW4gdXAgYW5kIHJldHVybiAqLwotICAgIGZyZWUob3V0KTsKLSAgICBpZiAoaW4gIT0gTlVMTCkgZnJlZShpbik7Ci0gICAgaWYgKGZkID4gMCkgY2xvc2UoZmQpOwotfQotCi0vKiBwcm9jZXNzIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBvcHRpb24gaWYgcHJlc2VudCwgc2NhbiB0aGUgZ3ppcCBmaWxlLCBhbmQKLSAgIGFwcGVuZCB0aGUgc3BlY2lmaWVkIGZpbGVzLCBvciBhcHBlbmQgdGhlIGRhdGEgZnJvbSBzdGRpbiBpZiBubyBvdGhlciBmaWxlCi0gICBuYW1lcyBhcmUgcHJvdmlkZWQgb24gdGhlIGNvbW1hbmQgbGluZSAtLSB0aGUgZ3ppcCBmaWxlIG11c3QgYmUgd3JpdGFibGUKLSAgIGFuZCBzZWVrYWJsZSAqLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGludCBnZCwgbGV2ZWw7Ci0gICAgel9zdHJlYW0gc3RybTsKLQotICAgIC8qIGlnbm9yZSBjb21tYW5kIG5hbWUgKi8KLSAgICBhcmd2Kys7Ci0KLSAgICAvKiBwcm92aWRlIHVzYWdlIGlmIG5vIGFyZ3VtZW50cyAqLwotICAgIGlmICgqYXJndiA9PSBOVUxMKSB7Ci0gICAgICAgIHByaW50ZigiZ3phcHBlbmQgMS4xICg0IE5vdiAyMDAzKSBDb3B5cmlnaHQgKEMpIDIwMDMgTWFyayBBZGxlclxuIik7Ci0gICAgICAgIHByaW50ZigKLSAgICAgICAgICAgICJ1c2FnZTogZ3phcHBlbmQgWy1sZXZlbF0gZmlsZS5neiBbIGFkZHRoaXMgWyBhbmR0aGlzIC4uLiBdXVxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIHNldCBjb21wcmVzc2lvbiBsZXZlbCAqLwotICAgIGxldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OOwotICAgIGlmIChhcmd2WzBdWzBdID09ICctJykgewotICAgICAgICBpZiAoYXJndlswXVsxXSA8ICcwJyB8fCBhcmd2WzBdWzFdID4gJzknIHx8IGFyZ3ZbMF1bMl0gIT0gMCkKLSAgICAgICAgICAgIGJ5ZSgiaW52YWxpZCBjb21wcmVzc2lvbiBsZXZlbCIsICIiKTsKLSAgICAgICAgbGV2ZWwgPSBhcmd2WzBdWzFdIC0gJzAnOwotICAgICAgICBpZiAoKisrYXJndiA9PSBOVUxMKSBieWUoIm5vIGd6aXAgZmlsZSBuYW1lIGFmdGVyIG9wdGlvbnMiLCAiIik7Ci0gICAgfQotCi0gICAgLyogcHJlcGFyZSB0byBhcHBlbmQgdG8gZ3ppcCBmaWxlICovCi0gICAgZ2QgPSBnenNjYW4oKmFyZ3YrKywgJnN0cm0sIGxldmVsKTsKLQotICAgIC8qIGFwcGVuZCBmaWxlcyBvbiBjb21tYW5kIGxpbmUsIG9yIGZyb20gc3RkaW4gaWYgbm9uZSAqLwotICAgIGlmICgqYXJndiA9PSBOVUxMKQotICAgICAgICBnenRhY2soTlVMTCwgZ2QsICZzdHJtLCAxKTsKLSAgICBlbHNlCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGd6dGFjaygqYXJndiwgZ2QsICZzdHJtLCBhcmd2WzFdID09IE5VTEwpOwotICAgICAgICB9IHdoaWxlICgqKythcmd2ICE9IE5VTEwpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvZXhhbXBsZXMvZ3pqb2luLmMgYi9zcmMvemxpYi9leGFtcGxlcy9nempvaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5MzQ3Yy4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9leGFtcGxlcy9nempvaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKiBnempvaW4gLS0gY29tbWFuZCB0byBqb2luIGd6aXAgZmlsZXMgaW50byBvbmUgZ3ppcCBmaWxlCi0KLSAgQ29weXJpZ2h0IChDKSAyMDA0IE1hcmsgQWRsZXIsIGFsbCByaWdodHMgcmVzZXJ2ZWQKLSAgdmVyc2lvbiAxLjAsIDExIERlYyAyMDA0Ci0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3IgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTWFyayBBZGxlciAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ci0gKi8KLQotLyoKLSAqIENoYW5nZSBoaXN0b3J5OgotICoKLSAqIDEuMCAgMTEgRGVjIDIwMDQgICAgIC0gRmlyc3QgdmVyc2lvbgotICogMS4xICAxMiBKdW4gMjAwNSAgICAgLSBDaGFuZ2VkIHNzaXplX3QgdG8gbG9uZyBmb3IgcG9ydGFiaWxpdHkKLSAqLwotCi0vKgotICAgZ3pqb2luIHRha2VzIG9uZSBvciBtb3JlIGd6aXAgZmlsZXMgb24gdGhlIGNvbW1hbmQgbGluZSBhbmQgd3JpdGVzIG91dCBhCi0gICBzaW5nbGUgZ3ppcCBmaWxlIHRoYXQgd2lsbCB1bmNvbXByZXNzIHRvIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZQotICAgdW5jb21wcmVzc2VkIGRhdGEgZnJvbSB0aGUgaW5kaXZpZHVhbCBnemlwIGZpbGVzLiAgZ3pqb2luIGRvZXMgdGhpcyB3aXRob3V0Ci0gICBoYXZpbmcgdG8gcmVjb21wcmVzcyBhbnkgb2YgdGhlIGRhdGEgYW5kIHdpdGhvdXQgaGF2aW5nIHRvIGNhbGN1bGF0ZSBhIG5ldwotICAgY3JjMzIgZm9yIHRoZSBjb25jYXRlbmF0ZWQgdW5jb21wcmVzc2VkIGRhdGEuICBnempvaW4gZG9lcyBob3dldmVyIGhhdmUgdG8KLSAgIGRlY29tcHJlc3MgYWxsIG9mIHRoZSBpbnB1dCBkYXRhIGluIG9yZGVyIHRvIGZpbmQgdGhlIGJpdHMgaW4gdGhlIGNvbXByZXNzZWQKLSAgIGRhdGEgdGhhdCBuZWVkIHRvIGJlIG1vZGlmaWVkIHRvIGNvbmNhdGVuYXRlIHRoZSBzdHJlYW1zLgotCi0gICBnempvaW4gZG9lcyBub3QgZG8gYW4gaW50ZWdyaXR5IGNoZWNrIG9uIHRoZSBpbnB1dCBnemlwIGZpbGVzIG90aGVyIHRoYW4KLSAgIGNoZWNraW5nIHRoZSBnemlwIGhlYWRlciBhbmQgZGVjb21wcmVzc2luZyB0aGUgY29tcHJlc3NlZCBkYXRhLiAgVGhleSBhcmUKLSAgIG90aGVyd2lzZSBhc3N1bWVkIHRvIGJlIGNvbXBsZXRlIGFuZCBjb3JyZWN0LgotCi0gICBFYWNoIGpvaW50IGJldHdlZW4gZ3ppcCBmaWxlcyByZW1vdmVzIGF0IGxlYXN0IDE4IGJ5dGVzIG9mIHByZXZpb3VzIHRyYWlsZXIKLSAgIGFuZCBzdWJzZXF1ZW50IGhlYWRlciwgYW5kIGluc2VydHMgYW4gYXZlcmFnZSBvZiBhYm91dCB0aHJlZSBieXRlcyB0byB0aGUKLSAgIGNvbXByZXNzZWQgZGF0YSBpbiBvcmRlciB0byBjb25uZWN0IHRoZSBzdHJlYW1zLiAgVGhlIG91dHB1dCBnemlwIGZpbGUKLSAgIGhhcyBhIG1pbmltYWwgdGVuLWJ5dGUgZ3ppcCBoZWFkZXIgd2l0aCBubyBmaWxlIG5hbWUgb3IgbW9kaWZpY2F0aW9uIHRpbWUuCi0KLSAgIFRoaXMgcHJvZ3JhbSB3YXMgd3JpdHRlbiB0byBpbGx1c3RyYXRlIHRoZSB1c2Ugb2YgdGhlIFpfQkxPQ0sgb3B0aW9uIG9mCi0gICBpbmZsYXRlKCkgYW5kIHRoZSBjcmMzMl9jb21iaW5lKCkgZnVuY3Rpb24uICBnempvaW4gd2lsbCBub3QgY29tcGlsZSB3aXRoCi0gICB2ZXJzaW9ucyBvZiB6bGliIGVhcmxpZXIgdGhhbiAxLjIuMy4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4gICAgICAvKiBmcHV0cygpLCBmcHJpbnRmKCksIGZ3cml0ZSgpLCBwdXRjKCkgKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4gICAgIC8qIGV4aXQoKSwgbWFsbG9jKCksIGZyZWUoKSAqLwotI2luY2x1ZGUgPGZjbnRsLmg+ICAgICAgLyogb3BlbigpICovCi0jaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAvKiBjbG9zZSgpLCByZWFkKCksIGxzZWVrKCkgKi8KLSNpbmNsdWRlICJ6bGliLmgiCi0gICAgLyogY3JjMzIoKSwgY3JjMzJfY29tYmluZSgpLCBpbmZsYXRlSW5pdDIoKSwgaW5mbGF0ZSgpLCBpbmZsYXRlRW5kKCkgKi8KLQotI2RlZmluZSBsb2NhbCBzdGF0aWMKLQotLyogZXhpdCB3aXRoIGFuIGVycm9yIChyZXR1cm4gYSB2YWx1ZSB0byBhbGxvdyB1c2UgaW4gYW4gZXhwcmVzc2lvbikgKi8KLWxvY2FsIGludCBiYWlsKGNoYXIgKndoeTEsIGNoYXIgKndoeTIpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICJnempvaW4gZXJyb3I6ICVzJXMsIG91dHB1dCBpbmNvbXBsZXRlXG4iLCB3aHkxLCB3aHkyKTsKLSAgICBleGl0KDEpOwotICAgIHJldHVybiAwOwotfQotCi0vKiAtLSBzaW1wbGUgYnVmZmVyZWQgZmlsZSBpbnB1dCB3aXRoIGFjY2VzcyB0byB0aGUgYnVmZmVyIC0tICovCi0KLSNkZWZpbmUgQ0hVTksgMzI3NjggICAgICAgICAvKiBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvIGFuZCBmaXQgaW4gdW5zaWduZWQgKi8KLQotLyogYmluIGJ1ZmZlcmVkIGlucHV0IGZpbGUgdHlwZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgKm5hbWU7ICAgICAgICAgICAgIC8qIG5hbWUgb2YgZmlsZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KLSAgICBpbnQgZmQ7ICAgICAgICAgICAgICAgICAvKiBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICB1bnNpZ25lZCBsZWZ0OyAgICAgICAgICAvKiBieXRlcyByZW1haW5pbmcgYXQgbmV4dCAqLwotICAgIHVuc2lnbmVkIGNoYXIgKm5leHQ7ICAgIC8qIG5leHQgYnl0ZSB0byByZWFkICovCi0gICAgdW5zaWduZWQgY2hhciAqYnVmOyAgICAgLyogYWxsb2NhdGVkIGJ1ZmZlciBvZiBsZW5ndGggQ0hVTksgKi8KLX0gYmluOwotCi0vKiBjbG9zZSBhIGJ1ZmZlcmVkIGZpbGUgYW5kIGZyZWUgYWxsb2NhdGVkIG1lbW9yeSAqLwotbG9jYWwgdm9pZCBiY2xvc2UoYmluICppbikKLXsKLSAgICBpZiAoaW4gIT0gTlVMTCkgewotICAgICAgICBpZiAoaW4tPmZkICE9IC0xKQotICAgICAgICAgICAgY2xvc2UoaW4tPmZkKTsKLSAgICAgICAgaWYgKGluLT5idWYgIT0gTlVMTCkKLSAgICAgICAgICAgIGZyZWUoaW4tPmJ1Zik7Ci0gICAgICAgIGZyZWUoaW4pOwotICAgIH0KLX0KLQotLyogb3BlbiBhIGJ1ZmZlcmVkIGZpbGUgZm9yIGlucHV0LCByZXR1cm4gYSBwb2ludGVyIHRvIHR5cGUgYmluLCBvciBOVUxMIG9uCi0gICBmYWlsdXJlICovCi1sb2NhbCBiaW4gKmJvcGVuKGNoYXIgKm5hbWUpCi17Ci0gICAgYmluICppbjsKLQotICAgIGluID0gbWFsbG9jKHNpemVvZihiaW4pKTsKLSAgICBpZiAoaW4gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaW4tPmJ1ZiA9IG1hbGxvYyhDSFVOSyk7Ci0gICAgaW4tPmZkID0gb3BlbihuYW1lLCBPX1JET05MWSwgMCk7Ci0gICAgaWYgKGluLT5idWYgPT0gTlVMTCB8fCBpbi0+ZmQgPT0gLTEpIHsKLSAgICAgICAgYmNsb3NlKGluKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGluLT5sZWZ0ID0gMDsKLSAgICBpbi0+bmV4dCA9IGluLT5idWY7Ci0gICAgaW4tPm5hbWUgPSBuYW1lOwotICAgIHJldHVybiBpbjsKLX0KLQotLyogbG9hZCBidWZmZXIgZnJvbSBmaWxlLCByZXR1cm4gLTEgb24gcmVhZCBlcnJvciwgMCBvciAxIG9uIHN1Y2Nlc3MsIHdpdGgKLSAgIDEgaW5kaWNhdGluZyB0aGF0IGVuZC1vZi1maWxlIHdhcyByZWFjaGVkICovCi1sb2NhbCBpbnQgYmxvYWQoYmluICppbikKLXsKLSAgICBsb25nIGxlbjsKLQotICAgIGlmIChpbiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKGluLT5sZWZ0ICE9IDApCi0gICAgICAgIHJldHVybiAwOwotICAgIGluLT5uZXh0ID0gaW4tPmJ1ZjsKLSAgICBkbyB7Ci0gICAgICAgIGxlbiA9IChsb25nKXJlYWQoaW4tPmZkLCBpbi0+YnVmICsgaW4tPmxlZnQsIENIVU5LIC0gaW4tPmxlZnQpOwotICAgICAgICBpZiAobGVuIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaW4tPmxlZnQgKz0gKHVuc2lnbmVkKWxlbjsKLSAgICB9IHdoaWxlIChsZW4gIT0gMCAmJiBpbi0+bGVmdCA8IENIVU5LKTsKLSAgICByZXR1cm4gbGVuID09IDAgPyAxIDogMDsKLX0KLQotLyogZ2V0IGEgYnl0ZSBmcm9tIHRoZSBmaWxlLCBiYWlsIGlmIGVuZCBvZiBmaWxlICovCi0jZGVmaW5lIGJnZXQoaW4pIChpbi0+bGVmdCA/IDAgOiBibG9hZChpbiksIFwKLSAgICAgICAgICAgICAgICAgIGluLT5sZWZ0ID8gKGluLT5sZWZ0LS0sICooaW4tPm5leHQpKyspIDogXAotICAgICAgICAgICAgICAgICAgICBiYWlsKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIG9uICIsIGluLT5uYW1lKSkKLQotLyogZ2V0IGEgZm91ci1ieXRlIGxpdHRsZS1lbmRpYW4gdW5zaWduZWQgaW50ZWdlciBmcm9tIGZpbGUgKi8KLWxvY2FsIHVuc2lnbmVkIGxvbmcgYmdldDQoYmluICppbikKLXsKLSAgICB1bnNpZ25lZCBsb25nIHZhbDsKLQotICAgIHZhbCA9IGJnZXQoaW4pOwotICAgIHZhbCArPSAodW5zaWduZWQgbG9uZykoYmdldChpbikpIDw8IDg7Ci0gICAgdmFsICs9ICh1bnNpZ25lZCBsb25nKShiZ2V0KGluKSkgPDwgMTY7Ci0gICAgdmFsICs9ICh1bnNpZ25lZCBsb25nKShiZ2V0KGluKSkgPDwgMjQ7Ci0gICAgcmV0dXJuIHZhbDsKLX0KLQotLyogc2tpcCBieXRlcyBpbiBmaWxlICovCi1sb2NhbCB2b2lkIGJza2lwKGJpbiAqaW4sIHVuc2lnbmVkIHNraXApCi17Ci0gICAgLyogY2hlY2sgcG9pbnRlciAqLwotICAgIGlmIChpbiA9PSBOVUxMKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvKiBlYXN5IGNhc2UgLS0gc2tpcCBieXRlcyBpbiBidWZmZXIgKi8KLSAgICBpZiAoc2tpcCA8PSBpbi0+bGVmdCkgewotICAgICAgICBpbi0+bGVmdCAtPSBza2lwOwotICAgICAgICBpbi0+bmV4dCArPSBza2lwOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogc2tpcCB3aGF0J3MgaW4gYnVmZmVyLCBkaXNjYXJkIGJ1ZmZlciBjb250ZW50cyAqLwotICAgIHNraXAgLT0gaW4tPmxlZnQ7Ci0gICAgaW4tPmxlZnQgPSAwOwotCi0gICAgLyogc2VlayBwYXN0IG11bHRpcGxlcyBvZiBDSFVOSyBieXRlcyAqLwotICAgIGlmIChza2lwID4gQ0hVTkspIHsKLSAgICAgICAgdW5zaWduZWQgbGVmdDsKLQotICAgICAgICBsZWZ0ID0gc2tpcCAmIChDSFVOSyAtIDEpOwotICAgICAgICBpZiAobGVmdCA9PSAwKSB7Ci0gICAgICAgICAgICAvKiBleGFjdCBudW1iZXIgb2YgY2h1bmtzOiBzZWVrIGFsbCB0aGUgd2F5IG1pbnVzIG9uZSBieXRlIHRvIGNoZWNrCi0gICAgICAgICAgICAgICBmb3IgZW5kLW9mLWZpbGUgd2l0aCBhIHJlYWQgKi8KLSAgICAgICAgICAgIGxzZWVrKGluLT5mZCwgc2tpcCAtIDEsIFNFRUtfQ1VSKTsKLSAgICAgICAgICAgIGlmIChyZWFkKGluLT5mZCwgaW4tPmJ1ZiwgMSkgIT0gMSkKLSAgICAgICAgICAgICAgICBiYWlsKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIG9uICIsIGluLT5uYW1lKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHNraXAgdGhlIGludGVncmFsIGNodW5rcywgdXBkYXRlIHNraXAgd2l0aCByZW1haW5kZXIgKi8KLSAgICAgICAgbHNlZWsoaW4tPmZkLCBza2lwIC0gbGVmdCwgU0VFS19DVVIpOwotICAgICAgICBza2lwID0gbGVmdDsKLSAgICB9Ci0KLSAgICAvKiByZWFkIG1vcmUgaW5wdXQgYW5kIHNraXAgcmVtYWluZGVyICovCi0gICAgYmxvYWQoaW4pOwotICAgIGlmIChza2lwID4gaW4tPmxlZnQpCi0gICAgICAgIGJhaWwoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgb24gIiwgaW4tPm5hbWUpOwotICAgIGluLT5sZWZ0IC09IHNraXA7Ci0gICAgaW4tPm5leHQgKz0gc2tpcDsKLX0KLQotLyogLS0gZW5kIG9mIGJ1ZmZlcmVkIGlucHV0IGZ1bmN0aW9ucyAtLSAqLwotCi0vKiBza2lwIHRoZSBnemlwIGhlYWRlciBmcm9tIGZpbGUgaW4gKi8KLWxvY2FsIHZvaWQgZ3poZWFkKGJpbiAqaW4pCi17Ci0gICAgaW50IGZsYWdzOwotCi0gICAgLyogdmVyaWZ5IGd6aXAgbWFnaWMgaGVhZGVyIGFuZCBjb21wcmVzc2lvbiBtZXRob2QgKi8KLSAgICBpZiAoYmdldChpbikgIT0gMHgxZiB8fCBiZ2V0KGluKSAhPSAweDhiIHx8IGJnZXQoaW4pICE9IDgpCi0gICAgICAgIGJhaWwoaW4tPm5hbWUsICIgaXMgbm90IGEgdmFsaWQgZ3ppcCBmaWxlIik7Ci0KLSAgICAvKiBnZXQgYW5kIHZlcmlmeSBmbGFncyAqLwotICAgIGZsYWdzID0gYmdldChpbik7Ci0gICAgaWYgKChmbGFncyAmIDB4ZTApICE9IDApCi0gICAgICAgIGJhaWwoInVua25vd24gcmVzZXJ2ZWQgYml0cyBzZXQgaW4gIiwgaW4tPm5hbWUpOwotCi0gICAgLyogc2tpcCBtb2RpZmljYXRpb24gdGltZSwgZXh0cmEgZmxhZ3MsIGFuZCBvcyAqLwotICAgIGJza2lwKGluLCA2KTsKLQotICAgIC8qIHNraXAgZXh0cmEgZmllbGQgaWYgcHJlc2VudCAqLwotICAgIGlmIChmbGFncyAmIDQpIHsKLSAgICAgICAgdW5zaWduZWQgbGVuOwotCi0gICAgICAgIGxlbiA9IGJnZXQoaW4pOwotICAgICAgICBsZW4gKz0gKHVuc2lnbmVkKShiZ2V0KGluKSkgPDwgODsKLSAgICAgICAgYnNraXAoaW4sIGxlbik7Ci0gICAgfQotCi0gICAgLyogc2tpcCBmaWxlIG5hbWUgaWYgcHJlc2VudCAqLwotICAgIGlmIChmbGFncyAmIDgpCi0gICAgICAgIHdoaWxlIChiZ2V0KGluKSAhPSAwKQotICAgICAgICAgICAgOwotCi0gICAgLyogc2tpcCBjb21tZW50IGlmIHByZXNlbnQgKi8KLSAgICBpZiAoZmxhZ3MgJiAxNikKLSAgICAgICAgd2hpbGUgKGJnZXQoaW4pICE9IDApCi0gICAgICAgICAgICA7Ci0KLSAgICAvKiBza2lwIGhlYWRlciBjcmMgaWYgcHJlc2VudCAqLwotICAgIGlmIChmbGFncyAmIDIpCi0gICAgICAgIGJza2lwKGluLCAyKTsKLX0KLQotLyogd3JpdGUgYSBmb3VyLWJ5dGUgbGl0dGxlLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIHRvIG91dCAqLwotbG9jYWwgdm9pZCBwdXQ0KHVuc2lnbmVkIGxvbmcgdmFsLCBGSUxFICpvdXQpCi17Ci0gICAgcHV0Yyh2YWwgJiAweGZmLCBvdXQpOwotICAgIHB1dGMoKHZhbCA+PiA4KSAmIDB4ZmYsIG91dCk7Ci0gICAgcHV0YygodmFsID4+IDE2KSAmIDB4ZmYsIG91dCk7Ci0gICAgcHV0YygodmFsID4+IDI0KSAmIDB4ZmYsIG91dCk7Ci19Ci0KLS8qIExvYWQgdXAgemxpYiBzdHJlYW0gZnJvbSBidWZmZXJlZCBpbnB1dCwgYmFpbCBpZiBlbmQgb2YgZmlsZSAqLwotbG9jYWwgdm9pZCB6cHVsbCh6X3N0cmVhbXAgc3RybSwgYmluICppbikKLXsKLSAgICBpZiAoaW4tPmxlZnQgPT0gMCkKLSAgICAgICAgYmxvYWQoaW4pOwotICAgIGlmIChpbi0+bGVmdCA9PSAwKQotICAgICAgICBiYWlsKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIG9uICIsIGluLT5uYW1lKTsKLSAgICBzdHJtLT5hdmFpbF9pbiA9IGluLT5sZWZ0OwotICAgIHN0cm0tPm5leHRfaW4gPSBpbi0+bmV4dDsKLX0KLQotLyogV3JpdGUgaGVhZGVyIGZvciBnemlwIGZpbGUgdG8gb3V0IGFuZCBpbml0aWFsaXplIHRyYWlsZXIuICovCi1sb2NhbCB2b2lkIGd6aW5pdCh1bnNpZ25lZCBsb25nICpjcmMsIHVuc2lnbmVkIGxvbmcgKnRvdCwgRklMRSAqb3V0KQotewotICAgIGZ3cml0ZSgiXHgxZlx4OGJceDA4XDBcMFwwXDBcMFwwXHhmZiIsIDEsIDEwLCBvdXQpOwotICAgICpjcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKLSAgICAqdG90ID0gMDsKLX0KLQotLyogQ29weSB0aGUgY29tcHJlc3NlZCBkYXRhIGZyb20gbmFtZSwgemVyb2luZyB0aGUgbGFzdCBibG9jayBiaXQgb2YgdGhlIGxhc3QKLSAgIGJsb2NrIGlmIGNsciBpcyB0cnVlLCBhbmQgYWRkaW5nIGVtcHR5IGJsb2NrcyBhcyBuZWVkZWQgdG8gZ2V0IHRvIGEgYnl0ZQotICAgYm91bmRhcnkuICBJZiBjbHIgaXMgZmFsc2UsIHRoZW4gdGhlIGxhc3QgYmxvY2sgYmVjb21lcyB0aGUgbGFzdCBibG9jayBvZgotICAgdGhlIG91dHB1dCwgYW5kIHRoZSBnemlwIHRyYWlsZXIgaXMgd3JpdHRlbi4gIGNyYyBhbmQgdG90IG1haW50YWlucyB0aGUKLSAgIGNyYyBhbmQgbGVuZ3RoIChtb2R1bG8gMl4zMikgb2YgdGhlIG91dHB1dCBmb3IgdGhlIHRyYWlsZXIuICBUaGUgcmVzdWx0aW5nCi0gICBnemlwIGZpbGUgaXMgd3JpdHRlbiB0byBvdXQuICBnemluaXQoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGNhbGwKLSAgIG9mIGd6Y29weSgpIHRvIHdyaXRlIHRoZSBnemlwIGhlYWRlciBhbmQgdG8gaW5pdGlhbGl6ZSBjcmMgYW5kIHRvdC4gKi8KLWxvY2FsIHZvaWQgZ3pjb3B5KGNoYXIgKm5hbWUsIGludCBjbHIsIHVuc2lnbmVkIGxvbmcgKmNyYywgdW5zaWduZWQgbG9uZyAqdG90LAotICAgICAgICAgICAgICAgICAgRklMRSAqb3V0KQotewotICAgIGludCByZXQ7ICAgICAgICAgICAgICAgIC8qIHJldHVybiB2YWx1ZSBmcm9tIHpsaWIgZnVuY3Rpb25zICovCi0gICAgaW50IHBvczsgICAgICAgICAgICAgICAgLyogd2hlcmUgdGhlICJsYXN0IGJsb2NrIiBiaXQgaXMgaW4gYnl0ZSAqLwotICAgIGludCBsYXN0OyAgICAgICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyB0aGUgbGFzdCBibG9jayAqLwotICAgIGJpbiAqaW47ICAgICAgICAgICAgICAgIC8qIGJ1ZmZlcmVkIGlucHV0IGZpbGUgKi8KLSAgICB1bnNpZ25lZCBjaGFyICpzdGFydDsgICAvKiBzdGFydCBvZiBjb21wcmVzc2VkIGRhdGEgaW4gYnVmZmVyICovCi0gICAgdW5zaWduZWQgY2hhciAqanVuazsgICAgLyogYnVmZmVyIGZvciB1bmNvbXByZXNzZWQgZGF0YSAtLSBkaXNjYXJkZWQgKi8KLSAgICB6X29mZl90IGxlbjsgICAgICAgICAgICAvKiBsZW5ndGggb2YgdW5jb21wcmVzc2VkIGRhdGEgKHN1cHBvcnQgPiA0IEdCKSAqLwotICAgIHpfc3RyZWFtIHN0cm07ICAgICAgICAgIC8qIHpsaWIgaW5mbGF0ZSBzdHJlYW0gKi8KLQotICAgIC8qIG9wZW4gZ3ppcCBmaWxlIGFuZCBza2lwIGhlYWRlciAqLwotICAgIGluID0gYm9wZW4obmFtZSk7Ci0gICAgaWYgKGluID09IE5VTEwpCi0gICAgICAgIGJhaWwoImNvdWxkIG5vdCBvcGVuICIsIG5hbWUpOwotICAgIGd6aGVhZChpbik7Ci0KLSAgICAvKiBhbGxvY2F0ZSBidWZmZXIgZm9yIHVuY29tcHJlc3NlZCBkYXRhIGFuZCBpbml0aWFsaXplIHJhdyBpbmZsYXRlCi0gICAgICAgc3RyZWFtICovCi0gICAganVuayA9IG1hbGxvYyhDSFVOSyk7Ci0gICAgc3RybS56YWxsb2MgPSBaX05VTEw7Ci0gICAgc3RybS56ZnJlZSA9IFpfTlVMTDsKLSAgICBzdHJtLm9wYXF1ZSA9IFpfTlVMTDsKLSAgICBzdHJtLmF2YWlsX2luID0gMDsKLSAgICBzdHJtLm5leHRfaW4gPSBaX05VTEw7Ci0gICAgcmV0ID0gaW5mbGF0ZUluaXQyKCZzdHJtLCAtMTUpOwotICAgIGlmIChqdW5rID09IE5VTEwgfHwgcmV0ICE9IFpfT0spCi0gICAgICAgIGJhaWwoIm91dCBvZiBtZW1vcnkiLCAiIik7Ci0KLSAgICAvKiBpbmZsYXRlIGFuZCBjb3B5IGNvbXByZXNzZWQgZGF0YSwgY2xlYXIgbGFzdC1ibG9jayBiaXQgaWYgcmVxdWVzdGVkICovCi0gICAgbGVuID0gMDsKLSAgICB6cHVsbCgmc3RybSwgaW4pOwotICAgIHN0YXJ0ID0gc3RybS5uZXh0X2luOwotICAgIGxhc3QgPSBzdGFydFswXSAmIDE7Ci0gICAgaWYgKGxhc3QgJiYgY2xyKQotICAgICAgICBzdGFydFswXSAmPSB+MTsKLSAgICBzdHJtLmF2YWlsX291dCA9IDA7Ci0gICAgZm9yICg7OykgewotICAgICAgICAvKiBpZiBpbnB1dCB1c2VkIGFuZCBvdXRwdXQgZG9uZSwgd3JpdGUgdXNlZCBpbnB1dCBhbmQgZ2V0IG1vcmUgKi8KLSAgICAgICAgaWYgKHN0cm0uYXZhaWxfaW4gPT0gMCAmJiBzdHJtLmF2YWlsX291dCAhPSAwKSB7Ci0gICAgICAgICAgICBmd3JpdGUoc3RhcnQsIDEsIHN0cm0ubmV4dF9pbiAtIHN0YXJ0LCBvdXQpOwotICAgICAgICAgICAgc3RhcnQgPSBpbi0+YnVmOwotICAgICAgICAgICAgaW4tPmxlZnQgPSAwOwotICAgICAgICAgICAgenB1bGwoJnN0cm0sIGluKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGRlY29tcHJlc3MgLS0gcmV0dXJuIGVhcmx5IHdoZW4gZW5kLW9mLWJsb2NrIHJlYWNoZWQgKi8KLSAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBDSFVOSzsKLSAgICAgICAgc3RybS5uZXh0X291dCA9IGp1bms7Ci0gICAgICAgIHJldCA9IGluZmxhdGUoJnN0cm0sIFpfQkxPQ0spOwotICAgICAgICBzd2l0Y2ggKHJldCkgewotICAgICAgICBjYXNlIFpfTUVNX0VSUk9SOgotICAgICAgICAgICAgYmFpbCgib3V0IG9mIG1lbW9yeSIsICIiKTsKLSAgICAgICAgY2FzZSBaX0RBVEFfRVJST1I6Ci0gICAgICAgICAgICBiYWlsKCJpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSBpbiAiLCBpbi0+bmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB1cGRhdGUgbGVuZ3RoIG9mIHVuY29tcHJlc3NlZCBkYXRhICovCi0gICAgICAgIGxlbiArPSBDSFVOSyAtIHN0cm0uYXZhaWxfb3V0OwotCi0gICAgICAgIC8qIGNoZWNrIGZvciBibG9jayBib3VuZGFyeSAob25seSBnZXQgdGhpcyB3aGVuIGJsb2NrIGNvcGllZCBvdXQpICovCi0gICAgICAgIGlmIChzdHJtLmRhdGFfdHlwZSAmIDEyOCkgewotICAgICAgICAgICAgLyogaWYgdGhhdCB3YXMgdGhlIGxhc3QgYmxvY2ssIHRoZW4gZG9uZSAqLwotICAgICAgICAgICAgaWYgKGxhc3QpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qIG51bWJlciBvZiB1bnVzZWQgYml0cyBpbiBsYXN0IGJ5dGUgKi8KLSAgICAgICAgICAgIHBvcyA9IHN0cm0uZGF0YV90eXBlICYgNzsKLQotICAgICAgICAgICAgLyogZmluZCB0aGUgbmV4dCBsYXN0LWJsb2NrIGJpdCAqLwotICAgICAgICAgICAgaWYgKHBvcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLyogbmV4dCBsYXN0LWJsb2NrIGJpdCBpcyBpbiBsYXN0IHVzZWQgYnl0ZSAqLwotICAgICAgICAgICAgICAgIHBvcyA9IDB4MTAwID4+IHBvczsKLSAgICAgICAgICAgICAgICBsYXN0ID0gc3RybS5uZXh0X2luWy0xXSAmIHBvczsKLSAgICAgICAgICAgICAgICBpZiAobGFzdCAmJiBjbHIpCi0gICAgICAgICAgICAgICAgICAgIHN0cm0ubmV4dF9pblstMV0gJj0gfnBvczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8qIG5leHQgbGFzdC1ibG9jayBiaXQgaXMgaW4gbmV4dCB1bnVzZWQgYnl0ZSAqLwotICAgICAgICAgICAgICAgIGlmIChzdHJtLmF2YWlsX2luID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgaGF2ZSB0aGF0IGJ5dGUgeWV0IC0tIGdldCBpdCAqLwotICAgICAgICAgICAgICAgICAgICBmd3JpdGUoc3RhcnQsIDEsIHN0cm0ubmV4dF9pbiAtIHN0YXJ0LCBvdXQpOwotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGluLT5idWY7Ci0gICAgICAgICAgICAgICAgICAgIGluLT5sZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgenB1bGwoJnN0cm0sIGluKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGFzdCA9IHN0cm0ubmV4dF9pblswXSAmIDE7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3QgJiYgY2xyKQotICAgICAgICAgICAgICAgICAgICBzdHJtLm5leHRfaW5bMF0gJj0gfjE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiB1cGRhdGUgYnVmZmVyIHdpdGggdW51c2VkIGlucHV0ICovCi0gICAgaW4tPmxlZnQgPSBzdHJtLmF2YWlsX2luOwotICAgIGluLT5uZXh0ID0gc3RybS5uZXh0X2luOwotCi0gICAgLyogY29weSB1c2VkIGlucHV0LCB3cml0ZSBlbXB0eSBibG9ja3MgdG8gZ2V0IHRvIGJ5dGUgYm91bmRhcnkgKi8KLSAgICBwb3MgPSBzdHJtLmRhdGFfdHlwZSAmIDc7Ci0gICAgZndyaXRlKHN0YXJ0LCAxLCBpbi0+bmV4dCAtIHN0YXJ0IC0gMSwgb3V0KTsKLSAgICBsYXN0ID0gaW4tPm5leHRbLTFdOwotICAgIGlmIChwb3MgPT0gMCB8fCAhY2xyKQotICAgICAgICAvKiBhbHJlYWR5IGF0IGJ5dGUgYm91bmRhcnksIG9yIGxhc3QgZmlsZTogd3JpdGUgbGFzdCBieXRlICovCi0gICAgICAgIHB1dGMobGFzdCwgb3V0KTsKLSAgICBlbHNlIHsKLSAgICAgICAgLyogYXBwZW5kIGVtcHR5IGJsb2NrcyB0byBsYXN0IGJ5dGUgKi8KLSAgICAgICAgbGFzdCAmPSAoKDB4MTAwID4+IHBvcykgLSAxKTsgICAgICAgLyogYXNzdXJlIHVudXNlZCBiaXRzIGFyZSB6ZXJvICovCi0gICAgICAgIGlmIChwb3MgJiAxKSB7Ci0gICAgICAgICAgICAvKiBvZGQgLS0gYXBwZW5kIGFuIGVtcHR5IHN0b3JlZCBibG9jayAqLwotICAgICAgICAgICAgcHV0YyhsYXN0LCBvdXQpOwotICAgICAgICAgICAgaWYgKHBvcyA9PSAxKQotICAgICAgICAgICAgICAgIHB1dGMoMCwgb3V0KTsgICAgICAgICAgICAgICAvKiB0d28gbW9yZSBiaXRzIGluIGJsb2NrIGhlYWRlciAqLwotICAgICAgICAgICAgZndyaXRlKCJcMFwwXHhmZlx4ZmYiLCAxLCA0LCBvdXQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyogZXZlbiAtLSBhcHBlbmQgMSwgMiwgb3IgMyBlbXB0eSBmaXhlZCBibG9ja3MgKi8KLSAgICAgICAgICAgIHN3aXRjaCAocG9zKSB7Ci0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgcHV0YyhsYXN0IHwgOCwgb3V0KTsKLSAgICAgICAgICAgICAgICBsYXN0ID0gMDsKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICBwdXRjKGxhc3QgfCAweDIwLCBvdXQpOwotICAgICAgICAgICAgICAgIGxhc3QgPSAwOwotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHB1dGMobGFzdCB8IDB4ODAsIG91dCk7Ci0gICAgICAgICAgICAgICAgcHV0YygwLCBvdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogdXBkYXRlIGNyYyBhbmQgdG90ICovCi0gICAgKmNyYyA9IGNyYzMyX2NvbWJpbmUoKmNyYywgYmdldDQoaW4pLCBsZW4pOwotICAgICp0b3QgKz0gKHVuc2lnbmVkIGxvbmcpbGVuOwotCi0gICAgLyogY2xlYW4gdXAgKi8KLSAgICBpbmZsYXRlRW5kKCZzdHJtKTsKLSAgICBmcmVlKGp1bmspOwotICAgIGJjbG9zZShpbik7Ci0KLSAgICAvKiB3cml0ZSB0cmFpbGVyIGlmIHRoaXMgaXMgdGhlIGxhc3QgZ3ppcCBmaWxlICovCi0gICAgaWYgKCFjbHIpIHsKLSAgICAgICAgcHV0NCgqY3JjLCBvdXQpOwotICAgICAgICBwdXQ0KCp0b3QsIG91dCk7Ci0gICAgfQotfQotCi0vKiBqb2luIHRoZSBnemlwIGZpbGVzIG9uIHRoZSBjb21tYW5kIGxpbmUsIHdyaXRlIHJlc3VsdCB0byBzdGRvdXQgKi8KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICB1bnNpZ25lZCBsb25nIGNyYywgdG90OyAgICAgLyogcnVubmluZyBjcmMgYW5kIHRvdGFsIHVuY29tcHJlc3NlZCBsZW5ndGggKi8KLQotICAgIC8qIHNraXAgY29tbWFuZCBuYW1lICovCi0gICAgYXJnYy0tOwotICAgIGFyZ3YrKzsKLQotICAgIC8qIHNob3cgdXNhZ2UgaWYgbm8gYXJndW1lbnRzICovCi0gICAgaWYgKGFyZ2MgPT0gMCkgewotICAgICAgICBmcHV0cygiZ3pqb2luIHVzYWdlOiBnempvaW4gZjEuZ3ogW2YyLmd6IFtmMy5neiAuLi5dXSA+IGZqb2luLmd6XG4iLAotICAgICAgICAgICAgICBzdGRlcnIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBqb2luIGd6aXAgZmlsZXMgb24gY29tbWFuZCBsaW5lIGFuZCB3cml0ZSB0byBzdGRvdXQgKi8KLSAgICBnemluaXQoJmNyYywgJnRvdCwgc3Rkb3V0KTsKLSAgICB3aGlsZSAoYXJnYy0tKQotICAgICAgICBnemNvcHkoKmFyZ3YrKywgYXJnYywgJmNyYywgJnRvdCwgc3Rkb3V0KTsKLQotICAgIC8qIGRvbmUgKi8KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NyYy96bGliL2V4YW1wbGVzL2d6bG9nLmMgYi9zcmMvemxpYi9leGFtcGxlcy9nemxvZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzBhYWNhLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2V4YW1wbGVzL2d6bG9nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU4ICswLDAgQEAKLS8qCi0gKiBnemxvZy5jCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDggTWFyayBBZGxlciwgYWxsIHJpZ2h0cyByZXNlcnZlZAotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGd6bG9nLmgKLSAqIHZlcnNpb24gMi4wLCAyNSBBcHIgMjAwOAotICovCi0KLS8qCi0gICBnemxvZyBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgZnJlcXVlbnRseSBhcHBlbmRpbmcgc2hvcnQgc3RyaW5ncyB0byBhIGd6aXAKLSAgIGZpbGUgdGhhdCBpcyBlZmZpY2llbnQgYm90aCBpbiBleGVjdXRpb24gdGltZSBhbmQgY29tcHJlc3Npb24gcmF0aW8uICBUaGUKLSAgIHN0cmF0ZWd5IGlzIHRvIHdyaXRlIHRoZSBzaG9ydCBzdHJpbmdzIGluIGFuIHVuY29tcHJlc3NlZCBmb3JtIHRvIHRoZSBlbmQgb2YKLSAgIHRoZSBnemlwIGZpbGUsIG9ubHkgY29tcHJlc3Npbmcgd2hlbiB0aGUgYW1vdW50IG9mIHVuY29tcHJlc3NlZCBkYXRhIGhhcwotICAgcmVhY2hlZCBhIGdpdmVuIHRocmVzaG9sZC4KLQotICAgZ3psb2cgYWxzbyBwcm92aWRlcyBwcm90ZWN0aW9uIGFnYWluc3QgaW50ZXJydXB0aW9ucyBpbiB0aGUgcHJvY2VzcyBkdWUgdG8KLSAgIHN5c3RlbSBjcmFzaGVzLiAgVGhlIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uIGlzIHJlY29yZGVkIGluIGFuIGV4dHJhIGZpZWxkCi0gICBpbiB0aGUgZ3ppcCBmaWxlLCBhbmQgaXMgb25seSB1cGRhdGVkIG9uY2UgdGhlIGd6aXAgZmlsZSBpcyBicm91Z2h0IHRvIGEKLSAgIHZhbGlkIHN0YXRlLiAgVGhlIGxhc3QgZGF0YSB0byBiZSBhcHBlbmRlZCBvciBjb21wcmVzc2VkIGlzIHNhdmVkIGluIGFuCi0gICBhdXhpbGlhcnkgZmlsZSwgc28gdGhhdCBpZiB0aGUgb3BlcmF0aW9uIGlzIGludGVycnVwdGVkLCBpdCBjYW4gYmUgY29tcGxldGVkCi0gICB0aGUgbmV4dCB0aW1lIGFuIGFwcGVuZCBvcGVyYXRpb24gaXMgYXR0ZW1wdGVkLgotCi0gICBnemxvZyBtYWludGFpbnMgYW5vdGhlciBhdXhpbGlhcnkgZmlsZSB3aXRoIHRoZSBsYXN0IDMySyBvZiBkYXRhIGZyb20gdGhlCi0gICBjb21wcmVzc2VkIHBvcnRpb24sIHdoaWNoIGlzIHByZWxvYWRlZCBmb3IgdGhlIGNvbXByZXNzaW9uIG9mIHRoZSBzdWJzZXF1ZW50Ci0gICBkYXRhLiAgVGhpcyBtaW5pbWl6ZXMgdGhlIGltcGFjdCB0byB0aGUgY29tcHJlc3Npb24gcmF0aW8gb2YgYXBwZW5kaW5nLgotICovCi0KLS8qCi0gICBPcGVyYXRpb25zIENvbmNlcHQ6Ci0KLSAgIEZpbGVzIChsb2cgbmFtZSAiZm9vIik6Ci0gICBmb28uZ3ogLS0gZ3ppcCBmaWxlIHdpdGggdGhlIGNvbXBsZXRlIGxvZwotICAgZm9vLmFkZCAtLSBsYXN0IG1lc3NhZ2UgdG8gYXBwZW5kIG9yIGxhc3QgZGF0YSB0byBjb21wcmVzcwotICAgZm9vLmRpY3QgLS0gZGljdGlvbmFyeSBvZiB0aGUgbGFzdCAzMksgb2YgZGF0YSBmb3IgbmV4dCBjb21wcmVzc2lvbgotICAgZm9vLnRlbXAgLS0gdGVtcG9yYXJ5IGRpY3Rpb25hcnkgZmlsZSBmb3IgY29tcHJlc3Npb24gYWZ0ZXIgdGhpcyBvbmUKLSAgIGZvby5sb2NrIC0tIGxvY2sgZmlsZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyB0aGUgb3RoZXIgZmlsZXMKLSAgIGZvby5yZXBhaXJzIC0tIGxvZyBmaWxlIGZvciBsb2cgZmlsZSByZWNvdmVyeSBvcGVyYXRpb25zIChub3QgY29tcHJlc3NlZCkKLQotICAgZ3ppcCBmaWxlIHN0cnVjdHVyZToKLSAgIC0gZml4ZWQtbGVuZ3RoIChubyBmaWxlIG5hbWUpIGhlYWRlciB3aXRoIGV4dHJhIGZpZWxkIChzZWUgYmVsb3cpCi0gICAtIGNvbXByZXNzZWQgZGF0YSBlbmRpbmcgaW5pdGlhbGx5IHdpdGggZW1wdHkgc3RvcmVkIGJsb2NrCi0gICAtIHVuY29tcHJlc3NlZCBkYXRhIGZpbGxpbmcgb3V0IG9yaWdpbmFsbHkgZW1wdHkgc3RvcmVkIGJsb2NrIGFuZAotICAgICBzdWJzZXF1ZW50IHN0b3JlZCBibG9ja3MgYXMgbmVlZGVkICgxNksgbWF4IGVhY2gpCi0gICAtIGd6aXAgdHJhaWxlcgotICAgLSBubyBqdW5rIGF0IGVuZCAobm8gb3RoZXIgZ3ppcCBzdHJlYW1zKQotCi0gICBXaGVuIGFwcGVuZGluZyBkYXRhLCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGZpcnN0IHRocmVlIGl0ZW1zIGFib3ZlIHBsdXMgdGhlCi0gICBmb28uYWRkIGZpbGUgYXJlIHN1ZmZpY2llbnQgdG8gcmVjb3ZlciBhbiBpbnRlcnJ1cHRlZCBhcHBlbmQgb3BlcmF0aW9uLiAgVGhlCi0gICBleHRyYSBmaWVsZCBoYXMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byByZXN0b3JlIHRoZSBzdGFydCBvZiB0aGUgbGFzdAotICAgc3RvcmVkIGJsb2NrIGFuZCBkZXRlcm1pbmUgd2hlcmUgdG8gYXBwZW5kIHRoZSBkYXRhIGluIHRoZSBmb28uYWRkIGZpbGUsIGFzCi0gICB3ZWxsIGFzIHRoZSBjcmMgYW5kIGxlbmd0aCBvZiB0aGUgZ3ppcCBkYXRhIGJlZm9yZSB0aGUgYXBwZW5kIG9wZXJhdGlvbi4KLQotICAgVGhlIGZvby5hZGQgZmlsZSBpcyBjcmVhdGVkIGJlZm9yZSB0aGUgZ3ppcCBmaWxlIGlzIG1hcmtlZCBmb3IgYXBwZW5kLCBhbmQKLSAgIGRlbGV0ZWQgYWZ0ZXIgdGhlIGd6aXAgZmlsZSBpcyBtYXJrZWQgYXMgY29tcGxldGUuICBTbyBpZiB0aGUgYXBwZW5kCi0gICBvcGVyYXRpb24gaXMgaW50ZXJydXB0ZWQsIHRoZSBkYXRhIHRvIGFkZCB3aWxsIHN0aWxsIGJlIHRoZXJlLiAgSWYgZHVlIHRvCi0gICBzb21lIGV4dGVybmFsIGZvcmNlLCB0aGUgZm9vLmFkZCBmaWxlIGdldHMgZGVsZXRlZCBiZXR3ZWVuIHdoZW4gdGhlIGFwcGVuZAotICAgb3BlcmF0aW9uIHdhcyBpbnRlcnJ1cHRlZCBhbmQgd2hlbiByZWNvdmVyeSBpcyBhdHRlbXB0ZWQsIHRoZSBnemlwIGZpbGUgd2lsbAotICAgc3RpbGwgYmUgcmVzdG9yZWQsIGJ1dCB3aXRob3V0IHRoZSBhcHBlbmRlZCBkYXRhLgotCi0gICBXaGVuIGNvbXByZXNzaW5nIGRhdGEsIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZmlyc3QgdHdvIGl0ZW1zIGFib3ZlIHBsdXMgdGhlCi0gICBmb28uYWRkIGZpbGUgYXJlIHN1ZmZpY2llbnQgdG8gcmVjb3ZlciBhbiBpbnRlcnJ1cHRlZCBjb21wcmVzcyBvcGVyYXRpb24uCi0gICBUaGUgZXh0cmEgZmllbGQgaGFzIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gZmluZCB0aGUgZW5kIG9mIHRoZQotICAgY29tcHJlc3NlZCBkYXRhLCBhbmQgY29udGFpbnMgYm90aCB0aGUgY3JjIGFuZCBsZW5ndGggb2YganVzdCB0aGUgY29tcHJlc3NlZAotICAgZGF0YSBhbmQgb2YgdGhlIGNvbXBsZXRlIHNldCBvZiBkYXRhIGluY2x1ZGluZyB0aGUgY29udGVudHMgb2YgdGhlIGZvby5hZGQKLSAgIGZpbGUuCi0KLSAgIEFnYWluLCB0aGUgZm9vLmFkZCBmaWxlIGlzIG1haW50YWluZWQgZHVyaW5nIHRoZSBjb21wcmVzcyBvcGVyYXRpb24gaW4gY2FzZQotICAgb2YgYW4gaW50ZXJydXB0aW9uLiAgSWYgaW4gdGhlIHVubGlrZWx5IGV2ZW50IHRoZSBmb28uYWRkIGZpbGUgd2l0aCB0aGUgZGF0YQotICAgdG8gYmUgY29tcHJlc3NlZCBpcyBtaXNzaW5nIGR1ZSB0byBzb21lIGV4dGVybmFsIGZvcmNlLCBhIGd6aXAgZmlsZSB3aXRoCi0gICBqdXN0IHRoZSBwcmV2aW91cyBjb21wcmVzc2VkIGRhdGEgd2lsbCBiZSByZWNvbnN0cnVjdGVkLiAgSW4gdGhpcyBjYXNlLCBhbGwKLSAgIG9mIHRoZSBkYXRhIHRoYXQgd2FzIHRvIGJlIGNvbXByZXNzZWQgaXMgbG9zdCAoYXBwcm94aW1hdGVseSBvbmUgbWVnYWJ5dGUpLgotICAgVGhpcyB3aWxsIG5vdCBvY2N1ciBpZiBhbGwgdGhhdCBoYXBwZW5lZCB3YXMgYW4gaW50ZXJydXB0aW9uIG9mIHRoZSBjb21wcmVzcwotICAgb3BlcmF0aW9uLgotCi0gICBUaGUgdGhpcmQgc3RhdGUgdGhhdCBpcyBtYXJrZWQgaXMgdGhlIHJlcGxhY2VtZW50IG9mIHRoZSBvbGQgZGljdGlvbmFyeSB3aXRoCi0gICB0aGUgbmV3IGRpY3Rpb25hcnkgYWZ0ZXIgYSBjb21wcmVzcyBvcGVyYXRpb24uICBPbmNlIGNvbXByZXNzaW9uIGlzCi0gICBjb21wbGV0ZSwgdGhlIGd6aXAgZmlsZSBpcyBtYXJrZWQgYXMgYmVpbmcgaW4gdGhlIHJlcGxhY2Ugc3RhdGUuICBUaGlzCi0gICBjb21wbGV0ZXMgdGhlIGd6aXAgZmlsZSwgc28gYW4gaW50ZXJydXB0IGFmdGVyIGJlaW5nIHNvIG1hcmtlZCBkb2VzIG5vdAotICAgcmVzdWx0IGluIHJlY29tcHJlc3Npb24uICBUaGVuIHRoZSBkaWN0aW9uYXJ5IGZpbGUgaXMgcmVwbGFjZWQsIGFuZCB0aGUgZ3ppcAotICAgZmlsZSBpcyBtYXJrZWQgYXMgY29tcGxldGVkLiAgVGhpcyBzdGF0ZSBwcmV2ZW50cyB0aGUgcG9zc2liaWxpdHkgb2YKLSAgIHJlc3RhcnRpbmcgY29tcHJlc3Npb24gd2l0aCB0aGUgd3JvbmcgZGljdGlvbmFyeSBmaWxlLgotCi0gICBBbGwgdGhyZWUgb3BlcmF0aW9ucyBhcmUgd3JhcHBlZCBieSBhIGxvY2svdW5sb2NrIHByb2NlZHVyZS4gIEluIG9yZGVyIHRvCi0gICBnYWluIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIGxvZyBmaWxlcywgZmlyc3QgYSBmb28ubG9jayBmaWxlIG11c3QgYmUKLSAgIGV4Y2x1c2l2ZWx5IGNyZWF0ZWQuICBXaGVuIGFsbCBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZSwgdGhlIGxvY2sgaXMKLSAgIHJlbGVhc2VkIGJ5IGRlbGV0aW5nIHRoZSBmb28ubG9jayBmaWxlLiAgSWYgd2hlbiBhdHRlbXB0aW5nIHRvIGNyZWF0ZSB0aGUKLSAgIGxvY2sgZmlsZSwgaXQgYWxyZWFkeSBleGlzdHMgYW5kIHRoZSBtb2RpZnkgdGltZSBvZiB0aGUgbG9jayBmaWxlIGlzIG1vcmUKLSAgIHRoYW4gZml2ZSBtaW51dGVzIG9sZCAoc2V0IGJ5IHRoZSBQQVRJRU5DRSBkZWZpbmUgYmVsb3cpLCB0aGVuIHRoZSBvbGQKLSAgIGxvY2sgZmlsZSBpcyBjb25zaWRlcmVkIHN0YWxlIGFuZCBkZWxldGVkLCBhbmQgdGhlIGV4Y2x1c2l2ZSBjcmVhdGlvbiBvZgotICAgdGhlIGxvY2sgZmlsZSBpcyByZXRyaWVkLiAgVG8gYXNzdXJlIHRoYXQgdGhlcmUgYXJlIG5vIGZhbHNlIGFzc2Vzc21lbnRzCi0gICBvZiB0aGUgc3RhbGVuZXNzIG9mIHRoZSBsb2NrIGZpbGUsIHRoZSBvcGVyYXRpb25zIHBlcmlvZGljYWxseSB0b3VjaCB0aGUKLSAgIGxvY2sgZmlsZSB0byB1cGRhdGUgdGhlIG1vZGlmaWVkIGRhdGUuCi0KLSAgIEZvbGxvd2luZyBpcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZXh0cmEgZmllbGQgd2l0aCBhbGwgb2YgdGhlIGluZm9ybWF0aW9uCi0gICByZXF1aXJlZCB0byBlbmFibGUgdGhlIGFib3ZlIGFwcGVuZCBhbmQgY29tcHJlc3Mgb3BlcmF0aW9ucyBhbmQgdGhlaXIKLSAgIHJlY292ZXJ5IGlmIGludGVycnVwdGVkLiAgTXVsdGktYnl0ZSB2YWx1ZXMgYXJlIHN0b3JlZCBsaXR0bGUgZW5kaWFuCi0gICAoY29uc2lzdGVudCB3aXRoIHRoZSBnemlwIGZvcm1hdCkuICBGaWxlIHBvaW50ZXJzIGFyZSBlaWdodCBieXRlcyBsb25nLgotICAgVGhlIGNyYydzIGFuZCBsZW5ndGhzIGZvciB0aGUgZ3ppcCB0cmFpbGVyIGFyZSBmb3VyIGJ5dGVzIGxvbmcuICAoTm90ZSB0aGF0Ci0gICB0aGUgbGVuZ3RoIGF0IHRoZSBlbmQgb2YgYSBnemlwIGZpbGUgaXMgdXNlZCBmb3IgZXJyb3IgY2hlY2tpbmcgb25seSwgYW5kCi0gICBmb3IgbGFyZ2UgZmlsZXMgaXMgYWN0dWFsbHkgdGhlIGxlbmd0aCBtb2R1bG8gMl4zMi4pICBUaGUgc3RvcmVkIGJsb2NrCi0gICBsZW5ndGggaXMgdHdvIGJ5dGVzIGxvbmcuICBUaGUgZ3ppcCBleHRyYSBmaWVsZCB0d28tYnl0ZSBpZGVudGlmaWNhdGlvbiBpcwotICAgImFwIiBmb3IgYXBwZW5kLiAgSXQgaXMgYXNzdW1lZCB0aGF0IHdyaXRpbmcgdGhlIGV4dHJhIGZpZWxkIHRvIHRoZSBmaWxlIGlzCi0gICBhbiAiYXRvbWljIiBvcGVyYXRpb24uICBUaGF0IGlzLCBlaXRoZXIgYWxsIG9mIHRoZSBleHRyYSBmaWVsZCBpcyB3cml0dGVuCi0gICB0byB0aGUgZmlsZSwgb3Igbm9uZSBvZiBpdCBpcywgaWYgdGhlIG9wZXJhdGlvbiBpcyBpbnRlcnJ1cHRlZCByaWdodCBhdCB0aGUKLSAgIHBvaW50IG9mIHVwZGF0aW5nIHRoZSBleHRyYSBmaWVsZC4gIFRoaXMgaXMgYSByZWFzb25hYmxlIGFzc3VtcHRpb24sIHNpbmNlCi0gICB0aGUgZXh0cmEgZmllbGQgaXMgd2l0aGluIHRoZSBmaXJzdCA1MiBieXRlcyBvZiB0aGUgZmlsZSwgd2hpY2ggaXMgc21hbGxlcgotICAgdGhhbiBhbnkgZXhwZWN0ZWQgYmxvY2sgc2l6ZSBmb3IgYSBtYXNzIHN0b3JhZ2UgZGV2aWNlICh1c3VhbGx5IDUxMiBieXRlcyBvcgotICAgbGFyZ2VyKS4KLQotICAgRXh0cmEgZmllbGQgKDM1IGJ5dGVzKToKLSAgIC0gUG9pbnRlciB0byBmaXJzdCBzdG9yZWQgYmxvY2sgbGVuZ3RoIC0tIHRoaXMgcG9pbnRzIHRvIHRoZSB0d28tYnl0ZSBsZW5ndGgKLSAgICAgb2YgdGhlIGZpcnN0IHN0b3JlZCBibG9jaywgd2hpY2ggaXMgZm9sbG93ZWQgYnkgdGhlIHR3by1ieXRlLCBvbmUncwotICAgICBjb21wbGVtZW50IG9mIHRoYXQgbGVuZ3RoLiAgVGhlIHN0b3JlZCBibG9jayBsZW5ndGggaXMgcHJlY2VkZWQgYnkgdGhlCi0gICAgIHRocmVlLWJpdCBoZWFkZXIgb2YgdGhlIHN0b3JlZCBibG9jaywgd2hpY2ggaXMgdGhlIGFjdHVhbCBzdGFydCBvZiB0aGUKLSAgICAgc3RvcmVkIGJsb2NrIGluIHRoZSBkZWZsYXRlIGZvcm1hdC4gIFNlZSB0aGUgYml0IG9mZnNldCBmaWVsZCBiZWxvdy4KLSAgIC0gUG9pbnRlciB0byB0aGUgbGFzdCBzdG9yZWQgYmxvY2sgbGVuZ3RoLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyBhYm92ZSwgYnV0Ci0gICAgIGZvciB0aGUgbGFzdCBzdG9yZWQgYmxvY2sgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGluIHRoZSBnemlwIGZpbGUuCi0gICAgIEluaXRpYWxseSB0aGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBzdG9yZWQgYmxvY2sgbGVuZ3RoIHBvaW50ZXIuCi0gICAgIFdoZW4gdGhlIHN0b3JlZCBibG9jayBnZXRzIHRvIDE2SyAoc2VlIHRoZSBNQVhfU1RPUkUgZGVmaW5lKSwgdGhlbiBhIG5ldwotICAgICBzdG9yZWQgYmxvY2sgYXMgYWRkZWQsIGF0IHdoaWNoIHBvaW50IHRoZSBsYXN0IHN0b3JlZCBibG9jayBsZW5ndGggcG9pbnRlcgotICAgICBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZmlyc3Qgc3RvcmVkIGJsb2NrIGxlbmd0aCBwb2ludGVyLiAgV2hlbiB0aGV5IGFyZQotICAgICBkaWZmZXJlbnQsIHRoZSBmaXJzdCBiaXQgb2YgdGhlIGxhc3Qgc3RvcmVkIGJsb2NrIGhlYWRlciBpcyBlaWdodCBiaXRzLCBvcgotICAgICBvbmUgYnl0ZSBiYWNrIGZyb20gdGhlIGJsb2NrIGxlbmd0aC4KLSAgIC0gQ29tcHJlc3NlZCBkYXRhIGNyYyBhbmQgbGVuZ3RoLiAgVGhpcyBpcyB0aGUgY3JjIGFuZCBsZW5ndGggb2YgdGhlIGRhdGEKLSAgICAgdGhhdCBpcyBpbiB0aGUgY29tcHJlc3NlZCBwb3J0aW9uIG9mIHRoZSBkZWZsYXRlIHN0cmVhbS4gIFRoZXNlIGFyZSB1c2VkCi0gICAgIG9ubHkgaW4gdGhlIGV2ZW50IHRoYXQgdGhlIGZvby5hZGQgZmlsZSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGNvbXByZXNzIGlzCi0gICAgIGxvc3QgYWZ0ZXIgYSBjb21wcmVzcyBvcGVyYXRpb24gaXMgaW50ZXJydXB0ZWQuCi0gICAtIFRvdGFsIGRhdGEgY3JjIGFuZCBsZW5ndGguICBUaGlzIGlzIHRoZSBjcmMgYW5kIGxlbmd0aCBvZiBhbGwgb2YgdGhlIGRhdGEKLSAgICAgc3RvcmVkIGluIHRoZSBnemlwIGZpbGUsIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZC4gIEl0IGlzIHVzZWQgdG8KLSAgICAgcmVjb25zdHJ1Y3QgdGhlIGd6aXAgdHJhaWxlciB3aGVuIGNvbXByZXNzaW5nLCBhcyB3ZWxsIGFzIHdoZW4gcmVjb3ZlcmluZwotICAgICBpbnRlcnJ1cHRlZCBvcGVyYXRpb25zLgotICAgLSBGaW5hbCBzdG9yZWQgYmxvY2sgbGVuZ3RoLiAgVGhpcyBpcyB1c2VkIHRvIHF1aWNrbHkgZmluZCB3aGVyZSB0byBhcHBlbmQsCi0gICAgIGFuZCBhbGxvd3MgdGhlIHJlc3RvcmF0aW9uIG9mIHRoZSBvcmlnaW5hbCBmaW5hbCBzdG9yZWQgYmxvY2sgc3RhdGUgd2hlbgotICAgICBhbiBhcHBlbmQgb3BlcmF0aW9uIGlzIGludGVycnVwdGVkLgotICAgLSBGaXJzdCBzdG9yZWQgYmxvY2sgc3RhcnQgYXMgdGhlIG51bWJlciBvZiBiaXRzIGJhY2sgZnJvbSB0aGUgZmluYWwgc3RvcmVkCi0gICAgIGJsb2NrIGZpcnN0IGxlbmd0aCBieXRlLiAgVGhpcyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2Ugb2YgMy4uMTAsIGFuZCBpcwotICAgICBzdG9yZWQgYXMgdGhlIGxvdyB0aHJlZSBiaXRzIG9mIHRoZSBmaW5hbCBieXRlIG9mIHRoZSBleHRyYSBmaWVsZCBhZnRlcgotICAgICBzdWJ0cmFjdGluZyB0aHJlZSAoMC4uNykuICBUaGlzIGFsbG93cyB0aGUgbGFzdC1ibG9jayBiaXQgb2YgdGhlIHN0b3JlZAotICAgICBibG9jayBoZWFkZXIgdG8gYmUgdXBkYXRlZCB3aGVuIGEgbmV3IHN0b3JlZCBibG9jayBpcyBhZGRlZCwgZm9yIHRoZSBjYXNlCi0gICAgIHdoZW4gdGhlIGZpcnN0IHN0b3JlZCBibG9jayBhbmQgdGhlIGxhc3Qgc3RvcmVkIGJsb2NrIGFyZSB0aGUgc2FtZS4gIChXaGVuCi0gICAgIHRoZXkgYXJlIGRpZmZlcmVudCwgdGhlIG51bWJlcnMgb2YgYml0cyBiYWNrIGlzIGtub3duIHRvIGJlIGVpZ2h0LikgIFRoaXMKLSAgICAgYWxzbyBhbGxvd3MgZm9yIG5ldyBjb21wcmVzc2VkIGRhdGEgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIG9sZCBjb21wcmVzc2VkCi0gICAgIGRhdGEgaW4gdGhlIGNvbXByZXNzIG9wZXJhdGlvbiwgb3ZlcndyaXRpbmcgdGhlIHByZXZpb3VzIGZpcnN0IHN0b3JlZAotICAgICBibG9jaywgb3IgZm9yIHRoZSBjb21wcmVzc2VkIGRhdGEgdG8gYmUgdGVybWluYXRlZCBhbmQgYSB2YWxpZCBnemlwIGZpbGUKLSAgICAgcmVjb25zdHJ1Y3RlZCBvbiB0aGUgb2ZmIGNoYW5jZSB0aGF0IGEgY29tcHJlc3Npb24gb3BlcmF0aW9uIHdhcwotICAgICBpbnRlcnJ1cHRlZCBhbmQgdGhlIGRhdGEgdG8gY29tcHJlc3MgaW4gdGhlIGZvby5hZGQgZmlsZSB3YXMgZGVsZXRlZC4KLSAgIC0gVGhlIG9wZXJhdGlvbiBpbiBwcm9jZXNzLiAgVGhpcyBpcyB0aGUgbmV4dCB0d28gYml0cyBpbiB0aGUgbGFzdCBieXRlICh0aGUKLSAgICAgYml0cyB1bmRlciB0aGUgbWFzayAweDE4KS4gIFRoZSBhcmUgaW50ZXJwcmV0ZWQgYXMgMDogbm90aGluZyBpbiBwcm9jZXNzLAotICAgICAxOiBhcHBlbmQgaW4gcHJvY2VzcywgMjogY29tcHJlc3MgaW4gcHJvY2VzcywgMzogcmVwbGFjZSBpbiBwcm9jZXNzLgotICAgLSBUaGUgdG9wIHRocmVlIGJpdHMgb2YgdGhlIGxhc3QgYnl0ZSBpbiB0aGUgZXh0cmEgZmllbGQgYXJlIHJlc2VydmVkIGFuZAotICAgICBhcmUgY3VycmVudGx5IHNldCB0byB6ZXJvLgotCi0gICBNYWluIHByb2NlZHVyZToKLSAgIC0gRXhjbHVzaXZlbHkgY3JlYXRlIHRoZSBmb28ubG9jayBmaWxlIHVzaW5nIHRoZSBPX0NSRUFUIGFuZCBPX0VYQ0wgbW9kZXMgb2YKLSAgICAgdGhlIHN5c3RlbSBvcGVuKCkgY2FsbC4gIElmIHRoZSBtb2RpZnkgdGltZSBvZiBhbiBleGlzdGluZyBsb2NrIGZpbGUgaXMKLSAgICAgbW9yZSB0aGFuIFBBVElFTkNFIHNlY29uZHMgb2xkLCB0aGVuIHRoZSBsb2NrIGZpbGUgaXMgZGVsZXRlZCBhbmQgdGhlCi0gICAgIGV4Y2x1c2l2ZSBjcmVhdGUgaXMgcmV0cmllZC4KLSAgIC0gTG9hZCB0aGUgZXh0cmEgZmllbGQgZnJvbSB0aGUgZm9vLmd6IGZpbGUsIGFuZCBzZWUgaWYgYW4gb3BlcmF0aW9uIHdhcyBpbgotICAgICBwcm9ncmVzcyBidXQgbm90IGNvbXBsZXRlZC4gIElmIHNvLCBhcHBseSB0aGUgcmVjb3ZlcnkgcHJvY2VkdXJlIGJlbG93LgotICAgLSBQZXJmb3JtIHRoZSBhcHBlbmQgcHJvY2VkdXJlIHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuCi0gICAtIElmIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBpbiB0aGUgZm9vLmd6IGZpbGUgaXMgMU1CIG9yIG1vcmUsIGFwcGx5IHRoZQotICAgICBjb21wcmVzcyBwcm9jZWR1cmUuCi0gICAtIERlbGV0ZSB0aGUgZm9vLmxvY2sgZmlsZS4KLQotICAgQXBwZW5kIHByb2NlZHVyZToKLSAgIC0gUHV0IHdoYXQgdG8gYXBwZW5kIGluIHRoZSBmb28uYWRkIGZpbGUgc28gdGhhdCB0aGUgb3BlcmF0aW9uIGNhbiBiZQotICAgICByZXN0YXJ0ZWQgaWYgdGhpcyBwcm9jZWR1cmUgaXMgaW50ZXJydXB0ZWQuCi0gICAtIE1hcmsgdGhlIGZvby5neiBleHRyYSBmaWVsZCB3aXRoIHRoZSBhcHBlbmQgb3BlcmF0aW9uIGluIHByb2dyZXNzLgotICAgKyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBsYXN0LWJsb2NrIGJpdCBhbmQgc3RvcmVkIGJsb2NrIGxlbmd0aCBvZiB0aGUgbGFzdAotICAgICBzdG9yZWQgYmxvY2sgZnJvbSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGV4dHJhIGZpZWxkLCBpbiBjYXNlIGEgcHJldmlvdXMKLSAgICAgYXBwZW5kIG9wZXJhdGlvbiB3YXMgaW50ZXJydXB0ZWQuCi0gICAtIEFwcGVuZCB0aGUgcHJvdmlkZWQgZGF0YSB0byB0aGUgbGFzdCBzdG9yZWQgYmxvY2ssIGNyZWF0aW5nIG5ldyBzdG9yZWQKLSAgICAgYmxvY2tzIGFzIG5lZWRlZCBhbmQgdXBkYXRpbmcgdGhlIHN0b3JlZCBibG9ja3MgbGFzdC1ibG9jayBiaXRzIGFuZAotICAgICBsZW5ndGhzLgotICAgLSBVcGRhdGUgdGhlIGNyYyBhbmQgbGVuZ3RoIHdpdGggdGhlIG5ldyBkYXRhLCBhbmQgd3JpdGUgdGhlIGd6aXAgdHJhaWxlci4KLSAgIC0gV3JpdGUgb3ZlciB0aGUgZXh0cmEgZmllbGQgKHdpdGggYSBzaW5nbGUgd3JpdGUgb3BlcmF0aW9uKSB3aXRoIHRoZSBuZXcKLSAgICAgcG9pbnRlcnMsIGxlbmd0aHMsIGFuZCBjcmMncywgYW5kIG1hcmsgdGhlIGd6aXAgZmlsZSBhcyBub3QgaW4gcHJvY2Vzcy4KLSAgICAgVGhvdWdoIHRoZXJlIGlzIHN0aWxsIGEgZm9vLmFkZCBmaWxlLCBpdCB3aWxsIGJlIGlnbm9yZWQgc2luY2Ugbm90aGluZwotICAgICBpcyBpbiBwcm9jZXNzLiAgSWYgYSBmb28uYWRkIGZpbGUgaXMgbGVmdG92ZXIgZnJvbSBhIHByZXZpb3VzbHkKLSAgICAgY29tcGxldGVkIG9wZXJhdGlvbiwgaXQgaXMgdHJ1bmNhdGVkIHdoZW4gd3JpdGluZyBuZXcgZGF0YSB0byBpdC4KLSAgIC0gRGVsZXRlIHRoZSBmb28uYWRkIGZpbGUuCi0KLSAgIENvbXByZXNzIGFuZCByZXBsYWNlIHByb2NlZHVyZXM6Ci0gICAtIFJlYWQgYWxsIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBpbiB0aGUgc3RvcmVkIGJsb2NrcyBpbiBmb28uZ3ogYW5kIHdyaXRlCi0gICAgIGl0IHRvIGZvby5hZGQuICBBbHNvIHdyaXRlIGZvby50ZW1wIHdpdGggdGhlIGxhc3QgMzJLIG9mIHRoYXQgZGF0YSB0bwotICAgICBwcm92aWRlIGEgZGljdGlvbmFyeSBmb3IgdGhlIG5leHQgaW52b2NhdGlvbiBvZiB0aGlzIHByb2NlZHVyZS4KLSAgIC0gUmV3cml0ZSB0aGUgZXh0cmEgZmllbGQgbWFya2luZyBmb28uZ3ogd2l0aCBhIGNvbXByZXNzaW9uIGluIHByb2Nlc3MuCi0gICAqIElmIHRoZXJlIGlzIG5vIGRhdGEgcHJvdmlkZWQgdG8gY29tcHJlc3MgKGR1ZSB0byBhIG1pc3NpbmcgZm9vLmFkZCBmaWxlCi0gICAgIHdoZW4gcmVjb3ZlcmluZyksIHJlY29uc3RydWN0IGFuZCB0cnVuY2F0ZSB0aGUgZm9vLmd6IGZpbGUgdG8gY29udGFpbgotICAgICBvbmx5IHRoZSBwcmV2aW91cyBjb21wcmVzc2VkIGRhdGEgYW5kIHByb2NlZWQgdG8gdGhlIHN0ZXAgYWZ0ZXIgdGhlIG5leHQKLSAgICAgb25lLiAgT3RoZXJ3aXNlIC4uLgotICAgLSBDb21wcmVzcyB0aGUgZGF0YSB3aXRoIHRoZSBkaWN0aW9uYXJ5IGluIGZvby5kaWN0LCBhbmQgd3JpdGUgdG8gdGhlCi0gICAgIGZvby5neiBmaWxlIHN0YXJ0aW5nIGF0IHRoZSBiaXQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBsYXN0IHByZXZpb3VzbHkKLSAgICAgY29tcHJlc3NlZCBibG9jay4gIElmIHRoZXJlIGlzIG5vIGZvby5kaWN0LCBwcm9jZWVkIGFueXdheSB3aXRoIHRoZQotICAgICBjb21wcmVzc2lvbiBhdCBzbGlnaHRseSByZWR1Y2VkIGVmZmljaWVuY3kuICAoRm9yIHRoZSBmb28uZGljdCBmaWxlIHRvIGJlCi0gICAgIG1pc3NpbmcgcmVxdWlyZXMgc29tZSBleHRlcm5hbCBmYWlsdXJlIGJleW9uZCBzaW1wbHkgdGhlIGludGVycnVwdGlvbiBvZgotICAgICBhIGNvbXByZXNzIG9wZXJhdGlvbi4pICBEdXJpbmcgdGhpcyBwcm9jZXNzLCB0aGUgZm9vLmxvY2sgZmlsZSBpcwotICAgICBwZXJpb2RpY2FsbHkgdG91Y2hlZCB0byBhc3N1cmUgdGhhdCB0aGF0IGZpbGUgaXMgbm90IGNvbnNpZGVyZWQgc3RhbGUgYnkKLSAgICAgYW5vdGhlciBwcm9jZXNzIGJlZm9yZSB3ZSdyZSBkb25lLiAgVGhlIGRlZmxhdGlvbiBpcyB0ZXJtaW5hdGVkIHdpdGggYQotICAgICBub24tbGFzdCBlbXB0eSBzdGF0aWMgYmxvY2sgKDEwIGJpdHMgbG9uZyksIHRoYXQgaXMgdGhlbiBsb2NhdGVkIGFuZAotICAgICB3cml0dGVuIG92ZXIgYnkgYSBsYXN0LWJpdC1zZXQgZW1wdHkgc3RvcmVkIGJsb2NrLgotICAgLSBBcHBlbmQgdGhlIGNyYyBhbmQgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIHRoZSBnemlwIGZpbGUgKHByZXZpb3VzbHkKLSAgICAgY2FsY3VsYXRlZCBkdXJpbmcgdGhlIGFwcGVuZCBvcGVyYXRpb25zKS4KLSAgIC0gV3JpdGUgb3ZlciB0aGUgZXh0cmEgZmllbGQgd2l0aCB0aGUgdXBkYXRlZCBzdG9yZWQgYmxvY2sgb2Zmc2V0cywgYml0cwotICAgICBiYWNrLCBjcmMncywgYW5kIGxlbmd0aHMsIGFuZCBtYXJrIGZvby5neiBhcyBpbiBwcm9jZXNzIGZvciBhIHJlcGxhY2VtZW50Ci0gICAgIG9mIHRoZSBkaWN0aW9uYXJ5LgotICAgQCBEZWxldGUgdGhlIGZvby5hZGQgZmlsZS4KLSAgIC0gUmVwbGFjZSBmb28uZGljdCB3aXRoIGZvby50ZW1wLgotICAgLSBXcml0ZSBvdmVyIHRoZSBleHRyYSBmaWVsZCwgbWFya2luZyBmb28uZ3ogYXMgY29tcGxldGUuCi0KLSAgIFJlY292ZXJ5IHByb2NlZHVyZToKLSAgIC0gSWYgbm90IGEgcmVwbGFjZSByZWNvdmVyeSwgcmVhZCBpbiB0aGUgZm9vLmFkZCBmaWxlLCBhbmQgcHJvdmlkZSB0aGF0IGRhdGEKLSAgICAgdG8gdGhlIGFwcHJvcHJpYXRlIHJlY292ZXJ5IGJlbG93LiAgSWYgdGhlcmUgaXMgbm8gZm9vLmFkZCBmaWxlLCBwcm92aWRlCi0gICAgIGEgemVybyBkYXRhIGxlbmd0aCB0byB0aGUgcmVjb3ZlcnkuICBJbiB0aGF0IGNhc2UsIHRoZSBhcHBlbmQgcmVjb3ZlcnkKLSAgICAgcmVzdG9yZXMgdGhlIGZvby5neiB0byB0aGUgcHJldmlvdXMgY29tcHJlc3NlZCArIHVuY29tcHJlc3NlZCBkYXRhIHN0YXRlLgotICAgICBGb3IgdGhlIHRoZSBjb21wcmVzcyByZWNvdmVyeSwgYSBtaXNzaW5nIGZvby5hZGQgZmlsZSByZXN1bHRzIGluIGZvby5negotICAgICBiZWluZyByZXN0b3JlZCB0byB0aGUgcHJldmlvdXMgY29tcHJlc3NlZC1vbmx5IGRhdGEgc3RhdGUuCi0gICAtIEFwcGVuZCByZWNvdmVyeToKLSAgICAgLSBQaWNrIHVwIGFwcGVuZCBhdCArIHN0ZXAgYWJvdmUKLSAgIC0gQ29tcHJlc3MgcmVjb3Zlcnk6Ci0gICAgIC0gUGljayB1cCBjb21wcmVzcyBhdCAqIHN0ZXAgYWJvdmUKLSAgIC0gUmVwbGFjZSByZWNvdmVyeToKLSAgICAgLSBQaWNrIHVwIGNvbXByZXNzIGF0IEAgc3RlcCBhYm92ZQotICAgLSBMb2cgdGhlIHJlcGFpciB3aXRoIGEgZGF0ZSBzdGFtcCBpbiBmb28ucmVwYWlycwotICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPiAgICAgIC8qIHJlbmFtZSwgZm9wZW4sIGZwcmludGYsIGZjbG9zZSAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPiAgICAgLyogbWFsbG9jLCBmcmVlICovCi0jaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAvKiBzdHJsZW4sIHN0cnJjaHIsIHN0cmNweSwgc3RybmNweSwgc3RyY21wICovCi0jaW5jbHVkZSA8ZmNudGwuaD4gICAgICAvKiBvcGVuICovCi0jaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAvKiBsc2VlaywgcmVhZCwgd3JpdGUsIGNsb3NlLCB1bmxpbmssIHNsZWVwLCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogZnRydW5jYXRlLCBmc3luYyAqLwotI2luY2x1ZGUgPGVycm5vLmg+ICAgICAgLyogZXJybm8gKi8KLSNpbmNsdWRlIDx0aW1lLmg+ICAgICAgIC8qIHRpbWUsIGN0aW1lICovCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4gICAvKiBzdGF0ICovCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4gICAvKiB1dGltZXMgKi8KLSNpbmNsdWRlICJ6bGliLmgiICAgICAgIC8qIGNyYzMyICovCi0KLSNpbmNsdWRlICJnemxvZy5oIiAgICAgIC8qIGhlYWRlciBmb3IgZXh0ZXJuYWwgYWNjZXNzICovCi0KLSNkZWZpbmUgbG9jYWwgc3RhdGljCi10eXBlZGVmIHVuc2lnbmVkIGludCB1aW50OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVsb25nOwotCi0vKiBNYWNybyBmb3IgZGVidWdnaW5nIHRvIGRldGVybWluaXN0aWNhbGx5IGZvcmNlIHJlY292ZXJ5IG9wZXJhdGlvbnMgKi8KLSNpZmRlZiBERUJVRwotICAgICNpbmNsdWRlIDxzZXRqbXAuaD4gICAgICAgICAvKiBsb25nam1wICovCi0gICAgam1wX2J1ZiBnemxvZ19qdW1wOyAgICAgICAgIC8qIHdoZXJlIHRvIGdvIGJhY2sgdG8gKi8KLSAgICBpbnQgZ3psb2dfYmFpbCA9IDA7ICAgICAgICAgLyogd2hpY2ggcG9pbnQgdG8gYmFpbCBhdCAoMS4uOCkgKi8KLSAgICBpbnQgZ3psb2dfY291bnQgPSAtMTsgICAgICAgLyogbnVtYmVyIG9mIHRpbWVzIHRocm91Z2ggdG8gd2FpdCAqLwotIyAgIGRlZmluZSBCQUlMKG4pIGRvIHsgaWYgKG4gPT0gZ3psb2dfYmFpbCAmJiBnemxvZ19jb3VudC0tID09IDApIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nam1wKGd6bG9nX2p1bXAsIGd6bG9nX2JhaWwpOyB9IHdoaWxlICgwKQotI2Vsc2UKLSMgICBkZWZpbmUgQkFJTChuKQotI2VuZGlmCi0KLS8qIGhvdyBvbGQgdGhlIGxvY2sgZmlsZSBjYW4gYmUgaW4gc2Vjb25kcyBiZWZvcmUgY29uc2lkZXJpbmcgaXQgc3RhbGUgKi8KLSNkZWZpbmUgUEFUSUVOQ0UgMzAwCi0KLS8qIG1heGltdW0gc3RvcmVkIGJsb2NrIHNpemUgaW4gS2J5dGVzIC0tIG11c3QgYmUgaW4gMS4uNjMgKi8KLSNkZWZpbmUgTUFYX1NUT1JFIDE2Ci0KLS8qIG51bWJlciBvZiBzdG9yZWQgS2J5dGVzIHRvIHRyaWdnZXIgY29tcHJlc3Npb24gKG11c3QgYmUgPj0gMzIgdG8gYWxsb3cKLSAgIGRpY3Rpb25hcnkgY29uc3RydWN0aW9uLCBhbmQgPD0gMjA0ICogTUFYX1NUT1JFLCBpbiBvcmRlciBmb3IgPj4gMTAgdG8KLSAgIGRpc2NhcmQgdGhlIHN0b3JlZCBibG9jayBoZWFkZXJzIGNvbnRyaWJ1dGlvbiBvZiBmaXZlIGJ5dGVzIGVhY2gpICovCi0jZGVmaW5lIFRSSUdHRVIgMTAyNAotCi0vKiBzaXplIG9mIGEgZGVmbGF0ZSBkaWN0aW9uYXJ5ICh0aGlzIGNhbm5vdCBiZSBjaGFuZ2VkKSAqLwotI2RlZmluZSBESUNUIDMyNzY4VQotCi0vKiB2YWx1ZXMgZm9yIHRoZSBvcGVyYXRpb24gKDIgYml0cykgKi8KLSNkZWZpbmUgTk9fT1AgMAotI2RlZmluZSBBUFBFTkRfT1AgMQotI2RlZmluZSBDT01QUkVTU19PUCAyCi0jZGVmaW5lIFJFUExBQ0VfT1AgMwotCi0vKiBtYWNyb3MgdG8gZXh0cmFjdCBsaXR0bGUtZW5kaWFuIGludGVnZXJzIGZyb20gYW4gdW5zaWduZWQgYnl0ZSBidWZmZXIgKi8KLSNkZWZpbmUgUFVMTDIocCkgKChwKVswXSsoKHVpbnQpKChwKVsxXSk8PDgpKQotI2RlZmluZSBQVUxMNChwKSAoUFVMTDIocCkrKCh1bG9uZylQVUxMMihwKzIpPDwxNikpCi0jZGVmaW5lIFBVTEw4KHApIChQVUxMNChwKSsoKG9mZl90KVBVTEw0KHArNCk8PDMyKSkKLQotLyogbWFjcm9zIHRvIHN0b3JlIGludGVnZXJzIGludG8gYSBieXRlIGJ1ZmZlciBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyICovCi0jZGVmaW5lIFBVVDIocCxhKSBkbyB7KHApWzBdPWE7KHApWzFdPShhKT4+ODt9IHdoaWxlKDApCi0jZGVmaW5lIFBVVDQocCxhKSBkbyB7UFVUMihwLGEpO1BVVDIocCsyLGE+PjE2KTt9IHdoaWxlKDApCi0jZGVmaW5lIFBVVDgocCxhKSBkbyB7UFVUNChwLGEpO1BVVDQocCs0LGE+PjMyKTt9IHdoaWxlKDApCi0KLS8qIGludGVybmFsIHN0cnVjdHVyZSBmb3IgbG9nIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIExPR0lEICJcMTA2XDAzNVwxNzIiICAgIC8qIHNob3VsZCBiZSB0aHJlZSBub24temVybyBjaGFyYWN0ZXJzICovCi1zdHJ1Y3QgbG9nIHsKLSAgICBjaGFyIGlkWzRdOyAgICAgLyogY29udGFpbnMgTE9HSUQgdG8gZGV0ZWN0IGluYWR2ZXJ0ZW50IG92ZXJ3cml0ZXMgKi8KLSAgICBpbnQgZmQ7ICAgICAgICAgLyogZmlsZSBkZXNjcmlwdG9yIGZvciAuZ3ogZmlsZSwgb3BlbmVkIHJlYWQvd3JpdGUgKi8KLSAgICBjaGFyICpwYXRoOyAgICAgLyogYWxsb2NhdGVkIHBhdGgsIGUuZy4gIi92YXIvbG9nL2ZvbyIgb3IgImZvbyIgKi8KLSAgICBjaGFyICplbmQ7ICAgICAgLyogZW5kIG9mIHBhdGgsIGZvciBhcHBlbmRpbmcgc3VmZmljZXMgc3VjaCBhcyAiLmd6IiAqLwotICAgIG9mZl90IGZpcnN0OyAgICAvKiBvZmZzZXQgb2YgZmlyc3Qgc3RvcmVkIGJsb2NrIGZpcnN0IGxlbmd0aCBieXRlICovCi0gICAgaW50IGJhY2s7ICAgICAgIC8qIGxvY2F0aW9uIG9mIGZpcnN0IGJsb2NrIGlkIGluIGJpdHMgYmFjayBmcm9tIGZpcnN0ICovCi0gICAgdWludCBzdG9yZWQ7ICAgIC8qIGJ5dGVzIGN1cnJlbnRseSBpbiBsYXN0IHN0b3JlZCBibG9jayAqLwotICAgIG9mZl90IGxhc3Q7ICAgICAvKiBvZmZzZXQgb2YgbGFzdCBzdG9yZWQgYmxvY2sgZmlyc3QgbGVuZ3RoIGJ5dGUgKi8KLSAgICB1bG9uZyBjY3JjOyAgICAgLyogY3JjIG9mIGNvbXByZXNzZWQgZGF0YSAqLwotICAgIHVsb25nIGNsZW47ICAgICAvKiBsZW5ndGggKG1vZHVsbyAyXjMyKSBvZiBjb21wcmVzc2VkIGRhdGEgKi8KLSAgICB1bG9uZyB0Y3JjOyAgICAgLyogY3JjIG9mIHRvdGFsIGRhdGEgKi8KLSAgICB1bG9uZyB0bGVuOyAgICAgLyogbGVuZ3RoIChtb2R1bG8gMl4zMikgb2YgdG90YWwgZGF0YSAqLwotICAgIHRpbWVfdCBsb2NrOyAgICAvKiBsYXN0IG1vZGlmeSB0aW1lIG9mIG91ciBsb2NrIGZpbGUgKi8KLX07Ci0KLS8qIGd6aXAgaGVhZGVyIGZvciBnemxvZyAqLwotbG9jYWwgdW5zaWduZWQgY2hhciBsb2dfZ3poZWFkW10gPSB7Ci0gICAgMHgxZiwgMHg4YiwgICAgICAgICAgICAgICAgIC8qIG1hZ2ljIGd6aXAgaWQgKi8KLSAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29tcHJlc3Npb24gbWV0aG9kIGlzIGRlZmxhdGUgKi8KLSAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlcmUgaXMgYW4gZXh0cmEgZmllbGQgKG5vIGZpbGUgbmFtZSkgKi8KLSAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgLyogbm8gbW9kaWZpY2F0aW9uIHRpbWUgcHJvdmlkZWQgKi8KLSAgICAwLCAweGZmLCAgICAgICAgICAgICAgICAgICAgLyogbm8gZXh0cmEgZmxhZ3MsIG5vIE9TIHNwZWNpZmllZCAqLwotICAgIDM5LCAwLCAnYScsICdwJywgMzUsIDAgICAgICAvKiBleHRyYSBmaWVsZCB3aXRoICJhcCIgc3ViZmllbGQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzUgaXMgRVhUUkEsIDM5IGlzIEVYVFJBICsgNCAqLwotfTsKLQotI2RlZmluZSBIRUFEIHNpemVvZihsb2dfZ3poZWFkKSAgICAgLyogc2hvdWxkIGJlIDE2ICovCi0KLS8qIGluaXRpYWwgZ3ppcCBleHRyYSBmaWVsZCBjb250ZW50ICg1MiA9PSBIRUFEICsgRVhUUkEgKyAxKSAqLwotbG9jYWwgdW5zaWduZWQgY2hhciBsb2dfZ3pleHRbXSA9IHsKLSAgICA1MiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgLyogb2Zmc2V0IG9mIGZpcnN0IHN0b3JlZCBibG9jayBsZW5ndGggKi8KLSAgICA1MiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgLyogb2Zmc2V0IG9mIGxhc3Qgc3RvcmVkIGJsb2NrIGxlbmd0aCAqLwotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAvKiBjb21wcmVzc2VkIGRhdGEgY3JjIGFuZCBsZW5ndGggKi8KLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgLyogdG90YWwgZGF0YSBjcmMgYW5kIGxlbmd0aCAqLwotICAgIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAvKiBmaW5hbCBzdG9yZWQgYmxvY2sgZGF0YSBsZW5ndGggKi8KLSAgICA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3AgaXMgTk9fT1AsIGxhc3QgYml0IDggYml0cyBiYWNrICovCi19OwotCi0jZGVmaW5lIEVYVFJBIHNpemVvZihsb2dfZ3pleHQpICAgICAvKiBzaG91bGQgYmUgMzUgKi8KLQotLyogaW5pdGlhbCBnemlwIGRhdGEgYW5kIHRyYWlsZXIgKi8KLWxvY2FsIHVuc2lnbmVkIGNoYXIgbG9nX2d6Ym9keVtdID0gewotICAgIDEsIDAsIDAsIDB4ZmYsIDB4ZmYsICAgICAgICAvKiBlbXB0eSBzdG9yZWQgYmxvY2sgKGxhc3QpICovCi0gICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgIC8qIGNyYyAqLwotICAgIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAvKiB1bmNvbXByZXNzZWQgbGVuZ3RoICovCi19OwotCi0jZGVmaW5lIEJPRFkgc2l6ZW9mKGxvZ19nemJvZHkpCi0KLS8qIEV4Y2x1c2l2ZWx5IGNyZWF0ZSBmb28ubG9jayBpbiBvcmRlciB0byBuZWdvdGlhdGUgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUKLSAgIGZvby4qIGZpbGVzLiAgSWYgdGhlIG1vZGlmeSB0aW1lIG9mIGFuIGV4aXN0aW5nIGxvY2sgZmlsZSBpcyBncmVhdGVyIHRoYW4KLSAgIFBBVElFTkNFIHNlY29uZHMgaW4gdGhlIHBhc3QsIHRoZW4gY29uc2lkZXIgdGhlIGxvY2sgZmlsZSB0byBoYXZlIGJlZW4KLSAgIGFiYW5kb25lZCwgZGVsZXRlIGl0LCBhbmQgdHJ5IHRoZSBleGNsdXNpdmUgY3JlYXRlIGFnYWluLiAgU2F2ZSB0aGUgbG9jawotICAgZmlsZSBtb2RpZnkgdGltZSBmb3IgdmVyaWZpY2F0aW9uIG9mIG93bmVyc2hpcC4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG9yIC0xCi0gICBvbiBmYWlsdXJlLCB1c3VhbGx5IGR1ZSB0byBhbiBhY2Nlc3MgcmVzdHJpY3Rpb24gb3IgaW52YWxpZCBwYXRoLiAgTm90ZSB0aGF0Ci0gICBpZiBzdGF0KCkgb3IgdW5saW5rKCkgZmFpbHMsIGl0IG1heSBiZSBkdWUgdG8gYW5vdGhlciBwcm9jZXNzIG5vdGljaW5nIHRoZQotICAgYWJhbmRvbmVkIGxvY2sgZmlsZSBhIHNtaWRnZSBzb29uZXIgYW5kIGRlbGV0aW5nIGl0LCBzbyB0aG9zZSBhcmUgbm90Ci0gICBmbGFnZ2VkIGFzIGFuIGVycm9yLiAqLwotbG9jYWwgaW50IGxvZ19sb2NrKHN0cnVjdCBsb2cgKmxvZykKLXsKLSAgICBpbnQgZmQ7Ci0gICAgc3RydWN0IHN0YXQgc3Q7Ci0KLSAgICBzdHJjcHkobG9nLT5lbmQsICIubG9jayIpOwotICAgIHdoaWxlICgoZmQgPSBvcGVuKGxvZy0+cGF0aCwgT19DUkVBVCB8IE9fRVhDTCwgMDY0NCkpIDwgMCkgewotICAgICAgICBpZiAoZXJybm8gIT0gRUVYSVNUKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoc3RhdChsb2ctPnBhdGgsICZzdCkgPT0gMCAmJiB0aW1lKE5VTEwpIC0gc3Quc3RfbXRpbWUgPiBQQVRJRU5DRSkgewotICAgICAgICAgICAgdW5saW5rKGxvZy0+cGF0aCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBzbGVlcCgyKTsgICAgICAgLyogcmVsaW5xdWlzaCB0aGUgQ1BVIGZvciB0d28gc2Vjb25kcyB3aGlsZSB3YWl0aW5nICovCi0gICAgfQotICAgIGNsb3NlKGZkKTsKLSAgICBpZiAoc3RhdChsb2ctPnBhdGgsICZzdCkgPT0gMCkKLSAgICAgICAgbG9nLT5sb2NrID0gc3Quc3RfbXRpbWU7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgbW9kaWZ5IHRpbWUgb2YgdGhlIGxvY2sgZmlsZSB0byBub3csIGluIG9yZGVyIHRvIHByZXZlbnQgYW5vdGhlcgotICAgdGFzayBmcm9tIHRoaW5raW5nIHRoYXQgdGhlIGxvY2sgaXMgc3RhbGUuICBTYXZlIHRoZSBsb2NrIGZpbGUgbW9kaWZ5IHRpbWUKLSAgIGZvciB2ZXJpZmljYXRpb24gb2Ygb3duZXJzaGlwLiAqLwotbG9jYWwgdm9pZCBsb2dfdG91Y2goc3RydWN0IGxvZyAqbG9nKQotewotICAgIHN0cnVjdCBzdGF0IHN0OwotCi0gICAgc3RyY3B5KGxvZy0+ZW5kLCAiLmxvY2siKTsKLSAgICB1dGltZXMobG9nLT5wYXRoLCBOVUxMKTsKLSAgICBpZiAoc3RhdChsb2ctPnBhdGgsICZzdCkgPT0gMCkKLSAgICAgICAgbG9nLT5sb2NrID0gc3Quc3RfbXRpbWU7Ci19Ci0KLS8qIENoZWNrIHRoZSBsb2cgZmlsZSBtb2RpZnkgdGltZSBhZ2FpbnN0IHdoYXQgaXMgZXhwZWN0ZWQuICBSZXR1cm4gdHJ1ZSBpZgotICAgdGhpcyBpcyBub3Qgb3VyIGxvY2suICBJZiBpdCBpcyBvdXIgbG9jaywgdG91Y2ggaXQgdG8ga2VlcCBpdC4gKi8KLWxvY2FsIGludCBsb2dfY2hlY2soc3RydWN0IGxvZyAqbG9nKQotewotICAgIHN0cnVjdCBzdGF0IHN0OwotCi0gICAgc3RyY3B5KGxvZy0+ZW5kLCAiLmxvY2siKTsKLSAgICBpZiAoc3RhdChsb2ctPnBhdGgsICZzdCkgfHwgc3Quc3RfbXRpbWUgIT0gbG9nLT5sb2NrKQotICAgICAgICByZXR1cm4gMTsKLSAgICBsb2dfdG91Y2gobG9nKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyogVW5sb2NrIGEgcHJldmlvdXNseSBhY3F1aXJlZCBsb2NrLCBidXQgb25seSBpZiBpdCdzIG91cnMuICovCi1sb2NhbCB2b2lkIGxvZ191bmxvY2soc3RydWN0IGxvZyAqbG9nKQotewotICAgIGlmIChsb2dfY2hlY2sobG9nKSkKLSAgICAgICAgcmV0dXJuOwotICAgIHN0cmNweShsb2ctPmVuZCwgIi5sb2NrIik7Ci0gICAgdW5saW5rKGxvZy0+cGF0aCk7Ci0gICAgbG9nLT5sb2NrID0gMDsKLX0KLQotLyogQ2hlY2sgdGhlIGd6aXAgaGVhZGVyIGFuZCByZWFkIGluIHRoZSBleHRyYSBmaWVsZCwgZmlsbGluZyBpbiB0aGUgdmFsdWVzIGluCi0gICB0aGUgbG9nIHN0cnVjdHVyZS4gIFJldHVybiBvcCBvbiBzdWNjZXNzIG9yIC0xIGlmIHRoZSBnemlwIGhlYWRlciB3YXMgbm90IGFzCi0gICBleHBlY3RlZC4gIG9wIGlzIHRoZSBjdXJyZW50IG9wZXJhdGlvbiBpbiBwcm9ncmVzcyBsYXN0IHdyaXR0ZW4gdG8gdGhlIGV4dHJhCi0gICBmaWVsZC4gIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBnemlwIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBvcGVuZWQsIHdpdGggdGhlCi0gICBmaWxlIGRlc2NyaXB0b3IgbG9nLT5mZC4gKi8KLWxvY2FsIGludCBsb2dfaGVhZChzdHJ1Y3QgbG9nICpsb2cpCi17Ci0gICAgaW50IG9wOwotICAgIHVuc2lnbmVkIGNoYXIgYnVmW0hFQUQgKyBFWFRSQV07Ci0KLSAgICBpZiAobHNlZWsobG9nLT5mZCwgMCwgU0VFS19TRVQpIDwgMCB8fAotICAgICAgICByZWFkKGxvZy0+ZmQsIGJ1ZiwgSEVBRCArIEVYVFJBKSAhPSBIRUFEICsgRVhUUkEgfHwKLSAgICAgICAgbWVtY21wKGJ1ZiwgbG9nX2d6aGVhZCwgSEVBRCkpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBsb2ctPmZpcnN0ID0gUFVMTDgoYnVmICsgSEVBRCk7Ci0gICAgbG9nLT5sYXN0ID0gUFVMTDgoYnVmICsgSEVBRCArIDgpOwotICAgIGxvZy0+Y2NyYyA9IFBVTEw0KGJ1ZiArIEhFQUQgKyAxNik7Ci0gICAgbG9nLT5jbGVuID0gUFVMTDQoYnVmICsgSEVBRCArIDIwKTsKLSAgICBsb2ctPnRjcmMgPSBQVUxMNChidWYgKyBIRUFEICsgMjQpOwotICAgIGxvZy0+dGxlbiA9IFBVTEw0KGJ1ZiArIEhFQUQgKyAyOCk7Ci0gICAgbG9nLT5zdG9yZWQgPSBQVUxMMihidWYgKyBIRUFEICsgMzIpOwotICAgIGxvZy0+YmFjayA9IDMgKyAoYnVmW0hFQUQgKyAzNF0gJiA3KTsKLSAgICBvcCA9IChidWZbSEVBRCArIDM0XSA+PiAzKSAmIDM7Ci0gICAgcmV0dXJuIG9wOwotfQotCi0vKiBXcml0ZSBvdmVyIHRoZSBleHRyYSBmaWVsZCBjb250ZW50cywgbWFya2luZyB0aGUgb3BlcmF0aW9uIGFzIG9wLiAgVXNlIGZzeW5jCi0gICB0byBhc3N1cmUgdGhhdCB0aGUgZGV2aWNlIGlzIHdyaXR0ZW4gdG8sIGFuZCBpbiB0aGUgcmVxdWVzdGVkIG9yZGVyLiAgVGhpcwotICAgb3BlcmF0aW9uLCBhbmQgb25seSB0aGlzIG9wZXJhdGlvbiwgaXMgYXNzdW1lZCB0byBiZSBhdG9taWMgaW4gb3JkZXIgdG8KLSAgIGFzc3VyZSB0aGF0IHRoZSBsb2cgaXMgcmVjb3ZlcmFibGUgaW4gdGhlIGV2ZW50IG9mIGFuIGludGVycnVwdGlvbiBhdCBhbnkKLSAgIHBvaW50IGluIHRoZSBwcm9jZXNzLiAgUmV0dXJuIC0xIGlmIHRoZSB3cml0ZSB0byBmb28uZ3ogZmFpbGVkLiAqLwotbG9jYWwgaW50IGxvZ19tYXJrKHN0cnVjdCBsb2cgKmxvZywgaW50IG9wKQotewotICAgIGludCByZXQ7Ci0gICAgdW5zaWduZWQgY2hhciBleHRbRVhUUkFdOwotCi0gICAgUFVUOChleHQsIGxvZy0+Zmlyc3QpOwotICAgIFBVVDgoZXh0ICsgOCwgbG9nLT5sYXN0KTsKLSAgICBQVVQ0KGV4dCArIDE2LCBsb2ctPmNjcmMpOwotICAgIFBVVDQoZXh0ICsgMjAsIGxvZy0+Y2xlbik7Ci0gICAgUFVUNChleHQgKyAyNCwgbG9nLT50Y3JjKTsKLSAgICBQVVQ0KGV4dCArIDI4LCBsb2ctPnRsZW4pOwotICAgIFBVVDIoZXh0ICsgMzIsIGxvZy0+c3RvcmVkKTsKLSAgICBleHRbMzRdID0gbG9nLT5iYWNrIC0gMyArIChvcCA8PCAzKTsKLSAgICBmc3luYyhsb2ctPmZkKTsKLSAgICByZXQgPSBsc2Vlayhsb2ctPmZkLCBIRUFELCBTRUVLX1NFVCkgPCAwIHx8Ci0gICAgICAgICAgd3JpdGUobG9nLT5mZCwgZXh0LCBFWFRSQSkgIT0gRVhUUkEgPyAtMSA6IDA7Ci0gICAgZnN5bmMobG9nLT5mZCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyogUmV3cml0ZSB0aGUgbGFzdCBibG9jayBoZWFkZXIgYml0cyBhbmQgc3Vic2VxdWVudCB6ZXJvIGJpdHMgdG8gZ2V0IHRvIGEgYnl0ZQotICAgYm91bmRhcnksIHNldHRpbmcgdGhlIGxhc3QgYmxvY2sgYml0IGlmIGxhc3QgaXMgdHJ1ZSwgYW5kIHRoZW4gd3JpdGUgdGhlCi0gICByZW1haW5kZXIgb2YgdGhlIHN0b3JlZCBibG9jayBoZWFkZXIgKGxlbmd0aCBhbmQgb25lJ3MgY29tcGxlbWVudCkuICBMZWF2ZQotICAgdGhlIGZpbGUgcG9pbnRlciBhZnRlciB0aGUgZW5kIG9mIHRoZSBsYXN0IHN0b3JlZCBibG9jayBkYXRhLiAgUmV0dXJuIC0xIGlmCi0gICB0aGVyZSBpcyBhIHJlYWQgb3Igd3JpdGUgZmFpbHVyZSBvbiB0aGUgZm9vLmd6IGZpbGUgKi8KLWxvY2FsIGludCBsb2dfbGFzdChzdHJ1Y3QgbG9nICpsb2csIGludCBsYXN0KQotewotICAgIGludCBiYWNrLCBsZW4sIG1hc2s7Ci0gICAgdW5zaWduZWQgY2hhciBidWZbNl07Ci0KLSAgICAvKiBkZXRlcm1pbmUgdGhlIGxvY2F0aW9ucyBvZiB0aGUgYnl0ZXMgYW5kIGJpdHMgdG8gbW9kaWZ5ICovCi0gICAgYmFjayA9IGxvZy0+bGFzdCA9PSBsb2ctPmZpcnN0ID8gbG9nLT5iYWNrIDogODsKLSAgICBsZW4gPSBiYWNrID4gOCA/IDIgOiAxOyAgICAgICAgICAgICAgICAgLyogYnl0ZXMgYmFjayBmcm9tIGxvZy0+bGFzdCAqLwotICAgIG1hc2sgPSAweDgwID4+ICgoYmFjayAtIDEpICYgNyk7ICAgICAgICAvKiBtYXNrIGZvciBibG9jayBsYXN0LWJpdCAqLwotCi0gICAgLyogZ2V0IHRoZSBieXRlIHRvIG1vZGlmeSAob25lIG9yIHR3byBiYWNrKSBpbnRvIGJ1ZlswXSAtLSBkb24ndCBuZWVkIHRvCi0gICAgICAgcmVhZCB0aGUgYnl0ZSBpZiB0aGUgbGFzdC1iaXQgaXMgZWlnaHQgYml0cyBiYWNrLCBzaW5jZSBpbiB0aGF0IGNhc2UKLSAgICAgICB0aGUgZW50aXJlIGJ5dGUgd2lsbCBiZSBtb2RpZmllZCAqLwotICAgIGJ1ZlswXSA9IDA7Ci0gICAgaWYgKGJhY2sgIT0gOCAmJiAobHNlZWsobG9nLT5mZCwgbG9nLT5sYXN0IC0gbGVuLCBTRUVLX1NFVCkgPCAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgcmVhZChsb2ctPmZkLCBidWYsIDEpICE9IDEpKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBjaGFuZ2UgdGhlIGxhc3QtYml0IG9mIHRoZSBsYXN0IHN0b3JlZCBibG9jayBhcyByZXF1ZXN0ZWQgLS0gbm90ZQotICAgICAgIHRoYXQgYWxsIGJpdHMgYWJvdmUgdGhlIGxhc3QtYml0IGFyZSBzZXQgdG8gemVybywgcGVyIHRoZSB0eXBlIGJpdHMKLSAgICAgICBvZiBhIHN0b3JlZCBibG9jayBiZWluZyAwMCBhbmQgcGVyIHRoZSBjb252ZW50aW9uIHRoYXQgdGhlIGJpdHMgdG8KLSAgICAgICBicmluZyB0aGUgc3RyZWFtIHRvIGEgYnl0ZSBib3VuZGFyeSBhcmUgYWxzbyB6ZXJvcyAqLwotICAgIGJ1ZlsxXSA9IDA7Ci0gICAgYnVmWzIgLSBsZW5dID0gKCpidWYgJiAobWFzayAtIDEpKSArIChsYXN0ID8gbWFzayA6IDApOwotCi0gICAgLyogd3JpdGUgdGhlIG1vZGlmaWVkIHN0b3JlZCBibG9jayBoZWFkZXIgYW5kIGxlbmd0aHMsIG1vdmUgdGhlIGZpbGUKLSAgICAgICBwb2ludGVyIHRvIGFmdGVyIHRoZSBsYXN0IHN0b3JlZCBibG9jayBkYXRhICovCi0gICAgUFVUMihidWYgKyAyLCBsb2ctPnN0b3JlZCk7Ci0gICAgUFVUMihidWYgKyA0LCBsb2ctPnN0b3JlZCBeIDB4ZmZmZik7Ci0gICAgcmV0dXJuIGxzZWVrKGxvZy0+ZmQsIGxvZy0+bGFzdCAtIGxlbiwgU0VFS19TRVQpIDwgMCB8fAotICAgICAgICAgICB3cml0ZShsb2ctPmZkLCBidWYgKyAyIC0gbGVuLCBsZW4gKyA0KSAhPSBsZW4gKyA0IHx8Ci0gICAgICAgICAgIGxzZWVrKGxvZy0+ZmQsIGxvZy0+c3RvcmVkLCBTRUVLX0NVUikgPCAwID8gLTEgOiAwOwotfQotCi0vKiBBcHBlbmQgbGVuIGJ5dGVzIGZyb20gZGF0YSB0byB0aGUgbG9ja2VkIGFuZCBvcGVuIGxvZyBmaWxlLiAgbGVuIG1heSBiZSB6ZXJvCi0gICBpZiByZWNvdmVyaW5nIGFuZCBubyAuYWRkIGZpbGUgd2FzIGZvdW5kLiAgSW4gdGhhdCBjYXNlLCB0aGUgcHJldmlvdXMgc3RhdGUKLSAgIG9mIHRoZSBmb28uZ3ogZmlsZSBpcyByZXN0b3JlZC4gIFRoZSBkYXRhIGlzIGFwcGVuZGVkIHVuY29tcHJlc3NlZCBpbgotICAgZGVmbGF0ZSBzdG9yZWQgYmxvY2tzLiAgUmV0dXJuIC0xIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIG9yIHdyaXRpbmcKLSAgIHRoZSBmb28uZ3ogZmlsZS4gKi8KLWxvY2FsIGludCBsb2dfYXBwZW5kKHN0cnVjdCBsb2cgKmxvZywgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IGxlbikKLXsKLSAgICB1aW50IHB1dDsKLSAgICBvZmZfdCBlbmQ7Ci0gICAgdW5zaWduZWQgY2hhciBidWZbOF07Ci0KLSAgICAvKiBzZXQgdGhlIGxhc3QgYmxvY2sgbGFzdC1iaXQgYW5kIGxlbmd0aCwgaW4gY2FzZSByZWNvdmVyaW5nIGFuCi0gICAgICAgaW50ZXJydXB0ZWQgYXBwZW5kLCB0aGVuIHBvc2l0aW9uIHRoZSBmaWxlIHBvaW50ZXIgdG8gYXBwZW5kIHRvIHRoZQotICAgICAgIGJsb2NrICovCi0gICAgaWYgKGxvZ19sYXN0KGxvZywgMSkpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIGFwcGVuZCwgYWRkaW5nIHN0b3JlZCBibG9ja3MgYW5kIHVwZGF0aW5nIHRoZSBvZmZzZXQgb2YgdGhlIGxhc3Qgc3RvcmVkCi0gICAgICAgYmxvY2sgYXMgbmVlZGVkLCBhbmQgdXBkYXRlIHRoZSB0b3RhbCBjcmMgYW5kIGxlbmd0aCAqLwotICAgIHdoaWxlIChsZW4pIHsKLSAgICAgICAgLyogYXBwZW5kIGFzIG11Y2ggYXMgd2UgY2FuIHRvIHRoZSBsYXN0IGJsb2NrICovCi0gICAgICAgIHB1dCA9IChNQVhfU1RPUkUgPDwgMTApIC0gbG9nLT5zdG9yZWQ7Ci0gICAgICAgIGlmIChwdXQgPiBsZW4pCi0gICAgICAgICAgICBwdXQgPSAodWludClsZW47Ci0gICAgICAgIGlmIChwdXQpIHsKLSAgICAgICAgICAgIGlmICh3cml0ZShsb2ctPmZkLCBkYXRhLCBwdXQpICE9IHB1dCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICBCQUlMKDEpOwotICAgICAgICAgICAgbG9nLT50Y3JjID0gY3JjMzIobG9nLT50Y3JjLCBkYXRhLCBwdXQpOwotICAgICAgICAgICAgbG9nLT50bGVuICs9IHB1dDsKLSAgICAgICAgICAgIGxvZy0+c3RvcmVkICs9IHB1dDsKLSAgICAgICAgICAgIGRhdGEgKz0gcHV0OwotICAgICAgICAgICAgbGVuIC09IHB1dDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGlmIHdlIG5lZWQgdG8sIGFkZCBhIG5ldyBlbXB0eSBzdG9yZWQgYmxvY2sgKi8KLSAgICAgICAgaWYgKGxlbikgewotICAgICAgICAgICAgLyogbWFyayBjdXJyZW50IGJsb2NrIGFzIG5vdCBsYXN0ICovCi0gICAgICAgICAgICBpZiAobG9nX2xhc3QobG9nLCAwKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgICAgIC8qIHBvaW50IHRvIG5ldywgZW1wdHkgc3RvcmVkIGJsb2NrICovCi0gICAgICAgICAgICBsb2ctPmxhc3QgKz0gNCArIGxvZy0+c3RvcmVkICsgMTsKLSAgICAgICAgICAgIGxvZy0+c3RvcmVkID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG1hcmsgbGFzdCBibG9jayBhcyBsYXN0LCB1cGRhdGUgaXRzIGxlbmd0aCAqLwotICAgICAgICBpZiAobG9nX2xhc3QobG9nLCAxKSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgQkFJTCgyKTsKLSAgICB9Ci0KLSAgICAvKiB3cml0ZSB0aGUgbmV3IGNyYyBhbmQgbGVuZ3RoIHRyYWlsZXIsIGFuZCB0cnVuY2F0ZSBqdXN0IGluIGNhc2UgKGNvdWxkCi0gICAgICAgYmUgcmVjb3ZlcmluZyBmcm9tIHBhcnRpYWwgYXBwZW5kIHdpdGggYSBtaXNzaW5nIGZvby5hZGQgZmlsZSkgKi8KLSAgICBQVVQ0KGJ1ZiwgbG9nLT50Y3JjKTsKLSAgICBQVVQ0KGJ1ZiArIDQsIGxvZy0+dGxlbik7Ci0gICAgaWYgKHdyaXRlKGxvZy0+ZmQsIGJ1ZiwgOCkgIT0gOCB8fAotICAgICAgICAoZW5kID0gbHNlZWsobG9nLT5mZCwgMCwgU0VFS19DVVIpKSA8IDAgfHwgZnRydW5jYXRlKGxvZy0+ZmQsIGVuZCkpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIHdyaXRlIHRoZSBleHRyYSBmaWVsZCwgbWFya2luZyB0aGUgbG9nIGZpbGUgYXMgZG9uZSwgZGVsZXRlIC5hZGQgZmlsZSAqLwotICAgIGlmIChsb2dfbWFyayhsb2csIE5PX09QKSkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHN0cmNweShsb2ctPmVuZCwgIi5hZGQiKTsKLSAgICB1bmxpbmsobG9nLT5wYXRoKTsgICAgICAgICAgLyogaWdub3JlIGVycm9yLCBzaW5jZSBtYXkgbm90IGV4aXN0ICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJlcGxhY2UgdGhlIGZvby5kaWN0IGZpbGUgd2l0aCB0aGUgZm9vLnRlbXAgZmlsZS4gIEFsc28gZGVsZXRlIHRoZSBmb28uYWRkCi0gICBmaWxlLCBzaW5jZSB0aGUgY29tcHJlc3Mgb3BlcmF0aW9uIG1heSBoYXZlIGJlZW4gaW50ZXJydXB0ZWQgYmVmb3JlIHRoYXQgd2FzCi0gICBkb25lLiAgUmV0dXJucyAxIGlmIG1lbW9yeSBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLCBvciAtMSBpZiByZWFkaW5nIG9yCi0gICB3cml0aW5nIGZvby5neiBmYWlscywgb3IgaWYgdGhlIHJlbmFtZSBmYWlscyBmb3Igc29tZSByZWFzb24gb3RoZXIgdGhhbgotICAgZm9vLnRlbXAgbm90IGV4aXN0aW5nLiAgZm9vLnRlbXAgbm90IGV4aXN0aW5nIGlzIGEgcGVybWl0dGVkIGVycm9yLCBzaW5jZQotICAgdGhlIHJlcGxhY2Ugb3BlcmF0aW9uIG1heSBoYXZlIGJlZW4gaW50ZXJydXB0ZWQgYWZ0ZXIgdGhlIHJlbmFtZSBpcyBkb25lLAotICAgYnV0IGJlZm9yZSBmb28uZ3ogaXMgbWFya2VkIGFzIGNvbXBsZXRlLiAqLwotbG9jYWwgaW50IGxvZ19yZXBsYWNlKHN0cnVjdCBsb2cgKmxvZykKLXsKLSAgICBpbnQgcmV0OwotICAgIGNoYXIgKmRlc3Q7Ci0KLSAgICAvKiBkZWxldGUgZm9vLmFkZCBmaWxlICovCi0gICAgc3RyY3B5KGxvZy0+ZW5kLCAiLmFkZCIpOwotICAgIHVubGluayhsb2ctPnBhdGgpOyAgICAgICAgIC8qIGlnbm9yZSBlcnJvciwgc2luY2UgbWF5IG5vdCBleGlzdCAqLwotICAgIEJBSUwoMyk7Ci0KLSAgICAvKiByZW5hbWUgZm9vLm5hbWUgdG8gZm9vLmRpY3QsIHJlcGxhY2luZyBmb28uZGljdCBpZiBpdCBleGlzdHMgKi8KLSAgICBzdHJjcHkobG9nLT5lbmQsICIuZGljdCIpOwotICAgIGRlc3QgPSBtYWxsb2Moc3RybGVuKGxvZy0+cGF0aCkgKyAxKTsKLSAgICBpZiAoZGVzdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTI7Ci0gICAgc3RyY3B5KGRlc3QsIGxvZy0+cGF0aCk7Ci0gICAgc3RyY3B5KGxvZy0+ZW5kLCAiLnRlbXAiKTsKLSAgICByZXQgPSByZW5hbWUobG9nLT5wYXRoLCBkZXN0KTsKLSAgICBmcmVlKGRlc3QpOwotICAgIGlmIChyZXQgJiYgZXJybm8gIT0gRU5PRU5UKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgQkFJTCg0KTsKLQotICAgIC8qIG1hcmsgdGhlIGZvby5neiBmaWxlIGFzIGRvbmUgKi8KLSAgICByZXR1cm4gbG9nX21hcmsobG9nLCBOT19PUCk7Ci19Ci0KLS8qIENvbXByZXNzIHRoZSBsZW4gYnl0ZXMgYXQgZGF0YSBhbmQgYXBwZW5kIHRoZSBjb21wcmVzc2VkIGRhdGEgdG8gdGhlCi0gICBmb28uZ3ogZGVmbGF0ZSBkYXRhIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBwcmV2aW91cyBjb21wcmVzc2VkIGRhdGEuICBUaGlzCi0gICBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyB1bmNvbXByZXNzZWQgZGF0YSwgd2hpY2ggd2FzIHN0b3JlZCBpbiBmb28uYWRkCi0gICBhbmQgaXMgdGhlIGRhdGEgcHJvdmlkZWQgaW4gZGF0YVswLi5sZW4tMV0uICBJZiB0aGlzIG9wZXJhdGlvbiBpcwotICAgaW50ZXJydXB0ZWQsIGl0IHBpY2tzIHVwIGF0IHRoZSBzdGFydCBvZiB0aGlzIHJvdXRpbmUsIHdpdGggdGhlIGZvby5hZGQKLSAgIGZpbGUgcmVhZCBpbiBhZ2Fpbi4gIElmIHRoZXJlIGlzIG5vIGRhdGEgdG8gY29tcHJlc3MgKGxlbiA9PSAwKSwgdGhlbiB3ZQotICAgc2ltcGx5IHRlcm1pbmF0ZSB0aGUgZm9vLmd6IGZpbGUgYWZ0ZXIgdGhlIHByZXZpb3VzbHkgY29tcHJlc3NlZCBkYXRhLAotICAgYXBwZW5kaW5nIGEgZmluYWwgZW1wdHkgc3RvcmVkIGJsb2NrIGFuZCB0aGUgZ3ppcCB0cmFpbGVyLiAgUmV0dXJuIC0xIGlmCi0gICByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIGxvZy5neiBmaWxlIGZhaWxlZCwgb3IgLTIgaWYgdGhlcmUgd2FzIGEgbWVtb3J5Ci0gICBhbGxvY2F0aW9uIGZhaWx1cmUuICovCi1sb2NhbCBpbnQgbG9nX2NvbXByZXNzKHN0cnVjdCBsb2cgKmxvZywgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IGxlbikKLXsKLSAgICBpbnQgZmQ7Ci0gICAgdWludCBnb3QsIG1heDsKLSAgICBzc2l6ZV90IGRpY3Q7Ci0gICAgb2ZmX3QgZW5kOwotICAgIHpfc3RyZWFtIHN0cm07Ci0gICAgdW5zaWduZWQgY2hhciBidWZbRElDVF07Ci0KLSAgICAvKiBjb21wcmVzcyBhbmQgYXBwZW5kIGNvbXByZXNzZWQgZGF0YSAqLwotICAgIGlmIChsZW4pIHsKLSAgICAgICAgLyogc2V0IHVwIGZvciBkZWZsYXRlLCBhbGxvY2F0aW5nIG1lbW9yeSAqLwotICAgICAgICBzdHJtLnphbGxvYyA9IFpfTlVMTDsKLSAgICAgICAgc3RybS56ZnJlZSA9IFpfTlVMTDsKLSAgICAgICAgc3RybS5vcGFxdWUgPSBaX05VTEw7Ci0gICAgICAgIGlmIChkZWZsYXRlSW5pdDIoJnN0cm0sIFpfREVGQVVMVF9DT01QUkVTU0lPTiwgWl9ERUZMQVRFRCwgLTE1LCA4LAotICAgICAgICAgICAgICAgICAgICAgICAgIFpfREVGQVVMVF9TVFJBVEVHWSkgIT0gWl9PSykKLSAgICAgICAgICAgIHJldHVybiAtMjsKLQotICAgICAgICAvKiByZWFkIGluIGRpY3Rpb25hcnkgKGxhc3QgMzJLIG9mIGRhdGEgdGhhdCB3YXMgY29tcHJlc3NlZCkgKi8KLSAgICAgICAgc3RyY3B5KGxvZy0+ZW5kLCAiLmRpY3QiKTsKLSAgICAgICAgZmQgPSBvcGVuKGxvZy0+cGF0aCwgT19SRE9OTFksIDApOwotICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgZGljdCA9IHJlYWQoZmQsIGJ1ZiwgRElDVCk7Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICBpZiAoZGljdCA8IDApIHsKLSAgICAgICAgICAgICAgICBkZWZsYXRlRW5kKCZzdHJtKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGljdCkKLSAgICAgICAgICAgICAgICBkZWZsYXRlU2V0RGljdGlvbmFyeSgmc3RybSwgYnVmLCAodWludClkaWN0KTsKLSAgICAgICAgfQotICAgICAgICBsb2dfdG91Y2gobG9nKTsKLQotICAgICAgICAvKiBwcmltZSBkZWZsYXRlIHdpdGggbGFzdCBiaXRzIG9mIHByZXZpb3VzIGJsb2NrLCBwb3NpdGlvbiB3cml0ZQotICAgICAgICAgICBwb2ludGVyIHRvIHdyaXRlIHRob3NlIGJpdHMgYW5kIG92ZXJ3cml0ZSB3aGF0IGZvbGxvd3MgKi8KLSAgICAgICAgaWYgKGxzZWVrKGxvZy0+ZmQsIGxvZy0+Zmlyc3QgLSAobG9nLT5iYWNrID4gOCA/IDIgOiAxKSwKLSAgICAgICAgICAgICAgICBTRUVLX1NFVCkgPCAwIHx8Ci0gICAgICAgICAgICByZWFkKGxvZy0+ZmQsIGJ1ZiwgMSkgIT0gMSB8fCBsc2Vlayhsb2ctPmZkLCAtMSwgU0VFS19DVVIpIDwgMCkgewotICAgICAgICAgICAgZGVmbGF0ZUVuZCgmc3RybSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmbGF0ZVByaW1lKCZzdHJtLCAoOCAtIGxvZy0+YmFjaykgJiA3LCAqYnVmKTsKLQotICAgICAgICAvKiBjb21wcmVzcywgZmluaXNoaW5nIHdpdGggYSBwYXJ0aWFsIG5vbi1sYXN0IGVtcHR5IHN0YXRpYyBibG9jayAqLwotICAgICAgICBzdHJtLm5leHRfaW4gPSBkYXRhOwotICAgICAgICBtYXggPSAoKCh1aW50KTAgLSAxKSA+PiAxKSArIDE7IC8qIGluIGNhc2UgaW50IHNtYWxsZXIgdGhhbiBzaXplX3QgKi8KLSAgICAgICAgZG8gewotICAgICAgICAgICAgc3RybS5hdmFpbF9pbiA9IGxlbiA+IG1heCA/IG1heCA6ICh1aW50KWxlbjsKLSAgICAgICAgICAgIGxlbiAtPSBzdHJtLmF2YWlsX2luOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gRElDVDsKLSAgICAgICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gYnVmOwotICAgICAgICAgICAgICAgIGRlZmxhdGUoJnN0cm0sIGxlbiA/IFpfTk9fRkxVU0ggOiBaX1BBUlRJQUxfRkxVU0gpOwotICAgICAgICAgICAgICAgIGdvdCA9IERJQ1QgLSBzdHJtLmF2YWlsX291dDsKLSAgICAgICAgICAgICAgICBpZiAoZ290ICYmIHdyaXRlKGxvZy0+ZmQsIGJ1ZiwgZ290KSAhPSBnb3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmbGF0ZUVuZCgmc3RybSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbG9nX3RvdWNoKGxvZyk7Ci0gICAgICAgICAgICB9IHdoaWxlIChzdHJtLmF2YWlsX291dCA9PSAwKTsKLSAgICAgICAgfSB3aGlsZSAobGVuKTsKLSAgICAgICAgZGVmbGF0ZUVuZCgmc3RybSk7Ci0gICAgICAgIEJBSUwoNSk7Ci0KLSAgICAgICAgLyogZmluZCBzdGFydCBvZiBlbXB0eSBzdGF0aWMgYmxvY2sgLS0gc2Nhbm5pbmcgYmFja3dhcmRzIHRoZSBmaXJzdCBvbmUKLSAgICAgICAgICAgYml0IGlzIHRoZSBzZWNvbmQgYml0IG9mIHRoZSBibG9jaywgaWYgdGhlIGxhc3QgYnl0ZSBpcyB6ZXJvLCB0aGVuCi0gICAgICAgICAgIHdlIGtub3cgdGhlIGJ5dGUgYmVmb3JlIHRoYXQgaGFzIGEgb25lIGluIHRoZSB0b3AgYml0LCBzaW5jZSBhbgotICAgICAgICAgICBlbXB0eSBzdGF0aWMgYmxvY2sgaXMgdGVuIGJpdHMgbG9uZyAqLwotICAgICAgICBpZiAoKGxvZy0+Zmlyc3QgPSBsc2Vlayhsb2ctPmZkLCAtMSwgU0VFS19DVVIpKSA8IDAgfHwKLSAgICAgICAgICAgIHJlYWQobG9nLT5mZCwgYnVmLCAxKSAhPSAxKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBsb2ctPmZpcnN0Kys7Ci0gICAgICAgIGlmICgqYnVmKSB7Ci0gICAgICAgICAgICBsb2ctPmJhY2sgPSAxOwotICAgICAgICAgICAgd2hpbGUgKCgqYnVmICYgKCh1aW50KTEgPDwgKDggLSBsb2ctPmJhY2srKykpKSA9PSAwKQotICAgICAgICAgICAgICAgIDsgICAgICAgLyogZ3VhcmFudGVlZCB0byB0ZXJtaW5hdGUsIHNpbmNlICpidWYgIT0gMCAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxvZy0+YmFjayA9IDEwOwotCi0gICAgICAgIC8qIHVwZGF0ZSBjb21wcmVzc2VkIGNyYyBhbmQgbGVuZ3RoICovCi0gICAgICAgIGxvZy0+Y2NyYyA9IGxvZy0+dGNyYzsKLSAgICAgICAgbG9nLT5jbGVuID0gbG9nLT50bGVuOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogbm8gZGF0YSB0byBjb21wcmVzcyAtLSBmaXggdXAgZXhpc3RpbmcgZ3ppcCBzdHJlYW0gKi8KLSAgICAgICAgbG9nLT50Y3JjID0gbG9nLT5jY3JjOwotICAgICAgICBsb2ctPnRsZW4gPSBsb2ctPmNsZW47Ci0gICAgfQotCi0gICAgLyogY29tcGxldGUgYW5kIHRydW5jYXRlIGd6aXAgc3RyZWFtICovCi0gICAgbG9nLT5sYXN0ID0gbG9nLT5maXJzdDsKLSAgICBsb2ctPnN0b3JlZCA9IDA7Ci0gICAgUFVUNChidWYsIGxvZy0+dGNyYyk7Ci0gICAgUFVUNChidWYgKyA0LCBsb2ctPnRsZW4pOwotICAgIGlmIChsb2dfbGFzdChsb2csIDEpIHx8IHdyaXRlKGxvZy0+ZmQsIGJ1ZiwgOCkgIT0gOCB8fAotICAgICAgICAoZW5kID0gbHNlZWsobG9nLT5mZCwgMCwgU0VFS19DVVIpKSA8IDAgfHwgZnRydW5jYXRlKGxvZy0+ZmQsIGVuZCkpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBCQUlMKDYpOwotCi0gICAgLyogbWFyayBhcyBiZWluZyBpbiB0aGUgcmVwbGFjZSBvcGVyYXRpb24gKi8KLSAgICBpZiAobG9nX21hcmsobG9nLCBSRVBMQUNFX09QKSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgLyogZXhlY3V0ZSB0aGUgcmVwbGFjZSBvcGVyYXRpb24gYW5kIG1hcmsgdGhlIGZpbGUgYXMgZG9uZSAqLwotICAgIHJldHVybiBsb2dfcmVwbGFjZShsb2cpOwotfQotCi0vKiBsb2cgYSByZXBhaXIgcmVjb3JkIHRvIHRoZSAucmVwYWlycyBmaWxlICovCi1sb2NhbCB2b2lkIGxvZ19sb2coc3RydWN0IGxvZyAqbG9nLCBpbnQgb3AsIGNoYXIgKnJlY29yZCkKLXsKLSAgICB0aW1lX3Qgbm93OwotICAgIEZJTEUgKnJlYzsKLQotICAgIG5vdyA9IHRpbWUoTlVMTCk7Ci0gICAgc3RyY3B5KGxvZy0+ZW5kLCAiLnJlcGFpcnMiKTsKLSAgICByZWMgPSBmb3Blbihsb2ctPnBhdGgsICJhIik7Ci0gICAgaWYgKHJlYyA9PSBOVUxMKQotICAgICAgICByZXR1cm47Ci0gICAgZnByaW50ZihyZWMsICIlLjI0cyAlcyByZWNvdmVyeTogJXNcbiIsIGN0aW1lKCZub3cpLCBvcCA9PSBBUFBFTkRfT1AgPwotICAgICAgICAgICAgImFwcGVuZCIgOiAob3AgPT0gQ09NUFJFU1NfT1AgPyAiY29tcHJlc3MiIDogInJlcGxhY2UiKSwgcmVjb3JkKTsKLSAgICBmY2xvc2UocmVjKTsKLSAgICByZXR1cm47Ci19Ci0KLS8qIFJlY292ZXIgdGhlIGludGVycnVwdGVkIG9wZXJhdGlvbiBvcC4gIEZpcnN0IHJlYWQgZm9vLmFkZCBmb3IgcmVjb3ZlcmluZyBhbgotICAgYXBwZW5kIG9yIGNvbXByZXNzIG9wZXJhdGlvbi4gIFJldHVybiAtMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBvcgotICAgd3JpdGluZyBmb28uZ3ogb3IgcmVhZGluZyBhbiBleGlzdGluZyBmb28uYWRkLCBvciAtMiBpZiB0aGVyZSB3YXMgYSBtZW1vcnkKLSAgIGFsbG9jYXRpb24gZmFpbHVyZS4gKi8KLWxvY2FsIGludCBsb2dfcmVjb3ZlcihzdHJ1Y3QgbG9nICpsb2csIGludCBvcCkKLXsKLSAgICBpbnQgZmQsIHJldCA9IDA7Ci0gICAgdW5zaWduZWQgY2hhciAqZGF0YSA9IE5VTEw7Ci0gICAgc2l6ZV90IGxlbiA9IDA7Ci0gICAgc3RydWN0IHN0YXQgc3Q7Ci0KLSAgICAvKiBsb2cgcmVjb3ZlcnkgKi8KLSAgICBsb2dfbG9nKGxvZywgb3AsICJzdGFydCIpOwotCi0gICAgLyogbG9hZCBmb28uYWRkIGZpbGUgaWYgZXhwZWN0ZWQgYW5kIHByZXNlbnQgKi8KLSAgICBpZiAob3AgPT0gQVBQRU5EX09QIHx8IG9wID09IENPTVBSRVNTX09QKSB7Ci0gICAgICAgIHN0cmNweShsb2ctPmVuZCwgIi5hZGQiKTsKLSAgICAgICAgaWYgKHN0YXQobG9nLT5wYXRoLCAmc3QpID09IDAgJiYgc3Quc3Rfc2l6ZSkgewotICAgICAgICAgICAgbGVuID0gKHNpemVfdCkoc3Quc3Rfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAobGVuICE9IHN0LnN0X3NpemUgfHwgKGRhdGEgPSBtYWxsb2Moc3Quc3Rfc2l6ZSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBsb2dfbG9nKGxvZywgb3AsICJhbGxvY2F0aW9uIGZhaWx1cmUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGZkID0gb3Blbihsb2ctPnBhdGgsIE9fUkRPTkxZLCAwKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbG9nX2xvZyhsb2csIG9wLCAiLmFkZCBmaWxlIHJlYWQgZmFpbHVyZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldCA9IHJlYWQoZmQsIGRhdGEsIGxlbikgIT0gbGVuOwotICAgICAgICAgICAgY2xvc2UoZmQpOwotICAgICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgICAgIGxvZ19sb2cobG9nLCBvcCwgIi5hZGQgZmlsZSByZWFkIGZhaWx1cmUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2dfbG9nKGxvZywgb3AsICJsb2FkZWQgLmFkZCBmaWxlIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbG9nX2xvZyhsb2csIG9wLCAibWlzc2luZyAuYWRkIGZpbGUhIik7Ci0gICAgfQotCi0gICAgLyogcmVjb3ZlciB0aGUgaW50ZXJydXB0ZWQgb3BlcmF0aW9uICovCi0gICAgc3dpdGNoIChvcCkgewotICAgIGNhc2UgQVBQRU5EX09QOgotICAgICAgICByZXQgPSBsb2dfYXBwZW5kKGxvZywgZGF0YSwgbGVuKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDT01QUkVTU19PUDoKLSAgICAgICAgcmV0ID0gbG9nX2NvbXByZXNzKGxvZywgZGF0YSwgbGVuKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSRVBMQUNFX09QOgotICAgICAgICByZXQgPSBsb2dfcmVwbGFjZShsb2cpOwotICAgIH0KLQotICAgIC8qIGxvZyBzdGF0dXMgKi8KLSAgICBsb2dfbG9nKGxvZywgb3AsIHJldCA/ICJmYWlsdXJlIiA6ICJjb21wbGV0ZSIpOwotCi0gICAgLyogY2xlYW4gdXAgKi8KLSAgICBpZiAoZGF0YSAhPSBOVUxMKQotICAgICAgICBmcmVlKGRhdGEpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLS8qIENsb3NlIHRoZSBmb28uZ3ogZmlsZSAoaWYgb3BlbikgYW5kIHJlbGVhc2UgdGhlIGxvY2suICovCi1sb2NhbCB2b2lkIGxvZ19jbG9zZShzdHJ1Y3QgbG9nICpsb2cpCi17Ci0gICAgaWYgKGxvZy0+ZmQgPj0gMCkKLSAgICAgICAgY2xvc2UobG9nLT5mZCk7Ci0gICAgbG9nLT5mZCA9IC0xOwotICAgIGxvZ191bmxvY2sobG9nKTsKLX0KLQotLyogT3BlbiBmb28uZ3osIHZlcmlmeSB0aGUgaGVhZGVyLCBhbmQgbG9hZCB0aGUgZXh0cmEgZmllbGQgY29udGVudHMsIGFmdGVyCi0gICBmaXJzdCBjcmVhdGluZyB0aGUgZm9vLmxvY2sgZmlsZSB0byBnYWluIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIGZvby4qCi0gICBmaWxlcy4gIElmIGZvby5neiBkb2VzIG5vdCBleGlzdCBvciBpcyBlbXB0eSwgdGhlbiB3cml0ZSB0aGUgaW5pdGlhbCBoZWFkZXIsCi0gICBleHRyYSwgYW5kIGJvZHkgY29udGVudCBvZiBhbiBlbXB0eSBmb28uZ3ogbG9nIGZpbGUuICBJZiB0aGVyZSBpcyBhbiBlcnJvcgotICAgY3JlYXRpbmcgdGhlIGxvY2sgZmlsZSBkdWUgdG8gYWNjZXNzIHJlc3RyaWN0aW9ucywgb3IgYW4gZXJyb3IgcmVhZGluZyBvcgotICAgd3JpdGluZyB0aGUgZm9vLmd6IGZpbGUsIG9yIGlmIHRoZSBmb28uZ3ogZmlsZSBpcyBub3QgYSBwcm9wZXIgbG9nIGZpbGUgZm9yCi0gICB0aGlzIG9iamVjdCAoZS5nLiBub3QgYSBnemlwIGZpbGUgb3IgZG9lcyBub3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgZXh0cmEKLSAgIGZpZWxkKSwgdGhlbiByZXR1cm4gdHJ1ZS4gIElmIHRoZXJlIGlzIGFuIGVycm9yLCB0aGUgbG9jayBpcyByZWxlYXNlZC4KLSAgIE90aGVyd2lzZSwgdGhlIGxvY2sgaXMgbGVmdCBpbiBwbGFjZS4gKi8KLWxvY2FsIGludCBsb2dfb3BlbihzdHJ1Y3QgbG9nICpsb2cpCi17Ci0gICAgaW50IG9wOwotCi0gICAgLyogcmVsZWFzZSBvcGVuIGZpbGUgcmVzb3VyY2UgaWYgbGVmdCBvdmVyIC0tIGNhbiBvY2N1ciBpZiBsb2NrIGxvc3QKLSAgICAgICBiZXR3ZWVuIGd6bG9nX29wZW4oKSBhbmQgZ3psb2dfd3JpdGUoKSAqLwotICAgIGlmIChsb2ctPmZkID49IDApCi0gICAgICAgIGNsb3NlKGxvZy0+ZmQpOwotICAgIGxvZy0+ZmQgPSAtMTsKLQotICAgIC8qIG5lZ290aWF0ZSBleGNsdXNpdmUgYWNjZXNzICovCi0gICAgaWYgKGxvZ19sb2NrKGxvZykgPCAwKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBvcGVuIHRoZSBsb2cgZmlsZSwgZm9vLmd6ICovCi0gICAgc3RyY3B5KGxvZy0+ZW5kLCAiLmd6Iik7Ci0gICAgbG9nLT5mZCA9IG9wZW4obG9nLT5wYXRoLCBPX1JEV1IgfCBPX0NSRUFULCAwNjQ0KTsKLSAgICBpZiAobG9nLT5mZCA8IDApIHsKLSAgICAgICAgbG9nX2Nsb3NlKGxvZyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBpZiBuZXcsIGluaXRpYWxpemUgZm9vLmd6IHdpdGggYW4gZW1wdHkgbG9nLCBkZWxldGUgb2xkIGRpY3Rpb25hcnkgKi8KLSAgICBpZiAobHNlZWsobG9nLT5mZCwgMCwgU0VFS19FTkQpID09IDApIHsKLSAgICAgICAgaWYgKHdyaXRlKGxvZy0+ZmQsIGxvZ19nemhlYWQsIEhFQUQpICE9IEhFQUQgfHwKLSAgICAgICAgICAgIHdyaXRlKGxvZy0+ZmQsIGxvZ19nemV4dCwgRVhUUkEpICE9IEVYVFJBIHx8Ci0gICAgICAgICAgICB3cml0ZShsb2ctPmZkLCBsb2dfZ3pib2R5LCBCT0RZKSAhPSBCT0RZKSB7Ci0gICAgICAgICAgICBsb2dfY2xvc2UobG9nKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBzdHJjcHkobG9nLT5lbmQsICIuZGljdCIpOwotICAgICAgICB1bmxpbmsobG9nLT5wYXRoKTsKLSAgICB9Ci0KLSAgICAvKiB2ZXJpZnkgbG9nIGZpbGUgYW5kIGxvYWQgZXh0cmEgZmllbGQgaW5mb3JtYXRpb24gKi8KLSAgICBpZiAoKG9wID0gbG9nX2hlYWQobG9nKSkgPCAwKSB7Ci0gICAgICAgIGxvZ19jbG9zZShsb2cpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgZm9yIGludGVycnVwdGVkIHByb2Nlc3MgYW5kIGlmIHNvLCByZWNvdmVyICovCi0gICAgaWYgKG9wICE9IE5PX09QICYmIGxvZ19yZWNvdmVyKGxvZywgb3ApKSB7Ci0gICAgICAgIGxvZ19jbG9zZShsb2cpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogdG91Y2ggdGhlIGxvY2sgZmlsZSB0byBwcmV2ZW50IGFub3RoZXIgcHJvY2VzcyBmcm9tIGdyYWJiaW5nIGl0ICovCi0gICAgbG9nX3RvdWNoKGxvZyk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNlZSBnemxvZy5oIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGV4dGVybmFsIG1ldGhvZHMgYmVsb3cgKi8KLWd6bG9nICpnemxvZ19vcGVuKGNoYXIgKnBhdGgpCi17Ci0gICAgc2l6ZV90IG47Ci0gICAgc3RydWN0IGxvZyAqbG9nOwotCi0gICAgLyogY2hlY2sgYXJndW1lbnRzICovCi0gICAgaWYgKHBhdGggPT0gTlVMTCB8fCAqcGF0aCA9PSAwKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGxvZyBzdHJ1Y3R1cmUgKi8KLSAgICBsb2cgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2cpKTsKLSAgICBpZiAobG9nID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHN0cmNweShsb2ctPmlkLCBMT0dJRCk7Ci0gICAgbG9nLT5mZCA9IC0xOwotCi0gICAgLyogc2F2ZSBwYXRoIGFuZCBlbmQgb2YgcGF0aCBmb3IgbmFtZSBjb25zdHJ1Y3Rpb24gKi8KLSAgICBuID0gc3RybGVuKHBhdGgpOwotICAgIGxvZy0+cGF0aCA9IG1hbGxvYyhuICsgOSk7ICAgICAgICAgICAgICAvKiBhbGxvdyBmb3IgIi5yZXBhaXJzIiAqLwotICAgIGlmIChsb2ctPnBhdGggPT0gTlVMTCkgewotICAgICAgICBmcmVlKGxvZyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBzdHJjcHkobG9nLT5wYXRoLCBwYXRoKTsKLSAgICBsb2ctPmVuZCA9IGxvZy0+cGF0aCArIG47Ci0KLSAgICAvKiBnYWluIGV4Y2x1c2l2ZSBhY2Nlc3MgYW5kIHZlcmlmeSBsb2cgZmlsZSAtLSBtYXkgcGVyZm9ybSBhCi0gICAgICAgcmVjb3Zlcnkgb3BlcmF0aW9uIGlmIG5lZWRlZCAqLwotICAgIGlmIChsb2dfb3Blbihsb2cpKSB7Ci0gICAgICAgIGZyZWUobG9nLT5wYXRoKTsKLSAgICAgICAgZnJlZShsb2cpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiByZXR1cm4gcG9pbnRlciB0byBsb2cgc3RydWN0dXJlICovCi0gICAgcmV0dXJuIGxvZzsKLX0KLQotLyogZ3psb2dfY29tcHJlc3MoKSByZXR1cm4gdmFsdWVzOgotICAgIDA6IGFsbCBnb29kCi0gICAtMTogZmlsZSBpL28gZXJyb3IgKHVzdWFsbHkgYWNjZXNzIGlzc3VlKQotICAgLTI6IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUKLSAgIC0zOiBpbnZhbGlkIGxvZyBwb2ludGVyIGFyZ3VtZW50ICovCi1pbnQgZ3psb2dfY29tcHJlc3MoZ3psb2cgKmxvZ2QpCi17Ci0gICAgaW50IGZkLCByZXQ7Ci0gICAgdWludCBibG9jazsKLSAgICBzaXplX3QgbGVuLCBuZXh0OwotICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGJ1Zls1XTsKLSAgICBzdHJ1Y3QgbG9nICpsb2cgPSBsb2dkOwotCi0gICAgLyogY2hlY2sgYXJndW1lbnRzICovCi0gICAgaWYgKGxvZyA9PSBOVUxMIHx8IHN0cmNtcChsb2ctPmlkLCBMT0dJRCkgfHwgbGVuIDwgMCkKLSAgICAgICAgcmV0dXJuIC0zOwotCi0gICAgLyogc2VlIGlmIHdlIGxvc3QgdGhlIGxvY2sgLS0gaWYgc28gZ2V0IGl0IGFnYWluIGFuZCByZWxvYWQgdGhlIGV4dHJhCi0gICAgICAgZmllbGQgaW5mb3JtYXRpb24gKGl0IHByb2JhYmx5IGNoYW5nZWQpLCByZWNvdmVyIGxhc3Qgb3BlcmF0aW9uIGlmCi0gICAgICAgbmVjZXNzYXJ5ICovCi0gICAgaWYgKGxvZ19jaGVjayhsb2cpICYmIGxvZ19vcGVuKGxvZykpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIGNyZWF0ZSBzcGFjZSBmb3IgdW5jb21wcmVzc2VkIGRhdGEgKi8KLSAgICBsZW4gPSAoKHNpemVfdCkobG9nLT5sYXN0IC0gbG9nLT5maXJzdCkgJiB+KCgoc2l6ZV90KTEgPDwgMTApIC0gMSkpICsKLSAgICAgICAgICBsb2ctPnN0b3JlZDsKLSAgICBpZiAoKGRhdGEgPSBtYWxsb2MobGVuKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC0yOwotCi0gICAgLyogZG8gc3RhdGVtZW50IGhlcmUgaXMganVzdCBhIGNoZWFwIHRyaWNrIGZvciBlcnJvciBoYW5kbGluZyAqLwotICAgIGRvIHsKLSAgICAgICAgLyogcmVhZCBpbiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi8KLSAgICAgICAgaWYgKGxzZWVrKGxvZy0+ZmQsIGxvZy0+Zmlyc3QgLSAxLCBTRUVLX1NFVCkgPCAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIG5leHQgPSAwOwotICAgICAgICB3aGlsZSAobmV4dCA8IGxlbikgewotICAgICAgICAgICAgaWYgKHJlYWQobG9nLT5mZCwgYnVmLCA1KSAhPSA1KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgYmxvY2sgPSBQVUxMMihidWYgKyAxKTsKLSAgICAgICAgICAgIGlmIChuZXh0ICsgYmxvY2sgPiBsZW4gfHwKLSAgICAgICAgICAgICAgICByZWFkKGxvZy0+ZmQsIChjaGFyICopZGF0YSArIG5leHQsIGJsb2NrKSAhPSBibG9jaykKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIG5leHQgKz0gYmxvY2s7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxzZWVrKGxvZy0+ZmQsIDAsIFNFRUtfQ1VSKSAhPSBsb2ctPmxhc3QgKyA0ICsgbG9nLT5zdG9yZWQpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgbG9nX3RvdWNoKGxvZyk7Ci0KLSAgICAgICAgLyogd3JpdGUgdGhlIHVuY29tcHJlc3NlZCBkYXRhIHRvIHRoZSAuYWRkIGZpbGUgKi8KLSAgICAgICAgc3RyY3B5KGxvZy0+ZW5kLCAiLmFkZCIpOwotICAgICAgICBmZCA9IG9wZW4obG9nLT5wYXRoLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjQ0KTsKLSAgICAgICAgaWYgKGZkIDwgMCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICByZXQgPSB3cml0ZShmZCwgZGF0YSwgbGVuKSAhPSBsZW47Ci0gICAgICAgIGlmIChyZXQgfCBjbG9zZShmZCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgbG9nX3RvdWNoKGxvZyk7Ci0KLSAgICAgICAgLyogd3JpdGUgdGhlIGRpY3Rpb25hcnkgZm9yIHRoZSBuZXh0IGNvbXByZXNzIHRvIHRoZSAudGVtcCBmaWxlICovCi0gICAgICAgIHN0cmNweShsb2ctPmVuZCwgIi50ZW1wIik7Ci0gICAgICAgIGZkID0gb3Blbihsb2ctPnBhdGgsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2NDQpOwotICAgICAgICBpZiAoZmQgPCAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIG5leHQgPSBESUNUID4gbGVuID8gbGVuIDogRElDVDsKLSAgICAgICAgcmV0ID0gd3JpdGUoZmQsIChjaGFyICopZGF0YSArIGxlbiAtIG5leHQsIG5leHQpICE9IG5leHQ7Ci0gICAgICAgIGlmIChyZXQgfCBjbG9zZShmZCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgbG9nX3RvdWNoKGxvZyk7Ci0KLSAgICAgICAgLyogcm9sbCBiYWNrIHRvIGNvbXByZXNzZWQgZGF0YSwgbWFyayB0aGUgY29tcHJlc3MgaW4gcHJvZ3Jlc3MgKi8KLSAgICAgICAgbG9nLT5sYXN0ID0gbG9nLT5maXJzdDsKLSAgICAgICAgbG9nLT5zdG9yZWQgPSAwOwotICAgICAgICBpZiAobG9nX21hcmsobG9nLCBDT01QUkVTU19PUCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgQkFJTCg3KTsKLQotICAgICAgICAvKiBjb21wcmVzcyBhbmQgYXBwZW5kIHRoZSBkYXRhIChjbGVhcnMgbWFyaykgKi8KLSAgICAgICAgcmV0ID0gbG9nX2NvbXByZXNzKGxvZywgZGF0YSwgbGVuKTsKLSAgICAgICAgZnJlZShkYXRhKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9IHdoaWxlICgwKTsKLQotICAgIC8qIGJyb2tlIG91dCBvZiBkbyBhYm92ZSBvbiBpL28gZXJyb3IgKi8KLSAgICBmcmVlKGRhdGEpOwotICAgIHJldHVybiAtMTsKLX0KLQotLyogZ3psb2dfd3JpdGUoKSByZXR1cm4gdmFsdWVzOgotICAgIDA6IGFsbCBnb29kCi0gICAtMTogZmlsZSBpL28gZXJyb3IgKHVzdWFsbHkgYWNjZXNzIGlzc3VlKQotICAgLTI6IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUKLSAgIC0zOiBpbnZhbGlkIGxvZyBwb2ludGVyIGFyZ3VtZW50ICovCi1pbnQgZ3psb2dfd3JpdGUoZ3psb2cgKmxvZ2QsIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCi17Ci0gICAgaW50IGZkLCByZXQ7Ci0gICAgc3RydWN0IGxvZyAqbG9nID0gbG9nZDsKLQotICAgIC8qIGNoZWNrIGFyZ3VtZW50cyAqLwotICAgIGlmIChsb2cgPT0gTlVMTCB8fCBzdHJjbXAobG9nLT5pZCwgTE9HSUQpIHx8IGxlbiA8IDApCi0gICAgICAgIHJldHVybiAtMzsKLSAgICBpZiAoZGF0YSA9PSBOVUxMIHx8IGxlbiA9PSAwKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIHNlZSBpZiB3ZSBsb3N0IHRoZSBsb2NrIC0tIGlmIHNvIGdldCBpdCBhZ2FpbiBhbmQgcmVsb2FkIHRoZSBleHRyYQotICAgICAgIGZpZWxkIGluZm9ybWF0aW9uIChpdCBwcm9iYWJseSBjaGFuZ2VkKSwgcmVjb3ZlciBsYXN0IG9wZXJhdGlvbiBpZgotICAgICAgIG5lY2Vzc2FyeSAqLwotICAgIGlmIChsb2dfY2hlY2sobG9nKSAmJiBsb2dfb3Blbihsb2cpKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBjcmVhdGUgYW5kIHdyaXRlIC5hZGQgZmlsZSAqLwotICAgIHN0cmNweShsb2ctPmVuZCwgIi5hZGQiKTsKLSAgICBmZCA9IG9wZW4obG9nLT5wYXRoLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjQ0KTsKLSAgICBpZiAoZmQgPCAwKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgcmV0ID0gd3JpdGUoZmQsIGRhdGEsIGxlbikgIT0gbGVuOwotICAgIGlmIChyZXQgfCBjbG9zZShmZCkpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBsb2dfdG91Y2gobG9nKTsKLQotICAgIC8qIG1hcmsgbG9nIGZpbGUgd2l0aCBhcHBlbmQgaW4gcHJvZ3Jlc3MgKi8KLSAgICBpZiAobG9nX21hcmsobG9nLCBBUFBFTkRfT1ApKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgQkFJTCg4KTsKLQotICAgIC8qIGFwcGVuZCBkYXRhIChjbGVhcnMgbWFyaykgKi8KLSAgICBpZiAobG9nX2FwcGVuZChsb2csIGRhdGEsIGxlbikpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIGNoZWNrIHRvIHNlZSBpZiBpdCdzIHRpbWUgdG8gY29tcHJlc3MgLS0gaWYgbm90LCB0aGVuIGRvbmUgKi8KLSAgICBpZiAoKChsb2ctPmxhc3QgLSBsb2ctPmZpcnN0KSA+PiAxMCkgKyAobG9nLT5zdG9yZWQgPj4gMTApIDwgVFJJR0dFUikKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiB0aW1lIHRvIGNvbXByZXNzICovCi0gICAgcmV0dXJuIGd6bG9nX2NvbXByZXNzKGxvZyk7Ci19Ci0KLS8qIGd6bG9nX2Nsb3NlKCkgcmV0dXJuIHZhbHVlczoKLSAgICAwOiBvawotICAgLTM6IGludmFsaWQgbG9nIHBvaW50ZXIgYXJndW1lbnQgKi8KLWludCBnemxvZ19jbG9zZShnemxvZyAqbG9nZCkKLXsKLSAgICBzdHJ1Y3QgbG9nICpsb2cgPSBsb2dkOwotCi0gICAgLyogY2hlY2sgYXJndW1lbnRzICovCi0gICAgaWYgKGxvZyA9PSBOVUxMIHx8IHN0cmNtcChsb2ctPmlkLCBMT0dJRCkpCi0gICAgICAgIHJldHVybiAtMzsKLQotICAgIC8qIGNsb3NlIHRoZSBsb2cgZmlsZSBhbmQgcmVsZWFzZSB0aGUgbG9jayAqLwotICAgIGxvZ19jbG9zZShsb2cpOwotCi0gICAgLyogZnJlZSBzdHJ1Y3R1cmUgYW5kIHJldHVybiAqLwotICAgIGlmIChsb2ctPnBhdGggIT0gTlVMTCkKLSAgICAgICAgZnJlZShsb2ctPnBhdGgpOwotICAgIHN0cmNweShsb2ctPmlkLCAiYmFkIik7Ci0gICAgZnJlZShsb2cpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvZXhhbXBsZXMvZ3psb2cuaCBiL3NyYy96bGliL2V4YW1wbGVzL2d6bG9nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NjE0MjYuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvZXhhbXBsZXMvZ3psb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qIGd6bG9nLmgKLSAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA4IE1hcmsgQWRsZXIsIGFsbCByaWdodHMgcmVzZXJ2ZWQKLSAgdmVyc2lvbiAyLjAsIDI1IEFwciAyMDA4Ci0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3IgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTWFyayBBZGxlciAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ci0gKi8KLQotLyogVmVyc2lvbiBIaXN0b3J5OgotICAgMS4wICAyNiBOb3YgMjAwNCAgRmlyc3QgdmVyc2lvbgotICAgMi4wICAyNSBBcHIgMjAwOCAgQ29tcGxldGUgcmVkZXNpZ24gZm9yIHJlY292ZXJ5IG9mIGludGVycnVwdGVkIG9wZXJhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgIEludGVyZmFjZSBjaGFuZ2VkIHNsaWdodGx5IGluIHRoYXQgbm93IHBhdGggaXMgYSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIG5vdyBvY2N1cnMgYXMgbmVlZGVkIGR1cmluZyBnemxvZ193cml0ZSgpCi0gICAgICAgICAgICAgICAgICAgICBnemxvZ193cml0ZSgpIG5vdyBhbHdheXMgbGVhdmVzIHRoZSBsb2cgZmlsZSBhcyB2YWxpZCBnemlwCi0gKi8KLQotLyoKLSAgIFRoZSBnemxvZyBvYmplY3QgYWxsb3dzIHdyaXRpbmcgc2hvcnQgbWVzc2FnZXMgdG8gYSBnemlwcGVkIGxvZyBmaWxlLAotICAgb3BlbmluZyB0aGUgbG9nIGZpbGUgbG9ja2VkIGZvciBzbWFsbCBidXJzdHMsIGFuZCB0aGVuIGNsb3NpbmcgaXQuICBUaGUgbG9nCi0gICBvYmplY3Qgd29ya3MgYnkgYXBwZW5kaW5nIHN0b3JlZCAodW5jb21wcmVzc2VkKSBkYXRhIHRvIHRoZSBnemlwIGZpbGUgdW50aWwKLSAgIDEgTUIgaGFzIGJlZW4gYWNjdW11bGF0ZWQuICBBdCB0aGF0IHRpbWUsIHRoZSBzdG9yZWQgZGF0YSBpcyBjb21wcmVzc2VkLCBhbmQKLSAgIHJlcGxhY2VzIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBpbiB0aGUgZmlsZS4gIFRoZSBsb2cgZmlsZSBpcyB0cnVuY2F0ZWQgdG8KLSAgIGl0cyBuZXcgc2l6ZSBhdCB0aGF0IHRpbWUuICBBZnRlciBlYWNoIHdyaXRlIG9wZXJhdGlvbiwgdGhlIGxvZyBmaWxlIGlzIGEKLSAgIHZhbGlkIGd6aXAgZmlsZSB0aGF0IGNhbiBkZWNvbXByZXNzZWQgdG8gcmVjb3ZlciB3aGF0IHdhcyB3cml0dGVuLgotCi0gICBUaGUgZ3psb2cgb3BlcmF0aW9ucyBjYW4gYmUgaW50ZXJ1cHRlZCBhdCBhbnkgcG9pbnQgZHVlIHRvIGFuIGFwcGxpY2F0aW9uIG9yCi0gICBzeXN0ZW0gY3Jhc2gsIGFuZCB0aGUgbG9nIGZpbGUgd2lsbCBiZSByZWNvdmVyZWQgdGhlIG5leHQgdGltZSB0aGUgbG9nIGlzCi0gICBvcGVuZWQgd2l0aCBnemxvZ19vcGVuKCkuCi0gKi8KLQotI2lmbmRlZiBHWkxPR19ICi0jZGVmaW5lIEdaTE9HX0gKLQotLyogZ3psb2cgb2JqZWN0IHR5cGUgKi8KLXR5cGVkZWYgdm9pZCBnemxvZzsKLQotLyogT3BlbiBhIGd6bG9nIG9iamVjdCwgY3JlYXRpbmcgdGhlIGxvZyBmaWxlIGlmIGl0IGRvZXMgbm90IGV4aXN0LiAgUmV0dXJuCi0gICBOVUxMIG9uIGVycm9yLiAgTm90ZSB0aGF0IGd6bG9nX29wZW4oKSBjb3VsZCB0YWtlIGEgd2hpbGUgdG8gY29tcGxldGUgaWYgaXQKLSAgIGhhcyB0byB3YWl0IHRvIHZlcmlmeSB0aGF0IGEgbG9jayBpcyBzdGFsZSAocG9zc2libHkgZm9yIGZpdmUgbWludXRlcyksIG9yCi0gICBpZiB0aGVyZSBpcyBzaWduaWZpY2FudCBjb250ZW50aW9uIHdpdGggb3RoZXIgaW5zdGFudGlhdGlvbnMgb2YgdGhpcyBvYmplY3QKLSAgIHdoZW4gbG9ja2luZyB0aGUgcmVzb3VyY2UuICBwYXRoIGlzIHRoZSBwcmVmaXggb2YgdGhlIGZpbGUgbmFtZXMgY3JlYXRlZCBieQotICAgdGhpcyBvYmplY3QuICBJZiBwYXRoIGlzICJmb28iLCB0aGVuIHRoZSBsb2cgZmlsZSB3aWxsIGJlICJmb28uZ3oiLCBhbmQKLSAgIG90aGVyIGF1eGlsaWFyeSBmaWxlcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZCBkdXJpbmcgdGhlIHByb2Nlc3M6Ci0gICAiZm9vLmRpY3QiIGZvciBhIGNvbXByZXNzaW9uIGRpY3Rpb25hcnksICJmb28udGVtcCIgZm9yIGEgdGVtcG9yYXJ5IChuZXh0KQotICAgZGljdGlvbmFyeSwgImZvby5hZGQiIGZvciBkYXRhIGJlaW5nIGFkZGVkIG9yIGNvbXByZXNzZWQsICJmb28ubG9jayIgZm9yIHRoZQotICAgbG9jayBmaWxlLCBhbmQgImZvby5yZXBhaXJzIiB0byBsb2cgcmVjb3Zlcnkgb3BlcmF0aW9ucyBwZXJmb3JtZWQgZHVlIHRvCi0gICBpbnRlcnJ1cHRlZCBnemxvZyBvcGVyYXRpb25zLiAgQSBnemxvZ19vcGVuKCkgZm9sbG93ZWQgYnkgYSBnemxvZ19jbG9zZSgpCi0gICB3aWxsIHJlY292ZXIgYSBwcmV2aW91c2x5IGludGVycnVwdGVkIG9wZXJhdGlvbiwgaWYgYW55LiAqLwotZ3psb2cgKmd6bG9nX29wZW4oY2hhciAqcGF0aCk7Ci0KLS8qIFdyaXRlIHRvIGEgZ3psb2cgb2JqZWN0LiAgUmV0dXJuIHplcm8gb24gc3VjY2VzcywgLTEgaWYgdGhlcmUgaXMgYSBmaWxlIGkvbwotICAgZXJyb3Igb24gYW55IG9mIHRoZSBnemxvZyBmaWxlcyAodGhpcyBzaG91bGQgbm90IGhhcHBlbiBpZiBnemxvZ19vcGVuKCkKLSAgIHN1Y2NlZWRlZCwgdW5sZXNzIHRoZSBkZXZpY2UgaGFzIHJ1biBvdXQgb2Ygc3BhY2Ugb3IgbGVmdG92ZXIgYXV4aWxpYXJ5Ci0gICBmaWxlcyBoYXZlIHBlcm1pc3Npb25zIG9yIG93bmVyc2hpcCB0aGF0IHByZXZlbnQgdGhlaXIgdXNlKSwgLTIgaWYgdGhlcmUgaXMKLSAgIGEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSwgb3IgLTMgaWYgdGhlIGxvZyBhcmd1bWVudCBpcyBpbnZhbGlkIChlLmcuIGlmCi0gICBpdCB3YXMgbm90IGNyZWF0ZWQgYnkgZ3psb2dfb3BlbigpKS4gIFRoaXMgZnVuY3Rpb24gd2lsbCB3cml0ZSBkYXRhIHRvIHRoZQotICAgZmlsZSB1bmNvbXByZXNzZWQsIHVudGlsIDEgTUIgaGFzIGJlZW4gYWNjdW11bGF0ZWQsIGF0IHdoaWNoIHRpbWUgdGhhdCBkYXRhCi0gICB3aWxsIGJlIGNvbXByZXNzZWQuICBUaGUgbG9nIGZpbGUgd2lsbCBiZSBhIHZhbGlkIGd6aXAgZmlsZSB1cG9uIHN1Y2Nlc3NmdWwKLSAgIHJldHVybi4gKi8KLWludCBnemxvZ193cml0ZShnemxvZyAqbG9nLCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKTsKLQotLyogRm9yY2UgY29tcHJlc3Npb24gb2YgYW55IHVuY29tcHJlc3NlZCBkYXRhIGluIHRoZSBsb2cuICBUaGlzIHNob3VsZCBiZSB1c2VkCi0gICBzcGFyaW5nbHksIGlmIGF0IGFsbC4gIFRoZSBtYWluIGFwcGxpY2F0aW9uIHdvdWxkIGJlIHdoZW4gYSBsb2cgZmlsZSB3aWxsCi0gICBub3QgYmUgYXBwZW5kZWQgdG8gYWdhaW4uICBJZiB0aGlzIGlzIHVzZWQgdG8gY29tcHJlc3MgZnJlcXVlbnRseSB3aGlsZQotICAgYXBwZW5kaW5nLCBpdCB3aWxsIGJvdGggc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgZXhlY3V0aW9uIHRpbWUgYW5kCi0gICByZWR1Y2UgdGhlIGNvbXByZXNzaW9uIHJhdGlvLiAgVGhlIHJldHVybiBjb2RlcyBhcmUgdGhlIHNhbWUgYXMgZm9yCi0gICBnemxvZ193cml0ZSgpLiAqLwotaW50IGd6bG9nX2NvbXByZXNzKGd6bG9nICpsb2cpOwotCi0vKiBDbG9zZSBhIGd6bG9nIG9iamVjdC4gIFJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIC0zIGlmIHRoZSBsb2cgYXJndW1lbnQgaXMKLSAgIGludmFsaWQuICBUaGUgbG9nIG9iamVjdCBpcyBmcmVlZCwgYW5kIHNvIGNhbm5vdCBiZSByZWZlcmVuY2VkIGFnYWluLiAqLwotaW50IGd6bG9nX2Nsb3NlKGd6bG9nICpsb2cpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy96bGliL2V4YW1wbGVzL3psaWJfaG93Lmh0bWwgYi9zcmMvemxpYi9leGFtcGxlcy96bGliX2hvdy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDRmZjFjLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2V4YW1wbGVzL3psaWJfaG93Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9sb29zZS5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPHRpdGxlPnpsaWIgVXNhZ2UgRXhhbXBsZTwvdGl0bGU+Ci08IS0tICBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgTWFyayBBZGxlci4gIC0tPgotPC9oZWFkPgotPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiMwMEEwMDAiPgotPGgyIGFsaWduPSJjZW50ZXIiPiB6bGliIFVzYWdlIEV4YW1wbGUgPC9oMj4KLVdlIG9mdGVuIGdldCBxdWVzdGlvbnMgYWJvdXQgaG93IHRoZSA8dHQ+ZGVmbGF0ZSgpPC90dD4gYW5kIDx0dD5pbmZsYXRlKCk8L3R0PiBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQuCi1Vc2VycyB3b25kZXIgd2hlbiB0aGV5IHNob3VsZCBwcm92aWRlIG1vcmUgaW5wdXQsIHdoZW4gdGhleSBzaG91bGQgdXNlIG1vcmUgb3V0cHV0LAotd2hhdCB0byBkbyB3aXRoIGEgPHR0PlpfQlVGX0VSUk9SPC90dD4sIGhvdyB0byBtYWtlIHN1cmUgdGhlIHByb2Nlc3MgdGVybWluYXRlcyBwcm9wZXJseSwgYW5kCi1zbyBvbi4gIFNvIGZvciB0aG9zZSB3aG8gaGF2ZSByZWFkIDx0dD56bGliLmg8L3R0PiAoYSBmZXcgdGltZXMpLCBhbmQKLXdvdWxkIGxpa2UgZnVydGhlciBlZGlmaWNhdGlvbiwgYmVsb3cgaXMgYW4gYW5ub3RhdGVkIGV4YW1wbGUgaW4gQyBvZiBzaW1wbGUgcm91dGluZXMgdG8gY29tcHJlc3MgYW5kIGRlY29tcHJlc3MKLWZyb20gYW4gaW5wdXQgZmlsZSB0byBhbiBvdXRwdXQgZmlsZSB1c2luZyA8dHQ+ZGVmbGF0ZSgpPC90dD4gYW5kIDx0dD5pbmZsYXRlKCk8L3R0PiByZXNwZWN0aXZlbHkuICBUaGUKLWFubm90YXRpb25zIGFyZSBpbnRlcnNwZXJzZWQgYmV0d2VlbiBsaW5lcyBvZiB0aGUgY29kZS4gIFNvIHBsZWFzZSByZWFkIGJldHdlZW4gdGhlIGxpbmVzLgotV2UgaG9wZSB0aGlzIGhlbHBzIGV4cGxhaW4gc29tZSBvZiB0aGUgaW50cmljYWNpZXMgb2YgPGVtPnpsaWI8L2VtPi4KLTxwPgotV2l0aG91dCBmdXJ0aGVyIGFkaWV1LCBoZXJlIGlzIHRoZSBwcm9ncmFtIDxhIGhyZWY9InpwaXBlLmMiPjx0dD56cGlwZS5jPC90dD48L2E+OgotPHByZT48Yj4KLS8qIHpwaXBlLmM6IGV4YW1wbGUgb2YgcHJvcGVyIHVzZSBvZiB6bGliJ3MgaW5mbGF0ZSgpIGFuZCBkZWZsYXRlKCkKLSAgIE5vdCBjb3B5cmlnaHRlZCAtLSBwcm92aWRlZCB0byB0aGUgcHVibGljIGRvbWFpbgotICAgVmVyc2lvbiAxLjQgIDExIERlY2VtYmVyIDIwMDUgIE1hcmsgQWRsZXIgKi8KLQotLyogVmVyc2lvbiBoaXN0b3J5OgotICAgMS4wICAzMCBPY3QgMjAwNCAgRmlyc3QgdmVyc2lvbgotICAgMS4xICAgOCBOb3YgMjAwNCAgQWRkIHZvaWQgY2FzdGluZyBmb3IgdW51c2VkIHJldHVybiB2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgIFVzZSBzd2l0Y2ggc3RhdGVtZW50IGZvciBpbmZsYXRlKCkgcmV0dXJuIHZhbHVlcwotICAgMS4yICAgOSBOb3YgMjAwNCAgQWRkIGFzc2VydGlvbnMgdG8gZG9jdW1lbnQgemxpYiBndWFyYW50ZWVzCi0gICAxLjMgICA2IEFwciAyMDA1ICBSZW1vdmUgaW5jb3JyZWN0IGFzc2VydGlvbiBpbiBpbmYoKQotICAgMS40ICAxMSBEZWMgMjAwNSAgQWRkIGhhY2sgdG8gYXZvaWQgTVNET1MgZW5kLW9mLWxpbmUgY29udmVyc2lvbnMKLSAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHNvbWUgY29tcGlsZXIgd2FybmluZ3MgZm9yIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycwotICovCi08L2I+PC9wcmU+PCEtLSAtLT4KLVdlIG5vdyBpbmNsdWRlIHRoZSBoZWFkZXIgZmlsZXMgZm9yIHRoZSByZXF1aXJlZCBkZWZpbml0aW9ucy4gIEZyb20KLTx0dD5zdGRpby5oPC90dD4gd2UgdXNlIDx0dD5mb3BlbigpPC90dD4sIDx0dD5mcmVhZCgpPC90dD4sIDx0dD5md3JpdGUoKTwvdHQ+LAotPHR0PmZlb2YoKTwvdHQ+LCA8dHQ+ZmVycm9yKCk8L3R0PiwgYW5kIDx0dD5mY2xvc2UoKTwvdHQ+IGZvciBmaWxlIGkvbywgYW5kCi08dHQ+ZnB1dHMoKTwvdHQ+IGZvciBlcnJvciBtZXNzYWdlcy4gIEZyb20gPHR0PnN0cmluZy5oPC90dD4gd2UgdXNlCi08dHQ+c3RyY21wKCk8L3R0PiBmb3IgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHByb2Nlc3NpbmcuCi1Gcm9tIDx0dD5hc3NlcnQuaDwvdHQ+IHdlIHVzZSB0aGUgPHR0PmFzc2VydCgpPC90dD4gbWFjcm8uCi1Gcm9tIDx0dD56bGliLmg8L3R0Pgotd2UgdXNlIHRoZSBiYXNpYyBjb21wcmVzc2lvbiBmdW5jdGlvbnMgPHR0PmRlZmxhdGVJbml0KCk8L3R0PiwKLTx0dD5kZWZsYXRlKCk8L3R0PiwgYW5kIDx0dD5kZWZsYXRlRW5kKCk8L3R0PiwgYW5kIHRoZSBiYXNpYyBkZWNvbXByZXNzaW9uCi1mdW5jdGlvbnMgPHR0PmluZmxhdGVJbml0KCk8L3R0PiwgPHR0PmluZmxhdGUoKTwvdHQ+LCBhbmQKLTx0dD5pbmZsYXRlRW5kKCk8L3R0Pi4KLTxwcmU+PGI+Ci0jaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKLSNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKLSNpbmNsdWRlICZsdDthc3NlcnQuaCZndDsKLSNpbmNsdWRlICJ6bGliLmgiCi08L2I+PC9wcmU+PCEtLSAtLT4KLVRoaXMgaXMgYW4gdWdseSBoYWNrIHJlcXVpcmVkIHRvIGF2b2lkIGNvcnJ1cHRpb24gb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBvbgotV2luZG93cy9NUy1ET1Mgc3lzdGVtcy4gIFdpdGhvdXQgdGhpcywgdGhvc2Ugc3lzdGVtcyB3b3VsZCBhc3N1bWUgdGhhdCB0aGUgaW5wdXQgYW5kIG91dHB1dAotZmlsZXMgYXJlIHRleHQsIGFuZCB0cnkgdG8gY29udmVydCB0aGUgZW5kLW9mLWxpbmUgY2hhcmFjdGVycyBmcm9tIG9uZSBzdGFuZGFyZCB0bwotYW5vdGhlci4gIFRoYXQgd291bGQgY29ycnVwdCBiaW5hcnkgZGF0YSwgYW5kIGluIHBhcnRpY3VsYXIgd291bGQgcmVuZGVyIHRoZSBjb21wcmVzc2VkIGRhdGEgdW51c2FibGUuCi1UaGlzIHNldHMgdGhlIGlucHV0IGFuZCBvdXRwdXQgdG8gYmluYXJ5IHdoaWNoIHN1cHByZXNzZXMgdGhlIGVuZC1vZi1saW5lIGNvbnZlcnNpb25zLgotPHR0PlNFVF9CSU5BUllfTU9ERSgpPC90dD4gd2lsbCBiZSB1c2VkIGxhdGVyIG9uIDx0dD5zdGRpbjwvdHQ+IGFuZCA8dHQ+c3Rkb3V0PC90dD4sIGF0IHRoZSBiZWdpbm5pbmcgb2YgPHR0Pm1haW4oKTwvdHQ+LgotPHByZT48Yj4KLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotIyAgaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKLSMgIGluY2x1ZGUgJmx0O2lvLmgmZ3Q7Ci0jICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZpbGUpIHNldG1vZGUoZmlsZW5vKGZpbGUpLCBPX0JJTkFSWSkKLSNlbHNlCi0jICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZpbGUpCi0jZW5kaWYKLTwvYj48L3ByZT48IS0tIC0tPgotPHR0PkNIVU5LPC90dD4gaXMgc2ltcGx5IHRoZSBidWZmZXIgc2l6ZSBmb3IgZmVlZGluZyBkYXRhIHRvIGFuZCBwdWxsaW5nIGRhdGEKLWZyb20gdGhlIDxlbT56bGliPC9lbT4gcm91dGluZXMuICBMYXJnZXIgYnVmZmVyIHNpemVzIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50LAotZXNwZWNpYWxseSBmb3IgPHR0PmluZmxhdGUoKTwvdHQ+LiAgSWYgdGhlIG1lbW9yeSBpcyBhdmFpbGFibGUsIGJ1ZmZlcnMgc2l6ZXMKLW9uIHRoZSBvcmRlciBvZiAxMjhLIG9yIDI1NksgYnl0ZXMgc2hvdWxkIGJlIHVzZWQuCi08cHJlPjxiPgotI2RlZmluZSBDSFVOSyAxNjM4NAotPC9iPjwvcHJlPjwhLS0gLS0+Ci1UaGUgPHR0PmRlZigpPC90dD4gcm91dGluZSBjb21wcmVzc2VzIGRhdGEgZnJvbSBhbiBpbnB1dCBmaWxlIHRvIGFuIG91dHB1dCBmaWxlLiAgVGhlIG91dHB1dCBkYXRhCi13aWxsIGJlIGluIHRoZSA8ZW0+emxpYjwvZW0+IGZvcm1hdCwgd2hpY2ggaXMgZGlmZmVyZW50IGZyb20gdGhlIDxlbT5nemlwPC9lbT4gb3IgPGVtPnppcDwvZW0+Ci1mb3JtYXRzLiAgVGhlIDxlbT56bGliPC9lbT4gZm9ybWF0IGhhcyBhIHZlcnkgc21hbGwgaGVhZGVyIG9mIG9ubHkgdHdvIGJ5dGVzIHRvIGlkZW50aWZ5IGl0IGFzCi1hIDxlbT56bGliPC9lbT4gc3RyZWFtIGFuZCB0byBwcm92aWRlIGRlY29kaW5nIGluZm9ybWF0aW9uLCBhbmQgYSBmb3VyLWJ5dGUgdHJhaWxlciB3aXRoIGEgZmFzdAotY2hlY2sgdmFsdWUgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFmdGVyIGRlY29kaW5nLgotPHByZT48Yj4KLS8qIENvbXByZXNzIGZyb20gZmlsZSBzb3VyY2UgdG8gZmlsZSBkZXN0IHVudGlsIEVPRiBvbiBzb3VyY2UuCi0gICBkZWYoKSByZXR1cm5zIFpfT0sgb24gc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgbWVtb3J5IGNvdWxkIG5vdCBiZQotICAgYWxsb2NhdGVkIGZvciBwcm9jZXNzaW5nLCBaX1NUUkVBTV9FUlJPUiBpZiBhbiBpbnZhbGlkIGNvbXByZXNzaW9uCi0gICBsZXZlbCBpcyBzdXBwbGllZCwgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB2ZXJzaW9uIG9mIHpsaWIuaCBhbmQgdGhlCi0gICB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGxpbmtlZCBkbyBub3QgbWF0Y2gsIG9yIFpfRVJSTk8gaWYgdGhlcmUgaXMKLSAgIGFuIGVycm9yIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgZmlsZXMuICovCi1pbnQgZGVmKEZJTEUgKnNvdXJjZSwgRklMRSAqZGVzdCwgaW50IGxldmVsKQotewotPC9iPjwvcHJlPgotSGVyZSBhcmUgdGhlIGxvY2FsIHZhcmlhYmxlcyBmb3IgPHR0PmRlZigpPC90dD4uICA8dHQ+cmV0PC90dD4gd2lsbCBiZSB1c2VkIGZvciA8ZW0+emxpYjwvZW0+Ci1yZXR1cm4gY29kZXMuICA8dHQ+Zmx1c2g8L3R0PiB3aWxsIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZmx1c2hpbmcgc3RhdGUgZm9yIDx0dD5kZWZsYXRlKCk8L3R0PiwKLXdoaWNoIGlzIGVpdGhlciBubyBmbHVzaGluZywgb3IgZmx1c2ggdG8gY29tcGxldGlvbiBhZnRlciB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlIGlzIHJlYWNoZWQuCi08dHQ+aGF2ZTwvdHQ+IGlzIHRoZSBhbW91bnQgb2YgZGF0YSByZXR1cm5lZCBmcm9tIDx0dD5kZWZsYXRlKCk8L3R0Pi4gIFRoZSA8dHQ+c3RybTwvdHQ+IHN0cnVjdHVyZQotaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIGFuZCBmcm9tIHRoZSA8ZW0+emxpYjwvZW0+IHJvdXRpbmVzLCBhbmQgdG8gbWFpbnRhaW4gdGhlCi08dHQ+ZGVmbGF0ZSgpPC90dD4gc3RhdGUuICA8dHQ+aW48L3R0PiBhbmQgPHR0Pm91dDwvdHQ+IGFyZSB0aGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGZvcgotPHR0PmRlZmxhdGUoKTwvdHQ+LgotPHByZT48Yj4KLSAgICBpbnQgcmV0LCBmbHVzaDsKLSAgICB1bnNpZ25lZCBoYXZlOwotICAgIHpfc3RyZWFtIHN0cm07Ci0gICAgdW5zaWduZWQgY2hhciBpbltDSFVOS107Ci0gICAgdW5zaWduZWQgY2hhciBvdXRbQ0hVTktdOwotPC9iPjwvcHJlPjwhLS0gLS0+Ci1UaGUgZmlyc3QgdGhpbmcgd2UgZG8gaXMgdG8gaW5pdGlhbGl6ZSB0aGUgPGVtPnpsaWI8L2VtPiBzdGF0ZSBmb3IgY29tcHJlc3Npb24gdXNpbmcKLTx0dD5kZWZsYXRlSW5pdCgpPC90dD4uICBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIGZpcnN0IHVzZSBvZiA8dHQ+ZGVmbGF0ZSgpPC90dD4uCi1UaGUgPHR0PnphbGxvYzwvdHQ+LCA8dHQ+emZyZWU8L3R0PiwgYW5kIDx0dD5vcGFxdWU8L3R0PiBmaWVsZHMgaW4gdGhlIDx0dD5zdHJtPC90dD4KLXN0cnVjdHVyZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBjYWxsaW5nIDx0dD5kZWZsYXRlSW5pdCgpPC90dD4uICBIZXJlIHRoZXkgYXJlCi1zZXQgdG8gdGhlIDxlbT56bGliPC9lbT4gY29uc3RhbnQgPHR0PlpfTlVMTDwvdHQ+IHRvIHJlcXVlc3QgdGhhdCA8ZW0+emxpYjwvZW0+IHVzZQotdGhlIGRlZmF1bHQgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuICBBbiBhcHBsaWNhdGlvbiBtYXkgYWxzbyBjaG9vc2UgdG8gcHJvdmlkZQotY3VzdG9tIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIGhlcmUuICA8dHQ+ZGVmbGF0ZUluaXQoKTwvdHQ+IHdpbGwgYWxsb2NhdGUgb24gdGhlCi1vcmRlciBvZiAyNTZLIGJ5dGVzIGZvciB0aGUgaW50ZXJuYWwgc3RhdGUuCi0oU2VlIDxhIGhyZWY9InpsaWJfdGVjaC5odG1sIj48ZW0+emxpYiBUZWNobmljYWwgRGV0YWlsczwvZW0+PC9hPi4pCi08cD4KLTx0dD5kZWZsYXRlSW5pdCgpPC90dD4gaXMgY2FsbGVkIHdpdGggYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgdG8gYmUgaW5pdGlhbGl6ZWQgYW5kCi10aGUgY29tcHJlc3Npb24gbGV2ZWwsIHdoaWNoIGlzIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIG9mIC0xIHRvIDkuICBMb3dlciBjb21wcmVzc2lvbgotbGV2ZWxzIHJlc3VsdCBpbiBmYXN0ZXIgZXhlY3V0aW9uLCBidXQgbGVzcyBjb21wcmVzc2lvbi4gIEhpZ2hlciBsZXZlbHMgcmVzdWx0IGluCi1ncmVhdGVyIGNvbXByZXNzaW9uLCBidXQgc2xvd2VyIGV4ZWN1dGlvbi4gIFRoZSA8ZW0+emxpYjwvZW0+IGNvbnN0YW50IFpfREVGQVVMVF9DT01QUkVTU0lPTiwKLWVxdWFsIHRvIC0xLAotcHJvdmlkZXMgYSBnb29kIGNvbXByb21pc2UgYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgc3BlZWQgYW5kIGlzIGVxdWl2YWxlbnQgdG8gbGV2ZWwgNi4KLUxldmVsIDAgYWN0dWFsbHkgZG9lcyBubyBjb21wcmVzc2lvbiBhdCBhbGwsIGFuZCBpbiBmYWN0IGV4cGFuZHMgdGhlIGRhdGEgc2xpZ2h0bHkgdG8gcHJvZHVjZQotdGhlIDxlbT56bGliPC9lbT4gZm9ybWF0IChpdCBpcyBub3QgYSBieXRlLWZvci1ieXRlIGNvcHkgb2YgdGhlIGlucHV0KS4KLU1vcmUgYWR2YW5jZWQgYXBwbGljYXRpb25zIG9mIDxlbT56bGliPC9lbT4KLW1heSB1c2UgPHR0PmRlZmxhdGVJbml0MigpPC90dD4gaGVyZSBpbnN0ZWFkLiAgU3VjaCBhbiBhcHBsaWNhdGlvbiBtYXkgd2FudCB0byByZWR1Y2UgaG93Ci1tdWNoIG1lbW9yeSB3aWxsIGJlIHVzZWQsIGF0IHNvbWUgcHJpY2UgaW4gY29tcHJlc3Npb24uICBPciBpdCBtYXkgbmVlZCB0byByZXF1ZXN0IGEKLTxlbT5nemlwPC9lbT4gaGVhZGVyIGFuZCB0cmFpbGVyIGluc3RlYWQgb2YgYSA8ZW0+emxpYjwvZW0+IGhlYWRlciBhbmQgdHJhaWxlciwgb3IgcmF3Ci1lbmNvZGluZyB3aXRoIG5vIGhlYWRlciBvciB0cmFpbGVyIGF0IGFsbC4KLTxwPgotV2UgbXVzdCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIDx0dD5kZWZsYXRlSW5pdCgpPC90dD4gYWdhaW5zdCB0aGUgPGVtPnpsaWI8L2VtPiBjb25zdGFudAotPHR0PlpfT0s8L3R0PiB0byBtYWtlIHN1cmUgdGhhdCBpdCB3YXMgYWJsZSB0bwotYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUsIGFuZCB0aGF0IHRoZSBwcm92aWRlZCBhcmd1bWVudHMgd2VyZSB2YWxpZC4KLTx0dD5kZWZsYXRlSW5pdCgpPC90dD4gd2lsbCBhbHNvIGNoZWNrIHRoYXQgdGhlIHZlcnNpb24gb2YgPGVtPnpsaWI8L2VtPiB0aGF0IHRoZSA8dHQ+emxpYi5oPC90dD4KLWZpbGUgY2FtZSBmcm9tIG1hdGNoZXMgdGhlIHZlcnNpb24gb2YgPGVtPnpsaWI8L2VtPiBhY3R1YWxseSBsaW5rZWQgd2l0aCB0aGUgcHJvZ3JhbS4gIFRoaXMKLWlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciBlbnZpcm9ubWVudHMgaW4gd2hpY2ggPGVtPnpsaWI8L2VtPiBpcyBhIHNoYXJlZCBsaWJyYXJ5LgotPHA+Ci1Ob3RlIHRoYXQgYW4gYXBwbGljYXRpb24gY2FuIGluaXRpYWxpemUgbXVsdGlwbGUsIGluZGVwZW5kZW50IDxlbT56bGliPC9lbT4gc3RyZWFtcywgd2hpY2ggY2FuCi1vcGVyYXRlIGluIHBhcmFsbGVsLiAgVGhlIHN0YXRlIGluZm9ybWF0aW9uIG1haW50YWluZWQgaW4gdGhlIHN0cnVjdHVyZSBhbGxvd3MgdGhlIDxlbT56bGliPC9lbT4KLXJvdXRpbmVzIHRvIGJlIHJlZW50cmFudC4KLTxwcmU+PGI+Ci0gICAgLyogYWxsb2NhdGUgZGVmbGF0ZSBzdGF0ZSAqLwotICAgIHN0cm0uemFsbG9jID0gWl9OVUxMOwotICAgIHN0cm0uemZyZWUgPSBaX05VTEw7Ci0gICAgc3RybS5vcGFxdWUgPSBaX05VTEw7Ci0gICAgcmV0ID0gZGVmbGF0ZUluaXQoJmFtcDtzdHJtLCBsZXZlbCk7Ci0gICAgaWYgKHJldCAhPSBaX09LKQotICAgICAgICByZXR1cm4gcmV0OwotPC9iPjwvcHJlPjwhLS0gLS0+Ci1XaXRoIHRoZSBwbGVhc2FudHJpZXMgb3V0IG9mIHRoZSB3YXksIG5vdyB3ZSBjYW4gZ2V0IGRvd24gdG8gYnVzaW5lc3MuICBUaGUgb3V0ZXIgPHR0PmRvPC90dD4tbG9vcAotcmVhZHMgYWxsIG9mIHRoZSBpbnB1dCBmaWxlIGFuZCBleGl0cyBhdCB0aGUgYm90dG9tIG9mIHRoZSBsb29wIG9uY2UgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZC4KLVRoaXMgbG9vcCBjb250YWlucyB0aGUgb25seSBjYWxsIG9mIDx0dD5kZWZsYXRlKCk8L3R0Pi4gIFNvIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgYWxsIG9mIHRoZQotaW5wdXQgZGF0YSBoYXMgYmVlbiBwcm9jZXNzZWQgYW5kIHRoYXQgYWxsIG9mIHRoZSBvdXRwdXQgZGF0YSBoYXMgYmVlbiBnZW5lcmF0ZWQgYW5kIGNvbnN1bWVkCi1iZWZvcmUgd2UgZmFsbCBvdXQgb2YgdGhlIGxvb3AgYXQgdGhlIGJvdHRvbS4KLTxwcmU+PGI+Ci0gICAgLyogY29tcHJlc3MgdW50aWwgZW5kIG9mIGZpbGUgKi8KLSAgICBkbyB7Ci08L2I+PC9wcmU+Ci1XZSBzdGFydCBvZmYgYnkgcmVhZGluZyBkYXRhIGZyb20gdGhlIGlucHV0IGZpbGUuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaXMgcHV0IGRpcmVjdGx5Ci1pbnRvIDx0dD5hdmFpbF9pbjwvdHQ+LCBhbmQgYSBwb2ludGVyIHRvIHRob3NlIGJ5dGVzIGlzIHB1dCBpbnRvIDx0dD5uZXh0X2luPC90dD4uICBXZSBhbHNvCi1jaGVjayB0byBzZWUgaWYgZW5kLW9mLWZpbGUgb24gdGhlIGlucHV0IGhhcyBiZWVuIHJlYWNoZWQuICBJZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiBmaWxlLCB0aGVuIDx0dD5mbHVzaDwvdHQ+IGlzIHNldCB0byB0aGUKLTxlbT56bGliPC9lbT4gY29uc3RhbnQgPHR0PlpfRklOSVNIPC90dD4sIHdoaWNoIGlzIGxhdGVyIHBhc3NlZCB0byA8dHQ+ZGVmbGF0ZSgpPC90dD4gdG8KLWluZGljYXRlIHRoYXQgdGhpcyBpcyB0aGUgbGFzdCBjaHVuayBvZiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLiAgV2UgbmVlZCB0byB1c2UgPHR0PmZlb2YoKTwvdHQ+Ci10byBjaGVjayBmb3IgZW5kLW9mLWZpbGUgYXMgb3Bwb3NlZCB0byBzZWVpbmcgaWYgZmV3ZXIgdGhhbiA8dHQ+Q0hVTks8L3R0PiBieXRlcyBoYXZlIGJlZW4gcmVhZC4gIFRoZQotcmVhc29uIGlzIHRoYXQgaWYgdGhlIGlucHV0IGZpbGUgbGVuZ3RoIGlzIGFuIGV4YWN0IG11bHRpcGxlIG9mIDx0dD5DSFVOSzwvdHQ+LCB3ZSB3aWxsIG1pc3MKLXRoZSBmYWN0IHRoYXQgd2UgZ290IHRvIHRoZSBlbmQtb2YtZmlsZSwgYW5kIG5vdCBrbm93IHRvIHRlbGwgPHR0PmRlZmxhdGUoKTwvdHQ+IHRvIGZpbmlzaAotdXAgdGhlIGNvbXByZXNzZWQgc3RyZWFtLiAgSWYgd2UgYXJlIG5vdCB5ZXQgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQsIHRoZW4gdGhlIDxlbT56bGliPC9lbT4KLWNvbnN0YW50IDx0dD5aX05PX0ZMVVNIPC90dD4gd2lsbCBiZSBwYXNzZWQgdG8gPHR0PmRlZmxhdGU8L3R0PiB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSBzdGlsbAotaW4gdGhlIG1pZGRsZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEuCi08cD4KLUlmIHRoZXJlIGlzIGFuIGVycm9yIGluIHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgZmlsZSwgdGhlIHByb2Nlc3MgaXMgYWJvcnRlZCB3aXRoCi08dHQ+ZGVmbGF0ZUVuZCgpPC90dD4gYmVpbmcgY2FsbGVkIHRvIGZyZWUgdGhlIGFsbG9jYXRlZCA8ZW0+emxpYjwvZW0+IHN0YXRlIGJlZm9yZSByZXR1cm5pbmcKLXRoZSBlcnJvci4gIFdlIHdvdWxkbid0IHdhbnQgYSBtZW1vcnkgbGVhaywgbm93IHdvdWxkIHdlPyAgPHR0PmRlZmxhdGVFbmQoKTwvdHQ+IGNhbiBiZSBjYWxsZWQKLWF0IGFueSB0aW1lIGFmdGVyIHRoZSBzdGF0ZSBoYXMgYmVlbiBpbml0aWFsaXplZC4gIE9uY2UgdGhhdCdzIGRvbmUsIDx0dD5kZWZsYXRlSW5pdCgpPC90dD4gKG9yCi08dHQ+ZGVmbGF0ZUluaXQyKCk8L3R0Pikgd291bGQgaGF2ZSB0byBiZSBjYWxsZWQgdG8gc3RhcnQgYSBuZXcgY29tcHJlc3Npb24gcHJvY2Vzcy4gIFRoZXJlIGlzCi1ubyBwb2ludCBoZXJlIGluIGNoZWNraW5nIHRoZSA8dHQ+ZGVmbGF0ZUVuZCgpPC90dD4gcmV0dXJuIGNvZGUuICBUaGUgZGVhbGxvY2F0aW9uIGNhbid0IGZhaWwuCi08cHJlPjxiPgotICAgICAgICBzdHJtLmF2YWlsX2luID0gZnJlYWQoaW4sIDEsIENIVU5LLCBzb3VyY2UpOwotICAgICAgICBpZiAoZmVycm9yKHNvdXJjZSkpIHsKLSAgICAgICAgICAgICh2b2lkKWRlZmxhdGVFbmQoJmFtcDtzdHJtKTsKLSAgICAgICAgICAgIHJldHVybiBaX0VSUk5POwotICAgICAgICB9Ci0gICAgICAgIGZsdXNoID0gZmVvZihzb3VyY2UpID8gWl9GSU5JU0ggOiBaX05PX0ZMVVNIOwotICAgICAgICBzdHJtLm5leHRfaW4gPSBpbjsKLTwvYj48L3ByZT48IS0tIC0tPgotVGhlIGlubmVyIDx0dD5kbzwvdHQ+LWxvb3AgcGFzc2VzIG91ciBjaHVuayBvZiBpbnB1dCBkYXRhIHRvIDx0dD5kZWZsYXRlKCk8L3R0PiwgYW5kIHRoZW4KLWtlZXBzIGNhbGxpbmcgPHR0PmRlZmxhdGUoKTwvdHQ+IHVudGlsIGl0IGlzIGRvbmUgcHJvZHVjaW5nIG91dHB1dC4gIE9uY2UgdGhlcmUgaXMgbm8gbW9yZQotbmV3IG91dHB1dCwgPHR0PmRlZmxhdGUoKTwvdHQ+IGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBjb25zdW1lZCBhbGwgb2YgdGhlIGlucHV0LCBpLmUuLAotPHR0PmF2YWlsX2luPC90dD4gd2lsbCBiZSB6ZXJvLgotPHByZT48Yj4KLSAgICAgICAgLyogcnVuIGRlZmxhdGUoKSBvbiBpbnB1dCB1bnRpbCBvdXRwdXQgYnVmZmVyIG5vdCBmdWxsLCBmaW5pc2gKLSAgICAgICAgICAgY29tcHJlc3Npb24gaWYgYWxsIG9mIHNvdXJjZSBoYXMgYmVlbiByZWFkIGluICovCi0gICAgICAgIGRvIHsKLTwvYj48L3ByZT4KLU91dHB1dCBzcGFjZSBpcyBwcm92aWRlZCB0byA8dHQ+ZGVmbGF0ZSgpPC90dD4gYnkgc2V0dGluZyA8dHQ+YXZhaWxfb3V0PC90dD4gdG8gdGhlIG51bWJlcgotb2YgYXZhaWxhYmxlIG91dHB1dCBieXRlcyBhbmQgPHR0Pm5leHRfb3V0PC90dD4gdG8gYSBwb2ludGVyIHRvIHRoYXQgc3BhY2UuCi08cHJlPjxiPgotICAgICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBDSFVOSzsKLSAgICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBvdXQ7Ci08L2I+PC9wcmU+Ci1Ob3cgd2UgY2FsbCB0aGUgY29tcHJlc3Npb24gZW5naW5lIGl0c2VsZiwgPHR0PmRlZmxhdGUoKTwvdHQ+LiAgSXQgdGFrZXMgYXMgbWFueSBvZiB0aGUKLTx0dD5hdmFpbF9pbjwvdHQ+IGJ5dGVzIGF0IDx0dD5uZXh0X2luPC90dD4gYXMgaXQgY2FuIHByb2Nlc3MsIGFuZCB3cml0ZXMgYXMgbWFueSBhcwotPHR0PmF2YWlsX291dDwvdHQ+IGJ5dGVzIHRvIDx0dD5uZXh0X291dDwvdHQ+LiAgVGhvc2UgY291bnRlcnMgYW5kIHBvaW50ZXJzIGFyZSB0aGVuCi11cGRhdGVkIHBhc3QgdGhlIGlucHV0IGRhdGEgY29uc3VtZWQgYW5kIHRoZSBvdXRwdXQgZGF0YSB3cml0dGVuLiAgSXQgaXMgdGhlIGFtb3VudCBvZgotb3V0cHV0IHNwYWNlIGF2YWlsYWJsZSB0aGF0IG1heSBsaW1pdCBob3cgbXVjaCBpbnB1dCBpcyBjb25zdW1lZC4KLUhlbmNlIHRoZSBpbm5lciBsb29wIHRvIG1ha2Ugc3VyZSB0aGF0Ci1hbGwgb2YgdGhlIGlucHV0IGlzIGNvbnN1bWVkIGJ5IHByb3ZpZGluZyBtb3JlIG91dHB1dCBzcGFjZSBlYWNoIHRpbWUuICBTaW5jZSA8dHQ+YXZhaWxfaW48L3R0PgotYW5kIDx0dD5uZXh0X2luPC90dD4gYXJlIHVwZGF0ZWQgYnkgPHR0PmRlZmxhdGUoKTwvdHQ+LCB3ZSBkb24ndCBoYXZlIHRvIG1lc3Mgd2l0aCB0aG9zZQotYmV0d2VlbiA8dHQ+ZGVmbGF0ZSgpPC90dD4gY2FsbHMgdW50aWwgaXQncyBhbGwgdXNlZCB1cC4KLTxwPgotVGhlIHBhcmFtZXRlcnMgdG8gPHR0PmRlZmxhdGUoKTwvdHQ+IGFyZSBhIHBvaW50ZXIgdG8gdGhlIDx0dD5zdHJtPC90dD4gc3RydWN0dXJlIGNvbnRhaW5pbmcKLXRoZSBpbnB1dCBhbmQgb3V0cHV0IGluZm9ybWF0aW9uIGFuZCB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gZW5naW5lIHN0YXRlLCBhbmQgYSBwYXJhbWV0ZXIKLWluZGljYXRpbmcgd2hldGhlciBhbmQgaG93IHRvIGZsdXNoIGRhdGEgdG8gdGhlIG91dHB1dC4gIE5vcm1hbGx5IDx0dD5kZWZsYXRlPC90dD4gd2lsbCBjb25zdW1lCi1zZXZlcmFsIEsgYnl0ZXMgb2YgaW5wdXQgZGF0YSBiZWZvcmUgcHJvZHVjaW5nIGFueSBvdXRwdXQgKGV4Y2VwdCBmb3IgdGhlIGhlYWRlciksIGluIG9yZGVyCi10byBhY2N1bXVsYXRlIHN0YXRpc3RpY3Mgb24gdGhlIGRhdGEgZm9yIG9wdGltdW0gY29tcHJlc3Npb24uICBJdCB3aWxsIHRoZW4gcHV0IG91dCBhIGJ1cnN0IG9mCi1jb21wcmVzc2VkIGRhdGEsIGFuZCBwcm9jZWVkIHRvIGNvbnN1bWUgbW9yZSBpbnB1dCBiZWZvcmUgdGhlIG5leHQgYnVyc3QuICBFdmVudHVhbGx5LAotPHR0PmRlZmxhdGUoKTwvdHQ+Ci1tdXN0IGJlIHRvbGQgdG8gdGVybWluYXRlIHRoZSBzdHJlYW0sIGNvbXBsZXRlIHRoZSBjb21wcmVzc2lvbiB3aXRoIHByb3ZpZGVkIGlucHV0IGRhdGEsIGFuZAotd3JpdGUgb3V0IHRoZSB0cmFpbGVyIGNoZWNrIHZhbHVlLiAgPHR0PmRlZmxhdGUoKTwvdHQ+IHdpbGwgY29udGludWUgdG8gY29tcHJlc3Mgbm9ybWFsbHkgYXMgbG9uZwotYXMgdGhlIGZsdXNoIHBhcmFtZXRlciBpcyA8dHQ+Wl9OT19GTFVTSDwvdHQ+LiAgT25jZSB0aGUgPHR0PlpfRklOSVNIPC90dD4gcGFyYW1ldGVyIGlzIHByb3ZpZGVkLAotPHR0PmRlZmxhdGUoKTwvdHQ+IHdpbGwgYmVnaW4gdG8gY29tcGxldGUgdGhlIGNvbXByZXNzZWQgb3V0cHV0IHN0cmVhbS4gIEhvd2V2ZXIgZGVwZW5kaW5nIG9uIGhvdwotbXVjaCBvdXRwdXQgc3BhY2UgaXMgcHJvdmlkZWQsIDx0dD5kZWZsYXRlKCk8L3R0PiBtYXkgaGF2ZSB0byBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyB1bnRpbCBpdAotaGFzIHByb3ZpZGVkIHRoZSBjb21wbGV0ZSBjb21wcmVzc2VkIHN0cmVhbSwgZXZlbiBhZnRlciBpdCBoYXMgY29uc3VtZWQgYWxsIG9mIHRoZSBpbnB1dC4gIFRoZSBmbHVzaAotcGFyYW1ldGVyIG11c3QgY29udGludWUgdG8gYmUgPHR0PlpfRklOSVNIPC90dD4gZm9yIHRob3NlIHN1YnNlcXVlbnQgY2FsbHMuCi08cD4KLVRoZXJlIGFyZSBvdGhlciB2YWx1ZXMgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciB0aGF0IGFyZSB1c2VkIGluIG1vcmUgYWR2YW5jZWQgYXBwbGljYXRpb25zLiAgWW91IGNhbgotZm9yY2UgPHR0PmRlZmxhdGUoKTwvdHQ+IHRvIHByb2R1Y2UgYSBidXJzdCBvZiBvdXRwdXQgdGhhdCBlbmNvZGVzIGFsbCBvZiB0aGUgaW5wdXQgZGF0YSBwcm92aWRlZAotc28gZmFyLCBldmVuIGlmIGl0IHdvdWxkbid0IGhhdmUgb3RoZXJ3aXNlLCBmb3IgZXhhbXBsZSB0byBjb250cm9sIGRhdGEgbGF0ZW5jeSBvbiBhIGxpbmsgd2l0aAotY29tcHJlc3NlZCBkYXRhLiAgWW91IGNhbiBhbHNvIGFzayB0aGF0IDx0dD5kZWZsYXRlKCk8L3R0PiBkbyB0aGF0IGFzIHdlbGwgYXMgZXJhc2UgYW55IGhpc3RvcnkgdXAgdG8KLXRoYXQgcG9pbnQgc28gdGhhdCB3aGF0IGZvbGxvd3MgY2FuIGJlIGRlY29tcHJlc3NlZCBpbmRlcGVuZGVudGx5LCBmb3IgZXhhbXBsZSBmb3IgcmFuZG9tIGFjY2VzcwotYXBwbGljYXRpb25zLiAgQm90aCByZXF1ZXN0cyB3aWxsIGRlZ3JhZGUgY29tcHJlc3Npb24gYnkgYW4gYW1vdW50IGRlcGVuZGluZyBvbiBob3cgb2Z0ZW4gc3VjaAotcmVxdWVzdHMgYXJlIG1hZGUuCi08cD4KLTx0dD5kZWZsYXRlKCk8L3R0PiBoYXMgYSByZXR1cm4gdmFsdWUgdGhhdCBjYW4gaW5kaWNhdGUgZXJyb3JzLCB5ZXQgd2UgZG8gbm90IGNoZWNrIGl0IGhlcmUuICBXaHkKLW5vdD8gIFdlbGwsIGl0IHR1cm5zIG91dCB0aGF0IDx0dD5kZWZsYXRlKCk8L3R0PiBjYW4gZG8gbm8gd3JvbmcgaGVyZS4gIExldCdzIGdvIHRocm91Z2gKLTx0dD5kZWZsYXRlKCk8L3R0PidzIHJldHVybiB2YWx1ZXMgYW5kIGRpc3BlbnNlIHdpdGggdGhlbSBvbmUgYnkgb25lLiAgVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmUKLTx0dD5aX09LPC90dD4sIDx0dD5aX1NUUkVBTV9FTkQ8L3R0PiwgPHR0PlpfU1RSRUFNX0VSUk9SPC90dD4sIG9yIDx0dD5aX0JVRl9FUlJPUjwvdHQ+LiAgPHR0PlpfT0s8L3R0PgotaXMsIHdlbGwsIG9rLiAgPHR0PlpfU1RSRUFNX0VORDwvdHQ+IGlzIGFsc28gb2sgYW5kIHdpbGwgYmUgcmV0dXJuZWQgZm9yIHRoZSBsYXN0IGNhbGwgb2YKLTx0dD5kZWZsYXRlKCk8L3R0Pi4gIFRoaXMgaXMgYWxyZWFkeSBndWFyYW50ZWVkIGJ5IGNhbGxpbmcgPHR0PmRlZmxhdGUoKTwvdHQ+IHdpdGggPHR0PlpfRklOSVNIPC90dD4KLXVudGlsIGl0IGhhcyBubyBtb3JlIG91dHB1dC4gIDx0dD5aX1NUUkVBTV9FUlJPUjwvdHQ+IGlzIG9ubHkgcG9zc2libGUgaWYgdGhlIHN0cmVhbSBpcyBub3QKLWluaXRpYWxpemVkIHByb3Blcmx5LCBidXQgd2UgZGlkIGluaXRpYWxpemUgaXQgcHJvcGVybHkuICBUaGVyZSBpcyBubyBoYXJtIGluIGNoZWNraW5nIGZvcgotPHR0PlpfU1RSRUFNX0VSUk9SPC90dD4gaGVyZSwgZm9yIGV4YW1wbGUgdG8gY2hlY2sgZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHNvbWUKLW90aGVyIHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uIGluYWR2ZXJ0ZW50bHkgY2xvYmJlcmVkIHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUgPGVtPnpsaWI8L2VtPiBzdGF0ZS4KLTx0dD5aX0JVRl9FUlJPUjwvdHQ+IHdpbGwgYmUgZXhwbGFpbmVkIGZ1cnRoZXIgYmVsb3csIGJ1dAotc3VmZmljZSBpdCB0byBzYXkgdGhhdCB0aGlzIGlzIHNpbXBseSBhbiBpbmRpY2F0aW9uIHRoYXQgPHR0PmRlZmxhdGUoKTwvdHQ+IGNvdWxkIG5vdCBjb25zdW1lCi1tb3JlIGlucHV0IG9yIHByb2R1Y2UgbW9yZSBvdXRwdXQuICA8dHQ+ZGVmbGF0ZSgpPC90dD4gY2FuIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgb3V0cHV0IHNwYWNlCi1vciBtb3JlIGF2YWlsYWJsZSBpbnB1dCwgd2hpY2ggaXQgd2lsbCBiZSBpbiB0aGlzIGNvZGUuCi08cHJlPjxiPgotICAgICAgICAgICAgcmV0ID0gZGVmbGF0ZSgmYW1wO3N0cm0sIGZsdXNoKTsgICAgLyogbm8gYmFkIHJldHVybiB2YWx1ZSAqLwotICAgICAgICAgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7ICAvKiBzdGF0ZSBub3QgY2xvYmJlcmVkICovCi08L2I+PC9wcmU+Ci1Ob3cgd2UgY29tcHV0ZSBob3cgbXVjaCBvdXRwdXQgPHR0PmRlZmxhdGUoKTwvdHQ+IHByb3ZpZGVkIG9uIHRoZSBsYXN0IGNhbGwsIHdoaWNoIGlzIHRoZQotZGlmZmVyZW5jZSBiZXR3ZWVuIGhvdyBtdWNoIHNwYWNlIHdhcyBwcm92aWRlZCBiZWZvcmUgdGhlIGNhbGwsIGFuZCBob3cgbXVjaCBvdXRwdXQgc3BhY2UKLWlzIHN0aWxsIGF2YWlsYWJsZSBhZnRlciB0aGUgY2FsbC4gIFRoZW4gdGhhdCBkYXRhLCBpZiBhbnksIGlzIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBmaWxlLgotV2UgY2FuIHRoZW4gcmV1c2UgdGhlIG91dHB1dCBidWZmZXIgZm9yIHRoZSBuZXh0IGNhbGwgb2YgPHR0PmRlZmxhdGUoKTwvdHQ+LiAgQWdhaW4gaWYgdGhlcmUKLWlzIGEgZmlsZSBpL28gZXJyb3IsIHdlIGNhbGwgPHR0PmRlZmxhdGVFbmQoKTwvdHQ+IGJlZm9yZSByZXR1cm5pbmcgdG8gYXZvaWQgYSBtZW1vcnkgbGVhay4KLTxwcmU+PGI+Ci0gICAgICAgICAgICBoYXZlID0gQ0hVTksgLSBzdHJtLmF2YWlsX291dDsKLSAgICAgICAgICAgIGlmIChmd3JpdGUob3V0LCAxLCBoYXZlLCBkZXN0KSAhPSBoYXZlIHx8IGZlcnJvcihkZXN0KSkgewotICAgICAgICAgICAgICAgICh2b2lkKWRlZmxhdGVFbmQoJmFtcDtzdHJtKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gWl9FUlJOTzsKLSAgICAgICAgICAgIH0KLTwvYj48L3ByZT4KLVRoZSBpbm5lciA8dHQ+ZG88L3R0Pi1sb29wIGlzIHJlcGVhdGVkIHVudGlsIHRoZSBsYXN0IDx0dD5kZWZsYXRlKCk8L3R0PiBjYWxsIGZhaWxzIHRvIGZpbGwgdGhlCi1wcm92aWRlZCBvdXRwdXQgYnVmZmVyLiAgVGhlbiB3ZSBrbm93IHRoYXQgPHR0PmRlZmxhdGUoKTwvdHQ+IGhhcyBkb25lIGFzIG11Y2ggYXMgaXQgY2FuIHdpdGgKLXRoZSBwcm92aWRlZCBpbnB1dCwgYW5kIHRoYXQgYWxsIG9mIHRoYXQgaW5wdXQgaGFzIGJlZW4gY29uc3VtZWQuICBXZSBjYW4gdGhlbiBmYWxsIG91dCBvZiB0aGlzCi1sb29wIGFuZCByZXVzZSB0aGUgaW5wdXQgYnVmZmVyLgotPHA+Ci1UaGUgd2F5IHdlIHRlbGwgdGhhdCA8dHQ+ZGVmbGF0ZSgpPC90dD4gaGFzIG5vIG1vcmUgb3V0cHV0IGlzIGJ5IHNlZWluZyB0aGF0IGl0IGRpZCBub3QgZmlsbAotdGhlIG91dHB1dCBidWZmZXIsIGxlYXZpbmcgPHR0PmF2YWlsX291dDwvdHQ+IGdyZWF0ZXIgdGhhbiB6ZXJvLiAgSG93ZXZlciBzdXBwb3NlIHRoYXQKLTx0dD5kZWZsYXRlKCk8L3R0PiBoYXMgbm8gbW9yZSBvdXRwdXQsIGJ1dCBqdXN0IHNvIGhhcHBlbmVkIHRvIGV4YWN0bHkgZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlciEKLTx0dD5hdmFpbF9vdXQ8L3R0PiBpcyB6ZXJvLCBhbmQgd2UgY2FuJ3QgdGVsbCB0aGF0IDx0dD5kZWZsYXRlKCk8L3R0PiBoYXMgZG9uZSBhbGwgaXQgY2FuLgotQXMgZmFyIGFzIHdlIGtub3csIDx0dD5kZWZsYXRlKCk8L3R0PgotaGFzIG1vcmUgb3V0cHV0IGZvciB1cy4gIFNvIHdlIGNhbGwgaXQgYWdhaW4uICBCdXQgbm93IDx0dD5kZWZsYXRlKCk8L3R0PiBwcm9kdWNlcyBubyBvdXRwdXQKLWF0IGFsbCwgYW5kIDx0dD5hdmFpbF9vdXQ8L3R0PiByZW1haW5zIHVuY2hhbmdlZCBhcyA8dHQ+Q0hVTks8L3R0Pi4gIFRoYXQgPHR0PmRlZmxhdGUoKTwvdHQ+IGNhbGwKLXdhc24ndCBhYmxlIHRvIGRvIGFueXRoaW5nLCBlaXRoZXIgY29uc3VtZSBpbnB1dCBvciBwcm9kdWNlIG91dHB1dCwgYW5kIHNvIGl0IHJldHVybnMKLTx0dD5aX0JVRl9FUlJPUjwvdHQ+LiAgKFNlZSwgSSB0b2xkIHlvdSBJJ2QgY292ZXIgdGhpcyBsYXRlci4pICBIb3dldmVyIHRoaXMgaXMgbm90IGEgcHJvYmxlbSBhdAotYWxsLiAgTm93IHdlIGZpbmFsbHkgaGF2ZSB0aGUgZGVzaXJlZCBpbmRpY2F0aW9uIHRoYXQgPHR0PmRlZmxhdGUoKTwvdHQ+IGlzIHJlYWxseSBkb25lLAotYW5kIHNvIHdlIGRyb3Agb3V0IG9mIHRoZSBpbm5lciBsb29wIHRvIHByb3ZpZGUgbW9yZSBpbnB1dCB0byA8dHQ+ZGVmbGF0ZSgpPC90dD4uCi08cD4KLVdpdGggPHR0PmZsdXNoPC90dD4gc2V0IHRvIDx0dD5aX0ZJTklTSDwvdHQ+LCB0aGlzIGZpbmFsIHNldCBvZiA8dHQ+ZGVmbGF0ZSgpPC90dD4gY2FsbHMgd2lsbAotY29tcGxldGUgdGhlIG91dHB1dCBzdHJlYW0uICBPbmNlIHRoYXQgaXMgZG9uZSwgc3Vic2VxdWVudCBjYWxscyBvZiA8dHQ+ZGVmbGF0ZSgpPC90dD4gd291bGQgcmV0dXJuCi08dHQ+Wl9TVFJFQU1fRVJST1I8L3R0PiBpZiB0aGUgZmx1c2ggcGFyYW1ldGVyIGlzIG5vdCA8dHQ+Wl9GSU5JU0g8L3R0PiwgYW5kIGRvIG5vIG1vcmUgcHJvY2Vzc2luZwotdW50aWwgdGhlIHN0YXRlIGlzIHJlaW5pdGlhbGl6ZWQuCi08cD4KLVNvbWUgYXBwbGljYXRpb25zIG9mIDxlbT56bGliPC9lbT4gaGF2ZSB0d28gbG9vcHMgdGhhdCBjYWxsIDx0dD5kZWZsYXRlKCk8L3R0PgotaW5zdGVhZCBvZiB0aGUgc2luZ2xlIGlubmVyIGxvb3Agd2UgaGF2ZSBoZXJlLiAgVGhlIGZpcnN0IGxvb3Agd291bGQgY2FsbAotd2l0aG91dCBmbHVzaGluZyBhbmQgZmVlZCBhbGwgb2YgdGhlIGRhdGEgdG8gPHR0PmRlZmxhdGUoKTwvdHQ+LiAgVGhlIHNlY29uZCBsb29wIHdvdWxkIGNhbGwKLTx0dD5kZWZsYXRlKCk8L3R0PiB3aXRoIG5vIG1vcmUKLWRhdGEgYW5kIHRoZSA8dHQ+Wl9GSU5JU0g8L3R0PiBwYXJhbWV0ZXIgdG8gY29tcGxldGUgdGhlIHByb2Nlc3MuICBBcyB5b3UgY2FuIHNlZSBmcm9tIHRoaXMKLWV4YW1wbGUsIHRoYXQgY2FuIGJlIGF2b2lkZWQgYnkgc2ltcGx5IGtlZXBpbmcgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZmx1c2ggc3RhdGUuCi08cHJlPjxiPgotICAgICAgICB9IHdoaWxlIChzdHJtLmF2YWlsX291dCA9PSAwKTsKLSAgICAgICAgYXNzZXJ0KHN0cm0uYXZhaWxfaW4gPT0gMCk7ICAgICAvKiBhbGwgaW5wdXQgd2lsbCBiZSB1c2VkICovCi08L2I+PC9wcmU+PCEtLSAtLT4KLU5vdyB3ZSBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbHJlYWR5IHByb2Nlc3NlZCBhbGwgb2YgdGhlIGlucHV0IGZpbGUuICBUaGF0IGluZm9ybWF0aW9uIHdhcwotc2F2ZWQgaW4gdGhlIDx0dD5mbHVzaDwvdHQ+IHZhcmlhYmxlLCBzbyB3ZSBzZWUgaWYgdGhhdCB3YXMgc2V0IHRvIDx0dD5aX0ZJTklTSDwvdHQ+LiAgSWYgc28sCi10aGVuIHdlJ3JlIGRvbmUgYW5kIHdlIGZhbGwgb3V0IG9mIHRoZSBvdXRlciBsb29wLiAgV2UncmUgZ3VhcmFudGVlZCB0byBnZXQgPHR0PlpfU1RSRUFNX0VORDwvdHQ+Ci1mcm9tIHRoZSBsYXN0IDx0dD5kZWZsYXRlKCk8L3R0PiBjYWxsLCBzaW5jZSB3ZSByYW4gaXQgdW50aWwgdGhlIGxhc3QgY2h1bmsgb2YgaW5wdXQgd2FzCi1jb25zdW1lZCBhbmQgYWxsIG9mIHRoZSBvdXRwdXQgd2FzIGdlbmVyYXRlZC4KLTxwcmU+PGI+Ci0gICAgICAgIC8qIGRvbmUgd2hlbiBsYXN0IGRhdGEgaW4gZmlsZSBwcm9jZXNzZWQgKi8KLSAgICB9IHdoaWxlIChmbHVzaCAhPSBaX0ZJTklTSCk7Ci0gICAgYXNzZXJ0KHJldCA9PSBaX1NUUkVBTV9FTkQpOyAgICAgICAgLyogc3RyZWFtIHdpbGwgYmUgY29tcGxldGUgKi8KLTwvYj48L3ByZT48IS0tIC0tPgotVGhlIHByb2Nlc3MgaXMgY29tcGxldGUsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGRlYWxsb2NhdGUgdGhlIHN0YXRlIHRvIGF2b2lkIGEgbWVtb3J5IGxlYWsKLShvciByYXRoZXIgbW9yZSBsaWtlIGEgbWVtb3J5IGhlbW9ycmhhZ2UgaWYgeW91IGRpZG4ndCBkbyB0aGlzKS4gIFRoZW4KLWZpbmFsbHkgd2UgY2FuIHJldHVybiB3aXRoIGEgaGFwcHkgcmV0dXJuIHZhbHVlLgotPHByZT48Yj4KLSAgICAvKiBjbGVhbiB1cCBhbmQgcmV0dXJuICovCi0gICAgKHZvaWQpZGVmbGF0ZUVuZCgmYW1wO3N0cm0pOwotICAgIHJldHVybiBaX09LOwotfQotPC9iPjwvcHJlPjwhLS0gLS0+Ci1Ob3cgd2UgZG8gdGhlIHNhbWUgdGhpbmcgZm9yIGRlY29tcHJlc3Npb24gaW4gdGhlIDx0dD5pbmYoKTwvdHQ+IHJvdXRpbmUuIDx0dD5pbmYoKTwvdHQ+Ci1kZWNvbXByZXNzZXMgd2hhdCBpcyBob3BlZnVsbHkgYSB2YWxpZCA8ZW0+emxpYjwvZW0+IHN0cmVhbSBmcm9tIHRoZSBpbnB1dCBmaWxlIGFuZCB3cml0ZXMgdGhlCi11bmNvbXByZXNzZWQgZGF0YSB0byB0aGUgb3V0cHV0IGZpbGUuICBNdWNoIG9mIHRoZSBkaXNjdXNzaW9uIGFib3ZlIGZvciA8dHQ+ZGVmKCk8L3R0PgotYXBwbGllcyB0byA8dHQ+aW5mKCk8L3R0PiBhcyB3ZWxsLCBzbyB0aGUgZGlzY3Vzc2lvbiBoZXJlIHdpbGwgZm9jdXMgb24gdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4KLXRoZSB0d28uCi08cHJlPjxiPgotLyogRGVjb21wcmVzcyBmcm9tIGZpbGUgc291cmNlIHRvIGZpbGUgZGVzdCB1bnRpbCBzdHJlYW0gZW5kcyBvciBFT0YuCi0gICBpbmYoKSByZXR1cm5zIFpfT0sgb24gc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgbWVtb3J5IGNvdWxkIG5vdCBiZQotICAgYWxsb2NhdGVkIGZvciBwcm9jZXNzaW5nLCBaX0RBVEFfRVJST1IgaWYgdGhlIGRlZmxhdGUgZGF0YSBpcwotICAgaW52YWxpZCBvciBpbmNvbXBsZXRlLCBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHZlcnNpb24gb2YgemxpYi5oIGFuZAotICAgdGhlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbGlua2VkIGRvIG5vdCBtYXRjaCwgb3IgWl9FUlJOTyBpZiB0aGVyZQotICAgaXMgYW4gZXJyb3IgcmVhZGluZyBvciB3cml0aW5nIHRoZSBmaWxlcy4gKi8KLWludCBpbmYoRklMRSAqc291cmNlLCBGSUxFICpkZXN0KQotewotPC9iPjwvcHJlPgotVGhlIGxvY2FsIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgdGhleSBkbyBmb3IgPHR0PmRlZigpPC90dD4uICBUaGUKLW9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZXJlIGlzIG5vIDx0dD5mbHVzaDwvdHQ+IHZhcmlhYmxlLCBzaW5jZSA8dHQ+aW5mbGF0ZSgpPC90dD4KLWNhbiB0ZWxsIGZyb20gdGhlIDxlbT56bGliPC9lbT4gc3RyZWFtIGl0c2VsZiB3aGVuIHRoZSBzdHJlYW0gaXMgY29tcGxldGUuCi08cHJlPjxiPgotICAgIGludCByZXQ7Ci0gICAgdW5zaWduZWQgaGF2ZTsKLSAgICB6X3N0cmVhbSBzdHJtOwotICAgIHVuc2lnbmVkIGNoYXIgaW5bQ0hVTktdOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0W0NIVU5LXTsKLTwvYj48L3ByZT48IS0tIC0tPgotVGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBzdGF0ZSBpcyB0aGUgc2FtZSwgZXhjZXB0IHRoYXQgdGhlcmUgaXMgbm8gY29tcHJlc3Npb24gbGV2ZWwsCi1vZiBjb3Vyc2UsIGFuZCB0d28gbW9yZSBlbGVtZW50cyBvZiB0aGUgc3RydWN0dXJlIGFyZSBpbml0aWFsaXplZC4gIDx0dD5hdmFpbF9pbjwvdHQ+Ci1hbmQgPHR0Pm5leHRfaW48L3R0PiBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBjYWxsaW5nIDx0dD5pbmZsYXRlSW5pdCgpPC90dD4uICBUaGlzCi1pcyBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiBoYXMgdGhlIG9wdGlvbiB0byBwcm92aWRlIHRoZSBzdGFydCBvZiB0aGUgemxpYiBzdHJlYW0gaW4KLW9yZGVyIGZvciA8dHQ+aW5mbGF0ZUluaXQoKTwvdHQ+IHRvIGhhdmUgYWNjZXNzIHRvIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21wcmVzc2lvbgotbWV0aG9kIHRvIGFpZCBpbiBtZW1vcnkgYWxsb2NhdGlvbi4gIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIDxlbT56bGliPC9lbT4KLSh1cCB0aHJvdWdoIHZlcnNpb25zIDEuMi54KSwgdGhlIG1ldGhvZC1kZXBlbmRlbnQgbWVtb3J5IGFsbG9jYXRpb25zIGFyZSBkZWZlcnJlZCB0byB0aGUgZmlyc3QgY2FsbCBvZgotPHR0PmluZmxhdGUoKTwvdHQ+IGFueXdheS4gIEhvd2V2ZXIgdGhvc2UgZmllbGRzIG11c3QgYmUgaW5pdGlhbGl6ZWQgc2luY2UgbGF0ZXIgdmVyc2lvbnMKLW9mIDxlbT56bGliPC9lbT4gdGhhdCBwcm92aWRlIG1vcmUgY29tcHJlc3Npb24gbWV0aG9kcyBtYXkgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcyBpbnRlcmZhY2UuCi1JbiBhbnkgY2FzZSwgbm8gZGVjb21wcmVzc2lvbiBpcyBwZXJmb3JtZWQgYnkgPHR0PmluZmxhdGVJbml0KCk8L3R0Piwgc28gdGhlCi08dHQ+YXZhaWxfb3V0PC90dD4gYW5kIDx0dD5uZXh0X291dDwvdHQ+IGZpZWxkcyBkbyBub3QgbmVlZCB0byBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZy4KLTxwPgotSGVyZSA8dHQ+YXZhaWxfaW48L3R0PiBpcyBzZXQgdG8gemVybyBhbmQgPHR0Pm5leHRfaW48L3R0PiBpcyBzZXQgdG8gPHR0PlpfTlVMTDwvdHQ+IHRvCi1pbmRpY2F0ZSB0aGF0IG5vIGlucHV0IGRhdGEgaXMgYmVpbmcgcHJvdmlkZWQuCi08cHJlPjxiPgotICAgIC8qIGFsbG9jYXRlIGluZmxhdGUgc3RhdGUgKi8KLSAgICBzdHJtLnphbGxvYyA9IFpfTlVMTDsKLSAgICBzdHJtLnpmcmVlID0gWl9OVUxMOwotICAgIHN0cm0ub3BhcXVlID0gWl9OVUxMOwotICAgIHN0cm0uYXZhaWxfaW4gPSAwOwotICAgIHN0cm0ubmV4dF9pbiA9IFpfTlVMTDsKLSAgICByZXQgPSBpbmZsYXRlSW5pdCgmYW1wO3N0cm0pOwotICAgIGlmIChyZXQgIT0gWl9PSykKLSAgICAgICAgcmV0dXJuIHJldDsKLTwvYj48L3ByZT48IS0tIC0tPgotVGhlIG91dGVyIDx0dD5kbzwvdHQ+LWxvb3AgZGVjb21wcmVzc2VzIGlucHV0IHVudGlsIDx0dD5pbmZsYXRlKCk8L3R0PiBpbmRpY2F0ZXMKLXRoYXQgaXQgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGFuZCBoYXMgcHJvZHVjZWQgYWxsIG9mIHRoZSB1bmNvbXByZXNzZWQKLW91dHB1dC4gIFRoaXMgaXMgaW4gY29udHJhc3QgdG8gPHR0PmRlZigpPC90dD4gd2hpY2ggcHJvY2Vzc2VzIGFsbCBvZiB0aGUgaW5wdXQgZmlsZS4KLUlmIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQgYmVmb3JlIHRoZSBjb21wcmVzc2VkIGRhdGEgc2VsZi10ZXJtaW5hdGVzLCB0aGVuIHRoZSBjb21wcmVzc2VkCi1kYXRhIGlzIGluY29tcGxldGUgYW5kIGFuIGVycm9yIGlzIHJldHVybmVkLgotPHByZT48Yj4KLSAgICAvKiBkZWNvbXByZXNzIHVudGlsIGRlZmxhdGUgc3RyZWFtIGVuZHMgb3IgZW5kIG9mIGZpbGUgKi8KLSAgICBkbyB7Ci08L2I+PC9wcmU+Ci1XZSByZWFkIGlucHV0IGRhdGEgYW5kIHNldCB0aGUgPHR0PnN0cm08L3R0PiBzdHJ1Y3R1cmUgYWNjb3JkaW5nbHkuICBJZiB3ZSd2ZSByZWFjaGVkIHRoZQotZW5kIG9mIHRoZSBpbnB1dCBmaWxlLCB0aGVuIHdlIGxlYXZlIHRoZSBvdXRlciBsb29wIGFuZCByZXBvcnQgYW4gZXJyb3IsIHNpbmNlIHRoZQotY29tcHJlc3NlZCBkYXRhIGlzIGluY29tcGxldGUuICBOb3RlIHRoYXQgd2UgbWF5IHJlYWQgbW9yZSBkYXRhIHRoYW4gaXMgZXZlbnR1YWxseSBjb25zdW1lZAotYnkgPHR0PmluZmxhdGUoKTwvdHQ+LCBpZiB0aGUgaW5wdXQgZmlsZSBjb250aW51ZXMgcGFzdCB0aGUgPGVtPnpsaWI8L2VtPiBzdHJlYW0uCi1Gb3IgYXBwbGljYXRpb25zIHdoZXJlIDxlbT56bGliPC9lbT4gc3RyZWFtcyBhcmUgZW1iZWRkZWQgaW4gb3RoZXIgZGF0YSwgdGhpcyByb3V0aW5lIHdvdWxkCi1uZWVkIHRvIGJlIG1vZGlmaWVkIHRvIHJldHVybiB0aGUgdW51c2VkIGRhdGEsIG9yIGF0IGxlYXN0IGluZGljYXRlIGhvdyBtdWNoIG9mIHRoZSBpbnB1dAotZGF0YSB3YXMgbm90IHVzZWQsIHNvIHRoZSBhcHBsaWNhdGlvbiB3b3VsZCBrbm93IHdoZXJlIHRvIHBpY2sgdXAgYWZ0ZXIgdGhlIDxlbT56bGliPC9lbT4gc3RyZWFtLgotPHByZT48Yj4KLSAgICAgICAgc3RybS5hdmFpbF9pbiA9IGZyZWFkKGluLCAxLCBDSFVOSywgc291cmNlKTsKLSAgICAgICAgaWYgKGZlcnJvcihzb3VyY2UpKSB7Ci0gICAgICAgICAgICAodm9pZClpbmZsYXRlRW5kKCZhbXA7c3RybSk7Ci0gICAgICAgICAgICByZXR1cm4gWl9FUlJOTzsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RybS5hdmFpbF9pbiA9PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHN0cm0ubmV4dF9pbiA9IGluOwotPC9iPjwvcHJlPjwhLS0gLS0+Ci1UaGUgaW5uZXIgPHR0PmRvPC90dD4tbG9vcCBoYXMgdGhlIHNhbWUgZnVuY3Rpb24gaXQgZGlkIGluIDx0dD5kZWYoKTwvdHQ+LCB3aGljaCBpcyB0bwota2VlcCBjYWxsaW5nIDx0dD5pbmZsYXRlKCk8L3R0PiB1bnRpbCBoYXMgZ2VuZXJhdGVkIGFsbCBvZiB0aGUgb3V0cHV0IGl0IGNhbiB3aXRoIHRoZQotcHJvdmlkZWQgaW5wdXQuCi08cHJlPjxiPgotICAgICAgICAvKiBydW4gaW5mbGF0ZSgpIG9uIGlucHV0IHVudGlsIG91dHB1dCBidWZmZXIgbm90IGZ1bGwgKi8KLSAgICAgICAgZG8gewotPC9iPjwvcHJlPgotSnVzdCBsaWtlIGluIDx0dD5kZWYoKTwvdHQ+LCB0aGUgc2FtZSBvdXRwdXQgc3BhY2UgaXMgcHJvdmlkZWQgZm9yIGVhY2ggY2FsbCBvZiA8dHQ+aW5mbGF0ZSgpPC90dD4uCi08cHJlPjxiPgotICAgICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBDSFVOSzsKLSAgICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBvdXQ7Ci08L2I+PC9wcmU+Ci1Ob3cgd2UgcnVuIHRoZSBkZWNvbXByZXNzaW9uIGVuZ2luZSBpdHNlbGYuICBUaGVyZSBpcyBubyBuZWVkIHRvIGFkanVzdCB0aGUgZmx1c2ggcGFyYW1ldGVyLCBzaW5jZQotdGhlIDxlbT56bGliPC9lbT4gZm9ybWF0IGlzIHNlbGYtdGVybWluYXRpbmcuIFRoZSBtYWluIGRpZmZlcmVuY2UgaGVyZSBpcyB0aGF0IHRoZXJlIGFyZQotcmV0dXJuIHZhbHVlcyB0aGF0IHdlIG5lZWQgdG8gcGF5IGF0dGVudGlvbiB0by4gIDx0dD5aX0RBVEFfRVJST1I8L3R0PgotaW5kaWNhdGVzIHRoYXQgPHR0PmluZmxhdGUoKTwvdHQ+IGRldGVjdGVkIGFuIGVycm9yIGluIHRoZSA8ZW0+emxpYjwvZW0+IGNvbXByZXNzZWQgZGF0YSBmb3JtYXQsCi13aGljaCBtZWFucyB0aGF0IGVpdGhlciB0aGUgZGF0YSBpcyBub3QgYSA8ZW0+emxpYjwvZW0+IHN0cmVhbSB0byBiZWdpbiB3aXRoLCBvciB0aGF0IHRoZSBkYXRhIHdhcwotY29ycnVwdGVkIHNvbWV3aGVyZSBhbG9uZyB0aGUgd2F5IHNpbmNlIGl0IHdhcyBjb21wcmVzc2VkLiAgVGhlIG90aGVyIGVycm9yIHRvIGJlIHByb2Nlc3NlZCBpcwotPHR0PlpfTUVNX0VSUk9SPC90dD4sIHdoaWNoIGNhbiBvY2N1ciBzaW5jZSBtZW1vcnkgYWxsb2NhdGlvbiBpcyBkZWZlcnJlZCB1bnRpbCA8dHQ+aW5mbGF0ZSgpPC90dD4KLW5lZWRzIGl0LCB1bmxpa2UgPHR0PmRlZmxhdGUoKTwvdHQ+LCB3aG9zZSBtZW1vcnkgaXMgYWxsb2NhdGVkIGF0IHRoZSBzdGFydCBieSA8dHQ+ZGVmbGF0ZUluaXQoKTwvdHQ+LgotPHA+Ci1BZHZhbmNlZCBhcHBsaWNhdGlvbnMgbWF5IHVzZQotPHR0PmRlZmxhdGVTZXREaWN0aW9uYXJ5KCk8L3R0PiB0byBwcmltZSA8dHQ+ZGVmbGF0ZSgpPC90dD4gd2l0aCBhIHNldCBvZiBsaWtlbHkgZGF0YSB0byBpbXByb3ZlIHRoZQotZmlyc3QgMzJLIG9yIHNvIG9mIGNvbXByZXNzaW9uLiAgVGhpcyBpcyBub3RlZCBpbiB0aGUgPGVtPnpsaWI8L2VtPiBoZWFkZXIsIHNvIDx0dD5pbmZsYXRlKCk8L3R0PgotcmVxdWVzdHMgdGhhdCB0aGF0IGRpY3Rpb25hcnkgYmUgcHJvdmlkZWQgYmVmb3JlIGl0IGNhbiBzdGFydCB0byBkZWNvbXByZXNzLiAgV2l0aG91dCB0aGUgZGljdGlvbmFyeSwKLWNvcnJlY3QgZGVjb21wcmVzc2lvbiBpcyBub3QgcG9zc2libGUuICBGb3IgdGhpcyByb3V0aW5lLCB3ZSBoYXZlIG5vIGlkZWEgd2hhdCB0aGUgZGljdGlvbmFyeSBpcywKLXNvIHRoZSA8dHQ+Wl9ORUVEX0RJQ1Q8L3R0PiBpbmRpY2F0aW9uIGlzIGNvbnZlcnRlZCB0byBhIDx0dD5aX0RBVEFfRVJST1I8L3R0Pi4KLTxwPgotPHR0PmluZmxhdGUoKTwvdHQ+IGNhbiBhbHNvIHJldHVybiA8dHQ+Wl9TVFJFQU1fRVJST1I8L3R0Piwgd2hpY2ggc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSBoZXJlLAotYnV0IGNvdWxkIGJlIGNoZWNrZWQgZm9yIGFzIG5vdGVkIGFib3ZlIGZvciA8dHQ+ZGVmKCk8L3R0Pi4gIDx0dD5aX0JVRl9FUlJPUjwvdHQ+IGRvZXMgbm90IG5lZWQgdG8gYmUKLWNoZWNrZWQgZm9yIGhlcmUsIGZvciB0aGUgc2FtZSByZWFzb25zIG5vdGVkIGZvciA8dHQ+ZGVmKCk8L3R0Pi4gIDx0dD5aX1NUUkVBTV9FTkQ8L3R0PiB3aWxsIGJlCi1jaGVja2VkIGZvciBsYXRlci4KLTxwcmU+PGI+Ci0gICAgICAgICAgICByZXQgPSBpbmZsYXRlKCZhbXA7c3RybSwgWl9OT19GTFVTSCk7Ci0gICAgICAgICAgICBhc3NlcnQocmV0ICE9IFpfU1RSRUFNX0VSUk9SKTsgIC8qIHN0YXRlIG5vdCBjbG9iYmVyZWQgKi8KLSAgICAgICAgICAgIHN3aXRjaCAocmV0KSB7Ci0gICAgICAgICAgICBjYXNlIFpfTkVFRF9ESUNUOgotICAgICAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsgICAgIC8qIGFuZCBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICAgIGNhc2UgWl9EQVRBX0VSUk9SOgotICAgICAgICAgICAgY2FzZSBaX01FTV9FUlJPUjoKLSAgICAgICAgICAgICAgICAodm9pZClpbmZsYXRlRW5kKCZhbXA7c3RybSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLTwvYj48L3ByZT4KLVRoZSBvdXRwdXQgb2YgPHR0PmluZmxhdGUoKTwvdHQ+IGlzIGhhbmRsZWQgaWRlbnRpY2FsbHkgdG8gdGhhdCBvZiA8dHQ+ZGVmbGF0ZSgpPC90dD4uCi08cHJlPjxiPgotICAgICAgICAgICAgaGF2ZSA9IENIVU5LIC0gc3RybS5hdmFpbF9vdXQ7Ci0gICAgICAgICAgICBpZiAoZndyaXRlKG91dCwgMSwgaGF2ZSwgZGVzdCkgIT0gaGF2ZSB8fCBmZXJyb3IoZGVzdCkpIHsKLSAgICAgICAgICAgICAgICAodm9pZClpbmZsYXRlRW5kKCZhbXA7c3RybSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFpfRVJSTk87Ci0gICAgICAgICAgICB9Ci08L2I+PC9wcmU+Ci1UaGUgaW5uZXIgPHR0PmRvPC90dD4tbG9vcCBlbmRzIHdoZW4gPHR0PmluZmxhdGUoKTwvdHQ+IGhhcyBubyBtb3JlIG91dHB1dCBhcyBpbmRpY2F0ZWQKLWJ5IG5vdCBmaWxsaW5nIHRoZSBvdXRwdXQgYnVmZmVyLCBqdXN0IGFzIGZvciA8dHQ+ZGVmbGF0ZSgpPC90dD4uICBJbiB0aGlzIGNhc2UsIHdlIGNhbm5vdAotYXNzZXJ0IHRoYXQgPHR0PnN0cm0uYXZhaWxfaW48L3R0PiB3aWxsIGJlIHplcm8sIHNpbmNlIHRoZSBkZWZsYXRlIHN0cmVhbSBtYXkgZW5kIGJlZm9yZSB0aGUgZmlsZQotZG9lcy4KLTxwcmU+PGI+Ci0gICAgICAgIH0gd2hpbGUgKHN0cm0uYXZhaWxfb3V0ID09IDApOwotPC9iPjwvcHJlPjwhLS0gLS0+Ci1UaGUgb3V0ZXIgPHR0PmRvPC90dD4tbG9vcCBlbmRzIHdoZW4gPHR0PmluZmxhdGUoKTwvdHQ+IHJlcG9ydHMgdGhhdCBpdCBoYXMgcmVhY2hlZCB0aGUKLWVuZCBvZiB0aGUgaW5wdXQgPGVtPnpsaWI8L2VtPiBzdHJlYW0sIGhhcyBjb21wbGV0ZWQgdGhlIGRlY29tcHJlc3Npb24gYW5kIGludGVncml0eQotY2hlY2ssIGFuZCBoYXMgcHJvdmlkZWQgYWxsIG9mIHRoZSBvdXRwdXQuICBUaGlzIGlzIGluZGljYXRlZCBieSB0aGUgPHR0PmluZmxhdGUoKTwvdHQ+Ci1yZXR1cm4gdmFsdWUgPHR0PlpfU1RSRUFNX0VORDwvdHQ+LiAgVGhlIGlubmVyIGxvb3AgaXMgZ3VhcmFudGVlZCB0byBsZWF2ZSA8dHQ+cmV0PC90dD4KLWVxdWFsIHRvIDx0dD5aX1NUUkVBTV9FTkQ8L3R0PiBpZiB0aGUgbGFzdCBjaHVuayBvZiB0aGUgaW5wdXQgZmlsZSByZWFkIGNvbnRhaW5lZCB0aGUgZW5kCi1vZiB0aGUgPGVtPnpsaWI8L2VtPiBzdHJlYW0uICBTbyBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vdCA8dHQ+Wl9TVFJFQU1fRU5EPC90dD4sIHRoZQotbG9vcCBjb250aW51ZXMgdG8gcmVhZCBtb3JlIGlucHV0LgotPHByZT48Yj4KLSAgICAgICAgLyogZG9uZSB3aGVuIGluZmxhdGUoKSBzYXlzIGl0J3MgZG9uZSAqLwotICAgIH0gd2hpbGUgKHJldCAhPSBaX1NUUkVBTV9FTkQpOwotPC9iPjwvcHJlPjwhLS0gLS0+Ci1BdCB0aGlzIHBvaW50LCBkZWNvbXByZXNzaW9uIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQsIG9yIHdlIGJyb2tlIG91dCBvZiB0aGUgbG9vcCBkdWUgdG8gbm8KLW1vcmUgZGF0YSBiZWluZyBhdmFpbGFibGUgZnJvbSB0aGUgaW5wdXQgZmlsZS4gIElmIHRoZSBsYXN0IDx0dD5pbmZsYXRlKCk8L3R0PiByZXR1cm4gdmFsdWUKLWlzIG5vdCA8dHQ+Wl9TVFJFQU1fRU5EPC90dD4sIHRoZW4gdGhlIDxlbT56bGliPC9lbT4gc3RyZWFtIHdhcyBpbmNvbXBsZXRlIGFuZCBhIGRhdGEgZXJyb3IKLWlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCB3ZSByZXR1cm4gd2l0aCBhIGhhcHB5IHJldHVybiB2YWx1ZS4gIE9mIGNvdXJzZSwgPHR0PmluZmxhdGVFbmQoKTwvdHQ+Ci1pcyBjYWxsZWQgZmlyc3QgdG8gYXZvaWQgYSBtZW1vcnkgbGVhay4KLTxwcmU+PGI+Ci0gICAgLyogY2xlYW4gdXAgYW5kIHJldHVybiAqLwotICAgICh2b2lkKWluZmxhdGVFbmQoJmFtcDtzdHJtKTsKLSAgICByZXR1cm4gcmV0ID09IFpfU1RSRUFNX0VORCA/IFpfT0sgOiBaX0RBVEFfRVJST1I7Ci19Ci08L2I+PC9wcmU+PCEtLSAtLT4KLVRoYXQgZW5kcyB0aGUgcm91dGluZXMgdGhhdCBkaXJlY3RseSB1c2UgPGVtPnpsaWI8L2VtPi4gIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgbWFrZSB0aGlzCi1hIGNvbW1hbmQtbGluZSBwcm9ncmFtIGJ5IHJ1bm5pbmcgZGF0YSB0aHJvdWdoIHRoZSBhYm92ZSByb3V0aW5lcyBmcm9tIDx0dD5zdGRpbjwvdHQ+IHRvCi08dHQ+c3Rkb3V0PC90dD4sIGFuZCBoYW5kbGluZyBhbnkgZXJyb3JzIHJlcG9ydGVkIGJ5IDx0dD5kZWYoKTwvdHQ+IG9yIDx0dD5pbmYoKTwvdHQ+LgotPHA+Ci08dHQ+emVycigpPC90dD4gaXMgdXNlZCB0byBpbnRlcnByZXQgdGhlIHBvc3NpYmxlIGVycm9yIGNvZGVzIGZyb20gPHR0PmRlZigpPC90dD4KLWFuZCA8dHQ+aW5mKCk8L3R0PiwgYXMgZGV0YWlsZWQgaW4gdGhlaXIgY29tbWVudHMgYWJvdmUsIGFuZCBwcmludCBvdXQgYW4gZXJyb3IgbWVzc2FnZS4KLU5vdGUgdGhhdCB0aGVzZSBhcmUgb25seSBhIHN1YnNldCBvZiB0aGUgcG9zc2libGUgcmV0dXJuIHZhbHVlcyBmcm9tIDx0dD5kZWZsYXRlKCk8L3R0PgotYW5kIDx0dD5pbmZsYXRlKCk8L3R0Pi4KLTxwcmU+PGI+Ci0vKiByZXBvcnQgYSB6bGliIG9yIGkvbyBlcnJvciAqLwotdm9pZCB6ZXJyKGludCByZXQpCi17Ci0gICAgZnB1dHMoInpwaXBlOiAiLCBzdGRlcnIpOwotICAgIHN3aXRjaCAocmV0KSB7Ci0gICAgY2FzZSBaX0VSUk5POgotICAgICAgICBpZiAoZmVycm9yKHN0ZGluKSkKLSAgICAgICAgICAgIGZwdXRzKCJlcnJvciByZWFkaW5nIHN0ZGluXG4iLCBzdGRlcnIpOwotICAgICAgICBpZiAoZmVycm9yKHN0ZG91dCkpCi0gICAgICAgICAgICBmcHV0cygiZXJyb3Igd3JpdGluZyBzdGRvdXRcbiIsIHN0ZGVycik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgWl9TVFJFQU1fRVJST1I6Ci0gICAgICAgIGZwdXRzKCJpbnZhbGlkIGNvbXByZXNzaW9uIGxldmVsXG4iLCBzdGRlcnIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFpfREFUQV9FUlJPUjoKLSAgICAgICAgZnB1dHMoImludmFsaWQgb3IgaW5jb21wbGV0ZSBkZWZsYXRlIGRhdGFcbiIsIHN0ZGVycik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgWl9NRU1fRVJST1I6Ci0gICAgICAgIGZwdXRzKCJvdXQgb2YgbWVtb3J5XG4iLCBzdGRlcnIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFpfVkVSU0lPTl9FUlJPUjoKLSAgICAgICAgZnB1dHMoInpsaWIgdmVyc2lvbiBtaXNtYXRjaCFcbiIsIHN0ZGVycik7Ci0gICAgfQotfQotPC9iPjwvcHJlPjwhLS0gLS0+Ci1IZXJlIGlzIHRoZSA8dHQ+bWFpbigpPC90dD4gcm91dGluZSB1c2VkIHRvIHRlc3QgPHR0PmRlZigpPC90dD4gYW5kIDx0dD5pbmYoKTwvdHQ+LiAgVGhlCi08dHQ+enBpcGU8L3R0PiBjb21tYW5kIGlzIHNpbXBseSBhIGNvbXByZXNzaW9uIHBpcGUgZnJvbSA8dHQ+c3RkaW48L3R0PiB0byA8dHQ+c3Rkb3V0PC90dD4sIGlmCi1ubyBhcmd1bWVudHMgYXJlIGdpdmVuLCBvciBpdCBpcyBhIGRlY29tcHJlc3Npb24gcGlwZSBpZiA8dHQ+enBpcGUgLWQ8L3R0PiBpcyB1c2VkLiAgSWYgYW55IG90aGVyCi1hcmd1bWVudHMgYXJlIHByb3ZpZGVkLCBubyBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIGlzIHBlcmZvcm1lZC4gIEluc3RlYWQgYSB1c2FnZQotbWVzc2FnZSBpcyBkaXNwbGF5ZWQuICBFeGFtcGxlcyBhcmUgPHR0PnpwaXBlIDwgZm9vLnR4dCA+IGZvby50eHQuejwvdHQ+IHRvIGNvbXByZXNzLCBhbmQKLTx0dD56cGlwZSAtZCA8IGZvby50eHQueiA+IGZvby50eHQ8L3R0PiB0byBkZWNvbXByZXNzLgotPHByZT48Yj4KLS8qIGNvbXByZXNzIG9yIGRlY29tcHJlc3MgZnJvbSBzdGRpbiB0byBzdGRvdXQgKi8KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgcmV0OwotCi0gICAgLyogYXZvaWQgZW5kLW9mLWxpbmUgY29udmVyc2lvbnMgKi8KLSAgICBTRVRfQklOQVJZX01PREUoc3RkaW4pOwotICAgIFNFVF9CSU5BUllfTU9ERShzdGRvdXQpOwotCi0gICAgLyogZG8gY29tcHJlc3Npb24gaWYgbm8gYXJndW1lbnRzICovCi0gICAgaWYgKGFyZ2MgPT0gMSkgewotICAgICAgICByZXQgPSBkZWYoc3RkaW4sIHN0ZG91dCwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKLSAgICAgICAgaWYgKHJldCAhPSBaX09LKQotICAgICAgICAgICAgemVycihyZXQpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIC8qIGRvIGRlY29tcHJlc3Npb24gaWYgLWQgc3BlY2lmaWVkICovCi0gICAgZWxzZSBpZiAoYXJnYyA9PSAyICZhbXA7JmFtcDsgc3RyY21wKGFyZ3ZbMV0sICItZCIpID09IDApIHsKLSAgICAgICAgcmV0ID0gaW5mKHN0ZGluLCBzdGRvdXQpOwotICAgICAgICBpZiAocmV0ICE9IFpfT0spCi0gICAgICAgICAgICB6ZXJyKHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLyogb3RoZXJ3aXNlLCByZXBvcnQgdXNhZ2UgKi8KLSAgICBlbHNlIHsKLSAgICAgICAgZnB1dHMoInpwaXBlIHVzYWdlOiB6cGlwZSBbLWRdICZsdDsgc291cmNlICZndDsgZGVzdFxuIiwgc3RkZXJyKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotfQotPC9iPjwvcHJlPgotPGhyPgotPGk+Q29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IGJ5IE1hcmsgQWRsZXI8YnI+TGFzdCBtb2RpZmllZCAxMSBEZWNlbWJlciAyMDA1PC9pPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvZXhhbXBsZXMvenBpcGUuYyBiL3NyYy96bGliL2V4YW1wbGVzL3pwaXBlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNTM1ZDEuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvZXhhbXBsZXMvenBpcGUuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKiB6cGlwZS5jOiBleGFtcGxlIG9mIHByb3BlciB1c2Ugb2YgemxpYidzIGluZmxhdGUoKSBhbmQgZGVmbGF0ZSgpCi0gICBOb3QgY29weXJpZ2h0ZWQgLS0gcHJvdmlkZWQgdG8gdGhlIHB1YmxpYyBkb21haW4KLSAgIFZlcnNpb24gMS40ICAxMSBEZWNlbWJlciAyMDA1ICBNYXJrIEFkbGVyICovCi0KLS8qIFZlcnNpb24gaGlzdG9yeToKLSAgIDEuMCAgMzAgT2N0IDIwMDQgIEZpcnN0IHZlcnNpb24KLSAgIDEuMSAgIDggTm92IDIwMDQgIEFkZCB2b2lkIGNhc3RpbmcgZm9yIHVudXNlZCByZXR1cm4gdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICBVc2Ugc3dpdGNoIHN0YXRlbWVudCBmb3IgaW5mbGF0ZSgpIHJldHVybiB2YWx1ZXMKLSAgIDEuMiAgIDkgTm92IDIwMDQgIEFkZCBhc3NlcnRpb25zIHRvIGRvY3VtZW50IHpsaWIgZ3VhcmFudGVlcwotICAgMS4zICAgNiBBcHIgMjAwNSAgUmVtb3ZlIGluY29ycmVjdCBhc3NlcnRpb24gaW4gaW5mKCkKLSAgIDEuNCAgMTEgRGVjIDIwMDUgIEFkZCBoYWNrIHRvIGF2b2lkIE1TRE9TIGVuZC1vZi1saW5lIGNvbnZlcnNpb25zCi0gICAgICAgICAgICAgICAgICAgICBBdm9pZCBzb21lIGNvbXBpbGVyIHdhcm5pbmdzIGZvciBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlICJ6bGliLmgiCi0KLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotIyAgaW5jbHVkZSA8ZmNudGwuaD4KLSMgIGluY2x1ZGUgPGlvLmg+Ci0jICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZpbGUpIHNldG1vZGUoZmlsZW5vKGZpbGUpLCBPX0JJTkFSWSkKLSNlbHNlCi0jICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZpbGUpCi0jZW5kaWYKLQotI2RlZmluZSBDSFVOSyAxNjM4NAotCi0vKiBDb21wcmVzcyBmcm9tIGZpbGUgc291cmNlIHRvIGZpbGUgZGVzdCB1bnRpbCBFT0Ygb24gc291cmNlLgotICAgZGVmKCkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIG1lbW9yeSBjb3VsZCBub3QgYmUKLSAgIGFsbG9jYXRlZCBmb3IgcHJvY2Vzc2luZywgWl9TVFJFQU1fRVJST1IgaWYgYW4gaW52YWxpZCBjb21wcmVzc2lvbgotICAgbGV2ZWwgaXMgc3VwcGxpZWQsIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgdmVyc2lvbiBvZiB6bGliLmggYW5kIHRoZQotICAgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBsaW5rZWQgZG8gbm90IG1hdGNoLCBvciBaX0VSUk5PIGlmIHRoZXJlIGlzCi0gICBhbiBlcnJvciByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIGZpbGVzLiAqLwotaW50IGRlZihGSUxFICpzb3VyY2UsIEZJTEUgKmRlc3QsIGludCBsZXZlbCkKLXsKLSAgICBpbnQgcmV0LCBmbHVzaDsKLSAgICB1bnNpZ25lZCBoYXZlOwotICAgIHpfc3RyZWFtIHN0cm07Ci0gICAgdW5zaWduZWQgY2hhciBpbltDSFVOS107Ci0gICAgdW5zaWduZWQgY2hhciBvdXRbQ0hVTktdOwotCi0gICAgLyogYWxsb2NhdGUgZGVmbGF0ZSBzdGF0ZSAqLwotICAgIHN0cm0uemFsbG9jID0gWl9OVUxMOwotICAgIHN0cm0uemZyZWUgPSBaX05VTEw7Ci0gICAgc3RybS5vcGFxdWUgPSBaX05VTEw7Ci0gICAgcmV0ID0gZGVmbGF0ZUluaXQoJnN0cm0sIGxldmVsKTsKLSAgICBpZiAocmV0ICE9IFpfT0spCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAvKiBjb21wcmVzcyB1bnRpbCBlbmQgb2YgZmlsZSAqLwotICAgIGRvIHsKLSAgICAgICAgc3RybS5hdmFpbF9pbiA9IGZyZWFkKGluLCAxLCBDSFVOSywgc291cmNlKTsKLSAgICAgICAgaWYgKGZlcnJvcihzb3VyY2UpKSB7Ci0gICAgICAgICAgICAodm9pZClkZWZsYXRlRW5kKCZzdHJtKTsKLSAgICAgICAgICAgIHJldHVybiBaX0VSUk5POwotICAgICAgICB9Ci0gICAgICAgIGZsdXNoID0gZmVvZihzb3VyY2UpID8gWl9GSU5JU0ggOiBaX05PX0ZMVVNIOwotICAgICAgICBzdHJtLm5leHRfaW4gPSBpbjsKLQotICAgICAgICAvKiBydW4gZGVmbGF0ZSgpIG9uIGlucHV0IHVudGlsIG91dHB1dCBidWZmZXIgbm90IGZ1bGwsIGZpbmlzaAotICAgICAgICAgICBjb21wcmVzc2lvbiBpZiBhbGwgb2Ygc291cmNlIGhhcyBiZWVuIHJlYWQgaW4gKi8KLSAgICAgICAgZG8gewotICAgICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBDSFVOSzsKLSAgICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBvdXQ7Ci0gICAgICAgICAgICByZXQgPSBkZWZsYXRlKCZzdHJtLCBmbHVzaCk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi8KLSAgICAgICAgICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOyAgLyogc3RhdGUgbm90IGNsb2JiZXJlZCAqLwotICAgICAgICAgICAgaGF2ZSA9IENIVU5LIC0gc3RybS5hdmFpbF9vdXQ7Ci0gICAgICAgICAgICBpZiAoZndyaXRlKG91dCwgMSwgaGF2ZSwgZGVzdCkgIT0gaGF2ZSB8fCBmZXJyb3IoZGVzdCkpIHsKLSAgICAgICAgICAgICAgICAodm9pZClkZWZsYXRlRW5kKCZzdHJtKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gWl9FUlJOTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoc3RybS5hdmFpbF9vdXQgPT0gMCk7Ci0gICAgICAgIGFzc2VydChzdHJtLmF2YWlsX2luID09IDApOyAgICAgLyogYWxsIGlucHV0IHdpbGwgYmUgdXNlZCAqLwotCi0gICAgICAgIC8qIGRvbmUgd2hlbiBsYXN0IGRhdGEgaW4gZmlsZSBwcm9jZXNzZWQgKi8KLSAgICB9IHdoaWxlIChmbHVzaCAhPSBaX0ZJTklTSCk7Ci0gICAgYXNzZXJ0KHJldCA9PSBaX1NUUkVBTV9FTkQpOyAgICAgICAgLyogc3RyZWFtIHdpbGwgYmUgY29tcGxldGUgKi8KLQotICAgIC8qIGNsZWFuIHVwIGFuZCByZXR1cm4gKi8KLSAgICAodm9pZClkZWZsYXRlRW5kKCZzdHJtKTsKLSAgICByZXR1cm4gWl9PSzsKLX0KLQotLyogRGVjb21wcmVzcyBmcm9tIGZpbGUgc291cmNlIHRvIGZpbGUgZGVzdCB1bnRpbCBzdHJlYW0gZW5kcyBvciBFT0YuCi0gICBpbmYoKSByZXR1cm5zIFpfT0sgb24gc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgbWVtb3J5IGNvdWxkIG5vdCBiZQotICAgYWxsb2NhdGVkIGZvciBwcm9jZXNzaW5nLCBaX0RBVEFfRVJST1IgaWYgdGhlIGRlZmxhdGUgZGF0YSBpcwotICAgaW52YWxpZCBvciBpbmNvbXBsZXRlLCBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHZlcnNpb24gb2YgemxpYi5oIGFuZAotICAgdGhlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbGlua2VkIGRvIG5vdCBtYXRjaCwgb3IgWl9FUlJOTyBpZiB0aGVyZQotICAgaXMgYW4gZXJyb3IgcmVhZGluZyBvciB3cml0aW5nIHRoZSBmaWxlcy4gKi8KLWludCBpbmYoRklMRSAqc291cmNlLCBGSUxFICpkZXN0KQotewotICAgIGludCByZXQ7Ci0gICAgdW5zaWduZWQgaGF2ZTsKLSAgICB6X3N0cmVhbSBzdHJtOwotICAgIHVuc2lnbmVkIGNoYXIgaW5bQ0hVTktdOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0W0NIVU5LXTsKLQotICAgIC8qIGFsbG9jYXRlIGluZmxhdGUgc3RhdGUgKi8KLSAgICBzdHJtLnphbGxvYyA9IFpfTlVMTDsKLSAgICBzdHJtLnpmcmVlID0gWl9OVUxMOwotICAgIHN0cm0ub3BhcXVlID0gWl9OVUxMOwotICAgIHN0cm0uYXZhaWxfaW4gPSAwOwotICAgIHN0cm0ubmV4dF9pbiA9IFpfTlVMTDsKLSAgICByZXQgPSBpbmZsYXRlSW5pdCgmc3RybSk7Ci0gICAgaWYgKHJldCAhPSBaX09LKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgLyogZGVjb21wcmVzcyB1bnRpbCBkZWZsYXRlIHN0cmVhbSBlbmRzIG9yIGVuZCBvZiBmaWxlICovCi0gICAgZG8gewotICAgICAgICBzdHJtLmF2YWlsX2luID0gZnJlYWQoaW4sIDEsIENIVU5LLCBzb3VyY2UpOwotICAgICAgICBpZiAoZmVycm9yKHNvdXJjZSkpIHsKLSAgICAgICAgICAgICh2b2lkKWluZmxhdGVFbmQoJnN0cm0pOwotICAgICAgICAgICAgcmV0dXJuIFpfRVJSTk87Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0cm0uYXZhaWxfaW4gPT0gMCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBzdHJtLm5leHRfaW4gPSBpbjsKLQotICAgICAgICAvKiBydW4gaW5mbGF0ZSgpIG9uIGlucHV0IHVudGlsIG91dHB1dCBidWZmZXIgbm90IGZ1bGwgKi8KLSAgICAgICAgZG8gewotICAgICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBDSFVOSzsKLSAgICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBvdXQ7Ci0gICAgICAgICAgICByZXQgPSBpbmZsYXRlKCZzdHJtLCBaX05PX0ZMVVNIKTsKLSAgICAgICAgICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOyAgLyogc3RhdGUgbm90IGNsb2JiZXJlZCAqLwotICAgICAgICAgICAgc3dpdGNoIChyZXQpIHsKLSAgICAgICAgICAgIGNhc2UgWl9ORUVEX0RJQ1Q6Ci0gICAgICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOyAgICAgLyogYW5kIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgICAgY2FzZSBaX0RBVEFfRVJST1I6Ci0gICAgICAgICAgICBjYXNlIFpfTUVNX0VSUk9SOgotICAgICAgICAgICAgICAgICh2b2lkKWluZmxhdGVFbmQoJnN0cm0pOwotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYXZlID0gQ0hVTksgLSBzdHJtLmF2YWlsX291dDsKLSAgICAgICAgICAgIGlmIChmd3JpdGUob3V0LCAxLCBoYXZlLCBkZXN0KSAhPSBoYXZlIHx8IGZlcnJvcihkZXN0KSkgewotICAgICAgICAgICAgICAgICh2b2lkKWluZmxhdGVFbmQoJnN0cm0pOwotICAgICAgICAgICAgICAgIHJldHVybiBaX0VSUk5POwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChzdHJtLmF2YWlsX291dCA9PSAwKTsKLQotICAgICAgICAvKiBkb25lIHdoZW4gaW5mbGF0ZSgpIHNheXMgaXQncyBkb25lICovCi0gICAgfSB3aGlsZSAocmV0ICE9IFpfU1RSRUFNX0VORCk7Ci0KLSAgICAvKiBjbGVhbiB1cCBhbmQgcmV0dXJuICovCi0gICAgKHZvaWQpaW5mbGF0ZUVuZCgmc3RybSk7Ci0gICAgcmV0dXJuIHJldCA9PSBaX1NUUkVBTV9FTkQgPyBaX09LIDogWl9EQVRBX0VSUk9SOwotfQotCi0vKiByZXBvcnQgYSB6bGliIG9yIGkvbyBlcnJvciAqLwotdm9pZCB6ZXJyKGludCByZXQpCi17Ci0gICAgZnB1dHMoInpwaXBlOiAiLCBzdGRlcnIpOwotICAgIHN3aXRjaCAocmV0KSB7Ci0gICAgY2FzZSBaX0VSUk5POgotICAgICAgICBpZiAoZmVycm9yKHN0ZGluKSkKLSAgICAgICAgICAgIGZwdXRzKCJlcnJvciByZWFkaW5nIHN0ZGluXG4iLCBzdGRlcnIpOwotICAgICAgICBpZiAoZmVycm9yKHN0ZG91dCkpCi0gICAgICAgICAgICBmcHV0cygiZXJyb3Igd3JpdGluZyBzdGRvdXRcbiIsIHN0ZGVycik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgWl9TVFJFQU1fRVJST1I6Ci0gICAgICAgIGZwdXRzKCJpbnZhbGlkIGNvbXByZXNzaW9uIGxldmVsXG4iLCBzdGRlcnIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFpfREFUQV9FUlJPUjoKLSAgICAgICAgZnB1dHMoImludmFsaWQgb3IgaW5jb21wbGV0ZSBkZWZsYXRlIGRhdGFcbiIsIHN0ZGVycik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgWl9NRU1fRVJST1I6Ci0gICAgICAgIGZwdXRzKCJvdXQgb2YgbWVtb3J5XG4iLCBzdGRlcnIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFpfVkVSU0lPTl9FUlJPUjoKLSAgICAgICAgZnB1dHMoInpsaWIgdmVyc2lvbiBtaXNtYXRjaCFcbiIsIHN0ZGVycik7Ci0gICAgfQotfQotCi0vKiBjb21wcmVzcyBvciBkZWNvbXByZXNzIGZyb20gc3RkaW4gdG8gc3Rkb3V0ICovCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IHJldDsKLQotICAgIC8qIGF2b2lkIGVuZC1vZi1saW5lIGNvbnZlcnNpb25zICovCi0gICAgU0VUX0JJTkFSWV9NT0RFKHN0ZGluKTsKLSAgICBTRVRfQklOQVJZX01PREUoc3Rkb3V0KTsKLQotICAgIC8qIGRvIGNvbXByZXNzaW9uIGlmIG5vIGFyZ3VtZW50cyAqLwotICAgIGlmIChhcmdjID09IDEpIHsKLSAgICAgICAgcmV0ID0gZGVmKHN0ZGluLCBzdGRvdXQsIFpfREVGQVVMVF9DT01QUkVTU0lPTik7Ci0gICAgICAgIGlmIChyZXQgIT0gWl9PSykKLSAgICAgICAgICAgIHplcnIocmV0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvKiBkbyBkZWNvbXByZXNzaW9uIGlmIC1kIHNwZWNpZmllZCAqLwotICAgIGVsc2UgaWYgKGFyZ2MgPT0gMiAmJiBzdHJjbXAoYXJndlsxXSwgIi1kIikgPT0gMCkgewotICAgICAgICByZXQgPSBpbmYoc3RkaW4sIHN0ZG91dCk7Ci0gICAgICAgIGlmIChyZXQgIT0gWl9PSykKLSAgICAgICAgICAgIHplcnIocmV0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvKiBvdGhlcndpc2UsIHJlcG9ydCB1c2FnZSAqLwotICAgIGVsc2UgewotICAgICAgICBmcHV0cygienBpcGUgdXNhZ2U6IHpwaXBlIFstZF0gPCBzb3VyY2UgPiBkZXN0XG4iLCBzdGRlcnIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvemxpYi9leGFtcGxlcy96cmFuLmMgYi9zcmMvemxpYi9leGFtcGxlcy96cmFuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxN2ExMzAuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvZXhhbXBsZXMvenJhbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLS8qIHpyYW4uYyAtLSBleGFtcGxlIG9mIHpsaWIvZ3ppcCBzdHJlYW0gaW5kZXhpbmcgYW5kIHJhbmRvbSBhY2Nlc3MKLSAqIENvcHlyaWdodCAoQykgMjAwNSBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gICBWZXJzaW9uIDEuMCAgMjkgTWF5IDIwMDUgIE1hcmsgQWRsZXIgKi8KLQotLyogSWxsdXN0cmF0ZSB0aGUgdXNlIG9mIFpfQkxPQ0ssIGluZmxhdGVQcmltZSgpLCBhbmQgaW5mbGF0ZVNldERpY3Rpb25hcnkoKQotICAgZm9yIHJhbmRvbSBhY2Nlc3Mgb2YgYSBjb21wcmVzc2VkIGZpbGUuICBBIGZpbGUgY29udGFpbmluZyBhIHpsaWIgb3IgZ3ppcAotICAgc3RyZWFtIGlzIHByb3ZpZGVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBUaGUgY29tcHJlc3NlZCBzdHJlYW0gaXMgZGVjb2RlZCBpbgotICAgaXRzIGVudGlyZXR5LCBhbmQgYW4gaW5kZXggYnVpbHQgd2l0aCBhY2Nlc3MgcG9pbnRzIGFib3V0IGV2ZXJ5IFNQQU4gYnl0ZXMKLSAgIGluIHRoZSB1bmNvbXByZXNzZWQgb3V0cHV0LiAgVGhlIGNvbXByZXNzZWQgZmlsZSBpcyBsZWZ0IG9wZW4sIGFuZCBjYW4gdGhlbgotICAgYmUgcmVhZCByYW5kb21seSwgaGF2aW5nIHRvIGRlY29tcHJlc3Mgb24gdGhlIGF2ZXJhZ2UgU1BBTi8yIHVuY29tcHJlc3NlZAotICAgYnl0ZXMgYmVmb3JlIGdldHRpbmcgdG8gdGhlIGRlc2lyZWQgYmxvY2sgb2YgZGF0YS4KLQotICAgQW4gYWNjZXNzIHBvaW50IGNhbiBiZSBjcmVhdGVkIGF0IHRoZSBzdGFydCBvZiBhbnkgZGVmbGF0ZSBibG9jaywgYnkgc2F2aW5nCi0gICB0aGUgc3RhcnRpbmcgZmlsZSBvZmZzZXQgYW5kIGJpdCBvZiB0aGF0IGJsb2NrLCBhbmQgdGhlIDMySyBieXRlcyBvZgotICAgdW5jb21wcmVzc2VkIGRhdGEgdGhhdCBwcmVjZWRlIHRoYXQgYmxvY2suICBBbHNvIHRoZSB1bmNvbXByZXNzZWQgb2Zmc2V0IG9mCi0gICB0aGF0IGJsb2NrIGlzIHNhdmVkIHRvIHByb3ZpZGUgYSByZWZlcmVjZSBmb3IgbG9jYXRpbmcgYSBkZXNpcmVkIHN0YXJ0aW5nCi0gICBwb2ludCBpbiB0aGUgdW5jb21wcmVzc2VkIHN0cmVhbS4gIGJ1aWxkX2luZGV4KCkgd29ya3MgYnkgZGVjb21wcmVzc2luZyB0aGUKLSAgIGlucHV0IHpsaWIgb3IgZ3ppcCBzdHJlYW0gYSBibG9jayBhdCBhIHRpbWUsIGFuZCBhdCB0aGUgZW5kIG9mIGVhY2ggYmxvY2sKLSAgIGRlY2lkaW5nIGlmIGVub3VnaCB1bmNvbXByZXNzZWQgZGF0YSBoYXMgZ29uZSBieSB0byBqdXN0aWZ5IHRoZSBjcmVhdGlvbiBvZgotICAgYSBuZXcgYWNjZXNzIHBvaW50LiAgSWYgc28sIHRoYXQgcG9pbnQgaXMgc2F2ZWQgaW4gYSBkYXRhIHN0cnVjdHVyZSB0aGF0Ci0gICBncm93cyBhcyBuZWVkZWQgdG8gYWNjb21tb2RhdGUgdGhlIHBvaW50cy4KLQotICAgVG8gdXNlIHRoZSBpbmRleCwgYW4gb2Zmc2V0IGluIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBpcyBwcm92aWRlZCwgZm9yIHdoaWNoCi0gICB0aGUgbGF0ZXN0IGFjY2VlcyBwb2ludCBhdCBvciBwcmVjZWRpbmcgdGhhdCBvZmZzZXQgaXMgbG9jYXRlZCBpbiB0aGUgaW5kZXguCi0gICBUaGUgaW5wdXQgZmlsZSBpcyBwb3NpdGlvbmVkIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhlIGluZGV4LCBhbmQgaWYKLSAgIG5lY2Vzc2FyeSB0aGUgZmlyc3QgZmV3IGJpdHMgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBpcyByZWFkIGZyb20gdGhlIGZpbGUuCi0gICBpbmZsYXRlIGlzIGluaXRpYWxpemVkIHdpdGggdGhvc2UgYml0cyBhbmQgdGhlIDMySyBvZiB1bmNvbXByZXNzZWQgZGF0YSwgYW5kCi0gICB0aGUgZGVjb21wcmVzc2lvbiB0aGVuIHByb2NlZWRzIHVudGlsIHRoZSBkZXNpcmVkIG9mZnNldCBpbiB0aGUgZmlsZSBpcwotICAgcmVhY2hlZC4gIFRoZW4gdGhlIGRlY29tcHJlc3Npb24gY29udGludWVzIHRvIHJlYWQgdGhlIGRlc2lyZWQgdW5jb21wcmVzc2VkCi0gICBkYXRhIGZyb20gdGhlIGZpbGUuCi0KLSAgIEFub3RoZXIgYXBwcm9hY2ggd291bGQgYmUgdG8gZ2VuZXJhdGUgdGhlIGluZGV4IG9uIGRlbWFuZC4gIEluIHRoYXQgY2FzZSwKLSAgIHJlcXVlc3RzIGZvciByYW5kb20gYWNjZXNzIHJlYWRzIGZyb20gdGhlIGNvbXByZXNzZWQgZGF0YSB3b3VsZCB0cnkgdG8gdXNlCi0gICB0aGUgaW5kZXgsIGJ1dCBpZiBhIHJlYWQgZmFyIGVub3VnaCBwYXN0IHRoZSBlbmQgb2YgdGhlIGluZGV4IGlzIHJlcXVpcmVkLAotICAgdGhlbiBmdXJ0aGVyIGluZGV4IGVudHJpZXMgd291bGQgYmUgZ2VuZXJhdGVkIGFuZCBhZGRlZC4KLQotICAgVGhlcmUgaXMgc29tZSBmYWlyIGJpdCBvZiBvdmVyaGVhZCB0byBzdGFydGluZyBpbmZsYXRpb24gZm9yIHRoZSByYW5kb20KLSAgIGFjY2VzcywgbWFpbmx5IGNvcHlpbmcgdGhlIDMySyBieXRlIGRpY3Rpb25hcnkuICBTbyBpZiBzbWFsbCBwaWVjZXMgb2YgdGhlCi0gICBmaWxlIGFyZSBiZWluZyBhY2Nlc3NlZCwgaXQgd291bGQgbWFrZSBzZW5zZSB0byBpbXBsZW1lbnQgYSBjYWNoZSB0byBob2xkCi0gICBzb21lIGxvb2thaGVhZCBhbmQgYXZvaWQgbWFueSBjYWxscyB0byBleHRyYWN0KCkgZm9yIHNtYWxsIGxlbmd0aHMuCi0KLSAgIEFub3RoZXIgd2F5IHRvIGJ1aWxkIGFuIGluZGV4IHdvdWxkIGJlIHRvIHVzZSBpbmZsYXRlQ29weSgpLiAgVGhhdCB3b3VsZAotICAgbm90IGJlIGNvbnN0cmFpbmVkIHRvIGhhdmUgYWNjZXNzIHBvaW50cyBhdCBibG9jayBib3VuZGFyaWVzLCBidXQgcmVxdWlyZXMKLSAgIG1vcmUgbWVtb3J5IHBlciBhY2Nlc3MgcG9pbnQsIGFuZCBhbHNvIGNhbm5vdCBiZSBzYXZlZCB0byBmaWxlIGR1ZSB0byB0aGUKLSAgIHVzZSBvZiBwb2ludGVycyBpbiB0aGUgc3RhdGUuICBUaGUgYXBwcm9hY2ggaGVyZSBhbGxvd3MgZm9yIHN0b3JhZ2Ugb2YgdGhlCi0gICBpbmRleCBpbiBhIGZpbGUuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiemxpYi5oIgotCi0jZGVmaW5lIGxvY2FsIHN0YXRpYwotCi0jZGVmaW5lIFNQQU4gMTA0ODU3NkwgICAgICAgLyogZGVzaXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGFjY2VzcyBwb2ludHMgKi8KLSNkZWZpbmUgV0lOU0laRSAzMjc2OFUgICAgICAvKiBzbGlkaW5nIHdpbmRvdyBzaXplICovCi0jZGVmaW5lIENIVU5LIDE2Mzg0ICAgICAgICAgLyogZmlsZSBpbnB1dCBidWZmZXIgc2l6ZSAqLwotCi0vKiBhY2Nlc3MgcG9pbnQgZW50cnkgKi8KLXN0cnVjdCBwb2ludCB7Ci0gICAgb2ZmX3Qgb3V0OyAgICAgICAgICAvKiBjb3JyZXNwb25kaW5nIG9mZnNldCBpbiB1bmNvbXByZXNzZWQgZGF0YSAqLwotICAgIG9mZl90IGluOyAgICAgICAgICAgLyogb2Zmc2V0IGluIGlucHV0IGZpbGUgb2YgZmlyc3QgZnVsbCBieXRlICovCi0gICAgaW50IGJpdHM7ICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyAoMS03KSBmcm9tIGJ5dGUgYXQgaW4gLSAxLCBvciAwICovCi0gICAgdW5zaWduZWQgY2hhciB3aW5kb3dbV0lOU0laRV07ICAvKiBwcmVjZWRpbmcgMzJLIG9mIHVuY29tcHJlc3NlZCBkYXRhICovCi19OwotCi0vKiBhY2Nlc3MgcG9pbnQgbGlzdCAqLwotc3RydWN0IGFjY2VzcyB7Ci0gICAgaW50IGhhdmU7ICAgICAgICAgICAvKiBudW1iZXIgb2YgbGlzdCBlbnRyaWVzIGZpbGxlZCBpbiAqLwotICAgIGludCBzaXplOyAgICAgICAgICAgLyogbnVtYmVyIG9mIGxpc3QgZW50cmllcyBhbGxvY2F0ZWQgKi8KLSAgICBzdHJ1Y3QgcG9pbnQgKmxpc3Q7IC8qIGFsbG9jYXRlZCBsaXN0ICovCi19OwotCi0vKiBEZWFsbG9jYXRlIGFuIGluZGV4IGJ1aWx0IGJ5IGJ1aWxkX2luZGV4KCkgKi8KLWxvY2FsIHZvaWQgZnJlZV9pbmRleChzdHJ1Y3QgYWNjZXNzICppbmRleCkKLXsKLSAgICBpZiAoaW5kZXggIT0gTlVMTCkgewotICAgICAgICBmcmVlKGluZGV4LT5saXN0KTsKLSAgICAgICAgZnJlZShpbmRleCk7Ci0gICAgfQotfQotCi0vKiBBZGQgYW4gZW50cnkgdG8gdGhlIGFjY2VzcyBwb2ludCBsaXN0LiAgSWYgb3V0IG9mIG1lbW9yeSwgZGVhbGxvY2F0ZSB0aGUKLSAgIGV4aXN0aW5nIGxpc3QgYW5kIHJldHVybiBOVUxMLiAqLwotbG9jYWwgc3RydWN0IGFjY2VzcyAqYWRkcG9pbnQoc3RydWN0IGFjY2VzcyAqaW5kZXgsIGludCBiaXRzLAotICAgIG9mZl90IGluLCBvZmZfdCBvdXQsIHVuc2lnbmVkIGxlZnQsIHVuc2lnbmVkIGNoYXIgKndpbmRvdykKLXsKLSAgICBzdHJ1Y3QgcG9pbnQgKm5leHQ7Ci0KLSAgICAvKiBpZiBsaXN0IGlzIGVtcHR5LCBjcmVhdGUgaXQgKHN0YXJ0IHdpdGggZWlnaHQgcG9pbnRzKSAqLwotICAgIGlmIChpbmRleCA9PSBOVUxMKSB7Ci0gICAgICAgIGluZGV4ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWNjZXNzKSk7Ci0gICAgICAgIGlmIChpbmRleCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgICAgICAgaW5kZXgtPmxpc3QgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwb2ludCkgPDwgMyk7Ci0gICAgICAgIGlmIChpbmRleC0+bGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKGluZGV4KTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGluZGV4LT5zaXplID0gODsKLSAgICAgICAgaW5kZXgtPmhhdmUgPSAwOwotICAgIH0KLQotICAgIC8qIGlmIGxpc3QgaXMgZnVsbCwgbWFrZSBpdCBiaWdnZXIgKi8KLSAgICBlbHNlIGlmIChpbmRleC0+aGF2ZSA9PSBpbmRleC0+c2l6ZSkgewotICAgICAgICBpbmRleC0+c2l6ZSA8PD0gMTsKLSAgICAgICAgbmV4dCA9IHJlYWxsb2MoaW5kZXgtPmxpc3QsIHNpemVvZihzdHJ1Y3QgcG9pbnQpICogaW5kZXgtPnNpemUpOwotICAgICAgICBpZiAobmV4dCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBmcmVlX2luZGV4KGluZGV4KTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGluZGV4LT5saXN0ID0gbmV4dDsKLSAgICB9Ci0KLSAgICAvKiBmaWxsIGluIGVudHJ5IGFuZCBpbmNyZW1lbnQgaG93IG1hbnkgd2UgaGF2ZSAqLwotICAgIG5leHQgPSBpbmRleC0+bGlzdCArIGluZGV4LT5oYXZlOwotICAgIG5leHQtPmJpdHMgPSBiaXRzOwotICAgIG5leHQtPmluID0gaW47Ci0gICAgbmV4dC0+b3V0ID0gb3V0OwotICAgIGlmIChsZWZ0KQotICAgICAgICBtZW1jcHkobmV4dC0+d2luZG93LCB3aW5kb3cgKyBXSU5TSVpFIC0gbGVmdCwgbGVmdCk7Ci0gICAgaWYgKGxlZnQgPCBXSU5TSVpFKQotICAgICAgICBtZW1jcHkobmV4dC0+d2luZG93ICsgbGVmdCwgd2luZG93LCBXSU5TSVpFIC0gbGVmdCk7Ci0gICAgaW5kZXgtPmhhdmUrKzsKLQotICAgIC8qIHJldHVybiBsaXN0LCBwb3NzaWJseSByZWFsbG9jYXRlZCAqLwotICAgIHJldHVybiBpbmRleDsKLX0KLQotLyogTWFrZSBvbmUgZW50aXJlIHBhc3MgdGhyb3VnaCB0aGUgY29tcHJlc3NlZCBzdHJlYW0gYW5kIGJ1aWxkIGFuIGluZGV4LCB3aXRoCi0gICBhY2Nlc3MgcG9pbnRzIGFib3V0IGV2ZXJ5IHNwYW4gYnl0ZXMgb2YgdW5jb21wcmVzc2VkIG91dHB1dCAtLSBzcGFuIGlzCi0gICBjaG9zZW4gdG8gYmFsYW5jZSB0aGUgc3BlZWQgb2YgcmFuZG9tIGFjY2VzcyBhZ2FpbnN0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzCi0gICBvZiB0aGUgbGlzdCwgYWJvdXQgMzJLIGJ5dGVzIHBlciBhY2Nlc3MgcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBhZnRlciB0aGUgZW5kCi0gICBvZiB0aGUgZmlyc3QgemxpYiBvciBnemlwIHN0cmVhbSBpbiB0aGUgZmlsZSBpcyBpZ25vcmVkLiAgYnVpbGRfaW5kZXgoKQotICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGFjY2VzcyBwb2ludHMgb24gc3VjY2VzcyAoPj0gMSksIFpfTUVNX0VSUk9SIGZvciBvdXQKLSAgIG9mIG1lbW9yeSwgWl9EQVRBX0VSUk9SIGZvciBhbiBlcnJvciBpbiB0aGUgaW5wdXQgZmlsZSwgb3IgWl9FUlJOTyBmb3IgYQotICAgZmlsZSByZWFkIGVycm9yLiAgT24gc3VjY2VzcywgKmJ1aWx0IHBvaW50cyB0byB0aGUgcmVzdWx0aW5nIGluZGV4LiAqLwotbG9jYWwgaW50IGJ1aWxkX2luZGV4KEZJTEUgKmluLCBvZmZfdCBzcGFuLCBzdHJ1Y3QgYWNjZXNzICoqYnVpbHQpCi17Ci0gICAgaW50IHJldDsKLSAgICBvZmZfdCB0b3RpbiwgdG90b3V0OyAgICAgICAgLyogb3VyIG93biB0b3RhbCBjb3VudGVycyB0byBhdm9pZCA0R0IgbGltaXQgKi8KLSAgICBvZmZfdCBsYXN0OyAgICAgICAgICAgICAgICAgLyogdG90b3V0IHZhbHVlIG9mIGxhc3QgYWNjZXNzIHBvaW50ICovCi0gICAgc3RydWN0IGFjY2VzcyAqaW5kZXg7ICAgICAgIC8qIGFjY2VzcyBwb2ludHMgYmVpbmcgZ2VuZXJhdGVkICovCi0gICAgel9zdHJlYW0gc3RybTsKLSAgICB1bnNpZ25lZCBjaGFyIGlucHV0W0NIVU5LXTsKLSAgICB1bnNpZ25lZCBjaGFyIHdpbmRvd1tXSU5TSVpFXTsKLQotICAgIC8qIGluaXRpYWxpemUgaW5mbGF0ZSAqLwotICAgIHN0cm0uemFsbG9jID0gWl9OVUxMOwotICAgIHN0cm0uemZyZWUgPSBaX05VTEw7Ci0gICAgc3RybS5vcGFxdWUgPSBaX05VTEw7Ci0gICAgc3RybS5hdmFpbF9pbiA9IDA7Ci0gICAgc3RybS5uZXh0X2luID0gWl9OVUxMOwotICAgIHJldCA9IGluZmxhdGVJbml0Migmc3RybSwgNDcpOyAgICAgIC8qIGF1dG9tYXRpYyB6bGliIG9yIGd6aXAgZGVjb2RpbmcgKi8KLSAgICBpZiAocmV0ICE9IFpfT0spCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAvKiBpbmZsYXRlIHRoZSBpbnB1dCwgbWFpbnRhaW4gYSBzbGlkaW5nIHdpbmRvdywgYW5kIGJ1aWxkIGFuIGluZGV4IC0tIHRoaXMKLSAgICAgICBhbHNvIHZhbGlkYXRlcyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgdXNpbmcgdGhlIGNoZWNrCi0gICAgICAgaW5mb3JtYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgZ3ppcCBvciB6bGliIHN0cmVhbSAqLwotICAgIHRvdGluID0gdG90b3V0ID0gbGFzdCA9IDA7Ci0gICAgaW5kZXggPSBOVUxMOyAgICAgICAgICAgICAgIC8qIHdpbGwgYmUgYWxsb2NhdGVkIGJ5IGZpcnN0IGFkZHBvaW50KCkgKi8KLSAgICBzdHJtLmF2YWlsX291dCA9IDA7Ci0gICAgZG8gewotICAgICAgICAvKiBnZXQgc29tZSBjb21wcmVzc2VkIGRhdGEgZnJvbSBpbnB1dCBmaWxlICovCi0gICAgICAgIHN0cm0uYXZhaWxfaW4gPSBmcmVhZChpbnB1dCwgMSwgQ0hVTkssIGluKTsKLSAgICAgICAgaWYgKGZlcnJvcihpbikpIHsKLSAgICAgICAgICAgIHJldCA9IFpfRVJSTk87Ci0gICAgICAgICAgICBnb3RvIGJ1aWxkX2luZGV4X2Vycm9yOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJtLmF2YWlsX2luID09IDApIHsKLSAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgICAgIGdvdG8gYnVpbGRfaW5kZXhfZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgc3RybS5uZXh0X2luID0gaW5wdXQ7Ci0KLSAgICAgICAgLyogcHJvY2VzcyBhbGwgb2YgdGhhdCwgb3IgdW50aWwgZW5kIG9mIHN0cmVhbSAqLwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICAvKiByZXNldCBzbGlkaW5nIHdpbmRvdyBpZiBuZWNlc3NhcnkgKi8KLSAgICAgICAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBXSU5TSVpFOwotICAgICAgICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSB3aW5kb3c7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGluZmxhdGUgdW50aWwgb3V0IG9mIGlucHV0LCBvdXRwdXQsIG9yIGF0IGVuZCBvZiBibG9jayAtLQotICAgICAgICAgICAgICAgdXBkYXRlIHRoZSB0b3RhbCBpbnB1dCBhbmQgb3V0cHV0IGNvdW50ZXJzICovCi0gICAgICAgICAgICB0b3RpbiArPSBzdHJtLmF2YWlsX2luOwotICAgICAgICAgICAgdG90b3V0ICs9IHN0cm0uYXZhaWxfb3V0OwotICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZSgmc3RybSwgWl9CTE9DSyk7ICAgICAgLyogcmV0dXJuIGF0IGVuZCBvZiBibG9jayAqLwotICAgICAgICAgICAgdG90aW4gLT0gc3RybS5hdmFpbF9pbjsKLSAgICAgICAgICAgIHRvdG91dCAtPSBzdHJtLmF2YWlsX291dDsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gWl9ORUVEX0RJQ1QpCi0gICAgICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOwotICAgICAgICAgICAgaWYgKHJldCA9PSBaX01FTV9FUlJPUiB8fCByZXQgPT0gWl9EQVRBX0VSUk9SKQotICAgICAgICAgICAgICAgIGdvdG8gYnVpbGRfaW5kZXhfZXJyb3I7Ci0gICAgICAgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogaWYgYXQgZW5kIG9mIGJsb2NrLCBjb25zaWRlciBhZGRpbmcgYW4gaW5kZXggZW50cnkgKG5vdGUgdGhhdCBpZgotICAgICAgICAgICAgICAgZGF0YV90eXBlIGluZGljYXRlcyBhbiBlbmQtb2YtYmxvY2ssIHRoZW4gYWxsIG9mIHRoZQotICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGRhdGEgZnJvbSB0aGF0IGJsb2NrIGhhcyBiZWVuIGRlbGl2ZXJlZCwgYW5kIG5vbmUKLSAgICAgICAgICAgICAgIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgYWZ0ZXIgdGhhdCBibG9jayBoYXMgYmVlbiBjb25zdW1lZCwKLSAgICAgICAgICAgICAgIGV4Y2VwdCBmb3IgdXAgdG8gc2V2ZW4gYml0cykgLS0gdGhlIHRvdG91dCA9PSAwIHByb3ZpZGVzIGFuCi0gICAgICAgICAgICAgICBlbnRyeSBwb2ludCBhZnRlciB0aGUgemxpYiBvciBnemlwIGhlYWRlciwgYW5kIGFzc3VyZXMgdGhhdCB0aGUKLSAgICAgICAgICAgICAgIGluZGV4IGFsd2F5cyBoYXMgYXQgbGVhc3Qgb25lIGFjY2VzcyBwb2ludDsgd2UgYXZvaWQgY3JlYXRpbmcgYW4KLSAgICAgICAgICAgICAgIGFjY2VzcyBwb2ludCBhZnRlciB0aGUgbGFzdCBibG9jayBieSBjaGVja2luZyBiaXQgNiBvZiBkYXRhX3R5cGUKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKChzdHJtLmRhdGFfdHlwZSAmIDEyOCkgJiYgIShzdHJtLmRhdGFfdHlwZSAmIDY0KSAmJgotICAgICAgICAgICAgICAgICh0b3RvdXQgPT0gMCB8fCB0b3RvdXQgLSBsYXN0ID4gc3BhbikpIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGFkZHBvaW50KGluZGV4LCBzdHJtLmRhdGFfdHlwZSAmIDcsIHRvdGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90b3V0LCBzdHJtLmF2YWlsX291dCwgd2luZG93KTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBaX01FTV9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgZ290byBidWlsZF9pbmRleF9lcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGFzdCA9IHRvdG91dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoc3RybS5hdmFpbF9pbiAhPSAwKTsKLSAgICB9IHdoaWxlIChyZXQgIT0gWl9TVFJFQU1fRU5EKTsKLQotICAgIC8qIGNsZWFuIHVwIGFuZCByZXR1cm4gaW5kZXggKHJlbGVhc2UgdW51c2VkIGVudHJpZXMgaW4gbGlzdCkgKi8KLSAgICAodm9pZClpbmZsYXRlRW5kKCZzdHJtKTsKLSAgICBpbmRleCA9IHJlYWxsb2MoaW5kZXgsIHNpemVvZihzdHJ1Y3QgcG9pbnQpICogaW5kZXgtPmhhdmUpOwotICAgIGluZGV4LT5zaXplID0gaW5kZXgtPmhhdmU7Ci0gICAgKmJ1aWx0ID0gaW5kZXg7Ci0gICAgcmV0dXJuIGluZGV4LT5zaXplOwotCi0gICAgLyogcmV0dXJuIGVycm9yICovCi0gIGJ1aWxkX2luZGV4X2Vycm9yOgotICAgICh2b2lkKWluZmxhdGVFbmQoJnN0cm0pOwotICAgIGlmIChpbmRleCAhPSBOVUxMKQotICAgICAgICBmcmVlX2luZGV4KGluZGV4KTsKLSAgICByZXR1cm4gcmV0OwotfQotCi0vKiBVc2UgdGhlIGluZGV4IHRvIHJlYWQgbGVuIGJ5dGVzIGZyb20gb2Zmc2V0IGludG8gYnVmLCByZXR1cm4gYnl0ZXMgcmVhZCBvcgotICAgbmVnYXRpdmUgZm9yIGVycm9yIChaX0RBVEFfRVJST1Igb3IgWl9NRU1fRVJST1IpLiAgSWYgZGF0YSBpcyByZXF1ZXN0ZWQgcGFzdAotICAgdGhlIGVuZCBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEsIHRoZW4gZXh0cmFjdCgpIHdpbGwgcmV0dXJuIGEgdmFsdWUgbGVzcwotICAgdGhhbiBsZW4sIGluZGljYXRpbmcgaG93IG11Y2ggYXMgYWN0dWFsbHkgcmVhZCBpbnRvIGJ1Zi4gIFRoaXMgZnVuY3Rpb24KLSAgIHNob3VsZCBub3QgcmV0dXJuIGEgZGF0YSBlcnJvciB1bmxlc3MgdGhlIGZpbGUgd2FzIG1vZGlmaWVkIHNpbmNlIHRoZSBpbmRleAotICAgd2FzIGdlbmVyYXRlZC4gIGV4dHJhY3QoKSBtYXkgYWxzbyByZXR1cm4gWl9FUlJOTyBpZiB0aGVyZSBpcyBhbiBlcnJvciBvbgotICAgcmVhZGluZyBvciBzZWVraW5nIHRoZSBpbnB1dCBmaWxlLiAqLwotbG9jYWwgaW50IGV4dHJhY3QoRklMRSAqaW4sIHN0cnVjdCBhY2Nlc3MgKmluZGV4LCBvZmZfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCi17Ci0gICAgaW50IHJldCwgc2tpcDsKLSAgICB6X3N0cmVhbSBzdHJtOwotICAgIHN0cnVjdCBwb2ludCAqaGVyZTsKLSAgICB1bnNpZ25lZCBjaGFyIGlucHV0W0NIVU5LXTsKLSAgICB1bnNpZ25lZCBjaGFyIGRpc2NhcmRbV0lOU0laRV07Ci0KLSAgICAvKiBwcm9jZWVkIG9ubHkgaWYgc29tZXRoaW5nIHJlYXNvbmFibGUgdG8gZG8gKi8KLSAgICBpZiAobGVuIDwgMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBmaW5kIHdoZXJlIGluIHN0cmVhbSB0byBzdGFydCAqLwotICAgIGhlcmUgPSBpbmRleC0+bGlzdDsKLSAgICByZXQgPSBpbmRleC0+aGF2ZTsKLSAgICB3aGlsZSAoLS1yZXQgJiYgaGVyZVsxXS5vdXQgPD0gb2Zmc2V0KQotICAgICAgICBoZXJlKys7Ci0KLSAgICAvKiBpbml0aWFsaXplIGZpbGUgYW5kIGluZmxhdGUgc3RhdGUgdG8gc3RhcnQgdGhlcmUgKi8KLSAgICBzdHJtLnphbGxvYyA9IFpfTlVMTDsKLSAgICBzdHJtLnpmcmVlID0gWl9OVUxMOwotICAgIHN0cm0ub3BhcXVlID0gWl9OVUxMOwotICAgIHN0cm0uYXZhaWxfaW4gPSAwOwotICAgIHN0cm0ubmV4dF9pbiA9IFpfTlVMTDsKLSAgICByZXQgPSBpbmZsYXRlSW5pdDIoJnN0cm0sIC0xNSk7ICAgICAgICAgLyogcmF3IGluZmxhdGUgKi8KLSAgICBpZiAocmV0ICE9IFpfT0spCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgcmV0ID0gZnNlZWtvKGluLCBoZXJlLT5pbiAtIChoZXJlLT5iaXRzID8gMSA6IDApLCBTRUVLX1NFVCk7Ci0gICAgaWYgKHJldCA9PSAtMSkKLSAgICAgICAgZ290byBleHRyYWN0X3JldDsKLSAgICBpZiAoaGVyZS0+Yml0cykgewotICAgICAgICByZXQgPSBnZXRjKGluKTsKLSAgICAgICAgaWYgKHJldCA9PSAtMSkgewotICAgICAgICAgICAgcmV0ID0gZmVycm9yKGluKSA/IFpfRVJSTk8gOiBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgICBnb3RvIGV4dHJhY3RfcmV0OwotICAgICAgICB9Ci0gICAgICAgICh2b2lkKWluZmxhdGVQcmltZSgmc3RybSwgaGVyZS0+Yml0cywgcmV0ID4+ICg4IC0gaGVyZS0+Yml0cykpOwotICAgIH0KLSAgICAodm9pZClpbmZsYXRlU2V0RGljdGlvbmFyeSgmc3RybSwgaGVyZS0+d2luZG93LCBXSU5TSVpFKTsKLQotICAgIC8qIHNraXAgdW5jb21wcmVzc2VkIGJ5dGVzIHVudGlsIG9mZnNldCByZWFjaGVkLCB0aGVuIHNhdGlzZnkgcmVxdWVzdCAqLwotICAgIG9mZnNldCAtPSBoZXJlLT5vdXQ7Ci0gICAgc3RybS5hdmFpbF9pbiA9IDA7Ci0gICAgc2tpcCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlIHNraXBwaW5nIHRvIG9mZnNldCAqLwotICAgIGRvIHsKLSAgICAgICAgLyogZGVmaW5lIHdoZXJlIHRvIHB1dCB1bmNvbXByZXNzZWQgZGF0YSwgYW5kIGhvdyBtdWNoICovCi0gICAgICAgIGlmIChvZmZzZXQgPT0gMCAmJiBza2lwKSB7ICAgICAgICAgIC8qIGF0IG9mZnNldCBub3cgKi8KLSAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVuOwotICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IGJ1ZjsKLSAgICAgICAgICAgIHNraXAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogb25seSBkbyB0aGlzIG9uY2UgKi8KLSAgICAgICAgfQotICAgICAgICBpZiAob2Zmc2V0ID4gV0lOU0laRSkgeyAgICAgICAgICAgICAvKiBza2lwIFdJTlNJWkUgYnl0ZXMgKi8KLSAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gV0lOU0laRTsKLSAgICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBkaXNjYXJkOwotICAgICAgICAgICAgb2Zmc2V0IC09IFdJTlNJWkU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAob2Zmc2V0ICE9IDApIHsgICAgICAgICAgICAgLyogbGFzdCBza2lwICovCi0gICAgICAgICAgICBzdHJtLmF2YWlsX291dCA9ICh1bnNpZ25lZClvZmZzZXQ7Ci0gICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gZGlzY2FyZDsKLSAgICAgICAgICAgIG9mZnNldCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB1bmNvbXByZXNzIHVudGlsIGF2YWlsX291dCBmaWxsZWQsIG9yIGVuZCBvZiBzdHJlYW0gKi8KLSAgICAgICAgZG8gewotICAgICAgICAgICAgaWYgKHN0cm0uYXZhaWxfaW4gPT0gMCkgewotICAgICAgICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBmcmVhZChpbnB1dCwgMSwgQ0hVTkssIGluKTsKLSAgICAgICAgICAgICAgICBpZiAoZmVycm9yKGluKSkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBaX0VSUk5POwotICAgICAgICAgICAgICAgICAgICBnb3RvIGV4dHJhY3RfcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3RybS5hdmFpbF9pbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgZ290byBleHRyYWN0X3JldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RybS5uZXh0X2luID0gaW5wdXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXQgPSBpbmZsYXRlKCZzdHJtLCBaX05PX0ZMVVNIKTsgICAgICAgLyogbm9ybWFsIGluZmxhdGUgKi8KLSAgICAgICAgICAgIGlmIChyZXQgPT0gWl9ORUVEX0RJQ1QpCi0gICAgICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOwotICAgICAgICAgICAgaWYgKHJldCA9PSBaX01FTV9FUlJPUiB8fCByZXQgPT0gWl9EQVRBX0VSUk9SKQotICAgICAgICAgICAgICAgIGdvdG8gZXh0cmFjdF9yZXQ7Ci0gICAgICAgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSB3aGlsZSAoc3RybS5hdmFpbF9vdXQgIT0gMCk7Ci0KLSAgICAgICAgLyogaWYgcmVhY2ggZW5kIG9mIHN0cmVhbSwgdGhlbiBkb24ndCBrZWVwIHRyeWluZyB0byBnZXQgbW9yZSAqLwotICAgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIGRvIHVudGlsIG9mZnNldCByZWFjaGVkIGFuZCByZXF1ZXN0ZWQgZGF0YSByZWFkLCBvciBzdHJlYW0gZW5kcyAqLwotICAgIH0gd2hpbGUgKHNraXApOwotCi0gICAgLyogY29tcHV0ZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIHJlYWQgYWZ0ZXIgb2Zmc2V0ICovCi0gICAgcmV0ID0gc2tpcCA/IDAgOiBsZW4gLSBzdHJtLmF2YWlsX291dDsKLQotICAgIC8qIGNsZWFuIHVwIGFuZCByZXR1cm4gYnl0ZXMgcmVhZCBvciBlcnJvciAqLwotICBleHRyYWN0X3JldDoKLSAgICAodm9pZClpbmZsYXRlRW5kKCZzdHJtKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi0vKiBEZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIGJ1aWxkX2luZGV4KCkgYW5kIGV4dHJhY3QoKSBieSBwcm9jZXNzaW5nIHRoZSBmaWxlCi0gICBwcm92aWRlZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgdGhlIGV4dHJhY3RpbmcgMTZLIGZyb20gYWJvdXQgMi8zcmRzIG9mCi0gICB0aGUgd2F5IHRocm91Z2ggdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQsIGFuZCB3cml0aW5nIHRoYXQgdG8gc3Rkb3V0LiAqLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGludCBsZW47Ci0gICAgb2ZmX3Qgb2Zmc2V0OwotICAgIEZJTEUgKmluOwotICAgIHN0cnVjdCBhY2Nlc3MgKmluZGV4ID0gTlVMTDsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZltDSFVOS107Ci0KLSAgICAvKiBvcGVuIGlucHV0IGZpbGUgKi8KLSAgICBpZiAoYXJnYyAhPSAyKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6IHpyYW4gZmlsZS5nelxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpbiA9IGZvcGVuKGFyZ3ZbMV0sICJyYiIpOwotICAgIGlmIChpbiA9PSBOVUxMKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAienJhbjogY291bGQgbm90IG9wZW4gJXMgZm9yIHJlYWRpbmdcbiIsIGFyZ3ZbMV0pOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBidWlsZCBpbmRleCAqLwotICAgIGxlbiA9IGJ1aWxkX2luZGV4KGluLCBTUEFOLCAmaW5kZXgpOwotICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgIGZjbG9zZShpbik7Ci0gICAgICAgIHN3aXRjaCAobGVuKSB7Ci0gICAgICAgIGNhc2UgWl9NRU1fRVJST1I6Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInpyYW46IG91dCBvZiBtZW1vcnlcbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgWl9EQVRBX0VSUk9SOgotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ6cmFuOiBjb21wcmVzc2VkIGRhdGEgZXJyb3IgaW4gJXNcbiIsIGFyZ3ZbMV0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgWl9FUlJOTzoKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAienJhbjogcmVhZCBlcnJvciBvbiAlc1xuIiwgYXJndlsxXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAienJhbjogZXJyb3IgJWQgd2hpbGUgYnVpbGRpbmcgaW5kZXhcbiIsIGxlbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGZwcmludGYoc3RkZXJyLCAienJhbjogYnVpbHQgaW5kZXggd2l0aCAlZCBhY2Nlc3MgcG9pbnRzXG4iLCBsZW4pOwotCi0gICAgLyogdXNlIGluZGV4IGJ5IHJlYWRpbmcgc29tZSBieXRlcyBmcm9tIGFuIGFyYml0cmFyeSBvZmZzZXQgKi8KLSAgICBvZmZzZXQgPSAoaW5kZXgtPmxpc3RbaW5kZXgtPmhhdmUgLSAxXS5vdXQgPDwgMSkgLyAzOwotICAgIGxlbiA9IGV4dHJhY3QoaW4sIGluZGV4LCBvZmZzZXQsIGJ1ZiwgQ0hVTkspOwotICAgIGlmIChsZW4gPCAwKQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInpyYW46IGV4dHJhY3Rpb24gZmFpbGVkOiAlcyBlcnJvclxuIiwKLSAgICAgICAgICAgICAgICBsZW4gPT0gWl9NRU1fRVJST1IgPyAib3V0IG9mIG1lbW9yeSIgOiAiaW5wdXQgY29ycnVwdGVkIik7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZ3cml0ZShidWYsIDEsIGxlbiwgc3Rkb3V0KTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJ6cmFuOiBleHRyYWN0ZWQgJWQgYnl0ZXMgYXQgJWxsdVxuIiwgbGVuLCBvZmZzZXQpOwotICAgIH0KLQotICAgIC8qIGNsZWFuIHVwIGFuZCBleGl0ICovCi0gICAgZnJlZV9pbmRleChpbmRleCk7Ci0gICAgZmNsb3NlKGluKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NyYy96bGliL2d6Y2xvc2UuYyBiL3NyYy96bGliL2d6Y2xvc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FlYjk5YS4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9nemNsb3NlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKiBnemNsb3NlLmMgLS0gemxpYiBnemNsb3NlKCkgZnVuY3Rpb24KLSAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAxMCBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotI2luY2x1ZGUgImd6Z3V0cy5oIgotCi0vKiBnemNsb3NlKCkgaXMgaW4gYSBzZXBhcmF0ZSBmaWxlIHNvIHRoYXQgaXQgaXMgbGlua2VkIGluIG9ubHkgaWYgaXQgaXMgdXNlZC4KLSAgIFRoYXQgd2F5IHRoZSBvdGhlciBnemNsb3NlIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbnN0ZWFkIHRvIGF2b2lkIGxpbmtpbmcgaW4KLSAgIHVubmVlZGVkIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gcm91dGluZXMuICovCi1pbnQgWkVYUE9SVCBnemNsb3NlKGZpbGUpCi0gICAgZ3pGaWxlIGZpbGU7Ci17Ci0jaWZuZGVmIE5PX0daQ09NUFJFU1MKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci0KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0KLSAgICByZXR1cm4gc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCA/IGd6Y2xvc2VfcihmaWxlKSA6IGd6Y2xvc2VfdyhmaWxlKTsKLSNlbHNlCi0gICAgcmV0dXJuIGd6Y2xvc2VfcihmaWxlKTsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvZ3pndXRzLmggYi9zcmMvemxpYi9nemd1dHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzZjI4MS4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9nemd1dHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKiBnemd1dHMuaCAtLSB6bGliIGludGVybmFsIGhlYWRlciBkZWZpbml0aW9ucyBmb3IgZ3oqIG9wZXJhdGlvbnMKLSAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAxMCwgMjAxMSwgMjAxMiBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotI2lmZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKLSMgIGlmbmRlZiBfTEFSR0VGSUxFX1NPVVJDRQotIyAgICBkZWZpbmUgX0xBUkdFRklMRV9TT1VSQ0UgMQotIyAgZW5kaWYKLSMgIGlmZGVmIF9GSUxFX09GRlNFVF9CSVRTCi0jICAgIHVuZGVmIF9GSUxFX09GRlNFVF9CSVRTCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0hJRERFTgotIyAgZGVmaW5lIFpMSUJfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSAoImhpZGRlbiIpKSkKLSNlbHNlCi0jICBkZWZpbmUgWkxJQl9JTlRFUk5BTAotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInpsaWIuaCIKLSNpZmRlZiBTVERDCi0jICBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyAgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxmY250bC5oPgotCi0jaWZkZWYgX1dJTjMyCi0jICBpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX1RVUkJPQ19fKSB8fCBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9XSU4zMikKLSMgIGluY2x1ZGUgPGlvLmg+Ci0jZW5kaWYKLQotI2lmZGVmIE5PX0RFRkxBVEUgICAgICAgLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgZGVmaW5pdGlvbiAqLwotIyAgZGVmaW5lIE5PX0daQ09NUFJFU1MKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChTVERDOTkpIHx8IChkZWZpbmVkKF9fVFVSQk9DX18pICYmIF9fVFVSQk9DX18gPj0gMHg1NTApCi0jICBpZm5kZWYgSEFWRV9WU05QUklOVEYKLSMgICAgZGVmaW5lIEhBVkVfVlNOUFJJTlRGCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jICBpZm5kZWYgSEFWRV9WU05QUklOVEYKLSMgICAgZGVmaW5lIEhBVkVfVlNOUFJJTlRGCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKE1TRE9TKSAmJiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgKEJPUkxBTkRDID4gMHg0MTApCi0jICBpZm5kZWYgSEFWRV9WU05QUklOVEYKLSMgICAgZGVmaW5lIEhBVkVfVlNOUFJJTlRGCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9WU05QUklOVEYKLSMgIGlmZGVmIE1TRE9TCi0vKiB2c25wcmludGYgbWF5IGV4aXN0IG9uIHNvbWUgTVMtRE9TIGNvbXBpbGVycyAoREpHUFA/KSwKLSBidXQgZm9yIG5vdyB3ZSBqdXN0IGFzc3VtZSBpdCBkb2Vzbid0LiAqLwotIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCi0jICBlbmRpZgotIyAgaWZkZWYgX19UVVJCT0NfXwotIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCi0jICBlbmRpZgotIyAgaWZkZWYgV0lOMzIKLS8qIEluIFdpbjMyLCB2c25wcmludGYgaXMgYXZhaWxhYmxlIGFzIHRoZSAibm9uLUFOU0kiIF92c25wcmludGYuICovCi0jICAgIGlmICFkZWZpbmVkKHZzbnByaW50ZikgJiYgIWRlZmluZWQoTk9fdnNucHJpbnRmKQotIyAgICAgIGlmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCAoIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTUwMCApCi0jICAgICAgICAgZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCi0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jICBpZmRlZiBfX1NBU0MKLSMgICAgZGVmaW5lIE5PX3ZzbnByaW50ZgotIyAgZW5kaWYKLSMgIGlmZGVmIFZNUwotIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCi0jICBlbmRpZgotIyAgaWZkZWYgX19PUzQwMF9fCi0jICAgIGRlZmluZSBOT192c25wcmludGYKLSMgIGVuZGlmCi0jICBpZmRlZiBfX01WU19fCi0jICAgIGRlZmluZSBOT192c25wcmludGYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBsb2NhbAotIyAgZGVmaW5lIGxvY2FsIHN0YXRpYwotI2VuZGlmCi0vKiBjb21waWxlIHdpdGggLURsb2NhbCBpZiB5b3VyIGRlYnVnZ2VyIGNhbid0IGZpbmQgc3RhdGljIHN5bWJvbHMgKi8KLQotLyogZ3oqIGZ1bmN0aW9ucyBhbHdheXMgdXNlIGxpYnJhcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMgKi8KLSNpZm5kZWYgU1REQwotICBleHRlcm4gdm9pZHAgIG1hbGxvYyBPRigodUludCBzaXplKSk7Ci0gIGV4dGVybiB2b2lkICAgZnJlZSAgIE9GKCh2b2lkcGYgcHRyKSk7Ci0jZW5kaWYKLQotLyogZ2V0IGVycm5vIGFuZCBzdHJlcnJvciBkZWZpbml0aW9uICovCi0jaWYgZGVmaW5lZCBVTkRFUl9DRQotIyAgaW5jbHVkZSA8d2luZG93cy5oPgotIyAgZGVmaW5lIHpzdHJlcnJvcigpIGd6X3N0cndpbmVycm9yKChEV09SRClHZXRMYXN0RXJyb3IoKSkKLSNlbHNlCi0jICBpZm5kZWYgTk9fU1RSRVJST1IKLSMgICAgaW5jbHVkZSA8ZXJybm8uaD4KLSMgICAgZGVmaW5lIHpzdHJlcnJvcigpIHN0cmVycm9yKGVycm5vKQotIyAgZWxzZQotIyAgICBkZWZpbmUgenN0cmVycm9yKCkgInN0ZGlvIGVycm9yIChjb25zdWx0IGVycm5vKSIKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogcHJvdmlkZSBwcm90b3R5cGVzIGZvciB0aGVzZSB3aGVuIGJ1aWxkaW5nIHpsaWIgd2l0aG91dCBMRlMgKi8KLSNpZiAhZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSB8fCBfTEZTNjRfTEFSR0VGSUxFLTAgPT0gMAotICAgIFpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuNjQgT0YoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0gICAgWkVYVEVSTiB6X29mZjY0X3QgWkVYUE9SVCBnenNlZWs2NCBPRigoZ3pGaWxlLCB6X29mZjY0X3QsIGludCkpOwotICAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3p0ZWxsNjQgT0YoKGd6RmlsZSkpOwotICAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3pvZmZzZXQ2NCBPRigoZ3pGaWxlKSk7Ci0jZW5kaWYKLQotLyogZGVmYXVsdCBtZW1MZXZlbCAqLwotI2lmIE1BWF9NRU1fTEVWRUwgPj0gOAotIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgOAotI2Vsc2UKLSMgIGRlZmluZSBERUZfTUVNX0xFVkVMICBNQVhfTUVNX0xFVkVMCi0jZW5kaWYKLQotLyogZGVmYXVsdCBpL28gYnVmZmVyIHNpemUgLS0gZG91YmxlIHRoaXMgZm9yIG91dHB1dCB3aGVuIHJlYWRpbmcgKi8KLSNkZWZpbmUgR1pCVUZTSVpFIDgxOTIKLQotLyogZ3ppcCBtb2RlcywgYWxzbyBwcm92aWRlIGEgbGl0dGxlIGludGVncml0eSBjaGVjayBvbiB0aGUgcGFzc2VkIHN0cnVjdHVyZSAqLwotI2RlZmluZSBHWl9OT05FIDAKLSNkZWZpbmUgR1pfUkVBRCA3MjQ3Ci0jZGVmaW5lIEdaX1dSSVRFIDMxMTUzCi0jZGVmaW5lIEdaX0FQUEVORCAxICAgICAvKiBtb2RlIHNldCB0byBHWl9XUklURSBhZnRlciB0aGUgZmlsZSBpcyBvcGVuZWQgKi8KLQotLyogdmFsdWVzIGZvciBnel9zdGF0ZSBob3cgKi8KLSNkZWZpbmUgTE9PSyAwICAgICAgLyogbG9vayBmb3IgYSBnemlwIGhlYWRlciAqLwotI2RlZmluZSBDT1BZIDEgICAgICAvKiBjb3B5IGlucHV0IGRpcmVjdGx5ICovCi0jZGVmaW5lIEdaSVAgMiAgICAgIC8qIGRlY29tcHJlc3MgYSBnemlwIHN0cmVhbSAqLwotCi0vKiBpbnRlcm5hbCBnemlwIGZpbGUgc3RhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgLyogZXhwb3NlZCBjb250ZW50cyBmb3IgZ3pnZXRjKCkgbWFjcm8gKi8KLSAgICBzdHJ1Y3QgZ3pGaWxlX3MgeDsgICAgICAvKiAieCIgZm9yIGV4cG9zZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB4LmhhdmU6IG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgeC5uZXh0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogeC5uZXh0OiBuZXh0IG91dHB1dCBkYXRhIHRvIGRlbGl2ZXIgb3Igd3JpdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB4LnBvczogY3VycmVudCBwb3NpdGlvbiBpbiB1bmNvbXByZXNzZWQgZGF0YSAqLwotICAgICAgICAvKiB1c2VkIGZvciBib3RoIHJlYWRpbmcgYW5kIHdyaXRpbmcgKi8KLSAgICBpbnQgbW9kZTsgICAgICAgICAgICAgICAvKiBzZWUgZ3ppcCBtb2RlcyBhYm92ZSAqLwotICAgIGludCBmZDsgICAgICAgICAgICAgICAgIC8qIGZpbGUgZGVzY3JpcHRvciAqLwotICAgIGNoYXIgKnBhdGg7ICAgICAgICAgICAgIC8qIHBhdGggb3IgZmQgZm9yIGVycm9yIG1lc3NhZ2VzICovCi0gICAgdW5zaWduZWQgc2l6ZTsgICAgICAgICAgLyogYnVmZmVyIHNpemUsIHplcm8gaWYgbm90IGFsbG9jYXRlZCB5ZXQgKi8KLSAgICB1bnNpZ25lZCB3YW50OyAgICAgICAgICAvKiByZXF1ZXN0ZWQgYnVmZmVyIHNpemUsIGRlZmF1bHQgaXMgR1pCVUZTSVpFICovCi0gICAgdW5zaWduZWQgY2hhciAqaW47ICAgICAgLyogaW5wdXQgYnVmZmVyICovCi0gICAgdW5zaWduZWQgY2hhciAqb3V0OyAgICAgLyogb3V0cHV0IGJ1ZmZlciAoZG91YmxlLXNpemVkIHdoZW4gcmVhZGluZykgKi8KLSAgICBpbnQgZGlyZWN0OyAgICAgICAgICAgICAvKiAwIGlmIHByb2Nlc3NpbmcgZ3ppcCwgMSBpZiB0cmFuc3BhcmVudCAqLwotICAgICAgICAvKiBqdXN0IGZvciByZWFkaW5nICovCi0gICAgaW50IGhvdzsgICAgICAgICAgICAgICAgLyogMDogZ2V0IGhlYWRlciwgMTogY29weSwgMjogZGVjb21wcmVzcyAqLwotICAgIHpfb2ZmNjRfdCBzdGFydDsgICAgICAgIC8qIHdoZXJlIHRoZSBnemlwIGRhdGEgc3RhcnRlZCwgZm9yIHJld2luZGluZyAqLwotICAgIGludCBlb2Y7ICAgICAgICAgICAgICAgIC8qIHRydWUgaWYgZW5kIG9mIGlucHV0IGZpbGUgcmVhY2hlZCAqLwotICAgIGludCBwYXN0OyAgICAgICAgICAgICAgIC8qIHRydWUgaWYgcmVhZCByZXF1ZXN0ZWQgcGFzdCBlbmQgKi8KLSAgICAgICAgLyoganVzdCBmb3Igd3JpdGluZyAqLwotICAgIGludCBsZXZlbDsgICAgICAgICAgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICovCi0gICAgaW50IHN0cmF0ZWd5OyAgICAgICAgICAgLyogY29tcHJlc3Npb24gc3RyYXRlZ3kgKi8KLSAgICAgICAgLyogc2VlayByZXF1ZXN0ICovCi0gICAgel9vZmY2NF90IHNraXA7ICAgICAgICAgLyogYW1vdW50IHRvIHNraXAgKGFscmVhZHkgcmV3b3VuZCBpZiBiYWNrd2FyZHMpICovCi0gICAgaW50IHNlZWs7ICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBzZWVrIHJlcXVlc3QgcGVuZGluZyAqLwotICAgICAgICAvKiBlcnJvciBpbmZvcm1hdGlvbiAqLwotICAgIGludCBlcnI7ICAgICAgICAgICAgICAgIC8qIGVycm9yIGNvZGUgKi8KLSAgICBjaGFyICptc2c7ICAgICAgICAgICAgICAvKiBlcnJvciBtZXNzYWdlICovCi0gICAgICAgIC8qIHpsaWIgaW5mbGF0ZSBvciBkZWZsYXRlIHN0cmVhbSAqLwotICAgIHpfc3RyZWFtIHN0cm07ICAgICAgICAgIC8qIHN0cmVhbSBzdHJ1Y3R1cmUgaW4tcGxhY2UgKG5vdCBhIHBvaW50ZXIpICovCi19IGd6X3N0YXRlOwotdHlwZWRlZiBnel9zdGF0ZSBGQVIgKmd6X3N0YXRlcDsKLQotLyogc2hhcmVkIGZ1bmN0aW9ucyAqLwotdm9pZCBaTElCX0lOVEVSTkFMIGd6X2Vycm9yIE9GKChnel9zdGF0ZXAsIGludCwgY29uc3QgY2hhciAqKSk7Ci0jaWYgZGVmaW5lZCBVTkRFUl9DRQotY2hhciBaTElCX0lOVEVSTkFMICpnel9zdHJ3aW5lcnJvciBPRigoRFdPUkQgZXJyb3IpKTsKLSNlbmRpZgotCi0vKiBHVF9PRkYoeCksIHdoZXJlIHggaXMgYW4gdW5zaWduZWQgdmFsdWUsIGlzIHRydWUgaWYgeCA+IG1heGltdW0gel9vZmY2NF90Ci0gICB2YWx1ZSAtLSBuZWVkZWQgd2hlbiBjb21wYXJpbmcgdW5zaWduZWQgdG8gel9vZmY2NF90LCB3aGljaCBpcyBzaWduZWQKLSAgIChwb3NzaWJsZSB6X29mZjY0X3QgdHlwZXMgb2ZmX3QsIG9mZjY0X3QsIGFuZCBsb25nIGFyZSBhbGwgc2lnbmVkKSAqLwotI2lmZGVmIElOVF9NQVgKLSMgIGRlZmluZSBHVF9PRkYoeCkgKHNpemVvZihpbnQpID09IHNpemVvZih6X29mZjY0X3QpICYmICh4KSA+IElOVF9NQVgpCi0jZWxzZQotdW5zaWduZWQgWkxJQl9JTlRFUk5BTCBnel9pbnRtYXggT0YoKHZvaWQpKTsKLSMgIGRlZmluZSBHVF9PRkYoeCkgKHNpemVvZihpbnQpID09IHNpemVvZih6X29mZjY0X3QpICYmICh4KSA+IGd6X2ludG1heCgpKQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvemxpYi9nemxpYi5jIGIvc3JjL3psaWIvZ3psaWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E1NWM2ZS4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9nemxpYi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjIwICswLDAgQEAKLS8qIGd6bGliLmMgLS0gemxpYiBmdW5jdGlvbnMgY29tbW9uIHRvIHJlYWRpbmcgYW5kIHdyaXRpbmcgZ3ppcCBmaWxlcwotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDEwLCAyMDExLCAyMDEyIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0jaW5jbHVkZSAiZ3pndXRzLmgiCi0KLSNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQotIyAgZGVmaW5lIExTRUVLIF9sc2Vla2k2NAotI2Vsc2UKLSNpZiBkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpICYmIF9MRlM2NF9MQVJHRUZJTEUtMAotIyAgZGVmaW5lIExTRUVLIGxzZWVrNjQKLSNlbHNlCi0jICBkZWZpbmUgTFNFRUsgbHNlZWsKLSNlbmRpZgotI2VuZGlmCi0KLS8qIExvY2FsIGZ1bmN0aW9ucyAqLwotbG9jYWwgdm9pZCBnel9yZXNldCBPRigoZ3pfc3RhdGVwKSk7Ci1sb2NhbCBnekZpbGUgZ3pfb3BlbiBPRigoY29uc3Qgdm9pZCAqLCBpbnQsIGNvbnN0IGNoYXIgKikpOwotCi0jaWYgZGVmaW5lZCBVTkRFUl9DRQotCi0vKiBNYXAgdGhlIFdpbmRvd3MgZXJyb3IgbnVtYmVyIGluIEVSUk9SIHRvIGEgbG9jYWxlLWRlcGVuZGVudCBlcnJvciBtZXNzYWdlCi0gICBzdHJpbmcgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuICBUeXBpY2FsbHksIHRoZSB2YWx1ZXMgZm9yIEVSUk9SIGNvbWUKLSAgIGZyb20gR2V0TGFzdEVycm9yLgotCi0gICBUaGUgc3RyaW5nIHBvaW50ZWQgdG8gc2hhbGwgbm90IGJlIG1vZGlmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgYnV0IG1heSBiZQotICAgb3ZlcndyaXR0ZW4gYnkgYSBzdWJzZXF1ZW50IGNhbGwgdG8gZ3pfc3Ryd2luZXJyb3IKLQotICAgVGhlIGd6X3N0cndpbmVycm9yIGZ1bmN0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgY3VycmVudCBzZXR0aW5nIG9mCi0gICBHZXRMYXN0RXJyb3IuICovCi1jaGFyIFpMSUJfSU5URVJOQUwgKmd6X3N0cndpbmVycm9yIChlcnJvcikKLSAgICAgRFdPUkQgZXJyb3I7Ci17Ci0gICAgc3RhdGljIGNoYXIgYnVmWzEwMjRdOwotCi0gICAgd2NoYXJfdCAqbXNnYnVmOwotICAgIERXT1JEIGxhc3RlcnIgPSBHZXRMYXN0RXJyb3IoKTsKLSAgICBEV09SRCBjaGFycyA9IEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0KLSAgICAgICAgfCBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIsCi0gICAgICAgIE5VTEwsCi0gICAgICAgIGVycm9yLAotICAgICAgICAwLCAvKiBEZWZhdWx0IGxhbmd1YWdlICovCi0gICAgICAgIChMUFZPSUQpJm1zZ2J1ZiwKLSAgICAgICAgMCwKLSAgICAgICAgTlVMTCk7Ci0gICAgaWYgKGNoYXJzICE9IDApIHsKLSAgICAgICAgLyogSWYgdGhlcmUgaXMgYW4gXHJcbiBhcHBlbmRlZCwgemFwIGl0LiAgKi8KLSAgICAgICAgaWYgKGNoYXJzID49IDIKLSAgICAgICAgICAgICYmIG1zZ2J1ZltjaGFycyAtIDJdID09ICdccicgJiYgbXNnYnVmW2NoYXJzIC0gMV0gPT0gJ1xuJykgewotICAgICAgICAgICAgY2hhcnMgLT0gMjsKLSAgICAgICAgICAgIG1zZ2J1ZltjaGFyc10gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNoYXJzID4gc2l6ZW9mIChidWYpIC0gMSkgewotICAgICAgICAgICAgY2hhcnMgPSBzaXplb2YgKGJ1ZikgLSAxOwotICAgICAgICAgICAgbXNnYnVmW2NoYXJzXSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICB3Y3N0b21icyhidWYsIG1zZ2J1ZiwgY2hhcnMgKyAxKTsKLSAgICAgICAgTG9jYWxGcmVlKG1zZ2J1Zik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBzcHJpbnRmKGJ1ZiwgInVua25vd24gd2luMzIgZXJyb3IgKCVsZCkiLCBlcnJvcik7Ci0gICAgfQotCi0gICAgU2V0TGFzdEVycm9yKGxhc3RlcnIpOwotICAgIHJldHVybiBidWY7Ci19Ci0KLSNlbmRpZiAvKiBVTkRFUl9DRSAqLwotCi0vKiBSZXNldCBnemlwIGZpbGUgc3RhdGUgKi8KLWxvY2FsIHZvaWQgZ3pfcmVzZXQoc3RhdGUpCi0gICAgZ3pfc3RhdGVwIHN0YXRlOwotewotICAgIHN0YXRlLT54LmhhdmUgPSAwOyAgICAgICAgICAgICAgLyogbm8gb3V0cHV0IGRhdGEgYXZhaWxhYmxlICovCi0gICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX1JFQUQpIHsgICAvKiBmb3IgcmVhZGluZyAuLi4gKi8KLSAgICAgICAgc3RhdGUtPmVvZiA9IDA7ICAgICAgICAgICAgIC8qIG5vdCBhdCBlbmQgb2YgZmlsZSAqLwotICAgICAgICBzdGF0ZS0+cGFzdCA9IDA7ICAgICAgICAgICAgLyogaGF2ZSBub3QgcmVhZCBwYXN0IGVuZCB5ZXQgKi8KLSAgICAgICAgc3RhdGUtPmhvdyA9IExPT0s7ICAgICAgICAgIC8qIGxvb2sgZm9yIGd6aXAgaGVhZGVyICovCi0gICAgfQotICAgIHN0YXRlLT5zZWVrID0gMDsgICAgICAgICAgICAgICAgLyogbm8gc2VlayByZXF1ZXN0IHBlbmRpbmcgKi8KLSAgICBnel9lcnJvcihzdGF0ZSwgWl9PSywgTlVMTCk7ICAgIC8qIGNsZWFyIGVycm9yICovCi0gICAgc3RhdGUtPngucG9zID0gMDsgICAgICAgICAgICAgICAvKiBubyB1bmNvbXByZXNzZWQgZGF0YSB5ZXQgKi8KLSAgICBzdGF0ZS0+c3RybS5hdmFpbF9pbiA9IDA7ICAgICAgIC8qIG5vIGlucHV0IGRhdGEgeWV0ICovCi19Ci0KLS8qIE9wZW4gYSBnemlwIGZpbGUgZWl0aGVyIGJ5IG5hbWUgb3IgZmlsZSBkZXNjcmlwdG9yLiAqLwotbG9jYWwgZ3pGaWxlIGd6X29wZW4ocGF0aCwgZmQsIG1vZGUpCi0gICAgY29uc3Qgdm9pZCAqcGF0aDsKLSAgICBpbnQgZmQ7Ci0gICAgY29uc3QgY2hhciAqbW9kZTsKLXsKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci0gICAgc2l6ZV90IGxlbjsKLSAgICBpbnQgb2ZsYWc7Ci0jaWZkZWYgT19DTE9FWEVDCi0gICAgaW50IGNsb2V4ZWMgPSAwOwotI2VuZGlmCi0jaWZkZWYgT19FWENMCi0gICAgaW50IGV4Y2x1c2l2ZSA9IDA7Ci0jZW5kaWYKLQotICAgIC8qIGNoZWNrIGlucHV0ICovCi0gICAgaWYgKHBhdGggPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBhbGxvY2F0ZSBnekZpbGUgc3RydWN0dXJlIHRvIHJldHVybiAqLwotICAgIHN0YXRlID0gbWFsbG9jKHNpemVvZihnel9zdGF0ZSkpOwotICAgIGlmIChzdGF0ZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBzdGF0ZS0+c2l6ZSA9IDA7ICAgICAgICAgICAgLyogbm8gYnVmZmVycyBhbGxvY2F0ZWQgeWV0ICovCi0gICAgc3RhdGUtPndhbnQgPSBHWkJVRlNJWkU7ICAgIC8qIHJlcXVlc3RlZCBidWZmZXIgc2l6ZSAqLwotICAgIHN0YXRlLT5tc2cgPSBOVUxMOyAgICAgICAgICAvKiBubyBlcnJvciBtZXNzYWdlIHlldCAqLwotCi0gICAgLyogaW50ZXJwcmV0IG1vZGUgKi8KLSAgICBzdGF0ZS0+bW9kZSA9IEdaX05PTkU7Ci0gICAgc3RhdGUtPmxldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OOwotICAgIHN0YXRlLT5zdHJhdGVneSA9IFpfREVGQVVMVF9TVFJBVEVHWTsKLSAgICBzdGF0ZS0+ZGlyZWN0ID0gMDsKLSAgICB3aGlsZSAoKm1vZGUpIHsKLSAgICAgICAgaWYgKCptb2RlID49ICcwJyAmJiAqbW9kZSA8PSAnOScpCi0gICAgICAgICAgICBzdGF0ZS0+bGV2ZWwgPSAqbW9kZSAtICcwJzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3dpdGNoICgqbW9kZSkgewotICAgICAgICAgICAgY2FzZSAncic6Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBHWl9SRUFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmbmRlZiBOT19HWkNPTVBSRVNTCi0gICAgICAgICAgICBjYXNlICd3JzoKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEdaX1dSSVRFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnYSc6Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBHWl9BUFBFTkQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgICAgIGNhc2UgJysnOiAgICAgICAvKiBjYW4ndCByZWFkIGFuZCB3cml0ZSBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAgICAgZnJlZShzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICBjYXNlICdiJzogICAgICAgLyogaWdub3JlIC0tIHdpbGwgcmVxdWVzdCBiaW5hcnkgYW55d2F5ICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgT19DTE9FWEVDCi0gICAgICAgICAgICBjYXNlICdlJzoKLSAgICAgICAgICAgICAgICBjbG9leGVjID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIE9fRVhDTAotICAgICAgICAgICAgY2FzZSAneCc6Ci0gICAgICAgICAgICAgICAgZXhjbHVzaXZlID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICAgICAgY2FzZSAnZic6Ci0gICAgICAgICAgICAgICAgc3RhdGUtPnN0cmF0ZWd5ID0gWl9GSUxURVJFRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgICAgICAgIHN0YXRlLT5zdHJhdGVneSA9IFpfSFVGRk1BTl9PTkxZOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnUic6Ci0gICAgICAgICAgICAgICAgc3RhdGUtPnN0cmF0ZWd5ID0gWl9STEU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdGJzoKLSAgICAgICAgICAgICAgICBzdGF0ZS0+c3RyYXRlZ3kgPSBaX0ZJWEVEOwotICAgICAgICAgICAgY2FzZSAnVCc6Ci0gICAgICAgICAgICAgICAgc3RhdGUtPmRpcmVjdCA9IDE7Ci0gICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgLyogY291bGQgY29uc2lkZXIgYXMgYW4gZXJyb3IsIGJ1dCBqdXN0IGlnbm9yZSAqLwotICAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgbW9kZSsrOwotICAgIH0KLQotICAgIC8qIG11c3QgcHJvdmlkZSBhbiAiciIsICJ3Iiwgb3IgImEiICovCi0gICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX05PTkUpIHsKLSAgICAgICAgZnJlZShzdGF0ZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIGNhbid0IGZvcmNlIHRyYW5zcGFyZW50IHJlYWQgKi8KLSAgICBpZiAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCkgewotICAgICAgICBpZiAoc3RhdGUtPmRpcmVjdCkgewotICAgICAgICAgICAgZnJlZShzdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBzdGF0ZS0+ZGlyZWN0ID0gMTsgICAgICAvKiBmb3IgZW1wdHkgZmlsZSAqLwotICAgIH0KLQotICAgIC8qIHNhdmUgdGhlIHBhdGggbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KLSNpZmRlZiBfV0lOMzIKLSAgICBpZiAoZmQgPT0gLTIpIHsKLSAgICAgICAgbGVuID0gd2NzdG9tYnMoTlVMTCwgcGF0aCwgMCk7Ci0gICAgICAgIGlmIChsZW4gPT0gKHNpemVfdCktMSkKLSAgICAgICAgICAgIGxlbiA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZgotICAgICAgICBsZW4gPSBzdHJsZW4ocGF0aCk7Ci0gICAgc3RhdGUtPnBhdGggPSBtYWxsb2MobGVuICsgMSk7Ci0gICAgaWYgKHN0YXRlLT5wYXRoID09IE5VTEwpIHsKLSAgICAgICAgZnJlZShzdGF0ZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSNpZmRlZiBfV0lOMzIKLSAgICBpZiAoZmQgPT0gLTIpCi0gICAgICAgIGlmIChsZW4pCi0gICAgICAgICAgICB3Y3N0b21icyhzdGF0ZS0+cGF0aCwgcGF0aCwgbGVuICsgMSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICooc3RhdGUtPnBhdGgpID0gMDsKLSAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgc3RyY3B5KHN0YXRlLT5wYXRoLCBwYXRoKTsKLQotICAgIC8qIGNvbXB1dGUgdGhlIGZsYWdzIGZvciBvcGVuKCkgKi8KLSAgICBvZmxhZyA9Ci0jaWZkZWYgT19MQVJHRUZJTEUKLSAgICAgICAgT19MQVJHRUZJTEUgfAotI2VuZGlmCi0jaWZkZWYgT19CSU5BUlkKLSAgICAgICAgT19CSU5BUlkgfAotI2VuZGlmCi0jaWZkZWYgT19DTE9FWEVDCi0gICAgICAgIChjbG9leGVjID8gT19DTE9FWEVDIDogMCkgfAotI2VuZGlmCi0gICAgICAgIChzdGF0ZS0+bW9kZSA9PSBHWl9SRUFEID8KLSAgICAgICAgIE9fUkRPTkxZIDoKLSAgICAgICAgIChPX1dST05MWSB8IE9fQ1JFQVQgfAotI2lmZGVmIE9fRVhDTAotICAgICAgICAgIChleGNsdXNpdmUgPyBPX0VYQ0wgOiAwKSB8Ci0jZW5kaWYKLSAgICAgICAgICAoc3RhdGUtPm1vZGUgPT0gR1pfV1JJVEUgPwotICAgICAgICAgICBPX1RSVU5DIDoKLSAgICAgICAgICAgT19BUFBFTkQpKSk7Ci0KLSAgICAvKiBvcGVuIHRoZSBmaWxlIHdpdGggdGhlIGFwcHJvcHJpYXRlIGZsYWdzIChvciBqdXN0IHVzZSBmZCkgKi8KLSAgICBzdGF0ZS0+ZmQgPSBmZCA+IC0xID8gZmQgOiAoCi0jaWZkZWYgX1dJTjMyCi0gICAgICAgIGZkID09IC0yID8gX3dvcGVuKHBhdGgsIG9mbGFnLCAwNjY2KSA6Ci0jZW5kaWYKLSAgICAgICAgb3BlbihwYXRoLCBvZmxhZywgMDY2NikpOwotICAgIGlmIChzdGF0ZS0+ZmQgPT0gLTEpIHsKLSAgICAgICAgZnJlZShzdGF0ZS0+cGF0aCk7Ci0gICAgICAgIGZyZWUoc3RhdGUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX0FQUEVORCkKLSAgICAgICAgc3RhdGUtPm1vZGUgPSBHWl9XUklURTsgICAgICAgICAvKiBzaW1wbGlmeSBsYXRlciBjaGVja3MgKi8KLQotICAgIC8qIHNhdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gZm9yIHJld2luZGluZyAob25seSBpZiByZWFkaW5nKSAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBHWl9SRUFEKSB7Ci0gICAgICAgIHN0YXRlLT5zdGFydCA9IExTRUVLKHN0YXRlLT5mZCwgMCwgU0VFS19DVVIpOwotICAgICAgICBpZiAoc3RhdGUtPnN0YXJ0ID09IC0xKSBzdGF0ZS0+c3RhcnQgPSAwOwotICAgIH0KLQotICAgIC8qIGluaXRpYWxpemUgc3RyZWFtICovCi0gICAgZ3pfcmVzZXQoc3RhdGUpOwotCi0gICAgLyogcmV0dXJuIHN0cmVhbSAqLwotICAgIHJldHVybiAoZ3pGaWxlKXN0YXRlOwotfQotCi0vKiAtLSBzZWUgemxpYi5oIC0tICovCi1nekZpbGUgWkVYUE9SVCBnem9wZW4ocGF0aCwgbW9kZSkKLSAgICBjb25zdCBjaGFyICpwYXRoOwotICAgIGNvbnN0IGNoYXIgKm1vZGU7Ci17Ci0gICAgcmV0dXJuIGd6X29wZW4ocGF0aCwgLTEsIG1vZGUpOwotfQotCi0vKiAtLSBzZWUgemxpYi5oIC0tICovCi1nekZpbGUgWkVYUE9SVCBnem9wZW42NChwYXRoLCBtb2RlKQotICAgIGNvbnN0IGNoYXIgKnBhdGg7Ci0gICAgY29uc3QgY2hhciAqbW9kZTsKLXsKLSAgICByZXR1cm4gZ3pfb3BlbihwYXRoLCAtMSwgbW9kZSk7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWd6RmlsZSBaRVhQT1JUIGd6ZG9wZW4oZmQsIG1vZGUpCi0gICAgaW50IGZkOwotICAgIGNvbnN0IGNoYXIgKm1vZGU7Ci17Ci0gICAgY2hhciAqcGF0aDsgICAgICAgICAvKiBpZGVudGlmaWVyIGZvciBlcnJvciBtZXNzYWdlcyAqLwotICAgIGd6RmlsZSBnejsKLQotICAgIGlmIChmZCA9PSAtMSB8fCAocGF0aCA9IG1hbGxvYyg3ICsgMyAqIHNpemVvZihpbnQpKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc3ByaW50ZihwYXRoLCAiPGZkOiVkPiIsIGZkKTsgICAvKiBmb3IgZGVidWdnaW5nICovCi0gICAgZ3ogPSBnel9vcGVuKHBhdGgsIGZkLCBtb2RlKTsKLSAgICBmcmVlKHBhdGgpOwotICAgIHJldHVybiBnejsKLX0KLQotLyogLS0gc2VlIHpsaWIuaCAtLSAqLwotI2lmZGVmIF9XSU4zMgotZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuX3cocGF0aCwgbW9kZSkKLSAgICBjb25zdCB3Y2hhcl90ICpwYXRoOwotICAgIGNvbnN0IGNoYXIgKm1vZGU7Ci17Ci0gICAgcmV0dXJuIGd6X29wZW4ocGF0aCwgLTIsIG1vZGUpOwotfQotI2VuZGlmCi0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWludCBaRVhQT1JUIGd6YnVmZmVyKGZpbGUsIHNpemUpCi0gICAgZ3pGaWxlIGZpbGU7Ci0gICAgdW5zaWduZWQgc2l6ZTsKLXsKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci0KLSAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlIGFuZCBjaGVjayBpbnRlZ3JpdHkgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0gICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IGFscmVhZHkgYWxsb2NhdGVkIG1lbW9yeSAqLwotICAgIGlmIChzdGF0ZS0+c2l6ZSAhPSAwKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBjaGVjayBhbmQgc2V0IHJlcXVlc3RlZCBzaXplICovCi0gICAgaWYgKHNpemUgPCAyKQotICAgICAgICBzaXplID0gMjsgICAgICAgICAgICAgICAvKiBuZWVkIHR3byBieXRlcyB0byBjaGVjayBtYWdpYyBoZWFkZXIgKi8KLSAgICBzdGF0ZS0+d2FudCA9IHNpemU7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWludCBaRVhQT1JUIGd6cmV3aW5kKGZpbGUpCi0gICAgZ3pGaWxlIGZpbGU7Ci17Ci0gICAgZ3pfc3RhdGVwIHN0YXRlOwotCi0gICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLwotICAgIGlmIChmaWxlID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKLQotICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgcmVhZGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIGVycm9yICovCi0gICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgfHwKLSAgICAgICAgICAgIChzdGF0ZS0+ZXJyICE9IFpfT0sgJiYgc3RhdGUtPmVyciAhPSBaX0JVRl9FUlJPUikpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIGJhY2sgdXAgYW5kIHN0YXJ0IG92ZXIgKi8KLSAgICBpZiAoTFNFRUsoc3RhdGUtPmZkLCBzdGF0ZS0+c3RhcnQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGd6X3Jlc2V0KHN0YXRlKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyogLS0gc2VlIHpsaWIuaCAtLSAqLwotel9vZmY2NF90IFpFWFBPUlQgZ3pzZWVrNjQoZmlsZSwgb2Zmc2V0LCB3aGVuY2UpCi0gICAgZ3pGaWxlIGZpbGU7Ci0gICAgel9vZmY2NF90IG9mZnNldDsKLSAgICBpbnQgd2hlbmNlOwotewotICAgIHVuc2lnbmVkIG47Ci0gICAgel9vZmY2NF90IHJldDsKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci0KLSAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlIGFuZCBjaGVjayBpbnRlZ3JpdHkgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0gICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIGNoZWNrIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLwotICAgIGlmIChzdGF0ZS0+ZXJyICE9IFpfT0sgJiYgc3RhdGUtPmVyciAhPSBaX0JVRl9FUlJPUikKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgLyogY2FuIG9ubHkgc2VlayBmcm9tIHN0YXJ0IG9yIHJlbGF0aXZlIHRvIGN1cnJlbnQgcG9zaXRpb24gKi8KLSAgICBpZiAod2hlbmNlICE9IFNFRUtfU0VUICYmIHdoZW5jZSAhPSBTRUVLX0NVUikKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgLyogbm9ybWFsaXplIG9mZnNldCB0byBhIFNFRUtfQ1VSIHNwZWNpZmljYXRpb24gKi8KLSAgICBpZiAod2hlbmNlID09IFNFRUtfU0VUKQotICAgICAgICBvZmZzZXQgLT0gc3RhdGUtPngucG9zOwotICAgIGVsc2UgaWYgKHN0YXRlLT5zZWVrKQotICAgICAgICBvZmZzZXQgKz0gc3RhdGUtPnNraXA7Ci0gICAgc3RhdGUtPnNlZWsgPSAwOwotCi0gICAgLyogaWYgd2l0aGluIHJhdyBhcmVhIHdoaWxlIHJlYWRpbmcsIGp1c3QgZ28gdGhlcmUgKi8KLSAgICBpZiAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCAmJiBzdGF0ZS0+aG93ID09IENPUFkgJiYKLSAgICAgICAgICAgIHN0YXRlLT54LnBvcyArIG9mZnNldCA+PSAwKSB7Ci0gICAgICAgIHJldCA9IExTRUVLKHN0YXRlLT5mZCwgb2Zmc2V0IC0gc3RhdGUtPnguaGF2ZSwgU0VFS19DVVIpOwotICAgICAgICBpZiAocmV0ID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBzdGF0ZS0+eC5oYXZlID0gMDsKLSAgICAgICAgc3RhdGUtPmVvZiA9IDA7Ci0gICAgICAgIHN0YXRlLT5wYXN0ID0gMDsKLSAgICAgICAgc3RhdGUtPnNlZWsgPSAwOwotICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9PSywgTlVMTCk7Ci0gICAgICAgIHN0YXRlLT5zdHJtLmF2YWlsX2luID0gMDsKLSAgICAgICAgc3RhdGUtPngucG9zICs9IG9mZnNldDsKLSAgICAgICAgcmV0dXJuIHN0YXRlLT54LnBvczsKLSAgICB9Ci0KLSAgICAvKiBjYWxjdWxhdGUgc2tpcCBhbW91bnQsIHJld2luZGluZyBpZiBuZWVkZWQgZm9yIGJhY2sgc2VlayB3aGVuIHJlYWRpbmcgKi8KLSAgICBpZiAob2Zmc2V0IDwgMCkgewotICAgICAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfUkVBRCkgICAgICAgICAvKiB3cml0aW5nIC0tIGNhbid0IGdvIGJhY2t3YXJkcyAqLwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBvZmZzZXQgKz0gc3RhdGUtPngucG9zOwotICAgICAgICBpZiAob2Zmc2V0IDwgMCkgICAgICAgICAgICAgICAgICAgICAvKiBiZWZvcmUgc3RhcnQgb2YgZmlsZSEgKi8KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKGd6cmV3aW5kKGZpbGUpID09IC0xKSAgICAgICAgICAgLyogcmV3aW5kLCB0aGVuIHNraXAgdG8gb2Zmc2V0ICovCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogaWYgcmVhZGluZywgc2tpcCB3aGF0J3MgaW4gb3V0cHV0IGJ1ZmZlciAob25lIGxlc3MgZ3pnZXRjKCkgY2hlY2spICovCi0gICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX1JFQUQpIHsKLSAgICAgICAgbiA9IEdUX09GRihzdGF0ZS0+eC5oYXZlKSB8fCAoel9vZmY2NF90KXN0YXRlLT54LmhhdmUgPiBvZmZzZXQgPwotICAgICAgICAgICAgKHVuc2lnbmVkKW9mZnNldCA6IHN0YXRlLT54LmhhdmU7Ci0gICAgICAgIHN0YXRlLT54LmhhdmUgLT0gbjsKLSAgICAgICAgc3RhdGUtPngubmV4dCArPSBuOwotICAgICAgICBzdGF0ZS0+eC5wb3MgKz0gbjsKLSAgICAgICAgb2Zmc2V0IC09IG47Ci0gICAgfQotCi0gICAgLyogcmVxdWVzdCBza2lwIChpZiBub3QgemVybykgKi8KLSAgICBpZiAob2Zmc2V0KSB7Ci0gICAgICAgIHN0YXRlLT5zZWVrID0gMTsKLSAgICAgICAgc3RhdGUtPnNraXAgPSBvZmZzZXQ7Ci0gICAgfQotICAgIHJldHVybiBzdGF0ZS0+eC5wb3MgKyBvZmZzZXQ7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLXpfb2ZmX3QgWkVYUE9SVCBnenNlZWsoZmlsZSwgb2Zmc2V0LCB3aGVuY2UpCi0gICAgZ3pGaWxlIGZpbGU7Ci0gICAgel9vZmZfdCBvZmZzZXQ7Ci0gICAgaW50IHdoZW5jZTsKLXsKLSAgICB6X29mZjY0X3QgcmV0OwotCi0gICAgcmV0ID0gZ3pzZWVrNjQoZmlsZSwgKHpfb2ZmNjRfdClvZmZzZXQsIHdoZW5jZSk7Ci0gICAgcmV0dXJuIHJldCA9PSAoel9vZmZfdClyZXQgPyAoel9vZmZfdClyZXQgOiAtMTsKLX0KLQotLyogLS0gc2VlIHpsaWIuaCAtLSAqLwotel9vZmY2NF90IFpFWFBPUlQgZ3p0ZWxsNjQoZmlsZSkKLSAgICBnekZpbGUgZmlsZTsKLXsKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci0KLSAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlIGFuZCBjaGVjayBpbnRlZ3JpdHkgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0gICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIHJldHVybiBwb3NpdGlvbiAqLwotICAgIHJldHVybiBzdGF0ZS0+eC5wb3MgKyAoc3RhdGUtPnNlZWsgPyBzdGF0ZS0+c2tpcCA6IDApOwotfQotCi0vKiAtLSBzZWUgemxpYi5oIC0tICovCi16X29mZl90IFpFWFBPUlQgZ3p0ZWxsKGZpbGUpCi0gICAgZ3pGaWxlIGZpbGU7Ci17Ci0gICAgel9vZmY2NF90IHJldDsKLQotICAgIHJldCA9IGd6dGVsbDY0KGZpbGUpOwotICAgIHJldHVybiByZXQgPT0gKHpfb2ZmX3QpcmV0ID8gKHpfb2ZmX3QpcmV0IDogLTE7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLXpfb2ZmNjRfdCBaRVhQT1JUIGd6b2Zmc2V0NjQoZmlsZSkKLSAgICBnekZpbGUgZmlsZTsKLXsKLSAgICB6X29mZjY0X3Qgb2Zmc2V0OwotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLQotICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgYW5kIGNoZWNrIGludGVncml0eSAqLwotICAgIGlmIChmaWxlID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKLSAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfUkVBRCAmJiBzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgLyogY29tcHV0ZSBhbmQgcmV0dXJuIGVmZmVjdGl2ZSBvZmZzZXQgaW4gZmlsZSAqLwotICAgIG9mZnNldCA9IExTRUVLKHN0YXRlLT5mZCwgMCwgU0VFS19DVVIpOwotICAgIGlmIChvZmZzZXQgPT0gLTEpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCkgICAgICAgICAgICAgLyogcmVhZGluZyAqLwotICAgICAgICBvZmZzZXQgLT0gc3RhdGUtPnN0cm0uYXZhaWxfaW47ICAgICAvKiBkb24ndCBjb3VudCBidWZmZXJlZCBpbnB1dCAqLwotICAgIHJldHVybiBvZmZzZXQ7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLXpfb2ZmX3QgWkVYUE9SVCBnem9mZnNldChmaWxlKQotICAgIGd6RmlsZSBmaWxlOwotewotICAgIHpfb2ZmNjRfdCByZXQ7Ci0KLSAgICByZXQgPSBnem9mZnNldDY0KGZpbGUpOwotICAgIHJldHVybiByZXQgPT0gKHpfb2ZmX3QpcmV0ID8gKHpfb2ZmX3QpcmV0IDogLTE7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWludCBaRVhQT1JUIGd6ZW9mKGZpbGUpCi0gICAgZ3pGaWxlIGZpbGU7Ci17Ci0gICAgZ3pfc3RhdGVwIHN0YXRlOwotCi0gICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSBhbmQgY2hlY2sgaW50ZWdyaXR5ICovCi0gICAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0gICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogcmV0dXJuIGVuZC1vZi1maWxlIHN0YXRlICovCi0gICAgcmV0dXJuIHN0YXRlLT5tb2RlID09IEdaX1JFQUQgPyBzdGF0ZS0+cGFzdCA6IDA7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWNvbnN0IGNoYXIgKiBaRVhQT1JUIGd6ZXJyb3IoZmlsZSwgZXJybnVtKQotICAgIGd6RmlsZSBmaWxlOwotICAgIGludCAqZXJybnVtOwotewotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLQotICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgYW5kIGNoZWNrIGludGVncml0eSAqLwotICAgIGlmIChmaWxlID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9SRUFEICYmIHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8qIHJldHVybiBlcnJvciBpbmZvcm1hdGlvbiAqLwotICAgIGlmIChlcnJudW0gIT0gTlVMTCkKLSAgICAgICAgKmVycm51bSA9IHN0YXRlLT5lcnI7Ci0gICAgcmV0dXJuIHN0YXRlLT5tc2cgPT0gTlVMTCA/ICIiIDogc3RhdGUtPm1zZzsKLX0KLQotLyogLS0gc2VlIHpsaWIuaCAtLSAqLwotdm9pZCBaRVhQT1JUIGd6Y2xlYXJlcnIoZmlsZSkKLSAgICBnekZpbGUgZmlsZTsKLXsKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci0KLSAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlIGFuZCBjaGVjayBpbnRlZ3JpdHkgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm47Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0gICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8qIGNsZWFyIGVycm9yIGFuZCBlbmQtb2YtZmlsZSAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBHWl9SRUFEKSB7Ci0gICAgICAgIHN0YXRlLT5lb2YgPSAwOwotICAgICAgICBzdGF0ZS0+cGFzdCA9IDA7Ci0gICAgfQotICAgIGd6X2Vycm9yKHN0YXRlLCBaX09LLCBOVUxMKTsKLX0KLQotLyogQ3JlYXRlIGFuIGVycm9yIG1lc3NhZ2UgaW4gYWxsb2NhdGVkIG1lbW9yeSBhbmQgc2V0IHN0YXRlLT5lcnIgYW5kCi0gICBzdGF0ZS0+bXNnIGFjY29yZGluZ2x5LiAgRnJlZSBhbnkgcHJldmlvdXMgZXJyb3IgbWVzc2FnZSBhbHJlYWR5IHRoZXJlLiAgRG8KLSAgIG5vdCB0cnkgdG8gZnJlZSBvciBhbGxvY2F0ZSBzcGFjZSBpZiB0aGUgZXJyb3IgaXMgWl9NRU1fRVJST1IgKG91dCBvZgotICAgbWVtb3J5KS4gIFNpbXBseSBzYXZlIHRoZSBlcnJvciBtZXNzYWdlIGFzIGEgc3RhdGljIHN0cmluZy4gIElmIHRoZXJlIGlzIGFuCi0gICBhbGxvY2F0aW9uIGZhaWx1cmUgY29uc3RydWN0aW5nIHRoZSBlcnJvciBtZXNzYWdlLCB0aGVuIGNvbnZlcnQgdGhlIGVycm9yIHRvCi0gICBvdXQgb2YgbWVtb3J5LiAqLwotdm9pZCBaTElCX0lOVEVSTkFMIGd6X2Vycm9yKHN0YXRlLCBlcnIsIG1zZykKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci0gICAgaW50IGVycjsKLSAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gICAgLyogZnJlZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBtZXNzYWdlIGFuZCBjbGVhciAqLwotICAgIGlmIChzdGF0ZS0+bXNnICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHN0YXRlLT5lcnIgIT0gWl9NRU1fRVJST1IpCi0gICAgICAgICAgICBmcmVlKHN0YXRlLT5tc2cpOwotICAgICAgICBzdGF0ZS0+bXNnID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBpZiBmYXRhbCwgc2V0IHN0YXRlLT54LmhhdmUgdG8gMCBzbyB0aGF0IHRoZSBnemdldGMoKSBtYWNybyBmYWlscyAqLwotICAgIGlmIChlcnIgIT0gWl9PSyAmJiBlcnIgIT0gWl9CVUZfRVJST1IpCi0gICAgICAgIHN0YXRlLT54LmhhdmUgPSAwOwotCi0gICAgLyogc2V0IGVycm9yIGNvZGUsIGFuZCBpZiBubyBtZXNzYWdlLCB0aGVuIGRvbmUgKi8KLSAgICBzdGF0ZS0+ZXJyID0gZXJyOwotICAgIGlmIChtc2cgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLyogZm9yIGFuIG91dCBvZiBtZW1vcnkgZXJyb3IsIHNhdmUgYXMgc3RhdGljIHN0cmluZyAqLwotICAgIGlmIChlcnIgPT0gWl9NRU1fRVJST1IpIHsKLSAgICAgICAgc3RhdGUtPm1zZyA9IChjaGFyICopbXNnOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogY29uc3RydWN0IGVycm9yIG1lc3NhZ2Ugd2l0aCBwYXRoICovCi0gICAgaWYgKChzdGF0ZS0+bXNnID0gbWFsbG9jKHN0cmxlbihzdGF0ZS0+cGF0aCkgKyBzdHJsZW4obXNnKSArIDMpKSA9PSBOVUxMKSB7Ci0gICAgICAgIHN0YXRlLT5lcnIgPSBaX01FTV9FUlJPUjsKLSAgICAgICAgc3RhdGUtPm1zZyA9IChjaGFyICopIm91dCBvZiBtZW1vcnkiOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0cmNweShzdGF0ZS0+bXNnLCBzdGF0ZS0+cGF0aCk7Ci0gICAgc3RyY2F0KHN0YXRlLT5tc2csICI6ICIpOwotICAgIHN0cmNhdChzdGF0ZS0+bXNnLCBtc2cpOwotICAgIHJldHVybjsKLX0KLQotI2lmbmRlZiBJTlRfTUFYCi0vKiBwb3J0YWJseSByZXR1cm4gbWF4aW11bSB2YWx1ZSBmb3IgYW4gaW50ICh3aGVuIGxpbWl0cy5oIHByZXN1bWVkIG5vdAotICAgYXZhaWxhYmxlKSAtLSB3ZSBuZWVkIHRvIGRvIHRoaXMgdG8gY292ZXIgY2FzZXMgd2hlcmUgMidzIGNvbXBsZW1lbnQgbm90Ci0gICB1c2VkLCBzaW5jZSBDIHN0YW5kYXJkIHBlcm1pdHMgMSdzIGNvbXBsZW1lbnQgYW5kIHNpZ24tYml0IHJlcHJlc2VudGF0aW9ucywKLSAgIG90aGVyd2lzZSB3ZSBjb3VsZCBqdXN0IHVzZSAoKHVuc2lnbmVkKS0xKSA+PiAxICovCi11bnNpZ25lZCBaTElCX0lOVEVSTkFMIGd6X2ludG1heCgpCi17Ci0gICAgdW5zaWduZWQgcCwgcTsKLQotICAgIHAgPSAxOwotICAgIGRvIHsKLSAgICAgICAgcSA9IHA7Ci0gICAgICAgIHAgPDw9IDE7Ci0gICAgICAgIHArKzsKLSAgICB9IHdoaWxlIChwID4gcSk7Ci0gICAgcmV0dXJuIHEgPj4gMTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvZ3pyZWFkLmMgYi9zcmMvemxpYi9nenJlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5M2QzNC4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9nenJlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDU4OSArMCwwIEBACi0vKiBnenJlYWQuYyAtLSB6bGliIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyBnemlwIGZpbGVzCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMTAsIDIwMTEsIDIwMTIgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLSNpbmNsdWRlICJnemd1dHMuaCIKLQotLyogTG9jYWwgZnVuY3Rpb25zICovCi1sb2NhbCBpbnQgZ3pfbG9hZCBPRigoZ3pfc3RhdGVwLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkLCB1bnNpZ25lZCAqKSk7Ci1sb2NhbCBpbnQgZ3pfYXZhaWwgT0YoKGd6X3N0YXRlcCkpOwotbG9jYWwgaW50IGd6X2xvb2sgT0YoKGd6X3N0YXRlcCkpOwotbG9jYWwgaW50IGd6X2RlY29tcCBPRigoZ3pfc3RhdGVwKSk7Ci1sb2NhbCBpbnQgZ3pfZmV0Y2ggT0YoKGd6X3N0YXRlcCkpOwotbG9jYWwgaW50IGd6X3NraXAgT0YoKGd6X3N0YXRlcCwgel9vZmY2NF90KSk7Ci0KLS8qIFVzZSByZWFkKCkgdG8gbG9hZCBhIGJ1ZmZlciAtLSByZXR1cm4gLTEgb24gZXJyb3IsIG90aGVyd2lzZSAwLiAgUmVhZCBmcm9tCi0gICBzdGF0ZS0+ZmQsIGFuZCB1cGRhdGUgc3RhdGUtPmVvZiwgc3RhdGUtPmVyciwgYW5kIHN0YXRlLT5tc2cgYXMgYXBwcm9wcmlhdGUuCi0gICBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGxvb3Agb24gcmVhZCgpLCBzaW5jZSByZWFkKCkgaXMgbm90IGd1YXJhbnRlZWQgdG8KLSAgIHJlYWQgdGhlIG51bWJlciBvZiBieXRlcyByZXF1ZXN0ZWQsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBkZXNjcmlwdG9yLiAqLwotbG9jYWwgaW50IGd6X2xvYWQoc3RhdGUsIGJ1ZiwgbGVuLCBoYXZlKQotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLSAgICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gICAgdW5zaWduZWQgbGVuOwotICAgIHVuc2lnbmVkICpoYXZlOwotewotICAgIGludCByZXQ7Ci0KLSAgICAqaGF2ZSA9IDA7Ci0gICAgZG8gewotICAgICAgICByZXQgPSByZWFkKHN0YXRlLT5mZCwgYnVmICsgKmhhdmUsIGxlbiAtICpoYXZlKTsKLSAgICAgICAgaWYgKHJldCA8PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICpoYXZlICs9IHJldDsKLSAgICB9IHdoaWxlICgqaGF2ZSA8IGxlbik7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfRVJSTk8sIHpzdHJlcnJvcigpKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAocmV0ID09IDApCi0gICAgICAgIHN0YXRlLT5lb2YgPSAxOwotICAgIHJldHVybiAwOwotfQotCi0vKiBMb2FkIHVwIGlucHV0IGJ1ZmZlciBhbmQgc2V0IGVvZiBmbGFnIGlmIGxhc3QgZGF0YSBsb2FkZWQgLS0gcmV0dXJuIC0xIG9uCi0gICBlcnJvciwgMCBvdGhlcndpc2UuICBOb3RlIHRoYXQgdGhlIGVvZiBmbGFnIGlzIHNldCB3aGVuIHRoZSBlbmQgb2YgdGhlIGlucHV0Ci0gICBmaWxlIGlzIHJlYWNoZWQsIGV2ZW4gdGhvdWdoIHRoZXJlIG1heSBiZSB1bnVzZWQgZGF0YSBpbiB0aGUgYnVmZmVyLiAgT25jZQotICAgdGhhdCBkYXRhIGhhcyBiZWVuIHVzZWQsIG5vIG1vcmUgYXR0ZW1wdHMgd2lsbCBiZSBtYWRlIHRvIHJlYWQgdGhlIGZpbGUuCi0gICBJZiBzdHJtLT5hdmFpbF9pbiAhPSAwLCB0aGVuIHRoZSBjdXJyZW50IGRhdGEgaXMgbW92ZWQgdG8gdGhlIGJlZ2lubmluZyBvZgotICAgdGhlIGlucHV0IGJ1ZmZlciwgYW5kIHRoZW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgYnVmZmVyIGlzIGxvYWRlZCB3aXRoIHRoZQotICAgYXZhaWxhYmxlIGRhdGEgZnJvbSB0aGUgaW5wdXQgZmlsZS4gKi8KLWxvY2FsIGludCBnel9hdmFpbChzdGF0ZSkKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci17Ci0gICAgdW5zaWduZWQgZ290OwotICAgIHpfc3RyZWFtcCBzdHJtID0gJihzdGF0ZS0+c3RybSk7Ci0KLSAgICBpZiAoc3RhdGUtPmVyciAhPSBaX09LICYmIHN0YXRlLT5lcnIgIT0gWl9CVUZfRVJST1IpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoc3RhdGUtPmVvZiA9PSAwKSB7Ci0gICAgICAgIGlmIChzdHJtLT5hdmFpbF9pbikgeyAgICAgICAvKiBjb3B5IHdoYXQncyB0aGVyZSB0byB0aGUgc3RhcnQgKi8KLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBzdGF0ZS0+aW4sICpxID0gc3RybS0+bmV4dF9pbjsKLSAgICAgICAgICAgIHVuc2lnbmVkIG4gPSBzdHJtLT5hdmFpbF9pbjsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAqcCsrID0gKnErKzsKLSAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGd6X2xvYWQoc3RhdGUsIHN0YXRlLT5pbiArIHN0cm0tPmF2YWlsX2luLAotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+c2l6ZSAtIHN0cm0tPmF2YWlsX2luLCAmZ290KSA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgc3RybS0+YXZhaWxfaW4gKz0gZ290OwotICAgICAgICBzdHJtLT5uZXh0X2luID0gc3RhdGUtPmluOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogTG9vayBmb3IgZ3ppcCBoZWFkZXIsIHNldCB1cCBmb3IgaW5mbGF0ZSBvciBjb3B5LiAgc3RhdGUtPnguaGF2ZSBtdXN0IGJlIDAuCi0gICBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIGluLCBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuICBzdGF0ZS0+aG93IHdpbGwgYmUKLSAgIGxlZnQgdW5jaGFuZ2VkIGlmIHRoZXJlIGlzIG5vIG1vcmUgaW5wdXQgZGF0YSBhdmFpbGFibGUsIHdpbGwgYmUgc2V0IHRvIENPUFkKLSAgIGlmIHRoZXJlIGlzIG5vIGd6aXAgaGVhZGVyIGFuZCBkaXJlY3QgY29weWluZyB3aWxsIGJlIHBlcmZvcm1lZCwgb3IgaXQgd2lsbAotICAgYmUgc2V0IHRvIEdaSVAgZm9yIGRlY29tcHJlc3Npb24uICBJZiBkaXJlY3QgY29weWluZywgdGhlbiBsZWZ0b3ZlciBpbnB1dAotICAgZGF0YSBmcm9tIHRoZSBpbnB1dCBidWZmZXIgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIG91dHB1dCBidWZmZXIuICBJbiB0aGF0Ci0gICBjYXNlLCBhbGwgZnVydGhlciBmaWxlIHJlYWRzIHdpbGwgYmUgZGlyZWN0bHkgdG8gZWl0aGVyIHRoZSBvdXRwdXQgYnVmZmVyIG9yCi0gICBhIHVzZXIgYnVmZmVyLiAgSWYgZGVjb21wcmVzc2luZywgdGhlIGluZmxhdGUgc3RhdGUgd2lsbCBiZSBpbml0aWFsaXplZC4KLSAgIGd6X2xvb2soKSB3aWxsIHJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgLTEgb24gZmFpbHVyZS4gKi8KLWxvY2FsIGludCBnel9sb29rKHN0YXRlKQotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLXsKLSAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOwotCi0gICAgLyogYWxsb2NhdGUgcmVhZCBidWZmZXJzIGFuZCBpbmZsYXRlIG1lbW9yeSAqLwotICAgIGlmIChzdGF0ZS0+c2l6ZSA9PSAwKSB7Ci0gICAgICAgIC8qIGFsbG9jYXRlIGJ1ZmZlcnMgKi8KLSAgICAgICAgc3RhdGUtPmluID0gbWFsbG9jKHN0YXRlLT53YW50KTsKLSAgICAgICAgc3RhdGUtPm91dCA9IG1hbGxvYyhzdGF0ZS0+d2FudCA8PCAxKTsKLSAgICAgICAgaWYgKHN0YXRlLT5pbiA9PSBOVUxMIHx8IHN0YXRlLT5vdXQgPT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKHN0YXRlLT5vdXQgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBmcmVlKHN0YXRlLT5vdXQpOwotICAgICAgICAgICAgaWYgKHN0YXRlLT5pbiAhPSBOVUxMKQotICAgICAgICAgICAgICAgIGZyZWUoc3RhdGUtPmluKTsKLSAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX01FTV9FUlJPUiwgIm91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBzdGF0ZS0+c2l6ZSA9IHN0YXRlLT53YW50OwotCi0gICAgICAgIC8qIGFsbG9jYXRlIGluZmxhdGUgbWVtb3J5ICovCi0gICAgICAgIHN0YXRlLT5zdHJtLnphbGxvYyA9IFpfTlVMTDsKLSAgICAgICAgc3RhdGUtPnN0cm0uemZyZWUgPSBaX05VTEw7Ci0gICAgICAgIHN0YXRlLT5zdHJtLm9wYXF1ZSA9IFpfTlVMTDsKLSAgICAgICAgc3RhdGUtPnN0cm0uYXZhaWxfaW4gPSAwOwotICAgICAgICBzdGF0ZS0+c3RybS5uZXh0X2luID0gWl9OVUxMOwotICAgICAgICBpZiAoaW5mbGF0ZUluaXQyKCYoc3RhdGUtPnN0cm0pLCAxNSArIDE2KSAhPSBaX09LKSB7ICAgIC8qIGd1bnppcCAqLwotICAgICAgICAgICAgZnJlZShzdGF0ZS0+b3V0KTsKLSAgICAgICAgICAgIGZyZWUoc3RhdGUtPmluKTsKLSAgICAgICAgICAgIHN0YXRlLT5zaXplID0gMDsKLSAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX01FTV9FUlJPUiwgIm91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGdldCBhdCBsZWFzdCB0aGUgbWFnaWMgYnl0ZXMgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLwotICAgIGlmIChzdHJtLT5hdmFpbF9pbiA8IDIpIHsKLSAgICAgICAgaWYgKGd6X2F2YWlsKHN0YXRlKSA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKHN0cm0tPmF2YWlsX2luID09IDApCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBsb29rIGZvciBnemlwIG1hZ2ljIGJ5dGVzIC0tIGlmIHRoZXJlLCBkbyBnemlwIGRlY29kaW5nIChub3RlOiB0aGVyZSBpcwotICAgICAgIGEgbG9naWNhbCBkaWxlbW1hIGhlcmUgd2hlbiBjb25zaWRlcmluZyB0aGUgY2FzZSBvZiBhIHBhcnRpYWxseSB3cml0dGVuCi0gICAgICAgZ3ppcCBmaWxlLCB0byB3aXQsIGlmIGEgc2luZ2xlIDMxIGJ5dGUgaXMgd3JpdHRlbiwgdGhlbiB3ZSBjYW5ub3QgdGVsbAotICAgICAgIHdoZXRoZXIgdGhpcyBpcyBhIHNpbmdsZS1ieXRlIGZpbGUsIG9yIGp1c3QgYSBwYXJ0aWFsbHkgd3JpdHRlbiBnemlwCi0gICAgICAgZmlsZSAtLSBmb3IgaGVyZSB3ZSBhc3N1bWUgdGhhdCBpZiBhIGd6aXAgZmlsZSBpcyBiZWluZyB3cml0dGVuLCB0aGVuCi0gICAgICAgdGhlIGhlYWRlciB3aWxsIGJlIHdyaXR0ZW4gaW4gYSBzaW5nbGUgb3BlcmF0aW9uLCBzbyB0aGF0IHJlYWRpbmcgYQotICAgICAgIHNpbmdsZSBieXRlIGlzIHN1ZmZpY2llbnQgaW5kaWNhdGlvbiB0aGF0IGl0IGlzIG5vdCBhIGd6aXAgZmlsZSkgKi8KLSAgICBpZiAoc3RybS0+YXZhaWxfaW4gPiAxICYmCi0gICAgICAgICAgICBzdHJtLT5uZXh0X2luWzBdID09IDMxICYmIHN0cm0tPm5leHRfaW5bMV0gPT0gMTM5KSB7Ci0gICAgICAgIGluZmxhdGVSZXNldChzdHJtKTsKLSAgICAgICAgc3RhdGUtPmhvdyA9IEdaSVA7Ci0gICAgICAgIHN0YXRlLT5kaXJlY3QgPSAwOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBubyBnemlwIGhlYWRlciAtLSBpZiB3ZSB3ZXJlIGRlY29kaW5nIGd6aXAgYmVmb3JlLCB0aGVuIHRoaXMgaXMgdHJhaWxpbmcKLSAgICAgICBnYXJiYWdlLiAgSWdub3JlIHRoZSB0cmFpbGluZyBnYXJiYWdlIGFuZCBmaW5pc2guICovCi0gICAgaWYgKHN0YXRlLT5kaXJlY3QgPT0gMCkgewotICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IDA7Ci0gICAgICAgIHN0YXRlLT5lb2YgPSAxOwotICAgICAgICBzdGF0ZS0+eC5oYXZlID0gMDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogZG9pbmcgcmF3IGkvbywgY29weSBhbnkgbGVmdG92ZXIgaW5wdXQgdG8gb3V0cHV0IC0tIHRoaXMgYXNzdW1lcyB0aGF0Ci0gICAgICAgdGhlIG91dHB1dCBidWZmZXIgaXMgbGFyZ2VyIHRoYW4gdGhlIGlucHV0IGJ1ZmZlciwgd2hpY2ggYWxzbyBhc3N1cmVzCi0gICAgICAgc3BhY2UgZm9yIGd6dW5nZXRjKCkgKi8KLSAgICBzdGF0ZS0+eC5uZXh0ID0gc3RhdGUtPm91dDsKLSAgICBpZiAoc3RybS0+YXZhaWxfaW4pIHsKLSAgICAgICAgbWVtY3B5KHN0YXRlLT54Lm5leHQsIHN0cm0tPm5leHRfaW4sIHN0cm0tPmF2YWlsX2luKTsKLSAgICAgICAgc3RhdGUtPnguaGF2ZSA9IHN0cm0tPmF2YWlsX2luOwotICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IDA7Ci0gICAgfQotICAgIHN0YXRlLT5ob3cgPSBDT1BZOwotICAgIHN0YXRlLT5kaXJlY3QgPSAxOwotICAgIHJldHVybiAwOwotfQotCi0vKiBEZWNvbXByZXNzIGZyb20gaW5wdXQgdG8gdGhlIHByb3ZpZGVkIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgaW4gdGhlIHN0YXRlLgotICAgT24gcmV0dXJuLCBzdGF0ZS0+eC5oYXZlIGFuZCBzdGF0ZS0+eC5uZXh0IHBvaW50IHRvIHRoZSBqdXN0IGRlY29tcHJlc3NlZAotICAgZGF0YS4gIElmIHRoZSBnemlwIHN0cmVhbSBjb21wbGV0ZXMsIHN0YXRlLT5ob3cgaXMgcmVzZXQgdG8gTE9PSyB0byBsb29rIGZvcgotICAgdGhlIG5leHQgZ3ppcCBzdHJlYW0gb3IgcmF3IGRhdGEsIG9uY2Ugc3RhdGUtPnguaGF2ZSBpcyBkZXBsZXRlZC4gIFJldHVybnMgMAotICAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4gKi8KLWxvY2FsIGludCBnel9kZWNvbXAoc3RhdGUpCi0gICAgZ3pfc3RhdGVwIHN0YXRlOwotewotICAgIGludCByZXQgPSBaX09LOwotICAgIHVuc2lnbmVkIGhhZDsKLSAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOwotCi0gICAgLyogZmlsbCBvdXRwdXQgYnVmZmVyIHVwIHRvIGVuZCBvZiBkZWZsYXRlIHN0cmVhbSAqLwotICAgIGhhZCA9IHN0cm0tPmF2YWlsX291dDsKLSAgICBkbyB7Ci0gICAgICAgIC8qIGdldCBtb3JlIGlucHV0IGZvciBpbmZsYXRlKCkgKi8KLSAgICAgICAgaWYgKHN0cm0tPmF2YWlsX2luID09IDAgJiYgZ3pfYXZhaWwoc3RhdGUpID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCkgewotICAgICAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfQlVGX0VSUk9SLCAidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBkZWNvbXByZXNzIGFuZCBoYW5kbGUgZXJyb3JzICovCi0gICAgICAgIHJldCA9IGluZmxhdGUoc3RybSwgWl9OT19GTFVTSCk7Ci0gICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRVJST1IgfHwgcmV0ID09IFpfTkVFRF9ESUNUKSB7Ci0gICAgICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9TVFJFQU1fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgZXJyb3I6IGluZmxhdGUgc3RyZWFtIGNvcnJ1cHQiKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0ID09IFpfTUVNX0VSUk9SKSB7Ci0gICAgICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9NRU1fRVJST1IsICJvdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldCA9PSBaX0RBVEFfRVJST1IpIHsgICAgICAgICAgICAgIC8qIGRlZmxhdGUgc3RyZWFtIGludmFsaWQgKi8KLSAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX0RBVEFfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPT0gTlVMTCA/ICJjb21wcmVzc2VkIGRhdGEgZXJyb3IiIDogc3RybS0+bXNnKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKHN0cm0tPmF2YWlsX291dCAmJiByZXQgIT0gWl9TVFJFQU1fRU5EKTsKLQotICAgIC8qIHVwZGF0ZSBhdmFpbGFibGUgb3V0cHV0ICovCi0gICAgc3RhdGUtPnguaGF2ZSA9IGhhZCAtIHN0cm0tPmF2YWlsX291dDsKLSAgICBzdGF0ZS0+eC5uZXh0ID0gc3RybS0+bmV4dF9vdXQgLSBzdGF0ZS0+eC5oYXZlOwotCi0gICAgLyogaWYgdGhlIGd6aXAgc3RyZWFtIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIGxvb2sgZm9yIGFub3RoZXIgKi8KLSAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKLSAgICAgICAgc3RhdGUtPmhvdyA9IExPT0s7Ci0KLSAgICAvKiBnb29kIGRlY29tcHJlc3Npb24gKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyogRmV0Y2ggZGF0YSBhbmQgcHV0IGl0IGluIHRoZSBvdXRwdXQgYnVmZmVyLiAgQXNzdW1lcyBzdGF0ZS0+eC5oYXZlIGlzIDAuCi0gICBEYXRhIGlzIGVpdGhlciBjb3BpZWQgZnJvbSB0aGUgaW5wdXQgZmlsZSBvciBkZWNvbXByZXNzZWQgZnJvbSB0aGUgaW5wdXQKLSAgIGZpbGUgZGVwZW5kaW5nIG9uIHN0YXRlLT5ob3cuICBJZiBzdGF0ZS0+aG93IGlzIExPT0ssIHRoZW4gYSBnemlwIGhlYWRlciBpcwotICAgbG9va2VkIGZvciB0byBkZXRlcm1pbmUgd2hldGhlciB0byBjb3B5IG9yIGRlY29tcHJlc3MuICBSZXR1cm5zIC0xIG9uIGVycm9yLAotICAgb3RoZXJ3aXNlIDAuICBnel9mZXRjaCgpIHdpbGwgbGVhdmUgc3RhdGUtPmhvdyBhcyBDT1BZIG9yIEdaSVAgdW5sZXNzIHRoZQotICAgZW5kIG9mIHRoZSBpbnB1dCBmaWxlIGhhcyBiZWVuIHJlYWNoZWQgYW5kIGFsbCBkYXRhIGhhcyBiZWVuIHByb2Nlc3NlZC4gICovCi1sb2NhbCBpbnQgZ3pfZmV0Y2goc3RhdGUpCi0gICAgZ3pfc3RhdGVwIHN0YXRlOwotewotICAgIHpfc3RyZWFtcCBzdHJtID0gJihzdGF0ZS0+c3RybSk7Ci0KLSAgICBkbyB7Ci0gICAgICAgIHN3aXRjaChzdGF0ZS0+aG93KSB7Ci0gICAgICAgIGNhc2UgTE9PSzogICAgICAvKiAtPiBMT09LLCBDT1BZIChvbmx5IGlmIG5ldmVyIEdaSVApLCBvciBHWklQICovCi0gICAgICAgICAgICBpZiAoZ3pfbG9vayhzdGF0ZSkgPT0gLTEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgaWYgKHN0YXRlLT5ob3cgPT0gTE9PSykKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENPUFk6ICAgICAgLyogLT4gQ09QWSAqLwotICAgICAgICAgICAgaWYgKGd6X2xvYWQoc3RhdGUsIHN0YXRlLT5vdXQsIHN0YXRlLT5zaXplIDw8IDEsICYoc3RhdGUtPnguaGF2ZSkpCi0gICAgICAgICAgICAgICAgICAgID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIHN0YXRlLT54Lm5leHQgPSBzdGF0ZS0+b3V0OwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGNhc2UgR1pJUDogICAgICAvKiAtPiBHWklQIG9yIExPT0sgKGlmIGVuZCBvZiBnemlwIHN0cmVhbSkgKi8KLSAgICAgICAgICAgIHN0cm0tPmF2YWlsX291dCA9IHN0YXRlLT5zaXplIDw8IDE7Ci0gICAgICAgICAgICBzdHJtLT5uZXh0X291dCA9IHN0YXRlLT5vdXQ7Ci0gICAgICAgICAgICBpZiAoZ3pfZGVjb21wKHN0YXRlKSA9PSAtMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChzdGF0ZS0+eC5oYXZlID09IDAgJiYgKCFzdGF0ZS0+ZW9mIHx8IHN0cm0tPmF2YWlsX2luKSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNraXAgbGVuIHVuY29tcHJlc3NlZCBieXRlcyBvZiBvdXRwdXQuICBSZXR1cm4gLTEgb24gZXJyb3IsIDAgb24gc3VjY2Vzcy4gKi8KLWxvY2FsIGludCBnel9za2lwKHN0YXRlLCBsZW4pCi0gICAgZ3pfc3RhdGVwIHN0YXRlOwotICAgIHpfb2ZmNjRfdCBsZW47Ci17Ci0gICAgdW5zaWduZWQgbjsKLQotICAgIC8qIHNraXAgb3ZlciBsZW4gYnl0ZXMgb3IgcmVhY2ggZW5kLW9mLWZpbGUsIHdoaWNoZXZlciBjb21lcyBmaXJzdCAqLwotICAgIHdoaWxlIChsZW4pCi0gICAgICAgIC8qIHNraXAgb3ZlciB3aGF0ZXZlciBpcyBpbiBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIGlmIChzdGF0ZS0+eC5oYXZlKSB7Ci0gICAgICAgICAgICBuID0gR1RfT0ZGKHN0YXRlLT54LmhhdmUpIHx8ICh6X29mZjY0X3Qpc3RhdGUtPnguaGF2ZSA+IGxlbiA/Ci0gICAgICAgICAgICAgICAgKHVuc2lnbmVkKWxlbiA6IHN0YXRlLT54LmhhdmU7Ci0gICAgICAgICAgICBzdGF0ZS0+eC5oYXZlIC09IG47Ci0gICAgICAgICAgICBzdGF0ZS0+eC5uZXh0ICs9IG47Ci0gICAgICAgICAgICBzdGF0ZS0+eC5wb3MgKz0gbjsKLSAgICAgICAgICAgIGxlbiAtPSBuOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogb3V0cHV0IGJ1ZmZlciBlbXB0eSAtLSByZXR1cm4gaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgKi8KLSAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmVvZiAmJiBzdGF0ZS0+c3RybS5hdmFpbF9pbiA9PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogbmVlZCBtb3JlIGRhdGEgdG8gc2tpcCAtLSBsb2FkIHVwIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBnZXQgbW9yZSBvdXRwdXQsIGxvb2tpbmcgZm9yIGhlYWRlciBpZiByZXF1aXJlZCAqLwotICAgICAgICAgICAgaWYgKGd6X2ZldGNoKHN0YXRlKSA9PSAtMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogLS0gc2VlIHpsaWIuaCAtLSAqLwotaW50IFpFWFBPUlQgZ3pyZWFkKGZpbGUsIGJ1ZiwgbGVuKQotICAgIGd6RmlsZSBmaWxlOwotICAgIHZvaWRwIGJ1ZjsKLSAgICB1bnNpZ25lZCBsZW47Ci17Ci0gICAgdW5zaWduZWQgZ290LCBuOwotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLSAgICB6X3N0cmVhbXAgc3RybTsKLQotICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0gICAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOwotCi0gICAgLyogY2hlY2sgdGhhdCB3ZSdyZSByZWFkaW5nIGFuZCB0aGF0IHRoZXJlJ3Mgbm8gKHNlcmlvdXMpIGVycm9yICovCi0gICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgfHwKLSAgICAgICAgICAgIChzdGF0ZS0+ZXJyICE9IFpfT0sgJiYgc3RhdGUtPmVyciAhPSBaX0JVRl9FUlJPUikpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIHNpbmNlIGFuIGludCBpcyByZXR1cm5lZCwgbWFrZSBzdXJlIGxlbiBmaXRzIGluIG9uZSwgb3RoZXJ3aXNlIHJldHVybgotICAgICAgIHdpdGggYW4gZXJyb3IgKHRoaXMgYXZvaWRzIHRoZSBmbGF3IGluIHRoZSBpbnRlcmZhY2UpICovCi0gICAgaWYgKChpbnQpbGVuIDwgMCkgewotICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9EQVRBX0VSUk9SLCAicmVxdWVzdGVkIGxlbmd0aCBkb2VzIG5vdCBmaXQgaW4gaW50Iik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBpZiBsZW4gaXMgemVybywgYXZvaWQgdW5uZWNlc3Nhcnkgb3BlcmF0aW9ucyAqLwotICAgIGlmIChsZW4gPT0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBwcm9jZXNzIGEgc2tpcCByZXF1ZXN0ICovCi0gICAgaWYgKHN0YXRlLT5zZWVrKSB7Ci0gICAgICAgIHN0YXRlLT5zZWVrID0gMDsKLSAgICAgICAgaWYgKGd6X3NraXAoc3RhdGUsIHN0YXRlLT5za2lwKSA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBnZXQgbGVuIGJ5dGVzIHRvIGJ1Ziwgb3IgbGVzcyB0aGFuIGxlbiBpZiBhdCB0aGUgZW5kICovCi0gICAgZ290ID0gMDsKLSAgICBkbyB7Ci0gICAgICAgIC8qIGZpcnN0IGp1c3QgdHJ5IGNvcHlpbmcgZGF0YSBmcm9tIHRoZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIGlmIChzdGF0ZS0+eC5oYXZlKSB7Ci0gICAgICAgICAgICBuID0gc3RhdGUtPnguaGF2ZSA+IGxlbiA/IGxlbiA6IHN0YXRlLT54LmhhdmU7Ci0gICAgICAgICAgICBtZW1jcHkoYnVmLCBzdGF0ZS0+eC5uZXh0LCBuKTsKLSAgICAgICAgICAgIHN0YXRlLT54Lm5leHQgKz0gbjsKLSAgICAgICAgICAgIHN0YXRlLT54LmhhdmUgLT0gbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG91dHB1dCBidWZmZXIgZW1wdHkgLS0gcmV0dXJuIGlmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0ICovCi0gICAgICAgIGVsc2UgaWYgKHN0YXRlLT5lb2YgJiYgc3RybS0+YXZhaWxfaW4gPT0gMCkgewotICAgICAgICAgICAgc3RhdGUtPnBhc3QgPSAxOyAgICAgICAgLyogdHJpZWQgdG8gcmVhZCBwYXN0IGVuZCAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBuZWVkIG91dHB1dCBkYXRhIC0tIGZvciBzbWFsbCBsZW4gb3IgbmV3IHN0cmVhbSBsb2FkIHVwIG91ciBvdXRwdXQKLSAgICAgICAgICAgYnVmZmVyICovCi0gICAgICAgIGVsc2UgaWYgKHN0YXRlLT5ob3cgPT0gTE9PSyB8fCBsZW4gPCAoc3RhdGUtPnNpemUgPDwgMSkpIHsKLSAgICAgICAgICAgIC8qIGdldCBtb3JlIG91dHB1dCwgbG9va2luZyBmb3IgaGVhZGVyIGlmIHJlcXVpcmVkICovCi0gICAgICAgICAgICBpZiAoZ3pfZmV0Y2goc3RhdGUpID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAvKiBubyBwcm9ncmVzcyB5ZXQgLS0gZ28gYmFjayB0byBjb3B5IGFib3ZlICovCi0gICAgICAgICAgICAvKiB0aGUgY29weSBhYm92ZSBhc3N1cmVzIHRoYXQgd2Ugd2lsbCBsZWF2ZSB3aXRoIHNwYWNlIGluIHRoZQotICAgICAgICAgICAgICAgb3V0cHV0IGJ1ZmZlciwgYWxsb3dpbmcgYXQgbGVhc3Qgb25lIGd6dW5nZXRjKCkgdG8gc3VjY2VlZCAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyogbGFyZ2UgbGVuIC0tIHJlYWQgZGlyZWN0bHkgaW50byB1c2VyIGJ1ZmZlciAqLwotICAgICAgICBlbHNlIGlmIChzdGF0ZS0+aG93ID09IENPUFkpIHsgICAgICAvKiByZWFkIGRpcmVjdGx5ICovCi0gICAgICAgICAgICBpZiAoZ3pfbG9hZChzdGF0ZSwgYnVmLCBsZW4sICZuKSA9PSAtMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBsYXJnZSBsZW4gLS0gZGVjb21wcmVzcyBkaXJlY3RseSBpbnRvIHVzZXIgYnVmZmVyICovCi0gICAgICAgIGVsc2UgeyAgLyogc3RhdGUtPmhvdyA9PSBHWklQICovCi0gICAgICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBsZW47Ci0gICAgICAgICAgICBzdHJtLT5uZXh0X291dCA9IGJ1ZjsKLSAgICAgICAgICAgIGlmIChnel9kZWNvbXAoc3RhdGUpID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIG4gPSBzdGF0ZS0+eC5oYXZlOwotICAgICAgICAgICAgc3RhdGUtPnguaGF2ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB1cGRhdGUgcHJvZ3Jlc3MgKi8KLSAgICAgICAgbGVuIC09IG47Ci0gICAgICAgIGJ1ZiA9IChjaGFyICopYnVmICsgbjsKLSAgICAgICAgZ290ICs9IG47Ci0gICAgICAgIHN0YXRlLT54LnBvcyArPSBuOwotICAgIH0gd2hpbGUgKGxlbik7Ci0KLSAgICAvKiByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaW50byB1c2VyIGJ1ZmZlciAod2lsbCBmaXQgaW4gaW50KSAqLwotICAgIHJldHVybiAoaW50KWdvdDsKLX0KLQotLyogLS0gc2VlIHpsaWIuaCAtLSAqLwotI3VuZGVmIGd6Z2V0YwotaW50IFpFWFBPUlQgZ3pnZXRjKGZpbGUpCi0gICAgZ3pGaWxlIGZpbGU7Ci17Ci0gICAgaW50IHJldDsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZlsxXTsKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci0KLSAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCi0gICAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOwotCi0gICAgLyogY2hlY2sgdGhhdCB3ZSdyZSByZWFkaW5nIGFuZCB0aGF0IHRoZXJlJ3Mgbm8gKHNlcmlvdXMpIGVycm9yICovCi0gICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgfHwKLSAgICAgICAgKHN0YXRlLT5lcnIgIT0gWl9PSyAmJiBzdGF0ZS0+ZXJyICE9IFpfQlVGX0VSUk9SKSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgLyogdHJ5IG91dHB1dCBidWZmZXIgKG5vIG5lZWQgdG8gY2hlY2sgZm9yIHNraXAgcmVxdWVzdCkgKi8KLSAgICBpZiAoc3RhdGUtPnguaGF2ZSkgewotICAgICAgICBzdGF0ZS0+eC5oYXZlLS07Ci0gICAgICAgIHN0YXRlLT54LnBvcysrOwotICAgICAgICByZXR1cm4gKihzdGF0ZS0+eC5uZXh0KSsrOwotICAgIH0KLQotICAgIC8qIG5vdGhpbmcgdGhlcmUgLS0gdHJ5IGd6cmVhZCgpICovCi0gICAgcmV0ID0gZ3pyZWFkKGZpbGUsIGJ1ZiwgMSk7Ci0gICAgcmV0dXJuIHJldCA8IDEgPyAtMSA6IGJ1ZlswXTsKLX0KLQotaW50IFpFWFBPUlQgZ3pnZXRjXyhmaWxlKQotZ3pGaWxlIGZpbGU7Ci17Ci0gICAgcmV0dXJuIGd6Z2V0YyhmaWxlKTsKLX0KLQotLyogLS0gc2VlIHpsaWIuaCAtLSAqLwotaW50IFpFWFBPUlQgZ3p1bmdldGMoYywgZmlsZSkKLSAgICBpbnQgYzsKLSAgICBnekZpbGUgZmlsZTsKLXsKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci0KLSAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCi0gICAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOwotCi0gICAgLyogY2hlY2sgdGhhdCB3ZSdyZSByZWFkaW5nIGFuZCB0aGF0IHRoZXJlJ3Mgbm8gKHNlcmlvdXMpIGVycm9yICovCi0gICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgfHwKLSAgICAgICAgKHN0YXRlLT5lcnIgIT0gWl9PSyAmJiBzdGF0ZS0+ZXJyICE9IFpfQlVGX0VSUk9SKSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgLyogcHJvY2VzcyBhIHNraXAgcmVxdWVzdCAqLwotICAgIGlmIChzdGF0ZS0+c2VlaykgewotICAgICAgICBzdGF0ZS0+c2VlayA9IDA7Ci0gICAgICAgIGlmIChnel9za2lwKHN0YXRlLCBzdGF0ZS0+c2tpcCkgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogY2FuJ3QgcHVzaCBFT0YgKi8KLSAgICBpZiAoYyA8IDApCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIGlmIG91dHB1dCBidWZmZXIgZW1wdHksIHB1dCBieXRlIGF0IGVuZCAoYWxsb3dzIG1vcmUgcHVzaGluZykgKi8KLSAgICBpZiAoc3RhdGUtPnguaGF2ZSA9PSAwKSB7Ci0gICAgICAgIHN0YXRlLT54LmhhdmUgPSAxOwotICAgICAgICBzdGF0ZS0+eC5uZXh0ID0gc3RhdGUtPm91dCArIChzdGF0ZS0+c2l6ZSA8PCAxKSAtIDE7Ci0gICAgICAgIHN0YXRlLT54Lm5leHRbMF0gPSBjOwotICAgICAgICBzdGF0ZS0+eC5wb3MtLTsKLSAgICAgICAgc3RhdGUtPnBhc3QgPSAwOwotICAgICAgICByZXR1cm4gYzsKLSAgICB9Ci0KLSAgICAvKiBpZiBubyByb29tLCBnaXZlIHVwIChtdXN0IGhhdmUgYWxyZWFkeSBkb25lIGEgZ3p1bmdldGMoKSkgKi8KLSAgICBpZiAoc3RhdGUtPnguaGF2ZSA9PSAoc3RhdGUtPnNpemUgPDwgMSkpIHsKLSAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfREFUQV9FUlJPUiwgIm91dCBvZiByb29tIHRvIHB1c2ggY2hhcmFjdGVycyIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogc2xpZGUgb3V0cHV0IGRhdGEgaWYgbmVlZGVkIGFuZCBpbnNlcnQgYnl0ZSBiZWZvcmUgZXhpc3RpbmcgZGF0YSAqLwotICAgIGlmIChzdGF0ZS0+eC5uZXh0ID09IHN0YXRlLT5vdXQpIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqc3JjID0gc3RhdGUtPm91dCArIHN0YXRlLT54LmhhdmU7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QgPSBzdGF0ZS0+b3V0ICsgKHN0YXRlLT5zaXplIDw8IDEpOwotICAgICAgICB3aGlsZSAoc3JjID4gc3RhdGUtPm91dCkKLSAgICAgICAgICAgICotLWRlc3QgPSAqLS1zcmM7Ci0gICAgICAgIHN0YXRlLT54Lm5leHQgPSBkZXN0OwotICAgIH0KLSAgICBzdGF0ZS0+eC5oYXZlKys7Ci0gICAgc3RhdGUtPngubmV4dC0tOwotICAgIHN0YXRlLT54Lm5leHRbMF0gPSBjOwotICAgIHN0YXRlLT54LnBvcy0tOwotICAgIHN0YXRlLT5wYXN0ID0gMDsKLSAgICByZXR1cm4gYzsKLX0KLQotLyogLS0gc2VlIHpsaWIuaCAtLSAqLwotY2hhciAqIFpFWFBPUlQgZ3pnZXRzKGZpbGUsIGJ1ZiwgbGVuKQotICAgIGd6RmlsZSBmaWxlOwotICAgIGNoYXIgKmJ1ZjsKLSAgICBpbnQgbGVuOwotewotICAgIHVuc2lnbmVkIGxlZnQsIG47Ci0gICAgY2hhciAqc3RyOwotICAgIHVuc2lnbmVkIGNoYXIgKmVvbDsKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci0KLSAgICAvKiBjaGVjayBwYXJhbWV0ZXJzIGFuZCBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCi0gICAgaWYgKGZpbGUgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCB8fCBsZW4gPCAxKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKLQotICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgcmVhZGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIChzZXJpb3VzKSBlcnJvciAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9SRUFEIHx8Ci0gICAgICAgIChzdGF0ZS0+ZXJyICE9IFpfT0sgJiYgc3RhdGUtPmVyciAhPSBaX0JVRl9FUlJPUikpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyogcHJvY2VzcyBhIHNraXAgcmVxdWVzdCAqLwotICAgIGlmIChzdGF0ZS0+c2VlaykgewotICAgICAgICBzdGF0ZS0+c2VlayA9IDA7Ci0gICAgICAgIGlmIChnel9za2lwKHN0YXRlLCBzdGF0ZS0+c2tpcCkgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBjb3B5IG91dHB1dCBieXRlcyB1cCB0byBuZXcgbGluZSBvciBsZW4gLSAxLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QgLS0KLSAgICAgICBhcHBlbmQgYSB0ZXJtaW5hdGluZyB6ZXJvIHRvIHRoZSBzdHJpbmcgKHdlIGRvbid0IGNoZWNrIGZvciBhIHplcm8gaW4KLSAgICAgICB0aGUgY29udGVudHMsIGxldCB0aGUgdXNlciB3b3JyeSBhYm91dCB0aGF0KSAqLwotICAgIHN0ciA9IGJ1ZjsKLSAgICBsZWZ0ID0gKHVuc2lnbmVkKWxlbiAtIDE7Ci0gICAgaWYgKGxlZnQpIGRvIHsKLSAgICAgICAgLyogYXNzdXJlIHRoYXQgc29tZXRoaW5nIGlzIGluIHRoZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIGlmIChzdGF0ZS0+eC5oYXZlID09IDAgJiYgZ3pfZmV0Y2goc3RhdGUpID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIGVycm9yICovCi0gICAgICAgIGlmIChzdGF0ZS0+eC5oYXZlID09IDApIHsgICAgICAgLyogZW5kIG9mIGZpbGUgKi8KLSAgICAgICAgICAgIHN0YXRlLT5wYXN0ID0gMTsgICAgICAgICAgICAvKiByZWFkIHBhc3QgZW5kICovCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHdoYXQgd2UgaGF2ZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyogbG9vayBmb3IgZW5kLW9mLWxpbmUgaW4gY3VycmVudCBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIG4gPSBzdGF0ZS0+eC5oYXZlID4gbGVmdCA/IGxlZnQgOiBzdGF0ZS0+eC5oYXZlOwotICAgICAgICBlb2wgPSBtZW1jaHIoc3RhdGUtPngubmV4dCwgJ1xuJywgbik7Ci0gICAgICAgIGlmIChlb2wgIT0gTlVMTCkKLSAgICAgICAgICAgIG4gPSAodW5zaWduZWQpKGVvbCAtIHN0YXRlLT54Lm5leHQpICsgMTsKLQotICAgICAgICAvKiBjb3B5IHRocm91Z2ggZW5kLW9mLWxpbmUsIG9yIHJlbWFpbmRlciBpZiBub3QgZm91bmQgKi8KLSAgICAgICAgbWVtY3B5KGJ1Ziwgc3RhdGUtPngubmV4dCwgbik7Ci0gICAgICAgIHN0YXRlLT54LmhhdmUgLT0gbjsKLSAgICAgICAgc3RhdGUtPngubmV4dCArPSBuOwotICAgICAgICBzdGF0ZS0+eC5wb3MgKz0gbjsKLSAgICAgICAgbGVmdCAtPSBuOwotICAgICAgICBidWYgKz0gbjsKLSAgICB9IHdoaWxlIChsZWZ0ICYmIGVvbCA9PSBOVUxMKTsKLQotICAgIC8qIHJldHVybiB0ZXJtaW5hdGVkIHN0cmluZywgb3IgaWYgbm90aGluZywgZW5kIG9mIGZpbGUgKi8KLSAgICBpZiAoYnVmID09IHN0cikKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYnVmWzBdID0gMDsKLSAgICByZXR1cm4gc3RyOwotfQotCi0vKiAtLSBzZWUgemxpYi5oIC0tICovCi1pbnQgWkVYUE9SVCBnemRpcmVjdChmaWxlKQotICAgIGd6RmlsZSBmaWxlOwotewotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLQotICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gMDsKLSAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKLQotICAgIC8qIGlmIHRoZSBzdGF0ZSBpcyBub3Qga25vd24sIGJ1dCB3ZSBjYW4gZmluZCBvdXQsIHRoZW4gZG8gc28gKHRoaXMgaXMKLSAgICAgICBtYWlubHkgZm9yIHJpZ2h0IGFmdGVyIGEgZ3pvcGVuKCkgb3IgZ3pkb3BlbigpKSAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBHWl9SRUFEICYmIHN0YXRlLT5ob3cgPT0gTE9PSyAmJiBzdGF0ZS0+eC5oYXZlID09IDApCi0gICAgICAgICh2b2lkKWd6X2xvb2soc3RhdGUpOwotCi0gICAgLyogcmV0dXJuIDEgaWYgdHJhbnNwYXJlbnQsIDAgaWYgcHJvY2Vzc2luZyBhIGd6aXAgc3RyZWFtICovCi0gICAgcmV0dXJuIHN0YXRlLT5kaXJlY3Q7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWludCBaRVhQT1JUIGd6Y2xvc2VfcihmaWxlKQotICAgIGd6RmlsZSBmaWxlOwotewotICAgIGludCByZXQsIGVycjsKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci0KLSAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCi0gICAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOwotCi0gICAgLyogY2hlY2sgdGhhdCB3ZSdyZSByZWFkaW5nICovCi0gICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQpCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLQotICAgIC8qIGZyZWUgbWVtb3J5IGFuZCBjbG9zZSBmaWxlICovCi0gICAgaWYgKHN0YXRlLT5zaXplKSB7Ci0gICAgICAgIGluZmxhdGVFbmQoJihzdGF0ZS0+c3RybSkpOwotICAgICAgICBmcmVlKHN0YXRlLT5vdXQpOwotICAgICAgICBmcmVlKHN0YXRlLT5pbik7Ci0gICAgfQotICAgIGVyciA9IHN0YXRlLT5lcnIgPT0gWl9CVUZfRVJST1IgPyBaX0JVRl9FUlJPUiA6IFpfT0s7Ci0gICAgZ3pfZXJyb3Ioc3RhdGUsIFpfT0ssIE5VTEwpOwotICAgIGZyZWUoc3RhdGUtPnBhdGgpOwotICAgIHJldCA9IGNsb3NlKHN0YXRlLT5mZCk7Ci0gICAgZnJlZShzdGF0ZSk7Ci0gICAgcmV0dXJuIHJldCA/IFpfRVJSTk8gOiBlcnI7Ci19CmRpZmYgLS1naXQgYS9zcmMvemxpYi9nendyaXRlLmMgYi9zcmMvemxpYi9nendyaXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Y2IzNDIuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvZ3p3cml0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTY1ICswLDAgQEAKLS8qIGd6d3JpdGUuYyAtLSB6bGliIGZ1bmN0aW9ucyBmb3Igd3JpdGluZyBnemlwIGZpbGVzCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMTAsIDIwMTEsIDIwMTIgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLSNpbmNsdWRlICJnemd1dHMuaCIKLQotLyogTG9jYWwgZnVuY3Rpb25zICovCi1sb2NhbCBpbnQgZ3pfaW5pdCBPRigoZ3pfc3RhdGVwKSk7Ci1sb2NhbCBpbnQgZ3pfY29tcCBPRigoZ3pfc3RhdGVwLCBpbnQpKTsKLWxvY2FsIGludCBnel96ZXJvIE9GKChnel9zdGF0ZXAsIHpfb2ZmNjRfdCkpOwotCi0vKiBJbml0aWFsaXplIHN0YXRlIGZvciB3cml0aW5nIGEgZ3ppcCBmaWxlLiAgTWFyayBpbml0aWFsaXphdGlvbiBieSBzZXR0aW5nCi0gICBzdGF0ZS0+c2l6ZSB0byBub24temVyby4gIFJldHVybiAtMSBvbiBmYWlsdXJlIG9yIDAgb24gc3VjY2Vzcy4gKi8KLWxvY2FsIGludCBnel9pbml0KHN0YXRlKQotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLXsKLSAgICBpbnQgcmV0OwotICAgIHpfc3RyZWFtcCBzdHJtID0gJihzdGF0ZS0+c3RybSk7Ci0KLSAgICAvKiBhbGxvY2F0ZSBpbnB1dCBidWZmZXIgKi8KLSAgICBzdGF0ZS0+aW4gPSBtYWxsb2Moc3RhdGUtPndhbnQpOwotICAgIGlmIChzdGF0ZS0+aW4gPT0gTlVMTCkgewotICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9NRU1fRVJST1IsICJvdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBvbmx5IG5lZWQgb3V0cHV0IGJ1ZmZlciBhbmQgZGVmbGF0ZSBzdGF0ZSBpZiBjb21wcmVzc2luZyAqLwotICAgIGlmICghc3RhdGUtPmRpcmVjdCkgewotICAgICAgICAvKiBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIHN0YXRlLT5vdXQgPSBtYWxsb2Moc3RhdGUtPndhbnQpOwotICAgICAgICBpZiAoc3RhdGUtPm91dCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHN0YXRlLT5pbik7Ci0gICAgICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9NRU1fRVJST1IsICJvdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBhbGxvY2F0ZSBkZWZsYXRlIG1lbW9yeSwgc2V0IHVwIGZvciBnemlwIGNvbXByZXNzaW9uICovCi0gICAgICAgIHN0cm0tPnphbGxvYyA9IFpfTlVMTDsKLSAgICAgICAgc3RybS0+emZyZWUgPSBaX05VTEw7Ci0gICAgICAgIHN0cm0tPm9wYXF1ZSA9IFpfTlVMTDsKLSAgICAgICAgcmV0ID0gZGVmbGF0ZUluaXQyKHN0cm0sIHN0YXRlLT5sZXZlbCwgWl9ERUZMQVRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9XQklUUyArIDE2LCBERUZfTUVNX0xFVkVMLCBzdGF0ZS0+c3RyYXRlZ3kpOwotICAgICAgICBpZiAocmV0ICE9IFpfT0spIHsKLSAgICAgICAgICAgIGZyZWUoc3RhdGUtPm91dCk7Ci0gICAgICAgICAgICBmcmVlKHN0YXRlLT5pbik7Ci0gICAgICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9NRU1fRVJST1IsICJvdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBtYXJrIHN0YXRlIGFzIGluaXRpYWxpemVkICovCi0gICAgc3RhdGUtPnNpemUgPSBzdGF0ZS0+d2FudDsKLQotICAgIC8qIGluaXRpYWxpemUgd3JpdGUgYnVmZmVyIGlmIGNvbXByZXNzaW5nICovCi0gICAgaWYgKCFzdGF0ZS0+ZGlyZWN0KSB7Ci0gICAgICAgIHN0cm0tPmF2YWlsX291dCA9IHN0YXRlLT5zaXplOwotICAgICAgICBzdHJtLT5uZXh0X291dCA9IHN0YXRlLT5vdXQ7Ci0gICAgICAgIHN0YXRlLT54Lm5leHQgPSBzdHJtLT5uZXh0X291dDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIENvbXByZXNzIHdoYXRldmVyIGlzIGF0IGF2YWlsX2luIGFuZCBuZXh0X2luIGFuZCB3cml0ZSB0byB0aGUgb3V0cHV0IGZpbGUuCi0gICBSZXR1cm4gLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3Igd3JpdGluZyB0byB0aGUgb3V0cHV0IGZpbGUsIG90aGVyd2lzZSAwLgotICAgZmx1c2ggaXMgYXNzdW1lZCB0byBiZSBhIHZhbGlkIGRlZmxhdGUoKSBmbHVzaCB2YWx1ZS4gIElmIGZsdXNoIGlzIFpfRklOSVNILAotICAgdGhlbiB0aGUgZGVmbGF0ZSgpIHN0YXRlIGlzIHJlc2V0IHRvIHN0YXJ0IGEgbmV3IGd6aXAgc3RyZWFtLiAgSWYgZ3otPmRpcmVjdAotICAgaXMgdHJ1ZSwgdGhlbiBzaW1wbHkgd3JpdGUgdG8gdGhlIG91dHB1dCBmaWxlIHdpdGhvdXQgY29tcHJlc3NpbmcsIGFuZAotICAgaWdub3JlIGZsdXNoLiAqLwotbG9jYWwgaW50IGd6X2NvbXAoc3RhdGUsIGZsdXNoKQotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLSAgICBpbnQgZmx1c2g7Ci17Ci0gICAgaW50IHJldCwgZ290OwotICAgIHVuc2lnbmVkIGhhdmU7Ci0gICAgel9zdHJlYW1wIHN0cm0gPSAmKHN0YXRlLT5zdHJtKTsKLQotICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRocm91Z2ggKi8KLSAgICBpZiAoc3RhdGUtPnNpemUgPT0gMCAmJiBnel9pbml0KHN0YXRlKSA9PSAtMSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgLyogd3JpdGUgZGlyZWN0bHkgaWYgcmVxdWVzdGVkICovCi0gICAgaWYgKHN0YXRlLT5kaXJlY3QpIHsKLSAgICAgICAgZ290ID0gd3JpdGUoc3RhdGUtPmZkLCBzdHJtLT5uZXh0X2luLCBzdHJtLT5hdmFpbF9pbik7Ci0gICAgICAgIGlmIChnb3QgPCAwIHx8ICh1bnNpZ25lZClnb3QgIT0gc3RybS0+YXZhaWxfaW4pIHsKLSAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX0VSUk5PLCB6c3RyZXJyb3IoKSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgc3RybS0+YXZhaWxfaW4gPSAwOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBydW4gZGVmbGF0ZSgpIG9uIHByb3ZpZGVkIGlucHV0IHVudGlsIGl0IHByb2R1Y2VzIG5vIG1vcmUgb3V0cHV0ICovCi0gICAgcmV0ID0gWl9PSzsKLSAgICBkbyB7Ci0gICAgICAgIC8qIHdyaXRlIG91dCBjdXJyZW50IGJ1ZmZlciBjb250ZW50cyBpZiBmdWxsLCBvciBpZiBmbHVzaGluZywgYnV0IGlmCi0gICAgICAgICAgIGRvaW5nIFpfRklOSVNIIHRoZW4gZG9uJ3Qgd3JpdGUgdW50aWwgd2UgZ2V0IHRvIFpfU1RSRUFNX0VORCAqLwotICAgICAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDAgfHwgKGZsdXNoICE9IFpfTk9fRkxVU0ggJiYKLSAgICAgICAgICAgIChmbHVzaCAhPSBaX0ZJTklTSCB8fCByZXQgPT0gWl9TVFJFQU1fRU5EKSkpIHsKLSAgICAgICAgICAgIGhhdmUgPSAodW5zaWduZWQpKHN0cm0tPm5leHRfb3V0IC0gc3RhdGUtPngubmV4dCk7Ci0gICAgICAgICAgICBpZiAoaGF2ZSAmJiAoKGdvdCA9IHdyaXRlKHN0YXRlLT5mZCwgc3RhdGUtPngubmV4dCwgaGF2ZSkpIDwgMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClnb3QgIT0gaGF2ZSkpIHsKLSAgICAgICAgICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9FUlJOTywgenN0cmVycm9yKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCkgewotICAgICAgICAgICAgICAgIHN0cm0tPmF2YWlsX291dCA9IHN0YXRlLT5zaXplOwotICAgICAgICAgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gc3RhdGUtPm91dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlLT54Lm5leHQgPSBzdHJtLT5uZXh0X291dDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNvbXByZXNzICovCi0gICAgICAgIGhhdmUgPSBzdHJtLT5hdmFpbF9vdXQ7Ci0gICAgICAgIHJldCA9IGRlZmxhdGUoc3RybSwgZmx1c2gpOwotICAgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VSUk9SKSB7Ci0gICAgICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9TVFJFQU1fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgImludGVybmFsIGVycm9yOiBkZWZsYXRlIHN0cmVhbSBjb3JydXB0Iik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaGF2ZSAtPSBzdHJtLT5hdmFpbF9vdXQ7Ci0gICAgfSB3aGlsZSAoaGF2ZSk7Ci0KLSAgICAvKiBpZiB0aGF0IGNvbXBsZXRlZCBhIGRlZmxhdGUgc3RyZWFtLCBhbGxvdyBhbm90aGVyIHRvIHN0YXJ0ICovCi0gICAgaWYgKGZsdXNoID09IFpfRklOSVNIKQotICAgICAgICBkZWZsYXRlUmVzZXQoc3RybSk7Ci0KLSAgICAvKiBhbGwgZG9uZSwgbm8gZXJyb3JzICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIENvbXByZXNzIGxlbiB6ZXJvcyB0byBvdXRwdXQuICBSZXR1cm4gLTEgb24gZXJyb3IsIDAgb24gc3VjY2Vzcy4gKi8KLWxvY2FsIGludCBnel96ZXJvKHN0YXRlLCBsZW4pCi0gICAgZ3pfc3RhdGVwIHN0YXRlOwotICAgIHpfb2ZmNjRfdCBsZW47Ci17Ci0gICAgaW50IGZpcnN0OwotICAgIHVuc2lnbmVkIG47Ci0gICAgel9zdHJlYW1wIHN0cm0gPSAmKHN0YXRlLT5zdHJtKTsKLQotICAgIC8qIGNvbnN1bWUgd2hhdGV2ZXIncyBsZWZ0IGluIHRoZSBpbnB1dCBidWZmZXIgKi8KLSAgICBpZiAoc3RybS0+YXZhaWxfaW4gJiYgZ3pfY29tcChzdGF0ZSwgWl9OT19GTFVTSCkgPT0gLTEpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIGNvbXByZXNzIGxlbiB6ZXJvcyAobGVuIGd1YXJhbnRlZWQgPiAwKSAqLwotICAgIGZpcnN0ID0gMTsKLSAgICB3aGlsZSAobGVuKSB7Ci0gICAgICAgIG4gPSBHVF9PRkYoc3RhdGUtPnNpemUpIHx8ICh6X29mZjY0X3Qpc3RhdGUtPnNpemUgPiBsZW4gPwotICAgICAgICAgICAgKHVuc2lnbmVkKWxlbiA6IHN0YXRlLT5zaXplOwotICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgIG1lbXNldChzdGF0ZS0+aW4sIDAsIG4pOwotICAgICAgICAgICAgZmlyc3QgPSAwOwotICAgICAgICB9Ci0gICAgICAgIHN0cm0tPmF2YWlsX2luID0gbjsKLSAgICAgICAgc3RybS0+bmV4dF9pbiA9IHN0YXRlLT5pbjsKLSAgICAgICAgc3RhdGUtPngucG9zICs9IG47Ci0gICAgICAgIGlmIChnel9jb21wKHN0YXRlLCBaX05PX0ZMVVNIKSA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgbGVuIC09IG47Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKiAtLSBzZWUgemxpYi5oIC0tICovCi1pbnQgWkVYUE9SVCBnendyaXRlKGZpbGUsIGJ1ZiwgbGVuKQotICAgIGd6RmlsZSBmaWxlOwotICAgIHZvaWRwYyBidWY7Ci0gICAgdW5zaWduZWQgbGVuOwotewotICAgIHVuc2lnbmVkIHB1dCA9IGxlbjsKLSAgICB1bnNpZ25lZCBuOwotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLSAgICB6X3N0cmVhbXAgc3RybTsKLQotICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gMDsKLSAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKLSAgICBzdHJtID0gJihzdGF0ZS0+c3RybSk7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogc2luY2UgYW4gaW50IGlzIHJldHVybmVkLCBtYWtlIHN1cmUgbGVuIGZpdHMgaW4gb25lLCBvdGhlcndpc2UgcmV0dXJuCi0gICAgICAgd2l0aCBhbiBlcnJvciAodGhpcyBhdm9pZHMgdGhlIGZsYXcgaW4gdGhlIGludGVyZmFjZSkgKi8KLSAgICBpZiAoKGludClsZW4gPCAwKSB7Ci0gICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX0RBVEFfRVJST1IsICJyZXF1ZXN0ZWQgbGVuZ3RoIGRvZXMgbm90IGZpdCBpbiBpbnQiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogaWYgbGVuIGlzIHplcm8sIGF2b2lkIHVubmVjZXNzYXJ5IG9wZXJhdGlvbnMgKi8KLSAgICBpZiAobGVuID09IDApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogYWxsb2NhdGUgbWVtb3J5IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCAqLwotICAgIGlmIChzdGF0ZS0+c2l6ZSA9PSAwICYmIGd6X2luaXQoc3RhdGUpID09IC0xKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIGNoZWNrIGZvciBzZWVrIHJlcXVlc3QgKi8KLSAgICBpZiAoc3RhdGUtPnNlZWspIHsKLSAgICAgICAgc3RhdGUtPnNlZWsgPSAwOwotICAgICAgICBpZiAoZ3pfemVybyhzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogZm9yIHNtYWxsIGxlbiwgY29weSB0byBpbnB1dCBidWZmZXIsIG90aGVyd2lzZSBjb21wcmVzcyBkaXJlY3RseSAqLwotICAgIGlmIChsZW4gPCBzdGF0ZS0+c2l6ZSkgewotICAgICAgICAvKiBjb3B5IHRvIGlucHV0IGJ1ZmZlciwgY29tcHJlc3Mgd2hlbiBmdWxsICovCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmIChzdHJtLT5hdmFpbF9pbiA9PSAwKQotICAgICAgICAgICAgICAgIHN0cm0tPm5leHRfaW4gPSBzdGF0ZS0+aW47Ci0gICAgICAgICAgICBuID0gc3RhdGUtPnNpemUgLSBzdHJtLT5hdmFpbF9pbjsKLSAgICAgICAgICAgIGlmIChuID4gbGVuKQotICAgICAgICAgICAgICAgIG4gPSBsZW47Ci0gICAgICAgICAgICBtZW1jcHkoc3RybS0+bmV4dF9pbiArIHN0cm0tPmF2YWlsX2luLCBidWYsIG4pOwotICAgICAgICAgICAgc3RybS0+YXZhaWxfaW4gKz0gbjsKLSAgICAgICAgICAgIHN0YXRlLT54LnBvcyArPSBuOwotICAgICAgICAgICAgYnVmID0gKGNoYXIgKilidWYgKyBuOwotICAgICAgICAgICAgbGVuIC09IG47Ci0gICAgICAgICAgICBpZiAobGVuICYmIGd6X2NvbXAoc3RhdGUsIFpfTk9fRkxVU0gpID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9IHdoaWxlIChsZW4pOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogY29uc3VtZSB3aGF0ZXZlcidzIGxlZnQgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLwotICAgICAgICBpZiAoc3RybS0+YXZhaWxfaW4gJiYgZ3pfY29tcChzdGF0ZSwgWl9OT19GTFVTSCkgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAvKiBkaXJlY3RseSBjb21wcmVzcyB1c2VyIGJ1ZmZlciB0byBmaWxlICovCi0gICAgICAgIHN0cm0tPmF2YWlsX2luID0gbGVuOwotICAgICAgICBzdHJtLT5uZXh0X2luID0gKHZvaWRwKWJ1ZjsKLSAgICAgICAgc3RhdGUtPngucG9zICs9IGxlbjsKLSAgICAgICAgaWYgKGd6X2NvbXAoc3RhdGUsIFpfTk9fRkxVU0gpID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogaW5wdXQgd2FzIGFsbCBidWZmZXJlZCBvciBjb21wcmVzc2VkIChwdXQgd2lsbCBmaXQgaW4gaW50KSAqLwotICAgIHJldHVybiAoaW50KXB1dDsKLX0KLQotLyogLS0gc2VlIHpsaWIuaCAtLSAqLwotaW50IFpFWFBPUlQgZ3pwdXRjKGZpbGUsIGMpCi0gICAgZ3pGaWxlIGZpbGU7Ci0gICAgaW50IGM7Ci17Ci0gICAgdW5zaWduZWQgY2hhciBidWZbMV07Ci0gICAgZ3pfc3RhdGVwIHN0YXRlOwotICAgIHpfc3RyZWFtcCBzdHJtOwotCi0gICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLwotICAgIGlmIChmaWxlID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKLSAgICBzdHJtID0gJihzdGF0ZS0+c3RybSk7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIGNoZWNrIGZvciBzZWVrIHJlcXVlc3QgKi8KLSAgICBpZiAoc3RhdGUtPnNlZWspIHsKLSAgICAgICAgc3RhdGUtPnNlZWsgPSAwOwotICAgICAgICBpZiAoZ3pfemVybyhzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIHRyeSB3cml0aW5nIHRvIGlucHV0IGJ1ZmZlciBmb3Igc3BlZWQgKHN0YXRlLT5zaXplID09IDAgaWYgYnVmZmVyIG5vdAotICAgICAgIGluaXRpYWxpemVkKSAqLwotICAgIGlmIChzdHJtLT5hdmFpbF9pbiA8IHN0YXRlLT5zaXplKSB7Ci0gICAgICAgIGlmIChzdHJtLT5hdmFpbF9pbiA9PSAwKQotICAgICAgICAgICAgc3RybS0+bmV4dF9pbiA9IHN0YXRlLT5pbjsKLSAgICAgICAgc3RybS0+bmV4dF9pbltzdHJtLT5hdmFpbF9pbisrXSA9IGM7Ci0gICAgICAgIHN0YXRlLT54LnBvcysrOwotICAgICAgICByZXR1cm4gYyAmIDB4ZmY7Ci0gICAgfQotCi0gICAgLyogbm8gcm9vbSBpbiBidWZmZXIgb3Igbm90IGluaXRpYWxpemVkLCB1c2UgZ3pfd3JpdGUoKSAqLwotICAgIGJ1ZlswXSA9IGM7Ci0gICAgaWYgKGd6d3JpdGUoZmlsZSwgYnVmLCAxKSAhPSAxKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgcmV0dXJuIGMgJiAweGZmOwotfQotCi0vKiAtLSBzZWUgemxpYi5oIC0tICovCi1pbnQgWkVYUE9SVCBnenB1dHMoZmlsZSwgc3RyKQotICAgIGd6RmlsZSBmaWxlOwotICAgIGNvbnN0IGNoYXIgKnN0cjsKLXsKLSAgICBpbnQgcmV0OwotICAgIHVuc2lnbmVkIGxlbjsKLQotICAgIC8qIHdyaXRlIHN0cmluZyAqLwotICAgIGxlbiA9ICh1bnNpZ25lZClzdHJsZW4oc3RyKTsKLSAgICByZXQgPSBnendyaXRlKGZpbGUsIHN0ciwgbGVuKTsKLSAgICByZXR1cm4gcmV0ID09IDAgJiYgbGVuICE9IDAgPyAtMSA6IHJldDsKLX0KLQotI2lmIGRlZmluZWQoU1REQykgfHwgZGVmaW5lZChaX0hBVkVfU1REQVJHX0gpCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWludCBaRVhQT1JUVkEgZ3pwcmludGYgKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLXsKLSAgICBpbnQgc2l6ZSwgbGVuOwotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLSAgICB6X3N0cmVhbXAgc3RybTsKLSAgICB2YV9saXN0IHZhOwotCi0gICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLwotICAgIGlmIChmaWxlID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKLSAgICBzdHJtID0gJihzdGF0ZS0+c3RybSk7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBidWZmZXIgc3BhY2UgKi8KLSAgICBpZiAoc3RhdGUtPnNpemUgPT0gMCAmJiBnel9pbml0KHN0YXRlKSA9PSAtMSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBjaGVjayBmb3Igc2VlayByZXF1ZXN0ICovCi0gICAgaWYgKHN0YXRlLT5zZWVrKSB7Ci0gICAgICAgIHN0YXRlLT5zZWVrID0gMDsKLSAgICAgICAgaWYgKGd6X3plcm8oc3RhdGUsIHN0YXRlLT5za2lwKSA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIGNvbnN1bWUgd2hhdGV2ZXIncyBsZWZ0IGluIHRoZSBpbnB1dCBidWZmZXIgKi8KLSAgICBpZiAoc3RybS0+YXZhaWxfaW4gJiYgZ3pfY29tcChzdGF0ZSwgWl9OT19GTFVTSCkgPT0gLTEpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogZG8gdGhlIHByaW50ZigpIGludG8gdGhlIGlucHV0IGJ1ZmZlciwgcHV0IGxlbmd0aCBpbiBsZW4gKi8KLSAgICBzaXplID0gKGludCkoc3RhdGUtPnNpemUpOwotICAgIHN0YXRlLT5pbltzaXplIC0gMV0gPSAwOwotICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotI2lmZGVmIE5PX3ZzbnByaW50ZgotIyAgaWZkZWYgSEFTX3ZzcHJpbnRmX3ZvaWQKLSAgICAodm9pZCl2c3ByaW50ZigoY2hhciAqKShzdGF0ZS0+aW4pLCBmb3JtYXQsIHZhKTsKLSAgICB2YV9lbmQodmEpOwotICAgIGZvciAobGVuID0gMDsgbGVuIDwgc2l6ZTsgbGVuKyspCi0gICAgICAgIGlmIChzdGF0ZS0+aW5bbGVuXSA9PSAwKSBicmVhazsKLSMgIGVsc2UKLSAgICBsZW4gPSB2c3ByaW50ZigoY2hhciAqKShzdGF0ZS0+aW4pLCBmb3JtYXQsIHZhKTsKLSAgICB2YV9lbmQodmEpOwotIyAgZW5kaWYKLSNlbHNlCi0jICBpZmRlZiBIQVNfdnNucHJpbnRmX3ZvaWQKLSAgICAodm9pZCl2c25wcmludGYoKGNoYXIgKikoc3RhdGUtPmluKSwgc2l6ZSwgZm9ybWF0LCB2YSk7Ci0gICAgdmFfZW5kKHZhKTsKLSAgICBsZW4gPSBzdHJsZW4oKGNoYXIgKikoc3RhdGUtPmluKSk7Ci0jICBlbHNlCi0gICAgbGVuID0gdnNucHJpbnRmKChjaGFyICopKHN0YXRlLT5pbiksIHNpemUsIGZvcm1hdCwgdmEpOwotICAgIHZhX2VuZCh2YSk7Ci0jICBlbmRpZgotI2VuZGlmCi0KLSAgICAvKiBjaGVjayB0aGF0IHByaW50ZigpIHJlc3VsdHMgZml0IGluIGJ1ZmZlciAqLwotICAgIGlmIChsZW4gPD0gMCB8fCBsZW4gPj0gKGludClzaXplIHx8IHN0YXRlLT5pbltzaXplIC0gMV0gIT0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiB1cGRhdGUgYnVmZmVyIGFuZCBwb3NpdGlvbiwgZGVmZXIgY29tcHJlc3Npb24gdW50aWwgbmVlZGVkICovCi0gICAgc3RybS0+YXZhaWxfaW4gPSAodW5zaWduZWQpbGVuOwotICAgIHN0cm0tPm5leHRfaW4gPSBzdGF0ZS0+aW47Ci0gICAgc3RhdGUtPngucG9zICs9IGxlbjsKLSAgICByZXR1cm4gbGVuOwotfQotCi0jZWxzZSAvKiAhU1REQyAmJiAhWl9IQVZFX1NUREFSR19IICovCi0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWludCBaRVhQT1JUVkEgZ3pwcmludGYgKGZpbGUsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLAotICAgICAgICAgICAgICAgICAgICAgICBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApCi0gICAgZ3pGaWxlIGZpbGU7Ci0gICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgIGludCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsCi0gICAgICAgIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMDsKLXsKLSAgICBpbnQgc2l6ZSwgbGVuOwotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLSAgICB6X3N0cmVhbXAgc3RybTsKLQotICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0gICAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOwotCi0gICAgLyogY2hlY2sgdGhhdCBjYW4gcmVhbGx5IHBhc3MgcG9pbnRlciBpbiBpbnRzICovCi0gICAgaWYgKHNpemVvZihpbnQpICE9IHNpemVvZih2b2lkICopKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgd3JpdGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIGVycm9yICovCi0gICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFIHx8IHN0YXRlLT5lcnIgIT0gWl9PSykKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBtYWtlIHN1cmUgd2UgaGF2ZSBzb21lIGJ1ZmZlciBzcGFjZSAqLwotICAgIGlmIChzdGF0ZS0+c2l6ZSA9PSAwICYmIGd6X2luaXQoc3RhdGUpID09IC0xKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIGNoZWNrIGZvciBzZWVrIHJlcXVlc3QgKi8KLSAgICBpZiAoc3RhdGUtPnNlZWspIHsKLSAgICAgICAgc3RhdGUtPnNlZWsgPSAwOwotICAgICAgICBpZiAoZ3pfemVybyhzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogY29uc3VtZSB3aGF0ZXZlcidzIGxlZnQgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLwotICAgIGlmIChzdHJtLT5hdmFpbF9pbiAmJiBnel9jb21wKHN0YXRlLCBaX05PX0ZMVVNIKSA9PSAtMSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBkbyB0aGUgcHJpbnRmKCkgaW50byB0aGUgaW5wdXQgYnVmZmVyLCBwdXQgbGVuZ3RoIGluIGxlbiAqLwotICAgIHNpemUgPSAoaW50KShzdGF0ZS0+c2l6ZSk7Ci0gICAgc3RhdGUtPmluW3NpemUgLSAxXSA9IDA7Ci0jaWZkZWYgTk9fc25wcmludGYKLSMgIGlmZGVmIEhBU19zcHJpbnRmX3ZvaWQKLSAgICBzcHJpbnRmKChjaGFyICopKHN0YXRlLT5pbiksIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LAotICAgICAgICAgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKLSAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IHNpemU7IGxlbisrKQotICAgICAgICBpZiAoc3RhdGUtPmluW2xlbl0gPT0gMCkgYnJlYWs7Ci0jICBlbHNlCi0gICAgbGVuID0gc3ByaW50ZigoY2hhciAqKShzdGF0ZS0+aW4pLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKLSAgICAgICAgICAgICAgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7Ci0jICBlbmRpZgotI2Vsc2UKLSMgIGlmZGVmIEhBU19zbnByaW50Zl92b2lkCi0gICAgc25wcmludGYoKGNoYXIgKikoc3RhdGUtPmluKSwgc2l6ZSwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsCi0gICAgICAgICAgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKLSAgICBsZW4gPSBzdHJsZW4oKGNoYXIgKikoc3RhdGUtPmluKSk7Ci0jICBlbHNlCi0gICAgbGVuID0gc25wcmludGYoKGNoYXIgKikoc3RhdGUtPmluKSwgc2l6ZSwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LAotICAgICAgICAgICAgICAgICAgIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsCi0gICAgICAgICAgICAgICAgICAgYTE5LCBhMjApOwotIyAgZW5kaWYKLSNlbmRpZgotCi0gICAgLyogY2hlY2sgdGhhdCBwcmludGYoKSByZXN1bHRzIGZpdCBpbiBidWZmZXIgKi8KLSAgICBpZiAobGVuIDw9IDAgfHwgbGVuID49IChpbnQpc2l6ZSB8fCBzdGF0ZS0+aW5bc2l6ZSAtIDFdICE9IDApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogdXBkYXRlIGJ1ZmZlciBhbmQgcG9zaXRpb24sIGRlZmVyIGNvbXByZXNzaW9uIHVudGlsIG5lZWRlZCAqLwotICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKWxlbjsKLSAgICBzdHJtLT5uZXh0X2luID0gc3RhdGUtPmluOwotICAgIHN0YXRlLT54LnBvcyArPSBsZW47Ci0gICAgcmV0dXJuIGxlbjsKLX0KLQotI2VuZGlmCi0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWludCBaRVhQT1JUIGd6Zmx1c2goZmlsZSwgZmx1c2gpCi0gICAgZ3pGaWxlIGZpbGU7Ci0gICAgaW50IGZsdXNoOwotewotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLQotICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLQotICAgIC8qIGNoZWNrIGZsdXNoIHBhcmFtZXRlciAqLwotICAgIGlmIChmbHVzaCA8IDAgfHwgZmx1c2ggPiBaX0ZJTklTSCkKLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotCi0gICAgLyogY2hlY2sgZm9yIHNlZWsgcmVxdWVzdCAqLwotICAgIGlmIChzdGF0ZS0+c2VlaykgewotICAgICAgICBzdGF0ZS0+c2VlayA9IDA7Ci0gICAgICAgIGlmIChnel96ZXJvKHN0YXRlLCBzdGF0ZS0+c2tpcCkgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogY29tcHJlc3MgcmVtYWluaW5nIGRhdGEgd2l0aCByZXF1ZXN0ZWQgZmx1c2ggKi8KLSAgICBnel9jb21wKHN0YXRlLCBmbHVzaCk7Ci0gICAgcmV0dXJuIHN0YXRlLT5lcnI7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWludCBaRVhQT1JUIGd6c2V0cGFyYW1zKGZpbGUsIGxldmVsLCBzdHJhdGVneSkKLSAgICBnekZpbGUgZmlsZTsKLSAgICBpbnQgbGV2ZWw7Ci0gICAgaW50IHN0cmF0ZWd5OwotewotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLSAgICB6X3N0cmVhbXAgc3RybTsKLQotICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0gICAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOwotCi0gICAgLyogY2hlY2sgdGhhdCB3ZSdyZSB3cml0aW5nIGFuZCB0aGF0IHRoZXJlJ3Mgbm8gZXJyb3IgKi8KLSAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUgfHwgc3RhdGUtPmVyciAhPSBaX09LKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0KLSAgICAvKiBpZiBubyBjaGFuZ2UgaXMgcmVxdWVzdGVkLCB0aGVuIGRvIG5vdGhpbmcgKi8KLSAgICBpZiAobGV2ZWwgPT0gc3RhdGUtPmxldmVsICYmIHN0cmF0ZWd5ID09IHN0YXRlLT5zdHJhdGVneSkKLSAgICAgICAgcmV0dXJuIFpfT0s7Ci0KLSAgICAvKiBjaGVjayBmb3Igc2VlayByZXF1ZXN0ICovCi0gICAgaWYgKHN0YXRlLT5zZWVrKSB7Ci0gICAgICAgIHN0YXRlLT5zZWVrID0gMDsKLSAgICAgICAgaWYgKGd6X3plcm8oc3RhdGUsIHN0YXRlLT5za2lwKSA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBjaGFuZ2UgY29tcHJlc3Npb24gcGFyYW1ldGVycyBmb3Igc3Vic2VxdWVudCBpbnB1dCAqLwotICAgIGlmIChzdGF0ZS0+c2l6ZSkgewotICAgICAgICAvKiBmbHVzaCBwcmV2aW91cyBpbnB1dCB3aXRoIHByZXZpb3VzIHBhcmFtZXRlcnMgYmVmb3JlIGNoYW5naW5nICovCi0gICAgICAgIGlmIChzdHJtLT5hdmFpbF9pbiAmJiBnel9jb21wKHN0YXRlLCBaX1BBUlRJQUxfRkxVU0gpID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRlLT5lcnI7Ci0gICAgICAgIGRlZmxhdGVQYXJhbXMoc3RybSwgbGV2ZWwsIHN0cmF0ZWd5KTsKLSAgICB9Ci0gICAgc3RhdGUtPmxldmVsID0gbGV2ZWw7Ci0gICAgc3RhdGUtPnN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWludCBaRVhQT1JUIGd6Y2xvc2VfdyhmaWxlKQotICAgIGd6RmlsZSBmaWxlOwotewotICAgIGludCByZXQgPSBaX09LOwotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLQotICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgKi8KLSAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLQotICAgIC8qIGNoZWNrIGZvciBzZWVrIHJlcXVlc3QgKi8KLSAgICBpZiAoc3RhdGUtPnNlZWspIHsKLSAgICAgICAgc3RhdGUtPnNlZWsgPSAwOwotICAgICAgICBpZiAoZ3pfemVybyhzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQotICAgICAgICAgICAgcmV0ID0gc3RhdGUtPmVycjsKLSAgICB9Ci0KLSAgICAvKiBmbHVzaCwgZnJlZSBtZW1vcnksIGFuZCBjbG9zZSBmaWxlICovCi0gICAgaWYgKHN0YXRlLT5zaXplKSB7Ci0gICAgICAgIGlmIChnel9jb21wKHN0YXRlLCBaX0ZJTklTSCkgPT0gLTEpCi0gICAgICAgICAgICByZXQgPSBzdGF0ZS0+ZXJyOwotICAgICAgICBpZiAoIXN0YXRlLT5kaXJlY3QpIHsKLSAgICAgICAgICAgICh2b2lkKWRlZmxhdGVFbmQoJihzdGF0ZS0+c3RybSkpOwotICAgICAgICAgICAgZnJlZShzdGF0ZS0+b3V0KTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHN0YXRlLT5pbik7Ci0gICAgfQotICAgIGd6X2Vycm9yKHN0YXRlLCBaX09LLCBOVUxMKTsKLSAgICBmcmVlKHN0YXRlLT5wYXRoKTsKLSAgICBpZiAoY2xvc2Uoc3RhdGUtPmZkKSA9PSAtMSkKLSAgICAgICAgcmV0ID0gWl9FUlJOTzsKLSAgICBmcmVlKHN0YXRlKTsKLSAgICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvaW5mYmFjay5jIGIvc3JjL3psaWIvaW5mYmFjay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODFhZmYxLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2luZmJhY2suYworKysgL2Rldi9udWxsCkBAIC0xLDY0MCArMCwwIEBACi0vKiBpbmZiYWNrLmMgLS0gaW5mbGF0ZSB1c2luZyBhIGNhbGwtYmFjayBpbnRlcmZhY2UKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDExIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKgotICAgVGhpcyBjb2RlIGlzIGxhcmdlbHkgY29waWVkIGZyb20gaW5mbGF0ZS5jLiAgTm9ybWFsbHkgZWl0aGVyIGluZmJhY2subyBvcgotICAgaW5mbGF0ZS5vIHdvdWxkIGJlIGxpbmtlZCBpbnRvIGFuIGFwcGxpY2F0aW9uLS1ub3QgYm90aC4gIFRoZSBpbnRlcmZhY2UKLSAgIHdpdGggaW5mZmFzdC5jIGlzIHJldGFpbmVkIHNvIHRoYXQgb3B0aW1pemVkIGFzc2VtYmxlci1jb2RlZCB2ZXJzaW9ucyBvZgotICAgaW5mbGF0ZV9mYXN0KCkgY2FuIGJlIHVzZWQgd2l0aCBlaXRoZXIgaW5mbGF0ZS5jIG9yIGluZmJhY2suYy4KLSAqLwotCi0jaW5jbHVkZSAienV0aWwuaCIKLSNpbmNsdWRlICJpbmZ0cmVlcy5oIgotI2luY2x1ZGUgImluZmxhdGUuaCIKLSNpbmNsdWRlICJpbmZmYXN0LmgiCi0KLS8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLWxvY2FsIHZvaWQgZml4ZWR0YWJsZXMgT0YoKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGUpKTsKLQotLyoKLSAgIHN0cm0gcHJvdmlkZXMgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGluIHphbGxvYyBhbmQgemZyZWUsIG9yCi0gICBaX05VTEwgdG8gdXNlIHRoZSBsaWJyYXJ5IG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KLQotICAgd2luZG93Qml0cyBpcyBpbiB0aGUgcmFuZ2UgOC4uMTUsIGFuZCB3aW5kb3cgaXMgYSB1c2VyLXN1cHBsaWVkCi0gICB3aW5kb3cgYW5kIG91dHB1dCBidWZmZXIgdGhhdCBpcyAyKip3aW5kb3dCaXRzIGJ5dGVzLgotICovCi1pbnQgWkVYUE9SVCBpbmZsYXRlQmFja0luaXRfKHN0cm0sIHdpbmRvd0JpdHMsIHdpbmRvdywgdmVyc2lvbiwgc3RyZWFtX3NpemUpCi16X3N0cmVhbXAgc3RybTsKLWludCB3aW5kb3dCaXRzOwotdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdzsKLWNvbnN0IGNoYXIgKnZlcnNpb247Ci1pbnQgc3RyZWFtX3NpemU7Ci17Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLQotICAgIGlmICh2ZXJzaW9uID09IFpfTlVMTCB8fCB2ZXJzaW9uWzBdICE9IFpMSUJfVkVSU0lPTlswXSB8fAotICAgICAgICBzdHJlYW1fc2l6ZSAhPSAoaW50KShzaXplb2Yoel9zdHJlYW0pKSkKLSAgICAgICAgcmV0dXJuIFpfVkVSU0lPTl9FUlJPUjsKLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgd2luZG93ID09IFpfTlVMTCB8fAotICAgICAgICB3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdHJtLT5tc2cgPSBaX05VTEw7ICAgICAgICAgICAgICAgICAvKiBpbiBjYXNlIHdlIHJldHVybiBhbiBlcnJvciAqLwotICAgIGlmIChzdHJtLT56YWxsb2MgPT0gKGFsbG9jX2Z1bmMpMCkgewotI2lmZGVmIFpfU09MTwotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0jZWxzZQotICAgICAgICBzdHJtLT56YWxsb2MgPSB6Y2FsbG9jOwotICAgICAgICBzdHJtLT5vcGFxdWUgPSAodm9pZHBmKTA7Ci0jZW5kaWYKLSAgICB9Ci0gICAgaWYgKHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkKLSNpZmRlZiBaX1NPTE8KLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotI2Vsc2UKLSAgICBzdHJtLT56ZnJlZSA9IHpjZnJlZTsKLSNlbmRpZgotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKVpBTExPQyhzdHJtLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKLSAgICBpZiAoc3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7Ci0gICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBhbGxvY2F0ZWRcbiIpKTsKLSAgICBzdHJtLT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopc3RhdGU7Ci0gICAgc3RhdGUtPmRtYXggPSAzMjc2OFU7Ci0gICAgc3RhdGUtPndiaXRzID0gd2luZG93Qml0czsKLSAgICBzdGF0ZS0+d3NpemUgPSAxVSA8PCB3aW5kb3dCaXRzOwotICAgIHN0YXRlLT53aW5kb3cgPSB3aW5kb3c7Ci0gICAgc3RhdGUtPnduZXh0ID0gMDsKLSAgICBzdGF0ZS0+d2hhdmUgPSAwOwotICAgIHJldHVybiBaX09LOwotfQotCi0vKgotICAgUmV0dXJuIHN0YXRlIHdpdGggbGVuZ3RoIGFuZCBkaXN0YW5jZSBkZWNvZGluZyB0YWJsZXMgYW5kIGluZGV4IHNpemVzIHNldCB0bwotICAgZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLgotICAgSWYgQlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZQotICAgZmlyc3QgdGltZSBpdCdzIGNhbGxlZCwgYW5kIHJldHVybnMgdGhvc2UgdGFibGVzIHRoZSBmaXJzdCB0aW1lIGFuZAotICAgdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW4KLSAgIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRpb24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZQotICAgdXNlZCBmb3IgdGhyZWFkZWQgYXBwbGljYXRpb25zLCBzaW5jZSB0aGUgcmV3cml0aW5nIG9mIHRoZSB0YWJsZXMgYW5kIHZpcmdpbgotICAgbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS4KLSAqLwotbG9jYWwgdm9pZCBmaXhlZHRhYmxlcyhzdGF0ZSkKLXN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci17Ci0jaWZkZWYgQlVJTERGSVhFRAotICAgIHN0YXRpYyBpbnQgdmlyZ2luID0gMTsKLSAgICBzdGF0aWMgY29kZSAqbGVuZml4LCAqZGlzdGZpeDsKLSAgICBzdGF0aWMgY29kZSBmaXhlZFs1NDRdOwotCi0gICAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi8KLSAgICBpZiAodmlyZ2luKSB7Ci0gICAgICAgIHVuc2lnbmVkIHN5bSwgYml0czsKLSAgICAgICAgc3RhdGljIGNvZGUgKm5leHQ7Ci0KLSAgICAgICAgLyogbGl0ZXJhbC9sZW5ndGggdGFibGUgKi8KLSAgICAgICAgc3ltID0gMDsKLSAgICAgICAgd2hpbGUgKHN5bSA8IDE0NCkgc3RhdGUtPmxlbnNbc3ltKytdID0gODsKLSAgICAgICAgd2hpbGUgKHN5bSA8IDI1Nikgc3RhdGUtPmxlbnNbc3ltKytdID0gOTsKLSAgICAgICAgd2hpbGUgKHN5bSA8IDI4MCkgc3RhdGUtPmxlbnNbc3ltKytdID0gNzsKLSAgICAgICAgd2hpbGUgKHN5bSA8IDI4OCkgc3RhdGUtPmxlbnNbc3ltKytdID0gODsKLSAgICAgICAgbmV4dCA9IGZpeGVkOwotICAgICAgICBsZW5maXggPSBuZXh0OwotICAgICAgICBiaXRzID0gOTsKLSAgICAgICAgaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS0+bGVucywgMjg4LCAmKG5leHQpLCAmKGJpdHMpLCBzdGF0ZS0+d29yayk7Ci0KLSAgICAgICAgLyogZGlzdGFuY2UgdGFibGUgKi8KLSAgICAgICAgc3ltID0gMDsKLSAgICAgICAgd2hpbGUgKHN5bSA8IDMyKSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA1OwotICAgICAgICBkaXN0Zml4ID0gbmV4dDsKLSAgICAgICAgYml0cyA9IDU7Ci0gICAgICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLT5sZW5zLCAzMiwgJihuZXh0KSwgJihiaXRzKSwgc3RhdGUtPndvcmspOwotCi0gICAgICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovCi0gICAgICAgIHZpcmdpbiA9IDA7Ci0gICAgfQotI2Vsc2UgLyogIUJVSUxERklYRUQgKi8KLSMgICBpbmNsdWRlICJpbmZmaXhlZC5oIgotI2VuZGlmIC8qIEJVSUxERklYRUQgKi8KLSAgICBzdGF0ZS0+bGVuY29kZSA9IGxlbmZpeDsKLSAgICBzdGF0ZS0+bGVuYml0cyA9IDk7Ci0gICAgc3RhdGUtPmRpc3Rjb2RlID0gZGlzdGZpeDsKLSAgICBzdGF0ZS0+ZGlzdGJpdHMgPSA1OwotfQotCi0vKiBNYWNyb3MgZm9yIGluZmxhdGVCYWNrKCk6ICovCi0KLS8qIExvYWQgcmV0dXJuZWQgc3RhdGUgZnJvbSBpbmZsYXRlX2Zhc3QoKSAqLwotI2RlZmluZSBMT0FEKCkgXAotICAgIGRvIHsgXAotICAgICAgICBwdXQgPSBzdHJtLT5uZXh0X291dDsgXAotICAgICAgICBsZWZ0ID0gc3RybS0+YXZhaWxfb3V0OyBcCi0gICAgICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOyBcCi0gICAgICAgIGhhdmUgPSBzdHJtLT5hdmFpbF9pbjsgXAotICAgICAgICBob2xkID0gc3RhdGUtPmhvbGQ7IFwKLSAgICAgICAgYml0cyA9IHN0YXRlLT5iaXRzOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogU2V0IHN0YXRlIGZyb20gcmVnaXN0ZXJzIGZvciBpbmZsYXRlX2Zhc3QoKSAqLwotI2RlZmluZSBSRVNUT1JFKCkgXAotICAgIGRvIHsgXAotICAgICAgICBzdHJtLT5uZXh0X291dCA9IHB1dDsgXAotICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBsZWZ0OyBcCi0gICAgICAgIHN0cm0tPm5leHRfaW4gPSBuZXh0OyBcCi0gICAgICAgIHN0cm0tPmF2YWlsX2luID0gaGF2ZTsgXAotICAgICAgICBzdGF0ZS0+aG9sZCA9IGhvbGQ7IFwKLSAgICAgICAgc3RhdGUtPmJpdHMgPSBiaXRzOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogQ2xlYXIgdGhlIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqLwotI2RlZmluZSBJTklUQklUUygpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgaG9sZCA9IDA7IFwKLSAgICAgICAgYml0cyA9IDA7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBBc3N1cmUgdGhhdCBzb21lIGlucHV0IGlzIGF2YWlsYWJsZS4gIElmIGlucHV0IGlzIHJlcXVlc3RlZCwgYnV0IGRlbmllZCwKLSAgIHRoZW4gcmV0dXJuIGEgWl9CVUZfRVJST1IgZnJvbSBpbmZsYXRlQmFjaygpLiAqLwotI2RlZmluZSBQVUxMKCkgXAotICAgIGRvIHsgXAotICAgICAgICBpZiAoaGF2ZSA9PSAwKSB7IFwKLSAgICAgICAgICAgIGhhdmUgPSBpbihpbl9kZXNjLCAmbmV4dCk7IFwKLSAgICAgICAgICAgIGlmIChoYXZlID09IDApIHsgXAotICAgICAgICAgICAgICAgIG5leHQgPSBaX05VTEw7IFwKLSAgICAgICAgICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsgXAotICAgICAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOyBcCi0gICAgICAgICAgICB9IFwKLSAgICAgICAgfSBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogR2V0IGEgYnl0ZSBvZiBpbnB1dCBpbnRvIHRoZSBiaXQgYWNjdW11bGF0b3IsIG9yIHJldHVybiBmcm9tIGluZmxhdGVCYWNrKCkKLSAgIHdpdGggYW4gZXJyb3IgaWYgdGhlcmUgaXMgbm8gaW5wdXQgYXZhaWxhYmxlLiAqLwotI2RlZmluZSBQVUxMQllURSgpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgUFVMTCgpOyBcCi0gICAgICAgIGhhdmUtLTsgXAotICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKSgqbmV4dCsrKSA8PCBiaXRzOyBcCi0gICAgICAgIGJpdHMgKz0gODsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8qIEFzc3VyZSB0aGF0IHRoZXJlIGFyZSBhdCBsZWFzdCBuIGJpdHMgaW4gdGhlIGJpdCBhY2N1bXVsYXRvci4gIElmIHRoZXJlIGlzCi0gICBub3QgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dCB0byBkbyB0aGF0LCB0aGVuIHJldHVybiBmcm9tIGluZmxhdGVCYWNrKCkgd2l0aAotICAgYW4gZXJyb3IuICovCi0jZGVmaW5lIE5FRURCSVRTKG4pIFwKLSAgICBkbyB7IFwKLSAgICAgICAgd2hpbGUgKGJpdHMgPCAodW5zaWduZWQpKG4pKSBcCi0gICAgICAgICAgICBQVUxMQllURSgpOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogUmV0dXJuIHRoZSBsb3cgbiBiaXRzIG9mIHRoZSBiaXQgYWNjdW11bGF0b3IgKG4gPCAxNikgKi8KLSNkZWZpbmUgQklUUyhuKSBcCi0gICAgKCh1bnNpZ25lZClob2xkICYgKCgxVSA8PCAobikpIC0gMSkpCi0KLS8qIFJlbW92ZSBuIGJpdHMgZnJvbSB0aGUgYml0IGFjY3VtdWxhdG9yICovCi0jZGVmaW5lIERST1BCSVRTKG4pIFwKLSAgICBkbyB7IFwKLSAgICAgICAgaG9sZCA+Pj0gKG4pOyBcCi0gICAgICAgIGJpdHMgLT0gKHVuc2lnbmVkKShuKTsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8qIFJlbW92ZSB6ZXJvIHRvIHNldmVuIGJpdHMgYXMgbmVlZGVkIHRvIGdvIHRvIGEgYnl0ZSBib3VuZGFyeSAqLwotI2RlZmluZSBCWVRFQklUUygpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgaG9sZCA+Pj0gYml0cyAmIDc7IFwKLSAgICAgICAgYml0cyAtPSBiaXRzICYgNzsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8qIEFzc3VyZSB0aGF0IHNvbWUgb3V0cHV0IHNwYWNlIGlzIGF2YWlsYWJsZSwgYnkgd3JpdGluZyBvdXQgdGhlIHdpbmRvdwotICAgaWYgaXQncyBmdWxsLiAgSWYgdGhlIHdyaXRlIGZhaWxzLCByZXR1cm4gZnJvbSBpbmZsYXRlQmFjaygpIHdpdGggYQotICAgWl9CVUZfRVJST1IuICovCi0jZGVmaW5lIFJPT00oKSBcCi0gICAgZG8geyBcCi0gICAgICAgIGlmIChsZWZ0ID09IDApIHsgXAotICAgICAgICAgICAgcHV0ID0gc3RhdGUtPndpbmRvdzsgXAotICAgICAgICAgICAgbGVmdCA9IHN0YXRlLT53c2l6ZTsgXAotICAgICAgICAgICAgc3RhdGUtPndoYXZlID0gbGVmdDsgXAotICAgICAgICAgICAgaWYgKG91dChvdXRfZGVzYywgcHV0LCBsZWZ0KSkgeyBcCi0gICAgICAgICAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7IFwKLSAgICAgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsgXAotICAgICAgICAgICAgfSBcCi0gICAgICAgIH0gXAotICAgIH0gd2hpbGUgKDApCi0KLS8qCi0gICBzdHJtIHByb3ZpZGVzIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMgYW5kIHdpbmRvdyBidWZmZXIgb24gaW5wdXQsCi0gICBhbmQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHVudXNlZCBpbnB1dCBvbiByZXR1cm4uICBGb3IgWl9EQVRBX0VSUk9SCi0gICByZXR1cm5zLCBzdHJtIHdpbGwgYWxzbyBwcm92aWRlIGFuIGVycm9yIG1lc3NhZ2UuCi0KLSAgIGluKCkgYW5kIG91dCgpIGFyZSB0aGUgY2FsbC1iYWNrIGlucHV0IGFuZCBvdXRwdXQgZnVuY3Rpb25zLiAgV2hlbgotICAgaW5mbGF0ZUJhY2soKSBuZWVkcyBtb3JlIGlucHV0LCBpdCBjYWxscyBpbigpLiAgV2hlbiBpbmZsYXRlQmFjaygpIGhhcwotICAgZmlsbGVkIHRoZSB3aW5kb3cgd2l0aCBvdXRwdXQsIG9yIHdoZW4gaXQgY29tcGxldGVzIHdpdGggZGF0YSBpbiB0aGUKLSAgIHdpbmRvdywgaXQgY2FsbHMgb3V0KCkgdG8gd3JpdGUgb3V0IHRoZSBkYXRhLiAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90Ci0gICBjaGFuZ2UgdGhlIHByb3ZpZGVkIGlucHV0IHVudGlsIGluKCkgaXMgY2FsbGVkIGFnYWluIG9yIGluZmxhdGVCYWNrKCkKLSAgIHJldHVybnMuICBUaGUgYXBwbGljYXRpb24gbXVzdCBub3QgY2hhbmdlIHRoZSB3aW5kb3cvb3V0cHV0IGJ1ZmZlciB1bnRpbAotICAgaW5mbGF0ZUJhY2soKSByZXR1cm5zLgotCi0gICBpbigpIGFuZCBvdXQoKSBhcmUgY2FsbGVkIHdpdGggYSBkZXNjcmlwdG9yIHBhcmFtZXRlciBwcm92aWRlZCBpbiB0aGUKLSAgIGluZmxhdGVCYWNrKCkgY2FsbC4gIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHN0cnVjdHVyZSB0aGF0IHByb3ZpZGVzIHRoZQotICAgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gZG8gdGhlIHJlYWQgb3Igd3JpdGUsIGFzIHdlbGwgYXMgYWNjdW11bGF0ZWQKLSAgIGluZm9ybWF0aW9uIG9uIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHN1Y2ggYXMgdG90YWxzIGFuZCBjaGVjayB2YWx1ZXMuCi0KLSAgIGluKCkgc2hvdWxkIHJldHVybiB6ZXJvIG9uIGZhaWx1cmUuICBvdXQoKSBzaG91bGQgcmV0dXJuIG5vbi16ZXJvIG9uCi0gICBmYWlsdXJlLiAgSWYgZWl0aGVyIGluKCkgb3Igb3V0KCkgZmFpbHMsIHRoYW4gaW5mbGF0ZUJhY2soKSByZXR1cm5zIGEKLSAgIFpfQlVGX0VSUk9SLiAgc3RybS0+bmV4dF9pbiBjYW4gYmUgY2hlY2tlZCBmb3IgWl9OVUxMIHRvIHNlZSB3aGV0aGVyIGl0Ci0gICB3YXMgaW4oKSBvciBvdXQoKSB0aGF0IGNhdXNlZCBpbiB0aGUgZXJyb3IuICBPdGhlcndpc2UsICBpbmZsYXRlQmFjaygpCi0gICByZXR1cm5zIFpfU1RSRUFNX0VORCBvbiBzdWNjZXNzLCBaX0RBVEFfRVJST1IgZm9yIGFuIGRlZmxhdGUgZm9ybWF0Ci0gICBlcnJvciwgb3IgWl9NRU1fRVJST1IgaWYgaXQgY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHN0YXRlLgotICAgaW5mbGF0ZUJhY2soKSBjYW4gYWxzbyByZXR1cm4gWl9TVFJFQU1fRVJST1IgaWYgdGhlIGlucHV0IHBhcmFtZXRlcnMKLSAgIGFyZSBub3QgY29ycmVjdCwgaS5lLiBzdHJtIGlzIFpfTlVMTCBvciB0aGUgc3RhdGUgd2FzIG5vdCBpbml0aWFsaXplZC4KLSAqLwotaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2soc3RybSwgaW4sIGluX2Rlc2MsIG91dCwgb3V0X2Rlc2MpCi16X3N0cmVhbXAgc3RybTsKLWluX2Z1bmMgaW47Ci12b2lkIEZBUiAqaW5fZGVzYzsKLW91dF9mdW5jIG91dDsKLXZvaWQgRkFSICpvdXRfZGVzYzsKLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICpuZXh0OyAgICAvKiBuZXh0IGlucHV0ICovCi0gICAgdW5zaWduZWQgY2hhciBGQVIgKnB1dDsgICAgIC8qIG5leHQgb3V0cHV0ICovCi0gICAgdW5zaWduZWQgaGF2ZSwgbGVmdDsgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovCi0gICAgdW5zaWduZWQgbG9uZyBob2xkOyAgICAgICAgIC8qIGJpdCBidWZmZXIgKi8KLSAgICB1bnNpZ25lZCBiaXRzOyAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCi0gICAgdW5zaWduZWQgY29weTsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdG9yZWQgb3IgbWF0Y2ggYnl0ZXMgdG8gY29weSAqLwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICpmcm9tOyAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi8KLSAgICBjb2RlIGhlcmU7ICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqLwotICAgIGNvZGUgbGFzdDsgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi8KLSAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqLwotICAgIGludCByZXQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqLwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBvcmRlclsxOV0gPSAvKiBwZXJtdXRhdGlvbiBvZiBjb2RlIGxlbmd0aHMgKi8KLSAgICAgICAgezE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTV9OwotCi0gICAgLyogQ2hlY2sgdGhhdCB0aGUgc3RybSBleGlzdHMgYW5kIHRoYXQgdGhlIHN0YXRlIHdhcyBpbml0aWFsaXplZCAqLwotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKLQotICAgIC8qIFJlc2V0IHRoZSBzdGF0ZSAqLwotICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsKLSAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7Ci0gICAgc3RhdGUtPmxhc3QgPSAwOwotICAgIHN0YXRlLT53aGF2ZSA9IDA7Ci0gICAgbmV4dCA9IHN0cm0tPm5leHRfaW47Ci0gICAgaGF2ZSA9IG5leHQgIT0gWl9OVUxMID8gc3RybS0+YXZhaWxfaW4gOiAwOwotICAgIGhvbGQgPSAwOwotICAgIGJpdHMgPSAwOwotICAgIHB1dCA9IHN0YXRlLT53aW5kb3c7Ci0gICAgbGVmdCA9IHN0YXRlLT53c2l6ZTsKLQotICAgIC8qIEluZmxhdGUgdW50aWwgZW5kIG9mIGJsb2NrIG1hcmtlZCBhcyBsYXN0ICovCi0gICAgZm9yICg7OykKLSAgICAgICAgc3dpdGNoIChzdGF0ZS0+bW9kZSkgewotICAgICAgICBjYXNlIFRZUEU6Ci0gICAgICAgICAgICAvKiBkZXRlcm1pbmUgYW5kIGRpc3BhdGNoIGJsb2NrIHR5cGUgKi8KLSAgICAgICAgICAgIGlmIChzdGF0ZS0+bGFzdCkgewotICAgICAgICAgICAgICAgIEJZVEVCSVRTKCk7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBET05FOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTkVFREJJVFMoMyk7Ci0gICAgICAgICAgICBzdGF0ZS0+bGFzdCA9IEJJVFMoMSk7Ci0gICAgICAgICAgICBEUk9QQklUUygxKTsKLSAgICAgICAgICAgIHN3aXRjaCAoQklUUygyKSkgewotICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovCi0gICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgc3RvcmVkIGJsb2NrJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBTVE9SRUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCBibG9jayAqLwotICAgICAgICAgICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTsKLSAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOyAgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovCi0gICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZHluYW1pYyBjb2RlcyBibG9jayVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVEFCTEU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBibG9jayB0eXBlIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERST1BCSVRTKDIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTVE9SRUQ6Ci0gICAgICAgICAgICAvKiBnZXQgYW5kIHZlcmlmeSBzdG9yZWQgYmxvY2sgbGVuZ3RoICovCi0gICAgICAgICAgICBCWVRFQklUUygpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovCi0gICAgICAgICAgICBORUVEQklUUygzMik7Ci0gICAgICAgICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9ICgoaG9sZCA+PiAxNikgXiAweGZmZmYpKSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKWhvbGQgJiAweGZmZmY7Ci0gICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcbiIsCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGgpKTsKLSAgICAgICAgICAgIElOSVRCSVRTKCk7Ci0KLSAgICAgICAgICAgIC8qIGNvcHkgc3RvcmVkIGJsb2NrIGZyb20gaW5wdXQgdG8gb3V0cHV0ICovCi0gICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgUFVMTCgpOwotICAgICAgICAgICAgICAgIFJPT00oKTsKLSAgICAgICAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIGNvcHkgPSBoYXZlOwotICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgY29weSA9IGxlZnQ7Ci0gICAgICAgICAgICAgICAgem1lbWNweShwdXQsIG5leHQsIGNvcHkpOwotICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKLSAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7Ci0gICAgICAgICAgICAgICAgbGVmdCAtPSBjb3B5OwotICAgICAgICAgICAgICAgIHB1dCArPSBjb3B5OwotICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZFxuIikpOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUQUJMRToKLSAgICAgICAgICAgIC8qIGdldCBkeW5hbWljIHRhYmxlIGVudHJpZXMgZGVzY3JpcHRvciAqLwotICAgICAgICAgICAgTkVFREJJVFMoMTQpOwotICAgICAgICAgICAgc3RhdGUtPm5sZW4gPSBCSVRTKDUpICsgMjU3OwotICAgICAgICAgICAgRFJPUEJJVFMoNSk7Ci0gICAgICAgICAgICBzdGF0ZS0+bmRpc3QgPSBCSVRTKDUpICsgMTsKLSAgICAgICAgICAgIERST1BCSVRTKDUpOwotICAgICAgICAgICAgc3RhdGUtPm5jb2RlID0gQklUUyg0KSArIDQ7Ci0gICAgICAgICAgICBEUk9QQklUUyg0KTsKLSNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+bmxlbiA+IDI4NiB8fCBzdGF0ZS0+bmRpc3QgPiAzMCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xuIikpOwotCi0gICAgICAgICAgICAvKiBnZXQgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzIChub3QgYSB0eXBvKSAqLwotICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOwotICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5jb2RlKSB7Ci0gICAgICAgICAgICAgICAgTkVFREJJVFMoMyk7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbb3JkZXJbc3RhdGUtPmhhdmUrK11dID0gKHVuc2lnbmVkIHNob3J0KUJJVFMoMyk7Ci0gICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCAxOSkKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tvcmRlcltzdGF0ZS0+aGF2ZSsrXV0gPSAwOwotICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7Ci0gICAgICAgICAgICBzdGF0ZS0+bGVuY29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7Ci0gICAgICAgICAgICBzdGF0ZS0+bGVuYml0cyA9IDc7Ci0gICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZS0+bGVucywgMTksICYoc3RhdGUtPm5leHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5sZW5iaXRzKSwgc3RhdGUtPndvcmspOwotICAgICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgY29kZSBsZW5ndGhzIHNldCI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xuIikpOwotCi0gICAgICAgICAgICAvKiBnZXQgbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlIGNvZGUgbGVuZ3RocyAqLwotICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOwotICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5sZW4gKyBzdGF0ZS0+bmRpc3QpIHsKLSAgICAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChoZXJlLnZhbCA8IDE2KSB7Ci0gICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gaGVyZS52YWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoaGVyZS52YWwgPT0gMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAodW5zaWduZWQpKHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlIC0gMV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaGVyZS52YWwgPT0gMTcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMyArIEJJVFMoMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDcpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMTEgKyBCSVRTKDcpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoNyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlICsgY29weSA+IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gKHVuc2lnbmVkIHNob3J0KWxlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi8KLSAgICAgICAgICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBCQUQpIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgKGJldHRlciBoYXZlIG9uZSkgKi8KLSAgICAgICAgICAgIGlmIChzdGF0ZS0+bGVuc1syNTZdID09IDApIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2siOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBidWlsZCBjb2RlIHRhYmxlcyAtLSBub3RlOiBkbyBub3QgY2hhbmdlIHRoZSBsZW5iaXRzIG9yIGRpc3RiaXRzCi0gICAgICAgICAgICAgICB2YWx1ZXMgaGVyZSAoOSBhbmQgNikgd2l0aG91dCByZWFkaW5nIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oCi0gICAgICAgICAgICAgICBjb25jZXJuaW5nIHRoZSBFTk9VR0ggY29uc3RhbnRzLCB3aGljaCBkZXBlbmQgb24gdGhvc2UgdmFsdWVzICovCi0gICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKLSAgICAgICAgICAgIHN0YXRlLT5sZW5jb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKLSAgICAgICAgICAgIHN0YXRlLT5sZW5iaXRzID0gOTsKLSAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUtPmxlbnMsIHN0YXRlLT5ubGVuLCAmKHN0YXRlLT5uZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bGVuYml0cyksIHN0YXRlLT53b3JrKTsKLSAgICAgICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPmRpc3Rjb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKLSAgICAgICAgICAgIHN0YXRlLT5kaXN0Yml0cyA9IDY7Ci0gICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS0+bGVucyArIHN0YXRlLT5ubGVuLCBzdGF0ZS0+bmRpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bmV4dCksICYoc3RhdGUtPmRpc3RiaXRzKSwgc3RhdGUtPndvcmspOwotICAgICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2VzIHNldCI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGVzIG9rXG4iKSk7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsKLQotICAgICAgICBjYXNlIExFTjoKLSAgICAgICAgICAgIC8qIHVzZSBpbmZsYXRlX2Zhc3QoKSBpZiB3ZSBoYXZlIGVub3VnaCBpbnB1dCBhbmQgb3V0cHV0ICovCi0gICAgICAgICAgICBpZiAoaGF2ZSA+PSA2ICYmIGxlZnQgPj0gMjU4KSB7Ci0gICAgICAgICAgICAgICAgUkVTVE9SRSgpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+d2hhdmUgPCBzdGF0ZS0+d3NpemUpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLT53aGF2ZSA9IHN0YXRlLT53c2l6ZSAtIGxlZnQ7Ci0gICAgICAgICAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXRlLT53c2l6ZSk7Ci0gICAgICAgICAgICAgICAgTE9BRCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBnZXQgYSBsaXRlcmFsLCBsZW5ndGgsIG9yIGVuZC1vZi1ibG9jayBjb2RlICovCi0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLT5sZW5jb2RlW0JJVFMoc3RhdGUtPmxlbmJpdHMpXTsKLSAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOwotICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaGVyZS5vcCAmJiAoaGVyZS5vcCAmIDB4ZjApID09IDApIHsKLSAgICAgICAgICAgICAgICBsYXN0ID0gaGVyZTsKLSAgICAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtsYXN0LnZhbCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOwotICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZCloZXJlLnZhbDsKLQotICAgICAgICAgICAgLyogcHJvY2VzcyBsaXRlcmFsICovCi0gICAgICAgICAgICBpZiAoaGVyZS5vcCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcbiIgOgotICAgICAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcbiIsIGhlcmUudmFsKSk7Ci0gICAgICAgICAgICAgICAgUk9PTSgpOwotICAgICAgICAgICAgICAgICpwdXQrKyA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZS0+bGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBsZWZ0LS07Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU47Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIHByb2Nlc3MgZW5kIG9mIGJsb2NrICovCi0gICAgICAgICAgICBpZiAoaGVyZS5vcCAmIDMyKSB7Ci0gICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcbiIpKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSAqLwotICAgICAgICAgICAgaWYgKGhlcmUub3AgJiA2NCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGxlbmd0aCBjb2RlIC0tIGdldCBleHRyYSBiaXRzLCBpZiBhbnkgKi8KLSAgICAgICAgICAgIHN0YXRlLT5leHRyYSA9ICh1bnNpZ25lZCkoaGVyZS5vcCkgJiAxNTsKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+ZXh0cmEgIT0gMCkgewotICAgICAgICAgICAgICAgIE5FRURCSVRTKHN0YXRlLT5leHRyYSk7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCArPSBCSVRTKHN0YXRlLT5leHRyYSk7Ci0gICAgICAgICAgICAgICAgRFJPUEJJVFMoc3RhdGUtPmV4dHJhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XG4iLCBzdGF0ZS0+bGVuZ3RoKSk7Ci0KLSAgICAgICAgICAgIC8qIGdldCBkaXN0YW5jZSBjb2RlICovCi0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLT5kaXN0Y29kZVtCSVRTKHN0YXRlLT5kaXN0Yml0cyldOwotICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7Ci0gICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoaGVyZS5vcCAmIDB4ZjApID09IDApIHsKLSAgICAgICAgICAgICAgICBsYXN0ID0gaGVyZTsKLSAgICAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+ZGlzdGNvZGVbbGFzdC52YWwgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApID4+IGxhc3QuYml0cyldOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShsYXN0LmJpdHMgKyBoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBEUk9QQklUUyhsYXN0LmJpdHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKLSAgICAgICAgICAgIGlmIChoZXJlLm9wICYgNjQpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPm9mZnNldCA9ICh1bnNpZ25lZCloZXJlLnZhbDsKLQotICAgICAgICAgICAgLyogZ2V0IGRpc3RhbmNlIGV4dHJhIGJpdHMsIGlmIGFueSAqLwotICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKShoZXJlLm9wKSAmIDE1OwotICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKLSAgICAgICAgICAgICAgICBEUk9QQklUUyhzdGF0ZS0+ZXh0cmEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXRlLT5vZmZzZXQgPiBzdGF0ZS0+d3NpemUgLSAoc3RhdGUtPndoYXZlIDwgc3RhdGUtPndzaXplID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgOiAwKSkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcbiIsIHN0YXRlLT5vZmZzZXQpKTsKLQotICAgICAgICAgICAgLyogY29weSBtYXRjaCBmcm9tIHdpbmRvdyB0byBvdXRwdXQgKi8KLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBST09NKCk7Ci0gICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT53c2l6ZSAtIHN0YXRlLT5vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHkgPCBsZWZ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyb20gPSBwdXQgKyBjb3B5OwotICAgICAgICAgICAgICAgICAgICBjb3B5ID0gbGVmdCAtIGNvcHk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmcm9tID0gcHV0IC0gc3RhdGUtPm9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgY29weSA9IGxlZnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPmxlbmd0aCkgY29weSA9IHN0YXRlLT5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OwotICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICpwdXQrKyA9ICpmcm9tKys7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTsKLSAgICAgICAgICAgIH0gd2hpbGUgKHN0YXRlLT5sZW5ndGggIT0gMCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIERPTkU6Ci0gICAgICAgICAgICAvKiBpbmZsYXRlIHN0cmVhbSB0ZXJtaW5hdGVkIHByb3Blcmx5IC0tIHdyaXRlIGxlZnRvdmVyIG91dHB1dCAqLwotICAgICAgICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EOwotICAgICAgICAgICAgaWYgKGxlZnQgPCBzdGF0ZS0+d3NpemUpIHsKLSAgICAgICAgICAgICAgICBpZiAob3V0KG91dF9kZXNjLCBzdGF0ZS0+d2luZG93LCBzdGF0ZS0+d3NpemUgLSBsZWZ0KSkKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKLQotICAgICAgICBjYXNlIEJBRDoKLSAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOwotCi0gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIC8qIGNhbid0IGhhcHBlbiwgYnV0IG1ha2VzIGNvbXBpbGVycyBoYXBweSAqLwotICAgICAgICAgICAgcmV0ID0gWl9TVFJFQU1fRVJST1I7Ci0gICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKLSAgICAgICAgfQotCi0gICAgLyogUmV0dXJuIHVudXNlZCBpbnB1dCAqLwotICBpbmZfbGVhdmU6Ci0gICAgc3RybS0+bmV4dF9pbiA9IG5leHQ7Ci0gICAgc3RybS0+YXZhaWxfaW4gPSBoYXZlOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVCYWNrRW5kKHN0cm0pCi16X3N0cmVhbXAgc3RybTsKLXsKLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8IHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkKLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIFpGUkVFKHN0cm0sIHN0cm0tPnN0YXRlKTsKLSAgICBzdHJtLT5zdGF0ZSA9IFpfTlVMTDsKLSAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IGVuZFxuIikpOwotICAgIHJldHVybiBaX09LOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvaW5mZmFzdC5jIGIvc3JjL3psaWIvaW5mZmFzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjFkNjBiLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL2luZmZhc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKiBpbmZmYXN0LmMgLS0gZmFzdCBkZWNvZGluZwotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDgsIDIwMTAgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLSNpbmNsdWRlICJ6dXRpbC5oIgotI2luY2x1ZGUgImluZnRyZWVzLmgiCi0jaW5jbHVkZSAiaW5mbGF0ZS5oIgotI2luY2x1ZGUgImluZmZhc3QuaCIKLQotI2lmbmRlZiBBU01JTkYKLQotLyogQWxsb3cgbWFjaGluZSBkZXBlbmRlbnQgb3B0aW1pemF0aW9uIGZvciBwb3N0LWluY3JlbWVudCBvciBwcmUtaW5jcmVtZW50LgotICAgQmFzZWQgb24gdGVzdGluZyB0byBkYXRlLAotICAgUHJlLWluY3JlbWVudCBwcmVmZXJyZWQgZm9yOgotICAgLSBQb3dlclBDIEczIChBZGxlcikKLSAgIC0gTUlQUyBSNTAwMCAoUmFuZGVycy1QZWhyc29uKQotICAgUG9zdC1pbmNyZW1lbnQgcHJlZmVycmVkIGZvcjoKLSAgIC0gbm9uZQotICAgTm8gbWVhc3VyYWJsZSBkaWZmZXJlbmNlOgotICAgLSBQZW50aXVtIElJSSAoQW5kZXJzb24pCi0gICAtIE02ODA2MCAoTmlrbCkKLSAqLwotI2lmZGVmIFBPU1RJTkMKLSMgIGRlZmluZSBPRkYgMAotIyAgZGVmaW5lIFBVUChhKSAqKGEpKysKLSNlbHNlCi0jICBkZWZpbmUgT0ZGIDEKLSMgIGRlZmluZSBQVVAoYSkgKisrKGEpCi0jZW5kaWYKLQotLyoKLSAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmcKLSAgIGxpdGVyYWwgYW5kIG1hdGNoIGJ5dGVzIHVudGlsIGVpdGhlciBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBpcwotICAgYXZhaWxhYmxlLCBhbiBlbmQtb2YtYmxvY2sgaXMgZW5jb3VudGVyZWQsIG9yIGEgZGF0YSBlcnJvciBpcyBlbmNvdW50ZXJlZC4KLSAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3IKLSAgIGV4YW1wbGUsIGEgMTZLIGlucHV0IGJ1ZmZlciBhbmQgYSA2NEsgb3V0cHV0IGJ1ZmZlciwgbW9yZSB0aGFuIDk1JSBvZiB0aGUKLSAgIGluZmxhdGUgZXhlY3V0aW9uIHRpbWUgaXMgc3BlbnQgaW4gdGhpcyByb3V0aW5lLgotCi0gICBFbnRyeSBhc3N1bXB0aW9uczoKLQotICAgICAgICBzdGF0ZS0+bW9kZSA9PSBMRU4KLSAgICAgICAgc3RybS0+YXZhaWxfaW4gPj0gNgotICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPj0gMjU4Ci0gICAgICAgIHN0YXJ0ID49IHN0cm0tPmF2YWlsX291dAotICAgICAgICBzdGF0ZS0+Yml0cyA8IDgKLQotICAgT24gcmV0dXJuLCBzdGF0ZS0+bW9kZSBpcyBvbmUgb2Y6Ci0KLSAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0Ci0gICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrCi0gICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhCi0KLSAgIE5vdGVzOgotCi0gICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGUKLSAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLAotICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy4KLSAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLT5hdmFpbF9pbiA+PSA2LCB0aGVuIHRoZXJlIGlzIGVub3VnaCBpbnB1dCB0byBhdm9pZAotICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy4KLQotICAgIC0gVGhlIG1heGltdW0gYnl0ZXMgdGhhdCBhIHNpbmdsZSBsZW5ndGgvZGlzdGFuY2UgcGFpciBjYW4gb3V0cHV0IGlzIDI1OAotICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpCi0gICAgICByZXF1aXJlcyBzdHJtLT5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yCi0gICAgICBvdXRwdXQgc3BhY2UuCi0gKi8KLXZvaWQgWkxJQl9JTlRFUk5BTCBpbmZsYXRlX2Zhc3Qoc3RybSwgc3RhcnQpCi16X3N0cmVhbXAgc3RybTsKLXVuc2lnbmVkIHN0YXJ0OyAgICAgICAgIC8qIGluZmxhdGUoKSdzIHN0YXJ0aW5nIHZhbHVlIGZvciBzdHJtLT5hdmFpbF9vdXQgKi8KLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICppbjsgICAgICAvKiBsb2NhbCBzdHJtLT5uZXh0X2luICovCi0gICAgdW5zaWduZWQgY2hhciBGQVIgKmxhc3Q7ICAgIC8qIHdoaWxlIGluIDwgbGFzdCwgZW5vdWdoIGlucHV0IGF2YWlsYWJsZSAqLwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICpvdXQ7ICAgICAvKiBsb2NhbCBzdHJtLT5uZXh0X291dCAqLwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICpiZWc7ICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0tPm5leHRfb3V0ICovCi0gICAgdW5zaWduZWQgY2hhciBGQVIgKmVuZDsgICAgIC8qIHdoaWxlIG91dCA8IGVuZCwgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSAqLwotI2lmZGVmIElORkxBVEVfU1RSSUNUCi0gICAgdW5zaWduZWQgZG1heDsgICAgICAgICAgICAgIC8qIG1heGltdW0gZGlzdGFuY2UgZnJvbSB6bGliIGhlYWRlciAqLwotI2VuZGlmCi0gICAgdW5zaWduZWQgd3NpemU7ICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqLwotICAgIHVuc2lnbmVkIHdoYXZlOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovCi0gICAgdW5zaWduZWQgd25leHQ7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqLwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7ICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIHdzaXplICE9IDAgKi8KLSAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogbG9jYWwgc3RybS0+aG9sZCAqLwotICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLT5iaXRzICovCi0gICAgY29kZSBjb25zdCBGQVIgKmxjb2RlOyAgICAgIC8qIGxvY2FsIHN0cm0tPmxlbmNvZGUgKi8KLSAgICBjb2RlIGNvbnN0IEZBUiAqZGNvZGU7ICAgICAgLyogbG9jYWwgc3RybS0+ZGlzdGNvZGUgKi8KLSAgICB1bnNpZ25lZCBsbWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgbGVuZ3RoIGNvZGVzICovCi0gICAgdW5zaWduZWQgZG1hc2s7ICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRpc3RhbmNlIGNvZGVzICovCi0gICAgY29kZSBoZXJlOyAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlZCB0YWJsZSBlbnRyeSAqLwotICAgIHVuc2lnbmVkIG9wOyAgICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMsIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgb3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi8KLSAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoLCB1bnVzZWQgYnl0ZXMgKi8KLSAgICB1bnNpZ25lZCBkaXN0OyAgICAgICAgICAgICAgLyogbWF0Y2ggZGlzdGFuY2UgKi8KLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZnJvbTsgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovCi0KLSAgICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqLwotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOwotICAgIGluID0gc3RybS0+bmV4dF9pbiAtIE9GRjsKLSAgICBsYXN0ID0gaW4gKyAoc3RybS0+YXZhaWxfaW4gLSA1KTsKLSAgICBvdXQgPSBzdHJtLT5uZXh0X291dCAtIE9GRjsKLSAgICBiZWcgPSBvdXQgLSAoc3RhcnQgLSBzdHJtLT5hdmFpbF9vdXQpOwotICAgIGVuZCA9IG91dCArIChzdHJtLT5hdmFpbF9vdXQgLSAyNTcpOwotI2lmZGVmIElORkxBVEVfU1RSSUNUCi0gICAgZG1heCA9IHN0YXRlLT5kbWF4OwotI2VuZGlmCi0gICAgd3NpemUgPSBzdGF0ZS0+d3NpemU7Ci0gICAgd2hhdmUgPSBzdGF0ZS0+d2hhdmU7Ci0gICAgd25leHQgPSBzdGF0ZS0+d25leHQ7Ci0gICAgd2luZG93ID0gc3RhdGUtPndpbmRvdzsKLSAgICBob2xkID0gc3RhdGUtPmhvbGQ7Ci0gICAgYml0cyA9IHN0YXRlLT5iaXRzOwotICAgIGxjb2RlID0gc3RhdGUtPmxlbmNvZGU7Ci0gICAgZGNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGU7Ci0gICAgbG1hc2sgPSAoMVUgPDwgc3RhdGUtPmxlbmJpdHMpIC0gMTsKLSAgICBkbWFzayA9ICgxVSA8PCBzdGF0ZS0+ZGlzdGJpdHMpIC0gMTsKLQotICAgIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaAotICAgICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovCi0gICAgZG8gewotICAgICAgICBpZiAoYml0cyA8IDE1KSB7Ci0gICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOwotICAgICAgICAgICAgYml0cyArPSA4OwotICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKLSAgICAgICAgICAgIGJpdHMgKz0gODsKLSAgICAgICAgfQotICAgICAgICBoZXJlID0gbGNvZGVbaG9sZCAmIGxtYXNrXTsKLSAgICAgIGRvbGVuOgotICAgICAgICBvcCA9ICh1bnNpZ25lZCkoaGVyZS5iaXRzKTsKLSAgICAgICAgaG9sZCA+Pj0gb3A7Ci0gICAgICAgIGJpdHMgLT0gb3A7Ci0gICAgICAgIG9wID0gKHVuc2lnbmVkKShoZXJlLm9wKTsKLSAgICAgICAgaWYgKG9wID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi8KLSAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgPwotICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcbiIgOgotICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxuIiwgaGVyZS52YWwpKTsKLSAgICAgICAgICAgIFBVUChvdXQpID0gKHVuc2lnbmVkIGNoYXIpKGhlcmUudmFsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGJhc2UgKi8KLSAgICAgICAgICAgIGxlbiA9ICh1bnNpZ25lZCkoaGVyZS52YWwpOwotICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi8KLSAgICAgICAgICAgIGlmIChvcCkgewotICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKLSAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsZW4gKz0gKHVuc2lnbmVkKWhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpOwotICAgICAgICAgICAgICAgIGhvbGQgPj49IG9wOwotICAgICAgICAgICAgICAgIGJpdHMgLT0gb3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxuIiwgbGVuKSk7Ci0gICAgICAgICAgICBpZiAoYml0cyA8IDE1KSB7Ci0gICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKLSAgICAgICAgICAgICAgICBiaXRzICs9IDg7Ci0gICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKLSAgICAgICAgICAgICAgICBiaXRzICs9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoZXJlID0gZGNvZGVbaG9sZCAmIGRtYXNrXTsKLSAgICAgICAgICBkb2Rpc3Q6Ci0gICAgICAgICAgICBvcCA9ICh1bnNpZ25lZCkoaGVyZS5iaXRzKTsKLSAgICAgICAgICAgIGhvbGQgPj49IG9wOwotICAgICAgICAgICAgYml0cyAtPSBvcDsKLSAgICAgICAgICAgIG9wID0gKHVuc2lnbmVkKShoZXJlLm9wKTsKLSAgICAgICAgICAgIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhc2UgKi8KLSAgICAgICAgICAgICAgICBkaXN0ID0gKHVuc2lnbmVkKShoZXJlLnZhbCk7Ci0gICAgICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqLwotICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKLSAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwotICAgICAgICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOwotICAgICAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRpc3QgKz0gKHVuc2lnbmVkKWhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpOwotI2lmZGVmIElORkxBVEVfU1RSSUNUCi0gICAgICAgICAgICAgICAgaWYgKGRpc3QgPiBkbWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIGhvbGQgPj49IG9wOwotICAgICAgICAgICAgICAgIGJpdHMgLT0gb3A7Ci0gICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxuIiwgZGlzdCkpOwotICAgICAgICAgICAgICAgIG9wID0gKHVuc2lnbmVkKShvdXQgLSBiZWcpOyAgICAgLyogbWF4IGRpc3RhbmNlIGluIG91dHB1dCAqLwotICAgICAgICAgICAgICAgIGlmIChkaXN0ID4gb3ApIHsgICAgICAgICAgICAgICAgLyogc2VlIGlmIGNvcHkgZnJvbSB3aW5kb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7ICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgaW4gd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChvcCA+IHdoYXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPnNhbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IG9wIC0gd2hhdmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3AgLSB3aGF2ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wID4gd2hhdmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZyb20gPSB3aW5kb3cgLSBPRkY7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3bmV4dCA9PSAwKSB7ICAgICAgICAgICAvKiB2ZXJ5IGNvbW1vbiBjYXNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplIC0gb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAod25leHQgPCBvcCkgeyAgICAgIC8qIHdyYXAgYXJvdW5kIHdpbmRvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSArIHduZXh0IC0gb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcCAtPSB3bmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSBlbmQgb2Ygd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHdpbmRvdyAtIE9GRjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod25leHQgPCBsZW4pIHsgIC8qIHNvbWUgZnJvbSBzdGFydCBvZiB3aW5kb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSB3bmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgICAgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpZ3VvdXMgaW4gd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHduZXh0IC0gb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOwotICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSAzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgICAgICAgICAvKiBjb3B5IGRpcmVjdCBmcm9tIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBsZW5ndGggaXMgdGhyZWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOwotICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSAzOwotICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gPiAyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PSAwKSB7ICAgICAgICAgIC8qIDJuZCBsZXZlbCBkaXN0YW5jZSBjb2RlICovCi0gICAgICAgICAgICAgICAgaGVyZSA9IGRjb2RlW2hlcmUudmFsICsgKGhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpKV07Ci0gICAgICAgICAgICAgICAgZ290byBkb2Rpc3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PSAwKSB7ICAgICAgICAgICAgICAvKiAybmQgbGV2ZWwgbGVuZ3RoIGNvZGUgKi8KLSAgICAgICAgICAgIGhlcmUgPSBsY29kZVtoZXJlLnZhbCArIChob2xkICYgKCgxVSA8PCBvcCkgLSAxKSldOwotICAgICAgICAgICAgZ290byBkb2xlbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvcCAmIDMyKSB7ICAgICAgICAgICAgICAgICAgICAgLyogZW5kLW9mLWJsb2NrICovCi0gICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xuIikpOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKGluIDwgbGFzdCAmJiBvdXQgPCBlbmQpOwotCi0gICAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovCi0gICAgbGVuID0gYml0cyA+PiAzOwotICAgIGluIC09IGxlbjsKLSAgICBiaXRzIC09IGxlbiA8PCAzOwotICAgIGhvbGQgJj0gKDFVIDw8IGJpdHMpIC0gMTsKLQotICAgIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovCi0gICAgc3RybS0+bmV4dF9pbiA9IGluICsgT0ZGOwotICAgIHN0cm0tPm5leHRfb3V0ID0gb3V0ICsgT0ZGOwotICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKShpbiA8IGxhc3QgPyA1ICsgKGxhc3QgLSBpbikgOiA1IC0gKGluIC0gbGFzdCkpOwotICAgIHN0cm0tPmF2YWlsX291dCA9ICh1bnNpZ25lZCkob3V0IDwgZW5kID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NyArIChlbmQgLSBvdXQpIDogMjU3IC0gKG91dCAtIGVuZCkpOwotICAgIHN0YXRlLT5ob2xkID0gaG9sZDsKLSAgICBzdGF0ZS0+Yml0cyA9IGJpdHM7Ci0gICAgcmV0dXJuOwotfQotCi0vKgotICAgaW5mbGF0ZV9mYXN0KCkgc3BlZWR1cHMgdGhhdCB0dXJuZWQgb3V0IHNsb3dlciAob24gYSBQb3dlclBDIEczIDc1MENYZSk6Ci0gICAtIFVzaW5nIGJpdCBmaWVsZHMgZm9yIGNvZGUgc3RydWN0dXJlCi0gICAtIERpZmZlcmVudCBvcCBkZWZpbml0aW9uIHRvIGF2b2lkICYgZm9yIGV4dHJhIGJpdHMgKGRvICYgZm9yIHRhYmxlIGJpdHMpCi0gICAtIFRocmVlIHNlcGFyYXRlIGRlY29kaW5nIGRvLWxvb3BzIGZvciBkaXJlY3QsIHdpbmRvdywgYW5kIHduZXh0ID09IDAKLSAgIC0gU3BlY2lhbCBjYXNlIGZvciBkaXN0YW5jZSA+IDEgY29waWVzIHRvIGRvIG92ZXJsYXBwZWQgbG9hZCBhbmQgc3RvcmUgY29weQotICAgLSBFeHBsaWNpdCBicmFuY2ggcHJlZGljdGlvbnMgKGJhc2VkIG9uIG1lYXN1cmVkIGJyYW5jaCBwcm9iYWJpbGl0aWVzKQotICAgLSBEZWZlcnJpbmcgbWF0Y2ggY29weSBhbmQgaW50ZXJzcGVyc2VkIGl0IHdpdGggZGVjb2Rpbmcgc3Vic2VxdWVudCBjb2RlcwotICAgLSBTd2FwcGluZyBsaXRlcmFsL2xlbmd0aCBlbHNlCi0gICAtIFN3YXBwaW5nIHdpbmRvdy9kaXJlY3QgZWxzZQotICAgLSBMYXJnZXIgdW5yb2xsZWQgY29weSBsb29wcyAodGhyZWUgaXMgYWJvdXQgcmlnaHQpCi0gICAtIE1vdmluZyBsZW4gLT0gMyBzdGF0ZW1lbnQgaW50byBtaWRkbGUgb2YgbG9vcAotICovCi0KLSNlbmRpZiAvKiAhQVNNSU5GICovCmRpZmYgLS1naXQgYS9zcmMvemxpYi9pbmZmYXN0LmggYi9zcmMvemxpYi9pbmZmYXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YzFhYTQuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvaW5mZmFzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyogaW5mZmFzdC5oIC0tIGhlYWRlciB0byB1c2UgaW5mZmFzdC5jCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMywgMjAxMCBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKLSAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcwotICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgotICovCi0KLXZvaWQgWkxJQl9JTlRFUk5BTCBpbmZsYXRlX2Zhc3QgT0YoKHpfc3RyZWFtcCBzdHJtLCB1bnNpZ25lZCBzdGFydCkpOwpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvaW5mZml4ZWQuaCBiL3NyYy96bGliL2luZmZpeGVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MjgzMjcuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvaW5mZml4ZWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSAgICAvKiBpbmZmaXhlZC5oIC0tIHRhYmxlIGZvciBkZWNvZGluZyBmaXhlZCBjb2RlcwotICAgICAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IG1ha2VmaXhlZCgpLgotICAgICAqLwotCi0gICAgLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgICBJdCBpcyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGxpYnJhcnkgYW5kIGlzCi0gICAgICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgotICAgICAqLwotCi0gICAgc3RhdGljIGNvbnN0IGNvZGUgbGVuZml4WzUxMl0gPSB7Ci0gICAgICAgIHs5Niw3LDB9LHswLDgsODB9LHswLDgsMTZ9LHsyMCw4LDExNX0sezE4LDcsMzF9LHswLDgsMTEyfSx7MCw4LDQ4fSwKLSAgICAgICAgezAsOSwxOTJ9LHsxNiw3LDEwfSx7MCw4LDk2fSx7MCw4LDMyfSx7MCw5LDE2MH0sezAsOCwwfSx7MCw4LDEyOH0sCi0gICAgICAgIHswLDgsNjR9LHswLDksMjI0fSx7MTYsNyw2fSx7MCw4LDg4fSx7MCw4LDI0fSx7MCw5LDE0NH0sezE5LDcsNTl9LAotICAgICAgICB7MCw4LDEyMH0sezAsOCw1Nn0sezAsOSwyMDh9LHsxNyw3LDE3fSx7MCw4LDEwNH0sezAsOCw0MH0sezAsOSwxNzZ9LAotICAgICAgICB7MCw4LDh9LHswLDgsMTM2fSx7MCw4LDcyfSx7MCw5LDI0MH0sezE2LDcsNH0sezAsOCw4NH0sezAsOCwyMH0sCi0gICAgICAgIHsyMSw4LDIyN30sezE5LDcsNDN9LHswLDgsMTE2fSx7MCw4LDUyfSx7MCw5LDIwMH0sezE3LDcsMTN9LHswLDgsMTAwfSwKLSAgICAgICAgezAsOCwzNn0sezAsOSwxNjh9LHswLDgsNH0sezAsOCwxMzJ9LHswLDgsNjh9LHswLDksMjMyfSx7MTYsNyw4fSwKLSAgICAgICAgezAsOCw5Mn0sezAsOCwyOH0sezAsOSwxNTJ9LHsyMCw3LDgzfSx7MCw4LDEyNH0sezAsOCw2MH0sezAsOSwyMTZ9LAotICAgICAgICB7MTgsNywyM30sezAsOCwxMDh9LHswLDgsNDR9LHswLDksMTg0fSx7MCw4LDEyfSx7MCw4LDE0MH0sezAsOCw3Nn0sCi0gICAgICAgIHswLDksMjQ4fSx7MTYsNywzfSx7MCw4LDgyfSx7MCw4LDE4fSx7MjEsOCwxNjN9LHsxOSw3LDM1fSx7MCw4LDExNH0sCi0gICAgICAgIHswLDgsNTB9LHswLDksMTk2fSx7MTcsNywxMX0sezAsOCw5OH0sezAsOCwzNH0sezAsOSwxNjR9LHswLDgsMn0sCi0gICAgICAgIHswLDgsMTMwfSx7MCw4LDY2fSx7MCw5LDIyOH0sezE2LDcsN30sezAsOCw5MH0sezAsOCwyNn0sezAsOSwxNDh9LAotICAgICAgICB7MjAsNyw2N30sezAsOCwxMjJ9LHswLDgsNTh9LHswLDksMjEyfSx7MTgsNywxOX0sezAsOCwxMDZ9LHswLDgsNDJ9LAotICAgICAgICB7MCw5LDE4MH0sezAsOCwxMH0sezAsOCwxMzh9LHswLDgsNzR9LHswLDksMjQ0fSx7MTYsNyw1fSx7MCw4LDg2fSwKLSAgICAgICAgezAsOCwyMn0sezY0LDgsMH0sezE5LDcsNTF9LHswLDgsMTE4fSx7MCw4LDU0fSx7MCw5LDIwNH0sezE3LDcsMTV9LAotICAgICAgICB7MCw4LDEwMn0sezAsOCwzOH0sezAsOSwxNzJ9LHswLDgsNn0sezAsOCwxMzR9LHswLDgsNzB9LHswLDksMjM2fSwKLSAgICAgICAgezE2LDcsOX0sezAsOCw5NH0sezAsOCwzMH0sezAsOSwxNTZ9LHsyMCw3LDk5fSx7MCw4LDEyNn0sezAsOCw2Mn0sCi0gICAgICAgIHswLDksMjIwfSx7MTgsNywyN30sezAsOCwxMTB9LHswLDgsNDZ9LHswLDksMTg4fSx7MCw4LDE0fSx7MCw4LDE0Mn0sCi0gICAgICAgIHswLDgsNzh9LHswLDksMjUyfSx7OTYsNywwfSx7MCw4LDgxfSx7MCw4LDE3fSx7MjEsOCwxMzF9LHsxOCw3LDMxfSwKLSAgICAgICAgezAsOCwxMTN9LHswLDgsNDl9LHswLDksMTk0fSx7MTYsNywxMH0sezAsOCw5N30sezAsOCwzM30sezAsOSwxNjJ9LAotICAgICAgICB7MCw4LDF9LHswLDgsMTI5fSx7MCw4LDY1fSx7MCw5LDIyNn0sezE2LDcsNn0sezAsOCw4OX0sezAsOCwyNX0sCi0gICAgICAgIHswLDksMTQ2fSx7MTksNyw1OX0sezAsOCwxMjF9LHswLDgsNTd9LHswLDksMjEwfSx7MTcsNywxN30sezAsOCwxMDV9LAotICAgICAgICB7MCw4LDQxfSx7MCw5LDE3OH0sezAsOCw5fSx7MCw4LDEzN30sezAsOCw3M30sezAsOSwyNDJ9LHsxNiw3LDR9LAotICAgICAgICB7MCw4LDg1fSx7MCw4LDIxfSx7MTYsOCwyNTh9LHsxOSw3LDQzfSx7MCw4LDExN30sezAsOCw1M30sezAsOSwyMDJ9LAotICAgICAgICB7MTcsNywxM30sezAsOCwxMDF9LHswLDgsMzd9LHswLDksMTcwfSx7MCw4LDV9LHswLDgsMTMzfSx7MCw4LDY5fSwKLSAgICAgICAgezAsOSwyMzR9LHsxNiw3LDh9LHswLDgsOTN9LHswLDgsMjl9LHswLDksMTU0fSx7MjAsNyw4M30sezAsOCwxMjV9LAotICAgICAgICB7MCw4LDYxfSx7MCw5LDIxOH0sezE4LDcsMjN9LHswLDgsMTA5fSx7MCw4LDQ1fSx7MCw5LDE4Nn0sezAsOCwxM30sCi0gICAgICAgIHswLDgsMTQxfSx7MCw4LDc3fSx7MCw5LDI1MH0sezE2LDcsM30sezAsOCw4M30sezAsOCwxOX0sezIxLDgsMTk1fSwKLSAgICAgICAgezE5LDcsMzV9LHswLDgsMTE1fSx7MCw4LDUxfSx7MCw5LDE5OH0sezE3LDcsMTF9LHswLDgsOTl9LHswLDgsMzV9LAotICAgICAgICB7MCw5LDE2Nn0sezAsOCwzfSx7MCw4LDEzMX0sezAsOCw2N30sezAsOSwyMzB9LHsxNiw3LDd9LHswLDgsOTF9LAotICAgICAgICB7MCw4LDI3fSx7MCw5LDE1MH0sezIwLDcsNjd9LHswLDgsMTIzfSx7MCw4LDU5fSx7MCw5LDIxNH0sezE4LDcsMTl9LAotICAgICAgICB7MCw4LDEwN30sezAsOCw0M30sezAsOSwxODJ9LHswLDgsMTF9LHswLDgsMTM5fSx7MCw4LDc1fSx7MCw5LDI0Nn0sCi0gICAgICAgIHsxNiw3LDV9LHswLDgsODd9LHswLDgsMjN9LHs2NCw4LDB9LHsxOSw3LDUxfSx7MCw4LDExOX0sezAsOCw1NX0sCi0gICAgICAgIHswLDksMjA2fSx7MTcsNywxNX0sezAsOCwxMDN9LHswLDgsMzl9LHswLDksMTc0fSx7MCw4LDd9LHswLDgsMTM1fSwKLSAgICAgICAgezAsOCw3MX0sezAsOSwyMzh9LHsxNiw3LDl9LHswLDgsOTV9LHswLDgsMzF9LHswLDksMTU4fSx7MjAsNyw5OX0sCi0gICAgICAgIHswLDgsMTI3fSx7MCw4LDYzfSx7MCw5LDIyMn0sezE4LDcsMjd9LHswLDgsMTExfSx7MCw4LDQ3fSx7MCw5LDE5MH0sCi0gICAgICAgIHswLDgsMTV9LHswLDgsMTQzfSx7MCw4LDc5fSx7MCw5LDI1NH0sezk2LDcsMH0sezAsOCw4MH0sezAsOCwxNn0sCi0gICAgICAgIHsyMCw4LDExNX0sezE4LDcsMzF9LHswLDgsMTEyfSx7MCw4LDQ4fSx7MCw5LDE5M30sezE2LDcsMTB9LHswLDgsOTZ9LAotICAgICAgICB7MCw4LDMyfSx7MCw5LDE2MX0sezAsOCwwfSx7MCw4LDEyOH0sezAsOCw2NH0sezAsOSwyMjV9LHsxNiw3LDZ9LAotICAgICAgICB7MCw4LDg4fSx7MCw4LDI0fSx7MCw5LDE0NX0sezE5LDcsNTl9LHswLDgsMTIwfSx7MCw4LDU2fSx7MCw5LDIwOX0sCi0gICAgICAgIHsxNyw3LDE3fSx7MCw4LDEwNH0sezAsOCw0MH0sezAsOSwxNzd9LHswLDgsOH0sezAsOCwxMzZ9LHswLDgsNzJ9LAotICAgICAgICB7MCw5LDI0MX0sezE2LDcsNH0sezAsOCw4NH0sezAsOCwyMH0sezIxLDgsMjI3fSx7MTksNyw0M30sezAsOCwxMTZ9LAotICAgICAgICB7MCw4LDUyfSx7MCw5LDIwMX0sezE3LDcsMTN9LHswLDgsMTAwfSx7MCw4LDM2fSx7MCw5LDE2OX0sezAsOCw0fSwKLSAgICAgICAgezAsOCwxMzJ9LHswLDgsNjh9LHswLDksMjMzfSx7MTYsNyw4fSx7MCw4LDkyfSx7MCw4LDI4fSx7MCw5LDE1M30sCi0gICAgICAgIHsyMCw3LDgzfSx7MCw4LDEyNH0sezAsOCw2MH0sezAsOSwyMTd9LHsxOCw3LDIzfSx7MCw4LDEwOH0sezAsOCw0NH0sCi0gICAgICAgIHswLDksMTg1fSx7MCw4LDEyfSx7MCw4LDE0MH0sezAsOCw3Nn0sezAsOSwyNDl9LHsxNiw3LDN9LHswLDgsODJ9LAotICAgICAgICB7MCw4LDE4fSx7MjEsOCwxNjN9LHsxOSw3LDM1fSx7MCw4LDExNH0sezAsOCw1MH0sezAsOSwxOTd9LHsxNyw3LDExfSwKLSAgICAgICAgezAsOCw5OH0sezAsOCwzNH0sezAsOSwxNjV9LHswLDgsMn0sezAsOCwxMzB9LHswLDgsNjZ9LHswLDksMjI5fSwKLSAgICAgICAgezE2LDcsN30sezAsOCw5MH0sezAsOCwyNn0sezAsOSwxNDl9LHsyMCw3LDY3fSx7MCw4LDEyMn0sezAsOCw1OH0sCi0gICAgICAgIHswLDksMjEzfSx7MTgsNywxOX0sezAsOCwxMDZ9LHswLDgsNDJ9LHswLDksMTgxfSx7MCw4LDEwfSx7MCw4LDEzOH0sCi0gICAgICAgIHswLDgsNzR9LHswLDksMjQ1fSx7MTYsNyw1fSx7MCw4LDg2fSx7MCw4LDIyfSx7NjQsOCwwfSx7MTksNyw1MX0sCi0gICAgICAgIHswLDgsMTE4fSx7MCw4LDU0fSx7MCw5LDIwNX0sezE3LDcsMTV9LHswLDgsMTAyfSx7MCw4LDM4fSx7MCw5LDE3M30sCi0gICAgICAgIHswLDgsNn0sezAsOCwxMzR9LHswLDgsNzB9LHswLDksMjM3fSx7MTYsNyw5fSx7MCw4LDk0fSx7MCw4LDMwfSwKLSAgICAgICAgezAsOSwxNTd9LHsyMCw3LDk5fSx7MCw4LDEyNn0sezAsOCw2Mn0sezAsOSwyMjF9LHsxOCw3LDI3fSx7MCw4LDExMH0sCi0gICAgICAgIHswLDgsNDZ9LHswLDksMTg5fSx7MCw4LDE0fSx7MCw4LDE0Mn0sezAsOCw3OH0sezAsOSwyNTN9LHs5Niw3LDB9LAotICAgICAgICB7MCw4LDgxfSx7MCw4LDE3fSx7MjEsOCwxMzF9LHsxOCw3LDMxfSx7MCw4LDExM30sezAsOCw0OX0sezAsOSwxOTV9LAotICAgICAgICB7MTYsNywxMH0sezAsOCw5N30sezAsOCwzM30sezAsOSwxNjN9LHswLDgsMX0sezAsOCwxMjl9LHswLDgsNjV9LAotICAgICAgICB7MCw5LDIyN30sezE2LDcsNn0sezAsOCw4OX0sezAsOCwyNX0sezAsOSwxNDd9LHsxOSw3LDU5fSx7MCw4LDEyMX0sCi0gICAgICAgIHswLDgsNTd9LHswLDksMjExfSx7MTcsNywxN30sezAsOCwxMDV9LHswLDgsNDF9LHswLDksMTc5fSx7MCw4LDl9LAotICAgICAgICB7MCw4LDEzN30sezAsOCw3M30sezAsOSwyNDN9LHsxNiw3LDR9LHswLDgsODV9LHswLDgsMjF9LHsxNiw4LDI1OH0sCi0gICAgICAgIHsxOSw3LDQzfSx7MCw4LDExN30sezAsOCw1M30sezAsOSwyMDN9LHsxNyw3LDEzfSx7MCw4LDEwMX0sezAsOCwzN30sCi0gICAgICAgIHswLDksMTcxfSx7MCw4LDV9LHswLDgsMTMzfSx7MCw4LDY5fSx7MCw5LDIzNX0sezE2LDcsOH0sezAsOCw5M30sCi0gICAgICAgIHswLDgsMjl9LHswLDksMTU1fSx7MjAsNyw4M30sezAsOCwxMjV9LHswLDgsNjF9LHswLDksMjE5fSx7MTgsNywyM30sCi0gICAgICAgIHswLDgsMTA5fSx7MCw4LDQ1fSx7MCw5LDE4N30sezAsOCwxM30sezAsOCwxNDF9LHswLDgsNzd9LHswLDksMjUxfSwKLSAgICAgICAgezE2LDcsM30sezAsOCw4M30sezAsOCwxOX0sezIxLDgsMTk1fSx7MTksNywzNX0sezAsOCwxMTV9LHswLDgsNTF9LAotICAgICAgICB7MCw5LDE5OX0sezE3LDcsMTF9LHswLDgsOTl9LHswLDgsMzV9LHswLDksMTY3fSx7MCw4LDN9LHswLDgsMTMxfSwKLSAgICAgICAgezAsOCw2N30sezAsOSwyMzF9LHsxNiw3LDd9LHswLDgsOTF9LHswLDgsMjd9LHswLDksMTUxfSx7MjAsNyw2N30sCi0gICAgICAgIHswLDgsMTIzfSx7MCw4LDU5fSx7MCw5LDIxNX0sezE4LDcsMTl9LHswLDgsMTA3fSx7MCw4LDQzfSx7MCw5LDE4M30sCi0gICAgICAgIHswLDgsMTF9LHswLDgsMTM5fSx7MCw4LDc1fSx7MCw5LDI0N30sezE2LDcsNX0sezAsOCw4N30sezAsOCwyM30sCi0gICAgICAgIHs2NCw4LDB9LHsxOSw3LDUxfSx7MCw4LDExOX0sezAsOCw1NX0sezAsOSwyMDd9LHsxNyw3LDE1fSx7MCw4LDEwM30sCi0gICAgICAgIHswLDgsMzl9LHswLDksMTc1fSx7MCw4LDd9LHswLDgsMTM1fSx7MCw4LDcxfSx7MCw5LDIzOX0sezE2LDcsOX0sCi0gICAgICAgIHswLDgsOTV9LHswLDgsMzF9LHswLDksMTU5fSx7MjAsNyw5OX0sezAsOCwxMjd9LHswLDgsNjN9LHswLDksMjIzfSwKLSAgICAgICAgezE4LDcsMjd9LHswLDgsMTExfSx7MCw4LDQ3fSx7MCw5LDE5MX0sezAsOCwxNX0sezAsOCwxNDN9LHswLDgsNzl9LAotICAgICAgICB7MCw5LDI1NX0KLSAgICB9OwotCi0gICAgc3RhdGljIGNvbnN0IGNvZGUgZGlzdGZpeFszMl0gPSB7Ci0gICAgICAgIHsxNiw1LDF9LHsyMyw1LDI1N30sezE5LDUsMTd9LHsyNyw1LDQwOTd9LHsxNyw1LDV9LHsyNSw1LDEwMjV9LAotICAgICAgICB7MjEsNSw2NX0sezI5LDUsMTYzODV9LHsxNiw1LDN9LHsyNCw1LDUxM30sezIwLDUsMzN9LHsyOCw1LDgxOTN9LAotICAgICAgICB7MTgsNSw5fSx7MjYsNSwyMDQ5fSx7MjIsNSwxMjl9LHs2NCw1LDB9LHsxNiw1LDJ9LHsyMyw1LDM4NX0sCi0gICAgICAgIHsxOSw1LDI1fSx7MjcsNSw2MTQ1fSx7MTcsNSw3fSx7MjUsNSwxNTM3fSx7MjEsNSw5N30sezI5LDUsMjQ1Nzd9LAotICAgICAgICB7MTYsNSw0fSx7MjQsNSw3Njl9LHsyMCw1LDQ5fSx7MjgsNSwxMjI4OX0sezE4LDUsMTN9LHsyNiw1LDMwNzN9LAotICAgICAgICB7MjIsNSwxOTN9LHs2NCw1LDB9Ci0gICAgfTsKZGlmZiAtLWdpdCBhL3NyYy96bGliL2luZmxhdGUuYyBiL3NyYy96bGliL2luZmxhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0MThhMS4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9pbmZsYXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDk2ICswLDAgQEAKLS8qIGluZmxhdGUuYyAtLSB6bGliIGRlY29tcHJlc3Npb24KLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEyIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKgotICogQ2hhbmdlIGhpc3Rvcnk6Ci0gKgotICogMS4yLmJldGEwICAgIDI0IE5vdiAyMDAyCi0gKiAtIEZpcnN0IHZlcnNpb24gLS0gY29tcGxldGUgcmV3cml0ZSBvZiBpbmZsYXRlIHRvIHNpbXBsaWZ5IGNvZGUsIGF2b2lkCi0gKiAgIGNyZWF0aW9uIG9mIHdpbmRvdyB3aGVuIG5vdCBuZWVkZWQsIG1pbmltaXplIHVzZSBvZiB3aW5kb3cgd2hlbiBpdCBpcwotICogICBuZWVkZWQsIG1ha2UgaW5mZmFzdC5jIGV2ZW4gZmFzdGVyLCBpbXBsZW1lbnQgZ3ppcCBkZWNvZGluZywgYW5kIHRvCi0gKiAgIGltcHJvdmUgY29kZSByZWFkYWJpbGl0eSBhbmQgc3R5bGUgb3ZlciB0aGUgcHJldmlvdXMgemxpYiBpbmZsYXRlIGNvZGUKLSAqCi0gKiAxLjIuYmV0YTEgICAgMjUgTm92IDIwMDIKLSAqIC0gVXNlIHBvaW50ZXJzIGZvciBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCBjaGVja2luZyBpbiBpbmZmYXN0LmMKLSAqIC0gUmVtb3ZlIGlucHV0IGFuZCBvdXRwdXQgY291bnRlcnMgaW4gaW5mZmFzdC5jCi0gKiAtIENoYW5nZSBpbmZmYXN0LmMgZW50cnkgYW5kIGxvb3AgZnJvbSBhdmFpbF9pbiA+PSA3IHRvID49IDYKLSAqIC0gUmVtb3ZlIHVubmVjZXNzYXJ5IHNlY29uZCBieXRlIHB1bGwgZnJvbSBsZW5ndGggZXh0cmEgaW4gaW5mZmFzdC5jCi0gKiAtIFVucm9sbCBkaXJlY3QgY29weSB0byB0aHJlZSBjb3BpZXMgcGVyIGxvb3AgaW4gaW5mZmFzdC5jCi0gKgotICogMS4yLmJldGEyICAgIDQgRGVjIDIwMDIKLSAqIC0gQ2hhbmdlIGV4dGVybmFsIHJvdXRpbmUgbmFtZXMgdG8gcmVkdWNlIHBvdGVudGlhbCBjb25mbGljdHMKLSAqIC0gQ29ycmVjdCBmaWxlbmFtZSB0byBpbmZmaXhlZC5oIGZvciBmaXhlZCB0YWJsZXMgaW4gaW5mbGF0ZS5jCi0gKiAtIE1ha2UgaGJ1ZltdIHVuc2lnbmVkIGNoYXIgdG8gbWF0Y2ggcGFyYW1ldGVyIHR5cGUgaW4gaW5mbGF0ZS5jCi0gKiAtIENoYW5nZSBzdHJtLT5uZXh0X291dFstc3RhdGUtPm9mZnNldF0gdG8gKihzdHJtLT5uZXh0X291dCAtIHN0YXRlLT5vZmZzZXQpCi0gKiAgIHRvIGF2b2lkIG5lZ2F0aW9uIHByb2JsZW0gb24gQWxwaGFzICg2NCBiaXQpIGluIGluZmxhdGUuYwotICoKLSAqIDEuMi5iZXRhMyAgICAyMiBEZWMgMjAwMgotICogLSBBZGQgY29tbWVudHMgb24gc3RhdGUtPmJpdHMgYXNzZXJ0aW9uIGluIGluZmZhc3QuYwotICogLSBBZGQgY29tbWVudHMgb24gb3AgZmllbGQgaW4gaW5mdHJlZXMuaAotICogLSBGaXggYnVnIGluIHJldXNlIG9mIGFsbG9jYXRlZCB3aW5kb3cgYWZ0ZXIgaW5mbGF0ZVJlc2V0KCkKLSAqIC0gUmVtb3ZlIGJpdCBmaWVsZHMtLWJhY2sgdG8gYnl0ZSBzdHJ1Y3R1cmUgZm9yIHNwZWVkCi0gKiAtIFJlbW92ZSBkaXN0YW5jZSBleHRyYSA9PSAwIGNoZWNrIGluIGluZmxhdGVfZmFzdCgpLS1vbmx5IGhlbHBzIGZvciBsZW5ndGhzCi0gKiAtIENoYW5nZSBwb3N0LWluY3JlbWVudHMgdG8gcHJlLWluY3JlbWVudHMgaW4gaW5mbGF0ZV9mYXN0KCksIFBQQyBiaWFzZWQ/Ci0gKiAtIEFkZCBjb21waWxlIHRpbWUgb3B0aW9uLCBQT1NUSU5DLCB0byB1c2UgcG9zdC1pbmNyZW1lbnRzIGluc3RlYWQgKEludGVsPykKLSAqIC0gTWFrZSBNQVRDSCBjb3B5IGluIGluZmxhdGUoKSBtdWNoIGZhc3RlciBmb3Igd2hlbiBpbmZsYXRlX2Zhc3QoKSBub3QgdXNlZAotICogLSBVc2UgbG9jYWwgY29waWVzIG9mIHN0cmVhbSBuZXh0IGFuZCBhdmFpbCB2YWx1ZXMsIGFzIHdlbGwgYXMgbG9jYWwgYml0Ci0gKiAgIGJ1ZmZlciBhbmQgYml0IGNvdW50IGluIGluZmxhdGUoKS0tZm9yIHNwZWVkIHdoZW4gaW5mbGF0ZV9mYXN0KCkgbm90IHVzZWQKLSAqCi0gKiAxLjIuYmV0YTQgICAgMSBKYW4gMjAwMwotICogLSBTcGxpdCBwdHIgLSAyNTcgc3RhdGVtZW50cyBpbiBpbmZsYXRlX3RhYmxlKCkgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MKLSAqIC0gTW92ZSBhIGNvbW1lbnQgb24gb3V0cHV0IGJ1ZmZlciBzaXplcyBmcm9tIGluZmZhc3QuYyB0byBpbmZsYXRlLmMKLSAqIC0gQWRkIGNvbW1lbnRzIGluIGluZmZhc3QuYyB0byBpbnRyb2R1Y2UgdGhlIGluZmxhdGVfZmFzdCgpIHJvdXRpbmUKLSAqIC0gUmVhcnJhbmdlIHdpbmRvdyBjb3BpZXMgaW4gaW5mbGF0ZV9mYXN0KCkgZm9yIHNwZWVkIGFuZCBzaW1wbGlmaWNhdGlvbgotICogLSBVbnJvbGwgbGFzdCBjb3B5IGZvciB3aW5kb3cgbWF0Y2ggaW4gaW5mbGF0ZV9mYXN0KCkKLSAqIC0gVXNlIGxvY2FsIGNvcGllcyBvZiB3aW5kb3cgdmFyaWFibGVzIGluIGluZmxhdGVfZmFzdCgpIGZvciBzcGVlZAotICogLSBQdWxsIG91dCBjb21tb24gd25leHQgPT0gMCBjYXNlIGZvciBzcGVlZCBpbiBpbmZsYXRlX2Zhc3QoKQotICogLSBNYWtlIG9wIGFuZCBsZW4gaW4gaW5mbGF0ZV9mYXN0KCkgdW5zaWduZWQgZm9yIGNvbnNpc3RlbmN5Ci0gKiAtIEFkZCBGQVIgdG8gbGNvZGUgYW5kIGRjb2RlIGRlY2xhcmF0aW9ucyBpbiBpbmZsYXRlX2Zhc3QoKQotICogLSBTaW1wbGlmaWVkIGJhZCBkaXN0YW5jZSBjaGVjayBpbiBpbmZsYXRlX2Zhc3QoKQotICogLSBBZGRlZCBpbmZsYXRlQmFja0luaXQoKSwgaW5mbGF0ZUJhY2soKSwgYW5kIGluZmxhdGVCYWNrRW5kKCkgaW4gbmV3Ci0gKiAgIHNvdXJjZSBmaWxlIGluZmJhY2suYyB0byBwcm92aWRlIGEgY2FsbC1iYWNrIGludGVyZmFjZSB0byBpbmZsYXRlIGZvcgotICogICBwcm9ncmFtcyBsaWtlIGd6aXAgYW5kIHVuemlwIC0tIHVzZXMgd2luZG93IGFzIG91dHB1dCBidWZmZXIgdG8gYXZvaWQKLSAqICAgd2luZG93IGNvcHlpbmcKLSAqCi0gKiAxLjIuYmV0YTUgICAgMSBKYW4gMjAwMwotICogLSBJbXByb3ZlZCBpbmZsYXRlQmFjaygpIGludGVyZmFjZSB0byBhbGxvdyB0aGUgY2FsbGVyIHRvIHByb3ZpZGUgaW5pdGlhbAotICogICBpbnB1dCBpbiBzdHJtLgotICogLSBGaXhlZCBzdG9yZWQgYmxvY2tzIGJ1ZyBpbiBpbmZsYXRlQmFjaygpCi0gKgotICogMS4yLmJldGE2ICAgIDQgSmFuIDIwMDMKLSAqIC0gQWRkZWQgY29tbWVudHMgaW4gaW5mZmFzdC5jIG9uIGVmZmVjdGl2ZW5lc3Mgb2YgUE9TVElOQwotICogLSBUeXBlY2FzdGluZyBhbGwgYXJvdW5kIHRvIHJlZHVjZSBjb21waWxlciB3YXJuaW5ncwotICogLSBDaGFuZ2VkIGxvb3BzIGZyb20gd2hpbGUgKDEpIG9yIGRvIHt9IHdoaWxlICgxKSB0byBmb3IgKDs7KSwgYWdhaW4gdG8KLSAqICAgbWFrZSBjb21waWxlcnMgaGFwcHkKLSAqIC0gQ2hhbmdlZCB0eXBlIG9mIHdpbmRvdyBpbiBpbmZsYXRlQmFja0luaXQoKSB0byB1bnNpZ25lZCBjaGFyICoKLSAqCi0gKiAxLjIuYmV0YTcgICAgMjcgSmFuIDIwMDMKLSAqIC0gQ2hhbmdlZCBtYW55IHR5cGVzIHRvIHVuc2lnbmVkIG9yIHVuc2lnbmVkIHNob3J0IHRvIGF2b2lkIHdhcm5pbmdzCi0gKiAtIEFkZGVkIGluZmxhdGVDb3B5KCkgZnVuY3Rpb24KLSAqCi0gKiAxLjIuMCAgICAgICAgOSBNYXIgMjAwMwotICogLSBDaGFuZ2VkIGluZmxhdGVCYWNrKCkgaW50ZXJmYWNlIHRvIHByb3ZpZGUgc2VwYXJhdGUgb3BhcXVlIGRlc2NyaXB0b3JzCi0gKiAgIGZvciB0aGUgaW4oKSBhbmQgb3V0KCkgZnVuY3Rpb25zCi0gKiAtIENoYW5nZWQgaW5mbGF0ZUJhY2soKSBhcmd1bWVudCBhbmQgaW5fZnVuYyB0eXBlZGVmIHRvIHN3YXAgdGhlIGxlbmd0aAotICogICBhbmQgYnVmZmVyIGFkZHJlc3MgcmV0dXJuIHZhbHVlcyBmb3IgdGhlIGlucHV0IGZ1bmN0aW9uCi0gKiAtIENoZWNrIG5leHRfaW4gYW5kIG5leHRfb3V0IGZvciBaX05VTEwgb24gZW50cnkgdG8gaW5mbGF0ZSgpCi0gKgotICogVGhlIGhpc3RvcnkgZm9yIHZlcnNpb25zIGFmdGVyIDEuMi4wIGFyZSBpbiBDaGFuZ2VMb2cgaW4gemxpYiBkaXN0cmlidXRpb24uCi0gKi8KLQotI2luY2x1ZGUgInp1dGlsLmgiCi0jaW5jbHVkZSAiaW5mdHJlZXMuaCIKLSNpbmNsdWRlICJpbmZsYXRlLmgiCi0jaW5jbHVkZSAiaW5mZmFzdC5oIgotCi0jaWZkZWYgTUFLRUZJWEVECi0jICBpZm5kZWYgQlVJTERGSVhFRAotIyAgICBkZWZpbmUgQlVJTERGSVhFRAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCi1sb2NhbCB2b2lkIGZpeGVkdGFibGVzIE9GKChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlKSk7Ci1sb2NhbCBpbnQgdXBkYXRld2luZG93IE9GKCh6X3N0cmVhbXAgc3RybSwgdW5zaWduZWQgb3V0KSk7Ci0jaWZkZWYgQlVJTERGSVhFRAotICAgdm9pZCBtYWtlZml4ZWQgT0YoKHZvaWQpKTsKLSNlbmRpZgotbG9jYWwgdW5zaWduZWQgc3luY3NlYXJjaCBPRigodW5zaWduZWQgRkFSICpoYXZlLCB1bnNpZ25lZCBjaGFyIEZBUiAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuKSk7Ci0KLWludCBaRVhQT1JUIGluZmxhdGVSZXNldEtlZXAoc3RybSkKLXpfc3RyZWFtcCBzdHJtOwotewotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7Ci0gICAgc3RybS0+dG90YWxfaW4gPSBzdHJtLT50b3RhbF9vdXQgPSBzdGF0ZS0+dG90YWwgPSAwOwotICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsKLSAgICBpZiAoc3RhdGUtPndyYXApICAgICAgICAvKiB0byBzdXBwb3J0IGlsbC1jb25jZWl2ZWQgSmF2YSB0ZXN0IHN1aXRlICovCi0gICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPndyYXAgJiAxOwotICAgIHN0YXRlLT5tb2RlID0gSEVBRDsKLSAgICBzdGF0ZS0+bGFzdCA9IDA7Ci0gICAgc3RhdGUtPmhhdmVkaWN0ID0gMDsKLSAgICBzdGF0ZS0+ZG1heCA9IDMyNzY4VTsKLSAgICBzdGF0ZS0+aGVhZCA9IFpfTlVMTDsKLSAgICBzdGF0ZS0+aG9sZCA9IDA7Ci0gICAgc3RhdGUtPmJpdHMgPSAwOwotICAgIHN0YXRlLT5sZW5jb2RlID0gc3RhdGUtPmRpc3Rjb2RlID0gc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7Ci0gICAgc3RhdGUtPnNhbmUgPSAxOwotICAgIHN0YXRlLT5iYWNrID0gLTE7Ci0gICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiByZXNldFxuIikpOwotICAgIHJldHVybiBaX09LOwotfQotCi1pbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQoc3RybSkKLXpfc3RyZWFtcCBzdHJtOwotewotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7Ci0gICAgc3RhdGUtPndzaXplID0gMDsKLSAgICBzdGF0ZS0+d2hhdmUgPSAwOwotICAgIHN0YXRlLT53bmV4dCA9IDA7Ci0gICAgcmV0dXJuIGluZmxhdGVSZXNldEtlZXAoc3RybSk7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykKLXpfc3RyZWFtcCBzdHJtOwotaW50IHdpbmRvd0JpdHM7Ci17Ci0gICAgaW50IHdyYXA7Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLQotICAgIC8qIGdldCB0aGUgc3RhdGUgKi8KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7Ci0KLSAgICAvKiBleHRyYWN0IHdyYXAgcmVxdWVzdCBmcm9tIHdpbmRvd0JpdHMgcGFyYW1ldGVyICovCi0gICAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7Ci0gICAgICAgIHdyYXAgPSAwOwotICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxOwotI2lmZGVmIEdVTlpJUAotICAgICAgICBpZiAod2luZG93Qml0cyA8IDQ4KQotICAgICAgICAgICAgd2luZG93Qml0cyAmPSAxNTsKLSNlbmRpZgotICAgIH0KLQotICAgIC8qIHNldCBudW1iZXIgb2Ygd2luZG93IGJpdHMsIGZyZWUgd2luZG93IGlmIGRpZmZlcmVudCAqLwotICAgIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgaWYgKHN0YXRlLT53aW5kb3cgIT0gWl9OVUxMICYmIHN0YXRlLT53Yml0cyAhPSAodW5zaWduZWQpd2luZG93Qml0cykgewotICAgICAgICBaRlJFRShzdHJtLCBzdGF0ZS0+d2luZG93KTsKLSAgICAgICAgc3RhdGUtPndpbmRvdyA9IFpfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJlc2V0IHRoZSByZXN0IG9mIGl0ICovCi0gICAgc3RhdGUtPndyYXAgPSB3cmFwOwotICAgIHN0YXRlLT53Yml0cyA9ICh1bnNpZ25lZCl3aW5kb3dCaXRzOwotICAgIHJldHVybiBpbmZsYXRlUmVzZXQoc3RybSk7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVJbml0Ml8oc3RybSwgd2luZG93Qml0cywgdmVyc2lvbiwgc3RyZWFtX3NpemUpCi16X3N0cmVhbXAgc3RybTsKLWludCB3aW5kb3dCaXRzOwotY29uc3QgY2hhciAqdmVyc2lvbjsKLWludCBzdHJlYW1fc2l6ZTsKLXsKLSAgICBpbnQgcmV0OwotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0KLSAgICBpZiAodmVyc2lvbiA9PSBaX05VTEwgfHwgdmVyc2lvblswXSAhPSBaTElCX1ZFUlNJT05bMF0gfHwKLSAgICAgICAgc3RyZWFtX3NpemUgIT0gKGludCkoc2l6ZW9mKHpfc3RyZWFtKSkpCi0gICAgICAgIHJldHVybiBaX1ZFUlNJT05fRVJST1I7Ci0gICAgaWYgKHN0cm0gPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RybS0+bXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi8KLSAgICBpZiAoc3RybS0+emFsbG9jID09IChhbGxvY19mdW5jKTApIHsKLSNpZmRlZiBaX1NPTE8KLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotI2Vsc2UKLSAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKLSAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOwotI2VuZGlmCi0gICAgfQotICAgIGlmIChzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApCi0jaWZkZWYgWl9TT0xPCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSNlbHNlCi0gICAgICAgIHN0cm0tPnpmcmVlID0gemNmcmVlOwotI2VuZGlmCi0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopCi0gICAgICAgICAgICBaQUxMT0Moc3RybSwgMSwgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7Ci0gICAgaWYgKHN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOwotICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogYWxsb2NhdGVkXG4iKSk7Ci0gICAgc3RybS0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKXN0YXRlOwotICAgIHN0YXRlLT53aW5kb3cgPSBaX05VTEw7Ci0gICAgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTsKLSAgICBpZiAocmV0ICE9IFpfT0spIHsKLSAgICAgICAgWkZSRUUoc3RybSwgc3RhdGUpOwotICAgICAgICBzdHJtLT5zdGF0ZSA9IFpfTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50IFpFWFBPUlQgaW5mbGF0ZUluaXRfKHN0cm0sIHZlcnNpb24sIHN0cmVhbV9zaXplKQotel9zdHJlYW1wIHN0cm07Ci1jb25zdCBjaGFyICp2ZXJzaW9uOwotaW50IHN0cmVhbV9zaXplOwotewotICAgIHJldHVybiBpbmZsYXRlSW5pdDJfKHN0cm0sIERFRl9XQklUUywgdmVyc2lvbiwgc3RyZWFtX3NpemUpOwotfQotCi1pbnQgWkVYUE9SVCBpbmZsYXRlUHJpbWUoc3RybSwgYml0cywgdmFsdWUpCi16X3N0cmVhbXAgc3RybTsKLWludCBiaXRzOwotaW50IHZhbHVlOwotewotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7Ci0gICAgaWYgKGJpdHMgPCAwKSB7Ci0gICAgICAgIHN0YXRlLT5ob2xkID0gMDsKLSAgICAgICAgc3RhdGUtPmJpdHMgPSAwOwotICAgICAgICByZXR1cm4gWl9PSzsKLSAgICB9Ci0gICAgaWYgKGJpdHMgPiAxNiB8fCBzdGF0ZS0+Yml0cyArIGJpdHMgPiAzMikgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIHZhbHVlICY9ICgxTCA8PCBiaXRzKSAtIDE7Ci0gICAgc3RhdGUtPmhvbGQgKz0gdmFsdWUgPDwgc3RhdGUtPmJpdHM7Ci0gICAgc3RhdGUtPmJpdHMgKz0gYml0czsKLSAgICByZXR1cm4gWl9PSzsKLX0KLQotLyoKLSAgIFJldHVybiBzdGF0ZSB3aXRoIGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGFuZCBpbmRleCBzaXplcyBzZXQgdG8KLSAgIGZpeGVkIGNvZGUgZGVjb2RpbmcuICBOb3JtYWxseSB0aGlzIHJldHVybnMgZml4ZWQgdGFibGVzIGZyb20gaW5mZml4ZWQuaC4KLSAgIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGUKLSAgIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQsIGFuZCByZXR1cm5zIHRob3NlIHRhYmxlcyB0aGUgZmlyc3QgdGltZSBhbmQKLSAgIHRoZXJlYWZ0ZXIuICBUaGlzIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGNvZGUgYnkgYWJvdXQgMksgYnl0ZXMsIGluCi0gICBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmUKLSAgIHVzZWQgZm9yIHRocmVhZGVkIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIHJld3JpdGluZyBvZiB0aGUgdGFibGVzIGFuZCB2aXJnaW4KLSAgIG1heSBub3QgYmUgdGhyZWFkLXNhZmUuCi0gKi8KLWxvY2FsIHZvaWQgZml4ZWR0YWJsZXMoc3RhdGUpCi1zdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotewotI2lmZGVmIEJVSUxERklYRUQKLSAgICBzdGF0aWMgaW50IHZpcmdpbiA9IDE7Ci0gICAgc3RhdGljIGNvZGUgKmxlbmZpeCwgKmRpc3RmaXg7Ci0gICAgc3RhdGljIGNvZGUgZml4ZWRbNTQ0XTsKLQotICAgIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovCi0gICAgaWYgKHZpcmdpbikgewotICAgICAgICB1bnNpZ25lZCBzeW0sIGJpdHM7Ci0gICAgICAgIHN0YXRpYyBjb2RlICpuZXh0OwotCi0gICAgICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovCi0gICAgICAgIHN5bSA9IDA7Ci0gICAgICAgIHdoaWxlIChzeW0gPCAxNDQpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDg7Ci0gICAgICAgIHdoaWxlIChzeW0gPCAyNTYpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDk7Ci0gICAgICAgIHdoaWxlIChzeW0gPCAyODApIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDc7Ci0gICAgICAgIHdoaWxlIChzeW0gPCAyODgpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDg7Ci0gICAgICAgIG5leHQgPSBmaXhlZDsKLSAgICAgICAgbGVuZml4ID0gbmV4dDsKLSAgICAgICAgYml0cyA9IDk7Ci0gICAgICAgIGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUtPmxlbnMsIDI4OCwgJihuZXh0KSwgJihiaXRzKSwgc3RhdGUtPndvcmspOwotCi0gICAgICAgIC8qIGRpc3RhbmNlIHRhYmxlICovCi0gICAgICAgIHN5bSA9IDA7Ci0gICAgICAgIHdoaWxlIChzeW0gPCAzMikgc3RhdGUtPmxlbnNbc3ltKytdID0gNTsKLSAgICAgICAgZGlzdGZpeCA9IG5leHQ7Ci0gICAgICAgIGJpdHMgPSA1OwotICAgICAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS0+bGVucywgMzIsICYobmV4dCksICYoYml0cyksIHN0YXRlLT53b3JrKTsKLQotICAgICAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqLwotICAgICAgICB2aXJnaW4gPSAwOwotICAgIH0KLSNlbHNlIC8qICFCVUlMREZJWEVEICovCi0jICAgaW5jbHVkZSAiaW5mZml4ZWQuaCIKLSNlbmRpZiAvKiBCVUlMREZJWEVEICovCi0gICAgc3RhdGUtPmxlbmNvZGUgPSBsZW5maXg7Ci0gICAgc3RhdGUtPmxlbmJpdHMgPSA5OwotICAgIHN0YXRlLT5kaXN0Y29kZSA9IGRpc3RmaXg7Ci0gICAgc3RhdGUtPmRpc3RiaXRzID0gNTsKLX0KLQotI2lmZGVmIE1BS0VGSVhFRAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qCi0gICBXcml0ZSBvdXQgdGhlIGluZmZpeGVkLmggdGhhdCBpcyAjaW5jbHVkZSdkIGFib3ZlLiAgRGVmaW5pbmcgTUFLRUZJWEVEIGFsc28KLSAgIGRlZmluZXMgQlVJTERGSVhFRCwgc28gdGhlIHRhYmxlcyBhcmUgYnVpbHQgb24gdGhlIGZseS4gIG1ha2VmaXhlZCgpIHdyaXRlcwotICAgdGhvc2UgdGFibGVzIHRvIHN0ZG91dCwgd2hpY2ggd291bGQgYmUgcGlwZWQgdG8gaW5mZml4ZWQuaC4gIEEgc21hbGwgcHJvZ3JhbQotICAgY2FuIHNpbXBseSBjYWxsIG1ha2VmaXhlZCB0byBkbyB0aGlzOgotCi0gICAgdm9pZCBtYWtlZml4ZWQodm9pZCk7Ci0KLSAgICBpbnQgbWFpbih2b2lkKQotICAgIHsKLSAgICAgICAgbWFrZWZpeGVkKCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgVGhlbiB0aGF0IGNhbiBiZSBsaW5rZWQgd2l0aCB6bGliIGJ1aWx0IHdpdGggTUFLRUZJWEVEIGRlZmluZWQgYW5kIHJ1bjoKLQotICAgIGEub3V0ID4gaW5mZml4ZWQuaAotICovCi12b2lkIG1ha2VmaXhlZCgpCi17Ci0gICAgdW5zaWduZWQgbG93LCBzaXplOwotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIHN0YXRlOwotCi0gICAgZml4ZWR0YWJsZXMoJnN0YXRlKTsKLSAgICBwdXRzKCIgICAgLyogaW5mZml4ZWQuaCAtLSB0YWJsZSBmb3IgZGVjb2RpbmcgZml4ZWQgY29kZXMiKTsKLSAgICBwdXRzKCIgICAgICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgbWFrZWZpeGVkKCkuIik7Ci0gICAgcHV0cygiICAgICAqLyIpOwotICAgIHB1dHMoIiIpOwotICAgIHB1dHMoIiAgICAvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiIpOwotICAgIHB1dHMoIiAgICAgICBJdCBpcyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGxpYnJhcnkgYW5kIGlzIik7Ci0gICAgcHV0cygiICAgICAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4iKTsKLSAgICBwdXRzKCIgICAgICovIik7Ci0gICAgcHV0cygiIik7Ci0gICAgc2l6ZSA9IDFVIDw8IDk7Ci0gICAgcHJpbnRmKCIgICAgc3RhdGljIGNvbnN0IGNvZGUgbGVuZml4WyV1XSA9IHsiLCBzaXplKTsKLSAgICBsb3cgPSAwOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKChsb3cgJSA3KSA9PSAwKSBwcmludGYoIlxuICAgICAgICAiKTsKLSAgICAgICAgcHJpbnRmKCJ7JXUsJXUsJWR9IiwgKGxvdyAmIDEyNykgPT0gOTkgPyA2NCA6IHN0YXRlLmxlbmNvZGVbbG93XS5vcCwKLSAgICAgICAgICAgICAgIHN0YXRlLmxlbmNvZGVbbG93XS5iaXRzLCBzdGF0ZS5sZW5jb2RlW2xvd10udmFsKTsKLSAgICAgICAgaWYgKCsrbG93ID09IHNpemUpIGJyZWFrOwotICAgICAgICBwdXRjaGFyKCcsJyk7Ci0gICAgfQotICAgIHB1dHMoIlxuICAgIH07Iik7Ci0gICAgc2l6ZSA9IDFVIDw8IDU7Ci0gICAgcHJpbnRmKCJcbiAgICBzdGF0aWMgY29uc3QgY29kZSBkaXN0Zml4WyV1XSA9IHsiLCBzaXplKTsKLSAgICBsb3cgPSAwOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKChsb3cgJSA2KSA9PSAwKSBwcmludGYoIlxuICAgICAgICAiKTsKLSAgICAgICAgcHJpbnRmKCJ7JXUsJXUsJWR9Iiwgc3RhdGUuZGlzdGNvZGVbbG93XS5vcCwgc3RhdGUuZGlzdGNvZGVbbG93XS5iaXRzLAotICAgICAgICAgICAgICAgc3RhdGUuZGlzdGNvZGVbbG93XS52YWwpOwotICAgICAgICBpZiAoKytsb3cgPT0gc2l6ZSkgYnJlYWs7Ci0gICAgICAgIHB1dGNoYXIoJywnKTsKLSAgICB9Ci0gICAgcHV0cygiXG4gICAgfTsiKTsKLX0KLSNlbmRpZiAvKiBNQUtFRklYRUQgKi8KLQotLyoKLSAgIFVwZGF0ZSB0aGUgd2luZG93IHdpdGggdGhlIGxhc3Qgd3NpemUgKG5vcm1hbGx5IDMySykgYnl0ZXMgd3JpdHRlbiBiZWZvcmUKLSAgIHJldHVybmluZy4gIElmIHdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQsIGNyZWF0ZSBpdC4gIFRoaXMgaXMgb25seSBjYWxsZWQKLSAgIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4gb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gZHVyaW5nIHRoaXMKLSAgIGluZmxhdGUgY2FsbCwgYnV0IHRoZSBlbmQgb2YgdGhlIGRlZmxhdGUgc3RyZWFtIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldC4KLSAgIEl0IGlzIGFsc28gY2FsbGVkIHRvIGNyZWF0ZSBhIHdpbmRvdyBmb3IgZGljdGlvbmFyeSBkYXRhIHdoZW4gYSBkaWN0aW9uYXJ5Ci0gICBpcyBsb2FkZWQuCi0KLSAgIFByb3ZpZGluZyBvdXRwdXQgYnVmZmVycyBsYXJnZXIgdGhhbiAzMksgdG8gaW5mbGF0ZSgpIHNob3VsZCBwcm92aWRlIGEgc3BlZWQKLSAgIGFkdmFudGFnZSwgc2luY2Ugb25seSB0aGUgbGFzdCAzMksgb2Ygb3V0cHV0IGlzIGNvcGllZCB0byB0aGUgc2xpZGluZyB3aW5kb3cKLSAgIHVwb24gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLCBhbmQgc2luY2UgYWxsIGRpc3RhbmNlcyBhZnRlciB0aGUgZmlyc3QgMzJLIG9mCi0gICBvdXRwdXQgd2lsbCBmYWxsIGluIHRoZSBvdXRwdXQgZGF0YSwgbWFraW5nIG1hdGNoIGNvcGllcyBzaW1wbGVyIGFuZCBmYXN0ZXIuCi0gICBUaGUgYWR2YW50YWdlIG1heSBiZSBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvcidzIGRhdGEgY2FjaGVzLgotICovCi1sb2NhbCBpbnQgdXBkYXRld2luZG93KHN0cm0sIG91dCkKLXpfc3RyZWFtcCBzdHJtOwotdW5zaWduZWQgb3V0OwotewotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0gICAgdW5zaWduZWQgY29weSwgZGlzdDsKLQotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOwotCi0gICAgLyogaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHdpbmRvdyAqLwotICAgIGlmIChzdGF0ZS0+d2luZG93ID09IFpfTlVMTCkgewotICAgICAgICBzdGF0ZS0+d2luZG93ID0gKHVuc2lnbmVkIGNoYXIgRkFSICopCi0gICAgICAgICAgICAgICAgICAgICAgICBaQUxMT0Moc3RybSwgMVUgPDwgc3RhdGUtPndiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1bnNpZ25lZCBjaGFyKSk7Ci0gICAgICAgIGlmIChzdGF0ZS0+d2luZG93ID09IFpfTlVMTCkgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyogaWYgd2luZG93IG5vdCBpbiB1c2UgeWV0LCBpbml0aWFsaXplICovCi0gICAgaWYgKHN0YXRlLT53c2l6ZSA9PSAwKSB7Ci0gICAgICAgIHN0YXRlLT53c2l6ZSA9IDFVIDw8IHN0YXRlLT53Yml0czsKLSAgICAgICAgc3RhdGUtPnduZXh0ID0gMDsKLSAgICAgICAgc3RhdGUtPndoYXZlID0gMDsKLSAgICB9Ci0KLSAgICAvKiBjb3B5IHN0YXRlLT53c2l6ZSBvciBsZXNzIG91dHB1dCBieXRlcyBpbnRvIHRoZSBjaXJjdWxhciB3aW5kb3cgKi8KLSAgICBjb3B5ID0gb3V0IC0gc3RybS0+YXZhaWxfb3V0OwotICAgIGlmIChjb3B5ID49IHN0YXRlLT53c2l6ZSkgewotICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3csIHN0cm0tPm5leHRfb3V0IC0gc3RhdGUtPndzaXplLCBzdGF0ZS0+d3NpemUpOwotICAgICAgICBzdGF0ZS0+d25leHQgPSAwOwotICAgICAgICBzdGF0ZS0+d2hhdmUgPSBzdGF0ZS0+d3NpemU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBkaXN0ID0gc3RhdGUtPndzaXplIC0gc3RhdGUtPnduZXh0OwotICAgICAgICBpZiAoZGlzdCA+IGNvcHkpIGRpc3QgPSBjb3B5OwotICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3cgKyBzdGF0ZS0+d25leHQsIHN0cm0tPm5leHRfb3V0IC0gY29weSwgZGlzdCk7Ci0gICAgICAgIGNvcHkgLT0gZGlzdDsKLSAgICAgICAgaWYgKGNvcHkpIHsKLSAgICAgICAgICAgIHptZW1jcHkoc3RhdGUtPndpbmRvdywgc3RybS0+bmV4dF9vdXQgLSBjb3B5LCBjb3B5KTsKLSAgICAgICAgICAgIHN0YXRlLT53bmV4dCA9IGNvcHk7Ci0gICAgICAgICAgICBzdGF0ZS0+d2hhdmUgPSBzdGF0ZS0+d3NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzdGF0ZS0+d25leHQgKz0gZGlzdDsKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+d25leHQgPT0gc3RhdGUtPndzaXplKSBzdGF0ZS0+d25leHQgPSAwOwotICAgICAgICAgICAgaWYgKHN0YXRlLT53aGF2ZSA8IHN0YXRlLT53c2l6ZSkgc3RhdGUtPndoYXZlICs9IGRpc3Q7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIE1hY3JvcyBmb3IgaW5mbGF0ZSgpOiAqLwotCi0vKiBjaGVjayBmdW5jdGlvbiB0byB1c2UgYWRsZXIzMigpIGZvciB6bGliIG9yIGNyYzMyKCkgZm9yIGd6aXAgKi8KLSNpZmRlZiBHVU5aSVAKLSMgIGRlZmluZSBVUERBVEUoY2hlY2ssIGJ1ZiwgbGVuKSBcCi0gICAgKHN0YXRlLT5mbGFncyA/IGNyYzMyKGNoZWNrLCBidWYsIGxlbikgOiBhZGxlcjMyKGNoZWNrLCBidWYsIGxlbikpCi0jZWxzZQotIyAgZGVmaW5lIFVQREFURShjaGVjaywgYnVmLCBsZW4pIGFkbGVyMzIoY2hlY2ssIGJ1ZiwgbGVuKQotI2VuZGlmCi0KLS8qIGNoZWNrIG1hY3JvcyBmb3IgaGVhZGVyIGNyYyAqLwotI2lmZGVmIEdVTlpJUAotIyAgZGVmaW5lIENSQzIoY2hlY2ssIHdvcmQpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgaGJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKSh3b3JkKTsgXAotICAgICAgICBoYnVmWzFdID0gKHVuc2lnbmVkIGNoYXIpKCh3b3JkKSA+PiA4KTsgXAotICAgICAgICBjaGVjayA9IGNyYzMyKGNoZWNrLCBoYnVmLCAyKTsgXAotICAgIH0gd2hpbGUgKDApCi0KLSMgIGRlZmluZSBDUkM0KGNoZWNrLCB3b3JkKSBcCi0gICAgZG8geyBcCi0gICAgICAgIGhidWZbMF0gPSAodW5zaWduZWQgY2hhcikod29yZCk7IFwKLSAgICAgICAgaGJ1ZlsxXSA9ICh1bnNpZ25lZCBjaGFyKSgod29yZCkgPj4gOCk7IFwKLSAgICAgICAgaGJ1ZlsyXSA9ICh1bnNpZ25lZCBjaGFyKSgod29yZCkgPj4gMTYpOyBcCi0gICAgICAgIGhidWZbM10gPSAodW5zaWduZWQgY2hhcikoKHdvcmQpID4+IDI0KTsgXAotICAgICAgICBjaGVjayA9IGNyYzMyKGNoZWNrLCBoYnVmLCA0KTsgXAotICAgIH0gd2hpbGUgKDApCi0jZW5kaWYKLQotLyogTG9hZCByZWdpc3RlcnMgd2l0aCBzdGF0ZSBpbiBpbmZsYXRlKCkgZm9yIHNwZWVkICovCi0jZGVmaW5lIExPQUQoKSBcCi0gICAgZG8geyBcCi0gICAgICAgIHB1dCA9IHN0cm0tPm5leHRfb3V0OyBcCi0gICAgICAgIGxlZnQgPSBzdHJtLT5hdmFpbF9vdXQ7IFwKLSAgICAgICAgbmV4dCA9IHN0cm0tPm5leHRfaW47IFwKLSAgICAgICAgaGF2ZSA9IHN0cm0tPmF2YWlsX2luOyBcCi0gICAgICAgIGhvbGQgPSBzdGF0ZS0+aG9sZDsgXAotICAgICAgICBiaXRzID0gc3RhdGUtPmJpdHM7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBSZXN0b3JlIHN0YXRlIGZyb20gcmVnaXN0ZXJzIGluIGluZmxhdGUoKSAqLwotI2RlZmluZSBSRVNUT1JFKCkgXAotICAgIGRvIHsgXAotICAgICAgICBzdHJtLT5uZXh0X291dCA9IHB1dDsgXAotICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBsZWZ0OyBcCi0gICAgICAgIHN0cm0tPm5leHRfaW4gPSBuZXh0OyBcCi0gICAgICAgIHN0cm0tPmF2YWlsX2luID0gaGF2ZTsgXAotICAgICAgICBzdGF0ZS0+aG9sZCA9IGhvbGQ7IFwKLSAgICAgICAgc3RhdGUtPmJpdHMgPSBiaXRzOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogQ2xlYXIgdGhlIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqLwotI2RlZmluZSBJTklUQklUUygpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgaG9sZCA9IDA7IFwKLSAgICAgICAgYml0cyA9IDA7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBHZXQgYSBieXRlIG9mIGlucHV0IGludG8gdGhlIGJpdCBhY2N1bXVsYXRvciwgb3IgcmV0dXJuIGZyb20gaW5mbGF0ZSgpCi0gICBpZiB0aGVyZSBpcyBubyBpbnB1dCBhdmFpbGFibGUuICovCi0jZGVmaW5lIFBVTExCWVRFKCkgXAotICAgIGRvIHsgXAotICAgICAgICBpZiAoaGF2ZSA9PSAwKSBnb3RvIGluZl9sZWF2ZTsgXAotICAgICAgICBoYXZlLS07IFwKLSAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoKm5leHQrKykgPDwgYml0czsgXAotICAgICAgICBiaXRzICs9IDg7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBBc3N1cmUgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgbiBiaXRzIGluIHRoZSBiaXQgYWNjdW11bGF0b3IuICBJZiB0aGVyZSBpcwotICAgbm90IGVub3VnaCBhdmFpbGFibGUgaW5wdXQgdG8gZG8gdGhhdCwgdGhlbiByZXR1cm4gZnJvbSBpbmZsYXRlKCkuICovCi0jZGVmaW5lIE5FRURCSVRTKG4pIFwKLSAgICBkbyB7IFwKLSAgICAgICAgd2hpbGUgKGJpdHMgPCAodW5zaWduZWQpKG4pKSBcCi0gICAgICAgICAgICBQVUxMQllURSgpOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogUmV0dXJuIHRoZSBsb3cgbiBiaXRzIG9mIHRoZSBiaXQgYWNjdW11bGF0b3IgKG4gPCAxNikgKi8KLSNkZWZpbmUgQklUUyhuKSBcCi0gICAgKCh1bnNpZ25lZClob2xkICYgKCgxVSA8PCAobikpIC0gMSkpCi0KLS8qIFJlbW92ZSBuIGJpdHMgZnJvbSB0aGUgYml0IGFjY3VtdWxhdG9yICovCi0jZGVmaW5lIERST1BCSVRTKG4pIFwKLSAgICBkbyB7IFwKLSAgICAgICAgaG9sZCA+Pj0gKG4pOyBcCi0gICAgICAgIGJpdHMgLT0gKHVuc2lnbmVkKShuKTsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8qIFJlbW92ZSB6ZXJvIHRvIHNldmVuIGJpdHMgYXMgbmVlZGVkIHRvIGdvIHRvIGEgYnl0ZSBib3VuZGFyeSAqLwotI2RlZmluZSBCWVRFQklUUygpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgaG9sZCA+Pj0gYml0cyAmIDc7IFwKLSAgICAgICAgYml0cyAtPSBiaXRzICYgNzsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8qCi0gICBpbmZsYXRlKCkgdXNlcyBhIHN0YXRlIG1hY2hpbmUgdG8gcHJvY2VzcyBhcyBtdWNoIGlucHV0IGRhdGEgYW5kIGdlbmVyYXRlIGFzCi0gICBtdWNoIG91dHB1dCBkYXRhIGFzIHBvc3NpYmxlIGJlZm9yZSByZXR1cm5pbmcuICBUaGUgc3RhdGUgbWFjaGluZSBpcwotICAgc3RydWN0dXJlZCByb3VnaGx5IGFzIGZvbGxvd3M6Ci0KLSAgICBmb3IgKDs7KSBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgLi4uCi0gICAgY2FzZSBTVEFURW46Ci0gICAgICAgIGlmIChub3QgZW5vdWdoIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlIHRvIG1ha2UgcHJvZ3Jlc3MpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIC4uLiBtYWtlIHByb2dyZXNzIC4uLgotICAgICAgICBzdGF0ZSA9IFNUQVRFbTsKLSAgICAgICAgYnJlYWs7Ci0gICAgLi4uCi0gICAgfQotCi0gICBzbyB3aGVuIGluZmxhdGUoKSBpcyBjYWxsZWQgYWdhaW4sIHRoZSBzYW1lIGNhc2UgaXMgYXR0ZW1wdGVkIGFnYWluLCBhbmQKLSAgIGlmIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZXMgYXJlIHByb3ZpZGVkLCB0aGUgbWFjaGluZSBwcm9jZWVkcyB0byB0aGUKLSAgIG5leHQgc3RhdGUuICBUaGUgTkVFREJJVFMoKSBtYWNybyBpcyB1c3VhbGx5IHRoZSB3YXkgdGhlIHN0YXRlIGV2YWx1YXRlcwotICAgd2hldGhlciBpdCBjYW4gcHJvY2VlZCBvciBzaG91bGQgcmV0dXJuLiAgTkVFREJJVFMoKSBkb2VzIHRoZSByZXR1cm4gaWYKLSAgIHRoZSByZXF1ZXN0ZWQgYml0cyBhcmUgbm90IGF2YWlsYWJsZS4gIFRoZSB0eXBpY2FsIHVzZSBvZiB0aGUgQklUUyBtYWNyb3MKLSAgIGlzOgotCi0gICAgICAgIE5FRURCSVRTKG4pOwotICAgICAgICAuLi4gZG8gc29tZXRoaW5nIHdpdGggQklUUyhuKSAuLi4KLSAgICAgICAgRFJPUEJJVFMobik7Ci0KLSAgIHdoZXJlIE5FRURCSVRTKG4pIGVpdGhlciByZXR1cm5zIGZyb20gaW5mbGF0ZSgpIGlmIHRoZXJlIGlzbid0IGVub3VnaAotICAgaW5wdXQgbGVmdCB0byBsb2FkIG4gYml0cyBpbnRvIHRoZSBhY2N1bXVsYXRvciwgb3IgaXQgY29udGludWVzLiAgQklUUyhuKQotICAgZ2l2ZXMgdGhlIGxvdyBuIGJpdHMgaW4gdGhlIGFjY3VtdWxhdG9yLiAgV2hlbiBkb25lLCBEUk9QQklUUyhuKSBkcm9wcwotICAgdGhlIGxvdyBuIGJpdHMgb2ZmIHRoZSBhY2N1bXVsYXRvci4gIElOSVRCSVRTKCkgY2xlYXJzIHRoZSBhY2N1bXVsYXRvcgotICAgYW5kIHNldHMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgYml0cyB0byB6ZXJvLiAgQllURUJJVFMoKSBkaXNjYXJkcyBqdXN0Ci0gICBlbm91Z2ggYml0cyB0byBwdXQgdGhlIGFjY3VtdWxhdG9yIG9uIGEgYnl0ZSBib3VuZGFyeS4gIEFmdGVyIEJZVEVCSVRTKCkKLSAgIGFuZCBhIE5FRURCSVRTKDgpLCB0aGVuIEJJVFMoOCkgd291bGQgcmV0dXJuIHRoZSBuZXh0IGJ5dGUgaW4gdGhlIHN0cmVhbS4KLQotICAgTkVFREJJVFMobikgdXNlcyBQVUxMQllURSgpIHRvIGdldCBhbiBhdmFpbGFibGUgYnl0ZSBvZiBpbnB1dCwgb3IgdG8gcmV0dXJuCi0gICBpZiB0aGVyZSBpcyBubyBpbnB1dCBhdmFpbGFibGUuICBUaGUgZGVjb2Rpbmcgb2YgdmFyaWFibGUgbGVuZ3RoIGNvZGVzIHVzZXMKLSAgIFBVTExCWVRFKCkgZGlyZWN0bHkgaW4gb3JkZXIgdG8gcHVsbCBqdXN0IGVub3VnaCBieXRlcyB0byBkZWNvZGUgdGhlIG5leHQKLSAgIGNvZGUsIGFuZCBubyBtb3JlLgotCi0gICBTb21lIHN0YXRlcyBsb29wIHVudGlsIHRoZXkgZ2V0IGVub3VnaCBpbnB1dCwgbWFraW5nIHN1cmUgdGhhdCBlbm91Z2gKLSAgIHN0YXRlIGluZm9ybWF0aW9uIGlzIG1haW50YWluZWQgdG8gY29udGludWUgdGhlIGxvb3Agd2hlcmUgaXQgbGVmdCBvZmYKLSAgIGlmIE5FRURCSVRTKCkgcmV0dXJucyBpbiB0aGUgbG9vcC4gIEZvciBleGFtcGxlLCB3YW50LCBuZWVkLCBhbmQga2VlcAotICAgd291bGQgYWxsIGhhdmUgdG8gYWN0dWFsbHkgYmUgcGFydCBvZiB0aGUgc2F2ZWQgc3RhdGUgaW4gY2FzZSBORUVEQklUUygpCi0gICByZXR1cm5zOgotCi0gICAgY2FzZSBTVEFURXc6Ci0gICAgICAgIHdoaWxlICh3YW50IDwgbmVlZCkgewotICAgICAgICAgICAgTkVFREJJVFMobik7Ci0gICAgICAgICAgICBrZWVwW3dhbnQrK10gPSBCSVRTKG4pOwotICAgICAgICAgICAgRFJPUEJJVFMobik7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdGUgPSBTVEFURXg7Ci0gICAgY2FzZSBTVEFURXg6Ci0KLSAgIEFzIHNob3duIGFib3ZlLCBpZiB0aGUgbmV4dCBzdGF0ZSBpcyBhbHNvIHRoZSBuZXh0IGNhc2UsIHRoZW4gdGhlIGJyZWFrCi0gICBpcyBvbWl0dGVkLgotCi0gICBBIHN0YXRlIG1heSBhbHNvIHJldHVybiBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIG91dHB1dCBzcGFjZSBhdmFpbGFibGUgdG8KLSAgIGNvbXBsZXRlIHRoYXQgc3RhdGUuICBUaG9zZSBzdGF0ZXMgYXJlIGNvcHlpbmcgc3RvcmVkIGRhdGEsIHdyaXRpbmcgYQotICAgbGl0ZXJhbCBieXRlLCBhbmQgY29weWluZyBhIG1hdGNoaW5nIHN0cmluZy4KLQotICAgV2hlbiByZXR1cm5pbmcsIGEgImdvdG8gaW5mX2xlYXZlIiBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgdG90YWwgY291bnRlcnMsCi0gICB1cGRhdGUgdGhlIGNoZWNrIHZhbHVlLCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgYW55IHByb2dyZXNzIGhhcyBiZWVuIG1hZGUKLSAgIGR1cmluZyB0aGF0IGluZmxhdGUoKSBjYWxsIGluIG9yZGVyIHRvIHJldHVybiB0aGUgcHJvcGVyIHJldHVybiBjb2RlLgotICAgUHJvZ3Jlc3MgaXMgZGVmaW5lZCBhcyBhIGNoYW5nZSBpbiBlaXRoZXIgc3RybS0+YXZhaWxfaW4gb3Igc3RybS0+YXZhaWxfb3V0LgotICAgV2hlbiB0aGVyZSBpcyBhIHdpbmRvdywgZ290byBpbmZfbGVhdmUgd2lsbCB1cGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0Ci0gICBvdXRwdXQgd3JpdHRlbi4gIElmIGEgZ290byBpbmZfbGVhdmUgb2NjdXJzIGluIHRoZSBtaWRkbGUgb2YgZGVjb21wcmVzc2lvbgotICAgYW5kIHRoZXJlIGlzIG5vIHdpbmRvdyBjdXJyZW50bHksIGdvdG8gaW5mX2xlYXZlIHdpbGwgY3JlYXRlIG9uZSBhbmQgY29weQotICAgb3V0cHV0IHRvIHRoZSB3aW5kb3cgZm9yIHRoZSBuZXh0IGNhbGwgb2YgaW5mbGF0ZSgpLgotCi0gICBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCB0aGUgZmx1c2ggcGFyYW1ldGVyIG9mIGluZmxhdGUoKSBvbmx5IGFmZmVjdHMgdGhlCi0gICByZXR1cm4gY29kZSAocGVyIHpsaWIuaCkuICBpbmZsYXRlKCkgYWx3YXlzIHdyaXRlcyBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvCi0gICBzdHJtLT5uZXh0X291dCwgZ2l2ZW4gdGhlIHNwYWNlIGF2YWlsYWJsZSBhbmQgdGhlIHByb3ZpZGVkIGlucHV0LS10aGUgZWZmZWN0Ci0gICBkb2N1bWVudGVkIGluIHpsaWIuaCBvZiBaX1NZTkNfRkxVU0guICBGdXJ0aGVybW9yZSwgaW5mbGF0ZSgpIGFsd2F5cyBkZWZlcnMKLSAgIHRoZSBhbGxvY2F0aW9uIG9mIGFuZCBjb3B5aW5nIGludG8gYSBzbGlkaW5nIHdpbmRvdyB1bnRpbCBuZWNlc3NhcnksIHdoaWNoCi0gICBwcm92aWRlcyB0aGUgZWZmZWN0IGRvY3VtZW50ZWQgaW4gemxpYi5oIGZvciBaX0ZJTklTSCB3aGVuIHRoZSBlbnRpcmUgaW5wdXQKLSAgIHN0cmVhbSBhdmFpbGFibGUuICBTbyB0aGUgb25seSB0aGluZyB0aGUgZmx1c2ggcGFyYW1ldGVyIGFjdHVhbGx5IGRvZXMgaXM6Ci0gICB3aGVuIGZsdXNoIGlzIHNldCB0byBaX0ZJTklTSCwgaW5mbGF0ZSgpIGNhbm5vdCByZXR1cm4gWl9PSy4gIEluc3RlYWQgaXQKLSAgIHdpbGwgcmV0dXJuIFpfQlVGX0VSUk9SIGlmIGl0IGhhcyBub3QgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCi0gKi8KLQotaW50IFpFWFBPUlQgaW5mbGF0ZShzdHJtLCBmbHVzaCkKLXpfc3RyZWFtcCBzdHJtOwotaW50IGZsdXNoOwotewotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0gICAgdW5zaWduZWQgY2hhciBGQVIgKm5leHQ7ICAgIC8qIG5leHQgaW5wdXQgKi8KLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqcHV0OyAgICAgLyogbmV4dCBvdXRwdXQgKi8KLSAgICB1bnNpZ25lZCBoYXZlLCBsZWZ0OyAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi8KLSAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogYml0IGJ1ZmZlciAqLwotICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KLSAgICB1bnNpZ25lZCBpbiwgb3V0OyAgICAgICAgICAgLyogc2F2ZSBzdGFydGluZyBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqLwotICAgIHVuc2lnbmVkIGNvcHk7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi8KLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZnJvbTsgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBieXRlcyBmcm9tICovCi0gICAgY29kZSBoZXJlOyAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgZGVjb2RpbmcgdGFibGUgZW50cnkgKi8KLSAgICBjb2RlIGxhc3Q7ICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovCi0gICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGxlbmd0aCB0byBjb3B5IGZvciByZXBlYXRzLCBiaXRzIHRvIGRyb3AgKi8KLSAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi8KLSNpZmRlZiBHVU5aSVAKLSAgICB1bnNpZ25lZCBjaGFyIGhidWZbNF07ICAgICAgLyogYnVmZmVyIGZvciBnemlwIGhlYWRlciBjcmMgY2FsY3VsYXRpb24gKi8KLSNlbmRpZgotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBvcmRlclsxOV0gPSAvKiBwZXJtdXRhdGlvbiBvZiBjb2RlIGxlbmd0aHMgKi8KLSAgICAgICAgezE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTV9OwotCi0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fCBzdHJtLT5uZXh0X291dCA9PSBaX05VTEwgfHwKLSAgICAgICAgKHN0cm0tPm5leHRfaW4gPT0gWl9OVUxMICYmIHN0cm0tPmF2YWlsX2luICE9IDApKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0KLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKLSAgICBpZiAoc3RhdGUtPm1vZGUgPT0gVFlQRSkgc3RhdGUtPm1vZGUgPSBUWVBFRE87ICAgICAgLyogc2tpcCBjaGVjayAqLwotICAgIExPQUQoKTsKLSAgICBpbiA9IGhhdmU7Ci0gICAgb3V0ID0gbGVmdDsKLSAgICByZXQgPSBaX09LOwotICAgIGZvciAoOzspCi0gICAgICAgIHN3aXRjaCAoc3RhdGUtPm1vZGUpIHsKLSAgICAgICAgY2FzZSBIRUFEOgotICAgICAgICAgICAgaWYgKHN0YXRlLT53cmFwID09IDApIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEVETzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE5FRURCSVRTKDE2KTsKLSNpZmRlZiBHVU5aSVAKLSAgICAgICAgICAgIGlmICgoc3RhdGUtPndyYXAgJiAyKSAmJiBob2xkID09IDB4OGIxZikgeyAgLyogZ3ppcCBoZWFkZXIgKi8KLSAgICAgICAgICAgICAgICBzdGF0ZS0+Y2hlY2sgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKLSAgICAgICAgICAgICAgICBDUkMyKHN0YXRlLT5jaGVjaywgaG9sZCk7Ci0gICAgICAgICAgICAgICAgSU5JVEJJVFMoKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEZMQUdTOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPmZsYWdzID0gMDsgICAgICAgICAgIC8qIGV4cGVjdCB6bGliIGhlYWRlciAqLwotICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKLSAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+ZG9uZSA9IC0xOwotICAgICAgICAgICAgaWYgKCEoc3RhdGUtPndyYXAgJiAxKSB8fCAgIC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi8KLSNlbHNlCi0gICAgICAgICAgICBpZiAoCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAoKEJJVFMoOCkgPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBoZWFkZXIgY2hlY2siOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKEJJVFMoNCkgIT0gWl9ERUZMQVRFRCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERST1BCSVRTKDQpOwotICAgICAgICAgICAgbGVuID0gQklUUyg0KSArIDg7Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPndiaXRzID09IDApCi0gICAgICAgICAgICAgICAgc3RhdGUtPndiaXRzID0gbGVuOwotICAgICAgICAgICAgZWxzZSBpZiAobGVuID4gc3RhdGUtPndiaXRzKSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCB3aW5kb3cgc2l6ZSI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS0+ZG1heCA9IDFVIDw8IGxlbjsKLSAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICB6bGliIGhlYWRlciBva1xuIikpOwotICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBob2xkICYgMHgyMDAgPyBESUNUSUQgOiBUWVBFOwotICAgICAgICAgICAgSU5JVEJJVFMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIEdVTlpJUAotICAgICAgICBjYXNlIEZMQUdTOgotICAgICAgICAgICAgTkVFREJJVFMoMTYpOwotICAgICAgICAgICAgc3RhdGUtPmZsYWdzID0gKGludCkoaG9sZCk7Ci0gICAgICAgICAgICBpZiAoKHN0YXRlLT5mbGFncyAmIDB4ZmYpICE9IFpfREVGTEFURUQpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHhlMDAwKSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikidW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0IjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpCi0gICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPnRleHQgPSAoaW50KSgoaG9sZCA+PiA4KSAmIDEpOwotICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkgQ1JDMihzdGF0ZS0+Y2hlY2ssIGhvbGQpOwotICAgICAgICAgICAgSU5JVEJJVFMoKTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVElNRTsKLSAgICAgICAgY2FzZSBUSU1FOgotICAgICAgICAgICAgTkVFREJJVFMoMzIpOwotICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKLSAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+dGltZSA9IGhvbGQ7Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKSBDUkM0KHN0YXRlLT5jaGVjaywgaG9sZCk7Ci0gICAgICAgICAgICBJTklUQklUUygpOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBPUzsKLSAgICAgICAgY2FzZSBPUzoKLSAgICAgICAgICAgIE5FRURCSVRTKDE2KTsKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+eGZsYWdzID0gKGludCkoaG9sZCAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5vcyA9IChpbnQpKGhvbGQgPj4gOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKSBDUkMyKHN0YXRlLT5jaGVjaywgaG9sZCk7Ci0gICAgICAgICAgICBJTklUQklUUygpOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBFWExFTjsKLSAgICAgICAgY2FzZSBFWExFTjoKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDA0MDApIHsKLSAgICAgICAgICAgICAgICBORUVEQklUUygxNik7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZCkoaG9sZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmV4dHJhX2xlbiA9ICh1bnNpZ25lZClob2xkOwotICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApIENSQzIoc3RhdGUtPmNoZWNrLCBob2xkKTsKLSAgICAgICAgICAgICAgICBJTklUQklUUygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQotICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5leHRyYSA9IFpfTlVMTDsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRVhUUkE7Ci0gICAgICAgIGNhc2UgRVhUUkE6Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwNDAwKSB7Ci0gICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSBjb3B5ID0gaGF2ZTsKLSAgICAgICAgICAgICAgICBpZiAoY29weSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+ZXh0cmEgIT0gWl9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdGF0ZS0+aGVhZC0+ZXh0cmFfbGVuIC0gc3RhdGUtPmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHptZW1jcHkoc3RhdGUtPmhlYWQtPmV4dHJhICsgbGVuLCBuZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKyBjb3B5ID4gc3RhdGUtPmhlYWQtPmV4dHJhX21heCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5leHRyYV9tYXggLSBsZW4gOiBjb3B5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmNoZWNrID0gY3JjMzIoc3RhdGUtPmNoZWNrLCBuZXh0LCBjb3B5KTsKLSAgICAgICAgICAgICAgICAgICAgaGF2ZSAtPSBjb3B5OwotICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5sZW5ndGgpIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9IDA7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IE5BTUU7Ci0gICAgICAgIGNhc2UgTkFNRToKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDA4MDApIHsKLSAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKLSAgICAgICAgICAgICAgICBjb3B5ID0gMDsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbiA9ICh1bnNpZ25lZCkobmV4dFtjb3B5KytdKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5uYW1lICE9IFpfTlVMTCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPCBzdGF0ZS0+aGVhZC0+bmFtZV9tYXgpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+bmFtZVtzdGF0ZS0+bGVuZ3RoKytdID0gbGVuOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmNoZWNrID0gY3JjMzIoc3RhdGUtPmNoZWNrLCBuZXh0LCBjb3B5KTsKLSAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7Ci0gICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OwotICAgICAgICAgICAgICAgIGlmIChsZW4pIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQotICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5uYW1lID0gWl9OVUxMOwotICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9IDA7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENPTU1FTlQ7Ci0gICAgICAgIGNhc2UgQ09NTUVOVDoKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDEwMDApIHsKLSAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKLSAgICAgICAgICAgICAgICBjb3B5ID0gMDsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbiA9ICh1bnNpZ25lZCkobmV4dFtjb3B5KytdKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5jb21tZW50ICE9IFpfTlVMTCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPCBzdGF0ZS0+aGVhZC0+Y29tbV9tYXgpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+Y29tbWVudFtzdGF0ZS0+bGVuZ3RoKytdID0gbGVuOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmNoZWNrID0gY3JjMzIoc3RhdGUtPmNoZWNrLCBuZXh0LCBjb3B5KTsKLSAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7Ci0gICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OwotICAgICAgICAgICAgICAgIGlmIChsZW4pIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQotICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5jb21tZW50ID0gWl9OVUxMOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBIQ1JDOwotICAgICAgICBjYXNlIEhDUkM6Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKSB7Ci0gICAgICAgICAgICAgICAgTkVFREJJVFMoMTYpOwotICAgICAgICAgICAgICAgIGlmIChob2xkICE9IChzdGF0ZS0+Y2hlY2sgJiAweGZmZmYpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImhlYWRlciBjcmMgbWlzbWF0Y2giOwotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIElOSVRCSVRTKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmhjcmMgPSAoaW50KSgoc3RhdGUtPmZsYWdzID4+IDkpICYgMSk7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmRvbmUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKLSAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIGNhc2UgRElDVElEOgotICAgICAgICAgICAgTkVFREJJVFMoMzIpOwotICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPSBaU1dBUDMyKGhvbGQpOwotICAgICAgICAgICAgSU5JVEJJVFMoKTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRElDVDsKLSAgICAgICAgY2FzZSBESUNUOgotICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlZGljdCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgUkVTVE9SRSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBaX05FRURfRElDVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKLSAgICAgICAgY2FzZSBUWVBFOgotICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfQkxPQ0sgfHwgZmx1c2ggPT0gWl9UUkVFUykgZ290byBpbmZfbGVhdmU7Ci0gICAgICAgIGNhc2UgVFlQRURPOgotICAgICAgICAgICAgaWYgKHN0YXRlLT5sYXN0KSB7Ci0gICAgICAgICAgICAgICAgQllURUJJVFMoKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENIRUNLOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTkVFREJJVFMoMyk7Ci0gICAgICAgICAgICBzdGF0ZS0+bGFzdCA9IEJJVFMoMSk7Ci0gICAgICAgICAgICBEUk9QQklUUygxKTsKLSAgICAgICAgICAgIHN3aXRjaCAoQklUUygyKSkgewotICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovCi0gICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgc3RvcmVkIGJsb2NrJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBTVE9SRUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCBibG9jayAqLwotICAgICAgICAgICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTsKLSAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOXzsgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovCi0gICAgICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfVFJFRVMpIHsKLSAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBkeW5hbWljIGNvZGVzIGJsb2NrJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUQUJMRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJsb2NrIHR5cGUiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRFJPUEJJVFMoMik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVE9SRUQ6Ci0gICAgICAgICAgICBCWVRFQklUUygpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovCi0gICAgICAgICAgICBORUVEQklUUygzMik7Ci0gICAgICAgICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9ICgoaG9sZCA+PiAxNikgXiAweGZmZmYpKSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKWhvbGQgJiAweGZmZmY7Ci0gICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcbiIsCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGgpKTsKLSAgICAgICAgICAgIElOSVRCSVRTKCk7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENPUFlfOwotICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfVFJFRVMpIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICBjYXNlIENPUFlfOgotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDT1BZOwotICAgICAgICBjYXNlIENPUFk6Ci0gICAgICAgICAgICBjb3B5ID0gc3RhdGUtPmxlbmd0aDsKLSAgICAgICAgICAgIGlmIChjb3B5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSBjb3B5ID0gaGF2ZTsKLSAgICAgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OwotICAgICAgICAgICAgICAgIGlmIChjb3B5ID09IDApIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICAgICAgICAgIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsKLSAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7Ci0gICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OwotICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKLSAgICAgICAgICAgICAgICBwdXQgKz0gY29weTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIC09IGNvcHk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcbiIpKTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRBQkxFOgotICAgICAgICAgICAgTkVFREJJVFMoMTQpOwotICAgICAgICAgICAgc3RhdGUtPm5sZW4gPSBCSVRTKDUpICsgMjU3OwotICAgICAgICAgICAgRFJPUEJJVFMoNSk7Ci0gICAgICAgICAgICBzdGF0ZS0+bmRpc3QgPSBCSVRTKDUpICsgMTsKLSAgICAgICAgICAgIERST1BCSVRTKDUpOwotICAgICAgICAgICAgc3RhdGUtPm5jb2RlID0gQklUUyg0KSArIDQ7Ci0gICAgICAgICAgICBEUk9QQklUUyg0KTsKLSNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+bmxlbiA+IDI4NiB8fCBzdGF0ZS0+bmRpc3QgPiAzMCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xuIikpOwotICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU5MRU5TOwotICAgICAgICBjYXNlIExFTkxFTlM6Ci0gICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCBzdGF0ZS0+bmNvZGUpIHsKLSAgICAgICAgICAgICAgICBORUVEQklUUygzKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tvcmRlcltzdGF0ZS0+aGF2ZSsrXV0gPSAodW5zaWduZWQgc2hvcnQpQklUUygzKTsKLSAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IDE5KQotICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW29yZGVyW3N0YXRlLT5oYXZlKytdXSA9IDA7Ci0gICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKLSAgICAgICAgICAgIHN0YXRlLT5sZW5jb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKLSAgICAgICAgICAgIHN0YXRlLT5sZW5iaXRzID0gNzsKLSAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLT5sZW5zLCAxOSwgJihzdGF0ZS0+bmV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPmxlbmJpdHMpLCBzdGF0ZS0+d29yayk7Ci0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZSBsZW5ndGhzIG9rXG4iKSk7Ci0gICAgICAgICAgICBzdGF0ZS0+aGF2ZSA9IDA7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENPREVMRU5TOwotICAgICAgICBjYXNlIENPREVMRU5TOgotICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5sZW4gKyBzdGF0ZS0+bmRpc3QpIHsKLSAgICAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChoZXJlLnZhbCA8IDE2KSB7Ci0gICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gaGVyZS52YWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoaGVyZS52YWwgPT0gMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSAtIDFdOwotICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaGVyZS52YWwgPT0gMTcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMyArIEJJVFMoMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDcpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMTEgKyBCSVRTKDcpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoNyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlICsgY29weSA+IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gKHVuc2lnbmVkIHNob3J0KWxlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi8KLSAgICAgICAgICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBCQUQpIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgKGJldHRlciBoYXZlIG9uZSkgKi8KLSAgICAgICAgICAgIGlmIChzdGF0ZS0+bGVuc1syNTZdID09IDApIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2siOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBidWlsZCBjb2RlIHRhYmxlcyAtLSBub3RlOiBkbyBub3QgY2hhbmdlIHRoZSBsZW5iaXRzIG9yIGRpc3RiaXRzCi0gICAgICAgICAgICAgICB2YWx1ZXMgaGVyZSAoOSBhbmQgNikgd2l0aG91dCByZWFkaW5nIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oCi0gICAgICAgICAgICAgICBjb25jZXJuaW5nIHRoZSBFTk9VR0ggY29uc3RhbnRzLCB3aGljaCBkZXBlbmQgb24gdGhvc2UgdmFsdWVzICovCi0gICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKLSAgICAgICAgICAgIHN0YXRlLT5sZW5jb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKLSAgICAgICAgICAgIHN0YXRlLT5sZW5iaXRzID0gOTsKLSAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUtPmxlbnMsIHN0YXRlLT5ubGVuLCAmKHN0YXRlLT5uZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bGVuYml0cyksIHN0YXRlLT53b3JrKTsKLSAgICAgICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPmRpc3Rjb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKLSAgICAgICAgICAgIHN0YXRlLT5kaXN0Yml0cyA9IDY7Ci0gICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS0+bGVucyArIHN0YXRlLT5ubGVuLCBzdGF0ZS0+bmRpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bmV4dCksICYoc3RhdGUtPmRpc3RiaXRzKSwgc3RhdGUtPndvcmspOwotICAgICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2VzIHNldCI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGVzIG9rXG4iKSk7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTl87Ci0gICAgICAgICAgICBpZiAoZmx1c2ggPT0gWl9UUkVFUykgZ290byBpbmZfbGVhdmU7Ci0gICAgICAgIGNhc2UgTEVOXzoKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOwotICAgICAgICBjYXNlIExFTjoKLSAgICAgICAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHsKLSAgICAgICAgICAgICAgICBSRVNUT1JFKCk7Ci0gICAgICAgICAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIG91dCk7Ci0gICAgICAgICAgICAgICAgTE9BRCgpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBUWVBFKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+YmFjayA9IC0xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPmJhY2sgPSAwOwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07Ci0gICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKLSAgICAgICAgICAgICAgICBQVUxMQllURSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGhlcmUub3AgJiYgKGhlcmUub3AgJiAweGYwKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGFzdCA9IGhlcmU7Ci0gICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmxlbmNvZGVbbGFzdC52YWwgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApID4+IGxhc3QuYml0cyldOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShsYXN0LmJpdHMgKyBoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBEUk9QQklUUyhsYXN0LmJpdHMpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5iYWNrICs9IGxhc3QuYml0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7Ci0gICAgICAgICAgICBzdGF0ZS0+YmFjayArPSBoZXJlLmJpdHM7Ci0gICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKWhlcmUudmFsOwotICAgICAgICAgICAgaWYgKChpbnQpKGhlcmUub3ApID09IDApIHsKLSAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID8KLSAgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xuIiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxuIiwgaGVyZS52YWwpKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExJVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChoZXJlLm9wICYgMzIpIHsKLSAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xuIikpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5iYWNrID0gLTE7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGhlcmUub3AgJiA2NCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS0+ZXh0cmEgPSAodW5zaWduZWQpKGhlcmUub3ApICYgMTU7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTkVYVDsKLSAgICAgICAgY2FzZSBMRU5FWFQ6Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmV4dHJhKSB7Ci0gICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKLSAgICAgICAgICAgICAgICBEUk9QQklUUyhzdGF0ZS0+ZXh0cmEpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5iYWNrICs9IHN0YXRlLT5leHRyYTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XG4iLCBzdGF0ZS0+bGVuZ3RoKSk7Ci0gICAgICAgICAgICBzdGF0ZS0+d2FzID0gc3RhdGUtPmxlbmd0aDsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRElTVDsKLSAgICAgICAgY2FzZSBESVNUOgotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+ZGlzdGNvZGVbQklUUyhzdGF0ZS0+ZGlzdGJpdHMpXTsKLSAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOwotICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGhlcmUub3AgJiAweGYwKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGFzdCA9IGhlcmU7Ci0gICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmRpc3Rjb2RlW2xhc3QudmFsICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+YmFjayArPSBsYXN0LmJpdHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOwotICAgICAgICAgICAgc3RhdGUtPmJhY2sgKz0gaGVyZS5iaXRzOwotICAgICAgICAgICAgaWYgKGhlcmUub3AgJiA2NCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgY29kZSI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ID0gKHVuc2lnbmVkKWhlcmUudmFsOwotICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKShoZXJlLm9wKSAmIDE1OwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBESVNURVhUOwotICAgICAgICBjYXNlIERJU1RFWFQ6Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmV4dHJhKSB7Ci0gICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKLSAgICAgICAgICAgICAgICBEUk9QQklUUyhzdGF0ZS0+ZXh0cmEpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5iYWNrICs9IHN0YXRlLT5leHRyYTsKLSAgICAgICAgICAgIH0KLSNpZmRlZiBJTkZMQVRFX1NUUklDVAotICAgICAgICAgICAgaWYgKHN0YXRlLT5vZmZzZXQgPiBzdGF0ZS0+ZG1heCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxuIiwgc3RhdGUtPm9mZnNldCkpOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBNQVRDSDsKLSAgICAgICAgY2FzZSBNQVRDSDoKLSAgICAgICAgICAgIGlmIChsZWZ0ID09IDApIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICAgICAgY29weSA9IG91dCAtIGxlZnQ7Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPm9mZnNldCA+IGNvcHkpIHsgICAgICAgICAvKiBjb3B5IGZyb20gd2luZG93ICovCi0gICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5vZmZzZXQgLSBjb3B5OwotICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPndoYXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+c2FuZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUgotICAgICAgICAgICAgICAgICAgICBUcmFjZSgoc3RkZXJyLCAiaW5mbGF0ZS5jIHRvbyBmYXJcbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgY29weSAtPSBzdGF0ZS0+d2hhdmU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPmxlbmd0aCkgY29weSA9IHN0YXRlLT5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgY29weSA9IGxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OwotICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcHV0KysgPSAwOwotICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmxlbmd0aCA9PSAwKSBzdGF0ZS0+bW9kZSA9IExFTjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS0+d25leHQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29weSAtPSBzdGF0ZS0+d25leHQ7Ci0gICAgICAgICAgICAgICAgICAgIGZyb20gPSBzdGF0ZS0+d2luZG93ICsgKHN0YXRlLT53c2l6ZSAtIGNvcHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZyb20gPSBzdGF0ZS0+d2luZG93ICsgKHN0YXRlLT53bmV4dCAtIGNvcHkpOwotICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPmxlbmd0aCkgY29weSA9IHN0YXRlLT5sZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGZyb20gb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLT5vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OwotICAgICAgICAgICAgbGVmdCAtPSBjb3B5OwotICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICpwdXQrKyA9ICpmcm9tKys7Ci0gICAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpOwotICAgICAgICAgICAgaWYgKHN0YXRlLT5sZW5ndGggPT0gMCkgc3RhdGUtPm1vZGUgPSBMRU47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMSVQ6Ci0gICAgICAgICAgICBpZiAobGVmdCA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKLSAgICAgICAgICAgICpwdXQrKyA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZS0+bGVuZ3RoKTsKLSAgICAgICAgICAgIGxlZnQtLTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0hFQ0s6Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPndyYXApIHsKLSAgICAgICAgICAgICAgICBORUVEQklUUygzMik7Ci0gICAgICAgICAgICAgICAgb3V0IC09IGxlZnQ7Ci0gICAgICAgICAgICAgICAgc3RybS0+dG90YWxfb3V0ICs9IG91dDsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+dG90YWwgKz0gb3V0OwotICAgICAgICAgICAgICAgIGlmIChvdXQpCi0gICAgICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFVQREFURShzdGF0ZS0+Y2hlY2ssIHB1dCAtIG91dCwgb3V0KTsKLSAgICAgICAgICAgICAgICBvdXQgPSBsZWZ0OwotICAgICAgICAgICAgICAgIGlmICgoCi0jaWZkZWYgR1VOWklQCi0gICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+ZmxhZ3MgPyBob2xkIDoKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgWlNXQVAzMihob2xkKSkgIT0gc3RhdGUtPmNoZWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBkYXRhIGNoZWNrIjsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJTklUQklUUygpOwotICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICBjaGVjayBtYXRjaGVzIHRyYWlsZXJcbiIpKTsKLSAgICAgICAgICAgIH0KLSNpZmRlZiBHVU5aSVAKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOR1RIOwotICAgICAgICBjYXNlIExFTkdUSDoKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+d3JhcCAmJiBzdGF0ZS0+ZmxhZ3MpIHsKLSAgICAgICAgICAgICAgICBORUVEQklUUygzMik7Ci0gICAgICAgICAgICAgICAgaWYgKGhvbGQgIT0gKHN0YXRlLT50b3RhbCAmIDB4ZmZmZmZmZmZVTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW5jb3JyZWN0IGxlbmd0aCBjaGVjayI7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSU5JVEJJVFMoKTsKLSAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgbGVuZ3RoIG1hdGNoZXMgdHJhaWxlclxuIikpOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERPTkU7Ci0gICAgICAgIGNhc2UgRE9ORToKLSAgICAgICAgICAgIHJldCA9IFpfU1RSRUFNX0VORDsKLSAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICBjYXNlIEJBRDoKLSAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICBjYXNlIE1FTToKLSAgICAgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKLSAgICAgICAgY2FzZSBTWU5DOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAvKgotICAgICAgIFJldHVybiBmcm9tIGluZmxhdGUoKSwgdXBkYXRpbmcgdGhlIHRvdGFsIGNvdW50cyBhbmQgdGhlIGNoZWNrIHZhbHVlLgotICAgICAgIElmIHRoZXJlIHdhcyBubyBwcm9ncmVzcyBkdXJpbmcgdGhlIGluZmxhdGUoKSBjYWxsLCByZXR1cm4gYSBidWZmZXIKLSAgICAgICBlcnJvci4gIENhbGwgdXBkYXRld2luZG93KCkgdG8gY3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIHdpbmRvdyBzdGF0ZS4KLSAgICAgICBOb3RlOiBhIG1lbW9yeSBlcnJvciBmcm9tIGluZmxhdGUoKSBpcyBub24tcmVjb3ZlcmFibGUuCi0gICAgICovCi0gIGluZl9sZWF2ZToKLSAgICBSRVNUT1JFKCk7Ci0gICAgaWYgKHN0YXRlLT53c2l6ZSB8fCAob3V0ICE9IHN0cm0tPmF2YWlsX291dCAmJiBzdGF0ZS0+bW9kZSA8IEJBRCAmJgotICAgICAgICAgICAgKHN0YXRlLT5tb2RlIDwgQ0hFQ0sgfHwgZmx1c2ggIT0gWl9GSU5JU0gpKSkKLSAgICAgICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBvdXQpKSB7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IE1FTTsKLSAgICAgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKLSAgICAgICAgfQotICAgIGluIC09IHN0cm0tPmF2YWlsX2luOwotICAgIG91dCAtPSBzdHJtLT5hdmFpbF9vdXQ7Ci0gICAgc3RybS0+dG90YWxfaW4gKz0gaW47Ci0gICAgc3RybS0+dG90YWxfb3V0ICs9IG91dDsKLSAgICBzdGF0ZS0+dG90YWwgKz0gb3V0OwotICAgIGlmIChzdGF0ZS0+d3JhcCAmJiBvdXQpCi0gICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0KLSAgICAgICAgICAgIFVQREFURShzdGF0ZS0+Y2hlY2ssIHN0cm0tPm5leHRfb3V0IC0gb3V0LCBvdXQpOwotICAgIHN0cm0tPmRhdGFfdHlwZSA9IHN0YXRlLT5iaXRzICsgKHN0YXRlLT5sYXN0ID8gNjQgOiAwKSArCi0gICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLT5tb2RlID09IFRZUEUgPyAxMjggOiAwKSArCi0gICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLT5tb2RlID09IExFTl8gfHwgc3RhdGUtPm1vZGUgPT0gQ09QWV8gPyAyNTYgOiAwKTsKLSAgICBpZiAoKChpbiA9PSAwICYmIG91dCA9PSAwKSB8fCBmbHVzaCA9PSBaX0ZJTklTSCkgJiYgcmV0ID09IFpfT0spCi0gICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVFbmQoc3RybSkKLXpfc3RyZWFtcCBzdHJtOwotewotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKLSAgICBpZiAoc3RhdGUtPndpbmRvdyAhPSBaX05VTEwpIFpGUkVFKHN0cm0sIHN0YXRlLT53aW5kb3cpOwotICAgIFpGUkVFKHN0cm0sIHN0cm0tPnN0YXRlKTsKLSAgICBzdHJtLT5zdGF0ZSA9IFpfTlVMTDsKLSAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IGVuZFxuIikpOwotICAgIHJldHVybiBaX09LOwotfQotCi1pbnQgWkVYUE9SVCBpbmZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKQotel9zdHJlYW1wIHN0cm07Ci1jb25zdCBCeXRlZiAqZGljdGlvbmFyeTsKLXVJbnQgZGljdExlbmd0aDsKLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotICAgIHVuc2lnbmVkIGxvbmcgZGljdGlkOwotICAgIHVuc2lnbmVkIGNoYXIgKm5leHQ7Ci0gICAgdW5zaWduZWQgYXZhaWw7Ci0gICAgaW50IHJldDsKLQotICAgIC8qIGNoZWNrIHN0YXRlICovCi0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOwotICAgIGlmIChzdGF0ZS0+d3JhcCAhPSAwICYmIHN0YXRlLT5tb2RlICE9IERJQ1QpCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLQotICAgIC8qIGNoZWNrIGZvciBjb3JyZWN0IGRpY3Rpb25hcnkgaWRlbnRpZmllciAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBESUNUKSB7Ci0gICAgICAgIGRpY3RpZCA9IGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7Ci0gICAgICAgIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsKLSAgICAgICAgaWYgKGRpY3RpZCAhPSBzdGF0ZS0+Y2hlY2spCi0gICAgICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOwotICAgIH0KLQotICAgIC8qIGNvcHkgZGljdGlvbmFyeSB0byB3aW5kb3cgdXNpbmcgdXBkYXRld2luZG93KCksIHdoaWNoIHdpbGwgYW1lbmQgdGhlCi0gICAgICAgZXhpc3RpbmcgZGljdGlvbmFyeSBpZiBhcHByb3ByaWF0ZSAqLwotICAgIG5leHQgPSBzdHJtLT5uZXh0X291dDsKLSAgICBhdmFpbCA9IHN0cm0tPmF2YWlsX291dDsKLSAgICBzdHJtLT5uZXh0X291dCA9IChCeXRlZiAqKWRpY3Rpb25hcnkgKyBkaWN0TGVuZ3RoOwotICAgIHN0cm0tPmF2YWlsX291dCA9IDA7Ci0gICAgcmV0ID0gdXBkYXRld2luZG93KHN0cm0sIGRpY3RMZW5ndGgpOwotICAgIHN0cm0tPmF2YWlsX291dCA9IGF2YWlsOwotICAgIHN0cm0tPm5leHRfb3V0ID0gbmV4dDsKLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIHN0YXRlLT5tb2RlID0gTUVNOwotICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7Ci0gICAgfQotICAgIHN0YXRlLT5oYXZlZGljdCA9IDE7Ci0gICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgIGRpY3Rpb25hcnkgc2V0XG4iKSk7Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVHZXRIZWFkZXIoc3RybSwgaGVhZCkKLXpfc3RyZWFtcCBzdHJtOwotZ3pfaGVhZGVycCBoZWFkOwotewotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0KLSAgICAvKiBjaGVjayBzdGF0ZSAqLwotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKLSAgICBpZiAoKHN0YXRlLT53cmFwICYgMikgPT0gMCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotCi0gICAgLyogc2F2ZSBoZWFkZXIgc3RydWN0dXJlICovCi0gICAgc3RhdGUtPmhlYWQgPSBoZWFkOwotICAgIGhlYWQtPmRvbmUgPSAwOwotICAgIHJldHVybiBaX09LOwotfQotCi0vKgotICAgU2VhcmNoIGJ1ZlswLi5sZW4tMV0gZm9yIHRoZSBwYXR0ZXJuOiAwLCAwLCAweGZmLCAweGZmLiAgUmV0dXJuIHdoZW4gZm91bmQKLSAgIG9yIHdoZW4gb3V0IG9mIGlucHV0LiAgV2hlbiBjYWxsZWQsICpoYXZlIGlzIHRoZSBudW1iZXIgb2YgcGF0dGVybiBieXRlcwotICAgZm91bmQgaW4gb3JkZXIgc28gZmFyLCBpbiAwLi4zLiAgT24gcmV0dXJuICpoYXZlIGlzIHVwZGF0ZWQgdG8gdGhlIG5ldwotICAgc3RhdGUuICBJZiBvbiByZXR1cm4gKmhhdmUgZXF1YWxzIGZvdXIsIHRoZW4gdGhlIHBhdHRlcm4gd2FzIGZvdW5kIGFuZCB0aGUKLSAgIHJldHVybiB2YWx1ZSBpcyBob3cgbWFueSBieXRlcyB3ZXJlIHJlYWQgaW5jbHVkaW5nIHRoZSBsYXN0IGJ5dGUgb2YgdGhlCi0gICBwYXR0ZXJuLiAgSWYgKmhhdmUgaXMgbGVzcyB0aGFuIGZvdXIsIHRoZW4gdGhlIHBhdHRlcm4gaGFzIG5vdCBiZWVuIGZvdW5kCi0gICB5ZXQgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgbGVuLiAgSW4gdGhlIGxhdHRlciBjYXNlLCBzeW5jc2VhcmNoKCkgY2FuIGJlCi0gICBjYWxsZWQgYWdhaW4gd2l0aCBtb3JlIGRhdGEgYW5kIHRoZSAqaGF2ZSBzdGF0ZS4gICpoYXZlIGlzIGluaXRpYWxpemVkIHRvCi0gICB6ZXJvIGZvciB0aGUgZmlyc3QgY2FsbC4KLSAqLwotbG9jYWwgdW5zaWduZWQgc3luY3NlYXJjaChoYXZlLCBidWYsIGxlbikKLXVuc2lnbmVkIEZBUiAqaGF2ZTsKLXVuc2lnbmVkIGNoYXIgRkFSICpidWY7Ci11bnNpZ25lZCBsZW47Ci17Ci0gICAgdW5zaWduZWQgZ290OwotICAgIHVuc2lnbmVkIG5leHQ7Ci0KLSAgICBnb3QgPSAqaGF2ZTsKLSAgICBuZXh0ID0gMDsKLSAgICB3aGlsZSAobmV4dCA8IGxlbiAmJiBnb3QgPCA0KSB7Ci0gICAgICAgIGlmICgoaW50KShidWZbbmV4dF0pID09IChnb3QgPCAyID8gMCA6IDB4ZmYpKQotICAgICAgICAgICAgZ290Kys7Ci0gICAgICAgIGVsc2UgaWYgKGJ1ZltuZXh0XSkKLSAgICAgICAgICAgIGdvdCA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGdvdCA9IDQgLSBnb3Q7Ci0gICAgICAgIG5leHQrKzsKLSAgICB9Ci0gICAgKmhhdmUgPSBnb3Q7Ci0gICAgcmV0dXJuIG5leHQ7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVTeW5jKHN0cm0pCi16X3N0cmVhbXAgc3RybTsKLXsKLSAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGxvb2sgYXQgb3IgbG9va2VkIGF0ICovCi0gICAgdW5zaWduZWQgbG9uZyBpbiwgb3V0OyAgICAgIC8qIHRlbXBvcmFyeSB0byBzYXZlIHRvdGFsX2luIGFuZCB0b3RhbF9vdXQgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsgICAgICAgLyogdG8gcmVzdG9yZSBiaXQgYnVmZmVyIHRvIGJ5dGUgc3RyaW5nICovCi0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLQotICAgIC8qIGNoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7Ci0gICAgaWYgKHN0cm0tPmF2YWlsX2luID09IDAgJiYgc3RhdGUtPmJpdHMgPCA4KSByZXR1cm4gWl9CVUZfRVJST1I7Ci0KLSAgICAvKiBpZiBmaXJzdCB0aW1lLCBzdGFydCBzZWFyY2ggaW4gYml0IGJ1ZmZlciAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBTWU5DKSB7Ci0gICAgICAgIHN0YXRlLT5tb2RlID0gU1lOQzsKLSAgICAgICAgc3RhdGUtPmhvbGQgPDw9IHN0YXRlLT5iaXRzICYgNzsKLSAgICAgICAgc3RhdGUtPmJpdHMgLT0gc3RhdGUtPmJpdHMgJiA3OwotICAgICAgICBsZW4gPSAwOwotICAgICAgICB3aGlsZSAoc3RhdGUtPmJpdHMgPj0gOCkgewotICAgICAgICAgICAgYnVmW2xlbisrXSA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZS0+aG9sZCk7Ci0gICAgICAgICAgICBzdGF0ZS0+aG9sZCA+Pj0gODsKLSAgICAgICAgICAgIHN0YXRlLT5iaXRzIC09IDg7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdGUtPmhhdmUgPSAwOwotICAgICAgICBzeW5jc2VhcmNoKCYoc3RhdGUtPmhhdmUpLCBidWYsIGxlbik7Ci0gICAgfQotCi0gICAgLyogc2VhcmNoIGF2YWlsYWJsZSBpbnB1dCAqLwotICAgIGxlbiA9IHN5bmNzZWFyY2goJihzdGF0ZS0+aGF2ZSksIHN0cm0tPm5leHRfaW4sIHN0cm0tPmF2YWlsX2luKTsKLSAgICBzdHJtLT5hdmFpbF9pbiAtPSBsZW47Ci0gICAgc3RybS0+bmV4dF9pbiArPSBsZW47Ci0gICAgc3RybS0+dG90YWxfaW4gKz0gbGVuOwotCi0gICAgLyogcmV0dXJuIG5vIGpveSBvciBzZXQgdXAgdG8gcmVzdGFydCBpbmZsYXRlKCkgb24gYSBuZXcgYmxvY2sgKi8KLSAgICBpZiAoc3RhdGUtPmhhdmUgIT0gNCkgcmV0dXJuIFpfREFUQV9FUlJPUjsKLSAgICBpbiA9IHN0cm0tPnRvdGFsX2luOyAgb3V0ID0gc3RybS0+dG90YWxfb3V0OwotICAgIGluZmxhdGVSZXNldChzdHJtKTsKLSAgICBzdHJtLT50b3RhbF9pbiA9IGluOyAgc3RybS0+dG90YWxfb3V0ID0gb3V0OwotICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKLSAgICByZXR1cm4gWl9PSzsKLX0KLQotLyoKLSAgIFJldHVybnMgdHJ1ZSBpZiBpbmZsYXRlIGlzIGN1cnJlbnRseSBhdCB0aGUgZW5kIG9mIGEgYmxvY2sgZ2VuZXJhdGVkIGJ5Ci0gICBaX1NZTkNfRkxVU0ggb3IgWl9GVUxMX0ZMVVNILiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgb25lIFBQUAotICAgaW1wbGVtZW50YXRpb24gdG8gcHJvdmlkZSBhbiBhZGRpdGlvbmFsIHNhZmV0eSBjaGVjay4gUFBQIHVzZXMKLSAgIFpfU1lOQ19GTFVTSCBidXQgcmVtb3ZlcyB0aGUgbGVuZ3RoIGJ5dGVzIG9mIHRoZSByZXN1bHRpbmcgZW1wdHkgc3RvcmVkCi0gICBibG9jay4gV2hlbiBkZWNvbXByZXNzaW5nLCBQUFAgY2hlY2tzIHRoYXQgYXQgdGhlIGVuZCBvZiBpbnB1dCBwYWNrZXQsCi0gICBpbmZsYXRlIGlzIHdhaXRpbmcgZm9yIHRoZXNlIGxlbmd0aCBieXRlcy4KLSAqLwotaW50IFpFWFBPUlQgaW5mbGF0ZVN5bmNQb2ludChzdHJtKQotel9zdHJlYW1wIHN0cm07Ci17Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLQotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKLSAgICByZXR1cm4gc3RhdGUtPm1vZGUgPT0gU1RPUkVEICYmIHN0YXRlLT5iaXRzID09IDA7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVDb3B5KGRlc3QsIHNvdXJjZSkKLXpfc3RyZWFtcCBkZXN0Owotel9zdHJlYW1wIHNvdXJjZTsKLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqY29weTsKLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OwotICAgIHVuc2lnbmVkIHdzaXplOwotCi0gICAgLyogY2hlY2sgaW5wdXQgKi8KLSAgICBpZiAoZGVzdCA9PSBaX05VTEwgfHwgc291cmNlID09IFpfTlVMTCB8fCBzb3VyY2UtPnN0YXRlID09IFpfTlVMTCB8fAotICAgICAgICBzb3VyY2UtPnphbGxvYyA9PSAoYWxsb2NfZnVuYykwIHx8IHNvdXJjZS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc291cmNlLT5zdGF0ZTsKLQotICAgIC8qIGFsbG9jYXRlIHNwYWNlICovCi0gICAgY29weSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKikKLSAgICAgICAgICAgWkFMTE9DKHNvdXJjZSwgMSwgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7Ci0gICAgaWYgKGNvcHkgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7Ci0gICAgd2luZG93ID0gWl9OVUxMOwotICAgIGlmIChzdGF0ZS0+d2luZG93ICE9IFpfTlVMTCkgewotICAgICAgICB3aW5kb3cgPSAodW5zaWduZWQgY2hhciBGQVIgKikKLSAgICAgICAgICAgICAgICAgWkFMTE9DKHNvdXJjZSwgMVUgPDwgc3RhdGUtPndiaXRzLCBzaXplb2YodW5zaWduZWQgY2hhcikpOwotICAgICAgICBpZiAod2luZG93ID09IFpfTlVMTCkgewotICAgICAgICAgICAgWkZSRUUoc291cmNlLCBjb3B5KTsKLSAgICAgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGNvcHkgc3RhdGUgKi8KLSAgICB6bWVtY3B5KCh2b2lkcGYpZGVzdCwgKHZvaWRwZilzb3VyY2UsIHNpemVvZih6X3N0cmVhbSkpOwotICAgIHptZW1jcHkoKHZvaWRwZiljb3B5LCAodm9pZHBmKXN0YXRlLCBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKLSAgICBpZiAoc3RhdGUtPmxlbmNvZGUgPj0gc3RhdGUtPmNvZGVzICYmCi0gICAgICAgIHN0YXRlLT5sZW5jb2RlIDw9IHN0YXRlLT5jb2RlcyArIEVOT1VHSCAtIDEpIHsKLSAgICAgICAgY29weS0+bGVuY29kZSA9IGNvcHktPmNvZGVzICsgKHN0YXRlLT5sZW5jb2RlIC0gc3RhdGUtPmNvZGVzKTsKLSAgICAgICAgY29weS0+ZGlzdGNvZGUgPSBjb3B5LT5jb2RlcyArIChzdGF0ZS0+ZGlzdGNvZGUgLSBzdGF0ZS0+Y29kZXMpOwotICAgIH0KLSAgICBjb3B5LT5uZXh0ID0gY29weS0+Y29kZXMgKyAoc3RhdGUtPm5leHQgLSBzdGF0ZS0+Y29kZXMpOwotICAgIGlmICh3aW5kb3cgIT0gWl9OVUxMKSB7Ci0gICAgICAgIHdzaXplID0gMVUgPDwgc3RhdGUtPndiaXRzOwotICAgICAgICB6bWVtY3B5KHdpbmRvdywgc3RhdGUtPndpbmRvdywgd3NpemUpOwotICAgIH0KLSAgICBjb3B5LT53aW5kb3cgPSB3aW5kb3c7Ci0gICAgZGVzdC0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKWNvcHk7Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVVbmRlcm1pbmUoc3RybSwgc3VidmVydCkKLXpfc3RyZWFtcCBzdHJtOwotaW50IHN1YnZlcnQ7Ci17Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLQotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKLSAgICBzdGF0ZS0+c2FuZSA9ICFzdWJ2ZXJ0OwotI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUgotICAgIHJldHVybiBaX09LOwotI2Vsc2UKLSAgICBzdGF0ZS0+c2FuZSA9IDE7Ci0gICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKLSNlbmRpZgotfQotCi1sb25nIFpFWFBPUlQgaW5mbGF0ZU1hcmsoc3RybSkKLXpfc3RyZWFtcCBzdHJtOwotewotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gLTFMIDw8IDE2OwotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOwotICAgIHJldHVybiAoKGxvbmcpKHN0YXRlLT5iYWNrKSA8PCAxNikgKwotICAgICAgICAoc3RhdGUtPm1vZGUgPT0gQ09QWSA/IHN0YXRlLT5sZW5ndGggOgotICAgICAgICAgICAgKHN0YXRlLT5tb2RlID09IE1BVENIID8gc3RhdGUtPndhcyAtIHN0YXRlLT5sZW5ndGggOiAwKSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvemxpYi9pbmZsYXRlLmggYi9zcmMvemxpYi9pbmZsYXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZjQ5ODYuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvaW5mbGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qIGluZmxhdGUuaCAtLSBpbnRlcm5hbCBpbmZsYXRlIHN0YXRlIGRlZmluaXRpb24KLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA5IE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcwotICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCi0gICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCi0gKi8KLQotLyogZGVmaW5lIE5PX0daSVAgd2hlbiBjb21waWxpbmcgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBnemlwIGhlYWRlciBhbmQKLSAgIHRyYWlsZXIgZGVjb2RpbmcgYnkgaW5mbGF0ZSgpLiAgTk9fR1pJUCB3b3VsZCBiZSB1c2VkIHRvIGF2b2lkIGxpbmtpbmcgaW4KLSAgIHRoZSBjcmMgY29kZSB3aGVuIGl0IGlzIG5vdCBuZWVkZWQuICBGb3Igc2hhcmVkIGxpYnJhcmllcywgZ3ppcCBkZWNvZGluZwotICAgc2hvdWxkIGJlIGxlZnQgZW5hYmxlZC4gKi8KLSNpZm5kZWYgTk9fR1pJUAotIyAgZGVmaW5lIEdVTlpJUAotI2VuZGlmCi0KLS8qIFBvc3NpYmxlIGluZmxhdGUgbW9kZXMgYmV0d2VlbiBpbmZsYXRlKCkgY2FsbHMgKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgSEVBRCwgICAgICAgLyogaTogd2FpdGluZyBmb3IgbWFnaWMgaGVhZGVyICovCi0gICAgRkxBR1MsICAgICAgLyogaTogd2FpdGluZyBmb3IgbWV0aG9kIGFuZCBmbGFncyAoZ3ppcCkgKi8KLSAgICBUSU1FLCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtb2RpZmljYXRpb24gdGltZSAoZ3ppcCkgKi8KLSAgICBPUywgICAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBmbGFncyBhbmQgb3BlcmF0aW5nIHN5c3RlbSAoZ3ppcCkgKi8KLSAgICBFWExFTiwgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBsZW5ndGggKGd6aXApICovCi0gICAgRVhUUkEsICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgYnl0ZXMgKGd6aXApICovCi0gICAgTkFNRSwgICAgICAgLyogaTogd2FpdGluZyBmb3IgZW5kIG9mIGZpbGUgbmFtZSAoZ3ppcCkgKi8KLSAgICBDT01NRU5ULCAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgY29tbWVudCAoZ3ppcCkgKi8KLSAgICBIQ1JDLCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBoZWFkZXIgY3JjIChnemlwKSAqLwotICAgIERJQ1RJRCwgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpY3Rpb25hcnkgY2hlY2sgdmFsdWUgKi8KLSAgICBESUNULCAgICAgICAvKiB3YWl0aW5nIGZvciBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIGNhbGwgKi8KLSAgICAgICAgVFlQRSwgICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqLwotICAgICAgICBUWVBFRE8sICAgICAvKiBpOiBzYW1lLCBidXQgc2tpcCBjaGVjayB0byBleGl0IGluZmxhdGUgb24gbmV3IGJsb2NrICovCi0gICAgICAgIFNUT1JFRCwgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovCi0gICAgICAgIENPUFlfLCAgICAgIC8qIGkvbzogc2FtZSBhcyBDT1BZIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovCi0gICAgICAgIENPUFksICAgICAgIC8qIGkvbzogd2FpdGluZyBmb3IgaW5wdXQgb3Igb3V0cHV0IHRvIGNvcHkgc3RvcmVkIGJsb2NrICovCi0gICAgICAgIFRBQkxFLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGR5bmFtaWMgYmxvY2sgdGFibGUgbGVuZ3RocyAqLwotICAgICAgICBMRU5MRU5TLCAgICAvKiBpOiB3YWl0aW5nIGZvciBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KLSAgICAgICAgQ09ERUxFTlMsICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCi0gICAgICAgICAgICBMRU5fLCAgICAgICAvKiBpOiBzYW1lIGFzIExFTiBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqLwotICAgICAgICAgICAgTEVOLCAgICAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdC9lb2IgY29kZSAqLwotICAgICAgICAgICAgTEVORVhULCAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoIGV4dHJhIGJpdHMgKi8KLSAgICAgICAgICAgIERJU1QsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi8KLSAgICAgICAgICAgIERJU1RFWFQsICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi8KLSAgICAgICAgICAgIE1BVENILCAgICAgIC8qIG86IHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZSB0byBjb3B5IHN0cmluZyAqLwotICAgICAgICAgICAgTElULCAgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi8KLSAgICBDSEVDSywgICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi8KLSAgICBMRU5HVEgsICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgbGVuZ3RoIChnemlwKSAqLwotICAgIERPTkUsICAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCi0gICAgQkFELCAgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqLwotICAgIE1FTSwgICAgICAgIC8qIGdvdCBhbiBpbmZsYXRlKCkgbWVtb3J5IGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCi0gICAgU1lOQyAgICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovCi19IGluZmxhdGVfbW9kZTsKLQotLyoKLSAgICBTdGF0ZSB0cmFuc2l0aW9ucyBiZXR3ZWVuIGFib3ZlIG1vZGVzIC0KLQotICAgIChtb3N0IG1vZGVzIGNhbiBnbyB0byBCQUQgb3IgTUVNIG9uIGVycm9yIC0tIG5vdCBzaG93biBmb3IgY2xhcml0eSkKLQotICAgIFByb2Nlc3MgaGVhZGVyOgotICAgICAgICBIRUFEIC0+IChnemlwKSBvciAoemxpYikgb3IgKHJhdykKLSAgICAgICAgKGd6aXApIC0+IEZMQUdTIC0+IFRJTUUgLT4gT1MgLT4gRVhMRU4gLT4gRVhUUkEgLT4gTkFNRSAtPiBDT01NRU5UIC0+Ci0gICAgICAgICAgICAgICAgICBIQ1JDIC0+IFRZUEUKLSAgICAgICAgKHpsaWIpIC0+IERJQ1RJRCBvciBUWVBFCi0gICAgICAgIERJQ1RJRCAtPiBESUNUIC0+IFRZUEUKLSAgICAgICAgKHJhdykgLT4gVFlQRURPCi0gICAgUmVhZCBkZWZsYXRlIGJsb2NrczoKLSAgICAgICAgICAgIFRZUEUgLT4gVFlQRURPIC0+IFNUT1JFRCBvciBUQUJMRSBvciBMRU5fIG9yIENIRUNLCi0gICAgICAgICAgICBTVE9SRUQgLT4gQ09QWV8gLT4gQ09QWSAtPiBUWVBFCi0gICAgICAgICAgICBUQUJMRSAtPiBMRU5MRU5TIC0+IENPREVMRU5TIC0+IExFTl8KLSAgICAgICAgICAgIExFTl8gLT4gTEVOCi0gICAgUmVhZCBkZWZsYXRlIGNvZGVzIGluIGZpeGVkIG9yIGR5bmFtaWMgYmxvY2s6Ci0gICAgICAgICAgICAgICAgTEVOIC0+IExFTkVYVCBvciBMSVQgb3IgVFlQRQotICAgICAgICAgICAgICAgIExFTkVYVCAtPiBESVNUIC0+IERJU1RFWFQgLT4gTUFUQ0ggLT4gTEVOCi0gICAgICAgICAgICAgICAgTElUIC0+IExFTgotICAgIFByb2Nlc3MgdHJhaWxlcjoKLSAgICAgICAgQ0hFQ0sgLT4gTEVOR1RIIC0+IERPTkUKLSAqLwotCi0vKiBzdGF0ZSBtYWludGFpbmVkIGJldHdlZW4gaW5mbGF0ZSgpIGNhbGxzLiAgQXBwcm94aW1hdGVseSAxMEsgYnl0ZXMuICovCi1zdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSB7Ci0gICAgaW5mbGF0ZV9tb2RlIG1vZGU7ICAgICAgICAgIC8qIGN1cnJlbnQgaW5mbGF0ZSBtb2RlICovCi0gICAgaW50IGxhc3Q7ICAgICAgICAgICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovCi0gICAgaW50IHdyYXA7ICAgICAgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi8KLSAgICBpbnQgaGF2ZWRpY3Q7ICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBkaWN0aW9uYXJ5IHByb3ZpZGVkICovCi0gICAgaW50IGZsYWdzOyAgICAgICAgICAgICAgICAgIC8qIGd6aXAgaGVhZGVyIG1ldGhvZCBhbmQgZmxhZ3MgKDAgaWYgemxpYikgKi8KLSAgICB1bnNpZ25lZCBkbWF4OyAgICAgICAgICAgICAgLyogemxpYiBoZWFkZXIgbWF4IGRpc3RhbmNlIChJTkZMQVRFX1NUUklDVCkgKi8KLSAgICB1bnNpZ25lZCBsb25nIGNoZWNrOyAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2YgY2hlY2sgdmFsdWUgKi8KLSAgICB1bnNpZ25lZCBsb25nIHRvdGFsOyAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2Ygb3V0cHV0IGNvdW50ICovCi0gICAgZ3pfaGVhZGVycCBoZWFkOyAgICAgICAgICAgIC8qIHdoZXJlIHRvIHNhdmUgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gKi8KLSAgICAgICAgLyogc2xpZGluZyB3aW5kb3cgKi8KLSAgICB1bnNpZ25lZCB3Yml0czsgICAgICAgICAgICAgLyogbG9nIGJhc2UgMiBvZiByZXF1ZXN0ZWQgd2luZG93IHNpemUgKi8KLSAgICB1bnNpZ25lZCB3c2l6ZTsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovCi0gICAgdW5zaWduZWQgd2hhdmU7ICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi8KLSAgICB1bnNpZ25lZCB3bmV4dDsgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovCi0gICAgdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdzsgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovCi0gICAgICAgIC8qIGJpdCBhY2N1bXVsYXRvciAqLwotICAgIHVuc2lnbmVkIGxvbmcgaG9sZDsgICAgICAgICAvKiBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi8KLSAgICB1bnNpZ25lZCBiaXRzOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gImluIiAqLwotICAgICAgICAvKiBmb3Igc3RyaW5nIGFuZCBzdG9yZWQgYmxvY2sgY29weWluZyAqLwotICAgIHVuc2lnbmVkIGxlbmd0aDsgICAgICAgICAgICAvKiBsaXRlcmFsIG9yIGxlbmd0aCBvZiBkYXRhIHRvIGNvcHkgKi8KLSAgICB1bnNpZ25lZCBvZmZzZXQ7ICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IHN0cmluZyBmcm9tICovCi0gICAgICAgIC8qIGZvciB0YWJsZSBhbmQgY29kZSBkZWNvZGluZyAqLwotICAgIHVuc2lnbmVkIGV4dHJhOyAgICAgICAgICAgICAvKiBleHRyYSBiaXRzIG5lZWRlZCAqLwotICAgICAgICAvKiBmaXhlZCBhbmQgZHluYW1pYyBjb2RlIHRhYmxlcyAqLwotICAgIGNvZGUgY29uc3QgRkFSICpsZW5jb2RlOyAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi8KLSAgICBjb2RlIGNvbnN0IEZBUiAqZGlzdGNvZGU7ICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovCi0gICAgdW5zaWduZWQgbGVuYml0czsgICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGxlbmNvZGUgKi8KLSAgICB1bnNpZ25lZCBkaXN0Yml0czsgICAgICAgICAgLyogaW5kZXggYml0cyBmb3IgZGlzdGNvZGUgKi8KLSAgICAgICAgLyogZHluYW1pYyB0YWJsZSBidWlsZGluZyAqLwotICAgIHVuc2lnbmVkIG5jb2RlOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovCi0gICAgdW5zaWduZWQgbmxlbjsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovCi0gICAgdW5zaWduZWQgbmRpc3Q7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi8KLSAgICB1bnNpZ25lZCBoYXZlOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RocyBpbiBsZW5zW10gKi8KLSAgICBjb2RlIEZBUiAqbmV4dDsgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqLwotICAgIHVuc2lnbmVkIHNob3J0IGxlbnNbMzIwXTsgICAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovCi0gICAgdW5zaWduZWQgc2hvcnQgd29ya1syODhdOyAgIC8qIHdvcmsgYXJlYSBmb3IgY29kZSB0YWJsZSBidWlsZGluZyAqLwotICAgIGNvZGUgY29kZXNbRU5PVUdIXTsgICAgICAgICAvKiBzcGFjZSBmb3IgY29kZSB0YWJsZXMgKi8KLSAgICBpbnQgc2FuZTsgICAgICAgICAgICAgICAgICAgLyogaWYgZmFsc2UsIGFsbG93IGludmFsaWQgZGlzdGFuY2UgdG9vIGZhciAqLwotICAgIGludCBiYWNrOyAgICAgICAgICAgICAgICAgICAvKiBiaXRzIGJhY2sgb2YgbGFzdCB1bnByb2Nlc3NlZCBsZW5ndGgvbGl0ICovCi0gICAgdW5zaWduZWQgd2FzOyAgICAgICAgICAgICAgIC8qIGluaXRpYWwgbGVuZ3RoIG9mIG1hdGNoICovCi19OwpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvaW5mdHJlZXMuYyBiL3NyYy96bGliL2luZnRyZWVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiY2Q3YzQuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvaW5mdHJlZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKiBpbmZ0cmVlcy5jIC0tIGdlbmVyYXRlIEh1ZmZtYW4gdHJlZXMgZm9yIGVmZmljaWVudCBkZWNvZGluZwotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMTIgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLSNpbmNsdWRlICJ6dXRpbC5oIgotI2luY2x1ZGUgImluZnRyZWVzLmgiCi0KLSNkZWZpbmUgTUFYQklUUyAxNQotCi1jb25zdCBjaGFyIGluZmxhdGVfY29weXJpZ2h0W10gPQotICAgIiBpbmZsYXRlIDEuMi43IENvcHlyaWdodCAxOTk1LTIwMTIgTWFyayBBZGxlciAiOwotLyoKLSAgSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaXMgd2VsY29tZQotICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIHByb2R1Y3QuIElmIGZvciBzb21lIHJlYXNvbiB5b3UgY2Fubm90Ci0gIGluY2x1ZGUgc3VjaCBhbiBhY2tub3dsZWRnbWVudCwgSSB3b3VsZCBhcHByZWNpYXRlIHRoYXQgeW91IGtlZXAgdGhpcwotICBjb3B5cmlnaHQgc3RyaW5nIGluIHRoZSBleGVjdXRhYmxlIG9mIHlvdXIgcHJvZHVjdC4KLSAqLwotCi0vKgotICAgQnVpbGQgYSBzZXQgb2YgdGFibGVzIHRvIGRlY29kZSB0aGUgcHJvdmlkZWQgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4KLSAgIFRoZSBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBUaGUgcmVzdWx0IHN0YXJ0cyBhdCAqdGFibGUsCi0gICB3aG9zZSBpbmRpY2VzIGFyZSAwLi4yXmJpdHMtMS4gIHdvcmsgaXMgYSB3cml0YWJsZSBhcnJheSBvZiBhdCBsZWFzdAotICAgbGVucyBzaG9ydHMsIHdoaWNoIGlzIHVzZWQgYXMgYSB3b3JrIGFyZWEuICB0eXBlIGlzIHRoZSB0eXBlIG9mIGNvZGUKLSAgIHRvIGJlIGdlbmVyYXRlZCwgQ09ERVMsIExFTlMsIG9yIERJU1RTLiAgT24gcmV0dXJuLCB6ZXJvIGlzIHN1Y2Nlc3MsCi0gICAtMSBpcyBhbiBpbnZhbGlkIGNvZGUsIGFuZCArMSBtZWFucyB0aGF0IEVOT1VHSCBpc24ndCBlbm91Z2guICB0YWJsZQotICAgb24gcmV0dXJuIHBvaW50cyB0byB0aGUgbmV4dCBhdmFpbGFibGUgZW50cnkncyBhZGRyZXNzLiAgYml0cyBpcyB0aGUKLSAgIHJlcXVlc3RlZCByb290IHRhYmxlIGluZGV4IGJpdHMsIGFuZCBvbiByZXR1cm4gaXQgaXMgdGhlIGFjdHVhbCByb290Ci0gICB0YWJsZSBpbmRleCBiaXRzLiAgSXQgd2lsbCBkaWZmZXIgaWYgdGhlIHJlcXVlc3QgaXMgZ3JlYXRlciB0aGFuIHRoZQotICAgbG9uZ2VzdCBjb2RlIG9yIGlmIGl0IGlzIGxlc3MgdGhhbiB0aGUgc2hvcnRlc3QgY29kZS4KLSAqLwotaW50IFpMSUJfSU5URVJOQUwgaW5mbGF0ZV90YWJsZSh0eXBlLCBsZW5zLCBjb2RlcywgdGFibGUsIGJpdHMsIHdvcmspCi1jb2RldHlwZSB0eXBlOwotdW5zaWduZWQgc2hvcnQgRkFSICpsZW5zOwotdW5zaWduZWQgY29kZXM7Ci1jb2RlIEZBUiAqIEZBUiAqdGFibGU7Ci11bnNpZ25lZCBGQVIgKmJpdHM7Ci11bnNpZ25lZCBzaG9ydCBGQVIgKndvcms7Ci17Ci0gICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGEgY29kZSdzIGxlbmd0aCBpbiBiaXRzICovCi0gICAgdW5zaWduZWQgc3ltOyAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGNvZGUgc3ltYm9scyAqLwotICAgIHVuc2lnbmVkIG1pbiwgbWF4OyAgICAgICAgICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RocyAqLwotICAgIHVuc2lnbmVkIHJvb3Q7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqLwotICAgIHVuc2lnbmVkIGN1cnI7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqLwotICAgIHVuc2lnbmVkIGRyb3A7ICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMgdG8gZHJvcCBmb3Igc3ViLXRhYmxlICovCi0gICAgaW50IGxlZnQ7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwcmVmaXggY29kZXMgYXZhaWxhYmxlICovCi0gICAgdW5zaWduZWQgdXNlZDsgICAgICAgICAgICAgIC8qIGNvZGUgZW50cmllcyBpbiB0YWJsZSB1c2VkICovCi0gICAgdW5zaWduZWQgaHVmZjsgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gY29kZSAqLwotICAgIHVuc2lnbmVkIGluY3I7ICAgICAgICAgICAgICAvKiBmb3IgaW5jcmVtZW50aW5nIGNvZGUsIGluZGV4ICovCi0gICAgdW5zaWduZWQgZmlsbDsgICAgICAgICAgICAgIC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovCi0gICAgdW5zaWduZWQgbG93OyAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi8KLSAgICB1bnNpZ25lZCBtYXNrOyAgICAgICAgICAgICAgLyogbWFzayBmb3IgbG93IHJvb3QgYml0cyAqLwotICAgIGNvZGUgaGVyZTsgICAgICAgICAgICAgICAgICAvKiB0YWJsZSBlbnRyeSBmb3IgZHVwbGljYXRpb24gKi8KLSAgICBjb2RlIEZBUiAqbmV4dDsgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gdGFibGUgKi8KLSAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBGQVIgKmJhc2U7ICAgICAvKiBiYXNlIHZhbHVlIHRhYmxlIHRvIHVzZSAqLwotICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IEZBUiAqZXh0cmE7ICAgIC8qIGV4dHJhIGJpdHMgdGFibGUgdG8gdXNlICovCi0gICAgaW50IGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBiYXNlIGFuZCBleHRyYSBmb3Igc3ltYm9sID4gZW5kICovCi0gICAgdW5zaWduZWQgc2hvcnQgY291bnRbTUFYQklUUysxXTsgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovCi0gICAgdW5zaWduZWQgc2hvcnQgb2Zmc1tNQVhCSVRTKzFdOyAgICAgLyogb2Zmc2V0cyBpbiB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi8KLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbGJhc2VbMzFdID0geyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgYmFzZSAqLwotICAgICAgICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLAotICAgICAgICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMH07Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGxleHRbMzFdID0geyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgZXh0cmEgKi8KLSAgICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsCi0gICAgICAgIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDE2LCA3OCwgNjh9OwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkYmFzZVszMl0gPSB7IC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGJhc2UgKi8KLSAgICAgICAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLAotICAgICAgICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsCi0gICAgICAgIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcsIDAsIDB9OwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkZXh0WzMyXSA9IHsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgZXh0cmEgKi8KLSAgICAgICAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsCi0gICAgICAgIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LAotICAgICAgICAyOCwgMjgsIDI5LCAyOSwgNjQsIDY0fTsKLQotICAgIC8qCi0gICAgICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZQotICAgICAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZQotICAgICAgIHN5bWJvbHMgMC4uY29kZXMtMS4gIFRoZSBIdWZmbWFuIGNvZGUgaXMgZ2VuZXJhdGVkIGJ5IGZpcnN0IHNvcnRpbmcgdGhlCi0gICAgICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXIKLSAgICAgICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzCi0gICAgICAgZm9yIHRoZSBmaXJzdCBjb2RlIG9mIHRoZSBzaG9ydGVzdCBsZW5ndGgsIGFuZCB0aGUgY29kZXMgYXJlIGludGVnZXIKLSAgICAgICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aAotICAgICAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHMKLSAgICAgICBmcm9tIHRoZWlyIG1vcmUgbmF0dXJhbCBpbnRlZ2VyIGluY3JlbWVudCBvcmRlcmluZywgYW5kIHNvIHdoZW4gdGhlCi0gICAgICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXMKLSAgICAgICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLgotCi0gICAgICAgVGhpcyByb3V0aW5lIGFzc3VtZXMsIGJ1dCBkb2VzIG5vdCBjaGVjaywgdGhhdCBhbGwgb2YgdGhlIGVudHJpZXMgaW4KLSAgICAgICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLgotICAgICAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0Ci0gICAgICAgc3ltYm9sIGRvZXMgbm90IG9jY3VyIGluIHRoaXMgY29kZS4KLQotICAgICAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCwKLSAgICAgICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGUKLSAgICAgICBzb3J0ZWQgdGFibGUsIGFuZCB0aGVuIGVudGVyaW5nIHRoZSBzeW1ib2xzIGluIG9yZGVyIGluIHRoZSBzb3J0ZWQKLSAgICAgICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnkKLSAgICAgICB0aGUgY2FsbGVyLgotCi0gICAgICAgVGhlIGxlbmd0aCBjb3VudHMgYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzIGFzIHdlbGwsIGkuZS4gZmluZGluZwotICAgICAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueQotICAgICAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkCi0gICAgICAgYXQgbGVuZ3RoIGNvdW50cyB0byBkZXRlcm1pbmUgc3ViLXRhYmxlIHNpemVzIHdoZW4gYnVpbGRpbmcgdGhlCi0gICAgICAgZGVjb2RpbmcgdGFibGVzLgotICAgICAqLwotCi0gICAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovCi0gICAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspCi0gICAgICAgIGNvdW50W2xlbl0gPSAwOwotICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKQotICAgICAgICBjb3VudFtsZW5zW3N5bV1dKys7Ci0KLSAgICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqLwotICAgIHJvb3QgPSAqYml0czsKLSAgICBmb3IgKG1heCA9IE1BWEJJVFM7IG1heCA+PSAxOyBtYXgtLSkKLSAgICAgICAgaWYgKGNvdW50W21heF0gIT0gMCkgYnJlYWs7Ci0gICAgaWYgKHJvb3QgPiBtYXgpIHJvb3QgPSBtYXg7Ci0gICAgaWYgKG1heCA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gc3ltYm9scyB0byBjb2RlIGF0IGFsbCAqLwotICAgICAgICBoZXJlLm9wID0gKHVuc2lnbmVkIGNoYXIpNjQ7ICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi8KLSAgICAgICAgaGVyZS5iaXRzID0gKHVuc2lnbmVkIGNoYXIpMTsKLSAgICAgICAgaGVyZS52YWwgPSAodW5zaWduZWQgc2hvcnQpMDsKLSAgICAgICAgKigqdGFibGUpKysgPSBoZXJlOyAgICAgICAgICAgICAvKiBtYWtlIGEgdGFibGUgdG8gZm9yY2UgYW4gZXJyb3IgKi8KLSAgICAgICAgKigqdGFibGUpKysgPSBoZXJlOwotICAgICAgICAqYml0cyA9IDE7Ci0gICAgICAgIHJldHVybiAwOyAgICAgLyogbm8gc3ltYm9scywgYnV0IHdhaXQgZm9yIGRlY29kaW5nIHRvIHJlcG9ydCBlcnJvciAqLwotICAgIH0KLSAgICBmb3IgKG1pbiA9IDE7IG1pbiA8IG1heDsgbWluKyspCi0gICAgICAgIGlmIChjb3VudFttaW5dICE9IDApIGJyZWFrOwotICAgIGlmIChyb290IDwgbWluKSByb290ID0gbWluOwotCi0gICAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovCi0gICAgbGVmdCA9IDE7Ci0gICAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHsKLSAgICAgICAgbGVmdCA8PD0gMTsKLSAgICAgICAgbGVmdCAtPSBjb3VudFtsZW5dOwotICAgICAgICBpZiAobGVmdCA8IDApIHJldHVybiAtMTsgICAgICAgIC8qIG92ZXItc3Vic2NyaWJlZCAqLwotICAgIH0KLSAgICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT0gQ09ERVMgfHwgbWF4ICE9IDEpKQotICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovCi0KLSAgICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqLwotICAgIG9mZnNbMV0gPSAwOwotICAgIGZvciAobGVuID0gMTsgbGVuIDwgTUFYQklUUzsgbGVuKyspCi0gICAgICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dOwotCi0gICAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqLwotICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKQotICAgICAgICBpZiAobGVuc1tzeW1dICE9IDApIHdvcmtbb2Zmc1tsZW5zW3N5bV1dKytdID0gKHVuc2lnbmVkIHNob3J0KXN5bTsKLQotICAgIC8qCi0gICAgICAgQ3JlYXRlIGFuZCBmaWxsIGluIGRlY29kaW5nIHRhYmxlcy4gIEluIHRoaXMgbG9vcCwgdGhlIHRhYmxlIGJlaW5nCi0gICAgICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmYKLSAgICAgICB3aXRoIGxlbmd0aCBsZW4uICBUaGF0IGNvZGUgaXMgY29udmVydGVkIHRvIGFuIGluZGV4IGJ5IGRyb3BwaW5nIGRyb3AKLSAgICAgICBiaXRzIG9mZiBvZiB0aGUgYm90dG9tLiAgRm9yIGNvZGVzIHdoZXJlIGxlbiBpcyBsZXNzIHRoYW4gZHJvcCArIGN1cnIsCi0gICAgICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0bwotICAgICAgIGZpbGwgdGhlIHRhYmxlIHdpdGggcmVwbGljYXRlZCBlbnRyaWVzLgotCi0gICAgICAgcm9vdCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHRoZSByb290IHRhYmxlLiAgV2hlbiBsZW4gZXhjZWVkcwotICAgICAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4Ci0gICAgICAgb2YgdGhlIGxvdyByb290IGJpdHMgb2YgaHVmZi4gIFRoaXMgaXMgc2F2ZWQgaW4gbG93IHRvIGNoZWNrIGZvciB3aGVuIGEKLSAgICAgICBuZXcgc3ViLXRhYmxlIHNob3VsZCBiZSBzdGFydGVkLiAgZHJvcCBpcyB6ZXJvIHdoZW4gdGhlIHJvb3QgdGFibGUgaXMKLSAgICAgICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuCi0KLSAgICAgICBXaGVuIGEgbmV3IHN1Yi10YWJsZSBpcyBuZWVkZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byBsb29rIGFoZWFkIGluIHRoZQotICAgICAgIGNvZGUgbGVuZ3RocyB0byBkZXRlcm1pbmUgd2hhdCBzaXplIHN1Yi10YWJsZSBpcyBuZWVkZWQuICBUaGUgbGVuZ3RoCi0gICAgICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmUKLSAgICAgICBlbnRlcmVkIGluIHRoZSB0YWJsZXMuCi0KLSAgICAgICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZQotICAgICAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3QKLSAgICAgICB0aGUgY29uc3RhbnRzIEVOT1VHSF9MRU5TIGFuZCBFTk9VR0hfRElTVFMgdG8gZ3VhcmQgYWdhaW5zdCBjaGFuZ2VzIGluCi0gICAgICAgdGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplIGNvbnN0YW50cy4gIFNlZSB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaAotICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0gICAgICAgc3ltIGluY3JlbWVudHMgdGhyb3VnaCBhbGwgc3ltYm9scywgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMgd2hlbgotICAgICAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXMKLSAgICAgICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzCi0gICAgICAgaW4gdGhlIHJlc3Qgb2YgdGhlIGRlY29kaW5nIHRhYmxlcyB3aXRoIGludmFsaWQgY29kZSBtYXJrZXJzLgotICAgICAqLwotCi0gICAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi8KLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIENPREVTOgotICAgICAgICBiYXNlID0gZXh0cmEgPSB3b3JrOyAgICAvKiBkdW1teSB2YWx1ZS0tbm90IHVzZWQgKi8KLSAgICAgICAgZW5kID0gMTk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTEVOUzoKLSAgICAgICAgYmFzZSA9IGxiYXNlOwotICAgICAgICBiYXNlIC09IDI1NzsKLSAgICAgICAgZXh0cmEgPSBsZXh0OwotICAgICAgICBleHRyYSAtPSAyNTc7Ci0gICAgICAgIGVuZCA9IDI1NjsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogICAgICAgICAgICAvKiBESVNUUyAqLwotICAgICAgICBiYXNlID0gZGJhc2U7Ci0gICAgICAgIGV4dHJhID0gZGV4dDsKLSAgICAgICAgZW5kID0gLTE7Ci0gICAgfQotCi0gICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSBmb3IgbG9vcCAqLwotICAgIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovCi0gICAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovCi0gICAgbGVuID0gbWluOyAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgbGVuZ3RoICovCi0gICAgbmV4dCA9ICp0YWJsZTsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgdG8gZmlsbCBpbiAqLwotICAgIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi8KLSAgICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqLwotICAgIGxvdyA9ICh1bnNpZ25lZCkoLTEpOyAgICAgICAvKiB0cmlnZ2VyIG5ldyBzdWItdGFibGUgd2hlbiBsZW4gPiByb290ICovCi0gICAgdXNlZCA9IDFVIDw8IHJvb3Q7ICAgICAgICAgIC8qIHVzZSByb290IHRhYmxlIGVudHJpZXMgKi8KLSAgICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqLwotCi0gICAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovCi0gICAgaWYgKCh0eXBlID09IExFTlMgJiYgdXNlZCA+PSBFTk9VR0hfTEVOUykgfHwKLSAgICAgICAgKHR5cGUgPT0gRElTVFMgJiYgdXNlZCA+PSBFTk9VR0hfRElTVFMpKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIC8qIHByb2Nlc3MgYWxsIGNvZGVzIGFuZCBtYWtlIHRhYmxlIGVudHJpZXMgKi8KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIC8qIGNyZWF0ZSB0YWJsZSBlbnRyeSAqLwotICAgICAgICBoZXJlLmJpdHMgPSAodW5zaWduZWQgY2hhcikobGVuIC0gZHJvcCk7Ci0gICAgICAgIGlmICgoaW50KSh3b3JrW3N5bV0pIDwgZW5kKSB7Ci0gICAgICAgICAgICBoZXJlLm9wID0gKHVuc2lnbmVkIGNoYXIpMDsKLSAgICAgICAgICAgIGhlcmUudmFsID0gd29ya1tzeW1dOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChpbnQpKHdvcmtbc3ltXSkgPiBlbmQpIHsKLSAgICAgICAgICAgIGhlcmUub3AgPSAodW5zaWduZWQgY2hhcikoZXh0cmFbd29ya1tzeW1dXSk7Ci0gICAgICAgICAgICBoZXJlLnZhbCA9IGJhc2Vbd29ya1tzeW1dXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGhlcmUub3AgPSAodW5zaWduZWQgY2hhcikoMzIgKyA2NCk7ICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovCi0gICAgICAgICAgICBoZXJlLnZhbCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiByZXBsaWNhdGUgZm9yIHRob3NlIGluZGljZXMgd2l0aCBsb3cgbGVuIGJpdHMgZXF1YWwgdG8gaHVmZiAqLwotICAgICAgICBpbmNyID0gMVUgPDwgKGxlbiAtIGRyb3ApOwotICAgICAgICBmaWxsID0gMVUgPDwgY3VycjsKLSAgICAgICAgbWluID0gZmlsbDsgICAgICAgICAgICAgICAgIC8qIHNhdmUgb2Zmc2V0IHRvIG5leHQgdGFibGUgKi8KLSAgICAgICAgZG8gewotICAgICAgICAgICAgZmlsbCAtPSBpbmNyOwotICAgICAgICAgICAgbmV4dFsoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gaGVyZTsKLSAgICAgICAgfSB3aGlsZSAoZmlsbCAhPSAwKTsKLQotICAgICAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqLwotICAgICAgICBpbmNyID0gMVUgPDwgKGxlbiAtIDEpOwotICAgICAgICB3aGlsZSAoaHVmZiAmIGluY3IpCi0gICAgICAgICAgICBpbmNyID4+PSAxOwotICAgICAgICBpZiAoaW5jciAhPSAwKSB7Ci0gICAgICAgICAgICBodWZmICY9IGluY3IgLSAxOwotICAgICAgICAgICAgaHVmZiArPSBpbmNyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGh1ZmYgPSAwOwotCi0gICAgICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqLwotICAgICAgICBzeW0rKzsKLSAgICAgICAgaWYgKC0tKGNvdW50W2xlbl0pID09IDApIHsKLSAgICAgICAgICAgIGlmIChsZW4gPT0gbWF4KSBicmVhazsKLSAgICAgICAgICAgIGxlbiA9IGxlbnNbd29ya1tzeW1dXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqLwotICAgICAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9IGxvdykgewotICAgICAgICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovCi0gICAgICAgICAgICBpZiAoZHJvcCA9PSAwKQotICAgICAgICAgICAgICAgIGRyb3AgPSByb290OwotCi0gICAgICAgICAgICAvKiBpbmNyZW1lbnQgcGFzdCBsYXN0IHRhYmxlICovCi0gICAgICAgICAgICBuZXh0ICs9IG1pbjsgICAgICAgICAgICAvKiBoZXJlIG1pbiBpcyAxIDw8IGN1cnIgKi8KLQotICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGxlbmd0aCBvZiBuZXh0IHRhYmxlICovCi0gICAgICAgICAgICBjdXJyID0gbGVuIC0gZHJvcDsKLSAgICAgICAgICAgIGxlZnQgPSAoaW50KSgxIDw8IGN1cnIpOwotICAgICAgICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4KSB7Ci0gICAgICAgICAgICAgICAgbGVmdCAtPSBjb3VudFtjdXJyICsgZHJvcF07Ci0gICAgICAgICAgICAgICAgaWYgKGxlZnQgPD0gMCkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY3VycisrOwotICAgICAgICAgICAgICAgIGxlZnQgPDw9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGNoZWNrIGZvciBlbm91Z2ggc3BhY2UgKi8KLSAgICAgICAgICAgIHVzZWQgKz0gMVUgPDwgY3VycjsKLSAgICAgICAgICAgIGlmICgodHlwZSA9PSBMRU5TICYmIHVzZWQgPj0gRU5PVUdIX0xFTlMpIHx8Ci0gICAgICAgICAgICAgICAgKHR5cGUgPT0gRElTVFMgJiYgdXNlZCA+PSBFTk9VR0hfRElTVFMpKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqLwotICAgICAgICAgICAgbG93ID0gaHVmZiAmIG1hc2s7Ci0gICAgICAgICAgICAoKnRhYmxlKVtsb3ddLm9wID0gKHVuc2lnbmVkIGNoYXIpY3VycjsKLSAgICAgICAgICAgICgqdGFibGUpW2xvd10uYml0cyA9ICh1bnNpZ25lZCBjaGFyKXJvb3Q7Ci0gICAgICAgICAgICAoKnRhYmxlKVtsb3ddLnZhbCA9ICh1bnNpZ25lZCBzaG9ydCkobmV4dCAtICp0YWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBmaWxsIGluIHJlbWFpbmluZyB0YWJsZSBlbnRyeSBpZiBjb2RlIGlzIGluY29tcGxldGUgKGd1YXJhbnRlZWQgdG8gaGF2ZQotICAgICAgIGF0IG1vc3Qgb25lIHJlbWFpbmluZyBlbnRyeSwgc2luY2UgaWYgdGhlIGNvZGUgaXMgaW5jb21wbGV0ZSwgdGhlCi0gICAgICAgbWF4aW11bSBjb2RlIGxlbmd0aCB0aGF0IHdhcyBhbGxvd2VkIHRvIGdldCB0aGlzIGZhciBpcyBvbmUgYml0KSAqLwotICAgIGlmIChodWZmICE9IDApIHsKLSAgICAgICAgaGVyZS5vcCA9ICh1bnNpZ25lZCBjaGFyKTY0OyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi8KLSAgICAgICAgaGVyZS5iaXRzID0gKHVuc2lnbmVkIGNoYXIpKGxlbiAtIGRyb3ApOwotICAgICAgICBoZXJlLnZhbCA9ICh1bnNpZ25lZCBzaG9ydCkwOwotICAgICAgICBuZXh0W2h1ZmZdID0gaGVyZTsKLSAgICB9Ci0KLSAgICAvKiBzZXQgcmV0dXJuIHBhcmFtZXRlcnMgKi8KLSAgICAqdGFibGUgKz0gdXNlZDsKLSAgICAqYml0cyA9IHJvb3Q7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zcmMvemxpYi9pbmZ0cmVlcy5oIGIvc3JjL3psaWIvaW5mdHJlZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhNTNhMC4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9pbmZ0cmVlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyogaW5mdHJlZXMuaCAtLSBoZWFkZXIgdG8gdXNlIGluZnRyZWVzLmMKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1LCAyMDEwIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcwotICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCi0gICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCi0gKi8KLQotLyogU3RydWN0dXJlIGZvciBkZWNvZGluZyB0YWJsZXMuICBFYWNoIGVudHJ5IHByb3ZpZGVzIGVpdGhlciB0aGUKLSAgIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkbyB0aGUgb3BlcmF0aW9uIHJlcXVlc3RlZCBieSB0aGUgY29kZSB0aGF0Ci0gICBpbmRleGVkIHRoYXQgdGFibGUgZW50cnksIG9yIGl0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBhbm90aGVyCi0gICB0YWJsZSB0aGF0IGluZGV4ZXMgbW9yZSBiaXRzIG9mIHRoZSBjb2RlLiAgb3AgaW5kaWNhdGVzIHdoZXRoZXIKLSAgIHRoZSBlbnRyeSBpcyBhIHBvaW50ZXIgdG8gYW5vdGhlciB0YWJsZSwgYSBsaXRlcmFsLCBhIGxlbmd0aCBvcgotICAgZGlzdGFuY2UsIGFuIGVuZC1vZi1ibG9jaywgb3IgYW4gaW52YWxpZCBjb2RlLiAgRm9yIGEgdGFibGUKLSAgIHBvaW50ZXIsIHRoZSBsb3cgZm91ciBiaXRzIG9mIG9wIGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBvZgotICAgdGhhdCB0YWJsZS4gIEZvciBhIGxlbmd0aCBvciBkaXN0YW5jZSwgdGhlIGxvdyBmb3VyIGJpdHMgb2Ygb3AKLSAgIGlzIHRoZSBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBnZXQgYWZ0ZXIgdGhlIGNvZGUuICBiaXRzIGlzCi0gICB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhpcyBjb2RlIG9yIHBhcnQgb2YgdGhlIGNvZGUgdG8gZHJvcCBvZmYKLSAgIG9mIHRoZSBiaXQgYnVmZmVyLiAgdmFsIGlzIHRoZSBhY3R1YWwgYnl0ZSB0byBvdXRwdXQgaW4gdGhlIGNhc2UKLSAgIG9mIGEgbGl0ZXJhbCwgdGhlIGJhc2UgbGVuZ3RoIG9yIGRpc3RhbmNlLCBvciB0aGUgb2Zmc2V0IGZyb20KLSAgIHRoZSBjdXJyZW50IHRhYmxlIHRvIHRoZSBuZXh0IHRhYmxlLiAgRWFjaCBlbnRyeSBpcyBmb3VyIGJ5dGVzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIGNoYXIgb3A7ICAgICAgICAgICAvKiBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIHRhYmxlIGJpdHMgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGJpdHM7ICAgICAgICAgLyogYml0cyBpbiB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB2YWw7ICAgICAgICAgLyogb2Zmc2V0IGluIHRhYmxlIG9yIGNvZGUgdmFsdWUgKi8KLX0gY29kZTsKLQotLyogb3AgdmFsdWVzIGFzIHNldCBieSBpbmZsYXRlX3RhYmxlKCk6Ci0gICAgMDAwMDAwMDAgLSBsaXRlcmFsCi0gICAgMDAwMHR0dHQgLSB0YWJsZSBsaW5rLCB0dHR0ICE9IDAgaXMgdGhlIG51bWJlciBvZiB0YWJsZSBpbmRleCBiaXRzCi0gICAgMDAwMWVlZWUgLSBsZW5ndGggb3IgZGlzdGFuY2UsIGVlZWUgaXMgdGhlIG51bWJlciBvZiBleHRyYSBiaXRzCi0gICAgMDExMDAwMDAgLSBlbmQgb2YgYmxvY2sKLSAgICAwMTAwMDAwMCAtIGludmFsaWQgY29kZQotICovCi0KLS8qIE1heGltdW0gc2l6ZSBvZiB0aGUgZHluYW1pYyB0YWJsZS4gIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2RlIHN0cnVjdHVyZXMgaXMKLSAgIDE0NDQsIHdoaWNoIGlzIHRoZSBzdW0gb2YgODUyIGZvciBsaXRlcmFsL2xlbmd0aCBjb2RlcyBhbmQgNTkyIGZvciBkaXN0YW5jZQotICAgY29kZXMuICBUaGVzZSB2YWx1ZXMgd2VyZSBmb3VuZCBieSBleGhhdXN0aXZlIHNlYXJjaGVzIHVzaW5nIHRoZSBwcm9ncmFtCi0gICBleGFtcGxlcy9lbm91Z2guYyBmb3VuZCBpbiB0aGUgemxpYiBkaXN0cmlidHV0aW9uLiAgVGhlIGFyZ3VtZW50cyB0byB0aGF0Ci0gICBwcm9ncmFtIGFyZSB0aGUgbnVtYmVyIG9mIHN5bWJvbHMsIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSwgYW5kIHRoZQotICAgbWF4aW11bSBiaXQgbGVuZ3RoIG9mIGEgY29kZS4gICJlbm91Z2ggMjg2IDkgMTUiIGZvciBsaXRlcmFsL2xlbmd0aCBjb2RlcwotICAgcmV0dXJucyByZXR1cm5zIDg1MiwgYW5kICJlbm91Z2ggMzAgNiAxNSIgZm9yIGRpc3RhbmNlIGNvZGVzIHJldHVybnMgNTkyLgotICAgVGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplICg5IG9yIDYpIGlzIGZvdW5kIGluIHRoZSBmaWZ0aCBhcmd1bWVudCBvZiB0aGUKLSAgIGluZmxhdGVfdGFibGUoKSBjYWxscyBpbiBpbmZsYXRlLmMgYW5kIGluZmJhY2suYy4gIElmIHRoZSByb290IHRhYmxlIHNpemUgaXMKLSAgIGNoYW5nZWQsIHRoZW4gdGhlc2UgbWF4aW11bSBzaXplcyB3b3VsZCBiZSBuZWVkIHRvIGJlIHJlY2FsY3VsYXRlZCBhbmQKLSAgIHVwZGF0ZWQuICovCi0jZGVmaW5lIEVOT1VHSF9MRU5TIDg1MgotI2RlZmluZSBFTk9VR0hfRElTVFMgNTkyCi0jZGVmaW5lIEVOT1VHSCAoRU5PVUdIX0xFTlMrRU5PVUdIX0RJU1RTKQotCi0vKiBUeXBlIG9mIGNvZGUgdG8gYnVpbGQgZm9yIGluZmxhdGVfdGFibGUoKSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBDT0RFUywKLSAgICBMRU5TLAotICAgIERJU1RTCi19IGNvZGV0eXBlOwotCi1pbnQgWkxJQl9JTlRFUk5BTCBpbmZsYXRlX3RhYmxlIE9GKChjb2RldHlwZSB0eXBlLCB1bnNpZ25lZCBzaG9ydCBGQVIgKmxlbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvZGVzLCBjb2RlIEZBUiAqIEZBUiAqdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZBUiAqYml0cywgdW5zaWduZWQgc2hvcnQgRkFSICp3b3JrKSk7CmRpZmYgLS1naXQgYS9zcmMvemxpYi9tYWtlX3Ztcy5jb20gYi9zcmMvemxpYi9tYWtlX3Ztcy5jb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY1ZTlkMGMuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvbWFrZV92bXMuY29tCisrKyAvZGV2L251bGwKQEAgLTEsODY3ICswLDAgQEAKLSQhIG1ha2UgbGlieiB1bmRlciBWTVMgd3JpdHRlbiBieQotJCEgTWFydGluIFAuSi4gWmluc2VyCi0kIQotJCEgSW4gY2FzZSBvZiBwcm9ibGVtcyB3aXRoIHRoZSBpbnN0YWxsIHlvdSBtaWdodCBjb250YWN0IG1lIGF0Ci0kISB6aW5zZXJAemluc2VyLm5vLWlwLmluZm8ocHJlZmVycmVkKSBvcgotJCEgbWFydGluLnppbnNlckBldXJleGNoYW5nZS5jb20gKHdvcmspCi0kIQotJCEgTWFrZSBwcm9jZWR1cmUgaGlzdG9yeSBmb3IgWmxpYgotJCEKLSQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0kISBWZXJzaW9uIGhpc3RvcnkKLSQhIDAuMDEgMjAwNjAxMjAgRmlyc3QgdmVyc2lvbiB0byByZWNlaXZlIGEgbnVtYmVyCi0kISAwLjAyIDIwMDYxMDA4IEFkYXB0IHRvIG5ldyBNYWtlZmlsZS5pbgotJCEgMC4wMyAyMDA5MTIyNCBBZGQgc3VwcG9ydCBmb3IgbGFyZ2UgZmlsZSBjaGVjawotJCEgMC4wNCAyMDEwMDExMCBBZGQgbmV3IGd6Y2xvc2UsIGd6bGliLCBnenJlYWQsIGd6d3JpdGUKLSQhIDAuMDUgMjAxMDAyMjEgRXhjaGFuZ2UgemxpYmRlZnMuaCBieSB6Y29uZi5oLmluCi0kISAwLjA2IDIwMTIwMTExIEZpeCBtaXNzaW5nIGFtaXNzX2VyciwgdXBkYXRlIHpjb25mX2guaW4sIGZpeCBuZXcgZXhtcGxlcwotJCEgICAgICAgICAgICAgICBzdWJkaXIgcGF0aCwgdXBkYXRlIG1vZHVsZSBzZWFyY2ggaW4gbWFrZWZpbGUuaW4KLSQhIDAuMDcgMjAxMjAxMTUgVHJpZ2dlcmVkIGJ5IHdvcmsgZG9uZSBieSBBbGV4ZXkgQ2h1cGFoaW4gY29tcGxldGx5IHJlZGVzaWduZWQKLSQhICAgICAgICAgICAgICAgc2hhcmVkIGltYWdlIGNyZWF0aW9uCi0kISAwLjA4IDIwMTIwMjE5IE1ha2UgaXQgd29yayBvbiBWQVggYWdhaW4sIHByZS1sb2FkIG1pc3Npbmcgc3ltYm9scyB0byBzaGFyZWQKLSQhICAgICAgICAgICAgICAgaW1hZ2UKLSQhIDAuMDkgMjAxMjAzMDUgU01TLiAgUDEgc2V0cyBidWlsZGVyICgiTU1LIiwgIk1NUyIsICIgIiAoYnVpbHQtaW4pKS4KLSQhICAgICAgICAgICAgICAgIiIgLT4gYXV0b21hdGljLCBwcmVmZXJlbmNlOiBNTUssIE1NUywgYnVpbHQtaW4uCi0kIQotJCBvbiBlcnJvciB0aGVuIGdvdG8gZXJyX2V4aXQKLSQhCi0kIHRydWUgID0gMQotJCBmYWxzZSA9IDAKLSQgdG1wbmFtID0gInRlbXBfIiArIGYkZ2V0anBpKCIiLCJwaWQiKQotJCB0dCA9IHRtcG5hbSArICIudHh0IgotJCB0YyA9IHRtcG5hbSArICIuYyIKLSQgdGggPSB0bXBuYW0gKyAiLmgiCi0kIGRlZmluZS9ub2xvZyB0Y29uZmlnICd0aCcKLSQgaXRzX2RlY2MgPSBmYWxzZQotJCBpdHNfdmF4YyA9IGZhbHNlCi0kIGl0c19nbnVjID0gZmFsc2UKLSQgc19jYXNlICAgPSBGYWxzZQotJCEKLSQhIFNldHVwIHZhcmlhYmxlcyBob2xkaW5nICJjb25maWciIGluZm9ybWF0aW9uCi0kIQotJCBNYWtlICAgID0gIicncDEnIgotJCBuYW1lICAgICA9ICJabGliIgotJCB2ZXJzaW9uICA9ICI/Lj8uPyIKLSQgdl9zdHJpbmcgPSAiWkxJQl9WRVJTSU9OIgotJCB2X2ZpbGUgICA9ICJ6bGliLmgiCi0kIGNjb3B0ICAgPSAiL2luY2x1ZGUgPSBbXSIKLSQgbG9wdHMgICA9ICIiCi0kIGRuc3JsICAgPSAiIgotJCBhY29uZl9pbl9maWxlID0gInpjb25mLmguaW4jemNvbmYuaF9pbiN6Y29uZl9oLmluIgotJCBjb25mX2NoZWNrX3N0cmluZyA9ICIiCi0kIGxpbmtvbmx5ID0gZmFsc2UKLSQgb3B0ZmlsZSAgPSBuYW1lICsgIi5vcHQiCi0kIG1hcGZpbGUgID0gbmFtZSArICIubWFwIgotJCBsaWJkZWZzICA9ICIiCi0kIHZheCAgICAgID0gZiRnZXRzeWkoIkhXX01PREVMIikubHQuMTAyNAotJCBheHAgICAgICA9IGYkZ2V0c3lpKCJIV19NT0RFTCIpLmdlLjEwMjQgLmFuZC4gZiRnZXRzeWkoIkhXX01PREVMIikubHQuNDA5NgotJCBpYTY0ICAgICA9IGYkZ2V0c3lpKCJIV19NT0RFTCIpLmdlLjQwOTYKLSQhCi0kISAyMDEyLTAzLTA1IFNNUy4KLSQhIFdoeSBpcyB0aGlzIG5lZWRlZD8gIEFuZCBpZiBpdCBpcyBuZWVkZWQsIHdoeSBub3Qgc2ltcGx5ICIubm90LiB2YXgiPwotJCEKLSQhISEgaWYgYXhwIC5vci4gaWE2NCB0aGVuICBzZXQgcHJvYy9wYXJzZT1leHRlbmRlZAotJCEKLSQgd2hvYW1pID0gZiRwYXJzZShmJGVudmlyb25tZW50KCJQcm9jZWR1cmUiKSwsLCwiTk9fQ09OQ0VBTCIpCi0kIG15ZGVmICA9IEYkcGFyc2Uod2hvYW1pLCwsIkRFVklDRSIpCi0kIG15ZGlyICA9IGYkcGFyc2Uod2hvYW1pLCwsIkRJUkVDVE9SWSIpIC0gIl1bIgotJCBteXByb2MgPSBmJHBhcnNlKHdob2FtaSwsLCJOYW1lIikgKyBmJHBhcnNlKHdob2FtaSwsLCJ0eXBlIikKLSQhCi0kISBDaGVjayBmb3IgTU1LL01NUwotJCEKLSQgaWYgKE1ha2UgLmVxcy4gIiIpCi0kIHRoZW4KLSQgICBJZiBGJFNlYXJjaCAoIlN5cyRTeXN0ZW06TU1TLkVYRSIpIC5uZXMuICIiIFRoZW4gTWFrZSA9ICJNTVMiCi0kICAgSWYgRiRUeXBlIChNTUspIC5lcXMuICJTVFJJTkciIFRoZW4gTWFrZSA9ICJNTUsiCi0kIGVsc2UKLSQgICBNYWtlID0gZiRlZGl0KCBNYWtlLCAidHJpbSIpCi0kIGVuZGlmCi0kIQotJCBnb3N1YiBmaW5kX3ZlcnNpb24KLSQhCi0kICBvcGVuL3dyaXRlIHRvcHQgdG1wLm9wdAotJCAgb3Blbi93cml0ZSBvcHRmICdvcHRmaWxlJwotJCEKLSQgZ29zdWIgY2hlY2tfb3B0cwotJCEKLSQhIExvb2sgZm9yIHRoZSBjb21waWxlciB1c2VkCi0kIQotJCBnb3N1YiBjaGVja19jb21waWxlcgotJCBjbG9zZSB0b3B0Ci0kIGNsb3NlIG9wdGYKLSQhCi0kIGlmIGl0c19kZWNjCi0kIHRoZW4KLSQgICBjY29wdCA9ICIvcHJlZml4PWFsbCIgKyBjY29wdAotJCAgIGlmIGYkdHJubG5tKCJTWVMiKSAuZXFzLiAiIgotJCAgIHRoZW4KLSQgICAgIGlmIGF4cAotJCAgICAgdGhlbgotJCAgICAgICBkZWZpbmUgc3lzIHN5cyRsaWJyYXJ5OgotJCAgICAgZWxzZQotJCAgICAgICBjY29wdCA9ICIvZGVjYyIgKyBjY29wdAotJCAgICAgICBkZWZpbmUgc3lzIGRlY2MkbGlicmFyeV9pbmNsdWRlOgotJCAgICAgZW5kaWYKLSQgICBlbmRpZgotJCEKLSQhIDIwMTItMDMtMDUgU01TLgotJCEgV2h5IC9OQU1FUyA9IEFTX0lTPyAgV2h5IG5vdCBzaW1wbHkgIi5ub3QuIHZheCI/ICBBbmQgd2h5IG5vdCBvbiBWQVg/Ci0kIQotJCAgIGlmIGF4cCAub3IuIGlhNjQKLSQgICB0aGVuCi0kICAgICAgIGNjb3B0ID0gY2NvcHQgKyAiL25hbWU9YXNfaXMvb3B0PShpbmxpbmU9c3BlZWQpIgotJCAgICAgICBzX2Nhc2UgPSB0cnVlCi0kICAgZW5kaWYKLSQgZW5kaWYKLSQgaWYgaXRzX3ZheGMgLm9yLiBpdHNfZ251YwotJCB0aGVuCi0kICAgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIHN5cyRsaWJyYXJ5OgotJCBlbmRpZgotJCEKLSQhIEJ1aWxkIGEgZmFrZSBjb25maWd1cmUgaW5wdXQgaGVhZGVyCi0kIQotJCBvcGVuL3dyaXRlIGNvbmZfaGluIGNvbmZpZy5oaW4KLSQgd3JpdGUgY29uZl9oaW4gIiN1bmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFIgotJCBjbG9zZSBjb25mX2hpbgotJCEKLSQhCi0kIGkgPSAwCi0kRklORF9BQ09ORjoKLSQgZm5hbWUgPSBmJGVsZW1lbnQoaSwiIyIsYWNvbmZfaW5fZmlsZSkKLSQgaWYgZm5hbWUgLmVxcy4gIiMiIHRoZW4gZ290byBBTUlTU19FUlIKLSQgaWYgZiRzZWFyY2goZm5hbWUpIC5lcXMuICIiCi0kIHRoZW4KLSQgICBpID0gaSArIDEKLSQgICBnb3RvIGZpbmRfYWNvbmYKLSQgZW5kaWYKLSQgb3Blbi9yZWFkL2Vycj1hY29uZl9lcnIgYWNvbmZfaW4gJ2ZuYW1lJwotJCBvcGVuL3dyaXRlIGFjb25mIHpjb25mLmgKLSRBQ09ORl9MT09QOgotJCByZWFkL2VuZF9vZl9maWxlPWFjb25mX2V4aXQgYWNvbmZfaW4gbGluZQotJCB3b3JrID0gZiRlZGl0KGxpbmUsICJjb21wcmVzcyx0cmltIikKLSQgaWYgZiRleHRyYWN0KDAsNix3b3JrKSAubmVzLiAiI3VuZGVmIgotJCB0aGVuCi0kICAgaWYgZiRleHRyYWN0KDAsMTIsd29yaykgLm5lcy4gIiNjbWFrZWRlZmluZSIKLSQgICB0aGVuCi0kICAgICAgIHdyaXRlIGFjb25mIGxpbmUKLSQgICBlbmRpZgotJCBlbHNlCi0kICAgY2RlZiA9IGYkZWxlbWVudCgxLCIgIix3b3JrKQotJCAgIGdvc3ViIGNoZWNrX2NvbmZpZwotJCBlbmRpZgotJCBnb3RvIGFjb25mX2xvb3AKLSRBQ09ORl9FWElUOgotJCB3cml0ZSBhY29uZiAiIgotJCB3cml0ZSBhY29uZiAiLyogVk1TIHNwZWNpZmljcyBhZGRlZCBieSBtYWtlX3Ztcy5jb206ICovIgotJCB3cml0ZSBhY29uZiAiI2RlZmluZSBWTVMgMSIKLSQgd3JpdGUgYWNvbmYgIiNpbmNsdWRlIDx1bmlzdGQuaD4iCi0kIHdyaXRlIGFjb25mICIjaW5jbHVkZSA8dW5peGlvLmg+IgotJCB3cml0ZSBhY29uZiAiI2lmZGVmIF9MQVJHRUZJTEUiCi0kIHdyaXRlIGFjb25mICIjIGRlZmluZSBvZmY2NF90IF9fb2ZmNjRfdCIKLSQgd3JpdGUgYWNvbmYgIiMgZGVmaW5lIGZvcGVuNjQgZm9wZW4iCi0kIHdyaXRlIGFjb25mICIjIGRlZmluZSBmc2Vla282NCBmc2Vla28iCi0kIHdyaXRlIGFjb25mICIjIGRlZmluZSBsc2VlazY0IGxzZWVrIgotJCB3cml0ZSBhY29uZiAiIyBkZWZpbmUgZnRlbGxvNjQgZnRlbGwiCi0kIHdyaXRlIGFjb25mICIjZW5kaWYiCi0kIHdyaXRlIGFjb25mICIjaWYgIWRlZmluZWQoIF9fVkFYKSAmJiAoX19DUlRMX1ZFUiA+PSA3MDMxMjAwMCkiCi0kIHdyaXRlIGFjb25mICIjIGRlZmluZSBIQVZFX1ZTTlBSSU5URiIKLSQgd3JpdGUgYWNvbmYgIiNlbmRpZiIKLSQgY2xvc2UgYWNvbmZfaW4KLSQgY2xvc2UgYWNvbmYKLSQgaWYgZiRzZWFyY2goIicndGgnIikgLm5lcy4gIiIgdGhlbiBkZWxldGUgJ3RoJzsqCi0kISBCdWlsZCB0aGUgdGhpbmcgcGxhaW4gb3Igd2l0aCBtbXMKLSQhCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkNvbXBpbGluZyBabGliIHNvdXJjZXMgLi4uIgotJCBpZiBtYWtlLmVxcy4iIgotJCB0aGVuCi0kICAgaWYgKGYkc2VhcmNoKCAiZXhhbXBsZS5vYmo7KiIpIC5uZXMuICIiKSB0aGVuIGRlbGV0ZSBleGFtcGxlLm9iajsqCi0kICAgaWYgKGYkc2VhcmNoKCAibWluaWd6aXAub2JqOyoiKSAubmVzLiAiIikgdGhlbiBkZWxldGUgbWluaWd6aXAub2JqOyoKLSQgICBDQUxMIE1BS0UgYWRsZXIzMi5PQkogIkNDICcnQ0NPUFQnIGFkbGVyMzIiIC0KLSAgICAgICAgICAgICAgICBhZGxlcjMyLmMgemxpYi5oIHpjb25mLmgKLSQgICBDQUxMIE1BS0UgY29tcHJlc3MuT0JKICJDQyAnJ0NDT1BUJyBjb21wcmVzcyIgLQotICAgICAgICAgICAgICAgIGNvbXByZXNzLmMgemxpYi5oIHpjb25mLmgKLSQgICBDQUxMIE1BS0UgY3JjMzIuT0JKICJDQyAnJ0NDT1BUJyBjcmMzMiIgLQotICAgICAgICAgICAgICAgIGNyYzMyLmMgemxpYi5oIHpjb25mLmgKLSQgICBDQUxMIE1BS0UgZGVmbGF0ZS5PQkogIkNDICcnQ0NPUFQnIGRlZmxhdGUiIC0KLSAgICAgICAgICAgICAgICBkZWZsYXRlLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLSQgICBDQUxMIE1BS0UgZ3pjbG9zZS5PQkogIkNDICcnQ0NPUFQnIGd6Y2xvc2UiIC0KLSAgICAgICAgICAgICAgICBnemNsb3NlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAotJCAgIENBTEwgTUFLRSBnemxpYi5PQkogIkNDICcnQ0NPUFQnIGd6bGliIiAtCi0gICAgICAgICAgICAgICAgZ3psaWIuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0kICAgQ0FMTCBNQUtFIGd6cmVhZC5PQkogIkNDICcnQ0NPUFQnIGd6cmVhZCIgLQotICAgICAgICAgICAgICAgIGd6cmVhZC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLSQgICBDQUxMIE1BS0UgZ3p3cml0ZS5PQkogIkNDICcnQ0NPUFQnIGd6d3JpdGUiIC0KLSAgICAgICAgICAgICAgICBnendyaXRlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAotJCAgIENBTEwgTUFLRSBpbmZiYWNrLk9CSiAiQ0MgJydDQ09QVCcgaW5mYmFjayIgLQotICAgICAgICAgICAgICAgIGluZmJhY2suYyB6dXRpbC5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaCBpbmZmaXhlZC5oCi0kICAgQ0FMTCBNQUtFIGluZmZhc3QuT0JKICJDQyAnJ0NDT1BUJyBpbmZmYXN0IiAtCi0gICAgICAgICAgICAgICAgaW5mZmFzdC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mZmFzdC5oCi0kICAgQ0FMTCBNQUtFIGluZmxhdGUuT0JKICJDQyAnJ0NDT1BUJyBpbmZsYXRlIiAtCi0gICAgICAgICAgICAgICAgaW5mbGF0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mYmxvY2suaAotJCAgIENBTEwgTUFLRSBpbmZ0cmVlcy5PQkogIkNDICcnQ0NPUFQnIGluZnRyZWVzIiAtCi0gICAgICAgICAgICAgICAgaW5mdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKLSQgICBDQUxMIE1BS0UgdHJlZXMuT0JKICJDQyAnJ0NDT1BUJyB0cmVlcyIgLQotICAgICAgICAgICAgICAgIHRyZWVzLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLSQgICBDQUxMIE1BS0UgdW5jb21wci5PQkogIkNDICcnQ0NPUFQnIHVuY29tcHIiIC0KLSAgICAgICAgICAgICAgICB1bmNvbXByLmMgemxpYi5oIHpjb25mLmgKLSQgICBDQUxMIE1BS0UgenV0aWwuT0JKICJDQyAnJ0NDT1BUJyB6dXRpbCIgLQotICAgICAgICAgICAgICAgIHp1dGlsLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAotJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIFpsaWIgLi4uIgotJCAgIENBTEwgTUFLRSBsaWJ6Lk9MQiAibGliL2NyZWEgbGliei5vbGIgKi5vYmoiICouT0JKCi0kICAgd3JpdGUgc3lzJG91dHB1dCAiQnVpbGRpbmcgZXhhbXBsZS4uLiIKLSQgICBDQUxMIE1BS0UgZXhhbXBsZS5PQkogIkNDICcnQ0NPUFQnIFsudGVzdF1leGFtcGxlIiAtCi0gICAgICAgICAgICAgICAgWy50ZXN0XWV4YW1wbGUuYyB6bGliLmggemNvbmYuaAotJCAgIGNhbGwgbWFrZSBleGFtcGxlLmV4ZSAiTElOSyBleGFtcGxlLGxpYnoub2xiL2xpYiIgZXhhbXBsZS5vYmogbGliei5vbGIKLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJCdWlsZGluZyBtaW5pZ3ppcC4uLiIKLSQgICBDQUxMIE1BS0UgbWluaWd6aXAuT0JKICJDQyAnJ0NDT1BUJyBbLnRlc3RdbWluaWd6aXAiIC0KLSAgICAgICAgICAgICAgWy50ZXN0XW1pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKLSQgICBjYWxsIG1ha2UgbWluaWd6aXAuZXhlIC0KLSAgICAgICAgICAgICAgIkxJTksgbWluaWd6aXAsbGliei5vbGIvbGliIiAtCi0gICAgICAgICAgICAgIG1pbmlnemlwLm9iaiBsaWJ6Lm9sYgotJCBlbHNlCi0kICAgZ29zdWIgY3JlYV9tbXMKLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJNYWtlICcnbmFtZScgJyd2ZXJzaW9uJyB3aXRoICcnTWFrZScgIgotJCAgICdtYWtlJwotJCBlbmRpZgotJCEKLSQhIENyZWF0ZSBzaGFyZWFibGUgaW1hZ2UKLSQhCi0kIGdvc3ViIGNyZWFfb2xpc3QKLSQgd3JpdGUgc3lzJG91dHB1dCAiQ3JlYXRpbmcgbGlienNoci5leGUiCi0kIGNhbGwgbWFwXzJfc2hvcHQgJ21hcGZpbGUnICdvcHRmaWxlJwotJCBMSU5LXydsb3B0cycvU0hBUkU9bGlienNoci5leGUgbW9kdWxlcy5vcHQvb3B0LCdvcHRmaWxlJy9vcHQKLSQgd3JpdGUgc3lzJG91dHB1dCAiWmxpYiBidWlsZCBjb21wbGV0ZWQiCi0kIGRlbGV0ZS9ub2xvZyB0bXAub3B0OyoKLSQgZXhpdAotJEFNSVNTX0VSUjoKLSQgd3JpdGUgc3lzJG91dHB1dCAiTm8gc291cmNlIGZvciBjb25maWcuaGluIGZvdW5kLiIKLSQgd3JpdGUgc3lzJG91dHB1dCAiVHJpZWQgYW55IG9mICcnYWNvbmZfaW5fZmlsZSciCi0kIGdvdG8gZXJyX2V4aXQKLSRDQ19FUlI6Ci0kIHdyaXRlIHN5cyRvdXRwdXQgIkMgY29tcGlsZXIgcmVxdWlyZWQgdG8gYnVpbGQgJyduYW1lJyIKLSQgZ290byBlcnJfZXhpdAotJEVSUl9FWElUOgotJCBzZXQgbWVzc2FnZS9mYWNpbC9pZGVudC9zZXZlci90ZXh0Ci0kIGNsb3NlL25vbG9nIG9wdGYKLSQgY2xvc2Uvbm9sb2cgdG9wdAotJCBjbG9zZS9ub2xvZyBhY29uZl9pbgotJCBjbG9zZS9ub2xvZyBhY29uZgotJCBjbG9zZS9ub2xvZyBvdXQKLSQgY2xvc2Uvbm9sb2cgbWluCi0kIGNsb3NlL25vbG9nIG1vZAotJCBjbG9zZS9ub2xvZyBoX2luCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkV4aXRpbmcuLi4iCi0kIGV4aXQgMgotJCEKLSQhCi0kTUFLRTogU1VCUk9VVElORSAgICFTVUJST1VUSU5FIFRPIENIRUNLIERFUEVOREVOQ0lFUwotJCBWID0gJ0YkVmVyaWZ5KDApCi0kISBQMSA9IFdoYXQgd2UgYXJlIHRyeWluZyB0byBtYWtlCi0kISBQMiA9IENvbW1hbmQgdG8gbWFrZSBpdAotJCEgUDMgLSBQOCAgV2hhdCBpdCBkZXBlbmRzIG9uCi0kCi0kIElmIEYkU2VhcmNoKFAxKSAuRXFzLiAiIiBUaGVuIEdvdG8gTWFrZWl0Ci0kIFRpbWUgPSBGJEN2VGltZShGJEZpbGUoUDEsIlJEVCIpKQotJGFyZz0zCi0kTG9vcDoKLSQgICAgICAgQXJndW1lbnQgPSBQJ2FyZwotJCAgICAgICBJZiBBcmd1bWVudCAuRXFzLiAiIiBUaGVuIEdvdG8gRXhpdAotJCAgICAgICBFbD0wCi0kTG9vcDI6Ci0kICAgICAgIEZpbGUgPSBGJEVsZW1lbnQoRWwsIiAiLEFyZ3VtZW50KQotJCAgICAgICBJZiBGaWxlIC5FcXMuICIgIiBUaGVuIEdvdG8gRW5kbAotJCAgICAgICBBRmlsZSA9ICIiCi0kTG9vcDM6Ci0kICAgICAgIE9GaWxlID0gQUZpbGUKLSQgICAgICAgQUZpbGUgPSBGJFNlYXJjaChGaWxlKQotJCAgICAgICBJZiBBRmlsZSAuRXFzLiAiIiAuT3IuIEFGaWxlIC5FcXMuIE9GaWxlIFRoZW4gR290byBOZXh0RWwKLSQgICAgICAgSWYgRiRDdlRpbWUoRiRGaWxlKEFGaWxlLCJSRFQiKSkgLkdlcy4gVGltZSBUaGVuIEdvdG8gTWFrZWl0Ci0kICAgICAgIEdvdG8gTG9vcDMKLSROZXh0RUw6Ci0kICAgICAgIEVsID0gRWwgKyAxCi0kICAgICAgIEdvdG8gTG9vcDIKLSRFbmRMOgotJCBhcmc9YXJnKzEKLSQgSWYgYXJnIC5MZS4gOCBUaGVuIEdvdG8gTG9vcAotJCBHb3RvIEV4aXQKLSQKLSRNYWtlaXQ6Ci0kIFZWPUYkVkVSSUZZKDApCi0kIHdyaXRlIHN5cyRvdXRwdXQgUDIKLSQgJ1AyCi0kIFZWPSdGJFZlcmlmeShWVikKLSRFeGl0OgotJCBJZiBWIFRoZW4gU2V0IFZlcmlmeQotJEVORFNVQlJPVVRJTkUKLSQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0kIQotJCEgQ2hlY2sgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIHNldCBzeW1ib2xzIGFjY29yZGluZ2x5Ci0kIQotJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSQhIFZlcnNpb24gaGlzdG9yeQotJCEgMC4wMSAyMDA0MTIwNiBGaXJzdCB2ZXJzaW9uIHRvIHJlY2VpdmUgYSBudW1iZXIKLSQhIDAuMDIgMjAwNjAxMjYgQWRkIG5ldyAiSEVMUCIgdGFyZ2V0Ci0kIENIRUNLX09QVFM6Ci0kIGkgPSAxCi0kIE9QVF9MT09QOgotJCBpZiBpIC5sdC4gOQotJCB0aGVuCi0kICAgY3Bhcm0gPSBmJGVkaXQocCdpJywidXBjYXNlIikKLSQhCi0kISBDaGVjayBpZiBwYXJhbWV0ZXIgYWN0dWFsbHkgY29udGFpbnMgc29tZXRoaW5nCi0kIQotJCAgIGlmIGYkZWRpdChjcGFybSwidHJpbSIpIC5uZXMuICIiCi0kICAgdGhlbgotJCAgICAgaWYgY3Bhcm0gLmVxcy4gIkRFQlVHIgotJCAgICAgdGhlbgotJCAgICAgICBjY29wdCA9IGNjb3B0ICsgIi9ub29wdC9kZWIiCi0kICAgICAgIGxvcHRzID0gbG9wdHMgKyAiL2RlYiIKLSQgICAgIGVuZGlmCi0kICAgICBpZiBmJGxvY2F0ZSgiQ0NPUFQ9IixjcGFybSkgLmx0LiBmJGxlbmd0aChjcGFybSkKLSQgICAgIHRoZW4KLSQgICAgICAgc3RhcnQgPSBmJGxvY2F0ZSgiPSIsY3Bhcm0pICsgMQotJCAgICAgICBsZW4gICA9IGYkbGVuZ3RoKGNwYXJtKSAtIHN0YXJ0Ci0kICAgICAgIGNjb3B0ID0gY2NvcHQgKyBmJGV4dHJhY3Qoc3RhcnQsbGVuLGNwYXJtKQotJCAgICAgICBpZiBmJGxvY2F0ZSgiQVNfSVMiLGYkZWRpdChjY29wdCwiVVBDQVNFIikpIC5sdC4gZiRsZW5ndGgoY2NvcHQpIC0KLSAgICAgICAgICB0aGVuIHNfY2FzZSA9IHRydWUKLSQgICAgIGVuZGlmCi0kICAgICBpZiBjcGFybSAuZXFzLiAiTElOSyIgdGhlbiBsaW5rb25seSA9IHRydWUKLSQgICAgIGlmIGYkbG9jYXRlKCJMT1BUUz0iLGNwYXJtKSAubHQuIGYkbGVuZ3RoKGNwYXJtKQotJCAgICAgdGhlbgotJCAgICAgICBzdGFydCA9IGYkbG9jYXRlKCI9IixjcGFybSkgKyAxCi0kICAgICAgIGxlbiAgID0gZiRsZW5ndGgoY3Bhcm0pIC0gc3RhcnQKLSQgICAgICAgbG9wdHMgPSBsb3B0cyArIGYkZXh0cmFjdChzdGFydCxsZW4sY3Bhcm0pCi0kICAgICBlbmRpZgotJCAgICAgaWYgZiRsb2NhdGUoIkNDPSIsY3Bhcm0pIC5sdC4gZiRsZW5ndGgoY3Bhcm0pCi0kICAgICB0aGVuCi0kICAgICAgIHN0YXJ0ICA9IGYkbG9jYXRlKCI9IixjcGFybSkgKyAxCi0kICAgICAgIGxlbiAgICA9IGYkbGVuZ3RoKGNwYXJtKSAtIHN0YXJ0Ci0kICAgICAgIGNjX2NvbSA9IGYkZXh0cmFjdChzdGFydCxsZW4sY3Bhcm0pCi0gICAgICAgIGlmIChjY19jb20gLm5lcy4gIkRFQ0MiKSAuYW5kLiAtCi0gICAgICAgICAgIChjY19jb20gLm5lcy4gIlZBWEMiKSAuYW5kLiAtCi0gICAgICAgICAgIChjY19jb20gLm5lcy4gIkdOVUMiKQotJCAgICAgICB0aGVuCi0kICAgICAgICAgd3JpdGUgc3lzJG91dHB1dCAiVW5zdXBwb3J0ZWQgY29tcGlsZXIgY2hvaWNlICcnY2NfY29tJyBpZ25vcmVkIgotJCAgICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIlVzZSBERUNDLCBWQVhDLCBvciBHTlVDIGluc3RlYWQiCi0kICAgICAgIGVsc2UKLSQgICAgICAgICBpZiBjY19jb20gLmVxcy4gIkRFQ0MiIHRoZW4gaXRzX2RlY2MgPSB0cnVlCi0kICAgICAgICAgaWYgY2NfY29tIC5lcXMuICJWQVhDIiB0aGVuIGl0c192YXhjID0gdHJ1ZQotJCAgICAgICAgIGlmIGNjX2NvbSAuZXFzLiAiR05VQyIgdGhlbiBpdHNfZ251YyA9IHRydWUKLSQgICAgICAgZW5kaWYKLSQgICAgIGVuZGlmCi0kICAgICBpZiBmJGxvY2F0ZSgiTUFLRT0iLGNwYXJtKSAubHQuIGYkbGVuZ3RoKGNwYXJtKQotJCAgICAgdGhlbgotJCAgICAgICBzdGFydCAgPSBmJGxvY2F0ZSgiPSIsY3Bhcm0pICsgMQotJCAgICAgICBsZW4gICAgPSBmJGxlbmd0aChjcGFybSkgLSBzdGFydAotJCAgICAgICBtbWtzID0gZiRleHRyYWN0KHN0YXJ0LGxlbixjcGFybSkKLSQgICAgICAgaWYgKG1ta3MgLmVxcy4gIk1NSyIpIC5vci4gKG1ta3MgLmVxcy4gIk1NUyIpCi0kICAgICAgIHRoZW4KLSQgICAgICAgICBtYWtlID0gbW1rcwotJCAgICAgICBlbHNlCi0kICAgICAgICAgd3JpdGUgc3lzJG91dHB1dCAiVW5zdXBwb3J0ZWQgbWFrZSBjaG9pY2UgJydtbWtzJyBpZ25vcmVkIgotJCAgICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIlVzZSBNTUsgb3IgTU1TIGluc3RlYWQiCi0kICAgICAgIGVuZGlmCi0kICAgICBlbmRpZgotJCAgICAgaWYgY3Bhcm0gLmVxcy4gIkhFTFAiIHRoZW4gZ29zdWIgYmhlbHAKLSQgICBlbmRpZgotJCAgIGkgPSBpICsgMQotJCAgIGdvdG8gb3B0X2xvb3AKLSQgZW5kaWYKLSQgcmV0dXJuCi0kIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJCEKLSQhIExvb2sgZm9yIHRoZSBjb21waWxlciB1c2VkCi0kIQotJCEgVmVyc2lvbiBoaXN0b3J5Ci0kISAwLjAxIDIwMDQwMjIzIEZpcnN0IHZlcnNpb24gdG8gcmVjZWl2ZSBhIG51bWJlcgotJCEgMC4wMiAyMDA0MDIyOSBTYXZlL3NldCB2YWx1ZSBvZiBkZWNjJG5vX3Jvb3RlZF9zZWFyY2hfbGlzdHMKLSQhIDAuMDMgMjAwNjAyMDIgRXh0ZW5kIGhhbmRsaW5nIG9mIEdOVSBDCi0kISAwLjA0IDIwMDkwNDAyIENvbXBhcSAtPiBocAotJENIRUNLX0NPTVBJTEVSOgotJCBpZiAoLm5vdC4gKGl0c19kZWNjIC5vci4gaXRzX3ZheGMgLm9yLiBpdHNfZ251YykpCi0kIHRoZW4KLSQgICBpdHNfZGVjYyA9IChmJHNlYXJjaCgiU1lTJFNZU1RFTTpERUNDJENPTVBJTEVSLkVYRSIpIC5uZXMuICIiKQotJCAgIGl0c192YXhjID0gLm5vdC4gaXRzX2RlY2MgLmFuZC4gKEYkU2VhcmNoKCJTWVMkU3lzdGVtOlZBWEMuRXhlIikgLm5lcy4gIiIpCi0kICAgaXRzX2dudWMgPSAubm90LiAoaXRzX2RlY2MgLm9yLiBpdHNfdmF4YykgLmFuZC4gKGYkdHJubG5tKCJnbnVfY2MiKSAubmVzLiAiIikKLSQgZW5kaWYKLSQhCi0kISBFeGl0IGlmIG5vIGNvbXBpbGVyIGF2YWlsYWJsZQotJCEKLSQgaWYgKC5ub3QuIChpdHNfZGVjYyAub3IuIGl0c192YXhjIC5vci4gaXRzX2dudWMpKQotJCB0aGVuIGdvdG8gQ0NfRVJSCi0kIGVsc2UKLSQgICBpZiBpdHNfZGVjYwotJCAgIHRoZW4KLSQgICAgIHdyaXRlIHN5cyRvdXRwdXQgIkNDIGNvbXBpbGVyIGNoZWNrIC4uLiBocCBDIgotJCAgICAgaWYgZiR0cm5sbm0oImRlY2Mkbm9fcm9vdGVkX3NlYXJjaF9saXN0cyIpIC5uZXMuICIiCi0kICAgICB0aGVuCi0kICAgICAgIGRucnNsID0gZiR0cm5sbm0oImRlY2Mkbm9fcm9vdGVkX3NlYXJjaF9saXN0cyIpCi0kICAgICBlbmRpZgotJCAgICAgZGVmaW5lL25vbG9nIGRlY2Mkbm9fcm9vdGVkX3NlYXJjaF9saXN0cyAxCi0kICAgZWxzZQotJCAgICAgaWYgaXRzX3ZheGMgdGhlbiB3cml0ZSBzeXMkb3V0cHV0ICJDQyBjb21waWxlciBjaGVjayAuLi4gVkFYIEMiCi0kICAgICBpZiBpdHNfZ251YwotJCAgICAgdGhlbgotJCAgICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIkNDIGNvbXBpbGVyIGNoZWNrIC4uLiBHTlUgQyIKLSQgICAgICAgICBpZiBmJHRybmxubSh0b3B0KSB0aGVuIHdyaXRlIHRvcHQgImdudV9jYzpbMDAwMDAwXWdjY2xpYi5vbGIvbGliIgotJCAgICAgICAgIGlmIGYkdHJubG5tKG9wdGYpIHRoZW4gd3JpdGUgb3B0ZiAiZ251X2NjOlswMDAwMDBdZ2NjbGliLm9sYi9saWIiCi0kICAgICAgICAgY2MgPSAiZ2NjIgotJCAgICAgZW5kaWYKLSQgICAgIGlmIGYkdHJubG5tKHRvcHQpIHRoZW4gd3JpdGUgdG9wdCAic3lzJHNoYXJlOnZheGNydGwuZXhlL3NoYXJlIgotJCAgICAgaWYgZiR0cm5sbm0ob3B0ZikgdGhlbiB3cml0ZSBvcHRmICJzeXMkc2hhcmU6dmF4Y3J0bC5leGUvc2hhcmUiCi0kICAgZW5kaWYKLSQgZW5kaWYKLSQgcmV0dXJuCi0kIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJCEKLSQhIElmIE1NUy9NTUsgYXJlIGF2YWlsYWJsZSBkdW1wIG91dCB0aGUgZGVzY3JpcC5tbXMgaWYgcmVxdWlyZWQKLSQhCi0kQ1JFQV9NTVM6Ci0kIHdyaXRlIHN5cyRvdXRwdXQgIkNyZWF0aW5nIGRlc2NyaXAubW1zLi4uIgotJCBjcmVhdGUgZGVzY3JpcC5tbXMKLSQgb3Blbi9hcHBlbmQgb3V0IGRlc2NyaXAubW1zCi0kIGNvcHkgc3lzJGlucHV0OiBvdXQKLSQgZGVjawotIyBkZXNjcmlwLm1tczogTU1TIGRlc2NyaXB0aW9uIGZpbGUgZm9yIGJ1aWxkaW5nIHpsaWIgb24gVk1TCi0jIHdyaXR0ZW4gYnkgTWFydGluIFAuSi4gWmluc2VyCi0jIDx6aW5zZXJAemluc2VyLm5vLWlwLmluZm8gb3IgbWFydGluLnppbnNlckBldXJleGNoYW5nZS5jb20+Ci0KLU9CSlMgPSBhZGxlcjMyLm9iaiwgY29tcHJlc3Mub2JqLCBjcmMzMi5vYmosIGd6Y2xvc2Uub2JqLCBnemxpYi5vYmpcCi0gICAgICAgZ3pyZWFkLm9iaiwgZ3p3cml0ZS5vYmosIHVuY29tcHIub2JqLCBpbmZiYWNrLm9ialwKLSAgICAgICBkZWZsYXRlLm9iaiwgdHJlZXMub2JqLCB6dXRpbC5vYmosIGluZmxhdGUub2JqLCBcCi0gICAgICAgaW5mdHJlZXMub2JqLCBpbmZmYXN0Lm9iagotCi0kIGVvZAotJCB3cml0ZSBvdXQgIkNGTEFHUz0iLCBjY29wdAotJCB3cml0ZSBvdXQgIkxPUFRTPSIsIGxvcHRzCi0kIHdyaXRlIG91dCAiYWxsIDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlIGxpYnoub2xiIgotJCBjb3B5IHN5cyRpbnB1dDogb3V0Ci0kIGRlY2sKLSAgICAgICAgQCB3cml0ZSBzeXMkb3V0cHV0ICIgRXhhbXBsZSBhcHBsaWNhdGlvbnMgYXZhaWxhYmxlIgotCi1saWJ6Lm9sYiA6IGxpYnoub2xiKCQoT0JKUykpCi0JQCB3cml0ZSBzeXMkb3V0cHV0ICIgbGlieiBhdmFpbGFibGUiCi0KLWV4YW1wbGUuZXhlIDogZXhhbXBsZS5vYmogbGliei5vbGIKLSAgICAgICAgICAgICAgbGluayAkKExPUFRTKSBleGFtcGxlLGxpYnoub2xiL2xpYgotCi1taW5pZ3ppcC5leGUgOiBtaW5pZ3ppcC5vYmogbGliei5vbGIKLSAgICAgICAgICAgICAgbGluayAkKExPUFRTKSBtaW5pZ3ppcCxsaWJ6Lm9sYi9saWIKLQotY2xlYW4gOgotCWRlbGV0ZSAqLm9iajsqLGxpYnoub2xiOyosKi5vcHQ7KiwqLmV4ZTsqCi0KLQotIyBPdGhlciBkZXBlbmRlbmNpZXMuCi1hZGxlcjMyLm9iaiAgOiBhZGxlcjMyLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAotY29tcHJlc3Mub2JqIDogY29tcHJlc3MuYyB6bGliLmggemNvbmYuaAotY3JjMzIub2JqICAgIDogY3JjMzIuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1kZWZsYXRlLm9iaiAgOiBkZWZsYXRlLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWV4YW1wbGUub2JqICA6IFsudGVzdF1leGFtcGxlLmMgemxpYi5oIHpjb25mLmgKLWd6Y2xvc2Uub2JqICA6IGd6Y2xvc2UuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1nemxpYi5vYmogICAgOiBnemxpYi5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWd6cmVhZC5vYmogICA6IGd6cmVhZC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWd6d3JpdGUub2JqICA6IGd6d3JpdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1pbmZmYXN0Lm9iaiAgOiBpbmZmYXN0LmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmZhc3QuaAotaW5mbGF0ZS5vYmogIDogaW5mbGF0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWluZnRyZWVzLm9iaiA6IGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCi1taW5pZ3ppcC5vYmogOiBbLnRlc3RdbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAotdHJlZXMub2JqICAgIDogdHJlZXMuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotdW5jb21wci5vYmogIDogdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oCi16dXRpbC5vYmogICAgOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWluZmJhY2sub2JqICA6IGluZmJhY2suYyB6dXRpbC5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaCBpbmZmaXhlZC5oCi0kIGVvZAotJCBjbG9zZSBvdXQKLSQgcmV0dXJuCi0kIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJCEKLSQhIFJlYWQgbGlzdCBvZiBjb3JlIGxpYnJhcnkgc291cmNlcyBmcm9tIG1ha2VmaWxlLmluIGFuZCBjcmVhdGUgb3B0aW9ucwotJCEgbmVlZGVkIHRvIGJ1aWxkIHNoYXJlYWJsZSBpbWFnZQotJCEKLSRDUkVBX09MSVNUOgotJCBvcGVuL3JlYWQgbWluIG1ha2VmaWxlLmluCi0kIG9wZW4vd3JpdGUgbW9kIG1vZHVsZXMub3B0Ci0kIHNyY19jaGVja19saXN0ID0gIk9CSlogPSNPQkpHID0iCi0kTVJMT09QOgotJCByZWFkL2VuZD1tcmRvbmUgbWluIHJlYwotJCBpID0gMAotJFNSQ19DSEVDS19MT09QOgotJCBzcmNfY2hlY2sgPSBmJGVsZW1lbnQoaSwgIiMiLCBzcmNfY2hlY2tfbGlzdCkKLSQgaSA9IGkrMQotJCBpZiBzcmNfY2hlY2sgLmVxcy4gIiMiIHRoZW4gZ290byBtcmxvb3AKLSQgaWYgKGYkZXh0cmFjdCgwLDYscmVjKSAubmVzLiBzcmNfY2hlY2spIHRoZW4gZ290byBzcmNfY2hlY2tfbG9vcAotJCByZWMgPSByZWMgLSBzcmNfY2hlY2sKLSQgZ29zdWIgZXh0cmFfZmlsbmFtCi0kIGlmIChmJGVsZW1lbnQoMSwiXCIscmVjKSAuZXFzLiAiXCIpIHRoZW4gZ290byBtcmxvb3AKLSRNUlNMT09QOgotJCByZWFkL2VuZD1tcmRvbmUgbWluIHJlYwotJCBnb3N1YiBleHRyYV9maWxuYW0KLSQgaWYgKGYkZWxlbWVudCgxLCJcIixyZWMpIC5uZXMuICJcIikgdGhlbiBnb3RvIG1yc2xvb3AKLSRNUkRPTkU6Ci0kIGNsb3NlIG1pbgotJCBjbG9zZSBtb2QKLSQgcmV0dXJuCi0kIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJCEKLSQhIFRha2UgcmVjb3JkIGV4dHJhY3RlZCBpbiBjcmVhX29saXN0IGFuZCBzcGxpdCBpdCBpbnRvIHNpbmdsZSBmaWxlbmFtZXMKLSQhCi0kRVhUUkFfRklMTkFNOgotJCBteXJlYyA9IGYkZWRpdChyZWMgLSAiXCIsICJ0cmltLGNvbXByZXNzIikKLSQgaSA9IDAKLSRGRUxPT1A6Ci0kIHNyY2ZpbCA9IGYkZWxlbWVudChpLCIgIiwgbXlyZWMpCi0kIGlmIChzcmNmaWwgLm5lcy4gIiAiKQotJCB0aGVuCi0kICAgd3JpdGUgbW9kIGYkcGFyc2Uoc3JjZmlsLCwsIk5BTUUiKSwgIi5vYmoiCi0kICAgaSA9IGkgKyAxCi0kICAgZ290byBmZWxvb3AKLSQgZW5kaWYKLSQgcmV0dXJuCi0kIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJCEKLSQhIEZpbmQgY3VycmVudCBabGliIHZlcnNpb24gbnVtYmVyCi0kIQotJEZJTkRfVkVSU0lPTjoKLSQgb3Blbi9yZWFkIGhfaW4gJ3ZfZmlsZScKLSRobG9vcDoKLSQgcmVhZC9lbmQ9aGRvbmUgaF9pbiByZWMKLSQgcmVjID0gZiRlZGl0KHJlYywiVFJJTSIpCi0kIGlmIChmJGV4dHJhY3QoMCwxLHJlYykgLm5lcy4gIiMiKSB0aGVuIGdvdG8gaGxvb3AKLSQgcmVjID0gZiRlZGl0KHJlYyAtICIjIiwgIlRSSU0iKQotJCBpZiBmJGVsZW1lbnQoMCwiICIscmVjKSAubmVzLiAiZGVmaW5lIiB0aGVuIGdvdG8gaGxvb3AKLSQgaWYgZiRlbGVtZW50KDEsIiAiLHJlYykgLmVxcy4gdl9zdHJpbmcKLSQgdGhlbgotJCAgIHZlcnNpb24gPSAnZiRlbGVtZW50KDIsIiAiLHJlYyknCi0kICAgZ290byBoZG9uZQotJCBlbmRpZgotJCBnb3RvIGhsb29wCi0kaGRvbmU6Ci0kIGNsb3NlIGhfaW4KLSQgcmV0dXJuCi0kIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJCEKLSRDSEVDS19DT05GSUc6Ci0kIQotJCBpbl9sZGVmID0gZiRsb2NhdGUoY2RlZixsaWJkZWZzKQotJCBpZiAoaW5fbGRlZiAubHQuIGYkbGVuZ3RoKGxpYmRlZnMpKQotJCB0aGVuCi0kICAgd3JpdGUgYWNvbmYgIiNkZWZpbmUgJydjZGVmJyAxIgotJCAgIGxpYmRlZnMgPSBmJGV4dHJhY3QoMCxpbl9sZGVmLGxpYmRlZnMpICsgLQotICAgICAgICAgICAgICBmJGV4dHJhY3QoaW5fbGRlZiArIGYkbGVuZ3RoKGNkZWYpICsgMSwgLQotICAgICAgICAgICAgICAgICAgICAgICAgZiRsZW5ndGgobGliZGVmcykgLSBpbl9sZGVmIC0gZiRsZW5ndGgoY2RlZikgLSAxLCAtCi0gICAgICAgICAgICAgICAgICAgICAgICBsaWJkZWZzKQotJCBlbHNlCi0kICAgaWYgKGYkdHlwZSgnY2RlZicpIC5lcXMuICJJTlRFR0VSIikKLSQgICB0aGVuCi0kICAgICB3cml0ZSBhY29uZiAiI2RlZmluZSAnJ2NkZWYnICIsICdjZGVmJwotJCAgIGVsc2UKLSQgICAgIGlmIChmJHR5cGUoJ2NkZWYnKSAuZXFzLiAiU1RSSU5HIikKLSQgICAgIHRoZW4KLSQgICAgICAgd3JpdGUgYWNvbmYgIiNkZWZpbmUgJydjZGVmJyAiLCAiIiIiLCAnJydjZGVmJycsICIiIiIKLSQgICAgIGVsc2UKLSQgICAgICAgZ29zdWIgY2hlY2tfY2NfZGVmCi0kICAgICBlbmRpZgotJCAgIGVuZGlmCi0kIGVuZGlmCi0kIHJldHVybgotJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSQhCi0kISBDaGVjayBpZiB0aGlzIGlzIGEgZGVmaW5lIHJlbGF0aW5nIHRvIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBDL0MrKwotJCEgY29tcGlsZXIKLSQhCi0kIENIRUNLX0NDX0RFRjoKLSQgaWYgKGNkZWYgLmVxcy4gIl9MQVJHRUZJTEU2NF9TT1VSQ0UiKQotJCB0aGVuCi0kICAgY29weSBzeXMkaW5wdXQ6ICd0YycKLSQgICBkZWNrCi0jaW5jbHVkZSAidGNvbmZpZyIKLSNkZWZpbmUgX0xBUkdFRklMRQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludCBtYWluKCl7Ci1GSUxFICpmcDsKLSAgZnAgPSBmb3BlbigidGVtcC50eHQiLCJyIik7Ci0gIGZzZWVrbyhmcCwxLFNFRUtfU0VUKTsKLSAgZmNsb3NlKGZwKTsKLX0KLQotJCAgIGVvZAotJCAgIHRlc3RfaW52ID0gZmFsc2UKLSQgICBjb21tX2ggPSBmYWxzZQotJCAgIGdvc3ViIGNjX3Byb3BfY2hlY2sKLSQgICByZXR1cm4KLSQgZW5kaWYKLSQgd3JpdGUgYWNvbmYgIi8qICIsIGxpbmUsICIgKi8iCi0kIHJldHVybgotJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSQhCi0kISBDaGVjayBmb3IgcHJvcGVydGllcyBvZiBDL0MrKyBjb21waWxlcgotJCEKLSQhIFZlcnNpb24gaGlzdG9yeQotJCEgMC4wMSAyMDAzMTAyMCBGaXJzdCB2ZXJzaW9uIHRvIHJlY2VpdmUgYSBudW1iZXIKLSQhIDAuMDIgMjAwMzEwMjIgQWRkZWQgbG9naWMgZm9yIGRlZmluZXMgd2l0aCB2YWx1ZQotJCEgMC4wMyAyMDA0MDMwOSBNYWtlIHN1cmUgbG9jYWwgY29uZmlnIGZpbGUgZ2V0cyBub3QgZGVsZXRlZAotJCEgMC4wNCAyMDA0MTIzMCBBbHNvIHdyaXRlIGluY2x1ZGUgZm9yIGNvbmZpZ3VyZSBydW4KLSQhIDAuMDUgMjAwNTAxMDMgQWRkIHByb2Nlc3Npbmcgb2YgImNvbW1lbnQgZGVmaW5lcyIKLSRDQ19QUk9QX0NIRUNLOgotJCBjY19wcm9wID0gdHJ1ZQotJCBpc19uZWVkID0gZmFsc2UKLSQgaXNfbmVlZCA9IChmJGV4dHJhY3QoMCw0LGNkZWYpIC5lcXMuICJORUVEIikgLm9yLiAodGVzdF9pbnYgLmVxLiB0cnVlKQotJCBpZiBmJHNlYXJjaCh0aCkgLmVxcy4gIiIgdGhlbiBjcmVhdGUgJ3RoJwotJCBzZXQgbWVzc2FnZS9ub2ZhYy9ub2lkZW50L25vc2V2ZXIvbm90ZXh0Ci0kIG9uIGVycm9yIHRoZW4gY29udGludWUKLSQgY2MgJ3RtcG5hbScKLSQgaWYgLm5vdC4gKCRzdGF0dXMpICB0aGVuIGNjX3Byb3AgPSBmYWxzZQotJCBvbiBlcnJvciB0aGVuIGNvbnRpbnVlCi0kISBUaGUgaGVhZGVycyBtaWdodCBsaWUgYWJvdXQgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgUlRMCi0kIGxpbmsgJ3RtcG5hbScsdG1wLm9wdC9vcHQKLSQgaWYgLm5vdC4gKCRzdGF0dXMpICB0aGVuIGNjX3Byb3AgPSBmYWxzZQotJCBzZXQgbWVzc2FnZS9mYWMvaWRlbnQvc2V2ZXIvdGV4dAotJCBvbiBlcnJvciB0aGVuIGdvdG8gZXJyX2V4aXQKLSQgZGVsZXRlL25vbG9nICd0bXBuYW0nLio7Ki9leGNsdWRlPSd0aCcKLSQgaWYgKGNjX3Byb3AgLmFuZC4gLm5vdC4gaXNfbmVlZCkgLm9yLiAtCi0gICAgICgubm90LiBjY19wcm9wIC5hbmQuIGlzX25lZWQpCi0kIHRoZW4KLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJDaGVja2luZyBmb3IgJydjZGVmJy4uLiB5ZXMiCi0kICAgaWYgZiR0eXBlKCdjZGVmX3ZhbCdfeWVzKSAubmVzLiAiIgotJCAgIHRoZW4KLSQgICAgIGlmIGYkdHlwZSgnY2RlZl92YWwnX3llcykgLmVxcy4gIklOVEVHRVIiIC0KLSAgICAgICAgIHRoZW4gY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIiNkZWZpbmUgIUFTICFVTCIsY2RlZiwnY2RlZl92YWwnX3llcykKLSQgICAgIGlmIGYkdHlwZSgnY2RlZl92YWwnX3llcykgLmVxcy4gIlNUUklORyIgLQotICAgICAgICAgdGhlbiBjYWxsIHdyaXRlX2NvbmZpZyBmJGZhbygiI2RlZmluZSAhQVMgIUFTIixjZGVmLCdjZGVmX3ZhbCdfeWVzKQotJCAgIGVsc2UKLSQgICAgIGNhbGwgd3JpdGVfY29uZmlnIGYkZmFvKCIjZGVmaW5lICFBUyAxIixjZGVmKQotJCAgIGVuZGlmCi0kICAgaWYgKGNkZWYgLmVxcy4gIkhBVkVfRlNFRUtPIikgLm9yLiAoY2RlZiAuZXFzLiAiX0xBUkdFX0ZJTEVTIikgLm9yLiAtCi0gICAgICAgKGNkZWYgLmVxcy4gIl9MQVJHRUZJTEU2NF9TT1VSQ0UiKSB0aGVuIC0KLSAgICAgIGNhbGwgd3JpdGVfY29uZmlnIGYkc3RyaW5nKCIjZGVmaW5lIF9MQVJHRUZJTEUgMSIpCi0kIGVsc2UKLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJDaGVja2luZyBmb3IgJydjZGVmJy4uLiBubyIKLSQgICBpZiAoY29tbV9oKQotJCAgIHRoZW4KLSAgICAgIGNhbGwgd3JpdGVfY29uZmlnIGYkZmFvKCIvKiAhQVMgKi8iLGxpbmUpCi0kICAgZWxzZQotJCAgICAgaWYgZiR0eXBlKCdjZGVmX3ZhbCdfbm8pIC5uZXMuICIiCi0kICAgICB0aGVuCi0kICAgICAgIGlmIGYkdHlwZSgnY2RlZl92YWwnX25vKSAuZXFzLiAiSU5URUdFUiIgLQotICAgICAgICAgICB0aGVuIGNhbGwgd3JpdGVfY29uZmlnIGYkZmFvKCIjZGVmaW5lICFBUyAhVUwiLGNkZWYsJ2NkZWZfdmFsJ19ubykKLSQgICAgICAgaWYgZiR0eXBlKCdjZGVmX3ZhbCdfbm8pIC5lcXMuICJTVFJJTkciIC0KLSAgICAgICAgICAgdGhlbiBjYWxsIHdyaXRlX2NvbmZpZyBmJGZhbygiI2RlZmluZSAhQVMgIUFTIixjZGVmLCdjZGVmX3ZhbCdfbm8pCi0kICAgICBlbHNlCi0kICAgICAgIGNhbGwgd3JpdGVfY29uZmlnIGYkZmFvKCIjdW5kZWYgIUFTIixjZGVmKQotJCAgICAgZW5kaWYKLSQgICBlbmRpZgotJCBlbmRpZgotJCByZXR1cm4KLSQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0kIQotJCEgQ2hlY2sgZm9yIHByb3BlcnRpZXMgb2YgQy9DKysgY29tcGlsZXIgd2l0aCBtdWx0aXBsZSByZXN1bHQgdmFsdWVzCi0kIQotJCEgVmVyc2lvbiBoaXN0b3J5Ci0kISAwLjAxIDIwMDQwMTI3IEZpcnN0IHZlcnNpb24KLSQhIDAuMDIgMjAwNTAxMDMgUmVjb25jaWxlIGNoYW5nZXMgZnJvbSBjY19wcm9wIHVwIHRvIHZlcnNpb24gMC4wNQotJENDX01QUk9QX0NIRUNLOgotJCBjY19wcm9wID0gdHJ1ZQotJCBpICAgID0gMQotJCBpZGVsID0gMQotJCBNVF9MT09QOgotJCBpZiBmJHR5cGUocmVzdWx0XydpJykgLmVxcy4gIlNUUklORyIKLSQgdGhlbgotJCAgIHNldCBtZXNzYWdlL25vZmFjL25vaWRlbnQvbm9zZXZlci9ub3RleHQKLSQgICBvbiBlcnJvciB0aGVuIGNvbnRpbnVlCi0kICAgY2MgJ3RtcG5hbSdfJ2knCi0kICAgaWYgLm5vdC4gKCRzdGF0dXMpICB0aGVuIGNjX3Byb3AgPSBmYWxzZQotJCAgIG9uIGVycm9yIHRoZW4gY29udGludWUKLSQhIFRoZSBoZWFkZXJzIG1pZ2h0IGxpZSBhYm91dCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBSVEwKLSQgICBsaW5rICd0bXBuYW0nXydpJyx0bXAub3B0L29wdAotJCAgIGlmIC5ub3QuICgkc3RhdHVzKSAgdGhlbiBjY19wcm9wID0gZmFsc2UKLSQgICBzZXQgbWVzc2FnZS9mYWMvaWRlbnQvc2V2ZXIvdGV4dAotJCAgIG9uIGVycm9yIHRoZW4gZ290byBlcnJfZXhpdAotJCAgIGRlbGV0ZS9ub2xvZyAndG1wbmFtJ18naScuKjsqCi0kICAgaWYgKGNjX3Byb3ApCi0kICAgdGhlbgotJCAgICAgd3JpdGUgc3lzJG91dHB1dCAiQ2hlY2tpbmcgZm9yICcnY2RlZicuLi4gIiwgbWRlZl8naScKLSQgICAgIGlmIGYkdHlwZShtZGVmXydpJykgLmVxcy4gIklOVEVHRVIiIC0KLSAgICAgICAgIHRoZW4gY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIiNkZWZpbmUgIUFTICFVTCIsY2RlZixtZGVmXydpJykKLSQgICAgIGlmIGYkdHlwZSgnY2RlZl92YWwnX3llcykgLmVxcy4gIlNUUklORyIgLQotICAgICAgICAgdGhlbiBjYWxsIHdyaXRlX2NvbmZpZyBmJGZhbygiI2RlZmluZSAhQVMgIUFTIixjZGVmLG1kZWZfJ2knKQotJCAgICAgZ290byBtc3ltX2NsZWFuCi0kICAgZWxzZQotJCAgICAgaSA9IGkgKyAxCi0kICAgICBnb3RvIG10X2xvb3AKLSQgICBlbmRpZgotJCBlbmRpZgotJCB3cml0ZSBzeXMkb3V0cHV0ICJDaGVja2luZyBmb3IgJydjZGVmJy4uLiBubyIKLSQgY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIiN1bmRlZiAhQVMiLGNkZWYpCi0kIE1TWU1fQ0xFQU46Ci0kIGlmIChpZGVsIC5sZS4gbXN5bV9tYXgpCi0kIHRoZW4KLSQgICBkZWxldGUvc3ltIG1kZWZfJ2lkZWwnCi0kICAgaWRlbCA9IGlkZWwgKyAxCi0kICAgZ290byBtc3ltX2NsZWFuCi0kIGVuZGlmCi0kIHJldHVybgotJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSQhCi0kISBXcml0ZSBjb25maWd1cmF0aW9uIHRvIGJvdGggcGVybWFuZW50IGFuZCB0ZW1wb3JhcnkgY29uZmlnIGZpbGUKLSQhCi0kISBWZXJzaW9uIGhpc3RvcnkKLSQhIDAuMDEgMjAwMzEwMjkgRmlyc3QgdmVyc2lvbiB0byByZWNlaXZlIGEgbnVtYmVyCi0kIQotJFdSSVRFX0NPTkZJRzogU1VCUk9VVElORQotJCAgd3JpdGUgYWNvbmYgJ3AxJwotJCAgb3Blbi9hcHBlbmQgY29uZmggJ3RoJwotJCAgd3JpdGUgY29uZmggJ3AxJwotJCAgY2xvc2UgY29uZmgKLSRFTkRTVUJST1VUSU5FCi0kIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJCEKLSQhIEFuYWx5emUgdGhlIHByb2plY3QgbWFwIGZpbGUgYW5kIGNyZWF0ZSB0aGUgc3ltYm9sIHZlY3RvciBmb3IgYSBzaGFyZWFibGUKLSQhIGltYWdlIGZyb20gaXQKLSQhCi0kISBWZXJzaW9uIGhpc3RvcnkKLSQhIDAuMDEgMjAxMjAxMjggRmlyc3QgdmVyc2lvbgotJCEgMC4wMiAyMDEyMDIyNiBBZGQgcHJlLWxvYWQgbG9naWMKLSQhCi0kIE1BUF8yX1NIT1BUOiBTdWJyb3V0aW5lCi0kIQotJCBTQVkgOj0gIldSSVRFXyBTWVMkT1VUUFVUIgotJCEKLSQgSUYgRiRTRUFSQ0goIicnUDEnIikgLkVRUy4gIiIKLSQgVEhFTgotJCAgICBTQVkgIk1BUF8yX1NIT1BULUUtTk9TVUNIRklMRTogIEVycm9yLCBpbnB1dGZpbGUgJydwMScgbm90IGF2YWlsYWJsZSIKLSQgICAgZ290byBleGl0X20ycwotJCBFTkRJRgotJCBJRiAiJydQMiciIC5FUVMuICIiCi0kIFRIRU4KLSQgICAgU0FZICJNQVBfMl9TSE9QVDogIEVycm9yLCBubyBvdXRwdXQgZmlsZSBwcm92aWRlZCIKLSQgICAgZ290byBleGl0X20ycwotJCBFTkRJRgotJCEKLSQgbW9kdWxlMSA9ICJkZWZsYXRlI2RlZmxhdGVFbmQjZGVmbGF0ZUluaXRfI2RlZmxhdGVQYXJhbXMjZGVmbGF0ZVNldERpY3Rpb25hcnkiCi0kIG1vZHVsZTIgPSAiZ3pjbG9zZSNnemVycm9yI2d6Z2V0YyNnemdldHMjZ3pvcGVuI2d6cHJpbnRmI2d6cHV0YyNnenB1dHMjZ3pyZWFkIgotJCBtb2R1bGUzID0gImd6c2VlayNnenRlbGwjaW5mbGF0ZSNpbmZsYXRlRW5kI2luZmxhdGVJbml0XyNpbmZsYXRlU2V0RGljdGlvbmFyeSIKLSQgbW9kdWxlNCA9ICJpbmZsYXRlU3luYyN1bmNvbXByZXNzI3psaWJWZXJzaW9uI2NvbXByZXNzIgotJCBvcGVuL3JlYWQgbWFwICdwMQotJCBpZiBheHAgLm9yLiBpYTY0Ci0kIHRoZW4KLSQgICAgIG9wZW4vd3JpdGUgYW9wdCBhLm9wdAotJCAgICAgb3Blbi93cml0ZSBib3B0IGIub3B0Ci0kICAgICB3cml0ZSBhb3B0ICIgQ0FTRV9TRU5TSVRJVkU9WUVTIgotJCAgICAgd3JpdGUgYm9wdCAiU1lNQk9MX1ZFQ1RPUj0gKC0iCi0kICAgICBtb2Rfc3ltX251bSA9IDEKLSQgTU9EX1NZTV9MT09QOgotJCAgICAgaWYgZiR0eXBlKG1vZHVsZSdtb2Rfc3ltX251bScpIC5uZXMuICIiCi0kICAgICB0aGVuCi0kICAgICAgICAgbW9kX2luID0gMAotJCBNT0RfU1lNX0lOOgotJCAgICAgICAgIHNoYXJlZF9wcm9jID0gZiRlbGVtZW50KG1vZF9pbiwgIiMiLCBtb2R1bGUnbW9kX3N5bV9udW0nKQotJCAgICAgICAgIGlmIHNoYXJlZF9wcm9jIC5uZXMuICIjIgotJCAgICAgICAgIHRoZW4KLSQgICAgICAgICAgICAgd3JpdGUgYW9wdCBmJGZhbygiIHN5bWJvbF92ZWN0b3I9KCFBUy8hQVM9UFJPQ0VEVVJFKSIsLQotICAgICAgICAJCSAgICAgICBmJGVkaXQoc2hhcmVkX3Byb2MsInVwY2FzZSIpLHNoYXJlZF9wcm9jKQotJCAgICAgICAgICAgICB3cml0ZSBib3B0IGYkZmFvKCIhQVM9UFJPQ0VEVVJFLC0iLHNoYXJlZF9wcm9jKQotJCAgICAgICAgICAgICBtb2RfaW4gPSBtb2RfaW4gKyAxCi0kICAgICAgICAgICAgIGdvdG8gbW9kX3N5bV9pbgotJCAgICAgICAgIGVuZGlmCi0kICAgICAgICAgbW9kX3N5bV9udW0gPSBtb2Rfc3ltX251bSArIDEKLSQgICAgICAgICBnb3RvIG1vZF9zeW1fbG9vcAotJCAgICAgZW5kaWYKLSRNQVBfTE9PUDoKLSQgICAgIHJlYWQvZW5kPW1hcF9lbmQgbWFwIGxpbmUKLSQgICAgIGlmIChmJGxvY2F0ZSgieyIsbGluZSkubHQuIGYkbGVuZ3RoKGxpbmUpKSAub3IuIC0KLSAgICAgICAgIChmJGxvY2F0ZSgiZ2xvYmFsOiIsIGxpbmUpIC5sdC4gZiRsZW5ndGgobGluZSkpCi0kICAgICB0aGVuCi0kICAgICAgICAgcHJvYyA9IHRydWUKLSQgICAgICAgICBnb3RvIG1hcF9sb29wCi0kICAgICBlbmRpZgotJCAgICAgaWYgZiRsb2NhdGUoIn0iLGxpbmUpLmx0LiBmJGxlbmd0aChsaW5lKSB0aGVuIHByb2MgPSBmYWxzZQotJCAgICAgaWYgZiRsb2NhdGUoImxvY2FsOiIsIGxpbmUpIC5sdC4gZiRsZW5ndGgobGluZSkgdGhlbiBwcm9jID0gZmFsc2UKLSQgICAgIGlmIHByb2MKLSQgICAgIHRoZW4KLSQgICAgICAgICBzaGFyZWRfcHJvYyA9IGYkZWRpdChsaW5lLCJjb2xsYXBzZSIpCi0kICAgICAgICAgY2hvcF9zZW1pID0gZiRsb2NhdGUoIjsiLCBzaGFyZWRfcHJvYykKLSQgICAgICAgICBpZiBjaG9wX3NlbWkgLmx0LiBmJGxlbmd0aChzaGFyZWRfcHJvYykgdGhlbiAtCi0gICAgICAgICAgICAgIHNoYXJlZF9wcm9jID0gZiRleHRyYWN0KDAsIGNob3Bfc2VtaSwgc2hhcmVkX3Byb2MpCi0kICAgICAgICAgd3JpdGUgYW9wdCBmJGZhbygiIHN5bWJvbF92ZWN0b3I9KCFBUy8hQVM9UFJPQ0VEVVJFKSIsLQotICAgICAgICAJCQkgZiRlZGl0KHNoYXJlZF9wcm9jLCJ1cGNhc2UiKSxzaGFyZWRfcHJvYykKLSQgICAgICAgICB3cml0ZSBib3B0IGYkZmFvKCIhQVM9UFJPQ0VEVVJFLC0iLHNoYXJlZF9wcm9jKQotJCAgICAgZW5kaWYKLSQgICAgIGdvdG8gbWFwX2xvb3AKLSRNQVBfRU5EOgotJCAgICAgY2xvc2Uvbm9sb2cgYW9wdAotJCAgICAgY2xvc2Uvbm9sb2cgYm9wdAotJCAgICAgb3Blbi9hcHBlbmQgbGlib3B0ICdwMicKLSQgICAgIG9wZW4vcmVhZCBhb3B0IGEub3B0Ci0kICAgICBvcGVuL3JlYWQgYm9wdCBiLm9wdAotJEFMT09QOgotJCAgICAgcmVhZC9lbmQ9YWxvb3BfZW5kIGFvcHQgbGluZQotJCAgICAgd3JpdGUgbGlib3B0IGxpbmUKLSQgICAgIGdvdG8gYWxvb3AKLSRBTE9PUF9FTkQ6Ci0kICAgICBjbG9zZS9ub2xvZyBhb3B0Ci0kICAgICBzdiA9ICIiCi0kQkxPT1A6Ci0kICAgICByZWFkL2VuZD1ibG9vcF9lbmQgYm9wdCBzdm4KLSQgICAgIGlmIChzdm4ubmVzLiIiKQotJCAgICAgdGhlbgotJCAgICAgICAgaWYgKHN2Lm5lcy4iIikgdGhlbiB3cml0ZSBsaWJvcHQgc3YKLSQgICAgICAgIHN2ID0gc3ZuCi0kICAgICBlbmRpZgotJCAgICAgZ290byBibG9vcAotJEJMT09QX0VORDoKLSQgICAgIHdyaXRlIGxpYm9wdCBmJGV4dHJhY3QoMCxmJGxlbmd0aChzdiktMixzdiksICItIgotJCAgICAgd3JpdGUgbGlib3B0ICIpIgotJCAgICAgY2xvc2Uvbm9sb2cgYm9wdAotJCAgICAgZGVsZXRlL25vbG9nL25vY29uZiBhLm9wdDsqLGIub3B0OyoKLSQgZWxzZQotJCAgICAgaWYgdmF4Ci0kICAgICB0aGVuCi0kICAgICBvcGVuL2FwcGVuZCBsaWJvcHQgJ3AyJwotJCAgICAgbW9kX3N5bV9udW0gPSAxCi0kIFZNT0RfU1lNX0xPT1A6Ci0kICAgICBpZiBmJHR5cGUobW9kdWxlJ21vZF9zeW1fbnVtJykgLm5lcy4gIiIKLSQgICAgIHRoZW4KLSQgICAgICAgICBtb2RfaW4gPSAwCi0kIFZNT0RfU1lNX0lOOgotJCAgICAgICAgIHNoYXJlZF9wcm9jID0gZiRlbGVtZW50KG1vZF9pbiwgIiMiLCBtb2R1bGUnbW9kX3N5bV9udW0nKQotJCAgICAgICAgIGlmIHNoYXJlZF9wcm9jIC5uZXMuICIjIgotJCAgICAgICAgIHRoZW4KLSQgICAgIAkgICAgICB3cml0ZSBsaWJvcHQgZiRmYW8oIlVOSVZFUlNBTD0hQVMiLC0KLSAgICAgIAkgIAkJCSAgICAgZiRlZGl0KHNoYXJlZF9wcm9jLCJ1cGNhc2UiKSkKLSQgICAgICAgICAgICAgbW9kX2luID0gbW9kX2luICsgMQotJCAgICAgICAgICAgICBnb3RvIHZtb2Rfc3ltX2luCi0kICAgICAgICAgZW5kaWYKLSQgICAgICAgICBtb2Rfc3ltX251bSA9IG1vZF9zeW1fbnVtICsgMQotJCAgICAgICAgIGdvdG8gdm1vZF9zeW1fbG9vcAotJCAgICAgZW5kaWYKLSRWTUFQX0xPT1A6Ci0kICAgICAJICByZWFkL2VuZD12bWFwX2VuZCBtYXAgbGluZQotJCAgICAgCSAgaWYgKGYkbG9jYXRlKCJ7IixsaW5lKS5sdC4gZiRsZW5ndGgobGluZSkpIC5vci4gLQotICAgCSAgICAgIChmJGxvY2F0ZSgiZ2xvYmFsOiIsIGxpbmUpIC5sdC4gZiRsZW5ndGgobGluZSkpCi0kICAgICAJICB0aGVuCi0kICAgICAJICAgICAgcHJvYyA9IHRydWUKLSQgICAgIAkgICAgICBnb3RvIHZtYXBfbG9vcAotJCAgICAgCSAgZW5kaWYKLSQgICAgIAkgIGlmIGYkbG9jYXRlKCJ9IixsaW5lKS5sdC4gZiRsZW5ndGgobGluZSkgdGhlbiBwcm9jID0gZmFsc2UKLSQgICAgIAkgIGlmIGYkbG9jYXRlKCJsb2NhbDoiLCBsaW5lKSAubHQuIGYkbGVuZ3RoKGxpbmUpIHRoZW4gcHJvYyA9IGZhbHNlCi0kICAgICAJICBpZiBwcm9jCi0kICAgICAJICB0aGVuCi0kICAgICAJICAgICAgc2hhcmVkX3Byb2MgPSBmJGVkaXQobGluZSwiY29sbGFwc2UiKQotJCAgICAgCSAgICAgIGNob3Bfc2VtaSA9IGYkbG9jYXRlKCI7Iiwgc2hhcmVkX3Byb2MpCi0kICAgICAJICAgICAgaWYgY2hvcF9zZW1pIC5sdC4gZiRsZW5ndGgoc2hhcmVkX3Byb2MpIHRoZW4gLQotICAgICAgCSAgCSAgc2hhcmVkX3Byb2MgPSBmJGV4dHJhY3QoMCwgY2hvcF9zZW1pLCBzaGFyZWRfcHJvYykKLSQgICAgIAkgICAgICB3cml0ZSBsaWJvcHQgZiRmYW8oIlVOSVZFUlNBTD0hQVMiLC0KLSAgICAgIAkgIAkJCSAgICAgZiRlZGl0KHNoYXJlZF9wcm9jLCJ1cGNhc2UiKSkKLSQgICAgIAkgIGVuZGlmCi0kICAgICAJICBnb3RvIHZtYXBfbG9vcAotJFZNQVBfRU5EOgotJCAgICAgZWxzZQotJCAgICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIlVua25vd24gQXJjaGl0ZWN0dXJlIChOb3QgVkFYLCBBWFAsIG9yIElBNjQpIgotJCAgICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIk5vIG9wdGlvbnMgZmlsZSBjcmVhdGVkIgotJCAgICAgZW5kaWYKLSQgZW5kaWYKLSQgRVhJVF9NMlM6Ci0kIGNsb3NlL25vbG9nIG1hcAotJCBjbG9zZS9ub2xvZyBsaWJvcHQKLSQgZW5kc3Vicm91dGluZQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvbXNkb3MvTWFrZWZpbGUuYm9yIGIvc3JjL3psaWIvbXNkb3MvTWFrZWZpbGUuYm9yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDEyYTJjLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL21zZG9zL01ha2VmaWxlLmJvcgorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciB6bGliCi0jIEJvcmxhbmQgQysrCi0jIExhc3QgdXBkYXRlZDogMTUtTWFyLTIwMDMKLQotIyBUbyB1c2UsIGRvICJtYWtlIC1mbWFrZWZpbGUuYm9yIgotIyBUbyBjb21waWxlIGluIHNtYWxsIG1vZGVsLCBzZXQgYmVsb3c6IE1PREVMPXMKLQotIyBXQVJOSU5HOiB0aGUgc21hbGwgbW9kZWwgaXMgc3VwcG9ydGVkIGJ1dCBvbmx5IGZvciBzbWFsbCB2YWx1ZXMgb2YKLSMgTUFYX1dCSVRTIGFuZCBNQVhfTUVNX0xFVkVMLiBGb3IgZXhhbXBsZToKLSMgICAgLURNQVhfV0JJVFM9MTEgLURERUZfV0JJVFM9MTEgLURNQVhfTUVNX0xFVkVMPTMKLSMgSWYgeW91IHdpc2ggdG8gcmVkdWNlIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIChkZWZhdWx0IDI1NksgZm9yIGJpZwotIyBvYmplY3RzIHBsdXMgYSBmZXcgSyksIHlvdSBjYW4gYWRkIHRvIHRoZSBMT0MgbWFjcm8gYmVsb3c6Ci0jICAgLURNQVhfTUVNX0xFVkVMPTcgLURNQVhfV0JJVFM9MTQKLSMgU2VlIHpjb25mLmggZm9yIGRldGFpbHMgYWJvdXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMuCi0KLSMgLS0tLS0tLS0tLS0tIFR1cmJvIEMrKywgQm9ybGFuZCBDKysgLS0tLS0tLS0tLS0tCi0KLSMgICAgT3B0aW9uYWwgbm9uc3RhbmRhcmQgcHJlcHJvY2Vzc29yIGZsYWdzIChlLmcuIC1ETUFYX01FTV9MRVZFTD03KQotIyAgICBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGVudmlyb25tZW50IHZpYSAic2V0IExPQ0FMX1pMSUI9LURGT08iIG9yIGFkZGVkCi0jICAgIHRvIHRoZSBkZWNsYXJhdGlvbiBvZiBMT0MgaGVyZToKLUxPQyA9ICQoTE9DQUxfWkxJQikKLQotIyB0eXBlIGZvciBDUFUgcmVxdWlyZWQ6IDA6IDgwODYsIDE6IDgwMTg2LCAyOiA4MDI4NiwgMzogODAzODYsIGV0Yy4KLUNQVV9UWVAgPSAwCi0KLSMgbWVtb3J5IG1vZGVsOiBvbmUgb2YgcywgbSwgYywgbCAoc21hbGwsIG1lZGl1bSwgY29tcGFjdCwgbGFyZ2UpCi1NT0RFTD1sCi0KLSMgcmVwbGFjZSBiY2Mgd2l0aCB0Y2MgZm9yIFR1cmJvIEMrKyAxLjAsIHdpdGggYmNjMzIgZm9yIHRoZSAzMiBiaXQgdmVyc2lvbgotQ0M9YmNjCi1MRD1iY2MKLUFSPXRsaWIKLQotIyBjb21waWxlciBmbGFncwotIyByZXBsYWNlICItTzIiIGJ5ICItTyAtRyAtYSAtZCIgZm9yIFR1cmJvIEMrKyAxLjAKLUNGTEFHUz0tTzIgLVogLW0kKE1PREVMKSAkKExPQykKLQotTERGTEFHUz0tbSQoTU9ERUwpIC1mLQotCi0KLSMgdmFyaWFibGVzCi1aTElCX0xJQiA9IHpsaWJfJChNT0RFTCkubGliCi0KLU9CSjEgPSBhZGxlcjMyLm9iaiBjb21wcmVzcy5vYmogY3JjMzIub2JqIGRlZmxhdGUub2JqIGd6Y2xvc2Uub2JqIGd6bGliLm9iaiBnenJlYWQub2JqCi1PQkoyID0gZ3p3cml0ZS5vYmogaW5mYmFjay5vYmogaW5mZmFzdC5vYmogaW5mbGF0ZS5vYmogaW5mdHJlZXMub2JqIHRyZWVzLm9iaiB1bmNvbXByLm9iaiB6dXRpbC5vYmoKLU9CSlAxID0gK2FkbGVyMzIub2JqK2NvbXByZXNzLm9iaitjcmMzMi5vYmorZGVmbGF0ZS5vYmorZ3pjbG9zZS5vYmorZ3psaWIub2JqK2d6cmVhZC5vYmoKLU9CSlAyID0gK2d6d3JpdGUub2JqK2luZmJhY2sub2JqK2luZmZhc3Qub2JqK2luZmxhdGUub2JqK2luZnRyZWVzLm9iait0cmVlcy5vYmordW5jb21wci5vYmorenV0aWwub2JqCi0KLQotIyB0YXJnZXRzCi1hbGw6ICQoWkxJQl9MSUIpIGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQotCi0uYy5vYmo6Ci0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotYWRsZXIzMi5vYmo6IGFkbGVyMzIuYyB6bGliLmggemNvbmYuaAotCi1jb21wcmVzcy5vYmo6IGNvbXByZXNzLmMgemxpYi5oIHpjb25mLmgKLQotY3JjMzIub2JqOiBjcmMzMi5jIHpsaWIuaCB6Y29uZi5oIGNyYzMyLmgKLQotZGVmbGF0ZS5vYmo6IGRlZmxhdGUuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotCi1nemNsb3NlLm9iajogZ3pjbG9zZS5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCi0KLWd6bGliLm9iajogZ3psaWIuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAotCi1nenJlYWQub2JqOiBnenJlYWQuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAotCi1nendyaXRlLm9iajogZ3p3cml0ZS5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCi0KLWluZmJhY2sub2JqOiBpbmZiYWNrLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCi0gaW5mZmFzdC5oIGluZmZpeGVkLmgKLQotaW5mZmFzdC5vYmo6IGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKLSBpbmZmYXN0LmgKLQotaW5mbGF0ZS5vYmo6IGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKLSBpbmZmYXN0LmggaW5mZml4ZWQuaAotCi1pbmZ0cmVlcy5vYmo6IGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCi0KLXRyZWVzLm9iajogdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGRlZmxhdGUuaCB0cmVlcy5oCi0KLXVuY29tcHIub2JqOiB1bmNvbXByLmMgemxpYi5oIHpjb25mLmgKLQotenV0aWwub2JqOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLQotZXhhbXBsZS5vYmo6IHRlc3QvZXhhbXBsZS5jIHpsaWIuaCB6Y29uZi5oCi0KLW1pbmlnemlwLm9iajogdGVzdC9taW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCi0KLQotIyB0aGUgY29tbWFuZCBsaW5lIGlzIGN1dCB0byBmaXQgaW4gdGhlIE1TLURPUyAxMjggYnl0ZSBsaW1pdDoKLSQoWkxJQl9MSUIpOiAkKE9CSjEpICQoT0JKMikKLQktZGVsICQoWkxJQl9MSUIpCi0JJChBUikgJChaTElCX0xJQikgJChPQkpQMSkKLQkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlAyKQotCi1leGFtcGxlLmV4ZTogZXhhbXBsZS5vYmogJChaTElCX0xJQikKLQkkKExEKSAkKExERkxBR1MpIGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCi0KLW1pbmlnemlwLmV4ZTogbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCi0JJChMRCkgJChMREZMQUdTKSBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKLQotdGVzdDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCi0JZXhhbXBsZQotCWVjaG8gaGVsbG8gd29ybGQgfCBtaW5pZ3ppcCB8IG1pbmlnemlwIC1kCi0KLWNsZWFuOgotCS1kZWwgKi5vYmoKLQktZGVsICoubGliCi0JLWRlbCAqLmV4ZQotCS1kZWwgemxpYl8qLmJhawotCS1kZWwgZm9vLmd6CmRpZmYgLS1naXQgYS9zcmMvemxpYi9tc2Rvcy9NYWtlZmlsZS5kajIgYi9zcmMvemxpYi9tc2Rvcy9NYWtlZmlsZS5kajIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YjAzOTUuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvbXNkb3MvTWFrZWZpbGUuZGoyCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHpsaWIuICBNb2RpZmllZCBmb3IgZGpncHAgdjIuMCBieSBGLiBKLiBEb25haG9lLCAzLzE1Lzk2LgotIyBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBKZWFuLWxvdXAgR2FpbGx5LgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0KLSMgVG8gY29tcGlsZSwgb3IgdG8gY29tcGlsZSBhbmQgdGVzdCwgdHlwZToKLSMKLSMgICBtYWtlIC1mbWFrZWZpbGUuZGoyOyAgbWFrZSB0ZXN0IC1mbWFrZWZpbGUuZGoyCi0jCi0jIFRvIGluc3RhbGwgbGliei5hLCB6Y29uZi5oIGFuZCB6bGliLmggaW4gdGhlIGRqZ3BwIGRpcmVjdG9yaWVzLCB0eXBlOgotIwotIyAgICBtYWtlIGluc3RhbGwgLWZtYWtlZmlsZS5kajIKLSMKLSMgYWZ0ZXIgZmlyc3QgZGVmaW5pbmcgTElCUkFSWV9QQVRIIGFuZCBJTkNMVURFX1BBVEggaW4gZGpncHAuZW52IGFzCi0jIGluIHRoZSBzYW1wbGUgYmVsb3cgaWYgdGhlIHBhdHRlcm4gb2YgdGhlIERKR1BQIGRpc3RyaWJ1dGlvbiBpcyB0bwotIyBiZSBmb2xsb3dlZC4gIFJlbWVtYmVyIHRoYXQsIHdoaWxlIDxzcD4nZXMgYXJvdW5kIDw9PiBhcmUgaWdub3JlZCBpbgotIyBtYWtlZmlsZXMsIHRoZXkgYXJlICpub3QqIGluIGJhdGNoIGZpbGVzIG9yIGluIGRqZ3BwLmVudi4KLSMgLSAtIC0gLSAtCi0jIFttYWtlXQotIyBJTkNMVURFX1BBVEg9JVw+O0lOQ0xVREVfUEFUSCUlXERKRElSJVxpbmNsdWRlCi0jIExJQlJBUllfUEFUSD0lXD47TElCUkFSWV9QQVRIJSVcREpESVIlXGxpYgotIyBCVVRUPS1tNDg2Ci0jIC0gLSAtIC0gLQotIyBBbHRlcm5hdGVseSwgdGhlc2UgdmFyaWFibGVzIG1heSBiZSBkZWZpbmVkIGJlbG93LCBvdmVycmlkaW5nIHRoZSB2YWx1ZXMKLSMgaW4gZGpncHAuZW52LCBhcwotIyBJTkNMVURFX1BBVEg9YzpcdXNyXGluY2x1ZGUKLSMgTElCUkFSWV9QQVRIPWM6XHVzclxsaWIKLQotQ0M9Z2NjCi0KLSNDRkxBR1M9LU1NRCAtTwotI0NGTEFHUz0tTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NwotI0NGTEFHUz0tTU1EIC1nIC1EREVCVUcKLUNGTEFHUz0tTU1EIC1PMyAkKEJVVFQpIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKLSAgICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzCi0KLSMgSWYgY3AuZXhlIGlzIGF2YWlsYWJsZSwgcmVwbGFjZSAiY29weSAvWSIgd2l0aCAiY3AgLWZwIiAuCi1DUD1jb3B5IC9ZCi0jIElmIGdudSBpbnN0YWxsLmV4ZSBpcyBhdmFpbGFibGUsIHJlcGxhY2UgJChDUCkgd2l0aCBnaW5zdGFsbC4KLUlOU1RBTEw9JChDUCkKLSMgVGhlIGRlZmF1bHQgdmFsdWUgb2YgUk0gaXMgInJtIC1mLiIgIElmICJybS5leGUiIGlzIGZvdW5kLCBjb21tZW50IG91dDoKLVJNPWRlbAotTERMSUJTPS1MLiAtbHoKLUxEPSQoQ0MpIC1zIC1vCi1MRFNIQVJFRD0kKENDKQotCi1JTkNMPXpsaWIuaCB6Y29uZi5oCi1MSUJTPWxpYnouYQotCi1BUj1hciByY3MKLQotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4ID0gJChwcmVmaXgpCi0KLU9CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6Y2xvc2UubyBnemxpYi5vIGd6cmVhZC5vIGd6d3JpdGUubyBcCi0gICAgICAgdW5jb21wci5vIGRlZmxhdGUubyB0cmVlcy5vIHp1dGlsLm8gaW5mbGF0ZS5vIGluZmJhY2subyBpbmZ0cmVlcy5vIGluZmZhc3QubwotCi1PQkpBID0KLSMgdG8gdXNlIHRoZSBhc20gY29kZTogbWFrZSBPQkpBPW1hdGNoLm8KLQotVEVTVF9PQkpTID0gZXhhbXBsZS5vIG1pbmlnemlwLm8KLQotYWxsOiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKLQotY2hlY2s6IHRlc3QKLXRlc3Q6IGFsbAotCS4vZXhhbXBsZQotCWVjaG8gaGVsbG8gd29ybGQgfCAuXG1pbmlnemlwIHwgLlxtaW5pZ3ppcCAtZAotCi0lLm8gOiAlLmMKLQkkKENDKSAkKENGTEFHUykgLWMgJDwgLW8gJEAKLQotbGliei5hOiAkKE9CSlMpICQoT0JKQSkKLQkkKEFSKSAkQCAkKE9CSlMpICQoT0JKQSkKLQotJS5leGUgOiAlLm8gJChMSUJTKQotCSQoTEQpICRAICQ8ICQoTERMSUJTKQotCi0jIElOQ0xVREVfUEFUSCBhbmQgTElCUkFSWV9QQVRIIHdlcmUgc2V0IGZvciBbbWFrZV0gaW4gZGpncHAuZW52IC4KLQotLlBIT05ZIDogdW5pbnN0YWxsIGNsZWFuCi0KLWluc3RhbGw6ICQoSU5DTCkgJChMSUJTKQotCS1AaWYgbm90IGV4aXN0ICQoSU5DTFVERV9QQVRIKVxudWwgbWtkaXIgJChJTkNMVURFX1BBVEgpCi0JLUBpZiBub3QgZXhpc3QgJChMSUJSQVJZX1BBVEgpXG51bCBta2RpciAkKExJQlJBUllfUEFUSCkKLQkkKElOU1RBTEwpIHpsaWIuaCAkKElOQ0xVREVfUEFUSCkKLQkkKElOU1RBTEwpIHpjb25mLmggJChJTkNMVURFX1BBVEgpCi0JJChJTlNUQUxMKSBsaWJ6LmEgJChMSUJSQVJZX1BBVEgpCi0KLXVuaW5zdGFsbDoKLQkkKFJNKSAkKElOQ0xVREVfUEFUSClcemxpYi5oCi0JJChSTSkgJChJTkNMVURFX1BBVEgpXHpjb25mLmgKLQkkKFJNKSAkKExJQlJBUllfUEFUSClcbGliei5hCi0KLWNsZWFuOgotCSQoUk0pICouZAotCSQoUk0pICoubwotCSQoUk0pICouZXhlCi0JJChSTSkgbGliei5hCi0JJChSTSkgZm9vLmd6Ci0KLURFUFMgOj0gJCh3aWxkY2FyZCAqLmQpCi1pZm5lcSAoJChERVBTKSwpCi1pbmNsdWRlICQoREVQUykKLWVuZGlmCmRpZmYgLS1naXQgYS9zcmMvemxpYi9tc2Rvcy9NYWtlZmlsZS5lbXggYi9zcmMvemxpYi9tc2Rvcy9NYWtlZmlsZS5lbXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMWI1N2EuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvbXNkb3MvTWFrZWZpbGUuZW14CisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgemxpYi4gIE1vZGlmaWVkIGZvciBlbXggMC45YyBieSBDaHIuIFNwaWVsZXIsIDYvMTcvOTguCi0jIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEplYW4tbG91cCBHYWlsbHkuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLQotIyBUbyBjb21waWxlLCBvciB0byBjb21waWxlIGFuZCB0ZXN0LCB0eXBlOgotIwotIyAgIG1ha2UgLWZtYWtlZmlsZS5lbXg7ICBtYWtlIHRlc3QgLWZtYWtlZmlsZS5lbXgKLSMKLQotQ0M9Z2NjCi0KLSNDRkxBR1M9LU1NRCAtTwotI0NGTEFHUz0tTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NwotI0NGTEFHUz0tTU1EIC1nIC1EREVCVUcKLUNGTEFHUz0tTU1EIC1PMyAkKEJVVFQpIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKLSAgICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzCi0KLSMgSWYgY3AuZXhlIGlzIGF2YWlsYWJsZSwgcmVwbGFjZSAiY29weSAvWSIgd2l0aCAiY3AgLWZwIiAuCi1DUD1jb3B5IC9ZCi0jIElmIGdudSBpbnN0YWxsLmV4ZSBpcyBhdmFpbGFibGUsIHJlcGxhY2UgJChDUCkgd2l0aCBnaW5zdGFsbC4KLUlOU1RBTEw9JChDUCkKLSMgVGhlIGRlZmF1bHQgdmFsdWUgb2YgUk0gaXMgInJtIC1mLiIgIElmICJybS5leGUiIGlzIGZvdW5kLCBjb21tZW50IG91dDoKLVJNPWRlbAotTERMSUJTPS1MLiAtbHpsaWIKLUxEPSQoQ0MpIC1zIC1vCi1MRFNIQVJFRD0kKENDKQotCi1JTkNMPXpsaWIuaCB6Y29uZi5oCi1MSUJTPXpsaWIuYQotCi1BUj1hciByY3MKLQotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4ID0gJChwcmVmaXgpCi0KLU9CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6Y2xvc2UubyBnemxpYi5vIGd6cmVhZC5vIGd6d3JpdGUubyBcCi0gICAgICAgdW5jb21wci5vIGRlZmxhdGUubyB0cmVlcy5vIHp1dGlsLm8gaW5mbGF0ZS5vIGluZmJhY2subyBpbmZ0cmVlcy5vIGluZmZhc3QubwotCi1URVNUX09CSlMgPSBleGFtcGxlLm8gbWluaWd6aXAubwotCi1hbGw6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQotCi10ZXN0OiBhbGwKLQkuL2V4YW1wbGUKLQllY2hvIGhlbGxvIHdvcmxkIHwgLlxtaW5pZ3ppcCB8IC5cbWluaWd6aXAgLWQKLQotJS5vIDogJS5jCi0JJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACi0KLXpsaWIuYTogJChPQkpTKQotCSQoQVIpICRAICQoT0JKUykKLQotJS5leGUgOiAlLm8gJChMSUJTKQotCSQoTEQpICRAICQ8ICQoTERMSUJTKQotCi0KLS5QSE9OWSA6IGNsZWFuCi0KLWNsZWFuOgotCSQoUk0pICouZAotCSQoUk0pICoubwotCSQoUk0pICouZXhlCi0JJChSTSkgemxpYi5hCi0JJChSTSkgZm9vLmd6Ci0KLURFUFMgOj0gJCh3aWxkY2FyZCAqLmQpCi1pZm5lcSAoJChERVBTKSwpCi1pbmNsdWRlICQoREVQUykKLWVuZGlmCmRpZmYgLS1naXQgYS9zcmMvemxpYi9tc2Rvcy9NYWtlZmlsZS5tc2MgYi9zcmMvemxpYi9tc2Rvcy9NYWtlZmlsZS5tc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlODM3ODYuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvbXNkb3MvTWFrZWZpbGUubXNjCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHpsaWIKLSMgTWljcm9zb2Z0IEMgNS4xIG9yIGxhdGVyCi0jIExhc3QgdXBkYXRlZDogMTktTWFyLTIwMDMKLQotIyBUbyB1c2UsIGRvICJtYWtlIG1ha2VmaWxlLm1zYyIKLSMgVG8gY29tcGlsZSBpbiBzbWFsbCBtb2RlbCwgc2V0IGJlbG93OiBNT0RFTD1TCi0KLSMgSWYgeW91IHdpc2ggdG8gcmVkdWNlIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIChkZWZhdWx0IDI1NksgZm9yIGJpZwotIyBvYmplY3RzIHBsdXMgYSBmZXcgSyksIHlvdSBjYW4gYWRkIHRvIHRoZSBMT0MgbWFjcm8gYmVsb3c6Ci0jICAgLURNQVhfTUVNX0xFVkVMPTcgLURNQVhfV0JJVFM9MTQKLSMgU2VlIHpjb25mLmggZm9yIGRldGFpbHMgYWJvdXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMuCi0KLSMgLS0tLS0tLS0tLS0tLSBNaWNyb3NvZnQgQyA1LjEgYW5kIGxhdGVyIC0tLS0tLS0tLS0tLS0KLQotIyAgICBPcHRpb25hbCBub25zdGFuZGFyZCBwcmVwcm9jZXNzb3IgZmxhZ3MgKGUuZy4gLURNQVhfTUVNX0xFVkVMPTcpCi0jICAgIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQgdmlhICJzZXQgTE9DQUxfWkxJQj0tREZPTyIgb3IgYWRkZWQKLSMgICAgdG8gdGhlIGRlY2xhcmF0aW9uIG9mIExPQyBoZXJlOgotTE9DID0gJChMT0NBTF9aTElCKQotCi0jIFR5cGUgZm9yIENQVSByZXF1aXJlZDogMDogODA4NiwgMTogODAxODYsIDI6IDgwMjg2LCAzOiA4MDM4NiwgZXRjLgotQ1BVX1RZUCA9IDAKLQotIyBNZW1vcnkgbW9kZWw6IG9uZSBvZiBTLCBNLCBDLCBMIChzbWFsbCwgbWVkaXVtLCBjb21wYWN0LCBsYXJnZSkKLU1PREVMPUwKLQotQ0M9Y2wKLUNGTEFHUz0tbm9sb2dvIC1BJChNT0RFTCkgLUckKENQVV9UWVApIC1XMyAtT2FpdCAtR3MgJChMT0MpCi0jLU94IGdlbmVyYXRlcyBiYWQgY29kZSB3aXRoIE1TQyA1LjEKLUxJQl9DRkxBR1M9LVpsICQoQ0ZMQUdTKQotCi1MRD1saW5rCi1MREZMQUdTPS9ub2kvZS9zdDoweDE1MDAvbm9lL2ZhcmNhbGwvcGFja2NvZGUKLSMgIi9mYXJjYWxsL3BhY2tjb2RlIiBhcmUgb25seSB1c2VmdWwgZm9yIGBsYXJnZSBjb2RlJyBtZW1vcnkgbW9kZWxzCi0jIGJ1dCBzaG91bGQgYmUgYSAibm8tb3AiIGZvciBzbWFsbCBjb2RlIG1vZGVscy4KLQotCi0jIHZhcmlhYmxlcwotWkxJQl9MSUIgPSB6bGliXyQoTU9ERUwpLmxpYgotCi1PQkoxID0gYWRsZXIzMi5vYmogY29tcHJlc3Mub2JqIGNyYzMyLm9iaiBkZWZsYXRlLm9iaiBnemNsb3NlLm9iaiBnemxpYi5vYmogZ3pyZWFkLm9iagotT0JKMiA9IGd6d3JpdGUub2JqIGluZmJhY2sub2JqIGluZmZhc3Qub2JqIGluZmxhdGUub2JqIGluZnRyZWVzLm9iaiB0cmVlcy5vYmogdW5jb21wci5vYmogenV0aWwub2JqCi0KLQotIyB0YXJnZXRzCi1hbGw6ICAkKFpMSUJfTElCKSBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKLQotLmMub2JqOgotCSQoQ0MpIC1jICQoTElCX0NGTEFHUykgJCouYwotCi1hZGxlcjMyLm9iajogYWRsZXIzMi5jIHpsaWIuaCB6Y29uZi5oCi0KLWNvbXByZXNzLm9iajogY29tcHJlc3MuYyB6bGliLmggemNvbmYuaAotCi1jcmMzMi5vYmo6IGNyYzMyLmMgemxpYi5oIHpjb25mLmggY3JjMzIuaAotCi1kZWZsYXRlLm9iajogZGVmbGF0ZS5jIGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0KLWd6Y2xvc2Uub2JqOiBnemNsb3NlLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLQotZ3psaWIub2JqOiBnemxpYi5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCi0KLWd6cmVhZC5vYmo6IGd6cmVhZC5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCi0KLWd6d3JpdGUub2JqOiBnendyaXRlLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLQotaW5mYmFjay5vYmo6IGluZmJhY2suYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKLSBpbmZmYXN0LmggaW5mZml4ZWQuaAotCi1pbmZmYXN0Lm9iajogaW5mZmFzdC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAotIGluZmZhc3QuaAotCi1pbmZsYXRlLm9iajogaW5mbGF0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAotIGluZmZhc3QuaCBpbmZmaXhlZC5oCi0KLWluZnRyZWVzLm9iajogaW5mdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKLQotdHJlZXMub2JqOiB0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggZGVmbGF0ZS5oIHRyZWVzLmgKLQotdW5jb21wci5vYmo6IHVuY29tcHIuYyB6bGliLmggemNvbmYuaAotCi16dXRpbC5vYmo6IHp1dGlsLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAotCi1leGFtcGxlLm9iajogdGVzdC9leGFtcGxlLmMgemxpYi5oIHpjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1taW5pZ3ppcC5vYmo6IHRlc3QvbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLQotIyB0aGUgY29tbWFuZCBsaW5lIGlzIGN1dCB0byBmaXQgaW4gdGhlIE1TLURPUyAxMjggYnl0ZSBsaW1pdDoKLSQoWkxJQl9MSUIpOiAkKE9CSjEpICQoT0JKMikKLQlpZiBleGlzdCAkKFpMSUJfTElCKSBkZWwgJChaTElCX0xJQikKLQlsaWIgJChaTElCX0xJQikgJChPQkoxKTsKLQlsaWIgJChaTElCX0xJQikgJChPQkoyKTsKLQotZXhhbXBsZS5leGU6IGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCi0JJChMRCkgJChMREZMQUdTKSBleGFtcGxlLm9iaiwsLCQoWkxJQl9MSUIpOwotCi1taW5pZ3ppcC5leGU6IG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQotCSQoTEQpICQoTERGTEFHUykgbWluaWd6aXAub2JqLCwsJChaTElCX0xJQik7Ci0KLXRlc3Q6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQotCWV4YW1wbGUKLQllY2hvIGhlbGxvIHdvcmxkIHwgbWluaWd6aXAgfCBtaW5pZ3ppcCAtZAotCi1jbGVhbjoKLQktZGVsICoub2JqCi0JLWRlbCAqLmxpYgotCS1kZWwgKi5leGUKLQktZGVsICoubWFwCi0JLWRlbCB6bGliXyouYmFrCi0JLWRlbCBmb28uZ3oKZGlmZiAtLWdpdCBhL3NyYy96bGliL21zZG9zL01ha2VmaWxlLnRjIGIvc3JjL3psaWIvbXNkb3MvTWFrZWZpbGUudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZWM4MmEuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvbXNkb3MvTWFrZWZpbGUudGMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgemxpYgotIyBUdXJibyBDIDIuMDEsIFR1cmJvIEMrKyAxLjAxCi0jIExhc3QgdXBkYXRlZDogMTUtTWFyLTIwMDMKLQotIyBUbyB1c2UsIGRvICJtYWtlIC1mbWFrZWZpbGUudGMiCi0jIFRvIGNvbXBpbGUgaW4gc21hbGwgbW9kZWwsIHNldCBiZWxvdzogTU9ERUw9cwotCi0jIFdBUk5JTkc6IHRoZSBzbWFsbCBtb2RlbCBpcyBzdXBwb3J0ZWQgYnV0IG9ubHkgZm9yIHNtYWxsIHZhbHVlcyBvZgotIyBNQVhfV0JJVFMgYW5kIE1BWF9NRU1fTEVWRUwuIEZvciBleGFtcGxlOgotIyAgICAtRE1BWF9XQklUUz0xMSAtRE1BWF9NRU1fTEVWRUw9MwotIyBJZiB5b3Ugd2lzaCB0byByZWR1Y2UgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKGRlZmF1bHQgMjU2SyBmb3IgYmlnCi0jIG9iamVjdHMgcGx1cyBhIGZldyBLKSwgeW91IGNhbiBhZGQgdG8gQ0ZMQUdTIGJlbG93OgotIyAgIC1ETUFYX01FTV9MRVZFTD03IC1ETUFYX1dCSVRTPTE0Ci0jIFNlZSB6Y29uZi5oIGZvciBkZXRhaWxzIGFib3V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzLgotCi0jIC0tLS0tLS0tLS0tLSBUdXJibyBDIDIuMDEsIFR1cmJvIEMrKyAxLjAxIC0tLS0tLS0tLS0tLQotTU9ERUw9bAotQ0M9dGNjCi1MRD10Y2MKLUFSPXRsaWIKLSMgQ0ZMQUdTPS1PMiAtRyAtWiAtbSQoTU9ERUwpIC1ETUFYX1dCSVRTPTExIC1ETUFYX01FTV9MRVZFTD0zCi1DRkxBR1M9LU8yIC1HIC1aIC1tJChNT0RFTCkKLUxERkxBR1M9LW0kKE1PREVMKSAtZi0KLQotCi0jIHZhcmlhYmxlcwotWkxJQl9MSUIgPSB6bGliXyQoTU9ERUwpLmxpYgotCi1PQkoxID0gYWRsZXIzMi5vYmogY29tcHJlc3Mub2JqIGNyYzMyLm9iaiBkZWZsYXRlLm9iaiBnemNsb3NlLm9iaiBnemxpYi5vYmogZ3pyZWFkLm9iagotT0JKMiA9IGd6d3JpdGUub2JqIGluZmJhY2sub2JqIGluZmZhc3Qub2JqIGluZmxhdGUub2JqIGluZnRyZWVzLm9iaiB0cmVlcy5vYmogdW5jb21wci5vYmogenV0aWwub2JqCi1PQkpQMSA9ICthZGxlcjMyLm9iaitjb21wcmVzcy5vYmorY3JjMzIub2JqK2RlZmxhdGUub2JqK2d6Y2xvc2Uub2JqK2d6bGliLm9iaitnenJlYWQub2JqCi1PQkpQMiA9ICtnendyaXRlLm9iaitpbmZiYWNrLm9iaitpbmZmYXN0Lm9iaitpbmZsYXRlLm9iaitpbmZ0cmVlcy5vYmordHJlZXMub2JqK3VuY29tcHIub2JqK3p1dGlsLm9iagotCi0KLSMgdGFyZ2V0cwotYWxsOiAkKFpMSUJfTElCKSBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKLQotLmMub2JqOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLWFkbGVyMzIub2JqOiBhZGxlcjMyLmMgemxpYi5oIHpjb25mLmgKLQotY29tcHJlc3Mub2JqOiBjb21wcmVzcy5jIHpsaWIuaCB6Y29uZi5oCi0KLWNyYzMyLm9iajogY3JjMzIuYyB6bGliLmggemNvbmYuaCBjcmMzMi5oCi0KLWRlZmxhdGUub2JqOiBkZWZsYXRlLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLQotZ3pjbG9zZS5vYmo6IGd6Y2xvc2UuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAotCi1nemxpYi5vYmo6IGd6bGliLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLQotZ3pyZWFkLm9iajogZ3pyZWFkLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLQotZ3p3cml0ZS5vYmo6IGd6d3JpdGUuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAotCi1pbmZiYWNrLm9iajogaW5mYmFjay5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAotIGluZmZhc3QuaCBpbmZmaXhlZC5oCi0KLWluZmZhc3Qub2JqOiBpbmZmYXN0LmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCi0gaW5mZmFzdC5oCi0KLWluZmxhdGUub2JqOiBpbmZsYXRlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCi0gaW5mZmFzdC5oIGluZmZpeGVkLmgKLQotaW5mdHJlZXMub2JqOiBpbmZ0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAotCi10cmVlcy5vYmo6IHRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBkZWZsYXRlLmggdHJlZXMuaAotCi11bmNvbXByLm9iajogdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oCi0KLXp1dGlsLm9iajogenV0aWwuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0KLWV4YW1wbGUub2JqOiB0ZXN0L2V4YW1wbGUuYyB6bGliLmggemNvbmYuaAotCi1taW5pZ3ppcC5vYmo6IHRlc3QvbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAotCi0KLSMgdGhlIGNvbW1hbmQgbGluZSBpcyBjdXQgdG8gZml0IGluIHRoZSBNUy1ET1MgMTI4IGJ5dGUgbGltaXQ6Ci0kKFpMSUJfTElCKTogJChPQkoxKSAkKE9CSjIpCi0JLWRlbCAkKFpMSUJfTElCKQotCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUDEpCi0JJChBUikgJChaTElCX0xJQikgJChPQkpQMikKLQotZXhhbXBsZS5leGU6IGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCi0JJChMRCkgJChMREZMQUdTKSBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQotCi1taW5pZ3ppcC5leGU6IG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQotCSQoTEQpICQoTERGTEFHUykgbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCi0KLXRlc3Q6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQotCWV4YW1wbGUKLQllY2hvIGhlbGxvIHdvcmxkIHwgbWluaWd6aXAgfCBtaW5pZ3ppcCAtZAotCi1jbGVhbjoKLQktZGVsICoub2JqCi0JLWRlbCAqLmxpYgotCS1kZWwgKi5leGUKLQktZGVsIHpsaWJfKi5iYWsKLQktZGVsIGZvby5negpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvbmludGVuZG9kcy9NYWtlZmlsZSBiL3NyYy96bGliL25pbnRlbmRvZHMvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzM3ZDAuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvbmludGVuZG9kcy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0uU1VGRklYRVM6Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWlmZXEgKCQoc3RyaXAgJChERVZLSVRBUk0pKSwpCi0kKGVycm9yICJQbGVhc2Ugc2V0IERFVktJVEFSTSBpbiB5b3VyIGVudmlyb25tZW50LiBleHBvcnQgREVWS0lUQVJNPTxwYXRoIHRvPmRldmtpdEFSTSIpCi1lbmRpZgotCi1pbmNsdWRlICQoREVWS0lUQVJNKS9kc19ydWxlcwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRBUkdFVCBpcyB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0Ci0jIEJVSUxEIGlzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgb2JqZWN0IGZpbGVzICYgaW50ZXJtZWRpYXRlIGZpbGVzIHdpbGwgYmUgcGxhY2VkCi0jIFNPVVJDRVMgaXMgYSBsaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgc291cmNlIGNvZGUKLSMgREFUQSBpcyBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBkYXRhIGZpbGVzCi0jIElOQ0xVREVTIGlzIGEgbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGhlYWRlciBmaWxlcwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVEFSR0VUCQk6PQkkKHNoZWxsIGJhc2VuYW1lICQoQ1VSRElSKSkKLUJVSUxECQk6PQlidWlsZAotU09VUkNFUwkJOj0JLi4vLi4vCi1EQVRBCQk6PQlkYXRhCi1JTkNMVURFUwk6PQlpbmNsdWRlCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgb3B0aW9ucyBmb3IgY29kZSBnZW5lcmF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BUkNICTo9CS1tdGh1bWIgLW10aHVtYi1pbnRlcndvcmsKLQotQ0ZMQUdTCTo9CS1XYWxsIC1PMlwKLQkJLW1hcmNoPWFybXY1dGUgLW10dW5lPWFybTk0NmUtcyBcCi0JCS1mb21pdC1mcmFtZS1wb2ludGVyIC1mZmFzdC1tYXRoIFwKLQkJJChBUkNIKQotCi1DRkxBR1MJKz0JJChJTkNMVURFKSAtREFSTTkKLUNYWEZMQUdTCTo9ICQoQ0ZMQUdTKSAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zCi0KLUFTRkxBR1MJOj0JJChBUkNIKSAtbWFyY2g9YXJtdjV0ZSAtbXR1bmU9YXJtOTQ2ZS1zCi1MREZMQUdTCT0JLXNwZWNzPWRzX2FybTkuc3BlY3MgLWcgJChBUkNIKSAtV2wsLU1hcCwkKG5vdGRpciAkKi5tYXApCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGxpYnJhcmllcywgdGhpcyBtdXN0IGJlIHRoZSB0b3AgbGV2ZWwgY29udGFpbmluZwotIyBpbmNsdWRlIGFuZCBsaWIKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUxJQkRJUlMJOj0JJChMSUJORFMpCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgbm8gcmVhbCBuZWVkIHRvIGVkaXQgYW55dGhpbmcgcGFzdCB0aGlzIHBvaW50IHVubGVzcyB5b3UgbmVlZCB0byBhZGQgYWRkaXRpb25hbAotIyBydWxlcyBmb3IgZGlmZmVyZW50IGZpbGUgZXh0ZW5zaW9ucwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaWZuZXEgKCQoQlVJTEQpLCQobm90ZGlyICQoQ1VSRElSKSkpCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWV4cG9ydCBPVVRQVVQJOj0JJChDVVJESVIpL2xpYi9saWJ6LmEKLQotZXhwb3J0IFZQQVRICTo9CSQoZm9yZWFjaCBkaXIsJChTT1VSQ0VTKSwkKENVUkRJUikvJChkaXIpKSBcCi0JCQkkKGZvcmVhY2ggZGlyLCQoREFUQSksJChDVVJESVIpLyQoZGlyKSkKLQotZXhwb3J0IERFUFNESVIJOj0JJChDVVJESVIpLyQoQlVJTEQpCi0KLUNGSUxFUwkJOj0JJChmb3JlYWNoIGRpciwkKFNPVVJDRVMpLCQobm90ZGlyICQod2lsZGNhcmQgJChkaXIpLyouYykpKQotQ1BQRklMRVMJOj0JJChmb3JlYWNoIGRpciwkKFNPVVJDRVMpLCQobm90ZGlyICQod2lsZGNhcmQgJChkaXIpLyouY3BwKSkpCi1TRklMRVMJCTo9CSQoZm9yZWFjaCBkaXIsJChTT1VSQ0VTKSwkKG5vdGRpciAkKHdpbGRjYXJkICQoZGlyKS8qLnMpKSkKLUJJTkZJTEVTCTo9CSQoZm9yZWFjaCBkaXIsJChEQVRBKSwkKG5vdGRpciAkKHdpbGRjYXJkICQoZGlyKS8qLiopKSkKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyB1c2UgQ1hYIGZvciBsaW5raW5nIEMrKyBwcm9qZWN0cywgQ0MgZm9yIHN0YW5kYXJkIEMKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWlmZXEgKCQoc3RyaXAgJChDUFBGSUxFUykpLCkKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlleHBvcnQgTEQJOj0JJChDQykKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWVsc2UKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlleHBvcnQgTEQJOj0JJChDWFgpCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1lbmRpZgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1leHBvcnQgT0ZJTEVTCTo9CSQoYWRkc3VmZml4IC5vLCQoQklORklMRVMpKSBcCi0JCQkkKENQUEZJTEVTOi5jcHA9Lm8pICQoQ0ZJTEVTOi5jPS5vKSAkKFNGSUxFUzoucz0ubykKLQotZXhwb3J0IElOQ0xVREUJOj0JJChmb3JlYWNoIGRpciwkKElOQ0xVREVTKSwtSSQoQ1VSRElSKS8kKGRpcikpIFwKLQkJCSQoZm9yZWFjaCBkaXIsJChMSUJESVJTKSwtSSQoZGlyKS9pbmNsdWRlKSBcCi0JCQktSSQoQ1VSRElSKS8kKEJVSUxEKQotCi0uUEhPTlk6ICQoQlVJTEQpIGNsZWFuIGFsbAotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1hbGw6ICQoQlVJTEQpCi0JQFsgLWQgJEAgXSB8fCBta2RpciAtcCBpbmNsdWRlCi0JQGNwIC4uLy4uLyouaCBpbmNsdWRlCi0KLWxpYjoKLQlAWyAtZCAkQCBdIHx8IG1rZGlyIC1wICRACi0JCi0kKEJVSUxEKTogbGliCi0JQFsgLWQgJEAgXSB8fCBta2RpciAtcCAkQAotCUAkKE1BS0UpIC0tbm8tcHJpbnQtZGlyZWN0b3J5IC1DICQoQlVJTEQpIC1mICQoQ1VSRElSKS9NYWtlZmlsZQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jbGVhbjoKLQlAZWNobyBjbGVhbiAuLi4KLQlAcm0gLWZyICQoQlVJTEQpIGxpYgotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1lbHNlCi0KLURFUEVORFMJOj0JJChPRklMRVM6Lm89LmQpCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgbWFpbiB0YXJnZXRzCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0kKE9VVFBVVCkJOgkkKE9GSUxFUykKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJS5iaW4ubwk6CSUuYmluCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JQGVjaG8gJChub3RkaXIgJDwpCi0JQCQoYmluMm8pCi0KLQotLWluY2x1ZGUgJChERVBFTkRTKQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1lbmRpZgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvbmludGVuZG9kcy9SRUFETUUgYi9zcmMvemxpYi9uaW50ZW5kb2RzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3YTM3ZC4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9uaW50ZW5kb2RzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotVGhpcyBNYWtlZmlsZSByZXF1aXJlcyBkZXZraXRBUk0gKGh0dHA6Ly93d3cuZGV2a2l0cHJvLm9yZy9jYXRlZ29yeS9kZXZraXRhcm0vKSBhbmQgd29ya3MgaW5zaWRlICJjb250cmliL25kcyIuIEl0IGlzIGJhc2VkIG9uIGEgZGV2a2l0QVJNIHRlbXBsYXRlLgotCi1FZHVhcmRvIENvc3RhIDxlZHVhcmRvLm0uY29zdGFAZ21haWwuY29tPgotSmFudWFyeSAzLCAyMDA5Ci0KZGlmZiAtLWdpdCBhL3NyYy96bGliL29sZC9NYWtlZmlsZS5lbXggYi9zcmMvemxpYi9vbGQvTWFrZWZpbGUuZW14CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDZhYjBlLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL29sZC9NYWtlZmlsZS5lbXgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciB6bGliLiAgTW9kaWZpZWQgZm9yIGVteC9yc3hudCBieSBDaHIuIFNwaWVsZXIsIDYvMTYvOTguCi0jIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEplYW4tbG91cCBHYWlsbHkuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLQotIyBUbyBjb21waWxlLCBvciB0byBjb21waWxlIGFuZCB0ZXN0LCB0eXBlOgotIwotIyAgIG1ha2UgLWZtYWtlZmlsZS5lbXg7ICBtYWtlIHRlc3QgLWZtYWtlZmlsZS5lbXgKLSMKLQotQ0M9Z2NjIC1ad2luMzIKLQotI0NGTEFHUz0tTU1EIC1PCi0jQ0ZMQUdTPS1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03Ci0jQ0ZMQUdTPS1NTUQgLWcgLURERUJVRwotQ0ZMQUdTPS1NTUQgLU8zICQoQlVUVCkgLVdhbGwgLVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV2NvbnZlcnNpb24gXAotICAgICAgICAgICAgIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMKLQotIyBJZiBjcC5leGUgaXMgYXZhaWxhYmxlLCByZXBsYWNlICJjb3B5IC9ZIiB3aXRoICJjcCAtZnAiIC4KLUNQPWNvcHkgL1kKLSMgSWYgZ251IGluc3RhbGwuZXhlIGlzIGF2YWlsYWJsZSwgcmVwbGFjZSAkKENQKSB3aXRoIGdpbnN0YWxsLgotSU5TVEFMTD0kKENQKQotIyBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBSTSBpcyAicm0gLWYuIiAgSWYgInJtLmV4ZSIgaXMgZm91bmQsIGNvbW1lbnQgb3V0OgotUk09ZGVsCi1MRExJQlM9LUwuIC1semxpYgotTEQ9JChDQykgLXMgLW8KLUxEU0hBUkVEPSQoQ0MpCi0KLUlOQ0w9emxpYi5oIHpjb25mLmgKLUxJQlM9emxpYi5hCi0KLUFSPWFyIHJjcwotCi1wcmVmaXg9L3Vzci9sb2NhbAotZXhlY19wcmVmaXggPSAkKHByZWZpeCkKLQotT0JKUyA9IGFkbGVyMzIubyBjb21wcmVzcy5vIGNyYzMyLm8gZGVmbGF0ZS5vIGd6Y2xvc2UubyBnemxpYi5vIGd6cmVhZC5vIFwKLSAgICAgICBnendyaXRlLm8gaW5mYmFjay5vIGluZmZhc3QubyBpbmZsYXRlLm8gaW5mdHJlZXMubyB0cmVlcy5vIHVuY29tcHIubyB6dXRpbC5vCi0KLVRFU1RfT0JKUyA9IGV4YW1wbGUubyBtaW5pZ3ppcC5vCi0KLWFsbDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCi0KLXRlc3Q6IGFsbAotCS4vZXhhbXBsZQotCWVjaG8gaGVsbG8gd29ybGQgfCAuXG1pbmlnemlwIHwgLlxtaW5pZ3ppcCAtZAotCi0lLm8gOiAlLmMKLQkkKENDKSAkKENGTEFHUykgLWMgJDwgLW8gJEAKLQotemxpYi5hOiAkKE9CSlMpCi0JJChBUikgJEAgJChPQkpTKQotCi0lLmV4ZSA6ICUubyAkKExJQlMpCi0JJChMRCkgJEAgJDwgJChMRExJQlMpCi0KLQotLlBIT05ZIDogY2xlYW4KLQotY2xlYW46Ci0JJChSTSkgKi5kCi0JJChSTSkgKi5vCi0JJChSTSkgKi5leGUKLQkkKFJNKSB6bGliLmEKLQkkKFJNKSBmb28uZ3oKLQotREVQUyA6PSAkKHdpbGRjYXJkICouZCkKLWlmbmVxICgkKERFUFMpLCkKLWluY2x1ZGUgJChERVBTKQotZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy96bGliL29sZC9NYWtlZmlsZS5yaXNjb3MgYi9zcmMvemxpYi9vbGQvTWFrZWZpbGUucmlzY29zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2UyOWQzLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL29sZC9NYWtlZmlsZS5yaXNjb3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotIyBQcm9qZWN0OiAgIHpsaWJfMV8wMwotIyBQYXRjaGVkIGZvciB6bGliIDEuMS4yIHJ3QHNoYWRvdy5vcmcudWsgMTk5ODA0MzAKLSMgdGVzdCB3b3JrcyBvdXQtb2YtdGhlLWJveCwgaW5zdGFsbHMgYHNvbWV3aGVyZScgb24gZGVtYW5kCi0KLSMgVG9vbGZsYWdzOgotQ0NmbGFncyA9IC1jIC1kZXBlbmQgIURlcGVuZCAtSUM6IC1nIC10aHJvd2JhY2sgIC1EUklTQ09TICAtZmFoCi1DKytmbGFncyA9IC1jIC1kZXBlbmQgIURlcGVuZCAtSUM6IC10aHJvd2JhY2sKLUxpbmtmbGFncyA9IC1haWYgLWMrKyAtbyAkQAotT2JqQXNtZmxhZ3MgPSAtdGhyb3diYWNrIC1Ob0NhY2hlIC1kZXBlbmQgIURlcGVuZAotQ01IR2ZsYWdzID0KLUxpYkZpbGVmbGFncyA9IC1jIC1sIC1vICRACi1TcXVlZXplZmxhZ3MgPSAtbyAkQAotCi0jIGNoYW5nZSB0aGUgbGluZSBiZWxvdyB0byB3aGVyZSBfeW91XyB3YW50IHRoZSBsaWJyYXJ5IGluc3RhbGxlZC4KLWxpYmRlc3QgPSBsaWI6emxpYgotCi0jIEZpbmFsIHRhcmdldHM6Ci1ALmxpYjogICBALm8uYWRsZXIzMiBALm8uY29tcHJlc3MgQC5vLmNyYzMyIEAuby5kZWZsYXRlIEAuby5nemlvIFwKLSAgICAgICAgQC5vLmluZmJsb2NrIEAuby5pbmZjb2RlcyBALm8uaW5mZmFzdCBALm8uaW5mbGF0ZSBALm8uaW5mdHJlZXMgQC5vLmluZnV0aWwgQC5vLnRyZWVzIFwKLSAgICAgICAgQC5vLnVuY29tcHIgQC5vLnp1dGlsCi0gICAgICAgIExpYkZpbGUgJChMaWJGaWxlZmxhZ3MpIEAuby5hZGxlcjMyIEAuby5jb21wcmVzcyBALm8uY3JjMzIgQC5vLmRlZmxhdGUgXAotICAgICAgICBALm8uZ3ppbyBALm8uaW5mYmxvY2sgQC5vLmluZmNvZGVzIEAuby5pbmZmYXN0IEAuby5pbmZsYXRlIEAuby5pbmZ0cmVlcyBALm8uaW5mdXRpbCBcCi0gICAgICAgIEAuby50cmVlcyBALm8udW5jb21wciBALm8uenV0aWwKLXRlc3Q6ICAgQC5taW5pZ3ppcCBALmV4YW1wbGUgQC5saWIKLQlAY29weSBALmxpYiBALmxpYmMgIEF+Q35ERn5Mfk5+UH5RflJTflRWCi0JQGVjaG8gcnVubmluZyB0ZXN0czogaGFuZyBvbi4KLQlAL0AubWluaWd6aXAgLWYgLTkgbGliYwotCUAvQC5taW5pZ3ppcCAtZCBsaWJjLWd6Ci0JQC9ALm1pbmlnemlwIC1mIC0xIGxpYmMKLQlAL0AubWluaWd6aXAgLWQgbGliYy1negotCUAvQC5taW5pZ3ppcCAtaCAtOSBsaWJjCi0JQC9ALm1pbmlnemlwIC1kIGxpYmMtZ3oKLQlAL0AubWluaWd6aXAgLWggLTEgbGliYwotCUAvQC5taW5pZ3ppcCAtZCBsaWJjLWd6Ci0JQC9ALm1pbmlnemlwIC05IGxpYmMKLQlAL0AubWluaWd6aXAgLWQgbGliYy1negotCUAvQC5taW5pZ3ppcCAtMSBsaWJjCi0JQC9ALm1pbmlnemlwIC1kIGxpYmMtZ3oKLQlAZGlmZiBALmxpYiBALmxpYmMKLQlAZWNobyB0aGF0IHNob3VsZCBoYXZlIHJlcG9ydGVkICdALmxpYiBhbmQgQC5saWJjIGlkZW50aWNhbCcgaWYgeW91IGhhdmUgZGlmZi4KLQlAL0AuZXhhbXBsZSBALmZyZWQgQC5mcmVkCi0JQGVjaG8gdGhhdCB3aWxsIGhhdmUgZ2l2ZW4gbG90cyBvZiBoZWxsbyEncy4KLQotQC5taW5pZ3ppcDogICBALm8ubWluaWd6aXAgQC5saWIgQzpvLlN0dWJzCi0gICAgICAgIExpbmsgJChMaW5rZmxhZ3MpIEAuby5taW5pZ3ppcCBALmxpYiBDOm8uU3R1YnMKLUAuZXhhbXBsZTogICBALm8uZXhhbXBsZSBALmxpYiBDOm8uU3R1YnMKLSAgICAgICAgTGluayAkKExpbmtmbGFncykgQC5vLmV4YW1wbGUgQC5saWIgQzpvLlN0dWJzCi0KLWluc3RhbGw6IEAubGliCi0JY2RpciAkKGxpYmRlc3QpCi0JY2RpciAkKGxpYmRlc3QpLmgKLQlAY29weSBALmguemxpYiAkKGxpYmRlc3QpLmguemxpYiBBfkN+REZ+TH5OflB+UX5SU35UVgotCUBjb3B5IEAuaC56Y29uZiAkKGxpYmRlc3QpLmguemNvbmYgQX5DfkRGfkx+Tn5QflF+UlN+VFYKLQlAY29weSBALmxpYiAkKGxpYmRlc3QpLmxpYiAgQX5DfkRGfkx+Tn5QflF+UlN+VFYKLQlAZWNobyBva2F5LCBpbnN0YWxsZWQgemxpYiBpbiAkKGxpYmRlc3QpCi0KLWNsZWFuOjsgcmVtb3ZlIEAubWluaWd6aXAKLQlyZW1vdmUgQC5leGFtcGxlCi0JcmVtb3ZlIEAubGliYwotCS13aXBlIEAuby4qIEZ+cn5jVgotCXJlbW92ZSBALmZyZWQKLQotIyBVc2VyLWVkaXRhYmxlIGRlcGVuZGVuY2llczoKLS5jLm86Ci0gICAgICAgIGNjICQoY2NmbGFncykgLW8gJEAgJDwKLQotIyBTdGF0aWMgZGVwZW5kZW5jaWVzOgotCi0jIER5bmFtaWMgZGVwZW5kZW5jaWVzOgotby5leGFtcGxlOgljLmV4YW1wbGUKLW8uZXhhbXBsZToJaC56bGliCi1vLmV4YW1wbGU6CWguemNvbmYKLW8ubWluaWd6aXA6CWMubWluaWd6aXAKLW8ubWluaWd6aXA6CWguemxpYgotby5taW5pZ3ppcDoJaC56Y29uZgotby5hZGxlcjMyOgljLmFkbGVyMzIKLW8uYWRsZXIzMjoJaC56bGliCi1vLmFkbGVyMzI6CWguemNvbmYKLW8uY29tcHJlc3M6CWMuY29tcHJlc3MKLW8uY29tcHJlc3M6CWguemxpYgotby5jb21wcmVzczoJaC56Y29uZgotby5jcmMzMjoJYy5jcmMzMgotby5jcmMzMjoJaC56bGliCi1vLmNyYzMyOgloLnpjb25mCi1vLmRlZmxhdGU6CWMuZGVmbGF0ZQotby5kZWZsYXRlOgloLmRlZmxhdGUKLW8uZGVmbGF0ZToJaC56dXRpbAotby5kZWZsYXRlOgloLnpsaWIKLW8uZGVmbGF0ZToJaC56Y29uZgotby5nemlvOgljLmd6aW8KLW8uZ3ppbzoJaC56dXRpbAotby5nemlvOgloLnpsaWIKLW8uZ3ppbzoJaC56Y29uZgotby5pbmZibG9jazoJYy5pbmZibG9jawotby5pbmZibG9jazoJaC56dXRpbAotby5pbmZibG9jazoJaC56bGliCi1vLmluZmJsb2NrOgloLnpjb25mCi1vLmluZmJsb2NrOgloLmluZmJsb2NrCi1vLmluZmJsb2NrOgloLmluZnRyZWVzCi1vLmluZmJsb2NrOgloLmluZmNvZGVzCi1vLmluZmJsb2NrOgloLmluZnV0aWwKLW8uaW5mY29kZXM6CWMuaW5mY29kZXMKLW8uaW5mY29kZXM6CWguenV0aWwKLW8uaW5mY29kZXM6CWguemxpYgotby5pbmZjb2RlczoJaC56Y29uZgotby5pbmZjb2RlczoJaC5pbmZ0cmVlcwotby5pbmZjb2RlczoJaC5pbmZibG9jawotby5pbmZjb2RlczoJaC5pbmZjb2Rlcwotby5pbmZjb2RlczoJaC5pbmZ1dGlsCi1vLmluZmNvZGVzOgloLmluZmZhc3QKLW8uaW5mZmFzdDoJYy5pbmZmYXN0Ci1vLmluZmZhc3Q6CWguenV0aWwKLW8uaW5mZmFzdDoJaC56bGliCi1vLmluZmZhc3Q6CWguemNvbmYKLW8uaW5mZmFzdDoJaC5pbmZ0cmVlcwotby5pbmZmYXN0OgloLmluZmJsb2NrCi1vLmluZmZhc3Q6CWguaW5mY29kZXMKLW8uaW5mZmFzdDoJaC5pbmZ1dGlsCi1vLmluZmZhc3Q6CWguaW5mZmFzdAotby5pbmZsYXRlOgljLmluZmxhdGUKLW8uaW5mbGF0ZToJaC56dXRpbAotby5pbmZsYXRlOgloLnpsaWIKLW8uaW5mbGF0ZToJaC56Y29uZgotby5pbmZsYXRlOgloLmluZmJsb2NrCi1vLmluZnRyZWVzOgljLmluZnRyZWVzCi1vLmluZnRyZWVzOgloLnp1dGlsCi1vLmluZnRyZWVzOgloLnpsaWIKLW8uaW5mdHJlZXM6CWguemNvbmYKLW8uaW5mdHJlZXM6CWguaW5mdHJlZXMKLW8uaW5mdHJlZXM6CWguaW5mZml4ZWQKLW8uaW5mdXRpbDoJYy5pbmZ1dGlsCi1vLmluZnV0aWw6CWguenV0aWwKLW8uaW5mdXRpbDoJaC56bGliCi1vLmluZnV0aWw6CWguemNvbmYKLW8uaW5mdXRpbDoJaC5pbmZibG9jawotby5pbmZ1dGlsOgloLmluZnRyZWVzCi1vLmluZnV0aWw6CWguaW5mY29kZXMKLW8uaW5mdXRpbDoJaC5pbmZ1dGlsCi1vLnRyZWVzOgljLnRyZWVzCi1vLnRyZWVzOgloLmRlZmxhdGUKLW8udHJlZXM6CWguenV0aWwKLW8udHJlZXM6CWguemxpYgotby50cmVlczoJaC56Y29uZgotby50cmVlczoJaC50cmVlcwotby51bmNvbXByOgljLnVuY29tcHIKLW8udW5jb21wcjoJaC56bGliCi1vLnVuY29tcHI6CWguemNvbmYKLW8uenV0aWw6CWMuenV0aWwKLW8uenV0aWw6CWguenV0aWwKLW8uenV0aWw6CWguemxpYgotby56dXRpbDoJaC56Y29uZgpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvb2xkL1JFQURNRSBiL3NyYy96bGliL29sZC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMGJmMDcuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvb2xkL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZmlsZXMgdGhhdCBoYXZlIG5vdCBiZWVuIHVwZGF0ZWQgZm9yIHpsaWIgMS4yLngKLQotKFZvbHVudGVlcnMgYXJlIGVuY291cmFnZWQgdG8gaGVscCBjbGVhbiB0aGlzIHVwLiAgVGhhbmtzLikKZGlmZiAtLWdpdCBhL3NyYy96bGliL29sZC9kZXNjcmlwLm1tcyBiL3NyYy96bGliL29sZC9kZXNjcmlwLm1tcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA2NmRhNS4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9vbGQvZGVzY3JpcC5tbXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIGRlc2NyaXAubW1zOiBNTVMgZGVzY3JpcHRpb24gZmlsZSBmb3IgYnVpbGRpbmcgemxpYiBvbiBWTVMKLSMgd3JpdHRlbiBieSBNYXJ0aW4gUC5KLiBaaW5zZXIgPG0uemluc2VyQGdzaS5kZT4KLQotY2NfZGVmcyA9Ci1jX2RlYiA9Ci0KLS5pZmRlZiBfX0RFQ0NfXwotcHJlZiA9IC9wcmVmaXg9YWxsCi0uZW5kaWYKLQotT0JKUyA9IGFkbGVyMzIub2JqLCBjb21wcmVzcy5vYmosIGNyYzMyLm9iaiwgZ3ppby5vYmosIHVuY29tcHIub2JqLFwKLSAgICAgICBkZWZsYXRlLm9iaiwgdHJlZXMub2JqLCB6dXRpbC5vYmosIGluZmxhdGUub2JqLCBpbmZibG9jay5vYmosXAotICAgICAgIGluZnRyZWVzLm9iaiwgaW5mY29kZXMub2JqLCBpbmZ1dGlsLm9iaiwgaW5mZmFzdC5vYmoKLQotQ0ZMQUdTPSAkKENfREVCKSAkKENDX0RFRlMpICQoUFJFRikKLQotYWxsIDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCi0gICAgICAgIEAgd3JpdGUgc3lzJG91dHB1dCAiIEV4YW1wbGUgYXBwbGljYXRpb25zIGF2YWlsYWJsZSIKLWxpYnoub2xiIDogbGliei5vbGIoJChPQkpTKSkKLQlAIHdyaXRlIHN5cyRvdXRwdXQgIiBsaWJ6IGF2YWlsYWJsZSIKLQotZXhhbXBsZS5leGUgOiBleGFtcGxlLm9iaiBsaWJ6Lm9sYgotICAgICAgICAgICAgICBsaW5rIGV4YW1wbGUsbGliei5vbGIvbGliCi0KLW1pbmlnemlwLmV4ZSA6IG1pbmlnemlwLm9iaiBsaWJ6Lm9sYgotICAgICAgICAgICAgICBsaW5rIG1pbmlnemlwLGxpYnoub2xiL2xpYix4MTF2bXM6eHZtc3V0aWxzLm9sYi9saWIKLQotY2xlYW4gOgotCWRlbGV0ZSAqLm9iajsqLGxpYnoub2xiOyoKLQotCi0jIE90aGVyIGRlcGVuZGVuY2llcy4KLWFkbGVyMzIub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaAotY29tcHJlc3Mub2JqIDogemxpYi5oIHpjb25mLmgKLWNyYzMyLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWRlZmxhdGUub2JqIDogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWV4YW1wbGUub2JqIDogemxpYi5oIHpjb25mLmgKLWd6aW8ub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaAotaW5mYmxvY2sub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oIGluZnRyZWVzLmggaW5mY29kZXMuaCBpbmZ1dGlsLmgKLWluZmNvZGVzLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZ1dGlsLmggaW5mY29kZXMuaCBpbmZmYXN0LmgKLWluZmZhc3Qub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZnV0aWwuaCBpbmZmYXN0LmgKLWluZmxhdGUub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oCi1pbmZ0cmVlcy5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKLWluZnV0aWwub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZnV0aWwuaAotbWluaWd6aXAub2JqIDogemxpYi5oIHpjb25mLmgKLXRyZWVzLm9iaiA6IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi11bmNvbXByLm9iaiA6IHpsaWIuaCB6Y29uZi5oCi16dXRpbC5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCmRpZmYgLS1naXQgYS9zcmMvemxpYi9vbGQvb3MyL01ha2VmaWxlLm9zMiBiL3NyYy96bGliL29sZC9vczIvTWFrZWZpbGUub3MyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTA1YWFhLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL29sZC9vczIvTWFrZWZpbGUub3MyCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHpsaWIgdW5kZXIgT1MvMiB1c2luZyBHQ0MgKFBHQ0MpCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLQotIyBUbyBjb21waWxlIGFuZCB0ZXN0LCB0eXBlOgotIyAgIGNwIE1ha2VmaWxlLm9zMiAuLgotIyAgIGNkIC4uCi0jICAgbWFrZSAtZiBNYWtlZmlsZS5vczIgdGVzdAotCi0jIFRoaXMgbWFrZWZpbGUgd2lsbCBidWlsZCBhIHN0YXRpYyBsaWJyYXJ5IHoubGliLCBhIHNoYXJlZCBsaWJyYXJ5Ci0jIHouZGxsIGFuZCBhIGltcG9ydCBsaWJyYXJ5IHpkbGwubGliLiBZb3UgY2FuIHVzZSBlaXRoZXIgei5saWIgb3IKLSMgemRsbC5saWIgYnkgc3BlY2lmeWluZyBlaXRoZXIgLWx6IG9yIC1semRsbCBvbiBnY2MncyBjb21tYW5kIGxpbmUKLQotQ0M9Z2NjIC1ab21mIC1zCi0KLUNGTEFHUz0tTzYgLVdhbGwKLSNDRkxBR1M9LU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTcKLSNDRkxBR1M9LWcgLURERUJVRwotI0NGTEFHUz0tTzMgLVdhbGwgLVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV2NvbnZlcnNpb24gXAotIyAgICAgICAgICAgLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyBCVUcgV0FSTklORzogIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBpbmZjb2Rlcy5jIGhpdHMgYSBidWcgaW4gcGdjYy0xLjAsIHNvIHlvdSBoYXZlIHRvIHVzZSBlaXRoZXIKLSMjIC1PIyB3aGVyZSAjIDw9IDQgb3Igb25lIG9mICgtZm5vLW9tbWl0LWZyYW1lLXBvaW50ZXIgb3IgLWZuby1mb3JjZS1tZW0pCi0jIyBUaGlzIGJ1ZyBpcyByZXBvcnRlZGx5IGZpeGVkIGluIHBnY2MgPjEuMCwgYnV0IHRoaXMgd2FzIG5vdCB0ZXN0ZWQKLUNGTEFHUys9LWZuby1mb3JjZS1tZW0KLQotTERGTEFHUz0tcyAtTC4gLWx6ZGxsIC1aY3J0ZGxsCi1MRFNIQVJFRD0kKENDKSAtcyAtWm9tZiAtWmRsbCAtWmNydGRsbAotCi1WRVI9MS4xLjAKLVpMSUI9ei5saWIKLVNIQVJFRExJQj16LmRsbAotU0hBUkVETElCSU1QPXpkbGwubGliCi1MSUJTPSQoWkxJQikgJChTSEFSRURMSUIpICQoU0hBUkVETElCSU1QKQotCi1BUj1lbXhvbWZhciBjcgotSU1QTElCPWVteGltcAotUkFOTElCPWVjaG8KLVRBUj10YXIKLVNIRUxMPWJhc2gKLQotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4ID0gJChwcmVmaXgpCi0KLU9CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6aW8ubyB1bmNvbXByLm8gZGVmbGF0ZS5vIHRyZWVzLm8gXAotICAgICAgIHp1dGlsLm8gaW5mbGF0ZS5vIGluZmJsb2NrLm8gaW5mdHJlZXMubyBpbmZjb2Rlcy5vIGluZnV0aWwubyBpbmZmYXN0Lm8KLQotVEVTVF9PQkpTID0gZXhhbXBsZS5vIG1pbmlnemlwLm8KLQotRElTVEZJTEVTID0gUkVBRE1FIElOREVYIENoYW5nZUxvZyBjb25maWd1cmUgTWFrZSpbYS16MC05XSAqLltjaF0gZGVzY3JpcC5tbXMgXAotICBhbGdvcml0aG0udHh0IHpsaWIuMyBtc2Rvcy9NYWtlKlthLXowLTldIG1zZG9zL3psaWIuZGVmIG1zZG9zL3psaWIucmMgXAotICBudC9NYWtlZmlsZS5udCBudC96bGliLmRudCAgY29udHJpYi9SRUFETUUuY29udHJpYiBjb250cmliLyoudHh0IFwKLSAgY29udHJpYi9hc20zODYvKi5hc20gY29udHJpYi9hc20zODYvKi5jIFwKLSAgY29udHJpYi9hc20zODYvKi5iYXQgY29udHJpYi9hc20zODYvemxpYnZjLmQ/PyBjb250cmliL2lvc3RyZWFtLyouY3BwIFwKLSAgY29udHJpYi9pb3N0cmVhbS8qLmggIGNvbnRyaWIvaW9zdHJlYW0yLyouaCBjb250cmliL2lvc3RyZWFtMi8qLmNwcCBcCi0gIGNvbnRyaWIvdW50Z3ovTWFrZWZpbGUgY29udHJpYi91bnRnei8qLmMgY29udHJpYi91bnRnei8qLnczMgotCi1hbGw6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQotCi10ZXN0OiBhbGwKLQlATERfTElCUkFSWV9QQVRIPS46JChMRF9MSUJSQVJZX1BBVEgpIDsgZXhwb3J0IExEX0xJQlJBUllfUEFUSDsgXAotCWVjaG8gaGVsbG8gd29ybGQgfCAuL21pbmlnemlwIHwgLi9taW5pZ3ppcCAtZCB8fCBcCi0JICBlY2hvICcJCSoqKiBtaW5pZ3ppcCB0ZXN0IEZBSUxFRCAqKionIDsgXAotCWlmIC4vZXhhbXBsZTsgdGhlbiBcCi0JICBlY2hvICcJCSoqKiB6bGliIHRlc3QgT0sgKioqJzsgXAotCWVsc2UgXAotCSAgZWNobyAnCQkqKiogemxpYiB0ZXN0IEZBSUxFRCAqKionOyBcCi0JZmkKLQotJChaTElCKTogJChPQkpTKQotCSQoQVIpICRAICQoT0JKUykKLQktQCAoJChSQU5MSUIpICRAIHx8IHRydWUpID4vZGV2L251bGwgMj4mMQotCi0kKFNIQVJFRExJQik6ICQoT0JKUykgb3MyL3ouZGVmCi0JJChMRFNIQVJFRCkgLW8gJEAgJF4KLQotJChTSEFSRURMSUJJTVApOiBvczIvei5kZWYKLQkkKElNUExJQikgLW8gJEAgJF4KLQotZXhhbXBsZS5leGU6IGV4YW1wbGUubyAkKExJQlMpCi0JJChDQykgJChDRkxBR1MpIC1vICRAIGV4YW1wbGUubyAkKExERkxBR1MpCi0KLW1pbmlnemlwLmV4ZTogbWluaWd6aXAubyAkKExJQlMpCi0JJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwLm8gJChMREZMQUdTKQotCi1jbGVhbjoKLQlybSAtZiAqLm8gKn4gZXhhbXBsZSBtaW5pZ3ppcCBsaWJ6LmEgbGliei5zbyogZm9vLmd6Ci0KLWRpc3RjbGVhbjoJY2xlYW4KLQotemlwOgotCW12IE1ha2VmaWxlIE1ha2VmaWxlfjsgY3AgLXAgTWFrZWZpbGUuaW4gTWFrZWZpbGUKLQlybSAtZiB0ZXN0LmMgenRlc3QqLmMKLQl2PWBzZWQgLW4gLWUgJ3MvXC4vL2cnIC1lICcvVkVSU0lPTiAiL3MvLioiXCguKlwpIi4qL1wxL3AnIDwgemxpYi5oYDtcCi0JemlwIC11bDkgemxpYiQkdiAkKERJU1RGSUxFUykKLQltdiBNYWtlZmlsZX4gTWFrZWZpbGUKLQotZGlzdDoKLQltdiBNYWtlZmlsZSBNYWtlZmlsZX47IGNwIC1wIE1ha2VmaWxlLmluIE1ha2VmaWxlCi0Jcm0gLWYgdGVzdC5jIHp0ZXN0Ki5jCi0JZD16bGliLWBzZWQgLW4gJy9WRVJTSU9OICIvcy8uKiJcKC4qXCkiLiovXDEvcCcgPCB6bGliLmhgO1wKLQlybSAtZiAkJGQudGFyLmd6OyBcCi0JaWYgdGVzdCAhIC1kIC4uLyQkZDsgdGhlbiBybSAtZiAuLi8kJGQ7IGxuIC1zIGBwd2RgIC4uLyQkZDsgZmk7IFwKLQlmaWxlcz0iIjsgXAotCWZvciBmIGluICQoRElTVEZJTEVTKTsgZG8gZmlsZXM9IiQkZmlsZXMgJCRkLyQkZiI7IGRvbmU7IFwKLQljZCAuLjsgXAotCUdaSVA9LTkgJChUQVIpIGNob2Z6ICQkZC8kJGQudGFyLmd6ICQkZmlsZXM7IFwKLQlpZiB0ZXN0ICEgLWQgJCRkOyB0aGVuIHJtIC1mICQkZDsgZmkKLQltdiBNYWtlZmlsZX4gTWFrZWZpbGUKLQotdGFnczoKLQlldGFncyAqLltjaF0KLQotZGVwZW5kOgotCW1ha2VkZXBlbmQgLS0gJChDRkxBR1MpIC0tICouW2NoXQotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLWFkbGVyMzIubzogemxpYi5oIHpjb25mLmgKLWNvbXByZXNzLm86IHpsaWIuaCB6Y29uZi5oCi1jcmMzMi5vOiB6bGliLmggemNvbmYuaAotZGVmbGF0ZS5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotZXhhbXBsZS5vOiB6bGliLmggemNvbmYuaAotZ3ppby5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1pbmZibG9jay5vOiBpbmZibG9jay5oIGluZnRyZWVzLmggaW5mY29kZXMuaCBpbmZ1dGlsLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotaW5mY29kZXMubzogenV0aWwuaCB6bGliLmggemNvbmYuaAotaW5mY29kZXMubzogaW5mdHJlZXMuaCBpbmZibG9jay5oIGluZmNvZGVzLmggaW5mdXRpbC5oIGluZmZhc3QuaAotaW5mZmFzdC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKLWluZmZhc3QubzogaW5mYmxvY2suaCBpbmZjb2Rlcy5oIGluZnV0aWwuaCBpbmZmYXN0LmgKLWluZmxhdGUubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oCi1pbmZ0cmVlcy5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKLWluZnV0aWwubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oIGluZnRyZWVzLmggaW5mY29kZXMuaCBpbmZ1dGlsLmgKLW1pbmlnemlwLm86IHpsaWIuaCB6Y29uZi5oCi10cmVlcy5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaCB0cmVlcy5oCi11bmNvbXByLm86IHpsaWIuaCB6Y29uZi5oCi16dXRpbC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCmRpZmYgLS1naXQgYS9zcmMvemxpYi9vbGQvb3MyL3psaWIuZGVmIGIvc3JjL3psaWIvb2xkL29zMi96bGliLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM3NTNmMS4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9vbGQvb3MyL3psaWIuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotOwotOyBTbGlnaHRseSBtb2RpZmllZCB2ZXJzaW9uIG9mIC4uL250L3psaWIuZG50IDotKQotOwotCi1MSUJSQVJZCQlaCi1ERVNDUklQVElPTgkiWmxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5IGZvciBPUy8yIgotQ09ERQkJUFJFTE9BRCBNT1ZFQUJMRSBESVNDQVJEQUJMRQotREFUQQkJUFJFTE9BRCBNT1ZFQUJMRSBNVUxUSVBMRQotCi1FWFBPUlRTCi0gICAgYWRsZXIzMgotICAgIGNvbXByZXNzCi0gICAgY3JjMzIKLSAgICBkZWZsYXRlCi0gICAgZGVmbGF0ZUNvcHkKLSAgICBkZWZsYXRlRW5kCi0gICAgZGVmbGF0ZUluaXQyXwotICAgIGRlZmxhdGVJbml0XwotICAgIGRlZmxhdGVQYXJhbXMKLSAgICBkZWZsYXRlUmVzZXQKLSAgICBkZWZsYXRlU2V0RGljdGlvbmFyeQotICAgIGd6Y2xvc2UKLSAgICBnemRvcGVuCi0gICAgZ3plcnJvcgotICAgIGd6Zmx1c2gKLSAgICBnem9wZW4KLSAgICBnenJlYWQKLSAgICBnendyaXRlCi0gICAgaW5mbGF0ZQotICAgIGluZmxhdGVFbmQKLSAgICBpbmZsYXRlSW5pdDJfCi0gICAgaW5mbGF0ZUluaXRfCi0gICAgaW5mbGF0ZVJlc2V0Ci0gICAgaW5mbGF0ZVNldERpY3Rpb25hcnkKLSAgICBpbmZsYXRlU3luYwotICAgIHVuY29tcHJlc3MKLSAgICB6bGliVmVyc2lvbgotICAgIGd6cHJpbnRmCi0gICAgZ3pwdXRjCi0gICAgZ3pnZXRjCi0gICAgZ3pzZWVrCi0gICAgZ3pyZXdpbmQKLSAgICBnenRlbGwKLSAgICBnemVvZgotICAgIGd6c2V0cGFyYW1zCi0gICAgekVycm9yCi0gICAgaW5mbGF0ZVN5bmNQb2ludAotICAgIGdldF9jcmNfdGFibGUKLSAgICBjb21wcmVzczIKLSAgICBnenB1dHMKLSAgICBnemdldHMKZGlmZiAtLWdpdCBhL3NyYy96bGliL29sZC92aXN1YWwtYmFzaWMudHh0IGIvc3JjL3psaWIvb2xkL3Zpc3VhbC1iYXNpYy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZWZlNTguLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvb2xkL3Zpc3VhbC1iYXNpYy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotU2VlIGJlbG93IHNvbWUgZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBmb3IgVmlzdWFsIEJhc2ljLgotCi1GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uOgotCi1ROiBFYWNoIHRpbWUgSSB1c2UgdGhlIGNvbXByZXNzIGZ1bmN0aW9uIEkgZ2V0IHRoZSAtNSBlcnJvciAobm90IGVub3VnaAotICAgcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlcikuCi0KLUE6IE1ha2Ugc3VyZSB0aGF0IHRoZSBsZW5ndGggb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyIGlzIHBhc3NlZCBieQotICAgcmVmZXJlbmNlICgiYXMgYW55IiksIG5vdCBieSB2YWx1ZSAoImFzIGxvbmciKS4gQWxzbyBjaGVjayB0aGF0Ci0gICBiZWZvcmUgdGhlIGNhbGwgb2YgY29tcHJlc3MgdGhpcyBsZW5ndGggaXMgZXF1YWwgdG8gdGhlIHRvdGFsIHNpemUgb2YKLSAgIHRoZSBjb21wcmVzc2VkIGJ1ZmZlciBhbmQgbm90IHplcm8uCi0KLQotRnJvbTogIkpvbiBDYXJ1YW5hIiA8am9uLW5ldEB1c2EubmV0PgotU3ViamVjdDogUmU6IEhvdyB0byBwb3J0IHpsaWIgZGVjbGFyZXMgdG8gdmI/Ci1EYXRlOiBNb24sIDI4IE9jdCAxOTk2IDE4OjMzOjAzIC0wNjAwCi0KLUdvdCB0aGUgYW5zd2VyISAoSSBoYXZlbid0IGhhZCB0aW1lIHRvIGNoZWNrIHRoaXMgYnV0IGl0J3Mgd2hhdCBJIGdvdCwgYW5kCi1sb29rcyBjb3JyZWN0KToKLQotSGUgaGFzIHRoZSBmb2xsb3dpbmcgcm91dGluZXMgd29ya2luZzoKLSAgICAgICAgY29tcHJlc3MKLSAgICAgICAgdW5jb21wcmVzcwotICAgICAgICBnem9wZW4KLSAgICAgICAgZ3p3cml0ZQotICAgICAgICBnenJlYWQKLSAgICAgICAgZ3pjbG9zZQotCi1EZWNsYXJlcyBmb2xsb3c6IChRdW90ZWQgZnJvbSBDYXJsb3MgUmlvcyA8Y19yaW9zQHNvbmRhLmNsPiwgaW4gVmI0IGZvcm0pCi0KLSNJZiBXaW4xNiBUaGVuICAgJ1VzZSBXaW4xNiBjYWxscy4KLURlY2xhcmUgRnVuY3Rpb24gY29tcHJlc3MgTGliICJaTElCLkRMTCIgKEJ5VmFsIGNvbXByIEFzCi0gICAgICAgIFN0cmluZywgY29tcHJMZW4gQXMgQW55LCBCeVZhbCBidWYgQXMgU3RyaW5nLCBCeVZhbCBidWZsZW4KLSAgICAgICAgQXMgTG9uZykgQXMgSW50ZWdlcgotRGVjbGFyZSBGdW5jdGlvbiB1bmNvbXByZXNzIExpYiAiWkxJQi5ETEwiIChCeVZhbCB1bmNvbXByCi0gICAgICAgIEFzIFN0cmluZywgdW5jb21wckxlbiBBcyBBbnksIEJ5VmFsIGNvbXByIEFzIFN0cmluZywgQnlWYWwKLSAgICAgICAgbGNvbXByIEFzIExvbmcpIEFzIEludGVnZXIKLURlY2xhcmUgRnVuY3Rpb24gZ3pvcGVuIExpYiAiWkxJQi5ETEwiIChCeVZhbCBmaWxlUGF0aCBBcwotICAgICAgICBTdHJpbmcsIEJ5VmFsIG1vZGUgQXMgU3RyaW5nKSBBcyBMb25nCi1EZWNsYXJlIEZ1bmN0aW9uIGd6cmVhZCBMaWIgIlpMSUIuRExMIiAoQnlWYWwgZmlsZSBBcwotICAgICAgICBMb25nLCBCeVZhbCB1bmNvbXByIEFzIFN0cmluZywgQnlWYWwgdW5jb21wckxlbiBBcyBJbnRlZ2VyKQotICAgICAgICBBcyBJbnRlZ2VyCi1EZWNsYXJlIEZ1bmN0aW9uIGd6d3JpdGUgTGliICJaTElCLkRMTCIgKEJ5VmFsIGZpbGUgQXMKLSAgICAgICAgTG9uZywgQnlWYWwgdW5jb21wciBBcyBTdHJpbmcsIEJ5VmFsIHVuY29tcHJMZW4gQXMgSW50ZWdlcikKLSAgICAgICAgQXMgSW50ZWdlcgotRGVjbGFyZSBGdW5jdGlvbiBnemNsb3NlIExpYiAiWkxJQi5ETEwiIChCeVZhbCBmaWxlIEFzCi0gICAgICAgIExvbmcpIEFzIEludGVnZXIKLSNFbHNlCi1EZWNsYXJlIEZ1bmN0aW9uIGNvbXByZXNzIExpYiAiWkxJQjMyLkRMTCIKLSAgICAgICAgKEJ5VmFsIGNvbXByIEFzIFN0cmluZywgY29tcHJMZW4gQXMgQW55LCBCeVZhbCBidWYgQXMKLSAgICAgICAgU3RyaW5nLCBCeVZhbCBidWZsZW4gQXMgTG9uZykgQXMgSW50ZWdlcgotRGVjbGFyZSBGdW5jdGlvbiB1bmNvbXByZXNzIExpYiAiWkxJQjMyLkRMTCIKLSAgICAgICAgKEJ5VmFsIHVuY29tcHIgQXMgU3RyaW5nLCB1bmNvbXByTGVuIEFzIEFueSwgQnlWYWwgY29tcHIgQXMKLSAgICAgICAgU3RyaW5nLCBCeVZhbCBsY29tcHIgQXMgTG9uZykgQXMgTG9uZwotRGVjbGFyZSBGdW5jdGlvbiBnem9wZW4gTGliICJaTElCMzIuRExMIgotICAgICAgICAoQnlWYWwgZmlsZSBBcyBTdHJpbmcsIEJ5VmFsIG1vZGUgQXMgU3RyaW5nKSBBcyBMb25nCi1EZWNsYXJlIEZ1bmN0aW9uIGd6cmVhZCBMaWIgIlpMSUIzMi5ETEwiCi0gICAgICAgIChCeVZhbCBmaWxlIEFzIExvbmcsIEJ5VmFsIHVuY29tcHIgQXMgU3RyaW5nLCBCeVZhbAotICAgICAgICB1bmNvbXByTGVuIEFzIExvbmcpIEFzIExvbmcKLURlY2xhcmUgRnVuY3Rpb24gZ3p3cml0ZSBMaWIgIlpMSUIzMi5ETEwiCi0gICAgICAgIChCeVZhbCBmaWxlIEFzIExvbmcsIEJ5VmFsIHVuY29tcHIgQXMgU3RyaW5nLCBCeVZhbAotICAgICAgICB1bmNvbXByTGVuIEFzIExvbmcpIEFzIExvbmcKLURlY2xhcmUgRnVuY3Rpb24gZ3pjbG9zZSBMaWIgIlpMSUIzMi5ETEwiCi0gICAgICAgIChCeVZhbCBmaWxlIEFzIExvbmcpIEFzIExvbmcKLSNFbmQgSWYKLQotLUpvbiBDYXJ1YW5hCi1qb24tbmV0QHVzYS5uZXQKLU1pY3Jvc29mdCBTaXRlYnVpbGRlciBOZXR3b3JrIExldmVsIDEgTWVtYmVyIC0gSFRNTCBXcml0ZXIncyBHdWlsZCBNZW1iZXIKLQotCi1IZXJlIGlzIGFub3RoZXIgZXhhbXBsZSBmcm9tIE1pY2hhZWwgPG1pY2hhZWxfYm9yZ3N5c0Bob3RtYWlsLmNvbT4gdGhhdCBoZQotc2F5cyBjb25mb3JtcyB0byB0aGUgVkIgZ3VpZGVsaW5lcywgYW5kIHRoYXQgc29sdmVzIHRoZSBwcm9ibGVtIG9mIG5vdAota25vd2luZyB0aGUgdW5jb21wcmVzc2VkIHNpemUgYnkgc3RvcmluZyBpdCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlOgotCi0nQ2FsbGluZyB0aGUgZnVuY3Rpb25zOgotJ2JyYWNrZXQgbWVhbmluZzogPHBhcmFtZXRlcj4gW29wdGlvbmFsXSB7UmFuZ2Ugb2YgcG9zc2libGUgdmFsdWVzfQotJ0NhbGwgc3ViQ29tcHJlc3NGaWxlKDxwYXRoIHdpdGggZmlsZW5hbWUgdG8gY29tcHJlc3M+IFssIDxwYXRoIHdpdGgKLWZpbGVuYW1lIHRvIHdyaXRlIHRvPiwgW2xldmVsIG9mIGNvbXByZXNzaW9uIHsxLi45fV1dKQotJ0NhbGwgc3ViVW5jb21wcmVzc0ZpbGUoPHBhdGggd2l0aCBmaWxlbmFtZSB0byBjb21wcmVzcz4pCi0KLU9wdGlvbiBFeHBsaWNpdAotUHJpdmF0ZSBsbmdwdnRQY25TbWwgQXMgTG9uZyAnU3RvcmVzIHZhbHVlIGZvciAnbG5nUGVyY2VudFNtYWxsZXInCi1Qcml2YXRlIENvbnN0IFNVQ0NFU1MgQXMgTG9uZyA9IDAKLVByaXZhdGUgQ29uc3Qgc3RyRmlsRXh0IEFzIFN0cmluZyA9ICIuY3ByIgotUHJpdmF0ZSBEZWNsYXJlIEZ1bmN0aW9uIGxuZ2ZuY0NwciBMaWIgInpsaWIuZGxsIiBBbGlhcyAiY29tcHJlc3MyIiAoQnlSZWYKLWRlc3QgQXMgQW55LCBCeVJlZiBkZXN0TGVuIEFzIEFueSwgQnlSZWYgc3JjIEFzIEFueSwgQnlWYWwgc3JjTGVuIEFzIExvbmcsCi1CeVZhbCBsZXZlbCBBcyBJbnRlZ2VyKSBBcyBMb25nCi1Qcml2YXRlIERlY2xhcmUgRnVuY3Rpb24gbG5nZm5jVWNwIExpYiAiemxpYi5kbGwiIEFsaWFzICJ1bmNvbXByZXNzIiAoQnlSZWYKLWRlc3QgQXMgQW55LCBCeVJlZiBkZXN0TGVuIEFzIEFueSwgQnlSZWYgc3JjIEFzIEFueSwgQnlWYWwgc3JjTGVuIEFzIExvbmcpCi1BcyBMb25nCi0KLVB1YmxpYyBTdWIgc3ViQ29tcHJlc3NGaWxlKEJ5VmFsIHN0cmFyZ09yaUZpbFB0aCBBcyBTdHJpbmcsIE9wdGlvbmFsIEJ5VmFsCi1zdHJhcmdDcHJGaWxQdGggQXMgU3RyaW5nLCBPcHRpb25hbCBCeVZhbCBpbnRMdmwgQXMgSW50ZWdlciA9IDkpCi0gICAgRGltIHN0ckNwclB0aCBBcyBTdHJpbmcKLSAgICBEaW0gbG5nT3JpU2l6IEFzIExvbmcKLSAgICBEaW0gbG5nQ3ByU2l6IEFzIExvbmcKLSAgICBEaW0gYnl0YXJ5T3JpKCkgQXMgQnl0ZQotICAgIERpbSBieXRhcnlDcHIoKSBBcyBCeXRlCi0gICAgbG5nT3JpU2l6ID0gRmlsZUxlbihzdHJhcmdPcmlGaWxQdGgpCi0gICAgUmVEaW0gYnl0YXJ5T3JpKGxuZ09yaVNpeiAtIDEpCi0gICAgT3BlbiBzdHJhcmdPcmlGaWxQdGggRm9yIEJpbmFyeSBBY2Nlc3MgUmVhZCBBcyAjMQotICAgICAgICBHZXQgIzEsICwgYnl0YXJ5T3JpKCkKLSAgICBDbG9zZSAjMQotICAgIHN0ckNwclB0aCA9IElJZihzdHJhcmdDcHJGaWxQdGggPSAiIiwgc3RyYXJnT3JpRmlsUHRoLCBzdHJhcmdDcHJGaWxQdGgpCi0nU2VsZWN0IGZpbGUgcGF0aCBhbmQgbmFtZQotICAgIHN0ckNwclB0aCA9IHN0ckNwclB0aCAmIElJZihSaWdodChzdHJDcHJQdGgsIExlbihzdHJGaWxFeHQpKSA9Ci1zdHJGaWxFeHQsICIiLCBzdHJGaWxFeHQpICdBZGQgZmlsZSBleHRlbnNpb24gaWYgbm90IGV4aXN0cwotICAgIGxuZ0NwclNpeiA9IChsbmdPcmlTaXogKiAxLjAxKSArIDEyICdDb21wcmVzc2lvbiBuZWVkcyB0ZW1wb3JhcnkgYSBiaXQKLW1vcmUgc3BhY2UgdGhlbiBvcmlnaW5hbCBmaWxlIHNpemUKLSAgICBSZURpbSBieXRhcnlDcHIobG5nQ3ByU2l6IC0gMSkKLSAgICBJZiBsbmdmbmNDcHIoYnl0YXJ5Q3ByKDApLCBsbmdDcHJTaXosIGJ5dGFyeU9yaSgwKSwgbG5nT3JpU2l6LCBpbnRMdmwpID0KLVNVQ0NFU1MgVGhlbgotICAgICAgICBsbmdwdnRQY25TbWwgPSAoMSMgLSAobG5nQ3ByU2l6IC8gbG5nT3JpU2l6KSkgKiAxMDAKLSAgICAgICAgUmVEaW0gUHJlc2VydmUgYnl0YXJ5Q3ByKGxuZ0NwclNpeiAtIDEpCi0gICAgICAgIE9wZW4gc3RyQ3ByUHRoIEZvciBCaW5hcnkgQWNjZXNzIFdyaXRlIEFzICMxCi0gICAgICAgICAgICBQdXQgIzEsICwgYnl0YXJ5Q3ByKCkKLSAgICAgICAgICAgIFB1dCAjMSwgLCBsbmdPcmlTaXogJ0FkZCB0aGUgdGhlIG9yaWdpbmFsIHNpemUgdmFsdWUgdG8gdGhlIGVuZAotKGxhc3QgNCBieXRlcykKLSAgICAgICAgQ2xvc2UgIzEKLSAgICBFbHNlCi0gICAgICAgIE1zZ0JveCAiQ29tcHJlc3Npb24gZXJyb3IiCi0gICAgRW5kIElmCi0gICAgRXJhc2UgYnl0YXJ5Q3ByCi0gICAgRXJhc2UgYnl0YXJ5T3JpCi1FbmQgU3ViCi0KLVB1YmxpYyBTdWIgc3ViVW5jb21wcmVzc0ZpbGUoQnlWYWwgc3RyYXJnRmlsUHRoIEFzIFN0cmluZykKLSAgICBEaW0gYnl0YXJ5Q3ByKCkgQXMgQnl0ZQotICAgIERpbSBieXRhcnlPcmkoKSBBcyBCeXRlCi0gICAgRGltIGxuZ09yaVNpeiBBcyBMb25nCi0gICAgRGltIGxuZ0NwclNpeiBBcyBMb25nCi0gICAgRGltIHN0ck9yaVB0aCBBcyBTdHJpbmcKLSAgICBsbmdDcHJTaXogPSBGaWxlTGVuKHN0cmFyZ0ZpbFB0aCkKLSAgICBSZURpbSBieXRhcnlDcHIobG5nQ3ByU2l6IC0gMSkKLSAgICBPcGVuIHN0cmFyZ0ZpbFB0aCBGb3IgQmluYXJ5IEFjY2VzcyBSZWFkIEFzICMxCi0gICAgICAgIEdldCAjMSwgLCBieXRhcnlDcHIoKQotICAgIENsb3NlICMxCi0gICAgJ1JlYWQgdGhlIG9yaWdpbmFsIGZpbGUgc2l6ZSB2YWx1ZToKLSAgICBsbmdPcmlTaXogPSBieXRhcnlDcHIobG5nQ3ByU2l6IC0gMSkgKiAoMiBeIDI0KSBfCi0gICAgICAgICAgICAgICsgYnl0YXJ5Q3ByKGxuZ0NwclNpeiAtIDIpICogKDIgXiAxNikgXwotICAgICAgICAgICAgICArIGJ5dGFyeUNwcihsbmdDcHJTaXogLSAzKSAqICgyIF4gOCkgXwotICAgICAgICAgICAgICArIGJ5dGFyeUNwcihsbmdDcHJTaXogLSA0KQotICAgIFJlRGltIFByZXNlcnZlIGJ5dGFyeUNwcihsbmdDcHJTaXogLSA1KSAnQ3V0IG9mIHRoZSBvcmlnaW5hbCBzaXplIHZhbHVlCi0gICAgUmVEaW0gYnl0YXJ5T3JpKGxuZ09yaVNpeiAtIDEpCi0gICAgSWYgbG5nZm5jVWNwKGJ5dGFyeU9yaSgwKSwgbG5nT3JpU2l6LCBieXRhcnlDcHIoMCksIGxuZ0NwclNpeikgPSBTVUNDRVNTCi1UaGVuCi0gICAgICAgIHN0ck9yaVB0aCA9IExlZnQoc3RyYXJnRmlsUHRoLCBMZW4oc3RyYXJnRmlsUHRoKSAtIExlbihzdHJGaWxFeHQpKQotICAgICAgICBPcGVuIHN0ck9yaVB0aCBGb3IgQmluYXJ5IEFjY2VzcyBXcml0ZSBBcyAjMQotICAgICAgICAgICAgUHV0ICMxLCAsIGJ5dGFyeU9yaSgpCi0gICAgICAgIENsb3NlICMxCi0gICAgRWxzZQotICAgICAgICBNc2dCb3ggIlVuY29tcHJlc3Npb24gZXJyb3IiCi0gICAgRW5kIElmCi0gICAgRXJhc2UgYnl0YXJ5Q3ByCi0gICAgRXJhc2UgYnl0YXJ5T3JpCi1FbmQgU3ViCi1QdWJsaWMgUHJvcGVydHkgR2V0IGxuZ1BlcmNlbnRTbWFsbGVyKCkgQXMgTG9uZwotICAgIGxuZ1BlcmNlbnRTbWFsbGVyID0gbG5ncHZ0UGNuU21sCi1FbmQgUHJvcGVydHkKZGlmZiAtLWdpdCBhL3NyYy96bGliL3FueC9wYWNrYWdlLnFwZyBiL3NyYy96bGliL3FueC9wYWNrYWdlLnFwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZlZWQ5Yi4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi9xbngvcGFja2FnZS5xcGcKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotPFFQRzpHZW5lcmF0aW9uPgotICAgPFFQRzpPcHRpb25zPgotICAgICAgPFFQRzpVc2VyIHVuYXR0ZW5kZWQ9Im5vIiB2ZXJib3NpdHk9IjIiIGxpc3RmaWxlcz0ieWVzIi8+Ci0gICAgICA8UVBHOkRlZmF1bHRzIHR5cGU9InFueF9wYWNrYWdlIi8+Ci0gICAgICA8UVBHOlNvdXJjZT48L1FQRzpTb3VyY2U+Ci0gICAgICA8UVBHOlJlbGVhc2UgbnVtYmVyPSIrIi8+Ci0gICAgICA8UVBHOkJ1aWxkPjwvUVBHOkJ1aWxkPgotICAgICAgPFFQRzpGaWxlU29ydGluZyBzdHJpcD0ieWVzIi8+Ci0gICAgICA8UVBHOlBhY2thZ2UgdGFyZ2V0cz0iY29tYmluZSIvPgotICAgICAgPFFQRzpSZXBvc2l0b3J5IGdlbmVyYXRlPSJ5ZXMiLz4KLSAgICAgIDxRUEc6RmluYWxEaXI+PC9RUEc6RmluYWxEaXI+Ci0gICAgICA8UVBHOkNsZWFudXA+PC9RUEc6Q2xlYW51cD4KLSAgIDwvUVBHOk9wdGlvbnM+Ci0KLSAgIDxRUEc6UmVzcG9uc2libGU+Ci0gICAgICA8UVBHOkNvbXBhbnk+PC9RUEc6Q29tcGFueT4KLSAgICAgIDxRUEc6RGVwYXJ0bWVudD48L1FQRzpEZXBhcnRtZW50PgotICAgICAgPFFQRzpHcm91cD48L1FQRzpHcm91cD4KLSAgICAgIDxRUEc6VGVhbT48L1FQRzpUZWFtPgotICAgICAgPFFQRzpFbXBsb3llZT48L1FQRzpFbXBsb3llZT4KLSAgICAgIDxRUEc6RW1haWxBZGRyZXNzPjwvUVBHOkVtYWlsQWRkcmVzcz4KLSAgIDwvUVBHOlJlc3BvbnNpYmxlPgotCi0gICA8UVBHOlZhbHVlcz4KLSAgICAgIDxRUEc6RmlsZXM+Ci0gICAgICAgICA8UVBHOkFkZCBmaWxlPSIuLi96Y29uZi5oIiBpbnN0YWxsPSIvb3B0L2luY2x1ZGUvIiB1c2VyPSJyb290OnN5cyIgcGVybWlzc2lvbj0iNjQ0Ii8+Ci0gICAgICAgICA8UVBHOkFkZCBmaWxlPSIuLi96bGliLmgiIGluc3RhbGw9Ii9vcHQvaW5jbHVkZS8iIHVzZXI9InJvb3Q6c3lzIiBwZXJtaXNzaW9uPSI2NDQiLz4KLSAgICAgICAgIDxRUEc6QWRkIGZpbGU9Ii4uL2xpYnouc28uMS4yLjciIGluc3RhbGw9Ii9vcHQvbGliLyIgdXNlcj0icm9vdDpiaW4iIHBlcm1pc3Npb249IjY0NCIvPgotICAgICAgICAgPFFQRzpBZGQgZmlsZT0ibGliei5zbyIgaW5zdGFsbD0iL29wdC9saWIvIiBjb21wb25lbnQ9ImRldiIgZmlsZXR5cGU9InN5bWxpbmsiIGxpbmt0bz0ibGliei5zby4xLjIuNyIvPgotICAgICAgICAgPFFQRzpBZGQgZmlsZT0ibGliei5zby4xIiBpbnN0YWxsPSIvb3B0L2xpYi8iIGZpbGV0eXBlPSJzeW1saW5rIiBsaW5rdG89ImxpYnouc28uMS4yLjciLz4KLSAgICAgICAgIDxRUEc6QWRkIGZpbGU9Ii4uL2xpYnouc28uMS4yLjciIGluc3RhbGw9Ii9vcHQvbGliLyIgY29tcG9uZW50PSJzbGliIi8+Ci0gICAgICA8L1FQRzpGaWxlcz4KLQotICAgICAgPFFQRzpQYWNrYWdlRmlsdGVyPgotICAgICAgICAgPFFQTTpQYWNrYWdlTWFuaWZlc3Q+Ci0gICAgICAgICAgICA8UVBNOlBhY2thZ2VEZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxRUE06UGFja2FnZVR5cGU+TGlicmFyeTwvUVBNOlBhY2thZ2VUeXBlPgotICAgICAgICAgICAgICAgPFFQTTpQYWNrYWdlUmVsZWFzZU5vdGVzPjwvUVBNOlBhY2thZ2VSZWxlYXNlTm90ZXM+Ci0gICAgICAgICAgICAgICA8UVBNOlBhY2thZ2VSZWxlYXNlVXJnZW5jeT5NZWRpdW08L1FQTTpQYWNrYWdlUmVsZWFzZVVyZ2VuY3k+Ci0gICAgICAgICAgICAgICA8UVBNOlBhY2thZ2VSZXBvc2l0b3J5PjwvUVBNOlBhY2thZ2VSZXBvc2l0b3J5PgotICAgICAgICAgICAgICAgPFFQTTpGaWxlVmVyc2lvbj4yLjA8L1FQTTpGaWxlVmVyc2lvbj4KLSAgICAgICAgICAgIDwvUVBNOlBhY2thZ2VEZXNjcmlwdGlvbj4KLQotICAgICAgICAgICAgPFFQTTpQcm9kdWN0RGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8UVBNOlByb2R1Y3ROYW1lPnpsaWI8L1FQTTpQcm9kdWN0TmFtZT4KLSAgICAgICAgICAgICAgIDxRUE06UHJvZHVjdElkZW50aWZpZXI+emxpYjwvUVBNOlByb2R1Y3RJZGVudGlmaWVyPgotICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0RW1haWw+YWxhaW4uYm9ubmVmb3lAaWNidC5jb208L1FQTTpQcm9kdWN0RW1haWw+Ci0gICAgICAgICAgICAgICA8UVBNOlZlbmRvck5hbWU+UHVibGljPC9RUE06VmVuZG9yTmFtZT4KLSAgICAgICAgICAgICAgIDxRUE06VmVuZG9ySW5zdGFsbE5hbWU+cHVibGljPC9RUE06VmVuZG9ySW5zdGFsbE5hbWU+Ci0gICAgICAgICAgICAgICA8UVBNOlZlbmRvclVSTD53d3cuZ3ppcC5vcmcvemxpYjwvUVBNOlZlbmRvclVSTD4KLSAgICAgICAgICAgICAgIDxRUE06VmVuZG9yRW1iZWRVUkw+PC9RUE06VmVuZG9yRW1iZWRVUkw+Ci0gICAgICAgICAgICAgICA8UVBNOlZlbmRvckVtYWlsPjwvUVBNOlZlbmRvckVtYWlsPgotICAgICAgICAgICAgICAgPFFQTTpBdXRob3JOYW1lPkplYW4tTG91cCBHYWlsbHksTWFyayBBZGxlcjwvUVBNOkF1dGhvck5hbWU+Ci0gICAgICAgICAgICAgICA8UVBNOkF1dGhvclVSTD53d3cuZ3ppcC5vcmcvemxpYjwvUVBNOkF1dGhvclVSTD4KLSAgICAgICAgICAgICAgIDxRUE06QXV0aG9yRW1iZWRVUkw+PC9RUE06QXV0aG9yRW1iZWRVUkw+Ci0gICAgICAgICAgICAgICA8UVBNOkF1dGhvckVtYWlsPnpsaWJAZ3ppcC5vcmc8L1FQTTpBdXRob3JFbWFpbD4KLSAgICAgICAgICAgICAgIDxRUE06UHJvZHVjdEljb25TbWFsbD48L1FQTTpQcm9kdWN0SWNvblNtYWxsPgotICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0SWNvbkxhcmdlPjwvUVBNOlByb2R1Y3RJY29uTGFyZ2U+Ci0gICAgICAgICAgICAgICA8UVBNOlByb2R1Y3REZXNjcmlwdGlvblNob3J0PkEgbWFzc2l2ZWx5IHNwaWZmeSB5ZXQgZGVsaWNhdGVseSB1bm9idHJ1c2l2ZSBjb21wcmVzc2lvbiBsaWJyYXJ5LjwvUVBNOlByb2R1Y3REZXNjcmlwdGlvblNob3J0PgotICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0RGVzY3JpcHRpb25Mb25nPnpsaWIgaXMgZGVzaWduZWQgdG8gYmUgYSBmcmVlLCBnZW5lcmFsLXB1cnBvc2UsIGxlZ2FsbHkgdW5lbmN1bWJlcmVkLCBsb3NzbGVzcyBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkgZm9yIHVzZSBvbiB2aXJ0dWFsbHkgYW55IGNvbXB1dGVyIGhhcmR3YXJlIGFuZCBvcGVyYXRpbmcgc3lzdGVtLjwvUVBNOlByb2R1Y3REZXNjcmlwdGlvbkxvbmc+Ci0gICAgICAgICAgICAgICA8UVBNOlByb2R1Y3REZXNjcmlwdGlvblVSTD5odHRwOi8vd3d3Lmd6aXAub3JnL3psaWI8L1FQTTpQcm9kdWN0RGVzY3JpcHRpb25VUkw+Ci0gICAgICAgICAgICAgICA8UVBNOlByb2R1Y3REZXNjcmlwdGlvbkVtYmVkVVJMPjwvUVBNOlByb2R1Y3REZXNjcmlwdGlvbkVtYmVkVVJMPgotICAgICAgICAgICAgPC9RUE06UHJvZHVjdERlc2NyaXB0aW9uPgotCi0gICAgICAgICAgICA8UVBNOlJlbGVhc2VEZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxRUE06UmVsZWFzZVZlcnNpb24+MS4yLjc8L1FQTTpSZWxlYXNlVmVyc2lvbj4KLSAgICAgICAgICAgICAgIDxRUE06UmVsZWFzZVVyZ2VuY3k+TWVkaXVtPC9RUE06UmVsZWFzZVVyZ2VuY3k+Ci0gICAgICAgICAgICAgICA8UVBNOlJlbGVhc2VTdGFiaWxpdHk+U3RhYmxlPC9RUE06UmVsZWFzZVN0YWJpbGl0eT4KLSAgICAgICAgICAgICAgIDxRUE06UmVsZWFzZU5vdGVNaW5vcj48L1FQTTpSZWxlYXNlTm90ZU1pbm9yPgotICAgICAgICAgICAgICAgPFFQTTpSZWxlYXNlTm90ZU1ham9yPjwvUVBNOlJlbGVhc2VOb3RlTWFqb3I+Ci0gICAgICAgICAgICAgICA8UVBNOkV4Y2x1ZGVDb3VudHJpZXM+Ci0gICAgICAgICAgICAgICAgICA8UVBNOkNvdW50cnk+PC9RUE06Q291bnRyeT4KLSAgICAgICAgICAgICAgIDwvUVBNOkV4Y2x1ZGVDb3VudHJpZXM+Ci0KLSAgICAgICAgICAgICAgIDxRUE06UmVsZWFzZUNvcHlyaWdodD5ObyBMaWNlbnNlPC9RUE06UmVsZWFzZUNvcHlyaWdodD4KLSAgICAgICAgICAgIDwvUVBNOlJlbGVhc2VEZXNjcmlwdGlvbj4KLQotICAgICAgICAgICAgPFFQTTpDb250ZW50RGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8UVBNOkNvbnRlbnRUb3BpYyB4bWxtdWx0aXBsZT0idHJ1ZSI+U29mdHdhcmUgRGV2ZWxvcG1lbnQvTGlicmFyaWVzIGFuZCBFeHRlbnNpb25zL0MgTGlicmFyaWVzPC9RUE06Q29udGVudFRvcGljPgotICAgICAgICAgICAgICAgPFFQTTpDb250ZW50S2V5d29yZD56bGliLGNvbXByZXNzaW9uPC9RUE06Q29udGVudEtleXdvcmQ+Ci0gICAgICAgICAgICAgICA8UVBNOlRhcmdldE9TPnFueDY8L1FQTTpUYXJnZXRPUz4KLSAgICAgICAgICAgICAgIDxRUE06SG9zdE9TPnFueDY8L1FQTTpIb3N0T1M+Ci0gICAgICAgICAgICAgICA8UVBNOkRpc3BsYXlFbnZpcm9ubWVudCB4bWxtdWx0aXBsZT0idHJ1ZSI+Tm9uZTwvUVBNOkRpc3BsYXlFbnZpcm9ubWVudD4KLSAgICAgICAgICAgICAgIDxRUE06VGFyZ2V0QXVkaWVuY2UgeG1sbXVsdGlwbGU9InRydWUiPkRldmVsb3BlcjwvUVBNOlRhcmdldEF1ZGllbmNlPgotICAgICAgICAgICAgPC9RUE06Q29udGVudERlc2NyaXB0aW9uPgotICAgICAgICAgPC9RUE06UGFja2FnZU1hbmlmZXN0PgotICAgICAgPC9RUEc6UGFja2FnZUZpbHRlcj4KLQotICAgICAgPFFQRzpQYWNrYWdlRmlsdGVyIHByb2M9Im5vbmUiIHRhcmdldD0ibm9uZSI+Ci0gICAgICAgICA8UVBNOlBhY2thZ2VNYW5pZmVzdD4KLSAgICAgICAgICAgIDxRUE06UHJvZHVjdEluc3RhbGxhdGlvbkRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgIDxRUE06UHJvZHVjdFJlcXVpcmVtZW50cz48L1FQTTpQcm9kdWN0UmVxdWlyZW1lbnRzPgotICAgICAgICAgICAgPC9RUE06UHJvZHVjdEluc3RhbGxhdGlvbkRlcGVuZGVuY2llcz4KLQotICAgICAgICAgICAgPFFQTTpQcm9kdWN0SW5zdGFsbGF0aW9uUHJvY2VkdXJlPgotICAgICAgICAgICAgICAgPFFQTTpTY3JpcHQgeG1sbXVsdGlwbGU9InRydWUiPgotICAgICAgICAgICAgICAgICAgPFFQTTpTY3JpcHROYW1lPjwvUVBNOlNjcmlwdE5hbWU+Ci0gICAgICAgICAgICAgICAgICA8UVBNOlNjcmlwdFR5cGU+SW5zdGFsbDwvUVBNOlNjcmlwdFR5cGU+Ci0gICAgICAgICAgICAgICAgICA8UVBNOlNjcmlwdFRpbWluZz5Qb3N0PC9RUE06U2NyaXB0VGltaW5nPgotICAgICAgICAgICAgICAgICAgPFFQTTpTY3JpcHRCbG9ja2luZz5ObzwvUVBNOlNjcmlwdEJsb2NraW5nPgotICAgICAgICAgICAgICAgICAgPFFQTTpTY3JpcHRSZXN1bHQ+SWdub3JlPC9RUE06U2NyaXB0UmVzdWx0PgotICAgICAgICAgICAgICAgICAgPFFQTTpTaG9ydERlc2NyaXB0aW9uPjwvUVBNOlNob3J0RGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8UVBNOlVzZUJpbmFyaWVzPk5vPC9RUE06VXNlQmluYXJpZXM+Ci0gICAgICAgICAgICAgICAgICA8UVBNOlByaW9yaXR5Pk9wdGlvbmFsPC9RUE06UHJpb3JpdHk+Ci0gICAgICAgICAgICAgICA8L1FQTTpTY3JpcHQ+Ci0gICAgICAgICAgICA8L1FQTTpQcm9kdWN0SW5zdGFsbGF0aW9uUHJvY2VkdXJlPgotICAgICAgICAgPC9RUE06UGFja2FnZU1hbmlmZXN0PgotCi0gICAgICAgICA8UVBNOkxhdW5jaD4KLSAgICAgICAgIDwvUVBNOkxhdW5jaD4KLSAgICAgIDwvUVBHOlBhY2thZ2VGaWx0ZXI+Ci0KLSAgICAgIDxRUEc6UGFja2FnZUZpbHRlciB0eXBlPSJjb3JlIiBjb21wb25lbnQ9Im5vbmUiPgotICAgICAgICAgPFFQTTpQYWNrYWdlTWFuaWZlc3Q+Ci0gICAgICAgICAgICA8UVBNOlByb2R1Y3RJbnN0YWxsYXRpb25Qcm9jZWR1cmU+Ci0JICAgICAgIDxRUE06T3JkZXJEZXBlbmRlbmN5IHhtbG11bHRpcGxlPSJ0cnVlIj4KLQkgICAgICAgICAgPFFQTTpPcmRlcj5JbnN0YWxsT3ZlcjwvUVBNOk9yZGVyPgotCSAgICAgICAgICA8UVBNOlByb2R1Y3Q+emxpYjwvUVBNOlByb2R1Y3Q+Ci0JICAgICAgIDwvUVBNOk9yZGVyRGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvUVBNOlByb2R1Y3RJbnN0YWxsYXRpb25Qcm9jZWR1cmU+Ci0gICAgICAgICA8L1FQTTpQYWNrYWdlTWFuaWZlc3Q+Ci0KLSAgICAgICAgIDxRUE06TGF1bmNoPgotICAgICAgICAgPC9RUE06TGF1bmNoPgotICAgICAgPC9RUEc6UGFja2FnZUZpbHRlcj4KLQotICAgICAgPFFQRzpQYWNrYWdlRmlsdGVyIHR5cGU9ImNvcmUiIGNvbXBvbmVudD0iZGV2Ij4KLSAgICAgICAgIDxRUE06UGFja2FnZU1hbmlmZXN0PgotICAgICAgICAgICAgPFFQTTpQcm9kdWN0SW5zdGFsbGF0aW9uUHJvY2VkdXJlPgotCSAgICAgICA8UVBNOk9yZGVyRGVwZW5kZW5jeSB4bWxtdWx0aXBsZT0idHJ1ZSI+Ci0JICAgICAgICAgIDxRUE06T3JkZXI+SW5zdGFsbE92ZXI8L1FQTTpPcmRlcj4KLQkgICAgICAgICAgPFFQTTpQcm9kdWN0PnpsaWItZGV2PC9RUE06UHJvZHVjdD4KLQkgICAgICAgPC9RUE06T3JkZXJEZXBlbmRlbmN5PgotICAgICAgICAgICAgPC9RUE06UHJvZHVjdEluc3RhbGxhdGlvblByb2NlZHVyZT4KLSAgICAgICAgIDwvUVBNOlBhY2thZ2VNYW5pZmVzdD4KLQotICAgICAgICAgPFFQTTpMYXVuY2g+Ci0gICAgICAgICA8L1FQTTpMYXVuY2g+Ci0gICAgICA8L1FQRzpQYWNrYWdlRmlsdGVyPgotICAgPC9RUEc6VmFsdWVzPgotPC9RUEc6R2VuZXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NyYy96bGliL3Rlc3QvZXhhbXBsZS5jIGIvc3JjL3psaWIvdGVzdC9leGFtcGxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MTVhNDguLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvdGVzdC9leGFtcGxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDEgKzAsMCBAQAotLyogZXhhbXBsZS5jIC0tIHVzYWdlIGV4YW1wbGUgb2YgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDYsIDIwMTEgSmVhbi1sb3VwIEdhaWxseS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotI2luY2x1ZGUgInpsaWIuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgU1REQwotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoUklTQ09TKQotIyAgZGVmaW5lIFRFU1RGSUxFICJmb28tZ3oiCi0jZWxzZQotIyAgZGVmaW5lIFRFU1RGSUxFICJmb28uZ3oiCi0jZW5kaWYKLQotI2RlZmluZSBDSEVDS19FUlIoZXJyLCBtc2cpIHsgXAotICAgIGlmIChlcnIgIT0gWl9PSykgeyBcCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgZXJyb3I6ICVkXG4iLCBtc2csIGVycik7IFwKLSAgICAgICAgZXhpdCgxKTsgXAotICAgIH0gXAotfQotCi1jb25zdCBjaGFyIGhlbGxvW10gPSAiaGVsbG8sIGhlbGxvISI7Ci0vKiAiaGVsbG8gd29ybGQiIHdvdWxkIGJlIG1vcmUgc3RhbmRhcmQsIGJ1dCB0aGUgcmVwZWF0ZWQgImhlbGxvIgotICogc3RyZXNzZXMgdGhlIGNvbXByZXNzaW9uIGNvZGUgYmV0dGVyLCBzb3JyeS4uLgotICovCi0KLWNvbnN0IGNoYXIgZGljdGlvbmFyeVtdID0gImhlbGxvIjsKLXVMb25nIGRpY3RJZDsgLyogQWRsZXIzMiB2YWx1ZSBvZiB0aGUgZGljdGlvbmFyeSAqLwotCi12b2lkIHRlc3RfZGVmbGF0ZSAgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuKSk7Ci12b2lkIHRlc3RfaW5mbGF0ZSAgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKLXZvaWQgdGVzdF9sYXJnZV9kZWZsYXRlIE9GKChCeXRlICpjb21wciwgdUxvbmcgY29tcHJMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwotdm9pZCB0ZXN0X2xhcmdlX2luZmxhdGUgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7Ci12b2lkIHRlc3RfZmx1c2ggICAgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nICpjb21wckxlbikpOwotdm9pZCB0ZXN0X3N5bmMgICAgICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7Ci12b2lkIHRlc3RfZGljdF9kZWZsYXRlICBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuKSk7Ci12b2lkIHRlc3RfZGljdF9pbmZsYXRlICBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKLWludCAgbWFpbiAgICAgICAgICAgICAgIE9GKChpbnQgYXJnYywgY2hhciAqYXJndltdKSk7Ci0KLQotI2lmZGVmIFpfU09MTwotCi12b2lkICpteWFsbG9jIE9GKCh2b2lkICosIHVuc2lnbmVkLCB1bnNpZ25lZCkpOwotdm9pZCBteWZyZWUgT0YoKHZvaWQgKiwgdm9pZCAqKSk7Ci0KLXZvaWQgKm15YWxsb2MocSwgbiwgbSkKLSAgICB2b2lkICpxOwotICAgIHVuc2lnbmVkIG4sIG07Ci17Ci0gICAgcSA9IFpfTlVMTDsKLSAgICByZXR1cm4gY2FsbG9jKG4sIG0pOwotfQotCi12b2lkIG15ZnJlZSh2b2lkICpxLCB2b2lkICpwKQotewotICAgIHEgPSBaX05VTEw7Ci0gICAgZnJlZShwKTsKLX0KLQotc3RhdGljIGFsbG9jX2Z1bmMgemFsbG9jID0gbXlhbGxvYzsKLXN0YXRpYyBmcmVlX2Z1bmMgemZyZWUgPSBteWZyZWU7Ci0KLSNlbHNlIC8qICFaX1NPTE8gKi8KLQotc3RhdGljIGFsbG9jX2Z1bmMgemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKLXN0YXRpYyBmcmVlX2Z1bmMgemZyZWUgPSAoZnJlZV9mdW5jKTA7Ci0KLXZvaWQgdGVzdF9jb21wcmVzcyAgICAgIE9GKChCeXRlICpjb21wciwgdUxvbmcgY29tcHJMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwotdm9pZCB0ZXN0X2d6aW8gICAgICAgICAgT0YoKGNvbnN0IGNoYXIgKmZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGNvbXByZXNzKCkgYW5kIHVuY29tcHJlc3MoKQotICovCi12b2lkIHRlc3RfY29tcHJlc3MoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKQotICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKLSAgICB1TG9uZyBjb21wckxlbiwgdW5jb21wckxlbjsKLXsKLSAgICBpbnQgZXJyOwotICAgIHVMb25nIGxlbiA9ICh1TG9uZylzdHJsZW4oaGVsbG8pKzE7Ci0KLSAgICBlcnIgPSBjb21wcmVzcyhjb21wciwgJmNvbXByTGVuLCAoY29uc3QgQnl0ZWYqKWhlbGxvLCBsZW4pOwotICAgIENIRUNLX0VSUihlcnIsICJjb21wcmVzcyIpOwotCi0gICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOwotCi0gICAgZXJyID0gdW5jb21wcmVzcyh1bmNvbXByLCAmdW5jb21wckxlbiwgY29tcHIsIGNvbXByTGVuKTsKLSAgICBDSEVDS19FUlIoZXJyLCAidW5jb21wcmVzcyIpOwotCi0gICAgaWYgKHN0cmNtcCgoY2hhciopdW5jb21wciwgaGVsbG8pKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFkIHVuY29tcHJlc3NcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigidW5jb21wcmVzcygpOiAlc1xuIiwgKGNoYXIgKil1bmNvbXByKTsKLSAgICB9Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGVzdCByZWFkL3dyaXRlIG9mIC5neiBmaWxlcwotICovCi12b2lkIHRlc3RfZ3ppbyhmbmFtZSwgdW5jb21wciwgdW5jb21wckxlbikKLSAgICBjb25zdCBjaGFyICpmbmFtZTsgLyogY29tcHJlc3NlZCBmaWxlIG5hbWUgKi8KLSAgICBCeXRlICp1bmNvbXByOwotICAgIHVMb25nIHVuY29tcHJMZW47Ci17Ci0jaWZkZWYgTk9fR1pDT01QUkVTUwotICAgIGZwcmludGYoc3RkZXJyLCAiTk9fR1pDT01QUkVTUyAtLSBneiogZnVuY3Rpb25zIGNhbm5vdCBjb21wcmVzc1xuIik7Ci0jZWxzZQotICAgIGludCBlcnI7Ci0gICAgaW50IGxlbiA9IChpbnQpc3RybGVuKGhlbGxvKSsxOwotICAgIGd6RmlsZSBmaWxlOwotICAgIHpfb2ZmX3QgcG9zOwotCi0gICAgZmlsZSA9IGd6b3BlbihmbmFtZSwgIndiIik7Ci0gICAgaWYgKGZpbGUgPT0gTlVMTCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6b3BlbiBlcnJvclxuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIGd6cHV0YyhmaWxlLCAnaCcpOwotICAgIGlmIChnenB1dHMoZmlsZSwgImVsbG8iKSAhPSA0KSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pwdXRzIGVycjogJXNcbiIsIGd6ZXJyb3IoZmlsZSwgJmVycikpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBpZiAoZ3pwcmludGYoZmlsZSwgIiwgJXMhIiwgImhlbGxvIikgIT0gOCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6cHJpbnRmIGVycjogJXNcbiIsIGd6ZXJyb3IoZmlsZSwgJmVycikpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBnenNlZWsoZmlsZSwgMUwsIFNFRUtfQ1VSKTsgLyogYWRkIG9uZSB6ZXJvIGJ5dGUgKi8KLSAgICBnemNsb3NlKGZpbGUpOwotCi0gICAgZmlsZSA9IGd6b3BlbihmbmFtZSwgInJiIik7Ci0gICAgaWYgKGZpbGUgPT0gTlVMTCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6b3BlbiBlcnJvclxuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIHN0cmNweSgoY2hhciopdW5jb21wciwgImdhcmJhZ2UiKTsKLQotICAgIGlmIChnenJlYWQoZmlsZSwgdW5jb21wciwgKHVuc2lnbmVkKXVuY29tcHJMZW4pICE9IGxlbikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6cmVhZCBlcnI6ICVzXG4iLCBnemVycm9yKGZpbGUsICZlcnIpKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgaWYgKHN0cmNtcCgoY2hhciopdW5jb21wciwgaGVsbG8pKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFkIGd6cmVhZDogJXNcbiIsIChjaGFyKil1bmNvbXByKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoImd6cmVhZCgpOiAlc1xuIiwgKGNoYXIqKXVuY29tcHIpOwotICAgIH0KLQotICAgIHBvcyA9IGd6c2VlayhmaWxlLCAtOEwsIFNFRUtfQ1VSKTsKLSAgICBpZiAocG9zICE9IDYgfHwgZ3p0ZWxsKGZpbGUpICE9IHBvcykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6c2VlayBlcnJvciwgcG9zPSVsZCwgZ3p0ZWxsPSVsZFxuIiwKLSAgICAgICAgICAgICAgICAobG9uZylwb3MsIChsb25nKWd6dGVsbChmaWxlKSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgaWYgKGd6Z2V0YyhmaWxlKSAhPSAnICcpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJnemdldGMgZXJyb3JcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGlmIChnenVuZ2V0YygnICcsIGZpbGUpICE9ICcgJykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6dW5nZXRjIGVycm9yXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBnemdldHMoZmlsZSwgKGNoYXIqKXVuY29tcHIsIChpbnQpdW5jb21wckxlbik7Ci0gICAgaWYgKHN0cmxlbigoY2hhciopdW5jb21wcikgIT0gNykgeyAvKiAiIGhlbGxvISIgKi8KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJnemdldHMgZXJyIGFmdGVyIGd6c2VlazogJXNcbiIsIGd6ZXJyb3IoZmlsZSwgJmVycikpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbyArIDYpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFkIGd6Z2V0cyBhZnRlciBnenNlZWtcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiZ3pnZXRzKCkgYWZ0ZXIgZ3pzZWVrOiAlc1xuIiwgKGNoYXIqKXVuY29tcHIpOwotICAgIH0KLQotICAgIGd6Y2xvc2UoZmlsZSk7Ci0jZW5kaWYKLX0KLQotI2VuZGlmIC8qIFpfU09MTyAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRlc3QgZGVmbGF0ZSgpIHdpdGggc21hbGwgYnVmZmVycwotICovCi12b2lkIHRlc3RfZGVmbGF0ZShjb21wciwgY29tcHJMZW4pCi0gICAgQnl0ZSAqY29tcHI7Ci0gICAgdUxvbmcgY29tcHJMZW47Ci17Ci0gICAgel9zdHJlYW0gY19zdHJlYW07IC8qIGNvbXByZXNzaW9uIHN0cmVhbSAqLwotICAgIGludCBlcnI7Ci0gICAgdUxvbmcgbGVuID0gKHVMb25nKXN0cmxlbihoZWxsbykrMTsKLQotICAgIGNfc3RyZWFtLnphbGxvYyA9IHphbGxvYzsKLSAgICBjX3N0cmVhbS56ZnJlZSA9IHpmcmVlOwotICAgIGNfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKLQotICAgIGVyciA9IGRlZmxhdGVJbml0KCZjX3N0cmVhbSwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZUluaXQiKTsKLQotICAgIGNfc3RyZWFtLm5leHRfaW4gID0gKEJ5dGVmKiloZWxsbzsKLSAgICBjX3N0cmVhbS5uZXh0X291dCA9IGNvbXByOwotCi0gICAgd2hpbGUgKGNfc3RyZWFtLnRvdGFsX2luICE9IGxlbiAmJiBjX3N0cmVhbS50b3RhbF9vdXQgPCBjb21wckxlbikgewotICAgICAgICBjX3N0cmVhbS5hdmFpbF9pbiA9IGNfc3RyZWFtLmF2YWlsX291dCA9IDE7IC8qIGZvcmNlIHNtYWxsIGJ1ZmZlcnMgKi8KLSAgICAgICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfTk9fRkxVU0gpOwotICAgICAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOwotICAgIH0KLSAgICAvKiBGaW5pc2ggdGhlIHN0cmVhbSwgc3RpbGwgZm9yY2luZyBzbWFsbCBidWZmZXJzOiAqLwotICAgIGZvciAoOzspIHsKLSAgICAgICAgY19zdHJlYW0uYXZhaWxfb3V0ID0gMTsKLSAgICAgICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfRklOSVNIKTsKLSAgICAgICAgaWYgKGVyciA9PSBaX1NUUkVBTV9FTkQpIGJyZWFrOwotICAgICAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOwotICAgIH0KLQotICAgIGVyciA9IGRlZmxhdGVFbmQoJmNfc3RyZWFtKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZUVuZCIpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRlc3QgaW5mbGF0ZSgpIHdpdGggc21hbGwgYnVmZmVycwotICovCi12b2lkIHRlc3RfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pCi0gICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOwotICAgIHVMb25nIGNvbXByTGVuLCB1bmNvbXByTGVuOwotewotICAgIGludCBlcnI7Ci0gICAgel9zdHJlYW0gZF9zdHJlYW07IC8qIGRlY29tcHJlc3Npb24gc3RyZWFtICovCi0KLSAgICBzdHJjcHkoKGNoYXIqKXVuY29tcHIsICJnYXJiYWdlIik7Ci0KLSAgICBkX3N0cmVhbS56YWxsb2MgPSB6YWxsb2M7Ci0gICAgZF9zdHJlYW0uemZyZWUgPSB6ZnJlZTsKLSAgICBkX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7Ci0KLSAgICBkX3N0cmVhbS5uZXh0X2luICA9IGNvbXByOwotICAgIGRfc3RyZWFtLmF2YWlsX2luID0gMDsKLSAgICBkX3N0cmVhbS5uZXh0X291dCA9IHVuY29tcHI7Ci0KLSAgICBlcnIgPSBpbmZsYXRlSW5pdCgmZF9zdHJlYW0pOwotICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlSW5pdCIpOwotCi0gICAgd2hpbGUgKGRfc3RyZWFtLnRvdGFsX291dCA8IHVuY29tcHJMZW4gJiYgZF9zdHJlYW0udG90YWxfaW4gPCBjb21wckxlbikgewotICAgICAgICBkX3N0cmVhbS5hdmFpbF9pbiA9IGRfc3RyZWFtLmF2YWlsX291dCA9IDE7IC8qIGZvcmNlIHNtYWxsIGJ1ZmZlcnMgKi8KLSAgICAgICAgZXJyID0gaW5mbGF0ZSgmZF9zdHJlYW0sIFpfTk9fRkxVU0gpOwotICAgICAgICBpZiAoZXJyID09IFpfU1RSRUFNX0VORCkgYnJlYWs7Ci0gICAgICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlIik7Ci0gICAgfQotCi0gICAgZXJyID0gaW5mbGF0ZUVuZCgmZF9zdHJlYW0pOwotICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlRW5kIik7Ci0KLSAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbykpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgaW5mbGF0ZVxuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCJpbmZsYXRlKCk6ICVzXG4iLCAoY2hhciAqKXVuY29tcHIpOwotICAgIH0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGRlZmxhdGUoKSB3aXRoIGxhcmdlIGJ1ZmZlcnMgYW5kIGR5bmFtaWMgY2hhbmdlIG9mIGNvbXByZXNzaW9uIGxldmVsCi0gKi8KLXZvaWQgdGVzdF9sYXJnZV9kZWZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbikKLSAgICBCeXRlICpjb21wciwgKnVuY29tcHI7Ci0gICAgdUxvbmcgY29tcHJMZW4sIHVuY29tcHJMZW47Ci17Ci0gICAgel9zdHJlYW0gY19zdHJlYW07IC8qIGNvbXByZXNzaW9uIHN0cmVhbSAqLwotICAgIGludCBlcnI7Ci0KLSAgICBjX3N0cmVhbS56YWxsb2MgPSB6YWxsb2M7Ci0gICAgY19zdHJlYW0uemZyZWUgPSB6ZnJlZTsKLSAgICBjX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7Ci0KLSAgICBlcnIgPSBkZWZsYXRlSW5pdCgmY19zdHJlYW0sIFpfQkVTVF9TUEVFRCk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVJbml0Iik7Ci0KLSAgICBjX3N0cmVhbS5uZXh0X291dCA9IGNvbXByOwotICAgIGNfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KWNvbXByTGVuOwotCi0gICAgLyogQXQgdGhpcyBwb2ludCwgdW5jb21wciBpcyBzdGlsbCBtb3N0bHkgemVyb2VzLCBzbyBpdCBzaG91bGQgY29tcHJlc3MKLSAgICAgKiB2ZXJ5IHdlbGw6Ci0gICAgICovCi0gICAgY19zdHJlYW0ubmV4dF9pbiA9IHVuY29tcHI7Ci0gICAgY19zdHJlYW0uYXZhaWxfaW4gPSAodUludCl1bmNvbXByTGVuOwotICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOwotICAgIGlmIChjX3N0cmVhbS5hdmFpbF9pbiAhPSAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmbGF0ZSBub3QgZ3JlZWR5XG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICAvKiBGZWVkIGluIGFscmVhZHkgY29tcHJlc3NlZCBkYXRhIGFuZCBzd2l0Y2ggdG8gbm8gY29tcHJlc3Npb246ICovCi0gICAgZGVmbGF0ZVBhcmFtcygmY19zdHJlYW0sIFpfTk9fQ09NUFJFU1NJT04sIFpfREVGQVVMVF9TVFJBVEVHWSk7Ci0gICAgY19zdHJlYW0ubmV4dF9pbiA9IGNvbXByOwotICAgIGNfc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpY29tcHJMZW4vMjsKLSAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9OT19GTFVTSCk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGUiKTsKLQotICAgIC8qIFN3aXRjaCBiYWNrIHRvIGNvbXByZXNzaW5nIG1vZGU6ICovCi0gICAgZGVmbGF0ZVBhcmFtcygmY19zdHJlYW0sIFpfQkVTVF9DT01QUkVTU0lPTiwgWl9GSUxURVJFRCk7Ci0gICAgY19zdHJlYW0ubmV4dF9pbiA9IHVuY29tcHI7Ci0gICAgY19zdHJlYW0uYXZhaWxfaW4gPSAodUludCl1bmNvbXByTGVuOwotICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOwotCi0gICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfRklOSVNIKTsKLSAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRlZmxhdGUgc2hvdWxkIHJlcG9ydCBaX1NUUkVBTV9FTkRcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBlcnIgPSBkZWZsYXRlRW5kKCZjX3N0cmVhbSk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVFbmQiKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGluZmxhdGUoKSB3aXRoIGxhcmdlIGJ1ZmZlcnMKLSAqLwotdm9pZCB0ZXN0X2xhcmdlX2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKQotICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKLSAgICB1TG9uZyBjb21wckxlbiwgdW5jb21wckxlbjsKLXsKLSAgICBpbnQgZXJyOwotICAgIHpfc3RyZWFtIGRfc3RyZWFtOyAvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLwotCi0gICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOwotCi0gICAgZF9zdHJlYW0uemFsbG9jID0gemFsbG9jOwotICAgIGRfc3RyZWFtLnpmcmVlID0gemZyZWU7Ci0gICAgZF9zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwotCi0gICAgZF9zdHJlYW0ubmV4dF9pbiAgPSBjb21wcjsKLSAgICBkX3N0cmVhbS5hdmFpbF9pbiA9ICh1SW50KWNvbXByTGVuOwotCi0gICAgZXJyID0gaW5mbGF0ZUluaXQoJmRfc3RyZWFtKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUluaXQiKTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgZF9zdHJlYW0ubmV4dF9vdXQgPSB1bmNvbXByOyAgICAgICAgICAgIC8qIGRpc2NhcmQgdGhlIG91dHB1dCAqLwotICAgICAgICBkX3N0cmVhbS5hdmFpbF9vdXQgPSAodUludCl1bmNvbXByTGVuOwotICAgICAgICBlcnIgPSBpbmZsYXRlKCZkX3N0cmVhbSwgWl9OT19GTFVTSCk7Ci0gICAgICAgIGlmIChlcnIgPT0gWl9TVFJFQU1fRU5EKSBicmVhazsKLSAgICAgICAgQ0hFQ0tfRVJSKGVyciwgImxhcmdlIGluZmxhdGUiKTsKLSAgICB9Ci0KLSAgICBlcnIgPSBpbmZsYXRlRW5kKCZkX3N0cmVhbSk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVFbmQiKTsKLQotICAgIGlmIChkX3N0cmVhbS50b3RhbF9vdXQgIT0gMip1bmNvbXByTGVuICsgY29tcHJMZW4vMikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBsYXJnZSBpbmZsYXRlOiAlbGRcbiIsIGRfc3RyZWFtLnRvdGFsX291dCk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCJsYXJnZV9pbmZsYXRlKCk6IE9LXG4iKTsKLSAgICB9Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGVzdCBkZWZsYXRlKCkgd2l0aCBmdWxsIGZsdXNoCi0gKi8KLXZvaWQgdGVzdF9mbHVzaChjb21wciwgY29tcHJMZW4pCi0gICAgQnl0ZSAqY29tcHI7Ci0gICAgdUxvbmcgKmNvbXByTGVuOwotewotICAgIHpfc3RyZWFtIGNfc3RyZWFtOyAvKiBjb21wcmVzc2lvbiBzdHJlYW0gKi8KLSAgICBpbnQgZXJyOwotICAgIHVJbnQgbGVuID0gKHVJbnQpc3RybGVuKGhlbGxvKSsxOwotCi0gICAgY19zdHJlYW0uemFsbG9jID0gemFsbG9jOwotICAgIGNfc3RyZWFtLnpmcmVlID0gemZyZWU7Ci0gICAgY19zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwotCi0gICAgZXJyID0gZGVmbGF0ZUluaXQoJmNfc3RyZWFtLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOwotICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlSW5pdCIpOwotCi0gICAgY19zdHJlYW0ubmV4dF9pbiAgPSAoQnl0ZWYqKWhlbGxvOwotICAgIGNfc3RyZWFtLm5leHRfb3V0ID0gY29tcHI7Ci0gICAgY19zdHJlYW0uYXZhaWxfaW4gPSAzOwotICAgIGNfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KSpjb21wckxlbjsKLSAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9GVUxMX0ZMVVNIKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOwotCi0gICAgY29tcHJbM10rKzsgLyogZm9yY2UgYW4gZXJyb3IgaW4gZmlyc3QgY29tcHJlc3NlZCBibG9jayAqLwotICAgIGNfc3RyZWFtLmF2YWlsX2luID0gbGVuIC0gMzsKLQotICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX0ZJTklTSCk7Ci0gICAgaWYgKGVyciAhPSBaX1NUUkVBTV9FTkQpIHsKLSAgICAgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGUiKTsKLSAgICB9Ci0gICAgZXJyID0gZGVmbGF0ZUVuZCgmY19zdHJlYW0pOwotICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlRW5kIik7Ci0KLSAgICAqY29tcHJMZW4gPSBjX3N0cmVhbS50b3RhbF9vdXQ7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGVzdCBpbmZsYXRlU3luYygpCi0gKi8KLXZvaWQgdGVzdF9zeW5jKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbikKLSAgICBCeXRlICpjb21wciwgKnVuY29tcHI7Ci0gICAgdUxvbmcgY29tcHJMZW4sIHVuY29tcHJMZW47Ci17Ci0gICAgaW50IGVycjsKLSAgICB6X3N0cmVhbSBkX3N0cmVhbTsgLyogZGVjb21wcmVzc2lvbiBzdHJlYW0gKi8KLQotICAgIHN0cmNweSgoY2hhciopdW5jb21wciwgImdhcmJhZ2UiKTsKLQotICAgIGRfc3RyZWFtLnphbGxvYyA9IHphbGxvYzsKLSAgICBkX3N0cmVhbS56ZnJlZSA9IHpmcmVlOwotICAgIGRfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKLQotICAgIGRfc3RyZWFtLm5leHRfaW4gID0gY29tcHI7Ci0gICAgZF9zdHJlYW0uYXZhaWxfaW4gPSAyOyAvKiBqdXN0IHJlYWQgdGhlIHpsaWIgaGVhZGVyICovCi0KLSAgICBlcnIgPSBpbmZsYXRlSW5pdCgmZF9zdHJlYW0pOwotICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlSW5pdCIpOwotCi0gICAgZF9zdHJlYW0ubmV4dF9vdXQgPSB1bmNvbXByOwotICAgIGRfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXVuY29tcHJMZW47Ci0KLSAgICBpbmZsYXRlKCZkX3N0cmVhbSwgWl9OT19GTFVTSCk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGUiKTsKLQotICAgIGRfc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpY29tcHJMZW4tMjsgICAvKiByZWFkIGFsbCBjb21wcmVzc2VkIGRhdGEgKi8KLSAgICBlcnIgPSBpbmZsYXRlU3luYygmZF9zdHJlYW0pOyAgICAgICAgICAgLyogYnV0IHNraXAgdGhlIGRhbWFnZWQgcGFydCAqLwotICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlU3luYyIpOwotCi0gICAgZXJyID0gaW5mbGF0ZSgmZF9zdHJlYW0sIFpfRklOSVNIKTsKLSAgICBpZiAoZXJyICE9IFpfREFUQV9FUlJPUikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImluZmxhdGUgc2hvdWxkIHJlcG9ydCBEQVRBX0VSUk9SXG4iKTsKLSAgICAgICAgLyogQmVjYXVzZSBvZiBpbmNvcnJlY3QgYWRsZXIzMiAqLwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBlcnIgPSBpbmZsYXRlRW5kKCZkX3N0cmVhbSk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVFbmQiKTsKLQotICAgIHByaW50ZigiYWZ0ZXIgaW5mbGF0ZVN5bmMoKTogaGVsJXNcbiIsIChjaGFyICopdW5jb21wcik7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGVzdCBkZWZsYXRlKCkgd2l0aCBwcmVzZXQgZGljdGlvbmFyeQotICovCi12b2lkIHRlc3RfZGljdF9kZWZsYXRlKGNvbXByLCBjb21wckxlbikKLSAgICBCeXRlICpjb21wcjsKLSAgICB1TG9uZyBjb21wckxlbjsKLXsKLSAgICB6X3N0cmVhbSBjX3N0cmVhbTsgLyogY29tcHJlc3Npb24gc3RyZWFtICovCi0gICAgaW50IGVycjsKLQotICAgIGNfc3RyZWFtLnphbGxvYyA9IHphbGxvYzsKLSAgICBjX3N0cmVhbS56ZnJlZSA9IHpmcmVlOwotICAgIGNfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKLQotICAgIGVyciA9IGRlZmxhdGVJbml0KCZjX3N0cmVhbSwgWl9CRVNUX0NPTVBSRVNTSU9OKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZUluaXQiKTsKLQotICAgIGVyciA9IGRlZmxhdGVTZXREaWN0aW9uYXJ5KCZjX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAoY29uc3QgQnl0ZWYqKWRpY3Rpb25hcnksIChpbnQpc2l6ZW9mKGRpY3Rpb25hcnkpKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZVNldERpY3Rpb25hcnkiKTsKLQotICAgIGRpY3RJZCA9IGNfc3RyZWFtLmFkbGVyOwotICAgIGNfc3RyZWFtLm5leHRfb3V0ID0gY29tcHI7Ci0gICAgY19zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpY29tcHJMZW47Ci0KLSAgICBjX3N0cmVhbS5uZXh0X2luID0gKEJ5dGVmKiloZWxsbzsKLSAgICBjX3N0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXN0cmxlbihoZWxsbykrMTsKLQotICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX0ZJTklTSCk7Ci0gICAgaWYgKGVyciAhPSBaX1NUUkVBTV9FTkQpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJkZWZsYXRlIHNob3VsZCByZXBvcnQgWl9TVFJFQU1fRU5EXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgZXJyID0gZGVmbGF0ZUVuZCgmY19zdHJlYW0pOwotICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlRW5kIik7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGVzdCBpbmZsYXRlKCkgd2l0aCBhIHByZXNldCBkaWN0aW9uYXJ5Ci0gKi8KLXZvaWQgdGVzdF9kaWN0X2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKQotICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKLSAgICB1TG9uZyBjb21wckxlbiwgdW5jb21wckxlbjsKLXsKLSAgICBpbnQgZXJyOwotICAgIHpfc3RyZWFtIGRfc3RyZWFtOyAvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLwotCi0gICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOwotCi0gICAgZF9zdHJlYW0uemFsbG9jID0gemFsbG9jOwotICAgIGRfc3RyZWFtLnpmcmVlID0gemZyZWU7Ci0gICAgZF9zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwotCi0gICAgZF9zdHJlYW0ubmV4dF9pbiAgPSBjb21wcjsKLSAgICBkX3N0cmVhbS5hdmFpbF9pbiA9ICh1SW50KWNvbXByTGVuOwotCi0gICAgZXJyID0gaW5mbGF0ZUluaXQoJmRfc3RyZWFtKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUluaXQiKTsKLQotICAgIGRfc3RyZWFtLm5leHRfb3V0ID0gdW5jb21wcjsKLSAgICBkX3N0cmVhbS5hdmFpbF9vdXQgPSAodUludCl1bmNvbXByTGVuOwotCi0gICAgZm9yICg7OykgewotICAgICAgICBlcnIgPSBpbmZsYXRlKCZkX3N0cmVhbSwgWl9OT19GTFVTSCk7Ci0gICAgICAgIGlmIChlcnIgPT0gWl9TVFJFQU1fRU5EKSBicmVhazsKLSAgICAgICAgaWYgKGVyciA9PSBaX05FRURfRElDVCkgewotICAgICAgICAgICAgaWYgKGRfc3RyZWFtLmFkbGVyICE9IGRpY3RJZCkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5leHBlY3RlZCBkaWN0aW9uYXJ5Iik7Ci0gICAgICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVyciA9IGluZmxhdGVTZXREaWN0aW9uYXJ5KCZkX3N0cmVhbSwgKGNvbnN0IEJ5dGVmKilkaWN0aW9uYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClzaXplb2YoZGljdGlvbmFyeSkpOwotICAgICAgICB9Ci0gICAgICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlIHdpdGggZGljdCIpOwotICAgIH0KLQotICAgIGVyciA9IGluZmxhdGVFbmQoJmRfc3RyZWFtKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUVuZCIpOwotCi0gICAgaWYgKHN0cmNtcCgoY2hhciopdW5jb21wciwgaGVsbG8pKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFkIGluZmxhdGUgd2l0aCBkaWN0XG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoImluZmxhdGUgd2l0aCBkaWN0aW9uYXJ5OiAlc1xuIiwgKGNoYXIgKil1bmNvbXByKTsKLSAgICB9Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVXNhZ2U6ICBleGFtcGxlIFtvdXRwdXQuZ3ogIFtpbnB1dC5nel1dCi0gKi8KLQotaW50IG1haW4oYXJnYywgYXJndikKLSAgICBpbnQgYXJnYzsKLSAgICBjaGFyICphcmd2W107Ci17Ci0gICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOwotICAgIHVMb25nIGNvbXByTGVuID0gMTAwMDAqc2l6ZW9mKGludCk7IC8qIGRvbid0IG92ZXJmbG93IG9uIE1TRE9TICovCi0gICAgdUxvbmcgdW5jb21wckxlbiA9IGNvbXByTGVuOwotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBteVZlcnNpb24gPSBaTElCX1ZFUlNJT047Ci0KLSAgICBpZiAoemxpYlZlcnNpb24oKVswXSAhPSBteVZlcnNpb25bMF0pIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbmNvbXBhdGlibGUgemxpYiB2ZXJzaW9uXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLQotICAgIH0gZWxzZSBpZiAoc3RyY21wKHpsaWJWZXJzaW9uKCksIFpMSUJfVkVSU0lPTikgIT0gMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IGRpZmZlcmVudCB6bGliIHZlcnNpb25cbiIpOwotICAgIH0KLQotICAgIHByaW50ZigiemxpYiB2ZXJzaW9uICVzID0gMHglMDR4LCBjb21waWxlIGZsYWdzID0gMHglbHhcbiIsCi0gICAgICAgICAgICBaTElCX1ZFUlNJT04sIFpMSUJfVkVSTlVNLCB6bGliQ29tcGlsZUZsYWdzKCkpOwotCi0gICAgY29tcHIgICAgPSAoQnl0ZSopY2FsbG9jKCh1SW50KWNvbXByTGVuLCAxKTsKLSAgICB1bmNvbXByICA9IChCeXRlKiljYWxsb2MoKHVJbnQpdW5jb21wckxlbiwgMSk7Ci0gICAgLyogY29tcHIgYW5kIHVuY29tcHIgYXJlIGNsZWFyZWQgdG8gYXZvaWQgcmVhZGluZyB1bmluaXRpYWxpemVkCi0gICAgICogZGF0YSBhbmQgdG8gZW5zdXJlIHRoYXQgdW5jb21wciBjb21wcmVzc2VzIHdlbGwuCi0gICAgICovCi0gICAgaWYgKGNvbXByID09IFpfTlVMTCB8fCB1bmNvbXByID09IFpfTlVMTCkgewotICAgICAgICBwcmludGYoIm91dCBvZiBtZW1vcnlcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotI2lmZGVmIFpfU09MTwotICAgIGFyZ2MgPSBzdHJsZW4oYXJndlswXSk7Ci0jZWxzZQotICAgIHRlc3RfY29tcHJlc3MoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKLQotICAgIHRlc3RfZ3ppbygoYXJnYyA+IDEgPyBhcmd2WzFdIDogVEVTVEZJTEUpLAotICAgICAgICAgICAgICB1bmNvbXByLCB1bmNvbXByTGVuKTsKLSNlbmRpZgotCi0gICAgdGVzdF9kZWZsYXRlKGNvbXByLCBjb21wckxlbik7Ci0gICAgdGVzdF9pbmZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7Ci0KLSAgICB0ZXN0X2xhcmdlX2RlZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKLSAgICB0ZXN0X2xhcmdlX2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKLQotICAgIHRlc3RfZmx1c2goY29tcHIsICZjb21wckxlbik7Ci0gICAgdGVzdF9zeW5jKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7Ci0gICAgY29tcHJMZW4gPSB1bmNvbXByTGVuOwotCi0gICAgdGVzdF9kaWN0X2RlZmxhdGUoY29tcHIsIGNvbXByTGVuKTsKLSAgICB0ZXN0X2RpY3RfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOwotCi0gICAgZnJlZShjb21wcik7Ci0gICAgZnJlZSh1bmNvbXByKTsKLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvdGVzdC9pbmZjb3Zlci5jIGIvc3JjL3psaWIvdGVzdC9pbmZjb3Zlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTNkOTIwLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL3Rlc3QvaW5mY292ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDY3MSArMCwwIEBACi0vKiBpbmZjb3Zlci5jIC0tIHRlc3QgemxpYidzIGluZmxhdGUgcm91dGluZXMgd2l0aCBmdWxsIGNvZGUgY292ZXJhZ2UKLSAqIENvcHlyaWdodCAoQykgMjAxMSBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogdG8gdXNlLCBkbzogLi9jb25maWd1cmUgLS1jb3ZlciAmJiBtYWtlIGNvdmVyICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgInpsaWIuaCIKLQotLyogZ2V0IGRlZmluaXRpb24gb2YgaW50ZXJuYWwgc3RydWN0dXJlIHNvIHdlIGNhbiBtZXNzIHdpdGggaXQgKHNlZSBwdWxsKCkpLAotICAgYW5kIHNvIHdlIGNhbiBjYWxsIGluZmxhdGVfdHJlZXMoKSAoc2VlIGNvdmVyNSgpKSAqLwotI2RlZmluZSBaTElCX0lOVEVSTkFMCi0jaW5jbHVkZSAiaW5mdHJlZXMuaCIKLSNpbmNsdWRlICJpbmZsYXRlLmgiCi0KLSNkZWZpbmUgbG9jYWwgc3RhdGljCi0KLS8qIC0tIG1lbW9yeSB0cmFja2luZyByb3V0aW5lcyAtLSAqLwotCi0vKgotICAgVGhlc2UgbWVtb3J5IHRyYWNraW5nIHJvdXRpbmVzIGFyZSBwcm92aWRlZCB0byB6bGliIGFuZCB0cmFjayBhbGwgb2YgemxpYidzCi0gICBhbGxvY2F0aW9ucyBhbmQgZGVhbGxvY2F0aW9ucywgY2hlY2sgZm9yIExJRk8gb3BlcmF0aW9ucywga2VlcCBhIGN1cnJlbnQKLSAgIGFuZCBoaWdoIHdhdGVyIG1hcmsgb2YgdG90YWwgYnl0ZXMgcmVxdWVzdGVkLCBvcHRpb25hbGx5IHNldCBhIGxpbWl0IG9uIHRoZQotICAgdG90YWwgbWVtb3J5IHRoYXQgY2FuIGJlIGFsbG9jYXRlZCwgYW5kIHdoZW4gZG9uZSBjaGVjayBmb3IgbWVtb3J5IGxlYWtzLgotCi0gICBUaGV5IGFyZSB1c2VkIGFzIGZvbGxvd3M6Ci0KLSAgIHpfc3RyZWFtIHN0cm07Ci0gICBtZW1fc2V0dXAoJnN0cm0pICAgICAgICAgaW5pdGlhbGl6ZXMgdGhlIG1lbW9yeSB0cmFja2luZyBhbmQgc2V0cyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB6YWxsb2MsIHpmcmVlLCBhbmQgb3BhcXVlIG1lbWJlcnMgb2Ygc3RybSB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgdHJhY2tpbmcgZm9yIGFsbCB6bGliIG9wZXJhdGlvbnMgb24gc3RybQotICAgbWVtX2xpbWl0KCZzdHJtLCBsaW1pdCkgIHNldHMgYSBsaW1pdCBvbiB0aGUgdG90YWwgYnl0ZXMgcmVxdWVzdGVkIC0tIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0IHRoYXQgZXhjZWVkcyB0aGlzIGxpbWl0IHdpbGwgcmVzdWx0IGluIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbiBmYWlsdXJlIChyZXR1cm5zIE5VTEwpIC0tIHNldHRpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgdG8gemVybyBtZWFucyBubyBsaW1pdCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciBtZW1fc2V0dXAoKQotICAgbWVtX3VzZWQoJnN0cm0sICJtc2ciKSAgIHByaW50cyB0byBzdGRlcnIgIm1zZyIgYW5kIHRoZSB0b3RhbCBieXRlcyB1c2VkCi0gICBtZW1faGlnaCgmc3RybSwgIm1zZyIpICAgcHJpbnRzIHRvIHN0ZGVyciAibXNnIiBhbmQgdGhlIGhpZ2ggd2F0ZXIgbWFyawotICAgbWVtX2RvbmUoJnN0cm0sICJtc2ciKSAgIGVuZHMgbWVtb3J5IHRyYWNraW5nLCByZWxlYXNlcyBhbGwgYWxsb2NhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHRyYWNraW5nIGFzIHdlbGwgYXMgbGVha2VkIHpsaWIgYmxvY2tzLCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueS4gIElmIHRoZXJlIHdhcyBhbnl0aGluZyB1bnVzdWFsLCBzdWNoIGFzIGxlYWtlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrcywgbm9uLUZJRk8gZnJlZXMsIG9yIGZyZWVzIG9mIGFkZHJlc3NlcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQsIHRoZW4gIm1zZyIgYW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JsZW0gaXMgcHJpbnRlZCB0byBzdGRlcnIuICBJZiBldmVyeXRoaW5nIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsLCBub3RoaW5nIGlzIHByaW50ZWQuIG1lbV9kb25lIHJlc2V0cyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtIG1lbWJlcnMgdG8gWl9OVUxMIHRvIHVzZSB0aGUgZGVmYXVsdCBtZW1vcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uIHJvdXRpbmVzIG9uIHRoZSBuZXh0IHpsaWIgaW5pdGlhbGl6YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBzdHJtLgotICovCi0KLS8qIHRoZXNlIGl0ZW1zIGFyZSBzdHJ1bmcgdG9nZXRoZXIgaW4gYSBsaW5rZWQgbGlzdCwgb25lIGZvciBlYWNoIGFsbG9jYXRpb24gKi8KLXN0cnVjdCBtZW1faXRlbSB7Ci0gICAgdm9pZCAqcHRyOyAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeSAqLwotICAgIHNpemVfdCBzaXplOyAgICAgICAgICAgICAgICAvKiByZXF1ZXN0ZWQgc2l6ZSBvZiBhbGxvY2F0aW9uICovCi0gICAgc3RydWN0IG1lbV9pdGVtICpuZXh0OyAgICAgIC8qIHBvaW50ZXIgdG8gbmV4dCBpdGVtIGluIGxpc3QsIG9yIE5VTEwgKi8KLX07Ci0KLS8qIHRoaXMgc3RydWN0dXJlIGlzIGF0IHRoZSByb290IG9mIHRoZSBsaW5rZWQgbGlzdCwgYW5kIHRyYWNrcyBzdGF0aXN0aWNzICovCi1zdHJ1Y3QgbWVtX3pvbmUgewotICAgIHN0cnVjdCBtZW1faXRlbSAqZmlyc3Q7ICAgICAvKiBwb2ludGVyIHRvIGZpcnN0IGl0ZW0gaW4gbGlzdCwgb3IgTlVMTCAqLwotICAgIHNpemVfdCB0b3RhbCwgaGlnaHdhdGVyOyAgICAvKiB0b3RhbCBhbGxvY2F0aW9ucywgYW5kIGxhcmdlc3QgdG90YWwgKi8KLSAgICBzaXplX3QgbGltaXQ7ICAgICAgICAgICAgICAgLyogbWVtb3J5IGFsbG9jYXRpb24gbGltaXQsIG9yIDAgaWYgbm8gbGltaXQgKi8KLSAgICBpbnQgbm90bGlmbywgcm9ndWU7ICAgICAgICAgLyogY291bnRzIG9mIG5vbi1MSUZPIGZyZWVzIGFuZCByb2d1ZSBmcmVlcyAqLwotfTsKLQotLyogbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZSB0byBwYXNzIHRvIHpsaWIgKi8KLWxvY2FsIHZvaWQgKm1lbV9hbGxvYyh2b2lkICptZW0sIHVuc2lnbmVkIGNvdW50LCB1bnNpZ25lZCBzaXplKQotewotICAgIHZvaWQgKnB0cjsKLSAgICBzdHJ1Y3QgbWVtX2l0ZW0gKml0ZW07Ci0gICAgc3RydWN0IG1lbV96b25lICp6b25lID0gbWVtOwotICAgIHNpemVfdCBsZW4gPSBjb3VudCAqIChzaXplX3Qpc2l6ZTsKLQotICAgIC8qIGluZHVjZWQgYWxsb2NhdGlvbiBmYWlsdXJlICovCi0gICAgaWYgKHpvbmUgPT0gTlVMTCB8fCAoem9uZS0+bGltaXQgJiYgem9uZS0+dG90YWwgKyBsZW4gPiB6b25lLT5saW1pdCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyogcGVyZm9ybSBhbGxvY2F0aW9uIHVzaW5nIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LCBmaWxsIG1lbW9yeSB3aXRoIGEKLSAgICAgICBub24temVybyB2YWx1ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29kZSBpc24ndCBkZXBlbmRpbmcgb24gemVyb3MgKi8KLSAgICBwdHIgPSBtYWxsb2MobGVuKTsKLSAgICBpZiAocHRyID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIG1lbXNldChwdHIsIDB4YTUsIGxlbik7Ci0KLSAgICAvKiBjcmVhdGUgYSBuZXcgaXRlbSBmb3IgdGhlIGxpc3QgKi8KLSAgICBpdGVtID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWVtX2l0ZW0pKTsKLSAgICBpZiAoaXRlbSA9PSBOVUxMKSB7Ci0gICAgICAgIGZyZWUocHRyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGl0ZW0tPnB0ciA9IHB0cjsKLSAgICBpdGVtLT5zaXplID0gbGVuOwotCi0gICAgLyogaW5zZXJ0IGl0ZW0gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCAqLwotICAgIGl0ZW0tPm5leHQgPSB6b25lLT5maXJzdDsKLSAgICB6b25lLT5maXJzdCA9IGl0ZW07Ci0KLSAgICAvKiB1cGRhdGUgdGhlIHN0YXRpc3RpY3MgKi8KLSAgICB6b25lLT50b3RhbCArPSBpdGVtLT5zaXplOwotICAgIGlmICh6b25lLT50b3RhbCA+IHpvbmUtPmhpZ2h3YXRlcikKLSAgICAgICAgem9uZS0+aGlnaHdhdGVyID0gem9uZS0+dG90YWw7Ci0KLSAgICAvKiByZXR1cm4gdGhlIGFsbG9jYXRlZCBtZW1vcnkgKi8KLSAgICByZXR1cm4gcHRyOwotfQotCi0vKiBtZW1vcnkgZnJlZSByb3V0aW5lIHRvIHBhc3MgdG8gemxpYiAqLwotbG9jYWwgdm9pZCBtZW1fZnJlZSh2b2lkICptZW0sIHZvaWQgKnB0cikKLXsKLSAgICBzdHJ1Y3QgbWVtX2l0ZW0gKml0ZW0sICpuZXh0OwotICAgIHN0cnVjdCBtZW1fem9uZSAqem9uZSA9IG1lbTsKLQotICAgIC8qIGlmIG5vIHpvbmUsIGp1c3QgZG8gYSBmcmVlICovCi0gICAgaWYgKHpvbmUgPT0gTlVMTCkgewotICAgICAgICBmcmVlKHB0cik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBwb2ludCBuZXh0IHRvIHRoZSBpdGVtIHRoYXQgbWF0Y2hlcyBwdHIsIG9yIE5VTEwgaWYgbm90IGZvdW5kIC0tIHJlbW92ZQotICAgICAgIHRoZSBpdGVtIGZyb20gdGhlIGxpbmtlZCBsaXN0IGlmIGZvdW5kICovCi0gICAgbmV4dCA9IHpvbmUtPmZpcnN0OwotICAgIGlmIChuZXh0KSB7Ci0gICAgICAgIGlmIChuZXh0LT5wdHIgPT0gcHRyKQotICAgICAgICAgICAgem9uZS0+Zmlyc3QgPSBuZXh0LT5uZXh0OyAgIC8qIGZpcnN0IG9uZSBpcyBpdCwgcmVtb3ZlIGZyb20gbGlzdCAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZWFyY2ggdGhlIGxpbmtlZCBsaXN0ICovCi0gICAgICAgICAgICAgICAgaXRlbSA9IG5leHQ7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IGl0ZW0tPm5leHQ7Ci0gICAgICAgICAgICB9IHdoaWxlIChuZXh0ICE9IE5VTEwgJiYgbmV4dC0+cHRyICE9IHB0cik7Ci0gICAgICAgICAgICBpZiAobmV4dCkgeyAgICAgICAgICAgICAgICAgLyogaWYgZm91bmQsIHJlbW92ZSBmcm9tIGxpbmtlZCBsaXN0ICovCi0gICAgICAgICAgICAgICAgaXRlbS0+bmV4dCA9IG5leHQtPm5leHQ7Ci0gICAgICAgICAgICAgICAgem9uZS0+bm90bGlmbysrOyAgICAgICAgLyogbm90IGEgTElGTyBmcmVlICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGlmIGZvdW5kLCB1cGRhdGUgdGhlIHN0YXRpc3RpY3MgYW5kIGZyZWUgdGhlIGl0ZW0gKi8KLSAgICBpZiAobmV4dCkgewotICAgICAgICB6b25lLT50b3RhbCAtPSBuZXh0LT5zaXplOwotICAgICAgICBmcmVlKG5leHQpOwotICAgIH0KLQotICAgIC8qIGlmIG5vdCBmb3VuZCwgdXBkYXRlIHRoZSByb2d1ZSBjb3VudCAqLwotICAgIGVsc2UKLSAgICAgICAgem9uZS0+cm9ndWUrKzsKLQotICAgIC8qIGluIGFueSBjYXNlLCBkbyB0aGUgcmVxdWVzdGVkIGZyZWUgd2l0aCB0aGUgc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbiAqLwotICAgIGZyZWUocHRyKTsKLX0KLQotLyogc2V0IHVwIGEgY29udHJvbGxlZCBtZW1vcnkgYWxsb2NhdGlvbiBzcGFjZSBmb3IgbW9uaXRvcmluZywgc2V0IHRoZSBzdHJlYW0KLSAgIHBhcmFtZXRlcnMgdG8gdGhlIGNvbnRyb2xsZWQgcm91dGluZXMsIHdpdGggb3BhcXVlIHBvaW50aW5nIHRvIHRoZSBzcGFjZSAqLwotbG9jYWwgdm9pZCBtZW1fc2V0dXAoel9zdHJlYW0gKnN0cm0pCi17Ci0gICAgc3RydWN0IG1lbV96b25lICp6b25lOwotCi0gICAgem9uZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IG1lbV96b25lKSk7Ci0gICAgYXNzZXJ0KHpvbmUgIT0gTlVMTCk7Ci0gICAgem9uZS0+Zmlyc3QgPSBOVUxMOwotICAgIHpvbmUtPnRvdGFsID0gMDsKLSAgICB6b25lLT5oaWdod2F0ZXIgPSAwOwotICAgIHpvbmUtPmxpbWl0ID0gMDsKLSAgICB6b25lLT5ub3RsaWZvID0gMDsKLSAgICB6b25lLT5yb2d1ZSA9IDA7Ci0gICAgc3RybS0+b3BhcXVlID0gem9uZTsKLSAgICBzdHJtLT56YWxsb2MgPSBtZW1fYWxsb2M7Ci0gICAgc3RybS0+emZyZWUgPSBtZW1fZnJlZTsKLX0KLQotLyogc2V0IGEgbGltaXQgb24gdGhlIHRvdGFsIG1lbW9yeSBhbGxvY2F0aW9uLCBvciAwIHRvIHJlbW92ZSB0aGUgbGltaXQgKi8KLWxvY2FsIHZvaWQgbWVtX2xpbWl0KHpfc3RyZWFtICpzdHJtLCBzaXplX3QgbGltaXQpCi17Ci0gICAgc3RydWN0IG1lbV96b25lICp6b25lID0gc3RybS0+b3BhcXVlOwotCi0gICAgem9uZS0+bGltaXQgPSBsaW1pdDsKLX0KLQotLyogc2hvdyB0aGUgY3VycmVudCB0b3RhbCByZXF1ZXN0ZWQgYWxsb2NhdGlvbnMgaW4gYnl0ZXMgKi8KLWxvY2FsIHZvaWQgbWVtX3VzZWQoel9zdHJlYW0gKnN0cm0sIGNoYXIgKnByZWZpeCkKLXsKLSAgICBzdHJ1Y3QgbWVtX3pvbmUgKnpvbmUgPSBzdHJtLT5vcGFxdWU7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlbHUgYWxsb2NhdGVkXG4iLCBwcmVmaXgsIHpvbmUtPnRvdGFsKTsKLX0KLQotLyogc2hvdyB0aGUgaGlnaCB3YXRlciBhbGxvY2F0aW9uIGluIGJ5dGVzICovCi1sb2NhbCB2b2lkIG1lbV9oaWdoKHpfc3RyZWFtICpzdHJtLCBjaGFyICpwcmVmaXgpCi17Ci0gICAgc3RydWN0IG1lbV96b25lICp6b25lID0gc3RybS0+b3BhcXVlOwotCi0gICAgZnByaW50ZihzdGRlcnIsICIlczogJWx1IGhpZ2ggd2F0ZXIgbWFya1xuIiwgcHJlZml4LCB6b25lLT5oaWdod2F0ZXIpOwotfQotCi0vKiByZWxlYXNlIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiB6b25lIC0tIGlmIHRoZXJlIGFyZSBhbnkgc3VycHJpc2VzLCBub3RpZnkgKi8KLWxvY2FsIHZvaWQgbWVtX2RvbmUoel9zdHJlYW0gKnN0cm0sIGNoYXIgKnByZWZpeCkKLXsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIHN0cnVjdCBtZW1faXRlbSAqaXRlbSwgKm5leHQ7Ci0gICAgc3RydWN0IG1lbV96b25lICp6b25lID0gc3RybS0+b3BhcXVlOwotCi0gICAgLyogc2hvdyBoaWdoIHdhdGVyIG1hcmsgKi8KLSAgICBtZW1faGlnaChzdHJtLCBwcmVmaXgpOwotCi0gICAgLyogZnJlZSBsZWZ0b3ZlciBhbGxvY2F0aW9ucyBhbmQgaXRlbSBzdHJ1Y3R1cmVzLCBpZiBhbnkgKi8KLSAgICBpdGVtID0gem9uZS0+Zmlyc3Q7Ci0gICAgd2hpbGUgKGl0ZW0gIT0gTlVMTCkgewotICAgICAgICBmcmVlKGl0ZW0tPnB0cik7Ci0gICAgICAgIG5leHQgPSBpdGVtLT5uZXh0OwotICAgICAgICBmcmVlKGl0ZW0pOwotICAgICAgICBpdGVtID0gbmV4dDsKLSAgICAgICAgY291bnQrKzsKLSAgICB9Ci0KLSAgICAvKiBpc3N1ZSBhbGVydHMgYWJvdXQgYW55dGhpbmcgdW5leHBlY3RlZCAqLwotICAgIGlmIChjb3VudCB8fCB6b25lLT50b3RhbCkKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIqKiAlczogJWx1IGJ5dGVzIGluICVkIGJsb2NrcyBub3QgZnJlZWRcbiIsCi0gICAgICAgICAgICAgICAgcHJlZml4LCB6b25lLT50b3RhbCwgY291bnQpOwotICAgIGlmICh6b25lLT5ub3RsaWZvKQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIioqICVzOiAlZCBmcmVlcyBub3QgTElGT1xuIiwgcHJlZml4LCB6b25lLT5ub3RsaWZvKTsKLSAgICBpZiAoem9uZS0+cm9ndWUpCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiKiogJXM6ICVkIGZyZWVzIG5vdCByZWNvZ25pemVkXG4iLAotICAgICAgICAgICAgICAgIHByZWZpeCwgem9uZS0+cm9ndWUpOwotCi0gICAgLyogZnJlZSB0aGUgem9uZSBhbmQgZGVsZXRlIGZyb20gdGhlIHN0cmVhbSAqLwotICAgIGZyZWUoem9uZSk7Ci0gICAgc3RybS0+b3BhcXVlID0gWl9OVUxMOwotICAgIHN0cm0tPnphbGxvYyA9IFpfTlVMTDsKLSAgICBzdHJtLT56ZnJlZSA9IFpfTlVMTDsKLX0KLQotLyogLS0gaW5mbGF0ZSB0ZXN0IHJvdXRpbmVzIC0tICovCi0KLS8qIERlY29kZSBhIGhleGFkZWNpbWFsIHN0cmluZywgc2V0ICpsZW4gdG8gbGVuZ3RoLCBpbltdIHRvIHRoZSBieXRlcy4gIFRoaXMKLSAgIGRlY29kZXMgbGliZXJhbGx5LCBpbiB0aGF0IGhleCBkaWdpdHMgY2FuIGJlIGFkamFjZW50LCBpbiB3aGljaCBjYXNlIHR3byBpbgotICAgYSByb3cgd3JpdGVzIGEgYnl0ZS4gIE9yIHRoZXkgY2FuIGRlbGltaXRlZCBieSBhbnkgbm9uLWhleCBjaGFyYWN0ZXIsIHdoZXJlCi0gICB0aGUgZGVsaW1pdGVycyBhcmUgaWdub3JlZCBleGNlcHQgd2hlbiBhIHNpbmdsZSBoZXggZGlnaXQgaXMgZm9sbG93ZWQgYnkgYQotICAgZGVsaW1pdGVyIGluIHdoaWNoIGNhc2UgdGhhdCBzaW5nbGUgZGlnaXQgd3JpdGVzIGEgYnl0ZS4gIFRoZSByZXR1cm5lZAotICAgZGF0YSBpcyBhbGxvY2F0ZWQgYW5kIG11c3QgZXZlbnR1YWxseSBiZSBmcmVlZC4gIE5VTEwgaXMgcmV0dXJuZWQgaWYgb3V0IG9mCi0gICBtZW1vcnkuICBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBuZWVkZWQsIHRoZW4gbGVuIGNhbiBiZSBOVUxMLiAqLwotbG9jYWwgdW5zaWduZWQgY2hhciAqaDJiKGNvbnN0IGNoYXIgKmhleCwgdW5zaWduZWQgKmxlbikKLXsKLSAgICB1bnNpZ25lZCBjaGFyICppbjsKLSAgICB1bnNpZ25lZCBuZXh0LCB2YWw7Ci0KLSAgICBpbiA9IG1hbGxvYygoc3RybGVuKGhleCkgKyAxKSA+PiAxKTsKLSAgICBpZiAoaW4gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgbmV4dCA9IDA7Ci0gICAgdmFsID0gMTsKLSAgICBkbyB7Ci0gICAgICAgIGlmICgqaGV4ID49ICcwJyAmJiAqaGV4IDw9ICc5JykKLSAgICAgICAgICAgIHZhbCA9ICh2YWwgPDwgNCkgKyAqaGV4IC0gJzAnOwotICAgICAgICBlbHNlIGlmICgqaGV4ID49ICdBJyAmJiAqaGV4IDw9ICdGJykKLSAgICAgICAgICAgIHZhbCA9ICh2YWwgPDwgNCkgKyAqaGV4IC0gJ0EnICsgMTA7Ci0gICAgICAgIGVsc2UgaWYgKCpoZXggPj0gJ2EnICYmICpoZXggPD0gJ2YnKQotICAgICAgICAgICAgdmFsID0gKHZhbCA8PCA0KSArICpoZXggLSAnYScgKyAxMDsKLSAgICAgICAgZWxzZSBpZiAodmFsICE9IDEgJiYgdmFsIDwgMzIpICAvKiBvbmUgZGlnaXQgZm9sbG93ZWQgYnkgZGVsaW1pdGVyICovCi0gICAgICAgICAgICB2YWwgKz0gMjQwOyAgICAgICAgICAgICAgICAgLyogbWFrZSBpdCBsb29rIGxpa2UgdHdvIGRpZ2l0cyAqLwotICAgICAgICBpZiAodmFsID4gMjU1KSB7ICAgICAgICAgICAgICAgIC8qIGhhdmUgdHdvIGRpZ2l0cyAqLwotICAgICAgICAgICAgaW5bbmV4dCsrXSA9IHZhbCAmIDB4ZmY7ICAgIC8qIHNhdmUgdGhlIGRlY29kZWQgYnl0ZSAqLwotICAgICAgICAgICAgdmFsID0gMTsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IG92ZXIgKi8KLSAgICAgICAgfQotICAgIH0gd2hpbGUgKCpoZXgrKyk7ICAgICAgIC8qIGdvIHRocm91Z2ggdGhlIGxvb3Agd2l0aCB0aGUgdGVybWluYXRpbmcgbnVsbCAqLwotICAgIGlmIChsZW4gIT0gTlVMTCkKLSAgICAgICAgKmxlbiA9IG5leHQ7Ci0gICAgaW4gPSByZWFsbG9jZihpbiwgbmV4dCk7Ci0gICAgcmV0dXJuIGluOwotfQotCi0vKiBnZW5lcmljIGluZmxhdGUoKSBydW4sIHdoZXJlIGhleCBpcyB0aGUgaGV4YWRlY2ltYWwgaW5wdXQgZGF0YSwgd2hhdCBpcyB0aGUKLSAgIHRleHQgdG8gaW5jbHVkZSBpbiBhbiBlcnJvciBtZXNzYWdlLCBzdGVwIGlzIGhvdyBtdWNoIGlucHV0IGRhdGEgdG8gZmVlZAotICAgaW5mbGF0ZSgpIG9uIGVhY2ggY2FsbCwgb3IgemVybyB0byBmZWVkIGl0IGFsbCwgd2luIGlzIHRoZSB3aW5kb3cgYml0cwotICAgcGFyYW1ldGVyIHRvIGluZmxhdGVJbml0MigpLCBsZW4gaXMgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIsIGFuZCBlcnIKLSAgIGlzIHRoZSBlcnJvciBjb2RlIGV4cGVjdGVkIGZyb20gdGhlIGZpcnN0IGluZmxhdGUoKSBjYWxsICh0aGUgc2Vjb25kCi0gICBpbmZsYXRlKCkgY2FsbCBpcyBleHBlY3RlZCB0byByZXR1cm4gWl9TVFJFQU1fRU5EKS4gIElmIHdpbiBpcyA0NywgdGhlbgotICAgaGVhZGVyIGluZm9ybWF0aW9uIGlzIGNvbGxlY3RlZCB3aXRoIGluZmxhdGVHZXRIZWFkZXIoKS4gIElmIGEgemxpYiBzdHJlYW0KLSAgIGlzIGxvb2tpbmcgZm9yIGEgZGljdGlvbmFyeSwgdGhlbiBhbiBlbXB0eSBkaWN0aW9uYXJ5IGlzIHByb3ZpZGVkLgotICAgaW5mbGF0ZSgpIGlzIHJ1biB1bnRpbCBhbGwgb2YgdGhlIGlucHV0IGRhdGEgaXMgY29uc3VtZWQuICovCi1sb2NhbCB2b2lkIGluZihjaGFyICpoZXgsIGNoYXIgKndoYXQsIHVuc2lnbmVkIHN0ZXAsIGludCB3aW4sIHVuc2lnbmVkIGxlbiwKLSAgICAgICAgICAgICAgIGludCBlcnIpCi17Ci0gICAgaW50IHJldDsKLSAgICB1bnNpZ25lZCBoYXZlOwotICAgIHVuc2lnbmVkIGNoYXIgKmluLCAqb3V0OwotICAgIHpfc3RyZWFtIHN0cm0sIGNvcHk7Ci0gICAgZ3pfaGVhZGVyIGhlYWQ7Ci0KLSAgICBtZW1fc2V0dXAoJnN0cm0pOwotICAgIHN0cm0uYXZhaWxfaW4gPSAwOwotICAgIHN0cm0ubmV4dF9pbiA9IFpfTlVMTDsKLSAgICByZXQgPSBpbmZsYXRlSW5pdDIoJnN0cm0sIHdpbik7Ci0gICAgaWYgKHJldCAhPSBaX09LKSB7Ci0gICAgICAgIG1lbV9kb25lKCZzdHJtLCB3aGF0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBvdXQgPSBtYWxsb2MobGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChvdXQgIT0gTlVMTCk7Ci0gICAgaWYgKHdpbiA9PSA0NykgewotICAgICAgICBoZWFkLmV4dHJhID0gb3V0OwotICAgICAgICBoZWFkLmV4dHJhX21heCA9IGxlbjsKLSAgICAgICAgaGVhZC5uYW1lID0gb3V0OwotICAgICAgICBoZWFkLm5hbWVfbWF4ID0gbGVuOwotICAgICAgICBoZWFkLmNvbW1lbnQgPSBvdXQ7Ci0gICAgICAgIGhlYWQuY29tbV9tYXggPSBsZW47Ci0gICAgICAgIHJldCA9IGluZmxhdGVHZXRIZWFkZXIoJnN0cm0sICZoZWFkKTsgICBhc3NlcnQocmV0ID09IFpfT0spOwotICAgIH0KLSAgICBpbiA9IGgyYihoZXgsICZoYXZlKTsgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChpbiAhPSBOVUxMKTsKLSAgICBpZiAoc3RlcCA9PSAwIHx8IHN0ZXAgPiBoYXZlKQotICAgICAgICBzdGVwID0gaGF2ZTsKLSAgICBzdHJtLmF2YWlsX2luID0gc3RlcDsKLSAgICBoYXZlIC09IHN0ZXA7Ci0gICAgc3RybS5uZXh0X2luID0gaW47Ci0gICAgZG8gewotICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlbjsKLSAgICAgICAgc3RybS5uZXh0X291dCA9IG91dDsKLSAgICAgICAgcmV0ID0gaW5mbGF0ZSgmc3RybSwgWl9OT19GTFVTSCk7ICAgICAgIGFzc2VydChlcnIgPT0gOSB8fCByZXQgPT0gZXJyKTsKLSAgICAgICAgaWYgKHJldCAhPSBaX09LICYmIHJldCAhPSBaX0JVRl9FUlJPUiAmJiByZXQgIT0gWl9ORUVEX0RJQ1QpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKHJldCA9PSBaX05FRURfRElDVCkgewotICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZVNldERpY3Rpb25hcnkoJnN0cm0sIGluLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9EQVRBX0VSUk9SKTsKLSAgICAgICAgICAgIG1lbV9saW1pdCgmc3RybSwgMSk7Ci0gICAgICAgICAgICByZXQgPSBpbmZsYXRlU2V0RGljdGlvbmFyeSgmc3RybSwgb3V0LCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9NRU1fRVJST1IpOwotICAgICAgICAgICAgbWVtX2xpbWl0KCZzdHJtLCAwKTsKLSAgICAgICAgICAgICgoc3RydWN0IGluZmxhdGVfc3RhdGUgKilzdHJtLnN0YXRlKS0+bW9kZSA9IERJQ1Q7Ci0gICAgICAgICAgICByZXQgPSBpbmZsYXRlU2V0RGljdGlvbmFyeSgmc3RybSwgb3V0LCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7Ci0gICAgICAgICAgICByZXQgPSBpbmZsYXRlKCZzdHJtLCBaX05PX0ZMVVNIKTsgICBhc3NlcnQocmV0ID09IFpfQlVGX0VSUk9SKTsKLSAgICAgICAgfQotICAgICAgICByZXQgPSBpbmZsYXRlQ29weSgmY29weSwgJnN0cm0pOyAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKLSAgICAgICAgcmV0ID0gaW5mbGF0ZUVuZCgmY29weSk7ICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7Ci0gICAgICAgIGVyciA9IDk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgY2FyZSBuZXh0IHRpbWUgYXJvdW5kICovCi0gICAgICAgIGhhdmUgKz0gc3RybS5hdmFpbF9pbjsKLSAgICAgICAgc3RybS5hdmFpbF9pbiA9IHN0ZXAgPiBoYXZlID8gaGF2ZSA6IHN0ZXA7Ci0gICAgICAgIGhhdmUgLT0gc3RybS5hdmFpbF9pbjsKLSAgICB9IHdoaWxlIChzdHJtLmF2YWlsX2luKTsKLSAgICBmcmVlKGluKTsKLSAgICBmcmVlKG91dCk7Ci0gICAgcmV0ID0gaW5mbGF0ZVJlc2V0Migmc3RybSwgLTgpOyAgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOwotICAgIHJldCA9IGluZmxhdGVFbmQoJnN0cm0pOyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKLSAgICBtZW1fZG9uZSgmc3RybSwgd2hhdCk7Ci19Ci0KLS8qIGNvdmVyIGFsbCBvZiB0aGUgbGluZXMgaW4gaW5mbGF0ZS5jIHVwIHRvIGluZmxhdGUoKSAqLwotbG9jYWwgdm9pZCBjb3Zlcl9zdXBwb3J0KHZvaWQpCi17Ci0gICAgaW50IHJldDsKLSAgICB6X3N0cmVhbSBzdHJtOwotCi0gICAgbWVtX3NldHVwKCZzdHJtKTsKLSAgICBzdHJtLmF2YWlsX2luID0gMDsKLSAgICBzdHJtLm5leHRfaW4gPSBaX05VTEw7Ci0gICAgcmV0ID0gaW5mbGF0ZUluaXQoJnN0cm0pOyAgICAgICAgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOwotICAgIG1lbV91c2VkKCZzdHJtLCAiaW5mbGF0ZSBpbml0Iik7Ci0gICAgcmV0ID0gaW5mbGF0ZVByaW1lKCZzdHJtLCA1LCAzMSk7ICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOwotICAgIHJldCA9IGluZmxhdGVQcmltZSgmc3RybSwgLTEsIDApOyAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKLSAgICByZXQgPSBpbmZsYXRlU2V0RGljdGlvbmFyeSgmc3RybSwgWl9OVUxMLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRVJST1IpOwotICAgIHJldCA9IGluZmxhdGVFbmQoJnN0cm0pOyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKLSAgICBtZW1fZG9uZSgmc3RybSwgInByaW1lIik7Ci0KLSAgICBpbmYoIjYzIDAiLCAiZm9yY2Ugd2luZG93IGFsbG9jYXRpb24iLCAwLCAtMTUsIDEsIFpfT0spOwotICAgIGluZigiNjMgMTggNSIsICJmb3JjZSB3aW5kb3cgcmVwbGFjZW1lbnQiLCAwLCAtOCwgMjU5LCBaX09LKTsKLSAgICBpbmYoIjYzIDE4IDY4IDMwIGQwIDAgMCIsICJmb3JjZSBzcGxpdCB3aW5kb3cgdXBkYXRlIiwgNCwgLTgsIDI1OSwgWl9PSyk7Ci0gICAgaW5mKCIzIDAiLCAidXNlIGZpeGVkIGJsb2NrcyIsIDAsIC0xNSwgMSwgWl9TVFJFQU1fRU5EKTsKLSAgICBpbmYoIiIsICJiYWQgd2luZG93IHNpemUiLCAwLCAxLCAwLCBaX1NUUkVBTV9FUlJPUik7Ci0KLSAgICBtZW1fc2V0dXAoJnN0cm0pOwotICAgIHN0cm0uYXZhaWxfaW4gPSAwOwotICAgIHN0cm0ubmV4dF9pbiA9IFpfTlVMTDsKLSAgICByZXQgPSBpbmZsYXRlSW5pdF8oJnN0cm0sIFpMSUJfVkVSU0lPTiAtIDEsIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfVkVSU0lPTl9FUlJPUik7Ci0gICAgbWVtX2RvbmUoJnN0cm0sICJ3cm9uZyB2ZXJzaW9uIik7Ci0KLSAgICBzdHJtLmF2YWlsX2luID0gMDsKLSAgICBzdHJtLm5leHRfaW4gPSBaX05VTEw7Ci0gICAgcmV0ID0gaW5mbGF0ZUluaXQoJnN0cm0pOyAgICAgICAgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOwotICAgIHJldCA9IGluZmxhdGVFbmQoJnN0cm0pOyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKLSAgICBmcHV0cygiaW5mbGF0ZSBidWlsdC1pbiBtZW1vcnkgcm91dGluZXNcbiIsIHN0ZGVycik7Ci19Ci0KLS8qIGNvdmVyIGFsbCBpbmZsYXRlKCkgaGVhZGVyIGFuZCB0cmFpbGVyIGNhc2VzIGFuZCBjb2RlIGFmdGVyIGluZmxhdGUoKSAqLwotbG9jYWwgdm9pZCBjb3Zlcl93cmFwKHZvaWQpCi17Ci0gICAgaW50IHJldDsKLSAgICB6X3N0cmVhbSBzdHJtLCBjb3B5OwotICAgIHVuc2lnbmVkIGNoYXIgZGljdFsyNTddOwotCi0gICAgcmV0ID0gaW5mbGF0ZShaX05VTEwsIDApOyAgICAgICAgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfU1RSRUFNX0VSUk9SKTsKLSAgICByZXQgPSBpbmZsYXRlRW5kKFpfTlVMTCk7ICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRVJST1IpOwotICAgIHJldCA9IGluZmxhdGVDb3B5KFpfTlVMTCwgWl9OVUxMKTsgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX1NUUkVBTV9FUlJPUik7Ci0gICAgZnB1dHMoImluZmxhdGUgYmFkIHBhcmFtZXRlcnNcbiIsIHN0ZGVycik7Ci0KLSAgICBpbmYoIjFmIDhiIDAgMCIsICJiYWQgZ3ppcCBtZXRob2QiLCAwLCAzMSwgMCwgWl9EQVRBX0VSUk9SKTsKLSAgICBpbmYoIjFmIDhiIDggODAiLCAiYmFkIGd6aXAgZmxhZ3MiLCAwLCAzMSwgMCwgWl9EQVRBX0VSUk9SKTsKLSAgICBpbmYoIjc3IDg1IiwgImJhZCB6bGliIG1ldGhvZCIsIDAsIDE1LCAwLCBaX0RBVEFfRVJST1IpOwotICAgIGluZigiOCA5OSIsICJzZXQgd2luZG93IHNpemUgZnJvbSBoZWFkZXIiLCAwLCAwLCAwLCBaX09LKTsKLSAgICBpbmYoIjc4IDljIiwgImJhZCB6bGliIHdpbmRvdyBzaXplIiwgMCwgOCwgMCwgWl9EQVRBX0VSUk9SKTsKLSAgICBpbmYoIjc4IDljIDYzIDAgMCAwIDEgMCAxIiwgImNoZWNrIGFkbGVyMzIiLCAwLCAxNSwgMSwgWl9TVFJFQU1fRU5EKTsKLSAgICBpbmYoIjFmIDhiIDggMWUgMCAwIDAgMCAwIDAgMSAwIDAgMCAwIDAgMCIsICJiYWQgaGVhZGVyIGNyYyIsIDAsIDQ3LCAxLAotICAgICAgICBaX0RBVEFfRVJST1IpOwotICAgIGluZigiMWYgOGIgOCAyIDAgMCAwIDAgMCAwIDFkIDI2IDMgMCAwIDAgMCAwIDAgMCAwIDAiLCAiY2hlY2sgZ3ppcCBsZW5ndGgiLAotICAgICAgICAwLCA0NywgMCwgWl9TVFJFQU1fRU5EKTsKLSAgICBpbmYoIjc4IDkwIiwgImJhZCB6bGliIGhlYWRlciBjaGVjayIsIDAsIDQ3LCAwLCBaX0RBVEFfRVJST1IpOwotICAgIGluZigiOCBiOCAwIDAgMCAxIiwgIm5lZWQgZGljdGlvbmFyeSIsIDAsIDgsIDAsIFpfTkVFRF9ESUNUKTsKLSAgICBpbmYoIjc4IDljIDYzIDAiLCAiY29tcHV0ZSBhZGxlcjMyIiwgMCwgMTUsIDEsIFpfT0spOwotCi0gICAgbWVtX3NldHVwKCZzdHJtKTsKLSAgICBzdHJtLmF2YWlsX2luID0gMDsKLSAgICBzdHJtLm5leHRfaW4gPSBaX05VTEw7Ci0gICAgcmV0ID0gaW5mbGF0ZUluaXQyKCZzdHJtLCAtOCk7Ci0gICAgc3RybS5hdmFpbF9pbiA9IDI7Ci0gICAgc3RybS5uZXh0X2luID0gKHZvaWQgKikiXHg2MyI7Ci0gICAgc3RybS5hdmFpbF9vdXQgPSAxOwotICAgIHN0cm0ubmV4dF9vdXQgPSAodm9pZCAqKSZyZXQ7Ci0gICAgbWVtX2xpbWl0KCZzdHJtLCAxKTsKLSAgICByZXQgPSBpbmZsYXRlKCZzdHJtLCBaX05PX0ZMVVNIKTsgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9NRU1fRVJST1IpOwotICAgIHJldCA9IGluZmxhdGUoJnN0cm0sIFpfTk9fRkxVU0gpOyAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX01FTV9FUlJPUik7Ci0gICAgbWVtX2xpbWl0KCZzdHJtLCAwKTsKLSAgICBtZW1zZXQoZGljdCwgMCwgMjU3KTsKLSAgICByZXQgPSBpbmZsYXRlU2V0RGljdGlvbmFyeSgmc3RybSwgZGljdCwgMjU3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7Ci0gICAgbWVtX2xpbWl0KCZzdHJtLCAoc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSA8PCAxKSArIDI1Nik7Ci0gICAgcmV0ID0gaW5mbGF0ZVByaW1lKCZzdHJtLCAxNiwgMCk7ICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOwotICAgIHN0cm0uYXZhaWxfaW4gPSAyOwotICAgIHN0cm0ubmV4dF9pbiA9ICh2b2lkICopIlx4ODAiOwotICAgIHJldCA9IGluZmxhdGVTeW5jKCZzdHJtKTsgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX0RBVEFfRVJST1IpOwotICAgIHJldCA9IGluZmxhdGUoJnN0cm0sIFpfTk9fRkxVU0gpOyAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX1NUUkVBTV9FUlJPUik7Ci0gICAgc3RybS5hdmFpbF9pbiA9IDQ7Ci0gICAgc3RybS5uZXh0X2luID0gKHZvaWQgKikiXDBcMFx4ZmZceGZmIjsKLSAgICByZXQgPSBpbmZsYXRlU3luYygmc3RybSk7ICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7Ci0gICAgKHZvaWQpaW5mbGF0ZVN5bmNQb2ludCgmc3RybSk7Ci0gICAgcmV0ID0gaW5mbGF0ZUNvcHkoJmNvcHksICZzdHJtKTsgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfTUVNX0VSUk9SKTsKLSAgICBtZW1fbGltaXQoJnN0cm0sIDApOwotICAgIHJldCA9IGluZmxhdGVVbmRlcm1pbmUoJnN0cm0sIDEpOyAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX0RBVEFfRVJST1IpOwotICAgICh2b2lkKWluZmxhdGVNYXJrKCZzdHJtKTsKLSAgICByZXQgPSBpbmZsYXRlRW5kKCZzdHJtKTsgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7Ci0gICAgbWVtX2RvbmUoJnN0cm0sICJtaXNjZWxsYW5lb3VzLCBmb3JjZSBtZW1vcnkgZXJyb3JzIik7Ci19Ci0KLS8qIGlucHV0IGFuZCBvdXRwdXQgZnVuY3Rpb25zIGZvciBpbmZsYXRlQmFjaygpICovCi1sb2NhbCB1bnNpZ25lZCBwdWxsKHZvaWQgKmRlc2MsIHVuc2lnbmVkIGNoYXIgKipidWYpCi17Ci0gICAgc3RhdGljIHVuc2lnbmVkIGludCBuZXh0ID0gMDsKLSAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBkYXRbXSA9IHsweDYzLCAwLCAyLCAwfTsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSAqc3RhdGU7Ci0KLSAgICBpZiAoZGVzYyA9PSBaX05VTEwpIHsKLSAgICAgICAgbmV4dCA9IDA7Ci0gICAgICAgIHJldHVybiAwOyAgIC8qIG5vIGlucHV0IChhbHJlYWR5IHByb3ZpZGVkIGF0IG5leHRfaW4pICovCi0gICAgfQotICAgIHN0YXRlID0gKHZvaWQgKikoKHpfc3RyZWFtICopZGVzYyktPnN0YXRlOwotICAgIGlmIChzdGF0ZSAhPSBaX05VTEwpCi0gICAgICAgIHN0YXRlLT5tb2RlID0gU1lOQzsgICAgIC8qIGZvcmNlIGFuIG90aGVyd2lzZSBpbXBvc3NpYmxlIHNpdHVhdGlvbiAqLwotICAgIHJldHVybiBuZXh0IDwgc2l6ZW9mKGRhdCkgPyAoKmJ1ZiA9IGRhdCArIG5leHQrKywgMSkgOiAwOwotfQotCi1sb2NhbCBpbnQgcHVzaCh2b2lkICpkZXNjLCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxlbikKLXsKLSAgICBidWYgKz0gbGVuOwotICAgIHJldHVybiBkZXNjICE9IFpfTlVMTDsgICAgICAvKiBmb3JjZSBlcnJvciBpZiBkZXNjIG5vdCBudWxsICovCi19Ci0KLS8qIGNvdmVyIGluZmxhdGVCYWNrKCkgdXAgdG8gY29tbW9uIGRlZmxhdGUgZGF0YSBjYXNlcyBhbmQgYWZ0ZXIgdGhvc2UgKi8KLWxvY2FsIHZvaWQgY292ZXJfYmFjayh2b2lkKQotewotICAgIGludCByZXQ7Ci0gICAgel9zdHJlYW0gc3RybTsKLSAgICB1bnNpZ25lZCBjaGFyIHdpblszMjc2OF07Ci0KLSAgICByZXQgPSBpbmZsYXRlQmFja0luaXRfKFpfTlVMTCwgMCwgd2luLCAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9WRVJTSU9OX0VSUk9SKTsKLSAgICByZXQgPSBpbmZsYXRlQmFja0luaXQoWl9OVUxMLCAwLCB3aW4pOyAgICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRVJST1IpOwotICAgIHJldCA9IGluZmxhdGVCYWNrKFpfTlVMTCwgWl9OVUxMLCBaX05VTEwsIFpfTlVMTCwgWl9OVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRVJST1IpOwotICAgIHJldCA9IGluZmxhdGVCYWNrRW5kKFpfTlVMTCk7ICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX1NUUkVBTV9FUlJPUik7Ci0gICAgZnB1dHMoImluZmxhdGVCYWNrIGJhZCBwYXJhbWV0ZXJzXG4iLCBzdGRlcnIpOwotCi0gICAgbWVtX3NldHVwKCZzdHJtKTsKLSAgICByZXQgPSBpbmZsYXRlQmFja0luaXQoJnN0cm0sIDE1LCB3aW4pOyAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7Ci0gICAgc3RybS5hdmFpbF9pbiA9IDI7Ci0gICAgc3RybS5uZXh0X2luID0gKHZvaWQgKikiXHgwMyI7Ci0gICAgcmV0ID0gaW5mbGF0ZUJhY2soJnN0cm0sIHB1bGwsIFpfTlVMTCwgcHVzaCwgWl9OVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRU5EKTsKLSAgICAgICAgLyogZm9yY2Ugb3V0cHV0IGVycm9yICovCi0gICAgc3RybS5hdmFpbF9pbiA9IDM7Ci0gICAgc3RybS5uZXh0X2luID0gKHZvaWQgKikiXHg2M1x4MDAiOwotICAgIHJldCA9IGluZmxhdGVCYWNrKCZzdHJtLCBwdWxsLCBaX05VTEwsIHB1c2gsICZzdHJtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9CVUZfRVJST1IpOwotICAgICAgICAvKiBmb3JjZSBtb2RlIGVycm9yIGJ5IG11Y2tpbmcgd2l0aCBzdGF0ZSAqLwotICAgIHJldCA9IGluZmxhdGVCYWNrKCZzdHJtLCBwdWxsLCAmc3RybSwgcHVzaCwgWl9OVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRVJST1IpOwotICAgIHJldCA9IGluZmxhdGVCYWNrRW5kKCZzdHJtKTsgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKLSAgICBtZW1fZG9uZSgmc3RybSwgImluZmxhdGVCYWNrIGJhZCBzdGF0ZSIpOwotCi0gICAgcmV0ID0gaW5mbGF0ZUJhY2tJbml0KCZzdHJtLCAxNSwgd2luKTsgICAgICBhc3NlcnQocmV0ID09IFpfT0spOwotICAgIHJldCA9IGluZmxhdGVCYWNrRW5kKCZzdHJtKTsgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKLSAgICBmcHV0cygiaW5mbGF0ZUJhY2sgYnVpbHQtaW4gbWVtb3J5IHJvdXRpbmVzXG4iLCBzdGRlcnIpOwotfQotCi0vKiBkbyBhIHJhdyBpbmZsYXRlIG9mIGRhdGEgaW4gaGV4YWRlY2ltYWwgd2l0aCBib3RoIGluZmxhdGUgYW5kIGluZmxhdGVCYWNrICovCi1sb2NhbCBpbnQgdHJ5KGNoYXIgKmhleCwgY2hhciAqaWQsIGludCBlcnIpCi17Ci0gICAgaW50IHJldDsKLSAgICB1bnNpZ25lZCBsZW4sIHNpemU7Ci0gICAgdW5zaWduZWQgY2hhciAqaW4sICpvdXQsICp3aW47Ci0gICAgY2hhciAqcHJlZml4OwotICAgIHpfc3RyZWFtIHN0cm07Ci0KLSAgICAvKiBjb252ZXJ0IHRvIGhleCAqLwotICAgIGluID0gaDJiKGhleCwgJmxlbik7Ci0gICAgYXNzZXJ0KGluICE9IE5VTEwpOwotCi0gICAgLyogYWxsb2NhdGUgd29yayBhcmVhcyAqLwotICAgIHNpemUgPSBsZW4gPDwgMzsKLSAgICBvdXQgPSBtYWxsb2Moc2l6ZSk7Ci0gICAgYXNzZXJ0KG91dCAhPSBOVUxMKTsKLSAgICB3aW4gPSBtYWxsb2MoMzI3NjgpOwotICAgIGFzc2VydCh3aW4gIT0gTlVMTCk7Ci0gICAgcHJlZml4ID0gbWFsbG9jKHN0cmxlbihpZCkgKyA2KTsKLSAgICBhc3NlcnQocHJlZml4ICE9IE5VTEwpOwotCi0gICAgLyogZmlyc3Qgd2l0aCBpbmZsYXRlICovCi0gICAgc3RyY3B5KHByZWZpeCwgaWQpOwotICAgIHN0cmNhdChwcmVmaXgsICItbGF0ZSIpOwotICAgIG1lbV9zZXR1cCgmc3RybSk7Ci0gICAgc3RybS5hdmFpbF9pbiA9IDA7Ci0gICAgc3RybS5uZXh0X2luID0gWl9OVUxMOwotICAgIHJldCA9IGluZmxhdGVJbml0Migmc3RybSwgZXJyIDwgMCA/IDQ3IDogLTE1KTsKLSAgICBhc3NlcnQocmV0ID09IFpfT0spOwotICAgIHN0cm0uYXZhaWxfaW4gPSBsZW47Ci0gICAgc3RybS5uZXh0X2luID0gaW47Ci0gICAgZG8gewotICAgICAgICBzdHJtLmF2YWlsX291dCA9IHNpemU7Ci0gICAgICAgIHN0cm0ubmV4dF9vdXQgPSBvdXQ7Ci0gICAgICAgIHJldCA9IGluZmxhdGUoJnN0cm0sIFpfVFJFRVMpOwotICAgICAgICBhc3NlcnQocmV0ICE9IFpfU1RSRUFNX0VSUk9SICYmIHJldCAhPSBaX01FTV9FUlJPUik7Ci0gICAgICAgIGlmIChyZXQgPT0gWl9EQVRBX0VSUk9SIHx8IHJldCA9PSBaX05FRURfRElDVCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0gd2hpbGUgKHN0cm0uYXZhaWxfaW4gfHwgc3RybS5hdmFpbF9vdXQgPT0gMCk7Ci0gICAgaWYgKGVycikgewotICAgICAgICBhc3NlcnQocmV0ID09IFpfREFUQV9FUlJPUik7Ci0gICAgICAgIGFzc2VydChzdHJjbXAoaWQsIHN0cm0ubXNnKSA9PSAwKTsKLSAgICB9Ci0gICAgaW5mbGF0ZUVuZCgmc3RybSk7Ci0gICAgbWVtX2RvbmUoJnN0cm0sIHByZWZpeCk7Ci0KLSAgICAvKiB0aGVuIHdpdGggaW5mbGF0ZUJhY2sgKi8KLSAgICBpZiAoZXJyID49IDApIHsKLSAgICAgICAgc3RyY3B5KHByZWZpeCwgaWQpOwotICAgICAgICBzdHJjYXQocHJlZml4LCAiLWJhY2siKTsKLSAgICAgICAgbWVtX3NldHVwKCZzdHJtKTsKLSAgICAgICAgcmV0ID0gaW5mbGF0ZUJhY2tJbml0KCZzdHJtLCAxNSwgd2luKTsKLSAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKLSAgICAgICAgc3RybS5hdmFpbF9pbiA9IGxlbjsKLSAgICAgICAgc3RybS5uZXh0X2luID0gaW47Ci0gICAgICAgIHJldCA9IGluZmxhdGVCYWNrKCZzdHJtLCBwdWxsLCBaX05VTEwsIHB1c2gsIFpfTlVMTCk7Ci0gICAgICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOwotICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfREFUQV9FUlJPUik7Ci0gICAgICAgICAgICBhc3NlcnQoc3RyY21wKGlkLCBzdHJtLm1zZykgPT0gMCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW5mbGF0ZUJhY2tFbmQoJnN0cm0pOwotICAgICAgICBtZW1fZG9uZSgmc3RybSwgcHJlZml4KTsKLSAgICB9Ci0KLSAgICAvKiBjbGVhbiB1cCAqLwotICAgIGZyZWUocHJlZml4KTsKLSAgICBmcmVlKHdpbik7Ci0gICAgZnJlZShvdXQpOwotICAgIGZyZWUoaW4pOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLS8qIGNvdmVyIGRlZmxhdGUgZGF0YSBjYXNlcyBpbiBib3RoIGluZmxhdGUoKSBhbmQgaW5mbGF0ZUJhY2soKSAqLwotbG9jYWwgdm9pZCBjb3Zlcl9pbmZsYXRlKHZvaWQpCi17Ci0gICAgdHJ5KCIwIDAgMCAwIDAiLCAiaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyIsIDEpOwotICAgIHRyeSgiMyAwIiwgImZpeGVkIiwgMCk7Ci0gICAgdHJ5KCI2IiwgImludmFsaWQgYmxvY2sgdHlwZSIsIDEpOwotICAgIHRyeSgiMSAxIDAgZmUgZmYgMCIsICJzdG9yZWQiLCAwKTsKLSAgICB0cnkoImZjIDAgMCIsICJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyIsIDEpOwotICAgIHRyeSgiNCAwIGZlIGZmIiwgImludmFsaWQgY29kZSBsZW5ndGhzIHNldCIsIDEpOwotICAgIHRyeSgiNCAwIDI0IDQ5IDAiLCAiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsIDEpOwotICAgIHRyeSgiNCAwIDI0IGU5IGZmIGZmIiwgImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLCAxKTsKLSAgICB0cnkoIjQgMCAyNCBlOSBmZiA2ZCIsICJpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2siLCAxKTsKLSAgICB0cnkoIjQgODAgNDkgOTIgMjQgNDkgOTIgMjQgNzEgZmYgZmYgOTMgMTEgMCIsCi0gICAgICAgICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiLCAxKTsKLSAgICB0cnkoIjQgODAgNDkgOTIgMjQgNDkgOTIgMjQgZiBiNCBmZiBmZiBjMyA4NCIsICJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiLCAxKTsKLSAgICB0cnkoIjQgYzAgODEgOCAwIDAgMCAwIDIwIDdmIGViIGIgMCAwIiwgImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsIDEpOwotICAgIHRyeSgiMiA3ZSBmZiBmZiIsICJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLCAxKTsKLSAgICB0cnkoImMgYzAgODEgMCAwIDAgMCAwIDkwIGZmIDZiIDQgMCIsICJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsIDEpOwotCi0gICAgLyogYWxzbyB0cmFpbGVyIG1pc21hdGNoIGp1c3QgaW4gaW5mbGF0ZSgpICovCi0gICAgdHJ5KCIxZiA4YiA4IDAgMCAwIDAgMCAwIDAgMyAwIDAgMCAwIDEiLCAiaW5jb3JyZWN0IGRhdGEgY2hlY2siLCAtMSk7Ci0gICAgdHJ5KCIxZiA4YiA4IDAgMCAwIDAgMCAwIDAgMyAwIDAgMCAwIDAgMCAwIDAgMSIsCi0gICAgICAgICJpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrIiwgLTEpOwotICAgIHRyeSgiNSBjMCAyMSBkIDAgMCAwIDgwIGIwIGZlIDZkIDJmIDkxIDZjIiwgInB1bGwgMTciLCAwKTsKLSAgICB0cnkoIjUgZTAgODEgOTEgMjQgY2IgYjIgMmMgNDkgZTIgZiAyZSA4YiA5YSA0NyA1NiA5ZiBmYiBmZSBlYyBkMiBmZiAxZiIsCi0gICAgICAgICJsb25nIGNvZGUiLCAwKTsKLSAgICB0cnkoImVkIGMwIDEgMSAwIDAgMCA0MCAyMCBmZiA1NyAxYiA0MiAyYyA0ZiIsICJsZW5ndGggZXh0cmEiLCAwKTsKLSAgICB0cnkoImVkIGNmIGMxIGIxIDJjIDQ3IDEwIGM0IDMwIGZhIDZmIDM1IDFkIDEgODIgNTkgM2QgZmIgYmUgMmUgMmEgZmMgZiBjIiwKLSAgICAgICAgImxvbmcgZGlzdGFuY2UgYW5kIGV4dHJhIiwgMCk7Ci0gICAgdHJ5KCJlZCBjMCA4MSAwIDAgMCAwIDgwIGEwIGZkIGE5IDE3IGE5IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAiCi0gICAgICAgICIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA2IiwgIndpbmRvdyBlbmQiLCAwKTsKLSAgICBpbmYoIjIgOCAyMCA4MCAwIDMgMCIsICJpbmZsYXRlX2Zhc3QgVFlQRSByZXR1cm4iLCAwLCAtMTUsIDI1OCwKLSAgICAgICAgWl9TVFJFQU1fRU5EKTsKLSAgICBpbmYoIjYzIDE4IDUgNDAgYyAwIiwgIndpbmRvdyB3cmFwIiwgMywgLTgsIDMwMCwgWl9PSyk7Ci19Ci0KLS8qIGNvdmVyIHJlbWFpbmluZyBsaW5lcyBpbiBpbmZ0cmVlcy5jICovCi1sb2NhbCB2b2lkIGNvdmVyX3RyZWVzKHZvaWQpCi17Ci0gICAgaW50IHJldDsKLSAgICB1bnNpZ25lZCBiaXRzOwotICAgIHVuc2lnbmVkIHNob3J0IGxlbnNbMTZdLCB3b3JrWzE2XTsKLSAgICBjb2RlICpuZXh0LCB0YWJsZVtFTk9VR0hfRElTVFNdOwotCi0gICAgLyogd2UgbmVlZCB0byBjYWxsIGluZmxhdGVfdGFibGUoKSBkaXJlY3RseSBpbiBvcmRlciB0byBtYW5pZmVzdCBub3QtCi0gICAgICAgZW5vdWdoIGVycm9ycywgc2luY2UgemxpYiBpbnN1cmVzIHRoYXQgZW5vdWdoIGlzIGFsd2F5cyBlbm91Z2ggKi8KLSAgICBmb3IgKGJpdHMgPSAwOyBiaXRzIDwgMTU7IGJpdHMrKykKLSAgICAgICAgbGVuc1tiaXRzXSA9ICh1bnNpZ25lZCBzaG9ydCkoYml0cyArIDEpOwotICAgIGxlbnNbMTVdID0gMTU7Ci0gICAgbmV4dCA9IHRhYmxlOwotICAgIGJpdHMgPSAxNTsKLSAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBsZW5zLCAxNiwgJm5leHQsICZiaXRzLCB3b3JrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gMSk7Ci0gICAgbmV4dCA9IHRhYmxlOwotICAgIGJpdHMgPSAxOwotICAgIHJldCA9IGluZmxhdGVfdGFibGUoRElTVFMsIGxlbnMsIDE2LCAmbmV4dCwgJmJpdHMsIHdvcmspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSAxKTsKLSAgICBmcHV0cygiaW5mbGF0ZV90YWJsZSBub3QgZW5vdWdoIGVycm9yc1xuIiwgc3RkZXJyKTsKLX0KLQotLyogY292ZXIgcmVtYWluaW5nIGluZmZhc3QuYyBkZWNvZGluZyBhbmQgd2luZG93IGNvcHlpbmcgKi8KLWxvY2FsIHZvaWQgY292ZXJfZmFzdCh2b2lkKQotewotICAgIGluZigiZTUgZTAgODEgYWQgNmQgY2IgYjIgMmMgYzkgMDEgMWUgNTkgNjMgYWUgN2QgZWUgZmIgNGQgZmQgYjUgMzUgNDEgNjgiCi0gICAgICAgICIgZmYgN2YgMGYgMCAwIDAiLCAiZmFzdCBsZW5ndGggZXh0cmEgYml0cyIsIDAsIC04LCAyNTgsIFpfREFUQV9FUlJPUik7Ci0gICAgaW5mKCIyNSBmZCA4MSBiNSA2ZCA1OSBiNiA2YSA0OSBlYSBhZiAzNSA2IDM0IGViIDhjIGI5IGY2IGI5IDFlIGVmIDY3IDQ5IgotICAgICAgICAiIDUwIGZlIGZmIGZmIDNmIDAgMCIsICJmYXN0IGRpc3RhbmNlIGV4dHJhIGJpdHMiLCAwLCAtOCwgMjU4LAotICAgICAgICBaX0RBVEFfRVJST1IpOwotICAgIGluZigiMyA3ZSAwIDAgMCAwIDAiLCAiZmFzdCBpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLCAwLCAtOCwgMjU4LAotICAgICAgICBaX0RBVEFfRVJST1IpOwotICAgIGluZigiMWIgNyAwIDAgMCAwIDAiLCAiZmFzdCBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiLCAwLCAtOCwgMjU4LAotICAgICAgICBaX0RBVEFfRVJST1IpOwotICAgIGluZigiZCBjNyAxIGFlIGViIDM4IGMgNCA0MSBhMCA4NyA3MiBkZSBkZiBmYiAxZiBiOCAzNiBiMSAzOCA1ZCBmZiBmZiAwIiwKLSAgICAgICAgImZhc3QgMm5kIGxldmVsIGNvZGVzIGFuZCB0b28gZmFyIGJhY2siLCAwLCAtOCwgMjU4LCBaX0RBVEFfRVJST1IpOwotICAgIGluZigiNjMgMTggNSA4YyAxMCA4IDAgMCAwIDAiLCAidmVyeSBjb21tb24gY2FzZSIsIDAsIC04LCAyNTksIFpfT0spOwotICAgIGluZigiNjMgNjAgNjAgMTggYzkgMCA4IDE4IDE4IDE4IDI2IGMwIDI4IDAgMjkgMCAwIDAiLAotICAgICAgICAiY29udGlndW91cyBhbmQgd3JhcCBhcm91bmQgd2luZG93IiwgNiwgLTgsIDI1OSwgWl9PSyk7Ci0gICAgaW5mKCI2MyAwIDMgMCAwIDAgMCAwIiwgImNvcHkgZGlyZWN0IGZyb20gb3V0cHV0IiwgMCwgLTgsIDI1OSwKLSAgICAgICAgWl9TVFJFQU1fRU5EKTsKLX0KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCB6bGliVmVyc2lvbigpKTsKLSAgICBjb3Zlcl9zdXBwb3J0KCk7Ci0gICAgY292ZXJfd3JhcCgpOwotICAgIGNvdmVyX2JhY2soKTsKLSAgICBjb3Zlcl9pbmZsYXRlKCk7Ci0gICAgY292ZXJfdHJlZXMoKTsKLSAgICBjb3Zlcl9mYXN0KCk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zcmMvemxpYi90ZXN0L21pbmlnemlwLmMgYi9zcmMvemxpYi90ZXN0L21pbmlnemlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhN2FjN2EuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvdGVzdC9taW5pZ3ppcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMxICswLDAgQEAKLS8qIG1pbmlnemlwLmMgLS0gc2ltdWxhdGUgZ3ppcCB1c2luZyB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNiwgMjAxMCwgMjAxMSBKZWFuLWxvdXAgR2FpbGx5LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qCi0gKiBtaW5pZ3ppcCBpcyBhIG1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGd6aXAgdXRpbGl0eS4gVGhpcyBpcwotICogb25seSBhbiBleGFtcGxlIG9mIHVzaW5nIHpsaWIgYW5kIGlzbid0IG1lYW50IHRvIHJlcGxhY2UgdGhlCi0gKiBmdWxsLWZlYXR1cmVkIGd6aXAuIE5vIGF0dGVtcHQgaXMgbWFkZSB0byBkZWFsIHdpdGggZmlsZSBzeXN0ZW1zCi0gKiBsaW1pdGluZyBuYW1lcyB0byAxNCBvciA4KzMgY2hhcmFjdGVycywgZXRjLi4uIEVycm9yIGNoZWNraW5nIGlzCi0gKiB2ZXJ5IGxpbWl0ZWQuIFNvIHVzZSBtaW5pZ3ppcCBvbmx5IGZvciB0ZXN0aW5nOyB1c2UgZ3ppcCBmb3IgdGhlCi0gKiByZWFsIHRoaW5nLiBPbiBNU0RPUywgdXNlIG9ubHkgb24gZmlsZSBuYW1lcyB3aXRob3V0IGV4dGVuc2lvbgotICogb3IgaW4gcGlwZSBtb2RlLgotICovCi0KLS8qIEAoIykgJElkJCAqLwotCi0jaW5jbHVkZSAiemxpYi5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBTVERDCi0jICBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBVU0VfTU1BUAotIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jICBpbmNsdWRlIDxzeXMvbW1hbi5oPgotIyAgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSMgIGluY2x1ZGUgPGZjbnRsLmg+Ci0jICBpbmNsdWRlIDxpby5oPgotIyAgaWZkZWYgVU5ERVJfQ0UKLSMgICAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jICBlbmRpZgotIyAgZGVmaW5lIFNFVF9CSU5BUllfTU9ERShmaWxlKSBzZXRtb2RlKGZpbGVubyhmaWxlKSwgT19CSU5BUlkpCi0jZWxzZQotIyAgZGVmaW5lIFNFVF9CSU5BUllfTU9ERShmaWxlKQotI2VuZGlmCi0KLSNpZmRlZiBWTVMKLSMgIGRlZmluZSB1bmxpbmsgZGVsZXRlCi0jICBkZWZpbmUgR1pfU1VGRklYICItZ3oiCi0jZW5kaWYKLSNpZmRlZiBSSVNDT1MKLSMgIGRlZmluZSB1bmxpbmsgcmVtb3ZlCi0jICBkZWZpbmUgR1pfU1VGRklYICItZ3oiCi0jICBkZWZpbmUgZmlsZW5vKGZpbGUpIGZpbGUtPl9fZmlsZQotI2VuZGlmCi0jaWYgZGVmaW5lZChfX01XRVJLU19fKSAmJiBfX2Rlc3Rfb3MgIT0gX19iZV9vcyAmJiBfX2Rlc3Rfb3MgIT0gX193aW4zMl9vcwotIyAgaW5jbHVkZSA8dW5peC5oPiAvKiBmb3IgZmlsZW5vICovCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFpfSEFWRV9VTklTVERfSCkgJiYgIWRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkKLSNpZm5kZWYgV0lOMzIgLyogdW5saW5rIGFscmVhZHkgaW4gc3RkaW8uaCBmb3IgV0lOMzIgKi8KLSAgZXh0ZXJuIGludCB1bmxpbmsgT0YoKGNvbnN0IGNoYXIgKikpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoVU5ERVJfQ0UpCi0jICBpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jICBkZWZpbmUgcGVycm9yKHMpIHB3aW5lcnJvcihzKQotCi0vKiBNYXAgdGhlIFdpbmRvd3MgZXJyb3IgbnVtYmVyIGluIEVSUk9SIHRvIGEgbG9jYWxlLWRlcGVuZGVudCBlcnJvcgotICAgbWVzc2FnZSBzdHJpbmcgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuICBUeXBpY2FsbHksIHRoZSB2YWx1ZXMKLSAgIGZvciBFUlJPUiBjb21lIGZyb20gR2V0TGFzdEVycm9yLgotCi0gICBUaGUgc3RyaW5nIHBvaW50ZWQgdG8gc2hhbGwgbm90IGJlIG1vZGlmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwKLSAgIGJ1dCBtYXkgYmUgb3ZlcndyaXR0ZW4gYnkgYSBzdWJzZXF1ZW50IGNhbGwgdG8gc3Ryd2luZXJyb3IKLQotICAgVGhlIHN0cndpbmVycm9yIGZ1bmN0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgY3VycmVudCBzZXR0aW5nCi0gICBvZiBHZXRMYXN0RXJyb3IuICAqLwotCi1zdGF0aWMgY2hhciAqc3Ryd2luZXJyb3IgKGVycm9yKQotICAgICBEV09SRCBlcnJvcjsKLXsKLSAgICBzdGF0aWMgY2hhciBidWZbMTAyNF07Ci0KLSAgICB3Y2hhcl90ICptc2didWY7Ci0gICAgRFdPUkQgbGFzdGVyciA9IEdldExhc3RFcnJvcigpOwotICAgIERXT1JEIGNoYXJzID0gRm9ybWF0TWVzc2FnZShGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTQotICAgICAgICB8IEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiwKLSAgICAgICAgTlVMTCwKLSAgICAgICAgZXJyb3IsCi0gICAgICAgIDAsIC8qIERlZmF1bHQgbGFuZ3VhZ2UgKi8KLSAgICAgICAgKExQVk9JRCkmbXNnYnVmLAotICAgICAgICAwLAotICAgICAgICBOVUxMKTsKLSAgICBpZiAoY2hhcnMgIT0gMCkgewotICAgICAgICAvKiBJZiB0aGVyZSBpcyBhbiBcclxuIGFwcGVuZGVkLCB6YXAgaXQuICAqLwotICAgICAgICBpZiAoY2hhcnMgPj0gMgotICAgICAgICAgICAgJiYgbXNnYnVmW2NoYXJzIC0gMl0gPT0gJ1xyJyAmJiBtc2didWZbY2hhcnMgLSAxXSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICBjaGFycyAtPSAyOwotICAgICAgICAgICAgbXNnYnVmW2NoYXJzXSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2hhcnMgPiBzaXplb2YgKGJ1ZikgLSAxKSB7Ci0gICAgICAgICAgICBjaGFycyA9IHNpemVvZiAoYnVmKSAtIDE7Ci0gICAgICAgICAgICBtc2didWZbY2hhcnNdID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHdjc3RvbWJzKGJ1ZiwgbXNnYnVmLCBjaGFycyArIDEpOwotICAgICAgICBMb2NhbEZyZWUobXNnYnVmKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHNwcmludGYoYnVmLCAidW5rbm93biB3aW4zMiBlcnJvciAoJWxkKSIsIGVycm9yKTsKLSAgICB9Ci0KLSAgICBTZXRMYXN0RXJyb3IobGFzdGVycik7Ci0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIHZvaWQgcHdpbmVycm9yIChzKQotICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gICAgaWYgKHMgJiYgKnMpCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCBzLCBzdHJ3aW5lcnJvcihHZXRMYXN0RXJyb3IgKCkpKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIHN0cndpbmVycm9yKEdldExhc3RFcnJvciAoKSkpOwotfQotCi0jZW5kaWYgLyogVU5ERVJfQ0UgKi8KLQotI2lmbmRlZiBHWl9TVUZGSVgKLSMgIGRlZmluZSBHWl9TVUZGSVggIi5neiIKLSNlbmRpZgotI2RlZmluZSBTVUZGSVhfTEVOIChzaXplb2YoR1pfU1VGRklYKS0xKQotCi0jZGVmaW5lIEJVRkxFTiAgICAgIDE2Mzg0Ci0jZGVmaW5lIE1BWF9OQU1FX0xFTiAxMDI0Ci0KLSNpZmRlZiBNQVhTRUdfNjRLCi0jICBkZWZpbmUgbG9jYWwgc3RhdGljCi0gICAvKiBOZWVkZWQgZm9yIHN5c3RlbXMgd2l0aCBsaW1pdGF0aW9uIG9uIHN0YWNrIHNpemUuICovCi0jZWxzZQotIyAgZGVmaW5lIGxvY2FsCi0jZW5kaWYKLQotI2lmZGVmIFpfU09MTwotLyogZm9yIFpfU09MTywgY3JlYXRlIHNpbXBsaWZpZWQgZ3oqIGZ1bmN0aW9ucyB1c2luZyBkZWZsYXRlIGFuZCBpbmZsYXRlICovCi0KLSNpZiBkZWZpbmVkKFpfSEFWRV9VTklTVERfSCkgfHwgZGVmaW5lZChaX0xBUkdFKQotIyAgaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgIC8qIGZvciB1bmxpbmsoKSAqLwotI2VuZGlmCi0KLXZvaWQgKm15YWxsb2MgT0YoKHZvaWQgKiwgdW5zaWduZWQsIHVuc2lnbmVkKSk7Ci12b2lkIG15ZnJlZSBPRigodm9pZCAqLCB2b2lkICopKTsKLQotdm9pZCAqbXlhbGxvYyhxLCBuLCBtKQotICAgIHZvaWQgKnE7Ci0gICAgdW5zaWduZWQgbiwgbTsKLXsKLSAgICBxID0gWl9OVUxMOwotICAgIHJldHVybiBjYWxsb2MobiwgbSk7Ci19Ci0KLXZvaWQgbXlmcmVlKHEsIHApCi0gICAgdm9pZCAqcSwgKnA7Ci17Ci0gICAgcSA9IFpfTlVMTDsKLSAgICBmcmVlKHApOwotfQotCi10eXBlZGVmIHN0cnVjdCBnekZpbGVfcyB7Ci0gICAgRklMRSAqZmlsZTsKLSAgICBpbnQgd3JpdGU7Ci0gICAgaW50IGVycjsKLSAgICBjaGFyICptc2c7Ci0gICAgel9zdHJlYW0gc3RybTsKLX0gKmd6RmlsZTsKLQotZ3pGaWxlIGd6b3BlbiBPRigoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLWd6RmlsZSBnemRvcGVuIE9GKChpbnQsIGNvbnN0IGNoYXIgKikpOwotZ3pGaWxlIGd6X29wZW4gT0YoKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopKTsKLQotZ3pGaWxlIGd6b3BlbihwYXRoLCBtb2RlKQotY29uc3QgY2hhciAqcGF0aDsKLWNvbnN0IGNoYXIgKm1vZGU7Ci17Ci0gICAgcmV0dXJuIGd6X29wZW4ocGF0aCwgLTEsIG1vZGUpOwotfQotCi1nekZpbGUgZ3pkb3BlbihmZCwgbW9kZSkKLWludCBmZDsKLWNvbnN0IGNoYXIgKm1vZGU7Ci17Ci0gICAgcmV0dXJuIGd6X29wZW4oTlVMTCwgZmQsIG1vZGUpOwotfQotCi1nekZpbGUgZ3pfb3BlbihwYXRoLCBmZCwgbW9kZSkKLSAgICBjb25zdCBjaGFyICpwYXRoOwotICAgIGludCBmZDsKLSAgICBjb25zdCBjaGFyICptb2RlOwotewotICAgIGd6RmlsZSBnejsKLSAgICBpbnQgcmV0OwotCi0gICAgZ3ogPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBnekZpbGVfcykpOwotICAgIGlmIChneiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBnei0+d3JpdGUgPSBzdHJjaHIobW9kZSwgJ3cnKSAhPSBOVUxMOwotICAgIGd6LT5zdHJtLnphbGxvYyA9IG15YWxsb2M7Ci0gICAgZ3otPnN0cm0uemZyZWUgPSBteWZyZWU7Ci0gICAgZ3otPnN0cm0ub3BhcXVlID0gWl9OVUxMOwotICAgIGlmIChnei0+d3JpdGUpCi0gICAgICAgIHJldCA9IGRlZmxhdGVJbml0MigmKGd6LT5zdHJtKSwgLTEsIDgsIDE1ICsgMTYsIDgsIDApOwotICAgIGVsc2UgewotICAgICAgICBnei0+c3RybS5uZXh0X2luID0gMDsKLSAgICAgICAgZ3otPnN0cm0uYXZhaWxfaW4gPSBaX05VTEw7Ci0gICAgICAgIHJldCA9IGluZmxhdGVJbml0MigmKGd6LT5zdHJtKSwgMTUgKyAxNik7Ci0gICAgfQotICAgIGlmIChyZXQgIT0gWl9PSykgewotICAgICAgICBmcmVlKGd6KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGd6LT5maWxlID0gcGF0aCA9PSBOVUxMID8gZmRvcGVuKGZkLCBnei0+d3JpdGUgPyAid2IiIDogInJiIikgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9wZW4ocGF0aCwgZ3otPndyaXRlID8gIndiIiA6ICJyYiIpOwotICAgIGlmIChnei0+ZmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIGd6LT53cml0ZSA/IGRlZmxhdGVFbmQoJihnei0+c3RybSkpIDogaW5mbGF0ZUVuZCgmKGd6LT5zdHJtKSk7Ci0gICAgICAgIGZyZWUoZ3opOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZ3otPmVyciA9IDA7Ci0gICAgZ3otPm1zZyA9ICIiOwotICAgIHJldHVybiBnejsKLX0KLQotaW50IGd6d3JpdGUgT0YoKGd6RmlsZSwgY29uc3Qgdm9pZCAqLCB1bnNpZ25lZCkpOwotCi1pbnQgZ3p3cml0ZShneiwgYnVmLCBsZW4pCi0gICAgZ3pGaWxlIGd6OwotICAgIGNvbnN0IHZvaWQgKmJ1ZjsKLSAgICB1bnNpZ25lZCBsZW47Ci17Ci0gICAgel9zdHJlYW0gKnN0cm07Ci0gICAgdW5zaWduZWQgY2hhciBvdXRbQlVGTEVOXTsKLQotICAgIGlmIChneiA9PSBOVUxMIHx8ICFnei0+d3JpdGUpCi0gICAgICAgIHJldHVybiAwOwotICAgIHN0cm0gPSAmKGd6LT5zdHJtKTsKLSAgICBzdHJtLT5uZXh0X2luID0gKHZvaWQgKilidWY7Ci0gICAgc3RybS0+YXZhaWxfaW4gPSBsZW47Ci0gICAgZG8gewotICAgICAgICBzdHJtLT5uZXh0X291dCA9IG91dDsKLSAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gQlVGTEVOOwotICAgICAgICAodm9pZClkZWZsYXRlKHN0cm0sIFpfTk9fRkxVU0gpOwotICAgICAgICBmd3JpdGUob3V0LCAxLCBCVUZMRU4gLSBzdHJtLT5hdmFpbF9vdXQsIGd6LT5maWxlKTsKLSAgICB9IHdoaWxlIChzdHJtLT5hdmFpbF9vdXQgPT0gMCk7Ci0gICAgcmV0dXJuIGxlbjsKLX0KLQotaW50IGd6cmVhZCBPRigoZ3pGaWxlLCB2b2lkICosIHVuc2lnbmVkKSk7Ci0KLWludCBnenJlYWQoZ3osIGJ1ZiwgbGVuKQotICAgIGd6RmlsZSBnejsKLSAgICB2b2lkICpidWY7Ci0gICAgdW5zaWduZWQgbGVuOwotewotICAgIGludCByZXQ7Ci0gICAgdW5zaWduZWQgZ290OwotICAgIHVuc2lnbmVkIGNoYXIgaW5bMV07Ci0gICAgel9zdHJlYW0gKnN0cm07Ci0KLSAgICBpZiAoZ3ogPT0gTlVMTCB8fCBnei0+d3JpdGUpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChnei0+ZXJyKQotICAgICAgICByZXR1cm4gMDsKLSAgICBzdHJtID0gJihnei0+c3RybSk7Ci0gICAgc3RybS0+bmV4dF9vdXQgPSAodm9pZCAqKWJ1ZjsKLSAgICBzdHJtLT5hdmFpbF9vdXQgPSBsZW47Ci0gICAgZG8gewotICAgICAgICBnb3QgPSBmcmVhZChpbiwgMSwgMSwgZ3otPmZpbGUpOwotICAgICAgICBpZiAoZ290ID09IDApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3RybS0+bmV4dF9pbiA9IGluOwotICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IDE7Ci0gICAgICAgIHJldCA9IGluZmxhdGUoc3RybSwgWl9OT19GTFVTSCk7Ci0gICAgICAgIGlmIChyZXQgPT0gWl9EQVRBX0VSUk9SKSB7Ci0gICAgICAgICAgICBnei0+ZXJyID0gWl9EQVRBX0VSUk9SOwotICAgICAgICAgICAgZ3otPm1zZyA9IHN0cm0tPm1zZzsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EKQotICAgICAgICAgICAgaW5mbGF0ZVJlc2V0KHN0cm0pOwotICAgIH0gd2hpbGUgKHN0cm0tPmF2YWlsX291dCk7Ci0gICAgcmV0dXJuIGxlbiAtIHN0cm0tPmF2YWlsX291dDsKLX0KLQotaW50IGd6Y2xvc2UgT0YoKGd6RmlsZSkpOwotCi1pbnQgZ3pjbG9zZShneikKLSAgICBnekZpbGUgZ3o7Ci17Ci0gICAgel9zdHJlYW0gKnN0cm07Ci0gICAgdW5zaWduZWQgY2hhciBvdXRbQlVGTEVOXTsKLQotICAgIGlmIChneiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RybSA9ICYoZ3otPnN0cm0pOwotICAgIGlmIChnei0+d3JpdGUpIHsKLSAgICAgICAgc3RybS0+bmV4dF9pbiA9IFpfTlVMTDsKLSAgICAgICAgc3RybS0+YXZhaWxfaW4gPSAwOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBzdHJtLT5uZXh0X291dCA9IG91dDsKLSAgICAgICAgICAgIHN0cm0tPmF2YWlsX291dCA9IEJVRkxFTjsKLSAgICAgICAgICAgICh2b2lkKWRlZmxhdGUoc3RybSwgWl9GSU5JU0gpOwotICAgICAgICAgICAgZndyaXRlKG91dCwgMSwgQlVGTEVOIC0gc3RybS0+YXZhaWxfb3V0LCBnei0+ZmlsZSk7Ci0gICAgICAgIH0gd2hpbGUgKHN0cm0tPmF2YWlsX291dCA9PSAwKTsKLSAgICAgICAgZGVmbGF0ZUVuZChzdHJtKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBpbmZsYXRlRW5kKHN0cm0pOwotICAgIGZjbG9zZShnei0+ZmlsZSk7Ci0gICAgZnJlZShneik7Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLWNvbnN0IGNoYXIgKmd6ZXJyb3IgT0YoKGd6RmlsZSwgaW50ICopKTsKLQotY29uc3QgY2hhciAqZ3plcnJvcihneiwgZXJyKQotICAgIGd6RmlsZSBnejsKLSAgICBpbnQgKmVycjsKLXsKLSAgICAqZXJyID0gZ3otPmVycjsKLSAgICByZXR1cm4gZ3otPm1zZzsKLX0KLQotI2VuZGlmCi0KLWNoYXIgKnByb2c7Ci0KLXZvaWQgZXJyb3IgICAgICAgICAgICBPRigoY29uc3QgY2hhciAqbXNnKSk7Ci12b2lkIGd6X2NvbXByZXNzICAgICAgT0YoKEZJTEUgICAqaW4sIGd6RmlsZSBvdXQpKTsKLSNpZmRlZiBVU0VfTU1BUAotaW50ICBnel9jb21wcmVzc19tbWFwIE9GKChGSUxFICAgKmluLCBnekZpbGUgb3V0KSk7Ci0jZW5kaWYKLXZvaWQgZ3pfdW5jb21wcmVzcyAgICBPRigoZ3pGaWxlIGluLCBGSUxFICAgKm91dCkpOwotdm9pZCBmaWxlX2NvbXByZXNzICAgIE9GKChjaGFyICAqZmlsZSwgY2hhciAqbW9kZSkpOwotdm9pZCBmaWxlX3VuY29tcHJlc3MgIE9GKChjaGFyICAqZmlsZSkpOwotaW50ICBtYWluICAgICAgICAgICAgIE9GKChpbnQgYXJnYywgY2hhciAqYXJndltdKSk7Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogRGlzcGxheSBlcnJvciBtZXNzYWdlIGFuZCBleGl0Ci0gKi8KLXZvaWQgZXJyb3IobXNnKQotICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgcHJvZywgbXNnKTsKLSAgICBleGl0KDEpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvbXByZXNzIGlucHV0IHRvIG91dHB1dCB0aGVuIGNsb3NlIGJvdGggZmlsZXMuCi0gKi8KLQotdm9pZCBnel9jb21wcmVzcyhpbiwgb3V0KQotICAgIEZJTEUgICAqaW47Ci0gICAgZ3pGaWxlIG91dDsKLXsKLSAgICBsb2NhbCBjaGFyIGJ1ZltCVUZMRU5dOwotICAgIGludCBsZW47Ci0gICAgaW50IGVycjsKLQotI2lmZGVmIFVTRV9NTUFQCi0gICAgLyogVHJ5IGZpcnN0IGNvbXByZXNzaW5nIHdpdGggbW1hcC4gSWYgbW1hcCBmYWlscyAobWluaWd6aXAgdXNlZCBpbiBhCi0gICAgICogcGlwZSksIHVzZSB0aGUgbm9ybWFsIGZyZWFkIGxvb3AuCi0gICAgICovCi0gICAgaWYgKGd6X2NvbXByZXNzX21tYXAoaW4sIG91dCkgPT0gWl9PSykgcmV0dXJuOwotI2VuZGlmCi0gICAgZm9yICg7OykgewotICAgICAgICBsZW4gPSAoaW50KWZyZWFkKGJ1ZiwgMSwgc2l6ZW9mKGJ1ZiksIGluKTsKLSAgICAgICAgaWYgKGZlcnJvcihpbikpIHsKLSAgICAgICAgICAgIHBlcnJvcigiZnJlYWQiKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxlbiA9PSAwKSBicmVhazsKLQotICAgICAgICBpZiAoZ3p3cml0ZShvdXQsIGJ1ZiwgKHVuc2lnbmVkKWxlbikgIT0gbGVuKSBlcnJvcihnemVycm9yKG91dCwgJmVycikpOwotICAgIH0KLSAgICBmY2xvc2UoaW4pOwotICAgIGlmIChnemNsb3NlKG91dCkgIT0gWl9PSykgZXJyb3IoImZhaWxlZCBnemNsb3NlIik7Ci19Ci0KLSNpZmRlZiBVU0VfTU1BUCAvKiBNTUFQIHZlcnNpb24sIE1pZ3VlbCBBbGJyZWNodCA8bWFsYnJlY2hAZXNvLm9yZz4gKi8KLQotLyogVHJ5IGNvbXByZXNzaW5nIHRoZSBpbnB1dCBmaWxlIGF0IG9uY2UgdXNpbmcgbW1hcC4gUmV0dXJuIFpfT0sgaWYKLSAqIGlmIHN1Y2Nlc3MsIFpfRVJSTk8gb3RoZXJ3aXNlLgotICovCi1pbnQgZ3pfY29tcHJlc3NfbW1hcChpbiwgb3V0KQotICAgIEZJTEUgICAqaW47Ci0gICAgZ3pGaWxlIG91dDsKLXsKLSAgICBpbnQgbGVuOwotICAgIGludCBlcnI7Ci0gICAgaW50IGlmZCA9IGZpbGVubyhpbik7Ci0gICAgY2FkZHJfdCBidWY7ICAgIC8qIG1tYXAnZWQgYnVmZmVyIGZvciB0aGUgZW50aXJlIGlucHV0IGZpbGUgKi8KLSAgICBvZmZfdCBidWZfbGVuOyAgLyogbGVuZ3RoIG9mIHRoZSBpbnB1dCBmaWxlICovCi0gICAgc3RydWN0IHN0YXQgc2I7Ci0KLSAgICAvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIGZpbGUsIG5lZWRlZCBmb3IgbW1hcDogKi8KLSAgICBpZiAoZnN0YXQoaWZkLCAmc2IpIDwgMCkgcmV0dXJuIFpfRVJSTk87Ci0gICAgYnVmX2xlbiA9IHNiLnN0X3NpemU7Ci0gICAgaWYgKGJ1Zl9sZW4gPD0gMCkgcmV0dXJuIFpfRVJSTk87Ci0KLSAgICAvKiBOb3cgZG8gdGhlIGFjdHVhbCBtbWFwOiAqLwotICAgIGJ1ZiA9IG1tYXAoKGNhZGRyX3QpIDAsIGJ1Zl9sZW4sIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgaWZkLCAob2ZmX3QpMCk7Ci0gICAgaWYgKGJ1ZiA9PSAoY2FkZHJfdCkoLTEpKSByZXR1cm4gWl9FUlJOTzsKLQotICAgIC8qIENvbXByZXNzIHRoZSB3aG9sZSBmaWxlIGF0IG9uY2U6ICovCi0gICAgbGVuID0gZ3p3cml0ZShvdXQsIChjaGFyICopYnVmLCAodW5zaWduZWQpYnVmX2xlbik7Ci0KLSAgICBpZiAobGVuICE9IChpbnQpYnVmX2xlbikgZXJyb3IoZ3plcnJvcihvdXQsICZlcnIpKTsKLQotICAgIG11bm1hcChidWYsIGJ1Zl9sZW4pOwotICAgIGZjbG9zZShpbik7Ci0gICAgaWYgKGd6Y2xvc2Uob3V0KSAhPSBaX09LKSBlcnJvcigiZmFpbGVkIGd6Y2xvc2UiKTsKLSAgICByZXR1cm4gWl9PSzsKLX0KLSNlbmRpZiAvKiBVU0VfTU1BUCAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFVuY29tcHJlc3MgaW5wdXQgdG8gb3V0cHV0IHRoZW4gY2xvc2UgYm90aCBmaWxlcy4KLSAqLwotdm9pZCBnel91bmNvbXByZXNzKGluLCBvdXQpCi0gICAgZ3pGaWxlIGluOwotICAgIEZJTEUgICAqb3V0OwotewotICAgIGxvY2FsIGNoYXIgYnVmW0JVRkxFTl07Ci0gICAgaW50IGxlbjsKLSAgICBpbnQgZXJyOwotCi0gICAgZm9yICg7OykgewotICAgICAgICBsZW4gPSBnenJlYWQoaW4sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICBpZiAobGVuIDwgMCkgZXJyb3IgKGd6ZXJyb3IoaW4sICZlcnIpKTsKLSAgICAgICAgaWYgKGxlbiA9PSAwKSBicmVhazsKLQotICAgICAgICBpZiAoKGludClmd3JpdGUoYnVmLCAxLCAodW5zaWduZWQpbGVuLCBvdXQpICE9IGxlbikgewotICAgICAgICAgICAgZXJyb3IoImZhaWxlZCBmd3JpdGUiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoZmNsb3NlKG91dCkpIGVycm9yKCJmYWlsZWQgZmNsb3NlIik7Ci0KLSAgICBpZiAoZ3pjbG9zZShpbikgIT0gWl9PSykgZXJyb3IoImZhaWxlZCBnemNsb3NlIik7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb21wcmVzcyB0aGUgZ2l2ZW4gZmlsZTogY3JlYXRlIGEgY29ycmVzcG9uZGluZyAuZ3ogZmlsZSBhbmQgcmVtb3ZlIHRoZQotICogb3JpZ2luYWwuCi0gKi8KLXZvaWQgZmlsZV9jb21wcmVzcyhmaWxlLCBtb2RlKQotICAgIGNoYXIgICpmaWxlOwotICAgIGNoYXIgICptb2RlOwotewotICAgIGxvY2FsIGNoYXIgb3V0ZmlsZVtNQVhfTkFNRV9MRU5dOwotICAgIEZJTEUgICppbjsKLSAgICBnekZpbGUgb3V0OwotCi0gICAgaWYgKHN0cmxlbihmaWxlKSArIHN0cmxlbihHWl9TVUZGSVgpID49IHNpemVvZihvdXRmaWxlKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBmaWxlbmFtZSB0b28gbG9uZ1xuIiwgcHJvZyk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgc3RyY3B5KG91dGZpbGUsIGZpbGUpOwotICAgIHN0cmNhdChvdXRmaWxlLCBHWl9TVUZGSVgpOwotCi0gICAgaW4gPSBmb3BlbihmaWxlLCAicmIiKTsKLSAgICBpZiAoaW4gPT0gTlVMTCkgewotICAgICAgICBwZXJyb3IoZmlsZSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIG91dCA9IGd6b3BlbihvdXRmaWxlLCBtb2RlKTsKLSAgICBpZiAob3V0ID09IE5VTEwpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3QgZ3pvcGVuICVzXG4iLCBwcm9nLCBvdXRmaWxlKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgZ3pfY29tcHJlc3MoaW4sIG91dCk7Ci0KLSAgICB1bmxpbmsoZmlsZSk7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBVbmNvbXByZXNzIHRoZSBnaXZlbiBmaWxlIGFuZCByZW1vdmUgdGhlIG9yaWdpbmFsLgotICovCi12b2lkIGZpbGVfdW5jb21wcmVzcyhmaWxlKQotICAgIGNoYXIgICpmaWxlOwotewotICAgIGxvY2FsIGNoYXIgYnVmW01BWF9OQU1FX0xFTl07Ci0gICAgY2hhciAqaW5maWxlLCAqb3V0ZmlsZTsKLSAgICBGSUxFICAqb3V0OwotICAgIGd6RmlsZSBpbjsKLSAgICBzaXplX3QgbGVuID0gc3RybGVuKGZpbGUpOwotCi0gICAgaWYgKGxlbiArIHN0cmxlbihHWl9TVUZGSVgpID49IHNpemVvZihidWYpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGZpbGVuYW1lIHRvbyBsb25nXG4iLCBwcm9nKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBzdHJjcHkoYnVmLCBmaWxlKTsKLQotICAgIGlmIChsZW4gPiBTVUZGSVhfTEVOICYmIHN0cmNtcChmaWxlK2xlbi1TVUZGSVhfTEVOLCBHWl9TVUZGSVgpID09IDApIHsKLSAgICAgICAgaW5maWxlID0gZmlsZTsKLSAgICAgICAgb3V0ZmlsZSA9IGJ1ZjsKLSAgICAgICAgb3V0ZmlsZVtsZW4tM10gPSAnXDAnOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dGZpbGUgPSBmaWxlOwotICAgICAgICBpbmZpbGUgPSBidWY7Ci0gICAgICAgIHN0cmNhdChpbmZpbGUsIEdaX1NVRkZJWCk7Ci0gICAgfQotICAgIGluID0gZ3pvcGVuKGluZmlsZSwgInJiIik7Ci0gICAgaWYgKGluID09IE5VTEwpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3QgZ3pvcGVuICVzXG4iLCBwcm9nLCBpbmZpbGUpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBvdXQgPSBmb3BlbihvdXRmaWxlLCAid2IiKTsKLSAgICBpZiAob3V0ID09IE5VTEwpIHsKLSAgICAgICAgcGVycm9yKGZpbGUpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGd6X3VuY29tcHJlc3MoaW4sIG91dCk7Ci0KLSAgICB1bmxpbmsoaW5maWxlKTsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFVzYWdlOiAgbWluaWd6aXAgWy1jXSBbLWRdIFstZl0gWy1oXSBbLXJdIFstMSB0byAtOV0gW2ZpbGVzLi4uXQotICogICAtYyA6IHdyaXRlIHRvIHN0YW5kYXJkIG91dHB1dAotICogICAtZCA6IGRlY29tcHJlc3MKLSAqICAgLWYgOiBjb21wcmVzcyB3aXRoIFpfRklMVEVSRUQKLSAqICAgLWggOiBjb21wcmVzcyB3aXRoIFpfSFVGRk1BTl9PTkxZCi0gKiAgIC1yIDogY29tcHJlc3Mgd2l0aCBaX1JMRQotICogICAtMSB0byAtOSA6IGNvbXByZXNzaW9uIGxldmVsCi0gKi8KLQotaW50IG1haW4oYXJnYywgYXJndikKLSAgICBpbnQgYXJnYzsKLSAgICBjaGFyICphcmd2W107Ci17Ci0gICAgaW50IGNvcHlvdXQgPSAwOwotICAgIGludCB1bmNvbXByID0gMDsKLSAgICBnekZpbGUgZmlsZTsKLSAgICBjaGFyICpibmFtZSwgb3V0bW9kZVsyMF07Ci0KLSAgICBzdHJjcHkob3V0bW9kZSwgIndiNiAiKTsKLQotICAgIHByb2cgPSBhcmd2WzBdOwotICAgIGJuYW1lID0gc3RycmNocihhcmd2WzBdLCAnLycpOwotICAgIGlmIChibmFtZSkKLSAgICAgIGJuYW1lKys7Ci0gICAgZWxzZQotICAgICAgYm5hbWUgPSBhcmd2WzBdOwotICAgIGFyZ2MtLSwgYXJndisrOwotCi0gICAgaWYgKCFzdHJjbXAoYm5hbWUsICJndW56aXAiKSkKLSAgICAgIHVuY29tcHIgPSAxOwotICAgIGVsc2UgaWYgKCFzdHJjbXAoYm5hbWUsICJ6Y2F0IikpCi0gICAgICBjb3B5b3V0ID0gdW5jb21wciA9IDE7Ci0KLSAgICB3aGlsZSAoYXJnYyA+IDApIHsKLSAgICAgIGlmIChzdHJjbXAoKmFyZ3YsICItYyIpID09IDApCi0gICAgICAgIGNvcHlvdXQgPSAxOwotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWQiKSA9PSAwKQotICAgICAgICB1bmNvbXByID0gMTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1mIikgPT0gMCkKLSAgICAgICAgb3V0bW9kZVszXSA9ICdmJzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1oIikgPT0gMCkKLSAgICAgICAgb3V0bW9kZVszXSA9ICdoJzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1yIikgPT0gMCkKLSAgICAgICAgb3V0bW9kZVszXSA9ICdSJzsKLSAgICAgIGVsc2UgaWYgKCgqYXJndilbMF0gPT0gJy0nICYmICgqYXJndilbMV0gPj0gJzEnICYmICgqYXJndilbMV0gPD0gJzknICYmCi0gICAgICAgICAgICAgICAoKmFyZ3YpWzJdID09IDApCi0gICAgICAgIG91dG1vZGVbMl0gPSAoKmFyZ3YpWzFdOwotICAgICAgZWxzZQotICAgICAgICBicmVhazsKLSAgICAgIGFyZ2MtLSwgYXJndisrOwotICAgIH0KLSAgICBpZiAob3V0bW9kZVszXSA9PSAnICcpCi0gICAgICAgIG91dG1vZGVbM10gPSAwOwotICAgIGlmIChhcmdjID09IDApIHsKLSAgICAgICAgU0VUX0JJTkFSWV9NT0RFKHN0ZGluKTsKLSAgICAgICAgU0VUX0JJTkFSWV9NT0RFKHN0ZG91dCk7Ci0gICAgICAgIGlmICh1bmNvbXByKSB7Ci0gICAgICAgICAgICBmaWxlID0gZ3pkb3BlbihmaWxlbm8oc3RkaW4pLCAicmIiKTsKLSAgICAgICAgICAgIGlmIChmaWxlID09IE5VTEwpIGVycm9yKCJjYW4ndCBnemRvcGVuIHN0ZGluIik7Ci0gICAgICAgICAgICBnel91bmNvbXByZXNzKGZpbGUsIHN0ZG91dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaWxlID0gZ3pkb3BlbihmaWxlbm8oc3Rkb3V0KSwgb3V0bW9kZSk7Ci0gICAgICAgICAgICBpZiAoZmlsZSA9PSBOVUxMKSBlcnJvcigiY2FuJ3QgZ3pkb3BlbiBzdGRvdXQiKTsKLSAgICAgICAgICAgIGd6X2NvbXByZXNzKHN0ZGluLCBmaWxlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChjb3B5b3V0KSB7Ci0gICAgICAgICAgICBTRVRfQklOQVJZX01PREUoc3Rkb3V0KTsKLSAgICAgICAgfQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBpZiAodW5jb21wcikgewotICAgICAgICAgICAgICAgIGlmIChjb3B5b3V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGUgPSBnem9wZW4oKmFyZ3YsICJyYiIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3QgZ3pvcGVuICVzXG4iLCBwcm9nLCAqYXJndik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGd6X3VuY29tcHJlc3MoZmlsZSwgc3Rkb3V0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaWxlX3VuY29tcHJlc3MoKmFyZ3YpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHlvdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgRklMRSAqIGluID0gZm9wZW4oKmFyZ3YsICJyYiIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZXJyb3IoKmFyZ3YpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGd6ZG9wZW4oZmlsZW5vKHN0ZG91dCksIG91dG1vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgPT0gTlVMTCkgZXJyb3IoImNhbid0IGd6ZG9wZW4gc3Rkb3V0Iik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGd6X2NvbXByZXNzKGluLCBmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZV9jb21wcmVzcygqYXJndiwgb3V0bW9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChhcmd2KyssIC0tYXJnYyk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvdHJlZWJ1aWxkLnhtbCBiL3NyYy96bGliL3RyZWVidWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNGQxNWYuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvdHJlZWJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiID8+Ci08cGFja2FnZSBuYW1lPSJ6bGliIiB2ZXJzaW9uPSIxLjIuNyI+Ci0gICAgPGxpYnJhcnkgbmFtZT0iemxpYiIgZGx2ZXJzaW9uPSIxLjIuNyIgZGxuYW1lPSJ6Ij4KLQk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iPiB6aXAgY29tcHJlc3Npb24gbGlicmFyeSA8L3Byb3BlcnR5PgotCTxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlLXRhcmdldC1kaXIiIHZhbHVlPSIkKEBQQUNLQUdFL2luc3RhbGwtaW5jbHVkZWRpcikiIC8+Ci0KLQk8IS0tIGZpeG1lOiBub3QgaW1wbGVtZW50ZWQgeWV0IC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJjb21waWxlci9jL2lubGluZSIgdmFsdWU9InllcyIgLz4KLQotCTxpbmNsdWRlLWZpbGUgbmFtZT0iemxpYi5oIiBzY29wZT0icHVibGljIiBtb2RlPSI2NDQiIC8+Ci0JPGluY2x1ZGUtZmlsZSBuYW1lPSJ6Y29uZi5oIiBzY29wZT0icHVibGljIiBtb2RlPSI2NDQiIC8+Ci0KLQk8c291cmNlIG5hbWU9ImFkbGVyMzIuYyI+Ci0JICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgotCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+Ci0JPC9zb3VyY2U+Ci0JPHNvdXJjZSBuYW1lPSJjb21wcmVzcy5jIj4KLQkgICAgPGRlcGVuZCBuYW1lPSJ6bGliLmgiIC8+Ci0JICAgIDxkZXBlbmQgbmFtZT0iemNvbmYuaCIgLz4KLQk8L3NvdXJjZT4KLQk8c291cmNlIG5hbWU9ImNyYzMyLmMiPgotCSAgICA8ZGVwZW5kIG5hbWU9InpsaWIuaCIgLz4KLQkgICAgPGRlcGVuZCBuYW1lPSJ6Y29uZi5oIiAvPgotCSAgICA8ZGVwZW5kIG5hbWU9ImNyYzMyLmgiIC8+Ci0JPC9zb3VyY2U+Ci0JPHNvdXJjZSBuYW1lPSJnemNsb3NlLmMiPgotCSAgICA8ZGVwZW5kIG5hbWU9InpsaWIuaCIgLz4KLQkgICAgPGRlcGVuZCBuYW1lPSJ6Y29uZi5oIiAvPgotCSAgICA8ZGVwZW5kIG5hbWU9Imd6Z3V0cy5oIiAvPgotCTwvc291cmNlPgotCTxzb3VyY2UgbmFtZT0iZ3psaWIuYyI+Ci0JICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgotCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+Ci0JICAgIDxkZXBlbmQgbmFtZT0iZ3pndXRzLmgiIC8+Ci0JPC9zb3VyY2U+Ci0JPHNvdXJjZSBuYW1lPSJnenJlYWQuYyI+Ci0JICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgotCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+Ci0JICAgIDxkZXBlbmQgbmFtZT0iZ3pndXRzLmgiIC8+Ci0JPC9zb3VyY2U+Ci0JPHNvdXJjZSBuYW1lPSJnendyaXRlLmMiPgotCSAgICA8ZGVwZW5kIG5hbWU9InpsaWIuaCIgLz4KLQkgICAgPGRlcGVuZCBuYW1lPSJ6Y29uZi5oIiAvPgotCSAgICA8ZGVwZW5kIG5hbWU9Imd6Z3V0cy5oIiAvPgotCTwvc291cmNlPgotCTxzb3VyY2UgbmFtZT0idW5jb21wci5jIj4KLQkgICAgPGRlcGVuZCBuYW1lPSJ6bGliLmgiIC8+Ci0JICAgIDxkZXBlbmQgbmFtZT0iemNvbmYuaCIgLz4KLQk8L3NvdXJjZT4KLQk8c291cmNlIG5hbWU9ImRlZmxhdGUuYyI+Ci0JICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgotCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+Ci0JICAgIDxkZXBlbmQgbmFtZT0ienV0aWwuaCIgLz4KLQkgICAgPGRlcGVuZCBuYW1lPSJkZWZsYXRlLmgiIC8+Ci0JPC9zb3VyY2U+Ci0JPHNvdXJjZSBuYW1lPSJ0cmVlcy5jIj4KLQkgICAgPGRlcGVuZCBuYW1lPSJ6bGliLmgiIC8+Ci0JICAgIDxkZXBlbmQgbmFtZT0iemNvbmYuaCIgLz4KLQkgICAgPGRlcGVuZCBuYW1lPSJ6dXRpbC5oIiAvPgotCSAgICA8ZGVwZW5kIG5hbWU9ImRlZmxhdGUuaCIgLz4KLQkgICAgPGRlcGVuZCBuYW1lPSJ0cmVlcy5oIiAvPgotCTwvc291cmNlPgotCTxzb3VyY2UgbmFtZT0ienV0aWwuYyI+Ci0JICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgotCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+Ci0JICAgIDxkZXBlbmQgbmFtZT0ienV0aWwuaCIgLz4KLQk8L3NvdXJjZT4KLQk8c291cmNlIG5hbWU9ImluZmxhdGUuYyI+Ci0JICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgotCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+Ci0JICAgIDxkZXBlbmQgbmFtZT0ienV0aWwuaCIgLz4KLQkgICAgPGRlcGVuZCBuYW1lPSJpbmZ0cmVlcy5oIiAvPgotCSAgICA8ZGVwZW5kIG5hbWU9ImluZmxhdGUuaCIgLz4KLQkgICAgPGRlcGVuZCBuYW1lPSJpbmZmYXN0LmgiIC8+Ci0JPC9zb3VyY2U+Ci0JPHNvdXJjZSBuYW1lPSJpbmZiYWNrLmMiPgotCSAgICA8ZGVwZW5kIG5hbWU9InpsaWIuaCIgLz4KLQkgICAgPGRlcGVuZCBuYW1lPSJ6Y29uZi5oIiAvPgotCSAgICA8ZGVwZW5kIG5hbWU9Inp1dGlsLmgiIC8+Ci0JICAgIDxkZXBlbmQgbmFtZT0iaW5mdHJlZXMuaCIgLz4KLQkgICAgPGRlcGVuZCBuYW1lPSJpbmZsYXRlLmgiIC8+Ci0JICAgIDxkZXBlbmQgbmFtZT0iaW5mZmFzdC5oIiAvPgotCTwvc291cmNlPgotCTxzb3VyY2UgbmFtZT0iaW5mdHJlZXMuYyI+Ci0JICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgotCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+Ci0JICAgIDxkZXBlbmQgbmFtZT0ienV0aWwuaCIgLz4KLQkgICAgPGRlcGVuZCBuYW1lPSJpbmZ0cmVlcy5oIiAvPgotCTwvc291cmNlPgotCTxzb3VyY2UgbmFtZT0iaW5mZmFzdC5jIj4KLQkgICAgPGRlcGVuZCBuYW1lPSJ6bGliLmgiIC8+Ci0JICAgIDxkZXBlbmQgbmFtZT0iemNvbmYuaCIgLz4KLQkgICAgPGRlcGVuZCBuYW1lPSJ6dXRpbC5oIiAvPgotCSAgICA8ZGVwZW5kIG5hbWU9ImluZnRyZWVzLmgiIC8+Ci0JICAgIDxkZXBlbmQgbmFtZT0iaW5mbGF0ZS5oIiAvPgotCSAgICA8ZGVwZW5kIG5hbWU9ImluZmZhc3QuaCIgLz4KLQk8L3NvdXJjZT4KLSAgICA8L2xpYnJhcnk+Ci08L3BhY2thZ2U+Ci0KLTwhLS0KLUNGTEFHUz0tTwotI0NGTEFHUz0tTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NwotI0NGTEFHUz0tZyAtRERFQlVHCi0jQ0ZMQUdTPS1PMyAtV2FsbCAtV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1XY29udmVyc2lvbiBcCi0jICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzCi0KLSMgT0JKQSA9Ci0jIHRvIHVzZSB0aGUgYXNtIGNvZGU6IG1ha2UgT0JKQT1tYXRjaC5vCi0jCi1tYXRjaC5vOiBtYXRjaC5TCi0JJChDUFApIG1hdGNoLlMgPiBfbWF0Y2gucwotCSQoQ0MpIC1jIF9tYXRjaC5zCi0JbXYgX21hdGNoLm8gbWF0Y2gubwotCXJtIC1mIF9tYXRjaC5zCi0tLT4KZGlmZiAtLWdpdCBhL3NyYy96bGliL3RyZWVzLmMgYi9zcmMvemxpYi90cmVlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzMyYjIxLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL3RyZWVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjI0ICswLDAgQEAKLS8qIHRyZWVzLmMgLS0gb3V0cHV0IGRlZmxhdGVkIGRhdGEgdXNpbmcgSHVmZm1hbiBjb2RpbmcKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEyIEplYW4tbG91cCBHYWlsbHkKLSAqIGRldGVjdF9kYXRhX3R5cGUoKSBmdW5jdGlvbiBwcm92aWRlZCBmcmVlbHkgYnkgQ29zbWluIFRydXRhLCAyMDA2Ci0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyoKLSAqICBBTEdPUklUSE0KLSAqCi0gKiAgICAgIFRoZSAiZGVmbGF0aW9uIiBwcm9jZXNzIHVzZXMgc2V2ZXJhbCBIdWZmbWFuIHRyZWVzLiBUaGUgbW9yZQotICogICAgICBjb21tb24gc291cmNlIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYnkgc2hvcnRlciBiaXQgc2VxdWVuY2VzLgotICoKLSAqICAgICAgRWFjaCBjb2RlIHRyZWUgaXMgc3RvcmVkIGluIGEgY29tcHJlc3NlZCBmb3JtIHdoaWNoIGlzIGl0c2VsZgotICogYSBIdWZmbWFuIGVuY29kaW5nIG9mIHRoZSBsZW5ndGhzIG9mIGFsbCB0aGUgY29kZSBzdHJpbmdzIChpbgotICogYXNjZW5kaW5nIG9yZGVyIGJ5IHNvdXJjZSB2YWx1ZXMpLiAgVGhlIGFjdHVhbCBjb2RlIHN0cmluZ3MgYXJlCi0gKiByZWNvbnN0cnVjdGVkIGZyb20gdGhlIGxlbmd0aHMgaW4gdGhlIGluZmxhdGUgcHJvY2VzcywgYXMgZGVzY3JpYmVkCi0gKiBpbiB0aGUgZGVmbGF0ZSBzcGVjaWZpY2F0aW9uLgotICoKLSAqICBSRUZFUkVOQ0VTCi0gKgotICogICAgICBEZXV0c2NoLCBMLlAuLCInRGVmbGF0ZScgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIi4KLSAqICAgICAgQXZhaWxhYmxlIGluIGZ0cC51dS5uZXQ6L3B1Yi9hcmNoaXZpbmcvemlwL2RvYy9kZWZsYXRlLTEuMS5kb2MKLSAqCi0gKiAgICAgIFN0b3JlciwgSmFtZXMgQS4KLSAqICAgICAgICAgIERhdGEgQ29tcHJlc3Npb246ICBNZXRob2RzIGFuZCBUaGVvcnksIHBwLiA0OS01MC4KLSAqICAgICAgICAgIENvbXB1dGVyIFNjaWVuY2UgUHJlc3MsIDE5ODguICBJU0JOIDAtNzE2Ny04MTU2LTUuCi0gKgotICogICAgICBTZWRnZXdpY2ssIFIuCi0gKiAgICAgICAgICBBbGdvcml0aG1zLCBwMjkwLgotICogICAgICAgICAgQWRkaXNvbi1XZXNsZXksIDE5ODMuIElTQk4gMC0yMDEtMDY2NzItNi4KLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotLyogI2RlZmluZSBHRU5fVFJFRVNfSCAqLwotCi0jaW5jbHVkZSAiZGVmbGF0ZS5oIgotCi0jaWZkZWYgREVCVUcKLSMgIGluY2x1ZGUgPGN0eXBlLmg+Ci0jZW5kaWYKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb25zdGFudHMKLSAqLwotCi0jZGVmaW5lIE1BWF9CTF9CSVRTIDcKLS8qIEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMgKi8KLQotI2RlZmluZSBFTkRfQkxPQ0sgMjU2Ci0vKiBlbmQgb2YgYmxvY2sgbGl0ZXJhbCBjb2RlICovCi0KLSNkZWZpbmUgUkVQXzNfNiAgICAgIDE2Ci0vKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovCi0KLSNkZWZpbmUgUkVQWl8zXzEwICAgIDE3Ci0vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAzLTEwIHRpbWVzICAoMyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KLQotI2RlZmluZSBSRVBaXzExXzEzOCAgMTgKLS8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDExLTEzOCB0aW1lcyAgKDcgYml0cyBvZiByZXBlYXQgY291bnQpICovCi0KLWxvY2FsIGNvbnN0IGludCBleHRyYV9sYml0c1tMRU5HVEhfQ09ERVNdIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggbGVuZ3RoIGNvZGUgKi8KLSAgID0gezAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMH07Ci0KLWxvY2FsIGNvbnN0IGludCBleHRyYV9kYml0c1tEX0NPREVTXSAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGRpc3RhbmNlIGNvZGUgKi8KLSAgID0gezAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTN9OwotCi1sb2NhbCBjb25zdCBpbnQgZXh0cmFfYmxiaXRzW0JMX0NPREVTXS8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggYml0IGxlbmd0aCBjb2RlICovCi0gICA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3fTsKLQotbG9jYWwgY29uc3QgdWNoIGJsX29yZGVyW0JMX0NPREVTXQotICAgPSB7MTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNX07Ci0vKiBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nCi0gKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy4KLSAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIExvY2FsIGRhdGEuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBvbmx5IG9uY2UuCi0gKi8KLQotI2RlZmluZSBESVNUX0NPREVfTEVOICA1MTIgLyogc2VlIGRlZmluaXRpb24gb2YgYXJyYXkgZGlzdF9jb2RlIGJlbG93ICovCi0KLSNpZiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKQotLyogbm9uIEFOU0kgY29tcGlsZXJzIG1heSBub3QgYWNjZXB0IHRyZWVzLmggKi8KLQotbG9jYWwgY3RfZGF0YSBzdGF0aWNfbHRyZWVbTF9DT0RFUysyXTsKLS8qIFRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlLiBTaW5jZSB0aGUgYml0IGxlbmd0aHMgYXJlIGltcG9zZWQsIHRoZXJlIGlzIG5vCi0gKiBuZWVkIGZvciB0aGUgTF9DT0RFUyBleHRyYSBjb2RlcyB1c2VkIGR1cmluZyBoZWFwIGNvbnN0cnVjdGlvbi4gSG93ZXZlcgotICogVGhlIGNvZGVzIDI4NiBhbmQgMjg3IGFyZSBuZWVkZWQgdG8gYnVpbGQgYSBjYW5vbmljYWwgdHJlZSAoc2VlIF90cl9pbml0Ci0gKiBiZWxvdykuCi0gKi8KLQotbG9jYWwgY3RfZGF0YSBzdGF0aWNfZHRyZWVbRF9DT0RFU107Ci0vKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNlCi0gKiA1IGJpdHMuKQotICovCi0KLXVjaCBfZGlzdF9jb2RlW0RJU1RfQ09ERV9MRU5dOwotLyogRGlzdGFuY2UgY29kZXMuIFRoZSBmaXJzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRpc3RhbmNlcwotICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZgotICogdGhlIDE1IGJpdCBkaXN0YW5jZXMuCi0gKi8KLQotdWNoIF9sZW5ndGhfY29kZVtNQVhfTUFUQ0gtTUlOX01BVENIKzFdOwotLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqLwotCi1sb2NhbCBpbnQgYmFzZV9sZW5ndGhbTEVOR1RIX0NPREVTXTsKLS8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovCi0KLWxvY2FsIGludCBiYXNlX2Rpc3RbRF9DT0RFU107Ci0vKiBGaXJzdCBub3JtYWxpemVkIGRpc3RhbmNlIGZvciBlYWNoIGNvZGUgKDAgPSBkaXN0YW5jZSBvZiAxKSAqLwotCi0jZWxzZQotIyAgaW5jbHVkZSAidHJlZXMuaCIKLSNlbmRpZiAvKiBHRU5fVFJFRVNfSCAqLwotCi1zdHJ1Y3Qgc3RhdGljX3RyZWVfZGVzY19zIHsKLSAgICBjb25zdCBjdF9kYXRhICpzdGF0aWNfdHJlZTsgIC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi8KLSAgICBjb25zdCBpbnRmICpleHRyYV9iaXRzOyAgICAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovCi0gICAgaW50ICAgICBleHRyYV9iYXNlOyAgICAgICAgICAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovCi0gICAgaW50ICAgICBlbGVtczsgICAgICAgICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovCi0gICAgaW50ICAgICBtYXhfbGVuZ3RoOyAgICAgICAgICAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovCi19OwotCi1sb2NhbCBzdGF0aWNfdHJlZV9kZXNjICBzdGF0aWNfbF9kZXNjID0KLXtzdGF0aWNfbHRyZWUsIGV4dHJhX2xiaXRzLCBMSVRFUkFMUysxLCBMX0NPREVTLCBNQVhfQklUU307Ci0KLWxvY2FsIHN0YXRpY190cmVlX2Rlc2MgIHN0YXRpY19kX2Rlc2MgPQote3N0YXRpY19kdHJlZSwgZXh0cmFfZGJpdHMsIDAsICAgICAgICAgIERfQ09ERVMsIE1BWF9CSVRTfTsKLQotbG9jYWwgc3RhdGljX3RyZWVfZGVzYyAgc3RhdGljX2JsX2Rlc2MgPQoteyhjb25zdCBjdF9kYXRhICopMCwgZXh0cmFfYmxiaXRzLCAwLCAgIEJMX0NPREVTLCBNQVhfQkxfQklUU307Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogTG9jYWwgKHN0YXRpYykgcm91dGluZXMgaW4gdGhpcyBmaWxlLgotICovCi0KLWxvY2FsIHZvaWQgdHJfc3RhdGljX2luaXQgT0YoKHZvaWQpKTsKLWxvY2FsIHZvaWQgaW5pdF9ibG9jayAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKLWxvY2FsIHZvaWQgcHFkb3duaGVhcCAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGN0X2RhdGEgKnRyZWUsIGludCBrKSk7Ci1sb2NhbCB2b2lkIGdlbl9iaXRsZW4gICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCB0cmVlX2Rlc2MgKmRlc2MpKTsKLWxvY2FsIHZvaWQgZ2VuX2NvZGVzICAgICAgT0YoKGN0X2RhdGEgKnRyZWUsIGludCBtYXhfY29kZSwgdXNoZiAqYmxfY291bnQpKTsKLWxvY2FsIHZvaWQgYnVpbGRfdHJlZSAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHRyZWVfZGVzYyAqZGVzYykpOwotbG9jYWwgdm9pZCBzY2FuX3RyZWUgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY3RfZGF0YSAqdHJlZSwgaW50IG1heF9jb2RlKSk7Ci1sb2NhbCB2b2lkIHNlbmRfdHJlZSAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjdF9kYXRhICp0cmVlLCBpbnQgbWF4X2NvZGUpKTsKLWxvY2FsIGludCAgYnVpbGRfYmxfdHJlZSAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKLWxvY2FsIHZvaWQgc2VuZF9hbGxfdHJlZXMgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBsY29kZXMsIGludCBkY29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxjb2RlcykpOwotbG9jYWwgdm9pZCBjb21wcmVzc19ibG9jayBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY3RfZGF0YSAqbHRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdF9kYXRhICpkdHJlZSkpOwotbG9jYWwgaW50ICBkZXRlY3RfZGF0YV90eXBlIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Ci1sb2NhbCB1bnNpZ25lZCBiaV9yZXZlcnNlIE9GKCh1bnNpZ25lZCB2YWx1ZSwgaW50IGxlbmd0aCkpOwotbG9jYWwgdm9pZCBiaV93aW5kdXAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOwotbG9jYWwgdm9pZCBiaV9mbHVzaCAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOwotbG9jYWwgdm9pZCBjb3B5X2Jsb2NrICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY2hhcmYgKmJ1ZiwgdW5zaWduZWQgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlYWRlcikpOwotCi0jaWZkZWYgR0VOX1RSRUVTX0gKLWxvY2FsIHZvaWQgZ2VuX3RyZWVzX2hlYWRlciBPRigodm9pZCkpOwotI2VuZGlmCi0KLSNpZm5kZWYgREVCVUcKLSMgIGRlZmluZSBzZW5kX2NvZGUocywgYywgdHJlZSkgc2VuZF9iaXRzKHMsIHRyZWVbY10uQ29kZSwgdHJlZVtjXS5MZW4pCi0gICAvKiBTZW5kIGEgY29kZSBvZiB0aGUgZ2l2ZW4gdHJlZS4gYyBhbmQgdHJlZSBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cyAqLwotCi0jZWxzZSAvKiBERUJVRyAqLwotIyAgZGVmaW5lIHNlbmRfY29kZShzLCBjLCB0cmVlKSBcCi0gICAgIHsgaWYgKHpfdmVyYm9zZT4yKSBmcHJpbnRmKHN0ZGVyciwiXG5jZCAlM2QgIiwoYykpOyBcCi0gICAgICAgc2VuZF9iaXRzKHMsIHRyZWVbY10uQ29kZSwgdHJlZVtjXS5MZW4pOyB9Ci0jZW5kaWYKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBPdXRwdXQgYSBzaG9ydCBMU0IgZmlyc3Qgb24gdGhlIHN0cmVhbS4KLSAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ0J1Zi4KLSAqLwotI2RlZmluZSBwdXRfc2hvcnQocywgdykgeyBcCi0gICAgcHV0X2J5dGUocywgKHVjaCkoKHcpICYgMHhmZikpOyBcCi0gICAgcHV0X2J5dGUocywgKHVjaCkoKHVzaCkodykgPj4gOCkpOyBcCi19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuCi0gKiBJTiBhc3NlcnRpb246IGxlbmd0aCA8PSAxNiBhbmQgdmFsdWUgZml0cyBpbiBsZW5ndGggYml0cy4KLSAqLwotI2lmZGVmIERFQlVHCi1sb2NhbCB2b2lkIHNlbmRfYml0cyAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgdmFsdWUsIGludCBsZW5ndGgpKTsKLQotbG9jYWwgdm9pZCBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIGludCB2YWx1ZTsgIC8qIHZhbHVlIHRvIHNlbmQgKi8KLSAgICBpbnQgbGVuZ3RoOyAvKiBudW1iZXIgb2YgYml0cyAqLwotewotICAgIFRyYWNldnYoKHN0ZGVyciwiIGwgJTJkIHYgJTR4ICIsIGxlbmd0aCwgdmFsdWUpKTsKLSAgICBBc3NlcnQobGVuZ3RoID4gMCAmJiBsZW5ndGggPD0gMTUsICJpbnZhbGlkIGxlbmd0aCIpOwotICAgIHMtPmJpdHNfc2VudCArPSAodWxnKWxlbmd0aDsKLQotICAgIC8qIElmIG5vdCBlbm91Z2ggcm9vbSBpbiBiaV9idWYsIHVzZSAodmFsaWQpIGJpdHMgZnJvbSBiaV9idWYgYW5kCi0gICAgICogKDE2IC0gYmlfdmFsaWQpIGJpdHMgZnJvbSB2YWx1ZSwgbGVhdmluZyAod2lkdGggLSAoMTYtYmlfdmFsaWQpKQotICAgICAqIHVudXNlZCBiaXRzIGluIHZhbHVlLgotICAgICAqLwotICAgIGlmIChzLT5iaV92YWxpZCA+IChpbnQpQnVmX3NpemUgLSBsZW5ndGgpIHsKLSAgICAgICAgcy0+YmlfYnVmIHw9ICh1c2gpdmFsdWUgPDwgcy0+YmlfdmFsaWQ7Ci0gICAgICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpOwotICAgICAgICBzLT5iaV9idWYgPSAodXNoKXZhbHVlID4+IChCdWZfc2l6ZSAtIHMtPmJpX3ZhbGlkKTsKLSAgICAgICAgcy0+YmlfdmFsaWQgKz0gbGVuZ3RoIC0gQnVmX3NpemU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcy0+YmlfYnVmIHw9ICh1c2gpdmFsdWUgPDwgcy0+YmlfdmFsaWQ7Ci0gICAgICAgIHMtPmJpX3ZhbGlkICs9IGxlbmd0aDsKLSAgICB9Ci19Ci0jZWxzZSAvKiAhREVCVUcgKi8KLQotI2RlZmluZSBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkgXAoteyBpbnQgbGVuID0gbGVuZ3RoO1wKLSAgaWYgKHMtPmJpX3ZhbGlkID4gKGludClCdWZfc2l6ZSAtIGxlbikge1wKLSAgICBpbnQgdmFsID0gdmFsdWU7XAotICAgIHMtPmJpX2J1ZiB8PSAodXNoKXZhbCA8PCBzLT5iaV92YWxpZDtcCi0gICAgcHV0X3Nob3J0KHMsIHMtPmJpX2J1Zik7XAotICAgIHMtPmJpX2J1ZiA9ICh1c2gpdmFsID4+IChCdWZfc2l6ZSAtIHMtPmJpX3ZhbGlkKTtcCi0gICAgcy0+YmlfdmFsaWQgKz0gbGVuIC0gQnVmX3NpemU7XAotICB9IGVsc2Uge1wKLSAgICBzLT5iaV9idWYgfD0gKHVzaCkodmFsdWUpIDw8IHMtPmJpX3ZhbGlkO1wKLSAgICBzLT5iaV92YWxpZCArPSBsZW47XAotICB9XAotfQotI2VuZGlmIC8qIERFQlVHICovCi0KLQotLyogdGhlIGFyZ3VtZW50cyBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cyAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgJ2NvbnN0YW50JyB0YWJsZXMuCi0gKi8KLWxvY2FsIHZvaWQgdHJfc3RhdGljX2luaXQoKQotewotI2lmIGRlZmluZWQoR0VOX1RSRUVTX0gpIHx8ICFkZWZpbmVkKFNUREMpCi0gICAgc3RhdGljIGludCBzdGF0aWNfaW5pdF9kb25lID0gMDsKLSAgICBpbnQgbjsgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqLwotICAgIGludCBiaXRzOyAgICAgLyogYml0IGNvdW50ZXIgKi8KLSAgICBpbnQgbGVuZ3RoOyAgIC8qIGxlbmd0aCB2YWx1ZSAqLwotICAgIGludCBjb2RlOyAgICAgLyogY29kZSB2YWx1ZSAqLwotICAgIGludCBkaXN0OyAgICAgLyogZGlzdGFuY2UgaW5kZXggKi8KLSAgICB1c2ggYmxfY291bnRbTUFYX0JJVFMrMV07Ci0gICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovCi0KLSAgICBpZiAoc3RhdGljX2luaXRfZG9uZSkgcmV0dXJuOwotCi0gICAgLyogRm9yIHNvbWUgZW1iZWRkZWQgdGFyZ2V0cywgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm90IGluaXRpYWxpemVkOiAqLwotI2lmZGVmIE5PX0lOSVRfR0xPQkFMX1BPSU5URVJTCi0gICAgc3RhdGljX2xfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19sdHJlZTsKLSAgICBzdGF0aWNfbF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9sYml0czsKLSAgICBzdGF0aWNfZF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2R0cmVlOwotICAgIHN0YXRpY19kX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2RiaXRzOwotICAgIHN0YXRpY19ibF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9ibGJpdHM7Ci0jZW5kaWYKLQotICAgIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi8KLSAgICBsZW5ndGggPSAwOwotICAgIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMtMTsgY29kZSsrKSB7Ci0gICAgICAgIGJhc2VfbGVuZ3RoW2NvZGVdID0gbGVuZ3RoOwotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PGV4dHJhX2xiaXRzW2NvZGVdKTsgbisrKSB7Ci0gICAgICAgICAgICBfbGVuZ3RoX2NvZGVbbGVuZ3RoKytdID0gKHVjaCljb2RlOwotICAgICAgICB9Ci0gICAgfQotICAgIEFzc2VydCAobGVuZ3RoID09IDI1NiwgInRyX3N0YXRpY19pbml0OiBsZW5ndGggIT0gMjU2Iik7Ci0gICAgLyogTm90ZSB0aGF0IHRoZSBsZW5ndGggMjU1IChtYXRjaCBsZW5ndGggMjU4KSBjYW4gYmUgcmVwcmVzZW50ZWQKLSAgICAgKiBpbiB0d28gZGlmZmVyZW50IHdheXM6IGNvZGUgMjg0ICsgNSBiaXRzIG9yIGNvZGUgMjg1LCBzbyB3ZQotICAgICAqIG92ZXJ3cml0ZSBsZW5ndGhfY29kZVsyNTVdIHRvIHVzZSB0aGUgYmVzdCBlbmNvZGluZzoKLSAgICAgKi8KLSAgICBfbGVuZ3RoX2NvZGVbbGVuZ3RoLTFdID0gKHVjaCljb2RlOwotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBkaXN0ICgwLi4zMkspIC0+IGRpc3QgY29kZSAoMC4uMjkpICovCi0gICAgZGlzdCA9IDA7Ci0gICAgZm9yIChjb2RlID0gMCA7IGNvZGUgPCAxNjsgY29kZSsrKSB7Ci0gICAgICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3Q7Ci0gICAgICAgIGZvciAobiA9IDA7IG4gPCAoMTw8ZXh0cmFfZGJpdHNbY29kZV0pOyBuKyspIHsKLSAgICAgICAgICAgIF9kaXN0X2NvZGVbZGlzdCsrXSA9ICh1Y2gpY29kZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBc3NlcnQgKGRpc3QgPT0gMjU2LCAidHJfc3RhdGljX2luaXQ6IGRpc3QgIT0gMjU2Iik7Ci0gICAgZGlzdCA+Pj0gNzsgLyogZnJvbSBub3cgb24sIGFsbCBkaXN0YW5jZXMgYXJlIGRpdmlkZWQgYnkgMTI4ICovCi0gICAgZm9yICggOyBjb2RlIDwgRF9DT0RFUzsgY29kZSsrKSB7Ci0gICAgICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNzsKLSAgICAgICAgZm9yIChuID0gMDsgbiA8ICgxPDwoZXh0cmFfZGJpdHNbY29kZV0tNykpOyBuKyspIHsKLSAgICAgICAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9ICh1Y2gpY29kZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBc3NlcnQgKGRpc3QgPT0gMjU2LCAidHJfc3RhdGljX2luaXQ6IDI1NitkaXN0ICE9IDUxMiIpOwotCi0gICAgLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxpdGVyYWwgdHJlZSAqLwotICAgIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykgYmxfY291bnRbYml0c10gPSAwOwotICAgIG4gPSAwOwotICAgIHdoaWxlIChuIDw9IDE0Mykgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOCwgYmxfY291bnRbOF0rKzsKLSAgICB3aGlsZSAobiA8PSAyNTUpIHN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDksIGJsX2NvdW50WzldKys7Ci0gICAgd2hpbGUgKG4gPD0gMjc5KSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA3LCBibF9jb3VudFs3XSsrOwotICAgIHdoaWxlIChuIDw9IDI4Nykgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOCwgYmxfY291bnRbOF0rKzsKLSAgICAvKiBDb2RlcyAyODYgYW5kIDI4NyBkbyBub3QgZXhpc3QsIGJ1dCB3ZSBtdXN0IGluY2x1ZGUgdGhlbSBpbiB0aGUKLSAgICAgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGUKLSAgICAgKiBhbGwgb25lcykKLSAgICAgKi8KLSAgICBnZW5fY29kZXMoKGN0X2RhdGEgKilzdGF0aWNfbHRyZWUsIExfQ09ERVMrMSwgYmxfY291bnQpOwotCi0gICAgLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlIGlzIHRyaXZpYWw6ICovCi0gICAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7IG4rKykgewotICAgICAgICBzdGF0aWNfZHRyZWVbbl0uTGVuID0gNTsKLSAgICAgICAgc3RhdGljX2R0cmVlW25dLkNvZGUgPSBiaV9yZXZlcnNlKCh1bnNpZ25lZCluLCA1KTsKLSAgICB9Ci0gICAgc3RhdGljX2luaXRfZG9uZSA9IDE7Ci0KLSMgIGlmZGVmIEdFTl9UUkVFU19ICi0gICAgZ2VuX3RyZWVzX2hlYWRlcigpOwotIyAgZW5kaWYKLSNlbmRpZiAvKiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKSAqLwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEdlbmVyZXJhdGUgdGhlIGZpbGUgdHJlZXMuaCBkZXNjcmliaW5nIHRoZSBzdGF0aWMgdHJlZXMuCi0gKi8KLSNpZmRlZiBHRU5fVFJFRVNfSAotIyAgaWZuZGVmIERFQlVHCi0jICAgIGluY2x1ZGUgPHN0ZGlvLmg+Ci0jICBlbmRpZgotCi0jICBkZWZpbmUgU0VQQVJBVE9SKGksIGxhc3QsIHdpZHRoKSBcCi0gICAgICAoKGkpID09IChsYXN0KT8gIlxufTtcblxuIiA6ICAgIFwKLSAgICAgICAoKGkpICUgKHdpZHRoKSA9PSAod2lkdGgpLTEgPyAiLFxuIiA6ICIsICIpKQotCi12b2lkIGdlbl90cmVlc19oZWFkZXIoKQotewotICAgIEZJTEUgKmhlYWRlciA9IGZvcGVuKCJ0cmVlcy5oIiwgInciKTsKLSAgICBpbnQgaTsKLQotICAgIEFzc2VydCAoaGVhZGVyICE9IE5VTEwsICJDYW4ndCBvcGVuIHRyZWVzLmgiKTsKLSAgICBmcHJpbnRmKGhlYWRlciwKLSAgICAgICAgICAgICIvKiBoZWFkZXIgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdpdGggLURHRU5fVFJFRVNfSCAqL1xuXG4iKTsKLQotICAgIGZwcmludGYoaGVhZGVyLCAibG9jYWwgY29uc3QgY3RfZGF0YSBzdGF0aWNfbHRyZWVbTF9DT0RFUysyXSA9IHtcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBMX0NPREVTKzI7IGkrKykgewotICAgICAgICBmcHJpbnRmKGhlYWRlciwgInt7JTN1fSx7JTN1fX0lcyIsIHN0YXRpY19sdHJlZVtpXS5Db2RlLAotICAgICAgICAgICAgICAgIHN0YXRpY19sdHJlZVtpXS5MZW4sIFNFUEFSQVRPUihpLCBMX0NPREVTKzEsIDUpKTsKLSAgICB9Ci0KLSAgICBmcHJpbnRmKGhlYWRlciwgImxvY2FsIGNvbnN0IGN0X2RhdGEgc3RhdGljX2R0cmVlW0RfQ09ERVNdID0ge1xuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IERfQ09ERVM7IGkrKykgewotICAgICAgICBmcHJpbnRmKGhlYWRlciwgInt7JTJ1fSx7JTJ1fX0lcyIsIHN0YXRpY19kdHJlZVtpXS5Db2RlLAotICAgICAgICAgICAgICAgIHN0YXRpY19kdHJlZVtpXS5MZW4sIFNFUEFSQVRPUihpLCBEX0NPREVTLTEsIDUpKTsKLSAgICB9Ci0KLSAgICBmcHJpbnRmKGhlYWRlciwgImNvbnN0IHVjaCBaTElCX0lOVEVSTkFMIF9kaXN0X2NvZGVbRElTVF9DT0RFX0xFTl0gPSB7XG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgRElTVF9DT0RFX0xFTjsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoaGVhZGVyLCAiJTJ1JXMiLCBfZGlzdF9jb2RlW2ldLAotICAgICAgICAgICAgICAgIFNFUEFSQVRPUihpLCBESVNUX0NPREVfTEVOLTEsIDIwKSk7Ci0gICAgfQotCi0gICAgZnByaW50ZihoZWFkZXIsCi0gICAgICAgICJjb25zdCB1Y2ggWkxJQl9JTlRFUk5BTCBfbGVuZ3RoX2NvZGVbTUFYX01BVENILU1JTl9NQVRDSCsxXT0ge1xuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9NQVRDSC1NSU5fTUFUQ0grMTsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoaGVhZGVyLCAiJTJ1JXMiLCBfbGVuZ3RoX2NvZGVbaV0sCi0gICAgICAgICAgICAgICAgU0VQQVJBVE9SKGksIE1BWF9NQVRDSC1NSU5fTUFUQ0gsIDIwKSk7Ci0gICAgfQotCi0gICAgZnByaW50ZihoZWFkZXIsICJsb2NhbCBjb25zdCBpbnQgYmFzZV9sZW5ndGhbTEVOR1RIX0NPREVTXSA9IHtcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBMRU5HVEhfQ09ERVM7IGkrKykgewotICAgICAgICBmcHJpbnRmKGhlYWRlciwgIiUxdSVzIiwgYmFzZV9sZW5ndGhbaV0sCi0gICAgICAgICAgICAgICAgU0VQQVJBVE9SKGksIExFTkdUSF9DT0RFUy0xLCAyMCkpOwotICAgIH0KLQotICAgIGZwcmludGYoaGVhZGVyLCAibG9jYWwgY29uc3QgaW50IGJhc2VfZGlzdFtEX0NPREVTXSA9IHtcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBEX0NPREVTOyBpKyspIHsKLSAgICAgICAgZnByaW50ZihoZWFkZXIsICIlNXUlcyIsIGJhc2VfZGlzdFtpXSwKLSAgICAgICAgICAgICAgICBTRVBBUkFUT1IoaSwgRF9DT0RFUy0xLCAxMCkpOwotICAgIH0KLQotICAgIGZjbG9zZShoZWFkZXIpOwotfQotI2VuZGlmIC8qIEdFTl9UUkVFU19IICovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogSW5pdGlhbGl6ZSB0aGUgdHJlZSBkYXRhIHN0cnVjdHVyZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtLgotICovCi12b2lkIFpMSUJfSU5URVJOQUwgX3RyX2luaXQocykKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotewotICAgIHRyX3N0YXRpY19pbml0KCk7Ci0KLSAgICBzLT5sX2Rlc2MuZHluX3RyZWUgPSBzLT5keW5fbHRyZWU7Ci0gICAgcy0+bF9kZXNjLnN0YXRfZGVzYyA9ICZzdGF0aWNfbF9kZXNjOwotCi0gICAgcy0+ZF9kZXNjLmR5bl90cmVlID0gcy0+ZHluX2R0cmVlOwotICAgIHMtPmRfZGVzYy5zdGF0X2Rlc2MgPSAmc3RhdGljX2RfZGVzYzsKLQotICAgIHMtPmJsX2Rlc2MuZHluX3RyZWUgPSBzLT5ibF90cmVlOwotICAgIHMtPmJsX2Rlc2Muc3RhdF9kZXNjID0gJnN0YXRpY19ibF9kZXNjOwotCi0gICAgcy0+YmlfYnVmID0gMDsKLSAgICBzLT5iaV92YWxpZCA9IDA7Ci0jaWZkZWYgREVCVUcKLSAgICBzLT5jb21wcmVzc2VkX2xlbiA9IDBMOwotICAgIHMtPmJpdHNfc2VudCA9IDBMOwotI2VuZGlmCi0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgZmlyc3QgZmlsZTogKi8KLSAgICBpbml0X2Jsb2NrKHMpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suCi0gKi8KLWxvY2FsIHZvaWQgaW5pdF9ibG9jayhzKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci17Ci0gICAgaW50IG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqLwotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgdHJlZXMuICovCi0gICAgZm9yIChuID0gMDsgbiA8IExfQ09ERVM7ICBuKyspIHMtPmR5bl9sdHJlZVtuXS5GcmVxID0gMDsKLSAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgIG4rKykgcy0+ZHluX2R0cmVlW25dLkZyZXEgPSAwOwotICAgIGZvciAobiA9IDA7IG4gPCBCTF9DT0RFUzsgbisrKSBzLT5ibF90cmVlW25dLkZyZXEgPSAwOwotCi0gICAgcy0+ZHluX2x0cmVlW0VORF9CTE9DS10uRnJlcSA9IDE7Ci0gICAgcy0+b3B0X2xlbiA9IHMtPnN0YXRpY19sZW4gPSAwTDsKLSAgICBzLT5sYXN0X2xpdCA9IHMtPm1hdGNoZXMgPSAwOwotfQotCi0jZGVmaW5lIFNNQUxMRVNUIDEKLS8qIEluZGV4IHdpdGhpbiB0aGUgaGVhcCBhcnJheSBvZiBsZWFzdCBmcmVxdWVudCBub2RlIGluIHRoZSBIdWZmbWFuIHRyZWUgKi8KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFJlbW92ZSB0aGUgc21hbGxlc3QgZWxlbWVudCBmcm9tIHRoZSBoZWFwIGFuZCByZWNyZWF0ZSB0aGUgaGVhcCB3aXRoCi0gKiBvbmUgbGVzcyBlbGVtZW50LiBVcGRhdGVzIGhlYXAgYW5kIGhlYXBfbGVuLgotICovCi0jZGVmaW5lIHBxcmVtb3ZlKHMsIHRyZWUsIHRvcCkgXAote1wKLSAgICB0b3AgPSBzLT5oZWFwW1NNQUxMRVNUXTsgXAotICAgIHMtPmhlYXBbU01BTExFU1RdID0gcy0+aGVhcFtzLT5oZWFwX2xlbi0tXTsgXAotICAgIHBxZG93bmhlYXAocywgdHJlZSwgU01BTExFU1QpOyBcCi19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29tcGFyZXMgdG8gc3VidHJlZXMsIHVzaW5nIHRoZSB0cmVlIGRlcHRoIGFzIHRpZSBicmVha2VyIHdoZW4KLSAqIHRoZSBzdWJ0cmVlcyBoYXZlIGVxdWFsIGZyZXF1ZW5jeS4gVGhpcyBtaW5pbWl6ZXMgdGhlIHdvcnN0IGNhc2UgbGVuZ3RoLgotICovCi0jZGVmaW5lIHNtYWxsZXIodHJlZSwgbiwgbSwgZGVwdGgpIFwKLSAgICh0cmVlW25dLkZyZXEgPCB0cmVlW21dLkZyZXEgfHwgXAotICAgKHRyZWVbbl0uRnJlcSA9PSB0cmVlW21dLkZyZXEgJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLAotICogZXhjaGFuZ2luZyBhIG5vZGUgd2l0aCB0aGUgc21hbGxlc3Qgb2YgaXRzIHR3byBzb25zIGlmIG5lY2Vzc2FyeSwgc3RvcHBpbmcKLSAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHMKLSAqIHR3byBzb25zKS4KLSAqLwotbG9jYWwgdm9pZCBwcWRvd25oZWFwKHMsIHRyZWUsIGspCi0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICBjdF9kYXRhICp0cmVlOyAgLyogdGhlIHRyZWUgdG8gcmVzdG9yZSAqLwotICAgIGludCBrOyAgICAgICAgICAgICAgIC8qIG5vZGUgdG8gbW92ZSBkb3duICovCi17Ci0gICAgaW50IHYgPSBzLT5oZWFwW2tdOwotICAgIGludCBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqLwotICAgIHdoaWxlIChqIDw9IHMtPmhlYXBfbGVuKSB7Ci0gICAgICAgIC8qIFNldCBqIHRvIHRoZSBzbWFsbGVzdCBvZiB0aGUgdHdvIHNvbnM6ICovCi0gICAgICAgIGlmIChqIDwgcy0+aGVhcF9sZW4gJiYKLSAgICAgICAgICAgIHNtYWxsZXIodHJlZSwgcy0+aGVhcFtqKzFdLCBzLT5oZWFwW2pdLCBzLT5kZXB0aCkpIHsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgfQotICAgICAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqLwotICAgICAgICBpZiAoc21hbGxlcih0cmVlLCB2LCBzLT5oZWFwW2pdLCBzLT5kZXB0aCkpIGJyZWFrOwotCi0gICAgICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovCi0gICAgICAgIHMtPmhlYXBba10gPSBzLT5oZWFwW2pdOyAgayA9IGo7Ci0KLSAgICAgICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqLwotICAgICAgICBqIDw8PSAxOwotICAgIH0KLSAgICBzLT5oZWFwW2tdID0gdjsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzIGZvciBhIHRyZWUgYW5kIHVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aAotICogZm9yIHRoZSBjdXJyZW50IGJsb2NrLgotICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LCBoZWFwW2hlYXBfbWF4XSBhbmQKLSAqICAgIGFib3ZlIGFyZSB0aGUgdHJlZSBub2RlcyBzb3J0ZWQgYnkgaW5jcmVhc2luZyBmcmVxdWVuY3kuCi0gKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkIGxlbiBpcyBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aCwgdGhlCi0gKiAgICAgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGZyZXF1ZW5jaWVzIGZvciBlYWNoIGJpdCBsZW5ndGguCi0gKiAgICAgVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzCi0gKiAgICAgbm90IG51bGwuCi0gKi8KLWxvY2FsIHZvaWQgZ2VuX2JpdGxlbihzLCBkZXNjKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgdHJlZV9kZXNjICpkZXNjOyAgICAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovCi17Ci0gICAgY3RfZGF0YSAqdHJlZSAgICAgICAgPSBkZXNjLT5keW5fdHJlZTsKLSAgICBpbnQgbWF4X2NvZGUgICAgICAgICA9IGRlc2MtPm1heF9jb2RlOwotICAgIGNvbnN0IGN0X2RhdGEgKnN0cmVlID0gZGVzYy0+c3RhdF9kZXNjLT5zdGF0aWNfdHJlZTsKLSAgICBjb25zdCBpbnRmICpleHRyYSAgICA9IGRlc2MtPnN0YXRfZGVzYy0+ZXh0cmFfYml0czsKLSAgICBpbnQgYmFzZSAgICAgICAgICAgICA9IGRlc2MtPnN0YXRfZGVzYy0+ZXh0cmFfYmFzZTsKLSAgICBpbnQgbWF4X2xlbmd0aCAgICAgICA9IGRlc2MtPnN0YXRfZGVzYy0+bWF4X2xlbmd0aDsKLSAgICBpbnQgaDsgICAgICAgICAgICAgIC8qIGhlYXAgaW5kZXggKi8KLSAgICBpbnQgbiwgbTsgICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciB0aGUgdHJlZSBlbGVtZW50cyAqLwotICAgIGludCBiaXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqLwotICAgIGludCB4Yml0czsgICAgICAgICAgLyogZXh0cmEgYml0cyAqLwotICAgIHVzaCBmOyAgICAgICAgICAgICAgLyogZnJlcXVlbmN5ICovCi0gICAgaW50IG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqLwotCi0gICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSBzLT5ibF9jb3VudFtiaXRzXSA9IDA7Ci0KLSAgICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdoaWNoIG1heQotICAgICAqIG92ZXJmbG93IGluIHRoZSBjYXNlIG9mIHRoZSBiaXQgbGVuZ3RoIHRyZWUpLgotICAgICAqLwotICAgIHRyZWVbcy0+aGVhcFtzLT5oZWFwX21heF1dLkxlbiA9IDA7IC8qIHJvb3Qgb2YgdGhlIGhlYXAgKi8KLQotICAgIGZvciAoaCA9IHMtPmhlYXBfbWF4KzE7IGggPCBIRUFQX1NJWkU7IGgrKykgewotICAgICAgICBuID0gcy0+aGVhcFtoXTsKLSAgICAgICAgYml0cyA9IHRyZWVbdHJlZVtuXS5EYWRdLkxlbiArIDE7Ci0gICAgICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkgYml0cyA9IG1heF9sZW5ndGgsIG92ZXJmbG93Kys7Ci0gICAgICAgIHRyZWVbbl0uTGVuID0gKHVzaCliaXRzOwotICAgICAgICAvKiBXZSBvdmVyd3JpdGUgdHJlZVtuXS5EYWQgd2hpY2ggaXMgbm8gbG9uZ2VyIG5lZWRlZCAqLwotCi0gICAgICAgIGlmIChuID4gbWF4X2NvZGUpIGNvbnRpbnVlOyAvKiBub3QgYSBsZWFmIG5vZGUgKi8KLQotICAgICAgICBzLT5ibF9jb3VudFtiaXRzXSsrOwotICAgICAgICB4Yml0cyA9IDA7Ci0gICAgICAgIGlmIChuID49IGJhc2UpIHhiaXRzID0gZXh0cmFbbi1iYXNlXTsKLSAgICAgICAgZiA9IHRyZWVbbl0uRnJlcTsKLSAgICAgICAgcy0+b3B0X2xlbiArPSAodWxnKWYgKiAoYml0cyArIHhiaXRzKTsKLSAgICAgICAgaWYgKHN0cmVlKSBzLT5zdGF0aWNfbGVuICs9ICh1bGcpZiAqIChzdHJlZVtuXS5MZW4gKyB4Yml0cyk7Ci0gICAgfQotICAgIGlmIChvdmVyZmxvdyA9PSAwKSByZXR1cm47Ci0KLSAgICBUcmFjZSgoc3RkZXJyLCJcbmJpdCBsZW5ndGggb3ZlcmZsb3dcbiIpKTsKLSAgICAvKiBUaGlzIGhhcHBlbnMgZm9yIGV4YW1wbGUgb24gb2JqMiBhbmQgcGljIG9mIHRoZSBDYWxnYXJ5IGNvcnB1cyAqLwotCi0gICAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi8KLSAgICBkbyB7Ci0gICAgICAgIGJpdHMgPSBtYXhfbGVuZ3RoLTE7Ci0gICAgICAgIHdoaWxlIChzLT5ibF9jb3VudFtiaXRzXSA9PSAwKSBiaXRzLS07Ci0gICAgICAgIHMtPmJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICovCi0gICAgICAgIHMtPmJsX2NvdW50W2JpdHMrMV0gKz0gMjsgLyogbW92ZSBvbmUgb3ZlcmZsb3cgaXRlbSBhcyBpdHMgYnJvdGhlciAqLwotICAgICAgICBzLT5ibF9jb3VudFttYXhfbGVuZ3RoXS0tOwotICAgICAgICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVwIHVwLAotICAgICAgICAgKiBidXQgdGhpcyBkb2VzIG5vdCBhZmZlY3QgYmxfY291bnRbbWF4X2xlbmd0aF0KLSAgICAgICAgICovCi0gICAgICAgIG92ZXJmbG93IC09IDI7Ci0gICAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTsKLQotICAgIC8qIE5vdyByZWNvbXB1dGUgYWxsIGJpdCBsZW5ndGhzLCBzY2FubmluZyBpbiBpbmNyZWFzaW5nIGZyZXF1ZW5jeS4KLSAgICAgKiBoIGlzIHN0aWxsIGVxdWFsIHRvIEhFQVBfU0laRS4gKEl0IGlzIHNpbXBsZXIgdG8gcmVjb25zdHJ1Y3QgYWxsCi0gICAgICogbGVuZ3RocyBpbnN0ZWFkIG9mIGZpeGluZyBvbmx5IHRoZSB3cm9uZyBvbmVzLiBUaGlzIGlkZWEgaXMgdGFrZW4KLSAgICAgKiBmcm9tICdhcicgd3JpdHRlbiBieSBIYXJ1aGlrbyBPa3VtdXJhLikKLSAgICAgKi8KLSAgICBmb3IgKGJpdHMgPSBtYXhfbGVuZ3RoOyBiaXRzICE9IDA7IGJpdHMtLSkgewotICAgICAgICBuID0gcy0+YmxfY291bnRbYml0c107Ci0gICAgICAgIHdoaWxlIChuICE9IDApIHsKLSAgICAgICAgICAgIG0gPSBzLT5oZWFwWy0taF07Ci0gICAgICAgICAgICBpZiAobSA+IG1heF9jb2RlKSBjb250aW51ZTsKLSAgICAgICAgICAgIGlmICgodW5zaWduZWQpIHRyZWVbbV0uTGVuICE9ICh1bnNpZ25lZCkgYml0cykgewotICAgICAgICAgICAgICAgIFRyYWNlKChzdGRlcnIsImNvZGUgJWQgYml0cyAlZC0+JWRcbiIsIG0sIHRyZWVbbV0uTGVuLCBiaXRzKSk7Ci0gICAgICAgICAgICAgICAgcy0+b3B0X2xlbiArPSAoKGxvbmcpYml0cyAtIChsb25nKXRyZWVbbV0uTGVuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsb25nKXRyZWVbbV0uRnJlcTsKLSAgICAgICAgICAgICAgICB0cmVlW21dLkxlbiA9ICh1c2gpYml0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG4tLTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBHZW5lcmF0ZSB0aGUgY29kZXMgZm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmUKLSAqIG9wdGltYWwpLgotICogSU4gYXNzZXJ0aW9uOiB0aGUgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGJpdCBsZW5ndGggc3RhdGlzdGljcyBmb3IKLSAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQgbGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCi0gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgZmllbGQgY29kZSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzIG9mIG5vbgotICogICAgIHplcm8gY29kZSBsZW5ndGguCi0gKi8KLWxvY2FsIHZvaWQgZ2VuX2NvZGVzICh0cmVlLCBtYXhfY29kZSwgYmxfY291bnQpCi0gICAgY3RfZGF0YSAqdHJlZTsgICAgICAgICAgICAgLyogdGhlIHRyZWUgdG8gZGVjb3JhdGUgKi8KLSAgICBpbnQgbWF4X2NvZGU7ICAgICAgICAgICAgICAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi8KLSAgICB1c2hmICpibF9jb3VudDsgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoICovCi17Ci0gICAgdXNoIG5leHRfY29kZVtNQVhfQklUUysxXTsgLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi8KLSAgICB1c2ggY29kZSA9IDA7ICAgICAgICAgICAgICAvKiBydW5uaW5nIGNvZGUgdmFsdWUgKi8KLSAgICBpbnQgYml0czsgICAgICAgICAgICAgICAgICAvKiBiaXQgaW5kZXggKi8KLSAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGluZGV4ICovCi0KLSAgICAvKiBUaGUgZGlzdHJpYnV0aW9uIGNvdW50cyBhcmUgZmlyc3QgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY29kZSB2YWx1ZXMKLSAgICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC4KLSAgICAgKi8KLSAgICBmb3IgKGJpdHMgPSAxOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHsKLSAgICAgICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cy0xXSkgPDwgMTsKLSAgICB9Ci0gICAgLyogQ2hlY2sgdGhhdCB0aGUgYml0IGNvdW50cyBpbiBibF9jb3VudCBhcmUgY29uc2lzdGVudC4gVGhlIGxhc3QgY29kZQotICAgICAqIG11c3QgYmUgYWxsIG9uZXMuCi0gICAgICovCi0gICAgQXNzZXJ0IChjb2RlICsgYmxfY291bnRbTUFYX0JJVFNdLTEgPT0gKDE8PE1BWF9CSVRTKS0xLAotICAgICAgICAgICAgImluY29uc2lzdGVudCBiaXQgY291bnRzIik7Ci0gICAgVHJhY2V2KChzdGRlcnIsIlxuZ2VuX2NvZGVzOiBtYXhfY29kZSAlZCAiLCBtYXhfY29kZSkpOwotCi0gICAgZm9yIChuID0gMDsgIG4gPD0gbWF4X2NvZGU7IG4rKykgewotICAgICAgICBpbnQgbGVuID0gdHJlZVtuXS5MZW47Ci0gICAgICAgIGlmIChsZW4gPT0gMCkgY29udGludWU7Ci0gICAgICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovCi0gICAgICAgIHRyZWVbbl0uQ29kZSA9IGJpX3JldmVyc2UobmV4dF9jb2RlW2xlbl0rKywgbGVuKTsKLQotICAgICAgICBUcmFjZWN2KHRyZWUgIT0gc3RhdGljX2x0cmVlLCAoc3RkZXJyLCJcbm4gJTNkICVjIGwgJTJkIGMgJTR4ICgleCkgIiwKLSAgICAgICAgICAgICBuLCAoaXNncmFwaChuKSA/IG4gOiAnICcpLCBsZW4sIHRyZWVbbl0uQ29kZSwgbmV4dF9jb2RlW2xlbl0tMSkpOwotICAgIH0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb25zdHJ1Y3Qgb25lIEh1ZmZtYW4gdHJlZSBhbmQgYXNzaWducyB0aGUgY29kZSBiaXQgc3RyaW5ncyBhbmQgbGVuZ3Rocy4KLSAqIFVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suCi0gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZCBmcmVxIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCi0gKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkcyBsZW4gYW5kIGNvZGUgYXJlIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoCi0gKiAgICAgYW5kIGNvcnJlc3BvbmRpbmcgY29kZS4gVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMKLSAqICAgICBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMgbm90IG51bGwuIFRoZSBmaWVsZCBtYXhfY29kZSBpcyBzZXQuCi0gKi8KLWxvY2FsIHZvaWQgYnVpbGRfdHJlZShzLCBkZXNjKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgdHJlZV9kZXNjICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovCi17Ci0gICAgY3RfZGF0YSAqdHJlZSAgICAgICAgID0gZGVzYy0+ZHluX3RyZWU7Ci0gICAgY29uc3QgY3RfZGF0YSAqc3RyZWUgID0gZGVzYy0+c3RhdF9kZXNjLT5zdGF0aWNfdHJlZTsKLSAgICBpbnQgZWxlbXMgICAgICAgICAgICAgPSBkZXNjLT5zdGF0X2Rlc2MtPmVsZW1zOwotICAgIGludCBuLCBtOyAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgaGVhcCBlbGVtZW50cyAqLwotICAgIGludCBtYXhfY29kZSA9IC0xOyAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi8KLSAgICBpbnQgbm9kZTsgICAgICAgICAgLyogbmV3IG5vZGUgYmVpbmcgY3JlYXRlZCAqLwotCi0gICAgLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpbgotICAgICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLgotICAgICAqIGhlYXBbMF0gaXMgbm90IHVzZWQuCi0gICAgICovCi0gICAgcy0+aGVhcF9sZW4gPSAwLCBzLT5oZWFwX21heCA9IEhFQVBfU0laRTsKLQotICAgIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7Ci0gICAgICAgIGlmICh0cmVlW25dLkZyZXEgIT0gMCkgewotICAgICAgICAgICAgcy0+aGVhcFsrKyhzLT5oZWFwX2xlbildID0gbWF4X2NvZGUgPSBuOwotICAgICAgICAgICAgcy0+ZGVwdGhbbl0gPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJlZVtuXS5MZW4gPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVGhlIHBremlwIGZvcm1hdCByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBkaXN0YW5jZSBjb2RlIGV4aXN0cywKLSAgICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmUKLSAgICAgKiBwb3NzaWJsZSBjb2RlLiBTbyB0byBhdm9pZCBzcGVjaWFsIGNoZWNrcyBsYXRlciBvbiB3ZSBmb3JjZSBhdCBsZWFzdAotICAgICAqIHR3byBjb2RlcyBvZiBub24gemVybyBmcmVxdWVuY3kuCi0gICAgICovCi0gICAgd2hpbGUgKHMtPmhlYXBfbGVuIDwgMikgewotICAgICAgICBub2RlID0gcy0+aGVhcFsrKyhzLT5oZWFwX2xlbildID0gKG1heF9jb2RlIDwgMiA/ICsrbWF4X2NvZGUgOiAwKTsKLSAgICAgICAgdHJlZVtub2RlXS5GcmVxID0gMTsKLSAgICAgICAgcy0+ZGVwdGhbbm9kZV0gPSAwOwotICAgICAgICBzLT5vcHRfbGVuLS07IGlmIChzdHJlZSkgcy0+c3RhdGljX2xlbiAtPSBzdHJlZVtub2RlXS5MZW47Ci0gICAgICAgIC8qIG5vZGUgaXMgMCBvciAxIHNvIGl0IGRvZXMgbm90IGhhdmUgZXh0cmEgYml0cyAqLwotICAgIH0KLSAgICBkZXNjLT5tYXhfY29kZSA9IG1heF9jb2RlOwotCi0gICAgLyogVGhlIGVsZW1lbnRzIGhlYXBbaGVhcF9sZW4vMisxIC4uIGhlYXBfbGVuXSBhcmUgbGVhdmVzIG9mIHRoZSB0cmVlLAotICAgICAqIGVzdGFibGlzaCBzdWItaGVhcHMgb2YgaW5jcmVhc2luZyBsZW5ndGhzOgotICAgICAqLwotICAgIGZvciAobiA9IHMtPmhlYXBfbGVuLzI7IG4gPj0gMTsgbi0tKSBwcWRvd25oZWFwKHMsIHRyZWUsIG4pOwotCi0gICAgLyogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgYnkgcmVwZWF0ZWRseSBjb21iaW5pbmcgdGhlIGxlYXN0IHR3bwotICAgICAqIGZyZXF1ZW50IG5vZGVzLgotICAgICAqLwotICAgIG5vZGUgPSBlbGVtczsgICAgICAgICAgICAgIC8qIG5leHQgaW50ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZSAqLwotICAgIGRvIHsKLSAgICAgICAgcHFyZW1vdmUocywgdHJlZSwgbik7ICAvKiBuID0gbm9kZSBvZiBsZWFzdCBmcmVxdWVuY3kgKi8KLSAgICAgICAgbSA9IHMtPmhlYXBbU01BTExFU1RdOyAvKiBtID0gbm9kZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqLwotCi0gICAgICAgIHMtPmhlYXBbLS0ocy0+aGVhcF9tYXgpXSA9IG47IC8qIGtlZXAgdGhlIG5vZGVzIHNvcnRlZCBieSBmcmVxdWVuY3kgKi8KLSAgICAgICAgcy0+aGVhcFstLShzLT5oZWFwX21heCldID0gbTsKLQotICAgICAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2YgbiBhbmQgbSAqLwotICAgICAgICB0cmVlW25vZGVdLkZyZXEgPSB0cmVlW25dLkZyZXEgKyB0cmVlW21dLkZyZXE7Ci0gICAgICAgIHMtPmRlcHRoW25vZGVdID0gKHVjaCkoKHMtPmRlcHRoW25dID49IHMtPmRlcHRoW21dID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVwdGhbbl0gOiBzLT5kZXB0aFttXSkgKyAxKTsKLSAgICAgICAgdHJlZVtuXS5EYWQgPSB0cmVlW21dLkRhZCA9ICh1c2gpbm9kZTsKLSNpZmRlZiBEVU1QX0JMX1RSRUUKLSAgICAgICAgaWYgKHRyZWUgPT0gcy0+YmxfdHJlZSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIlxubm9kZSAlZCglZCksIHNvbnMgJWQoJWQpICVkKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIG5vZGUsIHRyZWVbbm9kZV0uRnJlcSwgbiwgdHJlZVtuXS5GcmVxLCBtLCB0cmVlW21dLkZyZXEpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi8KLSAgICAgICAgcy0+aGVhcFtTTUFMTEVTVF0gPSBub2RlKys7Ci0gICAgICAgIHBxZG93bmhlYXAocywgdHJlZSwgU01BTExFU1QpOwotCi0gICAgfSB3aGlsZSAocy0+aGVhcF9sZW4gPj0gMik7Ci0KLSAgICBzLT5oZWFwWy0tKHMtPmhlYXBfbWF4KV0gPSBzLT5oZWFwW1NNQUxMRVNUXTsKLQotICAgIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3cKLSAgICAgKiBnZW5lcmF0ZSB0aGUgYml0IGxlbmd0aHMuCi0gICAgICovCi0gICAgZ2VuX2JpdGxlbihzLCAodHJlZV9kZXNjICopZGVzYyk7Ci0KLSAgICAvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovCi0gICAgZ2VuX2NvZGVzICgoY3RfZGF0YSAqKXRyZWUsIG1heF9jb2RlLCBzLT5ibF9jb3VudCk7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogU2NhbiBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSB0byBkZXRlcm1pbmUgdGhlIGZyZXF1ZW5jaWVzIG9mIHRoZSBjb2RlcwotICogaW4gdGhlIGJpdCBsZW5ndGggdHJlZS4KLSAqLwotbG9jYWwgdm9pZCBzY2FuX3RyZWUgKHMsIHRyZWUsIG1heF9jb2RlKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgY3RfZGF0YSAqdHJlZTsgICAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovCi0gICAgaW50IG1heF9jb2RlOyAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi8KLXsKLSAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCi0gICAgaW50IHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLwotICAgIGludCBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi8KLSAgICBpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCi0gICAgaW50IGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi8KLSAgICBpbnQgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovCi0gICAgaW50IG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqLwotCi0gICAgaWYgKG5leHRsZW4gPT0gMCkgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOwotICAgIHRyZWVbbWF4X2NvZGUrMV0uTGVuID0gKHVzaCkweGZmZmY7IC8qIGd1YXJkICovCi0KLSAgICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKLSAgICAgICAgY3VybGVuID0gbmV4dGxlbjsgbmV4dGxlbiA9IHRyZWVbbisxXS5MZW47Ci0gICAgICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PSBuZXh0bGVuKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkgewotICAgICAgICAgICAgcy0+YmxfdHJlZVtjdXJsZW5dLkZyZXEgKz0gY291bnQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoY3VybGVuICE9IDApIHsKLSAgICAgICAgICAgIGlmIChjdXJsZW4gIT0gcHJldmxlbikgcy0+YmxfdHJlZVtjdXJsZW5dLkZyZXErKzsKLSAgICAgICAgICAgIHMtPmJsX3RyZWVbUkVQXzNfNl0uRnJlcSsrOwotICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7Ci0gICAgICAgICAgICBzLT5ibF90cmVlW1JFUFpfM18xMF0uRnJlcSsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcy0+YmxfdHJlZVtSRVBaXzExXzEzOF0uRnJlcSsrOwotICAgICAgICB9Ci0gICAgICAgIGNvdW50ID0gMDsgcHJldmxlbiA9IGN1cmxlbjsKLSAgICAgICAgaWYgKG5leHRsZW4gPT0gMCkgewotICAgICAgICAgICAgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOwotICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PSBuZXh0bGVuKSB7Ci0gICAgICAgICAgICBtYXhfY291bnQgPSA2LCBtaW5fY291bnQgPSAzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWF4X2NvdW50ID0gNywgbWluX2NvdW50ID0gNDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluCi0gKiBibF90cmVlLgotICovCi1sb2NhbCB2b2lkIHNlbmRfdHJlZSAocywgdHJlZSwgbWF4X2NvZGUpCi0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICBjdF9kYXRhICp0cmVlOyAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovCi0gICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi8KLXsKLSAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCi0gICAgaW50IHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLwotICAgIGludCBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi8KLSAgICBpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCi0gICAgaW50IGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi8KLSAgICBpbnQgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovCi0gICAgaW50IG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqLwotCi0gICAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovCi0gICAgaWYgKG5leHRsZW4gPT0gMCkgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOwotCi0gICAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7Ci0gICAgICAgIGN1cmxlbiA9IG5leHRsZW47IG5leHRsZW4gPSB0cmVlW24rMV0uTGVuOwotICAgICAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT0gbmV4dGxlbikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHsKLSAgICAgICAgICAgIGRvIHsgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy0+YmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT0gMCk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gIT0gMCkgewotICAgICAgICAgICAgaWYgKGN1cmxlbiAhPSBwcmV2bGVuKSB7Ci0gICAgICAgICAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy0+YmxfdHJlZSk7IGNvdW50LS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCAiIDNfNj8iKTsKLSAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLT5ibF90cmVlKTsgc2VuZF9iaXRzKHMsIGNvdW50LTMsIDIpOwotCi0gICAgICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHsKLSAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMtPmJsX3RyZWUpOyBzZW5kX2JpdHMocywgY291bnQtMywgMyk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBaXzExXzEzOCwgcy0+YmxfdHJlZSk7IHNlbmRfYml0cyhzLCBjb3VudC0xMSwgNyk7Ci0gICAgICAgIH0KLSAgICAgICAgY291bnQgPSAwOyBwcmV2bGVuID0gY3VybGVuOwotICAgICAgICBpZiAobmV4dGxlbiA9PSAwKSB7Ci0gICAgICAgICAgICBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7Ci0gICAgICAgIH0gZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pIHsKLSAgICAgICAgICAgIG1heF9jb3VudCA9IDYsIG1pbl9jb3VudCA9IDM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtYXhfY291bnQgPSA3LCBtaW5fY291bnQgPSA0OwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMgYW5kIHJldHVybiB0aGUgaW5kZXggaW4KLSAqIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLgotICovCi1sb2NhbCBpbnQgYnVpbGRfYmxfdHJlZShzKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci17Ci0gICAgaW50IG1heF9ibGluZGV4OyAgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqLwotCi0gICAgLyogRGV0ZXJtaW5lIHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqLwotICAgIHNjYW5fdHJlZShzLCAoY3RfZGF0YSAqKXMtPmR5bl9sdHJlZSwgcy0+bF9kZXNjLm1heF9jb2RlKTsKLSAgICBzY2FuX3RyZWUocywgKGN0X2RhdGEgKilzLT5keW5fZHRyZWUsIHMtPmRfZGVzYy5tYXhfY29kZSk7Ci0KLSAgICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqLwotICAgIGJ1aWxkX3RyZWUocywgKHRyZWVfZGVzYyAqKSgmKHMtPmJsX2Rlc2MpKSk7Ci0gICAgLyogb3B0X2xlbiBub3cgaW5jbHVkZXMgdGhlIGxlbmd0aCBvZiB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMsIGV4Y2VwdAotICAgICAqIHRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RocyBjb2RlcyBhbmQgdGhlIDUrNSs0IGJpdHMgZm9yIHRoZSBjb3VudHMuCi0gICAgICovCi0KLSAgICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBiaXQgbGVuZ3RoIGNvZGVzIHRvIHNlbmQuIFRoZSBwa3ppcCBmb3JtYXQKLSAgICAgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5cwotICAgICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LikKLSAgICAgKi8KLSAgICBmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMtMTsgbWF4X2JsaW5kZXggPj0gMzsgbWF4X2JsaW5kZXgtLSkgewotICAgICAgICBpZiAocy0+YmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF1dLkxlbiAhPSAwKSBicmVhazsKLSAgICB9Ci0gICAgLyogVXBkYXRlIG9wdF9sZW4gdG8gaW5jbHVkZSB0aGUgYml0IGxlbmd0aCB0cmVlIGFuZCBjb3VudHMgKi8KLSAgICBzLT5vcHRfbGVuICs9IDMqKG1heF9ibGluZGV4KzEpICsgNSs1KzQ7Ci0gICAgVHJhY2V2KChzdGRlcnIsICJcbmR5biB0cmVlczogZHluICVsZCwgc3RhdCAlbGQiLAotICAgICAgICAgICAgcy0+b3B0X2xlbiwgcy0+c3RhdGljX2xlbikpOwotCi0gICAgcmV0dXJuIG1heF9ibGluZGV4OwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFNlbmQgdGhlIGhlYWRlciBmb3IgYSBibG9jayB1c2luZyBkeW5hbWljIEh1ZmZtYW4gdHJlZXM6IHRoZSBjb3VudHMsIHRoZQotICogbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUuCi0gKiBJTiBhc3NlcnRpb246IGxjb2RlcyA+PSAyNTcsIGRjb2RlcyA+PSAxLCBibGNvZGVzID49IDQuCi0gKi8KLWxvY2FsIHZvaWQgc2VuZF9hbGxfdHJlZXMocywgbGNvZGVzLCBkY29kZXMsIGJsY29kZXMpCi0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICBpbnQgbGNvZGVzLCBkY29kZXMsIGJsY29kZXM7IC8qIG51bWJlciBvZiBjb2RlcyBmb3IgZWFjaCB0cmVlICovCi17Ci0gICAgaW50IHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqLwotCi0gICAgQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgIm5vdCBlbm91Z2ggY29kZXMiKTsKLSAgICBBc3NlcnQgKGxjb2RlcyA8PSBMX0NPREVTICYmIGRjb2RlcyA8PSBEX0NPREVTICYmIGJsY29kZXMgPD0gQkxfQ09ERVMsCi0gICAgICAgICAgICAidG9vIG1hbnkgY29kZXMiKTsKLSAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY291bnRzOiAiKSk7Ci0gICAgc2VuZF9iaXRzKHMsIGxjb2Rlcy0yNTcsIDUpOyAvKiBub3QgKzI1NSBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi8KLSAgICBzZW5kX2JpdHMocywgZGNvZGVzLTEsICAgNSk7Ci0gICAgc2VuZF9iaXRzKHMsIGJsY29kZXMtNCwgIDQpOyAvKiBub3QgLTMgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovCi0gICAgZm9yIChyYW5rID0gMDsgcmFuayA8IGJsY29kZXM7IHJhbmsrKykgewotICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY29kZSAlMmQgIiwgYmxfb3JkZXJbcmFua10pKTsKLSAgICAgICAgc2VuZF9iaXRzKHMsIHMtPmJsX3RyZWVbYmxfb3JkZXJbcmFua11dLkxlbiwgMyk7Ci0gICAgfQotICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCB0cmVlOiBzZW50ICVsZCIsIHMtPmJpdHNfc2VudCkpOwotCi0gICAgc2VuZF90cmVlKHMsIChjdF9kYXRhICopcy0+ZHluX2x0cmVlLCBsY29kZXMtMSk7IC8qIGxpdGVyYWwgdHJlZSAqLwotICAgIFRyYWNldigoc3RkZXJyLCAiXG5saXQgdHJlZTogc2VudCAlbGQiLCBzLT5iaXRzX3NlbnQpKTsKLQotICAgIHNlbmRfdHJlZShzLCAoY3RfZGF0YSAqKXMtPmR5bl9kdHJlZSwgZGNvZGVzLTEpOyAvKiBkaXN0YW5jZSB0cmVlICovCi0gICAgVHJhY2V2KChzdGRlcnIsICJcbmRpc3QgdHJlZTogc2VudCAlbGQiLCBzLT5iaXRzX3NlbnQpKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBTZW5kIGEgc3RvcmVkIGJsb2NrCi0gKi8KLXZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdCkKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIGNoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrICovCi0gICAgdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovCi0gICAgaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqLwotewotICAgIHNlbmRfYml0cyhzLCAoU1RPUkVEX0JMT0NLPDwxKStsYXN0LCAzKTsgICAgLyogc2VuZCBibG9jayB0eXBlICovCi0jaWZkZWYgREVCVUcKLSAgICBzLT5jb21wcmVzc2VkX2xlbiA9IChzLT5jb21wcmVzc2VkX2xlbiArIDMgKyA3KSAmICh1bGcpfjdMOwotICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IChzdG9yZWRfbGVuICsgNCkgPDwgMzsKLSNlbmRpZgotICAgIGNvcHlfYmxvY2socywgYnVmLCAodW5zaWduZWQpc3RvcmVkX2xlbiwgMSk7IC8qIHdpdGggaGVhZGVyICovCi19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogRmx1c2ggdGhlIGJpdHMgaW4gdGhlIGJpdCBidWZmZXIgdG8gcGVuZGluZyBvdXRwdXQgKGxlYXZlcyBhdCBtb3N0IDcgYml0cykKLSAqLwotdm9pZCBaTElCX0lOVEVSTkFMIF90cl9mbHVzaF9iaXRzKHMpCi0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLXsKLSAgICBiaV9mbHVzaChzKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBTZW5kIG9uZSBlbXB0eSBzdGF0aWMgYmxvY2sgdG8gZ2l2ZSBlbm91Z2ggbG9va2FoZWFkIGZvciBpbmZsYXRlLgotICogVGhpcyB0YWtlcyAxMCBiaXRzLCBvZiB3aGljaCA3IG1heSByZW1haW4gaW4gdGhlIGJpdCBidWZmZXIuCi0gKi8KLXZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfYWxpZ24ocykKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotewotICAgIHNlbmRfYml0cyhzLCBTVEFUSUNfVFJFRVM8PDEsIDMpOwotICAgIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIHN0YXRpY19sdHJlZSk7Ci0jaWZkZWYgREVCVUcKLSAgICBzLT5jb21wcmVzc2VkX2xlbiArPSAxMEw7IC8qIDMgZm9yIGJsb2NrIHR5cGUsIDcgZm9yIEVPQiAqLwotI2VuZGlmCi0gICAgYmlfZmx1c2gocyk7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nIGZvciB0aGUgY3VycmVudCBibG9jazogZHluYW1pYyB0cmVlcywgc3RhdGljCi0gKiB0cmVlcyBvciBzdG9yZSwgYW5kIG91dHB1dCB0aGUgZW5jb2RlZCBibG9jayB0byB0aGUgemlwIGZpbGUuCi0gKi8KLXZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfZmx1c2hfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgY2hhcmYgKmJ1ZjsgICAgICAgLyogaW5wdXQgYmxvY2ssIG9yIE5VTEwgaWYgdG9vIG9sZCAqLwotICAgIHVsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqLwotICAgIGludCBsYXN0OyAgICAgICAgIC8qIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi8KLXsKLSAgICB1bGcgb3B0X2xlbmIsIHN0YXRpY19sZW5iOyAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovCi0gICAgaW50IG1heF9ibGluZGV4ID0gMDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi8KLQotICAgIC8qIEJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzIHVubGVzcyBhIHN0b3JlZCBibG9jayBpcyBmb3JjZWQgKi8KLSAgICBpZiAocy0+bGV2ZWwgPiAwKSB7Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYmluYXJ5IG9yIHRleHQgKi8KLSAgICAgICAgaWYgKHMtPnN0cm0tPmRhdGFfdHlwZSA9PSBaX1VOS05PV04pCi0gICAgICAgICAgICBzLT5zdHJtLT5kYXRhX3R5cGUgPSBkZXRlY3RfZGF0YV90eXBlKHMpOwotCi0gICAgICAgIC8qIENvbnN0cnVjdCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi8KLSAgICAgICAgYnVpbGRfdHJlZShzLCAodHJlZV9kZXNjICopKCYocy0+bF9kZXNjKSkpOwotICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkIiwgcy0+b3B0X2xlbiwKLSAgICAgICAgICAgICAgICBzLT5zdGF0aWNfbGVuKSk7Ci0KLSAgICAgICAgYnVpbGRfdHJlZShzLCAodHJlZV9kZXNjICopKCYocy0+ZF9kZXNjKSkpOwotICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIHMtPm9wdF9sZW4sCi0gICAgICAgICAgICAgICAgcy0+c3RhdGljX2xlbikpOwotICAgICAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2YKLSAgICAgICAgICogdGhlIGNvbXByZXNzZWQgYmxvY2sgZGF0YSwgZXhjbHVkaW5nIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucy4KLSAgICAgICAgICovCi0KLSAgICAgICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXgKLSAgICAgICAgICogaW4gYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuCi0gICAgICAgICAqLwotICAgICAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7Ci0KLSAgICAgICAgLyogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nLiBDb21wdXRlIHRoZSBibG9jayBsZW5ndGhzIGluIGJ5dGVzLiAqLwotICAgICAgICBvcHRfbGVuYiA9IChzLT5vcHRfbGVuKzMrNyk+PjM7Ci0gICAgICAgIHN0YXRpY19sZW5iID0gKHMtPnN0YXRpY19sZW4rMys3KT4+MzsKLQotICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQgJXUgIiwKLSAgICAgICAgICAgICAgICBvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sCi0gICAgICAgICAgICAgICAgcy0+bGFzdF9saXQpKTsKLQotICAgICAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIG9wdF9sZW5iID0gc3RhdGljX2xlbmI7Ci0KLSAgICB9IGVsc2UgewotICAgICAgICBBc3NlcnQoYnVmICE9IChjaGFyKikwLCAibG9zdCBidWYiKTsKLSAgICAgICAgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYiA9IHN0b3JlZF9sZW4gKyA1OyAvKiBmb3JjZSBhIHN0b3JlZCBibG9jayAqLwotICAgIH0KLQotI2lmZGVmIEZPUkNFX1NUT1JFRAotICAgIGlmIChidWYgIT0gKGNoYXIqKTApIHsgLyogZm9yY2Ugc3RvcmVkIGJsb2NrICovCi0jZWxzZQotICAgIGlmIChzdG9yZWRfbGVuKzQgPD0gb3B0X2xlbmIgJiYgYnVmICE9IChjaGFyKikwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi8KLSNlbmRpZgotICAgICAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLgotICAgICAgICAgKiBPdGhlcndpc2Ugd2UgY2FuJ3QgaGF2ZSBwcm9jZXNzZWQgbW9yZSB0aGFuIFdTSVpFIGlucHV0IGJ5dGVzIHNpbmNlCi0gICAgICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNoLCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlbgotICAgICAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG8KLSAgICAgICAgICogdHJhbnNmb3JtIGEgYmxvY2sgaW50byBhIHN0b3JlZCBibG9jay4KLSAgICAgICAgICovCi0gICAgICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KTsKLQotI2lmZGVmIEZPUkNFX1NUQVRJQwotICAgIH0gZWxzZSBpZiAoc3RhdGljX2xlbmIgPj0gMCkgeyAvKiBmb3JjZSBzdGF0aWMgdHJlZXMgKi8KLSNlbHNlCi0gICAgfSBlbHNlIGlmIChzLT5zdHJhdGVneSA9PSBaX0ZJWEVEIHx8IHN0YXRpY19sZW5iID09IG9wdF9sZW5iKSB7Ci0jZW5kaWYKLSAgICAgICAgc2VuZF9iaXRzKHMsIChTVEFUSUNfVFJFRVM8PDEpK2xhc3QsIDMpOwotICAgICAgICBjb21wcmVzc19ibG9jayhzLCAoY3RfZGF0YSAqKXN0YXRpY19sdHJlZSwgKGN0X2RhdGEgKilzdGF0aWNfZHRyZWUpOwotI2lmZGVmIERFQlVHCi0gICAgICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDMgKyBzLT5zdGF0aWNfbGVuOwotI2VuZGlmCi0gICAgfSBlbHNlIHsKLSAgICAgICAgc2VuZF9iaXRzKHMsIChEWU5fVFJFRVM8PDEpK2xhc3QsIDMpOwotICAgICAgICBzZW5kX2FsbF90cmVlcyhzLCBzLT5sX2Rlc2MubWF4X2NvZGUrMSwgcy0+ZF9kZXNjLm1heF9jb2RlKzEsCi0gICAgICAgICAgICAgICAgICAgICAgIG1heF9ibGluZGV4KzEpOwotICAgICAgICBjb21wcmVzc19ibG9jayhzLCAoY3RfZGF0YSAqKXMtPmR5bl9sdHJlZSwgKGN0X2RhdGEgKilzLT5keW5fZHRyZWUpOwotI2lmZGVmIERFQlVHCi0gICAgICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDMgKyBzLT5vcHRfbGVuOwotI2VuZGlmCi0gICAgfQotICAgIEFzc2VydCAocy0+Y29tcHJlc3NlZF9sZW4gPT0gcy0+Yml0c19zZW50LCAiYmFkIGNvbXByZXNzZWQgc2l6ZSIpOwotICAgIC8qIFRoZSBhYm92ZSBjaGVjayBpcyBtYWRlIG1vZCAyXjMyLCBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNTEyIE1CCi0gICAgICogYW5kIHVMb25nIGltcGxlbWVudGVkIG9uIDMyIGJpdHMuCi0gICAgICovCi0gICAgaW5pdF9ibG9jayhzKTsKLQotICAgIGlmIChsYXN0KSB7Ci0gICAgICAgIGJpX3dpbmR1cChzKTsKLSNpZmRlZiBERUJVRwotICAgICAgICBzLT5jb21wcmVzc2VkX2xlbiArPSA3OyAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqLwotI2VuZGlmCi0gICAgfQotICAgIFRyYWNldigoc3RkZXJyLCJcbmNvbXBybGVuICVsdSglbHUpICIsIHMtPmNvbXByZXNzZWRfbGVuPj4zLAotICAgICAgICAgICBzLT5jb21wcmVzc2VkX2xlbi03Kmxhc3QpKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5IGNvdW50cy4gUmV0dXJuIHRydWUgaWYKLSAqIHRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZC4KLSAqLwotaW50IFpMSUJfSU5URVJOQUwgX3RyX3RhbGx5IChzLCBkaXN0LCBsYykKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIHVuc2lnbmVkIGRpc3Q7ICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqLwotICAgIHVuc2lnbmVkIGxjOyAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqLwotewotICAgIHMtPmRfYnVmW3MtPmxhc3RfbGl0XSA9ICh1c2gpZGlzdDsKLSAgICBzLT5sX2J1ZltzLT5sYXN0X2xpdCsrXSA9ICh1Y2gpbGM7Ci0gICAgaWYgKGRpc3QgPT0gMCkgewotICAgICAgICAvKiBsYyBpcyB0aGUgdW5tYXRjaGVkIGNoYXIgKi8KLSAgICAgICAgcy0+ZHluX2x0cmVlW2xjXS5GcmVxKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcy0+bWF0Y2hlcysrOwotICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovCi0gICAgICAgIGRpc3QtLTsgICAgICAgICAgICAgLyogZGlzdCA9IG1hdGNoIGRpc3RhbmNlIC0gMSAqLwotICAgICAgICBBc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJgotICAgICAgICAgICAgICAgKHVzaClsYyA8PSAodXNoKShNQVhfTUFUQ0gtTUlOX01BVENIKSAmJgotICAgICAgICAgICAgICAgKHVzaClkX2NvZGUoZGlzdCkgPCAodXNoKURfQ09ERVMsICAiX3RyX3RhbGx5OiBiYWQgbWF0Y2giKTsKLQotICAgICAgICBzLT5keW5fbHRyZWVbX2xlbmd0aF9jb2RlW2xjXStMSVRFUkFMUysxXS5GcmVxKys7Ci0gICAgICAgIHMtPmR5bl9kdHJlZVtkX2NvZGUoZGlzdCldLkZyZXErKzsKLSAgICB9Ci0KLSNpZmRlZiBUUlVOQ0FURV9CTE9DSwotICAgIC8qIFRyeSB0byBndWVzcyBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIHN0b3AgdGhlIGN1cnJlbnQgYmxvY2sgaGVyZSAqLwotICAgIGlmICgocy0+bGFzdF9saXQgJiAweDFmZmYpID09IDAgJiYgcy0+bGV2ZWwgPiAyKSB7Ci0gICAgICAgIC8qIENvbXB1dGUgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb21wcmVzc2VkIGxlbmd0aCAqLwotICAgICAgICB1bGcgb3V0X2xlbmd0aCA9ICh1bGcpcy0+bGFzdF9saXQqOEw7Ci0gICAgICAgIHVsZyBpbl9sZW5ndGggPSAodWxnKSgobG9uZylzLT5zdHJzdGFydCAtIHMtPmJsb2NrX3N0YXJ0KTsKLSAgICAgICAgaW50IGRjb2RlOwotICAgICAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7Ci0gICAgICAgICAgICBvdXRfbGVuZ3RoICs9ICh1bGcpcy0+ZHluX2R0cmVlW2Rjb2RlXS5GcmVxICoKLSAgICAgICAgICAgICAgICAoNUwrZXh0cmFfZGJpdHNbZGNvZGVdKTsKLSAgICAgICAgfQotICAgICAgICBvdXRfbGVuZ3RoID4+PSAzOwotICAgICAgICBUcmFjZXYoKHN0ZGVyciwiXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgIiwKLSAgICAgICAgICAgICAgIHMtPmxhc3RfbGl0LCBpbl9sZW5ndGgsIG91dF9sZW5ndGgsCi0gICAgICAgICAgICAgICAxMDBMIC0gb3V0X2xlbmd0aCoxMDBML2luX2xlbmd0aCkpOwotICAgICAgICBpZiAocy0+bWF0Y2hlcyA8IHMtPmxhc3RfbGl0LzIgJiYgb3V0X2xlbmd0aCA8IGluX2xlbmd0aC8yKSByZXR1cm4gMTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gKHMtPmxhc3RfbGl0ID09IHMtPmxpdF9idWZzaXplLTEpOwotICAgIC8qIFdlIGF2b2lkIGVxdWFsaXR5IHdpdGggbGl0X2J1ZnNpemUgYmVjYXVzZSBvZiB3cmFwYXJvdW5kIGF0IDY0SwotICAgICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvCi0gICAgICogNjRLLTEgYnl0ZXMuCi0gICAgICovCi19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogU2VuZCB0aGUgYmxvY2sgZGF0YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzCi0gKi8KLWxvY2FsIHZvaWQgY29tcHJlc3NfYmxvY2socywgbHRyZWUsIGR0cmVlKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqLwotICAgIGN0X2RhdGEgKmR0cmVlOyAvKiBkaXN0YW5jZSB0cmVlICovCi17Ci0gICAgdW5zaWduZWQgZGlzdDsgICAgICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqLwotICAgIGludCBsYzsgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0ID09IDApICovCi0gICAgdW5zaWduZWQgbHggPSAwOyAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovCi0gICAgdW5zaWduZWQgY29kZTsgICAgICAvKiB0aGUgY29kZSB0byBzZW5kICovCi0gICAgaW50IGV4dHJhOyAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBzZW5kICovCi0KLSAgICBpZiAocy0+bGFzdF9saXQgIT0gMCkgZG8gewotICAgICAgICBkaXN0ID0gcy0+ZF9idWZbbHhdOwotICAgICAgICBsYyA9IHMtPmxfYnVmW2x4KytdOwotICAgICAgICBpZiAoZGlzdCA9PSAwKSB7Ci0gICAgICAgICAgICBzZW5kX2NvZGUocywgbGMsIGx0cmVlKTsgLyogc2VuZCBhIGxpdGVyYWwgYnl0ZSAqLwotICAgICAgICAgICAgVHJhY2Vjdihpc2dyYXBoKGxjKSwgKHN0ZGVyciwiICclYycgIiwgbGMpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi8KLSAgICAgICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdOwotICAgICAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUrTElURVJBTFMrMSwgbHRyZWUpOyAvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqLwotICAgICAgICAgICAgZXh0cmEgPSBleHRyYV9sYml0c1tjb2RlXTsKLSAgICAgICAgICAgIGlmIChleHRyYSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbGMgLT0gYmFzZV9sZW5ndGhbY29kZV07Ci0gICAgICAgICAgICAgICAgc2VuZF9iaXRzKHMsIGxjLCBleHRyYSk7ICAgICAgIC8qIHNlbmQgdGhlIGV4dHJhIGxlbmd0aCBiaXRzICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkaXN0LS07IC8qIGRpc3QgaXMgbm93IHRoZSBtYXRjaCBkaXN0YW5jZSAtIDEgKi8KLSAgICAgICAgICAgIGNvZGUgPSBkX2NvZGUoZGlzdCk7Ci0gICAgICAgICAgICBBc3NlcnQgKGNvZGUgPCBEX0NPREVTLCAiYmFkIGRfY29kZSIpOwotCi0gICAgICAgICAgICBzZW5kX2NvZGUocywgY29kZSwgZHRyZWUpOyAgICAgICAvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovCi0gICAgICAgICAgICBleHRyYSA9IGV4dHJhX2RiaXRzW2NvZGVdOwotICAgICAgICAgICAgaWYgKGV4dHJhICE9IDApIHsKLSAgICAgICAgICAgICAgICBkaXN0IC09IGJhc2VfZGlzdFtjb2RlXTsKLSAgICAgICAgICAgICAgICBzZW5kX2JpdHMocywgZGlzdCwgZXh0cmEpOyAgIC8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqLwotCi0gICAgICAgIC8qIENoZWNrIHRoYXQgdGhlIG92ZXJsYXkgYmV0d2VlbiBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYgaXMgb2s6ICovCi0gICAgICAgIEFzc2VydCgodUludCkocy0+cGVuZGluZykgPCBzLT5saXRfYnVmc2l6ZSArIDIqbHgsCi0gICAgICAgICAgICAgICAicGVuZGluZ0J1ZiBvdmVyZmxvdyIpOwotCi0gICAgfSB3aGlsZSAobHggPCBzLT5sYXN0X2xpdCk7Ci0KLSAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBsdHJlZSk7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ2hlY2sgaWYgdGhlIGRhdGEgdHlwZSBpcyBURVhUIG9yIEJJTkFSWSwgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06Ci0gKiAtIFRFWFQgaWYgdGhlIHR3byBjb25kaXRpb25zIGJlbG93IGFyZSBzYXRpc2ZpZWQ6Ci0gKiAgICBhKSBUaGVyZSBhcmUgbm8gbm9uLXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBiZWxvbmdpbmcgdG8gdGhlCi0gKiAgICAgICAiYmxhY2sgbGlzdCIgKDAuLjYsIDE0Li4yNSwgMjguLjMxKS4KLSAqICAgIGIpIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBwcmludGFibGUgY2hhcmFjdGVyIGJlbG9uZ2luZyB0byB0aGUKLSAqICAgICAgICJ3aGl0ZSBsaXN0IiAoOSB7VEFCfSwgMTAge0xGfSwgMTMge0NSfSwgMzIuLjI1NSkuCi0gKiAtIEJJTkFSWSBvdGhlcndpc2UuCi0gKiAtIFRoZSBmb2xsb3dpbmcgcGFydGlhbGx5LXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBmb3JtIGEKLSAqICAgImdyYXkgbGlzdCIgdGhhdCBpcyBpZ25vcmVkIGluIHRoaXMgZGV0ZWN0aW9uIGFsZ29yaXRobToKLSAqICAgKDcge0JFTH0sIDgge0JTfSwgMTEge1ZUfSwgMTIge0ZGfSwgMjYge1NVQn0sIDI3IHtFU0N9KS4KLSAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBGcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0LgotICovCi1sb2NhbCBpbnQgZGV0ZWN0X2RhdGFfdHlwZShzKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci17Ci0gICAgLyogYmxhY2tfbWFzayBpcyB0aGUgYml0IG1hc2sgb2YgYmxhY2stbGlzdGVkIGJ5dGVzCi0gICAgICogc2V0IGJpdHMgMC4uNiwgMTQuLjI1LCBhbmQgMjguLjMxCi0gICAgICogMHhmM2ZmYzA3ZiA9IGJpbmFyeSAxMTExMDAxMTExMTExMTExMTEwMDAwMDAwMTExMTExMQotICAgICAqLwotICAgIHVuc2lnbmVkIGxvbmcgYmxhY2tfbWFzayA9IDB4ZjNmZmMwN2ZVTDsKLSAgICBpbnQgbjsKLQotICAgIC8qIENoZWNrIGZvciBub24tdGV4dHVhbCAoImJsYWNrLWxpc3RlZCIpIGJ5dGVzLiAqLwotICAgIGZvciAobiA9IDA7IG4gPD0gMzE7IG4rKywgYmxhY2tfbWFzayA+Pj0gMSkKLSAgICAgICAgaWYgKChibGFja19tYXNrICYgMSkgJiYgKHMtPmR5bl9sdHJlZVtuXS5GcmVxICE9IDApKQotICAgICAgICAgICAgcmV0dXJuIFpfQklOQVJZOwotCi0gICAgLyogQ2hlY2sgZm9yIHRleHR1YWwgKCJ3aGl0ZS1saXN0ZWQiKSBieXRlcy4gKi8KLSAgICBpZiAocy0+ZHluX2x0cmVlWzldLkZyZXEgIT0gMCB8fCBzLT5keW5fbHRyZWVbMTBdLkZyZXEgIT0gMAotICAgICAgICAgICAgfHwgcy0+ZHluX2x0cmVlWzEzXS5GcmVxICE9IDApCi0gICAgICAgIHJldHVybiBaX1RFWFQ7Ci0gICAgZm9yIChuID0gMzI7IG4gPCBMSVRFUkFMUzsgbisrKQotICAgICAgICBpZiAocy0+ZHluX2x0cmVlW25dLkZyZXEgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiBaX1RFWFQ7Ci0KLSAgICAvKiBUaGVyZSBhcmUgbm8gImJsYWNrLWxpc3RlZCIgb3IgIndoaXRlLWxpc3RlZCIgYnl0ZXM6Ci0gICAgICogdGhpcyBzdHJlYW0gZWl0aGVyIGlzIGVtcHR5IG9yIGhhcyB0b2xlcmF0ZWQgKCJncmF5LWxpc3RlZCIpIGJ5dGVzIG9ubHkuCi0gICAgICovCi0gICAgcmV0dXJuIFpfQklOQVJZOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFJldmVyc2UgdGhlIGZpcnN0IGxlbiBiaXRzIG9mIGEgY29kZSwgdXNpbmcgc3RyYWlnaHRmb3J3YXJkIGNvZGUgKGEgZmFzdGVyCi0gKiBtZXRob2Qgd291bGQgdXNlIGEgdGFibGUpCi0gKiBJTiBhc3NlcnRpb246IDEgPD0gbGVuIDw9IDE1Ci0gKi8KLWxvY2FsIHVuc2lnbmVkIGJpX3JldmVyc2UoY29kZSwgbGVuKQotICAgIHVuc2lnbmVkIGNvZGU7IC8qIHRoZSB2YWx1ZSB0byBpbnZlcnQgKi8KLSAgICBpbnQgbGVuOyAgICAgICAvKiBpdHMgYml0IGxlbmd0aCAqLwotewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIHJlcyA9IDA7Ci0gICAgZG8gewotICAgICAgICByZXMgfD0gY29kZSAmIDE7Ci0gICAgICAgIGNvZGUgPj49IDEsIHJlcyA8PD0gMTsKLSAgICB9IHdoaWxlICgtLWxlbiA+IDApOwotICAgIHJldHVybiByZXMgPj4gMTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciwga2VlcGluZyBhdCBtb3N0IDcgYml0cyBpbiBpdC4KLSAqLwotbG9jYWwgdm9pZCBiaV9mbHVzaChzKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci17Ci0gICAgaWYgKHMtPmJpX3ZhbGlkID09IDE2KSB7Ci0gICAgICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpOwotICAgICAgICBzLT5iaV9idWYgPSAwOwotICAgICAgICBzLT5iaV92YWxpZCA9IDA7Ci0gICAgfSBlbHNlIGlmIChzLT5iaV92YWxpZCA+PSA4KSB7Ci0gICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7Ci0gICAgICAgIHMtPmJpX2J1ZiA+Pj0gODsKLSAgICAgICAgcy0+YmlfdmFsaWQgLT0gODsKLSAgICB9Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogRmx1c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5Ci0gKi8KLWxvY2FsIHZvaWQgYmlfd2luZHVwKHMpCi0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLXsKLSAgICBpZiAocy0+YmlfdmFsaWQgPiA4KSB7Ci0gICAgICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpOwotICAgIH0gZWxzZSBpZiAocy0+YmlfdmFsaWQgPiAwKSB7Ci0gICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7Ci0gICAgfQotICAgIHMtPmJpX2J1ZiA9IDA7Ci0gICAgcy0+YmlfdmFsaWQgPSAwOwotI2lmZGVmIERFQlVHCi0gICAgcy0+Yml0c19zZW50ID0gKHMtPmJpdHNfc2VudCs3KSAmIH43OwotI2VuZGlmCi19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weSBhIHN0b3JlZCBibG9jaywgc3RvcmluZyBmaXJzdCB0aGUgbGVuZ3RoIGFuZCBpdHMKLSAqIG9uZSdzIGNvbXBsZW1lbnQgaWYgcmVxdWVzdGVkLgotICovCi1sb2NhbCB2b2lkIGNvcHlfYmxvY2socywgYnVmLCBsZW4sIGhlYWRlcikKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIGNoYXJmICAgICpidWY7ICAgIC8qIHRoZSBpbnB1dCBkYXRhICovCi0gICAgdW5zaWduZWQgbGVuOyAgICAgLyogaXRzIGxlbmd0aCAqLwotICAgIGludCAgICAgIGhlYWRlcjsgIC8qIHRydWUgaWYgYmxvY2sgaGVhZGVyIG11c3QgYmUgd3JpdHRlbiAqLwotewotICAgIGJpX3dpbmR1cChzKTsgICAgICAgIC8qIGFsaWduIG9uIGJ5dGUgYm91bmRhcnkgKi8KLQotICAgIGlmIChoZWFkZXIpIHsKLSAgICAgICAgcHV0X3Nob3J0KHMsICh1c2gpbGVuKTsKLSAgICAgICAgcHV0X3Nob3J0KHMsICh1c2gpfmxlbik7Ci0jaWZkZWYgREVCVUcKLSAgICAgICAgcy0+Yml0c19zZW50ICs9IDIqMTY7Ci0jZW5kaWYKLSAgICB9Ci0jaWZkZWYgREVCVUcKLSAgICBzLT5iaXRzX3NlbnQgKz0gKHVsZylsZW48PDM7Ci0jZW5kaWYKLSAgICB3aGlsZSAobGVuLS0pIHsKLSAgICAgICAgcHV0X2J5dGUocywgKmJ1ZisrKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvemxpYi90cmVlcy5oIGIvc3JjL3psaWIvdHJlZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM1NjM5ZC4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi90cmVlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qIGhlYWRlciBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2l0aCAtREdFTl9UUkVFU19IICovCi0KLWxvY2FsIGNvbnN0IGN0X2RhdGEgc3RhdGljX2x0cmVlW0xfQ09ERVMrMl0gPSB7Ci17eyAxMn0seyAgOH19LCB7ezE0MH0seyAgOH19LCB7eyA3Nn0seyAgOH19LCB7ezIwNH0seyAgOH19LCB7eyA0NH0seyAgOH19LAote3sxNzJ9LHsgIDh9fSwge3sxMDh9LHsgIDh9fSwge3syMzZ9LHsgIDh9fSwge3sgMjh9LHsgIDh9fSwge3sxNTZ9LHsgIDh9fSwKLXt7IDkyfSx7ICA4fX0sIHt7MjIwfSx7ICA4fX0sIHt7IDYwfSx7ICA4fX0sIHt7MTg4fSx7ICA4fX0sIHt7MTI0fSx7ICA4fX0sCi17ezI1Mn0seyAgOH19LCB7eyAgMn0seyAgOH19LCB7ezEzMH0seyAgOH19LCB7eyA2Nn0seyAgOH19LCB7ezE5NH0seyAgOH19LAote3sgMzR9LHsgIDh9fSwge3sxNjJ9LHsgIDh9fSwge3sgOTh9LHsgIDh9fSwge3syMjZ9LHsgIDh9fSwge3sgMTh9LHsgIDh9fSwKLXt7MTQ2fSx7ICA4fX0sIHt7IDgyfSx7ICA4fX0sIHt7MjEwfSx7ICA4fX0sIHt7IDUwfSx7ICA4fX0sIHt7MTc4fSx7ICA4fX0sCi17ezExNH0seyAgOH19LCB7ezI0Mn0seyAgOH19LCB7eyAxMH0seyAgOH19LCB7ezEzOH0seyAgOH19LCB7eyA3NH0seyAgOH19LAote3syMDJ9LHsgIDh9fSwge3sgNDJ9LHsgIDh9fSwge3sxNzB9LHsgIDh9fSwge3sxMDZ9LHsgIDh9fSwge3syMzR9LHsgIDh9fSwKLXt7IDI2fSx7ICA4fX0sIHt7MTU0fSx7ICA4fX0sIHt7IDkwfSx7ICA4fX0sIHt7MjE4fSx7ICA4fX0sIHt7IDU4fSx7ICA4fX0sCi17ezE4Nn0seyAgOH19LCB7ezEyMn0seyAgOH19LCB7ezI1MH0seyAgOH19LCB7eyAgNn0seyAgOH19LCB7ezEzNH0seyAgOH19LAote3sgNzB9LHsgIDh9fSwge3sxOTh9LHsgIDh9fSwge3sgMzh9LHsgIDh9fSwge3sxNjZ9LHsgIDh9fSwge3sxMDJ9LHsgIDh9fSwKLXt7MjMwfSx7ICA4fX0sIHt7IDIyfSx7ICA4fX0sIHt7MTUwfSx7ICA4fX0sIHt7IDg2fSx7ICA4fX0sIHt7MjE0fSx7ICA4fX0sCi17eyA1NH0seyAgOH19LCB7ezE4Mn0seyAgOH19LCB7ezExOH0seyAgOH19LCB7ezI0Nn0seyAgOH19LCB7eyAxNH0seyAgOH19LAote3sxNDJ9LHsgIDh9fSwge3sgNzh9LHsgIDh9fSwge3syMDZ9LHsgIDh9fSwge3sgNDZ9LHsgIDh9fSwge3sxNzR9LHsgIDh9fSwKLXt7MTEwfSx7ICA4fX0sIHt7MjM4fSx7ICA4fX0sIHt7IDMwfSx7ICA4fX0sIHt7MTU4fSx7ICA4fX0sIHt7IDk0fSx7ICA4fX0sCi17ezIyMn0seyAgOH19LCB7eyA2Mn0seyAgOH19LCB7ezE5MH0seyAgOH19LCB7ezEyNn0seyAgOH19LCB7ezI1NH0seyAgOH19LAote3sgIDF9LHsgIDh9fSwge3sxMjl9LHsgIDh9fSwge3sgNjV9LHsgIDh9fSwge3sxOTN9LHsgIDh9fSwge3sgMzN9LHsgIDh9fSwKLXt7MTYxfSx7ICA4fX0sIHt7IDk3fSx7ICA4fX0sIHt7MjI1fSx7ICA4fX0sIHt7IDE3fSx7ICA4fX0sIHt7MTQ1fSx7ICA4fX0sCi17eyA4MX0seyAgOH19LCB7ezIwOX0seyAgOH19LCB7eyA0OX0seyAgOH19LCB7ezE3N30seyAgOH19LCB7ezExM30seyAgOH19LAote3syNDF9LHsgIDh9fSwge3sgIDl9LHsgIDh9fSwge3sxMzd9LHsgIDh9fSwge3sgNzN9LHsgIDh9fSwge3syMDF9LHsgIDh9fSwKLXt7IDQxfSx7ICA4fX0sIHt7MTY5fSx7ICA4fX0sIHt7MTA1fSx7ICA4fX0sIHt7MjMzfSx7ICA4fX0sIHt7IDI1fSx7ICA4fX0sCi17ezE1M30seyAgOH19LCB7eyA4OX0seyAgOH19LCB7ezIxN30seyAgOH19LCB7eyA1N30seyAgOH19LCB7ezE4NX0seyAgOH19LAote3sxMjF9LHsgIDh9fSwge3syNDl9LHsgIDh9fSwge3sgIDV9LHsgIDh9fSwge3sxMzN9LHsgIDh9fSwge3sgNjl9LHsgIDh9fSwKLXt7MTk3fSx7ICA4fX0sIHt7IDM3fSx7ICA4fX0sIHt7MTY1fSx7ICA4fX0sIHt7MTAxfSx7ICA4fX0sIHt7MjI5fSx7ICA4fX0sCi17eyAyMX0seyAgOH19LCB7ezE0OX0seyAgOH19LCB7eyA4NX0seyAgOH19LCB7ezIxM30seyAgOH19LCB7eyA1M30seyAgOH19LAote3sxODF9LHsgIDh9fSwge3sxMTd9LHsgIDh9fSwge3syNDV9LHsgIDh9fSwge3sgMTN9LHsgIDh9fSwge3sxNDF9LHsgIDh9fSwKLXt7IDc3fSx7ICA4fX0sIHt7MjA1fSx7ICA4fX0sIHt7IDQ1fSx7ICA4fX0sIHt7MTczfSx7ICA4fX0sIHt7MTA5fSx7ICA4fX0sCi17ezIzN30seyAgOH19LCB7eyAyOX0seyAgOH19LCB7ezE1N30seyAgOH19LCB7eyA5M30seyAgOH19LCB7ezIyMX0seyAgOH19LAote3sgNjF9LHsgIDh9fSwge3sxODl9LHsgIDh9fSwge3sxMjV9LHsgIDh9fSwge3syNTN9LHsgIDh9fSwge3sgMTl9LHsgIDl9fSwKLXt7Mjc1fSx7ICA5fX0sIHt7MTQ3fSx7ICA5fX0sIHt7NDAzfSx7ICA5fX0sIHt7IDgzfSx7ICA5fX0sIHt7MzM5fSx7ICA5fX0sCi17ezIxMX0seyAgOX19LCB7ezQ2N30seyAgOX19LCB7eyA1MX0seyAgOX19LCB7ezMwN30seyAgOX19LCB7ezE3OX0seyAgOX19LAote3s0MzV9LHsgIDl9fSwge3sxMTV9LHsgIDl9fSwge3szNzF9LHsgIDl9fSwge3syNDN9LHsgIDl9fSwge3s0OTl9LHsgIDl9fSwKLXt7IDExfSx7ICA5fX0sIHt7MjY3fSx7ICA5fX0sIHt7MTM5fSx7ICA5fX0sIHt7Mzk1fSx7ICA5fX0sIHt7IDc1fSx7ICA5fX0sCi17ezMzMX0seyAgOX19LCB7ezIwM30seyAgOX19LCB7ezQ1OX0seyAgOX19LCB7eyA0M30seyAgOX19LCB7ezI5OX0seyAgOX19LAote3sxNzF9LHsgIDl9fSwge3s0Mjd9LHsgIDl9fSwge3sxMDd9LHsgIDl9fSwge3szNjN9LHsgIDl9fSwge3syMzV9LHsgIDl9fSwKLXt7NDkxfSx7ICA5fX0sIHt7IDI3fSx7ICA5fX0sIHt7MjgzfSx7ICA5fX0sIHt7MTU1fSx7ICA5fX0sIHt7NDExfSx7ICA5fX0sCi17eyA5MX0seyAgOX19LCB7ezM0N30seyAgOX19LCB7ezIxOX0seyAgOX19LCB7ezQ3NX0seyAgOX19LCB7eyA1OX0seyAgOX19LAote3szMTV9LHsgIDl9fSwge3sxODd9LHsgIDl9fSwge3s0NDN9LHsgIDl9fSwge3sxMjN9LHsgIDl9fSwge3szNzl9LHsgIDl9fSwKLXt7MjUxfSx7ICA5fX0sIHt7NTA3fSx7ICA5fX0sIHt7ICA3fSx7ICA5fX0sIHt7MjYzfSx7ICA5fX0sIHt7MTM1fSx7ICA5fX0sCi17ezM5MX0seyAgOX19LCB7eyA3MX0seyAgOX19LCB7ezMyN30seyAgOX19LCB7ezE5OX0seyAgOX19LCB7ezQ1NX0seyAgOX19LAote3sgMzl9LHsgIDl9fSwge3syOTV9LHsgIDl9fSwge3sxNjd9LHsgIDl9fSwge3s0MjN9LHsgIDl9fSwge3sxMDN9LHsgIDl9fSwKLXt7MzU5fSx7ICA5fX0sIHt7MjMxfSx7ICA5fX0sIHt7NDg3fSx7ICA5fX0sIHt7IDIzfSx7ICA5fX0sIHt7Mjc5fSx7ICA5fX0sCi17ezE1MX0seyAgOX19LCB7ezQwN30seyAgOX19LCB7eyA4N30seyAgOX19LCB7ezM0M30seyAgOX19LCB7ezIxNX0seyAgOX19LAote3s0NzF9LHsgIDl9fSwge3sgNTV9LHsgIDl9fSwge3szMTF9LHsgIDl9fSwge3sxODN9LHsgIDl9fSwge3s0Mzl9LHsgIDl9fSwKLXt7MTE5fSx7ICA5fX0sIHt7Mzc1fSx7ICA5fX0sIHt7MjQ3fSx7ICA5fX0sIHt7NTAzfSx7ICA5fX0sIHt7IDE1fSx7ICA5fX0sCi17ezI3MX0seyAgOX19LCB7ezE0M30seyAgOX19LCB7ezM5OX0seyAgOX19LCB7eyA3OX0seyAgOX19LCB7ezMzNX0seyAgOX19LAote3syMDd9LHsgIDl9fSwge3s0NjN9LHsgIDl9fSwge3sgNDd9LHsgIDl9fSwge3szMDN9LHsgIDl9fSwge3sxNzV9LHsgIDl9fSwKLXt7NDMxfSx7ICA5fX0sIHt7MTExfSx7ICA5fX0sIHt7MzY3fSx7ICA5fX0sIHt7MjM5fSx7ICA5fX0sIHt7NDk1fSx7ICA5fX0sCi17eyAzMX0seyAgOX19LCB7ezI4N30seyAgOX19LCB7ezE1OX0seyAgOX19LCB7ezQxNX0seyAgOX19LCB7eyA5NX0seyAgOX19LAote3szNTF9LHsgIDl9fSwge3syMjN9LHsgIDl9fSwge3s0Nzl9LHsgIDl9fSwge3sgNjN9LHsgIDl9fSwge3szMTl9LHsgIDl9fSwKLXt7MTkxfSx7ICA5fX0sIHt7NDQ3fSx7ICA5fX0sIHt7MTI3fSx7ICA5fX0sIHt7MzgzfSx7ICA5fX0sIHt7MjU1fSx7ICA5fX0sCi17ezUxMX0seyAgOX19LCB7eyAgMH0seyAgN319LCB7eyA2NH0seyAgN319LCB7eyAzMn0seyAgN319LCB7eyA5Nn0seyAgN319LAote3sgMTZ9LHsgIDd9fSwge3sgODB9LHsgIDd9fSwge3sgNDh9LHsgIDd9fSwge3sxMTJ9LHsgIDd9fSwge3sgIDh9LHsgIDd9fSwKLXt7IDcyfSx7ICA3fX0sIHt7IDQwfSx7ICA3fX0sIHt7MTA0fSx7ICA3fX0sIHt7IDI0fSx7ICA3fX0sIHt7IDg4fSx7ICA3fX0sCi17eyA1Nn0seyAgN319LCB7ezEyMH0seyAgN319LCB7eyAgNH0seyAgN319LCB7eyA2OH0seyAgN319LCB7eyAzNn0seyAgN319LAote3sxMDB9LHsgIDd9fSwge3sgMjB9LHsgIDd9fSwge3sgODR9LHsgIDd9fSwge3sgNTJ9LHsgIDd9fSwge3sxMTZ9LHsgIDd9fSwKLXt7ICAzfSx7ICA4fX0sIHt7MTMxfSx7ICA4fX0sIHt7IDY3fSx7ICA4fX0sIHt7MTk1fSx7ICA4fX0sIHt7IDM1fSx7ICA4fX0sCi17ezE2M30seyAgOH19LCB7eyA5OX0seyAgOH19LCB7ezIyN30seyAgOH19Ci19OwotCi1sb2NhbCBjb25zdCBjdF9kYXRhIHN0YXRpY19kdHJlZVtEX0NPREVTXSA9IHsKLXt7IDB9LHsgNX19LCB7ezE2fSx7IDV9fSwge3sgOH0seyA1fX0sIHt7MjR9LHsgNX19LCB7eyA0fSx7IDV9fSwKLXt7MjB9LHsgNX19LCB7ezEyfSx7IDV9fSwge3syOH0seyA1fX0sIHt7IDJ9LHsgNX19LCB7ezE4fSx7IDV9fSwKLXt7MTB9LHsgNX19LCB7ezI2fSx7IDV9fSwge3sgNn0seyA1fX0sIHt7MjJ9LHsgNX19LCB7ezE0fSx7IDV9fSwKLXt7MzB9LHsgNX19LCB7eyAxfSx7IDV9fSwge3sxN30seyA1fX0sIHt7IDl9LHsgNX19LCB7ezI1fSx7IDV9fSwKLXt7IDV9LHsgNX19LCB7ezIxfSx7IDV9fSwge3sxM30seyA1fX0sIHt7Mjl9LHsgNX19LCB7eyAzfSx7IDV9fSwKLXt7MTl9LHsgNX19LCB7ezExfSx7IDV9fSwge3syN30seyA1fX0sIHt7IDd9LHsgNX19LCB7ezIzfSx7IDV9fQotfTsKLQotY29uc3QgdWNoIFpMSUJfSU5URVJOQUwgX2Rpc3RfY29kZVtESVNUX0NPREVfTEVOXSA9IHsKLSAwLCAgMSwgIDIsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwKLSA4LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKLTEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKLTExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKLTEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywKLTEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLTEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLTE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLTE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLTE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLTE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLTE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLTE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAgMCwgIDAsIDE2LCAxNywKLTE4LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwKLTIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwKLTI0LCAyNCwgMjQsIDI0LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwKLTI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwKLTI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywKLTI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywKLTI3LCAyNywgMjcsIDI3LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwKLTI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwKLTI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwKLTI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwKLTI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwKLTI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwKLTI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjkKLX07Ci0KLWNvbnN0IHVjaCBaTElCX0lOVEVSTkFMIF9sZW5ndGhfY29kZVtNQVhfTUFUQ0gtTUlOX01BVENIKzFdPSB7Ci0gMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsCi0xMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCi0xNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTksIDE5LCAxOSwgMTksCi0xOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsCi0yMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjIsIDIyLCAyMiwgMjIsCi0yMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsCi0yMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsCi0yNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsCi0yNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsCi0yNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsCi0yNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsCi0yNiwgMjYsIDI2LCAyNiwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsCi0yNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyOAotfTsKLQotbG9jYWwgY29uc3QgaW50IGJhc2VfbGVuZ3RoW0xFTkdUSF9DT0RFU10gPSB7Ci0wLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCAxMCwgMTIsIDE0LCAxNiwgMjAsIDI0LCAyOCwgMzIsIDQwLCA0OCwgNTYsCi02NCwgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMAotfTsKLQotbG9jYWwgY29uc3QgaW50IGJhc2VfZGlzdFtEX0NPREVTXSA9IHsKLSAgICAwLCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDYsICAgICA4LCAgICAxMiwgICAgMTYsICAgIDI0LAotICAgMzIsICAgIDQ4LCAgICA2NCwgICAgOTYsICAgMTI4LCAgIDE5MiwgICAyNTYsICAgMzg0LCAgIDUxMiwgICA3NjgsCi0gMTAyNCwgIDE1MzYsICAyMDQ4LCAgMzA3MiwgIDQwOTYsICA2MTQ0LCAgODE5MiwgMTIyODgsIDE2Mzg0LCAyNDU3NgotfTsKLQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvdW5jb21wci5jIGIvc3JjL3psaWIvdW5jb21wci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDk4YmUzLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL3VuY29tcHIuYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qIHVuY29tcHIuYyAtLSBkZWNvbXByZXNzIGEgbWVtb3J5IGJ1ZmZlcgotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMsIDIwMTAgSmVhbi1sb3VwIEdhaWxseS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotI2RlZmluZSBaTElCX0lOVEVSTkFMCi0jaW5jbHVkZSAiemxpYi5oIgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgRGVjb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIHNvdXJjZUxlbiBpcwotICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbAotICAgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZQotICAgZW50aXJlIHVuY29tcHJlc3NlZCBkYXRhLiAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG11c3QgaGF2ZQotICAgYmVlbiBzYXZlZCBwcmV2aW91c2x5IGJ5IHRoZSBjb21wcmVzc29yIGFuZCB0cmFuc21pdHRlZCB0byB0aGUgZGVjb21wcmVzc29yCi0gICBieSBzb21lIG1lY2hhbmlzbSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGNvbXByZXNzaW9uIGxpYnJhcnkuKQotICAgVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBidWZmZXIuCi0KLSAgICAgdW5jb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAotICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0Ci0gICBidWZmZXIsIG9yIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkLgotKi8KLWludCBaRVhQT1JUIHVuY29tcHJlc3MgKGRlc3QsIGRlc3RMZW4sIHNvdXJjZSwgc291cmNlTGVuKQotICAgIEJ5dGVmICpkZXN0OwotICAgIHVMb25nZiAqZGVzdExlbjsKLSAgICBjb25zdCBCeXRlZiAqc291cmNlOwotICAgIHVMb25nIHNvdXJjZUxlbjsKLXsKLSAgICB6X3N0cmVhbSBzdHJlYW07Ci0gICAgaW50IGVycjsKLQotICAgIHN0cmVhbS5uZXh0X2luID0gKEJ5dGVmKilzb3VyY2U7Ci0gICAgc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpc291cmNlTGVuOwotICAgIC8qIENoZWNrIGZvciBzb3VyY2UgPiA2NEsgb24gMTYtYml0IG1hY2hpbmU6ICovCi0gICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfaW4gIT0gc291cmNlTGVuKSByZXR1cm4gWl9CVUZfRVJST1I7Ci0KLSAgICBzdHJlYW0ubmV4dF9vdXQgPSBkZXN0OwotICAgIHN0cmVhbS5hdmFpbF9vdXQgPSAodUludCkqZGVzdExlbjsKLSAgICBpZiAoKHVMb25nKXN0cmVhbS5hdmFpbF9vdXQgIT0gKmRlc3RMZW4pIHJldHVybiBaX0JVRl9FUlJPUjsKLQotICAgIHN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOwotICAgIHN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKLQotICAgIGVyciA9IGluZmxhdGVJbml0KCZzdHJlYW0pOwotICAgIGlmIChlcnIgIT0gWl9PSykgcmV0dXJuIGVycjsKLQotICAgIGVyciA9IGluZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOwotICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKSB7Ci0gICAgICAgIGluZmxhdGVFbmQoJnN0cmVhbSk7Ci0gICAgICAgIGlmIChlcnIgPT0gWl9ORUVEX0RJQ1QgfHwgKGVyciA9PSBaX0JVRl9FUlJPUiAmJiBzdHJlYW0uYXZhaWxfaW4gPT0gMCkpCi0gICAgICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICAqZGVzdExlbiA9IHN0cmVhbS50b3RhbF9vdXQ7Ci0KLSAgICBlcnIgPSBpbmZsYXRlRW5kKCZzdHJlYW0pOwotICAgIHJldHVybiBlcnI7Ci19CmRpZmYgLS1naXQgYS9zcmMvemxpYi93YXRjb20vd2F0Y29tX2YubWFrIGIvc3JjL3psaWIvd2F0Y29tL3dhdGNvbV9mLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdmNGQ3NC4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi93YXRjb20vd2F0Y29tX2YubWFrCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgemxpYgotIyBPcGVuV2F0Y29tIGZsYXQgbW9kZWwKLSMgTGFzdCB1cGRhdGVkOiAyOC1EZWMtMjAwNQotCi0jIFRvIHVzZSwgZG8gIndtYWtlIC1mIHdhdGNvbV9mLm1hayIKLQotQ19TT1VSQ0UgPSAgYWRsZXIzMi5jICBjb21wcmVzcy5jIGNyYzMyLmMgICBkZWZsYXRlLmMgICAgJgotCSAgICBnemNsb3NlLmMgIGd6bGliLmMgICAgZ3pyZWFkLmMgIGd6d3JpdGUuYyAgICAmCi0gICAgICAgICAgICBpbmZiYWNrLmMgIGluZmZhc3QuYyAgaW5mbGF0ZS5jIGluZnRyZWVzLmMgICAmCi0gICAgICAgICAgICB0cmVlcy5jICAgIHVuY29tcHIuYyAgenV0aWwuYwotCi1PQkpTID0gICAgICBhZGxlcjMyLm9iaiAgY29tcHJlc3Mub2JqIGNyYzMyLm9iaiAgIGRlZmxhdGUub2JqICAgICYKLQkgICAgZ3pjbG9zZS5vYmogIGd6bGliLm9iaiAgICBnenJlYWQub2JqICBnendyaXRlLm9iaiAgICAmCi0gICAgICAgICAgICBpbmZiYWNrLm9iaiAgaW5mZmFzdC5vYmogIGluZmxhdGUub2JqIGluZnRyZWVzLm9iaiAgICYKLSAgICAgICAgICAgIHRyZWVzLm9iaiAgICB1bmNvbXByLm9iaiAgenV0aWwub2JqCi0KLUNDICAgICAgID0gd2NjMzg2Ci1MSU5LRVIgICA9IHdjbDM4NgotQ0ZMQUdTICAgPSAtenEgLW1mIC0zciAtZnAzIC1zIC1idD1kb3MgLW9pbHJ0Zm0gLWZyPW51bCAtd3gKLVpMSUJfTElCID0gemxpYl9mLmxpYgotCi0uQy5PQko6Ci0gICAgICAgICQoQ0MpICQoQ0ZMQUdTKSAkW0AKLQotYWxsOiAkKFpMSUJfTElCKSBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKLQotJChaTElCX0xJQik6ICQoT0JKUykKLQl3bGliIC1iIC1jICQoWkxJQl9MSUIpIC0rYWRsZXIzMi5vYmogIC0rY29tcHJlc3Mub2JqIC0rY3JjMzIub2JqCi0Jd2xpYiAtYiAtYyAkKFpMSUJfTElCKSAtK2d6Y2xvc2Uub2JqICAtK2d6bGliLm9iaiAgICAtK2d6cmVhZC5vYmogICAtK2d6d3JpdGUub2JqCi0gICAgICAgIHdsaWIgLWIgLWMgJChaTElCX0xJQikgLStkZWZsYXRlLm9iaiAgLStpbmZiYWNrLm9iagotICAgICAgICB3bGliIC1iIC1jICQoWkxJQl9MSUIpIC0raW5mZmFzdC5vYmogIC0raW5mbGF0ZS5vYmogIC0raW5mdHJlZXMub2JqCi0gICAgICAgIHdsaWIgLWIgLWMgJChaTElCX0xJQikgLSt0cmVlcy5vYmogICAgLSt1bmNvbXByLm9iaiAgLSt6dXRpbC5vYmoKLQotZXhhbXBsZS5leGU6ICQoWkxJQl9MSUIpIGV4YW1wbGUub2JqCi0JJChMSU5LRVIpIC1sZG9zMzJhIC1mZT1leGFtcGxlLmV4ZSBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQotCi1taW5pZ3ppcC5leGU6ICQoWkxJQl9MSUIpIG1pbmlnemlwLm9iagotCSQoTElOS0VSKSAtbGRvczMyYSAtZmU9bWluaWd6aXAuZXhlIG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQotCi1jbGVhbjogLlNZTUJPTElDCi0gICAgICAgICAgZGVsICoub2JqCi0gICAgICAgICAgZGVsICQoWkxJQl9MSUIpCi0gICAgICAgICAgQGVjaG8gQ2xlYW5pbmcgZG9uZQpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvd2F0Y29tL3dhdGNvbV9sLm1hayBiL3NyYy96bGliL3dhdGNvbS93YXRjb21fbC5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5M2VlZDcuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvd2F0Y29tL3dhdGNvbV9sLm1haworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHpsaWIKLSMgT3BlbldhdGNvbSBsYXJnZSBtb2RlbAotIyBMYXN0IHVwZGF0ZWQ6IDI4LURlYy0yMDA1Ci0KLSMgVG8gdXNlLCBkbyAid21ha2UgLWYgd2F0Y29tX2wubWFrIgotCi1DX1NPVVJDRSA9ICBhZGxlcjMyLmMgIGNvbXByZXNzLmMgY3JjMzIuYyAgIGRlZmxhdGUuYyAgICAmCi0JICAgIGd6Y2xvc2UuYyAgZ3psaWIuYyAgICBnenJlYWQuYyAgZ3p3cml0ZS5jICAgICYKLSAgICAgICAgICAgIGluZmJhY2suYyAgaW5mZmFzdC5jICBpbmZsYXRlLmMgaW5mdHJlZXMuYyAgICYKLSAgICAgICAgICAgIHRyZWVzLmMgICAgdW5jb21wci5jICB6dXRpbC5jCi0KLU9CSlMgPSAgICAgIGFkbGVyMzIub2JqICBjb21wcmVzcy5vYmogY3JjMzIub2JqICAgZGVmbGF0ZS5vYmogICAgJgotCSAgICBnemNsb3NlLm9iaiAgZ3psaWIub2JqICAgIGd6cmVhZC5vYmogIGd6d3JpdGUub2JqICAgICYKLSAgICAgICAgICAgIGluZmJhY2sub2JqICBpbmZmYXN0Lm9iaiAgaW5mbGF0ZS5vYmogaW5mdHJlZXMub2JqICAgJgotICAgICAgICAgICAgdHJlZXMub2JqICAgIHVuY29tcHIub2JqICB6dXRpbC5vYmoKLQotQ0MgICAgICAgPSB3Y2MKLUxJTktFUiAgID0gd2NsCi1DRkxBR1MgICA9IC16cSAtbWwgLXMgLWJ0PWRvcyAtb2lscnRmbSAtZnI9bnVsIC13eAotWkxJQl9MSUIgPSB6bGliX2wubGliCi0KLS5DLk9CSjoKLSAgICAgICAgJChDQykgJChDRkxBR1MpICRbQAotCi1hbGw6ICQoWkxJQl9MSUIpIGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQotCi0kKFpMSUJfTElCKTogJChPQkpTKQotCXdsaWIgLWIgLWMgJChaTElCX0xJQikgLSthZGxlcjMyLm9iaiAgLStjb21wcmVzcy5vYmogLStjcmMzMi5vYmoKLQl3bGliIC1iIC1jICQoWkxJQl9MSUIpIC0rZ3pjbG9zZS5vYmogIC0rZ3psaWIub2JqICAgIC0rZ3pyZWFkLm9iaiAgIC0rZ3p3cml0ZS5vYmoKLSAgICAgICAgd2xpYiAtYiAtYyAkKFpMSUJfTElCKSAtK2RlZmxhdGUub2JqICAtK2luZmJhY2sub2JqCi0gICAgICAgIHdsaWIgLWIgLWMgJChaTElCX0xJQikgLStpbmZmYXN0Lm9iaiAgLStpbmZsYXRlLm9iaiAgLStpbmZ0cmVlcy5vYmoKLSAgICAgICAgd2xpYiAtYiAtYyAkKFpMSUJfTElCKSAtK3RyZWVzLm9iaiAgICAtK3VuY29tcHIub2JqICAtK3p1dGlsLm9iagotCi1leGFtcGxlLmV4ZTogJChaTElCX0xJQikgZXhhbXBsZS5vYmoKLQkkKExJTktFUikgLWZlPWV4YW1wbGUuZXhlIGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCi0KLW1pbmlnemlwLmV4ZTogJChaTElCX0xJQikgbWluaWd6aXAub2JqCi0JJChMSU5LRVIpIC1mZT1taW5pZ3ppcC5leGUgbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCi0KLWNsZWFuOiAuU1lNQk9MSUMKLSAgICAgICAgICBkZWwgKi5vYmoKLSAgICAgICAgICBkZWwgJChaTElCX0xJQikKLSAgICAgICAgICBAZWNobyBDbGVhbmluZyBkb25lCmRpZmYgLS1naXQgYS9zcmMvemxpYi93aW4zMi9ETExfRkFRLnR4dCBiL3NyYy96bGliL3dpbjMyL0RMTF9GQVEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmMwMDkwLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL3dpbjMyL0RMTF9GQVEudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLQotICAgICAgICAgICAgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMgYWJvdXQgWkxJQjEuRExMCi0KLQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGRlc2lnbiwgdGhlIHJhdGlvbmFsZSwgYW5kIHRoZSB1c2FnZQotb2YgdGhlIG9mZmljaWFsIERMTCBidWlsZCBvZiB6bGliLCBuYW1lZCBaTElCMS5ETEwuICBJZiB5b3UgaGF2ZQotZ2VuZXJhbCBxdWVzdGlvbnMgYWJvdXQgemxpYiwgeW91IHNob3VsZCBzZWUgdGhlIGZpbGUgIkZBUSIgZm91bmQKLWluIHRoZSB6bGliIGRpc3RyaWJ1dGlvbiwgb3IgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLSAgaHR0cDovL3d3dy5nemlwLm9yZy96bGliL3psaWJfZmFxLmh0bWwKLQotCi0gMS4gV2hhdCBpcyBaTElCMS5ETEwsIGFuZCBob3cgY2FuIEkgZ2V0IGl0PwotCi0gIC0gWkxJQjEuRExMIGlzIHRoZSBvZmZpY2lhbCBidWlsZCBvZiB6bGliIGFzIGEgRExMLgotICAgIChQbGVhc2UgcmVtYXJrIHRoZSBjaGFyYWN0ZXIgJzEnIGluIHRoZSBuYW1lLikKLQotICAgIFBvaW50ZXJzIHRvIGEgcHJlY29tcGlsZWQgWkxJQjEuRExMIGNhbiBiZSBmb3VuZCBpbiB0aGUgemxpYgotICAgIHdlYiBzaXRlIGF0OgotICAgICAgaHR0cDovL3d3dy56bGliLm5ldC8KLQotICAgIEFwcGxpY2F0aW9ucyB0aGF0IGxpbmsgdG8gWkxJQjEuRExMIGNhbiByZWx5IG9uIHRoZSBmb2xsb3dpbmcKLSAgICBzcGVjaWZpY2F0aW9uOgotCi0gICAgKiBUaGUgZXhwb3J0ZWQgc3ltYm9scyBhcmUgZXhjbHVzaXZlbHkgZGVmaW5lZCBpbiB0aGUgc291cmNlCi0gICAgICBmaWxlcyAiemxpYi5oIiBhbmQgInpsaWIuZGVmIiwgZm91bmQgaW4gYW4gb2ZmaWNpYWwgemxpYgotICAgICAgc291cmNlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIFRoZSBzeW1ib2xzIGFyZSBleHBvcnRlZCBieSBuYW1lLCBub3QgYnkgb3JkaW5hbC4KLSAgICAqIFRoZSBleHBvcnRlZCBuYW1lcyBhcmUgdW5kZWNvcmF0ZWQuCi0gICAgKiBUaGUgY2FsbGluZyBjb252ZW50aW9uIG9mIGZ1bmN0aW9ucyBpcyAiQyIgKENERUNMKS4KLSAgICAqIFRoZSBaTElCMS5ETEwgYmluYXJ5IGlzIGxpbmtlZCB0byBNU1ZDUlQuRExMLgotCi0gICAgVGhlIGFyY2hpdmUgaW4gd2hpY2ggWkxJQjEuRExMIGlzIGJ1bmRsZWQgY29udGFpbnMgY29tcGlsZWQKLSAgICB0ZXN0IHByb2dyYW1zIHRoYXQgbXVzdCBydW4gd2l0aCBhIHZhbGlkIGJ1aWxkIG9mIFpMSUIxLkRMTC4KLSAgICBJdCBpcyByZWNvbW1lbmRlZCB0byBkb3dubG9hZCB0aGUgcHJlYnVpbHQgRExMIGZyb20gdGhlIHpsaWIKLSAgICB3ZWIgc2l0ZSwgaW5zdGVhZCBvZiBidWlsZGluZyBpdCB5b3Vyc2VsZiwgdG8gYXZvaWQgcG90ZW50aWFsCi0gICAgaW5jb21wYXRpYmlsaXRpZXMgdGhhdCBjb3VsZCBiZSBpbnRyb2R1Y2VkIGJ5IHlvdXIgY29tcGlsZXIKLSAgICBhbmQgYnVpbGQgc2V0dGluZ3MuICBJZiB5b3UgZG8gYnVpbGQgdGhlIERMTCB5b3Vyc2VsZiwgcGxlYXNlCi0gICAgbWFrZSBzdXJlIHRoYXQgaXQgY29tcGxpZXMgd2l0aCBhbGwgdGhlIGFib3ZlIHJlcXVpcmVtZW50cywKLSAgICBhbmQgaXQgcnVucyB3aXRoIHRoZSBwcmVjb21waWxlZCB0ZXN0IHByb2dyYW1zLCBidW5kbGVkIHdpdGgKLSAgICB0aGUgb3JpZ2luYWwgWkxJQjEuRExMIGRpc3RyaWJ1dGlvbi4KLQotICAgIElmLCBmb3IgYW55IHJlYXNvbiwgeW91IG5lZWQgdG8gYnVpbGQgYW4gaW5jb21wYXRpYmxlIERMTCwKLSAgICBwbGVhc2UgdXNlIGEgZGlmZmVyZW50IGZpbGUgbmFtZS4KLQotCi0gMi4gV2h5IGRpZCB5b3UgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBETEwgdG8gWkxJQjEuRExMPwotICAgIFdoYXQgaGFwcGVuZWQgdG8gdGhlIG9sZCBaTElCLkRMTD8KLQotICAtIFRoZSBvbGQgWkxJQi5ETEwsIGJ1aWx0IGZyb20gemxpYi0xLjEuNCBvciBlYXJsaWVyLCByZXF1aXJlZAotICAgIGNvbXBpbGF0aW9uIHNldHRpbmdzIHRoYXQgd2VyZSBpbmNvbXBhdGlibGUgdG8gdGhvc2UgdXNlZCBieQotICAgIGEgc3RhdGljIGJ1aWxkLiAgVGhlIERMTCBzZXR0aW5ncyB3ZXJlIHN1cHBvc2VkIHRvIGJlIGVuYWJsZWQKLSAgICBieSBkZWZpbmluZyB0aGUgbWFjcm8gWkxJQl9ETEwsIGJlZm9yZSBpbmNsdWRpbmcgInpsaWIuaCIuCi0gICAgSW5jb3JyZWN0IGhhbmRsaW5nIG9mIHRoaXMgbWFjcm8gd2FzIHNpbGVudGx5IGFjY2VwdGVkIGF0Ci0gICAgYnVpbGQgdGltZSwgcmVzdWx0aW5nIGluIHR3byBtYWpvciBwcm9ibGVtczoKLQotICAgICogWkxJQl9ETEwgd2FzIG1pc3NpbmcgZnJvbSB0aGUgb2xkIG1ha2VmaWxlLiAgV2hlbiBidWlsZGluZwotICAgICAgdGhlIERMTCwgbm90IGFsbCBwZW9wbGUgYWRkZWQgaXQgdG8gdGhlIGJ1aWxkIG9wdGlvbnMuICBJbgotICAgICAgY29uc2VxdWVuY2UsIGluY29tcGF0aWJsZSBpbmNhcm5hdGlvbnMgb2YgWkxJQi5ETEwgc3RhcnRlZAotICAgICAgdG8gY2lyY3VsYXRlIGFyb3VuZCB0aGUgbmV0LgotCi0gICAgKiBXaGVuIHN3aXRjaGluZyBmcm9tIHVzaW5nIHRoZSBzdGF0aWMgbGlicmFyeSB0byB1c2luZyB0aGUKLSAgICAgIERMTCwgYXBwbGljYXRpb25zIGhhZCB0byBkZWZpbmUgdGhlIFpMSUJfRExMIG1hY3JvIGFuZAotICAgICAgdG8gcmVjb21waWxlIGFsbCB0aGUgc291cmNlcyB0aGF0IGNvbnRhaW5lZCBjYWxscyB0byB6bGliCi0gICAgICBmdW5jdGlvbnMuICBGYWlsdXJlIHRvIGRvIHNvIHJlc3VsdGVkIGluIGNyZWF0aW5nIGJpbmFyaWVzCi0gICAgICB0aGF0IHdlcmUgdW5hYmxlIHRvIHJ1biB3aXRoIHRoZSBvZmZpY2lhbCBaTElCLkRMTCBidWlsZC4KLQotICAgIFRoZSBvbmx5IHBvc3NpYmxlIHNvbHV0aW9uIHRoYXQgd2UgY291bGQgZm9yZXNlZSB3YXMgdG8gbWFrZQotICAgIGEgYmluYXJ5LWluY29tcGF0aWJsZSBjaGFuZ2UgaW4gdGhlIERMTCBpbnRlcmZhY2UsIGluIG9yZGVyIHRvCi0gICAgcmVtb3ZlIHRoZSBkZXBlbmRlbmN5IG9uIHRoZSBaTElCX0RMTCBtYWNybywgYW5kIHRvIHJlbGVhc2UKLSAgICB0aGUgbmV3IERMTCB1bmRlciBhIGRpZmZlcmVudCBuYW1lLgotCi0gICAgV2UgY2hvc2UgdGhlIG5hbWUgWkxJQjEuRExMLCB3aGVyZSAnMScgaW5kaWNhdGVzIHRoZSBtYWpvcgotICAgIHpsaWIgdmVyc2lvbiBudW1iZXIuICBXZSBob3BlIHRoYXQgd2Ugd2lsbCBub3QgaGF2ZSB0byBicmVhawotICAgIHRoZSBiaW5hcnkgY29tcGF0aWJpbGl0eSBhZ2FpbiwgYXQgbGVhc3Qgbm90IGFzIGxvbmcgYXMgdGhlCi0gICAgemxpYi0xLnggc2VyaWVzIHdpbGwgbGFzdC4KLQotICAgIFRoZXJlIGlzIHN0aWxsIGEgWkxJQl9ETEwgbWFjcm8sIHRoYXQgY2FuIHRyaWdnZXIgYSBtb3JlCi0gICAgZWZmaWNpZW50IGJ1aWxkIGFuZCB1c2Ugb2YgdGhlIERMTCwgYnV0IGNvbXBhdGliaWxpdHkgbm8KLSAgICBsb25nZXIgZGVwZW5kZW50cyBvbiBpdC4KLQotCi0gMy4gQ2FuIEkgYnVpbGQgWkxJQi5ETEwgZnJvbSB0aGUgbmV3IHpsaWIgc291cmNlcywgYW5kIHJlcGxhY2UKLSAgICBhbiBvbGQgWkxJQi5ETEwsIHRoYXQgd2FzIGJ1aWx0IGZyb20gemxpYi0xLjEuNCBvciBlYXJsaWVyPwotCi0gIC0gSW4gcHJpbmNpcGxlLCB5b3UgY2FuIGRvIGl0IGJ5IGFzc2lnbmluZyBjYWxsaW5nIGNvbnZlbnRpb24KLSAgICBrZXl3b3JkcyB0byB0aGUgbWFjcm9zIFpFWFBPUlQgYW5kIFpFWFBPUlRWQS4gIEluIHByYWN0aWNlLAotICAgIGl0IGRlcGVuZHMgb24gd2hhdCB5b3UgbWVhbiBieSAiYW4gb2xkIFpMSUIuRExMIiwgYmVjYXVzZSB0aGUKLSAgICBvbGQgRExMIGV4aXN0cyBpbiBzZXZlcmFsIG11dHVhbGx5LWluY29tcGF0aWJsZSB2ZXJzaW9ucy4KLSAgICBZb3UgaGF2ZSB0byBmaW5kIG91dCBmaXJzdCB3aGF0IGtpbmQgb2YgY2FsbGluZyBjb252ZW50aW9uIGlzCi0gICAgYmVpbmcgdXNlZCBpbiB5b3VyIHBhcnRpY3VsYXIgWkxJQi5ETEwgYnVpbGQsIGFuZCB0byB1c2UgdGhlCi0gICAgc2FtZSBvbmUgaW4gdGhlIG5ldyBidWlsZC4gIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdGhpcyBpcyBhbGwKLSAgICBhYm91dCwgeW91IG1pZ2h0IGJlIGJldHRlciBvZmYgaWYgeW91IHdvdWxkIGp1c3QgbGVhdmUgdGhlIG9sZAotICAgIERMTCBpbnRhY3QuCi0KLQotIDQuIENhbiBJIGNvbXBpbGUgbXkgYXBwbGljYXRpb24gdXNpbmcgdGhlIG5ldyB6bGliIGludGVyZmFjZSwgYW5kCi0gICAgbGluayBpdCB0byBhbiBvbGQgWkxJQi5ETEwsIHRoYXQgd2FzIGJ1aWx0IGZyb20gemxpYi0xLjEuNCBvcgotICAgIGVhcmxpZXI/Ci0KLSAgLSBUaGUgb2ZmaWNpYWwgYW5zd2VyIGlzICJubyI7IHRoZSByZWFsIGFuc3dlciBkZXBlbmRzIGFnYWluIG9uCi0gICAgd2hhdCBraW5kIG9mIFpMSUIuRExMIHlvdSBoYXZlLiAgRXZlbiBpZiB5b3UgYXJlIGx1Y2t5LCB0aGlzCi0gICAgY291cnNlIG9mIGFjdGlvbiBpcyB1bnJlbGlhYmxlLgotCi0gICAgSWYgeW91IHJlYnVpbGQgeW91ciBhcHBsaWNhdGlvbiBhbmQgeW91IGludGVuZCB0byB1c2UgYSBuZXdlcgotICAgIHZlcnNpb24gb2YgemxpYiAocG9zdC0gMS4xLjQpLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0bwotICAgIGxpbmsgaXQgdG8gdGhlIG5ldyBaTElCMS5ETEwuCi0KLQotIDUuIFdoeSBhcmUgdGhlIHpsaWIgc3ltYm9scyBleHBvcnRlZCBieSBuYW1lLCBhbmQgbm90IGJ5IG9yZGluYWw/Ci0KLSAgLSBBbHRob3VnaCBleHBvcnRpbmcgc3ltYm9scyBieSBvcmRpbmFsIGlzIGEgbGl0dGxlIGZhc3RlciwgaXQKLSAgICBpcyByaXNreS4gIEFueSBzaW5nbGUgZ2xpdGNoIGluIHRoZSBtYWludGVuYW5jZSBvciB1c2Ugb2YgdGhlCi0gICAgREVGIGZpbGUgdGhhdCBjb250YWlucyB0aGUgb3JkaW5hbHMgY2FuIHJlc3VsdCBpbiBpbmNvbXBhdGlibGUKLSAgICBidWlsZHMgYW5kIGZydXN0cmF0aW5nIGNyYXNoZXMuICBTaW1wbHkgcHV0LCB0aGUgYmVuZWZpdHMgb2YKLSAgICBleHBvcnRpbmcgc3ltYm9scyBieSBvcmRpbmFsIGRvIG5vdCBqdXN0aWZ5IHRoZSByaXNrcy4KLQotICAgIFRlY2huaWNhbGx5LCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gbWFpbnRhaW4gb3JkaW5hbHMgaW4KLSAgICB0aGUgREVGIGZpbGUsIGFuZCBzdGlsbCBleHBvcnQgdGhlIHN5bWJvbHMgYnkgbmFtZS4gIE9yZGluYWxzCi0gICAgZXhpc3QgaW4gZXZlcnkgRExMLCBhbmQgZXZlbiBpZiB0aGUgZHluYW1pYyBsaW5raW5nIHBlcmZvcm1lZAotICAgIGF0IHRoZSBETEwgc3RhcnR1cCBpcyBzZWFyY2hpbmcgZm9yIG5hbWVzLCBvcmRpbmFscyBzZXJ2ZSBhcwotICAgIGhpbnRzLCBmb3IgYSBmYXN0ZXIgbmFtZSBsb29rdXAuICBIb3dldmVyLCBpZiB0aGUgREVGIGZpbGUKLSAgICBjb250YWlucyBvcmRpbmFscywgdGhlIE1pY3Jvc29mdCBsaW5rZXIgYXV0b21hdGljYWxseSBidWlsZHMKLSAgICBhbiBpbXBsaWIgdGhhdCB3aWxsIGNhdXNlIHRoZSBleGVjdXRhYmxlcyBsaW5rZWQgdG8gaXQgdG8gdXNlCi0gICAgdGhvc2Ugb3JkaW5hbHMsIGFuZCBub3QgdGhlIG5hbWVzLiAgSXQgaXMgaW50ZXJlc3RpbmcgdG8KLSAgICBub3RpY2UgdGhhdCB0aGUgR05VIGxpbmtlciBmb3IgV2luMzIgZG9lcyBub3Qgc3VmZmVyIGZyb20gdGhpcwotICAgIHByb2JsZW0uCi0KLSAgICBJdCBpcyBwb3NzaWJsZSB0byBhdm9pZCB0aGUgREVGIGZpbGUgaWYgdGhlIGV4cG9ydGVkIHN5bWJvbHMKLSAgICBhcmUgYWNjb21wYW5pZWQgYnkgYSAiX19kZWNsc3BlYyhkbGxleHBvcnQpIiBhdHRyaWJ1dGUgaW4gdGhlCi0gICAgc291cmNlIGZpbGVzLiAgWW91IGNhbiBkbyB0aGlzIGluIHpsaWIgYnkgcHJlZGVmaW5pbmcgdGhlCi0gICAgWkxJQl9ETEwgbWFjcm8uCi0KLQotIDYuIEkgc2VlIHRoYXQgdGhlIFpMSUIxLkRMTCBmdW5jdGlvbnMgdXNlIHRoZSAiQyIgKENERUNMKSBjYWxsaW5nCi0gICAgY29udmVudGlvbi4gIFdoeSBub3QgdXNlIHRoZSBTVERDQUxMIGNvbnZlbnRpb24/Ci0gICAgU1REQ0FMTCBpcyB0aGUgc3RhbmRhcmQgY29udmVudGlvbiBpbiBXaW4zMiwgYW5kIEkgbmVlZCBpdCBpbgotICAgIG15IFZpc3VhbCBCYXNpYyBwcm9qZWN0IQotCi0gICAgKEZvciByZWFkYWJpbGl0eSwgd2UgdXNlIENERUNMIHRvIHJlZmVyIHRvIHRoZSBjb252ZW50aW9uCi0gICAgIHRyaWdnZXJlZCBieSB0aGUgIl9fY2RlY2wiIGtleXdvcmQsIFNURENBTEwgdG8gcmVmZXIgdG8KLSAgICAgdGhlIGNvbnZlbnRpb24gdHJpZ2dlcmVkIGJ5ICJfX3N0ZGNhbGwiLCBhbmQgRkFTVENBTEwgdG8KLSAgICAgcmVmZXIgdG8gdGhlIGNvbnZlbnRpb24gdHJpZ2dlcmVkIGJ5ICJfX2Zhc3RjYWxsIi4pCi0KLSAgLSBNb3N0IG9mIHRoZSBuYXRpdmUgV2luZG93cyBBUEkgZnVuY3Rpb25zICh3aXRob3V0IHZhcmFyZ3MpIHVzZQotICAgIGluZGVlZCB0aGUgV0lOQVBJIGNvbnZlbnRpb24gKHdoaWNoIHRyYW5zbGF0ZXMgdG8gU1REQ0FMTCBpbgotICAgIFdpbjMyKSwgYnV0IHRoZSBzdGFuZGFyZCBDIGZ1bmN0aW9ucyB1c2UgQ0RFQ0wuICBJZiBhIHVzZXIKLSAgICBhcHBsaWNhdGlvbiBpcyBpbnRyaW5zaWNhbGx5IHRpZWQgdG8gdGhlIFdpbmRvd3MgQVBJIChlLmcuCi0gICAgaXQgY2FsbHMgbmF0aXZlIFdpbmRvd3MgQVBJIGZ1bmN0aW9ucyBzdWNoIGFzIENyZWF0ZUZpbGUoKSksCi0gICAgc29tZXRpbWVzIGl0IG1ha2VzIHNlbnNlIHRvIGRlY29yYXRlIGl0cyBvd24gZnVuY3Rpb25zIHdpdGgKLSAgICBXSU5BUEkuICBCdXQgaWYgQU5TSSBDIG9yIFBPU0lYIHBvcnRhYmlsaXR5IGlzIGEgZ29hbCAoZS5nLgotICAgIGl0IGNhbGxzIHN0YW5kYXJkIEMgZnVuY3Rpb25zIHN1Y2ggYXMgZm9wZW4oKSksIGl0IGlzIG5vdCBhCi0gICAgc291bmQgZGVjaXNpb24gdG8gcmVxdWVzdCB0aGUgaW5jbHVzaW9uIG9mIDx3aW5kb3dzLmg+LCBvciB0bwotICAgIHVzZSBub24tQU5TSSBjb25zdHJ1Y3RzLCBmb3IgdGhlIHNvbGUgcHVycG9zZSB0byBtYWtlIHRoZSB1c2VyCi0gICAgZnVuY3Rpb25zIFNURENBTEwtYWJsZS4KLQotICAgIFRoZSBmdW5jdGlvbmFsaXR5IG9mZmVyZWQgYnkgemxpYiBpcyBub3QgaW4gdGhlIGNhdGVnb3J5IG9mCi0gICAgIldpbmRvd3MgZnVuY3Rpb25hbGl0eSIsIGJ1dCBpcyBtb3JlIGxpa2UgIkMgZnVuY3Rpb25hbGl0eSIuCi0KLSAgICBUZWNobmljYWxseSwgU1REQ0FMTCBpcyBub3QgYmFkOyBpbiBmYWN0LCBpdCBpcyBzbGlnaHRseQotICAgIGZhc3RlciB0aGFuIENERUNMLCBhbmQgaXQgd29ya3Mgd2l0aCB2YXJpYWJsZS1hcmd1bWVudAotICAgIGZ1bmN0aW9ucywganVzdCBsaWtlIENERUNMLiAgSXQgaXMgdW5mb3J0dW5hdGUgdGhhdCwgaW4gc3BpdGUKLSAgICBvZiB1c2luZyBTVERDQUxMIGluIHRoZSBXaW5kb3dzIEFQSSwgaXQgaXMgbm90IHRoZSBkZWZhdWx0Ci0gICAgY29udmVudGlvbiB1c2VkIGJ5IHRoZSBDIGNvbXBpbGVycyB0aGF0IHJ1biB1bmRlciBXaW5kb3dzLgotICAgIFRoZSByb290cyBvZiB0aGUgcHJvYmxlbSByZXNpZGUgZGVlcCBpbnNpZGUgdGhlIHVuc2FmZXR5IG9mCi0gICAgdGhlIEsmUi1zdHlsZSBmdW5jdGlvbiBwcm90b3R5cGVzLCB3aGVyZSB0aGUgYXJndW1lbnQgdHlwZXMKLSAgICBhcmUgbm90IHNwZWNpZmllZDsgYnV0IHRoYXQgaXMgYW5vdGhlciBzdG9yeSBmb3IgYW5vdGhlciBkYXkuCi0KLSAgICBUaGUgcmVtYWluaW5nIGZhY3QgaXMgdGhhdCBDREVDTCBpcyB0aGUgZGVmYXVsdCBjb252ZW50aW9uLgotICAgIEV2ZW4gaWYgYW4gZXhwbGljaXQgY29udmVudGlvbiBpcyBoYXJkLWNvZGVkIGludG8gdGhlIGZ1bmN0aW9uCi0gICAgcHJvdG90eXBlcyBpbnNpZGUgQyBoZWFkZXJzLCBwcm9ibGVtcyBtYXkgYXBwZWFyLiAgVGhlCi0gICAgbmVjZXNzaXR5IHRvIGV4cG9zZSB0aGUgY29udmVudGlvbiBpbiB1c2VycycgY2FsbGJhY2tzIGlzIG9uZQotICAgIG9mIHRoZXNlIHByb2JsZW1zLgotCi0gICAgVGhlIGNhbGxpbmcgY29udmVudGlvbiBpc3N1ZXMgYXJlIGFsc28gaW1wb3J0YW50IHdoZW4gdXNpbmcKLSAgICB6bGliIGluIG90aGVyIHByb2dyYW1taW5nIGxhbmd1YWdlcy4gIFNvbWUgb2YgdGhlbSwgbGlrZSBBZGEKLSAgICAoR05BVCkgYW5kIEZvcnRyYW4gKEdOVSBHNzcpLCBoYXZlIEMgYmluZGluZ3MgaW1wbGVtZW50ZWQKLSAgICBpbml0aWFsbHkgb24gVW5peCwgYW5kIHJlbHlpbmcgb24gdGhlIEMgY2FsbGluZyBjb252ZW50aW9uLgotICAgIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgcHJlLSAuTkVUIHZlcnNpb25zIG9mIE1pY3Jvc29mdCBWaXN1YWwKLSAgICBCYXNpYyByZXF1aXJlIFNURENBTEwsIHdoaWxlIEJvcmxhbmQgRGVscGhpIHByZWZlcnMsIGFsdGhvdWdoCi0gICAgaXQgZG9lcyBub3QgcmVxdWlyZSwgRkFTVENBTEwuCi0KLSAgICBJbiBmYWlybmVzcyB0byBhbGwgcG9zc2libGUgdXNlcyBvZiB6bGliIG91dHNpZGUgdGhlIEMKLSAgICBwcm9ncmFtbWluZyBsYW5ndWFnZSwgd2UgY2hvb3NlIHRoZSBkZWZhdWx0ICJDIiBjb252ZW50aW9uLgotICAgIEFueW9uZSBpbnRlcmVzdGVkIGluIGRpZmZlcmVudCBiaW5kaW5ncyBvciBjb252ZW50aW9ucyBpcwotICAgIGVuY291cmFnZWQgdG8gbWFpbnRhaW4gc3BlY2lhbGl6ZWQgcHJvamVjdHMuICBUaGUgImNvbnRyaWIvIgotICAgIGRpcmVjdG9yeSBmcm9tIHRoZSB6bGliIGRpc3RyaWJ1dGlvbiBhbHJlYWR5IGhvbGRzIGEgY291cGxlCi0gICAgb2YgZm9yZWlnbiBiaW5kaW5ncywgc3VjaCBhcyBBZGEsIEMrKywgYW5kIERlbHBoaS4KLQotCi0gNy4gSSBuZWVkIGEgRExMIGZvciBteSBWaXN1YWwgQmFzaWMgcHJvamVjdC4gIFdoYXQgY2FuIEkgZG8/Ci0KLSAgLSBEZWZpbmUgdGhlIFpMSUJfV0lOQVBJIG1hY3JvIGJlZm9yZSBpbmNsdWRpbmcgInpsaWIuaCIsIHdoZW4KLSAgICBidWlsZGluZyBib3RoIHRoZSBETEwgYW5kIHRoZSB1c2VyIGFwcGxpY2F0aW9uIChleGNlcHQgdGhhdAotICAgIHlvdSBkb24ndCBuZWVkIHRvIGRlZmluZSBhbnl0aGluZyB3aGVuIHVzaW5nIHRoZSBETEwgaW4gVmlzdWFsCi0gICAgQmFzaWMpLiAgVGhlIFpMSUJfV0lOQVBJIG1hY3JvIHdpbGwgc3dpdGNoIG9uIHRoZSBXSU5BUEkKLSAgICAoU1REQ0FMTCkgY29udmVudGlvbi4gIFRoZSBuYW1lIG9mIHRoaXMgRExMIG11c3QgYmUgZGlmZmVyZW50Ci0gICAgdGhhbiB0aGUgb2ZmaWNpYWwgWkxJQjEuRExMLgotCi0gICAgR2lsbGVzIFZvbGxhbnQgaGFzIGNvbnRyaWJ1dGVkIGEgYnVpbGQgbmFtZWQgWkxJQldBUEkuRExMLAotICAgIHdpdGggdGhlIFpMSUJfV0lOQVBJIG1hY3JvIHR1cm5lZCBvbiwgYW5kIHdpdGggdGhlIG1pbml6aXAKLSAgICBmdW5jdGlvbmFsaXR5IGJ1aWx0IGluLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWFkCi0gICAgdGhlIG5vdGVzIGluc2lkZSAiY29udHJpYi92c3R1ZGlvL3JlYWRtZS50eHQiLCBmb3VuZCBpbiB0aGUKLSAgICB6bGliIGRpc3RyaWJ1dGlvbi4KLQotCi0gOC4gSSBuZWVkIHRvIHVzZSB6bGliIGluIG15IE1pY3Jvc29mdCAuTkVUIHByb2plY3QuICBXaGF0IGNhbiBJCi0gICAgZG8/Ci0KLSAgLSBIZW5yaWsgUmF2biBoYXMgY29udHJpYnV0ZWQgYSAuTkVUIHdyYXBwZXIgYXJvdW5kIHpsaWIuICBMb29rCi0gICAgaW50byBjb250cmliL2RvdHpsaWIvLCBpbnNpZGUgdGhlIHpsaWIgZGlzdHJpYnV0aW9uLgotCi0KLSA5LiBJZiBteSBhcHBsaWNhdGlvbiB1c2VzIFpMSUIxLkRMTCwgc2hvdWxkIEkgbGluayBpdCB0bwotICAgIE1TVkNSVC5ETEw/ICBXaHk/Ci0KLSAgLSBJdCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBsaW5rIHlvdXIKLSAgICBhcHBsaWNhdGlvbiB0byBNU1ZDUlQuRExMLCBpZiBpdCB1c2VzIFpMSUIxLkRMTC4KLQotICAgIFRoZSBleGVjdXRhYmxlcyAoLkVYRSwgLkRMTCwgZXRjLikgdGhhdCBhcmUgaW52b2x2ZWQgaW4gdGhlCi0gICAgc2FtZSBwcm9jZXNzIGFuZCBhcmUgdXNpbmcgdGhlIEMgcnVuLXRpbWUgbGlicmFyeSAoaS5lLiB0aGV5Ci0gICAgYXJlIGNhbGxpbmcgc3RhbmRhcmQgQyBmdW5jdGlvbnMpLCBtdXN0IGxpbmsgdG8gdGhlIHNhbWUKLSAgICBsaWJyYXJ5LiAgVGhlcmUgYXJlIHNldmVyYWwgbGlicmFyaWVzIGluIHRoZSBXaW4zMiBzeXN0ZW06Ci0gICAgQ1JURExMLkRMTCwgTVNWQ1JULkRMTCwgdGhlIHN0YXRpYyBDIGxpYnJhcmllcywgZXRjLgotICAgIFNpbmNlIFpMSUIxLkRMTCBpcyBsaW5rZWQgdG8gTVNWQ1JULkRMTCwgdGhlIGV4ZWN1dGFibGVzIHRoYXQKLSAgICBkZXBlbmQgb24gaXQgc2hvdWxkIGFsc28gYmUgbGlua2VkIHRvIE1TVkNSVC5ETEwuCi0KLQotMTAuIFdoeSBhcmUgeW91IHNheWluZyB0aGF0IFpMSUIxLkRMTCBhbmQgbXkgYXBwbGljYXRpb24gc2hvdWxkCi0gICAgYmUgbGlua2VkIHRvIHRoZSBzYW1lIEMgcnVuLXRpbWUgKENSVCkgbGlicmFyeT8gIEkgbGlua2VkIG15Ci0gICAgYXBwbGljYXRpb24gYW5kIG15IERMTHMgdG8gZGlmZmVyZW50IEMgbGlicmFyaWVzIChlLmcuIG15Ci0gICAgYXBwbGljYXRpb24gdG8gYSBzdGF0aWMgbGlicmFyeSwgYW5kIG15IERMTHMgdG8gTVNWQ1JULkRMTCksCi0gICAgYW5kIGV2ZXJ5dGhpbmcgd29ya3MgZmluZS4KLQotICAtIElmIGEgdXNlciBsaWJyYXJ5IGludm9rZXMgb25seSBwdXJlIFdpbjMyIEFQSSAoYWNjZXNzaWJsZSB2aWEKLSAgICA8d2luZG93cy5oPiBhbmQgdGhlIHJlbGF0ZWQgaGVhZGVycyksIGl0cyBETEwgYnVpbGQgd2lsbCB3b3JrCi0gICAgaW4gYW55IGNvbnRleHQuICBCdXQgaWYgdGhpcyBsaWJyYXJ5IGludm9rZXMgc3RhbmRhcmQgQyBBUEksCi0gICAgdGhpbmdzIGdldCBtb3JlIGNvbXBsaWNhdGVkLgotCi0gICAgVGhlcmUgaXMgYSBzaW5nbGUgV2luMzIgbGlicmFyeSBpbiBhIFdpbjMyIHN5c3RlbS4gIEV2ZXJ5Ci0gICAgZnVuY3Rpb24gaW4gdGhpcyBsaWJyYXJ5IHJlc2lkZXMgaW4gYSBzaW5nbGUgRExMIG1vZHVsZSwgdGhhdAotICAgIGlzIHNhZmUgdG8gY2FsbCBmcm9tIGFueXdoZXJlLiAgT24gdGhlIG90aGVyIGhhbmQsIHRoZXJlIGFyZQotICAgIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBDIGxpYnJhcnksIGFuZCBlYWNoIG9mIHRoZW0gaGFzIGl0cwotICAgIG93biBzZXBhcmF0ZSBpbnRlcm5hbCBzdGF0ZS4gIFN0YW5kYWxvbmUgZXhlY3V0YWJsZXMgYW5kIHVzZXIKLSAgICBETExzIHRoYXQgY2FsbCBzdGFuZGFyZCBDIGZ1bmN0aW9ucyBtdXN0IGxpbmsgdG8gYSBDIHJ1bi10aW1lCi0gICAgKENSVCkgbGlicmFyeSwgYmUgaXQgc3RhdGljIG9yIHNoYXJlZCAoRExMKS4gIEludGVybWl4aW5nCi0gICAgb2NjdXJzIHdoZW4gYW4gZXhlY3V0YWJsZSAobm90IG5lY2Vzc2FyaWx5IHN0YW5kYWxvbmUpIGFuZCBhCi0gICAgRExMIGFyZSBsaW5rZWQgdG8gZGlmZmVyZW50IENSVHMsIGFuZCBib3RoIGFyZSBydW5uaW5nIGluIHRoZQotICAgIHNhbWUgcHJvY2Vzcy4KLQotICAgIEludGVybWl4aW5nIG11bHRpcGxlIENSVHMgaXMgcG9zc2libGUsIGFzIGxvbmcgYXMgdGhlaXIKLSAgICBpbnRlcm5hbCBzdGF0ZXMgYXJlIGtlcHQgaW50YWN0LiAgVGhlIE1pY3Jvc29mdCBLbm93bGVkZ2UgQmFzZQotICAgIGFydGljbGVzIEtCOTQyNDggIkhPV1RPOiBVc2UgdGhlIEMgUnVuLVRpbWUiIGFuZCBLQjE0MDU4NAotICAgICJIT1dUTzogTGluayB3aXRoIHRoZSBDb3JyZWN0IEMgUnVuLVRpbWUgKENSVCkgTGlicmFyeSIKLSAgICBtZW50aW9uIHRoZSBwb3RlbnRpYWwgcHJvYmxlbXMgcmFpc2VkIGJ5IGludGVybWl4aW5nLgotCi0gICAgSWYgaW50ZXJtaXhpbmcgd29ya3MgZm9yIHlvdSwgaXQncyBiZWNhdXNlIHlvdXIgYXBwbGljYXRpb24KLSAgICBhbmQgRExMcyBhcmUgYXZvaWRpbmcgdGhlIGNvcnJ1cHRpb24gb2YgZWFjaCBvZiB0aGUgQ1JUcycKLSAgICBpbnRlcm5hbCBzdGF0ZXMsIG1heWJlIGJ5IGNhcmVmdWwgZGVzaWduLCBvciBtYXliZSBieSBmb3J0dW5lLgotCi0gICAgQWxzbyBub3RlIHRoYXQgbGlua2luZyBaTElCMS5ETEwgdG8gbm9uLU1pY3Jvc29mdCBDUlRzLCBzdWNoCi0gICAgYXMgdGhvc2UgcHJvdmlkZWQgYnkgQm9ybGFuZCwgcmFpc2VzIHNpbWlsYXIgcHJvYmxlbXMuCi0KLQotMTEuIFdoeSBhcmUgeW91IGxpbmtpbmcgWkxJQjEuRExMIHRvIE1TVkNSVC5ETEw/Ci0KLSAgLSBNU1ZDUlQuRExMIGV4aXN0cyBvbiBldmVyeSBXaW5kb3dzIDk1IHdpdGggYSBuZXcgc2VydmljZSBwYWNrCi0gICAgaW5zdGFsbGVkLCBvciB3aXRoIE1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciA0IG9yIGxhdGVyLCBhbmQKLSAgICBvbiBhbGwgb3RoZXIgV2luZG93cyA0Lnggb3IgbGF0ZXIgKFdpbmRvd3MgOTgsIFdpbmRvd3MgTlQgNCwKLSAgICBvciBsYXRlcikuICBJdCBpcyBmcmVlbHkgZGlzdHJpYnV0YWJsZTsgaWYgbm90IHByZXNlbnQgaW4gdGhlCi0gICAgc3lzdGVtLCBpdCBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIE1pY3Jvc29mdCBvciBmcm9tIG90aGVyCi0gICAgc29mdHdhcmUgcHJvdmlkZXIgZm9yIGZyZWUuCi0KLSAgICBUaGUgZmFjdCB0aGF0IE1TVkNSVC5ETEwgZG9lcyBub3QgZXhpc3Qgb24gYSB2aXJnaW4gV2luZG93cyA5NQotICAgIGlzIG5vdCBzbyBwcm9ibGVtYXRpYy4gIFdpbmRvd3MgOTUgaXMgc2NhcmNlbHkgZm91bmQgbm93YWRheXMsCi0gICAgTWljcm9zb2Z0IGVuZGVkIGl0cyBzdXBwb3J0IGEgbG9uZyB0aW1lIGFnbywgYW5kIG1hbnkgcmVjZW50Ci0gICAgYXBwbGljYXRpb25zIGZyb20gdmFyaW91cyB2ZW5kb3JzLCBpbmNsdWRpbmcgTWljcm9zb2Z0LCBkbyBub3QKLSAgICBldmVuIHJ1biBvbiBpdC4gIEZ1cnRoZXJtb3JlLCBubyBzZXJpb3VzIHVzZXIgc2hvdWxkIHJ1bgotICAgIFdpbmRvd3MgOTUgd2l0aG91dCBhIHByb3BlciB1cGRhdGUgaW5zdGFsbGVkLgotCi0KLTEyLiBXaHkgYXJlIHlvdSBub3QgbGlua2luZyBaTElCMS5ETEwgdG8KLSAgICA8PG15IGZhdm9yaXRlIEMgcnVuLXRpbWUgbGlicmFyeT4+ID8KLQotICAtIFdlIGNvbnNpZGVyZWQgYW5kIGFiYW5kb25lZCB0aGUgZm9sbG93aW5nIGFsdGVybmF0aXZlczoKLQotICAgICogTGlua2luZyBaTElCMS5ETEwgdG8gYSBzdGF0aWMgQyBsaWJyYXJ5IChMSUJDLkxJQiwgb3IKLSAgICAgIExJQkNNVC5MSUIpIGlzIG5vdCBhIGdvb2Qgb3B0aW9uLiAgUGVvcGxlIGFyZSB1c2luZyB0aGUgRExMCi0gICAgICBtYWlubHkgdG8gc2F2ZSBkaXNrIHNwYWNlLiAgSWYgeW91IGFyZSBsaW5raW5nIHlvdXIgcHJvZ3JhbQotICAgICAgdG8gYSBzdGF0aWMgQyBsaWJyYXJ5LCB5b3UgbWF5IGFzIHdlbGwgY29uc2lkZXIgbGlua2luZyB6bGliCi0gICAgICBpbiBzdGF0aWNhbGx5LCB0b28uCi0KLSAgICAqIExpbmtpbmcgWkxJQjEuRExMIHRvIENSVERMTC5ETEwgbG9va3MgYXBwZWFsaW5nLCBiZWNhdXNlCi0gICAgICBDUlRETEwuRExMIGlzIHByZXNlbnQgb24gZXZlcnkgV2luMzIgaW5zdGFsbGF0aW9uLgotICAgICAgVW5mb3J0dW5hdGVseSwgaXQgaGFzIGEgc2VyaWVzIG9mIHByb2JsZW1zOiBpdCBkb2VzIG5vdAotICAgICAgd29yayBwcm9wZXJseSB3aXRoIE1pY3Jvc29mdCdzIEMrKyBsaWJyYXJpZXMsIGl0IGRvZXMgbm90Ci0gICAgICBwcm92aWRlIHN1cHBvcnQgZm9yIDY0LWJpdCBmaWxlIG9mZnNldHMsIChhbmQgc28gb24uLi4pLAotICAgICAgYW5kIE1pY3Jvc29mdCBkaXNjb250aW51ZWQgaXRzIHN1cHBvcnQgYSBsb25nIHRpbWUgYWdvLgotCi0gICAgKiBMaW5raW5nIFpMSUIxLkRMTCB0byBNU1ZDUjcwLkRMTCBvciBNU1ZDUjcxLkRMTCwgc3VwcGxpZWQKLSAgICAgIHdpdGggdGhlIE1pY3Jvc29mdCAuTkVUIHBsYXRmb3JtLCBhbmQgVmlzdWFsIEMrKyA3LjAvNy4xLAotICAgICAgcmFpc2VzIHByb2JsZW1zIHJlbGF0ZWQgdG8gdGhlIHN0YXR1cyBvZiBaTElCMS5ETEwgYXMgYQotICAgICAgc3lzdGVtIGNvbXBvbmVudC4gIEFjY29yZGluZyB0byB0aGUgTWljcm9zb2Z0IEtub3dsZWRnZSBCYXNlCi0gICAgICBhcnRpY2xlIEtCMzI2OTIyICJJTkZPOiBSZWRpc3RyaWJ1dGlvbiBvZiB0aGUgU2hhcmVkIEMKLSAgICAgIFJ1bnRpbWUgQ29tcG9uZW50IGluIFZpc3VhbCBDKysgLk5FVCIsIE1TVkNSNzAuRExMIGFuZAotICAgICAgTVNWQ1I3MS5ETEwgYXJlIG5vdCBzdXBwb3NlZCB0byBmdW5jdGlvbiBhcyBzeXN0ZW0gRExMcywKLSAgICAgIGJlY2F1c2UgdGhleSBtYXkgY2xhc2ggd2l0aCBNU1ZDUlQuRExMLiAgSW5zdGVhZCwgdGhlCi0gICAgICBhcHBsaWNhdGlvbidzIGluc3RhbGxlciBpcyBzdXBwb3NlZCB0byBwdXQgdGhlc2UgRExMcwotICAgICAgKGlmIG5lZWRlZCkgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgcHJpdmF0ZSBkaXJlY3RvcnkuCi0gICAgICBJZiBaTElCMS5ETEwgZGVwZW5kcyBvbiBhIG5vbi1zeXN0ZW0gcnVudGltZSwgaXQgY2Fubm90Ci0gICAgICBmdW5jdGlvbiBhcyBhIHJlZGlzdHJpYnV0YWJsZSBzeXN0ZW0gY29tcG9uZW50LgotCi0gICAgKiBMaW5raW5nIFpMSUIxLkRMTCB0byBub24tTWljcm9zb2Z0IHJ1bnRpbWVzLCBzdWNoIGFzCi0gICAgICBCb3JsYW5kJ3MsIG9yIEN5Z3dpbidzLCByYWlzZXMgcHJvYmxlbXMgcmVsYXRlZCB0byB0aGUKLSAgICAgIHJlbGlhYmxlIHByZXNlbmNlIG9mIHRoZXNlIHJ1bnRpbWVzIG9uIFdpbjMyIHN5c3RlbXMuCi0gICAgICBJdCdzIGVhc2llciB0byBsZXQgdGhlIERMTCBidWlsZCBvZiB6bGliIHVwIHRvIHRoZSBwZW9wbGUKLSAgICAgIHdobyBkaXN0cmlidXRlIHRoZXNlIHJ1bnRpbWVzLCBhbmQgd2hvIG1heSBwcm9jZWVkIGFzCi0gICAgICBleHBsYWluZWQgaW4gdGhlIGFuc3dlciB0byBRdWVzdGlvbiAxNC4KLQotCi0xMy4gSWYgWkxJQjEuRExMIGNhbm5vdCBiZSBsaW5rZWQgdG8gTVNWQ1I3MC5ETEwgb3IgTVNWQ1I3MS5ETEwsCi0gICAgaG93IGNhbiBJIGJ1aWxkL3VzZSBaTElCMS5ETEwgaW4gTWljcm9zb2Z0IFZpc3VhbCBDKysgNy4wCi0gICAgKFZpc3VhbCBTdHVkaW8gLk5FVCkgb3IgbmV3ZXI/Ci0KLSAgLSBEdWUgdG8gdGhlIHByb2JsZW1zIGV4cGxhaW5lZCBpbiB0aGUgTWljcm9zb2Z0IEtub3dsZWRnZSBCYXNlCi0gICAgYXJ0aWNsZSBLQjMyNjkyMiAoc2VlIHRoZSBwcmV2aW91cyBhbnN3ZXIpLCB0aGUgQyBydW50aW1lIHRoYXQKLSAgICBjb21lcyB3aXRoIHRoZSBWQzcgZW52aXJvbm1lbnQgaXMgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgYQotICAgIHN5c3RlbSBjb21wb25lbnQuICBUaGF0IGlzLCBpdCBzaG91bGQgbm90IGJlIGFzc3VtZWQgdGhhdCB0aGlzCi0gICAgcnVudGltZSBleGlzdHMsIG9yIG1heSBiZSBpbnN0YWxsZWQgaW4gYSBzeXN0ZW0gZGlyZWN0b3J5LgotICAgIFNpbmNlIFpMSUIxLkRMTCBpcyBzdXBwb3NlZCB0byBiZSBhIHN5c3RlbSBjb21wb25lbnQsIGl0IG1heQotICAgIG5vdCBkZXBlbmQgb24gYSBub24tc3lzdGVtIGNvbXBvbmVudC4KLQotICAgIEluIG9yZGVyIHRvIGxpbmsgWkxJQjEuRExMIGFuZCB5b3VyIGFwcGxpY2F0aW9uIHRvIE1TVkNSVC5ETEwKLSAgICBpbiBWQzcsIHlvdSBuZWVkIHRoZSBsaWJyYXJ5IG9mIFZpc3VhbCBDKysgNi4wIG9yIG9sZGVyLiAgSWYKLSAgICB5b3UgZG9uJ3QgaGF2ZSB0aGlzIGxpYnJhcnkgYXQgaGFuZCwgaXQncyBwcm9iYWJseSBiZXN0IG5vdCB0bwotICAgIHVzZSBaTElCMS5ETEwuCi0KLSAgICBXZSBhcmUgaG9waW5nIHRoYXQsIGluIHRoZSBmdXR1cmUsIE1pY3Jvc29mdCB3aWxsIHByb3ZpZGUgYQotICAgIHdheSB0byBidWlsZCBhcHBsaWNhdGlvbnMgbGlua2VkIHRvIGEgcHJvcGVyIHN5c3RlbSBydW50aW1lLAotICAgIGZyb20gdGhlIFZpc3VhbCBDKysgZW52aXJvbm1lbnQuICBVbnRpbCB0aGVuLCB5b3UgaGF2ZSBhCi0gICAgY291cGxlIG9mIGFsdGVybmF0aXZlcywgc3VjaCBhcyBsaW5raW5nIHpsaWIgaW4gc3RhdGljYWxseS4KLSAgICBJZiB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVzIGR5bmFtaWMgbGlua2luZywgeW91IG1heSBwcm9jZWVkCi0gICAgYXMgZXhwbGFpbmVkIGluIHRoZSBhbnN3ZXIgdG8gUXVlc3Rpb24gMTQuCi0KLQotMTQuIEkgbmVlZCB0byBsaW5rIG15IG93biBETEwgYnVpbGQgdG8gYSBDUlQgZGlmZmVyZW50IHRoYW4KLSAgICBNU1ZDUlQuRExMLiAgV2hhdCBjYW4gSSBkbz8KLQotICAtIEZlZWwgZnJlZSB0byByZWJ1aWxkIHRoZSBETEwgZnJvbSB0aGUgemxpYiBzb3VyY2VzLCBhbmQgbGluawotICAgIGl0IHRoZSB3YXkgeW91IHdhbnQuICBZb3Ugc2hvdWxkLCBob3dldmVyLCBjbGVhcmx5IHN0YXRlIHRoYXQKLSAgICB5b3VyIGJ1aWxkIGlzIHVub2ZmaWNpYWwuICBZb3Ugc2hvdWxkIGdpdmUgaXQgYSBkaWZmZXJlbnQgZmlsZQotICAgIG5hbWUsIGFuZC9vciBpbnN0YWxsIGl0IGluIGEgcHJpdmF0ZSBkaXJlY3RvcnkgdGhhdCBjYW4gYmUKLSAgICBhY2Nlc3NlZCBieSB5b3VyIGFwcGxpY2F0aW9uIG9ubHksIGFuZCBpcyBub3QgdmlzaWJsZSB0byB0aGUKLSAgICBvdGhlcnMgKGkuZS4gaXQncyBuZWl0aGVyIGluIHRoZSBQQVRILCBub3IgaW4gdGhlIFNZU1RFTSBvcgotICAgIFNZU1RFTTMyIGRpcmVjdG9yaWVzKS4gIE90aGVyd2lzZSwgeW91ciBidWlsZCBtYXkgY2xhc2ggd2l0aAotICAgIGFwcGxpY2F0aW9ucyB0aGF0IGxpbmsgdG8gdGhlIG9mZmljaWFsIGJ1aWxkLgotCi0gICAgRm9yIGV4YW1wbGUsIGluIEN5Z3dpbiwgemxpYiBpcyBsaW5rZWQgdG8gdGhlIEN5Z3dpbiBydW50aW1lCi0gICAgQ1lHV0lOMS5ETEwsIGFuZCBpdCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgbmFtZSBDWUdaLkRMTC4KLQotCi0xNS4gTWF5IEkgaW5jbHVkZSBhZGRpdGlvbmFsIHBpZWNlcyBvZiBjb2RlIHRoYXQgSSBmaW5kIHVzZWZ1bCwKLSAgICBsaW5rIHRoZW0gaW4gWkxJQjEuRExMLCBhbmQgZXhwb3J0IHRoZW0/Ci0KLSAgLSBOby4gIEEgbGVnaXRpbWF0ZSBidWlsZCBvZiBaTElCMS5ETEwgbXVzdCBub3QgaW5jbHVkZSBjb2RlCi0gICAgdGhhdCBkb2VzIG5vdCBvcmlnaW5hdGUgZnJvbSB0aGUgb2ZmaWNpYWwgemxpYiBzb3VyY2UgY29kZS4KLSAgICBCdXQgeW91IGNhbiBtYWtlIHlvdXIgb3duIHByaXZhdGUgRExMIGJ1aWxkLCB1bmRlciBhIGRpZmZlcmVudAotICAgIGZpbGUgbmFtZSwgYXMgc3VnZ2VzdGVkIGluIHRoZSBwcmV2aW91cyBhbnN3ZXIuCi0KLSAgICBGb3IgZXhhbXBsZSwgemxpYiBpcyBhIHBhcnQgb2YgdGhlIFZDTCBsaWJyYXJ5LCBkaXN0cmlidXRlZAotICAgIHdpdGggQm9ybGFuZCBEZWxwaGkgYW5kIEMrKyBCdWlsZGVyLiAgVGhlIERMTCBidWlsZCBvZiBWQ0wKLSAgICBpcyBhIHJlZGlzdHJpYnV0YWJsZSBmaWxlLCBuYW1lZCBWQ0x4eC5ETEwuCi0KLQotMTYuIE1heSBJIHJlbW92ZSBzb21lIGZ1bmN0aW9uYWxpdHkgb3V0IG9mIFpMSUIxLkRMTCwgYnkgZW5hYmxpbmcKLSAgICBtYWNyb3MgbGlrZSBOT19HWkNPTVBSRVNTIG9yIE5PX0daSVAgYXQgY29tcGlsZSB0aW1lPwotCi0gIC0gTm8uICBBIGxlZ2l0aW1hdGUgYnVpbGQgb2YgWkxJQjEuRExMIG11c3QgcHJvdmlkZSB0aGUgY29tcGxldGUKLSAgICB6bGliIGZ1bmN0aW9uYWxpdHksIGFzIGltcGxlbWVudGVkIGluIHRoZSBvZmZpY2lhbCB6bGliIHNvdXJjZQotICAgIGNvZGUuICBCdXQgeW91IGNhbiBtYWtlIHlvdXIgb3duIHByaXZhdGUgRExMIGJ1aWxkLCB1bmRlciBhCi0gICAgZGlmZmVyZW50IGZpbGUgbmFtZSwgYXMgc3VnZ2VzdGVkIGluIHRoZSBwcmV2aW91cyBhbnN3ZXIuCi0KLQotMTcuIEkgbWFkZSBteSBvd24gWkxJQjEuRExMIGJ1aWxkLiAgQ2FuIEkgdGVzdCBpdCBmb3IgY29tcGxpYW5jZT8KLQotICAtIFdlIHByZWZlciB0aGF0IHlvdSBkb3dubG9hZCB0aGUgb2ZmaWNpYWwgRExMIGZyb20gdGhlIHpsaWIKLSAgICB3ZWIgc2l0ZS4gIElmIHlvdSBuZWVkIHNvbWV0aGluZyBwZWN1bGlhciBmcm9tIHRoaXMgRExMLCB5b3UKLSAgICBjYW4gc2VuZCB5b3VyIHN1Z2dlc3Rpb24gdG8gdGhlIHpsaWIgbWFpbGluZyBsaXN0LgotCi0gICAgSG93ZXZlciwgaW4gY2FzZSB5b3UgZG8gcmVidWlsZCB0aGUgRExMIHlvdXJzZWxmLCB5b3UgY2FuIHJ1bgotICAgIGl0IHdpdGggdGhlIHRlc3QgcHJvZ3JhbXMgZm91bmQgaW4gdGhlIERMTCBkaXN0cmlidXRpb24uCi0gICAgUnVubmluZyB0aGVzZSB0ZXN0IHByb2dyYW1zIGlzIG5vdCBhIGd1YXJhbnRlZSBvZiBjb21wbGlhbmNlLAotICAgIGJ1dCBhIGZhaWx1cmUgY2FuIGltcGx5IGEgZGV0ZWN0ZWQgcHJvYmxlbS4KLQotKioKLQotVGhpcyBkb2N1bWVudCBpcyB3cml0dGVuIGFuZCBtYWludGFpbmVkIGJ5Ci1Db3NtaW4gVHJ1dGEgPGNvc21pbnRAY3MudWJiY2x1ai5ybz4KZGlmZiAtLWdpdCBhL3NyYy96bGliL3dpbjMyL01ha2VmaWxlLmJvciBiL3NyYy96bGliL3dpbjMyL01ha2VmaWxlLmJvcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1MmJiYi4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi93aW4zMi9NYWtlZmlsZS5ib3IKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgemxpYgotIyBCb3JsYW5kIEMrKyBmb3IgV2luMzIKLSMKLSMgVXNhZ2U6Ci0jICBtYWtlIC1mIHdpbjMyL01ha2VmaWxlLmJvcgotIyAgbWFrZSAtZiB3aW4zMi9NYWtlZmlsZS5ib3IgTE9DQUxfWkxJQj0tREFTTVYgT0JKQT1tYXRjaC5vYmogT0JKUEE9K21hdGNoLm9iagotCi0jIC0tLS0tLS0tLS0tLSBCb3JsYW5kIEMrKyAtLS0tLS0tLS0tLS0KLQotIyBPcHRpb25hbCBub25zdGFuZGFyZCBwcmVwcm9jZXNzb3IgZmxhZ3MgKGUuZy4gLURNQVhfTUVNX0xFVkVMPTcpCi0jIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQgdmlhICJzZXQgTE9DQUxfWkxJQj0tREZPTyIgb3IKLSMgYWRkZWQgdG8gdGhlIGRlY2xhcmF0aW9uIG9mIExPQyBoZXJlOgotTE9DID0gJChMT0NBTF9aTElCKQotCi1DQyA9IGJjYzMyCi1BUyA9IGJjYzMyCi1MRCA9IGJjYzMyCi1BUiA9IHRsaWIKLUNGTEFHUyAgPSAtYSAtZCAtay0gLU8yICQoTE9DKQotQVNGTEFHUyA9ICQoTE9DKQotTERGTEFHUyA9ICQoTE9DKQotCi0KLSMgdmFyaWFibGVzCi1aTElCX0xJQiA9IHpsaWIubGliCi0KLU9CSjEgPSBhZGxlcjMyLm9iaiBjb21wcmVzcy5vYmogY3JjMzIub2JqIGRlZmxhdGUub2JqIGd6Y2xvc2Uub2JqIGd6bGliLm9iaiBnenJlYWQub2JqCi1PQkoyID0gZ3p3cml0ZS5vYmogaW5mYmFjay5vYmogaW5mZmFzdC5vYmogaW5mbGF0ZS5vYmogaW5mdHJlZXMub2JqIHRyZWVzLm9iaiB1bmNvbXByLm9iaiB6dXRpbC5vYmoKLSNPQkpBID0KLU9CSlAxID0gK2FkbGVyMzIub2JqK2NvbXByZXNzLm9iaitjcmMzMi5vYmorZGVmbGF0ZS5vYmorZ3pjbG9zZS5vYmorZ3psaWIub2JqK2d6cmVhZC5vYmoKLU9CSlAyID0gK2d6d3JpdGUub2JqK2luZmJhY2sub2JqK2luZmZhc3Qub2JqK2luZmxhdGUub2JqK2luZnRyZWVzLm9iait0cmVlcy5vYmordW5jb21wci5vYmorenV0aWwub2JqCi0jT0JKUEE9Ci0KLQotIyB0YXJnZXRzCi1hbGw6ICQoWkxJQl9MSUIpIGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQotCi0uYy5vYmo6Ci0JJChDQykgLWMgJChDRkxBR1MpICQ8Ci0KLS5hc20ub2JqOgotCSQoQVMpIC1jICQoQVNGTEFHUykgJDwKLQotYWRsZXIzMi5vYmo6IGFkbGVyMzIuYyB6bGliLmggemNvbmYuaAotCi1jb21wcmVzcy5vYmo6IGNvbXByZXNzLmMgemxpYi5oIHpjb25mLmgKLQotY3JjMzIub2JqOiBjcmMzMi5jIHpsaWIuaCB6Y29uZi5oIGNyYzMyLmgKLQotZGVmbGF0ZS5vYmo6IGRlZmxhdGUuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotCi1nemNsb3NlLm9iajogZ3pjbG9zZS5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCi0KLWd6bGliLm9iajogZ3psaWIuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAotCi1nenJlYWQub2JqOiBnenJlYWQuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAotCi1nendyaXRlLm9iajogZ3p3cml0ZS5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCi0KLWluZmJhY2sub2JqOiBpbmZiYWNrLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCi0gaW5mZmFzdC5oIGluZmZpeGVkLmgKLQotaW5mZmFzdC5vYmo6IGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKLSBpbmZmYXN0LmgKLQotaW5mbGF0ZS5vYmo6IGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKLSBpbmZmYXN0LmggaW5mZml4ZWQuaAotCi1pbmZ0cmVlcy5vYmo6IGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCi0KLXRyZWVzLm9iajogdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGRlZmxhdGUuaCB0cmVlcy5oCi0KLXVuY29tcHIub2JqOiB1bmNvbXByLmMgemxpYi5oIHpjb25mLmgKLQotenV0aWwub2JqOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLQotZXhhbXBsZS5vYmo6IHRlc3QvZXhhbXBsZS5jIHpsaWIuaCB6Y29uZi5oCi0KLW1pbmlnemlwLm9iajogdGVzdC9taW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCi0KLQotIyBGb3IgdGhlIHNha2Ugb2YgdGhlIG9sZCBCb3JsYW5kIG1ha2UsCi0jIHRoZSBjb21tYW5kIGxpbmUgaXMgY3V0IHRvIGZpdCBpbiB0aGUgTVMtRE9TIDEyOCBieXRlIGxpbWl0OgotJChaTElCX0xJQik6ICQoT0JKMSkgJChPQkoyKSAkKE9CSkEpCi0JLWRlbCAkKFpMSUJfTElCKQotCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUDEpCi0JJChBUikgJChaTElCX0xJQikgJChPQkpQMikKLQkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlBBKQotCi0KLSMgdGVzdGluZwotdGVzdDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCi0JZXhhbXBsZQotCWVjaG8gaGVsbG8gd29ybGQgfCBtaW5pZ3ppcCB8IG1pbmlnemlwIC1kCi0KLWV4YW1wbGUuZXhlOiBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQotCSQoTEQpICQoTERGTEFHUykgZXhhbXBsZS5vYmogJChaTElCX0xJQikKLQotbWluaWd6aXAuZXhlOiBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKLQkkKExEKSAkKExERkxBR1MpIG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQotCi0KLSMgY2xlYW51cAotY2xlYW46Ci0JLWRlbCAkKFpMSUJfTElCKQotCS1kZWwgKi5vYmoKLQktZGVsICouZXhlCi0JLWRlbCAqLnRkcwotCS1kZWwgemxpYi5iYWsKLQktZGVsIGZvby5negpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvd2luMzIvTWFrZWZpbGUuZ2NjIGIvc3JjL3psaWIvd2luMzIvTWFrZWZpbGUuZ2NjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDFkZWQ2Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL3dpbjMyL01ha2VmaWxlLmdjYworKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0jIE1ha2VmaWxlIGZvciB6bGliLCBkZXJpdmVkIGZyb20gTWFrZWZpbGUuZGoyLgotIyBNb2RpZmllZCBmb3IgbWluZ3czMiBieSBDLiBTcGllbGVyLCA2LzE2Lzk4LgotIyBVcGRhdGVkIGZvciB6bGliIDEuMi54IGJ5IENocmlzdGlhbiBTcGllbGVyIGFuZCBDb3NtaW4gVHJ1dGEsIE1hci0yMDAzLgotIyBMYXN0IHVwZGF0ZWQ6IE1hciAyMDEyLgotIyBUZXN0ZWQgdW5kZXIgQ3lnd2luIGFuZCBNaW5HVy4KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBKZWFuLWxvdXAgR2FpbGx5LgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0KLSMgVG8gY29tcGlsZSwgb3IgdG8gY29tcGlsZSBhbmQgdGVzdCwgdHlwZSBmcm9tIHRoZSB0b3AgbGV2ZWwgemxpYiBkaXJlY3Rvcnk6Ci0jCi0jICAgbWFrZSAtZndpbjMyL01ha2VmaWxlLmdjYzsgIG1ha2UgdGVzdCB0ZXN0ZGxsIC1md2luMzIvTWFrZWZpbGUuZ2NjCi0jCi0jIFRvIHVzZSB0aGUgYXNtIGNvZGUsIHR5cGU6Ci0jICAgY3AgY29udHJpYi9hc20/ODYvbWF0Y2guUyAuL21hdGNoLlMKLSMgICBtYWtlIExPQz0tREFTTVYgT0JKQT1tYXRjaC5vIC1md2luMzIvTWFrZWZpbGUuZ2NjCi0jCi0jIFRvIGluc3RhbGwgbGliei5hLCB6Y29uZi5oIGFuZCB6bGliLmggaW4gdGhlIHN5c3RlbSBkaXJlY3RvcmllcywgdHlwZToKLSMKLSMgICBtYWtlIGluc3RhbGwgLWZ3aW4zMi9NYWtlZmlsZS5nY2MKLSMKLSMgQklOQVJZX1BBVEgsIElOQ0xVREVfUEFUSCBhbmQgTElCUkFSWV9QQVRIIG11c3QgYmUgc2V0LgotIwotIyBUbyBpbnN0YWxsIHRoZSBzaGFyZWQgbGliLCBhcHBlbmQgU0hBUkVEX01PREU9MSB0byB0aGUgbWFrZSBjb21tYW5kIDoKLSMKLSMgICBtYWtlIGluc3RhbGwgLWZ3aW4zMi9NYWtlZmlsZS5nY2MgU0hBUkVEX01PREU9MQotCi0jIE5vdGU6Ci0jIElmIHRoZSBwbGF0Zm9ybSBpcyAqbm90KiBNaW5HVyAoZS5nLiBpdCBpcyBDeWd3aW4gb3IgVVdJTiksCi0jIHRoZSBETEwgbmFtZSBzaG91bGQgYmUgY2hhbmdlZCBmcm9tICJ6bGliMS5kbGwiLgotCi1TVEFUSUNMSUIgPSBsaWJ6LmEKLVNIQVJFRExJQiA9IHpsaWIxLmRsbAotSU1QTElCICAgID0gbGliei5kbGwuYQotCi0jCi0jIFNldCB0byAxIGlmIHNoYXJlZCBvYmplY3QgbmVlZHMgdG8gYmUgaW5zdGFsbGVkCi0jCi1TSEFSRURfTU9ERT0wCi0KLSNMT0MgPSAtREFTTVYKLSNMT0MgPSAtRERFQlVHIC1nCi0KLVBSRUZJWCA9Ci1DQyA9ICQoUFJFRklYKWdjYwotQ0ZMQUdTID0gJChMT0MpIC1PMyAtV2FsbAotCi1BUyA9ICQoQ0MpCi1BU0ZMQUdTID0gJChMT0MpIC1XYWxsCi0KLUxEID0gJChDQykKLUxERkxBR1MgPSAkKExPQykKLQotQVIgPSAkKFBSRUZJWClhcgotQVJGTEFHUyA9IHJjcwotCi1SQyA9ICQoUFJFRklYKXdpbmRyZXMKLVJDRkxBR1MgPSAtLWRlZmluZSBHQ0NfV0lORFJFUwotCi1TVFJJUCA9ICQoUFJFRklYKXN0cmlwCi0KLUNQID0gY3AgLWZwCi0jIElmIEdOVSBpbnN0YWxsIGlzIGF2YWlsYWJsZSwgcmVwbGFjZSAkKENQKSB3aXRoIGluc3RhbGwuCi1JTlNUQUxMID0gJChDUCkKLVJNID0gcm0gLWYKLQotcHJlZml4ID89IC91c3IvbG9jYWwKLWV4ZWNfcHJlZml4ID0gJChwcmVmaXgpCi0KLU9CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGRlZmxhdGUubyBnemNsb3NlLm8gZ3psaWIubyBnenJlYWQubyBcCi0gICAgICAgZ3p3cml0ZS5vIGluZmJhY2subyBpbmZmYXN0Lm8gaW5mbGF0ZS5vIGluZnRyZWVzLm8gdHJlZXMubyB1bmNvbXByLm8genV0aWwubwotT0JKQSA9Ci0KLWFsbDogJChTVEFUSUNMSUIpICQoU0hBUkVETElCKSAkKElNUExJQikgZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlIGV4YW1wbGVfZC5leGUgbWluaWd6aXBfZC5leGUKLQotdGVzdDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCi0JLi9leGFtcGxlCi0JZWNobyBoZWxsbyB3b3JsZCB8IC4vbWluaWd6aXAgfCAuL21pbmlnemlwIC1kCi0KLXRlc3RkbGw6IGV4YW1wbGVfZC5leGUgbWluaWd6aXBfZC5leGUKLQkuL2V4YW1wbGVfZAotCWVjaG8gaGVsbG8gd29ybGQgfCAuL21pbmlnemlwX2QgfCAuL21pbmlnemlwX2QgLWQKLQotLmMubzoKLQkkKENDKSAkKENGTEFHUykgLWMgLW8gJEAgJDwKLQotLlMubzoKLQkkKEFTKSAkKEFTRkxBR1MpIC1jIC1vICRAICQ8Ci0KLSQoU1RBVElDTElCKTogJChPQkpTKSAkKE9CSkEpCi0JJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpICQoT0JKQSkKLQotJChJTVBMSUIpOiAkKFNIQVJFRExJQikKLQotJChTSEFSRURMSUIpOiB3aW4zMi96bGliLmRlZiAkKE9CSlMpICQoT0JKQSkgemxpYnJjLm8KLQkkKENDKSAtc2hhcmVkIC1XbCwtLW91dC1pbXBsaWIsJChJTVBMSUIpICQoTERGTEFHUykgXAotCS1vICRAIHdpbjMyL3psaWIuZGVmICQoT0JKUykgJChPQkpBKSB6bGlicmMubwotCSQoU1RSSVApICRACi0KLWV4YW1wbGUuZXhlOiBleGFtcGxlLm8gJChTVEFUSUNMSUIpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCBleGFtcGxlLm8gJChTVEFUSUNMSUIpCi0JJChTVFJJUCkgJEAKLQotbWluaWd6aXAuZXhlOiBtaW5pZ3ppcC5vICQoU1RBVElDTElCKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgbWluaWd6aXAubyAkKFNUQVRJQ0xJQikKLQkkKFNUUklQKSAkQAotCi1leGFtcGxlX2QuZXhlOiBleGFtcGxlLm8gJChJTVBMSUIpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCBleGFtcGxlLm8gJChJTVBMSUIpCi0JJChTVFJJUCkgJEAKLQotbWluaWd6aXBfZC5leGU6IG1pbmlnemlwLm8gJChJTVBMSUIpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCBtaW5pZ3ppcC5vICQoSU1QTElCKQotCSQoU1RSSVApICRACi0KLWV4YW1wbGUubzogdGVzdC9leGFtcGxlLmMgemxpYi5oIHpjb25mLmgKLQkkKENDKSAkKENGTEFHUykgLUkuIC1jIC1vICRAIHRlc3QvZXhhbXBsZS5jCi0KLW1pbmlnemlwLm86IHRlc3QvbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtSS4gLWMgLW8gJEAgdGVzdC9taW5pZ3ppcC5jCi0KLXpsaWJyYy5vOiB3aW4zMi96bGliMS5yYwotCSQoUkMpICQoUkNGTEFHUykgLW8gJEAgd2luMzIvemxpYjEucmMKLQotLlBIT05ZOiBpbnN0YWxsIHVuaW5zdGFsbCBjbGVhbgotCi1pbnN0YWxsOiB6bGliLmggemNvbmYuaCAkKFNUQVRJQ0xJQikgJChJTVBMSUIpCi0JQGlmIHRlc3QgLXogIiQoREVTVERJUikkKElOQ0xVREVfUEFUSCkiIC1vIC16ICIkKERFU1RESVIpJChMSUJSQVJZX1BBVEgpIiAtbyAteiAiJChERVNURElSKSQoQklOQVJZX1BBVEgpIjsgdGhlbiBcCi0JCWVjaG8gSU5DTFVERV9QQVRILCBMSUJSQVJZX1BBVEgsIGFuZCBCSU5BUllfUEFUSCBtdXN0IGJlIHNwZWNpZmllZDsgXAotCQlleGl0IDE7IFwKLQlmaQotCS1AbWtkaXIgLXAgJyQoREVTVERJUikkKElOQ0xVREVfUEFUSCknCi0JLUBta2RpciAtcCAnJChERVNURElSKSQoTElCUkFSWV9QQVRIKScgJyQoREVTVERJUikkKExJQlJBUllfUEFUSCknL3BrZ2NvbmZpZwotCS1pZiBbICIkKFNIQVJFRF9NT0RFKSIgPSAiMSIgXTsgdGhlbiBcCi0JCW1rZGlyIC1wICckKERFU1RESVIpJChCSU5BUllfUEFUSCknOyBcCi0JCSQoSU5TVEFMTCkgJChTSEFSRURMSUIpICckKERFU1RESVIpJChCSU5BUllfUEFUSCknOyBcCi0JCSQoSU5TVEFMTCkgJChJTVBMSUIpICckKERFU1RESVIpJChMSUJSQVJZX1BBVEgpJzsgXAotCWZpCi0JLSQoSU5TVEFMTCkgemxpYi5oICckKERFU1RESVIpJChJTkNMVURFX1BBVEgpJwotCS0kKElOU1RBTEwpIHpjb25mLmggJyQoREVTVERJUikkKElOQ0xVREVfUEFUSCknCi0JLSQoSU5TVEFMTCkgJChTVEFUSUNMSUIpICckKERFU1RESVIpJChMSUJSQVJZX1BBVEgpJwotCXNlZCBcCi0JCS1lICdzfEBwcmVmaXhAfCR7cHJlZml4fXxnJyBcCi0JCS1lICdzfEBleGVjX3ByZWZpeEB8JHtleGVjX3ByZWZpeH18ZycgXAotCQktZSAnc3xAbGliZGlyQHwkKExJQlJBUllfUEFUSCl8ZycgXAotCQktZSAnc3xAc2hhcmVkbGliZGlyQHwkKExJQlJBUllfUEFUSCl8ZycgXAotCQktZSAnc3xAaW5jbHVkZWRpckB8JChJTkNMVURFX1BBVEgpfGcnIFwKLQkJLWUgJ3N8QFZFUlNJT05AfCdgc2VkIC1uIC1lICcvVkVSU0lPTiAiL3MvLioiXCguKlwpIi4qL1wxL3AnIHpsaWIuaGAnfGcnIFwKLQkJemxpYi5wYy5pbiA+ICckKERFU1RESVIpJChMSUJSQVJZX1BBVEgpJy9wa2djb25maWcvemxpYi5wYwotCi11bmluc3RhbGw6Ci0JLWlmIFsgIiQoU0hBUkVEX01PREUpIiA9ICIxIiBdOyB0aGVuIFwKLQkJJChSTSkgJyQoREVTVERJUikkKEJJTkFSWV9QQVRIKScvJChTSEFSRURMSUIpOyBcCi0JCSQoUk0pICckKERFU1RESVIpJChMSUJSQVJZX1BBVEgpJy8kKElNUExJQik7IFwKLQlmaQotCS0kKFJNKSAnJChERVNURElSKSQoSU5DTFVERV9QQVRIKScvemxpYi5oCi0JLSQoUk0pICckKERFU1RESVIpJChJTkNMVURFX1BBVEgpJy96Y29uZi5oCi0JLSQoUk0pICckKERFU1RESVIpJChMSUJSQVJZX1BBVEgpJy8kKFNUQVRJQ0xJQikKLQotY2xlYW46Ci0JLSQoUk0pICQoU1RBVElDTElCKQotCS0kKFJNKSAkKFNIQVJFRExJQikKLQktJChSTSkgJChJTVBMSUIpCi0JLSQoUk0pICoubwotCS0kKFJNKSAqLmV4ZQotCS0kKFJNKSBmb28uZ3oKLQotYWRsZXIzMi5vOiB6bGliLmggemNvbmYuaAotY29tcHJlc3MubzogemxpYi5oIHpjb25mLmgKLWNyYzMyLm86IGNyYzMyLmggemxpYi5oIHpjb25mLmgKLWRlZmxhdGUubzogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWd6Y2xvc2UubzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLWd6bGliLm86IHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCi1nenJlYWQubzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLWd6d3JpdGUubzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLWluZmZhc3QubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKLWluZmxhdGUubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKLWluZmJhY2subzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKLWluZnRyZWVzLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAotdHJlZXMubzogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmggdHJlZXMuaAotdW5jb21wci5vOiB6bGliLmggemNvbmYuaAotenV0aWwubzogenV0aWwuaCB6bGliLmggemNvbmYuaApkaWZmIC0tZ2l0IGEvc3JjL3psaWIvd2luMzIvTWFrZWZpbGUubXNjIGIvc3JjL3psaWIvd2luMzIvTWFrZWZpbGUubXNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWJiMGRhLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL3dpbjMyL01ha2VmaWxlLm1zYworKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0jIE1ha2VmaWxlIGZvciB6bGliIHVzaW5nIE1pY3Jvc29mdCAoVmlzdWFsKSBDCi0jIHpsaWIgaXMgY29weXJpZ2h0IChDKSAxOTk1LTIwMDYgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgotIwotIyBVc2FnZToKLSMgICBubWFrZSAtZiB3aW4zMi9NYWtlZmlsZS5tc2MgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGFuZGFyZCBidWlsZCkKLSMgICBubWFrZSAtZiB3aW4zMi9NYWtlZmlsZS5tc2MgTE9DPS1ERk9PICAgICAgICAgICAgICAgIChub25zdGFuZGFyZCBidWlsZCkKLSMgICBubWFrZSAtZiB3aW4zMi9NYWtlZmlsZS5tc2MgTE9DPSItREFTTVYgLURBU01JTkYiIFwKLSMgICAgICAgICBPQkpBPSJpbmZmYXMzMi5vYmogbWF0Y2g2ODYub2JqIiAgICAgICAgICAgICAgICh1c2UgQVNNIGNvZGUsIHg4NikKLSMgICBubWFrZSAtZiB3aW4zMi9NYWtlZmlsZS5tc2MgQVM9bWw2NCBMT0M9Ii1EQVNNViAtREFTTUlORiAtSS4iIFwKLSMgICAgICAgICBPQkpBPSJpbmZmYXN4NjQub2JqIGd2bWF0NjQub2JqIGluZmZhczg2NjQub2JqIiAgKHVzZSBBU00gY29kZSwgeDY0KQotCi0jIG9wdGlvbmFsIGJ1aWxkIGZsYWdzCi1MT0MgPQotCi0jIHZhcmlhYmxlcwotU1RBVElDTElCID0gemxpYi5saWIKLVNIQVJFRExJQiA9IHpsaWIxLmRsbAotSU1QTElCICAgID0gemRsbC5saWIKLQotQ0MgPSBjbAotQVMgPSBtbAotTEQgPSBsaW5rCi1BUiA9IGxpYgotUkMgPSByYwotQ0ZMQUdTICA9IC1ub2xvZ28gLU1EIC1XMyAtTzIgLU95LSAtWmkgLUZkInpsaWIiICQoTE9DKQotV0ZMQUdTICA9IC1EX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIC1EX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURQotQVNGTEFHUyA9IC1jb2ZmIC1aaSAkKExPQykKLUxERkxBR1MgPSAtbm9sb2dvIC1kZWJ1ZyAtaW5jcmVtZW50YWw6bm8gLW9wdDpyZWYKLUFSRkxBR1MgPSAtbm9sb2dvCi1SQ0ZMQUdTID0gL2RXSU4zMiAvcgotCi1PQkpTID0gYWRsZXIzMi5vYmogY29tcHJlc3Mub2JqIGNyYzMyLm9iaiBkZWZsYXRlLm9iaiBnemNsb3NlLm9iaiBnemxpYi5vYmogZ3pyZWFkLm9iaiBcCi0gICAgICAgZ3p3cml0ZS5vYmogaW5mYmFjay5vYmogaW5mbGF0ZS5vYmogaW5mdHJlZXMub2JqIGluZmZhc3Qub2JqIHRyZWVzLm9iaiB1bmNvbXByLm9iaiB6dXRpbC5vYmoKLU9CSkEgPQotCi0KLSMgdGFyZ2V0cwotYWxsOiAkKFNUQVRJQ0xJQikgJChTSEFSRURMSUIpICQoSU1QTElCKSBcCi0gICAgIGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZSBleGFtcGxlX2QuZXhlIG1pbmlnemlwX2QuZXhlCi0KLSQoU1RBVElDTElCKTogJChPQkpTKSAkKE9CSkEpCi0JJChBUikgJChBUkZMQUdTKSAtb3V0OiRAICQoT0JKUykgJChPQkpBKQotCi0kKElNUExJQik6ICQoU0hBUkVETElCKQotCi0kKFNIQVJFRExJQik6IHdpbjMyL3psaWIuZGVmICQoT0JKUykgJChPQkpBKSB6bGliMS5yZXMKLQkkKExEKSAkKExERkxBR1MpIC1kZWY6d2luMzIvemxpYi5kZWYgLWRsbCAtaW1wbGliOiQoSU1QTElCKSBcCi0JICAtb3V0OiRAIC1iYXNlOjB4NUE0QzAwMDAgJChPQkpTKSAkKE9CSkEpIHpsaWIxLnJlcwotCWlmIGV4aXN0ICRALm1hbmlmZXN0IFwKLQkgIG10IC1ub2xvZ28gLW1hbmlmZXN0ICRALm1hbmlmZXN0IC1vdXRwdXRyZXNvdXJjZTokQDsyCi0KLWV4YW1wbGUuZXhlOiBleGFtcGxlLm9iaiAkKFNUQVRJQ0xJQikKLQkkKExEKSAkKExERkxBR1MpIGV4YW1wbGUub2JqICQoU1RBVElDTElCKQotCWlmIGV4aXN0ICRALm1hbmlmZXN0IFwKLQkgIG10IC1ub2xvZ28gLW1hbmlmZXN0ICRALm1hbmlmZXN0IC1vdXRwdXRyZXNvdXJjZTokQDsxCi0KLW1pbmlnemlwLmV4ZTogbWluaWd6aXAub2JqICQoU1RBVElDTElCKQotCSQoTEQpICQoTERGTEFHUykgbWluaWd6aXAub2JqICQoU1RBVElDTElCKQotCWlmIGV4aXN0ICRALm1hbmlmZXN0IFwKLQkgIG10IC1ub2xvZ28gLW1hbmlmZXN0ICRALm1hbmlmZXN0IC1vdXRwdXRyZXNvdXJjZTokQDsxCi0KLWV4YW1wbGVfZC5leGU6IGV4YW1wbGUub2JqICQoSU1QTElCKQotCSQoTEQpICQoTERGTEFHUykgLW91dDokQCBleGFtcGxlLm9iaiAkKElNUExJQikKLQlpZiBleGlzdCAkQC5tYW5pZmVzdCBcCi0JICBtdCAtbm9sb2dvIC1tYW5pZmVzdCAkQC5tYW5pZmVzdCAtb3V0cHV0cmVzb3VyY2U6JEA7MQotCi1taW5pZ3ppcF9kLmV4ZTogbWluaWd6aXAub2JqICQoSU1QTElCKQotCSQoTEQpICQoTERGTEFHUykgLW91dDokQCBtaW5pZ3ppcC5vYmogJChJTVBMSUIpCi0JaWYgZXhpc3QgJEAubWFuaWZlc3QgXAotCSAgbXQgLW5vbG9nbyAtbWFuaWZlc3QgJEAubWFuaWZlc3QgLW91dHB1dHJlc291cmNlOiRAOzEKLQotLmMub2JqOgotCSQoQ0MpIC1jICQoV0ZMQUdTKSAkKENGTEFHUykgJDwKLQote3Rlc3R9LmMub2JqOgotCSQoQ0MpIC1jIC1JLiAkKFdGTEFHUykgJChDRkxBR1MpICQ8Ci0KLXtjb250cmliL21hc214NjR9LmMub2JqOgotCSQoQ0MpIC1jICQoV0ZMQUdTKSAkKENGTEFHUykgJDwKLQote2NvbnRyaWIvbWFzbXg2NH0uYXNtLm9iajoKLQkkKEFTKSAtYyAkKEFTRkxBR1MpICQ8Ci0KLXtjb250cmliL21hc214ODZ9LmFzbS5vYmo6Ci0JJChBUykgLWMgJChBU0ZMQUdTKSAkPAotCi1hZGxlcjMyLm9iajogYWRsZXIzMi5jIHpsaWIuaCB6Y29uZi5oCi0KLWNvbXByZXNzLm9iajogY29tcHJlc3MuYyB6bGliLmggemNvbmYuaAotCi1jcmMzMi5vYmo6IGNyYzMyLmMgemxpYi5oIHpjb25mLmggY3JjMzIuaAotCi1kZWZsYXRlLm9iajogZGVmbGF0ZS5jIGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0KLWd6Y2xvc2Uub2JqOiBnemNsb3NlLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLQotZ3psaWIub2JqOiBnemxpYi5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCi0KLWd6cmVhZC5vYmo6IGd6cmVhZC5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCi0KLWd6d3JpdGUub2JqOiBnendyaXRlLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKLQotaW5mYmFjay5vYmo6IGluZmJhY2suYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKLSAgICAgICAgICAgICBpbmZmYXN0LmggaW5mZml4ZWQuaAotCi1pbmZmYXN0Lm9iajogaW5mZmFzdC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAotICAgICAgICAgICAgIGluZmZhc3QuaAotCi1pbmZsYXRlLm9iajogaW5mbGF0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAotICAgICAgICAgICAgIGluZmZhc3QuaCBpbmZmaXhlZC5oCi0KLWluZnRyZWVzLm9iajogaW5mdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKLQotdHJlZXMub2JqOiB0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggZGVmbGF0ZS5oIHRyZWVzLmgKLQotdW5jb21wci5vYmo6IHVuY29tcHIuYyB6bGliLmggemNvbmYuaAotCi16dXRpbC5vYmo6IHp1dGlsLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAotCi1ndm1hdDY0Lm9iajogY29udHJpYlxtYXNteDY0XGd2bWF0NjQuYXNtCi0KLWluZmZhc3g2NC5vYmo6IGNvbnRyaWJcbWFzbXg2NFxpbmZmYXN4NjQuYXNtCi0KLWluZmZhczg2NjQub2JqOiBjb250cmliXG1hc214NjRcaW5mZmFzODY2NC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggXAotCQlpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKLQotaW5mZmFzMzIub2JqOiBjb250cmliXG1hc214ODZcaW5mZmFzMzIuYXNtCi0KLW1hdGNoNjg2Lm9iajogY29udHJpYlxtYXNteDg2XG1hdGNoNjg2LmFzbQotCi1leGFtcGxlLm9iajogdGVzdC9leGFtcGxlLmMgemxpYi5oIHpjb25mLmgKLQotbWluaWd6aXAub2JqOiB0ZXN0L21pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKLQotemxpYjEucmVzOiB3aW4zMi96bGliMS5yYwotCSQoUkMpICQoUkNGTEFHUykgL2ZvJEAgd2luMzIvemxpYjEucmMKLQotCi0jIHRlc3RpbmcKLXRlc3Q6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQotCWV4YW1wbGUKLQllY2hvIGhlbGxvIHdvcmxkIHwgbWluaWd6aXAgfCBtaW5pZ3ppcCAtZAotCi10ZXN0ZGxsOiBleGFtcGxlX2QuZXhlIG1pbmlnemlwX2QuZXhlCi0JZXhhbXBsZV9kCi0JZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwX2QgfCBtaW5pZ3ppcF9kIC1kCi0KLQotIyBjbGVhbnVwCi1jbGVhbjoKLQktZGVsICQoU1RBVElDTElCKQotCS1kZWwgJChTSEFSRURMSUIpCi0JLWRlbCAkKElNUExJQikKLQktZGVsICoub2JqCi0JLWRlbCAqLnJlcwotCS1kZWwgKi5leHAKLQktZGVsICouZXhlCi0JLWRlbCAqLnBkYgotCS1kZWwgKi5tYW5pZmVzdAotCS1kZWwgZm9vLmd6CmRpZmYgLS1naXQgYS9zcmMvemxpYi93aW4zMi9SRUFETUUtV0lOMzIudHh0IGIvc3JjL3psaWIvd2luMzIvUkVBRE1FLVdJTjMyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjNTkyMy4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi93aW4zMi9SRUFETUUtV0lOMzIudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLVpMSUIgREFUQSBDT01QUkVTU0lPTiBMSUJSQVJZCi0KLXpsaWIgMS4yLjcgaXMgYSBnZW5lcmFsIHB1cnBvc2UgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LiAgQWxsIHRoZSBjb2RlIGlzCi10aHJlYWQgc2FmZS4gIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MKLShSZXF1ZXN0IGZvciBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcwotaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MC50eHQgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MS50eHQgKGRlZmxhdGUgZm9ybWF0KQotYW5kIHJmYzE5NTIudHh0IChnemlwIGZvcm1hdCkuCi0KLUFsbCBmdW5jdGlvbnMgb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUgemxpYi5oCi0odm9sdW50ZWVyIHRvIHdyaXRlIG1hbiBwYWdlcyB3ZWxjb21lLCBjb250YWN0IHpsaWJAZ3ppcC5vcmcpLiAgVHdvIGNvbXBpbGVkCi1leGFtcGxlcyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhpcyBwYWNrYWdlLCBleGFtcGxlIGFuZCBtaW5pZ3ppcC4gIFRoZSBleGFtcGxlX2QKLWFuZCBtaW5pZ3ppcF9kIGZsYXZvcnMgdmFsaWRhdGUgdGhhdCB0aGUgemxpYjEuZGxsIGZpbGUgaXMgd29ya2luZyBjb3JyZWN0bHkuCi0KLVF1ZXN0aW9ucyBhYm91dCB6bGliIHNob3VsZCBiZSBzZW50IHRvIDx6bGliQGd6aXAub3JnPi4gIFRoZSB6bGliIGhvbWUgcGFnZQotaXMgaHR0cDovL3psaWIubmV0LyAuICBCZWZvcmUgcmVwb3J0aW5nIGEgcHJvYmxlbSwgcGxlYXNlIGNoZWNrIHRoaXMgc2l0ZSB0bwotdmVyaWZ5IHRoYXQgeW91IGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHpsaWI7IG90aGVyd2lzZSBnZXQgdGhlIGxhdGVzdAotdmVyc2lvbiBhbmQgY2hlY2sgd2hldGhlciB0aGUgcHJvYmxlbSBzdGlsbCBleGlzdHMgb3Igbm90LgotCi1QTEVBU0UgcmVhZCBETExfRkFRLnR4dCwgYW5kIHRoZSB0aGUgemxpYiBGQVEgaHR0cDovL3psaWIubmV0L3psaWJfZmFxLmh0bWwKLWJlZm9yZSBhc2tpbmcgZm9yIGhlbHAuCi0KLQotTWFuaWZlc3Q6Ci0KLVRoZSBwYWNrYWdlIHpsaWItMS4yLjctd2luMzIteDg2LnppcCB3aWxsIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBmaWxlczoKLQotICBSRUFETUUtV0lOMzIudHh0IFRoaXMgZG9jdW1lbnQKLSAgQ2hhbmdlTG9nICAgICAgICBDaGFuZ2VzIHNpbmNlIHByZXZpb3VzIHpsaWIgcGFja2FnZXMKLSAgRExMX0ZBUS50eHQgICAgICBGcmVxdWVudGx5IGFza2VkIHF1ZXN0aW9ucyBhYm91dCB6bGliMS5kbGwKLSAgemxpYi4zLnBkZiAgICAgICBEb2N1bWVudGF0aW9uIG9mIHRoaXMgbGlicmFyeSBpbiBBZG9iZSBBY3JvYmF0IGZvcm1hdAotCi0gIGV4YW1wbGUuZXhlICAgICAgQSBzdGF0aWNhbGx5LWJvdW5kIGV4YW1wbGUgKHVzaW5nIHpsaWIubGliLCBub3QgdGhlIGRsbCkKLSAgZXhhbXBsZS5wZGIgICAgICBTeW1ib2xpYyBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIGV4YW1wbGUuZXhlCi0KLSAgZXhhbXBsZV9kLmV4ZSAgICBBIHpsaWIxLmRsbCBib3VuZCBleGFtcGxlICh1c2luZyB6ZGxsLmxpYikKLSAgZXhhbXBsZV9kLnBkYiAgICBTeW1ib2xpYyBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIGV4YW1wbGVfZC5leGUKLQotICBtaW5pZ3ppcC5leGUgICAgIEEgc3RhdGljYWxseS1ib3VuZCB0ZXN0IHByb2dyYW0gKHVzaW5nIHpsaWIubGliLCBub3QgdGhlIGRsbCkKLSAgbWluaWd6aXAucGRiICAgICBTeW1ib2xpYyBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIG1pbmlnemlwLmV4ZQotCi0gIG1pbmlnemlwX2QuZXhlICAgQSB6bGliMS5kbGwgYm91bmQgdGVzdCBwcm9ncmFtICh1c2luZyB6ZGxsLmxpYikKLSAgbWluaWd6aXBfZC5wZGIgICBTeW1ib2xpYyBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIG1pbmlnemlwX2QuZXhlCi0KLSAgemxpYi5oICAgICAgICAgICBJbnN0YWxsIHRoZXNlIGZpbGVzIGludG8gdGhlIGNvbXBpbGVycycgSU5DTFVERSBwYXRoIHRvCi0gIHpjb25mLmggICAgICAgICAgY29tcGlsZSBwcm9ncmFtcyB3aGljaCB1c2UgemxpYi5saWIgb3IgemRsbC5saWIKLQotICB6ZGxsLmxpYiAgICAgICAgIEluc3RhbGwgdGhlc2UgZmlsZXMgaW50byB0aGUgY29tcGlsZXJzJyBMSUIgcGF0aCBpZiBsaW5raW5nCi0gIHpkbGwuZXhwICAgICAgICAgYSBjb21waWxlZCBwcm9ncmFtIHRvIHRoZSB6bGliMS5kbGwgYmluYXJ5Ci0KLSAgemxpYi5saWIgICAgICAgICBJbnN0YWxsIHRoZXNlIGZpbGVzIGludG8gdGhlIGNvbXBpbGVycycgTElCIHBhdGggdG8gbGluayB6bGliCi0gIHpsaWIucGRiICAgICAgICAgaW50byBjb21waWxlZCBwcm9ncmFtcywgd2l0aG91dCB6bGliMS5kbGwgcnVudGltZSBkZXBlbmRlbmN5Ci0gICAgICAgICAgICAgICAgICAgKHpsaWIucGRiIHByb3ZpZGVzIGRlYnVnZ2luZyBpbmZvIHRvIHRoZSBjb21waWxlIHRpbWUgbGlua2VyKQotCi0gIHpsaWIxLmRsbCAgICAgICAgSW5zdGFsbCB0aGlzIGJpbmFyeSBzaGFyZWQgbGlicmFyeSBpbnRvIHRoZSBzeXN0ZW0gUEFUSCwgb3IKLSAgICAgICAgICAgICAgICAgICB0aGUgcHJvZ3JhbSdzIHJ1bnRpbWUgZGlyZWN0b3J5ICh3aGVyZSB0aGUgLmV4ZSByZXNpZGVzKQotICB6bGliMS5wZGIgICAgICAgIEluc3RhbGwgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHpsaWIxLmRsbCwgaW4gb3JkZXIgdG8gZGVidWcKLSAgICAgICAgICAgICAgICAgICBhbiBhcHBsaWNhdGlvbiBjcmFzaCB1c2luZyBXaW5EYmcgb3Igc2ltaWxhciB0b29scy4KLQotQWxsIC5wZGIgZmlsZXMgYWJvdmUgYXJlIGVudGlyZWx5IG9wdGlvbmFsLCBidXQgYXJlIHZlcnkgdXNlZnVsIHRvIGEgZGV2ZWxvcGVyCi1hdHRlbXB0aW5nIHRvIGRpYWdub3NlIHByb2dyYW0gbWlzYmVoYXZpb3Igb3IgYSBjcmFzaC4gIE1hbnkgYWRkaXRpb25hbAotaW1wb3J0YW50IGZpbGVzIGZvciBkZXZlbG9wZXJzIGNhbiBiZSBmb3VuZCBpbiB0aGUgemxpYjEyNy56aXAgc291cmNlIHBhY2thZ2UKLWF2YWlsYWJsZSBmcm9tIGh0dHA6Ly96bGliLm5ldC8gLSByZXZpZXcgdGhhdCBwYWNrYWdlJ3MgUkVBRE1FIGZpbGUgZm9yIGRldGFpbHMuCi0KLQotQWNrbm93bGVkZ21lbnRzOgotCi1UaGUgZGVmbGF0ZSBmb3JtYXQgdXNlZCBieSB6bGliIHdhcyBkZWZpbmVkIGJ5IFBoaWwgS2F0ei4gIFRoZSBkZWZsYXRlIGFuZAotemxpYiBzcGVjaWZpY2F0aW9ucyB3ZXJlIHdyaXR0ZW4gYnkgTC4gIFBldGVyIERldXRzY2guICBUaGFua3MgdG8gYWxsIHRoZQotcGVvcGxlIHdobyByZXBvcnRlZCBwcm9ibGVtcyBhbmQgc3VnZ2VzdGVkIHZhcmlvdXMgaW1wcm92ZW1lbnRzIGluIHpsaWI7IHRoZXkKLWFyZSB0b28gbnVtZXJvdXMgdG8gY2l0ZSBoZXJlLgotCi0KLUNvcHlyaWdodCBub3RpY2U6Ci0KLSAgKEMpIDE5OTUtMjAxMiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCi0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0gIEplYW4tbG91cCBHYWlsbHkgICAgICAgIE1hcmsgQWRsZXIKLSAgamxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQotCi1JZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCB3ZSB3b3VsZCBhcHByZWNpYXRlICpub3QqIHJlY2VpdmluZwotbGVuZ3RoeSBsZWdhbCBkb2N1bWVudHMgdG8gc2lnbi4gIFRoZSBzb3VyY2VzIGFyZSBwcm92aWRlZCBmb3IgZnJlZSBidXQgd2l0aG91dAotd2FycmFudHkgb2YgYW55IGtpbmQuICBUaGUgbGlicmFyeSBoYXMgYmVlbiBlbnRpcmVseSB3cml0dGVuIGJ5IEplYW4tbG91cAotR2FpbGx5IGFuZCBNYXJrIEFkbGVyOyBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoaXJkLXBhcnR5IGNvZGUuCi0KLUlmIHlvdSByZWRpc3RyaWJ1dGUgbW9kaWZpZWQgc291cmNlcywgd2Ugd291bGQgYXBwcmVjaWF0ZSB0aGF0IHlvdSBpbmNsdWRlIGluCi10aGUgZmlsZSBDaGFuZ2VMb2cgaGlzdG9yeSBpbmZvcm1hdGlvbiBkb2N1bWVudGluZyB5b3VyIGNoYW5nZXMuICBQbGVhc2UgcmVhZAotdGhlIEZBUSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGlzdHJpYnV0aW9uIG9mIG1vZGlmaWVkIHNvdXJjZSB2ZXJzaW9ucy4KZGlmZiAtLWdpdCBhL3NyYy96bGliL3dpbjMyL1Zpc3VhbEMudHh0IGIvc3JjL3psaWIvd2luMzIvVmlzdWFsQy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OWE1ZmMuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvd2luMzIvVmlzdWFsQy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotVG8gYnVpbGQgemxpYiB1c2luZyB0aGUgTWljcm9zb2Z0IFZpc3VhbCBDKysgZW52aXJvbm1lbnQsCi11c2UgdGhlIGFwcHJvcHJpYXRlIHByb2plY3QgZnJvbSB0aGUgcHJvamVjdHMvIGRpcmVjdG9yeS4KZGlmZiAtLWdpdCBhL3NyYy96bGliL3dpbjMyL3psaWIuZGVmIGIvc3JjL3psaWIvd2luMzIvemxpYi5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ODk2MTUuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvd2luMzIvemxpYi5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi07IHpsaWIgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5Ci1FWFBPUlRTCi07IGJhc2ljIGZ1bmN0aW9ucwotICAgIHpsaWJWZXJzaW9uCi0gICAgZGVmbGF0ZQotICAgIGRlZmxhdGVFbmQKLSAgICBpbmZsYXRlCi0gICAgaW5mbGF0ZUVuZAotOyBhZHZhbmNlZCBmdW5jdGlvbnMKLSAgICBkZWZsYXRlU2V0RGljdGlvbmFyeQotICAgIGRlZmxhdGVDb3B5Ci0gICAgZGVmbGF0ZVJlc2V0Ci0gICAgZGVmbGF0ZVBhcmFtcwotICAgIGRlZmxhdGVUdW5lCi0gICAgZGVmbGF0ZUJvdW5kCi0gICAgZGVmbGF0ZVBlbmRpbmcKLSAgICBkZWZsYXRlUHJpbWUKLSAgICBkZWZsYXRlU2V0SGVhZGVyCi0gICAgaW5mbGF0ZVNldERpY3Rpb25hcnkKLSAgICBpbmZsYXRlU3luYwotICAgIGluZmxhdGVDb3B5Ci0gICAgaW5mbGF0ZVJlc2V0Ci0gICAgaW5mbGF0ZVJlc2V0MgotICAgIGluZmxhdGVQcmltZQotICAgIGluZmxhdGVNYXJrCi0gICAgaW5mbGF0ZUdldEhlYWRlcgotICAgIGluZmxhdGVCYWNrCi0gICAgaW5mbGF0ZUJhY2tFbmQKLSAgICB6bGliQ29tcGlsZUZsYWdzCi07IHV0aWxpdHkgZnVuY3Rpb25zCi0gICAgY29tcHJlc3MKLSAgICBjb21wcmVzczIKLSAgICBjb21wcmVzc0JvdW5kCi0gICAgdW5jb21wcmVzcwotICAgIGd6b3BlbgotICAgIGd6ZG9wZW4KLSAgICBnemJ1ZmZlcgotICAgIGd6c2V0cGFyYW1zCi0gICAgZ3pyZWFkCi0gICAgZ3p3cml0ZQotICAgIGd6cHJpbnRmCi0gICAgZ3pwdXRzCi0gICAgZ3pnZXRzCi0gICAgZ3pwdXRjCi0gICAgZ3pnZXRjCi0gICAgZ3p1bmdldGMKLSAgICBnemZsdXNoCi0gICAgZ3pzZWVrCi0gICAgZ3pyZXdpbmQKLSAgICBnenRlbGwKLSAgICBnem9mZnNldAotICAgIGd6ZW9mCi0gICAgZ3pkaXJlY3QKLSAgICBnemNsb3NlCi0gICAgZ3pjbG9zZV9yCi0gICAgZ3pjbG9zZV93Ci0gICAgZ3plcnJvcgotICAgIGd6Y2xlYXJlcnIKLTsgbGFyZ2UgZmlsZSBmdW5jdGlvbnMKLSAgICBnem9wZW42NAotICAgIGd6c2VlazY0Ci0gICAgZ3p0ZWxsNjQKLSAgICBnem9mZnNldDY0Ci0gICAgYWRsZXIzMl9jb21iaW5lNjQKLSAgICBjcmMzMl9jb21iaW5lNjQKLTsgY2hlY2tzdW0gZnVuY3Rpb25zCi0gICAgYWRsZXIzMgotICAgIGNyYzMyCi0gICAgYWRsZXIzMl9jb21iaW5lCi0gICAgY3JjMzJfY29tYmluZQotOyB2YXJpb3VzIGhhY2tzLCBkb24ndCBsb29rIDopCi0gICAgZGVmbGF0ZUluaXRfCi0gICAgZGVmbGF0ZUluaXQyXwotICAgIGluZmxhdGVJbml0XwotICAgIGluZmxhdGVJbml0Ml8KLSAgICBpbmZsYXRlQmFja0luaXRfCi0gICAgZ3pnZXRjXwotICAgIHpFcnJvcgotICAgIGluZmxhdGVTeW5jUG9pbnQKLSAgICBnZXRfY3JjX3RhYmxlCi0gICAgaW5mbGF0ZVVuZGVybWluZQotICAgIGluZmxhdGVSZXNldEtlZXAKLSAgICBkZWZsYXRlUmVzZXRLZWVwCi0gICAgZ3pvcGVuX3cKZGlmZiAtLWdpdCBhL3NyYy96bGliL3dpbjMyL3psaWIxLnJjIGIvc3JjL3psaWIvd2luMzIvemxpYjEucmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMWQ3ZmYuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvd2luMzIvemxpYjEucmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jaW5jbHVkZSA8d2ludmVyLmg+Ci0jaW5jbHVkZSAiLi4vemxpYi5oIgotCi0jaWZkZWYgR0NDX1dJTkRSRVMKLVZTX1ZFUlNJT05fSU5GTwkJVkVSU0lPTklORk8KLSNlbHNlCi1WU19WRVJTSU9OX0lORk8JCVZFUlNJT05JTkZPCU1PVkVBQkxFIElNUFVSRSBMT0FET05DQUxMIERJU0NBUkRBQkxFCi0jZW5kaWYKLSAgRklMRVZFUlNJT04JCVpMSUJfVkVSX01BSk9SLFpMSUJfVkVSX01JTk9SLFpMSUJfVkVSX1JFVklTSU9OLDAKLSAgUFJPRFVDVFZFUlNJT04JWkxJQl9WRVJfTUFKT1IsWkxJQl9WRVJfTUlOT1IsWkxJQl9WRVJfUkVWSVNJT04sMAotICBGSUxFRkxBR1NNQVNLCQlWU19GRklfRklMRUZMQUdTTUFTSwotI2lmZGVmIF9ERUJVRwotICBGSUxFRkxBR1MJCTEKLSNlbHNlCi0gIEZJTEVGTEFHUwkJMAotI2VuZGlmCi0gIEZJTEVPUwkJVk9TX19XSU5ET1dTMzIKLSAgRklMRVRZUEUJCVZGVF9ETEwKLSAgRklMRVNVQlRZUEUJCTAJLy8gbm90IHVzZWQKLUJFR0lOCi0gIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKLSAgQkVHSU4KLSAgICBCTE9DSyAiMDQwOTA0RTQiCi0gICAgLy9sYW5ndWFnZSBJRCA9IFUuUy4gRW5nbGlzaCwgY2hhciBzZXQgPSBXaW5kb3dzLCBNdWx0aWxpbmd1YWwKLSAgICBCRUdJTgotICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsCSJ6bGliIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeVwwIgotICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwJWkxJQl9WRVJTSU9OICJcMCIKLSAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLAkiemxpYjEuZGxsXDAiCi0gICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLAkiKEMpIDE5OTUtMjAwNiBKZWFuLWxvdXAgR2FpbGx5ICYgTWFyayBBZGxlclwwIgotICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLAkiemxpYjEuZGxsXDAiCi0gICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLAkiemxpYlwwIgotICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwJWkxJQl9WRVJTSU9OICJcMCIKLSAgICAgIFZBTFVFICJDb21tZW50cyIsCQkiRm9yIG1vcmUgaW5mb3JtYXRpb24gdmlzaXQgaHR0cDovL3d3dy56bGliLm5ldC9cMCIKLSAgICBFTkQKLSAgRU5ECi0gIEJMT0NLICJWYXJGaWxlSW5mbyIKLSAgQkVHSU4KLSAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDA0MDksIDEyNTIKLSAgRU5ECi1FTkQKZGlmZiAtLWdpdCBhL3NyYy96bGliL3pjb25mLmggYi9zcmMvemxpYi96Y29uZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTQ2YTU4Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL3pjb25mLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYgKzAsMCBAQAotLyogemNvbmYuaCAtLSBjb25maWd1cmF0aW9uIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEyIEplYW4tbG91cCBHYWlsbHkuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogQCgjKSAkSWQkICovCi0KLSNpZm5kZWYgWkNPTkZfSAotI2RlZmluZSBaQ09ORl9ICi0KLS8qCi0gKiBJZiB5b3UgKnJlYWxseSogbmVlZCBhIHVuaXF1ZSBwcmVmaXggZm9yIGFsbCB0eXBlcyBhbmQgbGlicmFyeSBmdW5jdGlvbnMsCi0gKiBjb21waWxlIHdpdGggLURaX1BSRUZJWC4gVGhlICJzdGFuZGFyZCIgemxpYiBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBpdC4KLSAqIEV2ZW4gYmV0dGVyIHRoYW4gY29tcGlsaW5nIHdpdGggLURaX1BSRUZJWCB3b3VsZCBiZSB0byB1c2UgY29uZmlndXJlIHRvIHNldAotICogdGhpcyBwZXJtYW5lbnRseSBpbiB6Y29uZi5oIHVzaW5nICIuL2NvbmZpZ3VyZSAtLXpwcmVmaXgiLgotICovCi0jaWZkZWYgWl9QUkVGSVggICAgIC8qIG1heSBiZSBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KLSMgIGRlZmluZSBaX1BSRUZJWF9TRVQKLQotLyogYWxsIGxpbmtlZCBzeW1ib2xzICovCi0jICBkZWZpbmUgX2Rpc3RfY29kZSAgICAgICAgICAgIHpfX2Rpc3RfY29kZQotIyAgZGVmaW5lIF9sZW5ndGhfY29kZSAgICAgICAgICB6X19sZW5ndGhfY29kZQotIyAgZGVmaW5lIF90cl9hbGlnbiAgICAgICAgICAgICB6X190cl9hbGlnbgotIyAgZGVmaW5lIF90cl9mbHVzaF9ibG9jayAgICAgICB6X190cl9mbHVzaF9ibG9jawotIyAgZGVmaW5lIF90cl9pbml0ICAgICAgICAgICAgICB6X190cl9pbml0Ci0jICBkZWZpbmUgX3RyX3N0b3JlZF9ibG9jayAgICAgIHpfX3RyX3N0b3JlZF9ibG9jawotIyAgZGVmaW5lIF90cl90YWxseSAgICAgICAgICAgICB6X190cl90YWxseQotIyAgZGVmaW5lIGFkbGVyMzIgICAgICAgICAgICAgICB6X2FkbGVyMzIKLSMgIGRlZmluZSBhZGxlcjMyX2NvbWJpbmUgICAgICAgel9hZGxlcjMyX2NvbWJpbmUKLSMgIGRlZmluZSBhZGxlcjMyX2NvbWJpbmU2NCAgICAgel9hZGxlcjMyX2NvbWJpbmU2NAotIyAgaWZuZGVmIFpfU09MTwotIyAgICBkZWZpbmUgY29tcHJlc3MgICAgICAgICAgICAgIHpfY29tcHJlc3MKLSMgICAgZGVmaW5lIGNvbXByZXNzMiAgICAgICAgICAgICB6X2NvbXByZXNzMgotIyAgICBkZWZpbmUgY29tcHJlc3NCb3VuZCAgICAgICAgIHpfY29tcHJlc3NCb3VuZAotIyAgZW5kaWYKLSMgIGRlZmluZSBjcmMzMiAgICAgICAgICAgICAgICAgel9jcmMzMgotIyAgZGVmaW5lIGNyYzMyX2NvbWJpbmUgICAgICAgICB6X2NyYzMyX2NvbWJpbmUKLSMgIGRlZmluZSBjcmMzMl9jb21iaW5lNjQgICAgICAgel9jcmMzMl9jb21iaW5lNjQKLSMgIGRlZmluZSBkZWZsYXRlICAgICAgICAgICAgICAgel9kZWZsYXRlCi0jICBkZWZpbmUgZGVmbGF0ZUJvdW5kICAgICAgICAgIHpfZGVmbGF0ZUJvdW5kCi0jICBkZWZpbmUgZGVmbGF0ZUNvcHkgICAgICAgICAgIHpfZGVmbGF0ZUNvcHkKLSMgIGRlZmluZSBkZWZsYXRlRW5kICAgICAgICAgICAgel9kZWZsYXRlRW5kCi0jICBkZWZpbmUgZGVmbGF0ZUluaXQyXyAgICAgICAgIHpfZGVmbGF0ZUluaXQyXwotIyAgZGVmaW5lIGRlZmxhdGVJbml0XyAgICAgICAgICB6X2RlZmxhdGVJbml0XwotIyAgZGVmaW5lIGRlZmxhdGVQYXJhbXMgICAgICAgICB6X2RlZmxhdGVQYXJhbXMKLSMgIGRlZmluZSBkZWZsYXRlUGVuZGluZyAgICAgICAgel9kZWZsYXRlUGVuZGluZwotIyAgZGVmaW5lIGRlZmxhdGVQcmltZSAgICAgICAgICB6X2RlZmxhdGVQcmltZQotIyAgZGVmaW5lIGRlZmxhdGVSZXNldCAgICAgICAgICB6X2RlZmxhdGVSZXNldAotIyAgZGVmaW5lIGRlZmxhdGVSZXNldEtlZXAgICAgICB6X2RlZmxhdGVSZXNldEtlZXAKLSMgIGRlZmluZSBkZWZsYXRlU2V0RGljdGlvbmFyeSAgel9kZWZsYXRlU2V0RGljdGlvbmFyeQotIyAgZGVmaW5lIGRlZmxhdGVTZXRIZWFkZXIgICAgICB6X2RlZmxhdGVTZXRIZWFkZXIKLSMgIGRlZmluZSBkZWZsYXRlVHVuZSAgICAgICAgICAgel9kZWZsYXRlVHVuZQotIyAgZGVmaW5lIGRlZmxhdGVfY29weXJpZ2h0ICAgICB6X2RlZmxhdGVfY29weXJpZ2h0Ci0jICBkZWZpbmUgZ2V0X2NyY190YWJsZSAgICAgICAgIHpfZ2V0X2NyY190YWJsZQotIyAgaWZuZGVmIFpfU09MTwotIyAgICBkZWZpbmUgZ3pfZXJyb3IgICAgICAgICAgICAgIHpfZ3pfZXJyb3IKLSMgICAgZGVmaW5lIGd6X2ludG1heCAgICAgICAgICAgICB6X2d6X2ludG1heAotIyAgICBkZWZpbmUgZ3pfc3Ryd2luZXJyb3IgICAgICAgIHpfZ3pfc3Ryd2luZXJyb3IKLSMgICAgZGVmaW5lIGd6YnVmZmVyICAgICAgICAgICAgICB6X2d6YnVmZmVyCi0jICAgIGRlZmluZSBnemNsZWFyZXJyICAgICAgICAgICAgel9nemNsZWFyZXJyCi0jICAgIGRlZmluZSBnemNsb3NlICAgICAgICAgICAgICAgel9nemNsb3NlCi0jICAgIGRlZmluZSBnemNsb3NlX3IgICAgICAgICAgICAgel9nemNsb3NlX3IKLSMgICAgZGVmaW5lIGd6Y2xvc2VfdyAgICAgICAgICAgICB6X2d6Y2xvc2VfdwotIyAgICBkZWZpbmUgZ3pkaXJlY3QgICAgICAgICAgICAgIHpfZ3pkaXJlY3QKLSMgICAgZGVmaW5lIGd6ZG9wZW4gICAgICAgICAgICAgICB6X2d6ZG9wZW4KLSMgICAgZGVmaW5lIGd6ZW9mICAgICAgICAgICAgICAgICB6X2d6ZW9mCi0jICAgIGRlZmluZSBnemVycm9yICAgICAgICAgICAgICAgel9nemVycm9yCi0jICAgIGRlZmluZSBnemZsdXNoICAgICAgICAgICAgICAgel9nemZsdXNoCi0jICAgIGRlZmluZSBnemdldGMgICAgICAgICAgICAgICAgel9nemdldGMKLSMgICAgZGVmaW5lIGd6Z2V0Y18gICAgICAgICAgICAgICB6X2d6Z2V0Y18KLSMgICAgZGVmaW5lIGd6Z2V0cyAgICAgICAgICAgICAgICB6X2d6Z2V0cwotIyAgICBkZWZpbmUgZ3pvZmZzZXQgICAgICAgICAgICAgIHpfZ3pvZmZzZXQKLSMgICAgZGVmaW5lIGd6b2Zmc2V0NjQgICAgICAgICAgICB6X2d6b2Zmc2V0NjQKLSMgICAgZGVmaW5lIGd6b3BlbiAgICAgICAgICAgICAgICB6X2d6b3BlbgotIyAgICBkZWZpbmUgZ3pvcGVuNjQgICAgICAgICAgICAgIHpfZ3pvcGVuNjQKLSMgICAgaWZkZWYgX1dJTjMyCi0jICAgICAgZGVmaW5lIGd6b3Blbl93ICAgICAgICAgICAgICB6X2d6b3Blbl93Ci0jICAgIGVuZGlmCi0jICAgIGRlZmluZSBnenByaW50ZiAgICAgICAgICAgICAgel9nenByaW50ZgotIyAgICBkZWZpbmUgZ3pwdXRjICAgICAgICAgICAgICAgIHpfZ3pwdXRjCi0jICAgIGRlZmluZSBnenB1dHMgICAgICAgICAgICAgICAgel9nenB1dHMKLSMgICAgZGVmaW5lIGd6cmVhZCAgICAgICAgICAgICAgICB6X2d6cmVhZAotIyAgICBkZWZpbmUgZ3pyZXdpbmQgICAgICAgICAgICAgIHpfZ3pyZXdpbmQKLSMgICAgZGVmaW5lIGd6c2VlayAgICAgICAgICAgICAgICB6X2d6c2VlawotIyAgICBkZWZpbmUgZ3pzZWVrNjQgICAgICAgICAgICAgIHpfZ3pzZWVrNjQKLSMgICAgZGVmaW5lIGd6c2V0cGFyYW1zICAgICAgICAgICB6X2d6c2V0cGFyYW1zCi0jICAgIGRlZmluZSBnenRlbGwgICAgICAgICAgICAgICAgel9nenRlbGwKLSMgICAgZGVmaW5lIGd6dGVsbDY0ICAgICAgICAgICAgICB6X2d6dGVsbDY0Ci0jICAgIGRlZmluZSBnenVuZ2V0YyAgICAgICAgICAgICAgel9nenVuZ2V0YwotIyAgICBkZWZpbmUgZ3p3cml0ZSAgICAgICAgICAgICAgIHpfZ3p3cml0ZQotIyAgZW5kaWYKLSMgIGRlZmluZSBpbmZsYXRlICAgICAgICAgICAgICAgel9pbmZsYXRlCi0jICBkZWZpbmUgaW5mbGF0ZUJhY2sgICAgICAgICAgIHpfaW5mbGF0ZUJhY2sKLSMgIGRlZmluZSBpbmZsYXRlQmFja0VuZCAgICAgICAgel9pbmZsYXRlQmFja0VuZAotIyAgZGVmaW5lIGluZmxhdGVCYWNrSW5pdF8gICAgICB6X2luZmxhdGVCYWNrSW5pdF8KLSMgIGRlZmluZSBpbmZsYXRlQ29weSAgICAgICAgICAgel9pbmZsYXRlQ29weQotIyAgZGVmaW5lIGluZmxhdGVFbmQgICAgICAgICAgICB6X2luZmxhdGVFbmQKLSMgIGRlZmluZSBpbmZsYXRlR2V0SGVhZGVyICAgICAgel9pbmZsYXRlR2V0SGVhZGVyCi0jICBkZWZpbmUgaW5mbGF0ZUluaXQyXyAgICAgICAgIHpfaW5mbGF0ZUluaXQyXwotIyAgZGVmaW5lIGluZmxhdGVJbml0XyAgICAgICAgICB6X2luZmxhdGVJbml0XwotIyAgZGVmaW5lIGluZmxhdGVNYXJrICAgICAgICAgICB6X2luZmxhdGVNYXJrCi0jICBkZWZpbmUgaW5mbGF0ZVByaW1lICAgICAgICAgIHpfaW5mbGF0ZVByaW1lCi0jICBkZWZpbmUgaW5mbGF0ZVJlc2V0ICAgICAgICAgIHpfaW5mbGF0ZVJlc2V0Ci0jICBkZWZpbmUgaW5mbGF0ZVJlc2V0MiAgICAgICAgIHpfaW5mbGF0ZVJlc2V0MgotIyAgZGVmaW5lIGluZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2luZmxhdGVTZXREaWN0aW9uYXJ5Ci0jICBkZWZpbmUgaW5mbGF0ZVN5bmMgICAgICAgICAgIHpfaW5mbGF0ZVN5bmMKLSMgIGRlZmluZSBpbmZsYXRlU3luY1BvaW50ICAgICAgel9pbmZsYXRlU3luY1BvaW50Ci0jICBkZWZpbmUgaW5mbGF0ZVVuZGVybWluZSAgICAgIHpfaW5mbGF0ZVVuZGVybWluZQotIyAgZGVmaW5lIGluZmxhdGVSZXNldEtlZXAgICAgICB6X2luZmxhdGVSZXNldEtlZXAKLSMgIGRlZmluZSBpbmZsYXRlX2NvcHlyaWdodCAgICAgel9pbmZsYXRlX2NvcHlyaWdodAotIyAgZGVmaW5lIGluZmxhdGVfZmFzdCAgICAgICAgICB6X2luZmxhdGVfZmFzdAotIyAgZGVmaW5lIGluZmxhdGVfdGFibGUgICAgICAgICB6X2luZmxhdGVfdGFibGUKLSMgIGlmbmRlZiBaX1NPTE8KLSMgICAgZGVmaW5lIHVuY29tcHJlc3MgICAgICAgICAgICB6X3VuY29tcHJlc3MKLSMgIGVuZGlmCi0jICBkZWZpbmUgekVycm9yICAgICAgICAgICAgICAgIHpfekVycm9yCi0jICBpZm5kZWYgWl9TT0xPCi0jICAgIGRlZmluZSB6Y2FsbG9jICAgICAgICAgICAgICAgel96Y2FsbG9jCi0jICAgIGRlZmluZSB6Y2ZyZWUgICAgICAgICAgICAgICAgel96Y2ZyZWUKLSMgIGVuZGlmCi0jICBkZWZpbmUgemxpYkNvbXBpbGVGbGFncyAgICAgIHpfemxpYkNvbXBpbGVGbGFncwotIyAgZGVmaW5lIHpsaWJWZXJzaW9uICAgICAgICAgICB6X3psaWJWZXJzaW9uCi0KLS8qIGFsbCB6bGliIHR5cGVkZWZzIGluIHpsaWIuaCBhbmQgemNvbmYuaCAqLwotIyAgZGVmaW5lIEJ5dGUgICAgICAgICAgICAgICAgICB6X0J5dGUKLSMgIGRlZmluZSBCeXRlZiAgICAgICAgICAgICAgICAgel9CeXRlZgotIyAgZGVmaW5lIGFsbG9jX2Z1bmMgICAgICAgICAgICB6X2FsbG9jX2Z1bmMKLSMgIGRlZmluZSBjaGFyZiAgICAgICAgICAgICAgICAgel9jaGFyZgotIyAgZGVmaW5lIGZyZWVfZnVuYyAgICAgICAgICAgICB6X2ZyZWVfZnVuYwotIyAgaWZuZGVmIFpfU09MTwotIyAgICBkZWZpbmUgZ3pGaWxlICAgICAgICAgICAgICAgIHpfZ3pGaWxlCi0jICBlbmRpZgotIyAgZGVmaW5lIGd6X2hlYWRlciAgICAgICAgICAgICB6X2d6X2hlYWRlcgotIyAgZGVmaW5lIGd6X2hlYWRlcnAgICAgICAgICAgICB6X2d6X2hlYWRlcnAKLSMgIGRlZmluZSBpbl9mdW5jICAgICAgICAgICAgICAgel9pbl9mdW5jCi0jICBkZWZpbmUgaW50ZiAgICAgICAgICAgICAgICAgIHpfaW50ZgotIyAgZGVmaW5lIG91dF9mdW5jICAgICAgICAgICAgICB6X291dF9mdW5jCi0jICBkZWZpbmUgdUludCAgICAgICAgICAgICAgICAgIHpfdUludAotIyAgZGVmaW5lIHVJbnRmICAgICAgICAgICAgICAgICB6X3VJbnRmCi0jICBkZWZpbmUgdUxvbmcgICAgICAgICAgICAgICAgIHpfdUxvbmcKLSMgIGRlZmluZSB1TG9uZ2YgICAgICAgICAgICAgICAgel91TG9uZ2YKLSMgIGRlZmluZSB2b2lkcCAgICAgICAgICAgICAgICAgel92b2lkcAotIyAgZGVmaW5lIHZvaWRwYyAgICAgICAgICAgICAgICB6X3ZvaWRwYwotIyAgZGVmaW5lIHZvaWRwZiAgICAgICAgICAgICAgICB6X3ZvaWRwZgotCi0vKiBhbGwgemxpYiBzdHJ1Y3RzIGluIHpsaWIuaCBhbmQgemNvbmYuaCAqLwotIyAgZGVmaW5lIGd6X2hlYWRlcl9zICAgICAgICAgICB6X2d6X2hlYWRlcl9zCi0jICBkZWZpbmUgaW50ZXJuYWxfc3RhdGUgICAgICAgIHpfaW50ZXJuYWxfc3RhdGUKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fTVNET1NfXykgJiYgIWRlZmluZWQoTVNET1MpCi0jICBkZWZpbmUgTVNET1MKLSNlbmRpZgotI2lmIChkZWZpbmVkKE9TXzIpIHx8IGRlZmluZWQoX19PUzJfXykpICYmICFkZWZpbmVkKE9TMikKLSMgIGRlZmluZSBPUzIKLSNlbmRpZgotI2lmIGRlZmluZWQoX1dJTkRPV1MpICYmICFkZWZpbmVkKFdJTkRPV1MpCi0jICBkZWZpbmUgV0lORE9XUwotI2VuZGlmCi0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkgfHwgZGVmaW5lZChfX1dJTjMyX18pCi0jICBpZm5kZWYgV0lOMzIKLSMgICAgZGVmaW5lIFdJTjMyCi0jICBlbmRpZgotI2VuZGlmCi0jaWYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTkRPV1MpKSAmJiAhZGVmaW5lZChXSU4zMikKLSMgIGlmICFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykgJiYgIWRlZmluZWQoX18zODZfXykKLSMgICAgaWZuZGVmIFNZUzE2QklUCi0jICAgICAgZGVmaW5lIFNZUzE2QklUCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qCi0gKiBDb21waWxlIHdpdGggLURNQVhTRUdfNjRLIGlmIHRoZSBhbGxvYyBmdW5jdGlvbiBjYW5ub3QgYWxsb2NhdGUgbW9yZQotICogdGhhbiA2NGsgYnl0ZXMgYXQgYSB0aW1lIChuZWVkZWQgb24gc3lzdGVtcyB3aXRoIDE2LWJpdCBpbnQpLgotICovCi0jaWZkZWYgU1lTMTZCSVQKLSMgIGRlZmluZSBNQVhTRUdfNjRLCi0jZW5kaWYKLSNpZmRlZiBNU0RPUwotIyAgZGVmaW5lIFVOQUxJR05FRF9PSwotI2VuZGlmCi0KLSNpZmRlZiBfX1NURENfVkVSU0lPTl9fCi0jICBpZm5kZWYgU1REQwotIyAgICBkZWZpbmUgU1REQwotIyAgZW5kaWYKLSMgIGlmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAotIyAgICBpZm5kZWYgU1REQzk5Ci0jICAgICAgZGVmaW5lIFNUREM5OQotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKSkKLSMgIGRlZmluZSBTVERDCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pKQotIyAgZGVmaW5lIFNUREMKLSNlbmRpZgotI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpKQotIyAgZGVmaW5lIFNUREMKLSNlbmRpZgotI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChfX0hPU19BSVhfXykpCi0jICBkZWZpbmUgU1REQwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fT1M0MDBfXykgJiYgIWRlZmluZWQoU1REQykgICAgLyogaVNlcmllcyAoZm9ybWVybHkgQVMvNDAwKS4gKi8KLSMgIGRlZmluZSBTVERDCi0jZW5kaWYKLQotI2lmbmRlZiBTVERDCi0jICBpZm5kZWYgY29uc3QgLyogY2Fubm90IHVzZSAhZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChjb25zdCkgb24gTWFjICovCi0jICAgIGRlZmluZSBjb25zdCAgICAgICAvKiBub3RlOiBuZWVkIGEgbW9yZSBnZW50bGUgc29sdXRpb24gaGVyZSAqLwotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChaTElCX0NPTlNUKSAmJiAhZGVmaW5lZCh6X2NvbnN0KQotIyAgZGVmaW5lIHpfY29uc3QgY29uc3QKLSNlbHNlCi0jICBkZWZpbmUgel9jb25zdAotI2VuZGlmCi0KLS8qIFNvbWUgTWFjIGNvbXBpbGVycyBtZXJnZSBhbGwgLmggZmlsZXMgaW5jb3JyZWN0bHk6ICovCi0jaWYgZGVmaW5lZChfX01XRVJLU19fKXx8ZGVmaW5lZChhcHBsZWMpfHxkZWZpbmVkKFRISU5LX0MpfHxkZWZpbmVkKF9fU0NfXykKLSMgIGRlZmluZSBOT19EVU1NWV9ERUNMCi0jZW5kaWYKLQotLyogTWF4aW11bSB2YWx1ZSBmb3IgbWVtTGV2ZWwgaW4gZGVmbGF0ZUluaXQyICovCi0jaWZuZGVmIE1BWF9NRU1fTEVWRUwKLSMgIGlmZGVmIE1BWFNFR182NEsKLSMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOAotIyAgZWxzZQotIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA5Ci0jICBlbmRpZgotI2VuZGlmCi0KLS8qIE1heGltdW0gdmFsdWUgZm9yIHdpbmRvd0JpdHMgaW4gZGVmbGF0ZUluaXQyIGFuZCBpbmZsYXRlSW5pdDIuCi0gKiBXQVJOSU5HOiByZWR1Y2luZyBNQVhfV0JJVFMgbWFrZXMgbWluaWd6aXAgdW5hYmxlIHRvIGV4dHJhY3QgLmd6IGZpbGVzCi0gKiBjcmVhdGVkIGJ5IGd6aXAuIChGaWxlcyBjcmVhdGVkIGJ5IG1pbmlnemlwIGNhbiBzdGlsbCBiZSBleHRyYWN0ZWQgYnkKLSAqIGd6aXAuKQotICovCi0jaWZuZGVmIE1BWF9XQklUUwotIyAgZGVmaW5lIE1BWF9XQklUUyAgIDE1IC8qIDMySyBMWjc3IHdpbmRvdyAqLwotI2VuZGlmCi0KLS8qIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBkZWZsYXRlIGFyZSAoaW4gYnl0ZXMpOgotICAgICAgICAgICAgKDEgPDwgKHdpbmRvd0JpdHMrMikpICsgICgxIDw8IChtZW1MZXZlbCs5KSkKLSB0aGF0IGlzOiAxMjhLIGZvciB3aW5kb3dCaXRzPTE1ICArICAxMjhLIGZvciBtZW1MZXZlbCA9IDggIChkZWZhdWx0IHZhbHVlcykKLSBwbHVzIGEgZmV3IGtpbG9ieXRlcyBmb3Igc21hbGwgb2JqZWN0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHJlZHVjZQotIHRoZSBkZWZhdWx0IG1lbW9yeSByZXF1aXJlbWVudHMgZnJvbSAyNTZLIHRvIDEyOEssIGNvbXBpbGUgd2l0aAotICAgICBtYWtlIENGTEFHUz0iLU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTciCi0gT2YgY291cnNlIHRoaXMgd2lsbCBnZW5lcmFsbHkgZGVncmFkZSBjb21wcmVzc2lvbiAodGhlcmUncyBubyBmcmVlIGx1bmNoKS4KLQotICAgVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGluZmxhdGUgYXJlIChpbiBieXRlcykgMSA8PCB3aW5kb3dCaXRzCi0gdGhhdCBpcywgMzJLIGZvciB3aW5kb3dCaXRzPTE1IChkZWZhdWx0IHZhbHVlKSBwbHVzIGEgZmV3IGtpbG9ieXRlcwotIGZvciBzbWFsbCBvYmplY3RzLgotKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KLQotI2lmbmRlZiBPRiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCi0jICBpZmRlZiBTVERDCi0jICAgIGRlZmluZSBPRihhcmdzKSAgYXJncwotIyAgZWxzZQotIyAgICBkZWZpbmUgT0YoYXJncykgICgpCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgWl9BUkcgLyogZnVuY3Rpb24gcHJvdG90eXBlcyBmb3Igc3RkYXJnICovCi0jICBpZiBkZWZpbmVkKFNUREMpIHx8IGRlZmluZWQoWl9IQVZFX1NUREFSR19IKQotIyAgICBkZWZpbmUgWl9BUkcoYXJncykgIGFyZ3MKLSMgIGVsc2UKLSMgICAgZGVmaW5lIFpfQVJHKGFyZ3MpICAoKQotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGZvciBGQVIgYXJlIG5lZWRlZCBvbmx5IGZvciBNU0RPUyBtaXhlZAotICogbW9kZWwgcHJvZ3JhbW1pbmcgKHNtYWxsIG9yIG1lZGl1bSBtb2RlbCB3aXRoIHNvbWUgZmFyIGFsbG9jYXRpb25zKS4KLSAqIFRoaXMgd2FzIHRlc3RlZCBvbmx5IHdpdGggTVNDOyBmb3Igb3RoZXIgTVNET1MgY29tcGlsZXJzIHlvdSBtYXkgaGF2ZQotICogdG8gZGVmaW5lIE5PX01FTUNQWSBpbiB6dXRpbC5oLiAgSWYgeW91IGRvbid0IG5lZWQgdGhlIG1peGVkIG1vZGVsLAotICoganVzdCBkZWZpbmUgRkFSIHRvIGJlIGVtcHR5LgotICovCi0jaWZkZWYgU1lTMTZCSVQKLSMgIGlmIGRlZmluZWQoTV9JODZTTSkgfHwgZGVmaW5lZChNX0k4Nk1NKQotICAgICAvKiBNU0Mgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCi0jICAgIGRlZmluZSBTTUFMTF9NRURJVU0KLSMgICAgaWZkZWYgX01TQ19WRVIKLSMgICAgICBkZWZpbmUgRkFSIF9mYXIKLSMgICAgZWxzZQotIyAgICAgIGRlZmluZSBGQVIgZmFyCi0jICAgIGVuZGlmCi0jICBlbmRpZgotIyAgaWYgKGRlZmluZWQoX19TTUFMTF9fKSB8fCBkZWZpbmVkKF9fTUVESVVNX18pKQotICAgICAvKiBUdXJibyBDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLwotIyAgICBkZWZpbmUgU01BTExfTUVESVVNCi0jICAgIGlmZGVmIF9fQk9STEFORENfXwotIyAgICAgIGRlZmluZSBGQVIgX2ZhcgotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIEZBUiBmYXIKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikKLSAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgYXMgYSBETEwsIGRlZmluZSBaTElCX0RMTC4KLSAgICAqIFRoaXMgaXMgbm90IG1hbmRhdG9yeSwgYnV0IGl0IG9mZmVycyBhIGxpdHRsZSBwZXJmb3JtYW5jZSBpbmNyZWFzZS4KLSAgICAqLwotIyAgaWZkZWYgWkxJQl9ETEwKLSMgICAgaWYgZGVmaW5lZChXSU4zMikgJiYgKCFkZWZpbmVkKF9fQk9STEFORENfXykgfHwgKF9fQk9STEFORENfXyA+PSAweDUwMCkpCi0jICAgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAotIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyAgICAgIGVsc2UKLSMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYgIC8qIFpMSUJfRExMICovCi0gICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIHdpdGggdGhlIFdJTkFQSS9XSU5BUElWIGNhbGxpbmcgY29udmVudGlvbiwKLSAgICAqIGRlZmluZSBaTElCX1dJTkFQSS4KLSAgICAqIENhdXRpb246IHRoZSBzdGFuZGFyZCBaTElCMS5ETEwgaXMgTk9UIGNvbXBpbGVkIHVzaW5nIFpMSUJfV0lOQVBJLgotICAgICovCi0jICBpZmRlZiBaTElCX1dJTkFQSQotIyAgICBpZmRlZiBGQVIKLSMgICAgICB1bmRlZiBGQVIKLSMgICAgZW5kaWYKLSMgICAgaW5jbHVkZSA8d2luZG93cy5oPgotICAgICAvKiBObyBuZWVkIGZvciBfZXhwb3J0LCB1c2UgWkxJQi5ERUYgaW5zdGVhZC4gKi8KLSAgICAgLyogRm9yIGNvbXBsZXRlIFdpbmRvd3MgY29tcGF0aWJpbGl0eSwgdXNlIFdJTkFQSSwgbm90IF9fc3RkY2FsbC4gKi8KLSMgICAgZGVmaW5lIFpFWFBPUlQgV0lOQVBJCi0jICAgIGlmZGVmIFdJTjMyCi0jICAgICAgZGVmaW5lIFpFWFBPUlRWQSBXSU5BUElWCi0jICAgIGVsc2UKLSMgICAgICBkZWZpbmUgWkVYUE9SVFZBIEZBUiBDREVDTAotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19CRU9TX18pCi0jICBpZmRlZiBaTElCX0RMTAotIyAgICBpZmRlZiBaTElCX0lOVEVSTkFMCi0jICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFpFWFRFUk4KLSMgIGRlZmluZSBaRVhURVJOIGV4dGVybgotI2VuZGlmCi0jaWZuZGVmIFpFWFBPUlQKLSMgIGRlZmluZSBaRVhQT1JUCi0jZW5kaWYKLSNpZm5kZWYgWkVYUE9SVFZBCi0jICBkZWZpbmUgWkVYUE9SVFZBCi0jZW5kaWYKLQotI2lmbmRlZiBGQVIKLSMgIGRlZmluZSBGQVIKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX19NQUNUWVBFU19fKQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICBCeXRlOyAgLyogOCBiaXRzICovCi0jZW5kaWYKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgdUludDsgIC8qIDE2IGJpdHMgb3IgbW9yZSAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICB1TG9uZzsgLyogMzIgYml0cyBvciBtb3JlICovCi0KLSNpZmRlZiBTTUFMTF9NRURJVU0KLSAgIC8qIEJvcmxhbmQgQy9DKysgYW5kIHNvbWUgb2xkIE1TQyB2ZXJzaW9ucyBpZ25vcmUgRkFSIGluc2lkZSB0eXBlZGVmICovCi0jICBkZWZpbmUgQnl0ZWYgQnl0ZSBGQVIKLSNlbHNlCi0gICB0eXBlZGVmIEJ5dGUgIEZBUiBCeXRlZjsKLSNlbmRpZgotdHlwZWRlZiBjaGFyICBGQVIgY2hhcmY7Ci10eXBlZGVmIGludCAgIEZBUiBpbnRmOwotdHlwZWRlZiB1SW50ICBGQVIgdUludGY7Ci10eXBlZGVmIHVMb25nIEZBUiB1TG9uZ2Y7Ci0KLSNpZmRlZiBTVERDCi0gICB0eXBlZGVmIHZvaWQgY29uc3QgKnZvaWRwYzsKLSAgIHR5cGVkZWYgdm9pZCBGQVIgICAqdm9pZHBmOwotICAgdHlwZWRlZiB2b2lkICAgICAgICp2b2lkcDsKLSNlbHNlCi0gICB0eXBlZGVmIEJ5dGUgY29uc3QgKnZvaWRwYzsKLSAgIHR5cGVkZWYgQnl0ZSBGQVIgICAqdm9pZHBmOwotICAgdHlwZWRlZiBCeXRlICAgICAgICp2b2lkcDsKLSNlbmRpZgotCi0vKiAuL2NvbmZpZ3VyZSBtYXkgI2RlZmluZSBaX1U0IGhlcmUgKi8KLQotI2lmICFkZWZpbmVkKFpfVTQpICYmICFkZWZpbmVkKFpfU09MTykgJiYgZGVmaW5lZChTVERDKQotIyAgaW5jbHVkZSA8bGltaXRzLmg+Ci0jICBpZiAoVUlOVF9NQVggPT0gMHhmZmZmZmZmZlVMKQotIyAgICBkZWZpbmUgWl9VNCB1bnNpZ25lZAotIyAgZWxzZQotIyAgICBpZiAoVUxPTkdfTUFYID09IDB4ZmZmZmZmZmZVTCkKLSMgICAgICBkZWZpbmUgWl9VNCB1bnNpZ25lZCBsb25nCi0jICAgIGVsc2UKLSMgICAgICBpZiAoVVNIUlRfTUFYID09IDB4ZmZmZmZmZmZVTCkKLSMgICAgICAgIGRlZmluZSBaX1U0IHVuc2lnbmVkIHNob3J0Ci0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFpfVTQKLSAgIHR5cGVkZWYgWl9VNCB6X2NyY190OwotI2Vsc2UKLSAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyB6X2NyY190OwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9IICAgIC8qIG1heSBiZSBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KLSMgIGRlZmluZSBaX0hBVkVfVU5JU1REX0gKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERBUkdfSCAgICAvKiBtYXkgYmUgc2V0IHRvICNpZiAxIGJ5IC4vY29uZmlndXJlICovCi0jICBkZWZpbmUgWl9IQVZFX1NUREFSR19ICi0jZW5kaWYKLQotI2lmZGVmIFNUREMKLSMgIGlmbmRlZiBaX1NPTE8KLSMgICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAgICAgLyogZm9yIG9mZl90ICovCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfV0lOMzIKLSMgIGluY2x1ZGUgPHN0ZGRlZi5oPiAgICAgICAgICAgLyogZm9yIHdjaGFyX3QgKi8KLSNlbmRpZgotCi0vKiBhIGxpdHRsZSB0cmljayB0byBhY2NvbW1vZGF0ZSBib3RoICIjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UiIGFuZAotICogIiNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRSAxIiBhcyByZXF1ZXN0aW5nIDY0LWJpdCBvcGVyYXRpb25zLCAoZXZlbgotICogdGhvdWdoIHRoZSBmb3JtZXIgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgTEZTIGRvY3VtZW50KSwgYnV0IGNvbnNpZGVyaW5nCi0gKiBib3RoICIjdW5kZWYgX0xBUkdFRklMRTY0X1NPVVJDRSIgYW5kICIjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgMCIgYXMKLSAqIGVxdWl2YWxlbnRseSByZXF1ZXN0aW5nIG5vIDY0LWJpdCBvcGVyYXRpb25zCi0gKi8KLSNpZiBkZWZpbmVkKExBUkdFRklMRTY0X1NPVVJDRSkgJiYgLV9MQVJHRUZJTEU2NF9TT1VSQ0UgLSAtMSA9PSAxCi0jICB1bmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19XQVRDT01DX18pICYmICFkZWZpbmVkKFpfSEFWRV9VTklTVERfSCkKLSMgIGRlZmluZSBaX0hBVkVfVU5JU1REX0gKLSNlbmRpZgotI2lmbmRlZiBaX1NPTE8KLSMgIGlmIGRlZmluZWQoWl9IQVZFX1VOSVNURF9IKSB8fCBkZWZpbmVkKExBUkdFRklMRTY0X1NPVVJDRSkKLSMgICAgaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgICAgLyogZm9yIFNFRUtfKiwgb2ZmX3QsIGFuZCBfTEZTNjRfTEFSR0VGSUxFICovCi0jICAgIGlmZGVmIFZNUwotIyAgICAgIGluY2x1ZGUgPHVuaXhpby5oPiAgICAgICAvKiBmb3Igb2ZmX3QgKi8KLSMgICAgZW5kaWYKLSMgICAgaWZuZGVmIHpfb2ZmX3QKLSMgICAgICBkZWZpbmUgel9vZmZfdCBvZmZfdAotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfTEZTNjRfTEFSR0VGSUxFKSAmJiBfTEZTNjRfTEFSR0VGSUxFLTAKLSMgIGRlZmluZSBaX0xGUzY0Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkgJiYgZGVmaW5lZChaX0xGUzY0KQotIyAgZGVmaW5lIFpfTEFSR0U2NAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9GSUxFX09GRlNFVF9CSVRTKSAmJiBfRklMRV9PRkZTRVRfQklUUy0wID09IDY0ICYmIGRlZmluZWQoWl9MRlM2NCkKLSMgIGRlZmluZSBaX1dBTlQ2NAotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChTRUVLX1NFVCkgJiYgIWRlZmluZWQoWl9TT0xPKQotIyAgZGVmaW5lIFNFRUtfU0VUICAgICAgICAwICAgICAgIC8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCi0jICBkZWZpbmUgU0VFS19DVVIgICAgICAgIDEgICAgICAgLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLwotIyAgZGVmaW5lIFNFRUtfRU5EICAgICAgICAyICAgICAgIC8qIFNldCBmaWxlIHBvaW50ZXIgdG8gRU9GIHBsdXMgIm9mZnNldCIgKi8KLSNlbmRpZgotCi0jaWZuZGVmIHpfb2ZmX3QKLSMgIGRlZmluZSB6X29mZl90IGxvbmcKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKFpfTEFSR0U2NCkKLSMgIGRlZmluZSB6X29mZjY0X3Qgb2ZmNjRfdAotI2Vsc2UKLSMgIGlmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoWl9TT0xPKQotIyAgICBkZWZpbmUgel9vZmY2NF90IF9faW50NjQKLSMgIGVsc2UKLSMgICAgZGVmaW5lIHpfb2ZmNjRfdCB6X29mZl90Ci0jICBlbmRpZgotI2VuZGlmCi0KLS8qIE1WUyBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBleHRlcm5hbCBuYW1lcyBsYXJnZXIgdGhhbiA4IGJ5dGVzICovCi0jaWYgZGVmaW5lZChfX01WU19fKQotICAjcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQotICAjcHJhZ21hIG1hcChkZWZsYXRlSW5pdDJfLCJERUlOMiIpCi0gICNwcmFnbWEgbWFwKGRlZmxhdGVFbmQsIkRFRU5EIikKLSAgI3ByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVJbml0XywiSU5JTiIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVJbml0Ml8sIklOSU4yIikKLSAgI3ByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQotICAjcHJhZ21hIG1hcChpbmZsYXRlU3luYywiSU5TWSIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVTZXREaWN0aW9uYXJ5LCJJTlNFREkiKQotICAjcHJhZ21hIG1hcChjb21wcmVzc0JvdW5kLCJDTUJORCIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVfdGFibGUsIklOVEFCTCIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVfZmFzdCwiSU5GQSIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBaQ09ORl9IICovCmRpZmYgLS1naXQgYS9zcmMvemxpYi96Y29uZi5oLmNtYWtlaW4gYi9zcmMvemxpYi96Y29uZi5oLmNtYWtlaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2Y2E1OWEuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvemNvbmYuaC5jbWFrZWluCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qIHpjb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMiBKZWFuLWxvdXAgR2FpbGx5LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIEAoIykgJElkJCAqLwotCi0jaWZuZGVmIFpDT05GX0gKLSNkZWZpbmUgWkNPTkZfSAotI2NtYWtlZGVmaW5lIFpfUFJFRklYCi0jY21ha2VkZWZpbmUgWl9IQVZFX1VOSVNURF9ICi0KLS8qCi0gKiBJZiB5b3UgKnJlYWxseSogbmVlZCBhIHVuaXF1ZSBwcmVmaXggZm9yIGFsbCB0eXBlcyBhbmQgbGlicmFyeSBmdW5jdGlvbnMsCi0gKiBjb21waWxlIHdpdGggLURaX1BSRUZJWC4gVGhlICJzdGFuZGFyZCIgemxpYiBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBpdC4KLSAqIEV2ZW4gYmV0dGVyIHRoYW4gY29tcGlsaW5nIHdpdGggLURaX1BSRUZJWCB3b3VsZCBiZSB0byB1c2UgY29uZmlndXJlIHRvIHNldAotICogdGhpcyBwZXJtYW5lbnRseSBpbiB6Y29uZi5oIHVzaW5nICIuL2NvbmZpZ3VyZSAtLXpwcmVmaXgiLgotICovCi0jaWZkZWYgWl9QUkVGSVggICAgIC8qIG1heSBiZSBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KLSMgIGRlZmluZSBaX1BSRUZJWF9TRVQKLQotLyogYWxsIGxpbmtlZCBzeW1ib2xzICovCi0jICBkZWZpbmUgX2Rpc3RfY29kZSAgICAgICAgICAgIHpfX2Rpc3RfY29kZQotIyAgZGVmaW5lIF9sZW5ndGhfY29kZSAgICAgICAgICB6X19sZW5ndGhfY29kZQotIyAgZGVmaW5lIF90cl9hbGlnbiAgICAgICAgICAgICB6X190cl9hbGlnbgotIyAgZGVmaW5lIF90cl9mbHVzaF9ibG9jayAgICAgICB6X190cl9mbHVzaF9ibG9jawotIyAgZGVmaW5lIF90cl9pbml0ICAgICAgICAgICAgICB6X190cl9pbml0Ci0jICBkZWZpbmUgX3RyX3N0b3JlZF9ibG9jayAgICAgIHpfX3RyX3N0b3JlZF9ibG9jawotIyAgZGVmaW5lIF90cl90YWxseSAgICAgICAgICAgICB6X190cl90YWxseQotIyAgZGVmaW5lIGFkbGVyMzIgICAgICAgICAgICAgICB6X2FkbGVyMzIKLSMgIGRlZmluZSBhZGxlcjMyX2NvbWJpbmUgICAgICAgel9hZGxlcjMyX2NvbWJpbmUKLSMgIGRlZmluZSBhZGxlcjMyX2NvbWJpbmU2NCAgICAgel9hZGxlcjMyX2NvbWJpbmU2NAotIyAgaWZuZGVmIFpfU09MTwotIyAgICBkZWZpbmUgY29tcHJlc3MgICAgICAgICAgICAgIHpfY29tcHJlc3MKLSMgICAgZGVmaW5lIGNvbXByZXNzMiAgICAgICAgICAgICB6X2NvbXByZXNzMgotIyAgICBkZWZpbmUgY29tcHJlc3NCb3VuZCAgICAgICAgIHpfY29tcHJlc3NCb3VuZAotIyAgZW5kaWYKLSMgIGRlZmluZSBjcmMzMiAgICAgICAgICAgICAgICAgel9jcmMzMgotIyAgZGVmaW5lIGNyYzMyX2NvbWJpbmUgICAgICAgICB6X2NyYzMyX2NvbWJpbmUKLSMgIGRlZmluZSBjcmMzMl9jb21iaW5lNjQgICAgICAgel9jcmMzMl9jb21iaW5lNjQKLSMgIGRlZmluZSBkZWZsYXRlICAgICAgICAgICAgICAgel9kZWZsYXRlCi0jICBkZWZpbmUgZGVmbGF0ZUJvdW5kICAgICAgICAgIHpfZGVmbGF0ZUJvdW5kCi0jICBkZWZpbmUgZGVmbGF0ZUNvcHkgICAgICAgICAgIHpfZGVmbGF0ZUNvcHkKLSMgIGRlZmluZSBkZWZsYXRlRW5kICAgICAgICAgICAgel9kZWZsYXRlRW5kCi0jICBkZWZpbmUgZGVmbGF0ZUluaXQyXyAgICAgICAgIHpfZGVmbGF0ZUluaXQyXwotIyAgZGVmaW5lIGRlZmxhdGVJbml0XyAgICAgICAgICB6X2RlZmxhdGVJbml0XwotIyAgZGVmaW5lIGRlZmxhdGVQYXJhbXMgICAgICAgICB6X2RlZmxhdGVQYXJhbXMKLSMgIGRlZmluZSBkZWZsYXRlUGVuZGluZyAgICAgICAgel9kZWZsYXRlUGVuZGluZwotIyAgZGVmaW5lIGRlZmxhdGVQcmltZSAgICAgICAgICB6X2RlZmxhdGVQcmltZQotIyAgZGVmaW5lIGRlZmxhdGVSZXNldCAgICAgICAgICB6X2RlZmxhdGVSZXNldAotIyAgZGVmaW5lIGRlZmxhdGVSZXNldEtlZXAgICAgICB6X2RlZmxhdGVSZXNldEtlZXAKLSMgIGRlZmluZSBkZWZsYXRlU2V0RGljdGlvbmFyeSAgel9kZWZsYXRlU2V0RGljdGlvbmFyeQotIyAgZGVmaW5lIGRlZmxhdGVTZXRIZWFkZXIgICAgICB6X2RlZmxhdGVTZXRIZWFkZXIKLSMgIGRlZmluZSBkZWZsYXRlVHVuZSAgICAgICAgICAgel9kZWZsYXRlVHVuZQotIyAgZGVmaW5lIGRlZmxhdGVfY29weXJpZ2h0ICAgICB6X2RlZmxhdGVfY29weXJpZ2h0Ci0jICBkZWZpbmUgZ2V0X2NyY190YWJsZSAgICAgICAgIHpfZ2V0X2NyY190YWJsZQotIyAgaWZuZGVmIFpfU09MTwotIyAgICBkZWZpbmUgZ3pfZXJyb3IgICAgICAgICAgICAgIHpfZ3pfZXJyb3IKLSMgICAgZGVmaW5lIGd6X2ludG1heCAgICAgICAgICAgICB6X2d6X2ludG1heAotIyAgICBkZWZpbmUgZ3pfc3Ryd2luZXJyb3IgICAgICAgIHpfZ3pfc3Ryd2luZXJyb3IKLSMgICAgZGVmaW5lIGd6YnVmZmVyICAgICAgICAgICAgICB6X2d6YnVmZmVyCi0jICAgIGRlZmluZSBnemNsZWFyZXJyICAgICAgICAgICAgel9nemNsZWFyZXJyCi0jICAgIGRlZmluZSBnemNsb3NlICAgICAgICAgICAgICAgel9nemNsb3NlCi0jICAgIGRlZmluZSBnemNsb3NlX3IgICAgICAgICAgICAgel9nemNsb3NlX3IKLSMgICAgZGVmaW5lIGd6Y2xvc2VfdyAgICAgICAgICAgICB6X2d6Y2xvc2VfdwotIyAgICBkZWZpbmUgZ3pkaXJlY3QgICAgICAgICAgICAgIHpfZ3pkaXJlY3QKLSMgICAgZGVmaW5lIGd6ZG9wZW4gICAgICAgICAgICAgICB6X2d6ZG9wZW4KLSMgICAgZGVmaW5lIGd6ZW9mICAgICAgICAgICAgICAgICB6X2d6ZW9mCi0jICAgIGRlZmluZSBnemVycm9yICAgICAgICAgICAgICAgel9nemVycm9yCi0jICAgIGRlZmluZSBnemZsdXNoICAgICAgICAgICAgICAgel9nemZsdXNoCi0jICAgIGRlZmluZSBnemdldGMgICAgICAgICAgICAgICAgel9nemdldGMKLSMgICAgZGVmaW5lIGd6Z2V0Y18gICAgICAgICAgICAgICB6X2d6Z2V0Y18KLSMgICAgZGVmaW5lIGd6Z2V0cyAgICAgICAgICAgICAgICB6X2d6Z2V0cwotIyAgICBkZWZpbmUgZ3pvZmZzZXQgICAgICAgICAgICAgIHpfZ3pvZmZzZXQKLSMgICAgZGVmaW5lIGd6b2Zmc2V0NjQgICAgICAgICAgICB6X2d6b2Zmc2V0NjQKLSMgICAgZGVmaW5lIGd6b3BlbiAgICAgICAgICAgICAgICB6X2d6b3BlbgotIyAgICBkZWZpbmUgZ3pvcGVuNjQgICAgICAgICAgICAgIHpfZ3pvcGVuNjQKLSMgICAgaWZkZWYgX1dJTjMyCi0jICAgICAgZGVmaW5lIGd6b3Blbl93ICAgICAgICAgICAgICB6X2d6b3Blbl93Ci0jICAgIGVuZGlmCi0jICAgIGRlZmluZSBnenByaW50ZiAgICAgICAgICAgICAgel9nenByaW50ZgotIyAgICBkZWZpbmUgZ3pwdXRjICAgICAgICAgICAgICAgIHpfZ3pwdXRjCi0jICAgIGRlZmluZSBnenB1dHMgICAgICAgICAgICAgICAgel9nenB1dHMKLSMgICAgZGVmaW5lIGd6cmVhZCAgICAgICAgICAgICAgICB6X2d6cmVhZAotIyAgICBkZWZpbmUgZ3pyZXdpbmQgICAgICAgICAgICAgIHpfZ3pyZXdpbmQKLSMgICAgZGVmaW5lIGd6c2VlayAgICAgICAgICAgICAgICB6X2d6c2VlawotIyAgICBkZWZpbmUgZ3pzZWVrNjQgICAgICAgICAgICAgIHpfZ3pzZWVrNjQKLSMgICAgZGVmaW5lIGd6c2V0cGFyYW1zICAgICAgICAgICB6X2d6c2V0cGFyYW1zCi0jICAgIGRlZmluZSBnenRlbGwgICAgICAgICAgICAgICAgel9nenRlbGwKLSMgICAgZGVmaW5lIGd6dGVsbDY0ICAgICAgICAgICAgICB6X2d6dGVsbDY0Ci0jICAgIGRlZmluZSBnenVuZ2V0YyAgICAgICAgICAgICAgel9nenVuZ2V0YwotIyAgICBkZWZpbmUgZ3p3cml0ZSAgICAgICAgICAgICAgIHpfZ3p3cml0ZQotIyAgZW5kaWYKLSMgIGRlZmluZSBpbmZsYXRlICAgICAgICAgICAgICAgel9pbmZsYXRlCi0jICBkZWZpbmUgaW5mbGF0ZUJhY2sgICAgICAgICAgIHpfaW5mbGF0ZUJhY2sKLSMgIGRlZmluZSBpbmZsYXRlQmFja0VuZCAgICAgICAgel9pbmZsYXRlQmFja0VuZAotIyAgZGVmaW5lIGluZmxhdGVCYWNrSW5pdF8gICAgICB6X2luZmxhdGVCYWNrSW5pdF8KLSMgIGRlZmluZSBpbmZsYXRlQ29weSAgICAgICAgICAgel9pbmZsYXRlQ29weQotIyAgZGVmaW5lIGluZmxhdGVFbmQgICAgICAgICAgICB6X2luZmxhdGVFbmQKLSMgIGRlZmluZSBpbmZsYXRlR2V0SGVhZGVyICAgICAgel9pbmZsYXRlR2V0SGVhZGVyCi0jICBkZWZpbmUgaW5mbGF0ZUluaXQyXyAgICAgICAgIHpfaW5mbGF0ZUluaXQyXwotIyAgZGVmaW5lIGluZmxhdGVJbml0XyAgICAgICAgICB6X2luZmxhdGVJbml0XwotIyAgZGVmaW5lIGluZmxhdGVNYXJrICAgICAgICAgICB6X2luZmxhdGVNYXJrCi0jICBkZWZpbmUgaW5mbGF0ZVByaW1lICAgICAgICAgIHpfaW5mbGF0ZVByaW1lCi0jICBkZWZpbmUgaW5mbGF0ZVJlc2V0ICAgICAgICAgIHpfaW5mbGF0ZVJlc2V0Ci0jICBkZWZpbmUgaW5mbGF0ZVJlc2V0MiAgICAgICAgIHpfaW5mbGF0ZVJlc2V0MgotIyAgZGVmaW5lIGluZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2luZmxhdGVTZXREaWN0aW9uYXJ5Ci0jICBkZWZpbmUgaW5mbGF0ZVN5bmMgICAgICAgICAgIHpfaW5mbGF0ZVN5bmMKLSMgIGRlZmluZSBpbmZsYXRlU3luY1BvaW50ICAgICAgel9pbmZsYXRlU3luY1BvaW50Ci0jICBkZWZpbmUgaW5mbGF0ZVVuZGVybWluZSAgICAgIHpfaW5mbGF0ZVVuZGVybWluZQotIyAgZGVmaW5lIGluZmxhdGVSZXNldEtlZXAgICAgICB6X2luZmxhdGVSZXNldEtlZXAKLSMgIGRlZmluZSBpbmZsYXRlX2NvcHlyaWdodCAgICAgel9pbmZsYXRlX2NvcHlyaWdodAotIyAgZGVmaW5lIGluZmxhdGVfZmFzdCAgICAgICAgICB6X2luZmxhdGVfZmFzdAotIyAgZGVmaW5lIGluZmxhdGVfdGFibGUgICAgICAgICB6X2luZmxhdGVfdGFibGUKLSMgIGlmbmRlZiBaX1NPTE8KLSMgICAgZGVmaW5lIHVuY29tcHJlc3MgICAgICAgICAgICB6X3VuY29tcHJlc3MKLSMgIGVuZGlmCi0jICBkZWZpbmUgekVycm9yICAgICAgICAgICAgICAgIHpfekVycm9yCi0jICBpZm5kZWYgWl9TT0xPCi0jICAgIGRlZmluZSB6Y2FsbG9jICAgICAgICAgICAgICAgel96Y2FsbG9jCi0jICAgIGRlZmluZSB6Y2ZyZWUgICAgICAgICAgICAgICAgel96Y2ZyZWUKLSMgIGVuZGlmCi0jICBkZWZpbmUgemxpYkNvbXBpbGVGbGFncyAgICAgIHpfemxpYkNvbXBpbGVGbGFncwotIyAgZGVmaW5lIHpsaWJWZXJzaW9uICAgICAgICAgICB6X3psaWJWZXJzaW9uCi0KLS8qIGFsbCB6bGliIHR5cGVkZWZzIGluIHpsaWIuaCBhbmQgemNvbmYuaCAqLwotIyAgZGVmaW5lIEJ5dGUgICAgICAgICAgICAgICAgICB6X0J5dGUKLSMgIGRlZmluZSBCeXRlZiAgICAgICAgICAgICAgICAgel9CeXRlZgotIyAgZGVmaW5lIGFsbG9jX2Z1bmMgICAgICAgICAgICB6X2FsbG9jX2Z1bmMKLSMgIGRlZmluZSBjaGFyZiAgICAgICAgICAgICAgICAgel9jaGFyZgotIyAgZGVmaW5lIGZyZWVfZnVuYyAgICAgICAgICAgICB6X2ZyZWVfZnVuYwotIyAgaWZuZGVmIFpfU09MTwotIyAgICBkZWZpbmUgZ3pGaWxlICAgICAgICAgICAgICAgIHpfZ3pGaWxlCi0jICBlbmRpZgotIyAgZGVmaW5lIGd6X2hlYWRlciAgICAgICAgICAgICB6X2d6X2hlYWRlcgotIyAgZGVmaW5lIGd6X2hlYWRlcnAgICAgICAgICAgICB6X2d6X2hlYWRlcnAKLSMgIGRlZmluZSBpbl9mdW5jICAgICAgICAgICAgICAgel9pbl9mdW5jCi0jICBkZWZpbmUgaW50ZiAgICAgICAgICAgICAgICAgIHpfaW50ZgotIyAgZGVmaW5lIG91dF9mdW5jICAgICAgICAgICAgICB6X291dF9mdW5jCi0jICBkZWZpbmUgdUludCAgICAgICAgICAgICAgICAgIHpfdUludAotIyAgZGVmaW5lIHVJbnRmICAgICAgICAgICAgICAgICB6X3VJbnRmCi0jICBkZWZpbmUgdUxvbmcgICAgICAgICAgICAgICAgIHpfdUxvbmcKLSMgIGRlZmluZSB1TG9uZ2YgICAgICAgICAgICAgICAgel91TG9uZ2YKLSMgIGRlZmluZSB2b2lkcCAgICAgICAgICAgICAgICAgel92b2lkcAotIyAgZGVmaW5lIHZvaWRwYyAgICAgICAgICAgICAgICB6X3ZvaWRwYwotIyAgZGVmaW5lIHZvaWRwZiAgICAgICAgICAgICAgICB6X3ZvaWRwZgotCi0vKiBhbGwgemxpYiBzdHJ1Y3RzIGluIHpsaWIuaCBhbmQgemNvbmYuaCAqLwotIyAgZGVmaW5lIGd6X2hlYWRlcl9zICAgICAgICAgICB6X2d6X2hlYWRlcl9zCi0jICBkZWZpbmUgaW50ZXJuYWxfc3RhdGUgICAgICAgIHpfaW50ZXJuYWxfc3RhdGUKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fTVNET1NfXykgJiYgIWRlZmluZWQoTVNET1MpCi0jICBkZWZpbmUgTVNET1MKLSNlbmRpZgotI2lmIChkZWZpbmVkKE9TXzIpIHx8IGRlZmluZWQoX19PUzJfXykpICYmICFkZWZpbmVkKE9TMikKLSMgIGRlZmluZSBPUzIKLSNlbmRpZgotI2lmIGRlZmluZWQoX1dJTkRPV1MpICYmICFkZWZpbmVkKFdJTkRPV1MpCi0jICBkZWZpbmUgV0lORE9XUwotI2VuZGlmCi0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkgfHwgZGVmaW5lZChfX1dJTjMyX18pCi0jICBpZm5kZWYgV0lOMzIKLSMgICAgZGVmaW5lIFdJTjMyCi0jICBlbmRpZgotI2VuZGlmCi0jaWYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTkRPV1MpKSAmJiAhZGVmaW5lZChXSU4zMikKLSMgIGlmICFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykgJiYgIWRlZmluZWQoX18zODZfXykKLSMgICAgaWZuZGVmIFNZUzE2QklUCi0jICAgICAgZGVmaW5lIFNZUzE2QklUCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qCi0gKiBDb21waWxlIHdpdGggLURNQVhTRUdfNjRLIGlmIHRoZSBhbGxvYyBmdW5jdGlvbiBjYW5ub3QgYWxsb2NhdGUgbW9yZQotICogdGhhbiA2NGsgYnl0ZXMgYXQgYSB0aW1lIChuZWVkZWQgb24gc3lzdGVtcyB3aXRoIDE2LWJpdCBpbnQpLgotICovCi0jaWZkZWYgU1lTMTZCSVQKLSMgIGRlZmluZSBNQVhTRUdfNjRLCi0jZW5kaWYKLSNpZmRlZiBNU0RPUwotIyAgZGVmaW5lIFVOQUxJR05FRF9PSwotI2VuZGlmCi0KLSNpZmRlZiBfX1NURENfVkVSU0lPTl9fCi0jICBpZm5kZWYgU1REQwotIyAgICBkZWZpbmUgU1REQwotIyAgZW5kaWYKLSMgIGlmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAotIyAgICBpZm5kZWYgU1REQzk5Ci0jICAgICAgZGVmaW5lIFNUREM5OQotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKSkKLSMgIGRlZmluZSBTVERDCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pKQotIyAgZGVmaW5lIFNUREMKLSNlbmRpZgotI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpKQotIyAgZGVmaW5lIFNUREMKLSNlbmRpZgotI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChfX0hPU19BSVhfXykpCi0jICBkZWZpbmUgU1REQwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fT1M0MDBfXykgJiYgIWRlZmluZWQoU1REQykgICAgLyogaVNlcmllcyAoZm9ybWVybHkgQVMvNDAwKS4gKi8KLSMgIGRlZmluZSBTVERDCi0jZW5kaWYKLQotI2lmbmRlZiBTVERDCi0jICBpZm5kZWYgY29uc3QgLyogY2Fubm90IHVzZSAhZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChjb25zdCkgb24gTWFjICovCi0jICAgIGRlZmluZSBjb25zdCAgICAgICAvKiBub3RlOiBuZWVkIGEgbW9yZSBnZW50bGUgc29sdXRpb24gaGVyZSAqLwotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChaTElCX0NPTlNUKSAmJiAhZGVmaW5lZCh6X2NvbnN0KQotIyAgZGVmaW5lIHpfY29uc3QgY29uc3QKLSNlbHNlCi0jICBkZWZpbmUgel9jb25zdAotI2VuZGlmCi0KLS8qIFNvbWUgTWFjIGNvbXBpbGVycyBtZXJnZSBhbGwgLmggZmlsZXMgaW5jb3JyZWN0bHk6ICovCi0jaWYgZGVmaW5lZChfX01XRVJLU19fKXx8ZGVmaW5lZChhcHBsZWMpfHxkZWZpbmVkKFRISU5LX0MpfHxkZWZpbmVkKF9fU0NfXykKLSMgIGRlZmluZSBOT19EVU1NWV9ERUNMCi0jZW5kaWYKLQotLyogTWF4aW11bSB2YWx1ZSBmb3IgbWVtTGV2ZWwgaW4gZGVmbGF0ZUluaXQyICovCi0jaWZuZGVmIE1BWF9NRU1fTEVWRUwKLSMgIGlmZGVmIE1BWFNFR182NEsKLSMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOAotIyAgZWxzZQotIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA5Ci0jICBlbmRpZgotI2VuZGlmCi0KLS8qIE1heGltdW0gdmFsdWUgZm9yIHdpbmRvd0JpdHMgaW4gZGVmbGF0ZUluaXQyIGFuZCBpbmZsYXRlSW5pdDIuCi0gKiBXQVJOSU5HOiByZWR1Y2luZyBNQVhfV0JJVFMgbWFrZXMgbWluaWd6aXAgdW5hYmxlIHRvIGV4dHJhY3QgLmd6IGZpbGVzCi0gKiBjcmVhdGVkIGJ5IGd6aXAuIChGaWxlcyBjcmVhdGVkIGJ5IG1pbmlnemlwIGNhbiBzdGlsbCBiZSBleHRyYWN0ZWQgYnkKLSAqIGd6aXAuKQotICovCi0jaWZuZGVmIE1BWF9XQklUUwotIyAgZGVmaW5lIE1BWF9XQklUUyAgIDE1IC8qIDMySyBMWjc3IHdpbmRvdyAqLwotI2VuZGlmCi0KLS8qIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBkZWZsYXRlIGFyZSAoaW4gYnl0ZXMpOgotICAgICAgICAgICAgKDEgPDwgKHdpbmRvd0JpdHMrMikpICsgICgxIDw8IChtZW1MZXZlbCs5KSkKLSB0aGF0IGlzOiAxMjhLIGZvciB3aW5kb3dCaXRzPTE1ICArICAxMjhLIGZvciBtZW1MZXZlbCA9IDggIChkZWZhdWx0IHZhbHVlcykKLSBwbHVzIGEgZmV3IGtpbG9ieXRlcyBmb3Igc21hbGwgb2JqZWN0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHJlZHVjZQotIHRoZSBkZWZhdWx0IG1lbW9yeSByZXF1aXJlbWVudHMgZnJvbSAyNTZLIHRvIDEyOEssIGNvbXBpbGUgd2l0aAotICAgICBtYWtlIENGTEFHUz0iLU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTciCi0gT2YgY291cnNlIHRoaXMgd2lsbCBnZW5lcmFsbHkgZGVncmFkZSBjb21wcmVzc2lvbiAodGhlcmUncyBubyBmcmVlIGx1bmNoKS4KLQotICAgVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGluZmxhdGUgYXJlIChpbiBieXRlcykgMSA8PCB3aW5kb3dCaXRzCi0gdGhhdCBpcywgMzJLIGZvciB3aW5kb3dCaXRzPTE1IChkZWZhdWx0IHZhbHVlKSBwbHVzIGEgZmV3IGtpbG9ieXRlcwotIGZvciBzbWFsbCBvYmplY3RzLgotKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KLQotI2lmbmRlZiBPRiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCi0jICBpZmRlZiBTVERDCi0jICAgIGRlZmluZSBPRihhcmdzKSAgYXJncwotIyAgZWxzZQotIyAgICBkZWZpbmUgT0YoYXJncykgICgpCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgWl9BUkcgLyogZnVuY3Rpb24gcHJvdG90eXBlcyBmb3Igc3RkYXJnICovCi0jICBpZiBkZWZpbmVkKFNUREMpIHx8IGRlZmluZWQoWl9IQVZFX1NUREFSR19IKQotIyAgICBkZWZpbmUgWl9BUkcoYXJncykgIGFyZ3MKLSMgIGVsc2UKLSMgICAgZGVmaW5lIFpfQVJHKGFyZ3MpICAoKQotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGZvciBGQVIgYXJlIG5lZWRlZCBvbmx5IGZvciBNU0RPUyBtaXhlZAotICogbW9kZWwgcHJvZ3JhbW1pbmcgKHNtYWxsIG9yIG1lZGl1bSBtb2RlbCB3aXRoIHNvbWUgZmFyIGFsbG9jYXRpb25zKS4KLSAqIFRoaXMgd2FzIHRlc3RlZCBvbmx5IHdpdGggTVNDOyBmb3Igb3RoZXIgTVNET1MgY29tcGlsZXJzIHlvdSBtYXkgaGF2ZQotICogdG8gZGVmaW5lIE5PX01FTUNQWSBpbiB6dXRpbC5oLiAgSWYgeW91IGRvbid0IG5lZWQgdGhlIG1peGVkIG1vZGVsLAotICoganVzdCBkZWZpbmUgRkFSIHRvIGJlIGVtcHR5LgotICovCi0jaWZkZWYgU1lTMTZCSVQKLSMgIGlmIGRlZmluZWQoTV9JODZTTSkgfHwgZGVmaW5lZChNX0k4Nk1NKQotICAgICAvKiBNU0Mgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCi0jICAgIGRlZmluZSBTTUFMTF9NRURJVU0KLSMgICAgaWZkZWYgX01TQ19WRVIKLSMgICAgICBkZWZpbmUgRkFSIF9mYXIKLSMgICAgZWxzZQotIyAgICAgIGRlZmluZSBGQVIgZmFyCi0jICAgIGVuZGlmCi0jICBlbmRpZgotIyAgaWYgKGRlZmluZWQoX19TTUFMTF9fKSB8fCBkZWZpbmVkKF9fTUVESVVNX18pKQotICAgICAvKiBUdXJibyBDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLwotIyAgICBkZWZpbmUgU01BTExfTUVESVVNCi0jICAgIGlmZGVmIF9fQk9STEFORENfXwotIyAgICAgIGRlZmluZSBGQVIgX2ZhcgotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIEZBUiBmYXIKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikKLSAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgYXMgYSBETEwsIGRlZmluZSBaTElCX0RMTC4KLSAgICAqIFRoaXMgaXMgbm90IG1hbmRhdG9yeSwgYnV0IGl0IG9mZmVycyBhIGxpdHRsZSBwZXJmb3JtYW5jZSBpbmNyZWFzZS4KLSAgICAqLwotIyAgaWZkZWYgWkxJQl9ETEwKLSMgICAgaWYgZGVmaW5lZChXSU4zMikgJiYgKCFkZWZpbmVkKF9fQk9STEFORENfXykgfHwgKF9fQk9STEFORENfXyA+PSAweDUwMCkpCi0jICAgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAotIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyAgICAgIGVsc2UKLSMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYgIC8qIFpMSUJfRExMICovCi0gICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIHdpdGggdGhlIFdJTkFQSS9XSU5BUElWIGNhbGxpbmcgY29udmVudGlvbiwKLSAgICAqIGRlZmluZSBaTElCX1dJTkFQSS4KLSAgICAqIENhdXRpb246IHRoZSBzdGFuZGFyZCBaTElCMS5ETEwgaXMgTk9UIGNvbXBpbGVkIHVzaW5nIFpMSUJfV0lOQVBJLgotICAgICovCi0jICBpZmRlZiBaTElCX1dJTkFQSQotIyAgICBpZmRlZiBGQVIKLSMgICAgICB1bmRlZiBGQVIKLSMgICAgZW5kaWYKLSMgICAgaW5jbHVkZSA8d2luZG93cy5oPgotICAgICAvKiBObyBuZWVkIGZvciBfZXhwb3J0LCB1c2UgWkxJQi5ERUYgaW5zdGVhZC4gKi8KLSAgICAgLyogRm9yIGNvbXBsZXRlIFdpbmRvd3MgY29tcGF0aWJpbGl0eSwgdXNlIFdJTkFQSSwgbm90IF9fc3RkY2FsbC4gKi8KLSMgICAgZGVmaW5lIFpFWFBPUlQgV0lOQVBJCi0jICAgIGlmZGVmIFdJTjMyCi0jICAgICAgZGVmaW5lIFpFWFBPUlRWQSBXSU5BUElWCi0jICAgIGVsc2UKLSMgICAgICBkZWZpbmUgWkVYUE9SVFZBIEZBUiBDREVDTAotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19CRU9TX18pCi0jICBpZmRlZiBaTElCX0RMTAotIyAgICBpZmRlZiBaTElCX0lOVEVSTkFMCi0jICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFpFWFRFUk4KLSMgIGRlZmluZSBaRVhURVJOIGV4dGVybgotI2VuZGlmCi0jaWZuZGVmIFpFWFBPUlQKLSMgIGRlZmluZSBaRVhQT1JUCi0jZW5kaWYKLSNpZm5kZWYgWkVYUE9SVFZBCi0jICBkZWZpbmUgWkVYUE9SVFZBCi0jZW5kaWYKLQotI2lmbmRlZiBGQVIKLSMgIGRlZmluZSBGQVIKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX19NQUNUWVBFU19fKQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICBCeXRlOyAgLyogOCBiaXRzICovCi0jZW5kaWYKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgdUludDsgIC8qIDE2IGJpdHMgb3IgbW9yZSAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICB1TG9uZzsgLyogMzIgYml0cyBvciBtb3JlICovCi0KLSNpZmRlZiBTTUFMTF9NRURJVU0KLSAgIC8qIEJvcmxhbmQgQy9DKysgYW5kIHNvbWUgb2xkIE1TQyB2ZXJzaW9ucyBpZ25vcmUgRkFSIGluc2lkZSB0eXBlZGVmICovCi0jICBkZWZpbmUgQnl0ZWYgQnl0ZSBGQVIKLSNlbHNlCi0gICB0eXBlZGVmIEJ5dGUgIEZBUiBCeXRlZjsKLSNlbmRpZgotdHlwZWRlZiBjaGFyICBGQVIgY2hhcmY7Ci10eXBlZGVmIGludCAgIEZBUiBpbnRmOwotdHlwZWRlZiB1SW50ICBGQVIgdUludGY7Ci10eXBlZGVmIHVMb25nIEZBUiB1TG9uZ2Y7Ci0KLSNpZmRlZiBTVERDCi0gICB0eXBlZGVmIHZvaWQgY29uc3QgKnZvaWRwYzsKLSAgIHR5cGVkZWYgdm9pZCBGQVIgICAqdm9pZHBmOwotICAgdHlwZWRlZiB2b2lkICAgICAgICp2b2lkcDsKLSNlbHNlCi0gICB0eXBlZGVmIEJ5dGUgY29uc3QgKnZvaWRwYzsKLSAgIHR5cGVkZWYgQnl0ZSBGQVIgICAqdm9pZHBmOwotICAgdHlwZWRlZiBCeXRlICAgICAgICp2b2lkcDsKLSNlbmRpZgotCi0vKiAuL2NvbmZpZ3VyZSBtYXkgI2RlZmluZSBaX1U0IGhlcmUgKi8KLQotI2lmICFkZWZpbmVkKFpfVTQpICYmICFkZWZpbmVkKFpfU09MTykgJiYgZGVmaW5lZChTVERDKQotIyAgaW5jbHVkZSA8bGltaXRzLmg+Ci0jICBpZiAoVUlOVF9NQVggPT0gMHhmZmZmZmZmZlVMKQotIyAgICBkZWZpbmUgWl9VNCB1bnNpZ25lZAotIyAgZWxzZQotIyAgICBpZiAoVUxPTkdfTUFYID09IDB4ZmZmZmZmZmZVTCkKLSMgICAgICBkZWZpbmUgWl9VNCB1bnNpZ25lZCBsb25nCi0jICAgIGVsc2UKLSMgICAgICBpZiAoVVNIUlRfTUFYID09IDB4ZmZmZmZmZmZVTCkKLSMgICAgICAgIGRlZmluZSBaX1U0IHVuc2lnbmVkIHNob3J0Ci0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFpfVTQKLSAgIHR5cGVkZWYgWl9VNCB6X2NyY190OwotI2Vsc2UKLSAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyB6X2NyY190OwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9IICAgIC8qIG1heSBiZSBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KLSMgIGRlZmluZSBaX0hBVkVfVU5JU1REX0gKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERBUkdfSCAgICAvKiBtYXkgYmUgc2V0IHRvICNpZiAxIGJ5IC4vY29uZmlndXJlICovCi0jICBkZWZpbmUgWl9IQVZFX1NUREFSR19ICi0jZW5kaWYKLQotI2lmZGVmIFNUREMKLSMgIGlmbmRlZiBaX1NPTE8KLSMgICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAgICAgLyogZm9yIG9mZl90ICovCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfV0lOMzIKLSMgIGluY2x1ZGUgPHN0ZGRlZi5oPiAgICAgICAgICAgLyogZm9yIHdjaGFyX3QgKi8KLSNlbmRpZgotCi0vKiBhIGxpdHRsZSB0cmljayB0byBhY2NvbW1vZGF0ZSBib3RoICIjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UiIGFuZAotICogIiNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRSAxIiBhcyByZXF1ZXN0aW5nIDY0LWJpdCBvcGVyYXRpb25zLCAoZXZlbgotICogdGhvdWdoIHRoZSBmb3JtZXIgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgTEZTIGRvY3VtZW50KSwgYnV0IGNvbnNpZGVyaW5nCi0gKiBib3RoICIjdW5kZWYgX0xBUkdFRklMRTY0X1NPVVJDRSIgYW5kICIjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgMCIgYXMKLSAqIGVxdWl2YWxlbnRseSByZXF1ZXN0aW5nIG5vIDY0LWJpdCBvcGVyYXRpb25zCi0gKi8KLSNpZiBkZWZpbmVkKExBUkdFRklMRTY0X1NPVVJDRSkgJiYgLV9MQVJHRUZJTEU2NF9TT1VSQ0UgLSAtMSA9PSAxCi0jICB1bmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19XQVRDT01DX18pICYmICFkZWZpbmVkKFpfSEFWRV9VTklTVERfSCkKLSMgIGRlZmluZSBaX0hBVkVfVU5JU1REX0gKLSNlbmRpZgotI2lmbmRlZiBaX1NPTE8KLSMgIGlmIGRlZmluZWQoWl9IQVZFX1VOSVNURF9IKSB8fCBkZWZpbmVkKExBUkdFRklMRTY0X1NPVVJDRSkKLSMgICAgaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgICAgLyogZm9yIFNFRUtfKiwgb2ZmX3QsIGFuZCBfTEZTNjRfTEFSR0VGSUxFICovCi0jICAgIGlmZGVmIFZNUwotIyAgICAgIGluY2x1ZGUgPHVuaXhpby5oPiAgICAgICAvKiBmb3Igb2ZmX3QgKi8KLSMgICAgZW5kaWYKLSMgICAgaWZuZGVmIHpfb2ZmX3QKLSMgICAgICBkZWZpbmUgel9vZmZfdCBvZmZfdAotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfTEZTNjRfTEFSR0VGSUxFKSAmJiBfTEZTNjRfTEFSR0VGSUxFLTAKLSMgIGRlZmluZSBaX0xGUzY0Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkgJiYgZGVmaW5lZChaX0xGUzY0KQotIyAgZGVmaW5lIFpfTEFSR0U2NAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9GSUxFX09GRlNFVF9CSVRTKSAmJiBfRklMRV9PRkZTRVRfQklUUy0wID09IDY0ICYmIGRlZmluZWQoWl9MRlM2NCkKLSMgIGRlZmluZSBaX1dBTlQ2NAotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChTRUVLX1NFVCkgJiYgIWRlZmluZWQoWl9TT0xPKQotIyAgZGVmaW5lIFNFRUtfU0VUICAgICAgICAwICAgICAgIC8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCi0jICBkZWZpbmUgU0VFS19DVVIgICAgICAgIDEgICAgICAgLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLwotIyAgZGVmaW5lIFNFRUtfRU5EICAgICAgICAyICAgICAgIC8qIFNldCBmaWxlIHBvaW50ZXIgdG8gRU9GIHBsdXMgIm9mZnNldCIgKi8KLSNlbmRpZgotCi0jaWZuZGVmIHpfb2ZmX3QKLSMgIGRlZmluZSB6X29mZl90IGxvbmcKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKFpfTEFSR0U2NCkKLSMgIGRlZmluZSB6X29mZjY0X3Qgb2ZmNjRfdAotI2Vsc2UKLSMgIGlmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoWl9TT0xPKQotIyAgICBkZWZpbmUgel9vZmY2NF90IF9faW50NjQKLSMgIGVsc2UKLSMgICAgZGVmaW5lIHpfb2ZmNjRfdCB6X29mZl90Ci0jICBlbmRpZgotI2VuZGlmCi0KLS8qIE1WUyBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBleHRlcm5hbCBuYW1lcyBsYXJnZXIgdGhhbiA4IGJ5dGVzICovCi0jaWYgZGVmaW5lZChfX01WU19fKQotICAjcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQotICAjcHJhZ21hIG1hcChkZWZsYXRlSW5pdDJfLCJERUlOMiIpCi0gICNwcmFnbWEgbWFwKGRlZmxhdGVFbmQsIkRFRU5EIikKLSAgI3ByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVJbml0XywiSU5JTiIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVJbml0Ml8sIklOSU4yIikKLSAgI3ByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQotICAjcHJhZ21hIG1hcChpbmZsYXRlU3luYywiSU5TWSIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVTZXREaWN0aW9uYXJ5LCJJTlNFREkiKQotICAjcHJhZ21hIG1hcChjb21wcmVzc0JvdW5kLCJDTUJORCIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVfdGFibGUsIklOVEFCTCIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVfZmFzdCwiSU5GQSIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBaQ09ORl9IICovCmRpZmYgLS1naXQgYS9zcmMvemxpYi96Y29uZi5oLmluIGIvc3JjL3psaWIvemNvbmYuaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0NmE1OC4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi96Y29uZi5oLmluCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLS8qIHpjb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMiBKZWFuLWxvdXAgR2FpbGx5LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIEAoIykgJElkJCAqLwotCi0jaWZuZGVmIFpDT05GX0gKLSNkZWZpbmUgWkNPTkZfSAotCi0vKgotICogSWYgeW91ICpyZWFsbHkqIG5lZWQgYSB1bmlxdWUgcHJlZml4IGZvciBhbGwgdHlwZXMgYW5kIGxpYnJhcnkgZnVuY3Rpb25zLAotICogY29tcGlsZSB3aXRoIC1EWl9QUkVGSVguIFRoZSAic3RhbmRhcmQiIHpsaWIgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGhvdXQgaXQuCi0gKiBFdmVuIGJldHRlciB0aGFuIGNvbXBpbGluZyB3aXRoIC1EWl9QUkVGSVggd291bGQgYmUgdG8gdXNlIGNvbmZpZ3VyZSB0byBzZXQKLSAqIHRoaXMgcGVybWFuZW50bHkgaW4gemNvbmYuaCB1c2luZyAiLi9jb25maWd1cmUgLS16cHJlZml4Ii4KLSAqLwotI2lmZGVmIFpfUFJFRklYICAgICAvKiBtYXkgYmUgc2V0IHRvICNpZiAxIGJ5IC4vY29uZmlndXJlICovCi0jICBkZWZpbmUgWl9QUkVGSVhfU0VUCi0KLS8qIGFsbCBsaW5rZWQgc3ltYm9scyAqLwotIyAgZGVmaW5lIF9kaXN0X2NvZGUgICAgICAgICAgICB6X19kaXN0X2NvZGUKLSMgIGRlZmluZSBfbGVuZ3RoX2NvZGUgICAgICAgICAgel9fbGVuZ3RoX2NvZGUKLSMgIGRlZmluZSBfdHJfYWxpZ24gICAgICAgICAgICAgel9fdHJfYWxpZ24KLSMgIGRlZmluZSBfdHJfZmx1c2hfYmxvY2sgICAgICAgel9fdHJfZmx1c2hfYmxvY2sKLSMgIGRlZmluZSBfdHJfaW5pdCAgICAgICAgICAgICAgel9fdHJfaW5pdAotIyAgZGVmaW5lIF90cl9zdG9yZWRfYmxvY2sgICAgICB6X190cl9zdG9yZWRfYmxvY2sKLSMgIGRlZmluZSBfdHJfdGFsbHkgICAgICAgICAgICAgel9fdHJfdGFsbHkKLSMgIGRlZmluZSBhZGxlcjMyICAgICAgICAgICAgICAgel9hZGxlcjMyCi0jICBkZWZpbmUgYWRsZXIzMl9jb21iaW5lICAgICAgIHpfYWRsZXIzMl9jb21iaW5lCi0jICBkZWZpbmUgYWRsZXIzMl9jb21iaW5lNjQgICAgIHpfYWRsZXIzMl9jb21iaW5lNjQKLSMgIGlmbmRlZiBaX1NPTE8KLSMgICAgZGVmaW5lIGNvbXByZXNzICAgICAgICAgICAgICB6X2NvbXByZXNzCi0jICAgIGRlZmluZSBjb21wcmVzczIgICAgICAgICAgICAgel9jb21wcmVzczIKLSMgICAgZGVmaW5lIGNvbXByZXNzQm91bmQgICAgICAgICB6X2NvbXByZXNzQm91bmQKLSMgIGVuZGlmCi0jICBkZWZpbmUgY3JjMzIgICAgICAgICAgICAgICAgIHpfY3JjMzIKLSMgIGRlZmluZSBjcmMzMl9jb21iaW5lICAgICAgICAgel9jcmMzMl9jb21iaW5lCi0jICBkZWZpbmUgY3JjMzJfY29tYmluZTY0ICAgICAgIHpfY3JjMzJfY29tYmluZTY0Ci0jICBkZWZpbmUgZGVmbGF0ZSAgICAgICAgICAgICAgIHpfZGVmbGF0ZQotIyAgZGVmaW5lIGRlZmxhdGVCb3VuZCAgICAgICAgICB6X2RlZmxhdGVCb3VuZAotIyAgZGVmaW5lIGRlZmxhdGVDb3B5ICAgICAgICAgICB6X2RlZmxhdGVDb3B5Ci0jICBkZWZpbmUgZGVmbGF0ZUVuZCAgICAgICAgICAgIHpfZGVmbGF0ZUVuZAotIyAgZGVmaW5lIGRlZmxhdGVJbml0Ml8gICAgICAgICB6X2RlZmxhdGVJbml0Ml8KLSMgIGRlZmluZSBkZWZsYXRlSW5pdF8gICAgICAgICAgel9kZWZsYXRlSW5pdF8KLSMgIGRlZmluZSBkZWZsYXRlUGFyYW1zICAgICAgICAgel9kZWZsYXRlUGFyYW1zCi0jICBkZWZpbmUgZGVmbGF0ZVBlbmRpbmcgICAgICAgIHpfZGVmbGF0ZVBlbmRpbmcKLSMgIGRlZmluZSBkZWZsYXRlUHJpbWUgICAgICAgICAgel9kZWZsYXRlUHJpbWUKLSMgIGRlZmluZSBkZWZsYXRlUmVzZXQgICAgICAgICAgel9kZWZsYXRlUmVzZXQKLSMgIGRlZmluZSBkZWZsYXRlUmVzZXRLZWVwICAgICAgel9kZWZsYXRlUmVzZXRLZWVwCi0jICBkZWZpbmUgZGVmbGF0ZVNldERpY3Rpb25hcnkgIHpfZGVmbGF0ZVNldERpY3Rpb25hcnkKLSMgIGRlZmluZSBkZWZsYXRlU2V0SGVhZGVyICAgICAgel9kZWZsYXRlU2V0SGVhZGVyCi0jICBkZWZpbmUgZGVmbGF0ZVR1bmUgICAgICAgICAgIHpfZGVmbGF0ZVR1bmUKLSMgIGRlZmluZSBkZWZsYXRlX2NvcHlyaWdodCAgICAgel9kZWZsYXRlX2NvcHlyaWdodAotIyAgZGVmaW5lIGdldF9jcmNfdGFibGUgICAgICAgICB6X2dldF9jcmNfdGFibGUKLSMgIGlmbmRlZiBaX1NPTE8KLSMgICAgZGVmaW5lIGd6X2Vycm9yICAgICAgICAgICAgICB6X2d6X2Vycm9yCi0jICAgIGRlZmluZSBnel9pbnRtYXggICAgICAgICAgICAgel9nel9pbnRtYXgKLSMgICAgZGVmaW5lIGd6X3N0cndpbmVycm9yICAgICAgICB6X2d6X3N0cndpbmVycm9yCi0jICAgIGRlZmluZSBnemJ1ZmZlciAgICAgICAgICAgICAgel9nemJ1ZmZlcgotIyAgICBkZWZpbmUgZ3pjbGVhcmVyciAgICAgICAgICAgIHpfZ3pjbGVhcmVycgotIyAgICBkZWZpbmUgZ3pjbG9zZSAgICAgICAgICAgICAgIHpfZ3pjbG9zZQotIyAgICBkZWZpbmUgZ3pjbG9zZV9yICAgICAgICAgICAgIHpfZ3pjbG9zZV9yCi0jICAgIGRlZmluZSBnemNsb3NlX3cgICAgICAgICAgICAgel9nemNsb3NlX3cKLSMgICAgZGVmaW5lIGd6ZGlyZWN0ICAgICAgICAgICAgICB6X2d6ZGlyZWN0Ci0jICAgIGRlZmluZSBnemRvcGVuICAgICAgICAgICAgICAgel9nemRvcGVuCi0jICAgIGRlZmluZSBnemVvZiAgICAgICAgICAgICAgICAgel9nemVvZgotIyAgICBkZWZpbmUgZ3plcnJvciAgICAgICAgICAgICAgIHpfZ3plcnJvcgotIyAgICBkZWZpbmUgZ3pmbHVzaCAgICAgICAgICAgICAgIHpfZ3pmbHVzaAotIyAgICBkZWZpbmUgZ3pnZXRjICAgICAgICAgICAgICAgIHpfZ3pnZXRjCi0jICAgIGRlZmluZSBnemdldGNfICAgICAgICAgICAgICAgel9nemdldGNfCi0jICAgIGRlZmluZSBnemdldHMgICAgICAgICAgICAgICAgel9nemdldHMKLSMgICAgZGVmaW5lIGd6b2Zmc2V0ICAgICAgICAgICAgICB6X2d6b2Zmc2V0Ci0jICAgIGRlZmluZSBnem9mZnNldDY0ICAgICAgICAgICAgel9nem9mZnNldDY0Ci0jICAgIGRlZmluZSBnem9wZW4gICAgICAgICAgICAgICAgel9nem9wZW4KLSMgICAgZGVmaW5lIGd6b3BlbjY0ICAgICAgICAgICAgICB6X2d6b3BlbjY0Ci0jICAgIGlmZGVmIF9XSU4zMgotIyAgICAgIGRlZmluZSBnem9wZW5fdyAgICAgICAgICAgICAgel9nem9wZW5fdwotIyAgICBlbmRpZgotIyAgICBkZWZpbmUgZ3pwcmludGYgICAgICAgICAgICAgIHpfZ3pwcmludGYKLSMgICAgZGVmaW5lIGd6cHV0YyAgICAgICAgICAgICAgICB6X2d6cHV0YwotIyAgICBkZWZpbmUgZ3pwdXRzICAgICAgICAgICAgICAgIHpfZ3pwdXRzCi0jICAgIGRlZmluZSBnenJlYWQgICAgICAgICAgICAgICAgel9nenJlYWQKLSMgICAgZGVmaW5lIGd6cmV3aW5kICAgICAgICAgICAgICB6X2d6cmV3aW5kCi0jICAgIGRlZmluZSBnenNlZWsgICAgICAgICAgICAgICAgel9nenNlZWsKLSMgICAgZGVmaW5lIGd6c2VlazY0ICAgICAgICAgICAgICB6X2d6c2VlazY0Ci0jICAgIGRlZmluZSBnenNldHBhcmFtcyAgICAgICAgICAgel9nenNldHBhcmFtcwotIyAgICBkZWZpbmUgZ3p0ZWxsICAgICAgICAgICAgICAgIHpfZ3p0ZWxsCi0jICAgIGRlZmluZSBnenRlbGw2NCAgICAgICAgICAgICAgel9nenRlbGw2NAotIyAgICBkZWZpbmUgZ3p1bmdldGMgICAgICAgICAgICAgIHpfZ3p1bmdldGMKLSMgICAgZGVmaW5lIGd6d3JpdGUgICAgICAgICAgICAgICB6X2d6d3JpdGUKLSMgIGVuZGlmCi0jICBkZWZpbmUgaW5mbGF0ZSAgICAgICAgICAgICAgIHpfaW5mbGF0ZQotIyAgZGVmaW5lIGluZmxhdGVCYWNrICAgICAgICAgICB6X2luZmxhdGVCYWNrCi0jICBkZWZpbmUgaW5mbGF0ZUJhY2tFbmQgICAgICAgIHpfaW5mbGF0ZUJhY2tFbmQKLSMgIGRlZmluZSBpbmZsYXRlQmFja0luaXRfICAgICAgel9pbmZsYXRlQmFja0luaXRfCi0jICBkZWZpbmUgaW5mbGF0ZUNvcHkgICAgICAgICAgIHpfaW5mbGF0ZUNvcHkKLSMgIGRlZmluZSBpbmZsYXRlRW5kICAgICAgICAgICAgel9pbmZsYXRlRW5kCi0jICBkZWZpbmUgaW5mbGF0ZUdldEhlYWRlciAgICAgIHpfaW5mbGF0ZUdldEhlYWRlcgotIyAgZGVmaW5lIGluZmxhdGVJbml0Ml8gICAgICAgICB6X2luZmxhdGVJbml0Ml8KLSMgIGRlZmluZSBpbmZsYXRlSW5pdF8gICAgICAgICAgel9pbmZsYXRlSW5pdF8KLSMgIGRlZmluZSBpbmZsYXRlTWFyayAgICAgICAgICAgel9pbmZsYXRlTWFyawotIyAgZGVmaW5lIGluZmxhdGVQcmltZSAgICAgICAgICB6X2luZmxhdGVQcmltZQotIyAgZGVmaW5lIGluZmxhdGVSZXNldCAgICAgICAgICB6X2luZmxhdGVSZXNldAotIyAgZGVmaW5lIGluZmxhdGVSZXNldDIgICAgICAgICB6X2luZmxhdGVSZXNldDIKLSMgIGRlZmluZSBpbmZsYXRlU2V0RGljdGlvbmFyeSAgel9pbmZsYXRlU2V0RGljdGlvbmFyeQotIyAgZGVmaW5lIGluZmxhdGVTeW5jICAgICAgICAgICB6X2luZmxhdGVTeW5jCi0jICBkZWZpbmUgaW5mbGF0ZVN5bmNQb2ludCAgICAgIHpfaW5mbGF0ZVN5bmNQb2ludAotIyAgZGVmaW5lIGluZmxhdGVVbmRlcm1pbmUgICAgICB6X2luZmxhdGVVbmRlcm1pbmUKLSMgIGRlZmluZSBpbmZsYXRlUmVzZXRLZWVwICAgICAgel9pbmZsYXRlUmVzZXRLZWVwCi0jICBkZWZpbmUgaW5mbGF0ZV9jb3B5cmlnaHQgICAgIHpfaW5mbGF0ZV9jb3B5cmlnaHQKLSMgIGRlZmluZSBpbmZsYXRlX2Zhc3QgICAgICAgICAgel9pbmZsYXRlX2Zhc3QKLSMgIGRlZmluZSBpbmZsYXRlX3RhYmxlICAgICAgICAgel9pbmZsYXRlX3RhYmxlCi0jICBpZm5kZWYgWl9TT0xPCi0jICAgIGRlZmluZSB1bmNvbXByZXNzICAgICAgICAgICAgel91bmNvbXByZXNzCi0jICBlbmRpZgotIyAgZGVmaW5lIHpFcnJvciAgICAgICAgICAgICAgICB6X3pFcnJvcgotIyAgaWZuZGVmIFpfU09MTwotIyAgICBkZWZpbmUgemNhbGxvYyAgICAgICAgICAgICAgIHpfemNhbGxvYwotIyAgICBkZWZpbmUgemNmcmVlICAgICAgICAgICAgICAgIHpfemNmcmVlCi0jICBlbmRpZgotIyAgZGVmaW5lIHpsaWJDb21waWxlRmxhZ3MgICAgICB6X3psaWJDb21waWxlRmxhZ3MKLSMgIGRlZmluZSB6bGliVmVyc2lvbiAgICAgICAgICAgel96bGliVmVyc2lvbgotCi0vKiBhbGwgemxpYiB0eXBlZGVmcyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KLSMgIGRlZmluZSBCeXRlICAgICAgICAgICAgICAgICAgel9CeXRlCi0jICBkZWZpbmUgQnl0ZWYgICAgICAgICAgICAgICAgIHpfQnl0ZWYKLSMgIGRlZmluZSBhbGxvY19mdW5jICAgICAgICAgICAgel9hbGxvY19mdW5jCi0jICBkZWZpbmUgY2hhcmYgICAgICAgICAgICAgICAgIHpfY2hhcmYKLSMgIGRlZmluZSBmcmVlX2Z1bmMgICAgICAgICAgICAgel9mcmVlX2Z1bmMKLSMgIGlmbmRlZiBaX1NPTE8KLSMgICAgZGVmaW5lIGd6RmlsZSAgICAgICAgICAgICAgICB6X2d6RmlsZQotIyAgZW5kaWYKLSMgIGRlZmluZSBnel9oZWFkZXIgICAgICAgICAgICAgel9nel9oZWFkZXIKLSMgIGRlZmluZSBnel9oZWFkZXJwICAgICAgICAgICAgel9nel9oZWFkZXJwCi0jICBkZWZpbmUgaW5fZnVuYyAgICAgICAgICAgICAgIHpfaW5fZnVuYwotIyAgZGVmaW5lIGludGYgICAgICAgICAgICAgICAgICB6X2ludGYKLSMgIGRlZmluZSBvdXRfZnVuYyAgICAgICAgICAgICAgel9vdXRfZnVuYwotIyAgZGVmaW5lIHVJbnQgICAgICAgICAgICAgICAgICB6X3VJbnQKLSMgIGRlZmluZSB1SW50ZiAgICAgICAgICAgICAgICAgel91SW50ZgotIyAgZGVmaW5lIHVMb25nICAgICAgICAgICAgICAgICB6X3VMb25nCi0jICBkZWZpbmUgdUxvbmdmICAgICAgICAgICAgICAgIHpfdUxvbmdmCi0jICBkZWZpbmUgdm9pZHAgICAgICAgICAgICAgICAgIHpfdm9pZHAKLSMgIGRlZmluZSB2b2lkcGMgICAgICAgICAgICAgICAgel92b2lkcGMKLSMgIGRlZmluZSB2b2lkcGYgICAgICAgICAgICAgICAgel92b2lkcGYKLQotLyogYWxsIHpsaWIgc3RydWN0cyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KLSMgIGRlZmluZSBnel9oZWFkZXJfcyAgICAgICAgICAgel9nel9oZWFkZXJfcwotIyAgZGVmaW5lIGludGVybmFsX3N0YXRlICAgICAgICB6X2ludGVybmFsX3N0YXRlCi0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX01TRE9TX18pICYmICFkZWZpbmVkKE1TRE9TKQotIyAgZGVmaW5lIE1TRE9TCi0jZW5kaWYKLSNpZiAoZGVmaW5lZChPU18yKSB8fCBkZWZpbmVkKF9fT1MyX18pKSAmJiAhZGVmaW5lZChPUzIpCi0jICBkZWZpbmUgT1MyCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9XSU5ET1dTKSAmJiAhZGVmaW5lZChXSU5ET1dTKQotIyAgZGVmaW5lIFdJTkRPV1MKLSNlbmRpZgotI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpIHx8IGRlZmluZWQoX19XSU4zMl9fKQotIyAgaWZuZGVmIFdJTjMyCi0jICAgIGRlZmluZSBXSU4zMgotIyAgZW5kaWYKLSNlbmRpZgotI2lmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU5ET1dTKSkgJiYgIWRlZmluZWQoV0lOMzIpCi0jICBpZiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19GTEFUX18pICYmICFkZWZpbmVkKF9fMzg2X18pCi0jICAgIGlmbmRlZiBTWVMxNkJJVAotIyAgICAgIGRlZmluZSBTWVMxNkJJVAotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0vKgotICogQ29tcGlsZSB3aXRoIC1ETUFYU0VHXzY0SyBpZiB0aGUgYWxsb2MgZnVuY3Rpb24gY2Fubm90IGFsbG9jYXRlIG1vcmUKLSAqIHRoYW4gNjRrIGJ5dGVzIGF0IGEgdGltZSAobmVlZGVkIG9uIHN5c3RlbXMgd2l0aCAxNi1iaXQgaW50KS4KLSAqLwotI2lmZGVmIFNZUzE2QklUCi0jICBkZWZpbmUgTUFYU0VHXzY0SwotI2VuZGlmCi0jaWZkZWYgTVNET1MKLSMgIGRlZmluZSBVTkFMSUdORURfT0sKLSNlbmRpZgotCi0jaWZkZWYgX19TVERDX1ZFUlNJT05fXwotIyAgaWZuZGVmIFNUREMKLSMgICAgZGVmaW5lIFNUREMKLSMgIGVuZGlmCi0jICBpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKLSMgICAgaWZuZGVmIFNUREM5OQotIyAgICAgIGRlZmluZSBTVERDOTkKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykpCi0jICBkZWZpbmUgU1REQwotI2VuZGlmCi0jaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSkKLSMgIGRlZmluZSBTVERDCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKSkKLSMgIGRlZmluZSBTVERDCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoX19IT1NfQUlYX18pKQotIyAgZGVmaW5lIFNUREMKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX09TNDAwX18pICYmICFkZWZpbmVkKFNUREMpICAgIC8qIGlTZXJpZXMgKGZvcm1lcmx5IEFTLzQwMCkuICovCi0jICBkZWZpbmUgU1REQwotI2VuZGlmCi0KLSNpZm5kZWYgU1REQwotIyAgaWZuZGVmIGNvbnN0IC8qIGNhbm5vdCB1c2UgIWRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoY29uc3QpIG9uIE1hYyAqLwotIyAgICBkZWZpbmUgY29uc3QgICAgICAgLyogbm90ZTogbmVlZCBhIG1vcmUgZ2VudGxlIHNvbHV0aW9uIGhlcmUgKi8KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoWkxJQl9DT05TVCkgJiYgIWRlZmluZWQoel9jb25zdCkKLSMgIGRlZmluZSB6X2NvbnN0IGNvbnN0Ci0jZWxzZQotIyAgZGVmaW5lIHpfY29uc3QKLSNlbmRpZgotCi0vKiBTb21lIE1hYyBjb21waWxlcnMgbWVyZ2UgYWxsIC5oIGZpbGVzIGluY29ycmVjdGx5OiAqLwotI2lmIGRlZmluZWQoX19NV0VSS1NfXyl8fGRlZmluZWQoYXBwbGVjKXx8ZGVmaW5lZChUSElOS19DKXx8ZGVmaW5lZChfX1NDX18pCi0jICBkZWZpbmUgTk9fRFVNTVlfREVDTAotI2VuZGlmCi0KLS8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqLwotI2lmbmRlZiBNQVhfTUVNX0xFVkVMCi0jICBpZmRlZiBNQVhTRUdfNjRLCi0jICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDgKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOQotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBNYXhpbXVtIHZhbHVlIGZvciB3aW5kb3dCaXRzIGluIGRlZmxhdGVJbml0MiBhbmQgaW5mbGF0ZUluaXQyLgotICogV0FSTklORzogcmVkdWNpbmcgTUFYX1dCSVRTIG1ha2VzIG1pbmlnemlwIHVuYWJsZSB0byBleHRyYWN0IC5neiBmaWxlcwotICogY3JlYXRlZCBieSBnemlwLiAoRmlsZXMgY3JlYXRlZCBieSBtaW5pZ3ppcCBjYW4gc3RpbGwgYmUgZXh0cmFjdGVkIGJ5Ci0gKiBnemlwLikKLSAqLwotI2lmbmRlZiBNQVhfV0JJVFMKLSMgIGRlZmluZSBNQVhfV0JJVFMgICAxNSAvKiAzMksgTFo3NyB3aW5kb3cgKi8KLSNlbmRpZgotCi0vKiBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgZGVmbGF0ZSBhcmUgKGluIGJ5dGVzKToKLSAgICAgICAgICAgICgxIDw8ICh3aW5kb3dCaXRzKzIpKSArICAoMSA8PCAobWVtTGV2ZWwrOSkpCi0gdGhhdCBpczogMTI4SyBmb3Igd2luZG93Qml0cz0xNSAgKyAgMTI4SyBmb3IgbWVtTGV2ZWwgPSA4ICAoZGVmYXVsdCB2YWx1ZXMpCi0gcGx1cyBhIGZldyBraWxvYnl0ZXMgZm9yIHNtYWxsIG9iamVjdHMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byByZWR1Y2UKLSB0aGUgZGVmYXVsdCBtZW1vcnkgcmVxdWlyZW1lbnRzIGZyb20gMjU2SyB0byAxMjhLLCBjb21waWxlIHdpdGgKLSAgICAgbWFrZSBDRkxBR1M9Ii1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03IgotIE9mIGNvdXJzZSB0aGlzIHdpbGwgZ2VuZXJhbGx5IGRlZ3JhZGUgY29tcHJlc3Npb24gKHRoZXJlJ3Mgbm8gZnJlZSBsdW5jaCkuCi0KLSAgIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBpbmZsYXRlIGFyZSAoaW4gYnl0ZXMpIDEgPDwgd2luZG93Qml0cwotIHRoYXQgaXMsIDMySyBmb3Igd2luZG93Qml0cz0xNSAoZGVmYXVsdCB2YWx1ZSkgcGx1cyBhIGZldyBraWxvYnl0ZXMKLSBmb3Igc21hbGwgb2JqZWN0cy4KLSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgZGVjbGFyYXRpb25zICovCi0KLSNpZm5kZWYgT0YgLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotIyAgaWZkZWYgU1REQwotIyAgICBkZWZpbmUgT0YoYXJncykgIGFyZ3MKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE9GKGFyZ3MpICAoKQotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFpfQVJHIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHN0ZGFyZyAqLwotIyAgaWYgZGVmaW5lZChTVERDKSB8fCBkZWZpbmVkKFpfSEFWRV9TVERBUkdfSCkKLSMgICAgZGVmaW5lIFpfQVJHKGFyZ3MpICBhcmdzCi0jICBlbHNlCi0jICAgIGRlZmluZSBaX0FSRyhhcmdzKSAgKCkKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgRkFSIGFyZSBuZWVkZWQgb25seSBmb3IgTVNET1MgbWl4ZWQKLSAqIG1vZGVsIHByb2dyYW1taW5nIChzbWFsbCBvciBtZWRpdW0gbW9kZWwgd2l0aCBzb21lIGZhciBhbGxvY2F0aW9ucykuCi0gKiBUaGlzIHdhcyB0ZXN0ZWQgb25seSB3aXRoIE1TQzsgZm9yIG90aGVyIE1TRE9TIGNvbXBpbGVycyB5b3UgbWF5IGhhdmUKLSAqIHRvIGRlZmluZSBOT19NRU1DUFkgaW4genV0aWwuaC4gIElmIHlvdSBkb24ndCBuZWVkIHRoZSBtaXhlZCBtb2RlbCwKLSAqIGp1c3QgZGVmaW5lIEZBUiB0byBiZSBlbXB0eS4KLSAqLwotI2lmZGVmIFNZUzE2QklUCi0jICBpZiBkZWZpbmVkKE1fSTg2U00pIHx8IGRlZmluZWQoTV9JODZNTSkKLSAgICAgLyogTVNDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLwotIyAgICBkZWZpbmUgU01BTExfTUVESVVNCi0jICAgIGlmZGVmIF9NU0NfVkVSCi0jICAgICAgZGVmaW5lIEZBUiBfZmFyCi0jICAgIGVsc2UKLSMgICAgICBkZWZpbmUgRkFSIGZhcgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSMgIGlmIChkZWZpbmVkKF9fU01BTExfXykgfHwgZGVmaW5lZChfX01FRElVTV9fKSkKLSAgICAgLyogVHVyYm8gQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KLSMgICAgZGVmaW5lIFNNQUxMX01FRElVTQotIyAgICBpZmRlZiBfX0JPUkxBTkRDX18KLSMgICAgICBkZWZpbmUgRkFSIF9mYXIKLSMgICAgZWxzZQotIyAgICAgIGRlZmluZSBGQVIgZmFyCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpCi0gICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIGFzIGEgRExMLCBkZWZpbmUgWkxJQl9ETEwuCi0gICAgKiBUaGlzIGlzIG5vdCBtYW5kYXRvcnksIGJ1dCBpdCBvZmZlcnMgYSBsaXR0bGUgcGVyZm9ybWFuY2UgaW5jcmVhc2UuCi0gICAgKi8KLSMgIGlmZGVmIFpMSUJfRExMCi0jICAgIGlmIGRlZmluZWQoV0lOMzIpICYmICghZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPj0gMHg1MDApKQotIyAgICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKLSMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgICAgICBlbHNlCi0jICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgIGVuZGlmICAvKiBaTElCX0RMTCAqLwotICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiB3aXRoIHRoZSBXSU5BUEkvV0lOQVBJViBjYWxsaW5nIGNvbnZlbnRpb24sCi0gICAgKiBkZWZpbmUgWkxJQl9XSU5BUEkuCi0gICAgKiBDYXV0aW9uOiB0aGUgc3RhbmRhcmQgWkxJQjEuRExMIGlzIE5PVCBjb21waWxlZCB1c2luZyBaTElCX1dJTkFQSS4KLSAgICAqLwotIyAgaWZkZWYgWkxJQl9XSU5BUEkKLSMgICAgaWZkZWYgRkFSCi0jICAgICAgdW5kZWYgRkFSCi0jICAgIGVuZGlmCi0jICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSAgICAgLyogTm8gbmVlZCBmb3IgX2V4cG9ydCwgdXNlIFpMSUIuREVGIGluc3RlYWQuICovCi0gICAgIC8qIEZvciBjb21wbGV0ZSBXaW5kb3dzIGNvbXBhdGliaWxpdHksIHVzZSBXSU5BUEksIG5vdCBfX3N0ZGNhbGwuICovCi0jICAgIGRlZmluZSBaRVhQT1JUIFdJTkFQSQotIyAgICBpZmRlZiBXSU4zMgotIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgV0lOQVBJVgotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIFpFWFBPUlRWQSBGQVIgQ0RFQ0wKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fQkVPU19fKQotIyAgaWZkZWYgWkxJQl9ETEwKLSMgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAotIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgICAgZWxzZQotIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0jICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBaRVhURVJOCi0jICBkZWZpbmUgWkVYVEVSTiBleHRlcm4KLSNlbmRpZgotI2lmbmRlZiBaRVhQT1JUCi0jICBkZWZpbmUgWkVYUE9SVAotI2VuZGlmCi0jaWZuZGVmIFpFWFBPUlRWQQotIyAgZGVmaW5lIFpFWFBPUlRWQQotI2VuZGlmCi0KLSNpZm5kZWYgRkFSCi0jICBkZWZpbmUgRkFSCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKF9fTUFDVFlQRVNfXykKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgQnl0ZTsgIC8qIDggYml0cyAqLwotI2VuZGlmCi10eXBlZGVmIHVuc2lnbmVkIGludCAgIHVJbnQ7ICAvKiAxNiBiaXRzIG9yIG1vcmUgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgdUxvbmc7IC8qIDMyIGJpdHMgb3IgbW9yZSAqLwotCi0jaWZkZWYgU01BTExfTUVESVVNCi0gICAvKiBCb3JsYW5kIEMvQysrIGFuZCBzb21lIG9sZCBNU0MgdmVyc2lvbnMgaWdub3JlIEZBUiBpbnNpZGUgdHlwZWRlZiAqLwotIyAgZGVmaW5lIEJ5dGVmIEJ5dGUgRkFSCi0jZWxzZQotICAgdHlwZWRlZiBCeXRlICBGQVIgQnl0ZWY7Ci0jZW5kaWYKLXR5cGVkZWYgY2hhciAgRkFSIGNoYXJmOwotdHlwZWRlZiBpbnQgICBGQVIgaW50ZjsKLXR5cGVkZWYgdUludCAgRkFSIHVJbnRmOwotdHlwZWRlZiB1TG9uZyBGQVIgdUxvbmdmOwotCi0jaWZkZWYgU1REQwotICAgdHlwZWRlZiB2b2lkIGNvbnN0ICp2b2lkcGM7Ci0gICB0eXBlZGVmIHZvaWQgRkFSICAgKnZvaWRwZjsKLSAgIHR5cGVkZWYgdm9pZCAgICAgICAqdm9pZHA7Ci0jZWxzZQotICAgdHlwZWRlZiBCeXRlIGNvbnN0ICp2b2lkcGM7Ci0gICB0eXBlZGVmIEJ5dGUgRkFSICAgKnZvaWRwZjsKLSAgIHR5cGVkZWYgQnl0ZSAgICAgICAqdm9pZHA7Ci0jZW5kaWYKLQotLyogLi9jb25maWd1cmUgbWF5ICNkZWZpbmUgWl9VNCBoZXJlICovCi0KLSNpZiAhZGVmaW5lZChaX1U0KSAmJiAhZGVmaW5lZChaX1NPTE8pICYmIGRlZmluZWQoU1REQykKLSMgIGluY2x1ZGUgPGxpbWl0cy5oPgotIyAgaWYgKFVJTlRfTUFYID09IDB4ZmZmZmZmZmZVTCkKLSMgICAgZGVmaW5lIFpfVTQgdW5zaWduZWQKLSMgIGVsc2UKLSMgICAgaWYgKFVMT05HX01BWCA9PSAweGZmZmZmZmZmVUwpCi0jICAgICAgZGVmaW5lIFpfVTQgdW5zaWduZWQgbG9uZwotIyAgICBlbHNlCi0jICAgICAgaWYgKFVTSFJUX01BWCA9PSAweGZmZmZmZmZmVUwpCi0jICAgICAgICBkZWZpbmUgWl9VNCB1bnNpZ25lZCBzaG9ydAotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBaX1U0Ci0gICB0eXBlZGVmIFpfVTQgel9jcmNfdDsKLSNlbHNlCi0gICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgel9jcmNfdDsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VTklTVERfSCAgICAvKiBtYXkgYmUgc2V0IHRvICNpZiAxIGJ5IC4vY29uZmlndXJlICovCi0jICBkZWZpbmUgWl9IQVZFX1VOSVNURF9ICi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1REQVJHX0ggICAgLyogbWF5IGJlIHNldCB0byAjaWYgMSBieSAuL2NvbmZpZ3VyZSAqLwotIyAgZGVmaW5lIFpfSEFWRV9TVERBUkdfSAotI2VuZGlmCi0KLSNpZmRlZiBTVERDCi0jICBpZm5kZWYgWl9TT0xPCi0jICAgIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAgICAgIC8qIGZvciBvZmZfdCAqLwotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX1dJTjMyCi0jICBpbmNsdWRlIDxzdGRkZWYuaD4gICAgICAgICAgIC8qIGZvciB3Y2hhcl90ICovCi0jZW5kaWYKLQotLyogYSBsaXR0bGUgdHJpY2sgdG8gYWNjb21tb2RhdGUgYm90aCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIiBhbmQKLSAqICIjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgMSIgYXMgcmVxdWVzdGluZyA2NC1iaXQgb3BlcmF0aW9ucywgKGV2ZW4KLSAqIHRob3VnaCB0aGUgZm9ybWVyIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIExGUyBkb2N1bWVudCksIGJ1dCBjb25zaWRlcmluZwotICogYm90aCAiI3VuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UiIGFuZCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIDAiIGFzCi0gKiBlcXVpdmFsZW50bHkgcmVxdWVzdGluZyBubyA2NC1iaXQgb3BlcmF0aW9ucwotICovCi0jaWYgZGVmaW5lZChMQVJHRUZJTEU2NF9TT1VSQ0UpICYmIC1fTEFSR0VGSUxFNjRfU09VUkNFIC0gLTEgPT0gMQotIyAgdW5kZWYgX0xBUkdFRklMRTY0X1NPVVJDRQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKSAmJiAhZGVmaW5lZChaX0hBVkVfVU5JU1REX0gpCi0jICBkZWZpbmUgWl9IQVZFX1VOSVNURF9ICi0jZW5kaWYKLSNpZm5kZWYgWl9TT0xPCi0jICBpZiBkZWZpbmVkKFpfSEFWRV9VTklTVERfSCkgfHwgZGVmaW5lZChMQVJHRUZJTEU2NF9TT1VSQ0UpCi0jICAgIGluY2x1ZGUgPHVuaXN0ZC5oPiAgICAgICAgIC8qIGZvciBTRUVLXyosIG9mZl90LCBhbmQgX0xGUzY0X0xBUkdFRklMRSAqLwotIyAgICBpZmRlZiBWTVMKLSMgICAgICBpbmNsdWRlIDx1bml4aW8uaD4gICAgICAgLyogZm9yIG9mZl90ICovCi0jICAgIGVuZGlmCi0jICAgIGlmbmRlZiB6X29mZl90Ci0jICAgICAgZGVmaW5lIHpfb2ZmX3Qgb2ZmX3QKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX0xGUzY0X0xBUkdFRklMRSkgJiYgX0xGUzY0X0xBUkdFRklMRS0wCi0jICBkZWZpbmUgWl9MRlM2NAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpICYmIGRlZmluZWQoWl9MRlM2NCkKLSMgIGRlZmluZSBaX0xBUkdFNjQKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfRklMRV9PRkZTRVRfQklUUykgJiYgX0ZJTEVfT0ZGU0VUX0JJVFMtMCA9PSA2NCAmJiBkZWZpbmVkKFpfTEZTNjQpCi0jICBkZWZpbmUgWl9XQU5UNjQKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoU0VFS19TRVQpICYmICFkZWZpbmVkKFpfU09MTykKLSMgIGRlZmluZSBTRUVLX1NFVCAgICAgICAgMCAgICAgICAvKiBTZWVrIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUuICAqLwotIyAgZGVmaW5lIFNFRUtfQ1VSICAgICAgICAxICAgICAgIC8qIFNlZWsgZnJvbSBjdXJyZW50IHBvc2l0aW9uLiAgKi8KLSMgIGRlZmluZSBTRUVLX0VORCAgICAgICAgMiAgICAgICAvKiBTZXQgZmlsZSBwb2ludGVyIHRvIEVPRiBwbHVzICJvZmZzZXQiICovCi0jZW5kaWYKLQotI2lmbmRlZiB6X29mZl90Ci0jICBkZWZpbmUgel9vZmZfdCBsb25nCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChaX0xBUkdFNjQpCi0jICBkZWZpbmUgel9vZmY2NF90IG9mZjY0X3QKLSNlbHNlCi0jICBpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKFpfU09MTykKLSMgICAgZGVmaW5lIHpfb2ZmNjRfdCBfX2ludDY0Ci0jICBlbHNlCi0jICAgIGRlZmluZSB6X29mZjY0X3Qgel9vZmZfdAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBNVlMgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgZXh0ZXJuYWwgbmFtZXMgbGFyZ2VyIHRoYW4gOCBieXRlcyAqLwotI2lmIGRlZmluZWQoX19NVlNfXykKLSAgI3ByYWdtYSBtYXAoZGVmbGF0ZUluaXRfLCJERUlOIikKLSAgI3ByYWdtYSBtYXAoZGVmbGF0ZUluaXQyXywiREVJTjIiKQotICAjcHJhZ21hIG1hcChkZWZsYXRlRW5kLCJERUVORCIpCi0gICNwcmFnbWEgbWFwKGRlZmxhdGVCb3VuZCwiREVCTkQiKQotICAjcHJhZ21hIG1hcChpbmZsYXRlSW5pdF8sIklOSU4iKQotICAjcHJhZ21hIG1hcChpbmZsYXRlSW5pdDJfLCJJTklOMiIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVFbmQsIklORU5EIikKLSAgI3ByYWdtYSBtYXAoaW5mbGF0ZVN5bmMsIklOU1kiKQotICAjcHJhZ21hIG1hcChpbmZsYXRlU2V0RGljdGlvbmFyeSwiSU5TRURJIikKLSAgI3ByYWdtYSBtYXAoY29tcHJlc3NCb3VuZCwiQ01CTkQiKQotICAjcHJhZ21hIG1hcChpbmZsYXRlX3RhYmxlLCJJTlRBQkwiKQotICAjcHJhZ21hIG1hcChpbmZsYXRlX2Zhc3QsIklORkEiKQotICAjcHJhZ21hIG1hcChpbmZsYXRlX2NvcHlyaWdodCwiSU5DT1BZIikKLSNlbmRpZgotCi0jZW5kaWYgLyogWkNPTkZfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvemxpYi4zIGIvc3JjL3psaWIvemxpYi4zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWQzNDAyLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL3psaWIuMworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0uVEggWkxJQiAzICIyIE1heSAyMDEyIgotLlNIIE5BTUUKLXpsaWIgXC0gY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBsaWJyYXJ5Ci0uU0ggU1lOT1BTSVMKLVtzZWUKLS5JIHpsaWIuaAotZm9yIGZ1bGwgZGVzY3JpcHRpb25dCi0uU0ggREVTQ1JJUFRJT04KLVRoZQotLkkgemxpYgotbGlicmFyeSBpcyBhIGdlbmVyYWwgcHVycG9zZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCi1UaGUgY29kZSBpcyB0aHJlYWQgc2FmZSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbnMKLXVzZWQgYXJlIHRocmVhZCBzYWZlLCBzdWNoIGFzIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLgotSXQgcHJvdmlkZXMgaW4tbWVtb3J5IGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIGZ1bmN0aW9ucywKLWluY2x1ZGluZyBpbnRlZ3JpdHkgY2hlY2tzIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YS4KLVRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBzdXBwb3J0cyBvbmx5IG9uZSBjb21wcmVzc2lvbiBtZXRob2QgKGRlZmxhdGlvbikKLWJ1dCBvdGhlciBhbGdvcml0aG1zIG1heSBiZSBhZGRlZCBsYXRlcgotd2l0aCB0aGUgc2FtZSBzdHJlYW0gaW50ZXJmYWNlLgotLkxQCi1Db21wcmVzc2lvbiBjYW4gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwIGlmIHRoZSBidWZmZXJzIGFyZSBsYXJnZSBlbm91Z2gKLW9yIGNhbiBiZSBkb25lIGJ5IHJlcGVhdGVkIGNhbGxzIG9mIHRoZSBjb21wcmVzc2lvbiBmdW5jdGlvbi4KLUluIHRoZSBsYXR0ZXIgY2FzZSwKLXRoZSBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtZSB0aGUgb3V0cHV0Ci0ocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgotLkxQCi1UaGUgbGlicmFyeSBhbHNvIHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4KLS5JUiBnemlwICgxKQotKC5neikgZm9ybWF0Ci13aXRoIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgb2Ygc3RkaW8uCi0uTFAKLVRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLgotVGhlIGRlY29kZXIgY2hlY2tzIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLAotc28gdGhlIGxpYnJhcnkgc2hvdWxkIG5ldmVyIGNyYXNoIGV2ZW4gaW4gdGhlIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgotLkxQCi1BbGwgZnVuY3Rpb25zIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlCi0uSVIgemxpYi5oIC4KLVRoZSBkaXN0cmlidXRpb24gc291cmNlIGluY2x1ZGVzIGV4YW1wbGVzIG9mIHVzZSBvZiB0aGUgbGlicmFyeQotaW4gdGhlIGZpbGVzCi0uSSB0ZXN0L2V4YW1wbGUuYwotYW5kCi0uSVIgdGVzdC9taW5pZ3ppcC5jLAotYXMgd2VsbCBhcyBvdGhlciBleGFtcGxlcyBpbiB0aGUKLS5JUiBleGFtcGxlcy8KLWRpcmVjdG9yeS4KLS5MUAotQ2hhbmdlcyB0byB0aGlzIHZlcnNpb24gYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUKLS5JIENoYW5nZUxvZwotdGhhdCBhY2NvbXBhbmllcyB0aGUgc291cmNlLgotLkxQCi0uSSB6bGliCi1pcyBhdmFpbGFibGUgaW4gSmF2YSB1c2luZyB0aGUgamF2YS51dGlsLnppcCBwYWNrYWdlOgotLklQCi1odHRwOi8vamF2YS5zdW4uY29tL2RldmVsb3Blci90ZWNobmljYWxBcnRpY2xlcy9Qcm9ncmFtbWluZy9jb21wcmVzc2lvbi8KLS5MUAotQSBQZXJsIGludGVyZmFjZSB0bwotLklSIHpsaWIgLAotd3JpdHRlbiBieSBQYXVsIE1hcnF1ZXNzIChwbXFzQGNwYW4ub3JnKSwKLWlzIGF2YWlsYWJsZSBhdCBDUEFOIChDb21wcmVoZW5zaXZlIFBlcmwgQXJjaGl2ZSBOZXR3b3JrKSBzaXRlcywKLWluY2x1ZGluZzoKLS5JUAotaHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+cG1xcy9JTy1Db21wcmVzcy1abGliLwotLkxQCi1BIFB5dGhvbiBpbnRlcmZhY2UgdG8KLS5JUiB6bGliICwKLXdyaXR0ZW4gYnkgQS5NLiBLdWNobGluZyAoYW1rQG1hZ25ldC5jb20pLAotaXMgYXZhaWxhYmxlIGluIFB5dGhvbiAxLjUgYW5kIGxhdGVyIHZlcnNpb25zOgotLklQCi1odHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvemxpYi5odG1sCi0uTFAKLS5JIHpsaWIKLWlzIGJ1aWx0IGludG8KLS5JUiB0Y2w6Ci0uSVAKLWh0dHA6Ly93aWtpLnRjbC50ay80NjEwCi0uTFAKLUFuIGV4cGVyaW1lbnRhbCBwYWNrYWdlIHRvIHJlYWQgYW5kIHdyaXRlIGZpbGVzIGluIC56aXAgZm9ybWF0LAotd3JpdHRlbiBvbiB0b3Agb2YKLS5JIHpsaWIKLWJ5IEdpbGxlcyBWb2xsYW50IChpbmZvQHdpbmltYWdlLmNvbSksCi1pcyBhdmFpbGFibGUgYXQ6Ci0uSVAKLWh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sCi1hbmQgYWxzbyBpbiB0aGUKLS5JIGNvbnRyaWIvbWluaXppcAotZGlyZWN0b3J5IG9mIHRoZSBtYWluCi0uSSB6bGliCi1zb3VyY2UgZGlzdHJpYnV0aW9uLgotLlNIICJTRUUgQUxTTyIKLVRoZQotLkkgemxpYgotd2ViIHNpdGUgY2FuIGJlIGZvdW5kIGF0OgotLklQCi1odHRwOi8vemxpYi5uZXQvCi0uTFAKLVRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQwotKFJlcXVlc3QgZm9yIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzOgotLklQCi1odHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMxOTUwIChmb3IgdGhlIHpsaWIgaGVhZGVyIGFuZCB0cmFpbGVyIGZvcm1hdCkKLS5icgotaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTk1MSAoZm9yIHRoZSBkZWZsYXRlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQpCi0uYnIKLWh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5NTIgKGZvciB0aGUgZ3ppcCBoZWFkZXIgYW5kIHRyYWlsZXIgZm9ybWF0KQotLkxQCi1NYXJrIE5lbHNvbiB3cm90ZSBhbiBhcnRpY2xlIGFib3V0Ci0uSSB6bGliCi1mb3IgdGhlIEphbi4gMTk5NyBpc3N1ZSBvZiAgRHIuIERvYmIncyBKb3VybmFsOwotYSBjb3B5IG9mIHRoZSBhcnRpY2xlIGlzIGF2YWlsYWJsZSBhdDoKLS5JUAotaHR0cDovL21hcmtuZWxzb24udXMvMTk5Ny8wMS8wMS96bGliLWVuZ2luZS8KLS5TSCAiUkVQT1JUSU5HIFBST0JMRU1TIgotQmVmb3JlIHJlcG9ydGluZyBhIHByb2JsZW0sCi1wbGVhc2UgY2hlY2sgdGhlCi0uSSB6bGliCi13ZWIgc2l0ZSB0byB2ZXJpZnkgdGhhdCB5b3UgaGF2ZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YKLS5JUiB6bGliIDsKLW90aGVyd2lzZSwKLW9idGFpbiB0aGUgbGF0ZXN0IHZlcnNpb24gYW5kIHNlZSBpZiB0aGUgcHJvYmxlbSBzdGlsbCBleGlzdHMuCi1QbGVhc2UgcmVhZCB0aGUKLS5JIHpsaWIKLUZBUSBhdDoKLS5JUAotaHR0cDovL3psaWIubmV0L3psaWJfZmFxLmh0bWwKLS5MUAotYmVmb3JlIGFza2luZyBmb3IgaGVscC4KLVNlbmQgcXVlc3Rpb25zIGFuZC9vciBjb21tZW50cyB0byB6bGliQGd6aXAub3JnLAotb3IgKGZvciB0aGUgV2luZG93cyBETEwgdmVyc2lvbikgdG8gR2lsbGVzIFZvbGxhbnQgKGluZm9Ad2luaW1hZ2UuY29tKS4KLS5TSCBBVVRIT1JTCi1WZXJzaW9uIDEuMi43Ci1Db3B5cmlnaHQgKEMpIDE5OTUtMjAxMiBKZWFuLWxvdXAgR2FpbGx5IChqbG91cEBnemlwLm9yZykKLWFuZCBNYXJrIEFkbGVyIChtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1KS4KLS5MUAotVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMtaXMsIgotd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLWFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi1TZWUgdGhlIGRpc3RyaWJ1dGlvbiBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHJlcXVpcmVtZW50cwotZ292ZXJuaW5nIHJlZGlzdHJpYnV0aW9uLgotVGhlIGRlZmxhdGUgZm9ybWF0IHVzZWQgYnkKLS5JIHpsaWIKLXdhcyBkZWZpbmVkIGJ5IFBoaWwgS2F0ei4KLVRoZSBkZWZsYXRlIGFuZAotLkkgemxpYgotc3BlY2lmaWNhdGlvbnMgd2VyZSB3cml0dGVuIGJ5IEwuIFBldGVyIERldXRzY2guCi1UaGFua3MgdG8gYWxsIHRoZSBwZW9wbGUgd2hvIHJlcG9ydGVkIHByb2JsZW1zIGFuZCBzdWdnZXN0ZWQgdmFyaW91cwotaW1wcm92ZW1lbnRzIGluCi0uSVIgemxpYiA7Ci13aG8gYXJlIHRvbyBudW1lcm91cyB0byBjaXRlIGhlcmUuCi0uTFAKLVVOSVggbWFudWFsIHBhZ2UgYnkgUi4gUC4gQy4gUm9kZ2VycywKLVUuUy4gTmF0aW9uYWwgTGlicmFyeSBvZiBNZWRpY2luZSAocm9kZ2Vyc0BubG0ubmloLmdvdikuCi0uXCIgZW5kIG9mIG1hbiBwYWdlCmRpZmYgLS1naXQgYS9zcmMvemxpYi96bGliLjMucGRmIGIvc3JjL3psaWIvemxpYi4zLnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg1MzA2Yy4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi96bGliLjMucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3psaWIvemxpYi5oIGIvc3JjL3psaWIvemxpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTNlZTFhLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL3psaWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NjIgKzAsMCBAQAotLyoKLSAqIHpsaWIgdmVyc2lvbiAxLjIuNy1vcHRpcG5nLCAyMDEyLUF1Zy0yNAotICoKLSAqIFRoaXMgaXMgYW4gYWx0ZXJlZCB2ZXJzaW9uIG9mIHpsaWIuCi0gKiBTZWUgUkVBRE1FLm9wdGlwbmcudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICovCi0KLSNpZm5kZWYgT1BUSVBOR19DT05GSUdfWkxJQgotI2RlZmluZSBPUFRJUE5HX0NPTkZJR19aTElCCi0KLSNkZWZpbmUgTk9fR1pDT01QUkVTUwotI2RlZmluZSBOT19HWklQCi0KLSNkZWZpbmUgVE9PX0ZBUiAzMjc2OFUKLQotI2VuZGlmIC8qIE9QVElQTkdfQ09ORklHX1pMSUIgKi8KLQotCi0vKiB6bGliLmggLS0gaW50ZXJmYWNlIG9mIHRoZSAnemxpYicgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAgdmVyc2lvbiAxLjIuNywgTWF5IDJuZCwgMjAxMgotCi0gIENvcHlyaWdodCAoQykgMTk5NS0yMDEyIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgotICBqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ci0KLQotICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzIChSZXF1ZXN0IGZvcgotICBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMxOTUwCi0gICh6bGliIGZvcm1hdCksIHJmYzE5NTEgKGRlZmxhdGUgZm9ybWF0KSBhbmQgcmZjMTk1MiAoZ3ppcCBmb3JtYXQpLgotKi8KLQotI2lmbmRlZiBaTElCX0gKLSNkZWZpbmUgWkxJQl9ICi0KLSNpbmNsdWRlICJ6Y29uZi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgWkxJQl9WRVJTSU9OICIxLjIuNy1vcHRpcG5nIgotI2RlZmluZSBaTElCX1ZFUk5VTSAweDEyN2YKLSNkZWZpbmUgWkxJQl9WRVJfTUFKT1IgMQotI2RlZmluZSBaTElCX1ZFUl9NSU5PUiAyCi0jZGVmaW5lIFpMSUJfVkVSX1JFVklTSU9OIDcKLSNkZWZpbmUgWkxJQl9WRVJfU1VCUkVWSVNJT04gMAotCi0vKgotICAgIFRoZSAnemxpYicgY29tcHJlc3Npb24gbGlicmFyeSBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kCi0gIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zLCBpbmNsdWRpbmcgaW50ZWdyaXR5IGNoZWNrcyBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEuCi0gIFRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBzdXBwb3J0cyBvbmx5IG9uZSBjb21wcmVzc2lvbiBtZXRob2QgKGRlZmxhdGlvbikKLSAgYnV0IG90aGVyIGFsZ29yaXRobXMgd2lsbCBiZSBhZGRlZCBsYXRlciBhbmQgd2lsbCBoYXZlIHRoZSBzYW1lIHN0cmVhbQotICBpbnRlcmZhY2UuCi0KLSAgICBDb21wcmVzc2lvbiBjYW4gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwIGlmIHRoZSBidWZmZXJzIGFyZSBsYXJnZSBlbm91Z2gsCi0gIG9yIGNhbiBiZSBkb25lIGJ5IHJlcGVhdGVkIGNhbGxzIG9mIHRoZSBjb21wcmVzc2lvbiBmdW5jdGlvbi4gIEluIHRoZSBsYXR0ZXIKLSAgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1lIHRoZSBvdXRwdXQKLSAgKHByb3ZpZGluZyBtb3JlIG91dHB1dCBzcGFjZSkgYmVmb3JlIGVhY2ggY2FsbC4KLQotICAgIFRoZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHVzZWQgYnkgZGVmYXVsdCBieSB0aGUgaW4tbWVtb3J5IGZ1bmN0aW9ucyBpcwotICB0aGUgemxpYiBmb3JtYXQsIHdoaWNoIGlzIGEgemxpYiB3cmFwcGVyIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTAsIHdyYXBwZWQKLSAgYXJvdW5kIGEgZGVmbGF0ZSBzdHJlYW0sIHdoaWNoIGlzIGl0c2VsZiBkb2N1bWVudGVkIGluIFJGQyAxOTUxLgotCi0gICAgVGhlIGxpYnJhcnkgYWxzbyBzdXBwb3J0cyByZWFkaW5nIGFuZCB3cml0aW5nIGZpbGVzIGluIGd6aXAgKC5neikgZm9ybWF0Ci0gIHdpdGggYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhhdCBvZiBzdGRpbyB1c2luZyB0aGUgZnVuY3Rpb25zIHRoYXQgc3RhcnQKLSAgd2l0aCAiZ3oiLiAgVGhlIGd6aXAgZm9ybWF0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSB6bGliIGZvcm1hdC4gIGd6aXAgaXMgYQotICBnemlwIHdyYXBwZXIsIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTIsIHdyYXBwZWQgYXJvdW5kIGEgZGVmbGF0ZSBzdHJlYW0uCi0KLSAgICBUaGlzIGxpYnJhcnkgY2FuIG9wdGlvbmFsbHkgcmVhZCBhbmQgd3JpdGUgZ3ppcCBzdHJlYW1zIGluIG1lbW9yeSBhcyB3ZWxsLgotCi0gICAgVGhlIHpsaWIgZm9ybWF0IHdhcyBkZXNpZ25lZCB0byBiZSBjb21wYWN0IGFuZCBmYXN0IGZvciB1c2UgaW4gbWVtb3J5Ci0gIGFuZCBvbiBjb21tdW5pY2F0aW9ucyBjaGFubmVscy4gIFRoZSBnemlwIGZvcm1hdCB3YXMgZGVzaWduZWQgZm9yIHNpbmdsZS0KLSAgZmlsZSBjb21wcmVzc2lvbiBvbiBmaWxlIHN5c3RlbXMsIGhhcyBhIGxhcmdlciBoZWFkZXIgdGhhbiB6bGliIHRvIG1haW50YWluCi0gIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiwgYW5kIHVzZXMgYSBkaWZmZXJlbnQsIHNsb3dlciBjaGVjayBtZXRob2QgdGhhbiB6bGliLgotCi0gICAgVGhlIGxpYnJhcnkgZG9lcyBub3QgaW5zdGFsbCBhbnkgc2lnbmFsIGhhbmRsZXIuICBUaGUgZGVjb2RlciBjaGVja3MKLSAgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsIHNvIHRoZSBsaWJyYXJ5IHNob3VsZCBuZXZlciBjcmFzaAotICBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgotKi8KLQotdHlwZWRlZiB2b2lkcGYgKCphbGxvY19mdW5jKSBPRigodm9pZHBmIG9wYXF1ZSwgdUludCBpdGVtcywgdUludCBzaXplKSk7Ci10eXBlZGVmIHZvaWQgICAoKmZyZWVfZnVuYykgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgYWRkcmVzcykpOwotCi1zdHJ1Y3QgaW50ZXJuYWxfc3RhdGU7Ci0KLXR5cGVkZWYgc3RydWN0IHpfc3RyZWFtX3MgewotICAgIHpfY29uc3QgQnl0ZWYgKm5leHRfaW47ICAgICAvKiBuZXh0IGlucHV0IGJ5dGUgKi8KLSAgICB1SW50ICAgICBhdmFpbF9pbjsgIC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgbmV4dF9pbiAqLwotICAgIHVMb25nICAgIHRvdGFsX2luOyAgLyogdG90YWwgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyICovCi0KLSAgICBCeXRlZiAgICAqbmV4dF9vdXQ7IC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqLwotICAgIHVJbnQgICAgIGF2YWlsX291dDsgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgbmV4dF9vdXQgKi8KLSAgICB1TG9uZyAgICB0b3RhbF9vdXQ7IC8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovCi0KLSAgICB6X2NvbnN0IGNoYXIgKm1zZzsgIC8qIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvciAqLwotICAgIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKnN0YXRlOyAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi8KLQotICAgIGFsbG9jX2Z1bmMgemFsbG9jOyAgLyogdXNlZCB0byBhbGxvY2F0ZSB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KLSAgICBmcmVlX2Z1bmMgIHpmcmVlOyAgIC8qIHVzZWQgdG8gZnJlZSB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KLSAgICB2b2lkcGYgICAgIG9wYXF1ZTsgIC8qIHByaXZhdGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvIHphbGxvYyBhbmQgemZyZWUgKi8KLQotICAgIGludCAgICAgZGF0YV90eXBlOyAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBiaW5hcnkgb3IgdGV4dCAqLwotICAgIHVMb25nICAgYWRsZXI7ICAgICAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi8KLSAgICB1TG9uZyAgIHJlc2VydmVkOyAgIC8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi19IHpfc3RyZWFtOwotCi10eXBlZGVmIHpfc3RyZWFtIEZBUiAqel9zdHJlYW1wOwotCi0vKgotICAgICBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBwYXNzZWQgdG8gYW5kIGZyb20gemxpYiByb3V0aW5lcy4gIFNlZSBSRkMgMTk1MgotICBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBtZWFuaW5ncyBvZiB0aGVzZSBmaWVsZHMuCi0qLwotdHlwZWRlZiBzdHJ1Y3QgZ3pfaGVhZGVyX3MgewotICAgIGludCAgICAgdGV4dDsgICAgICAgLyogdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dCAqLwotICAgIHVMb25nICAgdGltZTsgICAgICAgLyogbW9kaWZpY2F0aW9uIHRpbWUgKi8KLSAgICBpbnQgICAgIHhmbGFnczsgICAgIC8qIGV4dHJhIGZsYWdzIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovCi0gICAgaW50ICAgICBvczsgICAgICAgICAvKiBvcGVyYXRpbmcgc3lzdGVtICovCi0gICAgQnl0ZWYgICAqZXh0cmE7ICAgICAvKiBwb2ludGVyIHRvIGV4dHJhIGZpZWxkIG9yIFpfTlVMTCBpZiBub25lICovCi0gICAgdUludCAgICBleHRyYV9sZW47ICAvKiBleHRyYSBmaWVsZCBsZW5ndGggKHZhbGlkIGlmIGV4dHJhICE9IFpfTlVMTCkgKi8KLSAgICB1SW50ICAgIGV4dHJhX21heDsgIC8qIHNwYWNlIGF0IGV4dHJhIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCi0gICAgQnl0ZWYgICAqbmFtZTsgICAgICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBmaWxlIG5hbWUgb3IgWl9OVUxMICovCi0gICAgdUludCAgICBuYW1lX21heDsgICAvKiBzcGFjZSBhdCBuYW1lIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCi0gICAgQnl0ZWYgICAqY29tbWVudDsgICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBjb21tZW50IG9yIFpfTlVMTCAqLwotICAgIHVJbnQgICAgY29tbV9tYXg7ICAgLyogc3BhY2UgYXQgY29tbWVudCAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqLwotICAgIGludCAgICAgaGNyYzsgICAgICAgLyogdHJ1ZSBpZiB0aGVyZSB3YXMgb3Igd2lsbCBiZSBhIGhlYWRlciBjcmMgKi8KLSAgICBpbnQgICAgIGRvbmU7ICAgICAgIC8qIHRydWUgd2hlbiBkb25lIHJlYWRpbmcgZ3ppcCBoZWFkZXIgKG5vdCB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovCi19IGd6X2hlYWRlcjsKLQotdHlwZWRlZiBnel9oZWFkZXIgRkFSICpnel9oZWFkZXJwOwotCi0vKgotICAgICBUaGUgYXBwbGljYXRpb24gbXVzdCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4gd2hlbiBhdmFpbF9pbiBoYXMgZHJvcHBlZAotICAgdG8gemVyby4gIEl0IG11c3QgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgd2hlbiBhdmFpbF9vdXQgaGFzIGRyb3BwZWQKLSAgIHRvIHplcm8uICBUaGUgYXBwbGljYXRpb24gbXVzdCBpbml0aWFsaXplIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBiZWZvcmUKLSAgIGNhbGxpbmcgdGhlIGluaXQgZnVuY3Rpb24uICBBbGwgb3RoZXIgZmllbGRzIGFyZSBzZXQgYnkgdGhlIGNvbXByZXNzaW9uCi0gICBsaWJyYXJ5IGFuZCBtdXN0IG5vdCBiZSB1cGRhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLQotICAgICBUaGUgb3BhcXVlIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QKLSAgIHBhcmFtZXRlciBmb3IgY2FsbHMgb2YgemFsbG9jIGFuZCB6ZnJlZS4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgY3VzdG9tCi0gICBtZW1vcnkgbWFuYWdlbWVudC4gIFRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGF0dGFjaGVzIG5vIG1lYW5pbmcgdG8gdGhlCi0gICBvcGFxdWUgdmFsdWUuCi0KLSAgICAgemFsbG9jIG11c3QgcmV0dXJuIFpfTlVMTCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIG9iamVjdC4KLSAgIElmIHpsaWIgaXMgdXNlZCBpbiBhIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9uLCB6YWxsb2MgYW5kIHpmcmVlIG11c3QgYmUKLSAgIHRocmVhZCBzYWZlLgotCi0gICAgIE9uIDE2LWJpdCBzeXN0ZW1zLCB0aGUgZnVuY3Rpb25zIHphbGxvYyBhbmQgemZyZWUgbXVzdCBiZSBhYmxlIHRvIGFsbG9jYXRlCi0gICBleGFjdGx5IDY1NTM2IGJ5dGVzLCBidXQgd2lsbCBub3QgYmUgcmVxdWlyZWQgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIHRoaXMgaWYKLSAgIHRoZSBzeW1ib2wgTUFYU0VHXzY0SyBpcyBkZWZpbmVkIChzZWUgemNvbmYuaCkuICBXQVJOSU5HOiBPbiBNU0RPUywgcG9pbnRlcnMKLSAgIHJldHVybmVkIGJ5IHphbGxvYyBmb3Igb2JqZWN0cyBvZiBleGFjdGx5IDY1NTM2IGJ5dGVzICptdXN0KiBoYXZlIHRoZWlyCi0gICBvZmZzZXQgbm9ybWFsaXplZCB0byB6ZXJvLiAgVGhlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbiBwcm92aWRlZCBieSB0aGlzCi0gICBsaWJyYXJ5IGVuc3VyZXMgdGhpcyAoc2VlIHp1dGlsLmMpLiAgVG8gcmVkdWNlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIGF2b2lkCi0gICBhbnkgYWxsb2NhdGlvbiBvZiA2NEsgb2JqZWN0cywgYXQgdGhlIGV4cGVuc2Ugb2YgY29tcHJlc3Npb24gcmF0aW8sIGNvbXBpbGUKLSAgIHRoZSBsaWJyYXJ5IHdpdGggLURNQVhfV0JJVFM9MTQgKHNlZSB6Y29uZi5oKS4KLQotICAgICBUaGUgZmllbGRzIHRvdGFsX2luIGFuZCB0b3RhbF9vdXQgY2FuIGJlIHVzZWQgZm9yIHN0YXRpc3RpY3Mgb3IgcHJvZ3Jlc3MKLSAgIHJlcG9ydHMuICBBZnRlciBjb21wcmVzc2lvbiwgdG90YWxfaW4gaG9sZHMgdGhlIHRvdGFsIHNpemUgb2YgdGhlCi0gICB1bmNvbXByZXNzZWQgZGF0YSBhbmQgbWF5IGJlIHNhdmVkIGZvciB1c2UgaW4gdGhlIGRlY29tcHJlc3NvciAocGFydGljdWxhcmx5Ci0gICBpZiB0aGUgZGVjb21wcmVzc29yIHdhbnRzIHRvIGRlY29tcHJlc3MgZXZlcnl0aGluZyBpbiBhIHNpbmdsZSBzdGVwKS4KLSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnN0YW50cyAqLwotCi0jZGVmaW5lIFpfTk9fRkxVU0ggICAgICAwCi0jZGVmaW5lIFpfUEFSVElBTF9GTFVTSCAxCi0jZGVmaW5lIFpfU1lOQ19GTFVTSCAgICAyCi0jZGVmaW5lIFpfRlVMTF9GTFVTSCAgICAzCi0jZGVmaW5lIFpfRklOSVNIICAgICAgICA0Ci0jZGVmaW5lIFpfQkxPQ0sgICAgICAgICA1Ci0jZGVmaW5lIFpfVFJFRVMgICAgICAgICA2Ci0vKiBBbGxvd2VkIGZsdXNoIHZhbHVlczsgc2VlIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpIGJlbG93IGZvciBkZXRhaWxzICovCi0KLSNkZWZpbmUgWl9PSyAgICAgICAgICAgIDAKLSNkZWZpbmUgWl9TVFJFQU1fRU5EICAgIDEKLSNkZWZpbmUgWl9ORUVEX0RJQ1QgICAgIDIKLSNkZWZpbmUgWl9FUlJOTyAgICAgICAgKC0xKQotI2RlZmluZSBaX1NUUkVBTV9FUlJPUiAoLTIpCi0jZGVmaW5lIFpfREFUQV9FUlJPUiAgICgtMykKLSNkZWZpbmUgWl9NRU1fRVJST1IgICAgKC00KQotI2RlZmluZSBaX0JVRl9FUlJPUiAgICAoLTUpCi0jZGVmaW5lIFpfVkVSU0lPTl9FUlJPUiAoLTYpCi0vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzCi0gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuCi0gKi8KLQotI2RlZmluZSBaX05PX0NPTVBSRVNTSU9OICAgICAgICAgMAotI2RlZmluZSBaX0JFU1RfU1BFRUQgICAgICAgICAgICAgMQotI2RlZmluZSBaX0JFU1RfQ09NUFJFU1NJT04gICAgICAgOQotI2RlZmluZSBaX0RFRkFVTFRfQ09NUFJFU1NJT04gICgtMSkKLS8qIGNvbXByZXNzaW9uIGxldmVscyAqLwotCi0jZGVmaW5lIFpfRklMVEVSRUQgICAgICAgICAgICAxCi0jZGVmaW5lIFpfSFVGRk1BTl9PTkxZICAgICAgICAyCi0jZGVmaW5lIFpfUkxFICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFpfRklYRUQgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFpfREVGQVVMVF9TVFJBVEVHWSAgICAwCi0vKiBjb21wcmVzc2lvbiBzdHJhdGVneTsgc2VlIGRlZmxhdGVJbml0MigpIGJlbG93IGZvciBkZXRhaWxzICovCi0KLSNkZWZpbmUgWl9CSU5BUlkgICAwCi0jZGVmaW5lIFpfVEVYVCAgICAgMQotI2RlZmluZSBaX0FTQ0lJICAgIFpfVEVYVCAgIC8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggMS4yLjIgYW5kIGVhcmxpZXIgKi8KLSNkZWZpbmUgWl9VTktOT1dOICAyCi0vKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAodGhvdWdoIHNlZSBpbmZsYXRlKCkpICovCi0KLSNkZWZpbmUgWl9ERUZMQVRFRCAgIDgKLS8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAodGhlIG9ubHkgb25lIHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24pICovCi0KLSNkZWZpbmUgWl9OVUxMICAwICAvKiBmb3IgaW5pdGlhbGl6aW5nIHphbGxvYywgemZyZWUsIG9wYXF1ZSAqLwotCi0jZGVmaW5lIHpsaWJfdmVyc2lvbiB6bGliVmVyc2lvbigpCi0vKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIDwgMS4wLjIgKi8KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNpYyBmdW5jdGlvbnMgKi8KLQotWkVYVEVSTiBjb25zdCBjaGFyICogWkVYUE9SVCB6bGliVmVyc2lvbiBPRigodm9pZCkpOwotLyogVGhlIGFwcGxpY2F0aW9uIGNhbiBjb21wYXJlIHpsaWJWZXJzaW9uIGFuZCBaTElCX1ZFUlNJT04gZm9yIGNvbnNpc3RlbmN5LgotICAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBkaWZmZXJzLCB0aGUgbGlicmFyeSBjb2RlIGFjdHVhbGx5IHVzZWQgaXMgbm90Ci0gICBjb21wYXRpYmxlIHdpdGggdGhlIHpsaWIuaCBoZWFkZXIgZmlsZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIFRoaXMgY2hlY2sKLSAgIGlzIGF1dG9tYXRpY2FsbHkgbWFkZSBieSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQuCi0gKi8KLQotLyoKLVpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgbGV2ZWwpKTsKLQotICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBjb21wcmVzc2lvbi4gIFRoZSBmaWVsZHMKLSAgIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieSB0aGUgY2FsbGVyLiAgSWYKLSAgIHphbGxvYyBhbmQgemZyZWUgYXJlIHNldCB0byBaX05VTEwsIGRlZmxhdGVJbml0IHVwZGF0ZXMgdGhlbSB0byB1c2UgZGVmYXVsdAotICAgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCi0KLSAgICAgVGhlIGNvbXByZXNzaW9uIGxldmVsIG11c3QgYmUgWl9ERUZBVUxUX0NPTVBSRVNTSU9OLCBvciBiZXR3ZWVuIDAgYW5kIDk6Ci0gICAxIGdpdmVzIGJlc3Qgc3BlZWQsIDkgZ2l2ZXMgYmVzdCBjb21wcmVzc2lvbiwgMCBnaXZlcyBubyBjb21wcmVzc2lvbiBhdCBhbGwKLSAgICh0aGUgaW5wdXQgZGF0YSBpcyBzaW1wbHkgY29waWVkIGEgYmxvY2sgYXQgYSB0aW1lKS4gIFpfREVGQVVMVF9DT01QUkVTU0lPTgotICAgcmVxdWVzdHMgYSBkZWZhdWx0IGNvbXByb21pc2UgYmV0d2VlbiBzcGVlZCBhbmQgY29tcHJlc3Npb24gKGN1cnJlbnRseQotICAgZXF1aXZhbGVudCB0byBsZXZlbCA2KS4KLQotICAgICBkZWZsYXRlSW5pdCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKLSAgIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgbGV2ZWwgaXMgbm90IGEgdmFsaWQgY29tcHJlc3Npb24gbGV2ZWwsIG9yCi0gICBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uICh6bGliX3ZlcnNpb24pIGlzIGluY29tcGF0aWJsZQotICAgd2l0aCB0aGUgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIgKFpMSUJfVkVSU0lPTikuICBtc2cgaXMgc2V0IHRvIG51bGwKLSAgIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBkZWZsYXRlSW5pdCBkb2VzIG5vdCBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjoKLSAgIHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KLSovCi0KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGZsdXNoKSk7Ci0vKgotICAgIGRlZmxhdGUgY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAotICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuICBJdCBtYXkgaW50cm9kdWNlCi0gIHNvbWUgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkgZXhjZXB0IHdoZW4KLSAgZm9yY2VkIHRvIGZsdXNoLgotCi0gICAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gIGRlZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCi0gIGZvbGxvd2luZyBhY3Rpb25zOgotCi0gIC0gQ29tcHJlc3MgbW9yZSBpbnB1dCBzdGFydGluZyBhdCBuZXh0X2luIGFuZCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4KLSAgICBhY2NvcmRpbmdseS4gIElmIG5vdCBhbGwgaW5wdXQgY2FuIGJlIHByb2Nlc3NlZCAoYmVjYXVzZSB0aGVyZSBpcyBub3QKLSAgICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciksIG5leHRfaW4gYW5kIGF2YWlsX2luIGFyZSB1cGRhdGVkIGFuZAotICAgIHByb2Nlc3Npbmcgd2lsbCByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiBkZWZsYXRlKCkuCi0KLSAgLSBQcm92aWRlIG1vcmUgb3V0cHV0IHN0YXJ0aW5nIGF0IG5leHRfb3V0IGFuZCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dAotICAgIGFjY29yZGluZ2x5LiAgVGhpcyBhY3Rpb24gaXMgZm9yY2VkIGlmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgbm9uIHplcm8uCi0gICAgRm9yY2luZyBmbHVzaCBmcmVxdWVudGx5IGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbywgc28gdGhpcyBwYXJhbWV0ZXIKLSAgICBzaG91bGQgYmUgc2V0IG9ubHkgd2hlbiBuZWNlc3NhcnkgKGluIGludGVyYWN0aXZlIGFwcGxpY2F0aW9ucykuICBTb21lCi0gICAgb3V0cHV0IG1heSBiZSBwcm92aWRlZCBldmVuIGlmIGZsdXNoIGlzIG5vdCBzZXQuCi0KLSAgICBCZWZvcmUgdGhlIGNhbGwgb2YgZGVmbGF0ZSgpLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IGF0IGxlYXN0Ci0gIG9uZSBvZiB0aGUgYWN0aW9ucyBpcyBwb3NzaWJsZSwgYnkgcHJvdmlkaW5nIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWluZyBtb3JlCi0gIG91dHB1dCwgYW5kIHVwZGF0aW5nIGF2YWlsX2luIG9yIGF2YWlsX291dCBhY2NvcmRpbmdseTsgYXZhaWxfb3V0IHNob3VsZAotICBuZXZlciBiZSB6ZXJvIGJlZm9yZSB0aGUgY2FsbC4gIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUgY29tcHJlc3NlZAotICBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yIGV4YW1wbGUgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsIChhdmFpbF9vdXQKLSAgPT0gMCksIG9yIGFmdGVyIGVhY2ggY2FsbCBvZiBkZWZsYXRlKCkuICBJZiBkZWZsYXRlIHJldHVybnMgWl9PSyBhbmQgd2l0aAotICB6ZXJvIGF2YWlsX291dCwgaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlIG91dHB1dAotICBidWZmZXIgYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBtb3JlIG91dHB1dCBwZW5kaW5nLgotCi0gICAgTm9ybWFsbHkgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9OT19GTFVTSCwgd2hpY2ggYWxsb3dzIGRlZmxhdGUgdG8KLSAgZGVjaWRlIGhvdyBtdWNoIGRhdGEgdG8gYWNjdW11bGF0ZSBiZWZvcmUgcHJvZHVjaW5nIG91dHB1dCwgaW4gb3JkZXIgdG8KLSAgbWF4aW1pemUgY29tcHJlc3Npb24uCi0KLSAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX1NZTkNfRkxVU0gsIGFsbCBwZW5kaW5nIG91dHB1dCBpcwotICBmbHVzaGVkIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGFuZCB0aGUgb3V0cHV0IGlzIGFsaWduZWQgb24gYSBieXRlIGJvdW5kYXJ5LCBzbwotICB0aGF0IHRoZSBkZWNvbXByZXNzb3IgY2FuIGdldCBhbGwgaW5wdXQgZGF0YSBhdmFpbGFibGUgc28gZmFyLiAgKEluCi0gIHBhcnRpY3VsYXIgYXZhaWxfaW4gaXMgemVybyBhZnRlciB0aGUgY2FsbCBpZiBlbm91Z2ggb3V0cHV0IHNwYWNlIGhhcyBiZWVuCi0gIHByb3ZpZGVkIGJlZm9yZSB0aGUgY2FsbC4pIEZsdXNoaW5nIG1heSBkZWdyYWRlIGNvbXByZXNzaW9uIGZvciBzb21lCi0gIGNvbXByZXNzaW9uIGFsZ29yaXRobXMgYW5kIHNvIGl0IHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBuZWNlc3NhcnkuICBUaGlzCi0gIGNvbXBsZXRlcyB0aGUgY3VycmVudCBkZWZsYXRlIGJsb2NrIGFuZCBmb2xsb3dzIGl0IHdpdGggYW4gZW1wdHkgc3RvcmVkIGJsb2NrCi0gIHRoYXQgaXMgdGhyZWUgYml0cyBwbHVzIGZpbGxlciBiaXRzIHRvIHRoZSBuZXh0IGJ5dGUsIGZvbGxvd2VkIGJ5IGZvdXIgYnl0ZXMKLSAgKDAwIDAwIGZmIGZmKS4KLQotICAgIElmIGZsdXNoIGlzIHNldCB0byBaX1BBUlRJQUxfRkxVU0gsIGFsbCBwZW5kaW5nIG91dHB1dCBpcyBmbHVzaGVkIHRvIHRoZQotICBvdXRwdXQgYnVmZmVyLCBidXQgdGhlIG91dHB1dCBpcyBub3QgYWxpZ25lZCB0byBhIGJ5dGUgYm91bmRhcnkuICBBbGwgb2YgdGhlCi0gIGlucHV0IGRhdGEgc28gZmFyIHdpbGwgYmUgYXZhaWxhYmxlIHRvIHRoZSBkZWNvbXByZXNzb3IsIGFzIGZvciBaX1NZTkNfRkxVU0guCi0gIFRoaXMgY29tcGxldGVzIHRoZSBjdXJyZW50IGRlZmxhdGUgYmxvY2sgYW5kIGZvbGxvd3MgaXQgd2l0aCBhbiBlbXB0eSBmaXhlZAotICBjb2RlcyBibG9jayB0aGF0IGlzIDEwIGJpdHMgbG9uZy4gIFRoaXMgYXNzdXJlcyB0aGF0IGVub3VnaCBieXRlcyBhcmUgb3V0cHV0Ci0gIGluIG9yZGVyIGZvciB0aGUgZGVjb21wcmVzc29yIHRvIGZpbmlzaCB0aGUgYmxvY2sgYmVmb3JlIHRoZSBlbXB0eSBmaXhlZCBjb2RlCi0gIGJsb2NrLgotCi0gICAgSWYgZmx1c2ggaXMgc2V0IHRvIFpfQkxPQ0ssIGEgZGVmbGF0ZSBibG9jayBpcyBjb21wbGV0ZWQgYW5kIGVtaXR0ZWQsIGFzCi0gIGZvciBaX1NZTkNfRkxVU0gsIGJ1dCB0aGUgb3V0cHV0IGlzIG5vdCBhbGlnbmVkIG9uIGEgYnl0ZSBib3VuZGFyeSwgYW5kIHVwIHRvCi0gIHNldmVuIGJpdHMgb2YgdGhlIGN1cnJlbnQgYmxvY2sgYXJlIGhlbGQgdG8gYmUgd3JpdHRlbiBhcyB0aGUgbmV4dCBieXRlIGFmdGVyCi0gIHRoZSBuZXh0IGRlZmxhdGUgYmxvY2sgaXMgY29tcGxldGVkLiAgSW4gdGhpcyBjYXNlLCB0aGUgZGVjb21wcmVzc29yIG1heSBub3QKLSAgYmUgcHJvdmlkZWQgZW5vdWdoIGJpdHMgYXQgdGhpcyBwb2ludCBpbiBvcmRlciB0byBjb21wbGV0ZSBkZWNvbXByZXNzaW9uIG9mCi0gIHRoZSBkYXRhIHByb3ZpZGVkIHNvIGZhciB0byB0aGUgY29tcHJlc3Nvci4gIEl0IG1heSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBuZXh0Ci0gIGJsb2NrIHRvIGJlIGVtaXR0ZWQuICBUaGlzIGlzIGZvciBhZHZhbmNlZCBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIGNvbnRyb2wKLSAgdGhlIGVtaXNzaW9uIG9mIGRlZmxhdGUgYmxvY2tzLgotCi0gICAgSWYgZmx1c2ggaXMgc2V0IHRvIFpfRlVMTF9GTFVTSCwgYWxsIG91dHB1dCBpcyBmbHVzaGVkIGFzIHdpdGgKLSAgWl9TWU5DX0ZMVVNILCBhbmQgdGhlIGNvbXByZXNzaW9uIHN0YXRlIGlzIHJlc2V0IHNvIHRoYXQgZGVjb21wcmVzc2lvbiBjYW4KLSAgcmVzdGFydCBmcm9tIHRoaXMgcG9pbnQgaWYgcHJldmlvdXMgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIGRhbWFnZWQgb3IgaWYKLSAgcmFuZG9tIGFjY2VzcyBpcyBkZXNpcmVkLiAgVXNpbmcgWl9GVUxMX0ZMVVNIIHRvbyBvZnRlbiBjYW4gc2VyaW91c2x5IGRlZ3JhZGUKLSAgY29tcHJlc3Npb24uCi0KLSAgICBJZiBkZWZsYXRlIHJldHVybnMgd2l0aCBhdmFpbF9vdXQgPT0gMCwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZ2FpbgotICB3aXRoIHRoZSBzYW1lIHZhbHVlIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkCi0gIGF2YWlsX291dCksIHVudGlsIHRoZSBmbHVzaCBpcyBjb21wbGV0ZSAoZGVmbGF0ZSByZXR1cm5zIHdpdGggbm9uLXplcm8KLSAgYXZhaWxfb3V0KS4gIEluIHRoZSBjYXNlIG9mIGEgWl9GVUxMX0ZMVVNIIG9yIFpfU1lOQ19GTFVTSCwgbWFrZSBzdXJlIHRoYXQKLSAgYXZhaWxfb3V0IGlzIGdyZWF0ZXIgdGhhbiBzaXggdG8gYXZvaWQgcmVwZWF0ZWQgZmx1c2ggbWFya2VycyBkdWUgdG8KLSAgYXZhaWxfb3V0ID09IDAgb24gcmV0dXJuLgotCi0gICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9GSU5JU0gsIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkLAotICBwZW5kaW5nIG91dHB1dCBpcyBmbHVzaGVkIGFuZCBkZWZsYXRlIHJldHVybnMgd2l0aCBaX1NUUkVBTV9FTkQgaWYgdGhlcmUgd2FzCi0gIGVub3VnaCBvdXRwdXQgc3BhY2U7IGlmIGRlZmxhdGUgcmV0dXJucyB3aXRoIFpfT0ssIHRoaXMgZnVuY3Rpb24gbXVzdCBiZQotICBjYWxsZWQgYWdhaW4gd2l0aCBaX0ZJTklTSCBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgKHVwZGF0ZWQgYXZhaWxfb3V0KSBidXQgbm8KLSAgbW9yZSBpbnB1dCBkYXRhLCB1bnRpbCBpdCByZXR1cm5zIHdpdGggWl9TVFJFQU1fRU5EIG9yIGFuIGVycm9yLiAgQWZ0ZXIKLSAgZGVmbGF0ZSBoYXMgcmV0dXJuZWQgWl9TVFJFQU1fRU5ELCB0aGUgb25seSBwb3NzaWJsZSBvcGVyYXRpb25zIG9uIHRoZSBzdHJlYW0KLSAgYXJlIGRlZmxhdGVSZXNldCBvciBkZWZsYXRlRW5kLgotCi0gICAgWl9GSU5JU0ggY2FuIGJlIHVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVmbGF0ZUluaXQgaWYgYWxsIHRoZSBjb21wcmVzc2lvbgotICBpcyB0byBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAuICBJbiB0aGlzIGNhc2UsIGF2YWlsX291dCBtdXN0IGJlIGF0IGxlYXN0IHRoZQotICB2YWx1ZSByZXR1cm5lZCBieSBkZWZsYXRlQm91bmQgKHNlZSBiZWxvdykuICBUaGVuIGRlZmxhdGUgaXMgZ3VhcmFudGVlZCB0bwotICByZXR1cm4gWl9TVFJFQU1fRU5ELiAgSWYgbm90IGVub3VnaCBvdXRwdXQgc3BhY2UgaXMgcHJvdmlkZWQsIGRlZmxhdGUgd2lsbAotICBub3QgcmV0dXJuIFpfU1RSRUFNX0VORCwgYW5kIGl0IG11c3QgYmUgY2FsbGVkIGFnYWluIGFzIGRlc2NyaWJlZCBhYm92ZS4KLQotICAgIGRlZmxhdGUoKSBzZXRzIHN0cm0tPmFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIGFsbCBpbnB1dCByZWFkCi0gIHNvIGZhciAodGhhdCBpcywgdG90YWxfaW4gYnl0ZXMpLgotCi0gICAgZGVmbGF0ZSgpIG1heSB1cGRhdGUgc3RybS0+ZGF0YV90eXBlIGlmIGl0IGNhbiBtYWtlIGEgZ29vZCBndWVzcyBhYm91dAotICB0aGUgaW5wdXQgZGF0YSB0eXBlIChaX0JJTkFSWSBvciBaX1RFWFQpLiAgSW4gZG91YnQsIHRoZSBkYXRhIGlzIGNvbnNpZGVyZWQKLSAgYmluYXJ5LiAgVGhpcyBmaWVsZCBpcyBvbmx5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3NlcyBhbmQgZG9lcyBub3QgYWZmZWN0IHRoZQotICBjb21wcmVzc2lvbiBhbGdvcml0aG0gaW4gYW55IG1hbm5lci4KLQotICAgIGRlZmxhdGUoKSByZXR1cm5zIFpfT0sgaWYgc29tZSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlIChtb3JlIGlucHV0Ci0gIHByb2Nlc3NlZCBvciBtb3JlIG91dHB1dCBwcm9kdWNlZCksIFpfU1RSRUFNX0VORCBpZiBhbGwgaW5wdXQgaGFzIGJlZW4KLSAgY29uc3VtZWQgYW5kIGFsbCBvdXRwdXQgaGFzIGJlZW4gcHJvZHVjZWQgKG9ubHkgd2hlbiBmbHVzaCBpcyBzZXQgdG8KLSAgWl9GSU5JU0gpLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlCi0gIGlmIG5leHRfaW4gb3IgbmV4dF9vdXQgd2FzIFpfTlVMTCksIFpfQlVGX0VSUk9SIGlmIG5vIHByb2dyZXNzIGlzIHBvc3NpYmxlCi0gIChmb3IgZXhhbXBsZSBhdmFpbF9pbiBvciBhdmFpbF9vdXQgd2FzIHplcm8pLiAgTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdAotICBmYXRhbCwgYW5kIGRlZmxhdGUoKSBjYW4gYmUgY2FsbGVkIGFnYWluIHdpdGggbW9yZSBpbnB1dCBhbmQgbW9yZSBvdXRwdXQKLSAgc3BhY2UgdG8gY29udGludWUgY29tcHJlc3NpbmcuCi0qLwotCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUVuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKLS8qCi0gICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCi0gICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55IHBlbmRpbmcKLSAgIG91dHB1dC4KLQotICAgICBkZWZsYXRlRW5kIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUKLSAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LCBaX0RBVEFfRVJST1IgaWYgdGhlIHN0cmVhbSB3YXMgZnJlZWQKLSAgIHByZW1hdHVyZWx5IChzb21lIGlucHV0IG9yIG91dHB1dCB3YXMgZGlzY2FyZGVkKS4gIEluIHRoZSBlcnJvciBjYXNlLCBtc2cKLSAgIG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUKLSAgIGRlYWxsb2NhdGVkKS4KLSovCi0KLQotLyoKLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7Ci0KLSAgICAgSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIHN0cmVhbSBzdGF0ZSBmb3IgZGVjb21wcmVzc2lvbi4gIFRoZSBmaWVsZHMKLSAgIG5leHRfaW4sIGF2YWlsX2luLCB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkKLSAgIHRoZSBjYWxsZXIuICBJZiBuZXh0X2luIGlzIG5vdCBaX05VTEwgYW5kIGF2YWlsX2luIGlzIGxhcmdlIGVub3VnaCAodGhlCi0gICBleGFjdCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjb21wcmVzc2lvbiBtZXRob2QpLCBpbmZsYXRlSW5pdCBkZXRlcm1pbmVzIHRoZQotICAgY29tcHJlc3Npb24gbWV0aG9kIGZyb20gdGhlIHpsaWIgaGVhZGVyIGFuZCBhbGxvY2F0ZXMgYWxsIGRhdGEgc3RydWN0dXJlcwotICAgYWNjb3JkaW5nbHk7IG90aGVyd2lzZSB0aGUgYWxsb2NhdGlvbiB3aWxsIGJlIGRlZmVycmVkIHRvIHRoZSBmaXJzdCBjYWxsIG9mCi0gICBpbmZsYXRlLiAgSWYgemFsbG9jIGFuZCB6ZnJlZSBhcmUgc2V0IHRvIFpfTlVMTCwgaW5mbGF0ZUluaXQgdXBkYXRlcyB0aGVtIHRvCi0gICB1c2UgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KLQotICAgICBpbmZsYXRlSW5pdCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKLSAgIG1lbW9yeSwgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUKLSAgIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgcGFyYW1ldGVycyBhcmUKLSAgIGludmFsaWQsIHN1Y2ggYXMgYSBudWxsIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZS4gIG1zZyBpcyBzZXQgdG8gbnVsbCBpZgotICAgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGluZmxhdGVJbml0IGRvZXMgbm90IHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb24KLSAgIGFwYXJ0IGZyb20gcG9zc2libHkgcmVhZGluZyB0aGUgemxpYiBoZWFkZXIgaWYgcHJlc2VudDogYWN0dWFsIGRlY29tcHJlc3Npb24KLSAgIHdpbGwgYmUgZG9uZSBieSBpbmZsYXRlKCkuICAoU28gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbWF5IGJlIG1vZGlmaWVkLCBidXQKLSAgIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgYXJlIHVudXNlZCBhbmQgdW5jaGFuZ2VkLikgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KLSAgIG9mIGluZmxhdGVJbml0KCkgZG9lcyBub3QgcHJvY2VzcyBhbnkgaGVhZGVyIGluZm9ybWF0aW9uIC0tIHRoYXQgaXMgZGVmZXJyZWQKLSAgIHVudGlsIGluZmxhdGUoKSBpcyBjYWxsZWQuCi0qLwotCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZSBPRigoel9zdHJlYW1wIHN0cm0sIGludCBmbHVzaCkpOwotLyoKLSAgICBpbmZsYXRlIGRlY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAotICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuICBJdCBtYXkgaW50cm9kdWNlCi0gIHNvbWUgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkgZXhjZXB0IHdoZW4KLSAgZm9yY2VkIHRvIGZsdXNoLgotCi0gIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuICBpbmZsYXRlIHBlcmZvcm1zIG9uZSBvciBib3RoIG9mIHRoZQotICBmb2xsb3dpbmcgYWN0aW9uczoKLQotICAtIERlY29tcHJlc3MgbW9yZSBpbnB1dCBzdGFydGluZyBhdCBuZXh0X2luIGFuZCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4KLSAgICBhY2NvcmRpbmdseS4gIElmIG5vdCBhbGwgaW5wdXQgY2FuIGJlIHByb2Nlc3NlZCAoYmVjYXVzZSB0aGVyZSBpcyBub3QKLSAgICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciksIG5leHRfaW4gaXMgdXBkYXRlZCBhbmQgcHJvY2Vzc2luZyB3aWxsCi0gICAgcmVzdW1lIGF0IHRoaXMgcG9pbnQgZm9yIHRoZSBuZXh0IGNhbGwgb2YgaW5mbGF0ZSgpLgotCi0gIC0gUHJvdmlkZSBtb3JlIG91dHB1dCBzdGFydGluZyBhdCBuZXh0X291dCBhbmQgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQKLSAgICBhY2NvcmRpbmdseS4gIGluZmxhdGUoKSBwcm92aWRlcyBhcyBtdWNoIG91dHB1dCBhcyBwb3NzaWJsZSwgdW50aWwgdGhlcmUgaXMKLSAgICBubyBtb3JlIGlucHV0IGRhdGEgb3Igbm8gbW9yZSBzcGFjZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAoc2VlIGJlbG93IGFib3V0Ci0gICAgdGhlIGZsdXNoIHBhcmFtZXRlcikuCi0KLSAgICBCZWZvcmUgdGhlIGNhbGwgb2YgaW5mbGF0ZSgpLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IGF0IGxlYXN0Ci0gIG9uZSBvZiB0aGUgYWN0aW9ucyBpcyBwb3NzaWJsZSwgYnkgcHJvdmlkaW5nIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWluZyBtb3JlCi0gIG91dHB1dCwgYW5kIHVwZGF0aW5nIHRoZSBuZXh0XyogYW5kIGF2YWlsXyogdmFsdWVzIGFjY29yZGluZ2x5LiAgVGhlCi0gIGFwcGxpY2F0aW9uIGNhbiBjb25zdW1lIHRoZSB1bmNvbXByZXNzZWQgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvciBleGFtcGxlCi0gIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCAoYXZhaWxfb3V0ID09IDApLCBvciBhZnRlciBlYWNoIGNhbGwgb2YKLSAgaW5mbGF0ZSgpLiAgSWYgaW5mbGF0ZSByZXR1cm5zIFpfT0sgYW5kIHdpdGggemVybyBhdmFpbF9vdXQsIGl0IG11c3QgYmUKLSAgY2FsbGVkIGFnYWluIGFmdGVyIG1ha2luZyByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUKLSAgbW9yZSBvdXRwdXQgcGVuZGluZy4KLQotICAgIFRoZSBmbHVzaCBwYXJhbWV0ZXIgb2YgaW5mbGF0ZSgpIGNhbiBiZSBaX05PX0ZMVVNILCBaX1NZTkNfRkxVU0gsIFpfRklOSVNILAotICBaX0JMT0NLLCBvciBaX1RSRUVTLiAgWl9TWU5DX0ZMVVNIIHJlcXVlc3RzIHRoYXQgaW5mbGF0ZSgpIGZsdXNoIGFzIG11Y2gKLSAgb3V0cHV0IGFzIHBvc3NpYmxlIHRvIHRoZSBvdXRwdXQgYnVmZmVyLiAgWl9CTE9DSyByZXF1ZXN0cyB0aGF0IGluZmxhdGUoKQotICBzdG9wIGlmIGFuZCB3aGVuIGl0IGdldHMgdG8gdGhlIG5leHQgZGVmbGF0ZSBibG9jayBib3VuZGFyeS4gIFdoZW4gZGVjb2RpbmcKLSAgdGhlIHpsaWIgb3IgZ3ppcCBmb3JtYXQsIHRoaXMgd2lsbCBjYXVzZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5Ci0gIGFmdGVyIHRoZSBoZWFkZXIgYW5kIGJlZm9yZSB0aGUgZmlyc3QgYmxvY2suICBXaGVuIGRvaW5nIGEgcmF3IGluZmxhdGUsCi0gIGluZmxhdGUoKSB3aWxsIGdvIGFoZWFkIGFuZCBwcm9jZXNzIHRoZSBmaXJzdCBibG9jaywgYW5kIHdpbGwgcmV0dXJuIHdoZW4gaXQKLSAgZ2V0cyB0byB0aGUgZW5kIG9mIHRoYXQgYmxvY2ssIG9yIHdoZW4gaXQgcnVucyBvdXQgb2YgZGF0YS4KLQotICAgIFRoZSBaX0JMT0NLIG9wdGlvbiBhc3Npc3RzIGluIGFwcGVuZGluZyB0byBvciBjb21iaW5pbmcgZGVmbGF0ZSBzdHJlYW1zLgotICBBbHNvIHRvIGFzc2lzdCBpbiB0aGlzLCBvbiByZXR1cm4gaW5mbGF0ZSgpIHdpbGwgc2V0IHN0cm0tPmRhdGFfdHlwZSB0byB0aGUKLSAgbnVtYmVyIG9mIHVudXNlZCBiaXRzIGluIHRoZSBsYXN0IGJ5dGUgdGFrZW4gZnJvbSBzdHJtLT5uZXh0X2luLCBwbHVzIDY0IGlmCi0gIGluZmxhdGUoKSBpcyBjdXJyZW50bHkgZGVjb2RpbmcgdGhlIGxhc3QgYmxvY2sgaW4gdGhlIGRlZmxhdGUgc3RyZWFtLCBwbHVzCi0gIDEyOCBpZiBpbmZsYXRlKCkgcmV0dXJuZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVjb2RpbmcgYW4gZW5kLW9mLWJsb2NrIGNvZGUgb3IKLSAgZGVjb2RpbmcgdGhlIGNvbXBsZXRlIGhlYWRlciB1cCB0byBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZGVmbGF0ZQotICBzdHJlYW0uICBUaGUgZW5kLW9mLWJsb2NrIHdpbGwgbm90IGJlIGluZGljYXRlZCB1bnRpbCBhbGwgb2YgdGhlIHVuY29tcHJlc3NlZAotICBkYXRhIGZyb20gdGhhdCBibG9jayBoYXMgYmVlbiB3cml0dGVuIHRvIHN0cm0tPm5leHRfb3V0LiAgVGhlIG51bWJlciBvZgotICB1bnVzZWQgYml0cyBtYXkgaW4gZ2VuZXJhbCBiZSBncmVhdGVyIHRoYW4gc2V2ZW4sIGV4Y2VwdCB3aGVuIGJpdCA3IG9mCi0gIGRhdGFfdHlwZSBpcyBzZXQsIGluIHdoaWNoIGNhc2UgdGhlIG51bWJlciBvZiB1bnVzZWQgYml0cyB3aWxsIGJlIGxlc3MgdGhhbgotICBlaWdodC4gIGRhdGFfdHlwZSBpcyBzZXQgYXMgbm90ZWQgaGVyZSBldmVyeSB0aW1lIGluZmxhdGUoKSByZXR1cm5zIGZvciBhbGwKLSAgZmx1c2ggb3B0aW9ucywgYW5kIHNvIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgYW1vdW50IG9mIGN1cnJlbnRseQotICBjb25zdW1lZCBpbnB1dCBpbiBiaXRzLgotCi0gICAgVGhlIFpfVFJFRVMgb3B0aW9uIGJlaGF2ZXMgYXMgWl9CTE9DSyBkb2VzLCBidXQgaXQgYWxzbyByZXR1cm5zIHdoZW4gdGhlCi0gIGVuZCBvZiBlYWNoIGRlZmxhdGUgYmxvY2sgaGVhZGVyIGlzIHJlYWNoZWQsIGJlZm9yZSBhbnkgYWN0dWFsIGRhdGEgaW4gdGhhdAotICBibG9jayBpcyBkZWNvZGVkLiAgVGhpcyBhbGxvd3MgdGhlIGNhbGxlciB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUKLSAgZGVmbGF0ZSBibG9jayBoZWFkZXIgZm9yIGxhdGVyIHVzZSBpbiByYW5kb20gYWNjZXNzIHdpdGhpbiBhIGRlZmxhdGUgYmxvY2suCi0gIDI1NiBpcyBhZGRlZCB0byB0aGUgdmFsdWUgb2Ygc3RybS0+ZGF0YV90eXBlIHdoZW4gaW5mbGF0ZSgpIHJldHVybnMKLSAgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBibG9jayBoZWFkZXIuCi0KLSAgICBpbmZsYXRlKCkgc2hvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCB1bnRpbCBpdCByZXR1cm5zIFpfU1RSRUFNX0VORCBvciBhbgotICBlcnJvci4gIEhvd2V2ZXIgaWYgYWxsIGRlY29tcHJlc3Npb24gaXMgdG8gYmUgcGVyZm9ybWVkIGluIGEgc2luZ2xlIHN0ZXAgKGEKLSAgc2luZ2xlIGNhbGwgb2YgaW5mbGF0ZSksIHRoZSBwYXJhbWV0ZXIgZmx1c2ggc2hvdWxkIGJlIHNldCB0byBaX0ZJTklTSC4gIEluCi0gIHRoaXMgY2FzZSBhbGwgcGVuZGluZyBpbnB1dCBpcyBwcm9jZXNzZWQgYW5kIGFsbCBwZW5kaW5nIG91dHB1dCBpcyBmbHVzaGVkOwotICBhdmFpbF9vdXQgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGZvciB0aGUKLSAgb3BlcmF0aW9uIHRvIGNvbXBsZXRlLiAgKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtYXkgaGF2ZSBiZWVuCi0gIHNhdmVkIGJ5IHRoZSBjb21wcmVzc29yIGZvciB0aGlzIHB1cnBvc2UuKSBUaGUgdXNlIG9mIFpfRklOSVNIIGlzIG5vdAotICByZXF1aXJlZCB0byBwZXJmb3JtIGFuIGluZmxhdGlvbiBpbiBvbmUgc3RlcC4gIEhvd2V2ZXIgaXQgbWF5IGJlIHVzZWQgdG8KLSAgaW5mb3JtIGluZmxhdGUgdGhhdCBhIGZhc3RlciBhcHByb2FjaCBjYW4gYmUgdXNlZCBmb3IgdGhlIHNpbmdsZSBpbmZsYXRlKCkKLSAgY2FsbC4gIFpfRklOSVNIIGFsc28gaW5mb3JtcyBpbmZsYXRlIHRvIG5vdCBtYWludGFpbiBhIHNsaWRpbmcgd2luZG93IGlmIHRoZQotICBzdHJlYW0gY29tcGxldGVzLCB3aGljaCByZWR1Y2VzIGluZmxhdGUncyBtZW1vcnkgZm9vdHByaW50LiAgSWYgdGhlIHN0cmVhbQotICBkb2VzIG5vdCBjb21wbGV0ZSwgZWl0aGVyIGJlY2F1c2Ugbm90IGFsbCBvZiB0aGUgc3RyZWFtIGlzIHByb3ZpZGVkIG9yIG5vdAotICBlbm91Z2ggb3V0cHV0IHNwYWNlIGlzIHByb3ZpZGVkLCB0aGVuIGEgc2xpZGluZyB3aW5kb3cgd2lsbCBiZSBhbGxvY2F0ZWQgYW5kCi0gIGluZmxhdGUoKSBjYW4gYmUgY2FsbGVkIGFnYWluIHRvIGNvbnRpbnVlIHRoZSBvcGVyYXRpb24gYXMgaWYgWl9OT19GTFVTSCBoYWQKLSAgYmVlbiB1c2VkLgotCi0gICAgIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIGluZmxhdGUoKSBhbHdheXMgZmx1c2hlcyBhcyBtdWNoIG91dHB1dCBhcwotICBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlciwgYW5kIGFsd2F5cyB1c2VzIHRoZSBmYXN0ZXIgYXBwcm9hY2ggb24gdGhlCi0gIGZpcnN0IGNhbGwuICBTbyB0aGUgZWZmZWN0cyBvZiB0aGUgZmx1c2ggcGFyYW1ldGVyIGluIHRoaXMgaW1wbGVtZW50YXRpb24gYXJlCi0gIG9uIHRoZSByZXR1cm4gdmFsdWUgb2YgaW5mbGF0ZSgpIGFzIG5vdGVkIGJlbG93LCB3aGVuIGluZmxhdGUoKSByZXR1cm5zIGVhcmx5Ci0gIHdoZW4gWl9CTE9DSyBvciBaX1RSRUVTIGlzIHVzZWQsIGFuZCB3aGVuIGluZmxhdGUoKSBhdm9pZHMgdGhlIGFsbG9jYXRpb24gb2YKLSAgbWVtb3J5IGZvciBhIHNsaWRpbmcgd2luZG93IHdoZW4gWl9GSU5JU0ggaXMgdXNlZC4KLQotICAgICBJZiBhIHByZXNldCBkaWN0aW9uYXJ5IGlzIG5lZWRlZCBhZnRlciB0aGlzIGNhbGwgKHNlZSBpbmZsYXRlU2V0RGljdGlvbmFyeQotICBiZWxvdyksIGluZmxhdGUgc2V0cyBzdHJtLT5hZGxlciB0byB0aGUgQWRsZXItMzIgY2hlY2tzdW0gb2YgdGhlIGRpY3Rpb25hcnkKLSAgY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yIGFuZCByZXR1cm5zIFpfTkVFRF9ESUNUOyBvdGhlcndpc2UgaXQgc2V0cwotICBzdHJtLT5hZGxlciB0byB0aGUgQWRsZXItMzIgY2hlY2tzdW0gb2YgYWxsIG91dHB1dCBwcm9kdWNlZCBzbyBmYXIgKHRoYXQgaXMsCi0gIHRvdGFsX291dCBieXRlcykgYW5kIHJldHVybnMgWl9PSywgWl9TVFJFQU1fRU5EIG9yIGFuIGVycm9yIGNvZGUgYXMgZGVzY3JpYmVkCi0gIGJlbG93LiAgQXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLCBpbmZsYXRlKCkgY2hlY2tzIHRoYXQgaXRzIGNvbXB1dGVkIGFkbGVyMzIKLSAgY2hlY2tzdW0gaXMgZXF1YWwgdG8gdGhhdCBzYXZlZCBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX1NUUkVBTV9FTkQKLSAgb25seSBpZiB0aGUgY2hlY2tzdW0gaXMgY29ycmVjdC4KLQotICAgIGluZmxhdGUoKSBjYW4gZGVjb21wcmVzcyBhbmQgY2hlY2sgZWl0aGVyIHpsaWItd3JhcHBlZCBvciBnemlwLXdyYXBwZWQKLSAgZGVmbGF0ZSBkYXRhLiAgVGhlIGhlYWRlciB0eXBlIGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHksIGlmIHJlcXVlc3RlZCB3aGVuCi0gIGluaXRpYWxpemluZyB3aXRoIGluZmxhdGVJbml0MigpLiAgQW55IGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgZ3ppcAotICBoZWFkZXIgaXMgbm90IHJldGFpbmVkLCBzbyBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRoYXQgaW5mb3JtYXRpb24gc2hvdWxkCi0gIGluc3RlYWQgdXNlIHJhdyBpbmZsYXRlLCBzZWUgaW5mbGF0ZUluaXQyKCkgYmVsb3csIG9yIGluZmxhdGVCYWNrKCkgYW5kCi0gIHBlcmZvcm0gdGhlaXIgb3duIHByb2Nlc3Npbmcgb2YgdGhlIGd6aXAgaGVhZGVyIGFuZCB0cmFpbGVyLiAgV2hlbiBwcm9jZXNzaW5nCi0gIGd6aXAtd3JhcHBlZCBkZWZsYXRlIGRhdGEsIHN0cm0tPmFkbGVyMzIgaXMgc2V0IHRvIHRoZSBDUkMtMzIgb2YgdGhlIG91dHB1dAotICBwcm9kdWN0ZWQgc28gZmFyLiAgVGhlIENSQy0zMiBpcyBjaGVja2VkIGFnYWluc3QgdGhlIGd6aXAgdHJhaWxlci4KLQotICAgIGluZmxhdGUoKSByZXR1cm5zIFpfT0sgaWYgc29tZSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlIChtb3JlIGlucHV0IHByb2Nlc3NlZAotICBvciBtb3JlIG91dHB1dCBwcm9kdWNlZCksIFpfU1RSRUFNX0VORCBpZiB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgaGFzCi0gIGJlZW4gcmVhY2hlZCBhbmQgYWxsIHVuY29tcHJlc3NlZCBvdXRwdXQgaGFzIGJlZW4gcHJvZHVjZWQsIFpfTkVFRF9ESUNUIGlmIGEKLSAgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGF0IHRoaXMgcG9pbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMKLSAgY29ycnVwdGVkIChpbnB1dCBzdHJlYW0gbm90IGNvbmZvcm1pbmcgdG8gdGhlIHpsaWIgZm9ybWF0IG9yIGluY29ycmVjdCBjaGVjawotICB2YWx1ZSksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlCi0gIG5leHRfaW4gb3IgbmV4dF9vdXQgd2FzIFpfTlVMTCksIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSwKLSAgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUgb3IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUKLSAgb3V0cHV0IGJ1ZmZlciB3aGVuIFpfRklOSVNIIGlzIHVzZWQuICBOb3RlIHRoYXQgWl9CVUZfRVJST1IgaXMgbm90IGZhdGFsLCBhbmQKLSAgaW5mbGF0ZSgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gd2l0aCBtb3JlIGlucHV0IGFuZCBtb3JlIG91dHB1dCBzcGFjZSB0bwotICBjb250aW51ZSBkZWNvbXByZXNzaW5nLiAgSWYgWl9EQVRBX0VSUk9SIGlzIHJldHVybmVkLCB0aGUgYXBwbGljYXRpb24gbWF5Ci0gIHRoZW4gY2FsbCBpbmZsYXRlU3luYygpIHRvIGxvb2sgZm9yIGEgZ29vZCBjb21wcmVzc2lvbiBibG9jayBpZiBhIHBhcnRpYWwKLSAgcmVjb3Zlcnkgb2YgdGhlIGRhdGEgaXMgZGVzaXJlZC4KLSovCi0KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlRW5kIE9GKCh6X3N0cmVhbXAgc3RybSkpOwotLyoKLSAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KLSAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkgcGVuZGluZwotICAgb3V0cHV0LgotCi0gICAgIGluZmxhdGVFbmQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RhdGUKLSAgIHdhcyBpbmNvbnNpc3RlbnQuICBJbiB0aGUgZXJyb3IgY2FzZSwgbXNnIG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEKLSAgIHN0YXRpYyBzdHJpbmcgKHdoaWNoIG11c3Qgbm90IGJlIGRlYWxsb2NhdGVkKS4KLSovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQWR2YW5jZWQgZnVuY3Rpb25zICovCi0KLS8qCi0gICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG5lZWRlZCBvbmx5IGluIHNvbWUgc3BlY2lhbCBhcHBsaWNhdGlvbnMuCi0qLwotCi0vKgotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdDIgT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICB3aW5kb3dCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbWVtTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBzdHJhdGVneSkpOwotCi0gICAgIFRoaXMgaXMgYW5vdGhlciB2ZXJzaW9uIG9mIGRlZmxhdGVJbml0IHdpdGggbW9yZSBjb21wcmVzc2lvbiBvcHRpb25zLiAgVGhlCi0gICBmaWVsZHMgbmV4dF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5IHRoZQotICAgY2FsbGVyLgotCi0gICAgIFRoZSBtZXRob2QgcGFyYW1ldGVyIGlzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QuICBJdCBtdXN0IGJlIFpfREVGTEFURUQgaW4KLSAgIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4KLQotICAgICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgdGhlIGJhc2UgdHdvIGxvZ2FyaXRobSBvZiB0aGUgd2luZG93IHNpemUKLSAgICh0aGUgc2l6ZSBvZiB0aGUgaGlzdG9yeSBidWZmZXIpLiAgSXQgc2hvdWxkIGJlIGluIHRoZSByYW5nZSA4Li4xNSBmb3IgdGhpcwotICAgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gIExhcmdlciB2YWx1ZXMgb2YgdGhpcyBwYXJhbWV0ZXIgcmVzdWx0IGluIGJldHRlcgotICAgY29tcHJlc3Npb24gYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTUgaWYKLSAgIGRlZmxhdGVJbml0IGlzIHVzZWQgaW5zdGVhZC4KLQotICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIC04Li4tMTUgZm9yIHJhdyBkZWZsYXRlLiAgSW4gdGhpcyBjYXNlLCAtd2luZG93Qml0cwotICAgZGV0ZXJtaW5lcyB0aGUgd2luZG93IHNpemUuICBkZWZsYXRlKCkgd2lsbCB0aGVuIGdlbmVyYXRlIHJhdyBkZWZsYXRlIGRhdGEKLSAgIHdpdGggbm8gemxpYiBoZWFkZXIgb3IgdHJhaWxlciwgYW5kIHdpbGwgbm90IGNvbXB1dGUgYW4gYWRsZXIzMiBjaGVjayB2YWx1ZS4KLQotICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIGdyZWF0ZXIgdGhhbiAxNSBmb3Igb3B0aW9uYWwgZ3ppcCBlbmNvZGluZy4gIEFkZAotICAgMTYgdG8gd2luZG93Qml0cyB0byB3cml0ZSBhIHNpbXBsZSBnemlwIGhlYWRlciBhbmQgdHJhaWxlciBhcm91bmQgdGhlCi0gICBjb21wcmVzc2VkIGRhdGEgaW5zdGVhZCBvZiBhIHpsaWIgd3JhcHBlci4gIFRoZSBnemlwIGhlYWRlciB3aWxsIGhhdmUgbm8KLSAgIGZpbGUgbmFtZSwgbm8gZXh0cmEgZGF0YSwgbm8gY29tbWVudCwgbm8gbW9kaWZpY2F0aW9uIHRpbWUgKHNldCB0byB6ZXJvKSwgbm8KLSAgIGhlYWRlciBjcmMsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3aWxsIGJlIHNldCB0byAyNTUgKHVua25vd24pLiAgSWYgYQotICAgZ3ppcCBzdHJlYW0gaXMgYmVpbmcgd3JpdHRlbiwgc3RybS0+YWRsZXIgaXMgYSBjcmMzMiBpbnN0ZWFkIG9mIGFuIGFkbGVyMzIuCi0KLSAgICAgVGhlIG1lbUxldmVsIHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IG11Y2ggbWVtb3J5IHNob3VsZCBiZSBhbGxvY2F0ZWQKLSAgIGZvciB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuICBtZW1MZXZlbD0xIHVzZXMgbWluaW11bSBtZW1vcnkgYnV0IGlzCi0gICBzbG93IGFuZCByZWR1Y2VzIGNvbXByZXNzaW9uIHJhdGlvOyBtZW1MZXZlbD05IHVzZXMgbWF4aW11bSBtZW1vcnkgZm9yCi0gICBvcHRpbWFsIHNwZWVkLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgOC4gIFNlZSB6Y29uZi5oIGZvciB0b3RhbCBtZW1vcnkgdXNhZ2UKLSAgIGFzIGEgZnVuY3Rpb24gb2Ygd2luZG93Qml0cyBhbmQgbWVtTGV2ZWwuCi0KLSAgICAgVGhlIHN0cmF0ZWd5IHBhcmFtZXRlciBpcyB1c2VkIHRvIHR1bmUgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobS4gIFVzZSB0aGUKLSAgIHZhbHVlIFpfREVGQVVMVF9TVFJBVEVHWSBmb3Igbm9ybWFsIGRhdGEsIFpfRklMVEVSRUQgZm9yIGRhdGEgcHJvZHVjZWQgYnkgYQotICAgZmlsdGVyIChvciBwcmVkaWN0b3IpLCBaX0hVRkZNQU5fT05MWSB0byBmb3JjZSBIdWZmbWFuIGVuY29kaW5nIG9ubHkgKG5vCi0gICBzdHJpbmcgbWF0Y2gpLCBvciBaX1JMRSB0byBsaW1pdCBtYXRjaCBkaXN0YW5jZXMgdG8gb25lIChydW4tbGVuZ3RoCi0gICBlbmNvZGluZykuICBGaWx0ZXJlZCBkYXRhIGNvbnNpc3RzIG1vc3RseSBvZiBzbWFsbCB2YWx1ZXMgd2l0aCBhIHNvbWV3aGF0Ci0gICByYW5kb20gZGlzdHJpYnV0aW9uLiAgSW4gdGhpcyBjYXNlLCB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGlzIHR1bmVkIHRvCi0gICBjb21wcmVzcyB0aGVtIGJldHRlci4gIFRoZSBlZmZlY3Qgb2YgWl9GSUxURVJFRCBpcyB0byBmb3JjZSBtb3JlIEh1ZmZtYW4KLSAgIGNvZGluZyBhbmQgbGVzcyBzdHJpbmcgbWF0Y2hpbmc7IGl0IGlzIHNvbWV3aGF0IGludGVybWVkaWF0ZSBiZXR3ZWVuCi0gICBaX0RFRkFVTFRfU1RSQVRFR1kgYW5kIFpfSFVGRk1BTl9PTkxZLiAgWl9STEUgaXMgZGVzaWduZWQgdG8gYmUgYWxtb3N0IGFzCi0gICBmYXN0IGFzIFpfSFVGRk1BTl9PTkxZLCBidXQgZ2l2ZSBiZXR0ZXIgY29tcHJlc3Npb24gZm9yIFBORyBpbWFnZSBkYXRhLiAgVGhlCi0gICBzdHJhdGVneSBwYXJhbWV0ZXIgb25seSBhZmZlY3RzIHRoZSBjb21wcmVzc2lvbiByYXRpbyBidXQgbm90IHRoZQotICAgY29ycmVjdG5lc3Mgb2YgdGhlIGNvbXByZXNzZWQgb3V0cHV0IGV2ZW4gaWYgaXQgaXMgbm90IHNldCBhcHByb3ByaWF0ZWx5LgotICAgWl9GSVhFRCBwcmV2ZW50cyB0aGUgdXNlIG9mIGR5bmFtaWMgSHVmZm1hbiBjb2RlcywgYWxsb3dpbmcgZm9yIGEgc2ltcGxlcgotICAgZGVjb2RlciBmb3Igc3BlY2lhbCBhcHBsaWNhdGlvbnMuCi0KLSAgICAgZGVmbGF0ZUluaXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBhbnkgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgYW4gaW52YWxpZAotICAgbWV0aG9kKSwgb3IgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiAoemxpYl92ZXJzaW9uKSBpcwotICAgaW5jb21wYXRpYmxlIHdpdGggdGhlIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyIChaTElCX1ZFUlNJT04pLiAgbXNnIGlzCi0gICBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgZGVmbGF0ZUluaXQyIGRvZXMgbm90IHBlcmZvcm0gYW55Ci0gICBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlU2V0RGljdGlvbmFyeSBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgIGRpY3RMZW5ndGgpKTsKLS8qCi0gICAgIEluaXRpYWxpemVzIHRoZSBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIGJ5dGUgc2VxdWVuY2UKLSAgIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC4gIFdoZW4gdXNpbmcgdGhlIHpsaWIgZm9ybWF0LCB0aGlzCi0gICBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBkZWZsYXRlSW5pdCwgZGVmbGF0ZUluaXQyIG9yCi0gICBkZWZsYXRlUmVzZXQsIGFuZCBiZWZvcmUgYW55IGNhbGwgb2YgZGVmbGF0ZS4gIFdoZW4gZG9pbmcgcmF3IGRlZmxhdGUsIHRoaXMKLSAgIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGVpdGhlciBiZWZvcmUgYW55IGNhbGwgb2YgZGVmbGF0ZSwgb3IgaW1tZWRpYXRlbHkKLSAgIGFmdGVyIHRoZSBjb21wbGV0aW9uIG9mIGEgZGVmbGF0ZSBibG9jaywgaS5lLiBhZnRlciBhbGwgaW5wdXQgaGFzIGJlZW4KLSAgIGNvbnN1bWVkIGFuZCBhbGwgb3V0cHV0IGhhcyBiZWVuIGRlbGl2ZXJlZCB3aGVuIHVzaW5nIGFueSBvZiB0aGUgZmx1c2gKLSAgIG9wdGlvbnMgWl9CTE9DSywgWl9QQVJUSUFMX0ZMVVNILCBaX1NZTkNfRkxVU0gsIG9yIFpfRlVMTF9GTFVTSC4gIFRoZQotICAgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUgZGljdGlvbmFyeSAoc2VlCi0gICBpbmZsYXRlU2V0RGljdGlvbmFyeSkuCi0KLSAgICAgVGhlIGRpY3Rpb25hcnkgc2hvdWxkIGNvbnNpc3Qgb2Ygc3RyaW5ncyAoYnl0ZSBzZXF1ZW5jZXMpIHRoYXQgYXJlIGxpa2VseQotICAgdG8gYmUgZW5jb3VudGVyZWQgbGF0ZXIgaW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCwgd2l0aCB0aGUgbW9zdCBjb21tb25seQotICAgdXNlZCBzdHJpbmdzIHByZWZlcmFibHkgcHV0IHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeS4gIFVzaW5nIGEKLSAgIGRpY3Rpb25hcnkgaXMgbW9zdCB1c2VmdWwgd2hlbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkIGlzIHNob3J0IGFuZCBjYW4gYmUKLSAgIHByZWRpY3RlZCB3aXRoIGdvb2QgYWNjdXJhY3k7IHRoZSBkYXRhIGNhbiB0aGVuIGJlIGNvbXByZXNzZWQgYmV0dGVyIHRoYW4KLSAgIHdpdGggdGhlIGRlZmF1bHQgZW1wdHkgZGljdGlvbmFyeS4KLQotICAgICBEZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzaW9uIGRhdGEgc3RydWN0dXJlcyBzZWxlY3RlZCBieQotICAgZGVmbGF0ZUluaXQgb3IgZGVmbGF0ZUluaXQyLCBhIHBhcnQgb2YgdGhlIGRpY3Rpb25hcnkgbWF5IGluIGVmZmVjdCBiZQotICAgZGlzY2FyZGVkLCBmb3IgZXhhbXBsZSBpZiB0aGUgZGljdGlvbmFyeSBpcyBsYXJnZXIgdGhhbiB0aGUgd2luZG93IHNpemUKLSAgIHByb3ZpZGVkIGluIGRlZmxhdGVJbml0IG9yIGRlZmxhdGVJbml0Mi4gIFRodXMgdGhlIHN0cmluZ3MgbW9zdCBsaWtlbHkgdG8gYmUKLSAgIHVzZWZ1bCBzaG91bGQgYmUgcHV0IGF0IHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnksIG5vdCBhdCB0aGUgZnJvbnQuICBJbgotICAgYWRkaXRpb24sIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIGRlZmxhdGUgd2lsbCB1c2UgYXQgbW9zdCB0aGUgd2luZG93Ci0gICBzaXplIG1pbnVzIDI2MiBieXRlcyBvZiB0aGUgcHJvdmlkZWQgZGljdGlvbmFyeS4KLQotICAgICBVcG9uIHJldHVybiBvZiB0aGlzIGZ1bmN0aW9uLCBzdHJtLT5hZGxlciBpcyBzZXQgdG8gdGhlIGFkbGVyMzIgdmFsdWUKLSAgIG9mIHRoZSBkaWN0aW9uYXJ5OyB0aGUgZGVjb21wcmVzc29yIG1heSBsYXRlciB1c2UgdGhpcyB2YWx1ZSB0byBkZXRlcm1pbmUKLSAgIHdoaWNoIGRpY3Rpb25hcnkgaGFzIGJlZW4gdXNlZCBieSB0aGUgY29tcHJlc3Nvci4gIChUaGUgYWRsZXIzMiB2YWx1ZQotICAgYXBwbGllcyB0byB0aGUgd2hvbGUgZGljdGlvbmFyeSBldmVuIGlmIG9ubHkgYSBzdWJzZXQgb2YgdGhlIGRpY3Rpb25hcnkgaXMKLSAgIGFjdHVhbGx5IHVzZWQgYnkgdGhlIGNvbXByZXNzb3IuKSBJZiBhIHJhdyBkZWZsYXRlIHdhcyByZXF1ZXN0ZWQsIHRoZW4gdGhlCi0gICBhZGxlcjMyIHZhbHVlIGlzIG5vdCBjb21wdXRlZCBhbmQgc3RybS0+YWRsZXIgaXMgbm90IHNldC4KLQotICAgICBkZWZsYXRlU2V0RGljdGlvbmFyeSByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgYQotICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKGUuZy4gIGRpY3Rpb25hcnkgYmVpbmcgWl9OVUxMKSBvciB0aGUgc3RyZWFtIHN0YXRlIGlzCi0gICBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlIGlmIGRlZmxhdGUgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc3RyZWFtCi0gICBvciBpZiBub3QgYXQgYSBibG9jayBib3VuZGFyeSBmb3IgcmF3IGRlZmxhdGUpLiAgZGVmbGF0ZVNldERpY3Rpb25hcnkgZG9lcwotICAgbm90IHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVDb3B5IE9GKCh6X3N0cmVhbXAgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfc3RyZWFtcCBzb3VyY2UpKTsKLS8qCi0gICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIHN0cmVhbSBhcyBhIGNvbXBsZXRlIGNvcHkgb2YgdGhlIHNvdXJjZSBzdHJlYW0uCi0KLSAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gc2V2ZXJhbCBjb21wcmVzc2lvbiBzdHJhdGVnaWVzIHdpbGwgYmUKLSAgIHRyaWVkLCBmb3IgZXhhbXBsZSB3aGVuIHRoZXJlIGFyZSBzZXZlcmFsIHdheXMgb2YgcHJlLXByb2Nlc3NpbmcgdGhlIGlucHV0Ci0gICBkYXRhIHdpdGggYSBmaWx0ZXIuICBUaGUgc3RyZWFtcyB0aGF0IHdpbGwgYmUgZGlzY2FyZGVkIHNob3VsZCB0aGVuIGJlIGZyZWVkCi0gICBieSBjYWxsaW5nIGRlZmxhdGVFbmQuICBOb3RlIHRoYXQgZGVmbGF0ZUNvcHkgZHVwbGljYXRlcyB0aGUgaW50ZXJuYWwKLSAgIGNvbXByZXNzaW9uIHN0YXRlIHdoaWNoIGNhbiBiZSBxdWl0ZSBsYXJnZSwgc28gdGhpcyBzdHJhdGVneSBpcyBzbG93IGFuZCBjYW4KLSAgIGNvbnN1bWUgbG90cyBvZiBtZW1vcnkuCi0KLSAgICAgZGVmbGF0ZUNvcHkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKLSAgIGVub3VnaCBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQKLSAgIChzdWNoIGFzIHphbGxvYyBiZWluZyBaX05VTEwpLiAgbXNnIGlzIGxlZnQgdW5jaGFuZ2VkIGluIGJvdGggc291cmNlIGFuZAotICAgZGVzdGluYXRpb24uCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVSZXNldCBPRigoel9zdHJlYW1wIHN0cm0pKTsKLS8qCi0gICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBkZWZsYXRlRW5kIGZvbGxvd2VkIGJ5IGRlZmxhdGVJbml0LAotICAgYnV0IGRvZXMgbm90IGZyZWUgYW5kIHJlYWxsb2NhdGUgYWxsIHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS4gIFRoZQotICAgc3RyZWFtIHdpbGwga2VlcCB0aGUgc2FtZSBjb21wcmVzc2lvbiBsZXZlbCBhbmQgYW55IG90aGVyIGF0dHJpYnV0ZXMgdGhhdAotICAgbWF5IGhhdmUgYmVlbiBzZXQgYnkgZGVmbGF0ZUluaXQyLgotCi0gICAgIGRlZmxhdGVSZXNldCByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIFpfTlVMTCkuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVQYXJhbXMgT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJhdGVneSkpOwotLyoKLSAgICAgRHluYW1pY2FsbHkgdXBkYXRlIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBhbmQgY29tcHJlc3Npb24gc3RyYXRlZ3kuICBUaGUKLSAgIGludGVycHJldGF0aW9uIG9mIGxldmVsIGFuZCBzdHJhdGVneSBpcyBhcyBpbiBkZWZsYXRlSW5pdDIuICBUaGlzIGNhbiBiZQotICAgdXNlZCB0byBzd2l0Y2ggYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgc3RyYWlnaHQgY29weSBvZiB0aGUgaW5wdXQgZGF0YSwgb3IKLSAgIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudCBraW5kIG9mIGlucHV0IGRhdGEgcmVxdWlyaW5nIGEgZGlmZmVyZW50IHN0cmF0ZWd5LgotICAgSWYgdGhlIGNvbXByZXNzaW9uIGxldmVsIGlzIGNoYW5nZWQsIHRoZSBpbnB1dCBhdmFpbGFibGUgc28gZmFyIGlzCi0gICBjb21wcmVzc2VkIHdpdGggdGhlIG9sZCBsZXZlbCAoYW5kIG1heSBiZSBmbHVzaGVkKTsgdGhlIG5ldyBsZXZlbCB3aWxsIHRha2UKLSAgIGVmZmVjdCBvbmx5IGF0IHRoZSBuZXh0IGNhbGwgb2YgZGVmbGF0ZSgpLgotCi0gICAgIEJlZm9yZSB0aGUgY2FsbCBvZiBkZWZsYXRlUGFyYW1zLCB0aGUgc3RyZWFtIHN0YXRlIG11c3QgYmUgc2V0IGFzIGZvcgotICAgYSBjYWxsIG9mIGRlZmxhdGUoKSwgc2luY2UgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgaW5wdXQgbWF5IGhhdmUgdG8gYmUKLSAgIGNvbXByZXNzZWQgYW5kIGZsdXNoZWQuICBJbiBwYXJ0aWN1bGFyLCBzdHJtLT5hdmFpbF9vdXQgbXVzdCBiZSBub24temVyby4KLQotICAgICBkZWZsYXRlUGFyYW1zIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCBvciBpZiBhIHBhcmFtZXRlciB3YXMgaW52YWxpZCwgWl9CVUZfRVJST1IgaWYKLSAgIHN0cm0tPmF2YWlsX291dCB3YXMgemVyby4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVR1bmUgT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdvb2RfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9sYXp5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5pY2VfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9jaGFpbikpOwotLyoKLSAgICAgRmluZSB0dW5lIGRlZmxhdGUncyBpbnRlcm5hbCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLiAgVGhpcyBzaG91bGQgb25seSBiZQotICAgdXNlZCBieSBzb21lb25lIHdobyB1bmRlcnN0YW5kcyB0aGUgYWxnb3JpdGhtIHVzZWQgYnkgemxpYidzIGRlZmxhdGUgZm9yCi0gICBzZWFyY2hpbmcgZm9yIHRoZSBiZXN0IG1hdGNoaW5nIHN0cmluZywgYW5kIGV2ZW4gdGhlbiBvbmx5IGJ5IHRoZSBtb3N0Ci0gICBmYW5hdGljIG9wdGltaXplciB0cnlpbmcgdG8gc3F1ZWV6ZSBvdXQgdGhlIGxhc3QgY29tcHJlc3NlZCBiaXQgZm9yIHRoZWlyCi0gICBzcGVjaWZpYyBpbnB1dCBkYXRhLiAgUmVhZCB0aGUgZGVmbGF0ZS5jIHNvdXJjZSBjb2RlIGZvciB0aGUgbWVhbmluZyBvZiB0aGUKLSAgIG1heF9sYXp5LCBnb29kX2xlbmd0aCwgbmljZV9sZW5ndGgsIGFuZCBtYXhfY2hhaW4gcGFyYW1ldGVycy4KLQotICAgICBkZWZsYXRlVHVuZSgpIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgZGVmbGF0ZUluaXQoKSBvciBkZWZsYXRlSW5pdDIoKSwgYW5kCi0gICByZXR1cm5zIFpfT0sgb24gc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgZm9yIGFuIGludmFsaWQgZGVmbGF0ZSBzdHJlYW0uCi0gKi8KLQotWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGRlZmxhdGVCb3VuZCBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBzb3VyY2VMZW4pKTsKLS8qCi0gICAgIGRlZmxhdGVCb3VuZCgpIHJldHVybnMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNvbXByZXNzZWQgc2l6ZSBhZnRlcgotICAgZGVmbGF0aW9uIG9mIHNvdXJjZUxlbiBieXRlcy4gIEl0IG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZmxhdGVJbml0KCkgb3IKLSAgIGRlZmxhdGVJbml0MigpLCBhbmQgYWZ0ZXIgZGVmbGF0ZVNldEhlYWRlcigpLCBpZiB1c2VkLiAgVGhpcyB3b3VsZCBiZSB1c2VkCi0gICB0byBhbGxvY2F0ZSBhbiBvdXRwdXQgYnVmZmVyIGZvciBkZWZsYXRpb24gaW4gYSBzaW5nbGUgcGFzcywgYW5kIHNvIHdvdWxkIGJlCi0gICBjYWxsZWQgYmVmb3JlIGRlZmxhdGUoKS4gIElmIHRoYXQgZmlyc3QgZGVmbGF0ZSgpIGNhbGwgaXMgcHJvdmlkZWQgdGhlCi0gICBzb3VyY2VMZW4gaW5wdXQgYnl0ZXMsIGFuIG91dHB1dCBidWZmZXIgYWxsb2NhdGVkIHRvIHRoZSBzaXplIHJldHVybmVkIGJ5Ci0gICBkZWZsYXRlQm91bmQoKSwgYW5kIHRoZSBmbHVzaCB2YWx1ZSBaX0ZJTklTSCwgdGhlbiBkZWZsYXRlKCkgaXMgZ3VhcmFudGVlZAotICAgdG8gcmV0dXJuIFpfU1RSRUFNX0VORC4gIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIGNvbXByZXNzZWQgc2l6ZSB0bwotICAgYmUgbGFyZ2VyIHRoYW4gdGhlIHZhbHVlIHJldHVybmVkIGJ5IGRlZmxhdGVCb3VuZCgpIGlmIGZsdXNoIG9wdGlvbnMgb3RoZXIKLSAgIHRoYW4gWl9GSU5JU0ggb3IgWl9OT19GTFVTSCBhcmUgdXNlZC4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVBlbmRpbmcgT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKnBlbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpKTsKLS8qCi0gICAgIGRlZmxhdGVQZW5kaW5nKCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFuZCBiaXRzIG9mIG91dHB1dCB0aGF0IGhhdmUKLSAgIGJlZW4gZ2VuZXJhdGVkLCBidXQgbm90IHlldCBwcm92aWRlZCBpbiB0aGUgYXZhaWxhYmxlIG91dHB1dC4gIFRoZSBieXRlcyBub3QKLSAgIHByb3ZpZGVkIHdvdWxkIGJlIGR1ZSB0byB0aGUgYXZhaWxhYmxlIG91dHB1dCBzcGFjZSBoYXZpbmcgYmVpbmcgY29uc3VtZWQuCi0gICBUaGUgbnVtYmVyIG9mIGJpdHMgb2Ygb3V0cHV0IG5vdCBwcm92aWRlZCBhcmUgYmV0d2VlbiAwIGFuZCA3LCB3aGVyZSB0aGV5Ci0gICBhd2FpdCBtb3JlIGJpdHMgdG8gam9pbiB0aGVtIGluIG9yZGVyIHRvIGZpbGwgb3V0IGEgZnVsbCBieXRlLiAgSWYgcGVuZGluZwotICAgb3IgYml0cyBhcmUgWl9OVUxMLCB0aGVuIHRob3NlIHZhbHVlcyBhcmUgbm90IHNldC4KLQotICAgICBkZWZsYXRlUGVuZGluZyByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCi0gKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlUHJpbWUgT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkpOwotLyoKLSAgICAgZGVmbGF0ZVByaW1lKCkgaW5zZXJ0cyBiaXRzIGluIHRoZSBkZWZsYXRlIG91dHB1dCBzdHJlYW0uICBUaGUgaW50ZW50Ci0gICBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdGFydCBvZmYgdGhlIGRlZmxhdGUgb3V0cHV0IHdpdGggdGhlIGJpdHMKLSAgIGxlZnRvdmVyIGZyb20gYSBwcmV2aW91cyBkZWZsYXRlIHN0cmVhbSB3aGVuIGFwcGVuZGluZyB0byBpdC4gIEFzIHN1Y2gsIHRoaXMKLSAgIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHJhdyBkZWZsYXRlLCBhbmQgbXVzdCBiZSB1c2VkIGJlZm9yZSB0aGUgZmlyc3QKLSAgIGRlZmxhdGUoKSBjYWxsIGFmdGVyIGEgZGVmbGF0ZUluaXQyKCkgb3IgZGVmbGF0ZVJlc2V0KCkuICBiaXRzIG11c3QgYmUgbGVzcwotICAgdGhhbiBvciBlcXVhbCB0byAxNiwgYW5kIHRoYXQgbWFueSBvZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB2YWx1ZQotICAgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUgb3V0cHV0LgotCi0gICAgIGRlZmxhdGVQcmltZSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKLSAgIHJvb20gaW4gdGhlIGludGVybmFsIGJ1ZmZlciB0byBpbnNlcnQgdGhlIGJpdHMsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZQotICAgc291cmNlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlU2V0SGVhZGVyIE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3pfaGVhZGVycCBoZWFkKSk7Ci0vKgotICAgICBkZWZsYXRlU2V0SGVhZGVyKCkgcHJvdmlkZXMgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gZm9yIHdoZW4gYSBnemlwCi0gICBzdHJlYW0gaXMgcmVxdWVzdGVkIGJ5IGRlZmxhdGVJbml0MigpLiAgZGVmbGF0ZVNldEhlYWRlcigpIG1heSBiZSBjYWxsZWQKLSAgIGFmdGVyIGRlZmxhdGVJbml0MigpIG9yIGRlZmxhdGVSZXNldCgpIGFuZCBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgb2YKLSAgIGRlZmxhdGUoKS4gIFRoZSB0ZXh0LCB0aW1lLCBvcywgZXh0cmEgZmllbGQsIG5hbWUsIGFuZCBjb21tZW50IGluZm9ybWF0aW9uCi0gICBpbiB0aGUgcHJvdmlkZWQgZ3pfaGVhZGVyIHN0cnVjdHVyZSBhcmUgd3JpdHRlbiB0byB0aGUgZ3ppcCBoZWFkZXIgKHhmbGFnIGlzCi0gICBpZ25vcmVkIC0tIHRoZSBleHRyYSBmbGFncyBhcmUgc2V0IGFjY29yZGluZyB0byB0aGUgY29tcHJlc3Npb24gbGV2ZWwpLiAgVGhlCi0gICBjYWxsZXIgbXVzdCBhc3N1cmUgdGhhdCwgaWYgbm90IFpfTlVMTCwgbmFtZSBhbmQgY29tbWVudCBhcmUgdGVybWluYXRlZCB3aXRoCi0gICBhIHplcm8gYnl0ZSwgYW5kIHRoYXQgaWYgZXh0cmEgaXMgbm90IFpfTlVMTCwgdGhhdCBleHRyYV9sZW4gYnl0ZXMgYXJlCi0gICBhdmFpbGFibGUgdGhlcmUuICBJZiBoY3JjIGlzIHRydWUsIGEgZ3ppcCBoZWFkZXIgY3JjIGlzIGluY2x1ZGVkLiAgTm90ZSB0aGF0Ci0gICB0aGUgY3VycmVudCB2ZXJzaW9ucyBvZiB0aGUgY29tbWFuZC1saW5lIHZlcnNpb24gb2YgZ3ppcCAodXAgdGhyb3VnaCB2ZXJzaW9uCi0gICAxLjMueCkgZG8gbm90IHN1cHBvcnQgaGVhZGVyIGNyYydzLCBhbmQgd2lsbCByZXBvcnQgdGhhdCBpdCBpcyBhICJtdWx0aS1wYXJ0Ci0gICBnemlwIGZpbGUiIGFuZCBnaXZlIHVwLgotCi0gICAgIElmIGRlZmxhdGVTZXRIZWFkZXIgaXMgbm90IHVzZWQsIHRoZSBkZWZhdWx0IGd6aXAgaGVhZGVyIGhhcyB0ZXh0IGZhbHNlLAotICAgdGhlIHRpbWUgc2V0IHRvIHplcm8sIGFuZCBvcyBzZXQgdG8gMjU1LCB3aXRoIG5vIGV4dHJhLCBuYW1lLCBvciBjb21tZW50Ci0gICBmaWVsZHMuICBUaGUgZ3ppcCBoZWFkZXIgaXMgcmV0dXJuZWQgdG8gdGhlIGRlZmF1bHQgc3RhdGUgYnkgZGVmbGF0ZVJlc2V0KCkuCi0KLSAgICAgZGVmbGF0ZVNldEhlYWRlciByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCi0qLwotCi0vKgotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdDIgT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgd2luZG93Qml0cykpOwotCi0gICAgIFRoaXMgaXMgYW5vdGhlciB2ZXJzaW9uIG9mIGluZmxhdGVJbml0IHdpdGggYW4gZXh0cmEgcGFyYW1ldGVyLiAgVGhlCi0gICBmaWVsZHMgbmV4dF9pbiwgYXZhaWxfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkCi0gICBiZWZvcmUgYnkgdGhlIGNhbGxlci4KLQotICAgICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgdGhlIGJhc2UgdHdvIGxvZ2FyaXRobSBvZiB0aGUgbWF4aW11bSB3aW5kb3cKLSAgIHNpemUgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuICBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvcgotICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTUgaWYgaW5mbGF0ZUluaXQgaXMgdXNlZAotICAgaW5zdGVhZC4gIHdpbmRvd0JpdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHdpbmRvd0JpdHMgdmFsdWUKLSAgIHByb3ZpZGVkIHRvIGRlZmxhdGVJbml0MigpIHdoaWxlIGNvbXByZXNzaW5nLCBvciBpdCBtdXN0IGJlIGVxdWFsIHRvIDE1IGlmCi0gICBkZWZsYXRlSW5pdDIoKSB3YXMgbm90IHVzZWQuICBJZiBhIGNvbXByZXNzZWQgc3RyZWFtIHdpdGggYSBsYXJnZXIgd2luZG93Ci0gICBzaXplIGlzIGdpdmVuIGFzIGlucHV0LCBpbmZsYXRlKCkgd2lsbCByZXR1cm4gd2l0aCB0aGUgZXJyb3IgY29kZQotICAgWl9EQVRBX0VSUk9SIGluc3RlYWQgb2YgdHJ5aW5nIHRvIGFsbG9jYXRlIGEgbGFyZ2VyIHdpbmRvdy4KLQotICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIHplcm8gdG8gcmVxdWVzdCB0aGF0IGluZmxhdGUgdXNlIHRoZSB3aW5kb3cgc2l6ZSBpbgotICAgdGhlIHpsaWIgaGVhZGVyIG9mIHRoZSBjb21wcmVzc2VkIHN0cmVhbS4KLQotICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIC04Li4tMTUgZm9yIHJhdyBpbmZsYXRlLiAgSW4gdGhpcyBjYXNlLCAtd2luZG93Qml0cwotICAgZGV0ZXJtaW5lcyB0aGUgd2luZG93IHNpemUuICBpbmZsYXRlKCkgd2lsbCB0aGVuIHByb2Nlc3MgcmF3IGRlZmxhdGUgZGF0YSwKLSAgIG5vdCBsb29raW5nIGZvciBhIHpsaWIgb3IgZ3ppcCBoZWFkZXIsIG5vdCBnZW5lcmF0aW5nIGEgY2hlY2sgdmFsdWUsIGFuZCBub3QKLSAgIGxvb2tpbmcgZm9yIGFueSBjaGVjayB2YWx1ZXMgZm9yIGNvbXBhcmlzb24gYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLiAgVGhpcwotICAgaXMgZm9yIHVzZSB3aXRoIG90aGVyIGZvcm1hdHMgdGhhdCB1c2UgdGhlIGRlZmxhdGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdAotICAgc3VjaCBhcyB6aXAuICBUaG9zZSBmb3JtYXRzIHByb3ZpZGUgdGhlaXIgb3duIGNoZWNrIHZhbHVlcy4gIElmIGEgY3VzdG9tCi0gICBmb3JtYXQgaXMgZGV2ZWxvcGVkIHVzaW5nIHRoZSByYXcgZGVmbGF0ZSBmb3JtYXQgZm9yIGNvbXByZXNzZWQgZGF0YSwgaXQgaXMKLSAgIHJlY29tbWVuZGVkIHRoYXQgYSBjaGVjayB2YWx1ZSBzdWNoIGFzIGFuIGFkbGVyMzIgb3IgYSBjcmMzMiBiZSBhcHBsaWVkIHRvCi0gICB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYXMgaXMgZG9uZSBpbiB0aGUgemxpYiwgZ3ppcCwgYW5kIHppcCBmb3JtYXRzLiAgRm9yCi0gICBtb3N0IGFwcGxpY2F0aW9ucywgdGhlIHpsaWIgZm9ybWF0IHNob3VsZCBiZSB1c2VkIGFzIGlzLiAgTm90ZSB0aGF0IGNvbW1lbnRzCi0gICBhYm92ZSBvbiB0aGUgdXNlIGluIGRlZmxhdGVJbml0MigpIGFwcGxpZXMgdG8gdGhlIG1hZ25pdHVkZSBvZiB3aW5kb3dCaXRzLgotCi0gICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgZ3JlYXRlciB0aGFuIDE1IGZvciBvcHRpb25hbCBnemlwIGRlY29kaW5nLiAgQWRkCi0gICAzMiB0byB3aW5kb3dCaXRzIHRvIGVuYWJsZSB6bGliIGFuZCBnemlwIGRlY29kaW5nIHdpdGggYXV0b21hdGljIGhlYWRlcgotICAgZGV0ZWN0aW9uLCBvciBhZGQgMTYgdG8gZGVjb2RlIG9ubHkgdGhlIGd6aXAgZm9ybWF0ICh0aGUgemxpYiBmb3JtYXQgd2lsbAotICAgcmV0dXJuIGEgWl9EQVRBX0VSUk9SKS4gIElmIGEgZ3ppcCBzdHJlYW0gaXMgYmVpbmcgZGVjb2RlZCwgc3RybS0+YWRsZXIgaXMgYQotICAgY3JjMzIgaW5zdGVhZCBvZiBhbiBhZGxlcjMyLgotCi0gICAgIGluZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKLSAgIG1lbW9yeSwgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUKLSAgIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgcGFyYW1ldGVycyBhcmUKLSAgIGludmFsaWQsIHN1Y2ggYXMgYSBudWxsIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZS4gIG1zZyBpcyBzZXQgdG8gbnVsbCBpZgotICAgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGluZmxhdGVJbml0MiBkb2VzIG5vdCBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uCi0gICBhcGFydCBmcm9tIHBvc3NpYmx5IHJlYWRpbmcgdGhlIHpsaWIgaGVhZGVyIGlmIHByZXNlbnQ6IGFjdHVhbCBkZWNvbXByZXNzaW9uCi0gICB3aWxsIGJlIGRvbmUgYnkgaW5mbGF0ZSgpLiAgKFNvIG5leHRfaW4gYW5kIGF2YWlsX2luIG1heSBiZSBtb2RpZmllZCwgYnV0Ci0gICBuZXh0X291dCBhbmQgYXZhaWxfb3V0IGFyZSB1bnVzZWQgYW5kIHVuY2hhbmdlZC4pIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uCi0gICBvZiBpbmZsYXRlSW5pdDIoKSBkb2VzIG5vdCBwcm9jZXNzIGFueSBoZWFkZXIgaW5mb3JtYXRpb24gLS0gdGhhdCBpcwotICAgZGVmZXJyZWQgdW50aWwgaW5mbGF0ZSgpIGlzIGNhbGxlZC4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVNldERpY3Rpb25hcnkgT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50ICBkaWN0TGVuZ3RoKSk7Ci0vKgotICAgICBJbml0aWFsaXplcyB0aGUgZGVjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIHVuY29tcHJlc3NlZCBieXRlCi0gICBzZXF1ZW5jZS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjYWxsIG9mIGluZmxhdGUsCi0gICBpZiB0aGF0IGNhbGwgcmV0dXJuZWQgWl9ORUVEX0RJQ1QuICBUaGUgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IKLSAgIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIGFkbGVyMzIgdmFsdWUgcmV0dXJuZWQgYnkgdGhhdCBjYWxsIG9mIGluZmxhdGUuCi0gICBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUgZGljdGlvbmFyeSAoc2VlCi0gICBkZWZsYXRlU2V0RGljdGlvbmFyeSkuICBGb3IgcmF3IGluZmxhdGUsIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBhdCBhbnkKLSAgIHRpbWUgdG8gc2V0IHRoZSBkaWN0aW9uYXJ5LiAgSWYgdGhlIHByb3ZpZGVkIGRpY3Rpb25hcnkgaXMgc21hbGxlciB0aGFuIHRoZQotICAgd2luZG93IGFuZCB0aGVyZSBpcyBhbHJlYWR5IGRhdGEgaW4gdGhlIHdpbmRvdywgdGhlbiB0aGUgcHJvdmlkZWQgZGljdGlvbmFyeQotICAgd2lsbCBhbWVuZCB3aGF0J3MgdGhlcmUuICBUaGUgYXBwbGljYXRpb24gbXVzdCBpbnN1cmUgdGhhdCB0aGUgZGljdGlvbmFyeQotICAgdGhhdCB3YXMgdXNlZCBmb3IgY29tcHJlc3Npb24gaXMgcHJvdmlkZWQuCi0KLSAgICAgaW5mbGF0ZVNldERpY3Rpb25hcnkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIGEKLSAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChlLmcuICBkaWN0aW9uYXJ5IGJlaW5nIFpfTlVMTCkgb3IgdGhlIHN0cmVhbSBzdGF0ZSBpcwotICAgaW5jb25zaXN0ZW50LCBaX0RBVEFfRVJST1IgaWYgdGhlIGdpdmVuIGRpY3Rpb25hcnkgZG9lc24ndCBtYXRjaCB0aGUKLSAgIGV4cGVjdGVkIG9uZSAoaW5jb3JyZWN0IGFkbGVyMzIgdmFsdWUpLiAgaW5mbGF0ZVNldERpY3Rpb25hcnkgZG9lcyBub3QKLSAgIHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IHN1YnNlcXVlbnQgY2FsbHMgb2YKLSAgIGluZmxhdGUoKS4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVN5bmMgT0YoKHpfc3RyZWFtcCBzdHJtKSk7Ci0vKgotICAgICBTa2lwcyBpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSB1bnRpbCBhIHBvc3NpYmxlIGZ1bGwgZmx1c2ggcG9pbnQgKHNlZSBhYm92ZQotICAgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiBkZWZsYXRlIHdpdGggWl9GVUxMX0ZMVVNIKSBjYW4gYmUgZm91bmQsIG9yIHVudGlsIGFsbAotICAgYXZhaWxhYmxlIGlucHV0IGlzIHNraXBwZWQuICBObyBvdXRwdXQgaXMgcHJvdmlkZWQuCi0KLSAgICAgaW5mbGF0ZVN5bmMgc2VhcmNoZXMgZm9yIGEgMDAgMDAgRkYgRkYgcGF0dGVybiBpbiB0aGUgY29tcHJlc3NlZCBkYXRhLgotICAgQWxsIGZ1bGwgZmx1c2ggcG9pbnRzIGhhdmUgdGhpcyBwYXR0ZXJuLCBidXQgbm90IGFsbCBvY2N1cmVuY2VzIG9mIHRoaXMKLSAgIHBhdHRlcm4gYXJlIGZ1bGwgZmx1c2ggcG9pbnRzLgotCi0gICAgIGluZmxhdGVTeW5jIHJldHVybnMgWl9PSyBpZiBhIHBvc3NpYmxlIGZ1bGwgZmx1c2ggcG9pbnQgaGFzIGJlZW4gZm91bmQsCi0gICBaX0JVRl9FUlJPUiBpZiBubyBtb3JlIGlucHV0IHdhcyBwcm92aWRlZCwgWl9EQVRBX0VSUk9SIGlmIG5vIGZsdXNoIHBvaW50Ci0gICBoYXMgYmVlbiBmb3VuZCwgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudC4KLSAgIEluIHRoZSBzdWNjZXNzIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgc2F2ZSB0aGUgY3VycmVudCBjdXJyZW50IHZhbHVlIG9mCi0gICB0b3RhbF9pbiB3aGljaCBpbmRpY2F0ZXMgd2hlcmUgdmFsaWQgY29tcHJlc3NlZCBkYXRhIHdhcyBmb3VuZC4gIEluIHRoZQotICAgZXJyb3IgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIG1heSByZXBlYXRlZGx5IGNhbGwgaW5mbGF0ZVN5bmMsIHByb3ZpZGluZyBtb3JlCi0gICBpbnB1dCBlYWNoIHRpbWUsIHVudGlsIHN1Y2Nlc3Mgb3IgZW5kIG9mIHRoZSBpbnB1dCBkYXRhLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQ29weSBPRigoel9zdHJlYW1wIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X3N0cmVhbXAgc291cmNlKSk7Ci0vKgotICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gYXMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBzb3VyY2Ugc3RyZWFtLgotCi0gICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIHJhbmRvbWx5IGFjY2Vzc2luZyBhIGxhcmdlIHN0cmVhbS4gIFRoZQotICAgZmlyc3QgcGFzcyB0aHJvdWdoIHRoZSBzdHJlYW0gY2FuIHBlcmlvZGljYWxseSByZWNvcmQgdGhlIGluZmxhdGUgc3RhdGUsCi0gICBhbGxvd2luZyByZXN0YXJ0aW5nIGluZmxhdGUgYXQgdGhvc2UgcG9pbnRzIHdoZW4gcmFuZG9tbHkgYWNjZXNzaW5nIHRoZQotICAgc3RyZWFtLgotCi0gICAgIGluZmxhdGVDb3B5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90Ci0gICBlbm91Z2ggbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50Ci0gICAoc3VjaCBhcyB6YWxsb2MgYmVpbmcgWl9OVUxMKS4gIG1zZyBpcyBsZWZ0IHVuY2hhbmdlZCBpbiBib3RoIHNvdXJjZSBhbmQKLSAgIGRlc3RpbmF0aW9uLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7Ci0vKgotICAgICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gaW5mbGF0ZUVuZCBmb2xsb3dlZCBieSBpbmZsYXRlSW5pdCwKLSAgIGJ1dCBkb2VzIG5vdCBmcmVlIGFuZCByZWFsbG9jYXRlIGFsbCB0aGUgaW50ZXJuYWwgZGVjb21wcmVzc2lvbiBzdGF0ZS4gIFRoZQotICAgc3RyZWFtIHdpbGwga2VlcCBhdHRyaWJ1dGVzIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgYnkgaW5mbGF0ZUluaXQyLgotCi0gICAgIGluZmxhdGVSZXNldCByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIFpfTlVMTCkuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVSZXNldDIgT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cykpOwotLyoKLSAgICAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcyBpbmZsYXRlUmVzZXQsIGJ1dCBpdCBhbHNvIHBlcm1pdHMgY2hhbmdpbmcKLSAgIHRoZSB3cmFwIGFuZCB3aW5kb3cgc2l6ZSByZXF1ZXN0cy4gIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyBpbnRlcnByZXRlZAotICAgdGhlIHNhbWUgYXMgaXQgaXMgZm9yIGluZmxhdGVJbml0Mi4KLQotICAgICBpbmZsYXRlUmVzZXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyB6YWxsb2Mgb3Igc3RhdGUgYmVpbmcgWl9OVUxMKSwgb3IgaWYKLSAgIHRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyBpbnZhbGlkLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlUHJpbWUgT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkpOwotLyoKLSAgICAgVGhpcyBmdW5jdGlvbiBpbnNlcnRzIGJpdHMgaW4gdGhlIGluZmxhdGUgaW5wdXQgc3RyZWFtLiAgVGhlIGludGVudCBpcwotICAgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RhcnQgaW5mbGF0aW5nIGF0IGEgYml0IHBvc2l0aW9uIGluIHRoZQotICAgbWlkZGxlIG9mIGEgYnl0ZS4gIFRoZSBwcm92aWRlZCBiaXRzIHdpbGwgYmUgdXNlZCBiZWZvcmUgYW55IGJ5dGVzIGFyZSB1c2VkCi0gICBmcm9tIG5leHRfaW4uICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCByYXcgaW5mbGF0ZSwgYW5kCi0gICBzaG91bGQgYmUgdXNlZCBiZWZvcmUgdGhlIGZpcnN0IGluZmxhdGUoKSBjYWxsIGFmdGVyIGluZmxhdGVJbml0MigpIG9yCi0gICBpbmZsYXRlUmVzZXQoKS4gIGJpdHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYsIGFuZCB0aGF0IG1hbnkgb2YgdGhlCi0gICBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHZhbHVlIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gdGhlIGlucHV0LgotCi0gICAgIElmIGJpdHMgaXMgbmVnYXRpdmUsIHRoZW4gdGhlIGlucHV0IHN0cmVhbSBiaXQgYnVmZmVyIGlzIGVtcHRpZWQuICBUaGVuCi0gICBpbmZsYXRlUHJpbWUoKSBjYW4gYmUgY2FsbGVkIGFnYWluIHRvIHB1dCBiaXRzIGluIHRoZSBidWZmZXIuICBUaGlzIGlzIHVzZWQKLSAgIHRvIGNsZWFyIG91dCBiaXRzIGxlZnRvdmVyIGFmdGVyIGZlZWRpbmcgaW5mbGF0ZSBhIGJsb2NrIGRlc2NyaXB0aW9uIHByaW9yCi0gICB0byBmZWVkaW5nIGluZmxhdGUgY29kZXMuCi0KLSAgICAgaW5mbGF0ZVByaW1lIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KLSovCi0KLVpFWFRFUk4gbG9uZyBaRVhQT1JUIGluZmxhdGVNYXJrIE9GKCh6X3N0cmVhbXAgc3RybSkpOwotLyoKLSAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHR3byB2YWx1ZXMsIG9uZSBpbiB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgcmV0dXJuCi0gICB2YWx1ZSwgYW5kIHRoZSBvdGhlciBpbiB0aGUgcmVtYWluaW5nIHVwcGVyIGJpdHMsIG9idGFpbmVkIGJ5IHNoaWZ0aW5nIHRoZQotICAgcmV0dXJuIHZhbHVlIGRvd24gMTYgYml0cy4gIElmIHRoZSB1cHBlciB2YWx1ZSBpcyAtMSBhbmQgdGhlIGxvd2VyIHZhbHVlIGlzCi0gICB6ZXJvLCB0aGVuIGluZmxhdGUoKSBpcyBjdXJyZW50bHkgZGVjb2RpbmcgaW5mb3JtYXRpb24gb3V0c2lkZSBvZiBhIGJsb2NrLgotICAgSWYgdGhlIHVwcGVyIHZhbHVlIGlzIC0xIGFuZCB0aGUgbG93ZXIgdmFsdWUgaXMgbm9uLXplcm8sIHRoZW4gaW5mbGF0ZSBpcyBpbgotICAgdGhlIG1pZGRsZSBvZiBhIHN0b3JlZCBibG9jaywgd2l0aCB0aGUgbG93ZXIgdmFsdWUgZXF1YWxpbmcgdGhlIG51bWJlciBvZgotICAgYnl0ZXMgZnJvbSB0aGUgaW5wdXQgcmVtYWluaW5nIHRvIGNvcHkuICBJZiB0aGUgdXBwZXIgdmFsdWUgaXMgbm90IC0xLCB0aGVuCi0gICBpdCBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgYmFjayBmcm9tIHRoZSBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgb2YKLSAgIHRoZSBjb2RlIChsaXRlcmFsIG9yIGxlbmd0aC9kaXN0YW5jZSBwYWlyKSBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiAgSW4KLSAgIHRoYXQgY2FzZSB0aGUgbG93ZXIgdmFsdWUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBhbHJlYWR5IGVtaXR0ZWQgZm9yIHRoYXQKLSAgIGNvZGUuCi0KLSAgICAgQSBjb2RlIGlzIGJlaW5nIHByb2Nlc3NlZCBpZiBpbmZsYXRlIGlzIHdhaXRpbmcgZm9yIG1vcmUgaW5wdXQgdG8gY29tcGxldGUKLSAgIGRlY29kaW5nIG9mIHRoZSBjb2RlLCBvciBpZiBpdCBoYXMgY29tcGxldGVkIGRlY29kaW5nIGJ1dCBpcyB3YWl0aW5nIGZvcgotICAgbW9yZSBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgdGhlIGxpdGVyYWwgb3IgbWF0Y2ggZGF0YS4KLQotICAgICBpbmZsYXRlTWFyaygpIGlzIHVzZWQgdG8gbWFyayBsb2NhdGlvbnMgaW4gdGhlIGlucHV0IGRhdGEgZm9yIHJhbmRvbQotICAgYWNjZXNzLCB3aGljaCBtYXkgYmUgYXQgYml0IHBvc2l0aW9ucywgYW5kIHRvIG5vdGUgdGhvc2UgY2FzZXMgd2hlcmUgdGhlCi0gICBvdXRwdXQgb2YgYSBjb2RlIG1heSBzcGFuIGJvdW5kYXJpZXMgb2YgcmFuZG9tIGFjY2VzcyBibG9ja3MuICBUaGUgY3VycmVudAotICAgbG9jYXRpb24gaW4gdGhlIGlucHV0IHN0cmVhbSBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIGF2YWlsX2luIGFuZCBkYXRhX3R5cGUKLSAgIGFzIG5vdGVkIGluIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIFpfQkxPQ0sgZmx1c2ggcGFyYW1ldGVyIGZvciBpbmZsYXRlLgotCi0gICAgIGluZmxhdGVNYXJrIHJldHVybnMgdGhlIHZhbHVlIG5vdGVkIGFib3ZlIG9yIC0xIDw8IDE2IGlmIHRoZSBwcm92aWRlZAotICAgc291cmNlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlR2V0SGVhZGVyIE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3pfaGVhZGVycCBoZWFkKSk7Ci0vKgotICAgICBpbmZsYXRlR2V0SGVhZGVyKCkgcmVxdWVzdHMgdGhhdCBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBiZSBzdG9yZWQgaW4gdGhlCi0gICBwcm92aWRlZCBnel9oZWFkZXIgc3RydWN0dXJlLiAgaW5mbGF0ZUdldEhlYWRlcigpIG1heSBiZSBjYWxsZWQgYWZ0ZXIKLSAgIGluZmxhdGVJbml0MigpIG9yIGluZmxhdGVSZXNldCgpLCBhbmQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIG9mIGluZmxhdGUoKS4KLSAgIEFzIGluZmxhdGUoKSBwcm9jZXNzZXMgdGhlIGd6aXAgc3RyZWFtLCBoZWFkLT5kb25lIGlzIHplcm8gdW50aWwgdGhlIGhlYWRlcgotICAgaXMgY29tcGxldGVkLCBhdCB3aGljaCB0aW1lIGhlYWQtPmRvbmUgaXMgc2V0IHRvIG9uZS4gIElmIGEgemxpYiBzdHJlYW0gaXMKLSAgIGJlaW5nIGRlY29kZWQsIHRoZW4gaGVhZC0+ZG9uZSBpcyBzZXQgdG8gLTEgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSB3aWxsIGJlCi0gICBubyBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBmb3J0aGNvbWluZy4gIE5vdGUgdGhhdCBaX0JMT0NLIG9yIFpfVFJFRVMgY2FuIGJlCi0gICB1c2VkIHRvIGZvcmNlIGluZmxhdGUoKSB0byByZXR1cm4gaW1tZWRpYXRlbHkgYWZ0ZXIgaGVhZGVyIHByb2Nlc3NpbmcgaXMKLSAgIGNvbXBsZXRlIGFuZCBiZWZvcmUgYW55IGFjdHVhbCBkYXRhIGlzIGRlY29tcHJlc3NlZC4KLQotICAgICBUaGUgdGV4dCwgdGltZSwgeGZsYWdzLCBhbmQgb3MgZmllbGRzIGFyZSBmaWxsZWQgaW4gd2l0aCB0aGUgZ3ppcCBoZWFkZXIKLSAgIGNvbnRlbnRzLiAgaGNyYyBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGVyZSBpcyBhIGhlYWRlciBDUkMuICAoVGhlIGhlYWRlciBDUkMKLSAgIHdhcyB2YWxpZCBpZiBkb25lIGlzIHNldCB0byBvbmUuKSBJZiBleHRyYSBpcyBub3QgWl9OVUxMLCB0aGVuIGV4dHJhX21heAotICAgY29udGFpbnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIGV4dHJhLiAgT25jZSBkb25lIGlzIHRydWUsCi0gICBleHRyYV9sZW4gY29udGFpbnMgdGhlIGFjdHVhbCBleHRyYSBmaWVsZCBsZW5ndGgsIGFuZCBleHRyYSBjb250YWlucyB0aGUKLSAgIGV4dHJhIGZpZWxkLCBvciB0aGF0IGZpZWxkIHRydW5jYXRlZCBpZiBleHRyYV9tYXggaXMgbGVzcyB0aGFuIGV4dHJhX2xlbi4KLSAgIElmIG5hbWUgaXMgbm90IFpfTlVMTCwgdGhlbiB1cCB0byBuYW1lX21heCBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRoZXJlLAotICAgdGVybWluYXRlZCB3aXRoIGEgemVybyB1bmxlc3MgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gbmFtZV9tYXguICBJZgotICAgY29tbWVudCBpcyBub3QgWl9OVUxMLCB0aGVuIHVwIHRvIGNvbW1fbWF4IGNoYXJhY3RlcnMgYXJlIHdyaXR0ZW4gdGhlcmUsCi0gICB0ZXJtaW5hdGVkIHdpdGggYSB6ZXJvIHVubGVzcyB0aGUgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBjb21tX21heC4gIFdoZW4gYW55Ci0gICBvZiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCBhcmUgbm90IFpfTlVMTCBhbmQgdGhlIHJlc3BlY3RpdmUgZmllbGQgaXMgbm90Ci0gICBwcmVzZW50IGluIHRoZSBoZWFkZXIsIHRoZW4gdGhhdCBmaWVsZCBpcyBzZXQgdG8gWl9OVUxMIHRvIHNpZ25hbCBpdHMKLSAgIGFic2VuY2UuICBUaGlzIGFsbG93cyB0aGUgdXNlIG9mIGRlZmxhdGVTZXRIZWFkZXIoKSB3aXRoIHRoZSByZXR1cm5lZAotICAgc3RydWN0dXJlIHRvIGR1cGxpY2F0ZSB0aGUgaGVhZGVyLiAgSG93ZXZlciBpZiB0aG9zZSBmaWVsZHMgYXJlIHNldCB0bwotICAgYWxsb2NhdGVkIG1lbW9yeSwgdGhlbiB0aGUgYXBwbGljYXRpb24gd2lsbCBuZWVkIHRvIHNhdmUgdGhvc2UgcG9pbnRlcnMKLSAgIGVsc2V3aGVyZSBzbyB0aGF0IHRoZXkgY2FuIGJlIGV2ZW50dWFsbHkgZnJlZWQuCi0KLSAgICAgSWYgaW5mbGF0ZUdldEhlYWRlciBpcyBub3QgdXNlZCwgdGhlbiB0aGUgaGVhZGVyIGluZm9ybWF0aW9uIGlzIHNpbXBseQotICAgZGlzY2FyZGVkLiAgVGhlIGhlYWRlciBpcyBhbHdheXMgY2hlY2tlZCBmb3IgdmFsaWRpdHksIGluY2x1ZGluZyB0aGUgaGVhZGVyCi0gICBDUkMgaWYgcHJlc2VudC4gIGluZmxhdGVSZXNldCgpIHdpbGwgcmVzZXQgdGhlIHByb2Nlc3MgdG8gZGlzY2FyZCB0aGUgaGVhZGVyCi0gICBpbmZvcm1hdGlvbi4gIFRoZSBhcHBsaWNhdGlvbiB3b3VsZCBuZWVkIHRvIGNhbGwgaW5mbGF0ZUdldEhlYWRlcigpIGFnYWluIHRvCi0gICByZXRyaWV2ZSB0aGUgaGVhZGVyIGZyb20gdGhlIG5leHQgZ3ppcCBzdHJlYW0uCi0KLSAgICAgaW5mbGF0ZUdldEhlYWRlciByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCi0qLwotCi0vKgotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0luaXQgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgd2luZG93Qml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93KSk7Ci0KLSAgICAgSW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBkZWNvbXByZXNzaW9uIHVzaW5nIGluZmxhdGVCYWNrKCkKLSAgIGNhbGxzLiAgVGhlIGZpZWxkcyB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgaW4gc3RybSBtdXN0IGJlIGluaXRpYWxpemVkCi0gICBiZWZvcmUgdGhlIGNhbGwuICBJZiB6YWxsb2MgYW5kIHpmcmVlIGFyZSBaX05VTEwsIHRoZW4gdGhlIGRlZmF1bHQgbGlicmFyeS0KLSAgIGRlcml2ZWQgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgYXJlIHVzZWQuICB3aW5kb3dCaXRzIGlzIHRoZSBiYXNlIHR3bwotICAgbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZSwgaW4gdGhlIHJhbmdlIDguLjE1LiAgd2luZG93IGlzIGEgY2FsbGVyCi0gICBzdXBwbGllZCBidWZmZXIgb2YgdGhhdCBzaXplLiAgRXhjZXB0IGZvciBzcGVjaWFsIGFwcGxpY2F0aW9ucyB3aGVyZSBpdCBpcwotICAgYXNzdXJlZCB0aGF0IGRlZmxhdGUgd2FzIHVzZWQgd2l0aCBzbWFsbCB3aW5kb3cgc2l6ZXMsIHdpbmRvd0JpdHMgbXVzdCBiZSAxNQotICAgYW5kIGEgMzJLIGJ5dGUgd2luZG93IG11c3QgYmUgc3VwcGxpZWQgdG8gYmUgYWJsZSB0byBkZWNvbXByZXNzIGdlbmVyYWwKLSAgIGRlZmxhdGUgc3RyZWFtcy4KLQotICAgICBTZWUgaW5mbGF0ZUJhY2soKSBmb3IgdGhlIHVzYWdlIG9mIHRoZXNlIHJvdXRpbmVzLgotCi0gICAgIGluZmxhdGVCYWNrSW5pdCB3aWxsIHJldHVybiBaX09LIG9uIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIGFueSBvZgotICAgdGhlIHBhcmFtZXRlcnMgYXJlIGludmFsaWQsIFpfTUVNX0VSUk9SIGlmIHRoZSBpbnRlcm5hbCBzdGF0ZSBjb3VsZCBub3QgYmUKLSAgIGFsbG9jYXRlZCwgb3IgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGRvZXMgbm90IG1hdGNoCi0gICB0aGUgdmVyc2lvbiBvZiB0aGUgaGVhZGVyIGZpbGUuCi0qLwotCi10eXBlZGVmIHVuc2lnbmVkICgqaW5fZnVuYykgT0YoKHZvaWQgRkFSICosIHVuc2lnbmVkIGNoYXIgRkFSICogRkFSICopKTsKLXR5cGVkZWYgaW50ICgqb3V0X2Z1bmMpIE9GKCh2b2lkIEZBUiAqLCB1bnNpZ25lZCBjaGFyIEZBUiAqLCB1bnNpZ25lZCkpOwotCi1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrIE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2Z1bmMgaW4sIHZvaWQgRkFSICppbl9kZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2Z1bmMgb3V0LCB2b2lkIEZBUiAqb3V0X2Rlc2MpKTsKLS8qCi0gICAgIGluZmxhdGVCYWNrKCkgZG9lcyBhIHJhdyBpbmZsYXRlIHdpdGggYSBzaW5nbGUgY2FsbCB1c2luZyBhIGNhbGwtYmFjawotICAgaW50ZXJmYWNlIGZvciBpbnB1dCBhbmQgb3V0cHV0LiAgVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGluZmxhdGUoKSBmb3IKLSAgIGZpbGUgaS9vIGFwcGxpY2F0aW9ucyBpbiB0aGF0IGl0IGF2b2lkcyBjb3B5aW5nIGJldHdlZW4gdGhlIG91dHB1dCBhbmQgdGhlCi0gICBzbGlkaW5nIHdpbmRvdyBieSBzaW1wbHkgbWFraW5nIHRoZSB3aW5kb3cgaXRzZWxmIHRoZSBvdXRwdXQgYnVmZmVyLiAgVGhpcwotICAgZnVuY3Rpb24gdHJ1c3RzIHRoZSBhcHBsaWNhdGlvbiB0byBub3QgY2hhbmdlIHRoZSBvdXRwdXQgYnVmZmVyIHBhc3NlZCBieQotICAgdGhlIG91dHB1dCBmdW5jdGlvbiwgYXQgbGVhc3QgdW50aWwgaW5mbGF0ZUJhY2soKSByZXR1cm5zLgotCi0gICAgIGluZmxhdGVCYWNrSW5pdCgpIG11c3QgYmUgY2FsbGVkIGZpcnN0IHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZQotICAgYW5kIHRvIGluaXRpYWxpemUgdGhlIHN0YXRlIHdpdGggdGhlIHVzZXItcHJvdmlkZWQgd2luZG93IGJ1ZmZlci4KLSAgIGluZmxhdGVCYWNrKCkgbWF5IHRoZW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcyB0byBpbmZsYXRlIGEgY29tcGxldGUsIHJhdwotICAgZGVmbGF0ZSBzdHJlYW0gd2l0aCBlYWNoIGNhbGwuICBpbmZsYXRlQmFja0VuZCgpIGlzIHRoZW4gY2FsbGVkIHRvIGZyZWUgdGhlCi0gICBhbGxvY2F0ZWQgc3RhdGUuCi0KLSAgICAgQSByYXcgZGVmbGF0ZSBzdHJlYW0gaXMgb25lIHdpdGggbm8gemxpYiBvciBnemlwIGhlYWRlciBvciB0cmFpbGVyLgotICAgVGhpcyByb3V0aW5lIHdvdWxkIG5vcm1hbGx5IGJlIHVzZWQgaW4gYSB1dGlsaXR5IHRoYXQgcmVhZHMgemlwIG9yIGd6aXAKLSAgIGZpbGVzIGFuZCB3cml0ZXMgb3V0IHVuY29tcHJlc3NlZCBmaWxlcy4gIFRoZSB1dGlsaXR5IHdvdWxkIGRlY29kZSB0aGUKLSAgIGhlYWRlciBhbmQgcHJvY2VzcyB0aGUgdHJhaWxlciBvbiBpdHMgb3duLCBoZW5jZSB0aGlzIHJvdXRpbmUgZXhwZWN0cyBvbmx5Ci0gICB0aGUgcmF3IGRlZmxhdGUgc3RyZWFtIHRvIGRlY29tcHJlc3MuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBub3JtYWwKLSAgIGJlaGF2aW9yIG9mIGluZmxhdGUoKSwgd2hpY2ggZXhwZWN0cyBlaXRoZXIgYSB6bGliIG9yIGd6aXAgaGVhZGVyIGFuZAotICAgdHJhaWxlciBhcm91bmQgdGhlIGRlZmxhdGUgc3RyZWFtLgotCi0gICAgIGluZmxhdGVCYWNrKCkgdXNlcyB0d28gc3Vicm91dGluZXMgc3VwcGxpZWQgYnkgdGhlIGNhbGxlciB0aGF0IGFyZSB0aGVuCi0gICBjYWxsZWQgYnkgaW5mbGF0ZUJhY2soKSBmb3IgaW5wdXQgYW5kIG91dHB1dC4gIGluZmxhdGVCYWNrKCkgY2FsbHMgdGhvc2UKLSAgIHJvdXRpbmVzIHVudGlsIGl0IHJlYWRzIGEgY29tcGxldGUgZGVmbGF0ZSBzdHJlYW0gYW5kIHdyaXRlcyBvdXQgYWxsIG9mIHRoZQotICAgdW5jb21wcmVzc2VkIGRhdGEsIG9yIHVudGlsIGl0IGVuY291bnRlcnMgYW4gZXJyb3IuICBUaGUgZnVuY3Rpb24ncwotICAgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHR5cGVzIGFyZSBkZWZpbmVkIGFib3ZlIGluIHRoZSBpbl9mdW5jIGFuZCBvdXRfZnVuYwotICAgdHlwZWRlZnMuICBpbmZsYXRlQmFjaygpIHdpbGwgY2FsbCBpbihpbl9kZXNjLCAmYnVmKSB3aGljaCBzaG91bGQgcmV0dXJuIHRoZQotICAgbnVtYmVyIG9mIGJ5dGVzIG9mIHByb3ZpZGVkIGlucHV0LCBhbmQgYSBwb2ludGVyIHRvIHRoYXQgaW5wdXQgaW4gYnVmLiAgSWYKLSAgIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZSwgaW4oKSBtdXN0IHJldHVybiB6ZXJvLS1idWYgaXMgaWdub3JlZCBpbiB0aGF0Ci0gICBjYXNlLS1hbmQgaW5mbGF0ZUJhY2soKSB3aWxsIHJldHVybiBhIGJ1ZmZlciBlcnJvci4gIGluZmxhdGVCYWNrKCkgd2lsbCBjYWxsCi0gICBvdXQob3V0X2Rlc2MsIGJ1ZiwgbGVuKSB0byB3cml0ZSB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYnVmWzAuLmxlbi0xXS4gIG91dCgpCi0gICBzaG91bGQgcmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3Igbm9uLXplcm8gb24gZmFpbHVyZS4gIElmIG91dCgpIHJldHVybnMKLSAgIG5vbi16ZXJvLCBpbmZsYXRlQmFjaygpIHdpbGwgcmV0dXJuIHdpdGggYW4gZXJyb3IuICBOZWl0aGVyIGluKCkgbm9yIG91dCgpCi0gICBhcmUgcGVybWl0dGVkIHRvIGNoYW5nZSB0aGUgY29udGVudHMgb2YgdGhlIHdpbmRvdyBwcm92aWRlZCB0bwotICAgaW5mbGF0ZUJhY2tJbml0KCksIHdoaWNoIGlzIGFsc28gdGhlIGJ1ZmZlciB0aGF0IG91dCgpIHVzZXMgdG8gd3JpdGUgZnJvbS4KLSAgIFRoZSBsZW5ndGggd3JpdHRlbiBieSBvdXQoKSB3aWxsIGJlIGF0IG1vc3QgdGhlIHdpbmRvdyBzaXplLiAgQW55IG5vbi16ZXJvCi0gICBhbW91bnQgb2YgaW5wdXQgbWF5IGJlIHByb3ZpZGVkIGJ5IGluKCkuCi0KLSAgICAgRm9yIGNvbnZlbmllbmNlLCBpbmZsYXRlQmFjaygpIGNhbiBiZSBwcm92aWRlZCBpbnB1dCBvbiB0aGUgZmlyc3QgY2FsbCBieQotICAgc2V0dGluZyBzdHJtLT5uZXh0X2luIGFuZCBzdHJtLT5hdmFpbF9pbi4gIElmIHRoYXQgaW5wdXQgaXMgZXhoYXVzdGVkLCB0aGVuCi0gICBpbigpIHdpbGwgYmUgY2FsbGVkLiAgVGhlcmVmb3JlIHN0cm0tPm5leHRfaW4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUKLSAgIGNhbGxpbmcgaW5mbGF0ZUJhY2soKS4gIElmIHN0cm0tPm5leHRfaW4gaXMgWl9OVUxMLCB0aGVuIGluKCkgd2lsbCBiZSBjYWxsZWQKLSAgIGltbWVkaWF0ZWx5IGZvciBpbnB1dC4gIElmIHN0cm0tPm5leHRfaW4gaXMgbm90IFpfTlVMTCwgdGhlbiBzdHJtLT5hdmFpbF9pbgotICAgbXVzdCBhbHNvIGJlIGluaXRpYWxpemVkLCBhbmQgdGhlbiBpZiBzdHJtLT5hdmFpbF9pbiBpcyBub3QgemVybywgaW5wdXQgd2lsbAotICAgaW5pdGlhbGx5IGJlIHRha2VuIGZyb20gc3RybS0+bmV4dF9pblswIC4uICBzdHJtLT5hdmFpbF9pbiAtIDFdLgotCi0gICAgIFRoZSBpbl9kZXNjIGFuZCBvdXRfZGVzYyBwYXJhbWV0ZXJzIG9mIGluZmxhdGVCYWNrKCkgaXMgcGFzc2VkIGFzIHRoZQotICAgZmlyc3QgcGFyYW1ldGVyIG9mIGluKCkgYW5kIG91dCgpIHJlc3BlY3RpdmVseSB3aGVuIHRoZXkgYXJlIGNhbGxlZC4gIFRoZXNlCi0gICBkZXNjcmlwdG9ycyBjYW4gYmUgb3B0aW9uYWxseSB1c2VkIHRvIHBhc3MgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGNhbGxlci0KLSAgIHN1cHBsaWVkIGluKCkgYW5kIG91dCgpIGZ1bmN0aW9ucyBuZWVkIHRvIGRvIHRoZWlyIGpvYi4KLQotICAgICBPbiByZXR1cm4sIGluZmxhdGVCYWNrKCkgd2lsbCBzZXQgc3RybS0+bmV4dF9pbiBhbmQgc3RybS0+YXZhaWxfaW4gdG8KLSAgIHBhc3MgYmFjayBhbnkgdW51c2VkIGlucHV0IHRoYXQgd2FzIHByb3ZpZGVkIGJ5IHRoZSBsYXN0IGluKCkgY2FsbC4gIFRoZQotICAgcmV0dXJuIHZhbHVlcyBvZiBpbmZsYXRlQmFjaygpIGNhbiBiZSBaX1NUUkVBTV9FTkQgb24gc3VjY2VzcywgWl9CVUZfRVJST1IKLSAgIGlmIGluKCkgb3Igb3V0KCkgcmV0dXJuZWQgYW4gZXJyb3IsIFpfREFUQV9FUlJPUiBpZiB0aGVyZSB3YXMgYSBmb3JtYXQgZXJyb3IKLSAgIGluIHRoZSBkZWZsYXRlIHN0cmVhbSAoaW4gd2hpY2ggY2FzZSBzdHJtLT5tc2cgaXMgc2V0IHRvIGluZGljYXRlIHRoZSBuYXR1cmUKLSAgIG9mIHRoZSBlcnJvciksIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gd2FzIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZC4KLSAgIEluIHRoZSBjYXNlIG9mIFpfQlVGX0VSUk9SLCBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3IgY2FuIGJlIGRpc3Rpbmd1aXNoZWQKLSAgIHVzaW5nIHN0cm0tPm5leHRfaW4gd2hpY2ggd2lsbCBiZSBaX05VTEwgb25seSBpZiBpbigpIHJldHVybmVkIGFuIGVycm9yLiAgSWYKLSAgIHN0cm0tPm5leHRfaW4gaXMgbm90IFpfTlVMTCwgdGhlbiB0aGUgWl9CVUZfRVJST1Igd2FzIGR1ZSB0byBvdXQoKSByZXR1cm5pbmcKLSAgIG5vbi16ZXJvLiAgKGluKCkgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGJlZm9yZSBvdXQoKSwgc28gc3RybS0+bmV4dF9pbiBpcwotICAgYXNzdXJlZCB0byBiZSBkZWZpbmVkIGlmIG91dCgpIHJldHVybnMgbm9uLXplcm8uKSBOb3RlIHRoYXQgaW5mbGF0ZUJhY2soKQotICAgY2Fubm90IHJldHVybiBaX09LLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0VuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKLS8qCi0gICAgIEFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IGluZmxhdGVCYWNrSW5pdCgpIGlzIGZyZWVkLgotCi0gICAgIGluZmxhdGVCYWNrRW5kKCkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0KLSAgIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCi0qLwotCi1aRVhURVJOIHVMb25nIFpFWFBPUlQgemxpYkNvbXBpbGVGbGFncyBPRigodm9pZCkpOwotLyogUmV0dXJuIGZsYWdzIGluZGljYXRpbmcgY29tcGlsZS10aW1lIG9wdGlvbnMuCi0KLSAgICBUeXBlIHNpemVzLCB0d28gYml0cyBlYWNoLCAwMCA9IDE2IGJpdHMsIDAxID0gMzIsIDEwID0gNjQsIDExID0gb3RoZXI6Ci0gICAgIDEuMDogc2l6ZSBvZiB1SW50Ci0gICAgIDMuMjogc2l6ZSBvZiB1TG9uZwotICAgICA1LjQ6IHNpemUgb2Ygdm9pZHBmIChwb2ludGVyKQotICAgICA3LjY6IHNpemUgb2Ygel9vZmZfdAotCi0gICAgQ29tcGlsZXIsIGFzc2VtYmxlciwgYW5kIGRlYnVnIG9wdGlvbnM6Ci0gICAgIDg6IERFQlVHCi0gICAgIDk6IEFTTVYgb3IgQVNNSU5GIC0tIHVzZSBBU00gY29kZQotICAgICAxMDogWkxJQl9XSU5BUEkgLS0gZXhwb3J0ZWQgZnVuY3Rpb25zIHVzZSB0aGUgV0lOQVBJIGNhbGxpbmcgY29udmVudGlvbgotICAgICAxMTogMCAocmVzZXJ2ZWQpCi0KLSAgICBPbmUtdGltZSB0YWJsZSBidWlsZGluZyAoc21hbGxlciBjb2RlLCBidXQgbm90IHRocmVhZC1zYWZlIGlmIHRydWUpOgotICAgICAxMjogQlVJTERGSVhFRCAtLSBidWlsZCBzdGF0aWMgYmxvY2sgZGVjb2RpbmcgdGFibGVzIHdoZW4gbmVlZGVkCi0gICAgIDEzOiBEWU5BTUlDX0NSQ19UQUJMRSAtLSBidWlsZCBDUkMgY2FsY3VsYXRpb24gdGFibGVzIHdoZW4gbmVlZGVkCi0gICAgIDE0LDE1OiAwIChyZXNlcnZlZCkKLQotICAgIExpYnJhcnkgY29udGVudCAoaW5kaWNhdGVzIG1pc3NpbmcgZnVuY3Rpb25hbGl0eSk6Ci0gICAgIDE2OiBOT19HWkNPTVBSRVNTIC0tIGd6KiBmdW5jdGlvbnMgY2Fubm90IGNvbXByZXNzICh0byBhdm9pZCBsaW5raW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmxhdGUgY29kZSB3aGVuIG5vdCBuZWVkZWQpCi0gICAgIDE3OiBOT19HWklQIC0tIGRlZmxhdGUgY2FuJ3Qgd3JpdGUgZ3ppcCBzdHJlYW1zLCBhbmQgaW5mbGF0ZSBjYW4ndCBkZXRlY3QKLSAgICAgICAgICAgICAgICAgICAgYW5kIGRlY29kZSBnemlwIHN0cmVhbXMgKHRvIGF2b2lkIGxpbmtpbmcgY3JjIGNvZGUpCi0gICAgIDE4LTE5OiAwIChyZXNlcnZlZCkKLQotICAgIE9wZXJhdGlvbiB2YXJpYXRpb25zIChjaGFuZ2VzIGluIGxpYnJhcnkgZnVuY3Rpb25hbGl0eSk6Ci0gICAgIDIwOiBQS1pJUF9CVUdfV09SS0FST1VORCAtLSBzbGlnaHRseSBtb3JlIHBlcm1pc3NpdmUgaW5mbGF0ZQotICAgICAyMTogRkFTVEVTVCAtLSBkZWZsYXRlIGFsZ29yaXRobSB3aXRoIG9ubHkgb25lLCBsb3dlc3QgY29tcHJlc3Npb24gbGV2ZWwKLSAgICAgMjIsMjM6IDAgKHJlc2VydmVkKQotCi0gICAgVGhlIHNwcmludGYgdmFyaWFudCB1c2VkIGJ5IGd6cHJpbnRmICh6ZXJvIGlzIGJlc3QpOgotICAgICAyNDogMCA9IHZzKiwgMSA9IHMqIC0tIDEgbWVhbnMgbGltaXRlZCB0byAyMCBhcmd1bWVudHMgYWZ0ZXIgdGhlIGZvcm1hdAotICAgICAyNTogMCA9ICpucHJpbnRmLCAxID0gKnByaW50ZiAtLSAxIG1lYW5zIGd6cHJpbnRmKCkgbm90IHNlY3VyZSEKLSAgICAgMjY6IDAgPSByZXR1cm5zIHZhbHVlLCAxID0gdm9pZCAtLSAxIG1lYW5zIGluZmVycmVkIHN0cmluZyBsZW5ndGggcmV0dXJuZWQKLQotICAgIFJlbWFpbmRlcjoKLSAgICAgMjctMzE6IDAgKHJlc2VydmVkKQotICovCi0KLSNpZm5kZWYgWl9TT0xPCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHV0aWxpdHkgZnVuY3Rpb25zICovCi0KLS8qCi0gICAgIFRoZSBmb2xsb3dpbmcgdXRpbGl0eSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUgYmFzaWMKLSAgIHN0cmVhbS1vcmllbnRlZCBmdW5jdGlvbnMuICBUbyBzaW1wbGlmeSB0aGUgaW50ZXJmYWNlLCBzb21lIGRlZmF1bHQgb3B0aW9ucwotICAgYXJlIGFzc3VtZWQgKGNvbXByZXNzaW9uIGxldmVsIGFuZCBtZW1vcnkgdXNhZ2UsIHN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0aW9uCi0gICBmdW5jdGlvbnMpLiAgVGhlIHNvdXJjZSBjb2RlIG9mIHRoZXNlIHV0aWxpdHkgZnVuY3Rpb25zIGNhbiBiZSBtb2RpZmllZCBpZgotICAgeW91IG5lZWQgc3BlY2lhbCBvcHRpb25zLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBjb21wcmVzcyBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuKSk7Ci0vKgotICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIHNvdXJjZUxlbiBpcwotICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAgVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwgc2l6ZQotICAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKLSAgIGNvbXByZXNzQm91bmQoc291cmNlTGVuKS4gIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlCi0gICBjb21wcmVzc2VkIGJ1ZmZlci4KLQotICAgICBjb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAotICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0Ci0gICBidWZmZXIuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGNvbXByZXNzMiBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpKTsKLS8qCi0gICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgVGhlIGxldmVsCi0gICBwYXJhbWV0ZXIgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gZGVmbGF0ZUluaXQuICBzb3VyY2VMZW4gaXMgdGhlIGJ5dGUKLSAgIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlCi0gICBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgdGhlIHZhbHVlIHJldHVybmVkIGJ5Ci0gICBjb21wcmVzc0JvdW5kKHNvdXJjZUxlbikuICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZQotICAgY29tcHJlc3NlZCBidWZmZXIuCi0KLSAgICAgY29tcHJlc3MyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyLAotICAgWl9TVFJFQU1fRVJST1IgaWYgdGhlIGxldmVsIHBhcmFtZXRlciBpcyBpbnZhbGlkLgotKi8KLQotWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNvbXByZXNzQm91bmQgT0YoKHVMb25nIHNvdXJjZUxlbikpOwotLyoKLSAgICAgY29tcHJlc3NCb3VuZCgpIHJldHVybnMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNvbXByZXNzZWQgc2l6ZSBhZnRlcgotICAgY29tcHJlc3MoKSBvciBjb21wcmVzczIoKSBvbiBzb3VyY2VMZW4gYnl0ZXMuICBJdCB3b3VsZCBiZSB1c2VkIGJlZm9yZSBhCi0gICBjb21wcmVzcygpIG9yIGNvbXByZXNzMigpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgdW5jb21wcmVzcyBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pKTsKLS8qCi0gICAgIERlY29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKLSAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsIHNpemUKLSAgIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGVudGlyZQotICAgdW5jb21wcmVzc2VkIGRhdGEuICAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG11c3QgaGF2ZSBiZWVuIHNhdmVkCi0gICBwcmV2aW91c2x5IGJ5IHRoZSBjb21wcmVzc29yIGFuZCB0cmFuc21pdHRlZCB0byB0aGUgZGVjb21wcmVzc29yIGJ5IHNvbWUKLSAgIG1lY2hhbmlzbSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGNvbXByZXNzaW9uIGxpYnJhcnkuKSBVcG9uIGV4aXQsIGRlc3RMZW4KLSAgIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGJ1ZmZlci4KLQotICAgICB1bmNvbXByZXNzIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90Ci0gICBlbm91Z2ggbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQKLSAgIGJ1ZmZlciwgb3IgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcyBjb3JydXB0ZWQgb3IgaW5jb21wbGV0ZS4gIEluCi0gICB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20sIHVuY29tcHJlc3MoKSB3aWxsIGZpbGwgdGhlIG91dHB1dAotICAgYnVmZmVyIHdpdGggdGhlIHVuY29tcHJlc3NlZCBkYXRhIHVwIHRvIHRoYXQgcG9pbnQuCi0qLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBnemlwIGZpbGUgYWNjZXNzIGZ1bmN0aW9ucyAqLwotCi0vKgotICAgICBUaGlzIGxpYnJhcnkgc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdCB3aXRoCi0gICBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvLCB1c2luZyB0aGUgZnVuY3Rpb25zIHRoYXQgc3RhcnQgd2l0aAotICAgImd6Ii4gIFRoZSBnemlwIGZvcm1hdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgemxpYiBmb3JtYXQuICBnemlwIGlzIGEgZ3ppcAotICAgd3JhcHBlciwgZG9jdW1lbnRlZCBpbiBSRkMgMTk1Miwgd3JhcHBlZCBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbS4KLSovCi0KLXR5cGVkZWYgc3RydWN0IGd6RmlsZV9zICpnekZpbGU7ICAgIC8qIHNlbWktb3BhcXVlIGd6aXAgZmlsZSBkZXNjcmlwdG9yICovCi0KLS8qCi1aRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6b3BlbiBPRigoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSkpOwotCi0gICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuICBUaGUgbW9kZSBwYXJhbWV0ZXIgaXMgYXMKLSAgIGluIGZvcGVuICgicmIiIG9yICJ3YiIpIGJ1dCBjYW4gYWxzbyBpbmNsdWRlIGEgY29tcHJlc3Npb24gbGV2ZWwgKCJ3YjkiKSBvcgotICAgYSBzdHJhdGVneTogJ2YnIGZvciBmaWx0ZXJlZCBkYXRhIGFzIGluICJ3YjZmIiwgJ2gnIGZvciBIdWZmbWFuLW9ubHkKLSAgIGNvbXByZXNzaW9uIGFzIGluICJ3YjFoIiwgJ1InIGZvciBydW4tbGVuZ3RoIGVuY29kaW5nIGFzIGluICJ3YjFSIiwgb3IgJ0YnCi0gICBmb3IgZml4ZWQgY29kZSBjb21wcmVzc2lvbiBhcyBpbiAid2I5RiIuICAoU2VlIHRoZSBkZXNjcmlwdGlvbiBvZgotICAgZGVmbGF0ZUluaXQyIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJhdGVneSBwYXJhbWV0ZXIuKSAgJ1QnIHdpbGwKLSAgIHJlcXVlc3QgdHJhbnNwYXJlbnQgd3JpdGluZyBvciBhcHBlbmRpbmcgd2l0aCBubyBjb21wcmVzc2lvbiBhbmQgbm90IHVzaW5nCi0gICB0aGUgZ3ppcCBmb3JtYXQuCi0KLSAgICAgImEiIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgInciIHRvIHJlcXVlc3QgdGhhdCB0aGUgZ3ppcCBzdHJlYW0gdGhhdCB3aWxsCi0gICBiZSB3cml0dGVuIGJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlLiAgIisiIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLCBzaW5jZQotICAgcmVhZGluZyBhbmQgd3JpdGluZyB0byB0aGUgc2FtZSBnemlwIGZpbGUgaXMgbm90IHN1cHBvcnRlZC4gIFRoZSBhZGRpdGlvbiBvZgotICAgIngiIHdoZW4gd3JpdGluZyB3aWxsIGNyZWF0ZSB0aGUgZmlsZSBleGNsdXNpdmVseSwgd2hpY2ggZmFpbHMgaWYgdGhlIGZpbGUKLSAgIGFscmVhZHkgZXhpc3RzLiAgT24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgaXQsIHRoZSBhZGRpdGlvbiBvZiAiZSIgd2hlbgotICAgcmVhZGluZyBvciB3cml0aW5nIHdpbGwgc2V0IHRoZSBmbGFnIHRvIGNsb3NlIHRoZSBmaWxlIG9uIGFuIGV4ZWN2ZSgpIGNhbGwuCi0KLSAgICAgVGhlc2UgZnVuY3Rpb25zLCBhcyB3ZWxsIGFzIGd6aXAsIHdpbGwgcmVhZCBhbmQgZGVjb2RlIGEgc2VxdWVuY2Ugb2YgZ3ppcAotICAgc3RyZWFtcyBpbiBhIGZpbGUuICBUaGUgYXBwZW5kIGZ1bmN0aW9uIG9mIGd6b3BlbigpIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZQotICAgc3VjaCBhIGZpbGUuICAoQWxzbyBzZWUgZ3pmbHVzaCgpIGZvciBhbm90aGVyIHdheSB0byBkbyB0aGlzLikgIFdoZW4KLSAgIGFwcGVuZGluZywgZ3pvcGVuIGRvZXMgbm90IHRlc3Qgd2hldGhlciB0aGUgZmlsZSBiZWdpbnMgd2l0aCBhIGd6aXAgc3RyZWFtLAotICAgbm9yIGRvZXMgaXQgbG9vayBmb3IgdGhlIGVuZCBvZiB0aGUgZ3ppcCBzdHJlYW1zIHRvIGJlZ2luIGFwcGVuZGluZy4gIGd6b3BlbgotICAgd2lsbCBzaW1wbHkgYXBwZW5kIGEgZ3ppcCBzdHJlYW0gdG8gdGhlIGV4aXN0aW5nIGZpbGUuCi0KLSAgICAgZ3pvcGVuIGNhbiBiZSB1c2VkIHRvIHJlYWQgYSBmaWxlIHdoaWNoIGlzIG5vdCBpbiBnemlwIGZvcm1hdDsgaW4gdGhpcwotICAgY2FzZSBnenJlYWQgd2lsbCBkaXJlY3RseSByZWFkIGZyb20gdGhlIGZpbGUgd2l0aG91dCBkZWNvbXByZXNzaW9uLiAgV2hlbgotICAgcmVhZGluZywgdGhpcyB3aWxsIGJlIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkgYnkgbG9va2luZyBmb3IgdGhlIG1hZ2ljIHR3by0KLSAgIGJ5dGUgZ3ppcCBoZWFkZXIuCi0KLSAgICAgZ3pvcGVuIHJldHVybnMgTlVMTCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkLCBpZiB0aGVyZSB3YXMKLSAgIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGd6RmlsZSBzdGF0ZSwgb3IgaWYgYW4gaW52YWxpZCBtb2RlIHdhcwotICAgc3BlY2lmaWVkIChhbiAncicsICd3Jywgb3IgJ2EnIHdhcyBub3QgcHJvdmlkZWQsIG9yICcrJyB3YXMgcHJvdmlkZWQpLgotICAgZXJybm8gY2FuIGJlIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZWFzb24gZ3pvcGVuIGZhaWxlZCB3YXMgdGhhdCB0aGUKLSAgIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZC4KLSovCi0KLVpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pkb3BlbiBPRigoaW50IGZkLCBjb25zdCBjaGFyICptb2RlKSk7Ci0vKgotICAgICBnemRvcGVuIGFzc29jaWF0ZXMgYSBnekZpbGUgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiAgRmlsZSBkZXNjcmlwdG9ycwotICAgYXJlIG9idGFpbmVkIGZyb20gY2FsbHMgbGlrZSBvcGVuLCBkdXAsIGNyZWF0LCBwaXBlIG9yIGZpbGVubyAoaWYgdGhlIGZpbGUKLSAgIGhhcyBiZWVuIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggZm9wZW4pLiAgVGhlIG1vZGUgcGFyYW1ldGVyIGlzIGFzIGluIGd6b3Blbi4KLQotICAgICBUaGUgbmV4dCBjYWxsIG9mIGd6Y2xvc2Ugb24gdGhlIHJldHVybmVkIGd6RmlsZSB3aWxsIGFsc28gY2xvc2UgdGhlIGZpbGUKLSAgIGRlc2NyaXB0b3IgZmQsIGp1c3QgbGlrZSBmY2xvc2UoZmRvcGVuKGZkLCBtb2RlKSkgY2xvc2VzIHRoZSBmaWxlIGRlc2NyaXB0b3IKLSAgIGZkLiAgSWYgeW91IHdhbnQgdG8ga2VlcCBmZCBvcGVuLCB1c2UgZmQgPSBkdXAoZmRfa2VlcCk7IGd6ID0gZ3pkb3BlbihmZCwKLSAgIG1vZGUpOy4gIFRoZSBkdXBsaWNhdGVkIGRlc2NyaXB0b3Igc2hvdWxkIGJlIHNhdmVkIHRvIGF2b2lkIGEgbGVhaywgc2luY2UKLSAgIGd6ZG9wZW4gZG9lcyBub3QgY2xvc2UgZmQgaWYgaXQgZmFpbHMuICBJZiB5b3UgYXJlIHVzaW5nIGZpbGVubygpIHRvIGdldCB0aGUKLSAgIGZpbGUgZGVzY3JpcHRvciBmcm9tIGEgRklMRSAqLCB0aGVuIHlvdSB3aWxsIGhhdmUgdG8gdXNlIGR1cCgpIHRvIGF2b2lkCi0gICBkb3VibGUtY2xvc2UoKWluZyB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgQm90aCBnemNsb3NlKCkgYW5kIGZjbG9zZSgpIHdpbGwKLSAgIGNsb3NlIHRoZSBhc3NvY2lhdGVkIGZpbGUgZGVzY3JpcHRvciwgc28gdGhleSBuZWVkIHRvIGhhdmUgZGlmZmVyZW50IGZpbGUKLSAgIGRlc2NyaXB0b3JzLgotCi0gICAgIGd6ZG9wZW4gcmV0dXJucyBOVUxMIGlmIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZQotICAgZ3pGaWxlIHN0YXRlLCBpZiBhbiBpbnZhbGlkIG1vZGUgd2FzIHNwZWNpZmllZCAoYW4gJ3InLCAndycsIG9yICdhJyB3YXMgbm90Ci0gICBwcm92aWRlZCwgb3IgJysnIHdhcyBwcm92aWRlZCksIG9yIGlmIGZkIGlzIC0xLiAgVGhlIGZpbGUgZGVzY3JpcHRvciBpcyBub3QKLSAgIHVzZWQgdW50aWwgdGhlIG5leHQgZ3oqIHJlYWQsIHdyaXRlLCBzZWVrLCBvciBjbG9zZSBvcGVyYXRpb24sIHNvIGd6ZG9wZW4KLSAgIHdpbGwgbm90IGRldGVjdCBpZiBmZCBpcyBpbnZhbGlkICh1bmxlc3MgZmQgaXMgLTEpLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBnemJ1ZmZlciBPRigoZ3pGaWxlIGZpbGUsIHVuc2lnbmVkIHNpemUpKTsKLS8qCi0gICAgIFNldCB0aGUgaW50ZXJuYWwgYnVmZmVyIHNpemUgdXNlZCBieSB0aGlzIGxpYnJhcnkncyBmdW5jdGlvbnMuICBUaGUKLSAgIGRlZmF1bHQgYnVmZmVyIHNpemUgaXMgODE5MiBieXRlcy4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIKLSAgIGd6b3BlbigpIG9yIGd6ZG9wZW4oKSwgYW5kIGJlZm9yZSBhbnkgb3RoZXIgY2FsbHMgdGhhdCByZWFkIG9yIHdyaXRlIHRoZQotICAgZmlsZS4gIFRoZSBidWZmZXIgbWVtb3J5IGFsbG9jYXRpb24gaXMgYWx3YXlzIGRlZmVycmVkIHRvIHRoZSBmaXJzdCByZWFkIG9yCi0gICB3cml0ZS4gIFR3byBidWZmZXJzIGFyZSBhbGxvY2F0ZWQsIGVpdGhlciBib3RoIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSB3aGVuCi0gICB3cml0aW5nLCBvciBvbmUgb2YgdGhlIHNwZWNpZmllZCBzaXplIGFuZCB0aGUgb3RoZXIgdHdpY2UgdGhhdCBzaXplIHdoZW4KLSAgIHJlYWRpbmcuICBBIGxhcmdlciBidWZmZXIgc2l6ZSBvZiwgZm9yIGV4YW1wbGUsIDY0SyBvciAxMjhLIGJ5dGVzIHdpbGwKLSAgIG5vdGljZWFibHkgaW5jcmVhc2UgdGhlIHNwZWVkIG9mIGRlY29tcHJlc3Npb24gKHJlYWRpbmcpLgotCi0gICAgIFRoZSBuZXcgYnVmZmVyIHNpemUgYWxzbyBhZmZlY3RzIHRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgZ3pwcmludGYoKS4KLQotICAgICBnemJ1ZmZlcigpIHJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLCBzdWNoIGFzIGJlaW5nIGNhbGxlZAotICAgdG9vIGxhdGUuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGd6c2V0cGFyYW1zIE9GKChnekZpbGUgZmlsZSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpKTsKLS8qCi0gICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgb3Igc3RyYXRlZ3kuICBTZWUgdGhlIGRlc2NyaXB0aW9uCi0gICBvZiBkZWZsYXRlSW5pdDIgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMuCi0KLSAgICAgZ3pzZXRwYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBmaWxlIHdhcyBub3QKLSAgIG9wZW5lZCBmb3Igd3JpdGluZy4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZ3pyZWFkIE9GKChnekZpbGUgZmlsZSwgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pKTsKLS8qCi0gICAgIFJlYWRzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gIElmCi0gICB0aGUgaW5wdXQgZmlsZSBpcyBub3QgaW4gZ3ppcCBmb3JtYXQsIGd6cmVhZCBjb3BpZXMgdGhlIGdpdmVuIG51bWJlciBvZgotICAgYnl0ZXMgaW50byB0aGUgYnVmZmVyIGRpcmVjdGx5IGZyb20gdGhlIGZpbGUuCi0KLSAgICAgQWZ0ZXIgcmVhY2hpbmcgdGhlIGVuZCBvZiBhIGd6aXAgc3RyZWFtIGluIHRoZSBpbnB1dCwgZ3pyZWFkIHdpbGwgY29udGludWUKLSAgIHRvIHJlYWQsIGxvb2tpbmcgZm9yIGFub3RoZXIgZ3ppcCBzdHJlYW0uICBBbnkgbnVtYmVyIG9mIGd6aXAgc3RyZWFtcyBtYXkgYmUKLSAgIGNvbmNhdGVuYXRlZCBpbiB0aGUgaW5wdXQgZmlsZSwgYW5kIHdpbGwgYWxsIGJlIGRlY29tcHJlc3NlZCBieSBnenJlYWQoKS4KLSAgIElmIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgZ3ppcCBzdHJlYW0gaXMgZW5jb3VudGVyZWQgYWZ0ZXIgYSBnemlwIHN0cmVhbSwKLSAgIHRoYXQgcmVtYWluaW5nIHRyYWlsaW5nIGdhcmJhZ2UgaXMgaWdub3JlZCAoYW5kIG5vIGVycm9yIGlzIHJldHVybmVkKS4KLQotICAgICBnenJlYWQgY2FuIGJlIHVzZWQgdG8gcmVhZCBhIGd6aXAgZmlsZSB0aGF0IGlzIGJlaW5nIGNvbmN1cnJlbnRseSB3cml0dGVuLgotICAgVXBvbiByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBpbnB1dCwgZ3pyZWFkIHdpbGwgcmV0dXJuIHdpdGggdGhlIGF2YWlsYWJsZQotICAgZGF0YS4gIElmIHRoZSBlcnJvciBjb2RlIHJldHVybmVkIGJ5IGd6ZXJyb3IgaXMgWl9PSyBvciBaX0JVRl9FUlJPUiwgdGhlbgotICAgZ3pjbGVhcmVyciBjYW4gYmUgdXNlZCB0byBjbGVhciB0aGUgZW5kIG9mIGZpbGUgaW5kaWNhdG9yIGluIG9yZGVyIHRvIHBlcm1pdAotICAgZ3pyZWFkIHRvIGJlIHRyaWVkIGFnYWluLiAgWl9PSyBpbmRpY2F0ZXMgdGhhdCBhIGd6aXAgc3RyZWFtIHdhcyBjb21wbGV0ZWQKLSAgIG9uIHRoZSBsYXN0IGd6cmVhZC4gIFpfQlVGX0VSUk9SIGluZGljYXRlcyB0aGF0IHRoZSBpbnB1dCBmaWxlIGVuZGVkIGluIHRoZQotICAgbWlkZGxlIG9mIGEgZ3ppcCBzdHJlYW0uICBOb3RlIHRoYXQgZ3pyZWFkIGRvZXMgbm90IHJldHVybiAtMSBpbiB0aGUgZXZlbnQKLSAgIG9mIGFuIGluY29tcGxldGUgZ3ppcCBzdHJlYW0uICBUaGlzIGVycm9yIGlzIGRlZmVycmVkIHVudGlsIGd6Y2xvc2UoKSwgd2hpY2gKLSAgIHdpbGwgcmV0dXJuIFpfQlVGX0VSUk9SIGlmIHRoZSBsYXN0IGd6cmVhZCBlbmRlZCBpbiB0aGUgbWlkZGxlIG9mIGEgZ3ppcAotICAgc3RyZWFtLiAgQWx0ZXJuYXRpdmVseSwgZ3plcnJvciBjYW4gYmUgdXNlZCBiZWZvcmUgZ3pjbG9zZSB0byBkZXRlY3QgdGhpcwotICAgY2FzZS4KLQotICAgICBnenJlYWQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSByZWFkLCBsZXNzIHRoYW4KLSAgIGxlbiBmb3IgZW5kIG9mIGZpbGUsIG9yIC0xIGZvciBlcnJvci4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZ3p3cml0ZSBPRigoZ3pGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwYyBidWYsIHVuc2lnbmVkIGxlbikpOwotLyoKLSAgICAgV3JpdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KLSAgIGd6d3JpdGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyB3cml0dGVuIG9yIDAgaW4gY2FzZSBvZgotICAgZXJyb3IuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUVkEgZ3pwcmludGYgWl9BUkcoKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpOwotLyoKLSAgICAgQ29udmVydHMsIGZvcm1hdHMsIGFuZCB3cml0ZXMgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCi0gICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiAgZ3pwcmludGYgcmV0dXJucyB0aGUgbnVtYmVyIG9mCi0gICB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiwgb3IgMCBpbiBjYXNlIG9mIGVycm9yLiAgVGhlIG51bWJlciBvZgotICAgdW5jb21wcmVzc2VkIGJ5dGVzIHdyaXR0ZW4gaXMgbGltaXRlZCB0byA4MTkxLCBvciBvbmUgbGVzcyB0aGFuIHRoZSBidWZmZXIKLSAgIHNpemUgZ2l2ZW4gdG8gZ3pidWZmZXIoKS4gIFRoZSBjYWxsZXIgc2hvdWxkIGFzc3VyZSB0aGF0IHRoaXMgbGltaXQgaXMgbm90Ci0gICBleGNlZWRlZC4gIElmIGl0IGlzIGV4Y2VlZGVkLCB0aGVuIGd6cHJpbnRmKCkgd2lsbCByZXR1cm4gYW4gZXJyb3IgKDApIHdpdGgKLSAgIG5vdGhpbmcgd3JpdHRlbi4gIEluIHRoaXMgY2FzZSwgdGhlcmUgbWF5IGFsc28gYmUgYSBidWZmZXIgb3ZlcmZsb3cgd2l0aAotICAgdW5wcmVkaWN0YWJsZSBjb25zZXF1ZW5jZXMsIHdoaWNoIGlzIHBvc3NpYmxlIG9ubHkgaWYgemxpYiB3YXMgY29tcGlsZWQgd2l0aAotICAgdGhlIGluc2VjdXJlIGZ1bmN0aW9ucyBzcHJpbnRmKCkgb3IgdnNwcmludGYoKSBiZWNhdXNlIHRoZSBzZWN1cmUgc25wcmludGYoKQotICAgb3IgdnNucHJpbnRmKCkgZnVuY3Rpb25zIHdlcmUgbm90IGF2YWlsYWJsZS4gIFRoaXMgY2FuIGJlIGRldGVybWluZWQgdXNpbmcKLSAgIHpsaWJDb21waWxlRmxhZ3MoKS4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZ3pwdXRzIE9GKChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcykpOwotLyoKLSAgICAgV3JpdGVzIHRoZSBnaXZlbiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUsIGV4Y2x1ZGluZwotICAgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgotCi0gICAgIGd6cHV0cyByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgotKi8KLQotWkVYVEVSTiBjaGFyICogWkVYUE9SVCBnemdldHMgT0YoKGd6RmlsZSBmaWxlLCBjaGFyICpidWYsIGludCBsZW4pKTsKLS8qCi0gICAgIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSB1bnRpbCBsZW4tMSBjaGFyYWN0ZXJzIGFyZSByZWFkLCBvciBhCi0gICBuZXdsaW5lIGNoYXJhY3RlciBpcyByZWFkIGFuZCB0cmFuc2ZlcnJlZCB0byBidWYsIG9yIGFuIGVuZC1vZi1maWxlCi0gICBjb25kaXRpb24gaXMgZW5jb3VudGVyZWQuICBJZiBhbnkgY2hhcmFjdGVycyBhcmUgcmVhZCBvciBpZiBsZW4gPT0gMSwgdGhlCi0gICBzdHJpbmcgaXMgdGVybWluYXRlZCB3aXRoIGEgbnVsbCBjaGFyYWN0ZXIuICBJZiBubyBjaGFyYWN0ZXJzIGFyZSByZWFkIGR1ZQotICAgdG8gYW4gZW5kLW9mLWZpbGUgb3IgbGVuIDwgMSwgdGhlbiB0aGUgYnVmZmVyIGlzIGxlZnQgdW50b3VjaGVkLgotCi0gICAgIGd6Z2V0cyByZXR1cm5zIGJ1ZiB3aGljaCBpcyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcsIG9yIGl0IHJldHVybnMgTlVMTAotICAgZm9yIGVuZC1vZi1maWxlIG9yIGluIGNhc2Ugb2YgZXJyb3IuICBJZiB0aGVyZSB3YXMgYW4gZXJyb3IsIHRoZSBjb250ZW50cyBhdAotICAgYnVmIGFyZSBpbmRldGVybWluYXRlLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBnenB1dGMgT0YoKGd6RmlsZSBmaWxlLCBpbnQgYykpOwotLyoKLSAgICAgV3JpdGVzIGMsIGNvbnZlcnRlZCB0byBhbiB1bnNpZ25lZCBjaGFyLCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuICBnenB1dGMKLSAgIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGd6Z2V0YyBPRigoZ3pGaWxlIGZpbGUpKTsKLS8qCi0gICAgIFJlYWRzIG9uZSBieXRlIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gIGd6Z2V0YyByZXR1cm5zIHRoaXMgYnl0ZSBvciAtMQotICAgaW4gY2FzZSBvZiBlbmQgb2YgZmlsZSBvciBlcnJvci4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYSBtYWNybyBmb3Igc3BlZWQuCi0gICBBcyBzdWNoLCBpdCBkb2VzIG5vdCBkbyBhbGwgb2YgdGhlIGNoZWNraW5nIHRoZSBvdGhlciBmdW5jdGlvbnMgZG8uICBJLmUuCi0gICBpdCBkb2VzIG5vdCBjaGVjayB0byBzZWUgaWYgZmlsZSBpcyBOVUxMLCBub3Igd2hldGhlciB0aGUgc3RydWN0dXJlIGZpbGUKLSAgIHBvaW50cyB0byBoYXMgYmVlbiBjbG9iYmVyZWQgb3Igbm90LgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBnenVuZ2V0YyBPRigoaW50IGMsIGd6RmlsZSBmaWxlKSk7Ci0vKgotICAgICBQdXNoIG9uZSBjaGFyYWN0ZXIgYmFjayBvbnRvIHRoZSBzdHJlYW0gdG8gYmUgcmVhZCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICBvbiB0aGUgbmV4dCByZWFkLiAgQXQgbGVhc3Qgb25lIGNoYXJhY3RlciBvZiBwdXNoLWJhY2sgaXMgYWxsb3dlZC4KLSAgIGd6dW5nZXRjKCkgcmV0dXJucyB0aGUgY2hhcmFjdGVyIHB1c2hlZCwgb3IgLTEgb24gZmFpbHVyZS4gIGd6dW5nZXRjKCkgd2lsbAotICAgZmFpbCBpZiBjIGlzIC0xLCBhbmQgbWF5IGZhaWwgaWYgYSBjaGFyYWN0ZXIgaGFzIGJlZW4gcHVzaGVkIGJ1dCBub3QgcmVhZAotICAgeWV0LiAgSWYgZ3p1bmdldGMgaXMgdXNlZCBpbW1lZGlhdGVseSBhZnRlciBnem9wZW4gb3IgZ3pkb3BlbiwgYXQgbGVhc3QgdGhlCi0gICBvdXRwdXQgYnVmZmVyIHNpemUgb2YgcHVzaGVkIGNoYXJhY3RlcnMgaXMgYWxsb3dlZC4gIChTZWUgZ3pidWZmZXIgYWJvdmUuKQotICAgVGhlIHB1c2hlZCBjaGFyYWN0ZXIgd2lsbCBiZSBkaXNjYXJkZWQgaWYgdGhlIHN0cmVhbSBpcyByZXBvc2l0aW9uZWQgd2l0aAotICAgZ3pzZWVrKCkgb3IgZ3pyZXdpbmQoKS4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZ3pmbHVzaCBPRigoZ3pGaWxlIGZpbGUsIGludCBmbHVzaCkpOwotLyoKLSAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiAgVGhlIHBhcmFtZXRlciBmbHVzaAotICAgaXMgYXMgaW4gdGhlIGRlZmxhdGUoKSBmdW5jdGlvbi4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHpsaWIgZXJyb3IgbnVtYmVyCi0gICAoc2VlIGZ1bmN0aW9uIGd6ZXJyb3IgYmVsb3cpLiAgZ3pmbHVzaCBpcyBvbmx5IHBlcm1pdHRlZCB3aGVuIHdyaXRpbmcuCi0KLSAgICAgSWYgdGhlIGZsdXNoIHBhcmFtZXRlciBpcyBaX0ZJTklTSCwgdGhlIHJlbWFpbmluZyBkYXRhIGlzIHdyaXR0ZW4gYW5kIHRoZQotICAgZ3ppcCBzdHJlYW0gaXMgY29tcGxldGVkIGluIHRoZSBvdXRwdXQuICBJZiBnendyaXRlKCkgaXMgY2FsbGVkIGFnYWluLCBhIG5ldwotICAgZ3ppcCBzdHJlYW0gd2lsbCBiZSBzdGFydGVkIGluIHRoZSBvdXRwdXQuICBnenJlYWQoKSBpcyBhYmxlIHRvIHJlYWQgc3VjaAotICAgY29uY2F0ZW50ZWQgZ3ppcCBzdHJlYW1zLgotCi0gICAgIGd6Zmx1c2ggc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gc3RyaWN0bHkgbmVjZXNzYXJ5IGJlY2F1c2UgaXQgd2lsbAotICAgZGVncmFkZSBjb21wcmVzc2lvbiBpZiBjYWxsZWQgdG9vIG9mdGVuLgotKi8KLQotLyoKLVpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6c2VlayBPRigoZ3pGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSk7Ci0KLSAgICAgU2V0cyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZSBnaXZlbgotICAgY29tcHJlc3NlZCBmaWxlLiAgVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQotICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLiAgVGhlIHdoZW5jZSBwYXJhbWV0ZXIgaXMgZGVmaW5lZCBhcyBpbiBsc2VlaygyKTsKLSAgIHRoZSB2YWx1ZSBTRUVLX0VORCBpcyBub3Qgc3VwcG9ydGVkLgotCi0gICAgIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZywgdGhpcyBmdW5jdGlvbiBpcyBlbXVsYXRlZCBidXQgY2FuIGJlCi0gICBleHRyZW1lbHkgc2xvdy4gIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZywgb25seSBmb3J3YXJkIHNlZWtzIGFyZQotICAgc3VwcG9ydGVkOyBnenNlZWsgdGhlbiBjb21wcmVzc2VzIGEgc2VxdWVuY2Ugb2YgemVyb2VzIHVwIHRvIHRoZSBuZXcKLSAgIHN0YXJ0aW5nIHBvc2l0aW9uLgotCi0gICAgIGd6c2VlayByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2Zmc2V0IGxvY2F0aW9uIGFzIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20KLSAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IsIGluCi0gICBwYXJ0aWN1bGFyIGlmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZyBhbmQgdGhlIG5ldyBzdGFydGluZyBwb3NpdGlvbgotICAgd291bGQgYmUgYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnenJld2luZCBPRigoZ3pGaWxlIGZpbGUpKTsKLS8qCi0gICAgIFJld2luZHMgdGhlIGdpdmVuIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHJlYWRpbmcuCi0KLSAgICAgZ3pyZXdpbmQoZmlsZSkgaXMgZXF1aXZhbGVudCB0byAoaW50KWd6c2VlayhmaWxlLCAwTCwgU0VFS19TRVQpCi0qLwotCi0vKgotWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgICAgZ3p0ZWxsIE9GKChnekZpbGUgZmlsZSkpOwotCi0gICAgIFJldHVybnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUgZ2l2ZW4KLSAgIGNvbXByZXNzZWQgZmlsZS4gIFRoaXMgcG9zaXRpb24gcmVwcmVzZW50cyBhIG51bWJlciBvZiBieXRlcyBpbiB0aGUKLSAgIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbSwgYW5kIGlzIHplcm8gd2hlbiBzdGFydGluZywgZXZlbiBpZiBhcHBlbmRpbmcgb3IKLSAgIHJlYWRpbmcgYSBnemlwIHN0cmVhbSBmcm9tIHRoZSBtaWRkbGUgb2YgYSBmaWxlIHVzaW5nIGd6ZG9wZW4oKS4KLQotICAgICBnenRlbGwoZmlsZSkgaXMgZXF1aXZhbGVudCB0byBnenNlZWsoZmlsZSwgMEwsIFNFRUtfQ1VSKQotKi8KLQotLyoKLVpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6b2Zmc2V0IE9GKChnekZpbGUgZmlsZSkpOwotCi0gICAgIFJldHVybnMgdGhlIGN1cnJlbnQgb2Zmc2V0IGluIHRoZSBmaWxlIGJlaW5nIHJlYWQgb3Igd3JpdHRlbi4gIFRoaXMgb2Zmc2V0Ci0gICBpbmNsdWRlcyB0aGUgY291bnQgb2YgYnl0ZXMgdGhhdCBwcmVjZWRlIHRoZSBnemlwIHN0cmVhbSwgZm9yIGV4YW1wbGUgd2hlbgotICAgYXBwZW5kaW5nIG9yIHdoZW4gdXNpbmcgZ3pkb3BlbigpIGZvciByZWFkaW5nLiAgV2hlbiByZWFkaW5nLCB0aGUgb2Zmc2V0Ci0gICBkb2VzIG5vdCBpbmNsdWRlIGFzIHlldCB1bnVzZWQgYnVmZmVyZWQgaW5wdXQuICBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkCi0gICBmb3IgYSBwcm9ncmVzcyBpbmRpY2F0b3IuICBPbiBlcnJvciwgZ3pvZmZzZXQoKSByZXR1cm5zIC0xLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBnemVvZiBPRigoZ3pGaWxlIGZpbGUpKTsKLS8qCi0gICAgIFJldHVybnMgdHJ1ZSAoMSkgaWYgdGhlIGVuZC1vZi1maWxlIGluZGljYXRvciBoYXMgYmVlbiBzZXQgd2hpbGUgcmVhZGluZywKLSAgIGZhbHNlICgwKSBvdGhlcndpc2UuICBOb3RlIHRoYXQgdGhlIGVuZC1vZi1maWxlIGluZGljYXRvciBpcyBzZXQgb25seSBpZiB0aGUKLSAgIHJlYWQgdHJpZWQgdG8gZ28gcGFzdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCwgYnV0IGNhbWUgdXAgc2hvcnQuICBUaGVyZWZvcmUsCi0gICBqdXN0IGxpa2UgZmVvZigpLCBnemVvZigpIG1heSByZXR1cm4gZmFsc2UgZXZlbiBpZiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgdG8KLSAgIHJlYWQsIGluIHRoZSBldmVudCB0aGF0IHRoZSBsYXN0IHJlYWQgcmVxdWVzdCB3YXMgZm9yIHRoZSBleGFjdCBudW1iZXIgb2YKLSAgIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgd2lsbCBoYXBwZW4gaWYgdGhlIGlucHV0IGZpbGUgc2l6ZQotICAgaXMgYW4gZXhhY3QgbXVsdGlwbGUgb2YgdGhlIGJ1ZmZlciBzaXplLgotCi0gICAgIElmIGd6ZW9mKCkgcmV0dXJucyB0cnVlLCB0aGVuIHRoZSByZWFkIGZ1bmN0aW9ucyB3aWxsIHJldHVybiBubyBtb3JlIGRhdGEsCi0gICB1bmxlc3MgdGhlIGVuZC1vZi1maWxlIGluZGljYXRvciBpcyByZXNldCBieSBnemNsZWFyZXJyKCkgYW5kIHRoZSBpbnB1dCBmaWxlCi0gICBoYXMgZ3Jvd24gc2luY2UgdGhlIHByZXZpb3VzIGVuZCBvZiBmaWxlIHdhcyBkZXRlY3RlZC4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZ3pkaXJlY3QgT0YoKGd6RmlsZSBmaWxlKSk7Ci0vKgotICAgICBSZXR1cm5zIHRydWUgKDEpIGlmIGZpbGUgaXMgYmVpbmcgY29waWVkIGRpcmVjdGx5IHdoaWxlIHJlYWRpbmcsIG9yIGZhbHNlCi0gICAoMCkgaWYgZmlsZSBpcyBhIGd6aXAgc3RyZWFtIGJlaW5nIGRlY29tcHJlc3NlZC4KLQotICAgICBJZiB0aGUgaW5wdXQgZmlsZSBpcyBlbXB0eSwgZ3pkaXJlY3QoKSB3aWxsIHJldHVybiB0cnVlLCBzaW5jZSB0aGUgaW5wdXQKLSAgIGRvZXMgbm90IGNvbnRhaW4gYSBnemlwIHN0cmVhbS4KLQotICAgICBJZiBnemRpcmVjdCgpIGlzIHVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZ3pvcGVuKCkgb3IgZ3pkb3BlbigpIGl0IHdpbGwKLSAgIGNhdXNlIGJ1ZmZlcnMgdG8gYmUgYWxsb2NhdGVkIHRvIGFsbG93IHJlYWRpbmcgdGhlIGZpbGUgdG8gZGV0ZXJtaW5lIGlmIGl0Ci0gICBpcyBhIGd6aXAgZmlsZS4gIFRoZXJlZm9yZSBpZiBnemJ1ZmZlcigpIGlzIHVzZWQsIGl0IHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCi0gICBnemRpcmVjdCgpLgotCi0gICAgIFdoZW4gd3JpdGluZywgZ3pkaXJlY3QoKSByZXR1cm5zIHRydWUgKDEpIGlmIHRyYW5zcGFyZW50IHdyaXRpbmcgd2FzCi0gICByZXF1ZXN0ZWQgKCJ3VCIgZm9yIHRoZSBnem9wZW4oKSBtb2RlKSwgb3IgZmFsc2UgKDApIG90aGVyd2lzZS4gIChOb3RlOgotICAgZ3pkaXJlY3QoKSBpcyBub3QgbmVlZGVkIHdoZW4gd3JpdGluZy4gIFRyYW5zcGFyZW50IHdyaXRpbmcgbXVzdCBiZQotICAgZXhwbGljaXRseSByZXF1ZXN0ZWQsIHNvIHRoZSBhcHBsaWNhdGlvbiBhbHJlYWR5IGtub3dzIHRoZSBhbnN3ZXIuICBXaGVuCi0gICBsaW5raW5nIHN0YXRpY2FsbHksIHVzaW5nIGd6ZGlyZWN0KCkgd2lsbCBpbmNsdWRlIGFsbCBvZiB0aGUgemxpYiBjb2RlIGZvcgotICAgZ3ppcCBmaWxlIHJlYWRpbmcgYW5kIGRlY29tcHJlc3Npb24sIHdoaWNoIG1heSBub3QgYmUgZGVzaXJlZC4pCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUICAgIGd6Y2xvc2UgT0YoKGd6RmlsZSBmaWxlKSk7Ci0vKgotICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlIGFuZAotICAgZGVhbGxvY2F0ZXMgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4gIE5vdGUgdGhhdCBvbmNlIGZpbGUgaXMgY2xvc2VkLCB5b3UKLSAgIGNhbm5vdCBjYWxsIGd6ZXJyb3Igd2l0aCBmaWxlLCBzaW5jZSBpdHMgc3RydWN0dXJlcyBoYXZlIGJlZW4gZGVhbGxvY2F0ZWQuCi0gICBnemNsb3NlIG11c3Qgbm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBmaWxlLCBqdXN0IGFzIGZyZWUKLSAgIG11c3Qgbm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBhbGxvY2F0aW9uLgotCi0gICAgIGd6Y2xvc2Ugd2lsbCByZXR1cm4gWl9TVFJFQU1fRVJST1IgaWYgZmlsZSBpcyBub3QgdmFsaWQsIFpfRVJSTk8gb24gYQotICAgZmlsZSBvcGVyYXRpb24gZXJyb3IsIFpfTUVNX0VSUk9SIGlmIG91dCBvZiBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZQotICAgbGFzdCByZWFkIGVuZGVkIGluIHRoZSBtaWRkbGUgb2YgYSBnemlwIHN0cmVhbSwgb3IgWl9PSyBvbiBzdWNjZXNzLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBnemNsb3NlX3IgT0YoKGd6RmlsZSBmaWxlKSk7Ci1aRVhURVJOIGludCBaRVhQT1JUIGd6Y2xvc2VfdyBPRigoZ3pGaWxlIGZpbGUpKTsKLS8qCi0gICAgIFNhbWUgYXMgZ3pjbG9zZSgpLCBidXQgZ3pjbG9zZV9yKCkgaXMgb25seSBmb3IgdXNlIHdoZW4gcmVhZGluZywgYW5kCi0gICBnemNsb3NlX3coKSBpcyBvbmx5IGZvciB1c2Ugd2hlbiB3cml0aW5nIG9yIGFwcGVuZGluZy4gIFRoZSBhZHZhbnRhZ2UgdG8KLSAgIHVzaW5nIHRoZXNlIGluc3RlYWQgb2YgZ3pjbG9zZSgpIGlzIHRoYXQgdGhleSBhdm9pZCBsaW5raW5nIGluIHpsaWIKLSAgIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gY29kZSB0aGF0IGlzIG5vdCB1c2VkIHdoZW4gb25seSByZWFkaW5nIG9yIG9ubHkKLSAgIHdyaXRpbmcgcmVzcGVjdGl2ZWx5LiAgSWYgZ3pjbG9zZSgpIGlzIHVzZWQsIHRoZW4gYm90aCBjb21wcmVzc2lvbiBhbmQKLSAgIGRlY29tcHJlc3Npb24gY29kZSB3aWxsIGJlIGluY2x1ZGVkIHRoZSBhcHBsaWNhdGlvbiB3aGVuIGxpbmtpbmcgdG8gYSBzdGF0aWMKLSAgIHpsaWIgbGlicmFyeS4KLSovCi0KLVpFWFRFUk4gY29uc3QgY2hhciAqIFpFWFBPUlQgZ3plcnJvciBPRigoZ3pGaWxlIGZpbGUsIGludCAqZXJybnVtKSk7Ci0vKgotICAgICBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cnJlZCBvbiB0aGUgZ2l2ZW4KLSAgIGNvbXByZXNzZWQgZmlsZS4gIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuICBJZiBhbiBlcnJvciBvY2N1cnJlZAotICAgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBub3QgaW4gdGhlIGNvbXByZXNzaW9uIGxpYnJhcnksIGVycm51bSBpcyBzZXQgdG8KLSAgIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubyB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCi0KLSAgICAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc3RyaW5nLiAgRnV0dXJlIGNhbGxzIHRvCi0gICB0aGlzIGZ1bmN0aW9uIG1heSBpbnZhbGlkYXRlIHRoZSBwcmV2aW91c2x5IHJldHVybmVkIHN0cmluZy4gIElmIGZpbGUgaXMKLSAgIGNsb3NlZCwgdGhlbiB0aGUgc3RyaW5nIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgZ3plcnJvciB3aWxsIG5vIGxvbmdlciBiZQotICAgYXZhaWxhYmxlLgotCi0gICAgIGd6ZXJyb3IoKSBzaG91bGQgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBlcnJvcnMgZnJvbSBlbmQtb2YtZmlsZSBmb3IgdGhvc2UKLSAgIGZ1bmN0aW9ucyBhYm92ZSB0aGF0IGRvIG5vdCBkaXN0aW5ndWlzaCB0aG9zZSBjYXNlcyBpbiB0aGVpciByZXR1cm4gdmFsdWVzLgotKi8KLQotWkVYVEVSTiB2b2lkIFpFWFBPUlQgZ3pjbGVhcmVyciBPRigoZ3pGaWxlIGZpbGUpKTsKLS8qCi0gICAgIENsZWFycyB0aGUgZXJyb3IgYW5kIGVuZC1vZi1maWxlIGZsYWdzIGZvciBmaWxlLiAgVGhpcyBpcyBhbmFsb2dvdXMgdG8gdGhlCi0gICBjbGVhcmVycigpIGZ1bmN0aW9uIGluIHN0ZGlvLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNvbnRpbnVpbmcgdG8gcmVhZCBhIGd6aXAKLSAgIGZpbGUgdGhhdCBpcyBiZWluZyB3cml0dGVuIGNvbmN1cnJlbnRseS4KLSovCi0KLSNlbmRpZiAvKiAhWl9TT0xPICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrc3VtIGZ1bmN0aW9ucyAqLwotCi0vKgotICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCByZWxhdGVkIHRvIGNvbXByZXNzaW9uIGJ1dCBhcmUgZXhwb3J0ZWQKLSAgIGFueXdheSBiZWNhdXNlIHRoZXkgbWlnaHQgYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgY29tcHJlc3Npb24KLSAgIGxpYnJhcnkuCi0qLwotCi1aRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMiBPRigodUxvbmcgYWRsZXIsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7Ci0vKgotICAgICBVcGRhdGUgYSBydW5uaW5nIEFkbGVyLTMyIGNoZWNrc3VtIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kCi0gICByZXR1cm4gdGhlIHVwZGF0ZWQgY2hlY2tzdW0uICBJZiBidWYgaXMgWl9OVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlCi0gICByZXF1aXJlZCBpbml0aWFsIHZhbHVlIGZvciB0aGUgY2hlY2tzdW0uCi0KLSAgICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAotICAgbXVjaCBmYXN0ZXIuCi0KLSAgIFVzYWdlIGV4YW1wbGU6Ci0KLSAgICAgdUxvbmcgYWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOwotCi0gICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7Ci0gICAgICAgYWRsZXIgPSBhZGxlcjMyKGFkbGVyLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgIH0KLSAgICAgaWYgKGFkbGVyICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOwotKi8KLQotLyoKLVpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmUgT0YoKHVMb25nIGFkbGVyMSwgdUxvbmcgYWRsZXIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9vZmZfdCBsZW4yKSk7Ci0KLSAgICAgQ29tYmluZSB0d28gQWRsZXItMzIgY2hlY2tzdW1zIGludG8gb25lLiAgRm9yIHR3byBzZXF1ZW5jZXMgb2YgYnl0ZXMsIHNlcTEKLSAgIGFuZCBzZXEyIHdpdGggbGVuZ3RocyBsZW4xIGFuZCBsZW4yLCBBZGxlci0zMiBjaGVja3N1bXMgd2VyZSBjYWxjdWxhdGVkIGZvcgotICAgZWFjaCwgYWRsZXIxIGFuZCBhZGxlcjIuICBhZGxlcjMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZgotICAgc2VxMSBhbmQgc2VxMiBjb25jYXRlbmF0ZWQsIHJlcXVpcmluZyBvbmx5IGFkbGVyMSwgYWRsZXIyLCBhbmQgbGVuMi4gIE5vdGUKLSAgIHRoYXQgdGhlIHpfb2ZmX3QgdHlwZSAobGlrZSBvZmZfdCkgaXMgYSBzaWduZWQgaW50ZWdlci4gIElmIGxlbjIgaXMKLSAgIG5lZ2F0aXZlLCB0aGUgcmVzdWx0IGhhcyBubyBtZWFuaW5nIG9yIHV0aWxpdHkuCi0qLwotCi1aRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzIgICBPRigodUxvbmcgY3JjLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOwotLyoKLSAgICAgVXBkYXRlIGEgcnVubmluZyBDUkMtMzIgd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQgcmV0dXJuIHRoZQotICAgdXBkYXRlZCBDUkMtMzIuICBJZiBidWYgaXMgWl9OVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVpcmVkCi0gICBpbml0aWFsIHZhbHVlIGZvciB0aGUgY3JjLiAgUHJlLSBhbmQgcG9zdC1jb25kaXRpb25pbmcgKG9uZSdzIGNvbXBsZW1lbnQpIGlzCi0gICBwZXJmb3JtZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24gc28gaXQgc2hvdWxkbid0IGJlIGRvbmUgYnkgdGhlIGFwcGxpY2F0aW9uLgotCi0gICBVc2FnZSBleGFtcGxlOgotCi0gICAgIHVMb25nIGNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOwotCi0gICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7Ci0gICAgICAgY3JjID0gY3JjMzIoY3JjLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgIH0KLSAgICAgaWYgKGNyYyAhPSBvcmlnaW5hbF9jcmMpIGVycm9yKCk7Ci0qLwotCi0vKgotWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmUgT0YoKHVMb25nIGNyYzEsIHVMb25nIGNyYzIsIHpfb2ZmX3QgbGVuMikpOwotCi0gICAgIENvbWJpbmUgdHdvIENSQy0zMiBjaGVjayB2YWx1ZXMgaW50byBvbmUuICBGb3IgdHdvIHNlcXVlbmNlcyBvZiBieXRlcywKLSAgIHNlcTEgYW5kIHNlcTIgd2l0aCBsZW5ndGhzIGxlbjEgYW5kIGxlbjIsIENSQy0zMiBjaGVjayB2YWx1ZXMgd2VyZQotICAgY2FsY3VsYXRlZCBmb3IgZWFjaCwgY3JjMSBhbmQgY3JjMi4gIGNyYzMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBDUkMtMzIKLSAgIGNoZWNrIHZhbHVlIG9mIHNlcTEgYW5kIHNlcTIgY29uY2F0ZW5hdGVkLCByZXF1aXJpbmcgb25seSBjcmMxLCBjcmMyLCBhbmQKLSAgIGxlbjIuCi0qLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZhcmlvdXMgaGFja3MsIGRvbid0IGxvb2sgOikgKi8KLQotLyogZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGFyZSBtYWNyb3MgdG8gYWxsb3cgY2hlY2tpbmcgdGhlIHpsaWIgdmVyc2lvbgotICogYW5kIHRoZSBjb21waWxlcidzIHZpZXcgb2Ygel9zdHJlYW06Ci0gKi8KLVpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOwotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdF8gT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOwotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdDJfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50ICBsZXZlbCwgaW50ICBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dCaXRzLCBpbnQgbWVtTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJhdGVneSwgY29uc3QgY2hhciAqdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9zaXplKSk7Ci1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0Ml8gT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgIHdpbmRvd0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOwotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0luaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IHdpbmRvd0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1fc2l6ZSkpOwotI2RlZmluZSBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkgXAotICAgICAgICBkZWZsYXRlSW5pdF8oKHN0cm0pLCAobGV2ZWwpLCBaTElCX1ZFUlNJT04sIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSkKLSNkZWZpbmUgaW5mbGF0ZUluaXQoc3RybSkgXAotICAgICAgICBpbmZsYXRlSW5pdF8oKHN0cm0pLCBaTElCX1ZFUlNJT04sIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSkKLSNkZWZpbmUgZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkgXAotICAgICAgICBkZWZsYXRlSW5pdDJfKChzdHJtKSwobGV2ZWwpLChtZXRob2QpLCh3aW5kb3dCaXRzKSwobWVtTGV2ZWwpLFwKLSAgICAgICAgICAgICAgICAgICAgICAoc3RyYXRlZ3kpLCBaTElCX1ZFUlNJT04sIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSkKLSNkZWZpbmUgaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIFwKLSAgICAgICAgaW5mbGF0ZUluaXQyXygoc3RybSksICh3aW5kb3dCaXRzKSwgWkxJQl9WRVJTSU9OLCBcCi0gICAgICAgICAgICAgICAgICAgICAgKGludClzaXplb2Yoel9zdHJlYW0pKQotI2RlZmluZSBpbmZsYXRlQmFja0luaXQoc3RybSwgd2luZG93Qml0cywgd2luZG93KSBcCi0gICAgICAgIGluZmxhdGVCYWNrSW5pdF8oKHN0cm0pLCAod2luZG93Qml0cyksICh3aW5kb3cpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgWkxJQl9WRVJTSU9OLCAoaW50KXNpemVvZih6X3N0cmVhbSkpCi0KLSNpZm5kZWYgWl9TT0xPCi0KLS8qIGd6Z2V0YygpIG1hY3JvIGFuZCBpdHMgc3VwcG9ydGluZyBmdW5jdGlvbiBhbmQgZXhwb3NlZCBkYXRhIHN0cnVjdHVyZS4gIE5vdGUKLSAqIHRoYXQgdGhlIHJlYWwgaW50ZXJuYWwgc3RhdGUgaXMgbXVjaCBsYXJnZXIgdGhhbiB0aGUgZXhwb3NlZCBzdHJ1Y3R1cmUuCi0gKiBUaGlzIGFiYnJldmlhdGVkIHN0cnVjdHVyZSBleHBvc2VzIGp1c3QgZW5vdWdoIGZvciB0aGUgZ3pnZXRjKCkgbWFjcm8uICBUaGUKLSAqIHVzZXIgc2hvdWxkIG5vdCBtZXNzIHdpdGggdGhlc2UgZXhwb3NlZCBlbGVtZW50cywgc2luY2UgdGhlaXIgbmFtZXMgb3IKLSAqIGJlaGF2aW9yIGNvdWxkIGNoYW5nZSBpbiB0aGUgZnV0dXJlLCBwZXJoYXBzIGV2ZW4gY2FwcmljaW91c2x5LiAgVGhleSBjYW4KLSAqIG9ubHkgYmUgdXNlZCBieSB0aGUgZ3pnZXRjKCkgbWFjcm8uICBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4KLSAqLwotc3RydWN0IGd6RmlsZV9zIHsKLSAgICB1bnNpZ25lZCBoYXZlOwotICAgIHVuc2lnbmVkIGNoYXIgKm5leHQ7Ci0gICAgel9vZmY2NF90IHBvczsKLX07Ci1aRVhURVJOIGludCBaRVhQT1JUIGd6Z2V0Y18gT0YoKGd6RmlsZSBmaWxlKSk7ICAvKiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCi0jaWZkZWYgWl9QUkVGSVhfU0VUCi0jICB1bmRlZiB6X2d6Z2V0YwotIyAgZGVmaW5lIHpfZ3pnZXRjKGcpIFwKLSAgICAgICAgICAoKGcpLT5oYXZlID8gKChnKS0+aGF2ZS0tLCAoZyktPnBvcysrLCAqKChnKS0+bmV4dCkrKykgOiBnemdldGMoZykpCi0jZWxzZQotIyAgZGVmaW5lIGd6Z2V0YyhnKSBcCi0gICAgICAgICAgKChnKS0+aGF2ZSA/ICgoZyktPmhhdmUtLSwgKGcpLT5wb3MrKywgKigoZyktPm5leHQpKyspIDogZ3pnZXRjKGcpKQotI2VuZGlmCi0KLS8qIHByb3ZpZGUgNjQtYml0IG9mZnNldCBmdW5jdGlvbnMgaWYgX0xBUkdFRklMRTY0X1NPVVJDRSBkZWZpbmVkLCBhbmQvb3IKLSAqIGNoYW5nZSB0aGUgcmVndWxhciBmdW5jdGlvbnMgdG8gNjQgYml0cyBpZiBfRklMRV9PRkZTRVRfQklUUyBpcyA2NCAoaWYKLSAqIGJvdGggYXJlIHRydWUsIHRoZSBhcHBsaWNhdGlvbiBnZXRzIHRoZSAqNjQgZnVuY3Rpb25zLCBhbmQgdGhlIHJlZ3VsYXIKLSAqIGZ1bmN0aW9ucyBhcmUgY2hhbmdlZCB0byA2NCBiaXRzKSAtLSBpbiBjYXNlIHRoZXNlIGFyZSBzZXQgb24gc3lzdGVtcwotICogd2l0aG91dCBsYXJnZSBmaWxlIHN1cHBvcnQsIF9MRlM2NF9MQVJHRUZJTEUgbXVzdCBhbHNvIGJlIHRydWUKLSAqLwotI2lmZGVmIFpfTEFSR0U2NAotICAgWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnem9wZW42NCBPRigoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLSAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3pzZWVrNjQgT0YoKGd6RmlsZSwgel9vZmY2NF90LCBpbnQpKTsKLSAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3p0ZWxsNjQgT0YoKGd6RmlsZSkpOwotICAgWkVYVEVSTiB6X29mZjY0X3QgWkVYUE9SVCBnem9mZnNldDY0IE9GKChnekZpbGUpKTsKLSAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmU2NCBPRigodUxvbmcsIHVMb25nLCB6X29mZjY0X3QpKTsKLSAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmY2NF90KSk7Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFpMSUJfSU5URVJOQUwpICYmIGRlZmluZWQoWl9XQU5UNjQpCi0jICBpZmRlZiBaX1BSRUZJWF9TRVQKLSMgICAgZGVmaW5lIHpfZ3pvcGVuIHpfZ3pvcGVuNjQKLSMgICAgZGVmaW5lIHpfZ3pzZWVrIHpfZ3pzZWVrNjQKLSMgICAgZGVmaW5lIHpfZ3p0ZWxsIHpfZ3p0ZWxsNjQKLSMgICAgZGVmaW5lIHpfZ3pvZmZzZXQgel9nem9mZnNldDY0Ci0jICAgIGRlZmluZSB6X2FkbGVyMzJfY29tYmluZSB6X2FkbGVyMzJfY29tYmluZTY0Ci0jICAgIGRlZmluZSB6X2NyYzMyX2NvbWJpbmUgel9jcmMzMl9jb21iaW5lNjQKLSMgIGVsc2UKLSMgICAgZGVmaW5lIGd6b3BlbiBnem9wZW42NAotIyAgICBkZWZpbmUgZ3pzZWVrIGd6c2VlazY0Ci0jICAgIGRlZmluZSBnenRlbGwgZ3p0ZWxsNjQKLSMgICAgZGVmaW5lIGd6b2Zmc2V0IGd6b2Zmc2V0NjQKLSMgICAgZGVmaW5lIGFkbGVyMzJfY29tYmluZSBhZGxlcjMyX2NvbWJpbmU2NAotIyAgICBkZWZpbmUgY3JjMzJfY29tYmluZSBjcmMzMl9jb21iaW5lNjQKLSMgIGVuZGlmCi0jICBpZm5kZWYgWl9MQVJHRTY0Ci0gICAgIFpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuNjQgT0YoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0gICAgIFpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6c2VlazY0IE9GKChnekZpbGUsIHpfb2ZmX3QsIGludCkpOwotICAgICBaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCBnenRlbGw2NCBPRigoZ3pGaWxlKSk7Ci0gICAgIFpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6b2Zmc2V0NjQgT0YoKGd6RmlsZSkpOwotICAgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOwotICAgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZTY0IE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKLSMgIGVuZGlmCi0jZWxzZQotICAgWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnem9wZW4gT0YoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0gICBaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCBnenNlZWsgT0YoKGd6RmlsZSwgel9vZmZfdCwgaW50KSk7Ci0gICBaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCBnenRlbGwgT0YoKGd6RmlsZSkpOwotICAgWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgZ3pvZmZzZXQgT0YoKGd6RmlsZSkpOwotICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZSBPRigodUxvbmcsIHVMb25nLCB6X29mZl90KSk7Ci0gICBaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZSBPRigodUxvbmcsIHVMb25nLCB6X29mZl90KSk7Ci0jZW5kaWYKLQotI2Vsc2UgLyogWl9TT0xPICovCi0KLSAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmUgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOwotICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmUgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOwotCi0jZW5kaWYgLyogIVpfU09MTyAqLwotCi0vKiBoYWNrIGZvciBidWdneSBjb21waWxlcnMgKi8KLSNpZiAhZGVmaW5lZChaVVRJTF9IKSAmJiAhZGVmaW5lZChOT19EVU1NWV9ERUNMKQotICAgIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSB7aW50IGR1bW15O307Ci0jZW5kaWYKLQotLyogdW5kb2N1bWVudGVkIGZ1bmN0aW9ucyAqLwotWkVYVEVSTiBjb25zdCBjaGFyICAgKiBaRVhQT1JUIHpFcnJvciAgICAgICAgICAgT0YoKGludCkpOwotWkVYVEVSTiBpbnQgICAgICAgICAgICBaRVhQT1JUIGluZmxhdGVTeW5jUG9pbnQgT0YoKHpfc3RyZWFtcCkpOwotWkVYVEVSTiBjb25zdCB6X2NyY190IEZBUiAqIFpFWFBPUlQgZ2V0X2NyY190YWJsZSAgICBPRigodm9pZCkpOwotWkVYVEVSTiBpbnQgICAgICAgICAgICBaRVhQT1JUIGluZmxhdGVVbmRlcm1pbmUgT0YoKHpfc3RyZWFtcCwgaW50KSk7Ci1aRVhURVJOIGludCAgICAgICAgICAgIFpFWFBPUlQgaW5mbGF0ZVJlc2V0S2VlcCBPRigoel9zdHJlYW1wKSk7Ci1aRVhURVJOIGludCAgICAgICAgICAgIFpFWFBPUlQgZGVmbGF0ZVJlc2V0S2VlcCBPRigoel9zdHJlYW1wKSk7Ci0jaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFpfU09MTykKLVpFWFRFUk4gZ3pGaWxlICAgICAgICAgWkVYUE9SVCBnem9wZW5fdyBPRigoY29uc3Qgd2NoYXJfdCAqcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kZSkpOwotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBaTElCX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy96bGliL3psaWIubWFwIGIvc3JjL3psaWIvemxpYi5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MWY0MjAuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvemxpYi5tYXAKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi1aTElCXzEuMi4wIHsKLSAgZ2xvYmFsOgotICAgIGNvbXByZXNzQm91bmQ7Ci0gICAgZGVmbGF0ZUJvdW5kOwotICAgIGluZmxhdGVCYWNrOwotICAgIGluZmxhdGVCYWNrRW5kOwotICAgIGluZmxhdGVCYWNrSW5pdF87Ci0gICAgaW5mbGF0ZUNvcHk7Ci0gIGxvY2FsOgotICAgIGRlZmxhdGVfY29weXJpZ2h0OwotICAgIGluZmxhdGVfY29weXJpZ2h0OwotICAgIGluZmxhdGVfZmFzdDsKLSAgICBpbmZsYXRlX3RhYmxlOwotICAgIHpjYWxsb2M7Ci0gICAgemNmcmVlOwotICAgIHpfZXJybXNnOwotICAgIGd6X2Vycm9yOwotICAgIGd6X2ludG1heDsKLSAgICBfKjsKLX07Ci0KLVpMSUJfMS4yLjAuMiB7Ci0gICAgZ3pjbGVhcmVycjsKLSAgICBnenVuZ2V0YzsKLSAgICB6bGliQ29tcGlsZUZsYWdzOwotfSBaTElCXzEuMi4wOwotCi1aTElCXzEuMi4wLjggewotICAgIGRlZmxhdGVQcmltZTsKLX0gWkxJQl8xLjIuMC4yOwotCi1aTElCXzEuMi4yIHsKLSAgICBhZGxlcjMyX2NvbWJpbmU7Ci0gICAgY3JjMzJfY29tYmluZTsKLSAgICBkZWZsYXRlU2V0SGVhZGVyOwotICAgIGluZmxhdGVHZXRIZWFkZXI7Ci19IFpMSUJfMS4yLjAuODsKLQotWkxJQl8xLjIuMi4zIHsKLSAgICBkZWZsYXRlVHVuZTsKLSAgICBnemRpcmVjdDsKLX0gWkxJQl8xLjIuMjsKLQotWkxJQl8xLjIuMi40IHsKLSAgICBpbmZsYXRlUHJpbWU7Ci19IFpMSUJfMS4yLjIuMzsKLQotWkxJQl8xLjIuMy4zIHsKLSAgICBhZGxlcjMyX2NvbWJpbmU2NDsKLSAgICBjcmMzMl9jb21iaW5lNjQ7Ci0gICAgZ3pvcGVuNjQ7Ci0gICAgZ3pzZWVrNjQ7Ci0gICAgZ3p0ZWxsNjQ7Ci0gICAgaW5mbGF0ZVVuZGVybWluZTsKLX0gWkxJQl8xLjIuMi40OwotCi1aTElCXzEuMi4zLjQgewotICAgIGluZmxhdGVSZXNldDI7Ci0gICAgaW5mbGF0ZU1hcms7Ci19IFpMSUJfMS4yLjMuMzsKLQotWkxJQl8xLjIuMy41IHsKLSAgICBnemJ1ZmZlcjsKLSAgICBnem9mZnNldDsKLSAgICBnem9mZnNldDY0OwotICAgIGd6Y2xvc2VfcjsKLSAgICBnemNsb3NlX3c7Ci19IFpMSUJfMS4yLjMuNDsKLQotWkxJQl8xLjIuNS4xIHsKLSAgICBkZWZsYXRlUGVuZGluZzsKLX0gWkxJQl8xLjIuMy41OwotCi1aTElCXzEuMi41LjIgewotICAgIGRlZmxhdGVSZXNldEtlZXA7Ci0gICAgZ3pnZXRjXzsKLSAgICBpbmZsYXRlUmVzZXRLZWVwOwotfSBaTElCXzEuMi41LjE7CmRpZmYgLS1naXQgYS9zcmMvemxpYi96bGliLnBjLmNtYWtlaW4gYi9zcmMvemxpYi96bGliLnBjLmNtYWtlaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZTY0MjkuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvemxpYi5wYy5jbWFrZWluCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcHJlZml4PUBDTUFLRV9JTlNUQUxMX1BSRUZJWEAKLWV4ZWNfcHJlZml4PUBDTUFLRV9JTlNUQUxMX1BSRUZJWEAKLWxpYmRpcj1ASU5TVEFMTF9MSUJfRElSQAotc2hhcmVkbGliZGlyPUBJTlNUQUxMX0xJQl9ESVJACi1pbmNsdWRlZGlyPUBJTlNUQUxMX0lOQ19ESVJACi0KLU5hbWU6IHpsaWIKLURlc2NyaXB0aW9uOiB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKLVZlcnNpb246IEBWRVJTSU9OQAotCi1SZXF1aXJlczoKLUxpYnM6IC1MJHtsaWJkaXJ9IC1MJHtzaGFyZWRsaWJkaXJ9IC1segotQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL3NyYy96bGliL3psaWIucGMuaW4gYi9zcmMvemxpYi96bGliLnBjLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTVhY2Y5Li4wMDAwMDAwCi0tLSBhL3NyYy96bGliL3psaWIucGMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1wcmVmaXg9QHByZWZpeEAKLWV4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKLWxpYmRpcj1AbGliZGlyQAotc2hhcmVkbGliZGlyPUBzaGFyZWRsaWJkaXJACi1pbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAotCi1OYW1lOiB6bGliCi1EZXNjcmlwdGlvbjogemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5Ci1WZXJzaW9uOiBAVkVSU0lPTkAKLQotUmVxdWlyZXM6Ci1MaWJzOiAtTCR7bGliZGlyfSAtTCR7c2hhcmVkbGliZGlyfSAtbHoKLUNmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9zcmMvemxpYi96bGliMmFuc2kgYi9zcmMvemxpYi96bGliMmFuc2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1ZTNlMTYuLjAwMDAwMDAKLS0tIGEvc3JjL3psaWIvemxpYjJhbnNpCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLSMhL3Vzci9iaW4vcGVybAotCi0jIFRyYW5zZm9ybSBLJlIgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyBpbnRvIEFOU0kgZXF1aXZhbGVudC4KLSMKLSMgQXV0aG9yOiBQYXVsIE1hcnF1ZXNzCi0jIFZlcnNpb246IDEuMAotIyBEYXRlOiAzIE9jdG9iZXIgMjAwNgotCi0jIFRPRE8KLSMKLSMgQXN1bWVzIG5vIGZ1bmN0aW9uIHBvaW50ZXIgcGFyYW1ldGVycy4gdW5sZXNzIHRoZXkgYXJlIHR5cGVkZWZlZC4KLSMgQXNzdW1lcyBubyBsaXRlcmFsIHN0cmluZ3MgdGhhdCBsb29rIGxpa2UgZnVuY3Rpb24gZGVmaW5pdGlvbnMKLSMgQXNzdW1lcyBmdW5jdGlvbnMgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLQotdXNlIHN0cmljdDsKLXVzZSB3YXJuaW5nczsKLQotbG9jYWwgJC87Ci0kXyA9IDw+OwotCi1teSAkc3AgPSBxcnsgXHMqICg/OiAvXCogLio/IFwqLyApPyBccyogfXg7ICMgYXNzdW1lIG5vIG5lc3RlZCBjb21tZW50cwotCi1teSAkZDEgICAgPSBxcnsgJHNwICg/OiBbXHdcKlxzXSsgJHNwKSogJHNwIFx3KyAkc3AgW1xbXF1cc10qICRzcCB9eCA7Ci1teSAkZGVjbCAgPSBxcnsgJHNwICg/OiBcdysgJHNwICkrICRkMSB9eG8gOwotbXkgJGRMaXN0ID0gcXJ7ICRzcCAkZGVjbCAoPzogJHNwICwgJGQxICkqICRzcCA7ICRzcCB9eG8gOwotCi0KLXdoaWxlIChzL14KLSAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAjIFN0YXJ0ICQxCi0gICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgIyAgIFN0YXJ0ICQyCi0gICAgICAgICAgICAgICAgICAgIC4qPyAgICAgICAgIyAgICAgTWluaW1hbCBlYXQgY29udGVudAotICAgICAgICAgICAgICAgICAgICAoIF4gXHcgW1x3XHNcKl0rICkgICAgIyAgICAgJDMgLS0gZnVuY3Rpb24gbmFtZQotICAgICAgICAgICAgICAgICAgICBccyogICAgICAgICMgICAgIG9wdGlvbmFsIHdoaXRlc3BhY2UKLSAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAjICQyIC0gTWF0Y2hlZCB1cCB0byBiZWZvcmUgcGFyYW1ldGVyIGxpc3QKLQotICAgICAgICAgICAgICAgIFwoIFxzKiAgICAgICAgICMgTGl0ZXJhbCAiKCIgKyBvcHRpb25hbCB3aGl0ZXNwYWNlCi0gICAgICAgICAgICAgICAgKCBbXlwpXSsgKSAgICAgIyAkNCAtIG9uZSBvciBtb3JlIGFueXRoaW5ncyBleGNlcHQgIikiCi0gICAgICAgICAgICAgICAgXHMqIFwpICAgICAgICAgIyBvcHRpb25hbCB3aGl0ZXNwYWNlIHN1cnJvdW5kaW5nIGEgTGl0ZXJhbCAiKSIKLQotICAgICAgICAgICAgICAgICggKD86ICRkTGlzdCApKyApICMgJDUKLQotICAgICAgICAgICAgICAgICRzcCBeIHsgICAgICAgICMgbGl0ZXJhbCAieyIgYXQgc3RhcnQgb2YgbGluZQotICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgdG8gJDEKLSAgICAgICAgLy94c29tCi0gICAgICApCi17Ci0gICAgbXkgJGFsbCA9ICQxIDsKLSAgICBteSAkcHJlZml4ID0gJDI7Ci0gICAgbXkgJHBhcmFtX2xpc3QgPSAkNCA7Ci0gICAgbXkgJHBhcmFtcyA9ICQ1OwotCi0gICAgU3RyaXBDb21tZW50cygkcGFyYW1zKTsKLSAgICBTdHJpcENvbW1lbnRzKCRwYXJhbV9saXN0KTsKLSAgICAkcGFyYW1fbGlzdCA9fiBzL15ccysvLzsKLSAgICAkcGFyYW1fbGlzdCA9fiBzL1xzKyQvLzsKLQotICAgIG15ICRpID0gMCA7Ci0gICAgbXkgJXBMaXN0ID0gbWFwIHsgJF8gPT4gJGkrKyB9Ci0gICAgICAgICAgICAgICAgc3BsaXQgL1xzKixccyovLCAkcGFyYW1fbGlzdDsKLSAgICBteSAkcE1hdGNoID0gJyhcYicgLiBqb2luKCd8Jywga2V5cyAlcExpc3QpIC4gJ1xiKVxXKiQnIDsKLQotICAgIG15IEBwYXJhbXMgPSBzcGxpdCAvXHMqO1xzKi8sICRwYXJhbXM7Ci0gICAgbXkgQG91dFBhcmFtcyA9ICgpOwotICAgIGZvcmVhY2ggbXkgJHAgKEBwYXJhbXMpCi0gICAgewotICAgICAgICBpZiAoJHAgPX4gLywvKQotICAgICAgICB7Ci0gICAgICAgICAgICBteSBAYml0cyA9IHNwbGl0IC9ccyosXHMqLywgJHA7Ci0gICAgICAgICAgICBteSAkZmlyc3QgPSBzaGlmdCBAYml0czsKLSAgICAgICAgICAgICRmaXJzdCA9fiBzL15ccyovLzsKLSAgICAgICAgICAgIHB1c2ggQG91dFBhcmFtcywgJGZpcnN0OwotICAgICAgICAgICAgJGZpcnN0ID1+IC9eKFx3K1xzKikvOwotICAgICAgICAgICAgbXkgJHR5cGUgPSAkMSA7Ci0gICAgICAgICAgICBwdXNoIEBvdXRQYXJhbXMsIG1hcCB7ICR0eXBlIC4gJF8gfSBAYml0czsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICRwID1+IHMvXlxzKy8vOwotICAgICAgICAgICAgcHVzaCBAb3V0UGFyYW1zLCAkcDsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgbXkgJXRtcCA9IG1hcCB7IC8kcE1hdGNoLzsgICRfID0+ICRwTGlzdHskMX0gIH0KLSAgICAgICAgICAgICAgQG91dFBhcmFtcyA7Ci0KLSAgICBAb3V0UGFyYW1zID0gbWFwICB7ICIgICAgJF8iIH0KLSAgICAgICAgICAgICAgICAgc29ydCB7ICR0bXB7JGF9IDw9PiAkdG1weyRifSB9Ci0gICAgICAgICAgICAgICAgIEBvdXRQYXJhbXMgOwotCi0gICAgcHJpbnQgJHByZWZpeCA7Ci0gICAgcHJpbnQgIihcbiIgLiBqb2luKCIsXG4iLCBAb3V0UGFyYW1zKSAuICIpXG4iOwotICAgIHByaW50ICJ7IiA7Ci0KLX0KLQotIyBPdXRwdXQgYW55IHRyYWlsaW5nIGNvZGUuCi1wcmludCA7Ci1leGl0IDA7Ci0KLQotc3ViIFN0cmlwQ29tbWVudHMKLXsKLQotICBubyB3YXJuaW5nczsKLQotICAjIFN0cmlwIEMgJiBDKysgY29tZW50cwotICAjIEZyb20gdGhlIHBlcmxmYXEKLSAgJF9bMF0gPX4KLQotICAgIHN7Ci0gICAgICAgL1wqICAgICAgICAgIyMgIFN0YXJ0IG9mIC8qIC4uLiAqLyBjb21tZW50Ci0gICAgICAgW14qXSpcKisgICAgIyMgIE5vbi0qIGZvbGxvd2VkIGJ5IDEtb3ItbW9yZSAqJ3MKLSAgICAgICAoCi0gICAgICAgICBbXi8qXVteKl0qXCorCi0gICAgICAgKSogICAgICAgICAgIyMgIDAtb3ItbW9yZSB0aGluZ3Mgd2hpY2ggZG9uJ3Qgc3RhcnQgd2l0aCAvCi0gICAgICAgICAgICAgICAgICAgIyMgICAgYnV0IGRvIGVuZCB3aXRoICcqJwotICAgICAgIC8gICAgICAgICAgICMjICBFbmQgb2YgLyogLi4uICovIGNvbW1lbnQKLQotICAgICB8ICAgICAgICAgIyMgICAgIE9SICBDKysgQ29tbWVudAotICAgICAgIC8vICAgICAgICAgICMjIFN0YXJ0IG9mIEMrKyBjb21tZW50IC8vCi0gICAgICAgW15cbl0qICAgICAgIyMgZm9sbG93ZWQgYnkgMC1vci1tb3JlIG5vbiBlbmQgb2YgbGluZSBjaGFyYWN0ZXJzCi0KLSAgICAgfCAgICAgICAgICMjICAgICBPUiAgdmFyaW91cyB0aGluZ3Mgd2hpY2ggYXJlbid0IGNvbW1lbnRzOgotCi0gICAgICAgKAotICAgICAgICAgIiAgICAgICAgICAgIyMgIFN0YXJ0IG9mICIgLi4uICIgc3RyaW5nCi0gICAgICAgICAoCi0gICAgICAgICAgIFxcLiAgICAgICAgICAgIyMgIEVzY2FwZWQgY2hhcgotICAgICAgICAgfCAgICAgICAgICAgICAgICMjICAgIE9SCi0gICAgICAgICAgIFteIlxcXSAgICAgICAgIyMgIE5vbiAiXAotICAgICAgICAgKSoKLSAgICAgICAgICIgICAgICAgICAgICMjICBFbmQgb2YgIiAuLi4gIiBzdHJpbmcKLQotICAgICAgIHwgICAgICAgICAjIyAgICAgT1IKLQotICAgICAgICAgJyAgICAgICAgICAgIyMgIFN0YXJ0IG9mICcgLi4uICcgc3RyaW5nCi0gICAgICAgICAoCi0gICAgICAgICAgIFxcLiAgICAgICAgICAgIyMgIEVzY2FwZWQgY2hhcgotICAgICAgICAgfCAgICAgICAgICAgICAgICMjICAgIE9SCi0gICAgICAgICAgIFteJ1xcXSAgICAgICAgIyMgIE5vbiAnXAotICAgICAgICAgKSoKLSAgICAgICAgICcgICAgICAgICAgICMjICBFbmQgb2YgJyAuLi4gJyBzdHJpbmcKLQotICAgICAgIHwgICAgICAgICAjIyAgICAgT1IKLQotICAgICAgICAgLiAgICAgICAgICAgIyMgIEFueXRoaW5nIG90aGVyIGNoYXIKLSAgICAgICAgIFteLyInXFxdKiAgICMjICBDaGFycyB3aGljaCBkb2Vzbid0IHN0YXJ0IGEgY29tbWVudCwgc3RyaW5nIG9yIGVzY2FwZQotICAgICAgICkKLSAgICAgfXskMn1neHM7Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy96bGliL3p1dGlsLmMgYi9zcmMvemxpYi96dXRpbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWUwZDNiLi4wMDAwMDAwCi0tLSBhL3NyYy96bGliL3p1dGlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyogenV0aWwuYyAtLSB0YXJnZXQgZGVwZW5kZW50IHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0aGUgY29tcHJlc3Npb24gbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUsIDIwMTAsIDIwMTEsIDIwMTIgSmVhbi1sb3VwIEdhaWxseS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotI2luY2x1ZGUgInp1dGlsLmgiCi0jaWZuZGVmIFpfU09MTwotIyAgaW5jbHVkZSAiZ3pndXRzLmgiCi0jZW5kaWYKLQotI2lmbmRlZiBOT19EVU1NWV9ERUNMCi1zdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgICAgICB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KLSNlbmRpZgotCi1jb25zdCBjaGFyICogY29uc3Qgel9lcnJtc2dbMTBdID0gewotIm5lZWQgZGljdGlvbmFyeSIsICAgICAvKiBaX05FRURfRElDVCAgICAgICAyICAqLwotInN0cmVhbSBlbmQiLCAgICAgICAgICAvKiBaX1NUUkVBTV9FTkQgICAgICAxICAqLwotIiIsICAgICAgICAgICAgICAgICAgICAvKiBaX09LICAgICAgICAgICAgICAwICAqLwotImZpbGUgZXJyb3IiLCAgICAgICAgICAvKiBaX0VSUk5PICAgICAgICAgKC0xKSAqLwotInN0cmVhbSBlcnJvciIsICAgICAgICAvKiBaX1NUUkVBTV9FUlJPUiAgKC0yKSAqLwotImRhdGEgZXJyb3IiLCAgICAgICAgICAvKiBaX0RBVEFfRVJST1IgICAgKC0zKSAqLwotImluc3VmZmljaWVudCBtZW1vcnkiLCAvKiBaX01FTV9FUlJPUiAgICAgKC00KSAqLwotImJ1ZmZlciBlcnJvciIsICAgICAgICAvKiBaX0JVRl9FUlJPUiAgICAgKC01KSAqLwotImluY29tcGF0aWJsZSB2ZXJzaW9uIiwvKiBaX1ZFUlNJT05fRVJST1IgKC02KSAqLwotIiJ9OwotCi0KLWNvbnN0IGNoYXIgKiBaRVhQT1JUIHpsaWJWZXJzaW9uKCkKLXsKLSAgICByZXR1cm4gWkxJQl9WRVJTSU9OOwotfQotCi11TG9uZyBaRVhQT1JUIHpsaWJDb21waWxlRmxhZ3MoKQotewotICAgIHVMb25nIGZsYWdzOwotCi0gICAgZmxhZ3MgPSAwOwotICAgIHN3aXRjaCAoKGludCkoc2l6ZW9mKHVJbnQpKSkgewotICAgIGNhc2UgMjogICAgIGJyZWFrOwotICAgIGNhc2UgNDogICAgIGZsYWdzICs9IDE7ICAgICBicmVhazsKLSAgICBjYXNlIDg6ICAgICBmbGFncyArPSAyOyAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogICAgZmxhZ3MgKz0gMzsKLSAgICB9Ci0gICAgc3dpdGNoICgoaW50KShzaXplb2YodUxvbmcpKSkgewotICAgIGNhc2UgMjogICAgIGJyZWFrOwotICAgIGNhc2UgNDogICAgIGZsYWdzICs9IDEgPDwgMjsgICAgICAgIGJyZWFrOwotICAgIGNhc2UgODogICAgIGZsYWdzICs9IDIgPDwgMjsgICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6ICAgIGZsYWdzICs9IDMgPDwgMjsKLSAgICB9Ci0gICAgc3dpdGNoICgoaW50KShzaXplb2Yodm9pZHBmKSkpIHsKLSAgICBjYXNlIDI6ICAgICBicmVhazsKLSAgICBjYXNlIDQ6ICAgICBmbGFncyArPSAxIDw8IDQ7ICAgICAgICBicmVhazsKLSAgICBjYXNlIDg6ICAgICBmbGFncyArPSAyIDw8IDQ7ICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OiAgICBmbGFncyArPSAzIDw8IDQ7Ci0gICAgfQotICAgIHN3aXRjaCAoKGludCkoc2l6ZW9mKHpfb2ZmX3QpKSkgewotICAgIGNhc2UgMjogICAgIGJyZWFrOwotICAgIGNhc2UgNDogICAgIGZsYWdzICs9IDEgPDwgNjsgICAgICAgIGJyZWFrOwotICAgIGNhc2UgODogICAgIGZsYWdzICs9IDIgPDwgNjsgICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6ICAgIGZsYWdzICs9IDMgPDwgNjsKLSAgICB9Ci0jaWZkZWYgREVCVUcKLSAgICBmbGFncyArPSAxIDw8IDg7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKEFTTVYpIHx8IGRlZmluZWQoQVNNSU5GKQotICAgIGZsYWdzICs9IDEgPDwgOTsKLSNlbmRpZgotI2lmZGVmIFpMSUJfV0lOQVBJCi0gICAgZmxhZ3MgKz0gMSA8PCAxMDsKLSNlbmRpZgotI2lmZGVmIEJVSUxERklYRUQKLSAgICBmbGFncyArPSAxIDw8IDEyOwotI2VuZGlmCi0jaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKLSAgICBmbGFncyArPSAxIDw8IDEzOwotI2VuZGlmCi0jaWZkZWYgTk9fR1pDT01QUkVTUwotICAgIGZsYWdzICs9IDFMIDw8IDE2OwotI2VuZGlmCi0jaWZkZWYgTk9fR1pJUAotICAgIGZsYWdzICs9IDFMIDw8IDE3OwotI2VuZGlmCi0jaWZkZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKLSAgICBmbGFncyArPSAxTCA8PCAyMDsKLSNlbmRpZgotI2lmZGVmIEZBU1RFU1QKLSAgICBmbGFncyArPSAxTCA8PCAyMTsKLSNlbmRpZgotI2lmIGRlZmluZWQoU1REQykgfHwgZGVmaW5lZChaX0hBVkVfU1REQVJHX0gpCi0jICBpZmRlZiBOT192c25wcmludGYKLSAgICBmbGFncyArPSAxTCA8PCAyNTsKLSMgICAgaWZkZWYgSEFTX3ZzcHJpbnRmX3ZvaWQKLSAgICBmbGFncyArPSAxTCA8PCAyNjsKLSMgICAgZW5kaWYKLSMgIGVsc2UKLSMgICAgaWZkZWYgSEFTX3ZzbnByaW50Zl92b2lkCi0gICAgZmxhZ3MgKz0gMUwgPDwgMjY7Ci0jICAgIGVuZGlmCi0jICBlbmRpZgotI2Vsc2UKLSAgICBmbGFncyArPSAxTCA8PCAyNDsKLSMgIGlmZGVmIE5PX3NucHJpbnRmCi0gICAgZmxhZ3MgKz0gMUwgPDwgMjU7Ci0jICAgIGlmZGVmIEhBU19zcHJpbnRmX3ZvaWQKLSAgICBmbGFncyArPSAxTCA8PCAyNjsKLSMgICAgZW5kaWYKLSMgIGVsc2UKLSMgICAgaWZkZWYgSEFTX3NucHJpbnRmX3ZvaWQKLSAgICBmbGFncyArPSAxTCA8PCAyNjsKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLSAgICByZXR1cm4gZmxhZ3M7Ci19Ci0KLSNpZmRlZiBERUJVRwotCi0jICBpZm5kZWYgdmVyYm9zZQotIyAgICBkZWZpbmUgdmVyYm9zZSAwCi0jICBlbmRpZgotaW50IFpMSUJfSU5URVJOQUwgel92ZXJib3NlID0gdmVyYm9zZTsKLQotdm9pZCBaTElCX0lOVEVSTkFMIHpfZXJyb3IgKG0pCi0gICAgY2hhciAqbTsKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBtKTsKLSAgICBleGl0KDEpOwotfQotI2VuZGlmCi0KLS8qIGV4cG9ydGVkIHRvIGFsbG93IGNvbnZlcnNpb24gb2YgZXJyb3IgY29kZSB0byBzdHJpbmcgZm9yIGNvbXByZXNzKCkgYW5kCi0gKiB1bmNvbXByZXNzKCkKLSAqLwotY29uc3QgY2hhciAqIFpFWFBPUlQgekVycm9yKGVycikKLSAgICBpbnQgZXJyOwotewotICAgIHJldHVybiBFUlJfTVNHKGVycik7Ci19Ci0KLSNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCi0gICAgLyogVGhlIE1pY3Jvc29mdCBDIFJ1bi1UaW1lIExpYnJhcnkgZm9yIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlCi0gICAgICogZXJybm8uICBXZSBkZWZpbmUgaXQgYXMgYSBnbG9iYWwgdmFyaWFibGUgdG8gc2ltcGxpZnkgcG9ydGluZy4KLSAgICAgKiBJdHMgdmFsdWUgaXMgYWx3YXlzIDAgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4KLSAgICAgKi8KLSAgICBpbnQgZXJybm8gPSAwOwotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9NRU1DUFkKLQotdm9pZCBaTElCX0lOVEVSTkFMIHptZW1jcHkoZGVzdCwgc291cmNlLCBsZW4pCi0gICAgQnl0ZWYqIGRlc3Q7Ci0gICAgY29uc3QgQnl0ZWYqIHNvdXJjZTsKLSAgICB1SW50ICBsZW47Ci17Ci0gICAgaWYgKGxlbiA9PSAwKSByZXR1cm47Ci0gICAgZG8gewotICAgICAgICAqZGVzdCsrID0gKnNvdXJjZSsrOyAvKiA/Pz8gdG8gYmUgdW5yb2xsZWQgKi8KLSAgICB9IHdoaWxlICgtLWxlbiAhPSAwKTsKLX0KLQotaW50IFpMSUJfSU5URVJOQUwgem1lbWNtcChzMSwgczIsIGxlbikKLSAgICBjb25zdCBCeXRlZiogczE7Ci0gICAgY29uc3QgQnl0ZWYqIHMyOwotICAgIHVJbnQgIGxlbjsKLXsKLSAgICB1SW50IGo7Ci0KLSAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKLSAgICAgICAgaWYgKHMxW2pdICE9IHMyW2pdKSByZXR1cm4gMiooczFbal0gPiBzMltqXSktMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgWkxJQl9JTlRFUk5BTCB6bWVtemVybyhkZXN0LCBsZW4pCi0gICAgQnl0ZWYqIGRlc3Q7Ci0gICAgdUludCAgbGVuOwotewotICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuOwotICAgIGRvIHsKLSAgICAgICAgKmRlc3QrKyA9IDA7ICAvKiA/Pz8gdG8gYmUgdW5yb2xsZWQgKi8KLSAgICB9IHdoaWxlICgtLWxlbiAhPSAwKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIFpfU09MTwotCi0jaWZkZWYgU1lTMTZCSVQKLQotI2lmZGVmIF9fVFVSQk9DX18KLS8qIFR1cmJvIEMgaW4gMTYtYml0IG1vZGUgKi8KLQotIyAgZGVmaW5lIE1ZX1pDQUxMT0MKLQotLyogVHVyYm8gQyBtYWxsb2MoKSBkb2VzIG5vdCBhbGxvdyBkeW5hbWljIGFsbG9jYXRpb24gb2YgNjRLIGJ5dGVzCi0gKiBhbmQgZmFybWFsbG9jKDY0SykgcmV0dXJucyBhIHBvaW50ZXIgd2l0aCBhbiBvZmZzZXQgb2YgOCwgc28gd2UKLSAqIG11c3QgZml4IHRoZSBwb2ludGVyLiBXYXJuaW5nOiB0aGUgcG9pbnRlciBtdXN0IGJlIHB1dCBiYWNrIHRvIGl0cwotICogb3JpZ2luYWwgZm9ybSBpbiBvcmRlciB0byBmcmVlIGl0LCB1c2UgemNmcmVlKCkuCi0gKi8KLQotI2RlZmluZSBNQVhfUFRSIDEwCi0vKiAxMCo2NEsgPSA2NDBLICovCi0KLWxvY2FsIGludCBuZXh0X3B0ciA9IDA7Ci0KLXR5cGVkZWYgc3RydWN0IHB0cl90YWJsZV9zIHsKLSAgICB2b2lkcGYgb3JnX3B0cjsKLSAgICB2b2lkcGYgbmV3X3B0cjsKLX0gcHRyX3RhYmxlOwotCi1sb2NhbCBwdHJfdGFibGUgdGFibGVbTUFYX1BUUl07Ci0vKiBUaGlzIHRhYmxlIGlzIHVzZWQgdG8gcmVtZW1iZXIgdGhlIG9yaWdpbmFsIGZvcm0gb2YgcG9pbnRlcnMKLSAqIHRvIGxhcmdlIGJ1ZmZlcnMgKDY0SykuIFN1Y2ggcG9pbnRlcnMgYXJlIG5vcm1hbGl6ZWQgd2l0aCBhIHplcm8gb2Zmc2V0LgotICogU2luY2UgTVNET1MgaXMgbm90IGEgcHJlZW1wdGl2ZSBtdWx0aXRhc2tpbmcgT1MsIHRoaXMgdGFibGUgaXMgbm90Ci0gKiBwcm90ZWN0ZWQgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gVGhpcyBoYWNrIGRvZXNuJ3Qgd29yayBhbnl3YXkgb24KLSAqIGEgcHJvdGVjdGVkIHN5c3RlbSBsaWtlIE9TLzIuIFVzZSBNaWNyb3NvZnQgQyBpbnN0ZWFkLgotICovCi0KLXZvaWRwZiBaTElCX0lOVEVSTkFMIHpjYWxsb2MgKHZvaWRwZiBvcGFxdWUsIHVuc2lnbmVkIGl0ZW1zLCB1bnNpZ25lZCBzaXplKQotewotICAgIHZvaWRwZiBidWYgPSBvcGFxdWU7IC8qIGp1c3QgdG8gbWFrZSBzb21lIGNvbXBpbGVycyBoYXBweSAqLwotICAgIHVsZyBic2l6ZSA9ICh1bGcpaXRlbXMqc2l6ZTsKLQotICAgIC8qIElmIHdlIGFsbG9jYXRlIGxlc3MgdGhhbiA2NTUyMCBieXRlcywgd2UgYXNzdW1lIHRoYXQgZmFybWFsbG9jCi0gICAgICogd2lsbCByZXR1cm4gYSB1c2FibGUgcG9pbnRlciB3aGljaCBkb2Vzbid0IGhhdmUgdG8gYmUgbm9ybWFsaXplZC4KLSAgICAgKi8KLSAgICBpZiAoYnNpemUgPCA2NTUyMEwpIHsKLSAgICAgICAgYnVmID0gZmFybWFsbG9jKGJzaXplKTsKLSAgICAgICAgaWYgKCoodXNoKikmYnVmICE9IDApIHJldHVybiBidWY7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYnVmID0gZmFybWFsbG9jKGJzaXplICsgMTZMKTsKLSAgICB9Ci0gICAgaWYgKGJ1ZiA9PSBOVUxMIHx8IG5leHRfcHRyID49IE1BWF9QVFIpIHJldHVybiBOVUxMOwotICAgIHRhYmxlW25leHRfcHRyXS5vcmdfcHRyID0gYnVmOwotCi0gICAgLyogTm9ybWFsaXplIHRoZSBwb2ludGVyIHRvIHNlZzowICovCi0gICAgKigodXNoKikmYnVmKzEpICs9ICgodXNoKSgodWNoKilidWYtMCkgKyAxNSkgPj4gNDsKLSAgICAqKHVzaCopJmJ1ZiA9IDA7Ci0gICAgdGFibGVbbmV4dF9wdHIrK10ubmV3X3B0ciA9IGJ1ZjsKLSAgICByZXR1cm4gYnVmOwotfQotCi12b2lkIFpMSUJfSU5URVJOQUwgemNmcmVlICh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgcHRyKQotewotICAgIGludCBuOwotICAgIGlmICgqKHVzaCopJnB0ciAhPSAwKSB7IC8qIG9iamVjdCA8IDY0SyAqLwotICAgICAgICBmYXJmcmVlKHB0cik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLyogRmluZCB0aGUgb3JpZ2luYWwgcG9pbnRlciAqLwotICAgIGZvciAobiA9IDA7IG4gPCBuZXh0X3B0cjsgbisrKSB7Ci0gICAgICAgIGlmIChwdHIgIT0gdGFibGVbbl0ubmV3X3B0cikgY29udGludWU7Ci0KLSAgICAgICAgZmFyZnJlZSh0YWJsZVtuXS5vcmdfcHRyKTsKLSAgICAgICAgd2hpbGUgKCsrbiA8IG5leHRfcHRyKSB7Ci0gICAgICAgICAgICB0YWJsZVtuLTFdID0gdGFibGVbbl07Ci0gICAgICAgIH0KLSAgICAgICAgbmV4dF9wdHItLTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwdHIgPSBvcGFxdWU7IC8qIGp1c3QgdG8gbWFrZSBzb21lIGNvbXBpbGVycyBoYXBweSAqLwotICAgIEFzc2VydCgwLCAiemNmcmVlOiBwdHIgbm90IGZvdW5kIik7Ci19Ci0KLSNlbmRpZiAvKiBfX1RVUkJPQ19fICovCi0KLQotI2lmZGVmIE1fSTg2Ci0vKiBNaWNyb3NvZnQgQyBpbiAxNi1iaXQgbW9kZSAqLwotCi0jICBkZWZpbmUgTVlfWkNBTExPQwotCi0jaWYgKCFkZWZpbmVkKF9NU0NfVkVSKSB8fCAoX01TQ19WRVIgPD0gNjAwKSkKLSMgIGRlZmluZSBfaGFsbG9jICBoYWxsb2MKLSMgIGRlZmluZSBfaGZyZWUgICBoZnJlZQotI2VuZGlmCi0KLXZvaWRwZiBaTElCX0lOVEVSTkFMIHpjYWxsb2MgKHZvaWRwZiBvcGFxdWUsIHVJbnQgaXRlbXMsIHVJbnQgc2l6ZSkKLXsKLSAgICBpZiAob3BhcXVlKSBvcGFxdWUgPSAwOyAvKiB0byBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCi0gICAgcmV0dXJuIF9oYWxsb2MoKGxvbmcpaXRlbXMsIHNpemUpOwotfQotCi12b2lkIFpMSUJfSU5URVJOQUwgemNmcmVlICh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgcHRyKQotewotICAgIGlmIChvcGFxdWUpIG9wYXF1ZSA9IDA7IC8qIHRvIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KLSAgICBfaGZyZWUocHRyKTsKLX0KLQotI2VuZGlmIC8qIE1fSTg2ICovCi0KLSNlbmRpZiAvKiBTWVMxNkJJVCAqLwotCi0KLSNpZm5kZWYgTVlfWkNBTExPQyAvKiBBbnkgc3lzdGVtIHdpdGhvdXQgYSBzcGVjaWFsIGFsbG9jIGZ1bmN0aW9uICovCi0KLSNpZm5kZWYgU1REQwotZXh0ZXJuIHZvaWRwICBtYWxsb2MgT0YoKHVJbnQgc2l6ZSkpOwotZXh0ZXJuIHZvaWRwICBjYWxsb2MgT0YoKHVJbnQgaXRlbXMsIHVJbnQgc2l6ZSkpOwotZXh0ZXJuIHZvaWQgICBmcmVlICAgT0YoKHZvaWRwZiBwdHIpKTsKLSNlbmRpZgotCi12b2lkcGYgWkxJQl9JTlRFUk5BTCB6Y2FsbG9jIChvcGFxdWUsIGl0ZW1zLCBzaXplKQotICAgIHZvaWRwZiBvcGFxdWU7Ci0gICAgdW5zaWduZWQgaXRlbXM7Ci0gICAgdW5zaWduZWQgc2l6ZTsKLXsKLSAgICBpZiAob3BhcXVlKSBpdGVtcyArPSBzaXplIC0gc2l6ZTsgLyogbWFrZSBjb21waWxlciBoYXBweSAqLwotICAgIHJldHVybiBzaXplb2YodUludCkgPiAyID8gKHZvaWRwZiltYWxsb2MoaXRlbXMgKiBzaXplKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZHBmKWNhbGxvYyhpdGVtcywgc2l6ZSk7Ci19Ci0KLXZvaWQgWkxJQl9JTlRFUk5BTCB6Y2ZyZWUgKG9wYXF1ZSwgcHRyKQotICAgIHZvaWRwZiBvcGFxdWU7Ci0gICAgdm9pZHBmIHB0cjsKLXsKLSAgICBmcmVlKHB0cik7Ci0gICAgaWYgKG9wYXF1ZSkgcmV0dXJuOyAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCi19Ci0KLSNlbmRpZiAvKiBNWV9aQ0FMTE9DICovCi0KLSNlbmRpZiAvKiAhWl9TT0xPICovCmRpZmYgLS1naXQgYS9zcmMvemxpYi96dXRpbC5oIGIvc3JjL3psaWIvenV0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzZGNjNi4uMDAwMDAwMAotLS0gYS9zcmMvemxpYi96dXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qIHp1dGlsLmggLS0gaW50ZXJuYWwgaW50ZXJmYWNlIGFuZCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMiBKZWFuLWxvdXAgR2FpbGx5LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCi0gICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKLSAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotI2lmbmRlZiBaVVRJTF9ICi0jZGVmaW5lIFpVVElMX0gKLQotI2lmZGVmIEhBVkVfSElEREVOCi0jICBkZWZpbmUgWkxJQl9JTlRFUk5BTCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKQotI2Vsc2UKLSMgIGRlZmluZSBaTElCX0lOVEVSTkFMCi0jZW5kaWYKLQotI2luY2x1ZGUgInpsaWIuaCIKLQotI2lmIGRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoWl9TT0xPKQotIyAgaWYgIShkZWZpbmVkKF9XSU4zMl9XQ0UpICYmIGRlZmluZWQoX01TQ19WRVIpKQotIyAgICBpbmNsdWRlIDxzdGRkZWYuaD4KLSMgIGVuZGlmCi0jICBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBaX1NPTE8KLSAgIHR5cGVkZWYgbG9uZyBwdHJkaWZmX3Q7ICAvKiBndWVzcyAtLSB3aWxsIGJlIGNhdWdodCBpZiBndWVzcyBpcyB3cm9uZyAqLwotI2VuZGlmCi0KLSNpZm5kZWYgbG9jYWwKLSMgIGRlZmluZSBsb2NhbCBzdGF0aWMKLSNlbmRpZgotLyogY29tcGlsZSB3aXRoIC1EbG9jYWwgaWYgeW91ciBkZWJ1Z2dlciBjYW4ndCBmaW5kIHN0YXRpYyBzeW1ib2xzICovCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgdWNoOwotdHlwZWRlZiB1Y2ggRkFSIHVjaGY7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaDsKLXR5cGVkZWYgdXNoIEZBUiB1c2hmOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICB1bGc7Ci0KLWV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgel9lcnJtc2dbMTBdOyAvKiBpbmRleGVkIGJ5IDItemxpYl9lcnJvciAqLwotLyogKHNpemUgZ2l2ZW4gdG8gYXZvaWQgc2lsbHkgd2FybmluZ3Mgd2l0aCBWaXN1YWwgQysrKSAqLwotCi0jZGVmaW5lIEVSUl9NU0coZXJyKSB6X2Vycm1zZ1taX05FRURfRElDVC0oZXJyKV0KLQotI2RlZmluZSBFUlJfUkVUVVJOKHN0cm0sZXJyKSBcCi0gIHJldHVybiAoc3RybS0+bXNnID0gKGNoYXIqKUVSUl9NU0coZXJyKSwgKGVycikpCi0vKiBUbyBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgc3RhdGUgaXMga25vd24gdG8gYmUgdmFsaWQgKi8KLQotICAgICAgICAvKiBjb21tb24gY29uc3RhbnRzICovCi0KLSNpZm5kZWYgREVGX1dCSVRTCi0jICBkZWZpbmUgREVGX1dCSVRTIE1BWF9XQklUUwotI2VuZGlmCi0vKiBkZWZhdWx0IHdpbmRvd0JpdHMgZm9yIGRlY29tcHJlc3Npb24uIE1BWF9XQklUUyBpcyBmb3IgY29tcHJlc3Npb24gb25seSAqLwotCi0jaWYgTUFYX01FTV9MRVZFTCA+PSA4Ci0jICBkZWZpbmUgREVGX01FTV9MRVZFTCA4Ci0jZWxzZQotIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgIE1BWF9NRU1fTEVWRUwKLSNlbmRpZgotLyogZGVmYXVsdCBtZW1MZXZlbCAqLwotCi0jZGVmaW5lIFNUT1JFRF9CTE9DSyAwCi0jZGVmaW5lIFNUQVRJQ19UUkVFUyAxCi0jZGVmaW5lIERZTl9UUkVFUyAgICAyCi0vKiBUaGUgdGhyZWUga2luZHMgb2YgYmxvY2sgdHlwZSAqLwotCi0jZGVmaW5lIE1JTl9NQVRDSCAgMwotI2RlZmluZSBNQVhfTUFUQ0ggIDI1OAotLyogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gbWF0Y2ggbGVuZ3RocyAqLwotCi0jZGVmaW5lIFBSRVNFVF9ESUNUIDB4MjAgLyogcHJlc2V0IGRpY3Rpb25hcnkgZmxhZyBpbiB6bGliIGhlYWRlciAqLwotCi0gICAgICAgIC8qIHRhcmdldCBkZXBlbmRlbmNpZXMgKi8KLQotI2lmIGRlZmluZWQoTVNET1MpIHx8IChkZWZpbmVkKFdJTkRPV1MpICYmICFkZWZpbmVkKFdJTjMyKSkKLSMgIGRlZmluZSBPU19DT0RFICAweDAwCi0jICBpZm5kZWYgWl9TT0xPCi0jICAgIGlmIGRlZmluZWQoX19UVVJCT0NfXykgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0jICAgICAgaWYgKF9fU1REQ19fID09IDEpICYmIChkZWZpbmVkKF9fTEFSR0VfXykgfHwgZGVmaW5lZChfX0NPTVBBQ1RfXykpCi0gICAgICAgICAvKiBBbGxvdyBjb21waWxhdGlvbiB3aXRoIEFOU0kga2V5d29yZHMgb25seSBlbmFibGVkICovCi0gICAgICAgICB2b2lkIF9DZGVjbCBmYXJmcmVlKCB2b2lkICpibG9jayApOwotICAgICAgICAgdm9pZCAqX0NkZWNsIGZhcm1hbGxvYyggdW5zaWduZWQgbG9uZyBuYnl0ZXMgKTsKLSMgICAgICBlbHNlCi0jICAgICAgICBpbmNsdWRlIDxhbGxvYy5oPgotIyAgICAgIGVuZGlmCi0jICAgIGVsc2UgLyogTVNDIG9yIERKR1BQICovCi0jICAgICAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBBTUlHQQotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDEKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChWQVhDKSB8fCBkZWZpbmVkKFZNUykKLSMgIGRlZmluZSBPU19DT0RFICAweDAyCi0jICBkZWZpbmUgRl9PUEVOKG5hbWUsIG1vZGUpIFwKLSAgICAgZm9wZW4oKG5hbWUpLCAobW9kZSksICJtYmM9NjAiLCAiY3R4PXN0bSIsICJyZm09Zml4IiwgIm1ycz01MTIiKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEFUQVJJKSB8fCBkZWZpbmVkKGF0YXJpc3QpCi0jICBkZWZpbmUgT1NfQ09ERSAgMHgwNQotI2VuZGlmCi0KLSNpZmRlZiBPUzIKLSMgIGRlZmluZSBPU19DT0RFICAweDA2Ci0jICBpZiBkZWZpbmVkKE1fSTg2KSAmJiAhZGVmaW5lZChaX1NPTE8pCi0jICAgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChNQUNPUykgfHwgZGVmaW5lZChUQVJHRVRfT1NfTUFDKQotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDcKLSMgIGlmbmRlZiBaX1NPTE8KLSMgICAgaWYgZGVmaW5lZChfX01XRVJLU19fKSAmJiBfX2Rlc3Rfb3MgIT0gX19iZV9vcyAmJiBfX2Rlc3Rfb3MgIT0gX193aW4zMl9vcwotIyAgICAgIGluY2x1ZGUgPHVuaXguaD4gLyogZm9yIGZkb3BlbiAqLwotIyAgICBlbHNlCi0jICAgICAgaWZuZGVmIGZkb3BlbgotIyAgICAgICAgZGVmaW5lIGZkb3BlbihmZCxtb2RlKSBOVUxMIC8qIE5vIGZkb3BlbigpICovCi0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFRPUFMyMAotIyAgZGVmaW5lIE9TX0NPREUgIDB4MGEKLSNlbmRpZgotCi0jaWZkZWYgV0lOMzIKLSMgIGlmbmRlZiBfX0NZR1dJTl9fICAvKiBDeWd3aW4gaXMgVW5peCwgbm90IFdpbjMyICovCi0jICAgIGRlZmluZSBPU19DT0RFICAweDBiCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfXzUwU0VSSUVTIC8qIFByaW1lL1BSSU1PUyAqLwotIyAgZGVmaW5lIE9TX0NPREUgIDB4MGYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfQkVPU18pIHx8IGRlZmluZWQoUklTQ09TKQotIyAgZGVmaW5lIGZkb3BlbihmZCxtb2RlKSBOVUxMIC8qIE5vIGZkb3BlbigpICovCi0jZW5kaWYKLQotI2lmIChkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiA2MDApKSAmJiAhZGVmaW5lZCBfX0lOVEVSSVgKLSMgIGlmIGRlZmluZWQoX1dJTjMyX1dDRSkKLSMgICAgZGVmaW5lIGZkb3BlbihmZCxtb2RlKSBOVUxMIC8qIE5vIGZkb3BlbigpICovCi0jICAgIGlmbmRlZiBfUFRSRElGRl9UX0RFRklORUQKLSAgICAgICB0eXBlZGVmIGludCBwdHJkaWZmX3Q7Ci0jICAgICAgZGVmaW5lIF9QVFJESUZGX1RfREVGSU5FRAotIyAgICBlbmRpZgotIyAgZWxzZQotIyAgICBkZWZpbmUgZmRvcGVuKGZkLHR5cGUpICBfZmRvcGVuKGZkLHR5cGUpCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgIWRlZmluZWQoTVNET1MpCi0gICNwcmFnbWEgd2FybiAtODAwNAotICAjcHJhZ21hIHdhcm4gLTgwMDgKLSAgI3ByYWdtYSB3YXJuIC04MDY2Ci0jZW5kaWYKLQotLyogcHJvdmlkZSBwcm90b3R5cGVzIGZvciB0aGVzZSB3aGVuIGJ1aWxkaW5nIHpsaWIgd2l0aG91dCBMRlMgKi8KLSNpZiAhZGVmaW5lZChfV0lOMzIpICYmICghZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSB8fCBfTEZTNjRfTEFSR0VGSUxFLTAgPT0gMCkKLSAgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOwotICAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOwotI2VuZGlmCi0KLSAgICAgICAgLyogY29tbW9uIGRlZmF1bHRzICovCi0KLSNpZm5kZWYgT1NfQ09ERQotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDMgIC8qIGFzc3VtZSBVbml4ICovCi0jZW5kaWYKLQotI2lmbmRlZiBGX09QRU4KLSMgIGRlZmluZSBGX09QRU4obmFtZSwgbW9kZSkgZm9wZW4oKG5hbWUpLCAobW9kZSkpCi0jZW5kaWYKLQotICAgICAgICAgLyogZnVuY3Rpb25zICovCi0KLSNpZiBkZWZpbmVkKHB5cikgfHwgZGVmaW5lZChaX1NPTE8pCi0jICBkZWZpbmUgTk9fTUVNQ1BZCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFNNQUxMX01FRElVTSkgJiYgIWRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fU0NfXykKLSAvKiBVc2Ugb3VyIG93biBmdW5jdGlvbnMgZm9yIHNtYWxsIGFuZCBtZWRpdW0gbW9kZWwgd2l0aCBNU0MgPD0gNS4wLgotICAqIFlvdSBtYXkgaGF2ZSB0byB1c2UgdGhlIHNhbWUgc3RyYXRlZ3kgZm9yIEJvcmxhbmQgQyAodW50ZXN0ZWQpLgotICAqIFRoZSBfX1NDX18gY2hlY2sgaXMgZm9yIFN5bWFudGVjLgotICAqLwotIyAgZGVmaW5lIE5PX01FTUNQWQotI2VuZGlmCi0jaWYgZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChIQVZFX01FTUNQWSkgJiYgIWRlZmluZWQoTk9fTUVNQ1BZKQotIyAgZGVmaW5lIEhBVkVfTUVNQ1BZCi0jZW5kaWYKLSNpZmRlZiBIQVZFX01FTUNQWQotIyAgaWZkZWYgU01BTExfTUVESVVNIC8qIE1TRE9TIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLwotIyAgICBkZWZpbmUgem1lbWNweSBfZm1lbWNweQotIyAgICBkZWZpbmUgem1lbWNtcCBfZm1lbWNtcAotIyAgICBkZWZpbmUgem1lbXplcm8oZGVzdCwgbGVuKSBfZm1lbXNldChkZXN0LCAwLCBsZW4pCi0jICBlbHNlCi0jICAgIGRlZmluZSB6bWVtY3B5IG1lbWNweQotIyAgICBkZWZpbmUgem1lbWNtcCBtZW1jbXAKLSMgICAgZGVmaW5lIHptZW16ZXJvKGRlc3QsIGxlbikgbWVtc2V0KGRlc3QsIDAsIGxlbikKLSMgIGVuZGlmCi0jZWxzZQotICAgdm9pZCBaTElCX0lOVEVSTkFMIHptZW1jcHkgT0YoKEJ5dGVmKiBkZXN0LCBjb25zdCBCeXRlZiogc291cmNlLCB1SW50IGxlbikpOwotICAgaW50IFpMSUJfSU5URVJOQUwgem1lbWNtcCBPRigoY29uc3QgQnl0ZWYqIHMxLCBjb25zdCBCeXRlZiogczIsIHVJbnQgbGVuKSk7Ci0gICB2b2lkIFpMSUJfSU5URVJOQUwgem1lbXplcm8gT0YoKEJ5dGVmKiBkZXN0LCB1SW50IGxlbikpOwotI2VuZGlmCi0KLS8qIERpYWdub3N0aWMgZnVuY3Rpb25zICovCi0jaWZkZWYgREVCVUcKLSMgIGluY2x1ZGUgPHN0ZGlvLmg+Ci0gICBleHRlcm4gaW50IFpMSUJfSU5URVJOQUwgel92ZXJib3NlOwotICAgZXh0ZXJuIHZvaWQgWkxJQl9JTlRFUk5BTCB6X2Vycm9yIE9GKChjaGFyICptKSk7Ci0jICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKSB7aWYoIShjb25kKSkgel9lcnJvcihtc2cpO30KLSMgIGRlZmluZSBUcmFjZSh4KSB7aWYgKHpfdmVyYm9zZT49MCkgZnByaW50ZiB4IDt9Ci0jICBkZWZpbmUgVHJhY2V2KHgpIHtpZiAoel92ZXJib3NlPjApIGZwcmludGYgeCA7fQotIyAgZGVmaW5lIFRyYWNldnYoeCkge2lmICh6X3ZlcmJvc2U+MSkgZnByaW50ZiB4IDt9Ci0jICBkZWZpbmUgVHJhY2VjKGMseCkge2lmICh6X3ZlcmJvc2U+MCAmJiAoYykpIGZwcmludGYgeCA7fQotIyAgZGVmaW5lIFRyYWNlY3YoYyx4KSB7aWYgKHpfdmVyYm9zZT4xICYmIChjKSkgZnByaW50ZiB4IDt9Ci0jZWxzZQotIyAgZGVmaW5lIEFzc2VydChjb25kLG1zZykKLSMgIGRlZmluZSBUcmFjZSh4KQotIyAgZGVmaW5lIFRyYWNldih4KQotIyAgZGVmaW5lIFRyYWNldnYoeCkKLSMgIGRlZmluZSBUcmFjZWMoYyx4KQotIyAgZGVmaW5lIFRyYWNlY3YoYyx4KQotI2VuZGlmCi0KLSNpZm5kZWYgWl9TT0xPCi0gICB2b2lkcGYgWkxJQl9JTlRFUk5BTCB6Y2FsbG9jIE9GKCh2b2lkcGYgb3BhcXVlLCB1bnNpZ25lZCBpdGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNpemUpKTsKLSAgIHZvaWQgWkxJQl9JTlRFUk5BTCB6Y2ZyZWUgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgcHRyKSk7Ci0jZW5kaWYKLQotI2RlZmluZSBaQUxMT0Moc3RybSwgaXRlbXMsIHNpemUpIFwKLSAgICAgICAgICAgKCooKHN0cm0pLT56YWxsb2MpKSgoc3RybSktPm9wYXF1ZSwgKGl0ZW1zKSwgKHNpemUpKQotI2RlZmluZSBaRlJFRShzdHJtLCBhZGRyKSAgKCooKHN0cm0pLT56ZnJlZSkpKChzdHJtKS0+b3BhcXVlLCAodm9pZHBmKShhZGRyKSkKLSNkZWZpbmUgVFJZX0ZSRUUocywgcCkge2lmIChwKSBaRlJFRShzLCBwKTt9Ci0KLS8qIFJldmVyc2UgdGhlIGJ5dGVzIGluIGEgMzItYml0IHZhbHVlICovCi0jZGVmaW5lIFpTV0FQMzIocSkgKCgoKHEpID4+IDI0KSAmIDB4ZmYpICsgKCgocSkgPj4gOCkgJiAweGZmMDApICsgXAotICAgICAgICAgICAgICAgICAgICAoKChxKSAmIDB4ZmYwMCkgPDwgOCkgKyAoKChxKSAmIDB4ZmYpIDw8IDI0KSkKLQotI2VuZGlmIC8qIFpVVElMX0ggKi8K