LyoKICogJElkJAogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCkBSRVRAICAgICAgICAgICBGY0F0b21pYyAqCkBGVU5DQCAgICAgICAgICBGY0F0b21pY0NyZWF0ZQpAVFlQRTFAICAgICAgICAgY29uc3QgRmNDaGFyOCAgICogICAgICAgICAgIAlAQVJHMUAgICAgICAgICAgZmlsZQpAUFVSUE9TRUAJY3JlYXRlIGFuIEZjQXRvbWljIG9iamVjdApAREVTQ0AKQ3JlYXRlcyBhIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgZGF0YSBuZWVkZWQgdG8gY29udHJvbCBhY2Nlc3MgdG8gPHBhcmFtZXRlcj5maWxlPC9wYXJhbWV0ZXI+LgpXcml0aW5nIGlzIGRvbmUgdG8gYSBzZXBhcmF0ZSBmaWxlLiAgT25jZSB0aGF0IGZpbGUgaXMgY29tcGxldGUsIHRoZSBvcmlnaW5hbApjb25maWd1cmF0aW9uIGZpbGUgaXMgYXRvbWljYWxseSByZXBsYWNlZCBzbyB0aGF0IHJlYWRpbmcgcHJvY2VzcyBhbHdheXMgc2VlCmEgY29uc2lzdGVudCBhbmQgY29tcGxldGUgZmlsZSB3aXRob3V0IHRoZSBuZWVkIHRvIGxvY2sgZm9yIHJlYWRpbmcuCkBACgpAUkVUQCAgICAgICAgICAgRmNCb29sCkBGVU5DQCAgICAgICAgICBGY0F0b21pY0xvY2sKQFRZUEUxQCAgICAgICAgIEZjQXRvbWljICogICAgICAgICAgICAgICAgICAgICAgQEFSRzFAICAgICAgICAgIGF0b21pYwpAUFVSUE9TRUAJbG9jayBhIGZpbGUKQERFU0NACkF0dGVtcHRzIHRvIGxvY2sgdGhlIGZpbGUgcmVmZXJlbmNlZCBieSA8cGFyYW1ldGVyPmF0b21pYzwvcGFyYW1ldGVyPi4gIFJldHVybnMgRmNGYWxzZSBpZiB0aGUKZmlsZSBpcyBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLCBlbHNlIHJldHVybnMgRmNUcnVlIGFuZCBsZWF2ZXMgdGhlIGZpbGUKbG9ja2VkLgpAQAoKQFJFVEAgICAgICAgICAgIEZjQ2hhcjggKgpARlVOQ0AgICAgICAgICAgRmNBdG9taWNOZXdGaWxlCkBUWVBFMUAgICAgICAgICBGY0F0b21pYyAqICAgICAgICAgICAgICAgICAgICAgIEBBUkcxQCAgICAgICAgICBhdG9taWMKQFBVUlBPU0VACXJldHVybiBuZXcgdGVtcG9yYXJ5IGZpbGUgbmFtZSAKQERFU0NAClJldHVybnMgdGhlIGZpbGVuYW1lIGZvciB3cml0aW5nIGEgbmV3IHZlcnNpb24gb2YgdGhlIGZpbGUgcmVmZXJlbmNlZApieSA8cGFyYW1ldGVyPmF0b21pYzwvcGFyYW1ldGVyPi4KQEAKCkBSRVRAICAgICAgICAgICBGY0NoYXI4ICoKQEZVTkNAICAgICAgICAgIEZjQXRvbWljT3JpZ0ZpbGUKQFRZUEUxQCAgICAgICAgIEZjQXRvbWljICogICAgICAgICAgICAgICAgICAgICAgQEFSRzFAICAgICAgICAgIGF0b21pYwpAUFVSUE9TRUAJcmV0dXJuIG9yaWdpbmFsIGZpbGUgbmFtZQpAREVTQ0AKUmV0dXJucyB0aGUgZmlsZSByZWZlcm5jZWQgYnkgPHBhcmFtZXRlcj5hdG9taWM8L3BhcmFtZXRlcj4uCkBACgpAUkVUQCAgICAgICAgICAgRmNCb29sCkBGVU5DQCAgICAgICAgICBGY0F0b21pY1JlcGxhY2VPcmlnCkBUWVBFMUAgICAgICAgICBGY0F0b21pYyAqICAgICAgICAgICAgICAgICAgICAgIEBBUkcxQCAgICAgICAgICBhdG9taWMKQFBVUlBPU0VACXJlcGxhY2Ugb3JpZ2luYWwgd2l0aCBuZXcKQERFU0NAClJlcGxhY2VzIHRoZSBvcmlnaW5hbCBmaWxlIHJlZmVyZW5jZWQgYnkgPHBhcmFtZXRlcj5hdG9taWM8L3BhcmFtZXRlcj4gd2l0aCB0aGUgbmV3IGZpbGUuCkBACgpAUkVUQCAgICAgICAgICAgdm9pZApARlVOQ0AgICAgICAgICAgRmNBdG9taWNEZWxldGVOZXcKQFRZUEUxQCAgICAgICAgIEZjQXRvbWljICogICAgICAgICAgICAgICAgICAgICAgQEFSRzFAICAgICAgICAgIGF0b21pYwpAUFVSUE9TRUAJZGVsZXRlIG5ldyBmaWxlCkBERVNDQApEZWxldGVzIHRoZSBuZXcgZmlsZS4gIFVzZWQgaW4gZXJyb3IgcmVjb3ZlcnkgdG8gYmFjayBvdXQgY2hhbmdlcy4KQEAKCkBSRVRAICAgICAgICAgICB2b2lkCkBGVU5DQCAgICAgICAgICBGY0F0b21pY1VubG9jawpAVFlQRTFAICAgICAgICAgRmNBdG9taWMgKiAgICAgICAgICAgICAgICAgICAgICBAQVJHMUAgICAgICAgICAgYXRvbWljCkBQVVJQT1NFQAl1bmxvY2sgYSBmaWxlCkBERVNDQApVbmxvY2tzIHRoZSBmaWxlLgpAQAoKQFJFVEAgICAgICAgICAgIHZvaWQKQEZVTkNAICAgICAgICAgIEZjQXRvbWljRGVzdHJveQpAVFlQRTFAICAgICAgICAgRmNBdG9taWMgKiAgICAgICAgICAgICAgICAgICAgICBAQVJHMUAgICAgICAgICAgYXRvbWljCkBQVVJQT1NFQAlkZXN0cm95IGFuIEZjQXRvbWljIG9iamVjdApAREVTQ0AKRGVzdHJveXMgPHBhcmFtZXRlcj5hdG9taWM8L3BhcmFtZXRlcj4uCkBACg==