LyoKICogJElkJAogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KQFJFVEAgICAgICAgICAgIEZjQ29uZmlnICoKQEZVTkNAICAgICAgICAgIEZjQ29uZmlnQ3JlYXRlCkBUWVBFMUAJCXZvaWQKQFBVUlBPU0VACUNyZWF0ZSBhIGNvbmZpZ3VyYXRpb24KQERFU0NACkNyZWF0ZXMgYW4gZW1wdHkgY29uZmlndXJhdGlvbi4KQEAKCkBSRVRAICAgICAgICAgICB2b2lkCkBGVU5DQCAgICAgICAgICBGY0NvbmZpZ0Rlc3Ryb3kKQFRZUEUxQCAgICAgICAgIEZjQ29uZmlnICogICAgICAgICAgICAgICAgICAgICAgQEFSRzFAICAgICAgICAgIGNvbmZpZwpAUFVSUE9TRUAJRGVzdHJveSBhIGNvbmZpZ3VyYXRpb24KQERFU0NACkRlc3Ryb3lzIGEgY29uZmlndXJhdGlvbiBhbmQgYW55IGRhdGEgYXNzb2NpYXRlZCB3aXRoIGl0LiAgTm90ZSB0aGF0IGNhbGxpbmcKdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSByZXR1cm4gZnJvbSBGY0NvbmZpZ0dldEN1cnJlbnQgd2lsbCBwbGFjZSB0aGUgbGlicmFyeQppbiBhbiBpbmRldGVybWluYXRlIHN0YXRlLgpAQAoKQFJFVEAgICAgICAgICAgIEZjQm9vbApARlVOQ0AgICAgICAgICAgRmNDb25maWdTZXRDdXJyZW50CkBUWVBFMUAgICAgICAgICBGY0NvbmZpZyAqICAgICAgICAgICAgICAgICAgICAgIEBBUkcxQCAgICAgICAgICBjb25maWcKQFBVUlBPU0VACVNldCBjb25maWd1cmF0aW9uIGFzIGRlZmF1bHQKQERFU0NAClNldHMgdGhlIGN1cnJlbnQgZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIDxwYXJhbWV0ZXI+Y29uZmlnPC9wYXJhbWV0ZXI+LiAgSW1wbGljaXRseSBjYWxscwpGY0NvbmZpZ0J1aWxkRm9udHMgaWYgbmVjZXNzYXJ5LCByZXR1cm5pbmcgRmNGYWxzZSBpZiB0aGF0IGNhbGwgZmFpbHMuCkBACgpAUkVUQCAgICAgICAgICAgRmNDb25maWcgKgpARlVOQ0AgICAgICAgICAgRmNDb25maWdHZXRDdXJyZW50CkBUWVBFMUAJCXZvaWQKQFBVUlBPU0VACVJldHVybiBjdXJyZW50IGNvbmZpZ3VyYXRpb24KQERFU0NAClJldHVybnMgdGhlIGN1cnJlbnQgZGVmYXVsdCBjb25maWd1cmF0aW9uLgpAQAoKQFJFVEAgICAgICAgICAgIEZjQm9vbApARlVOQ0AgICAgICAgICAgRmNDb25maWdVcHRvRGF0ZQpAVFlQRTFAICAgICAgICAgRmNDb25maWcgKiAgICAgICAgICAgICAgICAgICAgICBAQVJHMUAgICAgICAgICAgY29uZmlnCkBQVVJQT1NFQAlDaGVjayB0aW1lc3RhbXBzIG9uIGNvbmZpZyBmaWxlcwpAREVTQ0AKQ2hlY2tzIGFsbCBvZiB0aGUgZmlsZXMgcmVsYXRlZCB0byA8cGFyYW1ldGVyPmNvbmZpZzwvcGFyYW1ldGVyPiBhbmQgcmV0dXJucyB3aGV0aGVyIHRoZQppbi1tZW1vcnkgdmVyc2lvbiBpcyBpbiBzeW5jIHdpdGggdGhlIGRpc2sgdmVyc2lvbi4KQEAKCkBSRVRAICAgICAgICAgICBGY0Jvb2wKQEZVTkNAICAgICAgICAgIEZjQ29uZmlnQnVpbGRGb250cwpAVFlQRTFAICAgICAgICAgRmNDb25maWcgKiAgICAgICAgICAgICAgICAgICAgICBAQVJHMUAgICAgICAgICAgY29uZmlnCkBQVVJQT1NFQAlCdWlsZCBmb250IGRhdGFiYXNlCkBERVNDQApCdWlsZHMgdGhlIHNldCBvZiBhdmFpbGFibGUgZm9udHMgZm9yIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLiAgTm90ZSB0aGF0CmFueSBjaGFuZ2VzIHRvIHRoZSBjb25maWd1cmF0aW9uIGFmdGVyIHRoaXMgY2FsbCBoYXZlIGluZGV0ZXJtaW5hdGUgZWZmZWN0cy4KUmV0dXJucyBGY0ZhbHNlIGlmIHRoaXMgb3BlcmF0aW9uIHJ1bnMgb3V0IG9mIG1lbW9yeS4KQEAKCkBSRVRAICAgICAgICAgICBGY1N0ckxpc3QgKgpARlVOQ0AgICAgICAgICAgRmNDb25maWdHZXRDb25maWdEaXJzCkBUWVBFMUAgICAgICAgICBGY0NvbmZpZyAqICAgICAgICAgICAgICAgICAgICAgIEBBUkcxQCAgICAgICAgICBjb25maWcKQFBVUlBPU0VACUdldCBjb25maWcgZGlyZWN0b3JpZXMKQERFU0NAClJldHVybnMgdGhlIGxpc3Qgb2YgZm9udCBkaXJlY3RvcmllcyBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMKZm9yIDxwYXJhbWV0ZXI+Y29uZmlnPC9wYXJhbWV0ZXI+LiAgRG9lcyBub3QgaW5jbHVkZSBhbnkgc3ViZGlyZWN0b3JpZXMuCkBACgpAUkVUQCAgICAgICAgICAgRmNTdHJMaXN0ICoKQEZVTkNAICAgICAgICAgIEZjQ29uZmlnR2V0Rm9udERpcnMKQFRZUEUxQCAgICAgICAgIEZjQ29uZmlnICogICAgICAgICAgICAgICAgICAgICAgQEFSRzFAICAgICAgICAgIGNvbmZpZwpAUFVSUE9TRUAJR2V0IGZvbnQgZGlyZWN0b3JpZXMKQERFU0NAClJldHVybnMgdGhlIGxpc3Qgb2YgZm9udCBkaXJlY3RvcmllcyBpbiA8cGFyYW1ldGVyPmNvbmZpZzwvcGFyYW1ldGVyPi4gVGhpcyBpbmNsdWRlcyB0aGUKY29uZmlndXJlZCBmb250IGRpcmVjdG9yaWVzIGFsb25nIHdpdGggYW55IGRpcmVjdG9yaWVzIGJlbG93IHRob3NlIGluIHRoZQpmaWxlc3lzdGVtLgpAQAoKQFJFVEAgICAgICAgICAgIEZjU3RyTGlzdCAqCkBGVU5DQCAgICAgICAgICBGY0NvbmZpZ0dldENvbmZpZ0ZpbGVzCkBUWVBFMUAgICAgICAgICBGY0NvbmZpZyAqICAgICAgICAgICAgICAgICAgICAgIEBBUkcxQCAgICAgICAgICBjb25maWcKQFBVUlBPU0VACUdldCBjb25maWcgZmlsZXMKQERFU0NAClJldHVybnMgdGhlIGxpc3Qgb2Yga25vd24gY29uZmlndXJhdGlvbiBmaWxlcyB1c2VkIHRvIGdlbmVyYXRlIDxwYXJhbWV0ZXI+Y29uZmlnPC9wYXJhbWV0ZXI+LgpOb3RlIHRoYXQgdGhpcyB3aWxsIG5vdCBpbmNsdWRlIGFueSBjb25maWd1cmF0aW9uIGRvbmUgd2l0aCBGY0NvbmZpZ1BhcnNlLgpAQAoKQFJFVEAgICAgICAgICAgIGNoYXIgKgpARlVOQ0AgICAgICAgICAgRmNDb25maWdHZXRDYWNoZQpAVFlQRTFAICAgICAgICAgRmNDb25maWcgKiAgICAgICAgICAgICAgICAgICAgICBAQVJHMUAgICAgICAgICAgY29uZmlnCkBQVVJQT1NFQAlHZXQgY2FjaGUgZmlsZW5hbWUKQERFU0NAClJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdXNlZCB0byBzdG9yZSBwZXItdXNlciBmb250IGluZm9ybWF0aW9uLgpAQAoKQFJFVEAgICAgICAgICAgIEZjRm9udFNldCAqCkBGVU5DQCAgICAgICAgICBGY0NvbmZpZ0dldEZvbnRzCkBUWVBFMUAgICAgICAgICBGY0NvbmZpZyAqCQkJQEFSRzFACQljb25maWcKQFRZUEUyQAkJRmNTZXROYW1lICAgICAgICAgICAgICAgICAgICAgICBAQVJHMkAgICAgICAgICAgc2V0CkBQVVJQT1NFQAlHZXQgY29uZmlnIGZvbnQgc2V0CkBERVNDQApSZXR1cm5zIG9uZSBvZiB0aGUgdHdvIHNldHMgb2YgZm9udHMgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBhcyBzcGVjaWZpZWQKYnkgPHBhcmFtZXRlcj5zZXQ8L3BhcmFtZXRlcj4uCkBACgpAUkVUQCAgICAgICAgICAgRmNCbGFua3MgKgpARlVOQ0AgICAgICAgICAgRmNDb25maWdHZXRCbGFua3MKQFRZUEUxQCAgICAgICAgIEZjQ29uZmlnICogICAgICAgICAgICAgICAgICAgICAgQEFSRzFAICAgICAgICAgIGNvbmZpZwpAUFVSUE9TRUAJR2V0IGNvbmZpZyBibGFua3MKQERFU0NAClJldHVybnMgdGhlIEZjQmxhbmtzIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24sIGlmIG5vCmJsYW5rcyB3ZXJlIHByZXNlbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gMC4KQEAKCkBSRVRAICAgICAgICAgICBpbnQKQEZVTkNAICAgICAgICAgIEZjQ29uZmlnR2V0UmVzY2FuSW52ZXJ2YWwKQFRZUEUxQCAgICAgICAgIEZjQ29uZmlnICogICAgICAgICAgICAgICAgICAgICAgQEFSRzFAICAgICAgICAgIGNvbmZpZwpAUFVSUE9TRUAJR2V0IGNvbmZpZyByZXNjYW4gaW50ZXJ2YWwKQERFU0NAClJldHVybnMgdGhlIGludGVydmFsIGJldHdlZW4gYXV0b21hdGljIGNoZWNrcyBvZiB0aGUgY29uZmlndXJhdGlvbiAoaW4Kc2Vjb25kcykgc3BlY2lmaWVkIGluIDxwYXJhbWV0ZXI+Y29uZmlnPC9wYXJhbWV0ZXI+LiAgVGhlIGNvbmZpZ3VyYXRpb24gaXMgY2hlY2tlZCBkdXJpbmcKYSBjYWxsIHRvIEZjRm9udExpc3Qgd2hlbiB0aGlzIGludGVydmFsIGhhcyBwYXNzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCkBACgpAUkVUQCAgICAgICAgICAgRmNCb29sCkBGVU5DQCAgICAgICAgICBGY0NvbmZpZ1NldFJlc2NhbkludmVydmFsCkBUWVBFMUAgICAgICAgICBGY0NvbmZpZyAqCQkJQEFSRzFACQljb25maWcKQFRZUEUyQAkJaW50ICAgICAgICAgICAgICAgICAgICAgICAJQEFSRzJAICAgICAgICAgIHJlc2NhbkludGVydmFsCkBQVVJQT1NFQAlTZXQgY29uZmlnIHJlc2NhbiBpbnRlcnZhbApAREVTQ0AKU2V0cyB0aGUgcmVzY2FuIGludGVydmFsOyByZXR1cm5zIEZjRmFsc2UgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCkBACgpAUkVUQCAgICAgICAgICAgRmNCb29sCkBGVU5DQCAgICAgICAgICBGY0NvbmZpZ0FwcEZvbnRBZGRGaWxlCkBUWVBFMUAgICAgICAgICBGY0NvbmZpZyAqCQkJQEFSRzFACQljb25maWcKQFRZUEUyQAkJY29uc3QgY2hhciAqICAgICAgICAgICAgICAgICAgICBAQVJHMkAgICAgICAgICAgZmlsZQpAUFVSUE9TRUAJQWRkIGZvbnQgZmlsZSB0byBmb250IGRhdGFiYXNlCkBERVNDQApBZGRzIGFuIGFwcGxpY2F0aW9uLXNwZWNpZmljIGZvbnQgdG8gdGhlIGNvbmZpZ3VyYXRpb24uCkBACgpAUkVUQCAgICAgICAgICAgRmNCb29sCkBGVU5DQCAgICAgICAgICBGY0NvbmZpZ0FwcEZvbnRBZGREaXIKQFRZUEUxQCAgICAgICAgIEZjQ29uZmlnICoJCQlAQVJHMUAJCWNvbmZpZwpAVFlQRTJACQljb25zdCBjaGFyICogICAgICAgICAgICAgICAgICAgIEBBUkcxQCAgICAgICAgICBkaXIKQFBVUlBPU0VACUFkZCBmb250cyBmcm9tIGRpcmVjdG9yeSB0byBmb250IGRhdGFiYXNlCkBERVNDQApTY2FucyB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBmb3IgZm9udHMsIGFkZGluZyBlYWNoIG9uZSBmb3VuZCB0byB0aGUKYXBwbGljYXRpb24tc3BlY2lmaWMgc2V0IG9mIGZvbnRzLgpAQAoKQFJFVEAgICAgICAgICAgIHZvaWQKQEZVTkNAICAgICAgICAgIEZjQ29uZmlnQXBwRm9udENsZWFyCkBUWVBFMUAgICAgICAgICBGY0NvbmZpZyAqICAgICAgICAgICAgICAgICAgICAgIEBBUkcxQCAgICAgICAgICBjb25maWcKQFBVUlBPU0VACVJlbW92ZSBhbGwgYXBwIGZvbnRzIGZyb20gZm9udCBkYXRhYmFzZQpAREVTQ0AKQ2xlYXJzIHRoZSBzZXQgb2YgYXBwbGljYXRpb24tc3BlY2lmaWMgZm9udHMuCkBACgpAUkVUQCAgICAgICAgICAgRmNCb29sCkBGVU5DQCAgICAgICAgICBGY0NvbmZpZ1N1YnN0aXR1dGVXaXRoUGF0CkBUWVBFMUAgICAgICAgICBGY0NvbmZpZyAqCQkJQEFSRzFACQljb25maWcKQFRZUEUyQAkJRmNQYXR0ZXJuICoJCQlAQVJHMkAJCXAKQFRZUEUzQAkJRmNQYXR0ZXJuICoJCQlAQVJHM0AJCXBfcGF0CkBUWVBFNEAJCUZjTWF0Y2hLaW5kICAgICAgICAgICAgICAgICAgICAgQEFSRzRAICAgICAgICAgIGtpbmQKQFBVUlBPU0VACUV4ZWN1dGUgc3Vic3RpdHV0aW9ucwpAREVTQ0AKUGVyZm9ybXMgdGhlIHNlcXVlbmNlIG9mIHBhdHRlcm4gbW9kaWZpY2F0aW9uIG9wZXJhdGlvbnMsIGlmIDxwYXJhbWV0ZXI+a2luZDwvcGFyYW1ldGVyPiBpcwpGY01hdGNoUGF0dGVybiwgdGhlbiB0aG9zZSB0YWdnZWQgYXMgcGF0dGVybiBvcGVyYXRpb25zIGFyZSBhcHBsaWVkLCBlbHNlCmlmIDxwYXJhbWV0ZXI+a2luZDwvcGFyYW1ldGVyPiBpcyBGY01hdGNoRm9udCwgdGhvc2UgdGFnZ2VkIGFzIGZvbnQgb3BlcmF0aW9ucyBhcmUgYXBwbGllZCBhbmQKcF9wYXQgaXMgdXNlZCBmb3IgJmx0O3Rlc3QmZ3Q7IGVsZW1lbnRzIHdpdGggdGFyZ2V0PXBhdHRlcm4uCkBACgpAUkVUQCAgICAgICAgICAgRmNCb29sCkBGVU5DQCAgICAgICAgICBGY0NvbmZpZ1N1YnN0aXR1dGUKQFRZUEUxQCAgICAgICAgIEZjQ29uZmlnICoJCQlAQVJHMUAJCWNvbmZpZwpAVFlQRTJACQlGY1BhdHRlcm4gKgkJCUBBUkcyQAkJcApAVFlQRTNACQlGY01hdGNoS2luZCAgICAgICAgICAgICAgICAgICAgIEBBUkczQCAgICAgICAgICBraW5kCkBQVVJQT1NFQAlFeGVjdXRlIHN1YnN0aXR1dGlvbnMKQERFU0NACkNhbGxzIEZjQ29uZmlnU3Vic3RpdHV0ZVdpdGhQYXQgc2V0dGluZyBwX3BhdCB0byBOVUxMLgpAQAoKQFJFVEAgICAgICAgICAgIEZjUGF0dGVybiAqCkBGVU5DQCAgICAgICAgICBGY0ZvbnRNYXRjaApAVFlQRTFAICAgICAgICAgRmNDb25maWcgKgkJCUBBUkcxQAkJY29uZmlnCkBUWVBFMkAJCUZjUGF0dGVybiAqCQkJQEFSRzJACQlwCkBUWVBFM0AJCUZjUmVzdWx0ICogICAgICAgICAgICAgICAgICAgICAgQEFSRzNAICAgICAgICAgIHJlc3VsdApAUFVSUE9TRUAJUmV0dXJuIGJlc3QgZm9udApAREVTQ0AKUmV0dXJucyB0aGUgZm9udCBpbiA8cGFyYW1ldGVyPmNvbmZpZzwvcGFyYW1ldGVyPiBtb3N0IGNsb3NlIG1hdGNoaW5nIDxwYXJhbWV0ZXI+cDwvcGFyYW1ldGVyPi4gIFRoaXMgZnVuY3Rpb24Kc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGFmdGVyIEZjQ29uZmlnU3Vic3RpdHV0ZSBhbmQgRmNEZWZhdWx0U3Vic3RpdHV0ZSBoYXZlCmJlZW4gY2FsbGVkIGZvciA8cGFyYW1ldGVyPnA8L3BhcmFtZXRlcj47IG90aGVyd2lzZSB0aGUgcmVzdWx0cyB3aWxsIG5vdCBiZSBjb3JyZWN0LgpAQAoKQFJFVEAgICAgICAgICAgIEZjRm9udFNldCAqCkBGVU5DQCAgICAgICAgICBGY0ZvbnRTb3J0CkBUWVBFMUAgICAgICAgICBGY0NvbmZpZyAqCQkJQEFSRzFACQljb25maWcKQFRZUEUyQAkJRmNQYXR0ZXJuICoJCQlAQVJHMkAJCXAKQFRZUEUzQAkJRmNCb29sCQkJCUBBUkczQAkJdHJpbQpAVFlQRTRACQlGY0NoYXJTZXQgKioJCQlAQVJHNEAJCWNzcApAVFlQRTVACQlGY1Jlc3VsdCAqICAgICAgICAgICAgICAgICAgICAgIEBBUkc1QCAgICAgICAgICByZXN1bHQKQFBVUlBPU0VACVJldHVybiBsaXN0IG9mIG1hdGNoaW5nIGZvbnRzCkBERVNDQApSZXR1cm5zIHRoZSBsaXN0IG9mIGZvbnRzIHNvcnRlZCBieSBjbG9zZW5lc3MgdG8gPHBhcmFtZXRlcj5wPC9wYXJhbWV0ZXI+LiAgSWYgPHBhcmFtZXRlcj50cmltPC9wYXJhbWV0ZXI+IGlzIEZjVHJ1ZSwKZWxlbWVudHMgaW4gdGhlIGxpc3Qgd2hpY2ggZG9uJ3QgaW5jbHVkZSBVbmljb2RlIGNvdmVyYWdlIG5vdCBwcm92aWRlZCBieQplYXJsaWVyIGVsZW1lbnRzIGluIHRoZSBsaXN0IGFyZSBlbGlkZWQuICBUaGUgdW5pb24gb2YgVW5pY29kZSBjb3ZlcmFnZSBvZgphbGwgb2YgdGhlIGZvbnRzIGlzIHJldHVybmVkIGluIDxwYXJhbWV0ZXI+Y3NwPC9wYXJhbWV0ZXI+LCBpZiA8cGFyYW1ldGVyPmNzcDwvcGFyYW1ldGVyPiBpcyBub3QgTlVMTC4gIFRoaXMgZnVuY3Rpb24Kc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGFmdGVyIEZjQ29uZmlnU3Vic3RpdHV0ZSBhbmQgRmNEZWZhdWx0U3Vic3RpdHV0ZSBoYXZlCmJlZW4gY2FsbGVkIGZvciA8cGFyYW1ldGVyPnA8L3BhcmFtZXRlcj47IG90aGVyd2lzZSB0aGUgcmVzdWx0cyB3aWxsIG5vdCBiZSBjb3JyZWN0LgogICAgPC9wYXJhPjxwYXJhPgpUaGUgcmV0dXJuZWQgRmNGb250U2V0IHJlZmVyZW5jZXMgRmNQYXR0ZXJuIHN0cnVjdHVyZXMgd2hpY2ggbWF5IGJlIHNoYXJlZApieSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gbXVsdGlwbGUgRmNGb250U29ydCBjYWxscywgYXBwbGljYXRpb25zIG11c3Qgbm90Cm1vZGlmeSB0aGVzZSBwYXR0ZXJucy4gIEluc3RlYWQsIHRoZXkgc2hvdWxkIGJlIHBhc3NlZCwgYWxvbmcgd2l0aCA8cGFyYW1ldGVyPnA8L3BhcmFtZXRlcj4gdG8KRmNGb250UmVuZGVyUHJlcGFyZSB3aGljaCBjb21iaW5lcyB0aGVtIGludG8gYSBjb21wbGV0ZSBwYXR0ZXJuLgogICAgPC9wYXJhPjxwYXJhPgpUaGUgRmNGb250U2V0IHJldHVybmVkIGJ5IEZjRm9udFNvcnQgaXMgZGVzdHJveWVkIGJ5IGNhbGluZyBGY0ZvbnRTZXREZXN0cm95LgpAQAoKQFJFVEAgICAgICAgICAgIEZjUGF0dGVybiAqCkBGVU5DQCAgICAgICAgICBGY0ZvbnRSZW5kZXJQcmVwYXJlCkBUWVBFMUAgICAgICAgICBGY0NvbmZpZyAqCQkJQEFSRzFACQljb25maWcKQFRZUEUyQAkJRmNQYXR0ZXJuICoJCQlAQVJHMkAJCXBhdApAVFlQRTNACQlGY1BhdHRlcm4gKiAgICAgICAgICAgICAgICAgICAgIEBBUkczQCAgICAgICAgICBmb250CkBQVVJQT1NFQAlQcmVwYXJlIHBhdHRlcm4gZm9yIGxvYWRpbmcgZm9udCBmaWxlCkBERVNDQApDcmVhdGVzIGEgbmV3IHBhdHRlcm4gY29uc2lzdGluZyBvZiBlbGVtZW50cyBvZiA8cGFyYW1ldGVyPmZvbnQ8L3BhcmFtZXRlcj4gbm90IGFwcGVhcmluZwppbiA8cGFyYW1ldGVyPnBhdDwvcGFyYW1ldGVyPiwgZWxlbWVudHMgb2YgPHBhcmFtZXRlcj5wYXQ8L3BhcmFtZXRlcj4gbm90IGFwcGVhcmluZyBpbiA8cGFyYW1ldGVyPmZvbnQ8L3BhcmFtZXRlcj4gYW5kIHRoZSBiZXN0IG1hdGNoaW5nCnZhbHVlIGZyb20gPHBhcmFtZXRlcj5wYXQ8L3BhcmFtZXRlcj4gZm9yIGVsZW1lbnRzIGFwcGVhcmluZyBpbiBib3RoLiAgVGhlIHJlc3VsdCBpcyBwYXNzZWQgdG8KRmNDb25maWdTdWJzdGl0dXRlIHdpdGggPHBhcmFtZXRlcj5raW5kPC9wYXJhbWV0ZXI+IEZjTWF0Y2hGb250IGFuZCB0aGVuIHJldHVybmVkLgpAQAoKQFJFVEAgICAgICAgICAgIEZjRm9udFNldCAqCkBGVU5DQCAgICAgICAgICBGY0ZvbnRMaXN0CkBUWVBFMUAgICAgICAgICBGY0NvbmZpZyAqCQkJQEFSRzFACQljb25maWcKQFRZUEUyQAkJRmNQYXR0ZXJuICoJCQlAQVJHMkAJCXAKQFRZUEUzQAkJRmNPYmplY3RTZXQgKiAgICAgICAgICAgICAgICAgICBAQVJHM0AgICAgICAgICAgb3MKQFBVUlBPU0VACUxpc3QgZm9udHMKQERFU0NAClNlbGVjdHMgZm9udHMgbWF0Y2hpbmcgPHBhcmFtZXRlcj5wPC9wYXJhbWV0ZXI+LCBjcmVhdGVzIHBhdHRlcm5zIGZyb20gdGhvc2UgZm9udHMgY29udGFpbmluZwpvbmx5IHRoZSBvYmplY3RzIGluIDxwYXJhbWV0ZXI+b3M8L3BhcmFtZXRlcj4gYW5kIHJldHVybnMgdGhlIHNldCBvZiB1bmlxdWUgc3VjaCBwYXR0ZXJucy4KQEAKCkBSRVRAICAgICAgICAgICBjaGFyICoKQEZVTkNAICAgICAgICAgIEZjQ29uZmlnRmlsZW5hbWUKQFRZUEUxQCAgICAgICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgQEFSRzFAICAgICAgICAgIG5hbWUKQFBVUlBPU0VACUZpbmQgYSBjb25maWcgZmlsZQpAREVTQ0AKR2l2ZW4gdGhlIHNwZWNpZmllZCBleHRlcm5hbCBlbnRpdHkgbmFtZSwgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIGZpbGVuYW1lLgpUaGlzIHByb3ZpZGVzIGFwcGxpY2F0aW9ucyBhIHdheSB0byBjb252ZXJ0IHZhcmlvdXMgY29uZmlndXJhdGlvbiBmaWxlCnJlZmVyZW5jZXMgaW50byBmaWxlbmFtZSBmb3JtLgogICAgPC9wYXJhPjxwYXJhPgpBIG51bGwgb3IgZW1wdHkgPHBhcmFtZXRlcj5uYW1lPC9wYXJhbWV0ZXI+IGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZSBzaG91bGQKYmUgdXNlZDsgd2hpY2ggZmlsZSB0aGlzIHJlZmVyZW5jZXMgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCB0aGUKRkNfQ09ORklHX0ZJTEUgZW52aXJvbm1lbnQgdmFyaWFibGUuICBOZXh0LCBpZiB0aGUgbmFtZSBzdGFydHMgd2l0aCA8cGFyYW1ldGVyPn48L3BhcmFtZXRlcj4sIGl0CnJlZmVycyB0byBhIGZpbGUgaW4gdGhlIGN1cnJlbnQgdXNlcnMgaG9tZSBkaXJlY3RvcnkuICBPdGhlcndpc2UgaWYgdGhlIG5hbWUKZG9lc24ndCBzdGFydCB3aXRoICcvJywgaXQgcmVmZXJzIHRvIGEgZmlsZSBpbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCmRpcmVjdG9yeTsgdGhlIGJ1aWx0LWluIGRlZmF1bHQgZGlyZWN0b3J5IGNhbiBiZSBvdmVycmlkZGVuIHdpdGggdGhlCkZDX0NPTkZJR19ESVIgZW52aXJvbm1lbnQgdmFyaWFibGUuCkBACgpAUkVUQAkJRmNCb29sCkBGVU5DQAkJRmNDb25maWdQYXJzZUFuZExvYWQKQFRZUEUxQAkJRmNDb25maWcgKgkJCUBBUkcxQAkJY29uZmlnCkBUWVBFMkAJCWNvbnN0IEZjQ2hhcjggKgkJCUBBUkcyQAkJZmlsZQpAVFlQRTJACQlGY0Jvb2wJCQkJQEFSRzNACQljb21wbGFpbgpAUFVSUE9TRUAJbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZQpAREVTQ0AKV2Fsa3MgdGhlIGNvbmZpZ3VyYXRpb24gaW4gJ2ZpbGUnIGFuZCBjb25zdHJ1Y3RzIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgppbiAnY29uZmlnJy4gIEFueSBpbmNsdWRlIGZpbGVzIHJlZmVyZW5jZWQgZnJvbSB3aXRoaW4gJ2ZpbGUnIHdpbGwgYmUgbG9hZGVkCndpdGggRmNDb25maWdMb2FkIGFuZCBhbHNvIHBhcnNlZC4gIElmICdjb21wbGFpbicgaXMgRmNGYWxzZSwgbm8gd2FybmluZwp3aWxsIGJlIGRpc3BsYXllZCBpZiAnZmlsZScgZG9lcyBub3QgZXhpc3QuCkBACg==