LyoKICogJElkJAogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KQFJFVEAJCUZjT2JqZWN0U2V0ICoKQEZVTkNACQlGY09iamVjdFNldENyZWF0ZQpAVFlQRTFACQl2b2lkCkBQVVJQT1NFQAlDcmVhdGUgYW4gb2JqZWN0IHNldApAREVTQ0AKQ3JlYXRlcyBhbiBlbXB0eSBzZXQuCkBACgpAUkVUQAkJRmNCb29sCkBGVU5DQAkJRmNPYmplY3RTZXRBZGQKQFRZUEUxQAkJRmNPYmplY3RTZXQgKgkJCUBBUkcxQAkJb3MKQFRZUEUyQAkJY29uc3QgY2hhciAqCQkJQEFSRzJACQlvYmplY3QKQFBVUlBPU0VACUFkZCB0byBhbiBvYmplY3Qgc2V0CkBERVNDQApBZGRzIGEgcHJvcHJldHkgbmFtZSB0byB0aGUgc2V0LgpAQAoKQFJFVEAJCXZvaWQKQEZVTkNACQlGY09iamVjdFNldERlc3Ryb3kKQFRZUEUxQAkJRmNPYmplY3RTZXQgKgkJCUBBUkcxQAkJb3MKQFBVUlBPU0VACURlc3Ryb3kgYW4gb2JqZWN0IHNldApAREVTQ0AKRGVzdHJveXMgYW4gb2JqZWN0IHNldC4KQEAKCkBSRVRACQlGY09iamVjdFNldCAqCkBGVU5DQAkJRmNPYmplY3RTZXRCdWlsZApAVFlQRTFACQljb25zdCBjaGFyICoJCQlAQVJHMUAJCWZpcnN0CkBUWVBFMkAJCS4uLgpAUFJPVE9UWVBFK0AKQFJFVCtACQlGY09iamVjdFNldCAqCkBGVU5DK0AJCUZjT2JqZWN0U2V0VmFCdWlsZApAVFlQRTErQAljb25zdCBjaGFyICoJCQlAQVJHMStACQlmaXJzdApAVFlQRTIrQAl2YV9saXN0CQkJCUBBUkcyK0AJCXZhCkBQVVJQT1NFQAlCdWlsZCBvYmplY3Qgc2V0IGZyb20gYXJncwpAREVTQ0AKVGhlc2UgYnVpbGQgYW4gb2JqZWN0IHNldCBmcm9tIGEgbnVsbC10ZXJtaW5hdGVkIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMuCkBACg==