LyoKICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqCiAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIAogKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKICogT3Blbk1BWCBETDogdjEuMC4yCiAqIFJldmlzaW9uOiAgIDk2NDEKICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKICogCiAqIAogKiAKICoKICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKICogCiAqLwogCiNpbmNsdWRlICJvbXh0eXBlcy5oIgojaW5jbHVkZSAiYXJtT01YLmgiCiNpbmNsdWRlICJvbXhWQy5oIgoKI2luY2x1ZGUgImFybUNPTU0uaCIKI2luY2x1ZGUgImFybVZDLmgiCgovKioKICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMKICoKICogRGVzY3JpcHRpb246CiAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCiAqIEludHJhMTZ4MTZEQ0xldmVsLCBJbnRyYTE2eDE2QUNMZXZlbCxMdW1hTGV2ZWwsIGFuZCBDaHJvbWFBQ0xldmVsLiAKICogSW52ZXJzZSBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiBwYWNrZWQgCiAqIHBvc2l0aW9uLWNvZWZmaWNpZW50IGJ1ZmZlciBhcmUgc3RvcmVkIGluIGluY3JlYXNpbmcgemlnemFnIG9yZGVyIGluc3RlYWQgCiAqIG9mIHBvc2l0aW9uIG9yZGVyLgogKgogKiBSZW1hcmtzOgogKgogKiBQYXJhbWV0ZXJzOgogKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCiAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKICoJCQkJCQkJCWJsb2NrCiAqIFtpbl0Jc1ZMQ1NlbGVjdAkJVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIG51bWJlciBvZiBub24temVybwogKgkJCQkJCQkJQUMgY29lZmZpY2llbnRzIG9mIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuIEl0IGlzIAogKgkJCQkJCQkJZXF1aXZhbGVudCB0byB0aGUgdmFyaWFibGUgbkMgZGVzY3JpYmVkIGluIEguMjY0IHN0YW5kYXJkIAogKgkJCQkJCQkJdGFibGUgOS01LCBleGNlcHQgaXRzIHZhbHVlIGNhbqGvdCBiZSBsZXNzIHRoYW4gemVyby4KICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAogKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KICoJCQkJCQkJCXRoaXMgYmxvY2sKICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCiAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgogKiBSZXR1cm4gVmFsdWU6CiAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCiAqCiAqLwoKT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCiAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCiAgICAgT01YX1MzMiogcE9mZnNldCwKICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKICAgICBPTVhfVTgqKnBwUG9zQ29lZmJ1ZiwKICAgICBPTVhfSU5UIHNWTENTZWxlY3QsCiAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAogKQp7CiAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIHNWTENTZWxlY3QsIHNNYXhOdW1Db2VmZik7Cn0K