LyoKICogJElkJAogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KICAgIDx2YXJpYWJsZWxpc3Q+CgpAUkVUQAkJaW50CkBGVU5DQAkJRmNVdGY4VG9VY3M0IApAVFlQRTFACQlGY0NoYXI4ICoJCQlAQVJHMUAJCXNyYwpAVFlQRTJACQlGY0NoYXIzMiAqCQkJQEFSRzJACQlkc3QKQFRZUEUzQAkJaW50IAkJCQlAQVJHM0AJCWxlbgpAUFVSUE9TRUAJY29udmVydCBVVEYtOCB0byBVQ1M0CkBERVNDQApDb252ZXJ0cyB0aGUgbmV4dCBVbmljb2RlIGNoYXIgZnJvbSA8cGFyYW1ldGVyPnNyYzwvcGFyYW1ldGVyPiBpbnRvCjxwYXJhbWV0ZXI+ZHN0PC9wYXJhbWV0ZXI+IGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29udGFpbmluZyB0aGUKY2hhci4gIDxwYXJhbWV0ZXI+c3JjPC9wYXJhbWV0ZXI+IG51c3QgYmUgYXQgbGVhc3QKPHBhcmFtZXRlcj5sZW48L3BhcmFtZXRlcj4gYnl0ZXMgbG9uZy4KQEAKCkBSRVRACQlpbnQgCkBGVU5DQAkJRmNVY3M0VG9VdGY4CkBUWVBFMUAJCUZjQ2hhcjMyIAkJCUBBUkcxQAkJc3JjCSAKQFRZUEUyQAkJRmNDaGFyOCAJCQlAQVJHMkAJCWRzdFtGQ19VVEY4X01BWF9MRU5dCkBQVVJQT1NFQAljb252ZXJ0IFVDUzQgdG8gVVRGLTgKQERFU0NACkNvbnZlcnRzIHRoZSBVbmljb2RlIGNoYXIgZnJvbSA8cGFyYW1ldGVyPnNyYzwvcGFyYW1ldGVyPiBpbnRvCjxwYXJhbWV0ZXI+ZHN0PC9wYXJhbWV0ZXI+IGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIGVuY29kZQp0aGUgY2hhci4KQEAKCkBSRVRACQlGY0Jvb2wgCkBGVU5DQAkJRmNVdGY4TGVuCkBUWVBFMUAJCUZjQ2hhcjggKgkJCUBBUkcxQAkJc3JjCkBUWVBFMkAJCWludCAJCQkJQEFSRzJACQlsZW4KQFRZUEUzQAkJaW50ICoJCQkJQEFSRzNACQluY2hhcgpAVFlQRTRACQlpbnQgKgkJCQlAQVJHNEAJCXdjaGFyCkBQVVJQT1NFQAljb3VudCBVVEYtOCBlbmNvZGVkIGNoYXJzCkBERVNDQApDb3VudHMgdGhlIG51bWJlciBvZiBVbmljb2RlIGNoYXJzIGluIDxwYXJhbWV0ZXI+bGVuPC9wYXJhbWV0ZXI+IGJ5dGVzIG9mCjxwYXJhbWV0ZXI+c3JjPC9wYXJhbWV0ZXI+LiAgUGxhY2VzIHRoYXQgY291bnQgaW4KPHBhcmFtZXRlcj5uY2hhcjwvcGFyYW1ldGVyPi4gIDxwYXJhbWV0ZXI+d2NoYXI8L3BhcmFtZXRlcj4gY29udGFpbnMgMSwgMiBvcgo0IGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBob2xkIHRoZSBsYXJnZXN0IHVuaWNvZGUgY2hhcgpjb3VudGVkLiAgVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciA8cGFyYW1ldGVyPnNyYzwvcGFyYW1ldGVyPiBpcyBhCndlbGwtZm9ybWVkIFVURjggc3RyaW5nLgpAQAoKQFJFVEAJCWludCAKQEZVTkNACQlGY1V0ZjE2VG9VY3M0CkBUWVBFMUAJCUZjQ2hhcjggKgkJCUBBUkcxQAkJc3JjCkBUWVBFMkAJCUZjRW5kaWFuIAkJCUBBUkcyQAkJZW5kaWFuCkBUWVBFM0AJCUZjQ2hhcjMyICoJCQlAQVJHM0AJCWRzdApAVFlQRTRACQlpbnQgCQkJCUBBUkc0QAkJbGVuCkBQVVJQT1NFQAljb252ZXJ0IFVURi0xNiB0byBVQ1M0CkBERVNDQApDb252ZXJ0cyB0aGUgbmV4dCBVbmljb2RlIGNoYXIgZnJvbSA8cGFyYW1ldGVyPnNyYzwvcGFyYW1ldGVyPiBpbnRvCjxwYXJhbWV0ZXI+ZHN0PC9wYXJhbWV0ZXI+IGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29udGFpbmluZyB0aGUKY2hhci4gPHBhcmFtZXRlcj5zcmM8L3BhcmFtZXRlcj4gbXVzdCBiZSBhdCBsZWFzdCA8cGFyYW1ldGVyPmxlbjwvcGFyYW1ldGVyPgpieXRlcyBsb25nLiAgQnl0ZXMgb2YgPHBhcmFtZXRlcj5zcmM8L3BhcmFtZXRlcj4gYXJlIGNvbWJpbmVkIGludG8gMTYtYml0CnVuaXRzIGFjY29yZGluZyB0byA8cGFyYW1ldGVyPmVuZGlhbjwvcGFyYW1ldGVyPi4KQEAKCkBSRVRACQlGY0Jvb2wKQEZVTkNACQlGY1V0ZjE2TGVuCkBUWVBFMUAJCUZjQ2hhcjggKgkJCUBBUkcxQAkJc3JjCkBUWVBFMkAJCUZjRW5kaWFuIAkJCUBBUkcyQAkJZW5kaWFuCkBUWVBFM0AJCWludCAJCQkJQEFSRzNACQlsZW4KQFRZUEU0QAkJaW50ICoJCQkJQEFSRzRACQluY2hhcgpAVFlQRTVACQlpbnQgKgkJCQlAQVJHNUAJCXdjaGFyCkBQVVJQT1NFQAljb3VudCBVVEYtMTYgZW5jb2RlZCBjaGFycwpAREVTQ0AKQ291bnRzIHRoZSBudW1iZXIgb2YgVW5pY29kZSBjaGFycyBpbiA8cGFyYW1ldGVyPmxlbjwvcGFyYW1ldGVyPiBieXRlcyBvZgo8cGFyYW1ldGVyPnNyYzwvcGFyYW1ldGVyPi4gIEJ5dGVzIG9mIDxwYXJhbWV0ZXI+c3JjPC9wYXJhbWV0ZXI+IGFyZQpjb21iaW5lZCBpbnRvIDE2LWJpdCB1bml0cyBhY2NvcmRpbmcgdG8gPHBhcmFtZXRlcj5lbmRpYW48L3BhcmFtZXRlcj4uClBsYWNlcyB0aGF0IGNvdW50IGluIDxwYXJhbWV0ZXI+bmNoYXI8L3BhcmFtZXRlcj4uCjxwYXJhbWV0ZXI+d2NoYXI8L3BhcmFtZXRlcj4gY29udGFpbnMgMSwgMiBvciA0IGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mCmJ5dGVzIG5lZWRlZCB0byBob2xkIHRoZSBsYXJnZXN0IHVuaWNvZGUgY2hhciBjb3VudGVkLiAgVGhlIHJldHVybiB2YWx1ZQppbmRpY2F0ZXMgd2hldGhlciA8cGFyYW1ldGVyPnN0cmluZzwvcGFyYW1ldGVyPiBpcyBhIHdlbGwtZm9ybWVkIFVURjE2CnN0cmluZy4KQEAKCkBSRVRACQlGY0NoYXI4ICoKQEZVTkNACQlGY1N0ckNvcHkKQFRZUEUxQAkJY29uc3QgRmNDaGFyOCAqCQkJQEFSRzFACQlzCkBQVVJQT1NFQAlkdXBsaWNhdGUgYSBzdHJpbmcKQERFU0NACkFsbG9jYXRlcyBtZW1vcnksIGNvcGllcyA8cGFyYW1ldGVyPnM8L3BhcmFtZXRlcj4gYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZwpidWZmZXIuICBZZXMsIHRoaXMgaXMgPGZ1bmN0aW9uPnN0cmR1cDwvZnVuY3Rpb24+LCBidXQgdGhhdCBmdW5jdGlvbiBpc24ndAphdmFpbGFibGUgb24gZXZlcnkgcGxhdGZvcm0uCkBACgpAUkVUQAkJRmNDaGFyOCAqCkBGVU5DQAkJRmNTdHJDb3B5RmlsZW5hbWUKQFRZUEUxQAkJY29uc3QgRmNDaGFyOCAqCQkJQEFSRzFACQlzCkBQVVJQT1NFQAljb3B5IGEgc3RyaW5nLCBleHBhbmRpbmcgJ34nCkBERVNDQApKdXN0IGxpa2UgRmNTdHJDb3B5IGV4Y2VwdCB0aGF0IGl0IGNvbnZlcnRzIGFueSBsZWFkaW5nICd+JyBjaGFyYWN0ZXJzIGluCjxwYXJhbWV0ZXI+czwvcGFyYW1ldGVyPiB0byB0aGUgdmFsdWUgb2YgdGhlIEhPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUuClJldHVybnMgTlVMTCBpZiAnficgaXMgcHJlc2VudCBpbiA8cGFyYW1ldGVyPnM8L3BhcmFtZXRlcj4gYW5kIEhPTUUgaXMgdW5zZXQuCkBACgpAUkVUQAkJaW50CkBGVU5DQAkJRmNTdHJDbXBJZ25vcmVDYXNlCkBUWVBFMUAJCWNvbnN0IGNoYXIgKgkJCUBBUkcxQAkJczEKQFRZUEUyQAkJY29uc3QgY2hhciAqCQkJQEFSRzJACQlzMgpAUFVSUE9TRUAJY29tcGFyZSBVVEYtOCBzdHJpbmdzIGlnbm9yaW5nIEFTQ0lJIGNhc2UKQERFU0NAClJldHVybnMgdGhlIHVzdWFsICZsdDswLCAwLCAmZ3Q7MCByZXN1bHQgb2YgY29tcGFyaW5nCjxwYXJhbWV0ZXI+czE8L3BhcmFtZXRlcj4gYW5kIDxwYXJhbWV0ZXI+czI8L3BhcmFtZXRlcj4uICBUaGlzIHRlc3QgaXMKY2FzZS1pbnNlbnNpdGl2ZSBpbiB0aGUgQVNDSUkgcmFuZ2UgYW5kIHdpbGwgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIFVURjgKZW5jb2RlZCBzdHJpbmdzLCBhbHRob3VnaCBpdCBkb2VzIG5vdCBjaGVjayBmb3Igd2VsbCBmb3JtZWQgc3RyaW5ncy4KQEAKCkBSRVRACQlGY0NoYXI4ICoKQEZVTkNACQlGY1N0ckRpcm5hbWUKQFRZUEUxQAkJY29uc3QgRmNDaGFyOCAqCQkJQEFSRzFACQlmaWxlCkBQVVJQT1NFQAlkaXJlY3RvcnkgcGFydCBvZiBmaWxlbmFtZQpAREVTQ0AKUmV0dXJucyB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgPHBhcmFtZXRlcj5maWxlPC9wYXJhbWV0ZXI+LiAgVGhpcwppcyByZXR1cm5lZCBpbiBuZXdseSBhbGxvY2F0ZWQgc3RvcmFnZSB3aGljaCBzaG91bGQgYmUgZnJlZWQgd2hlbiBubyBsb25nZXIKbmVlZGVkLgpAQAoKQFJFVEAJCUZjQ2hhcjggKgpARlVOQ0AJCUZjU3RyQmFzZW5hbWUKQFRZUEUxQAkJY29uc3QgRmNDaGFyOCAqCQkJQEFSRzFACQlmaWxlCkBQVVJQT1NFQAlsYXN0IGNvbXBvbmVudCBvZiBmaWxlbmFtZQpAREVTQ0AKUmV0dXJucyB0aGUgZmlsZW5hbWUgb2YgPHBhcmFtZXRlcj5maWxlPC9wYXJhbWV0ZXI+IHN0cmlwcGVkIG9mIGFueSBsZWFkaW5nCmRpcmVjdG9yeSBuYW1lcy4gIFRoaXMgaXMgcmV0dXJuZWQgaW4gbmV3bHkgYWxsb2NhdGVkIHN0b3JhZ2Ugd2hpY2ggc2hvdWxkCmJlIGZyZWVkIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KQEAK