LyoKICogJElkJAogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KICAgIDx2YXJpYWJsZWxpc3Q+CgpAUkVUQAkJRmNTdHJTZXQgKgkKQEZVTkNACQlGY1N0clNldENyZWF0ZSAKQFRZUEUxQAkJdm9pZApAUFVSUE9TRUAJY3JlYXRlIGEgc3RyaW5nIHNldApAREVTQ0AKQ3JlYXRlIGFuIGVtcHR5IHNldC4KQEAKCkBSRVRACQlGY0Jvb2wKQEZVTkNACQlGY1N0clNldE1lbWJlcgpAVFlQRTFACQlGY1N0clNldCAqCQkJQEFSRzFACQlzZXQKQFRZUEUyQAkJY29uc3QgRmNDaGFyOCAqCQkJQEFSRzJACQlzCQpAUFVSUE9TRUAJY2hlY2sgc2V0IGZvciBtZW1iZXJzaGlwCkBERVNDQApSZXR1cm5zIHdoZXRoZXIgPHBhcmFtZXRlcj5zPC9wYXJhbWV0ZXI+IGlzIGEgbWVtYmVyIG9mCjxwYXJhbWV0ZXI+c2V0PC9wYXJhbWV0ZXI+LgpAQAoKQFJFVEAJCUZjQm9vbApARlVOQ0AJCUZjU3RyU2V0QWRkCkBUWVBFMUAJCUZjU3RyU2V0ICoJCQlAQVJHMUAJCXNldApAVFlQRTJACQljb25zdCBGY0NoYXI4ICoJCQlAQVJHMkAJCXMJCkBQVVJQT1NFQAlhZGQgdG8gYSBzdHJpbmcgc2V0CkBERVNDQApBZGRzIGEgY29weSBvZiA8cGFyYW1ldGVyPnM8L3BhcmFtZXRlcj4gdG8gPHBhcmFtZXRlcj5zZXQ8L3BhcmFtZXRlcj4uCkBACgpAUkVUQAkJRmNCb29sCkBGVU5DQAkJRmNTdHJTZXRBZGRGaWxlbmFtZQpAVFlQRTFACQlGY1N0clNldCAqCQkJQEFSRzFACQlzZXQKQFRZUEUyQAkJY29uc3QgRmNDaGFyOCAqCQkJQEFSRzJACQlzCQpAUFVSUE9TRUAJYWRkIGEgZmlsZW5hbWUgdG8gYSBzdHJpbmcgc2V0CkBERVNDQApBZGRzIGEgY29weSA8cGFyYW1ldGVyPnM8L3BhcmFtZXRlcj4gdG8gPHBhcmFtZXRlcj5zZXQ8L3BhcmFtZXRlcj4sIFRoZSBjb3B5CmlzIGNyZWF0ZWQgd2l0aCBGY1N0ckNvcHlGaWxlbmFtZSBzbyB0aGF0IGxlYWRpbmcgJ34nIHZhbHVlcyBhcmUgcmVwbGFjZWQKd2l0aCB0aGUgdmFsdWUgb2YgdGhlIEhPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUuCkBACgpAUkVUQAkJRmNCb29sCkBGVU5DQAkJRmNTdHJTZXREZWwKQFRZUEUxQAkJRmNTdHJTZXQgKgkJCUBBUkcxQAkJc2V0CkBUWVBFMkAJCWNvbnN0IEZjQ2hhcjggKgkJCUBBUkcyQAkJcwkKQFBVUlBPU0VACWRlbGV0ZSBmcm9tIGEgc3RyaW5nIHNldApAREVTQ0AKUmVtb3ZlcyA8cGFyYW1ldGVyPnM8L3BhcmFtZXRlcj4gZnJvbSA8cGFyYW1ldGVyPnNldDwvcGFyYW1ldGVyPiwgcmV0dXJuaW5nCkZjVHJ1ZSBpZiA8cGFyYW1ldGVyPnM8L3BhcmFtZXRlcj4gd2FzIGEgbWVtYmVyIGVsc2UgRmNGYWxzZS4KQEAKCkBSRVRACQl2b2lkCkBGVU5DQAkJRmNTdHJTZXREZXN0cm95CkBUWVBFMUAJCUZjU3RyU2V0ICoJCQlAQVJHMUAJCXNldAkKQFBVUlBPU0VACWRlc3Ryb3kgYSBzdHJpbmcgc2V0CkBERVNDQApEZXN0cm95cyA8cGFyYW1ldGVyPnNldDwvcGFyYW1ldGVyPi4KQEAKCkBSRVRACQlGY1N0ckxpc3QgKgpARlVOQ0AJCUZjU3RyTGlzdENyZWF0ZQpAVFlQRTFACQlGY1N0clNldCAqCQkJQEFSRzFACQlzZXQJCkBQVVJQT1NFQAljcmVhdGUgYSBzdHJpbmcgaXRlcmF0b3IKQERFU0NACkNyZWF0ZXMgYW4gaXRlcmF0b3IgdG8gbGlzdCB0aGUgc3RyaW5ncyBpbiA8cGFyYW1ldGVyPnNldDwvcGFyYW1ldGVyPi4KQEAKCkBSRVRACQlGY0NoYXI4ICoKQEZVTkNACQlGY1N0ckxpc3ROZXh0CkBUWVBFMUAJCUZjU3RyTGlzdCAqCQkJQEFSRzFACQlsaXN0CQpAUFVSUE9TRUAJZ2V0IG5leHQgc3RyaW5nIGluIGl0ZXJhdGlvbgpAREVTQ0AKUmV0dXJucyB0aGUgbmV4dCBzdHJpbmcgaW4gPHBhcmFtZXRlcj5zZXQ8L3BhcmFtZXRlcj4uCkBACgpAUkVUQAkJdm9pZApARlVOQ0AJCUZjU3RyTGlzdERvbmUKQFRZUEUxQAkJRmNTdHJMaXN0ICoJCQlAQVJHMUAJCWxpc3QJCkBQVVJQT1NFQAlkZXN0cm95IGEgc3RyaW5nIGl0ZXJhdG9yCkBERVNDQApEZXN0cm95cyB0aGUgZW51bWVyYXRvciA8cGFyYW1ldGVyPmxpc3Q8L3BhcmFtZXRlcj4uCkBACg==